From 2acaa12e5662e4560fb5f9cda8601e8a803e1a44 Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Fri, 17 Jul 2020 15:59:36 +0200 Subject: [PATCH] - init project --- .gitignore | 12 + .htaccess | 15 + composer.json | 5 + content/index.php | 2 + content/languages/admin-fr_FR.mo | Bin 0 -> 484025 bytes content/languages/admin-fr_FR.po | 13976 ++++ content/languages/admin-network-fr_FR.mo | Bin 0 -> 49998 bytes content/languages/admin-network-fr_FR.po | 1417 + content/languages/continents-cities-fr_FR.mo | Bin 0 -> 20982 bytes content/languages/continents-cities-fr_FR.po | 2117 + ...r_FR-0ce75ad2f775d1cac9696967d484808c.json | 1 + ...r_FR-1a0cd6a7128913b15c1a10dd68951869.json | 1 + ...r_FR-1bba9045bb07c89671c88a3f328548e8.json | 1 + ...r_FR-28b3c3d595952907e08d98287077426c.json | 1 + ...r_FR-2c5d274ea625dd91556554ad82901529.json | 1 + ...r_FR-4a38fe1c0c45989e44682ba6109d9f46.json | 1 + ...r_FR-68f2cec7514bf8563c723a4d675fcfe6.json | 1 + ...r_FR-7f13c36c641b114bf18cd0bcc9ecc7e0.json | 1 + ...r_FR-803bf1ce2131e13efc590c1bc47851fc.json | 1 + ...r_FR-81c889563f09dd13de1701135dc62941.json | 1 + ...r_FR-8860e58c20c6a2ab5876a0f07be43bd9.json | 1 + ...r_FR-947c76bb5095da30e16668eec15406b2.json | 1 + ...r_FR-a25d1cc7bf7ca0b4e114f6bea64943f4.json | 1 + ...r_FR-bf0f094965d3d4a95b47babcb35fc136.json | 1 + ...r_FR-daeb084aab42199d26393a56c3465bc0.json | 1 + ...r_FR-e2791ba830489d23043be8650a22a22b.json | 1 + ...r_FR-f8f49d9fc4a9cf7d78ec99285417bd9c.json | 1 + content/languages/fr_FR.mo | Bin 0 -> 384496 bytes content/languages/fr_FR.po | 18663 ++++++ content/languages/plugins/akismet-fr_FR.mo | Bin 0 -> 29872 bytes content/languages/plugins/akismet-fr_FR.po | 879 + .../languages/themes/twentynineteen-fr_FR.mo | Bin 0 -> 8268 bytes .../languages/themes/twentynineteen-fr_FR.po | 398 + .../languages/themes/twentyseventeen-fr_FR.mo | Bin 0 -> 7529 bytes .../languages/themes/twentyseventeen-fr_FR.po | 336 + .../languages/themes/twentysixteen-fr_FR.mo | Bin 0 -> 7253 bytes .../languages/themes/twentysixteen-fr_FR.po | 370 + .../languages/themes/twentytwenty-fr_FR.mo | Bin 0 -> 13463 bytes .../languages/themes/twentytwenty-fr_FR.po | 537 + content/plugins/akismet/.htaccess | 34 + content/plugins/akismet/LICENSE.txt | 339 + content/plugins/akismet/_inc/akismet.css | 671 + content/plugins/akismet/_inc/akismet.js | 350 + content/plugins/akismet/_inc/form.js | 30 + .../plugins/akismet/_inc/img/logo-full-2x.png | Bin 0 -> 5052 bytes content/plugins/akismet/akismet.php | 66 + content/plugins/akismet/changelog.txt | 418 + .../plugins/akismet/class.akismet-admin.php | 1259 + content/plugins/akismet/class.akismet-cli.php | 185 + .../akismet/class.akismet-rest-api.php | 366 + .../plugins/akismet/class.akismet-widget.php | 114 + content/plugins/akismet/class.akismet.php | 1496 + content/plugins/akismet/index.php | 2 + content/plugins/akismet/readme.txt | 80 + content/plugins/akismet/views/activate.php | 8 + content/plugins/akismet/views/config.php | 242 + content/plugins/akismet/views/connect-jp.php | 72 + content/plugins/akismet/views/enter.php | 13 + content/plugins/akismet/views/get.php | 12 + content/plugins/akismet/views/notice.php | 141 + content/plugins/akismet/views/predefined.php | 11 + content/plugins/akismet/views/setup.php | 4 + content/plugins/akismet/views/start.php | 31 + content/plugins/akismet/views/stats.php | 11 + content/plugins/akismet/views/title.php | 3 + content/plugins/akismet/wrapper.php | 214 + content/plugins/hello.php | 100 + content/plugins/index.php | 2 + content/themes/index.php | 2 + content/themes/twentynineteen/404.php | 33 + content/themes/twentynineteen/archive.php | 55 + .../class-twentynineteen-svg-icons.php | 458 + .../class-twentynineteen-walker-comment.php | 128 + content/themes/twentynineteen/comments.php | 128 + .../fonts/NonBreakingSpaceOverride.woff | Bin 0 -> 1212 bytes .../fonts/NonBreakingSpaceOverride.woff2 | Bin 0 -> 764 bytes content/themes/twentynineteen/footer.php | 57 + content/themes/twentynineteen/functions.php | 330 + content/themes/twentynineteen/header.php | 53 + content/themes/twentynineteen/image.php | 104 + .../themes/twentynineteen/inc/back-compat.php | 79 + .../twentynineteen/inc/color-patterns.php | 271 + .../themes/twentynineteen/inc/customizer.php | 158 + .../twentynineteen/inc/helper-functions.php | 163 + .../twentynineteen/inc/icon-functions.php | 108 + .../twentynineteen/inc/template-functions.php | 211 + .../twentynineteen/inc/template-tags.php | 258 + content/themes/twentynineteen/index.php | 47 + .../twentynineteen/js/customize-controls.js | 30 + .../twentynineteen/js/customize-preview.js | 60 + .../themes/twentynineteen/js/priority-menu.js | 216 + .../twentynineteen/js/skip-link-focus-fix.js | 33 + .../js/touch-keyboard-navigation.js | 354 + .../themes/twentynineteen/package-lock.json | 4627 ++ content/themes/twentynineteen/package.json | 44 + content/themes/twentynineteen/page.php | 38 + .../themes/twentynineteen/postcss.config.js | 13 + content/themes/twentynineteen/print.css | 162 + content/themes/twentynineteen/print.scss | 198 + content/themes/twentynineteen/readme.txt | 74 + .../twentynineteen/sass/_normalize.scss | 341 + .../twentynineteen/sass/blocks/_blocks.scss | 1032 + .../sass/elements/_elements.scss | 92 + .../twentynineteen/sass/elements/_lists.scss | 33 + .../twentynineteen/sass/elements/_tables.scss | 13 + .../twentynineteen/sass/forms/_buttons.scss | 37 + .../twentynineteen/sass/forms/_fields.scss | 58 + .../twentynineteen/sass/forms/_forms.scss | 3 + .../twentynineteen/sass/layout/_layout.scss | 11 + .../twentynineteen/sass/media/_captions.scss | 32 + .../twentynineteen/sass/media/_galleries.scss | 52 + .../twentynineteen/sass/media/_media.scss | 41 + .../sass/mixins/_mixins-master.scss | 141 + .../sass/mixins/_utilities.scss | 51 + .../sass/modules/_accessibility.scss | 38 + .../sass/modules/_alignments.scss | 28 + .../sass/modules/_clearings.scss | 23 + .../sass/navigation/_links.scss | 21 + .../navigation/_menu-footer-navigation.scss | 22 + .../navigation/_menu-main-navigation.scss | 506 + .../navigation/_menu-social-navigation.scss | 66 + .../sass/navigation/_navigation.scss | 16 + .../sass/navigation/_next-previous.scss | 201 + .../twentynineteen/sass/site/_site.scss | 27 + .../sass/site/footer/_site-footer.scss | 53 + .../site/header/_site-featured-image.scss | 301 + .../sass/site/header/_site-header.scss | 139 + .../sass/site/primary/_archives.scss | 65 + .../sass/site/primary/_comments.scss | 405 + .../sass/site/primary/_posts-and-pages.scss | 304 + .../sass/site/secondary/_widgets.scss | 106 + .../twentynineteen/sass/typography/_copy.scss | 62 + .../sass/typography/_headings.scss | 164 + .../sass/typography/_typography.scss | 32 + .../sass/variables-site/_colors.scss | 34 + .../sass/variables-site/_columns.scss | 16 + .../sass/variables-site/_fonts.scss | 83 + .../sass/variables-site/_structure.scss | 16 + .../sass/variables-site/_transitions.scss | 6 + .../sass/variables-site/_variables-site.scss | 5 + content/themes/twentynineteen/screenshot.png | Bin 0 -> 175535 bytes content/themes/twentynineteen/search.php | 56 + content/themes/twentynineteen/single.php | 60 + .../style-editor-customizer.css | 5 + .../style-editor-customizer.scss | 5 + .../themes/twentynineteen/style-editor.css | 1478 + .../themes/twentynineteen/style-editor.scss | 943 + content/themes/twentynineteen/style-rtl.css | 6555 ++ content/themes/twentynineteen/style.css | 6567 ++ content/themes/twentynineteen/style.scss | 110 + .../content/content-excerpt.php | 33 + .../template-parts/content/content-none.php | 53 + .../template-parts/content/content-page.php | 56 + .../template-parts/content/content-single.php | 55 + .../template-parts/content/content.php | 59 + .../template-parts/footer/footer-widgets.php | 24 + .../template-parts/header/entry-header.php | 46 + .../template-parts/header/site-branding.php | 60 + .../template-parts/post/author-bio.php | 30 + .../template-parts/post/discussion-meta.php | 32 + content/themes/twentyseventeen/404.php | 35 + content/themes/twentyseventeen/archive.php | 68 + .../twentyseventeen/assets/css/blocks.css | 451 + .../assets/css/colors-dark.css | 566 + .../assets/css/editor-blocks.css | 808 + .../assets/css/editor-style.css | 582 + .../themes/twentyseventeen/assets/css/ie8.css | 225 + .../themes/twentyseventeen/assets/css/ie9.css | 43 + .../twentyseventeen/assets/images/coffee.jpg | Bin 0 -> 117713 bytes .../assets/images/espresso.jpg | Bin 0 -> 93540 bytes .../twentyseventeen/assets/images/header.jpg | Bin 0 -> 114854 bytes .../assets/images/sandwich.jpg | Bin 0 -> 171858 bytes .../assets/images/svg-icons.svg | 155 + .../assets/js/customize-controls.js | 36 + .../assets/js/customize-preview.js | 150 + .../twentyseventeen/assets/js/global.js | 250 + .../themes/twentyseventeen/assets/js/html5.js | 326 + .../assets/js/jquery.scrollTo.js | 209 + .../twentyseventeen/assets/js/navigation.js | 109 + .../assets/js/skip-link-focus-fix.js | 31 + content/themes/twentyseventeen/comments.php | 89 + content/themes/twentyseventeen/footer.php | 51 + content/themes/twentyseventeen/front-page.php | 59 + content/themes/twentyseventeen/functions.php | 666 + content/themes/twentyseventeen/header.php | 58 + .../twentyseventeen/inc/back-compat.php | 76 + .../twentyseventeen/inc/color-patterns.php | 580 + .../twentyseventeen/inc/custom-header.php | 131 + .../themes/twentyseventeen/inc/customizer.php | 249 + .../twentyseventeen/inc/icon-functions.php | 220 + .../inc/template-functions.php | 102 + .../twentyseventeen/inc/template-tags.php | 226 + content/themes/twentyseventeen/index.php | 72 + content/themes/twentyseventeen/page.php | 43 + content/themes/twentyseventeen/readme.txt | 130 + content/themes/twentyseventeen/rtl.css | 556 + content/themes/twentyseventeen/screenshot.png | Bin 0 -> 363833 bytes content/themes/twentyseventeen/search.php | 72 + content/themes/twentyseventeen/searchform.php | 21 + content/themes/twentyseventeen/sidebar.php | 20 + content/themes/twentyseventeen/single.php | 47 + content/themes/twentyseventeen/style.css | 4360 ++ .../template-parts/footer/footer-widgets.php | 35 + .../template-parts/footer/site-info.php | 24 + .../template-parts/header/header-image.php | 20 + .../template-parts/header/site-branding.php | 38 + .../navigation/navigation-top.php | 33 + .../page/content-front-page-panels.php | 87 + .../page/content-front-page.php | 52 + .../template-parts/page/content-page.php | 32 + .../template-parts/post/content-audio.php | 109 + .../template-parts/post/content-excerpt.php | 48 + .../template-parts/post/content-gallery.php | 96 + .../template-parts/post/content-image.php | 86 + .../template-parts/post/content-none.php | 40 + .../template-parts/post/content-video.php | 107 + .../template-parts/post/content.php | 79 + content/themes/twentytwenty/.stylelintrc.json | 12 + content/themes/twentytwenty/404.php | 36 + .../assets/css/editor-style-block-rtl.css | 1454 + .../assets/css/editor-style-block.css | 1454 + .../assets/css/editor-style-classic-rtl.css | 600 + .../assets/css/editor-style-classic.css | 604 + .../assets/fonts/inter/Inter-italic-var.woff2 | Bin 0 -> 236832 bytes .../fonts/inter/Inter-upright-var.woff2 | Bin 0 -> 223892 bytes .../assets/images/2020-landscape-1.png | Bin 0 -> 1211 bytes .../assets/images/2020-landscape-2.png | Bin 0 -> 6248 bytes .../assets/images/2020-square-1.png | Bin 0 -> 4201 bytes .../assets/images/2020-square-2.png | Bin 0 -> 3366 bytes .../assets/images/2020-three-quarters-1.png | Bin 0 -> 2333 bytes .../assets/images/2020-three-quarters-2.png | Bin 0 -> 2708 bytes .../assets/images/2020-three-quarters-3.png | Bin 0 -> 26106 bytes .../assets/images/2020-three-quarters-4.png | Bin 0 -> 2185 bytes .../assets/js/color-calculations.js | 156 + .../assets/js/customize-controls.js | 90 + .../assets/js/customize-preview.js | 186 + .../twentytwenty/assets/js/customize.js | 27 + .../assets/js/editor-script-block.js | 9 + .../themes/twentytwenty/assets/js/index.js | 817 + .../assets/js/skip-link-focus-fix.js | 33 + .../classes/class-twentytwenty-customize.php | 526 + ...class-twentytwenty-non-latin-languages.php | 122 + .../class-twentytwenty-script-loader.php | 47 + .../class-twentytwenty-separator-control.php | 26 + .../classes/class-twentytwenty-svg-icons.php | 267 + .../class-twentytwenty-walker-comment.php | 142 + .../class-twentytwenty-walker-page.php | 146 + content/themes/twentytwenty/comments.php | 132 + content/themes/twentytwenty/footer.php | 61 + content/themes/twentytwenty/functions.php | 760 + content/themes/twentytwenty/header.php | 187 + .../themes/twentytwenty/inc/custom-css.php | 191 + .../twentytwenty/inc/starter-content.php | 217 + content/themes/twentytwenty/inc/svg-icons.php | 70 + .../themes/twentytwenty/inc/template-tags.php | 790 + content/themes/twentytwenty/index.php | 117 + content/themes/twentytwenty/package-lock.json | 13041 ++++ content/themes/twentytwenty/package.json | 59 + content/themes/twentytwenty/print.css | 165 + content/themes/twentytwenty/readme.txt | 108 + content/themes/twentytwenty/screenshot.png | Bin 0 -> 53066 bytes content/themes/twentytwenty/searchform.php | 28 + content/themes/twentytwenty/singular.php | 34 + content/themes/twentytwenty/style-rtl.css | 6357 ++ content/themes/twentytwenty/style.css | 6471 ++ .../template-parts/content-cover.php | 182 + .../twentytwenty/template-parts/content.php | 94 + .../template-parts/entry-author-bio.php | 33 + .../template-parts/entry-header.php | 75 + .../template-parts/featured-image.php | 43 + .../template-parts/footer-menus-widgets.php | 119 + .../template-parts/modal-menu.php | 148 + .../template-parts/modal-search.php | 34 + .../template-parts/navigation.php | 61 + .../template-parts/pagination.php | 58 + .../twentytwenty/templates/template-cover.php | 33 + .../templates/template-full-width.php | 11 + index.php | 17 + web/assets/bootstrap/css/bootstrap.min.css | 11 - web/assets/bootstrap/js/bootstrap.min.js | 7 - web/assets/css/styles.css | 242 - web/assets/img/Regalette---Logo.png | Bin 14809 -> 0 bytes web/assets/img/Regalette---LogoFB.png | Bin 547 -> 0 bytes web/assets/img/bio-image.png | Bin 126980 -> 0 bytes web/assets/img/fondMotif.jpg | Bin 11089 -> 0 bytes web/assets/img/glutenless.png | Bin 132133 -> 0 bytes web/assets/img/regalette.png | Bin 82170 -> 0 bytes web/assets/img/regalette2016.png | Bin 62882 -> 0 bytes web/assets/img/version2-les-garnies.png | Bin 205472 -> 0 bytes web/assets/img/version2images-bios.png | Bin 127288 -> 0 bytes .../img/version2images-sans-glutent.png | Bin 130680 -> 0 bytes web/assets/img/version2images-snacking.png | Bin 165343 -> 0 bytes web/assets/js/jquery.min.js | 5 - web/index.html | 79 - wp-activate.php | 214 + wp-admin/about.php | 318 + wp-admin/admin-ajax.php | 193 + wp-admin/admin-footer.php | 119 + wp-admin/admin-functions.php | 15 + wp-admin/admin-header.php | 293 + wp-admin/admin-post.php | 72 + wp-admin/admin.php | 402 + wp-admin/async-upload.php | 129 + wp-admin/comment.php | 360 + wp-admin/credits.php | 150 + wp-admin/css/about-rtl.css | 1202 + wp-admin/css/about-rtl.min.css | 2 + wp-admin/css/about.css | 1201 + wp-admin/css/about.min.css | 2 + wp-admin/css/admin-menu-rtl.css | 930 + wp-admin/css/admin-menu-rtl.min.css | 2 + wp-admin/css/admin-menu.css | 929 + wp-admin/css/admin-menu.min.css | 2 + wp-admin/css/code-editor-rtl.css | 77 + wp-admin/css/code-editor-rtl.min.css | 2 + wp-admin/css/code-editor.css | 76 + wp-admin/css/code-editor.min.css | 2 + wp-admin/css/color-picker-rtl.css | 179 + wp-admin/css/color-picker-rtl.min.css | 2 + wp-admin/css/color-picker.css | 178 + wp-admin/css/color-picker.min.css | 2 + wp-admin/css/colors/_admin.scss | 581 + wp-admin/css/colors/_mixins.scss | 47 + wp-admin/css/colors/_variables.scss | 63 + wp-admin/css/colors/blue/colors-rtl.css | 581 + wp-admin/css/colors/blue/colors-rtl.min.css | 2 + wp-admin/css/colors/blue/colors.css | 581 + wp-admin/css/colors/blue/colors.min.css | 2 + wp-admin/css/colors/blue/colors.scss | 11 + wp-admin/css/colors/coffee/colors-rtl.css | 581 + wp-admin/css/colors/coffee/colors-rtl.min.css | 2 + wp-admin/css/colors/coffee/colors.css | 581 + wp-admin/css/colors/coffee/colors.min.css | 2 + wp-admin/css/colors/coffee/colors.scss | 7 + wp-admin/css/colors/ectoplasm/colors-rtl.css | 581 + .../css/colors/ectoplasm/colors-rtl.min.css | 2 + wp-admin/css/colors/ectoplasm/colors.css | 581 + wp-admin/css/colors/ectoplasm/colors.min.css | 2 + wp-admin/css/colors/ectoplasm/colors.scss | 8 + wp-admin/css/colors/light/colors-rtl.css | 599 + wp-admin/css/colors/light/colors-rtl.min.css | 2 + wp-admin/css/colors/light/colors.css | 599 + wp-admin/css/colors/light/colors.min.css | 2 + wp-admin/css/colors/light/colors.scss | 38 + wp-admin/css/colors/midnight/colors-rtl.css | 581 + .../css/colors/midnight/colors-rtl.min.css | 2 + wp-admin/css/colors/midnight/colors.css | 581 + wp-admin/css/colors/midnight/colors.min.css | 2 + wp-admin/css/colors/midnight/colors.scss | 5 + wp-admin/css/colors/ocean/colors-rtl.css | 581 + wp-admin/css/colors/ocean/colors-rtl.min.css | 2 + wp-admin/css/colors/ocean/colors.css | 581 + wp-admin/css/colors/ocean/colors.min.css | 2 + wp-admin/css/colors/ocean/colors.scss | 8 + wp-admin/css/colors/sunrise/colors-rtl.css | 581 + .../css/colors/sunrise/colors-rtl.min.css | 2 + wp-admin/css/colors/sunrise/colors.css | 581 + wp-admin/css/colors/sunrise/colors.min.css | 2 + wp-admin/css/colors/sunrise/colors.scss | 6 + wp-admin/css/common-rtl.css | 4066 ++ wp-admin/css/common-rtl.min.css | 9 + wp-admin/css/common.css | 4065 ++ wp-admin/css/common.min.css | 9 + wp-admin/css/customize-controls-rtl.css | 2962 + wp-admin/css/customize-controls-rtl.min.css | 2 + wp-admin/css/customize-controls.css | 2961 + wp-admin/css/customize-controls.min.css | 2 + wp-admin/css/customize-nav-menus-rtl.css | 888 + wp-admin/css/customize-nav-menus-rtl.min.css | 2 + wp-admin/css/customize-nav-menus.css | 887 + wp-admin/css/customize-nav-menus.min.css | 2 + wp-admin/css/customize-widgets-rtl.css | 484 + wp-admin/css/customize-widgets-rtl.min.css | 2 + wp-admin/css/customize-widgets.css | 483 + wp-admin/css/customize-widgets.min.css | 2 + wp-admin/css/dashboard-rtl.css | 1294 + wp-admin/css/dashboard-rtl.min.css | 2 + wp-admin/css/dashboard.css | 1293 + wp-admin/css/dashboard.min.css | 2 + wp-admin/css/deprecated-media-rtl.css | 430 + wp-admin/css/deprecated-media-rtl.min.css | 2 + wp-admin/css/deprecated-media.css | 429 + wp-admin/css/deprecated-media.min.css | 2 + wp-admin/css/edit-rtl.css | 1759 + wp-admin/css/edit-rtl.min.css | 2 + wp-admin/css/edit.css | 1758 + wp-admin/css/edit.min.css | 2 + wp-admin/css/farbtastic-rtl.css | 42 + wp-admin/css/farbtastic-rtl.min.css | 2 + wp-admin/css/farbtastic.css | 41 + wp-admin/css/farbtastic.min.css | 2 + wp-admin/css/forms-rtl.css | 1703 + wp-admin/css/forms-rtl.min.css | 2 + wp-admin/css/forms.css | 1702 + wp-admin/css/forms.min.css | 2 + wp-admin/css/ie-rtl.css | 765 + wp-admin/css/ie-rtl.min.css | 2 + wp-admin/css/ie.css | 764 + wp-admin/css/ie.min.css | 2 + wp-admin/css/install-rtl.css | 392 + wp-admin/css/install-rtl.min.css | 2 + wp-admin/css/install.css | 391 + wp-admin/css/install.min.css | 2 + wp-admin/css/l10n-rtl.css | 121 + wp-admin/css/l10n-rtl.min.css | 2 + wp-admin/css/l10n.css | 120 + wp-admin/css/l10n.min.css | 2 + wp-admin/css/list-tables-rtl.css | 2169 + wp-admin/css/list-tables-rtl.min.css | 2 + wp-admin/css/list-tables.css | 2168 + wp-admin/css/list-tables.min.css | 2 + wp-admin/css/login-rtl.css | 406 + wp-admin/css/login-rtl.min.css | 2 + wp-admin/css/login.css | 405 + wp-admin/css/login.min.css | 2 + wp-admin/css/media-rtl.css | 1290 + wp-admin/css/media-rtl.min.css | 2 + wp-admin/css/media.css | 1289 + wp-admin/css/media.min.css | 2 + wp-admin/css/nav-menus-rtl.css | 910 + wp-admin/css/nav-menus-rtl.min.css | 2 + wp-admin/css/nav-menus.css | 909 + wp-admin/css/nav-menus.min.css | 2 + wp-admin/css/revisions-rtl.css | 620 + wp-admin/css/revisions-rtl.min.css | 2 + wp-admin/css/revisions.css | 619 + wp-admin/css/revisions.min.css | 2 + wp-admin/css/site-health-rtl.css | 464 + wp-admin/css/site-health-rtl.min.css | 2 + wp-admin/css/site-health.css | 463 + wp-admin/css/site-health.min.css | 2 + wp-admin/css/site-icon-rtl.css | 55 + wp-admin/css/site-icon-rtl.min.css | 2 + wp-admin/css/site-icon.css | 54 + wp-admin/css/site-icon.min.css | 2 + wp-admin/css/themes-rtl.css | 1926 + wp-admin/css/themes-rtl.min.css | 2 + wp-admin/css/themes.css | 1925 + wp-admin/css/themes.min.css | 2 + wp-admin/css/widgets-rtl.css | 866 + wp-admin/css/widgets-rtl.min.css | 2 + wp-admin/css/widgets.css | 865 + wp-admin/css/widgets.min.css | 2 + wp-admin/css/wp-admin-rtl.css | 16 + wp-admin/css/wp-admin-rtl.min.css | 16 + wp-admin/css/wp-admin.css | 15 + wp-admin/css/wp-admin.min.css | 16 + wp-admin/custom-background.php | 15 + wp-admin/custom-header.php | 15 + wp-admin/customize.php | 270 + wp-admin/edit-comments.php | 354 + wp-admin/edit-form-advanced.php | 731 + wp-admin/edit-form-blocks.php | 456 + wp-admin/edit-form-comment.php | 253 + wp-admin/edit-link-form.php | 171 + wp-admin/edit-tag-form.php | 292 + wp-admin/edit-tags.php | 661 + wp-admin/edit.php | 464 + wp-admin/erase-personal-data.php | 92 + wp-admin/export-personal-data.php | 92 + wp-admin/export.php | 324 + wp-admin/freedoms.php | 120 + wp-admin/images/align-center-2x.png | Bin 0 -> 147 bytes wp-admin/images/align-center.png | Bin 0 -> 546 bytes wp-admin/images/align-left-2x.png | Bin 0 -> 143 bytes wp-admin/images/align-left.png | Bin 0 -> 554 bytes wp-admin/images/align-none-2x.png | Bin 0 -> 121 bytes wp-admin/images/align-none.png | Bin 0 -> 417 bytes wp-admin/images/align-right-2x.png | Bin 0 -> 142 bytes wp-admin/images/align-right.png | Bin 0 -> 509 bytes wp-admin/images/arrows-2x.png | Bin 0 -> 863 bytes wp-admin/images/arrows.png | Bin 0 -> 243 bytes wp-admin/images/browser-rtl.png | Bin 0 -> 40170 bytes wp-admin/images/browser.png | Bin 0 -> 40626 bytes wp-admin/images/bubble_bg-2x.gif | Bin 0 -> 424 bytes wp-admin/images/bubble_bg.gif | Bin 0 -> 398 bytes wp-admin/images/comment-grey-bubble-2x.png | Bin 0 -> 258 bytes wp-admin/images/comment-grey-bubble.png | Bin 0 -> 114 bytes wp-admin/images/date-button-2x.gif | Bin 0 -> 996 bytes wp-admin/images/date-button.gif | Bin 0 -> 400 bytes wp-admin/images/generic.png | Bin 0 -> 719 bytes wp-admin/images/icons32-2x.png | Bin 0 -> 21770 bytes wp-admin/images/icons32-vs-2x.png | Bin 0 -> 21396 bytes wp-admin/images/icons32-vs.png | Bin 0 -> 8007 bytes wp-admin/images/icons32.png | Bin 0 -> 8023 bytes wp-admin/images/imgedit-icons-2x.png | Bin 0 -> 7664 bytes wp-admin/images/imgedit-icons.png | Bin 0 -> 4055 bytes wp-admin/images/list-2x.png | Bin 0 -> 1523 bytes wp-admin/images/list.png | Bin 0 -> 1003 bytes wp-admin/images/loading.gif | Bin 0 -> 1372 bytes wp-admin/images/marker.png | Bin 0 -> 360 bytes wp-admin/images/mask.png | Bin 0 -> 2001 bytes wp-admin/images/media-button-2x.png | Bin 0 -> 850 bytes wp-admin/images/media-button-image.gif | Bin 0 -> 200 bytes wp-admin/images/media-button-music.gif | Bin 0 -> 206 bytes wp-admin/images/media-button-other.gif | Bin 0 -> 248 bytes wp-admin/images/media-button-video.gif | Bin 0 -> 133 bytes wp-admin/images/media-button.png | Bin 0 -> 323 bytes wp-admin/images/menu-2x.png | Bin 0 -> 12672 bytes wp-admin/images/menu-vs-2x.png | Bin 0 -> 12453 bytes wp-admin/images/menu-vs.png | Bin 0 -> 5086 bytes wp-admin/images/menu.png | Bin 0 -> 5039 bytes wp-admin/images/no.png | Bin 0 -> 755 bytes wp-admin/images/post-formats-vs.png | Bin 0 -> 2450 bytes wp-admin/images/post-formats.png | Bin 0 -> 2157 bytes wp-admin/images/post-formats32-vs.png | Bin 0 -> 5111 bytes wp-admin/images/post-formats32.png | Bin 0 -> 5142 bytes wp-admin/images/resize-2x.gif | Bin 0 -> 151 bytes wp-admin/images/resize-rtl-2x.gif | Bin 0 -> 150 bytes wp-admin/images/resize-rtl.gif | Bin 0 -> 70 bytes wp-admin/images/resize.gif | Bin 0 -> 64 bytes wp-admin/images/se.png | Bin 0 -> 120 bytes wp-admin/images/sort-2x.gif | Bin 0 -> 97 bytes wp-admin/images/sort.gif | Bin 0 -> 55 bytes wp-admin/images/spinner-2x.gif | Bin 0 -> 7536 bytes wp-admin/images/spinner.gif | Bin 0 -> 3656 bytes wp-admin/images/stars-2x.png | Bin 0 -> 1257 bytes wp-admin/images/stars.png | Bin 0 -> 924 bytes wp-admin/images/w-logo-blue.png | Bin 0 -> 3113 bytes wp-admin/images/w-logo-white.png | Bin 0 -> 5395 bytes wp-admin/images/wheel.png | Bin 0 -> 6047 bytes wp-admin/images/wordpress-logo-white.svg | 1 + wp-admin/images/wordpress-logo.png | Bin 0 -> 2480 bytes wp-admin/images/wordpress-logo.svg | 1 + wp-admin/images/wpspin_light-2x.gif | Bin 0 -> 8875 bytes wp-admin/images/wpspin_light.gif | Bin 0 -> 2052 bytes wp-admin/images/xit-2x.gif | Bin 0 -> 825 bytes wp-admin/images/xit.gif | Bin 0 -> 181 bytes wp-admin/images/yes.png | Bin 0 -> 539 bytes wp-admin/import.php | 240 + wp-admin/includes/admin-filters.php | 150 + wp-admin/includes/admin.php | 99 + wp-admin/includes/ajax-actions.php | 5267 ++ wp-admin/includes/bookmark.php | 327 + .../class-automatic-upgrader-skin.php | 119 + .../class-bulk-plugin-upgrader-skin.php | 78 + .../class-bulk-theme-upgrader-skin.php | 78 + .../includes/class-bulk-upgrader-skin.php | 177 + wp-admin/includes/class-core-upgrader.php | 415 + wp-admin/includes/class-custom-background.php | 616 + .../includes/class-custom-image-header.php | 1515 + .../includes/class-file-upload-upgrader.php | 133 + wp-admin/includes/class-ftp-pure.php | 186 + wp-admin/includes/class-ftp-sockets.php | 246 + wp-admin/includes/class-ftp.php | 912 + .../class-language-pack-upgrader-skin.php | 95 + .../includes/class-language-pack-upgrader.php | 473 + wp-admin/includes/class-pclzip.php | 5702 ++ .../includes/class-plugin-installer-skin.php | 141 + .../includes/class-plugin-upgrader-skin.php | 89 + wp-admin/includes/class-plugin-upgrader.php | 568 + .../includes/class-theme-installer-skin.php | 150 + .../includes/class-theme-upgrader-skin.php | 126 + wp-admin/includes/class-theme-upgrader.php | 654 + .../class-walker-category-checklist.php | 128 + .../class-walker-nav-menu-checklist.php | 122 + .../includes/class-walker-nav-menu-edit.php | 313 + .../includes/class-wp-ajax-upgrader-skin.php | 130 + .../includes/class-wp-automatic-updater.php | 1016 + .../includes/class-wp-comments-list-table.php | 952 + .../includes/class-wp-community-events.php | 504 + wp-admin/includes/class-wp-debug-data.php | 1338 + .../includes/class-wp-filesystem-base.php | 831 + .../includes/class-wp-filesystem-direct.php | 620 + .../includes/class-wp-filesystem-ftpext.php | 738 + .../class-wp-filesystem-ftpsockets.php | 662 + .../includes/class-wp-filesystem-ssh2.php | 776 + wp-admin/includes/class-wp-importer.php | 334 + .../includes/class-wp-internal-pointers.php | 172 + .../includes/class-wp-links-list-table.php | 339 + .../includes/class-wp-list-table-compat.php | 50 + wp-admin/includes/class-wp-list-table.php | 1431 + .../includes/class-wp-media-list-table.php | 800 + .../includes/class-wp-ms-sites-list-table.php | 740 + .../class-wp-ms-themes-list-table.php | 797 + .../includes/class-wp-ms-users-list-table.php | 524 + .../class-wp-plugin-install-list-table.php | 776 + .../includes/class-wp-plugins-list-table.php | 1025 + .../class-wp-post-comments-list-table.php | 78 + .../includes/class-wp-posts-list-table.php | 1941 + ...rivacy-data-export-requests-list-table.php | 129 + ...ivacy-data-removal-requests-list-table.php | 137 + .../class-wp-privacy-policy-content.php | 726 + .../class-wp-privacy-requests-table.php | 451 + wp-admin/includes/class-wp-screen.php | 1351 + .../class-wp-site-health-auto-updates.php | 478 + wp-admin/includes/class-wp-site-health.php | 2320 + wp-admin/includes/class-wp-site-icon.php | 233 + .../includes/class-wp-terms-list-table.php | 701 + .../class-wp-theme-install-list-table.php | 560 + .../includes/class-wp-themes-list-table.php | 361 + wp-admin/includes/class-wp-upgrader-skin.php | 208 + wp-admin/includes/class-wp-upgrader-skins.php | 44 + wp-admin/includes/class-wp-upgrader.php | 952 + .../includes/class-wp-users-list-table.php | 641 + wp-admin/includes/comment.php | 214 + wp-admin/includes/continents-cities.php | 554 + wp-admin/includes/credits.php | 157 + wp-admin/includes/dashboard.php | 1928 + wp-admin/includes/deprecated.php | 1566 + wp-admin/includes/edit-tag-messages.php | 59 + wp-admin/includes/export.php | 670 + wp-admin/includes/file.php | 2264 + wp-admin/includes/image-edit.php | 984 + wp-admin/includes/image.php | 1057 + wp-admin/includes/import.php | 232 + wp-admin/includes/list-table.php | 93 + wp-admin/includes/media.php | 3747 ++ wp-admin/includes/menu.php | 353 + wp-admin/includes/meta-boxes.php | 1593 + wp-admin/includes/misc.php | 1475 + wp-admin/includes/ms-admin-filters.php | 44 + wp-admin/includes/ms-deprecated.php | 110 + wp-admin/includes/ms.php | 1154 + wp-admin/includes/nav-menu.php | 1279 + wp-admin/includes/network.php | 668 + wp-admin/includes/noop.php | 105 + wp-admin/includes/options.php | 133 + wp-admin/includes/plugin-install.php | 892 + wp-admin/includes/plugin.php | 2442 + wp-admin/includes/post.php | 2444 + wp-admin/includes/privacy-tools.php | 908 + wp-admin/includes/revision.php | 464 + wp-admin/includes/schema.php | 1334 + wp-admin/includes/screen.php | 241 + wp-admin/includes/taxonomy.php | 314 + wp-admin/includes/template.php | 2582 + wp-admin/includes/theme-install.php | 252 + wp-admin/includes/theme.php | 939 + wp-admin/includes/translation-install.php | 277 + wp-admin/includes/update-core.php | 1518 + wp-admin/includes/update.php | 935 + wp-admin/includes/upgrade.php | 3404 + wp-admin/includes/user.php | 591 + wp-admin/includes/widgets.php | 330 + wp-admin/index.php | 156 + wp-admin/install-helper.php | 200 + wp-admin/install.php | 437 + wp-admin/js/accordion.js | 94 + wp-admin/js/accordion.min.js | 2 + wp-admin/js/code-editor.js | 346 + wp-admin/js/code-editor.min.js | 2 + wp-admin/js/color-picker.js | 356 + wp-admin/js/color-picker.min.js | 2 + wp-admin/js/comment.js | 101 + wp-admin/js/comment.min.js | 2 + wp-admin/js/common.js | 1650 + wp-admin/js/common.min.js | 2 + wp-admin/js/custom-background.js | 145 + wp-admin/js/custom-background.min.js | 2 + wp-admin/js/custom-header.js | 88 + wp-admin/js/customize-controls.js | 9292 +++ wp-admin/js/customize-controls.min.js | 2 + wp-admin/js/customize-nav-menus.js | 3428 + wp-admin/js/customize-nav-menus.min.js | 2 + wp-admin/js/customize-widgets.js | 2373 + wp-admin/js/customize-widgets.min.js | 2 + wp-admin/js/dashboard.js | 593 + wp-admin/js/dashboard.min.js | 2 + wp-admin/js/edit-comments.js | 1344 + wp-admin/js/edit-comments.min.js | 2 + wp-admin/js/editor-expand.js | 1617 + wp-admin/js/editor-expand.min.js | 2 + wp-admin/js/editor.js | 1416 + wp-admin/js/editor.min.js | 2 + wp-admin/js/farbtastic.js | 276 + wp-admin/js/gallery.js | 241 + wp-admin/js/gallery.min.js | 2 + wp-admin/js/image-edit.js | 1165 + wp-admin/js/image-edit.min.js | 2 + wp-admin/js/inline-edit-post.js | 561 + wp-admin/js/inline-edit-post.min.js | 2 + wp-admin/js/inline-edit-tax.js | 294 + wp-admin/js/inline-edit-tax.min.js | 2 + wp-admin/js/iris.min.js | 5 + wp-admin/js/language-chooser.js | 36 + wp-admin/js/language-chooser.min.js | 2 + wp-admin/js/link.js | 136 + wp-admin/js/link.min.js | 2 + wp-admin/js/media-gallery.js | 41 + wp-admin/js/media-gallery.min.js | 2 + wp-admin/js/media-upload.js | 113 + wp-admin/js/media-upload.min.js | 2 + wp-admin/js/media.js | 207 + wp-admin/js/media.min.js | 2 + wp-admin/js/nav-menu.js | 1330 + wp-admin/js/nav-menu.min.js | 2 + wp-admin/js/password-strength-meter.js | 121 + wp-admin/js/password-strength-meter.min.js | 2 + wp-admin/js/plugin-install.js | 223 + wp-admin/js/plugin-install.min.js | 2 + wp-admin/js/post.js | 1274 + wp-admin/js/post.min.js | 2 + wp-admin/js/postbox.js | 456 + wp-admin/js/postbox.min.js | 2 + wp-admin/js/privacy-tools.js | 301 + wp-admin/js/privacy-tools.min.js | 2 + wp-admin/js/revisions.js | 1175 + wp-admin/js/revisions.min.js | 2 + wp-admin/js/set-post-thumbnail.js | 28 + wp-admin/js/set-post-thumbnail.min.js | 2 + wp-admin/js/site-health.js | 316 + wp-admin/js/site-health.min.js | 2 + wp-admin/js/svg-painter.js | 241 + wp-admin/js/svg-painter.min.js | 2 + wp-admin/js/tags-box.js | 437 + wp-admin/js/tags-box.min.js | 2 + wp-admin/js/tags-suggest.js | 195 + wp-admin/js/tags-suggest.min.js | 2 + wp-admin/js/tags.js | 164 + wp-admin/js/tags.min.js | 2 + wp-admin/js/theme-plugin-editor.js | 1006 + wp-admin/js/theme-plugin-editor.min.js | 2 + wp-admin/js/theme.js | 2087 + wp-admin/js/theme.min.js | 2 + wp-admin/js/updates.js | 2465 + wp-admin/js/updates.min.js | 2 + wp-admin/js/user-profile.js | 409 + wp-admin/js/user-profile.min.js | 2 + wp-admin/js/user-suggest.js | 64 + wp-admin/js/user-suggest.min.js | 2 + wp-admin/js/widgets.js | 760 + wp-admin/js/widgets.min.js | 2 + wp-admin/js/widgets/custom-html-widgets.js | 456 + .../js/widgets/custom-html-widgets.min.js | 2 + wp-admin/js/widgets/media-audio-widget.js | 154 + wp-admin/js/widgets/media-audio-widget.min.js | 2 + wp-admin/js/widgets/media-gallery-widget.js | 341 + .../js/widgets/media-gallery-widget.min.js | 2 + wp-admin/js/widgets/media-image-widget.js | 170 + wp-admin/js/widgets/media-image-widget.min.js | 2 + wp-admin/js/widgets/media-video-widget.js | 256 + wp-admin/js/widgets/media-video-widget.min.js | 2 + wp-admin/js/widgets/media-widgets.js | 1330 + wp-admin/js/widgets/media-widgets.min.js | 2 + wp-admin/js/widgets/text-widgets.js | 552 + wp-admin/js/widgets/text-widgets.min.js | 2 + wp-admin/js/word-count.js | 220 + wp-admin/js/word-count.min.js | 2 + wp-admin/js/xfn.js | 23 + wp-admin/js/xfn.min.js | 2 + wp-admin/link-add.php | 31 + wp-admin/link-manager.php | 137 + wp-admin/link-parse-opml.php | 96 + wp-admin/link.php | 126 + wp-admin/load-scripts.php | 68 + wp-admin/load-styles.php | 88 + wp-admin/maint/repair.php | 174 + wp-admin/media-new.php | 89 + wp-admin/media-upload.php | 113 + wp-admin/media.php | 177 + wp-admin/menu-header.php | 288 + wp-admin/menu.php | 326 + wp-admin/moderation.php | 12 + wp-admin/ms-admin.php | 13 + wp-admin/ms-delete-site.php | 136 + wp-admin/ms-edit.php | 13 + wp-admin/ms-options.php | 12 + wp-admin/ms-sites.php | 13 + wp-admin/ms-themes.php | 13 + wp-admin/ms-upgrade-network.php | 13 + wp-admin/ms-users.php | 13 + wp-admin/my-sites.php | 160 + wp-admin/nav-menus.php | 1038 + wp-admin/network.php | 121 + wp-admin/network/about.php | 13 + wp-admin/network/admin.php | 36 + wp-admin/network/credits.php | 13 + wp-admin/network/edit.php | 41 + wp-admin/network/freedoms.php | 13 + wp-admin/network/index.php | 83 + wp-admin/network/menu.php | 118 + wp-admin/network/plugin-editor.php | 13 + wp-admin/network/plugin-install.php | 17 + wp-admin/network/plugins.php | 13 + wp-admin/network/privacy.php | 13 + wp-admin/network/profile.php | 13 + wp-admin/network/settings.php | 489 + wp-admin/network/setup.php | 13 + wp-admin/network/site-info.php | 209 + wp-admin/network/site-new.php | 303 + wp-admin/network/site-settings.php | 176 + wp-admin/network/site-themes.php | 229 + wp-admin/network/site-users.php | 366 + wp-admin/network/sites.php | 391 + wp-admin/network/theme-editor.php | 13 + wp-admin/network/theme-install.php | 17 + wp-admin/network/themes.php | 346 + wp-admin/network/update-core.php | 13 + wp-admin/network/update.php | 17 + wp-admin/network/upgrade.php | 155 + wp-admin/network/user-edit.php | 13 + wp-admin/network/user-new.php | 151 + wp-admin/network/users.php | 297 + wp-admin/options-discussion.php | 331 + wp-admin/options-general.php | 408 + wp-admin/options-head.php | 18 + wp-admin/options-media.php | 156 + wp-admin/options-permalink.php | 426 + wp-admin/options-privacy.php | 255 + wp-admin/options-reading.php | 218 + wp-admin/options-writing.php | 239 + wp-admin/options.php | 379 + wp-admin/plugin-editor.php | 339 + wp-admin/plugin-install.php | 187 + wp-admin/plugins.php | 648 + wp-admin/post-new.php | 83 + wp-admin/post.php | 362 + wp-admin/press-this.php | 87 + wp-admin/privacy-policy-guide.php | 36 + wp-admin/privacy.php | 71 + wp-admin/profile.php | 18 + wp-admin/revision.php | 161 + wp-admin/setup-config.php | 457 + wp-admin/site-health-info.php | 184 + wp-admin/site-health.php | 160 + wp-admin/term.php | 75 + wp-admin/theme-editor.php | 387 + wp-admin/theme-install.php | 375 + wp-admin/themes.php | 625 + wp-admin/tools.php | 98 + wp-admin/update-core.php | 952 + wp-admin/update.php | 304 + wp-admin/upgrade-functions.php | 12 + wp-admin/upgrade.php | 160 + wp-admin/upload.php | 381 + wp-admin/user-edit.php | 791 + wp-admin/user-new.php | 585 + wp-admin/user/about.php | 13 + wp-admin/user/admin.php | 35 + wp-admin/user/credits.php | 13 + wp-admin/user/freedoms.php | 13 + wp-admin/user/index.php | 13 + wp-admin/user/menu.php | 22 + wp-admin/user/privacy.php | 13 + wp-admin/user/profile.php | 13 + wp-admin/user/user-edit.php | 13 + wp-admin/users.php | 600 + wp-admin/widgets.php | 578 + wp-blog-header.php | 21 + wp-comments-post.php | 81 + wp-config-sample.php | 98 + wp-config.php | 158 + wp-cron.php | 152 + wp-includes/ID3/getid3.lib.php | 1781 + wp-includes/ID3/getid3.php | 2181 + wp-includes/ID3/license.commercial.txt | 27 + wp-includes/ID3/license.txt | 29 + wp-includes/ID3/module.audio-video.asf.php | 2084 + wp-includes/ID3/module.audio-video.flv.php | 906 + .../ID3/module.audio-video.matroska.php | 1893 + .../ID3/module.audio-video.quicktime.php | 2905 + wp-includes/ID3/module.audio-video.riff.php | 2788 + wp-includes/ID3/module.audio.ac3.php | 820 + wp-includes/ID3/module.audio.dts.php | 334 + wp-includes/ID3/module.audio.flac.php | 516 + wp-includes/ID3/module.audio.mp3.php | 2150 + wp-includes/ID3/module.audio.ogg.php | 918 + wp-includes/ID3/module.tag.apetag.php | 448 + wp-includes/ID3/module.tag.id3v1.php | 421 + wp-includes/ID3/module.tag.id3v2.php | 3891 ++ wp-includes/ID3/module.tag.lyrics3.php | 325 + wp-includes/ID3/readme.txt | 627 + wp-includes/IXR/class-IXR-base64.php | 32 + wp-includes/IXR/class-IXR-client.php | 166 + wp-includes/IXR/class-IXR-clientmulticall.php | 44 + wp-includes/IXR/class-IXR-date.php | 74 + wp-includes/IXR/class-IXR-error.php | 53 + .../IXR/class-IXR-introspectionserver.php | 174 + wp-includes/IXR/class-IXR-message.php | 234 + wp-includes/IXR/class-IXR-request.php | 54 + wp-includes/IXR/class-IXR-server.php | 225 + wp-includes/IXR/class-IXR-value.php | 138 + wp-includes/Requests/Auth.php | 33 + wp-includes/Requests/Auth/Basic.php | 88 + wp-includes/Requests/Cookie.php | 505 + wp-includes/Requests/Cookie/Jar.php | 175 + wp-includes/Requests/Exception.php | 62 + wp-includes/Requests/Exception/HTTP.php | 71 + wp-includes/Requests/Exception/HTTP/304.php | 27 + wp-includes/Requests/Exception/HTTP/305.php | 27 + wp-includes/Requests/Exception/HTTP/306.php | 27 + wp-includes/Requests/Exception/HTTP/400.php | 27 + wp-includes/Requests/Exception/HTTP/401.php | 27 + wp-includes/Requests/Exception/HTTP/402.php | 27 + wp-includes/Requests/Exception/HTTP/403.php | 27 + wp-includes/Requests/Exception/HTTP/404.php | 27 + wp-includes/Requests/Exception/HTTP/405.php | 27 + wp-includes/Requests/Exception/HTTP/406.php | 27 + wp-includes/Requests/Exception/HTTP/407.php | 27 + wp-includes/Requests/Exception/HTTP/408.php | 27 + wp-includes/Requests/Exception/HTTP/409.php | 27 + wp-includes/Requests/Exception/HTTP/410.php | 27 + wp-includes/Requests/Exception/HTTP/411.php | 27 + wp-includes/Requests/Exception/HTTP/412.php | 27 + wp-includes/Requests/Exception/HTTP/413.php | 27 + wp-includes/Requests/Exception/HTTP/414.php | 27 + wp-includes/Requests/Exception/HTTP/415.php | 27 + wp-includes/Requests/Exception/HTTP/416.php | 27 + wp-includes/Requests/Exception/HTTP/417.php | 27 + wp-includes/Requests/Exception/HTTP/418.php | 29 + wp-includes/Requests/Exception/HTTP/428.php | 29 + wp-includes/Requests/Exception/HTTP/429.php | 29 + wp-includes/Requests/Exception/HTTP/431.php | 29 + wp-includes/Requests/Exception/HTTP/500.php | 27 + wp-includes/Requests/Exception/HTTP/501.php | 27 + wp-includes/Requests/Exception/HTTP/502.php | 27 + wp-includes/Requests/Exception/HTTP/503.php | 27 + wp-includes/Requests/Exception/HTTP/504.php | 27 + wp-includes/Requests/Exception/HTTP/505.php | 27 + wp-includes/Requests/Exception/HTTP/511.php | 29 + .../Requests/Exception/HTTP/Unknown.php | 44 + wp-includes/Requests/Exception/Transport.php | 5 + .../Requests/Exception/Transport/cURL.php | 56 + wp-includes/Requests/Hooker.php | 33 + wp-includes/Requests/Hooks.php | 68 + wp-includes/Requests/IDNAEncoder.php | 388 + wp-includes/Requests/IPv6.php | 190 + wp-includes/Requests/IRI.php | 1084 + wp-includes/Requests/Proxy.php | 35 + wp-includes/Requests/Proxy/HTTP.php | 151 + wp-includes/Requests/Response.php | 121 + wp-includes/Requests/Response/Headers.php | 98 + wp-includes/Requests/SSL.php | 152 + wp-includes/Requests/Session.php | 266 + wp-includes/Requests/Transport.php | 41 + wp-includes/Requests/Transport/cURL.php | 542 + wp-includes/Requests/Transport/fsockopen.php | 444 + .../Utility/CaseInsensitiveDictionary.php | 103 + .../Requests/Utility/FilteredIterator.php | 45 + wp-includes/SimplePie/Author.php | 157 + wp-includes/SimplePie/Cache.php | 133 + wp-includes/SimplePie/Cache/Base.php | 114 + wp-includes/SimplePie/Cache/DB.php | 137 + wp-includes/SimplePie/Cache/File.php | 173 + wp-includes/SimplePie/Cache/Memcache.php | 183 + wp-includes/SimplePie/Cache/MySQL.php | 438 + wp-includes/SimplePie/Caption.php | 210 + wp-includes/SimplePie/Category.php | 157 + .../SimplePie/Content/Type/Sniffer.php | 332 + wp-includes/SimplePie/Copyright.php | 130 + wp-includes/SimplePie/Core.php | 57 + wp-includes/SimplePie/Credit.php | 156 + .../SimplePie/Decode/HTML/Entities.php | 617 + wp-includes/SimplePie/Enclosure.php | 1380 + wp-includes/SimplePie/Exception.php | 52 + wp-includes/SimplePie/File.php | 292 + wp-includes/SimplePie/HTTP/Parser.php | 500 + wp-includes/SimplePie/IRI.php | 1238 + wp-includes/SimplePie/Item.php | 2964 + wp-includes/SimplePie/Locator.php | 372 + wp-includes/SimplePie/Misc.php | 2247 + wp-includes/SimplePie/Net/IPv6.php | 276 + wp-includes/SimplePie/Parse/Date.php | 984 + wp-includes/SimplePie/Parser.php | 407 + wp-includes/SimplePie/Rating.php | 129 + wp-includes/SimplePie/Registry.php | 225 + wp-includes/SimplePie/Restriction.php | 155 + wp-includes/SimplePie/Sanitize.php | 554 + wp-includes/SimplePie/Source.php | 611 + .../SimplePie/XML/Declaration/Parser.php | 362 + wp-includes/SimplePie/gzdecode.php | 371 + wp-includes/Text/Diff.php | 506 + wp-includes/Text/Diff/Engine/native.php | 438 + wp-includes/Text/Diff/Engine/shell.php | 162 + wp-includes/Text/Diff/Engine/string.php | 248 + wp-includes/Text/Diff/Engine/xdiff.php | 64 + wp-includes/Text/Diff/Renderer.php | 242 + wp-includes/Text/Diff/Renderer/inline.php | 206 + wp-includes/admin-bar.php | 1247 + wp-includes/assets/script-loader-packages.php | 1 + wp-includes/atomlib.php | 394 + wp-includes/author-template.php | 571 + wp-includes/blocks.php | 610 + wp-includes/blocks/archives.php | 143 + wp-includes/blocks/block.php | 48 + wp-includes/blocks/calendar.php | 78 + wp-includes/blocks/categories.php | 120 + wp-includes/blocks/latest-comments.php | 196 + wp-includes/blocks/latest-posts.php | 248 + wp-includes/blocks/rss.php | 150 + wp-includes/blocks/search.php | 98 + wp-includes/blocks/shortcode.php | 36 + wp-includes/blocks/shortcode/block.json | 10 + wp-includes/blocks/social-link.php | 268 + wp-includes/blocks/social-link/block.json | 16 + wp-includes/blocks/tag-cloud.php | 78 + wp-includes/bookmark-template.php | 324 + wp-includes/bookmark.php | 462 + wp-includes/cache.php | 275 + wp-includes/canonical.php | 768 + wp-includes/capabilities.php | 1069 + wp-includes/category-template.php | 1480 + wp-includes/category.php | 371 + wp-includes/certificates/ca-bundle.crt | 3673 ++ wp-includes/class-IXR.php | 60 + wp-includes/class-feed.php | 19 + wp-includes/class-http.php | 1088 + wp-includes/class-json.php | 1037 + wp-includes/class-oembed.php | 15 + wp-includes/class-phpass.php | 276 + wp-includes/class-phpmailer.php | 4062 ++ wp-includes/class-pop3.php | 662 + wp-includes/class-requests.php | 980 + wp-includes/class-simplepie.php | 3094 + wp-includes/class-smtp.php | 1213 + wp-includes/class-snoopy.php | 1259 + .../class-walker-category-dropdown.php | 82 + wp-includes/class-walker-category.php | 268 + wp-includes/class-walker-comment.php | 469 + wp-includes/class-walker-nav-menu.php | 273 + wp-includes/class-walker-page-dropdown.php | 91 + wp-includes/class-walker-page.php | 236 + wp-includes/class-wp-admin-bar.php | 640 + wp-includes/class-wp-ajax-response.php | 163 + wp-includes/class-wp-block-parser.php | 555 + .../class-wp-block-styles-registry.php | 160 + wp-includes/class-wp-block-type-registry.php | 173 + wp-includes/class-wp-block-type.php | 216 + wp-includes/class-wp-comment-query.php | 1185 + wp-includes/class-wp-comment.php | 368 + wp-includes/class-wp-customize-control.php | 797 + wp-includes/class-wp-customize-manager.php | 6065 ++ wp-includes/class-wp-customize-nav-menus.php | 1523 + wp-includes/class-wp-customize-panel.php | 394 + wp-includes/class-wp-customize-section.php | 402 + wp-includes/class-wp-customize-setting.php | 982 + wp-includes/class-wp-customize-widgets.php | 2074 + wp-includes/class-wp-date-query.php | 1042 + wp-includes/class-wp-dependency.php | 136 + wp-includes/class-wp-editor.php | 1896 + wp-includes/class-wp-embed.php | 498 + wp-includes/class-wp-error.php | 226 + wp-includes/class-wp-fatal-error-handler.php | 230 + wp-includes/class-wp-feed-cache-transient.php | 132 + wp-includes/class-wp-feed-cache.php | 32 + wp-includes/class-wp-hook.php | 510 + wp-includes/class-wp-http-cookie.php | 261 + wp-includes/class-wp-http-curl.php | 408 + wp-includes/class-wp-http-encoding.php | 231 + wp-includes/class-wp-http-ixr-client.php | 123 + wp-includes/class-wp-http-proxy.php | 229 + wp-includes/class-wp-http-requests-hooks.php | 76 + .../class-wp-http-requests-response.php | 197 + wp-includes/class-wp-http-response.php | 153 + wp-includes/class-wp-http-streams.php | 473 + wp-includes/class-wp-image-editor-gd.php | 513 + wp-includes/class-wp-image-editor-imagick.php | 808 + wp-includes/class-wp-image-editor.php | 557 + wp-includes/class-wp-list-util.php | 266 + wp-includes/class-wp-locale-switcher.php | 237 + wp-includes/class-wp-locale.php | 369 + wp-includes/class-wp-matchesmapregex.php | 89 + wp-includes/class-wp-meta-query.php | 847 + wp-includes/class-wp-metadata-lazyloader.php | 170 + wp-includes/class-wp-network-query.php | 580 + wp-includes/class-wp-network.php | 477 + wp-includes/class-wp-object-cache.php | 475 + wp-includes/class-wp-oembed-controller.php | 218 + wp-includes/class-wp-oembed.php | 753 + .../class-wp-paused-extensions-storage.php | 223 + wp-includes/class-wp-post-type.php | 731 + wp-includes/class-wp-post.php | 387 + wp-includes/class-wp-query.php | 4412 ++ .../class-wp-recovery-mode-cookie-service.php | 233 + .../class-wp-recovery-mode-email-service.php | 352 + .../class-wp-recovery-mode-key-service.php | 183 + .../class-wp-recovery-mode-link-service.php | 127 + wp-includes/class-wp-recovery-mode.php | 469 + wp-includes/class-wp-rewrite.php | 1944 + wp-includes/class-wp-role.php | 111 + wp-includes/class-wp-roles.php | 371 + wp-includes/class-wp-session-tokens.php | 294 + wp-includes/class-wp-simplepie-file.php | 73 + .../class-wp-simplepie-sanitize-kses.php | 57 + wp-includes/class-wp-site-query.php | 820 + wp-includes/class-wp-site.php | 350 + wp-includes/class-wp-tax-query.php | 652 + wp-includes/class-wp-taxonomy.php | 455 + wp-includes/class-wp-term-query.php | 1027 + wp-includes/class-wp-term.php | 244 + .../class-wp-text-diff-renderer-inline.php | 33 + .../class-wp-text-diff-renderer-table.php | 551 + wp-includes/class-wp-theme.php | 1670 + .../class-wp-user-meta-session-tokens.php | 133 + wp-includes/class-wp-user-query.php | 893 + wp-includes/class-wp-user-request.php | 107 + wp-includes/class-wp-user.php | 879 + wp-includes/class-wp-walker.php | 447 + wp-includes/class-wp-widget-factory.php | 105 + wp-includes/class-wp-widget.php | 600 + wp-includes/class-wp-xmlrpc-server.php | 7058 +++ wp-includes/class-wp.php | 754 + wp-includes/class.wp-dependencies.php | 449 + wp-includes/class.wp-scripts.php | 700 + wp-includes/class.wp-styles.php | 461 + wp-includes/comment-template.php | 2678 + wp-includes/comment.php | 3643 ++ wp-includes/compat.php | 376 + wp-includes/cron.php | 998 + wp-includes/css/admin-bar-rtl.css | 1169 + wp-includes/css/admin-bar-rtl.min.css | 2 + wp-includes/css/admin-bar.css | 1168 + wp-includes/css/admin-bar.min.css | 2 + wp-includes/css/buttons-rtl.css | 401 + wp-includes/css/buttons-rtl.min.css | 2 + wp-includes/css/buttons.css | 400 + wp-includes/css/buttons.min.css | 2 + wp-includes/css/customize-preview-rtl.css | 167 + wp-includes/css/customize-preview-rtl.min.css | 2 + wp-includes/css/customize-preview.css | 166 + wp-includes/css/customize-preview.min.css | 2 + wp-includes/css/dashicons.css | 1156 + wp-includes/css/dashicons.min.css | 2 + .../css/dist/block-directory/style-rtl.css | 171 + .../dist/block-directory/style-rtl.min.css | 1 + .../css/dist/block-directory/style.css | 171 + .../css/dist/block-directory/style.min.css | 1 + .../css/dist/block-editor/style-rtl.css | 2350 + .../css/dist/block-editor/style-rtl.min.css | 1 + wp-includes/css/dist/block-editor/style.css | 2354 + .../css/dist/block-editor/style.min.css | 5 + .../css/dist/block-library/editor-rtl.css | 1535 + .../css/dist/block-library/editor-rtl.min.css | 1 + wp-includes/css/dist/block-library/editor.css | 1540 + .../css/dist/block-library/editor.min.css | 2 + .../css/dist/block-library/style-rtl.css | 1800 + .../css/dist/block-library/style-rtl.min.css | 1 + wp-includes/css/dist/block-library/style.css | 1826 + .../css/dist/block-library/style.min.css | 11 + .../css/dist/block-library/theme-rtl.css | 151 + .../css/dist/block-library/theme-rtl.min.css | 1 + wp-includes/css/dist/block-library/theme.css | 151 + .../css/dist/block-library/theme.min.css | 1 + wp-includes/css/dist/components/style-rtl.css | 3981 ++ .../css/dist/components/style-rtl.min.css | 1 + wp-includes/css/dist/components/style.css | 4002 ++ wp-includes/css/dist/components/style.min.css | 9 + wp-includes/css/dist/edit-post/style-rtl.css | 2083 + .../css/dist/edit-post/style-rtl.min.css | 1 + wp-includes/css/dist/edit-post/style.css | 2087 + wp-includes/css/dist/edit-post/style.min.css | 1 + .../css/dist/editor/editor-styles-rtl.css | 148 + .../css/dist/editor/editor-styles-rtl.min.css | 1 + wp-includes/css/dist/editor/editor-styles.css | 148 + .../css/dist/editor/editor-styles.min.css | 1 + wp-includes/css/dist/editor/style-rtl.css | 833 + wp-includes/css/dist/editor/style-rtl.min.css | 1 + wp-includes/css/dist/editor/style.css | 837 + wp-includes/css/dist/editor/style.min.css | 1 + .../css/dist/format-library/style-rtl.css | 111 + .../css/dist/format-library/style-rtl.min.css | 1 + wp-includes/css/dist/format-library/style.css | 111 + .../css/dist/format-library/style.min.css | 1 + .../dist/list-reusable-blocks/style-rtl.css | 61 + .../list-reusable-blocks/style-rtl.min.css | 1 + .../css/dist/list-reusable-blocks/style.css | 61 + .../dist/list-reusable-blocks/style.min.css | 1 + wp-includes/css/dist/nux/style-rtl.css | 126 + wp-includes/css/dist/nux/style-rtl.min.css | 1 + wp-includes/css/dist/nux/style.css | 130 + wp-includes/css/dist/nux/style.min.css | 5 + wp-includes/css/editor-rtl.css | 1883 + wp-includes/css/editor-rtl.min.css | 2 + wp-includes/css/editor.css | 1882 + wp-includes/css/editor.min.css | 2 + wp-includes/css/jquery-ui-dialog-rtl.css | 361 + wp-includes/css/jquery-ui-dialog-rtl.min.css | 18 + wp-includes/css/jquery-ui-dialog.css | 360 + wp-includes/css/jquery-ui-dialog.min.css | 18 + wp-includes/css/media-views-rtl.css | 2858 + wp-includes/css/media-views-rtl.min.css | 9 + wp-includes/css/media-views.css | 2857 + wp-includes/css/media-views.min.css | 9 + wp-includes/css/wp-auth-check-rtl.css | 124 + wp-includes/css/wp-auth-check-rtl.min.css | 2 + wp-includes/css/wp-auth-check.css | 123 + wp-includes/css/wp-auth-check.min.css | 2 + wp-includes/css/wp-embed-template-ie.css | 19 + wp-includes/css/wp-embed-template-ie.min.css | 2 + wp-includes/css/wp-embed-template.css | 359 + wp-includes/css/wp-embed-template.min.css | 2 + wp-includes/css/wp-pointer-rtl.css | 225 + wp-includes/css/wp-pointer-rtl.min.css | 2 + wp-includes/css/wp-pointer.css | 224 + wp-includes/css/wp-pointer.min.css | 2 + ...-wp-customize-background-image-control.php | 59 + ...-wp-customize-background-image-setting.php | 28 + ...-customize-background-position-control.php | 111 + ...class-wp-customize-code-editor-control.php | 110 + .../class-wp-customize-color-control.php | 122 + ...ass-wp-customize-cropped-image-control.php | 86 + .../class-wp-customize-custom-css-setting.php | 202 + .../class-wp-customize-date-time-control.php | 282 + .../class-wp-customize-filter-setting.php | 29 + ...lass-wp-customize-header-image-control.php | 259 + ...lass-wp-customize-header-image-setting.php | 53 + .../class-wp-customize-image-control.php | 59 + .../class-wp-customize-media-control.php | 264 + ...wp-customize-nav-menu-auto-add-control.php | 51 + .../class-wp-customize-nav-menu-control.php | 77 + ...ass-wp-customize-nav-menu-item-control.php | 181 + ...ass-wp-customize-nav-menu-item-setting.php | 898 + ...wp-customize-nav-menu-location-control.php | 89 + ...p-customize-nav-menu-locations-control.php | 94 + ...ass-wp-customize-nav-menu-name-control.php | 56 + .../class-wp-customize-nav-menu-section.php | 41 + .../class-wp-customize-nav-menu-setting.php | 649 + .../class-wp-customize-nav-menus-panel.php | 101 + .../class-wp-customize-new-menu-control.php | 63 + .../class-wp-customize-new-menu-section.php | 65 + .../customize/class-wp-customize-partial.php | 311 + .../class-wp-customize-selective-refresh.php | 456 + .../class-wp-customize-sidebar-section.php | 58 + .../class-wp-customize-site-icon-control.php | 97 + .../class-wp-customize-theme-control.php | 139 + .../class-wp-customize-themes-panel.php | 104 + .../class-wp-customize-themes-section.php | 186 + .../class-wp-customize-upload-control.php | 44 + ...class-wp-widget-area-customize-control.php | 66 + ...class-wp-widget-form-customize-control.php | 140 + wp-includes/date.php | 14 + wp-includes/default-constants.php | 410 + wp-includes/default-filters.php | 589 + wp-includes/default-widgets.php | 65 + wp-includes/deprecated.php | 3967 ++ wp-includes/embed-template.php | 13 + wp-includes/embed.php | 1239 + wp-includes/error-protection.php | 137 + wp-includes/feed-atom-comments.php | 143 + wp-includes/feed-atom.php | 102 + wp-includes/feed-rdf.php | 99 + wp-includes/feed-rss.php | 48 + wp-includes/feed-rss2-comments.php | 121 + wp-includes/feed-rss2.php | 130 + wp-includes/feed.php | 791 + wp-includes/fonts/dashicons.eot | Bin 0 -> 44868 bytes wp-includes/fonts/dashicons.svg | 1 + wp-includes/fonts/dashicons.ttf | Bin 0 -> 44696 bytes wp-includes/fonts/dashicons.woff | Bin 0 -> 26124 bytes wp-includes/fonts/dashicons.woff2 | Bin 0 -> 21004 bytes wp-includes/formatting.php | 6020 ++ wp-includes/functions.php | 7595 +++ wp-includes/functions.wp-scripts.php | 392 + wp-includes/functions.wp-styles.php | 237 + wp-includes/general-template.php | 4738 ++ wp-includes/http.php | 764 + wp-includes/images/admin-bar-sprite-2x.png | Bin 0 -> 3999 bytes wp-includes/images/admin-bar-sprite.png | Bin 0 -> 2467 bytes wp-includes/images/arrow-pointer-blue-2x.png | Bin 0 -> 1666 bytes wp-includes/images/arrow-pointer-blue.png | Bin 0 -> 793 bytes wp-includes/images/blank.gif | Bin 0 -> 43 bytes wp-includes/images/crystal/archive.png | Bin 0 -> 2454 bytes wp-includes/images/crystal/audio.png | Bin 0 -> 2184 bytes wp-includes/images/crystal/code.png | Bin 0 -> 1604 bytes wp-includes/images/crystal/default.png | Bin 0 -> 453 bytes wp-includes/images/crystal/document.png | Bin 0 -> 2063 bytes wp-includes/images/crystal/interactive.png | Bin 0 -> 2217 bytes wp-includes/images/crystal/license.txt | 9 + wp-includes/images/crystal/spreadsheet.png | Bin 0 -> 2408 bytes wp-includes/images/crystal/text.png | Bin 0 -> 670 bytes wp-includes/images/crystal/video.png | Bin 0 -> 1339 bytes wp-includes/images/down_arrow-2x.gif | Bin 0 -> 84 bytes wp-includes/images/down_arrow.gif | Bin 0 -> 59 bytes wp-includes/images/icon-pointer-flag-2x.png | Bin 0 -> 1369 bytes wp-includes/images/icon-pointer-flag.png | Bin 0 -> 783 bytes wp-includes/images/media/archive.png | Bin 0 -> 417 bytes wp-includes/images/media/audio.png | Bin 0 -> 382 bytes wp-includes/images/media/code.png | Bin 0 -> 274 bytes wp-includes/images/media/default.png | Bin 0 -> 168 bytes wp-includes/images/media/document.png | Bin 0 -> 200 bytes wp-includes/images/media/interactive.png | Bin 0 -> 319 bytes wp-includes/images/media/spreadsheet.png | Bin 0 -> 188 bytes wp-includes/images/media/text.png | Bin 0 -> 188 bytes wp-includes/images/media/video.png | Bin 0 -> 283 bytes wp-includes/images/rss-2x.png | Bin 0 -> 1306 bytes wp-includes/images/rss.png | Bin 0 -> 608 bytes wp-includes/images/smilies/frownie.png | Bin 0 -> 1007 bytes wp-includes/images/smilies/icon_arrow.gif | Bin 0 -> 169 bytes wp-includes/images/smilies/icon_biggrin.gif | Bin 0 -> 173 bytes wp-includes/images/smilies/icon_confused.gif | Bin 0 -> 170 bytes wp-includes/images/smilies/icon_cool.gif | Bin 0 -> 172 bytes wp-includes/images/smilies/icon_cry.gif | Bin 0 -> 412 bytes wp-includes/images/smilies/icon_eek.gif | Bin 0 -> 170 bytes wp-includes/images/smilies/icon_evil.gif | Bin 0 -> 193 bytes wp-includes/images/smilies/icon_exclaim.gif | Bin 0 -> 236 bytes wp-includes/images/smilies/icon_idea.gif | Bin 0 -> 174 bytes wp-includes/images/smilies/icon_lol.gif | Bin 0 -> 331 bytes wp-includes/images/smilies/icon_mad.gif | Bin 0 -> 172 bytes wp-includes/images/smilies/icon_mrgreen.gif | Bin 0 -> 348 bytes wp-includes/images/smilies/icon_neutral.gif | Bin 0 -> 167 bytes wp-includes/images/smilies/icon_question.gif | Bin 0 -> 247 bytes wp-includes/images/smilies/icon_razz.gif | Bin 0 -> 175 bytes wp-includes/images/smilies/icon_redface.gif | Bin 0 -> 645 bytes wp-includes/images/smilies/icon_rolleyes.gif | Bin 0 -> 471 bytes wp-includes/images/smilies/icon_sad.gif | Bin 0 -> 167 bytes wp-includes/images/smilies/icon_smile.gif | Bin 0 -> 173 bytes wp-includes/images/smilies/icon_surprised.gif | Bin 0 -> 174 bytes wp-includes/images/smilies/icon_twisted.gif | Bin 0 -> 241 bytes wp-includes/images/smilies/icon_wink.gif | Bin 0 -> 168 bytes wp-includes/images/smilies/mrgreen.png | Bin 0 -> 1486 bytes wp-includes/images/smilies/rolleyes.png | Bin 0 -> 1233 bytes wp-includes/images/smilies/simple-smile.png | Bin 0 -> 1008 bytes wp-includes/images/spinner-2x.gif | Bin 0 -> 7536 bytes wp-includes/images/spinner.gif | Bin 0 -> 3656 bytes wp-includes/images/toggle-arrow-2x.png | Bin 0 -> 354 bytes wp-includes/images/toggle-arrow.png | Bin 0 -> 289 bytes wp-includes/images/uploader-icons-2x.png | Bin 0 -> 3542 bytes wp-includes/images/uploader-icons.png | Bin 0 -> 1556 bytes wp-includes/images/w-logo-blue-white-bg.png | Bin 0 -> 4119 bytes wp-includes/images/w-logo-blue.png | Bin 0 -> 3113 bytes wp-includes/images/wlw/wp-comments.png | Bin 0 -> 1373 bytes wp-includes/images/wlw/wp-icon.png | Bin 0 -> 664 bytes wp-includes/images/wlw/wp-watermark.png | Bin 0 -> 2376 bytes wp-includes/images/wpicons-2x.png | Bin 0 -> 14931 bytes wp-includes/images/wpicons.png | Bin 0 -> 7086 bytes wp-includes/images/wpspin-2x.gif | Bin 0 -> 8875 bytes wp-includes/images/wpspin.gif | Bin 0 -> 2052 bytes wp-includes/images/xit-2x.gif | Bin 0 -> 825 bytes wp-includes/images/xit.gif | Bin 0 -> 181 bytes wp-includes/js/admin-bar.js | 464 + wp-includes/js/admin-bar.min.js | 2 + wp-includes/js/api-request.js | 97 + wp-includes/js/api-request.min.js | 2 + wp-includes/js/autosave.js | 861 + wp-includes/js/autosave.min.js | 2 + wp-includes/js/backbone.js | 2096 + wp-includes/js/backbone.min.js | 2 + wp-includes/js/clipboard.js | 978 + wp-includes/js/clipboard.min.js | 2 + wp-includes/js/codemirror/codemirror.min.css | 11 + wp-includes/js/codemirror/codemirror.min.js | 29 + wp-includes/js/codemirror/csslint.js | 10859 ++++ wp-includes/js/codemirror/esprima.js | 6700 ++ wp-includes/js/codemirror/fakejshint.js | 43 + wp-includes/js/codemirror/htmlhint-kses.js | 30 + wp-includes/js/codemirror/htmlhint.js | 8 + wp-includes/js/codemirror/jsonlint.js | 432 + wp-includes/js/colorpicker.js | 707 + wp-includes/js/colorpicker.min.js | 2 + wp-includes/js/comment-reply.js | 406 + wp-includes/js/comment-reply.min.js | 2 + wp-includes/js/crop/cropper.css | 165 + wp-includes/js/crop/cropper.js | 516 + wp-includes/js/crop/marqueeHoriz.gif | Bin 0 -> 277 bytes wp-includes/js/crop/marqueeVert.gif | Bin 0 -> 293 bytes wp-includes/js/customize-base.js | 993 + wp-includes/js/customize-base.min.js | 2 + wp-includes/js/customize-loader.js | 291 + wp-includes/js/customize-loader.min.js | 2 + wp-includes/js/customize-models.js | 281 + wp-includes/js/customize-models.min.js | 2 + wp-includes/js/customize-preview-nav-menus.js | 446 + .../js/customize-preview-nav-menus.min.js | 2 + wp-includes/js/customize-preview-widgets.js | 773 + .../js/customize-preview-widgets.min.js | 2 + wp-includes/js/customize-preview.js | 899 + wp-includes/js/customize-preview.min.js | 2 + wp-includes/js/customize-selective-refresh.js | 1066 + .../js/customize-selective-refresh.min.js | 2 + wp-includes/js/customize-views.js | 202 + wp-includes/js/customize-views.min.js | 2 + wp-includes/js/dist/a11y.js | 251 + wp-includes/js/dist/a11y.min.js | 2 + wp-includes/js/dist/annotations.js | 1263 + wp-includes/js/dist/annotations.min.js | 2 + wp-includes/js/dist/api-fetch.js | 981 + wp-includes/js/dist/api-fetch.min.js | 2 + wp-includes/js/dist/autop.js | 604 + wp-includes/js/dist/autop.min.js | 2 + wp-includes/js/dist/blob.js | 168 + wp-includes/js/dist/blob.min.js | 2 + wp-includes/js/dist/block-directory.js | 1723 + wp-includes/js/dist/block-directory.min.js | 2 + wp-includes/js/dist/block-editor.js | 32000 ++++++++++ wp-includes/js/dist/block-editor.min.js | 50 + wp-includes/js/dist/block-library.js | 25417 ++++++++ wp-includes/js/dist/block-library.min.js | 14 + .../block-serialization-default-parser.js | 590 + .../block-serialization-default-parser.min.js | 2 + wp-includes/js/dist/blocks.js | 14068 +++++ wp-includes/js/dist/blocks.min.js | 3 + wp-includes/js/dist/components.js | 52620 ++++++++++++++++ wp-includes/js/dist/components.min.js | 30 + wp-includes/js/dist/compose.js | 2697 + wp-includes/js/dist/compose.min.js | 2 + wp-includes/js/dist/core-data.js | 4453 ++ wp-includes/js/dist/core-data.min.js | 2 + wp-includes/js/dist/data-controls.js | 361 + wp-includes/js/dist/data-controls.min.js | 2 + wp-includes/js/dist/data.js | 4218 ++ wp-includes/js/dist/data.min.js | 2 + wp-includes/js/dist/date.js | 1590 + wp-includes/js/dist/date.min.js | 12 + wp-includes/js/dist/deprecated.js | 184 + wp-includes/js/dist/deprecated.min.js | 2 + wp-includes/js/dist/dom-ready.js | 140 + wp-includes/js/dist/dom-ready.min.js | 2 + wp-includes/js/dist/dom.js | 1061 + wp-includes/js/dist/dom.min.js | 2 + wp-includes/js/dist/edit-post.js | 7749 +++ wp-includes/js/dist/edit-post.min.js | 7 + wp-includes/js/dist/editor.js | 14852 +++++ wp-includes/js/dist/editor.min.js | 12 + wp-includes/js/dist/element.js | 1643 + wp-includes/js/dist/element.min.js | 2 + wp-includes/js/dist/escape-html.js | 246 + wp-includes/js/dist/escape-html.min.js | 2 + wp-includes/js/dist/format-library.js | 1961 + wp-includes/js/dist/format-library.min.js | 2 + wp-includes/js/dist/hooks.js | 720 + wp-includes/js/dist/hooks.min.js | 2 + wp-includes/js/dist/html-entities.js | 136 + wp-includes/js/dist/html-entities.min.js | 2 + wp-includes/js/dist/i18n.js | 1235 + wp-includes/js/dist/i18n.min.js | 2 + wp-includes/js/dist/is-shallow-equal.js | 234 + wp-includes/js/dist/is-shallow-equal.min.js | 2 + wp-includes/js/dist/keyboard-shortcuts.js | 925 + wp-includes/js/dist/keyboard-shortcuts.min.js | 2 + wp-includes/js/dist/keycodes.js | 543 + wp-includes/js/dist/keycodes.min.js | 2 + wp-includes/js/dist/list-reusable-blocks.js | 829 + .../js/dist/list-reusable-blocks.min.js | 2 + wp-includes/js/dist/media-utils.js | 1328 + wp-includes/js/dist/media-utils.min.js | 2 + wp-includes/js/dist/notices.js | 585 + wp-includes/js/dist/notices.min.js | 2 + wp-includes/js/dist/nux.js | 1071 + wp-includes/js/dist/nux.min.js | 2 + wp-includes/js/dist/plugins.js | 750 + wp-includes/js/dist/plugins.min.js | 2 + wp-includes/js/dist/primitives.js | 335 + wp-includes/js/dist/primitives.min.js | 7 + wp-includes/js/dist/priority-queue.js | 274 + wp-includes/js/dist/priority-queue.min.js | 2 + wp-includes/js/dist/redux-routine.js | 936 + wp-includes/js/dist/redux-routine.min.js | 2 + wp-includes/js/dist/rich-text.js | 5433 ++ wp-includes/js/dist/rich-text.min.js | 7 + wp-includes/js/dist/server-side-render.js | 691 + wp-includes/js/dist/server-side-render.min.js | 2 + wp-includes/js/dist/shortcode.js | 634 + wp-includes/js/dist/shortcode.min.js | 2 + wp-includes/js/dist/token-list.js | 415 + wp-includes/js/dist/token-list.min.js | 2 + wp-includes/js/dist/url.js | 1493 + wp-includes/js/dist/url.min.js | 2 + wp-includes/js/dist/viewport.js | 570 + wp-includes/js/dist/viewport.min.js | 2 + wp-includes/js/dist/warning.js | 329 + wp-includes/js/dist/warning.min.js | 2 + wp-includes/js/dist/wordcount.js | 428 + wp-includes/js/dist/wordcount.min.js | 2 + wp-includes/js/heartbeat.js | 870 + wp-includes/js/heartbeat.min.js | 2 + wp-includes/js/hoverIntent.js | 115 + wp-includes/js/hoverIntent.min.js | 2 + wp-includes/js/hoverintent-js.min.js | 2 + wp-includes/js/imagesloaded.min.js | 8 + .../js/imgareaselect/border-anim-h.gif | Bin 0 -> 178 bytes .../js/imgareaselect/border-anim-v.gif | Bin 0 -> 178 bytes .../js/imgareaselect/imgareaselect.css | 41 + .../js/imgareaselect/jquery.imgareaselect.js | 1232 + .../imgareaselect/jquery.imgareaselect.min.js | 1 + wp-includes/js/jcrop/Jcrop.gif | Bin 0 -> 323 bytes wp-includes/js/jcrop/jquery.Jcrop.min.css | 29 + wp-includes/js/jcrop/jquery.Jcrop.min.js | 22 + wp-includes/js/jquery/jquery-migrate.js | 752 + wp-includes/js/jquery/jquery-migrate.min.js | 2 + wp-includes/js/jquery/jquery.color.min.js | 2 + wp-includes/js/jquery/jquery.form.js | 1520 + wp-includes/js/jquery/jquery.form.min.js | 1 + wp-includes/js/jquery/jquery.hotkeys.js | 134 + wp-includes/js/jquery/jquery.hotkeys.min.js | 1 + wp-includes/js/jquery/jquery.js | 6 + wp-includes/js/jquery/jquery.masonry.min.js | 11 + wp-includes/js/jquery/jquery.query.js | 11 + wp-includes/js/jquery/jquery.schedule.js | 36 + .../js/jquery/jquery.serialize-object.js | 31 + wp-includes/js/jquery/jquery.table-hotkeys.js | 99 + .../js/jquery/jquery.table-hotkeys.min.js | 1 + .../js/jquery/jquery.ui.touch-punch.js | 11 + wp-includes/js/jquery/suggest.js | 316 + wp-includes/js/jquery/suggest.min.js | 1 + wp-includes/js/jquery/ui/accordion.min.js | 11 + wp-includes/js/jquery/ui/autocomplete.min.js | 11 + wp-includes/js/jquery/ui/button.min.js | 11 + wp-includes/js/jquery/ui/core.min.js | 11 + wp-includes/js/jquery/ui/datepicker.min.js | 11 + wp-includes/js/jquery/ui/dialog.min.js | 11 + wp-includes/js/jquery/ui/draggable.min.js | 11 + wp-includes/js/jquery/ui/droppable.min.js | 11 + wp-includes/js/jquery/ui/effect-blind.min.js | 11 + wp-includes/js/jquery/ui/effect-bounce.min.js | 11 + wp-includes/js/jquery/ui/effect-clip.min.js | 11 + wp-includes/js/jquery/ui/effect-drop.min.js | 11 + .../js/jquery/ui/effect-explode.min.js | 11 + wp-includes/js/jquery/ui/effect-fade.min.js | 11 + wp-includes/js/jquery/ui/effect-fold.min.js | 11 + .../js/jquery/ui/effect-highlight.min.js | 11 + wp-includes/js/jquery/ui/effect-puff.min.js | 11 + .../js/jquery/ui/effect-pulsate.min.js | 11 + wp-includes/js/jquery/ui/effect-scale.min.js | 11 + wp-includes/js/jquery/ui/effect-shake.min.js | 11 + wp-includes/js/jquery/ui/effect-size.min.js | 11 + wp-includes/js/jquery/ui/effect-slide.min.js | 11 + .../js/jquery/ui/effect-transfer.min.js | 11 + wp-includes/js/jquery/ui/effect.min.js | 22 + wp-includes/js/jquery/ui/menu.min.js | 11 + wp-includes/js/jquery/ui/mouse.min.js | 11 + wp-includes/js/jquery/ui/position.min.js | 11 + wp-includes/js/jquery/ui/progressbar.min.js | 11 + wp-includes/js/jquery/ui/resizable.min.js | 11 + wp-includes/js/jquery/ui/selectable.min.js | 11 + wp-includes/js/jquery/ui/selectmenu.min.js | 11 + wp-includes/js/jquery/ui/slider.min.js | 11 + wp-includes/js/jquery/ui/sortable.min.js | 11 + wp-includes/js/jquery/ui/spinner.min.js | 11 + wp-includes/js/jquery/ui/tabs.min.js | 11 + wp-includes/js/jquery/ui/tooltip.min.js | 11 + wp-includes/js/jquery/ui/widget.min.js | 11 + wp-includes/js/json2.js | 519 + wp-includes/js/json2.min.js | 2 + wp-includes/js/masonry.min.js | 10 + wp-includes/js/mce-view.js | 985 + wp-includes/js/mce-view.min.js | 2 + wp-includes/js/media-audiovideo.js | 1137 + wp-includes/js/media-audiovideo.min.js | 2 + wp-includes/js/media-editor.js | 1068 + wp-includes/js/media-editor.min.js | 2 + wp-includes/js/media-grid.js | 1102 + wp-includes/js/media-grid.min.js | 2 + wp-includes/js/media-models.js | 1677 + wp-includes/js/media-models.min.js | 2 + wp-includes/js/media-views.js | 10199 +++ wp-includes/js/media-views.min.js | 2 + .../mediaelement/mediaelement-and-player.js | 8802 +++ .../mediaelement-and-player.min.js | 12 + .../js/mediaelement/mediaelement-migrate.js | 84 + .../mediaelement/mediaelement-migrate.min.js | 1 + wp-includes/js/mediaelement/mediaelement.js | 4247 ++ .../js/mediaelement/mediaelement.min.js | 12 + .../mediaelementplayer-legacy.css | 774 + .../mediaelementplayer-legacy.min.css | 1 + .../js/mediaelement/mediaelementplayer.css | 774 + .../mediaelement/mediaelementplayer.min.css | 1 + wp-includes/js/mediaelement/mejs-controls.png | Bin 0 -> 2883 bytes wp-includes/js/mediaelement/mejs-controls.svg | 1 + .../js/mediaelement/renderers/vimeo.js | 416 + .../js/mediaelement/renderers/vimeo.min.js | 12 + .../js/mediaelement/wp-mediaelement.css | 293 + .../js/mediaelement/wp-mediaelement.js | 88 + .../js/mediaelement/wp-mediaelement.min.css | 1 + .../js/mediaelement/wp-mediaelement.min.js | 1 + wp-includes/js/mediaelement/wp-playlist.js | 203 + .../js/mediaelement/wp-playlist.min.js | 1 + wp-includes/js/plupload/handlers.js | 613 + wp-includes/js/plupload/handlers.min.js | 1 + wp-includes/js/plupload/license.txt | 339 + wp-includes/js/plupload/moxie.js | 9901 +++ wp-includes/js/plupload/moxie.min.js | 1 + wp-includes/js/plupload/plupload.js | 2379 + wp-includes/js/plupload/plupload.min.js | 1 + wp-includes/js/plupload/wp-plupload.js | 557 + wp-includes/js/plupload/wp-plupload.min.js | 1 + wp-includes/js/quicktags.js | 749 + wp-includes/js/quicktags.min.js | 2 + wp-includes/js/shortcode.js | 387 + wp-includes/js/shortcode.min.js | 2 + wp-includes/js/swfobject.js | 4 + wp-includes/js/swfupload/handlers.js | 54 + wp-includes/js/swfupload/handlers.min.js | 1 + wp-includes/js/swfupload/license.txt | 32 + wp-includes/js/swfupload/swfupload.js | 140 + wp-includes/js/thickbox/loadingAnimation.gif | Bin 0 -> 15238 bytes wp-includes/js/thickbox/macFFBgHack.png | Bin 0 -> 94 bytes wp-includes/js/thickbox/thickbox.css | 156 + wp-includes/js/thickbox/thickbox.js | 338 + wp-includes/js/tinymce/langs/wp-langs-en.js | 516 + wp-includes/js/tinymce/license.txt | 504 + .../js/tinymce/plugins/charmap/plugin.js | 1275 + .../js/tinymce/plugins/charmap/plugin.min.js | 1 + .../js/tinymce/plugins/colorpicker/plugin.js | 126 + .../tinymce/plugins/colorpicker/plugin.min.js | 1 + .../tinymce/plugins/compat3x/css/dialog.css | 210 + .../js/tinymce/plugins/compat3x/plugin.js | 322 + .../js/tinymce/plugins/compat3x/plugin.min.js | 1 + .../tinymce/plugins/directionality/plugin.js | 66 + .../plugins/directionality/plugin.min.js | 1 + .../js/tinymce/plugins/fullscreen/plugin.js | 177 + .../tinymce/plugins/fullscreen/plugin.min.js | 1 + wp-includes/js/tinymce/plugins/hr/plugin.js | 39 + .../js/tinymce/plugins/hr/plugin.min.js | 1 + .../js/tinymce/plugins/image/plugin.js | 1209 + .../js/tinymce/plugins/image/plugin.min.js | 1 + wp-includes/js/tinymce/plugins/link/plugin.js | 713 + .../js/tinymce/plugins/link/plugin.min.js | 1 + .../js/tinymce/plugins/lists/plugin.js | 2182 + .../js/tinymce/plugins/lists/plugin.min.js | 1 + .../js/tinymce/plugins/media/plugin.js | 1166 + .../js/tinymce/plugins/media/plugin.min.js | 1 + .../js/tinymce/plugins/paste/plugin.js | 2379 + .../js/tinymce/plugins/paste/plugin.min.js | 1 + .../js/tinymce/plugins/tabfocus/plugin.js | 124 + .../js/tinymce/plugins/tabfocus/plugin.min.js | 1 + .../js/tinymce/plugins/textcolor/plugin.js | 346 + .../tinymce/plugins/textcolor/plugin.min.js | 1 + .../js/tinymce/plugins/wordpress/plugin.js | 1201 + .../tinymce/plugins/wordpress/plugin.min.js | 1 + .../js/tinymce/plugins/wpautoresize/plugin.js | 207 + .../plugins/wpautoresize/plugin.min.js | 1 + .../js/tinymce/plugins/wpdialogs/plugin.js | 92 + .../tinymce/plugins/wpdialogs/plugin.min.js | 1 + .../js/tinymce/plugins/wpeditimage/plugin.js | 900 + .../tinymce/plugins/wpeditimage/plugin.min.js | 1 + .../js/tinymce/plugins/wpemoji/plugin.js | 134 + .../js/tinymce/plugins/wpemoji/plugin.min.js | 1 + .../js/tinymce/plugins/wpgallery/plugin.js | 112 + .../tinymce/plugins/wpgallery/plugin.min.js | 1 + .../js/tinymce/plugins/wplink/plugin.js | 610 + .../js/tinymce/plugins/wplink/plugin.min.js | 1 + .../tinymce/plugins/wptextpattern/plugin.js | 348 + .../plugins/wptextpattern/plugin.min.js | 1 + .../js/tinymce/plugins/wpview/plugin.js | 225 + .../js/tinymce/plugins/wpview/plugin.min.js | 1 + .../skins/lightgray/content.inline.min.css | 1 + .../tinymce/skins/lightgray/content.min.css | 1 + .../skins/lightgray/fonts/tinymce-small.eot | Bin 0 -> 9492 bytes .../skins/lightgray/fonts/tinymce-small.svg | 63 + .../skins/lightgray/fonts/tinymce-small.ttf | Bin 0 -> 9304 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 0 -> 9380 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 0 -> 18912 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 132 + .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 0 -> 18748 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 0 -> 18824 bytes .../js/tinymce/skins/lightgray/img/anchor.gif | Bin 0 -> 53 bytes .../js/tinymce/skins/lightgray/img/loader.gif | Bin 0 -> 2608 bytes .../js/tinymce/skins/lightgray/img/object.gif | Bin 0 -> 152 bytes .../js/tinymce/skins/lightgray/img/trans.gif | Bin 0 -> 43 bytes .../js/tinymce/skins/lightgray/skin.min.css | 1 + .../tinymce/skins/wordpress/images/audio.png | Bin 0 -> 412 bytes .../skins/wordpress/images/dashicon-edit.png | Bin 0 -> 368 bytes .../skins/wordpress/images/dashicon-no.png | Bin 0 -> 339 bytes .../skins/wordpress/images/embedded.png | Bin 0 -> 8177 bytes .../skins/wordpress/images/gallery-2x.png | Bin 0 -> 447 bytes .../skins/wordpress/images/gallery.png | Bin 0 -> 379 bytes .../skins/wordpress/images/more-2x.png | Bin 0 -> 603 bytes .../tinymce/skins/wordpress/images/more.png | Bin 0 -> 414 bytes .../skins/wordpress/images/pagebreak-2x.png | Bin 0 -> 835 bytes .../skins/wordpress/images/pagebreak.png | Bin 0 -> 1140 bytes .../skins/wordpress/images/playlist-audio.png | Bin 0 -> 440 bytes .../skins/wordpress/images/playlist-video.png | Bin 0 -> 290 bytes .../tinymce/skins/wordpress/images/video.png | Bin 0 -> 363 bytes .../js/tinymce/skins/wordpress/wp-content.css | 495 + wp-includes/js/tinymce/themes/inlite/theme.js | 9830 +++ .../js/tinymce/themes/inlite/theme.min.js | 1 + wp-includes/js/tinymce/themes/modern/theme.js | 9636 +++ .../js/tinymce/themes/modern/theme.min.js | 1 + wp-includes/js/tinymce/tiny_mce_popup.js | 542 + wp-includes/js/tinymce/tinymce.min.js | 2 + .../js/tinymce/utils/editable_selects.js | 72 + wp-includes/js/tinymce/utils/form_utils.js | 222 + wp-includes/js/tinymce/utils/mctabs.js | 168 + wp-includes/js/tinymce/utils/validate.js | 267 + wp-includes/js/tinymce/wp-tinymce.js | 49 + wp-includes/js/tinymce/wp-tinymce.php | 44 + wp-includes/js/tw-sack.js | 193 + wp-includes/js/tw-sack.min.js | 2 + wp-includes/js/twemoji.js | 568 + wp-includes/js/twemoji.min.js | 2 + wp-includes/js/underscore.js | 1548 + wp-includes/js/underscore.min.js | 2 + wp-includes/js/utils.js | 204 + wp-includes/js/utils.min.js | 2 + wp-includes/js/wp-ajax-response.js | 70 + wp-includes/js/wp-ajax-response.min.js | 2 + wp-includes/js/wp-api.js | 1547 + wp-includes/js/wp-api.min.js | 2 + wp-includes/js/wp-auth-check.js | 180 + wp-includes/js/wp-auth-check.min.js | 2 + wp-includes/js/wp-backbone.js | 566 + wp-includes/js/wp-backbone.min.js | 2 + wp-includes/js/wp-custom-header.js | 465 + wp-includes/js/wp-custom-header.min.js | 2 + wp-includes/js/wp-embed-template.js | 215 + wp-includes/js/wp-embed-template.min.js | 2 + wp-includes/js/wp-embed.js | 128 + wp-includes/js/wp-embed.min.js | 2 + wp-includes/js/wp-emoji-loader.js | 215 + wp-includes/js/wp-emoji-loader.min.js | 2 + wp-includes/js/wp-emoji-release.min.js | 5 + wp-includes/js/wp-emoji.js | 302 + wp-includes/js/wp-emoji.min.js | 2 + wp-includes/js/wp-list-revisions.js | 28 + wp-includes/js/wp-list-revisions.min.js | 2 + wp-includes/js/wp-lists.js | 858 + wp-includes/js/wp-lists.min.js | 2 + wp-includes/js/wp-pointer.js | 423 + wp-includes/js/wp-pointer.min.js | 2 + wp-includes/js/wp-sanitize.js | 61 + wp-includes/js/wp-sanitize.min.js | 2 + wp-includes/js/wp-util.js | 137 + wp-includes/js/wp-util.min.js | 2 + wp-includes/js/wpdialog.js | 27 + wp-includes/js/wpdialog.min.js | 2 + wp-includes/js/wplink.js | 801 + wp-includes/js/wplink.min.js | 2 + wp-includes/js/zxcvbn-async.js | 30 + wp-includes/js/zxcvbn-async.min.js | 2 + wp-includes/js/zxcvbn.min.js | 32 + wp-includes/kses.php | 2351 + wp-includes/l10n.php | 1645 + wp-includes/link-template.php | 4471 ++ wp-includes/load.php | 1570 + wp-includes/locale.php | 11 + wp-includes/media-template.php | 1466 + wp-includes/media.php | 4476 ++ wp-includes/meta.php | 1475 + wp-includes/ms-blogs.php | 905 + wp-includes/ms-default-constants.php | 172 + wp-includes/ms-default-filters.php | 128 + wp-includes/ms-deprecated.php | 732 + wp-includes/ms-files.php | 88 + wp-includes/ms-functions.php | 2836 + wp-includes/ms-load.php | 571 + wp-includes/ms-network.php | 138 + wp-includes/ms-settings.php | 123 + wp-includes/ms-site.php | 1327 + wp-includes/nav-menu-template.php | 605 + wp-includes/nav-menu.php | 1264 + wp-includes/option.php | 2311 + wp-includes/pluggable-deprecated.php | 208 + wp-includes/pluggable.php | 2810 + wp-includes/plugin.php | 931 + wp-includes/pomo/entry.php | 108 + wp-includes/pomo/mo.php | 349 + wp-includes/pomo/plural-forms.php | 344 + wp-includes/pomo/po.php | 510 + wp-includes/pomo/streams.php | 350 + wp-includes/pomo/translations.php | 379 + wp-includes/post-formats.php | 266 + wp-includes/post-template.php | 1951 + wp-includes/post-thumbnail-template.php | 276 + wp-includes/post.php | 7275 +++ wp-includes/query.php | 1196 + .../random_compat/byte_safe_strings.php | 181 + wp-includes/random_compat/cast_to_int.php | 75 + wp-includes/random_compat/error_polyfill.php | 49 + wp-includes/random_compat/random.php | 223 + .../random_compat/random_bytes_com_dotnet.php | 88 + .../random_bytes_dev_urandom.php | 167 + .../random_compat/random_bytes_libsodium.php | 88 + .../random_bytes_libsodium_legacy.php | 92 + .../random_compat/random_bytes_mcrypt.php | 77 + wp-includes/random_compat/random_int.php | 190 + wp-includes/registration-functions.php | 9 + wp-includes/registration.php | 9 + wp-includes/rest-api.php | 1605 + .../rest-api/class-wp-rest-request.php | 1016 + .../rest-api/class-wp-rest-response.php | 293 + wp-includes/rest-api/class-wp-rest-server.php | 1421 + .../class-wp-rest-attachments-controller.php | 1022 + .../class-wp-rest-autosaves-controller.php | 456 + ...lass-wp-rest-block-renderer-controller.php | 197 + .../class-wp-rest-blocks-controller.php | 93 + .../class-wp-rest-comments-controller.php | 1871 + .../endpoints/class-wp-rest-controller.php | 728 + ...class-wp-rest-post-statuses-controller.php | 370 + .../class-wp-rest-post-types-controller.php | 357 + .../class-wp-rest-posts-controller.php | 2804 + .../class-wp-rest-revisions-controller.php | 838 + .../class-wp-rest-search-controller.php | 383 + .../class-wp-rest-settings-controller.php | 352 + .../class-wp-rest-taxonomies-controller.php | 425 + .../class-wp-rest-terms-controller.php | 1116 + .../class-wp-rest-themes-controller.php | 523 + .../class-wp-rest-users-controller.php | 1570 + .../class-wp-rest-comment-meta-fields.php | 51 + .../fields/class-wp-rest-meta-fields.php | 598 + .../fields/class-wp-rest-post-meta-fields.php | 72 + .../fields/class-wp-rest-term-meta-fields.php | 70 + .../fields/class-wp-rest-user-meta-fields.php | 51 + .../class-wp-rest-post-search-handler.php | 206 + .../search/class-wp-rest-search-handler.php | 97 + wp-includes/revision.php | 788 + wp-includes/rewrite.php | 621 + wp-includes/rss-functions.php | 10 + wp-includes/rss.php | 954 + wp-includes/script-loader.php | 2569 + wp-includes/session.php | 12 + wp-includes/shortcodes.php | 671 + wp-includes/sodium_compat/LICENSE | 21 + wp-includes/sodium_compat/autoload.php | 59 + wp-includes/sodium_compat/composer.json | 63 + wp-includes/sodium_compat/lib/constants.php | 52 + wp-includes/sodium_compat/lib/namespaced.php | 48 + wp-includes/sodium_compat/lib/php72compat.php | 1354 + .../sodium_compat/lib/php72compat_const.php | 90 + .../sodium_compat/lib/sodium_compat.php | 826 + .../sodium_compat/namespaced/Compat.php | 7 + .../sodium_compat/namespaced/Core/BLAKE2b.php | 7 + .../namespaced/Core/ChaCha20.php | 7 + .../namespaced/Core/ChaCha20/Ctx.php | 7 + .../namespaced/Core/ChaCha20/IetfCtx.php | 7 + .../namespaced/Core/Curve25519.php | 7 + .../namespaced/Core/Curve25519/Fe.php | 7 + .../namespaced/Core/Curve25519/Ge/Cached.php | 7 + .../namespaced/Core/Curve25519/Ge/P1p1.php | 7 + .../namespaced/Core/Curve25519/Ge/P2.php | 7 + .../namespaced/Core/Curve25519/Ge/P3.php | 7 + .../namespaced/Core/Curve25519/Ge/Precomp.php | 7 + .../namespaced/Core/Curve25519/H.php | 7 + .../sodium_compat/namespaced/Core/Ed25519.php | 7 + .../namespaced/Core/HChaCha20.php | 7 + .../namespaced/Core/HSalsa20.php | 7 + .../namespaced/Core/Poly1305.php | 7 + .../namespaced/Core/Poly1305/State.php | 7 + .../sodium_compat/namespaced/Core/Salsa20.php | 7 + .../sodium_compat/namespaced/Core/SipHash.php | 7 + .../sodium_compat/namespaced/Core/Util.php | 7 + .../sodium_compat/namespaced/Core/X25519.php | 7 + .../namespaced/Core/XChaCha20.php | 7 + .../namespaced/Core/Xsalsa20.php | 7 + .../sodium_compat/namespaced/Crypto.php | 7 + wp-includes/sodium_compat/namespaced/File.php | 7 + wp-includes/sodium_compat/src/Compat.php | 3560 ++ .../sodium_compat/src/Core/BLAKE2b.php | 789 + .../sodium_compat/src/Core/Base64/Common.php | 213 + .../src/Core/Base64/Original.php | 248 + .../sodium_compat/src/Core/Base64/UrlSafe.php | 247 + .../sodium_compat/src/Core/ChaCha20.php | 395 + .../sodium_compat/src/Core/ChaCha20/Ctx.php | 119 + .../src/Core/ChaCha20/IetfCtx.php | 38 + .../sodium_compat/src/Core/Curve25519.php | 3002 + .../sodium_compat/src/Core/Curve25519/Fe.php | 123 + .../src/Core/Curve25519/Ge/Cached.php | 65 + .../src/Core/Curve25519/Ge/P1p1.php | 64 + .../src/Core/Curve25519/Ge/P2.php | 54 + .../src/Core/Curve25519/Ge/P3.php | 65 + .../src/Core/Curve25519/Ge/Precomp.php | 54 + .../sodium_compat/src/Core/Curve25519/H.php | 1467 + .../src/Core/Curve25519/README.md | 3 + .../sodium_compat/src/Core/Ed25519.php | 480 + .../sodium_compat/src/Core/HChaCha20.php | 108 + .../sodium_compat/src/Core/HSalsa20.php | 96 + .../sodium_compat/src/Core/Poly1305.php | 63 + .../sodium_compat/src/Core/Poly1305/State.php | 445 + .../sodium_compat/src/Core/Salsa20.php | 273 + .../src/Core/SecretStream/State.php | 163 + .../sodium_compat/src/Core/SipHash.php | 305 + wp-includes/sodium_compat/src/Core/Util.php | 921 + wp-includes/sodium_compat/src/Core/X25519.php | 327 + .../sodium_compat/src/Core/XChaCha20.php | 117 + .../sodium_compat/src/Core/XSalsa20.php | 57 + .../sodium_compat/src/Core32/BLAKE2b.php | 718 + .../sodium_compat/src/Core32/ChaCha20.php | 400 + .../sodium_compat/src/Core32/ChaCha20/Ctx.php | 126 + .../src/Core32/ChaCha20/IetfCtx.php | 39 + .../sodium_compat/src/Core32/Curve25519.php | 3196 + .../src/Core32/Curve25519/Fe.php | 185 + .../src/Core32/Curve25519/Ge/Cached.php | 65 + .../src/Core32/Curve25519/Ge/P1p1.php | 67 + .../src/Core32/Curve25519/Ge/P2.php | 54 + .../src/Core32/Curve25519/Ge/P3.php | 65 + .../src/Core32/Curve25519/Ge/Precomp.php | 56 + .../sodium_compat/src/Core32/Curve25519/H.php | 1467 + .../src/Core32/Curve25519/README.md | 3 + .../sodium_compat/src/Core32/Ed25519.php | 481 + .../sodium_compat/src/Core32/HChaCha20.php | 127 + .../sodium_compat/src/Core32/HSalsa20.php | 141 + .../sodium_compat/src/Core32/Int32.php | 871 + .../sodium_compat/src/Core32/Int64.php | 1066 + .../sodium_compat/src/Core32/Poly1305.php | 63 + .../src/Core32/Poly1305/State.php | 451 + .../sodium_compat/src/Core32/Salsa20.php | 306 + .../src/Core32/SecretStream/State.php | 163 + .../sodium_compat/src/Core32/SipHash.php | 238 + wp-includes/sodium_compat/src/Core32/Util.php | 13 + .../sodium_compat/src/Core32/X25519.php | 345 + .../sodium_compat/src/Core32/XChaCha20.php | 64 + .../sodium_compat/src/Core32/XSalsa20.php | 57 + wp-includes/sodium_compat/src/Crypto.php | 1655 + wp-includes/sodium_compat/src/Crypto32.php | 1654 + wp-includes/sodium_compat/src/File.php | 1561 + .../sodium_compat/src/PHP52/SplFixedArray.php | 187 + .../sodium_compat/src/SodiumException.php | 11 + wp-includes/spl-autoload-compat.php | 14 + wp-includes/taxonomy.php | 4649 ++ wp-includes/template-loader.php | 114 + wp-includes/template.php | 727 + wp-includes/theme-compat/comments.php | 77 + wp-includes/theme-compat/embed-404.php | 36 + wp-includes/theme-compat/embed-content.php | 127 + wp-includes/theme-compat/embed.php | 24 + wp-includes/theme-compat/footer-embed.php | 21 + wp-includes/theme-compat/footer.php | 40 + wp-includes/theme-compat/header-embed.php | 32 + wp-includes/theme-compat/header.php | 60 + wp-includes/theme-compat/sidebar.php | 149 + wp-includes/theme.php | 3380 + wp-includes/update.php | 836 + wp-includes/user.php | 3912 ++ wp-includes/vars.php | 169 + wp-includes/version.php | 46 + wp-includes/widgets.php | 1766 + .../widgets/class-wp-nav-menu-widget.php | 174 + .../widgets/class-wp-widget-archives.php | 208 + .../widgets/class-wp-widget-calendar.php | 102 + .../widgets/class-wp-widget-categories.php | 185 + .../widgets/class-wp-widget-custom-html.php | 338 + wp-includes/widgets/class-wp-widget-links.php | 182 + .../widgets/class-wp-widget-media-audio.php | 205 + .../widgets/class-wp-widget-media-gallery.php | 260 + .../widgets/class-wp-widget-media-image.php | 371 + .../widgets/class-wp-widget-media-video.php | 256 + wp-includes/widgets/class-wp-widget-media.php | 452 + wp-includes/widgets/class-wp-widget-meta.php | 119 + wp-includes/widgets/class-wp-widget-pages.php | 164 + .../class-wp-widget-recent-comments.php | 197 + .../widgets/class-wp-widget-recent-posts.php | 156 + wp-includes/widgets/class-wp-widget-rss.php | 144 + .../widgets/class-wp-widget-search.php | 91 + .../widgets/class-wp-widget-tag-cloud.php | 203 + wp-includes/widgets/class-wp-widget-text.php | 569 + wp-includes/wlwmanifest.xml | 43 + wp-includes/wp-db.php | 3623 ++ wp-includes/wp-diff.php | 21 + wp-links-opml.php | 97 + wp-load.php | 93 + wp-login.php | 1501 + wp-mail.php | 264 + wp-settings.php | 562 + wp-signup.php | 1014 + wp-trackback.php | 152 + xmlrpc.php | 104 + 1936 files changed, 1008499 insertions(+), 344 deletions(-) create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 composer.json create mode 100644 content/index.php create mode 100644 content/languages/admin-fr_FR.mo create mode 100644 content/languages/admin-fr_FR.po create mode 100644 content/languages/admin-network-fr_FR.mo create mode 100644 content/languages/admin-network-fr_FR.po create mode 100644 content/languages/continents-cities-fr_FR.mo create mode 100644 content/languages/continents-cities-fr_FR.po create mode 100644 content/languages/fr_FR-0ce75ad2f775d1cac9696967d484808c.json create mode 100644 content/languages/fr_FR-1a0cd6a7128913b15c1a10dd68951869.json create mode 100644 content/languages/fr_FR-1bba9045bb07c89671c88a3f328548e8.json create mode 100644 content/languages/fr_FR-28b3c3d595952907e08d98287077426c.json create mode 100644 content/languages/fr_FR-2c5d274ea625dd91556554ad82901529.json create mode 100644 content/languages/fr_FR-4a38fe1c0c45989e44682ba6109d9f46.json create mode 100644 content/languages/fr_FR-68f2cec7514bf8563c723a4d675fcfe6.json create mode 100644 content/languages/fr_FR-7f13c36c641b114bf18cd0bcc9ecc7e0.json create mode 100644 content/languages/fr_FR-803bf1ce2131e13efc590c1bc47851fc.json create mode 100644 content/languages/fr_FR-81c889563f09dd13de1701135dc62941.json create mode 100644 content/languages/fr_FR-8860e58c20c6a2ab5876a0f07be43bd9.json create mode 100644 content/languages/fr_FR-947c76bb5095da30e16668eec15406b2.json create mode 100644 content/languages/fr_FR-a25d1cc7bf7ca0b4e114f6bea64943f4.json create mode 100644 content/languages/fr_FR-bf0f094965d3d4a95b47babcb35fc136.json create mode 100644 content/languages/fr_FR-daeb084aab42199d26393a56c3465bc0.json create mode 100644 content/languages/fr_FR-e2791ba830489d23043be8650a22a22b.json create mode 100644 content/languages/fr_FR-f8f49d9fc4a9cf7d78ec99285417bd9c.json create mode 100644 content/languages/fr_FR.mo create mode 100644 content/languages/fr_FR.po create mode 100644 content/languages/plugins/akismet-fr_FR.mo create mode 100644 content/languages/plugins/akismet-fr_FR.po create mode 100644 content/languages/themes/twentynineteen-fr_FR.mo create mode 100644 content/languages/themes/twentynineteen-fr_FR.po create mode 100644 content/languages/themes/twentyseventeen-fr_FR.mo create mode 100644 content/languages/themes/twentyseventeen-fr_FR.po create mode 100644 content/languages/themes/twentysixteen-fr_FR.mo create mode 100644 content/languages/themes/twentysixteen-fr_FR.po create mode 100644 content/languages/themes/twentytwenty-fr_FR.mo create mode 100644 content/languages/themes/twentytwenty-fr_FR.po create mode 100644 content/plugins/akismet/.htaccess create mode 100644 content/plugins/akismet/LICENSE.txt create mode 100644 content/plugins/akismet/_inc/akismet.css create mode 100644 content/plugins/akismet/_inc/akismet.js create mode 100644 content/plugins/akismet/_inc/form.js create mode 100644 content/plugins/akismet/_inc/img/logo-full-2x.png create mode 100644 content/plugins/akismet/akismet.php create mode 100644 content/plugins/akismet/changelog.txt create mode 100644 content/plugins/akismet/class.akismet-admin.php create mode 100644 content/plugins/akismet/class.akismet-cli.php create mode 100644 content/plugins/akismet/class.akismet-rest-api.php create mode 100644 content/plugins/akismet/class.akismet-widget.php create mode 100644 content/plugins/akismet/class.akismet.php create mode 100644 content/plugins/akismet/index.php create mode 100644 content/plugins/akismet/readme.txt create mode 100644 content/plugins/akismet/views/activate.php create mode 100644 content/plugins/akismet/views/config.php create mode 100644 content/plugins/akismet/views/connect-jp.php create mode 100644 content/plugins/akismet/views/enter.php create mode 100644 content/plugins/akismet/views/get.php create mode 100644 content/plugins/akismet/views/notice.php create mode 100644 content/plugins/akismet/views/predefined.php create mode 100644 content/plugins/akismet/views/setup.php create mode 100644 content/plugins/akismet/views/start.php create mode 100644 content/plugins/akismet/views/stats.php create mode 100644 content/plugins/akismet/views/title.php create mode 100644 content/plugins/akismet/wrapper.php create mode 100644 content/plugins/hello.php create mode 100644 content/plugins/index.php create mode 100644 content/themes/index.php create mode 100644 content/themes/twentynineteen/404.php create mode 100644 content/themes/twentynineteen/archive.php create mode 100644 content/themes/twentynineteen/classes/class-twentynineteen-svg-icons.php create mode 100644 content/themes/twentynineteen/classes/class-twentynineteen-walker-comment.php create mode 100644 content/themes/twentynineteen/comments.php create mode 100644 content/themes/twentynineteen/fonts/NonBreakingSpaceOverride.woff create mode 100644 content/themes/twentynineteen/fonts/NonBreakingSpaceOverride.woff2 create mode 100644 content/themes/twentynineteen/footer.php create mode 100644 content/themes/twentynineteen/functions.php create mode 100644 content/themes/twentynineteen/header.php create mode 100644 content/themes/twentynineteen/image.php create mode 100644 content/themes/twentynineteen/inc/back-compat.php create mode 100644 content/themes/twentynineteen/inc/color-patterns.php create mode 100644 content/themes/twentynineteen/inc/customizer.php create mode 100644 content/themes/twentynineteen/inc/helper-functions.php create mode 100644 content/themes/twentynineteen/inc/icon-functions.php create mode 100644 content/themes/twentynineteen/inc/template-functions.php create mode 100644 content/themes/twentynineteen/inc/template-tags.php create mode 100644 content/themes/twentynineteen/index.php create mode 100644 content/themes/twentynineteen/js/customize-controls.js create mode 100644 content/themes/twentynineteen/js/customize-preview.js create mode 100644 content/themes/twentynineteen/js/priority-menu.js create mode 100644 content/themes/twentynineteen/js/skip-link-focus-fix.js create mode 100644 content/themes/twentynineteen/js/touch-keyboard-navigation.js create mode 100644 content/themes/twentynineteen/package-lock.json create mode 100644 content/themes/twentynineteen/package.json create mode 100644 content/themes/twentynineteen/page.php create mode 100644 content/themes/twentynineteen/postcss.config.js create mode 100644 content/themes/twentynineteen/print.css create mode 100644 content/themes/twentynineteen/print.scss create mode 100644 content/themes/twentynineteen/readme.txt create mode 100644 content/themes/twentynineteen/sass/_normalize.scss create mode 100644 content/themes/twentynineteen/sass/blocks/_blocks.scss create mode 100644 content/themes/twentynineteen/sass/elements/_elements.scss create mode 100644 content/themes/twentynineteen/sass/elements/_lists.scss create mode 100644 content/themes/twentynineteen/sass/elements/_tables.scss create mode 100644 content/themes/twentynineteen/sass/forms/_buttons.scss create mode 100644 content/themes/twentynineteen/sass/forms/_fields.scss create mode 100644 content/themes/twentynineteen/sass/forms/_forms.scss create mode 100644 content/themes/twentynineteen/sass/layout/_layout.scss create mode 100644 content/themes/twentynineteen/sass/media/_captions.scss create mode 100644 content/themes/twentynineteen/sass/media/_galleries.scss create mode 100644 content/themes/twentynineteen/sass/media/_media.scss create mode 100644 content/themes/twentynineteen/sass/mixins/_mixins-master.scss create mode 100644 content/themes/twentynineteen/sass/mixins/_utilities.scss create mode 100644 content/themes/twentynineteen/sass/modules/_accessibility.scss create mode 100644 content/themes/twentynineteen/sass/modules/_alignments.scss create mode 100644 content/themes/twentynineteen/sass/modules/_clearings.scss create mode 100644 content/themes/twentynineteen/sass/navigation/_links.scss create mode 100644 content/themes/twentynineteen/sass/navigation/_menu-footer-navigation.scss create mode 100644 content/themes/twentynineteen/sass/navigation/_menu-main-navigation.scss create mode 100644 content/themes/twentynineteen/sass/navigation/_menu-social-navigation.scss create mode 100644 content/themes/twentynineteen/sass/navigation/_navigation.scss create mode 100644 content/themes/twentynineteen/sass/navigation/_next-previous.scss create mode 100644 content/themes/twentynineteen/sass/site/_site.scss create mode 100644 content/themes/twentynineteen/sass/site/footer/_site-footer.scss create mode 100644 content/themes/twentynineteen/sass/site/header/_site-featured-image.scss create mode 100644 content/themes/twentynineteen/sass/site/header/_site-header.scss create mode 100644 content/themes/twentynineteen/sass/site/primary/_archives.scss create mode 100644 content/themes/twentynineteen/sass/site/primary/_comments.scss create mode 100644 content/themes/twentynineteen/sass/site/primary/_posts-and-pages.scss create mode 100644 content/themes/twentynineteen/sass/site/secondary/_widgets.scss create mode 100644 content/themes/twentynineteen/sass/typography/_copy.scss create mode 100644 content/themes/twentynineteen/sass/typography/_headings.scss create mode 100644 content/themes/twentynineteen/sass/typography/_typography.scss create mode 100644 content/themes/twentynineteen/sass/variables-site/_colors.scss create mode 100644 content/themes/twentynineteen/sass/variables-site/_columns.scss create mode 100644 content/themes/twentynineteen/sass/variables-site/_fonts.scss create mode 100644 content/themes/twentynineteen/sass/variables-site/_structure.scss create mode 100644 content/themes/twentynineteen/sass/variables-site/_transitions.scss create mode 100644 content/themes/twentynineteen/sass/variables-site/_variables-site.scss create mode 100644 content/themes/twentynineteen/screenshot.png create mode 100644 content/themes/twentynineteen/search.php create mode 100644 content/themes/twentynineteen/single.php create mode 100644 content/themes/twentynineteen/style-editor-customizer.css create mode 100644 content/themes/twentynineteen/style-editor-customizer.scss create mode 100644 content/themes/twentynineteen/style-editor.css create mode 100644 content/themes/twentynineteen/style-editor.scss create mode 100644 content/themes/twentynineteen/style-rtl.css create mode 100644 content/themes/twentynineteen/style.css create mode 100644 content/themes/twentynineteen/style.scss create mode 100644 content/themes/twentynineteen/template-parts/content/content-excerpt.php create mode 100644 content/themes/twentynineteen/template-parts/content/content-none.php create mode 100644 content/themes/twentynineteen/template-parts/content/content-page.php create mode 100644 content/themes/twentynineteen/template-parts/content/content-single.php create mode 100644 content/themes/twentynineteen/template-parts/content/content.php create mode 100644 content/themes/twentynineteen/template-parts/footer/footer-widgets.php create mode 100644 content/themes/twentynineteen/template-parts/header/entry-header.php create mode 100644 content/themes/twentynineteen/template-parts/header/site-branding.php create mode 100644 content/themes/twentynineteen/template-parts/post/author-bio.php create mode 100644 content/themes/twentynineteen/template-parts/post/discussion-meta.php create mode 100644 content/themes/twentyseventeen/404.php create mode 100644 content/themes/twentyseventeen/archive.php create mode 100644 content/themes/twentyseventeen/assets/css/blocks.css create mode 100644 content/themes/twentyseventeen/assets/css/colors-dark.css create mode 100644 content/themes/twentyseventeen/assets/css/editor-blocks.css create mode 100644 content/themes/twentyseventeen/assets/css/editor-style.css create mode 100644 content/themes/twentyseventeen/assets/css/ie8.css create mode 100644 content/themes/twentyseventeen/assets/css/ie9.css create mode 100644 content/themes/twentyseventeen/assets/images/coffee.jpg create mode 100644 content/themes/twentyseventeen/assets/images/espresso.jpg create mode 100644 content/themes/twentyseventeen/assets/images/header.jpg create mode 100644 content/themes/twentyseventeen/assets/images/sandwich.jpg create mode 100644 content/themes/twentyseventeen/assets/images/svg-icons.svg create mode 100644 content/themes/twentyseventeen/assets/js/customize-controls.js create mode 100644 content/themes/twentyseventeen/assets/js/customize-preview.js create mode 100644 content/themes/twentyseventeen/assets/js/global.js create mode 100644 content/themes/twentyseventeen/assets/js/html5.js create mode 100644 content/themes/twentyseventeen/assets/js/jquery.scrollTo.js create mode 100644 content/themes/twentyseventeen/assets/js/navigation.js create mode 100644 content/themes/twentyseventeen/assets/js/skip-link-focus-fix.js create mode 100644 content/themes/twentyseventeen/comments.php create mode 100644 content/themes/twentyseventeen/footer.php create mode 100644 content/themes/twentyseventeen/front-page.php create mode 100644 content/themes/twentyseventeen/functions.php create mode 100644 content/themes/twentyseventeen/header.php create mode 100644 content/themes/twentyseventeen/inc/back-compat.php create mode 100644 content/themes/twentyseventeen/inc/color-patterns.php create mode 100644 content/themes/twentyseventeen/inc/custom-header.php create mode 100644 content/themes/twentyseventeen/inc/customizer.php create mode 100644 content/themes/twentyseventeen/inc/icon-functions.php create mode 100644 content/themes/twentyseventeen/inc/template-functions.php create mode 100644 content/themes/twentyseventeen/inc/template-tags.php create mode 100644 content/themes/twentyseventeen/index.php create mode 100644 content/themes/twentyseventeen/page.php create mode 100644 content/themes/twentyseventeen/readme.txt create mode 100644 content/themes/twentyseventeen/rtl.css create mode 100644 content/themes/twentyseventeen/screenshot.png create mode 100644 content/themes/twentyseventeen/search.php create mode 100644 content/themes/twentyseventeen/searchform.php create mode 100644 content/themes/twentyseventeen/sidebar.php create mode 100644 content/themes/twentyseventeen/single.php create mode 100644 content/themes/twentyseventeen/style.css create mode 100644 content/themes/twentyseventeen/template-parts/footer/footer-widgets.php create mode 100644 content/themes/twentyseventeen/template-parts/footer/site-info.php create mode 100644 content/themes/twentyseventeen/template-parts/header/header-image.php create mode 100644 content/themes/twentyseventeen/template-parts/header/site-branding.php create mode 100644 content/themes/twentyseventeen/template-parts/navigation/navigation-top.php create mode 100644 content/themes/twentyseventeen/template-parts/page/content-front-page-panels.php create mode 100644 content/themes/twentyseventeen/template-parts/page/content-front-page.php create mode 100644 content/themes/twentyseventeen/template-parts/page/content-page.php create mode 100644 content/themes/twentyseventeen/template-parts/post/content-audio.php create mode 100644 content/themes/twentyseventeen/template-parts/post/content-excerpt.php create mode 100644 content/themes/twentyseventeen/template-parts/post/content-gallery.php create mode 100644 content/themes/twentyseventeen/template-parts/post/content-image.php create mode 100644 content/themes/twentyseventeen/template-parts/post/content-none.php create mode 100644 content/themes/twentyseventeen/template-parts/post/content-video.php create mode 100644 content/themes/twentyseventeen/template-parts/post/content.php create mode 100644 content/themes/twentytwenty/.stylelintrc.json create mode 100644 content/themes/twentytwenty/404.php create mode 100644 content/themes/twentytwenty/assets/css/editor-style-block-rtl.css create mode 100644 content/themes/twentytwenty/assets/css/editor-style-block.css create mode 100644 content/themes/twentytwenty/assets/css/editor-style-classic-rtl.css create mode 100644 content/themes/twentytwenty/assets/css/editor-style-classic.css create mode 100644 content/themes/twentytwenty/assets/fonts/inter/Inter-italic-var.woff2 create mode 100644 content/themes/twentytwenty/assets/fonts/inter/Inter-upright-var.woff2 create mode 100644 content/themes/twentytwenty/assets/images/2020-landscape-1.png create mode 100644 content/themes/twentytwenty/assets/images/2020-landscape-2.png create mode 100644 content/themes/twentytwenty/assets/images/2020-square-1.png create mode 100644 content/themes/twentytwenty/assets/images/2020-square-2.png create mode 100644 content/themes/twentytwenty/assets/images/2020-three-quarters-1.png create mode 100644 content/themes/twentytwenty/assets/images/2020-three-quarters-2.png create mode 100644 content/themes/twentytwenty/assets/images/2020-three-quarters-3.png create mode 100644 content/themes/twentytwenty/assets/images/2020-three-quarters-4.png create mode 100644 content/themes/twentytwenty/assets/js/color-calculations.js create mode 100644 content/themes/twentytwenty/assets/js/customize-controls.js create mode 100644 content/themes/twentytwenty/assets/js/customize-preview.js create mode 100644 content/themes/twentytwenty/assets/js/customize.js create mode 100644 content/themes/twentytwenty/assets/js/editor-script-block.js create mode 100644 content/themes/twentytwenty/assets/js/index.js create mode 100644 content/themes/twentytwenty/assets/js/skip-link-focus-fix.js create mode 100644 content/themes/twentytwenty/classes/class-twentytwenty-customize.php create mode 100644 content/themes/twentytwenty/classes/class-twentytwenty-non-latin-languages.php create mode 100644 content/themes/twentytwenty/classes/class-twentytwenty-script-loader.php create mode 100644 content/themes/twentytwenty/classes/class-twentytwenty-separator-control.php create mode 100644 content/themes/twentytwenty/classes/class-twentytwenty-svg-icons.php create mode 100644 content/themes/twentytwenty/classes/class-twentytwenty-walker-comment.php create mode 100644 content/themes/twentytwenty/classes/class-twentytwenty-walker-page.php create mode 100644 content/themes/twentytwenty/comments.php create mode 100644 content/themes/twentytwenty/footer.php create mode 100644 content/themes/twentytwenty/functions.php create mode 100644 content/themes/twentytwenty/header.php create mode 100644 content/themes/twentytwenty/inc/custom-css.php create mode 100644 content/themes/twentytwenty/inc/starter-content.php create mode 100644 content/themes/twentytwenty/inc/svg-icons.php create mode 100644 content/themes/twentytwenty/inc/template-tags.php create mode 100644 content/themes/twentytwenty/index.php create mode 100644 content/themes/twentytwenty/package-lock.json create mode 100644 content/themes/twentytwenty/package.json create mode 100644 content/themes/twentytwenty/print.css create mode 100644 content/themes/twentytwenty/readme.txt create mode 100644 content/themes/twentytwenty/screenshot.png create mode 100644 content/themes/twentytwenty/searchform.php create mode 100644 content/themes/twentytwenty/singular.php create mode 100644 content/themes/twentytwenty/style-rtl.css create mode 100644 content/themes/twentytwenty/style.css create mode 100644 content/themes/twentytwenty/template-parts/content-cover.php create mode 100644 content/themes/twentytwenty/template-parts/content.php create mode 100644 content/themes/twentytwenty/template-parts/entry-author-bio.php create mode 100644 content/themes/twentytwenty/template-parts/entry-header.php create mode 100644 content/themes/twentytwenty/template-parts/featured-image.php create mode 100644 content/themes/twentytwenty/template-parts/footer-menus-widgets.php create mode 100644 content/themes/twentytwenty/template-parts/modal-menu.php create mode 100644 content/themes/twentytwenty/template-parts/modal-search.php create mode 100644 content/themes/twentytwenty/template-parts/navigation.php create mode 100644 content/themes/twentytwenty/template-parts/pagination.php create mode 100644 content/themes/twentytwenty/templates/template-cover.php create mode 100644 content/themes/twentytwenty/templates/template-full-width.php create mode 100644 index.php delete mode 100644 web/assets/bootstrap/css/bootstrap.min.css delete mode 100644 web/assets/bootstrap/js/bootstrap.min.js delete mode 100644 web/assets/css/styles.css delete mode 100644 web/assets/img/Regalette---Logo.png delete mode 100644 web/assets/img/Regalette---LogoFB.png delete mode 100644 web/assets/img/bio-image.png delete mode 100644 web/assets/img/fondMotif.jpg delete mode 100644 web/assets/img/glutenless.png delete mode 100644 web/assets/img/regalette.png delete mode 100644 web/assets/img/regalette2016.png delete mode 100644 web/assets/img/version2-les-garnies.png delete mode 100644 web/assets/img/version2images-bios.png delete mode 100644 web/assets/img/version2images-sans-glutent.png delete mode 100644 web/assets/img/version2images-snacking.png delete mode 100644 web/assets/js/jquery.min.js delete mode 100644 web/index.html create mode 100644 wp-activate.php create mode 100644 wp-admin/about.php create mode 100644 wp-admin/admin-ajax.php create mode 100644 wp-admin/admin-footer.php create mode 100644 wp-admin/admin-functions.php create mode 100644 wp-admin/admin-header.php create mode 100644 wp-admin/admin-post.php create mode 100644 wp-admin/admin.php create mode 100644 wp-admin/async-upload.php create mode 100644 wp-admin/comment.php create mode 100644 wp-admin/credits.php create mode 100644 wp-admin/css/about-rtl.css create mode 100644 wp-admin/css/about-rtl.min.css create mode 100644 wp-admin/css/about.css create mode 100644 wp-admin/css/about.min.css create mode 100644 wp-admin/css/admin-menu-rtl.css create mode 100644 wp-admin/css/admin-menu-rtl.min.css create mode 100644 wp-admin/css/admin-menu.css create mode 100644 wp-admin/css/admin-menu.min.css create mode 100644 wp-admin/css/code-editor-rtl.css create mode 100644 wp-admin/css/code-editor-rtl.min.css create mode 100644 wp-admin/css/code-editor.css create mode 100644 wp-admin/css/code-editor.min.css create mode 100644 wp-admin/css/color-picker-rtl.css create mode 100644 wp-admin/css/color-picker-rtl.min.css create mode 100644 wp-admin/css/color-picker.css create mode 100644 wp-admin/css/color-picker.min.css create mode 100644 wp-admin/css/colors/_admin.scss create mode 100644 wp-admin/css/colors/_mixins.scss create mode 100644 wp-admin/css/colors/_variables.scss create mode 100644 wp-admin/css/colors/blue/colors-rtl.css create mode 100644 wp-admin/css/colors/blue/colors-rtl.min.css create mode 100644 wp-admin/css/colors/blue/colors.css create mode 100644 wp-admin/css/colors/blue/colors.min.css create mode 100644 wp-admin/css/colors/blue/colors.scss create mode 100644 wp-admin/css/colors/coffee/colors-rtl.css create mode 100644 wp-admin/css/colors/coffee/colors-rtl.min.css create mode 100644 wp-admin/css/colors/coffee/colors.css create mode 100644 wp-admin/css/colors/coffee/colors.min.css create mode 100644 wp-admin/css/colors/coffee/colors.scss create mode 100644 wp-admin/css/colors/ectoplasm/colors-rtl.css create mode 100644 wp-admin/css/colors/ectoplasm/colors-rtl.min.css create mode 100644 wp-admin/css/colors/ectoplasm/colors.css create mode 100644 wp-admin/css/colors/ectoplasm/colors.min.css create mode 100644 wp-admin/css/colors/ectoplasm/colors.scss create mode 100644 wp-admin/css/colors/light/colors-rtl.css create mode 100644 wp-admin/css/colors/light/colors-rtl.min.css create mode 100644 wp-admin/css/colors/light/colors.css create mode 100644 wp-admin/css/colors/light/colors.min.css create mode 100644 wp-admin/css/colors/light/colors.scss create mode 100644 wp-admin/css/colors/midnight/colors-rtl.css create mode 100644 wp-admin/css/colors/midnight/colors-rtl.min.css create mode 100644 wp-admin/css/colors/midnight/colors.css create mode 100644 wp-admin/css/colors/midnight/colors.min.css create mode 100644 wp-admin/css/colors/midnight/colors.scss create mode 100644 wp-admin/css/colors/ocean/colors-rtl.css create mode 100644 wp-admin/css/colors/ocean/colors-rtl.min.css create mode 100644 wp-admin/css/colors/ocean/colors.css create mode 100644 wp-admin/css/colors/ocean/colors.min.css create mode 100644 wp-admin/css/colors/ocean/colors.scss create mode 100644 wp-admin/css/colors/sunrise/colors-rtl.css create mode 100644 wp-admin/css/colors/sunrise/colors-rtl.min.css create mode 100644 wp-admin/css/colors/sunrise/colors.css create mode 100644 wp-admin/css/colors/sunrise/colors.min.css create mode 100644 wp-admin/css/colors/sunrise/colors.scss create mode 100644 wp-admin/css/common-rtl.css create mode 100644 wp-admin/css/common-rtl.min.css create mode 100644 wp-admin/css/common.css create mode 100644 wp-admin/css/common.min.css create mode 100644 wp-admin/css/customize-controls-rtl.css create mode 100644 wp-admin/css/customize-controls-rtl.min.css create mode 100644 wp-admin/css/customize-controls.css create mode 100644 wp-admin/css/customize-controls.min.css create mode 100644 wp-admin/css/customize-nav-menus-rtl.css create mode 100644 wp-admin/css/customize-nav-menus-rtl.min.css create mode 100644 wp-admin/css/customize-nav-menus.css create mode 100644 wp-admin/css/customize-nav-menus.min.css create mode 100644 wp-admin/css/customize-widgets-rtl.css create mode 100644 wp-admin/css/customize-widgets-rtl.min.css create mode 100644 wp-admin/css/customize-widgets.css create mode 100644 wp-admin/css/customize-widgets.min.css create mode 100644 wp-admin/css/dashboard-rtl.css create mode 100644 wp-admin/css/dashboard-rtl.min.css create mode 100644 wp-admin/css/dashboard.css create mode 100644 wp-admin/css/dashboard.min.css create mode 100644 wp-admin/css/deprecated-media-rtl.css create mode 100644 wp-admin/css/deprecated-media-rtl.min.css create mode 100644 wp-admin/css/deprecated-media.css create mode 100644 wp-admin/css/deprecated-media.min.css create mode 100644 wp-admin/css/edit-rtl.css create mode 100644 wp-admin/css/edit-rtl.min.css create mode 100644 wp-admin/css/edit.css create mode 100644 wp-admin/css/edit.min.css create mode 100644 wp-admin/css/farbtastic-rtl.css create mode 100644 wp-admin/css/farbtastic-rtl.min.css create mode 100644 wp-admin/css/farbtastic.css create mode 100644 wp-admin/css/farbtastic.min.css create mode 100644 wp-admin/css/forms-rtl.css create mode 100644 wp-admin/css/forms-rtl.min.css create mode 100644 wp-admin/css/forms.css create mode 100644 wp-admin/css/forms.min.css create mode 100644 wp-admin/css/ie-rtl.css create mode 100644 wp-admin/css/ie-rtl.min.css create mode 100644 wp-admin/css/ie.css create mode 100644 wp-admin/css/ie.min.css create mode 100644 wp-admin/css/install-rtl.css create mode 100644 wp-admin/css/install-rtl.min.css create mode 100644 wp-admin/css/install.css create mode 100644 wp-admin/css/install.min.css create mode 100644 wp-admin/css/l10n-rtl.css create mode 100644 wp-admin/css/l10n-rtl.min.css create mode 100644 wp-admin/css/l10n.css create mode 100644 wp-admin/css/l10n.min.css create mode 100644 wp-admin/css/list-tables-rtl.css create mode 100644 wp-admin/css/list-tables-rtl.min.css create mode 100644 wp-admin/css/list-tables.css create mode 100644 wp-admin/css/list-tables.min.css create mode 100644 wp-admin/css/login-rtl.css create mode 100644 wp-admin/css/login-rtl.min.css create mode 100644 wp-admin/css/login.css create mode 100644 wp-admin/css/login.min.css create mode 100644 wp-admin/css/media-rtl.css create mode 100644 wp-admin/css/media-rtl.min.css create mode 100644 wp-admin/css/media.css create mode 100644 wp-admin/css/media.min.css create mode 100644 wp-admin/css/nav-menus-rtl.css create mode 100644 wp-admin/css/nav-menus-rtl.min.css create mode 100644 wp-admin/css/nav-menus.css create mode 100644 wp-admin/css/nav-menus.min.css create mode 100644 wp-admin/css/revisions-rtl.css create mode 100644 wp-admin/css/revisions-rtl.min.css create mode 100644 wp-admin/css/revisions.css create mode 100644 wp-admin/css/revisions.min.css create mode 100644 wp-admin/css/site-health-rtl.css create mode 100644 wp-admin/css/site-health-rtl.min.css create mode 100644 wp-admin/css/site-health.css create mode 100644 wp-admin/css/site-health.min.css create mode 100644 wp-admin/css/site-icon-rtl.css create mode 100644 wp-admin/css/site-icon-rtl.min.css create mode 100644 wp-admin/css/site-icon.css create mode 100644 wp-admin/css/site-icon.min.css create mode 100644 wp-admin/css/themes-rtl.css create mode 100644 wp-admin/css/themes-rtl.min.css create mode 100644 wp-admin/css/themes.css create mode 100644 wp-admin/css/themes.min.css create mode 100644 wp-admin/css/widgets-rtl.css create mode 100644 wp-admin/css/widgets-rtl.min.css create mode 100644 wp-admin/css/widgets.css create mode 100644 wp-admin/css/widgets.min.css create mode 100644 wp-admin/css/wp-admin-rtl.css create mode 100644 wp-admin/css/wp-admin-rtl.min.css create mode 100644 wp-admin/css/wp-admin.css create mode 100644 wp-admin/css/wp-admin.min.css create mode 100644 wp-admin/custom-background.php create mode 100644 wp-admin/custom-header.php create mode 100644 wp-admin/customize.php create mode 100644 wp-admin/edit-comments.php create mode 100644 wp-admin/edit-form-advanced.php create mode 100644 wp-admin/edit-form-blocks.php create mode 100644 wp-admin/edit-form-comment.php create mode 100644 wp-admin/edit-link-form.php create mode 100644 wp-admin/edit-tag-form.php create mode 100644 wp-admin/edit-tags.php create mode 100644 wp-admin/edit.php create mode 100644 wp-admin/erase-personal-data.php create mode 100644 wp-admin/export-personal-data.php create mode 100644 wp-admin/export.php create mode 100644 wp-admin/freedoms.php create mode 100644 wp-admin/images/align-center-2x.png create mode 100644 wp-admin/images/align-center.png create mode 100644 wp-admin/images/align-left-2x.png create mode 100644 wp-admin/images/align-left.png create mode 100644 wp-admin/images/align-none-2x.png create mode 100644 wp-admin/images/align-none.png create mode 100644 wp-admin/images/align-right-2x.png create mode 100644 wp-admin/images/align-right.png create mode 100644 wp-admin/images/arrows-2x.png create mode 100644 wp-admin/images/arrows.png create mode 100644 wp-admin/images/browser-rtl.png create mode 100644 wp-admin/images/browser.png create mode 100644 wp-admin/images/bubble_bg-2x.gif create mode 100644 wp-admin/images/bubble_bg.gif create mode 100644 wp-admin/images/comment-grey-bubble-2x.png create mode 100644 wp-admin/images/comment-grey-bubble.png create mode 100644 wp-admin/images/date-button-2x.gif create mode 100644 wp-admin/images/date-button.gif create mode 100644 wp-admin/images/generic.png create mode 100644 wp-admin/images/icons32-2x.png create mode 100644 wp-admin/images/icons32-vs-2x.png create mode 100644 wp-admin/images/icons32-vs.png create mode 100644 wp-admin/images/icons32.png create mode 100644 wp-admin/images/imgedit-icons-2x.png create mode 100644 wp-admin/images/imgedit-icons.png create mode 100644 wp-admin/images/list-2x.png create mode 100644 wp-admin/images/list.png create mode 100644 wp-admin/images/loading.gif create mode 100644 wp-admin/images/marker.png create mode 100644 wp-admin/images/mask.png create mode 100644 wp-admin/images/media-button-2x.png create mode 100644 wp-admin/images/media-button-image.gif create mode 100644 wp-admin/images/media-button-music.gif create mode 100644 wp-admin/images/media-button-other.gif create mode 100644 wp-admin/images/media-button-video.gif create mode 100644 wp-admin/images/media-button.png create mode 100644 wp-admin/images/menu-2x.png create mode 100644 wp-admin/images/menu-vs-2x.png create mode 100644 wp-admin/images/menu-vs.png create mode 100644 wp-admin/images/menu.png create mode 100644 wp-admin/images/no.png create mode 100644 wp-admin/images/post-formats-vs.png create mode 100644 wp-admin/images/post-formats.png create mode 100644 wp-admin/images/post-formats32-vs.png create mode 100644 wp-admin/images/post-formats32.png create mode 100644 wp-admin/images/resize-2x.gif create mode 100644 wp-admin/images/resize-rtl-2x.gif create mode 100644 wp-admin/images/resize-rtl.gif create mode 100644 wp-admin/images/resize.gif create mode 100644 wp-admin/images/se.png create mode 100644 wp-admin/images/sort-2x.gif create mode 100644 wp-admin/images/sort.gif create mode 100644 wp-admin/images/spinner-2x.gif create mode 100644 wp-admin/images/spinner.gif create mode 100644 wp-admin/images/stars-2x.png create mode 100644 wp-admin/images/stars.png create mode 100644 wp-admin/images/w-logo-blue.png create mode 100644 wp-admin/images/w-logo-white.png create mode 100644 wp-admin/images/wheel.png create mode 100644 wp-admin/images/wordpress-logo-white.svg create mode 100644 wp-admin/images/wordpress-logo.png create mode 100644 wp-admin/images/wordpress-logo.svg create mode 100644 wp-admin/images/wpspin_light-2x.gif create mode 100644 wp-admin/images/wpspin_light.gif create mode 100644 wp-admin/images/xit-2x.gif create mode 100644 wp-admin/images/xit.gif create mode 100644 wp-admin/images/yes.png create mode 100644 wp-admin/import.php create mode 100644 wp-admin/includes/admin-filters.php create mode 100644 wp-admin/includes/admin.php create mode 100644 wp-admin/includes/ajax-actions.php create mode 100644 wp-admin/includes/bookmark.php create mode 100644 wp-admin/includes/class-automatic-upgrader-skin.php create mode 100644 wp-admin/includes/class-bulk-plugin-upgrader-skin.php create mode 100644 wp-admin/includes/class-bulk-theme-upgrader-skin.php create mode 100644 wp-admin/includes/class-bulk-upgrader-skin.php create mode 100644 wp-admin/includes/class-core-upgrader.php create mode 100644 wp-admin/includes/class-custom-background.php create mode 100644 wp-admin/includes/class-custom-image-header.php create mode 100644 wp-admin/includes/class-file-upload-upgrader.php create mode 100644 wp-admin/includes/class-ftp-pure.php create mode 100644 wp-admin/includes/class-ftp-sockets.php create mode 100644 wp-admin/includes/class-ftp.php create mode 100644 wp-admin/includes/class-language-pack-upgrader-skin.php create mode 100644 wp-admin/includes/class-language-pack-upgrader.php create mode 100644 wp-admin/includes/class-pclzip.php create mode 100644 wp-admin/includes/class-plugin-installer-skin.php create mode 100644 wp-admin/includes/class-plugin-upgrader-skin.php create mode 100644 wp-admin/includes/class-plugin-upgrader.php create mode 100644 wp-admin/includes/class-theme-installer-skin.php create mode 100644 wp-admin/includes/class-theme-upgrader-skin.php create mode 100644 wp-admin/includes/class-theme-upgrader.php create mode 100644 wp-admin/includes/class-walker-category-checklist.php create mode 100644 wp-admin/includes/class-walker-nav-menu-checklist.php create mode 100644 wp-admin/includes/class-walker-nav-menu-edit.php create mode 100644 wp-admin/includes/class-wp-ajax-upgrader-skin.php create mode 100644 wp-admin/includes/class-wp-automatic-updater.php create mode 100644 wp-admin/includes/class-wp-comments-list-table.php create mode 100644 wp-admin/includes/class-wp-community-events.php create mode 100644 wp-admin/includes/class-wp-debug-data.php create mode 100644 wp-admin/includes/class-wp-filesystem-base.php create mode 100644 wp-admin/includes/class-wp-filesystem-direct.php create mode 100644 wp-admin/includes/class-wp-filesystem-ftpext.php create mode 100644 wp-admin/includes/class-wp-filesystem-ftpsockets.php create mode 100644 wp-admin/includes/class-wp-filesystem-ssh2.php create mode 100644 wp-admin/includes/class-wp-importer.php create mode 100644 wp-admin/includes/class-wp-internal-pointers.php create mode 100644 wp-admin/includes/class-wp-links-list-table.php create mode 100644 wp-admin/includes/class-wp-list-table-compat.php create mode 100644 wp-admin/includes/class-wp-list-table.php create mode 100644 wp-admin/includes/class-wp-media-list-table.php create mode 100644 wp-admin/includes/class-wp-ms-sites-list-table.php create mode 100644 wp-admin/includes/class-wp-ms-themes-list-table.php create mode 100644 wp-admin/includes/class-wp-ms-users-list-table.php create mode 100644 wp-admin/includes/class-wp-plugin-install-list-table.php create mode 100644 wp-admin/includes/class-wp-plugins-list-table.php create mode 100644 wp-admin/includes/class-wp-post-comments-list-table.php create mode 100644 wp-admin/includes/class-wp-posts-list-table.php create mode 100644 wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php create mode 100644 wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php create mode 100644 wp-admin/includes/class-wp-privacy-policy-content.php create mode 100644 wp-admin/includes/class-wp-privacy-requests-table.php create mode 100644 wp-admin/includes/class-wp-screen.php create mode 100644 wp-admin/includes/class-wp-site-health-auto-updates.php create mode 100644 wp-admin/includes/class-wp-site-health.php create mode 100644 wp-admin/includes/class-wp-site-icon.php create mode 100644 wp-admin/includes/class-wp-terms-list-table.php create mode 100644 wp-admin/includes/class-wp-theme-install-list-table.php create mode 100644 wp-admin/includes/class-wp-themes-list-table.php create mode 100644 wp-admin/includes/class-wp-upgrader-skin.php create mode 100644 wp-admin/includes/class-wp-upgrader-skins.php create mode 100644 wp-admin/includes/class-wp-upgrader.php create mode 100644 wp-admin/includes/class-wp-users-list-table.php create mode 100644 wp-admin/includes/comment.php create mode 100644 wp-admin/includes/continents-cities.php create mode 100644 wp-admin/includes/credits.php create mode 100644 wp-admin/includes/dashboard.php create mode 100644 wp-admin/includes/deprecated.php create mode 100644 wp-admin/includes/edit-tag-messages.php create mode 100644 wp-admin/includes/export.php create mode 100644 wp-admin/includes/file.php create mode 100644 wp-admin/includes/image-edit.php create mode 100644 wp-admin/includes/image.php create mode 100644 wp-admin/includes/import.php create mode 100644 wp-admin/includes/list-table.php create mode 100644 wp-admin/includes/media.php create mode 100644 wp-admin/includes/menu.php create mode 100644 wp-admin/includes/meta-boxes.php create mode 100644 wp-admin/includes/misc.php create mode 100644 wp-admin/includes/ms-admin-filters.php create mode 100644 wp-admin/includes/ms-deprecated.php create mode 100644 wp-admin/includes/ms.php create mode 100644 wp-admin/includes/nav-menu.php create mode 100644 wp-admin/includes/network.php create mode 100644 wp-admin/includes/noop.php create mode 100644 wp-admin/includes/options.php create mode 100644 wp-admin/includes/plugin-install.php create mode 100644 wp-admin/includes/plugin.php create mode 100644 wp-admin/includes/post.php create mode 100644 wp-admin/includes/privacy-tools.php create mode 100644 wp-admin/includes/revision.php create mode 100644 wp-admin/includes/schema.php create mode 100644 wp-admin/includes/screen.php create mode 100644 wp-admin/includes/taxonomy.php create mode 100644 wp-admin/includes/template.php create mode 100644 wp-admin/includes/theme-install.php create mode 100644 wp-admin/includes/theme.php create mode 100644 wp-admin/includes/translation-install.php create mode 100644 wp-admin/includes/update-core.php create mode 100644 wp-admin/includes/update.php create mode 100644 wp-admin/includes/upgrade.php create mode 100644 wp-admin/includes/user.php create mode 100644 wp-admin/includes/widgets.php create mode 100644 wp-admin/index.php create mode 100644 wp-admin/install-helper.php create mode 100644 wp-admin/install.php create mode 100644 wp-admin/js/accordion.js create mode 100644 wp-admin/js/accordion.min.js create mode 100644 wp-admin/js/code-editor.js create mode 100644 wp-admin/js/code-editor.min.js create mode 100644 wp-admin/js/color-picker.js create mode 100644 wp-admin/js/color-picker.min.js create mode 100644 wp-admin/js/comment.js create mode 100644 wp-admin/js/comment.min.js create mode 100644 wp-admin/js/common.js create mode 100644 wp-admin/js/common.min.js create mode 100644 wp-admin/js/custom-background.js create mode 100644 wp-admin/js/custom-background.min.js create mode 100644 wp-admin/js/custom-header.js create mode 100644 wp-admin/js/customize-controls.js create mode 100644 wp-admin/js/customize-controls.min.js create mode 100644 wp-admin/js/customize-nav-menus.js create mode 100644 wp-admin/js/customize-nav-menus.min.js create mode 100644 wp-admin/js/customize-widgets.js create mode 100644 wp-admin/js/customize-widgets.min.js create mode 100644 wp-admin/js/dashboard.js create mode 100644 wp-admin/js/dashboard.min.js create mode 100644 wp-admin/js/edit-comments.js create mode 100644 wp-admin/js/edit-comments.min.js create mode 100644 wp-admin/js/editor-expand.js create mode 100644 wp-admin/js/editor-expand.min.js create mode 100644 wp-admin/js/editor.js create mode 100644 wp-admin/js/editor.min.js create mode 100644 wp-admin/js/farbtastic.js create mode 100644 wp-admin/js/gallery.js create mode 100644 wp-admin/js/gallery.min.js create mode 100644 wp-admin/js/image-edit.js create mode 100644 wp-admin/js/image-edit.min.js create mode 100644 wp-admin/js/inline-edit-post.js create mode 100644 wp-admin/js/inline-edit-post.min.js create mode 100644 wp-admin/js/inline-edit-tax.js create mode 100644 wp-admin/js/inline-edit-tax.min.js create mode 100644 wp-admin/js/iris.min.js create mode 100644 wp-admin/js/language-chooser.js create mode 100644 wp-admin/js/language-chooser.min.js create mode 100644 wp-admin/js/link.js create mode 100644 wp-admin/js/link.min.js create mode 100644 wp-admin/js/media-gallery.js create mode 100644 wp-admin/js/media-gallery.min.js create mode 100644 wp-admin/js/media-upload.js create mode 100644 wp-admin/js/media-upload.min.js create mode 100644 wp-admin/js/media.js create mode 100644 wp-admin/js/media.min.js create mode 100644 wp-admin/js/nav-menu.js create mode 100644 wp-admin/js/nav-menu.min.js create mode 100644 wp-admin/js/password-strength-meter.js create mode 100644 wp-admin/js/password-strength-meter.min.js create mode 100644 wp-admin/js/plugin-install.js create mode 100644 wp-admin/js/plugin-install.min.js create mode 100644 wp-admin/js/post.js create mode 100644 wp-admin/js/post.min.js create mode 100644 wp-admin/js/postbox.js create mode 100644 wp-admin/js/postbox.min.js create mode 100644 wp-admin/js/privacy-tools.js create mode 100644 wp-admin/js/privacy-tools.min.js create mode 100644 wp-admin/js/revisions.js create mode 100644 wp-admin/js/revisions.min.js create mode 100644 wp-admin/js/set-post-thumbnail.js create mode 100644 wp-admin/js/set-post-thumbnail.min.js create mode 100644 wp-admin/js/site-health.js create mode 100644 wp-admin/js/site-health.min.js create mode 100644 wp-admin/js/svg-painter.js create mode 100644 wp-admin/js/svg-painter.min.js create mode 100644 wp-admin/js/tags-box.js create mode 100644 wp-admin/js/tags-box.min.js create mode 100644 wp-admin/js/tags-suggest.js create mode 100644 wp-admin/js/tags-suggest.min.js create mode 100644 wp-admin/js/tags.js create mode 100644 wp-admin/js/tags.min.js create mode 100644 wp-admin/js/theme-plugin-editor.js create mode 100644 wp-admin/js/theme-plugin-editor.min.js create mode 100644 wp-admin/js/theme.js create mode 100644 wp-admin/js/theme.min.js create mode 100644 wp-admin/js/updates.js create mode 100644 wp-admin/js/updates.min.js create mode 100644 wp-admin/js/user-profile.js create mode 100644 wp-admin/js/user-profile.min.js create mode 100644 wp-admin/js/user-suggest.js create mode 100644 wp-admin/js/user-suggest.min.js create mode 100644 wp-admin/js/widgets.js create mode 100644 wp-admin/js/widgets.min.js create mode 100644 wp-admin/js/widgets/custom-html-widgets.js create mode 100644 wp-admin/js/widgets/custom-html-widgets.min.js create mode 100644 wp-admin/js/widgets/media-audio-widget.js create mode 100644 wp-admin/js/widgets/media-audio-widget.min.js create mode 100644 wp-admin/js/widgets/media-gallery-widget.js create mode 100644 wp-admin/js/widgets/media-gallery-widget.min.js create mode 100644 wp-admin/js/widgets/media-image-widget.js create mode 100644 wp-admin/js/widgets/media-image-widget.min.js create mode 100644 wp-admin/js/widgets/media-video-widget.js create mode 100644 wp-admin/js/widgets/media-video-widget.min.js create mode 100644 wp-admin/js/widgets/media-widgets.js create mode 100644 wp-admin/js/widgets/media-widgets.min.js create mode 100644 wp-admin/js/widgets/text-widgets.js create mode 100644 wp-admin/js/widgets/text-widgets.min.js create mode 100644 wp-admin/js/word-count.js create mode 100644 wp-admin/js/word-count.min.js create mode 100644 wp-admin/js/xfn.js create mode 100644 wp-admin/js/xfn.min.js create mode 100644 wp-admin/link-add.php create mode 100644 wp-admin/link-manager.php create mode 100644 wp-admin/link-parse-opml.php create mode 100644 wp-admin/link.php create mode 100644 wp-admin/load-scripts.php create mode 100644 wp-admin/load-styles.php create mode 100644 wp-admin/maint/repair.php create mode 100644 wp-admin/media-new.php create mode 100644 wp-admin/media-upload.php create mode 100644 wp-admin/media.php create mode 100644 wp-admin/menu-header.php create mode 100644 wp-admin/menu.php create mode 100644 wp-admin/moderation.php create mode 100644 wp-admin/ms-admin.php create mode 100644 wp-admin/ms-delete-site.php create mode 100644 wp-admin/ms-edit.php create mode 100644 wp-admin/ms-options.php create mode 100644 wp-admin/ms-sites.php create mode 100644 wp-admin/ms-themes.php create mode 100644 wp-admin/ms-upgrade-network.php create mode 100644 wp-admin/ms-users.php create mode 100644 wp-admin/my-sites.php create mode 100644 wp-admin/nav-menus.php create mode 100644 wp-admin/network.php create mode 100644 wp-admin/network/about.php create mode 100644 wp-admin/network/admin.php create mode 100644 wp-admin/network/credits.php create mode 100644 wp-admin/network/edit.php create mode 100644 wp-admin/network/freedoms.php create mode 100644 wp-admin/network/index.php create mode 100644 wp-admin/network/menu.php create mode 100644 wp-admin/network/plugin-editor.php create mode 100644 wp-admin/network/plugin-install.php create mode 100644 wp-admin/network/plugins.php create mode 100644 wp-admin/network/privacy.php create mode 100644 wp-admin/network/profile.php create mode 100644 wp-admin/network/settings.php create mode 100644 wp-admin/network/setup.php create mode 100644 wp-admin/network/site-info.php create mode 100644 wp-admin/network/site-new.php create mode 100644 wp-admin/network/site-settings.php create mode 100644 wp-admin/network/site-themes.php create mode 100644 wp-admin/network/site-users.php create mode 100644 wp-admin/network/sites.php create mode 100644 wp-admin/network/theme-editor.php create mode 100644 wp-admin/network/theme-install.php create mode 100644 wp-admin/network/themes.php create mode 100644 wp-admin/network/update-core.php create mode 100644 wp-admin/network/update.php create mode 100644 wp-admin/network/upgrade.php create mode 100644 wp-admin/network/user-edit.php create mode 100644 wp-admin/network/user-new.php create mode 100644 wp-admin/network/users.php create mode 100644 wp-admin/options-discussion.php create mode 100644 wp-admin/options-general.php create mode 100644 wp-admin/options-head.php create mode 100644 wp-admin/options-media.php create mode 100644 wp-admin/options-permalink.php create mode 100644 wp-admin/options-privacy.php create mode 100644 wp-admin/options-reading.php create mode 100644 wp-admin/options-writing.php create mode 100644 wp-admin/options.php create mode 100644 wp-admin/plugin-editor.php create mode 100644 wp-admin/plugin-install.php create mode 100644 wp-admin/plugins.php create mode 100644 wp-admin/post-new.php create mode 100644 wp-admin/post.php create mode 100644 wp-admin/press-this.php create mode 100644 wp-admin/privacy-policy-guide.php create mode 100644 wp-admin/privacy.php create mode 100644 wp-admin/profile.php create mode 100644 wp-admin/revision.php create mode 100644 wp-admin/setup-config.php create mode 100644 wp-admin/site-health-info.php create mode 100644 wp-admin/site-health.php create mode 100644 wp-admin/term.php create mode 100644 wp-admin/theme-editor.php create mode 100644 wp-admin/theme-install.php create mode 100644 wp-admin/themes.php create mode 100644 wp-admin/tools.php create mode 100644 wp-admin/update-core.php create mode 100644 wp-admin/update.php create mode 100644 wp-admin/upgrade-functions.php create mode 100644 wp-admin/upgrade.php create mode 100644 wp-admin/upload.php create mode 100644 wp-admin/user-edit.php create mode 100644 wp-admin/user-new.php create mode 100644 wp-admin/user/about.php create mode 100644 wp-admin/user/admin.php create mode 100644 wp-admin/user/credits.php create mode 100644 wp-admin/user/freedoms.php create mode 100644 wp-admin/user/index.php create mode 100644 wp-admin/user/menu.php create mode 100644 wp-admin/user/privacy.php create mode 100644 wp-admin/user/profile.php create mode 100644 wp-admin/user/user-edit.php create mode 100644 wp-admin/users.php create mode 100644 wp-admin/widgets.php create mode 100644 wp-blog-header.php create mode 100644 wp-comments-post.php create mode 100644 wp-config-sample.php create mode 100644 wp-config.php create mode 100644 wp-cron.php create mode 100644 wp-includes/ID3/getid3.lib.php create mode 100644 wp-includes/ID3/getid3.php create mode 100644 wp-includes/ID3/license.commercial.txt create mode 100644 wp-includes/ID3/license.txt create mode 100644 wp-includes/ID3/module.audio-video.asf.php create mode 100644 wp-includes/ID3/module.audio-video.flv.php create mode 100644 wp-includes/ID3/module.audio-video.matroska.php create mode 100644 wp-includes/ID3/module.audio-video.quicktime.php create mode 100644 wp-includes/ID3/module.audio-video.riff.php create mode 100644 wp-includes/ID3/module.audio.ac3.php create mode 100644 wp-includes/ID3/module.audio.dts.php create mode 100644 wp-includes/ID3/module.audio.flac.php create mode 100644 wp-includes/ID3/module.audio.mp3.php create mode 100644 wp-includes/ID3/module.audio.ogg.php create mode 100644 wp-includes/ID3/module.tag.apetag.php create mode 100644 wp-includes/ID3/module.tag.id3v1.php create mode 100644 wp-includes/ID3/module.tag.id3v2.php create mode 100644 wp-includes/ID3/module.tag.lyrics3.php create mode 100644 wp-includes/ID3/readme.txt create mode 100644 wp-includes/IXR/class-IXR-base64.php create mode 100644 wp-includes/IXR/class-IXR-client.php create mode 100644 wp-includes/IXR/class-IXR-clientmulticall.php create mode 100644 wp-includes/IXR/class-IXR-date.php create mode 100644 wp-includes/IXR/class-IXR-error.php create mode 100644 wp-includes/IXR/class-IXR-introspectionserver.php create mode 100644 wp-includes/IXR/class-IXR-message.php create mode 100644 wp-includes/IXR/class-IXR-request.php create mode 100644 wp-includes/IXR/class-IXR-server.php create mode 100644 wp-includes/IXR/class-IXR-value.php create mode 100644 wp-includes/Requests/Auth.php create mode 100644 wp-includes/Requests/Auth/Basic.php create mode 100644 wp-includes/Requests/Cookie.php create mode 100644 wp-includes/Requests/Cookie/Jar.php create mode 100644 wp-includes/Requests/Exception.php create mode 100644 wp-includes/Requests/Exception/HTTP.php create mode 100644 wp-includes/Requests/Exception/HTTP/304.php create mode 100644 wp-includes/Requests/Exception/HTTP/305.php create mode 100644 wp-includes/Requests/Exception/HTTP/306.php create mode 100644 wp-includes/Requests/Exception/HTTP/400.php create mode 100644 wp-includes/Requests/Exception/HTTP/401.php create mode 100644 wp-includes/Requests/Exception/HTTP/402.php create mode 100644 wp-includes/Requests/Exception/HTTP/403.php create mode 100644 wp-includes/Requests/Exception/HTTP/404.php create mode 100644 wp-includes/Requests/Exception/HTTP/405.php create mode 100644 wp-includes/Requests/Exception/HTTP/406.php create mode 100644 wp-includes/Requests/Exception/HTTP/407.php create mode 100644 wp-includes/Requests/Exception/HTTP/408.php create mode 100644 wp-includes/Requests/Exception/HTTP/409.php create mode 100644 wp-includes/Requests/Exception/HTTP/410.php create mode 100644 wp-includes/Requests/Exception/HTTP/411.php create mode 100644 wp-includes/Requests/Exception/HTTP/412.php create mode 100644 wp-includes/Requests/Exception/HTTP/413.php create mode 100644 wp-includes/Requests/Exception/HTTP/414.php create mode 100644 wp-includes/Requests/Exception/HTTP/415.php create mode 100644 wp-includes/Requests/Exception/HTTP/416.php create mode 100644 wp-includes/Requests/Exception/HTTP/417.php create mode 100644 wp-includes/Requests/Exception/HTTP/418.php create mode 100644 wp-includes/Requests/Exception/HTTP/428.php create mode 100644 wp-includes/Requests/Exception/HTTP/429.php create mode 100644 wp-includes/Requests/Exception/HTTP/431.php create mode 100644 wp-includes/Requests/Exception/HTTP/500.php create mode 100644 wp-includes/Requests/Exception/HTTP/501.php create mode 100644 wp-includes/Requests/Exception/HTTP/502.php create mode 100644 wp-includes/Requests/Exception/HTTP/503.php create mode 100644 wp-includes/Requests/Exception/HTTP/504.php create mode 100644 wp-includes/Requests/Exception/HTTP/505.php create mode 100644 wp-includes/Requests/Exception/HTTP/511.php create mode 100644 wp-includes/Requests/Exception/HTTP/Unknown.php create mode 100644 wp-includes/Requests/Exception/Transport.php create mode 100644 wp-includes/Requests/Exception/Transport/cURL.php create mode 100644 wp-includes/Requests/Hooker.php create mode 100644 wp-includes/Requests/Hooks.php create mode 100644 wp-includes/Requests/IDNAEncoder.php create mode 100644 wp-includes/Requests/IPv6.php create mode 100644 wp-includes/Requests/IRI.php create mode 100644 wp-includes/Requests/Proxy.php create mode 100644 wp-includes/Requests/Proxy/HTTP.php create mode 100644 wp-includes/Requests/Response.php create mode 100644 wp-includes/Requests/Response/Headers.php create mode 100644 wp-includes/Requests/SSL.php create mode 100644 wp-includes/Requests/Session.php create mode 100644 wp-includes/Requests/Transport.php create mode 100644 wp-includes/Requests/Transport/cURL.php create mode 100644 wp-includes/Requests/Transport/fsockopen.php create mode 100644 wp-includes/Requests/Utility/CaseInsensitiveDictionary.php create mode 100644 wp-includes/Requests/Utility/FilteredIterator.php create mode 100644 wp-includes/SimplePie/Author.php create mode 100644 wp-includes/SimplePie/Cache.php create mode 100644 wp-includes/SimplePie/Cache/Base.php create mode 100644 wp-includes/SimplePie/Cache/DB.php create mode 100644 wp-includes/SimplePie/Cache/File.php create mode 100644 wp-includes/SimplePie/Cache/Memcache.php create mode 100644 wp-includes/SimplePie/Cache/MySQL.php create mode 100644 wp-includes/SimplePie/Caption.php create mode 100644 wp-includes/SimplePie/Category.php create mode 100644 wp-includes/SimplePie/Content/Type/Sniffer.php create mode 100644 wp-includes/SimplePie/Copyright.php create mode 100644 wp-includes/SimplePie/Core.php create mode 100644 wp-includes/SimplePie/Credit.php create mode 100644 wp-includes/SimplePie/Decode/HTML/Entities.php create mode 100644 wp-includes/SimplePie/Enclosure.php create mode 100644 wp-includes/SimplePie/Exception.php create mode 100644 wp-includes/SimplePie/File.php create mode 100644 wp-includes/SimplePie/HTTP/Parser.php create mode 100644 wp-includes/SimplePie/IRI.php create mode 100644 wp-includes/SimplePie/Item.php create mode 100644 wp-includes/SimplePie/Locator.php create mode 100644 wp-includes/SimplePie/Misc.php create mode 100644 wp-includes/SimplePie/Net/IPv6.php create mode 100644 wp-includes/SimplePie/Parse/Date.php create mode 100644 wp-includes/SimplePie/Parser.php create mode 100644 wp-includes/SimplePie/Rating.php create mode 100644 wp-includes/SimplePie/Registry.php create mode 100644 wp-includes/SimplePie/Restriction.php create mode 100644 wp-includes/SimplePie/Sanitize.php create mode 100644 wp-includes/SimplePie/Source.php create mode 100644 wp-includes/SimplePie/XML/Declaration/Parser.php create mode 100644 wp-includes/SimplePie/gzdecode.php create mode 100644 wp-includes/Text/Diff.php create mode 100644 wp-includes/Text/Diff/Engine/native.php create mode 100644 wp-includes/Text/Diff/Engine/shell.php create mode 100644 wp-includes/Text/Diff/Engine/string.php create mode 100644 wp-includes/Text/Diff/Engine/xdiff.php create mode 100644 wp-includes/Text/Diff/Renderer.php create mode 100644 wp-includes/Text/Diff/Renderer/inline.php create mode 100644 wp-includes/admin-bar.php create mode 100644 wp-includes/assets/script-loader-packages.php create mode 100644 wp-includes/atomlib.php create mode 100644 wp-includes/author-template.php create mode 100644 wp-includes/blocks.php create mode 100644 wp-includes/blocks/archives.php create mode 100644 wp-includes/blocks/block.php create mode 100644 wp-includes/blocks/calendar.php create mode 100644 wp-includes/blocks/categories.php create mode 100644 wp-includes/blocks/latest-comments.php create mode 100644 wp-includes/blocks/latest-posts.php create mode 100644 wp-includes/blocks/rss.php create mode 100644 wp-includes/blocks/search.php create mode 100644 wp-includes/blocks/shortcode.php create mode 100644 wp-includes/blocks/shortcode/block.json create mode 100644 wp-includes/blocks/social-link.php create mode 100644 wp-includes/blocks/social-link/block.json create mode 100644 wp-includes/blocks/tag-cloud.php create mode 100644 wp-includes/bookmark-template.php create mode 100644 wp-includes/bookmark.php create mode 100644 wp-includes/cache.php create mode 100644 wp-includes/canonical.php create mode 100644 wp-includes/capabilities.php create mode 100644 wp-includes/category-template.php create mode 100644 wp-includes/category.php create mode 100644 wp-includes/certificates/ca-bundle.crt create mode 100644 wp-includes/class-IXR.php create mode 100644 wp-includes/class-feed.php create mode 100644 wp-includes/class-http.php create mode 100644 wp-includes/class-json.php create mode 100644 wp-includes/class-oembed.php create mode 100644 wp-includes/class-phpass.php create mode 100644 wp-includes/class-phpmailer.php create mode 100644 wp-includes/class-pop3.php create mode 100644 wp-includes/class-requests.php create mode 100644 wp-includes/class-simplepie.php create mode 100644 wp-includes/class-smtp.php create mode 100644 wp-includes/class-snoopy.php create mode 100644 wp-includes/class-walker-category-dropdown.php create mode 100644 wp-includes/class-walker-category.php create mode 100644 wp-includes/class-walker-comment.php create mode 100644 wp-includes/class-walker-nav-menu.php create mode 100644 wp-includes/class-walker-page-dropdown.php create mode 100644 wp-includes/class-walker-page.php create mode 100644 wp-includes/class-wp-admin-bar.php create mode 100644 wp-includes/class-wp-ajax-response.php create mode 100644 wp-includes/class-wp-block-parser.php create mode 100644 wp-includes/class-wp-block-styles-registry.php create mode 100644 wp-includes/class-wp-block-type-registry.php create mode 100644 wp-includes/class-wp-block-type.php create mode 100644 wp-includes/class-wp-comment-query.php create mode 100644 wp-includes/class-wp-comment.php create mode 100644 wp-includes/class-wp-customize-control.php create mode 100644 wp-includes/class-wp-customize-manager.php create mode 100644 wp-includes/class-wp-customize-nav-menus.php create mode 100644 wp-includes/class-wp-customize-panel.php create mode 100644 wp-includes/class-wp-customize-section.php create mode 100644 wp-includes/class-wp-customize-setting.php create mode 100644 wp-includes/class-wp-customize-widgets.php create mode 100644 wp-includes/class-wp-date-query.php create mode 100644 wp-includes/class-wp-dependency.php create mode 100644 wp-includes/class-wp-editor.php create mode 100644 wp-includes/class-wp-embed.php create mode 100644 wp-includes/class-wp-error.php create mode 100644 wp-includes/class-wp-fatal-error-handler.php create mode 100644 wp-includes/class-wp-feed-cache-transient.php create mode 100644 wp-includes/class-wp-feed-cache.php create mode 100644 wp-includes/class-wp-hook.php create mode 100644 wp-includes/class-wp-http-cookie.php create mode 100644 wp-includes/class-wp-http-curl.php create mode 100644 wp-includes/class-wp-http-encoding.php create mode 100644 wp-includes/class-wp-http-ixr-client.php create mode 100644 wp-includes/class-wp-http-proxy.php create mode 100644 wp-includes/class-wp-http-requests-hooks.php create mode 100644 wp-includes/class-wp-http-requests-response.php create mode 100644 wp-includes/class-wp-http-response.php create mode 100644 wp-includes/class-wp-http-streams.php create mode 100644 wp-includes/class-wp-image-editor-gd.php create mode 100644 wp-includes/class-wp-image-editor-imagick.php create mode 100644 wp-includes/class-wp-image-editor.php create mode 100644 wp-includes/class-wp-list-util.php create mode 100644 wp-includes/class-wp-locale-switcher.php create mode 100644 wp-includes/class-wp-locale.php create mode 100644 wp-includes/class-wp-matchesmapregex.php create mode 100644 wp-includes/class-wp-meta-query.php create mode 100644 wp-includes/class-wp-metadata-lazyloader.php create mode 100644 wp-includes/class-wp-network-query.php create mode 100644 wp-includes/class-wp-network.php create mode 100644 wp-includes/class-wp-object-cache.php create mode 100644 wp-includes/class-wp-oembed-controller.php create mode 100644 wp-includes/class-wp-oembed.php create mode 100644 wp-includes/class-wp-paused-extensions-storage.php create mode 100644 wp-includes/class-wp-post-type.php create mode 100644 wp-includes/class-wp-post.php create mode 100644 wp-includes/class-wp-query.php create mode 100644 wp-includes/class-wp-recovery-mode-cookie-service.php create mode 100644 wp-includes/class-wp-recovery-mode-email-service.php create mode 100644 wp-includes/class-wp-recovery-mode-key-service.php create mode 100644 wp-includes/class-wp-recovery-mode-link-service.php create mode 100644 wp-includes/class-wp-recovery-mode.php create mode 100644 wp-includes/class-wp-rewrite.php create mode 100644 wp-includes/class-wp-role.php create mode 100644 wp-includes/class-wp-roles.php create mode 100644 wp-includes/class-wp-session-tokens.php create mode 100644 wp-includes/class-wp-simplepie-file.php create mode 100644 wp-includes/class-wp-simplepie-sanitize-kses.php create mode 100644 wp-includes/class-wp-site-query.php create mode 100644 wp-includes/class-wp-site.php create mode 100644 wp-includes/class-wp-tax-query.php create mode 100644 wp-includes/class-wp-taxonomy.php create mode 100644 wp-includes/class-wp-term-query.php create mode 100644 wp-includes/class-wp-term.php create mode 100644 wp-includes/class-wp-text-diff-renderer-inline.php create mode 100644 wp-includes/class-wp-text-diff-renderer-table.php create mode 100644 wp-includes/class-wp-theme.php create mode 100644 wp-includes/class-wp-user-meta-session-tokens.php create mode 100644 wp-includes/class-wp-user-query.php create mode 100644 wp-includes/class-wp-user-request.php create mode 100644 wp-includes/class-wp-user.php create mode 100644 wp-includes/class-wp-walker.php create mode 100644 wp-includes/class-wp-widget-factory.php create mode 100644 wp-includes/class-wp-widget.php create mode 100644 wp-includes/class-wp-xmlrpc-server.php create mode 100644 wp-includes/class-wp.php create mode 100644 wp-includes/class.wp-dependencies.php create mode 100644 wp-includes/class.wp-scripts.php create mode 100644 wp-includes/class.wp-styles.php create mode 100644 wp-includes/comment-template.php create mode 100644 wp-includes/comment.php create mode 100644 wp-includes/compat.php create mode 100644 wp-includes/cron.php create mode 100644 wp-includes/css/admin-bar-rtl.css create mode 100644 wp-includes/css/admin-bar-rtl.min.css create mode 100644 wp-includes/css/admin-bar.css create mode 100644 wp-includes/css/admin-bar.min.css create mode 100644 wp-includes/css/buttons-rtl.css create mode 100644 wp-includes/css/buttons-rtl.min.css create mode 100644 wp-includes/css/buttons.css create mode 100644 wp-includes/css/buttons.min.css create mode 100644 wp-includes/css/customize-preview-rtl.css create mode 100644 wp-includes/css/customize-preview-rtl.min.css create mode 100644 wp-includes/css/customize-preview.css create mode 100644 wp-includes/css/customize-preview.min.css create mode 100644 wp-includes/css/dashicons.css create mode 100644 wp-includes/css/dashicons.min.css create mode 100644 wp-includes/css/dist/block-directory/style-rtl.css create mode 100644 wp-includes/css/dist/block-directory/style-rtl.min.css create mode 100644 wp-includes/css/dist/block-directory/style.css create mode 100644 wp-includes/css/dist/block-directory/style.min.css create mode 100644 wp-includes/css/dist/block-editor/style-rtl.css create mode 100644 wp-includes/css/dist/block-editor/style-rtl.min.css create mode 100644 wp-includes/css/dist/block-editor/style.css create mode 100644 wp-includes/css/dist/block-editor/style.min.css create mode 100644 wp-includes/css/dist/block-library/editor-rtl.css create mode 100644 wp-includes/css/dist/block-library/editor-rtl.min.css create mode 100644 wp-includes/css/dist/block-library/editor.css create mode 100644 wp-includes/css/dist/block-library/editor.min.css create mode 100644 wp-includes/css/dist/block-library/style-rtl.css create mode 100644 wp-includes/css/dist/block-library/style-rtl.min.css create mode 100644 wp-includes/css/dist/block-library/style.css create mode 100644 wp-includes/css/dist/block-library/style.min.css create mode 100644 wp-includes/css/dist/block-library/theme-rtl.css create mode 100644 wp-includes/css/dist/block-library/theme-rtl.min.css create mode 100644 wp-includes/css/dist/block-library/theme.css create mode 100644 wp-includes/css/dist/block-library/theme.min.css create mode 100644 wp-includes/css/dist/components/style-rtl.css create mode 100644 wp-includes/css/dist/components/style-rtl.min.css create mode 100644 wp-includes/css/dist/components/style.css create mode 100644 wp-includes/css/dist/components/style.min.css create mode 100644 wp-includes/css/dist/edit-post/style-rtl.css create mode 100644 wp-includes/css/dist/edit-post/style-rtl.min.css create mode 100644 wp-includes/css/dist/edit-post/style.css create mode 100644 wp-includes/css/dist/edit-post/style.min.css create mode 100644 wp-includes/css/dist/editor/editor-styles-rtl.css create mode 100644 wp-includes/css/dist/editor/editor-styles-rtl.min.css create mode 100644 wp-includes/css/dist/editor/editor-styles.css create mode 100644 wp-includes/css/dist/editor/editor-styles.min.css create mode 100644 wp-includes/css/dist/editor/style-rtl.css create mode 100644 wp-includes/css/dist/editor/style-rtl.min.css create mode 100644 wp-includes/css/dist/editor/style.css create mode 100644 wp-includes/css/dist/editor/style.min.css create mode 100644 wp-includes/css/dist/format-library/style-rtl.css create mode 100644 wp-includes/css/dist/format-library/style-rtl.min.css create mode 100644 wp-includes/css/dist/format-library/style.css create mode 100644 wp-includes/css/dist/format-library/style.min.css create mode 100644 wp-includes/css/dist/list-reusable-blocks/style-rtl.css create mode 100644 wp-includes/css/dist/list-reusable-blocks/style-rtl.min.css create mode 100644 wp-includes/css/dist/list-reusable-blocks/style.css create mode 100644 wp-includes/css/dist/list-reusable-blocks/style.min.css create mode 100644 wp-includes/css/dist/nux/style-rtl.css create mode 100644 wp-includes/css/dist/nux/style-rtl.min.css create mode 100644 wp-includes/css/dist/nux/style.css create mode 100644 wp-includes/css/dist/nux/style.min.css create mode 100644 wp-includes/css/editor-rtl.css create mode 100644 wp-includes/css/editor-rtl.min.css create mode 100644 wp-includes/css/editor.css create mode 100644 wp-includes/css/editor.min.css create mode 100644 wp-includes/css/jquery-ui-dialog-rtl.css create mode 100644 wp-includes/css/jquery-ui-dialog-rtl.min.css create mode 100644 wp-includes/css/jquery-ui-dialog.css create mode 100644 wp-includes/css/jquery-ui-dialog.min.css create mode 100644 wp-includes/css/media-views-rtl.css create mode 100644 wp-includes/css/media-views-rtl.min.css create mode 100644 wp-includes/css/media-views.css create mode 100644 wp-includes/css/media-views.min.css create mode 100644 wp-includes/css/wp-auth-check-rtl.css create mode 100644 wp-includes/css/wp-auth-check-rtl.min.css create mode 100644 wp-includes/css/wp-auth-check.css create mode 100644 wp-includes/css/wp-auth-check.min.css create mode 100644 wp-includes/css/wp-embed-template-ie.css create mode 100644 wp-includes/css/wp-embed-template-ie.min.css create mode 100644 wp-includes/css/wp-embed-template.css create mode 100644 wp-includes/css/wp-embed-template.min.css create mode 100644 wp-includes/css/wp-pointer-rtl.css create mode 100644 wp-includes/css/wp-pointer-rtl.min.css create mode 100644 wp-includes/css/wp-pointer.css create mode 100644 wp-includes/css/wp-pointer.min.css create mode 100644 wp-includes/customize/class-wp-customize-background-image-control.php create mode 100644 wp-includes/customize/class-wp-customize-background-image-setting.php create mode 100644 wp-includes/customize/class-wp-customize-background-position-control.php create mode 100644 wp-includes/customize/class-wp-customize-code-editor-control.php create mode 100644 wp-includes/customize/class-wp-customize-color-control.php create mode 100644 wp-includes/customize/class-wp-customize-cropped-image-control.php create mode 100644 wp-includes/customize/class-wp-customize-custom-css-setting.php create mode 100644 wp-includes/customize/class-wp-customize-date-time-control.php create mode 100644 wp-includes/customize/class-wp-customize-filter-setting.php create mode 100644 wp-includes/customize/class-wp-customize-header-image-control.php create mode 100644 wp-includes/customize/class-wp-customize-header-image-setting.php create mode 100644 wp-includes/customize/class-wp-customize-image-control.php create mode 100644 wp-includes/customize/class-wp-customize-media-control.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menu-auto-add-control.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menu-control.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menu-item-control.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menu-item-setting.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menu-location-control.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menu-locations-control.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menu-name-control.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menu-section.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menu-setting.php create mode 100644 wp-includes/customize/class-wp-customize-nav-menus-panel.php create mode 100644 wp-includes/customize/class-wp-customize-new-menu-control.php create mode 100644 wp-includes/customize/class-wp-customize-new-menu-section.php create mode 100644 wp-includes/customize/class-wp-customize-partial.php create mode 100644 wp-includes/customize/class-wp-customize-selective-refresh.php create mode 100644 wp-includes/customize/class-wp-customize-sidebar-section.php create mode 100644 wp-includes/customize/class-wp-customize-site-icon-control.php create mode 100644 wp-includes/customize/class-wp-customize-theme-control.php create mode 100644 wp-includes/customize/class-wp-customize-themes-panel.php create mode 100644 wp-includes/customize/class-wp-customize-themes-section.php create mode 100644 wp-includes/customize/class-wp-customize-upload-control.php create mode 100644 wp-includes/customize/class-wp-widget-area-customize-control.php create mode 100644 wp-includes/customize/class-wp-widget-form-customize-control.php create mode 100644 wp-includes/date.php create mode 100644 wp-includes/default-constants.php create mode 100644 wp-includes/default-filters.php create mode 100644 wp-includes/default-widgets.php create mode 100644 wp-includes/deprecated.php create mode 100644 wp-includes/embed-template.php create mode 100644 wp-includes/embed.php create mode 100644 wp-includes/error-protection.php create mode 100644 wp-includes/feed-atom-comments.php create mode 100644 wp-includes/feed-atom.php create mode 100644 wp-includes/feed-rdf.php create mode 100644 wp-includes/feed-rss.php create mode 100644 wp-includes/feed-rss2-comments.php create mode 100644 wp-includes/feed-rss2.php create mode 100644 wp-includes/feed.php create mode 100644 wp-includes/fonts/dashicons.eot create mode 100644 wp-includes/fonts/dashicons.svg create mode 100644 wp-includes/fonts/dashicons.ttf create mode 100644 wp-includes/fonts/dashicons.woff create mode 100644 wp-includes/fonts/dashicons.woff2 create mode 100644 wp-includes/formatting.php create mode 100644 wp-includes/functions.php create mode 100644 wp-includes/functions.wp-scripts.php create mode 100644 wp-includes/functions.wp-styles.php create mode 100644 wp-includes/general-template.php create mode 100644 wp-includes/http.php create mode 100644 wp-includes/images/admin-bar-sprite-2x.png create mode 100644 wp-includes/images/admin-bar-sprite.png create mode 100644 wp-includes/images/arrow-pointer-blue-2x.png create mode 100644 wp-includes/images/arrow-pointer-blue.png create mode 100644 wp-includes/images/blank.gif create mode 100644 wp-includes/images/crystal/archive.png create mode 100644 wp-includes/images/crystal/audio.png create mode 100644 wp-includes/images/crystal/code.png create mode 100644 wp-includes/images/crystal/default.png create mode 100644 wp-includes/images/crystal/document.png create mode 100644 wp-includes/images/crystal/interactive.png create mode 100644 wp-includes/images/crystal/license.txt create mode 100644 wp-includes/images/crystal/spreadsheet.png create mode 100644 wp-includes/images/crystal/text.png create mode 100644 wp-includes/images/crystal/video.png create mode 100644 wp-includes/images/down_arrow-2x.gif create mode 100644 wp-includes/images/down_arrow.gif create mode 100644 wp-includes/images/icon-pointer-flag-2x.png create mode 100644 wp-includes/images/icon-pointer-flag.png create mode 100644 wp-includes/images/media/archive.png create mode 100644 wp-includes/images/media/audio.png create mode 100644 wp-includes/images/media/code.png create mode 100644 wp-includes/images/media/default.png create mode 100644 wp-includes/images/media/document.png create mode 100644 wp-includes/images/media/interactive.png create mode 100644 wp-includes/images/media/spreadsheet.png create mode 100644 wp-includes/images/media/text.png create mode 100644 wp-includes/images/media/video.png create mode 100644 wp-includes/images/rss-2x.png create mode 100644 wp-includes/images/rss.png create mode 100644 wp-includes/images/smilies/frownie.png create mode 100644 wp-includes/images/smilies/icon_arrow.gif create mode 100644 wp-includes/images/smilies/icon_biggrin.gif create mode 100644 wp-includes/images/smilies/icon_confused.gif create mode 100644 wp-includes/images/smilies/icon_cool.gif create mode 100644 wp-includes/images/smilies/icon_cry.gif create mode 100644 wp-includes/images/smilies/icon_eek.gif create mode 100644 wp-includes/images/smilies/icon_evil.gif create mode 100644 wp-includes/images/smilies/icon_exclaim.gif create mode 100644 wp-includes/images/smilies/icon_idea.gif create mode 100644 wp-includes/images/smilies/icon_lol.gif create mode 100644 wp-includes/images/smilies/icon_mad.gif create mode 100644 wp-includes/images/smilies/icon_mrgreen.gif create mode 100644 wp-includes/images/smilies/icon_neutral.gif create mode 100644 wp-includes/images/smilies/icon_question.gif create mode 100644 wp-includes/images/smilies/icon_razz.gif create mode 100644 wp-includes/images/smilies/icon_redface.gif create mode 100644 wp-includes/images/smilies/icon_rolleyes.gif create mode 100644 wp-includes/images/smilies/icon_sad.gif create mode 100644 wp-includes/images/smilies/icon_smile.gif create mode 100644 wp-includes/images/smilies/icon_surprised.gif create mode 100644 wp-includes/images/smilies/icon_twisted.gif create mode 100644 wp-includes/images/smilies/icon_wink.gif create mode 100644 wp-includes/images/smilies/mrgreen.png create mode 100644 wp-includes/images/smilies/rolleyes.png create mode 100644 wp-includes/images/smilies/simple-smile.png create mode 100644 wp-includes/images/spinner-2x.gif create mode 100644 wp-includes/images/spinner.gif create mode 100644 wp-includes/images/toggle-arrow-2x.png create mode 100644 wp-includes/images/toggle-arrow.png create mode 100644 wp-includes/images/uploader-icons-2x.png create mode 100644 wp-includes/images/uploader-icons.png create mode 100644 wp-includes/images/w-logo-blue-white-bg.png create mode 100644 wp-includes/images/w-logo-blue.png create mode 100644 wp-includes/images/wlw/wp-comments.png create mode 100644 wp-includes/images/wlw/wp-icon.png create mode 100644 wp-includes/images/wlw/wp-watermark.png create mode 100644 wp-includes/images/wpicons-2x.png create mode 100644 wp-includes/images/wpicons.png create mode 100644 wp-includes/images/wpspin-2x.gif create mode 100644 wp-includes/images/wpspin.gif create mode 100644 wp-includes/images/xit-2x.gif create mode 100644 wp-includes/images/xit.gif create mode 100644 wp-includes/js/admin-bar.js create mode 100644 wp-includes/js/admin-bar.min.js create mode 100644 wp-includes/js/api-request.js create mode 100644 wp-includes/js/api-request.min.js create mode 100644 wp-includes/js/autosave.js create mode 100644 wp-includes/js/autosave.min.js create mode 100644 wp-includes/js/backbone.js create mode 100644 wp-includes/js/backbone.min.js create mode 100644 wp-includes/js/clipboard.js create mode 100644 wp-includes/js/clipboard.min.js create mode 100644 wp-includes/js/codemirror/codemirror.min.css create mode 100644 wp-includes/js/codemirror/codemirror.min.js create mode 100644 wp-includes/js/codemirror/csslint.js create mode 100644 wp-includes/js/codemirror/esprima.js create mode 100644 wp-includes/js/codemirror/fakejshint.js create mode 100644 wp-includes/js/codemirror/htmlhint-kses.js create mode 100644 wp-includes/js/codemirror/htmlhint.js create mode 100644 wp-includes/js/codemirror/jsonlint.js create mode 100644 wp-includes/js/colorpicker.js create mode 100644 wp-includes/js/colorpicker.min.js create mode 100644 wp-includes/js/comment-reply.js create mode 100644 wp-includes/js/comment-reply.min.js create mode 100644 wp-includes/js/crop/cropper.css create mode 100644 wp-includes/js/crop/cropper.js create mode 100644 wp-includes/js/crop/marqueeHoriz.gif create mode 100644 wp-includes/js/crop/marqueeVert.gif create mode 100644 wp-includes/js/customize-base.js create mode 100644 wp-includes/js/customize-base.min.js create mode 100644 wp-includes/js/customize-loader.js create mode 100644 wp-includes/js/customize-loader.min.js create mode 100644 wp-includes/js/customize-models.js create mode 100644 wp-includes/js/customize-models.min.js create mode 100644 wp-includes/js/customize-preview-nav-menus.js create mode 100644 wp-includes/js/customize-preview-nav-menus.min.js create mode 100644 wp-includes/js/customize-preview-widgets.js create mode 100644 wp-includes/js/customize-preview-widgets.min.js create mode 100644 wp-includes/js/customize-preview.js create mode 100644 wp-includes/js/customize-preview.min.js create mode 100644 wp-includes/js/customize-selective-refresh.js create mode 100644 wp-includes/js/customize-selective-refresh.min.js create mode 100644 wp-includes/js/customize-views.js create mode 100644 wp-includes/js/customize-views.min.js create mode 100644 wp-includes/js/dist/a11y.js create mode 100644 wp-includes/js/dist/a11y.min.js create mode 100644 wp-includes/js/dist/annotations.js create mode 100644 wp-includes/js/dist/annotations.min.js create mode 100644 wp-includes/js/dist/api-fetch.js create mode 100644 wp-includes/js/dist/api-fetch.min.js create mode 100644 wp-includes/js/dist/autop.js create mode 100644 wp-includes/js/dist/autop.min.js create mode 100644 wp-includes/js/dist/blob.js create mode 100644 wp-includes/js/dist/blob.min.js create mode 100644 wp-includes/js/dist/block-directory.js create mode 100644 wp-includes/js/dist/block-directory.min.js create mode 100644 wp-includes/js/dist/block-editor.js create mode 100644 wp-includes/js/dist/block-editor.min.js create mode 100644 wp-includes/js/dist/block-library.js create mode 100644 wp-includes/js/dist/block-library.min.js create mode 100644 wp-includes/js/dist/block-serialization-default-parser.js create mode 100644 wp-includes/js/dist/block-serialization-default-parser.min.js create mode 100644 wp-includes/js/dist/blocks.js create mode 100644 wp-includes/js/dist/blocks.min.js create mode 100644 wp-includes/js/dist/components.js create mode 100644 wp-includes/js/dist/components.min.js create mode 100644 wp-includes/js/dist/compose.js create mode 100644 wp-includes/js/dist/compose.min.js create mode 100644 wp-includes/js/dist/core-data.js create mode 100644 wp-includes/js/dist/core-data.min.js create mode 100644 wp-includes/js/dist/data-controls.js create mode 100644 wp-includes/js/dist/data-controls.min.js create mode 100644 wp-includes/js/dist/data.js create mode 100644 wp-includes/js/dist/data.min.js create mode 100644 wp-includes/js/dist/date.js create mode 100644 wp-includes/js/dist/date.min.js create mode 100644 wp-includes/js/dist/deprecated.js create mode 100644 wp-includes/js/dist/deprecated.min.js create mode 100644 wp-includes/js/dist/dom-ready.js create mode 100644 wp-includes/js/dist/dom-ready.min.js create mode 100644 wp-includes/js/dist/dom.js create mode 100644 wp-includes/js/dist/dom.min.js create mode 100644 wp-includes/js/dist/edit-post.js create mode 100644 wp-includes/js/dist/edit-post.min.js create mode 100644 wp-includes/js/dist/editor.js create mode 100644 wp-includes/js/dist/editor.min.js create mode 100644 wp-includes/js/dist/element.js create mode 100644 wp-includes/js/dist/element.min.js create mode 100644 wp-includes/js/dist/escape-html.js create mode 100644 wp-includes/js/dist/escape-html.min.js create mode 100644 wp-includes/js/dist/format-library.js create mode 100644 wp-includes/js/dist/format-library.min.js create mode 100644 wp-includes/js/dist/hooks.js create mode 100644 wp-includes/js/dist/hooks.min.js create mode 100644 wp-includes/js/dist/html-entities.js create mode 100644 wp-includes/js/dist/html-entities.min.js create mode 100644 wp-includes/js/dist/i18n.js create mode 100644 wp-includes/js/dist/i18n.min.js create mode 100644 wp-includes/js/dist/is-shallow-equal.js create mode 100644 wp-includes/js/dist/is-shallow-equal.min.js create mode 100644 wp-includes/js/dist/keyboard-shortcuts.js create mode 100644 wp-includes/js/dist/keyboard-shortcuts.min.js create mode 100644 wp-includes/js/dist/keycodes.js create mode 100644 wp-includes/js/dist/keycodes.min.js create mode 100644 wp-includes/js/dist/list-reusable-blocks.js create mode 100644 wp-includes/js/dist/list-reusable-blocks.min.js create mode 100644 wp-includes/js/dist/media-utils.js create mode 100644 wp-includes/js/dist/media-utils.min.js create mode 100644 wp-includes/js/dist/notices.js create mode 100644 wp-includes/js/dist/notices.min.js create mode 100644 wp-includes/js/dist/nux.js create mode 100644 wp-includes/js/dist/nux.min.js create mode 100644 wp-includes/js/dist/plugins.js create mode 100644 wp-includes/js/dist/plugins.min.js create mode 100644 wp-includes/js/dist/primitives.js create mode 100644 wp-includes/js/dist/primitives.min.js create mode 100644 wp-includes/js/dist/priority-queue.js create mode 100644 wp-includes/js/dist/priority-queue.min.js create mode 100644 wp-includes/js/dist/redux-routine.js create mode 100644 wp-includes/js/dist/redux-routine.min.js create mode 100644 wp-includes/js/dist/rich-text.js create mode 100644 wp-includes/js/dist/rich-text.min.js create mode 100644 wp-includes/js/dist/server-side-render.js create mode 100644 wp-includes/js/dist/server-side-render.min.js create mode 100644 wp-includes/js/dist/shortcode.js create mode 100644 wp-includes/js/dist/shortcode.min.js create mode 100644 wp-includes/js/dist/token-list.js create mode 100644 wp-includes/js/dist/token-list.min.js create mode 100644 wp-includes/js/dist/url.js create mode 100644 wp-includes/js/dist/url.min.js create mode 100644 wp-includes/js/dist/viewport.js create mode 100644 wp-includes/js/dist/viewport.min.js create mode 100644 wp-includes/js/dist/warning.js create mode 100644 wp-includes/js/dist/warning.min.js create mode 100644 wp-includes/js/dist/wordcount.js create mode 100644 wp-includes/js/dist/wordcount.min.js create mode 100644 wp-includes/js/heartbeat.js create mode 100644 wp-includes/js/heartbeat.min.js create mode 100644 wp-includes/js/hoverIntent.js create mode 100644 wp-includes/js/hoverIntent.min.js create mode 100644 wp-includes/js/hoverintent-js.min.js create mode 100644 wp-includes/js/imagesloaded.min.js create mode 100644 wp-includes/js/imgareaselect/border-anim-h.gif create mode 100644 wp-includes/js/imgareaselect/border-anim-v.gif create mode 100644 wp-includes/js/imgareaselect/imgareaselect.css create mode 100644 wp-includes/js/imgareaselect/jquery.imgareaselect.js create mode 100644 wp-includes/js/imgareaselect/jquery.imgareaselect.min.js create mode 100644 wp-includes/js/jcrop/Jcrop.gif create mode 100644 wp-includes/js/jcrop/jquery.Jcrop.min.css create mode 100644 wp-includes/js/jcrop/jquery.Jcrop.min.js create mode 100644 wp-includes/js/jquery/jquery-migrate.js create mode 100644 wp-includes/js/jquery/jquery-migrate.min.js create mode 100644 wp-includes/js/jquery/jquery.color.min.js create mode 100644 wp-includes/js/jquery/jquery.form.js create mode 100644 wp-includes/js/jquery/jquery.form.min.js create mode 100644 wp-includes/js/jquery/jquery.hotkeys.js create mode 100644 wp-includes/js/jquery/jquery.hotkeys.min.js create mode 100644 wp-includes/js/jquery/jquery.js create mode 100644 wp-includes/js/jquery/jquery.masonry.min.js create mode 100644 wp-includes/js/jquery/jquery.query.js create mode 100644 wp-includes/js/jquery/jquery.schedule.js create mode 100644 wp-includes/js/jquery/jquery.serialize-object.js create mode 100644 wp-includes/js/jquery/jquery.table-hotkeys.js create mode 100644 wp-includes/js/jquery/jquery.table-hotkeys.min.js create mode 100644 wp-includes/js/jquery/jquery.ui.touch-punch.js create mode 100644 wp-includes/js/jquery/suggest.js create mode 100644 wp-includes/js/jquery/suggest.min.js create mode 100644 wp-includes/js/jquery/ui/accordion.min.js create mode 100644 wp-includes/js/jquery/ui/autocomplete.min.js create mode 100644 wp-includes/js/jquery/ui/button.min.js create mode 100644 wp-includes/js/jquery/ui/core.min.js create mode 100644 wp-includes/js/jquery/ui/datepicker.min.js create mode 100644 wp-includes/js/jquery/ui/dialog.min.js create mode 100644 wp-includes/js/jquery/ui/draggable.min.js create mode 100644 wp-includes/js/jquery/ui/droppable.min.js create mode 100644 wp-includes/js/jquery/ui/effect-blind.min.js create mode 100644 wp-includes/js/jquery/ui/effect-bounce.min.js create mode 100644 wp-includes/js/jquery/ui/effect-clip.min.js create mode 100644 wp-includes/js/jquery/ui/effect-drop.min.js create mode 100644 wp-includes/js/jquery/ui/effect-explode.min.js create mode 100644 wp-includes/js/jquery/ui/effect-fade.min.js create mode 100644 wp-includes/js/jquery/ui/effect-fold.min.js create mode 100644 wp-includes/js/jquery/ui/effect-highlight.min.js create mode 100644 wp-includes/js/jquery/ui/effect-puff.min.js create mode 100644 wp-includes/js/jquery/ui/effect-pulsate.min.js create mode 100644 wp-includes/js/jquery/ui/effect-scale.min.js create mode 100644 wp-includes/js/jquery/ui/effect-shake.min.js create mode 100644 wp-includes/js/jquery/ui/effect-size.min.js create mode 100644 wp-includes/js/jquery/ui/effect-slide.min.js create mode 100644 wp-includes/js/jquery/ui/effect-transfer.min.js create mode 100644 wp-includes/js/jquery/ui/effect.min.js create mode 100644 wp-includes/js/jquery/ui/menu.min.js create mode 100644 wp-includes/js/jquery/ui/mouse.min.js create mode 100644 wp-includes/js/jquery/ui/position.min.js create mode 100644 wp-includes/js/jquery/ui/progressbar.min.js create mode 100644 wp-includes/js/jquery/ui/resizable.min.js create mode 100644 wp-includes/js/jquery/ui/selectable.min.js create mode 100644 wp-includes/js/jquery/ui/selectmenu.min.js create mode 100644 wp-includes/js/jquery/ui/slider.min.js create mode 100644 wp-includes/js/jquery/ui/sortable.min.js create mode 100644 wp-includes/js/jquery/ui/spinner.min.js create mode 100644 wp-includes/js/jquery/ui/tabs.min.js create mode 100644 wp-includes/js/jquery/ui/tooltip.min.js create mode 100644 wp-includes/js/jquery/ui/widget.min.js create mode 100644 wp-includes/js/json2.js create mode 100644 wp-includes/js/json2.min.js create mode 100644 wp-includes/js/masonry.min.js create mode 100644 wp-includes/js/mce-view.js create mode 100644 wp-includes/js/mce-view.min.js create mode 100644 wp-includes/js/media-audiovideo.js create mode 100644 wp-includes/js/media-audiovideo.min.js create mode 100644 wp-includes/js/media-editor.js create mode 100644 wp-includes/js/media-editor.min.js create mode 100644 wp-includes/js/media-grid.js create mode 100644 wp-includes/js/media-grid.min.js create mode 100644 wp-includes/js/media-models.js create mode 100644 wp-includes/js/media-models.min.js create mode 100644 wp-includes/js/media-views.js create mode 100644 wp-includes/js/media-views.min.js create mode 100644 wp-includes/js/mediaelement/mediaelement-and-player.js create mode 100644 wp-includes/js/mediaelement/mediaelement-and-player.min.js create mode 100644 wp-includes/js/mediaelement/mediaelement-migrate.js create mode 100644 wp-includes/js/mediaelement/mediaelement-migrate.min.js create mode 100644 wp-includes/js/mediaelement/mediaelement.js create mode 100644 wp-includes/js/mediaelement/mediaelement.min.js create mode 100644 wp-includes/js/mediaelement/mediaelementplayer-legacy.css create mode 100644 wp-includes/js/mediaelement/mediaelementplayer-legacy.min.css create mode 100644 wp-includes/js/mediaelement/mediaelementplayer.css create mode 100644 wp-includes/js/mediaelement/mediaelementplayer.min.css create mode 100644 wp-includes/js/mediaelement/mejs-controls.png create mode 100644 wp-includes/js/mediaelement/mejs-controls.svg create mode 100644 wp-includes/js/mediaelement/renderers/vimeo.js create mode 100644 wp-includes/js/mediaelement/renderers/vimeo.min.js create mode 100644 wp-includes/js/mediaelement/wp-mediaelement.css create mode 100644 wp-includes/js/mediaelement/wp-mediaelement.js create mode 100644 wp-includes/js/mediaelement/wp-mediaelement.min.css create mode 100644 wp-includes/js/mediaelement/wp-mediaelement.min.js create mode 100644 wp-includes/js/mediaelement/wp-playlist.js create mode 100644 wp-includes/js/mediaelement/wp-playlist.min.js create mode 100644 wp-includes/js/plupload/handlers.js create mode 100644 wp-includes/js/plupload/handlers.min.js create mode 100644 wp-includes/js/plupload/license.txt create mode 100644 wp-includes/js/plupload/moxie.js create mode 100644 wp-includes/js/plupload/moxie.min.js create mode 100644 wp-includes/js/plupload/plupload.js create mode 100644 wp-includes/js/plupload/plupload.min.js create mode 100644 wp-includes/js/plupload/wp-plupload.js create mode 100644 wp-includes/js/plupload/wp-plupload.min.js create mode 100644 wp-includes/js/quicktags.js create mode 100644 wp-includes/js/quicktags.min.js create mode 100644 wp-includes/js/shortcode.js create mode 100644 wp-includes/js/shortcode.min.js create mode 100644 wp-includes/js/swfobject.js create mode 100644 wp-includes/js/swfupload/handlers.js create mode 100644 wp-includes/js/swfupload/handlers.min.js create mode 100644 wp-includes/js/swfupload/license.txt create mode 100644 wp-includes/js/swfupload/swfupload.js create mode 100644 wp-includes/js/thickbox/loadingAnimation.gif create mode 100644 wp-includes/js/thickbox/macFFBgHack.png create mode 100644 wp-includes/js/thickbox/thickbox.css create mode 100644 wp-includes/js/thickbox/thickbox.js create mode 100644 wp-includes/js/tinymce/langs/wp-langs-en.js create mode 100644 wp-includes/js/tinymce/license.txt create mode 100644 wp-includes/js/tinymce/plugins/charmap/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/charmap/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/colorpicker/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/colorpicker/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/compat3x/css/dialog.css create mode 100644 wp-includes/js/tinymce/plugins/compat3x/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/compat3x/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/directionality/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/directionality/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/fullscreen/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/hr/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/hr/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/image/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/image/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/link/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/link/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/lists/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/lists/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/media/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/media/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/paste/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/paste/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/tabfocus/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/tabfocus/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/textcolor/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/textcolor/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/wordpress/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/wordpress/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/wpautoresize/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/wpautoresize/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/wpdialogs/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/wpdialogs/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/wpeditimage/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/wpeditimage/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/wpemoji/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/wpgallery/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/wpgallery/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/wplink/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/wplink/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/wptextpattern/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/wptextpattern/plugin.min.js create mode 100644 wp-includes/js/tinymce/plugins/wpview/plugin.js create mode 100644 wp-includes/js/tinymce/plugins/wpview/plugin.min.js create mode 100644 wp-includes/js/tinymce/skins/lightgray/content.inline.min.css create mode 100644 wp-includes/js/tinymce/skins/lightgray/content.min.css create mode 100644 wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.eot create mode 100644 wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.svg create mode 100644 wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.ttf create mode 100644 wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.woff create mode 100644 wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.eot create mode 100644 wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.svg create mode 100644 wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.ttf create mode 100644 wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.woff create mode 100644 wp-includes/js/tinymce/skins/lightgray/img/anchor.gif create mode 100644 wp-includes/js/tinymce/skins/lightgray/img/loader.gif create mode 100644 wp-includes/js/tinymce/skins/lightgray/img/object.gif create mode 100644 wp-includes/js/tinymce/skins/lightgray/img/trans.gif create mode 100644 wp-includes/js/tinymce/skins/lightgray/skin.min.css create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/audio.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/dashicon-edit.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/dashicon-no.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/embedded.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/gallery-2x.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/gallery.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/more-2x.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/more.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/pagebreak-2x.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/pagebreak.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/playlist-audio.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/playlist-video.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/images/video.png create mode 100644 wp-includes/js/tinymce/skins/wordpress/wp-content.css create mode 100644 wp-includes/js/tinymce/themes/inlite/theme.js create mode 100644 wp-includes/js/tinymce/themes/inlite/theme.min.js create mode 100644 wp-includes/js/tinymce/themes/modern/theme.js create mode 100644 wp-includes/js/tinymce/themes/modern/theme.min.js create mode 100644 wp-includes/js/tinymce/tiny_mce_popup.js create mode 100644 wp-includes/js/tinymce/tinymce.min.js create mode 100644 wp-includes/js/tinymce/utils/editable_selects.js create mode 100644 wp-includes/js/tinymce/utils/form_utils.js create mode 100644 wp-includes/js/tinymce/utils/mctabs.js create mode 100644 wp-includes/js/tinymce/utils/validate.js create mode 100644 wp-includes/js/tinymce/wp-tinymce.js create mode 100644 wp-includes/js/tinymce/wp-tinymce.php create mode 100644 wp-includes/js/tw-sack.js create mode 100644 wp-includes/js/tw-sack.min.js create mode 100644 wp-includes/js/twemoji.js create mode 100644 wp-includes/js/twemoji.min.js create mode 100644 wp-includes/js/underscore.js create mode 100644 wp-includes/js/underscore.min.js create mode 100644 wp-includes/js/utils.js create mode 100644 wp-includes/js/utils.min.js create mode 100644 wp-includes/js/wp-ajax-response.js create mode 100644 wp-includes/js/wp-ajax-response.min.js create mode 100644 wp-includes/js/wp-api.js create mode 100644 wp-includes/js/wp-api.min.js create mode 100644 wp-includes/js/wp-auth-check.js create mode 100644 wp-includes/js/wp-auth-check.min.js create mode 100644 wp-includes/js/wp-backbone.js create mode 100644 wp-includes/js/wp-backbone.min.js create mode 100644 wp-includes/js/wp-custom-header.js create mode 100644 wp-includes/js/wp-custom-header.min.js create mode 100644 wp-includes/js/wp-embed-template.js create mode 100644 wp-includes/js/wp-embed-template.min.js create mode 100644 wp-includes/js/wp-embed.js create mode 100644 wp-includes/js/wp-embed.min.js create mode 100644 wp-includes/js/wp-emoji-loader.js create mode 100644 wp-includes/js/wp-emoji-loader.min.js create mode 100644 wp-includes/js/wp-emoji-release.min.js create mode 100644 wp-includes/js/wp-emoji.js create mode 100644 wp-includes/js/wp-emoji.min.js create mode 100644 wp-includes/js/wp-list-revisions.js create mode 100644 wp-includes/js/wp-list-revisions.min.js create mode 100644 wp-includes/js/wp-lists.js create mode 100644 wp-includes/js/wp-lists.min.js create mode 100644 wp-includes/js/wp-pointer.js create mode 100644 wp-includes/js/wp-pointer.min.js create mode 100644 wp-includes/js/wp-sanitize.js create mode 100644 wp-includes/js/wp-sanitize.min.js create mode 100644 wp-includes/js/wp-util.js create mode 100644 wp-includes/js/wp-util.min.js create mode 100644 wp-includes/js/wpdialog.js create mode 100644 wp-includes/js/wpdialog.min.js create mode 100644 wp-includes/js/wplink.js create mode 100644 wp-includes/js/wplink.min.js create mode 100644 wp-includes/js/zxcvbn-async.js create mode 100644 wp-includes/js/zxcvbn-async.min.js create mode 100644 wp-includes/js/zxcvbn.min.js create mode 100644 wp-includes/kses.php create mode 100644 wp-includes/l10n.php create mode 100644 wp-includes/link-template.php create mode 100644 wp-includes/load.php create mode 100644 wp-includes/locale.php create mode 100644 wp-includes/media-template.php create mode 100644 wp-includes/media.php create mode 100644 wp-includes/meta.php create mode 100644 wp-includes/ms-blogs.php create mode 100644 wp-includes/ms-default-constants.php create mode 100644 wp-includes/ms-default-filters.php create mode 100644 wp-includes/ms-deprecated.php create mode 100644 wp-includes/ms-files.php create mode 100644 wp-includes/ms-functions.php create mode 100644 wp-includes/ms-load.php create mode 100644 wp-includes/ms-network.php create mode 100644 wp-includes/ms-settings.php create mode 100644 wp-includes/ms-site.php create mode 100644 wp-includes/nav-menu-template.php create mode 100644 wp-includes/nav-menu.php create mode 100644 wp-includes/option.php create mode 100644 wp-includes/pluggable-deprecated.php create mode 100644 wp-includes/pluggable.php create mode 100644 wp-includes/plugin.php create mode 100644 wp-includes/pomo/entry.php create mode 100644 wp-includes/pomo/mo.php create mode 100644 wp-includes/pomo/plural-forms.php create mode 100644 wp-includes/pomo/po.php create mode 100644 wp-includes/pomo/streams.php create mode 100644 wp-includes/pomo/translations.php create mode 100644 wp-includes/post-formats.php create mode 100644 wp-includes/post-template.php create mode 100644 wp-includes/post-thumbnail-template.php create mode 100644 wp-includes/post.php create mode 100644 wp-includes/query.php create mode 100644 wp-includes/random_compat/byte_safe_strings.php create mode 100644 wp-includes/random_compat/cast_to_int.php create mode 100644 wp-includes/random_compat/error_polyfill.php create mode 100644 wp-includes/random_compat/random.php create mode 100644 wp-includes/random_compat/random_bytes_com_dotnet.php create mode 100644 wp-includes/random_compat/random_bytes_dev_urandom.php create mode 100644 wp-includes/random_compat/random_bytes_libsodium.php create mode 100644 wp-includes/random_compat/random_bytes_libsodium_legacy.php create mode 100644 wp-includes/random_compat/random_bytes_mcrypt.php create mode 100644 wp-includes/random_compat/random_int.php create mode 100644 wp-includes/registration-functions.php create mode 100644 wp-includes/registration.php create mode 100644 wp-includes/rest-api.php create mode 100644 wp-includes/rest-api/class-wp-rest-request.php create mode 100644 wp-includes/rest-api/class-wp-rest-response.php create mode 100644 wp-includes/rest-api/class-wp-rest-server.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-blocks-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-settings-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php create mode 100644 wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php create mode 100644 wp-includes/rest-api/fields/class-wp-rest-comment-meta-fields.php create mode 100644 wp-includes/rest-api/fields/class-wp-rest-meta-fields.php create mode 100644 wp-includes/rest-api/fields/class-wp-rest-post-meta-fields.php create mode 100644 wp-includes/rest-api/fields/class-wp-rest-term-meta-fields.php create mode 100644 wp-includes/rest-api/fields/class-wp-rest-user-meta-fields.php create mode 100644 wp-includes/rest-api/search/class-wp-rest-post-search-handler.php create mode 100644 wp-includes/rest-api/search/class-wp-rest-search-handler.php create mode 100644 wp-includes/revision.php create mode 100644 wp-includes/rewrite.php create mode 100644 wp-includes/rss-functions.php create mode 100644 wp-includes/rss.php create mode 100644 wp-includes/script-loader.php create mode 100644 wp-includes/session.php create mode 100644 wp-includes/shortcodes.php create mode 100644 wp-includes/sodium_compat/LICENSE create mode 100644 wp-includes/sodium_compat/autoload.php create mode 100644 wp-includes/sodium_compat/composer.json create mode 100644 wp-includes/sodium_compat/lib/constants.php create mode 100644 wp-includes/sodium_compat/lib/namespaced.php create mode 100644 wp-includes/sodium_compat/lib/php72compat.php create mode 100644 wp-includes/sodium_compat/lib/php72compat_const.php create mode 100644 wp-includes/sodium_compat/lib/sodium_compat.php create mode 100644 wp-includes/sodium_compat/namespaced/Compat.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/BLAKE2b.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/ChaCha20.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/ChaCha20/Ctx.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/ChaCha20/IetfCtx.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Curve25519.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Curve25519/Fe.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Curve25519/Ge/Cached.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Curve25519/Ge/P1p1.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Curve25519/Ge/P2.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Curve25519/Ge/P3.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Curve25519/Ge/Precomp.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Curve25519/H.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Ed25519.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/HChaCha20.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/HSalsa20.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Poly1305.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Poly1305/State.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Salsa20.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/SipHash.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Util.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/X25519.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/XChaCha20.php create mode 100644 wp-includes/sodium_compat/namespaced/Core/Xsalsa20.php create mode 100644 wp-includes/sodium_compat/namespaced/Crypto.php create mode 100644 wp-includes/sodium_compat/namespaced/File.php create mode 100644 wp-includes/sodium_compat/src/Compat.php create mode 100644 wp-includes/sodium_compat/src/Core/BLAKE2b.php create mode 100644 wp-includes/sodium_compat/src/Core/Base64/Common.php create mode 100644 wp-includes/sodium_compat/src/Core/Base64/Original.php create mode 100644 wp-includes/sodium_compat/src/Core/Base64/UrlSafe.php create mode 100644 wp-includes/sodium_compat/src/Core/ChaCha20.php create mode 100644 wp-includes/sodium_compat/src/Core/ChaCha20/Ctx.php create mode 100644 wp-includes/sodium_compat/src/Core/ChaCha20/IetfCtx.php create mode 100644 wp-includes/sodium_compat/src/Core/Curve25519.php create mode 100644 wp-includes/sodium_compat/src/Core/Curve25519/Fe.php create mode 100644 wp-includes/sodium_compat/src/Core/Curve25519/Ge/Cached.php create mode 100644 wp-includes/sodium_compat/src/Core/Curve25519/Ge/P1p1.php create mode 100644 wp-includes/sodium_compat/src/Core/Curve25519/Ge/P2.php create mode 100644 wp-includes/sodium_compat/src/Core/Curve25519/Ge/P3.php create mode 100644 wp-includes/sodium_compat/src/Core/Curve25519/Ge/Precomp.php create mode 100644 wp-includes/sodium_compat/src/Core/Curve25519/H.php create mode 100644 wp-includes/sodium_compat/src/Core/Curve25519/README.md create mode 100644 wp-includes/sodium_compat/src/Core/Ed25519.php create mode 100644 wp-includes/sodium_compat/src/Core/HChaCha20.php create mode 100644 wp-includes/sodium_compat/src/Core/HSalsa20.php create mode 100644 wp-includes/sodium_compat/src/Core/Poly1305.php create mode 100644 wp-includes/sodium_compat/src/Core/Poly1305/State.php create mode 100644 wp-includes/sodium_compat/src/Core/Salsa20.php create mode 100644 wp-includes/sodium_compat/src/Core/SecretStream/State.php create mode 100644 wp-includes/sodium_compat/src/Core/SipHash.php create mode 100644 wp-includes/sodium_compat/src/Core/Util.php create mode 100644 wp-includes/sodium_compat/src/Core/X25519.php create mode 100644 wp-includes/sodium_compat/src/Core/XChaCha20.php create mode 100644 wp-includes/sodium_compat/src/Core/XSalsa20.php create mode 100644 wp-includes/sodium_compat/src/Core32/BLAKE2b.php create mode 100644 wp-includes/sodium_compat/src/Core32/ChaCha20.php create mode 100644 wp-includes/sodium_compat/src/Core32/ChaCha20/Ctx.php create mode 100644 wp-includes/sodium_compat/src/Core32/ChaCha20/IetfCtx.php create mode 100644 wp-includes/sodium_compat/src/Core32/Curve25519.php create mode 100644 wp-includes/sodium_compat/src/Core32/Curve25519/Fe.php create mode 100644 wp-includes/sodium_compat/src/Core32/Curve25519/Ge/Cached.php create mode 100644 wp-includes/sodium_compat/src/Core32/Curve25519/Ge/P1p1.php create mode 100644 wp-includes/sodium_compat/src/Core32/Curve25519/Ge/P2.php create mode 100644 wp-includes/sodium_compat/src/Core32/Curve25519/Ge/P3.php create mode 100644 wp-includes/sodium_compat/src/Core32/Curve25519/Ge/Precomp.php create mode 100644 wp-includes/sodium_compat/src/Core32/Curve25519/H.php create mode 100644 wp-includes/sodium_compat/src/Core32/Curve25519/README.md create mode 100644 wp-includes/sodium_compat/src/Core32/Ed25519.php create mode 100644 wp-includes/sodium_compat/src/Core32/HChaCha20.php create mode 100644 wp-includes/sodium_compat/src/Core32/HSalsa20.php create mode 100644 wp-includes/sodium_compat/src/Core32/Int32.php create mode 100644 wp-includes/sodium_compat/src/Core32/Int64.php create mode 100644 wp-includes/sodium_compat/src/Core32/Poly1305.php create mode 100644 wp-includes/sodium_compat/src/Core32/Poly1305/State.php create mode 100644 wp-includes/sodium_compat/src/Core32/Salsa20.php create mode 100644 wp-includes/sodium_compat/src/Core32/SecretStream/State.php create mode 100644 wp-includes/sodium_compat/src/Core32/SipHash.php create mode 100644 wp-includes/sodium_compat/src/Core32/Util.php create mode 100644 wp-includes/sodium_compat/src/Core32/X25519.php create mode 100644 wp-includes/sodium_compat/src/Core32/XChaCha20.php create mode 100644 wp-includes/sodium_compat/src/Core32/XSalsa20.php create mode 100644 wp-includes/sodium_compat/src/Crypto.php create mode 100644 wp-includes/sodium_compat/src/Crypto32.php create mode 100644 wp-includes/sodium_compat/src/File.php create mode 100644 wp-includes/sodium_compat/src/PHP52/SplFixedArray.php create mode 100644 wp-includes/sodium_compat/src/SodiumException.php create mode 100644 wp-includes/spl-autoload-compat.php create mode 100644 wp-includes/taxonomy.php create mode 100644 wp-includes/template-loader.php create mode 100644 wp-includes/template.php create mode 100644 wp-includes/theme-compat/comments.php create mode 100644 wp-includes/theme-compat/embed-404.php create mode 100644 wp-includes/theme-compat/embed-content.php create mode 100644 wp-includes/theme-compat/embed.php create mode 100644 wp-includes/theme-compat/footer-embed.php create mode 100644 wp-includes/theme-compat/footer.php create mode 100644 wp-includes/theme-compat/header-embed.php create mode 100644 wp-includes/theme-compat/header.php create mode 100644 wp-includes/theme-compat/sidebar.php create mode 100644 wp-includes/theme.php create mode 100644 wp-includes/update.php create mode 100644 wp-includes/user.php create mode 100644 wp-includes/vars.php create mode 100644 wp-includes/version.php create mode 100644 wp-includes/widgets.php create mode 100644 wp-includes/widgets/class-wp-nav-menu-widget.php create mode 100644 wp-includes/widgets/class-wp-widget-archives.php create mode 100644 wp-includes/widgets/class-wp-widget-calendar.php create mode 100644 wp-includes/widgets/class-wp-widget-categories.php create mode 100644 wp-includes/widgets/class-wp-widget-custom-html.php create mode 100644 wp-includes/widgets/class-wp-widget-links.php create mode 100644 wp-includes/widgets/class-wp-widget-media-audio.php create mode 100644 wp-includes/widgets/class-wp-widget-media-gallery.php create mode 100644 wp-includes/widgets/class-wp-widget-media-image.php create mode 100644 wp-includes/widgets/class-wp-widget-media-video.php create mode 100644 wp-includes/widgets/class-wp-widget-media.php create mode 100644 wp-includes/widgets/class-wp-widget-meta.php create mode 100644 wp-includes/widgets/class-wp-widget-pages.php create mode 100644 wp-includes/widgets/class-wp-widget-recent-comments.php create mode 100644 wp-includes/widgets/class-wp-widget-recent-posts.php create mode 100644 wp-includes/widgets/class-wp-widget-rss.php create mode 100644 wp-includes/widgets/class-wp-widget-search.php create mode 100644 wp-includes/widgets/class-wp-widget-tag-cloud.php create mode 100644 wp-includes/widgets/class-wp-widget-text.php create mode 100644 wp-includes/wlwmanifest.xml create mode 100644 wp-includes/wp-db.php create mode 100644 wp-includes/wp-diff.php create mode 100644 wp-links-opml.php create mode 100644 wp-load.php create mode 100644 wp-login.php create mode 100644 wp-mail.php create mode 100644 wp-settings.php create mode 100644 wp-signup.php create mode 100644 wp-trackback.php create mode 100644 xmlrpc.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2308684 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +.idea/ +composer.lock +.env +# ignore log file +debug.log + +# ignore nodejs files +node_modules + +# ignore uploads +wp-content/uploads/* +!wp-content/uploads/.htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..4d35c87 --- /dev/null +++ b/.htaccess @@ -0,0 +1,15 @@ + +# BEGIN WordPress +# Les directives (lignes) entre 'BEGIN WordPress' et 'END WordPress' sont +# généré dynamiquement, et ne doivent uniquement être modifiées via les filtres WordPress. +# Toute modification des directives entre ces marqueurs sera outrepassée. + +RewriteEngine On +RewriteBase / +RewriteRule ^index\.php$ - [L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule . /index.php [L] + + +# END WordPress \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..e4ed1a3 --- /dev/null +++ b/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "vlucas/phpdotenv": "^4.1" + } +} diff --git a/content/index.php b/content/index.php new file mode 100644 index 0000000..6220032 --- /dev/null +++ b/content/index.php @@ -0,0 +1,2 @@ +>cMBR^g1ZI?1PcjHNCG6>|2sAJ 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 z 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 JEK~h}{{u7p5(@wT literal 0 HcmV?d00001 diff --git a/content/languages/admin-fr_FR.po b/content/languages/admin-fr_FR.po new file mode 100644 index 0000000..618b52a --- /dev/null +++ b/content/languages/admin-fr_FR.po @@ -0,0 +1,13976 @@ +# Translation of WordPress - 5.4.x - Development - Administration in French (France) +# This file is distributed under the same license as the WordPress - 5.4.x - Development - Administration package. +msgid "" +msgstr "" +"PO-Revision-Date: 2020-07-12 17:47:00+0000\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 > 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: fr\n" +"Project-Id-Version: WordPress - 5.4.x - Development - Administration\n" + +#: wp-admin/includes/schema.php:400 +msgctxt "default GMT offset or timezone string" +msgid "0" +msgstr "Europe/Paris" + +#. translators: Default start of the week. 0 = Sunday, 1 = Monday. +#: wp-admin/includes/schema.php:416 +msgctxt "start of week" +msgid "1" +msgstr "1" + +#: wp-admin/includes/media.php:1709 wp-admin/upgrade.php:77 +#: wp-admin/upgrade.php:153 +msgid "Continue" +msgstr "Continuer" + +#: wp-admin/includes/theme.php:304 +msgid "Wide Blocks" +msgstr "Blocs larges" + +#: wp-admin/includes/theme.php:281 +msgid "Block Editor Styles" +msgstr "Styles de l’éditeur de bloc" + +#: wp-admin/about.php:188 +msgid "See progress as you process export and erasure requests through the privacy tools." +msgstr "Suivez l’évolution du traitement des demandes d’exportation et d’effacement grâce aux outils de protection de confidentialité." + +#: wp-admin/about.php:187 +msgid "Now personal data exports include users session information and users location data from the community events widget. Plus, a table of contents!" +msgstr "Désormais, les exportations de données personnelles comprennent les informations sur les sessions des utilisateurs et les données de localisation des utilisateurs à partir du widget des événements communautaires. Plus, une table des matières !" + +#: wp-admin/includes/privacy-tools.php:491 +msgid "Unable to add data to JSON file." +msgstr "Impossible d’ajouter des données au fichier JSON." + +#: wp-admin/edit-form-comment.php:108 +msgid "Spam" +msgstr "Indésirable" + +#. translators: %s: wp-config.php +#: wp-admin/setup-config.php:399 +msgid "Unable to write to %s file." +msgstr "Impossible d’écrire dans le fichier %s." + +#. translators: %s: WordPress 5.4 Field Guide link. +#: wp-admin/about.php:259 +msgid "There’s lots more for developers to love in WordPress 5.4. To discover more and learn how to make these changes shine on your sites, themes, plugins and more, check the WordPress 5.4 Field Guide." +msgstr "Il y a bien d’autres choses faites pour les développeuses et les développeurs dans WordPress 5.4. Pour en découvrir davantage et apprendre à tirer parti de ces modifications pour vos sites, vos thèmes ou vos extensions, consultez le guide technique de WordPress 5.4." + +#: wp-admin/about.php:246 +msgid "In embeds, now the block editor supports TikTok—and CollegeHumor is gone." +msgstr "Dans les contenus embarqués, l’éditeur de bloc prend maintenant en charge TikTok et CollegeHumor a été retiré." + +#: wp-admin/about.php:245 +msgid "Let users do more with two new APIs: block variations and gradients." +msgstr "Laissez les utilisateurs en faire plus avec deux nouvelles APIs : variations de bloc et dégradés." + +#: wp-admin/about.php:244 +msgid "If you build plugins, now you can register collections of your blocks by namespace across categories—a great way to get more brand visibility." +msgstr "Si vous créez des extensions, vous pouvez maintenant enregistrer des collections de vos blocs avec des espaces de noms tranversaux aux catégories. Une bonne façon de donner de la visibilité à votre marque." + +#: wp-admin/about.php:243 +msgid "Radically simpler block styling. Negative margins and default padding are gone! Now you can style blocks the way you need them. And, a refactor got rid of four redundant wrapper divs." +msgstr "La mise en forme des blocs est radicalement simplifiée. Fini les marges externes négatives et les marges internes par défaut ! Vous pouvez maintenant mettre en forme les blocs comme vous le souhaitez. De plus, une refactorisation du code généré nous a permis de supprimer plusieurs divs d’encapsulation redondantes." + +#: wp-admin/about.php:241 +msgid "Blocks! Simpler styling, new APIs and embeds" +msgstr "Les blocs ! Une mise en forme plus facile, de nouvelles APIs et contenus embarqués" + +#: wp-admin/about.php:237 +msgid "Check your code and see where these new actions can replace your custom code, and if you’re concerned about duplication, add a check for the WordPress version." +msgstr "Vérifiez votre code et voyez où ces nouvelles actions peuvent remplacer votre code personnalisé, et si vous êtes préoccupé par la duplication, ajoutez une vérification pour la version de WordPress." + +#. translators: %s: 'wp_nav_menu_item_custom_fields_customize_template' action +#. name. +#: wp-admin/about.php:231 +msgid "In the Customizer, %s fires at the end of the menu-items form-fields template." +msgstr "Dans l’outil de personnalisation, %s se déclenche à la fin du modèle contenant les champs de formulaire de gestion du menu." + +#. translators: %s: 'wp_nav_menu_item_custom_fields' action name. +#: wp-admin/about.php:222 +msgid "On the Menus admin screen, %s fires just before the move buttons of a nav menu item in the menu editor." +msgstr "Sur l’écran d’administration des menus, l’action %s se déclenche juste avant les boutons de déplacement des éléments du menu de navigation." + +#: wp-admin/about.php:216 +msgid "Two new actions let you add custom fields to menu items—without a plugin and without writing custom walkers." +msgstr "Deux nouvelles actions vous permettent d’ajouter des champs personnalisés aux menus – sans extension et sans utiliser de « walkers » personnalisés." + +#: wp-admin/about.php:214 +msgid "Add custom fields to menu items—natively" +msgstr "Ajout de champs personnalisés aux éléments de menu - nativement" + +#: wp-admin/about.php:198 +msgid "Just for developers" +msgstr "Juste pour les développeuses et les développeurs " + +#: wp-admin/about.php:189 +msgid "Plus, little enhancements throughout give the privacy tools a little cleaner look. Your eyes will thank you!" +msgstr "De plus, de petites améliorations ont été apportées aux outils de confidentialité pour leur donner un aspect plus net. Vos yeux vous remercieront !" + +#: wp-admin/about.php:185 +msgid "Take a look:" +msgstr "Ainsi :" + +#: wp-admin/about.php:184 +msgid "5.4 helps with a variety of privacy issues around the world. So when users and stakeholders ask about regulatory compliance, or how your team handles user data, the answers should be a lot easier to get right." +msgstr "5.4 aide à résoudre divers problèmes de protection de la vie privée dans le monde. Ainsi, lorsque les utilisateurs et les parties prenantes posent des questions sur le respect de la réglementation ou sur la manière dont votre équipe traite les données des utilisateurs, il devrait être beaucoup plus facile d'obtenir des réponses correctes." + +#: wp-admin/about.php:183 +msgid "Your fundamental right: privacy" +msgstr "Votre droit fondamental : la confidentialité" + +#: wp-admin/about.php:167 +msgid "Of course, if you want to work with the very latest tools and features, install the Gutenberg plugin. You’ll get to be the first to use new and exciting features in the block editor, before anyone else has seen them!" +msgstr "Bien entendu, si vous souhaitez travailler avec les derniers outils et fonctionnalités, installez l’extension Gutenberg. Vous serez la première personne à utiliser les nouvelles fonctionnalités excitantes de l'éditeur de blocs, avant que quiconque ne les ait vues !" + +#: wp-admin/about.php:165 +msgid "Know at a glance whether you’re in a block’s Edit or Navigation mode. Or, if you have restricted vision, your screen reader will tell you which mode you’re in." +msgstr "Sachez en un coup d’œil si vous êtes en mode modification de bloc ou navigation. Ou bien, si vous avez une vision limitée, votre lecteur d’écran vous indiquera dans quel mode vous êtes." + +#: wp-admin/about.php:164 +msgid "Tips are gone. In their place, a Welcome Guide window you can bring up when you need it—and only when you need it—again and again." +msgstr "Les astuces ont disparu. À leur place, une fenêtre de guide de bienvenue s’affiche lorsque vous en avez besoin et uniquement lorsque vous en avez besoin." + +#: wp-admin/about.php:163 +msgid "Speed! 14% faster loading of the editor, 51% faster time-to-type!" +msgstr "Et en vitesse ! Le chargement de l’éditeur est 14 % plus rapide et le temps à attendre avant la saisie est 51 % moins long !" + +#: wp-admin/about.php:162 +msgid "For when you need to navigate with the keyboard, better tabbing and focus. Plus, you can tab over to the sidebar of nearly any block." +msgstr "Pour quand vous avez besoin de naviguer avec le clavier, mieux tabuler et vous concentrer. De plus, vous pouvez tabuler sur la colonne latérale de presque tous les blocs." + +#: wp-admin/about.php:161 +msgid "Clearer block navigation with block breadcrumbs. And easier selection once you get there." +msgstr "Une navigation dans les blocs plus claire via le navigateur de l’éditeur, et une sélection plus facile des blocs." + +#: wp-admin/about.php:159 +msgid "Cleaner UI, clearer navigation—and easier tabbing!" +msgstr "Une interface et une navigation plus claires, et plus facile à utiliser au clavier !" + +#: wp-admin/about.php:152 +msgid "And if you’ve ever thought your image in the Media+Text block should link to something else—perhaps a picture of a brochure should download that brochure as a document? Well, now it can." +msgstr "Le bloc Média + Texte permet maintenant de lier un document joint disponible en téléchargement." + +#: wp-admin/about.php:151 +msgid "Guess a whole lot less! Version 5.4 streamlines the whole process for placing and replacing multimedia in every block. Now it works the same way in almost every block!" +msgstr "La version 5.4 rationalise l’ensemble du processus de placement et de remplacement de média dans chaque bloc. Elle fonctionne désormais de la même manière dans presque tous les blocs !" + +#: wp-admin/about.php:150 +msgid "New ways with color: Gradients in the Buttons and Cover block, toolbar access to color options in Rich Text blocks, and for the first time, color options in the Group and Columns blocks." +msgstr "De nouvelles façons d'utiliser la couleur : dégradés dans les blocs des boutons et de couverture, accès par la barre d’outils aux options de couleur dans les blocs de texte enrichi, et pour la première fois, options de couleur dans les blocs de groupe et de colonnes." + +#: wp-admin/about.php:149 +msgid "Two brand-new blocks: Social Icons and Buttons make adding interactive features fast and easy." +msgstr "Deux blocs tout neufs : les icônes sociales et les boutons rendent rapide et facile l’ajout de fonctionnalités interactives." + +#: wp-admin/about.php:147 +msgid "Two new blocks. And better blocks overall." +msgstr "Deux nouveaux blocs et des améliorations sur tous les blocs existants" + +#: wp-admin/about.php:133 +msgid "And more speed everywhere, so as you build sections or galleries, or just type in a line of prose, you can feel how much faster your work flows." +msgstr "Et plus de vitesse partout, de sorte que lorsque vous construisez des sections ou des galeries, ou que vous rédigez simplement une ligne de poésie, vous pouvez sentir à quel point votre travail s’accélère." + +#: wp-admin/about.php:130 +msgid "More ways to make your vision real, and put blocks in the perfect place—even if a particular kind of block is new to you. More efficient processes." +msgstr "Plus de moyens de concrétiser votre vision et de déposer des blocs à l’endroit idéal - même si un type de bloc particulier est nouveau pour vous. Des processus plus efficaces." + +#: wp-admin/about.php:125 +msgid "More ways to bring your visitors in, and keep them engaged, with the richness of embedded media from the web’s top services." +msgstr "Plus de moyens d’attirer et de fidéliser vos visiteurs grâce à la richesse des médias intégrés depuis les principaux services du web." + +#: wp-admin/about.php:124 +msgid "More ways to make posts and pages come alive with your best images." +msgstr "Plus de moyens de donner vie aux articles et aux pages avec vos meilleures images." + +#: wp-admin/about.php:121 +msgid "Every major release adds more to the block editor." +msgstr "Chaque version majeure améliore l’éditeur de blocs." + +#: wp-admin/about.php:46 +msgid "More ways to make your pages come alive. With easier ways to get it all done and looking better than ever—and boosts in speed you can feel." +msgstr "Plus de moyens pour donner vie à vos pages, avec des moyens plus simples pour en faire plus que jamais avec un meilleur aspect, et une accélération que vous pouvez ressentir." + +#: wp-admin/about.php:44 +msgid "Say hello to more and better." +msgstr "Le meilleur et plus encore." + +#. translators: %s: The options page name. +#: wp-admin/options.php:220 +msgid "Error: Options page %s not found in the options whitelist." +msgstr "Erreur : page d’options %s introuvable dans la liste blanche des options." + +#: wp-admin/themes.php:236 wp-admin/import.php:64 wp-admin/users.php:277 +#: wp-admin/includes/network.php:113 wp-admin/includes/network.php:139 +msgid "Error:" +msgstr "Erreur :" + +#: wp-admin/themes.php:194 wp-admin/network/themes.php:272 +#: wp-admin/network/menu.php:81 +msgctxt "theme" +msgid "Add New" +msgstr "Ajouter un nouveau" + +#. translators: %s: web.config +#. translators: %s: .htaccess +#: wp-admin/options-permalink.php:156 wp-admin/options-permalink.php:169 +msgid "You should update your %s file now." +msgstr "Vous devez mettre à jour votre fichier %s maintenant." + +#: wp-admin/update-core.php:165 +msgid "This localized version contains both the translation and various other localization fixes." +msgstr "Cette version localisée contient à la fois les traductions et d’autres correctifs de localisation." + +#. translators: 1: Number of issues. 2: URL to Site Health screen. +#: wp-admin/includes/dashboard.php:1843 +msgid "Take a look at the %1$d item on the Site Health screen." +msgid_plural "Take a look at the %1$d items on the Site Health screen." +msgstr[0] "Jetez un œil à %1$d élément sur l’écran de santé du site." +msgstr[1] "Jetez un œil à %1$d éléments sur l’écran de santé du site." + +#: wp-admin/includes/dashboard.php:1833 +msgid "Your site’s health is looking good, but there are still some things you can do to improve its performance and security." +msgstr "L’état de santé de votre site semble correct, mais il reste des choses que vous pourriez faire afin d’améliorer ses performances et sa sécurité." + +#: wp-admin/includes/dashboard.php:1831 +msgid "Great job! Your site currently passes all site health checks." +msgstr "Bon travail ! Votre site passe actuellement toutes les vérifications de santé du site." + +#: wp-admin/includes/dashboard.php:1829 +msgid "Your site has critical issues that should be addressed as soon as possible to improve its performance and security." +msgstr "Votre site rencontre des erreurs critiques qui devraient être réglées dès que possible afin d’améliorer ses performances et sa sécurité." + +#. translators: %s: URL to Site Health screen. +#: wp-admin/includes/dashboard.php:1821 +msgid "Site health checks will automatically run periodically to gather information about your site. You can also visit the Site Health screen to gather information about your site now." +msgstr "Des contrôles de santé du site seront automatiquement effectués périodiquement pour recueillir des informations sur votre site. Vous pouvez également vous rendre sur l’écran de Santé du site pour recueillir dès maintenant des informations sur votre site." + +#: wp-admin/includes/dashboard.php:1809 +msgid "No information yet…" +msgstr "Aucune information pour le moment…" + +#. translators: 1: upload_max_filesize, 2: php.ini +#: wp-admin/includes/file.php:770 +msgid "The uploaded file exceeds the %1$s directive in %2$s." +msgstr "Le fichier téléversé dépasse la directive %1$s dans %2$s." + +#: wp-admin/includes/class-wp-comments-list-table.php:204 +msgid "No comments found in Trash." +msgstr "Aucun commentaire trouvé dans la corbeille." + +#. translators: 1: php.ini, 2: post_max_size, 3: upload_max_filesize +#: wp-admin/includes/import.php:87 wp-admin/includes/file.php:819 +msgid "File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your %1$s file or by %2$s being defined as smaller than %3$s in %1$s." +msgstr "Le fichier est vide. Veuillez téléverser quelque chose de plus substantiel. Cette erreur peut également être due au fait que les téléversements sont désactivés dans votre fichier %1$s ou que %2$s est défini comme inférieur à %3$s dans %1$s." + +#: wp-admin/includes/class-wp-site-health.php:2302 +msgid "A test is unavailable" +msgstr "Un test n’est pas disponible" + +#. translators: 1: The WordPress error message. 2: The WordPress error code. +#: wp-admin/includes/class-wp-site-health.php:1867 +#: wp-admin/includes/class-wp-site-health.php:2189 +msgid "Error: %1$s (%2$s)" +msgstr "Erreur : %1$s (%2$s)" + +#. translators: %s: The server PHP version. +#: wp-admin/includes/class-wp-site-health.php:767 +msgid "Your site is running an outdated version of PHP (%s), which requires an update" +msgstr "Votre site utilise une version dépréciée de PHP (%s), ce qui nécessite une mise à niveau." + +#. translators: %s: The server PHP version. +#: wp-admin/includes/class-wp-site-health.php:756 +msgid "Your site is running an older version of PHP (%s), which should be updated" +msgstr "Votre site utilise une version dépréciée de PHP (%s), ce qui devrait être mis à niveau." + +#. translators: %s: The server PHP version. +#: wp-admin/includes/class-wp-site-health.php:744 +msgid "Your site is running an older version of PHP (%s)" +msgstr "Votre site utilise une ancienne version de PHP (%s)" + +#. translators: %s: The current PHP version. +#: wp-admin/includes/class-wp-site-health.php:709 +msgid "Your site is running the current version of PHP (%s)" +msgstr "Votre site utilise la version actuelle de PHP (%s)" + +#: wp-admin/includes/class-wp-media-list-table.php:226 +msgid "No media files found in Trash." +msgstr "Aucun fichier média trouvé dans la corbeille." + +#. translators: Date string for upcoming events. 1: Starting month, 2: Starting +#. day, 3: Ending month, 4: Ending day, 5: Year. +#: wp-admin/includes/class-wp-community-events.php:405 +msgid "%1$s %2$d – %3$s %4$d, %5$d" +msgstr "%1$s %2$d – %3$s %4$d, %5$d" + +#. translators: Upcoming events year format. See https://www.php.net/date +#: wp-admin/includes/class-wp-community-events.php:400 +#: wp-admin/includes/class-wp-community-events.php:410 +msgctxt "upcoming events year format" +msgid "Y" +msgstr "Y" + +#. translators: Upcoming events day format. See https://www.php.net/date +#: wp-admin/includes/class-wp-community-events.php:397 +#: wp-admin/includes/class-wp-community-events.php:398 +#: wp-admin/includes/class-wp-community-events.php:407 +#: wp-admin/includes/class-wp-community-events.php:409 +msgctxt "upcoming events day format" +msgid "j" +msgstr "j" + +#. translators: Date string for upcoming events. 1: Month, 2: Starting day, 3: +#. Ending day, 4: Year. +#: wp-admin/includes/class-wp-community-events.php:394 +msgid "%1$s %2$d–%3$d, %4$d" +msgstr "%1$s %2$d–%3$d, %4$d" + +#. translators: Upcoming events month format. See https://www.php.net/date +#: wp-admin/includes/class-wp-community-events.php:388 +#: wp-admin/includes/class-wp-community-events.php:389 +msgctxt "upcoming events month format" +msgid "F" +msgstr "F" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:210 +msgid "Resend Confirmation Requests" +msgstr "Renvoyer les demandes de confirmation" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:209 +msgid "Delete Requests" +msgstr "Supprimer les demandes" + +#: wp-admin/includes/class-wp-debug-data.php:781 +msgid "Table prefix" +msgstr "Préfixe de table" + +#: wp-admin/includes/privacy-tools.php:398 +msgid "Unable to open export file (JSON report) for writing." +msgstr "Impossible d’ouvrir le fichier d’export (rapport JSON) pour écrire." + +#: wp-admin/credits.php:33 wp-admin/privacy.php:30 wp-admin/freedoms.php:36 +#: wp-admin/about.php:31 +msgid "Building more with blocks, faster and easier." +msgstr "Construisez plus avec les blocs, plus vite et plus facilement." + +#: wp-admin/includes/privacy-tools.php:282 +msgid "↑ Return to top" +msgstr "↑ Retour en haut" + +#: wp-admin/includes/class-wp-site-health.php:1944 +msgid "PHP Default Timezone" +msgstr "Fuseau horaire par défaut de PHP" + +#. translators: %s: date_default_timezone_set() +#: wp-admin/includes/class-wp-site-health.php:1079 +msgid "PHP default timezone was changed after WordPress loading by a %s function call. This interferes with correct calculations of dates and times." +msgstr "Le fuseau horaire par défaut de PHP a été modifié après le chargement de WordPress par un appel à la fonction %s. Cela perturbe le fonctionnement du calcul des dates et des heures." + +#: wp-admin/includes/class-wp-site-health.php:1073 +msgid "PHP default timezone is invalid" +msgstr "Le fuseau horaire par défaut de PHP n’est pas valide." + +#: wp-admin/includes/class-wp-site-health.php:1065 +msgid "PHP default timezone was configured by WordPress on loading. This is necessary for correct calculations of dates and times." +msgstr "Le fuseau horaire par défaut de PHP a été configuré au chargement de WordPress. Ceci est nécessaire au fonctionnement du calcul des dates et des heures." + +#: wp-admin/includes/class-wp-site-health.php:1057 +msgid "PHP default timezone is valid" +msgstr "Le fuseau horaire par défaut de PHP est valide" + +#. translators: %s: add_submenu_page() +#: wp-admin/includes/plugin.php:1395 +msgid "The seventh parameter passed to %s should be an integer representing menu position." +msgstr "Le septième paramètre passé à %s devrait être un nombre entier représentant une position de menu." + +#. translators: 1: WordPress version number, 2: The PHP extension name needed. +#: wp-admin/includes/update-core.php:1013 +msgid "The update cannot be installed because WordPress %1$s requires the %2$s PHP extension." +msgstr "La mise à jour ne peut pas être installée car WordPress %1$s nécessite l’extension PHP %2$s." + +#: wp-admin/includes/class-wp-site-health.php:1200 +msgid "UTF8MB4 is the character set WordPress prefers for database storage because it safely supports the widest set of characters and encodings, including Emoji, enabling better support for non-English languages." +msgstr "WordPress préfère le jeu de caractères UTF8mb4 pour le stockage de ses données, car il propose en toute sécurité le plus large ensemble de caractères et d’encodages, y compris les émojis, ce qui permet de mieux travailler avec les langues autres que l'anglais." + +#: wp-admin/privacy.php:53 +msgid "https://wordpress.org/about/stats/" +msgstr "https://fr.wordpress.org/about/stats/" + +#: wp-admin/js/site-health.js:135 +msgid "All site health tests have finished running. There are items that should be addressed, and the results are now available on the page." +msgstr "Tous les tests de santé du site ont fini de tourner. Il y a des éléments qui devraient être pris en charge, et les résultats sont maintenant disponible sur cette page." + +#: wp-admin/js/site-health.js:134 +msgid "Should be improved" +msgstr "Peut être amélioré" + +#: wp-admin/js/site-health.js:129 +msgid "Good" +msgstr "Bien" + +#: wp-admin/export.php:57 +msgid "Documentation on Export" +msgstr "Documentation sur l’export" + +#: wp-admin/plugin-install.php:109 +msgid "Documentation on Installing Plugins" +msgstr "Documentation sur l’installation d’extensions" + +#: wp-admin/edit.php:301 +msgid "Documentation on Managing Pages" +msgstr "Documentation sur la gestion des Pages" + +#: wp-admin/edit.php:276 +msgid "Documentation on Managing Posts" +msgstr "Documentation sur la gestion des Articles" + +#: wp-admin/options-discussion.php:31 +msgid "Documentation on Discussion Settings" +msgstr "Documentation sur les réglages des commentaires" + +#: wp-admin/theme-install.php:130 +msgid "Documentation on Adding New Themes" +msgstr "Documentation sur l’ajout de nouveaux thèmes" + +#: wp-admin/media-new.php:60 +msgid "Documentation on Uploading Media Files" +msgstr "Documentation sur le téléversement de médias" + +#: wp-admin/users.php:75 +msgid "Descriptions of Roles and Capabilities" +msgstr "Description des rôles et des permissions" + +#: wp-admin/users.php:74 +msgid "Documentation on Managing Users" +msgstr "Documentation sur la gestion des utilisateurs et utilisatrices" + +#: wp-admin/user-edit.php:323 +msgid "More information" +msgstr "Plus d’informations" + +#: wp-admin/user-edit.php:67 +msgid "Documentation on User Profiles" +msgstr "Documentation sur les profils utilisateurs" + +#: wp-admin/options-media.php:37 +msgid "Documentation on Media Settings" +msgstr "Documentation sur les réglages des médias" + +#: wp-admin/widgets.php:83 +msgid "Documentation on Widgets" +msgstr "Documentation sur les widgets" + +#: wp-admin/import.php:31 +msgid "Documentation on Import" +msgstr "Documentation sur l’import" + +#: wp-admin/tools.php:55 +msgid "Documentation on Tools" +msgstr "Documentation sur les outils" + +#: wp-admin/options.php:325 +msgid "This page allows direct access to your site settings. You can break things here. Please be cautious!" +msgstr "Cette page donne un accès direct aux réglages de votre site. Vous pouvez casser des chose ici, donc faites attention !" + +#: wp-admin/options.php:325 +msgid "WARNING!" +msgstr "ATTENTION !" + +#. translators: %s: The option/setting. +#: wp-admin/options.php:273 +msgid "The %s setting is unregistered. Unregistered settings are deprecated. See https://developer.wordpress.org/plugins/settings/settings-api/" +msgstr "Le réglage %s n’est pas enregistré. Les réglages non enregistrés ne sont plus acceptés, comme indiqué sur https://developer.wordpress.org/plugins/settings/settings-api/" + +#: wp-admin/edit-form-advanced.php:374 +msgid "Format — Post Formats designate how your theme will display a specific post. For example, you could have a standard blog post with a title and paragraphs, or a short aside that omits the title and contains a short text blurb. Your theme could enable all or some of 10 possible formats. Learn more about each post format." +msgstr "Format - Un format de publication désigne la manière dont votre thème doit afficher une publication donnée. Par exemple, vous pourriez avoir un article de blog classique, avec titre et paragraphes, ou le format En passant pour ne pas utiliser le titre et n’afficher qu’un court texte. Votre thème peut utiliser jusqu’à 10 formats différents. Lisez la documentation pour obtenir une description de chaque format (en)." + +#: wp-admin/edit-form-advanced.php:331 +msgid "Documentation on Editing Pages" +msgstr "Documentation sur la modification des pages" + +#: wp-admin/edit-form-advanced.php:330 +msgid "Documentation on Adding New Pages" +msgstr "Documentation sur la création de nouvelles pages" + +#: wp-admin/edit-form-advanced.php:313 +msgid "Documentation on Writing and Editing Posts" +msgstr "Documentation sur l’écriture et la modification d’articles" + +#: wp-admin/upload.php:75 wp-admin/upload.php:252 +msgid "Documentation on Media Library" +msgstr "Documentation sur la bibliothèque de médias" + +#: wp-admin/revision.php:145 +msgid "Revisions Management" +msgstr "Gestion des révisions" + +#: wp-admin/media.php:96 wp-admin/edit-form-advanced.php:349 +msgid "Documentation on Edit Media" +msgstr "Documentation sur l’édition des médias" + +#: wp-admin/edit-comments.php:196 +msgid "Documentation on Keyboard Shortcuts" +msgstr "Documentation sur les raccourcis clavier" + +#: wp-admin/edit-comments.php:195 +msgid "Documentation on Comment Spam" +msgstr "Documentation sur les commentaires indésirables" + +#: wp-admin/plugins.php:471 +msgid "Documentation on Managing Plugins" +msgstr "Documentation sur la gestion des extensions" + +#: wp-admin/index.php:107 +msgid "Documentation on Dashboard" +msgstr "Documentation sur le Tableau de bord" + +#: wp-admin/user-new.php:268 +msgid "Documentation on Adding New Users" +msgstr "Documentation sur l’ajout de nouveaux utilisateurs" + +#. translators: %s: URL to Site Health Status page. +#: wp-admin/site-health-info.php:90 +msgid "This page can show you every detail about the configuration of your WordPress website. For any improvements that could be made, see the Site Health Status page." +msgstr "Cette page peut vous afficher tous les détails sur la configuration de votre site WordPress. Pour toute amélioration qui pourrait être apportée, consultez la page État de santé du site." + +#: wp-admin/includes/dashboard.php:1811 wp-admin/site-health-info.php:47 +#: wp-admin/site-health.php:52 +msgid "Results are still loading…" +msgstr "Les résultats sont toujours en cours de chargement…" + +#: wp-admin/options-permalink.php:400 +msgid "Documentation on Nginx configuration." +msgstr "Documentation sur la configuration Nginx." + +#: wp-admin/options-permalink.php:199 +msgid "https://wordpress.org/support/article/using-permalinks/" +msgstr "https://wordpress.org/support/article/using-permalinks/" + +#: wp-admin/options-permalink.php:61 +msgid "Documentation on Using Permalinks" +msgstr "Documentation sur l’utilisation des permaliens" + +#: wp-admin/options-permalink.php:60 +msgid "Documentation on Permalinks Settings" +msgstr "Documentation sur les réglages des permaliens" + +#: wp-admin/update-core.php:730 +msgid "Documentation on Updating WordPress" +msgstr "Documentation sur la mise à jour de WordPress" + +#: wp-admin/update-core.php:251 +msgid "Important: Before updating, please back up your database and files. For help with updates, visit the Updating WordPress documentation page." +msgstr "Important : Avant de mettre à jour, veuillez sauvegarder votre base de données et vos fichiers. Pour une aide sur les mises à jour, visitez la page de documentation Mettre à jour WordPress." + +#: wp-admin/nav-menus.php:604 +msgid "Documentation on Menus" +msgstr "Documentation sur les menus" + +#: wp-admin/plugin-editor.php:143 +msgid "Documentation on Writing Plugins" +msgstr "Documentation sur l’écriture d’extensions" + +#: wp-admin/plugin-editor.php:142 +msgid "Documentation on Editing Plugins" +msgstr "Documentation sur la modification d’extensions" + +#: wp-admin/theme-editor.php:54 +msgid "Documentation on Template Tags" +msgstr "Documentation sur les balises de modèles" + +#: wp-admin/theme-editor.php:53 +msgid "Documentation on Editing Files" +msgstr "Documentation sur la modification de fichiers" + +#: wp-admin/theme-editor.php:52 wp-admin/themes.php:148 +msgid "Documentation on Using Themes" +msgstr "Documentation sur l’utilisation des thèmes" + +#: wp-admin/theme-editor.php:51 +msgid "Documentation on Theme Development" +msgstr "Documentation sur le développement de thèmes" + +#: wp-admin/comment.php:56 wp-admin/edit-comments.php:194 +msgid "Documentation on Comments" +msgstr "Documentation sur les commentaires" + +#: wp-admin/options-general.php:377 +msgid "Documentation on date and time formatting." +msgstr "Documentation sur le formatage de la date et de l’heure." + +#. translators: %s: UTC time. +#: wp-admin/options-general.php:246 +msgid "Universal time is %s." +msgstr "L’heure universelle est %s." + +#. translators: %s: UTC abbreviation +#: wp-admin/options-general.php:235 +msgid "Choose either a city in the same timezone as you or a %s (Coordinated Universal Time) time offset." +msgstr "Choisissez soit une ville dans le même fuseau horaire que vous ou un décalage horaire %s (Temps Universel Coordonné)." + +#: wp-admin/options-general.php:111 +msgid "Administration Email Address" +msgstr "Adresse e-mail d’administration" + +#: wp-admin/options-general.php:100 +msgid "https://wordpress.org/support/article/giving-wordpress-its-own-directory/" +msgstr "https://wordpress.org/support/article/giving-wordpress-its-own-directory/" + +#: wp-admin/options-general.php:48 +msgid "Documentation on General Settings" +msgstr "Documentation sur les réglages généraux" + +#: wp-admin/includes/dashboard.php:1922 +msgid "https://wordpress.org/support/article/first-steps-with-wordpress-b/" +msgstr "https://wordpress.org/support/article/first-steps-with-wordpress-b/" + +#: wp-admin/includes/file.php:319 wp-admin/theme-editor.php:325 +#: wp-admin/plugin-editor.php:296 wp-admin/options-permalink.php:353 +#: wp-admin/options-permalink.php:378 wp-admin/options-permalink.php:411 +msgid "https://wordpress.org/support/article/changing-file-permissions/" +msgstr "https://wordpress.org/support/article/changing-file-permissions/" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/file.php:318 wp-admin/theme-editor.php:324 +#: wp-admin/plugin-editor.php:295 +msgid "You need to make this file writable before you can save your changes. See Changing File Permissions for more information." +msgstr "Vous devez rendre ce fichier accessible en écriture avant de pouvoir enregistrer vos modifications. Consultez Modifier les permissions des fichiers pour plus d’informations." + +#: wp-admin/includes/ajax-actions.php:2430 +msgid "Upload failed. Please reload and try again." +msgstr "Téléversement échoué. Veuillez actualiser et réessayer." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:111 +msgid "Data Erasure has failed." +msgstr "L’effacement des données a échoué." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:66 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:110 +msgid "Erasure completed." +msgstr "Effacement terminé." + +#: wp-admin/includes/image.php:161 +msgid "The attached file cannot be found." +msgstr "Le fichier attaché ne peut pas être trouvé." + +#: wp-admin/includes/template.php:2158 +msgctxt "page label" +msgid "Privacy Policy Page" +msgstr "Page de politique de confidentialité" + +#: wp-admin/includes/template.php:2153 +msgctxt "page label" +msgid "Posts Page" +msgstr "Page des articles" + +#: wp-admin/includes/template.php:2149 +msgctxt "page label" +msgid "Front Page" +msgstr "Page d’accueil" + +#: wp-admin/includes/template.php:2140 +msgctxt "post status" +msgid "Sticky" +msgstr "Épinglé" + +#: wp-admin/includes/template.php:2132 +msgctxt "post status" +msgid "Customization Draft" +msgstr "Brouillon de personnalisation" + +#: wp-admin/includes/template.php:2118 +msgctxt "post status" +msgid "Password protected" +msgstr "Protégé par mot de passe" + +#. translators: %s: The name of the late cron event. +#: wp-admin/includes/class-wp-site-health.php:1605 +msgid "The scheduled event, %s, is late to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended." +msgstr "L'évènement planifié %s, est en retard. Votre site fonctionne toujours, mais cela peut indiquer que la planification des articles ou des mises à jour automatisées peuvent ne pas fonctionner comme prévu." + +#: wp-admin/includes/class-wp-site-health.php:1599 +msgid "A scheduled event is late" +msgstr "Un évènement planifié est en retard" + +#: wp-admin/includes/class-wp-site-health.php:1453 +msgid "An HTTPS connection is a more secure way of browsing the web. Many services now have HTTPS as a requirement. HTTPS allows you to take advantage of new features that can increase site speed, improve search rankings, and gain the trust of your visitors by helping to protect their online privacy." +msgstr "Une connexion HTTPS est un moyen plus sûr de naviguer sur le web. De nombreux services ont maintenant HTTPS comme exigence. HTTPS vous permet de profiter de nouvelles fonctionnalités qui peuvent augmenter la vitesse du site, améliorer les classements de recherche et gagner la confiance de vos visiteurs en aidant à protéger leur vie privée en ligne." + +#. translators: %s: The minimum recommended PHP version. +#: wp-admin/includes/class-wp-site-health.php:721 +msgid "PHP is the programming language used to build and maintain WordPress. Newer versions of PHP are faster and more secure, so staying up to date will help your site’s overall performance and security. The minimum recommended version of PHP is %s." +msgstr "PHP est le langage de programmation utilisé pour construire et maintenir WordPress. Les nouvelles versions de PHP sont plus rapides et plus sécurisées, de sorte que rester à jour aidera les performances globales et la sécurité de votre site. La version minimale recommandée de PHP est %s." + +#. translators: %s: The current version of WordPress installed on this site. +#: wp-admin/includes/class-wp-site-health.php:315 +msgid "Your version of WordPress (%s) is up to date" +msgstr "Votre version de WordPress (%s) est à jour" + +#: wp-admin/includes/ms.php:1152 wp-admin/network/site-new.php:32 +#: wp-admin/network/sites.php:45 +msgid "Documentation on Site Management" +msgstr "Documentation sur la gestion des sites" + +#: wp-admin/includes/meta-boxes.php:792 +msgid "https://wordpress.org/support/article/introduction-to-blogging/#managing-comments" +msgstr "https://wordpress.org/support/article/introduction-to-blogging/#managing-comments" + +#: wp-admin/includes/meta-boxes.php:768 +msgid "https://wordpress.org/support/article/custom-fields/" +msgstr "https://wordpress.org/support/article/custom-fields/" + +#: wp-admin/includes/meta-boxes.php:731 +msgid "https://wordpress.org/support/article/introduction-to-blogging/#comments" +msgstr "https://wordpress.org/support/article/introduction-to-blogging/#comments" + +#. translators: Post date information. %s: Date on which the post is to be +#. published. +#: wp-admin/includes/meta-boxes.php:226 +msgid "Publish on: %s" +msgstr "Publier le : %s" + +#. translators: Post date information. %s: Date on which the post is to be +#. published. +#: wp-admin/includes/meta-boxes.php:223 +msgid "Schedule for: %s" +msgstr "Planifier pour le : %s" + +#. translators: Post date information. %s: Date on which the post was +#. published. +#: wp-admin/includes/meta-boxes.php:218 +msgid "Published on: %s" +msgstr "Publié le : %s" + +#. translators: Post date information. %s: Date on which the post is currently +#. scheduled to be published. +#: wp-admin/includes/meta-boxes.php:215 +msgid "Scheduled for: %s" +msgstr "Planifié pour le : %s" + +#. translators: Publish box time format, see https://www.php.net/date +#: wp-admin/includes/meta-boxes.php:210 wp-admin/includes/meta-boxes.php:398 +#: wp-admin/edit-form-advanced.php:175 wp-admin/edit-form-comment.php:130 +msgctxt "publish box time format" +msgid "H:i" +msgstr "H\\h i \\m\\i\\n" + +#. translators: Publish box date format, see https://www.php.net/date +#: wp-admin/includes/meta-boxes.php:208 wp-admin/includes/meta-boxes.php:396 +#: wp-admin/edit-form-advanced.php:173 wp-admin/edit-form-comment.php:128 +msgctxt "publish box date format" +msgid "M j, Y" +msgstr "j F Y" + +#. translators: 1: Marker. +#: wp-admin/includes/misc.php:136 +msgid "" +"The directives (lines) between `BEGIN %1$s` and `END %1$s` are\n" +"dynamically generated, and should only be modified via WordPress filters.\n" +"Any changes to the directives between these markers will be overwritten." +msgstr "" +"Les directives (lignes) entre 'BEGIN %1$s' et 'END %1$s' sont\n" +"généré dynamiquement, et ne doivent uniquement être modifiées via les filtres WordPress.\n" +"Toute modification des directives entre ces marqueurs sera outrepassée." + +#: wp-admin/includes/image-edit.php:214 +msgid "Rotate right" +msgstr "Tourner vers la droite" + +#: wp-admin/includes/image-edit.php:213 +msgid "Rotate left" +msgstr "Tourner vers la gauche" + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:179 +msgid "All automatic updates are disabled." +msgstr "Toutes les mises à jour automatiques sont désactivées." + +#: wp-admin/includes/class-wp-debug-data.php:793 +msgid "Database collation" +msgstr "Classement de base de données" + +#: wp-admin/includes/class-wp-debug-data.php:787 +msgid "Database charset" +msgstr "Jeu de caractères de la base de données" + +#: wp-admin/includes/class-wp-debug-data.php:145 +msgid "Inactive Themes" +msgstr "Thèmes inactifs" + +#: wp-admin/includes/class-wp-debug-data.php:140 +msgid "Parent Theme" +msgstr "Thème parent" + +#. translators: %s: wp-content directory name. +#: wp-admin/includes/class-wp-debug-data.php:128 +#: wp-admin/includes/class-wp-plugins-list-table.php:576 +msgid "Drop-ins are single files, found in the %s directory, that replace or enhance WordPress features in ways that are not possible for traditional plugins." +msgstr "Les extensions avancées sont des fichiers uniques, trouvés dans le répertoire de %s, qui remplacent ou améliorent les fonctionnalités WordPress d'une manière qui n'est pas possible pour les extensions traditionnelles." + +#. translators: Description for the About section in a personal data export. +#: wp-admin/includes/privacy-tools.php:361 +msgctxt "personal data group description" +msgid "Overview of export report." +msgstr "Vue globale du rapport sur les exportations." + +#: wp-admin/options-writing.php:52 +msgid "Documentation on Writing Settings" +msgstr "Documentation sur les réglages d’écriture" + +#: wp-admin/edit-tags.php:311 +msgid "Documentation on Tags" +msgstr "Documentation sur les étiquettes" + +#: wp-admin/edit-tags.php:307 +msgid "Documentation on Categories" +msgstr "Documentation sur les catégories" + +#. translators: %s: Documentation URL. +#: wp-admin/options-reading.php:169 +msgid "Your theme determines how content is displayed in browsers. Learn more about feeds." +msgstr "Votre thème détermine comment le contenu est affiché dans les navigateurs. En savoir plus sur les flux." + +#: wp-admin/options-reading.php:159 wp-admin/options-reading.php:160 +msgid "For each post in a feed, include" +msgstr "Dans chaque publication du flux, inclure" + +#: wp-admin/options-reading.php:143 +msgid "Warning: these pages should not be the same as your Privacy Policy page!" +msgstr "Avertissement : ces pages ne doivent pas être les mêmes que votre page de politique de confidentialité !" + +#: wp-admin/options-reading.php:51 +msgid "Documentation on Reading Settings" +msgstr "Documentation sur les réglages de lecture" + +#: wp-admin/options-reading.php:34 wp-admin/options-reading.php:170 +msgid "https://wordpress.org/support/article/wordpress-feeds/" +msgstr "https://wordpress.org/support/article/wordpress-feeds/" + +#. translators: %s: Site title. +#: wp-admin/ms-delete-site.php:91 +msgid "[%s] Delete My Site" +msgstr "[%s] Supprimer mon site" + +#: wp-admin/options-discussion.php:58 +msgid "Allow people to submit comments on new posts" +msgstr "Autoriser les commentaires sur les nouvelles publications" + +#: wp-admin/options-discussion.php:46 wp-admin/options-discussion.php:47 +msgid "Default post settings" +msgstr "Réglages de publication par défaut" + +#. translators: %s: Gravatar URL. +#: wp-admin/user-edit.php:586 +msgid "You can change your profile picture on Gravatar." +msgstr "Vous pouvez changer votre image de profil sur Gravatar." + +#: wp-admin/plugins.php:585 +msgid "Plugin resumed." +msgstr "Extension reprise." + +#: wp-admin/plugins.php:581 +msgid "Selected plugins deactivated." +msgstr "Extensions sélectionnées désactivées." + +#: wp-admin/plugins.php:579 +msgid "Plugin deactivated." +msgstr "Extension désactivée." + +#: wp-admin/plugins.php:577 +msgid "Selected plugins activated." +msgstr "Extensions sélectionnées activées." + +#: wp-admin/plugins.php:575 +msgid "Plugin activated." +msgstr "Extension activée." + +#: wp-admin/plugins.php:568 +msgid "The selected plugins have been deleted." +msgstr "Les extensions sélectionnées ont été supprimées." + +#: wp-admin/plugins.php:566 +msgid "The selected plugin has been deleted." +msgstr "L’extension sélectionnée a été supprimée." + +#. translators: 1: Plugin file, 2: Error message. +#: wp-admin/plugins.php:494 +msgid "The plugin %1$s has been deactivated due to an error: %2$s" +msgstr "L’extension %1$s a été désactivée en raison d’une erreur : %2$s" + +#. translators: %s: Link to documentation on child themes. +#: wp-admin/theme-editor.php:369 +msgid "If you need to tweak more than your theme’s CSS, you might want to try making a child theme." +msgstr "Si vous avez besoin d’ajuster plus que le CSS de votre thème, vous voudrez peut-être essayer de faire un thème enfant." + +#: wp-admin/theme-editor.php:361 +msgid "You appear to be making direct edits to your theme in the WordPress dashboard. We recommend that you don’t! Editing your theme directly could break your site and your changes may be lost in future updates." +msgstr "Vous semblez effectuer des modifications directes pour votre thème dans le tableau de bord WordPress. Ce n’est pas recommandé ! Modifier votre thème directement pourrait briser votre site et vos modifications peuvent être perdues avec les futures mises à jour." + +#. translators: Maximum number of words used in a preview of a draft on the +#. dashboard. +#: wp-admin/includes/dashboard.php:609 +msgctxt "draft_length" +msgid "10" +msgstr "10" + +#: wp-admin/includes/file.php:473 wp-admin/theme-editor.php:280 +#: wp-admin/plugin-editor.php:109 +msgid "File does not exist! Please double check the name and try again." +msgstr "Le fichier n’existe pas ! Veuillez vérifier le nom et réessayer." + +#. translators: 1: $image, 2: WP_Image_Editor +#: wp-admin/includes/image-edit.php:286 wp-admin/includes/image-edit.php:355 +#: wp-admin/includes/image-edit.php:502 +msgid "%1$s needs to be a %2$s object." +msgstr "%1$s doit être un objet %2$s." + +#. translators: %s: Recovery Mode exit link. +#: wp-admin/includes/update.php:928 +msgid "You are in recovery mode. This means there may be an error with a theme or plugin. To exit recovery mode, log out or use the Exit button. Exit Recovery Mode" +msgstr "Vous êtes en mode de récupération. Cela signifie qu’il pourrait y avoir une erreur avec un thème ou une extension. Pour sortir du mode de récupération, déconnectez vous ou utilisez le bouton Sortir. Exit Recovery Mode" + +#. translators: Tab heading for Site Health Status page. +#: wp-admin/site-health-info.php:55 wp-admin/site-health.php:60 +msgctxt "Site Health" +msgid "Status" +msgstr "État" + +#. translators: Tab heading for Site Health Info page. +#: wp-admin/site-health-info.php:62 wp-admin/site-health.php:67 +msgctxt "Site Health" +msgid "Info" +msgstr "Informations" + +#: wp-admin/includes/class-wp-debug-data.php:441 +msgid "Themes directory location" +msgstr "Emplacement du répertoire de thèmes" + +#: wp-admin/includes/class-wp-debug-data.php:105 +msgctxt "comment status" +msgid "Closed" +msgstr "Fermé" + +#. translators: %s: Number of critical issues found. +#: wp-admin/site-health.php:105 wp-admin/js/site-health.js:68 +msgid "%s critical issue" +msgid_plural "%s critical issues" +msgstr[0] "%s problème critique" +msgstr[1] "%s problèmes critiques" + +#. translators: 1: Name of the library, 2: Number of version. +#: wp-admin/includes/class-wp-site-health.php:1271 +#: wp-admin/includes/class-wp-site-health.php:1287 +msgid "WordPress’ utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator." +msgstr "Le support de utf8mb4 par WordPress nécessite la bibliothèque MySQL (%1$s) version %2$s ou supérieure. Veuillez contacter votre hébergeur." + +#. translators: %s: Version number. +#: wp-admin/includes/class-wp-site-health.php:1236 +msgid "WordPress’ utf8mb4 support requires MariaDB version %s or greater. Please contact your server administrator." +msgstr "Le support de utf8mb4 par WordPress nécessite MariaDB version %s ou supérieur. Veuillez contacter votre hébergeur." + +#. translators: %s: Version number. +#: wp-admin/includes/class-wp-site-health.php:1216 +msgid "WordPress’ utf8mb4 support requires MySQL version %s or greater. Please contact your server administrator." +msgstr "Le support de utf8mb4 par WordPress nécessite MySQL version %s ou supérieur. Veuillez contacter votre hébergeur." + +#: wp-admin/includes/class-wp-site-health.php:1115 +msgid "Learn more about what WordPress requires to run." +msgstr "En savoir plus sur les pré-requis de fonctionnement de WordPress." + +#. translators: Localized version of WordPress requirements if one exists. +#: wp-admin/includes/class-wp-site-health.php:1114 +msgid "https://wordpress.org/about/requirements/" +msgstr "https://wordpress.org/about/requirements/" + +#: wp-admin/includes/class-wp-site-health.php:1109 +msgid "The SQL server is a required piece of software for the database WordPress uses to store all your site’s content and settings." +msgstr "Le serveur SQL est un élément obligatoire de l’architecture utilisée par WordPress pour stocker les contenus et réglages de votre site." + +#: wp-admin/includes/class-wp-site-health.php:833 +msgid "PHP modules perform most of the tasks on the server that make your site run. Any changes to these must be made by your server administrator." +msgstr "Les modules PHP réalisent la plupart des tâches sur le serveur qui fait fonctionner votre site. Toute modification les concernant doit être réalisée par la personne chargée de l’administration de votre serveur." + +#: wp-admin/includes/dashboard.php:1739 +msgid "PHP is the programming language we use to build and maintain WordPress. Newer versions of PHP are both faster and more secure, so updating will have a positive effect on your site’s performance." +msgstr "PHP est le langage de programmation que nous utilisons pour construire et maintenir WordPress. Les nouvelles versions de PHP sont plus rapide et sécurisées. Ainsi, la mise à jour aura un effet positif sur les performances de votre site." + +#: wp-admin/includes/class-wp-site-health.php:1352 +msgid "Get help resolving this issue." +msgstr "Obtenez de l’aide pour résoudre ce problème." + +#: wp-admin/includes/class-wp-site-health.php:486 +msgid "Manage your themes" +msgstr "Gérez vos thèmes" + +#: wp-admin/includes/class-wp-site-health.php:454 +msgid "Manage inactive plugins" +msgstr "Gérer les extensions inactives" + +#: wp-admin/includes/class-wp-site-health.php:405 +msgid "Update your plugins" +msgstr "Mettez à jour vos extensions" + +#: wp-admin/includes/class-wp-site-health.php:354 +msgid "Manage your plugins" +msgstr "Gérez vos extensions" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:330 +msgid "View Privacy Policy Guide." +msgstr "Voir le guide de politique de confidentialité." + +#: wp-admin/includes/class-wp-debug-data.php:71 +msgid "User Language" +msgstr "Langue de l’utilisateur" + +#. translators: 1: WP_DEBUG_DISPLAY, 2: WP_DEBUG +#: wp-admin/includes/class-wp-site-health.php:1422 +msgid "The value, %1$s, has either been enabled by %2$s or added to your configuration file. This will make errors display on the front end of your site." +msgstr "La valeur, %1$s, a été activée par %2$s ou ajoutée à votre fichier de configuration. Cela fera apparaître les erreurs sur l’interface publique de votre site." + +#. translators: Background update finished notification email subject. %s: Site +#. title. +#: wp-admin/includes/class-wp-automatic-updater.php:938 +msgid "[%s] Background Update Finished" +msgstr "[%s] Mise à jour en arrière-plan terminée" + +#. translators: Background update failed notification email subject. %s: Site +#. title. +#: wp-admin/includes/class-wp-automatic-updater.php:935 +msgid "[%s] Background Update Failed" +msgstr "[%s] Mise à jour en arrière-plan échouée" + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:118 +msgid "Could not confirm that the %s filter is available." +msgstr "Impossible de confirmer si le filtre %s est bien disponible." + +#: wp-admin/plugins.php:520 +msgid "Plugin could not be resumed because it triggered a fatal error." +msgstr "L’extension n’a pas pu être relancée car elle a déclenché une erreur fatale." + +#: wp-admin/includes/class-wp-site-health.php:598 +#: wp-admin/includes/class-wp-site-health.php:644 +msgid "You should remove inactive themes" +msgstr "Vous devriez retirer les thèmes inactifs" + +#: wp-admin/includes/class-wp-site-health.php:573 +msgid "Your site has 1 installed theme, and it is up to date." +msgstr "Votre site a 1 thème installé, et il est à jour." + +#: wp-admin/includes/class-wp-site-health.php:411 +msgid "Your site has 1 active plugin, and it is up to date." +msgstr "Votre site a 1 extension active, et elle est à jour." + +#: wp-admin/site-health.php:126 +msgid "Passed tests" +msgstr "Tests passés" + +#: wp-admin/site-health.php:20 +msgid "Sorry, you are not allowed to access site health information." +msgstr "Désolé, vous n’avez pas l’autorisation d’accéder aux informations de santé du site." + +#: wp-admin/site-health-info.php:100 +msgid "Copy site info to clipboard" +msgstr "Copier les informations du site dans le presse-papier" + +#: wp-admin/site-health-info.php:94 +msgid "If you want to export a handy list of all the information on this page, you can use the button below to copy it to the clipboard. You can then paste it in a text file and save it to your device, or paste it in an email exchange with a support engineer or theme/plugin developer for example." +msgstr "SI vous souhaitez exporter une liste de toutes les informations contenues dans cette page, vous pouvez utiliser le bouton ci-dessous pour les copier dans votre presse-papier. Vous pourrez ensuite les coller dans un fichier texte pour les enregistrer sur votre ordinateur, dans un e-mail d’échange avec un support technique, ou encore dans une discussion avec une développeuse ou un développeur de thème/extension." + +#: wp-admin/site-health-info.php:71 wp-admin/site-health.php:76 +msgid "The Site Health check requires JavaScript." +msgstr "La vérification de santé du site nécessite JavaScript." + +#: wp-admin/site-health-info.php:15 +msgid "Sorry, you are not allowed to access the debug data." +msgstr "Désolé vous n’avez pas l’autorisation d’accéder au données de débogage." + +#: wp-admin/site-health-info.php:12 wp-admin/site-health-info.php:84 +msgid "Site Health Info" +msgstr "Information de santé du site" + +#: wp-admin/update-core.php:366 +msgid "This update doesn’t work with your version of PHP." +msgstr "Cette mise à jour ne fonctionne pas avec votre version de PHP." + +#: wp-admin/includes/class-wp-posts-list-table.php:506 +msgid "All formats" +msgstr "Tous les formats" + +#: wp-admin/includes/class-wp-posts-list-table.php:504 +msgid "Filter by post format" +msgstr "Filtrer par format de publication" + +#: wp-admin/includes/plugin.php:2440 +msgid "Go to the Plugins screen" +msgstr "Aller à l’écran des extensions" + +#. translators: %s: Plugin name. +#: wp-admin/includes/plugin.php:1160 +msgid "Error: Current WordPress version does not meet minimum requirements for %s." +msgstr "Erreur : la version actuelle de WordPress ne répond pas aux prérequis minimums de %s." + +#. translators: %s: Plugin name. +#: wp-admin/includes/plugin.php:1151 +msgid "Error: Current PHP version does not meet minimum requirements for %s." +msgstr "Erreur : La version actuelle de PHP ne répond pas aux prérequis minimums de %s." + +#. translators: %s: Plugin name. +#: wp-admin/includes/plugin.php:1142 +msgid "Error: Current WordPress and PHP versions do not meet minimum requirements for %s." +msgstr "Erreur : Les versions actuelles de WordPress et de PHP ne répondent pas aux prérequis minimums de %s." + +#. translators: %s: The filename of the package. +#: wp-admin/includes/file.php:1337 +msgid "The authenticity of %s could not be verified." +msgstr "L’authenticité de %s ne peut pas être vérifiée." + +#. translators: %s: The filename of the package. +#: wp-admin/includes/file.php:1289 +msgid "The authenticity of %s could not be verified as no signature was found." +msgstr "L’authenticité de %s n'a pas pu être vérifiée car aucune signature n’a été trouvée." + +#. translators: %s: The filename of the package. +#: wp-admin/includes/file.php:1216 wp-admin/includes/file.php:1236 +#: wp-admin/includes/file.php:1270 +msgid "The authenticity of %s could not be verified as signature verification is unavailable on this system." +msgstr "L’authenticité de %s ne peut pas être vérifiée car la vérification des signatures est indisponible sur ce système." + +#. translators: %s: Eraser friendly name. +#: wp-admin/includes/ajax-actions.php:4996 +msgid "Eraser callback is not valid: %s." +msgstr "Le retour de l’outil de suppression n’est pas valide : %s." + +#. translators: %s: Eraser friendly name. +#: wp-admin/includes/ajax-actions.php:4986 +msgid "Eraser does not include a callback: %s." +msgstr "L’outil de suppression n’inclue aucun retour : %s." + +#: wp-admin/includes/ajax-actions.php:4708 +#: wp-admin/includes/ajax-actions.php:4899 +msgid "Sorry, you are not allowed to perform this action." +msgstr "Désolé, vous n’avez pas l’autorisation d’effectuer cette action." + +#. translators: 1: Name of the constant used. 2: List of hostnames whitelisted. +#: wp-admin/includes/class-wp-site-health.php:1793 +msgid "HTTP requests have been blocked by the %1$s constant, with some hosts whitelisted: %2$s." +msgstr "Les requêtes HTTP ont été bloquées par la constante %1$s, avec certains hôtes en liste blanche : %2$s." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health.php:1778 +msgid "HTTP requests have been blocked by the %s constant, with no allowed hosts." +msgstr "Les requêtes HTTP ont été bloquées par la constante %s, avec aucun hôte autorisé." + +#. translators: 1: The name of the drop-in. 2: The name of the database engine. +#: wp-admin/includes/class-wp-site-health.php:1163 +msgid "You are using a %1$s drop-in which might mean that a %2$s database is not being used." +msgstr "Vous utilisez une extension avancée %1$s, ce qui pourrait signifier que la base de données %2$s n’est pas utilisée." + +#. translators: Localized team handbook, if one exists. +#: wp-admin/includes/class-wp-site-health.php:838 +msgid "https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions" +msgstr "https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions" + +#. translators: 1: Link to the hosting group page about recommended PHP +#. modules. 2: Additional link attributes. 3: Accessibility text. +#: wp-admin/includes/class-wp-site-health.php:836 +msgid "The WordPress Hosting Team maintains a list of those modules, both recommended and required, in the team handbook%3$s." +msgstr "L’équipe Hébergement de WordPress maintient une liste des modules recommandés et obligatoires dans le manuel de l’équipe (en anglais)%3$s." + +#: wp-admin/includes/class-wp-site-health.php:244 +#: wp-admin/includes/class-wp-site-health.php:714 +#: wp-admin/includes/class-wp-site-health.php:828 +#: wp-admin/includes/class-wp-site-health.php:1060 +#: wp-admin/includes/class-wp-site-health.php:1104 +#: wp-admin/includes/class-wp-site-health.php:1195 +#: wp-admin/includes/class-wp-site-health.php:1557 +#: wp-admin/includes/class-wp-site-health.php:1705 +#: wp-admin/includes/class-wp-site-health.php:1747 +#: wp-admin/includes/class-wp-site-health.php:1818 +msgid "Performance" +msgstr "Performance" + +#. translators: 1: The amount of inactive themes. 2: The default theme for +#. WordPress. 3: The currently active theme. +#: wp-admin/includes/class-wp-site-health.php:666 +msgid "Your site has %1$d inactive theme, other than %2$s, the default WordPress theme, and %3$s, your active theme." +msgid_plural "Your site has %1$d inactive themes, other than %2$s, the default WordPress theme, and %3$s, your active theme." +msgstr[0] "Votre site a %1$d thème inactif, autre que %2$s, le thème par défaut de WordPress, et %3$s, votre thème actif." +msgstr[1] "Votre site a %1$d thèmes inactifs, autres que %2$s, le thème par défaut de WordPress, et %3$s, votre thème actif." + +#: wp-admin/includes/class-wp-site-health.php:659 +#: wp-admin/includes/class-wp-site-health.php:675 +msgid "We recommend removing any unused themes to enhance your site’s security." +msgstr "Nous recommandons de supprimer tous les thèmes non utilisés pour améliorer la sécurité de votre site." + +#. translators: 1: The amount of inactive themes. 2: The currently active +#. theme. +#: wp-admin/includes/class-wp-site-health.php:651 +msgid "Your site has %1$d inactive theme, other than %2$s, your active theme." +msgid_plural "Your site has %1$d inactive themes, other than %2$s, your active theme." +msgstr[0] "Votre site a %1$d thème inactif, autre que %2$s, votre thème actif." +msgstr[1] "Votre site a %1$d thèmes inactifs, autres que %2$s, votre thème actif." + +#. translators: %d: The number of inactive themes. +#: wp-admin/includes/class-wp-site-health.php:605 +#: wp-admin/includes/class-wp-site-health.php:624 +msgid "Your site has %d inactive theme." +msgid_plural "Your site has %d inactive themes." +msgstr[0] "Votre site a %d thème inactif." +msgstr[1] "Votre site a %d thèmes inactifs." + +#: wp-admin/includes/class-wp-site-health.php:448 +msgid "Inactive plugins are tempting targets for attackers. If you’re not going to use a plugin, we recommend you remove it." +msgstr "Les extensions inactives sont des cibles tentantes pour les hackers. Si vous n’utilisez pas ou plus une extension, nous vous recommandons de la retirer." + +#: wp-admin/includes/class-wp-site-health.php:305 +#: wp-admin/includes/class-wp-site-health.php:344 +#: wp-admin/includes/class-wp-site-health.php:476 +#: wp-admin/includes/class-wp-site-health.php:771 +#: wp-admin/includes/class-wp-site-health.php:1144 +#: wp-admin/includes/class-wp-site-health.php:1310 +#: wp-admin/includes/class-wp-site-health.php:1379 +#: wp-admin/includes/class-wp-site-health.php:1448 +#: wp-admin/includes/class-wp-site-health.php:1511 +#: wp-admin/includes/class-wp-site-health.php:1629 +msgid "Security" +msgstr "Sécurité" + +#: wp-admin/erase-personal-data.php:43 +msgid "Erase personal data list" +msgstr "Supprimer la liste de données personnelles" + +#: wp-admin/erase-personal-data.php:42 +msgid "Erase personal data list navigation" +msgstr "Supprimer la navigation dans la liste de données personnelles" + +#: wp-admin/erase-personal-data.php:41 +msgid "Filter erase personal data list" +msgstr "Filtrer la suppression de la liste de données personnelles" + +#: wp-admin/export-personal-data.php:43 +msgid "Export personal data list" +msgstr "Exporter la liste de données personnelles" + +#: wp-admin/export-personal-data.php:42 +msgid "Export personal data list navigation" +msgstr "Exporter la navigation dans la liste de données personnelles" + +#: wp-admin/export-personal-data.php:41 +msgid "Filter export personal data list" +msgstr "Filtrer l’export de la liste de données personnelles" + +#. translators: %d: The number of inactive plugins. +#: wp-admin/includes/class-wp-site-health.php:441 +msgid "Your site has %d inactive plugin." +msgid_plural "Your site has %d inactive plugins." +msgstr[0] "Votre site a %d extension inactive." +msgstr[1] "Votre site a %d extensions inactives." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:560 +#: wp-admin/includes/plugin-install.php:874 +msgctxt "plugin" +msgid "Cannot Update" +msgstr "Impossible de mettre à jour" + +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number 5: URL to Update PHP page. +#: wp-admin/includes/update.php:512 +msgid "There is a new version of %1$s available, but it doesn’t work with your version of PHP. View version %4$s details or learn more about updating PHP." +msgstr "Il existe une nouvelle version disponible de %1$s, mais elle ne fonctionne pas avec votre version de PHP. Voir les détails de la version %4$s ou en savoir plus sur la mise à jour de PHP." + +#: wp-admin/includes/class-wp-plugins-list-table.php:950 +msgid "This plugin failed to load properly and is paused during recovery mode." +msgstr "Cette extension n’a pas pu se charger correctement et a été mise en pause dans le cadre du mode de récupération." + +#: wp-admin/includes/theme.php:937 +msgid "Go to the Themes screen" +msgstr "Aller à l’écran des thèmes" + +#: wp-admin/includes/class-wp-debug-data.php:1287 +msgid "The directory size calculation has timed out. Usually caused by a very large number of sub-directories and files." +msgstr "Le calcul de la taille du répertoire a expiré. Cela est généralement causé par un très grand nombre de sous-répertoires et de fichiers." + +#: wp-admin/includes/class-wp-debug-data.php:1331 +msgid "Total size is not available. Some errors were encountered when determining the size of your installation." +msgstr "La taille totale n’est pas disponible. Des erreurs ont été rencontrées lors de la détermination de la taille de votre installation." + +#: wp-admin/includes/class-wp-debug-data.php:1280 +msgid "The size cannot be calculated. The directory is not accessible. Usually caused by invalid permissions." +msgstr "La taille ne peut pas être calculée. Le répertoire n’est pas accessible. Usuellement cela est causé par des droits d’accès non valides." + +#: wp-admin/includes/class-wp-debug-data.php:231 +msgid "These settings alter where and how parts of WordPress are loaded." +msgstr "Ces réglages modifient où et comment les parties de WordPress sont chargées." + +#. translators: %s: Number of items with no issues. +#: wp-admin/site-health.php:135 wp-admin/js/site-health.js:72 +msgid "%s item with no issues detected" +msgid_plural "%s items with no issues detected" +msgstr[0] "%s élément sans problème détecté" +msgstr[1] "%s éléments sans problème détectés" + +#. translators: %s: Number of recommended improvements. +#: wp-admin/site-health.php:116 wp-admin/js/site-health.js:70 +msgid "%s recommended improvement" +msgid_plural "%s recommended improvements" +msgstr[0] "%s amélioration recommandée" +msgstr[1] "%s améliorations recommandées" + +#: wp-admin/site-health.php:99 +msgid "The site health check shows critical information about your WordPress configuration and items that require your attention." +msgstr "La vérification de santé du site affiche des informations critiques à propos de votre configuration WordPress et les éléments qui nécessitent votre attention." + +#: wp-admin/includes/dashboard.php:56 wp-admin/site-health.php:17 +#: wp-admin/site-health.php:96 +msgid "Site Health Status" +msgstr "État de santé du site" + +#: wp-admin/site-health.php:90 +msgid "Everything is running smoothly here." +msgstr "Tout fonctionne parfaitement ici." + +#: wp-admin/site-health.php:86 +msgid "Great job!" +msgstr "Bon travail !" + +#: wp-admin/credits.php:37 wp-admin/includes/ms.php:1114 +#: wp-admin/privacy.php:34 wp-admin/nav-menus.php:641 +#: wp-admin/site-health-info.php:51 wp-admin/freedoms.php:40 +#: wp-admin/about.php:35 wp-admin/site-health.php:56 +msgid "Secondary menu" +msgstr "Menu secondaire" + +#: wp-admin/includes/class-wp-site-health.php:2210 +msgid "The loopback request to your site completed successfully." +msgstr "La demande de bouclage vers votre site s’est bien terminée." + +#. translators: %d: The HTTP response code returned. +#: wp-admin/includes/class-wp-site-health.php:2202 +msgid "The loopback request returned an unexpected http status code, %d, it was not possible to determine if this will prevent features from working as expected." +msgstr "La requête de bouclage a renvoyé un code d’état HTTP inattendu, %d. Il n’a pas été possible de déterminer si cela peut empêcher des fonctionnalités de fonctionner convenablement." + +#: wp-admin/includes/class-wp-site-health.php:2186 +msgid "The loopback request to your site failed, this means features relying on them are not currently working as expected." +msgstr "La requête de bouclage sur votre site a échoué, ce qui signifie que les fonctionnalités qui s’appuient sur ces requêtes ne fonctionnent actuellement pas comme elles le devraient." + +#: wp-admin/includes/class-wp-site-health.php:2075 +msgid "No scheduled events exist on this site." +msgstr "Aucun évènement planifié n’existe sur ce site." + +#: wp-admin/includes/class-wp-site-health.php:1995 +msgid "REST API availability" +msgstr "Disponibilité de l’API REST" + +#: wp-admin/includes/class-wp-site-health.php:1986 +msgid "Loopback request" +msgstr "Demande de bouclage" + +#: wp-admin/includes/class-wp-site-health.php:1972 +msgid "Debugging enabled" +msgstr "Débogage activé" + +#: wp-admin/includes/class-wp-site-health.php:1968 +msgid "HTTP Requests" +msgstr "Requêtes HTTP" + +#: wp-admin/includes/class-wp-site-health.php:1964 +msgid "Scheduled events" +msgstr "Évènements planifiés" + +#: wp-admin/includes/class-wp-site-health.php:1960 +msgid "Secure communication" +msgstr "Communication sécurisée" + +#: wp-admin/includes/class-wp-site-health.php:1956 +msgid "HTTPS status" +msgstr "État HTTPS" + +#: wp-admin/includes/class-wp-site-health.php:1952 +msgid "MySQL utf8mb4 support" +msgstr "Prise en charge de utf8mb4 dans MySQL" + +#: wp-admin/includes/class-wp-site-health.php:1940 +msgid "PHP Extensions" +msgstr "Extensions PHP" + +#: wp-admin/includes/class-wp-site-health.php:1948 +msgid "Database Server version" +msgstr "Version du serveur de base de données" + +#: wp-admin/includes/class-wp-site-health.php:1936 +msgid "PHP Version" +msgstr "Version de PHP" + +#: wp-admin/includes/class-wp-site-health.php:1932 +msgid "Theme Versions" +msgstr "Version des thèmes" + +#: wp-admin/includes/class-wp-site-health.php:1928 +msgid "Plugin Versions" +msgstr "Versions des extensions" + +#: wp-admin/includes/class-wp-site-health.php:1924 +msgid "WordPress Version" +msgstr "Version de WordPress" + +#. translators: %s: The name of the query parameter being tested. +#: wp-admin/includes/class-wp-site-health.php:1899 +msgid "The REST API did not process the %s query parameter correctly." +msgstr "L’API REST n’a pas traité correctement le paramètre de la requête %s." + +#: wp-admin/includes/class-wp-site-health.php:1893 +msgid "The REST API did not behave correctly" +msgstr "L’API REST ne s’est pas correctement comportée" + +#. translators: 1: The HTTP error code. 2: The HTTP error message. +#: wp-admin/includes/class-wp-site-health.php:1882 +msgid "The REST API call gave the following unexpected result: (%1$d) %2$s." +msgstr "L’appel à l’API REST a renvoyé le résultat inattendu suivant : (%1$d) %2$s." + +#: wp-admin/includes/class-wp-site-health.php:1876 +msgid "The REST API encountered an unexpected result" +msgstr "L’API REST a rencontré un résultat inattendu" + +#: wp-admin/includes/class-wp-site-health.php:1864 +msgid "The REST API request failed due to an error." +msgstr "La requête API REST a échoué à la suite d’une erreur." + +#: wp-admin/includes/class-wp-site-health.php:1858 +msgid "The REST API encountered an error" +msgstr "L’API REST a rencontré une erreur" + +#: wp-admin/includes/class-wp-site-health.php:1823 +msgid "The REST API is one way WordPress, and other applications, communicate with the server. One example is the block editor screen, which relies on this to display, and save, your posts and pages." +msgstr "L’API REST est l’une des façon pour WordPress ou d’autres applications de communiquer avec le serveur. Un exemple est l’écran de l’éditeur, qui s’appuie dessus pour afficher et enregistrer vos publications." + +#: wp-admin/includes/class-wp-site-health.php:1815 +msgid "The REST API is available" +msgstr "L’API REST est disponible" + +#: wp-admin/includes/class-wp-site-health.php:1787 +msgid "HTTP requests are partially blocked" +msgstr "Les requêtes HTTP sont partiellement bloquées" + +#: wp-admin/includes/class-wp-site-health.php:1772 +msgid "HTTP requests are blocked" +msgstr "Les requêtes HTTP sont bloquées" + +#: wp-admin/includes/class-wp-site-health.php:1752 +msgid "It is possible for site maintainers to block all, or some, communication to other sites and services. If set up incorrectly, this may prevent plugins and themes from working as intended." +msgstr "Il est possible pour les responsables du site de bloquer tout ou partie de la communication vers d’autres sites et services. Si la configuration est incorrecte, cela peut empêcher les extensions et thèmes de fonctionner comme prévu." + +#: wp-admin/includes/class-wp-site-health.php:1744 +msgid "HTTP requests seem to be working as expected" +msgstr "Les requêtes HTTP semblent fonctionner comme prévu" + +#: wp-admin/includes/class-wp-site-health.php:1721 +msgid "Your site could not complete a loopback request" +msgstr "Votre site n’a pas pu terminer la requête de bouclage" + +#: wp-admin/includes/class-wp-site-health.php:1710 +msgid "Loopback requests are used to run scheduled events, and are also used by the built-in editors for themes and plugins to verify code stability." +msgstr "Les requêtes de bouclage sont utilisées pour lancer des évènements planifiés, ainsi que par les éditeurs de thèmes et d’extensions pour vérifier la stabilité du code." + +#: wp-admin/includes/class-wp-site-health.php:1702 +msgid "Your site can perform loopback requests" +msgstr "Votre site peut lancer des requêtes de bouclage" + +#: wp-admin/includes/class-wp-site-health.php:1663 +msgid "Background updates may not be working properly" +msgstr "Les mises à jour d’arrière-plan pourraient ne pas fonctionner correctement" + +#: wp-admin/includes/class-wp-site-health.php:1655 +msgid "Background updates are not working as expected" +msgstr "Les mises à jour d’arrière-plan ne fonctionnent pas comme prévu" + +#: wp-admin/includes/class-wp-site-health.php:1652 +msgid "Passed" +msgstr "Succès" + +#: wp-admin/includes/class-wp-site-health.php:1634 +msgid "Background updates ensure that WordPress can auto-update if a security update is released for the version you are currently using." +msgstr "Les mises à jour d’arrière-plan assurent que WordPress peut se mettre à jour automatiquement si une mise à jour de sécurité est disponible pour la version que vous utilisez actuellement." + +#: wp-admin/includes/class-wp-site-health.php:1626 +msgid "Background updates are working" +msgstr "Les mises à jour d’arrière-plan fonctionnent" + +#. translators: %s: The name of the failed cron event. +#: wp-admin/includes/class-wp-site-health.php:1592 +msgid "The scheduled event, %s, failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended." +msgstr "L’évènement planifié %s a échoué. Votre site fonctionne toujours, mais cela pourrait indiquer que les publications planifiées ou les mises à jour automatiques ne fonctionnent pas comme elles le devraient." + +#: wp-admin/includes/class-wp-site-health.php:1586 +msgid "A scheduled event has failed" +msgstr "Un évènement planifié a échoué" + +#. translators: %s: The error message returned while from the cron scheduler. +#: wp-admin/includes/class-wp-site-health.php:1579 +msgid "While trying to test your site’s scheduled events, the following error was returned: %s" +msgstr "Lors du test des évènements planifiés de votre site, l’erreur suivante a été retournée : %s" + +#: wp-admin/includes/class-wp-site-health.php:1573 +msgid "It was not possible to check your scheduled events" +msgstr "Il n’a pas été possible de vérifier vos évènements planifiés" + +#: wp-admin/includes/class-wp-site-health.php:1562 +msgid "Scheduled events are what periodically looks for updates to plugins, themes and WordPress itself. It is also what makes sure scheduled posts are published on time. It may also be used by various plugins to make sure that planned actions are executed." +msgstr "Les évènements planifiés permettent de vérifier périodiquement les mises à jour d’extensions, de thèmes et de WordPress lui-même. Cela permet également de s’assurer que les publications planifiées sont publiées à temps. Ils sont également utilisés par diverses extensions pour exécuter des actions planifiées." + +#: wp-admin/includes/class-wp-site-health.php:1554 +msgid "Scheduled events are running" +msgstr "Les évènements planifiés fonctionnent" + +#: wp-admin/includes/class-wp-site-health.php:1535 +msgid "Talk to your web host about OpenSSL support for PHP." +msgstr "Demandez à votre hébergeur la prise en charge de OpenSSL pour PHP." + +#: wp-admin/includes/class-wp-site-health.php:1531 +msgid "Your site is unable to communicate securely with other services" +msgstr "Votre site n’est pas en mesure de communiquer en toute sécurité avec d’autres services" + +#: wp-admin/includes/class-wp-site-health.php:1527 +msgid "Your site can communicate securely with other services" +msgstr "Votre site peut communiquer en toute sécurité avec d’autres services" + +#: wp-admin/includes/class-wp-site-health.php:1516 +msgid "Securely communicating between servers are needed for transactions such as fetching files, conducting sales on store sites, and much more." +msgstr "Des communications sécurisées entre serveurs sont nécessaires pour des transactions telles que le parcours de fichiers, la vente sur les boutiques en ligne, et plus encore." + +#: wp-admin/includes/class-wp-site-health.php:1459 +msgid "Learn more about why you should use HTTPS" +msgstr "Découvrez pourquoi vous devriez utiliser HTTPS" + +#. translators: Documentation explaining HTTPS and why it should be used. +#: wp-admin/includes/class-wp-site-health.php:1458 +msgid "https://wordpress.org/support/article/why-should-i-use-https/" +msgstr "https://wordpress.org/support/article/why-should-i-use-https/" + +#: wp-admin/includes/class-wp-site-health.php:1493 +msgid "Your site does not use HTTPS" +msgstr "Votre site n’utilise pas HTTPS" + +#: wp-admin/includes/class-wp-site-health.php:1445 +msgid "Your website is using an active HTTPS connection." +msgstr "Votre site utilise un connexion HTTPS active." + +#: wp-admin/includes/class-wp-site-health.php:1487 +msgid "Update your site addresses" +msgstr "Mettez à jour l’adresse de votre site" + +#. translators: %s: URL to General Settings screen. +#: wp-admin/includes/class-wp-site-health.php:1479 +msgid "You are accessing this website using HTTPS, but your WordPress Address is not set up to use HTTPS by default." +msgstr "Vous accédez à ce site Web en utilisant HTTPS, mais votre Adresse WordPress n’est pas configurée pour utiliser HTTPS par défaut." + +#: wp-admin/includes/class-wp-site-health.php:1473 +msgid "Only parts of your site are using HTTPS" +msgstr "Uniquement certaines parties de votre site utilisent HTTPS" + +#: wp-admin/includes/class-wp-site-health.php:1414 +msgid "Your site is set to display errors to site visitors" +msgstr "Votre site est réglé pour afficher les erreurs aux visiteurs du site" + +#. translators: %s: WP_DEBUG_LOG +#: wp-admin/includes/class-wp-site-health.php:1407 +msgid "The value, %s, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to normal users." +msgstr "La valeur, %s, a été ajouté au fichier de configuration de votre site. Cela signifie que toute erreur sur le site sera enregistrée dans un fichier qui est potentiellement disponible à des utilisateurs normaux." + +#: wp-admin/includes/class-wp-site-health.php:1399 +msgid "Your site is set to log errors to a potentially public file." +msgstr "Votre site est configuré pour enregistrer le journal des erreurs dans un fichier potentiellement public." + +#: wp-admin/includes/class-wp-site-health.php:1384 +msgid "Debug mode is often enabled to gather more details about an error or site failure, but may contain sensitive information which should not be available on a publicly available website." +msgstr "Le mode débogage est souvent activé pour obtenir plus de détails à propos d’une erreur ou d’une défaillance du site, mais peut contenir des informations sensibles qui ne devraient pas être disponibles sur un site web accessible au public." + +#: wp-admin/includes/class-wp-site-health.php:1376 +msgid "Your site is not set to output debug information" +msgstr "Votre site n’est pas réglé pour afficher les informations de débogage" + +#. translators: 1: The IP address WordPress.org resolves to. 2: The error +#. returned by the lookup. +#: wp-admin/includes/class-wp-site-health.php:1341 +msgid "Your site is unable to reach WordPress.org at %1$s, and returned the error: %2$s" +msgstr "Votre site ne peut pas rejoindre WordPress.org sur %1$s et a retourné l’erreur suivante : %2$s" + +#: wp-admin/includes/class-wp-site-health.php:1332 +msgid "Could not reach WordPress.org" +msgstr "Impossible de rejoindre WordPress.org" + +#: wp-admin/includes/class-wp-site-health.php:1315 +msgid "Communicating with the WordPress servers is used to check for new versions, and to both install and update WordPress core, themes or plugins." +msgstr "La communication avec les serveurs WordPress est utilisée pour vérifier l’existence de nouvelles versions et pour installer et mettre à jour le cœur WordPress, les thèmes et les extensions." + +#: wp-admin/includes/class-wp-site-health.php:1307 +msgid "Can communicate with WordPress.org" +msgstr "Peut communiquer avec WordPress.org" + +#: wp-admin/includes/class-wp-site-health.php:1265 +#: wp-admin/includes/class-wp-site-health.php:1281 +msgid "utf8mb4 requires a newer client library" +msgstr "utf8mb4 nécessite une librairie cliente plus récente" + +#: wp-admin/includes/class-wp-site-health.php:1243 +msgid "Your MariaDB version supports utf8mb4." +msgstr "Votre version de MariaDB prend en charge utf8mb4." + +#: wp-admin/includes/class-wp-site-health.php:1230 +msgid "utf8mb4 requires a MariaDB update" +msgstr "utf8mb4 nécessite une mise à jour de MariaDB" + +#: wp-admin/includes/class-wp-site-health.php:1223 +msgid "Your MySQL version supports utf8mb4." +msgstr "Votre version MySQL prend en charge utf8mb4." + +#: wp-admin/includes/class-wp-site-health.php:1210 +msgid "utf8mb4 requires a MySQL update" +msgstr "utf8mb4 nécessite une mise à jour de MySQL" + +#: wp-admin/includes/class-wp-site-health.php:1192 +msgid "UTF8MB4 is supported" +msgstr "UTF8MB4 est pris en charge" + +#. translators: 1: The database engine in use (MySQL or MariaDB). 2: Database +#. server minimum version number. +#: wp-admin/includes/class-wp-site-health.php:1150 +msgid "WordPress requires %1$s version %2$s or higher. Contact your web hosting company to correct this." +msgstr "WordPress nécessite %1$s version %2$s ou plus. Contactez votre hébergeur web pour corriger cela." + +#: wp-admin/includes/class-wp-site-health.php:1143 +msgid "Severely outdated SQL server" +msgstr "Serveur SQL fortement obsolète " + +#. translators: 1: The database engine in use (MySQL or MariaDB). 2: Database +#. server recommended version number. +#: wp-admin/includes/class-wp-site-health.php:1133 +msgid "For optimal performance and security reasons, we recommend running %1$s version %2$s or higher. Contact your web hosting company to correct this." +msgstr "Pour une performance optimale et pour des raisons de sécurité, nous recommandons %1$s version %2$s ou supérieure. Contactez votre hébergeur pour corriger cela." + +#: wp-admin/includes/class-wp-site-health.php:1127 +msgid "Outdated SQL server" +msgstr "Serveur SQL obsolète" + +#: wp-admin/includes/class-wp-site-health.php:1101 +msgid "SQL server is up to date" +msgstr "Le serveur SQL est à jour" + +#: wp-admin/includes/class-wp-site-health.php:1036 +msgid "One or more required modules are missing" +msgstr "Un module nécessaire ou plus sont manquants." + +#: wp-admin/includes/class-wp-site-health.php:1033 +msgid "One or more recommended modules are missing" +msgstr "Un ou plusieurs modules recommandés sont manquants" + +#. translators: %s: The module name. +#: wp-admin/includes/class-wp-site-health.php:1005 +msgid "The optional module, %s, is not installed, or has been disabled." +msgstr "Le module facultatif, %s, n’est pas installé, ou a été désactivé." + +#. translators: %s: The module name. +#: wp-admin/includes/class-wp-site-health.php:997 +msgid "The required module, %s, is not installed, or has been disabled." +msgstr "Le module obligatoire %s n’est pas installé, ou a été désactivé." + +#: wp-admin/includes/class-wp-site-health.php:994 +#: wp-admin/includes/class-wp-site-health.php:1338 +#: wp-admin/includes/class-wp-site-health.php:1659 +msgid "Error" +msgstr "Erreur" + +#: wp-admin/includes/class-wp-site-health.php:825 +msgid "Required and recommended modules are installed" +msgstr "Les modules obligatoires et recommandés sont installés" + +#: wp-admin/includes/class-wp-site-health.php:689 +msgid "Your site does not have any default theme. Default themes are used by WordPress automatically if anything is wrong with your normal theme." +msgstr "Votre site n’a pas de thème par défaut. Les thèmes par défaut sont utilisés par WordPress automatiquement si quelque chose ne va pas avec votre thème actif." + +#: wp-admin/includes/class-wp-site-health.php:685 +msgid "Have a default theme available" +msgstr "Avoir un thème par défaut disponible" + +#. translators: 1: The default theme for WordPress. 2: The currently active +#. theme. 3: The active theme's parent theme. +#: wp-admin/includes/class-wp-site-health.php:633 +msgid "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep %1$s, the default WordPress theme, %2$s, your current theme, and %3$s, its parent theme." +msgstr "Pour améliorer la sécurité de votre site, nous vous recommandons de retirer tous les thèmes que vous n’utilisez pas. Vous devriez conserver %1$s, le thème WordPress par défaut, %2$s, votre thème actuel, et %3$s, son thème parent." + +#. translators: 1: The currently active theme. 2: The active theme's parent +#. theme. +#: wp-admin/includes/class-wp-site-health.php:614 +msgid "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep your current theme, %1$s, and %2$s, its parent theme." +msgstr "Pour améliorer la sécurité de votre site, nous vous recommandons de retirer les thèmes que vous n’utilisez pas. Vous devriez garder uniquement votre thème actuel, %1$s et %2$s, son thème parent." + +#: wp-admin/includes/class-wp-site-health.php:435 +msgid "You should remove inactive plugins" +msgstr "Vous devriez retirer les extensions inactives" + +#. translators: %d: The number of themes. +#: wp-admin/includes/class-wp-site-health.php:580 +msgid "Your site has %d installed theme, and it is up to date." +msgid_plural "Your site has %d installed themes, and they are all up to date." +msgstr[0] "Votre site a %d thème installé et il est à jour." +msgstr[1] "Votre site a %d thèmes installés et ils sont tous à jour." + +#. translators: %d: The number of outdated themes. +#: wp-admin/includes/class-wp-site-health.php:560 +msgid "Your site has %d theme waiting to be updated." +msgid_plural "Your site has %d themes waiting to be updated." +msgstr[0] "Votre site à %d thème en attente de mise à jour." +msgstr[1] "Votre site à %d thèmes en attente de mise à jour." + +#: wp-admin/includes/class-wp-site-health.php:554 +msgid "You have themes waiting to be updated" +msgstr "Vous avez des thèmes en attente de mise à jour" + +#: wp-admin/includes/class-wp-site-health.php:481 +msgid "Themes add your site’s look and feel. It’s important to keep them up to date, to stay consistent with your brand and keep your site secure." +msgstr "Les thèmes concernent l’aspect visuel de votre site. Il est important de les tenir à jour, pour la cohérence de votre identité visuelle et pour garder votre site sécurisé." + +#: wp-admin/includes/class-wp-site-health.php:473 +msgid "Your themes are all up to date" +msgstr "Vos thèmes sont à jour" + +#. translators: %d: The number of active plugins. +#: wp-admin/includes/class-wp-site-health.php:418 +msgid "Your site has %d active plugin, and it is up to date." +msgid_plural "Your site has %d active plugins, and they are all up to date." +msgstr[0] "Votre site a %d extension installée et elle est à jour." +msgstr[1] "Votre site a %d extensions installées et elles sont toutes à jour." + +#. translators: %d: The number of outdated plugins. +#: wp-admin/includes/class-wp-site-health.php:393 +msgid "Your site has %d plugin waiting to be updated." +msgid_plural "Your site has %d plugins waiting to be updated." +msgstr[0] "Votre site a %d extension en attente de mise à jour." +msgstr[1] "Votre site a %d extensions en attente de mise à jour." + +#: wp-admin/includes/class-wp-site-health.php:387 +msgid "You have plugins waiting to be updated" +msgstr "Vous avez des extensions en attente de mise à jour" + +#: wp-admin/includes/class-wp-site-health.php:349 +msgid "Plugins extend your site’s functionality with things like contact forms, ecommerce and much more. That means they have deep access to your site, so it’s vital to keep them up to date." +msgstr "Les extensions étendent les fonctionnalités de votre site avec des choses comme des formulaires de contact, une boutique e-commerce et bien plus. Cela signifie qu’elles ont accès à votre site en profondeur, il est donc vital de les tenir à jour." + +#: wp-admin/includes/class-wp-site-health.php:341 +msgid "Your plugins are all up to date" +msgstr "Vos extensions sont à jour" + +#: wp-admin/includes/class-wp-site-health.php:321 +msgid "You are currently running the latest version of WordPress available, keep it up!" +msgstr "Vous utilisez actuellement la dernière version disponible de WordPress, gardez-la à jour !" + +#: wp-admin/includes/class-wp-site-health.php:308 +msgid "A new minor update is available for your site. Because minor updates often address security, it’s important to install them." +msgstr "Une mise à jour mineure est disponible pour votre site. Comme les mises à jour mineures concernent souvent la sécurité, il est important de les installer." + +#: wp-admin/includes/class-wp-site-health.php:300 +msgid "A new version of WordPress is available." +msgstr "Une nouvelle version de WordPress est disponible." + +#: wp-admin/includes/class-wp-site-health.php:292 +msgid "Install the latest version of WordPress" +msgstr "Installer la dernière version de WordPress" + +#. translators: %s: The latest version of WordPress available. +#: wp-admin/includes/class-wp-site-health.php:285 +msgid "WordPress update available (%s)" +msgstr "Mise à jour de WordPress disponible (%s)" + +#: wp-admin/includes/class-wp-site-health.php:272 +msgid "Check for updates manually" +msgstr "Vérifier les mises à jour manuellement" + +#: wp-admin/includes/class-wp-site-health.php:266 +msgid "We were unable to check if any new versions of WordPress are available." +msgstr "Nous n’avons pas pu vérifier si de nouvelles versions de WordPress sont disponibles." + +#: wp-admin/js/site-health.js:25 +msgid "Site information has been added to your clipboard." +msgstr "Les informations du site ont été ajoutées à votre presse-papier." + +#: wp-admin/js/site-health.js:130 +msgid "All site health tests have finished running. Your site is looking good, and the results are now available on the page." +msgstr "Les vérifications de santé sont terminées. Votre site a bonne mine, et les résultats sont maintenant disponibles sur la page." + +#: wp-admin/js/site-health.js:274 +msgid "All site health tests have finished running." +msgstr "Tous les tests de vérification de santé du site sont terminés." + +#: wp-admin/js/site-health.js:245 +msgid "Please wait..." +msgstr "Veuillez patienter..." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:471 +msgid "WordPress security and maintenance releases are blocked by the %s filter." +msgstr "Les mises à jour de sécurité et de maintenance sont bloquées par le filtre %s." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:459 +msgid "WordPress security and maintenance releases are blocked by %s." +msgstr "Les mises à jour de sécurité et de maintenance sont bloquées par %s." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:439 +msgid "WordPress development updates are blocked by the %s filter." +msgstr "Les mises à jour de développement WordPress sont bloquées par le filtre %s." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:427 +msgid "WordPress development updates are blocked by the %s constant." +msgstr "Les mises à jour de développement WordPress sont bloquées par la constante %s." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:403 +msgid "All of your WordPress files are writable." +msgstr "Tous vos fichiers WordPress sont accessibles en écriture." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:398 +msgid "Some files are not writable by WordPress:" +msgstr "Certains fichiers ne sont pas accessibles par WordPress :" + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:372 +msgid "This could mean that connections are failing to WordPress.org." +msgstr "Cela peut signifier que les connexions à WordPress.org ne fonctionnent pas." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:369 +msgid "Couldn't retrieve a list of the checksums for WordPress %s." +msgstr "Impossible de récupérer une liste des checksums pour WordPress %s." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:322 +msgid "Your installation of WordPress doesn't require FTP credentials to perform updates." +msgstr "Votre installation de WordPress ne nécessite pas d’identifiants FTP pour effectuer les mises à jour." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:313 +msgid "(Your site is performing updates over FTP due to file ownership. Talk to your hosting company.)" +msgstr "(Votre site effectue les mises à jour par FTP en raison de la propriété du fichier. Parlez-en à votre hébergeur.)" + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:312 +msgid "Your installation of WordPress prompts for FTP credentials to perform updates." +msgstr "Votre installation de WordPress demande des informations d’identification FTP pour effectuer les mises à jour." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:295 +msgid "No version control systems were detected." +msgstr "Aucun système de contrôle de version n’a été détecté." + +#. translators: 1: Folder name. 2: Version control directory. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:286 +msgid "The folder %1$s was detected as being under version control (%2$s)." +msgstr "Le dossier %1$s a été détecté comme disposant d’un système de contrôle de version (%2$s)." + +#. translators: 1: Folder name. 2: Version control directory. 3: Filter name. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:273 +msgid "The folder %1$s was detected as being under version control (%2$s), but the %3$s filter is allowing updates." +msgstr "Le dossier %1$s a été détecté comme disposant d’un système de contrôle de version (%2$s), mais le filtre %3$s autorise les mises à jour." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:218 +msgid "We'll try again with the next release." +msgstr "Nous réessayerons avec la prochaine version." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:213 +msgid "A previous automatic background update could not occur." +msgstr "Une précédente mise à jour automatique en arrière-plan n’a pu être effectuée." + +#. translators: %s: Code of error shown. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:204 +#: wp-admin/includes/class-wp-site-health-auto-updates.php:221 +msgid "The error code was %s." +msgstr "Le code d’erreur était %s." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:201 +msgid "When you've been able to update using the \"Update Now\" button on Dashboard > Updates, we'll clear this error for future update attempts." +msgstr "Lorsque vous avez pu mettre à jour en utilisant le bouton \"Mettre à jour maintenant\" dans Tableau de bord > Mises à jour, nous effacerons cette erreur pour de futures tentatives de mise à jour." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:200 +#: wp-admin/includes/class-wp-site-health-auto-updates.php:215 +msgid "You would have received an email because of this." +msgstr "Vous auriez reçu un courriel à cause de cela." + +#: wp-admin/includes/class-wp-site-health-auto-updates.php:199 +msgid "A previous automatic background update ended with a critical failure, so updates are now disabled." +msgstr "Une précédente mise à jour automatique en arrière-plan s'est terminée par un échec critique, les mises à jour sont désormais désactivées." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:152 +msgid "The %s filter is enabled." +msgstr "Le filtre %s est activé." + +#. translators: %s: Name of the filter used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:131 +msgid "A plugin has prevented updates by disabling %s." +msgstr "Une extension a empêché les mises à jour en désactivant %s." + +#. translators: %s: Name of the constant used. +#: wp-admin/includes/class-wp-site-health-auto-updates.php:72 +msgid "The %s constant is defined and enabled." +msgstr "La constante %s est définie et activée." + +#: wp-admin/includes/class-wp-debug-data.php:1070 +msgid "The must use plugins directory" +msgstr "Le répertoire des extensions indispensables" + +#: wp-admin/includes/class-wp-debug-data.php:950 +msgid "Theme features" +msgstr "Fonctionnalités de thèmes" + +#: wp-admin/includes/class-wp-debug-data.php:945 +msgid "Parent theme" +msgstr "Thème parent" + +#: wp-admin/includes/class-wp-debug-data.php:940 +#: wp-admin/includes/class-wp-debug-data.php:995 +msgid "Author website" +msgstr "Site de l’auteur" + +#. translators: %s: Latest WordPress version number. +#. translators: %s: Latest plugin version number. +#. translators: %s: Latest theme version number. +#: wp-admin/includes/class-wp-debug-data.php:49 +#: wp-admin/includes/class-wp-debug-data.php:866 +#: wp-admin/includes/class-wp-debug-data.php:897 +#: wp-admin/includes/class-wp-debug-data.php:969 +#: wp-admin/includes/class-wp-debug-data.php:1049 +msgid "(Latest version: %s)" +msgstr "(dernière version : %s)" + +#. translators: 1: Plugin version number. 2: Plugin author name. +#. translators: 1: Theme version number. 2: Theme author name. +#: wp-admin/includes/class-wp-debug-data.php:810 +#: wp-admin/includes/class-wp-debug-data.php:848 +#: wp-admin/includes/class-wp-debug-data.php:1031 +msgid "Version %1$s by %2$s" +msgstr "Version %1$s par %2$s" + +#: wp-admin/includes/class-wp-debug-data.php:805 +#: wp-admin/includes/class-wp-debug-data.php:843 +#: wp-admin/includes/class-wp-debug-data.php:1026 +msgid "No version or author information is available." +msgstr "Aucune information de version ou d’auteur·e n’est disponible." + +#: wp-admin/includes/class-wp-debug-data.php:753 +msgid "Server version" +msgstr "Version du serveur" + +#: wp-admin/includes/class-wp-debug-data.php:748 +msgid "Extension" +msgstr "Extension" + +#. translators: %s: .htaccess +#: wp-admin/includes/class-wp-debug-data.php:712 +msgid "Your %s file contains only core WordPress features." +msgstr "Votre fichier %s ne contient que des fonctionnalités du cœur WordPress." + +#. translators: %s: .htaccess +#: wp-admin/includes/class-wp-debug-data.php:709 +msgid "Custom rules have been added to your %s file." +msgstr "Des règles personnalisées ont été ajoutées à votre fichier %s." + +#: wp-admin/includes/class-wp-debug-data.php:716 +msgid ".htaccess rules" +msgstr "Règles du .htaccess" + +#: wp-admin/includes/class-wp-debug-data.php:693 +msgid "Is the Imagick library available?" +msgstr "La bibliothèque Imagick est-elle disponible ?" + +#: wp-admin/includes/class-wp-debug-data.php:684 +msgid "Is SUHOSIN installed?" +msgstr "SUHOSIN est-il installé ?" + +#: wp-admin/includes/class-wp-debug-data.php:669 +#: wp-admin/includes/class-wp-debug-data.php:674 +msgid "cURL version" +msgstr "version de cURL" + +#: wp-admin/includes/class-wp-debug-data.php:660 +msgid "PHP post max size" +msgstr "PHP post max size" + +#: wp-admin/includes/class-wp-debug-data.php:656 +msgid "Upload max filesize" +msgstr "Upload max filesize" + +#: wp-admin/includes/class-wp-debug-data.php:652 +msgid "Max input time" +msgstr "Temps d’entrée max" + +#: wp-admin/includes/class-wp-debug-data.php:648 +msgid "PHP memory limit" +msgstr "Limite de mémoire PHP" + +#: wp-admin/includes/class-wp-debug-data.php:644 +msgid "PHP time limit" +msgstr "Limite d’exécution PHP" + +#: wp-admin/includes/class-wp-debug-data.php:640 +msgid "PHP max input variables" +msgstr "Valeur maximale des variables PHP" + +#. translators: %s: ini_get() +#: wp-admin/includes/class-wp-debug-data.php:633 +msgid "Unable to determine some settings, as the %s function has been disabled." +msgstr "Impossible de déterminer certains réglages, car la fonction %s a été désactivée." + +#: wp-admin/includes/class-wp-debug-data.php:630 +msgid "Server settings" +msgstr "Réglages du serveur" + +#: wp-admin/includes/class-wp-debug-data.php:623 +msgid "Unable to determine PHP SAPI" +msgstr "Impossible de déterminer PHP SAPI" + +#: wp-admin/includes/class-wp-debug-data.php:622 +msgid "PHP SAPI" +msgstr "PHP SAPI" + +#: wp-admin/includes/class-wp-debug-data.php:589 +msgid "(Does not support 64bit values)" +msgstr "(ne prend pas en charge les valeurs 64 bits)" + +#: wp-admin/includes/class-wp-debug-data.php:589 +msgid "(Supports 64bit values)" +msgstr "(Supporte les valeurs 64 bits)" + +#: wp-admin/includes/class-wp-debug-data.php:596 +msgid "Unable to determine PHP version" +msgstr "Impossible de déterminer la version de PHP" + +#: wp-admin/includes/class-wp-debug-data.php:617 +msgid "PHP version" +msgstr "Version de PHP" + +#: wp-admin/includes/class-wp-debug-data.php:613 +msgid "Unable to determine what web server software is used" +msgstr "Impossible de déterminer le serveur web utilisé" + +#: wp-admin/includes/class-wp-debug-data.php:612 +msgid "Web server" +msgstr "Serveur web" + +#: wp-admin/includes/class-wp-debug-data.php:608 +msgid "Unable to determine server architecture" +msgstr "Impossible de déterminer l’architecture du serveur" + +#: wp-admin/includes/class-wp-debug-data.php:607 +msgid "Server architecture" +msgstr "Architecture serveur" + +#: wp-admin/includes/class-wp-debug-data.php:569 +msgid "Ghostscript version" +msgstr "Version de Ghostscript" + +#: wp-admin/includes/class-wp-debug-data.php:564 +msgid "Unable to determine if Ghostscript is installed" +msgstr "Impossible de déterminer si Ghostscript est installé" + +#: wp-admin/includes/class-wp-debug-data.php:548 +msgid "GD version" +msgstr "Version de GD" + +#: wp-admin/includes/class-wp-debug-data.php:534 +msgid "Imagick Resource Limits" +msgstr "Limites de ressources Imagick" + +#: wp-admin/includes/class-wp-debug-data.php:509 +msgid "ImageMagick version string" +msgstr "Chaîne de version ImageMagick" + +#: wp-admin/includes/class-wp-debug-data.php:504 +msgid "ImageMagick version number" +msgstr "Numéro de version ImageMagick" + +#: wp-admin/includes/class-wp-debug-data.php:478 +#: wp-admin/includes/class-wp-debug-data.php:500 +#: wp-admin/includes/class-wp-debug-data.php:1315 +msgid "Not available" +msgstr "Non disponible" + +#: wp-admin/includes/class-wp-debug-data.php:490 +msgid "Active editor" +msgstr "Éditeur actif" + +#: wp-admin/includes/class-wp-debug-data.php:464 +msgid "Total installation size" +msgstr "Taille totale de l’installation" + +#: wp-admin/includes/class-wp-debug-data.php:459 +msgid "Database size" +msgstr "Taille de la base de données" + +#: wp-admin/includes/class-wp-debug-data.php:427 +msgid "WordPress directory size" +msgstr "Taille du répertoire de WordPress" + +#: wp-admin/includes/class-wp-debug-data.php:423 +msgid "WordPress directory location" +msgstr "Emplacement du répertoire de WordPress" + +#: wp-admin/includes/class-wp-debug-data.php:454 +msgid "Plugins directory size" +msgstr "Taille du répertoire des extensions" + +#: wp-admin/includes/class-wp-debug-data.php:450 +msgid "Plugins directory location" +msgstr "Emplacement du répertoire des extensions" + +#: wp-admin/includes/class-wp-debug-data.php:445 +msgid "Themes directory size" +msgstr "Taille du répertoire des thèmes" + +#: wp-admin/includes/class-wp-debug-data.php:954 +#: wp-admin/includes/class-wp-debug-data.php:1000 +msgid "Theme directory location" +msgstr "Emplacement du répertoire des thèmes" + +#: wp-admin/includes/class-wp-debug-data.php:436 +msgid "Uploads directory size" +msgstr "Taille du répertoire des téléversements" + +#: wp-admin/includes/class-wp-debug-data.php:432 +msgid "Uploads directory location" +msgstr "Emplacement du répertoire des téléversements" + +#. translators: 1: The IP address WordPress.org resolves to. 2: The error +#. returned by the lookup. +#: wp-admin/includes/class-wp-debug-data.php:409 +msgid "Unable to reach WordPress.org at %1$s: %2$s" +msgstr "Impossible d’atteindre WordPress.org à %1$s : %2$s" + +#: wp-admin/includes/class-wp-debug-data.php:401 +msgid "WordPress.org is reachable" +msgstr "WordPress.org est accessible" + +#: wp-admin/includes/class-wp-debug-data.php:400 +#: wp-admin/includes/class-wp-debug-data.php:406 +#: wp-admin/includes/class-wp-site-health.php:1978 +msgid "Communication with WordPress.org" +msgstr "Communication avec WordPress.org" + +#: wp-admin/includes/class-wp-debug-data.php:383 +msgid "Network count" +msgstr "Nombre de réseaux" + +#: wp-admin/includes/class-wp-debug-data.php:378 +msgid "Site count" +msgstr "Nombre de sites" + +#: wp-admin/includes/class-wp-debug-data.php:373 +#: wp-admin/includes/class-wp-debug-data.php:390 +msgid "User count" +msgstr "Nombre d’utilisatrices et d’utilisateurs" + +#: wp-admin/includes/class-wp-debug-data.php:349 +msgid "The themes directory" +msgstr "Le répertoire de thèmes" + +#: wp-admin/includes/class-wp-debug-data.php:344 +msgid "The plugins directory" +msgstr "Le répertoire d’extensions" + +#: wp-admin/includes/class-wp-debug-data.php:339 +msgid "The uploads directory" +msgstr "Le répertoire des téléversements" + +#: wp-admin/includes/class-wp-debug-data.php:334 +msgid "The wp-content directory" +msgstr "Le répertoire wp-content" + +#: wp-admin/includes/class-wp-debug-data.php:330 +#: wp-admin/includes/class-wp-debug-data.php:335 +#: wp-admin/includes/class-wp-debug-data.php:340 +#: wp-admin/includes/class-wp-debug-data.php:345 +#: wp-admin/includes/class-wp-debug-data.php:350 +#: wp-admin/includes/class-wp-debug-data.php:1071 +msgid "Not writable" +msgstr "Non accessible en écriture" + +#: wp-admin/includes/class-wp-debug-data.php:330 +#: wp-admin/includes/class-wp-debug-data.php:335 +#: wp-admin/includes/class-wp-debug-data.php:340 +#: wp-admin/includes/class-wp-debug-data.php:345 +#: wp-admin/includes/class-wp-debug-data.php:350 +#: wp-admin/includes/class-wp-debug-data.php:1071 +msgid "Writable" +msgstr "Accessible en écriture" + +#: wp-admin/includes/class-wp-debug-data.php:329 +msgid "The main WordPress directory" +msgstr "Le répertoire principal de WordPress" + +#: wp-admin/includes/class-wp-debug-data.php:326 +msgid "Shows whether WordPress is able to write to the directories it needs access to." +msgstr "Montre si WordPress est capable ou non d’écrire dans les répertoires auxquels il a besoin d’accéder." + +#: wp-admin/includes/class-wp-debug-data.php:325 +msgid "Filesystem Permissions" +msgstr "Droits des fichiers système" + +#: wp-admin/includes/class-wp-debug-data.php:198 +#: wp-admin/includes/class-wp-debug-data.php:207 +#: wp-admin/includes/class-wp-debug-data.php:216 +#: wp-admin/includes/class-wp-debug-data.php:225 +#: wp-admin/includes/class-wp-debug-data.php:240 +#: wp-admin/includes/class-wp-debug-data.php:245 +#: wp-admin/includes/class-wp-debug-data.php:307 +#: wp-admin/includes/class-wp-debug-data.php:312 +#: wp-admin/includes/class-wp-debug-data.php:941 +#: wp-admin/includes/class-wp-debug-data.php:996 +msgid "Undefined" +msgstr "Indéfini" + +#: wp-admin/includes/class-wp-debug-data.php:230 +msgid "WordPress Constants" +msgstr "Constantes WordPress" + +#: wp-admin/includes/class-wp-debug-data.php:180 +msgid "Database" +msgstr "Base de données" + +#: wp-admin/includes/class-wp-debug-data.php:175 +msgid "The options shown below relate to your server setup. If changes are required, you may need your web host’s assistance." +msgstr "Les options ci-dessous sont relatives à votre configuration serveur. Si des modifications sont nécessaires, vous pourriez avoir besoin de l’assistance de votre hébergeur." + +#: wp-admin/includes/class-wp-debug-data.php:174 +msgid "Server" +msgstr "Serveur" + +#: wp-admin/includes/class-wp-debug-data.php:169 +msgid "Media Handling" +msgstr "Prise en charge des médias" + +#: wp-admin/includes/class-wp-debug-data.php:163 +msgid "Inactive Plugins" +msgstr "Extensions inactives" + +#: wp-admin/includes/class-wp-debug-data.php:157 +msgid "Active Plugins" +msgstr "Extensions actives" + +#: wp-admin/includes/class-wp-debug-data.php:151 +msgid "Must Use Plugins" +msgstr "Extensions indispensables" + +#: wp-admin/includes/class-wp-debug-data.php:135 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:700 +msgid "Active Theme" +msgstr "Thème actif" + +#: wp-admin/includes/class-wp-debug-data.php:124 +msgid "Drop-ins" +msgstr "Avancées" + +#: wp-admin/includes/class-wp-debug-data.php:118 +msgid "Directories and Sizes" +msgstr "Répertoires et tailles" + +#: wp-admin/includes/class-wp-debug-data.php:109 +msgid "Is this a multisite?" +msgstr "S’agit-il d’un multisite ?" + +#: wp-admin/includes/class-wp-debug-data.php:104 +msgid "Default comment status" +msgstr "État par défaut des commentaires" + +#: wp-admin/includes/class-wp-debug-data.php:99 +msgid "Can anyone register on this site?" +msgstr "Tout le monde peut-il s’inscrire sur ce site ?" + +#: wp-admin/includes/class-wp-debug-data.php:94 +msgid "Is this site using HTTPS?" +msgstr "Est-ce que ce site utilise HTTPS ?" + +#: wp-admin/includes/class-wp-debug-data.php:90 +msgid "No permalink structure set" +msgstr "Aucune structure de permaliens définie" + +#: wp-admin/includes/class-wp-debug-data.php:89 +msgid "Permalink structure" +msgstr "Structure des permaliens" + +#: wp-admin/includes/class-wp-debug-data.php:84 +msgid "Site URL" +msgstr "URL du site" + +#: wp-admin/includes/class-wp-debug-data.php:79 +msgid "Home URL" +msgstr "URL de la page d’accueil" + +#: wp-admin/site-health-info.php:35 wp-admin/site-health.php:40 +#: wp-admin/menu.php:281 +msgid "Site Health" +msgstr "Santé du site" + +#. translators: %s: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:157 +msgctxt "requests" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Tous (%s)" +msgstr[1] "Tous (%s)" + +#: wp-admin/menu.php:246 wp-admin/network/menu.php:107 +msgid "Plugin Editor" +msgstr "Éditeur d’extension" + +#: wp-admin/menu.php:223 wp-admin/network/menu.php:82 +msgid "Theme Editor" +msgstr "Éditeur de thème" + +#: wp-admin/options-discussion.php:92 +msgid "Show comments cookies opt-in checkbox, allowing comment author cookies to be set" +msgstr "Afficher la case à cocher pour accepter les cookies sur les commentaires, ce qui permet l’enregistrement de cookies pour les auteurs de commentaires." + +#: wp-admin/theme-install.php:316 +msgid "Next theme" +msgstr "Thème suivant" + +#: wp-admin/theme-install.php:315 +msgid "Previous theme" +msgstr "Thème précédent" + +#: wp-admin/user-edit.php:508 +msgid "If you change this, we will send you an email at your new address to confirm it. The new address will not become active until confirmed." +msgstr "Si vous modifiez cela nous vous enverrons un e-mail de confirmation à votre nouvelle adresse. La nouvelle adresse ne sera pas active tant que vous n’aurez pas confirmé." + +#: wp-admin/themes.php:225 +msgid "Theme resumed." +msgstr "Thème relancé." + +#: wp-admin/themes.php:229 +msgid "Theme could not be resumed because it triggered a fatal error." +msgstr "Le thème n’a pas pu être relancé car il a déclenché une erreur fatale." + +#: wp-admin/plugins.php:518 +msgid "If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin." +msgstr "Si vous remarquez des messages « headers already sent », des problèmes avec vos flux de syndication ou d’autres soucis, essayez de désactiver ou de supprimer cette extension." + +#. translators: %d: Number of characters. +#: wp-admin/plugins.php:511 +msgid "The plugin generated %d character of unexpected output during activation." +msgid_plural "The plugin generated %d characters of unexpected output during activation." +msgstr[0] "Cette extension a généré %d caractère de sortie inattendu lors de son activation." +msgstr[1] "Cette extension a généré %d caractères de sortie inattendus lors de son activation." + +#: wp-admin/plugins.php:403 +msgid "Sorry, you are not allowed to resume this plugin." +msgstr "Désolé, vous n’êtes pas autorisé à relancer cette extension." + +#. translators: %s: WordPress Planet URL. +#: wp-admin/index.php:87 +msgid "WordPress Events and News — Upcoming events near you as well as the latest news from the official WordPress project and the WordPress Planet." +msgstr "Évènements et actualités WordPress – évènements à venir près de chez vous et dernières actualités officielles du projet WordPress ainsi que de l’écosystème WordPress." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number +#. including locale if necessary. +#: wp-admin/update-core.php:129 +msgid "You can update to WordPress %2$s automatically:" +msgstr "Vous pouvez mettre à jour vers WordPress %2$s automatiquement :" + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required MySQL version number, 4: Current MySQL version number. +#: wp-admin/update-core.php:120 wp-admin/upgrade.php:118 +msgid "You cannot update because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s." +msgstr "Vous ne pouvez pas mettre à jour car WordPress %2$s nécessite MySQL version %3$s ou plus. Vous utilisez la version %4$s." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Current PHP version number. +#: wp-admin/update-core.php:111 wp-admin/upgrade.php:109 +msgid "You cannot update because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s." +msgstr "Vous ne pouvez pas mettre à jour car WordPress %2$s nécessite PHP version %3$s ou plus. Vous utilisez la version %4$s." + +#: wp-admin/nav-menus.php:871 +msgid "Add menu items" +msgstr "Ajouter des éléments de menu" + +#. translators: %s: URL to create a new menu. +#: wp-admin/nav-menus.php:838 +msgid "or create a new menu. Don’t forget to save your changes!" +msgstr "ou créez un nouveau menu. N’oubliez pas d’enregistrer vos modifications !" + +#: wp-admin/nav-menus.php:788 wp-admin/nav-menus.php:850 +msgid "Click the Save Menu button to save your changes." +msgstr "Cliquer sur le bouton « Enregistrer le menu » pour enregistrer vos modifications." + +#. translators: %s: URL to create a new menu. +#: wp-admin/nav-menus.php:776 +msgid "Edit your menu below, or create a new menu. Don’t forget to save your changes!" +msgstr "Modifiez votre menu ci-dessous, ou créez un nouveau menu. N’oubliez pas d’enregistrer vos modifications !" + +#: wp-admin/nav-menus.php:769 +msgid "Fill in the Menu Name and click the Create Menu button to create your first menu." +msgstr "Remplissez le nom du menu et cliquez sur le bouton « Créer le menu » pour créer votre premier menu." + +#: wp-admin/nav-menus.php:768 +msgid "Create your first menu below." +msgstr "Créez votre premier menu ci-dessous." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required MySQL version number, 4: Current MySQL version number. +#: wp-admin/install.php:259 +msgid "You cannot install because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s." +msgstr "Vous ne pouvez pas poursuivre l’installation car WordPress %2$s nécessite MySQL version %3$s ou plus. Vous utilisez la version %4$s." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Current PHP version number. +#: wp-admin/install.php:256 +msgid "You cannot install because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s." +msgstr "Vous ne pouvez pas poursuivre l’installation car WordPress %2$s nécessite PHP version %3$s ou plus. Vous utilisez la version %4$s." + +#: wp-admin/includes/dashboard.php:1905 +msgid "Set up your homepage" +msgstr "Mettre en place votre page d’accueil" + +#: wp-admin/includes/class-wp-site-health.php:728 +#: wp-admin/includes/dashboard.php:1746 +msgid "Learn more about updating PHP" +msgstr "En savoir plus sur la mise à jour de PHP" + +#: wp-admin/includes/dashboard.php:1738 +msgid "What is PHP and how does it affect my site?" +msgstr "Qu’est-ce que PHP et comment cela affecte t-il mon site ?" + +#: wp-admin/includes/dashboard.php:1732 +msgid "WordPress has detected that your site is running on an outdated version of PHP." +msgstr "WordPress a détecté que votre site tourne sur une version obsolète de PHP." + +#: wp-admin/includes/dashboard.php:1730 +msgid "WordPress has detected that your site is running on an insecure version of PHP." +msgstr "WordPress a détecté que votre site tourne sur une version non sécurisée de PHP." + +#: wp-admin/includes/dashboard.php:42 +msgid "PHP Update Required" +msgstr "Mise à jour de PHP nécessaire" + +#: wp-admin/includes/plugin.php:2438 +msgid "You can find more details and make changes on the Plugins screen." +msgstr "Vous pouvez trouver davantage de détails et faire des modifications sur l’écran des extensions." + +#: wp-admin/includes/plugin.php:2437 +msgid "One or more plugins failed to load properly." +msgstr "Le chargement d’une ou plusieurs extensions a échoué." + +#: wp-admin/includes/plugin.php:2410 +msgid "Could not resume the plugin." +msgstr "Impossible de relancer l’extension." + +#: wp-admin/includes/plugin.php:495 +msgid "Custom PHP fatal error handler." +msgstr "Gestionnaire d’erreur fatale PHP personnalisée." + +#: wp-admin/includes/plugin.php:494 +msgid "Custom PHP error message." +msgstr "Message d’erreur PHP personnalisé." + +#: wp-admin/includes/class-language-pack-upgrader.php:122 +msgid "Could not remove the old translation." +msgstr "Impossible de retirer l’ancienne traduction." + +#: wp-admin/includes/class-language-pack-upgrader.php:121 +msgid "Removing the old version of the translation…" +msgstr "Retrait de l’ancienne version de la traduction…" + +#. translators: %s: URL to WordPress Updates screen. +#: wp-admin/includes/plugin-install.php:829 +msgid "Click here to update WordPress." +msgstr "Cliquer ici pour mettre WordPress à jour." + +#: wp-admin/includes/plugin-install.php:825 +msgid "Error: This plugin requires a newer version of WordPress." +msgstr "Erreur : Cette extension nécessite une version plus récente de WordPress." + +#. translators: %s: URL to Update PHP page. +#: wp-admin/includes/plugin-install.php:808 +msgid "Click here to learn more about updating PHP." +msgstr "Cliquez ici pour en apprendre davantage sur la mise à jour de PHP." + +#. translators: %s: Widget title. +#: wp-admin/includes/widgets.php:257 +msgid "Add widget: %s" +msgstr "Ajouter le widget : %s" + +#. translators: %s: Widgets sidebar name. +#: wp-admin/includes/widgets.php:95 +msgid "Add to: %s" +msgstr "Ajouter à : %s" + +#. translators: Audio file track information. %s: Audio track number. +#: wp-admin/includes/media.php:367 +msgid "Track %s." +msgstr "Piste %s." + +#: wp-admin/includes/plugin-install.php:804 +msgid "Error: This plugin requires a newer version of PHP." +msgstr "Erreur : Cette extension nécessite une version plus récente de PHP." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:379 +msgid "Copy this section to clipboard" +msgstr "Copier cette section dans le presse-papier" + +#: wp-admin/includes/schema.php:1232 +msgid "My Network" +msgstr "Mon réseau" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:683 +msgid "This plugin doesn’t work with your version of PHP." +msgstr "Cette extension ne fonctionne pas avec votre version de PHP." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:674 +msgid "This plugin doesn’t work with your version of WordPress." +msgstr "Cette extension ne fonctionne pas avec votre version de WordPress." + +#. translators: %s: URL to Update PHP page. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:668 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:687 +#: wp-admin/includes/update-core.php:960 wp-admin/install.php:244 +#: wp-admin/update-core.php:88 wp-admin/update-core.php:369 +#: wp-admin/upgrade.php:88 +msgid "Learn more about updating PHP." +msgstr "En apprendre davantage sur la mise à jour de PHP." + +#. translators: %s: URL to WordPress Updates screen. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:662 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:678 +msgid "Please update WordPress." +msgstr "Veuillez mettre à jour WordPress." + +#. translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:654 +msgid "Please update WordPress, and then learn more about updating PHP." +msgstr "Veuillez mettre à jour WordPress puis apprenez-en davantage sur la mise à jour de PHP." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:650 +msgid "This plugin doesn’t work with your versions of WordPress and PHP." +msgstr "Cette extension ne fonctionne pas avec vos versions de WordPress et de PHP." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:538 +#: wp-admin/includes/plugin-install.php:862 +msgctxt "plugin" +msgid "Cannot Install" +msgstr "Impossible d’installer" + +#. translators: %s: WordPress version. +#. translators: %s: WordPress version +#: wp-admin/includes/update.php:300 wp-admin/install.php:239 +#: wp-admin/update-core.php:82 wp-admin/upgrade.php:83 wp-admin/about.php:73 +#: wp-admin/about.php:98 +msgid "https://wordpress.org/support/wordpress-version/version-%s/" +msgstr "https://wordpress.org/support/wordpress-version/version-%s/" + +#: wp-admin/includes/class-wp-plugins-list-table.php:728 +#: wp-admin/themes.php:423 +msgid "Resume" +msgstr "Relancer" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:727 +msgctxt "plugin" +msgid "Resume %s" +msgstr "Relancer %s" + +#: wp-admin/includes/theme.php:935 +msgid "You can find more details and make changes on the Themes screen." +msgstr "Vous trouverez plus de détails et pouvez apporter des modifications sur l’écran des thèmes." + +#: wp-admin/includes/theme.php:934 +msgid "One or more themes failed to load properly." +msgstr "Un ou plusieurs thèmes ont échoués à se charger correctement." + +#. translators: %s: Default category. +#: wp-admin/edit-tags.php:598 +msgid "Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the default category %s. The default category cannot be deleted." +msgstr "Supprimer une catégorie ne supprime pas les articles de cette catégorie. Les articles ayant été assignés uniquement à cette catégorie se voient assignés à la catégorie par défaut, « %s ». La catégorie par défaut ne peut pas être supprimée." + +#: wp-admin/includes/theme.php:907 +msgid "Could not resume the theme." +msgstr "Impossible de relancer le thème." + +#. translators: %s: A link to install the Classic Editor plugin. +#: wp-admin/edit-form-blocks.php:438 +msgid "The block editor requires JavaScript. Please enable JavaScript in your browser settings, or try the Classic Editor plugin." +msgstr "L’éditeur nécessite JavaScript. Veuillez activer JavaScript dans les réglages de votre navigateur, ou essayez l’extension Classic Editor." + +#: wp-admin/post.php:47 +msgid "A post type mismatch has been detected." +msgstr "Une incohérence de type de publication a été détectée." + +#: wp-admin/includes/class-wp-screen.php:295 wp-admin/post.php:20 +msgid "A post ID mismatch has been detected." +msgstr "Une incohérence d’identifiant de publication a été détectée." + +#. translators: %s: A link to use the Classic Editor plugin. +#: wp-admin/includes/template.php:1163 +msgid "Please open the classic editor to use this meta box." +msgstr "Veuillez ouvrir l’éditeur classique pour utiliser cette boîte méta." + +#. translators: %s: A link to activate the Classic Editor plugin. +#: wp-admin/includes/template.php:1150 +msgid "Please activate the Classic Editor plugin to use this meta box." +msgstr "Veuillez activer l’extension Classic Editor pour utiliser cette boîte méta." + +#. translators: %s: A link to install the Classic Editor plugin. +#: wp-admin/includes/template.php:1140 +msgid "Please install the Classic Editor plugin to use this meta box." +msgstr "Veuillez installer l’extension Classic Editor pour utiliser cette boîte méta." + +#: wp-admin/includes/template.php:1131 +msgid "This meta box isn't compatible with the block editor." +msgstr "Cette boîte méta n’est pas compatible avec le nouvel éditeur." + +#: wp-admin/freedoms.php:83 +msgid "To distribute copies of your modified versions to others." +msgstr "la liberté d'améliorer le programme et de distribuer ces améliorations au public, pour en faire profiter toute la communauté." + +#: wp-admin/freedoms.php:82 +msgid "The 4th Freedom" +msgstr "La quatrième liberté" + +#: wp-admin/freedoms.php:78 +msgid "To redistribute." +msgstr "La liberté de redistribution ;" + +#: wp-admin/freedoms.php:77 +msgid "The 3rd Freedom" +msgstr "La troisième liberté" + +#: wp-admin/freedoms.php:73 +msgid "To study how the program works and change it to make it do what you wish." +msgstr "La liberté d’étudier le fonctionnement du programme et de l’adapter à ses besoins ;" + +#: wp-admin/freedoms.php:72 +msgid "The 2nd Freedom" +msgstr "La deuxième liberté" + +#: wp-admin/freedoms.php:68 +msgid "To run the program for any purpose." +msgstr "La liberté d’exécuter le programme, pour tous les usages ;" + +#: wp-admin/freedoms.php:67 +msgid "The 1st Freedom" +msgstr "La première liberté" + +#. translators: Use this to specify the CSS font family for the default font. +#: wp-admin/edit-form-blocks.php:183 +msgctxt "CSS Font Family for Editor Font" +msgid "Noto Serif" +msgstr "Noto Serif" + +#. translators: First post content. %s: Site link. +#: wp-admin/includes/upgrade.php:228 +msgid "Welcome to WordPress. This is your first post. Edit or delete it, then start writing!" +msgstr "Bienvenue sur WordPress. Ceci est votre premier article. Modifiez-le ou supprimez-le, puis commencez à écrire !" + +#. translators: First page content. %s: Site admin URL. +#: wp-admin/includes/upgrade.php:318 +msgid "As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!" +msgstr "En tant que nouvel utilisateur ou utilisatrice de WordPress, vous devriez vous rendre sur votre tableau de bord pour supprimer cette page et créer de nouvelles pages pour votre contenu. Amusez-vous bien !" + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:312 +msgid "The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community." +msgstr "La société 123 Machin Truc a été créée en 1971, et n’a cessé de proposer au public des machins-trucs de qualité depuis lors. Située à Saint-Remy-en-Bouzemont-Saint-Genest-et-Isson, 123 Machin Truc emploie 2 000 personnes, et fabrique toutes sortes de bidules super pour la communauté bouzemontoise." + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:307 +msgid "...or something like this:" +msgstr "...ou quelque chose comme cela :" + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:302 +msgid "Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)" +msgstr "Bonjour ! Je suis un mécanicien qui aspire à devenir acteur, et voici mon site. J’habite à Bordeaux, j’ai un super chien baptisé Russell, et j’aime la vodka-ananas (ainsi qu’être surpris par la pluie soudaine lors de longues balades sur la plage au coucher du soleil)." + +#. translators: First page content. +#: wp-admin/includes/upgrade.php:297 +msgid "This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:" +msgstr "Ceci est une page d’exemple. C’est différent d’un article de blog parce qu’elle restera au même endroit et apparaîtra dans la navigation de votre site (dans la plupart des thèmes). La plupart des gens commencent par une page « À propos » qui les présente aux visiteurs du site. Cela pourrait ressembler à quelque chose comme cela :" + +#: wp-admin/includes/class-wp-posts-list-table.php:1413 +msgid "Export as JSON" +msgstr "Exporter en JSON" + +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-posts-list-table.php:1412 +msgid "Export “%s” as JSON" +msgstr "Exporter « %s » en JSON" + +#: wp-admin/edit.php:361 +msgid "1 block not updated, somebody is editing it." +msgstr "Le bloc n’a pas été mis à jour, quelqu’un est train de modifier." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:369 +msgid "%s block restored from the Trash." +msgid_plural "%s blocks restored from the Trash." +msgstr[0] "%s bloc restauré depuis la corbeille." +msgstr[1] "%s blocs restaurés depuis la corbeille." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:367 +msgid "%s block moved to the Trash." +msgid_plural "%s blocks moved to the Trash." +msgstr[0] "%s bloc déplacé dans la corbeille." +msgstr[1] "%s blocs déplacés dans la corbeille." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:365 +msgid "%s block permanently deleted." +msgid_plural "%s blocks permanently deleted." +msgstr[0] "%s bloc supprimé définitivement." +msgstr[1] "%s blocs supprimés définitivement." + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:360 +msgid "%s block updated." +msgid_plural "%s blocks updated." +msgstr[0] "%s bloc mis à jour." +msgstr[1] "%s blocs mis à jour." + +#: wp-admin/setup-config.php:281 +msgid "Error: \"Table Prefix\" must not be empty." +msgstr "Erreur : le « préfixe de table » ne doit pas être vide." + +#: wp-admin/edit-form-blocks.php:162 +msgid "Default template" +msgstr "Modèle par défaut" + +#. translators: %s: The name of the plugin that generated this meta box. +#: wp-admin/includes/template.php:1129 wp-admin/includes/template.php:1337 +msgid "This meta box, from the %s plugin, isn't compatible with the block editor." +msgstr "Cette boîte méta de l’extension %s n’est pas compatible avec le nouvel éditeur." + +#: wp-admin/includes/post.php:2194 +msgid "Reusable Blocks" +msgstr "Blocs réutilisables" + +#: wp-admin/includes/post.php:2179 +msgid "Layout Elements" +msgstr "Mise en page des éléments" + +#: wp-admin/includes/post.php:2169 +msgid "Common Blocks" +msgstr "Blocs communs" + +#. translators: Header for the About section in a personal data export. +#: wp-admin/includes/privacy-tools.php:359 +msgctxt "personal data group label" +msgid "About" +msgstr "À propos" + +#. translators: Page title of the About WordPress page in the admin. +#: wp-admin/about.php:13 +msgctxt "page title" +msgid "About" +msgstr "À propos" + +#: wp-admin/includes/upgrade.php:379 wp-admin/options-privacy.php:58 +msgid "Privacy Policy" +msgstr "Politique de confidentialité" + +#. translators: 1: URL to edit Privacy Policy page, 2: URL to preview Privacy +#. Policy page. +#: wp-admin/options-privacy.php:161 +msgid "Edit or preview your Privacy Policy page content." +msgstr "Modifier ou prévisualiser le contenu de votre page de politique de confidentialité." + +#: wp-admin/includes/file.php:39 wp-admin/options-privacy.php:123 +msgid "Privacy Policy Page" +msgstr "Page de politique de confidentialité" + +#. translators: %s: Page title. +#: wp-admin/includes/misc.php:1410 +msgid "%s (Draft)" +msgstr "%s (Brouillon)" + +#: wp-admin/options-privacy.php:25 +msgid "Privacy Policy page updated successfully." +msgstr "La page de politique de confidentialité a bien été mise à jour." + +#. translators: %s: admin_init +#: wp-admin/includes/plugin.php:2301 +msgid "The suggested privacy policy content should be added by using the %s (or later) action. Please see the inline documentation." +msgstr "Le contenu suggéré de politique de confidentialité devrait être ajouté en utilisant l’action %s (ou ultérieurement). Veuillez vous référer à la documentation en ligne." + +#. translators: %s: admin_init +#: wp-admin/includes/plugin.php:2290 +msgid "The suggested privacy policy content should be added only in wp-admin by using the %s (or later) action." +msgstr "Le contenu suggéré de politique de confidentialité devrait être ajouté uniquement dans wp-admin en utilisant l’action %s (ou ultérieurement)." + +#: wp-admin/includes/privacy-tools.php:321 +msgid "Unable to create export folder." +msgstr "Impossible de créer le dossier d’export." + +#. translators: %s: Privacy Policy Guide URL. +#: wp-admin/includes/class-wp-privacy-policy-content.php:144 +msgid "The suggested privacy policy text has changed. Please review the guide and update your privacy policy." +msgstr "Le texte suggéré pour votre politique de confidentialité a été modifié. Veuillez relire le guide et mettre à jour votre politique de confidentialité." + +#: wp-admin/options-privacy.php:239 +msgid "There are no pages." +msgstr "Il n’y a aucune page." + +#: wp-admin/options-privacy.php:237 +msgid "Or:" +msgstr "Ou :" + +#: wp-admin/options-privacy.php:133 +msgid "After your Privacy Policy page is set, we suggest that you edit it." +msgstr "Une fois votre page de politique de confidentialité définie, nous vous suggérons de la modifier." + +#. translators: 1: Privacy Policy guide URL, 2: Additional link attributes, 3: +#. Accessibility text. +#: wp-admin/options-privacy.php:175 +msgid "Need help putting together your new Privacy Policy page? Check out our guide%3$s for recommendations on what content to include, along with policies suggested by your plugins and theme." +msgstr "Vous avez besoin d’aide pour créer votre nouvelle page de politique de confidentialité ? Consultez notre guide%3$s pour obtenir des recommandations sur les contenus à inclure. Consultez aussi les suggestions faites par les éditeurs de vos extensions et de votre thème." + +#: wp-admin/privacy-policy-guide.php:20 +msgid "Privacy Policy Guide" +msgstr "Guide de la politique de confidentialité" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:625 +msgid "Visitor comments may be checked through an automated spam detection service." +msgstr "Les commentaires des visiteurs peuvent être vérifiés à l’aide d’un service automatisé de détection des commentaires indésirables." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:575 +msgid "In this subsection you should note what analytics package you use, how users can opt out of analytics tracking, and a link to your analytics provider’s privacy policy, if any." +msgstr "Dans cette sous-section, indiquez les outils de statistiques que vous utilisez pour vos mesures d’audience, et le cas échéant faites un lien vers la politique de confidentialité de votre fournisseur." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:532 +msgid "In this subsection you should note what information may be disclosed by users who can upload media files. All uploaded files are usually publicly accessible." +msgstr "Dans cette sous-section, indiquez les informations qui pourraient être dévoilées par les utilisateurs et utilisatrices pouvant téléverser des fichiers dans votre bibliothèque de médias. Les fichiers téléversés sont généralement accessibles publiquement." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:519 +msgid "In this subsection you should note what information is captured through comments. We have noted the data which WordPress collects by default." +msgstr "Dans cette sous-section, indiquez les informations qui sont récupérées via les commentaires. Nous avons indiqué les données collectées nativement par WordPress." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:503 +msgid "In this section you should note what personal data you collect from users and site visitors. This may include personal data, such as name, email address, personal account preferences; transactional data, such as purchase information; and technical data, such as information about cookies." +msgstr "Dans cette section, indiquez les données personnelles que vous collectez sur les utilisateurs et visiteurs de votre site. Cela pourrait comprendre les données personnelles comme le nom, l’adresse de messagerie, les préférences de compte personnel ; les données transactionnelles comme les informations de commande ; et les données techniques comme les informations sur les cookies." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:476 +msgid "Suggested text:" +msgstr "Texte suggéré :" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:453 +msgid "We have suggested the sections you will need. Under each section heading you will find a short summary of what information you should provide, which will help you to get started. Some sections include suggested policy content, others will have to be completed with information from your theme and plugins." +msgstr "Nous proposons des sections dont vous pourriez avoir besoin. Sous chaque titre de section, vous trouverez un bref résumé des informations que vous devriez fournir, ce qui vous aidera à rédiger votre page. Certaines sections comprennent des contenus suggérés, d’autres devront être complétées par des informations provenant de votre thème et de vos extensions." + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-privacy-policy-content.php:414 +msgid "Source: %s" +msgstr "Source : %s" + +#. translators: %s: Date of privacy policy text update. +#: wp-admin/includes/class-wp-privacy-policy-content.php:400 +msgid "Updated %s." +msgstr "%s mis à jour." + +#. translators: %s: Date of plugin deactivation. +#: wp-admin/includes/class-wp-privacy-policy-content.php:394 +msgid "You deactivated this plugin on %s and may no longer need this policy." +msgstr "Vous avez désactivé l’extension %s et n’avez donc normalement plus besoin de ces informations." + +#. translators: %s: Date of plugin deactivation. +#: wp-admin/includes/class-wp-privacy-policy-content.php:391 +msgid "Removed %s." +msgstr "%s supprimé." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:377 +#: wp-admin/includes/class-wp-privacy-policy-content.php:450 +msgid "Introduction" +msgstr "Introduction" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:328 +msgid "Need help putting together your new Privacy Policy page? Check out our guide for recommendations on what content to include, along with policies suggested by your plugins and theme." +msgstr "Vous avez besoin d’aide pour assembler votre nouvelle page de politique de confidentialité ? Consultez notre guide pour des recommandations sur les contenus à proposer, ainsi que sur les politiques de confidentialité de votre thème et de vos extensions." + +#: wp-admin/includes/privacy-tools.php:884 +msgid "Invalid request ID when processing eraser data." +msgstr "l’ID de la requête a été retourné comme n’étant pas valide lors de l’effacement des données." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:65 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:109 +msgid "Erasing Data..." +msgstr "Effacement des données..." + +#: wp-admin/erase-personal-data.php:60 +msgid "Add Data Erasure Request" +msgstr "Ajout d’une demande d’effacement de données" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:102 +msgid "Send Export Link" +msgstr "Envoyer le lien d’exportation" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:680 +msgid "If you are a member of a regulated industry, or if you are subject to additional privacy laws, you may be required to disclose that information here." +msgstr "Si vous êtes membre d’une industrie régulée, ou si vous êtes sujet à des réglementations spécifiques, il est probablement nécessaire d’afficher ces informations ici." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:676 +msgid "Industry regulatory disclosure requirements" +msgstr "Affichage des informations liées aux secteurs soumis à des régulations spécifiques" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:672 +msgid "If your web site provides a service which includes automated decision making - for example, allowing customers to apply for credit, or aggregating their data into an advertising profile - you must note that this is taking place, and include information about how that information is used, what decisions are made with that aggregated data, and what rights users have over decisions made without human intervention." +msgstr "Si votre site web fourni un service qui inclus la prise de décision automatisée – par exemple, autoriser vos clients à souscrire à un crédit ou agréger leurs données dans un profil publicitaire – vous devez expliciter ce qui est mis en place et inclure des informations sur la façon dont les informations sont utilisées, quelles décisions sont prises avec ces données agrégées et quels sont les droits dont disposent les utilisateurs sur les décisions prises sans intervention humaine." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:668 +msgid "What automated decision making and/or profiling we do with user data" +msgstr "Opérations de marketing automatisé et/ou de profilage réalisées à l’aide des données personnelles" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:664 +msgid "If your web site receives data about users from third parties, including advertisers, this information must be included within the section of your privacy policy dealing with third party data." +msgstr "Si votre site web reçoit des données utilisateurs depuis des sources tierces – ce qui inclus les sources publicitaires – ces informations doivent être incluses dans la section sur les données issues de sources tierces de votre déclaration de protection de la vie privée." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:660 +msgid "What third parties we receive data from" +msgstr "Les services tiers qui nous transmettent des données" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:656 +msgid "In this section you should explain what procedures you have in place to deal with data breaches, either potential or real, such as internal reporting systems, contact mechanisms, or bug bounties." +msgstr "Dans cette section, indiquez les procédures que vous avez mises en place en cas de fuites de données, soit potentielles, soit réelles, comme les systèmes internes de notification, les mécanismes de contact ou les récompenses éventuellement prévues pour les « chasseurs de bogues »." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:652 +msgid "What data breach procedures we have in place" +msgstr "Procédures mises en œuvre en cas de fuite de données" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:648 +msgid "In this section you should explain what measures you have taken to protect your users’ data. This could include technical measures such as encryption; security measures such as two factor authentication; and measures such as staff training in data protection. If you have carried out a Privacy Impact Assessment, you can mention it here too." +msgstr "Dans cette section, indiquez les mesures que vous avez prises pour protéger les données de vos utilisateurs. Cela peut inclure des mesures techniques comme le chiffrement, des mesures de sécurité comme l’authentification à deux facteurs ou des mesures humaines comme la mise en place d’une équipe formée à la protection des données. Si vous avez mené une analyse d’impact liée à la fuite de données privées, vous pouvez également l’indiquer ici." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:644 +msgid "How we protect your data" +msgstr "Comment nous protégeons vos données" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:640 +msgid "If you use your site for commercial purposes and you engage in more complex collection or processing of personal data, you should note the following information in your privacy policy in addition to the information we have already discussed." +msgstr "Si vous utilisez votre site web dans un but commercial et que vous vous engagez dans la collecte et le traitement de données personnelles plus complexes, vous devriez indiquer les informations suivantes dans votre déclaration de protection de la vie privée, en plus des informations détaillées précédemment." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:636 +msgid "Additional information" +msgstr "Informations supplémentaires" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:632 +msgid "In this section you should provide a contact method for privacy-specific concerns. If you are required to have a Data Protection Officer, list their name and full contact details here as well." +msgstr "Dans cette section, indiquez la méthode de contact disponible pour les demandes concernant la vie privée. Si vous devez avoir un Délégué à la Protection des Données, indiquez également son nom et ses coordonnées détaillées." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:628 +msgid "Your contact information" +msgstr "Informations de contact" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:621 +msgid "European data protection law requires data about European residents which is transferred outside the European Union to be safeguarded to the same standards as if the data was in Europe. So in addition to listing where data goes, you should describe how you ensure that these standards are met either by yourself or by your third party providers, whether that is through an agreement such as Privacy Shield, model clauses in your contracts, or binding corporate rules." +msgstr "La loi européenne de protection des données nécessite que les données de résidents européens transférées en dehors de l’Union Européenne soient protégées dans les mêmes conditions que si elles étaient en Europe. En plus de lister les endroits où vont les données, vous devriez décrire comment vous vous assurez, par vous ou par vos sous-traitants, de la mise en conformité avec ces standards, soit par un accord comme le Privacy Shield (Bouclier de Protection des Données UE/États-Unis), des clauses dans vos contrats ou des règles d’entreprise contraignantes." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:619 +msgid "In this section you should list all transfers of your site data outside the European Union and describe the means by which that data is safeguarded to European data protection standards. This could include your web hosting, cloud storage, or other third party services." +msgstr "Listez dans cette section tous les transferts de données de votre site vers l’extérieur de l’Union Européenne et décrire en quoi ces données sont protégées au regard des standards européens de protection des données privées. Cela peut inclure votre hébergeur web, le stockage en « cloud » ou d’autres services tiers." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:615 +msgid "Where we send your data" +msgstr "Transmission de vos données personnelles" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:612 +msgid "If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes." +msgstr "Si vous avez un compte ou si vous avez laissé des commentaires sur le site, vous pouvez demander à recevoir un fichier contenant toutes les données personnelles que nous possédons à votre sujet, incluant celles que vous nous avez fournies. Vous pouvez également demander la suppression des données personnelles vous concernant. Cela ne prend pas en compte les données stockées à des fins administratives, légales ou pour des raisons de sécurité." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:608 +msgid "In this section you should explain what rights your users have over their data and how they can invoke those rights." +msgstr "Dans cette section, indiquez les droits de vos utilisateurs et utilisatrices concernant leurs données et comment ils et elles peuvent exercer ces droits." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:604 +msgid "What rights you have over your data" +msgstr "Les droits que vous avez sur vos données" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:601 +msgid "For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information." +msgstr "Pour les utilisateurs et utilisatrices qui s’inscrivent sur notre site (si cela est possible), nous stockons également les données personnelles indiquées dans leur profil. Tous les utilisateurs et utilisatrices peuvent voir, modifier ou supprimer leurs informations personnelles à tout moment (à l’exception de leur nom d’utilisateur·ice). Les gestionnaires du site peuvent aussi voir et modifier ces informations." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:599 +msgid "If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue." +msgstr "Si vous laissez un commentaire, le commentaire et ses métadonnées sont conservés indéfiniment. Cela permet de reconnaître et approuver automatiquement les commentaires suivants au lieu de les laisser dans la file de modération." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:595 +msgid "In this section you should explain how long you retain personal data collected or processed by the web site. While it is your responsibility to come up with the schedule of how long you keep each dataset for and why you keep it, that information does need to be listed here. For example, you may want to say that you keep contact form entries for six months, analytics records for a year, and customer purchase records for ten years." +msgstr "Dans cette section, indiquez la durée de conservation des données personnelles collectées et traitées par votre site web. Même s’il est de votre responsabilité de fournir un planning de conservation de chaque jeu de données dont vous disposez, cette information n’a pas besoin d’être affichée ici. Par exemple, vous pourriez indiquer que vous conservez les données reçues via vos formulaires de contact pendant six mois, les statistiques de visites pendant un an et les enregistrements liés aux ventes en ligne pendant dix ans." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:591 +msgid "How long we retain your data" +msgstr "Durées de stockage de vos données" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:587 +msgid "By default WordPress does not share any personal data with anyone." +msgstr "Par défaut, WordPress ne partage vos informations personnelles avec personne." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:585 +msgid "In this section you should name and list all third party providers with whom you share site data, including partners, cloud-based services, payment processors, and third party service providers, and note what data you share with them and why. Link to their own privacy policies if possible." +msgstr "Dans cette section, listez et nommez tous les fournisseurs tiers avec qui vous partagez les données de votre site, en incluant les partenaires, les services en « cloud », les passerelles de paiement, et tous les autres services tiers. Indiquez les données que vous partagez et pourquoi vous le faites. Mettez un lien vers leur politique de confidentialité si possible." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:581 +msgid "Who we share your data with" +msgstr "Utilisation et transmission de vos données personnelles" + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:577 +msgid "By default WordPress does not collect any analytics data. However, many web hosting accounts collect some anonymous analytics data. You may also have installed a WordPress plugin that provides analytics services. In that case, add information from that plugin here." +msgstr "Par défaut, WordPress ne collecte aucune statistique des visites. Cependant de nombreux hébergeurs collectent des données statistiques anonymes. Vous pouvez également avoir installé une extension WordPress qui fourni des services de statistiques. Dans ce cas, indiquez les informations sur cette extension ici." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:571 +msgid "Analytics" +msgstr "Statistiques et mesures d’audience" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:568 +msgid "These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website." +msgstr "Ces sites web pourraient collecter des données sur vous, utiliser des cookies, embarquer des outils de suivis tiers, suivre vos interactions avec ces contenus embarqués si vous disposez d’un compte connecté sur leur site web." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:566 +msgid "Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website." +msgstr "Les articles de ce site peuvent inclure des contenus intégrés (par exemple des vidéos, images, articles…). Le contenu intégré depuis d’autres sites se comporte de la même manière que si le visiteur se rendait sur cet autre site." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:564 +msgid "Embedded content from other websites" +msgstr "Contenu embarqué depuis d’autres sites" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:561 +msgid "If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day." +msgstr "En modifiant ou en publiant une publication, un cookie supplémentaire sera enregistré dans votre navigateur. Ce cookie ne comprend aucune donnée personnelle. Il indique simplement l’ID de la publication que vous venez de modifier. Il expire au bout d’un jour." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:559 +msgid "When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed." +msgstr "Lorsque vous vous connecterez, nous mettrons en place un certain nombre de cookies pour enregistrer vos informations de connexion et vos préférences d’écran. La durée de vie d’un cookie de connexion est de deux jours, celle d’un cookie d’option d’écran est d’un an. Si vous cochez « Se souvenir de moi », votre cookie de connexion sera conservé pendant deux semaines. Si vous vous déconnectez de votre compte, le cookie de connexion sera effacé." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:557 +msgid "If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser." +msgstr "Si vous vous rendez sur la page de connexion, un cookie temporaire sera créé afin de déterminer si votre navigateur accepte les cookies. Il ne contient pas de données personnelles et sera supprimé automatiquement à la fermeture de votre navigateur." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:555 +msgid "If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year." +msgstr "Si vous déposez un commentaire sur notre site, il vous sera proposé d’enregistrer votre nom, adresse de messagerie et site web dans des cookies. C’est uniquement pour votre confort afin de ne pas avoir à saisir ces informations si vous déposez un autre commentaire plus tard. Ces cookies expirent au bout d’un an." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:551 +msgid "In this subsection you should list the cookies your web site uses, including those set by your plugins, social media, and analytics. We have provided the cookies which WordPress installs by default." +msgstr "Dans cette sous-section, listez les cookies utilisés par votre site, incluant ceux enregistrés par vos extensions, les réseaux sociaux et vos statistiques de visites. Nous avons indiqué les cookies que WordPress installe par défaut." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:547 +msgid "Cookies" +msgstr "Cookies" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:525 +msgid "An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment." +msgstr "Une chaîne anonymisée créée à partir de votre adresse de messagerie (également appelée hash) peut être envoyée au service Gravatar pour vérifier si vous utilisez ce dernier. Les clauses de confidentialité du service Gravatar sont disponibles ici : https://automattic.com/privacy/. Après validation de votre commentaire, votre photo de profil sera visible publiquement à coté de votre commentaire." + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:523 +msgid "When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection." +msgstr "Quand vous laissez un commentaire sur notre site web, les données inscrites dans le formulaire de commentaire, mais aussi votre adresse IP et l’agent utilisateur de votre navigateur sont collectés pour nous aider à la détection des commentaires indésirables." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:543 +msgid "By default, WordPress does not include a contact form. If you use a contact form plugin, use this subsection to note what personal data is captured when someone submits a contact form, and how long you keep it. For example, you may note that you keep contact form submissions for a certain period for customer service purposes, but you do not use the information submitted through them for marketing purposes." +msgstr "Par défaut, WordPress n’inclut pas de formulaire de contact. Si vous utilisez une extension de formulaire de contact, utilisez cette sous-section pour indiquer quelles données personnelles sont enregistrées lors de la soumission du formulaire, et leur durée de conservation. Par exemple, vous pourriez indiquer que vous conservez les soumissions d’un formulaire de contact pendant une période donnée pour les questions liées au service client, mais que vous ne les utiliserez pas à des fins commerciales." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:539 +msgid "Contact forms" +msgstr "Formulaires de contact" + +#. translators: Default privacy policy text. +#: wp-admin/includes/class-wp-privacy-policy-content.php:536 +msgid "If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website." +msgstr "Si vous êtes un utilisateur ou une utilisatrice enregistré·e et que vous téléversez des images sur le site web, nous vous conseillons d’éviter de téléverser des images contenant des données EXIF de coordonnées GPS. Les visiteurs de votre site web peuvent télécharger et extraire des données de localisation depuis ces images." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:511 +msgid "By default WordPress does not collect any personal data about visitors, and only collects the data shown on the User Profile screen from registered users. However some of your plugins may collect personal data. You should add the relevant information below." +msgstr "Par défaut, WordPress ne collecte aucune donnée personnelle sur les visiteurs, et ne collecte que les données présentes dans l’écran « Votre Profil » des utilisateurs inscrits. Cependant certaines de vos extensions peuvent collecter des données personnelles. Dans ce cas, indiquez les informations adéquates ci-dessous." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:509 +msgid "Personal data is not just created by a user’s interactions with your site. Personal data is also generated from technical processes such as contact forms, comments, cookies, analytics, and third party embeds." +msgstr "Les données personnelles ne sont pas créées par les interactions de vos utilisateurs avec votre site. Elles sont générées par un processus technique comme un formulaire de contact, les commentaires, les cookies ou l’intégration de services tiers." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:507 +msgid "In addition to listing what personal data you collect, you need to note why you collect it. These explanations must note either the legal basis for your data collection and retention or the active consent the user has given." +msgstr "En plus de lister les données personnelles que vous collectez, vous devez indiquer pourquoi vous le faites. Ces explications doivent contenir soit les bases légales de la collecte et la conservation de données, soit le consentement actif donné par l’utilisateur ou l’utilisatrice." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:505 +msgid "You should also note any collection and retention of sensitive personal data, such as data concerning health." +msgstr "Vous devriez également inscrire toute collecte ou conservation de données personnelles sensibles comme des données médicales." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:499 +msgid "What personal data we collect and why we collect it" +msgstr "Utilisation des données personnelles collectées" + +#. translators: Default privacy policy text. %s: Site URL. +#: wp-admin/includes/class-wp-privacy-policy-content.php:496 +msgid "Our website address is: %s." +msgstr "L’adresse de notre site Web est : %s." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:492 +msgid "The amount of information you may be required to show will vary depending on your local or national business regulations. You may, for example, be required to display a physical address, a registered address, or your company registration number." +msgstr "La quantité d’informations que vous devez afficher dépend de la réglementation locale ou nationale à laquelle vous êtes soumis. Vous pourriez par exemple devoir afficher une adresse physique, une adresse publique, ou le numéro d’enregistrement de votre entreprise." + +#. translators: Privacy policy tutorial. +#: wp-admin/includes/class-wp-privacy-policy-content.php:490 +msgid "In this section you should note your site URL, as well as the name of the company, organization, or individual behind it, and some accurate contact information." +msgstr "Dans cette section, indiquez l’URL de votre site, votre nom ou celui de votre entreprise ou organisation ainsi que vos informations de contact." + +#. translators: Default privacy policy heading. +#: wp-admin/includes/class-wp-privacy-policy-content.php:486 +msgid "Who we are" +msgstr "Qui sommes-nous ?" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:455 +msgid "It is your responsibility to write a comprehensive privacy policy, to make sure it reflects all national and international legal requirements on privacy, and to keep your policy current and accurate." +msgstr "Il est de votre responsabilité de rédiger une politique de confidentialité compréhensible, de vous assurer qu’elle reflète les exigences nationales et internationales sur la vie privée et de maintenir cette politique à jour et exacte." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:454 +msgid "Please edit your privacy policy content, making sure to delete the summaries, and adding any information from your theme and plugins. Once you publish your policy page, remember to add it to your navigation menu." +msgstr "Veuillez modifier le contenu de votre politique de confidentialité. Assurez-vous de supprimer les exemples de textes et d’ajouter les différentes informations à propos de vos thèmes et extensions. Une fois votre page publiée, pensez à l’ajouter à votre menu de navigation ou à votre pied de page." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:452 +msgid "This text template will help you to create your web site’s privacy policy." +msgstr "Ce modèle de texte est proposé pour vous aider à créer la politique de confidentialité de votre site." + +#: wp-admin/includes/class-wp-privacy-policy-content.php:451 +msgid "Hello," +msgstr "Bonjour," + +#: wp-admin/options-privacy.php:125 +msgid "As a website owner, you may need to follow national or international privacy laws. For example, you may need to create and display a Privacy Policy." +msgstr "En tant que propriétaire du site, vous pourriez avoir besoin de suivre des réglementations nationales ou internationales en matière de confidentialité. Par exemple, vous pouvez avoir besoin de créer et d’afficher une politique de confidentialité." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:67 +msgid "Force Erasure has failed." +msgstr "L’effacement forcé a échoué." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:105 +msgid "Email could not be sent." +msgstr "L’e-mail n’a pas pu être envoyé." + +#: wp-admin/includes/privacy-tools.php:377 +msgctxt "date/time" +msgid "On" +msgstr "Le" + +#: wp-admin/includes/privacy-tools.php:373 +msgctxt "website URL" +msgid "At URL" +msgstr "À l’URL" + +#: wp-admin/includes/privacy-tools.php:369 +msgctxt "website name" +msgid "For site" +msgstr "Pour le site" + +#: wp-admin/includes/privacy-tools.php:365 +msgctxt "email address" +msgid "Report generated for" +msgstr "Rapport généré pour" + +#. translators: %s: Exporter array index. +#: wp-admin/includes/ajax-actions.php:4792 +msgid "Exporter array at index %s does not include a friendly name." +msgstr "Le tableau d’export ne contient aucun « friendly name » à l’index %s." + +#: wp-admin/erase-personal-data.php:13 +msgid "Sorry, you are not allowed to erase data on this site." +msgstr "Désolé, vous n’avez pas l’autorisation d’effacer les données sur ce site." + +#: wp-admin/export-personal-data.php:13 +msgid "Sorry, you are not allowed to export personal data on this site." +msgstr "Désolé, vous n’avez pas l’autorisation d’exporter les données personnelles sur ce site." + +#: wp-admin/includes/ajax-actions.php:4959 +msgid "Eraser index is out of range." +msgstr "L’index d’effacement est hors de portée." + +#: wp-admin/includes/ajax-actions.php:4918 +msgid "Missing eraser index." +msgstr "Index d’effacement manquant." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4843 +msgid "Expected done (boolean) in response array from exporter: %s." +msgstr "Résultat attendu (booléen) dans le tableau de réponse de l’exportateur : %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4836 +msgid "Expected data array in response array from exporter: %s." +msgstr "Donnée tabulaire attendue dans le tableau de réponse de l’exportateur : %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4829 +msgid "Expected data in response array from exporter: %s." +msgstr "Donnée attendue dans le tableau de réponse de l’exportateur : %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4822 +msgid "Expected response as an array from exporter: %s." +msgstr "Réponse attendue de l’exportateur en tant que tableau : %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4808 +msgid "Exporter callback is not a valid callback: %s." +msgstr "Le retour de l’exportateur n’est pas un retour valide : %s." + +#. translators: %s: Exporter friendly name. +#: wp-admin/includes/ajax-actions.php:4801 +msgid "Exporter does not include a callback: %s." +msgstr "L’exportateur n’inclue aucun retour : %s." + +#. translators: %s: Exporter array index. +#: wp-admin/includes/ajax-actions.php:4785 +msgid "Expected an array describing the exporter at index %s." +msgstr "Réponse attendue sous forme de tableau décrivant l’exportateur à l’index %s." + +#: wp-admin/includes/ajax-actions.php:4771 +msgid "Exporter index is out of range." +msgstr "L’index d’export hors limite." + +#: wp-admin/includes/ajax-actions.php:4767 +msgid "Exporter index cannot be negative." +msgstr "L’index d’exportation ne peut pas être un nombre inférieur à zéro." + +#: wp-admin/includes/ajax-actions.php:4761 +msgid "An exporter has improperly used the registration filter." +msgstr "Un outil d’export a utilisé le filtre d’inscription de façon erronée." + +#: wp-admin/includes/ajax-actions.php:4732 +#: wp-admin/includes/ajax-actions.php:4924 +msgid "Missing page index." +msgstr "Index de page manquant." + +#: wp-admin/includes/ajax-actions.php:4726 +msgid "Missing exporter index." +msgstr "Index d’export manquant." + +#: wp-admin/includes/ajax-actions.php:4717 +#: wp-admin/includes/ajax-actions.php:4908 +msgid "Invalid request type." +msgstr "Type de requête non valide." + +#: wp-admin/options-privacy.php:246 +msgid "Create New Page" +msgstr "Créer une nouvelle page" + +#: wp-admin/options-privacy.php:227 +msgid "Use This Page" +msgstr "Utiliser cette page" + +#: wp-admin/options-privacy.php:192 +msgid "Select a Privacy Policy page" +msgstr "Sélectionner une page de politique de confidentialité" + +#: wp-admin/options-privacy.php:190 +msgid "Change your Privacy Policy page" +msgstr "Modifier la page de politique de confidentialité" + +#. translators: 1: URL to edit Privacy Policy page, 2: URL to view Privacy +#. Policy page. +#: wp-admin/options-privacy.php:154 +msgid "Edit or view your Privacy Policy page content." +msgstr "Modifiez ou visualisez le contenu de votre page de politique de confidentialité." + +#: wp-admin/options-privacy.php:134 +msgid "We would also suggest reviewing your Privacy Policy from time to time, especially after installing or updating any themes or plugins. There may be changes or new suggested information for you to consider adding to your policy." +msgstr "Nous vous suggérons aussi de relire votre politique de confidentialité régulièrement, spécialement après l’installation ou la mise à jour de thèmes ou d’extensions. Il se peut que des changements ou de nouvelles informations vous fassent envisager de les ajouter à votre politique." + +#: wp-admin/options-privacy.php:130 +msgid "However, it is your responsibility to use those resources correctly, to provide the information that your Privacy Policy requires, and to keep that information current and accurate." +msgstr "Cependant, il est de votre responsabilité d’utiliser ces ressources correctement, afin de fournir les informations que votre politique de confidentialité nécessite et de tenir à jour ces informations et de garantir leur pertinence." + +#: wp-admin/options-privacy.php:129 +msgid "The new page will include help and suggestions for your Privacy Policy." +msgstr "La nouvelle page contiendra de l’aide et des suggestions pour votre politique de confidentialité." + +#: wp-admin/options-privacy.php:126 +msgid "If you already have a Privacy Policy page, please select it below. If not, please create one." +msgstr "Si vous disposez déjà d’une page de politique de confidentialité, veuillez la sélectionner ci-dessous. Sinon, veuillez en créer une." + +#. translators: %s: URL to Pages Trash. +#: wp-admin/options-privacy.php:104 +msgid "The currently selected Privacy Policy page is in the Trash. Please create or select a new Privacy Policy page or restore the current page." +msgstr "La page de politique de confidentialité actuellement sélectionnée est dans la corbeille. Veuillez créer ou sélectionner une nouvelle page de politique de confidentialité ou restaurer la page actuelle." + +#: wp-admin/options-privacy.php:94 +msgid "The currently selected Privacy Policy page does not exist. Please create or select a new page." +msgstr "La page de politique de confidentialité actuellement sélectionnée n’existe pas. Veuillez créer ou sélectionner une nouvelle page." + +#: wp-admin/options-privacy.php:70 +msgid "Unable to create a Privacy Policy page." +msgstr "Impossible de créer une page de politique de confidentialité." + +#. translators: Privacy Policy page slug. +#: wp-admin/includes/upgrade.php:381 +msgid "privacy-policy" +msgstr "politique-de-confidentialite" + +#. translators: %s: URL to Customizer -> Menus. +#: wp-admin/options-privacy.php:42 +msgid "Privacy Policy page setting updated successfully. Remember to update your menus!" +msgstr "La page de politique de confidentialité a bien été mise à jour. Pensez à mettre à jour vos menus !" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-privacy-policy-content.php:426 +msgid "Copy suggested policy text from %s." +msgstr "Copier la suggestion de politique de confidentialité depuis %s." + +#. translators: Do not translate EXPIRATION, LINK, SITENAME, SITEURL: those are +#. placeholders. +#: wp-admin/includes/privacy-tools.php:611 +msgid "" +"Howdy,\n" +"\n" +"Your request for an export of personal data has been completed. You may\n" +"download your personal data by clicking on the link below. For privacy\n" +"and security, we will automatically delete the file on ###EXPIRATION###,\n" +"so please download it before then.\n" +"\n" +"###LINK###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour,\n" +"\n" +"Votre demande d’export de données personnelles a été traitée. Vous pouvez télécharger vos données personnelles en cliquant sur le lien ci-dessous. Par sécurité et afin de respecter vos données privées, ce fichier sera automatiquement supprimé le ###EXPIRATION###, alors veuillez le télécharger d’ici là.\n" +"\n" +"###LINK###\n" +"\n" +"Cordialement,\n" +"L’équipe de ###SITENAME###\n" +"###SITEURL###" + +#: wp-admin/includes/privacy-tools.php:495 +msgid "Unable to add data to HTML file." +msgstr "Impossible d’ajouter les données au fichier HTML." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:104 +msgid "Email sent." +msgstr "E-mail envoyé." + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:103 +msgid "Sending Email..." +msgstr "Envoi de l’e-mail…" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:61 +msgid "Download Personal Data Again" +msgstr "Retélécharger les données personnelles" + +#: wp-admin/includes/privacy-tools.php:740 +msgid "Invalid request ID when merging exporter data." +msgstr "ID non valide lors de la fusion des données d’export." + +#: wp-admin/includes/privacy-tools.php:695 +msgid "Unable to send personal data export email." +msgstr "Impossible d’envoyer l’export de données personnelles par e-mail." + +#. translators: Personal data export notification email subject. %s: Site +#. title. +#: wp-admin/includes/privacy-tools.php:585 +msgid "[%s] Personal Data Export" +msgstr "[%s] Export de données personnelles" + +#: wp-admin/includes/privacy-tools.php:543 +msgid "Invalid request ID when sending personal data export email." +msgstr "ID non valide lors de l’envoi par e-mail des données d’export." + +#: wp-admin/includes/privacy-tools.php:516 +msgid "Unable to open export file (archive) for writing." +msgstr "Impossible d’ouvrir le fichier (archive) d’export en écriture." + +#: wp-admin/includes/privacy-tools.php:433 +msgid "Personal Data Export" +msgstr "Export de données personnelles" + +#. translators: %s: User's email address. +#: wp-admin/includes/privacy-tools.php:349 +msgid "Personal Data Export for %s" +msgstr "Export de données personnelles pour %s" + +#: wp-admin/includes/privacy-tools.php:413 +msgid "Unable to open export file (HTML report) for writing." +msgstr "Impossible d’ouvrir le fichier d’export (rapport HTML) en écriture." + +#: wp-admin/includes/privacy-tools.php:329 +msgid "Unable to protect export folder from browsing." +msgstr "Impossible de protéger le dossier d’export contre l’affichage public." + +#: wp-admin/includes/privacy-tools.php:313 +msgid "Invalid email address when generating export file." +msgstr "Adresse de messagerie non valide lors de la génération du fichier d’export." + +#: wp-admin/includes/privacy-tools.php:307 +msgid "Invalid request ID when generating export file." +msgstr "ID non valide lors de la génération du fichier d’export." + +#: wp-admin/includes/privacy-tools.php:300 +msgid "Unable to generate export file. ZipArchive not available." +msgstr "Impossible de générer le fichier d’export. La fonction ZipArchive n’est pas disponible." + +#: wp-admin/includes/ajax-actions.php:4722 +msgid "A valid email address must be given." +msgstr "Erreur : une adresse de messagerie valide doit être fournie." + +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:64 +msgid "Force Erase Personal Data" +msgstr "Forcer l’effacement des données personnelles" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:125 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:132 +msgid "Remove request" +msgstr "Supprimer la demande" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:85 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:91 +msgid "Waiting for confirmation" +msgstr "Attente de confirmation" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:60 +msgid "Downloading Data..." +msgstr "Téléchargement des données…" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:59 +msgid "Download Personal Data" +msgstr "Télécharger les données personnelles" + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:258 +msgid "Re-sent %d request" +msgid_plural "Re-sent %d requests" +msgstr[0] "Renvoyer %d demande" +msgstr[1] "Renvoyer %d demandes" + +#. translators: %d: Number of requests. +#: wp-admin/includes/class-wp-privacy-requests-table.php:241 +msgid "Deleted %d request" +msgid_plural "Deleted %d requests" +msgstr[0] "%d demande supprimée" +msgstr[1] "%d demandes supprimées" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:45 +msgid "Requested" +msgstr "Demande envoyée" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:43 +msgid "Requester" +msgstr "Origine de la demande" + +#: wp-admin/erase-personal-data.php:66 wp-admin/export-personal-data.php:66 +msgid "Send Request" +msgstr "Envoyer une demande" + +#: wp-admin/erase-personal-data.php:64 wp-admin/export-personal-data.php:64 +msgid "Username or email address" +msgstr "Nom d’utilisateur/utilisatrice ou adresse de messagerie" + +#: wp-admin/erase-personal-data.php:61 wp-admin/export-personal-data.php:61 +msgid "An email will be sent to the user at this email address asking them to verify the request." +msgstr "Un e-mail sera envoyé à l’utilisatrice ou à l’utilisateur de cette adresse de messagerie pour lui demander de vérifier cette demande." + +#: wp-admin/export-personal-data.php:60 +msgid "Add Data Export Request" +msgstr "Ajouter une demande d’export de données" + +#: wp-admin/includes/privacy-tools.php:169 +msgid "Confirmation request initiated successfully." +msgstr "Demande de confirmation bien initialisée." + +#: wp-admin/includes/privacy-tools.php:130 +msgid "Unable to add this request. A valid email address or username must be supplied." +msgstr "Impossible d’ajouter cette demande. Une adresse de messagerie ou un nom d’utilisateur valide doit être fourni." + +#: wp-admin/includes/privacy-tools.php:91 +msgid "Confirmation request sent again successfully." +msgstr "Demande de confirmation bien ré-envoyée." + +#: wp-admin/includes/privacy-tools.php:31 +#: wp-admin/includes/privacy-tools.php:158 +msgid "Unable to initiate confirmation request." +msgstr "Impossible d’initialiser la demande de confirmation." + +#: wp-admin/includes/ajax-actions.php:4704 +#: wp-admin/includes/ajax-actions.php:4894 +msgid "Invalid request ID." +msgstr "ID de demande non valide." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5068 +msgid "Expected done flag in response array from %1$s eraser (index %2$d)." +msgstr "Marqueur de résultat attendu dans le tableau de réponse de l’effaceur %1$s (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5057 +msgid "Expected messages key to reference an array in response array from %1$s eraser (index %2$d)." +msgstr "Clé de messages de référence d’un tableau attendue dans le tableau de réponse de l’effaceur %1$s (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5046 +msgid "Expected messages key in response array from %1$s eraser (index %2$d)." +msgstr "Clé de messages attendue dans le tableau de réponse de l’effaceur %1$s (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5035 +msgid "Expected items_retained key in response array from %1$s eraser (index %2$d)." +msgstr "Clé items_retained attendue dans le tableau de réponse de l’effaceur %1$s (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5024 +msgid "Expected items_removed key in response array from %1$s eraser (index %2$d)." +msgstr "Clé items_removed attendue dans le tableau de réponse de l’effaceur %1$s (index %2$d)." + +#. translators: 1: Eraser friendly name, 2: Eraser array index. +#: wp-admin/includes/ajax-actions.php:5013 +msgid "Did not receive array from %1$s eraser (index %2$d)." +msgstr "Pas de tableau reçu depuis l’effaceur %1$s (index %2$d)." + +#. translators: %d: Eraser array index. +#: wp-admin/includes/ajax-actions.php:4977 +msgid "Eraser array at index %d does not include a friendly name." +msgstr "Le tableau d’effacement à l’index %d ne contient pas de nom élégant." + +#. translators: %d: Eraser array index. +#: wp-admin/includes/ajax-actions.php:4972 +msgid "Expected an array describing the eraser at index %d." +msgstr "Un tableau décrivant l’effaceur à l’index %d est attendu." + +#: wp-admin/includes/ajax-actions.php:4775 +#: wp-admin/includes/ajax-actions.php:4963 +msgid "Page index cannot be less than one." +msgstr "L’index de page ne peut pas être inférieur à 1." + +#: wp-admin/includes/ajax-actions.php:4955 +msgid "Eraser index cannot be less than one." +msgstr "L’index de suppression ne peut pas être inférieur à 1." + +#: wp-admin/includes/ajax-actions.php:4914 +msgid "Invalid email address in request." +msgstr "Adresse de messagerie non valide dans la demande." + +#: wp-admin/includes/plugin-install.php:674 +msgid "Requires PHP Version:" +msgstr "Nécessite PHP en version :" + +#: wp-admin/customize.php:80 +msgid "This changeset cannot be further modified." +msgstr "Ce jeu de modifications ne peut pas être modifié davantage." + +#. translators: %s: https://wordpress.org/about/stats +#: wp-admin/privacy.php:52 +msgid "This data is used to provide general enhancements to WordPress, which includes helping to protect your site by finding and automatically installing new updates. It is also used to calculate statistics, such as those shown on the WordPress.org stats page." +msgstr "Ces données sont utilisées pour vous fournir des améliorations générales sur WordPress et pour vous aider à protéger votre site en vérifiant et en installant automatiquement les nouvelles mises à jour. Elles sont aussi utilisées à des fins statistiques comme celles que vous pouvez consulter sur la page des statistiques de WordPress.org." + +#. translators: %s: Link to Custom CSS section in the Customizer. +#: wp-admin/theme-editor.php:207 +msgid "There’s no need to change your CSS here — you can edit and live preview CSS changes in the built-in CSS editor." +msgstr "Vous n’avez pas besoin de modifier votre CSS ici. Vous pouvez le faire et voir vos changements directement dans l’éditeur de CSS embarqué." + +#: wp-admin/theme-editor.php:202 +msgid "Did you know?" +msgstr "Le saviez-vous ?" + +#: wp-admin/credits.php:143 +msgid "Noteworthy Contributors" +msgstr "Contributrices & contributeurs remarquables" + +#: wp-admin/theme-editor.php:375 +msgid "If you decide to go ahead with direct edits anyway, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong." +msgstr "Si vous décidez de foncer et de tout de même modifier le code directement, utilisez un gestionnaire de fichiers pour en créer une copie avec un autre nom et gardez-le près du code original. Ainsi, vous pourrez réactiver une version fonctionnelle si quelque chose tourne mal." + +#: wp-admin/plugin-editor.php:327 +msgid "If you absolutely have to make direct edits to this plugin, use a file manager to create a copy with a new name and hang on to the original. That way, you can re-enable a functional version if something goes wrong." +msgstr "Si vous devez absolument modifier directement cette extension, utilisez un gestionnaire de fichiers pour en créer une copie avec un autre nom et gardez-le près du code original. Ainsi, vous pourrez réactiver une version fonctionnelle si quelque chose tourne mal." + +#: wp-admin/plugin-editor.php:326 +msgid "You appear to be making direct edits to your plugin in the WordPress dashboard. We recommend that you don’t! Editing plugins directly may introduce incompatibilities that break your site and your changes may be lost in future updates." +msgstr "Il semble que vous soyez en train de modifier directement votre thème dans le tableau de bord de WordPress. Ce n’est pas recommandé ! Modifier directement les extensions peut introduire des incompatibilités futures qui pourraient casser votre site et vos modifications risquent d’être perdues lors de futures mises à jour." + +#. translators: 1: Codex URL, 2: URL to Reading Settings screen. +#: wp-admin/options-writing.php:223 +msgid "WordPress is not notifying any Update Services because of your site’s visibility settings." +msgstr "WordPress ne notifie aucun service de mise à jour du fait de vos réglages de visibilité." + +#: wp-admin/options-writing.php:210 wp-admin/options-writing.php:224 +msgid "https://codex.wordpress.org/Update_Services" +msgstr "https://codex.wordpress.org/Update_Services" + +#. translators: 1: .htaccess, 2: Documentation URL, 3: CTRL + a +#: wp-admin/options-permalink.php:409 +msgid "If your %1$s file was writable, we could do this automatically, but it isn’t so these are the mod_rewrite rules you should have in your %1$s file. Click in the field and press %3$s to select all." +msgstr "Si votre fichier %1$s était accessible en écriture, nous pourrions faire cela automatiquement, mais ce n’est pas le cas donc voici les règles mod_rewrite que vous devriez placer dans votre fichier %1$s. Cliquez dans le champ et appuyez sur %3$s pour tout sélectionner." + +#. translators: 1: Documentation URL, 2: web.config, 3: CTRL + a +#: wp-admin/options-permalink.php:377 +msgid "If the root directory of your site was writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your %2$s file. Create a new file, called %2$s in the root directory of your site. Click in the field and press %3$s to select all. Then insert this code into the %2$s file." +msgstr "Si le répertoire racine de votre site était accessible en écriture, nous pourrions faire cela automatiquement, mais ce n’est pas le cas donc voici la règle de réécriture des URL que vous devriez placer dans votre fichier %2$s. Créez un nouveau fichier nommé %2$s sur le répertoire racine de votre site. Cliquez dans le champ et appuyez sur %3$s pour tout sélectionner. Insérez ensuite ce code dans votre fichier %2$s." + +#. translators: 1: web.config, 2: Documentation URL, 3: CTRL + a, 4: Element +#. code. +#: wp-admin/options-permalink.php:351 +msgid "If your %1$s file was writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your %1$s file. Click in the field and press %3$s to select all. Then insert this rule inside of the %4$s element in %1$s file." +msgstr "Si votre fichier %1$s était accessible en écriture, nous pourrions faire cela automatiquement, mais ce n’est pas le cas donc voici la règle de réécriture d’URL que vous devriez placer dans votre fichier %1$s. Cliquez dans le champs puis appuyez sur %3$s pour tout sélectionner. Ensuite, insérez cette règle dans l’élément %4$s du fichier %1$s." + +#. translators: %s: Documentation URL. +#: wp-admin/options-general.php:99 +msgid "Enter the address here if you want your site home page to be different from your WordPress installation directory." +msgstr "Saisissez ici une adresse si vous souhaitez que la page d’accueil de votre site soit différente du répertoire de votre installation WordPress." + +#. translators: %s: https://wordpress.org/about/privacy +#: wp-admin/privacy.php:62 +msgid "We take privacy and transparency very seriously. To learn more about what data we collect, and how we use it, please visit WordPress.org/about/privacy." +msgstr "Nous prenons très au sérieux le respect de la vie privée et la transparence. Pour en savoir plus sur les données que nous collectons, et comment nous les utilisons, veuillez visiter WordPress.org/about/privacy." + +#: wp-admin/freedoms.php:56 wp-admin/freedoms.php:110 +msgid "https://wordpress.org/about/license/" +msgstr "https://fr.wordpress.org/about/license/" + +#: wp-admin/privacy.php:46 +msgid "From time to time, your WordPress site may send data to WordPress.org — including, but not limited to — the version of WordPress you are using, and a list of installed plugins and themes." +msgstr "De temps en temps, votre site WordPress peut envoyer des données sur WordPress.org incluant entre autres la version de WordPress utilisée et la liste des extensions et des thèmes installés." + +#. translators: Attachment information. %s: Date the attachment was uploaded. +#: wp-admin/includes/meta-boxes.php:401 +msgid "Uploaded on: %s" +msgstr "Téléversé le : %s" + +#. translators: %s: Package URL. +#: wp-admin/includes/class-plugin-upgrader.php:67 +#: wp-admin/includes/class-theme-upgrader.php:65 +msgid "Downloading installation package from %s…" +msgstr "Téléchargement du paquet d’installation depuis %s…" + +#. translators: %s: Package URL. +#: wp-admin/includes/class-language-pack-upgrader.php:117 +msgid "Downloading translation from %s…" +msgstr "Téléchargement des traductions depuis %s…" + +#. translators: %s: Package URL. +#: wp-admin/includes/class-plugin-upgrader.php:50 +#: wp-admin/includes/class-theme-upgrader.php:49 +#: wp-admin/includes/class-core-upgrader.php:33 +msgid "Downloading update from %s…" +msgstr "Téléchargement de la mise à jour depuis %s…" + +#. translators: 1: wp-admin/includes/template.php, 2: add_meta_box(), 3: +#. add_meta_boxes +#: wp-admin/includes/template.php:2470 +msgid "Likely direct inclusion of %1$s in order to use %2$s. This is very wrong. Hook the %2$s call into the %3$s action instead." +msgstr "Probable inclusion directe de %1$s afin d’utiliser %2$s. Ceci est vraiment une mauvaise idée. Vous devriez plutôt crocheter l’appel %2$s dans l’action %3$s." + +#: wp-admin/includes/template.php:2127 +msgid "Customization Draft" +msgstr "Brouillon de personnalisation" + +#. translators: %s: URL to the Customizer. +#: wp-admin/includes/meta-boxes.php:277 +msgid "This draft comes from your unpublished customization changes. You can edit, but there’s no need to publish now. It will be published automatically with those changes." +msgstr "Ce brouillon vient de vos changements de personnalisation non publiés. Vous pouvez le modifier, mais inutile de le publier maintenant. Il sera publié automatiquement avec ces changements." + +#: wp-admin/theme-editor.php:253 +msgid "Theme Files" +msgstr "Fichiers du thème" + +#: wp-admin/includes/misc.php:388 wp-admin/includes/misc.php:477 +msgid "folder" +msgstr "dossier" + +#: wp-admin/includes/file.php:560 +msgid "Unable to communicate back with site to check for fatal errors, so the PHP change was reverted. You will need to upload your PHP file change by some other means, such as by using SFTP." +msgstr "Impossible d’envoyer un message au site afin de vérifier l’absence d’erreurs fatales. Du coup, la modification PHP a été annulée. Vous allez devoir téléverser votre fichier PHP modifié par un autre moyen, par exemple en utilisant un client FTP." + +#: wp-admin/press-this.php:75 wp-admin/press-this.php:81 +msgid "Installation Required" +msgstr "Installation nécessaire" + +#. translators: %s: Plugin filename. +#: wp-admin/includes/plugin.php:1026 +msgid "Could not fully remove the plugin %s." +msgstr "Impossible de supprimer l’extension %s." + +#: wp-admin/user-new.php:324 +msgid "User has been created, but could not be added to this site." +msgstr "L’utilisateur a été créé, mais il ne peut pas être ajouté à ce site." + +#: wp-admin/user-new.php:321 +msgid "That user could not be added to this site." +msgstr "Cet utilisateur ne peut pas être ajouté à ce site." + +#: wp-admin/user-edit.php:287 +msgid "Disable syntax highlighting when editing code" +msgstr "Désactiver le surlignage syntaxique lors de l’édition de code" + +#: wp-admin/user-edit.php:284 +msgid "Syntax Highlighting" +msgstr "Édition de code" + +#: wp-admin/setup-config.php:416 wp-admin/setup-config.php:449 +msgid "Run the installation" +msgstr "Lancer l’installation" + +#: wp-admin/privacy.php:63 +msgid "https://wordpress.org/about/privacy/" +msgstr "https://wordpress.org/about/privacy/" + +#: wp-admin/press-this.php:80 +msgid "Press This is not available. Please contact your site administrator." +msgstr "Press This n’est pas disponible. Veuillez contacter l’administrateur du site." + +#. translators: %s: URL to Press This bookmarklet on the main site. +#: wp-admin/press-this.php:68 +msgid "Press This is not installed. Please install Press This from the main site." +msgstr "Press This n’est pas installé. Veuillez installer Press This depuis le site principal." + +#: wp-admin/press-this.php:44 +msgid "Activate Press This" +msgstr "Activer Press This" + +#: wp-admin/plugins.php:184 +msgid "Sorry, you are not allowed to deactivate this plugin." +msgstr "Désolé, vous n’avez pas l’autorisation de désactiver cette extension." + +#: wp-admin/plugins.php:34 wp-admin/plugins.php:161 +msgid "Sorry, you are not allowed to activate this plugin." +msgstr "Désolé, vous n’avez pas l’autorisation d’activer cette extension." + +#: wp-admin/theme-editor.php:379 wp-admin/plugin-editor.php:331 +msgid "I understand" +msgstr "Je comprends" + +#: wp-admin/theme-editor.php:358 wp-admin/plugin-editor.php:325 +msgid "Heads up!" +msgstr "Faites attention !" + +#: wp-admin/plugin-editor.php:282 +msgid "Warning: Making changes to active plugins is not recommended." +msgstr "Avertissement : Effectuer des modifications dans les extensions actives n’est pas recommandé." + +#: wp-admin/theme-editor.php:286 wp-admin/plugin-editor.php:263 +msgid "Selected file content:" +msgstr "Contenu du fichier sélectionné :" + +#: wp-admin/theme-editor.php:195 wp-admin/plugin-editor.php:188 +msgid "There was an error while trying to update the file. You may need to fix something and try updating again." +msgstr "Une erreur s’est produite lors de la mise à jour. Vous devriez essayer de corriger quelque chose et réessayer." + +#. translators: %s: Select field to choose the front page. +#: wp-admin/options-reading.php:108 +msgid "Homepage: %s" +msgstr "Page d’accueil : %s" + +#: wp-admin/options-permalink.php:293 +msgid "Available tags:" +msgstr "Balises disponibles :" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:289 +msgid "%s (already used in permalink structure)" +msgstr "%s (déjà utilisé dans la structure de permalien)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:286 +msgid "%s added to permalink structure" +msgstr "%s ajouté à la structure du permalien" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:273 +msgid "%s (A sanitized version of the author name.)" +msgstr "%s (Une version normalisée du nom de l’auteur)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:271 +msgid "%s (Category slug. Nested sub-categories appear as nested directories in the URL.)" +msgstr "%s (slug de catégorie. Les sous-catégories imbriquées apparaissent sous la forme de sous-répertoires dans l’URL.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:269 +msgid "%s (The sanitized post title (slug).)" +msgstr "%s (Le titre normalisé de la publication, ou slug)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:267 +msgid "%s (The unique ID of the post, for example 423.)" +msgstr "%s (L’ID unique de la publication, par exemple 423)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:265 +msgid "%s (Second of the minute, for example 33.)" +msgstr "%s (Seconde de la minute, par exemple 33.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:263 +msgid "%s (Minute of the hour, for example 43.)" +msgstr "%s (Minute de l’heure, par exemple 43.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:261 +msgid "%s (Hour of the day, for example 15.)" +msgstr "%s (Heure de la journée, par exemple 15.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:259 +msgid "%s (Day of the month, for example 28.)" +msgstr "%s (Jour du mois, par exemple 28.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:257 +msgid "%s (Month of the year, for example 05.)" +msgstr "%s (Mois de l’année, par exemple 05.)" + +#. translators: %s: Permalink structure tag. +#: wp-admin/options-permalink.php:255 +msgid "%s (The year of the post, four digits, for example 2004.)" +msgstr "%s (L’année de la publication, en quatre chiffres, par exemple 2004)" + +#: wp-admin/includes/theme-install.php:245 +msgid "Theme Installation" +msgstr "Installation du thème" + +#. translators: %s: User's display name. +#: wp-admin/includes/post.php:1732 +msgid "%s is already editing this post." +msgstr "%s est déjà en train de modifier cette publication." + +#. translators: %s: User's display name. +#: wp-admin/includes/post.php:1729 +msgid "%s is already editing this post. Do you want to take over?" +msgstr "%s est déjà en train de modifier cette publication. Voulez-vous prendre la main dessus ?" + +#: wp-admin/includes/plugin-install.php:596 wp-admin/update.php:122 +msgid "Plugin Installation" +msgstr "Installation de l’extension" + +#: wp-admin/includes/plugin.php:491 +msgid "Custom installation script." +msgstr "Script personnalisé d’installation." + +#: wp-admin/includes/plugin-install.php:681 +msgid "Active Installations:" +msgstr "Installations actives :" + +#: wp-admin/includes/ms.php:1139 +msgid "Settings — This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database." +msgstr "Réglages — Cette page affiche une liste de tous les réglages associés à ce site. Certains sont créés par WordPress, d’autres par les extensions que vous activez. Notez que certains champs sont grisé et affichent « Serialized Data » ; vous ne pouvez pas modifier ces valeurs en raison de la manière dont elles sont stockées dans la base de données." + +#. translators: %s: URL to Network Themes screen. +#: wp-admin/includes/ms.php:1136 +msgid "Themes — This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen." +msgstr "Thèmes — Cette zone affiche les thèmes qui n’ont pas encore été activés sur le réseau. Un thème activé dans ce menu le rendra accessible au présent site. Cela n’active pas le thème, mais l’affichera dans le menu Apparence du site. Pour activer un thème sur l’ensemble du réseau, allez sur l’écran Thèmes du réseau." + +#: wp-admin/includes/ms.php:1133 +msgid "Users — This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network." +msgstr "Utilisateurs — Cette page affiche les utilisateurs associés à ce site. Vous pouvez modifier leur rôle, mettre à zéro leur mot de passe, ou les supprimer du site. Supprimer un utilisateur d’un site ne le supprime pas du réseau." + +#: wp-admin/includes/ms.php:1132 +msgid "Info — The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable." +msgstr "Info — L’adresse web du site est rarement modifiée, car cela peut empêcher le site de fonctionner correctement. Les dates de création et de dernière mise à jour sont affichées. Les administrateurs du réseau peuvent archiver un site, le marquer comme indésirable, le supprimer et le marquer comme étant « pour adultes », afin de le retirer de la liste publique, ou le désactiver." + +#: wp-admin/includes/ms.php:1131 +msgid "The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable." +msgstr "Le menu sert à modifier les informations propres à chaque site, notamment si leur interface d’administration est inaccessible." + +#: wp-admin/includes/file.php:499 +msgid "Unable to write to file." +msgstr "Impossible d’écrire sur le fichier." + +#. translators: 1: Line number, 2: File path. +#: wp-admin/includes/file.php:306 +msgid "Your PHP code changes were rolled back due to an error on line %1$s of file %2$s. Please fix and try saving again." +msgstr "Vos modifications de code PHP ont été annulées en raison d’une erreur sur la ligne %1$s du fichier %2$s. Veuillez la corriger et réessayer d’enregistrer." + +#. translators: If a Rosetta site exists (e.g. https://es.wordpress.org/news/), +#. then use that. Otherwise, leave untranslated. +#: wp-admin/includes/dashboard.php:1247 +msgctxt "Events and News dashboard widget" +msgid "https://wordpress.org/news/" +msgstr "https://fr.wordpress.org/news/" + +#: wp-admin/includes/dashboard.php:75 wp-admin/includes/dashboard.php:606 +msgid "Your Recent Drafts" +msgstr "Vos brouillons récents" + +#: wp-admin/includes/class-wp-users-list-table.php:546 +#: wp-admin/includes/class-wp-ms-users-list-table.php:307 +msgctxt "name" +msgid "Unknown" +msgstr "Inconnu" + +#. translators: %s: Author's display name. +#: wp-admin/includes/class-wp-users-list-table.php:468 +msgid "View posts by %s" +msgstr "Voir les publications par %s" + +#: wp-admin/includes/class-wp-terms-list-table.php:543 +msgid "No description" +msgstr "Aucune description" + +#. translators: %s: Number of installations. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:752 +msgid "%s Active Installations" +msgstr "%s installations actives" + +#: wp-admin/includes/class-theme-upgrader.php:69 +msgid "Theme installation failed." +msgstr "L’installation du thème a échoué." + +#: wp-admin/includes/class-plugin-upgrader.php:71 +msgid "Plugin installation failed." +msgstr "L’installation de l’extension a échoué." + +#: wp-admin/includes/class-plugin-installer-skin.php:73 +msgid "Activate Plugin & Return to Press This" +msgstr "Extension activée & Retourner à Press This" + +#: wp-admin/customize.php:71 +msgid "Your scheduled changes just published" +msgstr "Votre planification vient d’être publiée" + +#: wp-admin/options-discussion.php:54 +msgid "Allow link notifications from other blogs (pingbacks and trackbacks) on new posts" +msgstr "Autoriser les notifications de lien en provenance d’autres blogs (pings et rétroliens) sur les nouvelles publications." + +#: wp-admin/includes/class-wp-media-list-table.php:228 +msgid "No media files found." +msgstr "Aucun fichier média trouvé." + +#: wp-admin/includes/class-wp-debug-data.php:105 +msgctxt "comment status" +msgid "Open" +msgstr "Ouvert" + +#. translators: %s: Meetup organization documentation URL. +#: wp-admin/includes/dashboard.php:1399 +msgid "There aren’t any events scheduled near you at the moment. Would you like to organize one?" +msgstr "Il n’y a aucun évènement planifié proche de vous pour le moment. Voulez-vous en organiser un ?" + +#. translators: %s: User's display name. +#: wp-admin/user-edit.php:34 +msgid "Edit User %s" +msgstr "Modifier l’utilisateur %s" + +#. translators: %s: Widget title. +#: wp-admin/includes/widgets.php:251 +msgid "Edit widget: %s" +msgstr "Modifier le widget : %s" + +#: wp-admin/includes/dashboard.php:1391 wp-admin/includes/dashboard.php:1400 +msgid "https://make.wordpress.org/community/handbook/meetup-organizer/welcome/" +msgstr "https://make.wordpress.org/community/handbook/meetup-organizer/welcome/" + +#. translators: 1: The city the user searched for, 2: Meetup organization +#. documentation URL. +#: wp-admin/includes/dashboard.php:1389 +msgid "There aren’t any events scheduled near %1$s at the moment. Would you like to organize one?" +msgstr "Il n’y a aucun évènement planifié près de %1$s pour le moment. Voulez-vous en organiser un ?" + +#. translators: %s: The name of a city. +#: wp-admin/includes/dashboard.php:1342 +msgid "Attend an upcoming event near %s." +msgstr "Participez à un évènement à venir près de %s." + +#: wp-admin/includes/dashboard.php:1312 +msgid "Cincinnati" +msgstr "Paris" + +#: wp-admin/includes/dashboard.php:1300 +msgid "City:" +msgstr "Ville :" + +#: wp-admin/includes/dashboard.php:1293 +msgid "Edit city" +msgstr "Modifier la ville" + +#: wp-admin/includes/dashboard.php:1235 +msgid "WordCamps" +msgstr "WordCamps" + +#: wp-admin/includes/dashboard.php:1223 +msgid "Meetups" +msgstr "Meetups" + +#: wp-admin/includes/dashboard.php:80 +msgid "WordPress Events and News" +msgstr "Évènements et nouveautés WordPress" + +#. translators: Date format for upcoming events on the dashboard. Include the +#. day of the week. See https://www.php.net/date +#: wp-admin/includes/class-wp-community-events.php:379 +#: wp-admin/includes/class-wp-community-events.php:384 +msgid "l, M j, Y" +msgstr "l j M Y" + +#: wp-admin/includes/class-wp-community-events.php:122 +msgid "Unknown API error." +msgstr "Erreur d’API inconnue." + +#. translators: %d: Numeric HTTP status code, e.g. 400, 403, 500, 504, etc. +#: wp-admin/includes/class-wp-community-events.php:117 +msgid "Invalid API response code (%d)." +msgstr "Code de réponse d’API non valide (%d)." + +#: wp-admin/edit-tags.php:493 wp-admin/edit-tag-form.php:183 +msgid "Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band." +msgstr "Assignez un terme parent pour créer une hiérarchie. Par exemple, le terme Jazz serait le parent de Bebop et Big Band." + +#: wp-admin/users.php:180 wp-admin/users.php:229 +msgid "Sorry, you are not allowed to delete users." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer des utilisateurs." + +#: wp-admin/user-new.php:23 wp-admin/user-new.php:157 +msgid "Sorry, you are not allowed to create users." +msgstr "Désolé, vous n’avez pas l’autorisation de créer des utilisateurs." + +#: wp-admin/customize.php:218 +msgid "The Customizer allows you to preview changes to your site before publishing them. You can navigate to different pages on your site within the preview. Edit shortcuts are shown for some editable elements." +msgstr "La personnalisation vous permet de prévisualiser les changements apportés à votre site avant de les publier. Vous pouvez naviguer sur les différentes pages du site depuis la prévisualisation. Les raccourcis de modification sont affichés pour certains éléments modifiables." + +#: wp-admin/customize.php:232 +msgctxt "short (~12 characters) label for hide controls button" +msgid "Hide Controls" +msgstr "Masquer les controles" + +#: wp-admin/theme-install.php:70 +msgid "Expand Sidebar" +msgstr "Étendre la colonne latérale" + +#: wp-admin/nav-menus.php:979 +msgid "Display location" +msgstr "Afficher l’emplacement" + +#. translators: 1: User ID, 2: User login. +#: wp-admin/users.php:432 +msgid "ID #%1$s: %2$s Sorry, you are not allowed to remove this user." +msgstr "ID #%1$s : %2$s Désolé, vous n’avez pas l’autorisation pour supprimer cet utilisateur." + +#: wp-admin/user-edit.php:51 +msgid "You can select the language you wish to use while using the WordPress administration screen without affecting the language site visitors see." +msgstr "Vous pouvez sélectionner la langue que vous voulez utiliser pour l’administration de WordPress sans que cela affecte la langue que les visiteurs du site voient." + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:69 +msgid "If you need to re-install version %s, you can do so here:" +msgstr "Si vous devez réinstaller la version %s, vous pouvez le faire ici :" + +#: wp-admin/update-core.php:65 +msgid "You are using a development version of WordPress. You can update to the latest nightly build automatically:" +msgstr "Vous utilisez une version de développement de WordPress. Vous pouvez mettre à jour vers la dernière version (« nightly build ») automatiquement :" + +#: wp-admin/theme-install.php:233 +msgid "Edit Filters" +msgstr "Modifier les filtres" + +#: wp-admin/theme-install.php:208 wp-admin/theme-install.php:228 +msgid "Clear current filters" +msgstr "Réinitialiser les filtres actuels" + +#. translators: Accessibility text. +#: wp-admin/theme-install.php:72 +msgid "Select one or more Theme features to filter by" +msgstr "Sélectionner une ou plusieurs fonctionnalités de thèmes à filtrer" + +#. translators: %s: Number of ratings. +#: wp-admin/includes/theme.php:748 wp-admin/theme-install.php:342 +msgid "(%s ratings)" +msgstr "(%s votes)" + +#: wp-admin/includes/template.php:2217 +msgid "Current Background Image" +msgstr "Image d’arrière plan actuelle" + +#: wp-admin/includes/template.php:2204 +msgid "Current Header Image" +msgstr "Image d’en-tête actuelle" + +#: wp-admin/includes/plugin-install.php:335 +msgid "Search plugins..." +msgstr "Rechercher des extensions..." + +#: wp-admin/includes/meta-boxes.php:133 +msgid "Set status" +msgstr "État" + +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-posts-list-table.php:935 +msgid "“%s” is locked" +msgstr "« %s » est verrouillé" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:747 +#: wp-admin/includes/plugin-install.php:691 +msgctxt "Active plugin installations" +msgid "Less Than 10" +msgstr "Inférieur à 10" + +#: wp-admin/includes/ajax-actions.php:2509 +msgid "Sorry, you are not allowed to attach files to this post." +msgstr "Désolé, vous n’avez pas l’autorisation d’attacher des fichiers à cette publication." + +#: wp-admin/includes/plugin-install.php:270 +#: wp-admin/includes/plugin-install.php:698 wp-admin/freedoms.php:103 +#: wp-admin/plugins.php:451 wp-admin/plugin-install.php:89 +msgid "https://wordpress.org/plugins/" +msgstr "https://fr.wordpress.org/plugins/" + +#: wp-admin/customize.php:72 wp-admin/customize.php:81 +msgid "Customize New Changes" +msgstr "Personnaliser les nouvelles modifications" + +#: wp-admin/includes/class-custom-background.php:446 +#: wp-admin/includes/class-custom-background.php:447 +msgctxt "Background Scroll" +msgid "Scroll" +msgstr "Défilement" + +#: wp-admin/includes/class-custom-background.php:438 +#: wp-admin/includes/class-custom-background.php:439 +msgctxt "Background Repeat" +msgid "Repeat" +msgstr "Répétition" + +#: wp-admin/options-reading.php:52 wp-admin/edit-tags.php:314 +#: wp-admin/link-manager.php:79 wp-admin/options-writing.php:53 +#: wp-admin/includes/class-custom-background.php:100 +#: wp-admin/includes/class-custom-image-header.php:135 wp-admin/my-sites.php:52 +#: wp-admin/options-general.php:49 wp-admin/comment.php:57 +#: wp-admin/theme-editor.php:55 wp-admin/plugin-editor.php:144 +#: wp-admin/nav-menus.php:605 wp-admin/update-core.php:731 +#: wp-admin/options-permalink.php:62 wp-admin/user-new.php:269 +#: wp-admin/index.php:108 wp-admin/plugins.php:472 wp-admin/themes.php:149 +#: wp-admin/edit-comments.php:197 wp-admin/media.php:97 +#: wp-admin/revision.php:146 wp-admin/upload.php:76 wp-admin/upload.php:253 +#: wp-admin/edit-form-advanced.php:314 wp-admin/edit-form-advanced.php:332 +#: wp-admin/edit-form-advanced.php:350 wp-admin/tools.php:56 +#: wp-admin/import.php:32 wp-admin/widgets.php:84 wp-admin/options-media.php:38 +#: wp-admin/edit-link-form.php:77 wp-admin/user-edit.php:68 +#: wp-admin/users.php:76 wp-admin/media-new.php:61 +#: wp-admin/theme-install.php:131 wp-admin/options-discussion.php:32 +#: wp-admin/edit.php:277 wp-admin/edit.php:302 wp-admin/plugin-install.php:110 +#: wp-admin/export.php:58 wp-admin/network.php:81 +#: wp-admin/network/themes.php:247 wp-admin/network/upgrade.php:32 +#: wp-admin/network/settings.php:64 +msgid "Support" +msgstr "Forums d’entraide" + +#. translators: %s: Number of failed updates. +#: wp-admin/includes/update.php:826 +msgid "%s updates failed." +msgstr "%s mises à jour ont échoué." + +#. translators: %s: Number of failed updates. +#: wp-admin/includes/update.php:821 +msgid "%s update failed." +msgstr "%s mise à jour a échoué." + +#: wp-admin/includes/class-wp-plugins-list-table.php:387 +msgid "Search installed plugins..." +msgstr "Rechercher des extensions installées…" + +#: wp-admin/plugin-install.php:91 +msgid "You can find new plugins to install by searching or browsing the directory right here in your own Plugins section." +msgstr "Vous pouvez trouver des nouvelles extensions à installer en recherchant ou en parcourant le répertoire ici même dans votre section des extensions." + +#. translators: %s: https://wordpress.org/plugins +#: wp-admin/plugin-install.php:88 +msgid "Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official WordPress Plugin Directory are compatible with the license WordPress uses." +msgstr "Les extensions étendent les fonctionnalités de WordPress avec des fonctions personnalisées. Les extensions sont développées indépendamment du cœur de WordPress par des milliers de développeurs partout dans le monde. Toutes les extensions dans le répertoire WordPress sont compatibles avec la licence d’utilisation de WordPress." + +#: wp-admin/includes/plugin-install.php:328 +msgid "Search plugins by:" +msgstr "Rechercher des extensions par :" + +#: wp-admin/includes/import.php:227 +msgid "Import posts, pages, comments, custom fields, categories, and tags from a WordPress export file." +msgstr "Importer des articles, pages, commentaires, champs personnalisés, catégories et étiquettes depuis un fichier d’export WordPress." + +#: wp-admin/includes/import.php:221 +msgid "Import posts & media from Tumblr using their API." +msgstr "Importer des articles et des fichiers média depuis Tumblr par le biais de leur API." + +#: wp-admin/includes/import.php:215 +msgid "Import posts from an RSS feed." +msgstr "Importer des articles depuis un flux RSS." + +#: wp-admin/includes/import.php:209 +msgid "Import posts and comments from a Movable Type or TypePad blog." +msgstr "Importer les articles et commentaires depuis un blog Movable Type ou TypePad." + +#: wp-admin/includes/import.php:203 +msgid "Import posts from LiveJournal using their API." +msgstr "Importer les articles depuis LiveJournal par le biais de leur API." + +#: wp-admin/includes/import.php:197 +msgid "Convert existing categories to tags or tags to categories, selectively." +msgstr "Convertir les catégories existantes en étiquettes, ou les étiquettes en catégories, de manière sélective." + +#: wp-admin/includes/import.php:191 +msgid "Import posts, comments, and users from a Blogger blog." +msgstr "Importer des articles, commentaires et utilisateurs depuis un blog Blogger." + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:718 +msgctxt "plugin" +msgid "Deactivate %s" +msgstr "Désactiver %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:698 +#: wp-admin/includes/class-wp-plugins-list-table.php:747 +msgctxt "plugin" +msgid "Delete %s" +msgstr "Supprimer %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-plugins-list-table.php:679 +msgctxt "plugin" +msgid "Network Deactivate %s" +msgstr "Désactiver %s du réseau" + +#: wp-admin/user-new.php:238 +msgid "By default, new users will receive an email letting them know they’ve been added as a user for your site. This email will also contain a password reset link. Uncheck the box if you don’t want to send the new user a welcome email." +msgstr "Par défaut, les nouveaux utilisateurs recevront un message leur indiquant leur ajout en tant que membre de votre site. Ce message contiendra également un lien de réinitialisation de leur mot de passe. Décochez la case si vous souhaitez ne pas envoyer de message de bienvenue." + +#: wp-admin/user-new.php:236 +msgid "New users are automatically assigned a password, which they can change after logging in. You can view or edit the assigned password by clicking the Show Password button. The username cannot be changed once the user has been added." +msgstr "Les nouveaux utilisateurs reçoivent automatiquement un mot de passe, qui peut être changé après connexion. Vous pouvez afficher le mot de passe ou le modifier en cliquant sur le bouton « Afficher le mot de passe ». L’identifiant ne peut pas être modifié une fois que le compte utilisateur a été créé." + +#. translators: %s: Plugin name. +#: wp-admin/includes/update.php:889 +msgctxt "plugin" +msgid "%s was successfully deleted." +msgstr "%s a bien été supprimée." + +#: wp-admin/plugins.php:447 +msgid "The search for installed plugins will search for terms in their name, description, or author." +msgstr "La recherche dans les extensions installées sera faite sur les noms des extensions, leurs descriptions ou leurs auteurs." + +#: wp-admin/includes/theme.php:285 +msgid "Custom Logo" +msgstr "Logo personnalisé" + +#: wp-admin/users.php:368 wp-admin/users.php:400 +#: wp-admin/network/site-users.php:119 +msgid "Sorry, you are not allowed to remove users." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer des utilisateurs." + +#: wp-admin/user-new.php:16 wp-admin/user-new.php:56 +#: wp-admin/network/user-new.php:14 +msgid "Sorry, you are not allowed to add users to this network." +msgstr "Désolé, vous n’avez pas l’autorisation d’ajouter des utilisateurs pour ce réseau." + +#: wp-admin/user-edit.php:660 +msgid "Confirm use of potentially weak password" +msgstr "Confirmation de l’utilisation de mot de passe potentiellement faible." + +#: wp-admin/customize.php:35 +msgid "Sorry, you are not allowed to edit this changeset." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier ce groupe de modifications." + +#: wp-admin/includes/ajax-actions.php:4127 wp-admin/update.php:175 +#: wp-admin/update.php:196 +msgid "Sorry, you are not allowed to update themes for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de mettre à jour les thèmes de ce site." + +#: wp-admin/update-core.php:23 wp-admin/update-core.php:801 +#: wp-admin/update-core.php:837 wp-admin/update-core.php:875 +#: wp-admin/update-core.php:915 +msgid "Sorry, you are not allowed to update this site." +msgstr "Désolé, vous n’avez pas l’autorisation de mettre à jour ce site." + +#: wp-admin/themes.php:327 wp-admin/themes.php:492 +msgid "New version available. " +msgstr "Nouvelle version disponible. " + +#: wp-admin/theme-install.php:160 +msgid "The Theme Installer screen requires JavaScript." +msgstr "L’écran d’installation de thèmes nécessite JavaScript." + +#: wp-admin/includes/file.php:420 wp-admin/theme-editor.php:18 +msgid "Sorry, you are not allowed to edit templates for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier les modèles de ce site." + +#: wp-admin/setup-config.php:319 +msgid "Error: \"Table Prefix\" is invalid." +msgstr "Erreur : « Préfixe de table » non valide." + +#: wp-admin/plugins.php:211 +msgid "Sorry, you are not allowed to deactivate plugins for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de désactiver les extensions de ce site." + +#: wp-admin/plugins.php:78 +msgid "Sorry, you are not allowed to activate plugins for this site." +msgstr "Désolé, vous n’avez pas l’autorisation d’activer les extensions de ce site." + +#: wp-admin/includes/file.php:388 wp-admin/plugin-editor.php:18 +msgid "Sorry, you are not allowed to edit plugins for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier les extensions de ce site." + +#: wp-admin/options.php:228 +msgid "Sorry, you are not allowed to modify unregistered settings for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier les réglages non enregistrés de ce site." + +#: wp-admin/options-reading.php:13 wp-admin/options-writing.php:13 +#: wp-admin/options-general.php:16 wp-admin/options-permalink.php:13 +#: wp-admin/options.php:50 wp-admin/options-media.php:13 +#: wp-admin/options-discussion.php:12 wp-admin/network.php:19 +msgid "Sorry, you are not allowed to manage options for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de gérer les options de ce site." + +#: wp-admin/nav-menus.php:627 wp-admin/widgets.php:405 +msgid "Manage with Live Preview" +msgstr "Gérer avec la prévisualisation en direct" + +#: wp-admin/ms-delete-site.php:17 +msgid "Sorry, you are not allowed to delete this site." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer ce site." + +#: wp-admin/link-add.php:13 +msgid "Sorry, you are not allowed to add links to this site." +msgstr "Désolé, vous n’avez pas l’autorisation d’ajouter des liens pour ce site." + +#: wp-admin/includes/upgrade.php:271 +msgid "" +"Hi, this is a comment.\n" +"To get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\n" +"Commenter avatars come from Gravatar." +msgstr "" +"Bonjour, ceci est un commentaire.\n" +"Pour débuter avec la modération, la modification et la suppression de commentaires, veuillez visiter l’écran des Commentaires dans le Tableau de bord.\n" +"Les avatars des personnes qui commentent arrivent depuis Gravatar." + +#: wp-admin/includes/upgrade.php:268 +msgid "A WordPress Commenter" +msgstr "Un commentateur WordPress" + +#. translators: %s: Theme name. +#: wp-admin/includes/update.php:897 +msgctxt "theme" +msgid "%s was successfully deleted." +msgstr "%s a bien été supprimé." + +#. translators: %s: Number of themes. +#: wp-admin/includes/update.php:811 +msgid "%s themes successfully updated." +msgstr "%s thèmes mis à jour." + +#. translators: %s: Number of plugins. +#: wp-admin/includes/update.php:806 +msgid "%s plugins successfully updated." +msgstr "%s extensions mises à jour." + +#. translators: %s: Number of themes. +#: wp-admin/includes/update.php:799 +msgid "%s theme successfully updated." +msgstr "%s thème mis à jour." + +#. translators: %s: Number of plugins. +#: wp-admin/includes/update.php:794 +msgid "%s plugin successfully updated." +msgstr "%s extension mise à jour." + +#. translators: 1: URL to WordPress release notes, 2: New WordPress version. +#: wp-admin/includes/update.php:316 +msgid "WordPress %2$s is available! Please notify the site administrator." +msgstr "WordPress %2$s est disponible ! Veuillez informer l’administrateur du site." + +#: wp-admin/includes/update.php:311 +msgid "Please update WordPress now" +msgstr "Veuillez mettre WordPress à jour maintenant" + +#. translators: 1: URL to WordPress release notes, 2: New WordPress version, 3: +#. URL to network admin, 4: Accessibility text. +#: wp-admin/includes/update.php:307 +msgid "WordPress %2$s is available! Please update now." +msgstr "WordPress %2$s est disponible ! Veuillez mettre à jour maintenant." + +#: wp-admin/includes/theme.php:276 +msgid "Portfolio" +msgstr "Portfolio" + +#: wp-admin/includes/theme.php:275 +msgid "Photography" +msgstr "Photographie" + +#: wp-admin/includes/theme.php:274 wp-admin/includes/dashboard.php:1248 +msgid "News" +msgstr "Nouvelles" + +#: wp-admin/includes/theme.php:272 +msgid "Food & Drink" +msgstr "Nourriture & Boisson" + +#: wp-admin/includes/theme.php:271 +msgid "Entertainment" +msgstr "Divertissement" + +#: wp-admin/includes/theme.php:270 +msgid "Education" +msgstr "Éducation" + +#: wp-admin/includes/theme.php:269 +msgid "E-Commerce" +msgstr "E-Commerce" + +#: wp-admin/includes/theme.php:268 +msgid "Blog" +msgstr "Blog" + +#: wp-admin/includes/theme.php:289 +msgid "Footer Widgets" +msgstr "Widgets de pied de page" + +#: wp-admin/includes/theme.php:297 +msgid "Grid Layout" +msgstr "Style en grille" + +#: wp-admin/includes/template.php:2500 +msgid "This will replace the current editor content with the last backup version. You can use undo and redo in the editor to get the old content back or to return to the restored version." +msgstr "Cela remplacera le contenu actuel de l’éditeur par la dernière version sauvegardée. Vous pouvez utiliser les outils Annuler et Rétablir pour rétablir l’ancien contenu ou revenir à la version sauvegardée." + +#: wp-admin/includes/template.php:1873 +msgid "Close media attachment panel" +msgstr "Fermer le panneau des fichiers attachés." + +#: wp-admin/includes/ms.php:1048 +msgid "Info" +msgstr "Info" + +#: wp-admin/includes/meta-boxes.php:1006 +msgid "Need help? Use the Help tab above the screen title." +msgstr "Besoin d’aide ? Utilisez l’onglet « Aide » au dessus du titre de l’écran." + +#: wp-admin/includes/menu.php:350 wp-admin/my-sites.php:17 +#: wp-admin/network/site-info.php:32 wp-admin/network/user-new.php:37 +#: wp-admin/network/index.php:17 wp-admin/network/site-users.php:50 +#: wp-admin/network/upgrade.php:38 wp-admin/network/users.php:14 +#: wp-admin/network/users.php:24 wp-admin/network/users.php:46 +#: wp-admin/network/users.php:60 wp-admin/network/users.php:150 +#: wp-admin/network/site-themes.php:57 wp-admin/network/settings.php:17 +#: wp-admin/network/site-settings.php:32 wp-admin/network/sites.php:14 +#: wp-admin/network/sites.php:140 +msgid "Sorry, you are not allowed to access this page." +msgstr "Désolé, vous n’avez pas l’autorisation d’accéder à cette page." + +#: wp-admin/includes/file.php:51 +msgid "Embed Footer Template" +msgstr "Modèle intégré de pied de page" + +#: wp-admin/includes/file.php:50 +msgid "Embed Header Template" +msgstr "Modèle intégré d’en-tête" + +#: wp-admin/includes/file.php:49 +msgid "Embed Content Template" +msgstr "Modèle intégré de contenu" + +#: wp-admin/includes/file.php:48 +msgid "Embed 404 Template" +msgstr "Modèle intégré 404" + +#: wp-admin/includes/file.php:47 +msgid "Embed Template" +msgstr "Modèle intégré" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:571 +msgctxt "plugin" +msgid "Active" +msgstr "Actif" + +#: wp-admin/includes/class-wp-media-list-table.php:503 +msgid "(Private post)" +msgstr "(Publication privée)" + +#: wp-admin/link-manager.php:12 wp-admin/link-manager.php:91 +#: wp-admin/includes/bookmark.php:32 wp-admin/includes/bookmark.php:326 +msgid "Sorry, you are not allowed to edit the links for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier les liens de ce site." + +#: wp-admin/privacy-policy-guide.php:13 wp-admin/options-privacy.php:13 +msgid "Sorry, you are not allowed to manage privacy on this site." +msgstr "Désolé, vous n’avez pas l’autorisation de gérer la confidentialité sur ce site." + +#: wp-admin/includes/ajax-actions.php:4584 +#: wp-admin/includes/ajax-actions.php:4636 wp-admin/plugins.php:13 +msgid "Sorry, you are not allowed to manage plugins for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de gérer les extensions de ce site." + +#: wp-admin/includes/ajax-actions.php:4551 +msgid "Plugin could not be deleted." +msgstr "L’extension ne peut pas être supprimée." + +#: wp-admin/includes/ajax-actions.php:4511 wp-admin/plugins.php:254 +msgid "Sorry, you are not allowed to delete plugins for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer des extensions sur ce site." + +#: wp-admin/includes/ajax-actions.php:4406 wp-admin/update.php:25 +#: wp-admin/update.php:53 wp-admin/update.php:75 +msgid "Sorry, you are not allowed to update plugins for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de mettre à jour des extensions sur ce site." + +#: wp-admin/includes/ajax-actions.php:4293 wp-admin/update.php:102 +#: wp-admin/update.php:145 wp-admin/plugin-install.php:19 +msgid "Sorry, you are not allowed to install plugins on this site." +msgstr "Désolé, vous n’avez pas l’autorisation d’installer des extensions sur ce site." + +#: wp-admin/includes/ajax-actions.php:4282 +#: wp-admin/includes/ajax-actions.php:4391 +#: wp-admin/includes/ajax-actions.php:4498 +msgid "No plugin specified." +msgstr "Aucune extension spécifiée." + +#: wp-admin/includes/ajax-actions.php:4258 +msgid "Theme could not be deleted." +msgstr "Le thème ne peut pas être supprimé." + +#: wp-admin/includes/ajax-actions.php:4220 +msgid "Sorry, you are not allowed to delete themes on this site." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer les thèmes de ce site." + +#: wp-admin/includes/ajax-actions.php:4187 +msgid "Update failed." +msgstr "Échec de mise à jour." + +#: wp-admin/includes/ajax-actions.php:4003 wp-admin/update.php:224 +#: wp-admin/update.php:264 wp-admin/theme-install.php:16 +msgid "Sorry, you are not allowed to install themes on this site." +msgstr "Désolé, vous n’avez pas l’autorisation d’installer des thèmes sur ce site." + +#: wp-admin/includes/ajax-actions.php:3990 +#: wp-admin/includes/ajax-actions.php:4113 +#: wp-admin/includes/ajax-actions.php:4208 +msgid "No theme specified." +msgstr "Aucun thème spécifié." + +#: wp-admin/admin.php:298 wp-admin/import.php:15 +msgid "Sorry, you are not allowed to import content into this site." +msgstr "Désolé, vous n’avez pas l’autorisation d’importer du contenu sur ce site." + +#: wp-admin/export.php:13 +msgid "Sorry, you are not allowed to export the content of this site." +msgstr "Désolé, vous n’avez pas l’autorisation d’exporter le contenu de ce site." + +#: wp-admin/edit.php:244 +msgid "You can filter the list of posts by post status using the text links above the posts list to only show posts with that status. The default view is to show all posts." +msgstr "Vous pouvez filtrer la liste des articles par état en utilisant les liens au dessus de la liste des articles pour n’afficher que les articles avec cet état. La vue par défaut affiche tous les articles." + +#: wp-admin/customize.php:191 +msgid "Close the Customizer and go back to the previous page" +msgstr "Fermer l’outil de personnalisation et retour vers la page précédente." + +#: wp-admin/includes/class-custom-image-header.php:1029 +msgid "Sorry, you are not allowed to customize headers." +msgstr "Désolé, vous n’avez pas l’autorisation de personnaliser les en-têtes." + +#: wp-admin/credits.php:148 +msgid "Release Deputy" +msgstr "Assistant du responsable de cette version" + +#: wp-admin/credits.php:147 +msgid "Release Design Lead" +msgstr "Responsable Design de cette version" + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:791 +msgid "Allow trackbacks and pingbacks on this page" +msgstr "Autoriser les rétroliens et pings sur cette page." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:767 +msgid "Custom fields can be used to add extra metadata to a post that you can use in your theme." +msgstr "Les champs personnalisés peuvent être utilisés pour ajouter des métadonnées supplémentaires à une publication, que vous pouvez ensuite utiliser dans votre thème." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:730 +msgid "Trackbacks are a way to notify legacy blog systems that you’ve linked to them. If you link other WordPress sites, they’ll be notified automatically using pingbacks, no other action necessary." +msgstr "Un rétrolien est une manière de notifier les anciens systèmes de blog que vous avez fait un lien vers eux. Si vous faites des liens vers des sites WordPress, ils seront notifiés automatiquement à l’aide des pings (en), sans que vous n’ayez rien à faire." + +#. translators: %s: Documentation URL. +#: wp-admin/includes/meta-boxes.php:693 +msgid "Excerpts are optional hand-crafted summaries of your content that can be used in your theme. Learn more about manual excerpts." +msgstr "Les extraits sont des résumés facultatifs de vos articles, écrits à la main. Il se peut que votre thème s’en serve. En savoir plus." + +#: wp-admin/edit-form-advanced.php:293 +msgid "The Text mode allows you to enter HTML along with your post text. Note that <p> and <br> tags are converted to line breaks when switching to the Text editor to make it less cluttered. When you type, a single line break can be used instead of typing <br>, and two line breaks instead of paragraph tags. The line breaks are converted back to tags automatically." +msgstr "Le mode textuel vous permet de saisir de saisir votre texte encadré par votre code HTML. Notez que les balises <p> et <br> sont converties en retours à la ligne lorsque vous entrez dans le mode texte, afin de moins encombrer la fenêtre. Lorsque vous saisissez du texte, un retour à la ligne vous suffit à générer un <br>, et deux retours à la ligne créeront une balise de paragraphe. Les retours à la ligne sont automatiquement convertis en balises HTML." + +#: wp-admin/edit-form-advanced.php:292 +msgid "Visual mode gives you an editor that is similar to a word processor. Click the Toolbar Toggle button to get a second row of controls." +msgstr "Le mode visuel vous donne accès à un éditeur comparable à un traitement de texte. Cliquez sur le bouton d’ouverture/fermeture de la barre d’outils pour afficher une seconde rangée d’options." + +#: wp-admin/upload.php:355 +msgid "Error saving media file." +msgstr "Une erreur est survenue lors de la sauvegarde du fichier média." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:347 +msgid "%s media file restored from the Trash." +msgid_plural "%s media files restored from the Trash." +msgstr[0] "%s fichier média restauré depuis la corbeille." +msgstr[1] "%s fichiers médias restaurés depuis la corbeille." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:334 +msgid "%s media file moved to the Trash." +msgid_plural "%s media files moved to the Trash." +msgstr[0] "%s fichier média déplacé dans la corbeille." +msgstr[1] "%s fichiers médias déplacés dans la corbeille." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:322 +msgid "%s media file permanently deleted." +msgid_plural "%s media files permanently deleted." +msgstr[0] "%s fichier média supprimé définitivement." +msgstr[1] "%s fichiers médias supprimés définitivement." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:310 +msgid "%s media file detached." +msgid_plural "%s media files detached." +msgstr[0] "%s fichier média détaché." +msgstr[1] "%s fichiers médias détachés." + +#: wp-admin/upload.php:307 +msgid "Media file detached." +msgstr "Fichier média détaché." + +#. translators: %s: Number of media files. +#: wp-admin/upload.php:298 +msgid "%s media file attached." +msgid_plural "%s media files attached." +msgstr[0] "%s fichier média attaché." +msgstr[1] "%s fichiers médias attachés." + +#: wp-admin/upload.php:295 +msgid "Media file attached." +msgstr "Fichier média attaché." + +#: wp-admin/media.php:108 wp-admin/upload.php:288 wp-admin/upload.php:353 +#: wp-admin/edit-form-advanced.php:208 +msgid "Media file updated." +msgstr "Fichier média mis à jour." + +#. translators: 1: Theme name, 2: Version number. +#. translators: 1: Plugin name, 2: Version number. +#: wp-admin/includes/theme.php:211 wp-admin/includes/theme.php:224 +#: wp-admin/includes/theme.php:237 wp-admin/includes/update.php:472 +#: wp-admin/includes/update.php:485 wp-admin/includes/update.php:499 +#: wp-admin/includes/update.php:518 wp-admin/includes/update.php:658 +#: wp-admin/includes/update.php:671 wp-admin/includes/update.php:684 +#: wp-admin/update-core.php:392 +msgid "View %1$s version %2$s details" +msgstr "Afficher les détails de la version %2$s de l’extension ou du thème %1$s" + +#. translators: 1: Relative date, 2: Time. +#: wp-admin/includes/dashboard.php:974 +msgctxt "dashboard" +msgid "%1$s, %2$s" +msgstr "%1$s, %2$s" + +#: wp-admin/edit-form-advanced.php:370 +msgid "Publish — You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). The Password protected option allows you to set an arbitrary password for each post. The Private option hides the post from everyone except editors and administrators. Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post." +msgstr "Publier - Vous pouvez définir la manière dont votre publication est mise en ligne dans la section « Publier ». Pour « État », « Visibilité », et « Publier (tout de suite) », un clic sur le lien « Modifier » affichera plus d’options. « Visibilité » inclut des options pour protéger la publication avec un mot de passe ou faire en sorte qu’il reste haut de page indéfiniment (en avant). L’option de protection par mot de passe vous permet de protéger chacune de vos publications avec un mot de passe. L’option « Privé » cache la publication pour tout le monde, sauf aux Éditeurs et Administrateurs. « Publier (tout de suite) » vous permet de planifier la sortie de votre publication à une date précise, dans le futur ou le passé ; cela vous permet d’écrire à l’avance les publications à mettre en ligne, ou de les antidater." + +#. translators: %s: New email. +#: wp-admin/user-edit.php:521 +msgid "There is a pending change of your email to %s." +msgstr "Il y a une modification en cours de votre adresse de messagerie, en faveur de %s." + +#: wp-admin/user-edit.php:208 +msgid "Error while saving the new email address. Please try again." +msgstr "Une erreur est survenue lors de l’enregistrement de votre adresse de messagerie. Veuillez réessayer." + +#: wp-admin/upload.php:229 +msgid "You can narrow the list by file type/status or by date using the dropdown menus above the media table." +msgstr "Vous pouvez limiter cette liste par type de fichier ou par état à l’aide des filtres situés au-dessus de la liste de médias." + +#: wp-admin/themes.php:385 wp-admin/network/themes.php:328 +msgid "The following themes are installed but incomplete." +msgstr "Les thèmes suivants sont installés mais incomplets." + +#: wp-admin/themes.php:212 +msgid "New theme activated." +msgstr "Nouveau thème activé." + +#: wp-admin/themes.php:208 +msgid "Settings saved and theme activated." +msgstr "Réglages enregistrés et thème activé." + +#: wp-admin/freedoms.php:104 wp-admin/themes.php:117 +#: wp-admin/theme-install.php:98 +msgid "https://wordpress.org/themes/" +msgstr "https://fr.wordpress.org/themes/" + +#: wp-admin/users.php:188 +msgid "Sorry, you are not allowed to delete that user." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer cet utilisateur." + +#: wp-admin/setup-config.php:227 +msgid "Your database password." +msgstr "Votre mot de passe de base de données." + +#: wp-admin/setup-config.php:222 +msgid "Your database username." +msgstr "Nom d’utilisateur MySQL." + +#: wp-admin/setup-config.php:217 +msgid "The name of the database you want to use with WordPress." +msgstr "Le nom de la base de données avec laquelle vous souhaitez utiliser WordPress." + +#. translators: 1: Plugin name, 2: Plugin author. +#: wp-admin/plugins.php:343 +msgctxt "plugin" +msgid "%1$s by %2$s" +msgstr "%1$s par %2$s" + +#. translators: 1: Plugin name, 2: Plugin author. +#: wp-admin/plugins.php:339 +msgid "%1$s by %2$s (will also delete its data)" +msgstr "%1$s par %2$s (attention : supprimera également les données liées)" + +#. translators: %s: New admin email. +#: wp-admin/options-general.php:123 +msgid "There is a pending change of the admin email to %s." +msgstr "Il y a un changement en attente de l’e-mail de l’administrateur vers %s." + +#: wp-admin/install.php:396 +msgid "WordPress has been installed. Thank you, and enjoy!" +msgstr "WordPress est installé. Merci et profitez bien !" + +#. translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES +#: wp-admin/install.php:286 +msgid "The constant %s cannot be defined when installing WordPress." +msgstr "La constante %s ne peut pas être définie lors de l’installation de WordPress." + +#. translators: %s: wp-config.php +#: wp-admin/install.php:273 +msgid "Your %s file has an empty database table prefix, which is not supported." +msgstr "Votre fichier %s a un préfixe de base de donnée vide, ce qui n’est pas supporté." + +#: wp-admin/index.php:131 +msgid "Dismiss the welcome panel" +msgstr "Ignorer le panneau de bienvenue" + +#: wp-admin/includes/theme-install.php:185 +msgid "Theme zip file" +msgstr "Fichier zip du thème" + +#: wp-admin/includes/template.php:1872 +msgid "Attach to existing content" +msgstr "Attacher à un contenu existant" + +#: wp-admin/includes/post.php:1547 +msgid "Click the image to edit or update" +msgstr "Cliquez sur l’image pour la modifier ou la mettre à jour." + +#. translators: 1: Number of stars (used to determine singular/plural), 2: +#. Number of reviews. +#: wp-admin/includes/plugin-install.php:739 +msgid "Reviews with %1$d star: %2$s. Opens in a new tab." +msgid_plural "Reviews with %1$d stars: %2$s. Opens in a new tab." +msgstr[0] "Avis avec %1$d étoile : %2$s. S’ouvre dans une nouvelle fenêtre." +msgstr[1] "Avis avec %1$d étoiles : %2$s. S’ouvre dans une nouvelle fenêtre." + +#: wp-admin/includes/plugin-install.php:731 +msgid "Read all reviews on WordPress.org or write your own!" +msgstr "Lisez tous les avis sur WordPress.org ou écrivez le vôtre !" + +#: wp-admin/includes/plugin-install.php:730 +msgid "Reviews" +msgstr "Avis" + +#. translators: %s: URL to "Features as Plugins" page. +#: wp-admin/includes/plugin-install.php:405 +msgid "You are using a development version of WordPress. These feature plugins are also under development. Learn more." +msgstr "Vous utilisez une version en développement de WordPress. Ces fonctionnalités d’extensions sont aussi en développement. En savoir plus." + +#: wp-admin/includes/image-edit.php:161 +msgid "Thumbnail Settings Help" +msgstr "Aide aux réglages de la miniature" + +#: wp-admin/includes/image-edit.php:146 +msgid "selection height" +msgstr "hauteur de la sélection" + +#: wp-admin/includes/image-edit.php:143 +msgid "selection width" +msgstr "largeur de la sélection" + +#: wp-admin/includes/image-edit.php:135 +msgid "crop ratio height" +msgstr "Proportion verticale" + +#: wp-admin/includes/image-edit.php:132 +msgid "crop ratio width" +msgstr "Proportion horizontale" + +#: wp-admin/includes/image-edit.php:116 +msgid "Image Crop Help" +msgstr "Aide au recadrage d’image" + +#: wp-admin/includes/image-edit.php:78 +msgid "scale height" +msgstr "Redimensionner en hauteur" + +#: wp-admin/includes/image-edit.php:75 +msgid "scale width" +msgstr "Redimensionner en largeur" + +#: wp-admin/includes/image-edit.php:73 +msgid "New dimensions:" +msgstr "Nouvelles dimensions :" + +#: wp-admin/includes/image-edit.php:55 +msgid "Scale Image Help" +msgstr "Aide sur le redimensionnement d’image" + +#: wp-admin/includes/file.php:37 +msgid "Single Page" +msgstr "Page individuelle" + +#: wp-admin/includes/file.php:35 +msgid "Singular Template" +msgstr "Modèle individuel" + +#: wp-admin/includes/file.php:33 +msgid "Date Template" +msgstr "Modèle de date" + +#: wp-admin/includes/file.php:28 +msgid "Taxonomy Template" +msgstr "Modèle de taxonomie" + +#: wp-admin/includes/dashboard.php:1625 +msgid "Dismiss the browser warning panel" +msgstr "Masquer l’alerte du navigateur" + +#: wp-admin/includes/dashboard.php:1042 +msgid "View more comments" +msgstr "Voir plus de commentaires" + +#. translators: 1: Type of comment, 2: Post link, 3: Notification if the +#. comment is pending. +#: wp-admin/includes/dashboard.php:833 +msgctxt "dashboard" +msgid "%1$s on %2$s %3$s" +msgstr "%1$s sur %2$s %3$s" + +#: wp-admin/includes/dashboard.php:741 +msgid "View this comment" +msgstr "Voir ce commentaire" + +#: wp-admin/includes/class-core-upgrader.php:30 +msgid "Another update is currently in progress." +msgstr "Une autre mise à jour est actuellement en cours." + +#: wp-admin/includes/class-plugin-upgrader-skin.php:51 +#: wp-admin/update-core.php:859 wp-admin/update-core.php:898 +msgid "Update progress" +msgstr "Progression de la mise à jour" + +#. translators: %s: Taxonomy term name. +#: wp-admin/includes/class-wp-terms-list-table.php:501 +msgid "View “%s” archive" +msgstr "Voir l’archive pour « %s »" + +#. translators: %s: Taxonomy term name. +#: wp-admin/includes/class-wp-terms-list-table.php:492 +msgid "Delete “%s”" +msgstr "Supprimer « %s »" + +#. translators: %s: Taxonomy term name. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-terms-list-table.php:483 +#: wp-admin/includes/class-wp-posts-list-table.php:1349 +msgid "Quick edit “%s” inline" +msgstr "Modifier rapidement « %s » en ligne" + +#: wp-admin/includes/class-wp-plugins-list-table.php:354 +msgid "Search for plugins in the WordPress Plugin Directory." +msgstr "Rechercher des extensions dans le répertoire des extensions WordPress." + +#. translators: %s: Plugin search term. +#: wp-admin/includes/class-wp-plugins-list-table.php:350 +msgid "No plugins found for “%s”." +msgstr "Aucune extension trouvée pour « %s »." + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:731 +#: wp-admin/includes/class-wp-posts-list-table.php:1361 +msgid "Restore “%s” from the Trash" +msgstr "Restaurer « %s » depuis la corbeille" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:693 +#: wp-admin/includes/class-wp-media-list-table.php:750 +#: wp-admin/includes/class-wp-posts-list-table.php:1378 +msgid "Delete “%s” permanently" +msgstr "Supprimer « %s » définitivement" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:683 +#: wp-admin/includes/class-wp-media-list-table.php:739 +#: wp-admin/includes/class-wp-posts-list-table.php:1369 +msgid "Move “%s” to the Trash" +msgstr "Déplacer « %s » dans la corbeille" + +#. translators: %s: Attachment title. +#: wp-admin/includes/class-wp-media-list-table.php:533 +#: wp-admin/includes/class-wp-media-list-table.php:711 +msgid "Attach “%s” to existing content" +msgstr "Attacher « %s » à du contenu existant" + +#. translators: %s: Title of the post the attachment is attached to. +#: wp-admin/includes/class-wp-media-list-table.php:519 +msgid "Detach from “%s”" +msgstr "Détacher de « %s »" + +#. translators: %s: Taxonomy term name. +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-terms-list-table.php:414 +#: wp-admin/includes/class-wp-media-list-table.php:393 +#: wp-admin/includes/class-wp-posts-list-table.php:1022 +msgid "“%s” (Edit)" +msgstr "« %s » (Modifier)" + +#: wp-admin/includes/class-wp-media-list-table.php:137 +msgctxt "attachment filter" +msgid "Trash" +msgstr "Corbeille" + +#. translators: %s: stream_get_contents() +#: wp-admin/includes/class-wp-filesystem-ssh2.php:77 +msgid "The ssh2 PHP extension is available, however, we require the PHP5 function %s" +msgstr "L’extension PHP ssh2 est disponible, cependant elle nécessite la fonction PHP5 %s" + +#: wp-admin/includes/class-wp-comments-list-table.php:727 +msgid "Quick edit this comment inline" +msgstr "Modifier ce commentaire sur cette page" + +#: wp-admin/includes/class-wp-comments-list-table.php:715 +#: wp-admin/includes/dashboard.php:699 +msgid "Edit this comment" +msgstr "Modifier ce commentaire" + +#: wp-admin/includes/class-wp-comments-list-table.php:678 +msgid "Restore this comment from the spam" +msgstr "Restaurer ce commentaire depuis les indésirables" + +#. translators: 1: User login, 2: User email address. +#: wp-admin/includes/ajax-actions.php:325 +msgctxt "user autocomplete result" +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#. translators: %s: Importer slug. +#: wp-admin/import.php:67 +msgid "The %s importer is invalid or is not installed." +msgstr "L’importateur %s n’est pas installé ou n’est pas valide." + +#: wp-admin/edit-form-comment.php:117 +msgctxt "comment status" +msgid "Pending" +msgstr "En attente" + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:596 +msgid "Suggested height is %s." +msgstr "La hauteur suggérée est de %s." + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:585 +msgid "Suggested width is %s." +msgstr "La taille suggérée est de %s." + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:572 +msgid "Images should be at least %s tall." +msgstr "Les images devraient faire au moins %s de haut." + +#. translators: %d: Custom header width. +#. translators: %d: Custom header height. +#: wp-admin/includes/class-custom-image-header.php:563 +#: wp-admin/includes/class-custom-image-header.php:575 +#: wp-admin/includes/class-custom-image-header.php:588 +#: wp-admin/includes/class-custom-image-header.php:599 +msgid "%d pixels" +msgstr "%d pixels" + +#. translators: %s: Size in pixels. +#: wp-admin/includes/class-custom-image-header.php:560 +msgid "Images should be at least %s wide." +msgstr "Les images doivent être large de %s minimum." + +#: wp-admin/user-new.php:547 +msgid "Send the new user an email about their account." +msgstr "Envoyer un message au nouvel utilisateur à propos de son compte." + +#: wp-admin/user-new.php:544 +msgid "Send User Notification" +msgstr "Envoyer une notification à l’utilisateur" + +#. translators: %s: Menu name. +#: wp-admin/nav-menus.php:989 +msgctxt "menu location" +msgid "(Currently set to: %s)" +msgstr "(Actuellement réglé sur : %s)" + +#. translators: %s: WordPress version number. +#: wp-admin/about.php:295 +msgid "Version %s addressed one security issue." +msgstr "La version %s a corrigé un problème de sécurité." + +#: wp-admin/user-edit.php:587 +msgid "https://en.gravatar.com/" +msgstr "https://fr.gravatar.com/" + +#: wp-admin/user-edit.php:578 +msgid "Profile Picture" +msgstr "Illustration du profil" + +#: wp-admin/about.php:53 wp-admin/about.php:292 +msgid "Maintenance and Security Releases" +msgstr "Mises à jour de maintenance et de sécurité" + +#: wp-admin/about.php:289 +msgid "Security Releases" +msgstr "Mises à jour de sécurité" + +#: wp-admin/about.php:286 +msgid "Maintenance Releases" +msgstr "Mises à jour de maintenance" + +#: wp-admin/options-permalink.php:222 +msgid "Plain" +msgstr "Simple" + +#. translators: %s: Documentation URL. +#: wp-admin/options-permalink.php:198 +msgid "WordPress offers you the ability to create a custom URL structure for your permalinks and archives. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A number of tags are available, and here are some examples to get you started." +msgstr "WordPress vous offre la possibilité de créer une structure personnalisée d’adresses web pour vos permaliens et archives. Ceci peut améliorer l’esthétique, l’utilisabilité et la pérennité de vos liens. De nombreuses balises sont disponibles, et nous vous donnons quelques exemples pour commencer." + +#: wp-admin/options-permalink.php:33 +msgid "Permalinks can contain useful information, such as the post date, title, or other elements. You can choose from any of the suggested permalink formats, or you can craft your own if you select Custom Structure." +msgstr "Un permalien peut contenir des informations utiles, telles que le titre de l’article, sa date de publication ou d’autres éléments. Vous pouvez choisir n’importe quel type de format de permalien parmi les réglages les plus courants, ou concevoir votre propre structure personnalisée." + +#. translators: %s: wp-config.php +#: wp-admin/setup-config.php:405 +msgid "You can create the %s file manually and paste the following text into it." +msgstr "Vous pouvez créer le fichier %s manuellement et y coller le contenu suivant." + +#. translators: %s: localhost +#: wp-admin/setup-config.php:235 +msgid "You should be able to get this info from your web host, if %s doesn’t work." +msgstr "Si %s ne fonctionne pas, demandez cette information à l’hébergeur de votre site." + +#. translators: %s: Documentation URL. +#: wp-admin/setup-config.php:191 +msgid "Need more help? We got it." +msgstr "Besoin d’aide ? Nous sommes là." + +#. translators: 1: wp-config-sample.php, 2: wp-config.php +#: wp-admin/setup-config.php:182 +msgid "If for any reason this automatic file creation doesn’t work, don’t worry. All this does is fill in the database information to a configuration file. You may also simply open %1$s in a text editor, fill in your information, and save it as %2$s." +msgstr "Si pour une raison ou pour une autre la création automatique du fichier ne fonctionne pas, ne vous inquiétez pas. Sa seule action est d’ajouter les informations de la base de données dans un fichier de configuration. Vous pouvez aussi simplement ouvrir %1$s dans un éditeur de texte, y remplir vos informations et l’enregistrer sous le nom de %2$s." + +#. translators: %s: wp-config.php +#: wp-admin/setup-config.php:174 +msgid "We’re going to use this information to create a %s file." +msgstr "Nous allons utiliser ces informations pour créer le fichier %s." + +#. translators: %s: wp-content/uploads +#: wp-admin/options-media.php:119 +msgid "Default is %s" +msgstr "Par défaut, %s" + +#. translators: 1: .po, 2: .mo +#: wp-admin/includes/class-language-pack-upgrader.php:351 +msgid "The language pack is missing either the %1$s or %2$s files." +msgstr "Il manque soit le fichier %1$s, soit le fichier %2$s du pack de langue." + +#. translators: %s: index.php +#: wp-admin/includes/class-theme-upgrader.php:514 +msgid "The theme is missing the %s file." +msgstr "Le thème n’a pas de fichier %s." + +#. translators: %s: style.css +#: wp-admin/includes/class-theme-upgrader.php:501 +msgid "The %s stylesheet doesn’t contain a valid theme header." +msgstr "Le fichier %s ne contient pas d’en-tête de thème valide." + +#. translators: %s: style.css +#: wp-admin/includes/class-theme-upgrader.php:481 +msgid "The theme is missing the %s stylesheet." +msgstr "Le thème n’a pas de fichier %s." + +#: wp-admin/theme-install.php:195 +msgid "If you have marked themes as favorites on WordPress.org, you can browse them here." +msgstr "Si vous avez mis des thèmes en favoris sur WordPress.org, vous pourrez les parcourir ici." + +#: wp-admin/theme-install.php:178 +msgctxt "themes" +msgid "Favorites" +msgstr "Favoris" + +#: wp-admin/maint/repair.php:71 +msgid "Database repair results" +msgstr "Résultats de la réparation de la base de données" + +#: wp-admin/maint/repair.php:30 +msgid "Allow automatic database repair" +msgstr "Autoriser la réparation automatique de la base de données" + +#: wp-admin/setup-config.php:446 +msgid "Successful database connection" +msgstr "La connexion à la base de données s’est bien faite" + +#: wp-admin/setup-config.php:210 +msgid "Set up your database connection" +msgstr "Configurer la connexion à votre base de données" + +#: wp-admin/setup-config.php:161 +msgid "Before getting started" +msgstr "Avant de se lancer" + +#: wp-admin/maint/repair.php:159 +msgid "WordPress database repair" +msgstr "Réparation de la base de données de WordPress" + +#: wp-admin/maint/repair.php:64 +msgid "Check secret keys" +msgstr "Vérifier les clés secrètes" + +#. translators: %s: Nav menu title. +#: wp-admin/includes/nav-menu.php:1229 +msgid "%s has been updated." +msgstr "%s a été mis à jour." + +#. translators: %s: Walker class name. +#: wp-admin/includes/nav-menu.php:1051 +msgid "The Walker class named %s does not exist." +msgstr "La classe Walker nommée %s n’existe pas." + +#. translators: 1: Drop-in constant name, 2: wp-config.php +#: wp-admin/includes/class-wp-plugins-list-table.php:655 +msgid "Requires %1$s in %2$s file." +msgstr "Nécessite la constance %1$s dans le fichier %2$s." + +#. translators: %s: Date and time. +#: wp-admin/options-general.php:289 +msgid "Standard time begins on: %s." +msgstr "Le passage à l’heure d’hiver commence le %s." + +#. translators: %s: Date and time. +#: wp-admin/options-general.php:287 +msgid "Daylight saving time begins on: %s." +msgstr "Le passage à l’heure d’été commence le %s." + +#. translators: %s: File name. +#: wp-admin/includes/media.php:1708 +msgid "You are about to delete %s." +msgstr "Vous êtes sur le point de supprimer %s." + +#. translators: %s: mu-plugins directory name. +#: wp-admin/includes/class-wp-plugins-list-table.php:570 +msgid "Files in the %s directory are executed automatically." +msgstr "Les fichiers du répertoire %s sont exécutés automatiquement." + +#: wp-admin/widgets.php:492 +msgid "This will clear all items from the inactive widgets list. You will not be able to restore any customizations." +msgstr "Cela supprimera tous les éléments de la liste des widgets désactivés. Vous ne pourrez récupérer aucune personnalisation." + +#: wp-admin/widgets.php:482 +msgid "Clear Inactive Widgets" +msgstr "Vider les widgets désactivés" + +#: wp-admin/users.php:146 wp-admin/network/site-users.php:163 +msgid "One of the selected users is not a member of this site." +msgstr "Un des utilisateurs sélectionnés n’est pas un abonné de ce site." + +#: wp-admin/users.php:83 wp-admin/network/users.php:236 +msgid "Users list" +msgstr "Liste des utilisateurs" + +#: wp-admin/users.php:82 wp-admin/network/users.php:235 +msgid "Users list navigation" +msgstr "Navigation de la liste des utilisateurs" + +#: wp-admin/users.php:81 wp-admin/network/users.php:234 +msgid "Filter users list" +msgstr "Liste des filtres utilisateurs" + +#: wp-admin/upload.php:260 +msgid "Media items list" +msgstr "Liste des éléments média" + +#: wp-admin/upload.php:259 +msgid "Media items list navigation" +msgstr "Navigation de la liste des éléments média" + +#: wp-admin/upload.php:258 +msgid "Filter media items list" +msgstr "Filtrer la liste des fichiers média." + +#: wp-admin/themes.php:461 +msgid "Install Parent Theme" +msgstr "Installer le thème parent" + +#: wp-admin/theme-install.php:237 wp-admin/network/themes.php:254 +msgid "Themes list" +msgstr "Liste des thèmes" + +#: wp-admin/theme-install.php:167 wp-admin/network/themes.php:252 +msgid "Filter themes list" +msgstr "Filtrer la liste des thèmes" + +#: wp-admin/plugins.php:583 +msgid "All selected plugins are up to date." +msgstr "Toutes les extensions sélectionnées sont à jour." + +#: wp-admin/plugins.php:479 wp-admin/plugin-install.php:117 +msgid "Plugins list" +msgstr "Liste des extensions" + +#: wp-admin/plugins.php:478 wp-admin/plugin-install.php:116 +msgid "Plugins list navigation" +msgstr "Navigation de la liste des extensions" + +#: wp-admin/plugins.php:477 wp-admin/plugin-install.php:115 +msgid "Filter plugins list" +msgstr "Filtrer la liste des extensions" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:211 +msgid "Browsing %s (inactive)" +msgstr "Parcours de %s (désactivée)" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:208 +msgid "Editing %s (inactive)" +msgstr "Modification de %s (désactivée)" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:203 +msgid "Browsing %s (active)" +msgstr "Parcours de %s (activée)" + +#. translators: %s: Plugin file name. +#: wp-admin/plugin-editor.php:200 +msgid "Editing %s (active)" +msgstr "Modification de %s (activée)" + +#. translators: %s: Local time. +#: wp-admin/options-general.php:256 +msgid "Local time is %s." +msgstr "L’heure locale est %s." + +#: wp-admin/my-sites.php:72 wp-admin/network/menu.php:53 +#: wp-admin/network/sites.php:364 +msgctxt "site" +msgid "Add New" +msgstr "Ajouter" + +#: wp-admin/link-manager.php:84 +msgid "Links list" +msgstr "Liste des liens" + +#. translators: %s: WordPress version. +#: wp-admin/includes/update.php:265 +msgid "Get Version %s" +msgstr "Obtenir la version %s" + +#. translators: %s: Meta box title. +#: wp-admin/includes/template.php:1314 +msgid "Toggle panel: %s" +msgstr "Ouvrir/fermer la section %s" + +#: wp-admin/includes/post.php:1772 +msgid "Saving revision…" +msgstr "Enregistrement de la révision…" + +#: wp-admin/includes/post.php:1471 +msgid "Edit permalink" +msgstr "Modifier le permalien" + +#. translators: 1: Site Wide Only: true, 2: Network: true +#: wp-admin/includes/plugin.php:91 +msgid "The %1$s plugin header is deprecated. Use %2$s instead." +msgstr "L’en-tête d’extensions %1$s est obsolète. Utilisez plutôt %2$s." + +#: wp-admin/includes/class-wp-site-health.php:1002 +#: wp-admin/includes/class-wp-site-health.php:1667 +msgid "Warning" +msgstr "Avertissement" + +#: wp-admin/includes/template.php:1323 wp-admin/includes/network.php:125 +#: wp-admin/includes/network.php:200 wp-admin/includes/network.php:260 +#: wp-admin/includes/network.php:309 wp-admin/includes/network.php:322 +#: wp-admin/includes/network.php:423 wp-admin/includes/network.php:611 +#: wp-admin/includes/network.php:653 +msgid "Warning:" +msgstr "Attention :" + +#: wp-admin/includes/ms.php:977 +msgid "Once you hit “Confirm Deletion”, these users will be permanently removed." +msgstr "Dès que vous aurez cliqué sur « Confirmer cette action », ces utilisateurs seront définitivement supprimés." + +#: wp-admin/includes/ms.php:975 +msgid "Once you hit “Confirm Deletion”, the user will be permanently removed." +msgstr "Dès que vous aurez cliqué sur « Confirmer cette action », l’utilisateur sera définitivement supprimé." + +#: wp-admin/includes/ms.php:960 +msgid "User has no sites or content and will be deleted." +msgstr "L’utilisateur n’a pas de site ou de contenu, et sera supprimé." + +#. translators: %s: Link to user's site. +#: wp-admin/includes/ms.php:945 +msgid "Site: %s" +msgstr "Site : %s" + +#: wp-admin/includes/ms.php:927 +msgid "Select a user" +msgstr "Sélectionnez un utilisateur" + +#. translators: %s: User login. +#: wp-admin/includes/ms.php:912 +msgid "What should be done with content owned by %s?" +msgstr "Que faire du contenu ayant %s pour propriétaire ?" + +#. translators: %s: User login. +#: wp-admin/includes/ms.php:893 +msgid "Warning! User cannot be deleted. The user %s is a network administrator." +msgstr "Avertissement ! L’utilisateur ne peut pas être supprimé. L’utilisateur %s est administrateur du réseau." + +#. translators: %s: User login. +#: wp-admin/includes/ms.php:883 +msgid "Warning! User %s cannot be deleted." +msgstr "Avertissement ! L’utilisateur %s ne peut pas être supprimé." + +#: wp-admin/includes/ms.php:862 +msgid "You have chosen to delete the following users from all networks and sites." +msgstr "Vous avez choisi de supprimer les utilisateurs suivants de tous les réseaux et sites. " + +#: wp-admin/includes/ms.php:860 +msgid "You have chosen to delete the user from all networks and sites." +msgstr "Vous avez choisi de supprimer l’utilisateur de tous les réseaux et sites." + +#: wp-admin/includes/media.php:987 +msgid "Invalid image URL." +msgstr "Adresse web non valide pour l’image." + +#: wp-admin/includes/file.php:17 +msgid "Theme Header" +msgstr "En-tête du thème" + +#: wp-admin/includes/file.php:18 +msgid "Theme Footer" +msgstr "Pied de page du thème" + +#. translators: Date and time format for recent posts on the dashboard, from a +#. different calendar year, see https://www.php.net/date +#: wp-admin/includes/dashboard.php:961 +msgid "M jS Y" +msgstr "j M Y" + +#. translators: 1: Comment author, 2: Notification if the comment is pending. +#: wp-admin/includes/dashboard.php:804 +msgid "From %1$s %2$s" +msgstr "De %1$s %2$s" + +#: wp-admin/includes/dashboard.php:603 +msgid "View all drafts" +msgstr "Voir tous les brouillons" + +#: wp-admin/includes/class-wp-users-list-table.php:627 +msgctxt "no user roles" +msgid "None" +msgstr "Aucun" + +#: wp-admin/includes/class-wp-users-list-table.php:243 +msgid "No role" +msgstr "Aucun rôle" + +#. translators: 1: Title of an update, 2: Error message. +#: wp-admin/includes/class-bulk-upgrader-skin.php:43 +msgid "An error occurred while updating %1$s: %2$s" +msgstr "Une erreur est survenue lors de la mise à jour de %1$s : %2$s" + +#: wp-admin/includes/class-wp-screen.php:1323 +msgid "View Mode" +msgstr "Mode d’affichage" + +#: wp-admin/includes/class-wp-screen.php:1269 +msgid "Pagination" +msgstr "Pagination" + +#. translators: %s: Number of columns on the page. +#: wp-admin/includes/class-wp-screen.php:1207 +msgid "%s column" +msgid_plural "%s columns" +msgstr[0] "%s colonne" +msgstr[1] "%s colonnes" + +#: wp-admin/includes/class-wp-screen.php:1114 +msgid "Boxes" +msgstr "Sections" + +#: wp-admin/includes/class-wp-screen.php:1002 +msgid "Additional settings" +msgstr "Réglages supplémentaires" + +#: wp-admin/includes/class-wp-screen.php:762 +msgid "Items list" +msgstr "Liste des éléments" + +#: wp-admin/includes/class-wp-screen.php:761 +msgid "Items list navigation" +msgstr "Navigation de la liste des éléments" + +#: wp-admin/includes/class-wp-screen.php:760 +msgid "Filter items list" +msgstr "Filtrer la liste des éléments" + +#: wp-admin/includes/class-wp-plugins-list-table.php:710 +msgid "Network Only" +msgstr "Réseau seul" + +#: wp-admin/includes/class-wp-plugins-list-table.php:706 +msgid "Network Active" +msgstr "Activé sur le réseau" + +#: wp-admin/includes/class-wp-list-table.php:734 +msgid "No pending comments" +msgstr "Aucun commentaire en attente" + +#. translators: %s: hostname:port +#: wp-admin/includes/class-wp-filesystem-ssh2.php:181 +msgid "Failed to initialize a SFTP subsystem session with the SSH2 Server %s" +msgstr "Échec de l’initialisation d’une session de sous-système SFTP avec le serveur SSH2 %s." + +#: wp-admin/includes/class-wp-comments-list-table.php:464 +msgctxt "column name" +msgid "Submitted On" +msgstr "Envoyé le" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:258 +msgctxt "comments" +msgid "Trash (%s)" +msgid_plural "Trash (%s)" +msgstr[0] "Mis à la corbeille (%s)" +msgstr[1] "Mis à la corbeille (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:251 +msgctxt "comments" +msgid "Spam (%s)" +msgid_plural "Spam (%s)" +msgstr[0] "Indésirable (%s)" +msgstr[1] "Indésirables (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:244 +msgctxt "comments" +msgid "Approved (%s)" +msgid_plural "Approved (%s)" +msgstr[0] "Approuvé (%s)" +msgstr[1] "Approuvés (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:237 +msgctxt "comments" +msgid "Pending (%s)" +msgid_plural "Pending (%s)" +msgstr[0] "En attente (%s)" +msgstr[1] "En attente (%s)" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:223 +msgctxt "comments" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Tous (%s) " +msgstr[1] "Tous (%s) " + +#. translators: %s: The new user. +#: wp-admin/includes/ajax-actions.php:1698 +msgid "User %s added" +msgstr "L’utilisateur %s a été ajouté" + +#: wp-admin/export.php:214 wp-admin/export.php:261 wp-admin/export.php:301 +msgid "End date:" +msgstr "Date de fin :" + +#: wp-admin/export.php:178 +msgid "Content to export" +msgstr "Contenu à exporter" + +#: wp-admin/edit.php:245 +msgid "You can view posts in a simple title list or with an excerpt using the Screen Options tab." +msgstr "Vous pouvez voir la liste des publications en titre simple ou avec un extrait à l’aide du bouton « Options de l’écran »." + +#. translators: %s: Comment date. +#: wp-admin/edit-form-comment.php:136 +msgid "Submitted on: %s" +msgstr "Envoyé le : %s" + +#: wp-admin/edit-form-comment.php:32 +msgctxt "comment" +msgid "Permalink:" +msgstr "Permalien :" + +#: wp-admin/edit-form-advanced.php:206 +msgid "Page draft updated." +msgstr "Le brouillon de la page a été mis à jour." + +#. translators: %s: Scheduled date for the page. +#: wp-admin/edit-form-advanced.php:205 +msgid "Page scheduled for: %s." +msgstr "Page programmée pour le %s." + +#: wp-admin/edit-form-advanced.php:203 +msgid "Page submitted." +msgstr "Page envoyée." + +#: wp-admin/edit-form-advanced.php:191 +msgid "Post draft updated." +msgstr "Le brouillon de la publication a été mis à jour." + +#. translators: %s: Scheduled date for the post. +#: wp-admin/edit-form-advanced.php:190 +msgid "Post scheduled for: %s." +msgstr "Publication planifiée pour le %s." + +#: wp-admin/edit-form-advanced.php:188 +msgid "Post submitted." +msgstr "Publication transmise." + +#: wp-admin/edit-form-advanced.php:164 +msgid "View page" +msgstr "Voir la page" + +#: wp-admin/edit-form-advanced.php:150 wp-admin/edit-form-advanced.php:157 +msgid "Preview page" +msgstr "Prévisualiser la page" + +#: wp-admin/edit-form-advanced.php:129 wp-admin/edit-form-advanced.php:136 +msgid "Preview post" +msgstr "Prévisualiser la publication" + +#: wp-admin/edit-comments.php:204 +msgid "Comments list" +msgstr "Liste des commentaires" + +#: wp-admin/edit-comments.php:203 +msgid "Comments list navigation" +msgstr "Navigation de la liste des commentaires" + +#: wp-admin/edit-comments.php:202 +msgid "Filter comments list" +msgstr "Filtrer la liste des commentaires" + +#: wp-admin/edit-comments.php:187 +msgid "In the Submitted On column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site." +msgstr "Dans la colonne Envoyé le, vous trouverez la date et l’heure de publication du commentaire sur votre site. En cliquant sur le lien, vous ouvrirez la page du lien sur votre site." + +#: wp-admin/edit-comments.php:185 +msgid "In the Comment column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment." +msgstr "Dans la colonne Commentaire, survolez n’importe quel commentaire avec votre souris afin d’afficher les liens pour approuver ce commentaire, y répondre (en l’approuvant), le modifier rapidement, le marquer comme indésirable, ou le mettre à la corbeille." + +#. translators: 1: Comments count, 2: Post title. +#: wp-admin/edit-comments.php:144 +msgid "Comments (%1$s) on “%2$s”" +msgstr "Commentaires (%1$s) sur « %2$s »" + +#: wp-admin/includes/class-custom-image-header.php:948 +msgid "The current theme does not support a flexible sized header image." +msgstr "Le thème actuel ne peut pas utiliser une image d’en-tête à taille variable." + +#: wp-admin/includes/class-custom-image-header.php:776 +#: wp-admin/includes/class-custom-image-header.php:940 +msgid "The current theme does not support uploading a custom header image." +msgstr "Le thème actuel ne permet pas de téléverser une image d’en-tête personnalisée." + +#: wp-admin/includes/user.php:520 +msgid "You’re using the auto-generated password for your account. Would you like to change it?" +msgstr "Vous utilisez le mot de passe auto-généré pour votre compte. Voulez-vous le changer ?" + +#: wp-admin/users.php:419 +msgid "You have specified this user for removal:" +msgstr "Vous avez indiqué que cet utilisateur devait être supprimé :" + +#. translators: %s: User's display name. +#: wp-admin/user-edit.php:696 +msgid "Log %s out of all locations." +msgstr "Déconnecter %s de tous les supports/appareils." + +#: wp-admin/user-edit.php:684 +msgid "Did you lose your phone or leave your account logged in at a public computer? You can log out everywhere else, and stay logged in here." +msgstr "Avez-vous perdu votre téléphone ou laissé votre compte ouvert sur un ordinateur public ? Vous pouvez rester connecté ici tout en vous déconnectant partout ailleurs." + +#: wp-admin/user-edit.php:631 +msgid "Generate Password" +msgstr "Générer un mot de passe" + +#: wp-admin/user-edit.php:625 +msgid "Account Management" +msgstr "Gestion de compte" + +#: wp-admin/user-edit.php:670 wp-admin/user-edit.php:680 +#: wp-admin/user-edit.php:690 +msgid "Sessions" +msgstr "Sessions" + +#: wp-admin/user-new.php:520 wp-admin/user-edit.php:640 +msgid "Cancel password change" +msgstr "Annuler la modification du mot de passe" + +#: wp-admin/user-edit.php:672 wp-admin/user-edit.php:682 +msgid "Log Out Everywhere Else" +msgstr "Me déconnecter partout ailleurs" + +#. translators: The non-breaking space prevents 1Password from thinking the +#. text "log in" should trigger a password save prompt. +#: wp-admin/install.php:154 +msgid "You will need this password to log in. Please store it in a secure location." +msgstr "Vous aurez besoin de ce mot de passe pour vous connecter. Pensez à le stocker dans un lieu sûr." + +#: wp-admin/includes/class-wp-list-table.php:711 +msgid "No approved comments" +msgstr "Aucun commentaire approuvé" + +#: wp-admin/includes/class-wp-list-table.php:689 +#: wp-admin/includes/class-wp-list-table.php:711 +#: wp-admin/includes/class-wp-list-table.php:734 +msgid "No comments" +msgstr "Aucun commentaire" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-list-table.php:681 +msgid "%s pending comment" +msgid_plural "%s pending comments" +msgstr[0] "%s commentaire en attente" +msgstr[1] "%s commentaires en attente" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-list-table.php:675 +msgid "%s approved comment" +msgid_plural "%s approved comments" +msgstr[0] "%s commentaire approuvé" +msgstr[1] "%s commentaires approuvés" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-list-table.php:669 +msgid "%s comment" +msgid_plural "%s comments" +msgstr[0] "(%s commentaire)" +msgstr[1] "(%s commentaires)" + +#: wp-admin/includes/ajax-actions.php:3850 +msgid "Image could not be processed." +msgstr "L’image n’a pas pu être traitée." + +#: wp-admin/install.php:168 wp-admin/user-new.php:535 +#: wp-admin/user-edit.php:656 +msgid "Confirm Password" +msgstr "Confirmation du mot de passe" + +#. translators: 1: wp-config.php, 2: Secret key service URL. +#: wp-admin/maint/repair.php:67 +msgid "While you are editing your %1$s file, take a moment to make sure you have all 8 keys and that they are unique. You can generate these using the WordPress.org secret key service." +msgstr "Tandis que vous modifiez le fichier %1$s, prenez quelques minutes pour vous assurer que vous avez les 8 clés, et qu’elles sont bien uniques. Vous pouvez les générer avec le service de clés secrètes de WordPress.org." + +#: wp-admin/includes/update.php:829 +#: wp-admin/includes/class-wp-comments-list-table.php:766 +#: wp-admin/includes/class-wp-list-table.php:528 +#: wp-admin/includes/class-wp-list-table.php:1380 +msgid "Show more details" +msgstr "Afficher plus de détails" + +#. translators: %s: Number of menus. +#: wp-admin/nav-menus.php:669 +msgid "Your theme supports %s menu. Select which menu appears in each location." +msgid_plural "Your theme supports %s menus. Select which menu appears in each location." +msgstr[0] "Votre thème peut utiliser %s menu. Sélectionnez le menu qui devra apparaître dans l’emplacement." +msgstr[1] "Votre thème peut utiliser %s menus. Sélectionnez les menu qui devront apparaître dans chaque emplacement." + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-users-list-table.php:564 +msgid "%s post by this author" +msgid_plural "%s posts by this author" +msgstr[0] "%s publication par cet auteur" +msgstr[1] "%s publications par cet auteur" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-theme-installer-skin.php:96 +#: wp-admin/includes/class-theme-upgrader-skin.php:87 +msgid "Live Preview “%s”" +msgstr "Prévisualisation de « %s »" + +#: wp-admin/includes/class-wp-list-table.php:906 +msgid "Last page" +msgstr "Dernière page" + +#: wp-admin/includes/class-wp-list-table.php:854 +msgid "First page" +msgstr "Première page" + +#. translators: %s: Post link. +#: wp-admin/edit-form-comment.php:160 +msgid "In response to: %s" +msgstr "En réponse à : %s" + +#: wp-admin/includes/meta-boxes.php:265 wp-admin/edit-form-comment.php:141 +msgid "Date and time" +msgstr "Date et heure" + +#: wp-admin/edit-form-comment.php:115 +msgid "Comment status" +msgstr "État du commentaire" + +#: wp-admin/edit-form-advanced.php:356 +msgid "You can also embed media from many popular websites including Twitter, YouTube, Flickr and others by pasting the media URL on its own line into the content of your post/page. Learn more about embeds." +msgstr "Vous pouvez également insérer des contenus en provenance de nombreux sites populaires, comme Twitter, YouTube, Flickr et d’autres, simplement en collant l’adresse web du contenu dans sa propre ligne dans le texte de votre publication. En apprendre plus sur les contenu embarqués." + +#: wp-admin/includes/class-custom-background.php:99 +msgid "Documentation on Custom Background" +msgstr "Documentation sur l’arrière-plan personnalisé (en)" + +#: wp-admin/edit-tags.php:309 +msgid "Documentation on Link Categories" +msgstr "Documentation sur les catégories de liens (en)" + +#: wp-admin/edit-link-form.php:76 +msgid "Documentation on Creating Links" +msgstr "Documentation sur la création de liens (en)" + +#: wp-admin/link-manager.php:78 +msgid "Documentation on Managing Links" +msgstr "Documentation sur la gestion des liens (en)" + +#: wp-admin/includes/class-custom-image-header.php:134 +msgid "Documentation on Custom Header" +msgstr "Documentation sur l’en-tête personnalisé" + +#: wp-admin/my-sites.php:51 +msgid "Documentation on My Sites" +msgstr "Documentation sur Mes Sites (en)" + +#: wp-admin/widgets.php:88 +msgid "The theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions." +msgstr "Le thème que vous utilisez n’est pas conçu pour les widgets, ce qui signifie qu’il ne dispose pas d’une colonne latérale que vous pouvez modifier. Pour obtenir des informations sur la manière de rendre votre thème compatible avec les widgets, lisez ces instructions." + +#. translators: %s: Codex URL. +#: wp-admin/options-writing.php:209 +msgid "When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see Update Services on the Codex. Separate multiple service URLs with line breaks." +msgstr "Quand vous publiez un nouvel article, WordPress notifie automatiquement un service de mise à jour. Une explication se trouve sur la page Update Services du Codex anglophone. Séparez les adresses de services par des retours à la ligne." + +#: wp-admin/includes/options.php:132 +msgid "The character encoding of your site (UTF-8 is recommended)" +msgstr "Le codage de caractères utilisé par votre site (nous recommandons UTF-8)" + +#: wp-admin/includes/file.php:2167 +msgid "example: www.wordpress.org" +msgstr "exemple : www.wordpress.org" + +#. translators: %d: Number of themes. +#: wp-admin/themes.php:175 wp-admin/theme-install.php:67 +msgid "Number of Themes found: %d" +msgstr "Nombre de thèmes trouvés : %d" + +#: wp-admin/theme-install.php:100 +msgid "You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter." +msgstr "Vous pouvez rechercher des thèmes par mot-clé, auteur ou étiquette, ou faire une recherche plus précise en utilisant les critères listés dans le filtre de fonctionnalités." + +#: wp-admin/theme-install.php:101 +msgid "Alternately, you can browse the themes that are Featured, Popular, or Latest. When you find a theme you like, you can preview it or install it." +msgstr "Autrement, vous pouvez parcourir les thèmes mis en avant, populaires, ou les derniers en date. Lorsque vous avez trouvé un thème qui vous plaît, vous pouvez le prévisualiser ou l’installer." + +#: wp-admin/themes.php:98 +msgid "The search for installed themes will search for terms in their name, description, author, or tag." +msgstr "La recherche parmi les thèmes installés se fait sur leur nom, leur description, leur auteur ou leurs étiquettes." + +#: wp-admin/options-general.php:333 +msgid "enter a custom date format in the following field" +msgstr "saisissez un format de date personnalisé dans le champ suivant" + +#: wp-admin/options-general.php:334 +msgid "Custom date format:" +msgstr "Format de date personnalisé :" + +#: wp-admin/options-general.php:370 +msgid "enter a custom time format in the following field" +msgstr "saisissez un format d’heure personnalisé dans le champ suivant" + +#: wp-admin/options-general.php:371 +msgid "Custom time format:" +msgstr "Format d’heure personnalisé :" + +#: wp-admin/includes/class-plugin-upgrader.php:56 +msgid "Plugins updated successfully." +msgstr "Les extensions ont bien été mises à jour." + +#. translators: %s: Number of millions. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:743 +#: wp-admin/includes/plugin-install.php:687 +msgctxt "Active plugin installations" +msgid "%s+ Million" +msgid_plural "%s+ Million" +msgstr[0] "%s million et +" +msgstr[1] "%s millions et +" + +#. translators: 1: Error message, 2: Line number. +#: wp-admin/link-parse-opml.php:89 +msgid "XML Error: %1$s at line %2$s" +msgstr "Erreur XML : %1$s à la ligne %2$s" + +#: wp-admin/includes/class-wp-media-list-table.php:520 +msgid "Detach" +msgstr "Détacher" + +#: wp-admin/menu-header.php:268 +msgid "Main menu" +msgstr "Menu principal" + +#: wp-admin/includes/file.php:2218 +msgid "Enter the location on the server where the public and private keys are located. If a passphrase is needed, enter that in the password field above." +msgstr "Saisissez l’emplacement sur le serveur où se trouvent les clés publiques et privées. S’il vous faut une passphrase, saisissez-la dans le champ de mot de passe ci-dessus." + +#. translators: %s: Number of users. +#: wp-admin/users.php:490 +msgid "%s user deleted." +msgid_plural "%s users deleted." +msgstr[0] "%s utilisateur supprimé." +msgstr[1] "%s utilisateurs supprimés." + +#: wp-admin/users.php:313 +msgid "What should be done with content owned by these users?" +msgstr "Que doit-il arriver aux contenus appartenant à ces utilisateurs ?" + +#: wp-admin/users.php:284 +msgid "You have specified these users for deletion:" +msgstr "Vous avez indiqué que vous voulez supprimer ces utilisateurs :" + +#: wp-admin/edit.php:335 +msgid "1 post not updated, somebody is editing it." +msgstr "Un article n’a pas été mis à jour, car quelqu’un est en train de le modifier." + +#: wp-admin/edit.php:348 +msgid "1 page not updated, somebody is editing it." +msgstr "Une page n’a pas été mise à jour, car quelqu’un est en train de la modifier." + +#: wp-admin/plugins.php:329 +msgid "These plugins may be active on other sites in the network." +msgstr "Ces extensions peuvent être actives sur d’autres sites du réseau." + +#: wp-admin/plugins.php:331 +msgid "You are about to remove the following plugins:" +msgstr "Vous êtes sur le point de supprimer les extensions suivantes :" + +#: wp-admin/plugins.php:327 +msgid "Delete Plugins" +msgstr "Supprimer les extensions" + +#: wp-admin/includes/class-wp-screen.php:1229 +msgid "Number of items per page:" +msgstr "Nombre d’éléments par page :" + +#: wp-admin/includes/file.php:31 +msgid "Posts Page" +msgstr "Page des articles" + +#: wp-admin/includes/template.php:2581 +msgid "You are currently editing the page that shows your latest posts." +msgstr "Vous êtes en train de modifier la page qui affiche vos derniers articles." + +#: wp-admin/includes/theme.php:712 wp-admin/themes.php:538 +msgid "Close details dialog" +msgstr "Fermer la fenêtre des détails" + +#. translators: Do not translate USERNAME, URL_DELETE, SITE_NAME: those are +#. placeholders. +#: wp-admin/ms-delete-site.php:56 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently clicked the 'Delete Site' link on your site and filled in a\n" +"form on that page.\n" +"\n" +"If you really want to delete your site, click the link below. You will not\n" +"be asked to confirm again so only click this link if you are absolutely certain:\n" +"###URL_DELETE###\n" +"\n" +"If you delete your site, please consider opening a new site here\n" +"some time in the future! (But remember your current site and username\n" +"are gone forever.)\n" +"\n" +"Thanks for using the site,\n" +"Webmaster\n" +"###SITE_NAME###" +msgstr "" +"Bonjour ###USERNAME###,\n" +"\n" +"Vous avez récemment cliqué sur le lien « Supprimer le site » pour votre propre site, \n" +"et avez complété le formulaire présent sur cette même page.\n" +"\n" +"Si vous confirmez la suppression de votre site, cliquez sur le lien ci-dessous.\n" +"Aucune confirmation ne vous sera demandée par la suite, soyez donc totalement \n" +"certain·e de ce que vous faites :\n" +"###URL_DELETE###\n" +"\n" +"Si vous effacez votre site, n’hésitez pas à revenir créer un autre site à l’avenir ! \n" +"(mais souvenez-vous que votre site actuel et votre identifiant\n" +"ne seront plus jamais disponibles)\n" +"\n" +"Merci d’avoir utilisé notre site,\n" +"\n" +"Le webmaster\n" +"###SITE_NAME###" + +#: wp-admin/nav-menus.php:576 +msgid "To add a custom link, expand the Custom Links section, enter a URL and link text, and click Add to Menu" +msgstr "Pour ajouter un lien personnalisé ouvrez la section « Liens personnalisés », saisissez une adresse web et un texte pour le lien, et cliquez sur « Ajouter au menu »" + +#. translators: Date and time format for exact current time, mainly about +#. timezones, see https://www.php.net/date +#: wp-admin/options-general.php:22 +msgctxt "timezone date format" +msgid "Y-m-d H:i:s" +msgstr "Y-m-d H:i:s" + +#: wp-admin/user-edit.php:53 +msgid "You can log out of other devices, such as your phone or a public computer, by clicking the Log Out Everywhere Else button." +msgstr "Vous pouvez vous déconnecter d’autres appareils, tels que votre téléphone ou un ordinateur public, en cliquant sur « Me déconnecter partout ailleurs »" + +#: wp-admin/update-core.php:543 +msgid "New translations are available." +msgstr "De nouvelles traductions sont disponibles." + +#: wp-admin/theme-install.php:347 +msgid "This theme has not been rated yet." +msgstr "Ce thème n’a pas encore reçu de note." + +#: wp-admin/includes/revision.php:243 wp-admin/includes/revision.php:286 +msgctxt "revision date short format" +msgid "j M @ H:i" +msgstr "j F \\à G \\h i \\m\\i\\n " + +#: wp-admin/includes/class-wp-automatic-updater.php:919 +msgid "" +"BETA TESTING?\n" +"=============\n" +"\n" +"This debugging email is sent when you are using a development version of WordPress.\n" +"\n" +"If you think these failures might be due to a bug in WordPress, could you report it?\n" +" * Open a thread in the support forums: https://wordpress.org/support/forum/alphabeta\n" +" * Or, if you're comfortable writing a bug report: https://core.trac.wordpress.org/\n" +"\n" +"Thanks! -- The WordPress Team" +msgstr "" +"BÊTA TESTEUR ?\n" +"==============\n" +"\n" +"Cet e-mail de débogage est envoyé lorsque vous utilisez une version de développement de WordPress.\n" +"\n" +"Si vous pensez que ces erreurs puissent être dues à un problème du côté de WordPress, pourriez-vous nous les signaler ?\n" +"* Ouvrez une discussion sur le forum de support en anglais : https://wordpress.org/support/forum/alphabeta\n" +"* Ou, si rédiger un rapport de bug ne vous fait pas peur : https://core.trac.wordpress.org/\n" +"\n" +"Merci ! -- L’équipe WordPress" + +#: wp-admin/includes/class-wp-automatic-updater.php:942 +msgid "" +"UPDATE LOG\n" +"==========" +msgstr "" +"JOURNAL DE LA MISE À JOUR\n" +"==========" + +#. translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: +#. those are placeholders. +#: wp-admin/includes/misc.php:1331 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently requested to have the administration email address on\n" +"your site changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour ###USERNAME###,\n" +"\n" +"Vous avez récemment demandé à modifier l’adresse de messagerie de l’administration de votre compte.\n" +"\n" +"Si c’est bien le cas, veuillez cliquer sur le lien suivant pour changer d’adresse de messagerie :\n" +"###ADMIN_URL###\n" +"\n" +"Vous pouvez ignorer ce message et le supprimer si vous ne souhaitez pas lancer cette action.\n" +"\n" +"Ce message a été envoyé à ###EMAIL###\n" +"\n" +"Cordialement,\n" +"\n" +"L’équipe de ###SITENAME###\n" +"###SITEURL###" + +#: wp-admin/includes/ms.php:297 +msgid "Site Upload Space Quota" +msgstr "Quota d’espace de fichiers" + +#: wp-admin/includes/ms.php:300 wp-admin/network/settings.php:375 +msgid "Size in megabytes" +msgstr "Taille en mégaoctets" + +#: wp-admin/includes/revision.php:242 wp-admin/includes/revision.php:285 +msgid "M j, Y @ H:i" +msgstr "j F Y \\à G \\h i \\m\\i\\n " + +#: wp-admin/includes/ajax-actions.php:4046 +#: wp-admin/includes/ajax-actions.php:4176 +#: wp-admin/includes/ajax-actions.php:4240 +#: wp-admin/includes/ajax-actions.php:4340 +#: wp-admin/includes/ajax-actions.php:4466 +#: wp-admin/includes/ajax-actions.php:4535 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "Impossible de se connecter au système de fichier. Veuillez confirmer vos informations d’identification." + +#: wp-admin/includes/class-wp-posts-list-table.php:1069 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:476 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:497 +#: wp-admin/includes/class-wp-ms-users-list-table.php:336 +msgid "Y/m/d g:i:s a" +msgstr "d/m/Y G \\h i \\m\\i\\n s \\s" + +#. translators: Column name or table row header. +#: wp-admin/includes/class-wp-comments-list-table.php:461 +#: wp-admin/comment.php:178 +msgid "In Response To" +msgstr "En réponse à" + +#: wp-admin/comment.php:204 +msgid "Submitted on" +msgstr "Envoyé le" + +#. translators: Localized Support reference. +#: wp-admin/includes/class-wp-site-health.php:1351 +msgid "https://wordpress.org/support" +msgstr "https://wordpress.org/support" + +#: wp-admin/edit-form-advanced.php:295 +msgid "You can enable distraction-free writing mode using the icon to the right. This feature is not available for old browsers or devices with small screens, and requires that the full-height editor be enabled in Screen Options." +msgstr "Vous pouvez activer le mode d’écriture sans distraction en cliquant sur l’icône à droite. Cette fonctionnalité n’est pas disponible pour les anciens navigateurs ou les appareils à petits écrans, et nécessite l’activation de l’éditeur plein-écran dans les options de l’écran." + +#: wp-admin/includes/plugin-install.php:400 +msgid "These suggestions are based on the plugins you and other users have installed." +msgstr "Ces suggestions sont basées sur les extensions que vous et d’autres utilisateurs ont installées." + +#: wp-admin/user-edit.php:674 +msgid "You are only logged in at this location." +msgstr "Vous n’êtes connecté·e qu’à cet endroit." + +#: wp-admin/user-edit.php:692 +msgid "Log Out Everywhere" +msgstr "Déconnexion globale" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:109 +msgctxt "Plugin Installer" +msgid "Recommended" +msgstr "Recommandées" + +#. translators: New site notification email. 1: New site URL, 2: User login, 3: +#. User password or password reset link, 4: Login URL. +#: wp-admin/includes/upgrade.php:608 +msgid "" +"Your new WordPress site has been successfully set up at:\n" +"\n" +"%1$s\n" +"\n" +"You can log in to the administrator account with the following information:\n" +"\n" +"Username: %2$s\n" +"Password: %3$s\n" +"Log in here: %4$s\n" +"\n" +"We hope you enjoy your new site. Thanks!\n" +"\n" +"--The WordPress Team\n" +"https://wordpress.org/\n" +msgstr "" +"Votre nouveau site WordPress a bien été installé à l’adresse :\n" +"\n" +"%1$s\n" +"\n" +"Vous pouvez vous y connecter en tant qu’administrateur avec les informations suivantes :\n" +"\n" +"Identifiant : %2$s\n" +"Mot de passe : %3$s\n" +"Connectez-vous ici : %4$s\n" +"\n" +"Nous espérons que vous aimerez votre nouveau site ! Merci à vous !\n" +"\n" +"--L’équipe WordPress\n" +"https://wordpress.org/\n" + +#: wp-admin/install.php:128 +msgid "Usernames can have only alphanumeric characters, spaces, underscores, hyphens, periods, and the @ symbol." +msgstr "Les identifiants ne peuvent utiliser que des caractères alphanumériques, des espaces, des tirets bas (\"_\"), des traits d’union (\"-\"), des points et le symbole @." + +#: wp-admin/options-discussion.php:275 +msgid "Mystery Person" +msgstr "Personne mystère" + +#: wp-admin/options-general.php:34 wp-admin/network/settings.php:55 +msgid "You can set the language, and the translation files will be automatically downloaded and installed (available if your filesystem is writable)." +msgstr "Vous pouvez configurer la langue, et les fichiers de traduction seront automatiquement téléchargés et installés (disponible uniquement si votre système de fichier est accessible en écriture)." + +#: wp-admin/themes.php:221 +msgid "You cannot delete a theme while it has an active child theme." +msgstr "Vous ne pouvez pas supprimer un thème qui est actuellement utilisé par l’un de ses thèmes-enfant." + +#: wp-admin/includes/class-wp-screen.php:1004 +msgid "Enable full-height editor and distraction-free functionality." +msgstr "Activer l’éditeur plein-écran et la fonctionnalité d’écriture sans distraction." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:758 +msgid "Untested with your version of WordPress" +msgstr "Non testé avec votre version de WordPress" + +#: wp-admin/includes/dashboard.php:1459 wp-admin/index.php:88 +msgid "https://planet.wordpress.org/" +msgstr "https://wpfr.net" + +#: wp-admin/includes/dashboard.php:1468 +msgid "https://planet.wordpress.org/feed/" +msgstr "https://feeds.feedburner.com/wpfr" + +#: wp-admin/edit-form-advanced.php:291 +msgid "Post editor — Enter the text for your post. There are two modes of editing: Visual and Text. Choose the mode by clicking on the appropriate tab." +msgstr "Éditeur d’article — Saisissez-y le contenu de votre article. Vous disposez pour ce faire de deux modes : Visuel ou Texte. Choisissez un mode en cliquant sur l’onglet correspondant." + +#: wp-admin/edit-form-advanced.php:294 +msgid "You can insert media files by clicking the button above the post editor and following the directions. You can align or edit images using the inline formatting toolbar available in Visual mode." +msgstr "Vous pouvez insérer des fichiers média en cliquant sur les icônes situées au-dessus de l’éditeur, puis en suivant les instructions. Vous pouvez aligner ou modifier les images à l’aide de la barre de mise en forme disponible dans le mode Visuel." + +#: wp-admin/includes/ajax-actions.php:3699 +msgid "This preview is unavailable in the editor." +msgstr "Cette prévisualisation n’est pas disponible dans l’éditeur." + +#: wp-admin/includes/ajax-actions.php:3812 +msgid "Could not log out user sessions. Please try again." +msgstr "Impossible de déconnecter les sessions utilisateur. Veuillez réessayer." + +#. translators: %s: User's display name. +#: wp-admin/includes/ajax-actions.php:3825 +msgid "%s has been logged out." +msgstr "%s a été déconnecté·e." + +#: wp-admin/includes/ajax-actions.php:3821 +msgid "You are now logged out everywhere else." +msgstr "Vous êtes désormais déconnecté·e partout ailleurs." + +#: wp-admin/includes/class-wp-comments-list-table.php:381 +msgid "Filter by comment type" +msgstr "Filtrer par type de commentaire" + +#: wp-admin/includes/class-wp-links-list-table.php:117 +#: wp-admin/includes/class-wp-posts-list-table.php:461 +msgid "Filter by category" +msgstr "Filtrer par catégorie" + +#. translators: %s: URL to background image configuration in Customizer. +#: wp-admin/includes/class-custom-background.php:234 +msgid "You can now manage and live-preview Custom Backgrounds in the Customizer." +msgstr "Vous pouvez gérer et prévisualiser les arrières-plans personnalisés dans l’outil de personnalisation." + +#. translators: %s: URL to header image configuration in Customizer. +#: wp-admin/includes/class-custom-image-header.php:483 +msgid "You can now manage and live-preview Custom Header in the Customizer." +msgstr "Vous pouvez gérer et prévisualiser l’en-tête personnalisée dans l’outil de personnalisation." + +#: wp-admin/includes/class-wp-links-list-table.php:131 +#: wp-admin/edit-link-form.php:114 +msgctxt "link name" +msgid "Name" +msgstr "Nom" + +#. translators: %s: Number of users. +#. translators: Number of users. +#: wp-admin/includes/class-wp-users-list-table.php:203 +#: wp-admin/includes/class-wp-ms-users-list-table.php:148 +msgctxt "users" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Tous (%s)" +msgstr[1] "Tous (%s)" + +#: wp-admin/includes/class-wp-screen.php:1130 +msgctxt "Welcome panel" +msgid "Welcome" +msgstr "Bienvenue" + +#. translators: %s: Placeholder that must come at the start of the URL. +#: wp-admin/options-permalink.php:321 +msgid "If you like, you may enter custom structures for your category and tag URLs here. For example, using topics as your category base would make your category links like %s/topics/uncategorized/. If you leave these blank the defaults will be used." +msgstr "Si vous le souhaitez, vous pouvez spécifier ici une structure personnalisée pour les adresses web de vos étiquettes et de vos catégories. Par exemple, en utilisant sujets comme préfixe pour vos catégories, vous obtiendrez des adresses web comme %s/sujets/non-classe/. Si vous laissez ce champ vide, la valeur par défaut sera appliquée." + +#: wp-admin/credits.php:146 +msgid "Release Lead" +msgstr "Responsable de cette version" + +#: wp-admin/upload.php:68 +msgid "Use the arrow buttons at the top of the dialog, or the left and right arrow keys on your keyboard, to navigate between media items quickly." +msgstr "Utilisez les boutons fléchées au-dessus de la fenêtre ou les flèches gauche et droite du clavier pour passer rapidement d’un média à l’autre." + +#: wp-admin/upload.php:69 +msgid "You can also delete individual items and access the extended edit screen from the details dialog." +msgstr "Vous pouvez aussi supprimer les éléments individuellement et accéder à l’écran de modifications étendues par la fenêtre des détails." + +#: wp-admin/upload.php:67 +msgid "Clicking an item will display an Attachment Details dialog, which allows you to preview media and make quick edits. Any changes you make to the attachment details will be automatically saved." +msgstr "Cliquer sur un élément affichera une fenêtre avec les détails du fichier, ce qui vous permettra de prévisualiser le média et réaliser de rapides modifications. Toutes les modifications que vous ferez dans les détails du média seront automatiquement enregistrées." + +#: wp-admin/upload.php:58 +msgid "To delete media items, click the Bulk Select button at the top of the screen. Select any items you wish to delete, then click the Delete Selected button. Clicking the Cancel Selection button takes you back to viewing your media." +msgstr "Pour supprimer des éléments de la liste des médias, cliquez sur le bouton de Sélection multiple en haut de l’écran. Sélectionnez tous les éléments à supprimer, puis cliquez sur le bouton Supprimer la sélection. En cliquant sur le bouton Annuler la sélection vous reviendrez sur la vue normale des médias." + +#: wp-admin/upload.php:57 wp-admin/upload.php:230 +msgid "You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media." +msgstr "Vous pouvez voir vos médias dans une grille ou dans une liste avec des colonnes. Passez de l’un à l’autre en utilisant les icônes en haut à gauche des médias." + +#: wp-admin/upload.php:56 +msgid "All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first." +msgstr "Tous les fichiers que vous avez téléversés sont listés dans la bibliothèque de médias, avec le dernier téléversé qui apparaît en premier." + +#: wp-admin/plugin-install.php:101 +msgid "If you just want to get an idea of what’s available, you can browse Featured and Popular plugins by using the links above the plugins list. These sections rotate regularly." +msgstr "Si vous voulez juste vous faire une idée de ce qui est disponible, vous pouvez parcourir les rubriques Mises en avant et Populaires en utilisant les liens en haut à gauche de l’écran. Ces sections sont régulièrement renouvelées." + +#: wp-admin/plugin-install.php:139 +msgid "Browse Plugins" +msgstr "Parcourir les extensions" + +#: wp-admin/plugin-install.php:50 +msgid "Add Plugins" +msgstr "Ajouter des extensions" + +#. translators: 1: WPLANG, 2: wp-config.php +#: wp-admin/options-general.php:191 +msgid "The %1$s constant in your %2$s file is no longer needed." +msgstr "La constante %1$s de votre fichier %2$s n’est plus nécessaire." + +#: wp-admin/includes/translation-install.php:24 +msgid "Invalid translation type." +msgstr "Type de traduction non valide." + +#: wp-admin/install.php:335 +msgid "Welcome to the famous five-minute WordPress installation process! Just fill in the information below and you’ll be on your way to using the most extendable and powerful personal publishing platform in the world." +msgstr "Bienvenue dans la très célèbre installation en 5 minutes de WordPress ! Vous n’avez qu’à remplir les informations demandées ci-dessous et vous serez prêt à utiliser la plus extensible et puissante plateforme de publication de contenu au monde." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:762 +msgid "Compatible with your version of WordPress" +msgstr "Compatible avec votre version de WordPress" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:760 +msgid "Incompatible with your version of WordPress" +msgstr "Incompatible avec votre version de WordPress" + +#. translators: %s: Number of stars. +#: wp-admin/includes/plugin-install.php:757 +msgid "%d star" +msgid_plural "%d stars" +msgstr[0] "%d étoile" +msgstr[1] "%d étoiles" + +#: wp-admin/includes/class-wp-list-table.php:464 +msgid "Select bulk action" +msgstr "Sélectionnez l’action groupée" + +#: wp-admin/user-new.php:427 wp-admin/user-new.php:568 +msgid "Add the user without sending an email that requires their confirmation." +msgstr "Ajouter l’utilisateur sans envoyer de message lui demandant de confirmation." + +#. translators: %s: List view URL. +#: wp-admin/upload.php:102 +msgid "The grid view for the Media Library requires JavaScript. Switch to the list view." +msgstr "La vue en grille de la bibliothèque de médias nécessite JavaScript. Passer à la vue en liste." + +#: wp-admin/update-core.php:264 +msgid "This site is set up to install updates of future beta versions automatically." +msgstr "Ce site est configuré pour installer automatiquement les mises à jour des prochaines versions bêtas." + +#: wp-admin/update-core.php:264 +msgid "BETA TESTERS:" +msgstr "TESTEURS DE PHASE BÊTA :" + +#: wp-admin/includes/plugin-install.php:771 +msgid "Contributors" +msgstr "Contributeurs" + +#: wp-admin/includes/plugin-install.php:702 +#: wp-admin/includes/plugin-install.php:789 +msgid "Donate to this plugin »" +msgstr "Faites à un don à cette extension »" + +#: wp-admin/includes/plugin-install.php:572 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "Avis" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:67 +msgctxt "themes" +msgid "Recently Updated" +msgstr "Mis à jour récemment" + +#: wp-admin/includes/class-wp-terms-list-table.php:190 +msgctxt "Number/count of items" +msgid "Count" +msgstr "Total" + +#: wp-admin/includes/class-wp-plugins-list-table.php:920 +msgid "View details" +msgstr "Afficher les détails" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:620 +msgid "More Details" +msgstr "Plus de détails" + +#. translators: %s: Theme name. +#. translators: %s: Plugin name. +#. translators: %s: Plugin name and version. +#: wp-admin/includes/theme.php:244 wp-admin/includes/update.php:506 +#: wp-admin/includes/update.php:691 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:553 +msgid "Update %s now" +msgstr "Mettre à jour %s maintenant" + +#. translators: %s: Plugin name and version. +#. translators: %s: Importer name. +#: wp-admin/includes/class-wp-plugin-install-list-table.php:531 +#: wp-admin/import.php:159 +msgid "Install %s now" +msgstr "Installer %s maintenant" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:464 +msgctxt "Plugin installer group title" +msgid "Tools" +msgstr "Outils" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:463 +msgctxt "Plugin installer group title" +msgid "Social" +msgstr "Social" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:462 +msgctxt "Plugin installer group title" +msgid "Performance" +msgstr "Performance" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:105 +msgctxt "Plugin Installer" +msgid "Beta Testing" +msgstr "Test de phase beta" + +#. translators: %s: URL that could not be embedded. +#: wp-admin/includes/ajax-actions.php:3665 +msgid "%s failed to embed." +msgstr "%s n’a pas pu être intégré." + +#. translators: %s: Support email address. +#: wp-admin/includes/class-wp-automatic-updater.php:755 +msgid "The WordPress team is willing to help you. Forward this email to %s and the team will work with you to make sure your site is working." +msgstr "L’équipe de WordPress est prête à vous aider. Transférez ce message à %s et l’équipe vous aidera à faire en sorte que vous site fonctionne." + +#: wp-admin/includes/class-wp-automatic-updater.php:770 +msgid "If you reach out to us, we'll also ensure you'll never have this problem again." +msgstr "Si vous nous contactez, nous ferons également en sorte que vous ne rencontriez plus jamais ce problème." + +#: wp-admin/theme-install.php:231 +msgid "Filtering by:" +msgstr "Trier par :" + +#: wp-admin/includes/media.php:3229 +msgid "Displayed on attachment pages." +msgstr "Affiché sur les pages des fichiers joints." + +#: wp-admin/includes/image-edit.php:163 +msgid "You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image." +msgstr "Vous pouvez modifier l’image tout en préservant sa miniature. Par exemple, vous pourriez vouloir avoir une miniature carrée qui n’afficherait qu’une partie de l’image." + +#: wp-admin/includes/image-edit.php:125 +msgid "Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings." +msgstr "Une fois que votre sélection est faite, vous pouvez l’ajuster en saisissant une taille en pixels. La taille minimale de la sélection est celle des miniatures, tel que défini dans les réglages des Média." + +#: wp-admin/includes/image-edit.php:122 +msgid "The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc." +msgstr "Les proportions d’une image sont le rapport entre sa largeur et sa hauteur. Vous pouvez préserver les proportions en maintenant appuyée la touche Shift tandis que vous redimensionnez votre sélection. Utilisez le champ de saisie pour préciser la proportion à respecter, par exemple 1:1 (carré), 4:3, 16:9, etc." + +#: wp-admin/edit-form-advanced.php:296 +msgid "Keyboard users: When you’re working in the visual editor, you can use Alt + F10 to access the toolbar." +msgstr "Utilisateurs du clavier : lorsque vous travaillez dans l’éditeur visuel, vous pouvez utiliser Alt + F10 pour accéder à la barre d’outils." + +#: wp-admin/edit-comments.php:183 +msgid "A red bar on the left means the comment is waiting for you to moderate it." +msgstr "Une barre rouge sur la gauche signifie que le commentaire attention votre validation." + +#: wp-admin/includes/image-edit.php:57 +msgid "You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up." +msgstr "Vous pouvez redimensionner l’image originale de manière proportionnelle. Pour obtenir de meilleurs résultats, le redimensionnement doit être fait avant tout recadrage, retournement ou rotation. La taille des images ne peut être que réduite, pas augmentée." + +#: wp-admin/includes/image-edit.php:119 +msgid "To crop the image, click on it and drag to make your selection." +msgstr "Pour couper l’image, cliquez dessus et déplacez la souris pour créer la sélection." + +#: wp-admin/includes/class-wp-comments-list-table.php:383 +msgid "All comment types" +msgstr "Tous les types de commentaire" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:66 +#: wp-admin/theme-install.php:177 +msgctxt "themes" +msgid "Latest" +msgstr "Derniers en date" + +#: wp-admin/theme-install.php:176 +msgctxt "themes" +msgid "Popular" +msgstr "Populaires" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:64 +#: wp-admin/theme-install.php:175 +msgctxt "themes" +msgid "Featured" +msgstr "Mis en avant" + +#: wp-admin/includes/ms.php:951 wp-admin/users.php:320 +msgid "Attribute all content to:" +msgstr "Attribuer tout le contenu à :" + +#: wp-admin/includes/ms.php:949 wp-admin/users.php:317 +msgid "Delete all content." +msgstr "Supprimer tout le contenu." + +#: wp-admin/users.php:311 +msgid "What should be done with content owned by this user?" +msgstr "Que faire du contenu ayant cet utilisateur pour propriétaire ?" + +#: wp-admin/users.php:58 +msgid "Delete brings you to the Delete Users screen for confirmation, where you can permanently remove a user from your site and delete their content. You can also delete multiple users at once by using Bulk Actions." +msgstr "Supprimer vous amène à l’écran de suppression des utilisateurs pour confirmer votre action, d’où vous pouvez supprimer un utilisateur de manière permanente et supprimer son contenu. Vous pouvez également supprimer plusieurs utilisateurs à la fois avec les Actions groupées." + +#: wp-admin/theme-install.php:270 +msgctxt "theme" +msgid "Details & Preview" +msgstr "Détails et prévisualisation" + +#: wp-admin/theme-install.php:57 +msgid "Search themes..." +msgstr "Rechercher des thèmes…" + +#: wp-admin/theme-install.php:56 +msgid "Search Themes" +msgstr "Rechercher des thèmes" + +#: wp-admin/theme-install.php:24 +msgid "Add Themes" +msgstr "Ajouter des thèmes" + +#: wp-admin/revision.php:99 +msgid "← Return to editor" +msgstr "← Retourner à l’éditeur" + +#: wp-admin/maint/repair.php:147 +msgid "https://wordpress.org/support/forum/how-to-and-troubleshooting" +msgstr "https://wpfr.net/support/forum/support-de-wordpress/" + +#: wp-admin/index.php:76 +msgid "At A Glance — Displays a summary of the content on your site and identifies which theme and version of WordPress you are using." +msgstr "D’un coup d’œil - Affiche un résumé du contenu de votre site, et indique le thème et la version de WordPress que vous utilisez." + +#: wp-admin/index.php:63 +msgid "Box Controls — Click the title bar of the box to expand or collapse it. Some boxes added by plugins may have configurable content, and will show a “Configure” link in the title bar if you hover over it." +msgstr "Contrôles des sections – Cliquez sur la barre de titre d’une section pour l’ouvrir ou la fermer. Certaines sections ajoutées par des extensions peuvent avoir un contenu configurable, et afficheront donc un lien « Configurer » dans la barre de titre lors du survol de la souris." + +#: wp-admin/themes.php:43 +msgid "Sorry, you are not allowed to resume this theme." +msgstr "Désolé, vous n’avez pas l’autorisation d’ajouter ce thème." + +#: wp-admin/users.php:56 +msgid "Remove allows you to remove a user from your site. It does not delete their content. You can also remove multiple users at once by using Bulk Actions." +msgstr "Supprimervous permet de retirer un utilisateur de votre site. Cela ne supprime pas son contenu. Vous pouvez également supprimer plusieurs utilisateurs à la fois avec les Actions groupées." + +#: wp-admin/includes/meta-boxes.php:262 wp-admin/edit-form-comment.php:139 +msgid "Edit date and time" +msgstr "Modifier la date et l’heure" + +#: wp-admin/includes/meta-boxes.php:249 +msgid "Browse revisions" +msgstr "Parcourir les révisions" + +#: wp-admin/includes/meta-boxes.php:179 +msgid "Edit visibility" +msgstr "Modifier la visibilité" + +#: wp-admin/includes/meta-boxes.php:129 +msgid "Edit status" +msgstr "Modifier l’état" + +#: wp-admin/includes/dashboard.php:1917 +msgid "Manage menus" +msgstr "Gérer les menus" + +#: wp-admin/includes/dashboard.php:1914 +msgid "Manage widgets" +msgstr "Gérer les widgets" + +#: wp-admin/credits.php:57 wp-admin/credits.php:72 +msgid "https://make.wordpress.org/" +msgstr "https://make.wordpress.org/" + +#: wp-admin/includes/ms.php:1153 wp-admin/network/user-new.php:30 +#: wp-admin/network/index.php:56 wp-admin/network/users.php:229 +#: wp-admin/network/site-new.php:33 wp-admin/network/sites.php:46 +msgid "Support Forums" +msgstr "Forums d’entraide" + +#. translators: %s: https://wordpress.org +#: wp-admin/admin-footer.php:37 +msgid "Thank you for creating with WordPress." +msgstr "Merci de faire de WordPress votre outil de création." + +#: wp-admin/themes.php:173 +msgid "Search installed themes..." +msgstr "Rechercher des thèmes installés…" + +#: wp-admin/update-core.php:717 +msgid "Translations — The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can click the “Update Translations” button." +msgstr "Traductions – Les fichiers qui traduisent WordPress dans votre langue sont mis à jour dès qu’une modification est faite. Mais si ces fichiers ne sont plus à jour, vous pouvez cliquer sur le bouton « Mettre à jour les traductions »." + +#: wp-admin/update-core.php:713 +msgid "In most cases, WordPress will automatically apply maintenance and security updates in the background for you." +msgstr "Dans la plupart des cas, WordPress appliquera automatiquement les mises à jour de maintenance et de sécurité en arrière-plan." + +#: wp-admin/update-core.php:713 +msgid "WordPress — Updating your WordPress installation is a simple one-click procedure: just click on the “Update Now” button when you are notified that a new version is available." +msgstr "WordPress – La mise à jour de votre installation WordPress tient en une simple procédure : cliquez sur le bouton « Mettre à jour » quand vous êtes notifié·e qu’une nouvelle version est disponible." + +#: wp-admin/update-core.php:703 +msgid "If an update is available, you᾿ll see a notification appear in the Toolbar and navigation menu." +msgstr "Si une mise à jour est disponible, vous verrez une notification apparaître dans la barre d’outils." + +#: wp-admin/update-core.php:714 +msgid "Themes and Plugins — To update individual themes or plugins from this screen, use the checkboxes to make your selection, then click on the appropriate “Update” button. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button." +msgstr "Thèmes et extensions – Pour mettre à jour les thèmes et extensions individuellement depuis cet écran, utilisez les cases à jour pour faire votre sélection, puis cliquez sur le bouton « Mettre à jour » approprié. Pour mettre à jour tous les thèmes et toutes les extensions d’un coup, vous pouvez cocher la case en haut de la section pour tout sélectionner avant de cliquer sur le boutons de mise à jour." + +#: wp-admin/update-core.php:702 +msgid "On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories." +msgstr "Sur cet écran, vous pouvez faire la mise à jour vers la dernière version de WordPress, et mettre à jour les thèmes et extensions depuis les dépôts de WordPress.org." + +#. translators: %s: https://wordpress.org/themes +#: wp-admin/themes.php:116 +msgid "If you would like to see more themes to choose from, click on the “Add New” button and you will be able to browse or search for additional themes from the WordPress Theme Directory. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!" +msgstr "Si vous souhaitez voir plus de thèmes, cliquez sur le bouton « Ajouter » et vous pourrez parcourir le répertoire de thèmes de WordPress.org et y rechercher des thèmes supplémentaires. Les thèmes du répertoire de WordPress.org sont conçus et développés par des tiers, et sont compatibles avec la licence de WordPress. Et ils sont gratuits !" + +#. translators: 1: Number of megabytes, 2: Percentage. +#: wp-admin/includes/dashboard.php:1562 +msgid "%1$s MB (%2$s%%) Space Used" +msgstr "%1$s Mo (%2$s%%) d’espace utilisés" + +#. translators: %s: Number of megabytes. +#: wp-admin/includes/dashboard.php:1548 +msgid "%s MB Space Allowed" +msgstr "%s Mo d’espace autorisés" + +#. translators: Date and time format for recent posts on the dashboard, see +#. https://www.php.net/date +#: wp-admin/includes/dashboard.php:964 +msgid "M jS" +msgstr "j M" + +#. translators: %s: Number of pages. +#: wp-admin/includes/dashboard.php:290 +msgid "%s Page" +msgid_plural "%s Pages" +msgstr[0] "%s page" +msgstr[1] "%s pages" + +#. translators: %s: Number of posts. +#: wp-admin/includes/dashboard.php:287 +msgid "%s Post" +msgid_plural "%s Posts" +msgstr[0] "%s article" +msgstr[1] "%s articles" + +#: wp-admin/includes/dashboard.php:61 +msgid "At a Glance" +msgstr "D’un coup d’œil" + +#: wp-admin/options-reading.php:45 +msgid "When this setting is in effect, a reminder is shown in the At a Glance box of the Dashboard that says, “Search Engines Discouraged,” to remind you that your site is not being crawled." +msgstr "Lorsque ce réglage est actif, un rappel est affiché dans la section « D’un coup d’œil » du Tableau de bord, indiquant « Moteurs de recherche refusés » pour que vous n’oubliez pas que votre site n’est pas parcouru." + +#: wp-admin/themes.php:345 wp-admin/themes.php:509 +msgctxt "theme" +msgid "Active:" +msgstr "Activé :" + +#: wp-admin/includes/theme.php:280 +msgid "Accessibility Ready" +msgstr "Optimisé pour l’accessibilité" + +#. translators: %s: Theme name. +#: wp-admin/includes/theme.php:769 wp-admin/themes.php:578 +msgid "This is a child theme of %s." +msgstr "Ce thème est un thème enfant de %s." + +#: wp-admin/themes.php:135 +msgid "When previewing on smaller monitors, you can use the collapse icon at the bottom of the left-hand pane. This will hide the pane, giving you more room to preview your site in the new theme. To bring the pane back, click on the collapse icon again." +msgstr "Lors de la prévisualisation sur de petits écrans, vous pouvez utiliser l’icône de réduction en bas à gauche du panneau. Cela masquera le panneau, vous donnant ainsi plus de place pour prévisualiser le site avec le nouveau thème. Pour ramener le panneau, recliquez sur l’icône de réduction." + +#: wp-admin/themes.php:134 +msgid "The theme being previewed is fully interactive — navigate to different pages to see how the theme handles posts, archives, and other page templates. The settings may differ depending on what theme features the theme being previewed supports. To accept the new settings and activate the theme all in one step, click the Publish & Activate button above the menu." +msgstr "Le thème en cours de prévisualisation est totalement interactif — naviguez sur les différentes pages pour voir comment le thème affiche vos articles, archives et autres pages. Les réglages peuvent différer selon les fonctionnalités pour lesquelles le thème a été conçu. Pour valider les nouveaux réglages et activer le thème en un seul coup, cliquez sur le bouton « Enregistrer et activer » en haut du menu." + +#: wp-admin/themes.php:133 +msgid "Tap or hover on any theme then click the Live Preview button to see a live preview of that theme and change theme options in a separate, full-screen view. You can also find a Live Preview button at the bottom of the theme details screen. Any installed theme can be previewed and customized in this way." +msgstr "Touchez ou survolez n’importe quel thème puis cliquez sur le bouton « Prévisualiser en direct » pour avoir un aperçu de celui-ci et ses changer les options dans une vue séparée et plein écran. Vous pouvez également trouver un bouton « Prévisualiser en direct » en bas de l’écran de détails du thème. Tout thème installé peut être prévisualisé et personnalisé de cette manière." + +#: wp-admin/themes.php:97 +msgid "The current theme is displayed highlighted as the first theme." +msgstr "Le thème actuel est affiché en étant mis en avant en tant que premier thème." + +#: wp-admin/themes.php:96 +msgid "Click Customize for the current theme or Live Preview for any other theme to see a live preview" +msgstr "Cliquez sur Personnaliser pour le thème actuel ou Prévisualiser en direct pour n’importe quel autre thème pour afficher la prévisualisation" + +#: wp-admin/themes.php:95 +msgid "Click on the theme to see the theme name, version, author, description, tags, and the Delete link" +msgstr "Cliquez sur le thème pour voir le nom du thème, sa version, son auteur, sa description, ses étiquettes et le bouton Supprimer." + +#: wp-admin/themes.php:94 +msgid "Hover or tap to see Activate and Live Preview buttons" +msgstr "Survolez ou touchez pour voir les boutons Activer et Prévisualiser en direct" + +#: wp-admin/themes.php:92 +msgid "This screen is used for managing your installed themes. Aside from the default theme(s) included with your WordPress installation, themes are designed and developed by third parties." +msgstr "Cet écran est utilisé pour gérer vos thèmes installés. En dehors des thèmes par défaut inclus dans votre installation de WordPress, les thèmes sont conçus et développés par des tiers." + +#: wp-admin/widgets.php:445 +msgid "To activate a widget drag it to a sidebar or click on it. To deactivate a widget and delete its settings, drag it back." +msgstr "Pour activer un widget, glissez-le dans la colonne latérale ou cliquez dessus. Pour désactiver un widget et supprimer ses réglages, enlevez-le de la colonne latérale." + +#. translators: %s: The rating. +#: wp-admin/includes/template.php:2557 +msgid "%s rating" +msgstr "Note : %s" + +#. translators: 1: The rating, 2: The number of ratings. +#: wp-admin/includes/template.php:2553 +msgid "%1$s rating based on %2$s rating" +msgid_plural "%1$s rating based on %2$s ratings" +msgstr[0] "Une note de %1$s basée sur %2$s vote" +msgstr[1] "Une note de %1$s basée sur %2$s votes" + +#: wp-admin/my-sites.php:45 +msgid "This screen shows an individual user all of their sites in this network, and also allows that user to set a primary site. They can use the links under each site to visit either the front end or the dashboard for that site." +msgstr "Cet écran affiche à un utilisateur individuel tous ses sites sur ce réseau, et permet également à cet utilisateur de régler son site principal. Il peut utiliser les liens sous chaque site pour se rendre soit sur son interface publique, soit sur son administration." + +#. translators: 1: Error code, 2: Error message. +#: wp-admin/includes/class-wp-automatic-updater.php:975 +msgid "Error: [%1$s] %2$s" +msgstr "Erreur : [%1$s] %2$s" + +#. translators: 1: Error code, 2: Error message. +#: wp-admin/includes/class-wp-automatic-updater.php:972 +msgid "Rollback Error: [%1$s] %2$s" +msgstr "Erreur de restauration : [%1$s] %2$s" + +#: wp-admin/includes/class-wp-automatic-updater.php:901 +msgid "The following translations failed to update:" +msgstr "Les traductions suivantes n’ont pas pu être mises à jour :" + +#: wp-admin/includes/class-wp-automatic-updater.php:900 +msgid "The following themes failed to update:" +msgstr "Les thèmes suivants n’ont pas pu être mis à jour :" + +#: wp-admin/includes/class-wp-automatic-updater.php:899 +msgid "The following plugins failed to update:" +msgstr "Les extensions suivantes n’ont pas pu être mises à jour :" + +#: wp-admin/includes/class-wp-automatic-updater.php:887 +msgid "The following translations were successfully updated:" +msgstr "Les traductions suivantes ont bien été mises à jour :" + +#: wp-admin/includes/class-wp-automatic-updater.php:886 +msgid "The following themes were successfully updated:" +msgstr "Les thèmes suivants ont bien été mis à jour :" + +#: wp-admin/includes/class-wp-automatic-updater.php:885 +msgid "The following plugins were successfully updated:" +msgstr "Les extensions suivantes ont bien été mises à jour :" + +#: wp-admin/widgets.php:566 +msgid "Add Widget" +msgstr "Ajouter le widget" + +#: wp-admin/includes/theme.php:711 wp-admin/themes.php:537 +msgid "Show next theme" +msgstr "Afficher le thème suivant" + +#: wp-admin/includes/theme.php:710 wp-admin/themes.php:536 +msgid "Show previous theme" +msgstr "Afficher le thème précédent" + +#: wp-admin/includes/theme.php:759 wp-admin/themes.php:568 +msgid "Update Available" +msgstr "Mise à jour disponible" + +#: wp-admin/themes.php:171 wp-admin/theme-install.php:55 +msgid "Add New Theme" +msgstr "Ajouter un thème" + +#: wp-admin/themes.php:167 +msgid "" +"Are you sure you want to delete this theme?\n" +"\n" +"Click 'Cancel' to go back, 'OK' to confirm the delete." +msgstr "" +"Confirmez-vous la suppression de ce thème ?\n" +"\n" +"« Annuler » pour arrêter, « OK » pour supprimer." + +#: wp-admin/index.php:82 +msgid "Quick Draft — Allows you to create a new post and save it as a draft. Also displays links to the 3 most recent draft posts you've started." +msgstr "Brouillon rapide — Vous permet de créer une nouvelle publication et de l’enregistrer en tant que brouillon. Affiche également des liens vers les 3 derniers brouillons que vous avez créés." + +#: wp-admin/index.php:79 +msgid "Activity — Shows the upcoming scheduled posts, recently published posts, and the most recent comments on your posts and allows you to moderate them." +msgstr "Activité – Affiche les publications planifiées, celles qui ont été publiées récemment, et les commentaires récents, que vous pouvez valider ou non." + +#: wp-admin/index.php:61 +msgid "Screen Options — Use the Screen Options tab to choose which Dashboard boxes to show." +msgstr "Options de l’écran — Utilisez l’onglet Options de l’écran pour choisir les sections à afficher dans le Tableau de bord." + +#: wp-admin/post.php:82 +msgid "Unable to submit this form, please refresh and try again." +msgstr "Impossible d’envoyer ce formulaire. Veuillez recharger la page et réessayer." + +#: wp-admin/includes/dashboard.php:1555 wp-admin/includes/dashboard.php:1570 +msgid "Manage Uploads" +msgstr "Gérer les téléversements" + +#: wp-admin/includes/deprecated.php:1381 +msgid "Popular Plugin" +msgstr "Extensions populaires" + +#: wp-admin/includes/dashboard.php:958 +msgid "Tomorrow" +msgstr "Demain" + +#: wp-admin/includes/dashboard.php:894 +msgid "No activity yet!" +msgstr "Aucune activité pour le moment !" + +#: wp-admin/includes/dashboard.php:884 +msgid "Recently Published" +msgstr "Publié récemment" + +#: wp-admin/includes/dashboard.php:875 +msgid "Publishing Soon" +msgstr "Bientôt publié" + +#: wp-admin/includes/dashboard.php:548 +msgid "What’s on your mind?" +msgstr "Qu’avez-vous en tête ?" + +#. translators: 1: Version number, 2: Theme name. +#: wp-admin/includes/update.php:351 +msgid "WordPress %1$s running %2$s theme." +msgstr "WordPress %1$s avec le thème %2$s." + +#: wp-admin/includes/dashboard.php:75 +msgid "Quick Draft" +msgstr "Brouillon rapide" + +#. translators: %s: Name of plugin / theme / translation. +#: wp-admin/includes/class-wp-automatic-updater.php:908 +msgid "FAILED: %s" +msgstr "ÉCHEC : %s" + +#. translators: %s: Name of plugin / theme / translation. +#: wp-admin/includes/class-wp-automatic-updater.php:893 +msgid "SUCCESS: %s" +msgstr "SUCCÈS : %s" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:871 +msgid "FAILED: WordPress failed to update to %s" +msgstr "ÉCHEC : WordPress n’a pas pu être mis à jour en %s" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:868 +msgid "SUCCESS: WordPress was successfully updated to %s" +msgstr "SUCCÈS : WordPress a bien été mis à jour vers %s" + +#. translators: %s: Network home URL. +#: wp-admin/includes/class-wp-automatic-updater.php:861 +msgid "WordPress site: %s" +msgstr "Site WordPress : %s" + +#: wp-admin/includes/dashboard.php:70 +msgid "Activity" +msgstr "Activité" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:784 +msgid "Your site was running version %s." +msgstr "Votre site utilise la version %s." + +#. translators: 1: Home URL, 2: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:730 +msgid "Your site at %1$s experienced a critical failure while trying to update WordPress to version %2$s." +msgstr "Votre site à l’adresse %1$s a fait face à un échec critique en essayant de faire une mise à jour de WordPress vers la version %2$s." + +#. translators: %s: WordPress latest version. +#: wp-admin/includes/class-wp-automatic-updater.php:698 +msgid "WordPress %s is also now available." +msgstr "WordPress %s est disponible." + +#: wp-admin/includes/update-core.php:935 wp-admin/includes/update-core.php:1077 +#: wp-admin/includes/update-core.php:1102 +#: wp-admin/includes/class-core-upgrader.php:160 +#: wp-admin/includes/class-wp-upgrader.php:165 +msgid "The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions." +msgstr "La mise à jour ne peut pas être installée parce que nous n’allons pas pouvoir copier certains fichiers. Ce problème est généralement dû à des incohérences dans les permissions de fichiers." + +#: wp-admin/includes/class-language-pack-upgrader.php:114 +#: wp-admin/update-core.php:534 +msgid "Your translations are all up to date." +msgstr "Vos traductions sont toutes à jour." + +#: wp-admin/update-core.php:533 wp-admin/update-core.php:541 +msgid "Translations" +msgstr "Traductions" + +#: wp-admin/update-core.php:243 +msgid "Future security updates will be applied automatically." +msgstr "Les prochaines mises à jour de sécurité seront appliquées automatiquement." + +#. translators: %s: Error code. +#: wp-admin/includes/class-wp-automatic-updater.php:802 +msgid "Error code: %s" +msgstr "Code d’erreur : %s" + +#: wp-admin/includes/class-wp-automatic-updater.php:786 +msgid "Your hosting company, support forum volunteers, or a friendly developer may be able to use this information to help you:" +msgstr "Votre hébergeur, les volontaires du forum d’entraide ou un ami développeur devraient pouvoir vous aider à comprendre cette information pour vous aider :" + +#: wp-admin/includes/class-wp-automatic-updater.php:785 +msgid "We have some data that describes the error your site encountered." +msgstr "Nous avons quelques données qui décrivent l’erreur que votre site a rencontré." + +#: wp-admin/includes/class-wp-automatic-updater.php:779 +msgid "The WordPress Team" +msgstr "L’équipe WordPress" + +#: wp-admin/includes/class-wp-automatic-updater.php:775 +msgid "You also have some plugins or themes with updates available. Update them now:" +msgstr "Certains de vos thèmes et extensions ont également des mises à jour disponibles. Veuillez les mettre à jour dès maintenant :" + +#: wp-admin/includes/class-wp-automatic-updater.php:760 +msgid "If you experience any issues or need support, the volunteers in the WordPress.org support forums may be able to help." +msgstr "Si vous rencontrez des problèmes ou avez besoin d’assistance, les volontaires du forum d’entraide de wpfr.net devraient pouvoir vous aider." + +#: wp-admin/includes/class-wp-automatic-updater.php:766 +#: wp-admin/update-core.php:703 +msgid "Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers." +msgstr "Pour des questions de sécurité, il est important de garder votre site à jour. Par ailleurs, cela rend le Web plus sûr pour vous et vos lecteurs." + +#: wp-admin/includes/class-wp-automatic-updater.php:745 +msgid "Please check out your site now. It's possible that everything is working. If it says you need to update, you should do so:" +msgstr "Veuillez vérifier votre site immédiatement. Il se peut que tout fonctionne. S’il affiche que vous devez faire une mise à jour, vous devriez suivre son conseil :" + +#: wp-admin/includes/class-wp-automatic-updater.php:743 +msgid "This means your site may be offline or broken. Don't panic; this can be fixed." +msgstr "Cela signifie que votre site est peut-être hors ligne ou cassé. Ne paniquez pas, cela peut être réparé." + +#. translators: 1: Home URL, 2: WordPress latest version. +#: wp-admin/includes/class-wp-automatic-updater.php:737 +msgid "Your site at %1$s experienced a critical failure while trying to update to the latest version of WordPress, %2$s." +msgstr "Votre site à l’adresse %1$s a fait face à un échec critique en essayant de faire une mise à jour vers la dernière version de WordPress, la %2$s." + +#: wp-admin/includes/class-wp-automatic-updater.php:699 +#: wp-admin/includes/class-wp-automatic-updater.php:722 +msgid "Updating is easy and only takes a few moments:" +msgstr "La mise à jour est facile et ne nécessite que quelques secondes :" + +#: wp-admin/includes/class-wp-automatic-updater.php:719 +msgid "We tried but were unable to update your site automatically." +msgstr "Malgré nos tentatives, nous n’avons pas pu mettre votre site à jour automatiquement." + +#. translators: 1: Home URL, 2: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:709 +msgid "Please update your site at %1$s to WordPress %2$s." +msgstr "Veuillez mettre à jour votre site à l’adresse %1$s pour le passer à WordPress %2$s." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:693 +msgid "For more on version %s, see the About WordPress screen:" +msgstr "Pour en savoir plus sur la version %s, lisez l’écran À Propos de WordPress : " + +#: wp-admin/includes/class-wp-automatic-updater.php:687 +msgid "No further action is needed on your part." +msgstr "Vous n’avez rien de plus à faire." + +#. translators: 1: Home URL, 2: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:681 +msgid "Howdy! Your site at %1$s has been updated automatically to WordPress %2$s." +msgstr "Bonjour ! Votre site à l’adresse %1$s a été automatiquement mis à jour vers WordPress %2$s." + +#. translators: Site down notification email subject. 1: Site title. +#: wp-admin/includes/class-wp-automatic-updater.php:664 +msgid "[%1$s] URGENT: Your site may be down due to a failed update" +msgstr "[%1$s] URGENT : suite à une mise à jour échouée, votre site est peut-être inaccessible." + +#. translators: Update available notification email subject. 1: Site title, 2: +#. WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:659 +msgid "[%1$s] WordPress %2$s is available. Please update!" +msgstr "[%1$s] WordPress %2$s est disponible. Veuillez mettre à jour !" + +#. translators: Site updated notification email subject. 1: Site title, 2: +#. WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:653 +msgid "[%1$s] Your site has updated to WordPress %2$s" +msgstr "[%1$s] Votre site a été mis à jour vers WordPress %2$s" + +#. translators: %s: Project name (plugin, theme, or WordPress). +#: wp-admin/includes/class-wp-automatic-updater.php:340 +msgid "Translations for %s" +msgstr "Traductions pour %s" + +#. translators: 1: Project name (plugin, theme, or WordPress), 2: Language. +#: wp-admin/includes/class-wp-automatic-updater.php:342 +#: wp-admin/includes/class-language-pack-upgrader-skin.php:51 +msgid "Updating translations for %1$s (%2$s)…" +msgstr "Mise à jour de la traduction de %1$s (%2$s)…" + +#: wp-admin/includes/class-language-pack-upgrader-skin.php:31 +#: wp-admin/update-core.php:545 wp-admin/update-core.php:925 +msgid "Update Translations" +msgstr "Mettre à jour les traductions" + +#: wp-admin/includes/class-wp-site-health.php:1982 +msgid "Background updates" +msgstr "Mises à jour en arrière-plan" + +#: wp-admin/includes/update-core.php:1143 +msgid "There is not enough free disk space to complete the update." +msgstr "Il n’y a pas assez d’espace sur le disque pour terminer la mise à jour." + +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-automatic-updater.php:335 +msgid "Updating plugin: %s" +msgstr "Mise à jour de l’extension : %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-automatic-updater.php:328 +msgid "Updating theme: %s" +msgstr "Mise à jour du thème : %s" + +#: wp-admin/includes/class-language-pack-upgrader.php:120 +msgid "Translation updated successfully." +msgstr "La traduction a bien été mise à jour." + +#: wp-admin/includes/class-language-pack-upgrader.php:119 +msgid "Translation update failed." +msgstr "La mise à jour de la traduction a échoué." + +#: wp-admin/includes/class-language-pack-upgrader.php:113 +msgid "Some of your translations need updating. Sit tight for a few more seconds while we update them as well." +msgstr "Certaines de vos traductions ont besoin d’être mises à jour. Patientez encore quelques secondes, le temps que nous les mettions également à jour." + +#: wp-admin/user-new.php:456 +msgid "Create a brand new user and add them to this site." +msgstr "Créer un nouvel utilisateur et l’ajouter à ce site." + +#. translators: %s: Link to documentation on child themes. +#: wp-admin/theme-editor.php:42 +msgid "Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a child theme instead." +msgstr "La mise à jour vers une nouvelle version du thème supprimera les modifications que vous aurez faites. Pour éviter cela, nous vous conseillons de passer plutôt par un Thème-Enfant." + +#: wp-admin/options-media.php:52 +msgid "The sizes listed below determine the maximum dimensions in pixels to use when adding an image to the Media Library." +msgstr "Les tailles précisées ci-dessous déterminent les dimensions maximales (en pixels) à utiliser lors de l’insertion d’une image dans la bibliothèque de médias." + +#: wp-admin/options-discussion.php:182 +msgid "Comment must be manually approved" +msgstr "Le commentaire doit être approuvé manuellement" + +#: wp-admin/nav-menus.php:574 +msgid "Clicking the arrow to the right of any menu item in the editor will reveal a standard group of settings. Additional settings such as link target, CSS classes, link relationships, and link descriptions can be enabled and disabled via the Screen Options tab." +msgstr "En cliquant sur le titre de n’importe élément du menu dans l’éditeur, un ensemble de réglages standards s’ouvrira. D’autres réglages, tels que la cible du lien, les classes CSS, les relations du lien et la description du lien, peuvent être activés et désactivés dans l’onglet « Options de l’écran »." + +#. translators: 1: URL to Widgets screen, 2 and 3: The names of the default +#. themes. +#: wp-admin/nav-menus.php:543 +msgid "Menus can be displayed in locations defined by your theme, even used in sidebars by adding a “Navigation Menu” widget on the Widgets screen. If your theme does not support the navigation menus feature (the default themes, %2$s and %3$s, do), you can learn about adding this support by following the Documentation link to the side." +msgstr "Les menus peuvent être affichés à des emplacements définis par votre thème, et même dans les colonnes latérales grâce au widget « Menus personnalisés » de l’écran Widgets. Si votre thème ne reconnaît pas encore cette fonctionnalité (les thèmes par défaut, %2$s and %3$s, les intègrent très bien), vous pouvez apprendre à ajouter cette reconnaissance vous-même en suivant le lien de documentation situé sur le côté." + +#. translators: %s: URL to Widgets screen. +#: wp-admin/nav-menus.php:534 +msgid "Your theme does not natively support menus, but you can use them in sidebars by adding a “Navigation Menu” widget on the Widgets screen." +msgstr "Votre thème ne prend pas en charge nativement les menus, mais vous pouvez les utiliser dans la colonne latérale en ajoutant le widget « Menu de navigation » depuis l’écran Widgets." + +#: wp-admin/install.php:385 +msgid "Sorry, that isn’t a valid email address. Email addresses look like username@example.com." +msgstr "Désolé, ce n’est pas une adresse de messagerie valide. Les adresses de messagerie ressemblent à cela : utilisateur@exemple.com." + +#: wp-admin/install.php:381 +msgid "You must provide an email address." +msgstr "Vous devez saisir une adresse de messagerie." + +#: wp-admin/install.php:377 +msgid "Your passwords do not match. Please try again." +msgstr "Vos mots de passe ne correspondent pas. Veuillez réessayer." + +#: wp-admin/install.php:373 +msgid "The username you provided has invalid characters." +msgstr "L’identifiant que vous avez fourni contient des caractères non valides." + +#: wp-admin/install.php:370 +msgid "Please provide a valid username." +msgstr "Veuillez saisir un identifiant valide." + +#: wp-admin/includes/update-core.php:1091 +msgid "Copying the required files…" +msgstr "Copie des fichiers nécessaires…" + +#: wp-admin/includes/update-core.php:1021 +msgid "Preparing to install the latest version…" +msgstr "Préparation de l’installation de la dernière version…" + +#: wp-admin/includes/file.php:2182 +msgid "This password will not be stored on the server." +msgstr "Le mot de passe ne sera pas stocké sur le serveur." + +#. translators: 1: File checksum, 2: Expected checksum value. +#: wp-admin/includes/file.php:1187 +msgid "The checksum of the file (%1$s) does not match the expected checksum value (%2$s)." +msgstr "L’empreinte de contrôle (ou checksum) de votre fichier (%1$s) ne correspond pas à la valeur de l’empreinte attendue (%2$s)." + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:321 +msgid "WordPress %s" +msgstr "WordPress %s" + +#. translators: %s: WordPress version. +#: wp-admin/includes/class-wp-automatic-updater.php:319 +msgid "Updating to WordPress %s" +msgstr "Mise à jour vers WordPress %s" + +#: wp-admin/includes/class-core-upgrader.php:38 +msgid "Due to an error during updating, WordPress has rolled back to your previous version." +msgstr "Suite à une erreur pendant la mise à jour, WordPress vous a ramené à votre version précédente." + +#: wp-admin/includes/class-core-upgrader.php:37 +msgid "Attempting to roll back to previous version." +msgstr "Tentative de retour à la version précédente." + +#. translators: 1: Folder to locate, 2: Folder to start searching from. +#: wp-admin/includes/class-wp-filesystem-base.php:256 +msgid "Looking for %1$s in %2$s" +msgstr "Recherche %1$s dans %2$s" + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:356 +msgid "%s page restored from the Trash." +msgid_plural "%s pages restored from the Trash." +msgstr[0] "%s page récupérée depuis la corbeille." +msgstr[1] "%s pages récupérées depuis la corbeille." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:354 +msgid "%s page moved to the Trash." +msgid_plural "%s pages moved to the Trash." +msgstr[0] "%s page déplacée dans la corbeille." +msgstr[1] "%s pages déplacées dans la corbeille." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:352 +msgid "%s page permanently deleted." +msgid_plural "%s pages permanently deleted." +msgstr[0] "%s page définitivement supprimée." +msgstr[1] "%s pages définitivement supprimées." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:350 +msgid "%s page not updated, somebody is editing it." +msgid_plural "%s pages not updated, somebody is editing them." +msgstr[0] "%s page n’a pas été mise à jour : quelqu’un est déjà en train de la modifier." +msgstr[1] "%s pages n’ont pas été mises à jour : quelqu’un est déjà en train de les modifier." + +#. translators: %s: Number of pages. +#: wp-admin/edit.php:347 +msgid "%s page updated." +msgid_plural "%s pages updated." +msgstr[0] "%s page mise à jour." +msgstr[1] "%s pages mises à jour." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:343 +msgid "%s post restored from the Trash." +msgid_plural "%s posts restored from the Trash." +msgstr[0] "%s publication récupérée depuis la corbeille." +msgstr[1] "%s publications récupérées depuis la corbeille." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:341 +msgid "%s post moved to the Trash." +msgid_plural "%s posts moved to the Trash." +msgstr[0] "%s publication déplacée dans la corbeille." +msgstr[1] "%s publications déplacées dans la corbeille." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:339 +msgid "%s post permanently deleted." +msgid_plural "%s posts permanently deleted." +msgstr[0] "%s publication supprimée définitivement." +msgstr[1] "%s publications supprimées définitivement." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:337 +msgid "%s post not updated, somebody is editing it." +msgid_plural "%s posts not updated, somebody is editing them." +msgstr[0] "%s publication n’a pas été mise à jour : quelqu’un est déjà en train de la modifier." +msgstr[1] "%s publications n’ont pas été mises à jour : quelqu’un est déjà en train de les modifier." + +#: wp-admin/includes/edit-tag-messages.php:39 +msgid "Tags deleted." +msgstr "Étiquettes supprimées." + +#: wp-admin/includes/edit-tag-messages.php:38 +msgid "Tag not updated." +msgstr "Étiquette non mise à jour." + +#: wp-admin/includes/edit-tag-messages.php:37 +msgid "Tag not added." +msgstr "Étiquette non ajoutée." + +#: wp-admin/includes/edit-tag-messages.php:36 +msgid "Tag updated." +msgstr "Étiquette mise à jour." + +#: wp-admin/includes/edit-tag-messages.php:35 +msgid "Tag deleted." +msgstr "Étiquette supprimée." + +#: wp-admin/includes/edit-tag-messages.php:34 +msgid "Tag added." +msgstr "Étiquette ajoutée." + +#: wp-admin/includes/edit-tag-messages.php:29 +msgid "Categories deleted." +msgstr "Catégories supprimées." + +#: wp-admin/includes/edit-tag-messages.php:28 +msgid "Category not updated." +msgstr "Catégorie non mise à jour." + +#: wp-admin/includes/edit-tag-messages.php:27 +msgid "Category not added." +msgstr "Catégorie non ajoutée." + +#: wp-admin/includes/edit-tag-messages.php:26 +msgid "Category updated." +msgstr "Catégorie mise à jour." + +#: wp-admin/includes/edit-tag-messages.php:25 +msgid "Category deleted." +msgstr "Catégorie effacée." + +#: wp-admin/includes/edit-tag-messages.php:24 +msgid "Category added." +msgstr "Catégorie ajoutée." + +#: wp-admin/revision.php:133 +msgid "Compare two different revisions by selecting the “Compare any two revisions” box to the side." +msgstr "Comparez deux révisions différentes en cochant la case « Comparer n’importe quelles révisions » sur le côté." + +#: wp-admin/includes/revision.php:382 +msgid "Compare any two revisions" +msgstr "Comparer n’importe quelles révisions" + +#: wp-admin/includes/revision.php:441 +msgid "Restore This Autosave" +msgstr "Rétablir cette sauvegarde automatique" + +#. translators: %s: User's display name. +#: wp-admin/includes/revision.php:413 +msgid "Current Revision by %s" +msgstr "Révision actuelle par %s" + +#. translators: %s: User's display name. +#: wp-admin/includes/revision.php:403 +msgid "Autosave by %s" +msgstr "Sauvegarde automatique par %s" + +#: wp-admin/includes/meta-boxes.php:249 +msgctxt "revisions" +msgid "Browse" +msgstr "Parcourir" + +#. translators: Post revisions heading. %s: The number of available revisions. +#: wp-admin/includes/meta-boxes.php:247 +msgid "Revisions: %s" +msgstr "Révisions : %s" + +#. translators: %s: Audio track title. +#: wp-admin/includes/media.php:338 +msgid "\"%s\"." +msgstr "%s." + +#. translators: 1: Audio track title, 2: Artist name. +#: wp-admin/includes/media.php:335 +msgid "\"%1$s\" by %2$s." +msgstr "%1$s par %2$s." + +#. translators: 1: Audio track title, 2: Album title. +#: wp-admin/includes/media.php:332 +msgid "\"%1$s\" from %2$s." +msgstr "%1$s tiré de %2$s" + +#. translators: 1: Audio track title, 2: Album title, 3: Artist name. +#: wp-admin/includes/media.php:329 +msgid "\"%1$s\" from %2$s by %3$s." +msgstr "%1$s tiré de %2$s par %3$s." + +#. translators: %s: User's display name. +#: wp-admin/includes/revision.php:423 +msgid "Revision by %s" +msgstr "Révision par %s" + +#: wp-admin/edit-form-advanced.php:445 +msgid "We’re backing up this post in your browser, just in case." +msgstr "Nous sauvegardons cette publication dans votre navigateur, par sécurité." + +#: wp-admin/edit-form-advanced.php:444 +msgid "Connection lost. Saving has been disabled until you’re reconnected." +msgstr "Connexion perdue. L’enregistrement a été désactivé jusqu’à ce que vous soyez reconnecté·e." + +#: wp-admin/includes/revision.php:455 +msgid "Sorry, something went wrong. The requested comparison could not be loaded." +msgstr "Désolé, quelque chose s’est mal déroulé. La comparaison demandée n’a pas pu être chargée." + +#: wp-admin/install.php:159 wp-admin/user-new.php:529 +msgid "Repeat Password" +msgstr "Répétez le mot de passe" + +#: wp-admin/user-edit.php:649 +msgid "Repeat New Password" +msgstr "Répétez le nouveau mot de passe" + +#: wp-admin/includes/nav-menu.php:1027 +msgid "Add menu items from the column on the left." +msgstr "Ajouter des éléments de menu depuis la colonne de gauche." + +#. translators: %s: https://wordpress.org/plugins +#: wp-admin/includes/plugin-install.php:269 +msgid "Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the WordPress Plugin Directory or upload a plugin in .zip format by clicking the button at the top of this page." +msgstr "Les extensions étendent les fonctionnalités de WordPress, et en ajoutent de nouvelles. Vous pouvez installer des extensions automatiquement en provenance du répertoire des extensions WordPress, ou téléverser une extension au format .zip en cliquant sur le bouton en haut de cette page." + +#. Plugin URI of the plugin +msgid "http://wordpress.org/plugins/hello-dolly/" +msgstr "https://wordpress.org/plugins/hello-dolly/" + +#: wp-admin/includes/class-theme-upgrader.php:68 +msgid "The theme contains no files." +msgstr "Ce thème ne contient aucun fichier." + +#: wp-admin/includes/class-wp-upgrader.php:161 +msgid "The package contains no files." +msgstr "Ce paquet ne contient aucun fichier." + +#: wp-admin/revision.php:132 +msgid "To navigate between revisions, drag the slider handle left or right or use the Previous or Next buttons." +msgstr "Pour naviguer entre les révisions, faites glisser le curseur vers la gauche ou vers la droite ou utilisez les boutons Précédente ou Suivante." + +#: wp-admin/includes/class-wp-debug-data.php:419 +#: wp-admin/includes/dashboard.php:1089 wp-admin/includes/dashboard.php:1279 +#: wp-admin/customize.php:150 +msgid "Loading…" +msgstr "Chargement…" + +#: wp-admin/post.php:301 +msgid "This item has already been deleted." +msgstr "Cet élément a déjà été supprimé." + +#: wp-admin/post.php:279 +msgid "The item you are trying to restore from the Trash no longer exists." +msgstr "L’élément que vous essayez de sortir de la corbeille n’existe plus." + +#: wp-admin/post.php:242 +msgid "The item you are trying to move to the Trash no longer exists." +msgstr "L’élément que vous essayez de placer dans la corbeille n’existe plus." + +#: wp-admin/nav-menus.php:927 +msgid "Drag the items into the order you prefer. Click the arrow on the right of the item to reveal additional configuration options." +msgstr "Glissez chaque élément pour les placer dans l’ordre que vous préférez. Cliquez sur la flèche à droite de l’élément pour révéler d’autres options de configuration." + +#: wp-admin/nav-menus.php:562 +msgid "If you haven’t yet created any menus, click the ’create a new menu’ link to get started" +msgstr "Si vous n’avez pas encore créé de menu, cliquez sur le lien « Créer un nouveau menu » pour vous lancer" + +#: wp-admin/revision.php:134 +msgid "To restore a revision, click Restore This Revision." +msgstr "Pour rétablir cette révision, cliquez sur « Rétablir cette révision »." + +#: wp-admin/revision.php:131 +msgid "From this screen you can review, compare, and restore revisions:" +msgstr "Depuis cet écran, vous pouvez visualiser, comparer et rétablir les révisions :" + +#: wp-admin/revision.php:130 +msgid "Revisions are saved copies of your post or page, which are periodically created as you update your content. The red text on the left shows the content that was removed. The green text on the right shows the content that was added." +msgstr "Les révisions sont des copies de votre article ou votre page, périodiquement créées tandis que vous modifiez votre contenu. Sur la gauche, le texte en rouge indique le contenu qui a été retiré. Sur la droite, le texte en vert indique le contenu qui a été ajouté." + +#: wp-admin/revision.php:129 +msgid "This screen is used for managing your content revisions." +msgstr "Cet écran est utilisé pour gérer les révisions de vos contenus." + +#: wp-admin/includes/revision.php:393 +msgctxt "Followed by post revision info" +msgid "To:" +msgstr "Vers :" + +#: wp-admin/includes/revision.php:368 +msgctxt "Button label for a next revision" +msgid "Next" +msgstr "Suivante" + +#: wp-admin/includes/revision.php:364 +msgctxt "Button label for a previous revision" +msgid "Previous" +msgstr "Précédente" + +#: wp-admin/includes/revision.php:391 +msgctxt "Followed by post revision info" +msgid "From:" +msgstr "Depuis :" + +#: wp-admin/nav-menus.php:742 +msgctxt "menu" +msgid "Use new menu" +msgstr "Utiliser le nouveau menu" + +#: wp-admin/nav-menus.php:723 +msgctxt "menu" +msgid "Edit" +msgstr "Modifier" + +#: wp-admin/nav-menus.php:693 +msgid "Select a Menu" +msgstr "Choisir un menu" + +#: wp-admin/nav-menus.php:684 +msgid "Assigned Menu" +msgstr "Menu assigné" + +#: wp-admin/nav-menus.php:683 +msgid "Theme Location" +msgstr "Emplacement du thème" + +#: wp-admin/nav-menus.php:652 +msgid "Manage Locations" +msgstr "Gérer les emplacements" + +#: wp-admin/nav-menus.php:642 +msgid "Edit Menus" +msgstr "Modifier les menus" + +#: wp-admin/nav-menus.php:591 +msgid "To add a new menu instead of assigning an existing one, click the ’Use new menu’ link. Your new menu will be automatically assigned to that theme location" +msgstr "Pour ajouter un nouveau menu au lieu d’en assigner un qui existe déjà, cliquez sur le lien « Utiliser un nouveau menu ». Votre nouveau menu sera automatiquement ajouté à cet emplacement du thème" + +#: wp-admin/nav-menus.php:590 +msgid "To edit a menu currently assigned to a theme location, click the adjacent ’Edit’ link" +msgstr "Pour modifier un menu actuellement assigné à un emplacement du thème, cliquez sur le lien « Modifier » adjacent" + +#: wp-admin/nav-menus.php:589 +msgid "To assign menus to one or more theme locations, select a menu from each location’s drop down. When you’re finished, click Save Changes" +msgstr "Pour assigner des menus à un ou plusieurs emplacements, sélectionnez le menu depuis la liste déroulante de chaque emplacement. Lorsque vous avez terminé, cliquez sur Enregistrer les modifications" + +#: wp-admin/nav-menus.php:588 +msgid "This screen is used for globally assigning menus to locations defined by your theme." +msgstr "Cet écran est utilisé pour assigner de manière globale vos menus à des emplacements définis par votre thème." + +#: wp-admin/nav-menus.php:583 +msgid "Editing Menus" +msgstr "Modification des menus" + +#: wp-admin/nav-menus.php:578 +msgid "Delete a menu item by expanding it and clicking the Remove link" +msgstr "Supprimez un élément du menu en l’ouvrant et en cliquant sur le bouton Supprimer" + +#: wp-admin/nav-menus.php:577 +msgid "To reorganize menu items, drag and drop items with your mouse or use your keyboard. Drag or move a menu item a little to the right to make it a submenu" +msgstr "Pour réorganiser les éléments du menu, glissez/déposez les éléments avec la souris ou utilisez votre clavier. Glissez ou déplacez légèrement un élement du menu pour en faire un sous-menu" + +#: wp-admin/nav-menus.php:575 +msgid "Add one or several items at once by selecting the checkbox next to each item and clicking Add to Menu" +msgstr "Ajoutez un ou plusieurs éléments à la fois en cochant la case à côté de chaque élément puis en cliquant sur « Ajouter au menu »" + +#: wp-admin/nav-menus.php:573 +msgid "Each navigation menu may contain a mix of links to pages, categories, custom URLs or other content types. Menu links are added by selecting items from the expanding boxes in the left-hand column below." +msgstr "Chaque menu de navigation peut contenir un mélange de liens vers des pages, des catégories, des URL personnalisées ou d’autres types de contenu. Les liens de menu sont ajoutés en sélectionnant un élément dans l’une des sections situées dans la colonne de gauche ci-dessous." + +#: wp-admin/nav-menus.php:568 +msgid "Menu Management" +msgstr "Gestion des menus" + +#: wp-admin/nav-menus.php:563 +msgid "You can assign theme locations to individual menus by selecting the desired settings at the bottom of the menu editor. To assign menus to all theme locations at once, visit the Manage Locations tab at the top of the screen." +msgstr "Vous pouvez assigner un emplacement du thème à chaque menu en sélectionnant les réglages souhaités en bas de l’éditeur de menu. Pour assigner un menu à tous les emplacements d’un coup, rendez-vous dans l’onglet Gérer les emplacements en haut de l’écran." + +#: wp-admin/nav-menus.php:561 +msgid "To edit an existing menu, choose a menu from the drop down and click Select" +msgstr "Pour modifier un menu existant, choisissez un menu depuis la liste déroulante et cliquez sur Sélectionner" + +#: wp-admin/nav-menus.php:560 +msgid "The menu management box at the top of the screen is used to control which menu is opened in the editor below." +msgstr "La section de gestion des menus, en haut de l’écran, est utilisée pour contrôler le menu qui est ouvert dans l’éditeur ci-dessous." + +#: wp-admin/nav-menus.php:550 +msgid "Add, organize, and modify individual menu items" +msgstr "Ajouter, organiser et modifier des éléments de menu individuels" + +#: wp-admin/nav-menus.php:549 +msgid "Create, edit, and delete menus" +msgstr "Créer, modifier et supprimer des menus" + +#: wp-admin/nav-menus.php:548 wp-admin/themes.php:93 +msgid "From this screen you can:" +msgstr "Depuis cet écran, vous pouvez :" + +#: wp-admin/nav-menus.php:540 +msgid "This screen is used for managing your navigation menus." +msgstr "Cet écran est utilisé pour gérer vos menus de navigation." + +#: wp-admin/includes/post.php:1773 +msgid "Your latest changes were saved as a revision." +msgstr "Vos dernières modifications ont été enregistrées dans une révision." + +#: wp-admin/includes/media.php:3365 +msgid "Audio Codec:" +msgstr "Codex audio :" + +#: wp-admin/includes/media.php:3364 +msgid "Audio Format:" +msgstr "Format audio :" + +#. translators: Audio file genre information. %s: Audio genre name. +#: wp-admin/includes/media.php:373 +msgid "Genre: %s." +msgstr "Genre : %s." + +#. translators: Audio file track information. 1: Audio track number, 2: Total +#. audio tracks. +#: wp-admin/includes/media.php:364 +msgid "Track %1$s of %2$s." +msgstr "Piste %1$s sur %2$s." + +#. translators: Audio file track information. %d: Year of audio track release. +#: wp-admin/includes/media.php:356 +msgid "Released: %d." +msgstr "Date de sortie : %d." + +#. translators: 1: Audio album title, 2: Artist name. +#: wp-admin/includes/media.php:344 +msgid "%1$s by %2$s." +msgstr "%1$s par %2$s." + +#: wp-admin/nav-menus.php:405 +msgid "Menu locations updated." +msgstr "Les emplacements de menu ont été mis à jour." + +#: wp-admin/includes/revision.php:443 +msgid "Restore This Revision" +msgstr "Rétablir cette révision" + +#. translators: %s: Capability name. +#: wp-admin/user-edit.php:763 +msgid "Denied: %s" +msgstr "Refusé : %s" + +#: wp-admin/user-edit.php:749 +msgid "Capabilities" +msgstr "Permissions" + +#: wp-admin/nav-menus.php:955 wp-admin/network/settings.php:441 +msgid "Menu Settings" +msgstr "Réglages du menu" + +#: wp-admin/nav-menus.php:885 +msgid "Menu structure" +msgstr "Structure du menu" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:251 +msgid "To the top" +msgstr "Tout en haut" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:248 +msgid "Down one" +msgstr "Descendre d’un cran" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:247 +msgid "Up one" +msgstr "Un cran vers le haut" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:246 +msgid "Move" +msgstr "Déplacer" + +#. translators: 1: Post creation date, 2: Post creation time. +#: wp-admin/includes/ajax-actions.php:1560 +msgid "Draft created on %1$s at %2$s" +msgstr "Brouillon créé le %1$s à %2$s" + +#. translators: %s: User's display name. +#: wp-admin/post.php:257 +msgid "You cannot move this item to the Trash. %s is currently editing." +msgstr "Vous ne pouvez pas déplacer cet élément dans la corbeille. %s est en train de le modifier." + +#. translators: %s: User's display name. +#: wp-admin/includes/misc.php:1100 +msgid "%s has taken over and is currently editing." +msgstr "%s a pris la main et modifie actuellement ce contenu." + +#: wp-admin/nav-menus.php:793 +msgid "Select a menu to edit:" +msgstr "Sélectionnez le menu à modifier :" + +#. translators: %s: URL to Upgrade Network screen. +#: wp-admin/includes/ms.php:706 +msgid "Thank you for Updating! Please visit the Upgrade Network page to update all your sites." +msgstr "Merci d’avoir fait cette mise à jour ! Rendez-vous sur la page de mise à jour du réseau afin de mettre à jour tous vos sites." + +#: wp-admin/setup-config.php:447 +msgid "All right, sparky! You’ve made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to…" +msgstr "C’est parfait ! Vous avez passé la première partie de l’installation. WordPress peut désormais communiquer avec votre base de données. Préparez-vous, il est maintenant temps de…" + +#: wp-admin/includes/class-wp-debug-data.php:758 +msgid "Client version" +msgstr "Version du client" + +#: wp-admin/nav-menus.php:970 +msgid "Auto add pages" +msgstr "Ajoutez automatiquement des pages" + +#: wp-admin/nav-menus.php:942 +msgid "Give your menu a name, then click Create Menu." +msgstr "Donnez à votre menu un nom, puis cliquez sur « Créer le menu »." + +#: wp-admin/nav-menus.php:925 +msgid "Edit your default menu by adding or removing items. Drag the items into the order you prefer. Click Create Menu to save your changes." +msgstr "Modifiez votre menu par défaut en ajoutant ou en retirant des éléments. Faites glissez chaque élément pour les mettre dans l’ordre que vous souhaitez. Cliquez sur « Créer le menu » pour enregistrer vos modifications." + +#: wp-admin/nav-menus.php:288 +msgid "Selected menus have been successfully deleted." +msgstr "Les menus sélectionnés ont bien été supprimés." + +#: wp-admin/includes/class-walker-nav-menu-edit.php:121 +msgid "sub item" +msgstr "sous-élément" + +#: wp-admin/theme-editor.php:31 +msgid "For PHP files, you can use the Documentation dropdown to select from functions recognized in that file. Look Up takes you to a web page with reference material about that particular function." +msgstr "Pour les fichiers PHP, vous pouvez utiliser le menu déroulant « Documentation » pour en apprendre plus sur les fonctions trouvées dans le ce fichier. Le bouton « Consulter » vous enverra sur la page dédiée de cette fonction." + +#: wp-admin/theme-editor.php:297 wp-admin/plugin-editor.php:274 +msgid "Look Up" +msgstr "Consulter" + +#: wp-admin/plugin-editor.php:128 +msgid "The Documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Look Up takes you to a web page about that particular function." +msgstr "Le menu « Documentation », situé sous l’éditeur, liste les fonctions PHP reconnues dans le fichier de l’extension. En cliquant sur « Consulter », vous serez envoyé sur une page web documentant cette fonction." + +#. translators: %s: User's display name. +#: wp-admin/includes/misc.php:1050 +#: wp-admin/includes/class-wp-posts-list-table.php:1003 +msgid "%s is currently editing" +msgstr "%s modifie actuellement ce contenu" + +#: wp-admin/edit-form-advanced.php:355 +msgid "You can upload and insert media (images, audio, documents, etc.) by clicking the Add Media button. You can select from the images and files already uploaded to the Media Library, or upload new media to add to your page or post. To create an image gallery, select the images to add and click the “Create a new gallery” button." +msgstr "Vous pouvez téléverser et insérer des fichiers média (images, sons, documents, etc.) en cliquant sur le bouton « Ajouter un média ». Vous pouvez sélectionner vos images et fichiers parmi ceux déjà présents dans la bibliothèque de médias, ou en téléverser de nouveaux à ajouter à votre article/page. Pour créer une galerie d’images, sélectionnez les images à ajouter et cliquez sur le bouton « Créer une nouvelle galerie »." + +#: wp-admin/includes/image-edit.php:217 +msgid "Image rotation is not supported by your web host." +msgstr "La rotation d’image n’est pas disponible avec cet hébergeur." + +#. translators: %s: URL to install the Link Manager plugin. +#: wp-admin/includes/bookmark.php:323 +msgid "If you are looking to use the link manager, please install the Link Manager plugin." +msgstr "Si vous souhaitez utiliser le gestionnaire de liens, veuillez installer l’extension Link Manager." + +#: wp-admin/widgets.php:77 +msgid "When changing themes, there is often some variation in the number and setup of widget areas/sidebars and sometimes these conflicts make the transition a bit less smooth. If you changed themes and seem to be missing widgets, scroll down on this screen to the Inactive Widgets area, where all of your widgets and their settings will have been saved." +msgstr "En changeant de thème, il y a souvent des variations sur le nombre et l’agencement des zones de widgets et des colonnes latérales, et parfois tout cela entre en conflit, rendant la transition moins aisée. Si vous avez changé de thème et que certains widgets semblent manquer, faites défiler cet écran jusqu’en bas pour les retrouver dans la zone des widgets inactifs, où ils ont été conservés avec leurs derniers réglages." + +#: wp-admin/edit-tags.php:288 +msgid "Parent — Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have child categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown." +msgstr "Parent — Les catégories, contrairement aux étiquettes, peuvent avoir une hiérarchie. Vous pouvez avoir une catégorie nommée « Jazz », et à l’intérieur, plusieurs catégories comme « Bebop » et « Big Band ». Le fait d’avoir une hiérarchie est totalement facultatif. Pour créer une sous-catégorie, choisissez juste une autre catégorie depuis la liste déroulante « Parente » ." + +#: wp-admin/edit-form-advanced.php:368 +msgid "Several boxes on this screen contain settings for how your content will be published, including:" +msgstr "Plusieurs sections de cet écran vous permettez de régler la manière dont votre contenu sera publié, notamment :" + +#: wp-admin/edit-form-advanced.php:361 +msgid "Inserting Media" +msgstr "Insertion de média" + +#: wp-admin/edit-form-advanced.php:280 +msgid "The title field and the big Post Editing Area are fixed in place, but you can reposition all the other boxes using drag and drop. You can also minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen." +msgstr "Le champ du titre et la zone d’édition de la publication sont inamovibles, mais vous pouvez déplacer toutes les autres sections par simple glisser/déposer. Vous pouvez également les fermer/ouvrir en cliquant sur la barre de titre de chaque section. Utilisez l’onglet « Options de l’écran » pour masquer d’autres sections (Extrait, Envoyer des rétroliens, Champs personnalisés, Commentaires, Slug, Auteur) ou pour choisir un affichage sur une ou deux colonnes pour cet écran." + +#: wp-admin/includes/class-custom-image-header.php:128 +msgid "Don’t forget to click “Save Changes” when you’re done!" +msgstr "N’oubliez pas de cliquer sur « Enregistrer les modifications » quand vous avez terminé !" + +#: wp-admin/includes/class-custom-background.php:91 +msgid "To use a background image, simply upload it or choose an image that has already been uploaded to your Media Library by clicking the “Choose Image” button. You can display a single instance of your image, or tile it to fill the screen. You can have your background fixed in place, so your site content moves on top of it, or you can have it scroll with your site." +msgstr "Pour utiliser une image de fond, téléversez-la simplement ou choisissez une image déjà téléversée dans votre bibliothèque de médias en cliquant sur le bouton « Choisir l’image ». Vous pouvez n’afficher qu’une occurrence de l’image, ou la répéter afin de remplir l’écran. Vous pouvez choisir de garder le fond en place quand vous faites défiler le contenu, ou au contraire faire que le fond défile en même temps." + +#. translators: 1: URL to browser uploader, 2: Additional link attributes. +#: wp-admin/includes/media.php:2995 +msgid "You are using the multi-file uploader. Problems? Try the browser uploader instead." +msgstr "Vous utilisez l’outil de téléversement multi-fichiers. Si vous rencontrez des problèmes, essayez la méthode du navigateur à la place." + +#: wp-admin/async-upload.php:58 +msgctxt "media item" +msgid "Edit" +msgstr "Modifier" + +#. translators: %s: Default text color. +#: wp-admin/includes/class-custom-image-header.php:738 +msgctxt "color" +msgid "Default: %s" +msgstr "Par défaut : %s" + +#: wp-admin/includes/class-wp-media-list-table.php:320 +msgctxt "column name" +msgid "Uploaded to" +msgstr "Téléversé sur " + +#: wp-admin/includes/class-custom-background.php:492 +#: wp-admin/includes/class-custom-image-header.php:899 +#: wp-admin/includes/ajax-actions.php:2536 +msgid "The uploaded file is not a valid image. Please try again." +msgstr "Le fichier téléversé n’est pas une image valide. Veuillez réessayer." + +#: wp-admin/includes/class-custom-image-header.php:631 +msgid "Choose a Custom Header" +msgstr "Choisir un en-tête personnalisé" + +#: wp-admin/includes/class-custom-background.php:338 +msgid "Choose a Background Image" +msgstr "Choisir une image d’arrière-plan" + +#: wp-admin/includes/class-custom-image-header.php:127 +msgid "In the Header Text section of this page, you can choose whether to display this text or hide it. You can also choose a color for the text by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a color using the color picker." +msgstr "Dans la section « Texte d’en-tête » de cette page, vous pouvez choisir d’afficher ce texte ou de le masquer. Vous pouvez également choisir une couleur pour ce texte en cliquant sur le bouton « Sélecteur de couleur » et soit en saisissant une valeur HTML valide (ex. : « #ff0000 » pour du rouge) ou en cliquant sur le sélecteur de couleur." + +#: wp-admin/includes/class-custom-background.php:92 +msgid "You can also choose a background color by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a color using the color picker." +msgstr "Vous pouvez également choisir une couleur pour ce texte en cliquant sur le bouton de sélection de couleur ou en saisissant une valeur HTML valide (exemple : « #ff0000 » pour du rouge) ou en utilisant la palette de couleurs." + +#: wp-admin/options-reading.php:44 +msgid "You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the checkbox next to “Discourage search engines from indexing this site” and click the Save Changes button at the bottom of the screen. Note that your privacy is not complete; your site is still visible on the web." +msgstr "Vous pouvez choisir si votre site est parcouru par les robots et autres logiciels automatisés ou non. Si vous préférez que ces services ignorent votre site, cochez l’option « Demander aux moteurs de recherche de ne pas indexer ce site » et cliquez sur le bouton « Enregistrer les modifications » en bas de l’écran. Notez bien que cette confidentialité n’est pas assurée : votre site reste potentiellement visible de tous sur le Web." + +#: wp-admin/includes/dashboard.php:1922 +msgid "Learn more about getting started" +msgstr "Plus d’informations pour bien démarrer" + +#: wp-admin/includes/dashboard.php:1920 +msgid "Turn comments on or off" +msgstr "Activez ou désactivez les commentaires" + +#: wp-admin/includes/dashboard.php:1911 +msgid "More Actions" +msgstr "Plus d’actions" + +#: wp-admin/includes/media.php:3269 +msgid "File URL:" +msgstr "Adresse web du fichier :" + +#: wp-admin/edit-comments.php:186 +msgid "In the In Response To column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post." +msgstr "Dans la colonne En réponse à se trouvent trois éléments. Le texte correspond au titre de l’article qui a inspiré ce commentaire, et un clic sur ce lien vous permettra de modifier cet article. Le lien « Afficher l’article » mène à l’article sur le site. La petite bulle avec un nombre vous indique le nombre de commentaires approuvés que l’article a reçu. S’il y a des commentaires en attente de validation, un cercle de notification rouge contenant le nombre de commentaires en attente sera affiché. Un clic sur ce cercle de notification filtrera la liste des commentaires pour ne plus afficher que ceux en attente qui sont liés à cet article." + +#. translators: 1: User ID, 2: User login. +#: wp-admin/users.php:297 wp-admin/users.php:435 +msgid "ID #%1$s: %2$s" +msgstr "ID n°%1$s : %2$s" + +#. translators: 1: User ID, 2: User login. +#: wp-admin/users.php:294 +msgid "ID #%1$s: %2$s The current user will not be deleted." +msgstr "ID n°%1$s : %2$s L’utilisateur actuel ne sera pas supprimé." + +#. translators: Storage space that's been used. 1: Percentage of used space, 2: +#. Total space allowed in megabytes or gigabytes. +#: wp-admin/includes/ms.php:257 +msgid "Used: %1$s%% of %2$s" +msgstr "Taux d’utilisation : %1$s%% sur %2$s" + +#: wp-admin/users.php:277 +msgid "Please select an option." +msgstr "Veuillez choisir une option." + +#: wp-admin/setup-config.php:415 +msgid "After you’ve done that, click “Run the installation”." +msgstr "Après cela, cliquez sur « Lancer l’installation »" + +#: wp-admin/setup-config.php:212 +msgid "Below you should enter your database connection details. If you’re not sure about these, contact your host." +msgstr "Vous devez saisir ci-dessous les détails de connexion à votre base de données. Si vous ne les connaissez pas, contactez votre hébergeur." + +#: wp-admin/plugin-install.php:103 +msgid "If you want to install a plugin that you’ve downloaded elsewhere, click the Upload Plugin button above the plugins list. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin." +msgstr "Si vous voulez installer une extension que vous avez téléchargée depuis un site tiers, cliquez sur le bouton « Téléverser une extension ». Il vous sera demandé d’indiquer le fichier .zip à téléverser, et ceci fait, vous pourrez activer l’extension." + +#: wp-admin/plugin-install.php:102 +msgid "You can also browse a user’s favorite plugins, by using the Favorites link above the plugins list and entering their WordPress.org username." +msgstr "Vous pouvez voir les extensions favorites d’un utilisateur en utilisant le lien « Favorites » situé en haut à gauche de l’écran, et en renseignant son identifiant WordPress.org." + +#: wp-admin/plugin-install.php:100 +msgid "If you know what you’re looking for, Search is your best bet. The Search screen has options to search the WordPress Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting popular tags. Tags in larger type mean more plugins have been labeled with that tag." +msgstr "Si vous savez ce que vous voulez, commencez par le champ « Recherche » : il vous permet de lancer une recherche sur le dépôt d’extensions de WordPress.org, pour un terme, un auteur, ou une étiquette en particulier. Vous pouvez également lancer une recherche en cliquant sur une des étiquettes populaires. Plus une étiquette est grande, plus elle fait référence à un grand nombre d’extensions." + +#: wp-admin/options-reading.php:205 wp-admin/install.php:202 +msgid "It is up to search engines to honor this request." +msgstr "Certains moteurs de recherche peuvent décider de l’indexer malgré tout." + +#: wp-admin/options-reading.php:184 wp-admin/options-reading.php:204 +#: wp-admin/install.php:193 wp-admin/install.php:201 +msgid "Discourage search engines from indexing this site" +msgstr "Demander aux moteurs de recherche de ne pas indexer ce site" + +#: wp-admin/options-reading.php:182 wp-admin/install.php:191 +msgid "Allow search engines to index this site" +msgstr "Autoriser les moteurs de recherche à indexer ce site" + +#: wp-admin/options-reading.php:43 wp-admin/options-reading.php:178 +#: wp-admin/options-reading.php:179 wp-admin/install.php:183 +#: wp-admin/install.php:186 +msgid "Search Engine Visibility" +msgstr "Visibilité pour les moteurs de recherche" + +#. translators: 1: WordPress version, 2: URL to About screen. +#: wp-admin/includes/update-core.php:1415 wp-admin/update-core.php:635 +msgid "Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click here." +msgstr "Bienvenue sur WordPress %1$s. Vous allez être redirigé vers l’écran « À propos » de WordPress. Si ce n’est pas le cas, cliquez ici." + +#: wp-admin/includes/plugin-install.php:376 wp-admin/theme-install.php:201 +msgid "Get Favorites" +msgstr "Afficher les favoris" + +#: wp-admin/includes/plugin-install.php:374 wp-admin/theme-install.php:198 +msgid "Your WordPress.org username:" +msgstr "Votre identifiant WordPress.org :" + +#: wp-admin/includes/plugin-install.php:370 +msgid "If you have marked plugins as favorites on WordPress.org, you can browse them here." +msgstr "Si vous avez mis des extensions en favoris sur WordPress.org, vous pouvez les voir ici." + +#: wp-admin/includes/dashboard.php:1907 +msgid "View your site" +msgstr "Affichez votre site" + +#: wp-admin/includes/dashboard.php:1904 +msgid "Add an About page" +msgstr "Ajoutez une page « À propos »" + +#: wp-admin/includes/dashboard.php:1903 +msgid "Write your first blog post" +msgstr "Écrivez votre premier article" + +#: wp-admin/includes/dashboard.php:1901 +msgid "Add a blog post" +msgstr "Écrivez un article" + +#: wp-admin/includes/dashboard.php:1897 wp-admin/includes/dashboard.php:1900 +msgid "Add additional pages" +msgstr "Ajoutez de nouvelles pages" + +#: wp-admin/includes/dashboard.php:1896 wp-admin/includes/dashboard.php:1899 +msgid "Edit your front page" +msgstr "Modifiez votre page d’accueil" + +#: wp-admin/includes/class-wp-privacy-requests-table.php:46 +#: wp-admin/includes/dashboard.php:1893 +msgid "Next Steps" +msgstr "Étapes suivantes" + +#. translators: %s: URL to Themes panel in Customizer or Themes screen. +#: wp-admin/includes/dashboard.php:1887 +msgid "or, change your theme completely" +msgstr "ou alors, changez complètement de thème" + +#: wp-admin/includes/dashboard.php:1878 +msgid "Get Started" +msgstr "Lancez-vous !" + +#: wp-admin/includes/dashboard.php:1874 +msgid "We’ve assembled some links to get you started:" +msgstr "Voici quelques liens pour vous aider à démarrer :" + +#: wp-admin/includes/dashboard.php:1873 +msgid "Welcome to WordPress!" +msgstr "Bienvenue sur WordPress !" + +#: wp-admin/includes/dashboard.php:371 +msgid "Search Engines Discouraged" +msgstr "Moteurs de recherche refusés" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:110 +msgctxt "Plugin Installer" +msgid "Favorites" +msgstr "Favorites" + +#. translators: 1: Link to documentation on child themes, 2: Name of parent +#. theme. +#: wp-admin/includes/class-wp-themes-list-table.php:285 +msgid "This child theme requires its parent theme, %2$s." +msgstr "Ce thème enfant nécessite son thème parent, %2$s." + +#: wp-admin/includes/class-wp-screen.php:870 +msgid "Contextual Help Tab" +msgstr "Onglet d’aide contextuelle" + +#: wp-admin/includes/class-wp-screen.php:1062 +msgid "Screen Options Tab" +msgstr "Onglet des options de l’écran" + +#: wp-admin/includes/theme-install.php:101 +msgid "Type of search" +msgstr "Type de recherche" + +#: wp-admin/includes/theme-install.php:111 +#: wp-admin/includes/theme-install.php:123 +msgid "Search by keyword" +msgstr "Rechercher par mot-clé" + +#: wp-admin/includes/theme-install.php:114 +msgid "Search by author" +msgstr "Recherche par auteur" + +#: wp-admin/includes/theme-install.php:117 +msgid "Search by tag" +msgstr "Recherche par étiquette" + +#: wp-admin/includes/widgets.php:263 +msgctxt "widget" +msgid "Edit" +msgstr "Modifier" + +#: wp-admin/includes/widgets.php:264 +msgctxt "widget" +msgid "Add" +msgstr "Ajouter" + +#: wp-admin/theme-install.php:118 +msgid "To install the theme so you can preview it with your site’s content and customize its theme options, click the \"Install\" button at the top of the left-hand pane. The theme files will be downloaded to your website automatically. When this is complete, the theme is now available for activation, which you can do by clicking the \"Activate\" link, or by navigating to your Manage Themes screen and clicking the \"Live Preview\" link under any installed theme’s thumbnail image." +msgstr "Pour installer un thème dans le but de le prévisualiser avec le contenu de votre site et d’en personnaliser les options, cliquez sur le bouton « Installer » en haut du panneau de gauche. Les fichiers du thème seront automatiquement téléchargés vers votre site. Ceci fait, le thème sera disponible, et vous pourrez l’activer en cliquant sur le lien « Activer », ou en vous rendant sur l’écran « Gérer les thèmes » et en cliquant sur le lien « Prévisualiser en direct » situé sous la miniature de chaque thème." + +#: wp-admin/menu-header.php:269 +msgid "Skip to main content" +msgstr "Aller au contenu principal" + +#: wp-admin/includes/class-custom-image-header.php:551 +msgid "You can select an image to be shown at the top of your site by uploading from your computer or choosing from your media library. After selecting an image you will be able to crop it." +msgstr "Vous pouvez choisir une image d’en-tête personnalisée en la téléversant depuis votre ordinateur ou en la choisissant dans votre bibliothèque de médias. Après avoir sélectionné l’image, vous pourrez la recadrer." + +#: wp-admin/edit-form-advanced.php:318 +msgid "Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Text modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box." +msgstr "Le processus de création d’une page reste très proche de celui d’un article, et les écrans respectifs peuvent être personnalisés de la même manière, par le biais de glisser/déposer, de l’onglet « Option de l’écran », et en ouvrant/fermant les sections selon vos besoins. Cet écran dispose également du mode « aucune distraction », tant dans le mode Visuel que dans le mode Texte, via les boutons « Plein écran ». L’éditeur de page fonctionne globalement comme celui des articles, mais dispose de certaines spécificités, disponibles dans la section « Attributs de page » :" + +#: wp-admin/edit-tags.php:260 +msgid "You can delete Link Categories in the Bulk Action pull-down, but that action does not delete the links within the category. Instead, it moves them to the default Link Category." +msgstr "Vous pouvez supprimer des catégories de liens avec la liste déroulante « Actions groupées », mais cette action ne supprime pas les liens contenus dans la catégorie. Au lieu de cela, ils sont déplacés dans la catégorie de liens par défaut." + +#. translators: %s: URL to Categories to Tags Converter tool. +#: wp-admin/edit-tags.php:622 +msgid "Tags can be selectively converted to categories using the tag to category converter." +msgstr "Les étiquettes peuvent être converties de manière sélective en catégories via le convertisseur étiquettes vers catégories." + +#. translators: %s: Link name. +#. translators: %s: Plugin name. +#. translators: %s: Taxonomy term name. +#. translators: %s: User login. +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#. translators: %s: Theme name. +#. translators: %s: Site URL. +#: wp-admin/includes/class-wp-links-list-table.php:175 +#: wp-admin/includes/class-wp-plugins-list-table.php:842 +#: wp-admin/includes/class-wp-terms-list-table.php:367 +#: wp-admin/includes/class-wp-users-list-table.php:494 +#: wp-admin/includes/class-wp-media-list-table.php:365 +#: wp-admin/includes/class-wp-posts-list-table.php:925 +#: wp-admin/update-core.php:406 wp-admin/update-core.php:490 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:408 +#: wp-admin/includes/class-wp-ms-users-list-table.php:241 +msgid "Select %s" +msgstr "Sélectionner %s" + +#: wp-admin/includes/class-wp-comments-list-table.php:777 +msgid "Select comment" +msgstr "Sélectionnez un commentaire" + +#: wp-admin/includes/class-custom-image-header.php:109 +msgid "You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately. Alternatively, you can use an image that has already been uploaded to your Media Library by clicking the “Choose Image” button." +msgstr "Vous pouvez utiliser une image d’en-tête personnalisée pour votre site. Téléversez simplement l’image, recadrez-la, et le nouvel en-tête sera aussitôt en ligne. Autrement, vous pouvez utiliser une image qui a déjà été téléversée dans votre bibliothèque de médias, en cliquant sur le bouton « Choisissez une image »." + +#: wp-admin/includes/class-custom-image-header.php:878 +msgid "Skip Cropping, Publish Image as Is" +msgstr "Aucun recadrage, utiliser l’image telle quelle" + +#: wp-admin/includes/class-custom-background.php:336 +#: wp-admin/includes/class-custom-image-header.php:628 +msgid "Or choose an image from your media library:" +msgstr "Ou choisissez une image dans votre bibliothèque de médias :" + +#: wp-admin/includes/class-custom-background.php:326 +#: wp-admin/includes/class-custom-image-header.php:549 +msgid "Select Image" +msgstr "Sélectionnez une image" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:394 +#: wp-admin/theme-install.php:362 +msgid "Collapse" +msgstr "Réduire" + +#: wp-admin/includes/class-custom-image-header.php:112 +msgid "If you don’t want a header image to be displayed on your site at all, click the “Remove Header Image” button at the bottom of the Header Image section of this page. If you want to re-enable the header image later, you just have to select one of the other image options and click “Save Changes”." +msgstr "Si vous ne souhaitez pas que votre site utilise une image d’en-tête, cliquez sur le bouton « Retirer l’image d’en-tête » en bas de la section « Image d’en-tête » de cette page. Si vous souhaitez réactiver l’image d’en-tête, il vous suffit de sélectionner l’une des autres options d’images, et de la valider en cliquant sur « Enregistrer les modifications »." + +#: wp-admin/media.php:70 +msgid "You attempted to edit an item that isn’t an attachment. Please go back and try again." +msgstr "Vous avez tenté de modifier un élément qui n’est pas un fichier joint. Veuillez réessayer." + +#: wp-admin/includes/class-wp-theme-install-list-table.php:316 +#: wp-admin/includes/class-wp-theme-install-list-table.php:474 +msgid "This theme is already installed and is up to date" +msgstr "Ce thème est déjà installé et à jour" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:602 +msgctxt "plugin" +msgid "Installed" +msgstr "Installée" + +#: wp-admin/themes.php:140 +msgid "Previewing and Customizing" +msgstr "Prévisualisation et personnalisation" + +#: wp-admin/theme-install.php:123 +msgid "Previewing and Installing" +msgstr "Prévisualisation et installation" + +#: wp-admin/theme-install.php:117 +msgid "Once you have generated a list of themes, you can preview and install any of them. Click on the thumbnail of the theme you’re interested in previewing. It will open up in a full-screen Preview page to give you a better idea of how that theme will look." +msgstr "Une fois que vous avez généré une liste de thèmes, vous pouvez les prévisualiser et les installer. Cliquez sur la miniature du thème que vous souhaitez prévisualiser. Cela ouvrira une page de prévisualisation en plein écran, afin de vous donner une meilleure idée de l’aspect de ce thème." + +#: wp-admin/includes/media.php:3012 +msgid "You are using the browser’s built-in file uploader. The WordPress uploader includes multiple file selection and drag and drop capability. Switch to the multi-file uploader." +msgstr "Vous utilisez l’outil de téléversement du navigateur. Le nouvel outil de téléversement de WordPress inclus la possibilité de téléverser plusieurs fichiers à la fois par glisser/déposer. Passer au nouvel outil de téléversement." + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-theme-install-list-table.php:336 +msgid "Preview %s" +msgstr "Prévisualisation de %s" + +#: wp-admin/tools.php:49 +msgid "The Categories and Tags Converter link on this screen will take you to the Import screen, where that Converter is one of the plugins you can install. Once that plugin is installed, the Activate Plugin & Run Importer link will take you to a screen where you can choose to convert tags into categories or vice versa." +msgstr "Le lien « convertisseur de catégories et étiquettes » vous mènera à la page d’import, où ledit convertisseur est l’une des extensions que vous pouvez installer. Une fois installée, le lien « Activer l’extension & lancer l’importateur » vous mènera à l’écran d’où vous pourrez choisir de lancer une conversion dans un sens ou dans l’autre." + +#: wp-admin/tools.php:48 +msgid "Categories have hierarchy, meaning that you can nest sub-categories. Tags do not have hierarchy and cannot be nested. Sometimes people start out using one on their posts, then later realize that the other would work better for their content." +msgstr "Les catégories disposent d’une hiérarchie, ce qui signifie que vous pouvez leur donner des sous-catégories. Les étiquettes n’ont pas de hiérarchie et ne peuvent être imbriqués. Parfois, des auteurs commencent par utiliser une sorte de caractérisation, pour se rendre compte par la suite qu’ils préfèrent l’autre." + +#. translators: %s: URL to General Settings screen. +#: wp-admin/includes/class-custom-image-header.php:123 +msgid "For most themes, the header text is your Site Title and Tagline, as defined in the General Settings section." +msgstr "Pour la plupart des thèmes, le texte d’en-tête est le titre de votre site et son slogan, tels que définis dans la section Réglages généraux." + +#: wp-admin/includes/class-custom-image-header.php:111 +msgid "If your theme has more than one default header image, or you have uploaded more than one custom header image, you have the option of having WordPress display a randomly different image on each page of your site. Click the “Random” radio button next to the Uploaded Images or Default Images section to enable this feature." +msgstr "Si votre thème a plus d’une image d’en-tête par défaut, ou si vous avez téléversé plus d’une image d’en-tête personnalisée, vous pouvez faire en sorte que WordPress affiche une image aléatoire différente à chaque chargement de votre site. Sélectionnez l’option « Au hasard » dans la section « Images par défaut » ou « Images téléversées » pour activer cette fonctionnalité." + +#: wp-admin/includes/class-custom-image-header.php:110 +msgid "Some themes come with additional header images bundled. If you see multiple images displayed, select the one you’d like and click the “Save Changes” button." +msgstr "Certains thèmes disposent d’une série d’images d’en-tête. Si vous voyez plusieurs images affichées, sélectionnez celle que vous aimez et cliquez sur le bouton « Enregistrer les modifications »." + +#: wp-admin/includes/class-custom-image-header.php:100 +msgid "You can choose from the theme’s default header images, or use one of your own. You can also customize how your Site Title and Tagline are displayed." +msgstr "Vous pouvez choisir à partir des images d’en-tête par défaut du thème, ou utiliser l’une des vôtres. Vous pouvez également personnaliser la manière dont s’affichent le titre de votre site et son slogan." + +#: wp-admin/includes/class-custom-image-header.php:99 +msgid "This screen is used to customize the header section of your theme." +msgstr "Cet écran est utilisé pour personnaliser la section d’en-tête de votre thème." + +#: wp-admin/install.php:270 wp-admin/install.php:283 +msgid "Configuration Error" +msgstr "Erreur de configuration" + +#: wp-admin/media-new.php:54 +msgid "Revert to the Browser Uploader by clicking the link below the drag and drop box." +msgstr "Revenez à l’outil de téléversement du navigateur en cliquant sur le lien sous la zone de glisser-déposer." + +#: wp-admin/users.php:487 wp-admin/network/users.php:248 +msgid "User deleted." +msgstr "Utilisateur supprimé." + +#: wp-admin/includes/class-core-upgrader.php:36 wp-admin/includes/file.php:1521 +#: wp-admin/includes/file.php:1647 +msgid "Could not copy files. You may have run out of disk space." +msgstr "Impossible de copier les fichiers. Il se pourrait que vous manquiez de place." + +#: wp-admin/includes/theme-install.php:140 +msgid "Find a theme based on specific features." +msgstr "Trouver un thème selon des critères précis." + +#: wp-admin/includes/theme-install.php:95 +msgid "Search for themes by keyword." +msgstr "Rechercher des thèmes par mot-clé." + +#: wp-admin/setup-config.php:196 +msgid "In all likelihood, these items were supplied to you by your Web Host. If you don’t have this information, then you will need to contact them before you can continue. If you’re all ready…" +msgstr "Vous devriez normalement avoir reçu ces informations de la part de votre hébergeur. Si vous ne les avez pas, il vous faudra contacter votre hébergeur afin de continuer. Si vous êtes prêt·e…" + +#: wp-admin/theme-editor.php:248 +msgid "This theme is broken." +msgstr "Le thème est cassé." + +#: wp-admin/includes/class-custom-image-header.php:632 +msgid "Set as header" +msgstr "Utiliser comme en-tête" + +#: wp-admin/includes/class-custom-background.php:339 +msgid "Set as background" +msgstr "Utiliser comme image de fond" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-theme-upgrader-skin.php:76 +msgid "Customize “%s”" +msgstr "Personnaliser « %s »" + +#: wp-admin/install.php:160 wp-admin/user-new.php:481 wp-admin/user-new.php:485 +#: wp-admin/user-new.php:505 wp-admin/user-new.php:529 +#: wp-admin/user-edit.php:454 wp-admin/user-edit.php:502 +msgid "(required)" +msgstr "(nécessaire)" + +#: wp-admin/link.php:111 +msgid "Edit Link" +msgstr "Modifier le lien" + +#: wp-admin/includes/user.php:152 +msgid "Error: Please enter a nickname." +msgstr "Erreur : veuillez saisir un pseudonyme." + +#: wp-admin/credits.php:56 +msgid "https://wordpress.org/about/" +msgstr "https://fr.wordpress.org/about/" + +#: wp-admin/includes/class-wp-list-table.php:1128 +#: wp-admin/includes/nav-menu.php:656 wp-admin/includes/nav-menu.php:886 +#: wp-admin/update-core.php:325 wp-admin/update-core.php:433 +#: wp-admin/update-core.php:475 wp-admin/update-core.php:515 +msgid "Select All" +msgstr "Tout sélectionner" + +#: wp-admin/includes/media.php:1385 wp-admin/includes/media.php:2956 +msgid "Enter a link URL or click above for presets." +msgstr "Saisissez une adresse de lien ou cliquez ci-dessus pour les liens prédéfinis." + +#: wp-admin/includes/media.php:1382 +msgid "Link URL" +msgstr "Adresse du lien" + +#: wp-admin/includes/image-edit.php:81 +msgid "Scale" +msgstr "Redimensionner" + +#: wp-admin/includes/meta-boxes.php:847 +msgid "No comments yet." +msgstr "Aucun commentaire pour l’instant." + +#: wp-admin/includes/class-wp-themes-list-table.php:279 +#: wp-admin/includes/class-wp-theme-install-list-table.php:509 +#: wp-admin/includes/plugin-install.php:652 +msgid "Version:" +msgstr "Version : " + +#: wp-admin/includes/class-wp-theme-install-list-table.php:392 +#: wp-admin/theme-install.php:69 wp-admin/theme-install.php:360 +msgid "Collapse Sidebar" +msgstr "Réduire la colonne latérale" + +#: wp-admin/includes/class-wp-privacy-policy-content.php:380 +msgid "↑ Return to Top" +msgstr "↑ Retourner en haut de page" + +#: wp-admin/includes/class-wp-plugins-list-table.php:402 +msgid "Plugin" +msgstr "Extension" + +#: wp-admin/includes/media.php:2545 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:369 +msgid "Actions" +msgstr "Actions" + +#: wp-admin/includes/class-wp-media-list-table.php:151 +#: wp-admin/includes/class-wp-media-list-table.php:732 +#: wp-admin/includes/class-wp-comments-list-table.php:349 +#: wp-admin/includes/class-wp-comments-list-table.php:689 +#: wp-admin/includes/class-wp-posts-list-table.php:410 +#: wp-admin/includes/class-wp-posts-list-table.php:1362 +msgid "Restore" +msgstr "Rétablir" + +#. translators: %s: Number of words. +#: wp-admin/edit-form-advanced.php:603 +msgid "Word count: %s" +msgstr "Nombre de mots : %s" + +#: wp-admin/edit-comments.php:308 wp-admin/edit-comments.php:314 +msgid "Edit comment" +msgstr "Modifier le commentaire" + +#: wp-admin/options-general.php:337 wp-admin/options-general.php:374 +msgid "Preview:" +msgstr "Aperçu :" + +#: wp-admin/includes/theme-install.php:103 +#: wp-admin/includes/plugin-install.php:330 +msgid "Keyword" +msgstr "Mot-clé" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-theme-upgrader.php:81 +msgid "The parent theme could not be found. You will need to install the parent theme, %s, before you can use this child theme." +msgstr "Le thème parent n’a pas pu être trouvé. Vous allez devoir installer le thème parent, %s, avant de pouvoir utiliser ce thème enfant." + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:79 +msgid "Successfully installed the parent theme, %1$s %2$s." +msgstr "Le thème parent, %1$s %2$s, a bien été installé." + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:77 +msgid "The parent theme, %1$s %2$s, is currently installed." +msgstr "Le thème parent, %1$s %2$s, est bien installé." + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:75 +msgid "Preparing to install %1$s %2$s…" +msgstr "Préparation à l’installation de %1$s %2$s…" + +#: wp-admin/includes/class-theme-upgrader.php:73 +msgid "This theme requires a parent theme. Checking if it is installed…" +msgstr "Ce thème nécessite un thème parent. Nous vérifions s’il est installé…" + +#: wp-admin/includes/class-custom-image-header.php:710 +msgid "Show header text with your image." +msgstr "Afficher le texte d’en-tête avec l’image." + +#: wp-admin/includes/class-custom-image-header.php:119 +#: wp-admin/includes/class-custom-image-header.php:702 +#: wp-admin/includes/class-custom-image-header.php:707 +msgid "Header Text" +msgstr "Texte de l’en-tête" + +#. translators: 1: Theme name, 2: Theme details URL, 3: Additional link +#. attributes, 4: Version number, 5: Update URL, 6: Additional link attributes. +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number, 5: Update URL, 6: Additional link attributes. +#. translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number, 5: Update URL, 6: Additional link attributes. +#: wp-admin/includes/theme.php:231 wp-admin/includes/update.php:493 +#: wp-admin/includes/update.php:678 +msgid "There is a new version of %1$s available. View version %4$s details or update now." +msgstr "Une nouvelle version pour %1$s est disponible. Afficher les détails de la version %4$s ou mettre à jour maintenant." + +#. translators: %s: Plugin author. +#: wp-admin/includes/plugin.php:214 +msgid "By %s." +msgstr "par %s." + +#: wp-admin/includes/meta-boxes.php:833 wp-admin/includes/template.php:492 +msgid "Add Comment" +msgstr "Ajouter un commentaire" + +#: wp-admin/includes/template.php:453 +msgid "Add new Comment" +msgstr "Ajouter un nouveau commentaire" + +#. Author URI of the plugin +msgid "http://ma.tt/" +msgstr "https://ma.tt/" + +#. Description of the plugin +msgid "This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from Hello, Dolly in the upper right of your admin screen on every page." +msgstr "Ce n’est pas qu’une extension. Elle symbolise l’espoir et l’enthousiasme de toute une génération, résumé en deux mots, qu’a notamment chanté Louis Armstrong : Hello, Dolly. Une fois activée, elle affichera une ligne aléatoirement des paroles de la chanson Hello, Dolly, en haut à droite de toutes les pages de l’administration." + +#. Plugin Name of the plugin +msgid "Hello Dolly" +msgstr "Hello Dolly" + +#: wp-admin/index.php:92 +msgid "Welcome — Shows links for some of the most common tasks when setting up a new site." +msgstr "Bienvenue — Affiche des liens pour certaines des tâches les plus courantes lors de la configuration d’un nouveau site." + +#. translators: 1: Theme name. 2: Theme slug. +#: wp-admin/includes/class-wp-debug-data.php:906 +#: wp-admin/includes/class-wp-debug-data.php:925 +#: wp-admin/includes/class-wp-debug-data.php:980 +#: wp-admin/includes/class-wp-debug-data.php:1056 +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#. translators: 1: Theme name, 2: Theme details URL, 3: Additional link +#. attributes, 4: Version number. +#. translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#: wp-admin/includes/theme.php:218 wp-admin/includes/update.php:665 +msgid "There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this theme." +msgstr "Une nouvelle version pour %1$s est disponible. Afficher les détails de la version %4$s. La mise à jour automatique n’est pas disponible pour ce thème." + +#: wp-admin/install.php:109 wp-admin/install.php:334 +msgctxt "Howdy" +msgid "Welcome" +msgstr "Bienvenue" + +#: wp-admin/ms-delete-site.php:102 +msgid "Thank you. Please check your email for a link to confirm your action. Your site will not be deleted until this link is clicked." +msgstr "Merci. Veuillez consulter le message que nous vous avons envoyé pour confirmer cette action. Votre site ne sera pas effacé tant que vous n’aurez pas cliqué le lien qu’il contient." + +#. translators: %s: Network title. +#: wp-admin/ms-delete-site.php:111 +msgid "If you do not want to use your %s site any more, you can delete it using the form below. When you click Delete My Site Permanently you will be sent an email with a link in it. Click on this link to delete your site." +msgstr "Si vous ne souhaitez plus utiliser votre site %s, vous pouvez l’effacer à l’aide du formulaire ci-dessous. Après avoir cliqué sur Effacer mon site, vous recevrez un message avec un lien. Cliquez sur ce lien pour effacer votre site." + +#. translators: %s: Network title. +#: wp-admin/ms-delete-site.php:26 +msgid "Thank you for using %s, your site has been deleted. Happy trails to you until we meet again." +msgstr "Merci à vous d’avoir utilisé %s, votre site a été effacé. Nous espérons vous revoir." + +#: wp-admin/ms-delete-site.php:31 +msgid "Sorry, the link you clicked is stale. Please select another option." +msgstr "Désolé, mais le lien que vous avez cliqué est avarié. Veuillez sélectionner une autre option." + +#: wp-admin/ms-delete-site.php:116 +msgid "Remember, once deleted your site cannot be restored." +msgstr "Rappelez-vous qu’une fois supprimé, votre site ne peut être rétabli." + +#: wp-admin/ms-delete-site.php:130 +msgid "Delete My Site Permanently" +msgstr "Effacer mon site définitivement" + +#. translators: %s: Site address. +#: wp-admin/ms-delete-site.php:125 +msgid "I'm sure I want to permanently disable my site, and I am aware I can never get it back or use %s again." +msgstr "Je suis certain de vouloir effacer mon site définitivement, et je me rends compte que je ne pourrais jamais le récupérer ni utiliser %s pour un nouveau site." + +#: wp-admin/includes/class-wp-debug-data.php:185 +#: wp-admin/includes/class-wp-debug-data.php:195 +#: wp-admin/includes/class-wp-debug-data.php:204 +#: wp-admin/includes/class-wp-debug-data.php:213 +#: wp-admin/includes/class-wp-debug-data.php:222 +#: wp-admin/includes/class-wp-debug-data.php:262 +#: wp-admin/includes/class-wp-debug-data.php:267 +#: wp-admin/includes/class-wp-debug-data.php:277 +#: wp-admin/includes/class-wp-debug-data.php:282 +msgid "Disabled" +msgstr "Désactivé" + +#. translators: My Sites label. +#: wp-admin/includes/ms.php:763 +msgid "Primary Site" +msgstr "Site principal" + +#: wp-admin/includes/ms.php:649 +msgid "American English" +msgstr "Anglais (US)" + +#: wp-admin/includes/ms.php:606 +msgid "View Site" +msgstr "Afficher le site" + +#: wp-admin/includes/ms.php:653 +msgid "British English" +msgstr "Anglais (UK)" + +#: wp-admin/includes/ms.php:300 +msgid "MB (Leave blank for network default)" +msgstr "Mo (Laisser vide pour utiliser la valeur par défaut du réseau)" + +#. translators: 1: Site title. +#: wp-admin/includes/ms.php:585 wp-admin/includes/ms.php:594 +msgid "You attempted to access the \"%1$s\" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the \"%1$s\" dashboard, please contact your network administrator." +msgstr "Vous avez tenté d’accéder au tableau de bord de « %1$s ». Cependant, vous ne disposez pas pour le moment des droits nécessaires sur ce site. Si vous pensez que vous devriez pouvoir accéder au tableau de bord de « %1$s », contactez l’administrateur du réseau." + +#: wp-admin/includes/ms.php:597 +msgid "If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way." +msgstr "Si vous êtes arrivé sur cet écran par accident, et que vous vouliez en fait vous rendre sur l’un de vos propres sites, voici quelques raccourcis pour vous aider à trouver votre chemin." + +#: wp-admin/includes/ms.php:599 +msgid "Your Sites" +msgstr "Vos sites" + +#: wp-admin/includes/ms.php:605 +msgid "Visit Dashboard" +msgstr "Se rendre sur le Tableau de bord" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:480 +msgid "Paused (%s)" +msgid_plural "Paused (%s)" +msgstr[0] "Mis en pause (%s)" +msgstr[1] "Mis en pause (%s)" + +#. translators: New admin email address notification email subject. %s: Site +#. title. +#: wp-admin/includes/misc.php:1384 +msgid "[%s] New Admin Email Address" +msgstr "[%s] Nouvelle adresse e-mail d’administration" + +#: wp-admin/my-sites.php:33 +msgid "The primary site you chose does not exist." +msgstr "Le site principal que vous avez choisi n’existe pas." + +#: wp-admin/my-sites.php:111 +msgid "Global Settings" +msgstr "Réglages globaux" + +#: wp-admin/my-sites.php:77 +msgid "You must be a member of at least one site to use this page." +msgstr "Vous devez être membre d’au moins un site pour utiliser cette page." + +#: wp-admin/setup-config.php:242 +msgid "If you want to run multiple WordPress installations in a single database, change this." +msgstr "Si vous souhaitez faire tourner plusieurs installations de WordPress sur une même base de données, modifiez ce réglage." + +#: wp-admin/setup-config.php:240 +msgid "Table Prefix" +msgstr "Préfixe des tables" + +#: wp-admin/setup-config.php:230 +msgid "Database Host" +msgstr "Adresse de la base de données" + +#: wp-admin/setup-config.php:226 +msgctxt "example password" +msgid "password" +msgstr "mot de passe" + +#: wp-admin/setup-config.php:221 +msgctxt "example username" +msgid "username" +msgstr "utilisateur" + +#: wp-admin/setup-config.php:215 +msgid "Database Name" +msgstr "Nom de la base de données" + +#: wp-admin/setup-config.php:198 +msgid "Let’s go!" +msgstr "C’est parti !" + +#: wp-admin/setup-config.php:168 +msgid "Table prefix (if you want to run more than one WordPress in a single database)" +msgstr "Préfixe de table (si vous souhaitez avoir plusieurs WordPress sur une même base de données)" + +#: wp-admin/includes/class-wp-debug-data.php:769 wp-admin/setup-config.php:167 +msgid "Database host" +msgstr "Hôte de base de données" + +#: wp-admin/setup-config.php:166 +msgid "Database password" +msgstr "Mot de passe de l’utilisateur" + +#: wp-admin/includes/class-wp-debug-data.php:763 wp-admin/setup-config.php:165 +msgid "Database username" +msgstr "Nom d’utilisateur MySQL" + +#: wp-admin/includes/class-wp-debug-data.php:775 wp-admin/setup-config.php:164 +msgid "Database name" +msgstr "Nom de la base de données" + +#: wp-admin/setup-config.php:162 +msgid "Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding." +msgstr "Bienvenue sur WordPress. Avant de nous lancer, nous avons besoin de certaines informations sur votre base de données. Il va vous falloir réunir les informations suivantes pour continuer." + +#: wp-admin/setup-config.php:112 +msgid "WordPress › Setup Configuration File" +msgstr "WordPress › Fichier de configuration" + +#. translators: 1: wp-config.php, 2: install.php +#: wp-admin/setup-config.php:75 +msgid "The file %1$s already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now." +msgstr "Le fichier %1$s existe déjà, un niveau au-dessus de votre installation WordPress. Si vous devez mettre à zéro vos éléments de configuration, veuillez d’abord effacer ce fichier. Vous pouvez essayer de lancer l’installation maintenant." + +#. translators: 1: wp-config.php, 2: install.php +#: wp-admin/setup-config.php:63 +msgid "The file %1$s already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now." +msgstr "Le fichier %1$s existe déjà. Si vous devez mettre à zéro n’importe quelle valeur de configuration dans ce fichier, veuillez commencer par le supprimer. Vous pouvez essayer de lancer l’installation maintenant." + +#. translators: %s: wp-config-sample.php +#: wp-admin/setup-config.php:52 +msgid "Sorry, I need a %s file to work from. Please re-upload this file to your WordPress installation." +msgstr "Désolé, il est nécessaire de disposer d’un fichier %s à partir duquel travailler. Veuillez retéléverser ce fichier au sein de votre installation WordPress." + +#. translators: %s: wp-config.php +#: wp-admin/maint/repair.php:35 +msgid "To allow use of this page to automatically repair database problems, please add the following line to your %s file. Once this line is added to your config, reload this page." +msgstr "Pour autoriser cette page à réparer automatiquement les problèmes de base de données, veuillez ajouter la ligne suivante dans votre fichier %s. Une fois cette ligne ajoutée à votre configuration, rechargez cette page." + +#: wp-admin/includes/class-wp-comments-list-table.php:202 +msgid "No comments awaiting moderation." +msgstr "Aucun commentaire en attente de modération." + +#: wp-admin/includes/plugin-install.php:570 +msgctxt "Plugin installer section title" +msgid "Screenshots" +msgstr "Captures d’écrans" + +#: wp-admin/includes/plugin-install.php:567 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "Description" + +#: wp-admin/includes/plugin-install.php:568 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "Installation" + +#: wp-admin/includes/plugin-install.php:569 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "FAQ" + +#: wp-admin/includes/plugin-install.php:573 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "Autres notes" + +#: wp-admin/includes/plugin-install.php:571 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "Liste des modifications" + +#: wp-admin/includes/plugin-install.php:700 +msgid "Plugin Homepage »" +msgstr "Site Web de l’extension »" + +#. translators: 1: Table name, 2: Error message. +#: wp-admin/maint/repair.php:114 +msgid "Failed to repair the %1$s table. Error: %2$s" +msgstr "Impossible de réparer la table %1$s. Erreur : %2$s" + +#: wp-admin/export.php:50 +msgid "You can export a file of your site’s content in order to import it into another installation or platform. The export file will be an XML file format called WXR. Posts, pages, comments, custom fields, categories, and tags can be included. You can choose for the WXR file to include only certain posts or pages by setting the dropdown filters to limit the export by category, author, date range by month, or publishing status." +msgstr "Vous pouvez exporter le contenu de votre site dans un fichier, afin de l’importer dans une autre installation autonome ou une plate-forme. Le fichier d’export utilise un format de type XML, baptisé WXR. Il peut contenir vos articles, pages, commentaires, champs personnalisés, catégories et étiquettes. Vous pouvez utiliser des filtres pour que le fichier WXR ne contienne les articles que d’une certaine plage de dates (par mois), un auteur donné, une catégorie précise, ou des états de publication." + +#: wp-admin/user-new.php:234 +msgid "New users will receive an email letting them know they’ve been added as a user for your site. This email will also contain their password. Check the box if you don’t want the user to receive a welcome email." +msgstr "Les nouveaux utilisateurs reçoivent un message les informant qu’ils ont été ajoutés aux utilisateurs de votre site. Ce message contient également leur mot de passe. Décochez la case si vous ne voulez pas que l’utilisateur reçoive ce message de bienvenue." + +#: wp-admin/import.php:25 +msgid "In previous versions of WordPress, all importers were built-in. They have been turned into plugins since most people only use them once or infrequently." +msgstr "Dans les versions précédentes de WordPress, tous les importateurs étaient directement inclus. Nous les avons convertis en extensions, car la plupart des gens ne s’en servent que très rarement, voire une seule fois." + +#: wp-admin/includes/image-edit.php:251 +msgid "There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor." +msgstr "Les modifications qui n’ont pas été enregistrées seront perdues. « OK » pour continuer, « Annuler » pour revenir à l’éditeur d’images." + +#: wp-admin/options-writing.php:34 +msgid "Post via email settings allow you to send your WordPress installation an email with the content of your post. You must set up a secret email account with POP3 access to use this, and any mail received at this address will be posted, so it’s a good idea to keep this address very secret." +msgstr "Les réglages de publication par e-mail vous permettant d’envoyer à votre installation WordPress un e-mail dont le contenu sera publié dans un article. Vous devez définir un compte de messagerie secret avec un accès POP3. Tout message reçu à cette adresse sera publié. Il vaut donc mieux garder cette adresse à l’abri des regards." + +#: wp-admin/users.php:45 +msgid "You can filter the list of users by User Role using the text links above the users list to show All, Administrator, Editor, Author, Contributor, or Subscriber. The default view is to show all users. Unused User Roles are not listed." +msgstr "Vous pouvez filtrer la liste des utilisateurs par rôle, à l’aide des liens textuels au-dessus de la liste des utilisateurs, afin d’afficher tous les utilisateurs, ou seulement les administrateurs, les éditeurs, les auteurs ou les contributeurs. Par défaut, tous les utilisateurs sont affichés. Les rôles sans utilisateurs ne sont pas listés." + +#: wp-admin/user-new.php:388 +msgid "Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." +msgstr "Saisissez l’adresse de messagerie d’un utilisateur existant sur votre réseau, afin de l’inviter sur ce site. Cette personne recevra un message lui demandant de confirmer l’invitation." + +#: wp-admin/options-discussion.php:220 +msgid "An avatar is an image that follows you from weblog to weblog appearing beside your name when you comment on avatar enabled sites. Here you can enable the display of avatars for people who comment on your site." +msgstr "Un avatar est une image qui vous suit de site en site, apparaissant à côté de votre nom quand vous laissez un commentaire sur un site capable de le reconnaître. Vous pouvez ici activer l’affichage des avatars des gens qui laissent un commentaire sur votre site." + +#: wp-admin/user-new.php:392 +msgid "Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." +msgstr "Pour inviter un utilisateur de ce réseau sur ce site, saisissez son adresse de messagerie ou son identifiant. Cette personne recevra alors un message lui proposant de confirmer son ajout." + +#: wp-admin/maint/repair.php:168 +msgid "WordPress can also attempt to optimize the database. This improves performance in some situations. Repairing and optimizing the database can take a long time and the database will be locked while optimizing." +msgstr "WordPress peut également tenter d’optimiser la base de données. Cela peut améliorer ses performances dans certains cas. La réparation et l’optimisation peuvent prendre longtemps, et la base de données sera verrouillée durant l’optimisation." + +#: wp-admin/maint/repair.php:164 +msgid "WordPress can automatically look for some common database problems and repair them. Repairing can take a while, so please be patient." +msgstr "WordPress peut automatiquement rechercher les problèmes courants de base de données et les réparer. La réparation peut prendre un certain temps, veuillez être patient." + +#: wp-admin/maint/repair.php:155 +msgid "Repairs complete. Please remove the following line from wp-config.php to prevent this page from being used by unauthorized users." +msgstr "Réparations effectuées. Veuillez retirer la ligne suivante de votre fichier wp-config.php, pour empêcher que cette page soit utilisée par des utilisateurs non autorisés." + +#. translators: %s: URL to view the autosave. +#: wp-admin/edit-form-advanced.php:251 +msgid "There is an autosave of this post that is more recent than the version below. View the autosave" +msgstr "Une sauvegarde automatique existe pour cette publication ; elle est plus récente que la version affichée ci-dessous. Afficher cette sauvegarde automatique." + +#. translators: 1: Table name, 2: Error message. +#: wp-admin/maint/repair.php:104 +msgid "The %1$s table is not okay. It is reporting the following error: %2$s. WordPress will attempt to repair this table…" +msgstr "La table %1$s est dans un mauvais état. Elle renvoie l’erreur suivante : %2$s. WordPress va tenter de la réparer…" + +#: wp-admin/includes/class-custom-image-header.php:838 +#: wp-admin/includes/class-custom-image-header.php:981 +#: wp-admin/includes/class-custom-image-header.php:1317 +msgid "Image could not be processed. Please go back and try again." +msgstr "L’image n’a pas pu être traitée. Veuillez revenir en arrière en réessayer." + +#: wp-admin/themes.php:203 +msgid "The active theme is broken. Reverting to the default theme." +msgstr "Le thème courant est endommagé. Retour au thème par défaut." + +#: wp-admin/user-edit.php:333 +msgid "Show Toolbar when viewing site" +msgstr "Afficher la barre d’outils lorsque vous visitez le site" + +#. translators: 1: WordPress version number, 2: Plural number of bugs. +#: wp-admin/about.php:300 +msgid "Version %1$s addressed %2$s bug." +msgid_plural "Version %1$s addressed %2$s bugs." +msgstr[0] "La version %1$s a corrigé %2$s bug." +msgstr[1] "La version %1$s a corrigé %2$s bugs." + +#. translators: 1: WordPress version number, 2: plural number of bugs. More +#. than one security issue. +#. translators: 1: WordPress version number, 2: Plural number of bugs. More +#. than one security issue. +#: wp-admin/about.php:58 wp-admin/about.php:83 wp-admin/about.php:312 +msgid "Version %1$s addressed some security issues and fixed %2$s bug." +msgid_plural "Version %1$s addressed some security issues and fixed %2$s bugs." +msgstr[0] "La version %1$s a corrigé quelques problèmes de sécurité et %2$s bug." +msgstr[1] "La version %1$s a corrigé quelques problèmes de sécurité et %2$s bugs." + +#. translators: %s: HelpHub URL +#. translators: %s: Documentation URL. +#: wp-admin/about.php:70 wp-admin/about.php:95 wp-admin/about.php:318 +msgid "For more information, see the release notes." +msgstr "Pour plus d’informations, consultez les notes de publication." + +#. translators: 1: WordPress version number, 2: Plural number of bugs. Singular +#. security issue. +#: wp-admin/about.php:306 +msgid "Version %1$s addressed a security issue and fixed %2$s bug." +msgid_plural "Version %1$s addressed a security issue and fixed %2$s bugs." +msgstr[0] "La version %1$s a corrigé un problème de sécurité et %2$s bug." +msgstr[1] "La version %1$s a corrigé un problème de sécurité et %2$s bugs." + +#: wp-admin/index.php:35 +msgid "Welcome to your WordPress Dashboard! This is the screen you will see when you log in to your site, and gives you access to all the site management features of WordPress. You can get help for any screen by clicking the Help tab above the screen title." +msgstr "Vous voici dans votre tableau de bord WordPress ! Cet écran s’affiche à chaque connexion à votre site. Il vous donne accès à l’ensemble des fonctionnalités de gestion de WordPress. Vous pouvez obtenir de l’aide pour n’importe quel écran en cliquant sur l’onglet « Aide » présent en haut à droite de chaque écran." + +#. translators: %s: WordPress version number. +#: wp-admin/about.php:297 +msgid "Version %s addressed some security issues." +msgstr "La version %s a corrigé quelques problèmes de sécurité." + +#: wp-admin/about.php:285 +msgid "Maintenance Release" +msgstr "Mise à jour de maintenance" + +#: wp-admin/about.php:288 +msgid "Security Release" +msgstr "Mise à jour de sécurité" + +#: wp-admin/credits.php:38 wp-admin/privacy.php:35 wp-admin/freedoms.php:41 +#: wp-admin/about.php:36 +msgid "What’s New" +msgstr "Nouveautés" + +#: wp-admin/about.php:291 +msgid "Maintenance and Security Release" +msgstr "Mise à jour de maintenance et de sécurité" + +#: wp-admin/options-permalink.php:24 +msgid "This screen allows you to choose your permalink structure. You can choose from common settings or create custom URL structures." +msgstr "Cet écran vous permet de choisir la structure de permalien par défaut. Vous pouvez choisir les réglages les plus courants, ou créer votre propre structure de liens." + +#. translators: 1: WordPress version, 2: URL to About screen. +#: wp-admin/includes/update-core.php:1423 wp-admin/update-core.php:643 +msgid "Welcome to WordPress %1$s. Learn more." +msgstr "Bienvenue dans WordPress %1$s. En savoir plus." + +#: wp-admin/about.php:272 +msgid "Return to Updates" +msgstr "Retourner aux mises à jour" + +#: wp-admin/media-new.php:50 +msgid "You can upload media files here without creating a post first. This allows you to upload files to use with posts and pages later and/or to get a web link for a particular file that you can share. There are three options for uploading files:" +msgstr "Vous pouvez ici téléverser des fichiers sans avoir besoin de créer un publication au préalable. Ceci vous permet de téléverser des fichiers qui seront utilisables par les articles et les pages ultérieurement et/ou seront utilisés via un lien internet pour partager un fichier particulier. Il y a 3 méthodes pour téléverser des fichiers :" + +#: wp-admin/plugins.php:458 +msgid "Troubleshooting" +msgstr "Diagnostic" + +#: wp-admin/edit-tags.php:298 +msgid "Adding Tags" +msgstr "Ajout d’étiquettes" + +#: wp-admin/edit-tags.php:298 +msgid "Adding Categories" +msgstr "Ajout de catégories" + +#: wp-admin/themes.php:124 +msgid "Adding Themes" +msgstr "Ajout de thèmes" + +#: wp-admin/edit.php:241 +msgid "You can customize the display of this screen’s contents in a number of ways:" +msgstr "Vous pouvez personnaliser l’affichage de cet écran de plusieurs manières :" + +#: wp-admin/users.php:41 wp-admin/edit.php:239 +msgid "Screen Content" +msgstr "Contenu de l’écran" + +#: wp-admin/plugin-install.php:98 +msgid "Adding Plugins" +msgstr "Ajout d’extensions" + +#: wp-admin/edit.php:269 +msgid "You can also edit or move multiple posts to the Trash at once. Select the posts you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply." +msgstr "Vous pouvez également modifier plusieurs articles à la fois, ou les déplacer dans la corbeille d’un coup. Sélectionnez les articles sur lesquels vous voulez lancer une action en cochant leurs cases, puis sélectionnez l’action que vous voulez lancer dans le menu « Actions groupées » et cliquez sur « Appliquer »." + +#: wp-admin/edit.php:233 +msgid "This screen provides access to all of your posts. You can customize the display of this screen to suit your workflow." +msgstr "Cet écran vous donne accès à tous vos articles. Vous pouvez personnaliser son affichage afin qu’il corresponde au mieux à vos besoins." + +#: wp-admin/update-core.php:723 +msgid "How to Update" +msgstr "Comment faire la mise à jour" + +#: wp-admin/user-new.php:259 +msgid "Authors can publish and manage their own posts, and are able to upload files." +msgstr "Les auteurs peuvent publier et gérer leurs propres articles, ils peuvent également téléverser des fichiers." + +#: wp-admin/upload.php:236 wp-admin/users.php:66 wp-admin/edit.php:253 +msgid "Available Actions" +msgstr "Actions disponibles" + +#: wp-admin/edit.php:270 +msgid "When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected posts at once. To remove a post from the grouping, just click the x next to its name in the Bulk Edit area that appears." +msgstr "Vous pouvez également modifier plusieurs articles en même temps. Cochez les cases des articles que vous voulez modifier, sélectionnez l’option « Modifier » du menu « Actions groupées », et cliquez sur « Appliquer ». Vous pourrez alors d’un coup modifier les métadonnées (catégories, auteur, etc.) pour tous les articles sélectionnés. Pour retirer un article de la sélection, cliquez simplement sur la croix à gauche de son titre dans la zone « Modifications groupées » qui apparaît." + +#. translators: %s: URL to Add Plugins screen. +#: wp-admin/import.php:228 +msgid "If the importer you need is not listed, search the plugin directory to see if an importer is available." +msgstr "Si l’importateur dont vous avec besoin n’est pas présent, recherchez le dans le dépôt d’extensions pour voir s’il s’y trouve." + +#: wp-admin/user-new.php:257 +msgid "Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content." +msgstr "Les abonnés peuvent lire les commentaires/commenter/recevoir les newsletters, etc. Mais ils ne peuvent pas créer du contenu sur le site." + +#: wp-admin/edit-comments.php:181 +msgid "Moderating Comments" +msgstr "Modération des commentaires" + +#: wp-admin/user-new.php:230 +msgid "To add a new user to your site, fill in the form on this screen and click the Add New User button at the bottom." +msgstr "Pour ajouter un nouvel utilisateur à votre site, remplissez le formulaire de cet écran et cliquez sur le bouton « Ajouter un nouvel utilisateur » en bas de l’écran." + +#: wp-admin/user-new.php:254 +msgid "User Roles" +msgstr "Rôles utilisateurs" + +#: wp-admin/user-new.php:255 +msgid "Here is a basic overview of the different user roles and the permissions associated with each one:" +msgstr "Voici un rapide survol des différents rôles assignables aux utilisateurs, et des permissions qui leurs sont associées :" + +#: wp-admin/upload.php:244 +msgid "Attaching Files" +msgstr "Joindre des fichiers" + +#: wp-admin/export.php:173 +msgid "Once you’ve saved the download file, you can use the Import function in another WordPress installation to import the content from this site." +msgstr "Une fois que le fichier téléchargé a été enregistré, vous pouvez utiliser la fonction Importer d’un autre site WordPress pour importer ce fichier dans cet autre site." + +#: wp-admin/user-new.php:241 +msgid "Remember to click the Add New User button at the bottom of this screen when you are finished." +msgstr "N’oubliez pas de cliquer sur le bouton « Ajouter un utilisateur », en bas de cet écran, quand vous aurez terminé." + +#. translators: %s: URL to Import screen. +#: wp-admin/tools.php:77 +msgid "If you want to convert your categories to tags (or vice versa), use the Categories and Tags Converter available from the Import screen." +msgstr "Si vous souhaitez convertir vos catégories en étiquettes (et vice versa), utilisez le Convertisseur de catégories-étiquettes, disponible depuis l’écran des importateurs." + +#: wp-admin/options-permalink.php:52 +msgid "Custom Structures" +msgstr "Structure personnalisée" + +#: wp-admin/options-permalink.php:219 +msgid "Common Settings" +msgstr "Réglages les plus courants" + +#: wp-admin/options-permalink.php:23 +msgid "Permalinks are the permanent URLs to your individual pages and blog posts, as well as your category and tag archives. A permalink is the web address used to link to your content. The URL to each post should be permanent, and never change — hence the name permalink." +msgstr "Les permaliens sont des adresses Web permanentes vers vos pages individuelles et vos articles, ainsi que vos archives de catégorie et d’étiquette. Ils offrent un lien plus compréhensible vers votre contenu. Les adresses de chaque article devraient être permanentes et ne jamais changer, d’où le nom de permalien." + +#: wp-admin/options-writing.php:23 +msgid "You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within the dashboard, while the rest control external publishing methods. For more information on any of these methods, use the documentation links." +msgstr "Vous disposez de plusieurs méthodes pour envoyer du contenu. Cet écran vous présente les réglages de chacune. La première section gère l’éditeur de l’administration de WordPress, tandis que les autres gèrent les méthodes externes. Pour obtenir plus d’informations sur toutes ces méthodes, suivez les liens vers la documentation." + +#: wp-admin/options-media.php:22 +msgid "Uploading Files allows you to choose the folder and path for storing your uploaded files." +msgstr "« Envoi de fichiers » vous permet de choisir le dossier et le chemin de stockage de vos fichiers téléversés." + +#: wp-admin/themes.php:112 +msgid "Installing themes on Multisite can only be done from the Network Admin section." +msgstr "En mode Multisite, vous pouvez installer des thèmes depuis la section Admin du Réseau." + +#: wp-admin/options-general.php:31 +msgid "If you want site visitors to be able to register themselves, as opposed to by the site administrator, check the membership box. A default user role can be set for all new users, whether self-registered or registered by the site admin." +msgstr "Si vous voulez que les visiteurs du site puissent s’inscrire eux-mêmes plutôt que de devoir être inscrits par l’administrateur du site, cochez la case « Inscription ». Un rôle d’utilisateur par défaut peut être assigné pour tout nouvel utilisateur, qu’il se soit inscrit lui-même ou par le biais de l’administrateur." + +#: wp-admin/options-writing.php:45 +msgid "If desired, WordPress will automatically alert various services of your new posts." +msgstr "Si vous le souhaitez, WordPress peut automatiquement informer différents services en ligne de vos nouvelles publications." + +#: wp-admin/options-writing.php:33 +msgid "Post Via Email" +msgstr "Envoi d’article par e-mail" + +#: wp-admin/options-discussion.php:24 +msgid "This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they won’t all fit here! :) Use the documentation links to get information on what each discussion setting does." +msgstr "Cet écran offre plusieurs options pour contrôler la gestion et l’affichage des commentaires et liens sur vos articles/pages. D’ailleurs, il y en a tellement qu’elles ne tiennent pas toutes ici ! :) Utiliser le lien vers la documentation pour obtenir des informations sur ce que fait chaque réglage des commentaires." + +#: wp-admin/user-edit.php:50 +msgid "You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things. You can hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens." +msgstr "Vous pouvez modifier votre mot de passe, activer les raccourcis clavier, modifier le jeu de couleurs des écrans de l’administration de votre WordPress, et désactiver l’éditeur visuel (WYSIWYG), entre autres choses. Vous pouvez également masquer la barre d’outils (anciennement « barre d’administration ») sur l’interface publique de votre site, mais elle ne peut pas être désactivée sur les écrans d’administration." + +#: wp-admin/widgets.php:110 +msgid "This sidebar is no longer available and does not show anywhere on your site. Remove each of the widgets below to fully remove this inactive sidebar." +msgstr "Cette colonne latérale n’est plus disponible, et ne s’affiche nulle part sur le site. Vous pouvez en retirer les widgets ci-dessous afin de la supprimer totalement." + +#: wp-admin/widgets.php:107 +msgid "Inactive Sidebar (not used)" +msgstr "Colonne latérale inactive (inutilisée)" + +#: wp-admin/widgets.php:74 +msgid "Missing Widgets" +msgstr "Widgets manquants" + +#: wp-admin/edit-tags.php:256 +msgid "You can assign keywords to your posts using tags. Unlike categories, tags have no hierarchy, meaning there’s no relationship from one tag to another." +msgstr "Vous pouvez assigner des étiquettes à vos articles via la section dédiée. Au contraire des catégories, les étiquettes n’ont aucune hiérarchie, ce qui signifie qu’elles ne peuvent pas être liées entre elles." + +#: wp-admin/widgets.php:64 +msgid "Removing and Reusing" +msgstr "Retirer et réutiliser" + +#: wp-admin/edit-tags.php:254 +msgid "You can create groups of links by using Link Categories. Link Category names must be unique and Link Categories are separate from the categories you use for posts." +msgstr "Vous pouvez créer des groupes de liens en utilisant les catégories de liens. Le nom d’une catégorie de liens doit être unique, et les catégories de liens ne sont pas les mêmes que les catégories de vos articles." + +#: wp-admin/media-new.php:53 +msgid "Clicking Select Files opens a navigation window showing you files in your operating system. Selecting Open after clicking on the file you want activates a progress bar on the uploader screen." +msgstr "Un clic sur Sélectionner les fichiers ouvre la fenêtre de navigation, vous donnant accès aux fichiers de votre machine. Après avoir cliqué sur un fichier, cliquez sur Ouvrir pour l’affichage de la barre de téléchargement." + +#: wp-admin/media-new.php:52 +msgid "Drag and drop your files into the area below. Multiple files are allowed." +msgstr "Glissez/déposez vos fichiers dans la zone ci-dessous. Vous pouvez en déposer plusieurs à la fois." + +#: wp-admin/edit-comments.php:188 +msgid "Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more." +msgstr "De nombreux utilisateurs utilisent les raccourcis clavier pour modérer leurs commentaires plus rapidement. Suivez le lien sur le côté pour en savoir plus." + +#: wp-admin/edit-form-advanced.php:317 wp-admin/edit.php:286 +msgid "Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the “Parent” of the other, creating a group of pages." +msgstr "Les pages sont comme des articles, en cela qu’elles ont un titre, un contenu et des métadonnées associées ; mais elles diffèrent en cela qu’elles ne font pas partie du flux chronologique du blog - un peu comme des articles permanents. Les pages ne sont pas catégorisées et ne reçoivent pas d’étiquettes, mais peuvent disposer d’une hiérarchie. En effet, vous pouvez imbriquer des pages sous d’autres pages, faisant de ces dernières les « parentes » des premières, créant ainsi un groupement de pages." + +#: wp-admin/upload.php:228 +msgid "All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customize the display of this screen." +msgstr "Tous les fichiers que vous avez téléversés sont listés dans la bibliothèque de médias, les plus récents en premier. Vous pouvez utiliser l’onglet « Options de l’écran » pour personnaliser l’affichage de cet écran." + +#: wp-admin/upload.php:246 +msgid "If a media file has not been attached to any content, you will see that in the Uploaded To column, and can click on Attach to launch a small popup that will allow you to search for existing content and attach the file." +msgstr "Le fait qu’un fichier média n’est attaché à aucun article vous sera indiqué dans la colonne « Attaché à », et vous pourrez cliquer sur le lien « Attacher » pour afficher une petite fenêtre vous permettant de rechercher du contenu auquel attacher le fichier." + +#: wp-admin/edit.php:295 +msgid "You can also perform the same types of actions, including narrowing the list by using the filters, acting on a page using the action links that appear when you hover over a row, or using the Bulk Actions menu to edit the metadata for multiple pages at once." +msgstr "Vous pouvez également réaliser les mêmes sortes d’actions, comme réduire la liste par le biais des filtres, en passant par les liens qui apparaissent quand la souris passe au-dessus d’une ligne, ou en utilisant le menu « Actions groupées » pour modifier les métadonnées de plusieurs pages d’un seul coup." + +#: wp-admin/edit.php:294 +msgid "Managing pages is very similar to managing posts, and the screens can be customized in the same way." +msgstr "La gestion des pages est très proche de celle des articles, et les écrans peuvent être personnalisés de la même manière." + +#: wp-admin/upload.php:238 +msgid "Hovering over a row reveals action links: Edit, Delete Permanently, and View. Clicking Edit or on the media file’s name displays a simple screen to edit that individual file’s metadata. Clicking Delete Permanently will delete the file from the media library (as well as from any posts to which it is currently attached). View will take you to the display page for that file." +msgstr "Le survol par la souris des lignes du tableau révèle des liens : « Modifier », « Supprimer définitivement » et « Afficher ». En cliquant sur « Modifier » ou sur le nom d’un fichier média, vous obtiendrez un écran où vous pourrez modifier les métadonnées du fichier. En cliquant sur « Supprimer définitivement », vous supprimerez le fichier de la bibliothèque (ainsi que de tous les articles auxquels il était lié). « Afficher » vous enverra sur la page d’affichage de ce fichier." + +#: wp-admin/link-manager.php:70 +msgid "Deleting Links" +msgstr "Suppression de liens" + +#: wp-admin/index.php:50 +msgid "Links in the Toolbar at the top of the screen connect your dashboard and the front end of your site, and provide access to your profile and helpful WordPress information." +msgstr "Les liens contenus dans la barre d’outils placée en haut de l’écran relient votre tableau de bord à la partie publique de votre site, et fournissent un accès rapide à votre profil et de précieuses informations sur WordPress." + +#: wp-admin/edit-comments.php:184 +msgid "In the Author column, in addition to the author’s name, email address, and blog URL, the commenter’s IP address is shown. Clicking on this link will show you all the comments made from this IP address." +msgstr "Dans la colonne Auteur, en plus de trouver le nom de l’auteur, son adresse de messagerie et celle de son site, vous trouverez son adresse IP. En cliquant dessus, vous obtiendrez une liste de tous les commentaires faits depuis cette adresse IP." + +#: wp-admin/edit-comments.php:175 +msgid "You can manage comments made on your site similar to the way you manage posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the Bulk Actions." +msgstr "Vous pouvez gérer les commentaires sur votre site de la même manière que vous gérez les articles et autres contenus. Cet écran est personnalisable de la même manière que les autres écrans de gestion, et vous pouvez agir sur les commentaires par le biais des liens qui apparaissent au survol de la souris, ou via le menu « Actions groupées »." + +#: wp-admin/link-manager.php:63 +msgid "Links may be separated into Link Categories; these are different than the categories used on your posts." +msgstr "Les liens peuvent être rangés dans des catégories de liens ; ce ne sont pas les mêmes catégories que pour vos articles." + +#. translators: 1: URL to About screen, 2: WordPress version. +#: wp-admin/update-core.php:283 +msgid "Learn more about WordPress %2$s." +msgstr "À propos de WordPress %2$s." + +#: wp-admin/users.php:46 +msgid "You can view all posts made by a user by clicking on the number under the Posts column." +msgstr "Vous pouvez afficher tous les articles faits par un même utilisateur en cliquant sur le nombre sous la colonne « Articles »." + +#: wp-admin/users.php:53 +msgid "Edit takes you to the editable profile screen for that user. You can also reach that screen by clicking on the username." +msgstr "« Modifier » vous envoie sur l’écran de modification de cet utilisateur. Vous pouvez également vous rendre sur cet écran en cliquant sur le nom de l’utilisateur." + +#: wp-admin/edit.php:257 +msgid "Edit takes you to the editing screen for that post. You can also reach that screen by clicking on the post title." +msgstr "Modifier vous envoie sur l’écran de modification de cette publication. Vous pouvez également vous rendre sur cet écran en cliquant sur le titre de la publication." + +#: wp-admin/edit.php:258 +msgid "Quick Edit provides inline access to the metadata of your post, allowing you to update post details without leaving this screen." +msgstr "Modification Rapide vous donne un accès rapide aux métadonnées de votre article, vous permettant de mettre à jour certains détails sans devoir quitter la liste." + +#: wp-admin/edit.php:259 +msgid "Trash removes your post from this list and places it in the Trash, from which you can permanently delete it." +msgstr "Mettre à la corbeille retire l’article de la liste et le déplace dans la corbeille, d’où vous pourrez le supprimer définitivement." + +#: wp-admin/users.php:51 +msgid "Hovering over a row in the users list will display action links that allow you to manage users. You can perform the following actions:" +msgstr "Passer la souris au-dessus d’une ligne de la liste des utilisateurs, fera s’afficher des liens vous permettant de gérer l’utilisateur. Vous pouvez lancer les actions suivantes :" + +#: wp-admin/edit.php:260 +msgid "Preview will show you what your draft post will look like if you publish it. View will take you to your live site to view the post. Which link is available depends on your post’s status." +msgstr "Prévisualiser vous donnera une idée de ce à quoi votre brouillon ressemble si vous le publiez tel quel. Afficher vous enverra sur votre site, à l’adresse de la publication. L’action disponible dépend de l’état de votre publication." + +#: wp-admin/users.php:44 +msgid "You can hide/display columns based on your needs and decide how many users to list per screen using the Screen Options tab." +msgstr "Vous pouvez masquer/afficher les colonnes en fonction de vos besoins, et décider du nombre d’articles à afficher par écran à l’aide de l’onglet « Options de l’écran »." + +#: wp-admin/edit.php:292 +msgid "Managing Pages" +msgstr "Gestion de pages" + +#: wp-admin/user-new.php:233 +msgid "Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user’s name to Edit the user profile under Network Admin > All Users." +msgstr "Parce qu’il s’agit d’une installation multisite, vous pouvez ajouter des comptes qui existent déjà sur le Réseau, en indiquant un nom d’utilisateur ou une adresse de messagerie, et en assignant un rôle. Pour avoir plus d’options, telle que le choix du mot de passe, vous devez être Administrateur du Réseau, et utiliser les liens qui apparaissent au survol sous le nom de l’utilisateur pour modifier son profil utilisateur, depuis l’écran « Tous les utilisateurs »." + +#. translators: %s: The current WordPress version number. +#: wp-admin/about.php:114 +msgid "Welcome to WordPress %s." +msgstr "Bienvenue sur WordPress %s." + +#: wp-admin/about.php:272 +msgid "Return to Dashboard → Updates" +msgstr "Retourner aux mises à jour" + +#: wp-admin/about.php:275 +msgid "Go to Dashboard → Home" +msgstr "Aller sur l’accueil" + +#: wp-admin/credits.php:65 +msgid "WordPress is created by a worldwide team of passionate individuals." +msgstr "WordPress est créé par une équipe de personnes passionnées, répartie sur toute la planète." + +#: wp-admin/includes/dashboard.php:1879 wp-admin/includes/dashboard.php:1881 +msgid "Customize Your Site" +msgstr "Personnalisez votre site" + +#: wp-admin/user-edit.php:196 +msgid "Profile updated." +msgstr "Profil mis à jour." + +#. translators: 1: Site title, 2: Site URL, 3: User role, 4: Activation URL. +#: wp-admin/user-new.php:116 +msgid "" +"Hi,\n" +"\n" +"You've been invited to join '%1$s' at\n" +"%2$s with the role of %3$s.\n" +"\n" +"Please click the following link to confirm the invite:\n" +"%4$s" +msgstr "" +"Bonjour,\n" +"\n" +"Vous avez été invité·e à rejoindre « %1$s » sur\n" +"%2$s en tant que %3$s. \n" +"Veuillez cliquer sur le lien suivant pour confirmer l’invitation :\n" +"%4$s" + +#: wp-admin/credits.php:149 +msgid "Core Developer" +msgstr "Développeur cœur" + +#: wp-admin/includes/class-plugin-upgrader.php:375 +msgid "No valid plugins were found." +msgstr "Aucune extension valide trouvée." + +#: wp-admin/includes/class-plugin-upgrader.php:70 +msgid "The plugin contains no files." +msgstr "Cette extension ne contient aucun fichier." + +#: wp-admin/includes/class-wp-upgrader.php:164 +msgid "The package could not be installed." +msgstr "L’archive n’a pas pu être installée." + +#: wp-admin/includes/media.php:1232 +msgid "Attachment Post URL" +msgstr "Adresse de la page du fichier joint" + +#: wp-admin/menu.php:80 +msgctxt "admin menu" +msgid "All Links" +msgstr "Tous les liens" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/plugin-install.php:305 +msgid "%s plugin" +msgstr "%s extension" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/plugin-install.php:307 +msgid "%s plugins" +msgstr "%s extensions" + +#. translators: 1: Table name. 2: Error message. +#: wp-admin/maint/repair.php:136 +msgid "Failed to optimize the %1$s table. Error: %2$s" +msgstr "Impossible d’optimiser la table %1$s. Erreur : %2$s" + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:133 +msgid "Successfully optimized the %s table." +msgstr "La table %s a bien été optimisée." + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:101 +msgid "The %s table is okay." +msgstr "La table %s est correcte." + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:126 +msgid "The %s table is already optimized." +msgstr "La table %s a déjà été optimisée." + +#. translators: %s: Table name. +#: wp-admin/maint/repair.php:111 +msgid "Successfully repaired the %s table." +msgstr "La table %s a bien été réparée." + +#. translators: %s: Plugin version. +#: wp-admin/update-core.php:394 +msgid "View version %s details." +msgstr "Afficher les détails de la version %s." + +#: wp-admin/includes/import.php:220 +msgid "Tumblr" +msgstr "Tumblr" + +#. translators: 1: Browser update URL, 2: Browser name, 3: Browse Happy URL. +#: wp-admin/includes/dashboard.php:1620 +msgid "Update %2$s or learn how to browse happy" +msgstr "Mettez %2$s à jour, ou apprenez à naviguer sereinement" + +#. translators: 1: Link start tag, 2: Link end tag, 3: Width, 4: Height. +#: wp-admin/includes/media.php:3044 +msgid "Scale images to match the large size selected in %1$simage options%2$s (%3$d × %4$d)." +msgstr "Redimensionner les images pour correspondre à la taille large définie dans les %1$sréglages des médias%2$s (%3$d × %4$d)." + +#: wp-admin/includes/media.php:2375 +msgid "Insert media from another website" +msgstr "Insérer un média depuis un autre site" + +#: wp-admin/includes/media.php:2903 +msgid "Audio, Video, or Other File" +msgstr "Audio, vidéo ou un autre format" + +#: wp-admin/includes/file.php:2090 +msgid "Error: There was an error connecting to the server, Please verify the settings are correct." +msgstr "Erreur : Une erreur s’est produite lors de la connexion au serveur, vérifiez que vos réglages sont corrects." + +#: wp-admin/includes/ajax-actions.php:1305 +#: wp-admin/includes/ajax-actions.php:1407 +msgid "Error: Please type a comment." +msgstr "Erreur : veuillez saisir un commentaire." + +#: wp-admin/includes/ajax-actions.php:1275 +msgid "Error: You are replying to a comment on a draft post." +msgstr "Erreur : vous être en train de laisser un commentaire sur un brouillon." + +#: wp-admin/options-reading.php:24 wp-admin/edit-tags.php:268 +#: wp-admin/link-manager.php:56 wp-admin/options-writing.php:22 +#: wp-admin/includes/class-custom-background.php:88 +#: wp-admin/includes/ms.php:1129 wp-admin/includes/class-wp-screen.php:853 +#: wp-admin/includes/class-custom-image-header.php:97 wp-admin/my-sites.php:43 +#: wp-admin/options-general.php:41 wp-admin/comment.php:47 +#: wp-admin/theme-editor.php:27 wp-admin/plugin-editor.php:124 +#: wp-admin/nav-menus.php:555 wp-admin/nav-menus.php:596 +#: wp-admin/update-core.php:708 wp-admin/options-permalink.php:22 +#: wp-admin/user-new.php:246 wp-admin/index.php:42 wp-admin/plugins.php:444 +#: wp-admin/themes.php:103 wp-admin/edit-comments.php:173 wp-admin/media.php:85 +#: wp-admin/revision.php:139 wp-admin/upload.php:54 wp-admin/upload.php:226 +#: wp-admin/edit-form-advanced.php:338 wp-admin/import.php:23 +#: wp-admin/widgets.php:55 wp-admin/options-media.php:30 +#: wp-admin/edit-link-form.php:66 wp-admin/user-edit.php:60 +#: wp-admin/users.php:32 wp-admin/media-new.php:48 +#: wp-admin/theme-install.php:111 wp-admin/options-discussion.php:23 +#: wp-admin/edit.php:231 wp-admin/edit.php:284 wp-admin/plugin-install.php:84 +#: wp-admin/export.php:49 wp-admin/network/user-new.php:20 +#: wp-admin/network/index.php:33 wp-admin/network/themes.php:236 +#: wp-admin/network/upgrade.php:21 wp-admin/network/users.php:215 +#: wp-admin/network/site-new.php:23 wp-admin/network/settings.php:48 +#: wp-admin/network/sites.php:28 +msgid "Overview" +msgstr "Vue d’ensemble" + +#: wp-admin/index.php:60 +msgid "You can use the following controls to arrange your Dashboard screen to suit your workflow. This is true on most other administration screens as well." +msgstr "Vous pouvez utiliser les contrôles suivants pour organiser l’écran du tableau de bord pour afin de se plier à votre manière de l’utiliser. La plupart des écrans de la console d’administration peuvent également être organisés de cette manière." + +#: wp-admin/index.php:62 +msgid "Drag and Drop — To rearrange the boxes, drag and drop by clicking on the title bar of the selected box and releasing when you see a gray dotted-line rectangle appear in the location you want to place the box." +msgstr "Glisser/déposer - Pour réarranger les sections, glissez/déposez-les en cliquant sur la barre de titre de la section sélectionnée, et relâchez-la lorsque vous apercevez un rectangle avec une bordure grise à l’emplacement où vous souhaitez placer la section." + +#: wp-admin/index.php:55 +msgid "Navigation" +msgstr "Navigation" + +#: wp-admin/index.php:49 +msgid "The left-hand navigation menu provides links to all of the WordPress administration screens, with submenu items displayed on hover. You can minimize this menu to a narrow icon strip by clicking on the Collapse Menu arrow at the bottom." +msgstr "La navigation située à gauche de l’écran fournit tous les liens pour accéder à la console d’administration de WordPress, avec les sous-menus qui s’affichant au survol. Vous pouvez réduire ce menu à ses seules icônes en cliquant sur la flèche de repliement située en bas du menu." + +#: wp-admin/ms-delete-site.php:38 wp-admin/menu.php:285 +msgid "Delete Site" +msgstr "Supprimer le site" + +#. translators: %s: Number of pending plugin updates. +#. translators: %s: Number of available plugin updates. +#: wp-admin/menu.php:239 wp-admin/network/menu.php:88 +msgid "Plugins %s" +msgstr "Extensions %s" + +#. translators: %s: Plugin name. +#: wp-admin/includes/theme.php:795 +#: wp-admin/includes/class-wp-theme-install-list-table.php:483 +#: wp-admin/includes/deprecated.php:1384 wp-admin/theme-install.php:300 +#: wp-admin/theme-install.php:320 wp-admin/includes/network.php:371 +msgid "Install" +msgstr "Installer" + +#: wp-admin/menu.php:259 wp-admin/network/menu.php:56 +msgid "All Users" +msgstr "Tous les utilisateurs" + +#: wp-admin/includes/class-wp-links-list-table.php:88 +#: wp-admin/includes/class-wp-links-list-table.php:334 +#: wp-admin/includes/class-wp-themes-list-table.php:233 +#: wp-admin/includes/theme.php:790 +#: wp-admin/includes/class-wp-plugins-list-table.php:531 +#: wp-admin/includes/class-wp-plugins-list-table.php:699 +#: wp-admin/includes/class-wp-plugins-list-table.php:748 +#: wp-admin/includes/meta-boxes.php:1064 +#: wp-admin/includes/class-wp-terms-list-table.php:159 +#: wp-admin/includes/class-wp-terms-list-table.php:493 +#: wp-admin/includes/class-wp-users-list-table.php:273 +#: wp-admin/includes/class-wp-users-list-table.php:455 +#: wp-admin/includes/media.php:1705 wp-admin/includes/widgets.php:297 +#: wp-admin/includes/template.php:645 wp-admin/themes.php:443 +#: wp-admin/themes.php:606 wp-admin/widgets.php:355 +#: wp-admin/edit-tag-form.php:278 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:291 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:715 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:388 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:524 +#: wp-admin/includes/class-wp-ms-users-list-table.php:115 +#: wp-admin/includes/class-wp-ms-users-list-table.php:509 +msgid "Delete" +msgstr "Supprimer" + +#: wp-admin/user-edit.php:227 wp-admin/users.php:566 wp-admin/menu.php:261 +#: wp-admin/menu.php:263 wp-admin/network/users.php:274 +#: wp-admin/network/menu.php:57 +msgctxt "user" +msgid "Add New" +msgstr "Ajouter" + +#: wp-admin/options-reading.php:50 wp-admin/edit-tags.php:304 +#: wp-admin/link-manager.php:77 wp-admin/options-writing.php:51 +#: wp-admin/includes/class-custom-background.php:98 +#: wp-admin/includes/ms.php:1151 +#: wp-admin/includes/class-custom-image-header.php:133 wp-admin/my-sites.php:50 +#: wp-admin/options-general.php:47 wp-admin/comment.php:55 +#: wp-admin/theme-editor.php:50 wp-admin/plugin-editor.php:141 +#: wp-admin/nav-menus.php:603 wp-admin/update-core.php:729 +#: wp-admin/options-permalink.php:59 wp-admin/user-new.php:267 +#: wp-admin/index.php:106 wp-admin/plugins.php:470 wp-admin/themes.php:147 +#: wp-admin/edit-comments.php:193 wp-admin/media.php:95 +#: wp-admin/revision.php:144 wp-admin/upload.php:74 wp-admin/upload.php:251 +#: wp-admin/edit-form-advanced.php:312 wp-admin/edit-form-advanced.php:329 +#: wp-admin/edit-form-advanced.php:348 wp-admin/tools.php:54 +#: wp-admin/import.php:30 wp-admin/widgets.php:82 wp-admin/options-media.php:36 +#: wp-admin/edit-link-form.php:75 wp-admin/user-edit.php:66 +#: wp-admin/users.php:73 wp-admin/media-new.php:59 +#: wp-admin/theme-install.php:129 wp-admin/options-discussion.php:30 +#: wp-admin/edit.php:275 wp-admin/edit.php:300 wp-admin/plugin-install.php:108 +#: wp-admin/export.php:56 wp-admin/network.php:65 wp-admin/network.php:78 +#: wp-admin/network/user-new.php:28 wp-admin/network/index.php:54 +#: wp-admin/network/themes.php:245 wp-admin/network/upgrade.php:30 +#: wp-admin/network/users.php:227 wp-admin/network/site-new.php:31 +#: wp-admin/network/settings.php:62 wp-admin/network/sites.php:44 +msgid "For more information:" +msgstr "Plus d’informations :" + +#: wp-admin/includes/class-wp-users-list-table.php:359 +#: wp-admin/user-new.php:416 wp-admin/user-new.php:552 +#: wp-admin/user-edit.php:410 wp-admin/network/site-users.php:309 +#: wp-admin/network/site-users.php:347 +msgid "Role" +msgstr "Rôle" + +#: wp-admin/user-new.php:346 wp-admin/user-new.php:385 +#: wp-admin/user-new.php:446 wp-admin/network/site-users.php:300 +msgid "Add Existing User" +msgstr "Ajouter un utilisateur existant" + +#: wp-admin/includes/dashboard.php:463 wp-admin/includes/dashboard.php:465 +#: wp-admin/users.php:584 wp-admin/network/site-users.php:276 +#: wp-admin/network/users.php:289 +msgid "Search Users" +msgstr "Rechercher des utilisateurs" + +#: wp-admin/users.php:526 wp-admin/network/site-users.php:257 +msgid "User removed from this site." +msgstr "Utilisateur supprimé de ce site." + +#: wp-admin/users.php:515 wp-admin/network/site-users.php:251 +msgid "Changed roles." +msgstr "Rôles modifiés." + +#: wp-admin/my-sites.php:58 wp-admin/options-head.php:15 +#: wp-admin/options.php:309 wp-admin/network/settings.php:141 +#: wp-admin/network/sites.php:346 +msgid "Settings saved." +msgstr "Réglages enregistrés." + +#: wp-admin/users.php:359 wp-admin/users.php:391 +msgid "You can’t remove users." +msgstr "Vous ne pouvez pas supprimer ces utilisateurs." + +#: wp-admin/includes/class-wp-users-list-table.php:438 +#: wp-admin/user-edit.php:433 +#: wp-admin/includes/class-wp-ms-users-list-table.php:285 +msgid "Super Admin" +msgstr "Super-admin" + +#: wp-admin/includes/class-wp-terms-list-table.php:502 +#: wp-admin/includes/class-wp-users-list-table.php:469 +#: wp-admin/includes/class-wp-media-list-table.php:703 +#: wp-admin/includes/class-wp-media-list-table.php:761 +#: wp-admin/includes/class-wp-posts-list-table.php:1402 +#: wp-admin/includes/dashboard.php:742 +#: wp-admin/includes/class-wp-ms-users-list-table.php:412 +msgid "View" +msgstr "Afficher" + +#: wp-admin/user-new.php:335 wp-admin/network/user-new.php:89 +#: wp-admin/network/site-users.php:239 wp-admin/network/users.php:260 +msgid "User added." +msgstr "Utilisateur ajouté." + +#. translators: %s: Plugin author name. +#. translators: %s: Theme author name. +#. translators: %s: Theme author. +#. translators: %s: Theme author link. +#. translators: %s: Plugin author. +#: wp-admin/includes/class-wp-debug-data.php:815 +#: wp-admin/includes/class-wp-debug-data.php:853 +#: wp-admin/includes/class-wp-debug-data.php:1036 +#: wp-admin/includes/class-wp-themes-list-table.php:263 +#: wp-admin/includes/theme.php:736 +#: wp-admin/includes/class-wp-plugins-list-table.php:904 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:507 +#: wp-admin/includes/class-wp-theme-install-list-table.php:360 +#: wp-admin/includes/class-wp-theme-install-list-table.php:492 +#: wp-admin/themes.php:338 wp-admin/themes.php:502 wp-admin/themes.php:562 +#: wp-admin/theme-install.php:274 wp-admin/theme-install.php:329 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:610 +msgid "By %s" +msgstr "Par %s" + +#. translators: %s: Plugin version number. +#. translators: %s: Theme version number. +#. translators: %s: WordPress version. +#. translators: %s: Plugin version. +#. translators: %s: Theme version. +#: wp-admin/includes/class-wp-debug-data.php:821 +#: wp-admin/includes/class-wp-debug-data.php:859 +#: wp-admin/includes/class-wp-debug-data.php:1042 +#: wp-admin/includes/class-wp-plugins-list-table.php:896 +#: wp-admin/includes/update.php:231 wp-admin/includes/update.php:271 +#: wp-admin/includes/ajax-actions.php:4416 +#: wp-admin/includes/ajax-actions.php:4459 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:606 +msgid "Version %s" +msgstr "Version %s" + +#: wp-admin/includes/class-wp-plugins-list-table.php:523 +#: wp-admin/includes/class-wp-plugins-list-table.php:719 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:699 +msgid "Deactivate" +msgstr "Désactiver" + +#: wp-admin/includes/ms.php:981 wp-admin/users.php:345 +msgid "Confirm Deletion" +msgstr "Confirmer cette action" + +#: wp-admin/menu.php:241 wp-admin/network/menu.php:105 +msgid "Installed Plugins" +msgstr "Extensions installées" + +#: wp-admin/user-new.php:222 wp-admin/user-new.php:344 +#: wp-admin/user-new.php:453 wp-admin/user-new.php:579 wp-admin/menu.php:271 +#: wp-admin/menu.php:273 wp-admin/network/user-new.php:99 +#: wp-admin/network/user-new.php:105 wp-admin/network/site-users.php:334 +#: wp-admin/network/site-users.php:361 +msgid "Add New User" +msgstr "Ajouter un utilisateur" + +#: wp-admin/comment.php:158 wp-admin/theme-editor.php:307 +#: wp-admin/plugins.php:323 wp-admin/plugins.php:329 +#: wp-admin/includes/network.php:440 wp-admin/includes/network.php:448 +#: wp-admin/includes/network.php:456 wp-admin/network/themes.php:129 +#: wp-admin/network/themes.php:133 +msgid "Caution:" +msgstr "Attention :" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:488 +msgid "Update Available (%s)" +msgid_plural "Update Available (%s)" +msgstr[0] "À mettre à jour (%s)" +msgstr[1] "À mettre à jour (%s)" + +#. translators: %s: Number of pending updates. +#. translators: %s: Number of available updates. +#: wp-admin/menu.php:48 wp-admin/network/menu.php:30 +msgid "Updates %s" +msgstr "Mises à jour %s" + +#: wp-admin/edit-form-advanced.php:301 +msgid "Title and Post Editor" +msgstr "Titre et éditeur de publications" + +#: wp-admin/edit-form-advanced.php:285 +msgid "Customizing This Display" +msgstr "Personnaliser cet écran" + +#: wp-admin/edit-form-advanced.php:323 +msgid "About Pages" +msgstr "À propos des pages" + +#: wp-admin/options-reading.php:185 wp-admin/install.php:194 +msgid "Note: Neither of these options blocks access to your site — it is up to search engines to honor your request." +msgstr "Note : Aucune de ses options ne bloque l’accès à votre site — c’est au moteur de recherche de respecter votre demande." + +#: wp-admin/options-permalink.php:215 wp-admin/options-permalink.php:235 +msgctxt "sample permalink base" +msgid "archives" +msgstr "archives" + +#: wp-admin/options-permalink.php:227 wp-admin/options-permalink.php:231 +#: wp-admin/options-permalink.php:239 +msgctxt "sample permalink structure" +msgid "sample-post" +msgstr "exemple-article" + +#: wp-admin/options-permalink.php:238 +msgid "Post name" +msgstr "Titre de la publication" + +#. translators: %s: URL to Import screen on the main site. +#: wp-admin/import.php:165 +msgid "This importer is not installed. Please install importers from the main site." +msgstr "Cet importateur n’est pas installé. Veuillez installer les importateurs depuis le site principal." + +#: wp-admin/includes/class-wp-debug-data.php:67 +#: wp-admin/options-general.php:166 wp-admin/network/site-new.php:256 +msgid "Site Language" +msgstr "Langue du site" + +#: wp-admin/options-discussion.php:50 +msgid "Attempt to notify any blogs linked to from the post" +msgstr "Tenter de notifier les sites liés depuis la publication" + +#. translators: 1: Site title, 2: Site URL, 3: User role. +#: wp-admin/includes/user.php:577 +msgid "" +"Hi,\n" +"You've been invited to join '%1$s' at\n" +"%2$s with the role of %3$s.\n" +"If you do not want to join this site please ignore\n" +"this email. This invitation will expire in a few days.\n" +"\n" +"Please click the following link to activate your user account:\n" +"%%s" +msgstr "" +"Bonjour,\n" +"Vous avez été invité·e à rejoindre « %1$s » sur\n" +"%2$s en tant que %3$s. \n" +"Si vous ne souhaitez pas rejoindre ce site, veuillez ignorer\n" +"cet e-mail. L’invitation expirera dans quelques jours.\n" +"\n" +"Veuillez cliquer sur le lien suivant pour activer votre compte utilisateur :\n" +"%%s" + +#: wp-admin/includes/theme.php:288 +msgid "Featured Images" +msgstr "Images mises en avant" + +#: wp-admin/includes/theme.php:291 wp-admin/includes/meta-boxes.php:480 +msgid "Post Formats" +msgstr "Format d’article" + +#: wp-admin/includes/theme.php:290 +msgid "Full Width Template" +msgstr "Modèle pleine largeur" + +#: wp-admin/includes/theme.php:287 +msgid "Featured Image Header" +msgstr "Image d’en-tête mise en avant" + +#. translators: %s: Browser name and link. +#: wp-admin/includes/dashboard.php:1598 +msgid "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." +msgstr "Il semble que vous utilisez une vieille version de %s. Pour utiliser WordPress dans les meilleures conditions, veuillez mettre à jour votre navigateur." + +#. translators: %s: Browser name and link. +#: wp-admin/includes/dashboard.php:1592 +msgid "It looks like you're using an insecure version of %s. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." +msgstr "Il semble que vous utilisez une version peu sûre de %s. Un navigateur dépassé met votre ordinateur en danger. Pour utiliser WordPress dans des conditions optimales, veuillez mettre à jour votre navigateur." + +#: wp-admin/includes/nav-menu.php:1073 +msgid "There are some invalid menu items. Please check or delete them." +msgstr "Certains éléments du menu ne sont pas valides. Veuillez les vérifier ou les effacer." + +#: wp-admin/edit-tags.php:440 +#: wp-admin/includes/class-wp-terms-list-table.php:182 +#: wp-admin/includes/class-wp-terms-list-table.php:646 +#: wp-admin/edit-tag-form.php:132 +msgctxt "term name" +msgid "Name" +msgstr "Nom" + +#: wp-admin/includes/template.php:569 wp-admin/includes/template.php:584 +#: wp-admin/includes/template.php:712 +msgctxt "meta name" +msgid "Name" +msgstr "Nom" + +#: wp-admin/themes.php:394 +msgctxt "theme name" +msgid "Name" +msgstr "Nom" + +#. translators: %s: Theme Directory URL. +#: wp-admin/theme-install.php:97 +msgid "You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the WordPress Theme Directory. These themes are designed and developed by third parties, are available free of charge, and are compatible with the license WordPress uses." +msgstr "Vous pouvez trouver plus de thèmes pour votre site en utilisant le navigateur/installeur de thème sur cet écran, qui affiche les thèmes en provenance du dépôt de thèmes de WordPress.org. Ces thèmes sont conçus et développés par des tiers, sont gratuits et utilisent une licence compatible avec celle de WordPress." + +#. translators: %s: WordPress Plugin Directory URL. +#: wp-admin/plugins.php:450 +msgid "If you would like to see more plugins to choose from, click on the “Add New” button and you will be able to browse or search for additional plugins from the WordPress Plugin Directory. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!" +msgstr "Si vous souhaitez choisir parmi plus d’extensions, cliquez sur l’onglet « Ajouter » et vous pourrez parcourir le dépôt d’extensions de WordPress.org, ou y lancer une recherche. Les extensions du dépôt sont conçues et développées par des tiers, et utilisent une licence compatible avec celle de WordPress. Et oui, elles sont gratuites !" + +#: wp-admin/update-core.php:70 +msgid "Re-install Now" +msgstr "Ré-installer maintenant" + +#. translators: %s: MAX_FILE_SIZE +#: wp-admin/includes/file.php:776 +msgid "The uploaded file exceeds the %s directive that was specified in the HTML form." +msgstr "La taille du fichier envoyé excède celle indiquée dans la directive %s du formulaire HTML." + +#: wp-admin/credits.php:150 +msgid "External Libraries" +msgstr "Bibliothèques tierces" + +#: wp-admin/menu.php:288 wp-admin/network.php:52 wp-admin/network/menu.php:112 +msgid "Network Setup" +msgstr "Création du réseau" + +#: wp-admin/menu.php:278 +msgid "Available Tools" +msgstr "Outils disponibles" + +#: wp-admin/includes/credits.php:95 +msgctxt "Translate this to be the equivalent of English Translators in your language for the credits page Translators section" +msgid "Translators" +msgstr "Traductrices & traducteurs" + +#. translators: 1: URL to Plugins screen, 2: URL to Themes screen, 3: +#. https://wordpress.org/about/license +#: wp-admin/freedoms.php:107 +msgid "Every plugin and theme in WordPress.org’s directory is 100%% GPL or a similarly free and compatible license, so you can feel safe finding plugins and themes there. If you get a plugin or theme from another source, make sure to ask them if it’s GPL first. If they don’t respect the WordPress license, we don’t recommend them." +msgstr "Tous les thèmes et extensions disponibles sur le répertoire WordPress.org respectent à 100% la licence GPL, ou une licence libre et compatible. Ainsi, vous pouvez en toute sûreté y rechercher des extensions et des thèmes. Si vous téléchargez une extension ou un thème en provenance d’une autre source, vérifiez bien que la licence GPL est respectée. Si cela n’est pas le cas, nous vous recommandons de ne pas l’utiliser." + +#. translators: %s: https://wordpressfoundation.org/trademark-policy +#: wp-admin/freedoms.php:95 +msgid "WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. We’re flattered every time someone spreads the good word, just make sure to check out our trademark guidelines first." +msgstr "WordPress croît à chaque fois que vous en parlez à vos amis et à chaque fois que les milliers de sociétés et services dans le monde bâtis à l’aide de ou autour de WordPress en font mention à leurs utilisateurs. Nous sommes flattés chaque fois que quelqu’un vante les mérites de cet outil ; veillez cependant à respecter les conseils d’utilisation de notre marque déposée." + +#. translators: %s: https://wordpress.org/about/license +#: wp-admin/freedoms.php:55 +msgid "WordPress is Free and open source software, built by a distributed community of mostly volunteer developers from around the world. WordPress comes with some awesome, worldview-changing rights courtesy of its license, the GPL." +msgstr "WordPress est un logiciel libre et au code ouvert (open-source), conçu par une communauté de développeurs majoritairement bénévoles, partout dans le monde. WordPress est livré avec des libertés formidables qui changent la vision du monde, grâce à sa licence, la GPL." + +#: wp-admin/credits.php:140 +msgid "Project Leaders" +msgstr "Chefs de projet" + +#. translators: 1: https://wordpress.org/about/, 2: https://make.wordpress.org +#: wp-admin/credits.php:55 +msgid "WordPress is created by a worldwide team of passionate individuals. Get involved in WordPress." +msgstr "WordPress est créé par une équipe de personnes passionnées, répartie sur toute la planète. Participez au développement de WordPress !" + +#: wp-admin/menu.php:108 +msgid "All Comments" +msgstr "Tous les commentaires" + +#. translators: %s: The current WordPress version number. +#: wp-admin/credits.php:142 +msgid "Core Contributors to WordPress %s" +msgstr "Contributrices & contributeurs au cœur de WordPress %s" + +#: wp-admin/credits.php:144 +msgid "Cofounder, Project Lead" +msgstr "Cofondateur, chef de projet" + +#: wp-admin/widgets.php:441 +msgctxt "removing-widget" +msgid "Deactivate" +msgstr "Désactiver" + +#: wp-admin/credits.php:13 wp-admin/credits.php:39 wp-admin/credits.php:47 +#: wp-admin/privacy.php:36 wp-admin/freedoms.php:42 wp-admin/about.php:37 +msgid "Credits" +msgstr "Crédits" + +#. translators: %s: https://make.wordpress.org +#: wp-admin/credits.php:71 +msgid "Want to see your name in lights on this page? Get involved in WordPress." +msgstr "Vous voulez faire partie des noms listés sur cette page ? Participez au développement de WordPress !" + +#: wp-admin/credits.php:145 +msgid "Lead Developer" +msgstr "Développeur principal" + +#: wp-admin/credits.php:40 wp-admin/privacy.php:37 wp-admin/freedoms.php:18 +#: wp-admin/freedoms.php:43 wp-admin/freedoms.php:49 wp-admin/about.php:38 +msgid "Freedoms" +msgstr "Libertés" + +#: wp-admin/freedoms.php:115 +msgid "Don’t you wish all software came with these freedoms? So do we! For more information, check out the Free Software Foundation." +msgstr "Ne préféreriez-vous pas que tous vos logiciels vous donnent autant de liberté ? Nous aussi ! Pour obtenir plus d’informations, rendez-vous sur le site de la Free Software Foundation, ou en français, ceux de l’April et de l’Aful." + +#: wp-admin/includes/dashboard.php:34 +msgid "Your browser is out of date!" +msgstr "Votre navigateur est obsolète !" + +#: wp-admin/includes/dashboard.php:32 +msgid "You are using an insecure browser!" +msgstr "Vous utilisez un navigateur peu sûr !" + +#: wp-admin/includes/class-custom-image-header.php:649 +msgid "You can choose one of your previously uploaded headers, or show a random one." +msgstr "Vous pouvez choisir un en-tête parmi ceux que vous avez déjà téléversés, ou en afficher un aléatoirement." + +#: wp-admin/includes/class-custom-image-header.php:663 +msgid "If you don‘t want to upload your own image, you can use one of these cool headers, or show a random one." +msgstr "Si vous ne voulez pas téléverser d’image, vous pouvez utiliser l’un de ces en-têtes, ou en afficher un aléatoirement." + +#: wp-admin/includes/class-custom-image-header.php:665 +msgid "You can use one of these cool headers or show a random one on each page." +msgstr "Vous pouvez choisir parmi ces en-têtes, ou en afficher un aléatoirement à chaque chargement de page." + +#: wp-admin/menu-header.php:262 +msgid "Collapse menu" +msgstr "Réduire le menu" + +#: wp-admin/includes/class-custom-image-header.php:647 +msgid "Uploaded Images" +msgstr "Images téléversées" + +#: wp-admin/includes/class-custom-image-header.php:294 +msgid "Random: Show a different image on each page." +msgstr "Aléatoire  : affiche une image différente sur chaque page." + +#: wp-admin/includes/theme.php:296 wp-admin/includes/theme.php:332 +#: wp-admin/includes/class-wp-screen.php:1200 wp-admin/index.php:68 +msgid "Layout" +msgstr "Arrangement" + +#: wp-admin/users.php:282 +msgid "You have specified this user for deletion:" +msgstr "Vous avez choisi de supprimer cet utilisateur :" + +#: wp-admin/user-edit.php:201 +msgid "← Back to Users" +msgstr "← Retour aux utilisateurs" + +#. translators: 1: Current page, 2: Total pages. +#: wp-admin/includes/class-wp-list-table.php:884 +msgctxt "paging" +msgid "%1$s of %2$s" +msgstr "%1$s sur %2$s" + +#. translators: %s: Template name. +#: wp-admin/includes/file.php:91 +msgid "%s Page Template" +msgstr "Modèle de page %s" + +#: wp-admin/includes/ajax-actions.php:4520 wp-admin/plugins.php:507 +msgid "You cannot delete a plugin while it is active on the main site." +msgstr "Vous ne pouvez pas effacer une extension tant qu’elle est activée sur le site principal." + +#: wp-admin/plugins.php:323 +msgid "This plugin may be active on other sites in the network." +msgstr "Cette extension peut uniquement être activée sur l’ensemble des sites du réseau." + +#: wp-admin/user-edit.php:229 wp-admin/users.php:568 +msgctxt "user" +msgid "Add Existing" +msgstr "Ajouter un utilisateur existant" + +#: wp-admin/options-writing.php:98 +msgid "Default Post Format" +msgstr "Format par défaut des articles" + +#: wp-admin/theme-editor.php:45 wp-admin/plugin-editor.php:136 +msgid "Any edits to files from this screen will be reflected on all sites in the network." +msgstr "Toute modification aux fichiers de cet écran affectera l’ensemble des sites du réseau." + +#: wp-admin/plugin-editor.php:135 +msgid "If you want to make changes but don’t want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below." +msgstr "Si vous voulez faire des modifications et ne pas les perdre à la prochaine mise à jour, cela signifie que vous êtes prêt à écrire votre propre extension. Pour obtenir des informations sur la manière de modifier une extension ou d’en créer une, ou simplement pour comprendre leur fonctionnement, suivez les liens ci-dessous." + +#: wp-admin/users.php:33 +msgid "This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role." +msgstr "Cet écran liste tous les utilisateurs actuels de votre site. Chaque utilisateur a l’un des 5 rôles prédéfinis, tel qu’assigné par l’administrateur du site : Administrateur, Éditeur, Auteur, Contributeur ou Abonné. Les utilisateurs avec un rôle autre qu’Administrateur verront moins d’options quand ils seront connectés, en fonction de leur rôle." + +#: wp-admin/index.php:73 +msgid "The boxes on your Dashboard screen are:" +msgstr "Les sections de l’écran du tableau de bord sont :" + +#: wp-admin/includes/upgrade.php:334 +msgid "Sample Page" +msgstr "Page d’exemple" + +#. translators: Default page slug. +#: wp-admin/includes/upgrade.php:336 +msgid "sample-page" +msgstr "page-d-exemple" + +#: wp-admin/options-discussion.php:281 +msgid "Retro (Generated)" +msgstr "Rétro (généré)" + +#. translators: %s: URL to Themes tab on Edit Site screen. +#: wp-admin/includes/class-wp-themes-list-table.php:111 +msgid "You only have one theme enabled for this site right now. Visit the Network Admin to enable more themes." +msgstr "Vous n’avez qu’un thème activé sur ce site actuellement. Veuillez vous rendre sur la page d’administration du réseau pour activer plus de thèmes." + +#. translators: 1: URL to Themes tab on Edit Site screen, 2: URL to Add Themes +#. screen. +#: wp-admin/includes/class-wp-themes-list-table.php:102 +msgid "You only have one theme enabled for this site right now. Visit the Network Admin to enable or install more themes." +msgstr "Vous n’avez qu’un thème activé sur ce site actuellement. Veuillez vous rendre sur la page d’administration du réseau pour activer ou installer plus de thèmes." + +#: wp-admin/user-edit.php:438 +msgid "Super admin privileges cannot be removed because this user has the network admin email." +msgstr "Les privilèges de super-admin ne peuvent pas être retirés, car cet utilisateur est celui avec l’adresse de messagerie administrative du réseau." + +#. translators: %s: URL to Add Themes screen. +#: wp-admin/includes/class-wp-themes-list-table.php:122 +msgid "You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress Theme Directory at any time: just click on the Install Themes tab above." +msgstr "Vous n’avez qu’un seul thème d’installé pour le moment. Faites vivre votre site ! Vous pouvez quand vous le voulez choisir parmi plus de 1 000 thèmes sur le dépôt de thèmes de WordPress.org : cliquez simplement sur l’onglet « Ajouter » ci-dessus." + +#: wp-admin/maint/repair.php:162 +msgid "One or more database tables are unavailable. To allow WordPress to attempt to repair these tables, press the “Repair Database” button. Repairing can take a while, so please be patient." +msgstr "Une ou plusieurs tables de votre base de données sont indisponibles. Pour autoriser WordPress à tenter de réparer ces tables, cliquez sur le bouton « Réparer la base de données ». La réparation peut prendre un certain temps, merci donc d’être patient." + +#: wp-admin/includes/file.php:55 +msgid "Visual Editor RTL Stylesheet" +msgstr "Feuille de style de l’éditeur visuel (lecture de droite à gauche)" + +#: wp-admin/theme-editor.php:309 +msgid "This is a file in your current parent theme." +msgstr "Ceci est un fichier de votre thème parent actuel." + +#. translators: %s: Link to edit parent theme. +#: wp-admin/theme-editor.php:260 +msgid "This child theme inherits templates from a parent theme, %s." +msgstr "Ce thème enfant hérite de certains modèles de son thème parent, %s." + +#: wp-admin/upgrade.php:75 +msgid "No Update Required" +msgstr "Aucune mise à jour nécessaire" + +#: wp-admin/upgrade.php:139 +msgid "WordPress has been updated! Before we send you on your way, we have to update your database to the newest version." +msgstr "WordPress a été mis à jour ! Avant de vous laisser continuer, nous devons mettre à jour la base de données." + +#: wp-admin/upgrade.php:138 wp-admin/network/upgrade.php:137 +msgid "Database Update Required" +msgstr "Mise à jour de la base de données nécessaire" + +#: wp-admin/upgrade.php:151 +msgid "Update Complete" +msgstr "Mise à jour terminée" + +#: wp-admin/upgrade.php:64 +msgid "WordPress › Update" +msgstr "WordPress › Mise à jour" + +#: wp-admin/upgrade.php:140 wp-admin/network/upgrade.php:141 +msgid "The database update process may take a little while, so please be patient." +msgstr "Le processus de mise à jour peut prendre un certain temps, merci donc pour votre patience." + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:170 +msgid "You are about to install WordPress %s in English (US). There is a chance this update will break your translation. You may prefer to wait for the localized version to be released." +msgstr "Vous êtes sur le point d’installer WordPress %s en anglais (US). Il se peut que cette mise à jour ne fonctionne pas avec la traduction de WordPress dont vous disposez. Vous devriez sans doute patienter, le temps que la mise à jour soit officiellement traduite dans votre langue." + +#: wp-admin/upgrade.php:141 +msgid "Update WordPress Database" +msgstr "Mettre à jour la base de données de WordPress" + +#: wp-admin/upgrade.php:152 +msgid "Your WordPress database has been successfully updated!" +msgstr "La base de données de WordPress a bien été mise à jour !" + +#: wp-admin/includes/class-plugin-upgrader.php:48 +#: wp-admin/includes/class-theme-upgrader.php:47 +#: wp-admin/includes/class-core-upgrader.php:31 +#: wp-admin/includes/class-language-pack-upgrader.php:115 +msgid "Update package not available." +msgstr "Aucune archive de mise à jour disponible." + +#: wp-admin/includes/class-plugin-upgrader-skin.php:31 wp-admin/update.php:58 +msgid "Update Plugin" +msgstr "Mettre à jour l’extension" + +#: wp-admin/includes/class-theme-upgrader.php:54 +msgid "Theme updated successfully." +msgstr "Le thème a bien été mis à jour." + +#: wp-admin/includes/class-theme-upgrader.php:53 +msgid "Theme update failed." +msgstr "La mise à jour du thème a échoué." + +#: wp-admin/includes/class-plugin-upgrader.php:54 +#: wp-admin/includes/ajax-actions.php:4450 +#: wp-admin/includes/ajax-actions.php:4477 +msgid "Plugin update failed." +msgstr "La mise à jour de l’extension a échoué." + +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#: wp-admin/includes/update.php:479 +msgid "There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this plugin." +msgstr "Une nouvelle version pour %1$s est disponible. Afficher les détails de la version %4$s. La mise à jour automatique n’est pas disponible pour cette extension." + +#: wp-admin/includes/class-theme-upgrader-skin.php:29 wp-admin/update.php:182 +msgid "Update Theme" +msgstr "Mettre à jour le thème" + +#: wp-admin/includes/class-plugin-upgrader.php:55 +msgid "Plugin updated successfully." +msgstr "L’extension a bien été mise à jour." + +#: wp-admin/export.php:180 +msgid "All content" +msgstr "Tout le contenu" + +#: wp-admin/export.php:191 wp-admin/export.php:238 +msgid "Authors:" +msgstr "Auteurs :" + +#: wp-admin/export.php:175 +msgid "Choose what to export" +msgstr "Choisir les données à exporter" + +#: wp-admin/export.php:181 +msgid "This will contain all of your posts, pages, comments, custom fields, terms, navigation menus, and custom posts." +msgstr "Il contiendra tous vos articles, pages, commentaires, champs personnalisés, termes, menus de navigation et types de publications personnalisés." + +#: wp-admin/export.php:208 wp-admin/export.php:255 wp-admin/export.php:295 +msgid "Date range:" +msgstr "Date de création :" + +#. translators: %s: Number of comments. +#: wp-admin/includes/class-wp-comments-list-table.php:230 +msgctxt "comments" +msgid "Mine (%s)" +msgid_plural "Mine (%s)" +msgstr[0] "Le mien (%s)" +msgstr[1] "Les miens (%s)" + +#. translators: Admin screen title. %s: Admin screen name. +#: wp-admin/admin-header.php:49 +msgid "%s — WordPress" +msgstr "%s – WordPress" + +#: wp-admin/media.php:87 wp-admin/edit-form-advanced.php:340 +msgid "This screen allows you to edit fields for metadata in a file within the media library." +msgstr "Cet écran vous permet de modifier les champs des métadonnées des fichiers dans la bibliothèque des médias." + +#: wp-admin/media.php:88 wp-admin/edit-form-advanced.php:341 +msgid "For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information." +msgstr "Pour les images (et seulement elles), vous pouvez cliquer sur « Modifier l’Image », sous la miniature, afin de faire apparaître un éditeur d’image, vous permettant de recadrer, d’appliquer une rotation ou d’inverser une image, ainsi que de défaire et refaire vos modifications. Les sections sur la droite vous donnent accès à d’autres options pour le changement d’échelle, le recadrage et même le recadrage de la miniature, qui peut être différent de celui de l’image originale. Cliquez sur le bouton « Aide » de ces sections pour obtenir plus d’informations." + +#: wp-admin/media.php:89 wp-admin/edit-form-advanced.php:342 +msgid "Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping." +msgstr "Pour recadrer une image, cliquez sur l’icône Recadrer puis sélectionnez la zone à conserver en cliquant sur l’image et en faisant glisser le curseur de la souris. Ensuite, cliquez sur Enregistrer pour conserver votre modification." + +#: wp-admin/media.php:90 wp-admin/edit-form-advanced.php:343 +msgid "Remember to click Update Media to save metadata entered or changed." +msgstr "Pensez bien à cliquer sur le bouton « Mettre à jour le fichier » afin de conserver les métadonnées ajoutées ou modifiées." + +#: wp-admin/widgets.php:58 +msgid "The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget." +msgstr "La section « Widgets disponibles » contient tous les widgets que vous pouvez utiliser. Une fois le widget glissé dans la colonne latérale, il s’ouvrira pour vous permettre d’en modifier les réglages. Quand vos réglages vous satisfont, cliquez sur le bouton « Enregistrer » et le widget sera lancé sur votre site. Si vous cliquez sur « Supprimer », le widget sera retiré du site." + +#: wp-admin/user-new.php:393 +msgid "Email or Username" +msgstr "E-mail ou identifiant" + +#: wp-admin/themes.php:172 wp-admin/network/themes.php:321 +#: wp-admin/network/site-themes.php:215 +msgid "Search Installed Themes" +msgstr "Rechercher des thèmes installés" + +#. translators: %s: Link to documentation on child themes. +#: wp-admin/update-core.php:463 +msgid "Please Note: Any customizations you have made to theme files will be lost. Please consider using child themes for modifications." +msgstr "Notez bien : toutes les personnalisations que vous pourriez avoir apportées aux fichiers des thèmes seront perdues. Pensez à utiliser des thèmes enfants pour vos modifications." + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-posts-list-table.php:380 +msgctxt "posts" +msgid "Sticky (%s)" +msgid_plural "Sticky (%s)" +msgstr[0] "Mis en avant (%s)" +msgstr[1] "Mis en avant (%s)" + +#: wp-admin/update-core.php:764 +msgid "Check Again" +msgstr "Revérifier" + +#. translators: 1: Date, 2: Time. +#: wp-admin/update-core.php:763 +msgid "Last checked on %1$s at %2$s." +msgstr "Dernière vérification le %1$s à %2$s." + +#: wp-admin/update-core.php:747 +msgid "Please select one or more themes to update." +msgstr "Veuillez sélectionner un ou plusieurs thèmes à mettre à jour." + +#: wp-admin/update-core.php:749 +msgid "Please select one or more plugins to update." +msgstr "Veuillez sélectionner une ou plusieurs extensions à mettre à jour." + +#: wp-admin/includes/class-bulk-upgrader-skin.php:41 +msgid "The update process is starting. This process may take a while on some hosts, so please be patient." +msgstr "Le processus de mise à jour se lance. Il peut prendre un certain temps chez certains hébergeurs, merci pour votre patience." + +#: wp-admin/theme-install.php:207 wp-admin/theme-install.php:227 +msgid "Apply Filters" +msgstr "Appliquer les filtres" + +#: wp-admin/includes/theme.php:286 +msgid "Editor Style" +msgstr "Éditeur de style" + +#: wp-admin/includes/file.php:2138 +msgid "To perform the requested action, WordPress needs to access your web server." +msgstr "Pour lancer la requête demandée, WordPress a besoin d’accéder à votre serveur web." + +#: wp-admin/includes/class-wp-theme-install-list-table.php:168 +msgid "No themes match your request." +msgstr "Aucun thème ne correspond à votre requête." + +#: wp-admin/includes/class-wp-list-table.php:872 +#: wp-admin/includes/class-wp-list-table.php:876 +msgid "Current Page" +msgstr "Page actuelle" + +#. translators: %s: Number of users on the network. +#: wp-admin/includes/dashboard.php:430 +msgid "%s user" +msgid_plural "%s users" +msgstr[0] "%s utilisateur" +msgstr[1] "%s utilisateurs" + +#. translators: %s: Number of sites on the network. +#: wp-admin/includes/dashboard.php:432 +msgid "%s site" +msgid_plural "%s sites" +msgstr[0] "%s site" +msgstr[1] "%s sites" + +#. translators: 1: Text indicating the number of sites on the network, 2: Text +#. indicating the number of users on the network. +#: wp-admin/includes/dashboard.php:435 +msgid "You have %1$s and %2$s." +msgstr "Vous avez %1$s et %2$s." + +#: wp-admin/includes/dashboard.php:423 +msgid "Create a New User" +msgstr "Créer un nouvel utilisateur" + +#: wp-admin/includes/dashboard.php:471 wp-admin/includes/dashboard.php:473 +#: wp-admin/network/sites.php:381 +msgid "Search Sites" +msgstr "Rechercher des sites" + +#: wp-admin/includes/dashboard.php:1435 +msgid "https://wordpress.org/news/feed/" +msgstr "https://fr.wordpress.org/news/feed/" + +#: wp-admin/includes/dashboard.php:1426 +msgid "https://wordpress.org/news/" +msgstr "https://wpfr.net/" + +#: wp-admin/options-discussion.php:73 +msgid "(Signup has been disabled. Only members of this site can comment.)" +msgstr "(L’inscription a été désactivée. Seuls les membres de ce site peuvent laisser un commentaire.)" + +#. translators: 1: Theme name, 2: Theme details URL, 3: Additional link +#. attributes, 4: Version number. +#. translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#. translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, +#. 4: Version number. +#: wp-admin/includes/theme.php:205 wp-admin/includes/update.php:466 +#: wp-admin/includes/update.php:652 +msgid "There is a new version of %1$s available. View version %4$s details." +msgstr "Une nouvelle version pour %1$s est disponible. Afficher les détails de la version %4$s." + +#: wp-admin/includes/nav-menu.php:1069 +msgid "Click Save Menu to make pending menu items public." +msgstr "Cliquez sur « Enregistrer le menu » pour rendre publics les éléments en attente." + +#: wp-admin/includes/dashboard.php:1541 +msgid "Storage Space" +msgstr "Espace disque" + +#: wp-admin/includes/dashboard.php:420 +msgid "Create a New Site" +msgstr "Créer un nouveau site" + +#. translators: 1: Image width in pixels, 2: Image height in pixels. +#: wp-admin/includes/class-custom-image-header.php:555 +msgid "Images of exactly %1$d × %2$d pixels will be used as-is." +msgstr "Les images ayant pour taille exacte %1$d pixels par %2$d seront utilisées telles quelles." + +#: wp-admin/includes/class-custom-image-header.php:875 +msgid "Crop and Publish" +msgstr "Recadrer et publier" + +#: wp-admin/edit-link-form.php:70 +msgid "XFN stands for XHTML Friends Network, which is optional. WordPress allows the generation of XFN attributes to show how you are related to the authors/owners of the site to which you are linking." +msgstr "XFN signifie XHTML Friends Network, c’est-à-dire Réseau XHTML d’Amis. Son usage est facultatif. WordPress permet de générer les attributs XFN de vos liens, afin d’indiquer votre relation avec l’auteur ou le propriétaire de la page liée." + +#: wp-admin/includes/file.php:2143 +msgid "FTP/SSH Username" +msgstr "Identifiant FTP/SSH" + +#: wp-admin/includes/file.php:2144 +msgid "FTP/SSH Password" +msgstr "Mot de passe FTP/SSH" + +#: wp-admin/includes/file.php:2147 +msgid "FTP Username" +msgstr "Identifiant FTP" + +#: wp-admin/includes/file.php:2148 +msgid "FTP Password" +msgstr "Mot de passe FTP" + +#: wp-admin/widgets.php:76 +msgid "Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area." +msgstr "De nombreux thèmes affichent par défaut quelques widgets dans la colonne latérale, jusqu’à ce que vous la modifiez vous-mêmes. Ces widgets par défaut ne sont pas automatiquement affichés dans le gestionnaire de colonne latérale. Après avoir fait vos propres modifications de widgets, vous pouvez rajouter les widgets par défaut depuis la section « Widgets Disponibles »." + +#. translators: %s: Percent sign (%). +#: wp-admin/options-permalink.php:36 +msgid "If you pick an option other than Plain, your general URL path with structure tags (terms surrounded by %s) will also appear in the custom structure field and your path can be further modified there." +msgstr "Si vous choisissez une option autre que « Simple », la structure générale de vos liens, avec les balises de structure (encadrés par %s), apparaîtra dans le champ de « Structure personnalisée », d’où vous pourrez l’adapter à vos besoins précis." + +#. translators: 1: %category%, 2: %tag% +#: wp-admin/options-permalink.php:41 +msgid "When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes %1$s or %2$s." +msgstr "Quand vous assignez un article à plusieurs catégories ou étiquettes, une seule apparaîtra dans le permalien : la catégorie avec l’identifiant numérique le plus bas. Idem pour les mots-clés. Cela s’applique si votre structure comprend %1$s ou %2$s." + +#: wp-admin/options-permalink.php:53 +msgid "The Optional fields let you customize the “category” and “tag” base names that will appear in archive URLs. For example, the page listing all posts in the “Uncategorized” category could be /topics/uncategorized instead of /category/uncategorized." +msgstr "Les champs facultatifs, en bas de page, vous permettent de personnaliser les dénominations utilisées pour les chemins /category/ et /tag/ lors de l’affichage des archives. Par exemple, la page listant tous les articles de la catégorie « Non classé » pourrait se lire comme /sujet/non-classe/ plutôt que /categorie/non-classe/." + +#. translators: %s: URL to create a new page. +#: wp-admin/options-reading.php:28 +msgid "You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed." +msgstr "Vous pouvez choisir ce qui est affiché en page d’accueil de votre site. Au choix, le mode « blog » classique (les articles dans l’ordre chronologique inverse) ou une page statique. Pour mettre en place une page statique, vous devez d’abord créer deux pages : la première servira de page d’accueil, la seconde affichera vos articles." + +#: wp-admin/users.php:34 +msgid "To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section." +msgstr "Pour ajouter un nouvel utilisateur à votre site, cliquez sur le bouton « Ajouter » en haut de l’écran, ou l’option « Ajouter » du menu « Utilisateurs »." + +#: wp-admin/widgets.php:66 +msgid "If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas." +msgstr "Si vous voulez retirer le widget, mais conserver ses réglages pour un possible usage futur, glissez-le simplement dans la zone « Widgets désactivés ». De là, vous pouvez les réajouter n’importe quand. C’est particulièrement utile quand vous passez à un thème avec moins de zones à widgets, ou des zones différentes." + +#: wp-admin/options-general.php:27 +msgid "Most themes display the site title at the top of every page, in the title bar of the browser, and as the identifying name for syndicated feeds. The tagline is also displayed by many themes." +msgstr "La plupart des thèmes affichent le titre du site en haut de chaque page, dans la barre de titre du navigateur, et en tant qu’identifiant pour les flux de syndication, sauf si votre thème en décide autrement. Le slogan est également utilisé par de nombreux thèmes." + +#: wp-admin/options-media.php:19 +msgid "You can set maximum sizes for images inserted into your written content; you can also insert an image as Full Size." +msgstr "Vous pouvez indiquer une taille maximale pour les images insérées dans votre contenu textuel. Vous pourrez insérer l’image dans sa taille d’origine." + +#: wp-admin/edit-form-advanced.php:408 +msgid "Order — Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field." +msgstr "Ordre — Les pages sont généralement affichées par ordre alphabétique, mais vous pouvez saisir un nombre dans ce champ pour modifier l’ordre d’apparition : 1 pour premier, etc." + +#: wp-admin/includes/file.php:2152 +msgid "If you do not remember your credentials, you should contact your web host." +msgstr "Si vous ne vous souvenez pas de votre identifiant, vous devriez contacter votre hébergeur." + +#: wp-admin/includes/file.php:2146 +msgid "Please enter your FTP credentials to proceed." +msgstr "Veuillez saisir votre identifiant FTP pour continuer." + +#: wp-admin/includes/file.php:2142 +msgid "Please enter your FTP or SSH credentials to proceed." +msgstr "Veuillez saisir votre identifiant FTP ou SSH pour continuer." + +#: wp-admin/user-edit.php:49 +msgid "Your profile contains information about you (your “account”) as well as some personal options related to using WordPress." +msgstr "Votre profil contient les informations à votre propos (votre « compte »), ainsi que quelques options liées à votre utilisation personnelle de WordPress." + +#. translators: %s: /wp-content/themes +#: wp-admin/theme-install.php:104 +msgid "You can Upload a theme manually if you have already downloaded its ZIP archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme’s folder via FTP into your %s directory." +msgstr "Vous pouvez téléverser un thème manuellement si vous avez déjà téléchargé son archive Zip sur votre ordinateur (assurez-vous que le thème vient d’une source de confiance). Vous pouvez également le faire à l’ancienne, c’est-à-dire passer par un client FTP pour mettre le répertoire du thème dans le répertoire %s." + +#: wp-admin/edit-form-advanced.php:395 +msgid "Send Trackbacks — Trackbacks are a way to notify legacy blog systems that you’ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they’ll be notified automatically using pingbacks, and this field is unnecessary." +msgstr "Envoyer des rétroliens — Un rétrolien est une manière explicite de notifier les anciens systèmes de blog que vous avez fait un lien vers eux. Saisissez les adresses web que vous voulez notifier. Si dans votre article vous faites des liens vers des sites WordPress, ils seront notifiés automatiquement à l’aide de pings, sans devoir passer par un rétrolien explicite." + +#: wp-admin/link-manager.php:72 +msgid "If you delete a link, it will be removed permanently, as Links do not have a Trash function yet." +msgstr "Si vous supprimez un lien, il sera supprimé définitivement, car les liens n’ont pas accès à la corbeille pour le moment." + +#. translators: %s: URL to Widgets screen. +#: wp-admin/link-manager.php:60 +msgid "You can add links here to be displayed on your site, usually using Widgets. By default, links to several sites in the WordPress community are included as examples." +msgstr "Vous pouvez ici ajouter les liens que vous voulez voir affichés sur votre site, généralement par le biais de widgets. Des liens vers de nombreux sites de la communauté WordPress sont inclus par défaut." + +#: wp-admin/plugin-editor.php:126 +msgid "You can use the plugin editor to make changes to any of your plugins’ individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations." +msgstr "Vous pouvez utiliser l’éditeur pour personnaliser n’importe quel fichier PHP de vos extensions. Soyez cependant conscient que si vous modifiez les fichiers, les mises à jour les annuleront." + +#: wp-admin/user-new.php:261 +msgid "Administrators have access to all the administration features." +msgstr "Les administrateurs peuvent accéder à toutes les fonctionnalités de l’administration." + +#: wp-admin/user-new.php:258 +msgid "Contributors can write and manage their posts but not publish posts or upload media files." +msgstr "Les contributeurs peuvent écrire et gérer leurs articles, mais ils ne peuvent pas publier les articles ou téléverser des fichiers média." + +#. translators: %s: URL to Press This bookmarklet. +#: wp-admin/edit-form-advanced.php:309 +msgid "You can also create posts with the Press This bookmarklet." +msgstr "Vous pouvez également créer des articles avec le bookmarklet Press This." + +#: wp-admin/edit-tags.php:284 +msgid "Slug — The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." +msgstr "Slug — Le slug est la version normalisée du nom. Il ne contient généralement que des lettres minuscules non accentuées, des chiffres et des traits d’union." + +#: wp-admin/includes/class-custom-background.php:90 +msgid "You can customize the look of your site without touching any of your theme’s code by using a custom background. Your background can be an image or a color." +msgstr "Vous pouvez personnaliser l’apparence de votre site sans jamais toucher au code de votre thème, en utilisant un fond personnalisé. Votre fond peut être une image ou juste une couleur." + +#: wp-admin/includes/class-custom-background.php:93 +msgid "Don’t forget to click on the Save Changes button when you are finished." +msgstr "N’oubliez pas de cliquer sur « Enregistrer les modifications » quand vous avez terminé." + +#: wp-admin/user-new.php:260 +msgid "Editors can publish posts, manage posts as well as manage other people’s posts, etc." +msgstr "Les éditeurs peuvent publier et gérer leurs propres publication, ainsi que ceux des autres membres, etc." + +#: wp-admin/user-edit.php:55 +msgid "Remember to click the Update Profile button when you are finished." +msgstr "Pensez bien à cliquer sur le bouton « Mettre à jour le profil » quand vous aurez terminé." + +#: wp-admin/user-edit.php:54 +msgid "Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so." +msgstr "Les champs nécessaires sont indiqués, les autres sont facultatifs. Les informations du profil ne sont affichées que si votre thème a été conçu pour les exploiter." + +#: wp-admin/user-edit.php:52 +msgid "Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts." +msgstr "Votre identifiant ne peut être modifié, mais vous pouvez utiliser les autres champs pour saisir votre nom complet ou un pseudonyme, et changer ensuite le nom à afficher dans vos articles." + +#: wp-admin/comment.php:49 +msgid "You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error." +msgstr "Si besoin, vous pouvez modifier les informations laissées dans un commentaire. Par exemple, si un commentateur a fait une faute d’orthographe." + +#: wp-admin/comment.php:50 +msgid "You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment." +msgstr "Vous pouvez également modérer le commentaire depuis cet écran, à l’aide de la section « État », d’où vous pouvez également changer l’horodatage du commentaire." + +#: wp-admin/options-general.php:30 +msgid "The WordPress URL and the Site URL can be the same (example.com) or different; for example, having the WordPress core files (example.com/wordpress) in a subdirectory instead of the root directory." +msgstr "L’URL de WordPress et celle du site peuvent être identiques (exemple.fr) ou différentes. Ainsi, vous pourriez avoir les fichiers de WordPress dans un sous-dossier (exemple.fr/wordpress) plutôt qu’à la racine du site." + +#: wp-admin/options-reading.php:36 wp-admin/options-writing.php:24 +#: wp-admin/options-general.php:36 wp-admin/options-permalink.php:25 +#: wp-admin/options-permalink.php:45 wp-admin/options-permalink.php:54 +#: wp-admin/options-media.php:25 wp-admin/options-discussion.php:25 +msgid "You must click the Save Changes button at the bottom of the screen for new settings to take effect." +msgstr "Vous devez cliquer sur « Enregistrer les modifications » en bas de l’écran pour que les nouveaux réglages prennent effet." + +#: wp-admin/options-reading.php:25 +msgid "This screen contains the settings that affect the display of your content." +msgstr "Cet écran présente les réglages qui influent sur l’affichage de votre contenu." + +#: wp-admin/options-general.php:26 +msgid "The fields on this screen determine some of the basics of your site setup." +msgstr "Les champs de cet écran déterminent certains des réglages de base de votre site." + +#: wp-admin/options-general.php:35 +msgid "UTC means Coordinated Universal Time." +msgstr "UTC signifie « Temps universel coordonné »." + +#. translators: %s: Documentation URL. +#: wp-admin/options-reading.php:33 +msgid "You can also control the display of your content in RSS feeds, including the maximum number of posts to display and whether to show full text or a summary. Learn more about feeds." +msgstr "Vous pouvez également contrôler l’affichage de votre contenu dans les flux RSS, comme le nombre maximum d’entrées à afficher, s’il faut afficher l’article en entier ou juste un résumé. En savoir plus sur les flux." + +#: wp-admin/edit-link-form.php:69 +msgid "The boxes for link name, web address, and description have fixed positions, while the others may be repositioned using drag and drop. You can also hide boxes you don’t use in the Screen Options tab, or minimize boxes by clicking on the title bar of the box." +msgstr "Les sections pour le nom, l’adresse web et la description sont fixes, tandis que les autres peuvent être repositionnées par glisser/déposer. Vous pouvez également masquer les sections que vous n’utilisez pas via l’onglet « Options de l’écran », et fermer les sections en cliquant sur leur barre de titre." + +#: wp-admin/update-core.php:255 +msgid "An updated version of WordPress is available." +msgstr "Une nouvelle version de WordPress est disponible." + +#: wp-admin/update-core.php:451 +msgid "Your themes are all up to date." +msgstr "Vos thèmes sont tous à jour." + +#: wp-admin/update-core.php:230 +msgid "You have the latest version of WordPress." +msgstr "Vous avez la dernière version de WordPress." + +#: wp-admin/update-core.php:304 +msgid "Your plugins are all up to date." +msgstr "Vos extensions sont toutes à jour." + +#: wp-admin/update-core.php:278 +msgid "While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, your site will return to normal." +msgstr "Durant le processus de mise à jour, votre site sera en mode de maintenance. Dès que le processus sera achevé, votre site sera à nouveau accessible." + +#: wp-admin/theme-editor.php:169 wp-admin/plugin-editor.php:169 +msgid "Function Name…" +msgstr "Nom de la fonction…" + +#: wp-admin/includes/class-plugin-installer-skin.php:67 +msgid "Activate Plugin & Run Importer" +msgstr "Activer l’extension & lancer l’importateur" + +#: wp-admin/includes/class-plugin-installer-skin.php:96 +msgid "Return to Importers" +msgstr "Retourner aux importateurs" + +#: wp-admin/edit-link-form.php:68 +msgid "You can add or edit links on this screen by entering information in each of the boxes. Only the link’s web address and name (the text you want to display on your site as the link) are required fields." +msgstr "Vous pouvez ajouter ou modifier des liens sur cet écran, en saisissant dans chacune des sections. Seuls sont nécessaires les champs « Adresse web » et « Nom » (le texte que vous voulez voir affiché sur votre site pour cette adresse)." + +#. translators: %s: URL to Categories to Tags Converter tool. +#: wp-admin/edit-tags.php:609 +msgid "Categories can be selectively converted to tags using the category to tag converter." +msgstr "Les catégories peuvent être converties de manière sélective en étiquettes via le convertisseur catégories vers étiquettes." + +#: wp-admin/export.php:51 +msgid "Once generated, your WXR file can be imported by another WordPress site or by another blogging platform able to access this format." +msgstr "Une fois généré, le fichier WXR peut être importé dans une autre installation WordPress, ou une autre plate-forme de blog capable de lire ce format." + +#: wp-admin/import.php:24 +msgid "This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform." +msgstr "Cet écran liste les liens vers les extensions servant à importer des données en provenance d’autres plates-formes de blogs ou gestionnaires de contenus. Choisissez la plate-forme d’origine, et cliquez sur « Installer maintenant » dans la fenêtre qui s’affiche. Si vous ne trouvez pas votre plate-forme, cliquez sur le lien « Recherche » dans le répertoire d’extensions et lancez une recherche - peut-être qu’une autre extension répondra à vos attentes." + +#: wp-admin/plugin-editor.php:127 +msgid "Choose a plugin to edit from the dropdown menu and click the Select button. Click once on any file name to load it in the editor, and make your changes. Don’t forget to save your changes (Update File) when you’re finished." +msgstr "Choisissez une extension à modifier dans le menu déroulant et cliquez sur le bouton « Sélectionner ». Cliquez une fois sur n’importe quel nom de fichier pour le charger dans l’éditeur, puis faites vos modifications. N’oubliez pas d’enregistrer vos modifications (bouton « Mettre à jour le fichier ») quand vous aurez terminé." + +#: wp-admin/link-manager.php:64 +msgid "You can customize the display of this screen using the Screen Options tab and/or the dropdown filters above the links table." +msgstr "Vous pouvez personnaliser l’affichage de cet écran en utilisant les réglages d’affichage et/ou le filtre déroulant présent au-dessous du tableau de liens." + +#: wp-admin/plugins.php:460 +msgid "Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin’s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue." +msgstr "La plupart du temps, les extensions fonctionnent comme il le faut, tant avec WordPress qu’entre elles. Mais parfois, les ajouts d’une extension peuvent empiéter sur celles d’une autre, ce qui provoque une incompatibilité. Si votre site réagit bizarrement, le problème vient peut-être de là. Essayez de désactiver toutes les extensions, puis de les réactiver une à une pour trouver celle(s) en cause." + +#: wp-admin/theme-editor.php:38 +msgid "After typing in your edits, click Update File." +msgstr "Après avoir fait vos modifications, cliquez sur « Mettre à jour le fichier »." + +#: wp-admin/theme-editor.php:39 +msgid "Advice: Think very carefully about your site crashing if you are live-editing the theme currently in use." +msgstr "Conseil : gardez bien en tête que si vous modifiez le thème actuellement utilisé, vos visiteurs pourraient avoir une vision déroutante de votre site." + +#: wp-admin/widgets.php:57 +msgid "Widgets are independent sections of content that can be placed into any widgetized area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them." +msgstr "Les widgets sont des conteneurs de contenu indépendants, qui peuvent être placés dans n’importe quelle zone à widgets de votre thème (le plus souvent, la colonne latérale). Pour remplir les zones à widgets de votre colonne latérale, glissez/déposez les barres de titre dans la zone désirée. Par défaut, seule la première zone de widgets sera ouverte. Pour remplir les autres zones à widgets, cliquez sur leur barre de titre afin de les ouvrir." + +#: wp-admin/theme-editor.php:30 +msgid "Begin by choosing a theme to edit from the dropdown menu and clicking the Select button. A list then appears of the theme’s template files. Clicking once on any file name causes the file to appear in the large Editor box." +msgstr "Commencez par choisir un thème à modifier via le menu déroulant, et cliquez sur « Sélectionner ». Une liste apparaîtra ensuite avec tous les fichiers modèles. En cliquant sur n’importe lequel de ces fichiers, vous verrez son contenu apparaître dans l’éditeur." + +#: wp-admin/theme-editor.php:29 +msgid "You can use the theme editor to edit the individual CSS and PHP files which make up your theme." +msgstr "Vous pouvez utiliser l’éditeur de thème pour modifier les fichiers CSS et PHP qui composent votre thème." + +#: wp-admin/widgets.php:68 +msgid "Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop." +msgstr "En activant le mode « Accessibilité », via les options d’écrans, vous autorisez l’utilisation des boutons « Ajouter » et « Modifier » à la place du glisser/déposer." + +#: wp-admin/widgets.php:67 +msgid "Widgets may be used multiple times. You can give each widget a title, to display on your site, but it’s not required." +msgstr "Les widgets peuvent être utilisés à plusieurs reprises. Vous pouvez donner un titre pour chaque widget, afin de l’afficher sur votre site, mais ce n’est pas obligatoire." + +#: wp-admin/includes/meta-boxes.php:933 +msgid "(no parent)" +msgstr "(pas de parent)" + +#: wp-admin/edit-form-advanced.php:406 +msgid "Parent — You can arrange your pages in hierarchies. For example, you could have an “About” page that has “Life Story” and “My Dog” pages under it. There are no limits to how many levels you can nest pages." +msgstr "Parent — Vous pouvez arranger vos pages en hiérarchies. Par exemple, vous pourriez avoir une page « À propos », avec comme sous-pages « Ma vie » et « Mon œuvre ». Il n’y a pas de limite à la profondeur des sous-pages." + +#: wp-admin/edit-form-advanced.php:407 +msgid "Template — Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you’ll see them in this dropdown menu." +msgstr "Modèle — Certains thèmes utilisent des modèles spéciaux que vous pouvez appliquer à pages des pages précises, avec des fonctionnalités supplémentaires ou une mise en page qui leur est propre. Si c’est le cas, vous les verrez dans ce menu déroulant." + +#: wp-admin/includes/class-bulk-upgrader-skin.php:48 +msgid "All updates have been completed." +msgstr "Toutes les mises à jour sont terminées." + +#: wp-admin/edit-tags.php:275 +msgid "When adding a new category on this screen, you’ll fill in the following fields:" +msgstr "Quand vous ajoutez une nouvelle catégorie via cet écran, vous devez remplir les champs suivants :" + +#: wp-admin/edit-tags.php:281 +msgid "Name — The name is how it appears on your site." +msgstr "Nom — Le nom est utilisé un peu partout sur votre site." + +#: wp-admin/edit-tags.php:291 +msgid "Description — The description is not prominent by default; however, some themes may display it." +msgstr "Description — La description n’est pas très utilisée par défaut, cependant de plus en plus de thèmes l’affichent." + +#: wp-admin/edit-tags.php:293 +msgid "You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table." +msgstr "Vous pouvez modifier l’affichage de cet écran via l’onglet « Options de l’écran », afin de définir le nombre d’éléments à afficher par écran, et afficher/masquer les colonnes du tableau." + +#: wp-admin/edit-tags.php:262 +msgid "What’s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index." +msgstr "Quelle est la différence entre les catégories et les étiquettes ? Normalement, les étiquettes identifient les informations importantes dans votre article (noms, sujets, etc.) qui seraient susceptibles de revenir dans d’autres articles, ou pas. De leur côté, les catégories ont des sections prédéterminées. Si vous voyez votre site comme un livre, alors les catégories sont la table des matières, et les étiquettes forment l’index." + +#. translators: %s: URL to Writing Settings screen. +#: wp-admin/edit-tags.php:250 +msgid "You can use categories to define sections of your site and group related posts. The default category is “Uncategorized” until you change it in your writing settings." +msgstr "Vous pouvez utiliser les catégories pour donner des sections à votre site, et grouper les articles connexes. La catégorie par défaut est « Non classé » ; vous pouvez la modifier dans vos options d’écriture." + +#: wp-admin/edit-tags.php:277 +msgid "When adding a new tag on this screen, you’ll fill in the following fields:" +msgstr "Quand vous ajoutez une nouvelle étiquette via cet écran, vous devez remplir les champs suivants :" + +#: wp-admin/includes/class-custom-image-header.php:857 +msgid "You need JavaScript to choose a part of the image." +msgstr "Vous avez besoin de la fonctionnalité JavaScript de votre navigateur web pour choisir une partie de l’image." + +#: wp-admin/includes/class-custom-image-header.php:905 +msgid "Image Upload Error" +msgstr "Erreur lors de l’envoi de l’image" + +#: wp-admin/includes/class-custom-image-header.php:693 +msgid "Restore Original Header Image" +msgstr "Rétablir l’image d’en-tête d’origine" + +#: wp-admin/includes/class-custom-image-header.php:692 +msgid "This will restore the original header image. You will not be able to restore any customizations." +msgstr "Ceci remettra en place l’image d’en-tête d’origine. Il ne vous sera pas possible de récupérer vos personnalisations." + +#: wp-admin/includes/class-custom-image-header.php:690 +msgid "Reset Image" +msgstr "Remettre l’image d’origine" + +#: wp-admin/includes/class-custom-image-header.php:680 +msgid "Remove Header Image" +msgstr "Retirer l’image d’en-tête" + +#: wp-admin/includes/class-custom-image-header.php:679 +msgid "This will remove the header image. You will not be able to restore any customizations." +msgstr "Ceci retirera l’image d’en-tête. Il ne vous sera pas possible de rétablir vos personnalisations." + +#: wp-admin/includes/class-custom-image-header.php:853 +msgid "Crop Header Image" +msgstr "Recadrer l’image d’en-tête" + +#: wp-admin/includes/class-custom-image-header.php:660 +msgid "Default Images" +msgstr "Images par défaut" + +#: wp-admin/includes/class-wp-comments-list-table.php:698 +#: wp-admin/includes/dashboard.php:725 +msgid "Delete this comment permanently" +msgstr "Supprimer définitivement ce commentaire" + +#: wp-admin/includes/class-wp-comments-list-table.php:688 +msgid "Restore this comment from the Trash" +msgstr "Récupérer ce commentaire depuis la corbeille" + +#: wp-admin/includes/class-bulk-plugin-upgrader-skin.php:56 +#: wp-admin/includes/class-language-pack-upgrader-skin.php:78 +#: wp-admin/includes/class-bulk-theme-upgrader-skin.php:56 +msgid "Return to WordPress Updates page" +msgstr "Retourner aux mises à jour de WordPress" + +#: wp-admin/edit-form-advanced.php:396 +msgid "Discussion — You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them." +msgstr "Commentaires — Vous pouvez activer ou désactiver les commentaires et pings, et si votre article reçoit des commentaires, vous pourrez les voir ici et les modérer." + +#: wp-admin/edit-form-advanced.php:290 +msgid "Title — Enter a title for your post. After you enter a title, you’ll see the permalink below, which you can edit." +msgstr "Titre — Saisissez un titre pour votre article. Après avoir saisi le titre, un permalien s’affichera en dessous, que vous pourrez modifier à loisir." + +#. translators: %s: Featured image. +#: wp-admin/edit-form-advanced.php:380 +msgid "%s — This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the image as a post thumbnail on the home page, a custom header, etc." +msgstr "%s – Vous pouvez associer une image à votre publication, sans pour autant l’y insérer. Cela ne sert vraiment que si votre thème fait usage de cette fonctionnalité, sous la forme d’une miniature pour la page d’accueil, d’un en-tête personnalisé, etc." + +#: wp-admin/edit.php:255 +msgid "Hovering over a row in the posts list will display action links that allow you to manage your post. You can perform the following actions:" +msgstr "Passer la souris au-dessus d’une ligne de la liste des publications fera s’afficher des liens vous permettant de gérer la publication. Vous pouvez lancer les actions suivantes :" + +#: wp-admin/users.php:42 +msgid "You can customize the display of this screen in a number of ways:" +msgstr "Vous pouvez personnaliser l’affichage de cet écran de plusieurs manières :" + +#: wp-admin/edit.php:243 +msgid "You can hide/display columns based on your needs and decide how many posts to list per screen using the Screen Options tab." +msgstr "Vous pouvez afficher/masquer les colonnes en fonction de vos besoins, et décider du nombre de publications à afficher par écran à l’aide de l’onglet « Options de l’écran »." + +#: wp-admin/edit.php:246 +msgid "You can refine the list to show only posts in a specific category or from a specific month by using the dropdown menus above the posts list. Click the Filter button after making your selection. You also can refine the list by clicking on the post author, category or tag in the posts list." +msgstr "Vous pouvez affiner la liste pour qu’elle n’affiche que les articles d’une catégorie spécifique ou d’un mois donné, à l’aide du menu déroulant situé au-dessus de la liste. Cliquez sur le bouton « Filtrer » après avoir fait votre choix. Vous pouvez également affiner la liste en cliquant sur l’auteur d’un article, sa catégorie ou une étiquette." + +#: wp-admin/plugins.php:629 +msgid "Search Installed Plugins" +msgstr "Rechercher des extensions installées" + +#: wp-admin/nav-menus.php:665 +msgid "Your theme supports one menu. Select which menu you would like to use." +msgstr "Votre thème peut utiliser un menu. Sélectionnez le menu que vous voudriez utiliser." + +#: wp-admin/nav-menus.php:19 +msgid "Your theme does not support navigation menus or widgets." +msgstr "Le thème actuel n’accepte pas les menus de navigation ni les widgets." + +#: wp-admin/includes/import.php:196 wp-admin/tools.php:47 wp-admin/tools.php:72 +msgid "Categories and Tags Converter" +msgstr "Convertisseur de catégories et étiquettes" + +#: wp-admin/includes/nav-menu.php:506 wp-admin/includes/nav-menu.php:521 +msgid "Most Recent" +msgstr "Les plus récentes" + +#: wp-admin/export.php:209 wp-admin/export.php:256 wp-admin/export.php:296 +msgid "Start date:" +msgstr "Date de début :" + +#: wp-admin/includes/theme-install.php:105 +msgctxt "Theme Installer" +msgid "Tag" +msgstr "Étiquette" + +#: wp-admin/includes/plugin-install.php:332 +msgctxt "Plugin Installer" +msgid "Tag" +msgstr "Étiquette" + +#: wp-admin/includes/class-wp-comments-list-table.php:345 +#: wp-admin/comment.php:124 +msgctxt "comment" +msgid "Mark as Spam" +msgstr "Marquer comme indésirable" + +#: wp-admin/includes/media.php:2536 +msgctxt "verb" +msgid "Clear" +msgstr "Effacer" + +#: wp-admin/includes/class-custom-background.php:303 +msgid "Remove Background Image" +msgstr "Retirer l’image d’arrière-plan" + +#. translators: %s: Post title. +#. translators: %s: Link to post. +#: wp-admin/edit-comments.php:151 wp-admin/edit-comments.php:217 +msgid "Comments on “%s”" +msgstr "Commentaires sur « %s »" + +#: wp-admin/includes/nav-menu.php:1095 +msgid "Show advanced menu properties" +msgstr "Afficher les propriétés avancées du menu" + +#. translators: 1: Plugin version, 2: New version. +#. translators: 1: Theme version, 2: New version. +#: wp-admin/update-core.php:417 wp-admin/update-core.php:500 +msgid "You have version %1$s installed. Update to %2$s." +msgstr "Vous utilisez la version %1$s. Mettez à jour vers la version %2$s." + +#: wp-admin/includes/class-wp-debug-data.php:190 +#: wp-admin/includes/class-wp-debug-data.php:195 +#: wp-admin/includes/class-wp-debug-data.php:204 +#: wp-admin/includes/class-wp-debug-data.php:213 +#: wp-admin/includes/class-wp-debug-data.php:222 +#: wp-admin/includes/class-wp-debug-data.php:262 +#: wp-admin/includes/class-wp-debug-data.php:267 +#: wp-admin/includes/class-wp-debug-data.php:277 +#: wp-admin/includes/class-wp-debug-data.php:282 +msgid "Enabled" +msgstr "Activé" + +#: wp-admin/includes/class-wp-comments-list-table.php:351 +#: wp-admin/includes/class-wp-comments-list-table.php:679 +msgctxt "comment" +msgid "Not Spam" +msgstr "Non indésirable" + +#: wp-admin/includes/class-custom-background.php:318 +msgid "This will restore the original background image. You will not be able to restore any customizations." +msgstr "Ceci remettra en place l’image d’arrière-plan originale. Il ne vous sera pas possible de récupérer vos personnalisations." + +#: wp-admin/includes/dashboard.php:1444 +msgid "WordPress Blog" +msgstr "Blog WordPress" + +#: wp-admin/users.php:416 +msgid "Remove Users from Site" +msgstr "Supprimer des utilisateurs de ce site" + +#: wp-admin/user-edit.php:422 wp-admin/user-edit.php:424 +msgid "— No role for this site —" +msgstr "— Pas de rôle sur ce site —" + +#: wp-admin/includes/upgrade.php:631 +msgid "New WordPress Site" +msgstr "Nouveau site WordPress" + +#: wp-admin/includes/schema.php:410 +msgid "My Site" +msgstr "Mon site" + +#: wp-admin/includes/post.php:811 +msgid "Sorry, you are not allowed to create pages on this site." +msgstr "Désolé, vous n’avez pas l’autorisation de créer des pages sur ce site." + +#: wp-admin/includes/plugin.php:501 +msgid "Custom site inactive message." +msgstr "Message personnalisé de site inactif." + +#: wp-admin/includes/plugin.php:502 +msgid "Custom site suspended message." +msgstr "Message personnalisé de site suspendu." + +#: wp-admin/includes/plugin.php:500 +msgid "Custom site deleted message." +msgstr "Message personnalisé de site supprimé." + +#: wp-admin/includes/post.php:813 +msgid "Sorry, you are not allowed to create posts or drafts on this site." +msgstr "Désolé, vous n’avez pas l’autorisation de créer des articles ou des brouillons sur ce site." + +#: wp-admin/import.php:72 +msgid "If you have posts or comments in another system, WordPress can import those into this site. To get started, choose a system to import from below:" +msgstr "Si vous avez des articles ou des commentaires dans un autre système de site, WordPress peut les importer dans votre site actuel. Pour commencer, choisissez un système d’origine ci-dessous :" + +#: wp-admin/includes/nav-menu.php:437 wp-admin/includes/nav-menu.php:714 +msgid "No items." +msgstr "Aucune entrée." + +#. translators: %s: Host name. +#: wp-admin/includes/schema.php:1081 +msgid "The installer attempted to contact a random hostname (%s) on your domain." +msgstr "L’installateur a tenté de contacter un nom d’hôte au hasard (%s) sur votre domaine." + +#. translators: %s: Asterisk symbol (*). +#: wp-admin/includes/schema.php:1092 +msgid "To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a %s hostname record pointing at your web server in your DNS configuration tool." +msgstr "Pour utiliser la configuration en sous-domaine, il vous faut ajouter un enregistrement générique (joker) à vos enregistrements DNS. Cela signifie généralement ajouter un hôte %s pointant vers votre serveur dans votre outil de configuration DNS." + +#: wp-admin/nav-menus.php:248 +msgid "The menu item has been successfully deleted." +msgstr "L’élément du menu a bien été supprimé." + +#: wp-admin/includes/ajax-actions.php:1608 +msgid "Please provide a custom field name." +msgstr "Veuillez saisir un nom pour le champ personnalisé." + +#: wp-admin/includes/class-custom-background.php:299 +#: wp-admin/includes/class-custom-image-header.php:677 +msgid "Remove Image" +msgstr "Retirer l’image" + +#: wp-admin/includes/class-custom-background.php:348 +msgid "Display Options" +msgstr "Options d’affichage" + +#: wp-admin/users.php:530 +msgid "Other users have been removed." +msgstr "Les autres utilisateurs ont été supprimés." + +#: wp-admin/users.php:529 +msgid "You can't remove the current user." +msgstr "Vous ne pouvez pas supprimer l’utilisateur courant." + +#: wp-admin/users.php:445 +msgid "There are no valid users selected for removal." +msgstr "Aucun utilisateur valide n’est sélectionné pour la suppression." + +#: wp-admin/users.php:443 +msgid "Confirm Removal" +msgstr "Confirmer cette action" + +#: wp-admin/users.php:160 wp-admin/users.php:218 +msgid "User deletion is not allowed from this screen." +msgstr "La suppression d’un utilisateur n’est pas autorisée depuis cet écran." + +#: wp-admin/users.php:421 +msgid "You have specified these users for removal:" +msgstr "Vous avez choisi de supprimer ces utilisateurs :" + +#: wp-admin/includes/class-bulk-upgrader-skin.php:153 +msgid "Show details." +msgstr "Afficher les détails." + +#. translators: %s: Title of an update. +#: wp-admin/includes/class-bulk-upgrader-skin.php:47 +msgid "%s updated successfully." +msgstr "%s a bien été mis à jour." + +#: wp-admin/includes/user.php:523 +msgid "No thanks, do not remind me again" +msgstr "Non, ne pas me relancer à ce sujet" + +#: wp-admin/includes/upgrade.php:96 +msgid "Your chosen password." +msgstr "Le mot de passe que vous avez choisi." + +#: wp-admin/includes/user.php:522 +msgid "Yes, take me to my profile page" +msgstr "Oui, je veux aller sur mon profil maintenant" + +#: wp-admin/post.php:315 wp-admin/post.php:319 wp-admin/upload.php:195 +#: wp-admin/edit.php:161 wp-admin/edit.php:165 +msgid "Error in deleting." +msgstr "Erreur pendant la suppression." + +#: wp-admin/post.php:250 wp-admin/upload.php:155 wp-admin/edit.php:111 +msgid "Sorry, you are not allowed to move this item to the Trash." +msgstr "Désolé, vous n’avez pas l’autorisation de déplacer cet élément dans la corbeille." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:290 +msgid "%s comment moved to the Trash." +msgid_plural "%s comments moved to the Trash." +msgstr[0] "%s commentaire déplacé dans la corbeille." +msgstr[1] "%s commentaires déplacés dans la corbeille." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:295 +msgid "%s comment restored from the Trash." +msgid_plural "%s comments restored from the Trash." +msgstr[0] "%s commentaire récupéré depuis la corbeille." +msgstr[1] "%s commentaires récupérés depuis la corbeille." + +#: wp-admin/post.php:261 wp-admin/upload.php:159 wp-admin/edit.php:120 +msgid "Error in moving to Trash." +msgstr "Erreur lors du déplacement dans la corbeille." + +#: wp-admin/post.php:287 wp-admin/upload.php:176 wp-admin/edit.php:139 +msgid "Sorry, you are not allowed to restore this item from the Trash." +msgstr "Désolé, vous n’avez pas l’autorisation de récupérer cet élément depuis la corbeille." + +#: wp-admin/post.php:291 wp-admin/upload.php:180 wp-admin/edit.php:143 +msgid "Error in restoring from Trash." +msgstr "Erreur pendant la récupération depuis la corbeille." + +#: wp-admin/update-core.php:458 +msgid "The following themes have new versions available. Check the ones you want to update and then click “Update Themes”." +msgstr "Les thèmes suivants disposent d’une nouvelle version. Cochez ceux que vous voulez mettre à jour, puis cliquez sur « Mettre à jour les thèmes »." + +#: wp-admin/user-new.php:306 +msgid "Invitation email sent to user. A confirmation link must be clicked for them to be added to your site." +msgstr "L’invitation a été envoyée à l’utilisateur sur son adresse de messagerie. Il devra cliquer sur un lien de confirmation pour être ajouté à votre site." + +#: wp-admin/user-new.php:318 +msgid "That user is already a member of this site." +msgstr "Cet utilisateur est déjà membre de ce site." + +#: wp-admin/user-new.php:309 +msgid "User has been added to your site." +msgstr "L’utilisateur a été ajouté à votre site." + +#: wp-admin/update-core.php:317 +msgid "The following plugins have new versions available. Check the ones you want to update and then click “Update Plugins”." +msgstr "Les extensions suivantes disposent d’une nouvelle version. Cochez celles que vous voulez mettre à jour, puis cliquez sur « Mettre à jour les extensions »." + +#: wp-admin/includes/class-custom-background.php:304 +msgid "This will remove the background image. You will not be able to restore any customizations." +msgstr "Ceci supprimera l’image d’arrière-plan. Il ne vous sera pas possible de rétablir vos personnalisations." + +#. translators: %s: Network title. +#: wp-admin/includes/class-wp-themes-list-table.php:132 +msgid "Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes." +msgstr "Vous n’avez accès qu’au thème déjà en place. Contactez l’administrateur de %s pour obtenir des informations sur l’accès à d’autres thèmes." + +#: wp-admin/includes/file.php:30 +msgid "Tag Template" +msgstr "Modèle pour étiquette" + +#: wp-admin/includes/file.php:54 +msgid "Visual Editor Stylesheet" +msgstr "Feuille de style de l’éditeur visuel" + +#: wp-admin/includes/file.php:27 +msgid "Author Template" +msgstr "Modèle pour un auteur" + +#: wp-admin/edit-form-advanced.php:202 +msgid "Page saved." +msgstr "Page enregistrée." + +#. translators: %s: Plugin name. +#. translators: %s: Plugin name and version. +#. translators: %s: Importer name. +#: wp-admin/includes/class-wp-plugins-list-table.php:918 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:618 +#: wp-admin/import.php:204 +msgid "More information about %s" +msgstr "Plus d’informations à propos de %s" + +#: wp-admin/user-edit.php:191 +msgid "This user has super admin privileges." +msgstr "Cet utilisateur possède les privilèges de super-admin." + +#: wp-admin/install.php:152 wp-admin/user-edit.php:191 +msgid "Important:" +msgstr "Important :" + +#: wp-admin/user-edit.php:436 +msgid "Grant this user super admin privileges for the Network." +msgstr "Donner les privilèges de super-admin à cet utilisateur pour le réseau." + +#. translators: %s: Theme version. +#: wp-admin/includes/class-wp-theme-install-list-table.php:308 +#: wp-admin/includes/class-wp-theme-install-list-table.php:466 +msgid "Update to version %s" +msgstr "Mettre à jour vers la version %s" + +#: wp-admin/setup-config.php:286 +msgid "Error: \"Table Prefix\" can only contain numbers, letters, and underscores." +msgstr "Erreur : « Préfixe de Table » ne doit contenir que des chiffres, des lettres ou le caractère tiret bas." + +#: wp-admin/user-edit.php:406 +msgid "Usernames cannot be changed." +msgstr "Les identifiants ne peuvent être modifiés." + +#: wp-admin/options-reading.php:156 +msgid "items" +msgstr "éléments" + +#: wp-admin/nav-menus.php:269 +msgid "The menu has been successfully deleted." +msgstr "Le menu a bien été supprimé." + +#: wp-admin/options-reading.php:43 wp-admin/options-reading.php:178 +#: wp-admin/options-reading.php:179 wp-admin/install.php:183 +#: wp-admin/install.php:186 +msgid "Site Visibility" +msgstr "Visibilité du site" + +#: wp-admin/options-general.php:71 +msgid "In a few words, explain what this site is about." +msgstr "En quelques mots, décrivez la raison d’être de ce site." + +#: wp-admin/nav-menus.php:911 wp-admin/nav-menus.php:1027 +msgid "Save Menu" +msgstr "Enregistrer le menu" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:212 +msgid "CSS Classes (optional)" +msgstr "Classes CSS (facultatives)" + +#: wp-admin/includes/nav-menu.php:1097 +msgid "Link Target" +msgstr "Cible du lien" + +#. translators: 1: Theme name, 2: Number of the theme, 3: Total number of +#. themes being updated. +#: wp-admin/includes/class-bulk-theme-upgrader-skin.php:24 +msgid "Updating Theme %1$s (%2$d/%3$d)" +msgstr "Mise à jour du thème %1$s (%2$d/%3$d)" + +#: wp-admin/includes/schema.php:1096 +msgid "You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message." +msgstr "Vous pouvez toujours utiliser votre site, mais tout sous-domaine créé pourrait ne pas être accessible. Si vous êtes sûr de votre configuration DNS, ignorez ce message." + +#. translators: %s: Error message. +#: wp-admin/includes/schema.php:1086 +msgid "This resulted in an error message: %s" +msgstr "Cela a abouti à ce message d’erreur : %s" + +#: wp-admin/includes/schema.php:984 +msgid "You must provide a valid email address." +msgstr "Vous devez saisir une adresse de messagerie valide." + +#: wp-admin/includes/schema.php:975 wp-admin/includes/schema.php:979 +msgid "The network already exists." +msgstr "Le réseau existe déjà." + +#: wp-admin/includes/schema.php:968 +msgid "You must provide a name for your network of sites." +msgstr "Vous devez fournir un nom pour votre réseau de sites." + +#: wp-admin/includes/schema.php:965 +msgid "You must provide a domain name." +msgstr "Vous devez fournir un nom de domaine." + +#: wp-admin/includes/user.php:519 +msgid "Notice:" +msgstr "Avertissement :" + +#: wp-admin/edit-form-advanced.php:538 +msgid "Get Shortlink" +msgstr "Obtenir le lien court" + +#. translators: %s: Title of an update. +#: wp-admin/includes/class-bulk-upgrader-skin.php:45 +msgid "The update of %s failed." +msgstr "La mise à jour de %s a échoué." + +#. translators: 1: Plugin name, 2: Number of the plugin, 3: Total number of +#. plugins being updated. +#: wp-admin/includes/class-bulk-plugin-upgrader-skin.php:24 +msgid "Updating Plugin %1$s (%2$d/%3$d)" +msgstr "Mise à jour de l’extension %1$s (%2$d/%3$d)" + +#: wp-admin/includes/upgrade.php:100 +msgid "User already exists. Password inherited." +msgstr "L’utilisateur existe déjà et a hérité du mot de passe." + +#: wp-admin/includes/upgrade.php:117 +msgid "The password you chose during installation." +msgstr "Le mot de passe que vous avez choisi pendant l’installation." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Minimum required MySQL version +#. number, 5: Current PHP version number, 6: Current MySQL version number. +#: wp-admin/update-core.php:100 wp-admin/upgrade.php:98 +msgid "You cannot update because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s." +msgstr "Cette mise à jour ne peut être installée, car WordPress %2$s nécessite une version de PHP égale ou supérieure à %3$s, et une version de MySQL égale ou supérieure à %4$s. Votre hébergement utilise PHP version %5$s et MySQL version %6$s." + +#: wp-admin/update-core.php:320 wp-admin/update-core.php:437 +#: wp-admin/update-core.php:854 wp-admin/update-core.php:858 +#: wp-admin/plugins.php:142 +msgid "Update Plugins" +msgstr "Mettre à jour les extensions" + +#: wp-admin/update-core.php:584 +msgid "Update WordPress" +msgstr "Mettre à jour WordPress" + +#: wp-admin/includes/update-core.php:1409 +#: wp-admin/includes/class-wp-automatic-updater.php:380 +#: wp-admin/update-core.php:631 +msgid "WordPress updated successfully" +msgstr "WordPress a bien été mis à jour" + +#: wp-admin/update-core.php:699 wp-admin/update-core.php:742 +msgid "WordPress Updates" +msgstr "Mises à jour de WordPress" + +#: wp-admin/includes/class-walker-nav-menu-edit.php:175 +msgid "Edit menu item" +msgstr "Modifier un élément du menu" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:472 +msgid "Drop-in (%s)" +msgid_plural "Drop-ins (%s)" +msgstr[0] "Avancée (%s)" +msgstr[1] "Avancées (%s)" + +#: wp-admin/options-general.php:295 +msgid "This timezone does not observe daylight saving time." +msgstr "Ce fuseau horaire n’a pas d’heure d’été." + +#: wp-admin/options-general.php:272 +msgid "This timezone is currently in daylight saving time." +msgstr "Ce fuseau horaire est actuellement à l’heure d’été." + +#: wp-admin/includes/nav-menu.php:511 wp-admin/includes/nav-menu.php:796 +msgid "View All" +msgstr "Afficher tout" + +#: wp-admin/includes/ajax-actions.php:1503 +msgid "Menu Item" +msgstr "Élément du menu" + +#: wp-admin/nav-menus.php:352 wp-admin/nav-menus.php:362 +msgid "Please enter a valid menu name." +msgstr "Veuillez saisir un nom de menu valide." + +#: wp-admin/about.php:275 +msgid "Go to Dashboard" +msgstr "Aller sur le tableau de bord" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:464 +msgid "Must-Use (%s)" +msgid_plural "Must-Use (%s)" +msgstr[0] "Indispensable (%s)" +msgstr[1] "Indispensables (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:652 +msgid "Inactive:" +msgstr "Inactif :" + +#: wp-admin/plugins.php:366 +msgid "Yes, delete these files and data" +msgstr "Oui, supprimer ces fichiers et données" + +#: wp-admin/plugins.php:351 +msgid "Are you sure you want to delete these files and data?" +msgstr "Confirmez-vous la suppression de ces fichiers et données ?" + +#: wp-admin/plugins.php:321 +msgid "Delete Plugin" +msgstr "Supprimer l’extension" + +#: wp-admin/plugins.php:325 +msgid "You are about to remove the following plugin:" +msgstr "Vous êtes sur le point de supprimer l’extension suivante :" + +#: wp-admin/options-general.php:113 wp-admin/network/settings.php:164 +msgid "This address is used for admin purposes. If you change this, we will send you an email at your new address to confirm it. The new address will not become active until confirmed." +msgstr "Cette adresse est utilisée à des fins d’administration. Si vous la changez, nous vous enverrons un e-mail à la nouvelle adresse afin de la confirmer. La nouvelle adresse ne sera pas active tant que vous ne l’aurez pas confirmée." + +#. translators: 1: URL to WordPress release notes, 2: WordPress version number, +#. 3: Minimum required PHP version number, 4: Minimum required MySQL version +#. number, 5: Current PHP version number, 6: Current MySQL version number. +#: wp-admin/install.php:253 +msgid "You cannot install because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s." +msgstr "Vous ne pouvez pas installer WordPress %2$s, car cette version nécessite une version de PHP égale ou supérieure à la %3$s, et une version de MySQL égale ou supérieure à la %4$s. Votre hébergement utilise PHP version %5$s et MySQL version %6$s." + +#: wp-admin/includes/plugin.php:488 +msgid "Advanced caching plugin." +msgstr "Extension de cache avancée." + +#: wp-admin/includes/plugin.php:489 +msgid "Custom database class." +msgstr "Classe personnalisée de connexion à la base de données." + +#. translators: %s: Theme name. +#. translators: %s: Plugin name. +#: wp-admin/includes/class-wp-theme-install-list-table.php:326 +#: wp-admin/includes/deprecated.php:1384 wp-admin/theme-install.php:298 +msgid "Install %s" +msgstr "Installer %s" + +#: wp-admin/includes/file.php:815 +msgid "File is empty. Please upload something more substantial." +msgstr "Le fichier est vide. Veuillez téléverser quelque chose de plus substantiel." + +#: wp-admin/includes/plugin.php:490 +msgid "Custom database error message." +msgstr "Message personnalisé pour l’erreur de base de données." + +#: wp-admin/includes/plugin.php:492 +msgid "Custom maintenance message." +msgstr "Message personnalisé pour la maintenance." + +#: wp-admin/includes/plugin.php:493 +msgid "External object cache." +msgstr "Cache d’objet externe." + +#: wp-admin/includes/plugin.php:499 +msgid "Executed before Multisite is loaded." +msgstr "Exécuté avant que la fonctionnalité multisites ne soit chargée." + +#: wp-admin/edit-comments.php:314 +msgid "This comment is already marked as spam." +msgstr "Ce commentaire est déjà marqué comme indésirable." + +#: wp-admin/edit-comments.php:311 +msgid "View Trash" +msgstr "Voir la corbeille" + +#: wp-admin/edit-comments.php:311 +msgid "This comment is already in the Trash." +msgstr "Ce commentaire est déjà marqué comme indésirable." + +#: wp-admin/comment.php:150 +msgid "This comment is currently in the Trash." +msgstr "Ce commentaire est actuellement dans la corbeille." + +#: wp-admin/edit-comments.php:308 +msgid "This comment is already approved." +msgstr "Ce commentaire est déjà approuvé." + +#: wp-admin/comment.php:144 +msgid "This comment is currently approved." +msgstr "Ce commentaire est actuellement approuvé." + +#: wp-admin/comment.php:88 +msgid "Moderate Comment" +msgstr "Modérer le commentaire" + +#: wp-admin/comment.php:147 +msgid "This comment is currently marked as spam." +msgstr "Ce commentaire est actuellement marqué comme indésirable." + +#: wp-admin/export.php:186 +msgid "Categories:" +msgstr "Catégories :" + +#: wp-admin/widgets.php:129 +msgid "Drag widgets here to remove them from the sidebar but keep their settings." +msgstr "Glissez ici les widgets que vous voulez retirer de la colonne latérale, tout en conservant leurs réglages actuels." + +#: wp-admin/widgets.php:438 wp-admin/widgets.php:441 +msgid "Available Widgets" +msgstr "Widgets disponibles" + +#: wp-admin/widgets.php:379 +msgid "Error in displaying the widget settings form." +msgstr "Une erreur est survenue lors de l’affichage du formulaire de réglage du widget." + +#: wp-admin/includes/misc.php:1220 wp-admin/includes/post.php:1941 +#: wp-admin/widgets.php:378 +msgid "Error while saving." +msgstr "Erreur lors de la sauvegarde." + +#: wp-admin/widgets.php:357 +msgid "Save Widget" +msgstr "Enregistrer le widget" + +#: wp-admin/widgets.php:315 +msgid "Position" +msgstr "Position" + +#: wp-admin/widgets.php:313 +msgid "Select both the sidebar for this widget and the position of the widget in that sidebar." +msgstr "Sélectionnez à la fois la colonne latérale pour ce widget, et la position du widget dans cette colonne latérale." + +#. translators: %s: Widget name. +#: wp-admin/widgets.php:298 +msgid "Widget %s" +msgstr "Widget %s" + +#: wp-admin/widgets.php:126 +msgid "Inactive Widgets" +msgstr "Widgets désactivés" + +#: wp-admin/includes/class-wp-users-list-table.php:300 +msgid "Change" +msgstr "Changer" + +#: wp-admin/includes/class-wp-users-list-table.php:294 +#: wp-admin/includes/class-wp-users-list-table.php:296 +msgid "Change role to…" +msgstr "Changer de rôle pour…" + +#. translators: 1: User role name, 2: Number of users. +#: wp-admin/includes/class-wp-users-list-table.php:227 +#: wp-admin/includes/class-wp-users-list-table.php:246 +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#: wp-admin/users.php:523 +msgid "Other users have been deleted." +msgstr "Les autres utilisateurs ont été supprimés." + +#: wp-admin/users.php:522 +msgid "You can’t delete the current user." +msgstr "Vous ne pouvez pas supprimer l’utilisateur en cours d’utilisation." + +#: wp-admin/users.php:519 +msgid "Other user roles have been changed." +msgstr "Les rôles des autres utilisateurs ont été modifiés." + +#: wp-admin/users.php:518 +msgid "The current user’s role must have user editing capabilities." +msgstr "L’utilisateur actuel doit avoir un rôle lui permettant de modifier les utilisateurs." + +#: wp-admin/users.php:495 +msgid "New user created." +msgstr "Le nouvel utilisateur a été créé." + +#: wp-admin/users.php:347 +msgid "There are no valid users selected for deletion." +msgstr "Aucun utilisateur valide n’est sélectionné pour la suppression." + +#: wp-admin/users.php:274 +msgid "Delete Users" +msgstr "Supprimer des utilisateurs" + +#: wp-admin/user-new.php:424 wp-admin/user-new.php:565 +msgid "Skip Confirmation Email" +msgstr "Passer la confirmation par e-mail" + +#: wp-admin/user-new.php:303 +msgid "Invitation email sent to new user. A confirmation link must be clicked before their account is created." +msgstr "Envoi d’un message d’invitation au nouvel utilisateur. Un lien de confirmation devra d’abord être cliqué avant la création du compte." + +#. translators: Joining confirmation notification email subject. %s: Site +#. title. +#: wp-admin/user-new.php:130 +msgid "[%s] Joining Confirmation" +msgstr "[%s] Confirmation d’inscription" + +#: wp-admin/user-edit.php:777 +msgid "Update User" +msgstr "Mettre à jour l’utilisateur" + +#: wp-admin/user-edit.php:777 +msgid "Update Profile" +msgstr "Mettre à jour le profil" + +#: wp-admin/user-edit.php:746 +msgid "Additional Capabilities" +msgstr "Permissions supplémentaires" + +#: wp-admin/user-edit.php:652 +msgid "Type your new password again." +msgstr "Veuillez saisir une deuxième fois votre mot de passe." + +#: wp-admin/user-edit.php:628 +msgid "New Password" +msgstr "Nouveau mot de passe" + +#: wp-admin/user-edit.php:573 +msgid "Share a little biographical information to fill out your profile. This may be shown publicly." +msgstr "Donnez quelques informations biographiques pour remplir votre profil. Ceci peut être affiché publiquement." + +#: wp-admin/user-edit.php:571 +msgid "Biographical Info" +msgstr "Renseignements biographiques" + +#: wp-admin/user-edit.php:567 +msgid "About the user" +msgstr "À propos de l’utilisateur" + +#: wp-admin/user-edit.php:567 +msgid "About Yourself" +msgstr "À propos de vous" + +#: wp-admin/user-edit.php:498 +msgid "Contact Info" +msgstr "Informations de contact" + +#: wp-admin/user-edit.php:459 +msgid "Display name publicly as" +msgstr "Nom à afficher publiquement" + +#: wp-admin/user-edit.php:454 +msgid "Nickname" +msgstr "Pseudonyme" + +#: wp-admin/user-new.php:494 wp-admin/user-edit.php:449 +msgid "Last Name" +msgstr "Nom" + +#: wp-admin/user-new.php:490 wp-admin/user-edit.php:444 +msgid "First Name" +msgstr "Prénom" + +#: wp-admin/user-edit.php:321 +msgid "Enable keyboard shortcuts for comment moderation." +msgstr "Activer les raccourcis clavier pour la modération de commentaires." + +#: wp-admin/includes/misc.php:949 wp-admin/user-edit.php:295 +msgid "Admin Color Scheme" +msgstr "Couleurs de l’interface d’administration" + +#: wp-admin/user-edit.php:264 +msgid "Disable the visual editor when writing" +msgstr "Désactiver l’éditeur visuel pour écrire" + +#: wp-admin/user-edit.php:261 +msgid "Visual Editor" +msgstr "Éditeur visuel" + +#: wp-admin/user-edit.php:256 +msgid "Personal Options" +msgstr "Options personnelles" + +#: wp-admin/user-edit.php:198 +msgid "User updated." +msgstr "Utilisateur mis à jour." + +#: wp-admin/includes/user.php:560 +msgid "Always use https when visiting the admin" +msgstr "Toujours utiliser https lors de l’utilisation de l’administration" + +#: wp-admin/includes/user.php:559 +msgid "Use https" +msgstr "Utiliser https" + +#: wp-admin/user-new.php:312 wp-admin/users.php:508 +#: wp-admin/network/user-new.php:92 +msgid "Edit user" +msgstr "Modifier l’utilisateur" + +#: wp-admin/upload.php:344 wp-admin/upload.php:357 +msgid "Media file restored from the Trash." +msgstr "Fichier média récupéré depuis la corbeille." + +#: wp-admin/upload.php:331 wp-admin/upload.php:356 +msgid "Media file moved to the Trash." +msgstr "Fichier média déplacé dans la corbeille." + +#: wp-admin/upload.php:319 wp-admin/upload.php:354 +msgid "Media file permanently deleted." +msgstr "Fichier média définitivement supprimé." + +#: wp-admin/edit-tags.php:137 wp-admin/options.php:78 +msgid "Sorry, you are not allowed to delete these items." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer ces éléments." + +#: wp-admin/upgrade.php:76 +msgid "Your WordPress database is already up to date!" +msgstr "Votre base de données WordPress est déjà à jour !" + +#. translators: %s: File name. +#: wp-admin/update.php:278 +msgid "Installing Theme from uploaded file: %s" +msgstr "Installation du thème à partir du fichier : %s" + +#: wp-admin/update.php:271 wp-admin/theme-install.php:58 +#: wp-admin/theme-install.php:151 wp-admin/theme-install.php:153 +msgid "Upload Theme" +msgstr "Téléverser un thème" + +#. translators: %s: Theme name and version. +#: wp-admin/update.php:251 +msgid "Installing Theme: %s" +msgstr "Installation du thème : %s" + +#. translators: %s: File name. +#: wp-admin/update.php:158 +msgid "Installing Plugin from uploaded file: %s" +msgstr "Installation de l’extension à partir du fichier : %s" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:114 +#: wp-admin/update.php:152 wp-admin/plugin-install.php:138 +msgid "Upload Plugin" +msgstr "Téléverser une extension" + +#. translators: %s: Plugin name and version. +#: wp-admin/update.php:128 +msgid "Installing Plugin: %s" +msgstr "Extension en cours d’installation : %s" + +#: wp-admin/update.php:91 +msgid "Plugin failed to reactivate due to a fatal error." +msgstr "L’extension n’a pu être réactivée suite à une erreur fatale." + +#: wp-admin/update.php:87 +msgid "Plugin reactivated successfully." +msgstr "L’extension a bien été réactivée." + +#: wp-admin/update.php:85 +msgid "Plugin Reactivation" +msgstr "Réactivation d’extension" + +#: wp-admin/includes/class-wp-automatic-updater.php:378 +#: wp-admin/update-core.php:625 +msgid "Installation Failed" +msgstr "Échec de l’installation" + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:349 wp-admin/update-core.php:358 +msgid "Compatibility with WordPress %s: Unknown" +msgstr "Compatibilité avec WordPress %s : inconnue" + +#. translators: %s: WordPress version. +#: wp-admin/update-core.php:346 wp-admin/update-core.php:355 +msgid "Compatibility with WordPress %s: 100%% (according to its author)" +msgstr "Compatibilité avec WordPress %s : 100%% (selon l’auteur)" + +#: wp-admin/update-core.php:193 +msgid "Hide hidden updates" +msgstr "Masquer les mises à jour cachées" + +#: wp-admin/update-core.php:192 wp-admin/update-core.php:203 +msgid "Show hidden updates" +msgstr "Afficher les mises à jour cachées" + +#: wp-admin/update-core.php:160 +msgid "Bring back this update" +msgstr "Réafficher cette mise à jour" + +#: wp-admin/update-core.php:158 +msgid "Hide this update" +msgstr "Masquer cette mise à jour" + +#: wp-admin/themes.php:384 +msgid "Broken Themes" +msgstr "Thèmes endommagés" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-themes-list-table.php:232 +msgid "" +"You are about to delete this theme '%s'\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Vous êtes sur le point de supprimer le thème « %s ».\n" +"« Annuler » pour arrêter, « OK » pour supprimer." + +#: wp-admin/includes/theme.php:725 wp-admin/themes.php:551 +msgid "Current Theme" +msgstr "Thème actuel" + +#: wp-admin/themes.php:217 wp-admin/network/themes.php:306 +msgid "Theme deleted." +msgstr "Thème supprimé." + +#: wp-admin/theme-editor.php:227 +msgid "Select theme to edit:" +msgstr "Sélectionnez le thème à modifier :" + +#: wp-admin/theme-editor.php:21 +msgid "Edit Themes" +msgstr "Modifier les thèmes" + +#: wp-admin/includes/theme.php:779 wp-admin/themes.php:584 +msgid "Tags:" +msgstr "Étiquettes :" + +#. translators: %s: Post title. +#: wp-admin/revision.php:98 +msgid "Compare Revisions of “%s”" +msgstr "Comparer les révisions de « %s »" + +#: wp-admin/post.php:143 +msgid "You can’t edit this item because it is in the Trash. Please restore it and try again." +msgstr "Vous ne pouvez pas modifier ce contenu, car il est dans la corbeille. Sortez-l’en, puis réessayez." + +#: wp-admin/edit-tags.php:173 wp-admin/includes/post.php:1947 +#: wp-admin/includes/class-wp-screen.php:295 wp-admin/async-upload.php:49 +#: wp-admin/post.php:20 wp-admin/post.php:47 wp-admin/post.php:139 +#: wp-admin/term.php:43 wp-admin/media-upload.php:47 +msgid "Sorry, you are not allowed to edit this item." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier cet élément." + +#: wp-admin/edit-tags.php:160 wp-admin/edit-tags.php:180 wp-admin/post.php:127 +#: wp-admin/term.php:31 +msgid "You attempted to edit an item that doesn’t exist. Perhaps it was deleted?" +msgstr "Vous tentez de modifier un contenu qui n’existe pas. Peut-être a-t-il été supprimé ?" + +#: wp-admin/includes/class-wp-plugins-list-table.php:357 +msgid "No plugins found." +msgstr "Aucune extension trouvée." + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:456 +msgid "Inactive (%s)" +msgid_plural "Inactive (%s)" +msgstr[0] "Désactivée (%s)" +msgstr[1] "Désactivées (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:448 +msgid "Recently Active (%s)" +msgid_plural "Recently Active (%s)" +msgstr[0] "Récemment désactivée (%s)" +msgstr[1] "Récemment désactivées (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:440 +msgid "Active (%s)" +msgid_plural "Active (%s)" +msgstr[0] "Activée (%s)" +msgstr[1] "Activées (%s)" + +#. translators: %s: Number of plugins. +#: wp-admin/includes/class-wp-plugins-list-table.php:431 +msgctxt "plugins" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Toutes (%s)" +msgstr[1] "Toutes (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:566 +msgid "Clear List" +msgstr "Vider la liste" + +#: wp-admin/includes/class-wp-plugins-list-table.php:926 +msgid "Visit plugin site" +msgstr "Aller sur le site de l’extension" + +#: wp-admin/includes/class-wp-plugins-list-table.php:523 +#: wp-admin/includes/class-wp-plugins-list-table.php:680 +msgid "Network Deactivate" +msgstr "Désactiver du réseau" + +#. translators: %s: Error message. +#: wp-admin/plugins.php:555 +msgid "Plugin could not be deleted due to an error: %s" +msgstr "L’extension n’a pu être supprimée suite à une erreur fatale : %s" + +#: wp-admin/plugins.php:522 +msgid "Plugin could not be activated because it triggered a fatal error." +msgstr "L’extension n’a pas pu être activée, car elle a déclenché une erreur fatale." + +#. translators: %s: WP_PLUGIN_DIR constant value. +#: wp-admin/plugins.php:463 +msgid "If something goes wrong with a plugin and you can’t use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated." +msgstr "Si une extension ne fonctionne pas correctement et que vous ne pouvez plus utiliser WordPress, supprimez ou renommez son fichier dans le répertoire %s et elle sera automatiquement désactivée." + +#: wp-admin/plugins.php:446 +msgid "Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here." +msgstr "Les extensions étendent les fonctionnalités de WordPress. Une fois une extension installée, vous pouvez l’activer ou la désactiver ici." + +#: wp-admin/plugins.php:372 +msgid "No, return me to the plugin list" +msgstr "Non, retourner à la liste des extensions" + +#: wp-admin/plugins.php:366 +msgid "Yes, delete these files" +msgstr "Oui, supprimer ces fichiers" + +#: wp-admin/plugins.php:353 +msgid "Are you sure you want to delete these files?" +msgstr "Confirmez-vous la suppression de ces fichiers ?" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:108 +msgctxt "Plugin Installer" +msgid "Popular" +msgstr "Populaires" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:107 +msgctxt "Plugin Installer" +msgid "Featured" +msgstr "Mises en avant" + +#: wp-admin/theme-editor.php:316 wp-admin/plugin-editor.php:287 +msgid "Update File" +msgstr "Mettre à jour le fichier" + +#: wp-admin/theme-editor.php:295 wp-admin/plugin-editor.php:272 +msgid "Documentation:" +msgstr "Documentation :" + +#: wp-admin/plugin-editor.php:242 +msgid "Plugin Files" +msgstr "Fichiers de l’extension" + +#: wp-admin/plugin-editor.php:219 +msgid "Select plugin to edit:" +msgstr "Sélectionnez l’extension à modifier :" + +#: wp-admin/includes/ajax-actions.php:4684 wp-admin/theme-editor.php:191 +#: wp-admin/plugin-editor.php:184 +msgid "File edited successfully." +msgstr "Le fichier a bien été modifié." + +#: wp-admin/includes/file.php:481 wp-admin/plugin-editor.php:116 +msgid "Files of this type are not editable." +msgstr "Les fichiers de ce type ne sont pas éditables." + +#: wp-admin/plugin-editor.php:21 +msgid "Edit Plugins" +msgstr "Modifier les extensions" + +#: wp-admin/options.php:322 +msgid "All Settings" +msgstr "Toutes les options" + +#: wp-admin/options-writing.php:44 wp-admin/options-writing.php:201 +msgid "Update Services" +msgstr "Services de mise à jour" + +#: wp-admin/options-writing.php:172 +msgid "Default Mail Category" +msgstr "Catégorie par défaut des articles envoyés par e-mail" + +#: wp-admin/options-writing.php:162 +msgid "Login Name" +msgstr "Identifiant" + +#: wp-admin/options-writing.php:157 +msgid "Port" +msgstr "Port" + +#: wp-admin/options-writing.php:155 +msgid "Mail Server" +msgstr "Serveur de messagerie" + +#. translators: 1, 2, 3: Examples of random email addresses. +#: wp-admin/options-writing.php:145 +msgid "To post to WordPress by email you must set up a secret email account with POP3 access. Any mail received at this address will be posted, so it’s a good idea to keep this address very secret. Here are three random strings you could use: %1$s, %2$s, %3$s." +msgstr "Pour publier dans WordPress par e-mail, vous devez définir un compte de messagerie secret avec un accès POP3. Tout message reçu à cette adresse sera publié. Il vaut donc mieux garder cette adresse à l’abri des regards indiscrets. Voici trois chaînes aléatoires que vous pourriez utiliser : %1$s, %2$s, %3$s." + +#: wp-admin/options-writing.php:140 +msgid "Post via email" +msgstr "Publier par e-mail" + +#: wp-admin/options-writing.php:112 +msgid "Default Link Category" +msgstr "Catégorie par défaut des liens" + +#: wp-admin/options-writing.php:78 +msgid "Default Post Category" +msgstr "Catégorie par défaut des articles" + +#: wp-admin/options-writing.php:73 +msgid "WordPress should correct invalidly nested XHTML automatically" +msgstr "WordPress doit automatiquement corriger l’imbrication XHTML erronée" + +#: wp-admin/options-writing.php:72 +msgid "Convert emoticons like :-) and :-P to graphics on display" +msgstr "Convertir les émoticônes, comme :-) et :-P, en images lors de l’affichage" + +#: wp-admin/options-writing.php:16 +msgid "Writing Settings" +msgstr "Options d’écriture" + +#: wp-admin/options-reading.php:66 +msgid "Encoding for pages and feeds" +msgstr "Codage pour les pages et les flux RSS" + +#: wp-admin/options-reading.php:163 +msgid "Summary" +msgstr "L’extrait" + +#: wp-admin/options-reading.php:162 +msgid "Full text" +msgstr "Le texte complet" + +#: wp-admin/options-reading.php:155 +msgid "Syndication feeds show the most recent" +msgstr "Les flux de syndication affichent les derniers" + +#: wp-admin/options-reading.php:149 +msgid "Blog pages show at most" +msgstr "Les pages du site doivent afficher au plus" + +#: wp-admin/options-reading.php:140 +msgid "Warning: these pages should not be the same!" +msgstr "Avertissement : ces pages ne devraient pas être les mêmes !" + +#. translators: %s: Select field to choose the page for posts. +#: wp-admin/options-reading.php:125 +msgid "Posts page: %s" +msgstr "Page des articles : %s" + +#. translators: %s: URL to Pages screen. +#: wp-admin/options-reading.php:97 +msgid "A static page (select below)" +msgstr "Une page statique (choisir ci-dessous)" + +#: wp-admin/options-reading.php:16 +msgid "Reading Settings" +msgstr "Options de lecture" + +#: wp-admin/options-privacy.php:115 +msgid "Privacy Settings" +msgstr "Réglages de confidentialité" + +#. translators: %s: web.config +#: wp-admin/options-permalink.php:392 +msgid "If you temporarily make your site’s root directory writable for us to generate the %s file automatically, do not forget to revert the permissions after the file has been created." +msgstr "Si vous rendez temporairement le dossier racine accessible en écriture pour que nous y générions directement le fichier %s, n’oubliez surtout pas de remettre les droits originaux en place une fois que les règles ont été enregistrées." + +#. translators: %s: web.config +#: wp-admin/options-permalink.php:367 +msgid "If you temporarily make your %s file writable for us to generate rewrite rules automatically, do not forget to revert the permissions after rule has been saved." +msgstr "Si vous rendez le fichier %s accessible en écriture afin de générer automatiquement les règles de réécriture, n’oubliez surtout pas de remettre les droits originaux en place une fois que les règles ont été enregistrées." + +#: wp-admin/options-permalink.php:331 +msgid "Tag base" +msgstr "Préfixe des étiquettes" + +#. translators: Prefix for category permalinks. +#: wp-admin/options-permalink.php:327 +msgid "Category base" +msgstr "Préfixe des catégories" + +#: wp-admin/options-permalink.php:317 +msgid "Optional" +msgstr "Facultatif" + +#: wp-admin/options-permalink.php:244 +msgid "Custom Structure" +msgstr "Structure personnalisée" + +#: wp-admin/options-permalink.php:234 +msgid "Numeric" +msgstr "Numérique" + +#: wp-admin/options-permalink.php:230 +msgid "Month and name" +msgstr "Mois et titre" + +#: wp-admin/options-permalink.php:226 +msgid "Day and name" +msgstr "Date et titre" + +#: wp-admin/options-permalink.php:150 +msgid "Permalink structure updated." +msgstr "Structure des permaliens enregistrée." + +#. translators: %s: web.config +#: wp-admin/options-permalink.php:162 +msgid "Permalink structure updated. Remove write access on %s file now!" +msgstr "La structure des permaliens a été mise à jour. Retirez les droits d’accès au fichier %s dès maintenant !" + +#: wp-admin/options-permalink.php:16 wp-admin/options-permalink.php:32 +msgid "Permalink Settings" +msgstr "Réglages des permaliens" + +#: wp-admin/options-media.php:139 +msgid "Organize my uploads into month- and year-based folders" +msgstr "Organiser mes fichiers envoyés dans des dossiers mensuels et annuels" + +#: wp-admin/options-media.php:128 +msgid "Configuring this is optional. By default, it should be blank." +msgstr "Ce réglage est facultatif. Par défaut, ce champ devrait être vide." + +#: wp-admin/options-media.php:126 +msgid "Full URL path to files" +msgstr "Adresse web complète pour les fichiers" + +#: wp-admin/options-media.php:114 +msgid "Store uploads in this folder" +msgstr "Stocker les fichiers envoyés dans ce dossier" + +#: wp-admin/options-media.php:107 +msgid "Uploading Files" +msgstr "Envoi de fichiers" + +#: wp-admin/options-media.php:81 wp-admin/options-media.php:82 +msgid "Large size" +msgstr "Grande taille" + +#: wp-admin/options-media.php:75 wp-admin/options-media.php:86 +msgid "Max Height" +msgstr "Hauteur maximale" + +#: wp-admin/options-media.php:72 wp-admin/options-media.php:83 +msgid "Max Width" +msgstr "Largeur maximale" + +#: wp-admin/options-media.php:70 wp-admin/options-media.php:71 +msgid "Medium size" +msgstr "Taille moyenne" + +#: wp-admin/options-media.php:65 +msgid "Crop thumbnail to exact dimensions (normally thumbnails are proportional)" +msgstr "Recadrer les images pour parvenir aux dimensions exactes (normalement, les miniatures sont au format carré)" + +#: wp-admin/options-media.php:56 wp-admin/options-media.php:57 +msgid "Thumbnail size" +msgstr "Taille des miniatures" + +#: wp-admin/options-media.php:51 +msgid "Image sizes" +msgstr "Tailles des images" + +#: wp-admin/options-media.php:16 +msgid "Media Settings" +msgstr "Réglages des médias" + +#: wp-admin/options-general.php:383 +msgid "Week Starts On" +msgstr "La semaine débute le" + +#: wp-admin/options-general.php:333 wp-admin/options-general.php:370 +msgid "Custom:" +msgstr "Personnalisé :" + +#: wp-admin/options-general.php:274 +msgid "This timezone is currently in standard time." +msgstr "Ce fuseau horaire est actuellement à l’heure d’hiver." + +#: wp-admin/includes/class-wp-debug-data.php:75 +#: wp-admin/options-general.php:224 +msgid "Timezone" +msgstr "Fuseau horaire" + +#: wp-admin/options-general.php:149 +msgid "New User Default Role" +msgstr "Rôle par défaut de tout nouvel utilisateur" + +#: wp-admin/options-general.php:144 +msgid "Anyone can register" +msgstr "Tout le monde peut s’inscrire" + +#: wp-admin/options-general.php:141 wp-admin/options-general.php:142 +msgid "Membership" +msgstr "Inscription" + +#: wp-admin/options-general.php:19 +msgid "General Settings" +msgstr "Réglages généraux" + +#: wp-admin/options-discussion.php:280 +msgid "MonsterID (Generated)" +msgstr "MonsterID (généré)" + +#: wp-admin/options-discussion.php:279 +msgid "Wavatar (Generated)" +msgstr "Wavatar (généré)" + +#: wp-admin/options-discussion.php:278 +msgid "Identicon (Generated)" +msgstr "Identicon (généré)" + +#: wp-admin/options-discussion.php:277 +msgid "Gravatar Logo" +msgstr "Logo Gravatar" + +#: wp-admin/options-discussion.php:276 +msgid "Blank" +msgstr "Vide" + +#: wp-admin/options-discussion.php:270 +msgid "For users without a custom avatar of their own, you can either display a generic logo or a generated one based on their email address." +msgstr "Les utilisateurs n’ayant pas d’avatar peuvent se voir attribuer un logo générique, ou un avatar généré à partir de leur adresse de messagerie." + +#: wp-admin/options-discussion.php:266 wp-admin/options-discussion.php:267 +msgid "Default Avatar" +msgstr "Avatar par défaut" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:255 +msgid "X — Even more mature than above" +msgstr "X — Réservés aux adultes" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:253 +msgid "R — Intended for adult audiences above 17" +msgstr "R — Réservés aux personnes de plus de 17 ans" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:251 +msgid "PG — Possibly offensive, usually for audiences 13 and above" +msgstr "PG — Possiblement offensants, réservés normalement aux personnes de 13 ans et plus" + +#. translators: Content suitability rating: +#. https://en.wikipedia.org/wiki/Motion_Picture_Association_of_America_film_rating_system +#: wp-admin/options-discussion.php:249 +msgid "G — Suitable for all audiences" +msgstr "G — Visibles par tous" + +#: wp-admin/options-discussion.php:243 wp-admin/options-discussion.php:244 +msgid "Maximum Rating" +msgstr "Classement maximal" + +#: wp-admin/options-discussion.php:238 +msgid "Show Avatars" +msgstr "Afficher les avatars" + +#: wp-admin/options-discussion.php:234 +msgid "Avatar Display" +msgstr "Affichage des avatars" + +#: wp-admin/options-discussion.php:218 +msgid "Avatars" +msgstr "Avatars" + +#: wp-admin/options-discussion.php:209 +msgid "When a comment contains any of these words in its content, name, URL, email, or IP address, it will be put in the Trash. One word or IP address per line. It will match inside words, so “press” will match “WordPress”." +msgstr "Lorsqu’un commentaire contient l’un de ces mots dans son contenu, son nom, son URL, son e-mail, ou son adresse IP, il sera mis à la corbeille. Un seul mot ou une seule adresse IP par ligne. Cette fonction reconnaît l’intérieur des mots, donc « press » suffira pour reconnaître « WordPress »." + +#: wp-admin/options-discussion.php:207 wp-admin/options-discussion.php:208 +msgid "Comment Blocklist" +msgstr "Liste noire pour les commentaires" + +#: wp-admin/options-discussion.php:200 +msgid "When a comment contains any of these words in its content, name, URL, email, or IP address, it will be held in the moderation queue. One word or IP address per line. It will match inside words, so “press” will match “WordPress”." +msgstr "Lorsqu’un commentaire contient l’un de ces mots dans son contenu, son nom, son URL, son adresse de messagerie, ou son adresse IP, il sera retenu dans la file de modération. Un seul mot ou une seule adresse IP par ligne. Cette fonction reconnaît l’intérieur des mots, donc « press » suffira pour reconnaître « WordPress »." + +#. translators: %s: Number of links. +#: wp-admin/options-discussion.php:194 +msgid "Hold a comment in the queue if it contains %s or more links. (A common characteristic of comment spam is a large number of hyperlinks.)" +msgstr "Garder un commentaire dans la file d’attente s’il contient plus de %s lien(s) (une des caractéristiques typiques d’un commentaire indésirable (spam) est son nombre important de liens)" + +#: wp-admin/options-discussion.php:188 wp-admin/options-discussion.php:189 +msgid "Comment Moderation" +msgstr "Modération de commentaires" + +#: wp-admin/options-discussion.php:184 +msgid "Comment author must have a previously approved comment" +msgstr "L’auteur d’un commentaire doit avoir déjà au moins un commentaire approuvé" + +#: wp-admin/options-discussion.php:178 wp-admin/options-discussion.php:179 +msgid "Before a comment appears" +msgstr "Avant la publication d’un commentaire" + +#: wp-admin/options-discussion.php:174 +msgid "A comment is held for moderation" +msgstr "Un commentaire est en attente de modération" + +#: wp-admin/options-discussion.php:170 +msgid "Anyone posts a comment" +msgstr "Un nouveau commentaire est publié" + +#: wp-admin/options-discussion.php:166 wp-admin/options-discussion.php:167 +msgid "Email me whenever" +msgstr "M’envoyer un message lorsque" + +#. translators: %s: Form field control for 'older' or 'newer' comments. +#: wp-admin/options-discussion.php:159 +msgid "Comments should be displayed with the %s comments at the top of each page" +msgstr "Les commentaires doivent être affichés avec le plus %s en premier" + +#: wp-admin/options-discussion.php:156 +msgid "newer" +msgstr "récent" + +#: wp-admin/options-discussion.php:152 +msgid "older" +msgstr "ancien" + +#. translators: 1: Form field control for number of top level comments per +#. page, 2: Form field control for the 'first' or 'last' page. +#: wp-admin/options-discussion.php:138 +msgid "Break comments into pages with %1$s top level comments per page and the %2$s page displayed by default" +msgstr "Diviser les commentaires en pages, avec %1$s commentaires de premier niveau par page et la %2$s page affichée par défaut" + +#: wp-admin/options-discussion.php:135 +msgid "first" +msgstr "première" + +#: wp-admin/options-discussion.php:131 +msgid "last" +msgstr "dernière" + +#. translators: %s: Number of levels. +#: wp-admin/options-discussion.php:119 +msgid "Enable threaded (nested) comments %s levels deep" +msgstr "Activer les commentaires imbriqués jusqu’à %s niveaux" + +#. translators: %s: Number of days. +#: wp-admin/options-discussion.php:83 +msgid "Automatically close comments on posts older than %s days" +msgstr "Fermer automatiquement les commentaires pour les publications datant de plus de %s jours" + +#: wp-admin/options-discussion.php:70 +msgid "Users must be registered and logged in to comment" +msgstr "Un utilisateur doit être inscrit et connecté pour publier des commentaires" + +#: wp-admin/options-discussion.php:66 +msgid "Comment author must fill out name and email" +msgstr "L’auteur d’un commentaire doit renseigner son nom et son adresse de messagerie" + +#: wp-admin/options-discussion.php:64 wp-admin/options-discussion.php:65 +msgid "Other comment settings" +msgstr "Autres réglages des commentaires" + +#: wp-admin/options-discussion.php:60 +msgid "These settings may be overridden for individual posts." +msgstr "Ces réglages peuvent être modifiés pour chaque publication." + +#: wp-admin/edit-form-advanced.php:401 wp-admin/options-discussion.php:15 +msgid "Discussion Settings" +msgstr "Réglages des commentaires" + +#: wp-admin/includes/class-wp-users-list-table.php:159 +#: wp-admin/includes/deprecated.php:570 +#: wp-admin/includes/class-wp-ms-users-list-table.php:126 +msgid "No users found." +msgstr "Aucun utilisateur trouvé." + +#: wp-admin/update-core.php:470 wp-admin/update-core.php:519 +#: wp-admin/update-core.php:892 wp-admin/update-core.php:897 +#: wp-admin/network/themes.php:76 +msgid "Update Themes" +msgstr "Mettre à jour les thèmes" + +#: wp-admin/my-sites.php:122 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:719 +#: wp-admin/network/site-info.php:136 wp-admin/network/site-users.php:226 +#: wp-admin/network/site-themes.php:179 wp-admin/network/site-settings.php:94 +msgid "Visit" +msgstr "Visiter" + +#: wp-admin/my-sites.php:13 wp-admin/ms-delete-site.php:13 +#: wp-admin/network/admin.php:17 +msgid "Multisite support is not enabled." +msgstr "Le support multisites n’est pas activé." + +#: wp-admin/menu.php:297 +msgid "Permalinks" +msgstr "Permaliens" + +#: wp-admin/credits.php:41 wp-admin/privacy.php:12 wp-admin/privacy.php:38 +#: wp-admin/privacy.php:44 wp-admin/freedoms.php:44 wp-admin/about.php:39 +#: wp-admin/menu.php:298 +msgid "Privacy" +msgstr "Confidentialité" + +#: wp-admin/menu.php:294 +msgid "Reading" +msgstr "Lecture" + +#: wp-admin/menu.php:293 +msgid "Writing" +msgstr "Écriture" + +#: wp-admin/menu.php:292 +msgctxt "settings screen" +msgid "General" +msgstr "Général" + +#: wp-admin/menu.php:266 wp-admin/menu.php:269 +msgid "Your Profile" +msgstr "Votre profil" + +#: wp-admin/user-edit.php:31 wp-admin/user/menu.php:14 wp-admin/menu.php:254 +msgid "Profile" +msgstr "Profil" + +#. translators: Add new plugin. +#: wp-admin/plugins.php:598 wp-admin/menu.php:245 wp-admin/network/menu.php:106 +msgctxt "plugin" +msgid "Add New" +msgstr "Ajouter" + +#: wp-admin/menu.php:187 +msgid "Appearance" +msgstr "Apparence" + +#. translators: %s: Number of comments. +#: wp-admin/menu.php:97 +msgid "Comments %s" +msgstr "Commentaires %s" + +#. translators: Add new file. +#: wp-admin/media.php:129 wp-admin/upload.php:90 wp-admin/upload.php:273 +#: wp-admin/menu.php:68 +msgctxt "file" +msgid "Add New" +msgstr "Ajouter" + +#: wp-admin/menu.php:66 +msgid "Library" +msgstr "Bibliothèque" + +#: wp-admin/media.php:136 wp-admin/media.php:156 +msgid "Update Media" +msgstr "Mettre à jour le fichier" + +#: wp-admin/media.php:73 +msgid "You can’t edit this attachment because it is in the Trash. Please move it out of the Trash and try again." +msgstr "Vous ne pouvez pas modifier ce fichier attaché, car il est dans la corbeille. Sortez-l’en, puis réessayez." + +#: wp-admin/media.php:67 +msgid "You attempted to edit an attachment that doesn’t exist. Perhaps it was deleted?" +msgstr "Vous tentez de modifier un fichier attaché qui n’existe pas. Peut-être a-t-il été supprimé ?" + +#: wp-admin/media.php:23 wp-admin/media.php:61 +msgid "Sorry, you are not allowed to edit this attachment." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier ce fichier attaché." + +#: wp-admin/media-new.php:42 +msgid "Upload New Media" +msgstr "Envoi d’un nouveau média" + +#: wp-admin/maint/repair.php:169 +msgid "Repair and Optimize Database" +msgstr "Réparer et optimiser la base de données" + +#: wp-admin/maint/repair.php:167 +msgid "Repair Database" +msgstr "Réparer la base de données" + +#. translators: %s: URL to "Fixing WordPress" forum. +#: wp-admin/maint/repair.php:146 +msgid "Some database problems could not be repaired. Please copy-and-paste the following list of errors to the WordPress support forums to get additional assistance." +msgstr "Certains problèmes de la base de données n’ont pas pu être réparés. Veuillez copier-coller la liste d’erreurs suivantes sur le forum de support de WordPress pour recevoir plus d’informations." + +#: wp-admin/maint/repair.php:20 +msgid "WordPress › Database Repair" +msgstr "WordPress » Réparation de la base de données" + +#: wp-admin/link.php:117 +msgid "Link not found." +msgstr "Lien non trouvé." + +#: wp-admin/includes/class-wp-links-list-table.php:80 +msgid "No links found." +msgstr "Aucun lien trouvé." + +#: wp-admin/link-manager.php:127 +msgid "Search Links" +msgstr "Rechercher des liens" + +#. translators: %s: Number of links. +#: wp-admin/link-manager.php:119 +msgid "%s link deleted." +msgid_plural "%s links deleted." +msgstr[0] "%s lien supprimé." +msgstr[1] "%s liens supprimés." + +#. translators: Add new links. +#: wp-admin/link-manager.php:103 wp-admin/edit-link-form.php:90 +#: wp-admin/menu.php:82 +msgctxt "link" +msgid "Add New" +msgstr "Ajouter" + +#: wp-admin/link-add.php:16 +msgid "Add New Link" +msgstr "Ajouter un lien" + +#: wp-admin/install.php:394 +msgid "Success!" +msgstr "Quel succès !" + +#: wp-admin/install.php:338 +msgid "Please provide the following information. Don’t worry, you can always change these settings later." +msgstr "Veuillez renseigner les informations suivantes. Ne vous inquiétez pas, vous pourrez les modifier plus tard." + +#: wp-admin/install.php:337 +msgid "Information needed" +msgstr "Informations nécessaires" + +#: wp-admin/install.php:208 +msgid "Install WordPress" +msgstr "Installer WordPress" + +#: wp-admin/install.php:180 +msgid "Double-check your email address before continuing." +msgstr "Vérifiez bien cette adresse de messagerie avant de continuer." + +#: wp-admin/install.php:178 +msgid "Your Email" +msgstr "Votre adresse de messagerie" + +#: wp-admin/install.php:123 +msgid "User(s) already exists." +msgstr "L’utilisateur existe déjà." + +#: wp-admin/install.php:73 +msgid "WordPress › Installation" +msgstr "WordPress » Installation" + +#: wp-admin/includes/user.php:202 +msgid "Error: Please enter an email address." +msgstr "Erreur : veuillez saisir une adresse de messagerie." + +#: wp-admin/includes/user.php:178 +msgid "Error: Please enter the same password in both password fields." +msgstr "Erreur : les deux mots de passe ne sont pas identiques." + +#: wp-admin/includes/user.php:173 +msgid "Error: Passwords may not contain the character \"\\\"." +msgstr "Erreur : le mot de passe ne doit pas contenir le caractère « \\ »." + +#: wp-admin/includes/user.php:168 +msgid "Error: Please enter a password." +msgstr "Erreur : veuillez saisir un mot de passe." + +#. translators: Default post slug. +#: wp-admin/includes/upgrade.php:242 wp-admin/includes/upgrade.php:555 +msgctxt "Default post slug" +msgid "hello-world" +msgstr "bonjour-tout-le-monde" + +#: wp-admin/includes/upgrade.php:240 +msgid "Hello world!" +msgstr "Bonjour tout le monde !" + +#. translators: %s: Site link. +#. translators: First post content. %s: Site link. +#: wp-admin/includes/schema.php:1245 wp-admin/includes/upgrade.php:213 +msgid "Welcome to %s. This is your first post. Edit or delete it, then start writing!" +msgstr "Bienvenue sur %s. Ceci est votre premier article. Modifiez-le ou supprimez-le, puis lancez-vous !" + +#. translators: Default category slug. +#: wp-admin/includes/upgrade.php:160 +msgctxt "Default category slug" +msgid "Uncategorized" +msgstr "Non classé" + +#: wp-admin/includes/upgrade.php:89 +msgid "Note that password carefully! It is a random password that was generated just for you." +msgstr "Notez bien ce mot de passe sans vous tromper ! Il a été créé aléatoirement et vous est unique." + +#: wp-admin/includes/update.php:759 +msgid "An automated WordPress update has failed to complete! Please notify the site administrator." +msgstr "Une mise à jour automatique de WordPress a échoué en cours de route ! Veuillez en notifier l’administrateur du site." + +#. translators: %s: URL to WordPress Updates screen. +#: wp-admin/includes/update.php:755 +msgid "An automated WordPress update has failed to complete - please attempt the update again now." +msgstr "Une mise à jour automatique de WordPress a échoué en cours de route ; vous pouvez tenter de la relancer." + +#. translators: %s: WordPress version number, or 'Latest' string. +#: wp-admin/includes/update.php:345 +msgid "Latest" +msgstr "Dernière version" + +#. translators: %s: WordPress version number, or 'Latest' string. +#: wp-admin/includes/update.php:345 +msgid "Update to %s" +msgstr "Mettre à jour vers la version %s" + +#. translators: 1: WordPress version number, 2: URL to WordPress Updates +#. screen. +#: wp-admin/includes/update.php:255 +msgid "You are using a development version (%1$s). Cool! Please stay updated." +msgstr "Vous utilisez une version de développement (%1$s). C’est super ! Veillez à rester à jour." + +#: wp-admin/includes/update-core.php:1273 +msgid "Upgrading database…" +msgstr "Mise à jour de la base de données…" + +#: wp-admin/includes/update-core.php:923 +msgid "The update could not be unpacked" +msgstr "La mise à jour ne peut pas être décompressée" + +#: wp-admin/includes/update-core.php:910 +msgid "Verifying the unpacked files…" +msgstr "Vérification des fichiers décompressés…" + +#. translators: 1: WordPress version number, 2: Minimum required MySQL version +#. number, 3: Current MySQL version number. +#: wp-admin/includes/update-core.php:999 +msgid "The update cannot be installed because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s." +msgstr "Cette mise à jour ne peut être installée car WordPress %1$s nécessite une version de MySQL égale ou supérieure à la %2$s. Votre hébergement utilise MySQL version %3$s." + +#. translators: 1: WordPress version number, 2: Minimum required PHP version +#. number, 3: Current PHP version number. +#: wp-admin/includes/update-core.php:988 +msgid "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s." +msgstr "Cette mise à jour ne peut être installée car WordPress %1$s nécessite une version de PHP égale ou supérieure à la %2$s. Votre hébergement utilise PHP version %3$s." + +#. translators: 1: WordPress version number, 2: Minimum required PHP version +#. number, 3: Minimum required MySQL version number, 4: Current PHP version +#. number, 5: Current MySQL version number. +#: wp-admin/includes/update-core.php:975 +msgid "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s." +msgstr "Cette mise à jour ne peut être installée car WordPress %1$s nécessite une version de PHP égale ou supérieure à la %2$s, et une version de MySQL égale ou supérieure à la %3$s. Votre hébergement utilise PHP version %4$s et MySQL version %5$s." + +#. translators: %s: Theme name. +#: wp-admin/includes/theme.php:83 +msgid "Could not fully remove the theme %s." +msgstr "Impossible de supprimer complètement le thème %s." + +#: wp-admin/includes/theme.php:72 wp-admin/includes/class-wp-upgrader.php:155 +msgid "Unable to locate WordPress theme directory." +msgstr "Impossible de localiser le dossier des thèmes de WordPress." + +#. translators: %s: Theme version. +#: wp-admin/includes/theme.php:730 wp-admin/themes.php:556 +#: wp-admin/theme-install.php:352 +msgid "Version: %s" +msgstr "Version : %s" + +#: wp-admin/includes/theme-install.php:182 +msgid "If you have a theme in a .zip format, you may install it by uploading it here." +msgstr "Si vous avez un thème au format .zip, vous pouvez l’installer en le téléversant ici." + +#: wp-admin/includes/theme-install.php:172 +msgid "Find Themes" +msgstr "Trouver des thèmes" + +#: wp-admin/includes/theme.php:273 +msgid "Holiday" +msgstr "Vacances" + +#: wp-admin/includes/theme.php:267 wp-admin/includes/theme.php:334 +msgid "Subject" +msgstr "Thème" + +#: wp-admin/includes/theme.php:292 +msgid "Sticky Post" +msgstr "Article mis en avant" + +#: wp-admin/includes/theme.php:293 +msgid "Theme Options" +msgstr "Options du thème" + +#: wp-admin/includes/theme.php:283 +msgid "Custom Colors" +msgstr "Couleurs personnalisées" + +#: wp-admin/includes/theme.php:279 wp-admin/includes/theme.php:333 +msgid "Features" +msgstr "Fonctionnalités" + +#: wp-admin/includes/theme.php:303 +msgid "Right Sidebar" +msgstr "Colonne latérale droite" + +#: wp-admin/includes/theme.php:302 +msgid "Left Sidebar" +msgstr "Colonne latérale gauche" + +#: wp-admin/includes/theme.php:301 +msgid "Four Columns" +msgstr "Quatre colonnes" + +#: wp-admin/includes/theme.php:300 +msgid "Three Columns" +msgstr "Trois colonnes" + +#: wp-admin/includes/theme.php:299 +msgid "Two Columns" +msgstr "Deux colonnes" + +#: wp-admin/includes/theme.php:298 +msgid "One Column" +msgstr "Une colonne" + +#: wp-admin/includes/theme-install.php:139 wp-admin/theme-install.php:181 +msgid "Feature Filter" +msgstr "Filtre de fonctionnalités" + +#: wp-admin/includes/class-wp-screen.php:969 +msgid "Screen Options" +msgstr "Options de l’écran" + +#: wp-admin/widgets.php:412 +msgid "Disable accessibility mode" +msgstr "Désactiver le mode Accessibilité" + +#: wp-admin/widgets.php:412 +msgid "Enable accessibility mode" +msgstr "Activer le mode « Accessibilité »" + +#: wp-admin/themes.php:87 +msgid "Manage Themes" +msgstr "Gérer les thèmes" + +#: wp-admin/update.php:245 +msgid "Install Themes" +msgstr "Installer des thèmes" + +#: wp-admin/includes/template.php:982 +msgid "Upload file and import" +msgstr "Téléverser et importer le fichier" + +#. translators: %s: Maximum allowed file size. +#: wp-admin/includes/template.php:975 +msgid "Maximum size: %s" +msgstr "Taille maximale : %s" + +#: wp-admin/includes/template.php:973 +msgid "Choose a file from your computer:" +msgstr "Choisissez un fichier sur votre ordinateur :" + +#: wp-admin/includes/template.php:963 +msgid "Before you can upload your import file, you will need to fix the following error:" +msgstr "Avant de téléverser votre fichier d’import, il vous faut corriger l’erreur suivante :" + +#: wp-admin/includes/template.php:748 +msgid "Add Custom Field" +msgstr "Ajouter un champ personnalisé" + +#: wp-admin/includes/template.php:735 +msgid "Enter new" +msgstr "Saisissez-en un nouveau" + +#: wp-admin/includes/template.php:708 +msgid "Add New Custom Field:" +msgstr "Ajouter un nouveau champ personnalisé :" + +#: wp-admin/includes/template.php:642 +msgid "Key" +msgstr "Clé" + +#: wp-admin/includes/template.php:570 wp-admin/includes/template.php:585 +#: wp-admin/includes/template.php:652 wp-admin/includes/template.php:713 +msgid "Value" +msgstr "Valeur" + +#. translators: %s: Comment author, filled by AJAX. +#: wp-admin/includes/template.php:547 +msgid "Comment by %s marked as spam." +msgstr "Commentaire de %s marqué comme indésirable." + +#. translators: %s: Comment author, filled by AJAX. +#: wp-admin/includes/template.php:538 +msgid "Comment by %s moved to the Trash." +msgstr "Commentaire par %s déplacé dans la corbeille." + +#: wp-admin/includes/template.php:494 +msgid "Submit Reply" +msgstr "Envoyer la réponse" + +#: wp-admin/includes/template.php:452 +msgid "Reply to Comment" +msgstr "Répondre au commentaire" + +#: wp-admin/includes/class-wp-posts-list-table.php:1090 +msgid "Last Modified" +msgstr "Dernière modification" + +#: wp-admin/includes/class-wp-posts-list-table.php:1085 +msgid "Missed schedule" +msgstr "Planification manquée" + +#: wp-admin/includes/class-wp-posts-list-table.php:1843 +msgid "Make this post sticky" +msgstr "Mettre ce contenu en avant" + +#: wp-admin/includes/class-wp-posts-list-table.php:1835 +msgid "Not Sticky" +msgstr "Pas mis en avant" + +#: wp-admin/includes/class-wp-posts-list-table.php:1831 +#: wp-admin/includes/class-wp-posts-list-table.php:1834 +msgid "Sticky" +msgstr "Mis en avant" + +#: wp-admin/includes/class-wp-posts-list-table.php:1793 +msgid "Allow Pings" +msgstr "Autoriser les notifications par ping" + +#: wp-admin/includes/class-wp-posts-list-table.php:1784 +msgid "Allow Comments" +msgstr "Autoriser les commentaires" + +#: wp-admin/includes/class-wp-posts-list-table.php:1755 +#: wp-admin/includes/class-wp-posts-list-table.php:1768 +msgid "Do not allow" +msgstr "Refuser" + +#: wp-admin/includes/class-wp-posts-list-table.php:1754 +#: wp-admin/includes/class-wp-posts-list-table.php:1767 +msgid "Allow" +msgstr "Autoriser" + +#. translators: Between password field and private checkbox on post quick edit +#. interface. +#: wp-admin/includes/class-wp-posts-list-table.php:1614 +msgid "–OR–" +msgstr "– OU –" + +#: wp-admin/includes/class-wp-posts-list-table.php:1583 +#: wp-admin/includes/class-wp-posts-list-table.php:1674 +#: wp-admin/includes/class-wp-posts-list-table.php:1711 +#: wp-admin/includes/class-wp-posts-list-table.php:1753 +#: wp-admin/includes/class-wp-posts-list-table.php:1766 +#: wp-admin/includes/class-wp-posts-list-table.php:1810 +#: wp-admin/includes/class-wp-posts-list-table.php:1833 +#: wp-admin/includes/class-wp-posts-list-table.php:1858 +msgid "— No Change —" +msgstr "– Aucun changement –" + +#: wp-admin/includes/class-wp-posts-list-table.php:1528 +msgid "Bulk Edit" +msgstr "Modifications groupées" + +#: wp-admin/includes/class-wp-links-list-table.php:135 +msgid "Visible" +msgstr "Visible" + +#: wp-admin/includes/class-wp-links-list-table.php:134 +msgid "Relationship" +msgstr "Relation" + +#: wp-admin/includes/class-wp-comments-list-table.php:457 +#: wp-admin/includes/class-wp-post-comments-list-table.php:27 +msgctxt "column name" +msgid "Comment" +msgstr "Commentaire" + +#. translators: Column name. +#: wp-admin/includes/class-wp-media-list-table.php:326 +msgctxt "column name" +msgid "Date" +msgstr "Date" + +#. translators: Column name. +#: wp-admin/includes/class-wp-media-list-table.php:290 +msgctxt "column name" +msgid "File" +msgstr "Fichier" + +#. translators: Posts screen column name. +#: wp-admin/includes/class-wp-posts-list-table.php:611 +msgctxt "column name" +msgid "Title" +msgstr "Titre" + +#: wp-admin/includes/class-wp-terms-list-table.php:484 +#: wp-admin/includes/class-wp-comments-list-table.php:728 +#: wp-admin/includes/class-wp-posts-list-table.php:1350 +msgid "Quick Edit" +msgstr "Modification rapide" + +#: wp-admin/includes/class-wp-terms-list-table.php:643 +#: wp-admin/includes/class-wp-posts-list-table.php:1528 +msgid "Quick Edit" +msgstr "Modification rapide" + +#: wp-admin/includes/schema.php:1077 +msgid "Warning! Wildcard DNS may not be configured correctly!" +msgstr "Avertissement ! L’enregistrement DNS générique (joker) peut ne pas être configuré correctement !" + +#. translators: %s: Network title. +#: wp-admin/includes/schema.php:553 +msgid "Just another %s site" +msgstr "Un site utilisant %s" + +#. translators: Site tagline. +#: wp-admin/includes/schema.php:412 +msgid "Just another WordPress site" +msgstr "Un site utilisant WordPress" + +#: wp-admin/includes/post.php:1456 +msgid "Change Permalinks" +msgstr "Modifier les permaliens" + +#: wp-admin/includes/post.php:672 +msgid "Auto Draft" +msgstr "Brouillon auto" + +#: wp-admin/includes/post.php:36 wp-admin/includes/post.php:81 +msgid "Sorry, you are not allowed to edit posts as this user." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier des articles sous cet identifiant." + +#: wp-admin/includes/post.php:34 wp-admin/includes/post.php:79 +msgid "Sorry, you are not allowed to edit pages as this user." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier des pages sous cet identifiant." + +#: wp-admin/includes/plugin.php:1097 +msgid "The plugin does not have a valid header." +msgstr "Cette extension ne dispose pas d’un en-tête valide." + +#: wp-admin/includes/plugin.php:1092 +msgid "Plugin file does not exist." +msgstr "Le fichier de l’extension n’existe pas." + +#: wp-admin/includes/plugin.php:1089 +msgid "Invalid plugin path." +msgstr "Chemin d’extension non valide." + +#. translators: %s: Comma-separated list of plugin filenames. +#: wp-admin/includes/plugin.php:1029 +msgid "Could not fully remove the plugins %s." +msgstr "Impossible de supprimer complètement la ou les extensions %s." + +#: wp-admin/includes/plugin.php:872 +msgid "One of the plugins is invalid." +msgstr "L’une des extensions n’est pas valide." + +#: wp-admin/includes/plugin.php:722 +msgid "The plugin generated unexpected output." +msgstr "Cette extension a produit un résultat inattendu." + +#: wp-admin/includes/plugin-install.php:821 +msgid "Warning: This plugin has not been tested with your current version of WordPress." +msgstr "Avertissement : cette extension n’a pas été testée avec votre version actuelle de WordPress." + +#: wp-admin/includes/plugin-install.php:706 +msgid "Average Rating" +msgstr "Moyenne des notes" + +#: wp-admin/includes/plugin-install.php:698 +msgid "WordPress.org Plugin Page »" +msgstr "Page WordPress.org de l’extension »" + +#: wp-admin/includes/plugin-install.php:671 +msgid "Compatible up to:" +msgstr "Compatible jusqu’à la version : " + +#. translators: %s: Version number. +#: wp-admin/includes/plugin-install.php:667 +#: wp-admin/includes/plugin-install.php:677 +msgid "%s or higher" +msgstr "%s ou plus" + +#: wp-admin/includes/plugin-install.php:664 +msgid "Requires WordPress Version:" +msgstr "Nécessite WordPress en version :" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:731 +#: wp-admin/includes/plugin-install.php:656 +msgid "Last Updated:" +msgstr "Dernière mise à jour :" + +#: wp-admin/includes/plugin-install.php:884 +msgid "Latest Version Installed" +msgstr "Dernière version installée" + +#. translators: %s: Plugin version. +#: wp-admin/includes/plugin-install.php:881 +msgid "Newer Version (%s) Installed" +msgstr "Une version plus récente (%s) est installée" + +#: wp-admin/includes/plugin-install.php:870 +msgid "Install Update Now" +msgstr "Installer la mise à jour maintenant" + +#. translators: %s: Number of ratings. +#: wp-admin/includes/plugin-install.php:720 +msgid "(based on %s rating)" +msgid_plural "(based on %s ratings)" +msgstr[0] "(basée sur %s vote)" +msgstr[1] "(basée sur %s votes)" + +#: wp-admin/includes/plugin-install.php:353 +msgid "Plugin zip file" +msgstr "Archive Zip de l’extension" + +#: wp-admin/includes/plugin-install.php:350 +msgid "If you have a plugin in a .zip format, you may install it by uploading it here." +msgstr "Si vous avez une extension au format .zip, vous pouvez l’installer en la téléversant ici." + +#: wp-admin/includes/plugin-install.php:334 +#: wp-admin/includes/plugin-install.php:337 +msgid "Search Plugins" +msgstr "Rechercher des extensions" + +#: wp-admin/includes/plugin-install.php:279 +msgid "You may also browse based on the most popular tags in the Plugin Directory:" +msgstr "Vous pouvez également naviguer en fonction des étiquettes les plus populaires sur WordPress.org :" + +#: wp-admin/includes/plugin-install.php:278 +msgid "Popular tags" +msgstr "Étiquettes populaires" + +#: wp-admin/includes/meta-boxes.php:1357 +msgid "(Leave at 0 for no rating.)" +msgstr "(Laissez à 0 pour ne pas donner de note.)" + +#: wp-admin/includes/class-wp-links-list-table.php:136 +#: wp-admin/includes/meta-boxes.php:1346 +msgid "Rating" +msgstr "Note" + +#: wp-admin/includes/meta-boxes.php:1342 +msgid "Notes" +msgstr "Commentaires" + +#: wp-admin/includes/meta-boxes.php:1338 +msgid "RSS Address" +msgstr "Adresse du flux RSS" + +#: wp-admin/includes/meta-boxes.php:1334 +msgid "Image Address" +msgstr "Adresse de l’image" + +#: wp-admin/includes/meta-boxes.php:1319 +msgid "If the link is to a person, you can specify your relationship with them using the above form. If you would like to learn more about the idea check out XFN." +msgstr "Si le lien pointe vers une personne, vous pouvez préciser la relation que vous entretenez avec elle via le formulaire ci-dessus. Si vous souhaitez en apprendre plus sur ce système, consultez le site de XFN." + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1313 +msgid "sweetheart" +msgstr "être aimé" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1310 +msgid "date" +msgstr "petit·e ami·e" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1307 +msgid "crush" +msgstr "coup de foudre" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1304 +msgid "muse" +msgstr "muse" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1301 wp-admin/includes/meta-boxes.php:1302 +msgid "romantic" +msgstr "romantique" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1293 +msgid "spouse" +msgstr "conjoint" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1290 +msgid "sibling" +msgstr "frère/sœur" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1287 +msgid "parent" +msgstr "parent" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1284 +msgid "kin" +msgstr "apparenté" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1281 +msgid "child" +msgstr "enfant" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1278 wp-admin/includes/meta-boxes.php:1279 +msgid "family" +msgstr "famille" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1270 +msgid "neighbor" +msgstr "voisin" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1267 +msgid "co-resident" +msgstr "colocataire" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1264 wp-admin/includes/meta-boxes.php:1265 +msgid "geographical" +msgstr "géographique" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1259 +msgid "colleague" +msgstr "confrère" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1256 +msgid "co-worker" +msgstr "collègue de travail" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1253 wp-admin/includes/meta-boxes.php:1254 +msgid "professional" +msgstr "professionnel" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1248 +msgid "met" +msgstr "rencontré·e" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1245 wp-admin/includes/meta-boxes.php:1246 +msgid "physical" +msgstr "physique" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1240 wp-admin/includes/meta-boxes.php:1273 +#: wp-admin/includes/meta-boxes.php:1296 +msgid "none" +msgstr "aucune" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1237 +msgid "friend" +msgstr "ami·e" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1234 +msgid "acquaintance" +msgstr "connaissance" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1231 +msgid "contact" +msgstr "contact" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1228 wp-admin/includes/meta-boxes.php:1229 +msgid "friendship" +msgstr "amitié" + +#: wp-admin/includes/meta-boxes.php:1224 +msgid "another web address of mine" +msgstr "une autre de mes adresses Web" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1220 wp-admin/includes/meta-boxes.php:1221 +msgid "identity" +msgstr "identité" + +#. translators: xfn: http://gmpg.org/xfn +#: wp-admin/includes/meta-boxes.php:1216 +msgid "rel:" +msgstr "rel :" + +#: wp-admin/includes/meta-boxes.php:1160 +msgid "Choose the target frame for your link." +msgstr "Choisissez le cadre dans lequel le lien doit s’ouvrir." + +#: wp-admin/includes/meta-boxes.php:1158 +msgid "_none — same window or tab." +msgstr "_none — même fenêtre ou onglet." + +#: wp-admin/includes/meta-boxes.php:1155 +msgid "_top — current window or tab, with no frames." +msgstr "_top — fenêtre ou onglet en cours, sans cadre incorporé (frame)." + +#: wp-admin/includes/meta-boxes.php:1152 +msgid "_blank — new window or tab." +msgstr "_blank — nouvelle fenêtre ou onglet." + +#. translators: %s: Link name. +#: wp-admin/includes/class-wp-links-list-table.php:333 +#: wp-admin/includes/meta-boxes.php:1063 +msgid "" +"You are about to delete this link '%s'\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Vous êtes sur le point de supprimer le lien « %s ».\n" +"« Annuler » pour arrêter, « OK » pour supprimer." + +#: wp-admin/includes/meta-boxes.php:1045 +msgid "Keep this link private" +msgstr "Ce lien est privé" + +#: wp-admin/includes/meta-boxes.php:1037 +msgid "Visit Link" +msgstr "Visiter le lien" + +#: wp-admin/includes/meta-boxes.php:986 +#: wp-admin/includes/class-wp-posts-list-table.php:1715 +msgid "Default Template" +msgstr "Modèle par défaut" + +#: wp-admin/includes/class-wp-posts-list-table.php:1668 +msgid "Main Page (no parent)" +msgstr "Publication principale (pas de publication parente)" + +#: wp-admin/includes/meta-boxes.php:952 +#: wp-admin/includes/class-wp-posts-list-table.php:1662 +msgid "Parent" +msgstr "Parent" + +#: wp-admin/includes/meta-boxes.php:857 +msgid "Show comments" +msgstr "Afficher les commentaires" + +#: wp-admin/includes/meta-boxes.php:725 +msgid "Separate multiple URLs with spaces" +msgstr "Séparez les adresses web par des espaces" + +#: wp-admin/includes/meta-boxes.php:722 +msgid "Send trackbacks to:" +msgstr "Envoyer un rétrolien vers :" + +#: wp-admin/includes/meta-boxes.php:712 +msgid "Already pinged:" +msgstr "Déjà notifié(s) par ping :" + +#: wp-admin/includes/meta-boxes.php:1129 +msgid "New category name" +msgstr "Nom de la nouvelle catégorie" + +#: wp-admin/includes/meta-boxes.php:1126 wp-admin/includes/meta-boxes.php:1128 +msgid "+ Add New Category" +msgstr "+ Ajouter une nouvelle catégorie" + +#: wp-admin/includes/meta-boxes.php:220 wp-admin/includes/meta-boxes.php:234 +msgid "Publish immediately" +msgstr "Publier tout de suite" + +#: wp-admin/includes/meta-boxes.php:189 +msgid "Stick this post to the front page" +msgstr "Mettre cet article en avant sur la page d’accueil" + +#: wp-admin/includes/meta-boxes.php:99 wp-admin/edit-form-comment.php:98 +#: wp-admin/export.php:222 wp-admin/export.php:269 +msgid "Status:" +msgstr "État :" + +#: wp-admin/includes/meta-boxes.php:67 +msgid "Preview Changes" +msgstr "Prévisualiser les modifications" + +#: wp-admin/includes/media.php:2924 +msgid "Link text, e.g. “Ransom Demands (PDF)”" +msgstr "Texte du lien, par exemple « Théorie sur le chaos (PDF) »" + +#: wp-admin/includes/media.php:2955 +msgid "Link to image" +msgstr "Lier à l’image" + +#: wp-admin/includes/media.php:2950 +msgid "Link Image To:" +msgstr "Lier l’image à :" + +#: wp-admin/includes/media.php:2880 +msgid "Image Caption" +msgstr "Légende de l’image" + +#: wp-admin/includes/media.php:2832 +msgid "Filter »" +msgstr "Filtrer »" + +#: wp-admin/includes/media.php:2740 +msgid "All Types" +msgstr "Tous les types" + +#: wp-admin/includes/media.php:2644 +msgid "Update gallery settings" +msgstr "Mettre à jour les réglages de galerie" + +#: wp-admin/includes/media.php:2623 +msgid "Gallery columns:" +msgstr "Colonnes de galerie :" + +#: wp-admin/includes/media.php:2608 +msgid "Order:" +msgstr "Ordre :" + +#: wp-admin/includes/media.php:2600 +msgid "Random" +msgstr "Aléatoire" + +#: wp-admin/includes/media.php:2599 +msgid "Date/Time" +msgstr "Horodatage" + +#: wp-admin/includes/media.php:2597 +msgid "Menu order" +msgstr "Ordre du menu" + +#: wp-admin/includes/media.php:2592 +msgid "Order images by:" +msgstr "Ranger les images par :" + +#: wp-admin/includes/media.php:2582 +msgid "Image File" +msgstr "Fichier image" + +#: wp-admin/includes/media.php:2577 +msgid "Link thumbnails to:" +msgstr "Lier les miniatures à :" + +#: wp-admin/includes/media.php:2535 wp-admin/includes/media.php:2616 +msgid "Descending" +msgstr "Décroissant" + +#: wp-admin/includes/media.php:2534 wp-admin/includes/media.php:2613 +msgid "Ascending" +msgstr "Croissant" + +#: wp-admin/includes/media.php:2533 +msgid "Sort Order:" +msgstr "Ordre de tri :" + +#: wp-admin/includes/media.php:2529 +msgid "All Tabs:" +msgstr "Tous les onglets :" + +#: wp-admin/includes/media.php:2337 wp-admin/includes/media.php:2556 +#: wp-admin/includes/media.php:2859 +msgid "Save all changes" +msgstr "Enregistrer toutes les modifications" + +#: wp-admin/includes/media.php:2307 +msgid "Add media files from your computer" +msgstr "Ajouter un fichier média depuis votre ordinateur" + +#: wp-admin/includes/media.php:1697 wp-admin/includes/media.php:2961 +#: wp-admin/includes/media.php:2967 +msgid "Insert into Post" +msgstr "Insérer dans la publication" + +#: wp-admin/includes/media.php:1671 +msgid "Upload date:" +msgstr "Date de téléversement :" + +#: wp-admin/includes/media.php:1396 +msgid "Location of the uploaded file." +msgstr "Emplacement du fichier envoyé." + +#: wp-admin/includes/media.php:1310 +msgid "Empty Title filled from filename." +msgstr "Titre absent, il sera rempli à partir du nom du fichier." + +#: wp-admin/includes/media.php:1453 wp-admin/includes/media.php:2931 +msgid "Alt text for the image, e.g. “The Mona Lisa”" +msgstr "Texte alternatif de l’image, par ex. : « La Joconde »" + +#: wp-admin/includes/media.php:1231 wp-admin/includes/media.php:1392 +msgid "File URL" +msgstr "Adresse web du fichier" + +#: wp-admin/credits.php:26 wp-admin/includes/class-wp-debug-data.php:59 +#: wp-admin/includes/class-wp-privacy-policy-content.php:724 +#: wp-admin/includes/media.php:518 wp-admin/includes/template.php:1965 +#: wp-admin/privacy.php:23 wp-admin/install.php:77 wp-admin/freedoms.php:29 +#: wp-admin/upgrade.php:71 wp-admin/about.php:24 wp-admin/setup-config.php:116 +#: wp-admin/maint/repair.php:24 +msgid "WordPress" +msgstr "WordPress" + +#: wp-admin/includes/media.php:518 +msgid "Uploads" +msgstr "Fichiers envoyés" + +#. translators: %s: Number of attachments. +#: wp-admin/includes/media.php:64 +msgid "Gallery (%s)" +msgstr "Galerie (%s)" + +#: wp-admin/includes/media.php:19 +msgid "From URL" +msgstr "Depuis le Web" + +#: wp-admin/includes/media.php:18 +msgid "From Computer" +msgstr "Depuis votre ordinateur" + +#: wp-admin/includes/image-edit.php:982 +msgid "Image saved" +msgstr "Image enregistrée" + +#: wp-admin/includes/image-edit.php:854 +msgid "Unable to save the image." +msgstr "Impossible d’enregistrer l’image." + +#: wp-admin/includes/image-edit.php:805 +msgid "Nothing to save, the image has not changed." +msgstr "Rien à enregistrer, l’image n’a pas été modifiée." + +#: wp-admin/includes/image-edit.php:796 +msgid "Error while saving the scaled image. Please reload the page and try again." +msgstr "Une erreur est survenue lors de la modification de l’échelle de l’image. Veuillez recharger la page et réessayer." + +#: wp-admin/includes/image-edit.php:772 +msgid "Unable to create new image." +msgstr "Impossible de créer une nouvelle image." + +#: wp-admin/includes/image-edit.php:745 +msgid "Image restored successfully." +msgstr "L’image a bien été rétablie." + +#: wp-admin/includes/image-edit.php:743 +msgid "Image metadata is inconsistent." +msgstr "Les métadonnées de l’image ne sont pas cohérentes." + +#: wp-admin/includes/image-edit.php:738 +msgid "Cannot save image metadata." +msgstr "Impossible d’enregistrer les métadonnées de l’image." + +#: wp-admin/includes/image-edit.php:678 +msgid "Cannot load image metadata." +msgstr "Impossible de charger les métadonnées de l’image." + +#: wp-admin/includes/image-edit.php:188 +msgid "All sizes except thumbnail" +msgstr "Toutes les tailles sauf la miniature" + +#: wp-admin/includes/image-edit.php:178 +msgid "All image sizes" +msgstr "Toutes les tailles" + +#: wp-admin/includes/image-edit.php:174 +msgid "Apply changes to:" +msgstr "Appliquer les modifications à :" + +#: wp-admin/includes/image-edit.php:169 +msgid "Current thumbnail" +msgstr "Miniature actuelle" + +#: wp-admin/includes/image-edit.php:160 +msgid "Thumbnail Settings" +msgstr "Réglages de la miniature" + +#: wp-admin/includes/image-edit.php:141 +msgid "Selection:" +msgstr "Sélection :" + +#: wp-admin/includes/image-edit.php:130 +msgid "Aspect ratio:" +msgstr "Proportion de taille :" + +#: wp-admin/includes/image-edit.php:124 +msgid "Crop Selection" +msgstr "Sélection de recadrage" + +#: wp-admin/includes/image-edit.php:121 +msgid "Crop Aspect Ratio" +msgstr "Proportion de taille du recadrage" + +#: wp-admin/includes/image-edit.php:115 +msgid "Image Crop" +msgstr "Recadrage de l’image" + +#: wp-admin/includes/image-edit.php:105 +msgid "Restore image" +msgstr "Rétablir l’image" + +#: wp-admin/includes/image-edit.php:100 +msgid "Previously edited copies of the image will not be deleted." +msgstr "Les copies de l’image précédemment modifiées ne seront pas effacées." + +#: wp-admin/includes/image-edit.php:97 +msgid "Discard any changes and restore the original image." +msgstr "Abandonner toutes modifications et rétablir l’image originale." + +#: wp-admin/includes/class-custom-background.php:313 +#: wp-admin/includes/class-custom-background.php:317 +#: wp-admin/includes/image-edit.php:93 +msgid "Restore Original Image" +msgstr "Rétablir l’image originale" + +#. translators: %s: Image width and height in pixels. +#: wp-admin/includes/image-edit.php:64 +msgid "Original dimensions %s" +msgstr "Taille originale : %s" + +#: wp-admin/includes/image-edit.php:54 +msgid "Scale Image" +msgstr "Redimensionnement de l’image" + +#: wp-admin/includes/image-edit.php:224 +msgid "Flip horizontal" +msgstr "Retourner horizontalement" + +#: wp-admin/includes/image-edit.php:223 +msgid "Flip vertical" +msgstr "Retourner verticalement" + +#: wp-admin/includes/image-edit.php:201 +msgid "Crop" +msgstr "Recadrer" + +#: wp-admin/includes/image-edit.php:28 wp-admin/includes/image-edit.php:813 +msgid "Image data does not exist. Please re-upload the image." +msgstr "Il n’y a aucune donnée d’image. Veuillez retéléverser l’image." + +#: wp-admin/includes/file.php:2232 +msgid "Proceed" +msgstr "Continuer" + +#: wp-admin/includes/file.php:2188 +msgid "Connection Type" +msgstr "Type de connexion" + +#: wp-admin/includes/file.php:2215 +msgid "Private Key:" +msgstr "Clé privée :" + +#: wp-admin/includes/file.php:2211 +msgid "Public Key:" +msgstr "Clé publique :" + +#: wp-admin/includes/file.php:2209 +msgid "Authentication Keys" +msgstr "Clés d’authentification" + +#: wp-admin/includes/file.php:2166 +msgid "Hostname" +msgstr "Nom de l’hôte :" + +#: wp-admin/includes/file.php:2132 +msgid "Connection Information" +msgstr "Informations de connexion" + +#: wp-admin/includes/file.php:2105 +msgid "SSH2" +msgstr "SSH2" + +#: wp-admin/includes/file.php:2102 +msgid "FTPS (SSL)" +msgstr "FTPS (SSL)" + +#: wp-admin/includes/file.php:2099 +msgid "FTP" +msgstr "FTP" + +#: wp-admin/includes/file.php:1623 +msgid "Empty archive." +msgstr "Archive vide." + +#: wp-admin/includes/update-core.php:1224 +#: wp-admin/includes/update-core.php:1346 wp-admin/includes/file.php:1577 +#: wp-admin/includes/file.php:1694 wp-admin/includes/file.php:1733 +msgid "Could not copy file." +msgstr "Impossible de copier le fichier." + +#: wp-admin/includes/file.php:1573 +msgid "Could not extract file from archive." +msgstr "Impossible d’extraire les fichiers depuis l’archive." + +#: wp-admin/includes/file.php:1488 wp-admin/includes/file.php:1555 +msgid "Could not retrieve file from archive." +msgstr "Impossible de récupérer le fichier depuis l’archive." + +#: wp-admin/includes/file.php:1023 +msgid "Could not create Temporary file." +msgstr "Impossible de créer le fichier temporaire." + +#: wp-admin/includes/file.php:1016 +msgid "Invalid URL Provided." +msgstr "L’URL fournie n’est pas valide." + +#: wp-admin/includes/file.php:808 +msgid "Specified file failed upload test." +msgstr "Le test d’envoi du fichier spécifié a échoué." + +#: wp-admin/includes/file.php:798 +msgid "Invalid form submission." +msgstr "Envoi non valide du formulaire." + +#: wp-admin/includes/file.php:784 +msgid "File upload stopped by extension." +msgstr "L’envoi de fichier est arrêté par l’extension." + +#: wp-admin/includes/file.php:783 +msgid "Failed to write file to disk." +msgstr "Échec de l’écriture du fichier sur le disque." + +#: wp-admin/includes/file.php:782 +msgid "Missing a temporary folder." +msgstr "Un dossier temporaire est manquant." + +#: wp-admin/includes/file.php:780 +msgid "No file was uploaded." +msgstr "Aucun fichier n’a été envoyé." + +#: wp-admin/includes/file.php:779 +msgid "The uploaded file was only partially uploaded." +msgstr "Le fichier n’a été que partiellement envoyé." + +#: wp-admin/includes/file.php:400 wp-admin/includes/file.php:460 +#: wp-admin/includes/file.php:693 wp-admin/includes/file.php:699 +msgid "Sorry, that file cannot be edited." +msgstr "Désolé, ce fichier ne peut être modifié." + +#: wp-admin/includes/file.php:63 +msgid "Popup Comments Template" +msgstr "Modèle pour la fenêtre de commentaires" + +#: wp-admin/includes/file.php:62 +msgid "Comments Template" +msgstr "Modèle pour les commentaires" + +#: wp-admin/includes/file.php:59 +msgid ".htaccess (for rewrite rules )" +msgstr ".htaccess (pour les règles de réécriture)" + +#: wp-admin/includes/file.php:58 +msgid "my-hacks.php (legacy hacks support)" +msgstr "my-hacks.php (reconnaissance des hacks existants)" + +#: wp-admin/includes/file.php:45 +msgid "Application Attachment Template" +msgstr "Modèle pour les programmes attachés" + +#: wp-admin/includes/file.php:44 +msgid "Audio Attachment Template" +msgstr "Modèle pour les fichiers audio attachés" + +#: wp-admin/includes/file.php:43 +msgid "Video Attachment Template" +msgstr "Modèle pour les vidéos attachées" + +#: wp-admin/includes/file.php:42 +msgid "Image Attachment Template" +msgstr "Modèle pour les images attachées" + +#: wp-admin/includes/file.php:41 +msgid "Attachment Template" +msgstr "Modèle pour les fichiers attachés" + +#: wp-admin/includes/file.php:16 +msgid "Theme Functions" +msgstr "Fonctions du thème" + +#: wp-admin/includes/file.php:23 +msgid "Links Template" +msgstr "Modèle pour les liens" + +#: wp-admin/includes/file.php:22 +msgid "404 Template" +msgstr "Modèle pour l’erreur 404" + +#: wp-admin/includes/file.php:36 +msgid "Single Post" +msgstr "Publication seule" + +#: wp-admin/includes/file.php:21 +msgid "Search Form" +msgstr "Formulaire de recherche" + +#: wp-admin/erase-personal-data.php:77 wp-admin/export-personal-data.php:77 +msgid "Search Requests" +msgstr "Recherche dans les demandes" + +#: wp-admin/includes/file.php:29 +msgid "Category Template" +msgstr "Modèle pour les catégories" + +#: wp-admin/includes/file.php:64 +msgid "Popup Comments" +msgstr "Commentaires en popup" + +#: wp-admin/includes/file.php:56 +msgid "RTL Stylesheet" +msgstr "Feuille de style RTL" + +#: wp-admin/includes/file.php:25 +msgid "Main Index Template" +msgstr "Modèle pour la page d’accueil" + +#: wp-admin/includes/dashboard.php:1089 wp-admin/includes/dashboard.php:1268 +msgid "This widget requires JavaScript." +msgstr "Ce widget nécessite JavaScript." + +#. translators: 1: Type of comment, 2: Notification if the comment is pending. +#: wp-admin/includes/dashboard.php:841 +msgctxt "dashboard" +msgid "%1$s %2$s" +msgstr "%1$s dans %2$s" + +#: wp-admin/includes/dashboard.php:799 wp-admin/includes/dashboard.php:806 +#: wp-admin/includes/dashboard.php:836 wp-admin/includes/dashboard.php:843 +msgid "[Pending]" +msgstr "[En attente]" + +#. translators: 1: Comment author, 2: Post link, 3: Notification if the comment +#. is pending. +#: wp-admin/includes/dashboard.php:796 +msgid "From %1$s on %2$s %3$s" +msgstr "Par %1$s, sur %2$s%3$s" + +#: wp-admin/includes/class-wp-media-list-table.php:684 +#: wp-admin/includes/class-wp-media-list-table.php:740 +#: wp-admin/includes/class-wp-comments-list-table.php:707 +#: wp-admin/includes/class-wp-posts-list-table.php:1370 +#: wp-admin/includes/dashboard.php:734 +msgctxt "verb" +msgid "Trash" +msgstr "Corbeille" + +#: wp-admin/includes/class-wp-comments-list-table.php:706 +#: wp-admin/includes/dashboard.php:733 +msgid "Move this comment to the Trash" +msgstr "Déplacer ce commentaire dans la corbeille" + +#. translators: "Mark as spam" link. +#: wp-admin/includes/class-wp-comments-list-table.php:671 +#: wp-admin/includes/dashboard.php:717 +msgctxt "verb" +msgid "Spam" +msgstr "Indésirable" + +#: wp-admin/includes/class-wp-comments-list-table.php:669 +#: wp-admin/includes/dashboard.php:715 +msgid "Mark this comment as spam" +msgstr "Marquer ce commentaire comme indésirable" + +#: wp-admin/includes/class-wp-comments-list-table.php:737 +#: wp-admin/includes/dashboard.php:707 +msgid "Reply to this comment" +msgstr "Répondre à ce commentaire" + +#: wp-admin/includes/class-wp-comments-list-table.php:634 +#: wp-admin/includes/class-wp-comments-list-table.php:659 +#: wp-admin/includes/dashboard.php:692 +msgid "Unapprove this comment" +msgstr "Désapprouver ce commentaire" + +#: wp-admin/includes/class-wp-comments-list-table.php:642 +#: wp-admin/includes/class-wp-comments-list-table.php:651 +#: wp-admin/includes/dashboard.php:684 +msgid "Approve this comment" +msgstr "Approuver ce commentaire" + +#: wp-admin/includes/nav-menu.php:459 wp-admin/includes/nav-menu.php:744 +msgid "Page" +msgstr "Page" + +#: wp-admin/includes/template.php:457 wp-admin/edit-form-comment.php:72 +msgid "Comment" +msgstr "Commentaire" + +#: wp-admin/includes/dashboard.php:191 +msgid "Configure" +msgstr "Configurer" + +#: wp-admin/includes/dashboard.php:136 +msgid "View all" +msgstr "Afficher tout" + +#: wp-admin/includes/dashboard.php:1477 +msgid "Other WordPress News" +msgstr "Autres actualités de WordPress (en français)" + +#: wp-admin/includes/dashboard.php:65 +msgid "Right Now" +msgstr "Aujourd’hui" + +#. translators: %s: Destination file path. +#: wp-admin/includes/file.php:898 +msgid "The uploaded file could not be moved to %s." +msgstr "Le fichier n’a pas pu être déplacé vers %s." + +#: wp-admin/includes/class-file-upload-upgrader.php:56 +#: wp-admin/includes/class-file-upload-upgrader.php:95 +#: wp-admin/includes/class-file-upload-upgrader.php:111 +msgid "Please select a file" +msgstr "Veuillez choisir un fichier" + +#: wp-admin/includes/class-theme-installer-skin.php:127 +#: wp-admin/includes/class-theme-upgrader-skin.php:109 +#: wp-admin/includes/class-bulk-theme-upgrader-skin.php:51 +msgid "Return to Themes page" +msgstr "Retourner à la page des thèmes" + +#: wp-admin/includes/class-theme-installer-skin.php:121 +msgid "Return to Theme Installer" +msgstr "Retourner à l’installeur de thèmes" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-themes-list-table.php:215 +#: wp-admin/includes/class-theme-installer-skin.php:106 +#: wp-admin/includes/class-theme-upgrader-skin.php:97 +msgid "Activate “%s”" +msgstr "Activer « %s »" + +#. translators: %s: Theme name. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-theme-install-list-table.php:273 +#: wp-admin/includes/class-wp-posts-list-table.php:1392 +msgid "Preview “%s”" +msgstr "Prévisualiser « %s »" + +#. translators: 1: Theme name, 2: Theme version. +#: wp-admin/includes/class-theme-upgrader.php:72 +msgid "Successfully installed the theme %1$s %2$s." +msgstr "Le thème %1$s %2$s a bien été installé." + +#: wp-admin/includes/class-plugin-installer-skin.php:102 +#: wp-admin/includes/class-plugin-installer-skin.php:108 +msgid "Return to Plugin Installer" +msgstr "Retourner à l’installeur d’extensions" + +#. translators: 1: Plugin name, 2: Plugin version. +#: wp-admin/includes/class-plugin-installer-skin.php:47 +msgid "Successfully installed the plugin %1$s %2$s." +msgstr "L’extension %1$s %2$s a bien été installée." + +#: wp-admin/includes/class-plugin-installer-skin.php:114 +#: wp-admin/includes/class-bulk-plugin-upgrader-skin.php:51 +#: wp-admin/includes/class-plugin-upgrader-skin.php:67 +msgid "Return to Plugins page" +msgstr "Retourner à la page des extensions" + +#: wp-admin/includes/class-plugin-installer-skin.php:79 +#: wp-admin/includes/class-plugin-upgrader-skin.php:62 +msgid "Activate Plugin" +msgstr "Activer l’extension" + +#: wp-admin/includes/class-core-upgrader.php:35 +msgid "Could not copy files." +msgstr "Impossible de copier les fichiers." + +#: wp-admin/includes/class-core-upgrader.php:29 +msgid "WordPress is at the latest version." +msgstr "Vous avez la dernière version de WordPress." + +#: wp-admin/includes/class-theme-upgrader.php:70 +msgid "Theme installed successfully." +msgstr "Le thème a bien été installé." + +#: wp-admin/includes/class-theme-upgrader.php:67 +msgid "Installing the theme…" +msgstr "Installation du thème…" + +#: wp-admin/includes/class-theme-upgrader.php:52 +msgid "Could not remove the old theme." +msgstr "Impossible de supprimer l’ancien thème." + +#: wp-admin/includes/class-theme-upgrader.php:51 +msgid "Removing the old version of the theme…" +msgstr "Retrait de l’ancienne version du thème…" + +#: wp-admin/includes/class-theme-upgrader.php:46 +msgid "The theme is at the latest version." +msgstr "Vous avez la dernière version de ce thème." + +#: wp-admin/includes/class-plugin-upgrader.php:72 +msgid "Plugin installed successfully." +msgstr "L’extension a bien été installée." + +#: wp-admin/includes/class-plugin-upgrader.php:69 +msgid "Installing the plugin…" +msgstr "Installation de l’extension…" + +#: wp-admin/includes/class-plugin-upgrader.php:68 +#: wp-admin/includes/class-theme-upgrader.php:66 +msgid "Unpacking the package…" +msgstr "Décompression de l’archive de l’extension…" + +#: wp-admin/includes/class-plugin-upgrader.php:65 +#: wp-admin/includes/class-theme-upgrader.php:63 +msgid "Installation package not available." +msgstr "L’archive d’installation n’est pas disponible." + +#: wp-admin/includes/class-plugin-upgrader.php:53 +msgid "Could not remove the old plugin." +msgstr "Impossible de supprimer l’ancienne extension." + +#: wp-admin/includes/class-plugin-upgrader.php:52 +msgid "Removing the old version of the plugin…" +msgstr "Retrait de l’ancienne version de l’extension…" + +#: wp-admin/includes/class-plugin-upgrader.php:51 +#: wp-admin/includes/class-theme-upgrader.php:50 +#: wp-admin/includes/class-core-upgrader.php:34 +#: wp-admin/includes/class-language-pack-upgrader.php:118 +msgid "Unpacking the update…" +msgstr "Décompression de la mise à jour…" + +#: wp-admin/includes/class-plugin-upgrader.php:47 +msgid "The plugin is at the latest version." +msgstr "Vous avez la dernière version de cette extension." + +#: wp-admin/includes/update-core.php:1180 +#: wp-admin/includes/class-wp-upgrader.php:168 +msgid "Disabling Maintenance mode…" +msgstr "Désactivation du mode maintenance…" + +#: wp-admin/includes/update-core.php:1083 +#: wp-admin/includes/class-wp-upgrader.php:167 +msgid "Enabling Maintenance mode…" +msgstr "Activation du mode maintenance…" + +#: wp-admin/includes/file.php:1480 wp-admin/includes/file.php:1619 +msgid "Incompatible Archive." +msgstr "Archive incompatible." + +#: wp-admin/includes/update-core.php:1352 +#: wp-admin/includes/class-wp-upgrader.php:163 wp-admin/includes/file.php:1547 +#: wp-admin/includes/file.php:1673 wp-admin/includes/file.php:1739 +msgid "Could not create directory." +msgstr "Impossible de créer le dossier." + +#: wp-admin/includes/class-wp-upgrader.php:162 +msgid "Destination folder already exists." +msgstr "Le dossier de destination existe déjà." + +#: wp-admin/includes/class-wp-upgrader.php:160 +msgid "Installing the latest version…" +msgstr "Installation de la dernière version…" + +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:62 +#: wp-admin/includes/class-wp-upgrader.php:159 +msgid "Download failed." +msgstr "Le téléchargement a échoué." + +#. translators: %s: Directory name. +#: wp-admin/includes/class-wp-upgrader.php:157 +msgid "Unable to locate needed folder (%s)." +msgstr "Impossible de localiser le dossier nécessaire (%s)." + +#: wp-admin/includes/class-wp-upgrader.php:154 wp-admin/includes/plugin.php:944 +msgid "Unable to locate WordPress plugin directory." +msgstr "Impossible de localiser le répertoire d’extension de WordPress." + +#: wp-admin/includes/class-wp-upgrader.php:153 +msgid "Unable to locate WordPress content directory (wp-content)." +msgstr "Impossible de localiser le répertoire de contenu de WordPress (wp-content)." + +#: wp-admin/includes/class-wp-upgrader.php:152 +msgid "Unable to locate WordPress root directory." +msgstr "Impossible de localiser le répertoire racine de WordPress." + +#: wp-admin/includes/theme.php:66 wp-admin/includes/class-wp-upgrader.php:151 +#: wp-admin/includes/plugin.php:938 +msgid "Filesystem error." +msgstr "Erreur du système de fichier." + +#: wp-admin/includes/theme.php:62 +#: wp-admin/includes/class-wp-automatic-updater.php:367 +#: wp-admin/includes/class-wp-upgrader.php:150 wp-admin/includes/file.php:1404 +#: wp-admin/includes/plugin.php:934 +msgid "Could not access filesystem." +msgstr "Impossible d’accéder au système de fichier." + +#: wp-admin/includes/class-wp-upgrader.php:149 +msgid "Invalid data provided." +msgstr "Les données fournies ne sont pas valides." + +#. translators: %s: Command. +#: wp-admin/includes/class-wp-filesystem-ssh2.php:230 +msgid "Unable to perform command: %s" +msgstr "Impossible de lancer la commande : %s" + +#. translators: %s: Username. +#: wp-admin/includes/class-wp-filesystem-ssh2.php:167 +msgid "Public and Private keys incorrect for %s" +msgstr "Les clés publiques et privées de %s ne sont pas correctes" + +#. translators: %s: hostname:port +#: wp-admin/includes/class-wp-filesystem-ssh2.php:142 +msgid "Failed to connect to SSH2 Server %s" +msgstr "Impossible de se connecter au serveur SSH2 %s" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:116 +msgid "SSH2 password is required" +msgstr "Le mot de passe SSH2 est nécessaire" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:106 +msgid "SSH2 username is required" +msgstr "L’identifiant SSH2 est nécessaire" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:92 +msgid "SSH2 hostname is required" +msgstr "Le nom de l’hôte SSH2 est nécessaire" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:69 +msgid "The ssh2 PHP extension is not available" +msgstr "L’extension ssh2 de PHP n’est pas disponible" + +#. translators: %s: Username. +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:110 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:108 +#: wp-admin/includes/class-wp-filesystem-ssh2.php:155 +msgid "Username/Password incorrect for %s" +msgstr "Le couple identifiant / mot de passe est incorrect pour %s" + +#. translators: %s: hostname:port +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:86 +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:98 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:96 +msgid "Failed to connect to FTP Server %s" +msgstr "Impossible de se connecter au serveur FTP %s" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:61 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:66 +msgid "FTP password is required" +msgstr "Le mot de passe FTP est nécessaire" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:55 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:60 +msgid "FTP username is required" +msgstr "L’identifiant FTP est nécessaire" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:48 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:53 +msgid "FTP hostname is required" +msgstr "Le nom de l’hôte FTP est nécessaire" + +#: wp-admin/includes/class-wp-filesystem-ftpext.php:37 +msgid "The ftp PHP extension is not available" +msgstr "L’extension ftp de PHP n’est pas disponible" + +#. translators: %s: Directory name. +#: wp-admin/includes/class-wp-filesystem-base.php:301 +msgid "Found %s" +msgstr "Trouvé %s" + +#. translators: %s: Directory name. +#: wp-admin/includes/class-wp-filesystem-base.php:284 +msgid "Changing to %s" +msgstr "Modifier à %s" + +#: wp-admin/includes/bookmark.php:216 +msgid "Could not insert link into the database" +msgstr "Impossible d’insérer le lien dans la base de données" + +#: wp-admin/includes/bookmark.php:208 +msgid "Could not update link in the database" +msgstr "Impossible de mettre à jour le lien dans la base de données" + +#: wp-admin/includes/import.php:208 +msgid "Movable Type and TypePad" +msgstr "Movable Type et TypePad" + +#: wp-admin/includes/import.php:202 +msgid "LiveJournal" +msgstr "LiveJournal" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:278 +#: wp-admin/includes/class-wp-theme-install-list-table.php:151 +#: wp-admin/theme-install.php:65 wp-admin/setup-config.php:278 +msgid "Try Again" +msgstr "Recommencer" + +#: wp-admin/includes/import.php:190 +msgid "Blogger" +msgstr "Blogger" + +#: wp-admin/import.php:96 +msgid "No importers are available." +msgstr "Aucun outil d’importation n’est disponible." + +#: wp-admin/export.php:320 +msgid "Download Export File" +msgstr "Télécharger le fichier d’export" + +#: wp-admin/export.php:172 +msgid "This format, which we call WordPress eXtended RSS or WXR, will contain your posts, pages, comments, custom fields, categories, and tags." +msgstr "Ce format, que nous appelons WordPress eXtended RSS (ou WXR), contient tous vos articles, pages, commentaires, champs personnalisés, catégories et étiquettes." + +#: wp-admin/export.php:171 +msgid "When you click the button below WordPress will create an XML file for you to save to your computer." +msgstr "Cliquez sur ce bouton pour que WordPress crée un fichier XML que vous pourrez enregistrer sur votre ordinateur." + +#: wp-admin/export.php:18 wp-admin/menu.php:280 +msgid "Export" +msgstr "Exporter" + +#: wp-admin/includes/class-wp-screen.php:1330 +#: wp-admin/includes/class-wp-list-table.php:170 +msgid "Excerpt View" +msgstr "Liste avec extraits" + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-posts-list-table.php:330 +msgctxt "posts" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Tous (%s)" +msgstr[1] "Tous (%s)" + +#. translators: %s: Number of posts. +#: wp-admin/includes/class-wp-posts-list-table.php:309 +msgctxt "posts" +msgid "Mine (%s)" +msgid_plural "Mine (%s)" +msgstr[0] "Le mien (%s)" +msgstr[1] "Les miens (%s)" + +#. translators: %s: Number of blocks. +#: wp-admin/edit.php:363 +msgid "%s block not updated, somebody is editing it." +msgid_plural "%s blocks not updated, somebody is editing them." +msgstr[0] "%s bloc n’a pas été mise à jour : quelqu’un est en train de le modifier." +msgstr[1] "%s blocs n’ont pas été mis à jour : quelqu’un est en train de les modifier." + +#. translators: %s: Number of posts. +#: wp-admin/edit.php:334 +msgid "%s post updated." +msgid_plural "%s posts updated." +msgstr[0] "%s publication mise à jour." +msgstr[1] "%s publications mises à jour." + +#: wp-admin/edit-tags.php:117 wp-admin/post.php:309 wp-admin/themes.php:63 +#: wp-admin/upload.php:191 wp-admin/edit.php:156 +msgid "Sorry, you are not allowed to delete this item." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer cet élément." + +#: wp-admin/includes/edit-tag-messages.php:19 +msgid "Items deleted." +msgstr "Élements supprimés." + +#: wp-admin/includes/edit-tag-messages.php:17 +msgid "Item not added." +msgstr "Contenu non ajouté." + +#: wp-admin/includes/edit-tag-messages.php:16 +msgid "Item updated." +msgstr "Contenu mis à jour." + +#: wp-admin/includes/edit-tag-messages.php:15 +msgid "Item deleted." +msgstr "Contenu supprimé." + +#: wp-admin/edit-tags.php:491 wp-admin/edit-tag-form.php:181 +msgid "Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional." +msgstr "Les catégories, contrairement aux étiquettes, peuvent avoir une hiérarchie. Vous pouvez avoir une catégorie nommée Jazz, et à l’intérieur, plusieurs catégories comme Bebop et Big Band. Ceci est totalement facultatif." + +#: wp-admin/edit-tags.php:442 wp-admin/edit-tag-form.php:134 +msgid "The name is how it appears on your site." +msgstr "Ce nom est utilisé un peu partout sur votre site." + +#: wp-admin/edit-link-form.php:133 +msgid "This will be shown when someone hovers over the link in the blogroll, or optionally below the link." +msgstr "Cette description sera affichée lors du survol du lien dans la liste de liens ; elle pourra également apparaître sous le lien si votre thème le prévoit." + +#: wp-admin/edit-link-form.php:125 +msgid "Example: http://wordpress.org/ — don’t forget the http://" +msgstr "Exemple : https://fr.wordpress.org/ — Et n’oubliez pas le https:// !" + +#: wp-admin/edit-link-form.php:122 +msgid "Web Address" +msgstr "Adresse web" + +#: wp-admin/edit-link-form.php:117 +msgid "Example: Nifty blogging software" +msgstr "Exemple : Logiciel de création de sites rapide, puissant et efficace" + +#: wp-admin/edit-link-form.php:95 +msgid "Link added." +msgstr "Lien ajouté." + +#. translators: %s: URL to Links screen. +#: wp-admin/edit-link-form.php:22 +msgid "Links / Add New Link" +msgstr "Liens / Ajouter un nouveau lien" + +#: wp-admin/includes/meta-boxes.php:1072 wp-admin/edit-link-form.php:17 +msgid "Update Link" +msgstr "Mettre à jour le lien" + +#. translators: %s: URL to Links screen. +#: wp-admin/edit-link-form.php:16 +msgid "Links / Edit Link" +msgstr "Liens / Modifier le lien" + +#: wp-admin/edit-tags.php:500 wp-admin/edit-tag-form.php:191 +msgid "The description is not prominent by default; however, some themes may show it." +msgstr "La description n’est pas très utilisée par défaut, cependant de plus en plus de thèmes l’affichent." + +#: wp-admin/edit-tags.php:448 wp-admin/edit-tag-form.php:156 +msgid "The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." +msgstr "Le slug est la version normalisée du nom. Il ne contient généralement que des lettres minuscules non accentuées, des chiffres et des traits d’union." + +#: wp-admin/themes.php:208 wp-admin/themes.php:212 +msgid "Visit site" +msgstr "Aller sur le site" + +#: wp-admin/includes/template.php:493 +msgid "Update Comment" +msgstr "Mettre à jour le commentaire" + +#. translators: 1: Date of last edit, 2: Time of last edit. +#. translators: 1: Post edited date, 2: Post edited time. +#: wp-admin/includes/ajax-actions.php:2791 wp-admin/edit-form-advanced.php:619 +msgid "Last edited on %1$s at %2$s" +msgstr "Dernière modification le %1$s à %2$s" + +#. translators: 1: User's display name, 2: Date of last edit, 3: Time of last +#. edit. +#. translators: 1: Name of most recent post author, 2: Post edited date, 3: +#. Post edited time. +#: wp-admin/includes/ajax-actions.php:2788 wp-admin/edit-form-advanced.php:616 +msgid "Last edited by %1$s on %2$s at %3$s" +msgstr "Dernière modification par %1$s, le %2$s à %3$s" + +#: wp-admin/includes/meta-boxes.php:1504 +msgid "Custom Fields" +msgstr "Champs personnalisés" + +#: wp-admin/includes/meta-boxes.php:1498 +msgid "Send Trackbacks" +msgstr "Envoyer des rétroliens" + +#. translators: %s: Date and time of the revision. +#: wp-admin/edit-form-advanced.php:200 +msgid "Page restored to revision from %s." +msgstr "Page rétablie à partir de la révision du %s." + +#: wp-admin/edit-form-advanced.php:187 +msgid "Post saved." +msgstr "Publication enregistrée." + +#. translators: %s: Date and time of the revision. +#: wp-admin/edit-form-advanced.php:185 +msgid "Post restored to revision from %s." +msgstr "Publication rétablie à partir de la révision du %s." + +#: wp-admin/edit-form-advanced.php:182 wp-admin/edit-form-advanced.php:197 +msgid "Custom field deleted." +msgstr "Champ personnalisé supprimé." + +#: wp-admin/edit-form-advanced.php:181 wp-admin/edit-form-advanced.php:196 +msgid "Custom field updated." +msgstr "Champ personnalisé mis à jour." + +#: wp-admin/includes/class-wp-comments-list-table.php:206 +msgid "No comments found." +msgstr "Aucun commentaire trouvé." + +#: wp-admin/includes/class-wp-media-list-table.php:189 +#: wp-admin/includes/class-wp-comments-list-table.php:417 +#: wp-admin/includes/class-wp-posts-list-table.php:566 +msgid "Empty Trash" +msgstr "Vider la corbeille" + +#: wp-admin/includes/class-wp-comments-list-table.php:417 +msgid "Empty Spam" +msgstr "Supprimer tous les indésirables" + +#: wp-admin/includes/class-wp-links-list-table.php:119 +#: wp-admin/includes/class-wp-media-list-table.php:185 +#: wp-admin/includes/class-wp-comments-list-table.php:412 +#: wp-admin/includes/class-wp-posts-list-table.php:561 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:339 +msgid "Filter" +msgstr "Filtrer" + +#: wp-admin/includes/class-wp-comments-list-table.php:396 +#: wp-admin/includes/class-wp-posts-list-table.php:1764 +msgid "Pings" +msgstr "Pings" + +#: wp-admin/includes/class-wp-comments-list-table.php:342 +#: wp-admin/includes/class-wp-comments-list-table.php:643 +#: wp-admin/includes/class-wp-comments-list-table.php:652 +#: wp-admin/includes/dashboard.php:685 +msgid "Approve" +msgstr "Approuver" + +#: wp-admin/includes/class-wp-comments-list-table.php:339 +#: wp-admin/includes/class-wp-comments-list-table.php:635 +#: wp-admin/includes/class-wp-comments-list-table.php:660 +#: wp-admin/includes/dashboard.php:693 +msgid "Unapprove" +msgstr "Désapprouver" + +#: wp-admin/includes/class-wp-list-table.php:466 wp-admin/edit.php:267 +msgid "Bulk Actions" +msgstr "Actions groupées" + +#. translators: 1: Starting number of users on the current page, 2: Ending +#. number of users, 3: Total number of users. +#: wp-admin/includes/deprecated.php:605 +msgid "Displaying %1$s–%2$s of %3$s" +msgstr "Affichage de %1$s à %2$s sur %3$ss" + +#: wp-admin/edit-comments.php:329 +msgid "Search Comments" +msgstr "Rechercher des commentaires" + +#: wp-admin/edit-form-comment.php:102 +msgid "Approved" +msgstr "Approuvé" + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:300 +msgid "%s comment permanently deleted." +msgid_plural "%s comments permanently deleted." +msgstr[0] "%s commentaire supprimé définitivement." +msgstr[1] "%s commentaires supprimés définitivement." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:284 +msgid "%s comment restored from the spam." +msgid_plural "%s comments restored from the spam." +msgstr[0] "%s commentaire rétabli depuis les commentaires indésirables." +msgstr[1] "%s commentaires rétablis depuis les commentaires indésirables." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:279 +msgid "%s comment marked as spam." +msgid_plural "%s comments marked as spam." +msgstr[0] "%s commentaire marqué comme indésirable." +msgstr[1] "%s commentaires marqués comme indésirables." + +#. translators: %s: Number of comments. +#: wp-admin/edit-comments.php:273 +msgid "%s comment approved." +msgid_plural "%s comments approved." +msgstr[0] "%s commentaire approuvé." +msgstr[1] "%s commentaires approuvés." + +#: wp-admin/includes/class-wp-media-list-table.php:161 +#: wp-admin/includes/class-wp-media-list-table.php:534 +#: wp-admin/includes/class-wp-media-list-table.php:712 +msgid "Attach" +msgstr "Joindre" + +#: wp-admin/includes/class-wp-media-list-table.php:524 +msgid "(Unattached)" +msgstr "(Non attaché)" + +#: wp-admin/includes/class-wp-media-list-table.php:457 +#: wp-admin/includes/class-wp-posts-list-table.php:1065 +msgid "Unpublished" +msgstr "Non publié" + +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-media-list-table.php:702 +#: wp-admin/includes/class-wp-media-list-table.php:760 +#: wp-admin/includes/class-wp-posts-list-table.php:1401 +msgid "View “%s”" +msgstr "Afficher « %s »" + +#. translators: %s: Link name. +#. translators: %s: Taxonomy term name. +#. translators: %s: Attachment title. +#. translators: %s: Post title. +#: wp-admin/includes/class-wp-links-list-table.php:195 +#: wp-admin/includes/class-wp-terms-list-table.php:477 +#: wp-admin/includes/class-wp-media-list-table.php:673 +#: wp-admin/includes/class-wp-media-list-table.php:721 +#: wp-admin/includes/class-wp-posts-list-table.php:1341 +#: wp-admin/includes/dashboard.php:620 wp-admin/includes/dashboard.php:977 +msgid "Edit “%s”" +msgstr "Modifier « %s »" + +#: wp-admin/includes/class-custom-image-header.php:856 +msgid "Choose the part of the image you want to use as your header." +msgstr "Choisissez la partie de l’image que vous voulez utiliser comme en-tête." + +#: wp-admin/includes/class-custom-image-header.php:838 +#: wp-admin/includes/class-custom-image-header.php:981 +msgid "Image Processing Error" +msgstr "Erreur lors du traitement de l’image" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-custom-image-header.php:496 +msgid "Header updated. Visit your site to see how it looks." +msgstr "L’en-tête a été mis à jour. Visiter le site pour voir son nouvel aspect." + +#: wp-admin/includes/theme.php:284 +#: wp-admin/includes/class-custom-image-header.php:475 +msgid "Custom Header" +msgstr "Personnalisation de l’en-tête" + +#: wp-admin/includes/template.php:2381 wp-admin/nav-menus.php:751 +#: wp-admin/options.php:373 +msgid "Save Changes" +msgstr "Enregistrer les modifications" + +#: wp-admin/includes/class-custom-background.php:329 +#: wp-admin/includes/class-custom-image-header.php:609 +msgid "Choose an image from your computer:" +msgstr "Choisissez une image sur votre ordinateur :" + +#. translators: %s: Home URL. +#: wp-admin/includes/class-custom-background.php:247 +msgid "Background updated. Visit your site to see how it looks." +msgstr "L’arrière-plan a été mis à jour. Afficher votre site pour voir le rendu." + +#: wp-admin/includes/class-custom-background.php:226 +#: wp-admin/includes/theme.php:282 +msgid "Custom Background" +msgstr "Arrière-plan personnalisé" + +#: wp-admin/comment.php:356 +msgid "Unknown action." +msgstr "Action inconnue." + +#: wp-admin/comment.php:136 +msgid "Approve Comment" +msgstr "Approuver le commentaire" + +#: wp-admin/comment.php:135 +msgid "You are about to approve the following comment:" +msgstr "Vous êtes sur le point d’approuver le commentaire suivant :" + +#: wp-admin/comment.php:132 +msgid "Permanently Delete Comment" +msgstr "Supprimer définitivement le commentaire" + +#: wp-admin/comment.php:131 +msgid "You are about to delete the following comment:" +msgstr "Vous êtes sur le point de supprimer le commentaire suivant :" + +#: wp-admin/comment.php:127 +msgid "You are about to move the following comment to the Trash:" +msgstr "Vous êtes sur le point de déplacer le commentaire suivant dans la corbeille :" + +#: wp-admin/comment.php:123 +msgid "You are about to mark the following comment as spam:" +msgstr "Vous êtes sur le point de marquer le commentaire suivant comme indésirable :" + +#: wp-admin/comment.php:75 +msgid "This comment is in the Trash. Please move it out of the Trash if you want to edit it." +msgstr "Ce commentaire est dans la corbeille. Veuillez l’en sortir avant de le modifier." + +#: wp-admin/includes/comment.php:52 wp-admin/comment.php:271 +#: wp-admin/edit-comments.php:253 +msgid "Sorry, you are not allowed to edit comments on this post." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier les commentaires de cette publication." + +#: wp-admin/includes/template.php:451 wp-admin/comment.php:42 +#: wp-admin/edit-form-comment.php:17 +msgid "Edit Comment" +msgstr "Modifier le commentaire" + +#: wp-admin/admin.php:322 wp-admin/import.php:18 wp-admin/menu.php:279 +msgid "Import" +msgstr "Importer" + +#. translators: %s: Admin page generated by a plugin. +#: wp-admin/admin.php:262 +msgid "Cannot load %s." +msgstr "Impossible de charger %s." + +#: wp-admin/admin.php:257 +msgid "Invalid plugin page." +msgstr "Page d’extension non valide." + +#: wp-admin/includes/edit-tag-messages.php:18 +#: wp-admin/includes/ajax-actions.php:2127 +#: wp-admin/includes/ajax-actions.php:2133 +msgid "Item not updated." +msgstr "L’élément n’a pas été mis à jour." + +#. translators: %s: User's display name. +#: wp-admin/includes/ajax-actions.php:2004 +msgid "Saving is disabled: %s is currently editing this post." +msgstr "Enregistrement automatique désactivé : %s modifie actuellement cette publication." + +#. translators: %s: User's display name. +#: wp-admin/includes/ajax-actions.php:2008 +msgid "Saving is disabled: %s is currently editing this page." +msgstr "Enregistrement automatique désactivé : %s modifie actuellement cette page." + +#: wp-admin/includes/ajax-actions.php:2001 +msgid "Someone" +msgstr "Quelqu’un" + +#. translators: %s: Date and time. +#: wp-admin/includes/misc.php:1228 +msgid "Draft saved at %s." +msgstr "Brouillon enregistré à %s." + +#. translators: Draft saved date format, see https://www.php.net/date +#: wp-admin/includes/misc.php:1224 +msgid "g:i:s a" +msgstr "G \\h i \\m\\i\\n s \\s" + +#: wp-admin/includes/ajax-actions.php:1577 +#: wp-admin/includes/ajax-actions.php:1585 +msgid "Please provide a custom field value." +msgstr "Veuillez saisir une valeur pour le champ personnalisé." + +#: wp-admin/includes/ajax-actions.php:1301 +msgid "Sorry, you must be logged in to reply to a comment." +msgstr "Désolé, vous devez être connecté·e pour répondre à un commentaire." + +#: wp-admin/includes/taxonomy.php:136 +msgid "You did not enter a category name." +msgstr "Vous n’avez pas saisi de nom de catégorie." + +#. translators: %d: Comment ID. +#: wp-admin/includes/ajax-actions.php:960 +msgid "Comment %d does not exist" +msgstr "Le commentaire %d n’existe pas." + +#: wp-admin/includes/media.php:2783 wp-admin/includes/nav-menu.php:458 +#: wp-admin/includes/nav-menu.php:743 +msgid "»" +msgstr "»" + +#: wp-admin/includes/media.php:2782 wp-admin/includes/nav-menu.php:457 +#: wp-admin/includes/nav-menu.php:742 +msgid "«" +msgstr "«" \ No newline at end of file diff --git a/content/languages/admin-network-fr_FR.mo b/content/languages/admin-network-fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..9a638fe040c13df0c7d436e32076169047d39fdc GIT binary patch literal 49998 zcmc(o3AkNVdG|L8g2Bolh>FN25J({RW&jxyh=wFcl!TB0MMORK+iar)Irx3>XmHiiEV~-K1l0M9 zK=tR9AXR5?0`=S--~+%rLDBCnkRi^#0jm6;gX;gHWj-FKgH(}S2J%%_fNug{28!P2 zottG31vh{y|H+`9p90mdXMy6wSAvVcw}Rr2_keeUp8}r%-p1hkG5B3j^u3iqdp7tB za2$NrNS1v8{3cif-w*Mx1W$rk+rS$@@ymNaNSPh8(&@G$;A6oHxPA?&_WTa0{=N8f+sO(qSwR0Enp6+e=YDf@cE$nf7WWg1J{DEc=i-f00sjFU<2>8!`nL|E0tA`UrRz_(bsKS7YnIdq7B;oxUy5G2pGB>ia7ASn!l%O zdh&aSxD`|%2J1?Qgw{}KEdsCvH! zF-`=(1B!2c4*n*1F3h$J{3CD{ybDzQTd(u+m;}|{XM-A#w}DH+zXDaxe}Wq4Ghj-c zUjeQJyWqLtABO8+03{bc1J(X>ulMJ+gH)OA0bc^%3El$U@D%6IAAsV!2jAd)yam+r zF9jtJ9|CzK`yn_5Zhfkc(?`IQIsYs0H1Hds==e)e^f=*ZK7OZz8s8P*7Vr`fR>@uf z!a~_yAS{=i{dA{a2h_O#HmL7k4KhU8KY{AUCABPrBt+Vd}<>fMfzsNQi<&v!tL z$8UlcFwUCmsU0%Kh>b`G+=Yc;2SAdT~NY($XU>BSP+u(P?`I8G|l=IJnF9jbz z;rje5;2zGOH0g4FC#d#5nnpeZd>MEO_!ck+KL&mW{3@t+e5T?2@OR(`IR74~_WZ$( zZuh?kLaOY2yIpRMZ@T~UW^gIj4}jwH?}EpIKLyVMkDku5SAomH$AF |s=MqHW-2 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 Kn)Si%Xa5hZku2f> literal 0 HcmV?d00001 diff --git a/content/languages/admin-network-fr_FR.po b/content/languages/admin-network-fr_FR.po new file mode 100644 index 0000000..dfe7897 --- /dev/null +++ b/content/languages/admin-network-fr_FR.po @@ -0,0 +1,1417 @@ +# Translation of WordPress - 5.4.x - Development - Administration - Network Admin in French (France) +# This file is distributed under the same license as the WordPress - 5.4.x - Development - Administration - Network Admin package. +msgid "" +msgstr "" +"PO-Revision-Date: 2020-06-09 16:27:27+0000\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 > 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: fr\n" +"Project-Id-Version: WordPress - 5.4.x - Development - Administration - Network Admin\n" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:255 +msgid "Deleted (%s)" +msgid_plural "Deleted (%s)" +msgstr[0] "Supprimé (%s)" +msgstr[1] "Supprimés (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:248 +msgctxt "sites" +msgid "Spam (%s)" +msgid_plural "Spam (%s)" +msgstr[0] "Indésirable (%s)" +msgstr[1] "Indésirables (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:242 +msgid "Mature (%s)" +msgid_plural "Mature (%s)" +msgstr[0] "Contenu adulte (%s)" +msgstr[1] "Contenu adulte (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:236 +msgid "Archived (%s)" +msgid_plural "Archived (%s)" +msgstr[0] "Archivé (%s)" +msgstr[1] "Archivés (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:230 +msgid "Public (%s)" +msgid_plural "Public (%s)" +msgstr[0] "Public (%s)" +msgstr[1] "Publics (%s)" + +#. translators: %s: Number of sites. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:223 +msgctxt "sites" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Tous (%s)" +msgstr[1] "Tous (%s)" + +#: wp-admin/network/upgrade.php:31 +msgid "Documentation on Upgrade Network" +msgstr "Documentation sur la mise à niveau d’un réseau de sites" + +#: wp-admin/network/index.php:55 +msgid "Documentation on the Network Admin" +msgstr "Documentation sur l’administration d’un réseau de sites" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:331 +msgctxt "themes" +msgid "Update Available (%s)" +msgid_plural "Update Available (%s)" +msgstr[0] "Mise à jour disponible (%s)" +msgstr[1] "Mises à jour disponible (%s)" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:615 +msgid "Main" +msgstr "Principal" + +#: wp-admin/network.php:67 wp-admin/network.php:80 +msgid "Documentation on the Network Screen" +msgstr "Documentation sur l’écran Réseau de sites" + +#: wp-admin/network.php:66 wp-admin/network.php:79 +msgid "Documentation on Creating a Network" +msgstr "Documentation sur la création d’un réseau de site" + +#. translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES +#: wp-admin/includes/network.php:115 +msgid "The constant %s cannot be defined when creating a network." +msgstr "La constante %s ne peut pas être définie lors de la création d’un réseau." + +#: wp-admin/network/sites.php:195 +msgid "You are about to delete the following sites:" +msgstr "Vous allez supprimer les sites suivants :" + +#: wp-admin/network/site-users.php:245 +msgid "User could not be added to this site." +msgstr "L’utilisateur ne peut pas être ajouté à ce site." + +#: wp-admin/network/site-new.php:286 +msgid "The username and a link to set the password will be mailed to this email address." +msgstr "Le nom de l’utilisateur et un lien pour mettre en place son mot de passe seront envoyés à cette adresse de messagerie." + +#. translators: %s: New network admin email. +#: wp-admin/network/settings.php:175 +msgid "There is a pending change of the network admin email to %s." +msgstr "Il y a une modification en attente pour l’e-mail de l’administrateur du réseau sur %s." + +#: wp-admin/includes/network.php:329 +msgid "Sub-domain Installation" +msgstr "Installation en sous-domaine" + +#: wp-admin/includes/network.php:298 wp-admin/includes/network.php:316 +msgid "Sub-directory Installation" +msgstr "Installation en sous-répertoire" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:705 +msgid "Active Child Theme" +msgstr "Thème enfant actif" + +#: wp-admin/network/site-info.php:192 +msgid "Attributes" +msgstr "Attributs" + +#. translators: %s: File size in kilobytes. +#: wp-admin/network/settings.php:396 +msgid "%s KB" +msgstr "%s Ko" + +#. translators: %s: Default network title. +#: wp-admin/includes/network.php:169 +msgid "%s Sites" +msgstr "Les sites de %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:518 +msgctxt "theme" +msgid "Delete %s" +msgstr "Supprimer %s" + +#: wp-admin/network/themes.php:93 +msgid "Sorry, you are not allowed to delete themes for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer les thèmes de ce site." + +#: wp-admin/network/themes.php:14 +msgid "Sorry, you are not allowed to manage network themes." +msgstr "Désolé, vous n’avez pas l’autorisation de gérer les thèmes du réseau." + +#: wp-admin/network/sites.php:315 +msgid "Sorry, you are not allowed to delete that site." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer ce site." + +#: wp-admin/network/site-themes.php:14 +msgid "Sorry, you are not allowed to manage themes for this site." +msgstr "Désolé, vous n’avez pas l’autorisation de gérer les thèmes de ce site." + +#: wp-admin/network/site-new.php:17 +msgid "Sorry, you are not allowed to add sites to this network." +msgstr "Désolé, vous n’avez pas l’autorisation d’ajouter des sites sur ce réseau." + +#: wp-admin/network/site-info.php:14 wp-admin/network/site-users.php:14 +#: wp-admin/network/site-settings.php:14 +msgid "Sorry, you are not allowed to edit this site." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier ce site." + +#: wp-admin/network/settings.php:346 +msgid "The email address of the first comment author on a new site." +msgstr "L’adresse e-mail de l’auteur du premier commentaire sur un nouveau site." + +#: wp-admin/network/settings.php:342 +msgid "First Comment Email" +msgstr "E-mail du premier commentaire" + +#: wp-admin/includes/network.php:481 +msgid "That’s all, stop editing! Happy publishing." +msgstr "C’est tout, ne touchez pas à ce qui suit ! Bonne publication de contenus !" + +#. translators: 1: wp-config.php, 2: Location of wp-config file, 3: Translated +#. version of "That's all, stop editing! Happy publishing." +#: wp-admin/includes/network.php:473 +msgid "Add the following to your %1$s file in %2$s above the line reading %3$s:" +msgstr "Ajouter ce texte à votre fichier %1$s dans %2$s au dessus de la ligne %3$s :" + +#. translators: 1: Theme name, 2: Theme author. +#: wp-admin/network/themes.php:141 +msgctxt "theme" +msgid "%1$s by %2$s" +msgstr "%1$s par %2$s" + +#: wp-admin/network/site-new.php:242 +msgid "Only lowercase letters (a-z), numbers, and hyphens are allowed." +msgstr "Seuls les lettres minuscules (a-z), les nombres, et les traits d'union sont autorisés." + +#: wp-admin/network/site-new.php:168 +msgctxt "email \"From\" field" +msgid "Site Admin" +msgstr "Administrateur du site" + +#. translators: %s: wp-config.php +#: wp-admin/includes/network.php:536 +msgid "These unique authentication keys are also missing from your %s file." +msgstr "Ces clés d’authentification uniques manquent également à votre fichier %s." + +#. translators: %s: wp-config.php +#: wp-admin/includes/network.php:530 +msgid "This unique authentication key is also missing from your %s file." +msgstr "La clé unique d'authentification est aussi absente de votre fichier %s." + +#. translators: %s: wp-config.php +#: wp-admin/includes/network.php:459 +msgid "We recommend you back up your existing %s file." +msgstr "Nous vous recommandons de sauvegarder votre fichier %s existant." + +#. translators: 1: wp-config.php, 2: .htaccess +#. translators: 1: wp-config.php, 2: web.config +#: wp-admin/includes/network.php:443 wp-admin/includes/network.php:451 +msgid "We recommend you back up your existing %1$s and %2$s files." +msgstr "Nous vous recommandons de sauvegarder vos fichiers %1$s et %2$s existants." + +#. translators: 1: localhost, 2: localhost.localdomain +#: wp-admin/includes/network.php:303 +msgid "Because you are using %1$s, the sites in your WordPress network must use sub-directories. Consider using %2$s if you wish to use sub-domains." +msgstr "Dans le mesure où vous utilisez %1$s, les sites de votre réseau WordPress doivent fonctionner avec des sous-répertoires. Utilisez plutôt %2$s si vous préférez qu’ils fonctionnent avec des sous-domaines." + +#. translators: %s: Host name. +#: wp-admin/includes/network.php:285 wp-admin/includes/network.php:345 +msgid "The internet address of your network will be %s." +msgstr "L’adresse internet de votre réseau sera %s." + +#. translators: 1: Site URL, 2: Host name, 3: www. +#: wp-admin/includes/network.php:271 +msgid "We recommend you change your site domain to %1$s before enabling the network feature. It will still be possible to visit your site using the %3$s prefix with an address like %2$s but any links will not have the %3$s prefix." +msgstr "Nous vous recommandons de modifier votre adresse de site pour %1$s avant d’activer la fonctionnalité réseau. Il sera toujours possible de parcourir votre site en mettant le préfixe %3$s à une adresse telle que %2$s, mais tous les liens n’auront pas le préfixe %3$s." + +#: wp-admin/includes/network.php:226 +msgid "You cannot change this later." +msgstr "Vous ne pourrez pas changer ceci ultérieurement." + +#: wp-admin/includes/network.php:225 +msgid "Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories." +msgstr "Veuillez indiquer si vous souhaitez que les sites de votre réseau WordPress utilisent des sous-domaines ou des sous-répertoires." + +#. translators: 1: mod_rewrite, 2: mod_rewrite documentation URL, 3: Google +#. search for mod_rewrite. +#: wp-admin/includes/network.php:213 +msgid "If %1$s is disabled, ask your administrator to enable that module, or look at the Apache documentation or elsewhere for help setting it up." +msgstr "Si %1$s est désactivé, demandez à votre administrateur d’activer ce module, ou parcourez la documentation Apache . Vous pouvez aussi lancer une recherche afin de trouver de l’aide sur l’installation." + +#. translators: %s: mod_rewrite +#: wp-admin/includes/network.php:203 +msgid "It looks like the Apache %s module is not installed." +msgstr "Il semble que le module %s d’Apache ne soit pas installé." + +#. translators: %s: mod_rewrite +#: wp-admin/includes/network.php:195 +msgid "Please make sure the Apache %s module is installed as it will be used at the end of this installation." +msgstr "Veuillez vous assurer que le module %s d’Apache soit installé, car il sera utilisé à la fin de l’installation." + +#. translators: %s: Port number. +#: wp-admin/includes/network.php:142 +msgid "You cannot use port numbers such as %s." +msgstr "Vous ne pouvez pas utiliser des numéros de port tels que %s." + +#: wp-admin/includes/class-wp-ms-users-list-table.php:200 +msgctxt "user" +msgid "Registered" +msgstr "Inscription" + +#. translators: Number of users. +#: wp-admin/includes/class-wp-ms-users-list-table.php:164 +msgid "Super Admin (%s)" +msgid_plural "Super Admins (%s)" +msgstr[0] "Super-admin (%s)" +msgstr[1] "Super-admins (%s)" + +#: wp-admin/includes/class-wp-ms-users-list-table.php:118 +msgctxt "user" +msgid "Not Spam" +msgstr "N’est pas un indésirable" + +#: wp-admin/includes/class-wp-ms-users-list-table.php:117 +msgctxt "user" +msgid "Mark as Spam" +msgstr "Marquer comme indésirable" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:620 +msgid "Visit Theme Site" +msgstr "Aller sur le site du thème" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:614 +msgid "Visit %s homepage" +msgstr "Visiter la page d’accueil de %s" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:583 +msgid "Broken Theme:" +msgstr "Thème cassé :" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:494 +msgid "Network Disable %s" +msgstr "Désactiver %s pour le réseau" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:491 +msgid "Disable %s" +msgstr "Désactiver %s" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:468 +msgid "Network Enable %s" +msgstr "Activer %s sur le réseau" + +#. translators: %s: Theme name. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:465 +msgid "Enable %s" +msgstr "Activer %s" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:381 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:501 +msgid "Network Disable" +msgstr "Désactiver du réseau" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:381 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:501 +msgid "Disable" +msgstr "Désactiver" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:378 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:475 +msgid "Enable" +msgstr "Activer" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:340 +msgctxt "themes" +msgid "Broken (%s)" +msgid_plural "Broken (%s)" +msgstr[0] "Cassé (%s)" +msgstr[1] "Cassés (%s)" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:322 +msgctxt "themes" +msgid "Disabled (%s)" +msgid_plural "Disabled (%s)" +msgstr[0] "Désactivé (%s)" +msgstr[1] "Désactivés (%s)" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:313 +msgctxt "themes" +msgid "Enabled (%s)" +msgid_plural "Enabled (%s)" +msgstr[0] "Activé (%s)" +msgstr[1] "Activés (%s)" + +#. translators: %s: Number of themes. +#: wp-admin/includes/class-wp-ms-themes-list-table.php:304 +msgctxt "themes" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Tous (%s)" +msgstr[1] "Tous (%s)" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:262 +msgid "Theme" +msgstr "Thème" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:252 +msgid "You do not appear to have any themes available at this time." +msgstr "Vous ne semblez pas avoir de thème disponible en ce moment." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:250 +msgid "No themes found." +msgstr "Aucun thème trouvé." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:705 +msgctxt "verb; site" +msgid "Archive" +msgstr "Archiver" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:703 +msgid "Unarchive" +msgstr "Désarchiver" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:479 +msgid "Never" +msgstr "Jamais" + +#. translators: 1: Site title, 2: Site tagline. +#: wp-admin/includes/class-wp-ms-sites-list-table.php:452 +msgid "%1$s – %2$s" +msgstr "%1$s – %2$s" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:364 +#: wp-admin/network/site-info.php:175 +msgctxt "site" +msgid "Registered" +msgstr "Inscription" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:363 +#: wp-admin/network/site-info.php:179 +msgid "Last Updated" +msgstr "Dernière mise à jour" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:294 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:709 +msgctxt "site" +msgid "Not Spam" +msgstr "N’est pas un indésirable" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:293 +msgctxt "site" +msgid "Mark as Spam" +msgstr "Marquer comme indésirable" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:207 +msgid "No sites found." +msgstr "Aucun site trouvé." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:42 +#: wp-admin/network/site-info.php:189 +msgid "Mature" +msgstr "Adulte" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:41 +#: wp-admin/network/site-info.php:187 +msgid "Deleted" +msgstr "Supprimé" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:40 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:711 +#: wp-admin/network/site-info.php:186 +msgctxt "site" +msgid "Spam" +msgstr "Indésirable" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:39 +#: wp-admin/network/site-info.php:185 +msgid "Archived" +msgstr "Archivé" + +#: wp-admin/network/user-new.php:134 wp-admin/network/site-users.php:357 +msgid "A password reset link will be sent to the user via email." +msgstr "Un lien de réinitialisation de mot de passe sera envoyé à l’utilisateur par e-mail." + +#. translators: 1: NOBLOGREDIRECT, 2: wp-config.php +#: wp-admin/network/settings.php:212 +msgid "If registration is disabled, please set %1$s in %2$s to a URL you will redirect visitors to if they visit a non-existent site." +msgstr "Si la création de compte est désactivée, veuillez remplir la valeur de %1$s (dans le fichier %2$s) avec l’adresse vers laquelle vous souhaitez que les visiteurs soient redirigés lorsqu’ils se rendent à un site qui n’existe pas." + +#. translators: 1: WP_ALLOW_MULTISITE, 2: wp-config.php +#: wp-admin/network.php:44 +msgid "You must define the %1$s constant as true in your %2$s file to allow creation of a Network." +msgstr "Vous devez mettre la constante %1$s à true dans votre fichier %2$s afin de permettre la création d’un Réseau." + +#: wp-admin/network/themes.php:253 +msgid "Themes list navigation" +msgstr "Parcours de la liste des thèmes" + +#: wp-admin/network/sites.php:52 +msgid "Sites list" +msgstr "Liste des sites" + +#: wp-admin/network/sites.php:51 +msgid "Sites list navigation" +msgstr "Parcours de la liste des sites" + +#: wp-admin/network/site-users.php:27 +msgid "Site users list" +msgstr "Liste des utilisateurs du site" + +#: wp-admin/network/site-users.php:26 +msgid "Site users list navigation" +msgstr "Parcours de la liste des utilisateurs du site" + +#: wp-admin/network/site-users.php:25 +msgid "Filter site users list" +msgstr "Filtrer la liste des utilisateurs du site" + +#: wp-admin/network/site-themes.php:24 +msgid "Site themes list" +msgstr "Liste des thèmes du site" + +#: wp-admin/network/site-themes.php:23 +msgid "Site themes list navigation" +msgstr "Parcours de la liste des thèmes du site" + +#: wp-admin/network/site-themes.php:22 +msgid "Filter site themes list" +msgstr "Filtrer la liste des thème du site" + +#: wp-admin/network/site-new.php:121 +msgid "The domain or path entered conflicts with an existing username." +msgstr "Le domaine ou le chemin saisi est entré en conflit avec un identifiant utilisateur existant." + +#: wp-admin/network/sites.php:89 +msgid "The requested action is not valid." +msgstr "L’action demandée n’est pas valide." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:81 +msgid "You are about to mark the site %s as not mature." +msgstr "Vous êtes sur le point d’indiquer que le site %s n’est pas réservé aux adultes." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:79 +msgid "You are about to mark the site %s as mature." +msgstr "Vous êtes sur le point d’indiquer que le site %s est réservé aux adultes." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:77 +msgid "You are about to delete the site %s." +msgstr "Vous êtes sur le point de supprimer le site %s." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:75 +msgid "You are about to mark the site %s as spam." +msgstr "Vous êtes sur le point de marquer le site %s comme indésirable." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:73 +msgid "You are about to unspam the site %s." +msgstr "Vous êtes sur le point de marquer le site %s comme sain." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:71 +msgid "You are about to archive the site %s." +msgstr "Vous êtes sur le point d’archiver le site %s." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:69 +msgid "You are about to unarchive the site %s." +msgstr "Vous êtes sur le point de désarchiver le site %s." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:67 +msgid "You are about to deactivate the site %s." +msgstr "Vous êtes sur le point de désactiver le site %s." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:65 +msgid "You are about to activate the site %s." +msgstr "Vous êtes sur le point d’activer le site %s." + +#: wp-admin/network/site-info.php:28 wp-admin/network/site-users.php:46 +#: wp-admin/network/site-themes.php:53 wp-admin/network/site-settings.php:28 +msgid "The requested site does not exist." +msgstr "Le site demandé n’existe pas." + +#: wp-admin/network/user-new.php:29 wp-admin/network/users.php:228 +msgid "Documentation on Network Users" +msgstr "Documentation sur les utilisateurs du réseau." + +#: wp-admin/network/themes.php:246 +msgid "Documentation on Network Themes" +msgstr "Documentation sur les thèmes du réseau." + +#: wp-admin/network/settings.php:63 +msgid "Documentation on Network Settings" +msgstr "Documentation sur les réglages du réseau." + +#. translators: 1: Site URL, 2: Server error message. +#: wp-admin/network/upgrade.php:97 +msgid "Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s" +msgstr "Attention ! Un problème est survenu lors de la mise à jour de %1$s. Votre serveur peut ne pas être en mesure de se connecter à certains sites qui y sont installés. Message d’erreur : %2$s." + +#: wp-admin/network/themes.php:134 +msgid "You are about to remove the following themes:" +msgstr "Vous êtes sur le point d’enlever les thèmes suivants :" + +#: wp-admin/network/themes.php:133 +msgid "These themes may be active on other sites in the network." +msgstr "Ces thèmes peuvent être actifs sur d’autres site de ce réseau." + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:300 wp-admin/network/site-themes.php:204 +msgid "%s theme disabled." +msgid_plural "%s themes disabled." +msgstr[0] "%s thème désactivé." +msgstr[1] "%s thèmes désactivés." + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:291 wp-admin/network/site-themes.php:195 +msgid "%s theme enabled." +msgid_plural "%s themes enabled." +msgstr[0] "%s thème activé." +msgstr[1] "%s thèmes activés." + +#. translators: %s: Number of themes. +#: wp-admin/network/themes.php:309 +msgid "%s theme deleted." +msgid_plural "%s themes deleted." +msgstr[0] "%s thème supprimé." +msgstr[1] "%s thèmes supprimés." + +#: wp-admin/network/themes.php:166 +msgid "Yes, delete these themes" +msgstr "Oui, supprimer ces thèmes" + +#: wp-admin/network/themes.php:132 +msgid "Delete Themes" +msgstr "Supprimer les thèmes" + +#: wp-admin/network/settings.php:202 +msgid "New registrations settings" +msgstr "Réglages pour les nouvelles inscriptions" + +#: wp-admin/network/settings.php:401 +msgid "Size in kilobytes" +msgstr "Taille en kilooctets" + +#: wp-admin/network/settings.php:385 +msgid "Allowed file types. Separate types by spaces." +msgstr "Types de fichier autorisés. Séparez les types par une espace." + +#: wp-admin/network/site-info.php:195 +msgid "Set site attributes" +msgstr "Configurer les attributs du site" + +#: wp-admin/network/settings.php:465 +msgid "Enable menus" +msgstr "Activer les menus" + +#. translators: 1: File name (.htaccess or web.config), 2: File path. +#: wp-admin/includes/network.php:605 wp-admin/includes/network.php:647 +msgid "Add the following to your %1$s file in %2$s, replacing other WordPress rules:" +msgstr "Ajoutez les règles suivantes à votre fichier %1$s, dans le dossier %2$s, en remplacement d’autres règles de WordPress :" + +#: wp-admin/network/sites.php:114 wp-admin/network/sites.php:190 +msgid "Confirm your action" +msgstr "Confirmez cette action" + +#: wp-admin/network/users.php:218 +msgid "Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to their Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site." +msgstr "Survolez n’importe quel des utilisateurs de la liste pour faire apparaître les liens de modification. Le lien Modifier à gauche ouvrira la page de modification du profil de l'utilisateur ; le lien Modifier à droite de n'importe quel nom de site ouvrira l'écran de modification de ce site." + +#: wp-admin/network/index.php:43 +msgid "To search for a site, enter the path or domain." +msgstr "Pour rechercher un site, saisissez son chemin ou son domaine." + +#: wp-admin/network/index.php:42 +msgid "To search for a user, enter an email address or username. Use a wildcard to search for a partial username, such as user*." +msgstr "Pour rechercher un utilisateur, saisissez une adresse e-mail ou un identifiant. Utilisez le signe étoile (*) pour lancer une recherche sur un identifiant partiel, par exemple utilisa*." + +#: wp-admin/network/index.php:40 +msgid "To add a new site, click Create a New Site." +msgstr "Pour ajouter un nouveau site, cliquez sur Créer un nouveau site." + +#: wp-admin/network/index.php:39 +msgid "To add a new user, click Create a New User." +msgstr "Pour ajouter un nouvel utilisateur, cliquez sur Créer un nouvel utilisateur." + +#: wp-admin/network/index.php:48 +msgid "Quick Tasks" +msgstr "Tâches rapides" + +#: wp-admin/network/index.php:41 +msgid "To search for a user or site, use the search boxes." +msgstr "Pour rechercher un utilisateur ou un site, utilisez les champs de recherche." + +#: wp-admin/network/index.php:38 +msgid "The Right Now widget on this screen provides current user and site counts on your network." +msgstr "Le widget Aujourd’hui de cet écran vous donne le nombre actuel d’utilisateurs et de sites sur votre réseau." + +#: wp-admin/network/index.php:28 +msgid "Modify global network settings" +msgstr "Modifier les réglages globaux du réseau" + +#: wp-admin/network/index.php:27 +msgid "Update your network" +msgstr "Mettre à jour votre réseau" + +#: wp-admin/network/index.php:26 +msgid "Install and activate themes or plugins" +msgstr "Installer et activer des thèmes ou des extensions" + +#: wp-admin/network/index.php:25 +msgid "Add and manage sites or users" +msgstr "Ajouter et gérer des sites ou des utilisateurs" + +#: wp-admin/network/index.php:24 +msgid "From here you can:" +msgstr "D’ici, vous pouvez :" + +#: wp-admin/network/index.php:23 +msgid "Welcome to your Network Admin. This area of the Administration Screens is used for managing all aspects of your Multisite Network." +msgstr "Bienvenue dans l’administration de votre réseau ! Cette partie des écrans d’administration sert à gérer tous les aspects de votre réseau multisite." + +#: wp-admin/network/upgrade.php:138 +msgid "WordPress has been updated! Before we send you on your way, we need to individually upgrade the sites in your network." +msgstr "WordPress a été mis à jour ! Avant de vous laisser continuer, nous devons mettre à jour chaque site de votre réseau." + +#: wp-admin/network/upgrade.php:23 +msgid "Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Toolbar). Clicking the Upgrade Network button will step through each site in the network, five at a time, and make sure any database updates are applied." +msgstr "N’utilisez cet écran que quand vous avez mis à jour cette installation de WordPress (au moyen de la fonction de mise à jour automatique ou la barre d’outils). En cliquant sur « Mettre à jour le réseau », WordPress s’occupera de tous les sites du réseau, par groupes de cinq, et s’assurera que toutes les mises à jour de bases de données sont appliquées." + +#: wp-admin/network/upgrade.php:15 wp-admin/network/upgrade.php:42 +#: wp-admin/network/upgrade.php:142 wp-admin/network/menu.php:46 +msgid "Upgrade Network" +msgstr "Mettre à jour le réseau" + +#. translators: New site notification email. 1: User login, 2: Site URL, 3: +#. Site title. +#: wp-admin/network/site-new.php:156 +msgid "" +"New site created by %1$s\n" +"\n" +"Address: %2$s\n" +"Name: %3$s" +msgstr "" +"Nouveau site créé par %1$s\n" +"\n" +"Adresse : %2$s\n" +"Nom : %3$s" + +#: wp-admin/includes/network.php:260 wp-admin/includes/network.php:611 +#: wp-admin/includes/network.php:653 +msgid "Subdirectory networks may not be fully compatible with custom wp-content directories." +msgstr "Les sous-répertoires du réseau peuvent ne pas être totalement compatibles avec les répertoires personnalisés de wp-content." + +#: wp-admin/network.php:62 +msgid "Add the designated lines of code to wp-config.php (just before /*...stop editing...*/) and .htaccess (replacing the existing WordPress rules)." +msgstr "Ajoutez les lignes de code désignées dans le fichier wp-config.php (juste avant /*...stop editing...*/) et le fichier .htaccess (en remplaçant les règles existantes de WordPress)." + +#: wp-admin/network/settings.php:57 +msgid "Super admins can no longer be added on the Options screen. You must now go to the list of existing users on Network Admin > Users and click on Username or the Edit action link below that name. This goes to an Edit User page where you can check a box to grant super admin privileges." +msgstr "Les super-admins ne peuvent plus être ajoutés via l’écran des options. Vous devez aller à la liste des utilisateurs (option « Utilisateurs » du menu « Admin du réseau ») et cliquer sur un identifiant ou sur le lien « Modifier » qui s’affiche en dessous. Vous arriverez alors à un écran vous permettant de modifier ce compte utilisateur, où une case à cocher donne les droits de super-admin." + +#: wp-admin/network/menu.php:41 +msgid "Updates" +msgstr "Mises à jour" + +#: wp-admin/network/site-new.php:25 +msgid "This screen is for Super Admins to add new sites to the network. This is not affected by the registration settings." +msgstr "Cet écran permet aux super-admins d’ajouter de nouveaux sites au réseau. Il n’est pas limité par les réglages d’inscription." + +#: wp-admin/network/sites.php:33 +msgid "An Edit link to a separate Edit Site screen." +msgstr "Un lien « Modifier » vers un nouvel écran de modification de site." + +#: wp-admin/network/themes.php:240 +msgid "Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes." +msgstr "Les thèmes peuvent être activés par l’administrateur du réseau pour chaque site, individuellement, par le biais de l’écran de modification d’un site (et de son onglet « Thèmes »), accessible via le lien « Modifier » de la liste des sites. Seuls les administrateurs du réseau peuvent installer ou modifier des thèmes." + +#: wp-admin/network/sites.php:36 +msgid "Delete which is a permanent action after the confirmation screens." +msgstr "« Supprimer » est une action irréversible une fois passé l’écran de confirmation." + +#: wp-admin/network/sites.php:39 +msgid "Clicking on bold headings can re-sort this table." +msgstr "Cliquez sur les en-têtes en gras afin de retrier ce tableau." + +#: wp-admin/network/sites.php:30 +msgid "Add New takes you to the Add New Site screen. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page." +msgstr "Ajouter vous envoie au formulaire en bas de cette page. Vous pouvez rechercher un site par le nom, l’identifiant ou l’adresse IP. Les options d’écran vous permettent de choisir le nombre de sites à afficher sur une même page." + +#. translators: 1: Dashboard URL, 2: Network admin edit URL. +#: wp-admin/network/site-new.php:193 +msgid "Site added. Visit Dashboard or Edit Site" +msgstr "Site ajouté. Afficher le tableau de bord | Modifier le site" + +#: wp-admin/network/menu.php:52 +msgid "All Sites" +msgstr "Tous les sites" + +#. translators: %s: Number of available theme updates. +#: wp-admin/network/menu.php:63 +msgid "Themes %s" +msgstr "Thèmes %s" + +#: wp-admin/network/menu.php:80 +msgid "Installed Themes" +msgstr "Thèmes installés" + +#: wp-admin/network/site-settings.php:78 +msgid "Site options updated." +msgstr "Les réglages du site ont été mis à jour." + +#: wp-admin/network/settings.php:412 +msgid "Language Settings" +msgstr "Réglages de langue" + +#: wp-admin/network/settings.php:238 +msgid "Allow site administrators to add new users to their site via the \"Users → Add New\" page" +msgstr "Autoriser les administrateurs de sites à ajouter de nouveaux utilisateurs à leurs sites via la page « Utilisateurs → Ajouter »." + +#: wp-admin/network/sites.php:34 +msgid "Dashboard leads to the Dashboard for that site." +msgstr "« Tableau de bord » mène au tableau de bord pour ce site." + +#: wp-admin/network/themes.php:174 +msgid "No, return me to the theme list" +msgstr "Non, je veux revenir à la liste des thèmes." + +#. translators: %s: Site title. +#: wp-admin/network/site-info.php:125 wp-admin/network/site-users.php:201 +#: wp-admin/network/site-themes.php:170 wp-admin/network/site-settings.php:83 +msgid "Edit Site: %s" +msgstr "Modifier le site : %s" + +#: wp-admin/network/themes.php:313 wp-admin/network/site-themes.php:208 +msgid "No theme selected." +msgstr "Aucun thème sélectionné." + +#: wp-admin/network/themes.php:288 wp-admin/network/site-themes.php:192 +msgid "Theme enabled." +msgstr "Thème activé." + +#: wp-admin/network/site-info.php:23 wp-admin/network/site-users.php:41 +#: wp-admin/network/site-themes.php:46 wp-admin/network/site-settings.php:23 +msgid "Invalid site ID." +msgstr "Identifiant du site non valide." + +#: wp-admin/network/themes.php:297 wp-admin/network/site-themes.php:201 +msgid "Theme disabled." +msgstr "Thème désactivé." + +#: wp-admin/network/user-new.php:22 +msgid "Add User will set up a new user account on the network and send that person an email with username and password." +msgstr "« Ajouter un utilisateur » créera un nouveau compte utilisateur sur le réseau, et enverra un message contenant son identifiant et son mot de passe au destinataire." + +#: wp-admin/network/site-themes.php:212 +msgid "Network enabled themes are not shown on this screen." +msgstr "Les thèmes activés pour le réseau ne sont pas visibles sur cet écran." + +#: wp-admin/network/settings.php:20 wp-admin/network/menu.php:111 +msgid "Network Settings" +msgstr "Réglages du réseau" + +#: wp-admin/network/themes.php:128 +msgid "Delete Theme" +msgstr "Supprimer le thème" + +#: wp-admin/network/themes.php:129 +msgid "This theme may be active on other sites in the network." +msgstr "Ce thème est peut-être activé sur d’autres sites du réseau" + +#: wp-admin/network/themes.php:130 +msgid "You are about to remove the following theme:" +msgstr "Vous êtes sur le point de supprimer le thème suivant :" + +#: wp-admin/network/themes.php:164 +msgid "Yes, delete this theme" +msgstr "Oui, supprimer ce thème" + +#: wp-admin/network/themes.php:151 +msgid "Are you sure you want to delete these themes?" +msgstr "Confirmez-vous la suppression de ces thèmes ?" + +#: wp-admin/network/site-new.php:200 wp-admin/network/site-new.php:210 +msgid "Add New Site" +msgstr "Ajouter un nouveau site" + +#: wp-admin/network/themes.php:315 +msgid "You cannot delete a theme while it is active on the main site." +msgstr "Vous ne pouvez pas effacer un thème s’il est activé sur le site principal." + +#: wp-admin/network/site-users.php:248 +msgid "Enter the username of an existing user." +msgstr "Saisir l’identifiant d’un utilisateur existant." + +#: wp-admin/network/site-info.php:120 +msgid "Site info updated." +msgstr "Les infos du site ont été mises à jour." + +#: wp-admin/network/site-users.php:242 +msgid "User is already a member of this site." +msgstr "Cet utilisateur est déjà membre de ce site." + +#. translators: %s: Site URL. +#: wp-admin/network/sites.php:167 +msgid "Sorry, you are not allowed to delete the site %s." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer ce site." + +#: wp-admin/network/user-new.php:54 +msgid "Cannot add user." +msgstr "Impossible d’ajouter l’utilisateur." + +#: wp-admin/network/user-new.php:146 wp-admin/network/site-users.php:320 +msgid "Add User" +msgstr "Ajouter un utilisateur" + +#: wp-admin/network/site-users.php:263 +msgid "User created." +msgstr "L’utilisateur a été créé." + +#: wp-admin/network/site-users.php:260 +msgid "Select a user to remove." +msgstr "Sélectionnez un utilisateur à enlever." + +#: wp-admin/network/site-users.php:254 +msgid "Select a user to change role." +msgstr "Sélectionnez un utilisateur dont vous voulez changer le rôle." + +#: wp-admin/network/site-users.php:266 +msgid "Enter the username and email." +msgstr "Saisir l’identifiant et l’adresse de messagerie." + +#: wp-admin/network.php:63 +msgid "Once you add this code and refresh your browser, multisite should be enabled. This screen, now in the Network Admin navigation menu, will keep an archive of the added code. You can toggle between Network Admin and Site Admin by clicking on the Network Admin or an individual site name under the My Sites dropdown in the Toolbar." +msgstr "Une fois que vous aurez ajouté ce code et rafraîchi la page dans votre navigateur, le mode multisite devrait être activé. Cet écran, désormais placé dans le menu de navigation Admin du Réseau, conservera une archive du code ajouté. Vous pouvez basculer de l’administration du réseau à l’administration du site en cliquant sur « Admin du réseau », ou en cliquant sur le nom d’un site individuel dans le menu déroulant « Mes Sites » de la barre d’outils." + +#: wp-admin/includes/network.php:157 +msgid "Error: The network could not be created." +msgstr "Erreur : Le réseau ne peut pas être créé." + +#: wp-admin/includes/network.php:243 +msgid "Sub-directories" +msgstr "Sous-répertoires" + +#: wp-admin/network.php:72 +msgid "Network" +msgstr "Réseau" + +#. translators: 1: Host name. +#: wp-admin/includes/network.php:236 +msgctxt "subdomain examples" +msgid "like site1.%1$s and site2.%1$s" +msgstr "comme site1.%1$s et site2.%1$s" + +#: wp-admin/includes/network.php:224 +msgid "Addresses of Sites in your Network" +msgstr "Adresses des sites de votre réseau" + +#: wp-admin/network.php:29 +msgid "The Network creation panel is not for WordPress MU networks." +msgstr "Le panneau de création de réseau n’est pas conçu pour les réseaux WordPress MU." + +#: wp-admin/includes/network.php:145 +msgid "Return to Dashboard" +msgstr "Revenir au tableau de bord" + +#: wp-admin/network.php:55 +msgid "Create a Network of WordPress Sites" +msgstr "Créer un réseau de sites WordPress" + +#: wp-admin/network.php:59 +msgid "This screen allows you to configure a network as having subdomains (site1.example.com) or subdirectories (example.com/site1). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it." +msgstr "Cet écran vous permet de configurer un réseau, sous la forme sous-domaines (site1.example.com) ou sous-dossiers (example.com/site1). La forme sous-domaines nécessite une entrée de sous-domaine générique (wildcard) dans les enregistrements DNS et la configuration Apache, si votre hébergeur le permet." + +#. translators: %s: URL to Plugins screen. +#: wp-admin/includes/network.php:127 +msgid "Please deactivate your plugins before enabling the Network feature." +msgstr "Veuillez désactiver vos extensions avant d’activer la fonctionnalité Réseau. " + +#: wp-admin/includes/network.php:130 +msgid "Once the network is created, you may reactivate your plugins." +msgstr "Dès que le réseau sera créé, vous pourrez réactiver vos extensions." + +#: wp-admin/network.php:64 +msgid "The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with “/blog/” from the main site. This disabling will be addressed in a future version." +msgstr "Le choix d’avoir des sites en mode sous-répertoire est désactivé si le réseau a été installé il y a un mois ou plus, afin de pallier les problèmes de permaliens avec l’ajout de « /blog/ » sur les adresses du site principal. Cette limitation sera corrigée dans une prochaine version." + +#: wp-admin/includes/network.php:178 +msgid "Welcome to the Network installation process!" +msgstr "Bienvenue dans l’installation du Réseau !" + +#: wp-admin/includes/network.php:294 +msgid "Network Details" +msgstr "Détails du réseau" + +#: wp-admin/includes/network.php:665 +msgid "Once you complete these steps, your network is enabled and configured. You will have to log in again." +msgstr "Une fois que vous aurez passé ces étapes, votre réseau sera activé et configuré. Vous devrez vous reconnecter." + +#: wp-admin/network.php:61 +msgid "The next screen for Network Setup will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files." +msgstr "L’écran suivant vous présentera un ensemble de lignes de code générées à partir de votre configuration, qu’il vous faudra ajouter à vos fichiers wp-config.php et .htaccess. Veillez bien à ce que votre client FTP soit configuré pour afficher les fichiers commençant par un point, afin que vous puissiez trouver le fichier .htaccess. Il est possible que vous ayez à créer ce fichier s’il n’est pas déjà présent. Avant toute modification de wp-config.php et .htaccess, faites-en une copie de sauvegarde." + +#: wp-admin/network.php:60 +msgid "Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your installation. Fill out the network details, and click Install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories)." +msgstr "Faites le choix entre sous-domaines ou sous-dossiers. Une fois l’installation configurée, vous ne pourrez pas revenir en arrière sans recommencer à zéro. Saisissez tous les détails, et cliquez sur « Installer ». Si cela ne marche pas, vous devrez sans doute ajouter une entrée de sous-domaine générique (wildcard) dans vos enregistrements DNS, ou passer à un réglage différent pour vos permaliens (si en mode sous-dossiers)." + +#: wp-admin/includes/network.php:541 +msgid "To make your installation more secure, you should also add:" +msgstr "Pour sécuriser encore plus votre installation, vous devriez également ajouter :" + +#: wp-admin/includes/network.php:231 +msgid "Sub-domains" +msgstr "Sous-domaines" + +#: wp-admin/includes/network.php:227 +msgid "You will need a wildcard DNS record if you are going to use the virtual host (sub-domain) functionality." +msgstr "Si vous souhaitez utiliser la fonctionnalité d’hébergement virtuel (sous-domaine), vous aurez besoin d’un enregistrement DNS générique (joker/wildcard)." + +#: wp-admin/includes/network.php:139 +msgid "You cannot install a network of sites with your server address." +msgstr "Vous ne pouvez pas installer un réseau de sites avec votre adresse de serveur." + +#: wp-admin/includes/network.php:192 +msgid "Note:" +msgstr "Note :" + +#: wp-admin/includes/network.php:179 +msgid "Fill in the information below and you’ll be on your way to creating a network of WordPress sites. We will create configuration files in the next step." +msgstr "Remplissez les informations ci-dessous et vous pourrez créer un réseau de sites Wordpress. Nous créerons les fichiers de configuration lors de la prochaine étape." + +#: wp-admin/includes/network.php:436 +msgid "Complete the following steps to enable the features for creating a network of sites." +msgstr "Suivez les étapes suivantes pour activer les fonctionnalités de création de réseau de sites." + +#: wp-admin/includes/network.php:435 +msgid "Enabling the Network" +msgstr "Activer le Réseau" + +#: wp-admin/includes/network.php:424 +msgid "Please complete the configuration steps. To create a new network, you will need to empty or remove the network database tables." +msgstr "Veuillez suivre les étapes de configuration. Pour créer un nouveau réseau, vous devrez vider ou supprimer les tables du réseau de la base de données." + +#: wp-admin/includes/network.php:423 +msgid "An existing WordPress network was detected." +msgstr "Un réseau WordPress pré-existant a été détecté." + +#: wp-admin/includes/network.php:418 +msgid "The original configuration steps are shown here for reference." +msgstr "Les étapes de la configuration originale sont affichées ici pour référence." + +#: wp-admin/includes/network.php:366 +msgid "Your email address." +msgstr "Votre adresse de messagerie." + +#: wp-admin/includes/network.php:357 +msgid "What would you like to call your network?" +msgstr "Comment souhaitez-vous appeler votre réseau ?" + +#: wp-admin/includes/network.php:353 wp-admin/network/settings.php:153 +msgid "Network Title" +msgstr "Titre du réseau" + +#: wp-admin/includes/network.php:332 +msgid "Because your installation is not new, the sites in your WordPress network must use sub-domains." +msgstr "Comme votre installation de WordPress n’est pas récente, les sites de votre réseau doivent utiliser des sous-domaines." + +#: wp-admin/includes/network.php:319 +msgid "Because your installation is in a directory, the sites in your WordPress network must use sub-directories." +msgstr "Comme votre installation de WordPress se trouve dans un répertoire, les sites de votre réseau doivent utiliser des sous-répertoires." + +#: wp-admin/includes/network.php:309 wp-admin/includes/network.php:322 +#: wp-admin/includes/network.php:333 +msgid "The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links." +msgstr "Le site principal d’une installation en sous-répertoire devra utiliser une structure de permaliens modifiée, ce qui pourrait potentiellement casser vos liens existants." + +#: wp-admin/includes/network.php:266 wp-admin/includes/network.php:280 +#: wp-admin/includes/network.php:340 +msgid "Server Address" +msgstr "Adresse du serveur" + +#. translators: 1: Host name. +#: wp-admin/includes/network.php:248 +msgctxt "subdirectory examples" +msgid "like %1$s/site1 and %1$s/site2" +msgstr "comme %1$s/site1 et %1$s/site2" + +#. translators: %s: User login. +#: wp-admin/network/users.php:77 +msgid "Warning! User cannot be modified. The user %s is a network administrator." +msgstr "Attention ! L’utilisateur %s ne peut être modifié car c’est un administrateur du réseau." + +#: wp-admin/network/sites.php:32 +msgid "Hovering over each site reveals seven options (three for the primary site):" +msgstr "Survoler chaque site avec la souris révèle sept options (trois pour le site principal) :" + +#: wp-admin/network/sites.php:38 +msgid "The site ID is used internally, and is not shown on the front end of the site or to users/viewers." +msgstr "L’ID du site est utilisé en interne et n’est pas affiché dans la partie publique du site, ni aux utilisateurs/visiteurs." + +#: wp-admin/network/sites.php:35 +msgid "Deactivate, Archive, and Spam which lead to confirmation screens. These actions can be reversed later." +msgstr "« Désactiver », « Archiver » et « Indésirable » envoient chacun à des écrans de confirmation. Ces actions peuvent être annulées par la suite ." + +#: wp-admin/network/site-new.php:26 +msgid "If the admin email for the new site does not exist in the database, a new user will also be created." +msgstr "Si l’adresse de contact du nouveau site n’existe pas dans la base de données, un nouvel utilisateur sera créé pour l’occasion." + +#: wp-admin/network/settings.php:51 +msgid "Operational settings has fields for the network’s name and admin email." +msgstr "Les réglages de fonctionnement permettent de modifier le nom du réseau, et l’adresse de messagerie de l’administrateur." + +#: wp-admin/network/settings.php:54 +msgid "Upload settings control the size of the uploaded files and the amount of available upload space for each site. You can change the default value for specific sites when you edit a particular site. Allowed file types are also listed (space separated only)." +msgstr "Les réglages d’envoi des fichiers permettent de limiter la taille des fichiers téléversés et l’espace disponible pour chaque site. Vous pouvez préciser la valeur pour chaque site individuellement. Vous pouvez également préciser les types de fichiers acceptés (séparés par des espaces)." + +#: wp-admin/network/users.php:221 +msgid "The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses." +msgstr "Le menu « Actions groupées » permet de supprimer définitivement plusieurs utilisateurs d’un coup, ou de les marquer comme sains ou indésirables. Les utilisateurs indésirables verront leurs articles supprimés, et ne pourront plus se connecter avec leur adresse de messagerie." + +#: wp-admin/network/users.php:219 +msgid "You can also go to the user’s profile page by clicking on the individual username." +msgstr "Vous pouvez également aller sur la page de profil d’un utilisateur en cliquant sur son identifiant." + +#: wp-admin/network/sites.php:37 +msgid "Visit to go to the front-end site live." +msgstr "« Afficher » envoie vers la page d’accueil du site." + +#: wp-admin/network/users.php:222 +msgid "You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege." +msgstr "Vous pouvez promouvoir un utilisateur existant en super-admin en allant sur leur page de profil, et en cochant la case correspondante." + +#: wp-admin/network/users.php:217 +msgid "This table shows all users across the network and the sites to which they are assigned." +msgstr "Ce tableau affiche tous les utilisateurs appartenant au réseau, et les sites auxquels ils sont assignés." + +#: wp-admin/network/upgrade.php:24 +msgid "If a version update to core has not happened, clicking this button won’t affect anything." +msgstr "S’il n’y a pas eu de mise à jour de l’installation de WordPress récemment, cliquer sur ce bouton n’aura aucun effet." + +#: wp-admin/network/upgrade.php:25 +msgid "If this process fails for any reason, users logging in to their sites will force the same update." +msgstr "Si ce processus échoue pour n’importe quelles raisons, les utilisateurs se connectant à leurs sites déclencheront la même mise à jour." + +#: wp-admin/network/users.php:220 +msgid "You can sort the table by clicking on any of the table headings and switch between list and excerpt views by using the icons above the users list." +msgstr "Un clic sur le titre d’une colonne permet de changer le tri du tableau. Les icônes en haut à droite permettent d’afficher des extraits ou non." + +#: wp-admin/network/user-new.php:23 +msgid "Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them." +msgstr "Les utilisateurs qui se sont inscrits sur le réseau sans créer de site deviennent abonnés du site d’accueil. Celui-ci leur permet d’accéder à leur compte. Ces utilisateurs ne voient dans la navigation principale que les options « Tableau de bord » et « Mes sites », jusqu’à ce qu’un site leur soit créé." + +#: wp-admin/network/sites.php:31 +msgid "This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table." +msgstr "Voici la liste de tous les sites de ce réseau. Vous pouvez changer de vue (liste avec ou sans extrait) en utilisant les icônes présentes en haut à droite de la liste." + +#: wp-admin/network/settings.php:56 +msgid "Menu setting enables/disables the plugin menus from appearing for non super admins, so that only super admins, not site admins, have access to activate plugins." +msgstr "Le réglage du menu (dés)active la section « Extensions » du menu pour les utilisateurs normaux, de telle sorte que seuls les super-admins peuvent y accéder pour activer une extension." + +#: wp-admin/network/settings.php:52 +msgid "Registration settings can disable/enable public signups. If you let others sign up for a site, install spam plugins. Spaces, not commas, should separate names banned as sites for this network." +msgstr "Les réglages d’inscription permettent d’ouvrir ou fermer les inscriptions au public. Si vous ouvrez les inscriptions, veillez à installer des extensions antispam. Les domaines bannis devraient être indiqués séparés d’un espace, non d’une virgule." + +#: wp-admin/network/settings.php:50 +msgid "This screen sets and changes options for the network as a whole. The first site is the main site in the network and network options are pulled from that original site’s options." +msgstr "Cet écran vous donne accès aux options régissant l’ensemble du réseau. Le premier site est le site principal du réseau, et les options du réseau sont tirées des options de ce premier site." + +#: wp-admin/network/themes.php:239 +msgid "If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site’s Appearance > Themes screen." +msgstr "Si l’administrateur du réseau désactive un thème en cours d’utilisation par un site, ce thème restera en place pour ce site. Si le site change de thème, le thème désactivé n’apparaîtra plus dans l’écran de sélection des thèmes de ce site." + +#: wp-admin/network/themes.php:238 +msgid "This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using." +msgstr "Cet écran permet d’activer ou désactiver la disponibilité des thèmes pour tous les sites du réseau. Il ne permet pas d’activer ou activer le thème actuellement utilisé ce site." + +#: wp-admin/network/settings.php:53 +msgid "New site settings are defaults applied when a new site is created in the network. These include welcome email for when a new site or user account is registered, and what᾿s put in the first post, page, comment, comment author, and comment URL." +msgstr "Les réglages des nouveaux sites sont les réglages par défaut appliqués à tout nouveau site créé sur le réseau. Cela comprend le message d’accueil quand un nouvel utilisateur ou un nouveau site est enregistré, ainsi que le contenu du premier article, de la première page et du premier commentaire (dont le nom et l’adresse web du commentateur)." + +#. translators: %s: Reserved names list. +#: wp-admin/network/site-new.php:59 +msgid "The following words are reserved for use by WordPress functions and cannot be used as blog names: %s" +msgstr "Les mots suivants sont réservés pour l’usage de fonctions WordPress et ne peuvent pas être utilisés comme nom de site : %s" + +#: wp-admin/network/upgrade.php:122 +msgid "If your browser doesn’t start loading the next page automatically, click this link:" +msgstr "Si votre navigateur ne lance pas automatiquement la page suivante, cliquez sur ce lien :" + +#: wp-admin/network/site-new.php:40 +msgid "Can’t create an empty site." +msgstr "Impossible de créer un site vide." + +#: wp-admin/network/settings.php:273 +msgid "If you want to ban domains from site registrations. One domain per line." +msgstr "Si vous souhaitez interdire la création de sites aux personnes dont l’adresse de messagerie est liée à certains noms de domaines. Un domaine par ligne." + +#: wp-admin/network/settings.php:262 +msgid "If you want to limit site registrations to certain domains. One domain per line." +msgstr "Si vous souhaitez que les seules personnes habilitées à créer un site soient celles disposant d’une adresse de messagerie liée à certains noms de domaines. Un domaine par ligne." + +#: wp-admin/network/sites.php:330 +msgid "Site removed from spam." +msgstr "Site marqué comme sain." + +#: wp-admin/network/users.php:254 +msgid "Users removed from spam." +msgstr "Utilisateurs marqués comme sains." + +#: wp-admin/network/sites.php:303 +msgid "Sites removed from spam." +msgstr "Sites marqués comme sains." + +#: wp-admin/network/sites.php:306 +msgid "Sites marked as spam." +msgstr "Sites marqués comme indésirables." + +#: wp-admin/network/sites.php:333 +msgid "Site marked as spam." +msgstr "Site marqué comme indésirable." + +#: wp-admin/network/sites.php:318 +msgid "Site archived." +msgstr "Site archivé." + +#: wp-admin/network/users.php:257 +msgid "Users deleted." +msgstr "Utilisateurs supprimés." + +#: wp-admin/network/sites.php:321 +msgid "Site unarchived." +msgstr "Site désarchivé." + +#: wp-admin/network/sites.php:324 +msgid "Site activated." +msgstr "Site activé." + +#: wp-admin/network/sites.php:327 +msgid "Site deactivated." +msgstr "Site désactivé." + +#: wp-admin/network/users.php:251 +msgid "Users marked as spam." +msgstr "Utilisateurs marqués comme indésirables." + +#: wp-admin/network/sites.php:312 +msgid "Site deleted." +msgstr "Site effacé." + +#: wp-admin/network/sites.php:309 +msgid "Sites deleted." +msgstr "Sites effacés." + +#: wp-admin/network/sites.php:105 wp-admin/network/sites.php:223 +msgid "Sorry, you are not allowed to change the current site." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier le site actuel." + +#: wp-admin/network/site-new.php:126 +msgid "There was an error creating the user." +msgstr "Une erreur s’est produite lors de la création d’un utilisateur." + +#: wp-admin/network/settings.php:381 +msgid "Upload file types" +msgstr "Types de fichiers " + +#. translators: %s: Number of megabytes to limit uploads to. +#: wp-admin/network/settings.php:369 +msgid "Limit total size of files uploaded to %s MB" +msgstr "La taille totale des fichiers téléversés est limitée à %s Mo" + +#: wp-admin/network/settings.php:355 +msgid "The URL for the first comment on a new site." +msgstr "L’adresse web du premier commentaire sur tout nouveau site." + +#: wp-admin/network/settings.php:328 +msgid "The first comment on a new site." +msgstr "Le premier commentaire sur tout nouveau site." + +#: wp-admin/network/settings.php:318 +msgid "The first page on a new site." +msgstr "La première page sur tout nouveau site." + +#: wp-admin/network/settings.php:308 +msgid "The first post on a new site." +msgstr "Le premier article sur un nouveau site." + +#: wp-admin/network/settings.php:337 +msgid "The author of the first comment on a new site." +msgstr "L’auteur du premier commentaire sur tout nouveau site." + +#: wp-admin/network/upgrade.php:73 +msgid "All done!" +msgstr "Terminé !" + +#: wp-admin/network/settings.php:203 +msgid "Registration is disabled" +msgstr "Les inscriptions ne sont pas autorisées pour le moment." + +#: wp-admin/network/settings.php:204 +msgid "User accounts may be registered" +msgstr "Les comptes utilisateurs peuvent être créés." + +#: wp-admin/network/settings.php:206 +msgid "Both sites and user accounts can be registered" +msgstr "La création de sites et d’utilisateurs est autorisée." + +#: wp-admin/network/settings.php:205 +msgid "Logged in users may register new sites" +msgstr "Les utilisateurs connectés peuvent créer de nouveaux sites." + +#: wp-admin/network/settings.php:190 +msgid "Registration Settings" +msgstr "Réglages d’inscription" + +#: wp-admin/network/settings.php:279 +msgid "New Site Settings" +msgstr "Réglages des nouveaux sites" + +#: wp-admin/network/settings.php:360 +msgid "Upload Settings" +msgstr "Réglages des téléversements" + +#: wp-admin/network/settings.php:150 +msgid "Operational Settings" +msgstr "Réglages de fonctionnement" + +#: wp-admin/network/settings.php:444 +msgid "Enable administration menus" +msgstr "Activer les menus d’administration" + +#: wp-admin/network/site-new.php:91 +msgid "Missing email address." +msgstr "Adresse de messagerie manquante." + +#: wp-admin/network/site-new.php:87 +msgid "Missing or invalid site address." +msgstr "Adresse de site manquante ou non valide." + +#: wp-admin/network/upgrade.php:122 +msgid "Next Sites" +msgstr "Sites suivants" + +#: wp-admin/network/settings.php:247 +msgid "Users are not allowed to register these sites. Separate names by spaces." +msgstr "Les utilisateurs ne sont pas autorisés à créer un site avec l’un de ces noms. Séparez les noms par un espace." + +#: wp-admin/network/settings.php:231 +msgid "Send the network admin an email notification every time someone registers a site or user account" +msgstr "Envoyer un message à l’administrateur du réseau à chaque création de site ou d’utilisateur." + +#: wp-admin/network/settings.php:363 +msgid "Site upload space" +msgstr "Espace de stockage du site" + +#: wp-admin/network/settings.php:288 +msgid "The welcome email sent to new site owners." +msgstr "Ce message de bienvenue sera envoyé aux propriétaires de nouveaux sites." + +#. translators: New site notification email subject. %s: Network title. +#: wp-admin/network/site-new.php:151 +msgid "[%s] New Site Created" +msgstr "[%s] Nouveau site créé" + +#: wp-admin/includes/network.php:362 wp-admin/network/settings.php:160 +msgid "Network Admin Email" +msgstr "Adresse de messagerie de l’administrateur du réseau" + +#: wp-admin/network/site-new.php:286 +msgid "A new user will be created if the above email address is not in the database." +msgstr "Un nouvel utilisateur sera créé si l’adresse de contact n’existe pas dans la base de données." + +#: wp-admin/network/site-new.php:282 +msgid "Admin Email" +msgstr "Adresse de contact de l’administrateur" + +#: wp-admin/network/site-new.php:298 +msgid "Add Site" +msgstr "Ajouter un site" + +#: wp-admin/network/settings.php:415 +msgid "Default Language" +msgstr "Langue par défaut" + +#: wp-admin/network/settings.php:391 +msgid "Max upload file size" +msgstr "Taille maximale des fichiers" + +#: wp-admin/network/settings.php:351 +msgid "First Comment URL" +msgstr "Adresse du premier commentaire" + +#: wp-admin/network/settings.php:333 +msgid "First Comment Author" +msgstr "Auteur du premier commentaire" + +#: wp-admin/network/settings.php:323 +msgid "First Comment" +msgstr "Premier commentaire" + +#: wp-admin/network/settings.php:313 +msgid "First Page" +msgstr "Première page" + +#: wp-admin/network/settings.php:298 +msgid "The welcome email sent to new users." +msgstr "Ce message de bienvenue sera envoyé aux nouveaux utilisateurs." + +#: wp-admin/network/settings.php:293 +msgid "Welcome User Email" +msgstr "Message de bienvenue des utilisateurs" + +#: wp-admin/network/settings.php:283 +msgid "Welcome Email" +msgstr "Message de bienvenue" + +#: wp-admin/network/settings.php:268 +msgid "Banned Email Domains" +msgstr "Noms de domaines bannis" + +#: wp-admin/network/settings.php:253 +msgid "Limited Email Registrations" +msgstr "Enregistrement réservé aux noms de domaines" + +#: wp-admin/network/settings.php:243 +msgid "Banned Names" +msgstr "Noms bannis" + +#: wp-admin/network/settings.php:236 +msgid "Add New Users" +msgstr "Ajouter de nouveaux utilisateurs" + +#: wp-admin/network/settings.php:224 +msgid "Registration notification" +msgstr "Notification d’inscription" + +#: wp-admin/network/settings.php:193 +msgid "Allow new registrations" +msgstr "Autoriser les nouvelles inscriptions" + +#: wp-admin/network/site-users.php:269 +msgid "Duplicated username or email address." +msgstr "Identifiant ou adresse de messagerie déjà utilisé(e)." + +#: wp-admin/network/user-new.php:41 +msgid "Cannot create an empty user." +msgstr "Impossible de créer un utilisateur vide." + +#: wp-admin/network/sites.php:121 wp-admin/network/sites.php:208 +msgid "Confirm" +msgstr "Confirmer" \ No newline at end of file diff --git a/content/languages/continents-cities-fr_FR.mo b/content/languages/continents-cities-fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..2beeb8d54861bba6b37ee49c126903ad3aa8e28a GIT binary patch literal 20982 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 jdi?>=8LI=J$zLzm69LT(osvXC>(&m1cF~=Ik 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: fr\n" +"Project-Id-Version: WordPress - 5.4.x - Development - Continents & Cities\n" + +#: wp-admin/includes/continents-cities.php:478 +msgid "Saratov" +msgstr "Saratov" + +#: wp-admin/includes/continents-cities.php:353 +msgid "Yangon" +msgstr "Yangon" + +#: wp-admin/includes/continents-cities.php:287 +msgid "Famagusta" +msgstr "Famagouste" + +#: wp-admin/includes/continents-cities.php:266 +msgid "Atyrau" +msgstr "Atyrau" + +#: wp-admin/includes/continents-cities.php:204 +msgid "Punta Arenas" +msgstr "Punta Arenas" + +#: wp-admin/includes/continents-cities.php:290 +msgid "Hebron" +msgstr "Hébron" + +#: wp-admin/includes/continents-cities.php:303 +msgid "Kathmandu" +msgstr "Katmandou" + +#: wp-admin/includes/continents-cities.php:305 +msgid "Khandyga" +msgstr "Khandyga" + +#: wp-admin/includes/continents-cities.php:318 +msgid "Novokuznetsk" +msgstr "Novokouznetsk" + +#: wp-admin/includes/continents-cities.php:335 +msgid "Srednekolymsk" +msgstr "Srednekolymsk" + +#: wp-admin/includes/continents-cities.php:344 +msgid "Tomsk" +msgstr "Tomsk" + +#: wp-admin/includes/continents-cities.php:349 +msgid "Ust-Nera" +msgstr "Oust-Nera" + +#: wp-admin/includes/continents-cities.php:436 +msgid "Astrakhan" +msgstr "Astrakhan" + +#: wp-admin/includes/continents-cities.php:445 +msgid "Busingen" +msgstr "Büsingen" + +#: wp-admin/includes/continents-cities.php:457 +msgid "Kirov" +msgstr "Kirov" + +#: wp-admin/includes/continents-cities.php:486 +msgid "Ulyanovsk" +msgstr "Oulianovsk" + +#: wp-admin/includes/continents-cities.php:514 +msgid "Bougainville" +msgstr "Bougainville" + +#: wp-admin/includes/continents-cities.php:516 +msgid "Chuuk" +msgstr "Chuuk" + +#: wp-admin/includes/continents-cities.php:542 +msgid "Pohnpei" +msgstr "Pohnpei" + +#: wp-admin/includes/continents-cities.php:93 +msgid "Bahia Banderas" +msgstr "Bahía de Banderas" + +#: wp-admin/includes/continents-cities.php:114 +msgid "Creston" +msgstr "Creston" + +#: wp-admin/includes/continents-cities.php:127 +msgid "Fort Nelson" +msgstr "Fort Nelson" + +#: wp-admin/includes/continents-cities.php:161 +msgid "Kralendijk" +msgstr "Kralendijk" + +#: wp-admin/includes/continents-cities.php:166 +msgid "Lower Princes" +msgstr "Lower Princes" + +#: wp-admin/includes/continents-cities.php:172 +msgid "Matamoros" +msgstr "Matamoros" + +#: wp-admin/includes/continents-cities.php:177 +msgid "Metlakatla" +msgstr "Metlakatla" + +#: wp-admin/includes/continents-cities.php:191 +msgid "Beulah" +msgstr "Beulah" + +#: wp-admin/includes/continents-cities.php:194 +msgid "Ojinaga" +msgstr "Ojinaga" + +#: wp-admin/includes/continents-cities.php:212 +msgid "Santa Isabel" +msgstr "Santa Isabel" + +#: wp-admin/includes/continents-cities.php:213 +msgid "Santarem" +msgstr "Santarém" + +#: wp-admin/includes/continents-cities.php:219 +msgid "Sitka" +msgstr "Sitka" + +#: wp-admin/includes/continents-cities.php:244 +msgid "Macquarie" +msgstr "Macquarie" + +#: wp-admin/includes/continents-cities.php:251 +msgid "Troll" +msgstr "Troll" + +#: wp-admin/includes/continents-cities.php:271 +msgid "Barnaul" +msgstr "Barnaoul" + +#: wp-admin/includes/continents-cities.php:276 +msgid "Chita" +msgstr "Tchita" + +#: wp-admin/includes/continents-cities.php:39 +msgid "Juba" +msgstr "Djouba" + +#: wp-admin/includes/continents-cities.php:83 +msgid "Salta" +msgstr "Salta" + +#: wp-admin/includes/continents-cities.php:154 +msgid "Jamaica" +msgstr "Jamaïque" + +#: wp-admin/includes/continents-cities.php:160 +msgid "Knox IN" +msgstr "Knox (Indiana)" + +#: wp-admin/includes/continents-cities.php:167 +msgid "Maceio" +msgstr "Maceió" + +#: wp-admin/includes/continents-cities.php:178 +msgid "Mexico City" +msgstr "Mexico" + +#: wp-admin/includes/continents-cities.php:183 +msgid "Montreal" +msgstr "Montréal" + +#: wp-admin/includes/continents-cities.php:190 +msgid "North Dakota" +msgstr "Dakota du Nord" + +#: wp-admin/includes/continents-cities.php:199 +msgid "Port of Spain" +msgstr "Port-d'Espagne" + +#: wp-admin/includes/continents-cities.php:203 +msgid "Puerto Rico" +msgstr "Porto Rico" + +#: wp-admin/includes/continents-cities.php:206 +msgid "Rankin Inlet" +msgstr "Kangiqtiniq (Rankin Inlet)" + +#: wp-admin/includes/continents-cities.php:214 +msgid "Santiago" +msgstr "Santiago du Chili" + +#: wp-admin/includes/continents-cities.php:215 +msgid "Santo Domingo" +msgstr "Saint-Domingue" + +#: wp-admin/includes/continents-cities.php:217 +msgid "Scoresbysund" +msgstr "Ittoqqortoormiit (Scoresbysund)" + +#: wp-admin/includes/continents-cities.php:220 +msgid "St Barthelemy" +msgstr "Saint-Barthélemy" + +#: wp-admin/includes/continents-cities.php:221 +msgid "St Johns" +msgstr "Saint John's" + +#: wp-admin/includes/continents-cities.php:222 +msgid "St Kitts" +msgstr "Île Saint-Christophe" + +#: wp-admin/includes/continents-cities.php:223 +msgid "St Lucia" +msgstr "Sainte-Lucie" + +#: wp-admin/includes/continents-cities.php:224 +msgid "St Thomas" +msgstr "Saint Thomas" + +#: wp-admin/includes/continents-cities.php:225 +msgid "St Vincent" +msgstr "Saint Vincent" + +#: wp-admin/includes/continents-cities.php:240 +msgid "Antarctica" +msgstr "Antartique" + +#: wp-admin/includes/continents-cities.php:243 +msgid "DumontDUrville" +msgstr "Dumont d'Urville" + +#: wp-admin/includes/continents-cities.php:249 +msgid "South Pole" +msgstr "Pôle Sud" + +#: wp-admin/includes/continents-cities.php:254 +msgid "Arctic" +msgstr "Arctique" + +#: wp-admin/includes/continents-cities.php:257 +msgid "Asia" +msgstr "Asie" + +#: wp-admin/includes/continents-cities.php:262 +msgid "Aqtau" +msgstr "Aqtou" + +#: wp-admin/includes/continents-cities.php:263 +msgid "Aqtobe" +msgstr "Aktioubé" + +#: wp-admin/includes/continents-cities.php:264 +msgid "Ashgabat" +msgstr "Achgabat" + +#: wp-admin/includes/continents-cities.php:265 +msgid "Ashkhabad" +msgstr "Achgabat" + +#: wp-admin/includes/continents-cities.php:267 +msgid "Baghdad" +msgstr "Bagdad" + +#: wp-admin/includes/continents-cities.php:268 +msgid "Bahrain" +msgstr "Bahreïn" + +#: wp-admin/includes/continents-cities.php:269 +msgid "Baku" +msgstr "Bakou" + +#: wp-admin/includes/continents-cities.php:272 +msgid "Beirut" +msgstr "Beyrouth" + +#: wp-admin/includes/continents-cities.php:273 +msgid "Bishkek" +msgstr "Bichkek" + +#: wp-admin/includes/continents-cities.php:277 +msgid "Choibalsan" +msgstr "Choybalsan" + +#: wp-admin/includes/continents-cities.php:281 +msgid "Dacca" +msgstr "Dhâkâ (Dacca)" + +#: wp-admin/includes/continents-cities.php:282 +msgid "Damascus" +msgstr "Damas" + +#: wp-admin/includes/continents-cities.php:283 +msgid "Dhaka" +msgstr "Dhâkâ (Dacca)" + +#: wp-admin/includes/continents-cities.php:285 +msgid "Dubai" +msgstr "Dubaï" + +#: wp-admin/includes/continents-cities.php:286 +msgid "Dushanbe" +msgstr "Douchanbé" + +#: wp-admin/includes/continents-cities.php:291 +msgid "Ho Chi Minh" +msgstr "Hô-Chi-Minh-Ville" + +#: wp-admin/includes/continents-cities.php:294 +msgid "Irkutsk" +msgstr "Irkoutsk" + +#: wp-admin/includes/continents-cities.php:298 +msgid "Jerusalem" +msgstr "Jérusalem" + +#: wp-admin/includes/continents-cities.php:299 +msgid "Kabul" +msgstr "Kaboul" + +#: wp-admin/includes/continents-cities.php:300 +msgid "Kamchatka" +msgstr "Kamtchatka" + +#: wp-admin/includes/continents-cities.php:302 +msgid "Kashgar" +msgstr "Kachgar" + +#: wp-admin/includes/continents-cities.php:304 +msgid "Katmandu" +msgstr "Katmandou" + +#: wp-admin/includes/continents-cities.php:306 +msgid "Kolkata" +msgstr "Calcutta" + +#: wp-admin/includes/continents-cities.php:307 +msgid "Krasnoyarsk" +msgstr "Krasnoïarsk" + +#: wp-admin/includes/continents-cities.php:310 +msgid "Kuwait" +msgstr "Koweït" + +#: wp-admin/includes/continents-cities.php:312 +msgid "Macau" +msgstr "Macao" + +#: wp-admin/includes/continents-cities.php:315 +msgid "Manila" +msgstr "Manille" + +#: wp-admin/includes/continents-cities.php:316 +msgid "Muscat" +msgstr "Mascate" + +#: wp-admin/includes/continents-cities.php:317 +#: wp-admin/includes/continents-cities.php:468 +msgid "Nicosia" +msgstr "Nicosie" + +#: wp-admin/includes/continents-cities.php:319 +msgid "Novosibirsk" +msgstr "Novossibirsk" + +#: wp-admin/includes/continents-cities.php:321 +msgid "Oral" +msgstr "Oural" + +#: wp-admin/includes/continents-cities.php:326 +msgid "Qyzylorda" +msgstr "Kyzylorda" + +#: wp-admin/includes/continents-cities.php:328 +msgid "Riyadh" +msgstr "Riyad" + +#: wp-admin/includes/continents-cities.php:329 +msgid "Saigon" +msgstr "Hô-Chi-Minh-Ville (Saigon)" + +#: wp-admin/includes/continents-cities.php:330 +msgid "Sakhalin" +msgstr "Sakhaline" + +#: wp-admin/includes/continents-cities.php:331 +msgid "Samarkand" +msgstr "Samarcande" + +#: wp-admin/includes/continents-cities.php:332 +msgid "Seoul" +msgstr "Séoul" + +#: wp-admin/includes/continents-cities.php:334 +msgid "Singapore" +msgstr "Singapour" + +#: wp-admin/includes/continents-cities.php:337 +msgid "Tashkent" +msgstr "Tachkent" + +#: wp-admin/includes/continents-cities.php:338 +msgid "Tbilisi" +msgstr "Tbilissi" + +#: wp-admin/includes/continents-cities.php:339 +msgid "Tehran" +msgstr "Téhéran" + +#: wp-admin/includes/continents-cities.php:340 +msgid "Tel Aviv" +msgstr "Tel Aviv-Jaffa" + +#: wp-admin/includes/continents-cities.php:341 +msgid "Thimbu" +msgstr "Thimphou" + +#: wp-admin/includes/continents-cities.php:342 +msgid "Thimphu" +msgstr "Thimphou" + +#: wp-admin/includes/continents-cities.php:343 +msgid "Tokyo" +msgstr "Tōkyō" + +#: wp-admin/includes/continents-cities.php:345 +msgid "Ujung Pandang" +msgstr "Makassar (Ujung Pandang)" + +#: wp-admin/includes/continents-cities.php:346 +msgid "Ulaanbaatar" +msgstr "Oulan-Bator (Ulaanbaatar)" + +#: wp-admin/includes/continents-cities.php:347 +msgid "Ulan Bator" +msgstr "Oulan-Bator (Ulaanbaatar)" + +#: wp-admin/includes/continents-cities.php:348 +msgid "Urumqi" +msgstr "Ürümqi" + +#: wp-admin/includes/continents-cities.php:352 +msgid "Yakutsk" +msgstr "Iakoutsk" + +#: wp-admin/includes/continents-cities.php:354 +msgid "Yekaterinburg" +msgstr "Iekaterinbourg" + +#: wp-admin/includes/continents-cities.php:355 +msgid "Yerevan" +msgstr "Yerevan (Erevan)" + +#: wp-admin/includes/continents-cities.php:357 +msgid "Atlantic" +msgstr "Atlantique" + +#: wp-admin/includes/continents-cities.php:358 +msgid "Azores" +msgstr "Açores" + +#: wp-admin/includes/continents-cities.php:359 +msgid "Bermuda" +msgstr "Bermudes" + +#: wp-admin/includes/continents-cities.php:360 +msgid "Canary" +msgstr "Îles Canaries" + +#: wp-admin/includes/continents-cities.php:361 +msgid "Cape Verde" +msgstr "Cap-Vert" + +#: wp-admin/includes/continents-cities.php:362 +msgid "Faeroe" +msgstr "Îles Féroé" + +#: wp-admin/includes/continents-cities.php:363 +msgid "Faroe" +msgstr "Îles Féroé" + +#: wp-admin/includes/continents-cities.php:364 +msgid "Jan Mayen" +msgstr "Île Jan Mayen" + +#: wp-admin/includes/continents-cities.php:365 +msgid "Madeira" +msgstr "Madère" + +#: wp-admin/includes/continents-cities.php:366 +msgid "Reykjavik" +msgstr "Reykjavík" + +#: wp-admin/includes/continents-cities.php:367 +msgid "South Georgia" +msgstr "Île de Géorgie du Sud" + +#: wp-admin/includes/continents-cities.php:368 +msgid "St Helena" +msgstr "Sainte-Hélène" + +#: wp-admin/includes/continents-cities.php:371 +msgid "Australia" +msgstr "Australie" + +#: wp-admin/includes/continents-cities.php:372 +msgid "ACT" +msgstr "Territoire de la capitale australienne (ACT)" + +#: wp-admin/includes/continents-cities.php:373 +msgid "Adelaide" +msgstr "Adélaïde" + +#: wp-admin/includes/continents-cities.php:381 +msgid "LHI" +msgstr "Île Lord Howe (LHI)" + +#: wp-admin/includes/continents-cities.php:383 +msgid "Lord Howe" +msgstr "Île Lord Howe (LHI)" + +#: wp-admin/includes/continents-cities.php:386 +msgid "North" +msgstr "Nord" + +#: wp-admin/includes/continents-cities.php:385 +msgid "NSW" +msgstr "Nouvelle-Galles du Sud (NSW)" + +#: wp-admin/includes/continents-cities.php:389 +msgid "South" +msgstr "Sud" + +#: wp-admin/includes/continents-cities.php:391 +msgid "Tasmania" +msgstr "Tasmanie" + +#: wp-admin/includes/continents-cities.php:393 +msgid "West" +msgstr "Ouest" + +#: wp-admin/includes/continents-cities.php:396 +msgid "Etc" +msgstr "Etc." + +#: wp-admin/includes/continents-cities.php:397 +msgid "GMT" +msgstr "UTC" + +#: wp-admin/includes/continents-cities.php:398 +msgid "GMT+0" +msgstr "UTC+0" + +#: wp-admin/includes/continents-cities.php:399 +msgid "GMT+1" +msgstr "UTC+1" + +#: wp-admin/includes/continents-cities.php:400 +msgid "GMT+10" +msgstr "UTC+10" + +#: wp-admin/includes/continents-cities.php:401 +msgid "GMT+11" +msgstr "UTC+11" + +#: wp-admin/includes/continents-cities.php:402 +msgid "GMT+12" +msgstr "UTC+12" + +#: wp-admin/includes/continents-cities.php:403 +msgid "GMT+2" +msgstr "UTC+2" + +#: wp-admin/includes/continents-cities.php:404 +msgid "GMT+3" +msgstr "UTC+3" + +#: wp-admin/includes/continents-cities.php:405 +msgid "GMT+4" +msgstr "UTC+4" + +#: wp-admin/includes/continents-cities.php:406 +msgid "GMT+5" +msgstr "UTC+5" + +#: wp-admin/includes/continents-cities.php:407 +msgid "GMT+6" +msgstr "UTC+6" + +#: wp-admin/includes/continents-cities.php:408 +msgid "GMT+7" +msgstr "UTC+7" + +#: wp-admin/includes/continents-cities.php:409 +msgid "GMT+8" +msgstr "UTC+8" + +#: wp-admin/includes/continents-cities.php:410 +msgid "GMT+9" +msgstr "UTC+9" + +#: wp-admin/includes/continents-cities.php:411 +msgid "GMT-0" +msgstr "UTC-0" + +#: wp-admin/includes/continents-cities.php:412 +msgid "GMT-1" +msgstr "UTC-1" + +#: wp-admin/includes/continents-cities.php:413 +msgid "GMT-10" +msgstr "UTC-10" + +#: wp-admin/includes/continents-cities.php:414 +msgid "GMT-11" +msgstr "UTC-11" + +#: wp-admin/includes/continents-cities.php:415 +msgid "GMT-12" +msgstr "UTC-12" + +#: wp-admin/includes/continents-cities.php:416 +msgid "GMT-13" +msgstr "UTC-13" + +#: wp-admin/includes/continents-cities.php:417 +msgid "GMT-14" +msgstr "UTC-14" + +#: wp-admin/includes/continents-cities.php:418 +msgid "GMT-2" +msgstr "UTC-2" + +#: wp-admin/includes/continents-cities.php:419 +msgid "GMT-3" +msgstr "UTC-3" + +#: wp-admin/includes/continents-cities.php:420 +msgid "GMT-4" +msgstr "UTC-4" + +#: wp-admin/includes/continents-cities.php:421 +msgid "GMT-5" +msgstr "UTC-5" + +#: wp-admin/includes/continents-cities.php:422 +msgid "GMT-6" +msgstr "UTC-6" + +#: wp-admin/includes/continents-cities.php:423 +msgid "GMT-7" +msgstr "UTC-7" + +#: wp-admin/includes/continents-cities.php:424 +msgid "GMT-8" +msgstr "UTC-8" + +#: wp-admin/includes/continents-cities.php:425 +msgid "GMT-9" +msgstr "UTC-9" + +#: wp-admin/includes/continents-cities.php:426 +msgid "GMT0" +msgstr "UTC0" + +#: wp-admin/includes/continents-cities.php:428 +msgid "UCT" +msgstr "UTC" + +#: wp-admin/includes/continents-cities.php:430 +msgid "Universal" +msgstr "Universel" + +#: wp-admin/includes/continents-cities.php:435 +msgid "Andorra" +msgstr "Andorre" + +#: wp-admin/includes/continents-cities.php:437 +msgid "Athens" +msgstr "Athènes" + +#: wp-admin/includes/continents-cities.php:442 +msgid "Brussels" +msgstr "Bruxelles" + +#: wp-admin/includes/continents-cities.php:443 +msgid "Bucharest" +msgstr "Bucarest" + +#: wp-admin/includes/continents-cities.php:446 +msgid "Chisinau" +msgstr "Chişinău (Kichinev)" + +#: wp-admin/includes/continents-cities.php:447 +msgid "Copenhagen" +msgstr "Copenhague" + +#: wp-admin/includes/continents-cities.php:452 +msgid "Isle of Man" +msgstr "Île de Man" + +#: wp-admin/includes/continents-cities.php:458 +msgid "Lisbon" +msgstr "Lisbonne" + +#: wp-admin/includes/continents-cities.php:460 +msgid "London" +msgstr "Londres" + +#: wp-admin/includes/continents-cities.php:463 +msgid "Malta" +msgstr "Malte" + +#: wp-admin/includes/continents-cities.php:467 +msgid "Moscow" +msgstr "Moscou" + +#: wp-admin/includes/continents-cities.php:476 +msgid "San Marino" +msgstr "Saint-Marin" + +#: wp-admin/includes/continents-cities.php:484 +msgid "Tirane" +msgstr "Tirana" + +#: wp-admin/includes/continents-cities.php:487 +msgid "Uzhgorod" +msgstr "Oujhorod (Uzhgorod)" + +#: wp-admin/includes/continents-cities.php:490 +msgid "Vienna" +msgstr "Vienne" + +#: wp-admin/includes/continents-cities.php:493 +msgid "Warsaw" +msgstr "Varsovie" + +#: wp-admin/includes/continents-cities.php:495 +msgid "Zaporozhye" +msgstr "Zaporojie" + +#: wp-admin/includes/continents-cities.php:498 +msgid "Indian" +msgstr "Océan Indien" + +#: wp-admin/includes/continents-cities.php:500 +msgid "Chagos" +msgstr "Archipel des Chagos" + +#: wp-admin/includes/continents-cities.php:501 +msgid "Christmas" +msgstr "Île Christmas" + +#: wp-admin/includes/continents-cities.php:502 +msgid "Cocos" +msgstr "Îles Cocos" + +#: wp-admin/includes/continents-cities.php:503 +msgid "Comoro" +msgstr "Archipel des Comores" + +#: wp-admin/includes/continents-cities.php:504 +msgid "Kerguelen" +msgstr "Îles Kerguelen" + +#: wp-admin/includes/continents-cities.php:505 +msgid "Mahe" +msgstr "Mahé" + +#: wp-admin/includes/continents-cities.php:507 +msgid "Mauritius" +msgstr "Île Maurice" + +#: wp-admin/includes/continents-cities.php:508 +msgid "Mayotte" +msgstr "Mayotte" + +#: wp-admin/includes/continents-cities.php:509 +msgid "Reunion" +msgstr "Île de la Réunion" + +#: wp-admin/includes/continents-cities.php:511 +msgid "Pacific" +msgstr "Océan Pacifique" + +#: wp-admin/includes/continents-cities.php:515 +msgid "Chatham" +msgstr "Îles Chatham" + +#: wp-admin/includes/continents-cities.php:517 +msgid "Easter" +msgstr "Île de Pâques" + +#: wp-admin/includes/continents-cities.php:518 +msgid "Efate" +msgstr "Éfaté" + +#: wp-admin/includes/continents-cities.php:521 +msgid "Fiji" +msgstr "Fidji" + +#: wp-admin/includes/continents-cities.php:523 +msgid "Galapagos" +msgstr "Îles Galápagos" + +#: wp-admin/includes/continents-cities.php:524 +msgid "Gambier" +msgstr "Îles Gambier" + +#: wp-admin/includes/continents-cities.php:528 +msgid "Johnston" +msgstr "Atoll de Johnston" + +#: wp-admin/includes/continents-cities.php:529 +msgid "Kiritimati" +msgstr "Île Christmas (Kiribati)" + +#: wp-admin/includes/continents-cities.php:533 +msgid "Marquesas" +msgstr "Îles Marquises" + +#: wp-admin/includes/continents-cities.php:534 +msgid "Midway" +msgstr "Atoll de Midway" + +#: wp-admin/includes/continents-cities.php:536 +msgid "Niue" +msgstr "Niué" + +#: wp-admin/includes/continents-cities.php:538 +msgid "Noumea" +msgstr "Nouméa" + +#: wp-admin/includes/continents-cities.php:540 +msgid "Palau" +msgstr "Palaos" + +#: wp-admin/includes/continents-cities.php:541 +msgid "Pitcairn" +msgstr "Îles Pitcairn" + +#: wp-admin/includes/continents-cities.php:543 +msgid "Ponape" +msgstr "Pohnpei (Ponape)" + +#: wp-admin/includes/continents-cities.php:551 +msgid "Truk" +msgstr "Chuuk (Truk)" + +#: wp-admin/includes/continents-cities.php:552 +msgid "Wake" +msgstr "Île Wake" + +#: wp-admin/includes/continents-cities.php:553 +msgid "Wallis" +msgstr "Wallis-et-Futuna" + +#: wp-admin/includes/continents-cities.php:325 +msgid "Qatar" +msgstr "" + +#: wp-admin/includes/continents-cities.php:333 +msgid "Shanghai" +msgstr "" + +#: wp-admin/includes/continents-cities.php:336 +msgid "Taipei" +msgstr "" + +#: wp-admin/includes/continents-cities.php:169 +msgid "Manaus" +msgstr "Manaos" + +#: wp-admin/includes/continents-cities.php:182 +msgid "Montevideo" +msgstr "Montévidéo" + +#: wp-admin/includes/continents-cities.php:327 +msgid "Rangoon" +msgstr "Rangoon" + +#: wp-admin/includes/continents-cities.php:350 +msgid "Vientiane" +msgstr "Vientiane" + +#: wp-admin/includes/continents-cities.php:351 +msgid "Vladivostok" +msgstr "Vladivostok" + +#: wp-admin/includes/continents-cities.php:323 +msgid "Pontianak" +msgstr "Pontianak" + +#: wp-admin/includes/continents-cities.php:324 +msgid "Pyongyang" +msgstr "Pyongyang" + +#: wp-admin/includes/continents-cities.php:322 +msgid "Phnom Penh" +msgstr "Phnom Penh" + +#: wp-admin/includes/continents-cities.php:451 +msgid "Helsinki" +msgstr "Helsinki" + +#: wp-admin/includes/continents-cities.php:454 +msgid "Jersey" +msgstr "Jersey" + +#: wp-admin/includes/continents-cities.php:296 +msgid "Jakarta" +msgstr "Jakarta" + +#: wp-admin/includes/continents-cities.php:297 +msgid "Jayapura" +msgstr "Jayapura" + +#: wp-admin/includes/continents-cities.php:301 +msgid "Karachi" +msgstr "Karachi" + +#: wp-admin/includes/continents-cities.php:308 +msgid "Kuala Lumpur" +msgstr "Kuala Lumpur" + +#: wp-admin/includes/continents-cities.php:309 +msgid "Kuching" +msgstr "Kuching" + +#: wp-admin/includes/continents-cities.php:311 +msgid "Macao" +msgstr "Macao" + +#: wp-admin/includes/continents-cities.php:313 +msgid "Magadan" +msgstr "Magadan" + +#: wp-admin/includes/continents-cities.php:314 +msgid "Makassar" +msgstr "Makassar" + +#: wp-admin/includes/continents-cities.php:320 +msgid "Omsk" +msgstr "Omsk" + +#: wp-admin/includes/continents-cities.php:444 +msgid "Budapest" +msgstr "Budapest" + +#: wp-admin/includes/continents-cities.php:448 +msgid "Dublin" +msgstr "Dublin" + +#: wp-admin/includes/continents-cities.php:449 +msgid "Gibraltar" +msgstr "Gibraltar" + +#: wp-admin/includes/continents-cities.php:450 +msgid "Guernsey" +msgstr "Guernsey" + +#: wp-admin/includes/continents-cities.php:441 +msgid "Bratislava" +msgstr "Bratislava" + +#: wp-admin/includes/continents-cities.php:439 +msgid "Belgrade" +msgstr "Belgrade" + +#: wp-admin/includes/continents-cities.php:440 +msgid "Berlin" +msgstr "Berlin" + +#: wp-admin/includes/continents-cities.php:438 +msgid "Belfast" +msgstr "Belfast" + +#: wp-admin/includes/continents-cities.php:434 +msgid "Amsterdam" +msgstr "Amsterdam" + +#: wp-admin/includes/continents-cities.php:429 +msgid "UTC" +msgstr "UTC" + +#: wp-admin/includes/continents-cities.php:431 +msgid "Zulu" +msgstr "Zulu" + +#: wp-admin/includes/continents-cities.php:433 +msgid "Europe" +msgstr "Europe" + +#: wp-admin/includes/continents-cities.php:427 +msgid "Greenwich" +msgstr "Greenwich" + +#: wp-admin/includes/continents-cities.php:473 +msgid "Riga" +msgstr "Riga" + +#: wp-admin/includes/continents-cities.php:474 +msgid "Rome" +msgstr "Rome" + +#: wp-admin/includes/continents-cities.php:475 +msgid "Samara" +msgstr "Samara" + +#: wp-admin/includes/continents-cities.php:477 +msgid "Sarajevo" +msgstr "Sarajevo" + +#: wp-admin/includes/continents-cities.php:479 +msgid "Simferopol" +msgstr "Simferopol" + +#: wp-admin/includes/continents-cities.php:469 +msgid "Oslo" +msgstr "Oslo" + +#: wp-admin/includes/continents-cities.php:470 +msgid "Paris" +msgstr "Paris" + +#: wp-admin/includes/continents-cities.php:471 +msgid "Podgorica" +msgstr "Podgorica" + +#: wp-admin/includes/continents-cities.php:464 +msgid "Mariehamn" +msgstr "Mariehamn" + +#: wp-admin/includes/continents-cities.php:465 +msgid "Minsk" +msgstr "Minsk" + +#: wp-admin/includes/continents-cities.php:466 +msgid "Monaco" +msgstr "Monaco" + +#: wp-admin/includes/continents-cities.php:461 +msgid "Luxembourg" +msgstr "Luxembourg" + +#: wp-admin/includes/continents-cities.php:462 +msgid "Madrid" +msgstr "Madrid" + +#: wp-admin/includes/continents-cities.php:499 +msgid "Antananarivo" +msgstr "Antananarivo" + +#: wp-admin/includes/continents-cities.php:506 +msgid "Maldives" +msgstr "Maldives" + +#: wp-admin/includes/continents-cities.php:512 +msgid "Apia" +msgstr "Apia" + +#: wp-admin/includes/continents-cities.php:513 +msgid "Auckland" +msgstr "Auckland" + +#: wp-admin/includes/continents-cities.php:456 +msgid "Kiev" +msgstr "Kiev" + +#: wp-admin/includes/continents-cities.php:459 +msgid "Ljubljana" +msgstr "Ljubljana" + +#: wp-admin/includes/continents-cities.php:492 +msgid "Volgograd" +msgstr "Volgograd" + +#: wp-admin/includes/continents-cities.php:494 +msgid "Zagreb" +msgstr "Zagreb" + +#: wp-admin/includes/continents-cities.php:496 +msgid "Zurich" +msgstr "Zurich" + +#: wp-admin/includes/continents-cities.php:491 +msgid "Vilnius" +msgstr "Vilnius" + +#: wp-admin/includes/continents-cities.php:489 +msgid "Vatican" +msgstr "Vatican" + +#: wp-admin/includes/continents-cities.php:483 +msgid "Tallinn" +msgstr "Tallinn" + +#: wp-admin/includes/continents-cities.php:485 +msgid "Tiraspol" +msgstr "Tiraspol" + +#: wp-admin/includes/continents-cities.php:488 +msgid "Vaduz" +msgstr "Vaduz" + +#: wp-admin/includes/continents-cities.php:480 +msgid "Skopje" +msgstr "Skopje" + +#: wp-admin/includes/continents-cities.php:481 +msgid "Sofia" +msgstr "Sofia" + +#: wp-admin/includes/continents-cities.php:482 +msgid "Stockholm" +msgstr "Stockholm" + +#: wp-admin/includes/continents-cities.php:544 +msgid "Port Moresby" +msgstr "Port Moresby" + +#: wp-admin/includes/continents-cities.php:545 +msgid "Rarotonga" +msgstr "Rarotonga" + +#: wp-admin/includes/continents-cities.php:546 +msgid "Saipan" +msgstr "Saipan" + +#: wp-admin/includes/continents-cities.php:537 +msgid "Norfolk" +msgstr "Norfolk" + +#: wp-admin/includes/continents-cities.php:539 +msgid "Pago Pago" +msgstr "Pago Pago" + +#: wp-admin/includes/continents-cities.php:531 +msgid "Kwajalein" +msgstr "Kwajalein" + +#: wp-admin/includes/continents-cities.php:532 +msgid "Majuro" +msgstr "Majuro" + +#: wp-admin/includes/continents-cities.php:535 +msgid "Nauru" +msgstr "Nauru" + +#: wp-admin/includes/continents-cities.php:526 +msgid "Guam" +msgstr "Guam" + +#: wp-admin/includes/continents-cities.php:527 +msgid "Honolulu" +msgstr "Honolulu" + +#: wp-admin/includes/continents-cities.php:530 +msgid "Kosrae" +msgstr "Kosrae" + +#: wp-admin/includes/continents-cities.php:520 +msgid "Fakaofo" +msgstr "Fakaofo" + +#: wp-admin/includes/continents-cities.php:522 +msgid "Funafuti" +msgstr "Funafuti" + +#: wp-admin/includes/continents-cities.php:525 +msgid "Guadalcanal" +msgstr "Guadalcanal" + +#: wp-admin/includes/continents-cities.php:519 +msgid "Enderbury" +msgstr "Enderbury" + +#: wp-admin/includes/continents-cities.php:550 +msgid "Tongatapu" +msgstr "Tongatapu" + +#: wp-admin/includes/continents-cities.php:554 +msgid "Yap" +msgstr "Yap" + +#: wp-admin/includes/continents-cities.php:548 +msgid "Tahiti" +msgstr "Tahiti" + +#: wp-admin/includes/continents-cities.php:549 +msgid "Tarawa" +msgstr "Tarawa" + +#: wp-admin/includes/continents-cities.php:547 +msgid "Samoa" +msgstr "Samoa" + +#: wp-admin/includes/continents-cities.php:250 +msgid "Syowa" +msgstr "Syowa" + +#: wp-admin/includes/continents-cities.php:252 +msgid "Vostok" +msgstr "Vostok" + +#: wp-admin/includes/continents-cities.php:255 +msgid "Longyearbyen" +msgstr "Longyearbyen" + +#: wp-admin/includes/continents-cities.php:258 +msgid "Aden" +msgstr "Aden" + +#: wp-admin/includes/continents-cities.php:246 +msgid "McMurdo" +msgstr "McMurdo" + +#: wp-admin/includes/continents-cities.php:247 +msgid "Palmer" +msgstr "Palmer" + +#: wp-admin/includes/continents-cities.php:248 +msgid "Rothera" +msgstr "Rothera" + +#: wp-admin/includes/continents-cities.php:245 +msgid "Mawson" +msgstr "Mawson" + +#: wp-admin/includes/continents-cities.php:242 +msgid "Davis" +msgstr "Davis" + +#: wp-admin/includes/continents-cities.php:238 +msgid "Yellowknife" +msgstr "Yellowknife" + +#: wp-admin/includes/continents-cities.php:241 +msgid "Casey" +msgstr "Casey" + +#: wp-admin/includes/continents-cities.php:237 +msgid "Yakutat" +msgstr "Yakutat" + +#: wp-admin/includes/continents-cities.php:236 +msgid "Winnipeg" +msgstr "Winnipeg" + +#: wp-admin/includes/continents-cities.php:235 +msgid "Whitehorse" +msgstr "Whitehorse" + +#: wp-admin/includes/continents-cities.php:234 +msgid "Virgin" +msgstr "Virgin" + +#: wp-admin/includes/continents-cities.php:390 +msgid "Sydney" +msgstr "Sydney" + +#: wp-admin/includes/continents-cities.php:392 +msgid "Victoria" +msgstr "Victoria" + +#: wp-admin/includes/continents-cities.php:394 +msgid "Yancowinna" +msgstr "Yancowinna" + +#: wp-admin/includes/continents-cities.php:455 +msgid "Kaliningrad" +msgstr "Kaliningrad" + +#: wp-admin/includes/continents-cities.php:387 +msgid "Perth" +msgstr "Perth" + +#: wp-admin/includes/continents-cities.php:388 +msgid "Queensland" +msgstr "Queensland" + +#: wp-admin/includes/continents-cities.php:380 +msgid "Hobart" +msgstr "Hobart" + +#: wp-admin/includes/continents-cities.php:382 +msgid "Lindeman" +msgstr "Lindeman" + +#: wp-admin/includes/continents-cities.php:384 +msgid "Melbourne" +msgstr "Melbourne" + +#: wp-admin/includes/continents-cities.php:376 +msgid "Canberra" +msgstr "Canberra" + +#: wp-admin/includes/continents-cities.php:377 +msgid "Currie" +msgstr "Currie" + +#: wp-admin/includes/continents-cities.php:378 +msgid "Darwin" +msgstr "Darwin" + +#: wp-admin/includes/continents-cities.php:379 +msgid "Eucla" +msgstr "Eucla" + +#: wp-admin/includes/continents-cities.php:369 +msgid "Stanley" +msgstr "Stanley" + +#: wp-admin/includes/continents-cities.php:374 +msgid "Brisbane" +msgstr "Brisbane" + +#: wp-admin/includes/continents-cities.php:375 +msgid "Broken Hill" +msgstr "Broken Hill" + +#: wp-admin/includes/continents-cities.php:295 +#: wp-admin/includes/continents-cities.php:453 +msgid "Istanbul" +msgstr "Istanbul" + +#: wp-admin/includes/continents-cities.php:292 +msgid "Hong Kong" +msgstr "Hong Kong" + +#: wp-admin/includes/continents-cities.php:293 +msgid "Hovd" +msgstr "Hovd" + +#: wp-admin/includes/continents-cities.php:261 +msgid "Anadyr" +msgstr "Anadyr" + +#: wp-admin/includes/continents-cities.php:270 +msgid "Bangkok" +msgstr "Bangkok" + +#: wp-admin/includes/continents-cities.php:274 +msgid "Brunei" +msgstr "Brunei" + +#: wp-admin/includes/continents-cities.php:275 +msgid "Calcutta" +msgstr "Calcutta" + +#: wp-admin/includes/continents-cities.php:278 +msgid "Chongqing" +msgstr "Chongqing" + +#: wp-admin/includes/continents-cities.php:279 +msgid "Chungking" +msgstr "Chungking" + +#: wp-admin/includes/continents-cities.php:280 +msgid "Colombo" +msgstr "Colombo" + +#: wp-admin/includes/continents-cities.php:284 +msgid "Dili" +msgstr "Dili" + +#: wp-admin/includes/continents-cities.php:288 +msgid "Gaza" +msgstr "Gaza" + +#: wp-admin/includes/continents-cities.php:289 +msgid "Harbin" +msgstr "Harbin" + +#: wp-admin/includes/continents-cities.php:227 +msgid "Tegucigalpa" +msgstr "Tegucigalpa" + +#: wp-admin/includes/continents-cities.php:228 +msgid "Thule" +msgstr "Thule" + +#: wp-admin/includes/continents-cities.php:229 +msgid "Thunder Bay" +msgstr "Thunder Bay" + +#: wp-admin/includes/continents-cities.php:259 +msgid "Almaty" +msgstr "Almaty" + +#: wp-admin/includes/continents-cities.php:260 +msgid "Amman" +msgstr "Amman" + +#: wp-admin/includes/continents-cities.php:208 +msgid "Regina" +msgstr "Regina" + +#: wp-admin/includes/continents-cities.php:209 +msgid "Resolute" +msgstr "Resolute" + +#: wp-admin/includes/continents-cities.php:210 +msgid "Rio Branco" +msgstr "Rio Branco" + +#: wp-admin/includes/continents-cities.php:211 +msgid "Rosario" +msgstr "Rosario" + +#: wp-admin/includes/continents-cities.php:218 +msgid "Shiprock" +msgstr "Shiprock" + +#: wp-admin/includes/continents-cities.php:226 +msgid "Swift Current" +msgstr "Swift Current" + +#: wp-admin/includes/continents-cities.php:207 +msgid "Recife" +msgstr "Recife" + +#: wp-admin/includes/continents-cities.php:197 +msgid "Paramaribo" +msgstr "Paramaribo" + +#: wp-admin/includes/continents-cities.php:230 +msgid "Tijuana" +msgstr "Tijuana" + +#: wp-admin/includes/continents-cities.php:231 +msgid "Toronto" +msgstr "Toronto" + +#: wp-admin/includes/continents-cities.php:232 +msgid "Tortola" +msgstr "Tortola" + +#: wp-admin/includes/continents-cities.php:233 +msgid "Vancouver" +msgstr "Vancouver" + +#: wp-admin/includes/continents-cities.php:198 +msgid "Phoenix" +msgstr "Phoenix" + +#: wp-admin/includes/continents-cities.php:200 +msgid "Port-au-Prince" +msgstr "Port-au-Prince" + +#: wp-admin/includes/continents-cities.php:201 +msgid "Porto Acre" +msgstr "Porto Acre" + +#: wp-admin/includes/continents-cities.php:202 +msgid "Porto Velho" +msgstr "Porto Velho" + +#: wp-admin/includes/continents-cities.php:205 +msgid "Rainy River" +msgstr "Rainy River" + +#: wp-admin/includes/continents-cities.php:181 +msgid "Monterrey" +msgstr "Monterrey" + +#: wp-admin/includes/continents-cities.php:184 +msgid "Montserrat" +msgstr "Montserrat" + +#: wp-admin/includes/continents-cities.php:185 +msgid "Nassau" +msgstr "Nassau" + +#: wp-admin/includes/continents-cities.php:186 +msgid "New York" +msgstr "New York" + +#: wp-admin/includes/continents-cities.php:187 +msgid "Nipigon" +msgstr "Nipigon" + +#: wp-admin/includes/continents-cities.php:188 +msgid "Nome" +msgstr "Nome" + +#: wp-admin/includes/continents-cities.php:189 +msgid "Noronha" +msgstr "Noronha" + +#: wp-admin/includes/continents-cities.php:193 +msgid "New Salem" +msgstr "New Salem" + +#: wp-admin/includes/continents-cities.php:195 +msgid "Panama" +msgstr "Panama" + +#: wp-admin/includes/continents-cities.php:196 +msgid "Pangnirtung" +msgstr "Pangnirtung" + +#: wp-admin/includes/continents-cities.php:159 +msgid "Monticello" +msgstr "Monticello" + +#: wp-admin/includes/continents-cities.php:170 +msgid "Marigot" +msgstr "Marigot" + +#: wp-admin/includes/continents-cities.php:171 +msgid "Martinique" +msgstr "Martinique" + +#: wp-admin/includes/continents-cities.php:173 +msgid "Mazatlan" +msgstr "Mazatlan" + +#: wp-admin/includes/continents-cities.php:175 +msgid "Menominee" +msgstr "Menominee" + +#: wp-admin/includes/continents-cities.php:176 +msgid "Merida" +msgstr "Merida" + +#: wp-admin/includes/continents-cities.php:179 +msgid "Miquelon" +msgstr "Miquelon" + +#: wp-admin/includes/continents-cities.php:180 +msgid "Moncton" +msgstr "Moncton" + +#: wp-admin/includes/continents-cities.php:168 +msgid "Managua" +msgstr "Managua" + +#: wp-admin/includes/continents-cities.php:158 +#: wp-admin/includes/continents-cities.php:165 +msgid "Louisville" +msgstr "Louisville" + +#: wp-admin/includes/continents-cities.php:162 +msgid "La Paz" +msgstr "La Paz" + +#: wp-admin/includes/continents-cities.php:163 +msgid "Lima" +msgstr "Lima" + +#: wp-admin/includes/continents-cities.php:164 +msgid "Los Angeles" +msgstr "Los Angeles" + +#: wp-admin/includes/continents-cities.php:157 +msgid "Kentucky" +msgstr "Kentucky" + +#: wp-admin/includes/continents-cities.php:153 +msgid "Iqaluit" +msgstr "Iqaluit" + +#: wp-admin/includes/continents-cities.php:156 +msgid "Juneau" +msgstr "Juneau" + +#: wp-admin/includes/continents-cities.php:152 +msgid "Inuvik" +msgstr "Inuvik" + +#: wp-admin/includes/continents-cities.php:192 +msgid "Center" +msgstr "Center" + +#: wp-admin/includes/continents-cities.php:150 +msgid "Winamac" +msgstr "Winamac" + +#: wp-admin/includes/continents-cities.php:149 +msgid "Vincennes" +msgstr "Vincennes" + +#: wp-admin/includes/continents-cities.php:472 +msgid "Prague" +msgstr "Prague" + +#: wp-admin/includes/continents-cities.php:216 +msgid "Sao Paulo" +msgstr "Sao Paulo" + +#: wp-admin/includes/continents-cities.php:12 +msgid "Africa" +msgstr "Afrique" + +#: wp-admin/includes/continents-cities.php:15 +msgid "Addis Ababa" +msgstr "Addis-Abeba" + +#: wp-admin/includes/continents-cities.php:16 +msgid "Algiers" +msgstr "Alger" + +#: wp-admin/includes/continents-cities.php:18 +msgid "Asmera" +msgstr "Asmara" + +#: wp-admin/includes/continents-cities.php:26 +msgid "Cairo" +msgstr "Le Caire" + +#: wp-admin/includes/continents-cities.php:34 +msgid "El Aaiun" +msgstr "Laâyoune" + +#: wp-admin/includes/continents-cities.php:46 +msgid "Lome" +msgstr "Lomé" + +#: wp-admin/includes/continents-cities.php:54 +msgid "Mogadishu" +msgstr "Mogadiscio" + +#: wp-admin/includes/continents-cities.php:57 +msgid "Ndjamena" +msgstr "N'Djamena" + +#: wp-admin/includes/continents-cities.php:63 +msgid "Timbuktu" +msgstr "Tombouctou" + +#: wp-admin/includes/continents-cities.php:68 +msgid "America" +msgstr "Amériques" + +#: wp-admin/includes/continents-cities.php:73 +msgid "Araguaina" +msgstr "Araguaína" + +#: wp-admin/includes/continents-cities.php:74 +msgid "Argentina" +msgstr "Argentine" + +#: wp-admin/includes/continents-cities.php:77 +msgid "ComodRivadavia" +msgstr "Comodoro Rivadavia" + +#: wp-admin/includes/continents-cities.php:79 +#: wp-admin/includes/continents-cities.php:155 +msgid "Jujuy" +msgstr "San Salvador de Jujuy" + +#: wp-admin/includes/continents-cities.php:82 +msgid "Rio Gallegos" +msgstr "Rio Gallegos" + +#: wp-admin/includes/continents-cities.php:86 +msgid "Tucuman" +msgstr "San Miguel de Tucumán" + +#: wp-admin/includes/continents-cities.php:87 +msgid "Ushuaia" +msgstr "Ushuaïa" + +#: wp-admin/includes/continents-cities.php:89 +msgid "Asuncion" +msgstr "Asunción" + +#: wp-admin/includes/continents-cities.php:94 +msgid "Barbados" +msgstr "Barbade" + +#: wp-admin/includes/continents-cities.php:95 +msgid "Belem" +msgstr "Belém" + +#: wp-admin/includes/continents-cities.php:99 +msgid "Bogota" +msgstr "Bogotá" + +#: wp-admin/includes/continents-cities.php:102 +msgid "Cambridge Bay" +msgstr "Ikaluktutiak" + +#: wp-admin/includes/continents-cities.php:104 +msgid "Cancun" +msgstr "Cancún" + +#: wp-admin/includes/continents-cities.php:108 +msgid "Cayman" +msgstr "Îles Caïmans" + +#: wp-admin/includes/continents-cities.php:110 +msgid "Chihuahua" +msgstr "Etat de Chihuahua" + +#: wp-admin/includes/continents-cities.php:115 +msgid "Cuiaba" +msgstr "Cuiabá" + +#: wp-admin/includes/continents-cities.php:116 +msgid "Curacao" +msgstr "Curaçao" + +#: wp-admin/includes/continents-cities.php:122 +msgid "Dominica" +msgstr "Dominique" + +#: wp-admin/includes/continents-cities.php:124 +msgid "Eirunepe" +msgstr "Eirunepé" + +#: wp-admin/includes/continents-cities.php:125 +msgid "El Salvador" +msgstr "Salvador" + +#: wp-admin/includes/continents-cities.php:131 +msgid "Godthab" +msgstr "Nuuk (Godthåb)" + +#: wp-admin/includes/continents-cities.php:134 +msgid "Grenada" +msgstr "Grenade" + +#: wp-admin/includes/continents-cities.php:138 +msgid "Guyana" +msgstr "Guyane" + +#: wp-admin/includes/continents-cities.php:140 +msgid "Havana" +msgstr "La Havane" + +#: wp-admin/includes/continents-cities.php:51 +msgid "Maputo" +msgstr "Maputo" + +#: wp-admin/includes/continents-cities.php:50 +msgid "Malabo" +msgstr "Malabo" + +#: wp-admin/includes/continents-cities.php:45 +msgid "Libreville" +msgstr "Libreville" + +#: wp-admin/includes/continents-cities.php:44 +msgid "Lagos" +msgstr "Lagos" + +#: wp-admin/includes/continents-cities.php:40 +msgid "Kampala" +msgstr "Kampala" + +#: wp-admin/includes/continents-cities.php:48 +msgid "Lubumbashi" +msgstr "Lubumbashi" + +#: wp-admin/includes/continents-cities.php:47 +msgid "Luanda" +msgstr "Luanda" + +#: wp-admin/includes/continents-cities.php:43 +msgid "Kinshasa" +msgstr "Kinshasa" + +#: wp-admin/includes/continents-cities.php:38 +msgid "Johannesburg" +msgstr "Johannesburg" + +#: wp-admin/includes/continents-cities.php:42 +msgid "Kigali" +msgstr "Kigali" + +#: wp-admin/includes/continents-cities.php:64 +msgid "Tripoli" +msgstr "Tripoli" + +#: wp-admin/includes/continents-cities.php:69 +msgid "Adak" +msgstr "Adak" + +#: wp-admin/includes/continents-cities.php:66 +msgid "Windhoek" +msgstr "Windhoek" + +#: wp-admin/includes/continents-cities.php:65 +msgid "Tunis" +msgstr "Tunis" + +#: wp-admin/includes/continents-cities.php:71 +msgid "Anguilla" +msgstr "Anguilla" + +#: wp-admin/includes/continents-cities.php:70 +msgid "Anchorage" +msgstr "Anchorage" + +#: wp-admin/includes/continents-cities.php:75 +#: wp-admin/includes/continents-cities.php:101 +msgid "Buenos Aires" +msgstr "Buenos Aires" + +#: wp-admin/includes/continents-cities.php:72 +msgid "Antigua" +msgstr "Antigua" + +#: wp-admin/includes/continents-cities.php:76 +#: wp-admin/includes/continents-cities.php:106 +msgid "Catamarca" +msgstr "Catamarca" + +#: wp-admin/includes/continents-cities.php:55 +msgid "Monrovia" +msgstr "Monrovia" + +#: wp-admin/includes/continents-cities.php:80 +msgid "La Rioja" +msgstr "La Rioja" + +#: wp-admin/includes/continents-cities.php:56 +msgid "Nairobi" +msgstr "Nairobi" + +#: wp-admin/includes/continents-cities.php:52 +msgid "Maseru" +msgstr "Maseru" + +#: wp-admin/includes/continents-cities.php:53 +msgid "Mbabane" +msgstr "Mbabane" + +#: wp-admin/includes/continents-cities.php:25 +msgid "Bujumbura" +msgstr "Bujumbura" + +#: wp-admin/includes/continents-cities.php:49 +msgid "Lusaka" +msgstr "Lusaka" + +#: wp-admin/includes/continents-cities.php:31 +msgid "Dar es Salaam" +msgstr "Dar es Salaam" + +#: wp-admin/includes/continents-cities.php:30 +msgid "Dakar" +msgstr "Dakar" + +#: wp-admin/includes/continents-cities.php:29 +msgid "Conakry" +msgstr "Conakry" + +#: wp-admin/includes/continents-cities.php:28 +msgid "Ceuta" +msgstr "Ceuta" + +#: wp-admin/includes/continents-cities.php:27 +msgid "Casablanca" +msgstr "Casablanca" + +#: wp-admin/includes/continents-cities.php:36 +msgid "Gaborone" +msgstr "Gaborone" + +#: wp-admin/includes/continents-cities.php:41 +msgid "Khartoum" +msgstr "Khartoum" + +#: wp-admin/includes/continents-cities.php:32 +msgid "Djibouti" +msgstr "Djibouti" + +#: wp-admin/includes/continents-cities.php:33 +msgid "Douala" +msgstr "Douala" + +#: wp-admin/includes/continents-cities.php:37 +msgid "Harare" +msgstr "Harare" + +#: wp-admin/includes/continents-cities.php:60 +msgid "Ouagadougou" +msgstr "Ouagadougou" + +#: wp-admin/includes/continents-cities.php:59 +msgid "Nouakchott" +msgstr "Nouakchott" + +#: wp-admin/includes/continents-cities.php:58 +msgid "Niamey" +msgstr "Niamey" + +#: wp-admin/includes/continents-cities.php:14 +msgid "Accra" +msgstr "Accra" + +#: wp-admin/includes/continents-cities.php:81 +#: wp-admin/includes/continents-cities.php:174 +msgid "Mendoza" +msgstr "Mendoza" + +#: wp-admin/includes/continents-cities.php:84 +msgid "San Juan" +msgstr "San Juan" + +#: wp-admin/includes/continents-cities.php:85 +msgid "San Luis" +msgstr "San Luis" + +#: wp-admin/includes/continents-cities.php:88 +msgid "Aruba" +msgstr "Aruba" + +#: wp-admin/includes/continents-cities.php:90 +msgid "Atikokan" +msgstr "Atikokan" + +#: wp-admin/includes/continents-cities.php:91 +msgid "Atka" +msgstr "Atka" + +#: wp-admin/includes/continents-cities.php:61 +msgid "Porto-Novo" +msgstr "Porto-Novo" + +#: wp-admin/includes/continents-cities.php:17 +msgid "Asmara" +msgstr "Asmara" + +#: wp-admin/includes/continents-cities.php:13 +msgid "Abidjan" +msgstr "Abidjan" + +#: wp-admin/includes/continents-cities.php:22 +msgid "Bissau" +msgstr "Bissau" + +#: wp-admin/includes/continents-cities.php:21 +msgid "Banjul" +msgstr "Banjul" + +#: wp-admin/includes/continents-cities.php:20 +msgid "Bangui" +msgstr "Bangui" + +#: wp-admin/includes/continents-cities.php:19 +msgid "Bamako" +msgstr "Bamako" + +#: wp-admin/includes/continents-cities.php:23 +msgid "Blantyre" +msgstr "Blantyre" + +#: wp-admin/includes/continents-cities.php:111 +msgid "Coral Harbour" +msgstr "Coral Harbour" + +#: wp-admin/includes/continents-cities.php:113 +msgid "Costa Rica" +msgstr "Costa Rica" + +#: wp-admin/includes/continents-cities.php:117 +msgid "Danmarkshavn" +msgstr "Danmarkshavn" + +#: wp-admin/includes/continents-cities.php:118 +msgid "Dawson" +msgstr "Dawson" + +#: wp-admin/includes/continents-cities.php:119 +msgid "Dawson Creek" +msgstr "Dawson Creek" + +#: wp-admin/includes/continents-cities.php:120 +msgid "Denver" +msgstr "Denver" + +#: wp-admin/includes/continents-cities.php:24 +msgid "Brazzaville" +msgstr "Brazzaville" + +#: wp-admin/includes/continents-cities.php:103 +msgid "Campo Grande" +msgstr "Campo Grande" + +#: wp-admin/includes/continents-cities.php:105 +msgid "Caracas" +msgstr "Caracas" + +#: wp-admin/includes/continents-cities.php:107 +msgid "Cayenne" +msgstr "Cayenne" + +#: wp-admin/includes/continents-cities.php:109 +msgid "Chicago" +msgstr "Chicago" + +#: wp-admin/includes/continents-cities.php:100 +msgid "Boise" +msgstr "Boise" + +#: wp-admin/includes/continents-cities.php:97 +msgid "Blanc-Sablon" +msgstr "Blanc-Sablon" + +#: wp-admin/includes/continents-cities.php:98 +msgid "Boa Vista" +msgstr "Boa Vista" + +#: wp-admin/includes/continents-cities.php:92 +msgid "Bahia" +msgstr "Bahia" + +#: wp-admin/includes/continents-cities.php:96 +msgid "Belize" +msgstr "Belize" + +#: wp-admin/includes/continents-cities.php:143 +#: wp-admin/includes/continents-cities.php:151 +msgid "Indianapolis" +msgstr "Indianapolis" + +#: wp-admin/includes/continents-cities.php:141 +msgid "Hermosillo" +msgstr "Hermosillo" + +#: wp-admin/includes/continents-cities.php:142 +msgid "Indiana" +msgstr "Indiana" + +#: wp-admin/includes/continents-cities.php:139 +msgid "Halifax" +msgstr "Halifax" + +#: wp-admin/includes/continents-cities.php:137 +msgid "Guayaquil" +msgstr "Guayaquil" + +#: wp-admin/includes/continents-cities.php:133 +msgid "Grand Turk" +msgstr "Grand Turk" + +#: wp-admin/includes/continents-cities.php:135 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#: wp-admin/includes/continents-cities.php:136 +msgid "Guatemala" +msgstr "Guatemala" + +#: wp-admin/includes/continents-cities.php:123 +msgid "Edmonton" +msgstr "Edmonton" + +#: wp-admin/includes/continents-cities.php:126 +msgid "Ensenada" +msgstr "Ensenada" + +#: wp-admin/includes/continents-cities.php:128 +msgid "Fort Wayne" +msgstr "Fort Wayne" + +#: wp-admin/includes/continents-cities.php:129 +msgid "Fortaleza" +msgstr "Fortaleza" + +#: wp-admin/includes/continents-cities.php:130 +msgid "Glace Bay" +msgstr "Glace Bay" + +#: wp-admin/includes/continents-cities.php:132 +msgid "Goose Bay" +msgstr "Goose Bay" + +#: wp-admin/includes/continents-cities.php:147 +msgid "Tell City" +msgstr "Tell City" + +#: wp-admin/includes/continents-cities.php:148 +msgid "Vevay" +msgstr "Vevay" + +#: wp-admin/includes/continents-cities.php:121 +msgid "Detroit" +msgstr "Detroit" + +#: wp-admin/includes/continents-cities.php:145 +msgid "Marengo" +msgstr "Marengo" + +#: wp-admin/includes/continents-cities.php:146 +msgid "Petersburg" +msgstr "Petersburg" + +#: wp-admin/includes/continents-cities.php:144 +msgid "Knox" +msgstr "Knox" + +#: wp-admin/includes/continents-cities.php:35 +msgid "Freetown" +msgstr "Freetown" + +#: wp-admin/includes/continents-cities.php:62 +msgid "Sao Tome" +msgstr "Sao Tomé" + +#: wp-admin/includes/continents-cities.php:78 +#: wp-admin/includes/continents-cities.php:112 +msgid "Cordoba" +msgstr "Cordoba" \ No newline at end of file diff --git a/content/languages/fr_FR-0ce75ad2f775d1cac9696967d484808c.json b/content/languages/fr_FR-0ce75ad2f775d1cac9696967d484808c.json new file mode 100644 index 0000000..c5d1daf --- /dev/null +++ b/content/languages/fr_FR-0ce75ad2f775d1cac9696967d484808c.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Editor tips":["Astuces de l\u2019\u00e9diteur"],"Disable tips":["D\u00e9sactiver les astuces"],"Got it":["J\u2019ai compris"],"See next tip":["Voir l\u2019astuce suivante"]}},"comment":{"reference":"wp-includes\/js\/dist\/nux.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-1a0cd6a7128913b15c1a10dd68951869.json b/content/languages/fr_FR-1a0cd6a7128913b15c1a10dd68951869.json new file mode 100644 index 0000000..a4d5b68 --- /dev/null +++ b/content/languages/fr_FR-1a0cd6a7128913b15c1a10dd68951869.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"%1$s Block. Row %2$d. %3$s":["Bloc %1$s. Ligne %2$d. %3$s"],"%s Block. Row %d":["Bloc %s. Ligne %d"],"%1$s Block. Column %2$d. %3$s":["Bloc %1$s. Colonne %2$d. %3$s"],"%s Block. Column %d":["%s Bloc. Colonne %d"],"%1$s Block. %2$s":["Bloc %1$s. %2$s"],"%s Block":["Bloc %s"],"Formatting":["Mise en forme"],"Embeds":["Contenus embarqu\u00e9s"],"Reusable blocks":["Blocs r\u00e9utilisables"],"Common blocks":["Blocs communs"],"Layout elements":["\u00c9l\u00e9ments de mise en page"],"Widgets":["Widgets"]}},"comment":{"reference":"wp-includes\/js\/dist\/blocks.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-1bba9045bb07c89671c88a3f328548e8.json b/content/languages/fr_FR-1bba9045bb07c89671c88a3f328548e8.json new file mode 100644 index 0000000..9e7e778 --- /dev/null +++ b/content/languages/fr_FR-1bba9045bb07c89671c88a3f328548e8.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"You are probably offline.":["Vous \u00eates probablement hors ligne."],"Media upload failed. If this is a photo or a large image, please scale it down and try again.":["Le t\u00e9l\u00e9versement du m\u00e9dia a \u00e9chou\u00e9. S\u2019il s\u2019agit d\u2019une photo ou d\u2019une grande image, veuillez la redimensionner puis r\u00e9essayer."],"The response is not a valid JSON response.":["La r\u00e9ponse n\u2019est pas une r\u00e9ponse JSON valide."],"An unknown error occurred.":["Une erreur inconnue est survenue."]}},"comment":{"reference":"wp-includes\/js\/dist\/api-fetch.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-28b3c3d595952907e08d98287077426c.json b/content/languages/fr_FR-28b3c3d595952907e08d98287077426c.json new file mode 100644 index 0000000..ba47045 --- /dev/null +++ b/content/languages/fr_FR-28b3c3d595952907e08d98287077426c.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Unknown error":["Erreur inconnue"],"Reusable block imported successfully!":["Bloc r\u00e9utilisable bien import\u00e9\u00a0!"],"Invalid Reusable Block JSON file":["Fichier JSON de bloc r\u00e9utilisable non valide"],"Invalid JSON file":["Fichier JSON non valide"],"Import from JSON":["Importer d\u2019un JSON"],"button label\u0004Import":["Importer"],"File":["Fichier"]}},"comment":{"reference":"wp-includes\/js\/dist\/list-reusable-blocks.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-2c5d274ea625dd91556554ad82901529.json b/content/languages/fr_FR-2c5d274ea625dd91556554ad82901529.json new file mode 100644 index 0000000..f8851ce --- /dev/null +++ b/content/languages/fr_FR-2c5d274ea625dd91556554ad82901529.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Annotation":["Annotation"]}},"comment":{"reference":"wp-includes\/js\/dist\/annotations.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-4a38fe1c0c45989e44682ba6109d9f46.json b/content/languages/fr_FR-4a38fe1c0c45989e44682ba6109d9f46.json new file mode 100644 index 0000000..705a5f9 --- /dev/null +++ b/content/languages/fr_FR-4a38fe1c0c45989e44682ba6109d9f46.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-12 17:47:00+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"All site health tests have finished running. There are items that should be addressed, and the results are now available on the page.":["Tous les tests de sant\u00e9 du site ont fini de tourner. Il y a des \u00e9l\u00e9ments qui devraient \u00eatre pris en charge, et les r\u00e9sultats sont maintenant disponible sur cette page."],"Should be improved":["Peut \u00eatre am\u00e9lior\u00e9"],"Good":["Bien"],"%s critical issue":["%s probl\u00e8me critique","%s probl\u00e8mes critiques"],"%s item with no issues detected":["%s \u00e9l\u00e9ment sans probl\u00e8me d\u00e9tect\u00e9","%s \u00e9l\u00e9ments sans probl\u00e8me d\u00e9tect\u00e9s"],"%s recommended improvement":["%s am\u00e9lioration recommand\u00e9e","%s am\u00e9liorations recommand\u00e9es"],"Site information has been added to your clipboard.":["Les informations du site ont \u00e9t\u00e9 ajout\u00e9es \u00e0 votre presse-papier."],"All site health tests have finished running. Your site is looking good, and the results are now available on the page.":["Les v\u00e9rifications de sant\u00e9 sont termin\u00e9es. Votre site a bonne mine, et les r\u00e9sultats sont maintenant disponibles sur la page."],"All site health tests have finished running.":["Tous les tests de v\u00e9rification de sant\u00e9 du site sont termin\u00e9s."],"Please wait...":["Veuillez patienter..."]}},"comment":{"reference":"wp-admin\/js\/site-health.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-68f2cec7514bf8563c723a4d675fcfe6.json b/content/languages/fr_FR-68f2cec7514bf8563c723a4d675fcfe6.json new file mode 100644 index 0000000..d5ed391 --- /dev/null +++ b/content/languages/fr_FR-68f2cec7514bf8563c723a4d675fcfe6.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Inline Code":["Code en ligne"],"Inline image":["Image en ligne"],"Link edited.":["Lien modifi\u00e9."],"Link removed.":["Lien retir\u00e9."],"media":["m\u00e9dia"],"photo":["photo"],"Warning: the link has been inserted but may have errors. Please test it.":["Attention\u00a0: le lien a bien \u00e9t\u00e9 ins\u00e9r\u00e9 mais peut contenir des erreurs. Veuillez le tester."],"Link inserted.":["Lien ins\u00e9r\u00e9."],"Text Color":["Couleur du texte"],"Link":["Lien"],"Bold":["Gras"],"Italic":["Italique"],"Underline":["Souligner"],"Unlink":["Supprimer le lien"],"Strikethrough":["Barrer"],"Width":["Largeur"],"Apply":["Appliquer"]}},"comment":{"reference":"wp-includes\/js\/dist\/format-library.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-7f13c36c641b114bf18cd0bcc9ecc7e0.json b/content/languages/fr_FR-7f13c36c641b114bf18cd0bcc9ecc7e0.json new file mode 100644 index 0000000..0e717f3 --- /dev/null +++ b/content/languages/fr_FR-7f13c36c641b114bf18cd0bcc9ecc7e0.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Finish":["Termin\u00e9"],"Page %1$d of %2$d":["Page %1$d sur %2$d"],"Gradient: %s":["Gradient\u00a0: %s"],"Gradient code: %s":["Code de d\u00e9grad\u00e9\u00a0: %s"],"Radial Gradient":["D\u00e9grad\u00e9 radial"],"Linear Gradient":["D\u00e9grad\u00e9 lin\u00e9aire"],"Use your left or right arrow keys or drag and drop with the mouse to change the gradient position. Press the button to change the color or remove the control point.":["Utiliser les touches gauche ou droite ou glisser puis d\u00e9poser avec la souris pour modifier la position du d\u00e9grad\u00e9. Appuyer sur le bouton pour changer la couleur ou retirer le point de contr\u00f4le."],"Remove Control Point":["Retirer le point de contr\u00f4le"],"Guide controls":["Contr\u00f4leurs de guide"],"Preset size":["Taille pr\u00e9d\u00e9finie"],"Gradient control point at position %1$s with color code %2$s.":["Point de contr\u00f4le du d\u00e9grad\u00e9 \u00e0 la position %1$s avec le code couleur %2$s."],"Small":["Petit"],"Extra Large":["Tr\u00e8s grand"],"Angle":["Angle"],"Separate with commas, spaces, or the Enter key.":["S\u00e9parez avec une virgule, un espace, ou avec la touche entr\u00e9e."],"Separate with commas or the Enter key.":["S\u00e9parez avec une virgule ou avec la touche entr\u00e9e."],"Vertical pos.":["Position verticale"],"Horizontal pos.":["Position horizontale"],"Reset":["R\u00e9initialiser "],"Order by":["Ordonner par"],"Category":["Cat\u00e9gorie"],"Number of items":["Nombre d\u2019\u00e9l\u00e9ments"],"Item removed.":["\u00c9l\u00e9ment retir\u00e9."],"Item added.":["\u00c9l\u00e9ment ajout\u00e9."],"Z \u2192 A":["Z \t A"],"A \u2192 Z":["A \t Z"],"Oldest to newest":["Des plus anciens aux plus r\u00e9cents"],"Newest to oldest":["Des plus r\u00e9cents aux plus anciens"],"%1$s (%2$s of %3$s)":["%1$s (%2$s sur %3$s)"],"Remove item":["Retirer l\u2019\u00e9l\u00e9ment"],"Add item":["Ajouter un \u00e9l\u00e9ment"],"Dismiss this notice":["Ignorer cette notification"],"No results.":["Aucun r\u00e9sultat."],"%d result found, use up and down arrow keys to navigate.":["%d r\u00e9sultat trouv\u00e9, vous pouvez naviguer avec les touches haut et bas.","%d r\u00e9sultats trouv\u00e9s, vous pouvez naviguer avec les touches haut et bas."],"Custom color picker":["S\u00e9lecteur de couleur personnalis\u00e9e"],"Color: %s":["Couleur\u00a0: %s"],"Color code: %s":["Code couleur\u00a0: %s"],"(opens in a new tab)":["(ouvre un nouvel onglet)"],"Minutes":["Minutes"],"Go to the first (home) or last (end) day of a week.":["Aller au premier (accueil) ou dernier (fin) jour d\u2019une semaine."],"Home\/End":["Accueil\/fin"],"Home and End":["Accueil et fin"],"Click to Select":["Cliquez pour s\u00e9lectionner"],"Calendar Help":["Aide de calendrier"],"Click the desired day to select it.":["Cliquez sur le jour d\u00e9sir\u00e9 pour le s\u00e9lectionner."],"Navigating with a keyboard":["Navigation avec un clavier"],"Left and Right Arrows":["Fl\u00e8ches gauche et droite"],"Up and Down Arrows":["Fl\u00e8ches vers le haut et le bas"],"Change color format":["Modifier le format de couleur"],"Color value in HSL":["Valeur de couleur en HSL"],"Color value in RGB":["Valeur de couleur en RGB"],"Color value in hexadecimal":["Valeur de la couleur en hexad\u00e9cimal"],"PgUp\/PgDn":["PgUp\/PgDn"],"Page Up and Page Down":["Paginer vers le haut et vers le bas"],"Move backward (PgUp) or forward (PgDn) by one month.":["Revenir en arri\u00e8re (PgUp) ou avancer (PgDn) d\u2019un mois."],"Select the date in focus.":["S\u00e9lectionner la date courante."],"RGB mode active":["Mode RVB actif"],"Hex color mode active":["Mode couleur h\u00e9xad\u00e9cimale actif"],"Hue\/saturation\/lightness mode active":["Mode teinte\/saturation actif"],"Move the arrow left or right to change hue.":["D\u00e9placer les fl\u00e8ches vers la gauche ou la droite pour modifier la teinte."],"Hue value in degrees, from 0 to 359.":["Valeur de la teinte en chiffres de 0 \u00e0 359."],"Alpha value, from 0 (transparent) to 1 (fully opaque).":["Valeur alpha de 0 (transparent) \u00e0 1 (compl\u00e8tement opaque)."],"keyboard button\u0004Enter":["Entr\u00e9e"],"Move backward (up) or forward (down) by one week.":["D\u00e9placer vers l\u2019arri\u00e8re (haut) ou vers l\u2019avant (bas) d\u2019une semaine."],"Move backward (left) or forward (right) by one day.":["D\u00e9placer vers l\u2019arri\u00e8re (gauche) ou vers l\u2019avant (droite) d\u2019un jour."],"Click the right or left arrows to select other months in the past or the future.":["Cliquez sur les fl\u00e8ches de droite ou de gauche pour s\u00e9lectionner d\u2019autres mois dans le pass\u00e9 ou dans le futur."],"Choose a shade":["Choisissez une teinte"],"Use your arrow keys to change the base color. Move up to lighten the color, down to darken, left to decrease saturation, and right to increase saturation.":["Utilisez les touches fl\u00e9ch\u00e9es pour changer la couleur de base. Allez vers le haut pour \u00e9claircir la couleur, vers le bas pour l\u2019assombrir\u00a0; vers la gauche pour baisser la saturation, et vers la droite pour l\u2019augmenter."],"Time":["Heure"],"Day":["Jour"],"Month":["Mois"],"Date":["Date"],"Hours":["Horaires"],"Close dialog":["Fermez la boite de dialogue"],"Previous":["Pr\u00e9c\u00e9dent"],"Custom color":["Couleur personnalis\u00e9e"],"Year":["Ann\u00e9e"],"Custom Size":["Taille personnalis\u00e9e"],"Large":["Grande"],"Drop files to upload":["D\u00e9posez vos fichiers pour les t\u00e9l\u00e9verser"],"Clear":["Effacer"],"Custom":["Lien"],"January":["janvier"],"February":["f\u00e9vrier"],"March":["mars"],"April":["avril"],"May":["mai"],"June":["juin"],"July":["juillet"],"August":["ao\u00fbt"],"September":["septembre"],"October":["octobre"],"November":["novembre"],"December":["d\u00e9cembre"],"Type":["Type"],"AM":[" "],"PM":[" "],"Next":["Suivant"],"Font size":["Taille de police"],"Default":["Valeur par d\u00e9faut"],"All":["Tous"],"None":["Aucun"],"Medium":["Moyenne"],"Close":["Fermer"]}},"comment":{"reference":"wp-includes\/js\/dist\/components.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-803bf1ce2131e13efc590c1bc47851fc.json b/content/languages/fr_FR-803bf1ce2131e13efc590c1bc47851fc.json new file mode 100644 index 0000000..ff92af9 --- /dev/null +++ b/content/languages/fr_FR-803bf1ce2131e13efc590c1bc47851fc.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Block %1$s is at the beginning of the content and can\u2019t be moved left":["Le bloc %1$s est au d\u00e9but du contenu et ne peut \u00eatre d\u00e9plac\u00e9 \u00e0 gauche"],"Block %1$s is at the beginning of the content and can\u2019t be moved up":["Le bloc %1$s est au d\u00e9but du contenu et ne peut pas \u00eatre d\u00e9plac\u00e9 plus haut"],"Block %1$s is at the end of the content and can\u2019t be moved left":["Le bloc %1$s est \u00e0 la fin du contenu et ne peut pas \u00eatre d\u00e9plac\u00e9 \u00e0 gauche"],"Block %1$s is at the end of the content and can\u2019t be moved down":["Le bloc %1$s est \u00e0 la fin du contenu et ne peut pas \u00eatre d\u00e9plac\u00e9 plus bas"],"Remove multiple selected blocks.":["Retirer les blocs s\u00e9lectionn\u00e9s."],"Move %1$s block from position %2$d left to position %3$d":["D\u00e9placer le bloc %1$s de la position %2$d \u00e0 gauche \u00e0 la position %3$d"],"Move %1$s block from position %2$d right to position %3$d":["D\u00e9placer le bloc %1$s de la position %2$d \u00e0 droite \u00e0 la position %3$d"],"Tools offer different interactions for block selection & editing. To select, press Escape, to go back to editing, press Enter.":["Les outils offrent diff\u00e9rentes interactions pour la s\u00e9lection et la modification. Pour s\u00e9lectionner, appuyez sur la touche Echap. Pour revenir \u00e0 la modification, appuyez sur la touche Entr\u00e9e."],"Large screens":["\u00c9crans larges"],"Medium screens":["\u00c9crans moyens"],"Small screens":["Petits \u00e9crans"],"Toggle between using the same value for all screen sizes or using a unique value per screen size.":["Permuter entre l\u2019utilisation de la m\u00eame valeur pour toutes les tailles d\u2019\u00e9crans ou l\u2019utilisation d\u2019une valeur unique pour chaque taille."],"Text labelling a interface as controlling a given layout property (eg: margin) for a given screen size.\u0004Controls the %1$s property for %2$s viewports.":["Contr\u00f4ler la propri\u00e9t\u00e9 %1$s pour les surfaces de fen\u00eatre %2$s."],"Use the same %s on all screensizes.":["Utiliser le m\u00eame %s pour toutes les tailles d\u2019\u00e9crans."],"Open Media Library":["Ouvrir la biblioth\u00e8que de m\u00e9dias"],"Recently updated":["R\u00e9cemment mis \u00e0 jour"],"Press ENTER to add this link":["Appuyer sur ENTR\u00c9E pour ajouter ce lien"],"The media file has been replaced":["Le fichier m\u00e9dia a \u00e9t\u00e9 remplac\u00e9."],"Currently selected":["Actuellement s\u00e9lectionn\u00e9"],"Search or type url":["Rechercher ou saisir une URL"],"Currently selected link settings":["R\u00e9glages du lien actuellement s\u00e9lectionn\u00e9"],"Image size":["Taille de l\u2019image"],"Gradient Presets":["Pr\u00e9r\u00e9glages de d\u00e9grad\u00e9"],"Editor footer":["\u00c9diteur de pied de page"],"Generic label for block inserter button\u0004Add block":["Ajouter un bloc"],"directly add the only allowed block\u0004Add %s":["Ajouter %s"],"%s block added":["Bloc %s ajout\u00e9"],"Choose variation":["Choisir une variante"],"Select a variation to start with.":["S\u00e9lectionner une variante avec laquelle commencer."],"Multiple selected blocks":["Multiples blocs s\u00e9lectionn\u00e9s"],"You are currently in edit mode. To return to the navigation mode, press Escape.":["Vous \u00eates actuellement en mode modification. Pour revenir au mode navigation, appuyez sur la touche Echap."],"Midnight":["Minuit"],"Pale ocean":["Oc\u00e9an p\u00e2le"],"Electric grass":["Herbe \u00e9lectrique"],"Luminous dusk":["Cr\u00e9puscule lumineux"],"Blush bordeaux":["Bordeaux rougissant"],"You are currently in navigation mode. Navigate blocks using the Tab key. To exit navigation mode and edit the selected block, press Enter.":["Vous \u00eates actuellement en mode navigation. Vous pouvez naviguer entre les blocs \u00e0 l\u2019aide de la touche Tabulation. Pour sortir du mode navigation et modifier le bloc s\u00e9lectionn\u00e9, appuyez sur Entr\u00e9e."],"Blush light purple":["Violet clair rougissant"],"Cool to warm spectrum":["Spectre froid vers chaud"],"Very light gray to cyan bluish gray":["Gris tr\u00e8s clair vers gris-cyan bleuissant"],"Luminous vivid orange to vivid red":["Orange vif lumineux vers rouge lumineux"],"Luminous vivid amber to luminous vivid orange":["Ambre vif lumineux vers orange vif"],"Light green cyan to vivid green cyan":["Vert-cyan clair vers vert-cyan vif"],"Vivid cyan blue to vivid purple":["Bleu-cyan vif vers violet vif"],"Block breadcrumb":["Ascendance du bloc"],"(%s: gradient %s)":["(%s\u00a0: d\u00e9grad\u00e9 %s)"],"(%s: color %s)":["(%s\u00a0: couleur %s)"],"Gradient":["D\u00e9grad\u00e9"],"Solid":["Pleine"],"(Gradient: %s)":["(D\u00e9grad\u00e9\u00a0: %s)"],"(Color: %s)":["(Couleur\u00a0: %s)"],"No Preview Available.":["Aucun aper\u00e7u disponible."],"Block navigation":["Bloc navigation"],"Move left":["D\u00e9placer \u00e0 gauche"],"Move right":["D\u00e9placer \u00e0 droite"],"Open in new tab":["Ouvrir dans un nouvel onglet"],"Separate multiple classes with spaces.":["Dans le cas de plusieurs classes, s\u00e9parez-les avec des espaces."],"Enter a word or two \u2014 without spaces \u2014 to make a unique web address just for this heading, called an \u201canchor.\u201d Then, you\u2019ll be able to link directly to this section of your page.":["Saisir un mot ou deux sans utiliser d\u2019espaces pour cr\u00e9er une adresse web unique \u2013\u00a0une ancre\u00a0\u2013 pour ce titre. Ensuite, vous pourrez cr\u00e9er des liens directement vers cette section de votre page."],"Learn more about anchors":["En savoir plus sur les ancres"],"Default Style":["Style\u00a0par d\u00e9faut"],"Upload an image file, pick one from your media library, or add one with a URL.":["T\u00e9l\u00e9versez un fichier image, choisissez-en un dans votre biblioth\u00e8que de m\u00e9dias ou ajoutez-en un avec une URL."],"Upload a video file, pick one from your media library, or add one with a URL.":["T\u00e9l\u00e9versez un fichier vid\u00e9o, choisissez-en un dans votre biblioth\u00e8que de m\u00e9dias ou ajoutez-en un avec une URL."],"Add a block":["Ajouter un bloc"],"This color combination may be hard for people to read.":["Cette combinaison de couleurs risque d\u2019\u00eatre difficile \u00e0 lire."],"Skip":["Passer"],"Upload a media file or pick one from your media library.":["T\u00e9l\u00e9versez un fichier m\u00e9dia ou choisissez-en un dans votre biblioth\u00e8que de m\u00e9dias."],"Upload an audio file, pick one from your media library, or add one with a URL.":["T\u00e9l\u00e9versez un fichier son, choisissez-en un dans votre biblioth\u00e8que de m\u00e9dias ou ajoutez-en un avec une URL."],"Browse through the library to learn more about what each block does.":["Parcourez la biblioth\u00e8que pour en savoir plus sur ce que fait chaque bloc."],"While writing, you can press \/<\/kbd> to quickly insert new blocks.":["Tandis que vous \u00e9crivez, vous pouvez utiliser la touche \/<\/kbd> pour ins\u00e9rer de nouveaux blocs."],"There are blocks available for all kinds of content: insert text, headings, images, lists, videos, tables, and lots more.":["Il existe des blocs pour toutes sortes de contenus\u00a0: ins\u00e9rer du texte, des titres, des images, des listes, des vid\u00e9os, des tableaux, et bien plus encore."],"Block vertical alignment setting\u0004Vertically Align Top":["Aligner verticalement en haut"],"Block vertical alignment setting\u0004Vertically Align Middle":["Aligner verticalement au milieu"],"Block vertical alignment setting\u0004Vertically Align Bottom":["Aligner verticalement en bas"],"Block vertical alignment setting label\u0004Change vertical alignment":["Modifier l\u2019alignement vertical"],"Vivid purple":["Violet \u00e9clatant"],"Content blocks":["Blocs\u00a0de\u00a0contenu"],"Welcome to the wonderful world of blocks! Blocks are the basis of all content within the editor.":["Bienvenue dans le monde merveilleux des blocs\u00a0! Les blocs sont la base de tous les contenus au sein de l\u2019\u00e9diteur."],"Change block type or style":["Changer le style ou le type du bloc"],"block style\u0004Default":["Par d\u00e9faut"],"More rich text controls":["Plus de contr\u00f4les de texte enrichis"],"Attempt Block Recovery":["Tentative de r\u00e9cup\u00e9ration du bloc"],"%d word":["%d mot","%d mots"],"Block tools":["Outils de bloc"],"(selected block)":["(bloc s\u00e9lectionn\u00e9)"],"To edit this block, you need permission to upload media.":["Pour modifier ce bloc vous devez avoir les droits de t\u00e9l\u00e9verser des m\u00e9dias."],"Align text right":["Aligner le texte \u00e0 droite"],"Align text center":["Centrer le texte"],"Align text left":["Aligner le texte \u00e0 gauche"],"Block icon":["Ic\u00f4ne du bloc"],"%s block selected.":["%s bloc s\u00e9lectionn\u00e9.","%s blocs s\u00e9lectionn\u00e9s."],"Start writing or type \/ to choose a block":["Commencez \u00e0 \u00e9crire ou saisissez \u00ab\u00a0\/\u00a0\u00bb pour choisir un bloc"],"Image dimensions":["Dimensions de l\u2019image"],"Color settings":["R\u00e9glages de couleur"],"Document":["Document"],"Editor content":["Contenu de l\u2019\u00e9diteur"],"Editor settings":["R\u00e9glages de l\u2019\u00e9diteur"],"Editor publish":["Publication depuis l\u2019\u00e9diteur"],"Navigate to the nearest toolbar.":["Naviguer vers la barre d\u2019outils la plus proche."],"%d block":["%d bloc","%d blocs"],"Remove the selected block(s).":["Retirer le (ou les) bloc(s) s\u00e9lectionn\u00e9(s)."],"Insert a new block after the selected block(s).":["Ins\u00e9rer un nouveau bloc apr\u00e8s le (ou les) bloc(s) s\u00e9lectionn\u00e9(s)."],"Insert a new block before the selected block(s).":["Ins\u00e9rer un nouveau bloc avant le (ou les) bloc(s) s\u00e9lectionn\u00e9(s)."],"Duplicate the selected block(s).":["Dupliquer le (ou les) bloc(s) s\u00e9lectionn\u00e9(s)."],"Select all text when typing. Press again to select all blocks.":["S\u00e9lectionner tout le texte lors de la saisie. R\u00e9appuyez pour s\u00e9lectionner tous les blocs."],"Editor top bar":["Barre d\u2019outils de l\u2019\u00e9diteur"],"HTML anchor":["Ancre HTML"],"Link settings":["R\u00e9glages de lien"],"Very light gray":["Gris tr\u00e8s clair"],"Vivid cyan blue":["Bleu cyan vif"],"Pale cyan blue":["Bleu cyan p\u00e2le"],"Light green cyan":["Vert clair cyan"],"Vivid green cyan":["Cyan vert vif"],"Luminous vivid amber":["Ambre lumineux et vif"],"Luminous vivid orange":["Orange vif lumineux"],"Vivid red":["Rouge vif"],"Pale pink":["Rose p\u00e2le"],"Cyan bluish gray":["Gris bleut\u00e9 cyan"],"font size name\u0004Huge":["\u00c9norme"],"font size name\u0004Large":["Grand"],"font size name\u0004Medium":["Moyen"],"font size name\u0004Small":["Petit"],"Additional CSS class(es)":["Classe(s) CSS additionnelle(s)"],"Skip to the selected block":["Aller au bloc s\u00e9lectionn\u00e9."],"More options":["Plus d\u2019options"],"Edit visually":["Modifier visuellement"],"Duplicate":["Dupliquer"],"Edit as HTML":["Modifier en HTML"],"Search for a block":["Rechercher un bloc"],"This color combination may be hard for people to read. Try using a darker background color and\/or a brighter text color.":["Cette combinaison de couleurs est difficilement lisible. Essayez d\u2019utiliser une couleur d\u2019arri\u00e8re-plan et\/ou de texte plus sombre."],"Block Styles":["Styles de bloc"],"Available block types":["Types de bloc disponibles"],"Transform To:":["Transformer en\u00a0:"],"Blocks cannot be moved down as they are already at the bottom":["Les blocs ne peuvent pas \u00eatre d\u00e9plac\u00e9s vers le bas car ils sont d\u00e9j\u00e0 tout en bas."],"Blocks cannot be moved up as they are already at the top":["Les blocs ne peuvent pas \u00eatre d\u00e9plac\u00e9s vers le haut car ils sont d\u00e9j\u00e0 tout en haut."],"Insert After":["Ins\u00e9rer apr\u00e8s"],"Insert Before":["Ins\u00e9rer avant"],"Reusable":["R\u00e9utilisables"],"Manage all reusable blocks":["G\u00e9rer tous les blocs r\u00e9utilisables"],"Change type of %d block":["Modifier le type de %d bloc","Modifier le type de %d blocs"],"%d result found.":["%d r\u00e9sultat trouv\u00e9.","%d r\u00e9sultats trouv\u00e9s."],"blocks\u0004Most used":["Les plus utilis\u00e9s"],"Paste or type URL":["Collez ou saisissez une URL"],"This color combination may be hard for people to read. Try using a brighter background color and\/or a darker text color.":["Cette combinaison de couleurs peut \u00eatre difficile a lire pour certaines personnes. Essayez d\u2019utiliser une couleur d\u2019arri\u00e8re-plan plus claire et\/ou une couleur de texte plus fonc\u00e9e."],"Block %1$s is at the beginning of the content and can\u2019t be moved right":["Le bloc \u00ab\u00a0%1$s\u00a0\u00bb est au d\u00e9but du contenu et ne peut \u00eatre d\u00e9plac\u00e9 plus haut"],"Remove Block":["Retirer le bloc","Retirer les blocs"],"Move %1$d block from position %2$d down by one place":["D\u00e9placer %1$d bloc d\u2019une place en dessous de %2$d","D\u00e9placer %1$d blocs d\u2019une place en dessous de %2$d"],"Move %1$d block from position %2$d up by one place":["D\u00e9placer %1$d bloc d\u2019une place en dessus de %2$d","D\u00e9placer %1$d blocs d\u2019une place en dessus de %2$d"],"Move %1$s block from position %2$d up to position %3$d":["D\u00e9placer le bloc %1$s de la position %2$d vers la position %3$d"],"Block %1$s is at the end of the content and can\u2019t be moved right":["Le bloc \u00ab\u00a0%1$s\u00a0\u00bb est \u00e0 la fin du contenu et ne peut pas \u00eatre d\u00e9plac\u00e9 vers le bas"],"Add block":["Ajouter un bloc"],"Convert to Blocks":["Convertir en blocs"],"This block has encountered an error and cannot be previewed.":["Ce bloc a rencontr\u00e9 une erreur et ne peut pas \u00eatre pr\u00e9visualis\u00e9."],"No block selected.":["Aucun bloc s\u00e9lectionn\u00e9."],"Reset":["R\u00e9initialiser "],"Block: %s":["Bloc\u00a0: %s"],"Full width":["Pleine largeur"],"Block %s is the only block, and cannot be moved":["Le bloc \u00ab\u00a0%s\u00a0\u00bb est le seul bloc et ne peut pas \u00eatre d\u00e9plac\u00e9"],"Move %1$s block from position %2$d down to position %3$d":["D\u00e9placer le bloc %1$s de la position %2$d vers la position %3$d"],"Convert to Classic Block":["Convertir en bloc Classique"],"After Conversion":["Apr\u00e8s conversion"],"Current":["Actuel"],"Change alignment":["Modifier l\u2019alignement"],"Change text alignment":["Modifier l\u2019alignement du texte"],"Wide width":["Grande largeur"],"Convert to HTML":["Convertir en HTML"],"This block contains unexpected or invalid content.":["Ce bloc contient du contenu non valide ou inattendu."],"Resolve Block":["R\u00e9soudre les probl\u00e8mes de ce bloc"],"font size name\u0004Normal":["Normal"],"imperative verb\u0004Resolve":["R\u00e9soudre"],"No blocks found.":["Aucun bloc trouv\u00e9."],"No results.":["Aucun r\u00e9sultat."],"%d result found, use up and down arrow keys to navigate.":["%d r\u00e9sultat trouv\u00e9, vous pouvez naviguer avec les touches haut et bas.","%d r\u00e9sultats trouv\u00e9s, vous pouvez naviguer avec les touches haut et bas."],"Image Size":["Taille de l\u2019image"],"Link selected.":["Lien s\u00e9lectionn\u00e9."],"Paste URL or type to search":["Collez l\u2019URL ou saisissez une recherche"],"Link CSS Class":["Classe CSS du lien"],"Align right":["Aligner \u00e0 droite"],"Align left":["Aligner \u00e0 gauche"],"Replace":["Remplacer"],"Move down":["Descendre"],"Move up":["Monter"],"Align center":["Centrer"],"Tools":["Outils"],"Not set":["Non d\u00e9fini"],"Insert from URL":["Ins\u00e9rer \u00e0 partir d\u2019une adresse web"],"Video":["Vid\u00e9o"],"Audio":["Son"],"Large":["Grande"],"Media Library":["Biblioth\u00e8que de m\u00e9dias"],"Media File":["Fichier m\u00e9dia"],"Attachment Page":["Page du fichier joint"],"Clear selection.":["Effacer la s\u00e9lection."],"Text Color":["Couleur du texte"],"Background Color":["Couleur d\u2019arri\u00e8re-plan"],"Upload":["T\u00e9l\u00e9verser"],"Styles":["Styles"],"Very dark gray":["Gris fonc\u00e9"],"Insert link":["Ins\u00e9rer un lien"],"Image":["Image"],"Remove link":["Retirer le lien"],"Link Rel":["Attribut \u00ab\u00a0Rel\u00a0\u00bb du lien"],"Width":["Largeur"],"Edit link":["Modifier le lien"],"Height":["Hauteur"],"All":["Tous"],"Search results for %s":["R\u00e9sultats de recherche pour \u00ab\u00a0%s\u00a0\u00bb"],"URL":["Adresse web"],"Edit":["Modifier"],"Apply":["Appliquer"],"Advanced":["Avanc\u00e9"],"Submit":["Envoyer"],"Cancel":["Annuler"],"Thumbnail":["Miniature"],"Medium":["Moyenne"],"Full Size":["Taille originale"],"Media":["M\u00e9dias"],"Close":["Fermer"],"Select":["S\u00e9lectionner"],"Preview":["Pr\u00e9visualiser"]}},"comment":{"reference":"wp-includes\/js\/dist\/block-editor.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-81c889563f09dd13de1701135dc62941.json b/content/languages/fr_FR-81c889563f09dd13de1701135dc62941.json new file mode 100644 index 0000000..ab86732 --- /dev/null +++ b/content/languages/fr_FR-81c889563f09dd13de1701135dc62941.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"%s item selected":["%s \u00e9l\u00e9ment s\u00e9lectionn\u00e9","%s \u00e9l\u00e9ments s\u00e9lectionn\u00e9s"]}},"comment":{"reference":"wp-includes\/js\/media-views.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-8860e58c20c6a2ab5876a0f07be43bd9.json b/content/languages/fr_FR-8860e58c20c6a2ab5876a0f07be43bd9.json new file mode 100644 index 0000000..9c596d7 --- /dev/null +++ b/content/languages/fr_FR-8860e58c20c6a2ab5876a0f07be43bd9.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Open block settings":["Ouvrir les r\u00e9glages du bloc"],"Open document settings":["Ouvrir les r\u00e9glages du document"],"Here's a detailed guide.":["Voici un guide d\u00e9taill\u00e9."],"New to the Block Editor? Want to learn more about using it? ":["Vous d\u00e9couvrez l\u2019\u00e9diteur de blocs\u00a0? Vous souhaitez en savoir plus sur son utilisation\u00a0?"],"Learn how to use the Block Editor":["Apprenez \u00e0 utiliser l\u2019\u00e9diteur de blocs"],"All of the blocks available to you live in the Block Library. You\u2019ll find it wherever you see the icon.":["Tous les blocs disponibles se trouvent dans la biblioth\u00e8que de blocs. Vous la retrouverez partout o\u00f9 vous verrez l\u2019ic\u00f4ne ."],"Get to know the Block Library":["D\u00e9couvrir la biblioth\u00e8que de blocs"],"Each block comes with its own set of controls for changing things like color, width, and alignment. These will show and hide automatically when you have a block selected.":["Chaque bloc vient avec ses propres options pour modifier des param\u00e8tres tels que la couleur, la taille ou encore l\u2019alignement. Elles s\u2019affichent et se masquent automatiquement lorsque le bloc est s\u00e9lectionn\u00e9 ou d\u00e9s\u00e9lectionn\u00e9."],"Make each block your own":["Appropriez-vous chaque bloc"],"In the WordPress editor, each paragraph, image, or video is presented as a distinct \u201cblock\u201d of content.":["Dans l\u2019\u00e9diteur de WordPress, chaque paragraphe, image ou vid\u00e9o est pr\u00e9sent\u00e9 avec un \u00ab\u00a0bloc\u00a0\u00bb de contenu distinct."],"View post":["Voir la publication"],"Welcome to the Block Editor":["Bienvenue dans l\u2019\u00e9diteur"],"Get started":["Commencer"],"inserter":["outil d\u2019insertion"],"Page attributes":["Attributs de page"],"https:\/\/wordpress.org\/support\/article\/wordpress-editor\/":["https:\/\/wordpress.org\/support\/article\/wordpress-editor\/"],"Welcome Guide":["Guide de bienvenue"],"Keyboard shortcuts":["Raccourcis clavier"],"All content copied.":["Tout le contenu a \u00e9t\u00e9 copi\u00e9."],"Disable & Reload":["D\u00e9sactiver et recharger"],"More tools & options":["Davantage d\u2019outils et options"],"Display these keyboard shortcuts.":["Afficher ces raccourcis clavier."],"A page reload is required for this change. Make sure your content is saved before reloading.":["Un rechargement de page est n\u00e9cessaire pour cette modification. Assurez-vous que votre contenu est enregistr\u00e9 avant de recharger."],"Enable & Reload":["Activer et recharger"],"Pre-publish checks":["V\u00e9rifications de pr\u00e9-publication"],"%1$d block is disabled.":["%1$d bloc est d\u00e9sactiv\u00e9.","%1$d blocs sont d\u00e9sactiv\u00e9s."],"Inserter help panel":["Panneau d\u2019aide de l\u2019outil d\u2019insertion"],"Read about permalinks":["Lire \u00e0 propos des permaliens"],"The last part of the URL.":["La derni\u00e8re partie de l\u2019URL."],"URL Slug":["Slug d\u2019URL"],"Fullscreen mode deactivated":["Mode en plein \u00e9cran d\u00e9sactiv\u00e9"],"Fullscreen mode activated":["Mode en plein \u00e9cran activ\u00e9"],"Top toolbar deactivated":["Barre d\u2019outils haute d\u00e9sactiv\u00e9e"],"Top toolbar activated":["Barre d\u2019outils haute activ\u00e9e"],"Feature activated":["Fonctionnalit\u00e9 activ\u00e9e"],"Feature deactivated":["Fonctionnalit\u00e9 d\u00e9sactiv\u00e9e"],"Block Manager":["Gestionnaire de bloc"],"Spotlight mode deactivated":["Mode mise en avant d\u00e9sactiv\u00e9"],"Spotlight mode activated":["Mode mise en avant activ\u00e9"],"Block (selected)":["Bloc (s\u00e9lectionn\u00e9)"],"Document (selected)":["Document (s\u00e9lectionn\u00e9)"],"Top toolbar":["Barre d\u2019outils sup\u00e9rieure"],"Permalink":["Permalien"],"Custom fields":["Champs personnalis\u00e9s"],"Visibility":["Visibilit\u00e9"],"Status & visibility":["\u00c9tat et visibilit\u00e9"],"Document":["Document"],"Find original":["Trouver l\u2019original"],"Transform into:":["Transformer en\u00a0:"],"Copy all content":["Copier tout le contenu"],"Close settings":["Fermer les r\u00e9glages"],"Code editor selected":["\u00c9diteur de code s\u00e9lectionn\u00e9"],"Visual editor selected":["\u00c9diteur visuel s\u00e9lectionn\u00e9"],"Show Block Settings":["Afficher les r\u00e9glages du bloc"],"Hide Block Settings":["Masquer les r\u00e9glages du bloc"],"Block settings closed":["R\u00e9glages du bloc ferm\u00e9s"],"Close plugin":["Fermer l\u2019extension"],"Pin to toolbar":["\u00c9pingler \u00e0 la barre d\u2019outils"],"Unpin from toolbar":["D\u00e9crocher de la barre d\u2019outils"],"Open publish panel":["Ouvrir le panneau de publication"],"Block shortcuts":["Raccourcis pour les blocs"],"Selection shortcuts":["Raccourcis de s\u00e9lection"],"Navigate to the previous part of the editor.":["Naviguer vers la partie pr\u00e9c\u00e9dente de l\u2019\u00e9diteur."],"Navigate to the next part of the editor.":["Naviguer vers la partie suivante de l\u2019\u00e9diteur."],"Show or hide the settings sidebar.":["Afficher ou masquer la colonne lat\u00e9rale de r\u00e9glages."],"Remove a link.":["Retirer un lien."],"Convert the selected text into a link.":["Convertir le texte s\u00e9lectionn\u00e9 en lien."],"Underline the selected text.":["Souligner le texte s\u00e9lectionn\u00e9."],"Make the selected text italic.":["Passer le texte s\u00e9lectionn\u00e9 en italique."],"Make the selected text bold.":["Passer le texte s\u00e9lectionn\u00e9 en gras."],"Text formatting":["Mise en forme du texte"],"Change the block type after adding a new paragraph.":["Modifier le type de block apr\u00e8s l\u2019ajout d\u2019un nouveau paragraphe."],"Forward-slash":["Barre oblique (slash)"],"This block can only be used once.":["Ce bloc ne peut \u00eatre utilis\u00e9 qu\u2019une fois."],"Exit Code Editor":["Sortir de l\u2019\u00e9diteur de code"],"Editing Code":["\u00c9dition de code"],"Advanced panels":["Panneaux avanc\u00e9s"],"Document panels":["Panneaux de documentation"],"Open the block navigation menu.":["Ouvrir le menu de navigation de bloc."],"Additional settings are now available in the Editor block settings sidebar":["Des r\u00e9glages suppl\u00e9mentaires sont maintenant disponibles dans l\u2019onglet \u00ab\u00a0Bloc\u00a0\u00bb de la colonne lat\u00e9rale des r\u00e9glages"],"Switch between Visual editor and Code editor.":["Basculer de l\u2019\u00e9diteur visuel \u00e0 l\u2019\u00e9diteur de code."],"Discussion":["Commentaires"],"Editor":["\u00c9diteur"],"Visual editor":["\u00c9diteur visuel"],"Code editor":["\u00c9diteur de code"],"Global shortcuts":["Raccourcis g\u00e9n\u00e9raux"],"Fullscreen mode":["Mode plein \u00e9cran"],"noun\u0004View":["Vue"],"Options":["Options"],"Spotlight mode":["Mode \u00ab\u00a0mise en lumi\u00e8re\u00a0\u00bb"],"Work without distraction":["Travaillez sans distraction"],"Focus on one block at a time":["Concentrez-vous sur un bloc \u00e0 la fois"],"Access all block and document tools in a single place":["Acc\u00e9dez \u00e0 tous les outils de blocs et de document \u00e0 partir d\u2019un endroit unique"],"Document tools":["Outils du document"],"Document and block tools":["Outils du document et des blocs"],"Copied!":["Copi\u00e9\u00a0!"],"Search for a block":["Rechercher un bloc"],"Available block types":["Types de bloc disponibles"],"Manage all reusable blocks":["G\u00e9rer tous les blocs r\u00e9utilisables"],"No blocks found.":["Aucun bloc trouv\u00e9."],"Back":["Retour"],"Block":["Bloc","%d Blocs"],"Tools":["Outils"],"Remove":["Retirer"],"Featured image":["Image mise en avant"],"General":["G\u00e9n\u00e9ral"],"Help":["Aide"],"Settings":["R\u00e9glages"],"Publish":["Publier"],"Excerpt":["Extrait"],"Plugins":["Extensions"],"Close":["Fermer"],"(no title)":["(pas de titre)"]}},"comment":{"reference":"wp-includes\/js\/dist\/edit-post.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-947c76bb5095da30e16668eec15406b2.json b/content/languages/fr_FR-947c76bb5095da30e16668eec15406b2.json new file mode 100644 index 0000000..0d0038c --- /dev/null +++ b/content/languages/fr_FR-947c76bb5095da30e16668eec15406b2.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"%s block icon":["Ic\u00f4ne du bloc %s"],"No blocks found in your library. These blocks can be downloaded and installed:":["Aucun bloc trouv\u00e9 dans la biblioth\u00e8que. Ces blocs peuvent \u00eatre t\u00e9l\u00e9charg\u00e9s et install\u00e9s :"],"Retry":["Recommencez"],"No blocks found in your library.":["Aucun bloc trouv\u00e9 dans votre biblioth\u00e8que."],"Block previews can't install.":["Les aper\u00e7us de bloc ne peuvent pas \u00eatre install\u00e9s."],"Block previews can\u2019t load.":["Les aper\u00e7us de blocs ne peuvent pas se charger."],"Please contact your site administrator to install new blocks.":["Veuillez contacter votre administrateur ou votre administratrice pour installer de nouveaux blocs."],"No blocks found in your library. We did find %d block available for download.":["Aucun bloc trouv\u00e9 dans la biblioth\u00e8que. Nous avons trouv\u00e9 %d bloc disponible en t\u00e9l\u00e9chargement.","Aucun bloc trouv\u00e9 dans la biblioth\u00e8que. Nous avons trouv\u00e9 %d blocs disponibles en t\u00e9l\u00e9chargement."],"No blocks found in your library. Please contact your site administrator to install new blocks.":["Aucun bloc trouv\u00e9 dans votre biblioth\u00e8que. Veuillez contacter l'administrateur de votre site afin d'installer de nouveaux blocs."],"Authored by %s":["\u00c9crit par %s"],"%d active installation":["%d installation active","%d installations actives"],"%d total rating":["%d \u00e9valuation au total","%d \u00e9valuations au total"],"%s out of 5 stars":["%s sur 5 \u00e9toiles"],"This author has %d block, with an average rating of %d.":["Cet auteur poss\u00e8de %d bloc, avec une \u00e9valuation moyenne de %d.","Cet auteur poss\u00e8de %d blocs, avec une \u00e9valuation moyenne de %d."],"Add block":["Ajouter un bloc"],"Remove":["Retirer"],"Updated %s":["%s mis \u00e0 jour"]}},"comment":{"reference":"wp-includes\/js\/dist\/block-directory.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-a25d1cc7bf7ca0b4e114f6bea64943f4.json b/content/languages/fr_FR-a25d1cc7bf7ca0b4e114f6bea64943f4.json new file mode 100644 index 0000000..a03d687 --- /dev/null +++ b/content/languages/fr_FR-a25d1cc7bf7ca0b4e114f6bea64943f4.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Period":["P\u00e9riode"],"Comma":["Virgule"],"Backtick":["Retour arri\u00e8re"]}},"comment":{"reference":"wp-includes\/js\/dist\/keycodes.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-bf0f094965d3d4a95b47babcb35fc136.json b/content/languages/fr_FR-bf0f094965d3d4a95b47babcb35fc136.json new file mode 100644 index 0000000..8fb7c4c --- /dev/null +++ b/content/languages/fr_FR-bf0f094965d3d4a95b47babcb35fc136.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Word count type. Do not translate!\u0004words":["words"],"Slug":["Slug"],"Update\u2026":["Mise \u00e0 jour\u2026"],"Submit for Review\u2026":["Envoyer pour relecture\u2026"],"Pending review":["En attente de relecture"],"https:\/\/wordpress.org\/support\/article\/excerpt\/":["https:\/\/wordpress.org\/support\/article\/excerpt\/"],"Select items to save.":["S\u00e9lectionner des \u00e9l\u00e9ments \u00e0 enregistrer."],"What do you want to save?":["Que voulez-vous enregistrer\u00a0?"],"verb\u0004Group":["Grouper"],"Ungrouping blocks from within a Group block back into individual blocks within the Editor \u0004Ungroup":["D\u00e9grouper"],"Restore the backup":["Restaurer\u00a0la\u00a0sauvegarde"],"The backup of this post in your browser is different from the version below.":["La sauvegarde de cet article dans votre navigateur est diff\u00e9rente de la version ci-dessous."],"Move to Trash":["Mettre \u00e0 la corbeille"],"Search Terms":["Rechercher des termes"],"Stick to the top of the blog":["\u00c9pingler en haut du blog"],"Exit the Editor":["Sortir de l\u2019\u00e9diteur"],"To edit the featured image, you need permission to upload media.":["Pour modifier l\u2019image mise en avant vous devez avoir les droits de t\u00e9l\u00e9verser des m\u00e9dias."],"Type text or HTML":["\u00c9crivez du texte ou du HTML"],"Start writing with text or HTML":["Commencez \u00e0 \u00e9crire du texte ou du HTML"],"Scheduled":["Planifi\u00e9"],"Undo your last changes.":["Annuler vos derni\u00e8res modifications."],"Save your changes.":["Enregistrer vos modifications."],"Redo your last undo.":["R\u00e9tablir la derni\u00e8re action."],"Block deleted.":["Bloc supprim\u00e9."],"Block created.":["Bloc cr\u00e9\u00e9."],"Trashing failed":["Suppression \u00e9chou\u00e9e"],"Reset the template":["R\u00e9initialiser le mod\u00e8le"],"Keep it as is":["Laisser tel quel"],"Untitled Reusable Block":["Bloc r\u00e9utilisable sans titre"],"You have unsaved changes. If you proceed, they will be lost.":["Vous avez des changements non enregistr\u00e9s. Si vous poursuivez, ils seront perdus."],"The content of your post doesn\u2019t match the template assigned to your post type.":["Le contenu de votre publication ne correspond pas au mod\u00e8le assign\u00e9 \u00e0 votre type de publications."],"Publishing failed.":["Publication \u00e9chou\u00e9e."],"Scheduling failed.":["Planification \u00e9chou\u00e9e."],"Updating failed.":["Mise \u00e0 jour \u00e9chou\u00e9e."],"Document Outline":["Aper\u00e7u du document"],"Paragraphs":["Paragraphes"],"Headings":["Titres"],"Content structure":["Structure du contenu"],"Visible to everyone.":["Visible pour tout le monde."],"term\u0004%s removed":["%s supprim\u00e9"],"term\u0004%s added":["%s ajout\u00e9"],"Create password":["Cr\u00e9er un mot de passe"],"Parent Term":["Terme parent"],"Add new term":["Ajouter un nouveau terme"],"Add new category":["Ajouter une nouvelle cat\u00e9gorie"],"Term":["Terme"],"Tag":["\u00c9tiquette"],"Add new Term":["Ajouter un nouveau terme"],"Immediately":["Imm\u00e9diatement"],"Saving":["Enregistrement"],"Only visible to site admins and editors.":["Uniquement visible pour les administrateur\u00b7ices et les \u00e9diteur\u00b7ices."],"Document Statistics":["Statistiques du document"],"term\u0004Remove %s":["Retirer %s"],"View the autosave":["Voir l\u2019enregistrement automatique"],"There is an autosave of this post that is more recent than the version below.":["Il existe un enregistrement automatique plus r\u00e9cent pour ce contenu."],"Autosaving":["Enregistrement automatique"],"Are you sure you want to unschedule this post?":["Confirmez-vous la d\u00e9planification de cette publication\u00a0?"],"Post Visibility":["Visibilit\u00e9 de la publication"],"Would you like to privately publish this post now?":["Voulez-vous passer cette publication en priv\u00e9\u00a0?"],"Terms":["Termes"],"Resetting the template may result in loss of content, do you want to continue?":["R\u00e9initialiser le mod\u00e8le peut entra\u00eener la perte de contenu, voulez-vous continuer\u00a0?"],"Protected with a password you choose. Only those with the password can view this post.":["Prot\u00e9g\u00e9 avec un mot de passe que vous d\u00e9finissez. Seules les personnes le connaissant pourront acc\u00e9der \u00e0 la publication."],"Add title":["Saisissez le titre"],"Are you sure you want to unpublish this post?":["Confirmez-vous la mise hors-ligne de cette publication\u00a0?"],"Use a secure password":["Utilisez un MDP fort"],"Switch to draft":["Basculer en brouillon"],"Publish:":["Publier\u00a0: "],"Visibility:":["Visibilit\u00e9\u00a0: "],"When you\u2019re ready, submit your work for review, and an Editor will be able to approve it for you.":["Lorsque vous serez pr\u00eat\u00b7e, envoyez votre travail en relecture, ainsi un \u00e9diteur pourra l\u2019approuver pour vous."],"Publish\u2026":["Publier\u2026"],"Your work will be published at the specified date and time.":["Votre travail sera mis en ligne \u00e0 la date et heure planifi\u00e9e."],"Double-check your settings before publishing.":["Rev\u00e9rifiez vos r\u00e9glages avant de publier."],"Are you ready to publish?":["Confirmez-vous la publication\u00a0?"],"Are you ready to schedule?":["Confirmez-vous la planification\u00a0?"],"Copy Link":["Copier le lien"],"Copied!":["Copi\u00e9\u00a0!"],"Are you ready to submit for review?":["Confirmez-vous la mise en attente de relecture\u00a0?"],"%s address":["Adresse (%s)"],"What\u2019s next?":["Et maintenant\u00a0?"],"Submit for Review":["Soumettre \u00e0 la relecture"],"Updating\u2026":["Mise \u00e0 jour\u2026"],"Publishing\u2026":["Publication\u2026"],"is now live.":["est maintenant en ligne."],"is now scheduled. It will go live on":["est maintenant planifi\u00e9. Il sera publi\u00e9 le"],"Scheduling\u2026":["Planification\u2026"],"Add tags":["Ajouter des \u00e9tiquettes"],"Apply the \"%1$s\" format.":["Appliquer le format \u00ab\u00a0%1$s\u00a0\u00bb."],"Your theme uses post formats to highlight different kinds of content, like images or videos. Apply a post format to see this special styling.":["Votre th\u00e8me utilise les formats de publication pour mettre en avant diff\u00e9rents types de contenus, comme les images ou les vid\u00e9os. Appliquez un format de publication pour utiliser cette mise en forme sp\u00e9cifique."],"Use a post format":["Utiliser un format de publication"],"Close panel":["Fermer le panneau"],"Always show pre-publish checks.":["Toujours afficher les v\u00e9rifications de pr\u00e9-publication."],"Tags help users and search engines navigate your site and find your content. Add a few keywords to describe your post.":["Les \u00e9tiquettes aident les utilisateurs et utilisatrices ainsi que les moteurs de recherche \u00e0 naviguer sur votre site et \u00e0 trouver vos contenus. Ajoutez quelques mots-cl\u00e9s pour d\u00e9crire votre publication."],"Allow pingbacks & trackbacks":["Autoriser les pings et les r\u00e9troliens"],"Standard":["Standard"],"Learn more about manual excerpts":["En apprendre plus sur les extraits manuels"],"Allow comments":["Autoriser les commentaires"],"Attempt Recovery":["Tentative de r\u00e9cup\u00e9ration"],"The editor has encountered an unexpected error.":["L\u2019\u00e9diteur a rencontr\u00e9 une erreur inattendue."],"Order":["Ordre"],"no title":["aucun titre"],"(Multiple H1 headings are not recommended)":["(il est d\u00e9conseill\u00e9 d\u2019utiliser plusieurs titres H1)"],"imperative verb\u0004Preview":["Pr\u00e9visualiser"],"Permalink:":["Permalien\u00a0:"],"%d Revision":["%d r\u00e9vision","%d r\u00e9visions"],"(Incorrect heading level)":["(niveau de titre erron\u00e9)"],"Write an excerpt (optional)":["R\u00e9diger un extrait (facultatif)"],"Aside":["En passant"],"Edit post permalink":["Modifier le permalien du contenu"],"Copy the permalink":["Copier le permalien"],"Permalink copied":["Permalien copi\u00e9"],"Copy Error":["Copier l\u2019erreur"],"Remove from Reusable blocks":["Retirer des blocs r\u00e9utilisables"],"Add to Reusable blocks":["Ajouter aux blocs r\u00e9utilisables"],"Chat":["Discussion"],"no parent":["Aucun parent"],"(Empty heading)":["(Titre vide)"],"Convert to Regular Block":["Convertir en bloc Gutenberg normal"],"Post Format":["Format de publication"],"(Your theme may already use a H1 for the post title)":["(votre th\u00e8me devrait avoir un H1 pour le titre de cette publication)"],"%d result found.":["%d r\u00e9sultat trouv\u00e9.","%d r\u00e9sultats trouv\u00e9s."],"Take Over":["Prendre le contr\u00f4le"],"Another user is currently working on this post, which means you cannot make changes, unless you take over.":["Un autre utilisateur ou utilisatrice travaille actuellement sur cette publication, ce qui signifie que vous ne pouvez pas faire de modifications \u00e0 moins que vous ne preniez le contr\u00f4le."],"%s is currently working on this post, which means you cannot make changes, unless you take over.":["%s travaille actuellement sur cette publication, ce qui signifie que vous ne pouvez pas faire de modifications \u00e0 moins que vous ne preniez le contr\u00f4le."],"Avatar":["Avatar"],"This post is already being edited.":["Cette publication est d\u00e9j\u00e0 en cours de modification."],"Someone else has taken over this post.":["Quelqu\u2019un d\u2019autre a pris le contr\u00f4le sur cette publication."],"Generating preview\u2026":["G\u00e9n\u00e9ration de l\u2019aper\u00e7u\u2026"],"Edit or update the image":["Modifier ou mettre \u00e0 jour l\u2019image"],"Another user now has editing control of this post. Don\u2019t worry, your changes up to this moment have been saved.":["Un autre utilisateur ou utilisatrice vient de prendre le contr\u00f4le de modification sur cette publication. Ne vous inqui\u00e9tez pas, les modifications faites avant cela ont \u00e9t\u00e9 enregistr\u00e9es"],"%s now has editing control of this post. Don\u2019t worry, your changes up to this moment have been saved.":["%s vient de prendre le contr\u00f4le de modification sur cette publication. Ne vous inqui\u00e9tez pas, les modifications faites avant cela ont \u00e9t\u00e9 enregistr\u00e9es"],"Copy Post Text":["Copier le texte de la publication"],"Category":["Cat\u00e9gorie"],"Block updated.":["Bloc mis \u00e0 jour."],"(opens in a new tab)":["(ouvre un nouvel onglet)"],"Blocks":["Blocs"],"Gallery":["Galerie"],"Schedule\u2026":["Planification\u2026"],"Replace Image":["Remplacer l\u2019image"],"Template:":["Mod\u00e8le\u00a0:"],"Status":["\u00c9tat"],"Set featured image":["D\u00e9finir l\u2019image mise en avant"],"Video":["Vid\u00e9o"],"Audio":["Son"],"Saved":["Enregistr\u00e9"],"Remove image":["Retirer l\u2019image"],"Featured image":["Image mise en avant"],"Link":["Lien"],"Words":["Mots"],"Parent Category":["Cat\u00e9gorie parente"],"Untitled":["Sans titre"],"Quote":["Citation"],"Image":["Image"],"Suggestion:":["Suggestion\u00a0:"],"Password Protected":["Prot\u00e9g\u00e9 par mot de passe"],"Author":["Auteur"],"Edit":["Modifier"],"Undo":["Annuler"],"Publish":["Publier"],"Save":["Enregistrer"],"Redo":["R\u00e9tablir"],"Save as Pending":["Mettre \u00e0 relire"],"Private":["Priv\u00e9"],"Public":["Public"],"Schedule":["Planifier"],"Add new tag":["Ajouter un mot-clef"],"Update":["Mettre \u00e0 jour"],"Save Draft":["Enregistrer le brouillon"],"(no title)":["(pas de titre)"],"Title":["Titre"],"Published":["Publi\u00e9"],"Draft":["Brouillon"]}},"comment":{"reference":"wp-includes\/js\/dist\/editor.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-daeb084aab42199d26393a56c3465bc0.json b/content/languages/fr_FR-daeb084aab42199d26393a56c3465bc0.json new file mode 100644 index 0000000..3234526 --- /dev/null +++ b/content/languages/fr_FR-daeb084aab42199d26393a56c3465bc0.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Select or Upload Media":["S\u00e9lectionnez ou t\u00e9l\u00e9versez un fichier"],"Error while uploading file %s to the media library.":["Erreur lors du t\u00e9l\u00e9versement du fichier %s dans la biblioth\u00e8que de m\u00e9dias."],"This file is empty.":["Ce fichier est vide."],"Sorry, this file type is not supported here.":["D\u00e9sol\u00e9 ce type de fichier n\u2019est pas pris en charge ici."],"Sorry, this file type is not permitted for security reasons.":["D\u00e9sol\u00e9, ce type de fichier n\u2019est pas autoris\u00e9 pour des raisons de s\u00e9curit\u00e9."],"This file exceeds the maximum upload size for this site.":["La taille de ce fichier d\u00e9passe la limite d’envoi de ce site."]}},"comment":{"reference":"wp-includes\/js\/dist\/media-utils.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-e2791ba830489d23043be8650a22a22b.json b/content/languages/fr_FR-e2791ba830489d23043be8650a22a22b.json new file mode 100644 index 0000000..2c79a60 --- /dev/null +++ b/content/languages/fr_FR-e2791ba830489d23043be8650a22a22b.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Block rendered as empty.":["Bloc devenu vide."],"Error loading block: %s":["Erreur de chargement du bloc\u00a0: %s"]}},"comment":{"reference":"wp-includes\/js\/dist\/server-side-render.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR-f8f49d9fc4a9cf7d78ec99285417bd9c.json b/content/languages/fr_FR-f8f49d9fc4a9cf7d78ec99285417bd9c.json new file mode 100644 index 0000000..a1fd544 --- /dev/null +++ b/content/languages/fr_FR-f8f49d9fc4a9cf7d78ec99285417bd9c.json @@ -0,0 +1 @@ +{"translation-revision-date":"2020-07-17 10:21:32+0000","generator":"GlotPress\/3.0.0-alpha.2","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"Display an icon linking to a social media profile or website.":["Afficher une ic\u00f4ne pointant vers un profil de r\u00e9seau social ou un site web."],"Link label":["Libell\u00e9 du lien"],"Briefly describe the link to help screen reader users.":["D\u00e9crivez bri\u00e8vement le lien pour aider les utilisateur\u00b7ices de lecteurs d\u2019\u00e9crans."],"%s label":["Libell\u00e9 %s"],"Social Icon":["Ic\u00f4ne de r\u00e9seaux sociaux"],"block keywords\u0004links":["liens"],"Social Icons":["Ic\u00f4nes de r\u00e9seaux sociaux"],"Display icons linking to your social media profiles or websites.":["Afficher des ic\u00f4nes pointant vers vos profils de r\u00e9seaux sociaux ou vos sites web."],"Poster image":["Image de couverture"],"Select poster image":["S\u00e9lectionner une image de couverture"],"poem":["po\u00e8me"],"WHAT was he doing, the great god Pan,\n\tDown in the reeds by the river?\nSpreading ruin and scattering ban,\nSplashing and paddling with hoofs of a goat,\nAnd breaking the golden lilies afloat\n With the dragon-fly on the river.":["Du temps que r\u00e9gnait le Grand Pan,\n\tLes dieux prot\u00e9geaient les ivrognes\nDes tas de g\u00e9nies titubants\n\tAu nez rouge, \u00e0 la rouge trogne.\nD\u00e8s qu\u2019un homme vidait les cruchons,\n\tQu\u2019un sac \u00e0 vin faisait carousse\nIls venaient en bande \u00e0 ses trousses\n\tCompter les bouchons."],"Footer label":["Libell\u00e9 du pied de page"],"Header label":["Libell\u00e9 de l\u2019en-t\u00eate"],"Matt Mullenweg":["Matt Mullenweg"],"EXT. XANADU - FAINT DAWN - 1940 (MINIATURE)\nWindow, very small in the distance, illuminated.\nAll around this is an almost totally black screen. Now, as the camera moves slowly towards the window which is almost a postage stamp in the frame, other forms appear;":["EXT. XANADU - FAIBLES LUEURS DE L\u2019AUBE - 1940 (MINIATURE)\nLa fen\u00eatre, tr\u00e8s petite au loin, est illumin\u00e9e.\nTout autour, l\u2019\u00e9cran presque totalement noir. \u00c0 pr\u00e9sent, tandis que la cam\u00e9ra se d\u00e9place lentement vers la fen\u00eatre qui est presque un timbre-poste dans le cadre, d\u2019autres formes apparaissent\u00a0;"],"Unsupported":["Non pris en charge"],"Show:":["Afficher\u00a0:"],"Display featured image":["Afficher l\u2019image mise en avant"],"Full post":["Article complet"],"Image alignment":["Alignement de l\u2019image"],"Featured image settings":["R\u00e9glages de l\u2019image mise en avant"],"download":["t\u00e9l\u00e9charger"],"Media file":["Fichier m\u00e9dia"],"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent et eros eu felis.":["Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent et eros eu felis."],"\/\/ A \"block\" is the abstract term used\n\/\/ to describe units of markup that\n\/\/ when composed together, form the\n\/\/ content or layout of a page.\nregisterBlockType( name, settings );":["\/\/ Un \u00ab\u00a0bloc\u00a0\u00bb est un terme abstrait utilis\u00e9\n\/\/ pour d\u00e9crire une unit\u00e9 de balisage qui\n\/\/ lorsque elle est utilis\u00e9e avec d\u2019autres,\n\/\/ forme le contenu ou la mise en page\n\/\/ d\u2019une publication.\nregisterBlockType( name, settings );"],"Suspendisse commodo neque lacus, a dictum orci interdum et.":["Suspendisse commodo neque lacus, a dictum orci interdum et."],"Buttons":["Boutons"],"Background & Text Color":["Couleur d\u2019arri\u00e8re-plan et de texte"],"Prompt visitors to take action with a group of button-style links.":["Inviter les visiteurs \u00e0 effectuer une action avec un lien ayant la forme d\u2019un bouton."],"recording":["enregistrement"],"podcast":["podcast"],"Images size":["Taille des images"],"Link to":["Lien vers"],"Level %s. Empty.":["Niveau %s. Vide."],"Gallery settings":["R\u00e9glages de la galerie"],"ADD MEDIA":["AJOUTER UN M\u00c9DIA"],"Level %1$s. %2$s":["Niveau %1$s. %2$s"],"Embed a TikTok video.":["Embarquer une vid\u00e9o TikTok."],"Describe the role of this image on the page.":["D\u00e9crivez le r\u00f4le de cette image sur la page."],"Title attribute":["Attribut de titre"],"Change heading level":["Changer le niveau de titre"],"(Note: many devices and browsers do not display this text.)":["(note\u00a0: certains appareils et navigateurs n\u2019afficheront pas ce texte)"],"Sorting and filtering":["Tri et filtrage"],"Grid view":["Vue grille"],"List view":["Vue liste"],"Logos Only":["Logos uniquement"],"Enter address":["Saisir l\u2019adresse"],"Pill Shape":["Forme de pastille"],"Post meta settings":["R\u00e9glages des m\u00e9tas de la publication"],"Post content":["Contenu de la publication"],"Post content settings":["R\u00e9glages de contenu de publication"],"Play inline":["Lancer directement"],"The current poster image url is %s":["L\u2019URL de l\u2019image de banni\u00e8re actuelle est %s"],"There is no poster image currently selected":["Il n\u2019y a actuellement aucune image de banni\u00e8re s\u00e9lectionn\u00e9e"],"Note: Autoplaying audio may cause usability issues for some visitors.":["Remarque\u00a0: la lecture automatique de sons peut causer des probl\u00e8mes d\u2019utilisabilit\u00e9 pour certains utilisateurs."],"Column settings":["R\u00e9glages de la colonne"],"Percentage width":["Largeur en pourcentage"],"Note: Autoplaying videos may cause usability issues for some visitors.":["Remarque\u00a0: la lecture automatique de vid\u00e9o peut cr\u00e9er des probl\u00e8mes d\u2019utilisabilit\u00e9 pour certains visiteurs."],"Etiam et egestas lorem. Vivamus sagittis sit amet dolor quis lobortis. Integer sed fermentum arcu, id vulputate lacus. Etiam fermentum sem eu quam hendrerit.":["Etiam et egestas lorem. Vivamus sagittis sit amet dolor quis lobortis. Integer sed fermentum arcu, id vulputate lacus. Etiam fermentum sem eu quam hendrerit."],"Nam risus massa, ullamcorper consectetur eros fermentum, porta aliquet ligula. Sed vel mauris nec enim.":["Nam risus massa, ullamcorper consectetur eros fermentum, porta aliquet ligula. Sed vel mauris nec enim."],"Two columns; one-third, two-thirds split":["Deux colonnes\u00a0: un tiers\/deux tiers"],"Two columns; two-thirds, one-third split":["Deux colonnes\u00a0: deux tiers\/un tiers"],"Three columns; equal split":["Trois colonnes\u00a0; largeur \u00e9gale"],"Three columns; wide center column":["Trois colonnes\u00a0; colonne centrale large"],"Two columns; equal split":["Deux colonnes\u00a0; largeur \u00e9gale"],"Call to Action":["Appel \u00e0 l\u2019action"],"Welcome to the wonderful world of blocks\u2026":["Bienvenue dans le monde merveilleux des blocs\u2026"],"Fill":["Remplir"],"Border radius":["Rayon de la bordure"],"Link rel":["Attribut rel"],"Start value":["Valeur de d\u00e9part"],"cite":["citer"],"In quoting others, we cite ourselves.":["En citant les autres, nous nous citons nous m\u00eames."],"Reverse list numbering":["Inverser le num\u00e9rotage de la liste"],"Ordered list settings":["R\u00e9glages de liste ordonn\u00e9e"],"One of the hardest things to do in technology is disrupt yourself.":["L\u2019une des choses les plus difficiles \u00e0 faire dans le monde des technologies est de se r\u00e9inventer soi-m\u00eame."],"Upload a file or pick one from your media library.":["T\u00e9l\u00e9versez un fichier ou choisissez-en un dans votre biblioth\u00e8que de m\u00e9dias."],"Open in new tab":["Ouvrir dans un nouvel onglet"],"Header section":["Section d\u2019en-t\u00eate"],"Footer section":["Section de pied de page"],"Insert a table for sharing data.":["Ins\u00e9rer un tableau pour partager des donn\u00e9es."],"Create Table":["Cr\u00e9er un tableau"],"Upload an image or video file, or pick one from your media library.":["T\u00e9l\u00e9versez un fichier image ou vid\u00e9o, ou s\u00e9lectionnez-en un dans la biblioth\u00e8que de m\u00e9dias."],"Align Column Left":["Aligner la colonne \u00e0 gauche"],"Align Column Center":["Centrer la colonne"],"Align Column Right":["Aligner la colonne \u00e0 droite"],"Change column alignment":["Modifier l\u2019alignement des colonnes"],"Jazz Musician":["Musicien de jazz"],"Release Date":["Date de sortie"],"May 7, 2019":["7 mai 2019"],"Attachment page":["Page de fichier joint"],"December 6, 2018":["6 d\u00e9cembre 2018"],"February 21, 2019":["21 f\u00e9vrier 2019"],"Snow Patrol<\/strong>":["Patrouille des neiges<\/strong>"],"Clear Media":["Effacer le m\u00e9dia"],"Minimum height in pixels":["Hauteur minimale en pixels"],"Mont Blanc appears\u2014still, snowy, and serene.":["Luire, \u00f4 lac, dans ton beau miroir\u00a0!"],"\u2014 Kobayashi Issa (\u4e00\u8336)":["\u2014 Paul \u00c9luard (Onze Ha\u00ef-ka\u00efs<\/i>, 1920)"],"Describe the purpose of the image":["D\u00e9crivez l\u2019objet de l\u2019image"],"Leave empty if the image is purely decorative.":["Laisser vide si l\u2019image est purement d\u00e9corative."],"Crop image to fill entire column":["Recadrer l\u2019image pour remplir toute la colonne"],"Write gallery caption\u2026":["\u00c9crire la l\u00e9gende de la galerie\u2026"],"The wren
Earns his living
Noiselessly.":["Une plume donne au chapeau
Un air de l\u00e9g\u00e8ret\u00e9
La chemin\u00e9e fume. "],"Code is Poetry":["Le code est une po\u00e9sie."],"Move image forward":["D\u00e9placer l\u2019image vers l\u2019avant"],"Move image backward":["D\u00e9placer l\u2019image vers l\u2019arri\u00e8re"],"In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing.":["Dans un village de la Manche dont je ne veux pas me rappeler le nom, il n\u2019y a pas longtemps que vivait un de ces hidalgos qui ont lance au r\u00e2telier, vieille rondache, maigre haridelle et limier de chasse."],"Group":["Groupe"],"A block that groups other blocks.":["Un bloc qui groupe d\u2019autres blocs."],"container":["contenant"],"wrapper":["conteneur"],"row":["ligne"],"section":["section"],"Paste a link to the content you want to display on your site.":["Collez un lien vers le contenu que vous souhaitez afficher sur votre site."],"https:\/\/wordpress.org\/support\/article\/embeds\/":["https:\/\/wordpress.org\/support\/article\/embeds\/"],"Learn more about embeds":["En apprendre plus \u00e0 propos des contenus embarqu\u00e9s"],"One.":["Un."],"Two.":["Deux."],"Three.":["Trois."],"Four.":["Quatre."],"Five.":["Cinq."],"Six.":["Six."],"Upload an image file, pick one from your media library, or add one with a URL.":["T\u00e9l\u00e9versez un fichier image, choisissez-en un dans votre biblioth\u00e8que de m\u00e9dias ou ajoutez-en un avec une URL."],"- Select -":["- S\u00e9lectionner -"],"feed":["flux"],"atom":["atom"],"Display entries from any RSS or Atom feed.":["Afficher les entr\u00e9es de n\u2019importe quel flux RSS ou Atom"],"Max number of words in excerpt":["Nombre maximum de mots dans l\u2019extrait"],"Display excerpt":["Afficher l\u2019extrait"],"Display date":["Afficher la date"],"Display author":["Afficher l\u2019auteur"],"Edit RSS URL":["Modifier l\u2019URL du RSS"],"Use URL":["Utiliser l\u2019URL"],"find":["trouver"],"Help visitors find your content.":["Aidez les visiteurs \u00e0 trouver votre contenu."],"Button text":["Texte du bouton"],"Optional placeholder\u2026":["Espace r\u00e9serv\u00e9 facultatif"],"Optional placeholder text":["Texte d\u2019espace r\u00e9serv\u00e9 facultatif"],"Tag Cloud settings":["R\u00e9glages du nuage d\u2019\u00e9tiquettes"],"Add label\u2026":["Ajouter un libell\u00e9\u2026"],"Enter URL here\u2026":["Saisissez l\u2019URL ici\u2026"],"Add button text\u2026":["Ajouter un texte de bouton\u2026"],"RSS settings":["R\u00e9glages RSS"],"Label text":["Texte du libell\u00e9"],"Content before this block will be shown in the excerpt on your archives page.":["Le contenu avant ce bloc sera affich\u00e9 dans l\u2019extrait sur vos pages d\u2019archives."],"Hide the excerpt on the full content page":["Masquer l\u2019extrait sur la page de contenu entier"],"The excerpt is visible.":["L\u2019extrait est visible"],"The excerpt is hidden.":["L\u2019extrait est masqu\u00e9"],"archive":["archive"],"posts":["articles"],"A calendar of your site\u2019s posts.":["Un calendrier des articles de votre site."],"link":["lien"],"image %1$d of %2$d in gallery":["image %1$d sur %2$d dans la galerie"],"ebook":["ebook"],"Focal point picker":["S\u00e9lecteur de point de focalisation"],"Embedded content from %s can't be previewed in the editor.":["Le contenu embarqu\u00e9 depuis %s ne peut pas \u00eatre pr\u00e9visualis\u00e9 dans l\u2019\u00e9diteur."],"Sorry, this content could not be embedded.":["D\u00e9sol\u00e9, ce contenu ne peut pas \u00eatre embarqu\u00e9."],"Embed Amazon Kindle content.":["Embarquer du contenu Amazon Kindle."],"Prompt visitors to take action with a button-style link.":["Inviter les visiteurs \u00e0 effectuer une action avec un lien en forme de bouton."],"block style\u0004Default":["Par d\u00e9faut"],"keyboard key\u0004Space":["Espace"],"keyboard key\u0004Backspace":["Retour"],"Embed Crowdsignal (formerly Polldaddy) content.":["Contenu Crowdsignal (anciennement Polldaddy) int\u00e9gr\u00e9"],"content placeholder\u0004Content\u2026":["Contenu\u2026"],"button label\u0004Convert to link":["Convertir en lien"],"button label\u0004Try again":["R\u00e9essayer"],"Create content, and save it for you and other contributors to reuse across your site. Update the block, and the changes apply everywhere it\u2019s used.":["Cr\u00e9ez du contenu et enregistrez-le pour vous ou pour d\u2019autres contributrices et contributeurs afin de le r\u00e9utiliser ailleurs sur votre site, et appliquer les modifications partout o\u00f9 il est utilis\u00e9."],"This image has an empty alt attribute; its file name is %s":["L\u2019attribut alt de cette image est vide, son nom de fichier est %s."],"This image has an empty alt attribute":["L\u2019attribut alt de cette image est vide."],"Paragraph block":["Bloc paragraphe"],"Start writing or type \/ to choose a block":["Commencez \u00e0 \u00e9crire ou saisissez \u00ab\u00a0\/\u00a0\u00bb pour choisir un bloc"],"Empty block; start writing or type forward slash to choose a block":["Bloc vide\u00a0;\u00a0\u00e9crivez ou saisissez une barre oblique pour choisir un bloc"],"Page Break":["Saut de page"],"Stack on mobile":["Empiler sur mobile"],"poetry":["po\u00e9sie"],"Verse":["Couplet"],"New Column":["Ajouter une colonne"],"Muted":["En sourdine"],"movie":["vid\u00e9o"],"Remove Poster Image":["Retirer l\u2019image de couverture"],"This block is deprecated. Please use the Columns block instead.":["Ce bloc est obsol\u00e8te. Veuillez utiliser le bloc Colonnes \u00e0 la place."],"Text Columns (deprecated)":["Colonnes de texte (obsol\u00e8te)"],"Stripes":["Rayures"],"Write\u2026":["R\u00e9digez\u2026"],"Insert poetry. Use special spacing formats. Or quote song lyrics.":["Ins\u00e9rez de la po\u00e9sie ou des paroles de chansons en utilisant un espacement sp\u00e9cifique."],"Embed a video from your media library or upload a new one.":["Embarquez une vid\u00e9o depuis votre biblioth\u00e8que de m\u00e9dias ou t\u00e9l\u00e9versez-en une nouvelle."],"Insert a table \u2014 perfect for sharing charts and data.":["Ins\u00e9rez un tableau \u2014 parfait pour mettre en ligne des donn\u00e9es tabulaires."],"Playback controls":["Commandes de lecture"],"Video settings":["R\u00e9glages vid\u00e9o"],"Delete Column":["Supprimer une colonne"],"Add Column After":["Ajouter une colonne \u00e0 la suite"],"Add Column Before":["Ajouter une colonne avant"],"Delete Row":["Supprimer la ligne"],"Add Row After":["Ajouter une ligne apr\u00e8s"],"Add Row Before":["Ajouter une ligne avant"],"Edit table":["Modifier le tableau"],"Shortcode":["Code court"],"divider":["S\u00e9parateur"],"horizontal-line":["Filet horizontal"],"Separator":["S\u00e9parateur"],"Height in pixels":["Hauteur en pixels"],"Spacer":["Espacement"],"Table settings":["R\u00e9glages du tableau"],"Fixed width table cells":["Cellules de tableau \u00e0 largeur fixe"],"Dots":["Points"],"Wide Line":["Ligne large"],"This block is deprecated. Please use the Paragraph block instead.":["Ce bloc est obsol\u00e8te. Veuillez utiliser le bloc Paragraphe \u00e0 la place."],"Subheading (deprecated)":["Sous-titre (obsol\u00e8te)"],"blockquote":["citation"],"block style\u0004Large":["Grand"],"Write shortcode here\u2026":["Placez le code court ici\u2026"],"Insert additional custom elements with a WordPress shortcode.":["Ins\u00e9rez des \u00e9l\u00e9ments personnalis\u00e9s additionnels avec un code court WordPress."],"Create a break between ideas or sections with a horizontal separator.":["Cr\u00e9ez un espacement entre des id\u00e9es ou entre des sections avec un s\u00e9parateur horizontal."],"Give quoted text visual emphasis. \"In quoting others, we cite ourselves.\" \u2014 Julio Cort\u00e1zar":["Donnez une emphase visuelle \u00e0 vos citations. \u00ab\u00a0En citant les autres, nous nous citons nous m\u00eames\u00a0\u00bb \u2014 Julio Cort\u00e1zar"],"Write subheading\u2026":["R\u00e9digez un texte mis en exergue\u2026"],"Add white space between blocks and customize its height.":["Ajoutez de l\u2019espace entre les blocs et d\u00e9finissez leur hauteur."],"Row Count":["Nombre de lignes"],"Column Count":["Nombre de colonnes"],"Spacer settings":["R\u00e9glages de l\u2019espacement"],"Pullquote":["Citation en exergue"],"Main color":["Couleur principale"],"Solid color":["Couleur unie"],"Give special visual emphasis to a quote from your text.":["Donnez une emphase visuelle \u00e0 une citation."],"Write quote\u2026":["R\u00e9digez une citation\u2026"],"Write citation\u2026":["Renseignez la source\u2026"],"Write preformatted text\u2026":["R\u00e9digez du texte pr\u00e9format\u00e9\u2026"],"text":["Texte"],"Convert to ordered list":["Convertir en liste ordonn\u00e9e"],"Convert to unordered list":["Convertir en liste non-ordonn\u00e9e"],"Text settings":["R\u00e9glages du texte"],"photo":["photo"],"numbered list":["Liste num\u00e9rot\u00e9e"],"Indent list item":["Indenter l\u2019\u00e9l\u00e9ment de la liste"],"Outdent list item":["D\u00e9sindenter l\u2019\u00e9l\u00e9ment de la liste"],"Drop cap":["Lettrine"],"recent posts":["contenus r\u00e9cents"],"pagination":["pagination"],"next page":["page suivante"],"Showing large initial letter.":["Affichage de la lettrine."],"recent comments":["commentaires r\u00e9cents"],"Display avatar":["Afficher l\u2019avatar"],"Latest comments settings":["R\u00e9glages des derniers commentaires"],"Number of comments":["Nombre de commentaires"],"Keep as HTML":["Conserver en HTML"],"block name\u0004More":["Lire la suite"],"Media area":["Zone de m\u00e9dia"],"Media & Text":["M\u00e9dia & texte"],"Show media on right":["Afficher le m\u00e9dia sur la droite"],"Show media on left":["Afficher le m\u00e9dia sur la gauche"],"Display a list of your most recent comments.":["Afficher une liste de vos commentaires les plus r\u00e9cents."],"Your site doesn\u2019t include support for this block.":["Votre site ne propose pas de support pour ce bloc."],"Your site doesn\u2019t include support for the \"%s\" block. You can leave this block intact or remove it entirely.":["Votre site ne propose pas de support pour le bloc \u00ab\u00a0%s\u00a0\u00bb. Vous pouvez laisser ce bloc tel quel ou le retirer compl\u00e8tement."],"Your site doesn\u2019t include support for the \"%s\" block. You can leave this block intact, convert its content to a Custom HTML block, or remove it entirely.":["Votre site ne propose pas de support pour le bloc \u00ab\u00a0%s\u00a0\u00bb. Vous pouvez laisser ce bloc tel quel, convertir son contenu en bloc HTML personnalis\u00e9 ou le retirer compl\u00e8tement."],"Set media and words side-by-side for a richer layout.":["D\u00e9finir un m\u00e9dia et du texte c\u00f4te-\u00e0-c\u00f4te pour une mise en page plus riche."],"Start with the building block of all narrative.":["Commencez par la pierre angulaire de tout r\u00e9cit."],"Toggle to show a large initial letter.":["Cliquez pour afficher une lettrine."],"Separate your content into a multi-page experience.":["S\u00e9parez votre contenu sur plusieurs pages."],"Media & Text settings":["R\u00e9glages m\u00e9dia & texte"],"Write list\u2026":["R\u00e9digez une liste\u2026"],"Create a bulleted or numbered list.":["Cr\u00e9ez une liste \u00e0 puces ou une liste num\u00e9rot\u00e9e."],"Display post date":["Afficher la date de publication"],"Latest Posts":["Articles r\u00e9cents"],"Latest Comments":["Commentaires r\u00e9cents"],"Insert an image to make a visual statement.":["Ins\u00e9rez une image pour illustrer vos propos."],"Add text that respects your spacing and tabs, and also allows styling.":["Ajoutez du texte qui respecte les espacements et tabulations, avec la possibilit\u00e9 de le mettre en forme."],"Display a list of your most recent posts.":["Afficher une liste de vos articles les plus r\u00e9cents."],"Image settings":["R\u00e9glages de l\u2019image"],"subtitle":["sous-titre"],"title":["titre"],"Heading":["Titre"],"Level":["Niveau"],"Heading settings":["R\u00e9glages du titre"],"photos":["photos"],"images":["images"],"Edit image":["Modifier l\u2019image"],"Crop images":["Recadrer les images"],"Thumbnails are not cropped.":["Les miniatures ne sont pas recadr\u00e9es."],"Thumbnails are cropped to align.":["Les miniatures sont recadr\u00e9es pour s\u2019aligner."],"pdf":["PDF"],"document":["document"],"Copy URL":["Copier l\u2019URL"],"embed":["Contenu embarqu\u00e9"],"button label\u0004Download":["T\u00e9l\u00e9charger"],"Add custom HTML code and preview it as you edit.":["Ajoutez du code HTML personnalis\u00e9 et pr\u00e9visualisez-le en direct."],"Write heading\u2026":["R\u00e9digez un titre\u2026"],"Heading %d":["Titre %d"],"Display multiple images in a rich gallery.":["Affichez plusieurs images dans une galerie."],"Drag images, upload new ones or select files from your library.":["Glissez des images, t\u00e9l\u00e9versez-en de nouvelles ou s\u00e9lectionnez des fichiers depuis votre biblioth\u00e8que."],"Show download button":["Afficher le bouton de t\u00e9l\u00e9chargement"],"Download button settings":["R\u00e9glages du bouton de t\u00e9l\u00e9chargement"],"Text link settings":["R\u00e9glages du lien textuel"],"Add a link to a downloadable file.":["Ajoutez un lien vers un fichier t\u00e9l\u00e9chargeable."],"Alt text (alternative text)":["Texte alternatif (alt)"],"Write HTML\u2026":["\u00c9crire du HTML\u2026"],"Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content.":["Introduisez les nouvelles sections et organisez votre publication pour aider les visiteurs (et les moteurs de recherche) \u00e0 en comprendre la structure."],"Write file name\u2026":["Saisissez le nom du fichier\u2026"],"video":["vid\u00e9o"],"audio":["son"],"music":["musique"],"image":["image"],"blog":["blog"],"Embedded content from %s":["Contenu embarqu\u00e9 depuis %s"],"Fixed background":["Arri\u00e8re-plan fixe"],"post":["contenu"],"Edit URL":["Modifier l\u2019URL"],"Embedding\u2026":["R\u00e9cup\u00e9ration\u2026"],"Media settings":["R\u00e9glages des m\u00e9dias"],"Resize for smaller devices":["Redimensionner pour les petits appareils"],"Write title\u2026":["R\u00e9digez le titre\u2026"],"block title\u0004Embed":["Contenu embarqu\u00e9"],"%s URL":["URL %s"],"Embed videos, images, tweets, audio, and other content from external sources.":["Embarquez des vid\u00e9os, des images, des tweets, des sons et d\u2019autres contenus depuis des sources externes."],"button label\u0004Embed":["Embarquer"],"Enter URL to embed here\u2026":["Saisissez l\u2019URL \u00e0 embarquer\u2026"],"This embed may not preserve its aspect ratio when the browser is resized.":["Ce contenu embarqu\u00e9 pourrait perdre son rapport hauteur\/largeur lorsque le navigateur est redimensionn\u00e9."],"This embed will preserve its aspect ratio when the browser is resized.":["Ce contenu embarqu\u00e9 conservera son rapport hauteur\/largeur lorsque le navigateur est redimensionn\u00e9."],"Embed a WordPress.tv video.":["Embarquez une vid\u00e9o WordPress.tv."],"Embed a VideoPress video.":["Embarquez une vid\u00e9o VideoPress."],"Embed a Tumblr post.":["Embarquez une publication Tumblr."],"Embed a TED video.":["Embarquez une vid\u00e9o TED."],"Embed Speaker Deck content.":["Embarquez un contenu SpeakerDeck."],"Embed SmugMug content.":["Embarquez un contenu SmugMug."],"Embed Slideshare content.":["Embarquez un contenu Slideshare."],"Embed Scribd content.":["Embarquez un contenu Scribd."],"Embed Screencast content.":["Embarquez un contenu Screencast."],"Embed ReverbNation content.":["Embarquez un contenu ReverbNation."],"Embed a Reddit thread.":["Embarquez un fil de discussion Reddit."],"Embed Mixcloud content.":["Embarquez un contenu Mixcloud."],"Embed Meetup.com content.":["Embarquez un contenu Meetup.com."],"Embed Kickstarter content.":["Embarquez un contenu Kickstarter."],"Embed Issuu content.":["Embarquez un contenu Issuu."],"Embed Imgur content.":["Embarquez un contenu Imgur."],"Embed Hulu content.":["Embarquez un contenu Hulu."],"Embed a Dailymotion video.":["Embarquez une vid\u00e9o Dailymotion."],"Embed CollegeHumor content.":["Embarquez un contenu CollegeHumor."],"Embed Cloudup content.":["Embarquez un contenu Cloudup."],"Embed an Animoto video.":["Embarquez une vid\u00e9o Animoto."],"Embed a Vimeo video.":["Embarquez une vid\u00e9o Vimeo."],"Embed Flickr content.":["Embarquez un contenu Flickr."],"Embed Spotify content.":["Embarquez un contenu Spotify."],"Embed SoundCloud content.":["Embarquez un contenu Soundcloud."],"Embed Polldaddy content.":["Embarquez un contenu Polldaddy."],"Embed an Instagram post.":["Embarquez une publication Instagram."],"Embed a Facebook post.":["Embarquez une publication Facebook."],"Embed a YouTube video.":["Embarquez une vid\u00e9o YouTube."],"Embed a tweet.":["Embarquez un tweet."],"Add a block that displays content pulled from other sites, like Twitter, Instagram or YouTube.":["Ajoutez un bloc affichant du contenu r\u00e9cup\u00e9r\u00e9 d\u2019autres sites, comme Twitter, Instagram ou YouTube."],"Overlay":["Calque de superposition"],"Add an image or video with a text overlay \u2014 great for headers.":["Ajoutez une image ou une vid\u00e9o avec un texte par dessus \u2013 parfait pour les en-t\u00eates."],"Border settings":["R\u00e9glages de la bordure"],"Background opacity":["Opacit\u00e9 de l\u2019arri\u00e8re-plan"],"Cover":["Banni\u00e8re"],"Add a block that displays content in multiple columns, then add whatever content blocks you\u2019d like.":["Ajoutez un bloc qui affiche du contenu sur plusieurs colonnes puis ins\u00e9rez-y les blocs de votre choix."],"Button":["Bouton"],"Classic":["Classique"],"A single column within a columns block.":["Une colonne unique dans un bloc de colonnes."],"Outline":["Contour"],"button to expand options\u0004More":["Plus"],"block title\u0004Classic":["Classique"],"block style\u0004Rounded":["Arrondi"],"Display code snippets that respect your spacing and tabs.":["Affichez des bouts de code qui respectent vos espacements et tabulations."],"Write code\u2026":["R\u00e9digez du code\u2026"],"Display a list of all categories.":["Affichez une liste de toutes les cat\u00e9gories."],"Add text\u2026":["Ajoutez du texte\u2026"],"Use the classic WordPress editor.":["Utilisez l\u2019\u00e9diteur classique de WordPress."],"Categories settings":["R\u00e9glages des cat\u00e9gories"],"Color settings":["R\u00e9glages de couleur"],"Block has been deleted or is unavailable.":["Le bloc a \u00e9t\u00e9 supprim\u00e9 ou n\u2019est plus disponible."],"Reusable Block":["Bloc r\u00e9utilisable"],"Write caption\u2026":["R\u00e9digez la l\u00e9gende\u2026"],"Display a monthly archive of your posts.":["Affichez une archive mensuelle de vos articles."],"Embed a simple audio player.":["Embarquez un lecteur sonore simple."],"Archives settings":["R\u00e9glages des archives"],"Audio settings":["R\u00e9glages du son"],"Link settings":["R\u00e9glages de lien"],"Copied!":["Copi\u00e9\u00a0!"],"Replace image":["Remplacer l\u2019image"],"Number of items":["Nombre d\u2019\u00e9l\u00e9ments"],"Gallery":["Galerie"],"Custom HTML":["HTML personnalis\u00e9"],"(Untitled)":["(Sans titre)"],"Read more":["Lire la suite"],"Embed a WordPress post.":["Embarquez une publication WordPress."],"Taxonomy":["Taxonomie"],"Color":["Couleur"],"editor button\u0004Left to right":["Gauche \u00e0 droite"],"Auto":["Automatique"],"Metadata":["M\u00e9tadonn\u00e9es"],"Autoplay":["Lecture automatique"],"Select Poster Image":["Choisir une image de couverture"],"Text color":["Couleur du texte"],"Page break":["Saut de page"],"Background color":["Couleur d\u2019arri\u00e8re plan"],"Table":["Tableau"],"bullet list":["Liste \u00e0 puces"],"File":["Fichier"],"A cloud of your most used tags.":["Un nuage de vos \u00e9tiquettes les plus utilis\u00e9es."],"Empty":["Vide"],"Video":["Vid\u00e9o"],"Audio":["Son"],"Columns":["Colonnes"],"Media File":["Fichier m\u00e9dia"],"Attachment Page":["Page du fichier joint"],"Insert Media":["Ins\u00e9rer un m\u00e9dia"],"Remove image":["Retirer l\u2019image"],"Link":["Lien"],"Preload":["Pr\u00e9charger"],"Display as dropdown":["Afficher comme liste d\u00e9roulante"],"Background":["Arri\u00e8re-plan"],"Calendar":["Calendrier"],"Show hierarchy":["Afficher la hi\u00e9rarchie"],"Column":["Colonne"],"Paragraph":["Paragraphe"],"Code":["Code"],"Dimensions":["Dimensions"],"List":["Liste"],"Loop":["R\u00e9p\u00e9ter"],"Quote":["Citation"],"Image":["Image"],"Preformatted":["Pr\u00e9-format\u00e9"],"Tag Cloud":["Nuage d\u2019\u00e9tiquettes"],"Show post counts":["Afficher le nombre d\u2019articles"],"ordered list":["Liste ordonn\u00e9e"],"Name:":["Nom\u00a0:"],"sound":["son"],"Default":["Valeur par d\u00e9faut"],"HTML":["HTML"],"URL":["Adresse web"],"Edit":["Modifier"],"Apply":["Appliquer"],"Excerpt":["Extrait"],"Save":["Enregistrer"],"Categories":["Cat\u00e9gories"],"None":["Aucun"],"RSS":["Flux"],"Archives":["Archives"],"Version":["Version"],"(no title)":["(pas de titre)"],"Preview":["Pr\u00e9visualiser"],"Search":["Rechercher"],"No posts found.":["Aucune publication trouv\u00e9e."]}},"comment":{"reference":"wp-includes\/js\/dist\/block-library.js"}} \ No newline at end of file diff --git a/content/languages/fr_FR.mo b/content/languages/fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..4c62ae1f6fce7387bfc7a766c50442f3adc3d460 GIT binary patch literal 384496 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

Ie@5r| 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%0AxbuCByT_Nk%Xdznox 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 literal 0 HcmV?d00001 diff --git a/content/languages/fr_FR.po b/content/languages/fr_FR.po new file mode 100644 index 0000000..6380692 --- /dev/null +++ b/content/languages/fr_FR.po @@ -0,0 +1,18663 @@ +# Translation of WordPress - 5.4.x - Development in French (France) +# This file is distributed under the same license as the WordPress - 5.4.x - Development package. +msgid "" +msgstr "" +"PO-Revision-Date: 2020-07-17 10:21:32+0000\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 > 1;\n" +"X-Generator: GlotPress/3.0.0-alpha.2\n" +"Language: fr\n" +"Project-Id-Version: WordPress - 5.4.x - Development\n" + +#: wp-includes/script-loader.php:1738 +msgctxt "Google Font Name and Variants" +msgid "Noto Serif:400,400i,700,700i" +msgstr "Noto Serif:400,400i,700,700i" + +#: wp-includes/comment-template.php:914 +msgctxt "Comment number declension: on or off" +msgid "off" +msgstr "off" + +#: wp-includes/general-template.php:782 +msgid "html_lang_attribute" +msgstr "fr-FR" + +#: wp-includes/functions.php:335 +msgctxt "decline months names: on or off" +msgid "off" +msgstr "off" + +#. translators: If your word count is based on single characters (e.g. East +#. Asian characters), enter 'characters_excluding_spaces' or +#. 'characters_including_spaces'. Otherwise, enter 'words'. Do not translate +#. into your own language. +#: wp-includes/script-loader.php:1915 wp-includes/formatting.php:3888 +#: wp-includes/js/dist/editor.js:12766 +msgctxt "Word count type. Do not translate!" +msgid "words" +msgstr "words" + +#: wp-includes/script-loader.php:1645 +msgctxt "Open Sans font: on or off" +msgid "on" +msgstr "on" + +#. translators: 'rtl' or 'ltr'. This sets the text direction for WordPress. +#: wp-includes/class-wp-locale.php:217 +msgctxt "text direction" +msgid "ltr" +msgstr "ltr" + +#. translators: Opening curly single quote. +#: wp-includes/formatting.php:114 +msgctxt "opening curly single quote" +msgid "‘" +msgstr "‘" + +#. translators: Opening curly double quote. +#: wp-includes/formatting.php:101 wp-includes/formatting.php:5396 +msgctxt "opening curly double quote" +msgid "“" +msgstr "« " + +#. translators: Closing curly double quote. +#: wp-includes/formatting.php:103 +msgctxt "closing curly double quote" +msgid "”" +msgstr " »" + +#. translators: Closing curly single quote. +#: wp-includes/formatting.php:116 +msgctxt "closing curly single quote" +msgid "’" +msgstr "’" + +#. translators: $dec_point argument for https://www.php.net/number_format, +#. default is '.' +#: wp-includes/class-wp-locale.php:208 +msgid "number_format_decimal_point" +msgstr "," + +#. translators: $thousands_sep argument for https://www.php.net/number_format, +#. default is ',' +#: wp-includes/class-wp-locale.php:200 +msgid "number_format_thousands_sep" +msgstr " " + +#: wp-includes/comment-template.php:602 wp-admin/includes/meta-boxes.php:166 +#: wp-admin/includes/meta-boxes.php:191 +msgid "Password protected" +msgstr "Protégé par mot de passe" + +#: wp-includes/rest-api.php:50 +msgid "Namespace must not start or end with a slash." +msgstr "L’espace de nom ne doit pas commencer ou se terminer par une barre oblique." + +#. translators: 1: Type of block (i.e. Text, Image etc) +#: wp-includes/js/dist/block-editor.js:23760 +msgid "Block %1$s is at the beginning of the content and can’t be moved left" +msgstr "Le bloc %1$s est au début du contenu et ne peut être déplacé à gauche" + +#. translators: 1: Type of block (i.e. Text, Image etc) +#: wp-includes/js/dist/block-editor.js:23755 +msgid "Block %1$s is at the beginning of the content and can’t be moved up" +msgstr "Le bloc %1$s est au début du contenu et ne peut pas être déplacé plus haut" + +#. translators: 1: Type of block (i.e. Text, Image etc) +#: wp-includes/js/dist/block-editor.js:23720 +msgid "Block %1$s is at the end of the content and can’t be moved left" +msgstr "Le bloc %1$s est à la fin du contenu et ne peut pas être déplacé à gauche" + +#. translators: 1: Type of block (i.e. Text, Image etc) +#: wp-includes/js/dist/block-editor.js:23715 +msgid "Block %1$s is at the end of the content and can’t be moved down" +msgstr "Le bloc %1$s est à la fin du contenu et ne peut pas être déplacé plus bas" + +#: wp-includes/class-wp-xmlrpc-server.php:1786 +#: wp-includes/class-wp-xmlrpc-server.php:5202 +msgid "Sorry, the post could not be deleted." +msgstr "Désolé, l’article n’a pas pu être supprimé." + +#: wp-includes/class-wp-xmlrpc-server.php:3385 +#: wp-includes/class-wp-xmlrpc-server.php:3388 +msgid "Sorry, the category could not be created." +msgstr "Désolé, la catégorie n’a pas pu être créée." + +#: wp-includes/class-wp-xmlrpc-server.php:1643 +#: wp-includes/class-wp-xmlrpc-server.php:5142 +#: wp-includes/class-wp-xmlrpc-server.php:5900 +msgid "Sorry, the post could not be updated." +msgstr "Désolé, l’article n’a pas pu être mis à jour." + +#: wp-includes/js/dist/api-fetch.js:854 +msgid "You are probably offline." +msgstr "Vous êtes probablement hors ligne." + +#: wp-includes/js/dist/block-library.js:23639 +msgid "Display an icon linking to a social media profile or website." +msgstr "Afficher une icône pointant vers un profil de réseau social ou un site web." + +#: wp-includes/js/dist/block-directory.js:1243 +msgid "%s block icon" +msgstr "Icône du bloc %s" + +#: wp-includes/js/dist/block-library.js:23559 +msgid "Link label" +msgstr "Libellé du lien" + +#: wp-includes/js/dist/block-library.js:23560 +msgid "Briefly describe the link to help screen reader users." +msgstr "Décrivez brièvement le lien pour aider les utilisateur·ices de lecteurs d’écrans." + +#: wp-includes/js/dist/block-library.js:23556 +msgid "%s label" +msgstr "Libellé %s" + +#: wp-includes/js/dist/block-library.js:23510 +#: wp-includes/js/dist/block-library.js:23632 +msgid "Social Icon" +msgstr "Icône de réseaux sociaux" + +#: wp-includes/js/dist/block-library.js:22440 +msgctxt "block keywords" +msgid "links" +msgstr "liens" + +#: wp-includes/js/dist/block-library.js:22438 +msgid "Social Icons" +msgstr "Icônes de réseaux sociaux" + +#: wp-includes/js/dist/block-library.js:22439 +msgid "Display icons linking to your social media profiles or websites." +msgstr "Afficher des icônes pointant vers vos profils de réseaux sociaux ou vos sites web." + +#: wp-includes/js/dist/block-library.js:21592 +msgid "Poster image" +msgstr "Image de couverture" + +#: wp-includes/js/dist/block-library.js:21593 +msgid "Select poster image" +msgstr "Sélectionner une image de couverture" + +#: wp-includes/js/dist/block-library.js:21277 +msgid "poem" +msgstr "poème" + +#. translators: Sample content for the Verse block. Can be replaced with a more +#. locale-adequate work. +#: wp-includes/js/dist/block-library.js:21274 +msgid "" +"WHAT was he doing, the great god Pan,\n" +"\tDown in the reeds by the river?\n" +"Spreading ruin and scattering ban,\n" +"Splashing and paddling with hoofs of a goat,\n" +"And breaking the golden lilies afloat\n" +" With the dragon-fly on the river." +msgstr "" +"Du temps que régnait le Grand Pan,\n" +"\tLes dieux protégeaient les ivrognes\n" +"Des tas de génies titubants\n" +"\tAu nez rouge, à la rouge trogne.\n" +"Dès qu’un homme vidait les cruchons,\n" +"\tQu’un sac à vin faisait carousse\n" +"Ils venaient en bande à ses trousses\n" +"\tCompter les bouchons." + +#: wp-includes/js/dist/block-library.js:20403 +msgid "Footer label" +msgstr "Libellé du pied de page" + +#: wp-includes/js/dist/block-library.js:20401 +msgid "Header label" +msgstr "Libellé de l’en-tête" + +#. Author of the plugin +#: wp-includes/js/dist/block-library.js:17701 +msgid "Matt Mullenweg" +msgstr "Matt Mullenweg" + +#. translators: Sample content for the Preformatted block. Can be replaced with +#. a more locale-adequate work. +#: wp-includes/js/dist/block-library.js:17108 +msgid "" +"EXT. XANADU - FAINT DAWN - 1940 (MINIATURE)\n" +"Window, very small in the distance, illuminated.\n" +"All around this is an almost totally black screen. Now, as the camera moves slowly towards the window which is almost a postage stamp in the frame, other forms appear;" +msgstr "" +"EXT. XANADU - FAIBLES LUEURS DE L’AUBE - 1940 (MINIATURE)\n" +"La fenêtre, très petite au loin, est illuminée.\n" +"Tout autour, l’écran presque totalement noir. À présent, tandis que la caméra se déplace lentement vers la fenêtre qui est presque un timbre-poste dans le cadre, d’autres formes apparaissent ;" + +#: wp-includes/js/dist/block-library.js:16595 +msgid "Unsupported" +msgstr "Non pris en charge" + +#: wp-includes/js/dist/block-library.js:15705 +msgid "Show:" +msgstr "Afficher :" + +#: wp-includes/js/dist/block-library.js:15742 +msgid "Display featured image" +msgstr "Afficher l’image mise en avant" + +#: wp-includes/js/dist/block-library.js:15711 +msgid "Full post" +msgstr "Article complet" + +#: wp-includes/js/dist/block-library.js:15776 +msgid "Image alignment" +msgstr "Alignement de l’image" + +#: wp-includes/js/dist/block-library.js:15740 +msgid "Featured image settings" +msgstr "Réglages de l’image mise en avant" + +#: wp-includes/js/dist/block-library.js:14112 +msgid "download" +msgstr "télécharger" + +#: wp-includes/js/dist/block-library.js:13563 +msgid "Media file" +msgstr "Fichier média" + +#. translators: example text. +#: wp-includes/js/dist/block-library.js:11320 +msgid "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent et eros eu felis." +msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent et eros eu felis." + +#. translators: Preserve \n markers for line breaks +#: wp-includes/js/dist/block-library.js:10591 +msgid "" +"// A \"block\" is the abstract term used\n" +"// to describe units of markup that\n" +"// when composed together, form the\n" +"// content or layout of a page.\n" +"registerBlockType( name, settings );" +msgstr "" +"// Un « bloc » est un terme abstrait utilisé\n" +"// pour décrire une unité de balisage qui\n" +"// lorsque elle est utilisée avec d’autres,\n" +"// forme le contenu ou la mise en page\n" +"// d’une publication.\n" +"registerBlockType( name, settings );" + +#. translators: example text. +#: wp-includes/js/dist/block-library.js:11331 +msgid "Suspendisse commodo neque lacus, a dictum orci interdum et." +msgstr "Suspendisse commodo neque lacus, a dictum orci interdum et." + +#: wp-includes/js/dist/block-library.js:9987 +msgid "Buttons" +msgstr "Boutons" + +#: wp-includes/js/dist/block-library.js:9715 +msgid "Background & Text Color" +msgstr "Couleur d’arrière-plan et de texte" + +#: wp-includes/js/dist/block-library.js:9988 +msgid "Prompt visitors to take action with a group of button-style links." +msgstr "Inviter les visiteurs à effectuer une action avec un lien ayant la forme d’un bouton." + +#: wp-includes/js/dist/block-library.js:9207 +msgid "recording" +msgstr "enregistrement" + +#: wp-includes/js/dist/block-library.js:9207 +msgid "podcast" +msgstr "podcast" + +#: wp-includes/js/dist/block-library.js:8250 +msgid "Images size" +msgstr "Taille des images" + +#: wp-includes/js/dist/block-library.js:8244 +#: wp-includes/js/dist/block-library.js:13573 +msgid "Link to" +msgstr "Lien vers" + +#. translators: accessibility text. %s: heading level. +#: wp-includes/js/dist/block-library.js:6401 +msgid "Level %s. Empty." +msgstr "Niveau %s. Vide." + +#: wp-includes/js/dist/block-library.js:8228 +msgid "Gallery settings" +msgstr "Réglages de la galerie" + +#: wp-includes/js/dist/block-library.js:7859 +msgid "ADD MEDIA" +msgstr "AJOUTER UN MÉDIA" + +#. translators: accessibility text. 1: heading level. 2: heading content. +#: wp-includes/js/dist/block-library.js:6403 +msgid "Level %1$s. %2$s" +msgstr "Niveau %1$s. %2$s" + +#: wp-includes/js/dist/block-library.js:4275 +msgid "Embed a TikTok video." +msgstr "Embarquer une vidéo TikTok." + +#: wp-includes/js/dist/block-library.js:5267 +msgid "Describe the role of this image on the page." +msgstr "Décrivez le rôle de cette image sur la page." + +#: wp-includes/js/dist/block-library.js:5264 +msgid "Title attribute" +msgstr "Attribut de titre" + +#: wp-includes/js/dist/block-library.js:6048 +msgid "Change heading level" +msgstr "Changer le niveau de titre" + +#: wp-includes/js/dist/block-library.js:5269 +msgid "(Note: many devices and browsers do not display this text.)" +msgstr "(note : certains appareils et navigateurs n’afficheront pas ce texte)" + +#. translators: accessibility text. %1: The block title, %2: The block row +#. number, %3: The block label.. +#: wp-includes/js/dist/blocks.js:6879 +msgid "%1$s Block. Row %2$d. %3$s" +msgstr "Bloc %1$s. Ligne %2$d. %3$s" + +#. translators: accessibility text. %s: The block title, %d The block row +#. number. +#: wp-includes/js/dist/blocks.js:6884 +msgid "%s Block. Row %d" +msgstr "Bloc %s. Ligne %d" + +#. translators: accessibility text. %1: The block title, %2: The block column +#. number, %3: The block label.. +#: wp-includes/js/dist/blocks.js:6889 +msgid "%1$s Block. Column %2$d. %3$s" +msgstr "Bloc %1$s. Colonne %2$d. %3$s" + +#. translators: accessibility text. %s: The block title, %d The block column +#. number. +#: wp-includes/js/dist/blocks.js:6894 +msgid "%s Block. Column %d" +msgstr "%s Bloc. Colonne %d" + +#. translators: accessibility text. %1: The block title. %2: The block label. +#: wp-includes/js/dist/blocks.js:6900 +msgid "%1$s Block. %2$s" +msgstr "Bloc %1$s. %2$s" + +#. translators: accessibility text. %s: The block title. +#: wp-includes/js/dist/blocks.js:6905 +msgid "%s Block" +msgstr "Bloc %s" + +#: wp-includes/js/dist/edit-post.js:6471 +msgid "Open block settings" +msgstr "Ouvrir les réglages du bloc" + +#: wp-includes/js/dist/edit-post.js:6471 +msgid "Open document settings" +msgstr "Ouvrir les réglages du document" + +#: wp-includes/js/dist/edit-post.js:6372 +msgid "Here's a detailed guide." +msgstr "Voici un guide détaillé." + +#: wp-includes/js/dist/edit-post.js:6370 +msgid "New to the Block Editor? Want to learn more about using it? " +msgstr "Vous découvrez l’éditeur de blocs ? Vous souhaitez en savoir plus sur son utilisation ?" + +#: wp-includes/js/dist/edit-post.js:6366 +msgid "Learn how to use the Block Editor" +msgstr "Apprenez à utiliser l’éditeur de blocs" + +#: wp-includes/js/dist/edit-post.js:6358 +msgid "All of the blocks available to you live in the Block Library. You’ll find it wherever you see the icon." +msgstr "Tous les blocs disponibles se trouvent dans la bibliothèque de blocs. Vous la retrouverez partout où vous verrez l’icône ." + +#: wp-includes/js/dist/edit-post.js:6354 +msgid "Get to know the Block Library" +msgstr "Découvrir la bibliothèque de blocs" + +#: wp-includes/js/dist/edit-post.js:6350 +msgid "Each block comes with its own set of controls for changing things like color, width, and alignment. These will show and hide automatically when you have a block selected." +msgstr "Chaque bloc vient avec ses propres options pour modifier des paramètres tels que la couleur, la taille ou encore l’alignement. Elles s’affichent et se masquent automatiquement lorsque le bloc est sélectionné ou désélectionné." + +#: wp-includes/js/dist/edit-post.js:6346 +msgid "Make each block your own" +msgstr "Appropriez-vous chaque bloc" + +#: wp-includes/js/dist/edit-post.js:6342 +msgid "In the WordPress editor, each paragraph, image, or video is presented as a distinct “block” of content." +msgstr "Dans l’éditeur de WordPress, chaque paragraphe, image ou vidéo est présenté avec un « bloc » de contenu distinct." + +#: wp-includes/js/dist/edit-post.js:5497 wp-admin/edit-form-advanced.php:143 +msgid "View post" +msgstr "Voir la publication" + +#: wp-includes/js/dist/edit-post.js:6329 wp-includes/js/dist/edit-post.js:6338 +msgid "Welcome to the Block Editor" +msgstr "Bienvenue dans l’éditeur" + +#: wp-includes/js/dist/edit-post.js:6330 +msgid "Get started" +msgstr "Commencer" + +#: wp-includes/js/dist/edit-post.js:6295 +msgid "inserter" +msgstr "outil d’insertion" + +#: wp-includes/js/dist/edit-post.js:3881 wp-includes/js/dist/edit-post.js:5654 +msgid "Page attributes" +msgstr "Attributs de page" + +#: wp-includes/js/dist/edit-post.js:1389 wp-includes/js/dist/edit-post.js:6371 +msgid "https://wordpress.org/support/article/wordpress-editor/" +msgstr "https://wordpress.org/support/article/wordpress-editor/" + +#: wp-includes/js/dist/edit-post.js:1352 +msgid "Welcome Guide" +msgstr "Guide de bienvenue" + +#: wp-includes/js/dist/edit-post.js:1293 wp-includes/js/dist/edit-post.js:3178 +msgid "Keyboard shortcuts" +msgstr "Raccourcis clavier" + +#: wp-includes/js/dist/block-editor.js:25282 +msgid "Remove multiple selected blocks." +msgstr "Retirer les blocs sélectionnés." + +#. translators: 1: Type of block (i.e. Text, Image etc), 2: Position of +#. selected block, 3: New position +#: wp-includes/js/dist/block-editor.js:23700 +#: wp-includes/js/dist/block-editor.js:23740 +msgid "Move %1$s block from position %2$d left to position %3$d" +msgstr "Déplacer le bloc %1$s de la position %2$d à gauche à la position %3$d" + +#. translators: 1: Type of block (i.e. Text, Image etc), 2: Position of +#. selected block, 3: New position +#: wp-includes/js/dist/block-editor.js:23705 +#: wp-includes/js/dist/block-editor.js:23745 +msgid "Move %1$s block from position %2$d right to position %3$d" +msgstr "Déplacer le bloc %1$s de la position %2$d à droite à la position %3$d" + +#: wp-includes/js/dist/block-editor.js:22530 +msgid "Tools offer different interactions for block selection & editing. To select, press Escape, to go back to editing, press Enter." +msgstr "Les outils offrent différentes interactions pour la sélection et la modification. Pour sélectionner, appuyez sur la touche Echap. Pour revenir à la modification, appuyez sur la touche Entrée." + +#: wp-includes/js/dist/block-editor.js:21565 +msgid "Large screens" +msgstr "Écrans larges" + +#: wp-includes/js/dist/block-editor.js:21562 +msgid "Medium screens" +msgstr "Écrans moyens" + +#: wp-includes/js/dist/block-editor.js:21559 +msgid "Small screens" +msgstr "Petits écrans" + +#: wp-includes/js/dist/block-editor.js:21577 +msgid "Toggle between using the same value for all screen sizes or using a unique value per screen size." +msgstr "Permuter entre l’utilisation de la même valeur pour toutes les tailles d’écrans ou l’utilisation d’une valeur unique pour chaque taille." + +#: wp-includes/js/dist/block-editor.js:21511 +msgctxt "Text labelling a interface as controlling a given layout property (eg: margin) for a given screen size." +msgid "Controls the %1$s property for %2$s viewports." +msgstr "Contrôler la propriété %1$s pour les surfaces de fenêtre %2$s." + +#: wp-includes/js/dist/block-editor.js:21574 +msgid "Use the same %s on all screensizes." +msgstr "Utiliser le même %s pour toutes les tailles d’écrans." + +#: wp-includes/js/dist/block-editor.js:20909 +msgid "Open Media Library" +msgstr "Ouvrir la bibliothèque de médias" + +#: wp-includes/js/dist/block-editor.js:20056 +msgid "Recently updated" +msgstr "Récemment mis à jour" + +#: wp-includes/js/dist/block-editor.js:19707 +msgid "Press ENTER to add this link" +msgstr "Appuyer sur ENTRÉE pour ajouter ce lien" + +#: wp-includes/js/dist/block-editor.js:20816 +msgid "The media file has been replaced" +msgstr "Le fichier média a été remplacé." + +#: wp-includes/js/dist/block-editor.js:20104 +msgid "Currently selected" +msgstr "Actuellement sélectionné" + +#: wp-includes/js/dist/block-editor.js:19788 +msgid "Search or type url" +msgstr "Rechercher ou saisir une URL" + +#: wp-includes/js/dist/block-editor.js:19657 +msgid "Currently selected link settings" +msgstr "Réglages du lien actuellement sélectionné" + +#: wp-includes/js/dist/block-editor.js:19191 +msgid "Image size" +msgstr "Taille de l’image" + +#: wp-includes/js/dist/block-editor.js:19059 +msgid "Gradient Presets" +msgstr "Préréglages de dégradé" + +#: wp-includes/js/dist/block-editor.js:18992 +msgid "Editor footer" +msgstr "Éditeur de pied de page" + +#: wp-includes/js/dist/block-editor.js:18186 +#: wp-includes/js/dist/block-editor.js:18440 +msgctxt "Generic label for block inserter button" +msgid "Add block" +msgstr "Ajouter un bloc" + +#. translators: %s: the name of the block when there is only one +#: wp-includes/js/dist/block-editor.js:18184 +#: wp-includes/js/dist/block-editor.js:18438 +msgctxt "directly add the only allowed block" +msgid "Add %s" +msgstr "Ajouter %s" + +#. translators: %s: the name of the block that has been added +#: wp-includes/js/dist/block-editor.js:18132 +#: wp-includes/js/dist/block-editor.js:18391 +msgid "%s block added" +msgstr "Bloc %s ajouté" + +#: wp-includes/js/dist/block-editor.js:18709 +msgid "Choose variation" +msgstr "Choisir une variante" + +#: wp-includes/js/dist/block-editor.js:18711 +msgid "Select a variation to start with." +msgstr "Sélectionner une variante avec laquelle commencer." + +#: wp-includes/js/dist/block-editor.js:15305 +msgid "Multiple selected blocks" +msgstr "Multiples blocs sélectionnés" + +#: wp-includes/js/dist/block-editor.js:11446 +msgid "You are currently in edit mode. To return to the navigation mode, press Escape." +msgstr "Vous êtes actuellement en mode modification. Pour revenir au mode navigation, appuyez sur la touche Echap." + +#: wp-includes/js/dist/block-editor.js:8823 +msgid "Midnight" +msgstr "Minuit" + +#: wp-includes/js/dist/block-editor.js:8815 +msgid "Pale ocean" +msgstr "Océan pâle" + +#: wp-includes/js/dist/block-editor.js:8819 +msgid "Electric grass" +msgstr "Herbe électrique" + +#: wp-includes/js/dist/block-editor.js:8811 +msgid "Luminous dusk" +msgstr "Crépuscule lumineux" + +#: wp-includes/js/dist/block-editor.js:8807 +msgid "Blush bordeaux" +msgstr "Bordeaux rougissant" + +#: wp-includes/js/dist/block-editor.js:11444 +msgid "You are currently in navigation mode. Navigate blocks using the Tab key. To exit navigation mode and edit the selected block, press Enter." +msgstr "Vous êtes actuellement en mode navigation. Vous pouvez naviguer entre les blocs à l’aide de la touche Tabulation. Pour sortir du mode navigation et modifier le bloc sélectionné, appuyez sur Entrée." + +#: wp-includes/js/dist/block-editor.js:8803 +msgid "Blush light purple" +msgstr "Violet clair rougissant" + +#: wp-includes/js/dist/block-editor.js:8799 +msgid "Cool to warm spectrum" +msgstr "Spectre froid vers chaud" + +#: wp-includes/js/dist/block-editor.js:8795 +msgid "Very light gray to cyan bluish gray" +msgstr "Gris très clair vers gris-cyan bleuissant" + +#: wp-includes/js/dist/block-editor.js:8791 +msgid "Luminous vivid orange to vivid red" +msgstr "Orange vif lumineux vers rouge lumineux" + +#: wp-includes/js/dist/block-editor.js:8787 +msgid "Luminous vivid amber to luminous vivid orange" +msgstr "Ambre vif lumineux vers orange vif" + +#: wp-includes/js/dist/block-editor.js:8783 +msgid "Light green cyan to vivid green cyan" +msgstr "Vert-cyan clair vers vert-cyan vif" + +#: wp-includes/js/dist/block-editor.js:8779 +msgid "Vivid cyan blue to vivid purple" +msgstr "Bleu-cyan vif vers violet vif" + +#: wp-includes/js/dist/block-editor.js:8496 +msgid "Block breadcrumb" +msgstr "Ascendance du bloc" + +#: wp-includes/js/dist/block-editor.js:7300 +msgid "(%s: gradient %s)" +msgstr "(%s : dégradé %s)" + +#: wp-includes/js/dist/block-editor.js:7297 +msgid "(%s: color %s)" +msgstr "(%s : couleur %s)" + +#: wp-includes/js/dist/block-editor.js:7226 +#: wp-includes/js/dist/block-editor.js:19113 +msgid "Gradient" +msgstr "Dégradé" + +#: wp-includes/js/dist/block-editor.js:7219 +msgid "Solid" +msgstr "Pleine" + +#: wp-includes/js/dist/block-editor.js:7143 +msgid "(Gradient: %s)" +msgstr "(Dégradé : %s)" + +#: wp-includes/js/dist/block-editor.js:7140 +msgid "(Color: %s)" +msgstr "(Couleur : %s)" + +#: wp-includes/js/dist/editor.js:11253 wp-admin/edit-tags.php:446 +#: wp-admin/includes/meta-boxes.php:875 wp-admin/includes/meta-boxes.php:1547 +#: wp-admin/includes/class-wp-terms-list-table.php:184 +#: wp-admin/includes/class-wp-terms-list-table.php:652 +#: wp-admin/includes/class-wp-posts-list-table.php:1549 +#: wp-admin/edit-tag-form.php:138 +msgid "Slug" +msgstr "Slug" + +#: wp-includes/js/dist/editor.js:9392 +msgid "Update…" +msgstr "Mise à jour…" + +#: wp-includes/js/dist/editor.js:9390 +msgid "Submit for Review…" +msgstr "Envoyer pour relecture…" + +#: wp-includes/js/dist/editor.js:9301 +msgid "Pending review" +msgstr "En attente de relecture" + +#: wp-includes/js/dist/editor.js:8212 wp-admin/includes/meta-boxes.php:694 +msgid "https://wordpress.org/support/article/excerpt/" +msgstr "https://wordpress.org/support/article/excerpt/" + +#: wp-includes/js/dist/editor.js:7356 +msgid "Select items to save." +msgstr "Sélectionner des éléments à enregistrer." + +#: wp-includes/js/dist/editor.js:7352 +msgid "What do you want to save?" +msgstr "Que voulez-vous enregistrer ?" + +#: wp-includes/js/dist/components.js:38424 +#: wp-includes/js/dist/components.js:38441 +msgid "Finish" +msgstr "Terminé" + +#: wp-includes/js/dist/components.js:38313 +msgid "Page %1$d of %2$d" +msgstr "Page %1$d sur %2$d" + +#. translators: %s: The name of the gradient e.g: "Angular red to blue". +#: wp-includes/js/dist/components.js:37720 +msgid "Gradient: %s" +msgstr "Gradient : %s" + +#. translators: %s: gradient code e.g: "linear-gradient(90deg, +#. rgba(98,16,153,1) 0%, rgba(172,110,22,1) 100%);". +#: wp-includes/js/dist/components.js:37711 +#: wp-includes/js/dist/components.js:37721 +msgid "Gradient code: %s" +msgstr "Code de dégradé : %s" + +#: wp-includes/js/dist/components.js:37637 +msgid "Radial Gradient" +msgstr "Dégradé radial" + +#: wp-includes/js/dist/components.js:37632 +msgid "Linear Gradient" +msgstr "Dégradé linéaire" + +#: wp-includes/js/dist/components.js:36953 +msgid "Use your left or right arrow keys or drag and drop with the mouse to change the gradient position. Press the button to change the color or remove the control point." +msgstr "Utiliser les touches gauche ou droite ou glisser puis déposer avec la souris pour modifier la position du dégradé. Appuyer sur le bouton pour changer la couleur ou retirer le point de contrôle." + +#: wp-includes/js/dist/components.js:37053 +msgid "Remove Control Point" +msgstr "Retirer le point de contrôle" + +#: wp-includes/js/dist/components.js:38300 +msgid "Guide controls" +msgstr "Contrôleurs de guide" + +#: wp-includes/js/dist/components.js:35299 +msgid "Preset size" +msgstr "Taille prédéfinie" + +#. translators: %1$s: gradient position e.g: 70%, %2$s: gradient color code +#. e.g: rgb(52,121,151). +#: wp-includes/js/dist/components.js:36941 +msgid "Gradient control point at position %1$s with color code %2$s." +msgstr "Point de contrôle du dégradé à la position %1$s avec le code couleur %2$s." + +#: wp-includes/js/dist/components.js:33396 +msgid "Small" +msgstr "Petit" + +#: wp-includes/js/dist/components.js:33405 +msgid "Extra Large" +msgstr "Très grand" + +#: wp-includes/js/dist/components.js:23619 +msgid "Angle" +msgstr "Angle" + +#. translators: 1: Post status, 2: Capability name. +#: wp-includes/capabilities.php:246 +msgid "The post status %1$s is not registered, so it may not be reliable to check the capability \"%2$s\" against a post with that status." +msgstr "L’état %1$s de la publication n’est pas enregistré et pourrait ne pas être fiable lors de la vérification de la capacité « %2$s » d’une publication ayant ce statut." + +#. translators: %s: Comment link. +#: wp-includes/comment-template.php:980 +#: wp-admin/includes/class-wp-comments-list-table.php:798 +#: wp-admin/comment.php:196 +msgid "In reply to %s." +msgstr "En réponse à %s." + +#: wp-includes/general-template.php:2241 +msgid "Previous and next months" +msgstr "Mois précédents et suivants" + +#: wp-includes/option.php:2149 +msgid "When registering an \"array\" setting to show in the REST API, you must specify the schema for each array item in \"show_in_rest.schema.items\"." +msgstr "Quand vous enregistrez une métadonnée de type « tableau » pour l’afficher dans l’API REST, vous devez spécifier la description de chaque élément du tableau dans « show_in_rest.schema.items »." + +#: wp-includes/user.php:3102 +msgid "Expiration" +msgstr "Expiration" + +#: wp-includes/user.php:3105 +msgid "Last Login" +msgstr "Dernière connexion" + +#: wp-includes/user.php:3126 +msgid "Session Tokens" +msgstr "Jetons de session" + +#: wp-includes/user.php:3104 +msgid "User Agent" +msgstr "Agent utilisateur" + +#: wp-includes/user.php:3127 +msgid "User’s Session Tokens data." +msgstr "Données des jetons de session de l’utilisateur." + +#: wp-includes/user.php:3092 +msgid "User’s location data used for the Community Events in the WordPress Events and News dashboard widget." +msgstr "Données de localisation de l’utilisateur utilisées pour les événements de la communauté affichées dans les widgets évènements WordPress et actualités du tableau de bord." + +#: wp-includes/user.php:3071 +msgid "City" +msgstr "Ville" + +#: wp-includes/user.php:3072 +msgid "Country" +msgstr "Pays" + +#: wp-includes/user.php:3074 +msgid "Longitude" +msgstr "Longitude" + +#: wp-includes/user.php:3073 +msgid "Latitude" +msgstr "Latitude" + +#: wp-includes/user.php:3075 wp-includes/user.php:3103 +msgid "IP" +msgstr "IP" + +#: wp-includes/user.php:3091 +msgid "Community Events Location" +msgstr "Localisation des événements communautaires" + +#. translators: %s: wp_privacy_additional_user_profile_data +#: wp-includes/user.php:3047 +msgid "Filter %s returned items with reserved names." +msgstr "Le filtre %s a retourné des éléments avec des noms réservés." + +#: wp-includes/media-template.php:430 wp-includes/media-template.php:625 +#: wp-admin/includes/media.php:3406 +msgid "Original image:" +msgstr "Image d’origine :" + +#: wp-includes/cron.php:831 +msgid "Once Weekly" +msgstr "Une fois par semaine" + +#. translators: Comment moderation. %s: Parent comment edit URL. +#. translators: %s: Comment link. +#: wp-includes/pluggable.php:1616 wp-includes/pluggable.php:1800 +#: wp-admin/edit-form-comment.php:177 +msgid "In reply to: %s" +msgstr "En réponse à : %s" + +#: wp-includes/pluggable.php:1259 +msgid "HTTP redirect status code must be a redirection code, 3xx." +msgstr "L’état du code de redirection HTTP doit être un code de redirection de type 3xx." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2427 +msgid "Please use register_rest_field to add new schema properties." +msgstr "Veuillez utiliser register_rest_field pour ajouter de nouvelles propriétés de schéma." + +#. translators: 1. The taxonomy name, 2. The property name, either 'rest_base' +#. or 'name', 3. The conflicting value. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2383 +msgid "The \"%1$s\" taxonomy \"%2$s\" property (%3$s) conflicts with an existing property on the REST API Posts Controller. Specify a custom \"rest_base\" when registering the taxonomy to avoid this error." +msgstr "La propriété « %2$s » de la taxonomie « %1$s » (%3$s) ne fonctionne pas avec l’une des propriétés déjà existantes sur le contrôleur de publications de l’API REST. Spécifiez une « rest_base » personnalisée lors de l’enregistrement de la taxonomie pour éviter cette erreur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2708 +msgid "Limit result set based on relationship between multiple taxonomies." +msgstr "Limiter le jeu de résultats en se basant sur les correspondances entre plusieurs taxonomies." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:452 +msgid "Whether the theme can manage the document title tag." +msgstr "Détermine si le thème gère les étiquettes de titre du document." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:425 +msgid "Allows use of html5 markup for search forms, comment forms, comment lists, gallery, and caption." +msgstr "Permet l’utilisation du balisage HTML5 dans les formulaires de recherche, formulaires de commentaires, listes de commentaires, galeries et légendes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:456 +msgid "Whether theme opts in to default WordPress block styles for viewing." +msgstr "Détermine si le thème utilise le style des blocs WordPress par défaut pour l’aperçu." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:311 +msgid "Custom logo if defined by the theme." +msgstr "Logo personnalisé si défini par le thème." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:247 +msgid "Custom background if defined by the theme." +msgstr "Arrière-plan personnalisé si défini par le thème." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:209 +msgid "Custom header if defined by the theme." +msgstr "En-tête personnalisé si défini par le thème." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:205 +msgid "Whether posts and comments RSS feed links are added to head." +msgstr "Si les liens vers les flux RSS des articles et des commentaires sont ajoutés à l’en-tête." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:348 +msgid "Whether the theme disables custom font sizes." +msgstr "Si le thème désactive les tailles de police personnalisées ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:344 +msgid "Whether the theme disables custom colors." +msgstr "Si le thème désactive les couleurs personnalisées ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:394 +msgid "Custom gradient presets if defined by the theme." +msgstr "Pré-réglages de dégradés personnalisés si définis par le thème." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:375 +msgid "Custom font sizes if defined by the theme." +msgstr "Taille de police personnalisée si définie par le thème." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:356 +msgid "Custom color palette if defined by the theme." +msgstr "Palette de couleurs personnalisée si définie par le thème." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:340 +msgid "Whether theme opts in to the dark editor style UI." +msgstr "Détermine si le thème opte pour l’interface utilisateur sombre pour l’éditeur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:413 +msgid "Whether theme opts in to the editor styles CSS wrapper." +msgstr "Détermine si le thème utilise les styles CSS d’encapsulage sur l’éditeur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:336 +msgid "Whether the theme enables Selective Refresh for Widgets being managed with the Customizer." +msgstr "Détermine si le thème autorise le rafraîchissement sélectif des widgets par l’outil de personnalisation." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:352 +msgid "Whether the theme disables custom gradients." +msgstr "Si le thème désactive les dégradés personnalisés." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:201 +msgid "Whether theme opts in to wide alignment CSS class." +msgstr "Détermine si le thème utilise des classes CSS pour les alignements larges." + +#: wp-includes/class-wp-xmlrpc-server.php:1645 +#: wp-includes/class-wp-xmlrpc-server.php:5062 +#: wp-includes/class-wp-xmlrpc-server.php:5555 +msgid "Sorry, the post could not be created." +msgstr "Désolé, cette publication n’a pas pu être créée." + +#: wp-includes/class-wp-xmlrpc-server.php:4989 +#: wp-includes/class-wp-xmlrpc-server.php:5002 +msgid "Sorry, this method is not supported." +msgstr "Désolé, cette méthode n’est pas prise en charge." + +#: wp-includes/script-loader.php:1365 +msgid "Widget has been added to the selected sidebar" +msgstr "Le widget a été ajouté à la colonne latérale sélectionnée" + +#. translators: Minimum input length in characters to start searching posts in +#. the "Insert/edit link" modal. +#: wp-includes/script-loader.php:1125 +msgctxt "minimum input length for searching post links" +msgid "3" +msgstr "3" + +#: wp-includes/script-loader.php:865 +msgid "Post-processing of the image failed likely because the server is busy or does not have enough resources. Uploading a smaller image may help. Suggested maximum size is 2500 pixels." +msgstr "L’enregistrement de l’image a échoué, probablement car le serveur est occupé ou ne dispose pas d’assez de ressources. Téléverser une image plus petite pourrait aider. La taille maximum recommandée est de 2500 pixels." + +#: wp-login.php:843 +msgid "Please enter your username or email address. You will receive an email message with instructions on how to reset your password." +msgstr "Merci de renseigner votre identifiant ou votre adresse de messagerie. Vous recevrez un e-mail contenant les instructions vous permettant de réinitialiser votre mot de passe." + +#: wp-includes/js/dist/api-fetch.js:741 +msgid "Media upload failed. If this is a photo or a large image, please scale it down and try again." +msgstr "Le téléversement du média a échoué. S’il s’agit d’une photo ou d’une grande image, veuillez la redimensionner puis réessayer." + +#: wp-includes/js/dist/edit-post.js:1219 +msgid "All content copied." +msgstr "Tout le contenu a été copié." + +#: wp-includes/js/dist/block-editor.js:18005 +msgid "No Preview Available." +msgstr "Aucun aperçu disponible." + +#. translators: Accessibility text. +#: wp-includes/media-template.php:194 +msgid "Selected media actions" +msgstr "Actions des médias sélectionnés." + +#: wp-includes/media-template.php:183 +msgctxt "media modal menu" +msgid "Menu" +msgstr "Menu" + +#: wp-includes/media-template.php:181 +msgctxt "media modal menu actions" +msgid "Actions" +msgstr "Actions" + +#: wp-includes/post.php:2767 +msgctxt "file type group" +msgid "Archives" +msgstr "Archives" + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:653 +msgid "List of the missing image sizes of the attachment." +msgstr "Listes des tailles d’image manquantes pour le fichier joint." + +#: wp-includes/user.php:152 +msgid "Unknown username. Check again or try your email address." +msgstr "Identifiant inconnu. Vérifiez l’orthographe ou essayez avec votre adresse e-mail." + +#: wp-includes/user.php:231 +msgid "Unknown email address. Check again or try your username." +msgstr "Adresse e-mail inconnue. Vérifiez l’orthographe ou essayez avec votre identifiant." + +#: wp-includes/script-loader.php:1430 +msgid "The personal data export link for this user was sent." +msgstr "Le lien d’exportation des données personnelles pour cet utilisateur a été envoyé." + +#: wp-includes/media.php:4005 +msgid "Media list" +msgstr "Liste des médias" + +#. translators: %s: Number of selected media attachments. +#: wp-includes/js/media-views.js:8605 +msgid "%s item selected" +msgid_plural "%s items selected" +msgstr[0] "%s élément sélectionné" +msgstr[1] "%s éléments sélectionnés" + +#: wp-includes/media.php:4004 +msgid "Filter Media" +msgstr "Filtrer les médias" + +#: wp-includes/js/dist/block-editor.js:18583 +#: wp-includes/js/dist/block-editor.js:18660 +msgid "Block navigation" +msgstr "Bloc navigation" + +#: wp-includes/js/dist/block-library.js:15786 +msgid "Sorting and filtering" +msgstr "Tri et filtrage" + +#: wp-includes/js/dist/format-library.js:648 +msgid "Inline Code" +msgstr "Code en ligne" + +#: wp-includes/js/dist/block-library.js:15848 +#: wp-includes/js/dist/block-library.js:18229 +msgid "Grid view" +msgstr "Vue grille" + +#: wp-includes/js/dist/block-library.js:15839 +#: wp-includes/js/dist/block-library.js:18220 +msgid "List view" +msgstr "Vue liste" + +#: wp-includes/js/dist/block-library.js:22471 +msgid "Logos Only" +msgstr "Logos uniquement" + +#: wp-includes/js/dist/block-library.js:23591 +msgid "Enter address" +msgstr "Saisir l’adresse" + +#: wp-includes/js/dist/block-library.js:22474 +msgid "Pill Shape" +msgstr "Forme de pastille" + +#: wp-includes/js/dist/block-library.js:15730 +msgid "Post meta settings" +msgstr "Réglages des métas de la publication" + +#: wp-includes/js/dist/block-library.js:15697 +msgid "Post content" +msgstr "Contenu de la publication" + +#: wp-includes/js/dist/block-library.js:15695 +msgid "Post content settings" +msgstr "Réglages de contenu de publication" + +#: wp-includes/js/dist/block-library.js:21352 +msgid "Play inline" +msgstr "Lancer directement" + +#: wp-includes/js/dist/block-library.js:21608 +msgid "The current poster image url is %s" +msgstr "L’URL de l’image de bannière actuelle est %s" + +#: wp-includes/js/dist/block-library.js:21608 +msgid "There is no poster image currently selected" +msgstr "Il n’y a actuellement aucune image de bannière sélectionnée" + +#: wp-includes/js/dist/block-library.js:8940 +msgid "Note: Autoplaying audio may cause usability issues for some visitors." +msgstr "Remarque : la lecture automatique de sons peut causer des problèmes d’utilisabilité pour certains utilisateurs." + +#: wp-includes/js/dist/block-library.js:11404 +msgid "Column settings" +msgstr "Réglages de la colonne" + +#: wp-includes/js/dist/block-library.js:11406 +msgid "Percentage width" +msgstr "Largeur en pourcentage" + +#: wp-includes/js/dist/block-library.js:21325 +msgid "Note: Autoplaying videos may cause usability issues for some visitors." +msgstr "Remarque : la lecture automatique de vidéo peut créer des problèmes d’utilisabilité pour certains visiteurs." + +#: wp-includes/js/dist/block-editor.js:24038 +#: wp-includes/js/dist/block-editor.js:24044 +msgid "Move left" +msgstr "Déplacer à gauche" + +#: wp-includes/js/dist/block-editor.js:24038 +#: wp-includes/js/dist/block-editor.js:24044 +msgid "Move right" +msgstr "Déplacer à droite" + +#. translators: example text. +#: wp-includes/js/dist/block-library.js:11340 +msgid "Etiam et egestas lorem. Vivamus sagittis sit amet dolor quis lobortis. Integer sed fermentum arcu, id vulputate lacus. Etiam fermentum sem eu quam hendrerit." +msgstr "Etiam et egestas lorem. Vivamus sagittis sit amet dolor quis lobortis. Integer sed fermentum arcu, id vulputate lacus. Etiam fermentum sem eu quam hendrerit." + +#. translators: example text. +#: wp-includes/js/dist/block-library.js:11346 +msgid "Nam risus massa, ullamcorper consectetur eros fermentum, porta aliquet ligula. Sed vel mauris nec enim." +msgstr "Nam risus massa, ullamcorper consectetur eros fermentum, porta aliquet ligula. Sed vel mauris nec enim." + +#: wp-includes/js/dist/block-library.js:11194 +msgid "Two columns; one-third, two-thirds split" +msgstr "Deux colonnes : un tiers/deux tiers" + +#: wp-includes/js/dist/block-library.js:11213 +msgid "Two columns; two-thirds, one-third split" +msgstr "Deux colonnes : deux tiers/un tiers" + +#: wp-includes/js/dist/block-library.js:11232 +msgid "Three columns; equal split" +msgstr "Trois colonnes ; largeur égale" + +#: wp-includes/js/dist/block-library.js:11246 +msgid "Three columns; wide center column" +msgstr "Trois colonnes ; colonne centrale large" + +#: wp-includes/js/dist/block-library.js:11178 +msgid "Two columns; equal split" +msgstr "Deux colonnes ; largeur égale" + +#: wp-includes/js/dist/block-library.js:9896 +msgid "Call to Action" +msgstr "Appel à l’action" + +#: wp-includes/js/dist/block-library.js:14320 +msgid "Welcome to the wonderful world of blocks…" +msgstr "Bienvenue dans le monde merveilleux des blocs…" + +#: wp-includes/js/dist/block-library.js:9906 +msgid "Fill" +msgstr "Remplir" + +#: wp-includes/js/dist/block-library.js:9580 +msgid "Border radius" +msgstr "Rayon de la bordure" + +#: wp-includes/js/dist/block-library.js:9745 +msgid "Link rel" +msgstr "Attribut rel" + +#: wp-includes/js/dist/block-library.js:16031 +msgid "Start value" +msgstr "Valeur de départ" + +#: wp-includes/js/dist/block-library.js:6912 +msgid "cite" +msgstr "citer" + +#: wp-includes/js/dist/block-library.js:6915 +msgid "In quoting others, we cite ourselves." +msgstr "En citant les autres, nous nous citons nous mêmes." + +#: wp-includes/js/dist/block-library.js:16044 +msgid "Reverse list numbering" +msgstr "Inverser le numérotage de la liste" + +#: wp-includes/js/dist/block-library.js:16029 +msgid "Ordered list settings" +msgstr "Réglages de liste ordonnée" + +#. translators: Quote serving as example for the Pullquote block. Attributed to +#. Matt Mullenweg. +#: wp-includes/js/dist/block-library.js:17700 +msgid "One of the hardest things to do in technology is disrupt yourself." +msgstr "L’une des choses les plus difficiles à faire dans le monde des technologies est de se réinventer soi-même." + +#: wp-includes/js/dist/block-library.js:13787 +msgid "Upload a file or pick one from your media library." +msgstr "Téléversez un fichier ou choisissez-en un dans votre bibliothèque de médias." + +#: wp-includes/js/dist/block-editor.js:19624 +#: wp-includes/js/dist/block-editor.js:22890 +#: wp-includes/js/dist/block-library.js:9741 +#: wp-includes/js/dist/block-library.js:13578 +msgid "Open in new tab" +msgstr "Ouvrir dans un nouvel onglet" + +#: wp-includes/js/dist/block-library.js:20510 +msgid "Header section" +msgstr "Section d’en-tête" + +#: wp-includes/js/dist/block-library.js:20514 +msgid "Footer section" +msgstr "Section de pied de page" + +#: wp-includes/js/dist/block-library.js:20460 +msgid "Insert a table for sharing data." +msgstr "Insérer un tableau pour partager des données." + +#: wp-includes/js/dist/block-library.js:20482 +msgid "Create Table" +msgstr "Créer un tableau" + +#: wp-includes/js/dist/block-library.js:12339 +msgid "Upload an image or video file, or pick one from your media library." +msgstr "Téléversez un fichier image ou vidéo, ou sélectionnez-en un dans la bibliothèque de médias." + +#: wp-includes/js/dist/block-library.js:19944 +msgid "Align Column Left" +msgstr "Aligner la colonne à gauche" + +#: wp-includes/js/dist/block-library.js:19948 +msgid "Align Column Center" +msgstr "Centrer la colonne" + +#: wp-includes/js/dist/block-library.js:19952 +msgid "Align Column Right" +msgstr "Aligner la colonne à droite" + +#: wp-includes/js/dist/block-library.js:20495 +msgid "Change column alignment" +msgstr "Modifier l’alignement des colonnes" + +#: wp-includes/js/dist/block-library.js:20847 +msgid "Jazz Musician" +msgstr "Musicien de jazz" + +#: wp-includes/js/dist/block-library.js:20850 +msgid "Release Date" +msgstr "Date de sortie" + +#: wp-includes/js/dist/block-library.js:20862 +msgid "May 7, 2019" +msgstr "7 mai 2019" + +#: wp-includes/js/dist/block-library.js:13566 +msgid "Attachment page" +msgstr "Page de fichier joint" + +#: wp-includes/js/dist/block-library.js:20884 +msgid "December 6, 2018" +msgstr "6 décembre 2018" + +#: wp-includes/js/dist/block-library.js:20873 +msgid "February 21, 2019" +msgstr "21 février 2019" + +#: wp-includes/js/dist/block-library.js:12682 +msgid "Snow Patrol" +msgstr "Patrouille des neiges" + +#: wp-includes/js/dist/block-library.js:12294 +msgid "Clear Media" +msgstr "Effacer le média" + +#: wp-includes/js/dist/block-library.js:12021 +msgid "Minimum height in pixels" +msgstr "Hauteur minimale en pixels" + +#. translators: Caption accompanying an image of the Mont Blanc, which serves +#. as an example for the Image block. +#: wp-includes/js/dist/block-library.js:5785 +msgid "Mont Blanc appears—still, snowy, and serene." +msgstr "Luire, ô lac, dans ton beau miroir !" + +#: wp-includes/js/dist/block-library.js:15369 +msgid "— Kobayashi Issa (一茶)" +msgstr "— Paul Éluard (Onze Haï-kaïs, 1920)" + +#: wp-includes/js/dist/block-library.js:5250 +#: wp-includes/js/dist/block-library.js:15034 +msgid "Describe the purpose of the image" +msgstr "Décrivez l’objet de l’image" + +#: wp-includes/js/dist/block-library.js:5250 +#: wp-includes/js/dist/block-library.js:15034 +msgid "Leave empty if the image is purely decorative." +msgstr "Laisser vide si l’image est purement décorative." + +#: wp-includes/js/dist/block-library.js:15012 +msgid "Crop image to fill entire column" +msgstr "Recadrer l’image pour remplir toute la colonne" + +#: wp-includes/js/dist/block-library.js:7793 +msgid "Write gallery caption…" +msgstr "Écrire la légende de la galerie…" + +#: wp-includes/js/dist/block-library.js:15364 +msgid "The wren
Earns his living
Noiselessly." +msgstr "Une plume donne au chapeau
Un air de légèreté
La cheminée fume. " + +#: wp-includes/js/dist/block-library.js:6389 +msgid "Code is Poetry" +msgstr "Le code est une poésie." + +#: wp-includes/js/dist/block-library.js:7672 +msgid "Move image forward" +msgstr "Déplacer l’image vers l’avant" + +#: wp-includes/js/dist/block-library.js:7665 +msgid "Move image backward" +msgstr "Déplacer l’image vers l’arrière" + +#: wp-includes/js/dist/block-library.js:3598 +msgid "In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing." +msgstr "Dans un village de la Manche dont je ne veux pas me rappeler le nom, il n’y a pas longtemps que vivait un de ces hidalgos qui ont lance au râtelier, vieille rondache, maigre haridelle et limier de chasse." + +#: wp-includes/js/dist/block-library.js:18662 +msgid "Group" +msgstr "Groupe" + +#: wp-includes/js/dist/block-library.js:18664 +msgid "A block that groups other blocks." +msgstr "Un bloc qui groupe d’autres blocs." + +#: wp-includes/js/dist/block-library.js:18665 +msgid "container" +msgstr "contenant" + +#: wp-includes/js/dist/block-library.js:18665 +msgid "wrapper" +msgstr "conteneur" + +#: wp-includes/js/dist/block-library.js:18665 +msgid "row" +msgstr "ligne" + +#: wp-includes/js/dist/block-library.js:18665 +msgid "section" +msgstr "section" + +#: wp-includes/js/dist/server-side-render.js:558 +msgid "Block rendered as empty." +msgstr "Bloc devenu vide." + +#: wp-includes/js/dist/block-library.js:12776 +msgid "Paste a link to the content you want to display on your site." +msgstr "Collez un lien vers le contenu que vous souhaitez afficher sur votre site." + +#: wp-includes/js/dist/block-library.js:12792 +msgid "https://wordpress.org/support/article/embeds/" +msgstr "https://wordpress.org/support/article/embeds/" + +#: wp-includes/js/dist/block-library.js:12793 +msgid "Learn more about embeds" +msgstr "En apprendre plus à propos des contenus embarqués" + +#: wp-includes/js/dist/edit-post.js:3597 +msgid "Disable & Reload" +msgstr "Désactiver et recharger" + +#: wp-includes/js/dist/block-library.js:18676 +msgid "One." +msgstr "Un." + +#: wp-includes/js/dist/block-library.js:18683 +msgid "Two." +msgstr "Deux." + +#: wp-includes/js/dist/block-library.js:18690 +msgid "Three." +msgstr "Trois." + +#: wp-includes/js/dist/block-library.js:18697 +msgid "Four." +msgstr "Quatre." + +#: wp-includes/js/dist/block-library.js:18704 +msgid "Five." +msgstr "Cinq." + +#: wp-includes/js/dist/block-library.js:18711 +msgid "Six." +msgstr "Six." + +#: wp-includes/js/dist/block-editor.js:26351 +msgid "Separate multiple classes with spaces." +msgstr "Dans le cas de plusieurs classes, séparez-les avec des espaces." + +#: wp-includes/js/dist/edit-post.js:4501 +msgid "More tools & options" +msgstr "Davantage d’outils et options" + +#: wp-includes/js/dist/block-editor.js:26247 +msgid "Enter a word or two — without spaces — to make a unique web address just for this heading, called an “anchor.” Then, you’ll be able to link directly to this section of your page." +msgstr "Saisir un mot ou deux sans utiliser d’espaces pour créer une adresse web unique – une ancre – pour ce titre. Ensuite, vous pourrez créer des liens directement vers cette section de votre page." + +#: wp-includes/js/dist/block-editor.js:26249 +msgid "Learn more about anchors" +msgstr "En savoir plus sur les ancres" + +#: wp-includes/js/dist/edit-post.js:2913 +msgid "Display these keyboard shortcuts." +msgstr "Afficher ces raccourcis clavier." + +#: wp-includes/js/dist/edit-post.js:3588 +msgid "A page reload is required for this change. Make sure your content is saved before reloading." +msgstr "Un rechargement de page est nécessaire pour cette modification. Assurez-vous que votre contenu est enregistré avant de recharger." + +#: wp-includes/js/dist/edit-post.js:3597 +msgid "Enable & Reload" +msgstr "Activer et recharger" + +#: wp-includes/js/dist/edit-post.js:3853 +msgid "Pre-publish checks" +msgstr "Vérifications de pré-publication" + +#: wp-includes/js/dist/edit-post.js:3429 +msgid "%1$d block is disabled." +msgid_plural "%1$d blocks are disabled." +msgstr[0] "%1$d bloc est désactivé." +msgstr[1] "%1$d blocs sont désactivés." + +#: wp-includes/js/dist/edit-post.js:3856 +msgid "Inserter help panel" +msgstr "Panneau d’aide de l’outil d’insertion" + +#: wp-includes/js/dist/block-editor.js:23532 +msgid "Default Style" +msgstr "Style par défaut" + +#: wp-includes/js/dist/block-editor.js:21269 +#: wp-includes/js/dist/block-library.js:5201 +msgid "Upload an image file, pick one from your media library, or add one with a URL." +msgstr "Téléversez un fichier image, choisissez-en un dans votre bibliothèque de médias ou ajoutez-en un avec une URL." + +#: wp-includes/js/dist/block-editor.js:21271 +msgid "Upload a video file, pick one from your media library, or add one with a URL." +msgstr "Téléversez un fichier vidéo, choisissez-en un dans votre bibliothèque de médias ou ajoutez-en un avec une URL." + +#: wp-includes/js/dist/block-editor.js:18306 +msgid "Add a block" +msgstr "Ajouter un bloc" + +#: wp-includes/js/dist/block-editor.js:7465 +msgid "This color combination may be hard for people to read." +msgstr "Cette combinaison de couleurs risque d’être difficile à lire." + +#: wp-includes/js/dist/block-editor.js:18746 +msgid "Skip" +msgstr "Passer" + +#: wp-includes/js/dist/block-editor.js:21264 +msgid "Upload a media file or pick one from your media library." +msgstr "Téléversez un fichier média ou choisissez-en un dans votre bibliothèque de médias." + +#: wp-includes/js/dist/block-editor.js:21267 +msgid "Upload an audio file, pick one from your media library, or add one with a URL." +msgstr "Téléversez un fichier son, choisissez-en un dans votre bibliothèque de médias ou ajoutez-en un avec une URL." + +#: wp-includes/js/dist/block-editor.js:18011 +msgid "Browse through the library to learn more about what each block does." +msgstr "Parcourez la bibliothèque pour en savoir plus sur ce que fait chaque bloc." + +#: wp-includes/js/dist/block-editor.js:18011 +msgid "While writing, you can press / to quickly insert new blocks." +msgstr "Tandis que vous écrivez, vous pouvez utiliser la touche / pour insérer de nouveaux blocs." + +#: wp-includes/js/dist/block-editor.js:18011 +msgid "There are blocks available for all kinds of content: insert text, headings, images, lists, videos, tables, and lots more." +msgstr "Il existe des blocs pour toutes sortes de contenus : insérer du texte, des titres, des images, des listes, des vidéos, des tableaux, et bien plus encore." + +#: wp-includes/js/dist/block-editor.js:18813 +msgctxt "Block vertical alignment setting" +msgid "Vertically Align Top" +msgstr "Aligner verticalement en haut" + +#: wp-includes/js/dist/block-editor.js:18817 +msgctxt "Block vertical alignment setting" +msgid "Vertically Align Middle" +msgstr "Aligner verticalement au milieu" + +#: wp-includes/js/dist/block-editor.js:18821 +msgctxt "Block vertical alignment setting" +msgid "Vertically Align Bottom" +msgstr "Aligner verticalement en bas" + +#: wp-includes/js/dist/block-editor.js:18845 +msgctxt "Block vertical alignment setting label" +msgid "Change vertical alignment" +msgstr "Modifier l’alignement vertical" + +#: wp-includes/js/dist/block-editor.js:8710 +msgid "Vivid purple" +msgstr "Violet éclatant" + +#: wp-includes/js/dist/block-editor.js:18011 +msgid "Content blocks" +msgstr "Blocs de contenu" + +#: wp-includes/js/dist/block-editor.js:18011 +msgid "Welcome to the wonderful world of blocks! Blocks are the basis of all content within the editor." +msgstr "Bienvenue dans le monde merveilleux des blocs ! Les blocs sont la base de tous les contenus au sein de l’éditeur." + +#: wp-includes/js/dist/block-directory.js:1568 +msgid "No blocks found in your library. These blocks can be downloaded and installed:" +msgstr "Aucun bloc trouvé dans la bibliothèque. Ces blocs peuvent être téléchargés et installés :" + +#: wp-includes/js/dist/block-directory.js:1479 +#: wp-includes/js/dist/block-directory.js:1495 +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:62 +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:105 +#: wp-admin/includes/class-wp-privacy-data-export-requests-list-table.php:111 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:67 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:111 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:118 +msgid "Retry" +msgstr "Recommencez" + +#: wp-includes/js/dist/block-directory.js:1549 +#: wp-includes/js/dist/block-directory.js:1561 +msgid "No blocks found in your library." +msgstr "Aucun bloc trouvé dans votre bibliothèque." + +#: wp-includes/js/dist/block-directory.js:1492 +msgid "Block previews can't install." +msgstr "Les aperçus de bloc ne peuvent pas être installés." + +#: wp-includes/js/dist/block-directory.js:1476 +msgid "Block previews can’t load." +msgstr "Les aperçus de blocs ne peuvent pas se charger." + +#: wp-includes/js/dist/block-directory.js:1549 +msgid "Please contact your site administrator to install new blocks." +msgstr "Veuillez contacter votre administrateur ou votre administratrice pour installer de nouveaux blocs." + +#: wp-includes/js/dist/block-directory.js:1564 +msgid "No blocks found in your library. We did find %d block available for download." +msgid_plural "No blocks found in your library. We did find %d blocks available for download." +msgstr[0] "Aucun bloc trouvé dans la bibliothèque. Nous avons trouvé %d bloc disponible en téléchargement." +msgstr[1] "Aucun bloc trouvé dans la bibliothèque. Nous avons trouvé %d blocs disponibles en téléchargement." + +#: wp-includes/js/dist/block-directory.js:1546 +msgid "No blocks found in your library. Please contact your site administrator to install new blocks." +msgstr "Aucun bloc trouvé dans votre bibliothèque. Veuillez contacter l'administrateur de votre site afin d'installer de nouveaux blocs." + +#: wp-includes/js/dist/editor.js:13386 +msgctxt "verb" +msgid "Group" +msgstr "Grouper" + +#: wp-includes/js/dist/editor.js:13389 +msgctxt "Ungrouping blocks from within a Group block back into individual blocks within the Editor " +msgid "Ungroup" +msgstr "Dégrouper" + +#: wp-includes/js/dist/editor.js:7588 wp-admin/includes/template.php:2497 +msgid "Restore the backup" +msgstr "Restaurer la sauvegarde" + +#: wp-includes/js/dist/block-directory.js:1282 +msgid "Authored by %s" +msgstr "Écrit par %s" + +#: wp-includes/js/dist/block-directory.js:1330 +msgid "%d active installation" +msgid_plural "%d active installations" +msgstr[0] "%d installation active" +msgstr[1] "%d installations actives" + +#. translators: %d: number of ratings (number). +#: wp-includes/js/dist/block-directory.js:1212 +msgid "%d total rating" +msgid_plural "%d total ratings" +msgstr[0] "%d évaluation au total" +msgstr[1] "%d évaluations au total" + +#: wp-includes/js/dist/block-directory.js:1166 +msgid "%s out of 5 stars" +msgstr "%s sur 5 étoiles" + +#: wp-includes/js/dist/block-directory.js:1284 +msgid "This author has %d block, with an average rating of %d." +msgid_plural "This author has %d blocks, with an average rating of %d." +msgstr[0] "Cet auteur possède %d bloc, avec une évaluation moyenne de %d." +msgstr[1] "Cet auteur possède %d blocs, avec une évaluation moyenne de %d." + +#: wp-includes/js/dist/editor.js:7585 wp-admin/includes/template.php:2496 +msgid "The backup of this post in your browser is different from the version below." +msgstr "La sauvegarde de cet article dans votre navigateur est différente de la version ci-dessous." + +#: wp-includes/js/dist/components.js:36467 +msgid "Separate with commas, spaces, or the Enter key." +msgstr "Séparez avec une virgule, un espace, ou avec la touche entrée." + +#: wp-includes/js/dist/components.js:36467 +msgid "Separate with commas or the Enter key." +msgstr "Séparez avec une virgule ou avec la touche entrée." + +#. translators: %s: Your current version of WordPress. +#: wp-includes/class-wp-recovery-mode-email-service.php:324 +#: wp-admin/includes/class-wp-site-health.php:260 +msgid "WordPress version %s" +msgstr "WordPress version %s" + +#. translators: 1: The failing plugins name. 2: The failing plugins version. +#: wp-includes/class-wp-recovery-mode-email-service.php:338 +msgid "Current plugin: %1$s (version %2$s)" +msgstr "Extension actuelle : %1$s (version %2$s)" + +#. translators: 1: Current active theme name. 2: Current active theme version. +#: wp-includes/class-wp-recovery-mode-email-service.php:329 +msgid "Current theme: %1$s (version %2$s)" +msgstr "Thème actuel : %1$s (version %2$s)" + +#. translators: %s: The currently used PHP version. +#: wp-includes/class-wp-recovery-mode-email-service.php:346 +msgid "PHP version %s" +msgstr "PHP version %s" + +#: wp-includes/nav-menu.php:97 +msgid "Nav menu locations must be strings." +msgstr "Les emplacement de menus de navigation doivent être des chaînes." + +#: wp-includes/ms-load.php:498 +msgid "https://wordpress.org/support/article/debugging-a-wordpress-network/" +msgstr "https://wordpress.org/support/article/debugging-a-wordpress-network/" + +#: wp-includes/formatting.php:4803 +msgid "https://wordpress.org/support/article/using-permalinks/#choosing-your-permalink-structure" +msgstr "https://wordpress.org/support/article/using-permalinks/#choosing-your-permalink-structure" + +#: wp-includes/class-wp-block-styles-registry.php:52 +msgid "Block style name must be a string." +msgstr "Le nom de style de bloc doit être une chaîne." + +#. translators: 1: Block name, 2: Block style name. +#: wp-includes/class-wp-block-styles-registry.php:77 +msgid "Block \"%1$s\" does not contain a style named \"%2$s\"." +msgstr "Le bloc « %1$s » ne contient pas de style nommé « %2$s »." + +#: wp-includes/link-template.php:2582 wp-includes/link-template.php:2661 +#: wp-includes/link-template.php:2726 +#: wp-admin/includes/class-wp-users-list-table.php:360 +msgid "Posts" +msgstr "Publications" + +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:54 +msgid "https://wordpress.org/support/article/wordpress-widgets/" +msgstr "https://wordpress.org/support/article/wordpress-widgets/" + +#. translators: 1: UTC abbreviation and offset, 2: UTC offset. +#: wp-includes/customize/class-wp-customize-date-time-control.php:251 +msgid "Your timezone is set to %1$s (Coordinated Universal Time %2$s)." +msgstr "Votre fuseau horaire est défini sur %1$s (Temps Universel Coordonné %2$s)." + +#. translators: 1: Timezone name, 2: Timezone abbreviation, 3: UTC abbreviation +#. and offset, 4: UTC offset. +#: wp-includes/customize/class-wp-customize-date-time-control.php:237 +msgid "Your timezone is set to %1$s (%2$s), currently %3$s (Coordinated Universal Time %4$s)." +msgstr "Votre fuseau horaire est défini sur %1$s (%2$s), actuellement %3$s (Temps Universel Coordonné %4$s)." + +#: wp-includes/class-wp-fatal-error-handler.php:191 +#: wp-admin/includes/class-wp-site-health.php:1390 +msgid "Learn more about debugging in WordPress." +msgstr "En apprendre plus sur le débogage de WordPress." + +#: wp-includes/class-wp-block-styles-registry.php:46 +msgid "Block name must be a string." +msgstr "Le nom du bloc doit être une chaîne de caractères." + +#. translators: Documentation explaining debugging in WordPress. +#: wp-includes/class-wp-fatal-error-handler.php:190 +#: wp-includes/functions.php:5156 +#: wp-admin/includes/class-wp-site-health.php:1389 +msgid "https://wordpress.org/support/article/debugging-in-wordpress/" +msgstr "https://fr.wordpress.org/support/article/debugging-in-wordpress/" + +#: wp-includes/class-wp-fatal-error-handler.php:181 +msgid "There has been a critical error on your website. Please check your site admin email inbox for instructions." +msgstr "une erreur critique est survenue sur votre site. Veuillez consulter la boite de réception de l’e-mail d’administration de votre site pour plus d’informations." + +#: wp-includes/class-wp-fatal-error-handler.php:183 +msgid "There has been a critical error on your website." +msgstr "une erreur critique est survenue sur votre site." + +#: wp-includes/class-wp-fatal-error-handler.php:179 +msgid "There has been a critical error on your website, putting it in recovery mode. Please check the Themes and Plugins screens for more details. If you just installed or updated a theme or plugin, check the relevant page for that first." +msgstr "une erreur critique est survenue sur votre site, activant ainsi le mode de récupération. Veuillez vérifier les pages des thèmes et des extensions pour plus de détails. Si vous veniez d'installer ou de mettre à jour un thème ou une extension, vérifiez la page correspondante en premier." + +#: wp-includes/user.php:3062 +msgid "User’s profile data." +msgstr "Données du profil utilisateur." + +#: wp-includes/user.php:1802 +msgid "Not enough data to create this user." +msgstr "Pas assez de données pour créer cet utilisateur." + +#: wp-includes/class-wp-image-editor-imagick.php:634 +msgid "The image cannot be rotated because the embedded meta data cannot be updated." +msgstr "L’image ne peut pas être tournée car que les métadonnées embarquées ne peuvent pas être mises à jour." + +#: wp-includes/user.php:1673 +msgid "Sorry, marking a user as spam is only supported on Multisite." +msgstr "Désolé, le marquage d’un utilisateur en spam est pris en charge uniquement sur un multisite." + +#: wp-includes/media.php:4443 +msgid "User’s media data." +msgstr "Données média de l’utilisateur." + +#: wp-includes/media.php:3930 +msgid "No media items found. Try a different search." +msgstr "Aucun élément média trouvé. Essayez une recherche différente." + +#: wp-includes/post.php:2768 +msgid "Manage Archives" +msgstr "Gérer les archives" + +#: wp-includes/post.php:2758 +msgid "Spreadsheets" +msgstr "Feuilles de calcul" + +#: wp-includes/post.php:2749 +msgid "Documents" +msgstr "Documents" + +#: wp-includes/post.php:2750 +msgid "Manage Documents" +msgstr "Gérer les documents" + +#: wp-includes/post.php:2759 +msgid "Manage Spreadsheets" +msgstr "Gérer les feuilles de calcul" + +#. translators: %s: Number of archives. +#: wp-includes/post.php:2770 +msgid "Archive (%s)" +msgid_plural "Archives (%s)" +msgstr[0] "Archive (%s)" +msgstr[1] "Archives (%s)" + +#. translators: %s: Number of spreadsheets. +#: wp-includes/post.php:2761 +msgid "Spreadsheet (%s)" +msgid_plural "Spreadsheets (%s)" +msgstr[0] "Feuille de calcul (%s)" +msgstr[1] "Feuilles de calcul (%s)" + +#: wp-includes/load.php:150 wp-admin/install.php:264 +msgid "Requirements Not Met" +msgstr "Prérequis non remplis" + +#. translators: 1: "srclang" HTML attribute, 2: "label" HTML attribute, 3: +#. "kind" HTML attribute. +#: wp-includes/media-template.php:1383 +msgid "The %1$s, %2$s, and %3$s values can be edited to set the video track language and kind." +msgstr "Les valeurs %1$s, %2$s et %3$s ne peuvent pas être modifiées pour définir la langue et le genre de la piste vidéo." + +#: wp-includes/media.php:3927 +msgid "Number of media items found: %d" +msgstr "Nombre de médias trouvés : %d" + +#: wp-includes/media.php:3928 +msgid "Number of media items displayed: %d. Scroll the page for more results." +msgstr "Nombre de médias affichés : %d. Faîtes défiler la page pour plus de résultats." + +#: wp-includes/class-wp-text-diff-renderer-table.php:116 +msgid "Added:" +msgstr "Ajouté :" + +#: wp-includes/class-wp-text-diff-renderer-table.php:137 +msgid "Unchanged:" +msgstr "Inchangé :" + +#: wp-includes/comment.php:3503 +msgid "User’s comment data." +msgstr "Données de commentaire de l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:344 +msgid "Whether posts of this status may have floating published dates." +msgstr "Si les articles avec cet état peuvent avoir des dates publiées flottantes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:415 +msgid "Sorry, you are not allowed to delete revisions of this post." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer les révisions de cet article." + +#. translators: %s: Custom field key. +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:307 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:321 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:381 +msgid "Could not update the meta value of %s in database." +msgstr "La mise à jour de la valeur de la méta de %s dans la base de données n’est pas possible." + +#: wp-includes/meta.php:1210 +msgid "When registering an \"array\" meta type to show in the REST API, you must specify the schema for each array item in \"show_in_rest.schema.items\"." +msgstr "Quand vous enregistrez une métadonnée de type « tableau » pour l’afficher dans l’API REST, vous devez spécifier la description de chaque élément du tableau dans « show_in_rest.schema.items »." + +#. translators: %s: taxonomy name +#: wp-includes/blocks/tag-cloud.php:37 +msgid "Your site doesn’t have any %s, so there’s nothing to display here at the moment." +msgstr "Votre site n’a aucun %s, donc il n’y a rien à afficher pour le moment." + +#: wp-includes/widgets/class-wp-widget-meta.php:60 +msgid "Comments feed" +msgstr "Flux des commentaires" + +#: wp-includes/widgets/class-wp-widget-meta.php:59 +msgid "Entries feed" +msgstr "Flux des publications" + +#: wp-login.php:676 +msgid "Why is this important?" +msgstr "Pourquoi est-ce important ?" + +#: wp-login.php:706 +msgid "The email is correct" +msgstr "L’e-mail est correct" + +#: wp-login.php:661 +msgid "Administration email verification" +msgstr "Vérification de l’e-mail de l’administrateur" + +#: wp-login.php:632 +msgid "Confirm your administration email" +msgstr "Confirmer votre e-mail d’administration" + +#: wp-login.php:722 +msgid "Remind me later" +msgstr "Me le rappeler ultérieurement" + +#. translators: %s: Admin email address. +#: wp-login.php:687 +msgid "Current administration email: %s" +msgstr "E-mail d’administration actuel : %s" + +#: wp-login.php:694 +msgid "This email may be different from your personal email address." +msgstr "Cet e-mail peut être différent de votre adresse de messagerie personnelle." + +#: wp-load.php:83 wp-admin/setup-config.php:192 +msgid "https://wordpress.org/support/article/editing-wp-config-php/" +msgstr "https://wordpress.org/support/article/editing-wp-config-php/" + +#. translators: URL to the WordPress help section about admin email. +#: wp-login.php:668 +msgid "https://wordpress.org/support/article/settings-general-screen/#email-address" +msgstr "https://wordpress.org/support/article/settings-general-screen/#email-address" + +#: wp-login.php:664 +msgid "Please verify that the administration email for this website is still correct." +msgstr "Veuillez vérifier que l’e-mail d’administration pour ce site est toujours correct." + +#: wp-includes/script-loader.php:864 +msgid "Unexpected response from the server. The file may have been uploaded successfully. Check in the Media Library or reload the page." +msgstr "Le serveur a renvoyé une réponse inattendue. Cependant, le fichier a peut-être été bien téléversé. Veuillez vérifier dans la bibliothèque de médias ou actualiser la page." + +#. translators: Maximum number of words used in a post excerpt. +#: wp-includes/formatting.php:3827 +msgctxt "excerpt_length" +msgid "55" +msgstr "55" + +#: wp-includes/class-wp-customize-manager.php:5493 +#: wp-admin/includes/class-custom-background.php:430 +msgctxt "Original Size" +msgid "Original" +msgstr "Original" + +#. translators: Maximum number of words used in a comment excerpt. +#: wp-includes/comment-template.php:606 +msgctxt "comment_excerpt_length" +msgid "20" +msgstr "20" + +#: wp-includes/class-wp-image-editor-imagick.php:468 +#: wp-includes/class-wp-image-editor-gd.php:260 +msgid "Cannot resize the image. Both width and height are not set." +msgstr "Impossible de redimensionner l’image. La largeur et la longueur ne sont pas définies." + +#: wp-includes/media-template.php:1111 +msgid "Image size in pixels" +msgstr "Taille de l’image en pixels" + +#: wp-includes/media-template.php:583 +msgid "Media title" +msgstr "Titre du média" + +#: wp-includes/media-template.php:580 +msgid "Audio title" +msgstr "Titre du son" + +#: wp-includes/media-template.php:577 +msgid "Video title" +msgstr "Titre de la vidéo" + +#: wp-includes/media-template.php:413 +#: wp-admin/includes/class-wp-themes-list-table.php:271 +#: wp-admin/includes/class-wp-theme-install-list-table.php:369 +#: wp-admin/import.php:205 +msgid "Details" +msgstr "Détails" + +#: wp-includes/media-template.php:362 +msgid "Attachment Preview" +msgstr "Aperçu du fichier joint" + +#: wp-includes/media-template.php:238 +msgid "Your browser cannot upload files" +msgstr "Votre navigateur ne peut pas téléverser de fichiers" + +#: wp-includes/media-template.php:584 +msgid "Media title…" +msgstr "Titre du média…" + +#: wp-includes/media-template.php:581 +msgid "Audio title…" +msgstr "Titre du son…" + +#: wp-includes/media-template.php:578 +msgid "Video title…" +msgstr "Titre de la vidéo…" + +#: wp-includes/media-template.php:573 +msgid "Caption…" +msgstr "Légende…" + +#: wp-includes/class-wp-xmlrpc-server.php:615 wp-includes/option.php:2085 +msgid "Allow people to submit comments on new posts." +msgstr "Autoriser les gens à envoyer des commentaires sur les nouvelles publications." + +#: wp-login.php:463 +msgid "https://wordpress.org/support/article/resetting-your-password/" +msgstr "https://wordpress.org/support/article/resetting-your-password/" + +#. translators: %s: Documentation URL. +#: wp-login.php:462 +msgid "Error: The email could not be sent. Your site may not be correctly configured to send emails.
Get support for resetting your password." +msgstr "Erreur : l’e-mail n’a pas pu être envoyé. Votre site peut ne pas être correctement configuré pour envoyer les e-mails. Obtenez de l’aide pour réinitialiser votre mot de passe." + +#: wp-includes/customize/class-wp-customize-theme-control.php:97 +#: wp-admin/themes.php:329 wp-admin/themes.php:494 +msgid "New version available." +msgstr "Nouvelle version disponible" + +#: wp-includes/taxonomy.php:2297 +msgid "Could not insert term taxonomy into the database." +msgstr "Impossible d’insérer le terme de taxonomie dans la base de données." + +#. translators: 1: Link to tutorial, 2: Additional link attributes, 3: +#. Accessibility text. +#: wp-includes/media-template.php:167 wp-admin/includes/media.php:3193 +msgid "Describe the purpose of the image%3$s. Leave empty if the image is purely decorative." +msgstr "Décrivez le but de l’image%3$s. Laissez vide si l’image est purement décorative." + +#. translators: %s: Theme name. +#: wp-includes/class-wp-recovery-mode-email-service.php:268 +msgid "In this case, WordPress caught an error with your theme, %s." +msgstr "Ici, WordPress a trouvé une erreur avec votre thème, « %s »." + +#. translators: %s: Plugin name. +#: wp-includes/class-wp-recovery-mode-email-service.php:262 +msgid "In this case, WordPress caught an error with one of your plugins, %s." +msgstr "Ici, WordPress a trouvé une erreur avec l’une de vos extensions, « %s »." + +#. translators: Do not translate LINK, EXPIRES, CAUSE, DETAILS, SITEURL, +#. PAGEURL, SUPPORT. DEBUG: those are placeholders. +#: wp-includes/class-wp-recovery-mode-email-service.php:151 +msgid "" +"Howdy!\n" +"\n" +"Since WordPress 5.2 there is a built-in feature that detects when a plugin or theme causes a fatal error on your site, and notifies you with this automated email.\n" +"###CAUSE###\n" +"First, visit your website (###SITEURL###) and check for any visible issues. Next, visit the page where the error was caught (###PAGEURL###) and check for any visible issues.\n" +"\n" +"###SUPPORT###\n" +"\n" +"If your site appears broken and you can't access your dashboard normally, WordPress now has a special \"recovery mode\". This lets you safely login to your dashboard and investigate further.\n" +"\n" +"###LINK###\n" +"\n" +"To keep your site safe, this link will expire in ###EXPIRES###. Don't worry about that, though: a new link will be emailed to you if the error occurs again after it expires.\n" +"\n" +"When seeking help with this issue, you may be asked for some of the following information:\n" +"###DEBUG###\n" +"\n" +"###DETAILS###" +msgstr "" +"Bonjour !\n" +"\n" +"Depuis WordPress 5.2, une fonctionnalité native permet de détecter si une extension ou un thème cause une erreur fatale sur votre site, et vous notifie avec cet e-mail automatique.\n" +"\n" +"###CAUSE###\n" +"Commencez par visiter votre site web (###SITEURL###) pour vérifier s’il y a des problèmes visibles. Ensuite, visitez la page où une erreur a été relevée (###PAGEURL###) et vérifiez si des problèmes sont visibles.\n" +"\n" +"###SUPPORT###\n" +"\n" +"Si votre site semble cassé ou si vous ne pouvez pas accéder à votre tableau de bord normalement, WordPress dispose maintenant d’un « mode de récupération ». Cela vous permet de vous connecter en sécurité sur votre tableau de bord afin de chercher la source du problème.\n" +"\n" +"###LINK###\n" +"\n" +"Pour garder votre site en sécurité, ce lien expirera dans ###EXPIRES###. Ne vous inquiétez cependant pas : un nouveau lien vous sera envoyé si l’erreur se présente à nouveau.\n" +"\n" +"Si vous cherchez de l’aide pour ce problème, les informations suivantes pourraient vous être demandées :\n" +"###DEBUG###\n" +"\n" +"###DETAILS###" + +#: wp-includes/class-wp-recovery-mode-email-service.php:139 +msgid "Please contact your host for assistance with investigating this issue further." +msgstr "Veuillez contacter votre hébergeur pour une assistance concernant la résolution de ce problème." + +#: wp-includes/class-wp-recovery-mode.php:177 +msgid "Error occurred on a non-protected endpoint." +msgstr "Une erreur est survenue sur un point de terminaison non protégé." + +#. translators: %s: Login screen title. +#. translators: %s: Admin screen title. +#: wp-login.php:75 wp-admin/admin-header.php:57 +msgid "Recovery Mode — %s" +msgstr "Mode de récupération — %s" + +#. translators: Login details notification email subject. %s: Site title. +#: wp-includes/pluggable.php:2045 +msgid "[%s] Login Details" +msgstr "[%s] Détails de connexion" + +#: wp-includes/media-template.php:523 wp-includes/media-template.php:644 +#: wp-includes/media.php:3919 +msgid "Restore from Trash" +msgstr "Restaurer depuis la corbeille" + +#: wp-includes/media-template.php:525 wp-includes/media-template.php:646 +#: wp-includes/media.php:3918 wp-includes/js/dist/editor.js:12666 +#: wp-admin/includes/meta-boxes.php:325 wp-admin/includes/meta-boxes.php:427 +#: wp-admin/includes/media.php:1713 +#: wp-admin/includes/class-wp-media-list-table.php:154 +#: wp-admin/includes/class-wp-comments-list-table.php:357 +#: wp-admin/includes/class-wp-posts-list-table.php:420 wp-admin/comment.php:128 +#: wp-admin/edit-form-comment.php:205 +msgid "Move to Trash" +msgstr "Mettre à la corbeille" + +#: wp-includes/admin-bar.php:186 +msgid "Support" +msgstr "Forums de support" + +#: wp-login.php:1207 wp-includes/wp-db.php:1117 wp-includes/wp-db.php:1692 +#: wp-includes/wp-db.php:1850 wp-includes/update.php:160 +#: wp-includes/update.php:386 wp-includes/update.php:576 +#: wp-includes/customize/class-wp-customize-themes-section.php:90 +#: wp-admin/includes/theme.php:517 wp-admin/includes/theme.php:531 +#: wp-admin/includes/theme.php:546 wp-admin/includes/translation-install.php:66 +#: wp-admin/includes/translation-install.php:80 +#: wp-admin/includes/translation-install.php:92 +#: wp-admin/includes/update.php:141 wp-admin/includes/plugin-install.php:180 +#: wp-admin/includes/plugin-install.php:193 +#: wp-admin/includes/plugin-install.php:208 +#: wp-admin/includes/class-wp-automatic-updater.php:761 +#: wp-admin/theme-install.php:63 +msgid "https://wordpress.org/support/forums/" +msgstr "https://wordpress.org/support/forums/" + +#. translators: Network admin email change notification email subject. %s: +#. Network title. +#: wp-includes/ms-functions.php:2791 +msgid "[%s] Network Admin Email Changed" +msgstr "[%s] E-mail d’administration du réseau modifié" + +#. translators: Email change notification email subject. %s: Network title. +#: wp-includes/ms-functions.php:2728 +msgid "[%s] Network Admin Email Change Request" +msgstr "[%s] demande de modification de l’e-mail d’administration du réseau" + +#. translators: Site admin email change notification email subject. %s: Site +#. title. +#: wp-includes/functions.php:7019 +msgid "[%s] Admin Email Changed" +msgstr "[%s] E-mail d’administration modifié" + +#. translators: New email address notification email subject. %s: Site title. +#: wp-includes/user.php:2883 +msgid "[%s] Email Change Request" +msgstr "[%s] Demande de modification de l’e-mail d’administration" + +#. translators: Email change notification email subject. %s: Site title. +#: wp-includes/user.php:2083 +msgid "[%s] Email Changed" +msgstr "[%s] E-mail modifié" + +#: wp-includes/js/dist/block-library.js:21909 +msgid "- Select -" +msgstr "- Sélectionner -" + +#: wp-includes/js/dist/block-library.js:18315 +msgid "feed" +msgstr "flux" + +#: wp-includes/js/dist/block-library.js:18315 +msgid "atom" +msgstr "atom" + +#: wp-includes/js/dist/block-library.js:18312 +msgid "Display entries from any RSS or Atom feed." +msgstr "Afficher les entrées de n’importe quel flux RSS ou Atom" + +#: wp-includes/js/dist/block-library.js:15720 +#: wp-includes/js/dist/block-library.js:18265 +msgid "Max number of words in excerpt" +msgstr "Nombre maximum de mots dans l’extrait" + +#: wp-includes/js/dist/block-library.js:15485 +#: wp-includes/js/dist/block-library.js:18261 +msgid "Display excerpt" +msgstr "Afficher l’extrait" + +#: wp-includes/js/dist/block-library.js:15481 +#: wp-includes/js/dist/block-library.js:18257 +msgid "Display date" +msgstr "Afficher la date" + +#: wp-includes/js/dist/block-library.js:18253 +msgid "Display author" +msgstr "Afficher l’auteur" + +#: wp-includes/js/dist/block-library.js:18212 +msgid "Edit RSS URL" +msgstr "Modifier l’URL du RSS" + +#: wp-includes/js/dist/block-library.js:18207 +msgid "Use URL" +msgstr "Utiliser l’URL" + +#: wp-includes/js/dist/block-library.js:18415 +msgid "find" +msgstr "trouver" + +#: wp-includes/js/dist/block-library.js:18412 +msgid "Help visitors find your content." +msgstr "Aidez les visiteurs à trouver votre contenu." + +#: wp-includes/js/dist/block-library.js:18386 +msgid "Button text" +msgstr "Texte du bouton" + +#: wp-includes/js/dist/block-library.js:18377 +msgid "Optional placeholder…" +msgstr "Espace réservé facultatif" + +#: wp-includes/js/dist/block-library.js:18373 +msgid "Optional placeholder text" +msgstr "Texte d’espace réservé facultatif" + +#: wp-includes/js/dist/block-library.js:21948 +msgid "Tag Cloud settings" +msgstr "Réglages du nuage d’étiquettes" + +#: wp-includes/js/dist/block-library.js:18363 +msgid "Add label…" +msgstr "Ajouter un libellé…" + +#: wp-includes/js/dist/block-library.js:18196 +msgid "Enter URL here…" +msgstr "Saisissez l’URL ici…" + +#: wp-includes/js/dist/block-library.js:18387 +msgid "Add button text…" +msgstr "Ajouter un texte de bouton…" + +#: wp-includes/js/dist/block-library.js:18240 +msgid "RSS settings" +msgstr "Réglages RSS" + +#: wp-includes/js/dist/block-library.js:18362 +msgid "Label text" +msgstr "Texte du libellé" + +#: wp-includes/js/dist/block-library.js:16832 +msgid "Content before this block will be shown in the excerpt on your archives page." +msgstr "Le contenu avant ce bloc sera affiché dans l’extrait sur vos pages d’archives." + +#: wp-includes/js/dist/block-library.js:16723 +msgid "Hide the excerpt on the full content page" +msgstr "Masquer l’extrait sur la page de contenu entier" + +#: wp-includes/js/dist/block-library.js:16700 +msgid "The excerpt is visible." +msgstr "L’extrait est visible" + +#: wp-includes/js/dist/block-library.js:16700 +msgid "The excerpt is hidden." +msgstr "L’extrait est masqué" + +#: wp-includes/js/dist/block-library.js:10132 +msgid "archive" +msgstr "archive" + +#: wp-includes/js/dist/block-library.js:10132 wp-admin/options-reading.php:151 +msgid "posts" +msgstr "articles" + +#: wp-includes/widgets/class-wp-widget-calendar.php:34 +#: wp-includes/js/dist/block-library.js:10129 +msgid "A calendar of your site’s posts." +msgstr "Un calendrier des articles de votre site." + +#: wp-includes/js/dist/block-library.js:9891 +#: wp-includes/js/dist/block-library.js:9990 +msgid "link" +msgstr "lien" + +#. translators: %1$d is the order number of the image, %2$d is the total number +#. of images. +#: wp-includes/js/dist/block-library.js:7769 +msgid "image %1$d of %2$d in gallery" +msgstr "image %1$d sur %2$d dans la galerie" + +#: wp-includes/js/dist/block-library.js:4316 +msgid "ebook" +msgstr "ebook" + +#: wp-includes/js/dist/edit-post.js:5495 +msgid "Read about permalinks" +msgstr "Lire à propos des permaliens" + +#: wp-includes/js/dist/edit-post.js:5493 +msgid "The last part of the URL." +msgstr "La dernière partie de l’URL." + +#: wp-includes/js/dist/edit-post.js:5460 +msgid "URL Slug" +msgstr "Slug d’URL" + +#: wp-includes/js/dist/block-library.js:12267 +#: wp-includes/js/dist/block-library.js:15020 +msgid "Focal point picker" +msgstr "Sélecteur de point de focalisation" + +#. translators: %s: host providing embed content e.g: www.youtube.com +#: wp-includes/js/dist/block-library.js:13015 +msgid "Embedded content from %s can't be previewed in the editor." +msgstr "Le contenu embarqué depuis %s ne peut pas être prévisualisé dans l’éditeur." + +#: wp-includes/js/dist/block-library.js:12797 +msgid "Sorry, this content could not be embedded." +msgstr "Désolé, ce contenu ne peut pas être embarqué." + +#: wp-includes/js/dist/block-library.js:4318 +msgid "Embed Amazon Kindle content." +msgstr "Embarquer du contenu Amazon Kindle." + +#: wp-includes/js/dist/block-library.js:9889 +msgid "Prompt visitors to take action with a button-style link." +msgstr "Inviter les visiteurs à effectuer une action avec un lien en forme de bouton." + +#: wp-includes/js/dist/edit-post.js:4465 +msgid "Fullscreen mode deactivated" +msgstr "Mode en plein écran désactivé" + +#: wp-includes/js/dist/edit-post.js:4464 +msgid "Fullscreen mode activated" +msgstr "Mode en plein écran activé" + +#: wp-includes/js/dist/edit-post.js:4453 +msgid "Top toolbar deactivated" +msgstr "Barre d’outils haute désactivée" + +#: wp-includes/js/dist/edit-post.js:4452 +msgid "Top toolbar activated" +msgstr "Barre d’outils haute activée" + +#: wp-includes/js/dist/edit-post.js:4398 +msgid "Feature activated" +msgstr "Fonctionnalité activée" + +#: wp-includes/js/dist/edit-post.js:4396 +msgid "Feature deactivated" +msgstr "Fonctionnalité désactivée" + +#: wp-includes/js/dist/edit-post.js:1262 wp-includes/js/dist/edit-post.js:3502 +msgid "Block Manager" +msgstr "Gestionnaire de bloc" + +#: wp-includes/js/dist/block-editor.js:24763 +msgid "Change block type or style" +msgstr "Changer le style ou le type du bloc" + +#: wp-includes/js/dist/block-editor.js:23339 +#: wp-includes/js/dist/block-library.js:5790 +#: wp-includes/js/dist/block-library.js:6922 +#: wp-includes/js/dist/block-library.js:17706 +#: wp-includes/js/dist/block-library.js:20892 +msgctxt "block style" +msgid "Default" +msgstr "Par défaut" + +#: wp-includes/js/dist/block-library.js:16170 +msgctxt "keyboard key" +msgid "Space" +msgstr "Espace" + +#: wp-includes/js/dist/editor.js:11817 +msgid "Search Terms" +msgstr "Rechercher des termes" + +#: wp-includes/js/dist/editor.js:11346 +msgid "Stick to the top of the blog" +msgstr "Épingler en haut du blog" + +#: wp-includes/js/dist/editor.js:9169 +msgid "Exit the Editor" +msgstr "Sortir de l’éditeur" + +#: wp-includes/js/dist/components.js:34951 +msgid "Vertical pos." +msgstr "Position verticale" + +#: wp-includes/class-wp-recovery-mode.php:188 +msgid "Failed to store the error." +msgstr "Erreur de stockage de l’erreur." + +#: wp-includes/class-wp-recovery-mode.php:172 +msgid "Error not caused by a plugin or theme." +msgstr "Erreur non causée par une extension ou un thème." + +#. translators: %s: Site title. +#: wp-includes/class-wp-recovery-mode-email-service.php:198 +msgid "[%s] Your Site is Experiencing a Technical Issue" +msgstr "[%s] Votre site connaît un problème technique" + +#: wp-includes/class-wp-recovery-mode.php:246 +msgid "Failed to exit recovery mode. Please try again later." +msgstr "Erreur de sortie du mode de récupération. Veuillez réessayer plus tard." + +#: wp-includes/class-wp-recovery-mode.php:242 +msgid "Exit recovery mode link expired." +msgstr "Lien de sortie du mode de récupération expiré." + +#: wp-includes/js/dist/block-library.js:16161 +msgctxt "keyboard key" +msgid "Backspace" +msgstr "Retour" + +#: wp-includes/js/dist/edit-post.js:4459 +msgid "Spotlight mode deactivated" +msgstr "Mode mise en avant désactivé" + +#: wp-includes/js/dist/edit-post.js:4458 +msgid "Spotlight mode activated" +msgstr "Mode mise en avant activé" + +#: wp-includes/js/dist/block-editor.js:21711 +msgid "More rich text controls" +msgstr "Plus de contrôles de texte enrichis" + +#: wp-includes/js/dist/block-editor.js:14004 +msgid "Attempt Block Recovery" +msgstr "Tentative de récupération du bloc" + +#: wp-includes/js/dist/components.js:34940 +msgid "Horizontal pos." +msgstr "Position horizontale" + +#: wp-includes/class-wp-recovery-mode-email-service.php:124 +msgid "Error Details" +msgstr "Détails de l’erreur" + +#: wp-includes/class-wp-recovery-mode-email-service.php:56 +msgid "Could not update the email last sent time." +msgstr "Impossible de mettre à jour l’heure de dernier envoi de l’e-mail." + +#: wp-includes/class-wp-recovery-mode-key-service.php:113 +msgid "Recovery key expired." +msgstr "Clé de récupération expirée." + +#: wp-includes/class-wp-recovery-mode-key-service.php:109 +msgid "Invalid recovery key." +msgstr "Clé de récupération non valide." + +#: wp-includes/class-wp-recovery-mode-key-service.php:105 +msgid "Invalid recovery key format." +msgstr "Format de clé de récupération non valide." + +#: wp-includes/class-wp-recovery-mode-key-service.php:97 +msgid "Recovery Mode not initialized." +msgstr "Mode de récupération non initialisé." + +#. translators: User role for subscribers. +#: wp-includes/capabilities.php:1069 +msgctxt "User role" +msgid "Subscriber" +msgstr "Abonné" + +#. translators: User role for contributors. +#: wp-includes/capabilities.php:1067 +msgctxt "User role" +msgid "Contributor" +msgstr "Contributeur" + +#. translators: User role for authors. +#: wp-includes/capabilities.php:1065 +msgctxt "User role" +msgid "Author" +msgstr "Auteur" + +#. translators: User role for editors. +#: wp-includes/capabilities.php:1063 +msgctxt "User role" +msgid "Editor" +msgstr "Éditeur" + +#. translators: User role for administrators. +#: wp-includes/capabilities.php:1061 +msgctxt "User role" +msgid "Administrator" +msgstr "Administrateur" + +#: wp-includes/customize/class-wp-customize-media-control.php:244 +msgid "Select site icon" +msgstr "Sélectionner l’icône du site" + +#: wp-includes/user.php:3593 +msgid "An incomplete request for this email address already exists." +msgstr "Une demande incomplète pour cette adresse de messagerie existe déjà." + +#. translators: 1. Last sent as a human time diff, 2. Wait time as a human time +#. diff. +#: wp-includes/class-wp-recovery-mode-email-service.php:77 +msgid "A recovery link was already sent %1$s ago. Please wait another %2$s before requesting a new email." +msgstr "Un lien de récupération a déjà été envoyé il y a %1$s. Veuillez attendre %2$s avant de demander un nouvel e-mail." + +#. translators: %s: mail() +#: wp-includes/class-wp-recovery-mode-email-service.php:69 +msgid "The email could not be sent. Possible reason: your host may have disabled the %s function." +msgstr "L’e-mail n’a pas pu être envoyé. Raison possible : votre hébergeur peut avoir désactivé la fonction %s." + +#: wp-includes/class-wp-customize-widgets.php:780 +msgid "Keep widget settings and move it to the inactive widgets" +msgstr "Garder les réglages du widget et le déplacer dans les widgets inactifs." + +#: wp-includes/class-wp-recovery-mode-cookie-service.php:107 +msgid "Invalid cookie." +msgstr "Cookie non valide." + +#: wp-includes/class-wp-recovery-mode-cookie-service.php:100 +msgid "Cookie expired." +msgstr "Cookie expiré." + +#: wp-includes/class-wp-recovery-mode-cookie-service.php:93 +#: wp-includes/class-wp-recovery-mode-cookie-service.php:156 +msgid "Invalid cookie format." +msgstr "Format de cookie non valide." + +#: wp-includes/class-wp-recovery-mode-cookie-service.php:78 +#: wp-includes/class-wp-recovery-mode-cookie-service.php:127 +msgid "No cookie present." +msgstr "Aucun cookie présent." + +#: wp-includes/class-wp-theme.php:318 +#: wp-admin/includes/class-wp-themes-list-table.php:286 +#: wp-admin/theme-editor.php:43 wp-admin/theme-editor.php:370 +#: wp-admin/update-core.php:464 +msgid "https://developer.wordpress.org/themes/advanced-topics/child-themes/" +msgstr "https://developer.wordpress.org/themes/advanced-topics/child-themes/" + +#: wp-includes/admin-bar.php:1093 +msgid "Exit Recovery Mode" +msgstr "Sortir du mode de récupération" + +#. translators: %s: Number of comments. +#: wp-includes/admin-bar.php:913 wp-admin/includes/ajax-actions.php:470 +#: wp-admin/includes/ajax-actions.php:541 +#: wp-admin/includes/ajax-actions.php:1377 wp-admin/includes/dashboard.php:311 +#: wp-admin/menu.php:93 +msgid "%s Comment in moderation" +msgid_plural "%s Comments in moderation" +msgstr[0] "%s commentaire en modération" +msgstr[1] "%s commentaires en modération" + +#: wp-login.php:1328 +msgid "Recovery Mode Initialized. Please log in to continue." +msgstr "Mode de récupération initialisé. Veuillez vous connecter pour continuer." + +#: wp-login.php:1217 +msgid "https://wordpress.org/support/article/cookies/#enable-cookies-in-your-browser" +msgstr "https://wordpress.org/support/article/cookies/#enable-cookies-in-your-browser" + +#: wp-login.php:1206 +msgid "https://wordpress.org/support/article/cookies/" +msgstr "https://wordpress.org/support/article/cookies/" + +#: wp-login.php:1127 wp-includes/user.php:3855 +msgid "Missing confirm key." +msgstr "Clé de confirmation manquante." + +#: wp-login.php:1123 wp-admin/includes/ajax-actions.php:4698 +#: wp-admin/includes/ajax-actions.php:4888 +msgid "Missing request ID." +msgstr "ID de demande manquant." + +#: wp-content/plugins/hello.php:62 hello.php:62 +msgid "Quote from Hello Dolly song, by Jerry Herman:" +msgstr "Citation de la chanson Hello Dolly, par Jerry Herman :" + +#: wp-login.php:153 +msgid "Usage of the title attribute on the login logo is not recommended for accessibility reasons. Use the link text instead." +msgstr "L’utilisation de l’attribut title sur le logo de connexion n’est pas recommandée pour des raisons d’accessibilité. Utilisez plutôt le texte du lien." + +#. translators: %s: The image file name. +#: wp-includes/widgets/class-wp-widget-media-image.php:359 +#: wp-includes/widgets/class-wp-widget-media-gallery.php:204 +msgid "The current image has no alternative text. The file name is: %s" +msgstr "L’image actuelle n’a pas de texte alternatif. Le nom du fichier est : %s" + +#. translators: %s: The amount of additional, not visible images in the gallery +#. widget preview. +#: wp-includes/widgets/class-wp-widget-media-gallery.php:218 +msgid "Additional images added to this gallery: %s" +msgstr "Images supplémentaires ajoutées à cette galerie : %s" + +#. translators: 1: Error type, 2: Error line number, 3: Error file name, 4: +#. Error message. +#: wp-includes/error-protection.php:64 +msgid "An error of type %1$s was caused in line %2$s of the file %3$s. Error message: %4$s" +msgstr "Une erreur de type %1$s a été causée dans la ligne %2$s du fichier %3$s. Message d’erreur : %4$s" + +#: wp-includes/functions.php:7439 +msgid "Update PHP" +msgstr "Mettre à jour PHP" + +#: wp-includes/ms-site.php:77 +msgid "Could not retrieve site data." +msgstr "Impossible de retrouver les données du site." + +#: wp-includes/js/dist/block-library.js:4122 +msgid "Embed Crowdsignal (formerly Polldaddy) content." +msgstr "Contenu Crowdsignal (anciennement Polldaddy) intégré" + +#. translators: %s: rest_api_init +#: wp-includes/rest-api.php:58 +msgid "REST API routes must be registered on the %s action." +msgstr "Les routes de l’API REST doivent être enregistrées pour l’action %s." + +#. translators: Used to join last two items in a list with more than 2 times. +#: wp-includes/formatting.php:5070 +msgid "%1$s, and %2$s" +msgstr "%1$s, et %2$s" + +#. translators: %s: Number of failed requests. +#: wp-includes/post.php:456 +msgid "Failed (%s)" +msgid_plural "Failed (%s)" +msgstr[0] "Échoué (%s)" +msgstr[1] "Échoués (%s)" + +#: wp-includes/class-walker-comment.php:304 +#: wp-includes/class-walker-comment.php:402 +msgid "Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved." +msgstr "Votre commentaire est en attente de modération. Ceci est un aperçu, votre commentaire sera visible après validation." + +#. translators: %s: Database table name. +#: wp-includes/ms-site.php:1322 +msgid "The %s table is not installed. Please run the network database upgrade." +msgstr "La table %s n’est pas installée. Veuillez lancer la mise à niveau de la base de données du réseau." + +#: wp-includes/ms-site.php:810 +msgid "The site appears to be already uninitialized." +msgstr "Le site semble avoir déjà été dé-initialisé." + +#. translators: %d: Site ID. +#: wp-includes/ms-site.php:692 +msgid "Site %d" +msgstr "Site %d" + +#: wp-includes/ms-site.php:679 +msgid "The site appears to be already initialized." +msgstr "Le site semble avoir déjà été initialisé." + +#: wp-includes/ms-site.php:675 wp-includes/ms-site.php:806 +msgid "Site with the ID does not exist." +msgstr "Aucun site n’existe pour cet ID." + +#: wp-includes/ms-site.php:619 +msgid "Both registration and last updated dates must be valid dates." +msgstr "Les dates d’enregistrement et de dernière mise à jour doivent toutes deux être des dates valides." + +#: wp-includes/ms-site.php:608 +msgid "Both registration and last updated dates must be provided." +msgstr "Les dates d’enregistrement et de dernière mise à jour doivent toutes deux être fournies." + +#: wp-includes/ms-site.php:601 +msgid "Site network ID must be provided." +msgstr "Un identifiant de réseau de site doit être fourni." + +#: wp-includes/ms-site.php:596 +msgid "Site path must not be empty." +msgstr "Le chemin vers le site ne doit pas être vide." + +#: wp-includes/ms-site.php:591 +msgid "Site domain must not be empty." +msgstr "Le domaine du site ne doit pas être vide." + +#: wp-includes/ms-site.php:262 +msgid "Could not delete site from the database." +msgstr "Le site ne peut pas être supprimé de la base de données." + +#: wp-includes/ms-site.php:173 +msgid "Could not update site in the database." +msgstr "Impossible de mettre à jour le site dans la base de données." + +#: wp-includes/ms-site.php:159 wp-includes/ms-site.php:212 +msgid "Site does not exist." +msgstr "Le site n’existe pas." + +#: wp-includes/ms-site.php:154 wp-includes/ms-site.php:207 +#: wp-includes/ms-site.php:670 wp-includes/ms-site.php:801 +msgid "Site ID must not be empty." +msgstr "L’ID du site ne doit pas être vide." + +#: wp-includes/ms-site.php:69 +msgid "Could not insert site into the database." +msgstr "Impossible d’insérer le site en base de données." + +#: wp-includes/ms-functions.php:2072 +msgid "Unable to submit this form, please try again." +msgstr "Impossible d’envoyer ce formulaire, veuillez réessayer." + +#: wp-includes/taxonomy.php:165 +msgctxt "post format" +msgid "Formats" +msgstr "Formats" + +#. translators: Used to join items in a list with more than 2 items. +#: wp-includes/formatting.php:5068 +msgid "%1$s, %2$s" +msgstr "%1$s, %2$s" + +#. translators: %s: Default Update PHP page URL. +#: wp-includes/functions.php:7382 +msgid "This resource is provided by your web host, and is specific to your site. For more information, see the official WordPress documentation." +msgstr "Cette ressource est fournie par votre hébergeur web, et elle est spécifique à votre site. Pour plus d’informations, veuillez consulter la document officiel de WordPress (ouvre un nouvel onglet)." + +#: wp-includes/functions.php:7339 +msgctxt "localized PHP upgrade information page" +msgid "https://wordpress.org/support/update-php/" +msgstr "https://wordpress.org/support/update-php/" + +#. translators: %s: Time duration in second or seconds. +#. translators: Time difference between two dates, in seconds. %s: Number of +#. seconds. +#: wp-includes/functions.php:537 wp-includes/formatting.php:3740 +msgid "%s second" +msgid_plural "%s seconds" +msgstr[0] "%s seconde" +msgstr[1] "%s secondes" + +#. translators: %s: Time duration in minute or minutes. +#: wp-includes/functions.php:531 +msgid "%s minute" +msgid_plural "%s minutes" +msgstr[0] "%s minute" +msgstr[1] "%s minutes" + +#. translators: 1: A number of pixels wide, 2: A number of pixels tall. +#: wp-includes/media-template.php:424 wp-includes/media-template.php:619 +msgid "%1$s by %2$s pixels" +msgstr "%1$s pixels par %2$s" + +#: wp-includes/class-wp-theme.php:420 +msgid "This theme failed to load properly and was paused within the admin backend." +msgstr "Ce thème n’a pas pu être chargé correctement et a été mis en pause dans l’interface d’administration." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:386 +msgid "Whether to allow automatic creation of taxonomy columns on associated post-types table." +msgstr "S’il faut ou non autoriser la création automatique de colonnes de taxonomie sur la liste de types de publications associée." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:382 +msgid "Whether to generate a default UI for managing this taxonomy." +msgstr "S’il faut ou non générer une interface par défaut pour gérer cette taxonomie." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:390 +msgid "Whether to make the taxonomy available for selection in navigation menus." +msgstr "S’il faut ou non rendre la taxonomie disponible à la sélection dans les menus de navigation." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:378 +msgid "Whether the taxonomy is publicly queryable." +msgstr "S’il faut ou non rendre la taxonomie affichable publiquement." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:374 +msgid "Whether a taxonomy is intended for use publicly either via the admin interface or by front-end users." +msgstr "S’il est prévu d’utiliser la taxonomie publiquement ou non, que ce soit dans l’interface d’administration ou sur l’interface publique." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:394 +msgid "Whether to show the taxonomy in the quick/bulk edit panel." +msgstr "S’il faut ou non afficher la taxonomie dans le panneau de modification groupée." + +#: wp-login.php:370 wp-login.php:395 wp-includes/user.php:2272 +msgid "Error: There is no account with that username or email address." +msgstr "Erreur : il n’y a pas de compte avec cet identifiant ou cette adresse de messagerie." + +#: wp-includes/js/dist/nux.js:974 +msgid "Editor tips" +msgstr "Astuces de l’éditeur" + +#: wp-includes/js/dist/block-library.js:14789 +msgctxt "content placeholder" +msgid "Content…" +msgstr "Contenu…" + +#: wp-includes/js/dist/block-library.js:12803 +msgctxt "button label" +msgid "Convert to link" +msgstr "Convertir en lien" + +#: wp-includes/js/dist/block-library.js:12800 +msgctxt "button label" +msgid "Try again" +msgstr "Réessayer" + +#: wp-activate.php:30 +msgid "A key value mismatch has been detected. Please follow the link provided in your activation email." +msgstr "Une incohérence de valeur de clé a été détectée. Veuillez suivre le lien fourni dans l’e-mail d’activation." + +#: wp-includes/class-wp.php:300 wp-includes/ms-deprecated.php:275 +#: wp-includes/ms-deprecated.php:294 +msgid "A variable mismatch has been detected." +msgstr "Une incohérence de variables a été détectée." + +#. translators: ARIA label for the Settings Sidebar tab, selected. +#: wp-includes/js/dist/edit-post.js:4873 +msgid "Block (selected)" +msgstr "Bloc (sélectionné)" + +#. translators: ARIA label for the Document sidebar tab, selected. +#: wp-includes/js/dist/edit-post.js:4866 +msgid "Document (selected)" +msgstr "Document (sélectionné)" + +#: wp-includes/js/dist/block-library.js:18085 +msgid "Create content, and save it for you and other contributors to reuse across your site. Update the block, and the changes apply everywhere it’s used." +msgstr "Créez du contenu et enregistrez-le pour vous ou pour d’autres contributrices et contributeurs afin de le réutiliser ailleurs sur votre site, et appliquer les modifications partout où il est utilisé." + +#: wp-includes/js/dist/edit-post.js:4450 +msgid "Top toolbar" +msgstr "Barre d’outils supérieure" + +#. translators: %d: number of words +#: wp-includes/js/dist/block-editor.js:23469 +msgid "%d word" +msgid_plural "%d words" +msgstr[0] "%d mot" +msgstr[1] "%d mots" + +#: wp-includes/class-wp-editor.php:1398 +msgid "Classic Block Keyboard Shortcuts" +msgstr "Raccourcis clavier de bloc classique" + +#: wp-includes/js/dist/block-editor.js:15684 +msgid "Block tools" +msgstr "Outils de bloc" + +#: wp-includes/js/dist/block-editor.js:18527 +msgid "(selected block)" +msgstr "(bloc sélectionné)" + +#: wp-includes/js/dist/block-editor.js:21254 +msgid "To edit this block, you need permission to upload media." +msgstr "Pour modifier ce bloc vous devez avoir les droits de téléverser des médias." + +#: wp-includes/js/dist/editor.js:8355 +msgid "To edit the featured image, you need permission to upload media." +msgstr "Pour modifier l’image mise en avant vous devez avoir les droits de téléverser des médias." + +#: wp-includes/js/dist/edit-post.js:3860 wp-includes/js/dist/edit-post.js:5454 +msgid "Permalink" +msgstr "Permalien" + +#: wp-includes/js/dist/block-library.js:5294 +msgid "This image has an empty alt attribute; its file name is %s" +msgstr "L’attribut alt de cette image est vide, son nom de fichier est %s." + +#: wp-includes/js/dist/block-library.js:5296 +msgid "This image has an empty alt attribute" +msgstr "L’attribut alt de cette image est vide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:168 +msgid "Sorry, you are not allowed to view autosaves of this post." +msgstr "Désolé, vous n’avez pas l’autorisation de voir les sauvegardes automatiques de cette publication." + +#: wp-includes/js/dist/annotations.js:1091 +msgid "Annotation" +msgstr "Annotation" + +#: wp-includes/js/dist/block-library.js:3381 +msgid "Paragraph block" +msgstr "Bloc paragraphe" + +#: wp-includes/js/dist/block-editor.js:8129 +msgid "Align text right" +msgstr "Aligner le texte à droite" + +#: wp-includes/js/dist/block-editor.js:8125 +msgid "Align text center" +msgstr "Centrer le texte" + +#: wp-includes/js/dist/block-editor.js:8121 +msgid "Align text left" +msgstr "Aligner le texte à gauche" + +#: wp-includes/js/dist/block-editor.js:24739 +msgid "Block icon" +msgstr "Icône du bloc" + +#: wp-includes/js/dist/block-editor.js:13342 +msgid "%s block selected." +msgid_plural "%s blocks selected." +msgstr[0] "%s bloc sélectionné." +msgstr[1] "%s blocs sélectionnés." + +#: wp-includes/js/dist/editor.js:12068 +msgid "Type text or HTML" +msgstr "Écrivez du texte ou du HTML" + +#: wp-includes/js/dist/editor.js:12076 +msgid "Start writing with text or HTML" +msgstr "Commencez à écrire du texte ou du HTML" + +#: wp-includes/js/dist/block-editor.js:16579 +#: wp-includes/js/dist/block-library.js:3382 wp-admin/edit-form-blocks.php:283 +msgid "Start writing or type / to choose a block" +msgstr "Commencez à écrire ou saisissez « / » pour choisir un bloc" + +#: wp-includes/js/dist/block-library.js:3381 +msgid "Empty block; start writing or type forward slash to choose a block" +msgstr "Bloc vide ; écrivez ou saisissez une barre oblique pour choisir un bloc" + +#: wp-includes/js/dist/block-library.js:16935 +msgid "Page Break" +msgstr "Saut de page" + +#: wp-includes/js/dist/block-library.js:15004 +msgid "Stack on mobile" +msgstr "Empiler sur mobile" + +#: wp-includes/js/dist/edit-post.js:3787 +msgid "Custom fields" +msgstr "Champs personnalisés" + +#: wp-includes/js/dist/editor.js:10797 wp-admin/includes/meta-boxes.php:110 +#: wp-admin/includes/meta-boxes.php:140 wp-admin/includes/ajax-actions.php:2191 +#: wp-admin/includes/class-wp-posts-list-table.php:1087 +#: wp-admin/includes/class-wp-posts-list-table.php:1815 +msgid "Scheduled" +msgstr "Planifié" + +#: wp-includes/js/dist/block-library.js:21277 +msgid "poetry" +msgstr "poésie" + +#: wp-includes/js/dist/block-library.js:21268 +msgid "Verse" +msgstr "Couplet" + +#: wp-includes/js/dist/block-library.js:20969 +msgid "New Column" +msgstr "Ajouter une colonne" + +#: wp-includes/js/dist/nux.js:983 +msgid "Disable tips" +msgstr "Désactiver les astuces" + +#: wp-includes/js/dist/nux.js:980 +msgid "Got it" +msgstr "J’ai compris" + +#: wp-includes/js/dist/nux.js:980 +msgid "See next tip" +msgstr "Voir l’astuce suivante" + +#: wp-includes/js/dist/format-library.js:766 +msgid "Inline image" +msgstr "Image en ligne" + +#: wp-includes/js/dist/block-library.js:21344 +msgid "Muted" +msgstr "En sourdine" + +#: wp-includes/js/dist/api-fetch.js:631 +msgid "The response is not a valid JSON response." +msgstr "La réponse n’est pas une réponse JSON valide." + +#: wp-includes/js/dist/block-library.js:21836 +msgid "movie" +msgstr "vidéo" + +#: wp-includes/js/dist/block-library.js:21612 +msgid "Remove Poster Image" +msgstr "Retirer l’image de couverture" + +#: wp-includes/js/dist/block-library.js:21079 +msgid "This block is deprecated. Please use the Columns block instead." +msgstr "Ce bloc est obsolète. Veuillez utiliser le bloc Colonnes à la place." + +#: wp-includes/js/dist/block-library.js:21078 +msgid "Text Columns (deprecated)" +msgstr "Colonnes de texte (obsolète)" + +#: wp-includes/js/dist/keycodes.js:483 +msgid "Period" +msgstr "Période" + +#: wp-includes/js/dist/keycodes.js:483 +msgid "Comma" +msgstr "Virgule" + +#: wp-includes/js/dist/keycodes.js:483 +msgid "Backtick" +msgstr "Retour arrière" + +#: wp-includes/js/dist/block-library.js:20896 +msgid "Stripes" +msgstr "Rayures" + +#: wp-includes/js/dist/format-library.js:1307 +msgid "Link edited." +msgstr "Lien modifié." + +#: wp-includes/js/dist/format-library.js:1453 +msgid "Link removed." +msgstr "Lien retiré." + +#: wp-includes/js/dist/format-library.js:780 +msgid "media" +msgstr "média" + +#: wp-includes/js/dist/block-library.js:21181 +msgid "Write…" +msgstr "Rédigez…" + +#: wp-includes/js/dist/block-library.js:21269 +msgid "Insert poetry. Use special spacing formats. Or quote song lyrics." +msgstr "Insérez de la poésie ou des paroles de chansons en utilisant un espacement spécifique." + +#: wp-includes/js/dist/block-library.js:21834 +msgid "Embed a video from your media library or upload a new one." +msgstr "Embarquez une vidéo depuis votre bibliothèque de médias ou téléversez-en une nouvelle." + +#: wp-includes/js/dist/block-library.js:20838 +msgid "Insert a table — perfect for sharing charts and data." +msgstr "Insérez un tableau — parfait pour mettre en ligne des données tabulaires." + +#: wp-includes/js/dist/block-library.js:21348 +msgid "Playback controls" +msgstr "Commandes de lecture" + +#: wp-includes/js/dist/block-library.js:21586 +msgid "Video settings" +msgstr "Réglages vidéo" + +#: wp-includes/js/dist/block-library.js:20355 +msgid "Delete Column" +msgstr "Supprimer une colonne" + +#: wp-includes/js/dist/block-library.js:20350 +msgid "Add Column After" +msgstr "Ajouter une colonne à la suite" + +#: wp-includes/js/dist/block-library.js:20345 +msgid "Add Column Before" +msgstr "Ajouter une colonne avant" + +#: wp-includes/js/dist/block-library.js:20340 +msgid "Delete Row" +msgstr "Supprimer la ligne" + +#: wp-includes/js/dist/block-library.js:20335 +msgid "Add Row After" +msgstr "Ajouter une ligne après" + +#: wp-includes/js/dist/block-library.js:20330 +msgid "Add Row Before" +msgstr "Ajouter une ligne avant" + +#: wp-includes/js/dist/block-library.js:20492 +msgid "Edit table" +msgstr "Modifier le tableau" + +#: wp-includes/js/dist/block-library.js:18988 +#: wp-includes/js/dist/block-library.js:19072 +msgid "Shortcode" +msgstr "Code court" + +#: wp-includes/js/dist/block-library.js:18928 +msgid "divider" +msgstr "Séparateur" + +#: wp-includes/js/dist/block-library.js:18928 +msgid "horizontal-line" +msgstr "Filet horizontal" + +#: wp-includes/js/dist/block-library.js:18925 +msgid "Separator" +msgstr "Séparateur" + +#: wp-includes/js/dist/block-library.js:19165 +msgid "Height in pixels" +msgstr "Hauteur en pixels" + +#: wp-includes/js/dist/block-library.js:19244 +msgid "Spacer" +msgstr "Espacement" + +#: wp-includes/js/dist/block-library.js:20503 +msgid "Table settings" +msgstr "Réglages du tableau" + +#: wp-includes/js/dist/block-library.js:20506 +msgid "Fixed width table cells" +msgstr "Cellules de tableau à largeur fixe" + +#: wp-includes/js/dist/block-library.js:18944 +msgid "Dots" +msgstr "Points" + +#: wp-includes/js/dist/block-library.js:18941 +msgid "Wide Line" +msgstr "Ligne large" + +#: wp-includes/js/dist/block-library.js:19367 +msgid "This block is deprecated. Please use the Paragraph block instead." +msgstr "Ce bloc est obsolète. Veuillez utiliser le bloc Paragraphe à la place." + +#: wp-includes/js/dist/block-library.js:19366 +msgid "Subheading (deprecated)" +msgstr "Sous-titre (obsolète)" + +#: wp-includes/js/dist/block-library.js:6912 +msgid "blockquote" +msgstr "citation" + +#: wp-includes/js/dist/block-library.js:6926 +msgctxt "block style" +msgid "Large" +msgstr "Grand" + +#: wp-includes/js/dist/block-library.js:18992 +msgid "Write shortcode here…" +msgstr "Placez le code court ici…" + +#: wp-includes/js/dist/block-library.js:19073 +msgid "Insert additional custom elements with a WordPress shortcode." +msgstr "Insérez des éléments personnalisés additionnels avec un code court WordPress." + +#: wp-includes/js/dist/block-library.js:18926 +msgid "Create a break between ideas or sections with a horizontal separator." +msgstr "Créez un espacement entre des idées ou entre des sections avec un séparateur horizontal." + +#: wp-includes/js/dist/block-library.js:6910 +msgid "Give quoted text visual emphasis. \"In quoting others, we cite ourselves.\" — Julio Cortázar" +msgstr "Donnez une emphase visuelle à vos citations. « En citant les autres, nous nous citons nous mêmes » — Julio Cortázar" + +#: wp-includes/js/dist/block-library.js:19294 +msgid "Write subheading…" +msgstr "Rédigez un texte mis en exergue…" + +#: wp-includes/js/dist/block-library.js:19245 +msgid "Add white space between blocks and customize its height." +msgstr "Ajoutez de l’espace entre les blocs et définissez leur hauteur." + +#: wp-includes/js/dist/block-library.js:20473 +msgid "Row Count" +msgstr "Nombre de lignes" + +#: wp-includes/js/dist/block-library.js:20466 +msgid "Column Count" +msgstr "Nombre de colonnes" + +#: wp-includes/js/dist/block-library.js:19163 +msgid "Spacer settings" +msgstr "Réglages de l’espacement" + +#: wp-includes/js/dist/block-library.js:17694 +msgid "Pullquote" +msgstr "Citation en exergue" + +#: wp-includes/js/dist/block-library.js:17559 +msgid "Main color" +msgstr "Couleur principale" + +#: wp-includes/js/dist/block-library.js:17710 +msgid "Solid color" +msgstr "Couleur unie" + +#: wp-includes/js/dist/block-library.js:17695 +msgid "Give special visual emphasis to a quote from your text." +msgstr "Donnez une emphase visuelle à une citation." + +#. translators: placeholder text used for the quote +#: wp-includes/js/dist/block-library.js:6613 +#: wp-includes/js/dist/block-library.js:17543 +msgid "Write quote…" +msgstr "Rédigez une citation…" + +#. translators: placeholder text used for the citation +#: wp-includes/js/dist/block-library.js:6633 +#: wp-includes/js/dist/block-library.js:17547 +msgid "Write citation…" +msgstr "Renseignez la source…" + +#: wp-includes/js/dist/block-library.js:17011 +msgid "Write preformatted text…" +msgstr "Rédigez du texte préformaté…" + +#: wp-includes/js/dist/block-library.js:3595 +msgid "text" +msgstr "Texte" + +#: wp-includes/js/dist/block-library.js:16144 +msgid "Convert to ordered list" +msgstr "Convertir en liste ordonnée" + +#: wp-includes/js/dist/block-library.js:16128 +msgid "Convert to unordered list" +msgstr "Convertir en liste non-ordonnée" + +#: wp-includes/js/dist/block-library.js:3336 +msgid "Text settings" +msgstr "Réglages du texte" + +#: wp-includes/js/dist/block-library.js:5779 +#: wp-includes/js/dist/format-library.js:780 +msgid "photo" +msgstr "photo" + +#: wp-includes/js/dist/block-library.js:16467 +msgid "numbered list" +msgstr "Liste numérotée" + +#: wp-includes/js/dist/block-library.js:16169 +msgid "Indent list item" +msgstr "Indenter l’élément de la liste" + +#: wp-includes/js/dist/block-library.js:16160 +msgid "Outdent list item" +msgstr "Désindenter l’élément de la liste" + +#: wp-includes/js/dist/block-library.js:3341 +msgid "Drop cap" +msgstr "Lettrine" + +#: wp-includes/js/dist/block-library.js:15991 +msgid "recent posts" +msgstr "contenus récents" + +#: wp-includes/js/dist/block-library.js:16939 +msgid "pagination" +msgstr "pagination" + +#: wp-includes/js/dist/block-library.js:16939 +msgid "next page" +msgstr "page suivante" + +#: wp-includes/js/dist/block-editor.js:19199 +msgid "Image dimensions" +msgstr "Dimensions de l’image" + +#: wp-includes/js/dist/block-library.js:3348 +msgid "Showing large initial letter." +msgstr "Affichage de la lettrine." + +#: wp-includes/js/dist/block-library.js:15524 +msgid "recent comments" +msgstr "commentaires récents" + +#: wp-includes/js/dist/block-library.js:15477 +msgid "Display avatar" +msgstr "Afficher l’avatar" + +#: wp-includes/js/dist/block-library.js:15475 +msgid "Latest comments settings" +msgstr "Réglages des derniers commentaires" + +#: wp-includes/js/dist/block-library.js:15489 +msgid "Number of comments" +msgstr "Nombre de commentaires" + +#: wp-includes/js/dist/block-library.js:16523 +msgid "Keep as HTML" +msgstr "Conserver en HTML" + +#: wp-includes/js/dist/block-library.js:16831 +msgctxt "block name" +msgid "More" +msgstr "Lire la suite" + +#: wp-includes/js/dist/block-library.js:14481 +msgid "Media area" +msgstr "Zone de média" + +#: wp-includes/js/dist/block-library.js:15348 +msgid "Media & Text" +msgstr "Média & texte" + +#: wp-includes/js/dist/block-library.js:14980 +msgid "Show media on right" +msgstr "Afficher le média sur la droite" + +#: wp-includes/js/dist/block-library.js:14971 +msgid "Show media on left" +msgstr "Afficher le média sur la gauche" + +#: wp-includes/js/dist/block-library.js:15521 +msgid "Display a list of your most recent comments." +msgstr "Afficher une liste de vos commentaires les plus récents." + +#: wp-includes/js/dist/block-library.js:16596 +msgid "Your site doesn’t include support for this block." +msgstr "Votre site ne propose pas de support pour ce bloc." + +#: wp-includes/js/dist/block-library.js:16525 +msgid "Your site doesn’t include support for the \"%s\" block. You can leave this block intact or remove it entirely." +msgstr "Votre site ne propose pas de support pour le bloc « %s ». Vous pouvez laisser ce bloc tel quel ou le retirer complètement." + +#: wp-includes/js/dist/block-library.js:16517 +msgid "Your site doesn’t include support for the \"%s\" block. You can leave this block intact, convert its content to a Custom HTML block, or remove it entirely." +msgstr "Votre site ne propose pas de support pour le bloc « %s ». Vous pouvez laisser ce bloc tel quel, convertir son contenu en bloc HTML personnalisé ou le retirer complètement." + +#: wp-includes/js/dist/block-library.js:15349 +msgid "Set media and words side-by-side for a richer layout." +msgstr "Définir un média et du texte côte-à-côte pour une mise en page plus riche." + +#: wp-includes/js/dist/block-library.js:3593 +msgid "Start with the building block of all narrative." +msgstr "Commencez par la pierre angulaire de tout récit." + +#: wp-includes/js/dist/block-library.js:3348 +msgid "Toggle to show a large initial letter." +msgstr "Cliquez pour afficher une lettrine." + +#: wp-includes/js/dist/block-library.js:16937 +msgid "Separate your content into a multi-page experience." +msgstr "Séparez votre contenu sur plusieurs pages." + +#: wp-includes/js/dist/block-library.js:15002 +msgid "Media & Text settings" +msgstr "Réglages média & texte" + +#: wp-includes/js/dist/block-library.js:16193 +msgid "Write list…" +msgstr "Rédigez une liste…" + +#: wp-includes/js/dist/block-library.js:16465 +msgid "Create a bulleted or numbered list." +msgstr "Créez une liste à puces ou une liste numérotée." + +#: wp-includes/js/dist/block-library.js:15732 +msgid "Display post date" +msgstr "Afficher la date de publication" + +#: wp-includes/js/dist/block-library.js:15831 +#: wp-includes/js/dist/block-library.js:15987 +msgid "Latest Posts" +msgstr "Articles récents" + +#: wp-includes/js/dist/block-library.js:15520 +msgid "Latest Comments" +msgstr "Commentaires récents" + +#: wp-includes/js/dist/block-library.js:5776 +msgid "Insert an image to make a visual statement." +msgstr "Insérez une image pour illustrer vos propos." + +#: wp-includes/js/dist/block-library.js:17103 +msgid "Add text that respects your spacing and tabs, and also allows styling." +msgstr "Ajoutez du texte qui respecte les espacements et tabulations, avec la possibilité de le mettre en forme." + +#: wp-includes/js/dist/block-library.js:15988 +msgid "Display a list of your most recent posts." +msgstr "Afficher une liste de vos articles les plus récents." + +#: wp-includes/js/dist/block-library.js:5243 +msgid "Image settings" +msgstr "Réglages de l’image" + +#: wp-includes/js/dist/block-library.js:6381 +msgid "subtitle" +msgstr "sous-titre" + +#: wp-includes/js/dist/block-library.js:6381 +msgid "title" +msgstr "titre" + +#: wp-includes/js/dist/block-library.js:6378 +msgid "Heading" +msgstr "Titre" + +#: wp-includes/js/dist/block-library.js:6131 +msgid "Level" +msgstr "Niveau" + +#: wp-includes/js/dist/block-library.js:6130 +msgid "Heading settings" +msgstr "Réglages du titre" + +#: wp-includes/js/dist/block-library.js:8624 +msgid "photos" +msgstr "photos" + +#: wp-includes/js/dist/block-library.js:8624 +msgid "images" +msgstr "images" + +#: wp-includes/js/dist/block-library.js:5200 +#: wp-includes/js/dist/block-library.js:5204 +#: wp-includes/js/dist/block-library.js:5205 +msgid "Edit image" +msgstr "Modifier l’image" + +#: wp-includes/js/dist/block-library.js:8238 +msgid "Crop images" +msgstr "Recadrer les images" + +#: wp-includes/js/dist/block-library.js:8078 +msgid "Thumbnails are not cropped." +msgstr "Les miniatures ne sont pas recadrées." + +#: wp-includes/js/dist/block-library.js:8078 +msgid "Thumbnails are cropped to align." +msgstr "Les miniatures sont recadrées pour s’aligner." + +#: wp-includes/js/dist/block-library.js:14112 +msgid "pdf" +msgstr "PDF" + +#: wp-includes/js/dist/block-library.js:14112 +msgid "document" +msgstr "document" + +#: wp-includes/js/dist/block-library.js:13859 +msgid "Copy URL" +msgstr "Copier l’URL" + +#: wp-includes/js/dist/block-library.js:14317 +msgid "embed" +msgstr "Contenu embarqué" + +#: wp-includes/js/dist/block-library.js:13684 +msgctxt "button label" +msgid "Download" +msgstr "Télécharger" + +#: wp-includes/js/dist/block-library.js:14315 +msgid "Add custom HTML code and preview it as you edit." +msgstr "Ajoutez du code HTML personnalisé et prévisualisez-le en direct." + +#: wp-includes/js/dist/block-library.js:6166 +msgid "Write heading…" +msgstr "Rédigez un titre…" + +#. translators: %s: heading level e.g: "1", "2", "3" +#: wp-includes/js/dist/block-library.js:6021 +msgid "Heading %d" +msgstr "Titre %d" + +#: wp-includes/js/dist/block-library.js:8622 +msgid "Display multiple images in a rich gallery." +msgstr "Affichez plusieurs images dans une galerie." + +#: wp-includes/js/dist/block-library.js:7858 +msgid "Drag images, upload new ones or select files from your library." +msgstr "Glissez des images, téléversez-en de nouvelles ou sélectionnez des fichiers depuis votre bibliothèque." + +#: wp-includes/js/dist/block-library.js:13584 +msgid "Show download button" +msgstr "Afficher le bouton de téléchargement" + +#: wp-includes/js/dist/block-library.js:13582 +msgid "Download button settings" +msgstr "Réglages du bouton de téléchargement" + +#: wp-includes/js/dist/block-library.js:13571 +msgid "Text link settings" +msgstr "Réglages du lien textuel" + +#: wp-includes/js/dist/block-library.js:14110 +msgid "Add a link to a downloadable file." +msgstr "Ajoutez un lien vers un fichier téléchargeable." + +#: wp-includes/js/dist/block-library.js:5245 +#: wp-includes/js/dist/block-library.js:15029 +msgid "Alt text (alternative text)" +msgstr "Texte alternatif (alt)" + +#: wp-includes/js/dist/block-library.js:14230 +msgid "Write HTML…" +msgstr "Écrire du HTML…" + +#: wp-includes/js/dist/block-library.js:6379 +msgid "Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content." +msgstr "Introduisez les nouvelles sections et organisez votre publication pour aider les visiteurs (et les moteurs de recherche) à en comprendre la structure." + +#: wp-includes/js/dist/block-library.js:13831 +msgid "Write file name…" +msgstr "Saisissez le nom du fichier…" + +#: wp-includes/js/dist/block-library.js:4012 +#: wp-includes/js/dist/block-library.js:4074 +#: wp-includes/js/dist/block-library.js:4299 +#: wp-includes/js/dist/block-library.js:15351 +msgid "video" +msgstr "vidéo" + +#: wp-includes/js/dist/block-library.js:4047 +#: wp-includes/js/dist/block-library.js:4056 +#: wp-includes/js/dist/block-library.js:4178 +msgid "audio" +msgstr "son" + +#: wp-includes/js/dist/block-library.js:4012 +#: wp-includes/js/dist/block-library.js:4047 +#: wp-includes/js/dist/block-library.js:4056 +#: wp-includes/js/dist/block-library.js:4178 +#: wp-includes/js/dist/block-library.js:9207 +msgid "music" +msgstr "musique" + +#: wp-includes/js/dist/block-library.js:4029 +#: wp-includes/js/dist/block-library.js:4065 +#: wp-includes/js/dist/block-library.js:15351 +msgid "image" +msgstr "image" + +#: wp-includes/js/dist/block-library.js:4038 +msgid "blog" +msgstr "blog" + +#: wp-includes/js/dist/block-library.js:12974 +msgid "Embedded content from %s" +msgstr "Contenu embarqué depuis %s" + +#: wp-includes/js/dist/block-library.js:12263 +msgid "Fixed background" +msgstr "Arrière-plan fixe" + +#: wp-includes/js/dist/block-library.js:4038 +msgid "post" +msgstr "contenu" + +#: wp-includes/js/dist/block-library.js:12717 +msgid "Edit URL" +msgstr "Modifier l’URL" + +#: wp-includes/js/dist/block-library.js:12745 +msgid "Embedding…" +msgstr "Récupération…" + +#: wp-includes/js/dist/block-library.js:12261 +#: wp-includes/js/dist/block-library.js:12721 +msgid "Media settings" +msgstr "Réglages des médias" + +#: wp-includes/js/dist/block-library.js:12724 +msgid "Resize for smaller devices" +msgstr "Redimensionner pour les petits appareils" + +#: wp-includes/js/dist/block-library.js:11842 +#: wp-includes/js/dist/block-library.js:11898 +#: wp-includes/js/dist/block-library.js:11944 +#: wp-includes/js/dist/block-library.js:11997 +msgid "Write title…" +msgstr "Rédigez le titre…" + +#: wp-includes/js/dist/block-library.js:13491 +msgctxt "block title" +msgid "Embed" +msgstr "Contenu embarqué" + +#: wp-includes/js/dist/block-library.js:13241 +msgid "%s URL" +msgstr "URL %s" + +#: wp-includes/js/dist/block-library.js:13492 +msgid "Embed videos, images, tweets, audio, and other content from external sources." +msgstr "Embarquez des vidéos, des images, des tweets, des sons et d’autres contenus depuis des sources externes." + +#: wp-includes/js/dist/block-library.js:12789 +msgctxt "button label" +msgid "Embed" +msgstr "Embarquer" + +#: wp-includes/js/dist/block-library.js:12784 +msgid "Enter URL to embed here…" +msgstr "Saisissez l’URL à embarquer…" + +#: wp-includes/js/dist/block-library.js:13204 +msgid "This embed may not preserve its aspect ratio when the browser is resized." +msgstr "Ce contenu embarqué pourrait perdre son rapport hauteur/largeur lorsque le navigateur est redimensionné." + +#: wp-includes/js/dist/block-library.js:13204 +msgid "This embed will preserve its aspect ratio when the browser is resized." +msgstr "Ce contenu embarqué conservera son rapport hauteur/largeur lorsque le navigateur est redimensionné." + +#: wp-includes/js/dist/block-library.js:4308 +msgid "Embed a WordPress.tv video." +msgstr "Embarquez une vidéo WordPress.tv." + +#: wp-includes/js/dist/block-library.js:4300 +msgid "Embed a VideoPress video." +msgstr "Embarquez une vidéo VideoPress." + +#: wp-includes/js/dist/block-library.js:4291 +msgid "Embed a Tumblr post." +msgstr "Embarquez une publication Tumblr." + +#: wp-includes/js/dist/block-library.js:4283 +msgid "Embed a TED video." +msgstr "Embarquez une vidéo TED." + +#: wp-includes/js/dist/block-library.js:4267 +msgid "Embed Speaker Deck content." +msgstr "Embarquez un contenu SpeakerDeck." + +#: wp-includes/js/dist/block-library.js:4239 +msgid "Embed SmugMug content." +msgstr "Embarquez un contenu SmugMug." + +#: wp-includes/js/dist/block-library.js:4231 +msgid "Embed Slideshare content." +msgstr "Embarquez un contenu Slideshare." + +#: wp-includes/js/dist/block-library.js:4223 +msgid "Embed Scribd content." +msgstr "Embarquez un contenu Scribd." + +#: wp-includes/js/dist/block-library.js:4215 +msgid "Embed Screencast content." +msgstr "Embarquez un contenu Screencast." + +#: wp-includes/js/dist/block-library.js:4207 +msgid "Embed ReverbNation content." +msgstr "Embarquez un contenu ReverbNation." + +#: wp-includes/js/dist/block-library.js:4199 +msgid "Embed a Reddit thread." +msgstr "Embarquez un fil de discussion Reddit." + +#: wp-includes/js/dist/block-library.js:4179 +msgid "Embed Mixcloud content." +msgstr "Embarquez un contenu Mixcloud." + +#: wp-includes/js/dist/block-library.js:4170 +msgid "Embed Meetup.com content." +msgstr "Embarquez un contenu Meetup.com." + +#: wp-includes/js/dist/block-library.js:4162 +msgid "Embed Kickstarter content." +msgstr "Embarquez un contenu Kickstarter." + +#: wp-includes/js/dist/block-library.js:4154 +msgid "Embed Issuu content." +msgstr "Embarquez un contenu Issuu." + +#: wp-includes/js/dist/block-library.js:4146 +msgid "Embed Imgur content." +msgstr "Embarquez un contenu Imgur." + +#: wp-includes/js/dist/block-library.js:4138 +msgid "Embed Hulu content." +msgstr "Embarquez un contenu Hulu." + +#: wp-includes/js/dist/block-library.js:4130 +msgid "Embed a Dailymotion video." +msgstr "Embarquez une vidéo Dailymotion." + +#: wp-includes/js/dist/block-library.js:4101 +msgid "Embed CollegeHumor content." +msgstr "Embarquez un contenu CollegeHumor." + +#: wp-includes/js/dist/block-library.js:4092 +msgid "Embed Cloudup content." +msgstr "Embarquez un contenu Cloudup." + +#: wp-includes/js/dist/block-library.js:4084 +msgid "Embed an Animoto video." +msgstr "Embarquez une vidéo Animoto." + +#: wp-includes/js/dist/block-library.js:4075 +msgid "Embed a Vimeo video." +msgstr "Embarquez une vidéo Vimeo." + +#: wp-includes/js/dist/block-library.js:4066 +msgid "Embed Flickr content." +msgstr "Embarquez un contenu Flickr." + +#: wp-includes/js/dist/block-library.js:4057 +msgid "Embed Spotify content." +msgstr "Embarquez un contenu Spotify." + +#: wp-includes/js/dist/block-library.js:4048 +msgid "Embed SoundCloud content." +msgstr "Embarquez un contenu Soundcloud." + +#: wp-includes/js/dist/block-library.js:4188 +msgid "Embed Polldaddy content." +msgstr "Embarquez un contenu Polldaddy." + +#: wp-includes/js/dist/block-library.js:4030 +msgid "Embed an Instagram post." +msgstr "Embarquez une publication Instagram." + +#: wp-includes/js/dist/block-library.js:4021 +msgid "Embed a Facebook post." +msgstr "Embarquez une publication Facebook." + +#: wp-includes/js/dist/block-library.js:4013 +msgid "Embed a YouTube video." +msgstr "Embarquez une vidéo YouTube." + +#: wp-includes/js/dist/block-library.js:4004 +msgid "Embed a tweet." +msgstr "Embarquez un tweet." + +#: wp-includes/js/dist/block-library.js:13365 +msgid "Add a block that displays content pulled from other sites, like Twitter, Instagram or YouTube." +msgstr "Ajoutez un bloc affichant du contenu récupéré d’autres sites, comme Twitter, Instagram ou YouTube." + +#: wp-includes/js/dist/block-library.js:12304 +msgid "Overlay" +msgstr "Calque de superposition" + +#: wp-includes/js/dist/block-library.js:12666 +msgid "Add an image or video with a text overlay — great for headers." +msgstr "Ajoutez une image ou une vidéo avec un texte par dessus – parfait pour les en-têtes." + +#: wp-includes/js/dist/block-library.js:9577 +msgid "Border settings" +msgstr "Réglages de la bordure" + +#: wp-includes/js/dist/block-library.js:12314 +msgid "Background opacity" +msgstr "Opacité de l’arrière-plan" + +#: wp-includes/js/dist/block-library.js:12332 +#: wp-includes/js/dist/block-library.js:12665 +msgid "Cover" +msgstr "Bannière" + +#: wp-includes/js/dist/block-library.js:11307 +msgid "Add a block that displays content in multiple columns, then add whatever content blocks you’d like." +msgstr "Ajoutez un bloc qui affiche du contenu sur plusieurs colonnes puis insérez-y les blocs de votre choix." + +#: wp-includes/js/dist/block-library.js:9888 +msgid "Button" +msgstr "Bouton" + +#: wp-includes/js/dist/block-library.js:22300 +msgid "Classic" +msgstr "Classique" + +#: wp-includes/js/dist/block-library.js:11525 +msgid "A single column within a columns block." +msgstr "Une colonne unique dans un bloc de colonnes." + +#: wp-includes/js/dist/block-library.js:9910 +msgid "Outline" +msgstr "Contour" + +#: wp-includes/js/dist/block-library.js:22232 +msgctxt "button to expand options" +msgid "More" +msgstr "Plus" + +#: wp-includes/js/dist/block-library.js:22354 +msgctxt "block title" +msgid "Classic" +msgstr "Classique" + +#: wp-includes/js/dist/block-library.js:5794 +msgctxt "block style" +msgid "Rounded" +msgstr "Arrondi" + +#: wp-includes/js/dist/block-library.js:10586 +msgid "Display code snippets that respect your spacing and tabs." +msgstr "Affichez des bouts de code qui respectent vos espacements et tabulations." + +#: wp-includes/js/dist/block-library.js:10449 +msgid "Write code…" +msgstr "Rédigez du code…" + +#: wp-includes/js/dist/block-library.js:10411 +msgid "Display a list of all categories." +msgstr "Affichez une liste de toutes les catégories." + +#: wp-includes/js/dist/block-library.js:9689 +#: wp-includes/js/dist/block-library.js:13846 +msgid "Add text…" +msgstr "Ajoutez du texte…" + +#: wp-includes/js/dist/block-library.js:22355 +msgid "Use the classic WordPress editor." +msgstr "Utilisez l’éditeur classique de WordPress." + +#: wp-includes/js/dist/block-library.js:10349 +msgid "Categories settings" +msgstr "Réglages des catégories" + +#: wp-includes/js/dist/block-editor.js:7633 +#: wp-includes/js/dist/block-editor.js:7636 +#: wp-includes/js/dist/block-library.js:15037 +#: wp-includes/js/dist/block-library.js:17555 +#: wp-includes/js/dist/block-library.js:18784 +#: wp-includes/js/dist/block-library.js:20518 +msgid "Color settings" +msgstr "Réglages de couleur" + +#: wp-includes/js/dist/edit-post.js:4924 +msgid "Visibility" +msgstr "Visibilité" + +#: wp-includes/js/dist/edit-post.js:5161 +msgid "Status & visibility" +msgstr "État et visibilité" + +#. translators: ARIA label for the Document sidebar tab, not selected. +#: wp-includes/js/dist/block-editor.js:8504 +#: wp-includes/js/dist/edit-post.js:4867 wp-includes/js/dist/edit-post.js:4886 +#: wp-includes/js/dist/edit-post.js:4887 +msgid "Document" +msgstr "Document" + +#: wp-includes/js/dist/edit-post.js:1139 +msgid "Find original" +msgstr "Trouver l’original" + +#: wp-includes/js/dist/edit-post.js:1151 +msgid "Transform into:" +msgstr "Transformer en :" + +#: wp-includes/js/dist/edit-post.js:1229 +msgid "Copy all content" +msgstr "Copier tout le contenu" + +#: wp-includes/js/dist/edit-post.js:4881 +msgid "Close settings" +msgstr "Fermer les réglages" + +#: wp-includes/js/dist/block-editor.js:18971 +msgid "Editor content" +msgstr "Contenu de l’éditeur" + +#: wp-includes/js/dist/block-library.js:18002 +msgid "Block has been deleted or is unavailable." +msgstr "Le bloc a été supprimé ou n’est plus disponible." + +#: wp-includes/js/dist/edit-post.js:2432 +msgid "Code editor selected" +msgstr "Éditeur de code sélectionné" + +#: wp-includes/js/dist/edit-post.js:2432 +msgid "Visual editor selected" +msgstr "Éditeur visuel sélectionné" + +#: wp-includes/js/dist/edit-post.js:2716 +msgid "Show Block Settings" +msgstr "Afficher les réglages du bloc" + +#: wp-includes/js/dist/edit-post.js:2716 +msgid "Hide Block Settings" +msgstr "Masquer les réglages du bloc" + +#: wp-includes/js/dist/edit-post.js:2710 +msgid "Block settings closed" +msgstr "Réglages du bloc fermés" + +#: wp-includes/js/dist/edit-post.js:7052 +msgid "Close plugin" +msgstr "Fermer l’extension" + +#: wp-includes/js/dist/block-editor.js:18978 +msgid "Editor settings" +msgstr "Réglages de l’éditeur" + +#: wp-includes/js/dist/edit-post.js:7055 +msgid "Pin to toolbar" +msgstr "Épingler à la barre d’outils" + +#: wp-includes/js/dist/edit-post.js:7055 +msgid "Unpin from toolbar" +msgstr "Décrocher de la barre d’outils" + +#: wp-includes/js/dist/list-reusable-blocks.js:620 +msgid "Unknown error" +msgstr "Erreur inconnue" + +#: wp-includes/js/dist/block-editor.js:18985 +msgid "Editor publish" +msgstr "Publication depuis l’éditeur" + +#: wp-includes/js/dist/edit-post.js:6495 +msgid "Open publish panel" +msgstr "Ouvrir le panneau de publication" + +#: wp-includes/js/dist/block-library.js:18083 +msgid "Reusable Block" +msgstr "Bloc réutilisable" + +#: wp-includes/js/dist/edit-post.js:3191 +msgid "Block shortcuts" +msgstr "Raccourcis pour les blocs" + +#: wp-includes/js/dist/edit-post.js:3188 +msgid "Selection shortcuts" +msgstr "Raccourcis de sélection" + +#: wp-includes/js/dist/edit-post.js:2900 +msgid "Navigate to the previous part of the editor." +msgstr "Naviguer vers la partie précédente de l’éditeur." + +#: wp-includes/js/dist/edit-post.js:2887 +msgid "Navigate to the next part of the editor." +msgstr "Naviguer vers la partie suivante de l’éditeur." + +#: wp-includes/js/dist/edit-post.js:2878 +msgid "Show or hide the settings sidebar." +msgstr "Afficher ou masquer la colonne latérale de réglages." + +#: wp-includes/js/dist/editor.js:7016 +msgid "Undo your last changes." +msgstr "Annuler vos dernières modifications." + +#: wp-includes/js/dist/editor.js:7007 +msgid "Save your changes." +msgstr "Enregistrer vos modifications." + +#: wp-includes/js/dist/edit-post.js:2973 +msgid "Remove a link." +msgstr "Retirer un lien." + +#: wp-includes/js/dist/edit-post.js:2967 +msgid "Convert the selected text into a link." +msgstr "Convertir le texte sélectionné en lien." + +#: wp-includes/js/dist/edit-post.js:2979 +msgid "Underline the selected text." +msgstr "Souligner le texte sélectionné." + +#: wp-includes/js/dist/edit-post.js:2961 +msgid "Make the selected text italic." +msgstr "Passer le texte sélectionné en italique." + +#: wp-includes/js/dist/edit-post.js:2955 +msgid "Make the selected text bold." +msgstr "Passer le texte sélectionné en gras." + +#: wp-includes/js/dist/edit-post.js:3203 +msgid "Text formatting" +msgstr "Mise en forme du texte" + +#: wp-includes/js/dist/blocks.js:5951 wp-admin/options-writing.php:68 +#: wp-admin/options-writing.php:69 wp-admin/includes/post.php:2174 +msgid "Formatting" +msgstr "Mise en forme" + +#: wp-includes/js/dist/blocks.js:5960 wp-admin/includes/post.php:2189 +#: wp-admin/options-media.php:100 +msgid "Embeds" +msgstr "Contenus embarqués" + +#: wp-includes/js/dist/edit-post.js:3197 +msgid "Change the block type after adding a new paragraph." +msgstr "Modifier le type de block après l’ajout d’un nouveau paragraphe." + +#: wp-includes/js/dist/list-reusable-blocks.js:743 +msgid "Reusable block imported successfully!" +msgstr "Bloc réutilisable bien importé !" + +#: wp-includes/js/dist/list-reusable-blocks.js:616 +msgid "Invalid Reusable Block JSON file" +msgstr "Fichier JSON de bloc réutilisable non valide" + +#: wp-includes/js/dist/list-reusable-blocks.js:612 +msgid "Invalid JSON file" +msgstr "Fichier JSON non valide" + +#: wp-includes/js/dist/list-reusable-blocks.js:696 +msgid "Import from JSON" +msgstr "Importer d’un JSON" + +#. translators: The forward-slash character. e.g. '/'. +#: wp-includes/js/dist/edit-post.js:3200 +msgid "Forward-slash" +msgstr "Barre oblique (slash)" + +#: wp-includes/js/dist/edit-post.js:1152 +msgid "This block can only be used once." +msgstr "Ce bloc ne peut être utilisé qu’une fois." + +#: wp-includes/js/dist/edit-post.js:2638 +msgid "Exit Code Editor" +msgstr "Sortir de l’éditeur de code" + +#: wp-includes/js/dist/edit-post.js:2634 +msgid "Editing Code" +msgstr "Édition de code" + +#: wp-includes/js/dist/edit-post.js:3884 +msgid "Advanced panels" +msgstr "Panneaux avancés" + +#: wp-includes/js/dist/edit-post.js:3858 +msgid "Document panels" +msgstr "Panneaux de documentation" + +#: wp-includes/js/dist/edit-post.js:2869 +msgid "Open the block navigation menu." +msgstr "Ouvrir le menu de navigation de bloc." + +#: wp-includes/js/dist/list-reusable-blocks.js:656 +msgctxt "button label" +msgid "Import" +msgstr "Importer" + +#: wp-includes/js/dist/block-editor.js:25310 +msgid "Navigate to the nearest toolbar." +msgstr "Naviguer vers la barre d’outils la plus proche." + +#. translators: %d: number of blocks +#: wp-includes/js/dist/block-editor.js:23465 +msgid "%d block" +msgid_plural "%d blocks" +msgstr[0] "%d bloc" +msgstr[1] "%d blocs" + +#: wp-includes/js/dist/block-library.js:5392 +#: wp-includes/js/dist/block-library.js:7685 +#: wp-includes/js/dist/block-library.js:9038 +#: wp-includes/js/dist/block-library.js:13017 +#: wp-includes/js/dist/block-library.js:20542 +#: wp-includes/js/dist/block-library.js:21621 +msgid "Write caption…" +msgstr "Rédigez la légende…" + +#: wp-includes/js/dist/block-library.js:8716 +msgid "Display a monthly archive of your posts." +msgstr "Affichez une archive mensuelle de vos articles." + +#: wp-includes/js/dist/media-utils.js:654 +msgid "Select or Upload Media" +msgstr "Sélectionnez ou téléversez un fichier" + +#: wp-includes/js/dist/edit-post.js:2712 +msgid "Additional settings are now available in the Editor block settings sidebar" +msgstr "Des réglages supplémentaires sont maintenant disponibles dans l’onglet « Bloc » de la colonne latérale des réglages" + +#: wp-includes/js/dist/block-editor.js:25255 +msgid "Remove the selected block(s)." +msgstr "Retirer le (ou les) bloc(s) sélectionné(s)." + +#: wp-includes/js/dist/block-editor.js:25273 +msgid "Insert a new block after the selected block(s)." +msgstr "Insérer un nouveau bloc après le (ou les) bloc(s) sélectionné(s)." + +#: wp-includes/js/dist/block-editor.js:25264 +msgid "Insert a new block before the selected block(s)." +msgstr "Insérer un nouveau bloc avant le (ou les) bloc(s) sélectionné(s)." + +#: wp-includes/js/dist/block-editor.js:25246 +msgid "Duplicate the selected block(s)." +msgstr "Dupliquer le (ou les) bloc(s) sélectionné(s)." + +#: wp-includes/js/dist/block-library.js:9206 +msgid "Embed a simple audio player." +msgstr "Embarquez un lecteur sonore simple." + +#: wp-includes/js/dist/editor.js:7025 +msgid "Redo your last undo." +msgstr "Rétablir la dernière action." + +#: wp-includes/js/dist/block-library.js:8679 +msgid "Archives settings" +msgstr "Réglages des archives" + +#: wp-includes/js/dist/blocks.js:5963 +msgid "Reusable blocks" +msgstr "Blocs réutilisables" + +#: wp-includes/js/dist/blocks.js:5948 +msgid "Common blocks" +msgstr "Blocs communs" + +#: wp-includes/js/dist/block-library.js:9002 +msgid "Audio settings" +msgstr "Réglages du son" + +#: wp-includes/js/dist/edit-post.js:2860 +msgid "Switch between Visual editor and Code editor." +msgstr "Basculer de l’éditeur visuel à l’éditeur de code." + +#: wp-includes/js/dist/blocks.js:5954 +msgid "Layout elements" +msgstr "Éléments de mise en page" + +#: wp-includes/js/dist/edit-post.js:3878 wp-includes/js/dist/edit-post.js:5599 +#: wp-admin/includes/meta-boxes.php:1529 wp-admin/menu.php:295 +msgid "Discussion" +msgstr "Commentaires" + +#: wp-includes/js/dist/block-editor.js:25293 +msgid "Select all text when typing. Press again to select all blocks." +msgstr "Sélectionner tout le texte lors de la saisie. Réappuyez pour sélectionner tous les blocs." + +#: wp-includes/js/dist/edit-post.js:4298 +msgid "Editor" +msgstr "Éditeur" + +#: wp-includes/js/dist/edit-post.js:4260 +msgid "Visual editor" +msgstr "Éditeur visuel" + +#: wp-includes/js/dist/edit-post.js:4263 +msgid "Code editor" +msgstr "Éditeur de code" + +#: wp-includes/js/dist/edit-post.js:3185 +msgid "Global shortcuts" +msgstr "Raccourcis généraux" + +#: wp-includes/js/dist/edit-post.js:4462 +msgid "Fullscreen mode" +msgstr "Mode plein écran" + +#: wp-includes/js/dist/edit-post.js:4447 +msgctxt "noun" +msgid "View" +msgstr "Vue" + +#: wp-includes/js/dist/edit-post.js:3847 wp-includes/js/dist/edit-post.js:4354 +msgid "Options" +msgstr "Options" + +#: wp-includes/js/dist/edit-post.js:4456 +msgid "Spotlight mode" +msgstr "Mode « mise en lumière »" + +#: wp-includes/js/dist/edit-post.js:4463 +msgid "Work without distraction" +msgstr "Travaillez sans distraction" + +#: wp-includes/js/dist/edit-post.js:4457 +msgid "Focus on one block at a time" +msgstr "Concentrez-vous sur un bloc à la fois" + +#: wp-includes/js/dist/edit-post.js:4451 +msgid "Access all block and document tools in a single place" +msgstr "Accédez à tous les outils de blocs et de document à partir d’un endroit unique" + +#: wp-includes/js/dist/block-editor.js:18962 +msgid "Editor top bar" +msgstr "Barre d’outils de l’éditeur" + +#: wp-includes/js/dist/editor.js:5900 +msgid "Block deleted." +msgstr "Bloc supprimé." + +#: wp-includes/js/dist/editor.js:5781 +msgid "Block created." +msgstr "Bloc créé." + +#: wp-includes/js/dist/editor.js:2694 +msgid "Trashing failed" +msgstr "Suppression échouée" + +#: wp-includes/js/dist/block-editor.js:26246 +msgid "HTML anchor" +msgstr "Ancre HTML" + +#: wp-includes/js/dist/editor.js:7189 +msgid "Reset the template" +msgstr "Réinitialiser le modèle" + +#: wp-includes/js/dist/editor.js:7186 +msgid "Keep it as is" +msgstr "Laisser tel quel" + +#: wp-includes/js/dist/block-editor.js:21023 +#: wp-includes/js/dist/block-library.js:9739 +msgid "Link settings" +msgstr "Réglages de lien" + +#. translators: %s: file name +#: wp-includes/js/dist/media-utils.js:1198 +msgid "Error while uploading file %s to the media library." +msgstr "Erreur lors du téléversement du fichier %s dans la bibliothèque de médias." + +#: wp-includes/js/dist/editor.js:5960 +msgid "Untitled Reusable Block" +msgstr "Bloc réutilisable sans titre" + +#: wp-includes/js/dist/editor.js:12955 +msgid "You have unsaved changes. If you proceed, they will be lost." +msgstr "Vous avez des changements non enregistrés. Si vous poursuivez, ils seront perdus." + +#: wp-includes/js/dist/block-editor.js:8714 +msgid "Very light gray" +msgstr "Gris très clair" + +#: wp-includes/js/dist/block-editor.js:8706 +msgid "Vivid cyan blue" +msgstr "Bleu cyan vif" + +#: wp-includes/js/dist/block-editor.js:8702 +msgid "Pale cyan blue" +msgstr "Bleu cyan pâle" + +#: wp-includes/js/dist/block-editor.js:8694 +msgid "Light green cyan" +msgstr "Vert clair cyan" + +#: wp-includes/js/dist/block-editor.js:8698 +msgid "Vivid green cyan" +msgstr "Cyan vert vif" + +#: wp-includes/js/dist/block-editor.js:8690 +msgid "Luminous vivid amber" +msgstr "Ambre lumineux et vif" + +#: wp-includes/js/dist/block-editor.js:8686 +msgid "Luminous vivid orange" +msgstr "Orange vif lumineux" + +#: wp-includes/js/dist/block-editor.js:8682 +msgid "Vivid red" +msgstr "Rouge vif" + +#: wp-includes/js/dist/block-editor.js:8678 +msgid "Pale pink" +msgstr "Rose pâle" + +#: wp-includes/js/dist/block-editor.js:8718 +msgid "Cyan bluish gray" +msgstr "Gris bleuté cyan" + +#: wp-includes/js/dist/media-utils.js:1108 +msgid "This file is empty." +msgstr "Ce fichier est vide." + +#: wp-includes/js/dist/media-utils.js:1082 +msgid "Sorry, this file type is not supported here." +msgstr "Désolé ce type de fichier n’est pas pris en charge ici." + +#. translators: accessibility text for the editor toolbar when Top Toolbar is +#. off +#: wp-includes/js/dist/edit-post.js:4214 +msgid "Document tools" +msgstr "Outils du document" + +#. translators: accessibility text for the editor toolbar when Top Toolbar is +#. on +#: wp-includes/js/dist/edit-post.js:4212 +msgid "Document and block tools" +msgstr "Outils du document et des blocs" + +#: wp-includes/js/dist/block-editor.js:8743 +msgctxt "font size name" +msgid "Huge" +msgstr "Énorme" + +#: wp-includes/js/dist/block-editor.js:8739 +msgctxt "font size name" +msgid "Large" +msgstr "Grand" + +#: wp-includes/js/dist/block-editor.js:8735 +msgctxt "font size name" +msgid "Medium" +msgstr "Moyen" + +#: wp-includes/js/dist/block-editor.js:8727 +msgctxt "font size name" +msgid "Small" +msgstr "Petit" + +#: wp-includes/js/dist/editor.js:7193 +msgid "The content of your post doesn’t match the template assigned to your post type." +msgstr "Le contenu de votre publication ne correspond pas au modèle assigné à votre type de publications." + +#: wp-includes/js/dist/editor.js:2670 wp-includes/js/dist/editor.js:2671 +msgid "Publishing failed." +msgstr "Publication échouée." + +#: wp-includes/js/dist/editor.js:2672 +msgid "Scheduling failed." +msgstr "Planification échouée." + +#: wp-includes/js/dist/editor.js:2674 +msgid "Updating failed." +msgstr "Mise à jour échouée." + +#: wp-includes/js/dist/block-editor.js:26344 +msgid "Additional CSS class(es)" +msgstr "Classe(s) CSS additionnelle(s)" + +#: wp-includes/js/dist/editor.js:12831 +msgid "Document Outline" +msgstr "Aperçu du document" + +#: wp-includes/js/dist/editor.js:12823 +msgid "Paragraphs" +msgstr "Paragraphes" + +#: wp-includes/js/dist/editor.js:12819 +msgid "Headings" +msgstr "Titres" + +#: wp-includes/js/dist/editor.js:12880 +msgid "Content structure" +msgstr "Structure du contenu" + +#: wp-includes/js/dist/editor.js:9680 +msgid "Visible to everyone." +msgstr "Visible pour tout le monde." + +#: wp-includes/js/dist/editor.js:10263 +msgctxt "term" +msgid "%s removed" +msgstr "%s supprimé" + +#: wp-includes/js/dist/editor.js:10262 wp-includes/js/dist/editor.js:11564 +msgctxt "term" +msgid "%s added" +msgstr "%s ajouté" + +#: wp-includes/js/dist/editor.js:9838 +msgid "Create password" +msgstr "Créer un mot de passe" + +#: wp-includes/js/dist/editor.js:11812 +msgid "Parent Term" +msgstr "Terme parent" + +#: wp-includes/js/dist/editor.js:11810 wp-includes/js/dist/editor.js:11811 +msgid "Add new term" +msgstr "Ajouter un nouveau terme" + +#: wp-includes/js/dist/editor.js:11810 wp-includes/js/dist/editor.js:11811 +msgid "Add new category" +msgstr "Ajouter une nouvelle catégorie" + +#: wp-includes/js/dist/editor.js:10261 wp-includes/js/dist/editor.js:11564 +msgid "Term" +msgstr "Terme" + +#: wp-includes/js/dist/editor.js:10261 +msgid "Tag" +msgstr "Étiquette" + +#: wp-includes/js/dist/editor.js:10260 +msgid "Add new Term" +msgstr "Ajouter un nouveau terme" + +#: wp-includes/js/dist/editor.js:9968 +msgid "Immediately" +msgstr "Immédiatement" + +#: wp-includes/js/dist/editor.js:11048 +msgid "Saving" +msgstr "Enregistrement" + +#: wp-includes/js/dist/editor.js:9684 +msgid "Only visible to site admins and editors." +msgstr "Uniquement visible pour les administrateur·ices et les éditeur·ices." + +#: wp-includes/js/dist/editor.js:12810 +msgid "Document Statistics" +msgstr "Statistiques du document" + +#: wp-includes/js/dist/block-editor.js:23210 +msgid "Skip to the selected block" +msgstr "Aller au bloc sélectionné." + +#: wp-includes/js/dist/editor.js:10264 +msgctxt "term" +msgid "Remove %s" +msgstr "Retirer %s" + +#: wp-includes/js/dist/editor.js:13617 +msgid "View the autosave" +msgstr "Voir l’enregistrement automatique" + +#: wp-includes/js/dist/editor.js:13614 +msgid "There is an autosave of this post that is more recent than the version below." +msgstr "Il existe un enregistrement automatique plus récent pour ce contenu." + +#: wp-includes/js/dist/editor.js:11048 +msgid "Autosaving" +msgstr "Enregistrement automatique" + +#: wp-includes/js/dist/editor.js:10904 +msgid "Are you sure you want to unschedule this post?" +msgstr "Confirmez-vous la déplanification de cette publication ?" + +#: wp-includes/js/dist/editor.js:9809 +msgid "Post Visibility" +msgstr "Visibilité de la publication" + +#: wp-includes/js/dist/editor.js:9749 +msgid "Would you like to privately publish this post now?" +msgstr "Voulez-vous passer cette publication en privé ?" + +#: wp-includes/js/dist/editor.js:11818 +msgid "Terms" +msgstr "Termes" + +#: wp-includes/js/dist/editor.js:7176 +msgid "Resetting the template may result in loss of content, do you want to continue?" +msgstr "Réinitialiser le modèle peut entraîner la perte de contenu, voulez-vous continuer ?" + +#: wp-includes/js/dist/editor.js:9688 +msgid "Protected with a password you choose. Only those with the password can view this post." +msgstr "Protégé avec un mot de passe que vous définissez. Seules les personnes le connaissant pourront accéder à la publication." + +#: wp-includes/js/dist/editor.js:12560 wp-includes/js/dist/editor.js:12565 +#: wp-admin/edit-form-advanced.php:513 wp-admin/edit-form-blocks.php:294 +msgid "Add title" +msgstr "Saisissez le titre" + +#: wp-includes/js/dist/editor.js:10902 +msgid "Are you sure you want to unpublish this post?" +msgstr "Confirmez-vous la mise hors-ligne de cette publication ?" + +#: wp-includes/js/dist/editor.js:9844 +msgid "Use a secure password" +msgstr "Utilisez un MDP fort" + +#: wp-includes/js/dist/editor.js:10918 +msgid "Switch to draft" +msgstr "Basculer en brouillon" + +#: wp-includes/js/dist/editor.js:10543 +msgid "Publish:" +msgstr "Publier : " + +#: wp-includes/js/dist/editor.js:10537 wp-admin/includes/meta-boxes.php:157 +msgid "Visibility:" +msgstr "Visibilité : " + +#: wp-includes/js/dist/editor.js:10524 +msgid "When you’re ready, submit your work for review, and an Editor will be able to approve it for you." +msgstr "Lorsque vous serez prêt·e, envoyez votre travail en relecture, ainsi un éditeur pourra l’approuver pour vous." + +#: wp-includes/js/dist/editor.js:9397 wp-includes/js/dist/editor.js:9602 +msgid "Publish…" +msgstr "Publier…" + +#: wp-includes/js/dist/editor.js:10527 +msgid "Your work will be published at the specified date and time." +msgstr "Votre travail sera mis en ligne à la date et heure planifiée." + +#: wp-includes/js/dist/editor.js:10530 +msgid "Double-check your settings before publishing." +msgstr "Revérifiez vos réglages avant de publier." + +#: wp-includes/js/dist/editor.js:10529 +msgid "Are you ready to publish?" +msgstr "Confirmez-vous la publication ?" + +#: wp-includes/js/dist/editor.js:10526 +msgid "Are you ready to schedule?" +msgstr "Confirmez-vous la planification ?" + +#: wp-includes/media-template.php:509 wp-includes/media-template.php:696 +#: wp-includes/js/dist/editor.js:10679 +msgid "Copy Link" +msgstr "Copier le lien" + +#: wp-includes/js/dist/editor.js:10679 wp-includes/js/dist/edit-post.js:1229 +#: wp-includes/js/dist/block-library.js:13859 wp-admin/site-health-info.php:102 +msgid "Copied!" +msgstr "Copié !" + +#: wp-includes/js/dist/editor.js:10523 +msgid "Are you ready to submit for review?" +msgstr "Confirmez-vous la mise en attente de relecture ?" + +#. translators: %s: post type singular name +#: wp-includes/js/dist/editor.js:10667 +msgid "%s address" +msgstr "Adresse (%s)" + +#: wp-includes/js/dist/editor.js:10662 +msgid "What’s next?" +msgstr "Et maintenant ?" + +#: wp-includes/js/dist/editor.js:9390 wp-admin/includes/meta-boxes.php:350 +#: wp-admin/includes/meta-boxes.php:351 +msgid "Submit for Review" +msgstr "Soumettre à la relecture" + +#: wp-includes/js/dist/editor.js:9384 +msgid "Updating…" +msgstr "Mise à jour…" + +#: wp-includes/js/dist/editor.js:9382 +msgid "Publishing…" +msgstr "Publication…" + +#: wp-includes/js/dist/editor.js:10652 +msgid "is now live." +msgstr "est maintenant en ligne." + +#: wp-includes/js/dist/editor.js:10652 +msgid "is now scheduled. It will go live on" +msgstr "est maintenant planifié. Il sera publié le" + +#: wp-includes/js/dist/editor.js:9386 +msgid "Scheduling…" +msgstr "Planification…" + +#: wp-includes/js/dist/editor.js:10340 +msgid "Add tags" +msgstr "Ajouter des étiquettes" + +#: wp-includes/js/dist/editor.js:10454 +msgid "Apply the \"%1$s\" format." +msgstr "Appliquer le format « %1$s »." + +#: wp-includes/js/dist/editor.js:10451 +msgid "Your theme uses post formats to highlight different kinds of content, like images or videos. Apply a post format to see this special styling." +msgstr "Votre thème utilise les formats de publication pour mettre en avant différents types de contenus, comme les images ou les vidéos. Appliquez un format de publication pour utiliser cette mise en forme spécifique." + +#: wp-includes/js/dist/editor.js:10447 +msgid "Use a post format" +msgstr "Utiliser un format de publication" + +#: wp-includes/js/dist/editor.js:10808 +msgid "Close panel" +msgstr "Fermer le panneau" + +#: wp-includes/js/dist/editor.js:10816 +msgid "Always show pre-publish checks." +msgstr "Toujours afficher les vérifications de pré-publication." + +#: wp-includes/js/dist/editor.js:10344 +msgid "Tags help users and search engines navigate your site and find your content. Add a few keywords to describe your post." +msgstr "Les étiquettes aident les utilisateurs et utilisatrices ainsi que les moteurs de recherche à naviguer sur votre site et à trouver vos contenus. Ajoutez quelques mots-clés pour décrire votre publication." + +#: wp-includes/js/dist/editor.js:9344 +msgid "Allow pingbacks & trackbacks" +msgstr "Autoriser les pings et les rétroliens" + +#: wp-includes/js/dist/editor.js:8559 +msgid "Standard" +msgstr "Standard" + +#: wp-includes/js/dist/editor.js:8213 +msgid "Learn more about manual excerpts" +msgstr "En apprendre plus sur les extraits manuels" + +#: wp-includes/js/dist/editor.js:8172 wp-admin/includes/meta-boxes.php:786 +msgid "Allow comments" +msgstr "Autoriser les commentaires" + +#: wp-includes/js/dist/editor.js:7459 +msgid "Attempt Recovery" +msgstr "Tentative de récupération" + +#: wp-includes/js/dist/editor.js:7468 +msgid "The editor has encountered an unexpected error." +msgstr "L’éditeur a rencontré une erreur inattendue." + +#: wp-includes/js/dist/block-editor.js:13760 +#: wp-includes/js/dist/block-editor.js:24590 +msgid "More options" +msgstr "Plus d’options" + +#: wp-includes/js/dist/block-editor.js:24415 +msgid "Edit visually" +msgstr "Modifier visuellement" + +#: wp-includes/js/dist/block-editor.js:24607 +msgid "Duplicate" +msgstr "Dupliquer" + +#: wp-includes/js/dist/block-editor.js:24415 +msgid "Edit as HTML" +msgstr "Modifier en HTML" + +#: wp-includes/js/dist/editor.js:7792 wp-admin/includes/meta-boxes.php:993 +#: wp-admin/includes/media.php:1388 wp-admin/includes/media.php:2544 +#: wp-admin/includes/class-wp-posts-list-table.php:1697 +msgid "Order" +msgstr "Ordre" + +#: wp-includes/js/dist/editor.js:7905 +msgid "no title" +msgstr "aucun titre" + +#: wp-includes/js/dist/editor.js:6747 +msgid "(Multiple H1 headings are not recommended)" +msgstr "(il est déconseillé d’utiliser plusieurs titres H1)" + +#: wp-includes/js/dist/editor.js:8926 +msgctxt "imperative verb" +msgid "Preview" +msgstr "Prévisualiser" + +#: wp-includes/js/dist/editor.js:12372 wp-admin/includes/post.php:1445 +#: wp-admin/includes/post.php:1468 +msgid "Permalink:" +msgstr "Permalien :" + +#: wp-includes/js/dist/editor.js:8753 +msgid "%d Revision" +msgid_plural "%d Revisions" +msgstr[0] "%d révision" +msgstr[1] "%d révisions" + +#: wp-includes/js/dist/block-editor.js:17888 +#: wp-includes/js/dist/block-editor.js:17891 +#: wp-includes/js/dist/edit-post.js:3419 +msgid "Search for a block" +msgstr "Rechercher un bloc" + +#: wp-includes/js/dist/editor.js:6737 +msgid "(Incorrect heading level)" +msgstr "(niveau de titre erroné)" + +#: wp-includes/js/dist/editor.js:8205 +msgid "Write an excerpt (optional)" +msgstr "Rédiger un extrait (facultatif)" + +#: wp-includes/js/dist/editor.js:8544 +msgid "Aside" +msgstr "En passant" + +#: wp-includes/js/dist/block-editor.js:7459 +msgid "This color combination may be hard for people to read. Try using a darker background color and/or a brighter text color." +msgstr "Cette combinaison de couleurs est difficilement lisible. Essayez d’utiliser une couleur d’arrière-plan et/ou de texte plus sombre." + +#: wp-includes/js/dist/editor.js:12206 +msgid "Edit post permalink" +msgstr "Modifier le permalien du contenu" + +#: wp-includes/js/dist/editor.js:12350 +msgid "Copy the permalink" +msgstr "Copier le permalien" + +#: wp-includes/js/dist/editor.js:12350 +msgid "Permalink copied" +msgstr "Permalien copié" + +#: wp-includes/js/dist/editor.js:7467 +msgid "Copy Error" +msgstr "Copier l’erreur" + +#: wp-includes/js/dist/block-library.js:21603 +msgid "Replace image" +msgstr "Remplacer l’image" + +#: wp-includes/js/dist/block-editor.js:24789 +msgid "Block Styles" +msgstr "Styles de bloc" + +#: wp-includes/js/dist/block-editor.js:17900 +#: wp-includes/js/dist/edit-post.js:3432 +msgid "Available block types" +msgstr "Types de bloc disponibles" + +#: wp-includes/js/dist/block-editor.js:24796 +msgid "Transform To:" +msgstr "Transformer en :" + +#: wp-includes/js/dist/editor.js:13227 +msgid "Remove from Reusable blocks" +msgstr "Retirer des blocs réutilisables" + +#: wp-includes/js/dist/editor.js:13136 +msgid "Add to Reusable blocks" +msgstr "Ajouter aux blocs réutilisables" + +#: wp-includes/js/dist/editor.js:8571 +msgid "Chat" +msgstr "Discussion" + +#: wp-includes/js/dist/editor.js:7911 +msgid "no parent" +msgstr "Aucun parent" + +#: wp-includes/js/dist/editor.js:6732 +msgid "(Empty heading)" +msgstr "(Titre vide)" + +#: wp-includes/js/dist/editor.js:13139 +msgid "Convert to Regular Block" +msgstr "Convertir en bloc Gutenberg normal" + +#: wp-includes/js/dist/block-editor.js:23790 +msgid "Blocks cannot be moved down as they are already at the bottom" +msgstr "Les blocs ne peuvent pas être déplacés vers le bas car ils sont déjà tout en bas." + +#: wp-includes/js/dist/block-editor.js:23786 +msgid "Blocks cannot be moved up as they are already at the top" +msgstr "Les blocs ne peuvent pas être déplacés vers le haut car ils sont déjà tout en haut." + +#: wp-includes/js/dist/editor.js:8595 +msgid "Post Format" +msgstr "Format de publication" + +#: wp-includes/js/dist/editor.js:6742 +msgid "(Your theme may already use a H1 for the post title)" +msgstr "(votre thème devrait avoir un H1 pour le titre de cette publication)" + +#: wp-includes/js/dist/block-editor.js:24615 +msgid "Insert After" +msgstr "Insérer après" + +#: wp-includes/js/dist/block-editor.js:24611 +msgid "Insert Before" +msgstr "Insérer avant" + +#: wp-includes/js/dist/block-editor.js:17955 +msgid "Reusable" +msgstr "Réutilisables" + +#: wp-includes/js/dist/block-editor.js:17969 +#: wp-includes/js/dist/edit-post.js:1385 +msgid "Manage all reusable blocks" +msgstr "Gérer tous les blocs réutilisables" + +#: wp-includes/js/dist/block-editor.js:24763 +msgid "Change type of %d block" +msgid_plural "Change type of %d blocks" +msgstr[0] "Modifier le type de %d bloc" +msgstr[1] "Modifier le type de %d blocs" + +#: wp-includes/js/dist/editor.js:11722 +#: wp-includes/js/dist/block-editor.js:17830 +msgid "%d result found." +msgid_plural "%d results found." +msgstr[0] "%d résultat trouvé." +msgstr[1] "%d résultats trouvés." + +#: wp-includes/js/dist/editor.js:9199 +msgid "Take Over" +msgstr "Prendre le contrôle" + +#. translators: %s: user's display name +#: wp-includes/js/dist/editor.js:9191 +msgid "Another user is currently working on this post, which means you cannot make changes, unless you take over." +msgstr "Un autre utilisateur ou utilisatrice travaille actuellement sur cette publication, ce qui signifie que vous ne pouvez pas faire de modifications à moins que vous ne preniez le contrôle." + +#. translators: %s: user's display name +#: wp-includes/js/dist/editor.js:9191 +msgid "%s is currently working on this post, which means you cannot make changes, unless you take over." +msgstr "%s travaille actuellement sur cette publication, ce qui signifie que vous ne pouvez pas faire de modifications à moins que vous ne preniez le contrôle." + +#: wp-includes/js/dist/editor.js:9180 +msgid "Avatar" +msgstr "Avatar" + +#: wp-includes/js/dist/editor.js:9172 +msgid "This post is already being edited." +msgstr "Cette publication est déjà en cours de modification." + +#: wp-includes/js/dist/editor.js:9172 +msgid "Someone else has taken over this post." +msgstr "Quelqu’un d’autre a pris le contrôle sur cette publication." + +#: wp-includes/js/dist/block-editor.js:17907 +msgctxt "blocks" +msgid "Most used" +msgstr "Les plus utilisés" + +#: wp-includes/js/dist/editor.js:8805 wp-includes/js/dist/editor.js:8815 +msgid "Generating preview…" +msgstr "Génération de l’aperçu…" + +#: wp-includes/js/dist/editor.js:8401 +msgid "Edit or update the image" +msgstr "Modifier ou mettre à jour l’image" + +#. translators: %s: user's display name +#: wp-includes/js/dist/editor.js:9184 +msgid "Another user now has editing control of this post. Don’t worry, your changes up to this moment have been saved." +msgstr "Un autre utilisateur ou utilisatrice vient de prendre le contrôle de modification sur cette publication. Ne vous inquiétez pas, les modifications faites avant cela ont été enregistrées" + +#. translators: %s: user's display name +#: wp-includes/js/dist/editor.js:9184 +msgid "%s now has editing control of this post. Don’t worry, your changes up to this moment have been saved." +msgstr "%s vient de prendre le contrôle de modification sur cette publication. Ne vous inquiétez pas, les modifications faites avant cela ont été enregistrées" + +#: wp-includes/js/dist/block-editor.js:21093 +msgid "Paste or type URL" +msgstr "Collez ou saisissez une URL" + +#: wp-includes/js/dist/editor.js:7463 +msgid "Copy Post Text" +msgstr "Copier le texte de la publication" + +#: wp-includes/js/dist/block-editor.js:7459 +msgid "This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color." +msgstr "Cette combinaison de couleurs peut être difficile a lire pour certaines personnes. Essayez d’utiliser une couleur d’arrière-plan plus claire et/ou une couleur de texte plus foncée." + +#. translators: 1: Type of block (i.e. Text, Image etc) +#: wp-includes/js/dist/block-editor.js:23765 +msgid "Block %1$s is at the beginning of the content and can’t be moved right" +msgstr "Le bloc « %1$s » est au début du contenu et ne peut être déplacé plus haut" + +#: wp-includes/js/dist/block-editor.js:24627 +msgid "Remove Block" +msgid_plural "Remove Blocks" +msgstr[0] "Retirer le bloc" +msgstr[1] "Retirer les blocs" + +#. translators: 1: Number of selected blocks, 2: Position of selected blocks +#: wp-includes/js/dist/block-editor.js:23800 +msgid "Move %1$d block from position %2$d down by one place" +msgid_plural "Move %1$d blocks from position %2$d down by one place" +msgstr[0] "Déplacer %1$d bloc d’une place en dessous de %2$d" +msgstr[1] "Déplacer %1$d blocs d’une place en dessous de %2$d" + +#. translators: 1: Number of selected blocks, 2: Position of selected blocks +#: wp-includes/js/dist/block-editor.js:23795 +msgid "Move %1$d block from position %2$d up by one place" +msgid_plural "Move %1$d blocks from position %2$d up by one place" +msgstr[0] "Déplacer %1$d bloc d’une place en dessus de %2$d" +msgstr[1] "Déplacer %1$d blocs d’une place en dessus de %2$d" + +#. translators: 1: Type of block (i.e. Text, Image etc), 2: Position of +#. selected block, 3: New position +#: wp-includes/js/dist/block-editor.js:23735 +msgid "Move %1$s block from position %2$d up to position %3$d" +msgstr "Déplacer le bloc %1$s de la position %2$d vers la position %3$d" + +#. translators: 1: Type of block (i.e. Text, Image etc) +#: wp-includes/js/dist/block-editor.js:23725 +msgid "Block %1$s is at the end of the content and can’t be moved right" +msgstr "Le bloc « %1$s » est à la fin du contenu et ne peut pas être déplacé vers le bas" + +#: wp-includes/js/dist/block-editor.js:16599 +#: wp-includes/js/dist/block-directory.js:1262 +msgid "Add block" +msgstr "Ajouter un bloc" + +#: wp-includes/js/dist/block-editor.js:14030 +#: wp-includes/js/dist/block-editor.js:24465 +msgid "Convert to Blocks" +msgstr "Convertir en blocs" + +#: wp-includes/js/dist/block-editor.js:14104 +msgid "This block has encountered an error and cannot be previewed." +msgstr "Ce bloc a rencontré une erreur et ne peut pas être prévisualisé." + +#: wp-includes/js/dist/block-editor.js:23584 +msgid "No block selected." +msgstr "Aucun bloc sélectionné." + +#: wp-includes/js/dist/components.js:35173 +#: wp-includes/js/dist/components.js:35322 +#: wp-includes/js/dist/block-editor.js:19241 +msgid "Reset" +msgstr "Réinitialiser " + +#: wp-includes/js/dist/components.js:39255 +msgid "Order by" +msgstr "Ordonner par" + +#: wp-includes/js/dist/components.js:39289 wp-includes/js/dist/editor.js:11564 +msgid "Category" +msgstr "Catégorie" + +#: wp-includes/js/dist/components.js:39295 +#: wp-includes/js/dist/block-library.js:18242 +msgid "Number of items" +msgstr "Nombre d’éléments" + +#: wp-includes/js/dist/block-editor.js:16200 +msgid "Block: %s" +msgstr "Bloc : %s" + +#: wp-includes/js/dist/components.js:36502 +msgid "Item removed." +msgstr "Élément retiré." + +#: wp-includes/js/dist/components.js:36501 +#: wp-admin/includes/edit-tag-messages.php:14 +msgid "Item added." +msgstr "Élément ajouté." + +#. translators: label for ordering posts by title in descending order +#: wp-includes/js/dist/components.js:39269 +msgid "Z → A" +msgstr "Z \t A" + +#. translators: label for ordering posts by title in ascending order +#: wp-includes/js/dist/components.js:39265 +msgid "A → Z" +msgstr "A \t Z" + +#: wp-includes/js/dist/components.js:39261 +msgid "Oldest to newest" +msgstr "Des plus anciens aux plus récents" + +#: wp-includes/js/dist/components.js:39258 +msgid "Newest to oldest" +msgstr "Des plus récents aux plus anciens" + +#: wp-includes/js/dist/block-editor.js:8342 +msgid "Full width" +msgstr "Pleine largeur" + +#. translators: %s: Type of block (i.e. Text, Image etc) +#: wp-includes/js/dist/block-editor.js:23686 +msgid "Block %s is the only block, and cannot be moved" +msgstr "Le bloc « %s » est le seul bloc et ne peut pas être déplacé" + +#. translators: 1: term name, 2: term position in a set of terms, 3: total term +#. set count. +#: wp-includes/js/dist/components.js:35539 +msgid "%1$s (%2$s of %3$s)" +msgstr "%1$s (%2$s sur %3$s)" + +#: wp-includes/js/dist/components.js:36503 +msgid "Remove item" +msgstr "Retirer l’élément" + +#. translators: %s: error message describing the problem +#: wp-includes/js/dist/server-side-render.js:564 +msgid "Error loading block: %s" +msgstr "Erreur de chargement du bloc : %s" + +#. translators: 1: Type of block (i.e. Text, Image etc), 2: Position of +#. selected block, 3: New position +#: wp-includes/js/dist/block-editor.js:23695 +msgid "Move %1$s block from position %2$d down to position %3$d" +msgstr "Déplacer le bloc %1$s de la position %2$d vers la position %3$d" + +#: wp-includes/js/dist/block-editor.js:14001 +msgid "Convert to Classic Block" +msgstr "Convertir en bloc Classique" + +#: wp-includes/js/dist/block-editor.js:13917 +msgid "After Conversion" +msgstr "Après conversion" + +#: wp-includes/js/dist/block-editor.js:13910 +msgid "Current" +msgstr "Actuel" + +#: wp-includes/js/dist/block-editor.js:8372 +msgid "Change alignment" +msgstr "Modifier l’alignement" + +#: wp-includes/js/dist/block-editor.js:8138 +msgid "Change text alignment" +msgstr "Modifier l’alignement du texte" + +#: wp-includes/js/dist/block-editor.js:8338 +msgid "Wide width" +msgstr "Grande largeur" + +#: wp-includes/js/dist/block-editor.js:13913 +#: wp-includes/js/dist/block-editor.js:14018 +msgid "Convert to HTML" +msgstr "Convertir en HTML" + +#: wp-includes/js/dist/block-editor.js:14020 +msgid "This block contains unexpected or invalid content." +msgstr "Ce bloc contient du contenu non valide ou inattendu." + +#. translators: Dialog title to fix block content +#: wp-includes/js/dist/block-editor.js:14022 +msgid "Resolve Block" +msgstr "Résoudre les problèmes de ce bloc" + +#: wp-includes/js/dist/components.js:36419 +msgid "Add item" +msgstr "Ajouter un élément" + +#: wp-includes/js/dist/block-editor.js:8731 +msgctxt "font size name" +msgid "Normal" +msgstr "Normal" + +#: wp-includes/js/dist/components.js:11791 +#: wp-includes/js/dist/components.js:38799 +msgid "Dismiss this notice" +msgstr "Ignorer cette notification" + +#. translators: Button to fix block content +#: wp-includes/js/dist/block-editor.js:14014 +msgctxt "imperative verb" +msgid "Resolve" +msgstr "Résoudre" + +#: wp-includes/post.php:282 wp-includes/js/dist/editor.js:5781 +msgid "Block updated." +msgstr "Bloc mis à jour." + +#: wp-includes/post.php:273 wp-includes/js/dist/block-editor.js:17984 +#: wp-includes/js/dist/edit-post.js:3436 +msgid "No blocks found." +msgstr "Aucun bloc trouvé." + +#: wp-includes/js/dist/components.js:24023 +#: wp-includes/js/dist/components.js:36349 +#: wp-includes/js/dist/block-editor.js:20362 +msgid "No results." +msgstr "Aucun résultat." + +#: wp-includes/js/dist/components.js:24021 +#: wp-includes/js/dist/components.js:36349 +#: wp-includes/js/dist/block-editor.js:20360 +msgid "%d result found, use up and down arrow keys to navigate." +msgid_plural "%d results found, use up and down arrow keys to navigate." +msgstr[0] "%d résultat trouvé, vous pouvez naviguer avec les touches haut et bas." +msgstr[1] "%d résultats trouvés, vous pouvez naviguer avec les touches haut et bas." + +#: wp-includes/js/dist/components.js:28903 +msgid "Custom color picker" +msgstr "Sélecteur de couleur personnalisée" + +#. translators: %s: The name of the color e.g: "vivid red". +#: wp-includes/js/dist/components.js:28880 +msgid "Color: %s" +msgstr "Couleur : %s" + +#. translators: %s: color hex code e.g: "#f00". +#: wp-includes/js/dist/components.js:28872 +#: wp-includes/js/dist/components.js:28881 +msgid "Color code: %s" +msgstr "Code couleur : %s" + +#. translators: accessibility text +#. translators: Accessibility text. +#: wp-login.php:671 wp-includes/widgets/class-wp-widget-custom-html.php:317 +#: wp-includes/media-template.php:173 +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:59 +#: wp-includes/functions.php:7441 +#: wp-includes/class-wp-customize-manager.php:4304 +#: wp-includes/class-wp-customize-manager.php:5626 +#: wp-includes/class-wp-customize-manager.php:5647 +#: wp-includes/js/dist/components.js:34651 wp-includes/js/dist/editor.js:8930 +#: wp-admin/includes/theme.php:750 +#: wp-admin/includes/class-wp-privacy-policy-content.php:358 +#: wp-admin/includes/meta-boxes.php:76 wp-admin/includes/media.php:3199 +#: wp-admin/includes/class-wp-site-health.php:730 +#: wp-admin/includes/class-wp-site-health.php:843 +#: wp-admin/includes/class-wp-site-health.php:1117 +#: wp-admin/includes/class-wp-site-health.php:1354 +#: wp-admin/includes/class-wp-site-health.php:1392 +#: wp-admin/includes/class-wp-site-health.php:1461 +#: wp-admin/includes/dashboard.php:1225 wp-admin/includes/dashboard.php:1237 +#: wp-admin/includes/dashboard.php:1250 wp-admin/includes/dashboard.php:1748 +msgid "(opens in a new tab)" +msgstr "(ouvre un nouvel onglet)" + +#: wp-includes/js/dist/components.js:33146 +msgid "Minutes" +msgstr "Minutes" + +#: wp-includes/js/dist/components.js:33269 +msgid "Go to the first (home) or last (end) day of a week." +msgstr "Aller au premier (accueil) ou dernier (fin) jour d’une semaine." + +#: wp-includes/js/dist/components.js:33267 +msgid "Home/End" +msgstr "Accueil/fin" + +#: wp-includes/js/dist/components.js:33266 +msgid "Home and End" +msgstr "Accueil et fin" + +#: wp-includes/js/dist/components.js:33249 +msgid "Click to Select" +msgstr "Cliquez pour sélectionner" + +#: wp-includes/js/dist/components.js:33276 +msgid "Calendar Help" +msgstr "Aide de calendrier" + +#: wp-includes/js/dist/components.js:33249 +msgid "Click the desired day to select it." +msgstr "Cliquez sur le jour désiré pour le sélectionner." + +#: wp-includes/js/dist/components.js:33249 +msgid "Navigating with a keyboard" +msgstr "Navigation avec un clavier" + +#: wp-includes/js/dist/components.js:33254 +msgid "Left and Right Arrows" +msgstr "Flèches gauche et droite" + +#: wp-includes/js/dist/components.js:33258 +msgid "Up and Down Arrows" +msgstr "Flèches vers le haut et le bas" + +#: wp-includes/js/dist/components.js:28053 +msgid "Change color format" +msgstr "Modifier le format de couleur" + +#: wp-includes/js/dist/components.js:28001 +msgid "Color value in HSL" +msgstr "Valeur de couleur en HSL" + +#: wp-includes/js/dist/components.js:27958 +msgid "Color value in RGB" +msgstr "Valeur de couleur en RGB" + +#: wp-includes/js/dist/components.js:27950 +msgid "Color value in hexadecimal" +msgstr "Valeur de la couleur en hexadécimal" + +#: wp-includes/js/dist/components.js:33263 +msgid "PgUp/PgDn" +msgstr "PgUp/PgDn" + +#: wp-includes/js/dist/components.js:33262 +msgid "Page Up and Page Down" +msgstr "Paginer vers le haut et vers le bas" + +#: wp-includes/js/dist/components.js:33265 +msgid "Move backward (PgUp) or forward (PgDn) by one month." +msgstr "Revenir en arrière (PgUp) ou avancer (PgDn) d’un mois." + +#: wp-includes/js/dist/components.js:33253 +msgid "Select the date in focus." +msgstr "Sélectionner la date courante." + +#: wp-includes/js/dist/components.js:27883 +#: wp-includes/js/dist/components.js:27899 +msgid "RGB mode active" +msgstr "Mode RVB actif" + +#: wp-includes/js/dist/components.js:27894 +msgid "Hex color mode active" +msgstr "Mode couleur héxadécimale actif" + +#: wp-includes/js/dist/components.js:27888 +msgid "Hue/saturation/lightness mode active" +msgstr "Mode teinte/saturation actif" + +#: wp-includes/js/dist/components.js:27655 +msgid "Move the arrow left or right to change hue." +msgstr "Déplacer les flèches vers la gauche ou la droite pour modifier la teinte." + +#: wp-includes/js/dist/components.js:27647 +msgid "Hue value in degrees, from 0 to 359." +msgstr "Valeur de la teinte en chiffres de 0 à 359." + +#: wp-includes/js/dist/components.js:27414 +msgid "Alpha value, from 0 (transparent) to 1 (fully opaque)." +msgstr "Valeur alpha de 0 (transparent) à 1 (complètement opaque)." + +#: wp-includes/js/dist/components.js:33250 +msgctxt "keyboard button" +msgid "Enter" +msgstr "Entrée" + +#: wp-includes/post.php:271 +msgid "All Blocks" +msgstr "Tous les blocs" + +#: wp-includes/post.php:270 +msgid "View Block" +msgstr "Visualiser le bloc" + +#: wp-includes/post.php:269 +msgid "Edit Block" +msgstr "Modifier le bloc" + +#: wp-includes/post.php:268 +msgid "New Block" +msgstr "Nouveau bloc" + +#: wp-includes/post.php:267 +msgid "Add New Block" +msgstr "Ajouter un nouveau bloc" + +#: wp-includes/post.php:266 +msgctxt "Block" +msgid "Add New" +msgstr "Ajouter" + +#: wp-includes/post.php:265 +msgctxt "add new on admin bar" +msgid "Block" +msgstr "Bloc" + +#: wp-includes/post.php:264 +msgctxt "admin menu" +msgid "Blocks" +msgstr "Blocs" + +#: wp-includes/post.php:263 +msgctxt "post type singular name" +msgid "Block" +msgstr "Bloc" + +#: wp-includes/post.php:262 +msgctxt "post type general name" +msgid "Blocks" +msgstr "Blocs" + +#: wp-includes/post.php:281 +msgid "Block scheduled." +msgstr "Bloc planifié." + +#: wp-includes/post.php:280 +msgid "Block reverted to draft." +msgstr "Bloc remis en brouillon." + +#: wp-includes/post.php:279 +msgid "Block published privately." +msgstr "Bloc mis en ligne de façon privée." + +#: wp-includes/post.php:278 +msgid "Block published." +msgstr "Bloc mis en ligne." + +#: wp-includes/post.php:277 +msgid "Blocks list" +msgstr "Liste des blocs" + +#: wp-includes/post.php:276 +msgid "Blocks list navigation" +msgstr "Navigation dans la liste des blocs" + +#: wp-includes/post.php:275 +msgid "Filter blocks list" +msgstr "Filtrer la liste des blocs" + +#: wp-includes/js/dist/components.js:33261 +msgid "Move backward (up) or forward (down) by one week." +msgstr "Déplacer vers l’arrière (haut) ou vers l’avant (bas) d’une semaine." + +#: wp-includes/js/dist/components.js:33257 +msgid "Move backward (left) or forward (right) by one day." +msgstr "Déplacer vers l’arrière (gauche) ou vers l’avant (droite) d’un jour." + +#: wp-includes/js/dist/components.js:33249 +msgid "Click the right or left arrows to select other months in the past or the future." +msgstr "Cliquez sur les flèches de droite ou de gauche pour sélectionner d’autres mois dans le passé ou dans le futur." + +#: wp-includes/js/dist/components.js:28300 +msgid "Choose a shade" +msgstr "Choisissez une teinte" + +#: wp-includes/js/dist/components.js:28307 +msgid "Use your arrow keys to change the base color. Move up to lighten the color, down to darken, left to decrease saturation, and right to increase saturation." +msgstr "Utilisez les touches fléchées pour changer la couleur de base. Allez vers le haut pour éclaircir la couleur, vers le bas pour l’assombrir ; vers la gauche pour baisser la saturation, et vers la droite pour l’augmenter." + +#. translators: Abbreviated date/time format, see https://www.php.net/date +#: wp-includes/script-loader.php:353 +msgid "M j, Y g:i a" +msgstr "d F Y g:i a" + +#: wp-includes/js/dist/editor.js:12827 +msgid "Blocks" +msgstr "Blocs" + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:187 +msgid "The rendered block." +msgstr "Le bloc rendu." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:69 +msgid "ID of the post context." +msgstr "ID de ce contenu/contexte." + +#. translators: %s: The name of the block. +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:62 +msgid "Attributes for %s block" +msgstr "Attributs du bloc %s" + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:50 +msgid "Unique registered name for the block." +msgstr "Nom unique enregistré de ce bloc." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:144 +msgid "Invalid block." +msgstr "Bloc non valide." + +#: wp-includes/post.php:272 +msgid "Search Blocks" +msgstr "Rechercher des blocs" + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:109 +msgid "Sorry, you are not allowed to read blocks as this user." +msgstr "Désolé, votre compte utilisateur n’est pas autorisé à lire les blocs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-block-renderer-controller.php:99 +msgid "Sorry, you are not allowed to read blocks of this post." +msgstr "Désolé, vous n’avez pas l’autorisation de lire les blocs de cette publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:448 +msgid "Whether the theme supports responsive embedded content." +msgstr "Si le thème est compatible avec les contenus embarqués responsive." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:196 +msgid "Features supported by this theme." +msgstr "Fonctionnalités supportées par ce thème." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:368 +msgid "The visibility settings for the taxonomy." +msgstr "Les réglages de visibilité pour cette taxonomie." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:376 +msgid "Invalid type parameter." +msgstr "Type de paramètre non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2137 +msgid "Slug automatically generated from the object title." +msgstr "Slug automatiquement généré depuis le titre d’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2130 +msgid "Permalink template for the object." +msgstr "Modèle de permalien pour l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2251 +msgid "Version of the content block format used by the object." +msgstr "Version du format de bloc de contenu utilisé par l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:266 +msgid "Object type." +msgstr "Type d’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:273 +msgid "Object subtype." +msgstr "Sous-type d’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:312 +msgid "Limit results to items of an object type." +msgstr "Limiter les résultats aux éléments d’un type d’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:319 +msgid "Limit results to items of one or more object subtypes." +msgstr "Limiter les résultats aux éléments d’un ou plusieurs sous-types d’objet." + +#. translators: %s: Duration. +#: wp-includes/script-loader.php:340 +msgid "%s from now" +msgstr "Dans %s" + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:381 +msgid "There is nothing to save. The autosave and the post content are the same." +msgstr "Il n’y a rien à enregistrer. Le contenu actuel et le contenu auto-enregistré sont identiques." + +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:138 +msgid "Internal search handler error." +msgstr "Erreur interne de prise en charge de la recherche." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:417 +msgid "Post formats supported." +msgstr "Formats de publication supportés." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:480 +msgid "Limit result set to themes assigned one or more statuses." +msgstr "Limiter les résultats aux thèmes qui possèdent un ou plusieurs états." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2467 +msgid "The current user can post unfiltered HTML markup and JavaScript." +msgstr "L’utilisateur actuel peut publier du code HTML et JavaScript sans qu’il soit filtré." + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:326 +msgid "Preview link for the post." +msgstr "Lien de prévisualisation de la publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:271 +msgid "There is no autosave revision for this post." +msgstr "Il n’y a aucune révision auto-enregistrée pour cette publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:441 +msgid "Whether the theme supports post thumbnails." +msgstr "Si le thème est compatible avec les images mises en avant." + +#. translators: %s: PHP class name. +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:74 +msgid "REST search handlers must extend the %s class." +msgstr "Les prises en charge de la recherche REST doivent étendre la classe %s." + +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:119 +msgid "The ID for the object." +msgstr "L’ID pour l’objet." + +#: wp-includes/post.php:1722 wp-admin/edit-form-advanced.php:195 +#: wp-admin/edit-form-advanced.php:198 +msgid "Page updated." +msgstr "Page mise à jour." + +#: wp-includes/post.php:1721 +msgid "Page scheduled." +msgstr "Page planifiée." + +#. translators: %s: Block name. +#: wp-includes/class-wp-block-type-registry.php:107 +msgid "Block type \"%s\" is not registered." +msgstr "Le type de de bloc \"%s\" n’est pas enregistré." + +#. translators: %s: Block name. +#: wp-includes/class-wp-block-type-registry.php:77 +msgid "Block type \"%s\" is already registered." +msgstr "Le type de de bloc \"%s\" est déjà enregistré." + +#: wp-includes/blocks/latest-comments.php:147 +msgid "No comments to show." +msgstr "Aucun commentaire à afficher." + +#. translators: 1: author name (inside or tag, based on if they have +#. a URL), 2: post title related to this comment +#: wp-includes/blocks/latest-comments.php:99 +msgid "%1$s on %2$s" +msgstr "%1$s sur %2$s" + +#: wp-includes/blocks/archives.php:104 +msgid "No archives to show." +msgstr "Aucune archive à afficher." + +#: wp-includes/class-wp-block-type-registry.php:63 +msgid "Block type names must not contain uppercase characters." +msgstr "Les noms de type de bloc ne doivent pas contenir de caractères en majuscules." + +#: wp-includes/class-wp-block-type-registry.php:57 +msgid "Block type names must be strings." +msgstr "Les noms de type de bloc doivent être des chaînes." + +#: wp-includes/class-wp-block-type-registry.php:70 +msgid "Block type names must contain a namespace prefix. Example: my-plugin/my-custom-block-type" +msgstr "Les noms de types de bloc doivent contenir un préfixe d’espace de nom. Exemple : mon-extension/mon-bloc-personnalise" + +#: wp-includes/post.php:1720 +msgid "Post reverted to draft." +msgstr "Publication reconvertie en brouillon." + +#: wp-includes/post.php:1722 wp-admin/edit-form-advanced.php:180 +#: wp-admin/edit-form-advanced.php:183 +msgid "Post updated." +msgstr "Publication mise à jour." + +#: wp-includes/post.php:1721 +msgid "Post scheduled." +msgstr "Publication planifiée." + +#: wp-includes/post.php:1719 +msgid "Post published privately." +msgstr "Publication mise en ligne en privé." + +#: wp-includes/post.php:1718 wp-admin/edit-form-advanced.php:186 +msgid "Post published." +msgstr "Publication mise en ligne." + +#: wp-includes/post.php:1720 +msgid "Page reverted to draft." +msgstr "Page reconvertie en brouillon." + +#: wp-includes/post.php:1719 +msgid "Page published privately." +msgstr "Page mise en ligne en privé." + +#: wp-includes/post.php:1718 wp-admin/edit-form-advanced.php:201 +msgid "Page published." +msgstr "Page mise en ligne." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:308 +msgid "The offset number requested is larger than or equal to the number of available revisions." +msgstr "Le nombre de valeurs de décalage demandé est supérieur ou égal au nombre de révisions disponibles." + +#: wp-includes/user.php:3794 +msgid "Unable to send personal data export confirmation email." +msgstr "Impossible d’envoyer l’e-mail de confirmation d’export des données personnelles." + +#: wp-includes/user.php:3661 +msgid "Invalid user request." +msgstr "Demande de l’utilisateur non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:1014 +#: wp-admin/includes/ms.php:45 +msgid "You have used your space quota. Please delete files before uploading." +msgstr "Vous avez utilisé votre quota d’espace. Veuillez supprimer des fichiers avant le téléversement." + +#. translators: Privacy data request confirmed notification email subject. 1: +#. Site title, 2: Name of the confirmed action. +#: wp-includes/user.php:3279 +msgid "[%1$s] Action Confirmed: %2$s" +msgstr "[%1$s] Action confirmée : %2$s" + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2521 +msgid "The current user can create terms in the %s taxonomy." +msgstr "L’utilisateur actuel peut créer des termes dans la taxonomie %s." + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2519 +msgid "The current user can assign terms in the %s taxonomy." +msgstr "L’utilisateur actuel peut assigner des termes dans la taxonomie %s." + +#. translators: %s: Required disk space in kilobytes. +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:994 +#: wp-admin/includes/ms.php:36 +msgid "Not enough space to upload. %s KB needed." +msgstr "Pas assez d’espace pour téléverser. Il y a besoin de %s KB." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2500 +msgid "The current user can change the author on this post." +msgstr "L’utilisateur actuel peut changer l’auteur de cette publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2484 +msgid "The current user can sticky this post." +msgstr "L’utilisateur actuel peut épingler cette publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2451 +msgid "The current user can publish this post." +msgstr "L’utilisateur actuel peut publier cette publication." + +#: wp-includes/user.php:3533 +msgid "The site administrator has been notified. You will receive an email confirmation when they erase your data." +msgstr "L’administrateur du site a été notifié. Vous recevrez une confirmation par e-mail lorsque vos données seront effacées." + +#: wp-includes/user.php:3532 +msgid "Thanks for confirming your erasure request." +msgstr "Merci d’avoir confirmé votre demande d’effacement." + +#: wp-includes/user.php:3530 +msgid "The site administrator has been notified. You will receive a link to download your export via email when they fulfill your request." +msgstr "L’administrateur du site a été notifié. Vous recevrez un lien de téléchargement de votre export par e-mail lorsque votre demande aura été approuvée." + +#: wp-includes/user.php:3529 +msgid "Thanks for confirming your export request." +msgstr "Merci d’avoir confirmé votre demande d’export." + +#. translators: Do not translate SITENAME, SITEURL, PRIVACY_POLICY_URL; those +#. are placeholders. +#: wp-includes/user.php:3428 +msgid "" +"Howdy,\n" +"\n" +"Your request to erase your personal data on ###SITENAME### has been completed.\n" +"\n" +"If you have any follow-up questions or concerns, please contact the site administrator.\n" +"\n" +"For more information, you can also read our privacy policy: ###PRIVACY_POLICY_URL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour,\n" +"\n" +"Votre demande d’effacement de vos données personnelles sur ###SITENAME### a bien été réalisée.\n" +"\n" +"Si vous avez d’autres questions ou demandes, veuillez contacter l’administrateur du site.\n" +"\n" +"Pour plus d’informations, vous pouvez aussi lire notre politique de confidentialité : ###PRIVACY_POLICY_URL###\n" +"\n" +"Cordialement,\n" +"L’équipe de ###SITENAME###\n" +"###SITEURL###" + +#. translators: Do not translate SITENAME, SITEURL; those are placeholders. +#: wp-includes/user.php:3415 +msgid "" +"Howdy,\n" +"\n" +"Your request to erase your personal data on ###SITENAME### has been completed.\n" +"\n" +"If you have any follow-up questions or concerns, please contact the site administrator.\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour,\n" +"\n" +"Votre demande d’effacement de vos données personnelles sur ###SITENAME### a bien été réalisée.\n" +"\n" +"Si vous avez d’autres questions ou demandes, veuillez contacter l’administrateur du site.\n" +"\n" +"Cordialement,\n" +"L’équipe de ###SITENAME###\n" +"###SITEURL###" + +#. translators: Erasure request fulfilled notification email subject. %s: Site +#. title. +#: wp-includes/user.php:3388 +msgid "[%s] Erasure Request Fulfilled" +msgstr "[%s] Demande d’effacement effectuée" + +#. translators: Do not translate SITENAME, USER_EMAIL, DESCRIPTION, MANAGE_URL, +#. SITEURL; those are placeholders. +#: wp-includes/user.php:3225 +msgid "" +"Howdy,\n" +"\n" +"A user data privacy request has been confirmed on ###SITENAME###:\n" +"\n" +"User: ###USER_EMAIL###\n" +"Request: ###DESCRIPTION###\n" +"\n" +"You can view and manage these data privacy requests here:\n" +"\n" +"###MANAGE_URL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour,\n" +"\n" +"Une demande de données utilisateur a été confirmée sur ###SITENAME### :\n" +"\n" +"Utilisateur : ###USER_EMAIL###\n" +"Demande : ###DESCRIPTION###\n" +"\n" +"Vous pouvez voir et gérer cette demande de confidentialité des données ici :\n" +"\n" +"###MANAGE_URL###\n" +"\n" +"Cordialement,\n" +"L’équipe de ###SITENAME####\n" +"###SITEURL###" + +#. translators: Confirm privacy data request notification email subject. 1: +#. Site title, 2: Name of the action. +#: wp-includes/user.php:3741 +msgid "[%1$s] Confirm Action: %2$s" +msgstr "[%1$s] Confirmer l’action : %2$s" + +#: wp-includes/user.php:3627 +#: wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php:108 +#: wp-admin/erase-personal-data.php:54 wp-admin/menu.php:283 +msgid "Erase Personal Data" +msgstr "Effacer les données" + +#: wp-includes/comment-template.php:2361 +msgid "Save my name, email, and website in this browser for the next time I comment." +msgstr "Enregistrer mon nom, mon e-mail et mon site web dans le navigateur pour mon prochain commentaire." + +#: wp-includes/user.php:2979 +msgid "User Description" +msgstr "Description de l’utilisateur" + +#: wp-includes/user.php:2978 +msgid "User Last Name" +msgstr "Nom de l’utilisateur" + +#: wp-includes/user.php:2977 +msgid "User First Name" +msgstr "Prénom de l’utilisateur" + +#: wp-includes/user.php:2976 +msgid "User Nickname" +msgstr "Pseudonyme de l’utilisateur" + +#: wp-includes/user.php:2974 +msgid "User Registration Date" +msgstr "Date d’inscription de l’utilisateur" + +#: wp-includes/user.php:2973 +msgid "User URL" +msgstr "URL de l’utilisateur" + +#: wp-includes/user.php:2972 +msgid "User Email" +msgstr "E-mail de l’utilisateur" + +#: wp-includes/user.php:2935 +msgid "WordPress User" +msgstr "Utilisateur WordPress" + +#: wp-includes/user.php:2970 +msgid "User Login Name" +msgstr "Nom de connexion de l’utilisateur" + +#: wp-includes/user.php:2971 +msgid "User Nice Name" +msgstr "Nom de l’utilisateur formaté sous forme de slug" + +#: wp-includes/user.php:2969 +msgid "User ID" +msgstr "ID de l’utilisateur" + +#: wp-includes/user.php:2975 +msgid "User Display Name" +msgstr "Nom affiché de l’utilisateur" + +#: wp-includes/media.php:4386 +msgid "WordPress Media" +msgstr "Média WordPress" + +#: wp-includes/script-loader.php:1432 +msgid "An error occurred while attempting to export personal data." +msgstr "Une erreur est survenue durant la tentative d’exportation de donnée personnelle." + +#: wp-includes/script-loader.php:1431 +msgid "No personal data export file was generated." +msgstr "Aucun fichier d’exportation de donnée personnelle n’a été généré." + +#: wp-login.php:1155 +msgid "User action confirmed." +msgstr "Action utilisateur confirmée." + +#: wp-includes/user.php:3851 +msgid "This link has expired." +msgstr "Ce lien a expiré." + +#: wp-includes/user.php:3847 wp-admin/includes/privacy-tools.php:23 +#: wp-admin/includes/privacy-tools.php:52 +msgid "Invalid request." +msgstr "Requête non valide." + +#: wp-includes/user.php:3525 +msgid "The site administrator has been notified and will fulfill your request as soon as possible." +msgstr "L’administrateur du site a été notifié et répondra à votre demande au plus vite." + +#. translators: Deleted text. +#: wp-includes/functions.php:7162 +msgid "[deleted]" +msgstr "[supprimé]" + +#: wp-includes/post.php:245 +msgid "User Request" +msgstr "Demande utilisateur" + +#. translators: %d: Comment ID. +#: wp-includes/comment.php:3604 +msgid "Comment %d contains personal data but could not be anonymized." +msgstr "Le commentaire %d contient des données personnelles mais ne peut pas être anonymisé." + +#: wp-includes/post.php:244 +msgid "User Requests" +msgstr "Demandes utilisateur" + +#. translators: Deleted long text. +#: wp-includes/functions.php:7166 +msgid "This content was deleted by the author." +msgstr "Ce contenu a été supprimé par son auteur." + +#: wp-includes/user.php:3572 +msgid "Invalid action name." +msgstr "Nom d’action non valide." + +#. translators: %s: Action name. +#: wp-includes/user.php:3631 +msgid "Confirm the \"%s\" action" +msgstr "Confirmer l’action « %s »" + +#: wp-includes/user.php:3624 wp-admin/export-personal-data.php:54 +#: wp-admin/menu.php:282 +msgid "Export Personal Data" +msgstr "Exporter les données" + +#: wp-includes/user.php:3524 +msgid "Action has been confirmed." +msgstr "L’action a été confirmée." + +#: wp-includes/user.php:3889 +msgid "The confirmation email has expired." +msgstr "L’e-mail de confirmation a expiré." + +#. translators: Do not translate DESCRIPTION, CONFIRM_URL, SITENAME, SITEURL: +#. those are placeholders. +#: wp-includes/user.php:3690 +msgid "" +"Howdy,\n" +"\n" +"A request has been made to perform the following action on your account:\n" +"\n" +" ###DESCRIPTION###\n" +"\n" +"To confirm this, please click on the following link:\n" +"###CONFIRM_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour,\n" +"\n" +"Une demande a été faite afin d’effectuer les actions suivantes sur votre compte :\n" +"\n" +"###DESCRIPTION###\n" +"\n" +"Pour confirmer cela, veuillez cliquer sur le lien suivant :\n" +"###CONFIRM_URL###\n" +"\n" +"Si vous ne souhaitez pas effectuer cette action, vous pouvez ignorer et supprimer cet e-mail en toute sécurité.\n" +"\n" +"Cordialement,\n" +"L’équipe de ###SITENAME###\n" +"###SITEURL###" + +#: wp-includes/user.php:3871 wp-admin/includes/privacy-tools.php:107 +#: wp-admin/includes/privacy-tools.php:119 +msgid "Invalid action." +msgstr "Action non valide." + +#: wp-includes/post.php:985 wp-admin/edit-form-comment.php:105 +msgid "Pending" +msgstr "En attente" + +#: wp-includes/post.php:422 +msgctxt "request status" +msgid "Pending" +msgstr "En attente" + +#: wp-includes/comment.php:3459 +msgid "Comment URL" +msgstr "URL du commentaire" + +#: wp-includes/comment.php:3458 +msgid "Comment Content" +msgstr "Contenu du commentaire" + +#: wp-includes/comment.php:3457 +msgid "Comment Date" +msgstr "Date du commentaire" + +#: wp-includes/comment.php:3456 +msgid "Comment Author User Agent" +msgstr "Agent utilisateur de l’auteur du commentaire" + +#: wp-includes/comment.php:3455 +msgid "Comment Author IP" +msgstr "IP de l’auteur du commentaire" + +#: wp-includes/comment.php:3454 +msgid "Comment Author URL" +msgstr "URL de l’auteur du commentaire" + +#: wp-includes/comment.php:3453 +msgid "Comment Author Email" +msgstr "E-mail de l’auteur du commentaire" + +#: wp-includes/comment.php:3452 wp-admin/edit-form-comment.php:45 +msgid "Comment Author" +msgstr "Auteur du commentaire" + +#: wp-includes/comment.php:3417 wp-includes/comment.php:3527 +msgid "WordPress Comments" +msgstr "Commentaires WordPress" + +#: wp-includes/script-loader.php:1429 +msgid "An error occurred while attempting to find and erase personal data." +msgstr "Une erreur est survenue lors de la tentative de trouver et retirer les données personnelles." + +#: wp-includes/script-loader.php:1428 +msgid "Personal data was found for this user but some of the personal data found was not erased." +msgstr "Des données personnelles ont été trouvées pour cet utilisateur mais certaines données personnelles trouvées n’ont pas été supprimées." + +#: wp-includes/script-loader.php:1425 +msgid "No personal data was found for this user." +msgstr "Aucune donnée personnelle n’a été trouvée pour cet utilisateur." + +#: wp-includes/script-loader.php:1427 +msgid "Personal data was found for this user but was not erased." +msgstr "Des données personnelles ont été trouvées pour cet utilisateur mais n’ont pas été supprimées." + +#: wp-includes/script-loader.php:1426 +msgid "All of the personal data found for this user was erased." +msgstr "Toutes les données personnelles trouvées pour cet utilisateur ont été supprimées." + +#: wp-includes/post.php:988 +msgid "Completed" +msgstr "Terminée" + +#: wp-includes/post.php:467 +msgctxt "request status" +msgid "Completed" +msgstr "Terminée" + +#: wp-includes/post.php:986 +msgid "Confirmed" +msgstr "Confirmée" + +#: wp-includes/post.php:452 +msgctxt "request status" +msgid "Failed" +msgstr "Échouée" + +#: wp-includes/post.php:437 +msgctxt "request status" +msgid "Confirmed" +msgstr "Confirmée" + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1550 +msgid "Limit result set to users who are considered authors." +msgstr "Limiter le jeu de résultats aux utilisateurs considérés comme auteurs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:229 +msgid "Sorry, you are not allowed to query users by this parameter." +msgstr "Désolé vous n’avez pas l’autorisation d’utiliser ce paramètre de requête utilisateur." + +#: wp-includes/media.php:3911 +#: wp-admin/includes/class-wp-media-list-table.php:130 +msgctxt "media items" +msgid "Mine" +msgstr "Les miens" + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:292 +msgid "Whether or not the post type can be viewed." +msgstr "Si le type de publication peut être vu ou pas." + +#: wp-includes/script-loader.php:675 wp-includes/script-loader.php:1168 +#: wp-includes/script-loader.php:1259 wp-includes/script-loader.php:1517 +#: wp-includes/class-wp-xmlrpc-server.php:3934 wp-includes/functions.php:3229 +#: wp-includes/class-wp-customize-manager.php:449 +#: wp-admin/includes/class-custom-image-header.php:775 +#: wp-admin/includes/class-custom-image-header.php:939 +#: wp-admin/includes/class-custom-image-header.php:947 +#: wp-admin/includes/file.php:609 wp-admin/customize.php:79 +#: wp-admin/themes.php:27 wp-admin/themes.php:70 wp-admin/users.php:145 +#: wp-admin/media-upload.php:38 wp-admin/network/site-users.php:162 +msgid "Something went wrong." +msgstr "Une mauvaise manipulation ?" + +#: wp-includes/functions.php:3218 +msgid "The link you followed has expired." +msgstr "Le lien suivi est expiré." + +#: wp-includes/script-loader.php:1169 +#: wp-includes/class-wp-customize-manager.php:514 wp-admin/edit-tags.php:28 +#: wp-admin/edit-tags.php:85 wp-admin/edit-tags.php:116 +#: wp-admin/edit-tags.php:136 wp-admin/edit-tags.php:172 +#: wp-admin/includes/bookmark.php:31 wp-admin/press-this.php:21 +#: wp-admin/nav-menus.php:25 wp-admin/customize.php:17 +#: wp-admin/customize.php:34 wp-admin/user-new.php:15 wp-admin/user-new.php:22 +#: wp-admin/user-new.php:55 wp-admin/user-new.php:156 wp-admin/themes.php:14 +#: wp-admin/themes.php:42 wp-admin/themes.php:62 wp-admin/edit-comments.php:13 +#: wp-admin/term.php:42 wp-admin/options.php:49 wp-admin/options.php:77 +#: wp-admin/widgets.php:17 wp-admin/users.php:15 wp-admin/post-new.php:60 +#: wp-admin/edit.php:41 wp-admin/media-upload.php:46 +msgid "You need a higher level of permission." +msgstr "Vous devez avoir des droits supérieurs." + +#. translators: %s: User who is customizing the changeset in customizer. +#: wp-includes/class-wp-customize-manager.php:4069 +msgid "%s is already customizing this changeset. Please wait until they are done to try customizing. Your latest changes have been autosaved." +msgstr "Veuillez patienter, %s est déjà en cours de personnalisation de ce jeu de modifications. Vos derniers changements ont été sauvegardés automatiquement." + +#. translators: %s: User who is customizing the changeset in customizer. +#: wp-includes/class-wp-customize-manager.php:4071 +msgid "%s is already customizing this changeset. Do you want to take over?" +msgstr "%s est déjà en cours de personnalisation de ce jeu de modifications. Voulez-vous prendre la main ?" + +#: wp-includes/class-wp-customize-manager.php:4277 +#: wp-admin/includes/file.php:330 +msgid "Update anyway, even though it might break your site?" +msgstr "Mettre à jour quand même, même si cela peut casser votre site ?" + +#: wp-includes/wp-db.php:1365 +msgid "The query only expected one placeholder, but an array of multiple placeholders was sent." +msgstr "La requête n’attendait qu’un unique substitutif/placeholder, mais un tableau de multiples substitutifs a été envoyé." + +#: wp-includes/script-loader.php:1158 +msgctxt "customizer changeset status" +msgid "Scheduled" +msgstr "Planifié" + +#: wp-includes/customize/class-wp-customize-theme-control.php:119 +#: wp-includes/customize/class-wp-customize-theme-control.php:127 +#: wp-admin/includes/class-wp-theme-install-list-table.php:317 +#: wp-admin/includes/class-wp-theme-install-list-table.php:475 +#: wp-admin/theme-install.php:307 +msgctxt "theme" +msgid "Installed" +msgstr "Installé" + +#. translators: %s: Property of an object. +#: wp-includes/rest-api.php:1285 +msgid "%1$s is not a valid property of Object." +msgstr "%1$s n’est pas une propriété valide de l’objet." + +#. translators: %s: URL to Add Themes admin screen. +#: wp-includes/script-loader.php:1207 +msgid "You won’t be able to install new themes from here yet since your install requires SFTP credentials. For now, please add themes in the admin." +msgstr "Vous ne pourrez avoir la possibilité d’installer de nouveaux thèmes à partir d’ici car votre installation nécessite des identifiants SFTP. Pour l’instant, veuillez ajouter vos thèmes en passant par l’administration." + +#. translators: Tab heading when selecting from the most used terms. +#: wp-includes/taxonomy.php:571 +msgctxt "tags" +msgid "Most Used" +msgstr "Plus utilisées" + +#. translators: Tab heading when selecting from the most used terms. +#: wp-includes/taxonomy.php:571 wp-admin/includes/meta-boxes.php:1104 +msgctxt "categories" +msgid "Most Used" +msgstr "Plus utilisés" + +#: wp-includes/class-wp-customize-nav-menus.php:1046 +msgid "Click “Next” to start adding links to your new menu." +msgstr "Cliquez sur « Suivant » pour commencer à ajouter des liens à votre nouveau menu." + +#. translators: %s: A list of valid video file extensions. +#: wp-includes/widgets/class-wp-widget-media-video.php:51 +msgid "Sorry, we can’t load the video at the supplied URL. Please check that the URL is for a supported video file (%s) or stream (e.g. YouTube and Vimeo)." +msgstr "Désolé, nous ne pouvons pas charger la vidéo depuis l’URL fournie. Veuillez vérifier que l’URL est celle d’un fichier vidéo supporté (%s) ou diffusé (ex : YouTube et Vimeo)." + +#: wp-includes/script-loader.php:1321 wp-admin/includes/meta-boxes.php:341 +#: wp-admin/includes/meta-boxes.php:342 +msgctxt "post action/button label" +msgid "Schedule" +msgstr "Planifier" + +#: wp-includes/script-loader.php:1157 +#: wp-includes/class-wp-customize-manager.php:4788 +msgctxt "customizer changeset action/button label" +msgid "Schedule" +msgstr "Planifier" + +#: wp-includes/customize/class-wp-customize-nav-menu-location-control.php:85 +msgid "+ Create New Menu" +msgstr "+ Créer un nouveau menu" + +#: wp-includes/customize/class-wp-customize-nav-menu-location-control.php:85 +msgid "Create a menu for this location" +msgstr "Créer un nouveau menu pour cet emplacement" + +#. translators: 1: fopen(), 2: File name. +#: wp-includes/class-wp-http-streams.php:257 +#: wp-includes/class-wp-http-curl.php:193 +msgid "Could not open handle for %1$s to %2$s." +msgstr "Impossible d’ouvrir une prise en main de %1$s pour %2$s." + +#: wp-includes/widgets/class-wp-nav-menu-widget.php:26 +msgid "Add a navigation menu to your sidebar." +msgstr "Ajoute un menu de navigation dans votre colonne latérale." + +#. translators: %s: Display name of the user who has taken over the changeset +#. in customizer. +#: wp-includes/script-loader.php:1182 +msgid "%s has taken over and is currently customizing." +msgstr "%s a pris la main et personnalise actuellement." + +#: wp-includes/class-wp-customize-manager.php:4259 +#: wp-admin/includes/post.php:1675 wp-admin/comment.php:67 +#: wp-admin/comment.php:268 wp-admin/theme-editor.php:378 +#: wp-admin/plugin-editor.php:330 +msgid "Go back" +msgstr "Retour" + +#: wp-includes/class-wp-customize-manager.php:4263 +#: wp-admin/includes/post.php:1758 +msgid "Take over" +msgstr "Prendre la main" + +#. translators: %s: User who is customizing the changeset in customizer. +#: wp-includes/class-wp-customize-manager.php:4078 +msgid "%s is already customizing this site. Do you want to take over?" +msgstr "%s personnalise actuellement ce site. Voulez-vous prendre la main ?" + +#: wp-includes/class-wp-customize-manager.php:3349 +msgid "No changeset found to take over" +msgstr "Aucun jeu de modification trouvé sur lequel prendre prendre la main." + +#: wp-includes/class-wp-customize-manager.php:2518 +msgid "Changeset is being edited by other user." +msgstr "Le jeu de modifications est actuellement modifié par un autre utilisateur." + +#. translators: %s: User who is customizing the changeset in customizer. +#: wp-includes/class-wp-customize-manager.php:4076 +msgid "%s is already customizing this site. Please wait until they are done to try customizing. Your latest changes have been autosaved." +msgstr "Veuillez patienter, %s est déjà en cours de personnalisation. Vos derniers changements ont été sauvegardés automatiquement." + +#: wp-includes/class-wp-customize-manager.php:3358 +msgid "Sorry, you are not allowed to take over." +msgstr "Désolé, vous n’avez pas l’autorisation pour prendre la main." + +#: wp-includes/class-wp-customize-manager.php:3338 +msgid "Security check failed." +msgstr "Erreur de vérification de sécurité." + +#: wp-includes/script-loader.php:1176 +msgid "Looks like something’s gone wrong. Wait a couple seconds, and then try again." +msgstr "Il semble que quelque chose se passe mal. Attendez deux secondes puis veuillez réessayer." + +#. translators: 1: Documentation URL, 2: Additional link attributes, 3: +#. Accessibility text. +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:53 +msgctxt "menu locations" +msgid "(If you plan to use a menu widget%3$s, skip this step.)" +msgstr "(Si vous prévoyez d’utiliser un widget%3$s de menu, ignorez cette étape.)" + +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:66 +msgctxt "menu locations" +msgid "Here’s where this menu appears. If you’d like to change that, pick another location." +msgstr "Voici l’emplacement où ce menu apparaît. Pour modifier cela, choisissez un autre emplacement." + +#: wp-includes/customize/class-wp-customize-nav-menu-locations-control.php:48 +msgctxt "menu locations" +msgid "Where do you want this menu to appear?" +msgstr "Où voulez vous que ce menu apparaisse ?" + +#: wp-includes/class-wp-customize-nav-menus.php:1060 +msgid "You’ll create a menu, assign it a location, and add menu items like links to pages and categories. If your theme has multiple menu areas, you might need to create more than one." +msgstr "Vous allez créer un menu, l’assigner à un emplacement, et y ajouter des éléments de menu tels que des liens vers des pages et catégories. Si votre thème a plusieurs zones de menu, vous pourriez devoir créer plus d’un menu." + +#: wp-includes/class-wp-customize-nav-menus.php:1057 +msgid "It doesn’t look like your site has any menus yet. Want to build one? Click the button to start." +msgstr "Il semble que votre site n’a actuellement aucun menu. Souhaitez-vous en créer un ? Cliquez sur le bouton pour démarrer." + +#: wp-includes/class-wp-customize-nav-menus.php:639 +msgctxt "menu locations" +msgid "View All Locations" +msgstr "Voir tous les emplacements" + +#: wp-includes/class-wp-customize-manager.php:4993 +msgid "While previewing a new theme, you can continue to tailor things like widgets and menus, and explore theme-specific options." +msgstr "Lors de la prévisualisation d’un nouveau thème, vous pouvez continuer à affiner des choses telles que les widgets et les menus, et explorer les options spécifiques au thème." + +#: wp-includes/class-wp-customize-manager.php:4992 +msgid "Looking for a theme? You can search or browse the WordPress.org theme directory, install and preview themes, then activate them right here." +msgstr "Vous recherchez un thème ? Vous pouvez le rechercher ou parcourir le répertoire de thèmes WordPress.org, l’installer et prévisualiser les thèmes, puis l’activer ici même." + +#: wp-includes/script-loader.php:1053 +msgid "Something went wrong. Your change may not have been saved. Please try again. There is also a chance that you may need to manually fix and upload the file over FTP." +msgstr "Quelque chose a mal tourné. Votre changement n’a peut-être pas été enregistré. Veuillez réessayer. Il y a aussi un risque que vous ayez besoin de réparer manuellement et de téléverser le fichier par FTP." + +#: wp-includes/class-wp-customize-nav-menus.php:639 +msgctxt "menu locations" +msgid "View Location" +msgstr "Voir tous les emplacements" + +#: wp-includes/customize/class-wp-customize-themes-section.php:97 +#: wp-admin/themes.php:176 wp-admin/themes.php:375 +#: wp-admin/theme-install.php:68 wp-admin/theme-install.php:241 +msgid "No themes found. Try a different search." +msgstr "Aucun thème trouvé. Essayez une autre recherche." + +#: wp-includes/class-wp-customize-nav-menus.php:625 +msgid "Your theme can display menus in one location. Select which menu you would like to use." +msgstr "Votre thème peut afficher des menus sur un emplacement. Sélectionnez le menu que vous souhaitez utiliser." + +#. translators: %s: Site name. +#: wp-login.php:420 +msgid "Site Name: %s" +msgstr "Titre du site : %s" + +#. translators: Login screen title. 1: Login screen name, 2: Network or site +#. name. +#. translators: Admin screen title. 1: Admin screen name, 2: Network or site +#. name. +#: wp-login.php:71 wp-admin/admin-header.php:52 +msgid "%1$s ‹ %2$s — WordPress" +msgstr "%1$s ‹ %2$s — WordPress" + +#. translators: %s: Value type. +#: wp-includes/wp-db.php:1322 +msgid "Unsupported value type (%s)." +msgstr "Type de valeur non supporté (%s)." + +#. translators: %s: register_widget() +#: wp-includes/widgets.php:1143 +msgid "Widgets need to be registered using %s, before they can be displayed." +msgstr "Les widgets nécessitent d’être enregistrés en utilisant %s avant qu’ils ne puissent être affichés." + +#. translators: 1: Number of placeholders, 2: Number of arguments passed. +#: wp-includes/wp-db.php:1380 +msgid "The query does not contain the correct number of placeholders (%1$d) for the number of arguments passed (%2$d)." +msgstr "La requête ne contient pas un nombre correct de substitutifs/placeholders (%1$d) pour le nombre d’arguments proposés (%2$d)." + +#: wp-includes/widgets/class-wp-widget-media-image.php:337 +msgid "Link to:" +msgstr "Lien vers :" + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:38 +msgid "No images selected" +msgstr "Aucune image sélectionnée" + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:30 +msgid "Displays an image gallery." +msgstr "Affiche une galerie d’images." + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:28 +#: wp-includes/js/dist/editor.js:8547 wp-includes/js/dist/block-library.js:8206 +#: wp-includes/js/dist/block-library.js:8621 wp-admin/includes/media.php:20 +msgid "Gallery" +msgstr "Galerie" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:333 +msgid "Custom HTML Widget" +msgstr "Widget HTML personnalisé" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:304 +msgid "Use the Custom HTML widget to add arbitrary HTML code to your widget areas." +msgstr "Utiliser le widget HTML personnalisé pour ajouter un code HTML arbitraire sur vos emplacements de widgets." + +#. translators: %s: New email address. +#: wp-includes/user.php:2905 +msgid "Your email address has not been updated yet. Please check your inbox at %s for a confirmation email." +msgstr "Votre adresse e-mail n’a pas encore été mise à jour. Veuillez vérifier votre messagerie sur %s et l’e-mail de confirmation." + +#. translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: +#. those are placeholders. +#: wp-includes/user.php:2835 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently requested to have the email address on your account changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour ###USERNAME###,\n" +"\n" +"Vous avez récemment demandé à modifier l’adresse de messagerie de l’administration de votre compte.\n" +"\n" +"Si c’est bien le cas, veuillez cliquer sur le lien suivant pour la changer :\n" +"###ADMIN_URL###\n" +"\n" +"Vous pouvez ignorer ce message et le supprimer si vous ne souhaitez pas lancer cette action.\n" +"\n" +"Ce message a été envoyé à ###EMAIL###\n" +"\n" +"Cordialement,\n" +"L’équipe de ###SITENAME###\n" +"###SITEURL###" + +#: wp-includes/user.php:2815 +msgid "Error: The email address is already used." +msgstr "Erreur : cette adresse de messagerie est déjà utilisée." + +#: wp-includes/taxonomy.php:572 +msgid "← Back to Categories" +msgstr "← Revenir aux catégories" + +#: wp-includes/taxonomy.php:142 +msgid "← Back to Link Categories" +msgstr "← Revenir aux catégories de liens" + +#: wp-includes/script-loader.php:1540 +msgid "Color value" +msgstr "Valeur de couleur" + +#: wp-includes/script-loader.php:1477 +msgid "Installation Failed!" +msgstr "L’installation a échoué !" + +#: wp-includes/script-loader.php:1203 +msgid "Schedule your customization changes to publish (\"go live\") at a future date." +msgstr "Planifier les modifications de vos personnalisations pour être publiées à une date ultérieure." + +#: wp-includes/script-loader.php:1195 +msgid "Homepage and posts page must be different." +msgstr "La page d’accueil et la page des articles doivent être différentes." + +#: wp-includes/script-loader.php:1536 +msgid "Clear color" +msgstr "Effacer la couleur" + +#: wp-includes/script-loader.php:1204 +msgid "Sorry, you can’t preview new themes when you have changes scheduled or saved as a draft. Please publish your changes, or wait until they publish to preview new themes." +msgstr "Désolé, vous ne pouvez pas prévisualiser les nouveaux thèmes lorsque vous avez des modifications programmées ou enregistrées en brouillon. Veuillez publier vos modifications, ou attendre qu’elles soient publiées pour prévisualiser les nouveaux thèmes." + +#. translators: %d: Error count. +#: wp-includes/script-loader.php:1190 wp-includes/script-loader.php:1192 +#: wp-includes/widgets/class-wp-widget-custom-html.php:228 +#: wp-includes/widgets/class-wp-widget-custom-html.php:230 +msgid "There is %d error which must be fixed before you can save." +msgid_plural "There are %d errors which must be fixed before you can save." +msgstr[0] "Il y a %d erreur que vous devriez corriger avant d’enregistrer." +msgstr[1] "Il y a %d erreurs que vous devriez corriger avant d’enregistrer." + +#: wp-includes/script-loader.php:1167 +msgid "Discard changes" +msgstr "Annuler les modifications" + +#: wp-includes/script-loader.php:1177 +msgid "Downloading your new theme…" +msgstr "Nouveau thème en cours de téléchargement…" + +#: wp-includes/script-loader.php:1160 +msgid "Please save your changes in order to share the preview." +msgstr "Veuillez enregistrer vos modifications pour pouvoir partager la prévisualisation." + +#: wp-includes/script-loader.php:1155 +msgid "Draft Saved" +msgstr "Brouillon enregistré" + +#: wp-includes/script-loader.php:1150 wp-admin/customize.php:180 +msgid "Activate & Publish" +msgstr "Activer & publier" + +#: wp-includes/script-loader.php:1007 +msgid "Vietnamese" +msgstr "Vietnamien" + +#: wp-includes/script-loader.php:1006 +msgid "Ukrainian" +msgstr "Ukrainien" + +#: wp-includes/script-loader.php:1005 +msgid "Turkish" +msgstr "Turc" + +#: wp-includes/script-loader.php:1004 +msgid "Thai" +msgstr "Thai" + +#: wp-includes/script-loader.php:1008 +msgid "Welsh" +msgstr "Gaélique" + +#: wp-includes/script-loader.php:1002 +msgid "Swedish" +msgstr "Suédois" + +#: wp-includes/script-loader.php:1001 +msgid "Swahili" +msgstr "Swahili" + +#: wp-includes/script-loader.php:1003 +msgid "Tagalog" +msgstr "Tagalog" + +#: wp-includes/script-loader.php:1009 +msgid "Yiddish" +msgstr "Yiddish" + +#: wp-includes/script-loader.php:1000 +msgid "Spanish" +msgstr "Espagnol" + +#: wp-includes/script-loader.php:999 +msgid "Slovenian" +msgstr "Slovénien" + +#: wp-includes/script-loader.php:998 +msgid "Slovak" +msgstr "Slovaque" + +#: wp-includes/script-loader.php:997 +msgid "Serbian" +msgstr "Serbe" + +#: wp-includes/script-loader.php:996 +msgid "Russian" +msgstr "Russe" + +#: wp-includes/script-loader.php:995 +msgid "Romanian" +msgstr "Roumain" + +#: wp-includes/script-loader.php:994 +msgid "Portuguese" +msgstr "Portugais" + +#: wp-includes/script-loader.php:993 +msgid "Polish" +msgstr "Polonais" + +#: wp-includes/script-loader.php:992 +msgid "Persian" +msgstr "Perse" + +#: wp-includes/script-loader.php:991 +msgid "Norwegian" +msgstr "Norvégien" + +#: wp-includes/script-loader.php:990 +msgid "Maltese" +msgstr "Maltais" + +#: wp-includes/script-loader.php:989 +msgid "Malay" +msgstr "Malais" + +#: wp-includes/script-loader.php:988 +msgid "Macedonian" +msgstr "Macédonien" + +#: wp-includes/script-loader.php:987 +msgid "Lithuanian" +msgstr "Lituanien" + +#: wp-includes/script-loader.php:986 +msgid "Latvian" +msgstr "Letton" + +#: wp-includes/script-loader.php:985 +msgid "Korean" +msgstr "Coréen" + +#: wp-includes/script-loader.php:984 +msgid "Japanese" +msgstr "Japonais" + +#: wp-includes/script-loader.php:983 +msgid "Italian" +msgstr "Italien" + +#: wp-includes/script-loader.php:982 +msgid "Irish" +msgstr "Irlandais" + +#: wp-includes/script-loader.php:1178 +msgid "Setting up your live preview. This may take a bit." +msgstr "Mise en place de votre Prévisualisation en direct. Cela peut prendre un moment." + +#: wp-includes/script-loader.php:1179 +msgid "Reverting unpublished changes…" +msgstr "Rétablissement des changements non publiés…" + +#: wp-includes/script-loader.php:1156 +msgid "Updating" +msgstr "Mise à jour en cours" + +#. translators: %d: Error count. +#: wp-includes/script-loader.php:1056 wp-includes/script-loader.php:1058 +msgid "There is %d error which must be fixed before you can update this file." +msgid_plural "There are %d errors which must be fixed before you can update this file." +msgstr[0] "Il y a %d erreur qui doit être corrigée avant de mettre à jour ce fichier." +msgstr[1] "Il y a %d erreurs qui doivent être corrigées avant de mettre à jour ce fichier." + +#: wp-includes/script-loader.php:1180 +msgid "Are you sure you want to discard your unpublished changes?" +msgstr "Confirmez-vous l’annulation de vos modifications non publiées ?" + +#. translators: %s: URL to the Customizer to load the autosaved version. +#: wp-includes/script-loader.php:1184 +msgid "There is a more recent autosave of your changes than the one you are previewing. Restore the autosave" +msgstr "Il existe une sauvegarde automatique de vos modifications plus récente que celle que vous en êtes en train de parcourir. Restaurer la sauvegarde" + +#: wp-includes/js/dist/editor.js:9394 wp-includes/js/dist/editor.js:9602 +msgid "Schedule…" +msgstr "Planification…" + +#: wp-includes/script-loader.php:976 +msgid "Haitian Creole" +msgstr "Créole haïtien" + +#: wp-includes/script-loader.php:975 +msgid "Greek" +msgstr "Grec" + +#: wp-includes/script-loader.php:974 +msgid "German" +msgstr "Allemand" + +#: wp-includes/script-loader.php:973 +msgid "Galician" +msgstr "Galicien" + +#: wp-includes/script-loader.php:972 +msgid "French" +msgstr "Français" + +#: wp-includes/script-loader.php:970 +msgid "Filipino" +msgstr "Filipino" + +#: wp-includes/script-loader.php:969 +msgid "Estonian" +msgstr "Estonien" + +#: wp-includes/script-loader.php:968 wp-admin/includes/ms.php:662 +msgid "English" +msgstr "Anglais" + +#: wp-includes/script-loader.php:967 +msgid "Dutch" +msgstr "Néerlandais" + +#: wp-includes/script-loader.php:966 +msgid "Danish" +msgstr "Danois" + +#: wp-includes/script-loader.php:965 +msgid "Czech" +msgstr "Tchèque" + +#: wp-includes/script-loader.php:964 +msgid "Croatian" +msgstr "Croate" + +#: wp-includes/script-loader.php:963 +msgid "Chinese (Traditional)" +msgstr "Chinois (traditionnel)" + +#: wp-includes/script-loader.php:962 +msgid "Chinese (Simplified)" +msgstr "Chinois (simplifié)" + +#: wp-includes/script-loader.php:961 +msgid "Chinese" +msgstr "Chinois" + +#: wp-includes/script-loader.php:960 +msgid "Catalan" +msgstr "Catalan" + +#: wp-includes/script-loader.php:959 +msgid "Bulgarian" +msgstr "Bulgare" + +#: wp-includes/script-loader.php:958 +msgid "Belarusian" +msgstr "Biélorusse" + +#: wp-includes/script-loader.php:981 +msgid "Indonesian" +msgstr "Indonésien" + +#: wp-includes/script-loader.php:980 +msgid "Icelandic" +msgstr "Islandais" + +#: wp-includes/script-loader.php:979 +msgid "Hungarian" +msgstr "Hongrois" + +#: wp-includes/script-loader.php:978 +msgid "Hindi" +msgstr "Hindi" + +#: wp-includes/script-loader.php:977 +msgid "Hebrew" +msgstr "Hébreu" + +#: wp-includes/script-loader.php:957 +msgid "Arabic" +msgstr "Arabe" + +#: wp-includes/script-loader.php:956 +msgid "Albanian" +msgstr "Albanais" + +#: wp-includes/script-loader.php:955 +msgid "Afrikaans" +msgstr "Afrikaans" + +#: wp-includes/script-loader.php:945 +msgid "Live Broadcast" +msgstr "Émission en direct" + +#: wp-includes/script-loader.php:953 +msgid "Chapters" +msgstr "Chapitres" + +#: wp-includes/script-loader.php:939 +msgid "You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/" +msgstr "Vous utilisez un navigateur qui n’a pas le lecteur Flash activé ou installé. Veuillez activer votre extension Flash ou télécharger la dernière version à partir de cette adresse : https://get.adobe.com/flashplayer/" + +#. translators: %s: Post custom field name. +#: wp-includes/post-template.php:1105 +msgctxt "Post custom field name" +msgid "%s:" +msgstr "%s :" + +#. translators: 1: Comment author's name, 2: Comment author's IP address, 3: +#. Comment author's hostname. +#: wp-includes/pluggable.php:1608 wp-includes/pluggable.php:1792 +msgid "Author: %1$s (IP address: %2$s, %3$s)" +msgstr "Auteur : %1$s (adresse IP : %2$s, %3$s)" + +#. translators: 1: Trackback/pingback website name, 2: Website IP address, 3: +#. Website hostname. +#: wp-includes/pluggable.php:1580 wp-includes/pluggable.php:1594 +#: wp-includes/pluggable.php:1770 wp-includes/pluggable.php:1781 +msgid "Website: %1$s (IP address: %2$s, %3$s)" +msgstr "Site web : %1$s (adresse IP : %2$s, %3$s)" + +#: wp-includes/post.php:227 +msgid "oEmbed Response" +msgstr "Retour oEmbed" + +#: wp-includes/post.php:226 +msgid "oEmbed Responses" +msgstr "Retours oEmbed" + +#. translators: %s: register_routes() +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:52 +msgid "Method '%s' must be overridden." +msgstr "La méthode « %s » doit être surchargée." + +#. translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those +#. are placeholders. +#: wp-includes/ms-functions.php:2774 +msgid "" +"Hi,\n" +"\n" +"This notice confirms that the network admin email address was changed on ###SITENAME###.\n" +"\n" +"The new network admin email address is ###NEW_EMAIL###.\n" +"\n" +"This email has been sent to ###OLD_EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour,\n" +"\n" +"Cette notification pour vous confirmer que l’adresse e-mail de l’administrateur du réseau a été changé sur ###SITENAME###.\n" +"\n" +"La nouvelle adresse e-mail de l’administrateur du réseau est ###NEW_EMAIL###.\n" +"\n" +"Cet e-mail a été envoyé à ###OLD_EMAIL###.\n" +"\n" +"Cordialement,\n" +"L’équipe de ###SITENAME###\n" +"###SITEURL###" + +#. translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: +#. those are placeholders. +#: wp-includes/ms-functions.php:2676 +msgid "" +"Howdy ###USERNAME###,\n" +"\n" +"You recently requested to have the network admin email address on\n" +"your network changed.\n" +"\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour ###USERNAME###,\n" +"\n" +"Vous avez récemment demander à modifier l’adresse e-mail de l’administrateur de votre réseau.\n" +"\n" +"Si c’est bien le cas, veuillez cliquer sur le lien suivant pour la changer :\n" +"###ADMIN_URL###\n" +"\n" +"Vous pouvez sans risque ignorer et supprimer cet e-mail si vous ne voulez pas effectuer cet action.\n" +"\n" +"Cet e-mail a été envoyé à ###EMAIL###.\n" +"\n" +"Cordialement,\n" +"L’équipe de ###SITENAME###\n" +"###SITEURL###" + +#: wp-includes/ms-functions.php:194 +msgid "User cannot be added to this site." +msgstr "L’utilisateur ne peut pas être ajouté à ce site." + +#: wp-includes/load.php:1458 +msgid "Scrape nonce check failed. Please try again." +msgstr "La récupération de la vérification du nonce a échoué. Veuillez réessayer." + +#. translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those +#. are placeholders. +#: wp-includes/functions.php:7002 +msgid "" +"Hi,\n" +"\n" +"This notice confirms that the admin email address was changed on ###SITENAME###.\n" +"\n" +"The new admin email address is ###NEW_EMAIL###.\n" +"\n" +"This email has been sent to ###OLD_EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Bonjour,\n" +"\n" +"Cette notification pour vous confirmer que l’adresse e-mail de l’administrateur a été changé sur ###SITENAME###.\n" +"\n" +"La nouvelle adresse e-mail de l’administrateur est ###NEW_EMAIL###.\n" +"\n" +"Cet e-mail a été envoyé à ###OLD_EMAIL###.\n" +"\n" +"Cordialement,\n" +"L’équipe de ###SITENAME###\n" +"###SITEURL###" + +#: wp-includes/deprecated.php:3933 wp-includes/deprecated.php:3950 +#: wp-admin/press-this.php:74 +msgid "The Press This plugin is required." +msgstr "L’extension « Press This » est requise." + +#. translators: %s: Number of themes displayed. +#: wp-includes/customize/class-wp-customize-themes-section.php:152 +msgid "%s themes" +msgstr "%s thèmes" + +#. translators: %s: Number of filters selected. +#: wp-includes/customize/class-wp-customize-themes-section.php:136 +msgid "Filter themes (%s)" +msgstr "Trier les thèmes (%s)" + +#: wp-includes/customize/class-wp-customize-theme-control.php:132 +#: wp-admin/includes/theme.php:796 +msgid "Install & Preview" +msgstr "Installer & prévisualiser" + +#: wp-includes/functions.php:6918 +msgid "Only UUID V4 is supported at this time." +msgstr "Seul le système UUID v4 est reconnu à l’heure actuelle." + +#: wp-includes/customize/class-wp-customize-themes-section.php:103 +msgid "Search WordPress.org themes" +msgstr "Rechercher des thèmes WordPress.org" + +#: wp-includes/customize/class-wp-customize-themes-section.php:124 +msgid "Back to theme sources" +msgstr "Retour aux sources du thème" + +#: wp-includes/customize/class-wp-customize-nav-menu-item-setting.php:722 +msgid "Invalid URL." +msgstr "URL non-valide." + +#. translators: %s: "Add Items" button text. +#: wp-includes/customize/class-wp-customize-nav-menu-control.php:46 +msgid "Time to add some links! Click “%s” to start putting pages, categories, and custom links in your menu. Add as many things as you’d like." +msgstr "Il est grand temps d’ajouter quelques liens ! Cliquez sur « %s » pour ajouter des pages, des catégories ou des liens personnalisés dans votre menu. Ajoutez autant de choses que vous le souhaitez." + +#: wp-includes/customize/class-wp-customize-media-control.php:250 +msgid "Choose image" +msgstr "Choisir une image" + +#: wp-includes/customize/class-wp-customize-media-control.php:239 +msgid "Choose audio" +msgstr "Choisir un fichier sonore" + +#: wp-includes/customize/class-wp-customize-media-control.php:234 +msgid "Change audio" +msgstr "Modifier le fichier sonore" + +#: wp-includes/customize/class-wp-customize-media-control.php:233 +#: wp-includes/customize/class-wp-customize-media-control.php:238 +msgid "Select audio" +msgstr "Sélectionner un fichier sonore" + +#. translators: %s: Header height in pixels. +#: wp-includes/customize/class-wp-customize-header-image-control.php:219 +msgid "Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header height of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit." +msgstr "Cliquez sur « Ajouter une nouvelle image » pour téléverser un fichier image depuis votre ordinateur. Votre thème fonctionne mieux avec une image avec la hauteur d’en-tête de %s pixels. Vous pourrez recadrer l’image dès qu’elle sera téléversée pour un ajustement parfait." + +#. translators: %s: Header width in pixels. +#: wp-includes/customize/class-wp-customize-header-image-control.php:213 +msgid "Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header width of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit." +msgstr "Cliquez sur « Ajouter une nouvelle image » pour téléverser un fichier image depuis votre ordinateur. Votre thème fonctionne mieux avec une image avec la largeur d’en-tête de %s pixels. Vous pourrez recadrer l’image dès qu’elle sera téléversée pour un ajustement parfait." + +#. translators: %s: Header size in pixels. +#: wp-includes/customize/class-wp-customize-header-image-control.php:207 +msgid "Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header size of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit." +msgstr "Cliquez sur « Ajouter une nouvelle image » pour téléverser un fichier image depuis votre ordinateur. Votre thème fonctionne mieux avec une image de taille d’en-tête de %s pixels. Vous pourrez recadrer l’image dès qu’elle sera téléversée pour un ajustement parfait." + +#: wp-includes/customize/class-wp-customize-header-image-control.php:203 +msgid "Click “Add new image” to upload an image file from your computer. Your theme works best with an image that matches the size of your video — you’ll be able to crop your image once you upload it for a perfect fit." +msgstr "Cliquez sur « Ajouter une nouvelle image » pour téléverser un fichier image depuis votre ordinateur. Votre thème fonctionne mieux avec une image de la même taille que votre vidéo. Vous pourrez recadrer l’image dès qu’elle sera téléversée pour un ajustement parfait." + +#. translators: 1: Month number (01, 02, etc.), 2: Month abbreviation. +#: wp-includes/customize/class-wp-customize-date-time-control.php:203 +#: wp-admin/includes/template.php:817 +msgid "%1$s-%2$s" +msgstr "%1$s-%2$s" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:170 +msgid "Meridian" +msgstr "Méridien" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:167 +#: wp-admin/includes/template.php:824 +msgid "Minute" +msgstr "Minute" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:162 +#: wp-admin/includes/template.php:823 +msgid "Hour" +msgstr "Heure" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:160 +#: wp-includes/js/dist/components.js:33128 +msgid "Time" +msgstr "Heure" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:146 +#: wp-includes/js/dist/components.js:33082 wp-admin/includes/template.php:821 +msgid "Day" +msgstr "Jour" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:130 +#: wp-includes/js/dist/components.js:33044 wp-admin/includes/template.php:811 +msgid "Month" +msgstr "Mois" + +#: wp-includes/customize/class-wp-customize-date-time-control.php:127 +#: wp-includes/js/dist/components.js:33114 +#: wp-admin/includes/ajax-actions.php:2179 +#: wp-admin/includes/class-wp-posts-list-table.php:651 +#: wp-admin/includes/class-wp-posts-list-table.php:1561 +msgid "Date" +msgstr "Date" + +#: wp-includes/class-wp-customize-nav-menus.php:780 +msgid "New Menu" +msgstr "Nouveau menu" + +#: wp-includes/class-wp-customize-nav-menus.php:1064 +msgid "Create New Menu" +msgstr "Créer un nouveau menu" + +#. translators: %s: Template. +#: wp-includes/class-wp-theme.php:290 +msgid "The theme defines itself as its parent theme. Please check the %s header." +msgstr "Le thème se définit lui-même comme son propre thème parent. Veuillez vérifier l’en-tête %s." + +#: wp-includes/class-wp-editor.php:190 wp-includes/class-wp-editor.php:1392 +msgctxt "Name for the Visual editor tab" +msgid "Visual" +msgstr "Visuel" + +#. translators: URL to the Widgets panel of the Customizer. +#: wp-includes/class-wp-customize-nav-menus.php:633 +msgid "If your theme has widget areas, you can also add menus there. Visit the Widgets panel and add a “Navigation Menu widget” to display a menu in a sidebar or footer." +msgstr "Si votre thème possède des zones de widgets, vous pouvez aussi y ajouter des menus. Consultez le panneau Widgets et ajoutez un « Widget de menu de navigation » pour afficher un menu en colonne latérale ou en pied de page." + +#: wp-includes/class-wp-user.php:745 +msgid "Usage of user levels is deprecated. Use capabilities instead." +msgstr "L’utilisation des niveaux d’utilisateurs est dépréciée. Utilisez plutôt les permissions d’utilisateurs." + +#: wp-includes/class-wp-customize-manager.php:5682 +msgid "CSS code" +msgstr "Code CSS" + +#. translators: %s: Number of menu locations. +#: wp-includes/class-wp-customize-nav-menus.php:437 +msgid "Your theme can display menus in %s location." +msgid_plural "Your theme can display menus in %s locations." +msgstr[0] "Votre thème peut afficher des menus sur %s emplacement." +msgstr[1] "Votre thème peut afficher des menus sur %s emplacements." + +#: wp-includes/class-wp-customize-nav-menus.php:434 +msgid "Your theme can display menus in one location." +msgstr "Votre thème peut afficher des menus sur un emplacement." + +#: wp-includes/class-wp-customize-nav-menus.php:454 +msgid "If your theme has multiple menus, giving them clear names will help you manage them." +msgstr "Si votre thème dispose de plusieurs menus, leur donner des noms pertinents vous aidera à les gérer." + +#: wp-includes/class-wp-customize-manager.php:5572 +#: wp-admin/options-reading.php:85 wp-admin/options-reading.php:86 +msgid "Your homepage displays" +msgstr "La page d’accueil affiche" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:322 +#: wp-includes/class-wp-customize-manager.php:5630 wp-admin/theme-editor.php:32 +#: wp-admin/plugin-editor.php:129 +msgid "When using a keyboard to navigate:" +msgstr "Lorsque l’on utilise un clavier pour naviguer :" + +#: wp-includes/class-wp-customize-manager.php:5620 +msgid "Add your own CSS code here to customize the appearance and layout of your site." +msgstr "Ajouter votre propre code CSS ici pour personnaliser l’apparence et la mise en page de votre site." + +#: wp-includes/widgets/class-wp-widget-custom-html.php:325 +#: wp-includes/class-wp-customize-manager.php:5633 wp-admin/theme-editor.php:35 +#: wp-admin/plugin-editor.php:132 +msgid "To move away from this area, press the Esc key followed by the Tab key." +msgstr "Pour partir de cette zone, utiliser la touche ESC puis la touche TAB." + +#: wp-includes/widgets/class-wp-widget-custom-html.php:326 +#: wp-includes/class-wp-customize-manager.php:5634 wp-admin/theme-editor.php:36 +#: wp-admin/plugin-editor.php:133 +msgid "Screen reader users: when in forms mode, you may need to press the Esc key twice." +msgstr "Utilisateurs de lecteurs d’écrans : en mode formulaire, vous aurez besoin d’utiliser la touche ESC deux fois." + +#: wp-includes/class-wp-customize-manager.php:5555 +msgid "You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed." +msgstr "Vous pouvez choisir ce qui est affiché sur la page d’accueil de votre site. Il peut s’agir d’articles dans l’ordre chronologique inversé (blog classique), ou une page fixe/statique. Pour définir une page d’accueil statique, vous devez au préalable créer deux pages. Une qui deviendra la page d’accueil, et une autre qui sera celle où vos articles seront affichés." + +#. translators: 1: Link to user profile, 2: Additional link attributes, 3: +#. Accessibility text. +#: wp-includes/widgets/class-wp-widget-custom-html.php:311 +#: wp-includes/class-wp-customize-manager.php:5641 +msgid "The edit field automatically highlights code syntax. You can disable this in your user profile%3$s to work in plain text mode." +msgstr "Le champ de modification met automatiquement en surbrillance la syntaxe du code. Vous pouvez désactiver ceci dans votre profil utilisateur%3$s pour travailler en mode texte brut." + +#: wp-includes/widgets/class-wp-widget-custom-html.php:324 +#: wp-includes/class-wp-customize-manager.php:5632 wp-admin/theme-editor.php:34 +#: wp-admin/plugin-editor.php:131 +msgid "In the editing area, the Tab key enters a tab character." +msgstr "Dans la zone de modification, la touche Tab saisit un caractère de tabulation." + +#: wp-includes/class-wp-customize-manager.php:5553 +msgid "Homepage Settings" +msgstr "Réglages de la page d’accueil" + +#. translators: %s: Site icon size in pixels. +#: wp-includes/class-wp-customize-manager.php:5127 +msgid "Site Icons should be square and at least %s pixels." +msgstr "Les icônes du site devraient être des carrés d’au moins %s pixels." + +#: wp-includes/class-wp-customize-manager.php:4307 +msgid "Copied" +msgstr "Copié" + +#: wp-includes/class-wp-customize-manager.php:5021 +msgid "WordPress.org themes" +msgstr "Thèmes WordPress.org" + +#: wp-includes/class-wp-customize-manager.php:4301 +msgid "Preview Link" +msgstr "Lien de prévisualisation" + +#: wp-includes/class-wp-customize-manager.php:4296 +msgid "Share Preview Link" +msgstr "Partager le lien de prévisualisation" + +#: wp-includes/class-wp-customize-manager.php:5006 +msgid "Installed themes" +msgstr "Thèmes installés" + +#: wp-includes/script-loader.php:1210 wp-admin/customize.php:183 +#: wp-admin/edit-form-advanced.php:390 +msgid "Publish Settings" +msgstr "Publier les réglages" + +#: wp-includes/class-wp-customize-manager.php:3166 +msgid "Changes trashed successfully." +msgstr "Les modifications ont bien été mises à la corbeille." + +#: wp-includes/class-wp-customize-manager.php:3147 +msgid "Changes have already been trashed." +msgstr "Les modifications ont déjà été mises à la corbeille." + +#: wp-includes/class-wp-customize-manager.php:3139 +#: wp-includes/class-wp-customize-manager.php:3159 +msgid "Unable to trash changes." +msgstr "Impossible de mettre les modifications à la corbeille." + +#: wp-includes/class-wp-customize-manager.php:3128 +msgid "No changes saved yet, so there is nothing to trash." +msgstr "Aucune modification enregistrée, il n’y a donc rien à mettre à la corbeille." + +#: wp-includes/script-loader.php:1161 +#: wp-includes/class-wp-customize-manager.php:2655 +#: wp-includes/class-wp-customize-manager.php:2670 +msgid "You must supply a future date to schedule." +msgstr "Vous devez fournir une date future pour activer la planification." + +#. translators: %s: Number of invalid settings. +#: wp-includes/script-loader.php:1198 wp-includes/script-loader.php:1200 +#: wp-includes/class-wp-customize-manager.php:2774 +msgid "Unable to save due to %s invalid setting." +msgid_plural "Unable to save due to %s invalid settings." +msgstr[0] "Impossible d’enregistrer suite à %s réglage non valide." +msgstr[1] "Impossible d’enregistrer suite à %s réglages non valides." + +#: wp-includes/class-wp-customize-manager.php:4298 +msgid "See how changes would look live on your website, and share the preview with people who can't access the Customizer." +msgstr "Voyez comment les changements apparaîtront sur votre site, et partagez l’aperçu avec les personnes qui peuvent accéder à l’outil de personnalisation." + +#: wp-includes/class-wp-customize-manager.php:5125 +msgid "Site Icons are what you see in browser tabs, bookmark bars, and within the WordPress mobile apps. Upload one here!" +msgstr "Les icônes du site sont ce que vous voyez dans les onglets du navigateur, les barres de signets, et dans les applications mobiles WordPress. Téléversez-en une ici !" + +#: wp-includes/class-wp-customize-manager.php:3118 +msgid "There was an authentication problem. Please reload and try again." +msgstr "Il y a eu un problème d’authentification. Veuillez recharger et réessayer." + +#: wp-includes/admin-bar.php:812 +msgid "Edit User" +msgstr "Modifier un utilisateur" + +#: wp-includes/admin-bar.php:766 +msgid "View User" +msgstr "Prévisualiser l’utilisateur" + +#: wp-includes/class-wp-customize-manager.php:2632 +msgid "The previous set of changes has already been published. Please try saving your current set of changes again." +msgstr "Le jeu de modifications précédent a déjà été publié. Veuillez réessayer d’enregistrer votre jeu de modification actuel." + +#: wp-includes/widgets/class-wp-widget-text.php:498 +msgid "This widget may have contained code that may work better in the “Custom HTML” widget. If you haven’t yet, how about trying that widget instead?" +msgstr "Ce widget semble contenir du code qui fonctionnerait sans doute mieux dans le nouveau widget « HTML personnalisé ». Si vous ne l’avez pas encore fait, pourquoi ne pas l’essayer à la place ?" + +#: wp-includes/widgets/class-wp-widget-text.php:551 +msgid "Hey there, looks like you just pasted HTML into the “Visual” tab of the Text widget. You may want to paste your code into the “Text” tab instead. Alternately, try out the new “Custom HTML” widget!" +msgstr "Bonjour, il semblerait que vous ayez collé du code HTML dans l’onglet « Visuel » du widget texte. Vous souhaitiez peut-être le coller dans l’onglet « Texte ». Vous pouvez également essayer le nouveau widget « HTML personnalisé » !" + +#: wp-includes/widgets/class-wp-widget-text.php:550 +msgid "Did you just paste HTML?" +msgstr "Venez-vous de coller du code HTML ?" + +#: wp-includes/widgets/class-wp-widget-text.php:535 +msgid "Did you know there is a “Custom HTML” widget now? You can find it by scanning the list of available widgets on this screen. Check it out to add some custom code to your site!" +msgstr "Avez-vous entendu parler de notre nouveau widget « HTML personnalisé » ? Vous pouvez le trouver dans la liste des widgets disponibles sur cet écran. Utilisez-le pour ajouter du code personnalisé à votre site !" + +#: wp-includes/widgets/class-wp-widget-text.php:533 +msgid "Did you know there is a “Custom HTML” widget now? You can find it by pressing the “Add a Widget” button and searching for “HTML”. Check it out to add some custom code to your site!" +msgstr "Dites, avez-vous entendu parler de notre nouveau widget « HTML personnalisé » ? Vous pouvez le trouver en cliquant sur le bouton « Ajoutez un widget » et en recherchant « HTML ». Utilisez-le pour ajouter du code personnalisé à votre site !" + +#: wp-includes/widgets/class-wp-widget-text.php:35 +msgid "Arbitrary text." +msgstr "Texte arbitraire." + +#: wp-includes/widgets/class-wp-widget-text.php:496 +msgid "This widget may contain code that may work better in the “Custom HTML” widget. How about trying that widget instead?" +msgstr "Ce widget peut contenir du code qui fonctionnerait mieux dans le nouveau widget « HTML personnalisé ». Pourquoi ne pas l’essayer à la place ?" + +#: wp-includes/widgets/class-wp-widget-text.php:531 +msgid "New Custom HTML Widget" +msgstr "Nouveau widget HTML personnalisé." + +#: wp-includes/widgets/class-wp-widget-custom-html.php:53 +#: wp-includes/js/dist/block-library.js:14314 +msgid "Custom HTML" +msgstr "HTML personnalisé" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:283 +msgid "Some HTML tags are not permitted, including:" +msgstr "Certaines balises HTML ne sont pas autorisées, dont :" + +#: wp-includes/widgets/class-wp-widget-custom-html.php:46 +msgid "Arbitrary HTML code." +msgstr "Code HTML arbitraire." + +#. translators: %s: Number of items (tags). +#. translators: %s: Number of items. +#. translators: Number of items. +#. translators: %s: Number of comments. +#: wp-includes/category-template.php:841 wp-includes/category-template.php:852 +#: wp-admin/includes/class-wp-list-table.php:812 +#: wp-admin/includes/class-wp-list-table.php:1405 +#: wp-admin/includes/ajax-actions.php:533 +msgid "%s item" +msgid_plural "%s items" +msgstr[0] "%s élément" +msgstr[1] "%s éléments" + +#: wp-includes/widgets/class-wp-widget-tag-cloud.php:146 +msgid "Show tag counts" +msgstr "Afficher le nombre d’étiquettes" + +#: wp-includes/widgets/class-wp-widget-media.php:70 +msgctxt "label for button in the media widget" +msgid "Add Media" +msgstr "Ajouter un média" + +#: wp-includes/widgets/class-wp-widget-media-video.php:39 +msgctxt "label for button in the video widget" +msgid "Add Video" +msgstr "Ajouter une vidéo" + +#: wp-includes/widgets/class-wp-widget-media-image.php:39 +msgctxt "label for button in the image widget" +msgid "Add Image" +msgstr "Ajouter une image" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:39 +msgctxt "label for button in the audio widget" +msgid "Add Audio" +msgstr "Ajouter un son" + +#: wp-includes/media.php:3476 +msgid "(no author)" +msgstr "(aucun auteur)" + +#: wp-includes/script-loader.php:2027 +msgid "Attend an upcoming event near you." +msgstr "Assister à un évènement à venir proche de chez vous." + +#: wp-includes/script-loader.php:2025 +msgid "Enter your closest city to find nearby events." +msgstr "Saisissez la ville la plus proche afin de trouver des évènements à proximité." + +#. translators: %s: The name of a city. +#: wp-includes/script-loader.php:2049 +msgid "City updated. Listing events near %s." +msgstr "Ville mise à jour. Liste des évènements proche de %s." + +#. translators: %s is the name of the city we couldn't locate. * Replace the +#. examples with cities in your locale, but test * that they match the expected +#. location before including them. * Use endonyms (native locale names) +#. whenever possible. +#: wp-includes/script-loader.php:2045 wp-admin/includes/dashboard.php:1356 +msgid "We couldn’t locate %s. Please try another nearby city. For example: Kansas City; Springfield; Portland." +msgstr "Nous ne localisons pas %s. Veuillez essayer une autre ville proche. Par exemple : Paris, Lyon, Bordeaux." + +#: wp-includes/script-loader.php:2026 wp-admin/includes/dashboard.php:1272 +msgid "An error occurred. Please try again." +msgstr "Une erreur est survenue. Veuillez réessayer plus tard." + +#. translators: %s: URL to Network Settings screen. +#: wp-signup.php:926 +msgid "To change or disable registration go to your Options page." +msgstr "Pour changer ou désactiver l’inscription allez sur votre page d’options." + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:63 +#: wp-includes/widgets/class-wp-widget-media.php:154 +msgid "Title for the widget" +msgstr "Titre pour le widget" + +#: wp-includes/widgets/class-wp-widget-media.php:81 +msgid "Media Widget" +msgstr "Widget média" + +#. translators: %d: Widget count. +#: wp-includes/widgets/class-wp-widget-media.php:80 +msgid "Media Widget (%d)" +msgid_plural "Media Widget (%d)" +msgstr[0] "Widget média (%d)" +msgstr[1] "Widgets média (%d)" + +#. translators: %s: URL to media library. +#: wp-includes/widgets/class-wp-widget-media.php:76 +msgid "We can’t find that file. Check your media library and make sure it wasn’t deleted." +msgstr "Nous ne trouvons pas ce fichier. Vérifiez votre bibliothèque et assurez vous qu’il n’a pas été supprimé." + +#: wp-includes/widgets/class-wp-widget-media.php:69 +msgid "No media selected" +msgstr "Aucun média sélectionné" + +#: wp-includes/widgets/class-wp-widget-media.php:60 +msgid "A media item." +msgstr "Un élément média." + +#: wp-includes/widgets/class-wp-widget-media-video.php:49 +msgid "Video Widget" +msgstr "Widget vidéo" + +#. translators: %s: URL to media library. +#: wp-includes/widgets/class-wp-widget-media-video.php:44 +msgid "We can’t find that video. Check your media library and make sure it wasn’t deleted." +msgstr "Nous ne trouvons pas cette vidéo. Vérifiez votre bibliothèque et assurez vous qu’elle n’a pas été supprimée. " + +#: wp-signup.php:905 +msgid "Greetings Network Administrator!" +msgstr "Bienvenue, Administrateur du réseau !" + +#: wp-includes/widgets/class-wp-widget-media.php:148 +msgid "URL to the media file" +msgstr "URL du fichier média" + +#: wp-includes/widgets/class-wp-widget-media.php:73 +msgid "Add to Widget" +msgstr "Ajouter au widget" + +#. translators: %s: Video extension. +#: wp-includes/widgets/class-wp-widget-media-video.php:98 +msgid "URL to the %s video source file" +msgstr "URL vers le fichier source vidéo %s" + +#: wp-signup.php:919 +msgid "The network currently allows both site and user registrations." +msgstr "Le réseau autorise actuellement les enregistrements de sites et d’utilisateurs." + +#: wp-signup.php:913 +msgid "The network currently allows site registrations." +msgstr "Le réseau autorise actuellement les enregistrements de site." + +#: wp-includes/widgets/class-wp-widget-media.php:82 +msgid "Looks like this isn’t the correct kind of file. Please link to an appropriate file instead." +msgstr "Il semble qu’il ne s’agisse pas du bon type de fichier. Veuillez lier vers un fichier approprié." + +#. translators: %d: Widget count. +#: wp-includes/widgets/class-wp-widget-media-video.php:48 +msgid "Video Widget (%d)" +msgid_plural "Video Widget (%d)" +msgstr[0] "Widget vidéo (%d)" +msgstr[1] "Widgets vidéo (%d)" + +#: wp-signup.php:910 +msgid "The network currently disallows registrations." +msgstr "Le réseau n’autorise actuellement pas les inscriptions." + +#: wp-signup.php:916 +msgid "The network currently allows user registrations." +msgstr "Le réseau autorise actuellement les inscriptions d’utilisateurs." + +#: wp-includes/widgets/class-wp-widget-media.php:72 +msgctxt "label for button in the media widget; should preferably not be longer than ~13 characters long" +msgid "Edit Media" +msgstr "Modifier le média" + +#: wp-includes/widgets/class-wp-widget-media.php:71 +msgctxt "label for button in the media widget; should preferably not be longer than ~13 characters long" +msgid "Replace Media" +msgstr "Remplacer le média" + +#: wp-includes/widgets/class-wp-widget-media.php:141 +msgid "Attachment post ID" +msgstr "ID du fichier joint de la publication" + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:39 +msgctxt "label for button in the gallery widget; should not be longer than ~13 characters long" +msgid "Add Images" +msgstr "Ajouter" + +#: wp-includes/widgets/class-wp-widget-media-image.php:49 +msgid "Image Widget" +msgstr "Widget image" + +#. translators: %s: URL to media library. +#: wp-includes/widgets/class-wp-widget-media-image.php:44 +msgid "We can’t find that image. Check your media library and make sure it wasn’t deleted." +msgstr "Nous ne trouvons pas cette image. Vérifiez votre bibliothèque et assurez vous qu’elle n’a pas été supprimée. " + +#: wp-includes/widgets/class-wp-widget-media-gallery.php:41 +msgctxt "label for button in the gallery widget; should not be longer than ~13 characters long" +msgid "Edit Gallery" +msgstr "Ajouter" + +#: wp-includes/widgets/class-wp-widget-media-image.php:349 +#: wp-includes/widgets/class-wp-widget-media-audio.php:197 +#: wp-includes/widgets/class-wp-widget-media-video.php:240 +msgid "Unable to preview media due to an unknown error." +msgstr "Impossible de prévisualiser le média en raison d’une erreur inconnue." + +#. translators: %s: URL to media library. +#: wp-includes/widgets/class-wp-widget-media-audio.php:44 +msgid "We can’t find that audio file. Check your media library and make sure it wasn’t deleted." +msgstr "Nous ne trouvons pas ce fichier audio. Vérifiez votre bibliothèque et assurez vous qu’il n’a pas été supprimé. " + +#. translators: %s: Plugin name. +#: wp-includes/script-loader.php:1473 +msgctxt "plugin" +msgid "Install %s now" +msgstr "Installer %s" + +#. translators: %s: Plugin name and version. +#: wp-includes/script-loader.php:1463 +msgctxt "plugin" +msgid "%s update failed" +msgstr "Erreur de mise à jour pour %s" + +#. translators: %s: Plugin name and version. +#: wp-includes/script-loader.php:1454 +msgctxt "plugin" +msgid "Update %s now" +msgstr "Mettre %s à jour" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:38 +#: wp-includes/customize/class-wp-customize-media-control.php:237 +msgid "No audio selected" +msgstr "Aucun fichier audio sélectionné" + +#. translators: %d: Widget count. +#: wp-includes/widgets/class-wp-widget-media-image.php:48 +msgid "Image Widget (%d)" +msgid_plural "Image Widget (%d)" +msgstr[0] "Widget image (%d)" +msgstr[1] "Widgets image (%d)" + +#: wp-includes/widgets/class-wp-widget-media-video.php:41 +msgctxt "label for button in the video widget; should preferably not be longer than ~13 characters long" +msgid "Edit Video" +msgstr "Modifier la vidéo" + +#: wp-includes/widgets/class-wp-widget-media-video.php:40 +msgctxt "label for button in the video widget; should preferably not be longer than ~13 characters long" +msgid "Replace Video" +msgstr "Remplacer la vidéo" + +#: wp-includes/widgets/class-wp-widget-media-image.php:41 +msgctxt "label for button in the image widget; should preferably not be longer than ~13 characters long" +msgid "Edit Image" +msgstr "Modifier l’image" + +#: wp-includes/widgets/class-wp-widget-media-image.php:40 +msgctxt "label for button in the image widget; should preferably not be longer than ~13 characters long" +msgid "Replace Image" +msgstr "Remplacer l’image" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:40 +msgctxt "label for button in the audio widget; should preferably not be longer than ~13 characters long" +msgid "Replace Audio" +msgstr "Remplacer le son" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:41 +msgctxt "label for button in the audio widget; should preferably not be longer than ~13 characters long" +msgid "Edit Audio" +msgstr "Modifier le son" + +#. translators: %d: Widget count. +#: wp-includes/widgets/class-wp-widget-media-audio.php:48 +msgid "Audio Widget (%d)" +msgid_plural "Audio Widget (%d)" +msgstr[0] "Widget de son (%d)" +msgstr[1] "Widgets de son (%d)" + +#. translators: %s: Audio extension. +#: wp-includes/widgets/class-wp-widget-media-audio.php:87 +msgid "URL to the %s audio source file" +msgstr "URL vers le fichier source du son %s" + +#: wp-includes/widgets/class-wp-widget-media-audio.php:50 +msgid "Looks like this isn’t the correct kind of file. Please link to an audio file instead." +msgstr "Il semble que ceci ne soit pas le type de fichier correct. Veuillez faire un lien vers un fichier son à la place." + +#: wp-includes/widgets/class-wp-widget-media-audio.php:49 +msgid "Audio Widget" +msgstr "Widget de son" + +#: wp-includes/script-loader.php:1475 +msgctxt "plugin" +msgid "Installed!" +msgstr "Installée" + +#: wp-includes/script-loader.php:1450 +msgctxt "theme" +msgid "Updated!" +msgstr "Mis à jour !" + +#. translators: %s: Plugin name and version. +#: wp-includes/script-loader.php:1461 +msgctxt "plugin" +msgid "%s updated!" +msgstr "%s est à jour !" + +#: wp-includes/script-loader.php:1476 +msgctxt "theme" +msgid "Installed!" +msgstr "Installé !" + +#: wp-includes/script-loader.php:1505 +msgctxt "plugin" +msgid "Deleted!" +msgstr "Supprimée !" + +#: wp-includes/script-loader.php:1506 +msgctxt "theme" +msgid "Deleted!" +msgstr "Supprimé !" + +#: wp-includes/widgets/class-wp-widget-media-video.php:30 +msgid "Displays a video from the media library or from YouTube, Vimeo, or another provider." +msgstr "Affiche une vidéo depuis votre bibliothèque, YouTube, Vimeo ou un autre fournisseur." + +#: wp-includes/widgets/class-wp-widget-media-image.php:30 +msgid "Displays an image." +msgstr "Affiche une image." + +#: wp-includes/widgets/class-wp-widget-media-audio.php:30 +msgid "Displays an audio player." +msgstr "Affiche un lecteur audio." + +#. translators: %s: Plugin name and version. +#: wp-includes/script-loader.php:1459 +msgctxt "plugin" +msgid "Updating %s..." +msgstr "Mise à jour de %s…" + +#. translators: 1: Parameter, 2: Maximum number. +#: wp-includes/rest-api.php:1371 +msgid "%1$s must be less than or equal to %2$d" +msgstr "%1$s doit être inférieur ou égal à %2$d" + +#. translators: 1: Parameter, 2: Maximum number. +#: wp-includes/rest-api.php:1368 +msgid "%1$s must be less than %2$d" +msgstr "%1$s doit être inférieur à %2$d" + +#. translators: 1: Parameter, 2: Minimum number. +#: wp-includes/rest-api.php:1363 +msgid "%1$s must be greater than or equal to %2$d" +msgstr "%1$s doit être supérieur ou égal à %2$d" + +#. translators: 1: Parameter, 2: Minimum number. +#: wp-includes/rest-api.php:1360 +msgid "%1$s must be greater than %2$d" +msgstr "%1$s doit être supérieur à %2$d" + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1534 +msgid "Limit result set to users with one or more specific slugs." +msgstr "Limiter le jeu de résultats aux utilisateurs ayant un ou plusieurs identifiants spécifiques." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1076 +msgid "Limit result set to terms with one or more specific slugs." +msgstr "Limiter le jeu de résultats aux termes ayant un ou plusieurs identifiants spécifiques." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:239 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:174 +msgid "You need to define an include parameter to order by include." +msgstr "Vous devez définir un paramètre d’inclusion pour ordonner avec include." + +#: wp-includes/script-loader.php:1449 +msgctxt "plugin" +msgid "Updated!" +msgstr "Mise à jour !" + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:316 +msgid "All features, supported by the post type." +msgstr "Toutes les fonctionnalités, supportées par le type de publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:314 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:354 +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:160 +msgid "The page number requested is larger than the number of pages available." +msgstr "Le nombre de page demandé est plus grand que le nombre de pages disponibles." + +#: wp-includes/post.php:1714 +msgctxt "page" +msgid "Use as featured image" +msgstr "Utiliser comme image mise en avant" + +#: wp-includes/post.php:1714 +msgctxt "post" +msgid "Use as featured image" +msgstr "Utiliser comme image mise en avant" + +#: wp-includes/post.php:1713 +msgctxt "page" +msgid "Remove featured image" +msgstr "Supprimer l’image mise en avant" + +#: wp-includes/post.php:1713 +msgctxt "post" +msgid "Remove featured image" +msgstr "Supprimer l’image mise en avant" + +#: wp-includes/post.php:1712 +msgctxt "page" +msgid "Set featured image" +msgstr "Définir l’image mise en avant" + +#: wp-includes/post.php:1712 +msgctxt "post" +msgid "Set featured image" +msgstr "Définir l’image mise en avant" + +#: wp-includes/post.php:1711 +msgctxt "page" +msgid "Featured image" +msgstr "Image mise en avant" + +#: wp-includes/post.php:1711 +msgctxt "post" +msgid "Featured image" +msgstr "Image mise en avant" + +#. translators: 1: $sanitize_callback, 2: register_setting() +#: wp-includes/option.php:2245 +msgid "%1$s is deprecated. The callback from %2$s is used instead." +msgstr "%1$s est obsolète. Le rappel de %2$s est utilisé à la place." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:85 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:107 +msgid "The password for the parent post of the comment (if the post is password protected)." +msgstr "Mot de passe de la publication parente du commentaire (si la publication est protégée par un mot de passe)." + +#: wp-includes/script-loader.php:615 wp-includes/media.php:3915 +msgid "" +"You are about to permanently delete these items from your site.\n" +"This action cannot be undone.\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Vous êtes en train de supprimer définitivement ces éléments de votre site.\n" +"Cette action ne peut pas être annulée.\n" +"« Annuler » pour arrêter, « OK » pour supprimer." + +#: wp-includes/media.php:3914 +msgid "" +"You are about to permanently delete this item from your site.\n" +"This action cannot be undone.\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Vous êtes en train de supprimer définitivement cet élément de votre site.\n" +"Cette action ne peut pas être annulée.\n" +"« Annuler » pour arrêter, « OK » pour supprimer." + +#. translators: 1: Suggested width number, 2: Suggested height number. +#: wp-includes/media-template.php:302 wp-includes/media.php:3966 +msgid "Suggested image dimensions: %1$s by %2$s pixels." +msgstr "Dimensions suggérées de l’image : %1$s par %2$s pixels." + +#: wp-includes/script-loader.php:857 wp-includes/functions.php:2631 +#: wp-includes/js/dist/media-utils.js:1069 wp-admin/includes/file.php:840 +msgid "Sorry, this file type is not permitted for security reasons." +msgstr "Désolé, ce type de fichier n’est pas autorisé pour des raisons de sécurité." + +#: wp-includes/comment.php:3300 +msgid "Sorry, comments are not allowed for this item." +msgstr "Désolé, les commentaires ne sont pas autorisés pour cet élément." + +#: wp-includes/class-wp-oembed-controller.php:146 +msgid "Sorry, you are not allowed to make proxied oEmbed requests." +msgstr "Désolé, vous n’êtes pas autorisé à faire des requêtes oEmbed passant par proxy." + +#: wp-includes/class-wp-oembed-controller.php:95 +msgid "Whether to perform an oEmbed discovery request for non-whitelisted providers." +msgstr "Défini s’il faut ou non effectuer une requête de découverte oEmbed d’autres fournisseurs non-inscrits sur la liste blanche." + +#: wp-includes/class-wp-editor.php:1277 +msgctxt "Short for blue in RGB" +msgid "B" +msgstr "B" + +#: wp-includes/class-wp-editor.php:1276 +msgctxt "Short for green in RGB" +msgid "G" +msgstr "V" + +#: wp-includes/class-wp-editor.php:1275 +msgctxt "Short for red in RGB" +msgid "R" +msgstr "R" + +#: wp-includes/class-wp-oembed-controller.php:75 +msgid "The oEmbed format to use." +msgstr "Le format oEmbed à utiliser." + +#: wp-includes/class-wp-oembed-controller.php:90 +msgid "The maximum height of the embed frame in pixels." +msgstr "La hauteur maximale du contenu embarqué oEmbed en pixels." + +#: wp-includes/class-wp-oembed-controller.php:69 +msgid "The URL of the resource for which to fetch oEmbed data." +msgstr "L’URL de la ressource à parcourir pour obtenir les données oEmbed." + +#: wp-includes/class-wp-oembed-controller.php:84 +msgid "The maximum width of the embed frame in pixels." +msgstr "La largeur maximale du contenu embarqué en pixels." + +#: wp-includes/class-wp-editor.php:1234 +msgid "Insert/edit media" +msgstr "Insérer/modifier un média" + +#: wp-includes/class-wp-editor.php:1228 +msgid "Date/time" +msgstr "Date/heure" + +#. translators: %s: The total number of widget areas registered. +#: wp-includes/class-wp-customize-widgets.php:760 +msgid "Your theme has %s widget area, but this particular page doesn’t display it." +msgid_plural "Your theme has %s widget areas, but this particular page doesn’t display them." +msgstr[0] "Votre thème possède %s zone de widget mais cette page particulière ne l’affiche pas." +msgstr[1] "Votre thème possède %s zones de widget mais cette page particulière ne les affiche pas." + +#: wp-includes/class-wp-customize-widgets.php:784 +msgid "You can navigate to other pages on your site while using the Customizer to view and edit the widgets displayed on those pages." +msgstr "Vous pouvez naviguer sur d’autres pages de votre site pendant que vous utilisez l’outil de personnalisation pour voir et modifier les widgets affichés sur ces pages." + +#: wp-includes/class-wp-editor.php:1231 +msgid "Insert/edit code sample" +msgstr "Insérer/modifier le code d’exemple" + +#: wp-includes/class-wp-editor.php:1230 wp-admin/includes/privacy-tools.php:438 +#: wp-admin/includes/class-wp-privacy-policy-content.php:438 +msgid "Table of Contents" +msgstr "Table des matières" + +#: wp-includes/class-wp-editor.php:1203 +msgid "Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores." +msgstr "l’ID doit commencer par une lettre, suivie uniquement par des lettres, chiffres, tirets, points, virgules ou tirets-bas." + +#: wp-includes/class-wp-editor.php:1204 +msgctxt "Id for link anchor (TinyMCE)" +msgid "Id" +msgstr "ID" + +#: wp-includes/class-wp-customize-widgets.php:751 +msgid "Your theme has 1 widget area, but this particular page doesn’t display it." +msgstr "Votre thème possède 1 zone de widget mais cette page particulière ne l’affiche pas." + +#. translators: %s: The number of other widget areas registered but not +#. rendered. +#: wp-includes/class-wp-customize-widgets.php:736 +msgid "Your theme has %s other widget area, but this particular page doesn’t display it." +msgid_plural "Your theme has %s other widget areas, but this particular page doesn’t display them." +msgstr[0] "Votre thème possède %s autre zone de widget mais cette page particulière ne l’affiche pas." +msgstr[1] "Votre thème possède %s autres zones de widget mais cette page particulière ne les affiche pas." + +#: wp-includes/class-wp-customize-widgets.php:727 +msgid "Your theme has 1 other widget area, but this particular page doesn’t display it." +msgstr "Votre thème possède 1 autre zone de widget mais cette page particulière ne l’affiche pas." + +#: wp-includes/option.php:1959 +msgid "This address is used for admin purposes, like new user notification." +msgstr "Cette adresse est utilisée à des fins d’administration, comme les notifications d’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:102 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:925 +msgid "Unique identifier for the term." +msgstr "Identificateur unique pour le terme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:128 +msgid "Required to be true, as terms do not support trashing." +msgstr "Nécessite la valeur \"true\", car les termes ne supportent pas la suppression forcée. " + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:122 +msgid "Required to be true, as revisions do not support trashing." +msgstr "Nécessite la valeur \"true\", car les révisions ne supportent pas la suppression forcée. " + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:58 +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:341 +msgid "An alphanumeric identifier for the taxonomy." +msgstr "Un identificateur alphanumérique pour la taxonomie." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:280 +msgid "A human-readable description of the post type." +msgstr "Une description du type de publication lisible par l’humain. " + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:298 +msgid "Human-readable labels for the post type for various contexts." +msgstr "Libellés lisibles par un humain pour le type de publication dans divers contextes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:58 +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:310 +msgid "An alphanumeric identifier for the post type." +msgstr "Un identificateur alphanumérique pour le type de publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:286 +msgid "Whether or not the post type should have children." +msgstr "Définir si le type de publication doit avoir des enfants ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:331 +msgid "REST base route for the post type." +msgstr "Route de base REST pour le type de publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:274 +msgid "All capabilities used by the post type." +msgstr "Toutes les permissions utilisées par le type de publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1577 +msgid "Limit response to comments published before a given ISO8601 compliant date." +msgstr "Limiter les réponses aux commentaires publiés avant une date donnée et conforme ISO8601." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1548 +msgid "Limit response to comments published after a given ISO8601 compliant date." +msgstr "Limiter les réponses aux commentaires publiés après une date donnée et conforme ISO8601." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:58 +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:338 +msgid "An alphanumeric identifier for the status." +msgstr "Un identificateur alphanumérique pour l’état." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1460 +msgid "Avatar URLs for the user." +msgstr "URL d’avatar pour l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1413 +msgid "Roles assigned to the user." +msgstr "Rôles assignés à l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1390 +msgid "The nickname for the user." +msgstr "Le surnom de l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1377 +msgid "Author URL of the user." +msgstr "URL auteur pour l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1372 +msgid "Description of the user." +msgstr "Description de l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1366 +msgid "URL of the user." +msgstr "URL de l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1384 +msgid "Locale for the user." +msgstr "Langue de l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1351 +msgid "Last name for the user." +msgstr "Nom de l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1326 +msgid "Login name for the user." +msgstr "Nom de connexion pour l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1343 +msgid "First name for the user." +msgstr "Prénom de l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1335 +msgid "Display name for the user." +msgstr "Nom affiché pour l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:860 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:907 +msgid "The user cannot be deleted." +msgstr "L’utilisateur ne peut pas être supprimé." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:567 +msgid "Error creating new user." +msgstr "Erreur de création de nouvel utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:979 +msgid "The parent term ID." +msgstr "L’ID du terme parent." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:949 +msgid "HTML title for the term." +msgstr "Titre HTML pour le terme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:942 +msgid "URL of the term." +msgstr "URL du terme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:687 +msgid "The term cannot be deleted." +msgstr "Le terme ne peut pas être supprimé." + +#: wp-includes/class-wp-xmlrpc-server.php:2174 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:432 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:569 +msgid "Cannot set parent term, taxonomy is not hierarchical." +msgstr "Impossible de définir un terme parent, la taxonomie n’est pas hiérarchique." + +#: wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php:73 +msgid "Sorry, you are not allowed to view themes." +msgstr "Désolé, vous n’avez pas l’autorisation de voir les thèmes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:324 +msgid "Term does not exist." +msgstr "Le terme n’existe pas." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:335 +msgid "The title for the taxonomy." +msgstr "Le titre pour la taxonomie." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:353 +msgid "Types associated with the taxonomy." +msgstr "Le type associé avec la taxonomie." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:304 +msgid "The title for the post type." +msgstr "Le titre pour le type de publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:148 +msgid "Cannot view post type." +msgstr "Impossible d’afficher le type de publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:154 +msgid "Cannot view status." +msgstr "Impossible d’afficher l’état." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:302 +msgid "The title for the status." +msgstr "Le titre pour l’état." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:144 +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:202 +msgid "Invalid status." +msgstr "État non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:645 +msgid "URL to the original attachment file." +msgstr "URL pour le fichier joint original." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:617 +msgid "Attachment type." +msgstr "Type de fichier joint." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:594 +msgid "The attachment description." +msgstr "La description du fichier joint." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:625 +msgid "The attachment MIME type." +msgstr "Le type MIME du fichier joint." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:571 +msgid "The attachment caption." +msgstr "La légende du fichier joint." + +#: wp-includes/option.php:2036 +msgid "Default post category." +msgstr "Catégorie d’article par défaut." + +#: wp-includes/option.php:1926 +msgid "Site tagline." +msgstr "Slogan du site." + +#. translators: Theme author name. +#: wp-includes/customize/class-wp-customize-theme-control.php:88 +msgctxt "theme author" +msgid "By %s" +msgstr "Par %s" + +#. translators: New user notification email subject. 1: Network title, 2: New +#. user login. +#: wp-includes/ms-functions.php:1119 +msgctxt "New user notification email subject" +msgid "[%1$s] Activate %2$s" +msgstr "[%1$s] Activation de %2$s" + +#. translators: New site notification email subject. 1: Network title, 2: New +#. site URL. +#: wp-includes/ms-functions.php:1009 +msgctxt "New site notification email subject" +msgid "[%1$s] Activate %2$s" +msgstr "[%1$s] Activation de %2$s" + +#: wp-includes/blocks/rss.php:19 wp-includes/widgets.php:1499 +#: wp-includes/widgets.php:1622 +msgid "RSS Error:" +msgstr "Erreur RSS :" + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:578 +msgid "Cannot create a comment with that type." +msgstr "Impossible de créer un commentaire avec ce type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:733 +msgid "Invalid slug." +msgstr "Identifiant non valide." + +#: wp-includes/post.php:4045 +msgid "Invalid page template." +msgstr "Modèle de page non valide." + +#: wp-includes/script-loader.php:1211 wp-includes/rest-api.php:1338 +#: wp-includes/post.php:3739 wp-admin/includes/post.php:183 +msgid "Invalid date." +msgstr "Date non valide." + +#: wp-includes/rest-api/class-wp-rest-server.php:307 +msgid "Invalid JSONP callback function." +msgstr "Fonction de rappel JSONP non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:597 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:853 +msgid "Invalid comment content." +msgstr "Contenu du commentaire non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:717 +#: wp-includes/rest-api.php:1344 wp-includes/user.php:3568 +#: wp-admin/network/site-new.php:96 +msgid "Invalid email address." +msgstr "Adresse de messagerie non valide." + +#: wp-includes/theme.php:1491 +msgid "Video is playing." +msgstr "La vidéo en cours de lecture" + +#: wp-includes/theme.php:1490 +msgid "Video is paused." +msgstr "La vidéo est en pause" + +#: wp-includes/theme.php:2081 +msgctxt "Theme starter content" +msgid "Archives" +msgstr "Archives" + +#: wp-includes/theme.php:2233 +msgctxt "Theme starter content" +msgid "This is an example of a homepage section. Homepage sections can be any page other than the homepage itself, including the page that shows your latest blog posts." +msgstr "C’est un exemple de section de page d’accueil. Les sections de page d’accueil peuvent être n’importe quelle page autre que la page d’accueil elle-même, y compris la page qui affiche vos derniers articles de blog." + +#: wp-includes/theme.php:2225 +msgctxt "Theme starter content" +msgid "News" +msgstr "Actualités" + +#: wp-includes/theme.php:2216 +msgctxt "Theme starter content" +msgid "This is a page with some basic contact information, such as an address and phone number. You might also try a plugin to add a contact form." +msgstr "C’est une page avec des informations de contact de base, comme l’adresse et le numéro de téléphone. Vous pouvez aussi essayer une extension pour ajouter un formulaire de contact." + +#: wp-includes/theme.php:2208 +msgctxt "Theme starter content" +msgid "You might be an artist who would like to introduce yourself and your work here or maybe you’re a business with a mission to describe." +msgstr "Vous pourriez être un artiste et vouloir présenter vos travaux et vous même ou encore être une entreprise avec une mission à promouvoir." + +#: wp-includes/theme.php:2105 +msgctxt "Theme starter content" +msgid "Recent Comments" +msgstr "Commentaires récents" + +#: wp-includes/theme.php:2111 +msgctxt "Theme starter content" +msgid "Recent Posts" +msgstr "Articles récents" + +#: wp-includes/theme.php:2200 +msgctxt "Theme starter content" +msgid "Welcome to your site! This is your homepage, which is what most visitors will see when they come to your site for the first time." +msgstr "Bienvenue sur votre site ! C’est votre page d’accueil que vos visiteurs verront lorsqu’ils arriveront sur votre site la première fois." + +#: wp-includes/theme.php:2087 +msgctxt "Theme starter content" +msgid "Calendar" +msgstr "Calendrier" + +#: wp-includes/theme.php:2099 +msgctxt "Theme starter content" +msgid "Meta" +msgstr "Méta" + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:811 +msgid "Sorry, you are not allowed to change the comment type." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier le type de commentaire." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:196 +msgid "Sorry, you are not allowed to filter users by role." +msgstr "Désolé, vous n’avez pas l’autorisation de filtrer les utilisateurs par rôle." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:212 +msgid "Sorry, you are not allowed to order users by this parameter." +msgstr "Désolé, vous n’avez pas l’autorisation de trier les utilisateurs avec ce paramètre." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1208 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1222 +#: wp-admin/includes/user.php:62 wp-admin/users.php:123 +#: wp-admin/network/site-users.php:150 +msgid "Sorry, you are not allowed to give users that role." +msgstr "Désolé, vous n’avez pas l’autorisation de donner ce rôle aux utilisateurs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:397 +msgid "Sorry, you are not allowed to read this comment." +msgstr "Désolé, vous n’avez pas l’autorisation de lire ce commentaire." + +#: wp-includes/class-wp-xmlrpc-server.php:3679 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:934 +msgid "Sorry, you are not allowed to delete this comment." +msgstr "Désolé, vous vous n’avez pas l’autorisation de supprimer ce commentaire." + +#. translators: %s: Request parameter. +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:479 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:489 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:499 +msgid "Sorry, you are not allowed to edit '%s' for comments." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier « %s » pour les commentaires." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:177 +msgid "Sorry, you are not allowed to view revisions of this post." +msgstr "Désolé, vous n’avez pas l’autorisation de voir les révisions de cette publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:525 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:533 +msgid "Sorry, you are not allowed to create a comment on this post." +msgstr "Désolé, vous n’avez pas l’autorisation de créer un commentaire sur cette publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:507 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:517 +msgid "Sorry, you are not allowed to create this comment without a post." +msgstr "Désolé, vous n’avez pas l’autorisation de créer ce commentaire sans publication existante." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:134 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:405 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:541 +msgid "Sorry, you are not allowed to read the post for this comment." +msgstr "Désolé, vous n’avez pas l’autorisation de lire la publication liée à ce commentaire." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:140 +msgid "Sorry, you are not allowed to read comments without a post." +msgstr "Désolé, vous n’avez pas l’autorisation de lire les commentaires sans publication existante." + +#: wp-includes/theme.php:2190 +msgctxt "Theme starter content" +msgid "YouTube" +msgstr "YouTube" + +#: wp-includes/theme.php:2178 +msgctxt "Theme starter content" +msgid "Pinterest" +msgstr "Pinterest" + +#: wp-includes/theme.php:2174 +msgctxt "Theme starter content" +msgid "LinkedIn" +msgstr "LinkedIn" + +#: wp-includes/theme.php:2166 +msgctxt "Theme starter content" +msgid "GitHub" +msgstr "GitHub" + +#: wp-includes/theme.php:2162 +msgctxt "Theme starter content" +msgid "Foursquare" +msgstr "Foursquare" + +#: wp-includes/theme.php:2072 +msgctxt "Theme starter content" +msgid "About This Site" +msgstr "À propos de ce site" + +#: wp-includes/theme.php:2073 +msgctxt "Theme starter content" +msgid "This may be a good place to introduce yourself and your site or include some credits." +msgstr "C’est peut-être le bon endroit pour vous présenter et votre site ou insérer quelques crédits." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:561 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:732 +msgid "Sorry, you are not allowed to assign the provided terms." +msgstr "Désolé, vous n’avez pas l’autorisation d’attribuer les termes proposés." + +#. translators: %s: Custom field key. +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:222 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:264 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:351 +msgid "Sorry, you are not allowed to edit the %s custom field." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier le champ personnalisé %s." + +#: wp-includes/class-wp-xmlrpc-server.php:1340 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:545 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:724 +msgid "Sorry, you are not allowed to make posts sticky." +msgstr "Désolé, vous n’avez pas l’autorisation d’épingler cette publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:104 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:143 +msgid "Reassign the deleted user's posts and links to this user ID." +msgstr "Réaffectez les publications et les liens de l’utilisateur supprimé à cet ID d’utilisateur." + +#: wp-includes/script-loader.php:1185 +msgid "This theme doesn’t support video headers on this page. Navigate to the front page or another page that supports video headers." +msgstr "Ce thème ne prend pas en charge les en-têtes vidéos dans cette page. Allez à la page d’accueil ou une autre page qui prend en charge les en-têtes vidéos." + +#: wp-includes/customize/class-wp-customize-media-control.php:223 +#: wp-includes/customize/class-wp-customize-media-control.php:228 +msgid "Select video" +msgstr "Sélectionnez une vidéo" + +#: wp-includes/widgets/class-wp-widget-media-video.php:38 +#: wp-includes/customize/class-wp-customize-media-control.php:227 +msgid "No video selected" +msgstr "Aucune vidéo sélectionnée" + +#: wp-includes/customize/class-wp-customize-media-control.php:224 +msgid "Change video" +msgstr "Modifier la vidéo" + +#: wp-includes/customize/class-wp-customize-media-control.php:229 +msgid "Choose video" +msgstr "Choisir une vidéo" + +#: wp-includes/theme.php:2230 +msgctxt "Theme starter content" +msgid "A homepage section" +msgstr "Une section de page d’accueil" + +#: wp-includes/theme.php:2221 +msgctxt "Theme starter content" +msgid "Blog" +msgstr "Blog" + +#: wp-includes/theme.php:2154 +msgctxt "Theme starter content" +msgid "Email" +msgstr "E-mail" + +#: wp-includes/theme.php:2170 +msgctxt "Theme starter content" +msgid "Instagram" +msgstr "Instagram" + +#: wp-includes/theme.php:2213 +msgctxt "Theme starter content" +msgid "Contact" +msgstr "Contact" + +#: wp-includes/theme.php:2124 wp-includes/theme.php:2197 +msgctxt "Theme starter content" +msgid "Home" +msgstr "Accueil" + +#: wp-includes/theme.php:2205 +msgctxt "Theme starter content" +msgid "About" +msgstr "À propos de" + +#: wp-includes/theme.php:2182 +msgctxt "Theme starter content" +msgid "Twitter" +msgstr "Twitter" + +#: wp-includes/theme.php:2158 +msgctxt "Theme starter content" +msgid "Facebook" +msgstr "Facebook" + +#: wp-includes/theme.php:2186 +msgctxt "Theme starter content" +msgid "Yelp" +msgstr "Yelp" + +#: wp-includes/theme.php:2060 +msgctxt "Theme starter content" +msgid "123 Main Street" +msgstr "Avenue des Champs-Élysées" + +#: wp-includes/theme.php:2060 +msgctxt "Theme starter content" +msgid "New York, NY 10001" +msgstr "75008, Paris" + +#: wp-includes/theme.php:2061 +msgctxt "Theme starter content" +msgid "Hours" +msgstr "Heures d’ouverture" + +#: wp-includes/theme.php:2093 +msgctxt "Theme starter content" +msgid "Categories" +msgstr "Catégories" + +#: wp-includes/theme.php:2117 +msgctxt "Theme starter content" +msgid "Search" +msgstr "Rechercher" + +#: wp-includes/theme.php:2062 +msgctxt "Theme starter content" +msgid "Saturday & Sunday: 11:00AM–3:00PM" +msgstr "Les samedi et dimanche : 11h00–15h00" + +#: wp-includes/theme.php:2062 +msgctxt "Theme starter content" +msgid "Monday–Friday: 9:00AM–5:00PM" +msgstr "Du lundi au vendredi : 9h00—17h00" + +#: wp-includes/theme.php:2059 +msgctxt "Theme starter content" +msgid "Address" +msgstr "Adresse" + +#: wp-includes/theme.php:2055 +msgctxt "Theme starter content" +msgid "Find Us" +msgstr "Retrouvez-nous" + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1286 +msgid "Passwords cannot be empty." +msgstr "Le champ texte mot de passe ne peut être vide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:178 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:542 +msgid "Invalid user parameter(s)." +msgstr "Paramètre(s) utilisateur non valide(s)." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1294 +msgid "Passwords cannot contain the \"\\\" character." +msgstr "Les mots de passe ne peuvent pas contenir le caractère « \\ »." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1249 +msgid "Username contains invalid characters." +msgstr "L’identifiant contient des caractères non valides." + +#: wp-includes/script-loader.php:1174 +msgctxt "label for hide controls button without length constraints" +msgid "Show Controls" +msgstr "Afficher les contrôles" + +#: wp-includes/script-loader.php:1173 wp-admin/customize.php:230 +msgctxt "label for hide controls button without length constraints" +msgid "Hide Controls" +msgstr "Masquer les contrôles" + +#: wp-includes/media-template.php:402 +msgid "Document Preview" +msgstr "Aperçu du document" + +#: wp-includes/class-wp-customize-manager.php:5254 +msgid "Header Media" +msgstr "Média de l’en-tête" + +#. translators: %s: Add New Page label. +#. translators: %s: Add New taxonomy label. +#: wp-includes/class-wp-customize-control.php:631 +#: wp-admin/includes/meta-boxes.php:622 +msgid "+ %s" +msgstr "+ %s" + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:362 +msgid "REST base route for the taxonomy." +msgstr "Route de base REST pour la taxonomie." + +#: wp-includes/l10n.php:1509 +msgctxt "default site language" +msgid "Site Default" +msgstr "Site par défaut" + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:603 +msgid "Description for the object, as it exists in the database." +msgstr "Description de l’objet, telle qu’elle existe dans la base de données." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:608 +msgid "HTML description for the object, transformed for display." +msgstr "Description HTML de l’objet, transformé pour l’affichage." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:580 +msgid "Caption for the attachment, as it exists in the database." +msgstr "Légende pour le fichier joint, telle qu’elle existe dans la base de données." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:585 +msgid "HTML caption for the attachment, transformed for display." +msgstr "Légende HTML pour le fichier joint, transformée pour l’affichage." + +#: wp-includes/class-wp-customize-manager.php:6029 +msgid "Please enter a valid YouTube URL." +msgstr "Veuillez saisir une URL YouTube valide." + +#: wp-includes/script-loader.php:617 wp-admin/menu-header.php:260 +msgid "Collapse Main menu" +msgstr "Replier le menu principal" + +#: wp-includes/script-loader.php:618 +msgid "Expand Main menu" +msgstr "Déplier le menu principal" + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:464 +msgid "Revisions do not support trashing. Set '%s' to delete." +msgstr "Les révisions ne peuvent pas être mises à la corbeille. Utilisez le paramètre « %s » pour supprimer." + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:673 +msgid "Terms do not support trashing. Set '%s' to delete." +msgstr "Les termes ne peuvent pas être mis à la corbeille. Utilisez le paramètre « %s » pour supprimer." + +#: wp-includes/class-wp-customize-manager.php:5368 +msgid "Or, enter a YouTube URL:" +msgstr "Ou saisissez une URL YouTube :" + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:987 +msgid "The comment does not support trashing. Set '%s' to delete." +msgstr "Le commentaire ne peut pas être mis à la corbeille. Utilisez le paramètre « %s » pour le supprimer." + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:880 +msgid "Users do not support trashing. Set '%s' to delete." +msgstr "Les utilisateurs ne peuvent pas être mis à la corbeille. Utilisez le paramètre « %s » pour le supprimer." + +#. translators: %s: force=true +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:925 +msgid "The post does not support trashing. Set '%s' to delete." +msgstr "La publication ne peut pas être mise à la corbeille. Utilisez le paramètre « %s » pour la supprimer." + +#: wp-includes/rest-api/class-wp-rest-request.php:673 +msgid "Invalid JSON body passed." +msgstr "Contenu JSON transmis non valide." + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2729 +msgid "Limit result set to all items except those that have the specified term assigned in the %s taxonomy." +msgstr "Limiter le jeu de résultats à tous les éléments sauf ceux qui ont un terme spécifique assigné à la taxonomie %s." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:651 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:866 +msgid "Comment field exceeds maximum length allowed." +msgstr "Le champ de commentaire dépasse la longueur maximum autorisée." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2695 +msgid "Limit result set to posts assigned one or more statuses." +msgstr "Limiter le jeu de résultats aux publications associées à un ou plusieurs états." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php:322 +msgid "Taxonomies associated with post type." +msgstr "Taxonomies associées avec ce type de publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2685 +msgid "Limit result set to posts with one or more specific slugs." +msgstr "Limiter le jeu de résultats aux publications ayant au moins un slug particulier." + +#: wp-includes/class-wp-xmlrpc-server.php:3879 +msgid "Comment is required." +msgstr "Le message du commentaire est requis." + +#: wp-includes/class-wp-customize-nav-menus.php:886 +msgid "Empty title." +msgstr "Titre vide." + +#: wp-trackback.php:130 +msgid "We already have a ping from that URL for this post." +msgstr "Nous avons déjà un ping de cette adresse web pour cette publication." + +#: wp-includes/class-wp-customize-manager.php:5593 +#: wp-admin/includes/file.php:38 +msgid "Homepage" +msgstr "Accueil" + +#: wp-trackback.php:115 +msgid "Sorry, trackbacks are closed for this item." +msgstr "Désolé, mais les rétroliens sont fermés pour ce contenu." + +#: wp-trackback.php:88 +msgid "I really need an ID for this to work." +msgstr "J’ai vraiment besoin d’un identifiant pour que cela fonctionne." + +#: wp-includes/js/dist/components.js:33133 +msgid "Hours" +msgstr "Horaires" + +#: wp-includes/script-loader.php:1301 +msgid "Term added." +msgstr "Terme ajouté." + +#: wp-includes/script-loader.php:1300 +msgid "Term selected." +msgstr "Terme sélectionné." + +#: wp-includes/script-loader.php:1299 +msgid "Remove term:" +msgstr "Retirer un terme :" + +#: wp-includes/script-loader.php:1302 +msgid "Term removed." +msgstr "Terme retiré." + +#. translators: 1: Parameter, 2: Minimum number, 3: Maximum number. +#: wp-includes/rest-api.php:1392 +msgid "%1$s must be between %2$d (inclusive) and %3$d (inclusive)" +msgstr "%1$s doit être compris entre %2$d (inclus) et %3$d (inclus)" + +#. translators: 1: Parameter, 2: Minimum number, 3: Maximum number. +#: wp-includes/rest-api.php:1382 +msgid "%1$s must be between %2$d (inclusive) and %3$d (exclusive)" +msgstr "%1$s doit être compris entre %2$d (inclus) et %3$d (exclu)" + +#. translators: 1: Parameter, 2: Minimum number, 3: Maximum number. +#: wp-includes/rest-api.php:1387 +msgid "%1$s must be between %2$d (exclusive) and %3$d (inclusive)" +msgstr "%1$s doit être compris entre %2$d (exclu) et %3$d (inclus)" + +#. translators: 1: Parameter, 2: Minimum number, 3: Maximum number. +#: wp-includes/rest-api.php:1377 +msgid "%1$s must be between %2$d (exclusive) and %3$d (exclusive)" +msgstr "%1$s doit être compris entre %2$d (exclu) et %3$d (exclu)" + +#: wp-includes/script-loader.php:807 +msgid "Item selected." +msgstr "Élément sélectionné." + +#. translators: %s: IP address. +#: wp-includes/rest-api.php:1350 +msgid "%s is not a valid IP address." +msgstr "%s n’est pas une adresse IP valide." + +#. translators: 1: Parameter, 2: List of types. +#. translators: 1: Parameter, 2: Type name. +#: wp-includes/rest-api.php:1237 wp-includes/rest-api.php:1247 +#: wp-includes/rest-api.php:1273 wp-includes/rest-api.php:1301 +#: wp-includes/rest-api.php:1316 wp-includes/rest-api.php:1321 +#: wp-includes/rest-api.php:1326 wp-includes/rest-api.php:1331 +msgid "%1$s is not of type %2$s." +msgstr "Le paramètre %1$s n’est pas de type %2$s." + +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:475 +msgid "Meta fields." +msgstr "Champs métas." + +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:233 +msgid "Could not delete meta value from database." +msgstr "La suppression de la valeur de la méta en base de données n’est pas possible." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1542 +msgid "Limit result set to users matching at least one specific role provided. Accepts csv list or single role." +msgstr "Limiter le résultat aux utilisateurs correspondants à au moins un rôle spécifique fourni. Accepte les listes de type CSV ou les rôles uniques." + +#. translators: 1: Parameter, 2: List of valid values. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1363 +#: wp-includes/rest-api.php:1310 +msgid "%1$s is not one of %2$s." +msgstr "Le paramètre %1$s devrait avoir l’une de ces valeurs : %2$s." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1436 +msgid "Any extra capabilities assigned to the user." +msgstr "Les permissions supplémentaires affectées à l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1421 +msgid "Password for the user (never included)." +msgstr "Mot de passe pour l’utilisateur (jamais inclus)." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1359 +msgid "The email address for the user." +msgstr "L’adresse e-mail pour l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1406 +msgid "Registration date for the user." +msgstr "Date d’inscription de l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1430 +msgid "All capabilities assigned to the user." +msgstr "Toutes les permissions affectées à l’utilisateur." + +#. translators: %s: Role key. +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1190 +msgid "The role %s does not exist." +msgstr "Le rôle %s n’existe pas." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:889 +msgid "Invalid user ID for reassignment." +msgstr "ID utilisateur non valide pour réaffectation" + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:839 +msgid "Sorry, you are not allowed to delete this user." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer cet utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:725 +msgid "Username isn't editable." +msgstr "L’identifiant n’est pas modifiable." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:519 +msgid "Cannot create existing user." +msgstr "Impossible de créer un utilisateur existant." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:663 +msgid "Sorry, you are not allowed to edit roles of this user." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier le rôle de cet utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:474 +msgid "You are not currently logged in." +msgstr "Vous n’êtes actuellement pas connecté." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:435 +msgid "Sorry, you are not allowed to delete this revision." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier cette révision." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:966 +msgid "Type attribution for the term." +msgstr "Type attribué pour le terme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1064 +msgid "Limit result set to terms assigned to a specific parent." +msgstr "Résultats limités aux termes ayant un parent spécifique." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1041 +msgid "Sort collection by term attribute." +msgstr "Trier la collection par attributs de terme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:958 +msgid "An alphanumeric identifier for the term unique to its type." +msgstr "Un identificateur alphanumérique pour le terme, propre au type de la ressource." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1070 +msgid "Limit result set to terms assigned to a specific post." +msgstr "Limiter le résultat aux termes assignés à une publication spécifique." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1057 +msgid "Whether to hide terms not assigned to any posts." +msgstr "Pour masquer des termes non affectées à des publications ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:937 +msgid "HTML description of the term." +msgstr "Description HTML du terme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:931 +msgid "Number of published posts for the term." +msgstr "Nombre de publications publiées pour le terme." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:74 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1320 +msgid "Unique identifier for the user." +msgstr "Identificateur unique pour l’utilisateur." + +#. translators: %s: Custom field key. +#. translators: %s: Property name. +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:159 +#: wp-includes/rest-api/fields/class-wp-rest-meta-fields.php:178 +#: wp-includes/rest-api/endpoints/class-wp-rest-settings-controller.php:197 +msgid "The %s property has an invalid stored value, and cannot be updated to null." +msgstr "La propriété %s a une valeur stockée non valide, et ne peut pas être enregistrée comme nulle." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:196 +msgid "Invalid revision ID." +msgstr "ID de révision non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:100 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:139 +msgid "Required to be true, as users do not support trashing." +msgstr "Nécessite la valeur \"true\", car l’utilisateur ne supporte pas la suppression forcée." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:347 +msgid "Whether or not the term cloud should be displayed." +msgstr "Définit si le nuage de termes doit être affiché ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2796 +#: wp-includes/class-wp-customize-nav-menus.php:889 +msgid "Status is forbidden." +msgstr "L’état est interdit." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2740 +msgid "Limit result set to items that are sticky." +msgstr "Limiter les résultats aux éléments qui sont épinglés." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:419 +msgid "Limit results to taxonomies associated with a specific post type." +msgstr "Limiter les résultats aux taxonomies associées un type de publication spécifique." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2581 +msgid "Limit result set to posts assigned to specific authors." +msgstr "Limiter les résultats aux publications assignées à des auteurs spécifiques." + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2394 +msgid "The terms assigned to the object in the %s taxonomy." +msgstr "Les termes assignés à l’objet dans la taxonomie %s." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1601 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:789 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2630 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1506 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1025 +msgid "Offset the result set by a specific number of items." +msgstr "Ignorer un nombre spécifique d’éléments au sein du jeu de résultats." + +#. translators: %s: Taxonomy name. +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2719 +msgid "Limit result set to all items that have the specified term assigned in the %s taxonomy." +msgstr "Limiter le jeu de résultats aux éléments qui ont le terme spécifié assigné dans la taxonomie %s." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2675 +msgid "Limit result set to all items except those of a particular parent ID." +msgstr "Limiter le jeu de résultats à tous les résultats, exceptés ceux dont le parent porte un ID spécifique." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2667 +msgid "Limit result set to items with particular parent IDs." +msgstr "Limiter le jeu de résultats aux éléments ayant un ID parent particulier." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2624 +msgid "Limit result set to posts with a specific menu_order value." +msgstr "Limiter le jeu de résultats aux publications ayant une valeur menu_order spécifique." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2589 +msgid "Ensure result set excludes posts assigned to specific authors." +msgstr "S’assurer que le jeu de résultats exclut les publications assignées à des auteurs spécifiques." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2364 +msgid "The theme file to use to display the object." +msgstr "Le fichier de thème à utiliser pour afficher l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2120 +msgid "A password to protect access to the content and excerpt." +msgstr "Un mot de passe pour protéger l’accès au contenu et à l’extrait." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2296 +msgid "Whether the excerpt is protected with a password." +msgstr "Définit si l’extrait est protégé par un mot de passe ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2307 +msgid "The ID of the featured media for the object." +msgstr "L’ID du média mis en avant pour l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2315 +msgid "Whether or not comments are open on the object." +msgstr "Définit si les commentaires sont ouverts ou non pour cet objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2330 +msgid "The order of the object in relation to other object of its type." +msgstr "L’ordre de l’objet en relation à d’autres objets du même type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2357 +msgid "Whether or not the object should be treated as sticky." +msgstr "Définit si l’objet doit être traité en tant que contenu épinglé ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2341 +msgid "The format for the object." +msgstr "Le format pour l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2321 +msgid "Whether or not the object can be pinged." +msgstr "Définit si l’objet peut recevoir un ping ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2290 +msgid "HTML excerpt for the object, transformed for display." +msgstr "Extrait HTML pour l’objet, mis en forme pour l’affichage." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2285 +msgid "Excerpt for the object, as it exists in the database." +msgstr "L’extrait pour l’objet, tel qu’il existe dans la base de données." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2276 +msgid "The excerpt for the object." +msgstr "L’extrait pour l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2215 +msgid "Title for the object, as it exists in the database." +msgstr "Le titre pour l’objet, tel qu’il existe dans la base de données. " + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2206 +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:253 +msgid "The title for the object." +msgstr "Le titre pour l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2114 +msgid "Type of Post for the object." +msgstr "Le type de publication de l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2220 +msgid "HTML title for the object, transformed for display." +msgstr "Le titre HTML pour l’objet, mis en forme pour l’affichage." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2257 +msgid "Whether the content is protected with a password." +msgstr "Définit si le contenu est protégé par mot de passe ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:726 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2100 +msgid "An alphanumeric identifier for the object unique to its type." +msgstr "Un identificateur alphanumérique pour l’objet unique de son type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:682 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2268 +msgid "The ID for the author of the object." +msgstr "L’ID pour l’auteur de l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2108 +msgid "A named status for the object." +msgstr "Un état nommé pour l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:709 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2086 +msgid "The date the object was last modified, in the site's timezone." +msgstr "La date de dernière modification de l’objet, dans le fuseau horaire du site." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2053 +msgid "The globally unique identifier for the object." +msgstr "L’identifiant unique global pour cet objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1463 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:693 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2047 +msgid "The date the object was published, as GMT." +msgstr "La date à laquelle l’objet a été publié, au format GMT." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1457 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:687 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2041 +msgid "The date the object was published, in the site's timezone." +msgstr "La date à laquelle l’objet a été publié, dans le fuseau horaire du site." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:715 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2093 +msgid "The date the object was last modified, as GMT." +msgstr "La dernière date GMT à laquelle l’objet a été modifié." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:699 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2059 +msgid "GUID for the object, as it exists in the database." +msgstr "GUID pour cet objet, tel qu’il existe dans la base de données." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2065 +msgid "GUID for the object, transformed for display." +msgstr "GUID pour l’objet, transformé pour l’affichage." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1317 +msgid "Invalid featured media ID." +msgstr "ID du média mis en avant non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:143 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1210 +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:261 +msgid "Invalid post parent ID." +msgstr "ID de la publication parente non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1194 +msgid "A password protected post can not be set to sticky." +msgstr "Une publication protégée par mot de passe ne peut pas être épinglée." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1183 +msgid "A sticky post can not be password protected." +msgstr "Une publication épinglée ne peut pas être protégée par un mot de passe." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:150 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:387 +#: wp-admin/edit-comments.php:14 +msgid "Sorry, you are not allowed to edit comments." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier des commentaires." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:499 +msgid "Sorry, you are not allowed to create new users." +msgstr "Désolé, vous n’avez pas l’autorisation de créer de nouveaux utilisateurs." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:1175 +msgid "A post can not be sticky and have a password." +msgstr "Une publication ne peut pas être épinglée et être protégée par un mot de passe." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:934 +msgid "The post has already been deleted." +msgstr "Cette publication a déjà été supprimée." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:527 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:581 +msgid "Cannot create existing post." +msgstr "Impossible de créer une publication existant déjà." + +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:230 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:165 +msgid "You need to define a search term to order by relevance." +msgstr "Vous devez définir un terme à rechercher pour ordonner par pertinence." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:441 +msgid "Incorrect post password." +msgstr "Mot de passe de la publication incorrect." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1674 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:85 +msgid "The password for the post if it is password protected." +msgstr "Le mot de passe pour cette publication, si celle-ci est protégée par un mot de passe." + +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1398 +msgid "An alphanumeric identifier for the user." +msgstr "Un identificateur alphanumérique pour l’utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:329 +msgid "Human-readable labels for the taxonomy for various contexts." +msgstr "Libellés lisibles par un humain pour la taxonomie dans divers contextes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:323 +msgid "Whether or not the taxonomy should have children." +msgstr "Définit si la taxonomie doit avoir des enfants ou non." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:317 +msgid "A human-readable description of the taxonomy." +msgstr "Une description de la taxonomie lisible par l’humain." + +#: wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php:311 +msgid "All capabilities used by the taxonomy." +msgstr "Toutes les permissions utilisées par la taxonomie." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:332 +msgid "Whether to include posts in the edit listing for their post type." +msgstr "Détermine s’il faut inclure les articles dans la liste de modifications pour leur type de publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:95 +msgid "Sorry, you are not allowed to manage post statuses." +msgstr "Désolé, vous n’avez pas l’autorisation de gérer l’état de la publication." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:326 +msgid "Whether posts with this status should be publicly-queryable." +msgstr "Définir si les publications avec cet état devraient être requétables publiquement." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:320 +msgid "Whether posts of this status should be shown in the front end of the site." +msgstr "Détermine si les publications avec cet état devraient être affichées sur l’interface publique du site." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:314 +msgid "Whether posts with this status should be protected." +msgstr "Détermine si les publications ayant cet état doivent être protégées." + +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:386 +msgid "Limit results to those matching a string." +msgstr "Limiter les résultats à ceux qui correspondent à une chaîne de caractères." + +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:369 +msgid "Current page of the collection." +msgstr "Page courante dans la collection." + +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:377 +msgid "Maximum number of items to be returned in result set." +msgstr "Nombre maximal d’éléments à renvoyer dans le groupe de résultats." + +#. translators: %s: Method name. +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:69 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:86 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:103 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:120 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:137 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:154 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:171 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:188 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:205 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:222 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:239 +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:257 +msgid "Method '%s' not implemented. Must be overridden in subclass." +msgstr "La méthode « %s » n’est pas implémentée. Cela devrait être surchargé en sous-classe." + +#: wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php:308 +msgid "Whether posts with this status should be private." +msgstr "Détermine si les publications avec cet état devraient être privées." + +#: wp-includes/rest-api/endpoints/class-wp-rest-controller.php:406 +msgid "Scope under which the request is made; determines fields present in response." +msgstr "Le contexte dans lequel la demande est faite ; cela détermine les champs renvoyés." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1616 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:801 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2642 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1519 +msgid "Sort collection by object attribute." +msgstr "Trier la collection par attribut d’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1606 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:794 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2635 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1512 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1031 +msgid "Order sort attribute ascending or descending." +msgstr "Le paramètre order trie les attributs dans l’ordre croissant ou décroissant." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1667 +msgid "Limit result set to comments assigned a specific type. Requires authorization." +msgstr "Limite le jeu de résultats aux commentaires assignés à un type spécifique. Nécessite des droits spécifiques." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1659 +msgid "Limit result set to comments assigned a specific status. Requires authorization." +msgstr "Limiter le jeu de résultats aux commentaires assignés à un état spécifique. Nécessite les droits correspondants." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1632 +msgid "Limit result set to comments of specific parent IDs." +msgstr "Limiter le jeu de résultats aux commentaires ayant un ID parent spécifique." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1641 +msgid "Ensure result set excludes specific parent IDs." +msgstr "S’assure que le jeu de résultats exclut des ID parents spécifiques." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1650 +msgid "Limit result set to comments assigned to specific post IDs." +msgstr "Limite le jeu de résultats aux commentaires assignés à des ID de publications spécifiques." + +#. translators: %d: Avatar image size in pixels. +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1512 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1452 +msgid "Avatar URL with image size of %d pixels." +msgstr "URL d’avatar avec une taille d’image de %d pixels." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1496 +msgid "Type of Comment for the object." +msgstr "Type de commentaire pour l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1520 +msgid "Avatar URLs for the object author." +msgstr "URLs d’avatar pour l’objet author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1571 +msgid "Limit result set to that from a specific author email. Requires authorization." +msgstr "Limiter le jeu de résultats à une adresse email d’auteur spécifique. Nécessite les droits correspondants." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1592 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:780 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2614 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1497 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1015 +msgid "Limit result set to specific IDs." +msgstr "Limiter le groupe de résultats aux ID spécifiés." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1562 +msgid "Ensure result set excludes comments assigned to specific user IDs. Requires authorization." +msgstr "S’assurer que le jeu de résultats exclut les commentaires assignés aux ID utilisateurs spécifiés. Nécessite des droits spécifiques." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1554 +msgid "Limit result set to comments assigned to specific user IDs. Requires authorization." +msgstr "Limiter le jeu de résultats aux commentaires assignés aux ID utilisateurs spécifiés. Nécessite des droits spécifiques." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1583 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:771 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2605 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1488 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:1006 +msgid "Ensure result set excludes specific IDs." +msgstr "S’assure que le jeu de résultats exclut des ID spécifiques." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2599 +msgid "Limit response to posts published before a given ISO8601 compliant date." +msgstr "Limiter la réponse aux publications mises en ligne avant une date définie et conforme à la norme ISO8601." + +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2574 +msgid "Limit response to posts published after a given ISO8601 compliant date." +msgstr "Limiter la réponse aux publications mises en ligne après une date définie et conforme à la norme ISO8601." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1449 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2245 +msgid "HTML content for the object, transformed for display." +msgstr "Contenu HTML pour l’objet, transformé pour l’affichage." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1435 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2231 +msgid "The content for the object." +msgstr "Le contenu pour cet objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1469 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2079 +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:259 +msgid "URL to the object." +msgstr "URL de l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1444 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2240 +msgid "Content for the object, as it exists in the database." +msgstr "Contenu pour cet objet, tel qu’il existe dans la base de données." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1488 +msgid "State of the object." +msgstr "État de l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1476 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:78 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:98 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:721 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2146 +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:89 +#: wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php:115 +msgid "The ID for the parent of the object." +msgstr "L’ID du parent de l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1482 +msgid "The ID of the associated post object." +msgstr "L’ID de l’objet publication associé." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1008 +msgid "The comment cannot be deleted." +msgstr "Le commentaire ne peut pas être supprimé." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:74 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1386 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:102 +#: wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php:704 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:95 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:2073 +#: wp-includes/rest-api/endpoints/class-wp-rest-search-controller.php:247 +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:37 +msgid "Unique identifier for the object." +msgstr "Identifiant unique de l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1407 +msgid "IP address for the object author." +msgstr "Adresse IP de l’auteur de l’objet." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:995 +msgid "The comment has already been trashed." +msgstr "Le commentaire a déjà été placé dans la corbeille." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1421 +msgid "URL for the object author." +msgstr "URL pour l’objet auteur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1397 +msgid "Email address for the object author." +msgstr "Adresse de messagerie pour l’objet auteur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1392 +msgid "The ID of the user object, if author was a user." +msgstr "L’ID de l’objet user, si l’auteur était un utilisateur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1309 +msgid "Invalid comment author ID." +msgstr "ID de l’auteur du commentaire non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1427 +msgid "User agent for the object author." +msgstr "Agent utilisateur pour l’objet author." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:1413 +msgid "Display name for the object author." +msgstr "Nom affiché pour l’objet auteur." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:876 +msgid "Updating comment failed." +msgstr "La mise à jour du commentaire a échoué." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:841 +msgid "Updating comment status failed." +msgstr "La mise à jour de l’état du commentaire a échoué." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:569 +msgid "Cannot create existing comment." +msgstr "Impossible de créer un commentaire qui existe déjà." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:704 +msgid "Creating comment failed." +msgstr "La création du commentaire a échoué." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:627 +msgid "Creating a comment requires valid author name and email values." +msgstr "La création d’un commentaire nécessite une valeur valide pour le nom d’auteur et l’e-mail." + +#: wp-includes/class-wp-xmlrpc-server.php:3852 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:446 +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:468 +#: wp-includes/comment.php:3352 +msgid "Sorry, you must be logged in to comment." +msgstr "Désolé, vous devez être connecter pour commenter." + +#. translators: %s: List of forbidden parameters. +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:177 +msgid "Query parameter not permitted: %s" +msgstr "Paramètre de requête non autorisé : %s" + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:871 +msgid "Limit result set to attachments of a particular MIME type." +msgstr "Limiter le groupe de résultats à un type MIME particulier." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:864 +msgid "Limit result set to attachments of a particular media type." +msgstr "Limiter le groupe de résultats aux médias attachés d’un type particulier." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:680 +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:891 +msgid "No data supplied." +msgstr "Aucune donnée fournie." + +#: wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php:104 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:119 +msgid "Whether to bypass Trash and force deletion." +msgstr "Que ce soit pour éviter la corbeille ou forcer la suppression." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:719 +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:905 +msgid "Content hash did not match expected." +msgstr "Le hachage de contenu ne correspondait pas aux attentes." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:688 +msgid "No Content-Type supplied." +msgstr "Aucune valeur fournie pour Content-Type." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:696 +msgid "No Content-Disposition supplied." +msgstr "Aucune valeur fournie pour Content-Disposition." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:739 +msgid "Could not open file handle." +msgstr "Impossible d’ouvrir la manipulation de fichier." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:706 +msgid "Invalid Content-Disposition supplied. Content-Disposition needs to be formatted as `attachment; filename=\"image.png\"` or similar." +msgstr "Valeur Content-Disposition fournie non valide. Content-Disposition a besoin d’être formaté comme `attachment; filename=\"image.png\"` ou équivalent." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:639 +msgid "The ID for the associated post of the attachment." +msgstr "L’ID pour la publication associée au fichier." + +#: wp-includes/post.php:1708 wp-admin/edit-form-advanced.php:413 +msgid "Page Attributes" +msgstr "Attributs de page" + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:140 +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:312 +msgid "Invalid parent type." +msgstr "Type de parent non valide." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:562 +msgid "Alternative text to display when attachment is not displayed." +msgstr "Texte alternatif proposé si le fichier ne peut pas être affiché." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:632 +msgid "Details about the media file, specific to its type." +msgstr "Détails sur le fichier média, propre à son format." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:106 +msgid "Sorry, you are not allowed to upload media on this site." +msgstr "Désolé, vous n’avez pas l’autorisation de téléverser des médias sur ce site." + +#: wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php:119 +msgid "Sorry, you are not allowed to upload media to this post." +msgstr "Désolé, vous n’avez pas l’autorisation de téléverser des médias pour cette publication." + +#. translators: %s: rest_authentication_errors +#: wp-includes/rest-api/class-wp-rest-server.php:283 +msgid "The REST API can no longer be completely disabled, the %s filter can be used to restrict access to the API, instead." +msgstr "L’API REST ne peut plus rester complètement désactivée. Au lieu de cela, le filtre %s peut être utilisé pour restreindre l’accès à l’API." + +#: wp-includes/post.php:1701 +msgid "View Posts" +msgstr "Voir les articles" + +#: wp-includes/post.php:1701 +msgid "View Pages" +msgstr "Voir les pages" + +#: wp-includes/post.php:185 +msgid "Edit Changeset" +msgstr "Modifier le jeu de modifications." + +#: wp-includes/post.php:189 +msgid "No changesets found." +msgstr "Aucun jeu de modifications trouvé." + +#: wp-includes/post.php:190 +msgid "No changesets found in Trash." +msgstr "Aucun jeu de modifications trouvé dans la corbeille." + +#: wp-includes/post.php:184 +msgid "New Changeset" +msgstr "Nouveau jeu de modifications" + +#: wp-includes/post.php:183 +msgid "Add New Changeset" +msgstr "Ajouter un nouveau jeu de modifications" + +#: wp-includes/post.php:187 +msgid "All Changesets" +msgstr "Tous les jeux de modifications" + +#: wp-includes/post.php:186 +msgid "View Changeset" +msgstr "Voir le jeu de modifications" + +#: wp-includes/post.php:1708 +msgid "Post Attributes" +msgstr "Attributs d’articles" + +#: wp-includes/post.php:188 +msgid "Search Changesets" +msgstr "Rechercher des jeux de modifications" + +#: wp-includes/post.php:146 wp-includes/post.php:147 +msgid "Custom CSS" +msgstr "CSS personnalisé" + +#: wp-includes/post.php:182 +msgctxt "Customize Changeset" +msgid "Add New" +msgstr "Ajouter" + +#: wp-includes/post.php:79 +msgid "Attachment Attributes" +msgstr "Attributs du fichier joint" + +#: wp-includes/post.php:178 +msgctxt "post type general name" +msgid "Changesets" +msgstr "Jeux de modifications" + +#: wp-includes/post.php:181 +msgctxt "add new on admin bar" +msgid "Changeset" +msgstr "Jeu de modifications" + +#: wp-includes/post.php:180 +msgctxt "admin menu" +msgid "Changesets" +msgstr "Jeux de modifications" + +#: wp-includes/post.php:179 +msgctxt "post type singular name" +msgid "Changeset" +msgstr "Jeu de modifications" + +#. translators: Post revision title. 1: Author avatar, 2: Author name, 3: Time +#. ago, 4: Date. +#: wp-includes/post-template.php:1873 +msgid "%1$s %2$s, %3$s ago (%4$s)" +msgstr "%1$s %2$s, il y a %3$s (%4$s)" + +#. translators: %s: misc +#. translators: %s: privacy +#: wp-includes/option.php:2162 wp-includes/option.php:2175 +#: wp-includes/option.php:2215 wp-includes/option.php:2228 +#: wp-admin/includes/template.php:1518 wp-admin/includes/template.php:1531 +#: wp-admin/includes/template.php:1589 wp-admin/includes/template.php:1602 +msgid "The \"%s\" options group has been removed. Use another settings group." +msgstr "Le groupe d’options « %s » a été supprimé. Utiliser un autre groupe de réglages." + +#: wp-includes/option.php:2014 +msgid "WordPress locale code." +msgstr "Code local de l’installation WordPress." + +#: wp-includes/option.php:2071 +msgid "Allow link notifications from other blogs (pingbacks and trackbacks) on new articles." +msgstr "Autoriser les liens de notification d’autres blogs (pings et rétroliens) sur les nouveaux articles." + +#: wp-includes/option.php:2046 +msgid "Default post format." +msgstr "Format d’article par défaut." + +#: wp-includes/option.php:1992 +msgid "A time format for all time strings." +msgstr "Un format d’heure commun pour tous les réglages d’heures." + +#: wp-includes/option.php:1982 +msgid "A date format for all date strings." +msgstr "Un format de date commun pour tous les réglages de dates." + +#: wp-includes/option.php:2025 +msgid "Convert emoticons like :-) and :-P to graphics on display." +msgstr "Convertir les émoticônes, comme :-) et :-P, en images lors de l’affichage." + +#: wp-includes/option.php:2056 +msgid "Blog pages show at most." +msgstr "Les pages de blog affichent au maximum." + +#: wp-includes/option.php:2002 +msgid "A day number of the week that the week should start on." +msgstr "Le numéro du jour de la semaine à laquelle la semaine devrait commencer." + +#: wp-includes/option.php:1972 +msgid "A city in the same timezone as you." +msgstr "Une ville dans le même fuseau horaire que le vôtre." + +#: wp-includes/link-template.php:2723 +msgctxt "previous set of posts" +msgid "Previous" +msgstr "Précédent" + +#: wp-includes/link-template.php:2724 +msgctxt "next set of posts" +msgid "Next" +msgstr "Suivant" + +#: wp-includes/option.php:1914 +msgid "Site title." +msgstr "Titre du site." + +#: wp-includes/media.php:3926 +msgid "Search media items..." +msgstr "Rechercher des médias…" + +#: wp-login.php:855 wp-login.php:1366 wp-includes/general-template.php:463 +msgid "Username or Email Address" +msgstr "Identifiant ou adresse e-mail" + +#. translators: %s: "Search WordPress.org themes" button text. +#: wp-includes/customize/class-wp-customize-themes-section.php:102 +msgid "No themes found. Try a different search, or %s." +msgstr "Aucun thème trouvé. Essayez une autre recherche ou %s." + +#: wp-includes/customize/class-wp-customize-themes-section.php:133 +msgid "Filter themes" +msgstr "Filtrer les thèmes" + +#. translators: %s: Themes panel title in the Customizer. +#: wp-includes/customize/class-wp-customize-themes-panel.php:76 +msgid "You are browsing %s" +msgstr "Vous parcourez %s" + +#: wp-includes/customize/class-wp-customize-themes-panel.php:49 +msgid "Change theme" +msgstr "Changer le thème" + +#: wp-includes/customize/class-wp-customize-theme-control.php:102 +msgid "Update now" +msgstr "Mettre à jour maintenant" + +#. translators: %s: "Update now" button. +#: wp-includes/customize/class-wp-customize-theme-control.php:101 +msgid "New version available. %s" +msgstr "Nouvelle version disponible. %s" + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:67 +msgid "Install and preview theme: %s" +msgstr "Installer et prévisualiser le thème : %s" + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:65 +msgid "Live preview theme: %s" +msgstr "Prévisualiser en direct le thème : %s" + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:63 +msgid "Customize theme: %s" +msgstr "Personnaliser le thème : %s" + +#. translators: %s: Theme name. +#: wp-includes/customize/class-wp-customize-theme-control.php:61 +msgid "Details for theme: %s" +msgstr "Détails du thème : %s" + +#: wp-includes/customize/class-wp-customize-selective-refresh.php:196 +msgid "Click to edit this element." +msgstr "Cliquez pour modifier cet élément." + +#: wp-includes/customize/class-wp-customize-selective-refresh.php:195 +msgid "Click to edit the site title." +msgstr "Cliquez pour modifier le titre du site." + +#: wp-includes/customize/class-wp-customize-selective-refresh.php:194 +msgid "Click to edit this widget." +msgstr "Cliquez pour modifier ce widget." + +#: wp-includes/customize/class-wp-customize-selective-refresh.php:193 +msgid "Click to edit this menu." +msgstr "Cliquez pour modifier ce menu." + +#: wp-includes/customize/class-wp-customize-custom-css-setting.php:161 +msgid "Markup is not allowed in CSS." +msgstr "Le balisage n’est pas autorisé dans le CSS." + +#: wp-includes/class-wp-xmlrpc-server.php:2088 +msgid "Sorry, the term could not be created." +msgstr "Désolé, votre terme ne peut pas être créé." + +#: wp-includes/class-wp-xmlrpc-server.php:3797 +msgid "Sorry, the comment could not be updated." +msgstr "Désolé, le commentaire ne peut pas être modifié." + +#: wp-includes/class-wp-xmlrpc-server.php:2161 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:362 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:543 +msgid "Sorry, you are not allowed to edit this term." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier ce terme." + +#: wp-includes/class-wp-xmlrpc-server.php:2271 +#: wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:644 +msgid "Sorry, you are not allowed to delete this term." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer ce terme." + +#: wp-includes/class-wp-xmlrpc-server.php:2731 +msgid "Invalid role." +msgstr "Rôle non valide." + +#: wp-includes/class-wp-xmlrpc-server.php:2351 +msgid "Sorry, you are not allowed to assign this term." +msgstr "Désolé, vous n’avez pas l’autorisation d’assigner ce terme." + +#: wp-includes/class-wp-customize-widgets.php:792 +#: wp-includes/class-wp-customize-widgets.php:848 +msgid "No widgets found." +msgstr "Aucun widget trouvé." + +#: wp-includes/class-wp-customize-nav-menus.php:975 +msgid "Post" +msgstr "Article" + +#. translators: 1: Post type name, 2: Error message. +#: wp-includes/class-wp-customize-nav-menus.php:980 +msgid "%1$s could not be created: %2$s" +msgstr "%1$s ne peut pas être créé : %2$s" + +#. translators: %d: The number of widgets found. +#: wp-includes/class-wp-customize-widgets.php:791 +msgid "Number of widgets found: %d" +msgstr "Nombre de widgets trouvés : %d" + +#. translators: 1: .mp4, 2: .mov +#: wp-includes/class-wp-customize-manager.php:6004 +msgid "Only %1$s or %2$s files may be used for header video. Please convert your video file and try again, or, upload your video to YouTube and link it with the option below." +msgstr "Seuls des fichiers %1$s ou %2$s peuvent être utilisés pour la vidéo d’en-tête. Veuillez convertir votre fichier vidéo et réessayer, ou téléversez votre vidéo sur YouTube et liez-là avec l’option ci-dessous." + +#: wp-includes/class-wp-customize-manager.php:5996 +msgid "This video file is too large to use as a header video. Try a shorter video or optimize the compression settings and re-upload a file that is less than 8MB. Or, upload your video to YouTube and link it with the option below." +msgstr "Ce fichier vidéo est trop lourd pour être utilisé en tant que vidéo d’en-tête. Essayez avec une vidéo plus courte ou optimisez les réglages de compression et renvoyez un fichier de moins de 8 Mo. Sinon, placez votre vidéo sur YouTube et liez la via l’option ci-dessous." + +#: wp-includes/class-wp-customize-manager.php:5955 +msgid "Unrecognized background setting." +msgstr "Réglage d’arrière-plan non reconnu." + +#: wp-includes/class-wp-customize-manager.php:5660 +msgid "Additional CSS" +msgstr "CSS additionnel" + +#: wp-includes/class-wp-customize-manager.php:5938 +msgid "Invalid value for background position X." +msgstr "Valeur non valide pour la position X de l’arrière-plan." + +#: wp-includes/class-wp-customize-manager.php:5930 +msgid "Invalid value for background repeat." +msgstr "Valeur non valide pour la répétition de l’arrière-plan." + +#: wp-includes/class-wp-customize-manager.php:5934 +msgid "Invalid value for background attachment." +msgstr "Valeur non valide pour le fichier-joint en arrière-plan." + +#: wp-includes/class-wp-customize-manager.php:5946 +#: wp-includes/class-wp-customize-manager.php:5950 +msgid "Invalid value for background size." +msgstr "Valeur non valide pour la taille de l’arrière-plan." + +#: wp-includes/class-wp-customize-manager.php:5942 +msgid "Invalid value for background position Y." +msgstr "Valeur non valide pour la position Y de l’arrière-plan." + +#: wp-includes/class-wp-customize-manager.php:5624 +msgid "Learn more about CSS" +msgstr "En savoir plus sur le CSS (en anglais)" + +#: wp-includes/class-wp-customize-manager.php:5489 +#: wp-includes/js/dist/block-editor.js:19226 +#: wp-admin/includes/class-custom-background.php:427 +#: wp-admin/includes/class-custom-background.php:428 +msgid "Image Size" +msgstr "Taille de l’image" + +#: wp-includes/class-wp-customize-manager.php:5438 +msgctxt "Repeat Image" +msgid "Repeat" +msgstr "Répéter" + +#: wp-includes/class-wp-customize-manager.php:5437 +#: wp-includes/class-wp-customize-manager.php:5494 +#: wp-admin/includes/class-custom-background.php:431 +msgid "Fit to Screen" +msgstr "Adapter à l’écran" + +#: wp-includes/class-wp-customize-manager.php:5439 +msgctxt "Custom Preset" +msgid "Custom" +msgstr "Personnalisé" + +#: wp-includes/customize/class-wp-customize-background-position-control.php:93 +#: wp-includes/class-wp-customize-manager.php:5467 +#: wp-admin/includes/class-custom-background.php:408 +#: wp-admin/includes/class-custom-background.php:409 +msgid "Image Position" +msgstr "Position de l’image" + +#: wp-includes/class-wp-customize-manager.php:5512 +#: wp-admin/includes/class-custom-background.php:441 +msgid "Repeat Background Image" +msgstr "Répéter l’image d’arrière-plan" + +#: wp-includes/class-wp-customize-manager.php:5530 +#: wp-admin/includes/class-custom-background.php:449 +msgid "Scroll with Page" +msgstr "Défile avec la page" + +#: wp-includes/class-wp-customize-manager.php:5435 +msgctxt "Default Preset" +msgid "Default" +msgstr "Par défaut" + +#: wp-includes/class-wp-customize-manager.php:5431 +msgctxt "Background Preset" +msgid "Preset" +msgstr "Pré-réglage" + +#: wp-includes/class-wp-customize-manager.php:5354 +msgid "Header Video" +msgstr "En-tête vidéo" + +#. translators: 1: .mp4, 2: Header height in pixels. +#: wp-includes/class-wp-customize-manager.php:5276 +msgid "Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a height of %2$s pixels." +msgstr "Téléversez votre vidéo au format %1$s et réduisez la taille du fichier pour de meilleurs résultats. Votre thème recommande une hauteur de %2$s pixels." + +#. translators: 1: .mp4, 2: Header width in pixels. +#: wp-includes/class-wp-customize-manager.php:5269 +msgid "Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a width of %2$s pixels." +msgstr "Téléversez votre vidéo au format %1$s et réduisez son poids pour un meilleur affichage. Votre thème recommande une largeur de %2$s pixels." + +#: wp-includes/class-wp-customize-manager.php:5255 +msgid "If you add a video, the image will be used as a fallback while the video loads." +msgstr "Si vous ajoutez une vidéo, l’image sera utilisée comme alternative pendant que la vidéo se charge." + +#. translators: 1: .mp4, 2: Header size in pixels. +#: wp-includes/class-wp-customize-manager.php:5262 +msgid "Upload your video in %1$s format and minimize its file size for best results. Your theme recommends dimensions of %2$s pixels." +msgstr "Téléversez votre vidéo dans le format %1$s et réduisez la taille de son fichier pour de meilleurs résultats. Votre thème recommande des dimensions de %2$s pixels." + +#: wp-includes/customize/class-wp-customize-themes-section.php:127 +#: wp-includes/customize/class-wp-customize-themes-section.php:128 +#: wp-includes/customize/class-wp-customize-themes-section.php:142 +#: wp-includes/customize/class-wp-customize-themes-section.php:143 +msgid "Search themes…" +msgstr "Rechercher des thèmes…" + +#: wp-includes/class-wp-customize-manager.php:2332 +msgid "Setting does not exist or is unrecognized." +msgstr "Le réglage n’existe pas ou n’est pas reconnu." + +#. translators: %d: Number of theme search results, which cannot currently +#. consider singular vs. plural forms. +#: wp-includes/class-wp-customize-manager.php:4867 +msgid "%d themes found" +msgstr "%d thèmes trouvés" + +#. translators: %s: Theme name. +#: wp-includes/class-wp-customize-manager.php:4871 +msgid "Showing details for theme: %s" +msgstr "Affichage des détails pour le thème : %s" + +#. translators: %d: Number of themes being displayed, which cannot currently +#. consider singular vs. plural forms. +#: wp-includes/class-wp-customize-manager.php:4869 +msgid "Displaying %d themes" +msgstr "Affichage des thèmes %d" + +#: wp-includes/class-wp-customize-manager.php:2337 +msgid "Unauthorized to modify setting due to capability." +msgstr "Non autorisé à modifier le réglage en raison de sa capacité." + +#: wp-includes/class-wp-customize-manager.php:4865 +#: wp-admin/network/themes.php:149 +msgid "Are you sure you want to delete this theme?" +msgstr "Confirmez-vous la suppression de ce thème ?" + +#: wp-includes/class-wp-customize-control.php:635 +msgid "New page title" +msgstr "Nouveau titre de la page" + +#: wp-includes/class-wp-customize-manager.php:2122 +msgid "This form is not live-previewable." +msgstr "Ce formulaire n’est pas prévisualisable en direct." + +#: wp-includes/class-wp-customize-manager.php:551 +msgid "Non-existent changeset UUID." +msgstr "UUDI inexistant pour le jeu de modifications." + +#: wp-includes/feed.php:553 wp-admin/link-parse-opml.php:77 +#: wp-admin/link-parse-opml.php:78 +msgid "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." +msgstr "L’extension XML de PHP n’est pas disponible. Veuillez contacter votre hébergeur pour lui demander de l’activer." + +#: wp-includes/class-wp-customize-manager.php:1905 +msgid "Unauthorized. You may remove the customize_messenger_channel param to preview as frontend." +msgstr "Non autorisé. Vous devez retirer le paramètre customize_messenger_channel pour prévisualiser en direct." + +#: wp-includes/class-wp-customize-manager.php:2121 +msgid "This link is not live-previewable." +msgstr "Ce lien ne peut pas être prévisualisé en direct." + +#: wp-includes/class-wp-customize-manager.php:524 +msgid "Invalid changeset UUID" +msgstr "Jeu de modifications UUID non valide." + +#. translators: %s: Current user's display name. +#: wp-includes/admin-bar.php:246 +msgid "Howdy, %s" +msgstr "Bonjour, %s" + +#: wp-includes/class-wp-customize-control.php:636 +msgid "New page title…" +msgstr "Nouveau titre de page…" + +#: wp-includes/customize/class-wp-customize-nav-menu-location-control.php:86 +#: wp-admin/nav-menus.php:723 +msgid "Edit selected menu" +msgstr "Modifier le menu sélectionné" + +#: wp-includes/class-wp-editor.php:1412 +#: wp-includes/js/dist/format-library.js:1305 +msgid "Warning: the link has been inserted but may have errors. Please test it." +msgstr "Attention : le lien a bien été inséré mais peut contenir des erreurs. Veuillez le tester." + +#: wp-includes/script-loader.php:1445 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:102 +#: wp-admin/includes/class-wp-theme-install-list-table.php:61 +#: wp-admin/includes/file.php:32 +msgid "Search Results" +msgstr "Résultats de recherche" + +#: wp-includes/class-wp-editor.php:1365 +msgid "Rich Text Area. Press Control-Option-H for help." +msgstr "Zone de texte enrichi. Appuyez sur Contrôle-Option-H (Ctrl-Alt-H) pour consulter l’aide." + +#: wp-includes/script-loader.php:944 +msgid "Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds." +msgstr "Utilisez les flèches droite/gauche pour avancer d’une seconde, haut/bas pour avancer de dix secondes." + +#: wp-includes/script-loader.php:950 +msgid "Video Player" +msgstr "Lecteur vidéo" + +#: wp-includes/script-loader.php:951 +msgid "Audio Player" +msgstr "Lecteur audio" + +#: wp-includes/script-loader.php:941 wp-includes/theme.php:1489 +msgid "Play" +msgstr "Lecture" + +#: wp-includes/script-loader.php:942 wp-includes/theme.php:1488 +msgid "Pause" +msgstr "Pause" + +#: wp-includes/script-loader.php:946 +msgid "Use Up/Down Arrow keys to increase or decrease volume." +msgstr "Utilisez les flèches haut/bas pour augmenter ou diminuer le volume." + +#: wp-includes/script-loader.php:943 +msgid "Time Slider" +msgstr "Curseur de temps" + +#: wp-includes/script-loader.php:949 +msgid "Volume Slider" +msgstr "Curseur de volume" + +#: wp-includes/class-wp-tax-query.php:645 +msgid "Inexistent terms." +msgstr "Termes inexistants." + +#: wp-includes/taxonomy.php:2140 wp-includes/taxonomy.php:2860 +msgid "A name is required for this term." +msgstr "Un nom est nécessaire pour ce terme. " + +#. translators: %s: Importer name. +#: wp-includes/script-loader.php:1516 wp-admin/import.php:132 +#: wp-admin/import.php:181 +msgid "Run %s" +msgstr "Lancer %s" + +#: wp-includes/script-loader.php:1514 wp-admin/import.php:133 +#: wp-admin/import.php:182 +msgid "Run Importer" +msgstr "Lancer l’importateur" + +#. translators: %s: Activation URL. +#: wp-includes/script-loader.php:1495 +msgid "Importer installed successfully. Run importer" +msgstr "L’importateur a bien été installé. Lancer l’importateur>" + +#. translators: %s: Theme name. +#: wp-includes/script-loader.php:1513 wp-admin/themes.php:359 +#: wp-admin/themes.php:523 wp-admin/themes.php:597 +#: wp-admin/theme-install.php:285 +msgctxt "theme" +msgid "Activate %s" +msgstr "Activation de %s" + +#. translators: %s: Plugin name. +#: wp-includes/script-loader.php:1511 +#: wp-admin/includes/class-wp-plugins-list-table.php:689 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:589 +msgctxt "plugin" +msgid "Network Activate %s" +msgstr "Activation réseau de %s" + +#. translators: %s: Plugin name. +#: wp-includes/script-loader.php:1511 +#: wp-admin/includes/class-wp-plugins-list-table.php:737 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:576 +msgctxt "plugin" +msgid "Activate %s" +msgstr "Activation de %s" + +#. translators: %s: Theme name. +#: wp-includes/script-loader.php:1513 +msgctxt "theme" +msgid "Network Activate %s" +msgstr "Activation réseau de %s" + +#. translators: %s: Theme name and version. +#: wp-includes/script-loader.php:1491 +msgctxt "theme" +msgid "%s installation failed" +msgstr "L’installation de %s a échoué" + +#. translators: %s: Plugin name and version. +#: wp-includes/script-loader.php:1489 +msgctxt "plugin" +msgid "%s installation failed" +msgstr "L’installation pour %s a échoué" + +#. translators: %s: Theme name and version. +#: wp-includes/script-loader.php:1487 +msgctxt "theme" +msgid "%s installed!" +msgstr "%s installé !" + +#. translators: %s: Plugin name and version. +#: wp-includes/script-loader.php:1485 +msgctxt "plugin" +msgid "%s installed!" +msgstr "%s installé !" + +#. translators: %s: Theme name and version. +#: wp-includes/script-loader.php:1483 +msgctxt "theme" +msgid "Installing %s..." +msgstr "Installation de %s…" + +#. translators: %s: Plugin name and version. +#: wp-includes/script-loader.php:1481 +msgctxt "plugin" +msgid "Installing %s..." +msgstr "Installation de %s…" + +#: wp-includes/class-wp-xmlrpc-server.php:4835 +msgid "Sorry, you are not allowed to access user data on this site." +msgstr "Désolé, vous n’avez pas l’autorisation d’accéder aux données utilisateurs de ce site." + +#. translators: %s: Number of plugins. +#: wp-includes/script-loader.php:1521 +msgid "Number of plugins found: %d" +msgstr "Nombre d’extensions trouvées : %d" + +#: wp-includes/class-wp-xmlrpc-server.php:2650 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:680 +#: wp-admin/user-edit.php:93 wp-admin/user-edit.php:125 +#: wp-admin/user-edit.php:181 wp-admin/users.php:106 wp-admin/users.php:132 +msgid "Sorry, you are not allowed to edit this user." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier cet utilisateur." + +#: wp-includes/class-wp-xmlrpc-server.php:2968 +#: wp-includes/class-wp-xmlrpc-server.php:3190 wp-admin/includes/post.php:468 +msgid "Sorry, you are not allowed to edit pages." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier des pages." + +#: wp-includes/class-wp-xmlrpc-server.php:2793 +#: wp-includes/class-wp-xmlrpc-server.php:2843 +msgid "Sorry, you are not allowed to edit your profile." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier votre profil." + +#: wp-includes/class-wp-theme.php:962 +msgid "Fixed Layout" +msgstr "Mise en page fixe" + +#: wp-includes/class-wp-theme.php:963 +msgid "Fluid Layout" +msgstr "Mise en page fluide" + +#: wp-includes/class-wp-theme.php:964 +msgid "Responsive Layout" +msgstr "Mise en page responsive" + +#: wp-includes/class-wp-theme.php:960 +msgid "Dark" +msgstr "Sombre" + +#: wp-includes/class-wp-theme.php:957 +msgid "Tan" +msgstr "Ocre" + +#: wp-includes/class-wp-theme.php:967 +msgid "Seasonal" +msgstr "Saisonnier" + +#: wp-includes/class-wp-theme.php:966 +msgid "Photoblogging" +msgstr "Blogage photo" + +#: wp-includes/class-wp-xmlrpc-server.php:1780 +#: wp-includes/class-wp-xmlrpc-server.php:5196 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:853 +#: wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php:901 +msgid "Sorry, you are not allowed to delete this post." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer cet article." + +#: wp-includes/class-wp-xmlrpc-server.php:3075 +msgid "Sorry, you are not allowed to delete this page." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer cette page." + +#: wp-includes/class-wp-xmlrpc-server.php:2925 +#: wp-includes/class-wp-xmlrpc-server.php:3141 wp-admin/includes/post.php:255 +#: wp-admin/includes/ajax-actions.php:1990 +msgid "Sorry, you are not allowed to edit this page." +msgstr "Désolé, vous n’avez pas l’autorisation de modifier cette page." + +#. translators: %s: Error string for a failed installation. +#: wp-includes/script-loader.php:1479 +msgid "Installation failed: %s" +msgstr "Échec d’installation : %s" + +#: wp-includes/script-loader.php:1508 +#: wp-admin/includes/class-wp-plugins-list-table.php:519 +#: wp-admin/includes/class-wp-plugins-list-table.php:690 +#: wp-admin/includes/class-plugin-installer-skin.php:87 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:587 +msgid "Network Activate" +msgstr "Activer sur le réseau" + +#: wp-includes/script-loader.php:1969 wp-admin/includes/dashboard.php:956 +msgid "Today" +msgstr "Aujourd’hui" + +#: wp-includes/widgets/class-wp-nav-menu-widget.php:168 +#: wp-includes/customize/class-wp-customize-nav-menu-location-control.php:86 +msgid "Edit Menu" +msgstr "Modifier le menu" + +#: wp-includes/wp-db.php:1948 wp-includes/wp-db.php:1954 +msgid "Unable to retrieve the error message from MySQL" +msgstr "Impossible de retrouver le message d’erreur depuis MYSQL" + +#. translators: %s: Site title. +#: wp-login.php:293 +msgctxt "site" +msgid "← Back to %s" +msgstr "← Retour vers %s" + +#: wp-includes/script-loader.php:1500 +msgid "Are you sure you want to delete the selected plugins and their data?" +msgstr "Confirmez-vous la suppression des extensions sélectionnées et de leurs données ?" + +#. translators: %s: Plugin name. +#: wp-includes/script-loader.php:1499 +msgid "Are you sure you want to delete %s and its data?" +msgstr "Confirmez-vous la suppression de %s et de ses données ?" + +#: wp-includes/script-loader.php:1501 +msgid "Caution: These themes may be active on other sites in the network. Are you sure you want to proceed?" +msgstr "Attention : Ces thèmes peuvent être actifs sur d’autres sites dans le réseau. Confirmez-vous la suppression ?" + +#. translators: %s: Error string for a failed deletion. +#: wp-includes/script-loader.php:1504 +msgid "Deletion failed: %s" +msgstr "Échec de suppression : %s" + +#: wp-includes/script-loader.php:1502 +msgid "Deleting..." +msgstr "Suppression…" + +#: wp-includes/js/dist/api-fetch.js:668 +msgid "An unknown error occurred." +msgstr "Une erreur inconnue est survenue." + +#: wp-includes/class-wp-text-diff-renderer-table.php:127 +msgid "Deleted:" +msgstr "Supprimé !" + +#. translators: %s: Theme name. +#: wp-includes/script-loader.php:1497 +msgid "Are you sure you want to delete %s?" +msgstr "Confirmez-vous la suppression de %s ?" + +#. translators: Password change notification email subject. %s: Site title. +#: wp-includes/pluggable.php:1910 wp-includes/user.php:2026 +msgid "[%s] Password Changed" +msgstr "[%s] Mot de passe changé" + +#: wp-includes/revision.php:595 +msgid "Sorry, you are not allowed to preview drafts." +msgstr "Désolé, vous n’avez pas l’autorisation de prévisualiser les brouillons." + +#: wp-includes/script-loader.php:674 wp-includes/script-loader.php:1258 +#: wp-includes/rest-api/class-wp-rest-server.php:988 +msgid "Sorry, you are not allowed to do that." +msgstr "Désolé, vous n’avez pas l’autorisation de faire cela." + +#: wp-includes/script-loader.php:1082 +msgctxt "password strength" +msgid "Password strength unknown" +msgstr "Force du mot de passe inconnue." + +#: wp-includes/script-loader.php:1452 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:555 +#: wp-admin/update-core.php:59 +msgid "Update Now" +msgstr "Mettre à jour maintenant" + +#: wp-includes/script-loader.php:1447 +msgid "Please select at least one item to perform this action on." +msgstr "Veuillez sélectionner au moins un élément pour effectuer cette action." + +#. translators: %s: Search query. +#: wp-includes/script-loader.php:1444 wp-admin/edit-tags.php:342 +#: wp-admin/link-manager.php:108 wp-admin/plugins.php:604 +#: wp-admin/edit-comments.php:235 wp-admin/upload.php:279 +#: wp-admin/users.php:574 wp-admin/edit.php:402 wp-admin/network/themes.php:278 +#: wp-admin/network/users.php:280 wp-admin/network/sites.php:370 +msgid "Search results for “%s”" +msgstr "Résultats de recherche pour « %s »" + +#: wp-includes/script-loader.php:1273 +msgid "" +"Are you sure you want to do this?\n" +"The comment changes you made will be lost." +msgstr "" +"Voulez-vous vraiment faire cela ?\n" +"Les modifications apportées au commentaire seront perdues." + +#: wp-login.php:979 wp-includes/script-loader.php:1097 wp-admin/install.php:172 +#: wp-admin/user-new.php:539 +msgid "Confirm use of weak password" +msgstr "Confirmer l’utilisation du mot de passe faible" + +#: wp-includes/script-loader.php:1446 +#: wp-admin/includes/class-wp-plugins-list-table.php:359 +#: wp-admin/plugin-editor.php:31 +msgid "You do not appear to have any plugins available at this time." +msgstr "Vous ne semblez pas avoir d’extensions disponibles actuellement." + +#. translators: %s: User name. +#: wp-includes/pluggable.php:1902 +msgid "Password changed for user: %s" +msgstr "Mot de passe modifié pour l’utilisateur : %s" + +#. translators: %s: Documentation URL. +#: wp-includes/formatting.php:4802 +msgid "A structure tag is required when using custom permalinks. Learn more" +msgstr "Une balise structurelle est nécessaire quand les permaliens personnalisés sont utilisés. En savoir plus." + +#: wp-includes/media-template.php:1435 +msgid "Image crop area preview. Requires mouse interaction." +msgstr "Zone d’aperçu de recadrage d’image. Nécessite l’interaction de la souris." + +#: wp-includes/class-wp-xmlrpc-server.php:4288 +#: wp-includes/class-wp-xmlrpc-server.php:4341 +#: wp-includes/class-wp-xmlrpc-server.php:6318 +#: wp-admin/includes/ajax-actions.php:2426 +#: wp-admin/includes/ajax-actions.php:2492 wp-admin/async-upload.php:38 +#: wp-admin/upload.php:13 wp-admin/media-new.php:16 +#: wp-admin/media-upload.php:20 +msgid "Sorry, you are not allowed to upload files." +msgstr "Désolé, vous n’avez pas l’autorisation de téléverser des fichiers." + +#: wp-includes/class-wp-xmlrpc-server.php:3353 +msgid "Sorry, you are not allowed to add a category." +msgstr "Désolé, vous n’avez pas l’autorisation d’ajouter une catégorie." + +#: wp-includes/class-wp-xmlrpc-server.php:2713 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:204 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:426 +#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:432 +#: wp-admin/users.php:16 +msgid "Sorry, you are not allowed to list users." +msgstr "Désolé, vous n’avez pas l’autorisation de lister les utilisateurs." + +#: wp-includes/script-loader.php:1212 +#: wp-includes/class-wp-customize-setting.php:592 +#: wp-includes/class-wp-customize-manager.php:2360 +msgid "Invalid value." +msgstr "Valeur non valide." + +#: wp-includes/script-loader.php:1170 +#: wp-includes/class-wp-customize-manager.php:515 wp-admin/customize.php:18 +msgid "Sorry, you are not allowed to customize this site." +msgstr "Désolé, vous n’avez pas l’autorisation de personnaliser ce site." + +#. translators: 1: + + + + section and everything up until

+ * + * @link https://developer.wordpress.org/themes/basics/template-files/#template-partials + * + * @package WordPress + * @subpackage Twenty_Nineteen + * @since Twenty Nineteen 1.0 + */ +?> +> + + + + + + + +> + +
+ + +
+ +
+ +
+ + + + +
+ +
diff --git a/content/themes/twentynineteen/image.php b/content/themes/twentynineteen/image.php new file mode 100644 index 0000000..ff689f4 --- /dev/null +++ b/content/themes/twentynineteen/image.php @@ -0,0 +1,104 @@ + + +
+
+ + + +
> + +
+ ', '' ); ?> +
+ +
+ +
+ + +
+ +
+ + '', + 'link_before' => '', + 'link_after' => '', + 'pagelink' => '' . __( 'Page', 'twentynineteen' ) . ' %', + 'separator' => ', ', + ) + ); + ?> +
+ +
+ %1$s%3$s × %4$s', + _x( 'Full size', 'Used before full size attachment link.', 'twentynineteen' ), + esc_url( wp_get_attachment_url() ), + absint( $metadata['width'] ), + absint( $metadata['height'] ) + ); + } + ?> + + + +
+
+ + _x( 'Published in
%title', 'Parent post link', 'twentynineteen' ), + ) + ); + + // If comments are open or we have at least one comment, load up the comment template. + if ( comments_open() || get_comments_number() ) { + comments_template(); + } + + // End the loop. + endwhile; + ?> + +
+
+ +

%s

', $message ); +} + +/** + * Prevents the Customizer from being loaded on WordPress versions prior to 4.7. + * + * @since Twenty Nineteen 1.0.0 + * + * @global string $wp_version WordPress version. + */ +function twentynineteen_customize() { + wp_die( + sprintf( + /* translators: %s: WordPress version. */ + __( 'Twenty Nineteen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again.', 'twentynineteen' ), + $GLOBALS['wp_version'] + ), + '', + array( + 'back_link' => true, + ) + ); +} +add_action( 'load-customize.php', 'twentynineteen_customize' ); + +/** + * Prevents the Theme Preview from being loaded on WordPress versions prior to 4.7. + * + * @since Twenty Nineteen 1.0.0 + * + * @global string $wp_version WordPress version. + */ +function twentynineteen_preview() { + if ( isset( $_GET['preview'] ) ) { + /* translators: %s: WordPress version. */ + wp_die( sprintf( __( 'Twenty Nineteen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again.', 'twentynineteen' ), $GLOBALS['wp_version'] ) ); + } +} +add_action( 'template_redirect', 'twentynineteen_preview' ); diff --git a/content/themes/twentynineteen/inc/color-patterns.php b/content/themes/twentynineteen/inc/color-patterns.php new file mode 100644 index 0000000..630f3ed --- /dev/null +++ b/content/themes/twentynineteen/inc/color-patterns.php @@ -0,0 +1,271 @@ + .has-primary-background-color, + .entry .entry-content > *[class^="wp-block-"].has-primary-background-color, + .entry .entry-content > *[class^="wp-block-"] .has-primary-background-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color.has-primary-background-color, + .entry .entry-content .wp-block-file .wp-block-file__button { + background-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + /* + * Set Color for: + * - all links + * - main navigation links + * - Post navigation links + * - Post entry meta hover + * - Post entry header more-link hover + * - main navigation svg + * - comment navigation + * - Comment edit link hover + * - Site Footer Link hover + * - Widget links + */ + a, + a:visited, + .main-navigation .main-menu > li, + .main-navigation ul.main-menu > li > a, + .post-navigation .post-title, + .entry .entry-meta a:hover, + .entry .entry-footer a:hover, + .entry .entry-content .more-link:hover, + .main-navigation .main-menu > li > a + svg, + .comment .comment-metadata > a:hover, + .comment .comment-metadata .comment-edit-link:hover, + #colophon .site-info a:hover, + .widget a, + .entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), + .entry .entry-content > .has-primary-color, + .entry .entry-content > *[class^="wp-block-"] .has-primary-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color blockquote.has-primary-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color blockquote.has-primary-color p { + color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + /* + * Set border color for: + * wp block quote + * :focus + */ + blockquote, + .entry .entry-content blockquote, + .entry .entry-content .wp-block-quote:not(.is-large), + .entry .entry-content .wp-block-quote:not(.is-style-large), + 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 { + border-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + .gallery-item > div > a:focus { + box-shadow: 0 0 0 2px hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + /* Hover colors */ + a:hover, a:active, + .main-navigation .main-menu > li > a:hover, + .main-navigation .main-menu > li > a:hover + svg, + .post-navigation .nav-links a:hover, + .post-navigation .nav-links a:hover .post-title, + .author-bio .author-description .author-link:hover, + .entry .entry-content > .has-secondary-color, + .entry .entry-content > *[class^="wp-block-"] .has-secondary-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color blockquote.has-secondary-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color blockquote.has-secondary-color p, + .comment .comment-author .fn a:hover, + .comment-reply-link:hover, + .comment-navigation .nav-previous a:hover, + .comment-navigation .nav-next a:hover, + #cancel-comment-reply-link:hover, + .widget a:hover { + color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness_hover . ' ); /* base: #005177; */ + } + + .main-navigation .sub-menu > li > a:hover, + .main-navigation .sub-menu > li > a:focus, + .main-navigation .sub-menu > li > a:hover:after, + .main-navigation .sub-menu > li > a:focus:after, + .main-navigation .sub-menu > li > .menu-item-link-return:hover, + .main-navigation .sub-menu > li > .menu-item-link-return:focus, + .main-navigation .sub-menu > li > a:not(.submenu-expand):hover, + .main-navigation .sub-menu > li > a:not(.submenu-expand):focus, + .entry .entry-content > .has-secondary-background-color, + .entry .entry-content > *[class^="wp-block-"].has-secondary-background-color, + .entry .entry-content > *[class^="wp-block-"] .has-secondary-background-color, + .entry .entry-content > *[class^="wp-block-"].is-style-solid-color.has-secondary-background-color { + background-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness_hover . ' ); /* base: #005177; */ + } + + /* Text selection colors */ + ::selection { + background-color: hsl( ' . $primary_color . ', ' . $saturation_selection . ', ' . $lightness_selection . ' ); /* base: #005177; */ + } + ::-moz-selection { + background-color: hsl( ' . $primary_color . ', ' . $saturation_selection . ', ' . $lightness_selection . ' ); /* base: #005177; */ + }'; + + $editor_css = ' + /* + * Set colors for: + * - links + * - blockquote + * - pullquote (solid color) + * - buttons + */ + .editor-block-list__layout .editor-block-list__block a, + .editor-block-list__layout .editor-block-list__block .wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), + .editor-block-list__layout .editor-block-list__block .wp-block-button.is-style-outline:hover .wp-block-button__link:not(.has-text-color), + .editor-block-list__layout .editor-block-list__block .wp-block-button.is-style-outline:focus .wp-block-button__link:not(.has-text-color), + .editor-block-list__layout .editor-block-list__block .wp-block-button.is-style-outline:active .wp-block-button__link:not(.has-text-color), + .editor-block-list__layout .editor-block-list__block .wp-block-file .wp-block-file__textlink { + color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + .editor-block-list__layout .editor-block-list__block .wp-block-quote:not(.is-large):not(.is-style-large), + .editor-styles-wrapper .editor-block-list__layout .wp-block-freeform blockquote { + border-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + .editor-block-list__layout .editor-block-list__block .wp-block-pullquote.is-style-solid-color:not(.has-background-color) { + background-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + .editor-block-list__layout .editor-block-list__block .wp-block-file .wp-block-file__button, + .editor-block-list__layout .editor-block-list__block .wp-block-button:not(.is-style-outline) .wp-block-button__link, + .editor-block-list__layout .editor-block-list__block .wp-block-button:not(.is-style-outline) .wp-block-button__link:active, + .editor-block-list__layout .editor-block-list__block .wp-block-button:not(.is-style-outline) .wp-block-button__link:focus, + .editor-block-list__layout .editor-block-list__block .wp-block-button:not(.is-style-outline) .wp-block-button__link:hover { + background-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' ); /* base: #0073a8; */ + } + + /* Hover colors */ + .editor-block-list__layout .editor-block-list__block a:hover, + .editor-block-list__layout .editor-block-list__block a:active, + .editor-block-list__layout .editor-block-list__block .wp-block-file .wp-block-file__textlink:hover { + color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness_hover . ' ); /* base: #005177; */ + } + + /* Do not overwrite solid color pullquote or cover links */ + .editor-block-list__layout .editor-block-list__block .wp-block-pullquote.is-style-solid-color a, + .editor-block-list__layout .editor-block-list__block .wp-block-cover a { + color: inherit; + } + '; + + if ( function_exists( 'register_block_type' ) && is_admin() ) { + $theme_css = $editor_css; + } + + /** + * Filters Twenty Nineteen custom colors CSS. + * + * @since Twenty Nineteen 1.0 + * + * @param string $css Base theme colors CSS. + * @param int $primary_color The user's selected color hue. + * @param string $saturation Filtered theme color saturation level. + */ + return apply_filters( 'twentynineteen_custom_colors_css', $theme_css, $primary_color, $saturation ); +} diff --git a/content/themes/twentynineteen/inc/customizer.php b/content/themes/twentynineteen/inc/customizer.php new file mode 100644 index 0000000..58e996c --- /dev/null +++ b/content/themes/twentynineteen/inc/customizer.php @@ -0,0 +1,158 @@ +get_setting( 'blogname' )->transport = 'postMessage'; + $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; + $wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage'; + + if ( isset( $wp_customize->selective_refresh ) ) { + $wp_customize->selective_refresh->add_partial( + 'blogname', + array( + 'selector' => '.site-title a', + 'render_callback' => 'twentynineteen_customize_partial_blogname', + ) + ); + $wp_customize->selective_refresh->add_partial( + 'blogdescription', + array( + 'selector' => '.site-description', + 'render_callback' => 'twentynineteen_customize_partial_blogdescription', + ) + ); + } + + /** + * Primary color. + */ + $wp_customize->add_setting( + 'primary_color', + array( + 'default' => 'default', + 'transport' => 'postMessage', + 'sanitize_callback' => 'twentynineteen_sanitize_color_option', + ) + ); + + $wp_customize->add_control( + 'primary_color', + array( + 'type' => 'radio', + 'label' => __( 'Primary Color', 'twentynineteen' ), + 'choices' => array( + 'default' => _x( 'Default', 'primary color', 'twentynineteen' ), + 'custom' => _x( 'Custom', 'primary color', 'twentynineteen' ), + ), + 'section' => 'colors', + 'priority' => 5, + ) + ); + + // Add primary color hue setting and control. + $wp_customize->add_setting( + 'primary_color_hue', + array( + 'default' => 199, + 'transport' => 'postMessage', + 'sanitize_callback' => 'absint', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'primary_color_hue', + array( + 'description' => __( 'Apply a custom color for buttons, links, featured images, etc.', 'twentynineteen' ), + 'section' => 'colors', + 'mode' => 'hue', + ) + ) + ); + + // Add image filter setting and control. + $wp_customize->add_setting( + 'image_filter', + array( + 'default' => 1, + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'image_filter', + array( + 'label' => __( 'Apply a filter to featured images using the primary color', 'twentynineteen' ), + 'section' => 'colors', + 'type' => 'checkbox', + ) + ); +} +add_action( 'customize_register', 'twentynineteen_customize_register' ); + +/** + * Render the site title for the selective refresh partial. + * + * @return void + */ +function twentynineteen_customize_partial_blogname() { + bloginfo( 'name' ); +} + +/** + * Render the site tagline for the selective refresh partial. + * + * @return void + */ +function twentynineteen_customize_partial_blogdescription() { + bloginfo( 'description' ); +} + +/** + * Bind JS handlers to instantly live-preview changes. + */ +function twentynineteen_customize_preview_js() { + wp_enqueue_script( 'twentynineteen-customize-preview', get_theme_file_uri( '/js/customize-preview.js' ), array( 'customize-preview' ), '20181214', true ); +} +add_action( 'customize_preview_init', 'twentynineteen_customize_preview_js' ); + +/** + * Load dynamic logic for the customizer controls area. + */ +function twentynineteen_panels_js() { + wp_enqueue_script( 'twentynineteen-customize-controls', get_theme_file_uri( '/js/customize-controls.js' ), array(), '20181214', true ); +} +add_action( 'customize_controls_enqueue_scripts', 'twentynineteen_panels_js' ); + +/** + * Sanitize custom color choice. + * + * @param string $choice Whether image filter is active. + * + * @return string + */ +function twentynineteen_sanitize_color_option( $choice ) { + $valid = array( + 'default', + 'custom', + ); + + if ( in_array( $choice, $valid, true ) ) { + return $choice; + } + + return 'default'; +} diff --git a/content/themes/twentynineteen/inc/helper-functions.php b/content/themes/twentynineteen/inc/helper-functions.php new file mode 100644 index 0000000..bea7099 --- /dev/null +++ b/content/themes/twentynineteen/inc/helper-functions.php @@ -0,0 +1,163 @@ +user_id > 0 ) { + $user = get_userdata( $comment->user_id ); + $post = get_post( $comment->comment_post_ID ); + if ( ! empty( $user ) && ! empty( $post ) ) { + return $comment->user_id === $post->post_author; + } + } + return false; +} + +/** + * Returns information about the current post's discussion, with cache support. + */ +function twentynineteen_get_discussion_data() { + static $discussion, $post_id; + + $current_post_id = get_the_ID(); + if ( $current_post_id === $post_id ) { + return $discussion; /* If we have discussion information for post ID, return cached object */ + } else { + $post_id = $current_post_id; + } + + $comments = get_comments( + array( + 'post_id' => $current_post_id, + 'orderby' => 'comment_date_gmt', + 'order' => get_option( 'comment_order', 'asc' ), /* Respect comment order from Settings » Discussion. */ + 'status' => 'approve', + 'number' => 20, /* Only retrieve the last 20 comments, as the end goal is just 6 unique authors */ + ) + ); + + $authors = array(); + foreach ( $comments as $comment ) { + $authors[] = ( (int) $comment->user_id > 0 ) ? (int) $comment->user_id : $comment->comment_author_email; + } + + $authors = array_unique( $authors ); + $discussion = (object) array( + 'authors' => array_slice( $authors, 0, 6 ), /* Six unique authors commenting on the post. */ + 'responses' => get_comments_number( $current_post_id ), /* Number of responses. */ + ); + + return $discussion; +} + +/** + * Converts HSL to HEX colors. + */ +function twentynineteen_hsl_hex( $h, $s, $l, $to_hex = true ) { + + $h /= 360; + $s /= 100; + $l /= 100; + + $r = $l; + $g = $l; + $b = $l; + $v = ( $l <= 0.5 ) ? ( $l * ( 1.0 + $s ) ) : ( $l + $s - $l * $s ); + if ( $v > 0 ) { + $m; + $sv; + $sextant; + $fract; + $vsf; + $mid1; + $mid2; + + $m = $l + $l - $v; + $sv = ( $v - $m ) / $v; + $h *= 6.0; + $sextant = floor( $h ); + $fract = $h - $sextant; + $vsf = $v * $sv * $fract; + $mid1 = $m + $vsf; + $mid2 = $v - $vsf; + + switch ( $sextant ) { + case 0: + $r = $v; + $g = $mid1; + $b = $m; + break; + case 1: + $r = $mid2; + $g = $v; + $b = $m; + break; + case 2: + $r = $m; + $g = $v; + $b = $mid1; + break; + case 3: + $r = $m; + $g = $mid2; + $b = $v; + break; + case 4: + $r = $mid1; + $g = $m; + $b = $v; + break; + case 5: + $r = $v; + $g = $m; + $b = $mid2; + break; + } + } + $r = round( $r * 255, 0 ); + $g = round( $g * 255, 0 ); + $b = round( $b * 255, 0 ); + + if ( $to_hex ) { + + $r = ( $r < 15 ) ? '0' . dechex( $r ) : dechex( $r ); + $g = ( $g < 15 ) ? '0' . dechex( $g ) : dechex( $g ); + $b = ( $b < 15 ) ? '0' . dechex( $b ) : dechex( $b ); + + return "#$r$g$b"; + + } + + return "rgb($r, $g, $b)"; +} diff --git a/content/themes/twentynineteen/inc/icon-functions.php b/content/themes/twentynineteen/inc/icon-functions.php new file mode 100644 index 0000000..b0ebf82 --- /dev/null +++ b/content/themes/twentynineteen/inc/icon-functions.php @@ -0,0 +1,108 @@ +theme_location ) { + $svg = twentynineteen_get_social_link_svg( $item->url, 26 ); + if ( empty( $svg ) ) { + $svg = twentynineteen_get_icon_svg( 'link' ); + } + $item_output = str_replace( $args->link_after, '' . $svg, $item_output ); + } + + return $item_output; +} +add_filter( 'walker_nav_menu_start_el', 'twentynineteen_nav_menu_social_icons', 10, 4 ); + +/** + * Add a dropdown icon to top-level menu items. + * + * @param string $output Nav menu item start element. + * @param object $item Nav menu item. + * @param int $depth Depth. + * @param object $args Nav menu args. + * @return string Nav menu item start element. + * Add a dropdown icon to top-level menu items + */ +function twentynineteen_add_dropdown_icons( $output, $item, $depth, $args ) { + + // Only add class to 'top level' items on the 'primary' menu. + if ( ! isset( $args->theme_location ) || 'menu-1' !== $args->theme_location ) { + return $output; + } + + if ( in_array( 'mobile-parent-nav-menu-item', $item->classes, true ) && isset( $item->original_id ) ) { + // Inject the keyboard_arrow_left SVG inside the parent nav menu item, and let the item link to the parent item. + // @todo Only do this for nested submenus? If on a first-level submenu, then really the link could be "#" since the desire is to remove the target entirely. + $link = sprintf( + '. + $output = preg_replace( + '##i', + '', + $output, + 1 // Limit. + ); + + } elseif ( in_array( 'menu-item-has-children', $item->classes, true ) ) { + + // Add SVG icon to parent items. + $icon = twentynineteen_get_icon_svg( 'keyboard_arrow_down', 24 ); + + $output .= sprintf( + '', + $icon + ); + } + + return $output; +} +add_filter( 'walker_nav_menu_start_el', 'twentynineteen_add_dropdown_icons', 10, 4 ); diff --git a/content/themes/twentynineteen/inc/template-functions.php b/content/themes/twentynineteen/inc/template-functions.php new file mode 100644 index 0000000..92c25d7 --- /dev/null +++ b/content/themes/twentynineteen/inc/template-functions.php @@ -0,0 +1,211 @@ +'; + } +} +add_action( 'wp_head', 'twentynineteen_pingback_header' ); + +/** + * Changes comment form default fields. + */ +function twentynineteen_comment_form_defaults( $defaults ) { + $comment_field = $defaults['comment_field']; + + // Adjust height of comment form. + $defaults['comment_field'] = preg_replace( '/rows="\d+"/', 'rows="5"', $comment_field ); + + return $defaults; +} +add_filter( 'comment_form_defaults', 'twentynineteen_comment_form_defaults' ); + +/** + * Filters the default archive titles. + */ +function twentynineteen_get_the_archive_title() { + if ( is_category() ) { + $title = __( 'Category Archives: ', 'twentynineteen' ) . '' . single_term_title( '', false ) . ''; + } elseif ( is_tag() ) { + $title = __( 'Tag Archives: ', 'twentynineteen' ) . '' . single_term_title( '', false ) . ''; + } elseif ( is_author() ) { + $title = __( 'Author Archives: ', 'twentynineteen' ) . '' . get_the_author_meta( 'display_name' ) . ''; + } elseif ( is_year() ) { + $title = __( 'Yearly Archives: ', 'twentynineteen' ) . '' . get_the_date( _x( 'Y', 'yearly archives date format', 'twentynineteen' ) ) . ''; + } elseif ( is_month() ) { + $title = __( 'Monthly Archives: ', 'twentynineteen' ) . '' . get_the_date( _x( 'F Y', 'monthly archives date format', 'twentynineteen' ) ) . ''; + } elseif ( is_day() ) { + $title = __( 'Daily Archives: ', 'twentynineteen' ) . '' . get_the_date() . ''; + } elseif ( is_post_type_archive() ) { + $title = __( 'Post Type Archives: ', 'twentynineteen' ) . '' . post_type_archive_title( '', false ) . ''; + } elseif ( is_tax() ) { + $tax = get_taxonomy( get_queried_object()->taxonomy ); + /* translators: %s: Taxonomy singular name. */ + $title = sprintf( esc_html__( '%s Archives:', 'twentynineteen' ), $tax->labels->singular_name ); + } else { + $title = __( 'Archives:', 'twentynineteen' ); + } + return $title; +} +add_filter( 'get_the_archive_title', 'twentynineteen_get_the_archive_title' ); + +/** + * Add custom sizes attribute to responsive image functionality for post thumbnails. + * + * @origin Twenty Nineteen 1.0 + * + * @param array $attr Attributes for the image markup. + * @return string Value for use in post thumbnail 'sizes' attribute. + */ +function twentynineteen_post_thumbnail_sizes_attr( $attr ) { + + if ( is_admin() ) { + return $attr; + } + + if ( ! is_singular() ) { + $attr['sizes'] = '(max-width: 34.9rem) calc(100vw - 2rem), (max-width: 53rem) calc(8 * (100vw / 12)), (min-width: 53rem) calc(6 * (100vw / 12)), 100vw'; + } + + return $attr; +} +add_filter( 'wp_get_attachment_image_attributes', 'twentynineteen_post_thumbnail_sizes_attr', 10, 1 ); + +/** + * Add an extra menu to our nav for our priority+ navigation to use + * + * @param object $nav_menu Nav menu. + * @param object $args Nav menu args. + * @return string More link for hidden menu items. + */ +function twentynineteen_add_ellipses_to_nav( $nav_menu, $args ) { + + if ( 'menu-1' === $args->theme_location ) : + + $nav_menu .= ' + '; + + endif; + + return $nav_menu; +} +add_filter( 'wp_nav_menu', 'twentynineteen_add_ellipses_to_nav', 10, 2 ); + +/** + * WCAG 2.0 Attributes for Dropdown Menus + * + * Adjustments to menu attributes tot support WCAG 2.0 recommendations + * for flyout and dropdown menus. + * + * @ref https://www.w3.org/WAI/tutorials/menus/flyout/ + */ +function twentynineteen_nav_menu_link_attributes( $atts, $item, $args, $depth ) { + + // Add [aria-haspopup] and [aria-expanded] to menu items that have children. + $item_has_children = in_array( 'menu-item-has-children', $item->classes ); + if ( $item_has_children ) { + $atts['aria-haspopup'] = 'true'; + $atts['aria-expanded'] = 'false'; + } + + return $atts; +} +add_filter( 'nav_menu_link_attributes', 'twentynineteen_nav_menu_link_attributes', 10, 4 ); + +/** + * Create a nav menu item to be displayed on mobile to navigate from submenu back to the parent. + * + * This duplicates each parent nav menu item and makes it the first child of itself. + * + * @param array $sorted_menu_items Sorted nav menu items. + * @param object $args Nav menu args. + * @return array Amended nav menu items. + */ +function twentynineteen_add_mobile_parent_nav_menu_items( $sorted_menu_items, $args ) { + static $pseudo_id = 0; + if ( ! isset( $args->theme_location ) || 'menu-1' !== $args->theme_location ) { + return $sorted_menu_items; + } + + $amended_menu_items = array(); + foreach ( $sorted_menu_items as $nav_menu_item ) { + $amended_menu_items[] = $nav_menu_item; + if ( in_array( 'menu-item-has-children', $nav_menu_item->classes, true ) ) { + $parent_menu_item = clone $nav_menu_item; + $parent_menu_item->original_id = $nav_menu_item->ID; + $parent_menu_item->ID = --$pseudo_id; + $parent_menu_item->db_id = $parent_menu_item->ID; + $parent_menu_item->object_id = $parent_menu_item->ID; + $parent_menu_item->classes = array( 'mobile-parent-nav-menu-item' ); + $parent_menu_item->menu_item_parent = $nav_menu_item->ID; + + $amended_menu_items[] = $parent_menu_item; + } + } + + return $amended_menu_items; +} +add_filter( 'wp_nav_menu_objects', 'twentynineteen_add_mobile_parent_nav_menu_items', 10, 2 ); diff --git a/content/themes/twentynineteen/inc/template-tags.php b/content/themes/twentynineteen/inc/template-tags.php new file mode 100644 index 0000000..ae3e3b1 --- /dev/null +++ b/content/themes/twentynineteen/inc/template-tags.php @@ -0,0 +1,258 @@ +%2$s'; + if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) { + $time_string = ''; + } + + $time_string = sprintf( + $time_string, + 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() ) + ); + + printf( + '%1$s%3$s', + twentynineteen_get_icon_svg( 'watch', 16 ), + esc_url( get_permalink() ), + $time_string + ); + } +endif; + +if ( ! function_exists( 'twentynineteen_posted_by' ) ) : + /** + * Prints HTML with meta information about theme author. + */ + function twentynineteen_posted_by() { + printf( + /* translators: 1: SVG icon. 2: Post author, only visible to screen readers. 3: Author link. */ + '', + twentynineteen_get_icon_svg( 'person', 16 ), + __( 'Posted by', 'twentynineteen' ), + esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), + esc_html( get_the_author() ) + ); + } +endif; + +if ( ! function_exists( 'twentynineteen_comment_count' ) ) : + /** + * Prints HTML with the comment count for the current post. + */ + function twentynineteen_comment_count() { + if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) { + echo ''; + echo twentynineteen_get_icon_svg( 'comment', 16 ); + + /* translators: %s: Post title. Only visible to screen readers. */ + comments_popup_link( sprintf( __( 'Leave a comment on %s', 'twentynineteen' ), get_the_title() ) ); + + echo ''; + } + } +endif; + +if ( ! function_exists( 'twentynineteen_entry_footer' ) ) : + /** + * Prints HTML with meta information for the categories, tags and comments. + */ + function twentynineteen_entry_footer() { + + // Hide author, post date, category and tag text for pages. + if ( 'post' === get_post_type() ) { + + // Posted by. + twentynineteen_posted_by(); + + // Posted on. + twentynineteen_posted_on(); + + /* translators: Used between list items, there is a space after the comma. */ + $categories_list = get_the_category_list( __( ', ', 'twentynineteen' ) ); + if ( $categories_list ) { + printf( + /* translators: 1: SVG icon. 2: Posted in label, only visible to screen readers. 3: List of categories. */ + '%1$s%2$s%3$s', + twentynineteen_get_icon_svg( 'archive', 16 ), + __( 'Posted in', 'twentynineteen' ), + $categories_list + ); // WPCS: XSS OK. + } + + /* translators: Used between list items, there is a space after the comma. */ + $tags_list = get_the_tag_list( '', __( ', ', 'twentynineteen' ) ); + if ( $tags_list ) { + printf( + /* translators: 1: SVG icon. 2: Posted in label, only visible to screen readers. 3: List of tags. */ + '%1$s%2$s %3$s', + twentynineteen_get_icon_svg( 'tag', 16 ), + __( 'Tags:', 'twentynineteen' ), + $tags_list + ); // WPCS: XSS OK. + } + } + + // Comment count. + if ( ! is_singular() ) { + twentynineteen_comment_count(); + } + + // Edit post link. + edit_post_link( + sprintf( + wp_kses( + /* translators: %s: Post title. Only visible to screen readers. */ + __( 'Edit %s', 'twentynineteen' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + get_the_title() + ), + '' . twentynineteen_get_icon_svg( 'edit', 16 ), + '' + ); + } +endif; + +if ( ! function_exists( 'twentynineteen_post_thumbnail' ) ) : + /** + * Displays an optional post thumbnail. + * + * Wraps the post thumbnail in an anchor element on index views, or a div + * element when on single views. + */ + function twentynineteen_post_thumbnail() { + if ( ! twentynineteen_can_show_post_thumbnail() ) { + return; + } + + if ( is_singular() ) : + ?> + +
+ +
+ + + +
+ +
+ + %s
', get_avatar( $id_or_email, twentynineteen_get_avatar_size() ) ); + } +endif; + +if ( ! function_exists( 'twentynineteen_discussion_avatars_list' ) ) : + /** + * Displays a list of avatars involved in a discussion for a given post. + */ + function twentynineteen_discussion_avatars_list( $comment_authors ) { + if ( empty( $comment_authors ) ) { + return; + } + echo '
    ', "\n"; + foreach ( $comment_authors as $id_or_email ) { + printf( + "
  1. %s
  2. \n", + twentynineteen_get_user_avatar_markup( $id_or_email ) + ); + } + echo '
', "\n"; + } +endif; + +if ( ! function_exists( 'twentynineteen_comment_form' ) ) : + /** + * Documentation for function. + */ + function twentynineteen_comment_form( $order ) { + if ( true === $order || strtolower( $order ) === strtolower( get_option( 'comment_order', 'asc' ) ) ) { + + comment_form( + array( + 'logged_in_as' => null, + 'title_reply' => null, + ) + ); + } + } +endif; + +if ( ! function_exists( 'twentynineteen_the_posts_navigation' ) ) : + /** + * Documentation for function. + */ + function twentynineteen_the_posts_navigation() { + the_posts_pagination( + array( + 'mid_size' => 2, + 'prev_text' => sprintf( + '%s %s', + twentynineteen_get_icon_svg( 'chevron_left', 22 ), + __( 'Newer posts', 'twentynineteen' ) + ), + 'next_text' => sprintf( + '%s %s', + __( 'Older posts', 'twentynineteen' ), + twentynineteen_get_icon_svg( 'chevron_right', 22 ) + ), + ) + ); + } +endif; + +if ( ! function_exists( 'wp_body_open' ) ) : + /** + * Fire the wp_body_open action. + * + * Added for backward compatibility to support pre-5.2.0 WordPress versions. + * + * @since Twenty Nineteen 1.4 + */ + function wp_body_open() { + /** + * Triggered after the opening tag. + * + * @since Twenty Nineteen 1.4 + */ + do_action( 'wp_body_open' ); + } +endif; diff --git a/content/themes/twentynineteen/index.php b/content/themes/twentynineteen/index.php new file mode 100644 index 0000000..9a5c27d --- /dev/null +++ b/content/themes/twentynineteen/index.php @@ -0,0 +1,47 @@ + + +
+
+ + + +
+
+ + getAvailableSpace( button, container ); + } + + /** + * Set menu container variable. + */ + var navContainer = document.querySelector('.main-navigation'); + var breaks = []; + + /** + * Let’s bail if we our menu doesn't exist. + */ + if ( ! navContainer ) { + return; + } + + /** + * Refreshes the list item from the menu depending on the menu size. + */ + function updateNavigationMenu( container ) { + + /** + * Let’s bail if our menu is empty. + */ + if ( ! container.parentNode.querySelector('.main-menu[id]') ) { + return; + } + + // Adds the necessary UI to operate the menu. + var visibleList = container.parentNode.querySelector('.main-menu[id]'); + var hiddenList = visibleList.parentNode.nextElementSibling.querySelector('.hidden-links'); + var toggleButton = visibleList.parentNode.nextElementSibling.querySelector('.main-menu-more-toggle'); + + if ( isOverflowingNavivation( visibleList, toggleButton, container ) ) { + + // Record the width of the list. + breaks.push( visibleList.offsetWidth ); + // Move last item to the hidden list. + prependElement( hiddenList, ! visibleList.lastChild || null === visibleList.lastChild ? visibleList.previousElementSibling : visibleList.lastChild ); + // Show the toggle button. + showButton( toggleButton ); + + } else { + + // There is space for another item in the nav. + if ( getAvailableSpace( toggleButton, container ) > breaks[breaks.length - 1] ) { + // Move the item to the visible list. + visibleList.appendChild( hiddenList.firstChild.nextSibling ); + breaks.pop(); + } + + // Hide the dropdown btn if hidden list is empty. + if (breaks.length < 2) { + hideButton( toggleButton ); + } + } + + // Recur if the visible list is still overflowing the nav. + if ( isOverflowingNavivation( visibleList, toggleButton, container ) ) { + updateNavigationMenu( container ); + } + } + + /** + * Run our priority+ function as soon as the document is `ready`. + */ + document.addEventListener( 'DOMContentLoaded', function() { + + updateNavigationMenu( navContainer ); + + // Also, run our priority+ function on selective refresh in the customizer. + var hasSelectiveRefresh = ( + 'undefined' !== typeof wp && + wp.customize && + wp.customize.selectiveRefresh && + wp.customize.navMenusPreview.NavMenuInstancePartial + ); + + if ( hasSelectiveRefresh ) { + // Re-run our priority+ function on Nav Menu partial refreshes. + wp.customize.selectiveRefresh.bind( 'partial-content-rendered', function ( placement ) { + + var isNewNavMenu = ( + placement && + placement.partial.id.includes( 'nav_menu_instance' ) && + 'null' !== placement.container[0].parentNode && + placement.container[0].parentNode.classList.contains( 'main-navigation' ) + ); + + if ( isNewNavMenu ) { + updateNavigationMenu( placement.container[0].parentNode ); + } + }); + } + }); + + /** + * Run our priority+ function on load. + */ + window.addEventListener( 'load', function() { + updateNavigationMenu( navContainer ); + }); + + /** + * Run our priority+ function every time the window resizes. + */ + var isResizing = false; + window.addEventListener( 'resize', + debounce( function() { + if ( isResizing ) { + return; + } + + isResizing = true; + setTimeout( function() { + updateNavigationMenu( navContainer ); + isResizing = false; + }, 150 ); + } ) + ); + + /** + * Run our priority+ function. + */ + updateNavigationMenu( navContainer ); + +})(); diff --git a/content/themes/twentynineteen/js/skip-link-focus-fix.js b/content/themes/twentynineteen/js/skip-link-focus-fix.js new file mode 100644 index 0000000..32ba80c --- /dev/null +++ b/content/themes/twentynineteen/js/skip-link-focus-fix.js @@ -0,0 +1,33 @@ +/** + * File skip-link-focus-fix.js. + * + * Helps with accessibility for keyboard only users. + * + * This is the source file for what is minified in the twentynineteen_skip_link_focus_fix() PHP function. + * + * Learn more: https://git.io/vWdr2 + */ +( function() { + var isIe = /(trident|msie)/i.test( navigator.userAgent ); + + if ( isIe && document.getElementById && window.addEventListener ) { + window.addEventListener( 'hashchange', function() { + var id = location.hash.substring( 1 ), + element; + + if ( ! ( /^[A-z0-9_-]+$/.test( id ) ) ) { + return; + } + + element = document.getElementById( id ); + + if ( element ) { + if ( ! ( /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) ) { + element.tabIndex = -1; + } + + element.focus(); + } + }, false ); + } +} )(); diff --git a/content/themes/twentynineteen/js/touch-keyboard-navigation.js b/content/themes/twentynineteen/js/touch-keyboard-navigation.js new file mode 100644 index 0000000..c8d1dd0 --- /dev/null +++ b/content/themes/twentynineteen/js/touch-keyboard-navigation.js @@ -0,0 +1,354 @@ +/** + * Touch & Keyboard navigation. + * + * Contains handlers for touch devices and keyboard navigation. + */ + +(function() { + + /** + * Debounce. + * + * @param {Function} func + * @param {number} wait + * @param {boolean} immediate + */ + function debounce(func, wait, immediate) { + 'use strict'; + + var timeout; + wait = (typeof wait !== 'undefined') ? wait : 20; + immediate = (typeof immediate !== 'undefined') ? immediate : true; + + return function() { + + var context = this, args = arguments; + var later = function() { + timeout = null; + + if (!immediate) { + func.apply(context, args); + } + }; + + var callNow = immediate && !timeout; + + clearTimeout(timeout); + timeout = setTimeout(later, wait); + + if (callNow) { + func.apply(context, args); + } + }; + } + + /** + * Add class. + * + * @param {Object} el + * @param {string} cls + */ + function addClass(el, cls) { + if ( ! el.className.match( '(?:^|\\s)' + cls + '(?!\\S)') ) { + el.className += ' ' + cls; + } + } + + /** + * Delete class. + * + * @param {Object} el + * @param {string} cls + */ + function deleteClass(el, cls) { + el.className = el.className.replace( new RegExp( '(?:^|\\s)' + cls + '(?!\\S)' ),'' ); + } + + /** + * Has class? + * + * @param {Object} el + * @param {string} cls + * + * @returns {boolean} Has class + */ + function hasClass(el, cls) { + + if ( el.className.match( '(?:^|\\s)' + cls + '(?!\\S)' ) ) { + return true; + } + } + + /** + * Toggle Aria Expanded state for screenreaders. + * + * @param {Object} ariaItem + */ + function toggleAriaExpandedState( ariaItem ) { + 'use strict'; + + var ariaState = ariaItem.getAttribute('aria-expanded'); + + if ( ariaState === 'true' ) { + ariaState = 'false'; + } else { + ariaState = 'true'; + } + + ariaItem.setAttribute('aria-expanded', ariaState); + } + + /** + * Open sub-menu. + * + * @param {Object} currentSubMenu + */ + function openSubMenu( currentSubMenu ) { + 'use strict'; + + // Update classes. + // classList.add is not supported in IE11. + currentSubMenu.parentElement.className += ' off-canvas'; + currentSubMenu.parentElement.lastElementChild.className += ' expanded-true'; + + // Update aria-expanded state. + toggleAriaExpandedState( currentSubMenu ); + } + + /** + * Close sub-menu. + * + * @param {Object} currentSubMenu + */ + function closeSubMenu( currentSubMenu ) { + 'use strict'; + + var menuItem = getCurrentParent( currentSubMenu, '.menu-item' ); // this.parentNode + var menuItemAria = menuItem.querySelector('a[aria-expanded]'); + var subMenu = currentSubMenu.closest('.sub-menu'); + + // If this is in a sub-sub-menu, go back to parent sub-menu. + if ( getCurrentParent( currentSubMenu, 'ul' ).classList.contains( 'sub-menu' ) ) { + + // Update classes. + // classList.remove is not supported in IE11. + menuItem.className = menuItem.className.replace( 'off-canvas', '' ); + subMenu.className = subMenu.className.replace( 'expanded-true', '' ); + + // Update aria-expanded and :focus states. + toggleAriaExpandedState( menuItemAria ); + + // Or else close all sub-menus. + } else { + + // Update classes. + // classList.remove is not supported in IE11. + menuItem.className = menuItem.className.replace( 'off-canvas', '' ); + menuItem.lastElementChild.className = menuItem.lastElementChild.className.replace( 'expanded-true', '' ); + + // Update aria-expanded and :focus states. + toggleAriaExpandedState( menuItemAria ); + } + } + + /** + * Find first ancestor of an element by selector. + * + * @param {Object} child + * @param {String} selector + * @param {String} stopSelector + */ + function getCurrentParent( child, selector, stopSelector ) { + + var currentParent = null; + + while ( child ) { + + if ( child.matches(selector) ) { + + currentParent = child; + break; + + } else if ( stopSelector && child.matches(stopSelector) ) { + + break; + } + + child = child.parentElement; + } + + return currentParent; + } + + /** + * Remove all off-canvas states. + */ + function removeAllFocusStates() { + 'use strict'; + + var siteBranding = document.getElementsByClassName( 'site-branding' )[0]; + var getFocusedElements = siteBranding.querySelectorAll(':hover, :focus, :focus-within'); + var getFocusedClassElements = siteBranding.querySelectorAll('.is-focused'); + var i; + var o; + + for ( i = 0; i < getFocusedElements.length; i++) { + getFocusedElements[i].blur(); + } + + for ( o = 0; o < getFocusedClassElements.length; o++) { + deleteClass( getFocusedClassElements[o], 'is-focused' ); + } + } + + /** + * Matches polyfill for IE11. + */ + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector; + } + + /** + * Toggle `focus` class to allow sub-menu access on touch screens. + */ + function toggleSubmenuDisplay() { + + document.addEventListener('touchstart', function(event) { + + if ( event.target.matches('a') ) { + + var url = event.target.getAttribute( 'href' ) ? event.target.getAttribute( 'href' ) : ''; + + // Open submenu if URL is #. + if ( '#' === url && event.target.nextSibling.matches('.submenu-expand') ) { + openSubMenu( event.target ); + } + } + + // Check if .submenu-expand is touched. + if ( event.target.matches('.submenu-expand') ) { + openSubMenu(event.target); + + // Check if child of .submenu-expand is touched. + } else if ( null != getCurrentParent( event.target, '.submenu-expand' ) && + getCurrentParent( event.target, '.submenu-expand' ).matches( '.submenu-expand' ) ) { + openSubMenu( getCurrentParent( event.target, '.submenu-expand' ) ); + + // Check if .menu-item-link-return is touched. + } else if ( event.target.matches('.menu-item-link-return') ) { + closeSubMenu( event.target ); + + // Check if child of .menu-item-link-return is touched. + } else if ( null != getCurrentParent( event.target, '.menu-item-link-return' ) && getCurrentParent( event.target, '.menu-item-link-return' ).matches( '.menu-item-link-return' ) ) { + closeSubMenu( event.target ); + } + + // Prevent default mouse/focus events. + removeAllFocusStates(); + + }, false); + + document.addEventListener('touchend', function(event) { + + var mainNav = getCurrentParent( event.target, '.main-navigation' ); + + if ( null != mainNav && hasClass( mainNav, '.main-navigation' ) ) { + // Prevent default mouse events. + event.preventDefault(); + + } else if ( + event.target.matches('.submenu-expand') || + null != getCurrentParent( event.target, '.submenu-expand' ) && + getCurrentParent( event.target, '.submenu-expand' ).matches( '.submenu-expand' ) || + event.target.matches('.menu-item-link-return') || + null != getCurrentParent( event.target, '.menu-item-link-return' ) && + getCurrentParent( event.target, '.menu-item-link-return' ).matches( '.menu-item-link-return' ) ) { + // Prevent default mouse events. + event.preventDefault(); + } + + // Prevent default mouse/focus events. + removeAllFocusStates(); + + }, false); + + document.addEventListener('focus', function(event) { + + if ( event.target.matches('.main-navigation > div > ul > li a') ) { + + // Remove Focused elements in sibling div. + var currentDiv = getCurrentParent( event.target, 'div', '.main-navigation' ); + var currentDivSibling = currentDiv.previousElementSibling === null ? currentDiv.nextElementSibling : currentDiv.previousElementSibling; + var focusedElement = currentDivSibling.querySelector( '.is-focused' ); + var focusedClass = 'is-focused'; + var prevLi = getCurrentParent( event.target, '.main-navigation > div > ul > li', '.main-navigation' ).previousElementSibling; + var nextLi = getCurrentParent( event.target, '.main-navigation > div > ul > li', '.main-navigation' ).nextElementSibling; + + if ( null !== focusedElement && null !== hasClass( focusedElement, focusedClass ) ) { + deleteClass( focusedElement, focusedClass ); + } + + // Add .is-focused class to top-level li. + if ( getCurrentParent( event.target, '.main-navigation > div > ul > li', '.main-navigation' ) ) { + addClass( getCurrentParent( event.target, '.main-navigation > div > ul > li', '.main-navigation' ), focusedClass ); + } + + // Check for previous li. + if ( prevLi && hasClass( prevLi, focusedClass ) ) { + deleteClass( prevLi, focusedClass ); + } + + // Check for next li. + if ( nextLi && hasClass( nextLi, focusedClass ) ) { + deleteClass( nextLi, focusedClass ); + } + } + + }, true); + + document.addEventListener('click', function(event) { + + // Remove all focused menu states when clicking outside site branding. + if ( event.target !== document.getElementsByClassName( 'site-branding' )[0] ) { + removeAllFocusStates(); + } else { + // Nothing. + } + + }, false); + } + + /** + * Run our sub-menu function as soon as the document is `ready`. + */ + document.addEventListener( 'DOMContentLoaded', function() { + toggleSubmenuDisplay(); + }); + + /** + * Run our sub-menu function on selective refresh in the customizer. + */ + document.addEventListener( 'customize-preview-menu-refreshed', function( e, params ) { + if ( 'menu-1' === params.wpNavMenuArgs.theme_location ) { + toggleSubmenuDisplay(); + } + }); + + /** + * Run our sub-menu function every time the window resizes. + */ + var isResizing = false; + window.addEventListener( 'resize', function() { + isResizing = true; + debounce( function() { + if ( isResizing ) { + return; + } + + toggleSubmenuDisplay(); + isResizing = false; + + }, 150 ); + } ); + +})(); diff --git a/content/themes/twentynineteen/package-lock.json b/content/themes/twentynineteen/package-lock.json new file mode 100644 index 0000000..59d5354 --- /dev/null +++ b/content/themes/twentynineteen/package-lock.json @@ -0,0 +1,4627 @@ +{ + "name": "twentynineteen", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz", + "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==", + "dev": true + }, + "@wordpress/browserslist-config": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-2.5.0.tgz", + "integrity": "sha512-cspE4iJ87YjweKAtnIsCxm7ZJQ/ved3TdRJWS0DX/0AOukoRhOMYh7CP1aVc0M3J1kB4LtTY7u3HOcqF2Yf2VA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", + "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", + "dev": true, + "requires": { + "browserslist": "^4.6.1", + "caniuse-lite": "^1.0.30000971", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.16", + "postcss-value-parser": "^3.3.1" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30000978", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000978.tgz", + "integrity": "sha512-H6gK6kxUzG6oAwg/Jal279z8pHw0BzrpZfwo/CA9FFm/vA0l8IhDfkZtepyJNE2Y4V6Dp3P3ubz6czby1/Mgsw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.1.tgz", + "integrity": "sha512-gfw3p2oQV2wEt+8VuMlNsPjCxDxvvgnm/kz+uATu805mWVF8IJN7uz9DN7iBz+RMJISmiVbCOBFs9qBGMjtPfQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" + } + }, + "chokidar-cli": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-2.0.0.tgz", + "integrity": "sha512-E3N0WlV1L4c60cs9owdGQpZXY5obZya5Xds7+sF6GTVWWZKwqlq9QG7c2ESPNtjS+5QusAg8VmUEnOnAtZYNcg==", + "dev": true, + "requires": { + "bluebird": "3.5.5", + "chokidar": "3.0.2", + "lodash": "4.17.15", + "yargs": "13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "dev": true, + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.0.tgz", + "integrity": "sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "readdirp": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.3.tgz", + "integrity": "sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "dependency-graph": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", + "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==", + "dev": true + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.179", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.179.tgz", + "integrity": "sha512-hRjlOdKImgIRicKYRY6hHbUMrX2NJYBrIusTepwPt/apcabuzrzhXpkkWu7elWdTZEQwKV6BfX8EvWIBWLCNQw==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", + "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", + "dev": true, + "requires": { + "colors": "~0.6.0-1", + "commander": "~2.1.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.24.tgz", + "integrity": "sha512-wym2jptfuKowMmkZsfCSTsn8qAVo8zm+UiQA6l5dNqUcpfChZSnS/vbbpOeXczf+VdPhutxh+99lWHhdd6xKzg==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "node-sass": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", + "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.11", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, + "pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-cli": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-6.1.2.tgz", + "integrity": "sha512-jIWfIkqt8cTThSpH8DBaNxHlBf99OKSem2RseRpfVPqWayxHKQB0IWdS/IF5XSGeFU5QslSDTdVHnw6qggXGkA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "chokidar": "^2.0.0", + "dependency-graph": "^0.8.0", + "fs-extra": "^7.0.0", + "get-stdin": "^6.0.0", + "globby": "^9.0.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "postcss-reporter": "^6.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "yargs": "^12.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-reporter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", + "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "lodash": "^4.17.11", + "log-symbols": "^2.2.0", + "postcss": "^7.0.7" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", + "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rtlcss": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.4.0.tgz", + "integrity": "sha512-hdjFhZ5FCI0ABOfyXOMOhBtwPWtANLCG7rOiOcRf+yi5eDdxmDjqBruWouEnwVdzfh/TWF6NNncIEsigOCFZOA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "findup": "^0.1.5", + "mkdirp": "^0.5.1", + "postcss": "^6.0.14", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/content/themes/twentynineteen/package.json b/content/themes/twentynineteen/package.json new file mode 100644 index 0000000..b2c6879 --- /dev/null +++ b/content/themes/twentynineteen/package.json @@ -0,0 +1,44 @@ +{ + "name": "twentynineteen", + "version": "1.0.0", + "description": "Default WP Theme", + "bugs": { + "url": "https://github.com/WordPress/twentynineteen/issues" + }, + "homepage": "https://github.com/WordPress/twentynineteen#readme", + "devDependencies": { + "@wordpress/browserslist-config": "^2.5.0", + "autoprefixer": "^9.6.0", + "chokidar-cli": "^2.0.0", + "node-sass": "^4.12.0", + "npm-run-all": "^4.1.5", + "postcss-cli": "^6.1.2", + "postcss-focus-within": "^3.0.0", + "rtlcss": "^2.4.0" + }, + "rtlcssConfig": { + "options": { + "autoRename": false, + "autoRenameStrict": false, + "blacklist": {}, + "clean": true, + "greedy": false, + "processUrls": false, + "stringMap": [] + }, + "plugins": [], + "map": false + }, + "browserslist": [ + "extends @wordpress/browserslist-config" + ], + "scripts": { + "build:style": "node-sass style.scss style.css --output-style expanded && postcss -r style.css", + "build:style-editor": "node-sass style-editor.scss style-editor.css --output-style expanded && postcss -r style-editor.css", + "build:style-editor-customizer": "node-sass style-editor-customizer.scss style-editor-customizer.css --output-style expanded && postcss -r style-editor-customizer.css", + "build:rtl": "rtlcss style.css style-rtl.css", + "build:print": "node-sass print.scss print.css --output-style expanded && postcss -r print.css", + "build": "run-p \"build:*\"", + "watch": "chokidar \"**/*.scss\" -c \"npm run build\" --initial" + } +} diff --git a/content/themes/twentynineteen/page.php b/content/themes/twentynineteen/page.php new file mode 100644 index 0000000..757e049 --- /dev/null +++ b/content/themes/twentynineteen/page.php @@ -0,0 +1,38 @@ + + +
+
+ + + +
+
+ +>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Margins +# Typography +# Page breaks +# Links +# Visibility +--------------------------------------------------------------*/ +@media print { + /* Margins */ + @page { + margin: 2cm; + } + .entry { + margin-top: 1em; + } + .entry .entry-header, .site-footer .site-info { + margin: 0; + } + /* Fonts */ + body { + font: 13pt Georgia, "Times New Roman", Times, serif; + line-height: 1.3; + background: #fff !important; + color: #000; + } + h1 { + font-size: 24pt; + } + h2, + h3, + h4, + .has-regular-font-size, + .has-large-font-size, + h2.author-title, + p.author-bio, + .comments-title, h3 { + font-size: 14pt; + margin-top: 25px; + } + /* Page breaks */ + a { + page-break-inside: avoid; + } + blockquote { + page-break-inside: avoid; + } + h1, + h2, + h3, + h4, + h5, + h6 { + page-break-after: avoid; + page-break-inside: avoid; + } + img { + page-break-inside: avoid; + page-break-after: avoid; + } + table, pre { + page-break-inside: avoid; + } + ul, ol, dl { + page-break-before: avoid; + } + /* Links */ + a:link, a:visited, a { + background: transparent; + font-weight: bold; + text-decoration: underline; + text-align: left; + } + a { + page-break-inside: avoid; + } + a[href^=http]:after { + content: " < " attr(href) "> "; + } + a:after > img { + content: ""; + } + article a[href^="#"]:after { + content: ""; + } + a:not(:local-link):after { + content: " < " attr(href) "> "; + } + /* Visibility */ + .main-navigation, + .site-title + .main-navigation, + .social-navigation, + .site-branding-container:before, + .entry .entry-title:before, + .entry-footer, + .author-description:before, + .post-navigation, + .widget-area, + .comment-form-flex, + .comment-reply, + .comment .comment-metadata .edit-link { + display: none; + } + .entry .entry-content .wp-block-button .wp-block-button__link, + .entry .entry-content .button { + color: #000; + background: none; + } + /* Site Header (With Featured Image) */ + .site-header.featured-image { + min-height: 0; + } + .site-header.featured-image .main-navigation a, + .site-header.featured-image .main-navigation a + svg, + .site-header.featured-image .social-navigation a, + .site-header.featured-image .site-title a, + .site-header.featured-image .site-featured-image a, + .site-header.featured-image .site-branding .site-title, + .site-header.featured-image .site-branding .site-description, + .site-header.featured-image .main-navigation a:after, + .site-header.featured-image .main-navigation .main-menu > li.menu-item-has-children:after, + .site-header.featured-image .main-navigation li, + .site-header.featured-image .social-navigation li, + .site-header.featured-image .entry-meta, + .site-header.featured-image .entry-title, + .site-header.featured-image#masthead .site-title a { + color: #000; + text-shadow: none; + } + .site-header.featured-image .site-featured-image .entry-header, + .site-header.featured-image .site-branding-container { + margin-top: 0; + margin-bottom: 0; + } + .site-header.featured-image .site-featured-image .post-thumbnail img { + position: relative; + height: initial; + width: initial; + object-fit: none; + min-width: 0; + min-height: 0; + max-width: 100%; + margin-top: 1rem; + } + /* Remove image filters from featured image */ + .image-filters-enabled *:after { + display: none !important; + } + .image-filters-enabled .site-header.featured-image .site-featured-image:before { + display: none; + } + .image-filters-enabled .site-header.featured-image .site-featured-image .post-thumbnail img { + filter: none; + } +} diff --git a/content/themes/twentynineteen/print.scss b/content/themes/twentynineteen/print.scss new file mode 100644 index 0000000..47976da --- /dev/null +++ b/content/themes/twentynineteen/print.scss @@ -0,0 +1,198 @@ +/* +Theme Name: Twenty Nineteen + +Adding print support. The print styles are based on the the great work of +Andreas Hecht in https://www.jotform.com/blog/css-perfect-print-stylesheet-98272/. +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Margins +# Typography +# Page breaks +# Links +# Visibility +--------------------------------------------------------------*/ + +@media print { + + /* Margins */ + + @page { + margin: 2cm; + } + + .entry { + margin-top: 1em; + } + + .entry .entry-header, .site-footer .site-info { + margin: 0; + } + + /* Fonts */ + + body { + font: 13pt Georgia, "Times New Roman", Times, serif; + line-height: 1.3; + background: #fff !important; + color: #000; + } + + h1 { + font-size: 24pt; + } + + h2, + h3, + h4, + .has-regular-font-size, + .has-large-font-size, + h2.author-title, + p.author-bio, + .comments-title, h3 { + font-size: 14pt; + margin-top: 25px; + } + + /* Page breaks */ + + a { + page-break-inside: avoid + } + + blockquote { + page-break-inside: avoid; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + page-break-after: avoid; + page-break-inside: avoid + } + + img { + page-break-inside: avoid; + page-break-after: avoid; + } + + table, pre { + page-break-inside: avoid; + } + + ul, ol, dl { + page-break-before: avoid; + } + + /* Links */ + + a:link, a:visited, a { + background: transparent; + font-weight: bold; + text-decoration: underline; + text-align: left; + } + + a { + page-break-inside: avoid; + } + + a[href^=http]:after { + content: " < " attr(href) "> "; + } + + a:after > img { + content: ""; + } + + article a[href^="#"]:after { + content: ""; + } + + a:not(:local-link):after { + content: " < " attr(href) "> "; + } + + /* Visibility */ + .main-navigation, + .site-title + .main-navigation, + .social-navigation, + .site-branding-container:before, + .entry .entry-title:before, + .entry-footer, + .author-description:before, + .post-navigation, + .widget-area, + .comment-form-flex, + .comment-reply, + .comment .comment-metadata .edit-link { + display: none; + } + + .entry .entry-content .wp-block-button .wp-block-button__link, + .entry .entry-content .button { + color: #000; + background: none; + } + + /* Site Header (With Featured Image) */ + .site-header.featured-image { + min-height: 0; + + .main-navigation a, + .main-navigation a + svg, + .social-navigation a, + .site-title a, + .site-featured-image a, + .site-branding .site-title, + .site-branding .site-description, + .main-navigation a:after, + .main-navigation .main-menu > li.menu-item-has-children:after, + .main-navigation li, + .social-navigation li, + .entry-meta, + .entry-title, + &#masthead .site-title a { + color: #000; + text-shadow: none; + } + + .site-featured-image .entry-header, + .site-branding-container { + margin-top: 0; + margin-bottom: 0; + } + + .site-featured-image .post-thumbnail img { + position: relative; + height: initial; + width: initial; + object-fit: none; + min-width: 0; + min-height: 0; + max-width: 100%; + margin-top: 1rem; + } + } + + /* Remove image filters from featured image */ + .image-filters-enabled { + + *:after { + display: none !important; + } + + .site-header.featured-image .site-featured-image:before { + display: none; + } + + .site-header.featured-image .site-featured-image .post-thumbnail img { + filter: none; + } + } +} \ No newline at end of file diff --git a/content/themes/twentynineteen/readme.txt b/content/themes/twentynineteen/readme.txt new file mode 100644 index 0000000..c871d92 --- /dev/null +++ b/content/themes/twentynineteen/readme.txt @@ -0,0 +1,74 @@ +=== Twenty Nineteen === +Contributors: wordpressdotorg +Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready +Requires at least: 4.9.6 +Tested up to: 5.0 +Stable tag: 1.5 +License: GPLv2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html + +Our 2019 default theme is designed to show off the power of the block editor. + +== Description == +Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes. + +For more information about Twenty Nineteen please go to https://wordpress.org/support/article/twenty-nineteen/. + +== Installation == + +1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. +2. Type in Twenty Nineteen in the search form and press the 'Enter' key on your keyboard. +3. Click on the 'Activate' button to use your new theme right away. +4. Go to https://wordpress.org/support/article/twenty-nineteen/ for a guide on how to customize this theme. +5. Navigate to Appearance > Customize in your admin panel and customize to taste. + +== Copyright == + +Twenty Nineteen WordPress Theme, Copyright 2018-2020 WordPress.org +Twenty Nineteen 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.5 = +* Released: March 31, 2020 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.5 + += 1.4 = +* Released: May 7, 2019 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.4 + += 1.3 = +* Released: February 21, 2019 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.3 + += 1.2 = +* Released: January 9, 2019 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.2 + += 1.1 = +* Released: December 19, 2018 + +https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_1.1 + += 1.0 = +* Released: December 6, 2018 + +Initial release + +== Resources == +* normalize.css, © 2012-2018 Nicolas Gallagher and Jonathan Neal, MIT +* Underscores, © 2012-2019 Automattic, Inc., GNU GPL v2 or later diff --git a/content/themes/twentynineteen/sass/_normalize.scss b/content/themes/twentynineteen/sass/_normalize.scss new file mode 100644 index 0000000..c5ad67a --- /dev/null +++ b/content/themes/twentynineteen/sass/_normalize.scss @@ -0,0 +1,341 @@ +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ + +/* 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; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.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; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 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; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: 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; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * 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; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * 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: -0.25em; +} + +sup { + top: -0.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; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + 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: 0.35em 0.75em 0.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; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * 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; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * 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; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * 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; /* 1 */ + font: inherit; /* 2 */ +} + +/* 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; +} diff --git a/content/themes/twentynineteen/sass/blocks/_blocks.scss b/content/themes/twentynineteen/sass/blocks/_blocks.scss new file mode 100644 index 0000000..e4b3134 --- /dev/null +++ b/content/themes/twentynineteen/sass/blocks/_blocks.scss @@ -0,0 +1,1032 @@ +/* !Block styles */ + + +// Default block margin and alignment rules. +// These are replicated inside of the Group block +// so that child blocks in there appear the same way. +.entry .entry-content > *, +.entry .entry-summary > *, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + max-width: 100%; + + @include postContentMaxWidth(); + + @include media(tablet) { + margin: 32px 0; + } + + &.alignwide { + margin-left: auto; + margin-right: auto; + clear: both; + + @include media(tablet) { + width: 100%; + max-width: 100%; + } + } + + &.alignfull { + position: relative; + left: -#{$size__spacing-unit }; + width: calc( 100% + (2 * #{$size__spacing-unit})); + max-width: calc( 100% + (2 * #{$size__spacing-unit})); + clear: both; + + @include media(tablet) { + margin-top: calc(2 * #{$size__spacing-unit}); + margin-bottom: calc(2 * #{$size__spacing-unit}); + left: calc( -12.5% - 75px ); + width: calc( 125% + 150px ); + max-width: calc( 125% + 150px ); + } + } + + &.alignleft { + /*rtl:ignore*/ + float: left; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-left: 0; + /*rtl:ignore*/ + margin-right: $size__spacing-unit; + + @include media(tablet) { + max-width: calc(4 * (100vw / 12)); + /*rtl:ignore*/ + margin-right: calc(2 * #{$size__spacing-unit}); + } + } + + &.alignright { + /*rtl:ignore*/ + float: right; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-right: 0; + /*rtl:ignore*/ + margin-left: $size__spacing-unit; + + @include media(tablet) { + max-width: calc(4 * (100vw / 12)); + margin-right: 0; + /*rtl:ignore*/ + margin-left: calc(2 * #{$size__spacing-unit}); + } + } + &.aligncenter { + margin-left: auto; + margin-right: auto; + + @include postContentMaxWidth(); + + @include media(tablet) { + margin-left: 0; + margin-right: 0; + } + } +} + +.entry .entry-content > *, +.entry .entry-summary > * { + + > *:first-child { + margin-top: 0; + } + + > *:last-child { + margin-bottom: 0; + } +} + +/* + * Unset nested content selector styles + * - Prevents layout styles from cascading too deeply + * - helps with plugin compatibility + */ +.entry .entry-content, +.entry .entry-summary { + + .entry-content, + .entry-summary, + .entry { + margin: inherit; + max-width: inherit; + padding: inherit; + + @include media(tablet) { + margin: inherit; + max-width: inherit; + padding: inherit; + } + } +} + +.entry .entry-content { + + //! Paragraphs + p.has-background { + padding: 20px 30px; + } + + //! Audio + .wp-block-audio { + + width: 100%; + + audio { + width: 100%; + } + + &.alignleft audio, + &.alignright audio { + + max-width: (0.33 * $mobile_width); + + @include media(tablet) { + max-width: (0.5 * $tablet_width); + } + + @include media(wide) { + max-width: (0.33 * $desktop_width); + } + } + } + + //! Video + .wp-block-video { + + video { + width: 100%; + } + } + + //! Button + .wp-block-button { + + .wp-block-button__link { + @include button-transition; + border: none; + font-size: $font__size-sm; + @include font-family( $font__heading ); + line-height: $font__line-height-heading; + box-sizing: border-box; + font-weight: bold; + text-decoration: none; + padding: ($size__spacing-unit * .76) $size__spacing-unit; + outline: none; + outline: none; + + &:not(.has-background) { + background-color: $color__background-button; + } + + &:not(.has-text-color) { + color: white; + } + + &:hover { + color: white; + background: $color__background-button-hover; + cursor: pointer; + } + + &:focus { + color: white; + background: $color__background-button-hover; + outline: thin dotted; + outline-offset: -4px; + } + } + + &:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; + } + + &.is-style-outline .wp-block-button__link, + &.is-style-outline .wp-block-button__link:focus, + &.is-style-outline .wp-block-button__link:active { + @include button-all-transition; + border-width: 2px; + border-style: solid; + + &:not(.has-background) { + background: transparent; + } + + &:not(.has-text-color) { + color: $color__background-button; + border-color: currentColor; + } + } + + &.is-style-outline .wp-block-button__link:hover { + color: white; + border-color: $color__background-button-hover; + &:not(.has-background) { + color: $color__background-button-hover; + } + } + } + + //! Latest posts, categories, archives + .wp-block-archives, + .wp-block-categories, + .wp-block-latest-posts { + padding: 0; + list-style: none; + + li > a { + @include font-family( $font__heading ); + font-size: calc(#{$font__size_base} * #{$font__size-ratio}); + font-weight: bold; + line-height: $font__line-height-heading; + text-decoration: none; + } + } + + .wp-block-archives, + .wp-block-categories { + + &.aligncenter { + text-align: center; + } + } + + //! Latest categories + .wp-block-categories { + + ul { + padding-top: ( .75 * $size__spacing-unit ); + } + + li ul { + list-style: none; + padding-left: 0; + } + + @include nestedSubMenuPadding(); + } + + //! Latest posts + .wp-block-latest-posts { + + .wp-block-latest-posts__post-date { + @include font-family( $font__heading ); + font-size: $font__size-xs; + color: $color__text-light; + line-height: 1.2; + } + + .wp-block-latest-posts__post-full-content, + .wp-block-latest-posts__post-excerpt { + margin-top: $size__spacing-unit; + margin-bottom: $size__spacing-unit; + } + + li { + padding-bottom: ( .5 * $size__spacing-unit ); + + &.menu-item-has-children, + &:last-child { + padding-bottom: 0; + } + + :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: ( .5 * $size__spacing-unit ); + } + } + + &.is-grid li { + border-top: 2px solid $color__border; + padding-top: (1 * $size__spacing-unit); + margin-bottom: (2 * $size__spacing-unit); + a { + &:after { + content: ''; + } + } + &:last-child { + margin-bottom: auto; + a:after { + content: ''; + } + } + } + } + + //! Latest preformatted text + .wp-block-preformatted { + font-size: $font__size-xs; + line-height: 1.8; + padding: $size__spacing-unit; + } + + //! Verse + .wp-block-verse { + @include font-family( $font__body ); + font-size: $font__size_base; + line-height: 1.8; + } + + //! Paragraphs + .has-drop-cap { + &:not(:focus):first-letter { + @include font-family( $font__heading ); + font-size: $font__size-xxxl; + line-height: 1; + font-weight: bold; + margin: 0 0.25em 0 0; + } + } + + //! Pullquote + .wp-block-pullquote { + border-color: transparent; + border-width: 2px; + padding: $size__spacing-unit; + + blockquote { + color: $color__text-main; + border: none; + margin-top: calc(4 * #{ $size__spacing-unit}); + margin-bottom: calc(4.33 * #{ $size__spacing-unit}); + margin-right: 0; + padding-left: 0; + } + + p { + font-size: $font__size-lg; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; + + em { + font-style: normal; + } + + @include media(tablet) { + font-size: $font__size-xl; + } + } + + cite { + display: inline-block; + @include font-family( $font__heading ); + line-height: 1.6; + text-transform: none; + color: $color__text-light; + + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * #{$font__size-ratio})); + } + + &.alignleft, + &.alignright { + width: 100%; + padding: 0; + + blockquote { + margin: $size__spacing-unit 0; + padding: 0; + text-align: left; + max-width: 100%; + + p:first-child { + margin-top: 0; + } + } + } + + &.is-style-solid-color { + background-color: $color__link; + padding-left: 0; + padding-right: 0; + + @include media(tablet) { + padding-left: 10%; + padding-right: 10%; + } + + p { + font-size: $font__size-lg; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; + + @include media(tablet) { + font-size: $font__size-xl; + } + } + + a { + color: $color__background-body; + } + + cite { + color: inherit; + } + + blockquote { + max-width: 100%; + color: $color__background-body; + padding-left: 0; + margin-left: $size__spacing-unit; + margin-right: $size__spacing-unit; + + &.has-text-color p, + &.has-text-color a, + &.has-primary-color, + &.has-secondary-color, + &.has-dark-gray-color, + &.has-light-gray-color, + &.has-white-color { + color: inherit; + } + + @include media(tablet) { + margin-left: 0; + margin-right: 0; + } + } + + &.alignright, + &.alignleft { + + @include media(tablet) { + padding: $size__spacing-unit calc(2 * #{$size__spacing-unit}); + } + } + + &.alignfull { + + @include media(tablet) { + padding-left: calc(10% + 58px + (2 * #{$size__spacing-unit})); + padding-right: calc(10% + 58px + (2 * #{$size__spacing-unit})); + } + } + } + } + + //! Blockquote + .wp-block-quote { + + &:not(.is-large), + &:not(.is-style-large) { + border-width: 2px; + border-color: $color__link; + padding-top: 0; + padding-bottom: 0; + } + + p { + font-size: 1em; + font-style: normal; + line-height: 1.8; + } + + cite { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * #{$font__size-ratio})); + } + + &.is-large, + &.is-style-large { + margin: $size__spacing-unit 0; + padding: 0; + border-left: none; + + p { + font-size: $font__size-lg; + line-height: 1.4; + font-style: italic; + } + + cite, + footer { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * #{$font__size-ratio})); + } + + @include media(tablet) { + margin: $size__spacing-unit 0; + padding: $size__spacing-unit 0; + + p { + font-size: $font__size-lg; + } + } + } + } + + //! Image + .wp-block-image { + max-width: 100%; + + img { + display: block; + } + + // If an image does not have a left/center/right alignment, + // it's a direct child of .wp-block-img. If it has no other + // alignment added, we want to make sure the image does not + // extend beyond the width of the text column. + &:not(.alignwide):not(.alignfull) > img { + @include postContentMaxWidth(); + } + + .aligncenter { + + @include postContentMaxWidth(); + + @include media(tablet) { + margin: 0; + width: $size__site-tablet-content; + + img { + margin: 0 auto; + } + } + + @include media(desktop) { + width: $size__site-desktop-content; + + img { + margin: 0 auto; + } + } + } + + &.alignfull img { + width: 100vw; + max-width: calc( 100% + (2 * #{$size__spacing-unit})); + + @include media(tablet) { + max-width: calc( 125% + 150px ); + margin-left: auto; + margin-right: auto; + } + } + } + + //! Cover Image + .wp-block-cover-image, + .wp-block-cover { + position: relative; + min-height: 430px; + padding: $size__spacing-unit; + + @include media(tablet) { + padding: $size__spacing-unit 10%; + } + + .wp-block-cover-image-text, + .wp-block-cover-text, + h2 { + @include font-family( $font__heading ); + font-size: $font__size-lg; + font-weight: bold; + line-height: 1.25; + padding: 0; + color: #fff; + + @include media(tablet) { + font-size: $font__size-xl; + max-width: 100%; + } + } + + &.alignleft, + &.alignright { + width: 100%; + + @include media(tablet) { + padding: $size__spacing-unit calc(2 * #{$size__spacing-unit}); + } + } + + &.alignfull { + + .wp-block-cover-image-text, + .wp-block-cover-text, + h2 { + @include postContentMaxWidth(); + } + + @include media(tablet) { + padding-left: calc(10% + 58px + (2 * #{$size__spacing-unit})); + padding-right: calc(10% + 58px + (2 * #{$size__spacing-unit})); + + .wp-block-cover-image-text, + .wp-block-cover-text, + h2 { + padding: 0; + } + } + } + } + + //! Galleries + .wp-block-gallery { + list-style-type: none; + padding-left: 0; + + .blocks-gallery-image:last-child, + .blocks-gallery-item:last-child { + margin-bottom: 16px; + } + + figcaption a { + color: #fff; + } + } + + //! Captions + .wp-block-audio figcaption, + .wp-block-video figcaption, + .wp-block-image figcaption, + .wp-block-gallery .blocks-gallery-image figcaption, + .wp-block-gallery .blocks-gallery-item figcaption { + font-size: $font__size-xs; + @include font-family( $font__heading ); + line-height: $font__line-height-pre; + margin: 0; + padding: ( $size__spacing-unit * .5 ); + text-align: center; + } + + //! Separator + .wp-block-separator, + hr { + background-color: $color__text-light; + border: 0; + height: 2px; + margin-bottom: (2 * $size__spacing-unit); + margin-top: (2 * $size__spacing-unit); + max-width: 2.25em; + text-align: left; + + &.is-style-wide { + max-width: 100%; + @include postContentMaxWidth(); + } + + &.is-style-dots { + max-width: 100%; + @include postContentMaxWidth(); + background-color: inherit; + border: inherit; + height: inherit; + text-align: center; + + // Only apply the default dot color if there's no separator color specified. + &:not(.has-text-color):not(.has-background) { + color: $color__text-light; + } + + &:before { + font-size: $font__size-lg; + letter-spacing: $font__size-sm; + padding-left: $font__size-sm; + } + } + + /* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ + & + h1, + & + h2 { + + &:before { + display: none; + } + } + } + + //! Twitter Embed + .wp-block-embed-twitter { + word-break: break-word; + } + + //! Table + .wp-block-table { + + th, + td { + border-color: $color__text-light; + } + } + + //! File + .wp-block-file { + @include font-family( $font__heading ); + + .wp-block-file__button { + display: table; + @include button-transition; + border: none; + border-radius: 5px; + background: $color__background-button; + font-size: $font__size-base; + @include font-family( $font__heading ); + line-height: $font__line-height-heading; + text-decoration: none; + font-weight: bold; + padding: ($size__spacing-unit * .75) $size__spacing-unit; + color: #fff; + margin-left: 0; + margin-top: calc(0.75 * #{$size__spacing-unit}); + + @include media(desktop) { + font-size: $font__size-base; + padding: ($size__spacing-unit * .875) ($size__spacing-unit * 1.5); + } + + &:hover { + background: $color__background-button-hover; + cursor: pointer; + } + + &:focus { + background: $color__background-button-hover; + outline: thin dotted; + outline-offset: -4px; + } + } + } + + //! Code + .wp-block-code { + border-radius: 0; + + code { + font-size: $font__size-md; + white-space: pre-wrap; + word-break: break-word; + } + } + + //! Columns + .wp-block-columns { + + .wp-block-column > * { + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + + // Ensure images do not expand beyond the column. + .wp-block-image > img:not(.alignwide):not(.alignfull), + .wp-block-image > figure { + + @include media(tablet) { + max-width: 100%; + } + + @include media(desktop) { + max-width: 100%; + } + } + + @include media(tablet) { + flex-wrap: nowrap; + + .wp-block-column:not(:first-child) { + margin-left: 32px; + } + } + } + + //! Group + .wp-block-group { + + // When the Group block is standard/wide, we need to prevent full-aligned + // child blocks from expanding out of their container. + &:not(.alignfull) > .wp-block-group__inner-container > .alignfull, + &:not(.alignfull) > .wp-block-group__inner-container > .wp-block-image > img { + + @include media(tablet) { + left: 0; + max-width: 100%; + } + } + + // The full-width Group block's inner container should mimic .entry-content styles. + &.alignfull > .wp-block-group__inner-container { + max-width: calc(100% - (2 * #{ $size__spacing-unit })); + margin: 0 $size__spacing-unit; + + @include media(tablet) { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } + } + + // Group block with a colored background. + &.has-background { + padding: $size__spacing-unit; + margin-top: 0; + margin-bottom: 0; + + // Remove the top and bottom margins of inner blocks. + .wp-block-group__inner-container { + + > *:first-child { + margin-top: 0; + } + + > *:last-child { + margin-bottom: 0; + } + } + + // If the Group block is full-width, it does not need this extra padding. + &.alignfull { + padding-left: 0; + padding-right: 0; + + @include media(tablet) { + padding-top: $size__spacing-unit; + padding-bottom: $size__spacing-unit; + } + } + + // Full-aligned child blocks should take up the maximum width available in their container. + &:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: 100%; + max-width: 100%; + + @include media(tablet) { + width: calc( 100% + #{$size__spacing-unit * 2} ); + max-width: calc( 100% + #{$size__spacing-unit * 2} ); + margin-left: -#{$size__spacing-unit}; + } + } + } + + } + + //! Latest Comments + .wp-block-latest-comments { + + .wp-block-latest-comments__comment-meta { + @include font-family( $font__heading ); + font-weight: bold; + + .wp-block-latest-comments__comment-date { + font-weight: normal; + } + } + + .wp-block-latest-comments__comment, + .wp-block-latest-comments__comment-date, + .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; + } + + &.has-avatars { + + } + + &.has-dates { + + .wp-block-latest-comments__comment-date { + font-size: $font__size-xs; + } + } + + &.has-excerpts { + + } + } + + //! Font Sizes + .has-small-font-size { + font-size: $font__size-sm; + } + + .has-normal-font-size { + font-size: $font__size-md; + } + + .has-large-font-size { + font-size: $font__size-lg; + } + + .has-huge-font-size { + font-size: $font__size-xl; + } + + //! Custom background colors + .has-primary-background-color, + .has-secondary-background-color, + .has-dark-gray-background-color, + .has-light-gray-background-color { + + // Use white text against these backgrounds by default. + color: $color__background-body; + + > p, + > h1, + > h2, + > h3, + > h4, + > h5, + > h6, + > a { + color: $color__background-body; + } + } + + .has-white-background-color { + color: $color__text-main; + + // Use dark gray text against this background by default. + > p, + > h1, + > h2, + > h3, + > h4, + > h5, + > h6, + > a { + color: $color__text-main; + } + } + + .has-primary-background-color, + .wp-block-pullquote.is-style-solid-color.has-primary-background-color { + background-color: $color__link; + } + + .has-secondary-background-color, + .wp-block-pullquote.is-style-solid-color.has-secondary-background-color { + background-color: $color__border-link-hover; + } + + .has-dark-gray-background-color, + .wp-block-pullquote.is-style-solid-color.has-dark-gray-background-color { + background-color: $color__text-main; + } + + .has-light-gray-background-color, + .wp-block-pullquote.is-style-solid-color.has-light-gray-background-color { + background-color: $color__text-light; + } + + .has-white-background-color, + .wp-block-pullquote.is-style-solid-color.has-white-background-color { + background-color: #FFF; + } + + //! Custom foreground colors + .has-primary-color, + .wp-block-pullquote blockquote.has-primary-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color > p { + color: $color__link; + } + + .has-secondary-color, + .wp-block-pullquote blockquote.has-secondary-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color > p { + color: $color__border-link-hover; + } + + .has-dark-gray-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color > p { + color: $color__text-main; + } + + .has-light-gray-color, + .wp-block-pullquote blockquote.has-light-gray-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color > p { + color: $color__text-light; + } + + .has-white-color, + .wp-block-pullquote blockquote.has-white-color, + .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: #FFF; + } +} diff --git a/content/themes/twentynineteen/sass/elements/_elements.scss b/content/themes/twentynineteen/sass/elements/_elements.scss new file mode 100644 index 0000000..b1fad05 --- /dev/null +++ b/content/themes/twentynineteen/sass/elements/_elements.scss @@ -0,0 +1,92 @@ +html { + box-sizing: border-box; +} + +::-moz-selection { + background-color: $color__background_selection; +} + +::selection { + background-color: $color__background_selection; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + background-color: $color__background-body; +} + +a { + @include link-transition; + color: $color__link; +} + +a:visited { + +} + +a:hover, +a:active { + color: $color__link-hover; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin; + outline-style: dotted; + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + margin: $size__spacing-unit 0; +} + +h1:not(.site-title), +h2 { + @include post-section-dash; +} + +hr { + background-color: $color__text-light; + border: 0; + height: 2px; +} + +@import "lists"; + +img { + height: auto; + max-width: 100%; + position: relative; +} + +figure { + margin: 0; +} + +blockquote { + border-left: 2px solid $color__link; + margin-left: 0; + padding: 0 0 0 $size__spacing-unit; + + > p { + margin: 0 0 $size__spacing-unit; + } + + cite { + color: $color__text-light; + } +} + +@import "tables"; diff --git a/content/themes/twentynineteen/sass/elements/_lists.scss b/content/themes/twentynineteen/sass/elements/_lists.scss new file mode 100644 index 0000000..1db7633 --- /dev/null +++ b/content/themes/twentynineteen/sass/elements/_lists.scss @@ -0,0 +1,33 @@ +ul, +ol { + padding-left: ( 1 * $size__spacing-unit ); +} + +ul { + list-style: disc; + + ul { + list-style-type: circle; + } +} + +ol { + list-style: decimal; +} + +li { + line-height: $font__line-height-body; +} + +li > ul, +li > ol { + padding-left: ( 2 * $size__spacing-unit ); +} + +dt { + font-weight: bold; +} + +dd { + margin: 0 $size__spacing-unit $size__spacing-unit; +} diff --git a/content/themes/twentynineteen/sass/elements/_tables.scss b/content/themes/twentynineteen/sass/elements/_tables.scss new file mode 100644 index 0000000..0f653a5 --- /dev/null +++ b/content/themes/twentynineteen/sass/elements/_tables.scss @@ -0,0 +1,13 @@ +table { + margin: 0 0 $size__spacing-unit; + border-collapse: collapse; + width: 100%; + @include font-family( $font__heading ); + + td, + th { + padding: 0.5em; + border: 1px solid $color__text-light; + word-break: break-all; + } +} diff --git a/content/themes/twentynineteen/sass/forms/_buttons.scss b/content/themes/twentynineteen/sass/forms/_buttons.scss new file mode 100644 index 0000000..f527a08 --- /dev/null +++ b/content/themes/twentynineteen/sass/forms/_buttons.scss @@ -0,0 +1,37 @@ +.button, +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + + @include button-transition; + background: $color__background-button; + border: none; + border-radius: 5px; + box-sizing: border-box; + color: $color__background-body; + @include font-family( $font__heading ); + font-size: $font__size-sm; + font-weight: 700; + line-height: $font__line-height-heading; + outline: none; + padding: ( $size__spacing-unit * .76 ) $size__spacing-unit; + text-decoration: none; + vertical-align: bottom; + + &:hover { + background: $color__background-button-hover; + cursor: pointer; + } + + &:visited { + color: $color__background-body; + text-decoration: none; + } + + &:focus { + background: $color__background-button-hover; + outline: thin dotted; + outline-offset: -4px; + } +} diff --git a/content/themes/twentynineteen/sass/forms/_fields.scss b/content/themes/twentynineteen/sass/forms/_fields.scss new file mode 100644 index 0000000..448b707 --- /dev/null +++ b/content/themes/twentynineteen/sass/forms/_fields.scss @@ -0,0 +1,58 @@ +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 { + -webkit-backface-visibility: hidden; + background: $color__background-input; + border: solid 1px $color__border; + box-sizing: border-box; + outline: none; + padding: #{.36 * $size__spacing-unit} #{.66 * $size__spacing-unit}; + -webkit-appearance: none; + outline-offset: 0; + border-radius: 0; + + &:focus { + border-color: $color__link; + outline: thin solid rgba( $color__link, 0.15 ); + outline-offset: -4px; + } +} + +input[type="search"] { + &::-webkit-search-decoration { + display: none; + } +} + +select { + +} + +textarea { + box-sizing: border-box; + display: block; + width: 100%; + max-width: 100%; + resize: vertical; +} + +form { + + p { + margin: $size__spacing-unit 0; + } + +} \ No newline at end of file diff --git a/content/themes/twentynineteen/sass/forms/_forms.scss b/content/themes/twentynineteen/sass/forms/_forms.scss new file mode 100644 index 0000000..2036ef9 --- /dev/null +++ b/content/themes/twentynineteen/sass/forms/_forms.scss @@ -0,0 +1,3 @@ +@import "buttons"; + +@import "fields"; diff --git a/content/themes/twentynineteen/sass/layout/_layout.scss b/content/themes/twentynineteen/sass/layout/_layout.scss new file mode 100644 index 0000000..e0e2c76 --- /dev/null +++ b/content/themes/twentynineteen/sass/layout/_layout.scss @@ -0,0 +1,11 @@ + +/** === Layout === */ + +#page { + width: 100%; +} + +.site-content { + overflow: hidden; +} + diff --git a/content/themes/twentynineteen/sass/media/_captions.scss b/content/themes/twentynineteen/sass/media/_captions.scss new file mode 100644 index 0000000..761eb2f --- /dev/null +++ b/content/themes/twentynineteen/sass/media/_captions.scss @@ -0,0 +1,32 @@ +.wp-caption { + margin-bottom: calc(1.5 * #{$size__spacing-unit}); + + &.aligncenter { + + @include media(tablet) { + position: relative; + left: calc( #{$size__site-tablet-content} / 2 ); + transform: translateX( -50% ); + } + + @include media(desktop) { + left: calc( #{$size__site-desktop-content} / 2 ); + } + } +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-left: auto; + margin-right: auto; +} + +.wp-caption-text { + color: $color__text-light; + font-size: $font__size-xs; + @include font-family( $font__heading ); + line-height: $font__line-height-pre; + margin: 0; + padding: ( $size__spacing-unit * .5 ); + text-align: center; +} diff --git a/content/themes/twentynineteen/sass/media/_galleries.scss b/content/themes/twentynineteen/sass/media/_galleries.scss new file mode 100644 index 0000000..fbc0bb1 --- /dev/null +++ b/content/themes/twentynineteen/sass/media/_galleries.scss @@ -0,0 +1,52 @@ +.gallery { + display: flex; + flex-flow: row wrap; + justify-content: center; + margin-bottom: calc(1.5 * #{$size__spacing-unit}); +} + +.gallery-item { + display: inline-block; + margin-right: 16px; + margin-bottom: 16px; + text-align: center; + vertical-align: top; + width: 100%; + + // Loops to enumerate the classes for gallery columns. + @for $i from 2 through 9 { + .gallery-columns-#{$i} & { + max-width: calc((100% - 16px * #{ $i - 1 }) / #{ $i }); + + &:nth-of-type(#{$i}n+#{$i}) { + margin-right: 0; + } + } + } + + &:last-of-type { + padding-right: 0; + } +} + +.gallery-caption { + display: block; + font-size: $font__size-xs; + @include font-family( $font__heading ); + line-height: $font__line-height-pre; + margin: 0; + padding: ( $size__spacing-unit * .5 ); +} + +.gallery-item > div > a { + display: block; + line-height: 0; + + // Accessibility + box-shadow: 0 0 0 0 transparent; + + &:focus { + box-shadow: 0 0 0 2px rgba( $color__link, 1 ); + } +} + diff --git a/content/themes/twentynineteen/sass/media/_media.scss b/content/themes/twentynineteen/sass/media/_media.scss new file mode 100644 index 0000000..3fba8c6 --- /dev/null +++ b/content/themes/twentynineteen/sass/media/_media.scss @@ -0,0 +1,41 @@ +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +embed, +iframe, +object { + max-width: 100%; +} + +.custom-logo-link { + display: inline-block; +} + +.avatar { + border-radius: 100%; + display: block; + height: calc(2.25 * #{$size__spacing-unit}); + min-height: inherit; + width: calc(2.25 * #{$size__spacing-unit}); +} + +svg { + transition: fill $icon_transition ease-in-out; + fill: currentColor; +} + +/*-------------------------------------------------------------- +## Captions +--------------------------------------------------------------*/ +@import "captions"; + +/*-------------------------------------------------------------- +## Galleries +--------------------------------------------------------------*/ +@import "galleries"; diff --git a/content/themes/twentynineteen/sass/mixins/_mixins-master.scss b/content/themes/twentynineteen/sass/mixins/_mixins-master.scss new file mode 100644 index 0000000..2cb12b3 --- /dev/null +++ b/content/themes/twentynineteen/sass/mixins/_mixins-master.scss @@ -0,0 +1,141 @@ +// Rem output with px fallback +@mixin font-size($sizeValue: 1) { + font-size: ($sizeValue * 16) * 1px; + font-size: $sizeValue * 1rem; +} + +// Center block +@mixin center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +// Clearfix +@mixin clearfix() { + content: ""; + display: table; + table-layout: fixed; +} + +// Clear after (not all clearfix need this also) +@mixin clearfix-after() { + clear: both; +} + +// Column width with margin +@mixin column-width($numberColumns: 3) { + width: map-get($columns, $numberColumns) - (($columns__margin * ($numberColumns - 1)) / $numberColumns); +} + +@mixin filter-duotone { + + &:before { + background: $color__link; + mix-blend-mode: screen; + opacity: 0.1; + z-index: 2; + } + + &:after { + background: $color__link; + mix-blend-mode: multiply; + opacity: .8; + z-index: 3; + + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ + @supports (mix-blend-mode: multiply) { + opacity: 1; + } + } +} + +@mixin filter-grayscale { + + position: relative; + filter: grayscale(100%); + z-index: 1; + + &:after { + display: block; + width: 100%; + height: 100%; + z-index: 10; + } +} + +@mixin post-section-dash { + + &:before { + background: $color__text-light; + content: "\020"; + display: block; + height: 2px; + margin: $size__spacing-unit 0; + width: 1em; + } + + &.has-text-align-center:before { + margin-left: auto; + margin-right: auto; + } + + &.has-text-align-right:before { + margin-left: auto; + } +} + +/* If we add the border using a regular CSS border, it won't look good on non-retina devices, + * since its edges can look jagged due to lack of antialiasing. In this case, we are several + * layers of box-shadow to add the border visually, which will render the border smoother. */ + +@mixin box-shadow( $size ) { + box-shadow: + 0 0 0 $size $color__text-light inset, // Original border. + 0 0 0 ($size + 1px) $color__text-light inset, // Antialiasing, inner edge. + 0 0 1px 0 rgba( $color__text-light, 0.7 ); // Antialiasing, outer edge. +} + +/* Calculates maximum width for post content */ +@mixin postContentMaxWidth() { + + @include media(tablet) { + max-width: $size__site-tablet-content; + } + + @include media(desktop) { + max-width: $size__site-desktop-content; + } +} + +/* Nested sub-menu padding: 10 levels deep */ +@mixin nestedSubMenuPadding() { + + ul { + counter-reset: submenu; + } + + ul > li > a::before { + font-family: $font__body; + font-weight: normal; + content: "\2013\00a0" counters(submenu, "\2013\00a0", none); + counter-increment: submenu + } +} + +/* Ensure all font family declarations come with non-latin fallbacks */ +@mixin font-family( $font_family: $font__body ) { + font-family: $font_family; + @extend %non-latin-fonts; +} + +/* Build our non-latin font styles */ +%non-latin-fonts { + @each $lang, $font__fallback in $font__fallbacks { + &:lang(#{$lang}) { + font-family: unquote( $font__fallback ); + } + } +} + +@import "utilities"; diff --git a/content/themes/twentynineteen/sass/mixins/_utilities.scss b/content/themes/twentynineteen/sass/mixins/_utilities.scss new file mode 100644 index 0000000..c753fe2 --- /dev/null +++ b/content/themes/twentynineteen/sass/mixins/_utilities.scss @@ -0,0 +1,51 @@ + +@mixin media( $res ) { + @if mobile == $res { + @media only screen and (min-width: $mobile_width) { + @content; + } + } + + @if tablet == $res { + @media only screen and (min-width: $tablet_width) { + @content; + } + } + + @if desktop == $res { + @media only screen and (min-width: $desktop_width) { + @content; + } + } + + @if wide == $res { + @media only screen and (min-width: $wide_width) { + @content; + } + } +} + +@mixin link-transition( $attr: color ) { + transition: $attr $link_transition ease-in-out; +} + +@mixin button-transition() { + transition: background $button_transition ease-in-out; +} + +@mixin button-all-transition() { + transition: all $button_transition ease-in-out; +} + +@mixin background-transition() { + transition: background $background_transition ease-in-out; +} + +@mixin selection { + ::-moz-selection { + @content; + } + ::selection { + @content; + } +} diff --git a/content/themes/twentynineteen/sass/modules/_accessibility.scss b/content/themes/twentynineteen/sass/modules/_accessibility.scss new file mode 100644 index 0000000..e911942 --- /dev/null +++ b/content/themes/twentynineteen/sass/modules/_accessibility.scss @@ -0,0 +1,38 @@ +/* Text meant only for screen readers. */ +.screen-reader-text { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute !important; + width: 1px; + word-wrap: normal !important; /* Many screen reader and browser combinations announce broken words as they would appear visually. */ + + &:focus { + background-color: $color__background-screen; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + clip-path: none; + color: $color__text-screen; + display: block; + font-size: 0.875rem; + font-weight: bold; + height: auto; + left: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; /* Above WP toolbar. */ + } +} + +/* Do not show the outline on the skip link target. */ +#content[tabindex="-1"]:focus { + outline: 0; +} diff --git a/content/themes/twentynineteen/sass/modules/_alignments.scss b/content/themes/twentynineteen/sass/modules/_alignments.scss new file mode 100644 index 0000000..2fb584a --- /dev/null +++ b/content/themes/twentynineteen/sass/modules/_alignments.scss @@ -0,0 +1,28 @@ +.alignleft { + /*rtl:ignore*/ + float: left; + /*rtl:ignore*/ + margin-right: $size__spacing-unit; + + @include media(tablet) { + /*rtl:ignore*/ + margin-right: calc(2 * #{$size__spacing-unit}); + } +} + +.alignright { + /*rtl:ignore*/ + float: right; + /*rtl:ignore*/ + margin-left: $size__spacing-unit; + + @include media(tablet) { + /*rtl:ignore*/ + margin-left: calc(2 * #{$size__spacing-unit}); + } +} + +.aligncenter { + clear: both; + @include center-block; +} diff --git a/content/themes/twentynineteen/sass/modules/_clearings.scss b/content/themes/twentynineteen/sass/modules/_clearings.scss new file mode 100644 index 0000000..444b6b6 --- /dev/null +++ b/content/themes/twentynineteen/sass/modules/_clearings.scss @@ -0,0 +1,23 @@ +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.comment-content:before, +.comment-content:after, +.site-header:before, +.site-header:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after { + @include clearfix; +} + +.clear:after, +.entry-content:after, +.comment-content:after, +.site-header:after, +.site-content:after, +.site-footer:after { + @include clearfix-after; +} diff --git a/content/themes/twentynineteen/sass/navigation/_links.scss b/content/themes/twentynineteen/sass/navigation/_links.scss new file mode 100644 index 0000000..cbee457 --- /dev/null +++ b/content/themes/twentynineteen/sass/navigation/_links.scss @@ -0,0 +1,21 @@ +a { + + @include link-transition; + color: $color__link; + + &:visited { + color: $color__link-visited; + } + + &:hover, + &:active { + color: $color__link-hover; + outline: 0; + text-decoration: none; + } + + &:focus { + outline: thin dotted; + text-decoration: underline; + } +} diff --git a/content/themes/twentynineteen/sass/navigation/_menu-footer-navigation.scss b/content/themes/twentynineteen/sass/navigation/_menu-footer-navigation.scss new file mode 100644 index 0000000..afe6971 --- /dev/null +++ b/content/themes/twentynineteen/sass/navigation/_menu-footer-navigation.scss @@ -0,0 +1,22 @@ +/** === Footer menu === */ + +.footer-navigation { + + display: inline; + + & > div { + display: inline; + } + + .footer-menu { + + display: inline; + padding-left: 0; + + li { + display: inline; + margin-right: 1rem; + } + } + +} \ No newline at end of file diff --git a/content/themes/twentynineteen/sass/navigation/_menu-main-navigation.scss b/content/themes/twentynineteen/sass/navigation/_menu-main-navigation.scss new file mode 100644 index 0000000..4bbd9cf --- /dev/null +++ b/content/themes/twentynineteen/sass/navigation/_menu-main-navigation.scss @@ -0,0 +1,506 @@ +/** === Main menu === */ + +.main-navigation { + + display: block; + margin-top: #{0.25 * $size__spacing-unit}; + + body.page & { + display: block; + } + + > div { + display: inline; + } + + /* Un-style buttons */ + button { + display: inline-block; + border: none; + padding: 0; + margin: 0; + font-family: $font__heading; + font-weight: 700; + line-height: $font__line-height-heading; + text-decoration: none; + background: transparent; + color: inherit; + cursor: pointer; + transition: + background 250ms ease-in-out, + transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; + + &:hover, + &:focus { + background: transparent; + } + + &:focus { + outline: 1px solid transparent; + outline-offset: -4px; + } + + &:active { + transform: scale(0.99); + } + } + + .main-menu { + + display: inline-block; + margin: 0; + padding: 0; + + > li { + + color: $color__link; + display: inline; + position: relative; + + > a { + + font-weight: 700; + color: $color__link; + margin-right: #{0.5 * $size__spacing-unit}; + + + svg { + margin-right: #{0.5 * $size__spacing-unit}; + } + + &:hover, + &:hover + svg { + color: $color__link-hover; + } + } + + &.menu-item-has-children { + + display: inline-block; + position: inherit; + + @include media(tablet) { + position: relative; + } + + > a { + margin-right: #{0.125 * $size__spacing-unit}; + } + + & > a, + .menu-item-has-children > a { + + &:after { + content: ""; + display: none; + } + } + + .submenu-expand { + + display: inline-block; + margin-right: #{0.25 * $size__spacing-unit}; + + /* Priority+ Menu */ + &.main-menu-more-toggle { + + position: relative; + height: 24px; + line-height: $font__line-height-heading; + width: 24px; + padding: 0; + margin-left: #{0.5 * $size__spacing-unit}; + + svg { + height: 24px; + width: 24px; + top: #{-0.125 * $size__spacing-unit}; + vertical-align: text-bottom; + } + } + + .wp-customizer-unloading &, + &.is-empty { + display: none; + } + + svg { + position: relative; + top: 0.2rem; + } + } + } + + &:last-child > a, + &:last-child.menu-item-has-children .submenu-expand { + margin-right: 0; + } + } + } + + .sub-menu { + + background-color: $color__link; + color: $color__background-body; + list-style: none; + padding-left: 0; + + position: absolute; + opacity: 0; + left: -9999px; + z-index: 99999; + + @include media(tablet) { + width: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + } + + > li { + + display: block; + float: none; + position: relative; + + &.menu-item-has-children { + + .submenu-expand { + display: inline-block; + position: absolute; + width: calc( 24px + #{$size__spacing-unit} ); + right: 0; + top: calc( .125 * #{$size__spacing-unit} ); + bottom: 0; + color: white; + line-height: 1; + padding: calc( .5 * #{$size__spacing-unit} ); + + svg { + top: 0; + } + } + + .submenu-expand { + margin-right: 0; + } + + @include media(tablet) { + + .menu-item-has-children > a { + + &:after { + content: "\203a"; + } + } + } + } + + > a, + > .menu-item-link-return { + + color: $color__background-body; + display: block; + line-height: $font__line-height-heading; + text-shadow: none; + padding: calc( .5 * #{$size__spacing-unit} ) calc( 24px + #{$size__spacing-unit} ) calc( .5 * #{$size__spacing-unit} ) $size__spacing-unit; + white-space: nowrap; + + &:hover, + &:focus { + background: $color__link-hover; + + &:after { + background: $color__link-hover; + } + } + } + + > .menu-item-link-return { + width: 100%; + font-size: $font__size_base; + font-weight: normal; + text-align: left; + } + + > a:empty { + display: none; + } + + &.mobile-parent-nav-menu-item { + + display: none; + font-size: $font__size-sm; + font-weight: normal; + + svg { + position: relative; + top: 0.2rem; + margin-right: calc( .25 * #{$size__spacing-unit} ); + } + } + } + } + + /* + * Sub-menu styles + * + * :focus-within needs its own selector so other similar + * selectors don’t get ignored if a browser doesn’t recognize it + */ + .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + + + /* Non-mobile position */ + @include media(tablet) { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } + + &.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; + + @include media(tablet) { + right: 0; + left: auto; + display: block; + width: max-content; + } + } + + .submenu-expand { + display: none; + } + + .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + + /* Non-mobile position */ + @include media(tablet) { + float: none; + max-width: 100%; + } + } + + /* Nested sub-menu dashes */ + .sub-menu { + counter-reset: submenu; + } + + .sub-menu > li > a::before { + font-family: $font__body; + font-weight: normal; + content: "\2013\00a0" counters(submenu, "\2013\00a0", none); + counter-increment: submenu + } + } + + .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, + .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, + .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + + + /* Non-mobile position */ + @include media(tablet) { + display: block; + float: none; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } + + &.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; + + @include media(tablet) { + right: 0; + left: auto; + display: table; + width: max-content; + } + } + + .submenu-expand { + display: none; + } + + .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + + /* Non-mobile position */ + @include media(tablet) { + float: none; + max-width: 100%; + } + } + + /* Nested sub-menu dashes */ + .sub-menu { + counter-reset: submenu; + } + + .sub-menu > li > a::before { + font-family: $font__body; + font-weight: normal; + content: "\2013\00a0" counters(submenu, "\2013\00a0", none); + counter-increment: submenu + } + } + + /** + * Fade-in animation for top-level submenus + */ + .main-menu > .menu-item-has-children:not(.off-canvas):hover > .sub-menu { + animation: fade_in 0.1s forwards; + } + + /** + * Off-canvas touch device styles + */ + .main-menu .menu-item-has-children.off-canvas .sub-menu { + + .submenu-expand .svg-icon { + transform: rotate(270deg); + } + + .sub-menu { + opacity: 0; + position: absolute; + z-index: 0; + transform: translateX(-100%); + } + + li:hover, + li:focus, + li > a:hover, + li > a:focus { + background-color: transparent; + } + + > li > a, + > li > .menu-item-link-return { + white-space: inherit; + } + + &.expanded-true { + + display: table; + margin-top: 0; + opacity: 1; + padding-left: 0; + + /* Mobile position */ + left: 0; + top: 0; + right: 0; + bottom: 0; + position: fixed; + z-index: 100000; /* Make sure appears above mobile admin bar */ + width: 100vw; + height: 100vh; + max-width: 100vw; + transform: translateX(+100%); + animation: slide_in_right 0.3s forwards; + + > .mobile-parent-nav-menu-item { + display: block; + } + + /* Prevent menu from being blocked by admin bar */ + .admin-bar & { + top: 46px; + height: calc( 100vh - 46px ); + + .sub-menu.expanded-true { + top: 0; + } + + /* WP core breakpoint */ + @media only screen and ( min-width: 782px ) { + top: 32px; + height: calc( 100vh - 32px ); + + .sub-menu.expanded-true { + top: 0; + } + } + } + } + } + + // Hide duplicate menu-more-link when re-loading a menu in the customizer + .main-menu-more { + &:nth-child(n+3) { + display: none; + } + } + +} + +/* Menu animation */ + +@keyframes slide_in_right { + 100% { + transform: translateX(0%); + } +} + +@keyframes fade_in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} diff --git a/content/themes/twentynineteen/sass/navigation/_menu-social-navigation.scss b/content/themes/twentynineteen/sass/navigation/_menu-social-navigation.scss new file mode 100644 index 0000000..00724b5 --- /dev/null +++ b/content/themes/twentynineteen/sass/navigation/_menu-social-navigation.scss @@ -0,0 +1,66 @@ +/* Social menu */ + +.social-navigation { + margin-top: calc(#{$size__spacing-unit} / 2 ); + text-align: left; + + ul.social-links-menu { + @include clearfix; + + display: inline-block; + margin: 0; + padding: 0; + + li { + display: inline-block; + vertical-align: bottom; + vertical-align: -webkit-baseline-middle; + list-style: none; + + &:nth-child(n+2) { + margin-left: 0.1em; + } + + a { + border-bottom: 1px solid transparent; + display: block; + color: $color__text-main; + margin-bottom: -1px; + transition: opacity $link_transition ease-in-out; + + &:hover, + &:active { + color: $color__text-main; + opacity: 0.6; + } + + &:focus { + color: $color__text-main; + opacity: 1; + border-bottom: 1px solid $color__text-main; + } + + svg { + display: block; + width: 32px; + height: 32px; + + // Prevent icons from jumping in Safari using hardware acceleration. + transform: translateZ(0); + + &#ui-icon-link { + transform: rotate(-45deg); + } + } + } + } + } +} + +.site-title + .social-navigation, +.site-description + .social-navigation { + + @include media(tablet) { + margin-top: calc(#{$size__spacing-unit} / 5 ); + } +} diff --git a/content/themes/twentynineteen/sass/navigation/_navigation.scss b/content/themes/twentynineteen/sass/navigation/_navigation.scss new file mode 100644 index 0000000..a4cf515 --- /dev/null +++ b/content/themes/twentynineteen/sass/navigation/_navigation.scss @@ -0,0 +1,16 @@ +/*-------------------------------------------------------------- +## Links +--------------------------------------------------------------*/ +@import "links"; + +/*-------------------------------------------------------------- +## Menus +--------------------------------------------------------------*/ +@import "menu-main-navigation"; +@import "menu-social-navigation"; +@import "menu-footer-navigation"; + +/*-------------------------------------------------------------- +## Next / Previous +--------------------------------------------------------------*/ +@import "next-previous"; diff --git a/content/themes/twentynineteen/sass/navigation/_next-previous.scss b/content/themes/twentynineteen/sass/navigation/_next-previous.scss new file mode 100644 index 0000000..b2a4c1d --- /dev/null +++ b/content/themes/twentynineteen/sass/navigation/_next-previous.scss @@ -0,0 +1,201 @@ +/* Next/Previous navigation */ + +// Singular navigation +.post-navigation { + + margin: calc(3 * 1rem) 0; + + @include media(tablet) { + margin: calc(3 * 1rem) $size__site-margins; + max-width: calc(6 * (100vw / 12)); + } + + @include media(desktop) { + margin: calc(3 * 1rem) 0; + max-width: 100%; + } + + .nav-links { + + margin: 0 $size__spacing-unit; + max-width: 100%; + display: flex; + flex-direction: column; + + @include media(tablet) { + margin: 0; + } + + @include media(desktop) { + flex-direction: row; + margin: 0 $size__site-margins; + max-width: $size__site-desktop-content; + } + + a { + .meta-nav { + color: $color__text-light; + user-select: none; + + &:before, + &:after { + display: none; + content: "—"; + width: 2em; + color: $color__text-light; + height: 1em; + } + } + + .post-title { + hyphens: auto; + } + + &:hover { + color: $color__link-hover; + } + } + + .nav-previous, + .nav-next { + + @include media(desktop) { + min-width: calc(50% - 2 * #{$size__spacing-unit}); + } + } + + .nav-previous { + order: 2; + + @include media(desktop) { + order: 1; + } + + + .nav-next { + margin-bottom: $size__spacing-unit; + } + + .meta-nav { + &:before { + display: inline; + } + } + } + + .nav-next { + order: 1; + + @include media(desktop) { + order: 2; + padding-left: $size__spacing-unit; + } + + .meta-nav { + &:after { + display: inline; + } + } + } + } +} + +// Index/archive navigation +.pagination { + + .nav-links { + + display: flex; + flex-wrap: wrap; + padding: 0 calc(.5 * #{$size__spacing-unit}); + + + & > * { + padding: calc(.5 * #{$size__spacing-unit}); + + &.dots, + &.prev { + padding-left: 0; + } + + &.dots, + &.next { + padding-right: 0; + } + } + + a:focus { + text-decoration: underline; + outline-offset: -1px; + + &.prev, + &.next { + text-decoration: none; + + .nav-prev-text, + .nav-next-text { + text-decoration: underline; + } + } + } + + .nav-next-text, + .nav-prev-text { + display: none; + } + + @include media(tablet) { + + margin-left: $size__site-margins; + padding: 0; + + .prev, + .next { + + & > * { + display: inline-block; + vertical-align: text-bottom; + } + } + + & > * { + padding: $size__spacing-unit; + } + } + } +} + +// Comments navigation +.comment-navigation { + + .nav-links { + display: flex; + flex-direction: row; + } + + .nav-previous, + .nav-next { + min-width: 50%; + width: 100%; + @include font-family( $font__heading ); + font-weight: bold; + + .secondary-text { + display: none; + + @include media(tablet) { + display: inline; + } + } + + svg { + vertical-align: middle; + position: relative; + margin: 0 -0.35em; + top: -1px; + } + } + + .nav-next { + text-align: right; + } +} diff --git a/content/themes/twentynineteen/sass/site/_site.scss b/content/themes/twentynineteen/sass/site/_site.scss new file mode 100644 index 0000000..692244f --- /dev/null +++ b/content/themes/twentynineteen/sass/site/_site.scss @@ -0,0 +1,27 @@ + +/*-------------------------------------------------------------- +## Header +--------------------------------------------------------------*/ +@import "header/site-header"; +@import "header/site-featured-image"; + +/*-------------------------------------------------------------- +## Posts and pages +--------------------------------------------------------------*/ +@import "primary/posts-and-pages"; + +/*-------------------------------------------------------------- +## Comments +--------------------------------------------------------------*/ +@import "primary/comments"; + +/*-------------------------------------------------------------- +## Archives +--------------------------------------------------------------*/ +@import "primary/archives"; + +/*-------------------------------------------------------------- +## Footer +--------------------------------------------------------------*/ +@import "footer/site-footer"; + diff --git a/content/themes/twentynineteen/sass/site/footer/_site-footer.scss b/content/themes/twentynineteen/sass/site/footer/_site-footer.scss new file mode 100644 index 0000000..4e13794 --- /dev/null +++ b/content/themes/twentynineteen/sass/site/footer/_site-footer.scss @@ -0,0 +1,53 @@ +/* Site footer */ + +#colophon { + + .widget-area, + .site-info { + margin: calc(2 * #{$size__spacing-unit}) $size__spacing-unit; + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins; + } + } + + .widget-column { + display: flex; + flex-wrap: wrap; + .widget { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + width: 100%; + word-wrap: break-word; + @include media(desktop) { + margin-right: calc(3 * #{$size__spacing-unit}); + width: calc(50% - (3 * #{$size__spacing-unit})); + } + } + } + + .site-info { + color: $color__text-light; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-wrap: break-word; + + a { + color: inherit; + + &:hover { + text-decoration: none; + color: $color__link; + } + } + + .imprint, + .privacy-policy-link { + margin-right: $size__spacing-unit; + } + } +} \ No newline at end of file diff --git a/content/themes/twentynineteen/sass/site/header/_site-featured-image.scss b/content/themes/twentynineteen/sass/site/header/_site-featured-image.scss new file mode 100644 index 0000000..5e67aa2 --- /dev/null +++ b/content/themes/twentynineteen/sass/site/header/_site-featured-image.scss @@ -0,0 +1,301 @@ +// Featured image styles + +.site-header.featured-image { + + /* Hide overflow for overflowing featured image */ + overflow: hidden; + + /* Need relative positioning to properly align layers. */ + position: relative; + + /* Add text shadow to text, to increase readability. */ + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); + + /* Set white text color when featured image is set. */ + .site-branding .site-title, + .site-branding .site-description, + .main-navigation a:after, + .main-navigation .main-menu > li.menu-item-has-children:after, + .main-navigation li, + .social-navigation li, + .entry-meta, + .entry-title { + color: $color__background-body; + } + + .main-navigation a, + .main-navigation a + svg, + .social-navigation a, + .site-title a, + .site-featured-image a { + color: $color__background-body; + transition: opacity $link_transition ease-in-out; + + &:hover, + &:active, + &:hover + svg, + &:active + svg { + color: $color__background-body; + opacity: 0.6; + } + + &:focus, + &:focus + svg { + color: $color__background-body; + } + } + + .main-navigation .sub-menu a { + opacity: inherit; + } + + /* add focus state to social media icons */ + .social-navigation a { + &:focus { + color: $color__background-body; + opacity: 1; + border-bottom: 1px solid $color__background-body; + } + } + + .social-navigation svg, + .site-featured-image svg { + /* Use -webkit- only if supporting: Chrome < 54, iOS < 9.3, Android < 4.4.4 */ + -webkit-filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35) ); + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35) ); + } + + /* Entry header */ + .site-featured-image { + + /* First layer: grayscale. */ + .post-thumbnail img { + height: auto; + left: 50%; + max-width: 1000%; + min-height: 100%; + min-width: 100vw; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: auto; + z-index: 1; + + @supports ( object-fit: cover ) { + height: 100%; + left: 0; + object-fit: cover; + top: 0; + transform: none; + width: 100%; + } + + /* When image filters are active, make it grayscale to colorize it blue. */ + .image-filters-enabled & { + filter: grayscale(100%); + } + } + + .entry-header { + + margin-top: calc( 4 * #{$size__spacing-unit}); + margin-bottom: 0; + margin-left: 0; + margin-right: 0; + + @include media (tablet) { + + margin-left: $size__site-margins; + margin-right: $size__site-margins; + } + + .entry-title { + + &:before { + background: $color__background-body; + } + } + + /* Entry meta */ + + .entry-meta { + + font-weight: 500; + + > span { + + margin-right: $size__spacing-unit; + display: inline-block; + + &:last-child { + margin-right: 0; + } + } + + a { + + @include link-transition; + color: currentColor; + + &:hover { + text-decoration: none; + } + } + + .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-right: 0.5em; + } + + .discussion-avatar-list { + display: none; + } + } + + &.has-discussion { + + @include media (tablet) { + + .entry-meta { + display: flex; + position: relative; + } + + .entry-title { + padding-right: calc(1 * (100vw / 12) + #{$size__spacing-unit}); + } + + .entry-meta .comment-count { + position: absolute; + right: 0; + } + + .entry-meta .discussion-avatar-list { + display: block; + position: absolute; + bottom: 100%; + } + } + } + } + } + + /* Custom Logo Link */ + + .custom-logo-link { + + background: $color__background-body; + box-shadow: 0 0 0 0 rgba($color__background-body, 0); + + &:hover, + &:active, + &:focus { + box-shadow: 0 0 0 2px rgba($color__background-body, 1); + } + } + + /* Make sure important elements are above pseudo elements used for effects. */ + .site-branding { + position: relative; + z-index: 10; + } + + .site-featured-image .entry-header { + position: relative; + z-index: 9; + } + + /* Set up image filter layer positioning */ + .site-branding-container:after, + .site-featured-image:before, + .site-featured-image:after, + &:after { + display: block; + position: absolute; + top: 0; left: 0; + content: "\020"; + width: 100%; + height: 100%; + } + + /* Background & Effects */ + /* Shared background settings between pseudo elements. */ + background-position: center; + background-repeat: no-repeat; + background-size: cover; + + /* The intensity of each blend mode is controlled via layer opacity. */ + + /* Second layer: screen. */ + .image-filters-enabled & .site-featured-image:before { + background: $color__link; + mix-blend-mode: screen; + opacity: 0.1; + } + + /* Third layer: multiply. */ + /* When image filters are inactive, a black overlay is added. */ + .site-featured-image:after { + background: #000; + mix-blend-mode: multiply; + opacity: .7; + + /* When image filters are active, a blue overlay is added. */ + .image-filters-enabled & { + background: $color__link; + opacity: .8; + z-index: 3; + + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ + @supports (mix-blend-mode: multiply) { + opacity: 1; + } + } + } + + /* Fourth layer: overlay. */ + .image-filters-enabled & .site-branding-container:after { + background: rgba(0, 0, 0, 0.35); + mix-blend-mode: overlay; + opacity: 0.5; + z-index: 4; + + /* Browsers supporting mix-blend-mode can have a light overlay */ + @supports (mix-blend-mode: overlay) { + background: rgba($color__background-body, 0.35); + } + } + + /* Fifth layer: readability overlay */ + &:after { + background: #000; + /** + * Add a transition to the readability overlay, to add a subtle + * but smooth effect when resizing the screen. + */ + transition: opacity 1200ms ease-in-out; + opacity: 0.7; + z-index: 5; + + /* When image filters are active, a blue overlay is added. */ + .image-filters-enabled & { + background: mix($color__link, black, 12%); + opacity: 0.38; + + @include media(tablet) { + opacity: 0.18; + } + } + } + + + ::-moz-selection { + background: rgba($color__background-body, 0.17); + } + + ::selection { + background: rgba($color__background-body, 0.17); + } +} diff --git a/content/themes/twentynineteen/sass/site/header/_site-header.scss b/content/themes/twentynineteen/sass/site/header/_site-header.scss new file mode 100644 index 0000000..3f723ba9 --- /dev/null +++ b/content/themes/twentynineteen/sass/site/header/_site-header.scss @@ -0,0 +1,139 @@ +// Site header + +.site-header { + padding: 1em; + + &.featured-image { + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 90vh; + + .site-branding-container { + margin-bottom: auto; + } + } + + @include media(tablet) { + margin: 0; + padding: 3rem 0; + + &.featured-image { + min-height: 100vh; + margin-bottom: 3rem; + } + } +} + +// Site branding + +.site-branding { + + color: $color__text-light; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + position: relative; + word-wrap: break-word; + + @include media(tablet) { + margin: 0 $size__site-margins; + } +} + +// Site logo + +.site-logo { + + position: relative; + z-index: 999; + margin-bottom: calc(.66 * #{$size__spacing-unit}); + + @include media(tablet) { + margin-bottom: 0; + position: absolute; + right: calc(100% + (1.25 * #{$size__spacing-unit})); + top: 4px; // Accounts for box-shadow widths + z-index: 999; + } + + .custom-logo-link { + border-radius: 100%; + box-sizing: content-box; + box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); + display: block; + width: 50px; + height: 50px; + overflow: hidden; + transition: box-shadow $background_transition ease-in-out; + + .custom-logo { + min-height: inherit; + } + + &:hover, + &:active, + &:focus { + box-shadow: 0 0 0 2px rgba(0, 0, 0, 1); + } + + @include media(tablet) { + width: 64px; + height: 64px; + } + } +} + +// Site title + +.site-title { + margin: auto; + display: inline; + color: $color__text-main; + + a { + color: $color__text-main; + + &:link, + &:visited { + color: $color__text-main; + } + + &:hover { + color: $color__text-hover; + } + } + + .featured-image & { + margin: 0; + + @include media(tablet) { + display: inline-block; + } + } + + /* When there is no description set, make sure navigation appears below title. */ + + .main-navigation { + display: block; + } + + @include media(tablet) { + display: inline; + } + + &:not(:empty) + .site-description:not(:empty):before { + content: "\2014"; + margin: 0 .2em; + } +} + +// Site description + +.site-description { + + display: inline; + color: $color__text-light; + font-weight: normal; + margin: 0; +} diff --git a/content/themes/twentynineteen/sass/site/primary/_archives.scss b/content/themes/twentynineteen/sass/site/primary/_archives.scss new file mode 100644 index 0000000..a3cb801 --- /dev/null +++ b/content/themes/twentynineteen/sass/site/primary/_archives.scss @@ -0,0 +1,65 @@ +.archive .page-header, +.search .page-header, +.error404 .page-header { + + margin: $size__spacing-unit $size__spacing-unit calc(3 * #{$size__spacing-unit}); + + @include media(tablet) { + margin: 0 $size__site-margins calc(3 * #{$size__spacing-unit}); + } + + .page-title { + + color: $color__text-light; + display: inline; + letter-spacing: normal; + + &:before { + display: none; + } + } + + .search-term, + .page-description { + display: inherit; + clear: both; + } +} + +.archive .page-header .page-description, +.search .page-header .page-description { + display: block; + color: $color__text-main; + font-size: 1em; +} + +.hfeed .entry .entry-header { + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins calc(#{ $size__spacing-unit } / 2); + } +} + +/* 404 & Not found */ + +.error-404.not-found, +.no-results.not-found { + + .page-content { + + margin: calc(3 * #{$size__spacing-unit}) #{$size__spacing-unit}; + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins calc(#{ $size__spacing-unit } / 2); + } + } + + .search-submit { + vertical-align: middle; + margin: $size__spacing-unit 0; + } + + .search-field { + width: 100%; + } +} diff --git a/content/themes/twentynineteen/sass/site/primary/_comments.scss b/content/themes/twentynineteen/sass/site/primary/_comments.scss new file mode 100644 index 0000000..ec9fb12 --- /dev/null +++ b/content/themes/twentynineteen/sass/site/primary/_comments.scss @@ -0,0 +1,405 @@ +.comment-content a { + word-wrap: break-word; +} + +.bypostauthor { + display: block; +} + +.comments-area { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + margin: calc(2 * #{$size__spacing-unit}) $size__spacing-unit; + word-wrap: break-word; + @include postContentMaxWidth(); + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins; + } + + & > * { + margin-top: calc(2 * #{$size__spacing-unit}); + margin-bottom: calc(2 * #{$size__spacing-unit}); + + @include media(tablet) { + margin-top: calc(3 * #{$size__spacing-unit}); + margin-bottom: calc(3 * #{$size__spacing-unit}); + } + } + + /* Add extra margin when the comments section is located immediately after the + * post itself (this happens on pages). + */ + .entry + & { + margin-top: calc(3 * #{$size__spacing-unit}); + } + + .comments-title-wrap { + + @include media(tablet) { + align-items: baseline; + display: flex; + justify-content: space-between; + } + + .comments-title { + @include post-section-dash; + margin: 0; + + @include media(tablet) { + flex: 1 0 calc(3 * (100vw / 12)); + } + } + + .discussion-meta { + @include media(tablet) { + flex: 0 0 calc(2 * (100vw / 12)); + margin-left: #{$size__spacing-unit}; + } + } + } +} + +#comment { + max-width: 100%; + box-sizing: border-box; +} + +#respond { + position: relative; + + .comment-user-avatar { + margin: $size__spacing-unit 0 -#{$size__spacing-unit}; + } + + .comment .comment-form { + padding-left: 0; + } + + > small { + display: block; + font-size: $font__size_base; + position: absolute; + left: calc(#{$size__spacing-unit} + 100%); + top: calc(-3.5 * #{$size__spacing-unit}); + width: calc(100vw / 12 ); + } +} + +#comments { + + > .comments-title:last-child { + display: none; + } +} + +.comment-form-flex { + display: flex; + flex-direction: column; + + .comments-title { + display: none; + margin: 0; + order: 1; + } + + #respond { + order: 2; + + + .comments-title { + display: block; + } + } +} + +.comment-list { + list-style: none; + padding: 0; + + .children { + margin: 0; + padding: 0 0 0 $size__spacing-unit; + } + + > .comment:first-child { + margin-top: 0; + } + + .pingback, + .trackback { + + .comment-body { + color: $color__text-light; + @include font-family( $font__heading ); + font-size: $font__size-xs; + font-weight: 500; + margin-top: $size__spacing-unit; + margin-bottom: $size__spacing-unit; + + a:not(.comment-edit-link) { + font-weight: bold; + font-size: $font__size-base / (1 * $font__size-ratio); + line-height: 1.5; + padding-right: #{0.5 * $size__spacing-unit}; + display: block; + } + + .comment-edit-link { + color: $color__text-light; + @include font-family( $font__heading ); + font-weight: 500; + } + } + } +} + +.comment-reply { + + #respond + & { + display: none; + } + + .comment-reply-link { + display: inline-block; + } +} + +.comment { + list-style: none; + position: relative; + + @include media(tablet) { + padding-left: calc(.5 * (#{$size__spacing-unit} + calc(100vw / 12 ))); + + &.depth-1, + .children { + padding-left: 0; + } + + &.depth-1 { + margin-left: calc(3.25 * #{$size__spacing-unit}); + } + } + + .comment-body { + margin: calc(2 * #{$size__spacing-unit}) 0 0; + } + + + .comment-meta { + position: relative; + } + + .comment-author { + + .avatar { + float: left; + margin-right: $size__spacing-unit; + position: relative; + + @include media(tablet) { + float: inherit; + margin-right: inherit; + position: absolute; + top: 0; + right: calc(100% + #{$size__spacing-unit}); + } + } + + .fn { + position: relative; + display: block; + + a { + color: inherit; + + &:hover { + color: $color__link-hover; + } + } + } + + .post-author-badge { + border-radius: 100%; + display: block; + height: 18px; + position: absolute; + background: lighten( $color__link, 8% ); + right: calc(100% - #{$size__spacing-unit * 2.5}); + top: -3px; + width: 18px; + + @include media(tablet) { + right: calc(100% + #{$size__spacing-unit * .75}); + } + + svg { + width: inherit; + height: inherit; + display: block; + fill: white; + transform: scale(0.875); + } + } + } + + .comment-metadata { + + > a, + .comment-edit-link { + display: inline; + font-weight: 500; + color: $color__text-light; + vertical-align: baseline; + + time { + vertical-align: baseline; + } + + &:hover { + color: $color__link-hover; + text-decoration: none; + } + } + + > * { + display: inline-block; + } + + .edit-link-sep { + color: $color__text-light; + margin: 0 0.2em; + vertical-align: baseline; + } + + .edit-link { + color: $color__text-light; + + svg { + transform: scale(0.8); + vertical-align: baseline; + margin-right: 0.1em; + } + } + + .comment-edit-link { + position: relative; + padding-left: $size__spacing-unit; + margin-left: -#{$size__spacing-unit}; + z-index: 1; + + &:hover { + color: $color__link; + } + } + } + + .comment-content { + + margin: $size__spacing-unit 0; + + @include media(desktop) { + padding-right: $size__spacing-unit; + } + + > *:first-child { + margin-top: 0; + } + + > *:last-child { + margin-bottom: 0; + } + + blockquote { + margin-left: 0; + } + + a { + text-decoration: underline; + + &:hover { + text-decoration: none; + } + } + } +} + +.comment-reply-link, +#cancel-comment-reply-link { + font-weight: 500; + + &:hover { + color: $color__link-hover; + } +} + +.discussion-avatar-list { + @include clearfix; + + margin: 0; + padding: 0; + + li { + position: relative; + list-style: none; + margin: 0 -8px 0 0; + padding: 0; + float: left; + } + + .comment-user-avatar { + + img { + height: calc(1.5 * #{$size__spacing-unit}); + width: calc(1.5 * #{$size__spacing-unit}); + } + } +} + +.discussion-meta { + + .discussion-meta-info { + margin: 0; + + .svg-icon { + vertical-align: middle; + fill: currentColor; + transform: scale( 0.6 ) scaleX(-1) translateY(-0.1em); + margin-left: -#{.25 * $size__spacing-unit}; // Align icon with avatars above. + } + } + +} + +.comment-form { + + .comment-notes, + label { + @include font-family( $font__heading ); + font-size: $font__size-xs; + color: $color__text-light; + } + + .comment-form-author, + .comment-form-email { + @include media(tablet) { + width: calc(50% - #{$size__spacing-unit / 2}); + float: left; + } + } + + .comment-form-email { + @include media(tablet) { + margin-left: $size__spacing-unit; + } + } + + input[name="author"], + input[name="email"], + input[name="url"] { + display: block; + width: 100%; + } +} diff --git a/content/themes/twentynineteen/sass/site/primary/_posts-and-pages.scss b/content/themes/twentynineteen/sass/site/primary/_posts-and-pages.scss new file mode 100644 index 0000000..ce1c6f2 --- /dev/null +++ b/content/themes/twentynineteen/sass/site/primary/_posts-and-pages.scss @@ -0,0 +1,304 @@ +.sticky { + display: block; +} + +.sticky-post { + background: $color__background-button; + color: #fff; + display: inline-block; + font-weight: bold; + line-height: 1; + padding: .25rem; + position: absolute; + text-transform: uppercase; + top: -$size__spacing-unit; + z-index: 1; +} + +.updated:not(.published) { + display: none; +} + +.page-links { + clear: both; + margin: 0 0 calc(1.5 * #{$size__spacing-unit}); +} + +.entry { + + margin-top: calc(6 * #{$size__spacing-unit}); + + &:first-of-type { + margin-top: 0; + } + + .entry-header { + + margin: calc(3 * #{ $size__spacing-unit}) $size__spacing-unit $size__spacing-unit; + position: relative; + + @include media(tablet) { + margin: calc(3 * #{ $size__spacing-unit}) $size__site-margins $size__spacing-unit; + } + } + + .entry-title { + + @include post-section-dash; + margin: 0; + + a { + color: inherit; + + &:hover { + color: $color__text-hover; + } + } + } + + .entry-meta, + .entry-footer { + + color: $color__text-light; + font-weight: 500; + + > span { + + margin-right: $size__spacing-unit; + display: inline-block; + + &:last-child { + margin-right: 0; + } + } + + a { + + @include link-transition; + color: currentColor; + + &:hover { + text-decoration: none; + color: $color__link; + } + } + + .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-right: 0.5em; + } + } + + .entry-meta { + margin: $size__spacing-unit 0; + } + + .entry-footer { + + margin: calc(2 * #{$size__spacing-unit}) $size__spacing-unit $size__spacing-unit; + + @include media(tablet) { + margin: $size__spacing-unit $size__site-margins calc(3 * #{$size__spacing-unit}); + max-width: $size__site-tablet-content; + } + + @include media(tablet) { + max-width: $size__site-desktop-content; + } + } + + .post-thumbnail { + + margin: $size__spacing-unit; + + @include media(tablet) { + margin: $size__spacing-unit $size__site-margins; + } + + &:focus { + outline: none; + } + + .post-thumbnail-inner { + display: block; + + img { + position: relative; + display: block; + width: 100%; + } + } + } + + .image-filters-enabled & { + + .post-thumbnail { + position: relative; + display: block; + + .post-thumbnail-inner { + filter: grayscale(100%); + + &:after { + background: rgba(0, 0, 0, 0.35); + content: ""; + display: block; + height: 100%; + opacity: .5; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; + z-index: 4; + + @supports (mix-blend-mode: multiply) { + display: none; + } + } + } + + &:before, + &:after { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; left: 0; + content: "\020"; + pointer-events: none; + } + + @include filter-duotone; + + } + } + + .entry-content, + .entry-summary { + max-width: calc(100% - (2 * #{ $size__spacing-unit })); + margin: 0 $size__spacing-unit; + + @include media(tablet) { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } + } + + .entry-content { + + p { + word-wrap: break-word; + } + + .more-link { + @include link-transition; + display: inline; + color: inherit; + + &:after { + content: "\02192"; + display: inline-block; + margin-left: 0.5em; + } + + &:hover { + color: $color__link; + text-decoration: none; + } + } + + a { + text-decoration: underline; + + &.button, + &:hover { + text-decoration: none; + } + + &.button { + display: inline-block; + } + + &.button:hover { + background: $color__background-button-hover; + color: $color__background-body; + cursor: pointer; + } + } + + // Overwrite iframe embeds that have inline styles. + > iframe[style] { + + margin: 32px 0 !important; + max-width: 100% !important; + + @include media(tablet) { + max-width: $size__site-tablet-content !important; + } + + @include media(desktop) { + max-width: $size__site-desktop-content !important; + } + } + + // Page links + .page-links a { + margin: calc(0.5 * #{$size__spacing-unit}); + text-decoration: none; + } + + // Classic editor audio embeds. + .wp-audio-shortcode { + max-width: calc(100vw - (2 * #{ $size__spacing-unit })); + + @include media(tablet) { + max-width: $size__site-tablet-content; + } + + @include media(desktop) { + max-width: $size__site-desktop-content; + } + } + } +} + +/* Author description */ + +.author-bio { + margin: calc(2 * #{$size__spacing-unit}) $size__spacing-unit $size__spacing-unit; + + @include postContentMaxWidth(); + + @include media(tablet) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins; + } + + @include media(desktop) { + margin: calc(3 * #{$size__spacing-unit}) $size__site-margins; + } + + .author-title { + @include post-section-dash; + display: inline; + } + + .author-description { + + display: inline; + color: $color__text-light; + font-size: $font__size-md; + line-height: $font__line-height-heading; + + .author-link { + display: inline-block; + + &:hover { + color: $color__link-hover; + text-decoration: none; + } + } + } +} diff --git a/content/themes/twentynineteen/sass/site/secondary/_widgets.scss b/content/themes/twentynineteen/sass/site/secondary/_widgets.scss new file mode 100644 index 0000000..9447d42 --- /dev/null +++ b/content/themes/twentynineteen/sass/site/secondary/_widgets.scss @@ -0,0 +1,106 @@ +.widget { + margin: 0 0 #{$size__spacing-unit}; + + .widget-title { + font-size: $font__size-lg; + } + + /* Make sure select elements fit in widgets. */ + select { + max-width: 100%; + } + + a { + color: $color__link; + + &:hover { + color: $color__link-hover; + } + } +} + +.widget_archive, +.widget_categories, +.widget_meta, +.widget_nav_menu, +.widget_pages, +.widget_recent_comments, +.widget_recent_entries, +.widget_rss { + + ul { + padding: 0; + list-style: none; + + li { + color: $color__text-light; + @include font-family( $font__heading ); + font-size: calc(#{$font__size_base} * #{$font__size-ratio}); + font-weight: 700; + line-height: $font__line-height-heading; + margin-top: #{0.5 * $size__spacing-unit}; + margin-bottom: #{0.5 * $size__spacing-unit}; + } + + @include nestedSubMenuPadding(); + } +} + +.widget_tag_cloud { + + .tagcloud { + @include font-family( $font__heading ); + font-weight: 700; + } +} + + +.widget_search { + + .search-field { + width: 100%; + + @include media(mobile) { + width: auto; + } + } + + .search-submit { + display: block; + margin-top: $size__spacing-unit; + } +} + +.widget_calendar .calendar_wrap { + text-align: center; + + table td, + table th { + border: none; + } + + a { + text-decoration: underline; + } + + .wp-calendar-table { + margin-bottom: 0; + } + + .wp-calendar-nav { + margin: 0 0 $size__spacing-unit; + display: table; + width: 100%; + @include font-family( $font__heading ); + + span { + display: table-cell; + padding: 0.5em; + } + } + + .wp-calendar-nav-prev, + .wp-calendar-nav-next { + width: 40%; + } +} \ No newline at end of file diff --git a/content/themes/twentynineteen/sass/typography/_copy.scss b/content/themes/twentynineteen/sass/typography/_copy.scss new file mode 100644 index 0000000..bfbd0fe --- /dev/null +++ b/content/themes/twentynineteen/sass/typography/_copy.scss @@ -0,0 +1,62 @@ +p { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + + cite { + font-size: $font__size-xs; + font-style: normal; + @include font-family( $font__heading ); + } +} + +pre { + font-size: $font__size-sm; + font-family: $font__pre; + line-height: $font__line-height-body; + overflow: auto; +} + +code, +kbd, +tt, +var { + font-size: $font__size-sm; + font-family: $font__code; +} + +abbr, acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #fff9c0; + text-decoration: none; +} + +big { + font-size: 125%; +} + +a { + text-decoration: none; + + &:hover { + text-decoration: none; + } + + &:focus { + text-decoration: underline; + } +} diff --git a/content/themes/twentynineteen/sass/typography/_headings.scss b/content/themes/twentynineteen/sass/typography/_headings.scss new file mode 100644 index 0000000..21ea2e4 --- /dev/null +++ b/content/themes/twentynineteen/sass/typography/_headings.scss @@ -0,0 +1,164 @@ +.author-description .author-link, +.comment-metadata, +.comment-reply-link, +.comments-title, +.comment-author .fn, +.discussion-meta-info, +.entry-meta, +.entry-footer, +.main-navigation, +.no-comments, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.page-links, +.page-description, +.pagination .nav-links, +.sticky-post, +.site-title, +.site-info, +#cancel-comment-reply-link, +h1, +h2, +h3, +h4, +h5, +h6 { + @include font-family( $font__heading ); +} + +.main-navigation, +.page-description, +.author-description .author-link, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.pagination .nav-links, +.comments-title, +.comment-author .fn, +.no-comments, +.site-title, +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 700; + letter-spacing: -0.02em; + line-height: $font__line-height-heading; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.page-title { + @include font-family( $font__body ); +} + +.site-branding, +.main-navigation ul.main-menu > li, +.social-navigation, +.author-description .author-bio, +.nav-links { + line-height: 1.25; +} + +h1 { + font-size: $font__size-xl; + + @include media(tablet) { + font-size: $font__size-xxl; + } +} + +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.has-larger-font-size, +h2 { + font-size: $font__size-lg; + + @include media(tablet) { + font-size: $font__size-xl; + } +} + +.has-regular-font-size, +.has-large-font-size, +.comments-title, +h3 { + font-size: $font__size-lg; +} + +.site-title, +.site-description, +.main-navigation, +.nav-links, +.page-title, +.page-description, +.comment-author .fn, +.no-comments, +h2.author-title, +p.author-bio, +h4 { + font-size: $font__size-md; +} + +.pagination .nav-links, +.comment-content, +h5 { + font-size: $font__size-sm; +} + +.entry-meta, +.entry-footer, +.discussion-meta-info, +.site-info, +.has-small-font-size, +.comment-reply-link, +.comment-metadata, +.comment-notes, +.sticky-post, +#cancel-comment-reply-link, +img:after, +h6 { + font-size: $font__size-xs; +} + +.site-title, +.page-title { + font-weight: normal; +} + +.page-description, +.page-links a { + font-weight: bold; +} + +.site-description { + letter-spacing: -0.01em; +} + +.post-navigation .post-title, +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.comments-title, +blockquote { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-break: break-word; + word-wrap: break-word; +} + +/* Do not hyphenate entry title on tablet view and bigger. */ +.entry-title { + @include media(tablet) { + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + } +} diff --git a/content/themes/twentynineteen/sass/typography/_typography.scss b/content/themes/twentynineteen/sass/typography/_typography.scss new file mode 100644 index 0000000..055b7a6 --- /dev/null +++ b/content/themes/twentynineteen/sass/typography/_typography.scss @@ -0,0 +1,32 @@ + +html { + font-size: $font__size_base; +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: $color__text-main; + @include font-family( $font__body ); + font-weight: 400; + font-size: 1em; + line-height: $font__line-height-body; + margin: 0; + text-rendering: optimizeLegibility; +} + +button, +input, +select, +optgroup, +textarea { + color: $color__text-main; + @include font-family( $font__body ); + font-weight: 400; + line-height: $font__line-height-body; + text-rendering: optimizeLegibility; +} + +@import "headings"; + +@import "copy"; diff --git a/content/themes/twentynineteen/sass/variables-site/_colors.scss b/content/themes/twentynineteen/sass/variables-site/_colors.scss new file mode 100644 index 0000000..989daa0 --- /dev/null +++ b/content/themes/twentynineteen/sass/variables-site/_colors.scss @@ -0,0 +1,34 @@ + +// Backgrounds +$color__background-body: #fff; +$color__background-input: #fff; +$color__background-screen: #f1f1f1; +$color__background-hr: #ccc; +$color__background-button: #0073aa; +$color__background-button-hover: #111; +$color__background-pre: #eee; +$color__background-ins: #fff9c0; +$color__background_selection: mix( $color__background-body, $color__background-button, 75% ); // lighten( salmon, 22.5% ); // lighten( #0999d4, 48% ); + +// Text +$color__text-main: #111; +$color__text-light: #767676; +$color__text-hover: lighten( #111, 22.5% ); +$color__text-screen: #21759b; +$color__text-input: #666; +$color__text-input-focus: #111; + +// Links +$color__link: #0073aa; +$color__link-visited: #0073aa; +$color__link-hover: darken( $color__link, 10% ); + +// Borders +$color__border: #ccc; +$color__border-link: #0073aa; +$color__border-link-hover: darken( $color__link, 10% ); +$color__border-button: #ccc #ccc #bbb; +$color__border-button-hover: #ccc #bbb #aaa; +$color__border-button-focus: #aaa #bbb #bbb; +$color__border-input: $color__border; +$color__border-abbr: #666; diff --git a/content/themes/twentynineteen/sass/variables-site/_columns.scss b/content/themes/twentynineteen/sass/variables-site/_columns.scss new file mode 100644 index 0000000..6bd29bc --- /dev/null +++ b/content/themes/twentynineteen/sass/variables-site/_columns.scss @@ -0,0 +1,16 @@ +$columns: ( + 1: calc(1 * (100vw / 12)), + 2: calc(2 * (100vw / 12)), + 3: calc(3 * (100vw / 12)), + 4: calc(4 * (100vw / 12)), + 5: calc(5 * (100vw / 12)), + 6: calc(6 * (100vw / 12)), + 7: calc(7 * (100vw / 12)), + 8: calc(8 * (100vw / 12)), + 9: calc(9 * (100vw / 12)), + 10: calc(10 * (100vw / 12)), + 11: calc(11 * (100vw / 12)), + 12: calc(12 * (100vw / 12)) +); + +$columns__margin: $size__spacing-unit; diff --git a/content/themes/twentynineteen/sass/variables-site/_fonts.scss b/content/themes/twentynineteen/sass/variables-site/_fonts.scss new file mode 100644 index 0000000..59ab20b --- /dev/null +++ b/content/themes/twentynineteen/sass/variables-site/_fonts.scss @@ -0,0 +1,83 @@ +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the Classic and block + * editors. The following font-face override fixes the issue by manually inserting + * a custom font that includes just a Hoefler Text space replacement for that + * character instead. + */ +@font-face { + font-family: 'NonBreakingSpaceOverride'; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format('woff2'), + url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format('woff'); + +} + +// Font and typographic variables + +$font__body: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; +$font__heading: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +$font__fallbacks: ( + /* Arabic */ + ar: 'Tahoma, Arial, sans-serif', + ary: 'Tahoma, Arial, sans-serif', + azb: 'Tahoma, Arial, sans-serif', + ckb: 'Tahoma, Arial, sans-serif', + fa-IR: 'Tahoma, Arial, sans-serif', + haz: 'Tahoma, Arial, sans-serif', + ps: 'Tahoma, Arial, sans-serif', + /* Cyrillic */ + be: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + bg-BG: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + kk: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + mk-MK: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + mn: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + ru-RU: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + sah: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + sr-RS: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + tt-RU: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + uk: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif', + /* Chinese (Hong Kong) */ + zh-HK: '-apple-system, BlinkMacSystemFont, "PingFang HK", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif', + /* Chinese (Taiwan) */ + zh-TW: '-apple-system, BlinkMacSystemFont, "PingFang TC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif', + /* Chinese (China) */ + zh-CN: '-apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif', + /* Devanagari */ + bn-BD: 'Arial, sans-serif', + hi-IN: 'Arial, sans-serif', + mr: 'Arial, sans-serif', + ne-NP: 'Arial, sans-serif', + /* Greek */ + el: '"Helvetica Neue", Helvetica, Arial, sans-serif', + /* Gujarati */ + gu: 'Arial, sans-serif', + /* Hebrew */ + he-IL: '"Arial Hebrew", Arial, sans-serif', + /* Japanese */ + ja: '-apple-system, BlinkMacSystemFont, "Hiragino Sans", Meiryo, "Helvetica Neue", sans-serif', + /* Korean */ + ko-KR: '"Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif', + /* Thai */ + th: '"Sukhumvit Set", "Helvetica Neue", helvetica, arial, sans-serif', + /* Vietnamese */ + vi: '"Libre Franklin", sans-serif', +); +$font__code: Menlo, monaco, Consolas, Lucida Console, monospace; +$font__pre: "Courier 10 Pitch", Courier, monospace; + +$font__size_base: 22px; +$font__size-ratio: 1.125; + +$font__size-xxs: 1em / (1.5 * $font__size-ratio); +$font__size-xs: 1em / (1.25 * $font__size-ratio); +$font__size-sm: 1em / (1 * $font__size-ratio); +$font__size-md: 1em * (1 * $font__size-ratio); +$font__size-lg: 1em * (1.5 * $font__size-ratio); +$font__size-xl: 1em * (2 * $font__size-ratio); +$font__size-xxl: 1em * (2.5 * $font__size-ratio); +$font__size-xxxl: 1em * (3 * $font__size-ratio); + +$font__line-height-body: 1.8; +$font__line-height-pre: 1.6; +$font__line-height-heading: 1.2; +$font__line-height-double: 2 * $font__line-height-heading; \ No newline at end of file diff --git a/content/themes/twentynineteen/sass/variables-site/_structure.scss b/content/themes/twentynineteen/sass/variables-site/_structure.scss new file mode 100644 index 0000000..dc62145 --- /dev/null +++ b/content/themes/twentynineteen/sass/variables-site/_structure.scss @@ -0,0 +1,16 @@ +// Responsive widths. + +$size__spacing-unit: 1rem; +$size__site-main: 100%; +$size__site-sidebar: 25%; +$size__site-margins: calc(10% + 60px); +$size__site-tablet-content: calc(8 * (100vw / 12) - 28px); +$size__site-desktop-content: calc(6 * (100vw / 12) - 28px); + +// Responsive widths. + +$mobile_width: 600px; +$tablet_width: 768px; +$desktop_width: 1168px; +$wide_width: 1379px; + diff --git a/content/themes/twentynineteen/sass/variables-site/_transitions.scss b/content/themes/twentynineteen/sass/variables-site/_transitions.scss new file mode 100644 index 0000000..f0eebbd --- /dev/null +++ b/content/themes/twentynineteen/sass/variables-site/_transitions.scss @@ -0,0 +1,6 @@ +// Transition timeouts. + +$link_transition: 110ms; +$icon_transition: 120ms; +$button_transition: 150ms; +$background_transition: 200ms; \ No newline at end of file diff --git a/content/themes/twentynineteen/sass/variables-site/_variables-site.scss b/content/themes/twentynineteen/sass/variables-site/_variables-site.scss new file mode 100644 index 0000000..9d527f9 --- /dev/null +++ b/content/themes/twentynineteen/sass/variables-site/_variables-site.scss @@ -0,0 +1,5 @@ +@import "colors"; +@import "fonts"; +@import "structure"; +@import "columns"; +@import "transitions"; diff --git a/content/themes/twentynineteen/screenshot.png b/content/themes/twentynineteen/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc53c5f1dd491737726a367be64577af426a106 GIT binary patch literal 175535 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 literal 0 HcmV?d00001 diff --git a/content/themes/twentynineteen/search.php b/content/themes/twentynineteen/search.php new file mode 100644 index 0000000..af9d265 --- /dev/null +++ b/content/themes/twentynineteen/search.php @@ -0,0 +1,56 @@ + + +
+
+ + + + + + +
+
+ + + +
+
+ + sprintf( __( 'Published in%s', 'twentynineteen' ), '%title' ), + ) + ); + } elseif ( is_singular( 'post' ) ) { + // Previous/next post navigation. + the_post_navigation( + array( + 'next_text' => ' ' . + '' . __( 'Next post:', 'twentynineteen' ) . '
' . + '%title', + 'prev_text' => ' ' . + '' . __( 'Previous post:', 'twentynineteen' ) . '
' . + '%title', + ) + ); + } + + // If comments are open or we have at least one comment, load up the comment template. + if ( comments_open() || get_comments_number() ) { + comments_template(); + } + + endwhile; // End the loop. + ?> + +
+
+ + a:lang(ar), +.wp-block-categories li > a:lang(ar), +.wp-block-latest-posts li > a:lang(ar), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ar), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ar), .wp-caption dd:lang(ar), .wp-block-freeform blockquote cite:lang(ar) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ary), h1:lang(ary), +h2:lang(ary), +h3:lang(ary), +h4:lang(ary), +h5:lang(ary), +h6:lang(ary), figcaption:lang(ary), +.gallery-caption:lang(ary), .editor-post-title__block .editor-post-title__input:lang(ary), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ary), .wp-block-paragraph.has-drop-cap:lang(ary):not(:focus)::first-letter, .wp-block-table:lang(ary), .wp-block-cover h2:lang(ary), +.wp-block-cover .wp-block-cover-text:lang(ary), .wp-block-button .wp-block-button__link:lang(ary), .wp-block-quote cite:lang(ary), +.wp-block-quote footer:lang(ary), +.wp-block-quote .wp-block-quote__citation:lang(ary), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ary), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ary), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ary), .wp-block-file:lang(ary), ul.wp-block-archives li > a:lang(ary), +.wp-block-categories li > a:lang(ary), +.wp-block-latest-posts li > a:lang(ary), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ary), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ary), .wp-caption dd:lang(ary), .wp-block-freeform blockquote cite:lang(ary) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(azb), h1:lang(azb), +h2:lang(azb), +h3:lang(azb), +h4:lang(azb), +h5:lang(azb), +h6:lang(azb), figcaption:lang(azb), +.gallery-caption:lang(azb), .editor-post-title__block .editor-post-title__input:lang(azb), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(azb), .wp-block-paragraph.has-drop-cap:lang(azb):not(:focus)::first-letter, .wp-block-table:lang(azb), .wp-block-cover h2:lang(azb), +.wp-block-cover .wp-block-cover-text:lang(azb), .wp-block-button .wp-block-button__link:lang(azb), .wp-block-quote cite:lang(azb), +.wp-block-quote footer:lang(azb), +.wp-block-quote .wp-block-quote__citation:lang(azb), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(azb), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(azb), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(azb), .wp-block-file:lang(azb), ul.wp-block-archives li > a:lang(azb), +.wp-block-categories li > a:lang(azb), +.wp-block-latest-posts li > a:lang(azb), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(azb), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(azb), .wp-caption dd:lang(azb), .wp-block-freeform blockquote cite:lang(azb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ckb), h1:lang(ckb), +h2:lang(ckb), +h3:lang(ckb), +h4:lang(ckb), +h5:lang(ckb), +h6:lang(ckb), figcaption:lang(ckb), +.gallery-caption:lang(ckb), .editor-post-title__block .editor-post-title__input:lang(ckb), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ckb), .wp-block-paragraph.has-drop-cap:lang(ckb):not(:focus)::first-letter, .wp-block-table:lang(ckb), .wp-block-cover h2:lang(ckb), +.wp-block-cover .wp-block-cover-text:lang(ckb), .wp-block-button .wp-block-button__link:lang(ckb), .wp-block-quote cite:lang(ckb), +.wp-block-quote footer:lang(ckb), +.wp-block-quote .wp-block-quote__citation:lang(ckb), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ckb), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ckb), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ckb), .wp-block-file:lang(ckb), ul.wp-block-archives li > a:lang(ckb), +.wp-block-categories li > a:lang(ckb), +.wp-block-latest-posts li > a:lang(ckb), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ckb), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ckb), .wp-caption dd:lang(ckb), .wp-block-freeform blockquote cite:lang(ckb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(fa-IR), h1:lang(fa-IR), +h2:lang(fa-IR), +h3:lang(fa-IR), +h4:lang(fa-IR), +h5:lang(fa-IR), +h6:lang(fa-IR), figcaption:lang(fa-IR), +.gallery-caption:lang(fa-IR), .editor-post-title__block .editor-post-title__input:lang(fa-IR), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(fa-IR), .wp-block-paragraph.has-drop-cap:lang(fa-IR):not(:focus)::first-letter, .wp-block-table:lang(fa-IR), .wp-block-cover h2:lang(fa-IR), +.wp-block-cover .wp-block-cover-text:lang(fa-IR), .wp-block-button .wp-block-button__link:lang(fa-IR), .wp-block-quote cite:lang(fa-IR), +.wp-block-quote footer:lang(fa-IR), +.wp-block-quote .wp-block-quote__citation:lang(fa-IR), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(fa-IR), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(fa-IR), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(fa-IR), .wp-block-file:lang(fa-IR), ul.wp-block-archives li > a:lang(fa-IR), +.wp-block-categories li > a:lang(fa-IR), +.wp-block-latest-posts li > a:lang(fa-IR), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(fa-IR), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(fa-IR), .wp-caption dd:lang(fa-IR), .wp-block-freeform blockquote cite:lang(fa-IR) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(haz), h1:lang(haz), +h2:lang(haz), +h3:lang(haz), +h4:lang(haz), +h5:lang(haz), +h6:lang(haz), figcaption:lang(haz), +.gallery-caption:lang(haz), .editor-post-title__block .editor-post-title__input:lang(haz), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(haz), .wp-block-paragraph.has-drop-cap:lang(haz):not(:focus)::first-letter, .wp-block-table:lang(haz), .wp-block-cover h2:lang(haz), +.wp-block-cover .wp-block-cover-text:lang(haz), .wp-block-button .wp-block-button__link:lang(haz), .wp-block-quote cite:lang(haz), +.wp-block-quote footer:lang(haz), +.wp-block-quote .wp-block-quote__citation:lang(haz), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(haz), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(haz), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(haz), .wp-block-file:lang(haz), ul.wp-block-archives li > a:lang(haz), +.wp-block-categories li > a:lang(haz), +.wp-block-latest-posts li > a:lang(haz), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(haz), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(haz), .wp-caption dd:lang(haz), .wp-block-freeform blockquote cite:lang(haz) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ps), h1:lang(ps), +h2:lang(ps), +h3:lang(ps), +h4:lang(ps), +h5:lang(ps), +h6:lang(ps), figcaption:lang(ps), +.gallery-caption:lang(ps), .editor-post-title__block .editor-post-title__input:lang(ps), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ps), .wp-block-paragraph.has-drop-cap:lang(ps):not(:focus)::first-letter, .wp-block-table:lang(ps), .wp-block-cover h2:lang(ps), +.wp-block-cover .wp-block-cover-text:lang(ps), .wp-block-button .wp-block-button__link:lang(ps), .wp-block-quote cite:lang(ps), +.wp-block-quote footer:lang(ps), +.wp-block-quote .wp-block-quote__citation:lang(ps), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ps), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ps), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ps), .wp-block-file:lang(ps), ul.wp-block-archives li > a:lang(ps), +.wp-block-categories li > a:lang(ps), +.wp-block-latest-posts li > a:lang(ps), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ps), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ps), .wp-caption dd:lang(ps), .wp-block-freeform blockquote cite:lang(ps) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(be), h1:lang(be), +h2:lang(be), +h3:lang(be), +h4:lang(be), +h5:lang(be), +h6:lang(be), figcaption:lang(be), +.gallery-caption:lang(be), .editor-post-title__block .editor-post-title__input:lang(be), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(be), .wp-block-paragraph.has-drop-cap:lang(be):not(:focus)::first-letter, .wp-block-table:lang(be), .wp-block-cover h2:lang(be), +.wp-block-cover .wp-block-cover-text:lang(be), .wp-block-button .wp-block-button__link:lang(be), .wp-block-quote cite:lang(be), +.wp-block-quote footer:lang(be), +.wp-block-quote .wp-block-quote__citation:lang(be), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(be), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(be), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(be), .wp-block-file:lang(be), ul.wp-block-archives li > a:lang(be), +.wp-block-categories li > a:lang(be), +.wp-block-latest-posts li > a:lang(be), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(be), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(be), .wp-caption dd:lang(be), .wp-block-freeform blockquote cite:lang(be) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(bg-BG), h1:lang(bg-BG), +h2:lang(bg-BG), +h3:lang(bg-BG), +h4:lang(bg-BG), +h5:lang(bg-BG), +h6:lang(bg-BG), figcaption:lang(bg-BG), +.gallery-caption:lang(bg-BG), .editor-post-title__block .editor-post-title__input:lang(bg-BG), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(bg-BG), .wp-block-paragraph.has-drop-cap:lang(bg-BG):not(:focus)::first-letter, .wp-block-table:lang(bg-BG), .wp-block-cover h2:lang(bg-BG), +.wp-block-cover .wp-block-cover-text:lang(bg-BG), .wp-block-button .wp-block-button__link:lang(bg-BG), .wp-block-quote cite:lang(bg-BG), +.wp-block-quote footer:lang(bg-BG), +.wp-block-quote .wp-block-quote__citation:lang(bg-BG), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(bg-BG), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(bg-BG), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(bg-BG), .wp-block-file:lang(bg-BG), ul.wp-block-archives li > a:lang(bg-BG), +.wp-block-categories li > a:lang(bg-BG), +.wp-block-latest-posts li > a:lang(bg-BG), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bg-BG), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bg-BG), .wp-caption dd:lang(bg-BG), .wp-block-freeform blockquote cite:lang(bg-BG) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(kk), h1:lang(kk), +h2:lang(kk), +h3:lang(kk), +h4:lang(kk), +h5:lang(kk), +h6:lang(kk), figcaption:lang(kk), +.gallery-caption:lang(kk), .editor-post-title__block .editor-post-title__input:lang(kk), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(kk), .wp-block-paragraph.has-drop-cap:lang(kk):not(:focus)::first-letter, .wp-block-table:lang(kk), .wp-block-cover h2:lang(kk), +.wp-block-cover .wp-block-cover-text:lang(kk), .wp-block-button .wp-block-button__link:lang(kk), .wp-block-quote cite:lang(kk), +.wp-block-quote footer:lang(kk), +.wp-block-quote .wp-block-quote__citation:lang(kk), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(kk), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(kk), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(kk), .wp-block-file:lang(kk), ul.wp-block-archives li > a:lang(kk), +.wp-block-categories li > a:lang(kk), +.wp-block-latest-posts li > a:lang(kk), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(kk), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(kk), .wp-caption dd:lang(kk), .wp-block-freeform blockquote cite:lang(kk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mk-MK), h1:lang(mk-MK), +h2:lang(mk-MK), +h3:lang(mk-MK), +h4:lang(mk-MK), +h5:lang(mk-MK), +h6:lang(mk-MK), figcaption:lang(mk-MK), +.gallery-caption:lang(mk-MK), .editor-post-title__block .editor-post-title__input:lang(mk-MK), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(mk-MK), .wp-block-paragraph.has-drop-cap:lang(mk-MK):not(:focus)::first-letter, .wp-block-table:lang(mk-MK), .wp-block-cover h2:lang(mk-MK), +.wp-block-cover .wp-block-cover-text:lang(mk-MK), .wp-block-button .wp-block-button__link:lang(mk-MK), .wp-block-quote cite:lang(mk-MK), +.wp-block-quote footer:lang(mk-MK), +.wp-block-quote .wp-block-quote__citation:lang(mk-MK), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(mk-MK), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(mk-MK), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(mk-MK), .wp-block-file:lang(mk-MK), ul.wp-block-archives li > a:lang(mk-MK), +.wp-block-categories li > a:lang(mk-MK), +.wp-block-latest-posts li > a:lang(mk-MK), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mk-MK), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mk-MK), .wp-caption dd:lang(mk-MK), .wp-block-freeform blockquote cite:lang(mk-MK) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mn), h1:lang(mn), +h2:lang(mn), +h3:lang(mn), +h4:lang(mn), +h5:lang(mn), +h6:lang(mn), figcaption:lang(mn), +.gallery-caption:lang(mn), .editor-post-title__block .editor-post-title__input:lang(mn), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(mn), .wp-block-paragraph.has-drop-cap:lang(mn):not(:focus)::first-letter, .wp-block-table:lang(mn), .wp-block-cover h2:lang(mn), +.wp-block-cover .wp-block-cover-text:lang(mn), .wp-block-button .wp-block-button__link:lang(mn), .wp-block-quote cite:lang(mn), +.wp-block-quote footer:lang(mn), +.wp-block-quote .wp-block-quote__citation:lang(mn), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(mn), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(mn), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(mn), .wp-block-file:lang(mn), ul.wp-block-archives li > a:lang(mn), +.wp-block-categories li > a:lang(mn), +.wp-block-latest-posts li > a:lang(mn), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mn), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mn), .wp-caption dd:lang(mn), .wp-block-freeform blockquote cite:lang(mn) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(ru-RU), h1:lang(ru-RU), +h2:lang(ru-RU), +h3:lang(ru-RU), +h4:lang(ru-RU), +h5:lang(ru-RU), +h6:lang(ru-RU), figcaption:lang(ru-RU), +.gallery-caption:lang(ru-RU), .editor-post-title__block .editor-post-title__input:lang(ru-RU), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ru-RU), .wp-block-paragraph.has-drop-cap:lang(ru-RU):not(:focus)::first-letter, .wp-block-table:lang(ru-RU), .wp-block-cover h2:lang(ru-RU), +.wp-block-cover .wp-block-cover-text:lang(ru-RU), .wp-block-button .wp-block-button__link:lang(ru-RU), .wp-block-quote cite:lang(ru-RU), +.wp-block-quote footer:lang(ru-RU), +.wp-block-quote .wp-block-quote__citation:lang(ru-RU), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ru-RU), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ru-RU), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ru-RU), .wp-block-file:lang(ru-RU), ul.wp-block-archives li > a:lang(ru-RU), +.wp-block-categories li > a:lang(ru-RU), +.wp-block-latest-posts li > a:lang(ru-RU), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ru-RU), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ru-RU), .wp-caption dd:lang(ru-RU), .wp-block-freeform blockquote cite:lang(ru-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sah), h1:lang(sah), +h2:lang(sah), +h3:lang(sah), +h4:lang(sah), +h5:lang(sah), +h6:lang(sah), figcaption:lang(sah), +.gallery-caption:lang(sah), .editor-post-title__block .editor-post-title__input:lang(sah), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(sah), .wp-block-paragraph.has-drop-cap:lang(sah):not(:focus)::first-letter, .wp-block-table:lang(sah), .wp-block-cover h2:lang(sah), +.wp-block-cover .wp-block-cover-text:lang(sah), .wp-block-button .wp-block-button__link:lang(sah), .wp-block-quote cite:lang(sah), +.wp-block-quote footer:lang(sah), +.wp-block-quote .wp-block-quote__citation:lang(sah), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(sah), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(sah), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(sah), .wp-block-file:lang(sah), ul.wp-block-archives li > a:lang(sah), +.wp-block-categories li > a:lang(sah), +.wp-block-latest-posts li > a:lang(sah), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sah), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sah), .wp-caption dd:lang(sah), .wp-block-freeform blockquote cite:lang(sah) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sr-RS), h1:lang(sr-RS), +h2:lang(sr-RS), +h3:lang(sr-RS), +h4:lang(sr-RS), +h5:lang(sr-RS), +h6:lang(sr-RS), figcaption:lang(sr-RS), +.gallery-caption:lang(sr-RS), .editor-post-title__block .editor-post-title__input:lang(sr-RS), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(sr-RS), .wp-block-paragraph.has-drop-cap:lang(sr-RS):not(:focus)::first-letter, .wp-block-table:lang(sr-RS), .wp-block-cover h2:lang(sr-RS), +.wp-block-cover .wp-block-cover-text:lang(sr-RS), .wp-block-button .wp-block-button__link:lang(sr-RS), .wp-block-quote cite:lang(sr-RS), +.wp-block-quote footer:lang(sr-RS), +.wp-block-quote .wp-block-quote__citation:lang(sr-RS), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(sr-RS), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(sr-RS), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(sr-RS), .wp-block-file:lang(sr-RS), ul.wp-block-archives li > a:lang(sr-RS), +.wp-block-categories li > a:lang(sr-RS), +.wp-block-latest-posts li > a:lang(sr-RS), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sr-RS), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sr-RS), .wp-caption dd:lang(sr-RS), .wp-block-freeform blockquote cite:lang(sr-RS) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(tt-RU), h1:lang(tt-RU), +h2:lang(tt-RU), +h3:lang(tt-RU), +h4:lang(tt-RU), +h5:lang(tt-RU), +h6:lang(tt-RU), figcaption:lang(tt-RU), +.gallery-caption:lang(tt-RU), .editor-post-title__block .editor-post-title__input:lang(tt-RU), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(tt-RU), .wp-block-paragraph.has-drop-cap:lang(tt-RU):not(:focus)::first-letter, .wp-block-table:lang(tt-RU), .wp-block-cover h2:lang(tt-RU), +.wp-block-cover .wp-block-cover-text:lang(tt-RU), .wp-block-button .wp-block-button__link:lang(tt-RU), .wp-block-quote cite:lang(tt-RU), +.wp-block-quote footer:lang(tt-RU), +.wp-block-quote .wp-block-quote__citation:lang(tt-RU), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(tt-RU), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(tt-RU), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(tt-RU), .wp-block-file:lang(tt-RU), ul.wp-block-archives li > a:lang(tt-RU), +.wp-block-categories li > a:lang(tt-RU), +.wp-block-latest-posts li > a:lang(tt-RU), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(tt-RU), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(tt-RU), .wp-caption dd:lang(tt-RU), .wp-block-freeform blockquote cite:lang(tt-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(uk), h1:lang(uk), +h2:lang(uk), +h3:lang(uk), +h4:lang(uk), +h5:lang(uk), +h6:lang(uk), figcaption:lang(uk), +.gallery-caption:lang(uk), .editor-post-title__block .editor-post-title__input:lang(uk), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(uk), .wp-block-paragraph.has-drop-cap:lang(uk):not(:focus)::first-letter, .wp-block-table:lang(uk), .wp-block-cover h2:lang(uk), +.wp-block-cover .wp-block-cover-text:lang(uk), .wp-block-button .wp-block-button__link:lang(uk), .wp-block-quote cite:lang(uk), +.wp-block-quote footer:lang(uk), +.wp-block-quote .wp-block-quote__citation:lang(uk), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(uk), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(uk), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(uk), .wp-block-file:lang(uk), ul.wp-block-archives li > a:lang(uk), +.wp-block-categories li > a:lang(uk), +.wp-block-latest-posts li > a:lang(uk), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(uk), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(uk), .wp-caption dd:lang(uk), .wp-block-freeform blockquote cite:lang(uk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(zh-HK), h1:lang(zh-HK), +h2:lang(zh-HK), +h3:lang(zh-HK), +h4:lang(zh-HK), +h5:lang(zh-HK), +h6:lang(zh-HK), figcaption:lang(zh-HK), +.gallery-caption:lang(zh-HK), .editor-post-title__block .editor-post-title__input:lang(zh-HK), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(zh-HK), .wp-block-paragraph.has-drop-cap:lang(zh-HK):not(:focus)::first-letter, .wp-block-table:lang(zh-HK), .wp-block-cover h2:lang(zh-HK), +.wp-block-cover .wp-block-cover-text:lang(zh-HK), .wp-block-button .wp-block-button__link:lang(zh-HK), .wp-block-quote cite:lang(zh-HK), +.wp-block-quote footer:lang(zh-HK), +.wp-block-quote .wp-block-quote__citation:lang(zh-HK), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(zh-HK), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(zh-HK), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(zh-HK), .wp-block-file:lang(zh-HK), ul.wp-block-archives li > a:lang(zh-HK), +.wp-block-categories li > a:lang(zh-HK), +.wp-block-latest-posts li > a:lang(zh-HK), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-HK), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-HK), .wp-caption dd:lang(zh-HK), .wp-block-freeform blockquote cite:lang(zh-HK) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang HK", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-TW), h1:lang(zh-TW), +h2:lang(zh-TW), +h3:lang(zh-TW), +h4:lang(zh-TW), +h5:lang(zh-TW), +h6:lang(zh-TW), figcaption:lang(zh-TW), +.gallery-caption:lang(zh-TW), .editor-post-title__block .editor-post-title__input:lang(zh-TW), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(zh-TW), .wp-block-paragraph.has-drop-cap:lang(zh-TW):not(:focus)::first-letter, .wp-block-table:lang(zh-TW), .wp-block-cover h2:lang(zh-TW), +.wp-block-cover .wp-block-cover-text:lang(zh-TW), .wp-block-button .wp-block-button__link:lang(zh-TW), .wp-block-quote cite:lang(zh-TW), +.wp-block-quote footer:lang(zh-TW), +.wp-block-quote .wp-block-quote__citation:lang(zh-TW), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(zh-TW), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(zh-TW), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(zh-TW), .wp-block-file:lang(zh-TW), ul.wp-block-archives li > a:lang(zh-TW), +.wp-block-categories li > a:lang(zh-TW), +.wp-block-latest-posts li > a:lang(zh-TW), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-TW), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-TW), .wp-caption dd:lang(zh-TW), .wp-block-freeform blockquote cite:lang(zh-TW) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-CN), h1:lang(zh-CN), +h2:lang(zh-CN), +h3:lang(zh-CN), +h4:lang(zh-CN), +h5:lang(zh-CN), +h6:lang(zh-CN), figcaption:lang(zh-CN), +.gallery-caption:lang(zh-CN), .editor-post-title__block .editor-post-title__input:lang(zh-CN), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(zh-CN), .wp-block-paragraph.has-drop-cap:lang(zh-CN):not(:focus)::first-letter, .wp-block-table:lang(zh-CN), .wp-block-cover h2:lang(zh-CN), +.wp-block-cover .wp-block-cover-text:lang(zh-CN), .wp-block-button .wp-block-button__link:lang(zh-CN), .wp-block-quote cite:lang(zh-CN), +.wp-block-quote footer:lang(zh-CN), +.wp-block-quote .wp-block-quote__citation:lang(zh-CN), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(zh-CN), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(zh-CN), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(zh-CN), .wp-block-file:lang(zh-CN), ul.wp-block-archives li > a:lang(zh-CN), +.wp-block-categories li > a:lang(zh-CN), +.wp-block-latest-posts li > a:lang(zh-CN), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-CN), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-CN), .wp-caption dd:lang(zh-CN), .wp-block-freeform blockquote cite:lang(zh-CN) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(bn-BD), h1:lang(bn-BD), +h2:lang(bn-BD), +h3:lang(bn-BD), +h4:lang(bn-BD), +h5:lang(bn-BD), +h6:lang(bn-BD), figcaption:lang(bn-BD), +.gallery-caption:lang(bn-BD), .editor-post-title__block .editor-post-title__input:lang(bn-BD), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(bn-BD), .wp-block-paragraph.has-drop-cap:lang(bn-BD):not(:focus)::first-letter, .wp-block-table:lang(bn-BD), .wp-block-cover h2:lang(bn-BD), +.wp-block-cover .wp-block-cover-text:lang(bn-BD), .wp-block-button .wp-block-button__link:lang(bn-BD), .wp-block-quote cite:lang(bn-BD), +.wp-block-quote footer:lang(bn-BD), +.wp-block-quote .wp-block-quote__citation:lang(bn-BD), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(bn-BD), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(bn-BD), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(bn-BD), .wp-block-file:lang(bn-BD), ul.wp-block-archives li > a:lang(bn-BD), +.wp-block-categories li > a:lang(bn-BD), +.wp-block-latest-posts li > a:lang(bn-BD), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bn-BD), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bn-BD), .wp-caption dd:lang(bn-BD), .wp-block-freeform blockquote cite:lang(bn-BD) { + font-family: Arial, sans-serif; +} + +body:lang(hi-IN), h1:lang(hi-IN), +h2:lang(hi-IN), +h3:lang(hi-IN), +h4:lang(hi-IN), +h5:lang(hi-IN), +h6:lang(hi-IN), figcaption:lang(hi-IN), +.gallery-caption:lang(hi-IN), .editor-post-title__block .editor-post-title__input:lang(hi-IN), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(hi-IN), .wp-block-paragraph.has-drop-cap:lang(hi-IN):not(:focus)::first-letter, .wp-block-table:lang(hi-IN), .wp-block-cover h2:lang(hi-IN), +.wp-block-cover .wp-block-cover-text:lang(hi-IN), .wp-block-button .wp-block-button__link:lang(hi-IN), .wp-block-quote cite:lang(hi-IN), +.wp-block-quote footer:lang(hi-IN), +.wp-block-quote .wp-block-quote__citation:lang(hi-IN), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(hi-IN), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(hi-IN), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(hi-IN), .wp-block-file:lang(hi-IN), ul.wp-block-archives li > a:lang(hi-IN), +.wp-block-categories li > a:lang(hi-IN), +.wp-block-latest-posts li > a:lang(hi-IN), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(hi-IN), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(hi-IN), .wp-caption dd:lang(hi-IN), .wp-block-freeform blockquote cite:lang(hi-IN) { + font-family: Arial, sans-serif; +} + +body:lang(mr), h1:lang(mr), +h2:lang(mr), +h3:lang(mr), +h4:lang(mr), +h5:lang(mr), +h6:lang(mr), figcaption:lang(mr), +.gallery-caption:lang(mr), .editor-post-title__block .editor-post-title__input:lang(mr), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(mr), .wp-block-paragraph.has-drop-cap:lang(mr):not(:focus)::first-letter, .wp-block-table:lang(mr), .wp-block-cover h2:lang(mr), +.wp-block-cover .wp-block-cover-text:lang(mr), .wp-block-button .wp-block-button__link:lang(mr), .wp-block-quote cite:lang(mr), +.wp-block-quote footer:lang(mr), +.wp-block-quote .wp-block-quote__citation:lang(mr), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(mr), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(mr), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(mr), .wp-block-file:lang(mr), ul.wp-block-archives li > a:lang(mr), +.wp-block-categories li > a:lang(mr), +.wp-block-latest-posts li > a:lang(mr), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mr), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mr), .wp-caption dd:lang(mr), .wp-block-freeform blockquote cite:lang(mr) { + font-family: Arial, sans-serif; +} + +body:lang(ne-NP), h1:lang(ne-NP), +h2:lang(ne-NP), +h3:lang(ne-NP), +h4:lang(ne-NP), +h5:lang(ne-NP), +h6:lang(ne-NP), figcaption:lang(ne-NP), +.gallery-caption:lang(ne-NP), .editor-post-title__block .editor-post-title__input:lang(ne-NP), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ne-NP), .wp-block-paragraph.has-drop-cap:lang(ne-NP):not(:focus)::first-letter, .wp-block-table:lang(ne-NP), .wp-block-cover h2:lang(ne-NP), +.wp-block-cover .wp-block-cover-text:lang(ne-NP), .wp-block-button .wp-block-button__link:lang(ne-NP), .wp-block-quote cite:lang(ne-NP), +.wp-block-quote footer:lang(ne-NP), +.wp-block-quote .wp-block-quote__citation:lang(ne-NP), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ne-NP), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ne-NP), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ne-NP), .wp-block-file:lang(ne-NP), ul.wp-block-archives li > a:lang(ne-NP), +.wp-block-categories li > a:lang(ne-NP), +.wp-block-latest-posts li > a:lang(ne-NP), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ne-NP), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ne-NP), .wp-caption dd:lang(ne-NP), .wp-block-freeform blockquote cite:lang(ne-NP) { + font-family: Arial, sans-serif; +} + +body:lang(el), h1:lang(el), +h2:lang(el), +h3:lang(el), +h4:lang(el), +h5:lang(el), +h6:lang(el), figcaption:lang(el), +.gallery-caption:lang(el), .editor-post-title__block .editor-post-title__input:lang(el), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(el), .wp-block-paragraph.has-drop-cap:lang(el):not(:focus)::first-letter, .wp-block-table:lang(el), .wp-block-cover h2:lang(el), +.wp-block-cover .wp-block-cover-text:lang(el), .wp-block-button .wp-block-button__link:lang(el), .wp-block-quote cite:lang(el), +.wp-block-quote footer:lang(el), +.wp-block-quote .wp-block-quote__citation:lang(el), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(el), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(el), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(el), .wp-block-file:lang(el), ul.wp-block-archives li > a:lang(el), +.wp-block-categories li > a:lang(el), +.wp-block-latest-posts li > a:lang(el), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(el), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(el), .wp-caption dd:lang(el), .wp-block-freeform blockquote cite:lang(el) { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +body:lang(gu), h1:lang(gu), +h2:lang(gu), +h3:lang(gu), +h4:lang(gu), +h5:lang(gu), +h6:lang(gu), figcaption:lang(gu), +.gallery-caption:lang(gu), .editor-post-title__block .editor-post-title__input:lang(gu), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(gu), .wp-block-paragraph.has-drop-cap:lang(gu):not(:focus)::first-letter, .wp-block-table:lang(gu), .wp-block-cover h2:lang(gu), +.wp-block-cover .wp-block-cover-text:lang(gu), .wp-block-button .wp-block-button__link:lang(gu), .wp-block-quote cite:lang(gu), +.wp-block-quote footer:lang(gu), +.wp-block-quote .wp-block-quote__citation:lang(gu), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(gu), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(gu), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(gu), .wp-block-file:lang(gu), ul.wp-block-archives li > a:lang(gu), +.wp-block-categories li > a:lang(gu), +.wp-block-latest-posts li > a:lang(gu), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(gu), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(gu), .wp-caption dd:lang(gu), .wp-block-freeform blockquote cite:lang(gu) { + font-family: Arial, sans-serif; +} + +body:lang(he-IL), h1:lang(he-IL), +h2:lang(he-IL), +h3:lang(he-IL), +h4:lang(he-IL), +h5:lang(he-IL), +h6:lang(he-IL), figcaption:lang(he-IL), +.gallery-caption:lang(he-IL), .editor-post-title__block .editor-post-title__input:lang(he-IL), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(he-IL), .wp-block-paragraph.has-drop-cap:lang(he-IL):not(:focus)::first-letter, .wp-block-table:lang(he-IL), .wp-block-cover h2:lang(he-IL), +.wp-block-cover .wp-block-cover-text:lang(he-IL), .wp-block-button .wp-block-button__link:lang(he-IL), .wp-block-quote cite:lang(he-IL), +.wp-block-quote footer:lang(he-IL), +.wp-block-quote .wp-block-quote__citation:lang(he-IL), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(he-IL), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(he-IL), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(he-IL), .wp-block-file:lang(he-IL), ul.wp-block-archives li > a:lang(he-IL), +.wp-block-categories li > a:lang(he-IL), +.wp-block-latest-posts li > a:lang(he-IL), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(he-IL), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(he-IL), .wp-caption dd:lang(he-IL), .wp-block-freeform blockquote cite:lang(he-IL) { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +body:lang(ja), h1:lang(ja), +h2:lang(ja), +h3:lang(ja), +h4:lang(ja), +h5:lang(ja), +h6:lang(ja), figcaption:lang(ja), +.gallery-caption:lang(ja), .editor-post-title__block .editor-post-title__input:lang(ja), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ja), .wp-block-paragraph.has-drop-cap:lang(ja):not(:focus)::first-letter, .wp-block-table:lang(ja), .wp-block-cover h2:lang(ja), +.wp-block-cover .wp-block-cover-text:lang(ja), .wp-block-button .wp-block-button__link:lang(ja), .wp-block-quote cite:lang(ja), +.wp-block-quote footer:lang(ja), +.wp-block-quote .wp-block-quote__citation:lang(ja), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ja), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ja), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ja), .wp-block-file:lang(ja), ul.wp-block-archives li > a:lang(ja), +.wp-block-categories li > a:lang(ja), +.wp-block-latest-posts li > a:lang(ja), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ja), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ja), .wp-caption dd:lang(ja), .wp-block-freeform blockquote cite:lang(ja) { + font-family: -apple-system, BlinkMacSystemFont, "Hiragino Sans", Meiryo, "Helvetica Neue", sans-serif; +} + +body:lang(ko-KR), h1:lang(ko-KR), +h2:lang(ko-KR), +h3:lang(ko-KR), +h4:lang(ko-KR), +h5:lang(ko-KR), +h6:lang(ko-KR), figcaption:lang(ko-KR), +.gallery-caption:lang(ko-KR), .editor-post-title__block .editor-post-title__input:lang(ko-KR), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(ko-KR), .wp-block-paragraph.has-drop-cap:lang(ko-KR):not(:focus)::first-letter, .wp-block-table:lang(ko-KR), .wp-block-cover h2:lang(ko-KR), +.wp-block-cover .wp-block-cover-text:lang(ko-KR), .wp-block-button .wp-block-button__link:lang(ko-KR), .wp-block-quote cite:lang(ko-KR), +.wp-block-quote footer:lang(ko-KR), +.wp-block-quote .wp-block-quote__citation:lang(ko-KR), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(ko-KR), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(ko-KR), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(ko-KR), .wp-block-file:lang(ko-KR), ul.wp-block-archives li > a:lang(ko-KR), +.wp-block-categories li > a:lang(ko-KR), +.wp-block-latest-posts li > a:lang(ko-KR), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ko-KR), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ko-KR), .wp-caption dd:lang(ko-KR), .wp-block-freeform blockquote cite:lang(ko-KR) { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +body:lang(th), h1:lang(th), +h2:lang(th), +h3:lang(th), +h4:lang(th), +h5:lang(th), +h6:lang(th), figcaption:lang(th), +.gallery-caption:lang(th), .editor-post-title__block .editor-post-title__input:lang(th), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(th), .wp-block-paragraph.has-drop-cap:lang(th):not(:focus)::first-letter, .wp-block-table:lang(th), .wp-block-cover h2:lang(th), +.wp-block-cover .wp-block-cover-text:lang(th), .wp-block-button .wp-block-button__link:lang(th), .wp-block-quote cite:lang(th), +.wp-block-quote footer:lang(th), +.wp-block-quote .wp-block-quote__citation:lang(th), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(th), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(th), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(th), .wp-block-file:lang(th), ul.wp-block-archives li > a:lang(th), +.wp-block-categories li > a:lang(th), +.wp-block-latest-posts li > a:lang(th), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(th), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(th), .wp-caption dd:lang(th), .wp-block-freeform blockquote cite:lang(th) { + font-family: "Sukhumvit Set", "Helvetica Neue", helvetica, arial, sans-serif; +} + +body:lang(vi), h1:lang(vi), +h2:lang(vi), +h3:lang(vi), +h4:lang(vi), +h5:lang(vi), +h6:lang(vi), figcaption:lang(vi), +.gallery-caption:lang(vi), .editor-post-title__block .editor-post-title__input:lang(vi), .block-editor-default-block-appender textarea.block-editor-default-block-appender__content:lang(vi), .wp-block-paragraph.has-drop-cap:lang(vi):not(:focus)::first-letter, .wp-block-table:lang(vi), .wp-block-cover h2:lang(vi), +.wp-block-cover .wp-block-cover-text:lang(vi), .wp-block-button .wp-block-button__link:lang(vi), .wp-block-quote cite:lang(vi), +.wp-block-quote footer:lang(vi), +.wp-block-quote .wp-block-quote__citation:lang(vi), .wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation:lang(vi), +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation:lang(vi), +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation:lang(vi), .wp-block-file:lang(vi), ul.wp-block-archives li > a:lang(vi), +.wp-block-categories li > a:lang(vi), +.wp-block-latest-posts li > a:lang(vi), .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(vi), .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(vi), .wp-caption dd:lang(vi), .wp-block-freeform blockquote cite:lang(vi) { + font-family: "Libre Franklin", sans-serif; +} + +/** === Editor Frame === */ +body .wp-block[data-align="full"] { + width: calc(100% + 28px); + max-width: calc(100% + 28px); +} + +@media only screen and (min-width: 600px) { + body .wp-block[data-align="full"] { + width: calc( 100% + 116px); + max-width: calc( 100% + 115px); + } +} + +@media only screen and (min-width: 768px) { + body .editor-writing-flow { + max-width: 80%; + margin: 0 10%; + } + body .editor-default-block-appender, + body .editor-block-list__block { + margin-left: 0; + margin-right: 0; + } + body .wp-block[data-align="wide"] { + width: 100%; + } + body .wp-block[data-align="right"] { + max-width: 125%; + } +} + +/** === Content Width === */ +.wp-block { + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .wp-block { + width: calc(8 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block { + width: calc(6 * (100vw / 12 )); + } +} + +.wp-block .wp-block { + width: 100%; +} + +/** === Base Typography === */ +body { + font-size: 22px; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + line-height: 1.8; + color: #111; +} + +p { + font-size: 22px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; +} + +h1 { + font-size: 2.25em; +} + +h1:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +h1.has-text-align-center:before { + margin-left: auto; + margin-right: auto; +} + +h1.has-text-align-right:before { + margin-left: auto; +} + +@media only screen and (min-width: 768px) { + h1 { + font-size: 2.8125em; + } +} + +h2 { + font-size: 1.6875em; +} + +h2:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +h2.has-text-align-center:before { + margin-left: auto; + margin-right: auto; +} + +h2.has-text-align-right:before { + margin-left: auto; +} + +@media only screen and (min-width: 768px) { + h2 { + font-size: 2.25em; + } +} + +h3 { + font-size: 1.6875em; +} + +h4 { + font-size: 1.125em; +} + +h5 { + font-size: 0.88889em; +} + +h6 { + font-size: 0.71111em; +} + +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:hover, a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: 0; + text-decoration: underline; +} + +.has-primary-background-color, +.has-secondary-background-color, +.has-dark-gray-background-color, +.has-light-gray-background-color { + color: #fff; +} + +.has-primary-background-color p, +.has-primary-background-color h1, +.has-primary-background-color h2, +.has-primary-background-color h3, +.has-primary-background-color h4, +.has-primary-background-color h5, +.has-primary-background-color h6, +.has-primary-background-color a, +.has-secondary-background-color p, +.has-secondary-background-color h1, +.has-secondary-background-color h2, +.has-secondary-background-color h3, +.has-secondary-background-color h4, +.has-secondary-background-color h5, +.has-secondary-background-color h6, +.has-secondary-background-color a, +.has-dark-gray-background-color p, +.has-dark-gray-background-color h1, +.has-dark-gray-background-color h2, +.has-dark-gray-background-color h3, +.has-dark-gray-background-color h4, +.has-dark-gray-background-color h5, +.has-dark-gray-background-color h6, +.has-dark-gray-background-color a, +.has-light-gray-background-color p, +.has-light-gray-background-color h1, +.has-light-gray-background-color h2, +.has-light-gray-background-color h3, +.has-light-gray-background-color h4, +.has-light-gray-background-color h5, +.has-light-gray-background-color h6, +.has-light-gray-background-color a { + color: #fff; +} + +.has-white-background-color { + color: #111; +} + +.has-white-background-color p, +.has-white-background-color h1, +.has-white-background-color h2, +.has-white-background-color h3, +.has-white-background-color h4, +.has-white-background-color h5, +.has-white-background-color h6, +.has-white-background-color a { + color: #111; +} + +figcaption, +.gallery-caption { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + line-height: 1.6; + color: #767676; +} + +/** === Post Title === */ +.editor-post-title__block:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.editor-post-title__block.has-text-align-center:before { + margin-left: auto; + margin-right: auto; +} + +.editor-post-title__block.has-text-align-right:before { + margin-left: auto; +} + +.editor-post-title__block:before { + width: 2.8125em; + margin-top: 0; + margin-bottom: 0; + margin-left: 1rem; + position: relative; + top: 0.5em; +} + +@media only screen and (min-width: 600px) { + .editor-post-title__block:before { + margin-left: 0; + } +} + +.editor-post-title__block .editor-post-title__input { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 2.8125em; + font-weight: 700; +} + +/** === Default Appender === */ +.block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-size: 22px; +} + +/** === Heading === */ +.wp-block-heading strong { + font-weight: bolder; +} + +/** === Paragraph === */ +.wp-block-paragraph.has-drop-cap:not(:focus)::first-letter { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 3.375em; + line-height: 1; + font-weight: bold; + margin: 0 0.25em 0 0; +} + +/** === Table === */ +.wp-block-table { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +/** === Cover === */ +.wp-block-cover h2, +.wp-block-cover .wp-block-cover-text { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 1.6875em; + font-weight: bold; + line-height: 1.4; + padding-left: 1rem; + padding-right: 1rem; +} + +.wp-block-cover h2 strong, +.wp-block-cover .wp-block-cover-text strong { + font-weight: bolder; +} + +@media only screen and (min-width: 768px) { + .wp-block-cover h2, + .wp-block-cover .wp-block-cover-text { + margin-left: auto; + margin-right: auto; + padding: 0; + } +} + +@media only screen and (min-width: 768px) { + .wp-block-cover { + padding-left: 10%; + padding-right: 10%; + } + .wp-block-cover h2, + .wp-block-cover .wp-block-cover-text { + font-size: 2.25em; + } +} + +.wp-block[data-type="core/cover"][data-align="left"] .editor-block-list__block-edit, +.wp-block[data-type="core/cover"][data-align="right"] .editor-block-list__block-edit { + width: calc(4 * (100vw / 12)); +} + +.wp-block[data-type="core/cover"][data-align="left"] .wp-block-cover, +.wp-block[data-type="core/cover"][data-align="right"] .wp-block-cover { + width: 100%; + max-width: 100%; + padding: calc(1.375 * 1rem); +} + +.wp-block[data-type="core/cover"][data-align="left"] .wp-block-cover p, +.wp-block[data-type="core/cover"][data-align="right"] .wp-block-cover p { + padding-left: 0; + padding-right: 0; +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/cover"][data-align="left"] .wp-block-cover, + .wp-block[data-type="core/cover"][data-align="right"] .wp-block-cover { + padding: calc(2.75 * 1rem) calc(2.75 * 1rem) calc(3.125 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/cover"][data-align="wide"] h2, + .wp-block[data-type="core/cover"][data-align="wide"] .wp-block-cover-text, + .wp-block[data-type="core/cover"][data-align="full"] h2, + .wp-block[data-type="core/cover"][data-align="full"] .wp-block-cover-text { + max-width: calc(8 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block[data-type="core/cover"][data-align="wide"] h2, + .wp-block[data-type="core/cover"][data-align="wide"] .wp-block-cover-text, + .wp-block[data-type="core/cover"][data-align="full"] h2, + .wp-block[data-type="core/cover"][data-align="full"] .wp-block-cover-text { + max-width: calc(6 * (100vw / 12)); + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/cover"][data-align="full"] .wp-block-cover { + padding-left: calc(10% + 64px); + padding-right: calc(10% + 64px); + } +} + +/** === Gallery === */ +.wp-block-gallery .blocks-gallery-image figcaption, +.wp-block-gallery .blocks-gallery-item figcaption, +.wp-block-gallery .gallery-item .gallery-caption { + font-size: 0.71111em; + line-height: 1.6; +} + +/** === Button === */ +.wp-block-button .wp-block-button__link { + line-height: 1.8; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.88889em; + font-weight: bold; +} + +.wp-block-button:not(.is-style-outline) .wp-block-button__link { + background: #0073aa; +} + +.wp-block-button:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; +} + +.wp-block-button.is-style-outline, .wp-block-button.is-style-outline:hover, .wp-block-button.is-style-outline:focus, .wp-block-button.is-style-outline:active { + background: transparent; + color: #0073aa; +} + +.wp-block-button.is-style-outline .wp-block-button__link, .wp-block-button.is-style-outline:hover .wp-block-button__link, .wp-block-button.is-style-outline:focus .wp-block-button__link, .wp-block-button.is-style-outline:active .wp-block-button__link { + background: transparent; +} + +.wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), .wp-block-button.is-style-outline:hover .wp-block-button__link:not(.has-text-color), .wp-block-button.is-style-outline:focus .wp-block-button__link:not(.has-text-color), .wp-block-button.is-style-outline:active .wp-block-button__link:not(.has-text-color) { + color: #0073aa; +} + +/** === Blockquote === */ +.wp-block-quote:not(.is-large):not(.is-style-large) { + border-width: 2px; + border-color: #0073aa; +} + +.wp-block-quote.is-large, .wp-block-quote.is-style-large { + margin-top: 2.8125em; + margin-bottom: 2.8125em; +} + +.wp-block-quote.is-large p, +.wp-block-quote.is-style-large p { + font-size: 1.6875em; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +.wp-block-quote cite, +.wp-block-quote footer, +.wp-block-quote .wp-block-quote__citation { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + line-height: 1.6; + color: #767676; +} + +/** === Pullquote === */ +.wp-block-pullquote { + border-color: transparent; + border-width: 2px; + color: #000; +} + +.wp-block-pullquote blockquote { + margin-top: calc(3 * 1rem); + margin-bottom: calc(3.33 * 1rem); + hyphens: auto; + word-break: break-word; +} + +.wp-block-pullquote:not(.is-style-solid-color) .wp-block-pullquote__citation { + color: #767676; +} + +.wp-block-pullquote.is-style-solid-color blockquote { + width: calc(100% - (2 * 1rem)); + max-width: calc( 100% - (2 * 1rem)); +} + +.wp-block-pullquote.is-style-solid-color blockquote a, +.wp-block-pullquote.is-style-solid-color blockquote.has-text-color p, +.wp-block-pullquote.is-style-solid-color blockquote.has-text-color a { + color: inherit; +} + +.wp-block-pullquote.is-style-solid-color blockquote:not(.has-text-color) { + color: #fff; +} + +@media only screen and (min-width: 768px) { + .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 80%; + } +} + +.wp-block-pullquote.is-style-solid-color:not(.has-background-color) { + background-color: #0073aa; +} + +.wp-block[data-type="core/pullquote"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"] p, +.wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"][data-align="left"] p, +.wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"][data-align="right"] p { + font-size: 1.6875em; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/pullquote"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + .wp-block[data-type="core/pullquote"] blockquote > .editor-rich-text p, + .wp-block[data-type="core/pullquote"] p, + .wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + .wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .editor-rich-text p, + .wp-block[data-type="core/pullquote"][data-align="left"] p, + .wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + .wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .editor-rich-text p, + .wp-block[data-type="core/pullquote"][data-align="right"] p { + font-size: 2.25em; + } +} + +.wp-block[data-type="core/pullquote"] .wp-block-pullquote__citation, +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation, +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + line-height: 1.6; + text-transform: none; +} + +.wp-block[data-type="core/pullquote"] em, +.wp-block[data-type="core/pullquote"][data-align="left"] em, +.wp-block[data-type="core/pullquote"][data-align="right"] em { + font-style: normal; +} + +.wp-block[data-type="core/pullquote"][data-align="left"] .editor-block-list__block-edit, +.wp-block[data-type="core/pullquote"][data-align="right"] .editor-block-list__block-edit { + width: calc(4 * (100vw / 12)); + max-width: 50%; +} + +.wp-block[data-type="core/pullquote"][data-align="left"] .editor-block-list__block-edit .wp-block-pullquote:not(.is-style-solid-color), +.wp-block[data-type="core/pullquote"][data-align="right"] .editor-block-list__block-edit .wp-block-pullquote:not(.is-style-solid-color) { + padding: 0; +} + +.wp-block[data-type="core/pullquote"][data-align="left"] .editor-block-list__block-edit .wp-block-pullquote.is-style-solid-color, +.wp-block[data-type="core/pullquote"][data-align="right"] .editor-block-list__block-edit .wp-block-pullquote.is-style-solid-color { + padding: 1em; +} + +.wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"][data-align="left"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"][data-align="left"] p, +.wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote__citation, +.wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, +.wp-block[data-type="core/pullquote"][data-align="right"] blockquote > .editor-rich-text p, +.wp-block[data-type="core/pullquote"][data-align="right"] p, +.wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote__citation { + text-align: left; +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote blockquote { + max-width: calc(80% - 128px); + } +} + +/** === File === */ +.wp-block-file { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.wp-block-file .wp-block-file__textlink { + text-decoration: underline; + color: #0073aa; +} + +.wp-block-file .wp-block-file__textlink:hover { + color: #005177; + text-decoration: none; +} + +.wp-block-file .wp-block-file__button { + display: table; + line-height: 1.8; + font-size: 0.88889em; + font-weight: bold; + background-color: #0073aa; + border-radius: 5px; +} + +.wp-block-file .wp-block-file__button-richtext-wrapper { + display: block; + margin-top: calc(0.75 * 1rem); + margin-left: 0; +} + +/** === Verse === */ +.wp-block-verse, +.wp-block-verse pre { + padding: 0; +} + +/** === Code === */ +.wp-block-code { + border-radius: 0; +} + +/** === Table === */ +.wp-block-table td, .wp-block-table th { + border-color: #767676; +} + +/** === Separator === */ +.wp-block-separator:not(.is-style-dots) { + background-color: #767676; + height: 2px; +} + +.wp-block-separator:not(.is-style-wide):not(.is-style-dots) { + width: 2.25em; + margin-left: 0; +} + +.wp-block-separator.is-style-dots { + color: #767676; +} + +.wp-block-separator.is-style-dots:before { + font-size: 1.6875em; + letter-spacing: calc(2 * 1rem); + padding-left: calc(2 * 1rem); +} + +/* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ +.wp-block[data-type="core/separator"] + .wp-block[data-type="core/heading"] h1:before, +.wp-block[data-type="core/separator"] + .wp-block[data-type="core/heading"] h2:before { + display: none; +} + +/** === Latest Posts, Archives, Categories === */ +ul.wp-block-archives, +.wp-block-categories, +.wp-block-latest-posts { + padding: 0; + list-style-type: none; +} + +ul.wp-block-archives ul, +.wp-block-categories ul, +.wp-block-latest-posts ul { + padding: 0; + list-style-type: none; +} + +ul.wp-block-archives li > a, +.wp-block-categories li > a, +.wp-block-latest-posts li > a { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: bold; + line-height: 1.2; + text-decoration: none; +} + +ul.wp-block-archives li ul, +.wp-block-categories li ul, +.wp-block-latest-posts li ul { + padding-left: 1rem; +} + +.wp-block-categories ul { + padding-top: 0.75rem; +} + +.wp-block-categories ul ul { + counter-reset: submenu; +} + +.wp-block-categories ul ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.wp-block-categories li ul { + list-style: none; + padding-left: 0; + margin-bottom: -0.75rem; +} + +/** === Latest Posts === */ +.wp-block-latest-posts .wp-block-latest-posts__post-date { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; + line-height: 1.2; +} + +.wp-block-latest-posts .wp-block-latest-posts__post-full-content, +.wp-block-latest-posts .wp-block-latest-posts__post-excerpt { + margin-top: 22px; + margin-bottom: 22px; +} + +.wp-block-latest-posts .wp-block-latest-posts__post-full-content > div > p:first-child, +.wp-block-latest-posts .wp-block-latest-posts__post-excerpt > div > p:first-child { + margin-top: 22px; +} + +.wp-block-latest-posts li { + padding-bottom: 0.5rem; +} + +.wp-block-latest-posts li.menu-item-has-children, .wp-block-latest-posts li:last-child { + padding-bottom: 0; +} + +.wp-block-latest-posts li :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: 0.5rem; +} + +.wp-block-latest-posts.is-grid li { + border-top: 2px solid #ccc; + padding-top: 1rem; + margin-bottom: 2rem; +} + +.wp-block-latest-posts.is-grid li a:after { + content: ''; +} + +.wp-block-latest-posts.is-grid li:last-child { + margin-bottom: auto; +} + +.wp-block-latest-posts.is-grid li:last-child a:after { + content: ''; +} + +/** === Latest Comments === */ +.wp-block-latest-comments .wp-block-latest-comments__comment-meta { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.wp-block-latest-comments .wp-block-latest-comments__comment-meta .wp-block-latest-comments__comment-date { + font-weight: normal; +} + +.wp-block-latest-comments .wp-block-latest-comments__comment, +.wp-block-latest-comments .wp-block-latest-comments__comment-date, +.wp-block-latest-comments .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; +} + +.wp-block-latest-comments .wp-block-latest-comments__comment-date { + font-size: 0.71111em; +} + +/** === Classic Editor === */ +/* Properly center-align captions in the classic-editor block */ +.wp-caption dd { + color: #767676; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: left; + text-align: center; + -webkit-margin-start: 0px; + margin-inline-start: 0px; +} + +.wp-block-freeform { + /* Add style for galleries in classic-editor block */ +} + +.wp-block-freeform blockquote { + border-left: 2px solid #0073aa; +} + +.wp-block-freeform blockquote cite { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + font-style: normal; + line-height: 1.6; + color: #767676; +} + +/** === Group Block === */ +.wp-block[data-type="core/group"] > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: 0; + margin-right: 0; +} + +.wp-block[data-type="core/group"] > .wp-block-group.has-background { + padding: 22px; +} + +.wp-block[data-type="core/group"] > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: -22px; + width: calc(100% + 44px); + max-width: calc(100% + 44px); +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + width: calc(8 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + width: calc(6 * (100vw / 12 )); + } +} + +.wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + padding-left: 0; + padding-right: 0; +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + width: calc(8 * (100vw / 12) - 44px); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block[data-type="core/group"][data-align="wide"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + width: calc(6 * (100vw / 12 ) - 44px); + } +} + +@media only screen and (min-width: 600px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + padding-left: 46px; + padding-right: 46px; + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + width: 80%; + margin-left: 10%; + margin-right: 10%; + padding-left: 48px; + padding-right: 48px; + } +} + +.wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="full"]) { + max-width: calc(100vw - (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="full"]) { + max-width: calc(8 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="full"]) { + max-width: calc(6 * (100vw / 12)); + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="right"] { + max-width: 125%; + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="wide"] { + width: calc(100% + 4px); + max-width: calc(100% + 4px); + } +} + +.wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align=full] { + max-width: calc(100vw + (2 * 1rem)); +} + +@media only screen and (min-width: 600px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align=full] { + width: calc(100% + 92px); + left: -46px; + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align=full] { + left: calc(-12.5% - 58px); + width: calc(125% + 120px); + max-width: calc(125% + 119px); + } +} + +.wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background { + padding: 22px 0; +} + +@media only screen and (min-width: 600px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background { + padding-left: 0; + padding-right: 0; + } +} + +.wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: 0; + width: 100%; +} + +@media only screen and (min-width: 600px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + width: calc(100% + 92px); + } +} + +@media only screen and (min-width: 768px) { + .wp-block[data-type="core/group"][data-align="full"] > .is-block-content > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + width: calc(125% + 120px); + } +} diff --git a/content/themes/twentynineteen/style-editor.scss b/content/themes/twentynineteen/style-editor.scss new file mode 100644 index 0000000..b5c422f --- /dev/null +++ b/content/themes/twentynineteen/style-editor.scss @@ -0,0 +1,943 @@ +/*! +Twenty Nineteen Editor Styles +*/ + +/** === Includes === */ + +@import "sass/variables-site/variables-site"; +@import "sass/mixins/mixins-master"; + +/** === Editor Frame === */ + +body { + + .wp-block[data-align="full"] { + width: calc(100% + 28px); + max-width: calc(100% + 28px); + } + + @include media(mobile) { + + .wp-block[data-align="full"] { + width: calc( 100% + 116px ); + max-width: calc( 100% + 115px ); + } + } + + @include media(tablet) { + + .editor-writing-flow { + max-width: 80%; + margin: 0 10%; + } + + .editor-default-block-appender, + .editor-block-list__block { + margin-left: 0; + margin-right: 0; + } + + .wp-block[data-align="wide"] { + width: 100%; + } + + .wp-block[data-align="right"] { + max-width: 125%; + } + } +} + +/** === Content Width === */ + +.wp-block { + max-width: 100%; + + @include media(tablet) { + width: calc(8 * (100vw / 12)); + } + + @include media(desktop) { + width: calc(6 * (100vw / 12 )); + } + + // Only the top level blocks need specific widths, therefore override for every nested block. + .wp-block { + width: 100%; + } +} + +/** === Base Typography === */ + +body { + font-size: $font__size_base; + @include font-family( $font__body ); + line-height: $font__line-height-body; + color: $color__text-main; +} + +p { + font-size: $font__size_base; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + @include font-family( $font__heading ); + font-weight: 700; +} + +h1 { + font-size: $font__size-xl; + @include post-section-dash; + + @include media(tablet) { + font-size: $font__size-xxl; + } +} + +h2 { + font-size: $font__size-lg; + @include post-section-dash; + + @include media(tablet) { + font-size: $font__size-xl; + } +} + +h3 { + font-size: $font__size-lg; +} + +h4 { + font-size: $font__size-md; +} + +h5 { + font-size: $font__size-sm; +} + +h6 { + font-size: $font__size-xs; +} + +a { + @include link-transition; + color: $color__link; + + *:visited { + + } + + &:hover, + &:active { + color: $color__link-hover; + outline: 0; + text-decoration: none; + } + + &:focus { + outline: 0; + text-decoration: underline; + } +} + +// Use white text against these backgrounds by default. +.has-primary-background-color, +.has-secondary-background-color, +.has-dark-gray-background-color, +.has-light-gray-background-color { + color: $color__background-body; + + p, + h1, + h2, + h3, + h4, + h5, + h6, + a { + color: $color__background-body; + } +} + +// Use dark gray text against this background by default. +.has-white-background-color { + color: $color__text-main; + + p, + h1, + h2, + h3, + h4, + h5, + h6, + a { + color: $color__text-main; + } +} + +figcaption, +.gallery-caption { + @include font-family( $font__heading ); + font-size: $font__size-xs; + line-height: 1.6; + color: $color__text-light; +} + +/** === Post Title === */ + +.editor-post-title__block { + @include post-section-dash; + + &:before { + width: $font__size-xxl; + margin-top: 0; + margin-bottom: 0; + margin-left: 1rem; + position: relative; + top: 0.5em; + + @include media(mobile) { + margin-left: 0; + } + } + + .editor-post-title__input { + @include font-family( $font__heading ); + font-size: $font__size-xxl; + font-weight: 700; + } +} + +/** === Default Appender === */ + +.block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + @include font-family( $font__body ); + font-size: $font__size_base; +} + +/** === Heading === */ + +.wp-block-heading { + strong { + font-weight: bolder; + } +} +/** === Paragraph === */ + +.wp-block-paragraph { + + &.has-drop-cap:not(:focus)::first-letter { + @include font-family( $font__heading ); + font-size: $font__size-xxxl; + line-height: 1; + font-weight: bold; + margin: 0 0.25em 0 0; + } +} + +/** === Table === */ + +.wp-block-table { + @include font-family( $font__heading ); +} + +/** === Cover === */ + +.wp-block-cover { + + h2, + .wp-block-cover-text { + @include font-family( $font__heading ); + font-size: $font__size-lg; + font-weight: bold; + line-height: 1.4; + padding-left: $size__spacing-unit; + padding-right: $size__spacing-unit; + + strong { + font-weight: bolder; + } + + @include media(tablet) { + margin-left: auto; + margin-right: auto; + padding: 0; + } + } + + @include media(tablet) { + padding-left: 10%; + padding-right: 10%; + + h2, + .wp-block-cover-text { + font-size: $font__size-xl; + } + } +} + +.wp-block[data-type="core/cover"][data-align="left"], +.wp-block[data-type="core/cover"][data-align="right"] { + + .editor-block-list__block-edit { + width: calc(4 * (100vw / 12)); + } + + .wp-block-cover { + width: 100%; + max-width: 100%; + padding: calc(1.375 * #{$size__spacing-unit}); + + p { + padding-left: 0; + padding-right: 0; + } + + @include media(tablet) { + padding: calc(2.75 * #{$size__spacing-unit}) calc(2.75 * #{$size__spacing-unit}) calc(3.125 * #{$size__spacing-unit}); + } + } +} + +.wp-block[data-type="core/cover"][data-align="wide"], +.wp-block[data-type="core/cover"][data-align="full"] { + + @include media(tablet) { + + h2, + .wp-block-cover-text { + max-width: calc(8 * (100vw / 12)); + } + } + + @include media(desktop) { + + h2, + .wp-block-cover-text { + max-width: calc(6 * (100vw / 12)); + } + } +} + +.wp-block[data-type="core/cover"][data-align="full"] { + + @include media(tablet) { + + .wp-block-cover { + padding-left: calc(10% + 64px); + padding-right: calc(10% + 64px); + } + } +} + +/** === Gallery === */ + +.wp-block-gallery { + + .blocks-gallery-image figcaption, + .blocks-gallery-item figcaption, + .gallery-item .gallery-caption { + font-size: $font__size-xs; + line-height: 1.6; + } +} + +/** === Button === */ + +.wp-block-button { + + .wp-block-button__link { + line-height: 1.8; + @include font-family( $font__heading ); + font-size: $font__size-sm; + font-weight: bold; + } + + &:not(.is-style-outline) .wp-block-button__link { + background: $color__background-button; + } + + &:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; + } + + &.is-style-outline, + &.is-style-outline:hover, + &.is-style-outline:focus, + &.is-style-outline:active { + background: transparent; + color: $color__background-button; + + .wp-block-button__link { + background: transparent; + + &:not(.has-text-color) { + color: $color__background-button; + } + } + } +} + +/** === Blockquote === */ + +.wp-block-quote { + + &:not(.is-large):not(.is-style-large) { + border-width: 2px; + border-color: $color__link; + } + + &.is-large, + &.is-style-large { + margin-top: $font__size-xxl; + margin-bottom: $font__size-xxl; + } + + &.is-large p, + &.is-style-large p { + font-size: $font__size-lg; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; + } + + cite, + footer, + .wp-block-quote__citation { + @include font-family( $font__heading ); + font-size: $font__size-xs; + line-height: 1.6; + color: $color__text-light; + } +} + +/** === Pullquote === */ + +.wp-block-pullquote { + border-color: transparent; + border-width: 2px; + color: #000; + + blockquote { + margin-top: calc(3 * #{ $size__spacing-unit}); + margin-bottom: calc(3.33 * #{ $size__spacing-unit}); + hyphens: auto; + word-break: break-word; + } + + &:not(.is-style-solid-color) .wp-block-pullquote__citation { + color: $color__text-light; + } + + &.is-style-solid-color { + + blockquote { + width: calc(100% - (2 * #{ $size__spacing-unit})); + max-width: calc( 100% - (2 * #{ $size__spacing-unit})); + + a, + &.has-text-color p, + &.has-text-color a { + color: inherit; + } + + &:not(.has-text-color) { + color: $color__background-body; + } + + @include media(tablet) { + max-width: 80%; + } + } + + &:not(.has-background-color) { + background-color: $color__link; + } + } +} + +.wp-block[data-type="core/pullquote"], +.wp-block[data-type="core/pullquote"][data-align="left"], +.wp-block[data-type="core/pullquote"][data-align="right"] { + + blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + blockquote > .editor-rich-text p, + p { + font-size: $font__size-lg; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; + + @include media(tablet) { + font-size: $font__size-xl; + } + } + + .wp-block-pullquote__citation { + @include font-family( $font__heading ); + font-size: $font__size-xs; + line-height: 1.6; + text-transform: none; + } + + em { + font-style: normal; + } +} + +.wp-block[data-type="core/pullquote"][data-align="left"], +.wp-block[data-type="core/pullquote"][data-align="right"] { + + .editor-block-list__block-edit { + width: calc(4 * (100vw / 12)); + max-width: 50%; + + .wp-block-pullquote:not(.is-style-solid-color) { + padding: 0; + } + + .wp-block-pullquote.is-style-solid-color { + padding: 1em; + } + } + + blockquote > .block-library-pullquote__content .editor-rich-text__tinymce[data-is-empty="true"]::before, + blockquote > .editor-rich-text p, + p, + .wp-block-pullquote__citation { + text-align: left; + } +} + +.wp-block[data-type="core/pullquote"][data-align="full"] { + + @include media(tablet) { + + .wp-block-pullquote blockquote { + max-width: calc(80% - 128px); + } + } +} + + +/** === File === */ + +.wp-block-file { + @include font-family( $font__heading ); + + .wp-block-file__textlink { + text-decoration: underline; + color: $color__link; + + &:hover { + color: $color__link-hover; + text-decoration: none; + } + } + + .wp-block-file__button { + display: table; + line-height: 1.8; + font-size: $font__size-sm; + font-weight: bold; + background-color: $color__link; + border-radius: 5px; + } + + .wp-block-file__button-richtext-wrapper { + display: block; + margin-top: calc(0.75 * #{$size__spacing-unit}); + margin-left: 0; + } + +} + +/** === Verse === */ + +.wp-block-verse, +.wp-block-verse pre { + padding: 0; +} + +/** === Code === */ + +.wp-block-code { + border-radius: 0; +} + +/** === Table === */ + +.wp-block-table { + + td, th { + border-color: $color__text-light; + } +} + +/** === Separator === */ + +.wp-block-separator { + + &:not(.is-style-dots) { + background-color: $color__text-light; + height: 2px; + } + + &:not(.is-style-wide):not(.is-style-dots) { + width: $font__size-xl; + margin-left: 0; + } + + &.is-style-dots { + color: $color__text-light; + } + + &.is-style-dots:before { + font-size: $font__size-lg; + letter-spacing: calc(2 * #{$size__spacing-unit}); + padding-left: calc(2 * #{$size__spacing-unit}); + } +} + +/* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ +.wp-block[data-type="core/separator"] + .wp-block[data-type="core/heading"] h1:before, +.wp-block[data-type="core/separator"] + .wp-block[data-type="core/heading"] h2:before { + display: none; +} + +/** === Latest Posts, Archives, Categories === */ + +ul.wp-block-archives, +.wp-block-categories, +.wp-block-latest-posts { + padding: 0; + list-style-type: none; + + ul { + padding: 0; + list-style-type: none; + } + + li { + + > a { + @include font-family( $font__heading ); + font-size: calc(#{$font__size_base} * #{$font__size-ratio}); + font-weight: bold; + line-height: $font__line-height-heading; + text-decoration: none; + } + + ul { + padding-left: $size__spacing-unit; + } + } +} + +.wp-block-categories { + + ul { + padding-top: ( .75 * $size__spacing-unit ); + @include nestedSubMenuPadding(); + } + + li ul { + list-style: none; + padding-left: 0; + margin-bottom: ( -.75 * $size__spacing-unit ); + } + +} + +/** === Latest Posts === */ +.wp-block-latest-posts { + + .wp-block-latest-posts__post-date { + @include font-family( $font__heading ); + font-size: $font__size-xs; + color: $color__text-light; + line-height: 1.2; + } + + .wp-block-latest-posts__post-full-content, + .wp-block-latest-posts__post-excerpt { + margin-top: $font__size_base; + margin-bottom: $font__size_base; + + > div > p:first-child { + margin-top: $font__size_base; + } + } + + li { + padding-bottom: ( .5 * $size__spacing-unit ); + + &.menu-item-has-children, + &:last-child { + padding-bottom: 0; + } + + :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: ( .5 * $size__spacing-unit ); + } + } + + &.is-grid { + li { + border-top: 2px solid $color__border; + padding-top: (1 * $size__spacing-unit); + margin-bottom: (2 * $size__spacing-unit); + a { + &:after { + content: ''; + } + } + &:last-child { + margin-bottom: auto; + a:after { + content: ''; + } + } + } + } +} + +/** === Latest Comments === */ + +.wp-block-latest-comments { + + .wp-block-latest-comments__comment-meta { + @include font-family( $font__heading ); + font-weight: bold; + + .wp-block-latest-comments__comment-date { + font-weight: normal; + } + } + + .wp-block-latest-comments__comment, + .wp-block-latest-comments__comment-date, + .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; + } + + .wp-block-latest-comments__comment-date { + font-size: $font__size-xs; + } +} + +/** === Classic Editor === */ + +/* Properly center-align captions in the classic-editor block */ +.wp-caption { + dd { + color: $color__text-light; + font-size: $font__size-xs; + @include font-family( $font__heading ); + line-height: $font__line-height-pre; + margin: 0; + padding: ( $size__spacing-unit * .5 ); + text-align: left; + text-align: center; + -webkit-margin-start: 0px; + margin-inline-start: 0px; + } +} + +.wp-block-freeform { + + /* Add style for galleries in classic-editor block */ + blockquote { + border-left: 2px solid $color__link; + + cite { + @include font-family( $font__heading ); + font-size: $font__size-xs; + font-style: normal; + line-height: 1.6; + color: $color__text-light; + } + } +} + +/** === Group Block === */ + +// This matches the 22px value for 1rem that used on the front end. +// It must be specified in pixels for the editor, since the root font +// size is different here. +$group-block-background__padding: $font__size_base; + +.wp-block[data-type="core/group"] { + + // Group block base styles + > .wp-block-group { + + // Child: Full alignment + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: 0; + margin-right: 0; + } + } + + // Group block with background color + > .wp-block-group.has-background { + padding: $group-block-background__padding; + + // Child: Full alignment + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: -$group-block-background__padding; + width: calc(100% + #{$group-block-background__padding * 2}); + max-width: calc(100% + #{$group-block-background__padding * 2}); + } + } + + // Wide and full alignments + &[data-align="wide"] > .is-block-content { + + // Group block base styles. + > .wp-block-group { + + // Child blocks: Default alignments + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + @include media(tablet) { + width: calc(8 * (100vw / 12)); + } + + @include media(desktop) { + width: calc(6 * (100vw / 12 )); + } + } + + // Child blocks: Full alignment + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + padding-left: 0; + padding-right: 0; + } + } + + // Group block with background color + > .wp-block-group.has-background { + + // Child blocks: Default alignments + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not([data-align="wide"]):not([data-align="full"]) { + @include media(tablet) { + width: calc(8 * (100vw / 12) - #{$group-block-background__padding * 2}); + } + + @include media(desktop) { + width: calc(6 * (100vw / 12 ) - #{$group-block-background__padding * 2}); + } + } + } + } + + // Full alignment + &[data-align="full"] { + + // Group block base styles + > .is-block-content > .wp-block-group { + + // Margins & padding are added to this container to mimic + // the style + spacing of the .editor-writing-flow global + // container. This way, child items sync up with the placement + // and size of other top-level blocks. + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + + @include media(mobile) { + padding-left: 46px; + padding-right: 46px; + } + + // 2px of extra padding are added to each side here + // To better match up with the spacing of the whole + // document. + @include media(tablet) { + width: 80%; + margin-left: 10%; + margin-right: 10%; + padding-left: 48px; + padding-right: 48px; + } + + // Child blocks: All alignments except full + > .wp-block:not([data-align="full"]) { + max-width: calc(100vw - (2 * 1rem)); + + @include media(tablet) { + max-width: calc(8 * (100vw / 12)); + } + + @include media(desktop) { + max-width: calc(6 * (100vw / 12)); + } + } + + // Child blocks: Right alignments + > .wp-block[data-align="right"] { + + @include media(tablet) { + max-width: 125%; + } + } + + // Child blocks: Wide alignments + > .wp-block[data-align="wide"] { + + @include media(tablet) { + width: calc(100% + 4px); + max-width: calc(100% + 4px); + } + } + + // Child blocks: Full alignments + > .wp-block[data-align=full] { + max-width: calc(100vw + (2 * 1rem)); + + @include media(mobile) { + width: calc(100% + 92px); + left: -46px; + } + + @include media(tablet) { + left: calc(-12.5% - 58px); + width: calc(125% + 120px); + max-width: calc(125% + 119px); + } + } + } + } + + // Group block with background color + > .is-block-content > .wp-block-group.has-background { + + // When the Group block is full width, we can remove the left/right padding + // and let this inherit the + padding: $group-block-background__padding 0; + + @include media(mobile) { + padding-left: 0; + padding-right: 0; + } + + // Child blocks: Full alignment + > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: 0; + width: 100%; + + @include media(mobile) { + width: calc(100% + 92px); + } + + @include media(tablet) { + width: calc(125% + 120px); + } + } + } + } +} diff --git a/content/themes/twentynineteen/style-rtl.css b/content/themes/twentynineteen/style-rtl.css new file mode 100644 index 0000000..662c409 --- /dev/null +++ b/content/themes/twentynineteen/style-rtl.css @@ -0,0 +1,6555 @@ +@charset "UTF-8"; +/* +Theme Name: Twenty Nineteen +Theme URI: https://wordpress.org/themes/twentynineteen/ +Author: the WordPress team +Author URI: https://wordpress.org/ +Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes. +Requires at least: 4.9.6 +Requires PHP: 5.2.4 +Version: 1.5 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Text Domain: twentynineteen +Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned with others. + +Twenty Nineteen is based on Underscores https://underscores.me/, (C) 2012-2019 Automattic, Inc. +Underscores is distributed under the terms of the GNU GPL v2 or later. + +Normalizing styles have been helped along thanks to the fine work of +Nicolas Gallagher and Jonathan Neal https://necolas.github.io/normalize.css/ +*/ +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Variables +# Normalize +# Typography + ## Headings + ## Copy +# Elements + ## Lists + ## Tables +# Forms + ## Buttons + ## Fields +# Navigation + ## Links + ## Menus + ## Next & Previous +# Accessibility +# Alignments +# Clearings +# Layout +# Widgets +# Content + ## Archives + ## Posts and pages + ## Comments +# Blocks +# Media + ## Captions + ## Galleries +--------------------------------------------------------------*/ +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the Classic and block + * editors. The following font-face override fixes the issue by manually inserting + * a custom font that includes just a Hoefler Text space replacement for that + * character instead. + */ +@font-face { + font-family: 'NonBreakingSpaceOverride'; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* If we add the border using a regular CSS border, it won't look good on non-retina devices, + * since its edges can look jagged due to lack of antialiasing. In this case, we are several + * layers of box-shadow to add the border visually, which will render the border smoother. */ +/* Calculates maximum width for post content */ +/* Nested sub-menu padding: 10 levels deep */ +/* Ensure all font family declarations come with non-latin fallbacks */ +/* Build our non-latin font styles */ +body:lang(ar), button:lang(ar), +input:lang(ar), +select:lang(ar), +optgroup:lang(ar), +textarea:lang(ar), .author-description .author-link:lang(ar), +.comment-metadata:lang(ar), +.comment-reply-link:lang(ar), +.comments-title:lang(ar), +.comment-author .fn:lang(ar), +.discussion-meta-info:lang(ar), +.entry-meta:lang(ar), +.entry-footer:lang(ar), +.main-navigation:lang(ar), +.no-comments:lang(ar), +.not-found .page-title:lang(ar), +.error-404 .page-title:lang(ar), +.post-navigation .post-title:lang(ar), +.page-links:lang(ar), +.page-description:lang(ar), +.pagination .nav-links:lang(ar), +.sticky-post:lang(ar), +.site-title:lang(ar), +.site-info:lang(ar), +#cancel-comment-reply-link:lang(ar), +h1:lang(ar), +h2:lang(ar), +h3:lang(ar), +h4:lang(ar), +h5:lang(ar), +h6:lang(ar), .page-title:lang(ar), blockquote cite:lang(ar), table:lang(ar), .button:lang(ar), +input:lang(ar)[type="button"], +input:lang(ar)[type="reset"], +input:lang(ar)[type="submit"], .comment-navigation .nav-previous:lang(ar), +.comment-navigation .nav-next:lang(ar), .comment-list .pingback .comment-body:lang(ar), +.comment-list .trackback .comment-body:lang(ar), .comment-list .pingback .comment-body .comment-edit-link:lang(ar), +.comment-list .trackback .comment-body .comment-edit-link:lang(ar), .comment-form .comment-notes:lang(ar), +.comment-form label:lang(ar), .widget_archive ul li:lang(ar), +.widget_categories ul li:lang(ar), +.widget_meta ul li:lang(ar), +.widget_nav_menu ul li:lang(ar), +.widget_pages ul li:lang(ar), +.widget_recent_comments ul li:lang(ar), +.widget_recent_entries ul li:lang(ar), +.widget_rss ul li:lang(ar), .widget_tag_cloud .tagcloud:lang(ar), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ar), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ar), .entry .entry-content .wp-block-archives li > a:lang(ar), +.entry .entry-content .wp-block-categories li > a:lang(ar), +.entry .entry-content .wp-block-latest-posts li > a:lang(ar), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ar), .entry .entry-content .wp-block-verse:lang(ar), .entry .entry-content .has-drop-cap:lang(ar):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ar), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ar), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ar), +.entry .entry-content .wp-block-cover-image h2:lang(ar), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ar), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ar), +.entry .entry-content .wp-block-cover h2:lang(ar), .entry .entry-content .wp-block-audio figcaption:lang(ar), +.entry .entry-content .wp-block-video figcaption:lang(ar), +.entry .entry-content .wp-block-image figcaption:lang(ar), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ar), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ar), .entry .entry-content .wp-block-file:lang(ar), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ar), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ar), .wp-caption-text:lang(ar), .gallery-caption:lang(ar) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ary), button:lang(ary), +input:lang(ary), +select:lang(ary), +optgroup:lang(ary), +textarea:lang(ary), .author-description .author-link:lang(ary), +.comment-metadata:lang(ary), +.comment-reply-link:lang(ary), +.comments-title:lang(ary), +.comment-author .fn:lang(ary), +.discussion-meta-info:lang(ary), +.entry-meta:lang(ary), +.entry-footer:lang(ary), +.main-navigation:lang(ary), +.no-comments:lang(ary), +.not-found .page-title:lang(ary), +.error-404 .page-title:lang(ary), +.post-navigation .post-title:lang(ary), +.page-links:lang(ary), +.page-description:lang(ary), +.pagination .nav-links:lang(ary), +.sticky-post:lang(ary), +.site-title:lang(ary), +.site-info:lang(ary), +#cancel-comment-reply-link:lang(ary), +h1:lang(ary), +h2:lang(ary), +h3:lang(ary), +h4:lang(ary), +h5:lang(ary), +h6:lang(ary), .page-title:lang(ary), blockquote cite:lang(ary), table:lang(ary), .button:lang(ary), +input:lang(ary)[type="button"], +input:lang(ary)[type="reset"], +input:lang(ary)[type="submit"], .comment-navigation .nav-previous:lang(ary), +.comment-navigation .nav-next:lang(ary), .comment-list .pingback .comment-body:lang(ary), +.comment-list .trackback .comment-body:lang(ary), .comment-list .pingback .comment-body .comment-edit-link:lang(ary), +.comment-list .trackback .comment-body .comment-edit-link:lang(ary), .comment-form .comment-notes:lang(ary), +.comment-form label:lang(ary), .widget_archive ul li:lang(ary), +.widget_categories ul li:lang(ary), +.widget_meta ul li:lang(ary), +.widget_nav_menu ul li:lang(ary), +.widget_pages ul li:lang(ary), +.widget_recent_comments ul li:lang(ary), +.widget_recent_entries ul li:lang(ary), +.widget_rss ul li:lang(ary), .widget_tag_cloud .tagcloud:lang(ary), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ary), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ary), .entry .entry-content .wp-block-archives li > a:lang(ary), +.entry .entry-content .wp-block-categories li > a:lang(ary), +.entry .entry-content .wp-block-latest-posts li > a:lang(ary), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ary), .entry .entry-content .wp-block-verse:lang(ary), .entry .entry-content .has-drop-cap:lang(ary):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ary), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ary), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ary), +.entry .entry-content .wp-block-cover-image h2:lang(ary), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ary), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ary), +.entry .entry-content .wp-block-cover h2:lang(ary), .entry .entry-content .wp-block-audio figcaption:lang(ary), +.entry .entry-content .wp-block-video figcaption:lang(ary), +.entry .entry-content .wp-block-image figcaption:lang(ary), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ary), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ary), .entry .entry-content .wp-block-file:lang(ary), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ary), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ary), .wp-caption-text:lang(ary), .gallery-caption:lang(ary) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(azb), button:lang(azb), +input:lang(azb), +select:lang(azb), +optgroup:lang(azb), +textarea:lang(azb), .author-description .author-link:lang(azb), +.comment-metadata:lang(azb), +.comment-reply-link:lang(azb), +.comments-title:lang(azb), +.comment-author .fn:lang(azb), +.discussion-meta-info:lang(azb), +.entry-meta:lang(azb), +.entry-footer:lang(azb), +.main-navigation:lang(azb), +.no-comments:lang(azb), +.not-found .page-title:lang(azb), +.error-404 .page-title:lang(azb), +.post-navigation .post-title:lang(azb), +.page-links:lang(azb), +.page-description:lang(azb), +.pagination .nav-links:lang(azb), +.sticky-post:lang(azb), +.site-title:lang(azb), +.site-info:lang(azb), +#cancel-comment-reply-link:lang(azb), +h1:lang(azb), +h2:lang(azb), +h3:lang(azb), +h4:lang(azb), +h5:lang(azb), +h6:lang(azb), .page-title:lang(azb), blockquote cite:lang(azb), table:lang(azb), .button:lang(azb), +input:lang(azb)[type="button"], +input:lang(azb)[type="reset"], +input:lang(azb)[type="submit"], .comment-navigation .nav-previous:lang(azb), +.comment-navigation .nav-next:lang(azb), .comment-list .pingback .comment-body:lang(azb), +.comment-list .trackback .comment-body:lang(azb), .comment-list .pingback .comment-body .comment-edit-link:lang(azb), +.comment-list .trackback .comment-body .comment-edit-link:lang(azb), .comment-form .comment-notes:lang(azb), +.comment-form label:lang(azb), .widget_archive ul li:lang(azb), +.widget_categories ul li:lang(azb), +.widget_meta ul li:lang(azb), +.widget_nav_menu ul li:lang(azb), +.widget_pages ul li:lang(azb), +.widget_recent_comments ul li:lang(azb), +.widget_recent_entries ul li:lang(azb), +.widget_rss ul li:lang(azb), .widget_tag_cloud .tagcloud:lang(azb), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(azb), .entry .entry-content .wp-block-button .wp-block-button__link:lang(azb), .entry .entry-content .wp-block-archives li > a:lang(azb), +.entry .entry-content .wp-block-categories li > a:lang(azb), +.entry .entry-content .wp-block-latest-posts li > a:lang(azb), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(azb), .entry .entry-content .wp-block-verse:lang(azb), .entry .entry-content .has-drop-cap:lang(azb):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(azb), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(azb), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(azb), +.entry .entry-content .wp-block-cover-image h2:lang(azb), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(azb), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(azb), +.entry .entry-content .wp-block-cover h2:lang(azb), .entry .entry-content .wp-block-audio figcaption:lang(azb), +.entry .entry-content .wp-block-video figcaption:lang(azb), +.entry .entry-content .wp-block-image figcaption:lang(azb), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(azb), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(azb), .entry .entry-content .wp-block-file:lang(azb), .entry .entry-content .wp-block-file .wp-block-file__button:lang(azb), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(azb), .wp-caption-text:lang(azb), .gallery-caption:lang(azb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ckb), button:lang(ckb), +input:lang(ckb), +select:lang(ckb), +optgroup:lang(ckb), +textarea:lang(ckb), .author-description .author-link:lang(ckb), +.comment-metadata:lang(ckb), +.comment-reply-link:lang(ckb), +.comments-title:lang(ckb), +.comment-author .fn:lang(ckb), +.discussion-meta-info:lang(ckb), +.entry-meta:lang(ckb), +.entry-footer:lang(ckb), +.main-navigation:lang(ckb), +.no-comments:lang(ckb), +.not-found .page-title:lang(ckb), +.error-404 .page-title:lang(ckb), +.post-navigation .post-title:lang(ckb), +.page-links:lang(ckb), +.page-description:lang(ckb), +.pagination .nav-links:lang(ckb), +.sticky-post:lang(ckb), +.site-title:lang(ckb), +.site-info:lang(ckb), +#cancel-comment-reply-link:lang(ckb), +h1:lang(ckb), +h2:lang(ckb), +h3:lang(ckb), +h4:lang(ckb), +h5:lang(ckb), +h6:lang(ckb), .page-title:lang(ckb), blockquote cite:lang(ckb), table:lang(ckb), .button:lang(ckb), +input:lang(ckb)[type="button"], +input:lang(ckb)[type="reset"], +input:lang(ckb)[type="submit"], .comment-navigation .nav-previous:lang(ckb), +.comment-navigation .nav-next:lang(ckb), .comment-list .pingback .comment-body:lang(ckb), +.comment-list .trackback .comment-body:lang(ckb), .comment-list .pingback .comment-body .comment-edit-link:lang(ckb), +.comment-list .trackback .comment-body .comment-edit-link:lang(ckb), .comment-form .comment-notes:lang(ckb), +.comment-form label:lang(ckb), .widget_archive ul li:lang(ckb), +.widget_categories ul li:lang(ckb), +.widget_meta ul li:lang(ckb), +.widget_nav_menu ul li:lang(ckb), +.widget_pages ul li:lang(ckb), +.widget_recent_comments ul li:lang(ckb), +.widget_recent_entries ul li:lang(ckb), +.widget_rss ul li:lang(ckb), .widget_tag_cloud .tagcloud:lang(ckb), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ckb), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ckb), .entry .entry-content .wp-block-archives li > a:lang(ckb), +.entry .entry-content .wp-block-categories li > a:lang(ckb), +.entry .entry-content .wp-block-latest-posts li > a:lang(ckb), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ckb), .entry .entry-content .wp-block-verse:lang(ckb), .entry .entry-content .has-drop-cap:lang(ckb):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ckb), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ckb), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ckb), +.entry .entry-content .wp-block-cover-image h2:lang(ckb), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ckb), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ckb), +.entry .entry-content .wp-block-cover h2:lang(ckb), .entry .entry-content .wp-block-audio figcaption:lang(ckb), +.entry .entry-content .wp-block-video figcaption:lang(ckb), +.entry .entry-content .wp-block-image figcaption:lang(ckb), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ckb), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ckb), .entry .entry-content .wp-block-file:lang(ckb), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ckb), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ckb), .wp-caption-text:lang(ckb), .gallery-caption:lang(ckb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(fa-IR), button:lang(fa-IR), +input:lang(fa-IR), +select:lang(fa-IR), +optgroup:lang(fa-IR), +textarea:lang(fa-IR), .author-description .author-link:lang(fa-IR), +.comment-metadata:lang(fa-IR), +.comment-reply-link:lang(fa-IR), +.comments-title:lang(fa-IR), +.comment-author .fn:lang(fa-IR), +.discussion-meta-info:lang(fa-IR), +.entry-meta:lang(fa-IR), +.entry-footer:lang(fa-IR), +.main-navigation:lang(fa-IR), +.no-comments:lang(fa-IR), +.not-found .page-title:lang(fa-IR), +.error-404 .page-title:lang(fa-IR), +.post-navigation .post-title:lang(fa-IR), +.page-links:lang(fa-IR), +.page-description:lang(fa-IR), +.pagination .nav-links:lang(fa-IR), +.sticky-post:lang(fa-IR), +.site-title:lang(fa-IR), +.site-info:lang(fa-IR), +#cancel-comment-reply-link:lang(fa-IR), +h1:lang(fa-IR), +h2:lang(fa-IR), +h3:lang(fa-IR), +h4:lang(fa-IR), +h5:lang(fa-IR), +h6:lang(fa-IR), .page-title:lang(fa-IR), blockquote cite:lang(fa-IR), table:lang(fa-IR), .button:lang(fa-IR), +input:lang(fa-IR)[type="button"], +input:lang(fa-IR)[type="reset"], +input:lang(fa-IR)[type="submit"], .comment-navigation .nav-previous:lang(fa-IR), +.comment-navigation .nav-next:lang(fa-IR), .comment-list .pingback .comment-body:lang(fa-IR), +.comment-list .trackback .comment-body:lang(fa-IR), .comment-list .pingback .comment-body .comment-edit-link:lang(fa-IR), +.comment-list .trackback .comment-body .comment-edit-link:lang(fa-IR), .comment-form .comment-notes:lang(fa-IR), +.comment-form label:lang(fa-IR), .widget_archive ul li:lang(fa-IR), +.widget_categories ul li:lang(fa-IR), +.widget_meta ul li:lang(fa-IR), +.widget_nav_menu ul li:lang(fa-IR), +.widget_pages ul li:lang(fa-IR), +.widget_recent_comments ul li:lang(fa-IR), +.widget_recent_entries ul li:lang(fa-IR), +.widget_rss ul li:lang(fa-IR), .widget_tag_cloud .tagcloud:lang(fa-IR), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(fa-IR), .entry .entry-content .wp-block-button .wp-block-button__link:lang(fa-IR), .entry .entry-content .wp-block-archives li > a:lang(fa-IR), +.entry .entry-content .wp-block-categories li > a:lang(fa-IR), +.entry .entry-content .wp-block-latest-posts li > a:lang(fa-IR), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(fa-IR), .entry .entry-content .wp-block-verse:lang(fa-IR), .entry .entry-content .has-drop-cap:lang(fa-IR):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(fa-IR), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(fa-IR), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(fa-IR), +.entry .entry-content .wp-block-cover-image h2:lang(fa-IR), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(fa-IR), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(fa-IR), +.entry .entry-content .wp-block-cover h2:lang(fa-IR), .entry .entry-content .wp-block-audio figcaption:lang(fa-IR), +.entry .entry-content .wp-block-video figcaption:lang(fa-IR), +.entry .entry-content .wp-block-image figcaption:lang(fa-IR), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(fa-IR), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(fa-IR), .entry .entry-content .wp-block-file:lang(fa-IR), .entry .entry-content .wp-block-file .wp-block-file__button:lang(fa-IR), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(fa-IR), .wp-caption-text:lang(fa-IR), .gallery-caption:lang(fa-IR) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(haz), button:lang(haz), +input:lang(haz), +select:lang(haz), +optgroup:lang(haz), +textarea:lang(haz), .author-description .author-link:lang(haz), +.comment-metadata:lang(haz), +.comment-reply-link:lang(haz), +.comments-title:lang(haz), +.comment-author .fn:lang(haz), +.discussion-meta-info:lang(haz), +.entry-meta:lang(haz), +.entry-footer:lang(haz), +.main-navigation:lang(haz), +.no-comments:lang(haz), +.not-found .page-title:lang(haz), +.error-404 .page-title:lang(haz), +.post-navigation .post-title:lang(haz), +.page-links:lang(haz), +.page-description:lang(haz), +.pagination .nav-links:lang(haz), +.sticky-post:lang(haz), +.site-title:lang(haz), +.site-info:lang(haz), +#cancel-comment-reply-link:lang(haz), +h1:lang(haz), +h2:lang(haz), +h3:lang(haz), +h4:lang(haz), +h5:lang(haz), +h6:lang(haz), .page-title:lang(haz), blockquote cite:lang(haz), table:lang(haz), .button:lang(haz), +input:lang(haz)[type="button"], +input:lang(haz)[type="reset"], +input:lang(haz)[type="submit"], .comment-navigation .nav-previous:lang(haz), +.comment-navigation .nav-next:lang(haz), .comment-list .pingback .comment-body:lang(haz), +.comment-list .trackback .comment-body:lang(haz), .comment-list .pingback .comment-body .comment-edit-link:lang(haz), +.comment-list .trackback .comment-body .comment-edit-link:lang(haz), .comment-form .comment-notes:lang(haz), +.comment-form label:lang(haz), .widget_archive ul li:lang(haz), +.widget_categories ul li:lang(haz), +.widget_meta ul li:lang(haz), +.widget_nav_menu ul li:lang(haz), +.widget_pages ul li:lang(haz), +.widget_recent_comments ul li:lang(haz), +.widget_recent_entries ul li:lang(haz), +.widget_rss ul li:lang(haz), .widget_tag_cloud .tagcloud:lang(haz), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(haz), .entry .entry-content .wp-block-button .wp-block-button__link:lang(haz), .entry .entry-content .wp-block-archives li > a:lang(haz), +.entry .entry-content .wp-block-categories li > a:lang(haz), +.entry .entry-content .wp-block-latest-posts li > a:lang(haz), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(haz), .entry .entry-content .wp-block-verse:lang(haz), .entry .entry-content .has-drop-cap:lang(haz):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(haz), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(haz), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(haz), +.entry .entry-content .wp-block-cover-image h2:lang(haz), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(haz), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(haz), +.entry .entry-content .wp-block-cover h2:lang(haz), .entry .entry-content .wp-block-audio figcaption:lang(haz), +.entry .entry-content .wp-block-video figcaption:lang(haz), +.entry .entry-content .wp-block-image figcaption:lang(haz), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(haz), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(haz), .entry .entry-content .wp-block-file:lang(haz), .entry .entry-content .wp-block-file .wp-block-file__button:lang(haz), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(haz), .wp-caption-text:lang(haz), .gallery-caption:lang(haz) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ps), button:lang(ps), +input:lang(ps), +select:lang(ps), +optgroup:lang(ps), +textarea:lang(ps), .author-description .author-link:lang(ps), +.comment-metadata:lang(ps), +.comment-reply-link:lang(ps), +.comments-title:lang(ps), +.comment-author .fn:lang(ps), +.discussion-meta-info:lang(ps), +.entry-meta:lang(ps), +.entry-footer:lang(ps), +.main-navigation:lang(ps), +.no-comments:lang(ps), +.not-found .page-title:lang(ps), +.error-404 .page-title:lang(ps), +.post-navigation .post-title:lang(ps), +.page-links:lang(ps), +.page-description:lang(ps), +.pagination .nav-links:lang(ps), +.sticky-post:lang(ps), +.site-title:lang(ps), +.site-info:lang(ps), +#cancel-comment-reply-link:lang(ps), +h1:lang(ps), +h2:lang(ps), +h3:lang(ps), +h4:lang(ps), +h5:lang(ps), +h6:lang(ps), .page-title:lang(ps), blockquote cite:lang(ps), table:lang(ps), .button:lang(ps), +input:lang(ps)[type="button"], +input:lang(ps)[type="reset"], +input:lang(ps)[type="submit"], .comment-navigation .nav-previous:lang(ps), +.comment-navigation .nav-next:lang(ps), .comment-list .pingback .comment-body:lang(ps), +.comment-list .trackback .comment-body:lang(ps), .comment-list .pingback .comment-body .comment-edit-link:lang(ps), +.comment-list .trackback .comment-body .comment-edit-link:lang(ps), .comment-form .comment-notes:lang(ps), +.comment-form label:lang(ps), .widget_archive ul li:lang(ps), +.widget_categories ul li:lang(ps), +.widget_meta ul li:lang(ps), +.widget_nav_menu ul li:lang(ps), +.widget_pages ul li:lang(ps), +.widget_recent_comments ul li:lang(ps), +.widget_recent_entries ul li:lang(ps), +.widget_rss ul li:lang(ps), .widget_tag_cloud .tagcloud:lang(ps), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ps), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ps), .entry .entry-content .wp-block-archives li > a:lang(ps), +.entry .entry-content .wp-block-categories li > a:lang(ps), +.entry .entry-content .wp-block-latest-posts li > a:lang(ps), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ps), .entry .entry-content .wp-block-verse:lang(ps), .entry .entry-content .has-drop-cap:lang(ps):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ps), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ps), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ps), +.entry .entry-content .wp-block-cover-image h2:lang(ps), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ps), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ps), +.entry .entry-content .wp-block-cover h2:lang(ps), .entry .entry-content .wp-block-audio figcaption:lang(ps), +.entry .entry-content .wp-block-video figcaption:lang(ps), +.entry .entry-content .wp-block-image figcaption:lang(ps), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ps), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ps), .entry .entry-content .wp-block-file:lang(ps), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ps), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ps), .wp-caption-text:lang(ps), .gallery-caption:lang(ps) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(be), button:lang(be), +input:lang(be), +select:lang(be), +optgroup:lang(be), +textarea:lang(be), .author-description .author-link:lang(be), +.comment-metadata:lang(be), +.comment-reply-link:lang(be), +.comments-title:lang(be), +.comment-author .fn:lang(be), +.discussion-meta-info:lang(be), +.entry-meta:lang(be), +.entry-footer:lang(be), +.main-navigation:lang(be), +.no-comments:lang(be), +.not-found .page-title:lang(be), +.error-404 .page-title:lang(be), +.post-navigation .post-title:lang(be), +.page-links:lang(be), +.page-description:lang(be), +.pagination .nav-links:lang(be), +.sticky-post:lang(be), +.site-title:lang(be), +.site-info:lang(be), +#cancel-comment-reply-link:lang(be), +h1:lang(be), +h2:lang(be), +h3:lang(be), +h4:lang(be), +h5:lang(be), +h6:lang(be), .page-title:lang(be), blockquote cite:lang(be), table:lang(be), .button:lang(be), +input:lang(be)[type="button"], +input:lang(be)[type="reset"], +input:lang(be)[type="submit"], .comment-navigation .nav-previous:lang(be), +.comment-navigation .nav-next:lang(be), .comment-list .pingback .comment-body:lang(be), +.comment-list .trackback .comment-body:lang(be), .comment-list .pingback .comment-body .comment-edit-link:lang(be), +.comment-list .trackback .comment-body .comment-edit-link:lang(be), .comment-form .comment-notes:lang(be), +.comment-form label:lang(be), .widget_archive ul li:lang(be), +.widget_categories ul li:lang(be), +.widget_meta ul li:lang(be), +.widget_nav_menu ul li:lang(be), +.widget_pages ul li:lang(be), +.widget_recent_comments ul li:lang(be), +.widget_recent_entries ul li:lang(be), +.widget_rss ul li:lang(be), .widget_tag_cloud .tagcloud:lang(be), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(be), .entry .entry-content .wp-block-button .wp-block-button__link:lang(be), .entry .entry-content .wp-block-archives li > a:lang(be), +.entry .entry-content .wp-block-categories li > a:lang(be), +.entry .entry-content .wp-block-latest-posts li > a:lang(be), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(be), .entry .entry-content .wp-block-verse:lang(be), .entry .entry-content .has-drop-cap:lang(be):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(be), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(be), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(be), +.entry .entry-content .wp-block-cover-image h2:lang(be), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(be), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(be), +.entry .entry-content .wp-block-cover h2:lang(be), .entry .entry-content .wp-block-audio figcaption:lang(be), +.entry .entry-content .wp-block-video figcaption:lang(be), +.entry .entry-content .wp-block-image figcaption:lang(be), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(be), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(be), .entry .entry-content .wp-block-file:lang(be), .entry .entry-content .wp-block-file .wp-block-file__button:lang(be), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(be), .wp-caption-text:lang(be), .gallery-caption:lang(be) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(bg-BG), button:lang(bg-BG), +input:lang(bg-BG), +select:lang(bg-BG), +optgroup:lang(bg-BG), +textarea:lang(bg-BG), .author-description .author-link:lang(bg-BG), +.comment-metadata:lang(bg-BG), +.comment-reply-link:lang(bg-BG), +.comments-title:lang(bg-BG), +.comment-author .fn:lang(bg-BG), +.discussion-meta-info:lang(bg-BG), +.entry-meta:lang(bg-BG), +.entry-footer:lang(bg-BG), +.main-navigation:lang(bg-BG), +.no-comments:lang(bg-BG), +.not-found .page-title:lang(bg-BG), +.error-404 .page-title:lang(bg-BG), +.post-navigation .post-title:lang(bg-BG), +.page-links:lang(bg-BG), +.page-description:lang(bg-BG), +.pagination .nav-links:lang(bg-BG), +.sticky-post:lang(bg-BG), +.site-title:lang(bg-BG), +.site-info:lang(bg-BG), +#cancel-comment-reply-link:lang(bg-BG), +h1:lang(bg-BG), +h2:lang(bg-BG), +h3:lang(bg-BG), +h4:lang(bg-BG), +h5:lang(bg-BG), +h6:lang(bg-BG), .page-title:lang(bg-BG), blockquote cite:lang(bg-BG), table:lang(bg-BG), .button:lang(bg-BG), +input:lang(bg-BG)[type="button"], +input:lang(bg-BG)[type="reset"], +input:lang(bg-BG)[type="submit"], .comment-navigation .nav-previous:lang(bg-BG), +.comment-navigation .nav-next:lang(bg-BG), .comment-list .pingback .comment-body:lang(bg-BG), +.comment-list .trackback .comment-body:lang(bg-BG), .comment-list .pingback .comment-body .comment-edit-link:lang(bg-BG), +.comment-list .trackback .comment-body .comment-edit-link:lang(bg-BG), .comment-form .comment-notes:lang(bg-BG), +.comment-form label:lang(bg-BG), .widget_archive ul li:lang(bg-BG), +.widget_categories ul li:lang(bg-BG), +.widget_meta ul li:lang(bg-BG), +.widget_nav_menu ul li:lang(bg-BG), +.widget_pages ul li:lang(bg-BG), +.widget_recent_comments ul li:lang(bg-BG), +.widget_recent_entries ul li:lang(bg-BG), +.widget_rss ul li:lang(bg-BG), .widget_tag_cloud .tagcloud:lang(bg-BG), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(bg-BG), .entry .entry-content .wp-block-button .wp-block-button__link:lang(bg-BG), .entry .entry-content .wp-block-archives li > a:lang(bg-BG), +.entry .entry-content .wp-block-categories li > a:lang(bg-BG), +.entry .entry-content .wp-block-latest-posts li > a:lang(bg-BG), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bg-BG), .entry .entry-content .wp-block-verse:lang(bg-BG), .entry .entry-content .has-drop-cap:lang(bg-BG):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(bg-BG), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(bg-BG), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(bg-BG), +.entry .entry-content .wp-block-cover-image h2:lang(bg-BG), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(bg-BG), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(bg-BG), +.entry .entry-content .wp-block-cover h2:lang(bg-BG), .entry .entry-content .wp-block-audio figcaption:lang(bg-BG), +.entry .entry-content .wp-block-video figcaption:lang(bg-BG), +.entry .entry-content .wp-block-image figcaption:lang(bg-BG), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(bg-BG), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(bg-BG), .entry .entry-content .wp-block-file:lang(bg-BG), .entry .entry-content .wp-block-file .wp-block-file__button:lang(bg-BG), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bg-BG), .wp-caption-text:lang(bg-BG), .gallery-caption:lang(bg-BG) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(kk), button:lang(kk), +input:lang(kk), +select:lang(kk), +optgroup:lang(kk), +textarea:lang(kk), .author-description .author-link:lang(kk), +.comment-metadata:lang(kk), +.comment-reply-link:lang(kk), +.comments-title:lang(kk), +.comment-author .fn:lang(kk), +.discussion-meta-info:lang(kk), +.entry-meta:lang(kk), +.entry-footer:lang(kk), +.main-navigation:lang(kk), +.no-comments:lang(kk), +.not-found .page-title:lang(kk), +.error-404 .page-title:lang(kk), +.post-navigation .post-title:lang(kk), +.page-links:lang(kk), +.page-description:lang(kk), +.pagination .nav-links:lang(kk), +.sticky-post:lang(kk), +.site-title:lang(kk), +.site-info:lang(kk), +#cancel-comment-reply-link:lang(kk), +h1:lang(kk), +h2:lang(kk), +h3:lang(kk), +h4:lang(kk), +h5:lang(kk), +h6:lang(kk), .page-title:lang(kk), blockquote cite:lang(kk), table:lang(kk), .button:lang(kk), +input:lang(kk)[type="button"], +input:lang(kk)[type="reset"], +input:lang(kk)[type="submit"], .comment-navigation .nav-previous:lang(kk), +.comment-navigation .nav-next:lang(kk), .comment-list .pingback .comment-body:lang(kk), +.comment-list .trackback .comment-body:lang(kk), .comment-list .pingback .comment-body .comment-edit-link:lang(kk), +.comment-list .trackback .comment-body .comment-edit-link:lang(kk), .comment-form .comment-notes:lang(kk), +.comment-form label:lang(kk), .widget_archive ul li:lang(kk), +.widget_categories ul li:lang(kk), +.widget_meta ul li:lang(kk), +.widget_nav_menu ul li:lang(kk), +.widget_pages ul li:lang(kk), +.widget_recent_comments ul li:lang(kk), +.widget_recent_entries ul li:lang(kk), +.widget_rss ul li:lang(kk), .widget_tag_cloud .tagcloud:lang(kk), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(kk), .entry .entry-content .wp-block-button .wp-block-button__link:lang(kk), .entry .entry-content .wp-block-archives li > a:lang(kk), +.entry .entry-content .wp-block-categories li > a:lang(kk), +.entry .entry-content .wp-block-latest-posts li > a:lang(kk), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(kk), .entry .entry-content .wp-block-verse:lang(kk), .entry .entry-content .has-drop-cap:lang(kk):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(kk), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(kk), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(kk), +.entry .entry-content .wp-block-cover-image h2:lang(kk), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(kk), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(kk), +.entry .entry-content .wp-block-cover h2:lang(kk), .entry .entry-content .wp-block-audio figcaption:lang(kk), +.entry .entry-content .wp-block-video figcaption:lang(kk), +.entry .entry-content .wp-block-image figcaption:lang(kk), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(kk), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(kk), .entry .entry-content .wp-block-file:lang(kk), .entry .entry-content .wp-block-file .wp-block-file__button:lang(kk), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(kk), .wp-caption-text:lang(kk), .gallery-caption:lang(kk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mk-MK), button:lang(mk-MK), +input:lang(mk-MK), +select:lang(mk-MK), +optgroup:lang(mk-MK), +textarea:lang(mk-MK), .author-description .author-link:lang(mk-MK), +.comment-metadata:lang(mk-MK), +.comment-reply-link:lang(mk-MK), +.comments-title:lang(mk-MK), +.comment-author .fn:lang(mk-MK), +.discussion-meta-info:lang(mk-MK), +.entry-meta:lang(mk-MK), +.entry-footer:lang(mk-MK), +.main-navigation:lang(mk-MK), +.no-comments:lang(mk-MK), +.not-found .page-title:lang(mk-MK), +.error-404 .page-title:lang(mk-MK), +.post-navigation .post-title:lang(mk-MK), +.page-links:lang(mk-MK), +.page-description:lang(mk-MK), +.pagination .nav-links:lang(mk-MK), +.sticky-post:lang(mk-MK), +.site-title:lang(mk-MK), +.site-info:lang(mk-MK), +#cancel-comment-reply-link:lang(mk-MK), +h1:lang(mk-MK), +h2:lang(mk-MK), +h3:lang(mk-MK), +h4:lang(mk-MK), +h5:lang(mk-MK), +h6:lang(mk-MK), .page-title:lang(mk-MK), blockquote cite:lang(mk-MK), table:lang(mk-MK), .button:lang(mk-MK), +input:lang(mk-MK)[type="button"], +input:lang(mk-MK)[type="reset"], +input:lang(mk-MK)[type="submit"], .comment-navigation .nav-previous:lang(mk-MK), +.comment-navigation .nav-next:lang(mk-MK), .comment-list .pingback .comment-body:lang(mk-MK), +.comment-list .trackback .comment-body:lang(mk-MK), .comment-list .pingback .comment-body .comment-edit-link:lang(mk-MK), +.comment-list .trackback .comment-body .comment-edit-link:lang(mk-MK), .comment-form .comment-notes:lang(mk-MK), +.comment-form label:lang(mk-MK), .widget_archive ul li:lang(mk-MK), +.widget_categories ul li:lang(mk-MK), +.widget_meta ul li:lang(mk-MK), +.widget_nav_menu ul li:lang(mk-MK), +.widget_pages ul li:lang(mk-MK), +.widget_recent_comments ul li:lang(mk-MK), +.widget_recent_entries ul li:lang(mk-MK), +.widget_rss ul li:lang(mk-MK), .widget_tag_cloud .tagcloud:lang(mk-MK), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mk-MK), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mk-MK), .entry .entry-content .wp-block-archives li > a:lang(mk-MK), +.entry .entry-content .wp-block-categories li > a:lang(mk-MK), +.entry .entry-content .wp-block-latest-posts li > a:lang(mk-MK), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mk-MK), .entry .entry-content .wp-block-verse:lang(mk-MK), .entry .entry-content .has-drop-cap:lang(mk-MK):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mk-MK), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mk-MK), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mk-MK), +.entry .entry-content .wp-block-cover-image h2:lang(mk-MK), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mk-MK), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mk-MK), +.entry .entry-content .wp-block-cover h2:lang(mk-MK), .entry .entry-content .wp-block-audio figcaption:lang(mk-MK), +.entry .entry-content .wp-block-video figcaption:lang(mk-MK), +.entry .entry-content .wp-block-image figcaption:lang(mk-MK), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mk-MK), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mk-MK), .entry .entry-content .wp-block-file:lang(mk-MK), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mk-MK), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mk-MK), .wp-caption-text:lang(mk-MK), .gallery-caption:lang(mk-MK) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mn), button:lang(mn), +input:lang(mn), +select:lang(mn), +optgroup:lang(mn), +textarea:lang(mn), .author-description .author-link:lang(mn), +.comment-metadata:lang(mn), +.comment-reply-link:lang(mn), +.comments-title:lang(mn), +.comment-author .fn:lang(mn), +.discussion-meta-info:lang(mn), +.entry-meta:lang(mn), +.entry-footer:lang(mn), +.main-navigation:lang(mn), +.no-comments:lang(mn), +.not-found .page-title:lang(mn), +.error-404 .page-title:lang(mn), +.post-navigation .post-title:lang(mn), +.page-links:lang(mn), +.page-description:lang(mn), +.pagination .nav-links:lang(mn), +.sticky-post:lang(mn), +.site-title:lang(mn), +.site-info:lang(mn), +#cancel-comment-reply-link:lang(mn), +h1:lang(mn), +h2:lang(mn), +h3:lang(mn), +h4:lang(mn), +h5:lang(mn), +h6:lang(mn), .page-title:lang(mn), blockquote cite:lang(mn), table:lang(mn), .button:lang(mn), +input:lang(mn)[type="button"], +input:lang(mn)[type="reset"], +input:lang(mn)[type="submit"], .comment-navigation .nav-previous:lang(mn), +.comment-navigation .nav-next:lang(mn), .comment-list .pingback .comment-body:lang(mn), +.comment-list .trackback .comment-body:lang(mn), .comment-list .pingback .comment-body .comment-edit-link:lang(mn), +.comment-list .trackback .comment-body .comment-edit-link:lang(mn), .comment-form .comment-notes:lang(mn), +.comment-form label:lang(mn), .widget_archive ul li:lang(mn), +.widget_categories ul li:lang(mn), +.widget_meta ul li:lang(mn), +.widget_nav_menu ul li:lang(mn), +.widget_pages ul li:lang(mn), +.widget_recent_comments ul li:lang(mn), +.widget_recent_entries ul li:lang(mn), +.widget_rss ul li:lang(mn), .widget_tag_cloud .tagcloud:lang(mn), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mn), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mn), .entry .entry-content .wp-block-archives li > a:lang(mn), +.entry .entry-content .wp-block-categories li > a:lang(mn), +.entry .entry-content .wp-block-latest-posts li > a:lang(mn), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mn), .entry .entry-content .wp-block-verse:lang(mn), .entry .entry-content .has-drop-cap:lang(mn):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mn), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mn), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mn), +.entry .entry-content .wp-block-cover-image h2:lang(mn), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mn), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mn), +.entry .entry-content .wp-block-cover h2:lang(mn), .entry .entry-content .wp-block-audio figcaption:lang(mn), +.entry .entry-content .wp-block-video figcaption:lang(mn), +.entry .entry-content .wp-block-image figcaption:lang(mn), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mn), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mn), .entry .entry-content .wp-block-file:lang(mn), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mn), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mn), .wp-caption-text:lang(mn), .gallery-caption:lang(mn) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(ru-RU), button:lang(ru-RU), +input:lang(ru-RU), +select:lang(ru-RU), +optgroup:lang(ru-RU), +textarea:lang(ru-RU), .author-description .author-link:lang(ru-RU), +.comment-metadata:lang(ru-RU), +.comment-reply-link:lang(ru-RU), +.comments-title:lang(ru-RU), +.comment-author .fn:lang(ru-RU), +.discussion-meta-info:lang(ru-RU), +.entry-meta:lang(ru-RU), +.entry-footer:lang(ru-RU), +.main-navigation:lang(ru-RU), +.no-comments:lang(ru-RU), +.not-found .page-title:lang(ru-RU), +.error-404 .page-title:lang(ru-RU), +.post-navigation .post-title:lang(ru-RU), +.page-links:lang(ru-RU), +.page-description:lang(ru-RU), +.pagination .nav-links:lang(ru-RU), +.sticky-post:lang(ru-RU), +.site-title:lang(ru-RU), +.site-info:lang(ru-RU), +#cancel-comment-reply-link:lang(ru-RU), +h1:lang(ru-RU), +h2:lang(ru-RU), +h3:lang(ru-RU), +h4:lang(ru-RU), +h5:lang(ru-RU), +h6:lang(ru-RU), .page-title:lang(ru-RU), blockquote cite:lang(ru-RU), table:lang(ru-RU), .button:lang(ru-RU), +input:lang(ru-RU)[type="button"], +input:lang(ru-RU)[type="reset"], +input:lang(ru-RU)[type="submit"], .comment-navigation .nav-previous:lang(ru-RU), +.comment-navigation .nav-next:lang(ru-RU), .comment-list .pingback .comment-body:lang(ru-RU), +.comment-list .trackback .comment-body:lang(ru-RU), .comment-list .pingback .comment-body .comment-edit-link:lang(ru-RU), +.comment-list .trackback .comment-body .comment-edit-link:lang(ru-RU), .comment-form .comment-notes:lang(ru-RU), +.comment-form label:lang(ru-RU), .widget_archive ul li:lang(ru-RU), +.widget_categories ul li:lang(ru-RU), +.widget_meta ul li:lang(ru-RU), +.widget_nav_menu ul li:lang(ru-RU), +.widget_pages ul li:lang(ru-RU), +.widget_recent_comments ul li:lang(ru-RU), +.widget_recent_entries ul li:lang(ru-RU), +.widget_rss ul li:lang(ru-RU), .widget_tag_cloud .tagcloud:lang(ru-RU), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ru-RU), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ru-RU), .entry .entry-content .wp-block-archives li > a:lang(ru-RU), +.entry .entry-content .wp-block-categories li > a:lang(ru-RU), +.entry .entry-content .wp-block-latest-posts li > a:lang(ru-RU), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ru-RU), .entry .entry-content .wp-block-verse:lang(ru-RU), .entry .entry-content .has-drop-cap:lang(ru-RU):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ru-RU), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ru-RU), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ru-RU), +.entry .entry-content .wp-block-cover-image h2:lang(ru-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ru-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ru-RU), +.entry .entry-content .wp-block-cover h2:lang(ru-RU), .entry .entry-content .wp-block-audio figcaption:lang(ru-RU), +.entry .entry-content .wp-block-video figcaption:lang(ru-RU), +.entry .entry-content .wp-block-image figcaption:lang(ru-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ru-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ru-RU), .entry .entry-content .wp-block-file:lang(ru-RU), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ru-RU), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ru-RU), .wp-caption-text:lang(ru-RU), .gallery-caption:lang(ru-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sah), button:lang(sah), +input:lang(sah), +select:lang(sah), +optgroup:lang(sah), +textarea:lang(sah), .author-description .author-link:lang(sah), +.comment-metadata:lang(sah), +.comment-reply-link:lang(sah), +.comments-title:lang(sah), +.comment-author .fn:lang(sah), +.discussion-meta-info:lang(sah), +.entry-meta:lang(sah), +.entry-footer:lang(sah), +.main-navigation:lang(sah), +.no-comments:lang(sah), +.not-found .page-title:lang(sah), +.error-404 .page-title:lang(sah), +.post-navigation .post-title:lang(sah), +.page-links:lang(sah), +.page-description:lang(sah), +.pagination .nav-links:lang(sah), +.sticky-post:lang(sah), +.site-title:lang(sah), +.site-info:lang(sah), +#cancel-comment-reply-link:lang(sah), +h1:lang(sah), +h2:lang(sah), +h3:lang(sah), +h4:lang(sah), +h5:lang(sah), +h6:lang(sah), .page-title:lang(sah), blockquote cite:lang(sah), table:lang(sah), .button:lang(sah), +input:lang(sah)[type="button"], +input:lang(sah)[type="reset"], +input:lang(sah)[type="submit"], .comment-navigation .nav-previous:lang(sah), +.comment-navigation .nav-next:lang(sah), .comment-list .pingback .comment-body:lang(sah), +.comment-list .trackback .comment-body:lang(sah), .comment-list .pingback .comment-body .comment-edit-link:lang(sah), +.comment-list .trackback .comment-body .comment-edit-link:lang(sah), .comment-form .comment-notes:lang(sah), +.comment-form label:lang(sah), .widget_archive ul li:lang(sah), +.widget_categories ul li:lang(sah), +.widget_meta ul li:lang(sah), +.widget_nav_menu ul li:lang(sah), +.widget_pages ul li:lang(sah), +.widget_recent_comments ul li:lang(sah), +.widget_recent_entries ul li:lang(sah), +.widget_rss ul li:lang(sah), .widget_tag_cloud .tagcloud:lang(sah), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(sah), .entry .entry-content .wp-block-button .wp-block-button__link:lang(sah), .entry .entry-content .wp-block-archives li > a:lang(sah), +.entry .entry-content .wp-block-categories li > a:lang(sah), +.entry .entry-content .wp-block-latest-posts li > a:lang(sah), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sah), .entry .entry-content .wp-block-verse:lang(sah), .entry .entry-content .has-drop-cap:lang(sah):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(sah), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(sah), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(sah), +.entry .entry-content .wp-block-cover-image h2:lang(sah), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(sah), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(sah), +.entry .entry-content .wp-block-cover h2:lang(sah), .entry .entry-content .wp-block-audio figcaption:lang(sah), +.entry .entry-content .wp-block-video figcaption:lang(sah), +.entry .entry-content .wp-block-image figcaption:lang(sah), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(sah), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(sah), .entry .entry-content .wp-block-file:lang(sah), .entry .entry-content .wp-block-file .wp-block-file__button:lang(sah), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sah), .wp-caption-text:lang(sah), .gallery-caption:lang(sah) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sr-RS), button:lang(sr-RS), +input:lang(sr-RS), +select:lang(sr-RS), +optgroup:lang(sr-RS), +textarea:lang(sr-RS), .author-description .author-link:lang(sr-RS), +.comment-metadata:lang(sr-RS), +.comment-reply-link:lang(sr-RS), +.comments-title:lang(sr-RS), +.comment-author .fn:lang(sr-RS), +.discussion-meta-info:lang(sr-RS), +.entry-meta:lang(sr-RS), +.entry-footer:lang(sr-RS), +.main-navigation:lang(sr-RS), +.no-comments:lang(sr-RS), +.not-found .page-title:lang(sr-RS), +.error-404 .page-title:lang(sr-RS), +.post-navigation .post-title:lang(sr-RS), +.page-links:lang(sr-RS), +.page-description:lang(sr-RS), +.pagination .nav-links:lang(sr-RS), +.sticky-post:lang(sr-RS), +.site-title:lang(sr-RS), +.site-info:lang(sr-RS), +#cancel-comment-reply-link:lang(sr-RS), +h1:lang(sr-RS), +h2:lang(sr-RS), +h3:lang(sr-RS), +h4:lang(sr-RS), +h5:lang(sr-RS), +h6:lang(sr-RS), .page-title:lang(sr-RS), blockquote cite:lang(sr-RS), table:lang(sr-RS), .button:lang(sr-RS), +input:lang(sr-RS)[type="button"], +input:lang(sr-RS)[type="reset"], +input:lang(sr-RS)[type="submit"], .comment-navigation .nav-previous:lang(sr-RS), +.comment-navigation .nav-next:lang(sr-RS), .comment-list .pingback .comment-body:lang(sr-RS), +.comment-list .trackback .comment-body:lang(sr-RS), .comment-list .pingback .comment-body .comment-edit-link:lang(sr-RS), +.comment-list .trackback .comment-body .comment-edit-link:lang(sr-RS), .comment-form .comment-notes:lang(sr-RS), +.comment-form label:lang(sr-RS), .widget_archive ul li:lang(sr-RS), +.widget_categories ul li:lang(sr-RS), +.widget_meta ul li:lang(sr-RS), +.widget_nav_menu ul li:lang(sr-RS), +.widget_pages ul li:lang(sr-RS), +.widget_recent_comments ul li:lang(sr-RS), +.widget_recent_entries ul li:lang(sr-RS), +.widget_rss ul li:lang(sr-RS), .widget_tag_cloud .tagcloud:lang(sr-RS), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(sr-RS), .entry .entry-content .wp-block-button .wp-block-button__link:lang(sr-RS), .entry .entry-content .wp-block-archives li > a:lang(sr-RS), +.entry .entry-content .wp-block-categories li > a:lang(sr-RS), +.entry .entry-content .wp-block-latest-posts li > a:lang(sr-RS), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sr-RS), .entry .entry-content .wp-block-verse:lang(sr-RS), .entry .entry-content .has-drop-cap:lang(sr-RS):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(sr-RS), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(sr-RS), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(sr-RS), +.entry .entry-content .wp-block-cover-image h2:lang(sr-RS), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(sr-RS), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(sr-RS), +.entry .entry-content .wp-block-cover h2:lang(sr-RS), .entry .entry-content .wp-block-audio figcaption:lang(sr-RS), +.entry .entry-content .wp-block-video figcaption:lang(sr-RS), +.entry .entry-content .wp-block-image figcaption:lang(sr-RS), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(sr-RS), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(sr-RS), .entry .entry-content .wp-block-file:lang(sr-RS), .entry .entry-content .wp-block-file .wp-block-file__button:lang(sr-RS), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sr-RS), .wp-caption-text:lang(sr-RS), .gallery-caption:lang(sr-RS) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(tt-RU), button:lang(tt-RU), +input:lang(tt-RU), +select:lang(tt-RU), +optgroup:lang(tt-RU), +textarea:lang(tt-RU), .author-description .author-link:lang(tt-RU), +.comment-metadata:lang(tt-RU), +.comment-reply-link:lang(tt-RU), +.comments-title:lang(tt-RU), +.comment-author .fn:lang(tt-RU), +.discussion-meta-info:lang(tt-RU), +.entry-meta:lang(tt-RU), +.entry-footer:lang(tt-RU), +.main-navigation:lang(tt-RU), +.no-comments:lang(tt-RU), +.not-found .page-title:lang(tt-RU), +.error-404 .page-title:lang(tt-RU), +.post-navigation .post-title:lang(tt-RU), +.page-links:lang(tt-RU), +.page-description:lang(tt-RU), +.pagination .nav-links:lang(tt-RU), +.sticky-post:lang(tt-RU), +.site-title:lang(tt-RU), +.site-info:lang(tt-RU), +#cancel-comment-reply-link:lang(tt-RU), +h1:lang(tt-RU), +h2:lang(tt-RU), +h3:lang(tt-RU), +h4:lang(tt-RU), +h5:lang(tt-RU), +h6:lang(tt-RU), .page-title:lang(tt-RU), blockquote cite:lang(tt-RU), table:lang(tt-RU), .button:lang(tt-RU), +input:lang(tt-RU)[type="button"], +input:lang(tt-RU)[type="reset"], +input:lang(tt-RU)[type="submit"], .comment-navigation .nav-previous:lang(tt-RU), +.comment-navigation .nav-next:lang(tt-RU), .comment-list .pingback .comment-body:lang(tt-RU), +.comment-list .trackback .comment-body:lang(tt-RU), .comment-list .pingback .comment-body .comment-edit-link:lang(tt-RU), +.comment-list .trackback .comment-body .comment-edit-link:lang(tt-RU), .comment-form .comment-notes:lang(tt-RU), +.comment-form label:lang(tt-RU), .widget_archive ul li:lang(tt-RU), +.widget_categories ul li:lang(tt-RU), +.widget_meta ul li:lang(tt-RU), +.widget_nav_menu ul li:lang(tt-RU), +.widget_pages ul li:lang(tt-RU), +.widget_recent_comments ul li:lang(tt-RU), +.widget_recent_entries ul li:lang(tt-RU), +.widget_rss ul li:lang(tt-RU), .widget_tag_cloud .tagcloud:lang(tt-RU), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(tt-RU), .entry .entry-content .wp-block-button .wp-block-button__link:lang(tt-RU), .entry .entry-content .wp-block-archives li > a:lang(tt-RU), +.entry .entry-content .wp-block-categories li > a:lang(tt-RU), +.entry .entry-content .wp-block-latest-posts li > a:lang(tt-RU), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(tt-RU), .entry .entry-content .wp-block-verse:lang(tt-RU), .entry .entry-content .has-drop-cap:lang(tt-RU):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(tt-RU), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(tt-RU), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(tt-RU), +.entry .entry-content .wp-block-cover-image h2:lang(tt-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(tt-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(tt-RU), +.entry .entry-content .wp-block-cover h2:lang(tt-RU), .entry .entry-content .wp-block-audio figcaption:lang(tt-RU), +.entry .entry-content .wp-block-video figcaption:lang(tt-RU), +.entry .entry-content .wp-block-image figcaption:lang(tt-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(tt-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(tt-RU), .entry .entry-content .wp-block-file:lang(tt-RU), .entry .entry-content .wp-block-file .wp-block-file__button:lang(tt-RU), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(tt-RU), .wp-caption-text:lang(tt-RU), .gallery-caption:lang(tt-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(uk), button:lang(uk), +input:lang(uk), +select:lang(uk), +optgroup:lang(uk), +textarea:lang(uk), .author-description .author-link:lang(uk), +.comment-metadata:lang(uk), +.comment-reply-link:lang(uk), +.comments-title:lang(uk), +.comment-author .fn:lang(uk), +.discussion-meta-info:lang(uk), +.entry-meta:lang(uk), +.entry-footer:lang(uk), +.main-navigation:lang(uk), +.no-comments:lang(uk), +.not-found .page-title:lang(uk), +.error-404 .page-title:lang(uk), +.post-navigation .post-title:lang(uk), +.page-links:lang(uk), +.page-description:lang(uk), +.pagination .nav-links:lang(uk), +.sticky-post:lang(uk), +.site-title:lang(uk), +.site-info:lang(uk), +#cancel-comment-reply-link:lang(uk), +h1:lang(uk), +h2:lang(uk), +h3:lang(uk), +h4:lang(uk), +h5:lang(uk), +h6:lang(uk), .page-title:lang(uk), blockquote cite:lang(uk), table:lang(uk), .button:lang(uk), +input:lang(uk)[type="button"], +input:lang(uk)[type="reset"], +input:lang(uk)[type="submit"], .comment-navigation .nav-previous:lang(uk), +.comment-navigation .nav-next:lang(uk), .comment-list .pingback .comment-body:lang(uk), +.comment-list .trackback .comment-body:lang(uk), .comment-list .pingback .comment-body .comment-edit-link:lang(uk), +.comment-list .trackback .comment-body .comment-edit-link:lang(uk), .comment-form .comment-notes:lang(uk), +.comment-form label:lang(uk), .widget_archive ul li:lang(uk), +.widget_categories ul li:lang(uk), +.widget_meta ul li:lang(uk), +.widget_nav_menu ul li:lang(uk), +.widget_pages ul li:lang(uk), +.widget_recent_comments ul li:lang(uk), +.widget_recent_entries ul li:lang(uk), +.widget_rss ul li:lang(uk), .widget_tag_cloud .tagcloud:lang(uk), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(uk), .entry .entry-content .wp-block-button .wp-block-button__link:lang(uk), .entry .entry-content .wp-block-archives li > a:lang(uk), +.entry .entry-content .wp-block-categories li > a:lang(uk), +.entry .entry-content .wp-block-latest-posts li > a:lang(uk), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(uk), .entry .entry-content .wp-block-verse:lang(uk), .entry .entry-content .has-drop-cap:lang(uk):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(uk), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(uk), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(uk), +.entry .entry-content .wp-block-cover-image h2:lang(uk), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(uk), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(uk), +.entry .entry-content .wp-block-cover h2:lang(uk), .entry .entry-content .wp-block-audio figcaption:lang(uk), +.entry .entry-content .wp-block-video figcaption:lang(uk), +.entry .entry-content .wp-block-image figcaption:lang(uk), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(uk), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(uk), .entry .entry-content .wp-block-file:lang(uk), .entry .entry-content .wp-block-file .wp-block-file__button:lang(uk), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(uk), .wp-caption-text:lang(uk), .gallery-caption:lang(uk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(zh-HK), button:lang(zh-HK), +input:lang(zh-HK), +select:lang(zh-HK), +optgroup:lang(zh-HK), +textarea:lang(zh-HK), .author-description .author-link:lang(zh-HK), +.comment-metadata:lang(zh-HK), +.comment-reply-link:lang(zh-HK), +.comments-title:lang(zh-HK), +.comment-author .fn:lang(zh-HK), +.discussion-meta-info:lang(zh-HK), +.entry-meta:lang(zh-HK), +.entry-footer:lang(zh-HK), +.main-navigation:lang(zh-HK), +.no-comments:lang(zh-HK), +.not-found .page-title:lang(zh-HK), +.error-404 .page-title:lang(zh-HK), +.post-navigation .post-title:lang(zh-HK), +.page-links:lang(zh-HK), +.page-description:lang(zh-HK), +.pagination .nav-links:lang(zh-HK), +.sticky-post:lang(zh-HK), +.site-title:lang(zh-HK), +.site-info:lang(zh-HK), +#cancel-comment-reply-link:lang(zh-HK), +h1:lang(zh-HK), +h2:lang(zh-HK), +h3:lang(zh-HK), +h4:lang(zh-HK), +h5:lang(zh-HK), +h6:lang(zh-HK), .page-title:lang(zh-HK), blockquote cite:lang(zh-HK), table:lang(zh-HK), .button:lang(zh-HK), +input:lang(zh-HK)[type="button"], +input:lang(zh-HK)[type="reset"], +input:lang(zh-HK)[type="submit"], .comment-navigation .nav-previous:lang(zh-HK), +.comment-navigation .nav-next:lang(zh-HK), .comment-list .pingback .comment-body:lang(zh-HK), +.comment-list .trackback .comment-body:lang(zh-HK), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-HK), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-HK), .comment-form .comment-notes:lang(zh-HK), +.comment-form label:lang(zh-HK), .widget_archive ul li:lang(zh-HK), +.widget_categories ul li:lang(zh-HK), +.widget_meta ul li:lang(zh-HK), +.widget_nav_menu ul li:lang(zh-HK), +.widget_pages ul li:lang(zh-HK), +.widget_recent_comments ul li:lang(zh-HK), +.widget_recent_entries ul li:lang(zh-HK), +.widget_rss ul li:lang(zh-HK), .widget_tag_cloud .tagcloud:lang(zh-HK), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-HK), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-HK), .entry .entry-content .wp-block-archives li > a:lang(zh-HK), +.entry .entry-content .wp-block-categories li > a:lang(zh-HK), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-HK), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-HK), .entry .entry-content .wp-block-verse:lang(zh-HK), .entry .entry-content .has-drop-cap:lang(zh-HK):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-HK), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-HK), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-HK), +.entry .entry-content .wp-block-cover-image h2:lang(zh-HK), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-HK), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-HK), +.entry .entry-content .wp-block-cover h2:lang(zh-HK), .entry .entry-content .wp-block-audio figcaption:lang(zh-HK), +.entry .entry-content .wp-block-video figcaption:lang(zh-HK), +.entry .entry-content .wp-block-image figcaption:lang(zh-HK), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-HK), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-HK), .entry .entry-content .wp-block-file:lang(zh-HK), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-HK), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-HK), .wp-caption-text:lang(zh-HK), .gallery-caption:lang(zh-HK) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang HK", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-TW), button:lang(zh-TW), +input:lang(zh-TW), +select:lang(zh-TW), +optgroup:lang(zh-TW), +textarea:lang(zh-TW), .author-description .author-link:lang(zh-TW), +.comment-metadata:lang(zh-TW), +.comment-reply-link:lang(zh-TW), +.comments-title:lang(zh-TW), +.comment-author .fn:lang(zh-TW), +.discussion-meta-info:lang(zh-TW), +.entry-meta:lang(zh-TW), +.entry-footer:lang(zh-TW), +.main-navigation:lang(zh-TW), +.no-comments:lang(zh-TW), +.not-found .page-title:lang(zh-TW), +.error-404 .page-title:lang(zh-TW), +.post-navigation .post-title:lang(zh-TW), +.page-links:lang(zh-TW), +.page-description:lang(zh-TW), +.pagination .nav-links:lang(zh-TW), +.sticky-post:lang(zh-TW), +.site-title:lang(zh-TW), +.site-info:lang(zh-TW), +#cancel-comment-reply-link:lang(zh-TW), +h1:lang(zh-TW), +h2:lang(zh-TW), +h3:lang(zh-TW), +h4:lang(zh-TW), +h5:lang(zh-TW), +h6:lang(zh-TW), .page-title:lang(zh-TW), blockquote cite:lang(zh-TW), table:lang(zh-TW), .button:lang(zh-TW), +input:lang(zh-TW)[type="button"], +input:lang(zh-TW)[type="reset"], +input:lang(zh-TW)[type="submit"], .comment-navigation .nav-previous:lang(zh-TW), +.comment-navigation .nav-next:lang(zh-TW), .comment-list .pingback .comment-body:lang(zh-TW), +.comment-list .trackback .comment-body:lang(zh-TW), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-TW), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-TW), .comment-form .comment-notes:lang(zh-TW), +.comment-form label:lang(zh-TW), .widget_archive ul li:lang(zh-TW), +.widget_categories ul li:lang(zh-TW), +.widget_meta ul li:lang(zh-TW), +.widget_nav_menu ul li:lang(zh-TW), +.widget_pages ul li:lang(zh-TW), +.widget_recent_comments ul li:lang(zh-TW), +.widget_recent_entries ul li:lang(zh-TW), +.widget_rss ul li:lang(zh-TW), .widget_tag_cloud .tagcloud:lang(zh-TW), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-TW), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-TW), .entry .entry-content .wp-block-archives li > a:lang(zh-TW), +.entry .entry-content .wp-block-categories li > a:lang(zh-TW), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-TW), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-TW), .entry .entry-content .wp-block-verse:lang(zh-TW), .entry .entry-content .has-drop-cap:lang(zh-TW):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-TW), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-TW), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-TW), +.entry .entry-content .wp-block-cover-image h2:lang(zh-TW), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-TW), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-TW), +.entry .entry-content .wp-block-cover h2:lang(zh-TW), .entry .entry-content .wp-block-audio figcaption:lang(zh-TW), +.entry .entry-content .wp-block-video figcaption:lang(zh-TW), +.entry .entry-content .wp-block-image figcaption:lang(zh-TW), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-TW), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-TW), .entry .entry-content .wp-block-file:lang(zh-TW), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-TW), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-TW), .wp-caption-text:lang(zh-TW), .gallery-caption:lang(zh-TW) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-CN), button:lang(zh-CN), +input:lang(zh-CN), +select:lang(zh-CN), +optgroup:lang(zh-CN), +textarea:lang(zh-CN), .author-description .author-link:lang(zh-CN), +.comment-metadata:lang(zh-CN), +.comment-reply-link:lang(zh-CN), +.comments-title:lang(zh-CN), +.comment-author .fn:lang(zh-CN), +.discussion-meta-info:lang(zh-CN), +.entry-meta:lang(zh-CN), +.entry-footer:lang(zh-CN), +.main-navigation:lang(zh-CN), +.no-comments:lang(zh-CN), +.not-found .page-title:lang(zh-CN), +.error-404 .page-title:lang(zh-CN), +.post-navigation .post-title:lang(zh-CN), +.page-links:lang(zh-CN), +.page-description:lang(zh-CN), +.pagination .nav-links:lang(zh-CN), +.sticky-post:lang(zh-CN), +.site-title:lang(zh-CN), +.site-info:lang(zh-CN), +#cancel-comment-reply-link:lang(zh-CN), +h1:lang(zh-CN), +h2:lang(zh-CN), +h3:lang(zh-CN), +h4:lang(zh-CN), +h5:lang(zh-CN), +h6:lang(zh-CN), .page-title:lang(zh-CN), blockquote cite:lang(zh-CN), table:lang(zh-CN), .button:lang(zh-CN), +input:lang(zh-CN)[type="button"], +input:lang(zh-CN)[type="reset"], +input:lang(zh-CN)[type="submit"], .comment-navigation .nav-previous:lang(zh-CN), +.comment-navigation .nav-next:lang(zh-CN), .comment-list .pingback .comment-body:lang(zh-CN), +.comment-list .trackback .comment-body:lang(zh-CN), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-CN), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-CN), .comment-form .comment-notes:lang(zh-CN), +.comment-form label:lang(zh-CN), .widget_archive ul li:lang(zh-CN), +.widget_categories ul li:lang(zh-CN), +.widget_meta ul li:lang(zh-CN), +.widget_nav_menu ul li:lang(zh-CN), +.widget_pages ul li:lang(zh-CN), +.widget_recent_comments ul li:lang(zh-CN), +.widget_recent_entries ul li:lang(zh-CN), +.widget_rss ul li:lang(zh-CN), .widget_tag_cloud .tagcloud:lang(zh-CN), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-CN), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-CN), .entry .entry-content .wp-block-archives li > a:lang(zh-CN), +.entry .entry-content .wp-block-categories li > a:lang(zh-CN), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-CN), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-CN), .entry .entry-content .wp-block-verse:lang(zh-CN), .entry .entry-content .has-drop-cap:lang(zh-CN):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-CN), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-CN), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-CN), +.entry .entry-content .wp-block-cover-image h2:lang(zh-CN), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-CN), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-CN), +.entry .entry-content .wp-block-cover h2:lang(zh-CN), .entry .entry-content .wp-block-audio figcaption:lang(zh-CN), +.entry .entry-content .wp-block-video figcaption:lang(zh-CN), +.entry .entry-content .wp-block-image figcaption:lang(zh-CN), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-CN), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-CN), .entry .entry-content .wp-block-file:lang(zh-CN), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-CN), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-CN), .wp-caption-text:lang(zh-CN), .gallery-caption:lang(zh-CN) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(bn-BD), button:lang(bn-BD), +input:lang(bn-BD), +select:lang(bn-BD), +optgroup:lang(bn-BD), +textarea:lang(bn-BD), .author-description .author-link:lang(bn-BD), +.comment-metadata:lang(bn-BD), +.comment-reply-link:lang(bn-BD), +.comments-title:lang(bn-BD), +.comment-author .fn:lang(bn-BD), +.discussion-meta-info:lang(bn-BD), +.entry-meta:lang(bn-BD), +.entry-footer:lang(bn-BD), +.main-navigation:lang(bn-BD), +.no-comments:lang(bn-BD), +.not-found .page-title:lang(bn-BD), +.error-404 .page-title:lang(bn-BD), +.post-navigation .post-title:lang(bn-BD), +.page-links:lang(bn-BD), +.page-description:lang(bn-BD), +.pagination .nav-links:lang(bn-BD), +.sticky-post:lang(bn-BD), +.site-title:lang(bn-BD), +.site-info:lang(bn-BD), +#cancel-comment-reply-link:lang(bn-BD), +h1:lang(bn-BD), +h2:lang(bn-BD), +h3:lang(bn-BD), +h4:lang(bn-BD), +h5:lang(bn-BD), +h6:lang(bn-BD), .page-title:lang(bn-BD), blockquote cite:lang(bn-BD), table:lang(bn-BD), .button:lang(bn-BD), +input:lang(bn-BD)[type="button"], +input:lang(bn-BD)[type="reset"], +input:lang(bn-BD)[type="submit"], .comment-navigation .nav-previous:lang(bn-BD), +.comment-navigation .nav-next:lang(bn-BD), .comment-list .pingback .comment-body:lang(bn-BD), +.comment-list .trackback .comment-body:lang(bn-BD), .comment-list .pingback .comment-body .comment-edit-link:lang(bn-BD), +.comment-list .trackback .comment-body .comment-edit-link:lang(bn-BD), .comment-form .comment-notes:lang(bn-BD), +.comment-form label:lang(bn-BD), .widget_archive ul li:lang(bn-BD), +.widget_categories ul li:lang(bn-BD), +.widget_meta ul li:lang(bn-BD), +.widget_nav_menu ul li:lang(bn-BD), +.widget_pages ul li:lang(bn-BD), +.widget_recent_comments ul li:lang(bn-BD), +.widget_recent_entries ul li:lang(bn-BD), +.widget_rss ul li:lang(bn-BD), .widget_tag_cloud .tagcloud:lang(bn-BD), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(bn-BD), .entry .entry-content .wp-block-button .wp-block-button__link:lang(bn-BD), .entry .entry-content .wp-block-archives li > a:lang(bn-BD), +.entry .entry-content .wp-block-categories li > a:lang(bn-BD), +.entry .entry-content .wp-block-latest-posts li > a:lang(bn-BD), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bn-BD), .entry .entry-content .wp-block-verse:lang(bn-BD), .entry .entry-content .has-drop-cap:lang(bn-BD):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(bn-BD), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(bn-BD), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(bn-BD), +.entry .entry-content .wp-block-cover-image h2:lang(bn-BD), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(bn-BD), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(bn-BD), +.entry .entry-content .wp-block-cover h2:lang(bn-BD), .entry .entry-content .wp-block-audio figcaption:lang(bn-BD), +.entry .entry-content .wp-block-video figcaption:lang(bn-BD), +.entry .entry-content .wp-block-image figcaption:lang(bn-BD), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(bn-BD), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(bn-BD), .entry .entry-content .wp-block-file:lang(bn-BD), .entry .entry-content .wp-block-file .wp-block-file__button:lang(bn-BD), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bn-BD), .wp-caption-text:lang(bn-BD), .gallery-caption:lang(bn-BD) { + font-family: Arial, sans-serif; +} + +body:lang(hi-IN), button:lang(hi-IN), +input:lang(hi-IN), +select:lang(hi-IN), +optgroup:lang(hi-IN), +textarea:lang(hi-IN), .author-description .author-link:lang(hi-IN), +.comment-metadata:lang(hi-IN), +.comment-reply-link:lang(hi-IN), +.comments-title:lang(hi-IN), +.comment-author .fn:lang(hi-IN), +.discussion-meta-info:lang(hi-IN), +.entry-meta:lang(hi-IN), +.entry-footer:lang(hi-IN), +.main-navigation:lang(hi-IN), +.no-comments:lang(hi-IN), +.not-found .page-title:lang(hi-IN), +.error-404 .page-title:lang(hi-IN), +.post-navigation .post-title:lang(hi-IN), +.page-links:lang(hi-IN), +.page-description:lang(hi-IN), +.pagination .nav-links:lang(hi-IN), +.sticky-post:lang(hi-IN), +.site-title:lang(hi-IN), +.site-info:lang(hi-IN), +#cancel-comment-reply-link:lang(hi-IN), +h1:lang(hi-IN), +h2:lang(hi-IN), +h3:lang(hi-IN), +h4:lang(hi-IN), +h5:lang(hi-IN), +h6:lang(hi-IN), .page-title:lang(hi-IN), blockquote cite:lang(hi-IN), table:lang(hi-IN), .button:lang(hi-IN), +input:lang(hi-IN)[type="button"], +input:lang(hi-IN)[type="reset"], +input:lang(hi-IN)[type="submit"], .comment-navigation .nav-previous:lang(hi-IN), +.comment-navigation .nav-next:lang(hi-IN), .comment-list .pingback .comment-body:lang(hi-IN), +.comment-list .trackback .comment-body:lang(hi-IN), .comment-list .pingback .comment-body .comment-edit-link:lang(hi-IN), +.comment-list .trackback .comment-body .comment-edit-link:lang(hi-IN), .comment-form .comment-notes:lang(hi-IN), +.comment-form label:lang(hi-IN), .widget_archive ul li:lang(hi-IN), +.widget_categories ul li:lang(hi-IN), +.widget_meta ul li:lang(hi-IN), +.widget_nav_menu ul li:lang(hi-IN), +.widget_pages ul li:lang(hi-IN), +.widget_recent_comments ul li:lang(hi-IN), +.widget_recent_entries ul li:lang(hi-IN), +.widget_rss ul li:lang(hi-IN), .widget_tag_cloud .tagcloud:lang(hi-IN), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(hi-IN), .entry .entry-content .wp-block-button .wp-block-button__link:lang(hi-IN), .entry .entry-content .wp-block-archives li > a:lang(hi-IN), +.entry .entry-content .wp-block-categories li > a:lang(hi-IN), +.entry .entry-content .wp-block-latest-posts li > a:lang(hi-IN), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(hi-IN), .entry .entry-content .wp-block-verse:lang(hi-IN), .entry .entry-content .has-drop-cap:lang(hi-IN):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(hi-IN), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(hi-IN), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(hi-IN), +.entry .entry-content .wp-block-cover-image h2:lang(hi-IN), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(hi-IN), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(hi-IN), +.entry .entry-content .wp-block-cover h2:lang(hi-IN), .entry .entry-content .wp-block-audio figcaption:lang(hi-IN), +.entry .entry-content .wp-block-video figcaption:lang(hi-IN), +.entry .entry-content .wp-block-image figcaption:lang(hi-IN), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(hi-IN), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(hi-IN), .entry .entry-content .wp-block-file:lang(hi-IN), .entry .entry-content .wp-block-file .wp-block-file__button:lang(hi-IN), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(hi-IN), .wp-caption-text:lang(hi-IN), .gallery-caption:lang(hi-IN) { + font-family: Arial, sans-serif; +} + +body:lang(mr), button:lang(mr), +input:lang(mr), +select:lang(mr), +optgroup:lang(mr), +textarea:lang(mr), .author-description .author-link:lang(mr), +.comment-metadata:lang(mr), +.comment-reply-link:lang(mr), +.comments-title:lang(mr), +.comment-author .fn:lang(mr), +.discussion-meta-info:lang(mr), +.entry-meta:lang(mr), +.entry-footer:lang(mr), +.main-navigation:lang(mr), +.no-comments:lang(mr), +.not-found .page-title:lang(mr), +.error-404 .page-title:lang(mr), +.post-navigation .post-title:lang(mr), +.page-links:lang(mr), +.page-description:lang(mr), +.pagination .nav-links:lang(mr), +.sticky-post:lang(mr), +.site-title:lang(mr), +.site-info:lang(mr), +#cancel-comment-reply-link:lang(mr), +h1:lang(mr), +h2:lang(mr), +h3:lang(mr), +h4:lang(mr), +h5:lang(mr), +h6:lang(mr), .page-title:lang(mr), blockquote cite:lang(mr), table:lang(mr), .button:lang(mr), +input:lang(mr)[type="button"], +input:lang(mr)[type="reset"], +input:lang(mr)[type="submit"], .comment-navigation .nav-previous:lang(mr), +.comment-navigation .nav-next:lang(mr), .comment-list .pingback .comment-body:lang(mr), +.comment-list .trackback .comment-body:lang(mr), .comment-list .pingback .comment-body .comment-edit-link:lang(mr), +.comment-list .trackback .comment-body .comment-edit-link:lang(mr), .comment-form .comment-notes:lang(mr), +.comment-form label:lang(mr), .widget_archive ul li:lang(mr), +.widget_categories ul li:lang(mr), +.widget_meta ul li:lang(mr), +.widget_nav_menu ul li:lang(mr), +.widget_pages ul li:lang(mr), +.widget_recent_comments ul li:lang(mr), +.widget_recent_entries ul li:lang(mr), +.widget_rss ul li:lang(mr), .widget_tag_cloud .tagcloud:lang(mr), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mr), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mr), .entry .entry-content .wp-block-archives li > a:lang(mr), +.entry .entry-content .wp-block-categories li > a:lang(mr), +.entry .entry-content .wp-block-latest-posts li > a:lang(mr), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mr), .entry .entry-content .wp-block-verse:lang(mr), .entry .entry-content .has-drop-cap:lang(mr):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mr), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mr), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mr), +.entry .entry-content .wp-block-cover-image h2:lang(mr), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mr), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mr), +.entry .entry-content .wp-block-cover h2:lang(mr), .entry .entry-content .wp-block-audio figcaption:lang(mr), +.entry .entry-content .wp-block-video figcaption:lang(mr), +.entry .entry-content .wp-block-image figcaption:lang(mr), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mr), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mr), .entry .entry-content .wp-block-file:lang(mr), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mr), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mr), .wp-caption-text:lang(mr), .gallery-caption:lang(mr) { + font-family: Arial, sans-serif; +} + +body:lang(ne-NP), button:lang(ne-NP), +input:lang(ne-NP), +select:lang(ne-NP), +optgroup:lang(ne-NP), +textarea:lang(ne-NP), .author-description .author-link:lang(ne-NP), +.comment-metadata:lang(ne-NP), +.comment-reply-link:lang(ne-NP), +.comments-title:lang(ne-NP), +.comment-author .fn:lang(ne-NP), +.discussion-meta-info:lang(ne-NP), +.entry-meta:lang(ne-NP), +.entry-footer:lang(ne-NP), +.main-navigation:lang(ne-NP), +.no-comments:lang(ne-NP), +.not-found .page-title:lang(ne-NP), +.error-404 .page-title:lang(ne-NP), +.post-navigation .post-title:lang(ne-NP), +.page-links:lang(ne-NP), +.page-description:lang(ne-NP), +.pagination .nav-links:lang(ne-NP), +.sticky-post:lang(ne-NP), +.site-title:lang(ne-NP), +.site-info:lang(ne-NP), +#cancel-comment-reply-link:lang(ne-NP), +h1:lang(ne-NP), +h2:lang(ne-NP), +h3:lang(ne-NP), +h4:lang(ne-NP), +h5:lang(ne-NP), +h6:lang(ne-NP), .page-title:lang(ne-NP), blockquote cite:lang(ne-NP), table:lang(ne-NP), .button:lang(ne-NP), +input:lang(ne-NP)[type="button"], +input:lang(ne-NP)[type="reset"], +input:lang(ne-NP)[type="submit"], .comment-navigation .nav-previous:lang(ne-NP), +.comment-navigation .nav-next:lang(ne-NP), .comment-list .pingback .comment-body:lang(ne-NP), +.comment-list .trackback .comment-body:lang(ne-NP), .comment-list .pingback .comment-body .comment-edit-link:lang(ne-NP), +.comment-list .trackback .comment-body .comment-edit-link:lang(ne-NP), .comment-form .comment-notes:lang(ne-NP), +.comment-form label:lang(ne-NP), .widget_archive ul li:lang(ne-NP), +.widget_categories ul li:lang(ne-NP), +.widget_meta ul li:lang(ne-NP), +.widget_nav_menu ul li:lang(ne-NP), +.widget_pages ul li:lang(ne-NP), +.widget_recent_comments ul li:lang(ne-NP), +.widget_recent_entries ul li:lang(ne-NP), +.widget_rss ul li:lang(ne-NP), .widget_tag_cloud .tagcloud:lang(ne-NP), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ne-NP), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ne-NP), .entry .entry-content .wp-block-archives li > a:lang(ne-NP), +.entry .entry-content .wp-block-categories li > a:lang(ne-NP), +.entry .entry-content .wp-block-latest-posts li > a:lang(ne-NP), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ne-NP), .entry .entry-content .wp-block-verse:lang(ne-NP), .entry .entry-content .has-drop-cap:lang(ne-NP):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ne-NP), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ne-NP), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ne-NP), +.entry .entry-content .wp-block-cover-image h2:lang(ne-NP), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ne-NP), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ne-NP), +.entry .entry-content .wp-block-cover h2:lang(ne-NP), .entry .entry-content .wp-block-audio figcaption:lang(ne-NP), +.entry .entry-content .wp-block-video figcaption:lang(ne-NP), +.entry .entry-content .wp-block-image figcaption:lang(ne-NP), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ne-NP), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ne-NP), .entry .entry-content .wp-block-file:lang(ne-NP), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ne-NP), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ne-NP), .wp-caption-text:lang(ne-NP), .gallery-caption:lang(ne-NP) { + font-family: Arial, sans-serif; +} + +body:lang(el), button:lang(el), +input:lang(el), +select:lang(el), +optgroup:lang(el), +textarea:lang(el), .author-description .author-link:lang(el), +.comment-metadata:lang(el), +.comment-reply-link:lang(el), +.comments-title:lang(el), +.comment-author .fn:lang(el), +.discussion-meta-info:lang(el), +.entry-meta:lang(el), +.entry-footer:lang(el), +.main-navigation:lang(el), +.no-comments:lang(el), +.not-found .page-title:lang(el), +.error-404 .page-title:lang(el), +.post-navigation .post-title:lang(el), +.page-links:lang(el), +.page-description:lang(el), +.pagination .nav-links:lang(el), +.sticky-post:lang(el), +.site-title:lang(el), +.site-info:lang(el), +#cancel-comment-reply-link:lang(el), +h1:lang(el), +h2:lang(el), +h3:lang(el), +h4:lang(el), +h5:lang(el), +h6:lang(el), .page-title:lang(el), blockquote cite:lang(el), table:lang(el), .button:lang(el), +input:lang(el)[type="button"], +input:lang(el)[type="reset"], +input:lang(el)[type="submit"], .comment-navigation .nav-previous:lang(el), +.comment-navigation .nav-next:lang(el), .comment-list .pingback .comment-body:lang(el), +.comment-list .trackback .comment-body:lang(el), .comment-list .pingback .comment-body .comment-edit-link:lang(el), +.comment-list .trackback .comment-body .comment-edit-link:lang(el), .comment-form .comment-notes:lang(el), +.comment-form label:lang(el), .widget_archive ul li:lang(el), +.widget_categories ul li:lang(el), +.widget_meta ul li:lang(el), +.widget_nav_menu ul li:lang(el), +.widget_pages ul li:lang(el), +.widget_recent_comments ul li:lang(el), +.widget_recent_entries ul li:lang(el), +.widget_rss ul li:lang(el), .widget_tag_cloud .tagcloud:lang(el), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(el), .entry .entry-content .wp-block-button .wp-block-button__link:lang(el), .entry .entry-content .wp-block-archives li > a:lang(el), +.entry .entry-content .wp-block-categories li > a:lang(el), +.entry .entry-content .wp-block-latest-posts li > a:lang(el), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(el), .entry .entry-content .wp-block-verse:lang(el), .entry .entry-content .has-drop-cap:lang(el):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(el), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(el), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(el), +.entry .entry-content .wp-block-cover-image h2:lang(el), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(el), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(el), +.entry .entry-content .wp-block-cover h2:lang(el), .entry .entry-content .wp-block-audio figcaption:lang(el), +.entry .entry-content .wp-block-video figcaption:lang(el), +.entry .entry-content .wp-block-image figcaption:lang(el), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(el), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(el), .entry .entry-content .wp-block-file:lang(el), .entry .entry-content .wp-block-file .wp-block-file__button:lang(el), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(el), .wp-caption-text:lang(el), .gallery-caption:lang(el) { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +body:lang(gu), button:lang(gu), +input:lang(gu), +select:lang(gu), +optgroup:lang(gu), +textarea:lang(gu), .author-description .author-link:lang(gu), +.comment-metadata:lang(gu), +.comment-reply-link:lang(gu), +.comments-title:lang(gu), +.comment-author .fn:lang(gu), +.discussion-meta-info:lang(gu), +.entry-meta:lang(gu), +.entry-footer:lang(gu), +.main-navigation:lang(gu), +.no-comments:lang(gu), +.not-found .page-title:lang(gu), +.error-404 .page-title:lang(gu), +.post-navigation .post-title:lang(gu), +.page-links:lang(gu), +.page-description:lang(gu), +.pagination .nav-links:lang(gu), +.sticky-post:lang(gu), +.site-title:lang(gu), +.site-info:lang(gu), +#cancel-comment-reply-link:lang(gu), +h1:lang(gu), +h2:lang(gu), +h3:lang(gu), +h4:lang(gu), +h5:lang(gu), +h6:lang(gu), .page-title:lang(gu), blockquote cite:lang(gu), table:lang(gu), .button:lang(gu), +input:lang(gu)[type="button"], +input:lang(gu)[type="reset"], +input:lang(gu)[type="submit"], .comment-navigation .nav-previous:lang(gu), +.comment-navigation .nav-next:lang(gu), .comment-list .pingback .comment-body:lang(gu), +.comment-list .trackback .comment-body:lang(gu), .comment-list .pingback .comment-body .comment-edit-link:lang(gu), +.comment-list .trackback .comment-body .comment-edit-link:lang(gu), .comment-form .comment-notes:lang(gu), +.comment-form label:lang(gu), .widget_archive ul li:lang(gu), +.widget_categories ul li:lang(gu), +.widget_meta ul li:lang(gu), +.widget_nav_menu ul li:lang(gu), +.widget_pages ul li:lang(gu), +.widget_recent_comments ul li:lang(gu), +.widget_recent_entries ul li:lang(gu), +.widget_rss ul li:lang(gu), .widget_tag_cloud .tagcloud:lang(gu), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(gu), .entry .entry-content .wp-block-button .wp-block-button__link:lang(gu), .entry .entry-content .wp-block-archives li > a:lang(gu), +.entry .entry-content .wp-block-categories li > a:lang(gu), +.entry .entry-content .wp-block-latest-posts li > a:lang(gu), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(gu), .entry .entry-content .wp-block-verse:lang(gu), .entry .entry-content .has-drop-cap:lang(gu):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(gu), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(gu), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(gu), +.entry .entry-content .wp-block-cover-image h2:lang(gu), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(gu), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(gu), +.entry .entry-content .wp-block-cover h2:lang(gu), .entry .entry-content .wp-block-audio figcaption:lang(gu), +.entry .entry-content .wp-block-video figcaption:lang(gu), +.entry .entry-content .wp-block-image figcaption:lang(gu), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(gu), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(gu), .entry .entry-content .wp-block-file:lang(gu), .entry .entry-content .wp-block-file .wp-block-file__button:lang(gu), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(gu), .wp-caption-text:lang(gu), .gallery-caption:lang(gu) { + font-family: Arial, sans-serif; +} + +body:lang(he-IL), button:lang(he-IL), +input:lang(he-IL), +select:lang(he-IL), +optgroup:lang(he-IL), +textarea:lang(he-IL), .author-description .author-link:lang(he-IL), +.comment-metadata:lang(he-IL), +.comment-reply-link:lang(he-IL), +.comments-title:lang(he-IL), +.comment-author .fn:lang(he-IL), +.discussion-meta-info:lang(he-IL), +.entry-meta:lang(he-IL), +.entry-footer:lang(he-IL), +.main-navigation:lang(he-IL), +.no-comments:lang(he-IL), +.not-found .page-title:lang(he-IL), +.error-404 .page-title:lang(he-IL), +.post-navigation .post-title:lang(he-IL), +.page-links:lang(he-IL), +.page-description:lang(he-IL), +.pagination .nav-links:lang(he-IL), +.sticky-post:lang(he-IL), +.site-title:lang(he-IL), +.site-info:lang(he-IL), +#cancel-comment-reply-link:lang(he-IL), +h1:lang(he-IL), +h2:lang(he-IL), +h3:lang(he-IL), +h4:lang(he-IL), +h5:lang(he-IL), +h6:lang(he-IL), .page-title:lang(he-IL), blockquote cite:lang(he-IL), table:lang(he-IL), .button:lang(he-IL), +input:lang(he-IL)[type="button"], +input:lang(he-IL)[type="reset"], +input:lang(he-IL)[type="submit"], .comment-navigation .nav-previous:lang(he-IL), +.comment-navigation .nav-next:lang(he-IL), .comment-list .pingback .comment-body:lang(he-IL), +.comment-list .trackback .comment-body:lang(he-IL), .comment-list .pingback .comment-body .comment-edit-link:lang(he-IL), +.comment-list .trackback .comment-body .comment-edit-link:lang(he-IL), .comment-form .comment-notes:lang(he-IL), +.comment-form label:lang(he-IL), .widget_archive ul li:lang(he-IL), +.widget_categories ul li:lang(he-IL), +.widget_meta ul li:lang(he-IL), +.widget_nav_menu ul li:lang(he-IL), +.widget_pages ul li:lang(he-IL), +.widget_recent_comments ul li:lang(he-IL), +.widget_recent_entries ul li:lang(he-IL), +.widget_rss ul li:lang(he-IL), .widget_tag_cloud .tagcloud:lang(he-IL), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(he-IL), .entry .entry-content .wp-block-button .wp-block-button__link:lang(he-IL), .entry .entry-content .wp-block-archives li > a:lang(he-IL), +.entry .entry-content .wp-block-categories li > a:lang(he-IL), +.entry .entry-content .wp-block-latest-posts li > a:lang(he-IL), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(he-IL), .entry .entry-content .wp-block-verse:lang(he-IL), .entry .entry-content .has-drop-cap:lang(he-IL):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(he-IL), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(he-IL), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(he-IL), +.entry .entry-content .wp-block-cover-image h2:lang(he-IL), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(he-IL), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(he-IL), +.entry .entry-content .wp-block-cover h2:lang(he-IL), .entry .entry-content .wp-block-audio figcaption:lang(he-IL), +.entry .entry-content .wp-block-video figcaption:lang(he-IL), +.entry .entry-content .wp-block-image figcaption:lang(he-IL), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(he-IL), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(he-IL), .entry .entry-content .wp-block-file:lang(he-IL), .entry .entry-content .wp-block-file .wp-block-file__button:lang(he-IL), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(he-IL), .wp-caption-text:lang(he-IL), .gallery-caption:lang(he-IL) { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +body:lang(ja), button:lang(ja), +input:lang(ja), +select:lang(ja), +optgroup:lang(ja), +textarea:lang(ja), .author-description .author-link:lang(ja), +.comment-metadata:lang(ja), +.comment-reply-link:lang(ja), +.comments-title:lang(ja), +.comment-author .fn:lang(ja), +.discussion-meta-info:lang(ja), +.entry-meta:lang(ja), +.entry-footer:lang(ja), +.main-navigation:lang(ja), +.no-comments:lang(ja), +.not-found .page-title:lang(ja), +.error-404 .page-title:lang(ja), +.post-navigation .post-title:lang(ja), +.page-links:lang(ja), +.page-description:lang(ja), +.pagination .nav-links:lang(ja), +.sticky-post:lang(ja), +.site-title:lang(ja), +.site-info:lang(ja), +#cancel-comment-reply-link:lang(ja), +h1:lang(ja), +h2:lang(ja), +h3:lang(ja), +h4:lang(ja), +h5:lang(ja), +h6:lang(ja), .page-title:lang(ja), blockquote cite:lang(ja), table:lang(ja), .button:lang(ja), +input:lang(ja)[type="button"], +input:lang(ja)[type="reset"], +input:lang(ja)[type="submit"], .comment-navigation .nav-previous:lang(ja), +.comment-navigation .nav-next:lang(ja), .comment-list .pingback .comment-body:lang(ja), +.comment-list .trackback .comment-body:lang(ja), .comment-list .pingback .comment-body .comment-edit-link:lang(ja), +.comment-list .trackback .comment-body .comment-edit-link:lang(ja), .comment-form .comment-notes:lang(ja), +.comment-form label:lang(ja), .widget_archive ul li:lang(ja), +.widget_categories ul li:lang(ja), +.widget_meta ul li:lang(ja), +.widget_nav_menu ul li:lang(ja), +.widget_pages ul li:lang(ja), +.widget_recent_comments ul li:lang(ja), +.widget_recent_entries ul li:lang(ja), +.widget_rss ul li:lang(ja), .widget_tag_cloud .tagcloud:lang(ja), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ja), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ja), .entry .entry-content .wp-block-archives li > a:lang(ja), +.entry .entry-content .wp-block-categories li > a:lang(ja), +.entry .entry-content .wp-block-latest-posts li > a:lang(ja), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ja), .entry .entry-content .wp-block-verse:lang(ja), .entry .entry-content .has-drop-cap:lang(ja):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ja), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ja), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ja), +.entry .entry-content .wp-block-cover-image h2:lang(ja), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ja), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ja), +.entry .entry-content .wp-block-cover h2:lang(ja), .entry .entry-content .wp-block-audio figcaption:lang(ja), +.entry .entry-content .wp-block-video figcaption:lang(ja), +.entry .entry-content .wp-block-image figcaption:lang(ja), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ja), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ja), .entry .entry-content .wp-block-file:lang(ja), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ja), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ja), .wp-caption-text:lang(ja), .gallery-caption:lang(ja) { + font-family: -apple-system, BlinkMacSystemFont, "Hiragino Sans", Meiryo, "Helvetica Neue", sans-serif; +} + +body:lang(ko-KR), button:lang(ko-KR), +input:lang(ko-KR), +select:lang(ko-KR), +optgroup:lang(ko-KR), +textarea:lang(ko-KR), .author-description .author-link:lang(ko-KR), +.comment-metadata:lang(ko-KR), +.comment-reply-link:lang(ko-KR), +.comments-title:lang(ko-KR), +.comment-author .fn:lang(ko-KR), +.discussion-meta-info:lang(ko-KR), +.entry-meta:lang(ko-KR), +.entry-footer:lang(ko-KR), +.main-navigation:lang(ko-KR), +.no-comments:lang(ko-KR), +.not-found .page-title:lang(ko-KR), +.error-404 .page-title:lang(ko-KR), +.post-navigation .post-title:lang(ko-KR), +.page-links:lang(ko-KR), +.page-description:lang(ko-KR), +.pagination .nav-links:lang(ko-KR), +.sticky-post:lang(ko-KR), +.site-title:lang(ko-KR), +.site-info:lang(ko-KR), +#cancel-comment-reply-link:lang(ko-KR), +h1:lang(ko-KR), +h2:lang(ko-KR), +h3:lang(ko-KR), +h4:lang(ko-KR), +h5:lang(ko-KR), +h6:lang(ko-KR), .page-title:lang(ko-KR), blockquote cite:lang(ko-KR), table:lang(ko-KR), .button:lang(ko-KR), +input:lang(ko-KR)[type="button"], +input:lang(ko-KR)[type="reset"], +input:lang(ko-KR)[type="submit"], .comment-navigation .nav-previous:lang(ko-KR), +.comment-navigation .nav-next:lang(ko-KR), .comment-list .pingback .comment-body:lang(ko-KR), +.comment-list .trackback .comment-body:lang(ko-KR), .comment-list .pingback .comment-body .comment-edit-link:lang(ko-KR), +.comment-list .trackback .comment-body .comment-edit-link:lang(ko-KR), .comment-form .comment-notes:lang(ko-KR), +.comment-form label:lang(ko-KR), .widget_archive ul li:lang(ko-KR), +.widget_categories ul li:lang(ko-KR), +.widget_meta ul li:lang(ko-KR), +.widget_nav_menu ul li:lang(ko-KR), +.widget_pages ul li:lang(ko-KR), +.widget_recent_comments ul li:lang(ko-KR), +.widget_recent_entries ul li:lang(ko-KR), +.widget_rss ul li:lang(ko-KR), .widget_tag_cloud .tagcloud:lang(ko-KR), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ko-KR), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ko-KR), .entry .entry-content .wp-block-archives li > a:lang(ko-KR), +.entry .entry-content .wp-block-categories li > a:lang(ko-KR), +.entry .entry-content .wp-block-latest-posts li > a:lang(ko-KR), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ko-KR), .entry .entry-content .wp-block-verse:lang(ko-KR), .entry .entry-content .has-drop-cap:lang(ko-KR):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ko-KR), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ko-KR), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ko-KR), +.entry .entry-content .wp-block-cover-image h2:lang(ko-KR), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ko-KR), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ko-KR), +.entry .entry-content .wp-block-cover h2:lang(ko-KR), .entry .entry-content .wp-block-audio figcaption:lang(ko-KR), +.entry .entry-content .wp-block-video figcaption:lang(ko-KR), +.entry .entry-content .wp-block-image figcaption:lang(ko-KR), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ko-KR), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ko-KR), .entry .entry-content .wp-block-file:lang(ko-KR), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ko-KR), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ko-KR), .wp-caption-text:lang(ko-KR), .gallery-caption:lang(ko-KR) { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +body:lang(th), button:lang(th), +input:lang(th), +select:lang(th), +optgroup:lang(th), +textarea:lang(th), .author-description .author-link:lang(th), +.comment-metadata:lang(th), +.comment-reply-link:lang(th), +.comments-title:lang(th), +.comment-author .fn:lang(th), +.discussion-meta-info:lang(th), +.entry-meta:lang(th), +.entry-footer:lang(th), +.main-navigation:lang(th), +.no-comments:lang(th), +.not-found .page-title:lang(th), +.error-404 .page-title:lang(th), +.post-navigation .post-title:lang(th), +.page-links:lang(th), +.page-description:lang(th), +.pagination .nav-links:lang(th), +.sticky-post:lang(th), +.site-title:lang(th), +.site-info:lang(th), +#cancel-comment-reply-link:lang(th), +h1:lang(th), +h2:lang(th), +h3:lang(th), +h4:lang(th), +h5:lang(th), +h6:lang(th), .page-title:lang(th), blockquote cite:lang(th), table:lang(th), .button:lang(th), +input:lang(th)[type="button"], +input:lang(th)[type="reset"], +input:lang(th)[type="submit"], .comment-navigation .nav-previous:lang(th), +.comment-navigation .nav-next:lang(th), .comment-list .pingback .comment-body:lang(th), +.comment-list .trackback .comment-body:lang(th), .comment-list .pingback .comment-body .comment-edit-link:lang(th), +.comment-list .trackback .comment-body .comment-edit-link:lang(th), .comment-form .comment-notes:lang(th), +.comment-form label:lang(th), .widget_archive ul li:lang(th), +.widget_categories ul li:lang(th), +.widget_meta ul li:lang(th), +.widget_nav_menu ul li:lang(th), +.widget_pages ul li:lang(th), +.widget_recent_comments ul li:lang(th), +.widget_recent_entries ul li:lang(th), +.widget_rss ul li:lang(th), .widget_tag_cloud .tagcloud:lang(th), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(th), .entry .entry-content .wp-block-button .wp-block-button__link:lang(th), .entry .entry-content .wp-block-archives li > a:lang(th), +.entry .entry-content .wp-block-categories li > a:lang(th), +.entry .entry-content .wp-block-latest-posts li > a:lang(th), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(th), .entry .entry-content .wp-block-verse:lang(th), .entry .entry-content .has-drop-cap:lang(th):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(th), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(th), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(th), +.entry .entry-content .wp-block-cover-image h2:lang(th), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(th), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(th), +.entry .entry-content .wp-block-cover h2:lang(th), .entry .entry-content .wp-block-audio figcaption:lang(th), +.entry .entry-content .wp-block-video figcaption:lang(th), +.entry .entry-content .wp-block-image figcaption:lang(th), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(th), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(th), .entry .entry-content .wp-block-file:lang(th), .entry .entry-content .wp-block-file .wp-block-file__button:lang(th), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(th), .wp-caption-text:lang(th), .gallery-caption:lang(th) { + font-family: "Sukhumvit Set", "Helvetica Neue", helvetica, arial, sans-serif; +} + +body:lang(vi), button:lang(vi), +input:lang(vi), +select:lang(vi), +optgroup:lang(vi), +textarea:lang(vi), .author-description .author-link:lang(vi), +.comment-metadata:lang(vi), +.comment-reply-link:lang(vi), +.comments-title:lang(vi), +.comment-author .fn:lang(vi), +.discussion-meta-info:lang(vi), +.entry-meta:lang(vi), +.entry-footer:lang(vi), +.main-navigation:lang(vi), +.no-comments:lang(vi), +.not-found .page-title:lang(vi), +.error-404 .page-title:lang(vi), +.post-navigation .post-title:lang(vi), +.page-links:lang(vi), +.page-description:lang(vi), +.pagination .nav-links:lang(vi), +.sticky-post:lang(vi), +.site-title:lang(vi), +.site-info:lang(vi), +#cancel-comment-reply-link:lang(vi), +h1:lang(vi), +h2:lang(vi), +h3:lang(vi), +h4:lang(vi), +h5:lang(vi), +h6:lang(vi), .page-title:lang(vi), blockquote cite:lang(vi), table:lang(vi), .button:lang(vi), +input:lang(vi)[type="button"], +input:lang(vi)[type="reset"], +input:lang(vi)[type="submit"], .comment-navigation .nav-previous:lang(vi), +.comment-navigation .nav-next:lang(vi), .comment-list .pingback .comment-body:lang(vi), +.comment-list .trackback .comment-body:lang(vi), .comment-list .pingback .comment-body .comment-edit-link:lang(vi), +.comment-list .trackback .comment-body .comment-edit-link:lang(vi), .comment-form .comment-notes:lang(vi), +.comment-form label:lang(vi), .widget_archive ul li:lang(vi), +.widget_categories ul li:lang(vi), +.widget_meta ul li:lang(vi), +.widget_nav_menu ul li:lang(vi), +.widget_pages ul li:lang(vi), +.widget_recent_comments ul li:lang(vi), +.widget_recent_entries ul li:lang(vi), +.widget_rss ul li:lang(vi), .widget_tag_cloud .tagcloud:lang(vi), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(vi), .entry .entry-content .wp-block-button .wp-block-button__link:lang(vi), .entry .entry-content .wp-block-archives li > a:lang(vi), +.entry .entry-content .wp-block-categories li > a:lang(vi), +.entry .entry-content .wp-block-latest-posts li > a:lang(vi), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(vi), .entry .entry-content .wp-block-verse:lang(vi), .entry .entry-content .has-drop-cap:lang(vi):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(vi), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(vi), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(vi), +.entry .entry-content .wp-block-cover-image h2:lang(vi), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(vi), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(vi), +.entry .entry-content .wp-block-cover h2:lang(vi), .entry .entry-content .wp-block-audio figcaption:lang(vi), +.entry .entry-content .wp-block-video figcaption:lang(vi), +.entry .entry-content .wp-block-image figcaption:lang(vi), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(vi), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(vi), .entry .entry-content .wp-block-file:lang(vi), .entry .entry-content .wp-block-file .wp-block-file__button:lang(vi), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(vi), .wp-caption-text:lang(vi), .gallery-caption:lang(vi) { + font-family: "Libre Franklin", sans-serif; +} + +/* Normalize */ +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ +/* 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; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.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; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ +} + +/** + * 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; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * Remove the gray background on active links in IE 10. + */ +a { + background-color: 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; + /* 1 */ + text-decoration: underline; + /* 2 */ + text-decoration: underline dotted; + /* 2 */ +} + +/** + * 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; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** + * 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: -0.25em; +} + +sup { + top: -0.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; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + 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: 0.35em 0.75em 0.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; + /* 1 */ + color: inherit; + /* 2 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + white-space: normal; + /* 1 */ +} + +/** + * 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; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * 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; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** + * 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; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* 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; +} + +/* Typography */ +html { + font-size: 22px; +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #111; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: 400; + font-size: 1em; + line-height: 1.8; + margin: 0; + text-rendering: optimizeLegibility; +} + +button, +input, +select, +optgroup, +textarea { + color: #111; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: 400; + line-height: 1.8; + text-rendering: optimizeLegibility; +} + +.author-description .author-link, +.comment-metadata, +.comment-reply-link, +.comments-title, +.comment-author .fn, +.discussion-meta-info, +.entry-meta, +.entry-footer, +.main-navigation, +.no-comments, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.page-links, +.page-description, +.pagination .nav-links, +.sticky-post, +.site-title, +.site-info, +#cancel-comment-reply-link, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.main-navigation, +.page-description, +.author-description .author-link, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.pagination .nav-links, +.comments-title, +.comment-author .fn, +.no-comments, +.site-title, +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.2; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.page-title { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; +} + +.site-branding, +.main-navigation ul.main-menu > li, +.social-navigation, +.author-description .author-bio, +.nav-links { + line-height: 1.25; +} + +h1 { + font-size: 2.25em; +} + +@media only screen and (min-width: 768px) { + h1 { + font-size: 2.8125em; + } +} + +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.has-larger-font-size, +h2 { + font-size: 1.6875em; +} + +@media only screen and (min-width: 768px) { + .entry-title, + .not-found .page-title, + .error-404 .page-title, + .has-larger-font-size, + h2 { + font-size: 2.25em; + } +} + +.has-regular-font-size, +.has-large-font-size, +.comments-title, +h3 { + font-size: 1.6875em; +} + +.site-title, +.site-description, +.main-navigation, +.nav-links, +.page-title, +.page-description, +.comment-author .fn, +.no-comments, +h2.author-title, +p.author-bio, +h4 { + font-size: 1.125em; +} + +.pagination .nav-links, +.comment-content, +h5 { + font-size: 0.88889em; +} + +.entry-meta, +.entry-footer, +.discussion-meta-info, +.site-info, +.has-small-font-size, +.comment-reply-link, +.comment-metadata, +.comment-notes, +.sticky-post, +#cancel-comment-reply-link, +img:after, +h6 { + font-size: 0.71111em; +} + +.site-title, +.page-title { + font-weight: normal; +} + +.page-description, +.page-links a { + font-weight: bold; +} + +.site-description { + letter-spacing: -0.01em; +} + +.post-navigation .post-title, +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.comments-title, +blockquote { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-break: break-word; + word-wrap: break-word; +} + +/* Do not hyphenate entry title on tablet view and bigger. */ +@media only screen and (min-width: 768px) { + .entry-title { + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + } +} + +p { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote cite { + font-size: 0.71111em; + font-style: normal; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +pre { + font-size: 0.88889em; + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 1.8; + overflow: auto; +} + +code, +kbd, +tt, +var { + font-size: 0.88889em; + font-family: Menlo, monaco, Consolas, Lucida Console, monospace; +} + +abbr, acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #fff9c0; + text-decoration: none; +} + +big { + font-size: 125%; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration: none; +} + +a:focus { + text-decoration: underline; +} + +/* Elements */ +html { + box-sizing: border-box; +} + +::-moz-selection { + background-color: #bfdcea; +} + +::selection { + background-color: #bfdcea; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + background-color: #fff; +} + +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:hover, +a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin; + outline-style: dotted; + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + margin: 1rem 0; +} + +h1:not(.site-title):before, +h2:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +h1:not(.site-title).has-text-align-center:before, +h2.has-text-align-center:before { + margin-right: auto; + margin-left: auto; +} + +h1:not(.site-title).has-text-align-right:before, +h2.has-text-align-right:before { + margin-right: auto; +} + +hr { + background-color: #767676; + border: 0; + height: 2px; +} + +ul, +ol { + padding-right: 1rem; +} + +ul { + list-style: disc; +} + +ul ul { + list-style-type: circle; +} + +ol { + list-style: decimal; +} + +li { + line-height: 1.8; +} + +li > ul, +li > ol { + padding-right: 2rem; +} + +dt { + font-weight: bold; +} + +dd { + margin: 0 1rem 1rem; +} + +img { + height: auto; + max-width: 100%; + position: relative; +} + +figure { + margin: 0; +} + +blockquote { + border-right: 2px solid #0073aa; + margin-right: 0; + padding: 0 1rem 0 0; +} + +blockquote > p { + margin: 0 0 1rem; +} + +blockquote cite { + color: #767676; +} + +table { + margin: 0 0 1rem; + border-collapse: collapse; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +table td, +table th { + padding: 0.5em; + border: 1px solid #767676; + word-break: break-all; +} + +/* Forms */ +.button, +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + transition: background 150ms ease-in-out; + background: #0073aa; + border: none; + border-radius: 5px; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.88889em; + font-weight: 700; + line-height: 1.2; + outline: none; + padding: 0.76rem 1rem; + text-decoration: none; + vertical-align: bottom; +} + +.button:hover, +button:hover, +input[type="button"]:hover, +input[type="reset"]:hover, +input[type="submit"]:hover { + background: #111; + cursor: pointer; +} + +.button:visited, +button:visited, +input[type="button"]:visited, +input[type="reset"]:visited, +input[type="submit"]:visited { + color: #fff; + text-decoration: none; +} + +.button:focus, +button:focus, +input[type="button"]:focus, +input[type="reset"]:focus, +input[type="submit"]:focus { + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +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 { + -webkit-backface-visibility: hidden; + background: #fff; + border: solid 1px #ccc; + box-sizing: border-box; + outline: none; + padding: 0.36rem 0.66rem; + -webkit-appearance: none; + outline-offset: 0; + border-radius: 0; +} + +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 { + border-color: #0073aa; + outline: thin solid rgba(0, 115, 170, 0.15); + outline-offset: -4px; +} + +input[type="search"]::-webkit-search-decoration { + display: none; +} + +textarea { + box-sizing: border-box; + display: block; + width: 100%; + max-width: 100%; + resize: vertical; +} + +form p { + margin: 1rem 0; +} + +/* Navigation */ +/*-------------------------------------------------------------- +## Links +--------------------------------------------------------------*/ +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:visited { + color: #0073aa; +} + +a:hover, +a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin dotted; + text-decoration: underline; +} + +/*-------------------------------------------------------------- +## Menus +--------------------------------------------------------------*/ +/** === Main menu === */ +.main-navigation { + display: block; + margin-top: 0.25rem; + /* Un-style buttons */ + /* + * Sub-menu styles + * + * :focus-within needs its own selector so other similar + * selectors don’t get ignored if a browser doesn’t recognize it + */ + /** + * Fade-in animation for top-level submenus + */ + /** + * Off-canvas touch device styles + */ +} + +body.page .main-navigation { + display: block; +} + +.main-navigation > div { + display: inline; +} + +.main-navigation button { + display: inline-block; + border: none; + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; + line-height: 1.2; + text-decoration: none; + background: transparent; + color: inherit; + cursor: pointer; + transition: background 250ms ease-in-out, + transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; +} + +.main-navigation button:hover, .main-navigation button:focus { + background: transparent; +} + +.main-navigation button:focus { + outline: 1px solid transparent; + outline-offset: -4px; +} + +.main-navigation button:active { + transform: scale(0.99); +} + +.main-navigation .main-menu { + display: inline-block; + margin: 0; + padding: 0; +} + +.main-navigation .main-menu > li { + color: #0073aa; + display: inline; + position: relative; +} + +.main-navigation .main-menu > li > a { + font-weight: 700; + color: #0073aa; + margin-left: 0.5rem; +} + +.main-navigation .main-menu > li > a + svg { + margin-left: 0.5rem; +} + +.main-navigation .main-menu > li > a:hover, +.main-navigation .main-menu > li > a:hover + svg { + color: #005177; +} + +.main-navigation .main-menu > li.menu-item-has-children { + display: inline-block; + position: inherit; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu > li.menu-item-has-children { + position: relative; + } +} + +.main-navigation .main-menu > li.menu-item-has-children > a { + margin-left: 0.125rem; +} + +.main-navigation .main-menu > li.menu-item-has-children > a:after, +.main-navigation .main-menu > li.menu-item-has-children .menu-item-has-children > a:after { + content: ""; + display: none; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand { + display: inline-block; + margin-left: 0.25rem; + /* Priority+ Menu */ +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand.main-menu-more-toggle { + position: relative; + height: 24px; + line-height: 1.2; + width: 24px; + padding: 0; + margin-right: 0.5rem; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand.main-menu-more-toggle svg { + height: 24px; + width: 24px; + top: -0.125rem; + vertical-align: text-bottom; +} + +.wp-customizer-unloading .main-navigation .main-menu > li.menu-item-has-children .submenu-expand, .main-navigation .main-menu > li.menu-item-has-children .submenu-expand.is-empty { + display: none; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand svg { + position: relative; + top: 0.2rem; +} + +.main-navigation .main-menu > li:last-child > a, +.main-navigation .main-menu > li:last-child.menu-item-has-children .submenu-expand { + margin-left: 0; +} + +.main-navigation .sub-menu { + background-color: #0073aa; + color: #fff; + list-style: none; + padding-right: 0; + position: absolute; + opacity: 0; + right: -9999px; + z-index: 99999; +} + +@media only screen and (min-width: 768px) { + .main-navigation .sub-menu { + width: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + } +} + +.main-navigation .sub-menu > li { + display: block; + float: none; + position: relative; +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand { + display: inline-block; + position: absolute; + width: calc( 24px + 1rem); + left: 0; + top: calc( .125 * 1rem); + bottom: 0; + color: white; + line-height: 1; + padding: calc( .5 * 1rem); +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand svg { + top: 0; +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand { + margin-left: 0; +} + +@media only screen and (min-width: 768px) { + .main-navigation .sub-menu > li.menu-item-has-children .menu-item-has-children > a:after { + content: "\203a"; + } +} + +.main-navigation .sub-menu > li > a, +.main-navigation .sub-menu > li > .menu-item-link-return { + color: #fff; + display: block; + line-height: 1.2; + text-shadow: none; + padding: calc( .5 * 1rem) 1rem calc( .5 * 1rem) calc( 24px + 1rem); + white-space: nowrap; +} + +.main-navigation .sub-menu > li > a:hover, .main-navigation .sub-menu > li > a:focus, +.main-navigation .sub-menu > li > .menu-item-link-return:hover, +.main-navigation .sub-menu > li > .menu-item-link-return:focus { + background: #005177; +} + +.main-navigation .sub-menu > li > a:hover:after, .main-navigation .sub-menu > li > a:focus:after, +.main-navigation .sub-menu > li > .menu-item-link-return:hover:after, +.main-navigation .sub-menu > li > .menu-item-link-return:focus:after { + background: #005177; +} + +.main-navigation .sub-menu > li > .menu-item-link-return { + width: 100%; + font-size: 22px; + font-weight: normal; + text-align: right; +} + +.main-navigation .sub-menu > li > a:empty { + display: none; +} + +.main-navigation .sub-menu > li.mobile-parent-nav-menu-item { + display: none; + font-size: 0.88889em; + font-weight: normal; +} + +.main-navigation .sub-menu > li.mobile-parent-nav-menu-item svg { + position: relative; + top: 0.2rem; + margin-left: calc( .25 * 1rem); +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu { + display: block; + right: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + display: block; + right: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + right: 0; + left: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + right: 0; + left: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu.hidden-links { + right: 0; + width: 100%; + display: table; + position: absolute; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu.hidden-links { + right: 0; + width: 100%; + display: table; + position: absolute; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu.hidden-links { + left: 0; + right: auto; + display: block; + width: max-content; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu.hidden-links { + left: 0; + right: auto; + display: block; + width: max-content; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + right: 0; + opacity: 1; + /* Non-mobile position */ +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + right: 0; + opacity: 1; + /* Non-mobile position */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + display: block; + right: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + display: block; + float: none; + margin-top: 0; + opacity: 1; + position: absolute; + right: 0; + left: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu.hidden-links, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu.hidden-links, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu.hidden-links { + right: 0; + width: 100%; + display: table; + position: absolute; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu.hidden-links, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu.hidden-links, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu.hidden-links { + left: 0; + right: auto; + display: table; + width: max-content; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .submenu-expand, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .submenu-expand, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + right: 0; + opacity: 1; + /* Non-mobile position */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu > li > a::before, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu > li > a::before, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu > .menu-item-has-children:not(.off-canvas):hover > .sub-menu { + animation: fade_in 0.1s forwards; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu .submenu-expand .svg-icon { + transform: rotate(-270deg); +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu .sub-menu { + opacity: 0; + position: absolute; + z-index: 0; + transform: translateX(100%); +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li:hover, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li:focus, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li > a:hover, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li > a:focus { + background-color: transparent; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu > li > a, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu > li > .menu-item-link-return { + white-space: inherit; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + display: table; + margin-top: 0; + opacity: 1; + padding-right: 0; + /* Mobile position */ + right: 0; + top: 0; + left: 0; + bottom: 0; + position: fixed; + z-index: 100000; + /* Make sure appears above mobile admin bar */ + width: 100vw; + height: 100vh; + max-width: 100vw; + transform: translateX(-100%); + animation: slide_in_right 0.3s forwards; + /* Prevent menu from being blocked by admin bar */ +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true > .mobile-parent-nav-menu-item { + display: block; +} + +.admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + top: 46px; + height: calc( 100vh - 46px); + /* WP core breakpoint */ +} + +.admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true .sub-menu.expanded-true { + top: 0; +} + +@media only screen and (min-width: 782px) { + .admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + top: 32px; + height: calc( 100vh - 32px); + } + .admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true .sub-menu.expanded-true { + top: 0; + } +} + +.main-navigation .main-menu-more:nth-child(n+3) { + display: none; +} + +/* Menu animation */ +@keyframes slide_in_right { + 100% { + transform: translateX(0%); + } +} + +@keyframes fade_in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Social menu */ +.social-navigation { + margin-top: calc(1rem / 2); + text-align: right; +} + +.social-navigation ul.social-links-menu { + content: ""; + display: table; + table-layout: fixed; + display: inline-block; + margin: 0; + padding: 0; +} + +.social-navigation ul.social-links-menu li { + display: inline-block; + vertical-align: bottom; + vertical-align: -webkit-baseline-middle; + list-style: none; +} + +.social-navigation ul.social-links-menu li:nth-child(n+2) { + margin-right: 0.1em; +} + +.social-navigation ul.social-links-menu li a { + border-bottom: 1px solid transparent; + display: block; + color: #111; + margin-bottom: -1px; + transition: opacity 110ms ease-in-out; +} + +.social-navigation ul.social-links-menu li a:hover, .social-navigation ul.social-links-menu li a:active { + color: #111; + opacity: 0.6; +} + +.social-navigation ul.social-links-menu li a:focus { + color: #111; + opacity: 1; + border-bottom: 1px solid #111; +} + +.social-navigation ul.social-links-menu li a svg { + display: block; + width: 32px; + height: 32px; + transform: translateZ(0); +} + +.social-navigation ul.social-links-menu li a svg#ui-icon-link { + transform: rotate(45deg); +} + +@media only screen and (min-width: 768px) { + .site-title + .social-navigation, + .site-description + .social-navigation { + margin-top: calc(1rem / 5); + } +} + +/** === Footer menu === */ +.footer-navigation { + display: inline; +} + +.footer-navigation > div { + display: inline; +} + +.footer-navigation .footer-menu { + display: inline; + padding-right: 0; +} + +.footer-navigation .footer-menu li { + display: inline; + margin-left: 1rem; +} + +/*-------------------------------------------------------------- +## Next / Previous +--------------------------------------------------------------*/ +/* Next/Previous navigation */ +.post-navigation { + margin: calc(3 * 1rem) 0; +} + +@media only screen and (min-width: 768px) { + .post-navigation { + margin: calc(3 * 1rem) calc(10% + 60px); + max-width: calc(6 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .post-navigation { + margin: calc(3 * 1rem) 0; + max-width: 100%; + } +} + +.post-navigation .nav-links { + margin: 0 1rem; + max-width: 100%; + display: flex; + flex-direction: column; +} + +@media only screen and (min-width: 768px) { + .post-navigation .nav-links { + margin: 0; + } +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links { + flex-direction: row; + margin: 0 calc(10% + 60px); + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.post-navigation .nav-links a .meta-nav { + color: #767676; + user-select: none; +} + +.post-navigation .nav-links a .meta-nav:before, .post-navigation .nav-links a .meta-nav:after { + display: none; + content: "—"; + width: 2em; + color: #767676; + height: 1em; +} + +.post-navigation .nav-links a .post-title { + hyphens: auto; +} + +.post-navigation .nav-links a:hover { + color: #005177; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-previous, + .post-navigation .nav-links .nav-next { + min-width: calc(50% - 2 * 1rem); + } +} + +.post-navigation .nav-links .nav-previous { + order: 2; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-previous { + order: 1; + } +} + +.post-navigation .nav-links .nav-previous + .nav-next { + margin-bottom: 1rem; +} + +.post-navigation .nav-links .nav-previous .meta-nav:before { + display: inline; +} + +.post-navigation .nav-links .nav-next { + order: 1; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-next { + order: 2; + padding-right: 1rem; + } +} + +.post-navigation .nav-links .nav-next .meta-nav:after { + display: inline; +} + +.pagination .nav-links { + display: flex; + flex-wrap: wrap; + padding: 0 calc(.5 * 1rem); +} + +.pagination .nav-links > * { + padding: calc(.5 * 1rem); +} + +.pagination .nav-links > *.dots, .pagination .nav-links > *.prev { + padding-right: 0; +} + +.pagination .nav-links > *.dots, .pagination .nav-links > *.next { + padding-left: 0; +} + +.pagination .nav-links a:focus { + text-decoration: underline; + outline-offset: -1px; +} + +.pagination .nav-links a:focus.prev, .pagination .nav-links a:focus.next { + text-decoration: none; +} + +.pagination .nav-links a:focus.prev .nav-prev-text, +.pagination .nav-links a:focus.prev .nav-next-text, .pagination .nav-links a:focus.next .nav-prev-text, +.pagination .nav-links a:focus.next .nav-next-text { + text-decoration: underline; +} + +.pagination .nav-links .nav-next-text, +.pagination .nav-links .nav-prev-text { + display: none; +} + +@media only screen and (min-width: 768px) { + .pagination .nav-links { + margin-right: calc(10% + 60px); + padding: 0; + } + .pagination .nav-links .prev > *, + .pagination .nav-links .next > * { + display: inline-block; + vertical-align: text-bottom; + } + .pagination .nav-links > * { + padding: 1rem; + } +} + +.comment-navigation .nav-links { + display: flex; + flex-direction: row; +} + +.comment-navigation .nav-previous, +.comment-navigation .nav-next { + min-width: 50%; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.comment-navigation .nav-previous .secondary-text, +.comment-navigation .nav-next .secondary-text { + display: none; +} + +@media only screen and (min-width: 768px) { + .comment-navigation .nav-previous .secondary-text, + .comment-navigation .nav-next .secondary-text { + display: inline; + } +} + +.comment-navigation .nav-previous svg, +.comment-navigation .nav-next svg { + vertical-align: middle; + position: relative; + margin: 0 -0.35em; + top: -1px; +} + +.comment-navigation .nav-next { + text-align: left; +} + +/* Accessibility */ +/* Text meant only for screen readers. */ +.screen-reader-text { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute !important; + width: 1px; + word-wrap: normal !important; + /* Many screen reader and browser combinations announce broken words as they would appear visually. */ +} + +.screen-reader-text:focus { + background-color: #f1f1f1; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + clip-path: none; + color: #21759b; + display: block; + font-size: 0.875rem; + font-weight: bold; + height: auto; + right: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; + /* Above WP toolbar. */ +} + +/* Do not show the outline on the skip link target. */ +#content[tabindex="-1"]:focus { + outline: 0; +} + +/* Alignments */ +.alignleft { + float: left; + margin-right: 1rem; +} + +@media only screen and (min-width: 768px) { + .alignleft { + margin-right: calc(2 * 1rem); + } +} + +.alignright { + float: right; + margin-left: 1rem; +} + +@media only screen and (min-width: 768px) { + .alignright { + margin-left: calc(2 * 1rem); + } +} + +.aligncenter { + clear: both; + display: block; + margin-right: auto; + margin-left: auto; +} + +/* Clearings */ +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.comment-content:before, +.comment-content:after, +.site-header:before, +.site-header:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after { + content: ""; + display: table; + table-layout: fixed; +} + +.clear:after, +.entry-content:after, +.comment-content:after, +.site-header:after, +.site-content:after, +.site-footer:after { + clear: both; +} + +/* Layout */ +/** === Layout === */ +#page { + width: 100%; +} + +.site-content { + overflow: hidden; +} + +/* Content */ +/*-------------------------------------------------------------- +## Header +--------------------------------------------------------------*/ +.site-header { + padding: 1em; +} + +.site-header.featured-image { + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 90vh; +} + +.site-header.featured-image .site-branding-container { + margin-bottom: auto; +} + +@media only screen and (min-width: 768px) { + .site-header { + margin: 0; + padding: 3rem 0; + } + .site-header.featured-image { + min-height: 100vh; + margin-bottom: 3rem; + } +} + +.site-branding { + color: #767676; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + position: relative; + word-wrap: break-word; +} + +@media only screen and (min-width: 768px) { + .site-branding { + margin: 0 calc(10% + 60px); + } +} + +.site-logo { + position: relative; + z-index: 999; + margin-bottom: calc(.66 * 1rem); +} + +@media only screen and (min-width: 768px) { + .site-logo { + margin-bottom: 0; + position: absolute; + left: calc(100% + (1.25 * 1rem)); + top: 4px; + z-index: 999; + } +} + +.site-logo .custom-logo-link { + border-radius: 100%; + box-sizing: content-box; + box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); + display: block; + width: 50px; + height: 50px; + overflow: hidden; + transition: box-shadow 200ms ease-in-out; +} + +.site-logo .custom-logo-link .custom-logo { + min-height: inherit; +} + +.site-logo .custom-logo-link:hover, .site-logo .custom-logo-link:active, .site-logo .custom-logo-link:focus { + box-shadow: 0 0 0 2px black; +} + +@media only screen and (min-width: 768px) { + .site-logo .custom-logo-link { + width: 64px; + height: 64px; + } +} + +.site-title { + margin: auto; + display: inline; + color: #111; + /* When there is no description set, make sure navigation appears below title. */ +} + +.site-title a { + color: #111; +} + +.site-title a:link, .site-title a:visited { + color: #111; +} + +.site-title a:hover { + color: #4a4a4a; +} + +.featured-image .site-title { + margin: 0; +} + +@media only screen and (min-width: 768px) { + .featured-image .site-title { + display: inline-block; + } +} + +.site-title + .main-navigation { + display: block; +} + +@media only screen and (min-width: 768px) { + .site-title { + display: inline; + } +} + +.site-title:not(:empty) + .site-description:not(:empty):before { + content: "\2014"; + margin: 0 .2em; +} + +.site-description { + display: inline; + color: #767676; + font-weight: normal; + margin: 0; +} + +.site-header.featured-image { + /* Hide overflow for overflowing featured image */ + overflow: hidden; + /* Need relative positioning to properly align layers. */ + position: relative; + /* Add text shadow to text, to increase readability. */ + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); + /* Set white text color when featured image is set. */ + /* add focus state to social media icons */ + /* Entry header */ + /* Custom Logo Link */ + /* Make sure important elements are above pseudo elements used for effects. */ + /* Set up image filter layer positioning */ + /* Background & Effects */ + /* Shared background settings between pseudo elements. */ + background-position: center; + background-repeat: no-repeat; + background-size: cover; + /* The intensity of each blend mode is controlled via layer opacity. */ + /* Second layer: screen. */ + /* Third layer: multiply. */ + /* When image filters are inactive, a black overlay is added. */ + /* Fourth layer: overlay. */ + /* Fifth layer: readability overlay */ +} + +.site-header.featured-image .site-branding .site-title, +.site-header.featured-image .site-branding .site-description, +.site-header.featured-image .main-navigation a:after, +.site-header.featured-image .main-navigation .main-menu > li.menu-item-has-children:after, +.site-header.featured-image .main-navigation li, +.site-header.featured-image .social-navigation li, +.site-header.featured-image .entry-meta, +.site-header.featured-image .entry-title { + color: #fff; +} + +.site-header.featured-image .main-navigation a, +.site-header.featured-image .main-navigation a + svg, +.site-header.featured-image .social-navigation a, +.site-header.featured-image .site-title a, +.site-header.featured-image .site-featured-image a { + color: #fff; + transition: opacity 110ms ease-in-out; +} + +.site-header.featured-image .main-navigation a:hover, .site-header.featured-image .main-navigation a:active, +.site-header.featured-image .main-navigation a:hover + svg, +.site-header.featured-image .main-navigation a:active + svg, +.site-header.featured-image .main-navigation a + svg:hover, +.site-header.featured-image .main-navigation a + svg:active, +.site-header.featured-image .main-navigation a + svg:hover + svg, +.site-header.featured-image .main-navigation a + svg:active + svg, +.site-header.featured-image .social-navigation a:hover, +.site-header.featured-image .social-navigation a:active, +.site-header.featured-image .social-navigation a:hover + svg, +.site-header.featured-image .social-navigation a:active + svg, +.site-header.featured-image .site-title a:hover, +.site-header.featured-image .site-title a:active, +.site-header.featured-image .site-title a:hover + svg, +.site-header.featured-image .site-title a:active + svg, +.site-header.featured-image .site-featured-image a:hover, +.site-header.featured-image .site-featured-image a:active, +.site-header.featured-image .site-featured-image a:hover + svg, +.site-header.featured-image .site-featured-image a:active + svg { + color: #fff; + opacity: 0.6; +} + +.site-header.featured-image .main-navigation a:focus, +.site-header.featured-image .main-navigation a:focus + svg, +.site-header.featured-image .main-navigation a + svg:focus, +.site-header.featured-image .main-navigation a + svg:focus + svg, +.site-header.featured-image .social-navigation a:focus, +.site-header.featured-image .social-navigation a:focus + svg, +.site-header.featured-image .site-title a:focus, +.site-header.featured-image .site-title a:focus + svg, +.site-header.featured-image .site-featured-image a:focus, +.site-header.featured-image .site-featured-image a:focus + svg { + color: #fff; +} + +.site-header.featured-image .main-navigation .sub-menu a { + opacity: inherit; +} + +.site-header.featured-image .social-navigation a:focus { + color: #fff; + opacity: 1; + border-bottom: 1px solid #fff; +} + +.site-header.featured-image .social-navigation svg, +.site-header.featured-image .site-featured-image svg { + /* Use -webkit- only if supporting: Chrome < 54, iOS < 9.3, Android < 4.4.4 */ + -webkit-filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35)); + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35)); +} + +.site-header.featured-image .site-featured-image { + /* First layer: grayscale. */ +} + +.site-header.featured-image .site-featured-image .post-thumbnail img { + height: auto; + right: 50%; + max-width: 1000%; + min-height: 100%; + min-width: 100vw; + position: absolute; + top: 50%; + transform: translateX(50%) translateY(-50%); + width: auto; + z-index: 1; + /* When image filters are active, make it grayscale to colorize it blue. */ +} + +@supports (object-fit: cover) { + .site-header.featured-image .site-featured-image .post-thumbnail img { + height: 100%; + right: 0; + object-fit: cover; + top: 0; + transform: none; + width: 100%; + } +} + +.image-filters-enabled .site-header.featured-image .site-featured-image .post-thumbnail img { + filter: grayscale(100%); +} + +.site-header.featured-image .site-featured-image .entry-header { + margin-top: calc( 4 * 1rem); + margin-bottom: 0; + margin-right: 0; + margin-left: 0; + /* Entry meta */ +} + +@media only screen and (min-width: 768px) { + .site-header.featured-image .site-featured-image .entry-header { + margin-right: calc(10% + 60px); + margin-left: calc(10% + 60px); + } +} + +.site-header.featured-image .site-featured-image .entry-header .entry-title:before { + background: #fff; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta { + font-weight: 500; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta > span { + margin-left: 1rem; + display: inline-block; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta > span:last-child { + margin-left: 0; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta a { + transition: color 110ms ease-in-out; + color: currentColor; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta a:hover { + text-decoration: none; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-left: 0.5em; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta .discussion-avatar-list { + display: none; +} + +@media only screen and (min-width: 768px) { + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta { + display: flex; + position: relative; + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-title { + padding-left: calc(1 * (100vw / 12) + 1rem); + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta .comment-count { + position: absolute; + left: 0; + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta .discussion-avatar-list { + display: block; + position: absolute; + bottom: 100%; + } +} + +.site-header.featured-image .custom-logo-link { + background: #fff; + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); +} + +.site-header.featured-image .custom-logo-link:hover, .site-header.featured-image .custom-logo-link:active, .site-header.featured-image .custom-logo-link:focus { + box-shadow: 0 0 0 2px white; +} + +.site-header.featured-image .site-branding { + position: relative; + z-index: 10; +} + +.site-header.featured-image .site-featured-image .entry-header { + position: relative; + z-index: 9; +} + +.site-header.featured-image .site-branding-container:after, +.site-header.featured-image .site-featured-image:before, +.site-header.featured-image .site-featured-image:after, .site-header.featured-image:after { + display: block; + position: absolute; + top: 0; + right: 0; + content: "\020"; + width: 100%; + height: 100%; +} + +.image-filters-enabled .site-header.featured-image .site-featured-image:before { + background: #0073aa; + mix-blend-mode: screen; + opacity: 0.1; +} + +.site-header.featured-image .site-featured-image:after { + background: #000; + mix-blend-mode: multiply; + opacity: .7; + /* When image filters are active, a blue overlay is added. */ +} + +.image-filters-enabled .site-header.featured-image .site-featured-image:after { + background: #0073aa; + opacity: .8; + z-index: 3; + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .site-header.featured-image .site-featured-image:after { + opacity: 1; + } +} + +.image-filters-enabled .site-header.featured-image .site-branding-container:after { + background: rgba(0, 0, 0, 0.35); + mix-blend-mode: overlay; + opacity: 0.5; + z-index: 4; + /* Browsers supporting mix-blend-mode can have a light overlay */ +} + +@supports (mix-blend-mode: overlay) { + .image-filters-enabled .site-header.featured-image .site-branding-container:after { + background: rgba(255, 255, 255, 0.35); + } +} + +.site-header.featured-image:after { + background: #000; + /** + * Add a transition to the readability overlay, to add a subtle + * but smooth effect when resizing the screen. + */ + transition: opacity 1200ms ease-in-out; + opacity: 0.7; + z-index: 5; + /* When image filters are active, a blue overlay is added. */ +} + +.image-filters-enabled .site-header.featured-image:after { + background: #000e14; + opacity: 0.38; +} + +@media only screen and (min-width: 768px) { + .image-filters-enabled .site-header.featured-image:after { + opacity: 0.18; + } +} + +.site-header.featured-image ::-moz-selection { + background: rgba(255, 255, 255, 0.17); +} + +.site-header.featured-image ::selection { + background: rgba(255, 255, 255, 0.17); +} + +/*-------------------------------------------------------------- +## Posts and pages +--------------------------------------------------------------*/ +.sticky { + display: block; +} + +.sticky-post { + background: #0073aa; + color: #fff; + display: inline-block; + font-weight: bold; + line-height: 1; + padding: .25rem; + position: absolute; + text-transform: uppercase; + top: -1rem; + z-index: 1; +} + +.updated:not(.published) { + display: none; +} + +.page-links { + clear: both; + margin: 0 0 calc(1.5 * 1rem); +} + +.entry { + margin-top: calc(6 * 1rem); +} + +.entry:first-of-type { + margin-top: 0; +} + +.entry .entry-header { + margin: calc(3 * 1rem) 1rem 1rem; + position: relative; +} + +@media only screen and (min-width: 768px) { + .entry .entry-header { + margin: calc(3 * 1rem) calc(10% + 60px) 1rem; + } +} + +.entry .entry-title { + margin: 0; +} + +.entry .entry-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.entry .entry-title.has-text-align-center:before { + margin-right: auto; + margin-left: auto; +} + +.entry .entry-title.has-text-align-right:before { + margin-right: auto; +} + +.entry .entry-title a { + color: inherit; +} + +.entry .entry-title a:hover { + color: #4a4a4a; +} + +.entry .entry-meta, +.entry .entry-footer { + color: #767676; + font-weight: 500; +} + +.entry .entry-meta > span, +.entry .entry-footer > span { + margin-left: 1rem; + display: inline-block; +} + +.entry .entry-meta > span:last-child, +.entry .entry-footer > span:last-child { + margin-left: 0; +} + +.entry .entry-meta a, +.entry .entry-footer a { + transition: color 110ms ease-in-out; + color: currentColor; +} + +.entry .entry-meta a:hover, +.entry .entry-footer a:hover { + text-decoration: none; + color: #0073aa; +} + +.entry .entry-meta .svg-icon, +.entry .entry-footer .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-left: 0.5em; +} + +.entry .entry-meta { + margin: 1rem 0; +} + +.entry .entry-footer { + margin: calc(2 * 1rem) 1rem 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-footer { + margin: 1rem calc(10% + 60px) calc(3 * 1rem); + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-footer { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .post-thumbnail { + margin: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .post-thumbnail { + margin: 1rem calc(10% + 60px); + } +} + +.entry .post-thumbnail:focus { + outline: none; +} + +.entry .post-thumbnail .post-thumbnail-inner { + display: block; +} + +.entry .post-thumbnail .post-thumbnail-inner img { + position: relative; + display: block; + width: 100%; +} + +.image-filters-enabled .entry .post-thumbnail { + position: relative; + display: block; +} + +.image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner { + filter: grayscale(100%); +} + +.image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner:after { + background: rgba(0, 0, 0, 0.35); + content: ""; + display: block; + height: 100%; + opacity: .5; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; + z-index: 4; +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner:after { + display: none; + } +} + +.image-filters-enabled .entry .post-thumbnail:before, .image-filters-enabled .entry .post-thumbnail:after { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; + right: 0; + content: "\020"; + pointer-events: none; +} + +.image-filters-enabled .entry .post-thumbnail:before { + background: #0073aa; + mix-blend-mode: screen; + opacity: 0.1; + z-index: 2; +} + +.image-filters-enabled .entry .post-thumbnail:after { + background: #0073aa; + mix-blend-mode: multiply; + opacity: .8; + z-index: 3; + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .entry .post-thumbnail:after { + opacity: 1; + } +} + +.entry .entry-content, +.entry .entry-summary { + max-width: calc(100% - (2 * 1rem)); + margin: 0 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content, + .entry .entry-summary { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } +} + +.entry .entry-content p { + word-wrap: break-word; +} + +.entry .entry-content .more-link { + transition: color 110ms ease-in-out; + display: inline; + color: inherit; +} + +.entry .entry-content .more-link:after { + content: "\02192"; + display: inline-block; + margin-right: 0.5em; +} + +.entry .entry-content .more-link:hover { + color: #0073aa; + text-decoration: none; +} + +.entry .entry-content a { + text-decoration: underline; +} + +.entry .entry-content a.button, .entry .entry-content a:hover { + text-decoration: none; +} + +.entry .entry-content a.button { + display: inline-block; +} + +.entry .entry-content a.button:hover { + background: #111; + color: #fff; + cursor: pointer; +} + +.entry .entry-content > iframe[style] { + margin: 32px 0 !important; + max-width: 100% !important; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > iframe[style] { + max-width: calc(8 * (100vw / 12) - 28px) !important; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > iframe[style] { + max-width: calc(6 * (100vw / 12) - 28px) !important; + } +} + +.entry .entry-content .page-links a { + margin: calc(0.5 * 1rem); + text-decoration: none; +} + +.entry .entry-content .wp-audio-shortcode { + max-width: calc(100vw - (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-audio-shortcode { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-audio-shortcode { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +/* Author description */ +.author-bio { + margin: calc(2 * 1rem) 1rem 1rem; +} + +@media only screen and (min-width: 768px) { + .author-bio { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .author-bio { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .author-bio { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +@media only screen and (min-width: 1168px) { + .author-bio { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +.author-bio .author-title { + display: inline; +} + +.author-bio .author-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.author-bio .author-title.has-text-align-center:before { + margin-right: auto; + margin-left: auto; +} + +.author-bio .author-title.has-text-align-right:before { + margin-right: auto; +} + +.author-bio .author-description { + display: inline; + color: #767676; + font-size: 1.125em; + line-height: 1.2; +} + +.author-bio .author-description .author-link { + display: inline-block; +} + +.author-bio .author-description .author-link:hover { + color: #005177; + text-decoration: none; +} + +/*-------------------------------------------------------------- +## Comments +--------------------------------------------------------------*/ +.comment-content a { + word-wrap: break-word; +} + +.bypostauthor { + display: block; +} + +.comments-area { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + margin: calc(2 * 1rem) 1rem; + word-wrap: break-word; + /* Add extra margin when the comments section is located immediately after the + * post itself (this happens on pages). + */ +} + +@media only screen and (min-width: 768px) { + .comments-area { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .comments-area { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .comments-area { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +.comments-area > * { + margin-top: calc(2 * 1rem); + margin-bottom: calc(2 * 1rem); +} + +@media only screen and (min-width: 768px) { + .comments-area > * { + margin-top: calc(3 * 1rem); + margin-bottom: calc(3 * 1rem); + } +} + +.entry + .comments-area { + margin-top: calc(3 * 1rem); +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap { + align-items: baseline; + display: flex; + justify-content: space-between; + } +} + +.comments-area .comments-title-wrap .comments-title { + margin: 0; +} + +.comments-area .comments-title-wrap .comments-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.comments-area .comments-title-wrap .comments-title.has-text-align-center:before { + margin-right: auto; + margin-left: auto; +} + +.comments-area .comments-title-wrap .comments-title.has-text-align-right:before { + margin-right: auto; +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap .comments-title { + flex: 1 0 calc(3 * (100vw / 12)); + } +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap .discussion-meta { + flex: 0 0 calc(2 * (100vw / 12)); + margin-right: 1rem; + } +} + +#comment { + max-width: 100%; + box-sizing: border-box; +} + +#respond { + position: relative; +} + +#respond .comment-user-avatar { + margin: 1rem 0 -1rem; +} + +#respond .comment .comment-form { + padding-right: 0; +} + +#respond > small { + display: block; + font-size: 22px; + position: absolute; + right: calc(1rem + 100%); + top: calc(-3.5 * 1rem); + width: calc(100vw / 12); +} + +#comments > .comments-title:last-child { + display: none; +} + +.comment-form-flex { + display: flex; + flex-direction: column; +} + +.comment-form-flex .comments-title { + display: none; + margin: 0; + order: 1; +} + +.comment-form-flex #respond { + order: 2; +} + +.comment-form-flex #respond + .comments-title { + display: block; +} + +.comment-list { + list-style: none; + padding: 0; +} + +.comment-list .children { + margin: 0; + padding: 0 1rem 0 0; +} + +.comment-list > .comment:first-child { + margin-top: 0; +} + +.comment-list .pingback .comment-body, +.comment-list .trackback .comment-body { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + font-weight: 500; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.comment-list .pingback .comment-body a:not(.comment-edit-link), +.comment-list .trackback .comment-body a:not(.comment-edit-link) { + font-weight: bold; + font-size: 19.55556px; + line-height: 1.5; + padding-left: 0.5rem; + display: block; +} + +.comment-list .pingback .comment-body .comment-edit-link, +.comment-list .trackback .comment-body .comment-edit-link { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 500; +} + +#respond + .comment-reply { + display: none; +} + +.comment-reply .comment-reply-link { + display: inline-block; +} + +.comment { + list-style: none; + position: relative; +} + +@media only screen and (min-width: 768px) { + .comment { + padding-right: calc(.5 * (1rem + calc(100vw / 12 ))); + } + .comment.depth-1, + .comment .children { + padding-right: 0; + } + .comment.depth-1 { + margin-right: calc(3.25 * 1rem); + } +} + +.comment .comment-body { + margin: calc(2 * 1rem) 0 0; +} + +.comment .comment-meta { + position: relative; +} + +.comment .comment-author .avatar { + float: right; + margin-left: 1rem; + position: relative; +} + +@media only screen and (min-width: 768px) { + .comment .comment-author .avatar { + float: inherit; + margin-left: inherit; + position: absolute; + top: 0; + left: calc(100% + 1rem); + } +} + +.comment .comment-author .fn { + position: relative; + display: block; +} + +.comment .comment-author .fn a { + color: inherit; +} + +.comment .comment-author .fn a:hover { + color: #005177; +} + +.comment .comment-author .post-author-badge { + border-radius: 100%; + display: block; + height: 18px; + position: absolute; + background: #008fd3; + left: calc(100% - 2.5rem); + top: -3px; + width: 18px; +} + +@media only screen and (min-width: 768px) { + .comment .comment-author .post-author-badge { + left: calc(100% + 0.75rem); + } +} + +.comment .comment-author .post-author-badge svg { + width: inherit; + height: inherit; + display: block; + fill: white; + transform: scale(0.875); +} + +.comment .comment-metadata > a, +.comment .comment-metadata .comment-edit-link { + display: inline; + font-weight: 500; + color: #767676; + vertical-align: baseline; +} + +.comment .comment-metadata > a time, +.comment .comment-metadata .comment-edit-link time { + vertical-align: baseline; +} + +.comment .comment-metadata > a:hover, +.comment .comment-metadata .comment-edit-link:hover { + color: #005177; + text-decoration: none; +} + +.comment .comment-metadata > * { + display: inline-block; +} + +.comment .comment-metadata .edit-link-sep { + color: #767676; + margin: 0 0.2em; + vertical-align: baseline; +} + +.comment .comment-metadata .edit-link { + color: #767676; +} + +.comment .comment-metadata .edit-link svg { + transform: scale(0.8); + vertical-align: baseline; + margin-left: 0.1em; +} + +.comment .comment-metadata .comment-edit-link { + position: relative; + padding-right: 1rem; + margin-right: -1rem; + z-index: 1; +} + +.comment .comment-metadata .comment-edit-link:hover { + color: #0073aa; +} + +.comment .comment-content { + margin: 1rem 0; +} + +@media only screen and (min-width: 1168px) { + .comment .comment-content { + padding-left: 1rem; + } +} + +.comment .comment-content > *:first-child { + margin-top: 0; +} + +.comment .comment-content > *:last-child { + margin-bottom: 0; +} + +.comment .comment-content blockquote { + margin-right: 0; +} + +.comment .comment-content a { + text-decoration: underline; +} + +.comment .comment-content a:hover { + text-decoration: none; +} + +.comment-reply-link, +#cancel-comment-reply-link { + font-weight: 500; +} + +.comment-reply-link:hover, +#cancel-comment-reply-link:hover { + color: #005177; +} + +.discussion-avatar-list { + content: ""; + display: table; + table-layout: fixed; + margin: 0; + padding: 0; +} + +.discussion-avatar-list li { + position: relative; + list-style: none; + margin: 0 0 0 -8px; + padding: 0; + float: right; +} + +.discussion-avatar-list .comment-user-avatar img { + height: calc(1.5 * 1rem); + width: calc(1.5 * 1rem); +} + +.discussion-meta .discussion-meta-info { + margin: 0; +} + +.discussion-meta .discussion-meta-info .svg-icon { + vertical-align: middle; + fill: currentColor; + transform: scale(0.6) scaleX(-1) translateY(-0.1em); + margin-right: -0.25rem; +} + +.comment-form .comment-notes, +.comment-form label { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; +} + +@media only screen and (min-width: 768px) { + .comment-form .comment-form-author, + .comment-form .comment-form-email { + width: calc(50% - 0.5rem); + float: right; + } +} + +@media only screen and (min-width: 768px) { + .comment-form .comment-form-email { + margin-right: 1rem; + } +} + +.comment-form input[name="author"], +.comment-form input[name="email"], +.comment-form input[name="url"] { + display: block; + width: 100%; +} + +/*-------------------------------------------------------------- +## Archives +--------------------------------------------------------------*/ +.archive .page-header, +.search .page-header, +.error404 .page-header { + margin: 1rem 1rem calc(3 * 1rem); +} + +@media only screen and (min-width: 768px) { + .archive .page-header, + .search .page-header, + .error404 .page-header { + margin: 0 calc(10% + 60px) calc(3 * 1rem); + } +} + +.archive .page-header .page-title, +.search .page-header .page-title, +.error404 .page-header .page-title { + color: #767676; + display: inline; + letter-spacing: normal; +} + +.archive .page-header .page-title:before, +.search .page-header .page-title:before, +.error404 .page-header .page-title:before { + display: none; +} + +.archive .page-header .search-term, +.archive .page-header .page-description, +.search .page-header .search-term, +.search .page-header .page-description, +.error404 .page-header .search-term, +.error404 .page-header .page-description { + display: inherit; + clear: both; +} + +.archive .page-header .page-description, +.search .page-header .page-description { + display: block; + color: #111; + font-size: 1em; +} + +@media only screen and (min-width: 768px) { + .hfeed .entry .entry-header { + margin: calc(3 * 1rem) calc(10% + 60px) calc(1rem / 2); + } +} + +/* 404 & Not found */ +.error-404.not-found .page-content, +.no-results.not-found .page-content { + margin: calc(3 * 1rem) 1rem; +} + +@media only screen and (min-width: 768px) { + .error-404.not-found .page-content, + .no-results.not-found .page-content { + margin: calc(3 * 1rem) calc(10% + 60px) calc(1rem / 2); + } +} + +.error-404.not-found .search-submit, +.no-results.not-found .search-submit { + vertical-align: middle; + margin: 1rem 0; +} + +.error-404.not-found .search-field, +.no-results.not-found .search-field { + width: 100%; +} + +/*-------------------------------------------------------------- +## Footer +--------------------------------------------------------------*/ +/* Site footer */ +#colophon .widget-area, +#colophon .site-info { + margin: calc(2 * 1rem) 1rem; +} + +@media only screen and (min-width: 768px) { + #colophon .widget-area, + #colophon .site-info { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +#colophon .widget-column { + display: flex; + flex-wrap: wrap; +} + +#colophon .widget-column .widget { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + width: 100%; + word-wrap: break-word; +} + +@media only screen and (min-width: 1168px) { + #colophon .widget-column .widget { + margin-left: calc(3 * 1rem); + width: calc(50% - (3 * 1rem)); + } +} + +#colophon .site-info { + color: #767676; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-wrap: break-word; +} + +#colophon .site-info a { + color: inherit; +} + +#colophon .site-info a:hover { + text-decoration: none; + color: #0073aa; +} + +#colophon .site-info .imprint, +#colophon .site-info .privacy-policy-link { + margin-left: 1rem; +} + +/* Widgets */ +.widget { + margin: 0 0 1rem; + /* Make sure select elements fit in widgets. */ +} + +.widget .widget-title { + font-size: 1.6875em; +} + +.widget select { + max-width: 100%; +} + +.widget a { + color: #0073aa; +} + +.widget a:hover { + color: #005177; +} + +.widget_archive ul, +.widget_categories ul, +.widget_meta ul, +.widget_nav_menu ul, +.widget_pages ul, +.widget_recent_comments ul, +.widget_recent_entries ul, +.widget_rss ul { + padding: 0; + list-style: none; +} + +.widget_archive ul li, +.widget_categories ul li, +.widget_meta ul li, +.widget_nav_menu ul li, +.widget_pages ul li, +.widget_recent_comments ul li, +.widget_recent_entries ul li, +.widget_rss ul li { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: 700; + line-height: 1.2; + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.widget_archive ul ul, +.widget_categories ul ul, +.widget_meta ul ul, +.widget_nav_menu ul ul, +.widget_pages ul ul, +.widget_recent_comments ul ul, +.widget_recent_entries ul ul, +.widget_rss ul ul { + counter-reset: submenu; +} + +.widget_archive ul ul > li > a::before, +.widget_categories ul ul > li > a::before, +.widget_meta ul ul > li > a::before, +.widget_nav_menu ul ul > li > a::before, +.widget_pages ul ul > li > a::before, +.widget_recent_comments ul ul > li > a::before, +.widget_recent_entries ul ul > li > a::before, +.widget_rss ul ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.widget_tag_cloud .tagcloud { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; +} + +.widget_search .search-field { + width: 100%; +} + +@media only screen and (min-width: 600px) { + .widget_search .search-field { + width: auto; + } +} + +.widget_search .search-submit { + display: block; + margin-top: 1rem; +} + +.widget_calendar .calendar_wrap { + text-align: center; +} + +.widget_calendar .calendar_wrap table td, +.widget_calendar .calendar_wrap table th { + border: none; +} + +.widget_calendar .calendar_wrap a { + text-decoration: underline; +} + +.widget_calendar .calendar_wrap .wp-calendar-table { + margin-bottom: 0; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav { + margin: 0 0 1rem; + display: table; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav span { + display: table-cell; + padding: 0.5em; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav-prev, +.widget_calendar .calendar_wrap .wp-calendar-nav-next { + width: 40%; +} + +/* Blocks */ +/* !Block styles */ +.entry .entry-content > *, +.entry .entry-summary > *, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + } +} + +.entry .entry-content > *.alignwide, +.entry .entry-summary > *.alignwide, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignwide, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignwide { + margin-right: auto; + margin-left: auto; + clear: both; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignwide, + .entry .entry-summary > *.alignwide, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignwide, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignwide { + width: 100%; + max-width: 100%; + } +} + +.entry .entry-content > *.alignfull, +.entry .entry-summary > *.alignfull, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignfull, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignfull { + position: relative; + right: -1rem; + width: calc( 100% + (2 * 1rem)); + max-width: calc( 100% + (2 * 1rem)); + clear: both; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignfull, + .entry .entry-summary > *.alignfull, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignfull, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignfull { + margin-top: calc(2 * 1rem); + margin-bottom: calc(2 * 1rem); + right: calc( -12.5% - 75px); + width: calc( 125% + 150px); + max-width: calc( 125% + 150px); + } +} + +.entry .entry-content > *.alignleft, +.entry .entry-summary > *.alignleft, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignleft, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignleft { + float: left; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-right: 0; + margin-right: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignleft, + .entry .entry-summary > *.alignleft, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignleft, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignleft { + max-width: calc(4 * (100vw / 12)); + margin-right: calc(2 * 1rem); + } +} + +.entry .entry-content > *.alignright, +.entry .entry-summary > *.alignright, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignright, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignright { + float: right; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-left: 0; + margin-left: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignright, + .entry .entry-summary > *.alignright, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignright, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignright { + max-width: calc(4 * (100vw / 12)); + margin-left: 0; + margin-left: calc(2 * 1rem); + } +} + +.entry .entry-content > *.aligncenter, +.entry .entry-summary > *.aligncenter, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + margin-right: auto; + margin-left: auto; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + margin-right: 0; + margin-left: 0; + } +} + +.entry .entry-content > * > *:first-child, +.entry .entry-summary > * > *:first-child { + margin-top: 0; +} + +.entry .entry-content > * > *:last-child, +.entry .entry-summary > * > *:last-child { + margin-bottom: 0; +} + +/* + * Unset nested content selector styles + * - Prevents layout styles from cascading too deeply + * - helps with plugin compatibility + */ +.entry .entry-content .entry-content, +.entry .entry-content .entry-summary, +.entry .entry-content .entry, +.entry .entry-summary .entry-content, +.entry .entry-summary .entry-summary, +.entry .entry-summary .entry { + margin: inherit; + max-width: inherit; + padding: inherit; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .entry-content, + .entry .entry-content .entry-summary, + .entry .entry-content .entry, + .entry .entry-summary .entry-content, + .entry .entry-summary .entry-summary, + .entry .entry-summary .entry { + margin: inherit; + max-width: inherit; + padding: inherit; + } +} + +.entry .entry-content p.has-background { + padding: 20px 30px; +} + +.entry .entry-content .wp-block-audio { + width: 100%; +} + +.entry .entry-content .wp-block-audio audio { + width: 100%; +} + +.entry .entry-content .wp-block-audio.alignleft audio, +.entry .entry-content .wp-block-audio.alignright audio { + max-width: 198px; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-audio.alignleft audio, + .entry .entry-content .wp-block-audio.alignright audio { + max-width: 384px; + } +} + +@media only screen and (min-width: 1379px) { + .entry .entry-content .wp-block-audio.alignleft audio, + .entry .entry-content .wp-block-audio.alignright audio { + max-width: 385.44px; + } +} + +.entry .entry-content .wp-block-video video { + width: 100%; +} + +.entry .entry-content .wp-block-button .wp-block-button__link { + transition: background 150ms ease-in-out; + border: none; + font-size: 0.88889em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.2; + box-sizing: border-box; + font-weight: bold; + text-decoration: none; + padding: 0.76rem 1rem; + outline: none; + outline: none; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:not(.has-background) { + background-color: #0073aa; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:not(.has-text-color) { + color: white; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:hover { + color: white; + background: #111; + cursor: pointer; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:focus { + color: white; + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +.entry .entry-content .wp-block-button:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link, +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus, +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active { + transition: all 150ms ease-in-out; + border-width: 2px; + border-style: solid; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-background), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus:not(.has-background), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active:not(.has-background) { + background: transparent; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus:not(.has-text-color), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active:not(.has-text-color) { + color: #0073aa; + border-color: currentColor; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:hover { + color: white; + border-color: #111; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:hover:not(.has-background) { + color: #111; +} + +.entry .entry-content .wp-block-archives, +.entry .entry-content .wp-block-categories, +.entry .entry-content .wp-block-latest-posts { + padding: 0; + list-style: none; +} + +.entry .entry-content .wp-block-archives li > a, +.entry .entry-content .wp-block-categories li > a, +.entry .entry-content .wp-block-latest-posts li > a { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: bold; + line-height: 1.2; + text-decoration: none; +} + +.entry .entry-content .wp-block-archives.aligncenter, +.entry .entry-content .wp-block-categories.aligncenter { + text-align: center; +} + +.entry .entry-content .wp-block-categories ul { + padding-top: 0.75rem; +} + +.entry .entry-content .wp-block-categories li ul { + list-style: none; + padding-right: 0; +} + +.entry .entry-content .wp-block-categories ul { + counter-reset: submenu; +} + +.entry .entry-content .wp-block-categories ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; + line-height: 1.2; +} + +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-full-content, +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-excerpt { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.entry .entry-content .wp-block-latest-posts li { + padding-bottom: 0.5rem; +} + +.entry .entry-content .wp-block-latest-posts li.menu-item-has-children, .entry .entry-content .wp-block-latest-posts li:last-child { + padding-bottom: 0; +} + +.entry .entry-content .wp-block-latest-posts li :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: 0.5rem; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li { + border-top: 2px solid #ccc; + padding-top: 1rem; + margin-bottom: 2rem; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li a:after { + content: ''; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li:last-child { + margin-bottom: auto; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li:last-child a:after { + content: ''; +} + +.entry .entry-content .wp-block-preformatted { + font-size: 0.71111em; + line-height: 1.8; + padding: 1rem; +} + +.entry .entry-content .wp-block-verse { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-size: 22px; + line-height: 1.8; +} + +.entry .entry-content .has-drop-cap:not(:focus):first-letter { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 3.375em; + line-height: 1; + font-weight: bold; + margin: 0 0 0 0.25em; +} + +.entry .entry-content .wp-block-pullquote { + border-color: transparent; + border-width: 2px; + padding: 1rem; +} + +.entry .entry-content .wp-block-pullquote blockquote { + color: #111; + border: none; + margin-top: calc(4 * 1rem); + margin-bottom: calc(4.33 * 1rem); + margin-left: 0; + padding-right: 0; +} + +.entry .entry-content .wp-block-pullquote p { + font-size: 1.6875em; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +.entry .entry-content .wp-block-pullquote p em { + font-style: normal; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote p { + font-size: 2.25em; + } +} + +.entry .entry-content .wp-block-pullquote cite { + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + text-transform: none; + color: #767676; + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +.entry .entry-content .wp-block-pullquote.alignleft, .entry .entry-content .wp-block-pullquote.alignright { + width: 100%; + padding: 0; +} + +.entry .entry-content .wp-block-pullquote.alignleft blockquote, .entry .entry-content .wp-block-pullquote.alignright blockquote { + margin: 1rem 0; + padding: 0; + text-align: right; + max-width: 100%; +} + +.entry .entry-content .wp-block-pullquote.alignleft blockquote p:first-child, .entry .entry-content .wp-block-pullquote.alignright blockquote p:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color { + background-color: #0073aa; + padding-right: 0; + padding-left: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color { + padding-right: 10%; + padding-left: 10%; + } +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color p { + font-size: 1.6875em; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color p { + font-size: 2.25em; + } +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color a { + color: #fff; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color cite { + color: inherit; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 100%; + color: #fff; + padding-right: 0; + margin-right: 1rem; + margin-left: 1rem; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-text-color p, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-text-color a, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: inherit; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote { + margin-right: 0; + margin-left: 0; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignright, .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignleft { + padding: 1rem calc(2 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignfull { + padding-right: calc(10% + 58px + (2 * 1rem)); + padding-left: calc(10% + 58px + (2 * 1rem)); + } +} + +.entry .entry-content .wp-block-quote:not(.is-large), .entry .entry-content .wp-block-quote:not(.is-style-large) { + border-width: 2px; + border-color: #0073aa; + padding-top: 0; + padding-bottom: 0; +} + +.entry .entry-content .wp-block-quote p { + font-size: 1em; + font-style: normal; + line-height: 1.8; +} + +.entry .entry-content .wp-block-quote cite { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +.entry .entry-content .wp-block-quote.is-large, .entry .entry-content .wp-block-quote.is-style-large { + margin: 1rem 0; + padding: 0; + border-right: none; +} + +.entry .entry-content .wp-block-quote.is-large p, .entry .entry-content .wp-block-quote.is-style-large p { + font-size: 1.6875em; + line-height: 1.4; + font-style: italic; +} + +.entry .entry-content .wp-block-quote.is-large cite, +.entry .entry-content .wp-block-quote.is-large footer, .entry .entry-content .wp-block-quote.is-style-large cite, +.entry .entry-content .wp-block-quote.is-style-large footer { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-quote.is-large, .entry .entry-content .wp-block-quote.is-style-large { + margin: 1rem 0; + padding: 1rem 0; + } + .entry .entry-content .wp-block-quote.is-large p, .entry .entry-content .wp-block-quote.is-style-large p { + font-size: 1.6875em; + } +} + +.entry .entry-content .wp-block-image { + max-width: 100%; +} + +.entry .entry-content .wp-block-image img { + display: block; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image:not(.alignwide):not(.alignfull) > img { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image:not(.alignwide):not(.alignfull) > img { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image .aligncenter { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image .aligncenter { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image .aligncenter { + margin: 0; + width: calc(8 * (100vw / 12) - 28px); + } + .entry .entry-content .wp-block-image .aligncenter img { + margin: 0 auto; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image .aligncenter { + width: calc(6 * (100vw / 12) - 28px); + } + .entry .entry-content .wp-block-image .aligncenter img { + margin: 0 auto; + } +} + +.entry .entry-content .wp-block-image.alignfull img { + width: 100vw; + max-width: calc( 100% + (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image.alignfull img { + max-width: calc( 125% + 150px); + margin-right: auto; + margin-left: auto; + } +} + +.entry .entry-content .wp-block-cover-image, +.entry .entry-content .wp-block-cover { + position: relative; + min-height: 430px; + padding: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image, + .entry .entry-content .wp-block-cover { + padding: 1rem 10%; + } +} + +.entry .entry-content .wp-block-cover-image .wp-block-cover-image-text, +.entry .entry-content .wp-block-cover-image .wp-block-cover-text, +.entry .entry-content .wp-block-cover-image h2, +.entry .entry-content .wp-block-cover .wp-block-cover-image-text, +.entry .entry-content .wp-block-cover .wp-block-cover-text, +.entry .entry-content .wp-block-cover h2 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 1.6875em; + font-weight: bold; + line-height: 1.25; + padding: 0; + color: #fff; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image h2, + .entry .entry-content .wp-block-cover .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover .wp-block-cover-text, + .entry .entry-content .wp-block-cover h2 { + font-size: 2.25em; + max-width: 100%; + } +} + +.entry .entry-content .wp-block-cover-image.alignleft, .entry .entry-content .wp-block-cover-image.alignright, +.entry .entry-content .wp-block-cover.alignleft, +.entry .entry-content .wp-block-cover.alignright { + width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignleft, .entry .entry-content .wp-block-cover-image.alignright, + .entry .entry-content .wp-block-cover.alignleft, + .entry .entry-content .wp-block-cover.alignright { + padding: 1rem calc(2 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignfull, + .entry .entry-content .wp-block-cover.alignfull { + padding-right: calc(10% + 58px + (2 * 1rem)); + padding-left: calc(10% + 58px + (2 * 1rem)); + } + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + padding: 0; + } +} + +.entry .entry-content .wp-block-gallery { + list-style-type: none; + padding-right: 0; +} + +.entry .entry-content .wp-block-gallery .blocks-gallery-image:last-child, +.entry .entry-content .wp-block-gallery .blocks-gallery-item:last-child { + margin-bottom: 16px; +} + +.entry .entry-content .wp-block-gallery figcaption a { + color: #fff; +} + +.entry .entry-content .wp-block-audio figcaption, +.entry .entry-content .wp-block-video figcaption, +.entry .entry-content .wp-block-image figcaption, +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption, +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption { + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: center; +} + +.entry .entry-content .wp-block-separator, +.entry .entry-content hr { + background-color: #767676; + border: 0; + height: 2px; + margin-bottom: 2rem; + margin-top: 2rem; + max-width: 2.25em; + text-align: right; + /* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ +} + +.entry .entry-content .wp-block-separator.is-style-wide, +.entry .entry-content hr.is-style-wide { + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-separator.is-style-wide, + .entry .entry-content hr.is-style-wide { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-separator.is-style-wide, + .entry .entry-content hr.is-style-wide { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .entry-content .wp-block-separator.is-style-dots, +.entry .entry-content hr.is-style-dots { + max-width: 100%; + background-color: inherit; + border: inherit; + height: inherit; + text-align: center; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-separator.is-style-dots, + .entry .entry-content hr.is-style-dots { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-separator.is-style-dots, + .entry .entry-content hr.is-style-dots { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .entry-content .wp-block-separator.is-style-dots:not(.has-text-color):not(.has-background), +.entry .entry-content hr.is-style-dots:not(.has-text-color):not(.has-background) { + color: #767676; +} + +.entry .entry-content .wp-block-separator.is-style-dots:before, +.entry .entry-content hr.is-style-dots:before { + font-size: 1.6875em; + letter-spacing: 0.88889em; + padding-right: 0.88889em; +} + +.entry .entry-content .wp-block-separator + h1:before, +.entry .entry-content .wp-block-separator + h2:before, +.entry .entry-content hr + h1:before, +.entry .entry-content hr + h2:before { + display: none; +} + +.entry .entry-content .wp-block-embed-twitter { + word-break: break-word; +} + +.entry .entry-content .wp-block-table th, +.entry .entry-content .wp-block-table td { + border-color: #767676; +} + +.entry .entry-content .wp-block-file { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.entry .entry-content .wp-block-file .wp-block-file__button { + display: table; + transition: background 150ms ease-in-out; + border: none; + border-radius: 5px; + background: #0073aa; + font-size: 22px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.2; + text-decoration: none; + font-weight: bold; + padding: 0.75rem 1rem; + color: #fff; + margin-right: 0; + margin-top: calc(0.75 * 1rem); +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-file .wp-block-file__button { + font-size: 22px; + padding: 0.875rem 1.5rem; + } +} + +.entry .entry-content .wp-block-file .wp-block-file__button:hover { + background: #111; + cursor: pointer; +} + +.entry .entry-content .wp-block-file .wp-block-file__button:focus { + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +.entry .entry-content .wp-block-code { + border-radius: 0; +} + +.entry .entry-content .wp-block-code code { + font-size: 1.125em; + white-space: pre-wrap; + word-break: break-word; +} + +.entry .entry-content .wp-block-columns .wp-block-column > *:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-columns .wp-block-column > *:last-child { + margin-bottom: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-columns .wp-block-image > img:not(.alignwide):not(.alignfull), + .entry .entry-content .wp-block-columns .wp-block-image > figure { + max-width: 100%; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-columns .wp-block-image > img:not(.alignwide):not(.alignfull), + .entry .entry-content .wp-block-columns .wp-block-image > figure { + max-width: 100%; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-columns { + flex-wrap: nowrap; + } + .entry .entry-content .wp-block-columns .wp-block-column:not(:first-child) { + margin-right: 32px; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group:not(.alignfull) > .wp-block-group__inner-container > .alignfull, + .entry .entry-content .wp-block-group:not(.alignfull) > .wp-block-group__inner-container > .wp-block-image > img { + right: 0; + max-width: 100%; + } +} + +.entry .entry-content .wp-block-group.alignfull > .wp-block-group__inner-container { + max-width: calc(100% - (2 * 1rem)); + margin: 0 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.alignfull > .wp-block-group__inner-container { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } +} + +.entry .entry-content .wp-block-group.has-background { + padding: 1rem; + margin-top: 0; + margin-bottom: 0; +} + +.entry .entry-content .wp-block-group.has-background .wp-block-group__inner-container > *:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-group.has-background .wp-block-group__inner-container > *:last-child { + margin-bottom: 0; +} + +.entry .entry-content .wp-block-group.has-background.alignfull { + padding-right: 0; + padding-left: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.has-background.alignfull { + padding-top: 1rem; + padding-bottom: 1rem; + } +} + +.entry .entry-content .wp-block-group.has-background:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: 100%; + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.has-background:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: calc( 100% + 2rem); + max-width: calc( 100% + 2rem); + margin-right: -1rem; + } +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta .wp-block-latest-comments__comment-date { + font-weight: normal; +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment, +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-date, +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; +} + +.entry .entry-content .wp-block-latest-comments.has-dates .wp-block-latest-comments__comment-date { + font-size: 0.71111em; +} + +.entry .entry-content .has-small-font-size { + font-size: 0.88889em; +} + +.entry .entry-content .has-normal-font-size { + font-size: 1.125em; +} + +.entry .entry-content .has-large-font-size { + font-size: 1.6875em; +} + +.entry .entry-content .has-huge-font-size { + font-size: 2.25em; +} + +.entry .entry-content .has-primary-background-color, +.entry .entry-content .has-secondary-background-color, +.entry .entry-content .has-dark-gray-background-color, +.entry .entry-content .has-light-gray-background-color { + color: #fff; +} + +.entry .entry-content .has-primary-background-color > p, +.entry .entry-content .has-primary-background-color > h1, +.entry .entry-content .has-primary-background-color > h2, +.entry .entry-content .has-primary-background-color > h3, +.entry .entry-content .has-primary-background-color > h4, +.entry .entry-content .has-primary-background-color > h5, +.entry .entry-content .has-primary-background-color > h6, +.entry .entry-content .has-primary-background-color > a, +.entry .entry-content .has-secondary-background-color > p, +.entry .entry-content .has-secondary-background-color > h1, +.entry .entry-content .has-secondary-background-color > h2, +.entry .entry-content .has-secondary-background-color > h3, +.entry .entry-content .has-secondary-background-color > h4, +.entry .entry-content .has-secondary-background-color > h5, +.entry .entry-content .has-secondary-background-color > h6, +.entry .entry-content .has-secondary-background-color > a, +.entry .entry-content .has-dark-gray-background-color > p, +.entry .entry-content .has-dark-gray-background-color > h1, +.entry .entry-content .has-dark-gray-background-color > h2, +.entry .entry-content .has-dark-gray-background-color > h3, +.entry .entry-content .has-dark-gray-background-color > h4, +.entry .entry-content .has-dark-gray-background-color > h5, +.entry .entry-content .has-dark-gray-background-color > h6, +.entry .entry-content .has-dark-gray-background-color > a, +.entry .entry-content .has-light-gray-background-color > p, +.entry .entry-content .has-light-gray-background-color > h1, +.entry .entry-content .has-light-gray-background-color > h2, +.entry .entry-content .has-light-gray-background-color > h3, +.entry .entry-content .has-light-gray-background-color > h4, +.entry .entry-content .has-light-gray-background-color > h5, +.entry .entry-content .has-light-gray-background-color > h6, +.entry .entry-content .has-light-gray-background-color > a { + color: #fff; +} + +.entry .entry-content .has-white-background-color { + color: #111; +} + +.entry .entry-content .has-white-background-color > p, +.entry .entry-content .has-white-background-color > h1, +.entry .entry-content .has-white-background-color > h2, +.entry .entry-content .has-white-background-color > h3, +.entry .entry-content .has-white-background-color > h4, +.entry .entry-content .has-white-background-color > h5, +.entry .entry-content .has-white-background-color > h6, +.entry .entry-content .has-white-background-color > a { + color: #111; +} + +.entry .entry-content .has-primary-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-primary-background-color { + background-color: #0073aa; +} + +.entry .entry-content .has-secondary-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-secondary-background-color { + background-color: #005177; +} + +.entry .entry-content .has-dark-gray-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-dark-gray-background-color { + background-color: #111; +} + +.entry .entry-content .has-light-gray-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-light-gray-background-color { + background-color: #767676; +} + +.entry .entry-content .has-white-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-white-background-color { + background-color: #FFF; +} + +.entry .entry-content .has-primary-color, +.entry .entry-content .wp-block-pullquote blockquote.has-primary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color > p { + color: #0073aa; +} + +.entry .entry-content .has-secondary-color, +.entry .entry-content .wp-block-pullquote blockquote.has-secondary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color > p { + color: #005177; +} + +.entry .entry-content .has-dark-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color > p { + color: #111; +} + +.entry .entry-content .has-light-gray-color, +.entry .entry-content .wp-block-pullquote blockquote.has-light-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color > p { + color: #767676; +} + +.entry .entry-content .has-white-color, +.entry .entry-content .wp-block-pullquote blockquote.has-white-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: #FFF; +} + +/* Media */ +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +embed, +iframe, +object { + max-width: 100%; +} + +.custom-logo-link { + display: inline-block; +} + +.avatar { + border-radius: 100%; + display: block; + height: calc(2.25 * 1rem); + min-height: inherit; + width: calc(2.25 * 1rem); +} + +svg { + transition: fill 120ms ease-in-out; + fill: currentColor; +} + +/*-------------------------------------------------------------- +## Captions +--------------------------------------------------------------*/ +.wp-caption { + margin-bottom: calc(1.5 * 1rem); +} + +@media only screen and (min-width: 768px) { + .wp-caption.aligncenter { + position: relative; + right: calc( calc(8 * (100vw / 12) - 28px) / 2); + transform: translateX(50%); + } +} + +@media only screen and (min-width: 1168px) { + .wp-caption.aligncenter { + right: calc( calc(6 * (100vw / 12) - 28px) / 2); + } +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-right: auto; + margin-left: auto; +} + +.wp-caption-text { + color: #767676; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: center; +} + +/*-------------------------------------------------------------- +## Galleries +--------------------------------------------------------------*/ +.gallery { + display: flex; + flex-flow: row wrap; + justify-content: center; + margin-bottom: calc(1.5 * 1rem); +} + +.gallery-item { + display: inline-block; + margin-left: 16px; + margin-bottom: 16px; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-columns-2 .gallery-item { + max-width: calc((100% - 16px * 1) / 2); +} + +.gallery-columns-2 .gallery-item:nth-of-type(2n+2) { + margin-left: 0; +} + +.gallery-columns-3 .gallery-item { + max-width: calc((100% - 16px * 2) / 3); +} + +.gallery-columns-3 .gallery-item:nth-of-type(3n+3) { + margin-left: 0; +} + +.gallery-columns-4 .gallery-item { + max-width: calc((100% - 16px * 3) / 4); +} + +.gallery-columns-4 .gallery-item:nth-of-type(4n+4) { + margin-left: 0; +} + +.gallery-columns-5 .gallery-item { + max-width: calc((100% - 16px * 4) / 5); +} + +.gallery-columns-5 .gallery-item:nth-of-type(5n+5) { + margin-left: 0; +} + +.gallery-columns-6 .gallery-item { + max-width: calc((100% - 16px * 5) / 6); +} + +.gallery-columns-6 .gallery-item:nth-of-type(6n+6) { + margin-left: 0; +} + +.gallery-columns-7 .gallery-item { + max-width: calc((100% - 16px * 6) / 7); +} + +.gallery-columns-7 .gallery-item:nth-of-type(7n+7) { + margin-left: 0; +} + +.gallery-columns-8 .gallery-item { + max-width: calc((100% - 16px * 7) / 8); +} + +.gallery-columns-8 .gallery-item:nth-of-type(8n+8) { + margin-left: 0; +} + +.gallery-columns-9 .gallery-item { + max-width: calc((100% - 16px * 8) / 9); +} + +.gallery-columns-9 .gallery-item:nth-of-type(9n+9) { + margin-left: 0; +} + +.gallery-item:last-of-type { + padding-left: 0; +} + +.gallery-caption { + display: block; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; +} + +.gallery-item > div > a { + display: block; + line-height: 0; + box-shadow: 0 0 0 0 transparent; +} + +.gallery-item > div > a:focus { + box-shadow: 0 0 0 2px #0073aa; +} diff --git a/content/themes/twentynineteen/style.css b/content/themes/twentynineteen/style.css new file mode 100644 index 0000000..3fcb9df --- /dev/null +++ b/content/themes/twentynineteen/style.css @@ -0,0 +1,6567 @@ +@charset "UTF-8"; +/* +Theme Name: Twenty Nineteen +Theme URI: https://wordpress.org/themes/twentynineteen/ +Author: the WordPress team +Author URI: https://wordpress.org/ +Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes. +Requires at least: 4.9.6 +Requires PHP: 5.2.4 +Version: 1.5 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Text Domain: twentynineteen +Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned with others. + +Twenty Nineteen is based on Underscores https://underscores.me/, (C) 2012-2019 Automattic, Inc. +Underscores is distributed under the terms of the GNU GPL v2 or later. + +Normalizing styles have been helped along thanks to the fine work of +Nicolas Gallagher and Jonathan Neal https://necolas.github.io/normalize.css/ +*/ +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Variables +# Normalize +# Typography + ## Headings + ## Copy +# Elements + ## Lists + ## Tables +# Forms + ## Buttons + ## Fields +# Navigation + ## Links + ## Menus + ## Next & Previous +# Accessibility +# Alignments +# Clearings +# Layout +# Widgets +# Content + ## Archives + ## Posts and pages + ## Comments +# Blocks +# Media + ## Captions + ## Galleries +--------------------------------------------------------------*/ +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the Classic and block + * editors. The following font-face override fixes the issue by manually inserting + * a custom font that includes just a Hoefler Text space replacement for that + * character instead. + */ +@font-face { + font-family: 'NonBreakingSpaceOverride'; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* If we add the border using a regular CSS border, it won't look good on non-retina devices, + * since its edges can look jagged due to lack of antialiasing. In this case, we are several + * layers of box-shadow to add the border visually, which will render the border smoother. */ +/* Calculates maximum width for post content */ +/* Nested sub-menu padding: 10 levels deep */ +/* Ensure all font family declarations come with non-latin fallbacks */ +/* Build our non-latin font styles */ +body:lang(ar), button:lang(ar), +input:lang(ar), +select:lang(ar), +optgroup:lang(ar), +textarea:lang(ar), .author-description .author-link:lang(ar), +.comment-metadata:lang(ar), +.comment-reply-link:lang(ar), +.comments-title:lang(ar), +.comment-author .fn:lang(ar), +.discussion-meta-info:lang(ar), +.entry-meta:lang(ar), +.entry-footer:lang(ar), +.main-navigation:lang(ar), +.no-comments:lang(ar), +.not-found .page-title:lang(ar), +.error-404 .page-title:lang(ar), +.post-navigation .post-title:lang(ar), +.page-links:lang(ar), +.page-description:lang(ar), +.pagination .nav-links:lang(ar), +.sticky-post:lang(ar), +.site-title:lang(ar), +.site-info:lang(ar), +#cancel-comment-reply-link:lang(ar), +h1:lang(ar), +h2:lang(ar), +h3:lang(ar), +h4:lang(ar), +h5:lang(ar), +h6:lang(ar), .page-title:lang(ar), blockquote cite:lang(ar), table:lang(ar), .button:lang(ar), +input:lang(ar)[type="button"], +input:lang(ar)[type="reset"], +input:lang(ar)[type="submit"], .comment-navigation .nav-previous:lang(ar), +.comment-navigation .nav-next:lang(ar), .comment-list .pingback .comment-body:lang(ar), +.comment-list .trackback .comment-body:lang(ar), .comment-list .pingback .comment-body .comment-edit-link:lang(ar), +.comment-list .trackback .comment-body .comment-edit-link:lang(ar), .comment-form .comment-notes:lang(ar), +.comment-form label:lang(ar), .widget_archive ul li:lang(ar), +.widget_categories ul li:lang(ar), +.widget_meta ul li:lang(ar), +.widget_nav_menu ul li:lang(ar), +.widget_pages ul li:lang(ar), +.widget_recent_comments ul li:lang(ar), +.widget_recent_entries ul li:lang(ar), +.widget_rss ul li:lang(ar), .widget_tag_cloud .tagcloud:lang(ar), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ar), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ar), .entry .entry-content .wp-block-archives li > a:lang(ar), +.entry .entry-content .wp-block-categories li > a:lang(ar), +.entry .entry-content .wp-block-latest-posts li > a:lang(ar), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ar), .entry .entry-content .wp-block-verse:lang(ar), .entry .entry-content .has-drop-cap:lang(ar):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ar), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ar), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ar), +.entry .entry-content .wp-block-cover-image h2:lang(ar), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ar), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ar), +.entry .entry-content .wp-block-cover h2:lang(ar), .entry .entry-content .wp-block-audio figcaption:lang(ar), +.entry .entry-content .wp-block-video figcaption:lang(ar), +.entry .entry-content .wp-block-image figcaption:lang(ar), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ar), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ar), .entry .entry-content .wp-block-file:lang(ar), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ar), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ar), .wp-caption-text:lang(ar), .gallery-caption:lang(ar) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ary), button:lang(ary), +input:lang(ary), +select:lang(ary), +optgroup:lang(ary), +textarea:lang(ary), .author-description .author-link:lang(ary), +.comment-metadata:lang(ary), +.comment-reply-link:lang(ary), +.comments-title:lang(ary), +.comment-author .fn:lang(ary), +.discussion-meta-info:lang(ary), +.entry-meta:lang(ary), +.entry-footer:lang(ary), +.main-navigation:lang(ary), +.no-comments:lang(ary), +.not-found .page-title:lang(ary), +.error-404 .page-title:lang(ary), +.post-navigation .post-title:lang(ary), +.page-links:lang(ary), +.page-description:lang(ary), +.pagination .nav-links:lang(ary), +.sticky-post:lang(ary), +.site-title:lang(ary), +.site-info:lang(ary), +#cancel-comment-reply-link:lang(ary), +h1:lang(ary), +h2:lang(ary), +h3:lang(ary), +h4:lang(ary), +h5:lang(ary), +h6:lang(ary), .page-title:lang(ary), blockquote cite:lang(ary), table:lang(ary), .button:lang(ary), +input:lang(ary)[type="button"], +input:lang(ary)[type="reset"], +input:lang(ary)[type="submit"], .comment-navigation .nav-previous:lang(ary), +.comment-navigation .nav-next:lang(ary), .comment-list .pingback .comment-body:lang(ary), +.comment-list .trackback .comment-body:lang(ary), .comment-list .pingback .comment-body .comment-edit-link:lang(ary), +.comment-list .trackback .comment-body .comment-edit-link:lang(ary), .comment-form .comment-notes:lang(ary), +.comment-form label:lang(ary), .widget_archive ul li:lang(ary), +.widget_categories ul li:lang(ary), +.widget_meta ul li:lang(ary), +.widget_nav_menu ul li:lang(ary), +.widget_pages ul li:lang(ary), +.widget_recent_comments ul li:lang(ary), +.widget_recent_entries ul li:lang(ary), +.widget_rss ul li:lang(ary), .widget_tag_cloud .tagcloud:lang(ary), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ary), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ary), .entry .entry-content .wp-block-archives li > a:lang(ary), +.entry .entry-content .wp-block-categories li > a:lang(ary), +.entry .entry-content .wp-block-latest-posts li > a:lang(ary), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ary), .entry .entry-content .wp-block-verse:lang(ary), .entry .entry-content .has-drop-cap:lang(ary):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ary), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ary), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ary), +.entry .entry-content .wp-block-cover-image h2:lang(ary), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ary), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ary), +.entry .entry-content .wp-block-cover h2:lang(ary), .entry .entry-content .wp-block-audio figcaption:lang(ary), +.entry .entry-content .wp-block-video figcaption:lang(ary), +.entry .entry-content .wp-block-image figcaption:lang(ary), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ary), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ary), .entry .entry-content .wp-block-file:lang(ary), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ary), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ary), .wp-caption-text:lang(ary), .gallery-caption:lang(ary) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(azb), button:lang(azb), +input:lang(azb), +select:lang(azb), +optgroup:lang(azb), +textarea:lang(azb), .author-description .author-link:lang(azb), +.comment-metadata:lang(azb), +.comment-reply-link:lang(azb), +.comments-title:lang(azb), +.comment-author .fn:lang(azb), +.discussion-meta-info:lang(azb), +.entry-meta:lang(azb), +.entry-footer:lang(azb), +.main-navigation:lang(azb), +.no-comments:lang(azb), +.not-found .page-title:lang(azb), +.error-404 .page-title:lang(azb), +.post-navigation .post-title:lang(azb), +.page-links:lang(azb), +.page-description:lang(azb), +.pagination .nav-links:lang(azb), +.sticky-post:lang(azb), +.site-title:lang(azb), +.site-info:lang(azb), +#cancel-comment-reply-link:lang(azb), +h1:lang(azb), +h2:lang(azb), +h3:lang(azb), +h4:lang(azb), +h5:lang(azb), +h6:lang(azb), .page-title:lang(azb), blockquote cite:lang(azb), table:lang(azb), .button:lang(azb), +input:lang(azb)[type="button"], +input:lang(azb)[type="reset"], +input:lang(azb)[type="submit"], .comment-navigation .nav-previous:lang(azb), +.comment-navigation .nav-next:lang(azb), .comment-list .pingback .comment-body:lang(azb), +.comment-list .trackback .comment-body:lang(azb), .comment-list .pingback .comment-body .comment-edit-link:lang(azb), +.comment-list .trackback .comment-body .comment-edit-link:lang(azb), .comment-form .comment-notes:lang(azb), +.comment-form label:lang(azb), .widget_archive ul li:lang(azb), +.widget_categories ul li:lang(azb), +.widget_meta ul li:lang(azb), +.widget_nav_menu ul li:lang(azb), +.widget_pages ul li:lang(azb), +.widget_recent_comments ul li:lang(azb), +.widget_recent_entries ul li:lang(azb), +.widget_rss ul li:lang(azb), .widget_tag_cloud .tagcloud:lang(azb), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(azb), .entry .entry-content .wp-block-button .wp-block-button__link:lang(azb), .entry .entry-content .wp-block-archives li > a:lang(azb), +.entry .entry-content .wp-block-categories li > a:lang(azb), +.entry .entry-content .wp-block-latest-posts li > a:lang(azb), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(azb), .entry .entry-content .wp-block-verse:lang(azb), .entry .entry-content .has-drop-cap:lang(azb):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(azb), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(azb), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(azb), +.entry .entry-content .wp-block-cover-image h2:lang(azb), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(azb), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(azb), +.entry .entry-content .wp-block-cover h2:lang(azb), .entry .entry-content .wp-block-audio figcaption:lang(azb), +.entry .entry-content .wp-block-video figcaption:lang(azb), +.entry .entry-content .wp-block-image figcaption:lang(azb), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(azb), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(azb), .entry .entry-content .wp-block-file:lang(azb), .entry .entry-content .wp-block-file .wp-block-file__button:lang(azb), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(azb), .wp-caption-text:lang(azb), .gallery-caption:lang(azb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ckb), button:lang(ckb), +input:lang(ckb), +select:lang(ckb), +optgroup:lang(ckb), +textarea:lang(ckb), .author-description .author-link:lang(ckb), +.comment-metadata:lang(ckb), +.comment-reply-link:lang(ckb), +.comments-title:lang(ckb), +.comment-author .fn:lang(ckb), +.discussion-meta-info:lang(ckb), +.entry-meta:lang(ckb), +.entry-footer:lang(ckb), +.main-navigation:lang(ckb), +.no-comments:lang(ckb), +.not-found .page-title:lang(ckb), +.error-404 .page-title:lang(ckb), +.post-navigation .post-title:lang(ckb), +.page-links:lang(ckb), +.page-description:lang(ckb), +.pagination .nav-links:lang(ckb), +.sticky-post:lang(ckb), +.site-title:lang(ckb), +.site-info:lang(ckb), +#cancel-comment-reply-link:lang(ckb), +h1:lang(ckb), +h2:lang(ckb), +h3:lang(ckb), +h4:lang(ckb), +h5:lang(ckb), +h6:lang(ckb), .page-title:lang(ckb), blockquote cite:lang(ckb), table:lang(ckb), .button:lang(ckb), +input:lang(ckb)[type="button"], +input:lang(ckb)[type="reset"], +input:lang(ckb)[type="submit"], .comment-navigation .nav-previous:lang(ckb), +.comment-navigation .nav-next:lang(ckb), .comment-list .pingback .comment-body:lang(ckb), +.comment-list .trackback .comment-body:lang(ckb), .comment-list .pingback .comment-body .comment-edit-link:lang(ckb), +.comment-list .trackback .comment-body .comment-edit-link:lang(ckb), .comment-form .comment-notes:lang(ckb), +.comment-form label:lang(ckb), .widget_archive ul li:lang(ckb), +.widget_categories ul li:lang(ckb), +.widget_meta ul li:lang(ckb), +.widget_nav_menu ul li:lang(ckb), +.widget_pages ul li:lang(ckb), +.widget_recent_comments ul li:lang(ckb), +.widget_recent_entries ul li:lang(ckb), +.widget_rss ul li:lang(ckb), .widget_tag_cloud .tagcloud:lang(ckb), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ckb), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ckb), .entry .entry-content .wp-block-archives li > a:lang(ckb), +.entry .entry-content .wp-block-categories li > a:lang(ckb), +.entry .entry-content .wp-block-latest-posts li > a:lang(ckb), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ckb), .entry .entry-content .wp-block-verse:lang(ckb), .entry .entry-content .has-drop-cap:lang(ckb):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ckb), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ckb), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ckb), +.entry .entry-content .wp-block-cover-image h2:lang(ckb), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ckb), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ckb), +.entry .entry-content .wp-block-cover h2:lang(ckb), .entry .entry-content .wp-block-audio figcaption:lang(ckb), +.entry .entry-content .wp-block-video figcaption:lang(ckb), +.entry .entry-content .wp-block-image figcaption:lang(ckb), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ckb), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ckb), .entry .entry-content .wp-block-file:lang(ckb), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ckb), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ckb), .wp-caption-text:lang(ckb), .gallery-caption:lang(ckb) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(fa-IR), button:lang(fa-IR), +input:lang(fa-IR), +select:lang(fa-IR), +optgroup:lang(fa-IR), +textarea:lang(fa-IR), .author-description .author-link:lang(fa-IR), +.comment-metadata:lang(fa-IR), +.comment-reply-link:lang(fa-IR), +.comments-title:lang(fa-IR), +.comment-author .fn:lang(fa-IR), +.discussion-meta-info:lang(fa-IR), +.entry-meta:lang(fa-IR), +.entry-footer:lang(fa-IR), +.main-navigation:lang(fa-IR), +.no-comments:lang(fa-IR), +.not-found .page-title:lang(fa-IR), +.error-404 .page-title:lang(fa-IR), +.post-navigation .post-title:lang(fa-IR), +.page-links:lang(fa-IR), +.page-description:lang(fa-IR), +.pagination .nav-links:lang(fa-IR), +.sticky-post:lang(fa-IR), +.site-title:lang(fa-IR), +.site-info:lang(fa-IR), +#cancel-comment-reply-link:lang(fa-IR), +h1:lang(fa-IR), +h2:lang(fa-IR), +h3:lang(fa-IR), +h4:lang(fa-IR), +h5:lang(fa-IR), +h6:lang(fa-IR), .page-title:lang(fa-IR), blockquote cite:lang(fa-IR), table:lang(fa-IR), .button:lang(fa-IR), +input:lang(fa-IR)[type="button"], +input:lang(fa-IR)[type="reset"], +input:lang(fa-IR)[type="submit"], .comment-navigation .nav-previous:lang(fa-IR), +.comment-navigation .nav-next:lang(fa-IR), .comment-list .pingback .comment-body:lang(fa-IR), +.comment-list .trackback .comment-body:lang(fa-IR), .comment-list .pingback .comment-body .comment-edit-link:lang(fa-IR), +.comment-list .trackback .comment-body .comment-edit-link:lang(fa-IR), .comment-form .comment-notes:lang(fa-IR), +.comment-form label:lang(fa-IR), .widget_archive ul li:lang(fa-IR), +.widget_categories ul li:lang(fa-IR), +.widget_meta ul li:lang(fa-IR), +.widget_nav_menu ul li:lang(fa-IR), +.widget_pages ul li:lang(fa-IR), +.widget_recent_comments ul li:lang(fa-IR), +.widget_recent_entries ul li:lang(fa-IR), +.widget_rss ul li:lang(fa-IR), .widget_tag_cloud .tagcloud:lang(fa-IR), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(fa-IR), .entry .entry-content .wp-block-button .wp-block-button__link:lang(fa-IR), .entry .entry-content .wp-block-archives li > a:lang(fa-IR), +.entry .entry-content .wp-block-categories li > a:lang(fa-IR), +.entry .entry-content .wp-block-latest-posts li > a:lang(fa-IR), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(fa-IR), .entry .entry-content .wp-block-verse:lang(fa-IR), .entry .entry-content .has-drop-cap:lang(fa-IR):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(fa-IR), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(fa-IR), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(fa-IR), +.entry .entry-content .wp-block-cover-image h2:lang(fa-IR), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(fa-IR), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(fa-IR), +.entry .entry-content .wp-block-cover h2:lang(fa-IR), .entry .entry-content .wp-block-audio figcaption:lang(fa-IR), +.entry .entry-content .wp-block-video figcaption:lang(fa-IR), +.entry .entry-content .wp-block-image figcaption:lang(fa-IR), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(fa-IR), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(fa-IR), .entry .entry-content .wp-block-file:lang(fa-IR), .entry .entry-content .wp-block-file .wp-block-file__button:lang(fa-IR), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(fa-IR), .wp-caption-text:lang(fa-IR), .gallery-caption:lang(fa-IR) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(haz), button:lang(haz), +input:lang(haz), +select:lang(haz), +optgroup:lang(haz), +textarea:lang(haz), .author-description .author-link:lang(haz), +.comment-metadata:lang(haz), +.comment-reply-link:lang(haz), +.comments-title:lang(haz), +.comment-author .fn:lang(haz), +.discussion-meta-info:lang(haz), +.entry-meta:lang(haz), +.entry-footer:lang(haz), +.main-navigation:lang(haz), +.no-comments:lang(haz), +.not-found .page-title:lang(haz), +.error-404 .page-title:lang(haz), +.post-navigation .post-title:lang(haz), +.page-links:lang(haz), +.page-description:lang(haz), +.pagination .nav-links:lang(haz), +.sticky-post:lang(haz), +.site-title:lang(haz), +.site-info:lang(haz), +#cancel-comment-reply-link:lang(haz), +h1:lang(haz), +h2:lang(haz), +h3:lang(haz), +h4:lang(haz), +h5:lang(haz), +h6:lang(haz), .page-title:lang(haz), blockquote cite:lang(haz), table:lang(haz), .button:lang(haz), +input:lang(haz)[type="button"], +input:lang(haz)[type="reset"], +input:lang(haz)[type="submit"], .comment-navigation .nav-previous:lang(haz), +.comment-navigation .nav-next:lang(haz), .comment-list .pingback .comment-body:lang(haz), +.comment-list .trackback .comment-body:lang(haz), .comment-list .pingback .comment-body .comment-edit-link:lang(haz), +.comment-list .trackback .comment-body .comment-edit-link:lang(haz), .comment-form .comment-notes:lang(haz), +.comment-form label:lang(haz), .widget_archive ul li:lang(haz), +.widget_categories ul li:lang(haz), +.widget_meta ul li:lang(haz), +.widget_nav_menu ul li:lang(haz), +.widget_pages ul li:lang(haz), +.widget_recent_comments ul li:lang(haz), +.widget_recent_entries ul li:lang(haz), +.widget_rss ul li:lang(haz), .widget_tag_cloud .tagcloud:lang(haz), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(haz), .entry .entry-content .wp-block-button .wp-block-button__link:lang(haz), .entry .entry-content .wp-block-archives li > a:lang(haz), +.entry .entry-content .wp-block-categories li > a:lang(haz), +.entry .entry-content .wp-block-latest-posts li > a:lang(haz), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(haz), .entry .entry-content .wp-block-verse:lang(haz), .entry .entry-content .has-drop-cap:lang(haz):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(haz), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(haz), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(haz), +.entry .entry-content .wp-block-cover-image h2:lang(haz), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(haz), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(haz), +.entry .entry-content .wp-block-cover h2:lang(haz), .entry .entry-content .wp-block-audio figcaption:lang(haz), +.entry .entry-content .wp-block-video figcaption:lang(haz), +.entry .entry-content .wp-block-image figcaption:lang(haz), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(haz), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(haz), .entry .entry-content .wp-block-file:lang(haz), .entry .entry-content .wp-block-file .wp-block-file__button:lang(haz), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(haz), .wp-caption-text:lang(haz), .gallery-caption:lang(haz) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(ps), button:lang(ps), +input:lang(ps), +select:lang(ps), +optgroup:lang(ps), +textarea:lang(ps), .author-description .author-link:lang(ps), +.comment-metadata:lang(ps), +.comment-reply-link:lang(ps), +.comments-title:lang(ps), +.comment-author .fn:lang(ps), +.discussion-meta-info:lang(ps), +.entry-meta:lang(ps), +.entry-footer:lang(ps), +.main-navigation:lang(ps), +.no-comments:lang(ps), +.not-found .page-title:lang(ps), +.error-404 .page-title:lang(ps), +.post-navigation .post-title:lang(ps), +.page-links:lang(ps), +.page-description:lang(ps), +.pagination .nav-links:lang(ps), +.sticky-post:lang(ps), +.site-title:lang(ps), +.site-info:lang(ps), +#cancel-comment-reply-link:lang(ps), +h1:lang(ps), +h2:lang(ps), +h3:lang(ps), +h4:lang(ps), +h5:lang(ps), +h6:lang(ps), .page-title:lang(ps), blockquote cite:lang(ps), table:lang(ps), .button:lang(ps), +input:lang(ps)[type="button"], +input:lang(ps)[type="reset"], +input:lang(ps)[type="submit"], .comment-navigation .nav-previous:lang(ps), +.comment-navigation .nav-next:lang(ps), .comment-list .pingback .comment-body:lang(ps), +.comment-list .trackback .comment-body:lang(ps), .comment-list .pingback .comment-body .comment-edit-link:lang(ps), +.comment-list .trackback .comment-body .comment-edit-link:lang(ps), .comment-form .comment-notes:lang(ps), +.comment-form label:lang(ps), .widget_archive ul li:lang(ps), +.widget_categories ul li:lang(ps), +.widget_meta ul li:lang(ps), +.widget_nav_menu ul li:lang(ps), +.widget_pages ul li:lang(ps), +.widget_recent_comments ul li:lang(ps), +.widget_recent_entries ul li:lang(ps), +.widget_rss ul li:lang(ps), .widget_tag_cloud .tagcloud:lang(ps), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ps), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ps), .entry .entry-content .wp-block-archives li > a:lang(ps), +.entry .entry-content .wp-block-categories li > a:lang(ps), +.entry .entry-content .wp-block-latest-posts li > a:lang(ps), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ps), .entry .entry-content .wp-block-verse:lang(ps), .entry .entry-content .has-drop-cap:lang(ps):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ps), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ps), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ps), +.entry .entry-content .wp-block-cover-image h2:lang(ps), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ps), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ps), +.entry .entry-content .wp-block-cover h2:lang(ps), .entry .entry-content .wp-block-audio figcaption:lang(ps), +.entry .entry-content .wp-block-video figcaption:lang(ps), +.entry .entry-content .wp-block-image figcaption:lang(ps), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ps), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ps), .entry .entry-content .wp-block-file:lang(ps), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ps), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ps), .wp-caption-text:lang(ps), .gallery-caption:lang(ps) { + font-family: Tahoma, Arial, sans-serif; +} + +body:lang(be), button:lang(be), +input:lang(be), +select:lang(be), +optgroup:lang(be), +textarea:lang(be), .author-description .author-link:lang(be), +.comment-metadata:lang(be), +.comment-reply-link:lang(be), +.comments-title:lang(be), +.comment-author .fn:lang(be), +.discussion-meta-info:lang(be), +.entry-meta:lang(be), +.entry-footer:lang(be), +.main-navigation:lang(be), +.no-comments:lang(be), +.not-found .page-title:lang(be), +.error-404 .page-title:lang(be), +.post-navigation .post-title:lang(be), +.page-links:lang(be), +.page-description:lang(be), +.pagination .nav-links:lang(be), +.sticky-post:lang(be), +.site-title:lang(be), +.site-info:lang(be), +#cancel-comment-reply-link:lang(be), +h1:lang(be), +h2:lang(be), +h3:lang(be), +h4:lang(be), +h5:lang(be), +h6:lang(be), .page-title:lang(be), blockquote cite:lang(be), table:lang(be), .button:lang(be), +input:lang(be)[type="button"], +input:lang(be)[type="reset"], +input:lang(be)[type="submit"], .comment-navigation .nav-previous:lang(be), +.comment-navigation .nav-next:lang(be), .comment-list .pingback .comment-body:lang(be), +.comment-list .trackback .comment-body:lang(be), .comment-list .pingback .comment-body .comment-edit-link:lang(be), +.comment-list .trackback .comment-body .comment-edit-link:lang(be), .comment-form .comment-notes:lang(be), +.comment-form label:lang(be), .widget_archive ul li:lang(be), +.widget_categories ul li:lang(be), +.widget_meta ul li:lang(be), +.widget_nav_menu ul li:lang(be), +.widget_pages ul li:lang(be), +.widget_recent_comments ul li:lang(be), +.widget_recent_entries ul li:lang(be), +.widget_rss ul li:lang(be), .widget_tag_cloud .tagcloud:lang(be), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(be), .entry .entry-content .wp-block-button .wp-block-button__link:lang(be), .entry .entry-content .wp-block-archives li > a:lang(be), +.entry .entry-content .wp-block-categories li > a:lang(be), +.entry .entry-content .wp-block-latest-posts li > a:lang(be), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(be), .entry .entry-content .wp-block-verse:lang(be), .entry .entry-content .has-drop-cap:lang(be):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(be), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(be), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(be), +.entry .entry-content .wp-block-cover-image h2:lang(be), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(be), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(be), +.entry .entry-content .wp-block-cover h2:lang(be), .entry .entry-content .wp-block-audio figcaption:lang(be), +.entry .entry-content .wp-block-video figcaption:lang(be), +.entry .entry-content .wp-block-image figcaption:lang(be), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(be), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(be), .entry .entry-content .wp-block-file:lang(be), .entry .entry-content .wp-block-file .wp-block-file__button:lang(be), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(be), .wp-caption-text:lang(be), .gallery-caption:lang(be) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(bg-BG), button:lang(bg-BG), +input:lang(bg-BG), +select:lang(bg-BG), +optgroup:lang(bg-BG), +textarea:lang(bg-BG), .author-description .author-link:lang(bg-BG), +.comment-metadata:lang(bg-BG), +.comment-reply-link:lang(bg-BG), +.comments-title:lang(bg-BG), +.comment-author .fn:lang(bg-BG), +.discussion-meta-info:lang(bg-BG), +.entry-meta:lang(bg-BG), +.entry-footer:lang(bg-BG), +.main-navigation:lang(bg-BG), +.no-comments:lang(bg-BG), +.not-found .page-title:lang(bg-BG), +.error-404 .page-title:lang(bg-BG), +.post-navigation .post-title:lang(bg-BG), +.page-links:lang(bg-BG), +.page-description:lang(bg-BG), +.pagination .nav-links:lang(bg-BG), +.sticky-post:lang(bg-BG), +.site-title:lang(bg-BG), +.site-info:lang(bg-BG), +#cancel-comment-reply-link:lang(bg-BG), +h1:lang(bg-BG), +h2:lang(bg-BG), +h3:lang(bg-BG), +h4:lang(bg-BG), +h5:lang(bg-BG), +h6:lang(bg-BG), .page-title:lang(bg-BG), blockquote cite:lang(bg-BG), table:lang(bg-BG), .button:lang(bg-BG), +input:lang(bg-BG)[type="button"], +input:lang(bg-BG)[type="reset"], +input:lang(bg-BG)[type="submit"], .comment-navigation .nav-previous:lang(bg-BG), +.comment-navigation .nav-next:lang(bg-BG), .comment-list .pingback .comment-body:lang(bg-BG), +.comment-list .trackback .comment-body:lang(bg-BG), .comment-list .pingback .comment-body .comment-edit-link:lang(bg-BG), +.comment-list .trackback .comment-body .comment-edit-link:lang(bg-BG), .comment-form .comment-notes:lang(bg-BG), +.comment-form label:lang(bg-BG), .widget_archive ul li:lang(bg-BG), +.widget_categories ul li:lang(bg-BG), +.widget_meta ul li:lang(bg-BG), +.widget_nav_menu ul li:lang(bg-BG), +.widget_pages ul li:lang(bg-BG), +.widget_recent_comments ul li:lang(bg-BG), +.widget_recent_entries ul li:lang(bg-BG), +.widget_rss ul li:lang(bg-BG), .widget_tag_cloud .tagcloud:lang(bg-BG), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(bg-BG), .entry .entry-content .wp-block-button .wp-block-button__link:lang(bg-BG), .entry .entry-content .wp-block-archives li > a:lang(bg-BG), +.entry .entry-content .wp-block-categories li > a:lang(bg-BG), +.entry .entry-content .wp-block-latest-posts li > a:lang(bg-BG), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bg-BG), .entry .entry-content .wp-block-verse:lang(bg-BG), .entry .entry-content .has-drop-cap:lang(bg-BG):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(bg-BG), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(bg-BG), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(bg-BG), +.entry .entry-content .wp-block-cover-image h2:lang(bg-BG), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(bg-BG), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(bg-BG), +.entry .entry-content .wp-block-cover h2:lang(bg-BG), .entry .entry-content .wp-block-audio figcaption:lang(bg-BG), +.entry .entry-content .wp-block-video figcaption:lang(bg-BG), +.entry .entry-content .wp-block-image figcaption:lang(bg-BG), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(bg-BG), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(bg-BG), .entry .entry-content .wp-block-file:lang(bg-BG), .entry .entry-content .wp-block-file .wp-block-file__button:lang(bg-BG), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bg-BG), .wp-caption-text:lang(bg-BG), .gallery-caption:lang(bg-BG) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(kk), button:lang(kk), +input:lang(kk), +select:lang(kk), +optgroup:lang(kk), +textarea:lang(kk), .author-description .author-link:lang(kk), +.comment-metadata:lang(kk), +.comment-reply-link:lang(kk), +.comments-title:lang(kk), +.comment-author .fn:lang(kk), +.discussion-meta-info:lang(kk), +.entry-meta:lang(kk), +.entry-footer:lang(kk), +.main-navigation:lang(kk), +.no-comments:lang(kk), +.not-found .page-title:lang(kk), +.error-404 .page-title:lang(kk), +.post-navigation .post-title:lang(kk), +.page-links:lang(kk), +.page-description:lang(kk), +.pagination .nav-links:lang(kk), +.sticky-post:lang(kk), +.site-title:lang(kk), +.site-info:lang(kk), +#cancel-comment-reply-link:lang(kk), +h1:lang(kk), +h2:lang(kk), +h3:lang(kk), +h4:lang(kk), +h5:lang(kk), +h6:lang(kk), .page-title:lang(kk), blockquote cite:lang(kk), table:lang(kk), .button:lang(kk), +input:lang(kk)[type="button"], +input:lang(kk)[type="reset"], +input:lang(kk)[type="submit"], .comment-navigation .nav-previous:lang(kk), +.comment-navigation .nav-next:lang(kk), .comment-list .pingback .comment-body:lang(kk), +.comment-list .trackback .comment-body:lang(kk), .comment-list .pingback .comment-body .comment-edit-link:lang(kk), +.comment-list .trackback .comment-body .comment-edit-link:lang(kk), .comment-form .comment-notes:lang(kk), +.comment-form label:lang(kk), .widget_archive ul li:lang(kk), +.widget_categories ul li:lang(kk), +.widget_meta ul li:lang(kk), +.widget_nav_menu ul li:lang(kk), +.widget_pages ul li:lang(kk), +.widget_recent_comments ul li:lang(kk), +.widget_recent_entries ul li:lang(kk), +.widget_rss ul li:lang(kk), .widget_tag_cloud .tagcloud:lang(kk), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(kk), .entry .entry-content .wp-block-button .wp-block-button__link:lang(kk), .entry .entry-content .wp-block-archives li > a:lang(kk), +.entry .entry-content .wp-block-categories li > a:lang(kk), +.entry .entry-content .wp-block-latest-posts li > a:lang(kk), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(kk), .entry .entry-content .wp-block-verse:lang(kk), .entry .entry-content .has-drop-cap:lang(kk):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(kk), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(kk), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(kk), +.entry .entry-content .wp-block-cover-image h2:lang(kk), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(kk), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(kk), +.entry .entry-content .wp-block-cover h2:lang(kk), .entry .entry-content .wp-block-audio figcaption:lang(kk), +.entry .entry-content .wp-block-video figcaption:lang(kk), +.entry .entry-content .wp-block-image figcaption:lang(kk), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(kk), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(kk), .entry .entry-content .wp-block-file:lang(kk), .entry .entry-content .wp-block-file .wp-block-file__button:lang(kk), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(kk), .wp-caption-text:lang(kk), .gallery-caption:lang(kk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mk-MK), button:lang(mk-MK), +input:lang(mk-MK), +select:lang(mk-MK), +optgroup:lang(mk-MK), +textarea:lang(mk-MK), .author-description .author-link:lang(mk-MK), +.comment-metadata:lang(mk-MK), +.comment-reply-link:lang(mk-MK), +.comments-title:lang(mk-MK), +.comment-author .fn:lang(mk-MK), +.discussion-meta-info:lang(mk-MK), +.entry-meta:lang(mk-MK), +.entry-footer:lang(mk-MK), +.main-navigation:lang(mk-MK), +.no-comments:lang(mk-MK), +.not-found .page-title:lang(mk-MK), +.error-404 .page-title:lang(mk-MK), +.post-navigation .post-title:lang(mk-MK), +.page-links:lang(mk-MK), +.page-description:lang(mk-MK), +.pagination .nav-links:lang(mk-MK), +.sticky-post:lang(mk-MK), +.site-title:lang(mk-MK), +.site-info:lang(mk-MK), +#cancel-comment-reply-link:lang(mk-MK), +h1:lang(mk-MK), +h2:lang(mk-MK), +h3:lang(mk-MK), +h4:lang(mk-MK), +h5:lang(mk-MK), +h6:lang(mk-MK), .page-title:lang(mk-MK), blockquote cite:lang(mk-MK), table:lang(mk-MK), .button:lang(mk-MK), +input:lang(mk-MK)[type="button"], +input:lang(mk-MK)[type="reset"], +input:lang(mk-MK)[type="submit"], .comment-navigation .nav-previous:lang(mk-MK), +.comment-navigation .nav-next:lang(mk-MK), .comment-list .pingback .comment-body:lang(mk-MK), +.comment-list .trackback .comment-body:lang(mk-MK), .comment-list .pingback .comment-body .comment-edit-link:lang(mk-MK), +.comment-list .trackback .comment-body .comment-edit-link:lang(mk-MK), .comment-form .comment-notes:lang(mk-MK), +.comment-form label:lang(mk-MK), .widget_archive ul li:lang(mk-MK), +.widget_categories ul li:lang(mk-MK), +.widget_meta ul li:lang(mk-MK), +.widget_nav_menu ul li:lang(mk-MK), +.widget_pages ul li:lang(mk-MK), +.widget_recent_comments ul li:lang(mk-MK), +.widget_recent_entries ul li:lang(mk-MK), +.widget_rss ul li:lang(mk-MK), .widget_tag_cloud .tagcloud:lang(mk-MK), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mk-MK), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mk-MK), .entry .entry-content .wp-block-archives li > a:lang(mk-MK), +.entry .entry-content .wp-block-categories li > a:lang(mk-MK), +.entry .entry-content .wp-block-latest-posts li > a:lang(mk-MK), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mk-MK), .entry .entry-content .wp-block-verse:lang(mk-MK), .entry .entry-content .has-drop-cap:lang(mk-MK):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mk-MK), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mk-MK), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mk-MK), +.entry .entry-content .wp-block-cover-image h2:lang(mk-MK), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mk-MK), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mk-MK), +.entry .entry-content .wp-block-cover h2:lang(mk-MK), .entry .entry-content .wp-block-audio figcaption:lang(mk-MK), +.entry .entry-content .wp-block-video figcaption:lang(mk-MK), +.entry .entry-content .wp-block-image figcaption:lang(mk-MK), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mk-MK), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mk-MK), .entry .entry-content .wp-block-file:lang(mk-MK), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mk-MK), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mk-MK), .wp-caption-text:lang(mk-MK), .gallery-caption:lang(mk-MK) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(mn), button:lang(mn), +input:lang(mn), +select:lang(mn), +optgroup:lang(mn), +textarea:lang(mn), .author-description .author-link:lang(mn), +.comment-metadata:lang(mn), +.comment-reply-link:lang(mn), +.comments-title:lang(mn), +.comment-author .fn:lang(mn), +.discussion-meta-info:lang(mn), +.entry-meta:lang(mn), +.entry-footer:lang(mn), +.main-navigation:lang(mn), +.no-comments:lang(mn), +.not-found .page-title:lang(mn), +.error-404 .page-title:lang(mn), +.post-navigation .post-title:lang(mn), +.page-links:lang(mn), +.page-description:lang(mn), +.pagination .nav-links:lang(mn), +.sticky-post:lang(mn), +.site-title:lang(mn), +.site-info:lang(mn), +#cancel-comment-reply-link:lang(mn), +h1:lang(mn), +h2:lang(mn), +h3:lang(mn), +h4:lang(mn), +h5:lang(mn), +h6:lang(mn), .page-title:lang(mn), blockquote cite:lang(mn), table:lang(mn), .button:lang(mn), +input:lang(mn)[type="button"], +input:lang(mn)[type="reset"], +input:lang(mn)[type="submit"], .comment-navigation .nav-previous:lang(mn), +.comment-navigation .nav-next:lang(mn), .comment-list .pingback .comment-body:lang(mn), +.comment-list .trackback .comment-body:lang(mn), .comment-list .pingback .comment-body .comment-edit-link:lang(mn), +.comment-list .trackback .comment-body .comment-edit-link:lang(mn), .comment-form .comment-notes:lang(mn), +.comment-form label:lang(mn), .widget_archive ul li:lang(mn), +.widget_categories ul li:lang(mn), +.widget_meta ul li:lang(mn), +.widget_nav_menu ul li:lang(mn), +.widget_pages ul li:lang(mn), +.widget_recent_comments ul li:lang(mn), +.widget_recent_entries ul li:lang(mn), +.widget_rss ul li:lang(mn), .widget_tag_cloud .tagcloud:lang(mn), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mn), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mn), .entry .entry-content .wp-block-archives li > a:lang(mn), +.entry .entry-content .wp-block-categories li > a:lang(mn), +.entry .entry-content .wp-block-latest-posts li > a:lang(mn), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mn), .entry .entry-content .wp-block-verse:lang(mn), .entry .entry-content .has-drop-cap:lang(mn):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mn), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mn), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mn), +.entry .entry-content .wp-block-cover-image h2:lang(mn), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mn), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mn), +.entry .entry-content .wp-block-cover h2:lang(mn), .entry .entry-content .wp-block-audio figcaption:lang(mn), +.entry .entry-content .wp-block-video figcaption:lang(mn), +.entry .entry-content .wp-block-image figcaption:lang(mn), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mn), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mn), .entry .entry-content .wp-block-file:lang(mn), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mn), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mn), .wp-caption-text:lang(mn), .gallery-caption:lang(mn) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(ru-RU), button:lang(ru-RU), +input:lang(ru-RU), +select:lang(ru-RU), +optgroup:lang(ru-RU), +textarea:lang(ru-RU), .author-description .author-link:lang(ru-RU), +.comment-metadata:lang(ru-RU), +.comment-reply-link:lang(ru-RU), +.comments-title:lang(ru-RU), +.comment-author .fn:lang(ru-RU), +.discussion-meta-info:lang(ru-RU), +.entry-meta:lang(ru-RU), +.entry-footer:lang(ru-RU), +.main-navigation:lang(ru-RU), +.no-comments:lang(ru-RU), +.not-found .page-title:lang(ru-RU), +.error-404 .page-title:lang(ru-RU), +.post-navigation .post-title:lang(ru-RU), +.page-links:lang(ru-RU), +.page-description:lang(ru-RU), +.pagination .nav-links:lang(ru-RU), +.sticky-post:lang(ru-RU), +.site-title:lang(ru-RU), +.site-info:lang(ru-RU), +#cancel-comment-reply-link:lang(ru-RU), +h1:lang(ru-RU), +h2:lang(ru-RU), +h3:lang(ru-RU), +h4:lang(ru-RU), +h5:lang(ru-RU), +h6:lang(ru-RU), .page-title:lang(ru-RU), blockquote cite:lang(ru-RU), table:lang(ru-RU), .button:lang(ru-RU), +input:lang(ru-RU)[type="button"], +input:lang(ru-RU)[type="reset"], +input:lang(ru-RU)[type="submit"], .comment-navigation .nav-previous:lang(ru-RU), +.comment-navigation .nav-next:lang(ru-RU), .comment-list .pingback .comment-body:lang(ru-RU), +.comment-list .trackback .comment-body:lang(ru-RU), .comment-list .pingback .comment-body .comment-edit-link:lang(ru-RU), +.comment-list .trackback .comment-body .comment-edit-link:lang(ru-RU), .comment-form .comment-notes:lang(ru-RU), +.comment-form label:lang(ru-RU), .widget_archive ul li:lang(ru-RU), +.widget_categories ul li:lang(ru-RU), +.widget_meta ul li:lang(ru-RU), +.widget_nav_menu ul li:lang(ru-RU), +.widget_pages ul li:lang(ru-RU), +.widget_recent_comments ul li:lang(ru-RU), +.widget_recent_entries ul li:lang(ru-RU), +.widget_rss ul li:lang(ru-RU), .widget_tag_cloud .tagcloud:lang(ru-RU), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ru-RU), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ru-RU), .entry .entry-content .wp-block-archives li > a:lang(ru-RU), +.entry .entry-content .wp-block-categories li > a:lang(ru-RU), +.entry .entry-content .wp-block-latest-posts li > a:lang(ru-RU), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ru-RU), .entry .entry-content .wp-block-verse:lang(ru-RU), .entry .entry-content .has-drop-cap:lang(ru-RU):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ru-RU), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ru-RU), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ru-RU), +.entry .entry-content .wp-block-cover-image h2:lang(ru-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ru-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ru-RU), +.entry .entry-content .wp-block-cover h2:lang(ru-RU), .entry .entry-content .wp-block-audio figcaption:lang(ru-RU), +.entry .entry-content .wp-block-video figcaption:lang(ru-RU), +.entry .entry-content .wp-block-image figcaption:lang(ru-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ru-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ru-RU), .entry .entry-content .wp-block-file:lang(ru-RU), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ru-RU), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ru-RU), .wp-caption-text:lang(ru-RU), .gallery-caption:lang(ru-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sah), button:lang(sah), +input:lang(sah), +select:lang(sah), +optgroup:lang(sah), +textarea:lang(sah), .author-description .author-link:lang(sah), +.comment-metadata:lang(sah), +.comment-reply-link:lang(sah), +.comments-title:lang(sah), +.comment-author .fn:lang(sah), +.discussion-meta-info:lang(sah), +.entry-meta:lang(sah), +.entry-footer:lang(sah), +.main-navigation:lang(sah), +.no-comments:lang(sah), +.not-found .page-title:lang(sah), +.error-404 .page-title:lang(sah), +.post-navigation .post-title:lang(sah), +.page-links:lang(sah), +.page-description:lang(sah), +.pagination .nav-links:lang(sah), +.sticky-post:lang(sah), +.site-title:lang(sah), +.site-info:lang(sah), +#cancel-comment-reply-link:lang(sah), +h1:lang(sah), +h2:lang(sah), +h3:lang(sah), +h4:lang(sah), +h5:lang(sah), +h6:lang(sah), .page-title:lang(sah), blockquote cite:lang(sah), table:lang(sah), .button:lang(sah), +input:lang(sah)[type="button"], +input:lang(sah)[type="reset"], +input:lang(sah)[type="submit"], .comment-navigation .nav-previous:lang(sah), +.comment-navigation .nav-next:lang(sah), .comment-list .pingback .comment-body:lang(sah), +.comment-list .trackback .comment-body:lang(sah), .comment-list .pingback .comment-body .comment-edit-link:lang(sah), +.comment-list .trackback .comment-body .comment-edit-link:lang(sah), .comment-form .comment-notes:lang(sah), +.comment-form label:lang(sah), .widget_archive ul li:lang(sah), +.widget_categories ul li:lang(sah), +.widget_meta ul li:lang(sah), +.widget_nav_menu ul li:lang(sah), +.widget_pages ul li:lang(sah), +.widget_recent_comments ul li:lang(sah), +.widget_recent_entries ul li:lang(sah), +.widget_rss ul li:lang(sah), .widget_tag_cloud .tagcloud:lang(sah), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(sah), .entry .entry-content .wp-block-button .wp-block-button__link:lang(sah), .entry .entry-content .wp-block-archives li > a:lang(sah), +.entry .entry-content .wp-block-categories li > a:lang(sah), +.entry .entry-content .wp-block-latest-posts li > a:lang(sah), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sah), .entry .entry-content .wp-block-verse:lang(sah), .entry .entry-content .has-drop-cap:lang(sah):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(sah), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(sah), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(sah), +.entry .entry-content .wp-block-cover-image h2:lang(sah), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(sah), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(sah), +.entry .entry-content .wp-block-cover h2:lang(sah), .entry .entry-content .wp-block-audio figcaption:lang(sah), +.entry .entry-content .wp-block-video figcaption:lang(sah), +.entry .entry-content .wp-block-image figcaption:lang(sah), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(sah), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(sah), .entry .entry-content .wp-block-file:lang(sah), .entry .entry-content .wp-block-file .wp-block-file__button:lang(sah), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sah), .wp-caption-text:lang(sah), .gallery-caption:lang(sah) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(sr-RS), button:lang(sr-RS), +input:lang(sr-RS), +select:lang(sr-RS), +optgroup:lang(sr-RS), +textarea:lang(sr-RS), .author-description .author-link:lang(sr-RS), +.comment-metadata:lang(sr-RS), +.comment-reply-link:lang(sr-RS), +.comments-title:lang(sr-RS), +.comment-author .fn:lang(sr-RS), +.discussion-meta-info:lang(sr-RS), +.entry-meta:lang(sr-RS), +.entry-footer:lang(sr-RS), +.main-navigation:lang(sr-RS), +.no-comments:lang(sr-RS), +.not-found .page-title:lang(sr-RS), +.error-404 .page-title:lang(sr-RS), +.post-navigation .post-title:lang(sr-RS), +.page-links:lang(sr-RS), +.page-description:lang(sr-RS), +.pagination .nav-links:lang(sr-RS), +.sticky-post:lang(sr-RS), +.site-title:lang(sr-RS), +.site-info:lang(sr-RS), +#cancel-comment-reply-link:lang(sr-RS), +h1:lang(sr-RS), +h2:lang(sr-RS), +h3:lang(sr-RS), +h4:lang(sr-RS), +h5:lang(sr-RS), +h6:lang(sr-RS), .page-title:lang(sr-RS), blockquote cite:lang(sr-RS), table:lang(sr-RS), .button:lang(sr-RS), +input:lang(sr-RS)[type="button"], +input:lang(sr-RS)[type="reset"], +input:lang(sr-RS)[type="submit"], .comment-navigation .nav-previous:lang(sr-RS), +.comment-navigation .nav-next:lang(sr-RS), .comment-list .pingback .comment-body:lang(sr-RS), +.comment-list .trackback .comment-body:lang(sr-RS), .comment-list .pingback .comment-body .comment-edit-link:lang(sr-RS), +.comment-list .trackback .comment-body .comment-edit-link:lang(sr-RS), .comment-form .comment-notes:lang(sr-RS), +.comment-form label:lang(sr-RS), .widget_archive ul li:lang(sr-RS), +.widget_categories ul li:lang(sr-RS), +.widget_meta ul li:lang(sr-RS), +.widget_nav_menu ul li:lang(sr-RS), +.widget_pages ul li:lang(sr-RS), +.widget_recent_comments ul li:lang(sr-RS), +.widget_recent_entries ul li:lang(sr-RS), +.widget_rss ul li:lang(sr-RS), .widget_tag_cloud .tagcloud:lang(sr-RS), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(sr-RS), .entry .entry-content .wp-block-button .wp-block-button__link:lang(sr-RS), .entry .entry-content .wp-block-archives li > a:lang(sr-RS), +.entry .entry-content .wp-block-categories li > a:lang(sr-RS), +.entry .entry-content .wp-block-latest-posts li > a:lang(sr-RS), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(sr-RS), .entry .entry-content .wp-block-verse:lang(sr-RS), .entry .entry-content .has-drop-cap:lang(sr-RS):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(sr-RS), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(sr-RS), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(sr-RS), +.entry .entry-content .wp-block-cover-image h2:lang(sr-RS), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(sr-RS), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(sr-RS), +.entry .entry-content .wp-block-cover h2:lang(sr-RS), .entry .entry-content .wp-block-audio figcaption:lang(sr-RS), +.entry .entry-content .wp-block-video figcaption:lang(sr-RS), +.entry .entry-content .wp-block-image figcaption:lang(sr-RS), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(sr-RS), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(sr-RS), .entry .entry-content .wp-block-file:lang(sr-RS), .entry .entry-content .wp-block-file .wp-block-file__button:lang(sr-RS), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(sr-RS), .wp-caption-text:lang(sr-RS), .gallery-caption:lang(sr-RS) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(tt-RU), button:lang(tt-RU), +input:lang(tt-RU), +select:lang(tt-RU), +optgroup:lang(tt-RU), +textarea:lang(tt-RU), .author-description .author-link:lang(tt-RU), +.comment-metadata:lang(tt-RU), +.comment-reply-link:lang(tt-RU), +.comments-title:lang(tt-RU), +.comment-author .fn:lang(tt-RU), +.discussion-meta-info:lang(tt-RU), +.entry-meta:lang(tt-RU), +.entry-footer:lang(tt-RU), +.main-navigation:lang(tt-RU), +.no-comments:lang(tt-RU), +.not-found .page-title:lang(tt-RU), +.error-404 .page-title:lang(tt-RU), +.post-navigation .post-title:lang(tt-RU), +.page-links:lang(tt-RU), +.page-description:lang(tt-RU), +.pagination .nav-links:lang(tt-RU), +.sticky-post:lang(tt-RU), +.site-title:lang(tt-RU), +.site-info:lang(tt-RU), +#cancel-comment-reply-link:lang(tt-RU), +h1:lang(tt-RU), +h2:lang(tt-RU), +h3:lang(tt-RU), +h4:lang(tt-RU), +h5:lang(tt-RU), +h6:lang(tt-RU), .page-title:lang(tt-RU), blockquote cite:lang(tt-RU), table:lang(tt-RU), .button:lang(tt-RU), +input:lang(tt-RU)[type="button"], +input:lang(tt-RU)[type="reset"], +input:lang(tt-RU)[type="submit"], .comment-navigation .nav-previous:lang(tt-RU), +.comment-navigation .nav-next:lang(tt-RU), .comment-list .pingback .comment-body:lang(tt-RU), +.comment-list .trackback .comment-body:lang(tt-RU), .comment-list .pingback .comment-body .comment-edit-link:lang(tt-RU), +.comment-list .trackback .comment-body .comment-edit-link:lang(tt-RU), .comment-form .comment-notes:lang(tt-RU), +.comment-form label:lang(tt-RU), .widget_archive ul li:lang(tt-RU), +.widget_categories ul li:lang(tt-RU), +.widget_meta ul li:lang(tt-RU), +.widget_nav_menu ul li:lang(tt-RU), +.widget_pages ul li:lang(tt-RU), +.widget_recent_comments ul li:lang(tt-RU), +.widget_recent_entries ul li:lang(tt-RU), +.widget_rss ul li:lang(tt-RU), .widget_tag_cloud .tagcloud:lang(tt-RU), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(tt-RU), .entry .entry-content .wp-block-button .wp-block-button__link:lang(tt-RU), .entry .entry-content .wp-block-archives li > a:lang(tt-RU), +.entry .entry-content .wp-block-categories li > a:lang(tt-RU), +.entry .entry-content .wp-block-latest-posts li > a:lang(tt-RU), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(tt-RU), .entry .entry-content .wp-block-verse:lang(tt-RU), .entry .entry-content .has-drop-cap:lang(tt-RU):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(tt-RU), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(tt-RU), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(tt-RU), +.entry .entry-content .wp-block-cover-image h2:lang(tt-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(tt-RU), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(tt-RU), +.entry .entry-content .wp-block-cover h2:lang(tt-RU), .entry .entry-content .wp-block-audio figcaption:lang(tt-RU), +.entry .entry-content .wp-block-video figcaption:lang(tt-RU), +.entry .entry-content .wp-block-image figcaption:lang(tt-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(tt-RU), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(tt-RU), .entry .entry-content .wp-block-file:lang(tt-RU), .entry .entry-content .wp-block-file .wp-block-file__button:lang(tt-RU), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(tt-RU), .wp-caption-text:lang(tt-RU), .gallery-caption:lang(tt-RU) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(uk), button:lang(uk), +input:lang(uk), +select:lang(uk), +optgroup:lang(uk), +textarea:lang(uk), .author-description .author-link:lang(uk), +.comment-metadata:lang(uk), +.comment-reply-link:lang(uk), +.comments-title:lang(uk), +.comment-author .fn:lang(uk), +.discussion-meta-info:lang(uk), +.entry-meta:lang(uk), +.entry-footer:lang(uk), +.main-navigation:lang(uk), +.no-comments:lang(uk), +.not-found .page-title:lang(uk), +.error-404 .page-title:lang(uk), +.post-navigation .post-title:lang(uk), +.page-links:lang(uk), +.page-description:lang(uk), +.pagination .nav-links:lang(uk), +.sticky-post:lang(uk), +.site-title:lang(uk), +.site-info:lang(uk), +#cancel-comment-reply-link:lang(uk), +h1:lang(uk), +h2:lang(uk), +h3:lang(uk), +h4:lang(uk), +h5:lang(uk), +h6:lang(uk), .page-title:lang(uk), blockquote cite:lang(uk), table:lang(uk), .button:lang(uk), +input:lang(uk)[type="button"], +input:lang(uk)[type="reset"], +input:lang(uk)[type="submit"], .comment-navigation .nav-previous:lang(uk), +.comment-navigation .nav-next:lang(uk), .comment-list .pingback .comment-body:lang(uk), +.comment-list .trackback .comment-body:lang(uk), .comment-list .pingback .comment-body .comment-edit-link:lang(uk), +.comment-list .trackback .comment-body .comment-edit-link:lang(uk), .comment-form .comment-notes:lang(uk), +.comment-form label:lang(uk), .widget_archive ul li:lang(uk), +.widget_categories ul li:lang(uk), +.widget_meta ul li:lang(uk), +.widget_nav_menu ul li:lang(uk), +.widget_pages ul li:lang(uk), +.widget_recent_comments ul li:lang(uk), +.widget_recent_entries ul li:lang(uk), +.widget_rss ul li:lang(uk), .widget_tag_cloud .tagcloud:lang(uk), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(uk), .entry .entry-content .wp-block-button .wp-block-button__link:lang(uk), .entry .entry-content .wp-block-archives li > a:lang(uk), +.entry .entry-content .wp-block-categories li > a:lang(uk), +.entry .entry-content .wp-block-latest-posts li > a:lang(uk), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(uk), .entry .entry-content .wp-block-verse:lang(uk), .entry .entry-content .has-drop-cap:lang(uk):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(uk), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(uk), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(uk), +.entry .entry-content .wp-block-cover-image h2:lang(uk), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(uk), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(uk), +.entry .entry-content .wp-block-cover h2:lang(uk), .entry .entry-content .wp-block-audio figcaption:lang(uk), +.entry .entry-content .wp-block-video figcaption:lang(uk), +.entry .entry-content .wp-block-image figcaption:lang(uk), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(uk), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(uk), .entry .entry-content .wp-block-file:lang(uk), .entry .entry-content .wp-block-file .wp-block-file__button:lang(uk), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(uk), .wp-caption-text:lang(uk), .gallery-caption:lang(uk) { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +body:lang(zh-HK), button:lang(zh-HK), +input:lang(zh-HK), +select:lang(zh-HK), +optgroup:lang(zh-HK), +textarea:lang(zh-HK), .author-description .author-link:lang(zh-HK), +.comment-metadata:lang(zh-HK), +.comment-reply-link:lang(zh-HK), +.comments-title:lang(zh-HK), +.comment-author .fn:lang(zh-HK), +.discussion-meta-info:lang(zh-HK), +.entry-meta:lang(zh-HK), +.entry-footer:lang(zh-HK), +.main-navigation:lang(zh-HK), +.no-comments:lang(zh-HK), +.not-found .page-title:lang(zh-HK), +.error-404 .page-title:lang(zh-HK), +.post-navigation .post-title:lang(zh-HK), +.page-links:lang(zh-HK), +.page-description:lang(zh-HK), +.pagination .nav-links:lang(zh-HK), +.sticky-post:lang(zh-HK), +.site-title:lang(zh-HK), +.site-info:lang(zh-HK), +#cancel-comment-reply-link:lang(zh-HK), +h1:lang(zh-HK), +h2:lang(zh-HK), +h3:lang(zh-HK), +h4:lang(zh-HK), +h5:lang(zh-HK), +h6:lang(zh-HK), .page-title:lang(zh-HK), blockquote cite:lang(zh-HK), table:lang(zh-HK), .button:lang(zh-HK), +input:lang(zh-HK)[type="button"], +input:lang(zh-HK)[type="reset"], +input:lang(zh-HK)[type="submit"], .comment-navigation .nav-previous:lang(zh-HK), +.comment-navigation .nav-next:lang(zh-HK), .comment-list .pingback .comment-body:lang(zh-HK), +.comment-list .trackback .comment-body:lang(zh-HK), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-HK), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-HK), .comment-form .comment-notes:lang(zh-HK), +.comment-form label:lang(zh-HK), .widget_archive ul li:lang(zh-HK), +.widget_categories ul li:lang(zh-HK), +.widget_meta ul li:lang(zh-HK), +.widget_nav_menu ul li:lang(zh-HK), +.widget_pages ul li:lang(zh-HK), +.widget_recent_comments ul li:lang(zh-HK), +.widget_recent_entries ul li:lang(zh-HK), +.widget_rss ul li:lang(zh-HK), .widget_tag_cloud .tagcloud:lang(zh-HK), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-HK), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-HK), .entry .entry-content .wp-block-archives li > a:lang(zh-HK), +.entry .entry-content .wp-block-categories li > a:lang(zh-HK), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-HK), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-HK), .entry .entry-content .wp-block-verse:lang(zh-HK), .entry .entry-content .has-drop-cap:lang(zh-HK):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-HK), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-HK), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-HK), +.entry .entry-content .wp-block-cover-image h2:lang(zh-HK), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-HK), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-HK), +.entry .entry-content .wp-block-cover h2:lang(zh-HK), .entry .entry-content .wp-block-audio figcaption:lang(zh-HK), +.entry .entry-content .wp-block-video figcaption:lang(zh-HK), +.entry .entry-content .wp-block-image figcaption:lang(zh-HK), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-HK), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-HK), .entry .entry-content .wp-block-file:lang(zh-HK), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-HK), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-HK), .wp-caption-text:lang(zh-HK), .gallery-caption:lang(zh-HK) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang HK", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-TW), button:lang(zh-TW), +input:lang(zh-TW), +select:lang(zh-TW), +optgroup:lang(zh-TW), +textarea:lang(zh-TW), .author-description .author-link:lang(zh-TW), +.comment-metadata:lang(zh-TW), +.comment-reply-link:lang(zh-TW), +.comments-title:lang(zh-TW), +.comment-author .fn:lang(zh-TW), +.discussion-meta-info:lang(zh-TW), +.entry-meta:lang(zh-TW), +.entry-footer:lang(zh-TW), +.main-navigation:lang(zh-TW), +.no-comments:lang(zh-TW), +.not-found .page-title:lang(zh-TW), +.error-404 .page-title:lang(zh-TW), +.post-navigation .post-title:lang(zh-TW), +.page-links:lang(zh-TW), +.page-description:lang(zh-TW), +.pagination .nav-links:lang(zh-TW), +.sticky-post:lang(zh-TW), +.site-title:lang(zh-TW), +.site-info:lang(zh-TW), +#cancel-comment-reply-link:lang(zh-TW), +h1:lang(zh-TW), +h2:lang(zh-TW), +h3:lang(zh-TW), +h4:lang(zh-TW), +h5:lang(zh-TW), +h6:lang(zh-TW), .page-title:lang(zh-TW), blockquote cite:lang(zh-TW), table:lang(zh-TW), .button:lang(zh-TW), +input:lang(zh-TW)[type="button"], +input:lang(zh-TW)[type="reset"], +input:lang(zh-TW)[type="submit"], .comment-navigation .nav-previous:lang(zh-TW), +.comment-navigation .nav-next:lang(zh-TW), .comment-list .pingback .comment-body:lang(zh-TW), +.comment-list .trackback .comment-body:lang(zh-TW), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-TW), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-TW), .comment-form .comment-notes:lang(zh-TW), +.comment-form label:lang(zh-TW), .widget_archive ul li:lang(zh-TW), +.widget_categories ul li:lang(zh-TW), +.widget_meta ul li:lang(zh-TW), +.widget_nav_menu ul li:lang(zh-TW), +.widget_pages ul li:lang(zh-TW), +.widget_recent_comments ul li:lang(zh-TW), +.widget_recent_entries ul li:lang(zh-TW), +.widget_rss ul li:lang(zh-TW), .widget_tag_cloud .tagcloud:lang(zh-TW), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-TW), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-TW), .entry .entry-content .wp-block-archives li > a:lang(zh-TW), +.entry .entry-content .wp-block-categories li > a:lang(zh-TW), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-TW), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-TW), .entry .entry-content .wp-block-verse:lang(zh-TW), .entry .entry-content .has-drop-cap:lang(zh-TW):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-TW), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-TW), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-TW), +.entry .entry-content .wp-block-cover-image h2:lang(zh-TW), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-TW), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-TW), +.entry .entry-content .wp-block-cover h2:lang(zh-TW), .entry .entry-content .wp-block-audio figcaption:lang(zh-TW), +.entry .entry-content .wp-block-video figcaption:lang(zh-TW), +.entry .entry-content .wp-block-image figcaption:lang(zh-TW), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-TW), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-TW), .entry .entry-content .wp-block-file:lang(zh-TW), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-TW), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-TW), .wp-caption-text:lang(zh-TW), .gallery-caption:lang(zh-TW) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(zh-CN), button:lang(zh-CN), +input:lang(zh-CN), +select:lang(zh-CN), +optgroup:lang(zh-CN), +textarea:lang(zh-CN), .author-description .author-link:lang(zh-CN), +.comment-metadata:lang(zh-CN), +.comment-reply-link:lang(zh-CN), +.comments-title:lang(zh-CN), +.comment-author .fn:lang(zh-CN), +.discussion-meta-info:lang(zh-CN), +.entry-meta:lang(zh-CN), +.entry-footer:lang(zh-CN), +.main-navigation:lang(zh-CN), +.no-comments:lang(zh-CN), +.not-found .page-title:lang(zh-CN), +.error-404 .page-title:lang(zh-CN), +.post-navigation .post-title:lang(zh-CN), +.page-links:lang(zh-CN), +.page-description:lang(zh-CN), +.pagination .nav-links:lang(zh-CN), +.sticky-post:lang(zh-CN), +.site-title:lang(zh-CN), +.site-info:lang(zh-CN), +#cancel-comment-reply-link:lang(zh-CN), +h1:lang(zh-CN), +h2:lang(zh-CN), +h3:lang(zh-CN), +h4:lang(zh-CN), +h5:lang(zh-CN), +h6:lang(zh-CN), .page-title:lang(zh-CN), blockquote cite:lang(zh-CN), table:lang(zh-CN), .button:lang(zh-CN), +input:lang(zh-CN)[type="button"], +input:lang(zh-CN)[type="reset"], +input:lang(zh-CN)[type="submit"], .comment-navigation .nav-previous:lang(zh-CN), +.comment-navigation .nav-next:lang(zh-CN), .comment-list .pingback .comment-body:lang(zh-CN), +.comment-list .trackback .comment-body:lang(zh-CN), .comment-list .pingback .comment-body .comment-edit-link:lang(zh-CN), +.comment-list .trackback .comment-body .comment-edit-link:lang(zh-CN), .comment-form .comment-notes:lang(zh-CN), +.comment-form label:lang(zh-CN), .widget_archive ul li:lang(zh-CN), +.widget_categories ul li:lang(zh-CN), +.widget_meta ul li:lang(zh-CN), +.widget_nav_menu ul li:lang(zh-CN), +.widget_pages ul li:lang(zh-CN), +.widget_recent_comments ul li:lang(zh-CN), +.widget_recent_entries ul li:lang(zh-CN), +.widget_rss ul li:lang(zh-CN), .widget_tag_cloud .tagcloud:lang(zh-CN), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(zh-CN), .entry .entry-content .wp-block-button .wp-block-button__link:lang(zh-CN), .entry .entry-content .wp-block-archives li > a:lang(zh-CN), +.entry .entry-content .wp-block-categories li > a:lang(zh-CN), +.entry .entry-content .wp-block-latest-posts li > a:lang(zh-CN), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(zh-CN), .entry .entry-content .wp-block-verse:lang(zh-CN), .entry .entry-content .has-drop-cap:lang(zh-CN):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(zh-CN), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(zh-CN), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(zh-CN), +.entry .entry-content .wp-block-cover-image h2:lang(zh-CN), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(zh-CN), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(zh-CN), +.entry .entry-content .wp-block-cover h2:lang(zh-CN), .entry .entry-content .wp-block-audio figcaption:lang(zh-CN), +.entry .entry-content .wp-block-video figcaption:lang(zh-CN), +.entry .entry-content .wp-block-image figcaption:lang(zh-CN), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(zh-CN), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(zh-CN), .entry .entry-content .wp-block-file:lang(zh-CN), .entry .entry-content .wp-block-file .wp-block-file__button:lang(zh-CN), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(zh-CN), .wp-caption-text:lang(zh-CN), .gallery-caption:lang(zh-CN) { + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", "Microsoft YaHei New", STHeiti Light, sans-serif; +} + +body:lang(bn-BD), button:lang(bn-BD), +input:lang(bn-BD), +select:lang(bn-BD), +optgroup:lang(bn-BD), +textarea:lang(bn-BD), .author-description .author-link:lang(bn-BD), +.comment-metadata:lang(bn-BD), +.comment-reply-link:lang(bn-BD), +.comments-title:lang(bn-BD), +.comment-author .fn:lang(bn-BD), +.discussion-meta-info:lang(bn-BD), +.entry-meta:lang(bn-BD), +.entry-footer:lang(bn-BD), +.main-navigation:lang(bn-BD), +.no-comments:lang(bn-BD), +.not-found .page-title:lang(bn-BD), +.error-404 .page-title:lang(bn-BD), +.post-navigation .post-title:lang(bn-BD), +.page-links:lang(bn-BD), +.page-description:lang(bn-BD), +.pagination .nav-links:lang(bn-BD), +.sticky-post:lang(bn-BD), +.site-title:lang(bn-BD), +.site-info:lang(bn-BD), +#cancel-comment-reply-link:lang(bn-BD), +h1:lang(bn-BD), +h2:lang(bn-BD), +h3:lang(bn-BD), +h4:lang(bn-BD), +h5:lang(bn-BD), +h6:lang(bn-BD), .page-title:lang(bn-BD), blockquote cite:lang(bn-BD), table:lang(bn-BD), .button:lang(bn-BD), +input:lang(bn-BD)[type="button"], +input:lang(bn-BD)[type="reset"], +input:lang(bn-BD)[type="submit"], .comment-navigation .nav-previous:lang(bn-BD), +.comment-navigation .nav-next:lang(bn-BD), .comment-list .pingback .comment-body:lang(bn-BD), +.comment-list .trackback .comment-body:lang(bn-BD), .comment-list .pingback .comment-body .comment-edit-link:lang(bn-BD), +.comment-list .trackback .comment-body .comment-edit-link:lang(bn-BD), .comment-form .comment-notes:lang(bn-BD), +.comment-form label:lang(bn-BD), .widget_archive ul li:lang(bn-BD), +.widget_categories ul li:lang(bn-BD), +.widget_meta ul li:lang(bn-BD), +.widget_nav_menu ul li:lang(bn-BD), +.widget_pages ul li:lang(bn-BD), +.widget_recent_comments ul li:lang(bn-BD), +.widget_recent_entries ul li:lang(bn-BD), +.widget_rss ul li:lang(bn-BD), .widget_tag_cloud .tagcloud:lang(bn-BD), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(bn-BD), .entry .entry-content .wp-block-button .wp-block-button__link:lang(bn-BD), .entry .entry-content .wp-block-archives li > a:lang(bn-BD), +.entry .entry-content .wp-block-categories li > a:lang(bn-BD), +.entry .entry-content .wp-block-latest-posts li > a:lang(bn-BD), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(bn-BD), .entry .entry-content .wp-block-verse:lang(bn-BD), .entry .entry-content .has-drop-cap:lang(bn-BD):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(bn-BD), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(bn-BD), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(bn-BD), +.entry .entry-content .wp-block-cover-image h2:lang(bn-BD), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(bn-BD), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(bn-BD), +.entry .entry-content .wp-block-cover h2:lang(bn-BD), .entry .entry-content .wp-block-audio figcaption:lang(bn-BD), +.entry .entry-content .wp-block-video figcaption:lang(bn-BD), +.entry .entry-content .wp-block-image figcaption:lang(bn-BD), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(bn-BD), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(bn-BD), .entry .entry-content .wp-block-file:lang(bn-BD), .entry .entry-content .wp-block-file .wp-block-file__button:lang(bn-BD), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(bn-BD), .wp-caption-text:lang(bn-BD), .gallery-caption:lang(bn-BD) { + font-family: Arial, sans-serif; +} + +body:lang(hi-IN), button:lang(hi-IN), +input:lang(hi-IN), +select:lang(hi-IN), +optgroup:lang(hi-IN), +textarea:lang(hi-IN), .author-description .author-link:lang(hi-IN), +.comment-metadata:lang(hi-IN), +.comment-reply-link:lang(hi-IN), +.comments-title:lang(hi-IN), +.comment-author .fn:lang(hi-IN), +.discussion-meta-info:lang(hi-IN), +.entry-meta:lang(hi-IN), +.entry-footer:lang(hi-IN), +.main-navigation:lang(hi-IN), +.no-comments:lang(hi-IN), +.not-found .page-title:lang(hi-IN), +.error-404 .page-title:lang(hi-IN), +.post-navigation .post-title:lang(hi-IN), +.page-links:lang(hi-IN), +.page-description:lang(hi-IN), +.pagination .nav-links:lang(hi-IN), +.sticky-post:lang(hi-IN), +.site-title:lang(hi-IN), +.site-info:lang(hi-IN), +#cancel-comment-reply-link:lang(hi-IN), +h1:lang(hi-IN), +h2:lang(hi-IN), +h3:lang(hi-IN), +h4:lang(hi-IN), +h5:lang(hi-IN), +h6:lang(hi-IN), .page-title:lang(hi-IN), blockquote cite:lang(hi-IN), table:lang(hi-IN), .button:lang(hi-IN), +input:lang(hi-IN)[type="button"], +input:lang(hi-IN)[type="reset"], +input:lang(hi-IN)[type="submit"], .comment-navigation .nav-previous:lang(hi-IN), +.comment-navigation .nav-next:lang(hi-IN), .comment-list .pingback .comment-body:lang(hi-IN), +.comment-list .trackback .comment-body:lang(hi-IN), .comment-list .pingback .comment-body .comment-edit-link:lang(hi-IN), +.comment-list .trackback .comment-body .comment-edit-link:lang(hi-IN), .comment-form .comment-notes:lang(hi-IN), +.comment-form label:lang(hi-IN), .widget_archive ul li:lang(hi-IN), +.widget_categories ul li:lang(hi-IN), +.widget_meta ul li:lang(hi-IN), +.widget_nav_menu ul li:lang(hi-IN), +.widget_pages ul li:lang(hi-IN), +.widget_recent_comments ul li:lang(hi-IN), +.widget_recent_entries ul li:lang(hi-IN), +.widget_rss ul li:lang(hi-IN), .widget_tag_cloud .tagcloud:lang(hi-IN), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(hi-IN), .entry .entry-content .wp-block-button .wp-block-button__link:lang(hi-IN), .entry .entry-content .wp-block-archives li > a:lang(hi-IN), +.entry .entry-content .wp-block-categories li > a:lang(hi-IN), +.entry .entry-content .wp-block-latest-posts li > a:lang(hi-IN), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(hi-IN), .entry .entry-content .wp-block-verse:lang(hi-IN), .entry .entry-content .has-drop-cap:lang(hi-IN):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(hi-IN), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(hi-IN), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(hi-IN), +.entry .entry-content .wp-block-cover-image h2:lang(hi-IN), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(hi-IN), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(hi-IN), +.entry .entry-content .wp-block-cover h2:lang(hi-IN), .entry .entry-content .wp-block-audio figcaption:lang(hi-IN), +.entry .entry-content .wp-block-video figcaption:lang(hi-IN), +.entry .entry-content .wp-block-image figcaption:lang(hi-IN), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(hi-IN), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(hi-IN), .entry .entry-content .wp-block-file:lang(hi-IN), .entry .entry-content .wp-block-file .wp-block-file__button:lang(hi-IN), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(hi-IN), .wp-caption-text:lang(hi-IN), .gallery-caption:lang(hi-IN) { + font-family: Arial, sans-serif; +} + +body:lang(mr), button:lang(mr), +input:lang(mr), +select:lang(mr), +optgroup:lang(mr), +textarea:lang(mr), .author-description .author-link:lang(mr), +.comment-metadata:lang(mr), +.comment-reply-link:lang(mr), +.comments-title:lang(mr), +.comment-author .fn:lang(mr), +.discussion-meta-info:lang(mr), +.entry-meta:lang(mr), +.entry-footer:lang(mr), +.main-navigation:lang(mr), +.no-comments:lang(mr), +.not-found .page-title:lang(mr), +.error-404 .page-title:lang(mr), +.post-navigation .post-title:lang(mr), +.page-links:lang(mr), +.page-description:lang(mr), +.pagination .nav-links:lang(mr), +.sticky-post:lang(mr), +.site-title:lang(mr), +.site-info:lang(mr), +#cancel-comment-reply-link:lang(mr), +h1:lang(mr), +h2:lang(mr), +h3:lang(mr), +h4:lang(mr), +h5:lang(mr), +h6:lang(mr), .page-title:lang(mr), blockquote cite:lang(mr), table:lang(mr), .button:lang(mr), +input:lang(mr)[type="button"], +input:lang(mr)[type="reset"], +input:lang(mr)[type="submit"], .comment-navigation .nav-previous:lang(mr), +.comment-navigation .nav-next:lang(mr), .comment-list .pingback .comment-body:lang(mr), +.comment-list .trackback .comment-body:lang(mr), .comment-list .pingback .comment-body .comment-edit-link:lang(mr), +.comment-list .trackback .comment-body .comment-edit-link:lang(mr), .comment-form .comment-notes:lang(mr), +.comment-form label:lang(mr), .widget_archive ul li:lang(mr), +.widget_categories ul li:lang(mr), +.widget_meta ul li:lang(mr), +.widget_nav_menu ul li:lang(mr), +.widget_pages ul li:lang(mr), +.widget_recent_comments ul li:lang(mr), +.widget_recent_entries ul li:lang(mr), +.widget_rss ul li:lang(mr), .widget_tag_cloud .tagcloud:lang(mr), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(mr), .entry .entry-content .wp-block-button .wp-block-button__link:lang(mr), .entry .entry-content .wp-block-archives li > a:lang(mr), +.entry .entry-content .wp-block-categories li > a:lang(mr), +.entry .entry-content .wp-block-latest-posts li > a:lang(mr), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(mr), .entry .entry-content .wp-block-verse:lang(mr), .entry .entry-content .has-drop-cap:lang(mr):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(mr), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(mr), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(mr), +.entry .entry-content .wp-block-cover-image h2:lang(mr), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(mr), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(mr), +.entry .entry-content .wp-block-cover h2:lang(mr), .entry .entry-content .wp-block-audio figcaption:lang(mr), +.entry .entry-content .wp-block-video figcaption:lang(mr), +.entry .entry-content .wp-block-image figcaption:lang(mr), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(mr), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(mr), .entry .entry-content .wp-block-file:lang(mr), .entry .entry-content .wp-block-file .wp-block-file__button:lang(mr), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(mr), .wp-caption-text:lang(mr), .gallery-caption:lang(mr) { + font-family: Arial, sans-serif; +} + +body:lang(ne-NP), button:lang(ne-NP), +input:lang(ne-NP), +select:lang(ne-NP), +optgroup:lang(ne-NP), +textarea:lang(ne-NP), .author-description .author-link:lang(ne-NP), +.comment-metadata:lang(ne-NP), +.comment-reply-link:lang(ne-NP), +.comments-title:lang(ne-NP), +.comment-author .fn:lang(ne-NP), +.discussion-meta-info:lang(ne-NP), +.entry-meta:lang(ne-NP), +.entry-footer:lang(ne-NP), +.main-navigation:lang(ne-NP), +.no-comments:lang(ne-NP), +.not-found .page-title:lang(ne-NP), +.error-404 .page-title:lang(ne-NP), +.post-navigation .post-title:lang(ne-NP), +.page-links:lang(ne-NP), +.page-description:lang(ne-NP), +.pagination .nav-links:lang(ne-NP), +.sticky-post:lang(ne-NP), +.site-title:lang(ne-NP), +.site-info:lang(ne-NP), +#cancel-comment-reply-link:lang(ne-NP), +h1:lang(ne-NP), +h2:lang(ne-NP), +h3:lang(ne-NP), +h4:lang(ne-NP), +h5:lang(ne-NP), +h6:lang(ne-NP), .page-title:lang(ne-NP), blockquote cite:lang(ne-NP), table:lang(ne-NP), .button:lang(ne-NP), +input:lang(ne-NP)[type="button"], +input:lang(ne-NP)[type="reset"], +input:lang(ne-NP)[type="submit"], .comment-navigation .nav-previous:lang(ne-NP), +.comment-navigation .nav-next:lang(ne-NP), .comment-list .pingback .comment-body:lang(ne-NP), +.comment-list .trackback .comment-body:lang(ne-NP), .comment-list .pingback .comment-body .comment-edit-link:lang(ne-NP), +.comment-list .trackback .comment-body .comment-edit-link:lang(ne-NP), .comment-form .comment-notes:lang(ne-NP), +.comment-form label:lang(ne-NP), .widget_archive ul li:lang(ne-NP), +.widget_categories ul li:lang(ne-NP), +.widget_meta ul li:lang(ne-NP), +.widget_nav_menu ul li:lang(ne-NP), +.widget_pages ul li:lang(ne-NP), +.widget_recent_comments ul li:lang(ne-NP), +.widget_recent_entries ul li:lang(ne-NP), +.widget_rss ul li:lang(ne-NP), .widget_tag_cloud .tagcloud:lang(ne-NP), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ne-NP), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ne-NP), .entry .entry-content .wp-block-archives li > a:lang(ne-NP), +.entry .entry-content .wp-block-categories li > a:lang(ne-NP), +.entry .entry-content .wp-block-latest-posts li > a:lang(ne-NP), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ne-NP), .entry .entry-content .wp-block-verse:lang(ne-NP), .entry .entry-content .has-drop-cap:lang(ne-NP):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ne-NP), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ne-NP), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ne-NP), +.entry .entry-content .wp-block-cover-image h2:lang(ne-NP), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ne-NP), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ne-NP), +.entry .entry-content .wp-block-cover h2:lang(ne-NP), .entry .entry-content .wp-block-audio figcaption:lang(ne-NP), +.entry .entry-content .wp-block-video figcaption:lang(ne-NP), +.entry .entry-content .wp-block-image figcaption:lang(ne-NP), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ne-NP), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ne-NP), .entry .entry-content .wp-block-file:lang(ne-NP), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ne-NP), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ne-NP), .wp-caption-text:lang(ne-NP), .gallery-caption:lang(ne-NP) { + font-family: Arial, sans-serif; +} + +body:lang(el), button:lang(el), +input:lang(el), +select:lang(el), +optgroup:lang(el), +textarea:lang(el), .author-description .author-link:lang(el), +.comment-metadata:lang(el), +.comment-reply-link:lang(el), +.comments-title:lang(el), +.comment-author .fn:lang(el), +.discussion-meta-info:lang(el), +.entry-meta:lang(el), +.entry-footer:lang(el), +.main-navigation:lang(el), +.no-comments:lang(el), +.not-found .page-title:lang(el), +.error-404 .page-title:lang(el), +.post-navigation .post-title:lang(el), +.page-links:lang(el), +.page-description:lang(el), +.pagination .nav-links:lang(el), +.sticky-post:lang(el), +.site-title:lang(el), +.site-info:lang(el), +#cancel-comment-reply-link:lang(el), +h1:lang(el), +h2:lang(el), +h3:lang(el), +h4:lang(el), +h5:lang(el), +h6:lang(el), .page-title:lang(el), blockquote cite:lang(el), table:lang(el), .button:lang(el), +input:lang(el)[type="button"], +input:lang(el)[type="reset"], +input:lang(el)[type="submit"], .comment-navigation .nav-previous:lang(el), +.comment-navigation .nav-next:lang(el), .comment-list .pingback .comment-body:lang(el), +.comment-list .trackback .comment-body:lang(el), .comment-list .pingback .comment-body .comment-edit-link:lang(el), +.comment-list .trackback .comment-body .comment-edit-link:lang(el), .comment-form .comment-notes:lang(el), +.comment-form label:lang(el), .widget_archive ul li:lang(el), +.widget_categories ul li:lang(el), +.widget_meta ul li:lang(el), +.widget_nav_menu ul li:lang(el), +.widget_pages ul li:lang(el), +.widget_recent_comments ul li:lang(el), +.widget_recent_entries ul li:lang(el), +.widget_rss ul li:lang(el), .widget_tag_cloud .tagcloud:lang(el), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(el), .entry .entry-content .wp-block-button .wp-block-button__link:lang(el), .entry .entry-content .wp-block-archives li > a:lang(el), +.entry .entry-content .wp-block-categories li > a:lang(el), +.entry .entry-content .wp-block-latest-posts li > a:lang(el), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(el), .entry .entry-content .wp-block-verse:lang(el), .entry .entry-content .has-drop-cap:lang(el):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(el), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(el), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(el), +.entry .entry-content .wp-block-cover-image h2:lang(el), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(el), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(el), +.entry .entry-content .wp-block-cover h2:lang(el), .entry .entry-content .wp-block-audio figcaption:lang(el), +.entry .entry-content .wp-block-video figcaption:lang(el), +.entry .entry-content .wp-block-image figcaption:lang(el), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(el), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(el), .entry .entry-content .wp-block-file:lang(el), .entry .entry-content .wp-block-file .wp-block-file__button:lang(el), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(el), .wp-caption-text:lang(el), .gallery-caption:lang(el) { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +body:lang(gu), button:lang(gu), +input:lang(gu), +select:lang(gu), +optgroup:lang(gu), +textarea:lang(gu), .author-description .author-link:lang(gu), +.comment-metadata:lang(gu), +.comment-reply-link:lang(gu), +.comments-title:lang(gu), +.comment-author .fn:lang(gu), +.discussion-meta-info:lang(gu), +.entry-meta:lang(gu), +.entry-footer:lang(gu), +.main-navigation:lang(gu), +.no-comments:lang(gu), +.not-found .page-title:lang(gu), +.error-404 .page-title:lang(gu), +.post-navigation .post-title:lang(gu), +.page-links:lang(gu), +.page-description:lang(gu), +.pagination .nav-links:lang(gu), +.sticky-post:lang(gu), +.site-title:lang(gu), +.site-info:lang(gu), +#cancel-comment-reply-link:lang(gu), +h1:lang(gu), +h2:lang(gu), +h3:lang(gu), +h4:lang(gu), +h5:lang(gu), +h6:lang(gu), .page-title:lang(gu), blockquote cite:lang(gu), table:lang(gu), .button:lang(gu), +input:lang(gu)[type="button"], +input:lang(gu)[type="reset"], +input:lang(gu)[type="submit"], .comment-navigation .nav-previous:lang(gu), +.comment-navigation .nav-next:lang(gu), .comment-list .pingback .comment-body:lang(gu), +.comment-list .trackback .comment-body:lang(gu), .comment-list .pingback .comment-body .comment-edit-link:lang(gu), +.comment-list .trackback .comment-body .comment-edit-link:lang(gu), .comment-form .comment-notes:lang(gu), +.comment-form label:lang(gu), .widget_archive ul li:lang(gu), +.widget_categories ul li:lang(gu), +.widget_meta ul li:lang(gu), +.widget_nav_menu ul li:lang(gu), +.widget_pages ul li:lang(gu), +.widget_recent_comments ul li:lang(gu), +.widget_recent_entries ul li:lang(gu), +.widget_rss ul li:lang(gu), .widget_tag_cloud .tagcloud:lang(gu), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(gu), .entry .entry-content .wp-block-button .wp-block-button__link:lang(gu), .entry .entry-content .wp-block-archives li > a:lang(gu), +.entry .entry-content .wp-block-categories li > a:lang(gu), +.entry .entry-content .wp-block-latest-posts li > a:lang(gu), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(gu), .entry .entry-content .wp-block-verse:lang(gu), .entry .entry-content .has-drop-cap:lang(gu):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(gu), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(gu), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(gu), +.entry .entry-content .wp-block-cover-image h2:lang(gu), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(gu), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(gu), +.entry .entry-content .wp-block-cover h2:lang(gu), .entry .entry-content .wp-block-audio figcaption:lang(gu), +.entry .entry-content .wp-block-video figcaption:lang(gu), +.entry .entry-content .wp-block-image figcaption:lang(gu), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(gu), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(gu), .entry .entry-content .wp-block-file:lang(gu), .entry .entry-content .wp-block-file .wp-block-file__button:lang(gu), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(gu), .wp-caption-text:lang(gu), .gallery-caption:lang(gu) { + font-family: Arial, sans-serif; +} + +body:lang(he-IL), button:lang(he-IL), +input:lang(he-IL), +select:lang(he-IL), +optgroup:lang(he-IL), +textarea:lang(he-IL), .author-description .author-link:lang(he-IL), +.comment-metadata:lang(he-IL), +.comment-reply-link:lang(he-IL), +.comments-title:lang(he-IL), +.comment-author .fn:lang(he-IL), +.discussion-meta-info:lang(he-IL), +.entry-meta:lang(he-IL), +.entry-footer:lang(he-IL), +.main-navigation:lang(he-IL), +.no-comments:lang(he-IL), +.not-found .page-title:lang(he-IL), +.error-404 .page-title:lang(he-IL), +.post-navigation .post-title:lang(he-IL), +.page-links:lang(he-IL), +.page-description:lang(he-IL), +.pagination .nav-links:lang(he-IL), +.sticky-post:lang(he-IL), +.site-title:lang(he-IL), +.site-info:lang(he-IL), +#cancel-comment-reply-link:lang(he-IL), +h1:lang(he-IL), +h2:lang(he-IL), +h3:lang(he-IL), +h4:lang(he-IL), +h5:lang(he-IL), +h6:lang(he-IL), .page-title:lang(he-IL), blockquote cite:lang(he-IL), table:lang(he-IL), .button:lang(he-IL), +input:lang(he-IL)[type="button"], +input:lang(he-IL)[type="reset"], +input:lang(he-IL)[type="submit"], .comment-navigation .nav-previous:lang(he-IL), +.comment-navigation .nav-next:lang(he-IL), .comment-list .pingback .comment-body:lang(he-IL), +.comment-list .trackback .comment-body:lang(he-IL), .comment-list .pingback .comment-body .comment-edit-link:lang(he-IL), +.comment-list .trackback .comment-body .comment-edit-link:lang(he-IL), .comment-form .comment-notes:lang(he-IL), +.comment-form label:lang(he-IL), .widget_archive ul li:lang(he-IL), +.widget_categories ul li:lang(he-IL), +.widget_meta ul li:lang(he-IL), +.widget_nav_menu ul li:lang(he-IL), +.widget_pages ul li:lang(he-IL), +.widget_recent_comments ul li:lang(he-IL), +.widget_recent_entries ul li:lang(he-IL), +.widget_rss ul li:lang(he-IL), .widget_tag_cloud .tagcloud:lang(he-IL), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(he-IL), .entry .entry-content .wp-block-button .wp-block-button__link:lang(he-IL), .entry .entry-content .wp-block-archives li > a:lang(he-IL), +.entry .entry-content .wp-block-categories li > a:lang(he-IL), +.entry .entry-content .wp-block-latest-posts li > a:lang(he-IL), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(he-IL), .entry .entry-content .wp-block-verse:lang(he-IL), .entry .entry-content .has-drop-cap:lang(he-IL):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(he-IL), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(he-IL), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(he-IL), +.entry .entry-content .wp-block-cover-image h2:lang(he-IL), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(he-IL), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(he-IL), +.entry .entry-content .wp-block-cover h2:lang(he-IL), .entry .entry-content .wp-block-audio figcaption:lang(he-IL), +.entry .entry-content .wp-block-video figcaption:lang(he-IL), +.entry .entry-content .wp-block-image figcaption:lang(he-IL), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(he-IL), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(he-IL), .entry .entry-content .wp-block-file:lang(he-IL), .entry .entry-content .wp-block-file .wp-block-file__button:lang(he-IL), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(he-IL), .wp-caption-text:lang(he-IL), .gallery-caption:lang(he-IL) { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +body:lang(ja), button:lang(ja), +input:lang(ja), +select:lang(ja), +optgroup:lang(ja), +textarea:lang(ja), .author-description .author-link:lang(ja), +.comment-metadata:lang(ja), +.comment-reply-link:lang(ja), +.comments-title:lang(ja), +.comment-author .fn:lang(ja), +.discussion-meta-info:lang(ja), +.entry-meta:lang(ja), +.entry-footer:lang(ja), +.main-navigation:lang(ja), +.no-comments:lang(ja), +.not-found .page-title:lang(ja), +.error-404 .page-title:lang(ja), +.post-navigation .post-title:lang(ja), +.page-links:lang(ja), +.page-description:lang(ja), +.pagination .nav-links:lang(ja), +.sticky-post:lang(ja), +.site-title:lang(ja), +.site-info:lang(ja), +#cancel-comment-reply-link:lang(ja), +h1:lang(ja), +h2:lang(ja), +h3:lang(ja), +h4:lang(ja), +h5:lang(ja), +h6:lang(ja), .page-title:lang(ja), blockquote cite:lang(ja), table:lang(ja), .button:lang(ja), +input:lang(ja)[type="button"], +input:lang(ja)[type="reset"], +input:lang(ja)[type="submit"], .comment-navigation .nav-previous:lang(ja), +.comment-navigation .nav-next:lang(ja), .comment-list .pingback .comment-body:lang(ja), +.comment-list .trackback .comment-body:lang(ja), .comment-list .pingback .comment-body .comment-edit-link:lang(ja), +.comment-list .trackback .comment-body .comment-edit-link:lang(ja), .comment-form .comment-notes:lang(ja), +.comment-form label:lang(ja), .widget_archive ul li:lang(ja), +.widget_categories ul li:lang(ja), +.widget_meta ul li:lang(ja), +.widget_nav_menu ul li:lang(ja), +.widget_pages ul li:lang(ja), +.widget_recent_comments ul li:lang(ja), +.widget_recent_entries ul li:lang(ja), +.widget_rss ul li:lang(ja), .widget_tag_cloud .tagcloud:lang(ja), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ja), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ja), .entry .entry-content .wp-block-archives li > a:lang(ja), +.entry .entry-content .wp-block-categories li > a:lang(ja), +.entry .entry-content .wp-block-latest-posts li > a:lang(ja), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ja), .entry .entry-content .wp-block-verse:lang(ja), .entry .entry-content .has-drop-cap:lang(ja):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ja), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ja), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ja), +.entry .entry-content .wp-block-cover-image h2:lang(ja), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ja), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ja), +.entry .entry-content .wp-block-cover h2:lang(ja), .entry .entry-content .wp-block-audio figcaption:lang(ja), +.entry .entry-content .wp-block-video figcaption:lang(ja), +.entry .entry-content .wp-block-image figcaption:lang(ja), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ja), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ja), .entry .entry-content .wp-block-file:lang(ja), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ja), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ja), .wp-caption-text:lang(ja), .gallery-caption:lang(ja) { + font-family: -apple-system, BlinkMacSystemFont, "Hiragino Sans", Meiryo, "Helvetica Neue", sans-serif; +} + +body:lang(ko-KR), button:lang(ko-KR), +input:lang(ko-KR), +select:lang(ko-KR), +optgroup:lang(ko-KR), +textarea:lang(ko-KR), .author-description .author-link:lang(ko-KR), +.comment-metadata:lang(ko-KR), +.comment-reply-link:lang(ko-KR), +.comments-title:lang(ko-KR), +.comment-author .fn:lang(ko-KR), +.discussion-meta-info:lang(ko-KR), +.entry-meta:lang(ko-KR), +.entry-footer:lang(ko-KR), +.main-navigation:lang(ko-KR), +.no-comments:lang(ko-KR), +.not-found .page-title:lang(ko-KR), +.error-404 .page-title:lang(ko-KR), +.post-navigation .post-title:lang(ko-KR), +.page-links:lang(ko-KR), +.page-description:lang(ko-KR), +.pagination .nav-links:lang(ko-KR), +.sticky-post:lang(ko-KR), +.site-title:lang(ko-KR), +.site-info:lang(ko-KR), +#cancel-comment-reply-link:lang(ko-KR), +h1:lang(ko-KR), +h2:lang(ko-KR), +h3:lang(ko-KR), +h4:lang(ko-KR), +h5:lang(ko-KR), +h6:lang(ko-KR), .page-title:lang(ko-KR), blockquote cite:lang(ko-KR), table:lang(ko-KR), .button:lang(ko-KR), +input:lang(ko-KR)[type="button"], +input:lang(ko-KR)[type="reset"], +input:lang(ko-KR)[type="submit"], .comment-navigation .nav-previous:lang(ko-KR), +.comment-navigation .nav-next:lang(ko-KR), .comment-list .pingback .comment-body:lang(ko-KR), +.comment-list .trackback .comment-body:lang(ko-KR), .comment-list .pingback .comment-body .comment-edit-link:lang(ko-KR), +.comment-list .trackback .comment-body .comment-edit-link:lang(ko-KR), .comment-form .comment-notes:lang(ko-KR), +.comment-form label:lang(ko-KR), .widget_archive ul li:lang(ko-KR), +.widget_categories ul li:lang(ko-KR), +.widget_meta ul li:lang(ko-KR), +.widget_nav_menu ul li:lang(ko-KR), +.widget_pages ul li:lang(ko-KR), +.widget_recent_comments ul li:lang(ko-KR), +.widget_recent_entries ul li:lang(ko-KR), +.widget_rss ul li:lang(ko-KR), .widget_tag_cloud .tagcloud:lang(ko-KR), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(ko-KR), .entry .entry-content .wp-block-button .wp-block-button__link:lang(ko-KR), .entry .entry-content .wp-block-archives li > a:lang(ko-KR), +.entry .entry-content .wp-block-categories li > a:lang(ko-KR), +.entry .entry-content .wp-block-latest-posts li > a:lang(ko-KR), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(ko-KR), .entry .entry-content .wp-block-verse:lang(ko-KR), .entry .entry-content .has-drop-cap:lang(ko-KR):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(ko-KR), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(ko-KR), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(ko-KR), +.entry .entry-content .wp-block-cover-image h2:lang(ko-KR), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(ko-KR), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(ko-KR), +.entry .entry-content .wp-block-cover h2:lang(ko-KR), .entry .entry-content .wp-block-audio figcaption:lang(ko-KR), +.entry .entry-content .wp-block-video figcaption:lang(ko-KR), +.entry .entry-content .wp-block-image figcaption:lang(ko-KR), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(ko-KR), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(ko-KR), .entry .entry-content .wp-block-file:lang(ko-KR), .entry .entry-content .wp-block-file .wp-block-file__button:lang(ko-KR), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(ko-KR), .wp-caption-text:lang(ko-KR), .gallery-caption:lang(ko-KR) { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +body:lang(th), button:lang(th), +input:lang(th), +select:lang(th), +optgroup:lang(th), +textarea:lang(th), .author-description .author-link:lang(th), +.comment-metadata:lang(th), +.comment-reply-link:lang(th), +.comments-title:lang(th), +.comment-author .fn:lang(th), +.discussion-meta-info:lang(th), +.entry-meta:lang(th), +.entry-footer:lang(th), +.main-navigation:lang(th), +.no-comments:lang(th), +.not-found .page-title:lang(th), +.error-404 .page-title:lang(th), +.post-navigation .post-title:lang(th), +.page-links:lang(th), +.page-description:lang(th), +.pagination .nav-links:lang(th), +.sticky-post:lang(th), +.site-title:lang(th), +.site-info:lang(th), +#cancel-comment-reply-link:lang(th), +h1:lang(th), +h2:lang(th), +h3:lang(th), +h4:lang(th), +h5:lang(th), +h6:lang(th), .page-title:lang(th), blockquote cite:lang(th), table:lang(th), .button:lang(th), +input:lang(th)[type="button"], +input:lang(th)[type="reset"], +input:lang(th)[type="submit"], .comment-navigation .nav-previous:lang(th), +.comment-navigation .nav-next:lang(th), .comment-list .pingback .comment-body:lang(th), +.comment-list .trackback .comment-body:lang(th), .comment-list .pingback .comment-body .comment-edit-link:lang(th), +.comment-list .trackback .comment-body .comment-edit-link:lang(th), .comment-form .comment-notes:lang(th), +.comment-form label:lang(th), .widget_archive ul li:lang(th), +.widget_categories ul li:lang(th), +.widget_meta ul li:lang(th), +.widget_nav_menu ul li:lang(th), +.widget_pages ul li:lang(th), +.widget_recent_comments ul li:lang(th), +.widget_recent_entries ul li:lang(th), +.widget_rss ul li:lang(th), .widget_tag_cloud .tagcloud:lang(th), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(th), .entry .entry-content .wp-block-button .wp-block-button__link:lang(th), .entry .entry-content .wp-block-archives li > a:lang(th), +.entry .entry-content .wp-block-categories li > a:lang(th), +.entry .entry-content .wp-block-latest-posts li > a:lang(th), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(th), .entry .entry-content .wp-block-verse:lang(th), .entry .entry-content .has-drop-cap:lang(th):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(th), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(th), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(th), +.entry .entry-content .wp-block-cover-image h2:lang(th), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(th), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(th), +.entry .entry-content .wp-block-cover h2:lang(th), .entry .entry-content .wp-block-audio figcaption:lang(th), +.entry .entry-content .wp-block-video figcaption:lang(th), +.entry .entry-content .wp-block-image figcaption:lang(th), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(th), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(th), .entry .entry-content .wp-block-file:lang(th), .entry .entry-content .wp-block-file .wp-block-file__button:lang(th), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(th), .wp-caption-text:lang(th), .gallery-caption:lang(th) { + font-family: "Sukhumvit Set", "Helvetica Neue", helvetica, arial, sans-serif; +} + +body:lang(vi), button:lang(vi), +input:lang(vi), +select:lang(vi), +optgroup:lang(vi), +textarea:lang(vi), .author-description .author-link:lang(vi), +.comment-metadata:lang(vi), +.comment-reply-link:lang(vi), +.comments-title:lang(vi), +.comment-author .fn:lang(vi), +.discussion-meta-info:lang(vi), +.entry-meta:lang(vi), +.entry-footer:lang(vi), +.main-navigation:lang(vi), +.no-comments:lang(vi), +.not-found .page-title:lang(vi), +.error-404 .page-title:lang(vi), +.post-navigation .post-title:lang(vi), +.page-links:lang(vi), +.page-description:lang(vi), +.pagination .nav-links:lang(vi), +.sticky-post:lang(vi), +.site-title:lang(vi), +.site-info:lang(vi), +#cancel-comment-reply-link:lang(vi), +h1:lang(vi), +h2:lang(vi), +h3:lang(vi), +h4:lang(vi), +h5:lang(vi), +h6:lang(vi), .page-title:lang(vi), blockquote cite:lang(vi), table:lang(vi), .button:lang(vi), +input:lang(vi)[type="button"], +input:lang(vi)[type="reset"], +input:lang(vi)[type="submit"], .comment-navigation .nav-previous:lang(vi), +.comment-navigation .nav-next:lang(vi), .comment-list .pingback .comment-body:lang(vi), +.comment-list .trackback .comment-body:lang(vi), .comment-list .pingback .comment-body .comment-edit-link:lang(vi), +.comment-list .trackback .comment-body .comment-edit-link:lang(vi), .comment-form .comment-notes:lang(vi), +.comment-form label:lang(vi), .widget_archive ul li:lang(vi), +.widget_categories ul li:lang(vi), +.widget_meta ul li:lang(vi), +.widget_nav_menu ul li:lang(vi), +.widget_pages ul li:lang(vi), +.widget_recent_comments ul li:lang(vi), +.widget_recent_entries ul li:lang(vi), +.widget_rss ul li:lang(vi), .widget_tag_cloud .tagcloud:lang(vi), .widget_calendar .calendar_wrap .wp-calendar-nav:lang(vi), .entry .entry-content .wp-block-button .wp-block-button__link:lang(vi), .entry .entry-content .wp-block-archives li > a:lang(vi), +.entry .entry-content .wp-block-categories li > a:lang(vi), +.entry .entry-content .wp-block-latest-posts li > a:lang(vi), .entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date:lang(vi), .entry .entry-content .wp-block-verse:lang(vi), .entry .entry-content .has-drop-cap:lang(vi):not(:focus):first-letter, .entry .entry-content .wp-block-pullquote cite:lang(vi), .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text:lang(vi), +.entry .entry-content .wp-block-cover-image .wp-block-cover-text:lang(vi), +.entry .entry-content .wp-block-cover-image h2:lang(vi), +.entry .entry-content .wp-block-cover .wp-block-cover-image-text:lang(vi), +.entry .entry-content .wp-block-cover .wp-block-cover-text:lang(vi), +.entry .entry-content .wp-block-cover h2:lang(vi), .entry .entry-content .wp-block-audio figcaption:lang(vi), +.entry .entry-content .wp-block-video figcaption:lang(vi), +.entry .entry-content .wp-block-image figcaption:lang(vi), +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption:lang(vi), +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption:lang(vi), .entry .entry-content .wp-block-file:lang(vi), .entry .entry-content .wp-block-file .wp-block-file__button:lang(vi), .entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta:lang(vi), .wp-caption-text:lang(vi), .gallery-caption:lang(vi) { + font-family: "Libre Franklin", sans-serif; +} + +/* Normalize */ +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */ +/* 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; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.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; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ +} + +/** + * 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; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * Remove the gray background on active links in IE 10. + */ +a { + background-color: 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; + /* 1 */ + text-decoration: underline; + /* 2 */ + text-decoration: underline dotted; + /* 2 */ +} + +/** + * 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; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** + * 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: -0.25em; +} + +sup { + top: -0.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; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + 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: 0.35em 0.75em 0.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; + /* 1 */ + color: inherit; + /* 2 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + white-space: normal; + /* 1 */ +} + +/** + * 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; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * 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; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** + * 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; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* 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; +} + +/* Typography */ +html { + font-size: 22px; +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #111; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: 400; + font-size: 1em; + line-height: 1.8; + margin: 0; + text-rendering: optimizeLegibility; +} + +button, +input, +select, +optgroup, +textarea { + color: #111; + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: 400; + line-height: 1.8; + text-rendering: optimizeLegibility; +} + +.author-description .author-link, +.comment-metadata, +.comment-reply-link, +.comments-title, +.comment-author .fn, +.discussion-meta-info, +.entry-meta, +.entry-footer, +.main-navigation, +.no-comments, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.page-links, +.page-description, +.pagination .nav-links, +.sticky-post, +.site-title, +.site-info, +#cancel-comment-reply-link, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.main-navigation, +.page-description, +.author-description .author-link, +.not-found .page-title, +.error-404 .page-title, +.post-navigation .post-title, +.pagination .nav-links, +.comments-title, +.comment-author .fn, +.no-comments, +.site-title, +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.2; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.page-title { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; +} + +.site-branding, +.main-navigation ul.main-menu > li, +.social-navigation, +.author-description .author-bio, +.nav-links { + line-height: 1.25; +} + +h1 { + font-size: 2.25em; +} + +@media only screen and (min-width: 768px) { + h1 { + font-size: 2.8125em; + } +} + +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.has-larger-font-size, +h2 { + font-size: 1.6875em; +} + +@media only screen and (min-width: 768px) { + .entry-title, + .not-found .page-title, + .error-404 .page-title, + .has-larger-font-size, + h2 { + font-size: 2.25em; + } +} + +.has-regular-font-size, +.has-large-font-size, +.comments-title, +h3 { + font-size: 1.6875em; +} + +.site-title, +.site-description, +.main-navigation, +.nav-links, +.page-title, +.page-description, +.comment-author .fn, +.no-comments, +h2.author-title, +p.author-bio, +h4 { + font-size: 1.125em; +} + +.pagination .nav-links, +.comment-content, +h5 { + font-size: 0.88889em; +} + +.entry-meta, +.entry-footer, +.discussion-meta-info, +.site-info, +.has-small-font-size, +.comment-reply-link, +.comment-metadata, +.comment-notes, +.sticky-post, +#cancel-comment-reply-link, +img:after, +h6 { + font-size: 0.71111em; +} + +.site-title, +.page-title { + font-weight: normal; +} + +.page-description, +.page-links a { + font-weight: bold; +} + +.site-description { + letter-spacing: -0.01em; +} + +.post-navigation .post-title, +.entry-title, +.not-found .page-title, +.error-404 .page-title, +.comments-title, +blockquote { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-break: break-word; + word-wrap: break-word; +} + +/* Do not hyphenate entry title on tablet view and bigger. */ +@media only screen and (min-width: 768px) { + .entry-title { + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + } +} + +p { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote cite { + font-size: 0.71111em; + font-style: normal; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +pre { + font-size: 0.88889em; + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 1.8; + overflow: auto; +} + +code, +kbd, +tt, +var { + font-size: 0.88889em; + font-family: Menlo, monaco, Consolas, Lucida Console, monospace; +} + +abbr, acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #fff9c0; + text-decoration: none; +} + +big { + font-size: 125%; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration: none; +} + +a:focus { + text-decoration: underline; +} + +/* Elements */ +html { + box-sizing: border-box; +} + +::-moz-selection { + background-color: #bfdcea; +} + +::selection { + background-color: #bfdcea; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + background-color: #fff; +} + +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:hover, +a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin; + outline-style: dotted; + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + margin: 1rem 0; +} + +h1:not(.site-title):before, +h2:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +h1:not(.site-title).has-text-align-center:before, +h2.has-text-align-center:before { + margin-left: auto; + margin-right: auto; +} + +h1:not(.site-title).has-text-align-right:before, +h2.has-text-align-right:before { + margin-left: auto; +} + +hr { + background-color: #767676; + border: 0; + height: 2px; +} + +ul, +ol { + padding-left: 1rem; +} + +ul { + list-style: disc; +} + +ul ul { + list-style-type: circle; +} + +ol { + list-style: decimal; +} + +li { + line-height: 1.8; +} + +li > ul, +li > ol { + padding-left: 2rem; +} + +dt { + font-weight: bold; +} + +dd { + margin: 0 1rem 1rem; +} + +img { + height: auto; + max-width: 100%; + position: relative; +} + +figure { + margin: 0; +} + +blockquote { + border-left: 2px solid #0073aa; + margin-left: 0; + padding: 0 0 0 1rem; +} + +blockquote > p { + margin: 0 0 1rem; +} + +blockquote cite { + color: #767676; +} + +table { + margin: 0 0 1rem; + border-collapse: collapse; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +table td, +table th { + padding: 0.5em; + border: 1px solid #767676; + word-break: break-all; +} + +/* Forms */ +.button, +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + transition: background 150ms ease-in-out; + background: #0073aa; + border: none; + border-radius: 5px; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.88889em; + font-weight: 700; + line-height: 1.2; + outline: none; + padding: 0.76rem 1rem; + text-decoration: none; + vertical-align: bottom; +} + +.button:hover, +button:hover, +input[type="button"]:hover, +input[type="reset"]:hover, +input[type="submit"]:hover { + background: #111; + cursor: pointer; +} + +.button:visited, +button:visited, +input[type="button"]:visited, +input[type="reset"]:visited, +input[type="submit"]:visited { + color: #fff; + text-decoration: none; +} + +.button:focus, +button:focus, +input[type="button"]:focus, +input[type="reset"]:focus, +input[type="submit"]:focus { + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +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 { + -webkit-backface-visibility: hidden; + background: #fff; + border: solid 1px #ccc; + box-sizing: border-box; + outline: none; + padding: 0.36rem 0.66rem; + -webkit-appearance: none; + outline-offset: 0; + border-radius: 0; +} + +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 { + border-color: #0073aa; + outline: thin solid rgba(0, 115, 170, 0.15); + outline-offset: -4px; +} + +input[type="search"]::-webkit-search-decoration { + display: none; +} + +textarea { + box-sizing: border-box; + display: block; + width: 100%; + max-width: 100%; + resize: vertical; +} + +form p { + margin: 1rem 0; +} + +/* Navigation */ +/*-------------------------------------------------------------- +## Links +--------------------------------------------------------------*/ +a { + transition: color 110ms ease-in-out; + color: #0073aa; +} + +a:visited { + color: #0073aa; +} + +a:hover, +a:active { + color: #005177; + outline: 0; + text-decoration: none; +} + +a:focus { + outline: thin dotted; + text-decoration: underline; +} + +/*-------------------------------------------------------------- +## Menus +--------------------------------------------------------------*/ +/** === Main menu === */ +.main-navigation { + display: block; + margin-top: 0.25rem; + /* Un-style buttons */ + /* + * Sub-menu styles + * + * :focus-within needs its own selector so other similar + * selectors don’t get ignored if a browser doesn’t recognize it + */ + /** + * Fade-in animation for top-level submenus + */ + /** + * Off-canvas touch device styles + */ +} + +body.page .main-navigation { + display: block; +} + +.main-navigation > div { + display: inline; +} + +.main-navigation button { + display: inline-block; + border: none; + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; + line-height: 1.2; + text-decoration: none; + background: transparent; + color: inherit; + cursor: pointer; + transition: background 250ms ease-in-out, + transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; +} + +.main-navigation button:hover, .main-navigation button:focus { + background: transparent; +} + +.main-navigation button:focus { + outline: 1px solid transparent; + outline-offset: -4px; +} + +.main-navigation button:active { + transform: scale(0.99); +} + +.main-navigation .main-menu { + display: inline-block; + margin: 0; + padding: 0; +} + +.main-navigation .main-menu > li { + color: #0073aa; + display: inline; + position: relative; +} + +.main-navigation .main-menu > li > a { + font-weight: 700; + color: #0073aa; + margin-right: 0.5rem; +} + +.main-navigation .main-menu > li > a + svg { + margin-right: 0.5rem; +} + +.main-navigation .main-menu > li > a:hover, +.main-navigation .main-menu > li > a:hover + svg { + color: #005177; +} + +.main-navigation .main-menu > li.menu-item-has-children { + display: inline-block; + position: inherit; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu > li.menu-item-has-children { + position: relative; + } +} + +.main-navigation .main-menu > li.menu-item-has-children > a { + margin-right: 0.125rem; +} + +.main-navigation .main-menu > li.menu-item-has-children > a:after, +.main-navigation .main-menu > li.menu-item-has-children .menu-item-has-children > a:after { + content: ""; + display: none; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand { + display: inline-block; + margin-right: 0.25rem; + /* Priority+ Menu */ +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand.main-menu-more-toggle { + position: relative; + height: 24px; + line-height: 1.2; + width: 24px; + padding: 0; + margin-left: 0.5rem; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand.main-menu-more-toggle svg { + height: 24px; + width: 24px; + top: -0.125rem; + vertical-align: text-bottom; +} + +.wp-customizer-unloading .main-navigation .main-menu > li.menu-item-has-children .submenu-expand, .main-navigation .main-menu > li.menu-item-has-children .submenu-expand.is-empty { + display: none; +} + +.main-navigation .main-menu > li.menu-item-has-children .submenu-expand svg { + position: relative; + top: 0.2rem; +} + +.main-navigation .main-menu > li:last-child > a, +.main-navigation .main-menu > li:last-child.menu-item-has-children .submenu-expand { + margin-right: 0; +} + +.main-navigation .sub-menu { + background-color: #0073aa; + color: #fff; + list-style: none; + padding-left: 0; + position: absolute; + opacity: 0; + left: -9999px; + z-index: 99999; +} + +@media only screen and (min-width: 768px) { + .main-navigation .sub-menu { + width: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + } +} + +.main-navigation .sub-menu > li { + display: block; + float: none; + position: relative; +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand { + display: inline-block; + position: absolute; + width: calc( 24px + 1rem); + right: 0; + top: calc( .125 * 1rem); + bottom: 0; + color: white; + line-height: 1; + padding: calc( .5 * 1rem); +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand svg { + top: 0; +} + +.main-navigation .sub-menu > li.menu-item-has-children .submenu-expand { + margin-right: 0; +} + +@media only screen and (min-width: 768px) { + .main-navigation .sub-menu > li.menu-item-has-children .menu-item-has-children > a:after { + content: "\203a"; + } +} + +.main-navigation .sub-menu > li > a, +.main-navigation .sub-menu > li > .menu-item-link-return { + color: #fff; + display: block; + line-height: 1.2; + text-shadow: none; + padding: calc( .5 * 1rem) calc( 24px + 1rem) calc( .5 * 1rem) 1rem; + white-space: nowrap; +} + +.main-navigation .sub-menu > li > a:hover, .main-navigation .sub-menu > li > a:focus, +.main-navigation .sub-menu > li > .menu-item-link-return:hover, +.main-navigation .sub-menu > li > .menu-item-link-return:focus { + background: #005177; +} + +.main-navigation .sub-menu > li > a:hover:after, .main-navigation .sub-menu > li > a:focus:after, +.main-navigation .sub-menu > li > .menu-item-link-return:hover:after, +.main-navigation .sub-menu > li > .menu-item-link-return:focus:after { + background: #005177; +} + +.main-navigation .sub-menu > li > .menu-item-link-return { + width: 100%; + font-size: 22px; + font-weight: normal; + text-align: left; +} + +.main-navigation .sub-menu > li > a:empty { + display: none; +} + +.main-navigation .sub-menu > li.mobile-parent-nav-menu-item { + display: none; + font-size: 0.88889em; + font-weight: normal; +} + +.main-navigation .sub-menu > li.mobile-parent-nav-menu-item svg { + position: relative; + top: 0.2rem; + margin-right: calc( .25 * 1rem); +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu { + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu { + display: block; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu.hidden-links { + right: 0; + left: auto; + display: block; + width: max-content; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu.hidden-links { + right: 0; + left: auto; + display: block; + width: max-content; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + /* Non-mobile position */ +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + /* Non-mobile position */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas)[focus-within] > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus-within > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + display: block; + left: 0; + margin-top: 0; + opacity: 1; + width: auto; + min-width: 100%; + /* Non-mobile position */ + /* Nested sub-menu dashes */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu { + display: block; + float: none; + margin-top: 0; + opacity: 1; + position: absolute; + left: 0; + right: auto; + top: auto; + bottom: auto; + height: auto; + min-width: -moz-max-content; + min-width: -webkit-max-content; + min-width: max-content; + transform: none; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu.hidden-links, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu.hidden-links, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu.hidden-links { + left: 0; + width: 100%; + display: table; + position: absolute; +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu.hidden-links, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu.hidden-links, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu.hidden-links { + right: 0; + left: auto; + display: table; + width: max-content; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .submenu-expand, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .submenu-expand, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .submenu-expand { + display: none; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + display: block; + margin-top: inherit; + position: relative; + width: 100%; + left: 0; + opacity: 1; + /* Non-mobile position */ +} + +@media only screen and (min-width: 768px) { + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, + .main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, + .main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + float: none; + max-width: 100%; + } +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu { + counter-reset: submenu; +} + +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):hover > .sub-menu .sub-menu > li > a::before, +.main-navigation .main-menu .menu-item-has-children:not(.off-canvas):focus > .sub-menu .sub-menu > li > a::before, +.main-navigation .main-menu .menu-item-has-children.is-focused:not(.off-canvas) > .sub-menu .sub-menu > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.main-navigation .main-menu > .menu-item-has-children:not(.off-canvas):hover > .sub-menu { + animation: fade_in 0.1s forwards; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu .submenu-expand .svg-icon { + transform: rotate(270deg); +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu .sub-menu { + opacity: 0; + position: absolute; + z-index: 0; + transform: translateX(-100%); +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li:hover, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li:focus, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li > a:hover, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu li > a:focus { + background-color: transparent; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu > li > a, +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu > li > .menu-item-link-return { + white-space: inherit; +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + display: table; + margin-top: 0; + opacity: 1; + padding-left: 0; + /* Mobile position */ + left: 0; + top: 0; + right: 0; + bottom: 0; + position: fixed; + z-index: 100000; + /* Make sure appears above mobile admin bar */ + width: 100vw; + height: 100vh; + max-width: 100vw; + transform: translateX(100%); + animation: slide_in_right 0.3s forwards; + /* Prevent menu from being blocked by admin bar */ +} + +.main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true > .mobile-parent-nav-menu-item { + display: block; +} + +.admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + top: 46px; + height: calc( 100vh - 46px); + /* WP core breakpoint */ +} + +.admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true .sub-menu.expanded-true { + top: 0; +} + +@media only screen and (min-width: 782px) { + .admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true { + top: 32px; + height: calc( 100vh - 32px); + } + .admin-bar .main-navigation .main-menu .menu-item-has-children.off-canvas .sub-menu.expanded-true .sub-menu.expanded-true { + top: 0; + } +} + +.main-navigation .main-menu-more:nth-child(n+3) { + display: none; +} + +/* Menu animation */ +@keyframes slide_in_right { + 100% { + transform: translateX(0%); + } +} + +@keyframes fade_in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* Social menu */ +.social-navigation { + margin-top: calc(1rem / 2); + text-align: left; +} + +.social-navigation ul.social-links-menu { + content: ""; + display: table; + table-layout: fixed; + display: inline-block; + margin: 0; + padding: 0; +} + +.social-navigation ul.social-links-menu li { + display: inline-block; + vertical-align: bottom; + vertical-align: -webkit-baseline-middle; + list-style: none; +} + +.social-navigation ul.social-links-menu li:nth-child(n+2) { + margin-left: 0.1em; +} + +.social-navigation ul.social-links-menu li a { + border-bottom: 1px solid transparent; + display: block; + color: #111; + margin-bottom: -1px; + transition: opacity 110ms ease-in-out; +} + +.social-navigation ul.social-links-menu li a:hover, .social-navigation ul.social-links-menu li a:active { + color: #111; + opacity: 0.6; +} + +.social-navigation ul.social-links-menu li a:focus { + color: #111; + opacity: 1; + border-bottom: 1px solid #111; +} + +.social-navigation ul.social-links-menu li a svg { + display: block; + width: 32px; + height: 32px; + transform: translateZ(0); +} + +.social-navigation ul.social-links-menu li a svg#ui-icon-link { + transform: rotate(-45deg); +} + +@media only screen and (min-width: 768px) { + .site-title + .social-navigation, + .site-description + .social-navigation { + margin-top: calc(1rem / 5); + } +} + +/** === Footer menu === */ +.footer-navigation { + display: inline; +} + +.footer-navigation > div { + display: inline; +} + +.footer-navigation .footer-menu { + display: inline; + padding-left: 0; +} + +.footer-navigation .footer-menu li { + display: inline; + margin-right: 1rem; +} + +/*-------------------------------------------------------------- +## Next / Previous +--------------------------------------------------------------*/ +/* Next/Previous navigation */ +.post-navigation { + margin: calc(3 * 1rem) 0; +} + +@media only screen and (min-width: 768px) { + .post-navigation { + margin: calc(3 * 1rem) calc(10% + 60px); + max-width: calc(6 * (100vw / 12)); + } +} + +@media only screen and (min-width: 1168px) { + .post-navigation { + margin: calc(3 * 1rem) 0; + max-width: 100%; + } +} + +.post-navigation .nav-links { + margin: 0 1rem; + max-width: 100%; + display: flex; + flex-direction: column; +} + +@media only screen and (min-width: 768px) { + .post-navigation .nav-links { + margin: 0; + } +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links { + flex-direction: row; + margin: 0 calc(10% + 60px); + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.post-navigation .nav-links a .meta-nav { + color: #767676; + user-select: none; +} + +.post-navigation .nav-links a .meta-nav:before, .post-navigation .nav-links a .meta-nav:after { + display: none; + content: "—"; + width: 2em; + color: #767676; + height: 1em; +} + +.post-navigation .nav-links a .post-title { + hyphens: auto; +} + +.post-navigation .nav-links a:hover { + color: #005177; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-previous, + .post-navigation .nav-links .nav-next { + min-width: calc(50% - 2 * 1rem); + } +} + +.post-navigation .nav-links .nav-previous { + order: 2; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-previous { + order: 1; + } +} + +.post-navigation .nav-links .nav-previous + .nav-next { + margin-bottom: 1rem; +} + +.post-navigation .nav-links .nav-previous .meta-nav:before { + display: inline; +} + +.post-navigation .nav-links .nav-next { + order: 1; +} + +@media only screen and (min-width: 1168px) { + .post-navigation .nav-links .nav-next { + order: 2; + padding-left: 1rem; + } +} + +.post-navigation .nav-links .nav-next .meta-nav:after { + display: inline; +} + +.pagination .nav-links { + display: flex; + flex-wrap: wrap; + padding: 0 calc(.5 * 1rem); +} + +.pagination .nav-links > * { + padding: calc(.5 * 1rem); +} + +.pagination .nav-links > *.dots, .pagination .nav-links > *.prev { + padding-left: 0; +} + +.pagination .nav-links > *.dots, .pagination .nav-links > *.next { + padding-right: 0; +} + +.pagination .nav-links a:focus { + text-decoration: underline; + outline-offset: -1px; +} + +.pagination .nav-links a:focus.prev, .pagination .nav-links a:focus.next { + text-decoration: none; +} + +.pagination .nav-links a:focus.prev .nav-prev-text, +.pagination .nav-links a:focus.prev .nav-next-text, .pagination .nav-links a:focus.next .nav-prev-text, +.pagination .nav-links a:focus.next .nav-next-text { + text-decoration: underline; +} + +.pagination .nav-links .nav-next-text, +.pagination .nav-links .nav-prev-text { + display: none; +} + +@media only screen and (min-width: 768px) { + .pagination .nav-links { + margin-left: calc(10% + 60px); + padding: 0; + } + .pagination .nav-links .prev > *, + .pagination .nav-links .next > * { + display: inline-block; + vertical-align: text-bottom; + } + .pagination .nav-links > * { + padding: 1rem; + } +} + +.comment-navigation .nav-links { + display: flex; + flex-direction: row; +} + +.comment-navigation .nav-previous, +.comment-navigation .nav-next { + min-width: 50%; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.comment-navigation .nav-previous .secondary-text, +.comment-navigation .nav-next .secondary-text { + display: none; +} + +@media only screen and (min-width: 768px) { + .comment-navigation .nav-previous .secondary-text, + .comment-navigation .nav-next .secondary-text { + display: inline; + } +} + +.comment-navigation .nav-previous svg, +.comment-navigation .nav-next svg { + vertical-align: middle; + position: relative; + margin: 0 -0.35em; + top: -1px; +} + +.comment-navigation .nav-next { + text-align: right; +} + +/* Accessibility */ +/* Text meant only for screen readers. */ +.screen-reader-text { + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute !important; + width: 1px; + word-wrap: normal !important; + /* Many screen reader and browser combinations announce broken words as they would appear visually. */ +} + +.screen-reader-text:focus { + background-color: #f1f1f1; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + clip-path: none; + color: #21759b; + display: block; + font-size: 0.875rem; + font-weight: bold; + height: auto; + left: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; + /* Above WP toolbar. */ +} + +/* Do not show the outline on the skip link target. */ +#content[tabindex="-1"]:focus { + outline: 0; +} + +/* Alignments */ +.alignleft { + /*rtl:ignore*/ + float: left; + /*rtl:ignore*/ + margin-right: 1rem; +} + +@media only screen and (min-width: 768px) { + .alignleft { + /*rtl:ignore*/ + margin-right: calc(2 * 1rem); + } +} + +.alignright { + /*rtl:ignore*/ + float: right; + /*rtl:ignore*/ + margin-left: 1rem; +} + +@media only screen and (min-width: 768px) { + .alignright { + /*rtl:ignore*/ + margin-left: calc(2 * 1rem); + } +} + +.aligncenter { + clear: both; + display: block; + margin-left: auto; + margin-right: auto; +} + +/* Clearings */ +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.comment-content:before, +.comment-content:after, +.site-header:before, +.site-header:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after { + content: ""; + display: table; + table-layout: fixed; +} + +.clear:after, +.entry-content:after, +.comment-content:after, +.site-header:after, +.site-content:after, +.site-footer:after { + clear: both; +} + +/* Layout */ +/** === Layout === */ +#page { + width: 100%; +} + +.site-content { + overflow: hidden; +} + +/* Content */ +/*-------------------------------------------------------------- +## Header +--------------------------------------------------------------*/ +.site-header { + padding: 1em; +} + +.site-header.featured-image { + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 90vh; +} + +.site-header.featured-image .site-branding-container { + margin-bottom: auto; +} + +@media only screen and (min-width: 768px) { + .site-header { + margin: 0; + padding: 3rem 0; + } + .site-header.featured-image { + min-height: 100vh; + margin-bottom: 3rem; + } +} + +.site-branding { + color: #767676; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + position: relative; + word-wrap: break-word; +} + +@media only screen and (min-width: 768px) { + .site-branding { + margin: 0 calc(10% + 60px); + } +} + +.site-logo { + position: relative; + z-index: 999; + margin-bottom: calc(.66 * 1rem); +} + +@media only screen and (min-width: 768px) { + .site-logo { + margin-bottom: 0; + position: absolute; + right: calc(100% + (1.25 * 1rem)); + top: 4px; + z-index: 999; + } +} + +.site-logo .custom-logo-link { + border-radius: 100%; + box-sizing: content-box; + box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); + display: block; + width: 50px; + height: 50px; + overflow: hidden; + transition: box-shadow 200ms ease-in-out; +} + +.site-logo .custom-logo-link .custom-logo { + min-height: inherit; +} + +.site-logo .custom-logo-link:hover, .site-logo .custom-logo-link:active, .site-logo .custom-logo-link:focus { + box-shadow: 0 0 0 2px black; +} + +@media only screen and (min-width: 768px) { + .site-logo .custom-logo-link { + width: 64px; + height: 64px; + } +} + +.site-title { + margin: auto; + display: inline; + color: #111; + /* When there is no description set, make sure navigation appears below title. */ +} + +.site-title a { + color: #111; +} + +.site-title a:link, .site-title a:visited { + color: #111; +} + +.site-title a:hover { + color: #4a4a4a; +} + +.featured-image .site-title { + margin: 0; +} + +@media only screen and (min-width: 768px) { + .featured-image .site-title { + display: inline-block; + } +} + +.site-title + .main-navigation { + display: block; +} + +@media only screen and (min-width: 768px) { + .site-title { + display: inline; + } +} + +.site-title:not(:empty) + .site-description:not(:empty):before { + content: "\2014"; + margin: 0 .2em; +} + +.site-description { + display: inline; + color: #767676; + font-weight: normal; + margin: 0; +} + +.site-header.featured-image { + /* Hide overflow for overflowing featured image */ + overflow: hidden; + /* Need relative positioning to properly align layers. */ + position: relative; + /* Add text shadow to text, to increase readability. */ + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); + /* Set white text color when featured image is set. */ + /* add focus state to social media icons */ + /* Entry header */ + /* Custom Logo Link */ + /* Make sure important elements are above pseudo elements used for effects. */ + /* Set up image filter layer positioning */ + /* Background & Effects */ + /* Shared background settings between pseudo elements. */ + background-position: center; + background-repeat: no-repeat; + background-size: cover; + /* The intensity of each blend mode is controlled via layer opacity. */ + /* Second layer: screen. */ + /* Third layer: multiply. */ + /* When image filters are inactive, a black overlay is added. */ + /* Fourth layer: overlay. */ + /* Fifth layer: readability overlay */ +} + +.site-header.featured-image .site-branding .site-title, +.site-header.featured-image .site-branding .site-description, +.site-header.featured-image .main-navigation a:after, +.site-header.featured-image .main-navigation .main-menu > li.menu-item-has-children:after, +.site-header.featured-image .main-navigation li, +.site-header.featured-image .social-navigation li, +.site-header.featured-image .entry-meta, +.site-header.featured-image .entry-title { + color: #fff; +} + +.site-header.featured-image .main-navigation a, +.site-header.featured-image .main-navigation a + svg, +.site-header.featured-image .social-navigation a, +.site-header.featured-image .site-title a, +.site-header.featured-image .site-featured-image a { + color: #fff; + transition: opacity 110ms ease-in-out; +} + +.site-header.featured-image .main-navigation a:hover, .site-header.featured-image .main-navigation a:active, +.site-header.featured-image .main-navigation a:hover + svg, +.site-header.featured-image .main-navigation a:active + svg, +.site-header.featured-image .main-navigation a + svg:hover, +.site-header.featured-image .main-navigation a + svg:active, +.site-header.featured-image .main-navigation a + svg:hover + svg, +.site-header.featured-image .main-navigation a + svg:active + svg, +.site-header.featured-image .social-navigation a:hover, +.site-header.featured-image .social-navigation a:active, +.site-header.featured-image .social-navigation a:hover + svg, +.site-header.featured-image .social-navigation a:active + svg, +.site-header.featured-image .site-title a:hover, +.site-header.featured-image .site-title a:active, +.site-header.featured-image .site-title a:hover + svg, +.site-header.featured-image .site-title a:active + svg, +.site-header.featured-image .site-featured-image a:hover, +.site-header.featured-image .site-featured-image a:active, +.site-header.featured-image .site-featured-image a:hover + svg, +.site-header.featured-image .site-featured-image a:active + svg { + color: #fff; + opacity: 0.6; +} + +.site-header.featured-image .main-navigation a:focus, +.site-header.featured-image .main-navigation a:focus + svg, +.site-header.featured-image .main-navigation a + svg:focus, +.site-header.featured-image .main-navigation a + svg:focus + svg, +.site-header.featured-image .social-navigation a:focus, +.site-header.featured-image .social-navigation a:focus + svg, +.site-header.featured-image .site-title a:focus, +.site-header.featured-image .site-title a:focus + svg, +.site-header.featured-image .site-featured-image a:focus, +.site-header.featured-image .site-featured-image a:focus + svg { + color: #fff; +} + +.site-header.featured-image .main-navigation .sub-menu a { + opacity: inherit; +} + +.site-header.featured-image .social-navigation a:focus { + color: #fff; + opacity: 1; + border-bottom: 1px solid #fff; +} + +.site-header.featured-image .social-navigation svg, +.site-header.featured-image .site-featured-image svg { + /* Use -webkit- only if supporting: Chrome < 54, iOS < 9.3, Android < 4.4.4 */ + -webkit-filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35)); + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35)); +} + +.site-header.featured-image .site-featured-image { + /* First layer: grayscale. */ +} + +.site-header.featured-image .site-featured-image .post-thumbnail img { + height: auto; + left: 50%; + max-width: 1000%; + min-height: 100%; + min-width: 100vw; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: auto; + z-index: 1; + /* When image filters are active, make it grayscale to colorize it blue. */ +} + +@supports (object-fit: cover) { + .site-header.featured-image .site-featured-image .post-thumbnail img { + height: 100%; + left: 0; + object-fit: cover; + top: 0; + transform: none; + width: 100%; + } +} + +.image-filters-enabled .site-header.featured-image .site-featured-image .post-thumbnail img { + filter: grayscale(100%); +} + +.site-header.featured-image .site-featured-image .entry-header { + margin-top: calc( 4 * 1rem); + margin-bottom: 0; + margin-left: 0; + margin-right: 0; + /* Entry meta */ +} + +@media only screen and (min-width: 768px) { + .site-header.featured-image .site-featured-image .entry-header { + margin-left: calc(10% + 60px); + margin-right: calc(10% + 60px); + } +} + +.site-header.featured-image .site-featured-image .entry-header .entry-title:before { + background: #fff; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta { + font-weight: 500; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta > span { + margin-right: 1rem; + display: inline-block; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta > span:last-child { + margin-right: 0; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta a { + transition: color 110ms ease-in-out; + color: currentColor; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta a:hover { + text-decoration: none; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-right: 0.5em; +} + +.site-header.featured-image .site-featured-image .entry-header .entry-meta .discussion-avatar-list { + display: none; +} + +@media only screen and (min-width: 768px) { + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta { + display: flex; + position: relative; + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-title { + padding-right: calc(1 * (100vw / 12) + 1rem); + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta .comment-count { + position: absolute; + right: 0; + } + .site-header.featured-image .site-featured-image .entry-header.has-discussion .entry-meta .discussion-avatar-list { + display: block; + position: absolute; + bottom: 100%; + } +} + +.site-header.featured-image .custom-logo-link { + background: #fff; + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); +} + +.site-header.featured-image .custom-logo-link:hover, .site-header.featured-image .custom-logo-link:active, .site-header.featured-image .custom-logo-link:focus { + box-shadow: 0 0 0 2px white; +} + +.site-header.featured-image .site-branding { + position: relative; + z-index: 10; +} + +.site-header.featured-image .site-featured-image .entry-header { + position: relative; + z-index: 9; +} + +.site-header.featured-image .site-branding-container:after, +.site-header.featured-image .site-featured-image:before, +.site-header.featured-image .site-featured-image:after, .site-header.featured-image:after { + display: block; + position: absolute; + top: 0; + left: 0; + content: "\020"; + width: 100%; + height: 100%; +} + +.image-filters-enabled .site-header.featured-image .site-featured-image:before { + background: #0073aa; + mix-blend-mode: screen; + opacity: 0.1; +} + +.site-header.featured-image .site-featured-image:after { + background: #000; + mix-blend-mode: multiply; + opacity: .7; + /* When image filters are active, a blue overlay is added. */ +} + +.image-filters-enabled .site-header.featured-image .site-featured-image:after { + background: #0073aa; + opacity: .8; + z-index: 3; + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .site-header.featured-image .site-featured-image:after { + opacity: 1; + } +} + +.image-filters-enabled .site-header.featured-image .site-branding-container:after { + background: rgba(0, 0, 0, 0.35); + mix-blend-mode: overlay; + opacity: 0.5; + z-index: 4; + /* Browsers supporting mix-blend-mode can have a light overlay */ +} + +@supports (mix-blend-mode: overlay) { + .image-filters-enabled .site-header.featured-image .site-branding-container:after { + background: rgba(255, 255, 255, 0.35); + } +} + +.site-header.featured-image:after { + background: #000; + /** + * Add a transition to the readability overlay, to add a subtle + * but smooth effect when resizing the screen. + */ + transition: opacity 1200ms ease-in-out; + opacity: 0.7; + z-index: 5; + /* When image filters are active, a blue overlay is added. */ +} + +.image-filters-enabled .site-header.featured-image:after { + background: #000e14; + opacity: 0.38; +} + +@media only screen and (min-width: 768px) { + .image-filters-enabled .site-header.featured-image:after { + opacity: 0.18; + } +} + +.site-header.featured-image ::-moz-selection { + background: rgba(255, 255, 255, 0.17); +} + +.site-header.featured-image ::selection { + background: rgba(255, 255, 255, 0.17); +} + +/*-------------------------------------------------------------- +## Posts and pages +--------------------------------------------------------------*/ +.sticky { + display: block; +} + +.sticky-post { + background: #0073aa; + color: #fff; + display: inline-block; + font-weight: bold; + line-height: 1; + padding: .25rem; + position: absolute; + text-transform: uppercase; + top: -1rem; + z-index: 1; +} + +.updated:not(.published) { + display: none; +} + +.page-links { + clear: both; + margin: 0 0 calc(1.5 * 1rem); +} + +.entry { + margin-top: calc(6 * 1rem); +} + +.entry:first-of-type { + margin-top: 0; +} + +.entry .entry-header { + margin: calc(3 * 1rem) 1rem 1rem; + position: relative; +} + +@media only screen and (min-width: 768px) { + .entry .entry-header { + margin: calc(3 * 1rem) calc(10% + 60px) 1rem; + } +} + +.entry .entry-title { + margin: 0; +} + +.entry .entry-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.entry .entry-title.has-text-align-center:before { + margin-left: auto; + margin-right: auto; +} + +.entry .entry-title.has-text-align-right:before { + margin-left: auto; +} + +.entry .entry-title a { + color: inherit; +} + +.entry .entry-title a:hover { + color: #4a4a4a; +} + +.entry .entry-meta, +.entry .entry-footer { + color: #767676; + font-weight: 500; +} + +.entry .entry-meta > span, +.entry .entry-footer > span { + margin-right: 1rem; + display: inline-block; +} + +.entry .entry-meta > span:last-child, +.entry .entry-footer > span:last-child { + margin-right: 0; +} + +.entry .entry-meta a, +.entry .entry-footer a { + transition: color 110ms ease-in-out; + color: currentColor; +} + +.entry .entry-meta a:hover, +.entry .entry-footer a:hover { + text-decoration: none; + color: #0073aa; +} + +.entry .entry-meta .svg-icon, +.entry .entry-footer .svg-icon { + position: relative; + display: inline-block; + vertical-align: middle; + margin-right: 0.5em; +} + +.entry .entry-meta { + margin: 1rem 0; +} + +.entry .entry-footer { + margin: calc(2 * 1rem) 1rem 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-footer { + margin: 1rem calc(10% + 60px) calc(3 * 1rem); + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-footer { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .post-thumbnail { + margin: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .post-thumbnail { + margin: 1rem calc(10% + 60px); + } +} + +.entry .post-thumbnail:focus { + outline: none; +} + +.entry .post-thumbnail .post-thumbnail-inner { + display: block; +} + +.entry .post-thumbnail .post-thumbnail-inner img { + position: relative; + display: block; + width: 100%; +} + +.image-filters-enabled .entry .post-thumbnail { + position: relative; + display: block; +} + +.image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner { + filter: grayscale(100%); +} + +.image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner:after { + background: rgba(0, 0, 0, 0.35); + content: ""; + display: block; + height: 100%; + opacity: .5; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; + z-index: 4; +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .entry .post-thumbnail .post-thumbnail-inner:after { + display: none; + } +} + +.image-filters-enabled .entry .post-thumbnail:before, .image-filters-enabled .entry .post-thumbnail:after { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; + left: 0; + content: "\020"; + pointer-events: none; +} + +.image-filters-enabled .entry .post-thumbnail:before { + background: #0073aa; + mix-blend-mode: screen; + opacity: 0.1; + z-index: 2; +} + +.image-filters-enabled .entry .post-thumbnail:after { + background: #0073aa; + mix-blend-mode: multiply; + opacity: .8; + z-index: 3; + /* Browsers supporting mix-blend-mode don't need opacity < 1 */ +} + +@supports (mix-blend-mode: multiply) { + .image-filters-enabled .entry .post-thumbnail:after { + opacity: 1; + } +} + +.entry .entry-content, +.entry .entry-summary { + max-width: calc(100% - (2 * 1rem)); + margin: 0 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content, + .entry .entry-summary { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } +} + +.entry .entry-content p { + word-wrap: break-word; +} + +.entry .entry-content .more-link { + transition: color 110ms ease-in-out; + display: inline; + color: inherit; +} + +.entry .entry-content .more-link:after { + content: "\02192"; + display: inline-block; + margin-left: 0.5em; +} + +.entry .entry-content .more-link:hover { + color: #0073aa; + text-decoration: none; +} + +.entry .entry-content a { + text-decoration: underline; +} + +.entry .entry-content a.button, .entry .entry-content a:hover { + text-decoration: none; +} + +.entry .entry-content a.button { + display: inline-block; +} + +.entry .entry-content a.button:hover { + background: #111; + color: #fff; + cursor: pointer; +} + +.entry .entry-content > iframe[style] { + margin: 32px 0 !important; + max-width: 100% !important; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > iframe[style] { + max-width: calc(8 * (100vw / 12) - 28px) !important; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > iframe[style] { + max-width: calc(6 * (100vw / 12) - 28px) !important; + } +} + +.entry .entry-content .page-links a { + margin: calc(0.5 * 1rem); + text-decoration: none; +} + +.entry .entry-content .wp-audio-shortcode { + max-width: calc(100vw - (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-audio-shortcode { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-audio-shortcode { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +/* Author description */ +.author-bio { + margin: calc(2 * 1rem) 1rem 1rem; +} + +@media only screen and (min-width: 768px) { + .author-bio { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .author-bio { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .author-bio { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +@media only screen and (min-width: 1168px) { + .author-bio { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +.author-bio .author-title { + display: inline; +} + +.author-bio .author-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.author-bio .author-title.has-text-align-center:before { + margin-left: auto; + margin-right: auto; +} + +.author-bio .author-title.has-text-align-right:before { + margin-left: auto; +} + +.author-bio .author-description { + display: inline; + color: #767676; + font-size: 1.125em; + line-height: 1.2; +} + +.author-bio .author-description .author-link { + display: inline-block; +} + +.author-bio .author-description .author-link:hover { + color: #005177; + text-decoration: none; +} + +/*-------------------------------------------------------------- +## Comments +--------------------------------------------------------------*/ +.comment-content a { + word-wrap: break-word; +} + +.bypostauthor { + display: block; +} + +.comments-area { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + margin: calc(2 * 1rem) 1rem; + word-wrap: break-word; + /* Add extra margin when the comments section is located immediately after the + * post itself (this happens on pages). + */ +} + +@media only screen and (min-width: 768px) { + .comments-area { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .comments-area { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .comments-area { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +.comments-area > * { + margin-top: calc(2 * 1rem); + margin-bottom: calc(2 * 1rem); +} + +@media only screen and (min-width: 768px) { + .comments-area > * { + margin-top: calc(3 * 1rem); + margin-bottom: calc(3 * 1rem); + } +} + +.entry + .comments-area { + margin-top: calc(3 * 1rem); +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap { + align-items: baseline; + display: flex; + justify-content: space-between; + } +} + +.comments-area .comments-title-wrap .comments-title { + margin: 0; +} + +.comments-area .comments-title-wrap .comments-title:before { + background: #767676; + content: "\020"; + display: block; + height: 2px; + margin: 1rem 0; + width: 1em; +} + +.comments-area .comments-title-wrap .comments-title.has-text-align-center:before { + margin-left: auto; + margin-right: auto; +} + +.comments-area .comments-title-wrap .comments-title.has-text-align-right:before { + margin-left: auto; +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap .comments-title { + flex: 1 0 calc(3 * (100vw / 12)); + } +} + +@media only screen and (min-width: 768px) { + .comments-area .comments-title-wrap .discussion-meta { + flex: 0 0 calc(2 * (100vw / 12)); + margin-left: 1rem; + } +} + +#comment { + max-width: 100%; + box-sizing: border-box; +} + +#respond { + position: relative; +} + +#respond .comment-user-avatar { + margin: 1rem 0 -1rem; +} + +#respond .comment .comment-form { + padding-left: 0; +} + +#respond > small { + display: block; + font-size: 22px; + position: absolute; + left: calc(1rem + 100%); + top: calc(-3.5 * 1rem); + width: calc(100vw / 12); +} + +#comments > .comments-title:last-child { + display: none; +} + +.comment-form-flex { + display: flex; + flex-direction: column; +} + +.comment-form-flex .comments-title { + display: none; + margin: 0; + order: 1; +} + +.comment-form-flex #respond { + order: 2; +} + +.comment-form-flex #respond + .comments-title { + display: block; +} + +.comment-list { + list-style: none; + padding: 0; +} + +.comment-list .children { + margin: 0; + padding: 0 0 0 1rem; +} + +.comment-list > .comment:first-child { + margin-top: 0; +} + +.comment-list .pingback .comment-body, +.comment-list .trackback .comment-body { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + font-weight: 500; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.comment-list .pingback .comment-body a:not(.comment-edit-link), +.comment-list .trackback .comment-body a:not(.comment-edit-link) { + font-weight: bold; + font-size: 19.55556px; + line-height: 1.5; + padding-right: 0.5rem; + display: block; +} + +.comment-list .pingback .comment-body .comment-edit-link, +.comment-list .trackback .comment-body .comment-edit-link { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 500; +} + +#respond + .comment-reply { + display: none; +} + +.comment-reply .comment-reply-link { + display: inline-block; +} + +.comment { + list-style: none; + position: relative; +} + +@media only screen and (min-width: 768px) { + .comment { + padding-left: calc(.5 * (1rem + calc(100vw / 12 ))); + } + .comment.depth-1, + .comment .children { + padding-left: 0; + } + .comment.depth-1 { + margin-left: calc(3.25 * 1rem); + } +} + +.comment .comment-body { + margin: calc(2 * 1rem) 0 0; +} + +.comment .comment-meta { + position: relative; +} + +.comment .comment-author .avatar { + float: left; + margin-right: 1rem; + position: relative; +} + +@media only screen and (min-width: 768px) { + .comment .comment-author .avatar { + float: inherit; + margin-right: inherit; + position: absolute; + top: 0; + right: calc(100% + 1rem); + } +} + +.comment .comment-author .fn { + position: relative; + display: block; +} + +.comment .comment-author .fn a { + color: inherit; +} + +.comment .comment-author .fn a:hover { + color: #005177; +} + +.comment .comment-author .post-author-badge { + border-radius: 100%; + display: block; + height: 18px; + position: absolute; + background: #008fd3; + right: calc(100% - 2.5rem); + top: -3px; + width: 18px; +} + +@media only screen and (min-width: 768px) { + .comment .comment-author .post-author-badge { + right: calc(100% + 0.75rem); + } +} + +.comment .comment-author .post-author-badge svg { + width: inherit; + height: inherit; + display: block; + fill: white; + transform: scale(0.875); +} + +.comment .comment-metadata > a, +.comment .comment-metadata .comment-edit-link { + display: inline; + font-weight: 500; + color: #767676; + vertical-align: baseline; +} + +.comment .comment-metadata > a time, +.comment .comment-metadata .comment-edit-link time { + vertical-align: baseline; +} + +.comment .comment-metadata > a:hover, +.comment .comment-metadata .comment-edit-link:hover { + color: #005177; + text-decoration: none; +} + +.comment .comment-metadata > * { + display: inline-block; +} + +.comment .comment-metadata .edit-link-sep { + color: #767676; + margin: 0 0.2em; + vertical-align: baseline; +} + +.comment .comment-metadata .edit-link { + color: #767676; +} + +.comment .comment-metadata .edit-link svg { + transform: scale(0.8); + vertical-align: baseline; + margin-right: 0.1em; +} + +.comment .comment-metadata .comment-edit-link { + position: relative; + padding-left: 1rem; + margin-left: -1rem; + z-index: 1; +} + +.comment .comment-metadata .comment-edit-link:hover { + color: #0073aa; +} + +.comment .comment-content { + margin: 1rem 0; +} + +@media only screen and (min-width: 1168px) { + .comment .comment-content { + padding-right: 1rem; + } +} + +.comment .comment-content > *:first-child { + margin-top: 0; +} + +.comment .comment-content > *:last-child { + margin-bottom: 0; +} + +.comment .comment-content blockquote { + margin-left: 0; +} + +.comment .comment-content a { + text-decoration: underline; +} + +.comment .comment-content a:hover { + text-decoration: none; +} + +.comment-reply-link, +#cancel-comment-reply-link { + font-weight: 500; +} + +.comment-reply-link:hover, +#cancel-comment-reply-link:hover { + color: #005177; +} + +.discussion-avatar-list { + content: ""; + display: table; + table-layout: fixed; + margin: 0; + padding: 0; +} + +.discussion-avatar-list li { + position: relative; + list-style: none; + margin: 0 -8px 0 0; + padding: 0; + float: left; +} + +.discussion-avatar-list .comment-user-avatar img { + height: calc(1.5 * 1rem); + width: calc(1.5 * 1rem); +} + +.discussion-meta .discussion-meta-info { + margin: 0; +} + +.discussion-meta .discussion-meta-info .svg-icon { + vertical-align: middle; + fill: currentColor; + transform: scale(0.6) scaleX(-1) translateY(-0.1em); + margin-left: -0.25rem; +} + +.comment-form .comment-notes, +.comment-form label { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; +} + +@media only screen and (min-width: 768px) { + .comment-form .comment-form-author, + .comment-form .comment-form-email { + width: calc(50% - 0.5rem); + float: left; + } +} + +@media only screen and (min-width: 768px) { + .comment-form .comment-form-email { + margin-left: 1rem; + } +} + +.comment-form input[name="author"], +.comment-form input[name="email"], +.comment-form input[name="url"] { + display: block; + width: 100%; +} + +/*-------------------------------------------------------------- +## Archives +--------------------------------------------------------------*/ +.archive .page-header, +.search .page-header, +.error404 .page-header { + margin: 1rem 1rem calc(3 * 1rem); +} + +@media only screen and (min-width: 768px) { + .archive .page-header, + .search .page-header, + .error404 .page-header { + margin: 0 calc(10% + 60px) calc(3 * 1rem); + } +} + +.archive .page-header .page-title, +.search .page-header .page-title, +.error404 .page-header .page-title { + color: #767676; + display: inline; + letter-spacing: normal; +} + +.archive .page-header .page-title:before, +.search .page-header .page-title:before, +.error404 .page-header .page-title:before { + display: none; +} + +.archive .page-header .search-term, +.archive .page-header .page-description, +.search .page-header .search-term, +.search .page-header .page-description, +.error404 .page-header .search-term, +.error404 .page-header .page-description { + display: inherit; + clear: both; +} + +.archive .page-header .page-description, +.search .page-header .page-description { + display: block; + color: #111; + font-size: 1em; +} + +@media only screen and (min-width: 768px) { + .hfeed .entry .entry-header { + margin: calc(3 * 1rem) calc(10% + 60px) calc(1rem / 2); + } +} + +/* 404 & Not found */ +.error-404.not-found .page-content, +.no-results.not-found .page-content { + margin: calc(3 * 1rem) 1rem; +} + +@media only screen and (min-width: 768px) { + .error-404.not-found .page-content, + .no-results.not-found .page-content { + margin: calc(3 * 1rem) calc(10% + 60px) calc(1rem / 2); + } +} + +.error-404.not-found .search-submit, +.no-results.not-found .search-submit { + vertical-align: middle; + margin: 1rem 0; +} + +.error-404.not-found .search-field, +.no-results.not-found .search-field { + width: 100%; +} + +/*-------------------------------------------------------------- +## Footer +--------------------------------------------------------------*/ +/* Site footer */ +#colophon .widget-area, +#colophon .site-info { + margin: calc(2 * 1rem) 1rem; +} + +@media only screen and (min-width: 768px) { + #colophon .widget-area, + #colophon .site-info { + margin: calc(3 * 1rem) calc(10% + 60px); + } +} + +#colophon .widget-column { + display: flex; + flex-wrap: wrap; +} + +#colophon .widget-column .widget { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + width: 100%; + word-wrap: break-word; +} + +@media only screen and (min-width: 1168px) { + #colophon .widget-column .widget { + margin-right: calc(3 * 1rem); + width: calc(50% - (3 * 1rem)); + } +} + +#colophon .site-info { + color: #767676; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-wrap: break-word; +} + +#colophon .site-info a { + color: inherit; +} + +#colophon .site-info a:hover { + text-decoration: none; + color: #0073aa; +} + +#colophon .site-info .imprint, +#colophon .site-info .privacy-policy-link { + margin-right: 1rem; +} + +/* Widgets */ +.widget { + margin: 0 0 1rem; + /* Make sure select elements fit in widgets. */ +} + +.widget .widget-title { + font-size: 1.6875em; +} + +.widget select { + max-width: 100%; +} + +.widget a { + color: #0073aa; +} + +.widget a:hover { + color: #005177; +} + +.widget_archive ul, +.widget_categories ul, +.widget_meta ul, +.widget_nav_menu ul, +.widget_pages ul, +.widget_recent_comments ul, +.widget_recent_entries ul, +.widget_rss ul { + padding: 0; + list-style: none; +} + +.widget_archive ul li, +.widget_categories ul li, +.widget_meta ul li, +.widget_nav_menu ul li, +.widget_pages ul li, +.widget_recent_comments ul li, +.widget_recent_entries ul li, +.widget_rss ul li { + color: #767676; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: 700; + line-height: 1.2; + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.widget_archive ul ul, +.widget_categories ul ul, +.widget_meta ul ul, +.widget_nav_menu ul ul, +.widget_pages ul ul, +.widget_recent_comments ul ul, +.widget_recent_entries ul ul, +.widget_rss ul ul { + counter-reset: submenu; +} + +.widget_archive ul ul > li > a::before, +.widget_categories ul ul > li > a::before, +.widget_meta ul ul > li > a::before, +.widget_nav_menu ul ul > li > a::before, +.widget_pages ul ul > li > a::before, +.widget_recent_comments ul ul > li > a::before, +.widget_recent_entries ul ul > li > a::before, +.widget_rss ul ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.widget_tag_cloud .tagcloud { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: 700; +} + +.widget_search .search-field { + width: 100%; +} + +@media only screen and (min-width: 600px) { + .widget_search .search-field { + width: auto; + } +} + +.widget_search .search-submit { + display: block; + margin-top: 1rem; +} + +.widget_calendar .calendar_wrap { + text-align: center; +} + +.widget_calendar .calendar_wrap table td, +.widget_calendar .calendar_wrap table th { + border: none; +} + +.widget_calendar .calendar_wrap a { + text-decoration: underline; +} + +.widget_calendar .calendar_wrap .wp-calendar-table { + margin-bottom: 0; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav { + margin: 0 0 1rem; + display: table; + width: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav span { + display: table-cell; + padding: 0.5em; +} + +.widget_calendar .calendar_wrap .wp-calendar-nav-prev, +.widget_calendar .calendar_wrap .wp-calendar-nav-next { + width: 40%; +} + +/* Blocks */ +/* !Block styles */ +.entry .entry-content > *, +.entry .entry-summary > *, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *, + .entry .entry-summary > *, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > * { + margin: 32px 0; + } +} + +.entry .entry-content > *.alignwide, +.entry .entry-summary > *.alignwide, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignwide, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignwide { + margin-left: auto; + margin-right: auto; + clear: both; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignwide, + .entry .entry-summary > *.alignwide, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignwide, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignwide { + width: 100%; + max-width: 100%; + } +} + +.entry .entry-content > *.alignfull, +.entry .entry-summary > *.alignfull, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignfull, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignfull { + position: relative; + left: -1rem; + width: calc( 100% + (2 * 1rem)); + max-width: calc( 100% + (2 * 1rem)); + clear: both; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignfull, + .entry .entry-summary > *.alignfull, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignfull, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignfull { + margin-top: calc(2 * 1rem); + margin-bottom: calc(2 * 1rem); + left: calc( -12.5% - 75px); + width: calc( 125% + 150px); + max-width: calc( 125% + 150px); + } +} + +.entry .entry-content > *.alignleft, +.entry .entry-summary > *.alignleft, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignleft, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignleft { + /*rtl:ignore*/ + float: left; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-left: 0; + /*rtl:ignore*/ + margin-right: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignleft, + .entry .entry-summary > *.alignleft, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignleft, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignleft { + max-width: calc(4 * (100vw / 12)); + /*rtl:ignore*/ + margin-right: calc(2 * 1rem); + } +} + +.entry .entry-content > *.alignright, +.entry .entry-summary > *.alignright, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignright, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignright { + /*rtl:ignore*/ + float: right; + max-width: calc(5 * (100vw / 12)); + margin-top: 0; + margin-right: 0; + /*rtl:ignore*/ + margin-left: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.alignright, + .entry .entry-summary > *.alignright, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.alignright, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.alignright { + max-width: calc(4 * (100vw / 12)); + margin-right: 0; + /*rtl:ignore*/ + margin-left: calc(2 * 1rem); + } +} + +.entry .entry-content > *.aligncenter, +.entry .entry-summary > *.aligncenter, +.entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, +.entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + margin-left: auto; + margin-right: auto; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content > *.aligncenter, + .entry .entry-summary > *.aligncenter, + .entry .entry-summary > .wp-block-group > .wp-block-group__inner-container > *.aligncenter, + .entry .entry-content > .wp-block-group > .wp-block-group__inner-container > *.aligncenter { + margin-left: 0; + margin-right: 0; + } +} + +.entry .entry-content > * > *:first-child, +.entry .entry-summary > * > *:first-child { + margin-top: 0; +} + +.entry .entry-content > * > *:last-child, +.entry .entry-summary > * > *:last-child { + margin-bottom: 0; +} + +/* + * Unset nested content selector styles + * - Prevents layout styles from cascading too deeply + * - helps with plugin compatibility + */ +.entry .entry-content .entry-content, +.entry .entry-content .entry-summary, +.entry .entry-content .entry, +.entry .entry-summary .entry-content, +.entry .entry-summary .entry-summary, +.entry .entry-summary .entry { + margin: inherit; + max-width: inherit; + padding: inherit; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .entry-content, + .entry .entry-content .entry-summary, + .entry .entry-content .entry, + .entry .entry-summary .entry-content, + .entry .entry-summary .entry-summary, + .entry .entry-summary .entry { + margin: inherit; + max-width: inherit; + padding: inherit; + } +} + +.entry .entry-content p.has-background { + padding: 20px 30px; +} + +.entry .entry-content .wp-block-audio { + width: 100%; +} + +.entry .entry-content .wp-block-audio audio { + width: 100%; +} + +.entry .entry-content .wp-block-audio.alignleft audio, +.entry .entry-content .wp-block-audio.alignright audio { + max-width: 198px; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-audio.alignleft audio, + .entry .entry-content .wp-block-audio.alignright audio { + max-width: 384px; + } +} + +@media only screen and (min-width: 1379px) { + .entry .entry-content .wp-block-audio.alignleft audio, + .entry .entry-content .wp-block-audio.alignright audio { + max-width: 385.44px; + } +} + +.entry .entry-content .wp-block-video video { + width: 100%; +} + +.entry .entry-content .wp-block-button .wp-block-button__link { + transition: background 150ms ease-in-out; + border: none; + font-size: 0.88889em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.2; + box-sizing: border-box; + font-weight: bold; + text-decoration: none; + padding: 0.76rem 1rem; + outline: none; + outline: none; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:not(.has-background) { + background-color: #0073aa; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:not(.has-text-color) { + color: white; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:hover { + color: white; + background: #111; + cursor: pointer; +} + +.entry .entry-content .wp-block-button .wp-block-button__link:focus { + color: white; + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +.entry .entry-content .wp-block-button:not(.is-style-squared) .wp-block-button__link { + border-radius: 5px; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link, +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus, +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active { + transition: all 150ms ease-in-out; + border-width: 2px; + border-style: solid; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-background), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus:not(.has-background), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active:not(.has-background) { + background: transparent; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:not(.has-text-color), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:focus:not(.has-text-color), +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:active:not(.has-text-color) { + color: #0073aa; + border-color: currentColor; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:hover { + color: white; + border-color: #111; +} + +.entry .entry-content .wp-block-button.is-style-outline .wp-block-button__link:hover:not(.has-background) { + color: #111; +} + +.entry .entry-content .wp-block-archives, +.entry .entry-content .wp-block-categories, +.entry .entry-content .wp-block-latest-posts { + padding: 0; + list-style: none; +} + +.entry .entry-content .wp-block-archives li > a, +.entry .entry-content .wp-block-categories li > a, +.entry .entry-content .wp-block-latest-posts li > a { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: calc(22px * 1.125); + font-weight: bold; + line-height: 1.2; + text-decoration: none; +} + +.entry .entry-content .wp-block-archives.aligncenter, +.entry .entry-content .wp-block-categories.aligncenter { + text-align: center; +} + +.entry .entry-content .wp-block-categories ul { + padding-top: 0.75rem; +} + +.entry .entry-content .wp-block-categories li ul { + list-style: none; + padding-left: 0; +} + +.entry .entry-content .wp-block-categories ul { + counter-reset: submenu; +} + +.entry .entry-content .wp-block-categories ul > li > a::before { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-weight: normal; + content: "– " counters(submenu, "– ", none); + counter-increment: submenu; +} + +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-date { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 0.71111em; + color: #767676; + line-height: 1.2; +} + +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-full-content, +.entry .entry-content .wp-block-latest-posts .wp-block-latest-posts__post-excerpt { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.entry .entry-content .wp-block-latest-posts li { + padding-bottom: 0.5rem; +} + +.entry .entry-content .wp-block-latest-posts li.menu-item-has-children, .entry .entry-content .wp-block-latest-posts li:last-child { + padding-bottom: 0; +} + +.entry .entry-content .wp-block-latest-posts li :not(:last-child) .wp-block-latest-posts__post-excerpt { + padding-bottom: 0.5rem; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li { + border-top: 2px solid #ccc; + padding-top: 1rem; + margin-bottom: 2rem; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li a:after { + content: ''; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li:last-child { + margin-bottom: auto; +} + +.entry .entry-content .wp-block-latest-posts.is-grid li:last-child a:after { + content: ''; +} + +.entry .entry-content .wp-block-preformatted { + font-size: 0.71111em; + line-height: 1.8; + padding: 1rem; +} + +.entry .entry-content .wp-block-verse { + font-family: "NonBreakingSpaceOverride", "Hoefler Text", Garamond, "Times New Roman", serif; + font-size: 22px; + line-height: 1.8; +} + +.entry .entry-content .has-drop-cap:not(:focus):first-letter { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 3.375em; + line-height: 1; + font-weight: bold; + margin: 0 0.25em 0 0; +} + +.entry .entry-content .wp-block-pullquote { + border-color: transparent; + border-width: 2px; + padding: 1rem; +} + +.entry .entry-content .wp-block-pullquote blockquote { + color: #111; + border: none; + margin-top: calc(4 * 1rem); + margin-bottom: calc(4.33 * 1rem); + margin-right: 0; + padding-left: 0; +} + +.entry .entry-content .wp-block-pullquote p { + font-size: 1.6875em; + font-style: italic; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +.entry .entry-content .wp-block-pullquote p em { + font-style: normal; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote p { + font-size: 2.25em; + } +} + +.entry .entry-content .wp-block-pullquote cite { + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + text-transform: none; + color: #767676; + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +.entry .entry-content .wp-block-pullquote.alignleft, .entry .entry-content .wp-block-pullquote.alignright { + width: 100%; + padding: 0; +} + +.entry .entry-content .wp-block-pullquote.alignleft blockquote, .entry .entry-content .wp-block-pullquote.alignright blockquote { + margin: 1rem 0; + padding: 0; + text-align: left; + max-width: 100%; +} + +.entry .entry-content .wp-block-pullquote.alignleft blockquote p:first-child, .entry .entry-content .wp-block-pullquote.alignright blockquote p:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color { + background-color: #0073aa; + padding-left: 0; + padding-right: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color { + padding-left: 10%; + padding-right: 10%; + } +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color p { + font-size: 1.6875em; + line-height: 1.3; + margin-bottom: 0.5em; + margin-top: 0.5em; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color p { + font-size: 2.25em; + } +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color a { + color: #fff; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color cite { + color: inherit; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 100%; + color: #fff; + padding-left: 0; + margin-left: 1rem; + margin-right: 1rem; +} + +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-text-color p, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-text-color a, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: inherit; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote { + margin-left: 0; + margin-right: 0; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignright, .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignleft { + padding: 1rem calc(2 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-pullquote.is-style-solid-color.alignfull { + padding-left: calc(10% + 58px + (2 * 1rem)); + padding-right: calc(10% + 58px + (2 * 1rem)); + } +} + +.entry .entry-content .wp-block-quote:not(.is-large), .entry .entry-content .wp-block-quote:not(.is-style-large) { + border-width: 2px; + border-color: #0073aa; + padding-top: 0; + padding-bottom: 0; +} + +.entry .entry-content .wp-block-quote p { + font-size: 1em; + font-style: normal; + line-height: 1.8; +} + +.entry .entry-content .wp-block-quote cite { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +.entry .entry-content .wp-block-quote.is-large, .entry .entry-content .wp-block-quote.is-style-large { + margin: 1rem 0; + padding: 0; + border-left: none; +} + +.entry .entry-content .wp-block-quote.is-large p, .entry .entry-content .wp-block-quote.is-style-large p { + font-size: 1.6875em; + line-height: 1.4; + font-style: italic; +} + +.entry .entry-content .wp-block-quote.is-large cite, +.entry .entry-content .wp-block-quote.is-large footer, .entry .entry-content .wp-block-quote.is-style-large cite, +.entry .entry-content .wp-block-quote.is-style-large footer { + /* + * This requires a rem-based font size calculation instead of our normal em-based one, + * because the cite tag sometimes gets wrapped in a p tag. This is equivalent to $font-size_xs. + */ + font-size: calc(1rem / (1.25 * 1.125)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-quote.is-large, .entry .entry-content .wp-block-quote.is-style-large { + margin: 1rem 0; + padding: 1rem 0; + } + .entry .entry-content .wp-block-quote.is-large p, .entry .entry-content .wp-block-quote.is-style-large p { + font-size: 1.6875em; + } +} + +.entry .entry-content .wp-block-image { + max-width: 100%; +} + +.entry .entry-content .wp-block-image img { + display: block; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image:not(.alignwide):not(.alignfull) > img { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image:not(.alignwide):not(.alignfull) > img { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image .aligncenter { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image .aligncenter { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image .aligncenter { + margin: 0; + width: calc(8 * (100vw / 12) - 28px); + } + .entry .entry-content .wp-block-image .aligncenter img { + margin: 0 auto; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-image .aligncenter { + width: calc(6 * (100vw / 12) - 28px); + } + .entry .entry-content .wp-block-image .aligncenter img { + margin: 0 auto; + } +} + +.entry .entry-content .wp-block-image.alignfull img { + width: 100vw; + max-width: calc( 100% + (2 * 1rem)); +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-image.alignfull img { + max-width: calc( 125% + 150px); + margin-left: auto; + margin-right: auto; + } +} + +.entry .entry-content .wp-block-cover-image, +.entry .entry-content .wp-block-cover { + position: relative; + min-height: 430px; + padding: 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image, + .entry .entry-content .wp-block-cover { + padding: 1rem 10%; + } +} + +.entry .entry-content .wp-block-cover-image .wp-block-cover-image-text, +.entry .entry-content .wp-block-cover-image .wp-block-cover-text, +.entry .entry-content .wp-block-cover-image h2, +.entry .entry-content .wp-block-cover .wp-block-cover-image-text, +.entry .entry-content .wp-block-cover .wp-block-cover-text, +.entry .entry-content .wp-block-cover h2 { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-size: 1.6875em; + font-weight: bold; + line-height: 1.25; + padding: 0; + color: #fff; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image h2, + .entry .entry-content .wp-block-cover .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover .wp-block-cover-text, + .entry .entry-content .wp-block-cover h2 { + font-size: 2.25em; + max-width: 100%; + } +} + +.entry .entry-content .wp-block-cover-image.alignleft, .entry .entry-content .wp-block-cover-image.alignright, +.entry .entry-content .wp-block-cover.alignleft, +.entry .entry-content .wp-block-cover.alignright { + width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignleft, .entry .entry-content .wp-block-cover-image.alignright, + .entry .entry-content .wp-block-cover.alignleft, + .entry .entry-content .wp-block-cover.alignright { + padding: 1rem calc(2 * 1rem); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-cover-image.alignfull, + .entry .entry-content .wp-block-cover.alignfull { + padding-left: calc(10% + 58px + (2 * 1rem)); + padding-right: calc(10% + 58px + (2 * 1rem)); + } + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover-image.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover-image.alignfull h2, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-image-text, + .entry .entry-content .wp-block-cover.alignfull .wp-block-cover-text, + .entry .entry-content .wp-block-cover.alignfull h2 { + padding: 0; + } +} + +.entry .entry-content .wp-block-gallery { + list-style-type: none; + padding-left: 0; +} + +.entry .entry-content .wp-block-gallery .blocks-gallery-image:last-child, +.entry .entry-content .wp-block-gallery .blocks-gallery-item:last-child { + margin-bottom: 16px; +} + +.entry .entry-content .wp-block-gallery figcaption a { + color: #fff; +} + +.entry .entry-content .wp-block-audio figcaption, +.entry .entry-content .wp-block-video figcaption, +.entry .entry-content .wp-block-image figcaption, +.entry .entry-content .wp-block-gallery .blocks-gallery-image figcaption, +.entry .entry-content .wp-block-gallery .blocks-gallery-item figcaption { + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: center; +} + +.entry .entry-content .wp-block-separator, +.entry .entry-content hr { + background-color: #767676; + border: 0; + height: 2px; + margin-bottom: 2rem; + margin-top: 2rem; + max-width: 2.25em; + text-align: left; + /* Remove duplicate rule-line when a separator + * is followed by an H1, or H2 */ +} + +.entry .entry-content .wp-block-separator.is-style-wide, +.entry .entry-content hr.is-style-wide { + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-separator.is-style-wide, + .entry .entry-content hr.is-style-wide { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-separator.is-style-wide, + .entry .entry-content hr.is-style-wide { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .entry-content .wp-block-separator.is-style-dots, +.entry .entry-content hr.is-style-dots { + max-width: 100%; + background-color: inherit; + border: inherit; + height: inherit; + text-align: center; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-separator.is-style-dots, + .entry .entry-content hr.is-style-dots { + max-width: calc(8 * (100vw / 12) - 28px); + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-separator.is-style-dots, + .entry .entry-content hr.is-style-dots { + max-width: calc(6 * (100vw / 12) - 28px); + } +} + +.entry .entry-content .wp-block-separator.is-style-dots:not(.has-text-color):not(.has-background), +.entry .entry-content hr.is-style-dots:not(.has-text-color):not(.has-background) { + color: #767676; +} + +.entry .entry-content .wp-block-separator.is-style-dots:before, +.entry .entry-content hr.is-style-dots:before { + font-size: 1.6875em; + letter-spacing: 0.88889em; + padding-left: 0.88889em; +} + +.entry .entry-content .wp-block-separator + h1:before, +.entry .entry-content .wp-block-separator + h2:before, +.entry .entry-content hr + h1:before, +.entry .entry-content hr + h2:before { + display: none; +} + +.entry .entry-content .wp-block-embed-twitter { + word-break: break-word; +} + +.entry .entry-content .wp-block-table th, +.entry .entry-content .wp-block-table td { + border-color: #767676; +} + +.entry .entry-content .wp-block-file { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.entry .entry-content .wp-block-file .wp-block-file__button { + display: table; + transition: background 150ms ease-in-out; + border: none; + border-radius: 5px; + background: #0073aa; + font-size: 22px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.2; + text-decoration: none; + font-weight: bold; + padding: 0.75rem 1rem; + color: #fff; + margin-left: 0; + margin-top: calc(0.75 * 1rem); +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-file .wp-block-file__button { + font-size: 22px; + padding: 0.875rem 1.5rem; + } +} + +.entry .entry-content .wp-block-file .wp-block-file__button:hover { + background: #111; + cursor: pointer; +} + +.entry .entry-content .wp-block-file .wp-block-file__button:focus { + background: #111; + outline: thin dotted; + outline-offset: -4px; +} + +.entry .entry-content .wp-block-code { + border-radius: 0; +} + +.entry .entry-content .wp-block-code code { + font-size: 1.125em; + white-space: pre-wrap; + word-break: break-word; +} + +.entry .entry-content .wp-block-columns .wp-block-column > *:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-columns .wp-block-column > *:last-child { + margin-bottom: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-columns .wp-block-image > img:not(.alignwide):not(.alignfull), + .entry .entry-content .wp-block-columns .wp-block-image > figure { + max-width: 100%; + } +} + +@media only screen and (min-width: 1168px) { + .entry .entry-content .wp-block-columns .wp-block-image > img:not(.alignwide):not(.alignfull), + .entry .entry-content .wp-block-columns .wp-block-image > figure { + max-width: 100%; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-columns { + flex-wrap: nowrap; + } + .entry .entry-content .wp-block-columns .wp-block-column:not(:first-child) { + margin-left: 32px; + } +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group:not(.alignfull) > .wp-block-group__inner-container > .alignfull, + .entry .entry-content .wp-block-group:not(.alignfull) > .wp-block-group__inner-container > .wp-block-image > img { + left: 0; + max-width: 100%; + } +} + +.entry .entry-content .wp-block-group.alignfull > .wp-block-group__inner-container { + max-width: calc(100% - (2 * 1rem)); + margin: 0 1rem; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.alignfull > .wp-block-group__inner-container { + max-width: 80%; + margin: 0 10%; + padding: 0 60px; + } +} + +.entry .entry-content .wp-block-group.has-background { + padding: 1rem; + margin-top: 0; + margin-bottom: 0; +} + +.entry .entry-content .wp-block-group.has-background .wp-block-group__inner-container > *:first-child { + margin-top: 0; +} + +.entry .entry-content .wp-block-group.has-background .wp-block-group__inner-container > *:last-child { + margin-bottom: 0; +} + +.entry .entry-content .wp-block-group.has-background.alignfull { + padding-left: 0; + padding-right: 0; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.has-background.alignfull { + padding-top: 1rem; + padding-bottom: 1rem; + } +} + +.entry .entry-content .wp-block-group.has-background:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: 100%; + max-width: 100%; +} + +@media only screen and (min-width: 768px) { + .entry .entry-content .wp-block-group.has-background:not(.alignfull) > .wp-block-group__inner-container > .alignfull { + width: calc( 100% + 2rem); + max-width: calc( 100% + 2rem); + margin-left: -1rem; + } +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-weight: bold; +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-meta .wp-block-latest-comments__comment-date { + font-weight: normal; +} + +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment, +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-date, +.entry .entry-content .wp-block-latest-comments .wp-block-latest-comments__comment-excerpt p { + font-size: inherit; +} + +.entry .entry-content .wp-block-latest-comments.has-dates .wp-block-latest-comments__comment-date { + font-size: 0.71111em; +} + +.entry .entry-content .has-small-font-size { + font-size: 0.88889em; +} + +.entry .entry-content .has-normal-font-size { + font-size: 1.125em; +} + +.entry .entry-content .has-large-font-size { + font-size: 1.6875em; +} + +.entry .entry-content .has-huge-font-size { + font-size: 2.25em; +} + +.entry .entry-content .has-primary-background-color, +.entry .entry-content .has-secondary-background-color, +.entry .entry-content .has-dark-gray-background-color, +.entry .entry-content .has-light-gray-background-color { + color: #fff; +} + +.entry .entry-content .has-primary-background-color > p, +.entry .entry-content .has-primary-background-color > h1, +.entry .entry-content .has-primary-background-color > h2, +.entry .entry-content .has-primary-background-color > h3, +.entry .entry-content .has-primary-background-color > h4, +.entry .entry-content .has-primary-background-color > h5, +.entry .entry-content .has-primary-background-color > h6, +.entry .entry-content .has-primary-background-color > a, +.entry .entry-content .has-secondary-background-color > p, +.entry .entry-content .has-secondary-background-color > h1, +.entry .entry-content .has-secondary-background-color > h2, +.entry .entry-content .has-secondary-background-color > h3, +.entry .entry-content .has-secondary-background-color > h4, +.entry .entry-content .has-secondary-background-color > h5, +.entry .entry-content .has-secondary-background-color > h6, +.entry .entry-content .has-secondary-background-color > a, +.entry .entry-content .has-dark-gray-background-color > p, +.entry .entry-content .has-dark-gray-background-color > h1, +.entry .entry-content .has-dark-gray-background-color > h2, +.entry .entry-content .has-dark-gray-background-color > h3, +.entry .entry-content .has-dark-gray-background-color > h4, +.entry .entry-content .has-dark-gray-background-color > h5, +.entry .entry-content .has-dark-gray-background-color > h6, +.entry .entry-content .has-dark-gray-background-color > a, +.entry .entry-content .has-light-gray-background-color > p, +.entry .entry-content .has-light-gray-background-color > h1, +.entry .entry-content .has-light-gray-background-color > h2, +.entry .entry-content .has-light-gray-background-color > h3, +.entry .entry-content .has-light-gray-background-color > h4, +.entry .entry-content .has-light-gray-background-color > h5, +.entry .entry-content .has-light-gray-background-color > h6, +.entry .entry-content .has-light-gray-background-color > a { + color: #fff; +} + +.entry .entry-content .has-white-background-color { + color: #111; +} + +.entry .entry-content .has-white-background-color > p, +.entry .entry-content .has-white-background-color > h1, +.entry .entry-content .has-white-background-color > h2, +.entry .entry-content .has-white-background-color > h3, +.entry .entry-content .has-white-background-color > h4, +.entry .entry-content .has-white-background-color > h5, +.entry .entry-content .has-white-background-color > h6, +.entry .entry-content .has-white-background-color > a { + color: #111; +} + +.entry .entry-content .has-primary-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-primary-background-color { + background-color: #0073aa; +} + +.entry .entry-content .has-secondary-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-secondary-background-color { + background-color: #005177; +} + +.entry .entry-content .has-dark-gray-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-dark-gray-background-color { + background-color: #111; +} + +.entry .entry-content .has-light-gray-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-light-gray-background-color { + background-color: #767676; +} + +.entry .entry-content .has-white-background-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color.has-white-background-color { + background-color: #FFF; +} + +.entry .entry-content .has-primary-color, +.entry .entry-content .wp-block-pullquote blockquote.has-primary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-primary-color > p { + color: #0073aa; +} + +.entry .entry-content .has-secondary-color, +.entry .entry-content .wp-block-pullquote blockquote.has-secondary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-secondary-color > p { + color: #005177; +} + +.entry .entry-content .has-dark-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-dark-gray-color > p { + color: #111; +} + +.entry .entry-content .has-light-gray-color, +.entry .entry-content .wp-block-pullquote blockquote.has-light-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-light-gray-color > p { + color: #767676; +} + +.entry .entry-content .has-white-color, +.entry .entry-content .wp-block-pullquote blockquote.has-white-color, +.entry .entry-content .wp-block-pullquote.is-style-solid-color blockquote.has-white-color { + color: #FFF; +} + +/* Media */ +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +embed, +iframe, +object { + max-width: 100%; +} + +.custom-logo-link { + display: inline-block; +} + +.avatar { + border-radius: 100%; + display: block; + height: calc(2.25 * 1rem); + min-height: inherit; + width: calc(2.25 * 1rem); +} + +svg { + transition: fill 120ms ease-in-out; + fill: currentColor; +} + +/*-------------------------------------------------------------- +## Captions +--------------------------------------------------------------*/ +.wp-caption { + margin-bottom: calc(1.5 * 1rem); +} + +@media only screen and (min-width: 768px) { + .wp-caption.aligncenter { + position: relative; + left: calc( calc(8 * (100vw / 12) - 28px) / 2); + transform: translateX(-50%); + } +} + +@media only screen and (min-width: 1168px) { + .wp-caption.aligncenter { + left: calc( calc(6 * (100vw / 12) - 28px) / 2); + } +} + +.wp-caption img[class*="wp-image-"] { + display: block; + margin-left: auto; + margin-right: auto; +} + +.wp-caption-text { + color: #767676; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; + text-align: center; +} + +/*-------------------------------------------------------------- +## Galleries +--------------------------------------------------------------*/ +.gallery { + display: flex; + flex-flow: row wrap; + justify-content: center; + margin-bottom: calc(1.5 * 1rem); +} + +.gallery-item { + display: inline-block; + margin-right: 16px; + margin-bottom: 16px; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-columns-2 .gallery-item { + max-width: calc((100% - 16px * 1) / 2); +} + +.gallery-columns-2 .gallery-item:nth-of-type(2n+2) { + margin-right: 0; +} + +.gallery-columns-3 .gallery-item { + max-width: calc((100% - 16px * 2) / 3); +} + +.gallery-columns-3 .gallery-item:nth-of-type(3n+3) { + margin-right: 0; +} + +.gallery-columns-4 .gallery-item { + max-width: calc((100% - 16px * 3) / 4); +} + +.gallery-columns-4 .gallery-item:nth-of-type(4n+4) { + margin-right: 0; +} + +.gallery-columns-5 .gallery-item { + max-width: calc((100% - 16px * 4) / 5); +} + +.gallery-columns-5 .gallery-item:nth-of-type(5n+5) { + margin-right: 0; +} + +.gallery-columns-6 .gallery-item { + max-width: calc((100% - 16px * 5) / 6); +} + +.gallery-columns-6 .gallery-item:nth-of-type(6n+6) { + margin-right: 0; +} + +.gallery-columns-7 .gallery-item { + max-width: calc((100% - 16px * 6) / 7); +} + +.gallery-columns-7 .gallery-item:nth-of-type(7n+7) { + margin-right: 0; +} + +.gallery-columns-8 .gallery-item { + max-width: calc((100% - 16px * 7) / 8); +} + +.gallery-columns-8 .gallery-item:nth-of-type(8n+8) { + margin-right: 0; +} + +.gallery-columns-9 .gallery-item { + max-width: calc((100% - 16px * 8) / 9); +} + +.gallery-columns-9 .gallery-item:nth-of-type(9n+9) { + margin-right: 0; +} + +.gallery-item:last-of-type { + padding-right: 0; +} + +.gallery-caption { + display: block; + font-size: 0.71111em; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + line-height: 1.6; + margin: 0; + padding: 0.5rem; +} + +.gallery-item > div > a { + display: block; + line-height: 0; + box-shadow: 0 0 0 0 transparent; +} + +.gallery-item > div > a:focus { + box-shadow: 0 0 0 2px #0073aa; +} diff --git a/content/themes/twentynineteen/style.scss b/content/themes/twentynineteen/style.scss new file mode 100644 index 0000000..960469d --- /dev/null +++ b/content/themes/twentynineteen/style.scss @@ -0,0 +1,110 @@ +/* +Theme Name: Twenty Nineteen +Theme URI: https://wordpress.org/themes/twentynineteen/ +Author: the WordPress team +Author URI: https://wordpress.org/ +Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes. +Requires at least: 4.9.6 +Requires PHP: 5.2.4 +Version: 1.5 +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Text Domain: twentynineteen +Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned with others. + +Twenty Nineteen is based on Underscores https://underscores.me/, (C) 2012-2019 Automattic, Inc. +Underscores is distributed under the terms of the GNU GPL v2 or later. + +Normalizing styles have been helped along thanks to the fine work of +Nicolas Gallagher and Jonathan Neal https://necolas.github.io/normalize.css/ +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Variables +# Normalize +# Typography + ## Headings + ## Copy +# Elements + ## Lists + ## Tables +# Forms + ## Buttons + ## Fields +# Navigation + ## Links + ## Menus + ## Next & Previous +# Accessibility +# Alignments +# Clearings +# Layout +# Widgets +# Content + ## Archives + ## Posts and pages + ## Comments +# Blocks +# Media + ## Captions + ## Galleries +--------------------------------------------------------------*/ +@import "sass/variables-site/variables-site"; +@import "sass/mixins/mixins-master"; + +/* Normalize */ + +@import "sass/normalize"; + +/* Typography */ + +@import "sass/typography/typography"; + +/* Elements */ + +@import "sass/elements/elements"; + +/* Forms */ + +@import "sass/forms/forms"; + +/* Navigation */ + +@import "sass/navigation/navigation"; + +/* Accessibility */ + +@import "sass/modules/accessibility"; + +/* Alignments */ + +@import "sass/modules/alignments"; + +/* Clearings */ + +@import "sass/modules/clearings"; + +/* Layout */ + +@import "sass/layout/layout"; + +/* Content */ + +@import "sass/site/site"; + +/* Widgets */ + +@import "sass/site/secondary/widgets"; + +/* Blocks */ + +@import "sass/blocks/blocks"; + +/* Media */ + +@import "sass/media/media"; diff --git a/content/themes/twentynineteen/template-parts/content/content-excerpt.php b/content/themes/twentynineteen/template-parts/content/content-excerpt.php new file mode 100644 index 0000000..e474045 --- /dev/null +++ b/content/themes/twentynineteen/template-parts/content/content-excerpt.php @@ -0,0 +1,33 @@ + + +
diff --git a/content/themes/twentynineteen/template-parts/content/content-none.php b/content/themes/twentynineteen/template-parts/content/content-none.php new file mode 100644 index 0000000..f18b5a7 --- /dev/null +++ b/content/themes/twentynineteen/template-parts/content/content-none.php @@ -0,0 +1,53 @@ + + +
+ + +
+ ' . wp_kses( + /* translators: 1: Link to WP admin new post page. */ + __( 'Ready to publish your first post? Get started here.', 'twentynineteen' ), + array( + 'a' => array( + 'href' => array(), + ), + ) + ) . '

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

+ + +

+ +
+
diff --git a/content/themes/twentynineteen/template-parts/content/content-page.php b/content/themes/twentynineteen/template-parts/content/content-page.php new file mode 100644 index 0000000..8772fa3 --- /dev/null +++ b/content/themes/twentynineteen/template-parts/content/content-page.php @@ -0,0 +1,56 @@ + + +
> + +
+ +
+ + +
+ '', + ) + ); + ?> +
+ + +
+ %s', 'twentynineteen' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + get_the_title() + ), + '' . twentynineteen_get_icon_svg( 'edit', 16 ), + '' + ); + ?> +
+ +
diff --git a/content/themes/twentynineteen/template-parts/content/content-single.php b/content/themes/twentynineteen/template-parts/content/content-single.php new file mode 100644 index 0000000..7a7330b --- /dev/null +++ b/content/themes/twentynineteen/template-parts/content/content-single.php @@ -0,0 +1,55 @@ + + +
> + +
+ +
+ + +
+ "%s"', 'twentynineteen' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + ) + ); + ?> +
+ +
+ +
+ + + + + +
diff --git a/content/themes/twentynineteen/template-parts/content/content.php b/content/themes/twentynineteen/template-parts/content/content.php new file mode 100644 index 0000000..6a31af7 --- /dev/null +++ b/content/themes/twentynineteen/template-parts/content/content.php @@ -0,0 +1,59 @@ + + +
> +
+ %s', _x( 'Featured', 'post', 'twentynineteen' ) ); + } + if ( is_singular() ) : + the_title( '

', '

' ); + else : + the_title( sprintf( '

', esc_url( get_permalink() ) ), '

' ); + endif; + ?> +
+ + + +
+ "%s"', 'twentynineteen' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + ) + ); + ?> +
+ +
+ +
+
diff --git a/content/themes/twentynineteen/template-parts/footer/footer-widgets.php b/content/themes/twentynineteen/template-parts/footer/footer-widgets.php new file mode 100644 index 0000000..d66183f --- /dev/null +++ b/content/themes/twentynineteen/template-parts/footer/footer-widgets.php @@ -0,0 +1,24 @@ + + + + + diff --git a/content/themes/twentynineteen/template-parts/header/entry-header.php b/content/themes/twentynineteen/template-parts/header/entry-header.php new file mode 100644 index 0000000..163436d --- /dev/null +++ b/content/themes/twentynineteen/template-parts/header/entry-header.php @@ -0,0 +1,46 @@ + + +', '' ); ?> + + + + diff --git a/content/themes/twentynineteen/template-parts/header/site-branding.php b/content/themes/twentynineteen/template-parts/header/site-branding.php new file mode 100644 index 0000000..6224763 --- /dev/null +++ b/content/themes/twentynineteen/template-parts/header/site-branding.php @@ -0,0 +1,60 @@ + +
+ + + + + + + +

+ +

+ + + + +

+ +

+ + + + + + + +
diff --git a/content/themes/twentynineteen/template-parts/post/author-bio.php b/content/themes/twentynineteen/template-parts/post/author-bio.php new file mode 100644 index 0000000..879a410 --- /dev/null +++ b/content/themes/twentynineteen/template-parts/post/author-bio.php @@ -0,0 +1,30 @@ + +
+

+ + + +

+

+ + +

+
+ diff --git a/content/themes/twentynineteen/template-parts/post/discussion-meta.php b/content/themes/twentynineteen/template-parts/post/discussion-meta.php new file mode 100644 index 0000000..c9d8f00 --- /dev/null +++ b/content/themes/twentynineteen/template-parts/post/discussion-meta.php @@ -0,0 +1,32 @@ +responses > 0; + +if ( $has_responses ) { + /* translators: %d: Number of comments. */ + $meta_label = sprintf( _n( '%d Comment', '%d Comments', $discussion->responses, 'twentynineteen' ), $discussion->responses ); +} else { + $meta_label = __( 'No comments', 'twentynineteen' ); +} +?> + +
+ authors ); + } + ?> +

+ + +

+
diff --git a/content/themes/twentyseventeen/404.php b/content/themes/twentyseventeen/404.php new file mode 100644 index 0000000..3bbae95 --- /dev/null +++ b/content/themes/twentyseventeen/404.php @@ -0,0 +1,35 @@ + + +
+
+
+ +
+ +
+

+ + + +
+
+
+
+
+ + + +
+ + + + + +
+
+ + + twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '' . __( 'Previous page', 'twentyseventeen' ) . '', + 'next_text' => '' . __( 'Next page', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ), + 'before_page_number' => '' . __( 'Page', 'twentyseventeen' ) . ' ', + ) + ); + + else : + + get_template_part( 'template-parts/post/content', 'none' ); + + endif; + ?> + +
+
+ +
+ +>> TABLE OF CONTENTS: +---------------------------------------------------------------- +1.0 General Block Styles +2.0 Blocks - Common Blocks +3.0 Blocks - Formatting +4.0 Blocks - Layout Elements +5.0 Blocks - Widgets +6.0 Blocks - Colors +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +1.0 General Block Styles +--------------------------------------------------------------*/ + +/* Captions */ + +[class^="wp-block-"]:not(.wp-block-gallery) figcaption { + font-style: italic; + margin-bottom: 1.5em; + text-align: left; +} + +.rtl [class^="wp-block-"]:not(.wp-block-gallery) figcaption { + text-align: right; +} + +/*-------------------------------------------------------------- +2.0 Blocks - Common Blocks +--------------------------------------------------------------*/ + +/* Paragraph */ + +p.has-drop-cap:not(:focus)::first-letter { + font-size: 5em; + margin-top: 0.075em; +} + +/* Image */ + +.wp-block-image { + margin-bottom: 1.5em; +} + +.wp-block-image figure { + margin-bottom: 0; + margin-top: 0; +} + +.wp-block-image figure.alignleft { + margin-right: 1.5em; +} + +.wp-block-image figure.alignright { + margin-left: 1.5em; +} + +/* Gallery */ + +.wp-block-gallery { + margin-bottom: 1.5em; +} + +.wp-block-gallery figcaption { + font-style: italic; +} + +.wp-block-gallery.aligncenter { + display: flex; + margin: 0 -8px; +} + +/* Quote */ + +.wp-block-quote:not(.is-large):not(.is-style-large) { + border: 0; + padding: 0; +} + +.wp-block-quote.alignleft p:last-of-type, +.wp-block-quote.alignright p:last-of-type { + margin-bottom: 0; +} + +.wp-block-quote cite { + color: inherit; + font-size: inherit; +} + +/* Audio */ + +.wp-block-audio audio { + display: block; + width: 100%; +} + +/* Cover */ + +.wp-block-cover-image.alignright, +.wp-block-cover.alignright, +.wp-block-cover-image.alignleft, +.wp-block-cover.alignleft, +.wp-block-cover-image.aligncenter, +.wp-block-cover.aligncenter { + display: flex; +} + +/* File */ + +.wp-block-file .wp-block-file__button { + background-color: #222; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + margin-top: 2em; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +.wp-block-file .wp-block-file__button:hover, +.wp-block-file .wp-block-file__button:focus { + background-color: #767676; + -webkit-box-shadow: none; + box-shadow: none; +} + +/*-------------------------------------------------------------- +3.0 Blocks - Formatting +--------------------------------------------------------------*/ + +/* Code */ + +.wp-block-code { + background: transparent; + border: 0; + padding: 0; +} + +/* Pullquote */ + +.wp-block-pullquote { + border: 0; +} + +.wp-block-pullquote__citation, +.wp-block-pullquote cite { + font-size: inherit; + text-transform: none; +} + +/* Table */ + +.wp-block-table thead th { + border-bottom: 2px solid #bbb; + padding-bottom: 0.5em; +} + +.wp-block-table tr { + border-bottom: 1px solid #eee; +} + +.wp-block-table th, +.wp-block-table td { + border: 0; +} + +.rtl .wp-block-table th, +.rtl .wp-block-table td { + text-align: right; +} + +/*-------------------------------------------------------------- +4.0 Blocks - Layout Elements +--------------------------------------------------------------*/ + +/* Buttons */ + +.wp-block-button .wp-block-button__link { + -webkit-box-shadow: none; + box-shadow: none; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + line-height: 1.66; + margin-top: 2em; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +.entry-content .wp-block-button__link { + background-color: #222; + color: #fff; +} + +.entry-content .is-style-outline .wp-block-button__link:not(.has-background) { + background-color: transparent; +} + +.entry-content .is-style-outline .wp-block-button__link:not(.has-text-color) { + color: #222; +} + +.colors-dark .wp-block-button__link { + background-color: #fff; + color: #000; +} + +.entry-content .wp-block-button__link:hover, +.entry-content .wp-block-button__link:focus, +.entry-content .is-style-outline .wp-block-button__link:not(.has-background):hover, +.entry-content .is-style-outline .wp-block-button__link:not(.has-background):focus { + background-color: #767676; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; +} + +.colors-dark .entry-content .wp-block-button__link:hover, +.colors-dark .entry-content .wp-block-button__link:focus, +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-background):hover, +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-background):focus { + background-color: #bbb; + color: #000; +} + +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-text-color) { + color: #fff; +} + +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-text-color):hover, +.colors-dark .entry-content .is-style-outline .wp-block-button__link:not(.has-text-color):focus { + color: #222; +} + +.colors-custom .entry-content .wp-block-button__link, +.colors-custom .entry-content .wp-block-button__link:hover, +.colors-custom .entry-content .wp-block-button__link:focus, +.colors-dark .entry-content .wp-block-button__link, +.colors-dark .entry-content .wp-block-button__link:hover, +.colors-dark .entry-content .wp-block-button__link:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +.colors-custom .entry-content .wp-block-button__link:hover, +.colors-custom .entry-content .wp-block-button__link:focus { + color: #fff; +} + +/* Separator */ + +.wp-block-separator { + border: 0; +} + +.wp-block-separator:not(.is-style-wide):not(.is-style-dots) { + max-width: 100px; +} + +/* Media & Text */ + +.wp-block-media-text { + margin-bottom: 1.5em; +} + +.wp-block-media-text *:last-child { + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +5.0 Blocks - Widgets +--------------------------------------------------------------*/ + +/* Archives, Categories & Latest Posts */ + +.wp-block-archives.aligncenter, +.wp-block-categories.aligncenter, +.wp-block-latest-posts.aligncenter { + list-style-position: inside; + text-align: center; +} + +/* Comments */ + +.wp-block-latest-comments article { + margin-bottom: 4em; +} + +.blog:not(.has-sidebar) #primary .wp-block-latest-comments article, +.archive:not(.page-one-column):not(.has-sidebar) #primary .wp-block-latest-comments article, +.search:not(.has-sidebar) #primary .wp-block-latest-comments article { + float: none; + width: 100%; +} + +.wp-block-latest-comments .avatar, +.wp-block-latest-comments__comment-avatar { + border-radius: 0; +} + +.wp-block-latest-comments a { + -webkit-box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 1); + box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 1); + +} + +.wp-block-latest-comments__comment-meta { + font-size: 16px; + font-size: 1rem; + margin-bottom: 0.4em; +} + +.wp-block-latest-comments__comment-author, +.wp-block-latest-comments__comment-link { + font-weight: 700; + text-decoration: none; +} + +.wp-block-latest-comments__comment-date { + color: #767676; + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + margin-top: 0.4em; + text-transform: uppercase; +} + +.editor-block-list__block .wp-block-latest-comments__comment-excerpt p { + font-size: 14px; + font-size: 0.875rem; +} + +/*-------------------------------------------------------------- +6.0 Blocks - Colors +--------------------------------------------------------------*/ + +.entry-content .has-pale-pink-color { + color: #f78da7; +} + +.entry-content .has-pale-pink-background-color, +.wp-block-button.is-style-outline .has-pale-pink-background-color:link { + background-color: #f78da7; +} + +.entry-content .has-vivid-red-color { + color: #cf2e2e; +} + +.entry-content .has-vivid-red-background-color, +.wp-block-button.is-style-outline .has-vivid-red-background-color:link { + background-color: #cf2e2e; +} + +.entry-content .has-luminous-vivid-orange-color { + color: #ff6900; +} + +.entry-content .has-luminous-vivid-orange-background-color, +.wp-block-button.is-style-outline .has-luminous-vivid-orange-background-color:link { + background-color: #ff6900; +} + +.entry-content .has-luminous-vivid-amber-color { + color: #fcb900; +} + +.entry-content .has-luminous-vivid-amber-background-color, +.wp-block-button.is-style-outline .has-luminous-vivid-amber-background-color:link { + background-color: #fcb900; +} + +.entry-content .has-light-green-cyan-color { + color: #7bdcb5; +} + +.entry-content .has-light-green-cyan-background-color, +.wp-block-button.is-style-outline .has-light-green-cyan-background-color:link { + background-color: #7bdcb5; +} + +.entry-content .has-vivid-green-cyan-color { + color: #00d084; +} + +.entry-content .has-vivid-green-cyan-background-color, +.wp-block-button.is-style-outline .has-vivid-green-cyan-background-color:link { + background-color: #00d084; +} + +.entry-content .has-pale-cyan-blue-color { + color: #8ed1fc; +} + +.entry-content .has-pale-cyan-blue-background-color, +.wp-block-button.is-style-outline .has-pale-cyan-blue-background-color:link { + background-color: #8ed1fc; +} + +.entry-content .has-vivid-cyan-blue-color { + color: #0693e3; +} + +.entry-content .has-vivid-cyan-blue-background-color, +.wp-block-button.is-style-outline .has-vivid-cyan-blue-background-color:link { + background-color: #0693e3; +} + +.entry-content .has-very-light-gray-color { + color: #eee; +} + +.entry-content .has-very-light-gray-background-color, +.wp-block-button.is-style-outline .has-very-light-gray-background-color:link { + background-color: #eee; +} + +.entry-content .has-cyan-bluish-gray-color { + color: #abb8c3; +} + +.entry-content .has-cyan-bluish-gray-background-color, +.wp-block-button.is-style-outline .has-cyan-bluish-gray-background-color:link { + background-color: #abb8c3; +} + +.entry-content .has-very-dark-gray-color { + color: #313131; +} + +.entry-content .has-very-dark-gray-background-color, +.wp-block-button.is-style-outline .has-very-dark-gray-background-color:link { + background-color: #313131; +} diff --git a/content/themes/twentyseventeen/assets/css/colors-dark.css b/content/themes/twentyseventeen/assets/css/colors-dark.css new file mode 100644 index 0000000..f7b977d --- /dev/null +++ b/content/themes/twentyseventeen/assets/css/colors-dark.css @@ -0,0 +1,566 @@ +/** + * Twenty Seventeen: Dark Color Scheme + * + * See inc/color-patterns.php for dynamic color overrides for the theme. + * + * Colors are ordered from light to dark. + */ + +.colors-dark button, +.colors-dark input[type="button"], +.colors-dark input[type="submit"], +.colors-dark .entry-footer .edit-link a.post-edit-link { + background-color: #fff; +} + +.colors-dark a:hover, +.colors-dark a:active, +.colors-dark .entry-content a:focus, +.colors-dark .entry-content a:hover, +.colors-dark .entry-summary a:focus, +.colors-dark .entry-summary a:hover, +.colors-dark .comment-content a:focus, +.colors-dark .comment-content a:hover, +.colors-dark .widget a:focus, +.colors-dark .widget a:hover, +.colors-dark .site-footer .widget-area a:focus, +.colors-dark .site-footer .widget-area a:hover, +.colors-dark .posts-navigation a:focus, +.colors-dark .posts-navigation a:hover, +.colors-dark .comment-metadata a:focus, +.colors-dark .comment-metadata a:hover, +.colors-dark .comment-metadata a.comment-edit-link:focus, +.colors-dark .comment-metadata a.comment-edit-link:hover, +.colors-dark .comment-reply-link:focus, +.colors-dark .comment-reply-link:hover, +.colors-dark .widget_authors a:focus strong, +.colors-dark .widget_authors a:hover strong, +.colors-dark .entry-title a:focus, +.colors-dark .entry-title a:hover, +.colors-dark .entry-meta a:focus, +.colors-dark .entry-meta a:hover, +.colors-dark.blog .entry-meta a.post-edit-link:focus, +.colors-dark.blog .entry-meta a.post-edit-link:hover, +.colors-dark.archive .entry-meta a.post-edit-link:focus, +.colors-dark.archive .entry-meta a.post-edit-link:hover, +.colors-dark.search .entry-meta a.post-edit-link:focus, +.colors-dark.search .entry-meta a.post-edit-link:hover, +.colors-dark .page-links a:focus .page-number, +.colors-dark .page-links a:hover .page-number, +.colors-dark .entry-footer .cat-links a:focus, +.colors-dark .entry-footer .cat-links a:hover, +.colors-dark .entry-footer .tags-links a:focus, +.colors-dark .entry-footer .tags-links a:hover, +.colors-dark .post-navigation a:focus, +.colors-dark .post-navigation a:hover, +.colors-dark .pagination a:not(.prev):not(.next):focus, +.colors-dark .pagination a:not(.prev):not(.next):hover, +.colors-dark .comments-pagination a:not(.prev):not(.next):focus, +.colors-dark .comments-pagination a:not(.prev):not(.next):hover, +.colors-dark .logged-in-as a:focus, +.colors-dark .logged-in-as a:hover, +.colors-dark a:focus .nav-title, +.colors-dark a:hover .nav-title, +.colors-dark .edit-link a:focus, +.colors-dark .edit-link a:hover, +.colors-dark .site-info a:focus, +.colors-dark .site-info a:hover, +.colors-dark .widget .widget-title a:focus, +.colors-dark .widget .widget-title a:hover, +.colors-dark .widget ul li a:focus, +.colors-dark .widget ul li a:hover { + color: #fff; +} + +.colors-dark .entry-content a:focus, +.colors-dark .entry-content a:hover, +.colors-dark .entry-summary a:focus, +.colors-dark .entry-summary a:hover, +.colors-dark .comment-content a:focus, +.colors-dark .comment-content a:hover, +.colors-dark .widget a:focus, +.colors-dark .widget a:hover, +.colors-dark .site-footer .widget-area a:focus, +.colors-dark .site-footer .widget-area a:hover, +.colors-dark .posts-navigation a:focus, +.colors-dark .posts-navigation a:hover, +.colors-dark .comment-metadata a:focus, +.colors-dark .comment-metadata a:hover, +.colors-dark .comment-metadata a.comment-edit-link:focus, +.colors-dark .comment-metadata a.comment-edit-link:hover, +.colors-dark .comment-reply-link:focus, +.colors-dark .comment-reply-link:hover, +.colors-dark .widget_authors a:focus strong, +.colors-dark .widget_authors a:hover strong, +.colors-dark .entry-title a:focus, +.colors-dark .entry-title a:hover, +.colors-dark .entry-meta a:focus, +.colors-dark .entry-meta a:hover, +.colors-dark.blog .entry-meta a.post-edit-link:focus, +.colors-dark.blog .entry-meta a.post-edit-link:hover, +.colors-dark.archive .entry-meta a.post-edit-link:focus, +.colors-dark.archive .entry-meta a.post-edit-link:hover, +.colors-dark.search .entry-meta a.post-edit-link:focus, +.colors-dark.search .entry-meta a.post-edit-link:hover, +.colors-dark .page-links a:focus .page-number, +.colors-dark .page-links a:hover .page-number, +.colors-dark .entry-footer .cat-links a:focus, +.colors-dark .entry-footer .cat-links a:hover, +.colors-dark .entry-footer .tags-links a:focus, +.colors-dark .entry-footer .tags-links a:hover, +.colors-dark .post-navigation a:focus, +.colors-dark .post-navigation a:hover, +.colors-dark .pagination a:not(.prev):not(.next):focus, +.colors-dark .pagination a:not(.prev):not(.next):hover, +.colors-dark .comments-pagination a:not(.prev):not(.next):focus, +.colors-dark .comments-pagination a:not(.prev):not(.next):hover, +.colors-dark .logged-in-as a:focus, +.colors-dark .logged-in-as a:hover, +.colors-dark a:focus .nav-title, +.colors-dark a:hover .nav-title, +.colors-dark .edit-link a:focus, +.colors-dark .edit-link a:hover, +.colors-dark .site-info a:focus, +.colors-dark .site-info a:hover, +.colors-dark .widget .widget-title a:focus, +.colors-dark .widget .widget-title a:hover, +.colors-dark .widget ul li a:focus, +.colors-dark .widget ul li a:hover { + -webkit-box-shadow: inset 0 0 0 rgba(255, 255, 255, 0), 0 3px 0 rgba(255, 255, 255, 1); /* Equivalant to #fff */ + box-shadow: inset 0 0 0 rgba(255, 255, 255, 0), 0 3px 0 rgba(255, 255, 255, 1); /* Equivalant to #fff */ +} + +.colors-dark .entry-content a, +.colors-dark .entry-summary a, +.colors-dark .comment-content a, +.colors-dark .widget a, +.colors-dark .site-footer .widget-area a, +.colors-dark .posts-navigation a, +.colors-dark .widget_authors a strong { + -webkit-box-shadow: inset 0 -1px 0 rgba(240, 240, 240, 1); /* Equivalant to #f0f0f0 */ + box-shadow: inset 0 -1px 0 rgba(240, 240, 240, 1); /* Equivalant to #f0f0f0 */ +} + +body.colors-dark, +.colors-dark button, +.colors-dark input, +.colors-dark select, +.colors-dark textarea, +.colors-dark h3, +.colors-dark h4, +.colors-dark h6, +.colors-dark label, +.colors-dark .entry-title a, +.colors-dark.twentyseventeen-front-page .panel-content .recent-posts article, +.colors-dark .entry-footer .cat-links a, +.colors-dark .entry-footer .tags-links a, +.colors-dark .format-quote blockquote, +.colors-dark .nav-title, +.colors-dark .comment-body { + color: #eee; +} + +/* Placeholder text color -- selectors need to be separate to work. */ +.colors-dark ::-webkit-input-placeholder { + color: #ddd; +} + +.colors-dark :-moz-placeholder { + color: #ddd; +} + +.colors-dark ::-moz-placeholder { + color: #ddd; +} + +.colors-dark :-ms-input-placeholder { + color: #ddd; +} + +.colors-dark input[type="text"]:focus, +.colors-dark input[type="email"]:focus, +.colors-dark input[type="url"]:focus, +.colors-dark input[type="password"]:focus, +.colors-dark input[type="search"]:focus, +.colors-dark input[type="number"]:focus, +.colors-dark input[type="tel"]:focus, +.colors-dark input[type="range"]:focus, +.colors-dark input[type="date"]:focus, +.colors-dark input[type="month"]:focus, +.colors-dark input[type="week"]:focus, +.colors-dark input[type="time"]:focus, +.colors-dark input[type="datetime"]:focus, +.colors-dark input[type="datetime-local"]:focus, +.colors-dark input[type="color"]:focus, +.colors-dark textarea:focus, +.bypostauthor > .comment-body > .comment-meta > .comment-author .avatar { + border-color: #eee; +} + +.colors-dark input[type="text"]:focus, +.colors-dark input[type="email"]:focus, +.colors-dark input[type="url"]:focus, +.colors-dark input[type="password"]:focus, +.colors-dark input[type="search"]:focus, +.colors-dark input[type="number"]:focus, +.colors-dark input[type="tel"]:focus, +.colors-dark input[type="range"]:focus, +.colors-dark input[type="date"]:focus, +.colors-dark input[type="month"]:focus, +.colors-dark input[type="week"]:focus, +.colors-dark input[type="time"]:focus, +.colors-dark input[type="datetime"]:focus, +.colors-dark input[type="datetime-local"]:focus, +.colors-dark input[type="color"]:focus, +.colors-dark textarea:focus, +.colors-dark button.secondary, +.colors-dark input[type="reset"], +.colors-dark input[type="button"].secondary, +.colors-dark input[type="reset"].secondary, +.colors-dark input[type="submit"].secondary, +.colors-dark a, +.colors-dark .site-title, +.colors-dark .site-title a, +.colors-dark .navigation-top a, +.colors-dark .dropdown-toggle, +.colors-dark .menu-toggle, +.colors-dark .page .panel-content .entry-title, +.colors-dark .page-title, +.colors-dark.page:not(.twentyseventeen-front-page) .entry-title, +.colors-dark .page-links a .page-number, +.colors-dark .comment-metadata a.comment-edit-link, +.colors-dark .comment-reply-link .icon, +.colors-dark h2.widget-title, +.colors-dark mark, +.colors-dark .post-navigation a:focus .icon, +.colors-dark .post-navigation a:hover .icon, +.colors-dark.blog .entry-meta a.post-edit-link, +.colors-dark.archive .entry-meta a.post-edit-link, +.colors-dark.search .entry-meta a.post-edit-link, +.colors-custom .twentyseventeen-panel .recent-posts .entry-header .edit-link { + color: #ddd; +} + +.colors-dark h2, +.colors-dark blockquote, +.colors-dark input[type="text"], +.colors-dark input[type="email"], +.colors-dark input[type="url"], +.colors-dark input[type="password"], +.colors-dark input[type="search"], +.colors-dark input[type="number"], +.colors-dark input[type="tel"], +.colors-dark input[type="range"], +.colors-dark input[type="date"], +.colors-dark input[type="month"], +.colors-dark input[type="week"], +.colors-dark input[type="time"], +.colors-dark input[type="datetime"], +.colors-dark input[type="datetime-local"], +.colors-dark input[type="color"], +.colors-dark textarea, +.colors-dark .navigation-top .current-menu-item > a, +.colors-dark .navigation-top .current_page_item > a, +.colors-dark .entry-content blockquote.alignleft, +.colors-dark .entry-content blockquote.alignright, +.colors-dark .taxonomy-description, +.colors-dark .site-info a, +.colors-dark .wp-caption { + color: #ccc; +} + +.colors-dark abbr, +.colors-dark acronym { + border-bottom-color: #ccc; +} + +.colors-dark h5, +.main-navigation a:hover, +.colors-dark .entry-meta, +.colors-dark .entry-meta a, +.colors-dark .nav-subtitle, +.colors-dark .comment-metadata, +.colors-dark .comment-metadata a, +.colors-dark .no-comments, +.colors-dark .comment-awaiting-moderation, +.colors-dark .page-numbers.current, +.colors-dark .page-links .page-number, +.colors-dark .site-description { + color: #bbb; +} + +.colors-dark :not( .mejs-button ) > button:hover, +.colors-dark :not( .mejs-button ) > button:focus, +.colors-dark input[type="button"]:hover, +.colors-dark input[type="button"]:focus, +.colors-dark input[type="submit"]:hover, +.colors-dark input[type="submit"]:focus, +.colors-dark .prev.page-numbers:focus, +.colors-dark .prev.page-numbers:hover, +.colors-dark .next.page-numbers:focus, +.colors-dark .next.page-numbers:hover, +.colors-dark .entry-footer .edit-link a.post-edit-link:focus, +.colors-dark .entry-footer .edit-link a.post-edit-link:hover { + background: #bbb; +} + +.colors-dark .social-navigation a:hover, +.colors-dark .social-navigation a:focus { + background: #999; + color: #222; +} + +.colors-dark .entry-footer .cat-links .icon, +.colors-dark .entry-footer .tags-links .icon { + color: #666; +} + +.colors-dark button.secondary:hover, +.colors-dark button.secondary:focus, +.colors-dark input[type="reset"]:hover, +.colors-dark input[type="reset"]:focus, +.colors-dark input[type="button"].secondary:hover, +.colors-dark input[type="button"].secondary:focus, +.colors-dark input[type="reset"].secondary:hover, +.colors-dark input[type="reset"].secondary:focus, +.colors-dark input[type="submit"].secondary:hover, +.colors-dark input[type="submit"].secondary:focus, +.colors-dark .social-navigation a, +.colors-dark hr { + background: #555; +} + +.colors-dark input[type="text"], +.colors-dark input[type="email"], +.colors-dark input[type="url"], +.colors-dark input[type="password"], +.colors-dark input[type="search"], +.colors-dark input[type="number"], +.colors-dark input[type="tel"], +.colors-dark input[type="range"], +.colors-dark input[type="date"], +.colors-dark input[type="month"], +.colors-dark input[type="week"], +.colors-dark input[type="time"], +.colors-dark input[type="datetime"], +.colors-dark input[type="datetime-local"], +.colors-dark input[type="color"], +.colors-dark textarea, +.colors-dark select, +.colors-dark fieldset, +.colors-dark .widget .tagcloud a:hover, +.colors-dark .widget .tagcloud a:focus, +.colors-dark .widget.widget_tag_cloud a:hover, +.colors-dark .widget.widget_tag_cloud a:focus, +.colors-dark .wp_widget_tag_cloud a:hover, +.colors-dark .wp_widget_tag_cloud a:focus { + border-color: #555; +} + +.colors-dark button.secondary, +.colors-dark input[type="reset"], +.colors-dark input[type="button"].secondary, +.colors-dark input[type="reset"].secondary, +.colors-dark input[type="submit"].secondary, +.colors-dark .prev.page-numbers, +.colors-dark .next.page-numbers { + background-color: #444; +} + +.colors-dark .widget .tagcloud a, +.colors-dark .widget.widget_tag_cloud a, +.colors-dark .wp_widget_tag_cloud a { + border-color: #444; +} + +.colors-dark.twentyseventeen-front-page article:not(.has-post-thumbnail):not(:first-child), +.colors-dark .widget ul li { + border-top-color: #444; +} + +.colors-dark .widget ul li { + border-bottom-color: #444; +} + +.colors-dark pre, +.colors-dark mark, +.colors-dark ins, +.colors-dark input[type="text"], +.colors-dark input[type="email"], +.colors-dark input[type="url"], +.colors-dark input[type="password"], +.colors-dark input[type="search"], +.colors-dark input[type="number"], +.colors-dark input[type="tel"], +.colors-dark input[type="range"], +.colors-dark input[type="date"], +.colors-dark input[type="month"], +.colors-dark input[type="week"], +.colors-dark input[type="time"], +.colors-dark input[type="datetime"], +.colors-dark input[type="datetime-local"], +.colors-dark input[type="color"], +.colors-dark textarea, +.colors-dark select, +.colors-dark fieldset { + background: #333; +} + +.colors-dark tr, +.colors-dark thead th { + border-color: #333; +} + +.colors-dark .navigation-top, +.colors-dark .main-navigation > div > ul, +.colors-dark .pagination, +.colors-dark .comment-navigation, +.colors-dark .entry-footer, +.colors-dark .site-footer { + border-top-color: #333; +} + +.colors-dark .single-featured-image-header, +.colors-dark .navigation-top, +.colors-dark .main-navigation li, +.colors-dark .entry-footer, +.colors-dark #comments { + border-bottom-color: #333; +} + +.colors-dark .site-header, +.colors-dark .single-featured-image-header { + background-color: #262626; +} + +.colors-dark button, +.colors-dark input[type="button"], +.colors-dark input[type="submit"], +.colors-dark .prev.page-numbers:focus, +.colors-dark .prev.page-numbers:hover, +.colors-dark .next.page-numbers:focus, +.colors-dark .next.page-numbers:hover { + color: #222; +} + +body.colors-dark, +.colors-dark .site-content-contain, +.colors-dark .navigation-top, +.colors-dark .main-navigation ul { + background: #222; +} + +.colors-dark .entry-title a, +.colors-dark .entry-meta a, +.colors-dark.blog .entry-meta a.post-edit-link, +.colors-dark.archive .entry-meta a.post-edit-link, +.colors-dark.search .entry-meta a.post-edit-link, +.colors-dark .page-links a, +.colors-dark .page-links a .page-number, +.colors-dark .entry-footer a, +.colors-dark .entry-footer .cat-links a, +.colors-dark .entry-footer .tags-links a, +.colors-dark .edit-link a, +.colors-dark .post-navigation a, +.colors-dark .logged-in-as a, +.colors-dark .comment-navigation a, +.colors-dark .comment-metadata a, +.colors-dark .comment-metadata a.comment-edit-link, +.colors-dark .comment-reply-link, +.colors-dark a .nav-title, +.colors-dark .pagination a, +.colors-dark .comments-pagination a, +.colors-dark .widget .widget-title a, +.colors-dark .widget ul li a, +.colors-dark .site-footer .widget-area ul li a, +.colors-dark .site-info a { + -webkit-box-shadow: inset 0 -1px 0 rgba(34, 34, 34, 1); /* Equivalant to #222 */ + box-shadow: inset 0 -1px 0 rgba(34, 34, 34, 1); /* Equivalant to #222 */ +} + +/* Fixes linked images */ +.colors-dark .entry-content a img, +.colors-dark .comment-content a img, +.colors-dark .widget a img { + -webkit-box-shadow: 0 0 0 8px #222; + box-shadow: 0 0 0 8px #222; +} + +.colors-dark .entry-footer .edit-link a.post-edit-link { + color: #000; +} + +.colors-dark .menu-toggle, +.colors-dark .menu-toggle:hover, +.colors-dark .menu-toggle:focus, +.colors-dark .dropdown-toggle, +.colors-dark .dropdown-toggle:hover, +.colors-dark .dropdown-toggle:focus, +.colors-dark .menu-scroll-down, +.colors-dark .menu-scroll-down:hover, +.colors-dark .menu-scroll-down:focus { + background-color: transparent; +} + +.colors-dark .gallery-item a, +.colors-dark .gallery-item a:hover, +.colors-dark .gallery-item a:focus, +.colors-dark .widget .tagcloud a, +.colors-dark .widget .tagcloud a:focus, +.colors-dark .widget .tagcloud a:hover, +.colors-dark .widget.widget_tag_cloud a, +.colors-dark .widget.widget_tag_cloud a:focus, +.colors-dark .widget.widget_tag_cloud a:hover, +.colors-dark .wp_widget_tag_cloud a, +.colors-dark .wp_widget_tag_cloud a:focus, +.colors-dark .wp_widget_tag_cloud a:hover, +.colors-dark .entry-footer .edit-link a.post-edit-link:focus, +.colors-dark .entry-footer .edit-link a.post-edit-link:hover { + -webkit-box-shadow: none; + box-shadow: none; +} + +@media screen and (min-width: 48em) { + + .colors-dark .nav-links .nav-previous .nav-title .icon, + .colors-dark .nav-links .nav-next .nav-title .icon { + color: #eee; + } + + .colors-dark .main-navigation li li:hover, + .colors-dark .main-navigation li li.focus { + background: #999; + } + + .colors-dark .menu-scroll-down { + color: #999; + } + + .colors-dark .main-navigation ul ul { + border-color: #333; + background: #222; + } + + .colors-dark .main-navigation ul li.menu-item-has-children:before, + .colors-dark .main-navigation ul li.page_item_has_children:before { + border-bottom-color: #333; + } + + .main-navigation ul li.menu-item-has-children:after, + .main-navigation ul li.page_item_has_children:after { + border-bottom-color: #222; + } + + .colors-dark .main-navigation li li.focus > a, + .colors-dark .main-navigation li li:focus > a, + .colors-dark .main-navigation li li:hover > a, + .colors-dark .main-navigation li li a:hover, + .colors-dark .main-navigation li li a:focus, + .colors-dark .main-navigation li li.current_page_item a:hover, + .colors-dark .main-navigation li li.current-menu-item a:hover, + .colors-dark .main-navigation li li.current_page_item a:focus, + .colors-dark .main-navigation li li.current-menu-item a:focus { + color: #222; + } + +} diff --git a/content/themes/twentyseventeen/assets/css/editor-blocks.css b/content/themes/twentyseventeen/assets/css/editor-blocks.css new file mode 100644 index 0000000..361e5b6 --- /dev/null +++ b/content/themes/twentyseventeen/assets/css/editor-blocks.css @@ -0,0 +1,808 @@ +/* +Theme Name: Twenty Seventeen +Description: Used to style blocks in the editor. +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +1.0 General Typography +2.0 General Block Settings +3.0 Blocks - Common Blocks +4.0 Blocks - Formatting +5.0 Blocks - Layout Elements +6.0 Blocks - Widgets + +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +1.0 General Typography +--------------------------------------------------------------*/ + +.edit-post-visual-editor .editor-block-list__block, +.editor-default-block-appender textarea.editor-default-block-appender__content { + font-size: 15px; + font-size: 0.9375rem; +} + +.editor-default-block-appender textarea.editor-default-block-appender__content { + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; +} + +.edit-post-visual-editor .editor-block-list__block { + color: #333; +} + +.editor-post-title__block .editor-post-title__input { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; +} + +@media screen and (min-width: 30em) { + + .edit-post-visual-editor .editor-block-list__block { + font-size: 18px; + font-size: 1.125rem; + } + + .editor-post-title__block .editor-post-title__input { + font-size: 26px; + font-size: 1.625rem; + } + + .edit-post-visual-editor .editor-block-list__block h1 { + font-size: 30px; + font-size: 1.875rem; + } + + .edit-post-visual-editor .editor-block-list__block h2 { + font-size: 26px; + font-size: 1.625rem; + } + + .edit-post-visual-editor .editor-block-list__block h3 { + font-size: 22px; + font-size: 1.375rem; + } + + .edit-post-visual-editor .editor-block-list__block h4 { + font-size: 18px; + font-size: 1.125rem; + } + + .edit-post-visual-editor .editor-block-list__block h5 { + font-size: 13px; + font-size: 0.8125rem; + } + + .edit-post-visual-editor .editor-block-list__block h6 { + font-size: 16px; + font-size: 1rem; + } +} + +@media screen and (min-width: 48em) { + + .edit-post-visual-editor .editor-block-list__block { + font-size: 16px; + font-size: 1rem; + } + + .editor-rich-text__tinymce.mce-content-body { + line-height: 1.5; + } +} + +/* Typography for Arabic Font */ + +html[lang="ar"] .edit-post-visual-editor .editor-block-list__block, +html[lang="ary"] .edit-post-visual-editor .editor-block-list__block, +html[lang="azb"] .edit-post-visual-editor .editor-block-list__block, +html[lang="fa-IR"] .edit-post-visual-editor .editor-block-list__block, +html[lang="haz"] .edit-post-visual-editor .editor-block-list__block, +html[lang="ps"] .edit-post-visual-editor .editor-block-list__block, +html[lang="ur"] .edit-post-visual-editor .editor-block-list__block { + font-family: Tahoma, Arial, sans-serif; +} + +html[lang="ar"] .edit-post-visual-editor h1, +html[lang="ar"] .edit-post-visual-editor h2, +html[lang="ar"] .edit-post-visual-editor h3, +html[lang="ar"] .edit-post-visual-editor h4, +html[lang="ar"] .edit-post-visual-editor h5, +html[lang="ar"] .edit-post-visual-editor h6, +html[lang="ary"] .edit-post-visual-editor h1, +html[lang="ary"] .edit-post-visual-editor h2, +html[lang="ary"] .edit-post-visual-editor h3, +html[lang="ary"] .edit-post-visual-editor h4, +html[lang="ary"] .edit-post-visual-editor h5, +html[lang="ary"] .edit-post-visual-editor h6, +html[lang="azb"] .edit-post-visual-editor h1, +html[lang="azb"] .edit-post-visual-editor h2, +html[lang="azb"] .edit-post-visual-editor h3, +html[lang="azb"] .edit-post-visual-editor h4, +html[lang="azb"] .edit-post-visual-editor h5, +html[lang="azb"] .edit-post-visual-editor h6, +html[lang="fa-IR"] .edit-post-visual-editor h1, +html[lang="fa-IR"] .edit-post-visual-editor h2, +html[lang="fa-IR"] .edit-post-visual-editor h3, +html[lang="fa-IR"] .edit-post-visual-editor h4, +html[lang="fa-IR"] .edit-post-visual-editor h5, +html[lang="fa-IR"] .edit-post-visual-editor h6, +html[lang="haz"] .edit-post-visual-editor h1, +html[lang="haz"] .edit-post-visual-editor h2, +html[lang="haz"] .edit-post-visual-editor h3, +html[lang="haz"] .edit-post-visual-editor h4, +html[lang="haz"] .edit-post-visual-editor h5, +html[lang="haz"] .edit-post-visual-editor h6, +html[lang="ps"] .edit-post-visual-editor h1, +html[lang="ps"] .edit-post-visual-editor h2, +html[lang="ps"] .edit-post-visual-editor h3, +html[lang="ps"] .edit-post-visual-editor h4, +html[lang="ps"] .edit-post-visual-editor h5, +html[lang="ps"] .edit-post-visual-editor h6, +html[lang="ur"] .edit-post-visual-editor h1, +html[lang="ur"] .edit-post-visual-editor h2, +html[lang="ur"] .edit-post-visual-editor h3, +html[lang="ur"] .edit-post-visual-editor h4, +html[lang="ur"] .edit-post-visual-editor h5, +html[lang="ur"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Chinese Font */ + +html[lang^="zh-"] .edit-post-visual-editor .editor-block-list__block { + font-family: "PingFang TC", "Helvetica Neue", Helvetica, STHeitiTC-Light, Arial, sans-serif; +} + +html[lang="zh-CN"] .edit-post-visual-editor .editor-block-list__block { + font-family: "PingFang SC", "Helvetica Neue", Helvetica, STHeitiSC-Light, Arial, sans-serif; +} + +html[lang^="zh-"] .edit-post-visual-editor h1, +html[lang^="zh-"] .edit-post-visual-editor h2, +html[lang^="zh-"] .edit-post-visual-editor h3, +html[lang^="zh-"] .edit-post-visual-editor h4, +html[lang^="zh-"] .edit-post-visual-editor h5, +html[lang^="zh-"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Cyrillic Font */ + +html[lang="bg-BG"] .edit-post-visual-editor .editor-block-list__block, +html[lang="ru-RU"] .edit-post-visual-editor .editor-block-list__block, +html[lang="uk"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +html[lang="bg-BG"] .edit-post-visual-editor h1, +html[lang="bg-BG"] .edit-post-visual-editor h2, +html[lang="bg-BG"] .edit-post-visual-editor h3, +html[lang="bg-BG"] .edit-post-visual-editor h4, +html[lang="bg-BG"] .edit-post-visual-editor h5, +html[lang="bg-BG"] .edit-post-visual-editor h6, +html[lang="ru-RU"] .edit-post-visual-editor h1, +html[lang="ru-RU"] .edit-post-visual-editor h2, +html[lang="ru-RU"] .edit-post-visual-editor h3, +html[lang="ru-RU"] .edit-post-visual-editor h4, +html[lang="ru-RU"] .edit-post-visual-editor h5, +html[lang="ru-RU"] .edit-post-visual-editor h6, +html[lang="uk"] .edit-post-visual-editor h1, +html[lang="uk"] .edit-post-visual-editor h2, +html[lang="uk"] .edit-post-visual-editor h3, +html[lang="uk"] .edit-post-visual-editor h4, +html[lang="uk"] .edit-post-visual-editor h5, +html[lang="uk"] .edit-post-visual-editor h6 { + font-weight: 700; + line-height: 1.2; +} + +/* Typography for Devanagari Font */ + +html[lang="bn-BD"] .edit-post-visual-editor .editor-block-list__block, +html[lang="hi-IN"] .edit-post-visual-editor .editor-block-list__block, +html[lang="mr-IN"] .edit-post-visual-editor .editor-block-list__block { + font-family: Arial, sans-serif; +} + +html[lang="bn-BD"] .edit-post-visual-editor h1, +html[lang="bn-BD"] .edit-post-visual-editor h2, +html[lang="bn-BD"] .edit-post-visual-editor h3, +html[lang="bn-BD"] .edit-post-visual-editor h4, +html[lang="bn-BD"] .edit-post-visual-editor h5, +html[lang="bn-BD"] .edit-post-visual-editor h6, +html[lang="hi-IN"] .edit-post-visual-editor h1, +html[lang="hi-IN"] .edit-post-visual-editor h2, +html[lang="hi-IN"] .edit-post-visual-editor h3, +html[lang="hi-IN"] .edit-post-visual-editor h4, +html[lang="hi-IN"] .edit-post-visual-editor h5, +html[lang="hi-IN"] .edit-post-visual-editor h6, +html[lang="mr-IN"] .edit-post-visual-editor h1, +html[lang="mr-IN"] .edit-post-visual-editor h2, +html[lang="mr-IN"] .edit-post-visual-editor h3, +html[lang="mr-IN"] .edit-post-visual-editor h4, +html[lang="mr-IN"] .edit-post-visual-editor h5, +html[lang="mr-IN"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Greek Font */ + +html[lang="el"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +html[lang="el"] .edit-post-visual-editor h1, +html[lang="el"] .edit-post-visual-editor h2, +html[lang="el"] .edit-post-visual-editor h3, +html[lang="el"] .edit-post-visual-editor h4, +html[lang="el"] .edit-post-visual-editor h5, +html[lang="el"] .edit-post-visual-editor h6 { + font-weight: 700; + line-height: 1.3; +} + +/* Typography for Gujarati Font */ + +html[lang="gu-IN"] .edit-post-visual-editor .editor-block-list__block { + font-family: Arial, sans-serif; +} + +html[lang="gu-IN"] .edit-post-visual-editor h1, +html[lang="gu-IN"] .edit-post-visual-editor h2, +html[lang="gu-IN"] .edit-post-visual-editor h3, +html[lang="gu-IN"] .edit-post-visual-editor h4, +html[lang="gu-IN"] .edit-post-visual-editor h5, +html[lang="gu-IN"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Hebrew Font */ + +html[lang="he-IL"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +html[lang="he-IL"] .edit-post-visual-editor h1, +html[lang="he-IL"] .edit-post-visual-editor h2, +html[lang="he-IL"] .edit-post-visual-editor h3, +html[lang="he-IL"] .edit-post-visual-editor h4, +html[lang="he-IL"] .edit-post-visual-editor h5, +html[lang="he-IL"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Japanese Font */ + +html[lang="ja"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Hiragino Kaku Gothic Pro", Meiryo, sans-serif; +} + +html[lang="ja"] .edit-post-visual-editor h1, +html[lang="ja"] .edit-post-visual-editor h2, +html[lang="ja"] .edit-post-visual-editor h3, +html[lang="ja"] .edit-post-visual-editor h4, +html[lang="ja"] .edit-post-visual-editor h5, +html[lang="ja"] .edit-post-visual-editor h6 { + font-weight: 700; +} + +/* Typography for Korean font */ + +html[lang="ko-KR"] .edit-post-visual-editor .editor-block-list__block { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +html[lang="ko-KR"] .edit-post-visual-editor h1, +html[lang="ko-KR"] .edit-post-visual-editor h2, +html[lang="ko-KR"] .edit-post-visual-editor h3, +html[lang="ko-KR"] .edit-post-visual-editor h4, +html[lang="ko-KR"] .edit-post-visual-editor h5, +html[lang="ko-KR"] .edit-post-visual-editor h6 { + font-weight: 600; +} + +/* Typography for Thai Font */ + +html[lang="th"] .edit-post-visual-editor .editor-block-list__block { + line-height: 1.8; + font-family: "Sukhumvit Set", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +html[lang="th"] .edit-post-visual-editor h1, +html[lang="th"] .edit-post-visual-editor h2, +html[lang="th"] .edit-post-visual-editor h3, +html[lang="th"] .edit-post-visual-editor h4, +html[lang="th"] .edit-post-visual-editor h5, +html[lang="th"] .edit-post-visual-editor h6 { + line-height: 1.65; + font-family: "Sukhumvit Set", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +/* Remove letter-spacing for all non-latin alphabets */ + +html[lang="ar"] .edit-post-visual-editor *, +html[lang="ary"] .edit-post-visual-editor *, +html[lang="azb"] .edit-post-visual-editor *, +html[lang="haz"] .edit-post-visual-editor *, +html[lang="ps"] .edit-post-visual-editor *, +html[lang^="zh-"] .edit-post-visual-editor *, +html[lang="bg-BG"] .edit-post-visual-editor *, +html[lang="ru-RU"] .edit-post-visual-editor *, +html[lang="uk"] .edit-post-visual-editor *, +html[lang="bn-BD"] .edit-post-visual-editor *, +html[lang="hi-IN"] .edit-post-visual-editor *, +html[lang="mr-IN"] .edit-post-visual-editor *, +html[lang="el"] .edit-post-visual-editor *, +html[lang="gu-IN"] .edit-post-visual-editor *, +html[lang="he-IL"] .edit-post-visual-editor *, +html[lang="ja"] .edit-post-visual-editor *, +html[lang="ko-KR"] .edit-post-visual-editor *, +html[lang="th"] .edit-post-visual-editor * { + letter-spacing: 0 !important; +} + +/*-------------------------------------------------------------- +2.0 General Block Settings +--------------------------------------------------------------*/ + +/* Main column width */ + +.editor-styles-wrapper { + max-width: 100% !important; /* Override where editor-style.css is affecting this. */ +} + +.wp-block { + max-width: 674px; /* Based on one-column post width; 644px + 30px to account for padding. */ +} + +/* Alignments */ + +.edit-post-visual-editor .alignleft { + margin-right: 1.5em; +} + +.edit-post-visual-editor .alignright { + margin-left: 1.5em; +} + +/* Link styles */ + +.edit-post-visual-editor a, +.editor-block-list__block a, +.wp-block-freeform.block-library-rich-text__tinymce a { + color: #222; +} + +/* List styles */ + +.edit-post-visual-editor ul:not(.wp-block-gallery), +.editor-block-list__block ul:not(.wp-block-gallery), +.block-library-list ul, +.edit-post-visual-editor ol, +.editor-block-list__block ol, +.block-library-list ol, +.block-library-list .editor-rich-text__tinymce { + margin: 0 0 1.5em 1.5em; + padding: 0; +} + +.edit-post-visual-editor ul:not(.wp-block-gallery), +.editor-block-list__block ul:not(.wp-block-gallery), +.block-library-list ul { + list-style: disc; +} + +.edit-post-visual-editor ol, +.editor-block-list__block ol, +.block-library-list ol { + list-style: decimal; +} + +.edit-post-visual-editor li > ul:not(.wp-block-gallery), +.editor-block-list__block li > ul:not(.wp-block-gallery), +.block-library-list li > ul:not(.wp-block-gallery), +.edit-post-visual-editor li > ol, +.editor-block-list__block li > ol, +.block-library-list li > ol { + margin-bottom: 0; + margin-left: 1.5em; +} + +.edit-post-visual-editor li, +.editor-block-list__block li, +.block-library-list li { + margin: 0; +} + +.rtl .edit-post-visual-editor ul:not(.wp-block-gallery), +.rtl .editor-block-list__block ul:not(.wp-block-gallery), +.rtl .block-library-list ul, +.rtl .edit-post-visual-editor ol, +.rtl .editor-block-list__block ol, +.rtl .block-library-list ol, +.rtl .block-library-list .editor-rich-text__tinymce, +.rtl .edit-post-visual-editor li > ul:not(.wp-block-gallery), +.rtl .editor-block-list__block li > ul:not(.wp-block-gallery), +.rtl .block-library-list li > ul:not(.wp-block-gallery), +.rtl .edit-post-visual-editor li > ol, +.rtl .editor-block-list__block li > ol, +.rtl .block-library-list li > ol { + margin-left: 1.5em; + margin-right: 1.5em; +} + +/* Quote styles */ + +.editor-block-list__block blockquote p { + font-size: 18px; + font-size: 1.125rem; +} + +.editor-block-list__block blockquote.alignright p, +.editor-block-list__block blockquote.alignleft p { + font-size: 13px; + font-size: 0.8125rem; +} + +.editor-block-list__block blockquote cite { + display: block; + font-style: normal; + font-weight: 600; + margin-top: 0.5em; +} + +/* Caption styles*/ + +[class^="wp-block-"]:not(.wp-block-gallery) figcaption { + font-style: italic; + margin-bottom: 1.5em; + text-align: left; +} + +.rtl [class^="wp-block-"]:not(.wp-block-gallery) figcaption { + text-align: right; +} + +/* Code styles */ + +.wp-block-freeform.block-library-rich-text__tinymce code { + background: transparent; +} + +/* Table styles */ + +.rtl .editor-block-list__block th { + text-align: right; +} + +/*-------------------------------------------------------------- +3.0 Blocks - Common Blocks +--------------------------------------------------------------*/ + +/* Paragraph */ + +.wp-block-paragraph.has-drop-cap:not(:focus)::first-letter { + font-size: 5em; + margin-top: 0.075em; +} + +.wp-block-paragraph.has-background { + padding: 20px 30px; +} + +/* Gallery */ + +.wp-block-gallery figcaption { + font-style: italic; +} + +/* Quote */ + +.wp-block-quote { + color: #666; + font-size: 18px; + font-size: 1.125rem; + font-style: italic; + line-height: 1.7; +} + +.wp-block-quote:not(.is-large):not(.is-style-large) { + border: 0; + padding: 0; +} + +.editor-block-list__block .wp-block-quote .wp-block-quote__citation { + color: inherit; + display: block; + font-size: inherit; + font-style: normal; + font-weight: 600; + margin-top: 0.5em; +} + +.wp-block-quote.alignleft, +.wp-block-quote.alignright { + color: #666; + width: 48%; +} + +.editor-block-list__block .wp-block-quote.alignleft p, +.editor-block-list__block .wp-block-quote.alignright p, +.editor-block-list__block .wp-block-quote.alignleft .wp-block-quote__citation, +.editor-block-list__block .wp-block-quote.alignright .wp-block-quote__citation { + font-size: 13px; + font-size: 0.8125rem; +} + +.editor-block-list__block .wp-block-quote.alignleft p:last-of-type, +.editor-block-list__block .wp-block-quote.alignright p:last-of-type { + margin-bottom: 0; +} + +.wp-block-quote.is-large .wp-block-quote__citation, +.wp-block-quote.is-style-large .wp-block-quote__citation { + text-align: right; +} + +.rtl .wp-block-quote.is-large .wp-block-quote__citation, +.rtl .wp-block-quote.is-style-large .wp-block-quote__citation { + text-align: left; +} + +@media screen and (min-width: 30em) { + .editor-block-list__block .wp-block-quote.alignleft p, + .editor-block-list__block .wp-block-quote.alignright p, + .editor-block-list__block .wp-block-quote.alignleft .wp-block-quote__citation, + .editor-block-list__block .wp-block-quote.alignright .wp-block-quote__citation, + .editor-block-list__block .wp-block-quote footer { + font-size: 14px; + font-size: 0.875rem; + } +} + +@media screen and (min-width: 48em) { + .editor-block-list__block .wp-block-quote.alignleft p, + .editor-block-list__block .wp-block-quote.alignright p, + .editor-block-list__block .wp-block-quote.alignleft .wp-block-quote__citation, + .editor-block-list__block .wp-block-quote.alignright .wp-block-quote__citation { + font-size: 13px; + font-size: 0.8125rem; + } + + .editor-block-list__block .wp-block-quote.alignleft { + margin-left: -17.5%; + width: 48%; + } + + .editor-block-list__block .wp-block-quote.alignright { + margin-right: -17.5%; + width: 48%; + } +} + +/* File */ + +.wp-block-file .wp-block-file__textlink { + -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 1px 0 rgba(0, 0, 0, 1); + box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 1px 0 rgba(0, 0, 0, 1); +} + +.wp-block-file .wp-block-file__button { + background-color: #222; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +/*-------------------------------------------------------------- +4.0 Blocks - Formatting +--------------------------------------------------------------*/ + +/* Code */ + +.wp-block-code { + border: 0; + padding: 0; +} + +/* Classic */ + +.wp-block-freeform.block-library-rich-text__tinymce li, +.wp-block-freeform.block-library-rich-text__tinymce p { + line-height: 1.5; +} + +.wp-block-freeform.block-library-rich-text__tinymce blockquote { + border: 0; + padding: 0; +} + +/* Pullquote */ + +.wp-block-pullquote { + border: 0; +} + +.wp-block-pullquote.alignleft blockquote > .editor-rich-text p, +.wp-block-pullquote.alignright blockquote > .editor-rich-text p { + font-size: 20px; +} + + +.wp-block-pullquote .wp-block-pullquote__citation { + font-size: inherit; + font-weight: 600; + text-transform: none; +} + +/* Table */ + +table.wp-block-table { + border-collapse: collapse; + margin: 0 0 1.5em; + width: 100%; +} + +table.wp-block-table thead th { + border: 0; + border-bottom: 2px solid #bbb; + padding-bottom: 0.5em; +} + +table.wp-block-table th { + padding: 0.4em; + text-align: left; +} + +table.wp-block-table tr { + border-bottom: 1px solid #eee; +} + +table.wp-block-table th, +table.wp-block-table td { + border: 0; + padding: 0.4em; +} + +table.wp-block-table th:first-child, +table.wp-block-table td:first-child { + padding-left: 0; +} + +table.wp-block-table th:last-child, +table.wp-block-table td:last-child { + padding-right: 0; +} + +.wp-block-table__cell-content { + padding: 0; +} + +.rtl table.wp-block-table th, +.rtl table.wp-block-table td { + text-align: right; +} + +/*-------------------------------------------------------------- +5.0 Blocks - Layout Elements +--------------------------------------------------------------*/ + +/* Separator */ + +.edit-post-visual-editor .wp-block-separator { + border: 0; +} + +/* Buttons */ + +.wp-block-button .wp-block-button__link { + -webkit-box-shadow: none; + box-shadow: none; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + line-height: 1.66; + margin-top: 2em; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +.wp-block-button .wp-block-button__link[data-is-placeholder-visible="true"] { + height: auto; +} + +.wp-block-button__link { + background-color: #222; + color: #fff; +} + +.is-style-outline .wp-block-button__link { + color: #222; +} + +/* Media & Text */ + +.wp-block-media-text *:last-child { + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +6.0 Blocks - Widgets +--------------------------------------------------------------*/ + +/* Archives, Categories & Latest Posts */ + +[data-align="center"] .wp-block-archives ul, +[data-align="center"] .wp-block-categories ul, +[data-align="center"] .wp-block-latest-posts ul { + list-style-position: inside; +} + +/* Latest Comments */ + +.editor-block-list__block ol.wp-block-latest-comments > li:before { + content: ''; +} + +.wp-block-latest-comments article { + margin-bottom: 4em; +} + +.wp-block-latest-comments .avatar, +.wp-block-latest-comments__comment-avatar { + border-radius: 0; +} + +.wp-block-latest-comments__comment-meta { + font-size: 16px; + font-size: 1rem; + margin-bottom: 0.4em; +} + +.editor-block-list__block .wp-block-latest-comments__comment-meta a { + -webkit-box-shadow: none; + box-shadow: none; + font-weight: 700; +} + +.wp-block-latest-comments__comment-date { + color: #767676; + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + margin-top: 0.4em; + text-transform: uppercase; +} + +.editor-block-list__block .wp-block-latest-comments__comment-excerpt p { + font-size: 14px; + font-size: 0.875rem; +} + +/* Latest Posts */ + +.edit-post-visual-editor .wp-block-latest-posts.is-grid { + list-style: none; + margin-left: 0; + margin-right: 0; +} diff --git a/content/themes/twentyseventeen/assets/css/editor-style.css b/content/themes/twentyseventeen/assets/css/editor-style.css new file mode 100644 index 0000000..82dc706 --- /dev/null +++ b/content/themes/twentyseventeen/assets/css/editor-style.css @@ -0,0 +1,582 @@ +/* +Theme Name: Twenty Seventeen +Description: Used to style the TinyMCE editor. +*/ + + +/** + * Table of Contents: + * + * 1.0 - Body + * 2.0 - Typography + * 3.0 - Elements + * 4.0 - Alignment + * 5.0 - Caption + * 6.0 - Galleries + * 7.0 - Media Elements + * 8.0 - RTL + */ + +/** + * 1.0 - Body + */ + +body { + background-color: #fff; + color: #333; + margin: 20px 40px; + max-width: 580px; +} + +/** + * 2.0 - Typography + */ + +body, +button, +input, +select, +textarea { + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; + font-size: 16px; + font-size: 1rem; + font-weight: 400; + line-height: 1.66; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + line-height: 1.4; + margin: 0 0 0.75em; + padding: 1.5em 0 0; +} + +h1:first-child, +h2:first-child, +h3:first-child, +h4:first-child, +h5:first-child, +h6:first-child { + padding-top: 0; +} + +h1 { + font-size: 24px; + font-size: 1.5rem; + font-weight: 300; +} + +h2 { + color: #666; + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; +} + +h3 { + color: #333; + font-size: 18px; + font-size: 1.125rem; + font-weight: 300; +} + +h4 { + color: #333; + font-size: 16px; + font-size: 1rem; + font-weight: 800; +} + +h5 { + color: #767676; + font-size: 13px; + font-size: 0.8125rem; + font-weight: 800; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +h6 { + color: #333; + font-size: 15px; + font-size: 0.9375rem; + font-weight: 800; +} + +p { + margin: 0 0 1.5em; + padding: 0; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + color: #666; + font-size: 18px; + font-size: 1.125rem; + font-style: italic; + line-height: 1.7; + margin: 0; + overflow: hidden; + padding: 0; +} + +blockquote.alignleft, +blockquote.alignright { + font-size: 14px; + font-size: 0.875rem; + width: 34%; +} + +address { + margin: 0 0 1.5em; +} + +pre { + background: #eee; + font-family: "Courier 10 Pitch", Courier, monospace; + font-size: 15px; + font-size: 0.9375rem; + line-height: 1.6; + margin-bottom: 1.6em; + max-width: 100%; + overflow: auto; + padding: 1.6em; +} + +code, +kbd, +tt, +var { + font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; + font-size: 15px; + font-size: 0.9375rem; +} + +abbr, +acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #eee; + text-decoration: none; +} + +big { + font-size: 125%; +} + +blockquote, +q { + quotes: "" ""; +} + +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; +} + +/* Typography for Thai Font */ + +html[lang="th"] h1, +html[lang="th"] h2, +html[lang="th"] h3, +html[lang="th"] h4, +html[lang="th"] h5, +html[lang="th"] h6 { + letter-spacing: 0; + line-height: 1.65; +} + +html[lang="th"] body, +html[lang="th"] button, +html[lang="th"] input, +html[lang="th"] select, +html[lang="th"] textarea { + line-height: 1.8; +} + +/** + * 3.0 - Elements + */ + +hr { + background-color: #bbb; + border: 0; + height: 1px; + margin-bottom: 1.5em; +} + +ul, +ol { + margin: 0 0 1.5em; + padding: 0; +} + +ul { + list-style: disc; +} + +ol > li { + position: relative; +} + +li > ul, +li > ol { + margin-bottom: 0; + margin-left: 1.5em; +} + +dt { + font-weight: 700; +} + +dd { + margin: 0 1.5em 1.5em; +} + +table { + border-collapse: collapse; + margin: 0 0 1.5em; + width: 100%; +} + +thead th { + border-bottom: 2px solid #bbb; + padding-bottom: 0.5em; +} + +th { + padding: 0.4em; + text-align: left; +} + +tr { + border-bottom: 1px solid #eee; +} + +td { + padding: 0.4em; +} + +th:first-child, +td:first-child { + padding-left: 0; +} + +th:last-child, +td:last-child { + padding-right: 0; +} + +a { + -webkit-box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1); + box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1); + color: #222; + text-decoration: none; + -webkit-transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out, -webkit-box-shadow 130ms ease-in-out; +} + +a:focus { + outline: thin dotted; +} + +a:hover, +a:focus { + color: #000; + -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); + box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); +} + +/* Fixes linked images */ + +a img { + background: #fff; + -webkit-box-shadow: 0 0 0 6px #fff; + box-shadow: 0 0 0 6px #fff; +} + +/** + * 4.0 - Alignment + */ + +img { + height: auto; /* Make sure images are scaled correctly. */ + max-width: 100%; /* Adhere to container width. */ +} + +embed, +iframe, +object { + margin-bottom: 1.5em; + max-width: 100%; +} + +/** + * 5.0 - Caption + */ + +.wp-caption { + color: #666; + font-size: 13px; + font-size: 0.8125rem; + font-style: italic; + 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: 0.8075em 0; +} + +/** + * 6.0 - Galleries + */ + +.gallery { + margin-bottom: 1.5em; +} + +.gallery-item { + display: inline-block; + text-align: center; + vertical-align: top; + width: 100%; +} + +.gallery-item a, +.gallery-item a:hover, +.gallery-item a:focus { + -webkit-box-shadow: none; + box-shadow: none; + background: none; + display: inline-block; +} + +.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; +} + +/** + * 7.0 - Media Elements + */ + +.mejs-container { + margin-bottom: 1.5em; +} + +/* Audio Player */ + +.mejs-controls a.mejs-horizontal-volume-slider, +.mejs-controls a.mejs-horizontal-volume-slider:focus, +.mejs-controls a.mejs-horizontal-volume-slider:hover { + background: transparent; + border: 0; +} + +/* Playlist Color Overrides: Light */ + +.wp-playlist-light { + border-color: #eee; + color: #222; +} + +.wp-playlist-light .wp-playlist-current-item .wp-playlist-item-album { + color: #333; +} + +.wp-playlist-light .wp-playlist-current-item .wp-playlist-item-artist { + color: #767676; +} + +.wp-playlist-light .wp-playlist-item { + border-bottom: 1px dotted #eee; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.wp-playlist-light .wp-playlist-item:hover, +.wp-playlist-light .wp-playlist-item:focus { + border-bottom-color: rgba(0, 0, 0, 0); + background-color: #767676; + color: #fff; +} + +.wp-playlist-light a.wp-playlist-caption:hover, +.wp-playlist-light .wp-playlist-item:hover a, +.wp-playlist-light .wp-playlist-item:focus a { + color: #fff; +} + +/* Playlist Color Overrides: Dark */ + +.wp-playlist-dark { + background: #222; + border-color: #333; +} + +.wp-playlist-dark .mejs-container .mejs-controls { + background-color: #333; +} + +.wp-playlist-dark .wp-playlist-caption { + color: #fff; +} + +.wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-album { + color: #eee; +} + +.wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-artist { + color: #aaa; +} + +.wp-playlist-dark .wp-playlist-playing { + background-color: #333; +} + +.wp-playlist-dark .wp-playlist-item { + border-bottom: 1px dotted #555; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.wp-playlist-dark .wp-playlist-item:hover, +.wp-playlist-dark .wp-playlist-item:focus { + border-bottom-color: rgba(0, 0, 0, 0); + background-color: #aaa; + color: #222; +} + +.wp-playlist-dark a.wp-playlist-caption:hover, +.wp-playlist-dark .wp-playlist-item:hover a, +.wp-playlist-dark .wp-playlist-item:focus a { + color: #222; +} + +/* Playlist Style Overrides */ + +.wp-playlist { + padding: 0.625em 0.625em 0.3125em; +} + +.wp-playlist-current-item .wp-playlist-item-title { + font-weight: 700; +} + +.wp-playlist-current-item .wp-playlist-item-album { + font-style: normal; +} + +.wp-playlist-current-item .wp-playlist-item-artist { + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + text-transform: uppercase; +} + +.wp-playlist-item { + padding: 0 0.3125em; + cursor: pointer; +} + +.wp-playlist-item:last-of-type { + border-bottom: none; +} + +.wp-playlist-item a { + padding: 0.3125em 0; + border-bottom: none; +} + +.wp-playlist-item a, +.wp-playlist-item a:focus, +.wp-playlist-item a:hover { + -webkit-box-shadow: none; + box-shadow: none; + background: transparent; +} + +.wp-playlist-item-length { + top: 5px; +} + +/** + * 8.0 - RTL + */ + +.rtl th { + text-align: right; +} + +.rtl ol > li:before { + left: auto; + right: -1.5em; +} + +.rtl li > ul, +.rtl li > ol { + margin-left: 0; + margin-right: 1.5em; +} + +.rtl .mejs-offscreen { + right: -10000px; +} diff --git a/content/themes/twentyseventeen/assets/css/ie8.css b/content/themes/twentyseventeen/assets/css/ie8.css new file mode 100644 index 0000000..bf45c26 --- /dev/null +++ b/content/themes/twentyseventeen/assets/css/ie8.css @@ -0,0 +1,225 @@ +/* +Theme Name: Twenty Seventeen +Description: IE8 specific style. +*/ + +body { + font-size: 16px; +} + +h1 { + font-size: 30px; + font-size: 1.875rem; +} + +h2, +.page .panel-content .recent-posts .entry-title { + font-size: 26px; + font-size: 1.625rem; +} + +h3 { + font-size: 22px; + font-size: 1.375rem; +} + +h4 { + font-size: 18px; + font-size: 1.125rem; +} + +h5 { + font-size: 13px; + font-size: 0.8125rem; +} + +h6 { + font-size: 16px; + font-size: 1rem; +} + +img { + width: inherit; /* Make images fill their parent's space. */ +} + +/* Fixes linked images */ +.entry-content a img, +.widget a img { + filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=5, Color=#ffffff); +} + +/* Layout */ + +.site-content { + padding: 6.5em 0 0; +} + +/* Site Branding */ + +.custom-header { + overflow: hidden; +} + +.has-header-image.twentyseventeen-front-page .custom-header, +.has-header-image.home.blog .custom-header { + display: block; +} + +.custom-header-media { + background-position: bottom center; +} + +.site-branding { + padding: 45px 0; +} + +.has-header-image.twentyseventeen-front-page .site-branding, +.has-header-image.home.blog .site-branding { + bottom: 0; + display: block; + left: 0; + height: auto; + padding-top: 0; + position: absolute; + width: 100%; +} + +.has-header-image .custom-header-media img { + left: 0; + top: 0; +} + +.site-title { + font-size: 36px; + font-weight: 700; +} + +.site-description { + font-size: 16px; +} + +/* Main Navigation */ + +.navigation-top { + background: #fff; + position: relative; + z-index: 10; +} + +.menu-toggle { + width: 150px; +} + +.main-navigation ul#top-menu { + margin-bottom: -1px; + padding: 0; +} + +.no-svg .dropdown-toggle { + padding: 0.25em 0 0; +} + +.no-svg .dropdown-toggle.toggled-on { + padding: 0.75em 0 0; +} + +.dropdown-toggle .svg-fallback.icon-angle-down { + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=-1, M12=1.2246467991473532e-16, M21=-1.2246467991473532e-16, M22=-1, SizingMethod='auto expand')"; +} + +.dropdown-toggle.toggled-on .svg-fallback.icon-angle-down { + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=1, M12=0, M21=0, M22=1, SizingMethod='auto expand')"; +} + +/* Front Page */ + +.twentyseventeen-front-page.has-header-image .custom-header, +.blog.home.has-header-image .custom-header, +.panel-image { + height: 800px; + max-height: 800px; + padding-top: 0; +} + +.twentyseventeen-front-page .custom-header-media, +.blog.home .custom-header-media { + background-position: center center; +} + +.twentyseventeen-front-page.has-header-image .site-branding, +.home.blog.has-header-image .site-branding { + bottom: 20px; + position: absolute; + width: 100%; +} + +.page .panel-content .entry-title, +.page-title, +.page .entry-title { + font-size: 14px; + font-size: 0.875rem; + font-weight: 700; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +/* Posts */ + +.blog .site-main > article, +.archive .site-main > article, +.search .site-main > article { + padding-bottom: 4em; +} + +time.updated { + display: none; +} + +time.published { + display: inline-block; +} + +.blog .entry-title { + padding-top: 0; +} + +.single-post .entry-title, +.page .entry-title, +.entry-meta + .entry-title { + font-size: 26px; + font-weight: 400; + letter-spacing: normal; + padding-top: 0; + text-transform: none; +} + +.entry-footer .cat-links, +.entry-footer .tags-links { + padding-left: 0; +} + +.comment-author .avatar { + z-index: -1; +} + +ol.children .children { + padding-left: 2em; +} + +/* RTL Styles */ + +.rtl .has-header-image.twentyseventeen-front-page .site-branding, +.rtl .has-header-image.home.blog .site-branding { + left: auto; + right: 0; +} + +.rtl .entry-footer .cat-links, +.rtl .entry-footer .tags-links { + padding-right: 0; +} + +.rtl ol.children .children { + padding-left: 0; + padding-right: 2em; +} diff --git a/content/themes/twentyseventeen/assets/css/ie9.css b/content/themes/twentyseventeen/assets/css/ie9.css new file mode 100644 index 0000000..9f8f766 --- /dev/null +++ b/content/themes/twentyseventeen/assets/css/ie9.css @@ -0,0 +1,43 @@ +/* +Theme Name: Twenty Seventeen +Description: IE9 specific styles. +*/ + +.has-header-image.twentyseventeen-front-page .custom-header, +.has-header-video.twentyseventeen-front-page .custom-header, +.has-header-image.home.blog .custom-header, +.has-header-video.home.blog .custom-header { + height: 300px; +} + +.has-header-image .custom-header-media img, +.has-header-video .custom-header-media video, +.has-header-video .custom-header-media iframe { + min-width: 100%; +} + +@media screen and (min-width: 30em) { + + .has-header-image.twentyseventeen-front-page .custom-header, + .has-header-video.twentyseventeen-front-page .custom-header, + .has-header-image.home.blog .custom-header, + .has-header-video.home.blog .custom-header, + .twentyseventeen-front-page.has-header-image .custom-header-media, + .home.blog.has-header-image .custom-header-media, + .panel-image { + height: 700px; + } +} + +@media screen and (min-width: 48em) { + + .has-header-image.twentyseventeen-front-page .custom-header, + .has-header-video.twentyseventeen-front-page .custom-header, + .has-header-image.home.blog .custom-header, + .has-header-video.home.blog .custom-header, + .twentyseventeen-front-page.has-header-image .custom-header-media, + .home.blog.has-header-image .custom-header-media, + .panel-image { + height: 1000px; + } +} diff --git a/content/themes/twentyseventeen/assets/images/coffee.jpg b/content/themes/twentyseventeen/assets/images/coffee.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13847cde7c16ba0f8bd31e5251de88f1ef627219 GIT binary patch literal 117713 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

hB^iuJ5k$=@ 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 literal 0 HcmV?d00001 diff --git a/content/themes/twentyseventeen/assets/images/espresso.jpg b/content/themes/twentyseventeen/assets/images/espresso.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7514c96bdfaf991d817670d4a20c432e1b21a8e0 GIT binary patch literal 93540 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 CYkhP8 literal 0 HcmV?d00001 diff --git a/content/themes/twentyseventeen/assets/images/header.jpg b/content/themes/twentyseventeen/assets/images/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3fd3e7122cbc1866e5971a82d0b65e13ccb8e20 GIT binary patch literal 114854 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 WMehrXc2Uk}fjKnU0-x#s@&6B=H6d;Q literal 0 HcmV?d00001 diff --git a/content/themes/twentyseventeen/assets/images/sandwich.jpg b/content/themes/twentyseventeen/assets/images/sandwich.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6baddbf053749ba5224b147c4b54062131fcba62 GIT binary patch literal 171858 zcmb5VS5Ono`vw}CB1IADO{8}O2}qS9O`5dOgGv)Z5fVT`5m7{X2k9LoA)$v3DgshM zfDj;5rH3jcK|%a}$N$B-IG5+yo1J-QcV>6qedaCC{%_%b-vMloj7*IHG&BGJ&A$Qo z-x9z8z;yL0uCPpCNxaU%-3133$U>XXiAAlY5xDl|GofjGSW9)ouZ== z0npy0p}R@*zpnrR0DzW`<{tq6FKB21bo2~Yt}_0!^3eePzs7&3qWwSX{}ur(bTj~3 zHafO{>wZ=;3CHr(-!c?7NfCFdqIsU{&BNFbJ0l#+_VHV?Tr5o08 zBU6zhb>Acoz>j#{X2PIrkpp;AX+)zJOTz`opl5I5V`TX@#KU+~_@=NaKv$OrP%bPi zBQ19A4&y^wJ=(FsXN>oxnH6#HKE8XqI13FZX@`Wb(vCnpJ5a&Q_h$6fJ+aot214(}WIOJiV95=h%jI-Q~;C?eQuy)pov(+Eu z6VfA_^bo!sm$CRw!JN)@Q8s`}+0g=>mffw@V&J9c1Z@MEme&~5J7+L10%LO@F zzkM{Ut}o%~?MML1(teT!e2;U?d<+8ImHI}*!cHgiRkz$9Nz3rK*^c##?(<9*E{QQ( zMgR+d#j%(jz{Z$J%clEj@b1kIjQYYnA`eZL>8}|`l?y*nPBP^cd!NF{E39Or{OL99 zNy}bf5x!2fn2JZLqGL)lT79=k{TD&QsOH;B8HtE`OrftCq0$ZrVc_a(X|YuuH!KMF zNDPx#rYx15&YL49o_};bkOr*}RfFU|KkgoEvA7r6x@2b9rlq-#& z{M@8_oFU+zybI(;fLhYLnV669WTI`Zp=XkvXCbYuNN&x|{Fh4nCSm9?kdxc{Fwi>_ z<%u^k4?UCZz04WqrLs*KTpTluH3XWX_=6@=9XJ$;o!{& zB30K|7Hv7VP{<5#s;?!o1q)~ z4_UfdH}x4uZLTohqrbw=_(@kEU;@ww$m%*ic}>rf!II(mo|W@;fr(3H@;b$DyixFY zzRdjrC{>+8K8&WU-qGnW_65dY9bb`@rTVO-WXl{l_| zY>ohE%fVUK48@5PYPaC)Ycw`yIQc~xVJ~aLnYAs)|5*n14wLM<;$@DQL$%gm)?kCbfXKG`%QXv*^9X!0$$39|=LQ|y`N|YSW(bMYD+@TSpVR}pd z4;laN_cLG=kSi+2Cc?%Rn-R+v3;2AEQ7%I)Lrj>3jU^*E_jS_!BYcrLIMt~gO7SIT zg9V*o({*K#BgADw=yQmDTV=z=y%l@IoB)++FKyRRGu!D&d+w^zCFsHisMy*2*Ylye zvS=$aD8-3w$J2y{uSdVO&c8CLTm6s&+dLhni3ToZO|;L4xkPkKvp;Q>a;0QR8G5y` zp}TamtFGi?y1*0{+sfs+ts0!g2S~6%+LT@{z{Zh5T1Gj5nSM!{3sSUXM&kbWIKYr7 zSPNZVN=3+wsN9s1olMTmv(No6s^=x);MzaZ&2@h79c^SVcP2|RhSY62zVduDkmPu~ zj~J^VShROo1Qvb)QIC_V>Wnoq;7Z}>l^4zXEfv*i&zi2?p<%gE!ncH@+<7dSNc-(I z(!wxrY}}HN=?Ho4TOWsa@)&yDB5XMXV4+d2(94lwWGa#Z*y+juctnKRLQL390N>b6 z=;Q9QaM07URB-&CpVOEMUtzn(#uImshE|V9nURjhfF@D6IzwOoE(;9{TNZs5O&n`! z&()aXMJV2~Ve$MzWe?X_hO|t%XqsE$Sj&!JVYX;fv*)%B(&pY-(>ka4kalX3zPsCo zvICk+E?v`g3Lo*7DT~3YOMb0IHAy_R0G2sObxxn4z)V(&Yq{_m^AQ%JvXXZhh7XH8 z@0R!c;6G#uSLR`=fxT^*#|VprLLFxnjoT*uUKM@*`Et818=i%ID=V?cKFXX$A2m z$-|u$=IUE#c2i4QWxc#|E63?rWGfL!OpP5rK;FSEmvqgx&XS3V@}vRP&l(W6pPGUu zXK_i#vScu3=mc;@{5|BNm!+wUeJN@Qk;8zTLo(!n8BNt!6R$qemq@(TB&B!LHcm>9 zL+tg>D?sf|Sb7C|{w?hA>FX zS!M@&vHwmPF)@0IxMDxoFd6jvVZW%#v=mP9+G9nKg8;2jtelJ25>lt(|Cqg31Ga~4 zyq-+8t}AmvBQA@suptm*C_?E)zz(i9wMsSGjso3AU;Nss2r7D#2Slm99ncoqoKARn z_eWEfB#mxvUl^it@j|^GJ=Wa?c^mL%IgQ)hCThx+aL-9YjWoUG(B^>Vb4B}<8iz$uJSF&wr>k4YcYUl>_47JInS}( z{`H~BA8_ko3e@SUl-}4qX0cm2DHxF6x^B}QgNM>>j;fBdj12UQv9I6jet$yCBg|_o z7AqFVu9u%z+ZfOqG5G~~bLrNQnrSaIH2Y=1?#hk4NG|msX_xiiEh)x;U#|DB_8Yv> zroW*R`9p`}DBktn68mr4ZdCA9nA#V?A#S#?*(lSc#FMMR3}3PkVgeUwg>adI2tTrT0UwkHi}D-$vLCw{EsVJ`e{$dtR;@+`E^t5Z0& z;fD4^cL#au zEI|A1Kktx-5e+Z@EbcD&ixv2aUHb~0abE0eabE2252ihyJah0G)Vmf^bMKi>*j!CP z;8C7OD-ZGc1i!4Zz@hbi5~Ap%Ww$@#En=(#dvkBCSXR=AVHz{M#6CVsbgnc2m;#36 zvUJa*vau9;HcwpxEbeG!>$fC^Bz-(d z6p+Y#qyLY)-itlS0^Er^`9}5) z%U&NrO}|N*FoXNpIgzb_heJ=J8#yy6y&y>7-TiQ7u{H+g5Xr(4m#z*N*mhn@#8U+ z(Lgwfi=+3Bq|tj9FVH>Nf$#=JbjTpAD`e%}45dTf)AwC6y_6iFo#-}X@8aM91gB3li&2`YB3zm+kUlN1P%+v`v`=_TZyb3@&0mZ z70Ov%QoqPs;qrQ!_DyoBHT3C76{fwcv?MX_!|W-H+(T8lQM)aXg7<|NUt zduFjdbzV@%{l%mv^obc0MO-0bmzzgohNsBUGOu$7X0{&jE*A8(oEZqWNvSXQRrgyc zv^10R%k}YO79ARX$7e?09p3~Sud$GZyLwy5_D2}*qwO8fmStP9X3SmzPohu;EJy7y zDOuS^DTPC!u0=l{xq*pynyC|xZdazgU4U^DXp?(gfaGL42LBFV)qFp&ru{he&g23+ z?nUOt&2dS2t}SmutF}e5w{t6Ur;5{`RGl@4^i4t}`&kwqAjbCn+D9RtyTih6=c@;2 zki6u3OSR!+<3+5VMvNoUY*TFKvlkA9Kl^Yh+E{hSy2Gq?qnHM-Mkm6JiJ&|+R)Y}B z(?vV-nHiGyNL%~R(EWXD;`S<%x)$+7(Asts+&g(r*C>86;+dSFX(I6OutA3t{F;e8 zdm-a>zDeQiA@A?ffnUOT=8J{iU*$J8+;D}%Tomdsrp2Ay&dZYEm^Yiml@WWC+x9(| zK)BJAO7T7>-YGTT1_uO;7@KcJEuCSqCkyv1bEZoLIh@oxnhMp%raB1+9huWtW56l< zc02xlUu$oeZ|Az1zC)y?e6BL>x}BR#DNAdPCXT5I0I+ zs&-4OF{hCAhymDKZnBFNw^+9E0o_C`ReyIF@H zd3_J%kGHs1Yq#N++~DDcgccmP5afNcx_l=I?bAF!KhA9DVERr`0eoJzz(OAv=RjZ8JVd0BuPY{8NNe`x zv+;LH9@qUxImK1+Kzpv45+KnYL4t>lvP+ylOvc>s4quX2^J*ba`2kh=KFD)6sW-%D z3ink8HI7k&H~0GaBH+=10+^lCKZB*eBea1n|5+y-V5lA^41c)Q2l8;$=k4I1 z66qE&y5m9PC~@}Sw0kOGy2#23*!tjx21WJdZ9UvTV1&%p#Rgf(JN=+)JEp@`6B!Y) zWdTtXjLegz4SKVa_V%_GtWv$I_SV+qhkTsoYo}WwlDMjxH?pdD%=(JhMQN!0B2^vO zo~k5izA`xD`0S&BI2}?PWT$~vi|6fl_*3VzqKF?$)eRpl_gi&=1r4lS0_*LWsi5=f zh?QvLRCUvZry(%NqujbD*8?p#e4;!SYl_kCAEWk%Z@7=_kiM4`bY374hZN}95rKgH z)>=PhyGaR07H;kyDHOcOZ!0tw324>aR=^YvYj7@ac&FG$l$2w-Gid}^j9#y^t6R2p zOX_w?#E;45HQ5E+G3mdjG9|F%cC+F1$D^v}HFixFjONbBls1%`_q6}xhhEk1#~b2B zP2>3Un&s=m9WoX$raUS$HHixCFX}l5AEo6>VHAjSa`}wMUXS>luo4SnL?YwXn6cc4 z7i8UR1(l3%cQi=diHO!UeHh+L6;XL`v6;(<`C5r4I-f7O!ula9sW$I8XR_vAn|mjk zGOwv~Pc?p?{z3XOT)baZyjSxcVt2}{RweGjrcA!5(~bxY7}-Aa-i9a4y;Ql_ydm&k zTl=@^S^bC(lBf4(Sja}B&>`jr0@{85B7_WnwGd1`+?ew{+WrHbUHsV{n@LOmoFW$T zHsx`O_4PRu!~$_M1gRM!Ir?NfbKy z`xjyD!dohnJ;Ii)PYR=o=!$`)D9T{yWQja{d5f<=gM9GtS)H!t;jEr3-hTrZkx4&NQN;SC! z;K5!=0kldqOyBhoHhTYfx5RGc5d!Kvfk^qa?bmR&GcQ*2aY+hM=mFUYfKGcmbk0EY z+8!}GvoaKlvv3!hxm&_-2)#)s-Q8-us@GE#Q(Jt|(@9=)^4sK6iEw$@74+HcyiA=U zl;600c6R=kJki>bU#-+r^pQ})p`E)^!5cpQ<;*_!d#*RmV5djN4F(m$MlW@zNF)9LmkjLTLPu6nryXwm0k@E10S=>T=hG=<}_TI)j@0eLFHp?SC~ksn`KjCg|A1SdB)b1a)U09}p|K)IyIOM4wfZUw97iEJ>+xbs7 zNk4wJLvOqN_vhQ6BR4^0;N$mvO6;jz9)-jBcd(6K@^^F1{?8Z?s|YIYrlN zuS?o#dO8bCqg=BH+L9U8wmdQ?M=*~?j1r9$Ctr3y=o<#W1!@?1S1#AUQ111lcrkAyO{S+qFbN{>O#|Fjon;b39-D)L4A^U2A-$Vsi4df@W}p zPzNrA3cV3i8k4SORn<<~{`sp_Uj1G*aUayH=yYLr8N(X!clqbaI1V{6kk1Vc{e&R} zd=D>-y14H&@Ai8ViCIpryfEM&^5b~;yns-+4GaqY#7F7?4wfr%_!rO@zVkIRA9J3~ ziS24_dLGq0IXCRQxZn@*`XICs-Mb&CMobzXx3%?dermJzo~tIvaldlUYX@7U+(1;> zs7%SD7;J|{m(mXj+KJ19LJm34zQd@F z?KYlr(#dsk0pXsjW6+$WJ{K3)zB5lI|9WyC$I%3VsAA1IS<@8pH%{RG@piM58;tsQ zK9jl{HZjySBTq;|9NEKA9}zWhM2?+ITYqFJT!jB!E@~3{K@F~Dgv{^ATH$Sj{dhKA zDEo5MweJl>#5}0~Njm}mWg0qz!&b3sXsBzR_T_K&xE9ZYGV9O7ec<;9!#hj0QByyT zDcw=&;Hr9KSq)8i?{+e{;&=FkmUhR+!S0~VwHGe3uDc@F-g>`bay-L76L$~><&SOC)?6r0z_hM*jxUoxn!!-cU`#{4M@SpkjsJyPt@C8q zye7LiZL+jwN+I-ygvEW5*La;ofwf`5v5HB4(O8XP%SXa+7NPb7mi-;;l{k4WujaCUyEqjKdg#!tDXI5)@&Ax-1H zZ7==2;qvC=LS5Yux|g>VC9oI~<4`wkDN^)HW^3AZu4i%#Tz)>zc;vOMwLiBXp(*5U z(eX9#kQ~jelXhGFpg4YTV9M$NA=pQ@=Ua(9=|sh~DVjF?AcF8EiD09 zB|cU|`>e{6<|lXAcmQ{3r=Ql|!u%IdN!r~8TbUUv{7Sd@=~C+=;f>dnN%U)2R3_$g zEpw^|lSXS{-W@sxB20Ti!Y{VFOtCNI{7hVZ)c5EOb<)u@`Rel=M#ig~Tx`O5amc{rr@N2u2lAzo|p*8^6s%Y725a=E^rHR5H*BPz5j zYZoD!;B1Z|kH)K^a*-C=a}j4!k(n9dmj{*|PQfRz;-kzjJf<5q) zr~U6nFOkiMYL;c1WyaA;=Y|jLYhmXjng=>T@=@0=)Y8Ud!cuVgMm=4>q}N_)5X$sU zh`}gnwSwBQw&Ko?&3TLNt{*+}U*mT= zn1R|{HU!Psnknzmdqnw@P? zZLQuY#L7YaAq;}n#_{C;0j$3(G_q<6pj7KwYGpB?P}XkhNTPPY($n>XZbHQ6LA2iS zgWS4VWl6I2u_ELPHG0R!;ai`5cZ6Ei>pgWR-yOwWhvsZ=QStRAe)rqzjRqix{Mn`S zmU9YBJ!igbzV>Kon@pkJcind|n+({D$?6qsw0LS!tf*Pn*g6`n8FEY-8d$(qB5MI= zDM`uJ_ulkzWtZD0^6eMNbY1>;y3_b!jZmcqO0fan{~ocX#zDrx&`H^Fxz>i}oxMlr8(v$1uU!@kABH2NX4nV?3kXMIKI0rS`cjhM)) zmBE&Rx~kH>c#g8`lMfV)#kVe3q9YBL1v$r)3!TrpD!=0TBiGj+75K)r;7wUjm2dN< zIi=d{cv{-{r={jxGVw)L`L7;dC~8-={Sr9L$Ett!cr4m>*8nkgL9bLL|4SnaM9?}a z9&uLrI^(1Bhdgle%SDguIoEB>Gwz|l3vWjJuo{Nk9Cp^5ZY$6O6bQ!6QcB&c94C!k z3O@66DB7b0xyKqGCIn|}TmEbCxJE%olU zfc#rmUtM*7Kqu*Q)%bx_L9zAMuYEE28XgdnZp5K0T&*ObY*Hk7z2Z zti#RCS2j-0%_D+@dH1Qm)Aa@(*zA=xra%3b2AeOE(1iJK^txMj)+_b}e8u|}XZ;>~xpu*qe69N>idl;vEjdzN z63LNL8$_I&D={;dJ-BOXyrW9{K1H=oG@I1f+b8s>bpGljCHetm5~gwfab#-yC+tk& z`*D}%$7!_Z`e5o=;D$Rs-^Ey`e?sF{Vi&rIe6*ykbx5h=$HaENt_{0dE%g~cRGPJg zhobf{KSb_pn4hj0h1Z~Sy+!KHol4$V7-h8Q0TOTJZ8)K3kb%rTZ4!~YR!-GzCjzq1 zKE`lER3OIs@f@G0w|;c+XYZ2F``>|uR&}Cb7#E?%GR>h?N-wv29$7nVXUda6D)hh( z5l5%X=t_1Y`gmU`huwuizq=sj?+9~bDVx%o=(8D=6L06&&g8`{EPgt4-E9d(3GY9)}e%;plk1{qCvvwT0#YOfA_zPOM?zc zcQx4}#flMJJj^c;nAzy`!h2_};ia1Mfz!8UZHkwnbGCBFNAG7PyI!ENCvJ}PIoE>O zB|7_4^vP7W{{f1qf9}V;agePi4jMn`v#`1qn6y;I)jQTK(XIXqp>q;KZR0jZZhB`@ z_%9Vb%%iVx&ss?$qjR-lg6e8O(IiM*;|B);wYuQXDA`nnlG;bPW=}x=@^{kS`d$II zlniGoY#Ql4|A;9>P7n(GzM`B$oHbU%5a61Z+y|kp-tBo_aCKREe(CSNwZ6xbd2Jpj zuD+a82|~>XZV{Us+^LfuuNgckFh5U%3#lPXE?n;a51_X@nBQ8T-;rH3bk?cfK}HV5 zj}z9+`P9ae)Pg&I9r=Ezej`0=RsFr&T2`Bu+FN`vQehb|udNe(o$$*#$S6|kk&J&7 zpE${E>sywJ|JPe{h}l+rlf+z7@p6T+Tk6e%P>y{$10Z4dnr)%|?1|EcBykx zSWGnaJL$#AbXQSJ#7gh=AcLH+jSlg`!ZrEKNcq9AaP&d`m-#xbT>ijOq@|N(1v)A% z=v7I@j{3@xgQaWKUlun3ijm8=e}a~{EWIqo#{RzFB#TAfhQk0`h&kGSkaNK=+hHw1 zKRQK4tdBie;-W<8YM_OCxyv(-HLkpZj4BgKAWZE%|nm^3N^7 zv2%#pzo;t#kG$s-NYyEDl=ZxSr-t3)${n?+6G-)zFPxQ2@|knRqt#!f_PfSfUw7@H zmY4Mr7ysxCizaPd6#R56Iq%sh2_61gJsNoAGP8F*#B{1B9jb9SiXrd1jC*#^ogCEf z2|-$4esiA9y^B^qU=|M)I8v!!<(s`=iDhn>&*0rs4;uJ}0_4n5VQl zE{~93Awo*m?yb#TDCCz_TDi-&JMx>|1KkA2jZ2{0Es@m7nTA zD)pbIG=pBM3zj}8o9nyoeb8=*=tP%qthG_7FQC3UW#QSo)E{fbJ@Bq>C-SC`cUvu? zi(i$G+D3*8IN=<|}v@Y(GJjDGCb4HMTmVIfc@C!^m%@ zy-V(=FT*a+(2Lo)qK2W(XwWRV&Zf{6GnHM#O)%5oexadZY#1_=M;@X(vQMCKTkOo8 zCLNuuS1s)R+}>DoCr=z{@6`N0o`&D0qLNnoWxuQBmb~_On5X-NdROV@72V?344z5D zq3@eS--?KhjY$|k9xtjHAv^m-OtgHb8i((o_Mbg-%j6@urTDplKIsHbIy?iN%I?bp zx%ixOIIlQi&|2WzMf;mS;argI?xm?eYuSHg&ZARWZ@(%*=LeIONz>y4lfa7rt&;vw z?JGKu);~x_M|F%r6vse)L)-4wn8_sopvJh`?j zZ)h5Xsj?XxgDZ@9!vhCOPu!x5Enf7%I~UEnb9dCTpc?lZew_YUK0?QEf%|pRqD1!E zCQNx5y%%^w9|9flmF&SxEZ|=+ue`sf;7md z&K@%X>OuAW^0{0j9OB1f&z|B;dab;C4Km61IjjHNy%5P;wxY#<6bnZJ>*^=Z+-)bT zD$3;5iQT5}7UXt`ij!-*g}8e~^R~b(?zvvyAA7$#?+sjues>Y`;8oQ-@IA@C?H>dA z9aFRJY_PYGf#$7W5G+ac_r8YuUqXxxs^yIJM|k_5@qO6S8I_gl`;TSiD;8gh@XE26 z`X$LCctwG3Df;D~u_+LNR@ZFU_6aw4vJseXm}9oplf7Q;^?kaev&>${DbK!tWE zeVNmk?CdSd%l}?Ak4B!m_LC*XzeGmmAKrE!!R`Heu``utR;RGI^?d_EF7*K&L`Av& z`L%|7UN=yJ7-q_~XoCNe?E%>~hJuE`Z=0h{1_qv8XCV~2f2Nb^~1K>95;A4MxQX*HiE z8RmRozMs4I-cU_@=L$a#9ERdmx{wv=58jL+Zgqv7BjGwMkl+nW_SCp8&d7Osu1NWQ zV27w=n`gE~7=r*-f~apsM_a(c_Ra`Q=-12>S4|f;tLpN4!DQAXJ|)$4$Y~Wo;63Ud z%dRXsV!@236jsfy#6)wlhD8Ha?>TPw%q(i_1y7W%#Abq5cox|HJD-zfyYq*emLA{Z7ppslt3i(6iuG#A$UmP%||8dXFL;ih*^ zDSkVo(P_7foglOPiTT?uGv_0=Rkwq~aT=OW4|a-IFxm{YOUdYAs@l?rcKDPtx+IqI zX8j#H=4*Tp?eeb3CqDCDF4Su}7|(sN_P}A}U^WHb*+t!R*Qx(ZsMqmPt4iF>fw(9) zg8Evf7f-h8+EFS23s z#9=LK$axa7#n+}E(WR-58A;A>%x+9C0M1WiA9gPPJ&S_&X+-lxtWI7YPaa-##qKso zK5yweF<&ZpP;3c0boT3?Uf=Li z&}Og{aliQp^Wnr^a zu0BT$6M~J!!~2~*=Vse=@&0Slsu+04$pziJQlm0k2Swv}>~Ry{x#bz+ z=~>5b;QWK~pmR)L^RK!u7uQQ)>4&V%k4-Y?X1=!nZiHqUn+$dI`}~>Qr&uj{yLtDV zRPiWx9HqqIOyAH(F;c`rwTp{R)c-CKx8Z^j{V`!jr=35Jm%zZu&!n^<>=ALKXld}s zts%l4Om&9gEciP6z{W+>3HjlY*ds7#EWC9u%9AuWFow<9o3`}Z4{ZK=QhVsyH*?$} z@jfzWd!Y{00H0M|bvN8W*SRURx2)OLoM4(UPvI`N3vA%?Kqp95x{sm)8l?S!GL;D& zmKA1rt|Im}jqfLgt{QzqxxaR&6PrL=4-EJO|fVW?B z`WlZn6raj>b%IUp06PfQPt7P;qC$0EYa7NsRNAixdtl~7qu~GW;X0{Fnqcv1+)KaW zC|3TTu1mP)J)Mmaz2`@uxV5IZc}c3N7oxz6!e3UA&tUCBtGu`g*jmJ?fSAlJSZWye zt_JWc$6AD5uZPone{{P0Yj4C#J9&0%Jka6ZjE=_dzkf&5`u+Zbu`wzvwAgrFySal=wbgc{_+>8 zV{m_zjI*x|hxUYFgCP`!G}Q+#`m&A2SHORTz?W1CYUf{>=qP6?BH!szsa1?&6eXH* zs}YByQbLZu_s(~3KArzQ(zp%DzYfbc`5bVDwZVZSb$a<`h~AOU+DSW({2?Okl}GTp zX{}r+k??66xY`)M z9rs|=m84uV-po(Th?Yz@Wk<0idJXVXvX9;jarHWZgdpCRF@j%J3sJxs`re^ zG7~Z3o!5r&CyVOSJ3OS3-iI0x>f+Zhner^=D3WFYI$0G@XvBB&I#A^ zm$l|(tHj+DV&K7)Uw%7F*zMza?DV$W{tKnugE~6cT>G|r=roe^3u$d=+KEE_eL;%+ z`#>I#cDETNm-ZL@3Hu35-c2R%BcfMg1UJth>l@k?Ck;aFQ6IT$$b>pID|ML1`r&-* zghcaU<7s60Ce`IKCav@pc-1G!;eqkkMM=j4_N{30Pzd#MRHL}J+dT96nH||-$zaH( z3OKsPTdnzm5fvE$j~^%tgTWMP!7isKaIOYI(Fe`*fYKdKcq=B=x+bD#8wJdG`8I%~ z+VhRrLw4bXxVWe0Ep082YqvW~vdXzo!N}E~_6g^Cn1|gIaBOsK`t!i+T^MDjBVF4( z?N=RL8S(RBYC~o&robnD zHvqejE7^yU{T=d41J&S$=K?xQ+}z=LtwHyMURS7k)jd!wZ*IJSyYSXM|MHi{_Iw?_ zrU?=CM4F$~KIX?uGdB)zEC%!RtSMc8J1Eg@@9}2W?|bLJ?95Gv{K83a+zr}{aWPwl#8nQTm7afue>&xbv&L!l0)rIB37>`Frl(D`lN6ZM(`Y3)NUq0f6E zPo25BY8;XkK^YsK`yTBR7P-##g(4$MfHVu_fW;9H!$8&*(Fr>VvFx_kRoM{12`>wO(MrxF>y-1-rn!4tm+l{ zHu~r4CTA|VL~7Uzxr8Mw&KKQ7mMc8^vGwp`bnNLFnv7OB1KXq{gM_wR>QtMlN9&7e zS!CTmqUp7&eWWoeRemTUZT*Dm?Q5PDWa}-p7uK6@)b-~uQ)P=J1orNekTXde>P;}~ zRNts8tEx-vsM6`I*XTNPu(ex|Zy)x)_UIz7d>OjDjq2^A>&Ft7di*>&02NAO@|kxDH}xJM9bGNnyGT2*XV?`Y0F?I_zPuW3h)7FA6rNW-Ic`+XiQ zt)B)*UR3t}H`yVtvT+e}L(NF8?;xrV?4_NcUixgZ=AsxgkZl}U+U{yzve&SEQKrLw zVQldES$|O7KsrUcxR5y9Wj}g==iID6ZCn>P z%D>TBPP)}ohuy60nF$=$VcvkacTBYZx>Oe4euH+*`%Ib^cNKCvU1SoMWav5_Xz>>H zA1b&ew&o3-uSXJ2QFi{ji058zjV=TgC1Iz;$*du9R>F6=}rOb!ABmF@AHsGDS zuMcg_44%%(^5tG>7FLLM#J9CF((xK4EvW2RTqC$}98`gxj9`#PZF|*xbyI0Z7YBt} zX)|=HVGvNLX*j;9ywspGLHVyTIMUYE70r#V($;$Lfb^woj1tY2IKUs&wlnixhXl;8 zil>`*U)SjVF?||cY9(p)b_f1Ir8{J9c0adc^T{r0YmIYudYr)huc(8L`chX{l^j+O zCbzlUKII%_A-$OGy1Wu~4*6DvD$wyeY;daC<1mX0z4w)ncZbM$-?2cJ4Rnu>Ff%+0 zbXH3aq|f|_qMJLwO;LKC<1=xZdM$y2Rf2{BM@QzzTzwGNwd}gwHwz*7)3XbOz{n8p9zy~1nBl@QnrW)NL}}456yEh8`hNi6 zF*W3m>nv%lFn-!rUF%iA#1@I1>x(REL5KTElEDsy-n`5$i`;-rDZO=$!yaj?C!;sv zRc~3Y+>vg0q9n%nP47!=)16zKvCf@0=z0AXc=fKb)54n1Jem)2Q>ACq{YU-aa3d#- zGqBRaro2_}^U0?u6R1o&jv#usp$F8F;uOB)Z ztz7epX*+u0vlo8d6KF`t4E>Et+FiloIX^o1Nt=;6Bb!S+kd5iJ`GH5^TEF^B!33=(^suMOkAig z0984MoF68ocDX$g-`;~_fT-t~oc1Tk@u{7m08Tekh3kxIY@>c^&x|;MzD~iJZThrdIdc^^2ye)UYv`o9Y+;Jr47X9MNY57_1a*t|3cWAdl6q zXq-(~+xnG=f>*uAO3rMsIxZ($E#`yrs>B4{_Cf_;&>7dA&Z@!^jqR>nij+etuu`Vi z#jtyKmM{nUe!}GcP2c3|eg|0tT$cb|ReNaCXO03AQ67bdrc(0q&D;0vccVp{MM*5^ zZ`E!E_UA)VyDF)k^LcGYIFw73F?ZDB>cn=t9(O!k=v7f=qD60?>)NfO-ZX6k;Z@PLdB`2U(W04?c>CpAg{{5j)=*+{l5AXTKAIZ(f4Y`Sr zz}yf_Hx=~=g3>&h^z5H-yLTdnFDeqx6U+`Y{|Z^94J-_IU0S7H+}2v#k-rTg7nfYh zhR!E+|6O}f7Z`2lda+}(mInUM!Q59H9PRvTu%gVJCoSQ&!-FzpyCs~?do?hp&BG~o zPkGf4>JaEHr*Y~YP8Z!Z|H@c!5%wj#_ozg@<0Pn-cXX<_{oByo(7WHN4tX2xvnToe zI=^fuAb00|xVfN*+y#YA|MUZg*Z;$5&aJV|pRdS=9j$vVJuvX$-Ba6N-(SRRcZ9a$~pbV=OaXR=$PbG~k+C%M|qOub{4A~)#a;vj9gIA$o~%xN>1!DVW? zSZnzU=TB&~PkPM;{vq2s_Y<$C|JJWNA6j}zkz7Ee+O?2y{!^6`r-CXZFKRpOvlNa! zzN-ZiO$C83M)Fa4;09PHRKwmG=~x$Pr3Bj?ao9N=Pg_QFo27qVBaowGv`FiZtz58# z{U~EA?U>A&lmC)ZQvw>Ae0K4p)9*_DeLtvYVEPy0^&8X)Oj%Bf(lb7!qvr<(bG0jh z-c4*wNi#M2uT-ZuQ~tUGpB^S`gM0?cvNa<97*{?kJ(kp8cGec)pS*}FE&&IX?6v(2 zkD4rdH9C)+Sn(0tC+7R8HX5Zx-m6$3bCb#t;Coak?EWHZdrh@tEqJVX!rp;1A$mb! z1D(_0!_xx02Mc?O1R2gM)|uNc`Xj4SmG@Az!>$r3+A-0^{{IgED?!x0+VgXEQR#f= ztF8@r`xfQq^0^*|%kPFhPI|iW-?xja9eN!vH2HORZRP04evSTi#`=0Z=BE7?-bQE7 z>#X3Oj$c}w9eQQox0kcCn^WMnqg}YoD=y1oG>rBMs&pFNlKBpb%PmA;x+w*!;DoSJ zsj+C8(rK=1o%OV-wH+q2SW8uC&3jDJu+OWT)>JcHoG9V-JT4tSI#CxxMIcI$B}f|) zN6^{J)h9{uTo$re!+mzOYSEl5<{SyvK}M~5T~?d&Srxkc7fai266bq!%btqiWn0?| zk6UDL)Y-}}eD2K_QtGr_n)OT!72O{Rw=>>r@tgX1`|sqtTI1T}YNuTHZu9*;BT1yx zXv@8Yn)RqJ%84&~;UTT*jbQ9%DcK^iOR6av$YR$j9(^sI8{u)DsI>DrdS8S(9G#r6 zHR$|}z6_Jo^GQ-2??K^vxO98|hmG%RpH`JoXUD5AA59pw;KQRAm+bI+Ii!Q5l)(VO z0LcOn+SRV9$kscr+j@9@j6<>+d!qIa$hEg%DTp-$Gxib z*32MU8S?ALo7-Klv@EL7XjRED1X+}OYpUSocDehLuQsl1)BKm|e-g*56p`p)fJ(3u z3UWd@qcIlyuvnh^a5!`(7#gzGm>V&zp(J4``sRf;oV2Q9<#Y5Loh~;w zRd-{jpQfJ^>pUNCD3W$@$sj@?`hJVWG~d*^KQHtuy?!e*#b)Ga^8DQyGs)e=42?(# zNgzoeODlBj8l-KJb%4m)Y(_(1E2Z{7hWZ}9Pqsf3u=w=h+k?aFqyzFEo^L;uYWd%|(uQ`7f<9PU4+2SEb4S8LzZ+p}6^6@=xJh?ohbtvY%IC`AxSs2&V%--w6d%bTBf|}^3 zO1WCNy_)A=Ka10Hxwhs@X;EeP0heOVC9z#@pPaiLeGb1XuQ%(LnMMzz>ArofuYZ3t zRB`RUgR5xlz8gBQ(QbS9&idM|V%u{7(zUpRftM|BN#z#Y-%XXdu2_nw+r;aI!Kk^X ziP-TxJ$XKB>%4|tiX`d8i2;a%ETm>gf+Ps&8Eu(a8dp3EY5-6e*pdV?AhI&6uFGsz z%W_>6q}5=eISLJdfW|{umx=b~-J}<>T4)A(+ie%lpDKwveA}NnPgU5OHQ%d}bJMe< zi*9>#y54V0KWlfE)6aeWzlkFD_xS#?S4zq3}G z}%a~);mn#UhcI$UPPJX>p&~SYgQJU=L3 zZ=YfI;OG+9Nh zSqr(Xt!tFMwA4+huHh3#aiW#x>9XoCjXqKg@ACwZAyOtNRa*2qt8c2<(@WuOwdn5R zXv<$?ugdx?S9b15QPw<~@_wp#&bLl}mro0~=5PQC`kZ}kRTud5DX9`kRcExkRcEn0tNy$>~UT%(%t7a zM%|;%&OQ0I<;QIDTps(Y=lY%l+IYC8y)?(b$4^`7Jb$I_<>;;ld22L5Yie7fa$@Q7 zJdU$Co47li)PvC3$v3u3ty-7V;D#)fT9#DTf#cH^R=y>J~RATisoX zzEEKFJi{RcjG-hXh|yHOfE_#d`z7mZ?@uk8_2qYUyz|z5d|7J4Z4bw<4zF+NK40E> z``Ucwm7ilzl+&#G-z%$|q;)e>Vx_~=^88&}{1;Qo_GeHdyN*aj2#LT$1Ta!U0!RWF zAq)Tv2_Ok001N=h0!T&)g9Jn~AuG41mDkIsJyNXov(Wig$oIZ(jJ(==e>2PJy?rmN z@gA3(F2nFN`K!3J;wQgO8n@4WeAfBB88L3cx^!F5=#Nf)PmWyOS#@n%C9d#L$teYD zv}#Ri-z0#bIS(noD zesN#B==5}XK98u%xHz1zQBHV#>W`u8AIkLoS!%eKc6{2?iRU-w>+GiWO`^gnjd#;t zRkT$ZbY`a7jB2XdcHyZ=*M*|So(P#_Wlq$*)vrq{(`H+9t(!Ua#d;o>ljtSgelE

?uh4`8(dYBfwU3;=swm{^5eY|&y^gevns;;l2 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 P^+sye=y1@-e}w-JLv&rX literal 0 HcmV?d00001 diff --git a/content/themes/twentyseventeen/assets/images/svg-icons.svg b/content/themes/twentyseventeen/assets/images/svg-icons.svg new file mode 100644 index 0000000..d5f9ade --- /dev/null +++ b/content/themes/twentyseventeen/assets/images/svg-icons.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/themes/twentyseventeen/assets/js/customize-controls.js b/content/themes/twentyseventeen/assets/js/customize-controls.js new file mode 100644 index 0000000..8477975 --- /dev/null +++ b/content/themes/twentyseventeen/assets/js/customize-controls.js @@ -0,0 +1,36 @@ +/** + * Scripts within the customizer controls window. + * + * Contextually shows the color hue control and informs the preview + * when users open or close the front page sections section. + */ + +(function() { + wp.customize.bind( 'ready', function() { + + // Only show the color hue control when there's a custom color scheme. + wp.customize( 'colorscheme', function( setting ) { + wp.customize.control( 'colorscheme_hue', function( control ) { + var visibility = function() { + if ( 'custom' === setting.get() ) { + control.container.slideDown( 180 ); + } else { + control.container.slideUp( 180 ); + } + }; + + visibility(); + setting.bind( visibility ); + }); + }); + + // Detect when the front page sections section is expanded (or closed) so we can adjust the preview accordingly. + wp.customize.section( 'theme_options', function( section ) { + section.expanded.bind( function( isExpanding ) { + + // Value of isExpanding will = true if you're entering the section, false if you're leaving it. + wp.customize.previewer.send( 'section-highlight', { expanded: isExpanding }); + } ); + } ); + }); +})(); diff --git a/content/themes/twentyseventeen/assets/js/customize-preview.js b/content/themes/twentyseventeen/assets/js/customize-preview.js new file mode 100644 index 0000000..e97dd83 --- /dev/null +++ b/content/themes/twentyseventeen/assets/js/customize-preview.js @@ -0,0 +1,150 @@ +/** + * File customize-preview.js. + * + * Instantly live-update customizer settings in the preview for improved user experience. + */ + +(function( $ ) { + + // Collect information from customize-controls.js about which panels are opening. + wp.customize.bind( 'preview-ready', function() { + + // Initially hide the theme option placeholders on load. + $( '.panel-placeholder' ).hide(); + + wp.customize.preview.bind( 'section-highlight', function( data ) { + + // Only on the front page. + if ( ! $( 'body' ).hasClass( 'twentyseventeen-front-page' ) ) { + return; + } + + // When the section is expanded, show and scroll to the content placeholders, exposing the edit links. + if ( true === data.expanded ) { + $( 'body' ).addClass( 'highlight-front-sections' ); + $( '.panel-placeholder' ).slideDown( 200, function() { + $.scrollTo( $( '#panel1' ), { + duration: 600, + offset: { 'top': -70 } // Account for sticky menu. + }); + }); + + // If we've left the panel, hide the placeholders and scroll back to the top. + } else { + $( 'body' ).removeClass( 'highlight-front-sections' ); + // Don't change scroll when leaving - it's likely to have unintended consequences. + $( '.panel-placeholder' ).slideUp( 200 ); + } + }); + }); + + // Site title and description. + wp.customize( 'blogname', function( value ) { + value.bind( function( to ) { + $( '.site-title a' ).text( to ); + }); + }); + wp.customize( 'blogdescription', function( value ) { + value.bind( function( to ) { + $( '.site-description' ).text( to ); + }); + }); + + // Header text color. + wp.customize( 'header_textcolor', function( value ) { + value.bind( function( to ) { + if ( 'blank' === to ) { + $( '.site-title, .site-description' ).css({ + clip: 'rect(1px, 1px, 1px, 1px)', + position: 'absolute' + }); + // Add class for different logo styles if title and description are hidden. + $( 'body' ).addClass( 'title-tagline-hidden' ); + } else { + + // Check if the text color has been removed and use default colors in theme stylesheet. + if ( ! to.length ) { + $( '#twentyseventeen-custom-header-styles' ).remove(); + } + $( '.site-title, .site-description' ).css({ + clip: 'auto', + position: 'relative' + }); + $( '.site-branding, .site-branding a, .site-description, .site-description a' ).css({ + color: to + }); + // Add class for different logo styles if title and description are visible. + $( 'body' ).removeClass( 'title-tagline-hidden' ); + } + }); + }); + + // Color scheme. + wp.customize( 'colorscheme', function( value ) { + value.bind( function( to ) { + + // Update color body class. + $( 'body' ) + .removeClass( 'colors-light colors-dark colors-custom' ) + .addClass( 'colors-' + to ); + }); + }); + + // Custom color hue. + wp.customize( 'colorscheme_hue', function( value ) { + value.bind( function( to ) { + + // Update custom color CSS. + var style = $( '#custom-theme-colors' ), + hue = style.data( 'hue' ), + css = style.html(); + + // Equivalent to css.replaceAll, with hue followed by comma to prevent values with units from being changed. + css = css.split( hue + ',' ).join( to + ',' ); + style.html( css ).data( 'hue', to ); + }); + }); + + // Page layouts. + wp.customize( 'page_layout', function( value ) { + value.bind( function( to ) { + if ( 'one-column' === to ) { + $( 'body' ).addClass( 'page-one-column' ).removeClass( 'page-two-column' ); + } else { + $( 'body' ).removeClass( 'page-one-column' ).addClass( 'page-two-column' ); + } + } ); + } ); + + // Whether a header image is available. + function hasHeaderImage() { + var image = wp.customize( 'header_image' )(); + return '' !== image && 'remove-header' !== image; + } + + // Whether a header video is available. + function hasHeaderVideo() { + var externalVideo = wp.customize( 'external_header_video' )(), + video = wp.customize( 'header_video' )(); + + return '' !== externalVideo || ( 0 !== video && '' !== video ); + } + + // Toggle a body class if a custom header exists. + $.each( [ 'external_header_video', 'header_image', 'header_video' ], function( index, settingId ) { + wp.customize( settingId, function( setting ) { + setting.bind(function() { + if ( hasHeaderImage() ) { + $( document.body ).addClass( 'has-header-image' ); + } else { + $( document.body ).removeClass( 'has-header-image' ); + } + + if ( ! hasHeaderVideo() ) { + $( document.body ).removeClass( 'has-header-video' ); + } + } ); + } ); + } ); + +} )( jQuery ); diff --git a/content/themes/twentyseventeen/assets/js/global.js b/content/themes/twentyseventeen/assets/js/global.js new file mode 100644 index 0000000..b6322de --- /dev/null +++ b/content/themes/twentyseventeen/assets/js/global.js @@ -0,0 +1,250 @@ +/* global twentyseventeenScreenReaderText */ +(function( $ ) { + + // Variables and DOM Caching. + var $body = $( 'body' ), + $customHeader = $body.find( '.custom-header' ), + $branding = $customHeader.find( '.site-branding' ), + $navigation = $body.find( '.navigation-top' ), + $navWrap = $navigation.find( '.wrap' ), + $navMenuItem = $navigation.find( '.menu-item' ), + $menuToggle = $navigation.find( '.menu-toggle' ), + $menuScrollDown = $body.find( '.menu-scroll-down' ), + $sidebar = $body.find( '#secondary' ), + $entryContent = $body.find( '.entry-content' ), + $formatQuote = $body.find( '.format-quote blockquote' ), + isFrontPage = $body.hasClass( 'twentyseventeen-front-page' ) || $body.hasClass( 'home blog' ), + navigationFixedClass = 'site-navigation-fixed', + navigationHeight, + navigationOuterHeight, + navPadding, + navMenuItemHeight, + idealNavHeight, + navIsNotTooTall, + headerOffset, + menuTop = 0, + resizeTimer; + + // Ensure the sticky navigation doesn't cover current focused links. + $( 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], [contenteditable]', '.site-content-contain' ).filter( ':visible' ).focus( function() { + if ( $navigation.hasClass( 'site-navigation-fixed' ) ) { + var windowScrollTop = $( window ).scrollTop(), + fixedNavHeight = $navigation.height(), + itemScrollTop = $( this ).offset().top, + offsetDiff = itemScrollTop - windowScrollTop; + + // Account for Admin bar. + if ( $( '#wpadminbar' ).length ) { + offsetDiff -= $( '#wpadminbar' ).height(); + } + + if ( offsetDiff < fixedNavHeight ) { + $( window ).scrollTo( itemScrollTop - ( fixedNavHeight + 50 ), 0 ); + } + } + }); + + // Set properties of navigation. + function setNavProps() { + navigationHeight = $navigation.height(); + navigationOuterHeight = $navigation.outerHeight(); + navPadding = parseFloat( $navWrap.css( 'padding-top' ) ) * 2; + navMenuItemHeight = $navMenuItem.outerHeight() * 2; + idealNavHeight = navPadding + navMenuItemHeight; + navIsNotTooTall = navigationHeight <= idealNavHeight; + } + + // Make navigation 'stick'. + function adjustScrollClass() { + + // Make sure we're not on a mobile screen. + if ( 'none' === $menuToggle.css( 'display' ) ) { + + // Make sure the nav isn't taller than two rows. + if ( navIsNotTooTall ) { + + // When there's a custom header image or video, the header offset includes the height of the navigation. + if ( isFrontPage && ( $body.hasClass( 'has-header-image' ) || $body.hasClass( 'has-header-video' ) ) ) { + headerOffset = $customHeader.innerHeight() - navigationOuterHeight; + } else { + headerOffset = $customHeader.innerHeight(); + } + + // If the scroll is more than the custom header, set the fixed class. + if ( $( window ).scrollTop() >= headerOffset ) { + $navigation.addClass( navigationFixedClass ); + } else { + $navigation.removeClass( navigationFixedClass ); + } + + } else { + + // Remove 'fixed' class if nav is taller than two rows. + $navigation.removeClass( navigationFixedClass ); + } + } + } + + // Set margins of branding in header. + function adjustHeaderHeight() { + if ( 'none' === $menuToggle.css( 'display' ) ) { + + // The margin should be applied to different elements on front-page or home vs interior pages. + if ( isFrontPage ) { + $branding.css( 'margin-bottom', navigationOuterHeight ); + } else { + $customHeader.css( 'margin-bottom', navigationOuterHeight ); + } + + } else { + $customHeader.css( 'margin-bottom', '0' ); + $branding.css( 'margin-bottom', '0' ); + } + } + + // Set icon for quotes. + function setQuotesIcon() { + $( twentyseventeenScreenReaderText.quote ).prependTo( $formatQuote ); + } + + // Add 'below-entry-meta' class to elements. + function belowEntryMetaClass( param ) { + var sidebarPos, sidebarPosBottom; + + if ( ! $body.hasClass( 'has-sidebar' ) || ( + $body.hasClass( 'search' ) || + $body.hasClass( 'single-attachment' ) || + $body.hasClass( 'error404' ) || + $body.hasClass( 'twentyseventeen-front-page' ) + ) ) { + return; + } + + sidebarPos = $sidebar.offset(); + sidebarPosBottom = sidebarPos.top + ( $sidebar.height() + 28 ); + + $entryContent.find( param ).each( function() { + var $element = $( this ), + elementPos = $element.offset(), + elementPosTop = elementPos.top; + + // Add 'below-entry-meta' to elements below the entry meta. + if ( elementPosTop > sidebarPosBottom ) { + $element.addClass( 'below-entry-meta' ); + } else { + $element.removeClass( 'below-entry-meta' ); + } + }); + } + + /* + * Test if inline SVGs are supported. + * @link https://github.com/Modernizr/Modernizr/ + */ + function supportsInlineSVG() { + var div = document.createElement( 'div' ); + div.innerHTML = ''; + return 'http://www.w3.org/2000/svg' === ( 'undefined' !== typeof SVGRect && div.firstChild && div.firstChild.namespaceURI ); + } + + /** + * Test if an iOS device. + */ + function checkiOS() { + return /iPad|iPhone|iPod/.test(navigator.userAgent) && ! window.MSStream; + } + + /* + * Test if background-attachment: fixed is supported. + * @link http://stackoverflow.com/questions/14115080/detect-support-for-background-attachment-fixed + */ + function supportsFixedBackground() { + var el = document.createElement('div'), + isSupported; + + try { + if ( ! ( 'backgroundAttachment' in el.style ) || checkiOS() ) { + return false; + } + el.style.backgroundAttachment = 'fixed'; + isSupported = ( 'fixed' === el.style.backgroundAttachment ); + return isSupported; + } + catch (e) { + return false; + } + } + + // Fire on document ready. + $( document ).ready( function() { + + // If navigation menu is present on page, setNavProps and adjustScrollClass. + if ( $navigation.length ) { + setNavProps(); + adjustScrollClass(); + } + + // If 'Scroll Down' arrow in present on page, calculate scroll offset and bind an event handler to the click event. + if ( $menuScrollDown.length ) { + + if ( $( 'body' ).hasClass( 'admin-bar' ) ) { + menuTop -= 32; + } + if ( $( 'body' ).hasClass( 'blog' ) ) { + menuTop -= 30; // The div for latest posts has no space above content, add some to account for this. + } + if ( ! $navigation.length ) { + navigationOuterHeight = 0; + } + + $menuScrollDown.click( function( e ) { + e.preventDefault(); + $( window ).scrollTo( '#primary', { + duration: 600, + offset: { top: menuTop - navigationOuterHeight } + }); + }); + } + + adjustHeaderHeight(); + setQuotesIcon(); + belowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' ); + if ( true === supportsInlineSVG() ) { + document.documentElement.className = document.documentElement.className.replace( /(\s*)no-svg(\s*)/, '$1svg$2' ); + } + + if ( true === supportsFixedBackground() ) { + document.documentElement.className += ' background-fixed'; + } + }); + + // If navigation menu is present on page, adjust it on scroll and screen resize. + if ( $navigation.length ) { + + // On scroll, we want to stick/unstick the navigation. + $( window ).on( 'scroll', function() { + adjustScrollClass(); + adjustHeaderHeight(); + }); + + // Also want to make sure the navigation is where it should be on resize. + $( window ).resize( function() { + setNavProps(); + setTimeout( adjustScrollClass, 500 ); + }); + } + + $( window ).resize( function() { + clearTimeout( resizeTimer ); + resizeTimer = setTimeout( function() { + belowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' ); + }, 300 ); + setTimeout( adjustHeaderHeight, 1000 ); + }); + + // Add header video class after the video is loaded. + $( document ).on( 'wp-custom-header-video-loaded', function() { + $body.addClass( 'has-header-video' ); + }); + +})( jQuery ); diff --git a/content/themes/twentyseventeen/assets/js/html5.js b/content/themes/twentyseventeen/assets/js/html5.js new file mode 100644 index 0000000..9c1f049 --- /dev/null +++ b/content/themes/twentyseventeen/assets/js/html5.js @@ -0,0 +1,326 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +;(function(window, document) { +/*jshint evil:true */ + /** version */ + var version = '3.7.3'; + + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE **/ + var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = ''; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + // assign a false positive if detection fails => unable to shiv + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Extends the built-in list of html5 elements + * @memberOf html5 + * @param {String|Array} newElements whitespace separated list or array of new element names to shiv + * @param {Document} ownerDocument The context document. + */ + function addElements(newElements, ownerDocument) { + var elements = html5.elements; + if(typeof elements != 'string'){ + elements = elements.join(' '); + } + if(typeof newElements != 'string'){ + newElements = newElements.join(' '); + } + html5.elements = elements +' '+ newElements; + shivDocument(ownerDocument); + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document|DocumentFragment} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;igmailcom | http://flesler.blogspot.com + * Licensed under MIT + * http://flesler.blogspot.com/2007/10/jqueryscrollto.html + * @projectDescription Lightweight, cross-browser and highly customizable animated scrolling with jQuery + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // AMD + define( ['jquery'], factory ); + } else if (typeof module !== 'undefined' && module.exports) { + // CommonJS + module.exports = factory( require( 'jquery' ) ); + } else { + // Global + factory( jQuery ); + } +})(function($) { + 'use strict'; + + var $scrollTo = $.scrollTo = function(target, duration, settings) { + return $( window ).scrollTo( target, duration, settings ); + }; + + $scrollTo.defaults = { + axis:'xy', + duration: 0, + limit:true + }; + + function isWin(elem) { + return ! elem.nodeName || + $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) !== -1; + } + + $.fn.scrollTo = function(target, duration, settings) { + if (typeof duration === 'object') { + settings = duration; + duration = 0; + } + if (typeof settings === 'function') { + settings = { onAfter:settings }; + } + if (target === 'max') { + target = 9e9; + } + + settings = $.extend( {}, $scrollTo.defaults, settings ); + // Speed is still recognized for backwards compatibility + duration = duration || settings.duration; + // Make sure the settings are given right + var queue = settings.queue && settings.axis.length > 1; + if (queue) { + // Let's keep the overall duration + duration /= 2; + } + settings.offset = both( settings.offset ); + settings.over = both( settings.over ); + + return this.each(function() { + // Null target yields nothing, just like jQuery does + if (target === null) { return; } + + var win = isWin( this ), + elem = win ? this.contentWindow || window : this, + $elem = $( elem ), + targ = target, + attr = {}, + toff; + + switch (typeof targ) { + // A number will pass the regex + case 'number': + case 'string': + if (/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test( targ )) { + targ = both( targ ); + // We are done + break; + } + // Relative/Absolute selector + targ = win ? $( targ ) : $( targ, elem ); + /* falls through */ + case 'object': + if (targ.length === 0) { return; } + // DOMElement / jQuery + if (targ.is || targ.style) { + // Get the real position of the target + toff = (targ = $( targ )).offset(); + } + } + + var offset = $.isFunction( settings.offset ) && settings.offset( elem, targ ) || settings.offset; + + $.each(settings.axis.split( '' ), function(i, axis) { + var Pos = axis === 'x' ? 'Left' : 'Top', + pos = Pos.toLowerCase(), + key = 'scroll' + Pos, + prev = $elem[key](), + max = $scrollTo.max( elem, axis ); + + if (toff) {// jQuery / DOMElement + attr[key] = toff[pos] + (win ? 0 : prev - $elem.offset()[pos]); + + // If it's a dom element, reduce the margin + if (settings.margin) { + attr[key] -= parseInt( targ.css( 'margin' + Pos ), 10 ) || 0; + attr[key] -= parseInt( targ.css( 'border' + Pos + 'Width' ), 10 ) || 0; + } + + attr[key] += offset[pos] || 0; + + if (settings.over[pos]) { + // Scroll to a fraction of its width/height + attr[key] += targ[axis === 'x'?'width':'height']() * settings.over[pos]; + } + } else { + var val = targ[pos]; + // Handle percentage values + attr[key] = val.slice && val.slice( -1 ) === '%' ? + parseFloat( val ) / 100 * max + : val; + } + + // Number or 'number' + if (settings.limit && /^\d+$/.test( attr[key] )) { + // Check the limits + attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); + } + + // Don't waste time animating, if there's no need. + if ( ! i && settings.axis.length > 1) { + if (prev === attr[key]) { + // No animation needed + attr = {}; + } else if (queue) { + // Intermediate animation + animate( settings.onAfterFirst ); + // Don't animate this axis again in the next iteration. + attr = {}; + } + } + }); + + animate( settings.onAfter ); + + function animate(callback) { + var opts = $.extend({}, settings, { + // The queue setting conflicts with animate() + // Force it to always be true + queue: true, + duration: duration, + complete: callback && function() { + callback.call( elem, targ, settings ); + } + }); + $elem.animate( attr, opts ); + } + }); + }; + + // Max scrolling position, works on quirks mode + // It only fails (not too badly) on IE, quirks mode. + $scrollTo.max = function(elem, axis) { + var Dim = axis === 'x' ? 'Width' : 'Height', + scroll = 'scroll' + Dim; + + if ( ! isWin( elem )) { + return elem[scroll] - $( elem )[Dim.toLowerCase()](); } + + var size = 'client' + Dim, + doc = elem.ownerDocument || elem.document, + html = doc.documentElement, + body = doc.body; + + return Math.max( html[scroll], body[scroll] ) - Math.min( html[size], body[size] ); + }; + + function both(val) { + return $.isFunction( val ) || $.isPlainObject( val ) ? val : { top:val, left:val }; + } + + // Add special hooks so that window scroll properties can be animated + $.Tween.propHooks.scrollLeft = $.Tween.propHooks.scrollTop = { + get: function(t) { + return $( t.elem )[t.prop](); + }, + set: function(t) { + var curr = this.get( t ); + // If interrupt is true and user scrolled, stop animating + if (t.options.interrupt && t._last && t._last !== curr) { + return $( t.elem ).stop(); + } + var next = Math.round( t.now ); + // Don't waste CPU + // Browsers don't render floating point scroll + if (curr !== next) { + $( t.elem )[t.prop](next); + t._last = this.get( t ); + } + } + }; + + // AMD requirement + return $scrollTo; +}); diff --git a/content/themes/twentyseventeen/assets/js/navigation.js b/content/themes/twentyseventeen/assets/js/navigation.js new file mode 100644 index 0000000..f0fd652 --- /dev/null +++ b/content/themes/twentyseventeen/assets/js/navigation.js @@ -0,0 +1,109 @@ +/* global twentyseventeenScreenReaderText */ +/** + * Theme functions file. + * + * Contains handlers for navigation and widget area. + */ + +(function( $ ) { + var masthead, menuToggle, siteNavContain, siteNavigation; + + function initMainNavigation( container ) { + + // Add dropdown toggle that displays child menu items. + var dropdownToggle = $( '

+ +
+
+ + + +
+
+ + + + + + diff --git a/content/themes/twentyseventeen/front-page.php b/content/themes/twentyseventeen/front-page.php new file mode 100644 index 0000000..3857ea6 --- /dev/null +++ b/content/themes/twentyseventeen/front-page.php @@ -0,0 +1,59 @@ + + +
+
+ + + + + +
+
+ + 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' ); + + add_image_size( 'twentyseventeen-featured-image', 2000, 1200, true ); + + add_image_size( 'twentyseventeen-thumbnail-avatar', 100, 100, true ); + + // Set the default content width. + $GLOBALS['content_width'] = 525; + + // This theme uses wp_nav_menu() in two locations. + register_nav_menus( + array( + 'top' => __( 'Top Menu', 'twentyseventeen' ), + 'social' => __( 'Social Links Menu', 'twentyseventeen' ), + ) + ); + + /* + * Switch default core markup for search form, comment form, and comments + * to output valid HTML5. + */ + add_theme_support( + 'html5', + array( + 'comment-form', + 'comment-list', + 'gallery', + 'caption', + 'script', + 'style', + ) + ); + + /* + * Enable support for Post Formats. + * + * See: https://wordpress.org/support/article/post-formats/ + */ + add_theme_support( + 'post-formats', + array( + 'aside', + 'image', + 'video', + 'quote', + 'link', + 'gallery', + 'audio', + ) + ); + + // Add theme support for Custom Logo. + add_theme_support( + 'custom-logo', + array( + 'width' => 250, + 'height' => 250, + 'flex-width' => true, + ) + ); + + // Add theme support for selective refresh for widgets. + add_theme_support( 'customize-selective-refresh-widgets' ); + + /* + * This theme styles the visual editor to resemble the theme style, + * specifically font, colors, and column width. + */ + add_editor_style( array( 'assets/css/editor-style.css', twentyseventeen_fonts_url() ) ); + + // Load regular editor styles into the new block-based editor. + add_theme_support( 'editor-styles' ); + + // Load default block styles. + add_theme_support( 'wp-block-styles' ); + + // Add support for responsive embeds. + add_theme_support( 'responsive-embeds' ); + + // Define and register starter content to showcase the theme on new sites. + $starter_content = array( + 'widgets' => array( + // Place three core-defined widgets in the sidebar area. + 'sidebar-1' => array( + 'text_business_info', + 'search', + 'text_about', + ), + + // Add the core-defined business info widget to the footer 1 area. + 'sidebar-2' => array( + 'text_business_info', + ), + + // Put two core-defined widgets in the footer 2 area. + 'sidebar-3' => array( + 'text_about', + 'search', + ), + ), + + // Specify the core-defined pages to create and add custom thumbnails to some of them. + 'posts' => array( + 'home', + 'about' => array( + 'thumbnail' => '{{image-sandwich}}', + ), + 'contact' => array( + 'thumbnail' => '{{image-espresso}}', + ), + 'blog' => array( + 'thumbnail' => '{{image-coffee}}', + ), + 'homepage-section' => array( + 'thumbnail' => '{{image-espresso}}', + ), + ), + + // Create the custom image attachments used as post thumbnails for pages. + 'attachments' => array( + 'image-espresso' => array( + 'post_title' => _x( 'Espresso', 'Theme starter content', 'twentyseventeen' ), + 'file' => 'assets/images/espresso.jpg', // URL relative to the template directory. + ), + 'image-sandwich' => array( + 'post_title' => _x( 'Sandwich', 'Theme starter content', 'twentyseventeen' ), + 'file' => 'assets/images/sandwich.jpg', + ), + 'image-coffee' => array( + 'post_title' => _x( 'Coffee', 'Theme starter content', 'twentyseventeen' ), + 'file' => 'assets/images/coffee.jpg', + ), + ), + + // Default to a static front page and assign the front and posts pages. + 'options' => array( + 'show_on_front' => 'page', + 'page_on_front' => '{{home}}', + 'page_for_posts' => '{{blog}}', + ), + + // Set the front page section theme mods to the IDs of the core-registered pages. + 'theme_mods' => array( + 'panel_1' => '{{homepage-section}}', + 'panel_2' => '{{about}}', + 'panel_3' => '{{blog}}', + 'panel_4' => '{{contact}}', + ), + + // Set up nav menus for each of the two areas registered in the theme. + 'nav_menus' => array( + // Assign a menu to the "top" location. + 'top' => array( + 'name' => __( 'Top Menu', 'twentyseventeen' ), + 'items' => array( + 'link_home', // Note that the core "home" page is actually a link in case a static front page is not used. + 'page_about', + 'page_blog', + 'page_contact', + ), + ), + + // Assign a menu to the "social" location. + 'social' => array( + 'name' => __( 'Social Links Menu', 'twentyseventeen' ), + 'items' => array( + 'link_yelp', + 'link_facebook', + 'link_twitter', + 'link_instagram', + 'link_email', + ), + ), + ), + ); + + /** + * Filters Twenty Seventeen array of starter content. + * + * @since Twenty Seventeen 1.1 + * + * @param array $starter_content Array of starter content. + */ + $starter_content = apply_filters( 'twentyseventeen_starter_content', $starter_content ); + + add_theme_support( 'starter-content', $starter_content ); +} +add_action( 'after_setup_theme', 'twentyseventeen_setup' ); + +/** + * Set the content width in pixels, based on the theme's design and stylesheet. + * + * Priority 0 to make it available to lower priority callbacks. + * + * @global int $content_width + */ +function twentyseventeen_content_width() { + + $content_width = $GLOBALS['content_width']; + + // Get layout. + $page_layout = get_theme_mod( 'page_layout' ); + + // Check if layout is one column. + if ( 'one-column' === $page_layout ) { + if ( twentyseventeen_is_frontpage() ) { + $content_width = 644; + } elseif ( is_page() ) { + $content_width = 740; + } + } + + // Check if is single post and there is no sidebar. + if ( is_single() && ! is_active_sidebar( 'sidebar-1' ) ) { + $content_width = 740; + } + + /** + * Filter Twenty Seventeen content width of the theme. + * + * @since Twenty Seventeen 1.0 + * + * @param int $content_width Content width in pixels. + */ + $GLOBALS['content_width'] = apply_filters( 'twentyseventeen_content_width', $content_width ); +} +add_action( 'template_redirect', 'twentyseventeen_content_width', 0 ); + +/** + * Register custom fonts. + */ +function twentyseventeen_fonts_url() { + $fonts_url = ''; + + /* + * translators: If there are characters in your language that are not supported + * by Libre Franklin, translate this to 'off'. Do not translate into your own language. + */ + $libre_franklin = _x( 'on', 'Libre Franklin font: on or off', 'twentyseventeen' ); + + if ( 'off' !== $libre_franklin ) { + $font_families = array(); + + $font_families[] = 'Libre Franklin:300,300i,400,400i,600,600i,800,800i'; + + $query_args = array( + 'family' => urlencode( implode( '|', $font_families ) ), + 'subset' => urlencode( 'latin,latin-ext' ), + 'display' => urlencode( 'fallback' ), + ); + + $fonts_url = add_query_arg( $query_args, 'https://fonts.googleapis.com/css' ); + } + + return esc_url_raw( $fonts_url ); +} + +/** + * Add preconnect for Google Fonts. + * + * @since Twenty Seventeen 1.0 + * + * @param array $urls URLs to print for resource hints. + * @param string $relation_type The relation type the URLs are printed. + * @return array $urls URLs to print for resource hints. + */ +function twentyseventeen_resource_hints( $urls, $relation_type ) { + if ( wp_style_is( 'twentyseventeen-fonts', 'queue' ) && 'preconnect' === $relation_type ) { + $urls[] = array( + 'href' => 'https://fonts.gstatic.com', + 'crossorigin', + ); + } + + return $urls; +} +add_filter( 'wp_resource_hints', 'twentyseventeen_resource_hints', 10, 2 ); + +/** + * Register widget area. + * + * @link https://developer.wordpress.org/themes/functionality/sidebars/#registering-a-sidebar + */ +function twentyseventeen_widgets_init() { + register_sidebar( + array( + 'name' => __( 'Blog Sidebar', 'twentyseventeen' ), + 'id' => 'sidebar-1', + 'description' => __( 'Add widgets here to appear in your sidebar on blog posts and archive pages.', 'twentyseventeen' ), + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ) + ); + + register_sidebar( + array( + 'name' => __( 'Footer 1', 'twentyseventeen' ), + 'id' => 'sidebar-2', + 'description' => __( 'Add widgets here to appear in your footer.', 'twentyseventeen' ), + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ) + ); + + register_sidebar( + array( + 'name' => __( 'Footer 2', 'twentyseventeen' ), + 'id' => 'sidebar-3', + 'description' => __( 'Add widgets here to appear in your footer.', 'twentyseventeen' ), + 'before_widget' => '
', + 'after_widget' => '
', + 'before_title' => '

', + 'after_title' => '

', + ) + ); +} +add_action( 'widgets_init', 'twentyseventeen_widgets_init' ); + +/** + * Replaces "[...]" (appended to automatically generated excerpts) with ... and + * a 'Continue reading' link. + * + * @since Twenty Seventeen 1.0 + * + * @param string $link Link to single post/page. + * @return string 'Continue reading' link prepended with an ellipsis. + */ +function twentyseventeen_excerpt_more( $link ) { + if ( is_admin() ) { + return $link; + } + + $link = sprintf( + '
', + esc_url( get_permalink( get_the_ID() ) ), + /* translators: %s: Post title. */ + sprintf( __( 'Continue reading "%s"', 'twentyseventeen' ), get_the_title( get_the_ID() ) ) + ); + return ' … ' . $link; +} +add_filter( 'excerpt_more', 'twentyseventeen_excerpt_more' ); + +/** + * Handles JavaScript detection. + * + * Adds a `js` class to the root `` element when JavaScript is detected. + * + * @since Twenty Seventeen 1.0 + */ +function twentyseventeen_javascript_detection() { + echo "\n"; +} +add_action( 'wp_head', 'twentyseventeen_javascript_detection', 0 ); + +/** + * Add a pingback url auto-discovery header for singularly identifiable articles. + */ +function twentyseventeen_pingback_header() { + if ( is_singular() && pings_open() ) { + printf( '' . "\n", esc_url( get_bloginfo( 'pingback_url' ) ) ); + } +} +add_action( 'wp_head', 'twentyseventeen_pingback_header' ); + +/** + * Display custom color CSS. + */ +function twentyseventeen_colors_css_wrap() { + if ( 'custom' !== get_theme_mod( 'colorscheme' ) && ! is_customize_preview() ) { + return; + } + + require_once get_parent_theme_file_path( '/inc/color-patterns.php' ); + $hue = absint( get_theme_mod( 'colorscheme_hue', 250 ) ); + + $customize_preview_data_hue = ''; + if ( is_customize_preview() ) { + $customize_preview_data_hue = 'data-hue="' . $hue . '"'; + } + ?> + + twentyseventeen_get_svg( array( 'icon' => 'quote-right' ) ), + ); + + if ( has_nav_menu( 'top' ) ) { + wp_enqueue_script( 'twentyseventeen-navigation', get_theme_file_uri( '/assets/js/navigation.js' ), array( 'jquery' ), '20161203', true ); + $twentyseventeen_l10n['expand'] = __( 'Expand child menu', 'twentyseventeen' ); + $twentyseventeen_l10n['collapse'] = __( 'Collapse child menu', 'twentyseventeen' ); + $twentyseventeen_l10n['icon'] = twentyseventeen_get_svg( + array( + 'icon' => 'angle-down', + 'fallback' => true, + ) + ); + } + + wp_enqueue_script( 'twentyseventeen-global', get_theme_file_uri( '/assets/js/global.js' ), array( 'jquery' ), '20190121', true ); + + wp_enqueue_script( 'jquery-scrollto', get_theme_file_uri( '/assets/js/jquery.scrollTo.js' ), array( 'jquery' ), '2.1.2', true ); + + wp_localize_script( 'twentyseventeen-skip-link-focus-fix', 'twentyseventeenScreenReaderText', $twentyseventeen_l10n ); + + if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { + wp_enqueue_script( 'comment-reply' ); + } +} +add_action( 'wp_enqueue_scripts', 'twentyseventeen_scripts' ); + +/** + * Enqueues styles for the block-based editor. + * + * @since Twenty Seventeen 1.8 + */ +function twentyseventeen_block_editor_styles() { + // Block styles. + wp_enqueue_style( 'twentyseventeen-block-editor-style', get_theme_file_uri( '/assets/css/editor-blocks.css' ), array(), '20190328' ); + // Add custom fonts. + wp_enqueue_style( 'twentyseventeen-fonts', twentyseventeen_fonts_url(), array(), null ); +} +add_action( 'enqueue_block_editor_assets', 'twentyseventeen_block_editor_styles' ); + +/** + * Add custom image sizes attribute to enhance responsive image functionality + * for content images. + * + * @since Twenty Seventeen 1.0 + * + * @param string $sizes A source size value for use in a 'sizes' attribute. + * @param array $size Image size. Accepts an array of width and height + * values in pixels (in that order). + * @return string A source size value for use in a content image 'sizes' attribute. + */ +function twentyseventeen_content_image_sizes_attr( $sizes, $size ) { + $width = $size[0]; + + if ( 740 <= $width ) { + $sizes = '(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px'; + } + + if ( is_active_sidebar( 'sidebar-1' ) || is_archive() || is_search() || is_home() || is_page() ) { + if ( ! ( is_page() && 'one-column' === get_theme_mod( 'page_options' ) ) && 767 <= $width ) { + $sizes = '(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px'; + } + } + + return $sizes; +} +add_filter( 'wp_calculate_image_sizes', 'twentyseventeen_content_image_sizes_attr', 10, 2 ); + +/** + * Filter the `sizes` value in the header image markup. + * + * @since Twenty Seventeen 1.0 + * + * @param string $html The HTML image tag markup being filtered. + * @param object $header The custom header object returned by 'get_custom_header()'. + * @param array $attr Array of the attributes for the image tag. + * @return string The filtered header image HTML. + */ +function twentyseventeen_header_image_tag( $html, $header, $attr ) { + if ( isset( $attr['sizes'] ) ) { + $html = str_replace( $attr['sizes'], '100vw', $html ); + } + return $html; +} +add_filter( 'get_header_image_tag', 'twentyseventeen_header_image_tag', 10, 3 ); + +/** + * Add custom image sizes attribute to enhance responsive image functionality + * for post thumbnails. + * + * @since Twenty Seventeen 1.0 + * + * @param array $attr Attributes for the image markup. + * @param int $attachment Image attachment ID. + * @param array $size Registered image size or flat array of height and width dimensions. + * @return array The filtered attributes for the image markup. + */ +function twentyseventeen_post_thumbnail_sizes_attr( $attr, $attachment, $size ) { + if ( is_archive() || is_search() || is_home() ) { + $attr['sizes'] = '(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px'; + } else { + $attr['sizes'] = '100vw'; + } + + return $attr; +} +add_filter( 'wp_get_attachment_image_attributes', 'twentyseventeen_post_thumbnail_sizes_attr', 10, 3 ); + +/** + * Use front-page.php when Front page displays is set to a static page. + * + * @since Twenty Seventeen 1.0 + * + * @param string $template front-page.php. + * + * @return string The template to be used: blank if is_home() is true (defaults to index.php), else $template. + */ +function twentyseventeen_front_page_template( $template ) { + return is_home() ? '' : $template; +} +add_filter( 'frontpage_template', 'twentyseventeen_front_page_template' ); + +/** + * Modifies tag cloud widget arguments to display all tags in the same font size + * and use list format for better accessibility. + * + * @since Twenty Seventeen 1.4 + * + * @param array $args Arguments for tag cloud widget. + * @return array The filtered arguments for tag cloud widget. + */ +function twentyseventeen_widget_tag_cloud_args( $args ) { + $args['largest'] = 1; + $args['smallest'] = 1; + $args['unit'] = 'em'; + $args['format'] = 'list'; + + return $args; +} +add_filter( 'widget_tag_cloud_args', 'twentyseventeen_widget_tag_cloud_args' ); + +/** + * Get unique ID. + * + * This is a PHP implementation of Underscore's uniqueId method. A static variable + * contains an integer that is incremented with each call. This number is returned + * with the optional prefix. As such the returned value is not universally unique, + * but it is unique across the life of the PHP process. + * + * @since Twenty Seventeen 2.0 + * @see wp_unique_id() Themes requiring WordPress 5.0.3 and greater should use this instead. + * + * @staticvar int $id_counter + * + * @param string $prefix Prefix for the returned ID. + * @return string Unique ID. + */ +function twentyseventeen_unique_id( $prefix = '' ) { + static $id_counter = 0; + if ( function_exists( 'wp_unique_id' ) ) { + return wp_unique_id( $prefix ); + } + return $prefix . (string) ++$id_counter; +} + +/** + * Implement the Custom Header feature. + */ +require get_parent_theme_file_path( '/inc/custom-header.php' ); + +/** + * Custom template tags for this theme. + */ +require get_parent_theme_file_path( '/inc/template-tags.php' ); + +/** + * Additional features to allow styling of the templates. + */ +require get_parent_theme_file_path( '/inc/template-functions.php' ); + +/** + * Customizer additions. + */ +require get_parent_theme_file_path( '/inc/customizer.php' ); + +/** + * SVG icons functions and filters. + */ +require get_parent_theme_file_path( '/inc/icon-functions.php' ); diff --git a/content/themes/twentyseventeen/header.php b/content/themes/twentyseventeen/header.php new file mode 100644 index 0000000..9ea7aa5 --- /dev/null +++ b/content/themes/twentyseventeen/header.php @@ -0,0 +1,58 @@ + section and everything up until
+ * + * @link https://developer.wordpress.org/themes/basics/template-files/#template-partials + * + * @package WordPress + * @subpackage Twenty_Seventeen + * @since Twenty Seventeen 1.0 + * @version 1.0 + */ + +?> + class="no-js no-svg"> + + + + + + + + +> + +
+ + + + + '; + echo get_the_post_thumbnail( get_queried_object_id(), 'twentyseventeen-featured-image' ); + echo '
'; + endif; + ?> + +
+
diff --git a/content/themes/twentyseventeen/inc/back-compat.php b/content/themes/twentyseventeen/inc/back-compat.php new file mode 100644 index 0000000..1b8c873 --- /dev/null +++ b/content/themes/twentyseventeen/inc/back-compat.php @@ -0,0 +1,76 @@ +

%s

', $message ); +} + +/** + * Prevents the Customizer from being loaded on WordPress versions prior to 4.7. + * + * @since Twenty Seventeen 1.0 + * + * @global string $wp_version WordPress version. + */ +function twentyseventeen_customize() { + wp_die( + /* translators: %s: The current WordPress version. */ + sprintf( __( 'Twenty Seventeen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again.', 'twentyseventeen' ), $GLOBALS['wp_version'] ), + '', + array( + 'back_link' => true, + ) + ); +} +add_action( 'load-customize.php', 'twentyseventeen_customize' ); + +/** + * Prevents the Theme Preview from being loaded on WordPress versions prior to 4.7. + * + * @since Twenty Seventeen 1.0 + * + * @global string $wp_version WordPress version. + */ +function twentyseventeen_preview() { + if ( isset( $_GET['preview'] ) ) { + /* translators: %s: The current WordPress version. */ + wp_die( sprintf( __( 'Twenty Seventeen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again.', 'twentyseventeen' ), $GLOBALS['wp_version'] ) ); + } +} +add_action( 'template_redirect', 'twentyseventeen_preview' ); diff --git a/content/themes/twentyseventeen/inc/color-patterns.php b/content/themes/twentyseventeen/inc/color-patterns.php new file mode 100644 index 0000000..2e3422f --- /dev/null +++ b/content/themes/twentyseventeen/inc/color-patterns.php @@ -0,0 +1,580 @@ + .comment-body > .comment-meta > .comment-author .avatar { + border-color: hsl( ' . $hue . ', ' . $reduced_saturation . ', 20% ); /* base: #333; */ +} + +.colors-custom h2, +.colors-custom blockquote, +.colors-custom input[type="text"], +.colors-custom input[type="email"], +.colors-custom input[type="url"], +.colors-custom input[type="password"], +.colors-custom input[type="search"], +.colors-custom input[type="number"], +.colors-custom input[type="tel"], +.colors-custom input[type="range"], +.colors-custom input[type="date"], +.colors-custom input[type="month"], +.colors-custom input[type="week"], +.colors-custom input[type="time"], +.colors-custom input[type="datetime"], +.colors-custom input[type="datetime-local"], +.colors-custom input[type="color"], +.colors-custom textarea, +.colors-custom .site-description, +.colors-custom .entry-content blockquote.alignleft, +.colors-custom .entry-content blockquote.alignright, +.colors-custom .colors-custom .taxonomy-description, +.colors-custom .site-info a, +.colors-custom .wp-caption, +.colors-custom .gallery-caption { + color: hsl( ' . $hue . ', ' . $saturation . ', 40% ); /* base: #666; */ +} + +.colors-custom abbr, +.colors-custom acronym { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 40% ); /* base: #666; */ +} + +.colors-custom h5, +.colors-custom .entry-meta, +.colors-custom .entry-meta a, +.colors-custom.blog .entry-meta a.post-edit-link, +.colors-custom.archive .entry-meta a.post-edit-link, +.colors-custom.search .entry-meta a.post-edit-link, +.colors-custom .nav-subtitle, +.colors-custom .comment-metadata, +.colors-custom .comment-metadata a, +.colors-custom .no-comments, +.colors-custom .comment-awaiting-moderation, +.colors-custom .page-numbers.current, +.colors-custom .page-links .page-number, +.colors-custom .navigation-top .current-menu-item > a, +.colors-custom .navigation-top .current_page_item > a, +.colors-custom .main-navigation a:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-current-item .wp-playlist-item-artist { + color: hsl( ' . $hue . ', ' . $saturation . ', 46% ); /* base: #767676; */ +} + +.colors-custom :not( .mejs-button ) > button:hover, +.colors-custom :not( .mejs-button ) > button:focus, +.colors-custom input[type="button"]:hover, +.colors-custom input[type="button"]:focus, +.colors-custom input[type="submit"]:hover, +.colors-custom input[type="submit"]:focus, +.colors-custom .entry-footer .edit-link a.post-edit-link:hover, +.colors-custom .entry-footer .edit-link a.post-edit-link:focus, +.colors-custom .social-navigation a, +.colors-custom .prev.page-numbers:focus, +.colors-custom .prev.page-numbers:hover, +.colors-custom .next.page-numbers:focus, +.colors-custom .next.page-numbers:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:focus { + background: hsl( ' . esc_attr( $hue ) . ', ' . esc_attr( $saturation ) . ', 46% ); /* base: #767676; */ +} + +.colors-custom button.secondary:hover, +.colors-custom button.secondary:focus, +.colors-custom input[type="reset"]:hover, +.colors-custom input[type="reset"]:focus, +.colors-custom input[type="button"].secondary:hover, +.colors-custom input[type="button"].secondary:focus, +.colors-custom input[type="reset"].secondary:hover, +.colors-custom input[type="reset"].secondary:focus, +.colors-custom input[type="submit"].secondary:hover, +.colors-custom input[type="submit"].secondary:focus, +.colors-custom hr { + background: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ +} + +.colors-custom input[type="text"], +.colors-custom input[type="email"], +.colors-custom input[type="url"], +.colors-custom input[type="password"], +.colors-custom input[type="search"], +.colors-custom input[type="number"], +.colors-custom input[type="tel"], +.colors-custom input[type="range"], +.colors-custom input[type="date"], +.colors-custom input[type="month"], +.colors-custom input[type="week"], +.colors-custom input[type="time"], +.colors-custom input[type="datetime"], +.colors-custom input[type="datetime-local"], +.colors-custom input[type="color"], +.colors-custom textarea, +.colors-custom select, +.colors-custom fieldset, +.colors-custom .widget .tagcloud a:hover, +.colors-custom .widget .tagcloud a:focus, +.colors-custom .widget.widget_tag_cloud a:hover, +.colors-custom .widget.widget_tag_cloud a:focus, +.colors-custom .wp_widget_tag_cloud a:hover, +.colors-custom .wp_widget_tag_cloud a:focus { + border-color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ +} + +.colors-custom thead th { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ +} + +.colors-custom .entry-footer .cat-links .icon, +.colors-custom .entry-footer .tags-links .icon { + color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ +} + +.colors-custom button.secondary, +.colors-custom input[type="reset"], +.colors-custom input[type="button"].secondary, +.colors-custom input[type="reset"].secondary, +.colors-custom input[type="submit"].secondary, +.colors-custom .prev.page-numbers, +.colors-custom .next.page-numbers { + background-color: hsl( ' . $hue . ', ' . $saturation . ', 87% ); /* base: #ddd; */ +} + +.colors-custom .widget .tagcloud a, +.colors-custom .widget.widget_tag_cloud a, +.colors-custom .wp_widget_tag_cloud a { + border-color: hsl( ' . $hue . ', ' . $saturation . ', 87% ); /* base: #ddd; */ +} + +.colors-custom.twentyseventeen-front-page article:not(.has-post-thumbnail):not(:first-child), +.colors-custom .widget ul li { + border-top-color: hsl( ' . $hue . ', ' . $saturation . ', 87% ); /* base: #ddd; */ +} + +.colors-custom .widget ul li { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 87% ); /* base: #ddd; */ +} + +.colors-custom pre, +.colors-custom mark, +.colors-custom ins { + background: hsl( ' . $hue . ', ' . $saturation . ', 93% ); /* base: #eee; */ +} + +.colors-custom .navigation-top, +.colors-custom .main-navigation > div > ul, +.colors-custom .pagination, +.colors-custom .comments-pagination, +.colors-custom .entry-footer, +.colors-custom .site-footer { + border-top-color: hsl( ' . $hue . ', ' . $saturation . ', 93% ); /* base: #eee; */ +} + +.colors-custom .navigation-top, +.colors-custom .main-navigation li, +.colors-custom .entry-footer, +.colors-custom .single-featured-image-header, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item, +.colors-custom tr { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 93% ); /* base: #eee; */ +} + +.colors-custom .site-content .wp-playlist-light { + border-color: hsl( ' . $hue . ', ' . $saturation . ', 93% ); /* base: #eee; */ +} + +.colors-custom .site-header, +.colors-custom .single-featured-image-header { + background-color: hsl( ' . $hue . ', ' . $saturation . ', 98% ); /* base: #fafafa; */ +} + +.colors-custom button, +.colors-custom input[type="button"], +.colors-custom input[type="submit"], +.colors-custom .entry-footer .edit-link a.post-edit-link, +.colors-custom .social-navigation a, +.colors-custom .site-content .wp-playlist-light a.wp-playlist-caption:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:hover a, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:focus a, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:hover, +.colors-custom .site-content .wp-playlist-light .wp-playlist-item:focus, +.colors-custom .prev.page-numbers:focus, +.colors-custom .prev.page-numbers:hover, +.colors-custom .next.page-numbers:focus, +.colors-custom .next.page-numbers:hover, +.colors-custom.has-header-image .site-title, +.colors-custom.has-header-video .site-title, +.colors-custom.has-header-image .site-title a, +.colors-custom.has-header-video .site-title a, +.colors-custom.has-header-image .site-description, +.colors-custom.has-header-video .site-description { + color: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ +} + +body.colors-custom, +.colors-custom .navigation-top, +.colors-custom .main-navigation ul { + background: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ +} + +.colors-custom .widget ul li a, +.colors-custom .site-footer .widget-area ul li a { + -webkit-box-shadow: inset 0 -1px 0 hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: rgba(255, 255, 255, 1); */ + box-shadow: inset 0 -1px 0 hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: rgba(255, 255, 255, 1); */ +} + +.colors-custom .menu-toggle, +.colors-custom .menu-toggle:hover, +.colors-custom .menu-toggle:focus, +.colors-custom .menu .dropdown-toggle, +.colors-custom .menu-scroll-down, +.colors-custom .menu-scroll-down:hover, +.colors-custom .menu-scroll-down:focus { + background-color: transparent; +} + +.colors-custom .widget .tagcloud a, +.colors-custom .widget .tagcloud a:focus, +.colors-custom .widget .tagcloud a:hover, +.colors-custom .widget.widget_tag_cloud a, +.colors-custom .widget.widget_tag_cloud a:focus, +.colors-custom .widget.widget_tag_cloud a:hover, +.colors-custom .wp_widget_tag_cloud a, +.colors-custom .wp_widget_tag_cloud a:focus, +.colors-custom .wp_widget_tag_cloud a:hover, +.colors-custom .entry-footer .edit-link a.post-edit-link:focus, +.colors-custom .entry-footer .edit-link a.post-edit-link:hover { + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +/* Reset non-customizable hover styling for links */ +.colors-custom .entry-content a:hover, +.colors-custom .entry-content a:focus, +.colors-custom .entry-summary a:hover, +.colors-custom .entry-summary a:focus, +.colors-custom .comment-content a:focus, +.colors-custom .comment-content a:hover, +.colors-custom .widget a:hover, +.colors-custom .widget a:focus, +.colors-custom .site-footer .widget-area a:hover, +.colors-custom .site-footer .widget-area a:focus, +.colors-custom .posts-navigation a:hover, +.colors-custom .posts-navigation a:focus, +.colors-custom .widget_authors a:hover strong, +.colors-custom .widget_authors a:focus strong { + -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); + box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); +} + +.colors-custom .gallery-item a, +.colors-custom .gallery-item a:hover, +.colors-custom .gallery-item a:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +@media screen and (min-width: 48em) { + + .colors-custom .nav-links .nav-previous .nav-title .icon, + .colors-custom .nav-links .nav-next .nav-title .icon { + color: hsl( ' . $hue . ', ' . $saturation . ', 20% ); /* base: #222; */ + } + + .colors-custom .main-navigation li li:hover, + .colors-custom .main-navigation li li.focus { + background: hsl( ' . $hue . ', ' . $saturation . ', 46% ); /* base: #767676; */ + } + + .colors-custom .navigation-top .menu-scroll-down { + color: hsl( ' . $hue . ', ' . $saturation . ', 46% ); /* base: #767676; */; + } + + .colors-custom abbr[title] { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 46% ); /* base: #767676; */; + } + + .colors-custom .main-navigation ul ul { + border-color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ + background: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ + } + + .colors-custom .main-navigation ul li.menu-item-has-children:before, + .colors-custom .main-navigation ul li.page_item_has_children:before { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 73% ); /* base: #bbb; */ + } + + .colors-custom .main-navigation ul li.menu-item-has-children:after, + .colors-custom .main-navigation ul li.page_item_has_children:after { + border-bottom-color: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ + } + + .colors-custom .main-navigation li li.focus > a, + .colors-custom .main-navigation li li:focus > a, + .colors-custom .main-navigation li li:hover > a, + .colors-custom .main-navigation li li a:hover, + .colors-custom .main-navigation li li a:focus, + .colors-custom .main-navigation li li.current_page_item a:hover, + .colors-custom .main-navigation li li.current-menu-item a:hover, + .colors-custom .main-navigation li li.current_page_item a:focus, + .colors-custom .main-navigation li li.current-menu-item a:focus { + color: hsl( ' . $hue . ', ' . $saturation . ', 100% ); /* base: #fff; */ + } +}'; + + /** + * Filters Twenty Seventeen custom colors CSS. + * + * @since Twenty Seventeen 1.0 + * + * @param string $css Base theme colors CSS. + * @param int $hue The user's selected color hue. + * @param string $saturation Filtered theme color saturation level. + */ + return apply_filters( 'twentyseventeen_custom_colors_css', $css, $hue, $saturation ); +} diff --git a/content/themes/twentyseventeen/inc/custom-header.php b/content/themes/twentyseventeen/inc/custom-header.php new file mode 100644 index 0000000..cb2d77c --- /dev/null +++ b/content/themes/twentyseventeen/inc/custom-header.php @@ -0,0 +1,131 @@ + get_parent_theme_file_uri( '/assets/images/header.jpg' ), + 'width' => 2000, + 'height' => 1200, + 'flex-height' => true, + 'video' => true, + 'wp-head-callback' => 'twentyseventeen_header_style', + ) + ) + ); + + register_default_headers( + array( + 'default-image' => array( + 'url' => '%s/assets/images/header.jpg', + 'thumbnail_url' => '%s/assets/images/header.jpg', + 'description' => __( 'Default Header Image', 'twentyseventeen' ), + ), + ) + ); +} +add_action( 'after_setup_theme', 'twentyseventeen_custom_header_setup' ); + +if ( ! function_exists( 'twentyseventeen_header_style' ) ) : + /** + * Styles the header image and text displayed on the blog. + * + * @see twentyseventeen_custom_header_setup(). + */ + function twentyseventeen_header_style() { + $header_text_color = get_header_textcolor(); + + // If no custom options for text are set, let's bail. + // get_header_textcolor() options: add_theme_support( 'custom-header' ) is default, hide text (returns 'blank') or any hex value. + if ( get_theme_support( 'custom-header', 'default-text-color' ) === $header_text_color ) { + return; + } + + // If we get this far, we have custom styles. Let's do this. + ?> + + ' . __( 'Play background video', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'play' ) ); + $settings['l10n']['pause'] = '' . __( 'Pause background video', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'pause' ) ); + return $settings; +} +add_filter( 'header_video_settings', 'twentyseventeen_video_controls' ); diff --git a/content/themes/twentyseventeen/inc/customizer.php b/content/themes/twentyseventeen/inc/customizer.php new file mode 100644 index 0000000..9b8243f --- /dev/null +++ b/content/themes/twentyseventeen/inc/customizer.php @@ -0,0 +1,249 @@ +get_setting( 'blogname' )->transport = 'postMessage'; + $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; + $wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage'; + + $wp_customize->selective_refresh->add_partial( + 'blogname', + array( + 'selector' => '.site-title a', + 'render_callback' => 'twentyseventeen_customize_partial_blogname', + ) + ); + $wp_customize->selective_refresh->add_partial( + 'blogdescription', + array( + 'selector' => '.site-description', + 'render_callback' => 'twentyseventeen_customize_partial_blogdescription', + ) + ); + + /** + * Custom colors. + */ + $wp_customize->add_setting( + 'colorscheme', + array( + 'default' => 'light', + 'transport' => 'postMessage', + 'sanitize_callback' => 'twentyseventeen_sanitize_colorscheme', + ) + ); + + $wp_customize->add_setting( + 'colorscheme_hue', + array( + 'default' => 250, + 'transport' => 'postMessage', + 'sanitize_callback' => 'absint', // The hue is stored as a positive integer. + ) + ); + + $wp_customize->add_control( + 'colorscheme', + array( + 'type' => 'radio', + 'label' => __( 'Color Scheme', 'twentyseventeen' ), + 'choices' => array( + 'light' => __( 'Light', 'twentyseventeen' ), + 'dark' => __( 'Dark', 'twentyseventeen' ), + 'custom' => __( 'Custom', 'twentyseventeen' ), + ), + 'section' => 'colors', + 'priority' => 5, + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'colorscheme_hue', + array( + 'mode' => 'hue', + 'section' => 'colors', + 'priority' => 6, + ) + ) + ); + + /** + * Theme options. + */ + $wp_customize->add_section( + 'theme_options', + array( + 'title' => __( 'Theme Options', 'twentyseventeen' ), + 'priority' => 130, // Before Additional CSS. + ) + ); + + $wp_customize->add_setting( + 'page_layout', + array( + 'default' => 'two-column', + 'sanitize_callback' => 'twentyseventeen_sanitize_page_layout', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'page_layout', + array( + 'label' => __( 'Page Layout', 'twentyseventeen' ), + 'section' => 'theme_options', + 'type' => 'radio', + 'description' => __( 'When the two-column layout is assigned, the page title is in one column and content is in the other.', 'twentyseventeen' ), + 'choices' => array( + 'one-column' => __( 'One Column', 'twentyseventeen' ), + 'two-column' => __( 'Two Column', 'twentyseventeen' ), + ), + 'active_callback' => 'twentyseventeen_is_view_with_layout_option', + ) + ); + + /** + * Filter number of front page sections in Twenty Seventeen. + * + * @since Twenty Seventeen 1.0 + * + * @param int $num_sections Number of front page sections. + */ + $num_sections = apply_filters( 'twentyseventeen_front_page_sections', 4 ); + + // Create a setting and control for each of the sections available in the theme. + for ( $i = 1; $i < ( 1 + $num_sections ); $i++ ) { + $wp_customize->add_setting( + 'panel_' . $i, + array( + 'default' => false, + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'panel_' . $i, + array( + /* translators: %d: The front page section number. */ + 'label' => sprintf( __( 'Front Page Section %d Content', 'twentyseventeen' ), $i ), + 'description' => ( 1 !== $i ? '' : __( 'Select pages to feature in each area from the dropdowns. Add an image to a section by setting a featured image in the page editor. Empty sections will not be displayed.', 'twentyseventeen' ) ), + 'section' => 'theme_options', + 'type' => 'dropdown-pages', + 'allow_addition' => true, + 'active_callback' => 'twentyseventeen_is_static_front_page', + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'panel_' . $i, + array( + 'selector' => '#panel' . $i, + 'render_callback' => 'twentyseventeen_front_page_section', + 'container_inclusive' => true, + ) + ); + } +} +add_action( 'customize_register', 'twentyseventeen_customize_register' ); + +/** + * Sanitize the page layout options. + * + * @param string $input Page layout. + */ +function twentyseventeen_sanitize_page_layout( $input ) { + $valid = array( + 'one-column' => __( 'One Column', 'twentyseventeen' ), + 'two-column' => __( 'Two Column', 'twentyseventeen' ), + ); + + if ( array_key_exists( $input, $valid ) ) { + return $input; + } + + return ''; +} + +/** + * Sanitize the colorscheme. + * + * @param string $input Color scheme. + */ +function twentyseventeen_sanitize_colorscheme( $input ) { + $valid = array( 'light', 'dark', 'custom' ); + + if ( in_array( $input, $valid, true ) ) { + return $input; + } + + return 'light'; +} + +/** + * Render the site title for the selective refresh partial. + * + * @since Twenty Seventeen 1.0 + * @see twentyseventeen_customize_register() + * + * @return void + */ +function twentyseventeen_customize_partial_blogname() { + bloginfo( 'name' ); +} + +/** + * Render the site tagline for the selective refresh partial. + * + * @since Twenty Seventeen 1.0 + * @see twentyseventeen_customize_register() + * + * @return void + */ +function twentyseventeen_customize_partial_blogdescription() { + bloginfo( 'description' ); +} + +/** + * Return whether we're previewing the front page and it's a static page. + */ +function twentyseventeen_is_static_front_page() { + return ( is_front_page() && ! is_home() ); +} + +/** + * Return whether we're on a view that supports a one or two column layout. + */ +function twentyseventeen_is_view_with_layout_option() { + // This option is available on all pages. It's also available on archives when there isn't a sidebar. + return ( is_page() || ( is_archive() && ! is_active_sidebar( 'sidebar-1' ) ) ); +} + +/** + * Bind JS handlers to instantly live-preview changes. + */ +function twentyseventeen_customize_preview_js() { + wp_enqueue_script( 'twentyseventeen-customize-preview', get_theme_file_uri( '/assets/js/customize-preview.js' ), array( 'customize-preview' ), '20161002', true ); +} +add_action( 'customize_preview_init', 'twentyseventeen_customize_preview_js' ); + +/** + * Load dynamic logic for the customizer controls area. + */ +function twentyseventeen_panels_js() { + wp_enqueue_script( 'twentyseventeen-customize-controls', get_theme_file_uri( '/assets/js/customize-controls.js' ), array(), '20161020', true ); +} +add_action( 'customize_controls_enqueue_scripts', 'twentyseventeen_panels_js' ); diff --git a/content/themes/twentyseventeen/inc/icon-functions.php b/content/themes/twentyseventeen/inc/icon-functions.php new file mode 100644 index 0000000..11a1b0b --- /dev/null +++ b/content/themes/twentyseventeen/inc/icon-functions.php @@ -0,0 +1,220 @@ + '', + 'title' => '', + 'desc' => '', + 'fallback' => false, + ); + + // Parse args. + $args = wp_parse_args( $args, $defaults ); + + // Set aria hidden. + $aria_hidden = ' aria-hidden="true"'; + + // Set ARIA. + $aria_labelledby = ''; + + /* + * Twenty Seventeen doesn't use the SVG title or description attributes; non-decorative icons are described with .screen-reader-text. + * + * However, child themes can use the title and description to add information to non-decorative SVG icons to improve accessibility. + * + * Example 1 with title: 'arrow-right', 'title' => __( 'This is the title', 'textdomain' ) ) ); ?> + * + * Example 2 with title and description: 'arrow-right', 'title' => __( 'This is the title', 'textdomain' ), 'desc' => __( 'This is the description', 'textdomain' ) ) ); ?> + * + * See https://www.paciellogroup.com/blog/2013/12/using-aria-enhance-svg-accessibility/. + */ + if ( $args['title'] ) { + $aria_hidden = ''; + $unique_id = twentyseventeen_unique_id(); + $aria_labelledby = ' aria-labelledby="title-' . $unique_id . '"'; + + if ( $args['desc'] ) { + $aria_labelledby = ' aria-labelledby="title-' . $unique_id . ' desc-' . $unique_id . '"'; + } + } + + // Begin SVG markup. + $svg = ''; + + // Display the title. + if ( $args['title'] ) { + $svg .= '' . esc_html( $args['title'] ) . ''; + + // Display the desc only if the title is already set. + if ( $args['desc'] ) { + $svg .= '' . esc_html( $args['desc'] ) . ''; + } + } + + /* + * Display the icon. + * + * The whitespace around `` is intentional - it is a work around to a keyboard navigation bug in Safari 10. + * + * See https://core.trac.wordpress.org/ticket/38387. + */ + $svg .= ' '; + + // Add some markup to use as a fallback for browsers that do not support SVGs. + if ( $args['fallback'] ) { + $svg .= ''; + } + + $svg .= ''; + + return $svg; +} + +/** + * Display SVG icons in social links menu. + * + * @param string $item_output The menu item output. + * @param WP_Post $item Menu item object. + * @param int $depth Depth of the menu. + * @param array $args wp_nav_menu() arguments. + * @return string $item_output The menu item output with social icon. + */ +function twentyseventeen_nav_menu_social_icons( $item_output, $item, $depth, $args ) { + // Get supported social icons. + $social_icons = twentyseventeen_social_links_icons(); + + // Change SVG icon inside social links menu if there is supported URL. + if ( 'social' === $args->theme_location ) { + foreach ( $social_icons as $attr => $value ) { + if ( false !== strpos( $item_output, $attr ) ) { + $item_output = str_replace( $args->link_after, '' . twentyseventeen_get_svg( array( 'icon' => esc_attr( $value ) ) ), $item_output ); + } + } + } + + return $item_output; +} +add_filter( 'walker_nav_menu_start_el', 'twentyseventeen_nav_menu_social_icons', 10, 4 ); + +/** + * Add dropdown icon if menu item has children. + * + * @param string $title The menu item's title. + * @param WP_Post $item The current menu item. + * @param array $args An array of wp_nav_menu() arguments. + * @param int $depth Depth of menu item. Used for padding. + * @return string $title The menu item's title with dropdown icon. + */ +function twentyseventeen_dropdown_icon_to_menu_link( $title, $item, $args, $depth ) { + if ( 'top' === $args->theme_location ) { + foreach ( $item->classes as $value ) { + if ( 'menu-item-has-children' === $value || 'page_item_has_children' === $value ) { + $title = $title . twentyseventeen_get_svg( array( 'icon' => 'angle-down' ) ); + } + } + } + + return $title; +} +add_filter( 'nav_menu_item_title', 'twentyseventeen_dropdown_icon_to_menu_link', 10, 4 ); + +/** + * Returns an array of supported social links (URL and icon name). + * + * @return array $social_links_icons + */ +function twentyseventeen_social_links_icons() { + // Supported social links icons. + $social_links_icons = array( + 'behance.net' => 'behance', + 'codepen.io' => 'codepen', + 'deviantart.com' => 'deviantart', + 'digg.com' => 'digg', + 'docker.com' => 'dockerhub', + 'dribbble.com' => 'dribbble', + 'dropbox.com' => 'dropbox', + 'facebook.com' => 'facebook', + 'flickr.com' => 'flickr', + 'foursquare.com' => 'foursquare', + 'plus.google.com' => 'google-plus', + 'github.com' => 'github', + 'instagram.com' => 'instagram', + 'linkedin.com' => 'linkedin', + 'mailto:' => 'envelope-o', + 'medium.com' => 'medium', + 'pinterest.com' => 'pinterest-p', + 'pscp.tv' => 'periscope', + 'getpocket.com' => 'get-pocket', + 'reddit.com' => 'reddit-alien', + 'skype.com' => 'skype', + 'skype:' => 'skype', + 'slideshare.net' => 'slideshare', + 'snapchat.com' => 'snapchat-ghost', + 'soundcloud.com' => 'soundcloud', + 'spotify.com' => 'spotify', + 'stumbleupon.com' => 'stumbleupon', + 'tumblr.com' => 'tumblr', + 'twitch.tv' => 'twitch', + 'twitter.com' => 'twitter', + 'vimeo.com' => 'vimeo', + 'vine.co' => 'vine', + 'vk.com' => 'vk', + 'wordpress.org' => 'wordpress', + 'wordpress.com' => 'wordpress', + 'yelp.com' => 'yelp', + 'youtube.com' => 'youtube', + ); + + /** + * Filter Twenty Seventeen social links icons. + * + * @since Twenty Seventeen 1.0 + * + * @param array $social_links_icons Array of social links icons. + */ + return apply_filters( 'twentyseventeen_social_links_icons', $social_links_icons ); +} diff --git a/content/themes/twentyseventeen/inc/template-functions.php b/content/themes/twentyseventeen/inc/template-functions.php new file mode 100644 index 0000000..55f4c9a --- /dev/null +++ b/content/themes/twentyseventeen/inc/template-functions.php @@ -0,0 +1,102 @@ +' . get_the_author() . '' + ); + + // Finally, let's write all of this to the page. + echo '' . twentyseventeen_time_link() . ''; + } +endif; + + +if ( ! function_exists( 'twentyseventeen_time_link' ) ) : + /** + * Gets a nicely formatted string for the published date. + */ + function twentyseventeen_time_link() { + $time_string = ''; + if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) { + $time_string = ''; + } + + $time_string = sprintf( + $time_string, + get_the_date( DATE_W3C ), + get_the_date(), + get_the_modified_date( DATE_W3C ), + get_the_modified_date() + ); + + // Wrap the time string in a link, and preface it with 'Posted on'. + return sprintf( + /* translators: %s: Post date. */ + __( 'Posted on %s', 'twentyseventeen' ), + '' . $time_string . '' + ); + } +endif; + + +if ( ! function_exists( 'twentyseventeen_entry_footer' ) ) : + /** + * Prints HTML with meta information for the categories, tags and comments. + */ + function twentyseventeen_entry_footer() { + + /* translators: Used between list items, there is a space after the comma. */ + $separate_meta = __( ', ', 'twentyseventeen' ); + + // Get Categories for posts. + $categories_list = get_the_category_list( $separate_meta ); + + // Get Tags for posts. + $tags_list = get_the_tag_list( '', $separate_meta ); + + // We don't want to output .entry-footer if it will be empty, so make sure its not. + if ( ( ( twentyseventeen_categorized_blog() && $categories_list ) || $tags_list ) || get_edit_post_link() ) { + + echo '
'; + + if ( 'post' === get_post_type() ) { + if ( ( $categories_list && twentyseventeen_categorized_blog() ) || $tags_list ) { + echo ''; + + // Make sure there's more than one category before displaying. + if ( $categories_list && twentyseventeen_categorized_blog() ) { + echo '' . twentyseventeen_get_svg( array( 'icon' => 'folder-open' ) ) . '' . __( 'Categories', 'twentyseventeen' ) . '' . $categories_list . ''; + } + + if ( $tags_list && ! is_wp_error( $tags_list ) ) { + echo '' . twentyseventeen_get_svg( array( 'icon' => 'hashtag' ) ) . '' . __( 'Tags', 'twentyseventeen' ) . '' . $tags_list . ''; + } + + echo ''; + } + } + + twentyseventeen_edit_link(); + + echo '
'; + } + } +endif; + + +if ( ! function_exists( 'twentyseventeen_edit_link' ) ) : + /** + * Returns an accessibility-friendly link to edit a post or page. + * + * This also gives us a little context about what exactly we're editing + * (post or page?) so that users understand a bit more where they are in terms + * of the template hierarchy and their content. Helpful when/if the single-page + * layout with multiple posts/pages shown gets confusing. + */ + function twentyseventeen_edit_link() { + edit_post_link( + sprintf( + /* translators: %s: Post title. */ + __( 'Edit "%s"', 'twentyseventeen' ), + get_the_title() + ), + '', + '' + ); + } +endif; + +/** + * Display a front page section. + * + * @param WP_Customize_Partial $partial Partial associated with a selective refresh request. + * @param integer $id Front page section to display. + */ +function twentyseventeen_front_page_section( $partial = null, $id = 0 ) { + if ( is_a( $partial, 'WP_Customize_Partial' ) ) { + // Find out the id and set it up during a selective refresh. + global $twentyseventeencounter; + + $id = str_replace( 'panel_', '', $partial->id ); + + $twentyseventeencounter = $id; + } + + global $post; // Modify the global post object before setting up post data. + if ( get_theme_mod( 'panel_' . $id ) ) { + $post = get_post( get_theme_mod( 'panel_' . $id ) ); + setup_postdata( $post ); + set_query_var( 'panel', $id ); + + get_template_part( 'template-parts/page/content', 'front-page-panels' ); + + wp_reset_postdata(); + } elseif ( is_customize_preview() ) { + // The output placeholder anchor. + printf( + '
' . + '%2$s
', + $id, + /* translators: %s: The section ID. */ + sprintf( __( 'Front Page Section %s Placeholder', 'twentyseventeen' ), $id ) + ); + } +} + +/** + * Returns true if a blog has more than 1 category. + * + * @return bool + */ +function twentyseventeen_categorized_blog() { + $category_count = get_transient( 'twentyseventeen_categories' ); + + if ( false === $category_count ) { + // Create an array of all the categories that are attached to posts. + $categories = get_categories( + array( + 'fields' => 'ids', + 'hide_empty' => 1, + // We only need to know if there is more than one category. + 'number' => 2, + ) + ); + + // Count the number of categories that are attached to the posts. + $category_count = count( $categories ); + + set_transient( 'twentyseventeen_categories', $category_count ); + } + + // Allow viewing case of 0 or 1 categories in post preview. + if ( is_preview() ) { + return true; + } + + return $category_count > 1; +} + + +/** + * Flush out the transients used in twentyseventeen_categorized_blog. + */ +function twentyseventeen_category_transient_flusher() { + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { + return; + } + // Like, beat it. Dig? + delete_transient( 'twentyseventeen_categories' ); +} +add_action( 'edit_category', 'twentyseventeen_category_transient_flusher' ); +add_action( 'save_post', 'twentyseventeen_category_transient_flusher' ); + +if ( ! function_exists( 'wp_body_open' ) ) : + /** + * Fire the wp_body_open action. + * + * Added for backward compatibility to support pre-5.2.0 WordPress versions. + * + * @since Twenty Seventeen 2.2 + */ + function wp_body_open() { + /** + * Triggered after the opening tag. + * + * @since Twenty Seventeen 2.2 + */ + do_action( 'wp_body_open' ); + } +endif; diff --git a/content/themes/twentyseventeen/index.php b/content/themes/twentyseventeen/index.php new file mode 100644 index 0000000..5df8f02 --- /dev/null +++ b/content/themes/twentyseventeen/index.php @@ -0,0 +1,72 @@ + + +
+ + + + + + +
+
+ + twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '' . __( 'Previous page', 'twentyseventeen' ) . '', + 'next_text' => '' . __( 'Next page', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ), + 'before_page_number' => '' . __( 'Page', 'twentyseventeen' ) . ' ', + ) + ); + + else : + + get_template_part( 'template-parts/post/content', 'none' ); + + endif; + ?> + +
+
+ +
+ + + +
+
+
+ + + +
+
+
+ + Themes and click the 'Add New' button. +2. Type in Twenty Seventeen in the search form and press the 'Enter' key on your keyboard. +3. Click on the 'Activate' button to use your new theme right away. +4. Go to https://wordpress.org/support/article/twenty-seventeen/ for a guide on how to customize this theme. +5. Navigate to Appearance > Customize in your admin panel and customize to taste. + +== Copyright == + +Twenty Seventeen WordPress Theme, Copyright 2016-2020 WordPress.org +Twenty Seventeen 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. + +Twenty Seventeen bundles the following third-party resources: + +HTML5 Shiv, Copyright 2014 Alexander Farkas +Licenses: MIT/GPL2 +Source: https://github.com/aFarkas/html5shiv + +jQuery scrollTo, Copyright 2007-2015 Ariel Flesler +License: MIT +Source: https://github.com/flesler/jquery.scrollTo + +normalize.css, Copyright 2012-2016 Nicolas Gallagher and Jonathan Neal +License: MIT +Source: https://necolas.github.io/normalize.css/ + +Font Awesome icons, Copyright Dave Gandy +License: SIL Open Font License, version 1.1. +Source: http://fontawesome.io/ + +Bundled header image, Copyright Alvin Engler +License: CC0 1.0 Universal (CC0 1.0) +Source: https://unsplash.com/@englr?photo=bIhpiQA009k + +== Changelog == + += 2.3 = +* Released: March 31, 2020 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_2.3 + += 2.2 = +* Released: May 7, 2019 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_2.2 + += 2.1 = +* Released: February 21, 2019 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_2.1 + += 2.0 = +* Released: January 9, 2019 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_2.0 + += 1.9 = +* Released: December 19, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.9 + += 1.8 = +* Released: December 6, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.8 + += 1.7 = +* Released: August 2, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.7 + += 1.6 = +* Released: May 17, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.6 + += 1.5 = +* Released: April 4, 2018 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.5 + += 1.4 = +* Released: November 14, 2017 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.4 + += 1.3 = +* Released: June 8, 2017 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.3 + += 1.2 = +* Released: April 18, 2017 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.2 + += 1.1 = +* Released: January 6, 2017 + +https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.1 + += 1.0 = +* Released: December 6, 2016 + +Initial release diff --git a/content/themes/twentyseventeen/rtl.css b/content/themes/twentyseventeen/rtl.css new file mode 100644 index 0000000..1c5e4c7 --- /dev/null +++ b/content/themes/twentyseventeen/rtl.css @@ -0,0 +1,556 @@ +/* +Theme Name: Twenty Seventeen + +Adding support for languages written in a Right To Left (RTL) direction is easy, +it's just a matter of overwriting all the horizontal positioning attributes +of your CSS stylesheet in a separate stylesheet file named rtl.css. + +https://codex.wordpress.org/Right-to-Left_Language_Support + +*/ + +/* Reset */ + +body { + direction: rtl; + unicode-bidi: embed; +} + +th { + text-align: right; +} + +/* Accessibility */ + +.screen-reader-text:focus { + left: auto; + right: 5px; +} + +/* Typography */ + +textarea { + padding-right: 3px; +} + +li > ul, +li > ol { + margin-left: 0; + margin-right: 1.5em; +} + +th:first-child, +td:first-child { + padding-left: 0.4em; + padding-right: 0; +} + +th:last-child, +td:last-child { + padding-left: 0; + padding-right: 0.4em; +} + +/* Forms */ + +input[type="radio"], +input[type="checkbox"] { + margin-left: 0.5em; + margin-right: 0; +} + +/* Media */ + +.mejs-offscreen { + right: -10000px; +} + +/* Site Branding */ + +.custom-logo-link { + padding-left: 1em; + padding-right: 0; +} + +/* Main Navigation */ + +.main-navigation ul { + text-align: right; +} + +.main-navigation ul ul { + padding-left: 0; + padding-right: 1.5em; +} + +.menu-toggle .icon { + margin-left: 0.5em; + margin-right: 0; +} + +.dropdown-toggle { + left: -0.5em; + right: auto; +} + +/* Front Page */ + +.wp-custom-header-video-button { + left: 30px; + right: auto; +} + +.twentyseventeen-panel .recent-posts .entry-header .edit-link { + margin-left: 0; + margin-right: 1em; +} + +/* Blog, Archive, Search */ + +.blog .entry-meta a.post-edit-link, +.archive .entry-meta a.post-edit-link, +.search .entry-meta a.post-edit-link { + margin-left: 0; + margin-right: 1em; +} + +.search .page .entry-meta a.post-edit-link { + margin-right: 0; +} + +.sticky .icon-thumb-tack { + left: auto; + right: -1.5em; +} + +.prev.page-numbers .icon, +.next.page-numbers .icon { + display: inline-block; + -ms-transform: rotate(180deg); /* IE 9 */ + -webkit-transform: rotate(180deg); /* Chrome, Safari, Opera */ + transform: rotate(180deg); +} + +.prev.page-numbers { + float: right; +} + +.next.page-numbers { + float: left; +} + +.nav-links .nav-previous .nav-title .nav-title-icon-wrapper { + margin-left: 0.5em; + margin-right: 0; +} + +.nav-links .nav-next .nav-title .nav-title-icon-wrapper { + margin-left: 0; + margin-right: 0.5em; +} + +/* Blog Entries */ + +.entry-footer .cat-links, +.entry-footer .tags-links { + padding-left: 0; + padding-right: 2.5em; +} + +.entry-footer .cat-links .icon, +.entry-footer .tags-links .icon { + left: auto; + margin-left: 0.5em; + margin-right: 0; + right: 0; +} + +/* Comments */ + +.comment-body { + margin-left: 0; + margin-right: 65px; +} + +.comment-reply-link .icon { + left: auto; + right: -2em; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +.comment-author .avatar { + left: auto; + right: -65px; +} + +.comment-reply-link:before { + left: auto; + right: -2em; +} + +.children .comment-author .avatar { + left: auto; + right: -45px; +} + +.form-submit { + text-align: left; +} + +.comment-form #wp-comment-cookies-consent { + margin: 0 0 0 10px; +} + +/* Post Formats */ + +.format-quote blockquote .icon { + left: auto; + right: -1.25em; + -webkit-transform: none; + -ms-transform: none; + transform: none; +} + +/* Post Navigation */ + +.nav-links .nav-previous .nav-title .nav-title-icon-wrapper, +.nav-links .nav-next .nav-title .nav-title-icon-wrapper { + display: inline-block; + -ms-transform: rotate(180deg); /* IE 9 */ + -webkit-transform: rotate(180deg); /* Chrome, Safari, Opera */ + transform: rotate(180deg); +} + +/* Widgets */ + +.widget ul { + margin: 0; +} + +.search-form .search-submit { + left: 3px; + right: auto; +} + +.tagcloud ul li { + float: right; + margin: 4px 0 0 4px; +} + +.widget ul li li { + padding-left: 0; + padding-right: 1.5rem; +} + +.widget_text ul { + margin: 0 1.5em 1.5em 0; +} + +.widget_text ul li ul { + margin: 0 1.5em 0 0; +} + +/* Footer */ + +.social-navigation a { + margin-left: 1em; + margin-right: 0; +} + +/* Customizer styles */ + +.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel .twentyseventeen-panel-title { + left: 3.2em; + right: auto; +} + +/* Gallery Styles */ + +.gallery-item, +.gallery-caption { + text-align: right; +} + +/* SVG Fallback */ + +.no-svg .dropdown-toggle { + left: 0; + right: auto; +} + +/* Media queries */ + +@media screen and (min-width: 48em) { + + body.page-template-full-width-page #primary { + float: none; + } + + .has-sidebar:not(.error404) #primary { + float: right; + } + + .has-sidebar #secondary { + float: left; + } + + .error404 #primary { + float: none; + } + + /* Site Branding */ + + .custom-logo-link { + padding-left: 2em; + padding-right: 0; + } + + /* Navigation */ + + .main-navigation ul ul { + padding-right: 0; + } + + .main-navigation ul ul:before, + .main-navigation ul ul:after { + left: 0.5em; + right: auto; + } + + .main-navigation ul ul, + .main-navigation ul ul ul { + left: auto; + right: -999em; + } + + .main-navigation ul ul li:hover > ul, + .main-navigation ul ul li.focus > ul { + left: auto; + right: 100%; + } + + .main-navigation ul li:hover > ul, + .main-navigation ul li.focus > ul { + left: auto; + right: 0.5em; + } + + .main-navigation ul li.menu-item-has-children:before, + .main-navigation ul li.menu-item-has-children:after, + .main-navigation ul li.page_item_has_children:before, + .main-navigation ul li.page_item_has_children:after { + left: 1em; + right: auto; + } + + .main-navigation .menu-item-has-children > a > .icon, + .main-navigation .page_item_has_children > a > .icon { + left: auto; + right: 5px; + } + + .main-navigation ul ul .menu-item-has-children > a > .icon, + .main-navigation ul ul .page_item_has_children > a > .icon { + left: 1em; + right: auto; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + } + + /* Scroll down arrow */ + + .navigation-top .menu-scroll-down { + left: 0; + right: auto; + } + + .site-header .menu-scroll-down { + left: 0; + right: auto; + } + + .entry-title a { + margin-left: auto; + margin-right: -2px; + } + + /* Front Page */ + + .page-two-column .panel-content .entry-header { + float: right; + } + + .page-two-column .panel-content .entry-content { + float: left; + } + + /* Front Page - Recent Posts */ + + .page-two-column .panel-content .recent-posts { + clear: left; + float: left; + } + + /* Blog, Archive, Search */ + + .sticky .icon-thumb-tack { + left: auto; + right: -2.5em; + } + + body:not(.has-sidebar):not(.page-one-column) .page-header, + body.has-sidebar.error404 #primary .page-header, + body.page-two-column:not(.archive) #primary .entry-header, + body.page-two-column.archive:not(.has-sidebar) #primary .page-header { + float: right; + } + + .blog:not(.has-sidebar) #primary article, + .archive:not(.has-sidebar):not(.page-one-column) #primary article, + .search:not(.has-sidebar) #primary article, + .has-sidebar.error404 #primary .page-content, + .error404.has-sidebar #primary .page-content, + body.page-two-column:not(.archive) #primary .entry-content, + body.page-two-column #comments { + float: left; + } + + .entry-footer .edit-link a.post-edit-link { + margin-left: 0; + margin-right: 1em; + } + + /* Entry content */ + + /* with sidebar */ + + .has-sidebar .entry-content blockquote.alignleft { + margin-left: 0; + width: 34%; + } + + .has-sidebar #primary .entry-content blockquote.alignright, + .has-sidebar #primary .entry-content blockquote.alignright.below-entry-meta { + margin-right: 0; + width: 34%; + } + + .has-sidebar #primary .entry-content blockquote.alignleft.below-entry-meta { + margin-left: -72.5%; + width: 62%; + } + + /* blog index and archive */ + + .blog:not(.has-sidebar) .entry-content blockquote.alignleft, + .twentyseventeen-front-page.page-two-column .entry-content blockquote.alignleft, + .archive:not(.has-sidebar) .entry-content blockquote.alignleft, + .page-two-column .entry-content blockquote.alignleft { + margin-left: 0; + width: 34%; + } + + .blog:not(.has-sidebar) .entry-content blockquote.alignright, + .twentyseventeen-front-page.page-two-column #primary .entry-content blockquote.alignright, + .archive:not(.has-sidebar) .entry-content blockquote.alignright, + .page-two-column #primary .entry-content blockquote.alignright { + margin-right: -72.5%; + width: 62%; + } + + /* Post formats */ + + .format-quote blockquote .icon { + left: auto; + right: -1.5em; + } + + .navigation.pagination { + float: left; + } + + .has-sidebar .navigation.pagination, + .archive.page-one-column:not(.has-sidebar) .navigation.pagination { + float: none; + } + + .post-navigation .nav-previous { + float: right; + } + + .post-navigation .nav-next { + float: left; + text-align: left; + } + + /* Comments */ + + ol.children .children { + padding-left: 0; + padding-right: 2em; + } + + /* Post Navigation */ + + .nav-links .nav-previous .nav-title .nav-title-icon-wrapper { + left: auto; + right: -2em; + } + + .nav-links .nav-next .nav-title .nav-title-icon-wrapper { + left: -2em; + right: auto; + } + + /* Footer */ + + .site-footer .widget-column.footer-widget-1 { + float: right; + } + + .site-footer .widget-column.footer-widget-2 { + float: left; + } + + .social-navigation { + clear: right; + float: right; + } + + .site-info { + float: right; + } + + .social-navigation + .site-info { + margin-left: 0; + margin-right: 6%; + } +} + +@media screen and (min-width: 67em) { + + /* Sticky posts */ + + .sticky .icon-thumb-tack { + left: auto; + right: -1.25em; + } +} + +@media screen and (min-width: 79em) { + + .has-sidebar #primary .entry-content blockquote.alignright, + .has-sidebar #primary .entry-content blockquote.alignright.below-entry-meta { + margin-right: -20%; + } + + .blog:not(.has-sidebar) .entry-content blockquote.alignleft, + .archive:not(.has-sidebar) .entry-content blockquote.alignleft, + .page-two-column .entry-content blockquote.alignleft, + .twentyseventeen-front-page .entry-content blockquote.alignleft { + margin-left: -20%; + } +} diff --git a/content/themes/twentyseventeen/screenshot.png b/content/themes/twentyseventeen/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..088b7413e7a88c9d135af933a4d715dae5690441 GIT binary patch literal 363833 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ℜSOqek#rPm3|PF~Gp2$N%TtROv1RK!|bPn4(rUM zZMX*5X0*CvztbHR_1QQ| zNV7_4_5R}chaUh~z^m26=PS<*!ve*6$9VO~6opE$HZ~5;2Iw`78|B5RY{HT;Le<>w z+M#C)SvFh2>E!v>Bi7`K67OeE&+rNw7BQ@m`AccPSO1Fd=B$K|5M0GzSR>_Eaw@;- z=#|qqT;Ny&SD7_yG04Hdk@qP{tCU%-RAZMiuxgSa#x(ur;V`EEC7tf1OOu=#SB;?`cU`9ds(1 zlET9}u0vEu22K2rM2f1IMOCJhihGD%rK#f_3qZ3^=oL;^!hM|Yc=}WC!RW6 zkillxK25pQ%$VEro2U){qIc?#H!)o2HcP@t^-^q}%e3>w@$nDDuYg#>uuu~A6tUjX z*?eR)EJiCF>}uFB3~Lp5^`B4v({*8S4pwSR4OYWC%lOV?<5u?^{JCC!Ux?}R^TUK= z1|Y~-Bf4@e@BM4}7T1rZGefal%{@b`&UH=0tCgWC3$Mh!mof?6YU&24N;&t!ST!pN zV$PsS5DCaMvOci7xivCtGh9WBwRoz_+J$n+=~JC+4wuRp&@ zaCO;S88*6q>~F&C?x$jO4VRbS6tW)LCCJ_P zYkTdrwS@huK&;(A4^zK78jYA?;jC6<6%6w;&noO{7j-C>?8V9448E7G?()qx`at^! z%Ct;-&w^IqWo`!Xi?W-A_o~|2=a~PR0j**JD?a4+M-dAQi|CbHitbS^?pefQxPtFP z7#3Faq9Gnba_7wC$>a?~77)v9tFSj*=cpCnAzY~|3xGAC@{-TZ{w5cM0I7~JEb*7} zc#e~*tbq0YdhPvh9<%EJY<7)jYZ2p~%&sylRkPr3IL}yGUJEl82r3%qcNT`R?Nj*! z7dxW3qeHl^6zlog^WO6nbO{BqngFd8qqo!5TUN4I!}?mrpD$J=&s`NP!mBOJn@id*#zvKk{iX>>)E z_resS6Kqx$FrX4Q6-z|6#!$1y?H~WkfBBF9?U%f}st{GWbug@MRo0++QL(VwUT(Gq zaQIXTH+K`y!w*HIYgn(3M)gjW<4Z9|n7j#bJ58SNuE`W(r4+XI+o?a<#NczPK{C~P zS2tFn^z^ftY=y2sBg^tgB}__Hclssqvg|8QQ~5-ct1{clRI8G1^>PqPKSKWiwjzx2 zOVh71QuP(I`1e8~tE5$-UR=alK3U$&%0rAmqj|{L3 zTrFkgA=ieI0bggx>JMNcwe{i)fhn6%YIFX)>C|ztf0`i8u4i69LBVEuUxf1oVC(ux z!gj})uNEuKMT>nF&n!UZe65UO0k75xu#S~sJr{<>B_We6?imVX(eYLS{LC;RRIncm z#kz;I(fg8w#ij;n5{?%b);MqMbQ#vrq-{Z($b4K8*=s*7*?jci?7`qXJIm6S3oOS?i`4{ zEXWl1@z|{f$AJwRwNkrTnWKN>Ku0kub~dVxaz}%>?ZV$3k4i&zXN3l{%4Mnp3AW0d z*ubua5dBchbi{-%!2l7Y#H|hpu?Vw*PeGQMfHn>Xw?I_$mT;^-XUe>ApsK43%ZZ}t z*phHvm8|vurBd+Ipf$VBfwcfR!mvL5r5ShbeB!6zWUf0Iiq7--5*fjRPn7$EKj2tr zhIRZLhgO6um}0RFODaO5SkIJUX;g#EbUcT zS148~Ulqm+Q4U$@my@gk#*z*f;lvsq4fb13?T?QvK; zI2ud3ag?-&ZxSj#>s7DSY_^I65mGvVH);&}m>P_<9he5At`;nvszD{kB+AV{V`5;x zsBb!hd|x)CdY-jr=tAerFI)9&`jt&*@Pb^o5Sn{X%B(Fh#HO>e{%8TO=!8gEvNWqm zXkD@%ctxxe!YsMqL>4p?tT7X;(TEsU75P}fB&AajYZAQSbAe(F#8aA2#o~3Uf>>;l z7@_I738d<%#>Go>*wwI8`IKJW}wR1N4nVW2)nf(i~h6&=})@7{7RH-vsF`e@6+^Z5F z%zgy<2&%>rSB@i#TpqSZ@b1%cl2&auQA{1+|Mv5_V14WM~$k3MbGiiex`MF}4O;r~QdgEP^Zm7Gu>Lds@iq4xFh% z9^s^$n;mmoyr=yE5|_Cz_+p7K;=@|%*yiApSq$bG)LH+8$?6J{y`Qds8lYy^nzd}Y z*17{iS8>aDM(?OE>zc1Im*yZpaA#_n*pn+Bii;ViA`8J<|6#iR9yQ_fJYJ*V0CO!XfAH!&^2aVL$Ml6vGRqX z!=|o7D=7q7Coj2R)j%~j04hji;F}{X*N!v$Vl?H@VofFB(elEj4Dlrx7$#*DK<6(_ke+NHSW~K{)6_#Rmh6 z4W19ZvSg)puF6~3sAg7gq*{=n*40M&nlE&v!88lDiqwtx20o(+<%^|Yymgbwu-h<> zYi=3>xic);^PF>jzxVe_PP%6Il`P4BBs-4v=sC}M&U2EJn&1`J5=5}Dp_v%gG{Xdo z0SiST0hOZFlNiOa46Ck1U{n%9nm3SDmq27SYq2~pbzs}vz`Eg|X+uRkk#|Dig&5!;+E^khNzK3m0Y* z`u>aiFN9&OM8kxuTNmfAI1lUZrAtUhKA)e64NJIFZkA!$6%>#~qPar5>DgVkI-_1? zu8A9^zr27&_kgW{>IP(&7Pun88sue zQIA!tcB-04>?JmGM4_@l=TT>rZL#9c3otS@-Wuk2=w>bht4pjiXgA_`c1%!}c26Sx z)rjTU)}RhI+Z8#Uk*xS{BHkg)S#DJ^N|qk@b@T$lt5b_tfGaw+1++B8(fq$k)GWI~ zI7)v~O&X>(k&SA^I<4)6 zS;GRuIurq`Ts|g>MR>JJe|dZ2#IlgJv?SpT3Rg_9A{W-m1ro9F-3-H$QNn|XiE8l1 zX2{g_j+!w)8!|K73>?P?a-8I3yMDrPD)i`u4Ip$%w-~ZcxpO$ekfGJCdV*9^53&S= zKh2gc2kn*1xMEIH7p$_g1_xQPGoL;)f9Q~)v;>WGB@F;}SqNCk_bO-&c>3w*2UM!` zh^v?482?> zH$FH}M5MbTQ>9qUu%1K&>&ZM`_2YOIy~iQ((D1o6qFTEZ+a0`WTMY|fr8f5Sc?_b@Hdv9j zNi*eGY4;AX>MU0NU5{3c_;k+f!!+gxsK5L3a#=%tSX>fvL0CRME|-~Mp(Iq2WeFBs z4zmo)Dp)JXSQZhBBi&DUNqzp#M4avp!;0`K;#gy6&GR&>`ld0BT^19%MWMA|skTlp zm8UF6z}+A-tzcNvI^^WQ(^GCDj#!;PW%)`=!h$1U#WBn27djN{+G(9x0sftk6~x`4 zMJ)&Wg>2SB)~o}JzTL*wa&DB#+|KoNF&X2NqFS^-12?_WgCusPmJ*4Op7EnmR24GG z8i!9h@H6&-SAm!83~txkS+kM{Bx|#DQmmyDH-7p48xDX^c-dmQ)XWsR#TxyuhCa3% zR@%_HI_sS(rU*OZI=xdW(Yq(%L4J^tH5gc555PL9=JVCTZLu$y^=p!dGq$UpCH)xF z%|^8H)XGrtyeK&)zADxAVU69D&unu?*k}a|EXA*pM#BpDH7-zkC5Uy@g`2$FZXJPl z#)lpFe@Q2#*&pbn>4RKxgOL8#@ES;Ub_HdF*ha(Yz#vvdZ&=8h@sR2}aETV|yRwR> zUpKyXg(&;3yC@m~egLX6V}nx>@@;u*{4fU9FhEf@DAb5RsqqeAae>N_+e!4D<|h-e zVM&`X$MG^seati=07s?>r<$~fjlZ1IFk@@DJ)Sc+jAva~tVT$y5Re7&eZ(`-_^yGJ zil`U?VjyB82u4y8x~$3}R}NaWt{u|J&Ui?T^e*!I9ApIstmbE$i}+#mI~2^7AXh=O zES&ON%Lkb|fB#npIRj8q4l2beSh7_p28qpeKk*ufMHm z)18h#>{Jg1cK3X-h_zoyPuH#4pgt}1Sfo^Em5UUt0{#++V2Lf0FY5A#kQEM^C0aYeUlRZ6dS;27fR=3NTP##J(PFbBGfmD zrS{-2IB!^lGC)#xY0&vw7*zSp!L#x^+0^w!tnqGk)_5yX`|;aR>s-F{{2U_It3$yn zP^?2732>}LM6s5ZL~|EggC$s65@K(T?GhTNyNQ>XGmiEGTMyzg~Q?FC&>CESi%H!j{qw*RuLSwtIdSRLvzWb$L&Od zA}_#5V5jTfO0FotDI-fIWWmHZiWTK4LCunpHX+uF<*q9TIUgB%yx~_cwlKjeYDI{( z@`O}fSxvgwmG}eQM1%jD0=^U`KU)|`oFM&;))-BhU_lHcewOWzbJN~5!-y3QqBh|S z!xFGE7E-~hkswxI3dEj)thOC7jAE3#s>9o6p)f2BYbak^5XN}d9Hcbn{0-%qM{2xF z=f9vKr29^FKixlY+7E~2|jsH~@-aqP&L#yjOa4A+`{R_s%kTP~FV-M{Y z1)&PA#&1;=MkRd5L1Wlh`)~jI|8*LS3Px+Upyu4Ea72K$lX(3G*3e3eNEA`HfC&Qq z{w3a_^XTh83?CD^AhIFh_X#h-uy~OnpdnpKRQI4 z4Td2qOKeX)$yYleVNR~MGq)nJ>MokhPYuR9YS**CTc+=^ zd027g>#Oo;B${X;+lPiV){;e_CdS`;Afywu&9<(+rBe}2W>@yqPH$FYtfN%6>et(oxh7~4*N+sjNvHZ1hJsFx7y6H3@n&o7l|N7^AOINo|_S=^`Yd&gI^KB!k4!D*mu~= zsqFs5?GhTqvc?9-Kw2?rrA|hvYVMkT6t8r}+_-8A~^XsteJ4sKT0le5_mC+^KT3tO{yy`%Va;K%ElAtF~W zg15Zh5{9LlSMAzztHacSw?y{jH@jSt9%W&Qv50F2O0`rF%7rHTZ)e^l=U zvO?#Sh1Jslfk1x0I95gn?jy$XcOup-p$cqJf-V1oco8_CjuqS3C3RusWsp$$f*R}H z>dr|Jgpw6(oNo+=PYAGbebXm&NtP2l(MfcYiF5_Y#;rv*X#uYA8{%%E*L?qf``dr~ z*?XItC1m}jTEwt=qn^}jR3#=Wu&W1&pFbE%8dfSB7DF#_jX1jzjF{_`oP{zK7KF9VgMrbAc%5Hs@7%kXmsO^6bb> z**QBr$zD1b65ThFzZzCeYWz_D!=EKzjmC@>;%y!*0j!5Bdpj${rB?TN?l}R(f{c|g z4pQJ1AZvfg7_pXQ2Sv1mVryk<>+<3fjZ~C`+9f>6^EBasN>YvyVQdrE=&!QoNkV`p z{7N8eQmf6K#s!cX=QN@qI|$P#;b)_IG1fbP2b z$bXxI2P#doStfZ3s^hgSXpoL zlbuctbBVNc)63!8YmOvS0=>WQZ2E%J2tF9M1I09aA*vM2$SKAx15lTI&3A1=OdR6JciUq5?<~77BLL*|$5iC0m9X~Mo ztlGMTEe)ZuF)V;bu;e`Fa%k8OG-73-?H@LxLa=-`Bf&S$-fo&G zzXj;ZZ}n6(Y3dzHEu0j|`)niyqA%iqeRZ$&bf3?o= z^Uf2j_DXM-c6*Xl3!BLv5@NQtMVa-`HV}aKo*^JF$M)Gn{>}?Edwrv@&J!hs9%NDK9S-v8? zT6xG}$m$eTloEzTwc(z)8#vK#ho_%0Ot>VG?hBZGMp;NCjYp_2E-%?If4uwY1|25? zSyh3o15O!XFK}gS8bZ>KqW1tNL@HSn4NysoYI`@!eVn30{K9;c$QEG zbX00*tkNYavHk5xR1e12u6oeO^wit<(_2w0^#is}L^P`y*wxbvRP9349gKYf+HeP`s6((Ohm9e!my=k(F+f9^+GE2*VmssL1G^mR-#(T@)FOim)Ple zetO7&WmXU72(ff9x0M^jqh%~w8S_=_>BVzp$(F!XJY5Fi zqOi6UN2+1L*3i|O@LCD$NGd{k?Q_sdZ%ldjCh&^bRhzyNT?`l-a!wT1^hxZf#J1KO z$P&ED_M_rZC9HbetXEYTOVsw3K$hmx&`XEcFqp)i_HwL4=oqsaXR}2hbFjvYW?y!| zW}ZDo*7e3)YrjT>fO9>_#=DGK4GD`szqsU_hSgPGN)Jt)VJTrwfU5*Um(nZ_A=N#F z47uNbsk1>U7t zZV1-w9HG2ko^r*54k1rITbCrK13M-}GZzw1Sbyi-Ula`EY>|H}Iwk2OH7?!aZJct% zHt6utq=sh~L$6QZqj{-CGw>{vg!~9CJXAIeD?t$pQ(M{8N!W+8 zA1YQ4h!uF%=K2P{LiVZRPkr1QwfmlIt1rFgah&f&QmCV>o>`cdI zJ$;5t!3^^(V|b6O?-g;6as$y)F5}G_$Ld8u)>xZ_sHy{1+}Sl+XdiVYbhxz`*WG!I zRu+I2oGM_AGn0&cRTUS`c-#YG;lVibVZ`>S9KdSIQk62S%8ZKDcS^tt*M80nv{AA8 zygRjP`<601sF@Be$%V)NVn5sVB5~clvNX!El$PUw5+^{h!RfM7>^a=4;bM}N>*sMt zYtLDIJ}Ueg(T5t2$sTwG^-4An>WXKCxbH=fl~9&tPOA)AHecpj(XgOm?MP7a!+k5< zvps?!OA#w6B#UU4%v(*|zg2k_3$@~tREHC86-KIiOu#ZVWelz~--_d~IE6v*D%y|} zX=bs-zH=+MEKB+!TW^xlB@oJEaPpE#eot^pug!br+uC*X7P5kwWv)&Y=sN1TVhtOY z%OSBGdcp}-nJ7O;y%)^$!fDXQf-VA*W@kJy1WVRdc%5cvFzqp*wPB<3I{7JGhBa)f z2VQO7pt=y5=2c7=zAmL}Rlm7Q)&5|R?+hP5nIiK&z?@)nH{SybA&kty6rL^iG7MI9 zPNvgMKkNtn5eBD1yQe;)V7l@-N=~-3(bxj*dFBHZeXXk)SxZGOzNyQtJrh03O1&Nc1J~6Z!y8rnvl8GWWrI=lbT8%Qv+C15h5nEN03GI zs%Mwfi|k%;8CE}rSh`6^ia`gj>ixD!>a(5;XL&`-oFrJxj3? z_Kll`hkPNMbYuyImV^rnJM6|Hinc&+(CvX)IGAJ+WMLcbNiv^gnpK@tMVK<{g+*i6 z-JK%4Gi1qUC-P;UtGq`+4YS*Oflq-Z_=!=}?Fk~Cz--8j0ISNU>tHKdCMa9x zBvumeS%FC|nMx-P@lr(ppGZfp;Ca&bF(ycNEnoo{Qf-jm(897+{y(mEcokMMA7-jy=HTF9 z64o*yg8e|jypYq9Lk;tDc7NIUnaoVEgBL9aivk|TF?HUvlKt2auqZy+SZu`VE*h4I z?k$WGf@3LU+0fyxny_GX$6po#MgUj@S#)IJH#|5P9NZpHdp$f7Y_s(B?RtSBYuYm^ zRmDJ7#mwncu9Ml@eHqJfrlG;Gy3t~2eT(IjwxyC(TSNKGVOVi5LnG!^FS`z_vcrfP zigR>*W$w~=`w&jUIpdp@<0WB)Wsz#tFkQm4v#T@5Md1*v^9#bORY^i#C4#lLL>y~R z0c%MJ7M!CI!Ga|VYS#V^Ar$(A3lF4EXb(cHg&i~+_x6Zn9X9EF+$6+0L3S*Mn-OMJ zEkHz;D+ja22*Wlc%Y4wQdDpId9@~wBR(21>Hp+EUPbR(utHw|*Qo2Eu9?wOqY7Dh% za|hERd#)u7WHBa17Z#)b{87cZ#%$A3v!bYmqIL#t>XpQsm~bZP2!z8&jZX)?I(rmi z<)Rhc)xy>Ja!5rX5uTKv@Wa#5$c7FO4IzrvX*_;%yT>c*G47o3E2H8#tX6q%Xo;7x z?%cS+yDA915-IG>K_C{|DUYAP%&^!_dBmWa>63hJ)XG-!(-F5NTR8w$wH6Y!Ccr8s zn$2Vtt97xhl2?TBVnZ-6T;V-IFRZX<*a|c8q(3+APxUXQUaZ?^#J?q}?e7c7CVK?n*+dvtt4lVP=i%8iD0TIbQQMY-wlOkTZ&X`5j$Dr*b_1=KPX# z+*emuurYOSpB)R(u$K0uMHrQYfU736EZL;P`|6h-=)(F1-dc~&Ax=WFSh&X>nq}r# z2C=}is>loy*kX{-Ob+H!;=DpxI95GNPju7KuRJSX#rJlxT!k$&k|7GNCEHKf)yzxW zrE&lwMrc$82vwu{u%@M)so~63E&2cB@Ub0AV{~1%Wmwj%l*Lx6xlzS_R1p@7-unFy zzFA(r-5XgMOSo21n}t>gOMdpy_bNfk^V5k=#>=UI#Z|HgiuLFZpFa-iIfEb??4uab zUwah?O58Ld&Cbo&Z{Bbk)@I2s7SoB{JcOVOZ}`HKgP($4(%(&1$AMSw5NrXj+Bw3# zD!+LtJW#rs%v6!DOn5b^h1D7}uuxCJt8t517Qa+wL=>p0n=7_vCkA0g(g5l1)zvFajXVe=nREUgMHW)WPqj|8!bJiL!YBt9kwj8@oiemiq} znwbKz1gqNh`lwC!;f?hgZ)J5X0jnpGf>n26rynh)fP++3_qrJ)jN-2(@h_?%yS{4_GCfRN7i1s;;Eo5=1J6D9NUdfm>b1WlYc`@!(vjv)d zFlj%b<=YQD(#~0y*U2dz-STnrEo|v`HD#f!$>I5&Vl-YI_p35mWrbnAc=k8{{?p|< zyWGbg7E-=MfPjzSe*I#}`RH;%GA43W+&s8FU zRrWHZh*JIN%^OL>Dy6+vHlg}8LQbL9fz zmBFlrHQ&!utVT@hB7Svv!Sa;@S4P5Gva0(bqZXZ;qGKImzbcWa9fqcF7i4?Rw;bP~ z`|SBpZv^h~Ds2#J0~2P+6J+!g#p1j(1uVW~WlJ1bQV@DVvG5`*1F{-QVkRJF(aRc_ z;c5stO%(L%lz07&`HhWVwV32?aLHWZ>}loqXW%NWz+{ohJ-a6ZTWQ_ENw<@}pL8+H zRkDJjjd6Em_rR{0P=*zxI_nSD|L*h0%XdD+Kbz+S9Tm*l=Cj%A=9}$Of~&hkve?Vy zcru4LCo9x7fAeR*`0KA9t*;Lsm2P08D%=eOSa~1&2K)VNklOj>`>$_sNKG;jGm<=E za!-aGKMcb4CYLnrph{SLcys$TX~{j zgR1;Npes`i!M(<{DPT%dQ{@s5M5Va0m73+~j2`K%hzRYiL-!y0HC0DDDha`@HHI z3Kmy{hguC1?xX=(O{DsPld--|+-m6o=5rQaEWF^fnfv!kvJPxt9%B!rEKPSakmYZP zl9f*;Cscyr0wp4DS6Pdfp=YTA$11{WLEzaUubR=Pl1b;*wOD0nltCmu$B@d>E4k1W=eT8Pm}we%Gl13Cj8S*O zIF6P7oCt+61NF5bbrQ;mZ#N*3p7jcwwnG?FF0&-xnZ#I^>m33WV2)3FMM zVFfZe!HM1QGGP1+m_-HQ_`^!>LjYF2U#KImrjBfPRiB&$(MoJty#cDagH~EXF4~%q zAEoX#0>sl0Go11r;lnC73}RU^$}vKfEo2E)lp99giZDzDX3B0+XL^5)YaO2r*V<)1 zWkjuV%vIFZ91Z$Pf`>U(sXkb^vo>DBAVd0b(+-VBMTHRY^FV+LF zD+z6ouo=2qdSOVG=vYF_ny=DY7-DtX2^Jv%tg2PwT0ksBVOKd0yJ{;#Jx!cH&N-7_ zWOguChunB^T|1R@&5v5yP?^ z3qqEmSXo;bTEq(M1}{ydsd$~?aQJ!S&hnix$K(Vud1IP|#vPH`p@MFc2@*0J`Z>)U zl@ZQr;z$4c|M7qR>{ma%v3Y}VsS59CyPrbVp1<3{Qy@t0Bx)u{BAfC8yRWnIWKgLk zo28Opk!M^sg+*WpCQS@|e~30BaPOp(DP$dkc7bZgj!#Gi&>~3V3{nGH^jA>DToxe~ zszrV!tAbn!#R}y$EJCeW@ESV|%d>wZ$OjzTcv91`;eceV2^q1Dz=sH##E4}OOFUUb zyjVmZ3BzK@`q22@8LuqE>g5En=v*IhaA=*G5iImt6iT2>-(CFdGAx$h-IZVbC^DMU zbxjS6ixK~d;vT@T8dv3*h;Anf8!EeB;VhpjbK$7iVrs#LTeev&I(El$?EGOlMx$cV z*p(5m_}iJLpxaQqYP>^pX9w2mh17#;!CH#@umo-BEsZnb6$4gNib9lxFgBDHzU5tC zFL<)>1)nTlv3AdJ$9GR3?xvY!L49YGk|UpFC7$q$YQ)KeFGbQ46BbN)6UUC_93RfC zS#=tR;=syDNL`S!1Z$RIC2K}Yuf|mjBc8U)`a9xBVL9dN&L!mH6n*>(@wQNLR9ph{b{hOFO1DFsy(4 zr;mQ|A8!!9+DQgnf*{pux0xO$L&B>{sWi+1|5|KfPxw70SglIu2?17Ov()LE9eRPs zs|$%^rH8|?r5SIC!69O)UEO0FVRw%Du&<-Y49WrpS zW)Sip1}}PLJApk8VwmM=`h)rFkQtz{Y&Aq`mgl5uGaWxQc!dt(5yvC9T3iIeh{a<% zEvX3W%CK~|IExdEQW-@nNLcVS^jO6j)kln0qrOyxiws&Syenk6yK)4y`t7J5)Nm^; z`e4JVFGfBrUTAL^R>fgh#IcBBHLO(>d`f}Hnm;3gRaR+U@6b^7%Zm2KMddUHttK9! zP1ymV#+l2dEG}6vyKGx z0rO?UyNAQq0A0WJZuj2K;v zt2m1Gi)WK+8WHn+YrhhHB?N0cV_aa!iZJUPyejF!R1BPA1S<|#5kk!XmMICNa&%tC znn$c4hFEl}KHA=VFsy`)zf{`G7ZiGWPo@>mFKtq(X;xCT ziXMQ-Pp5~SYNpd1`pw~Pa~Q%%Z)=%RZMW$Ufo0%doqXOGpI((wYocoW#0pygu3Dzb zuV9md8o!K1kOjHhX(O6^wXu=0JQWc?m? z-No6U`F-@~7!qEgNjQde6kaT)SbR}u#L_i_j<2dRyF9f&cT*6nu5HA6TZai-mS9?395qiWOx$SccVzN%pqw zc-Hv)sHVJfZLA#7AbwFP2Zdj8SbNkYl<`54u+n^DepR*%YYBoC6@)Kdd~5M)sq~^m zALZ?Z*3u=gcX-GTvdg9{b~x~XCjW`APWTi2#U_DI$vj=;1-BT$1jj-Y2@F|u69hbS zFvq$~yoYfFavp=s{{gS`3F;cG6s{&omuFoESFuWOrt(Xtookm@&6BG%I)xEjC6lW2 z*P=lka4cA_3&nV-O{A!sgwmk%@Wy+;9af5i<>lY}W;xR4CQAW_B2cO0oapK>5|!VOW@)&M>=@wjsi+rkqpi7-6_Yt)HI7-1S2*IUV}Kfcrp!2H)GNUmH2cb~ASK15 z{nCapgUb7jSR@VIS3ekm)ZZJf)^J;mfVJ;XEOwCYEgdciW>Ha?R=AOh z@D&5r-j2Ai2&TS$5kHLdZaa4OfDqW)m(@o(-NoSqiVP6~I($J=>O4G_eam2C2Y zU^(y5@@m!L&APzGkLVdl z&*L5uuy!g@N*IcTqOtQNB?+yqY_+)#w4$R%|DbluSTM)c4FR&Dc4JO_DhtifDbuV0 zUaAJHY_Sp#zD*_JfjAymjAz(77=*W{4qSOoaDqwy!;Putl2&4CmJmsF%Gol;=gzr% zbynP4QVeQ62q&q7SiFX*r#lHUW)2!0YkZqJHc{;nTy?FX z%H>&IQxwWNigw#-SZ1G>E4drQYIB#+fJ|g}X8=-vrKM~kOsA2^# z3p`iRfR7y%1Q)xC>O{dMegNAgGyrxL6X^x!aMzeu>+<}P3qpY_PHW%4&lC&L#l8ku z682cbQi{b4>s3>%qfD^we~ZOAvyfH7+mc1BrAQBBCF?kSEG%nx12BafC%YSTO=L@J z!+dm1VmAO@1G>Q9aR^tjo*BL-rc`7}H8PW?9Le38A@t@LmNPYTEnLNP_DDr{&?)&2 zPW3hkD}9~nZbJRA?5p5-M}ru}(tX68#KZL`7+fA@mhTLf4^FMAL1SrTHYbTa^?g)( zLa{3B!Ai;0Q8oSgqyPKsAr*I6f5Fp)KH*P}DAw*Syq<~8H``5QH5j~FO6TdRpwsV_o3NK`)zJdew+KLzQ7&l^gC@&Y8p6&J4*Df&QxD zI_-&H9j;!mpJ7iLg!c)vq$mW&5W`})G9k%_hoWFL4=<%6A;G~OC-#akYvV+Z%EYQnGNyyR}0 zo$sa1ohlW1LCQ-fFq@MAK|aYNBZzJ8l_UYyZdhb`mj80-VcWzar#5g&NSFoRSu@|O zFSbU6bA?PEfCa>A`nysVo&dA#3sg1Fa5Z4O3ah}WDzPi62j%67|HDH9tjg4;Jc_Yl z>NE#6(Uu)BIXfT0lh3EJr5;T2}@`8nL&iC={l4<=PjV^afKY zo*9lc!?GHUGpA5A#s^65IzqU|0@nR~1sFCs?CqP1@KA6@MJODXGEBI@0mS&Up0^MhYH*RbeT7)4E+=5$lDXD#gn`XW1w32yPg;dHsM+!W7>rZ zSwJmoX>i7#y_jqCoxXLaA2=ta$3O5x3c+jIgb~GZYQmg!3bS^kusG8xjI!k6grd4E zTj=MO8|QQX--BcIvq8v)tuR-C zh?VA!UpnNh`WklEml8=YnIM$O4+d1F_oz;(ROsK^NoM*~4_3eb?Q)JS3i>Gf)E)c2~HUT%^{MYx+b8UZ5~DAtJ?kssnflz zQq^&Txy>>2tSe?%{1KUFmKu%??|gZszJ+7HON2{WT{faoLuow<3UT>)6)9s(miVEp zB6Wptc+4zLCUmZ({+o%9myt!QV!eWbwQ{I%#b>pttB$qL3`>M}*0ByFyjqPI7HUF< zte4*lPTj+)#K3i*c$P@-e3l0S?7gD0vUw~gkS#jNmFn@k8y2(t8SE19dfS0ok?jxK zDm3nQi&)Ah#_^~IYaM+j$(nP7CTEfAhcheZE>5G+Nx4bc868=nV@OuNXmc83`n%UT zUmx;*t>U!t=+5nfJLA*9CXQ;Ku$9eGQAmh|sN`(1>UYA7Xju47B%2Q(Z2xZi%dZ~8 z*Ir>md^PA7J!n_}tj&an0i87P>UAkyOd&`H9E&h(nr-tlCF%R22M5J_4?3p>c8InL zxl9uL>JT*{AZs^Y^}>_EK?V}mA#*I#I~GyX{ue{P%rj*1SxGd5RY;(va7FZLaJ$zF z!`o4u$5?rmny++0G;3F~Ts0~Oa}xD!M;|6+9$M#`nfu6N-;&Xkt5tWGyS|`Ye zx3tS%7{JPFRT$;_r5Le9aTmpA%y1Riu#!nDy2oK_hFiH#&^U*>&Sdr0BjHl4*^RsBM1o{qC5<+gqdF_#nT_a}v!O=Bg7-f1@h@Wyj4jJ@_%pSi-SR zxG3zL*q#d&{OA|5l!YoVWT?_5ml8d7Fqr=5es4N)X_d`Zm;Df4CI_sl%%>5_9`Mt6 zkFcc@76u71v)5L&y`}SoOtD6)Vqr6H49-#p?c3~+{MQ}G`!_xOI zVQRS8KQ#K){e3zyVyUrVUja)Qmehs-8wB&MstF5L(Qg&6UJAEj(7Goi>jhCPD`YJ> z4hM0*A0Czuu}-YXREsFrG2_)X(gI>9wu}fRLT&6h42xAP z&ImQC`#5H8NWRT|m5!B#P6seK?^&>p2LIncu+m8#fi_b?GZQ*dnqTqy%uzYK_0P6{ z_gSLShry~BE`PfG2-<8yve)PVx`8i@(5n?g0 zc@1FCr@$T{kie30olB=s7>*QvN}fQoj1+ZczUoYBN4a;oVdi=G@_c6B^RehqS4yr7 zVp(Fv?uj$Ejp(|%8gol>Rxe;^*f)L#**kxK$s!gyg?0#9lVY$-M+ONwBl$ivEWp(Z z#w*4wMk@fw$y~muf|?V)7@OBd$RU6-_<<5@{=xm@_#U|(&I2@#Ij97 z^^VS$gc3BPaP@Y?sx&v>|Jn9e72a0U8s!Fm@y%b|QNUun(j~CL`okfX%@a%#_N2og zQ&A181{Lc^|ME{i`){^?@~F8El|9V%y}keza&eH`SGw`~^_$m;bPCfsftN$o$GN4+ zbVr^hUI+iC&DYzd^`w_VvD%qTk{nFrXNvrDRDFM(Ls-L!R)n@B6tfFBmUT8j!5UN# z=*%KJV2h#Y!0@XLUrYEC+lqxo7WH7>2;=|GW)9rub5m(NvPHaH8)rnmC9L% ztE(pc-AGud24BAX{@zQ1sh51on8g%}Aqzs*g5g;EvP8@tM6%F&e8uQh=9SaJw1{PK z8oZqFZgiY%EE8&B;~_}a2H%!)Q8-p@VyXkrK`f^#Gy#6`HeoIKwmIjSve3pY_<~qW zs(uKwI*b*BhN}6lceGY>L*8?NX%of=3g?cX^V!dT@maGXhK0iD^z*;?&4;5=QS!7D zv08;}s`Lp08+=jGo2hmsXDZ}c&EI+dFF*R(dp~{oVCex7tYOgZr~28TMqllFftP%^ zP2}p$n;TRr%21sKt}M3NN%&Er^ui56n4Z{t4Of<5P5RA^d<_y7@wu^#^<--y)w#vf zoZm$2Iqh<+4dGb6a;yPimh=eOCmc@Vvp57;gTWLa5M&O(r<7Q!&K~7?OjWpYqtkdf z2^N8mWQwp@FePD&mlDSK6~{JUC`Vg_|4?8jmZ4bD0o+2aC@c+(SAFBXicV3Zki7{K z9jfIZpB)*i9Ss)N+0vj{4K3Y_Gh-apqR<$-=xc;wH5iw;TL|vNgi5Ax_>*U6{C*Tp z+=ycMt^}>r;T{bbnxGg=`E8wJkImM_g}|0Is5WNfw&JmU*Pzw;`L$aJx3Du+@M?+6 zK{{Tl?!LbinH%;LWb`0bmLP_;v$uvp!u!%AWVoWDknu|4>V;H?U|26$$y!))#uU+= zbU_P3JYRDN{IOBu0a_b^TpPzH$0xjh2dfS@aBG=4*D|v%Q!x_D5*2G=W};bZ6&VXV zaZ+~a%51ny1Xs0dqpb|NVq)YQa^*WP<(v2YxA3nyl9fzeH=I+OVOag5U7VA3GLYkd z6(&CW>BCN?nB|ozg<#P5%|Gx)FSaxsv4(ZjD*B&%w7ps4$ObxmSkXOW{I3!*+Wy_I ze*Ke$`%9(LgY_zpKeziH{v}~H@HgKezi%^9%i6pJJ>bE@)1)ogGECn#OFJ-Ttq(in zT9dAV51j`nf85EN&#N+L_*^D}cu#ei6B~lfNRha)RfJaoFR+yTsXRq!30C2VD?)%&H-fCXog?frTEV-{h&78^J%KC(S4^r< zz_BLAwP4%OEFQ16UaClQUyKjt)NL46Wg1bemV3`wNoWf~`kco!>Pp-S5*SMF*=e0) zJ1T>+?mXI-DsM`f&ZD&CXpxTGO?CtVQE(>cx)iE4zo2k7RM~u9A?iE%UWjc!N4Ti@ zIAZ&VU>Us9{vdNKy`lC|#+Q8~zk^}%c8NVs!`hJ;EM-{F?*XgiEQodQrBW;m>M#y+ zUAQm7es~lFDD#48K`fzLhm2TF*5HpnWl>9&Ey65plHTAqxm+f=QVf$-VhmY=SO+#Y z%d>q#hhdFt@5HQY36?oAxAOh#aLb>o75%qERy?o4^alAx9=TQ6Q5kDc9UL%XO(qBNY7n=EgI=!yTbGrsGEUM^JjP>vctI=V)ZBU}fuuUg=xpXkgi01CMzd7{k?ReIB!LBE0I!{Gi&d3`#lI4#SeQ zsI91RSZ}*m8jp-cA^ean+2*xqH7r+lkAi9dSfEjyk2K-S&6B1*o|c z*eG+Li)?*3-%{o@vre_lS89Zy)cfUFR=9>$^)HmlB zTm+tfhnt)+`ppI4YDM{#!qokjFPCsqjs>{dhk2BZr4GZ|lk~m?Ay@)fFYi4EP+7b( zIu=9LeL4#kE|~tK*-^om-f_R3t0J+J2HQG z5K$~oOF|}CLb6io9F=EkBx2Rx=4VLyR>RU$M5bcz`Sa-IUx!w^BDg0_TyoW!&8g`c zu^dq>tez?q48?jo#|l!MQ|$2;iEJ@Aoqjc~)1Navvx-cyz_7Aj>6btHB~&P|EMzvc zvlUwsR{he=?Jt+7l?o!ZygqNE@Io(@+)eM+g7o(0>l-`i6o<=XQ+~QyY@77BEQgp@ zWJNteRz6=#Vp1p3q&o04>!*2u-p^F4o)a!J24D%r0>=_N)&|e$_^9ubEJ?zI1up}- zgPBQ;VI2%k26c#bg`Bnqr)mzB_3>H(j(cO5S_xQ5bC6T}I2pNUJq?AULhDEd3A>hJ z$yGaYHPo426-L({r>ttR>q-PH&Z%k3xoe8Sx-=jKb6SQg30y7eK#n0-To3ko8jsws z>z$(o6gI0ta{y%qogNJ(AtGIbNioU@HeD!8(KXj|cd4#p%rYMaY{*tEoai7dDH~37 zUbY)eiCJCfiI1&Sz|7fq7iSSm0v728>Te8_qVsoW7vEic2W0vNXFl*fzhkJ953qu@ zvbrktYF`z1f+`DHW(;}>W-LIAC0R_cctbR@+(EEj5@K;dsBrc2p5<8g3}g|<;<|8W zX<=ty1K*jfts2~tD?%?YE=H^}zv;oGi(Vu?Rmh@K1IQ)twSgO!WI=nkLpoz?$Vw^8 z8q2CEzkhCpu#_e%RfEPBLjvGaL{>RDv-RlVHN zQ89hUHDNQIXodw7*3c?sCc90cSZP;yKVig5+Ad07X5PWD;)Cu3st2c_FNK~+R#T?a zTmnvoS54zU)l=iaDMyR~R-z0n16Kuxq^=EXkTfj8EIJz()<}(`gj@f>=Xp7c0gJ~i zrKbmrgnL_3W){2AzIoV2+j9#gjD*D$t1hTjXJdqgEC;d7!f5e6v=&X5P-`%uQx}|% z&KKXDGg#dP@F+A%csj6(0qJ7PLe}MlurctkbGf5Is*6>7;A7|dFy|Z%LwI%e4eL{M zH==^Ooa-(1-5{0+_mSz8xMuom{0?wjK!@XETeto9Cy#h!OXnZ4DA zF2jP0;pGbkD3@SG&B79lT9}Z2vBVUM-u8C5%v^Oq3wXun!^_Ld!&haT=y>H~7GD~A z%QqOZaFZd-C|RZ`w80G+ER>2+wx6b=`DZVlFmtVY)VIqclxO)YvGcX>Fe`sny^7)1 zEXUeqMNBkzKhCg#SYx{k`jjYDL6)joGu9kz;oVfYI~=aBCpwtWDYi%ASZw#PbDl?# zQO7kO?soXc@uWCIaFrB=^zYxf`N^L;PoC&-4hU8N??azTx1_iJdUMB5NmfG+l6z@_+-l+dz>mV1Xm4ZHB^a-y}6~Z*yGkCRF%v60u(H=^a!>%~qwNI#i z_eqq}0mD_sg{*_l!4$AS)mgMdNsXaB0js%#(F#V-5w5VLWaPq?SQ?JR=B|f@DrQ)9 z=@T+q72e9Q3}UIX-H26KxYO41P_qGH@e+2`Hdkide7o)PD>h)&dv!n-7lmwoSLbLu znk8iCs8QTotYI;?0>e5JdUb)Q7Mul&08~_RZLO?a+yy%lY*M(oSlu!oxd@bRvTFJdRZkX7N}dhcx832xarbGrfZsv*G{=-9HtWy`{RY^u;x@2Kq*GH9iQVqLR|B8FNP zuJ{&E%Xg?&R35r@;cUgIAKH!aE2dX|)FX^GV0b)D$liQc!^&o33v}dG!ERQ?a);sY zQK_`honjbD5niFF+^Fly;TATBCDL3*X0x>izini=F)3uKRZJ3G9UdZ0 ze&?`O*D|t&l90o*0awRnK1cB?X@{W2+dctYMdjd>_*Li5bcD>V`Uq-OCZ|d}Psog~ zfhs0f9JohF74+14RkV2Jct*QNUFBCwuOhqqQMZ6bA?Q=V72N;fTEs%>*sU8+x;7gT zg~g@>>s61yO0OMW<+KRvl22nPR@d|w7oz~bibJp#rAzqfv0~O)nf(XMlrB+daXCjw zr6{w?_JJ+__yyw_A=wr_#577!=u(uWbLrgir*T~DUErxqkAw%qLtQ9a!o_!%IC0H) zesSr*)yFPGZ7EXW@?*lPkHN3*uBd{wuVVX4oD5`H?Oi>jQW7d$(dpp|FU(Pb_51|{ zEQYL?_vRVaJ&p83tWRngtZ*O3OlmEH`)bTIF50azzZw1uI#C z<6FMvJ0DFui_Kinjn}?gb z^--@g;6L~g>rOalgM&earwO@wqbFiJW!ewBrC)vB3D>{;!($#N#F0#t(p2XKnM`Wu z&CfTR6@)dUk{s4hN>pLO8Wq|IAg$3qs}rIe4H7rEH*)=~u9;bE9Tj22N~DEj`Qt9e zb?T@qPnrmYOdqGqDq!uJq#O)k4DzA^PgDQFx zW)-kEePpHwW9+KH+^TLREGY&T)#ol0tKK!Dd;J~cO3pmObHwyYG^Z{*+!y%_3ziuO zY|o!!N2_h^r+q*cM=h&D?=q~&;ttcVWmqx}2wHO~V0B??IEI&%)w^^Ou(@DL1>%H{ zUGSw9sZ3$WR!;CSP#-GT47b`}H5`i`RUym8s@daXK5bnPG%?@%c-1IoxVQ_jy12W= zKbi6?bu@5E$dF|mq}KJmq>V!6M5~NhR7}dI9O75ND|88;1EjvVhGLnJEEck`wPFE0 zYkzHLA3p=Vtn_NkG2+$&|x;Q+P-w&bIIq-^p-Dtd?zdAR;tu|I4kOh(@y+Zn1 zuT3n&V#LZR!!n3PV3lITa*D#54acg@kt{|RKRJV12D{Xmf+X{Jio7cP^)h0$ve{fX z$Z;G4Ll%9cB5O!%HGlQn^(UR}|MK-$M6x(%90V&wmPsyG^h-BOehOg?$%N!A)6bbh zq-Q1<FSH$ha&Phu`-chGCK0&kq_jdDq%R^+97(;S=9L9TL!U&(Iz zg3_y2K~_Gixg8}T;A+v}mSiW}i*>JAKc2ozpoZ06% zUUkJZYUX=jAFbEB;@Z;024}5>Z4vUPv?N3X-Z}4`;c{@xfE6%`-V8NTxFKR?Zmfzv z1s&-^i4)VG)h%-$#w+F?tE>Af`k-5@9~*p|0Vo9|Tz-6kueu9l0$?$hyQ?4D`uOhZ z$9Gp)a9;slE$lB?hr7TP@Jfop`({o@ba@k4=!JV16jqR3y^POLIEsUpR{JGa%S2!Y<}rR2>RlF=EM3 zq2qW@MQ9~r7R%bqu4WpbpZ_i|gba^O>O+L;FZ zY+pmMTG?tck9~h$t?KV~I*B*G_%C1o;ScMND}+GlM5%+;->BCsrqVl2FT$&IEnBRn zB@1RSsD&XRR<#q3`^DtzPd1y}ON6{tCn(6(c8Ov&PXa1Q=^uW8^5FX9!j@Z+LP|Gx{>|fQD&i+M_3Yoe7r6>^aA26-n&StWM=35Mw)U^g7k`TZUfA z##32E$U!p7usF_L%%eI^DB8S%CdH^zmvG60F>bMnFYHR(wxC%&8mP-z`4h^jx^fi< ztwnBtSjRjF7Ox8vyb`!tjP|ZtylU~|csl-aE{-Wagh2ra_6%rUC|Kc2Ac8LL@<;IQ zg^(tuT7p-11;Y|x-SxzAy{858PGD2r3MFyQQqSpYGrM2jRETgGpuI-tCzqm@T+SmmJ3zhp(ujH&XUw|JjvbE09_firml?NvE)@r@ zF)Ky0Yw44<>$-(*-;irWKhCp!wUyednVZR3)DlxeG)Wi*_(>j?haXq=P(-_%qq;B~ z+W=-P4?$<=voAYr#zG+N5E{iqXm5<3qPA&gyh1jSdAsUTZSVH*z5K4bX#&`%P$&~N)7!;{bXFcnlcU*Blf zf}$u`z1z85CbOGPG@BgmpHg zc8xx-yv%w>9SsW%OVH}lIusPIfJ}5e6lhv?h?X1*J6tK^lCLgUPG42L!dF>*+DGXH z%CWk(FR-WRWC+xjl$5KCO&`<6T~X`-Qx_|D8J$ps(jDm?e1nS>K`p_n1xIivyb{%2 zc-DO*W$7Ta9QfIY1rfS{A#oJevu7^|sh&$cD90Ck(&MGz)k_0dFYZS)YeA3wg*82| zX@$sGtrQb{bJa?I(l%I~K`pvsRi3R5EMu|!aUl64ve#ZI7P8%gNXBB>J)ZFH*s^M~ z?Lxs9-#D|hK=hNQPz0fh5GQ}#B zSYLlwda#4>9Qw;gG=8UpwXI&7XP>=ni#vn<1ba}E`AMe7bA;85SKYa>S!()KkK2-A z_2719;scom1vW$^{e!W`P=v{xrYwI;D_ouESPmAFAP?)HHka2==gx9x(5ttK{c(@L z2vf~YC8(GsC7@8Npoe{25-IAippgYDj=;*Yex>r2E>P7#cgK&VT|&SWV^qNkR`$_N z$a38*k3M2MgR|}4`mQwGeo^w;yRurM711jNua>Cp_UQBa9my<}n$YCEw;c&f2$)ws zlR-ZNSE8T`UZJGHg_eUW5ndV4GH9mA#i#Ze(_b%?}#AveeEAweDY1XsOYA+rieB# zep$GR0+O{wXtq!UrbP&2LZKDoSk4Vgwmg40tN^j_SD)>t=$ShmU?MtK=@nWAupX`r zlU1w|BbY+2ak8SrO10t6=KCLg^1EOC`cDfxI}iSp=y>ps21otT$ZK@)JCpD}FT1!1 zhSfabrQDOr0l%(Ss?|Ie65hl@!gLi2ef;6zAcNAc+3B%uE1UEO;{aJzM6fWDBmKd& z#$icHHtIp%J2J7U3}&5k#>-SUmj82)nb4@0L+}*C)L81kQ|Sb9aKfqNC&>0dmDmkd z#n_cL2Meu2JF5MR&D|QY%MN9j7ERNF!?Wg+nGHzM8lKH7U_=I>1oE6~9t#2PN!+QDRxq&Rpux2RMb0S#JiDiBJ;@cMn zuYgz)WI;}gAWQz`f>rzWH^%gF>n`&{R^|8~dKZ9=hR5Z_C5!J@S`@NJdf+5uafF`> zS1M(Vy%=E4s_)lAmalN-%+>f7qUJY3N4S+X%9rnsu(KS7m4Jt2iYc#>JMH%>qgFet6xs%`*0+E0U_DJ72orzsqkDnoj%J3X?VF$d z>C1=f!}Xm9JL@4&Gy7qCR17++!?4EbGRAY7^^$~o^iz$397a$;v9M{fi8(?{tlhR0CE-ukyy?ZZi6!-MM%H>I|2sZGOJD>bWT4s+TjB zp!5Sltq9RZv&>4kl?5vXsygqSXvxfTyKC3w0J9XRcyo?P92Fmyp;$545`l|LOeI(r z>=vU9XOV+J&`aT}-=7iNZRSjy8T zJ@^A_EBkXqOK#s?HSB8NBGuX+Kg6CqclF^!5R=M|pRXWScR|j$^hE6>k4LDsa#!j< z{XX{RvxJWc*22CF5zc9t%7qNCB zefs<7La{7jeS3>g>y{wat%X}p>21w0t^EbX>izwhU)icCfWY1hA(S|nL85tac_9lv z;Ky1Pjx~`@I=qOE2^L68s+dB~Z-iM&vF4O4V{>>LZu#zwEY*k%s5xW}Uhe`RzX_JpE)gbFvC(N&OsctmH zZiD%}aI(7`_B2_gz}du8sRVnsD;2s~_0 zSQUTyiZTs>EJLwaxfeyBtI&&8zWZJEQOI#O!YDzv*~)YU54d*AQmhw1r+Y8Wn}IA* z-uLf21PeOT0^Rf0E#TENRD|pqeJ&hJ;VQx{`XI0hUM;Y!XM|eM6tZpsvTog{hq?vS zQo!0@c)DPFhignN_oH9gU4g6U-*Hy~jC&WD=saWH9qE4g`~goC>O3qltepA;0)i}C z6`~}xkQLvi6Zx`ge`d9+!?KdjeBd=0XUWwy`c;%H<8D$_Pj9~e*)V)EMT;=3 zjKu7o?hsU_N}CTj3u}`nazOT4QQW2OKxnsvAl%4%Uef3A_Vwnlb8uSpnMwH-0W7L* zS$j_T>0P#8r43%mQeCMCWgTTSU}aOLezqG7LlVy*~_)qRsWO@ zJGW#LbU)VPizrrWo?>ysP;ts&UKH*SXISci!m|X0n8Fnoert>b{CqQF6y9GW=CHOF zweV+TtyNQ_DL%z|XF|~S*WzDoG<5T!Rl_zSY`O-foMWGG;g(8RFNk2>d#PAOrzM6E4iantg z5bKs6!m`!`wM2?%>|dJ&`D+i%e1^W z*LvsndY5m#`|w>}HcPJ}0n70;M6v8Gd*aGauUyoUtDKh!2g8RCc7_#p4tBeR(V){| zi)Fh7%X{_p|Mk&FZ{ECtcwS0iI&iTa$iPzA+*t4&0?d=r_}TCma`ADZ(X)>t4~xq-hmu{;t9m9lJjF z8^wTC%@e<>Rx{R@lF^laW6r-C495LlrdKBj8HvWu(}6wJtwsT7C0qwpG1Uq@s3n8W z3|H2Awa9PM$iszvAkwfPW2tLlbiCgw$#%4u~3>OwH_64g1XyA%m zQTXELAc)CKVQ6lz+RD*l9H2ou{VR%CYx^z^sZ+vUUH1%r#}gcnM|gE>!BMd8Gqbwq zR)spHBNZY0rr^L@W4O9cfc5Md;nj1cRti;{To-Oy#ClF}rTmJ^!e>CN7lc;8tozSg zyrR=nLM{4Tt=*E}79CINm-uw;?LcJ!jb1-6G;oOwYEUdAV_Ce)Q5Vw`}}8LC%~$0-u$do+Puku4cJ65H>6RjCYzj9C0yk8NLJ zyH(qK^P^w>QtH7h&psy-$)FXjZE3Z8yb?71;LAadf206W%!O|2$YX|;X!>4Iw^0qP zAaeq=N&~BQS!)Nw;&Kq}!ATAKot=;?=E<1H8Qh*CuWvf)wnwMNa|N+olywacy+*Z) z%vN<(ucR&5Hnm>6)l#8J>Ol6PgAb{FRJ{$1Lya>PcO<6)R?`AQ4R+>q zd9Kj#E2djW^qX<2$5yC{%w^ftkyz*3#{gfrPr5}6OA(78 zD`Hsp?it8>DFh1~>(>5Lf-L;Y*7k3$0bss;Mu7F~Ich>~5He^H#ljoTUoeItCkuG> zy<9#c*m_9>iw@kM0PESU=s>CYbnSzMr)zQsy#gSuJzZhUa@f{WeV0#bidYykFQ37W zwIS99Z*#pOD*Ix4G|CM+eSS%AQ*jsUHandp$1CszG-o!XDgerA zVtad7>3sR+=S;F#l_I1ejPl?7=tuA0C~-D2FH)sL#sUq?8ujRD7K9Hzdo++o<>wJT zH|8-)?4Ic4vf3GIWxYw#7r5g5D}gIPEJCYlO_KRDZo*Z@8w{5p4{ncIt$r>?RHipJ zy+Kv4g6nF)QIx}A;EGGSBVtztR@%kVuGA`GSBpZgxI%QJ{D4MWSJn%2--xGi*v}yG zq)gGeEwde?XlS zBXg`kJ(Z{U{@PRUqy?6~ZIck}>Ie-eh3TR*w=6GEKlR1=~ggrPxb z76BDbOtJV3iR(Fm6@Mw=6+;}O6&M;p)=!=}HQ@)$ujE*upYbUu)>HnM)AjyS3t#(8 zzVJ!|7rH)plk1Rl5+2@q zdUrKhbMeYaMt1N@D#EB9Y#mw1vS*g#?V5>fb`(DR)q9@}gSMas6)xk-!4#55p^~fg zf?_3~$@S@5^o<=I@$4{me1F$=84R{*8nu@$xANSWfKb zZ1MuZ;*=;>C9(OZ^?WYdGTe(E{Rnwlewwoyk~wts2{sFXH_5Xj&7hUfcvS_vqI1o{ zm99W#zzRUh4QuU8u&&qG>k+v^JqO_m{EAIiZQVSmaMiWR&&KG^ zpIy{ls_JYoHDO_H+F9di+Op=J1+lg)tmxB8w$<0$N7}Sy*Sq-G-8d^d@!YotP%)3P zw*ewp*Ua*8?3FsVTCwRvVP+oY2Jf!A+R@sI5F+AHfU7meDf!4#?SJvd)f~Cz^aGu8 zkPARowb8!=p`p9;naR!C+S>lgzu{O@PsEyF)!I`5$p!lEc%C!Gx)lvR!{`3;i!Y=u zB#L$4QLzA4;EF&w#w$fELZ9a#Soc7&z_Jvt*R(#T{x)+AM5w@5PLS6vPog_xJK7EP+Yw7vJaJc!q|MK-$ zpA%v+!CGgI`Y1wyxS}O-~zPpg?&|=1*!P$mJqbJu_ses?nlDTn)Cox zq}j&A4g_TZ&u{!F@DdQkx)lu)GGx8{LdwDWnvTVqI{=FiVqssZHU=z!%^#lugv2tc zw$U$s`i0P}FZg2$STAt#jNj-Icf?sR>nBlNxOVFU`n^5nGWr&Q65|rR;Zjc@(D%oW zuqNPkOFzpj3$`q@3d^4&gY?eHz-m~AVR2e#AzJrtq<1gEEN=$1YM#?SoIfmNxpkx7 zNY1>MtT_bD0X&_@iTG6nS0-%Kk}3zZB9;ZLI#Nvwnsh$T7QK!?7<ogJsO|1eGkXFwF!>X0u+}z&T4Rb|VqPo~ZR#l#GX@Uj!RE6g1*Gb<`z#W*$yas!*@%wXw+KhZMwv*mTsUpQq1=C5i0##dlj~ zs3u!?BH5>AZ*$$aKs8)cCJ>olElRkSvmUIaNY%EU1{K|PYS19W9^#>tU^&PBg6LQ5 zG`e-m8AH*QeY`B(=V|1p``RJfH|WNXL2rZ=`*RG-$YA1}cq%R_J>$K#rv|zh1i(%3 zh_}|b(}$u^OF|d46s~MVNN@#?wQ!3$7TuTm)vcfWgz@H&LZH;_E`s|eBh^mi1k0K4stn4&8eCd-{GK+ycq^{n`hDQoyXW4;DV)uUJz6 z<$oO4#~17${Zy&3uvWJO%dz}9ta>w4UpIo|d~$%uMY zo!#_W5vFWGXw^0`g|;xL46C~~2WKEl`-Kq$s|-tD4(Xx#*}hk+dX;{m-5)=A)TuPX zHe*OT931q8V`052tP6>9hw9?yWvANt{=HxQ`fvW`%g=B3`^j}SkHSA1dO^PkyehF7 zB9$#B)4TccDe5s|54p^T#IRE7&DXEL-)WxY!%VLSji)!hU7HY%sxdY5{Qh5a``_}tl+ICQg z7_amU{R+Usq)ViH7p3%$Pxo1v-iMN-cCQs<`N9XDvR)-8d|O7YeSVJLGJtj8f|LVU z7O(d4^Y7#Q^p=!^j9AYEuAV(t$dam1)T}S=S)lrN%&HWo{`lO*Dut_`{QenX)$f1* zdxoqJ^h{)nQR;&=V3yz$Uwr_Q1;hfrJ-ww@B56pH@kQ#O7X=oOivsJW=l%P>`G%yN zpOvo8ki%cel1x5)-sgMX=OqzqX12ArNxlXmSh)5~Hp`*`S+b=^z!sH=)&Oh`Yx5zJ z4G^+W2$S%5%S1AIW18-E)j=3eBP^OTP@NE}R8{CiE5mSivtw^=mEhZztW?Ukn)nKC zwAa_$P$qKQncJ%OfO0m)B#-20(T86b`=9H}t0zuey>tF{E9b8)&f?l%spJ4)HC@M5 zz0WBRou8R(Iai*=2B>Z>2XDoi%k*n(F`KQI;qHYlhAf~!)x{q_oyyLZbM8FlFwC2F zwORBrl*{s0!3G?LtGt^2-Yw`BSBl%91Dos}xgy<9vt3lDK){K5W42&UKRh891 z9@^!JIOQe6aT*B&s}ct9;<}NB-=K!&kgPy zB4Vw1=Exgkt{_2H!)%*#5)Lm7N=kzo0%oZ~aD&b1(;}nWLx{D(^eRSX zBcoU(@mj!yK?|?$N-3yR`jk{iy;d!Z9^c})^G&`OBmK2*0BV$BCHD0iVHynQ{z#zN-}08 zxhxFSx1T^5LYxZh3C1wuU5sV;7(GId2{S_gu8@~Q778z4o??o%xw+ZRVY8Xrpdh>g zx3>&K7ULE{mpcGlLuH~BgINueUEn^=S}CQb<&3SgQ?1QbYjbli2OO&2ByB$p z&(7_4EnvP~1T5-uE~m(LRaPLLo40s&h-zo*9$$0Bo(Tr+78#mvXwBr z9(s&C8NCX%Dgaie*#wF!lTanh$}@)wHmN2oAzZn6TqS9UEh`aq>avEF&^4gk@W?h_ zQ`2`)!#ZY&PYhSARN15X6}{)p#ll#{Ch`*#D>rf>k*>_ zVZ-l?ONC@@z}N<$STj4V8D?1Y%EmAeU0T83bc!9VzvI?1p)1eFNF#i%bE|_)c{^eJy-~vZSPmY*5BxVY7n*-_h_+*E0s z-;a)a>FO)%E15c?G0t>G!+R3}JDr>DHJe0ce7}9ERg#Wcw_dk!yz?AK_wj@;$DPMA z4mnnLG7sfnGhHuR@SL%W09cuJc4u~`g~*hu&vxj2?98WT_c{)s&Hnzpw))dI3GE#c zxo9TwIC!f-B9h(d#h%LgJDjTd*ZJ46{ z2HitD10DDH5HXX6ALLKs??Qq`YiTwu0N@2zf-L-V5m;e=rdsO5?c^T=B3WV|)o>-4 zWrtq$kYE910VPWIMR=FR!f|3$dIRn?-e-Yb7*;Z=penNU132}uFbo8(0y+u93WQYQ zl^_To*SIB!W$&`%{k_|_-(JSJBYS1VL3ud!3d_;%% z6jp_iyXcOZYvq7pZH>*H8}nGm4`ydliuuPM|z zD7!aN#cGm+l>Tcd&W}VagsYw~ECecgy#dF{bE~t#utaBzs#soBy-FxgsU-vp#r6sn zXlf~t%0D`5=%T9YmK}zvkg*idLrF@i)lk|}%w@(6VpX!7Cq6E;r_w6mF3MK;WrR+m zb>UJ!%T;*bw!aFmsfCb5QZ<`D8BG5Oc-3cwGHODq2!oUM(1rvH%?N=>v7p*R#JZzU z>ki_TVpmcSCJn3#2)OWD1buZcgBC(jQqe7qV0^#2;H&UpGDyO+5y^HLvC!~-`}T3R zV(rXq0>j!whSk94Gqom0>tbGE+Y>CP5i9_5@d@myfg?`SBa;D)Qekns4k3= z#57GZQ)Q5x;q!=dQ8|XSp{Q204#>PJR$(Rv-v*f!D_Mw4tXtt#n~Or>Rv}N)6wB_P zB$D;V{vSi0B_*LjuuRB;3XUiildS(Gu!WjBK^0-uo$<(WAU{`1LCvw^$ge`4g-F#8 zf_TzCZ`&q31&mB`X$OK-beSY(X2-}sdX(+%P!mo~VNtlbIhk9)ny`tT5yA`fMgk?R z!WGcWSRSkb#D>j$H_rX_gLS{A*1>Akj^Fl+HP^SwJLzI-j`|642sGeUssKoUh&8`5 zcQLzlQ;p7H-?cmT!J*X*jh@J)2@nOeB5zEm0tl21ZMiXtW^Jc{Le2k3$E0%&i!-kYVL5 zPR((VWAVV%P}#v1khCzV|S2y9GJ;Zy=$6e8&n z(BhhqT2Nw&qs8n9a;ZCPQtHvz4YUkB^t-x6QFAdwxQZ2v=D4AM%?j5^ zDN`ejOS*aN3FMAqH(#E*4tTYu;GjU+4EYW<;_x6;87NrWu4%t|LNTfcmGVqU{iEPj z6uERs=$RubLa}`jla{M1Tp(^?xF7(|4MO(@(6xVpmv zPv{k(3c?lv7hKwiSSJO9&5E!OkOf7dlFs`Ele!aK1k_LA@=u9Y8m^N4I3o@+t$07q zg(BXEV8u*|PvMTIKA+*4bVr|xMKo*yWC6u`8yVK+sh!ywUM1`zV8IKzW}0q1DP}mJ z*0>(huo`_(6NCX^abl5x7;-QI6JTS8&}67ig-Fz1K~jwixKb&=)fB&#wq3E*&eJ6Z z1gubJKM=7J>cBs|Q-9^l-#EQUnJ!o?6yOs(w|Mnx+bvu4D;4K6bEg@u(lS&PgS6%j zU7dU7+^ab2i?mCO3yQ1fF}n?`)tUsnqKpIlU#sG>VTb6Ip4-eFdU`UKX{_=_P^-a( zypI7{YZ|h&Kb{!WX!%OlgbtR2`BJyrgF?Am$~S1^Rvnrw(QK3&sJ9DZnrv-O;29|{D0x+Cl5Sp!|8YFZgl64XZ7KYWG3`KXQJ$yvG zvDw+H@u7bWWEPWCd6_$H_UGxd7>JLcmaXtcRLar3=2jfX1S#)Al5?u># z%RQ)f#p%o7Sphv4*%_6J=-8@oO-QOcP^_sPlCUPb-3Dpy-U!1@^mErsh(K)+eBEEh z5XLW&Z2~i{DW$RucUp_w#yMKNdvfV$u)|SZSX>svW^5(2OLk~Mt5*dBukOvT5*l%- zySRS(k(XYpmq@uQG~s1W!R%*qG!K}nMhgd$Wv#TsNbc3rzQ1_r(AD*G09bEsNn`_# zQyrT-gm{&upN@KS$h(lr8w4x;gZs~YX}yJiX9Evvg;Fj(pUJGqbLn3ycFXhg(Palt z+|QFvNTs0isONpaE2s#oPOU@k@kBFEAu{{>#m>GO(^V*J%W@t5Um5?k5wJ=8r#3CT zOY5N*O85uK?P{wznC6`C;sDs3pA(YRP&}(Zc-16IOGkvN5>BxutqvJhqfq1eAfane zFA;$&dOe!;pvNCo);gI*Ih?_;iy}ZFpCa5^WiNxluwp8vjzsSb=2vJo5YwlvzRO8g z?hU*W#6pz@NEOm3UYNAGsKjO!TKMDRuB}9MVpsvdm6U_V77OtwiKx_PxH|bqp+_gN zNQ8=z0INSBVA;H`r=+K3GRmArZ2b`rBk}|yUEwzgkY5Ql#gRMVjX0NoaU@f5`69-; zKHY~G_(Zau#u%|)z?$$km#3Cyc9>zI4U04m{W)mpsF52Z*N74WUP4(l5+Wg=wgcN* zw89*`!O#`XzagbePnU>Xgs#!rJ>V*#q#FHGdCmIi&%e^92Aw7nnmm>jPG_=P)g`gx zrn!NKztBn7vnvT zhu+^Qsvn8(t~R=WM%m2RrFk5=nm{S1)7{+jwd;e%gTT>E%bG@~$PnaF1)ghN-<<4C zVuDPgfq!|YkjMEqIHe2VN}gLSz=w$F-x2Nm-azs(kSg-sB$Cw3chHNEqrQPxD`Gte zaJA`A`ja&Jr$=k6xE$0(w?h;8RRcvVU{`ps!qFOl;>~7{Y0>H&hpmL|gKTJ0c*R@`5G=_e)~%Q>2@!%eOtA`OscDh0cs2u-lCg+HP9nU` zM5-cm%2tLdX-OuS;zdP)D+Nvyv0#8xO+*M5?k7(&!!kFdSoR2##hwNYMtu{LqOcT< z1haVfsNf#gd2#$+alW8u#Tl~V0*?e&%(CJFTD%j(+MOV?`%x(g(TFv>i5eC%tbIhR zup%7r2YUCAG=@H>qg@vRYKVb+-q4;fw0>%*shI;MibH{X`ijx>e6LNtbqFn**}1DX zwy5kZrLrlUB9H%UGuNo95vS^hz}Gw6Dq>9N+|U19FRfht^J{Oyc9Q_BRPyUs16pp_ zN;sF9w^G^6Y_6bw+hX?qZ@hG9u3V&euA0Ohbn=r>);OumSSFk6!hb>$$F^>wbIVvC z&4-2#K%gd1h1iB2e*9c(a-r*^IVCp z61p!uTlGHI64u2Z$Rb^&+gWVmn53EHh8LQ&U{kKIxGAY8(amFbhRPh&=$xdO?{UsR1ga)(xP|JhJsW;{L0oCrLPc`>W@&|*?=I# zDCAk=`j#Dp4+e(cDvn%9SP~(Q5}{bek~{iLr{WBAC~e^t`6|Syxc(M|W%NCWV*$ZB zI(-yN!nZF^iH4P%%+XQ{zNm*ZtOM4eKc=h^d4G6Ol=C9}6ydAhGn`Y-hiu!9wvE>A zDPDz`1$#4farIgW-tm@|&1C8&4nberF75CbFwZG=+(v;06tY3y8k@T~cJb<)rDmzU z{@Rt-&c9jbMXP#!FUC++ua{2k$J({AL=XHmCxCqhYG#%Wl+f;oQOS#_UCcLA8QZ=EVTBxo$ z091r)aw1WX@lF5oBmaLs4Y&$1i({@5I`Gf@+mEUUn{El!tJW;+gjoh;VK@$y?0JBz zUcSeQdmbPQpsJg0zuOQFNy)8e~|%yR8@&^%8bTb9Z?zU&7R;2BGAW z!<9F35!^(@h}0YPC1}HfGz@N!ge{|g@E&zxxCZK2D>%LxCkc+tEtZ;If*Vp=t9KVy zx&UK--EaAwe6J`x&qW7mW@WMMmzq|4ef9i}sn!67}7as^k0u9Sin`W~nZ#5$QxX(a5?+{8iMfxFjhd@@#D5@I~V zRl*;T|H-s@ier>9ix5krmDGtR!y-_7OqnlH(A6{^;1+W;0zdJf+N&ouH={C8^!i;p z6uBx2wzTL)iq*tm={Epb=b2$4VkOB4+GpY<|w0*#_AmuT$J&^#53f9_ghE%CPntxzjW zD930*D`y8*g-){p*bRS-SzuUoJhuE6l7G}Idb$A#NLUv>Ab?=u@?bjMWoH`M(wf*= z=E-bH9`i#{^k}+4P1JMLqK|qBtkH~$HP2F>&5e*=5m@111&vplT*ZKOoje($i{Z8s zX^OfFW4ihiaz<&Ov0H4E*JxC+D@wA8+4_F6E3m&RHcF(jgJHM|q=}hW69&96!wN{B z3g`-V`SDY1sRHd}U%L$Y%4ndEtfZ6wGilU>fmjiOK@yxzx72Su-hn*n=D z3Js%$!8lcg!mo&9(f7xI2iDxNIp^)mnAb2vz0WzE3oIH|&9n)BT2;cwT7QZzwHqYM z33Fn?af8LE7i&<&H{eQZ?S>1wiDOiAIQsM|<|WHp&ANE#YP&Ff(+UbPpXNL2oX08=0o@J4M6;s`V>_a$7g1PW3DF}Hg44WEM z&yK1C4M9t~1}i+=!B(o5l$5vZTd{CikH1>^)-_y(a#!rb(JF}QQMTwy3`f{=ljL)f z{ZA#W|-#gm)frY zU^T@twdNJdi??%F0ji8%uY~=CP_m(v?mDi2d8^R@#M(kvknh8rD0}+cTm}P_(K?zc zItk++MzbjvYHI~-$59K2iz}CK5D5JF;gdp|;Bdazeg_b;Q`lZJs@vM|dMf`4ZffOt z8w1=mE6(@2`_i&5aK(@Xcm?!h&GWp(e??K47&ejILw5%v>NKEY_Geo=vr{|usrnQ) zSt4RF$s(2oDAgsz>RPlw2yoQ}hLvM8ZNB3c^~$M+D?F(rj~aJNaV%i?>VoSQnXoQW zNysgNC%Iwp7SFEI8WzLNNp2-1EMiinpz5SDlB!H)0ul0Von)B1buxMDmTj-bv}C^< z7L>FUsKG3DfM6AbVwJwoP$hsxEqPK7a(V*aD`2Lcf(?FrE70qEfvsth9U>N8j|b`@ zn{}@cu>$^X{3OPzc+d|tz{QP%GOlYyqF=O>7*`MV@s#8)9oDdpPQQSwgqYxmk)xX} zNyBOoqpo>_49oizKYkBh4If^1H0n6VRI(1-v~$#{-E)C3O5mJM&tJUy!7J^iN>Hjg zh5TNwpu$S&zJwd#)l41v=jNuriQ;>&3uOR;7BDQ>(SwDO zJK>d@pQ4OuK(Yv@SiWO-F(CPqvJuu)ZX%>RX5X%%EF?C7`yOO&Cp-?u%7R5A( za7Bp2Qk5M@RhHyu3*WNiA<>eDq@AX(yJ}1XBcc=!Yson4RsvRma=`b+ip492a4{aR zt$`4WjHAB`jqaS*&}D{IH9ozgjbGl!ec67(Pv&SPc~DJQRQ4>VDAyfMcK=Y<=%9@v z;T7Di^>bfe#b{*elEohIeEV9Cc?+NSWU|;L|s)lU{ zTC57=_iQfzG{s{2WOA-PAGry~#4wx55`IA+;mcNyG(x3RsTU|!o$s-eVecP-TL@W7 zv=S@}^>@~>;v!;=lSrndEjDEFx}o88KYH}N7f5s$-zbgE>9K}YhyvE%qZSNxdb1`R z(y)qyHDSRqUyH-9%fxU=C^W9%uYUcd)vYEjCb_iwP)y(b^K33()bBCvt(wcAnx1Yi z)_a92)P&-7uesSdniEYV&;auH^o zHy=#u2f_-_R#hCURY3?=C|cPfX3~1ycrzO4{cYy;AoE@+~yD@gkxk zSSVk`LnBvQ%8 zD)K)tY_WALOhd-G^to2I(P=iS7|=qTs$+l^7ljB}_y*qgJnwJKum((5BOSX#1Pg;h zbDKc0mXLQE> z(ngrn-GcH^TzlSwae8Q6*{~|RVswAuz1z2!Y0%d!CywGcsLsA-SoaD7`7c%7BOJ>c zm_A?RRl=gNSm+(x{XCLk@m>Dh2j|`_HC?NO11XyDM{s8EKlk->t7WI0S*dr61rZc5Zf|cC@Oh zkFW-uuYoyy-l$qxK0F+&efHEOnv?c1jirlq;Too8IK}A3MWHycyuZBlIRLrXpl?t;k zD6O~+7u!O&RMg|PGb(_{u{PBF8^borr;}P+x@9!&NtBLxR+AjGtQ5sU6pIA(}ZNqYohNsyHi+xbc| z62zckjA>QCe5x;&Ew#9)+*;byKr4ykWSGG0_ zem~F=_{xx_KkWA~ps_XEp< zs;+IJw4GCkn5gkg)n={H>fO9a42!(iC|Mz1x!g$za5aw-dn(tU>CdS{9~`>>*u2sB ztbRwdYGqR04vqdP?7N*#esgj^+6OQYr|uQA$8Mau-oQ9MpjC}VzPnJxEKv@H9o`(m zES&1_U*y9YwM?5BT?|^Fl8rA zCS@DAWoywYf@K1CZ0ZV+Ne*ZrOM?o_3X*1_7}uUrUMZxK5PJ!sCVWAh?o&Hcv!Y>j zyA9NCA{F7^Ps1{`kVI6+QfL*{f<;{tI+67D2yz)%H43m!-`Hw4%bAOdezR7iBE`BG zTd%v;*c=pwZawSgu?*uLXa^gWvn3~AUvB>t5UYo7tSlSd6<&?8)g7Me`#GSl+fM5A z2Opf9TX7vPvRH>2S{EwFY}v|Vnklx^b@y6NHrDRNU=nU-{p|Afj;zAf3Y~n9Ebi!T zH%H;hn^>f1ZqE7pFs!vOA$gEsIUTYz?9?w`K7JeU>e#WfXYbxVzI=R{77PinW^vv% zLl%G)ykIR#-sW7}v|EfYEH^?gx8-9E{u2bUcqi1NIpNlZni4UHRYs`0u>u$YE$ta) z1D2em5pXah*}yL5UlkLnqe^D!%Bw6tf)L6NM2T;78@m)STQVH@hK%~DZiD{ zwCup7TZ&^PlR=1O%%1GNW>BFoi{0^LdRLZIWLW)x8=l$TfcjNmbwAVKXl7XN0bu<` zdUHs_>d{cb>Yx$pZ@r@Q(FGC1cpaQUk(Mqe4?qYL z^NZ=RxepG_jg^ZMDD_LO{j4gPwb7NStDh4>dMLGHfN`npd7q=?AY`=0M^;t zw{IVBUtSW(Ld+_+=J)pIdA-o;(mG+7MO&n@5OHfif?2$66KoZY-c#7UZ8Z(tim3@V z2Tmdk!`mqexiXAIy0d3jC6C6`OnV(n8uB%5F*VuMClIkDvu_Z%w00$+MNiX4g;3Ap zpmiw-1A;SUc<0-Jt#ovexsoAR1yLp5tRt0io@>Q8cOV7;hd_A0Y#8k`RMG7|DpnNW zAYIUXb%Fl`Ph6#5!rze*YiehwwI|Jljr{16(EIe#l0G(8MRePU;I7D3cyvOJ6&+YV zEMg6=6uQ}!davpFV}}s17-zO~?Rqy)-%&dZI)1JL=tcI?c^vIkzgfR|lai7%V}6P7 z3gs&*4OMEGSG0VrxVbCm;!2h>V_a4Xaf)gV(5X0|%FqPDS)f-q+ZHvfgNbL&vCuKv zYOHCgzL0NpInPVQt?W~zeqMT~u~W2DsMZRYz%m-L4m8CLELz?ZxxCQoJ_@eZhW{1M zX;MMBv$V8){5{00>1hD0yT^|&ub_@KMR2t<3x5~jSUDW=NF!uvLX*T;q>E{jV!08> za#T&YjhCudo*0%#qSm&hXAW}k=fQAQ;lfYAiLUUi@V3mFz#;G(c4d%VX}F@Mo0#%5 ze5{i2{K3tH0YMK}c7|VzYeIQYPu{Yn&f{lGVHmK@fv%so&)Yh%Sfdsrkpe9;Z<%_$ zWIm|Y!hWE-3mJzvt$}G4iB@rWNL*NoVkLPpm`?C}d-*@eIm$*X?0i7+gw~Npg}(e9 ztHKef4MjCIQCEZtvON7NJb+@2ayHb`xn3h*s;}RFwcS+BNyTn^xs`Xk@NMcfbAG-^ z4TU&$uvV*;wzh7z+c$q*D&cY9VSNMpau-@ ztX3)1o#s!_^a;s^8VDdYdf+1gq#uE0jbv8`tWXNULIGj$QWWxB1*-BzqB8g?u>?h38MdDRyueV}@$1MVe^bE6J76;f~m`WjH~!kRD^ zF=Ej&VT&~^il`ilm-#!Egq|@pY9M4r@Jc{SGTxQ5K|$6K$4VTeVI{CZrvresdjD$O zt;u`W%fElFvbf_Krubs6)G4|t>d)bc2Bobw4WlRl>&p00526*`Rd6LianuS@XjnJ{ zOk({Ov)S^z<92De}Rn*7uU6$`qm{nnI?Ep!ywpQ&lI)$!3@8@<}xlTU-4nHV*p9>?3?wITe&661 zJH>{TYXM%h0kDo81H4+FJ_?A%B33&r35j9t}rMw4`(Ge2*CxH#rLm03k zm1IDY7%XbX;q)urj-wSUxGYSs{Q39m1yA}HacwYHa1fNn z$~f=>$ER*>ZBep2m5JzVK&N}c2Xv48>41Xb1fT&C9NTn(?UZ%lH7ORv#eXs8Xa58CE_VH9LlDh8g( z;6Q%5E(*2CB`L=$pU)nU?#1??@N0OBi2>qXHKE!0EM~AFLqrg|;R9h;Jh#S{RX%1| zfi`Aw4p^5LcTEVmCzWlwfpIhAbit}X*YbdAc^_J@qV7b(^Q^R&bRNYG!Ij_dXh+h#} zVbV-ClbW{*9NJJUS@2_~X)*;Gw6gUSb`k>aRJ~5&-claI1c3;EOU|E!|EPSf(Ww@( zc{1-x1f?F+^VM3Q8KgX6 zkS+Vbd8i+yI1EA!J{Ssh(ET~mY-p=2EWs#|=EKfIwI&!Eu~aLdwmF#hj&i{F#cit7 z86cW`xz$_9zBLrDBf1i(OI22+9^mVqo?Z=FY$M3%`p`$ zg+B&ZnR=?0R0~3}yb%)C0o~7GS=ek}{rvh?x|D9>ROUR?gmZshY3DpA1wgd8m}!@- zdx;f?1WRD3d#5O+U^5@- zBqS9{BUK0Ej|oG1`P}T{-R0{z$h}jg^))D`a!}#*>NltAQ?pZ)%QCezh1(KbhcljL zmf$$ERG%Rd_G>v$wl-Th?EyHKoDjZph+KK5U<+`Dy>TEHL*}KROC9kpbF1Ra9+`qc zJC>P=nlxdfgRJXs&h9K-K7RM?F<~~eOi1g5?Kj$--N3Rtda=q_5t2Yh(S6+zuZAFN z5UkMN5bZ+cwL;5eQfgSdp{rLaCS38TQ=TVZF;@oR4j%2y2CIrKWnsn4P_AfiLnSng zPJEPR!VgPFHVIZ3xQa8ln94F5|fibQmrFKs=#Ep4k&87rdV--xxVg| zjw>g7AQ=r3?A{O4MFVBK>SI|*PA$5s7?v#z3zrFnVu^@FUU#BcwGp9f-rqyc8cueP zn6QRFKe-FTWLVA!uloUr<(0-z~zsEa9Y~ zIJ9^KSk@xI`Ze}Hr_(^P$m#9?BjdK56uxb&yz5yPPtUEkabjV@^SnVi<#cl$GhnqK zoQh!qcux<8(6Q_F>n*iw>a_^~2LH|`z*cS&5537QT`pi9*+nweSm-t206!Q>VWA#YMdH^X zE{4Z_*y(Z*z7Vq3xTJ&v5l4GLK}ZDa*s^uTS<;L`}v$q#f#9F?*G=Nx0u?Vu5 zVWmUJGDR$ct8^5xil&NXa4cY0m6$3AH!9k$z_M0Fmx`>YV_5q%A=ZYvT@mM%EHUo# zLW~zq3X+Os>Ecfeptf2ARO^VLaAm7R z2UR16{eh|^w3CC2hEbKPFQ~`Xt3ahNkcO3%L4`)13|p`I7?NyUmyqL#8g_LL0M>6DZPIhxU zE60~-dey2qGn}U+CjH)|Mm+kTZG|Pmm5V4f_K1{QyM<=Rc zSwg2+iJ~-i)uux_yetb6M9Gk5*()0rEn#f{!J^@WHc#)8ly(JCdbmU^5CwiBYQp*? z+xbY(q2X;{Wy;X20#y}q)yE!Dy*6kEk~*3+z3qZU$&g=3KzktlgpoEwiDHmc_<;CT zAY-571ErvXt3b8m;Q0<*+#$Fck8|{C5CA`&rv7Icr3ws-omfP%7_sz%oO;u%NvQg$ zM?sIKET0mRMKt$t2!*L%4Nh34miz-5*1cq`M9p2i|J-`XEoCoWY`f%l&mOwElC963 zUN1XQQ4TQ+_4AZlYQOm=Qmm$f!y<6LAx>URyN=^%4|>|2pF8xy>A4ll84*_CdHGx} z4Yg)5O@UAOE;b$zR89IMp#zB2TTsqz_5eLEU7lS)0ZT`W7W2K<@~LYNUAujawzG7i z?eKZ)t)bgq2Wk4?8Zic&TGdE{iHxa_FD+t5msRXbNCRF?I%PlP*r-E?RUPZLH0u1Z!-P?=H$CuwwUiXwRETUKh zS@X0`XjFwogJJ9(%u9q2N{}(SIHHoQ~Wr!9ag3*f?ukRq(M1U5Za_* znOW@>JM@dH7>8Kw69zOSBmU7a%P;C6O{yFQ!`aRm$x5gaD?24+*(zyN%v!ecs@n!$ zh3F+ltx=&2;UGh99#q1*ImECp0}9dR&ZMfZM&~faB5{k1SU8z*cltdU{=9S6Wg{>5eOP)t@d zr?ubb>*J(ojT1y+Ov9b=JF-m3C1FshP&?rZXMcD1?c>W!B)h{4VUwERIR*_UEVHkP zbZoIWsX6lI>RV0EJf&$QQKMi@roIg)(0vpQ-!oMm=fe?8mxMYidBE0?I52cn)q2+A zdK(80zW@GWlY&NzE8lqJ^N+l=TCQm}#NVI*ZN1G1YEQU0#}MH5$#XpUda{ z&7RS@Q|MiO^C*B6Y!y0JUXyDRbW3*Lj{frKFRwj%ZD3nw1Op7a))ovy{CbAriw-lu zyl}gIeTHz0wI8zvIuNY0nAotqyn=w0g^yK$tP~(txh#NX%2*>9)`+T5wQ;eHRKpbl)`qYt zuJZ(hltQ(ERp5p}z$*6chQJjLd8RS-vW^%trl0D0U9reKiEu(r5c{ZfYB2FC2p#Ok zqk);$AVptjR^VAW>Z&c)c3mWf)^@gp4jJ2%hGD^uO7Z4Eoj4B+(ELkgaue3`nkEiZ`>5)gy zt>@KmmvD-1p#XJE-k&FrXw7Su(CXf3TB#Jyc^(72s!6o6R}-e?<$a49dNNrHdr061 zrngH5?3U#Mb?d9dmQ@ApMb7S(2PTt?kQC=V8 zY_ERp%EXlkJWWiTKOdZ*IB%b)?X~mg?FqaihL22Kc@3UK+b?0i^5`!gVLnS1?IQ!l`+DJ&U*aLs7Udh*F95w@P39JS>Z1kGqiN;v9deToWms{!4;K+QHC|7WDUKVqX}w^SyrrKsOMs>+R)r; zcZ1ghHxvP*ho;$$MGE^aK8dm!?27oTY}*)v6NIw{BdyM{k6r){Gpyv`LxEWrip5G0 zNtjgM4vaD}f?K+|S^5dXh%3ov4{h!!@<&GJBqQ^3lIA^7^#yEKNa{vGMY51u5yg@o z!f^twJ1k}?>u78OHO-@Eah;H39ZAqEV;ejTcyq(-Ms9H6y{UTsac>q2qvt@>)YO`q zfmurST8l>J-n&!L8(Jmwj6C;YishIM(9VdO@L-0O2s?DDwS1|KB0CMtanfUl&VA|X zB~0Ke!h6H<-1&N$6PbWvQCf11rhTDwB~Av5{s8P9b(=*hqg}u$>?EYM!)!L2f_Gg$ zowqD>q;F2L3}hapCQ>TD> z3F$)2LfAsWHDkcmlTU8aX;QQ<5xjB{1nV+z@z$Nh!KqViBv?=p+N(CL5>DTkUS!RE zSrDtfQ%}wAq-IkHSQ@g15vw?WSSDyWrtEI2?v7>H)z!o=2CIs(Jg8-NToGh8wyTGO z;aK_&Y9!R^m6;hcQ2NC_wqP}MSJE6rfj7=42b23$(z}F<@>oJq+*NCiVqamBgRJsJ zvlo)d2r_B6mg#`kQ&#&)71ACgP4ksnB9v2j^9~{x)`Lv1fN0S-5L*K}v8Io`@ZR0G z-#-2ZWuzg+D(}(Tkir`|qJ%Gte7(qL?Hz6k^C~!8Ko(?_(gBlfhUW!xwRjJG%S%Kf z-3Ox@iX%Tfbx}B~JLdp~#VsY$0@JbDbFVB~u8TQ+u66qAO1+CeKx%Ak#X_ZhB|AGi z*(d-2WzZ6e-qBz88r1fTDOe?(hVI}1=oCN`@_?e#@k=gFjTT5F)G7mLmHl~I?C4;F zidsOdmFjPr<=WY!*WRA#cK0?XY5Z|@jRGJhy9>avyr%!=YtNlO|M0`-N)Pxc1=mGAAgBX?uElYrEL+MwQ*hLYqq|;{FR#jsRGZ;|A zlG&?Fuk3KzydJ0;88jICWckO*5wI0Ro$8VFQPme1s20McLCBC|1*YN3R#S0oGmYI& zhPivgqbJNQh)#%BkM{$;3@EwnI!_d zl8iixVud{48x@9oP)&$49BMKkue5me>Y`P0oA^gapFVflqEPoS>LBz1u<9)u)SS*_ zi9F$W!d??C?3qleMB{J}tY}N6%D|$sm)d9=b=jXqn3cuOoHD`{lz3F#>E41;`x*k) zn@6u5y>XOvr{8QYbaR{N43J9DbGx~P#@br5{^t3IUyVQfO8i3n0-a7=xG;Vp-0*h% z0vs;fk!M_p$1gk_fB4mhaYLj70DF$$3#-QSj9vg>cZrR5Y9zPACe)}bN{R@vw-i-gCQS1!G= zbcrj%6qSUjJtkO!S3{Up94rYVb)i#?_UOoF#njp#*M^2Ci#u*e!(tI@8UYI7ilC~Z z`fv!cC}LE+>!z=Y#HvqToT|t3#B0=CmRK7NSVPe= zPH4p9*IRLVsqf=)bG`Rn3v;Nwzo_>{32+`@pg%c;} zK-*8~ctIWTvB52V;ng_ofM35t`1%zCmz0f!U5`D+%w4@H z7l1>hpa7Ff-;2uZ%$GE-$!zDOAzK-7qVxbJk22Q^YrMW$3Gzd6#iIJUE6|jxMCpoa z$f5*y3BVd>#cG@n;&hiq!to?iEMiuOV|^l8<2(Txe!E?pjCp`q09eQ0fEUD$LM+9y z4WvpBU>CW&1gVGZlx zy+F-*3|RHKL+2JtRvF8-v~}^NBbVV1lAZftZqf3*lJBcF8n5U8A4_L4R&NUz?P?Cd zRn0BYh-i%H6W?g|^xXPNncH%(P_)XvZ@I-n9yKfab=QbDA?<|kl7I8cmGf67M3p*! z{#WNGelyv1^P8=OMzyN*`fA<$Lc_li{~X}XPcB?IjQimeCl15@mBWV*KY#e}Ik-6d z6}SU8dVsIcb3@2tti!7eT}Z#qBl!~aqLLB#7Mz|v`Ye;JZ$0|`Z!u{7=4XUjU!3~! z7pJ~BGd1($nW-NmP(|_UIuo#vdHovb)|0t@M0)5VMLAcS97kjPx{mA#E#$RS8F_Rw~g12DLIM7EzYr z5vq2jtx(!;D)yk(evgQ&pc~mtIMO4A3`;Uzyju4Cub+FfWTnOy+kh*X zuYYfKsk}0G=rrIJz?tJ{m7c0pHXu7QnhH$$ zcT=Pa0~b7}(pLl z$o~9Sp2y?4=W#oC`1#0o`1uQPM&vs2IfSmmL(Gea7nYh>F(Pm=YT+hS>(NI)1E9s2 z^~^H@T3`I}6harBaVOXsLB0NI=K4PoZo&1NQ&YcLeuxQHW!0YGs%!e}*<*L_E&^cT z%kvW18VIja%7=xoR5%e{4NvL`k?*_ON?b_2w zv5uX64?n_?VxfwKbemrXmL-VASJX{)p+C>MLs}=ZFB7=j4xv{EcO3BvJDyZKtXD0l zw4}s{AyB3dYanjaDQeVmhf-z=qcp6oFu-&p!67 z6o{Ys7VM`Gw|;i&XV3iRnV&uLML2%(H(z|_iwt0RVD$R&4DK^G>4=Aa!X2giQxDxn zzyic#Ps4iU##xfEup(Tcl5mNQ?x79K^twkFR?%1}G@K3T5&bzvhmNJ|JTu}-?$nKf ze3R5HRM>a9hbK0{Sq%2>J?EhkYJ3P}C5N2~k(pk}0g$o>`BdbN$PDOkG<~4aO3zYF zMrM1d5M)!$>NAN7`BV_q-i?}3CC7*dE6Hq0k*smqX=N~Uxc7x#-J!aX&itLJ(UMh7 zWLQG6)aTcH+0-(-O41y;5ukCiyh5%nO|+C9fs44;zPpd8wZBi-;Cg2tA&U~m3k8ZC z;i#mDEj~193S>E6r1v=*E#ro{qsk>FnGGK@r#=j2YAiGe4m@ieOTu*a;%jx(s4`!F z%!CV3s5DJJ`ej7=bxB( z0_($PaeMU9*BP`va|%%FXRtl6WnyGzeHe6QYyB#; zjz+tfZ8hCFL^3-m8djhB0Q*ub8fjJ(!L(xKHvrKJ_Eax2$B`$8&{bsG&dIA91?*2nB*hnx)n zW_X_GA@^e`cW{KN>NV`<=nvaL($wuP-nl^K+VfE19ggqrOsX^l&&zi^n1e_53n!l| zFCBkl`SK3UMxNcN&+cuOTR7|e@>x51;ul9A9Nhjy=Rd&%NB#u+I{;qqz&;3EwBsgp z>uK2I7ao@F`~-m(m50yX2cUHyP%XeLIKg)6Up|9!Jfhams8(d;!tIN^%SPl2!0efa zPF?%m?}%W5eh1(R z{Z~yutPa%CP+jN!x}Wps%a`h9->n(t+x1PQ4zSr;j z{_Edo#NzFtQ=b9k`j>~WQUvPt8)jdKT|Z;&f-}O`Gru|Y&_lnw_QFvt2wC8+$jlsi zZ6aK?m+12pN`Od3$V-H(0Xk$@#o>j*kp-ayB@4qcv)pwrv#t^)_R0?LvsJn%0+sl$ z>{!?-_))A1nilmV?KKDJ@$jyPgQ^V&$D`UZ230OXs8e#g!Jd*~0J75KlhM!^mY|47 zX(cOE*qLq#4>QU@&Jk6?>}*WvtAMM%n6bt=P)6966o1%37{7z|tnqPbD;y^h#xtTZ zM+f*UQ7l0$gse;GzXq0tkd>Oh$7Y2W3b_V(7o!$W=anrT4sQ|EY5>n-IjcaWq4-J% zh8-9rOOdOhAz&%Ya>L0vnqiHeKygs4SFM`wEi53#@*LkU0mHgDH%8)l@$|X(*ULqk zHjfK{*=#+tlFjFs^#bI2@SS(w(X>mE ztvJlCSa3)W6D*Oj z4)TtM3x(U-wPzWsm9o3*>&Bg7CaD^&!=s)#H#CTSq+zJZ;eu}132M}J`ccHJuz*xV z>sDk6q0A8!KnqkXLnyIJ43;u0m{^uH*ZyQ6S2*S-NQSz)OvTYTF@dr&FhmijlGrOY zGK_0+D?TorgLg#BQnD7wSL1i?^zXm{(5p`zixcb7_r^ux%ltuxh;=EugoE+0GQ`6? zo@g%*?4uD3N15RKB{W0g7$&T9s68>V)FvJM(D9O@jrA9r6{(EJh812F; zL}oxAq+t!}N!8B6+7>_0X3=&`aTyCvY_-UQ1@XLTX7uA zrCbJ@OW|1XXSA%8`{uk>uwO z{`?p5DRj4Y8kinMzk!Ps3b<9t%9R%{jxEBK5+c=BsR>ZERdNZitk%@!AJ6>9^pO`I z54SVwa0Y-YJPGOgL!@kc=fUUy^p2uh-+lhO$g~baeMp$ap3~=mW<7!14}bXBvp;^0$X_g{`Wugy1~4@_Aj6L7jrvx3gGI|qeqWkQFtX$SZD8^MYww7@+Fe6 zc6PF}q2wMmKN}j>NA+Pv77Diwr+Ya6W$JRZ8Jv+XCxY;$@f2tG+fmV2yZ(_!UZ5cL=!RbZeYFT!dK@q`OZu$2zw7^4*tF z-CRM)BAz9PC5QRc9-Q&BZ604Od}fRq!mgYkmuy`+@c|JmpVO$Ni$g`SoGPsru0>MT z1+38Xh3`z*v3kn+Rw-Xni;-e!(0EmlP^?k&Ck|#eEw6doq>?qoxODSpD#dB3a}%Ah;7Ls~_gI_md%^GC7yvli4qr)FPGQQ-fvzUwpc7_PtYXN1~$1>t1^+oU!S{C z&t`llJ@&|tD!HPY#?`(tKn2HBF~=UfRWL-9*8>T#no#m#pct&UFm<$P0lO-tEvN=9A5(DP*UpYDZXr^o zwoo_&idAYtaSF$xn_GJOKY(EYIz6CIvOoS=+BIzb1<~rvU(V3>;+a332?-Y#h|j|b zNY>%!|3L&TEDc|M`m2ChUj@i|?%Tg*(E8z109kK6`__H;g(V_xujBrO*T3+EFVMy7 zU-;VhzxIW%$@cwkz5XcT)s@{VGA*aFj^SM*xntw=Wo^RRVTNV6u-G;_BCkQA)d7wap@1lCg->cZO3Du^s6LuDhX>q(S5uRl_7mcZYoBab`4!{ z`Yc}|_&P%x*Iy90bfx%*2Q_K|Xnj}HECQ`ppMDhp>#IPsp8M@{zopvniKiZW>W9d+ z-XbCXzPIih+P;9NFNE9c_dWXhqv)TnXuLWK3=8VP+Z>N9*)mIYgsa(<0a%fI8B=u+ z6|7OcghsGO(daw1bZ|Rt(-oPO8q+;FF&@@MLs1F7Y&ulJxe~jPY=#fDG?=%OC+Sj^ zhkXTKebR66ZUmi^1Q>)r3cyG`?`zM41|?N<(iMKoCqqxWLM}S=ZM_`WPlk(vLa79M zY{o2EMwB}_{R2R(A1wZWAuEH36=K#-Hid2n)I0Hwwxf5%Dmu!E(2F6fyf<6s0lhTxlE7=; z-(%3)WYFqP<`#08MaeYFMUMm7-`U=OB_38flfRrMvpsO-wvVzyq+qTCIKv8<0^ zR`-2CH5tU-DTZ46aL2Pu05S~q-e6c@bz$=QWJ89(yY=@^uLC{+qe+c@@Y1=tvD1IO zI_B5RB>}W7_*JT0(`ke#z>8GLt*J!TgtIa?x42TLaCcSUiY(`bMt9(LKrTC-?Sk7r z^yLTMec^oO%}_3qgya>H%FB64yfP`Yc@oj`jFwUp%8Ai!tj@Tphkc zde-6Z5@I3G`s%AsE6n<~!YnKg0k#4WYcHdiwT;II!n{UD4zHfdLk6-vE?8v#G zbOgKtf;BA)Rt38V*>8jMCsx>nm7?A;Vpt|#g_8SV!pvam=*V36a3q{K-Sr@f5T`bj z0p8wKOM|>5h!}+^Rnb#$Y@UE~&jF}WNu9v!R!FmuL9uAXgK3htl6~!IP?{HA5DeLL zQXZ~;*!V2{g9K~=wiDvB^<)T!8=HVns=t7dkRRzY0QJM7P&ihfJ?R>?*pJnZD|L%1 zz_^@QOHXR2dtAPjM@&fZNM#>O?u1+bRk+=e1N?*Vk1BM>|Ba1{l^@V{Z0zMR#H`G} z172lF&0^S+5>a4_>@W;se0!Gt$J9ulQbX|e_#~Xm-;-?<01LC@70sGN%-YYRs_cp< z3qw|#%|@;VMIay*)_~a+sG#6h255y}+N!rRfM1!FOx-GBUS0|p^!!|}gmbI07pUOq zPU#_rHDnkKi$lDqH72k3dNhLy)$h~iZj}6bJ8Pv&V~4)}!MP89e$n?rq(h4q{48Be zS9j7W^1(wz*mP>jHR`zT{6!oHT`qE#d&2WZI!BB7dt z5M>DwOT&MA{_wxS{#~{@eC|6>e+M87wuis^91$&rS^!&5z4gRXPrdaNREkd_cwxPW z`&-}S?LIz0{RkUWgq155qA0qz>324i+4NGA5-?ahYBbxXu2Tj7*A6O!uwq$M7-#q47A}&6?1(}nUcmm{l1d2`pL*agFH*Y z)=pNR2&&{tc85VrpHn>7#N2RDFCJR7?``5v<1Qw1lT;Wkbd~hJ&q5Y3E5M)nY~3%5 zw`MT5!;k%k;CxZgW45J!6U zHd{R!NwelP>j+p@`{I~yIo9bz=MEiurCk(s<7G=LlWF@d*|X*|7LC=RWx^UJVgVz< za8dL#0Ajh0b6~ov=QQBY&_RQPRet}=@BZjrfUL*AI)!eAMyHzh^Oj$7Q)57@@Yn_p zhmwBH^|${KXf~Jb3sgCk}t*b5BoP znF!+XhtFg1D2Bh=6G1Y50*&ziWWu#X&sEpY{*)TPK9-6yn)Xiz}J zN!kFJ!1Wo#`T|e}TnS#;>P`d5!ka|Mc<4M2#-RZ?k}WF5px7BiaqlPZaGK1x?#ZD} zLLgRgR^G?^f>q}yzRg#3&$ORFuWp|rGSgU zOA#*K71yFOZ46r`W=%3=HS*-i!imDYR%_PZSz3Zx4}~j4C_K_7F5Lsg%HnOf0Qf3d z^-MNpS>;rz)O1S?JR<-S&2o%tFeqW|NX#&KY55(2dhoXD%CT-TOX^ZU8l5_fzr6d-9K*0hq8L< z>X8?ZoB<;B?mxf#&;N|aci}p4s=vGl+mUw;AHMLD`1xnAT|4^dwV&Q>&2V5Sj*@^s z_RP)t&E;#;6X)X>KKGS(UL=v8R4#(8GpuTzA(r)rcm6*_tnVVv`UkEHu{8Y7SHJTx zkt{&1=LEK%pc4@;!7kc|Hj?Qv24a_T+$%Sxr>Aca!CJfv1)<>8k{(Hz3i}9E1BSE` zriYdZiwE1VoPkwBM^AnhtlH44g9uEjFPi154b*?h=1z~;I;>9xi(*L_yH|gpp}b2t zgYvoejfe%MNg-Gv3lo&UsxhD=@hL$uTaw!QM5Tm!5gO4YiS;2pVm~O$_o2WZfh+>uH@aS6HdI73l^)n04q^37g#%>$tDFTQ`HRLY!Q&1AB`ux|L} zJWV4kB2bNSK3}#(C{%d4a_}!}robxYN&Q`wk00PvzzyJO3 z-~ADsfB&Q3{|F1f2cO3znfUo%K6>q;<)6;{n&yTrG^;$G6(?-fsyI`+*(mupZ?>n~^GDo}Im7(3%fVCmR26-Y*Oi5Yz9PG@ogM&-LWOTL- z#mFS1O*i2JA(JJNq;4^!AP9E(us1kj0r;v^I#cl>t}Spo5t8 z|1b<}tlOEQ0o8CVb4^^A)4Q1pZ+@4z>ZNHn0`&>iXr1>K05x#yHZD z-|(Ws?hj`Hu?#;hJ_PXg<$_~lON*}nG7T|WU5E1yD(nk>xQgAp?QIxtJUV))&{GH( zQkiHl2z(9qEyn?>GEqSPOsa6~*tuiJMn^|JJn_dPM>bzwfQlDsUUYB+u>uhbyM};R zSAk{S*t~h|4OFrSvIJ-mW&zFG2%yz)q2WRmLKfACj9s${w`MPz4TNhpJb}mAh+(fS znzwKsMw}8{we17Iy4x!xceXTaNYH|>dRjl>2x_1>tjVs1kRx=|0b2gjum(AuqcJS0 zScyBAt!_zyeWBds)oCZnRO$uc-{EvW&d62N)bisNd)bc*;hlh{NabKr!Ulbqu#n37 zkZMCDW%Q%X?2L((n~9aE4~c)dEcTMB7aVYqkARn?#ni<}Q{ z15zP&&4zn?G8=&lipF`10Ixbxc3;94tln#1_4X^%=!Vk*uaYqrJ9F_eT7Ue8U(uIX!6;!&*%*engKMMBh$)enQA3^8{x6UGx9iv6oYxF+74UR44y64V0Iawl-Wd-YiF&Aq5wT2T z*{qj_?py~p259vqGOHhUO}jF6#>UsypV+qU7!-ghD2$T;Q)Cm1rc(I#i$~Eif}0cp zr9RsD(MJeVn{V8^_gl1Kp#$R1${`?F$gzf$X>0m)bZ8;Vx{Ak@n>ROO!|(=T)(lw~ z&gj11tuPA?M6Id|RU6@MqW~>tUHJBew*j)=CXs92qD2c4u>i1^?0tvVr+#&9`8AwXhUV|LXskCuQzlq|nQpi=>YSc=XW*4n=gpE$( zQ%>1Ro2e;I%G#6NKB|K7P8N-VVrgzt#tqp9bg8)-0d36D7@Ll(5>UXE0Kemw4p$l) zS(ETeNa&VB@=|toDP(agP)ya-+L;Ve$Ku2Wx+egm4x#7|iYicgv6y2`Sa?}Qd9+6& z?UCD077?y?5@J2ckcHMP?i&ugwfqzy7GT!EDLe*Fz2!u$4W~{qYHirSz_r0~w4C11 z0(W>4WFf~|+In^v<#+5BHq(yaRNy>nHUaoK1FVW`Yq{*{=U85?&BgZWVX z8?StM=ZouKe0d$f3b5+xjTuMg>^(6TO2A=<8z}JmAwxI`6=3NK}PGLqdSB=$nql(l@W}BEY&TjHGMVGRY#$x;J$*am;= zV}(K{nu$_<3#Rn3dk~j>ec^Z&j8Ix@8jzss#49o8X zt$aw%KP!gyMyIroiUP1wGy^Mb*A<)IwO!7Ye`}7=Mk$^f)brbweTrd8S=Ed1UW;o% zw_7kO303M%IUyKP3Y6qyEK7br53sI1rx>vI&;cZC53XC^KqRXbQ0pv7 zS>z+_VHwL5@mRW2UXtoAF2B;WQh{)wfJUuj=z9RFg$yg3Hq!N8Bb+hKFqDM^OD4fq zG>#=8Ko#6_DF&;aR8OIYR;(X5aAHm6UXhzF{ zG>Tnj$P=dBh}d3;0TL7N@qEMFda< zPXRhpsqpC0(UA{-x8vWT2E^KrT9HsqqE?TWI2gDPvMPp#q?m<8VTCYe5y_f%^&XKd zbT~|Hy3xcG3qcDI3oAnnvZ|`^4lrwD)uaQFYvTm~ER2gk)7d8L!Cqm(%95wSn-C@} zN^=*HxGK^}n%s>C>?ADDu(&-a(JI8Ednv){)C>($!jf_pOYgd0^ufDv+>Xc?J?9wJ zbT!Ew(F2YxiDle2EV^_`Wz#HSYGMbs4z>tiJBeY5 zmux0x$wnau9M{U{)f38r<)*HnHDO03Ba5QE1}p+C?h~?rHBKyRTp-rCbsMkSx4$OD zy4{W}>$U(a8?$O&ed|?8vc7$5`CH#EhdX-w7Ov%#r6n)?Hd{`R)xT!|@rp2Ok3=j! z0Ki&Uf~TsG5Q_|1q>-QJF=#DlCN??4&#_W97{Yb$K44jC>KkUl;cQKB;#i`izMi^< z0W*X0eJVVbLd3!^ACFa}NFP*eTpFxEOa7CTbdu_D#L@ ziG*SJpt?@iBT*88LWUy zC2?t3EXr2LnJL@a_UGDh5i>JW=WX>zC_ zgToKg-(-$OmaLnbZ``=CxoLCLT3HsZzTYHBmM9E0qE%HzHv}mGV{|lJ*tlvHGOUGr zm$0J&hY0(7`K<}Q~H*4lBS z%&8doNZP{b!RlIcxK}G?MbBlYkl+eA);OHCTg;Q9+9)~P*z*+am!XU}JJe;Qa8$yrO8V;x|Qg+(Dv zL32@P57VerceR@^=3FivqVSn;x`Qc}x3~9LdI0!VN4+-;-^xZb9?xaQsN%#(X4;U0 zK*h{zjP`l*_Nn34*3tfvxien}iUkxUnL9mrcttjBH0~Sd*!0R^hbKh4aAc+G4|$BP z#+n*$I7lhWaepYT+^CrxO6|O!zTOjmu+cphNEdR!SkSEb&wqPl*WPm(_^OQw6YUK7 zx)?^(;Ak|^t-#pW*|+{WbZ6*t#Zcds9UD(P3}}^NvjQbPpj?%N3J_~S0I*D9G<)L2 ziEU5&dbjrVEm#0`TWCT zT6$I_8VLzg46VQLc>tP;=?9{6RiE?Xv9mc0M=Tc%uJ0aksx{Ht&AK)m|=6v7t#id_B|fUVC@^}_*o zpZE9w1)d4iYQdrq&aI|HQN7=p?&F$ut`uxm(fLed^L?-Ir3kHg1lLf8CEckiW=}Q_F!=+P1(tuM1s~D z)=&9gm#6t9@d1W@Y>Las@OB~T09@(Qsk z`jBHy@0-pl780x*SKtJ^x`E0&9rss5Rk#| z#&kqDgM80%RSs%Jpr)$pg<-8Sz&miQR>w0TTJdgFxh%&LcX&+@Xpw7y_!Y;v3)PCB zjB`aO!3s{gfA(tuTJ0=m!A)S+&Ye4-d_#jQ#H_mnSa%V#zQVB5ukaq9TtnnS$ols4 z<>Hi2{z6X?vOWjU`U{h+JzNzo9TpsGtibkBrdauSQrp$6*MyT97PqK_xWd#|Aix@U zCy_Qtgf{@FOj;J0Mnua6al#mQR_@|?fGhy3L(Q~Vy_I)=wzRaY+p}iwYbTD5;z(gM z*E77~bnBtfHJIXA^PgXA{VL7Bls$=otQVn*YQ7GWx5pb9xlR$?qp1}9kytW%+0lS9 zdtBMSWISOolu9QG1^DNhJ74;@T?;p4G26jYf6Vk7iH_k^w9X8Bq6l`O`uV_*hWh^f z$eite906{X$wkq$KvoK(SHia%&7?Bn#D~Az{?UrXyZUCV`fTafFWsRU5TFVm3r=KM zNUzGn)#b|-C3rQR7}j(mSlBAOa_{Emn@|$2y#f4+R4kxZ-AzESRuf*Gw5!4@p=F7p zP?Uqa1$d!`h1StCONe1zV}6CEQC6@{Z%`(zv&w{J*kjLS;*mp>q8dtlSZYxm3s??Y zgS3gdN&w2G>F)L`f7f1Tw+!hMp$g9Y_6TE<=5}{*EzvY|*>EMs{@6<@0Lta)0lK8| z$}Rm?5_(*sNhl?F%Q;3UKWw5z*|JK_Sha4aBTKzYN3~i@24czfpyXFVzQX<=<;YNT za6-D=b%IqZ5$hma&k|nALqgW=NPDEc2)7739RRX$K$;K>E(a_O&jZuyc^a_lsn$_Mt4C?G z%bGQ79^Urai4!A74;4}e*0lDd4h#>sw)_&Zg1;ZA;qp)_75v zM>))cj`mm#$YCxR3XQ$`*!Anv|IiI!g_U5GD?xxM8Pb|0Z$va)z)73IsaUn$yLx4A z>u}901XTo9NU$CuhIReAQ*l?K`{f~0-tp8J)&c~q=~t;FymA#8)@B5(rp--M5+cLu zre@*l21cxghLeIumFQTzC3H2Ah9xS(Ho~jr*9fk31&fkEI+i+mgt#w2EzFsm)}Sx> zDzo@`azwJ;3zce@5%5ogO#MIPHwL2>kWsE4kOH+!vxf4!8pKIJdP$& znglxEbKnrrsz({DK3g+$&2uB$=FWZXwb$m&Z8A!3pfi!rCo71{E3YB#h_MK#ua1RwaWS$k0IafI|Fu+vC{S z*x5uO2Lvg!^FKGY1pIz)O~R;0WuJ@=XwdTK^FibEZ{GOpmlb_4d~jlvM0T=~B{{N2 zur~O!lJQJB`@4^hyo&<+mFE{eH+ODfY+&n`k6eBP0qP5)SJ%H#4D0&kavIjkJ4CTG zhP9vqz-qyp(^^t0zt~!Rm0VY+}fow3BcW!}63%!*XVh=F0+BIsDStmV7pO6sOGY=E(~u zxIVOqVi5vKJGwxVItcxW=%Y z(}mK&P_0BP4q7PlK51=N>m>wSv5F;R_gcP9@T0p{V^|YvI0q|2hAcP_9t6NTcyQA} z8?uOIJB6H0kqzD15pbQOF$M;EJ3yKM8rba`s(gozU1RqcLA@i;XRyqUAl%; z>+{cmVzo#iYiTQc8`zDNN^zqw>U1{fyK`a=c7@d-onmPi_WyevMS4^;=A|&tVy>CdvVuFPftGlU5NbdI;uTDC;gry9tLDqx~7pNpWGmr4<8uteW z_VoW|4_1U5yr&b?BGj{y8Lq~I{GpT`A)Nj*!o5QS2uS=@C? zs6e_}C5TP-K2!_M%Wby;En#L?kY!C+O2eu}uEiZf5!+x#%LtBjuolp2#rVM$$k!C{77lxA`W_S?x4z_#}pA0m)kO>asT&uijWDpGnYq>n#IbZ^ z%>a-fGYm!HF~TdLTp2Tv0X`N-kHh)%fRl&Tz4zS1&;9^Tnz2U^x03)pT^)Xw++$IH28y|Okl;kj z15vQ0$VkSYDHB6*VnL`}X>WA6=2{wmiag%1(dhMdpxzb3nQHuZcRl;koj?5hM)EM= zSRf%4;uZeER0-C_gW<%;@3tS={L0Xm05VsP91TaKIZyBWT|<{I|HmVj38B7tgh|%r z>*X01)`ZxEBz85VF)U8V5&h29kcxQ zR>F{9E+_ok3`=VgYK3A+MOaz7i{9-Fm~rluw`8V_9oOI%M9ZymW9%IiBG6c=Rw`>< z*%XeeOc|{{bZYLJer3z?mP{H|Vwa_xtCW9qLhBR?8da@vDx_GV%(KK|FZmJNA7mfA zv`3JdC0Ui@VS==FVps zbu2-yMTAR`EqU@waBR7|1ulHNd-oFEE)mE2jJ>36$2x?F#Q~%=QJBNks&RI^D{q5c z6vB5{5NkmA_RAqwnQQ<>%|6uwS0Dha>Cn06bEC(yn0{^=MkbujHm2k8xS95LVE!G= z&cuS4nwLtAwSM;5!_WQXCqS;C7zDUlHD}TKk)!a%f=K|Z)bPwLz5Ch+5{*;d#c9Hw z`+vLn%$`=S z*9%DIH)*Ye7X!5F%#N{OG#AYKy^sIln?G(FB@aV1nM}s*cpB^w*2SYhDEkMu?%K6$ z==$Y~Z;s5_b_j(!Gw~3-{Rs90NyCEk@@0Ph#pTPBG%Pp(-Bto-t(5FaXztUeV~?<} zkFD-kxl6cNN>~V2tECSM;7Ug04QmlL39%w+oSFqF2eqU%9jLJ3htiB?jtir6_b zMUEJ?m3Eii{c}s<%i>%smpvJ1S?W!ay6k!9<9aoyUD80RIU1}|3dQX}O9t?{Er)ug z0vR|U*;4hM+fv!>7HL<);ck(PC3}T5HfZsh95p{Er*gy-z^mGW^MqCBQ)Vh9 zc82xfIo8A7zjMva=Y~hK`}QR=84srWc?S~c8xPlaq`5W>K+TrRPy{i2#?!CQ1b+4L z!bOW#ZN%lq&;0CM>OcXv)g+_74a)}i@9#}`H@%yMGO%l4|NhRFLp|q(w_JEaJwTn1 zUZF^q@khgB0mFw$U6e#BSy-uWG-f6W8Q@o_bah}SQA{3&jRXLeA6FZO&YwTKY{y3k zSFE$w#YtYLY7ie#xEdY#aQpsg3xLzY{cE|i4H5@GJ{62z)?Th?R)mP%ldUsQ%3+m}$ZswafpE(n>JF{BTofGm;I zP-}azq{khLLf}{{_8(kv5D3t5`wU0%i7?+ZJ7WuJlpU+ZA)H;w_jcYpw-s)@)ky{zkJ4iEb0{!#iB+bZvMj2 zzhE>U*F!=TT;a}D)T_>;Y)%<6slXVnmci2}9qZ_=dK!+=qm_eMTrO&)F>=|!EvMmh zeHfrB)mYF zXy3X8cR{BI-+c!ORuA%>U@Au)&5+^k2qEJM#$uU3JRS-MFm)74P!I2*@J~)jM$c#( z$YIb7;BWaxJ2K1fr)n^s15U7E!^nvf3|C2Mm?xDzDa7_v;+=PQEZ(&MM{O=wR5Wet zNyeiwznT4d!Am+;U4BFw8R&kJ;(mE(<D{2p}bn+{mU|so!5$lH5BwXDj2$mGx zKOly+TdNC|!CmsKs*Q^-tXjksApsU5)+woAoo1W6=n?8k?pza2b~S{YOP_xvyf37W zK9?;COU&(Rc#yy=A}69t3c|7)mdr)AGm$m%y~wEy3|C^x*(FR?Ma?KG()6T3)FsSQ z2s+0lP`Mq#m5V8uO|Zn1<0S@9&HU+vH$|rubO}<$H+oB8pj(79*c#PDHBaa8f}C2p zoRCB-^?{;2s5TKQtz8`}4g$qGxPLw|E4%=w7_5L~0bV`i=o=DZ0mUj}$X_Mx1p~-J zmPPlpJDRWxkm@eM6<_q)-6c!tYQu+@>1?~Z84SJE7I1_L*+AABGK~%vtxWg>O($f*yGKqOD-5So@K-TI zG~|;uJsyhLiu1?D^1i+35v4J~xDc$8g0dxX>qYojc5v~oAsl4Byt3jCFT6I|!|SUD zw*H?(SOb2c%0Th_0UT@PWz1Mcs1kODJCa}ly+Ye4QmknruYnjA*|3^ObSEPgsaUJ; zJ1W8kSqe5d@XDTkX25#+65>@q8XCxg#j7WnU)5`2?mpW!TBaHl3~RF7UZT4D?TS!3 z-OJ7mx(J*qb$-Ru&JwjAJAjMWeZ3 z20+PMU*BO$bv;f)fCOLY9A&A!9x6Uh$k9Ovg|j2g;X=XmcEP(sCWd8s>J!v#G(CQr zmk#>YjIyIWNzn^ZZKtVee<6|GGPq+gl!B;JO>f#b0#xi`H0lqe6Z;?g4}n(>hbTY2 z?jTqz8Le>anITKFG$6xTfDG$RnbvUc<_%R7-dL+_SWVpsT8d%OZMTrIO0lYnG%TtJ z1;ZkO)xUhtz@DrO_mElc?7`~r@nUfSSYw7!R&<|S6PAl~4>{9i$T+Gvm4qmI0yh`j z1|?)MR7p>jj#GnxLzNF&L+G}Lpb4fTB9MU-+XXyX_FQ36r8q=f9D%H+2zjeB!w1tQ zATE5X@nwdFV>$^lmtO0BC_ zta`51lHBESkilwP6om5$tq8I3M!>}tqOE7qjA5}@yp4#(9^lSSMX&^9{T&C9tTsA{ zY6%$&@v0RYh1@A*V*@cP9#KZUCKk&B0O0&zP$t2kTE$Q$CYIsCF+iRMYz3@peX6y! z^{LleAASANbw^)3`r+Vr?b&n&7)&^aQB`4YJ!W{uQD8!7iHA(Y!zl2jXs)N_mSq z5>DmXj9|L=cPp;!TJYud{}&ag>D@=q!CyBYPX>+NKd*S~x=yUVcrdlP18{|i1&~#7 z2jzC#Fp6;12Lx-nur&zD9eadVkY6c=b-!tK_YAnZuOZg%ZuT^2SeCQI zqs({3qi8LmW^dPYE9t;;JH~I+N2mRXNuraK_h%IST#7L6jj;`@!Av#3NY1*x)TQAx0% z6ud)d#q!mVf-D3pVpxP%(_}>m1PeJ99jh^{f#_8?cM7{T!M&lXp|l?4w|Qsuy!CUj zBJ2mm+B1;-jo??OS#qzJ3`;G`86$!vJq=@UI)fS<9YRm}paw@ovRx9o$_@|en+GG< z42)<&?g&;90a^6aZUzcuis)8$mlUXE+-MO#1wVr7ydvj}!WSuubrihf%aY5#RJ6MT zv(&hbLx=G?3`ljDfor~^Sjw6;{;yx(#?-9HAoJtO&LxOd zc;AV4XWlqd4x2hv%_!b4!RpKzWLa%o6r#6*8->FtyVI`1fSAvrG3bm;*yA#Aj0cu| zf>#|lbl{LZ2#7G%N;oBvYTdf`-g|G|doRAXZC>?AI)ejxjoEZAlnJLXbr?%QG(5l~ ze4~eHHW>$&bGg9SflF%+v^J-DQivxQ*b>jBG8vT68#hgP<+~|Uw*Gm`hT%ehvhv`a z7}JpP3v>#Fq?gnYOUhNCM}#+FCRVQHL~EhYT_GkCEI|uo!z!B*n*YLuxj0o zPND;^YV`mttJZC=LKUNdmU<$G4GG8`=65DqM7$(UO$a9z&q7Pr=s{r{tzAJ?;eMfC z&7Y5mg(n`8Vm(Bn7P2frtnp``{nw(PST4>7!evaIX9Q-Qk=%)I`0xh2kKehZlV9#U zbEXp!i}8vOYs;m(mo6bla`A+0P#S$)ate>5Q4KscFv!Jn1m%??|!Y86%C$-s8Z0;7Oc3 zP;tb_Lo=b~Jl7meHJ^)$J|z$`jIil#Z~wY|)7Jg(v>XVhaBeRneFlQH8Wa5PueSSy4JRF=IhZ?2z;!_bEZ!9jfHil^C6?T|KZwf!5)?IBFA75L z5&Ce9uuEfDI=?E*uzsv44CO=i5{mNP_7a;r28vQmIOx(W43%!yuSDTjcE_{Zo_=<# zu)d<$;#G{u9CqSSglcZ-w^G4<;td&wWvfe4t8zJoa;dnxEomur>+M2q%a^5Ft}NTf zplevwDillWENZfq7R10@iis8P#<8erXcH_N%F!bHYI)s+7|I#9MXYfmS)v*Qyh4J7 zU?uR1G_6hZA3_m}hIYoEwUA*UTtz67-~RUxC2 z(}3^c@!#QwQ1xrTs^9+%kDvbZr+`@D#`f>p2Mi;T2pj1H3QmAQ9buZ=VgVa-Ptw+JO@jlBbeoIf`Mi zS<3!or_aGsP6u1LvTazFv|$Nbsa2L?37flHncU$TuNAQ}JePx2AwZVUuL!R+hIN?4 ztocl_(ElzF3oAkt2#F#y{3x_KBbb$__<%}DxH==C>I}n~KsEdjlHRuvVtwAv9IK@j z#|npAhYt-8GlMEL1D(QZ2^02YY}M0;93^1O>yNg)EEciuVy}=E3pXVNz6Y;W51BnCek>CdLq=`q^z2MntY*BVAeJ*VLk%2zZV?RWaHVu3{K=;$yG z<%CR{+A%sjQ0ia>8Z!eq`mqYK*e)y#c%KWWa2&ep$;TJ`(AT}KrFU`PH}ghEp?r-} z$Y{(QSkk#-=z;ornUav^2W5+J61}2*s?+;^(7J>-xg?acgsM$QD%O2Y@9TEVKF?7l z;RSW4Tn)gm=C)nB_Bj!(4U;;AV(vMuEvVN`4P#Ed{lO;p$*Q|8V(EYtsT6vxBc>1g zf}%_;I;IE*^(PTM09i&KE8mr+W^}Me$m?*}-B7gSWr$%#WWcCGDuye&gXgle;*h|} zWtDL*NYFbj14!N4qAd%iYNmI)!jlwBr5&pYLbsX_tY)57OFN=zmjr$2 zL^W$x9OBL!b0(N(!LxB8VIjjJg0){TEC8&-3awaqKTHk>KrOOm0bZeo1&~$ba-ArY z4NtNf1QcTA+ABbb*p-5;&dyHzIn{(@Abt7LrJ2aFkYw!vo`p<{LF?(^=3&97q+j7_ zRRR*J!m~w^D!A6X_~OHGyr_T*4n!)#s$YBzc=hQse;l0h-MhHd0qvY&BR~y9e>hE9 zptM~c8-^IZ0G!D0JF)GTDO}-@`{l(Pjugh?$()h!X1%@dBm!o-bH~DwY&KEIMPsbJ z*Wr57U>pVfn7vJ!Y#E_UhywqlO2tz;*?psjaLs8d8h}qBt0x43LG(RjV#E z2)w!=MhO?$8Wz@rvLaN$$Uv~zgynNsuzoDJ??(uhzVzA8i&VubRl`ZEB9&ZHXfQ^5 zy#^yfc}JqfPb%r2YeaYH9AQ!IZnk@c0;z2Ay(ldW!V;=*%*|#{VT-ryP*Im<3t9RI zvzjh+*)a`vi}1MH&KI@CER2DXc`$Z6aKcg>1s%I2EVfsPOd2*1t{vI&wU?(uFfKH}sURsrx`x@P8@nV)^O4pB>jmNY0F zI`lLEmGD&wUiCVvRigeA72t~xBUsr$_0yjzr256Dzxec-k3Z$b=ofapvb8r%8SJG;-js{%UC;6{vau5ZqmCDfI5Z$K>pL?I(Bvifzmff3fG^s{mH|g%8BJ9?p8YHhG zncYS#e3KZ~`ni`zu2BdUvnvN;;ZV+`tWi0bGd9WPt_NV551>~ns-X?n5zRYZe;D`gv{s0Py9=gTgk;8s%(AC@(tEDEVvI3Fv*@n;dQid3Ex!8)U%)fx6! zEoq|{u|V7_p4lMAtg7=2^DY7{0l@Ny zqLTrOrk*Lu4-gAYSRvC$?CdQBXn8~`(B&I5Lo9XKqlUCQvCbiU#RF*?evSr)vqz7P z7E+mJgey#x$mL?_oJcSI&2LU`*|GWNm8*SMffP;0or6PwOV@uyzJe1`ip*D9laRrx zf^F`iM@STF8f#crSj58Rglj3&y}M}!YgqTY_0eZGFo+Fbyz5IsmSR{hzkKO)Qr!2b zExd_gDhSUmJ*(yjZL}IIlQim#?JK*Ekf18>U|0@YLzzxtrSQ6o$-xLyD#EBDVwAS! z%Vt;+w;nV)Naib6t;iSU7BkL7uE@N=0S$JDpB&AR%TwKs`DBND&f>XnJg5jPm)0db zuA;82Nf73qG>PN3+|K5nK2|6ZY{D@FZRu_-1$wpmY$2@{RH+Rdku2eA!X6^5wM`AR zD_Fr26``b8f?-Wjh;>+K@2VzbhDERcf;Q|znLDaaY1sJc3 z+XZ2nbrW)(VpnhP?|OYS!M2>jK>zE}W%N~AqITNs4q-e@lYN-z? zp-v^qSB?ljtzYPv#gTjEb*80_J4>ULBj3GNB9!IWOmDd-H4!a|WD_)#GohzoX?gAl zTFkIkJP5C*IMggjv4CNrhDEQ=JR# z17K_K8TiEts5Q6kxw&x896`wHU$YKj>ruchyu_`*4w-GlG;xG)}MaJnW` zI5GSGdFq$w#EkMLhc<^{21kXL%i4X6sx$nM~_wJY0orES3x1WQ{oVYxLM~ z2&>kS;I0HMp$O58>U&*S_s&(5I_gYm($}S<*ii}Z~jaCy%!a68bETLiPkTpdh z))a|Y=yc$+klTdgx5u$0bQ8lmqxcn_ZGbv^5w6-0miV>3@23t96S-Uo_l!B$QnANeO^kq44O@bC}>4 zOGZ-{qsbhATOl3DWT2eexwE~!y>f8jbFBd*QHZhtMQc=X*J)`*SW3B~>C**Yb|4YP zg<}-1>i3hxg>hPF#=;-4cs`bNz+NnlyI+&Qu>i7iQQQEOhtJPpoGEWdOmz5y!9epc z9LIpA9vU4zI(l?u%{D-;g&XJWn1TE0aX0;t*g&}QG8crGxgK0ORN?FoR#4I?XEnU3 zP3BDdMu=EzNq67eq&5?BlhDR2VR3IzNL6LCEs0pq%!BWNxtC@Ng4IF{OLPc{VRfnP z6GX2h#hPTnn!N7W)KihgGg_c3IaZ#~E9Q)siKuWsIs8md(8S=TCLu!>zRQ-~BVs~_ zo~i|e#X)JeqL?dg|M3Pdk;q{0X{Oy>_F{Sxy4)_erH$iA5$m{$A7#Sjb`q=OmS(lm zldnn(!buFva!+12;kdVSa^<+$;eB$Uq0ri8chC|H3)_NLb*=EWPgwR0p(qR)ve4wd zVuiA~&o5zEQy99qE+p|CBeQ6=4iGF-3p*Ef5`zM6g*9Ls+<;vnShbOSB_%AzEv^C= zb_$@X-oAa#_Ui3(s^=V^18*)|b(~;q-n_l@DCKkgTsWTF_T0nU0F~A}ERGlPpl3gO z`1jj>&lMm`RUeDyA9AYF?`sW7q_Q7gB}h9@2?Yfu3A6p7A8IiF)rq&A!gP z{fXf;30QzN0=Go=ODVBZCem0ao#@Ghj6`BMhtXETuz(8J`Jf6XbtqVba)DGljynjG z7tiNtb#*dY7YBkkW_F?Hw6U?KKH&)leE?UjiPqDHu)PY;(4g@;+>Wl9dt&29fLiw! z0A}40^Ef<1SaGLhfKaWT=$k&hLNKg1)y^C!3BS?Wgp`Pd`|4*j-CxZ`VQCVUCSaA~ z)uNB*t^Y~e%gbfNEzo>tv*9BDao|# z?G(Hqhj|qN(ZU176#{ebx3=3s)^%gs3%d z-uihGwdT(K$+m4j-S*Rm;oJt*-|q>eeuhHTPvD^X@0n+~_?zu4{@#B3?b!@fh*pwT z0b1?ue*gWGyH8e~tZJCEzkO4C8duUlX}Hr<=QnBw(%~_mF&2!6OiDbC`3)=%WAMG6 zI#h_(#Zm=|N`?xI#*pKgF{lhfrl+PiyJ0wx=RBFDWLL>pSp`eD+@aXaemIgy*PngMijWw5OnO!*ERSlW8} zbn7AXuN_$0vZufG(4k+Vp{+1HI@&*S;&(@;{`);7T9?s!g%df{B&=9jv9hE?INeTa zP%74&?8HJ9Yb`YjH#bd{yPvyJ$HGFuQ7_ z8W6Dxp=$d=L@IIYfU|Z-Ej{kQ7v|tOXU_IHfLd@YS~zdfym_y^hM@Hmbs#{Yq%KhE zWG$iICA6$scWLUCv$C{Vl5^*dr7~kIO`DQcp?G7$UOuS1+-d5W z3qv)Jqecof5ld=VEM3JOD7h2Fcsfoe-s#N-@^zT~huIXS849u)BIaj9 zR?J_jfyGguk76`(4E`EH4BE+|JKlsZ=&d&p^ZfA`b_P-uy91Q!V)Wwqo*rN8XX}7$ zUA%Y^qgn$#K(pb|mX?vdJ2v0DS248mGD+?$D<+K*PM4U)qlD9^zljV>P7~fEip8O$ zYsIqqrf$j{g;NVju2NZ}n%Dh;#4mKZKSR`dCUyxou!hy5Nh zoe8D(+@Mshv}J>i9wAaHH!t&Ya~(($mQ`z?Qq7VJpI3-HtQERzbQa;&VS=n#wvZ(- z3%#Svu;4#wNx!&4=B;-QVxFYrowe0Ik|hCbv>glK9=NPwC_<)s!>ucH@QC#=bH@4S!VrEB&fp#mX@BAUb zvAiRh(KJaN~S3QA3qUGA&k9JJm43(jRtBO)zgYCj%r@I!{aP{U*8R55f z?Nk)8uqMRS&**K?@k#~E*eIp-3#DD8dHkw)0|E;$yNvk=B260@YW z-R%E5x&vmmNT-?#w+LY zR0qY<;YtFb=nPImEX$$9JF*(6Td4O0Ywa%K1Swg<-@xjXh{3Ws7B>w^#adB&kb8tH zl+PXEiX^Nj4ijcEb}?WP#llbrWLOrpE6|2jd4~IdZF`rr?Ik{n) zsvU$+oB4bkZg97GE51djH5D*x2Cyx-o=4bvo=|J!##I{^U4RR|k!LTufVXF$lmjk> z-`{Tw6=b)#)1c~o0xC(WPQJf-_3HOOc^}~F0)o|huRrxanh~om<|tHyK70>76p;Q31tQePuu}opOrGPS15O_-z03n{lDdXIMfdOD4PGl2Cly-mxqj_Ab5zWVJqZaxUqB_b!IT(+_pN;G* zNGvXtt~Y=q4!|Fac2twl5_urP)I}gyNqL;_0e(eE&*YgnJ+OQ^ZdSgwcg~I@bE>EI zVSu|T3|Ce-l=ta;@o)~S?tNSnVo`Wggkm+VWr8(B#3bL>_vT0$ODs;+rU@@l9u^jb z>wnTV_c_%iJk1)`QaSjXwi(u#&9JyCbh@x;kU*Rd_BE7eViprxn6VS0yqQ>F#75Wrl?sR;RGDQ#p7> zlz>zL0YT^cs9(LbD?1ld@FB+Z|16v zZxcqntxxz9NLB4_V3hjc{gXCKsmIlyto{Tb>*Vh5X9HTTd+I6FbFiS|1Gq-6%bPZ8 z+P#1c@euac;xYK~Pnf}YaLi|<&IhPO^M_3U730H0Xm&3gD)b=NNhUMVx?nWb0f5z; zs7H!r8Y!$H<4H-d9*9@5&_Hiu%pXc866rz?&?Xv8mWo%XN9B{63I>06Dj5@DGciAw ze<2J_4Rtjd%mg_zFj>clbuoBR{zI{lP5r~gs7$8`dg=#imMweht84vxx9?bZVr0vX zX=NGKbO}}!3mC2zC?D3Ys{*f>U~Q%zVG|Lo8TU(7cWqi#i_Sl2$= zvjHepVguW-*wcWBPsqnbBn9pf&;vGI-Sq#^eecpVy2$(d zlJrB3f=>uVtaKcOs>VjI39r;Q)_6_7*)>K25iu+i?G2%0EropCcdWTUKmRc#F?p!G zj1(p#8y$(XAy>YZGhjIhmSQLO=?= zW(bo>rLB~qibeV4Mf!I#e$`#fT_osYU<~ z(>V-F>k`U7q1r=%(}ZhDbVuuGli2;NQ>+GEzq&9f!jFe@<~}zvlNi=%+@rMAVZ%a# z<&$V77}gkd2?LXpWe~5*OcG8WBFrn@9YrjoQie2eqNt2>m+=gYQC#`a+xh}R_G6Lt z-A+R;3JbhTbPo}Pxb&k%IcQrD(iLZlsw|lZoib z4ex*~2Mu%h+p8TJfz_5wl(Dx^h;Zau;To;h)hw~IoW3Lhd@sIH($ z_gY|Bq9#;>&#bvWfmro~KBWU6A)KSsCUm)uF9eRYP}mg~GOLnEHFbwXDTJtL_oglG zn>OvNgBOdnFB}v|;kOO&S~#ipNy&JwKuajd$rXzkUL)l3HrD(7_4V~K$|lAHD~YHj4n`>WhhB^( zZ2-%gzQjQ9mMvRG_O`8QeY&~F*D`Uhq($hEvHFl=RWM>{8WvTAq+qR8c-15{EEKWs zH{9n0Kbv9EFP_pwtc_R_0>he1Z9=XHNpe?B!gN;$CpGxkG)k@ptOgasI z?02VQeT(%pz!99xOON+-L!-#@v!dv!OeQu2W3%%xWAAf+Eo_wUbHIB)KApBo8M16*H2WUpD}Zoxkt+<>K@oAjHR;yoCxxI{1nH43lZaXH7Ix5>-?$?%E3&akV<8O z$zU{(#h@2TN^d=~w0cFclJX*=B`6lXl$Yp5H6qlYxpd35Eh95qMh}symm1si=LHos z|Ez3SPA`^RN+=i>w+Zjvyn={zLvGGt>nJUu5F*w|J$1CIp(Jh8&hWdy!-R7M!$Mbs zTt30!$WRgbxFYNlDwaq`)+Ma-%7aCsd)bAAeob(fpcUgLp>(<{@0E(_L)R$3>8_NM zIJ`Ay(8ZQ_x-XK>Rdhi;IH*%BEF6n!Kt~Ma7J2HK!x@-iQ8q)wEd~i?3>L4UC_0wY zyA*Tc5cr~dQi4_4y*JLMrA7v;M9UJ_ggzZeyL0HOwMPss32QX{Tx$;^+5zyAa&co& zF9n5qg?kCdWv~n}tQFiOq>@k)tgWPBA;o$E(Tbkis{7%?o48AOa2&xCkL_@hTR|%8 ztf`Y!b?+W9C<3SjeG3-QZPL+)7vWdmE@EBx5V8QYuH4vsW9nvmjJA6QCY9XB2unEa z13^lllvetEQWmdfR0Cd(jNn3ffUA5m8PhpS^dh{O%o$@*%$BOD2_tnu!14rR0b?u} z!^IQH7!j>_EI6F~-AI9Iw^%M!7)wRb8%j73^FR?9?&A4r6^Z=74q<&F=Qq8L*#xgk z4F>(R_(CnRkNHa$Lqj<@oQh^r87LiNxj+;+T4Q|(XK`>dD=xN>AFXL#3{C`Kh*wN1 z@o$WUY~a9fOX3iM)y33BC>PJCQrU?G6&2F$&S14tCs-8=rfU_U=n`IKydsX(gad`r zIx41fP{%^JI$5RdsxPye5RDDMuzvsYa{yRbw2ihbJw2@Eo`rAJNBl~-8peoTjZNB? z6B3$xIo~LcKP&Ajq({rds3dg6_UR0ZHb%LGt05u>b6AZp;#-46ts)ALgoH(J4Mv1B zlp!m^qtS9Q+QG0?eyCbaF9v!z6pN&)qTAs%K!#OX&rL$6l8Vt?PQ04Lu$*}^Zs#rv znakju*paK8Wsi|J5n5^_M+CW-xh$ktL8Yn(&6;)CA|>I$nUYY3hvX>V1ZLYB0Tt^D%$8qtS~y=>xbj8VwLhNv){EF7_EJ!99m&RQRjJg64UD%;WVMGP_iM z!sLTXz$6xg9IpjfmCFTsaNTT=uczl9QaQjX!mEoHQ@;NF3(8ut?6uGA9<>P;1vcD} zkcE9hkvn?7X$A*2-0wblA8D2h#Zo1q>=ugU&ljW<>(WTS*iXOIwqYS&b@m72eAu53%HnAeLn3bH=Q^U&R!kW1OP?XC;WuTla5V% zi4(40z3|De;K|yl)$U3JtV?T#dveKSnICBT$2{cSnLq$S4XYkU2#xx#T#Oh>ES3c1 zN(OUd*}-hUkHN|v=|awyxe@O?2vjCs;VSBD8zou}UGP1GlhK-6i8 z=fyhOYq5OJt`~!5AeYC__4rLsDDFhYWStX{m1>2cl@I1psb*Z_LB@`Y(ThP~opcXy z6+M5^cWp(VHkq^1!La(IbM%Kk*05;#^SzrluZW6pEjmXPUUkd)=aYhB?RFTlaD(av zZJ8>|?${=rJF~wZ2^Q3Z0}kI|)g!8mwft6|omTyJ^5srOmj+Vv1s9kcvH*vXt_6`iMnZmw+xU zAqx@9idZhWGnMF-CGG7+w@!;(b`#N=ZLDo^F0rXwHY_=SN-qYj5?$W;rQM=a=vG6F zf=Y=$wN`GVmw#ZbHlHY7sI_btmL)P9FwkAJ3sI>H7En_7F5p>L z1mwu3LanFWf>vYEsbj$t^qqoCu#j!FxPk;Jc=q|GZ*+ zu(GprN!!TG7R=+EG%2IQi9bEyLtm&LHFw&?)zy)U%kjP-;7~FaHNO7yI~x*s_)^Z{ znT(miSY=*Pt>{geBh=x`g+d0ZW~R~6kv76nTdmR_HOdrCQQB2qT`-EDg=?ezh7kfr zm&^Z{xKGpyNL3Kq2eii{bsk9-AQbfw^Y9QP^G>chfc974V#v@%PYgh2wUkl(?r6vK)Mig;^w75Q+Wp=B$2FtBVLbn5^^cEpWSe6(igma>H zobZZWqxH>ZLk3$N@EH!)r& zMw+{UPA5-Sm%lD4>{0$;E(mli*t>uKI|JF@B*t>$>qO<)U?`3|S~18ymdkM;F_tWW zNPMT!XaqxDxG*(F*`t^spHvC&lX``41Pi`GE*j6r>VU%4g%GOv2>!@F2z4t)s`IJy zx%0VP4p9l{6y1_=<)g_UKIfB=E4Q?Bm)0UI8G+V9k~OP4i&$&rG$EO>X3W57cg`I> zNd=+eSXFv-g9I&E6TY^7J!YaoP1thU#w!svn(p$E*Bwhj#;dW?DEIUFT#f{+2U$n+ zLc_}2qlE0ka#h-C$j&|?-e?U=QPbfgDp!U}LP@VwD3-f2V%LH~*J4ite4NFZ4H2;_ zRi?_2r!}>9~%kI`HY8>(?)T2`3>JVU|d=lnV~TukLRMu^6;&-9oTJ zw4&!P+ZH2SMVla)eD4Jc+ul0FWkBbf93h(z_FHXS+?cc=l$8%VP7DJ z(|Y9;CinqQ<)TR%g7#)mPx5pG?3G+lhy|fujCC!0w=V=F4aDn~$tbszjiFXD@sqXq9pn-(&xyp32Fag^FSzM!JSKdQ9}u`cYJ{)3=c zB6ai|QnA)b5sPK_)iXHPogl0Gq+F-E+YWfQ#|lp}#hQHq0c$-PvHH=5wZYDoIXest zORDYwS6y~d$owjxF)W>5g(i>ZP}Hcfj%skF7?!kNNvu-QeJ&2~6DWpM3Imc6wTdF% zy;vDxCqr@2-jJ0(kZU#W#UlNgpYiD6Muh)^|w3`@GOkYP;{ z-N}bVo`zY7QnO|~F^i5@_<@d@J<-mYAMzxLtz z2gmynfjVW4=ral>P=Ol`E#KhHvo;6 z7GIu531gWMu6PY9oWKxxhLLz(9z}EpEITV1AR>=L)`mY+?`=$U;D`HTLGrB2jT5D% zY83bJ09wJ3tixzQ04&qfA=7~a?*r5I=T}8aQaZ}FbtQ938T1Qv2jzws7QaBqBv{ak0 z!Pc;7o9d#E=lx_Zwh3D{v?NZqItUh2gaWTnb|2Fge0iK;C4Hl0Y4ALlU4=>~pGn0s z=n__UqF93wek1`t!t#5i9XpCOqNwi_ctvPVM_S>FMJ*;-#9`3~ zMA)%Vbn8BKhx1(q)s{NK`GXkRF}$UTI!;gnpCx0#$1Uup@?tS5**w* z!xEHAgD&B1m>{eYCyzc8SUGm)JU(TyvS9&C(Fw<2XFc)C6R*573$MSvGV8B@eP!3I zU9U`=wQJfgv@Y}sZiVa$VCT*dmw!4|Ax?b(hkAndj9r)M4r$g9Ll$8cvaBE8#9!Z6 z-xMXsH*enj$D9B7<~KM0@fM!Hvd3r4Qi~9Nun?w_arSyn zD)2D#3ZX8Js6x{^^z&tU%up}}RU%rl@LzzpJnB_g2<8#15UBvCf=MD(c|xc>8ncLB ziN}k1N-o6@g(m=L!LH6%;Qxo(qpGcmD9)%e7wE7#&r z7u8ZGveC?1yggPhBO{1HQY=Upw037*rymw%6Z1NIOgKAvTAp81PORbZ~U?(4qp z>)z7M5St9FN^q#MWHl${v2e(+nYU43p@gn2Y^D{_0#KP|vO|3bsmPvTRl6FRE0uD9 zRqK*3BMhr;wm;CYK(H96aBOb=<>vP`&pV)^8_urt6X(yIpKzq={6yD;Sgg3?2W|a< z@+zRy3h-%#u9X#iVvw~aT#FYWOivHgTPW`{!YucBI5XppWxDHKb|;~hJMPm1;a0Ch ztKR!3;s?EExN^|7JhAC`A<1uTvsY%<|F|BF_x1h!(R=SXl6BL4dmni9*43+f_Bh;f zRnx`AMfcIo9eaJ>!e^)c@qb4`F)<YR>zu41L_lraCzyE&E#n?nm zk#Hi2hWKF-e{%i$y@$G2l}hXR=he2%eOlprfd9#Wdk0m+);Upj^-zo(!4Jtlb^$j#6H zVqIWrsXn>|FB;a7UGE;@qVQcotB+w6|SY*XbME!U8=l1$1r3&wr!u}MP<^wV-s(viLBUTzMu zu;gc&W2rKfpsb0b>yj>0;b0jxHsByh{lAQI6{v{iunOnP-`jkd&X>E~or9-|uFb&z z3E67ei&jexu$V}#tN^FzVP$Bgg`ddX%Fx=%>RJn77O^ZWK$zaZ_B=_8W2X;iho586 zI=AdN7DJYUE55(q>rhLc+z%>3u&fjJ8zweU%yzf6Q+sor4o9@om-=4$?}S?KIm~+1 zQLW2YukPEk$KCb3-m`$EtyD4|E78vQACeKBs8*epU%8?qW&b$#&;NY#rIWi4?di!@ zr5^)**x^-dbznjYS1CuTk?K^AV$ldtG5ddZQeD$S+Pj3xBsBUWR-zUmeYwN^7fSqu zh!yVK|4h*lFZ>9-Z~){876X^No1daeka3H#>-QyQS->?yvfuM>W5(qO+0^{P!O{Bq zjp<~JU!$)I>)lt%8EX{Y`_sL9Dq`t!!WTruI--*b9}8RsGljcEyn@4lH-OP_&iB9n z+KX>Ez}kP{7uF+msC7teSbNYUH1lZOHY#;tFrqVDYxJ3Se3fDaA#CoNI9dpH<`hI+ z2V_OuBGeG~R7Pl5AxxL?gHWm!^kIK<+z<6I-5mg8BDX7$eW%0XCl;y&&{wpexN zOA5kGQs26pMz4>;m9buNh!vHeqz}95@X@26KjI17SKa9_%hiaEZ8^N!^ZK5JeV;8X z^juu1>!|B=>}z;v|#zyBZUODBK$i=O#hoDpG(1YGV@In;5`tsD;J zs7Rbry(tS;)hfjueYumOMzB*V3N{ttNH4k9$ByOr(ft;W=ImKeg2jqEFlzyU?nJJJ zO~gWA!&V7?+93?)a~x)s>VlCR-zH4?SwjC##6T9d38@w=NKRiQT|-TqiOlFg46C5K zQ`Hm-uLFte=nh8wi`+Miv_WWfU@DjzOe9$GL$u}SV69GIyev$LT;&@7{TM)2!hK%W z6BO2^s;@--rmQ(vEu}vCj_$?uKwl3n~#?#CeAl)f?|z=NzOXJs4-jU#W8cEU>khie1@1s=!6BD>XAcTTlDv8@E?&I2*t6&I&0id<>zPO5=X@^5 zwORI9F;}A34zj2lSIPli++B{U#3G@KV_ziq=5r;4iBk4D;UN7`sR+1oKP!}~1Zm3s zH;J7cD+#N@e}%Xe!PPMURV~QUBgd*1N>JJopA=kVl$R|O5j9rR@N0@Wt$W92KQk7V2y}S8HfH> zw5pNQP!qwzy0SUxfA=BFUa*%<6qy)xvn9`x=x&`srCJpqJgRY{{e1Ro+GzV|d-o`} z0393o%T1JlTOrlU({#NvO>hN20#Peefkv*h?if)ME@EOAMSIA_2{5G z{_(xZ_o#Dt>HtLp+`6^rmP4nWeLZ^?=yb=P&*;9V=k+~37kd_a=;~R#*u%%g#YG2T z^K5d$vFOl?2ATcg-#C^l;hn{N4%$2+Q?7*f916K#FO>jKgk^M*h<=PnR;h>wf-JmO zqH2@gJVp$wM-#TWmU@apnSL^Y^_HF!%B zNB1m9T7xSH6|ThAK%uRIR*N-8bF$&eXXMKSxedYavymu2nN!eip*9A=x*`_2v?!FI z2KcN*sItniU_!ep@vyd+Qyd~AaK+mu5G+H_pkUc#b8H-%k_f7}P@pqq%6|^3suZgl zQdP`QpUi_7gQ#a%X2`-i!i>be2Og|S+42IlQRtUw_s>jpy?p-s1l5G?qoYJ8XK9Vb`WWR!9wvrGi1p~y$lp%Bcj|y+SqEf4 z%bu%O7r?0)uiW)IJ*gwUwTSm9;Dqyeg}mZv4-Q$2KHbL*W6O?S3Z}5Qy7*ps+4gpFsg!> zMD1b+R;mCIUYmZh{u!HemRrThocx$3^&O`qo`@+@p_LbCEm1x7*pFBEs>K||3JO!|VvD#H0{#e+z2Vk`a zfK}%JtcT8?#ZDqy!xssr^7F&|VN)AS<7XF)vpU&I7_2 zzvM1YfJFdSBnShN5yNuNi{w)%;l(jxYQ(Bq8NmdoittVx!*q8sC<#5uDrv;3{dzG5 zS$3g%>=_wtOs;-Th**K${T@^-4)J?a;flu9zedW26@^FMJ@T>YSKiXFgLxK2cSK^L zO~@7DW$(kf1(!RT#^9L8bgW0N`1uq>?su;Vjkq*a)*^02^b z3CY?p#ulss@)^b=P90703r%+Sz(ho~5ZsktaXH9$%V*Aaz1;P^F7ydqMR)~G!g3U)GtpsGg|9s7 zdvx;Pqmf5{JMzh?U)*#Q>++7XB?$fc*!xs?C@vLFODN5pX3@cA* zal?*#=|`hym;h@r2gGu(bNO6&r-Y}FaB=-{{06?!@7LyfDo)hx5PHec%@69 zgjhy-f zx;w6$2M!%NfaNR%Sttk>K&|k(a8F#}(KFoRst<=#o$dr&5k@T{+H#)W&jX$4IfE3x zbZ_K|co9AUx$;sddg4WJM3_}9Wx=sZITVJ3R8X;w0g&7skuB2FRo3E;VJmsDN{UYc zPW($nMX#dpDlPzvKH5GMwa67QKiOa3IN(@Ts?r}bfEBEj=T1VC2K($op5};z(0%DN@U*cm52sTBs7NHlkc$&ijARQBmWnz}c zCVpYkeE0)X!BZCB*}p|-w&&7^^jCm3VPjYln(c%j%bcTk>AZh8@L}x*y?WuOTCt#E zIeG=idUw~38V7Bn_z4@a9K$-b|J9pR6M|t;K=LhZ5~3tr(3OO0#e%5;1Pl2xHMe}J zh*k1^!XON*C}|B6;x75eQWo-94m(6MqGrWPy@K8s#?&}k5JJTiin-NTA)}do5to2b z##5}w0vc4l;=7bhKu6&=)hNNAf=q^p;i{Y|*Iqf8sim|hl&NortPtIr%i)A!FeX^> zOe#~(gyT3FLogpEqhQrf%!<&e{j{J}LsJ9eRhQrutLlVIM6KTW5>WLeU0<%QKBeoa zjoMgCutlI}n=z}0fGXxz;VC5{DO(Cz+)Zp5YFYD;sDHR=qVO zce?AH>0}V|`U( zLzlQ36t7Sc62rP{3~Mj=6=lUbg7q;2*1JdEWz`+Nh9qjanvf#=KK# zt^nC1>sc1?UCyOpCvhxLEb5-S(lAdWA;Tz11hD{F{!n_QCrj;&SVa@CN z3FTt-iac9nXn+_`q={S&$CO@iQMkp4J8`kHiiN9niid~-+k-rW%o#Ja5kGtd3>IRMtFS8u**CE@#6N{GoE z!z}!b1dxS4{?6ebtzmfUorK&dv@NQ>O~}U4z#(cLES)IiaYE6tIItZk1`&%ZL*$F5 zGh+px<30vgX@nmi)2L*)88jIyQ$UU~BrNc%l<+9VEH*TxB*0HX-nSU0p<5LEdi8?( zM38%pq|q8ahd4sT7KYgtXwl@upgxwclzI6L&)-2E=p`%WR{ibUiCH;XA$syld!A!s5^} z#CX*rs=Fgt-_)=+Xh}HJTU)~lb$2LOM6kMuLUxZ*$V~sNs|nXD(RzhM2eCCgdNguy zkdr*ao`xCIu*m9eT|x=A{+gSFUmsD1wd>s@@7nZp z6~#hHNE+5_FTS;ZKjW1{D@4nHU%77&ROx%zX~KigFg2hW4B|%f`P!aQvyCPub3DTe zw&tW_A<2c%h9$HM#bU(73PU?lf$@k7Ke97K1xX;~m8u0P`#7l~(lt5-{EC>eWVO9G zuc)~51}vV*VJmyhiD$uXK9(vW_~qs#F|crN`1g zzd(r9chKS0dn3DVj!d4~z5CQnb~YTM6ZPQWAg2OA#3Eir-{|g>L2bg}Ji3Gw9&VGi zt}5*8^dXldY3Y_JCRkb;<|O$tC+d4%Oj=p9YQYIl_EFQa1iOk*;!9}rfo%oK`mvZu z#pBm8*(#1-k}jx(%V11kE7vprVWYRZH^v&bh?rT{lF)Ii`^ak`#JaopO;4{ViJxS5 zy8HMDT7@5jVkMe{MzMDO)qnf+x#vE5?Tz34ZvTE6eZG8)2$uNV_bi|r!nBwFMx+|V zu$V!^3G;yY!0mMb+t?(uEfNo_Stu}1c;#!7R z))iC@{yUP7EEOV~+?(0NPDS9~H~0U2zvZoqXtlk)o2b=k(b*d&ni@6%S0TFsxtjj+ zfmVV~pZ<@P|4|dH`SzbwY9PSy;%^r(>aWxF=654;(}-(yeo`GYq<<0}M+G z!eRcr5NPH2J}1DXf>tT;HDci3!!y%FiQFo`(V6%m=&>Q zl#@jZEUy=Ms4$F41_rV4&d?QY;jMzy9%X7Wtau7?jV)jCWMnVlH`mHnu8~J7aMdg! z4Q73BZdSCa*uc#PbZr-`+D?VwY1pmYaRcF?6U426R+}=zjB1dzc7dx0PX(-=ek)uh z3|Dc9{ULEG-1rG7me8(k#;{rhvXo$n*_||ZY7w55+y>9EW|(2c>%l}xNQgCaX8L6e zX}{b>OpD<$BvGu6n+~ydA3#_f z4u@BGSTL93B2|Rst6t=eA)*0>Z9{sVtHMrk0p*xpxv%_OE^i{%VgOlSRwzkw*{rGX zOsTR`4+@0Y$z@G%SW4MANRUZfuYu&;!;P zOnHJ~SxtEV9;fi{z58ak?C1rtj*{1%yrT$i2yLU`j>4U{f8rR{_dk06#Wx(odi7Pr zG+e&w;0lm62!h2Wx-l$JtYP~5$ZOiD29D;xZSoo7doCMm5f)48!%C$!pg{+8RAcAO zIs67*VGxi~v6yJFw;?K|#(Z8w5P&6xpuWWkq*z7~v=0TepjpxLNPd;5Smyr*!-_In z%ISctYK9dBZqjn5%63(*v3DYzGAwUVW2%=uVHTB5Ip4u*9l5PyoM8wF5plVlyS6T_i0ct3mVirI9P*4q8A-F9dRdx$xtpvkzn589Q;2r&j zOG3x6&ISq=P5%x8F za?pX5!z_na2OPudICQJy(BL7DSWL25#ais-CLvcMdFiKfRzM!sE3hrJsTPf1`43Ny znHD)0;VN}ca*S8mytqbzSVfuQDXIXUgQUft(vqT zU~4$vMG>i+0N_9$zult<9lf&NPt(t&U^&F z4s{U0V#uoF8;My~gABvgpl$R;sY!Hxjo#)hQ?WhiIp$a1^bXw0m)L&=hLz9iG&F&j zAKpQP1HdZB)6jxh(6X3h{asKE#z>aEC>gD46}V~*DHd0Tt>ToYV29FRx~p*@FuDgN zp^WA%&zRL+2-f|(3|DM*S7!rjSi2lz=>)WombtBP#i{P(b$^ZkizpV=gqJU0C4#lb zMy6zkDu-dg%j+t1R@*fRi&@rU>`y;yeZms^u%sl!pS}zd62sEuJ|$YISYU(MMn%Pv zrSvIu2geFF01ZDDLl!Tlh@>GHrK--1PoBxh5?0x$gX~cb$#TC_h4yl}P>#yAB0`x- zl`~svSTWf>Hpd(*1MQb9ThA(nFKxGkFf4Yw1Ewnc@b}EBU|neI_q^(Kw_2?LR}=m? z-{seEO;7XSjSU8VDgK2xT+vB*#m9f(GIuCR?VeXzJxH|bApw=#nVcnfRf}P*)nZt& z@n`j5ovRYCd{P5zSj!Hq-l2+@!cr%i&UZJpcejz#z2CvrdMZ7ZN?)QBzdq z>jYUPeA5HQiaC7gi@U)@EyAi2gO&(c9Ept5P)a@kPsv-dT7B?LtMMrPB?YaiDKBEl zRxnBPqlv<9#;JkWXlIvn3ICOs6UG?U{o@K(ToJx-6y8xnEE*JW}14a*@`G!~&KJlxlJ^3g%cYxramUiVWDvK(67-0f%<)q{hF zNOm`hRVU(m=O9~u+^1!D5h_+b->Ft0h$sS6oyjlwM6(e6K`Rp7_dAv%u$WZ}Oz^?; zl0-P5EMzwpFbd|;TwrRj7UD5+GDz8H{Xl!xTJ$*88t)?VjLzU6yBa;iV%5D%)36#9 zu8`oTqWhc2y@(|$7HYzyY;@P*99f%VXr-s4SU-8r0Tx88o3Damy?@mzLUaiC?9nBv zDq#)dPk)iWHWq6PJ?F9}U$Om)Knq=zO6s*dDP*n&@L!neYv!S4@icd~!DBG%M-l~&HdGwH4F{(;H&eY0P;65V5 zS|+A!mCH4kK_{j7n0n=Z6p0InkO5XHST+B>w^?l$3w!7a6|9<|LhwB5K!h82J>!_r zmt~EqN2}E@pRNY%iZBY?>T`yy|40PIz{PNf#|1^bG7`lEOK#gt#R?c!Xlfw5S|hl^ zcn%}hH(V0dCw=ZZ_B|)8ns@ zhIR1K$%BqyO+t0weRJ~W%?<}w9UTWc2(mhYno#g+kU@*4bQXwM_29!XEU_kws1O&$ zX+2z1MG@3;9~UVM7il&c`c;VX!n9P~6Q9^QIk!|$&UiOZ%v*C!IM6rJR z@h-tD-y)15*6p7-ibV|T`QN>@A71xcj$*xk)j`$Oz|#PRCFP(HEM{1X7TPx)ug1-U zg`iO?3h^gwQ-okxUUX0UjnAoqM=ar6nSv?rDM=nJn66I0%$>pr3Vc*Z6{^d?)R>1b zIL-?Zmw^RlS9AzmsnNmq5!ytd!cxj29LhDec_r-(ajRDRM{7+I#)Ycnl(hU8D(qdS zMG_Uls&yZ~_koxfxFg5{yTO&K0vjd>t{Tp>WHq7Gs>`F*JJ=a9t&_}8AFQmbDPnzY zr68sPnM>UPK;2>8YMag32w-_P`<;jJn}6`*IkBLb6&lQG(b1d%I_s%RC?qSOSiQI& zCzD2d1IgWStj9C;FHf@#%TB%S8V&%hM0Ho~-GNmnM_f{Wio1jka9A}VltOLDeL|`VKYtv?y5A1)>Y6ev2UyQN{|1Rzj$uK= z+H(tVB?LBvT$GB$LGxk4Tw%;-R&FAX`%FD30k=@??1FjZq0VX9nKNxodw zIjprYH5ri{x~;Yt$SGIb;@QE_Y@I-!3akWap)9etiO=e^*VlnQ-`?pM z)~Bu{WMjk4%LlIBqPTs-tC)n#VQ+CRx83RHr0b-l{~{D!5w&| z46Be*BYUv&nT!iixC(wFp{QJ-QEA;W$ajoZ5Z*C%lZn(eTJVF;8G9x>!H92xV#x*_ zF+E^RCsmNaLSCnuin$u1*evvxa8%9zFDfHoD#Sf#|Ozim6^ zE=VPafgAQ&H8gpvm8VuARtZ{BROkl7)q~ZiaqWtvs{pQuTHV3ZJItvb28l5bgMv`q z?02ee`1w0Y4T~VlBbE+755Vb81nX>QQ>2Oz$uj3G(*1-aB>P~Qe=(Ok1S}dOgoH(a zb*0U5to0}EAHm^tdOQtR!%26JoSZx8!0IN6?vuMu?e5rpN)YSNp#;MM#~LK88bn2? zYP*70-ao^lsm{f`PC_qMku2#K=0UBp;vdcGsI;M0j=P75o6(FcAEC^5vGOkn^J@)f zb6Q)~DhgGrRfnNttjp_I7B^EGp8JscgpD;K%3M*X%Omee9+tzayKe>z>*!uz6dsW_ zVWLGCh*x~=yiI`h+-uLj@dnj|uU@`-6#~}PK*N%n5ZPqt5VD5F^9D6$2(>v2UqfCq z`%1n`XhwGrSSgzy)BzkdV2x?A4B;2I3e%D#LwKePs}M=I5L_x{JL)r7qN9qHgf#%6 zz_Em3(Q9H?M6kGB$n{tziSL9si-jrsbXI9f%2r68$bfue_k!$rdYz+dwP zA55(jtL|)z`9vQEV71Lp4OY3Z9)=X`&Xx=dkyw5(XFzN}^?vf17U%TZ1`0+izuU`G ztcI?4Sa8Q6Au7VQHcURR&#qUZC()(!rC+DV`Yw=$MVN z+;VpySb|m^qGWXrIy?fys?#kkI(y4B3*JR^3awGNSVMSM18FX>J5Zl6FODqKfmyS> z!^=_522d*Rn-MbpQtRjq! z=1_p2s|S(m9>5jFy3@9=uaE8mVo^yb3GU&^1Z#&dtWP1kL&Um#>+033)o|6xX^P@9 z>0z5YLNoID;l-LJES`tTs%9u0%fPB=42uJ?B0r&1km67tW&ebP_v!908HI+RE{-gv zT7kN5Cau8UAa`Xg7kRfTP>Ys7vqqlc^mno=@Q)__Pf=u8l8P;-uhjy~B;Jf6mgeil z?V@n3S7b7%j0HCqwooxzB~S&llHou_ER=%aR!t3?-9oGa)ruu{JKkY#^#B*c6&9MV z#No=FpMU-jpZ^2sRagvyU_IPcqeRB@8`bLOg zjeuVPvUXFOa5uqKhX7TF7v9C%pi-7cE1_4qY`9arSX*F~xEjE)a`IWqN#qGT;7dHD z!$}TBF*WdLA%Cu zEQ{|wA{$oZ_Ya!8UBD$3;8KKN53whb&Y&Jq%$QIU!@^+EipB161z7PlpgBWXwb~9N zySlB+8Ojp7z*PuVa9h>C>>+F89WDgJGb}n}K+u`wXwlnXzp-Ra1m-S{T+c?672v-Rx?b00E_a8#MUr4hL8% z2Uz0-SgszNqe!fg$&ryyCU?8DgH)`W%&`s}LZ9$ZSQ2)!l2u1Et4>mR>uMy5b9>P8 zE*JC3C-NC8X{C}C@jYjwc z7K%1@$d|oS8Xm#^9KWXCc6>ETxXjFBgt~L&=sj57j|a;M39t4tUVVIo;YxdiYQKWu z?k-|kgjYZL^tm5@L@L%>P~DYaEl3C~W0u6fB9sgg7NW^GmQ40f#EWp-?UjRxgq3&I zuuAN5F9i%s!OBCIn5xq3ymA#`q>)%@+5U_|(N^b-p)&O9Rd{BSUBf5}T8R*?0{xvA z6T1I(DiF&uDIG8@fKDOCuu>Vz7S+M&xTao(P$6hlLg~KQe$hdc>^hAFS%t%aVF2Iu z_E8#V_AYja>>O=15jF&;L9RluBK7LQvM#&O>M%tJ`%7d=RO&MtHA*l!4)AE`5MUUK6nT$3tS8K(N1VsO0qg@9y-m& z?!`slD9l%BSbWfA4mGY=4o1W~ArQOjO+urlv;v&+ zGFJF@(JNc6B5;w}J$I!a6x_68zmF8h+u7?vPbk3behlaYos%y$XIVuF>^P?@~JRnDT3OTw^7HxWfT{7laanaCnX(KIB! zq;G0zC$U!wNg2Z?FrAW2z(aLJUHu5f@2<#XCf-3^sZ!ooL znCPBRD|=UHV~>@BB3w;_U9GMLYXm9Z>S=tY`EzarLbvh^>)YWfP_cwn1@R2hI!tI- z<{b5!yJuKP2>8YmET&jg4nCIa1glt8Nmy_8p6L?H=y_KsJBoFlqWfrLPG!B~{w>g0 z&iHur>sM&-dG6qaMfC9#;{VXs&5F?gh*;Abgtz!-c&sp3pChqX1@>k|nm!YfC(Ue-H59zsSw$@z7W=N* zSTwJrvOJc62@Dw~c}NO~Q_9cjLrv%zBUlcj!m5#X$d@Z-2W_S$^1!Ou5Bg_0 zDYWeacWyTqyMwD6bct-$tzZSWRlu#Z80-qcYU2Sqg8^6pu#yoBpR+sEw+R1J4C`Ty zd{Ixaw$iX{mRdBdHCz8Yz)=kWV!`8nZpLqYW=lhF0Toq7FslQ)yMw9@VOWEKeH5;SpeD4Vj_+h9 zWY{;Wsy;q}If$c9a*}u=lCWx6Xkp39)soVyqLhV2dBFrr2ccV)Tq(oy#sz;DRDrDo zS*>y2rBar>DCI{+le^cve{`mC*)m7(Y3itMC%miL`;om^0sXZRtX;AthZ)v2t_gRd zMaVVbk3S_5i@l?-3SjM{rM3)Lbt_YLRQ7!J|DON22Q?$aiK)xzA#N6D^>uo-e-GOa3%}iLe z9nC&b2jQ1?1{Z z*fUJLyDh=6T68i8c(vw72?v5;8L9|p&czoJo=EU3+wZk($$fCSH~nd}yPI|rR<5*F z(hjd8_(sS39?g-2b#QWSWbP3}_nS9&-<*ViwOhbykYOtTEEI#%C>&(K8fMj9!E10( zoTHtjU@dlP@Mz6wCbeIe^4zduKO=PpgYH$fDC<|%*P!Z^D(?=YM8odj4PpGRYi_2wJ5`asbRoJHO%nx35Qk7RmsS`vE>tQo^Tam{mTsA?hmKw zLt05V>gvI^*|sZ{F`AX2lCW?5!pRGLbMRrYt$~h?-IKc=#gdZnCetf6HvqGE2)Yw) z_qxuIVl7yg&{v4IceoZv#hx-^kw=KW@OiM%Z0&Ck*4J#-O&v0TxqhC#UmpRsPrC4;gT@VWt%Yl}c zu(TrNJF#H#`ByusPx#SC&%g23Tkk=3-v@$akfkdkDfD%*r)Ri_s=~#^VO<8oTR}p- zP^ChGE2vpHpEH^*DfkP+N(seMDJu%{+DM2N_wZ0s*4gKH^PIMemI7Sw)ytQ7X;R{>=>K^6_ z6sy^U!p{9bY>env)e5;*-R*3*;wiz+hJ-ovnK{|3g)2v`rX5CYcy`5z^>i&DSk@a9 zv|?x)GSs^BXOygm)+vnl3KL{2#H$uTD_)vIiKA<}NL3UQZ&3VKo_tOW3$uhLzl6r)FeaJ_46l;V|q{~c>?A|>I#3G~u%erL(R>xpR z;2vdHLua*!6|@OCwxLt(?)e%eN<1BlK2H3dPdO)+;YXh;9nFzmq2g6ZiB_v>SW{kU z4`%{f)k&(Vl}K4EXBo3HCWhuXU6FUXo zLzpH;Rfvx{vpkipkK_{nyGJbk zZBeB3D;AN(TewKADp$l}MN@&zUSOXMH%0`ZR>rQ_!O%d|ij^z2F?c7t30GYSxSHNr zonBfsf+c801dB!od8=T+uqdHH*PLz(AH!9sHNor7wuEL?n`~8&5*oo$4NKBx5@Dkd zux9*z`riA=m{A-v$bEL~>U;x|k-K?^D$V6QSzl*w-}w093wRkw!O7jb ziDl8f3RsL)thzI7)%j>FagMq>9ed7)xRp0MR^DbreAY?MX>5n zU>|qS0&Rw*WEt$>=GBnHI$XezC4zg&8iX?S95O5gEH#eCC>HvGY02u7ovFJ0OBX+< zBMBO1`zV)$C=^ps_24rj6|c|t*kVQG%SZH1s{=IX3R-RmoV}HS)9aR z^t;p-!DhQ%a{z=|gcm0%HGQBCM5)<5n4 z3#M2Ou@-zqC~!se3I!nvSc}*aSv^}IdV2{qA)*?BkWtavO&nwmD^*b4T?iI82xZH& z(y4+LhB8mcE-fwvpV-X)T^wfEKn-j@Rerz!fdPY4M`FCH4)ikVi^h1QcsahV{^MtfX)ivt-2> zRv=-Kg0<#1)z`!4?p1e+YFPFy!kQbO39ovefnRlPQk44y;HqtumU|IkRiX&P7Kg|C z#``XielYP!c-2qu;9efV^AA~9ZIf@XEDL53(!g`L<25K#Nte>&gvNv@wZ!A za!Cai$E)%sOL>PUiae*u;3yU$YC$+JUkPH<6_&+AgtdYi zLJccWu;L7>FqW1@gh-Z2>6UsPZHl%ch{ZJEMgU8KBr*83>nX_7_K5|4N_l_ z#483XrB`^16CT*5g*{-A&m7GtRtb}WkX1u;uaqmysnoYlk7c4(uvwYNuDpux+S)&m zU8mF#9QA4J?V4_-eZh&qc7>0pU{uf-L~_g$!_|Y3UIlQqW(&Jk;*iB^7V|72S%4?T zsXwP-1xpEIQSJ$bH6%MIV00f^rK|>9^0j0}cOTuiJkzUlIgf3D>iw$OoD+{HSZ+U0 z$vR+HZKM6`6$*2A_vFGFCkbo(mA;qeMqEia;*L3XVG&^66a`B(tig^Bs|f47+r7>- zcjV2)Z4I5CVJS{^ZqXvNgqaeL<8p!klI3_PM{1W6+pnOyXJt0WIM!6r{0srX3IeXI z$Ww~t$<>s;5QlqQ%d!yCA{iUb4=7^soTm+@KRcsA$r9VJeD6K6*UO~SF(ZI51P;C z{aPYc2{{KVs|ptCLCR>znxmmu)OeY|;!b&?I5aa^lCVteKGxr!cU$-L0!P3)4q(9Vmw+Pfu!;Req&J7Psa3?8jw!_CuOT?yri z$khWWajb{c1BEer`@F36?LGS$BIad+J3qq2xs+Lgn&U9&q@I%TO?Zyxxf@NsE*VvPE>Oy*)mgS&F zNFFSj%$cP5!O5E>xp(m8?u1-*sE!59>VT^OPWR41nWFMZI8?gasp2ie4gSNg}cqfKfrxWipbN47(_rg%Q&$ z6}M76s*~Z7otUCt!?_R%WL5BHg$dR=i&atrI;>isWw0{gidFUx+CFf+O6?0eCb+$u zW7$Qta@6XEL#u}FfL;Nvp81rkAUlS{t0gT46|5cvXeE2*S63LWXoK?_ajYS_gXA1d536N^W2RmEb%JCgujM8R2D(#{g6XhOScEh@7zc+$?{RBJH^ zWzZRDX%Mn4t5r$YRBLOYmV~l9hrC!cRcNikKi#|cg_qs; zii!n_MTqsamW08&9PSZ1(4r?Iyn|wWL=@{S$(Z?UK`9n1SPWN+Rs>kgvG8p$&uAsL ztc*UJ+Abr{IrUzJUjlW7#PqX0Q#*rd>xx()STab6M69%|f`*)xQJf0xSn#n&s#%xabymE240 z!tD0h?QI{ZIaJp(YZ{-J*@<1<=-#xrW0I}{wDMMlu7F)FIexXVI;~Y;f?aurr5op4 zaDrj2**-7L9Q}M7nuc3btlBzO&?QuY^)QB5LxBlP7}nZSXv2!T6VIJPJvbxk6&HlP zC-@S`qM(^x+G0kl2vJOrQZ{lowtKm9FjE-AT+XGw3w@6+T)5!CisF$cY4mv#qtC3k z?@j=gu&lZcD*pt!IyoAvb1+s0#t}<3tUSk$2Gh^p)lgEBRgx5eTs{z1d>|GguyXKV z6=T*>deNF>SjL}J%;FO$#RyeYk;}rdysD)|Vr!68A@QrdToQg=)g`2ZH7rc$IC4eB;SNkdqb7X*jko>+6wB3wpDpZT zekFjl=q@e>sXfU4EBaHO*FWcZ-2*95#iN?KMJ;Q>pw|S$w1yC_3Tkst#ZqPp1%oZw z{fyo8u)Sx*GU_!fZ^;TehXr0T5os$hRaUH$e0PK=Gdl5zVHt!9{7U#%+{;b?7AaDt z{8CjZC>>Tc6I8iR2E?k04BE`%B%ETf5^;T&j8;smKEMNuSKe{OlY%!IIFS#FBsOFG zDkuhHUWNx?SRSoRx{8CARfH_LJFHq8V%Q2??@F&s#Y&*m(AHk8JKJK+Dhx+9w2~&F zZp{f+<|I4~vVLMFUJ^b&aiWIkzWfXhEZ|i)@Cr#-4zDT|%IQdjxg-3mTeHXy5 z=pw+{&GUpbnG*x7LAJVg2xN5vw>sSmLMlk_f#@D$SI{67Jxi69;d}zTq*7r+Rt_2q z(JD{?tWZTUnAO0BTS}DP=ZV5IidW3A2(Ioyc;CDCw3dWlOTJ7TuFxyosi(9G=?1`h?)m4Rf9rP+ zv3_&;>OOId5@gXq_r$NLCR|+f3Km1wyg(JB74Ilgh9#2&MGeRY&$6$9I@v*?I+h`p z4j1}REJH4y&~dN1F*qhb#dK;+)OJ(d4YPD1PJw-+-1SP(&-nU-bCq@YzH%Yoh_ z=eqzCJGHol7^%%F#3?QX=^~6;C&Y614zXq#uKJ;`lUzk$H4EX2VgnpLwe@o`*v4Kf z(XNQ6&wnto6<@50GBl!T}VW%OAYR)-1i!6adapMD-xlI06RhN(K=A`Esw zd!kjH+mQ1~nEbISiNOIiVZIdZBgW?oYhALwM@XD&N~=SgcxIYqL`raMN_mz#8~kQM znI>%I@xfLNckp#2P3Qd0z|zLj^v1wO{f4UV0mVYljLzsRfARPWf-JNOkDuOq7pl8E zw_sS;kcTBuMS>P_tlK-;?fzY;SVXaYvk%76*Hyq;0Ke+#SsY#rCHKY9EUGyT9Doy>fwU?sIc~8A2+88>GVAV>*@>6b{dy>m@5+<*JE(Nwm8O_aQ z{iiChV6_$lU=mqNfvD(JckgjGypZtuALKN0ADja00i*95d~W1{fK&oRaN6=W<2Sg#Yo zG6`#uMJ!gY+@VC4`IUfGmRHv5jvOLby5BM9yBOJ`*+lAqQ`RF?9%XA&HOC=^zF`F1 zDp+w?ke$yQ-zW2fctEMGxJL;6DB_{q7Gj$%D}i3rvlXJK_}Wu-LRM8Hx3`4ElYB{>LU515D}-hiK@^YX7TMDfuAc~nV)Zq&iV`1q8?*$p zu3)R>i~5L$R`Wdg5krk^aKEcm>KvbT49jsW2U-Ig=ok(d#gZM+!5lPmEUF8SLw9Gy zI`VaFn9vr~E5*9zV2cYwsSbbglOO+>qLP31ySF^WifQiDBV6Qqa2^WQyeL?zUTF{( z8Qe$_%)=#;6~@Y>HGZ^efM2kjP>k=XVA+?jD}t-B6b}(Ho#F@wwm0bV!O(Jr9-szd z#r3RkN1?_u$QU$s=P-!TqmU?|6(f}ve+8-y)go#+$4{78@kOIH>!w(VU^UC>Fdww> zLp$GrV-ZxfwFif;KZSU8gLlhg1!|~WP4HqtcXK%Pta{FwmP@R9!QD3qV;WW7DCBgDl?n9Gix&0Y!iQ7^GEcX{nfOVLHk;h-^yWj}cNfxmte<E*c2#MXUPcQYV9#+?8m>_Y_K>aH^O;`Ij4<{j*`#6X}g~1#mSnv)te~7EvsB z5?(pP+P?QV;nmR>zJ9^*Dr8vK#EK;>>$d4xJ56{0r?<%OewkGF&s&5I|DCoKgp;MG{f;S>?w_4!x9mmH>?uFO0g-lETR>cg-o<6r~$#L=u%Ea zPq6c@xnGeAV$}z2?XwP+=rKGKP=!*ky3?T)LR@T?Y(qvB_zvQaHla6G~jhq}I z6-#m&;20$d>!vqi4JOk2I_i901GNb|J;@5;ss>`I$AJ~$TvbsB;a#OG@nhw9iH>c| zfkLeLaym-rX9%Y}Vig1TsE=Nde&LkJ@LD4ZkQF_06=Rkxb!9mwvU_xT16Z}RF#zP! zRUyF;G*hew#3eJsI;|QONR}=qOxPM6%le;ccfSTl7MVxsr3mjjQTVE>2}yWQAQrJJ zN3rII=ZRqvwOY*O^@PKnWU(NRsCUF47s{$?v9moYo4Sr+!6@)t zvB?UuRdbn~(N`<^&YSIi(5>i^$J&w=VXbhD+$kqW* zj>bF0%X%`LXoRRR+1_0Lb7t2Jjz7U3m`DXyu3zXOJbx;!W zG~qR4SnS6#hK0}uR}}t05bHPlh+}!UQi>&-`+Qzbhg3wga{eggkcTDttCiIcgf-goaj>eMBs;OWqC)OU+{Fs7Qu#&^k8HpYhJ&TcxbJ`<; ztCV#DeK{CA)`3;)3|HV)uJ~IgWxaWpA&Z$67lG}#LSj|>=)TdeDx&=6|v z6F@4S#;Jc+@35+i&d`Ci;VIU%0ai_hwIcU%hP4u7Sjw}8OlYSE@C+t3`3YX6`#26Nh60EN~xT0+2RQl4dFOBy( zdPT`H2U)*z$K(jx8LUSbS{efBy~Dy9h+7RZxf;}%(L~Bj-Vf(=Zn;b~>%F7Uv9dg! zL%l-xz0dO_QVhz%JXNo9$xoOe)fD-%JjF66mge^X>5ojeHbehCzdW(uWK zczK^=Sg)Ia#q^4=d2|U;6z0s)ATbS)+)FvB26H@}$x9yXn;^!pLR&+)0h;5I{bZqu z?**k;B*bShSU8sA#X5e2Jv9ak(6Ca4gy`-!Po#pi6L7Ti7W)hb`9)~EVz2fa;7Kw?(2?H?FaRab+`t)wm3aKjaY6Ub@5u?gwQ z@ambvE6VA6*0srlC&aLTSM~7`LUN6wQK%(h4GoJKR!FeWC2WzZa43WIwv+i7ts?M@{N z7THE=dn(O63s_ya&__7MJwo_Ke@Mnr6R~z{qPt+0qE%-HHwZCK2$ZVpG$AXVhUGJ6 zd}+8?+v$!F%&g2nW2lfDgv_v9&64FpFk6hx<&?zb&UapO*GA!#honGpS8vvoFf8j1 zh8qgQyarthHdX3;X?jEX)ds;8eD7UgSoIv1jG4j-qF4^EzQFD7-P4jVv-gD;*y>Jb z_3^I2HEQ~mI!1T0v*Gp*$sYYNSsR{z>n%!c*mw1_g_zF#ON>-m+xF}$>?!hLv85qkSl)7_Q_bm=D(z{h29eQ_=H<{Cuq}x0Y3&pi zAjPKwK}*&50JO-nfarFiWD!jliq)Z9=4CpW$XlxrCR&l|k0=${LbU>9q$02qRyE5{ z+RzGwybh#lZ}SLMgI?VrX4TD)!meB)GeO>h4Iw znqIA$(jc;X$gsQ_Yh^8=VXblH#yGV?oM@Y8TmL^#rfpme^6H5eUk`pWa5ml{l%3Cw zU|7tte4p^K=vazekLk}$3TxU;k1@h4&6V}_O8+0}tMTv!3L15Ibz$-(1oux+68>$B@Q$MJFOb^sde7@U7sb=i zqYR5nLXTK%zRLSe+A=+mRe!s+TuU)ka7r0gFh?kB>wQYH&OaB#&7f(c96L&Qr8({r zlO;X}Zy*huh9+le&B&H4j*cnV^bT{bf`&I(U|*Twiq&=ZFC9f-2vn?D@i_}()i&D( z>jFB0gjBNtskZj5E5UB4R_#8e-LWg`3~t`o6eELYSY6N5&mam`7sC}R@9ry(h*mup zg%4Q7nhw+Y%!H*SA(`BXXFXjLf(5?i2Xs8c((ne(@oVwU_m)2gNi{%fC&_|3=i)5uM6jUH0ob#N^9on(q__89p&%?ru%1v7mLpjt zVbSi?lLzNc5@7vMG%QyY`YFPgZB)919hiI;=V&LVx(@~&!n)45w?P6M7R`%Q3#oD{ zu}cOPrk**diKcXfVWF$#Q`~c&U`-{;!kFGJ!j%jH3y-J9+=XF2#d~sMcta+*ip}5cIa`U-dUZ@qigjpWS%<%^8oC@t(TT2`MF;1xu zt6;9tw634Po*dP%Qhs8G*_GtI>mXqUa5ZLr_X3rPoaipapm?yqZbwK=dt9f+e{E-nGLfGbpjHyEjIsBT3Q zgWWgCc7;Kl8*FLda*zquGaev(M(pYt*MuayCqj{zC}0%E21^;OW?0Iz*3>Qm)fD}lcOP}K6Dpjj;@RoRcW#L-HQuf#CQaP`gE#WyDHdez8ih5PvN_yk=H zTgzv#=a~#5r%@1Md+Pdn6v5+ucsxyT^-|x-3v=vppF^7v+-fp(jcVkm1&)fzy~DAq z4n{0lIZ+iVqi|K%>22xY8&JvxZxLes<~Ob=eBBp>s0blop-1R- zccxZQu$W+ReJBe(SQQN5s#HV6^1^$8mp+4H>8^>iIUEY!->$tvnJc7pcO7`<#$iT)M(a^LCkxdGU5tJ*yW~~8djZ-mPiN4Ovs%@6G3eR#i=$Tbb ztm?LlRrdBkXeY=btYUt3L*c3+;TR=?)hLa^X*3E^6xMqUi<26b9@yH6*fil9c-B+l zSq`qGODH3SD{9CRhNXrqk+I^_h2M@=`g{0Plp1OY*wqqu2V0iDqH^%8C|GA%!3q!J zSVpm84C{nlcvzm8XzKnG4-rye55>wXN%BaMR&uACxT3!Qog8W`I|m+$Y|vyk-hWMng6yu7+Ib zbJr?Hm8+tyBs4-bWk59*voJASVmS4HVwc`Pc6(8O3sVRlg*2&|So^ zxkFlVG8}`v%8d(Fum-(8__8Gzm4ioro4(SQBD&uZMe-Nmf9xRwZVX z2-Z@pCRDVl=2>cYZ&BTy^(=Wut3(e~LjiH}Ph-#NXK=rt5dUm z42uXBPZNsO{pgXecO9uku{gp{?ClI!(A{^48S5vXlC?qXqrdsD`nxpa|66qItYztw0$sDF6h>JGK4;H#OevVK+As&bah9j`stG5 z4=NQisaXXnf3&xmd!Z(~>JE`gOF_9j#l;#GrYUrjV5gm=%do^`3@?%kvH-q`R! zOTwybWY4gaW6`}5EOj*mT|x+3hE_(fwh20giz;Hz1*%#ATatFwQUz8^04(4Y_|-Rr zSOiv74W5l_?gCj1TD|Ic4=EOFSj!U)6yn}J+TYH}i0&Jxl70dKfR+(Dyt*X2a$Gt1 zLw5nECMSO=1d9NRq%70hVZowukRIxgi`Cf)v%3(iIArA$(eB?Owu_3Djw>%{r8akPRYod?ET4#<4H#Cdf1IjI2z6Ml< zj%ICi)o&PPJrL!6X*Jd-^s>8j3CZBl^0Wo8)j}Rl+%v&qHESryB3%niq(i1}saI<# zqOh0USV_Y>Gpw101`*s{ zJ?Q>^$kOnHJ1t|8BUlcs#xGDt!=smI^7#{XVNKp->!@k%hs=Q`i@mrUB=xGULnaCZ zscP-{3f&BvE;C%U)>9c)iPJFs;&f?c(Zze8vlhz$-6~s*ea5DYO~s#TE>^LsL+EF8 zbjI1|CHqjnsbY|x%;BS@-0snVr3XvFAu5(>SZEVY*jiOGH5@g`4P8AXUt)#I+z*U|Sri+G;?S!>gtnxHUOka^$K>V~JuB3ZAr&47=JFdwgwP3ur|tSYSk9K%vt)h2$>+I65@1XVYh08>ru zy4nmCtZt}S(A>$`&_E4B2CV?H&d8;$Lh&|Cix-Pb4WL*X*gv5Qa~>>hVa3uXgjg-B z#IlBxCwtz9g0L)aaj;aLgshSm zhD$*dR%pXg`;|5avDnKnEbuY}UUpNqrfl7Fs}J^T4VKuO;XT{=#|KM3dVguD-nR(} zvwU0w#-BNG^z_{z4r}j`BPa?1TEE>DZu=5z1D4hYOzUlWuDUy!v3|z((ckPNZ^Oll z!^E*zb!WKB=N5D1YM9UE!oeH>SJ9uvkYJUPO+sNe@_IAMKd%4Q6|MSf0hP_z1aeip z47_f4M5^@a2B&J@1YUJ-3PkbQWIHAZ#2il1vx$a=kYjnXdzV=o#OJOI3sZ#~U0M=u zkh6iBg%XWbjajs$hHFBQthJ{JjDPZO51N~^N+8METB=-Y!@#k7WvLN+yo6NRllvrpGk`02qgq(KqR7?#Kcx6uaWpgxuU)`m85WDKpCH(s63pW0IL}Yi6thZUoLNR#l_6}iJJ8V+N zQLO*>Q?fSv>}PNN#r|Kt`kUYEdws!ymDGguJ$cCP^Yd`Ii&-?lD)6i#(p$5^hUa2c zi;yenx?n0tMsqyj8q=6QZ^YuUXaTE8(%yNYPI6ODVXFoq;40b1Q3baZ}!Lw8bGGgHryds7rs{2_~g=g!NvipqCD~Rsr65dfd?lq8p#UY85 zD-$6W`3XD?hsWLRLf_m=eSN%)kbDi&Bot4Bk47G3BbJtfb)1J)hl0?$gGoO_5Qvrc zwV<^Mhht_2zmkwmStTJ@GVE-d@>ta3Tp8?jDTM)k@zz#rQJ1D_O&BwgdLNeU#0kx# z#n#v;v^q$`ovNk$OD``CtcvJP1JKh0(>(nQf)xZ}3BUT{?%um#SaIdR=8GF{75EZM6XiS(uO&pyvRw*OfSqAAT8<%lfgU8#BD-~O$l{&f@A z*$~Q&z#62A5h~zUfpMWN&aLQZa!;E)!*W>F&B*XtcieR zHE==bw@>IWA)7~Gbg$p2mz9LFib6sgswfuA?5mKm)>>AiCIn8AFUwpFLoF*Y52;m# zUhJxkR58%{s^zOCYYQ%Y#nvlFtmJ~^{*5v$pq0q(jrB>2r5YCS>RceW%M%A!?d_x6 zS;4wOdvYoj_jivinB#qy4%6WCT;GL}gC|E09+apC%5uMn9bX#KkO)WCCH0+H@#WD< zTZEmpTn)ikPUybs^yxCe+UKli|!!28lD%$eK8NoJy8&Hri|{Q z%@yMetE8dQ*2ZAts7({5V{WWenC))UIVqN|{Cg?c^+j|`9HkLW?1;TI-1Q~G6)!*4 z+y!XtfADZMYmLC!&{Q=W!j&*92SY}wt|t|%>#?37L@UCoO{Q2Pv71=Mkyq@x;*(ts zO*EK;tzN{hnn=hBVTl8luwVp(p3D+x#YNpZ(i4mLeMaaSsOl1>v+jbFOp3c@}t_Tm-w66W4<^Cr(b z`;q5E3R!Hx0%Fy%$DO157_7oJ;jsEfJA?hHwv0lTsY)z^FAZ}N;>Y__^USb{NNa#- z1)n=l=*H5=TNB;*kZS4fRPVwvrCpQ!g6)H`;pbvlAqM+asZE&O{g?Fv4|p_Znv7U} zNg;2}@uBXIIlT`xp%E;HSj4fsc@!LLhbCh&oq~`hdi#!R)FEW6!%prL{@{6%vG%j@ z{`%`|Y;d&7K^AJl#oVI!8S-JWjA-szA*rRUHam*w7up(XZzlBp!Gb_mx?m$aW7;L; z4xz1_NDEvQbmf;YEGYz2yrwI%F=iBjf1s2FEdyuU!ZJ`f76DTzShd9|)%9wy0#;q8 zo?z1rX$*32(83t}$yWm?l_AyyW(nbMfaCp!pp|D?G*T#tYZ+GtM>Q7reb_#0qly{L)nMwky*L zF54RI{<9sU8>V29=HD=rEb*w`?9k)j%8DhC8>KI{#$ZB*x-6|YLw7I(|!VGZj?23s)& zJ{FMd?O2fzEn7rk4M8af)4W}k)7#yzX9~gEuS~Ekf+Io+uKo}>tOBG;XzW}HURP#C z+)6a6>mH=8>-}|*s_yHiUNr%l!`X!rAUvRSBj<#7wG!lwdUv^joAX%#ap2UlxD-UGT;Q&v}msv=ll zd6d#8+9M3gLNp0k#R6nO!}_MmI?5x3Toay)%kDGF-J_>R`$@lACx!*MiZWxa9!y{A zqs?9~k!O??tdY5w=0v`l6iWk(?t?MYsAVJ9**3z!;@&wJ#Es^I4HQ9E!*IC&*_*JK zW|3+o_J+JR2ssnWa*=(yTsB-!AN1o*X*bb$D$E+y>aR7hy%%G)1t0AmEGP_Qc>Yz0 zSjD%VU|3AK7`}K(1T!!pSRqIS&hge{Cz^uRZ&4qLcQ zsB<|CSp!@Vo^6arB&(}I7?z~Fi}Y^JhGimHZEV4UewA?rVTLSNhsXPV{mO+$C;R#? z%)x_o5Q90BthMuO4x1WS!8$bPX9y*;&w-e1s2{BJSXC9?7aFiYvxbdfB~99$YeQCpT}raZ<__%&Jwh%EwIZBYb|<$99av51h)zJT ztR$>AX9JiP5iK31SQVnR6toKgTTk(-h2IIvLqROYF}l_e2jkCR$|hu3U$uPYj-|MW zwInlxAXiIE3RkEJ**i+~N(dI`%cv9UoX>2q>6}ETkZq$gUv!^tJKaBuu^h_4sz4V= zA3i+JV>wvwHF8qbD=rDyIC?W-Xb`bojian%@v1LYv4C22Ri1`8ViCpatTjT&QKPx6 z4ie@iqoGt15esg2e7t18XDRD-;!@n3ov3X5E{Z9?k6yMu7sEMdn;6vfUsF|qGhWv! zN`~Ld17d5K#)hK}-9tf`HPh&~sotZ#Im)nnQFvtU*Cb>eji)vQy8G?hJKnzL?F~D{ zK+1E5x3NR#yT5$?`JesM{$KrHufBTuzwX=jSBfIp2VSku zmaPzs)q~d=t*)zZb)D%|n=!05g{NwobzLjKc8^x=q))YTP1xPtz7=FOg%u)W7Dr;y z{Ii2Boh$@oE$eWOB#*M&y^$Ff1wL|{FvhR|T9C5v?+YYL&-hrOBUk~y;_8se6eKP8 zN*PvgR!!P`h0}Ke1A?{m)mb2vidf9BXzhf67hAE;61}3d22tG2i}lU9#z4c;RIJ{r zl8_jdgDR>CF+)f+%l+d>zjCSX!eM|_U*DrSR}8`~dT?Y?M6BJM<$kE+rVkqpOzwjn z9d#yUaazM5YwdM4f{_DvJ6;Y~Z_3Ha4X_2Z9S3@YhE_!aF@((}C!S+2$5J&~wc0qe zPs8#N?ya$OEbni(5cimdr9LbnSglj}m(Fht@a*$|B#wIDC^rgc{y)~Wc@H2n6uX2 z`<(NA_sZpde6RbED{%_c;@WGkz4kI8OLx`VvU+P2I)Vj;^=!QEi^c{rtOY+;s2+Fn zsu>JJBg$`K2AfsChE5@ZX6VNHx8H&v>m32BJ3n_gl~S-Y5IN`Nzmlb?fm-Dg4C~ug z1IE*X>TXx9Dq)BJOUs@4t*Bb!axmrH_SA1zxI#~m5$!%U)S;D(HLKX}wX5cI*g|X# zz2eE#l?bG+q&4;{WrhYNNt6K9VnEdrT7hd24`gl;q2EdEoa7#hd`}qmW1OD zw8kIq8Ru}03R&kg-`y}P2w4JE5Z^(tl4!*-LwBN22+-28L%}N}TPuy}GuEnBVg|LC zy_VDov-?P$FPu%49n={6WyCVr+TgBB?3@hxN=+I>eDc4mBs-z8HY%)KnZwBh$KOcb= z)rI*4^D@xV^!AWBT1dpqkYRQ0`w`X>Y8;kC_zmpQWvY8v75Y&3wf}F8i&V+7g12EO zK+C&F<1oKb2Uw#_lu_+!ls%D}WL z&D%iry%NSOm`8)*U5moNvUGJ$g~rUBdnj!}CXYtm2GoP+EPs1(!*eVzW-YFJ7+c5p zjZs|~=vE9?D;}l@TZ>#CLGVeyS0nyFjqL=t&mxKIGy4OZejZT&=ztF#1yH40g~@;! zqScu#1+8QH*jlb^p`(E*SeVTDZPhEVU>&MLkoz0pR}Qc)_gvnDW%N`Jq^mh}2*u+* zNAb#LpM8fAXoY;_IB0aJEt6?0Yr!((XjgD!#oE;bwX2S3=d*!UPPP$BCZ?2xo@|AR zFc*^CQ({)S&z11AN1=V@&Wg5vY5f=5M6F*~h}woYJ9hsw`~uw24HO%$A{-bW2pP%a zs$*gPd2MTH%Q}U_!;u$j=d)oKMTo{4)tYeBJKebg8d)LD60H;PTJ&q(YDmX?Nz!&59` z&iaZxa1xUACVsh!k>fNrRI{#UqkPs$o5qsU1bKn1^+=IlCv3@omc@-KU{QXTt%O<> z#=^T2tZ50D2^`C|=D3nD>k7h8;Ti4wGcy+mZ^F+_(p6j%? zqfsbo`&P=rV1d2jL}eBQSUn_^{ND#BvN(Emb)gGcO1n`&&*niTCP;x-2vCban^(qJ?dB%g)FHE ziCpKzNDA9K2Pe+CA1oGz?jX|=pjx!z&^VTZDESkCGKH`8Mj=lDtOAK@l;vEDC2%DO zm6{}6Pjwb`VkZq*q*%nOf$B)dVmVkn9oZU|Q=^2(9K(9D<@$+Tf{ zE1@S{rP+$@8x!HrV0#8nUr5lm~g)PwT8OY zo*XOl4}ZHspF4h{z_4(R4^YLD^@P(Qb`(XSZxoVaW!2fB*`r4exBepd8c4D%sev%X zC_l#ei7g8#)=R|t*Z(IF>#r_2js@KvGL~_y+|QG6Rm|y1uVTu8Wxc_sGG``P2$lqo zYPx%@UWKL5+hyD8b}j_l9vuWNaH{RQB96tQUhwL7^@3LQmr?|akqgSJP!To<WIv3tR1_|gV>!5zF5#QxR}ZVj-r%ou zo??)cQDay#8v zw%ZS{^DKGDKBZk&*>yLMMuMhI-8T9fUiM~SQ{GO zw_yW1dz4^#H`bO=tT8qUheNLr6zlWD$yh9{38A~!jWW<3wIKI>LCe}d<4*Uw;3(GH zZ+{JLEDRO?`GueT%pumdo`3%NcZ6g;XEN4v?v#n=e6E->+-fhiP#&&W68>eJHCp0% z|I5V6uPVPbhoxZEcH6wVJ$-;>eROrZDp(1;s{h?5K&ww8w36^WE?~ZN1($CMwzRZd zv9X)DAoPstE8tP0wW`waOSu+{#WyQwle#<0LQt%SaE`jNP=ZIRDP$>F z$ss%ozw{~$u?Sk{Dlqw_(YE^2X8M)kld!GDm35CvM6C72@(k-U{fzEl3a=ulve(j) zL$8M|dWyB^W8JG|`ExQ7%e%0W{XxGqXKU%n7LMff{hLqNAY=x1Rn_@7-Z%u4`{nM- zvYr0A!z)PbTud)zp^tL!-yQbT6S6e9k8urcvXwBC$+Tt4B_p>ar=~+Uel!DdvQlRq3RjO9*+VxR@tlxdaVz3?sAs5K&=D;Z+mSirN z#%|}8xDG7S75s|qid{l(#SyS-F&WFk8on+;4et4Mp;UB?a>|g#QL&F!3TDj)6>FIU z3k+)y9#F7oZSX@n23+STWQDr$99g@AE8Ko@@41wuRjP0adX@a4LYe<0n6rMG-&=Z2 z=}~@8dL=kb7rhyaNqz&`CQOV!Yll!*)*p-ocVO1q*jS%TJ#&oklTWuJX0+;+Lsf^~ zszNey&t=E3PMx~$PW50-?%rn_mW~nj@9W1k{UZih8`F-aj{&r-EYwz^_hPly zjDls2$|~r({WA#eTL8gY093is&~YqBwR-oz-TSsH3Lj&q5Y`5zSa6X3oQ^CU4zQkM zyl5^N)K`e6#XTvt|JV7UfJ|6NsMN~dSf-5MNnx$QfKpYZyz1)JkKDCORCX_5?egsE zlaJ~_uUHUTB;ORJD@%x>iQ!6++2c{0D=m+ey6G*YYr64#4C?qwt~V3j^b~4?oYUzkisaIP*{LpwWPZ53Av-1 z*|5q+VRm&)(5iiGr#jx@cXu4iJ4d7O97ZJ9xe9Q`Rf58__Pa;#{!wzQ-u=C|Zqe}m zA6-rOlpxlBdj4Mmu-=h$EJ|6=6?4VsSP=e=!~DM~`byBp93~~Kra-WoGO^43+h%sJ zO4fmjSmi;=7!|Iot_TEV>ACBptASnBbN-6gscisc4}Fs!sAqub?>#xD@>Sm_pYE!v+Vxv{8s0c`{%Kbap1?A~p39Sx zgCzuOH;TcLN#7{!m!#4D$Tey`!i=nX)?#od9(>Lul&cWk7l+G)D69@Iyz4{`60bB~ z26B5C))7YolNvO1E)v~~`4EWg!`%Jfzgk-PrqrY?rTe;VGR?nsA6R`F4^2z8rz`LIiocTqhi6TqsM(z z7}mmm)`pH`p(N~m`)iUu`uLw+cIUh`(ivD{e%&q6i$oN}u|Z23r) zgTb+;PWNwnD?>!KnCAE8wV%M0obK9n^{U4!!qrC!xWZNM8J56R^ORJCQLdGWR#%b~ ztK8B2mGMfpIk(s}p{;ce3GQ&R>-q`Cj8;AwVbzlRZppn_s>GFGSQOp^$x@0n4#=u_ z2&@8JRaaDat`+0f00WdAVo`RGRVT`{&czAcU-kIR!_{X*tk0q$!gZhM5RmG4`4y@m z<4>qswETIX!U$G8O*kzf$y?J0w^E)_$FT0LjlqTWNuP!^U@?8wq3);Oc=|1_%8?j% zh9jd*xNlCQ8f1{r;ni(d52k|qylb>grFOOny`>@3Rzj{4-q8|2Ls&o2C00>Xgq(yX zMq%+Y*FKvW%VAZHfmpdPnWMe=LW*TY#s=U0Drz-Y%-b45znU=g1oMGm8R<&6-#uiJ zz2*AY4kUS8=W$;Tg@Tt&Taw!uA|vSZZxh6-)i@qkt?Lu^c!_hmcJ| z(5kxqfGT&_?FYsB+Sk6uoEgS8Xi*531;`@R@{r{a%bk?23V&nc--Ys8dsD1oecMb} zYRLMwr&n46mco_8rR|DUslzd>UBayZSG6DQs^67_D+R16;8h>sszu`1EtLI=CR|w{ zL-Uod2v^zYS*}MIZ}e&@nIEKZRjGLm!madjSmmH`4u%y>SgF2X3acKq zoKR>PNeElRzv6zLo__04_Zx@0&%gEe z4zEu2xZ~92%~RJol>@9AnM7R(=^aI(=vYHT{kx--2JH}P7#2qfGg=L19ueIa$GK0G z+exS$!=i3bWwMNAj_SsooDcFX=Dc>5m@J7_5(e+1|H}u^D)R4M(RNcbmE>WSL^F8p z%IxmJpJins@)`y<1{P^^=VXp|VF9cJv6e$B7F2hKSYyMhT%Hpc*3J~g@{tV^FSAf% za0Tz^ei5+%R=7a14q!s(dw=!fpFRE`p8DDA&-~^EK$Zio8_zq`y2Ik|=O22SA zRZlAe+k;bF(~QMj(j&a&Q7SG8o4;hY{8wgJm?E4FnGG!d5H(uqy;oo7v|!XN6uw0y zTOwpB#ggY*U|5yV+@~uYTuna|#2T-rf+ZCpe!*~kiDD)So2{n8)lHH>=p{}S8 z1dDie4}gV885D(|?5c7_Vb%FJ7&8inB_q#2J=Jrf2U!h0;%Y!y$Y7a%93r=y^~zU+ zk}m^KgN+alWzrE1C9}_uU|9YOZulxHWC5=_I@HdPH{&RPsn`*lvx~)eZ$eX2e)q;v z^Sqm!6|KIB7p8`2hE$3l7d=~9m`EHg6mo5Uv1eldKPE!eD{Poh7O7fAD677fSP?D} zvZN+l6^1n?1Z$^Itiz^ZIfCUbO~k_B;DT7O_Am6ht4;`(qgP;90IcsJ-~Ga$U-)xZ z6F&0{AWOw}=tOU|!`SVE}2u4|oJ zqLp5fB&t;EzdBy!wW?Why^~fc!NRq~hwvNRXq*7>OSAS=}JMY_qsd@(S4F; z_You`yBEiOhuyv|ERs{yF#E1ekGybG$CI`%b>%;oI+x2j^9o= z@x~s|a+@QpsHpIp2{8dJwubTLX&HC75+4?=qla5Zg<&~rwcs!d z54_vIu&^H|3qpacUTRpfrSN+%{?+4;KlRj8Kl|AWzxmb+;8Ua#`6~bxdDYiNyrPvsHsvI88TdXPg_b%{ zq^sE{0a-l3vX%f_qGSQD)}{@v9MM`9mIaFCE@0LkRkEnPC)IZ&Sp)LAF(BS7z!Tq~ z)kC=YLWmY$zQBsiFUY&T5OuW#xjr*jmJJ!MM_3iORm`vwi*_QerJ6m<%Yj9|K_@v* zC_eXPAy`qa%rPqo?=8{f{wa@799|tdRCVZ$H@eSrMg8Wf6Q_DEOO(4KS0j#G?N;S| zWO5%x_x{_Ay<$`YKr5p)A@%kl+d3gJSedpm`<|nUFe(Wry4uRO2}!FoAX$b8yTTxj zA0iYBR!1&gMHmg36r#R-lkXHp)nSvOR%$56EAUZ4RA{nA74|OVXZiilUElZ-er7gk zmP(`r9 zIH3a8e|#Ji%N2z`d*+#MJ@YNC3t1UL$pXzH&-xHF>p2_{w2BV4h+2wUg@UPn2G^OY zD8oHI0aR6wD*e*53YULJ$ilN8pp{@)6tAX$R@~4GKLhJQLY6!{%d%oHteA+=skyni zuO+5rkK|kC7yUY`!LMtVFcFSCOSFRO&I%BSMJh#lWzQu+EIdiFjA2zS3u1{Q%VaD# zvfQg9SE6GHYE_ihg|VU~WUFEzKEJ2{hJ69PMKFVy^o5j)9X7SScgc8LIAEQJ(v;$TxaSTn(RmT2I7!rRr%6epQ`!KXHc~!|HLg zYVw4mS=Uhwo&vj?g`)^A9(w~*BF*eh6RfC)HA<%<~J{}E__}J!+$BxtmhrcGRSgQ z;W;@9yoptRqo5_PTK#5%y`98LdxCqxt;)kw1JA3kUcEZVvjJb?Ww3V8O2S%}g0)1e z+629ts=tJ4(7j_17eZ1=?14YMqBG}=HR zb2ybgVrEI$RqDj02N28snsT>$OdDcNF9(w4PGMS75eja>6!XZsFscxfr#y&P++nlG zTL_kRu~YU@R)XuLCWbP{HlF@Nyd65s>8Rt~R_Ii4ny|tOLg^8T3G0lhSmtOT!&+-; z2E#%@_|YGBZGVFd>*W(n!rJWF++>qbg0PU-XZd{&t!NqT1VWKz#YbC4T@6wNX4=Ym z+}pZrDyJ>DM$4J7e7=kWDP54$rKb0s4;#&i!`(PmE-|uOEL~R|LK=dM8~`Zp*cX}- ztDp0MMJMZVXE)R_q&f zaHRxGGiF9z9XQHLa6y%;I;B@{J9_mt2-X2Ov0i-9QLGCNuzvHi*CAv%#CicF>sxAa zc>X&MvcBU$>%%+lbg1>=bGQYv1hoo^V8wzQRO>P-Sm6LtU3JgBSGNbS+8cw_;H$tV zhfS{%p{@?%xY{rXumW7+g>Y3%+^QFTRqNpjDptLegw4dPX1iJxtlV=dqE%DMoTiey zQIl)EzHA@81T_Gpq$=c!FJB01C0NN8p*#XsEhSMZ0ar`Vu+~Viu>4zFh07=mp<}t< zWDngdxfUcX4_DRYIMzVv=j3HnYoLOU0ZLe<3@hSR>y18mv<#sN%u2S|Z}V_<{CF&8 zt!se8;%B}j94N86Q*;*v%eFo%T5*z)3`^J3??UA4D~uUE)a_W6BUmRkku-`iLS{9L zP`L_B{?}wbI&me z1=EEBS;DY7iV<2R)3FMr87Y3ZS5whLRiR+|Rmi|9L>Z*MEVO)?rotoFX@kjYq-L#c*A_cAyrS1sVGmapz^AY2XB^0-=0yqa5kpk9_$*?YaW**}_~Sb|t;#RA6y#i|Gr78%xZQou437E3}I$=S8*4-T$& zxoXhi)uA`eJG?q^;;j=smoJ}?Z8?*ZJ^M!XbwX|***6)Iu=;hqmpHL9yA7?{1h6t; zRgST&q{qFjE#x$4Ce|aya&lcVLfD~OawJ$rQyQSX7kzEm;n`JAr1yB^b2MlYrC=GM zDkeRVv5_=(N*1CiXzL3S&I3C!S9e;*%+6qHaA4Ko;Rv_FubeJK<_?%&i9P z98@|5fWqnE>MCCVSNu3gmUYCzRRc&?JyFZp)fD8b2(Iwj;xNnIQ!ry;p$d?QKm`b6 zu{RY2s=frp@;KG}=t3}NShhCjNo^3e#E~+_tyEoqGVm+D4)ZdcVmp{mc~Ht)mb%dW zC`>C{P4mYCI;VgZ+l67Oi*4qL>MxVDO2}5gEgTN9zDQSt(%18m?zY{2J)u%Pmi?|f7tcWE887hRUxF|Jf@y6 z_kd(w?vdpaNR`pe6LaRka^&hZzzQA0{@rS3*sUWu>Ti#BJ!c*fE+ge(iPAn1T%%-G z8sZmrJ$tzwOQ||Qv+_Ca&=b);CmL2R>JB!=d%Y~!DOlb^Yp*HFV@T$VMhm{;-Cx0< zkaN_g=;t2Fap=m5np8RC2FzkR`QX9p(0! zQ4!k#Tyn55>}5gtwZ}-X{`Jj2dhL6t34vIGSwDN~XRb7Kr-Q5)2wKm_p!FT0THjIZ zB2?MQQV}N+D|2Z3p5IMxS~WDdXG5(XDqtNU zT!CT1Eh>;TH6`{d_nK|)%Q|H0bJr!n(3IiRRCA~W`$AP1RfEl6CS1h~>&Yvq12xe7 z>jG0P#;;6ve=?G*mZTn3tV)utwKYX6oZwcDVQW!14L{bj7+xOoqPv(sD~eN=T3g{y zf|g-dDTXESO6;49S`sF?mBfgyG?uFD+kEMlK&fp3v>LYsD2o9Lcx5Bd;>4;@S3~F$ z0-&ojC2L=Uj42NySdjf~JVD)QA_ClE`Z zDh|UExqWEJb`qL^l_?8We)9z3>JI%2ce?xnRijtAuA)X_b=U$`WXthj{2 zM0dIX^*87;NmeCx=a|)fb$D#GUG{yEVC{tJE_gMHvu2@{Q#tM-1Z#9Z=LYwidL{iq z%I)M=*r@983L=(6tP4uBq&Rd;>zNmxdEtfU17v-Nwc&?=tarX6j}M<0+#=&r_;QGa zDf)H6tQqj0kH(G_yAV*)kDJS z17=AXs0@o0;S_}RslJv_9Ez?bpA+7!&`vC!-Feb)s8@#7LOX*;DoyWeF|-mB!;?!- z#`4v$dkmM9g7y&9s>F~3#CIYVC>HWZr?Ci5(ubs%EWh6#dRkJU&%{~bp{lwBv5a0p z$pUb|mo<>^U9IczO+YJKW^c5raa)36rOpV|(iF=?cVk$LZ14n2B&@J3=h(q}QVSBY zjvhO?&&%K{ z1ZG-3L!L7^e$|&jR#U8F<-;BwD+@zHRut(TEAZO>&u3oQqryRjWx5Y&UITw!vM5}( zX+jm<;Ts*+tcL7P;uRW%-s3J6AqDq^n*B49el@dyzZHWDS#LwY0%Cm)fOYeGLa~?nIsV+|NJE>^*dq{EE~Hr8W!+&@N+}2BOq7}O0q=4Qpj=$RbMZ+D+&9=hGkNgqghjZ22NyBcuet9dUYl8 zlztVh-C!)*O6ccuByBXTo>-!jVRmd*n}K7BQ;A|wzff|u<~bIHtYx5;s91Q6)8L>a zYg)1%wGf1&RXv`Kz2Z<0Aj<)kc(8u^=`KtWV!0PEtD9ZI%cnMbE}O-D z-}TA4eUp=ObJ&!_Y?=N}4n5zNWSQNTEVJ9Ey8F%a>KM($>%F=HOa(nF7~Cf&CMLQ< z%xF%BpmSy(?eGrL9FrP4xKZ8w4Z83-ZVsl_>NUlCs)CzA*j8dEVM48nhM@})k`=;^ zoe)E6l*|36x4p4P2-b!tSR2)hmyz{^NUwI%;oflAQLND# zp;+R>+F!GP>?;<7d^nc%HpDAe4w7IIubz0~3E~w?LLP=%0$Pq`ImjYfz3{?!zXimS zQz6UUa(+ncB7S}N{D*>EAHI{>{%hdWulN2M^vWHBgQbu~Tym#eg9{F^09LJh4z?;> zeeUq;^M=|5Q{5fGs*P&GK2(JcvH(}OrT|w8S$#sU$fJl~q5PYQWcQXY8`Fu8uLG`T z19;66u4a8|UzCq5-;D`k4Lh(BUX@k28kPx$Qqf(`N~l=Nl}pgD+=<^_?w-c|Ciu74 zv(PlGCdpDkD>_7C00=~yLm7_)`gC6mB>kf6i|dh3l%vfKZSJNzfu+S@S;&f@%MfeD zyrX7yMS4<2kP#if^H~N78PQ-yh7i_JES5>dN`#8ftHE5O40Rt} z7@eWwK1%({45M%N(#-(00$x4##A~m8?1zp!RcwFvN_!dHvdk>42(Qdukr1p|A2up}_gM=| zZdoF+8si(suh1Y|8XLwH$kl3+VM#Hlh_&RvN*q}#yMtoc?da7qr2|%lj%op}rmK^O zVU-fBbVV4^tHpr|tpo?s#;bL?FerHUxK)8Ajlo!L-xf414_S@AZcJ%d>kLXZ4Xb(} zW>}Ig;|&c5w^YA6D0t-_tJzOKWl6Ye`yl`pBCs~QyQ>ISmrp>q+PqA_f^W26Ad8@d ztOl|w#j1Wy!y1b4$|v`=Dc36RY|t%)9iL@ezH zCh1j#SB1oKD!&Fgm=qia6{ES{P!#4PlS3JX)fA?3Ld>$v80L!;-xxOm%kT=2H9j!T zqHs_3xHr0Em#RA5hXGkx6of1X9bEka468wF!cj?T5X&f4_t9QqSPEHhtAOP#4S)37 z9|^%CV&S?#$cp8x*NIs%WPR(qfGwk1|H{~wJVfRa>~eth$D~-msJ#xP-02SYSitS@ z3UIYQ!YQypd~5jSm=p?7Yh9AD{F*}ZHAuotJo+r;YRhsO&?SVB1qJIUNV+E4LbMSy3nd=Sfd{lMF*xZnJv*IpxDJ+2h%WK6XHS?>|D1hZa$ z=7rZ^c-`aHcVGA}kxPJ!xb?4uY>{m}55NLc{qf%Yd;fUw*5LlV`v>=X)FL*?Lk|J1 z!BKlI7`;MGsBlHV!U>9XguaF;)P(|9@VaYV=ouD(=~7FdS>9D;*S28uROz%%96FlZ zo^z#a&yZmaEgFeMt-WP-j8}GPHajNPtFd8|*$t=Mh0m+QBw54d3PbnHYKa7EnO^rw zrB{G0!7G6$6X2(@3PAs=Q-a@usRmpSq_#RabCCK=Jj>J6`-oIgjY2t;Ocl9 zuDr*goUfr#lb0o8rosZT!WIgV+%;Clo3QRFzdCyC=;}^KuXdqJxT^||hC_#3Ie5N% zbMta{kHahk%eVuHG9*^ID5q1BMx`V~h99S&!%jjC@00kxp|ZBopksCE{?uq^&O`{A z>4>cjT@rsKO~Ve!Z9rl}hb^Gs9ec2Ho^IvSDanPf546d53gfI~+m4g>eum&2HK#*J zO-@8)<>QQZU{=>R{ts{}BsK)RGSPip*HEYrYiU`F2hgk4_Tg;1F9#i7dDWe5Li(^8 zyoj|hx}P)8z4TwbEfwLd1J)ya!r_%8SnfK>(}UHH$4`P{?I6#353u#RKO)F7;CdeS zcZ0(9uk_3Sq<-z-N>FNWzdsffv-Ap(H5$X0KvpXrM;1I_H4v@ivlaD#8F) zKq^(STC^ePdxTTX(O&xIG@pu>ew7XSo4qnCGS;m03R{R(j$mcMt8izRva{|2yUNZE z&w4UN^b*iAhLw`x*(yYrkXCod?vuz*-$X^wUX1+md54rV^$;kIw4`XdJyq4G-9C+ z>?g_c3n~ohz%gELo@T{B| z90F9OR;d=EFsxvCFZhVMf~LCXKhPe4*>aj|{22-+d#> zm>HKDj5h z{}%oYZW&bd3P>@UtIlCkog!4-!a{^xql#9LuNK%UtTo80^^ir5H3i73H^}OflCU{Y ztUj*G5$y^UVRPhdPtM>p2Use}O}_G|XyjR4LNVLoK&mC%k_Ee(Z5bW|yK;yH?JDco z)Y$MWDVCn@b6gA#muVX=Eo+w$UMz=IG>-zVNVD{eAxnK(53N&}5V9)56`9`QYhMf@ zeu`HsaZWo()%x)OR>#Zw7ao0hh9xpq%GV%xb^5f|u;O@`h+tU|mLS$W$FPpN`~73X zKdj%i%R$yF4zao&VC||p|M!R9LX(g&qYkYmHyvK}Od82@S3e<30^OxO*ncCVlQ~H4 z)9qe9T4tzB4Az~tXpV5g7N`nrO-w|oSRKLJpnG$`s5EMn{XyBOlPAlPy;L#}4P%3N z+_frfitSjD5zEA;LWlqky~4;e8mHA2!Zfs3+{3zO-ybxxRYY8as|GOuJ+P6O&l#@> zi@vl=Xz?`7Hn9f5-39hmSb4ND+*XQ{|J&hAnP?# zv5aP2a0Cm8g%eWN4#%-Tv|dji-~8qaI30Ao9tuTyb#F3&sas}P#mmAicOzRKFV0liZ?8-{Rz_MnCla?&W76Ql8pdn*d5n{QE zxAH7pj+roorut#z%t{zX1*{l0bMA{ca&%>V1>)6;c|?zEV^9jhQnZR?tS?0@<5qE- zaNQ%;;y|onRVNVZU=Xn!Mv-9MJLYW-J3rlpf^5*qZJqT>L zE(;0wjeuWG+J^dmdBE8qeZr_Hl!Tcf%SbL!+)1h?_~wpHJ$DJax)Z~dw_v&Co7i zT0wXdCig#b49h6iivTR(7VzpM7#6P`Bv}{UyTID;y{Dc^gBHs~ynfRGmE7MXXl2N( zdU^a?ynD#AhQ6AlhKel^HTPIWdAvg)U5wOcqv4Qr}T6C1Qi*sMzl zRkCUhVOJXSUPfTQ(()CSe@QJ!dL`AMBUui%mS#b%o)m@!cydP;khPS6s9FD1BWc?A zzRYt;%UtO#G{tH?>AQ*%>pveq z{+}Hx{XbuUVZ{~U@sx%|8^fqRS14H;y|mvb8h#({{Gv#;j5oe)h{`I+9}M)#t9uI z94ajcg=b+q{e;1lEv}b%856ELI?Q;5#$Ztv5z4{1Q9juy>=4i@>SjX4t6VN&8;#ah zB?WjNlH%7thw0|X>>j`?T1VKF*!~svQUt~Y4eLh^sIcV=VYRZ>q#~^P(oFYhQ?W$D zlI%W7?K{${{Hh_W%h64$7|#J@fnSaG`UrP0tX|+1Q?O7GKJmnBPYA*K-iszSr zp?i>8;W3Q2Xb!rva5hVZH4Dhf&X%fHQUNNZ@&@?Gg#`mC*cHZgD&4)jCUn~%Dk53a zAGlK)7Rc2!PT^Q_qcG*aS{xWS=L6kk7vcH}wJQf$>np;q*4MpwWo$}$l?S73kEU3W z(INJ{hY4s+h7SRLv1`;y!VkQLCFP(otoNy5xq1-E$gfnLKU8)8e0SBMs=q(~)+V=4 zY(jFMygqpfIqs|p_c6Ya)UJeKWlYIZ)bcC7GHscX)?j3GmrAg$t5m=0 z(4m}YqOe1k4#AqtI z;0K?DV>N|g!n{w$0>vs$oZ54azt}*sWUu%+QL(DIjDjkbq`Frw|DKUpt7F5%HjcBC zayuB-;Yh@C{Hk>Umqg28m~cOBSiKf83IWRy>j^-XLo9dv9W0vEFlF^&TIdWf8Xor(XZ&dkRC>qU8wWcN!`QWTo#j`K=T*jt(tLxWdR^EX#gwyS?~z1OTVtT8DG z2~#Kr9av?DXR}$>f{?JXCR@!${7Q!j`8G<$3W!B^jiEw0r`MLJE$Ck$i05aG9k7GZnV>sON5ci1%d8Wr8av>Iv{h&8IF zQC&Krn)}=HZyUpU?B)|s+yq{I4|o+QmXa*!SSMA;B4jzVy0F95g$}Z`HWb7%%zE#e z0$cpbL6$omVBM-CR@DhuDZ`S(gI4cCuL9S8k6FR;AokJP1t|z+pzug-Gz48cRhvL8 zMm9*OyG;#7O+hbPDY?4hC9Er79jRo2j>oI4BUM>I6{IVI)hw_JFDMFKK?o`}8%UO- z6$W)I8EaTxhnJ%1XJFQvJOr}Rhr!qM2g^h(VpTQWSyVw2{Hh`nu*k4zzKYa#WmlRY zbDS$B2v>K@6@&k649jz~q}ko?fBwRZ?x$mhMFs23mcSK#Sae~D&;5NMR{IZY*&%#| z^3}`dpMK+zY){3u96;9f5dhZY97{rnR+F8(``IEKB4~-P!G~Zmb(GvnbCT79<%>ce zDdT+&6K%1hVIsg)l(vTXPCFApM7_@2j!bXeJTIkI3Rw|&S)sVlD|>wwkmfAyL*mt-DDRGA4GxO(j)}q} zgC4Hn91T6fDY3jOy^_n%IxDXVW#N@CO_BLBtitIo!7CJjW2^+BTFuHOpp_jX!J1`l zI7@mptCY%P){?%2VdykkEqjWElfbnWEAU=;Up5mdnO609(l}}p(8Mb&B&^V%zre3n zRBs1j-BtDKZlX8X_&>t11oZw(#IU@CH9#L$=}y9FFS!e3-3y|-d%S_QpStS~FN1w-}5Kvi#Zmu%NiFx^j^7 zgG8%eeEth^t6#LnZ9-GuYg!j{2715HEYXlaunuTJc;K3-ST{+r09OiG1gw+h9|g~{ zW})B}WULGCX=SLFK$g<2_aeM{FEigePsnmKYQE0Bm$wmY8F)Foa!*-Bwy<9)mRPhn zz0;sIAy}5AVg-gJwgy8iO?B^^vI)XV$w1_wU|mVZ^)>%D?0(MbO&bG|szn(V5NnLI zieC(8sk>*9*DyQlg?3Gsao=W*SIzne(zVFyUhY^XX05GFyAm-`6-ujcdi>1vvS?V- z-bY%I5U|i3#8$#Z-R`v#B1Km$Lq@W$?j}cY;+&ZOISh-Dqo)@UheZV|xim-Cdo61{ zNQQOvpp=B#C%iZO!&i6h+68)b=)AieUcG$T;nk_j3>&@N4X^vish>_lZKrc|a$l$U zMTcBP2r+9YHBG2d?iP@2YbeU-?z)}c?nGEaTpxN{0~gijbf2oXUYT#SXtt{oR#i-e zVWl%iWBQcLX}2w^g{I(e4^2a}w?}*{URdadb&73o{O$j(Sf#(@Ha5;lNodQyG!JX- z_uNvCrCuah-r%nE>hLd;6w5dkd<`=KSHJ+$E2CKRj$vJU;wDJeYt*m^S46CfO0ZZE zf@Z~t1sRKowd1J(S5GA{Dsg0b=X>2nxKiON=;6rJZ0#2bYe6P;NU%O1 zT&NxNBZYA;mLJUVW_NL4#r$e2k>Vb!?^jwL)g&y3Q%0^>1q#U`QpvR>)M|KEioq;d z)iBU1Vpg+bVt$_u^azmf7D_yVP;4cg#U9GR-;$2WN%b;^%r4HJ-dX<+9T8@s#^k9 zM>&~u>|Xm$v$r0PO5kLH`=c;tKpT}{!-uYA&r<+nZi4q;PbCR*dLWLbUNUwDSKfnRVN=N1=b zt4T!|&cT{5qgUBzX)5r_#P-8UGnVe5&?#sH%rG5!f1Ol>^I8!;HvgF8Sl6CVzU2@vsc&_zr@2Z408Me zXqJ1UcGCR`6^laF=i+V9jF}@LvSG?(ci0*F*dd&X%0b!u+?<@hNupMB$)dvMbhf(( zD*sAql_hfNIc)Evk7HtX$1^Z1xn@m*H_?4~ZD}~b9eqJDG~5mJ>Tbf$ke1#5X@-@gSw1frVm|-N zY$>Z|%P?=WI{4fjUMkA$Zh$Sc%ETlE9 zI!_1*Xum7BtV!6b1PgG5SwdEXLb8JNuFg@Bu}+GXWekf4-o0mBi$a!1sT~Sn0JI$_ z347=H=%tdSkflAtNZE4#dc>;*VOnHaz9v-LJK!ok0qvdcBv?8`*vC+rOH<8JQeSfl zpQ41mM{$|51h&ZT-^O zXWbz^AU5}k)CP)ax*DbfzXD`QIjBY9y`zp{y$ZqoJZ1$@yjPKJWUoBJ3SEdq+2UBnriC4{m zR6SC*3iQgrN(fdqkSgCI)EPntUwj3M5w4VG%?3L|G@K*v1+L;o;p$QXvbG3UYs&}M zSPd?3iGamNJO@4Qv;3qS^l&wRF3&*1-o9vH#YhIpYQLM@E|E?`E@4=Yh)7N`EM2H7 z1ZzFa5lTMtK=3t8>n!1!4-Ouj*0cu3Vfo=_1Y#ZC=_j+(0cw1u{09uS2^)`1~QZFv7-C7y?orGOs=y}2?`1zUV zc+c}h?8MT-@QyI7q7Rr6f4gn^D%u)Vn|w~fR#;SDFxFKJJD-!Kpbs7`M4P=rMsoPh z3c`F~SWRYoXLN&5to-i3-dIU6tc?LboZ|_W`%(33d;4L>us$a^wR&(es5<1;Bv%~Lxo|SUu)wWM(X!f5p~^pq zW|?_++#+br*BubLB@hN_OSqOvSbXE~>K5^ekkzY@rCzK-m>WQ^8oY)zMWg!>1YvRP zS!+V}2OZ0Llx&r(4HJ-6%B;$;D*>yPVP#k?o?*2NyQ>8f)-bz;vxF?5)ffS4OuK=z zQNBz9vSj(hum`KvHIcHGB8CO|YHN-1)mmgAojwya2}!V~y~o{GgXd&!@Z4hP4X)r^ zmsuRtgDeJ1@v5XE{OSzLOju!=s)8dIP)LVRrg9QKEUqP_)gAO|S{T+nuetLAU~Nax z=+p4GcRQBl%EHaf6Ft{A@q}v>j!`%o_Dzyz^-G$&SQ@Z3r=KgIX&lvWDh@@~cA?Hadxo|9pKb8h%Zljk8}aZn^wMb#krAy{RljOK zY((m?uLFryIBhrKyRc$$23qHHW|U(kG%WhCuDR1xcV$>V0cKr%G5D}Ru`Yx$=p7N$ zQuKOihoO_QD*eDm#-WuQz4KNZ-qJV5wB|+3x<$-lMOX*a@(ha+4uGp8=oK>Cy|zI@ zW@^>cAd-8Z24M-o;?iePu#!Y81y|NQjJMajyN_o|wTjNHa4fK^7SFI+;?j`q!dYQh zj#z1e-su7RV=Vr{s`^O#&@SgWoi zJOlx&`~1t@Z@7w(34ZWkIfm8qW3^zpl5lsYd%CI+io4)dC%33l$I>RD(5p7t^2KzS z;KVA49Gy^@5`VjU-qDTE9adusoV5xi39GBfVVt6{tSDfnqgW${{_?{Y#1fF;U%-RKOuZ@ngA5wqs69Z-g)DwarC7sc3c^5WwswM~eL z!jrfj4;Zz>Ad6+;QwmxEt~_K3!&0y!R?U-Psj5Y0H80$%_ZBRs>=o8&QJBcdY5-(? zKG@JI`7#Z)8i`d~?_Hy!Um>rL1)<;h+yc-_is&VfWiQQHj!0+wlDsN`SRSj4VOfjN zF{?4tu;d-}E2NH6zcR&rI1XsAFuzsLumD+tPG}UamNp6nsMe+pu6#krVXkq@#gbt{ zAKNz&o39eh!IgE}YTCF${v(~iM6{@_7HstH(XYU;j>o8#oFQEFE57_TM3jRmA6B)c zHJlNKwI%s|YH1*3IfhmB^vg6gphXD%s(bVDCh&?D_qoYA1i5qad8CuuQ?WU)&?+UYo6JBu_sOr#sWQ4eP$$Sn2-5tGhq)Qg6 z7NbQu#gg?Cfmh{B!78!5C(_*U$QPm!ohaDdj~42nVIj_UxAZ>ojpmDg@-H^T{vvMo zbE;oSp!+nv?V??+60h1lzdGziD_0-lYll{zV6h||JzOJb)yjN#?ou_Cd)`EMC0HJ? zh*u)JUktkY$qPDE__&fQsS$VJs{mg+tTfyaVb*&FSPrFnZ_VE_W_8QGBc~FcMPdcx z1N~a&C|!tRXF#x87Z8foI@mh+d4ojxfngmvf`FM?^I##&U6N%k0kIG$<2aThSAs_L zxli#+BT>z^q+VBkWx2LKtK=#hTNqlhUSl`7!Zj?UYSy<3$6B;4$gLA1Uk$5_q;b1J5K!b#dSlh#f=KJ zp#ZK#y>dUW;8(KF>u{(CpY@>itboV=F%-{^sB zG&Wp&;^xhpzE7w%p}^G+aIBLYDs*pl5TSgBaL0}Z7d%w$2)rsj-rEtEga@c*^$LEW z9-PPHR&U*bc~P=@Sr)?cu5-{c3$j~rVW9@0SiFxk0J0of9bxQf{SnGnwG!seiV*v9 zFqPAMiC0VPbZ_QV;Z(HYiz)9KmaLG4z0d%ytb&#ne(v2=M6eXZ)W$I8Ye33ZQVM28 zbq7o_3TupShQordWDeHqu;CRIEX6BA*1cGACtj^>#dA7JvLt$xO1mx4skVt{QY>*_ z>G)vi53aAQXg#>1VKVD?b%by|T^2S*6FTX|sgDfqYmDJ4u`NgFmEWQ2{x#zrs?&HZ zpEUwsu#!lxl(ZEkjBgb?!8HLx>iGuw$iTI~A9|LQ3@L;Nai zEWy+(@GCF3C-JIP@#@)UBLVC1VQ(94RfffTW>h5iI?t~-m;<<)f9&S9U>$X6tgA=V%ws>bAQ?~EQ}AH*zCckoa?86S0h;KH969W z+&=flA=d8B&i+o7t$Z?azdA$w`J4o7}y81;~QY zT`cbC+H5GhqI_k|!BwSKs0JNewLhDXu#8?ktB-fVu+BoiYOQ&cx&hR=@>tsK4jp=j<{m{U*3s4%R) z=GZ(ckR`fSpQQMKP$4kuQns0p)t3#tN?!0yA6~((vhv7gMZJofgDpBhxD?C{V!j$1 z2E!U&qT?NN&%+Y#9+iK?X@<2{&VLnr?lwmlp;e$)>))9FwPi|KDmu#CWz zyvcA;z3zSi@;9eR;;=LMfH?%seSE3wz)-HL#(cti^^{g_ini|8ax*7*p$UzVz0SiJ%So7EBWtfnN z1yjRMySIz_fEj_TAvKPMh-8gH zmW1T4D7hgDm`PJB#jBh$ELlldq!G);a$t5qP@i-NnU0k!CN-=?HgaH9iAeXv0*Ww= z6I`NEG?tm$eFmvki}_TPANLX#ip9)d2*JX7B{g5+cVn7f9Tv!HH?V4zrl2B~VU>IQ z>fK+x3x0Lha{LHa?r?wW>-Ntm!fC}DY9!%t8W@Kx)l zZQ41Yl~sg}U9B8who3NXmvImyw_g)Dk{Q%=K#y$RnN=atOy~xkBszC!y4fxLdT#+ zXlQWA)juRwcaA>Gny-GbG-v=;oP?FhM7=^wNA61QtM7_Ht1Sv=P!(%Jrk!=ev#iMx zgS#hKIa) z5U7epip4fz7|h{u@h1+g1g;*ajHSl+laR7-ULbls!21V6vJ|Cayi&wMNjQH%C3hND zRfDIKG(xHn=Qrd2jR{v$5w`mOMZ&QNT1Q$NJZ3q5btE_%G#I(h(%faw7jM5gX9_%O zO0_Byt1LN|6@7i~IYrvVua#OET+P}8_Yyx0OCSSaX;|V#@pL#vmc>I0!Z^r%jsAtW zDojSpltC@QtF=TF7J4*+UPaN!dq}W6Vl7sPg0;bcoE3HmX>nJ?qU?TGz3%JBW%ERm zVY#>4N{m@$W0Q|Zt8wm1aA}}cr@7QixE0{)v`*wC8-x~!HO|C_=`)(*x8?V#($(PZ z_8-2=CgIEft{X=8&C4e?9lPoQx7s)24)_`v)c~ZL!+?%B+)1)@?pZwzZ94VLvXCE! z5{n4C0z^%;QN;?BOT6zT!aIo7#2xQ>S6;=ahN8!-9KWQ^T{soCPn2f5Cl=J(min+x zwctl_taqr-5X_fSt-OOFR_5*hz&l4lvbuIRZ%}fqu>IkHEBp>!U0Xfs0IU5d;p+Wo z+r7(5;YxM(XXTJC;V&J-dY26A-Lvo3oRy-mhJrgKteKfQoiP?g>9Kj-w2j_;?WPhe z0W4I6CojGj2o{-?!>0#|U=QTh?;LU|W(8XHK;BqM=>Cfi%zK(O&r-0icRp6Ge5$+q z_ncX%BegR9N-)batXAx~22iysUg4A|_bG23^((&ot26`qbWh=wGzYW5v25QI+0>Mf zEPUgtz-GlLe&g%FmQWRr;g;~2tV1iDNR$zHa;(a|%M!7M1-OV;OHo+}d+6}m@KS1N zeJNV;&9aa0Tl3rs0q<{$`D)yY?bY0&Dgh09NU-)8!CGWO!#N{YvTwpH4J+`v-xa4j zNfu}pIF?0@-i=fI8jW5xM#hD0cekx?3*AKR3d+pjdL*=;#t;7K;1;buEogPRI>E3a z
  • 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 + +
    + + + +
    +
    + + twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '' . __( 'Previous page', 'twentyseventeen' ) . '', + 'next_text' => '' . __( 'Next page', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ), + 'before_page_number' => '' . __( 'Page', 'twentyseventeen' ) . ' ', + ) + ); + + else : + ?> + +

    + + +
    +
    + +
    + + + + + + diff --git a/content/themes/twentyseventeen/sidebar.php b/content/themes/twentyseventeen/sidebar.php new file mode 100644 index 0000000..8233b23 --- /dev/null +++ b/content/themes/twentyseventeen/sidebar.php @@ -0,0 +1,20 @@ + + + diff --git a/content/themes/twentyseventeen/single.php b/content/themes/twentyseventeen/single.php new file mode 100644 index 0000000..541e2d2 --- /dev/null +++ b/content/themes/twentyseventeen/single.php @@ -0,0 +1,47 @@ + + +
    +
    +
    + + '' . __( 'Previous Post', 'twentyseventeen' ) . ' ' . twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '%title', + 'next_text' => '' . __( 'Next Post', 'twentyseventeen' ) . ' %title' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ) . '', + ) + ); + + endwhile; // End the loop. + ?> + +
    +
    + +
    + +>> TABLE OF CONTENTS: +---------------------------------------------------------------- +1.0 Normalize +2.0 Accessibility +3.0 Alignments +4.0 Clearings +5.0 Typography +6.0 Forms +7.0 Formatting +8.0 Lists +9.0 Tables +10.0 Links +11.0 Featured Image Hover +12.0 Navigation +13.0 Layout + 13.1 Header + 13.2 Front Page + 13.3 Regular Content + 13.4 Posts + 13.5 Pages + 13.6 Footer +14.0 Comments +15.0 Widgets +16.0 Media + 16.1 Galleries +17.0 Customizer +18.0 SVGs Fallbacks +19.0 Media Queries +20.0 Print +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +1.0 Normalize +Styles based on Normalize v5.0.0 @link https://github.com/necolas/normalize.css +--------------------------------------------------------------*/ + +html { + font-family: sans-serif; + line-height: 1.15; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +figcaption, +figure, +main { + display: block; +} + +figure { + margin: 1em 0; +} + +hr { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible; +} + +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +a:active, +a:hover { + outline-width: 0; +} + +abbr[title] { + border-bottom: 1px #767676 dotted; + text-decoration: none; +} + +b, +strong { + font-weight: inherit; +} + +b, +strong { + font-weight: 700; +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +dfn { + font-style: italic; +} + +mark { + background-color: #eee; + color: #222; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +audio, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +img { + border-style: none; +} + +svg:not(:root) { + overflow: hidden; +} + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +fieldset { + border: 1px solid #bbb; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +progress { + display: inline-block; + vertical-align: baseline; +} + +textarea { + overflow: auto; +} + +[type="checkbox"], +[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + 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-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +details, +menu { + display: block; +} + +summary { + display: list-item; +} + +canvas { + display: inline-block; +} + +template { + display: none; +} + +[hidden] { + display: none; +} + +/*-------------------------------------------------------------- +2.0 Accessibility +--------------------------------------------------------------*/ + +/* Text meant only for screen readers. */ + +.screen-reader-text { + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + overflow: hidden; + position: absolute !important; + width: 1px; + word-wrap: normal !important; /* Many screen reader and browser combinations announce broken words as they would appear visually. */ +} + +.screen-reader-text:focus { + background-color: #f1f1f1; + -webkit-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + color: #21759b; + display: block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 700; + height: auto; + left: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; /* Above WP toolbar. */ +} + +/*-------------------------------------------------------------- +3.0 Alignments +--------------------------------------------------------------*/ + +.alignleft { + display: inline; + float: left; + margin-right: 1.5em; +} + +.alignright { + display: inline; + float: right; + margin-left: 1.5em; +} + +.aligncenter { + clear: both; + display: block; + margin-left: auto; + margin-right: auto; +} + +/*-------------------------------------------------------------- +4.0 Clearings +--------------------------------------------------------------*/ + +.clear:before, +.clear:after, +.entry-content:before, +.entry-content:after, +.entry-footer:before, +.entry-footer:after, +.comment-content:before, +.comment-content:after, +.site-header:before, +.site-header:after, +.site-content:before, +.site-content:after, +.site-footer:before, +.site-footer:after, +.nav-links:before, +.nav-links:after, +.pagination:before, +.pagination:after, +.comment-author:before, +.comment-author:after, +.widget-area:before, +.widget-area:after, +.widget:before, +.widget:after, +.comment-meta:before, +.comment-meta:after { + content: ""; + display: table; + table-layout: fixed; +} + +.clear:after, +.entry-content:after, +.entry-footer:after, +.comment-content:after, +.site-header:after, +.site-content:after, +.site-footer:after, +.nav-links:after, +.pagination:after, +.comment-author:after, +.widget-area:after, +.widget:after, +.comment-meta:after { + clear: both; +} + +/*-------------------------------------------------------------- +5.0 Typography +--------------------------------------------------------------*/ + +body, +button, +input, +select, +textarea { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; + font-size: 15px; + font-size: 0.9375rem; + font-weight: 400; + line-height: 1.66; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + clear: both; + line-height: 1.4; + margin: 0 0 0.75em; + padding: 1.5em 0 0; +} + +h1:first-child, +h2:first-child, +h3:first-child, +h4:first-child, +h5:first-child, +h6:first-child { + padding-top: 0; +} + +h1 { + font-size: 24px; + font-size: 1.5rem; + font-weight: 300; +} + +h2, +.home.blog .entry-title { + color: #666; + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; +} + +h3 { + color: #333; + font-size: 18px; + font-size: 1.125rem; + font-weight: 300; +} + +h4 { + color: #333; + font-size: 16px; + font-size: 1rem; + font-weight: 800; +} + +h5 { + color: #767676; + font-size: 13px; + font-size: 0.8125rem; + font-weight: 800; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +h6 { + color: #333; + font-size: 15px; + font-size: 0.9375rem; + font-weight: 800; +} + +p { + margin: 0 0 1.5em; + padding: 0; +} + +dfn, +cite, +em, +i { + font-style: italic; +} + +blockquote { + color: #666; + font-size: 18px; + font-size: 1.125rem; + font-style: italic; + line-height: 1.7; + margin: 0; + overflow: hidden; + padding: 0; +} + +blockquote cite { + display: block; + font-style: normal; + font-weight: 600; + margin-top: 0.5em; +} + +address { + margin: 0 0 1.5em; +} + +pre { + background: #eee; + font-family: "Courier 10 Pitch", Courier, monospace; + font-size: 15px; + font-size: 0.9375rem; + line-height: 1.6; + margin-bottom: 1.6em; + max-width: 100%; + overflow: auto; + padding: 1.6em; +} + +code, +kbd, +tt, +var { + font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; + font-size: 15px; + font-size: 0.9375rem; +} + +abbr, +acronym { + border-bottom: 1px dotted #666; + cursor: help; +} + +mark, +ins { + background: #eee; + text-decoration: none; +} + +big { + font-size: 125%; +} + +blockquote { + quotes: "" ""; +} + +q { + quotes: "“" "”" "‘" "’"; +} + +blockquote:before, +blockquote:after { + content: ""; +} + +:focus { + outline: none; +} + +/* Typography for Arabic Font */ + +html[lang="ar"] body, +html[lang="ar"] button, +html[lang="ar"] input, +html[lang="ar"] select, +html[lang="ar"] textarea, +html[lang="ary"] body, +html[lang="ary"] button, +html[lang="ary"] input, +html[lang="ary"] select, +html[lang="ary"] textarea, +html[lang="azb"] body, +html[lang="azb"] button, +html[lang="azb"] input, +html[lang="azb"] select, +html[lang="azb"] textarea, +html[lang="fa-IR"] body, +html[lang="fa-IR"] button, +html[lang="fa-IR"] input, +html[lang="fa-IR"] select, +html[lang="fa-IR"] textarea, +html[lang="haz"] body, +html[lang="haz"] button, +html[lang="haz"] input, +html[lang="haz"] select, +html[lang="haz"] textarea, +html[lang="ps"] body, +html[lang="ps"] button, +html[lang="ps"] input, +html[lang="ps"] select, +html[lang="ps"] textarea, +html[lang="ur"] body, +html[lang="ur"] button, +html[lang="ur"] input, +html[lang="ur"] select, +html[lang="ur"] textarea { + font-family: Tahoma, Arial, sans-serif; +} + +html[lang="ar"] h1, +html[lang="ar"] h2, +html[lang="ar"] h3, +html[lang="ar"] h4, +html[lang="ar"] h5, +html[lang="ar"] h6, +html[lang="ary"] h1, +html[lang="ary"] h2, +html[lang="ary"] h3, +html[lang="ary"] h4, +html[lang="ary"] h5, +html[lang="ary"] h6, +html[lang="azb"] h1, +html[lang="azb"] h2, +html[lang="azb"] h3, +html[lang="azb"] h4, +html[lang="azb"] h5, +html[lang="azb"] h6, +html[lang="fa-IR"] h1, +html[lang="fa-IR"] h2, +html[lang="fa-IR"] h3, +html[lang="fa-IR"] h4, +html[lang="fa-IR"] h5, +html[lang="fa-IR"] h6, +html[lang="haz"] h1, +html[lang="haz"] h2, +html[lang="haz"] h3, +html[lang="haz"] h4, +html[lang="haz"] h5, +html[lang="haz"] h6, +html[lang="ps"] h1, +html[lang="ps"] h2, +html[lang="ps"] h3, +html[lang="ps"] h4, +html[lang="ps"] h5, +html[lang="ps"] h6, +html[lang="ur"] h1, +html[lang="ur"] h2, +html[lang="ur"] h3, +html[lang="ur"] h4, +html[lang="ur"] h5, +html[lang="ur"] h6 { + font-weight: 700; +} + +/* Typography for Chinese Font */ + +html[lang^="zh-"] body, +html[lang^="zh-"] button, +html[lang^="zh-"] input, +html[lang^="zh-"] select, +html[lang^="zh-"] textarea { + font-family: "PingFang TC", "Helvetica Neue", Helvetica, STHeitiTC-Light, Arial, sans-serif; +} + +html[lang="zh-CN"] body, +html[lang="zh-CN"] button, +html[lang="zh-CN"] input, +html[lang="zh-CN"] select, +html[lang="zh-CN"] textarea { + font-family: "PingFang SC", "Helvetica Neue", Helvetica, STHeitiSC-Light, Arial, sans-serif; +} + +html[lang^="zh-"] h1, +html[lang^="zh-"] h2, +html[lang^="zh-"] h3, +html[lang^="zh-"] h4, +html[lang^="zh-"] h5, +html[lang^="zh-"] h6 { + font-weight: 700; +} + +/* Typography for Cyrillic Font */ + +html[lang="bg-BG"] body, +html[lang="bg-BG"] button, +html[lang="bg-BG"] input, +html[lang="bg-BG"] select, +html[lang="bg-BG"] textarea, +html[lang="ru-RU"] body, +html[lang="ru-RU"] button, +html[lang="ru-RU"] input, +html[lang="ru-RU"] select, +html[lang="ru-RU"] textarea, +html[lang="uk"] body, +html[lang="uk"] button, +html[lang="uk"] input, +html[lang="uk"] select, +html[lang="uk"] textarea { + font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, sans-serif; +} + +html[lang="bg-BG"] h1, +html[lang="bg-BG"] h2, +html[lang="bg-BG"] h3, +html[lang="bg-BG"] h4, +html[lang="bg-BG"] h5, +html[lang="bg-BG"] h6, +html[lang="ru-RU"] h1, +html[lang="ru-RU"] h2, +html[lang="ru-RU"] h3, +html[lang="ru-RU"] h4, +html[lang="ru-RU"] h5, +html[lang="ru-RU"] h6, +html[lang="uk"] h1, +html[lang="uk"] h2, +html[lang="uk"] h3, +html[lang="uk"] h4, +html[lang="uk"] h5, +html[lang="uk"] h6 { + font-weight: 700; + line-height: 1.2; +} + +/* Typography for Devanagari Font */ + +html[lang="bn-BD"] body, +html[lang="bn-BD"] button, +html[lang="bn-BD"] input, +html[lang="bn-BD"] select, +html[lang="bn-BD"] textarea, +html[lang="hi-IN"] body, +html[lang="hi-IN"] button, +html[lang="hi-IN"] input, +html[lang="hi-IN"] select, +html[lang="hi-IN"] textarea, +html[lang="mr-IN"] body, +html[lang="mr-IN"] button, +html[lang="mr-IN"] input, +html[lang="mr-IN"] select, +html[lang="mr-IN"] textarea { + font-family: Arial, sans-serif; +} + +html[lang="bn-BD"] h1, +html[lang="bn-BD"] h2, +html[lang="bn-BD"] h3, +html[lang="bn-BD"] h4, +html[lang="bn-BD"] h5, +html[lang="bn-BD"] h6, +html[lang="hi-IN"] h1, +html[lang="hi-IN"] h2, +html[lang="hi-IN"] h3, +html[lang="hi-IN"] h4, +html[lang="hi-IN"] h5, +html[lang="hi-IN"] h6, +html[lang="mr-IN"] h1, +html[lang="mr-IN"] h2, +html[lang="mr-IN"] h3, +html[lang="mr-IN"] h4, +html[lang="mr-IN"] h5, +html[lang="mr-IN"] h6 { + font-weight: 700; +} + +/* Typography for Greek Font */ + +html[lang="el"] body, +html[lang="el"] button, +html[lang="el"] input, +html[lang="el"] select, +html[lang="el"] textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +html[lang="el"] h1, +html[lang="el"] h2, +html[lang="el"] h3, +html[lang="el"] h4, +html[lang="el"] h5, +html[lang="el"] h6 { + font-weight: 700; + line-height: 1.3; +} + +/* Typography for Gujarati Font */ + +html[lang="gu-IN"] body, +html[lang="gu-IN"] button, +html[lang="gu-IN"] input, +html[lang="gu-IN"] select, +html[lang="gu-IN"] textarea { + font-family: Arial, sans-serif; +} + +html[lang="gu-IN"] h1, +html[lang="gu-IN"] h2, +html[lang="gu-IN"] h3, +html[lang="gu-IN"] h4, +html[lang="gu-IN"] h5, +html[lang="gu-IN"] h6 { + font-weight: 700; +} + +/* Typography for Hebrew Font */ + +html[lang="he-IL"] body, +html[lang="he-IL"] button, +html[lang="he-IL"] input, +html[lang="he-IL"] select, +html[lang="he-IL"] textarea { + font-family: "Arial Hebrew", Arial, sans-serif; +} + +html[lang="he-IL"] h1, +html[lang="he-IL"] h2, +html[lang="he-IL"] h3, +html[lang="he-IL"] h4, +html[lang="he-IL"] h5, +html[lang="he-IL"] h6 { + font-weight: 700; +} + +/* Typography for Japanese Font */ + +html[lang="ja"] body, +html[lang="ja"] button, +html[lang="ja"] input, +html[lang="ja"] select, +html[lang="ja"] textarea { + font-family: "Hiragino Kaku Gothic Pro", Meiryo, sans-serif; +} + +html[lang="ja"] h1, +html[lang="ja"] h2, +html[lang="ja"] h3, +html[lang="ja"] h4, +html[lang="ja"] h5, +html[lang="ja"] h6 { + font-weight: 700; +} + +/* Typography for Korean font */ + +html[lang="ko-KR"] body, +html[lang="ko-KR"] button, +html[lang="ko-KR"] input, +html[lang="ko-KR"] select, +html[lang="ko-KR"] textarea { + font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Nanum Gothic", Dotum, sans-serif; +} + +html[lang="ko-KR"] h1, +html[lang="ko-KR"] h2, +html[lang="ko-KR"] h3, +html[lang="ko-KR"] h4, +html[lang="ko-KR"] h5, +html[lang="ko-KR"] h6 { + font-weight: 600; +} + +/* Typography for Thai Font */ + +html[lang="th"] h1, +html[lang="th"] h2, +html[lang="th"] h3, +html[lang="th"] h4, +html[lang="th"] h5, +html[lang="th"] h6 { + line-height: 1.65; + font-family: "Sukhumvit Set", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +html[lang="th"] body, +html[lang="th"] button, +html[lang="th"] input, +html[lang="th"] select, +html[lang="th"] textarea { + line-height: 1.8; + font-family: "Sukhumvit Set", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +/* Remove letter-spacing for all non-latin alphabets */ + +html[lang="ar"] *, +html[lang="ary"] *, +html[lang="azb"] *, +html[lang="haz"] *, +html[lang="ps"] *, +html[lang^="zh-"] *, +html[lang="bg-BG"] *, +html[lang="ru-RU"] *, +html[lang="uk"] *, +html[lang="bn-BD"] *, +html[lang="hi-IN"] *, +html[lang="mr-IN"] *, +html[lang="el"] *, +html[lang="gu-IN"] *, +html[lang="he-IL"] *, +html[lang="ja"] *, +html[lang="ko-KR"] *, +html[lang="th"] * { + letter-spacing: 0 !important; +} + +/*-------------------------------------------------------------- +6.0 Forms +--------------------------------------------------------------*/ + +label { + color: #333; + display: block; + font-weight: 800; + margin-bottom: 0.5em; +} + +fieldset { + margin-bottom: 1em; +} + +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 { + color: #666; + background: #fff; + background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0)); + border: 1px solid #bbb; + -webkit-border-radius: 3px; + border-radius: 3px; + display: block; + padding: 0.7em; + width: 100%; +} + +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 { + color: #222; + border-color: #333; +} + +select { + border: 1px solid #bbb; + -webkit-border-radius: 3px; + border-radius: 3px; + height: 3em; + max-width: 100%; +} + +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; +} + +input[type="radio"], +input[type="checkbox"] { + margin-right: 0.5em; +} + +input[type="radio"] + label, +input[type="checkbox"] + label { + font-weight: 400; +} + +button, +input[type="button"], +input[type="submit"] { + background-color: #222; + border: 0; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + line-height: 1; + padding: 1em 2em; + text-shadow: none; + -webkit-transition: background 0.2s; + transition: background 0.2s; +} + +input + button, +input + input[type="button"], +input + input[type="submit"] { + padding: 0.75em 2em; +} + +button.secondary, +input[type="reset"], +input[type="button"].secondary, +input[type="reset"].secondary, +input[type="submit"].secondary { + background-color: #ddd; + color: #222; +} + +:not( .mejs-button ) > button:hover, +:not( .mejs-button ) > button:focus, +input[type="button"]:hover, +input[type="button"]:focus, +input[type="submit"]:hover, +input[type="submit"]:focus { + background: #767676; +} + +button.secondary:hover, +button.secondary:focus, +input[type="reset"]:hover, +input[type="reset"]:focus, +input[type="button"].secondary:hover, +input[type="button"].secondary:focus, +input[type="reset"].secondary:hover, +input[type="reset"].secondary:focus, +input[type="submit"].secondary:hover, +input[type="submit"].secondary:focus { + background: #bbb; +} + +/* Placeholder text color -- selectors need to be separate to work. */ +::-webkit-input-placeholder { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; +} + +:-moz-placeholder { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; +} + +::-moz-placeholder { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; + opacity: 1; + /* Since FF19 lowers the opacity of the placeholder by default */ +} + +:-ms-input-placeholder { + color: #333; + font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif; +} + +/*-------------------------------------------------------------- +7.0 Formatting +--------------------------------------------------------------*/ + +hr { + background-color: #bbb; + border: 0; + height: 1px; + margin-bottom: 1.5em; +} + +/*-------------------------------------------------------------- +8.0 Lists +--------------------------------------------------------------*/ + +ul, +ol { + margin: 0 0 1.5em; + padding: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li > ul, +li > ol { + margin-bottom: 0; + margin-left: 1.5em; +} + +dt { + font-weight: 700; +} + +dd { + margin: 0 1.5em 1.5em; +} + +/*-------------------------------------------------------------- +9.0 Tables +--------------------------------------------------------------*/ + +table { + border-collapse: collapse; + margin: 0 0 1.5em; + width: 100%; +} + +thead th { + border-bottom: 2px solid #bbb; + padding-bottom: 0.5em; +} + +th { + padding: 0.4em; + text-align: left; +} + +tr { + border-bottom: 1px solid #eee; +} + +td { + padding: 0.4em; +} + +th:first-child, +td:first-child { + padding-left: 0; +} + +th:last-child, +td:last-child { + padding-right: 0; +} + +/*-------------------------------------------------------------- +10.0 Links +--------------------------------------------------------------*/ + +a { + color: #222; + text-decoration: none; +} + +a:focus { + outline: thin dotted; +} + +a:hover, +a:active { + color: #000; + outline: 0; +} + +/* Hover effects */ + +.entry-content a, +.entry-summary a, +.comment-content a, +.widget a, +.site-footer .widget-area a, +.posts-navigation a, +.widget_authors a strong { + -webkit-box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1); + box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1); + -webkit-transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out, -webkit-box-shadow 130ms ease-in-out; +} + +.entry-title a, +.entry-meta a, +.page-links a, +.page-links a .page-number, +.entry-footer a, +.entry-footer .cat-links a, +.entry-footer .tags-links a, +.edit-link a, +.post-navigation a, +.logged-in-as a, +.comment-navigation a, +.comment-metadata a, +.comment-metadata a.comment-edit-link, +.comment-reply-link, +a .nav-title, +.pagination a, +.comments-pagination a, +.site-info a, +.widget .widget-title a, +.widget ul li a, +.site-footer .widget-area ul li a, +.site-footer .widget-area ul li a { + -webkit-box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 1); + box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 1); + text-decoration: none; + -webkit-transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out; + transition: color 80ms ease-in, box-shadow 130ms ease-in-out, -webkit-box-shadow 130ms ease-in-out; +} + +.entry-content a:focus, +.entry-content a:hover, +.entry-summary a:focus, +.entry-summary a:hover, +.comment-content a:focus, +.comment-content a:hover, +.widget a:focus, +.widget a:hover, +.site-footer .widget-area a:focus, +.site-footer .widget-area a:hover, +.posts-navigation a:focus, +.posts-navigation a:hover, +.comment-metadata a:focus, +.comment-metadata a:hover, +.comment-metadata a.comment-edit-link:focus, +.comment-metadata a.comment-edit-link:hover, +.comment-reply-link:focus, +.comment-reply-link:hover, +.widget_authors a:focus strong, +.widget_authors a:hover strong, +.entry-title a:focus, +.entry-title a:hover, +.entry-meta a:focus, +.entry-meta a:hover, +.page-links a:focus .page-number, +.page-links a:hover .page-number, +.entry-footer a:focus, +.entry-footer a:hover, +.entry-footer .cat-links a:focus, +.entry-footer .cat-links a:hover, +.entry-footer .tags-links a:focus, +.entry-footer .tags-links a:hover, +.post-navigation a:focus, +.post-navigation a:hover, +.pagination a:not(.prev):not(.next):focus, +.pagination a:not(.prev):not(.next):hover, +.comments-pagination a:not(.prev):not(.next):focus, +.comments-pagination a:not(.prev):not(.next):hover, +.logged-in-as a:focus, +.logged-in-as a:hover, +a:focus .nav-title, +a:hover .nav-title, +.edit-link a:focus, +.edit-link a:hover, +.site-info a:focus, +.site-info a:hover, +.widget .widget-title a:focus, +.widget .widget-title a:hover, +.widget ul li a:focus, +.widget ul li a:hover { + color: #000; + -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); + box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1); +} + +/* Fixes linked images */ +.entry-content a img, +.comment-content a img, +.widget a img { + -webkit-box-shadow: 0 0 0 8px #fff; + box-shadow: 0 0 0 8px #fff; +} + +.post-navigation a:focus .icon, +.post-navigation a:hover .icon { + color: #222; +} + +/*-------------------------------------------------------------- +11.0 Featured Image Hover +--------------------------------------------------------------*/ + +.post-thumbnail { + margin-bottom: 1em; +} + +.post-thumbnail a img { + -webkit-backface-visibility: hidden; + -webkit-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.post-thumbnail a:hover img, +.post-thumbnail a:focus img { + opacity: 0.7; +} + +/*-------------------------------------------------------------- +12.0 Navigation +--------------------------------------------------------------*/ + +.navigation-top { + background: #fff; + border-bottom: 1px solid #eee; + border-top: 1px solid #eee; + font-size: 16px; + font-size: 1rem; + position: relative; +} + +.navigation-top .wrap { + max-width: 1000px; + padding: 0; +} + +.navigation-top a { + color: #222; + font-weight: 600; + -webkit-transition: color 0.2s; + transition: color 0.2s; +} + +.navigation-top .current-menu-item > a, +.navigation-top .current_page_item > a { + color: #767676; +} + +.main-navigation { + clear: both; + display: block; +} + +.main-navigation ul { + background: #fff; + list-style: none; + margin: 0; + padding: 0 1.5em; + text-align: left; +} + +/* Hide the menu on small screens when JavaScript is available. + * It only works with JavaScript. + */ + +.js .main-navigation ul, +.main-navigation .menu-item-has-children > a > .icon, +.main-navigation .page_item_has_children > a > .icon, +.main-navigation ul a > .icon { + display: none; +} + +.main-navigation > div > ul { + border-top: 1px solid #eee; + padding: 0.75em 1.695em; +} + +.js .main-navigation.toggled-on > div > ul { + display: block; +} + +.main-navigation ul ul { + padding: 0 0 0 1.5em; +} + +.main-navigation ul ul.toggled-on { + display: block; +} + +.main-navigation ul ul a { + letter-spacing: 0; + padding: 0.4em 0; + position: relative; + text-transform: none; +} + +.main-navigation li { + border-bottom: 1px solid #eee; + position: relative; +} + +.main-navigation li li, +.main-navigation li:last-child { + border: 0; +} + +.main-navigation a { + display: block; + padding: 0.5em 0; + text-decoration: none; +} + +.main-navigation a:hover { + color: #767676; +} + +/* Menu toggle */ + +.menu-toggle { + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + color: #222; + display: none; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + line-height: 1.5; + margin: 1px auto 2px; + padding: 1em; + text-shadow: none; +} + +/* Display the menu toggle when JavaScript is available. */ + +.js .menu-toggle { + display: block; +} + +.main-navigation.toggled-on ul.nav-menu { + display: block; +} + +.menu-toggle:hover, +.menu-toggle:focus { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.menu-toggle:focus { + outline: thin solid; +} + +.menu-toggle .icon { + margin-right: 0.5em; + top: -2px; +} + +.toggled-on .menu-toggle .icon-bars, +.menu-toggle .icon-close { + display: none; +} + +.toggled-on .menu-toggle .icon-close { + display: inline-block; +} + +/* Dropdown Toggle */ + +.dropdown-toggle { + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + color: #222; + display: block; + font-size: 16px; + right: -0.5em; + line-height: 1.5; + margin: 0 auto; + padding: 0.5em; + position: absolute; + text-shadow: none; + top: 0; +} + +.dropdown-toggle:hover, +.dropdown-toggle:focus { + background: transparent; +} + +.dropdown-toggle:focus { + outline: thin dotted; +} + +.dropdown-toggle.toggled-on .icon { + -ms-transform: rotate(-180deg); /* IE 9 */ + -webkit-transform: rotate(-180deg); /* Chrome, Safari, Opera */ + transform: rotate(-180deg); +} + +/* Scroll down arrow */ + +.site-header .menu-scroll-down { + display: none; +} + +/*-------------------------------------------------------------- +13.0 Layout +--------------------------------------------------------------*/ + +html { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +*, +*:before, +*:after { + /* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ + -webkit-box-sizing: inherit; + -moz-box-sizing: inherit; + box-sizing: inherit; +} + +body { + background: #fff; + /* Fallback for when there is no custom background color defined. */ +} + +#page { + position: relative; + word-wrap: break-word; +} + +.wrap { + margin-left: auto; + margin-right: auto; + max-width: 700px; + padding-left: 2em; + padding-right: 2em; +} + +.wrap:after { + clear: both; + content: ""; + display: block; +} + +/*-------------------------------------------------------------- +13.1 Header +--------------------------------------------------------------*/ + +#masthead .wrap { + position: relative; +} + +.site-header { + background-color: #fafafa; + position: relative; +} + +/* Site branding */ + +.site-branding { + padding: 1em 0; + position: relative; + -webkit-transition: margin-bottom 0.2s; + transition: margin-bottom 0.2s; + z-index: 3; +} + +.site-branding a { + text-decoration: none; + -webkit-transition: opacity 0.2s; + transition: opacity 0.2s; +} + +.site-branding a:hover, +.site-branding a:focus { + opacity: 0.7; +} + +.site-title { + clear: none; + font-size: 24px; + font-size: 1.5rem; + font-weight: 800; + line-height: 1.25; + letter-spacing: 0.08em; + margin: 0; + padding: 0; + text-transform: uppercase; +} + +.site-title, +.site-title a { + color: #222; + opacity: 1; /* Prevent opacity from changing during selective refreshes in the customize preview */ +} + +body.has-header-image .site-title, +body.has-header-video .site-title, +body.has-header-image .site-title a, +body.has-header-video .site-title a { + color: #fff; +} + +.site-description { + color: #666; + font-size: 13px; + font-size: 0.8125rem; + margin-bottom: 0; +} + +body.has-header-image .site-description, +body.has-header-video .site-description { + color: #fff; + opacity: 0.8; +} + +.custom-logo-link { + display: inline-block; + padding-right: 1em; + vertical-align: middle; + width: auto; +} + +.custom-logo-link img { + display: inline-block; + max-height: 80px; + width: auto; +} + +body.home.title-tagline-hidden.has-header-image .custom-logo-link img, +body.home.title-tagline-hidden.has-header-video .custom-logo-link img { + max-height: 200px; + max-width: 100%; +} + +.custom-logo-link a:hover, +.custom-logo-link a:focus { + opacity: 0.9; +} + +body:not(.title-tagline-hidden) .site-branding-text { + display: inline-block; + max-width: 100%; + vertical-align: middle; +} + +.custom-header { + position: relative; +} + +.has-header-image.twentyseventeen-front-page .custom-header, +.has-header-video.twentyseventeen-front-page .custom-header, +.has-header-image.home.blog .custom-header, +.has-header-video.home.blog .custom-header { + display: table; + height: 300px; + height: 75vh; + width: 100%; +} + +.custom-header-media { + bottom: 0; + left: 0; + overflow: hidden; + position: absolute; + right: 0; + top: 0; + width: 100%; +} + +.custom-header-media:before { + /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#000000+0,000000+100&0+0,0.3+75 */ + background: -moz-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%); /* FF3.6-15 */ + background: -webkit-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%); /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000", endColorstr="#4d000000", GradientType=0); /* IE6-9 */ + bottom: 0; + content: ""; + display: block; + height: 100%; + left: 0; + position: absolute; + right: 0; + z-index: 2; +} + +.has-header-image .custom-header-media img, +.has-header-video .custom-header-media video, +.has-header-video .custom-header-media iframe { + position: fixed; + height: auto; + left: 50%; + max-width: 1000%; + min-height: 100%; + min-width: 100%; + min-width: 100vw; /* vw prevents 1px gap on left that 100% has */ + width: auto; + top: 50%; + padding-bottom: 1px; /* Prevent header from extending beyond the footer */ + -ms-transform: translateX(-50%) translateY(-50%); + -moz-transform: translateX(-50%) translateY(-50%); + -webkit-transform: translateX(-50%) translateY(-50%); + transform: translateX(-50%) translateY(-50%); +} + +.wp-custom-header .wp-custom-header-video-button { /* Specificity prevents .color-dark button overrides */ + background-color: rgba(34, 34, 34, 0.5); + border: 1px solid rgba(255, 255, 255, 0.6); + color: rgba(255, 255, 255, 0.6); + height: 45px; + overflow: hidden; + padding: 0; + position: fixed; + right: 30px; + top: 30px; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + width: 45px; +} + +.wp-custom-header .wp-custom-header-video-button:hover, +.wp-custom-header .wp-custom-header-video-button:focus { /* Specificity prevents .color-dark button overrides */ + border-color: rgba(255, 255, 255, 0.8); + background-color: rgba(34, 34, 34, 0.8); + color: #fff; +} + +.admin-bar .wp-custom-header-video-button { + top: 62px; +} + +.has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-media img { + bottom: 0; + position: absolute; + top: auto; + -ms-transform: translateX(-50%) translateY(0); + -moz-transform: translateX(-50%) translateY(0); + -webkit-transform: translateX(-50%) translateY(0); + transform: translateX(-50%) translateY(0); +} + +/* For browsers that support 'object-fit' */ +@supports ( object-fit: cover ) { + .has-header-image .custom-header-media img, + .has-header-video .custom-header-media video, + .has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-media img { + height: 100%; + left: 0; + -o-object-fit: cover; + object-fit: cover; + top: 0; + -ms-transform: none; + -moz-transform: none; + -webkit-transform: none; + transform: none; + width: 100%; + } +} + +/* Hides div in Customizer preview when header images or videos change. */ + +body:not(.has-header-image):not(.has-header-video) .custom-header-media { + display: none; +} + +.has-header-image.twentyseventeen-front-page .site-branding, +.has-header-video.twentyseventeen-front-page .site-branding, +.has-header-image.home.blog .site-branding, +.has-header-video.home.blog .site-branding { + display: table-cell; + height: 100%; + vertical-align: bottom; +} + +/*-------------------------------------------------------------- +13.2 Front Page +--------------------------------------------------------------*/ + +.twentyseventeen-front-page .site-content { + padding: 0; +} + +.twentyseventeen-panel { + overflow: hidden; + position: relative; +} + +.panel-image { + background-position: center center; + background-repeat: no-repeat; + -webkit-background-size: cover; + background-size: cover; + position: relative; +} + +.panel-image:before { + /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#000000+0,000000+100&0+0,0.3+100 */ /* FF3.6-15 */ + background: -webkit-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%); /* Chrome10-25,Safari5.1-6 */ + background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.3))); + background: -webkit-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%); + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000", endColorstr="#4d000000", GradientType=0); /* IE6-9 */ + bottom: 0; + content: ""; + left: 0; + right: 0; + position: absolute; + top: 100px; +} + +.twentyseventeen-front-page article:not(.has-post-thumbnail):not(:first-child) { + border-top: 1px solid #ddd; +} + +.panel-content { + position: relative; +} + +.panel-content .wrap { + padding-bottom: 0.5em; + padding-top: 1.75em; +} + +/* Panel edit link */ + +.twentyseventeen-panel .edit-link { + display: block; + margin: 0.3em 0 0; +} + +.twentyseventeen-panel .entry-header .edit-link { + font-size: 14px; + font-size: 0.875rem; +} + +/* Front Page - Recent Posts */ + +.twentyseventeen-front-page .panel-content .recent-posts article { + border: 0; + color: #333; + margin-bottom: 3em; +} + +.recent-posts .entry-header { + margin-bottom: 1.2em; +} + +.page .panel-content .recent-posts .entry-title { + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; + letter-spacing: 0; + text-transform: none; +} + +.twentyseventeen-panel .recent-posts .entry-header .edit-link { + color: #222; + display: inline-block; + font-size: 11px; + font-size: 0.6875rem; + margin-left: 1em; +} + +/*-------------------------------------------------------------- +13.3 Regular Content +--------------------------------------------------------------*/ + +.site-content-contain { + background-color: #fff; + position: relative; +} + +.site-content { + padding: 2.5em 0 0; +} + +/*-------------------------------------------------------------- +13.4 Posts +--------------------------------------------------------------*/ + +/* Post Landing Page */ + +.sticky { + position: relative; +} + +.post:not(.sticky) .icon-thumb-tack { + display: none; +} + +.sticky .icon-thumb-tack { + display: block; + height: 18px; + left: -1.5em; + position: absolute; + top: 1.65em; + width: 20px; +} + +.page .panel-content .entry-title, +.page-title, +body.page:not(.twentyseventeen-front-page) .entry-title { + color: #222; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.entry-header .entry-title { + margin-bottom: 0.25em; +} + +.entry-title a { + color: #333; + text-decoration: none; + margin-left: -2px; +} + +.entry-title:not(:first-child) { + padding-top: 0; +} + +.entry-meta { + color: #767676; + font-size: 11px; + font-size: 0.6875rem; + font-weight: 800; + letter-spacing: 0.1818em; + padding-bottom: 0.25em; + text-transform: uppercase; +} + +.entry-meta a { + color: #767676; +} + +.byline, +.updated:not(.published) { + display: none; +} + +.single .byline, +.group-blog .byline { + display: inline; +} + +.pagination, +.comments-pagination { + border-top: 1px solid #eee; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + padding: 2em 0 3em; + text-align: center; +} + +.pagination .icon, +.comments-pagination .icon { + width: 0.666666666em; + height: 0.666666666em; +} + +.comments-pagination { + border: 0; +} + +.page-numbers { + display: none; + padding: 0.5em 0.75em; +} + +.page-numbers.current { + color: #767676; + display: inline-block; +} + +.page-numbers.current .screen-reader-text { + clip: auto; + height: auto; + overflow: auto; + position: relative !important; + width: auto; +} + +.prev.page-numbers, +.next.page-numbers { + background-color: #ddd; + -webkit-border-radius: 2px; + border-radius: 2px; + display: inline-block; + font-size: 24px; + font-size: 1.5rem; + line-height: 1; + padding: 0.25em 0.5em 0.4em; +} + +.prev.page-numbers, +.next.page-numbers { + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.prev.page-numbers:focus, +.prev.page-numbers:hover, +.next.page-numbers:focus, +.next.page-numbers:hover { + background-color: #767676; + color: #fff; +} + +.prev.page-numbers { + float: left; +} + +.next.page-numbers { + float: right; +} + +/* Aligned blockquotes */ + +.entry-content blockquote.alignleft, +.entry-content blockquote.alignright { + color: #666; + font-size: 13px; + font-size: 0.8125rem; + width: 48%; +} + +/* Blog landing, search, archives */ + +.blog .site-main > article, +.archive .site-main > article, +.search .site-main > article { + padding-bottom: 2em; +} + +body:not(.twentyseventeen-front-page) .entry-header { + padding: 1em 0; +} + +body:not(.twentyseventeen-front-page) .entry-header, +body:not(.twentyseventeen-front-page) .entry-content, +body:not(.twentyseventeen-front-page) #comments { + margin-left: auto; + margin-right: auto; +} + +body:not(.twentyseventeen-front-page) .entry-header { + padding-top: 0; +} + +.blog .entry-meta a.post-edit-link, +.archive .entry-meta a.post-edit-link, +.search .entry-meta a.post-edit-link { + color: #222; + display: inline-block; + margin-left: 1em; + white-space: nowrap; +} + +.search .page .entry-meta a.post-edit-link { + margin-left: 0; + white-space: nowrap; +} + +.taxonomy-description { + color: #666; + font-size: 13px; + font-size: 0.8125rem; +} + +/* More tag */ + +.entry-content .more-link:before { + content: ""; + display: block; + margin-top: 1.5em; +} + +/* Single Post */ + +.single-post:not(.has-sidebar) #primary, +.page.page-one-column:not(.twentyseventeen-front-page) #primary, +.archive.page-one-column:not(.has-sidebar) .page-header, +.archive.page-one-column:not(.has-sidebar) #primary { + margin-left: auto; + margin-right: auto; + max-width: 740px; +} + +.single-featured-image-header { + background-color: #fafafa; + border-bottom: 1px solid #eee; +} + +.single-featured-image-header img { + display: block; + margin: auto; +} + +.page-links { + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + padding: 2em 0 3em; +} + +.page-links .page-number { + color: #767676; + display: inline-block; + padding: 0.5em 1em; +} + +.page-links a { + display: inline-block; +} + +.page-links a .page-number { + color: #222; +} + +/* Entry footer */ + +.entry-footer { + border-bottom: 1px solid #eee; + border-top: 1px solid #eee; + margin-top: 2em; + padding: 2em 0; +} + +.entry-footer .cat-links, +.entry-footer .tags-links { + display: block; + font-size: 11px; + font-size: 0.6875rem; + font-weight: 800; + letter-spacing: 0.1818em; + padding-left: 2.5em; + position: relative; + text-transform: uppercase; +} + +.entry-footer .cat-links + .tags-links { + margin-top: 1em; +} + +.entry-footer .cat-links a, +.entry-footer .tags-links a { + color: #333; +} + +.entry-footer .cat-links .icon, +.entry-footer .tags-links .icon { + color: #767676; + left: 0; + margin-right: 0.5em; + position: absolute; + top: 2px; +} + +.entry-footer .edit-link { + display: inline-block; +} + +.entry-footer .edit-link a.post-edit-link { + background-color: #222; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + display: inline-block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 800; + margin-top: 2em; + padding: 0.7em 2em; + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + white-space: nowrap; +} + +.entry-footer .edit-link a.post-edit-link:hover, +.entry-footer .edit-link a.post-edit-link:focus { + background-color: #767676; +} + +/* Post Formats */ + +.blog .format-status .entry-title, +.archive .format-status .entry-title, +.blog .format-aside .entry-title, +.archive .format-aside .entry-title { + display: none; +} + +.format-quote blockquote { + color: #333; + font-size: 20px; + font-size: 1.25rem; + font-weight: 300; + overflow: visible; + position: relative; +} + +.format-quote blockquote .icon { + display: block; + height: 20px; + left: -1.25em; + position: absolute; + top: 0.4em; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); + width: 20px; +} + +/* Post Navigation */ + +.post-navigation { + font-weight: 800; + margin: 3em 0; +} + +.post-navigation .nav-links { + padding: 1em 0; +} + +.nav-subtitle { + background: transparent; + color: #767676; + display: block; + font-size: 11px; + font-size: 0.6875rem; + letter-spacing: 0.1818em; + margin-bottom: 1em; + text-transform: uppercase; +} + +.nav-title { + color: #333; + font-size: 15px; + font-size: 0.9375rem; +} + +.post-navigation .nav-next { + margin-top: 1.5em; +} + +.nav-links .nav-previous .nav-title .nav-title-icon-wrapper { + margin-right: 0.5em; +} + +.nav-links .nav-next .nav-title .nav-title-icon-wrapper { + margin-left: 0.5em; +} + +/*-------------------------------------------------------------- +13.5 Pages +--------------------------------------------------------------*/ + +.page-header { + padding-bottom: 2em; +} + +.page .entry-header .edit-link { + font-size: 14px; + font-size: 0.875rem; +} + +.search .page .entry-header .edit-link { + font-size: 11px; + font-size: 0.6875rem; +} + +.page-links { + clear: both; + margin: 0 0 1.5em; +} + +.page:not(.home) #content { + padding-bottom: 1.5em; +} + +/* 404 page */ + +.error404 .page-content { + padding-bottom: 4em; +} + +.error404 .page-content .search-form, +.search .page-content .search-form { + margin-bottom: 3em; +} + +/*-------------------------------------------------------------- +13.6 Footer +--------------------------------------------------------------*/ + +.site-footer { + border-top: 1px solid #eee; +} + +.site-footer .wrap { + padding-bottom: 1.5em; + padding-top: 2em; +} + +/* Footer widgets */ + +.site-footer .widget-area { + padding-bottom: 2em; + padding-top: 2em; +} + +/* Social nav */ + +.social-navigation { + font-size: 16px; + font-size: 1rem; + margin-bottom: 1em; +} + +.social-navigation ul { + list-style: none; + margin-bottom: 0; + margin-left: 0; +} + +.social-navigation li { + display: inline; +} + +.social-navigation a { + background-color: #767676; + -webkit-border-radius: 40px; + border-radius: 40px; + color: #fff; + display: inline-block; + height: 40px; + margin: 0 1em 0.5em 0; + text-align: center; + width: 40px; +} + +.social-navigation a:hover, +.social-navigation a:focus { + background-color: #333; +} + +.social-navigation .icon { + height: 16px; + top: 12px; + width: 16px; + vertical-align: top; +} + +/* Site info */ + +.site-info { + font-size: 14px; + font-size: 0.875rem; + margin-bottom: 1em; +} + +.site-info a { + color: #666; +} + +.site-info .sep { + margin: 0; + display: block; + visibility: hidden; + height: 0; + width: 100%; +} + +.site-info span[role=separator] { + padding: 0 0.2em 0 0.4em; +} + +.site-info span[role=separator]::before { + content: '\002f'; +} + +/*-------------------------------------------------------------- +14.0 Comments +--------------------------------------------------------------*/ + +#comments { + clear: both; + padding: 2em 0 0.5em; +} + +.comments-title { + font-size: 20px; + font-size: 1.25rem; + margin-bottom: 1.5em; +} + +.comment-list, +.comment-list .children { + list-style: none; + margin: 0; + padding: 0; +} + +.comment-list li:before { + display: none; +} + +.comment-body { + margin-left: 65px; +} + +.comment-author { + font-size: 16px; + font-size: 1rem; + margin-bottom: 0.4em; + position: relative; + z-index: 2; +} + +.comment-author .avatar { + height: 50px; + left: -65px; + position: absolute; + width: 50px; +} + +.comment-author .says { + display: none; +} + +.comment-meta { + margin-bottom: 1.5em; +} + +.comment-metadata { + color: #767676; + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + text-transform: uppercase; +} + +.comment-metadata a { + color: #767676; +} + +.comment-metadata a.comment-edit-link { + color: #222; + margin-left: 1em; +} + +.comment-body { + color: #333; + font-size: 14px; + font-size: 0.875rem; + margin-bottom: 4em; +} + +.comment-reply-link { + font-weight: 800; + position: relative; +} + +.comment-reply-link .icon { + color: #222; + left: -2em; + height: 1em; + position: absolute; + top: 0; + width: 1em; +} + +.children .comment-author .avatar { + height: 30px; + left: -45px; + width: 30px; +} + +.bypostauthor > .comment-body > .comment-meta > .comment-author .avatar { + border: 1px solid #333; + padding: 2px; +} + +.no-comments, +.comment-awaiting-moderation { + color: #767676; + font-size: 14px; + font-size: 0.875rem; + font-style: italic; +} + +.comments-pagination { + margin: 2em 0 3em; +} + +.form-submit { + text-align: right; +} + +.comment-form #wp-comment-cookies-consent { + margin: 0 10px 0 0; +} + +.comment-form .comment-form-cookies-consent label { + display: inline; +} + +/*-------------------------------------------------------------- +15.0 Widgets +--------------------------------------------------------------*/ + +#secondary { + padding: 1em 0 2em; +} + +.widget { + padding-bottom: 3em; +} + +h2.widget-title { + color: #222; + font-size: 13px; + font-size: 0.8125rem; + font-weight: 800; + letter-spacing: 0.1818em; + margin-bottom: 1.5em; + text-transform: uppercase; +} + +.widget-title a { + color: inherit; +} + +/* widget forms */ + +.widget select { + width: 100%; +} + + +/* widget lists */ + +.widget ul { + list-style: none; + margin: 0; +} + +.widget ul li, +.widget ol li { + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + padding: 0.5em 0; +} + +.widget:not(.widget_tag_cloud) ul li + li { + margin-top: -1px; +} + +.widget ul li ul { + margin: 0 0 -1px; + padding: 0; + position: relative; +} + +.widget ul li li { + border: 0; + padding-left: 24px; + padding-left: 1.5rem; +} + +/* Widget lists of links */ + +.widget_top-posts ul li ul, +.widget_rss_links ul li ul, +.widget-grofile ul.grofile-links li ul, +.widget_pages ul li ul, +.widget_meta ul li ul { + bottom: 0; +} + +.widget_nav_menu ul li li, +.widget_top-posts ul li, +.widget_top-posts ul li li, +.widget_rss_links ul li, +.widget_rss_links ul li li, +.widget-grofile ul.grofile-links li, +.widget-grofile ul.grofile-links li li { + padding-bottom: 0.25em; + padding-top: 0.25em; +} + +.widget_rss ul li { + padding-bottom: 1em; + padding-top: 1em; +} + +/* Widget markup */ + +.widget .post-date, +.widget .rss-date { + font-size: 0.81em; +} + +/* Text widget */ + +.widget_text { + word-wrap: break-word; +} + +.widget_text ul { + list-style: disc; + margin: 0 0 1.5em 1.5em; +} + +.widget_text ol { + list-style: decimal; +} + +.widget_text ul li, +.widget_text ol li { + border: none; +} + +.widget_text ul li:last-child, +.widget_text ol li:last-child { + padding-bottom: 0; +} + +.widget_text ul li ul { + margin: 0 0 0 1.5em; +} + +.widget_text ul li li { + padding-left: 0; + padding-right: 0; +} + +.widget_text ol li { + list-style-position: inside; +} + +.widget_text ol li + li { + margin-top: -1px; +} + +/* RSS Widget */ + +.widget_rss .widget-title .rsswidget:first-child { + float: right; +} + +.widget_rss .widget-title .rsswidget:first-child:hover { + background-color: transparent; +} + +.widget_rss .widget-title .rsswidget:first-child img { + display: block; +} + +.widget_rss ul li { + padding: 2.125em 0; +} + +.widget_rss ul li:first-child { + border-top: none; + padding-top: 0; +} + +.widget_rss li .rsswidget { + font-size: 22px; + font-size: 1.375rem; + font-weight: 300; + line-height: 1.4; +} + +.widget_rss .rss-date, +.widget_rss li cite { + color: #767676; + display: block; + font-size: 10px; + font-size: 0.625rem; + font-style: normal; + font-weight: 800; + letter-spacing: 0.18em; + line-height: 1.5; + text-transform: uppercase; +} + +.widget_rss .rss-date { + margin: 0.5em 0 1.5em; + padding: 0; +} + +.widget_rss .rssSummary { + margin-bottom: 0.5em; +} + +/* Contact Info Widget */ + +.widget_contact_info .contact-map { + margin-bottom: 0.5em; +} + +/* Gravatar */ + +.widget-grofile h4 { + font-size: 16px; + font-size: 1rem; + margin-bottom: 0; +} + +/* Recent Comments */ + +.widget_recent_comments table, +.widget_recent_comments th, +.widget_recent_comments td { + border: 0; +} + +/* Recent Posts widget */ + +.widget_recent_entries .post-date { + display: block; +} + +/* Search */ + +.search-form { + position: relative; +} + +.search-form .search-submit { + bottom: 3px; + padding: 0.5em 1em; + position: absolute; + right: 3px; + top: 3px; +} + +.search-form .search-submit .icon { + height: 24px; + top: -2px; + width: 24px; +} + +/* Tag cloud widget */ + +.tagcloud ul li { + float: left; + border-top: 0; + border-bottom: 0; + padding: 0; + margin: 4px 4px 0 0; +} + +.tagcloud, +.widget_tag_cloud, +.wp_widget_tag_cloud { + line-height: 1.5; +} + +.widget .tagcloud a, +.widget.widget_tag_cloud a, +.wp_widget_tag_cloud a { + border: 1px solid #ddd; + -webkit-box-shadow: none; + box-shadow: none; + display: block; + padding: 4px 10px 5px; + position: relative; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + width: auto; + word-wrap: break-word; + z-index: 0; +} + +.widget .tagcloud a:hover, +.widget .tagcloud a:focus, +.widget.widget_tag_cloud a:hover, +.widget.widget_tag_cloud a:focus, +.wp_widget_tag_cloud a:hover, +.wp_widget_tag_cloud a:focus { + border-color: #bbb; + -webkit-box-shadow: none; + box-shadow: none; + text-decoration: none; +} + +/* Calendar widget */ + +.widget_calendar .wp-calendar-table { + margin-bottom: 0; +} + +.widget_calendar .wp-calendar-nav { + display: table; + width: 100%; + margin: 0 0 1.5em; + padding: 0.4em 0; +} + +.widget_calendar .wp-calendar-nav span { + display: table-cell; +} + +.widget_calendar .wp-calendar-nav-prev, +.widget_calendar .wp-calendar-nav-next { + width: 40%; +} + +.widget_calendar th, +.widget_calendar td, +.widget_calendar .wp-calendar-nav span { + text-align: center; +} + +.widget_calendar tfoot td { + border: 0; +} + +/* Gallery widget */ + +.gallery-columns-5 .gallery-caption, +.gallery-columns-6 .gallery-caption, +.gallery-columns-7 .gallery-caption, +.gallery-columns-8 .gallery-caption, +.gallery-columns-9 .gallery-caption { + display: none; +} + +/*-------------------------------------------------------------- +16.0 Media +--------------------------------------------------------------*/ + +img, +video { + height: auto; /* Make sure images are scaled correctly. */ + max-width: 100%; /* Adhere to container width. */ +} + +img.alignleft, +img.alignright { + float: none; + margin: 0; +} + +.page-content .wp-smiley, +.entry-content .wp-smiley, +.comment-content .wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} + +audio:focus, +video:focus { + outline: thin dotted; +} + +/* Make sure embeds and iframes fit their containers. */ + +embed, +iframe, +object { + margin-bottom: 1.5em; + max-width: 100%; +} + +/* Remove bottom on embeds that wrapped in paragraphs via wpautop. */ + +p > embed:only-child, +p > iframe:only-child, +p > object:only-child { + margin-bottom: 0; +} + +.wp-caption, +.gallery-caption { + color: #666; + font-size: 13px; + font-size: 0.8125rem; + font-style: italic; + 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: 0.8075em 0; +} + +/* Media Elements */ + +.mejs-container { + margin-bottom: 1.5em; +} + +/* Audio Player */ + +.mejs-controls a.mejs-horizontal-volume-slider, +.mejs-controls a.mejs-horizontal-volume-slider:focus, +.mejs-controls a.mejs-horizontal-volume-slider:hover { + background: transparent; + border: 0; +} + +/* Playlist Color Overrides: Light */ + +.site-content .wp-playlist-light { + border-color: #eee; + color: #222; +} + +.site-content .wp-playlist-light .wp-playlist-current-item .wp-playlist-item-album { + color: #333; +} + +.site-content .wp-playlist-light .wp-playlist-current-item .wp-playlist-item-artist { + color: #767676; +} + +.site-content .wp-playlist-light .wp-playlist-item { + border-bottom: 1px dotted #eee; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.site-content .wp-playlist-light .wp-playlist-item:hover, +.site-content .wp-playlist-light .wp-playlist-item:focus { + border-bottom-color: rgba(0, 0, 0, 0); + background-color: #767676; + color: #fff; +} + +.site-content .wp-playlist-light a.wp-playlist-caption:hover, +.site-content .wp-playlist-light .wp-playlist-item:hover a, +.site-content .wp-playlist-light .wp-playlist-item:focus a { + color: #fff; +} + +/* Playlist Color Overrides: Dark */ + +.site-content .wp-playlist-dark { + background: #222; + border-color: #333; +} + +.site-content .wp-playlist-dark .mejs-container .mejs-controls { + background-color: #333; +} + +.site-content .wp-playlist-dark .wp-playlist-caption { + color: #fff; +} + +.site-content .wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-album { + color: #eee; +} + +.site-content .wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-artist { + color: #aaa; +} + +.site-content .wp-playlist-dark .wp-playlist-playing { + background-color: #333; +} + +.site-content .wp-playlist-dark .wp-playlist-item { + border-bottom: 1px dotted #555; + -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out; +} + +.site-content .wp-playlist-dark .wp-playlist-item:hover, +.site-content .wp-playlist-dark .wp-playlist-item:focus { + border-bottom-color: rgba(0, 0, 0, 0); + background-color: #aaa; + color: #222; +} + +.site-content .wp-playlist-dark a.wp-playlist-caption:hover, +.site-content .wp-playlist-dark .wp-playlist-item:hover a, +.site-content .wp-playlist-dark .wp-playlist-item:focus a { + color: #222; +} + +/* Playlist Style Overrides */ + +.site-content .wp-playlist { + padding: 0.625em 0.625em 0.3125em; +} + +.site-content .wp-playlist-current-item .wp-playlist-item-title { + font-weight: 700; +} + +.site-content .wp-playlist-current-item .wp-playlist-item-album { + font-style: normal; +} + +.site-content .wp-playlist-current-item .wp-playlist-item-artist { + font-size: 10px; + font-size: 0.625rem; + font-weight: 800; + letter-spacing: 0.1818em; + text-transform: uppercase; +} + +.site-content .wp-playlist-item { + padding: 0 0.3125em; + cursor: pointer; +} + +.site-content .wp-playlist-item:last-of-type { + border-bottom: none; +} + +.site-content .wp-playlist-item a { + padding: 0.3125em 0; + border-bottom: none; +} + +.site-content .wp-playlist-item a, +.site-content .wp-playlist-item a:focus, +.site-content .wp-playlist-item a:hover { + -webkit-box-shadow: none; + box-shadow: none; + background: transparent; +} + +.site-content .wp-playlist-item-length { + top: 5px; +} + +/* SVG Icons base styles */ + +.icon { + display: inline-block; + fill: currentColor; + height: 1em; + position: relative; /* Align more nicely with capital letters */ + top: -0.0625em; + vertical-align: middle; + width: 1em; +} + +/*-------------------------------------------------------------- +16.1 Galleries +--------------------------------------------------------------*/ + +.gallery-item { + display: inline-block; + text-align: left; + vertical-align: top; + margin: 0 0 1.5em; + padding: 0 1em 0 0; + width: 50%; +} + +.gallery-columns-1 .gallery-item { + width: 100%; +} + +.gallery-columns-2 .gallery-item { + max-width: 50%; +} + +.gallery-item a, +.gallery-item a:hover, +.gallery-item a:focus, +.widget-area .gallery-item a, +.widget-area .gallery-item a:hover, +.widget-area .gallery-item a:focus { + -webkit-box-shadow: none; + box-shadow: none; + background: none; + display: inline-block; + max-width: 100%; +} + +.gallery-item a img { + display: block; + -webkit-transition: -webkit-filter 0.2s ease-in; + transition: -webkit-filter 0.2s ease-in; + transition: filter 0.2s ease-in; + transition: filter 0.2s ease-in, -webkit-filter 0.2s ease-in; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} + +.gallery-item a:hover img, +.gallery-item a:focus img { + -webkit-filter: opacity(60%); + filter: opacity(60%); +} + +.gallery-caption { + display: block; + text-align: left; + padding: 0 10px 0 0; + margin-bottom: 0; +} + +/*-------------------------------------------------------------- +17.0 Customizer +--------------------------------------------------------------*/ + +.highlight-front-sections.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel:after { + border: 2px dashed #0085ba; /* Matches visible edit shortcuts. */ + bottom: 1em; + content: ""; + display: block; + left: 1em; + position: absolute; + right: 1em; + top: 1em; + z-index: 1; +} + +.highlight-front-sections.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel .panel-content { + z-index: 2; /* Prevent :after from preventing interactions within the section */ +} + +/* Used for placeholder text */ +.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel .twentyseventeen-panel-title { + display: block; + font-size: 14px; + font-size: 0.875rem; + font-weight: 700; + letter-spacing: 1px; + padding: 3em; + text-transform: uppercase; + text-align: center; +} + +/* Show borders on the custom page panels only when the front page sections are being edited */ +.highlight-front-sections.twentyseventeen-customizer.twentyseventeen-front-page .twentyseventeen-panel:nth-of-type(1):after { + border: none; +} + +.twentyseventeen-front-page.twentyseventeen-customizer #primary article.panel-placeholder { + border: 0; +} + +/* Add some space around the visual edit shortcut buttons. */ +.twentyseventeen-panel > .customize-partial-edit-shortcut > button { + top: 30px; + left: 30px; +} + +/* Ensure that placeholder icons are visible. */ +.twentyseventeen-panel .customize-partial-edit-shortcut-hidden:before { + visibility: visible; +} + +/*-------------------------------------------------------------- +18.0 SVGs Fallbacks +--------------------------------------------------------------*/ + +.svg-fallback { + display: none; +} + +.no-svg .svg-fallback { + display: inline-block; +} + +.no-svg .dropdown-toggle { + padding: 0.5em 0 0; + right: 0; + text-align: center; + width: 2em; +} + +.no-svg .dropdown-toggle .svg-fallback.icon-angle-down { + font-size: 20px; + font-size: 1.25rem; + font-weight: 400; + line-height: 1; + -webkit-transform: rotate(180deg); /* Chrome, Safari, Opera */ + -ms-transform: rotate(180deg); /* IE 9 */ + transform: rotate(180deg); +} + +.no-svg .dropdown-toggle.toggled-on .svg-fallback.icon-angle-down { + -webkit-transform: rotate(0); /* Chrome, Safari, Opera */ + -ms-transform: rotate(0); /* IE 9 */ + transform: rotate(0); +} + +.no-svg .dropdown-toggle .svg-fallback.icon-angle-down:before { + content: "\005E"; +} + +/* Social Menu fallbacks */ + +.no-svg .social-navigation a { + background: transparent; + color: #222; + height: auto; + width: auto; +} + +/* Show screen reader text in some cases */ + +.no-svg .next.page-numbers .screen-reader-text, +.no-svg .prev.page-numbers .screen-reader-text, +.no-svg .social-navigation li a .screen-reader-text, +.no-svg .search-submit .screen-reader-text { + clip: auto; + font-size: 16px; + font-size: 1rem; + font-weight: 400; + height: auto; + position: relative !important; /* overrides previous !important styles */ + width: auto; +} + +/*-------------------------------------------------------------- +19.0 Media Queries +--------------------------------------------------------------*/ + +/* Adjust positioning of edit shortcuts, override style in customize-preview.css */ +@media screen and (min-width: 20em) { + + body.customize-partial-edit-shortcuts-shown .site-header .site-title { + padding-left: 0; + } +} + +@media screen and (min-width: 30em) { + + /* Typography */ + + body, + button, + input, + select, + textarea { + font-size: 18px; + font-size: 1.125rem; + } + + h1 { + font-size: 30px; + font-size: 1.875rem; + } + + h2, + .home.blog .entry-title, + .page .panel-content .recent-posts .entry-title { + font-size: 26px; + font-size: 1.625rem; + } + + h3 { + font-size: 22px; + font-size: 1.375rem; + } + + h4 { + font-size: 18px; + font-size: 1.125rem; + } + + h5 { + font-size: 13px; + font-size: 0.8125rem; + } + + h6 { + font-size: 16px; + font-size: 1rem; + } + + .entry-content blockquote.alignleft, + .entry-content blockquote.alignright { + font-size: 14px; + font-size: 0.875rem; + } + + /* Fix image alignment */ + img.alignleft { + float: left; + margin-right: 1.5em; + } + + img.alignright { + float: right; + margin-left: 1.5em; + } + + /* Site Branding */ + + .site-branding { + padding: 3em 0; + } + + /* Front Page */ + + .panel-content .wrap { + padding-bottom: 2em; + padding-top: 3.5em; + } + + .page-one-column .panel-content .wrap { + max-width: 740px; + } + + .panel-content .entry-header { + margin-bottom: 4.5em; + } + + .panel-content .recent-posts .entry-header { + margin-bottom: 0; + } + + /* Blog Index, Archive, Search */ + + .taxonomy-description { + font-size: 14px; + font-size: 0.875rem; + } + + .page-numbers.current { + font-size: 16px; + font-size: 1rem; + } + + /* Site Footer */ + + .site-footer { + font-size: 16px; + font-size: 1rem; + } + + /* Gallery Columns */ + + .gallery-item { + max-width: 25%; + } + + .gallery-columns-1 .gallery-item { + max-width: 100%; + } + + .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%; + } +} + +@media screen and (min-width: 48em) { + + /* Typography */ + + body, + button, + input, + select, + textarea { + font-size: 16px; + font-size: 1rem; + line-height: 1.5; + } + + .entry-content blockquote.alignleft, + .entry-content blockquote.alignright { + font-size: 13px; + font-size: 0.8125rem; + } + + /* Layout */ + + .wrap { + max-width: 1000px; + padding-left: 3em; + padding-right: 3em; + } + + .has-sidebar:not(.error404) #primary { + float: left; + width: 58%; + } + + .has-sidebar #secondary { + float: right; + padding-top: 0; + width: 36%; + } + + .error404 #primary { + float: none; + } + + /* Site Branding */ + + .site-branding { + margin-bottom: 0; + } + + .has-header-image.twentyseventeen-front-page .site-branding, + .has-header-video.twentyseventeen-front-page .site-branding, + .has-header-image.home.blog .site-branding, + .has-header-video.home.blog .site-branding { + bottom: 0; + display: block; + left: 0; + height: auto; + padding-top: 0; + position: absolute; + width: 100%; + } + + .has-header-image.twentyseventeen-front-page .custom-header, + .has-header-video.twentyseventeen-front-page .custom-header, + .has-header-image.home.blog .custom-header, + .has-header-video.home.blog .custom-header { + display: block; + height: auto; + } + + .custom-header-media { + height: 165px; + position: relative; + } + + .twentyseventeen-front-page.has-header-image .custom-header-media, + .twentyseventeen-front-page.has-header-video .custom-header-media, + .home.blog.has-header-image .custom-header-media, + .home.blog.has-header-video .custom-header-media { + height: 0; + position: relative; + } + + .has-header-image:not(.twentyseventeen-front-page):not(.home) .custom-header-media, + .has-header-video:not(.twentyseventeen-front-page):not(.home) .custom-header-media { + bottom: 0; + height: auto; + left: 0; + position: absolute; + right: 0; + top: 0; + } + + .custom-logo-link { + padding-right: 2em; + } + + .custom-logo-link img, + body.home.title-tagline-hidden.has-header-image .custom-logo-link img, + body.home.title-tagline-hidden.has-header-video .custom-logo-link img { + max-width: 350px; + } + + .title-tagline-hidden.home.has-header-image .custom-logo-link img, + .title-tagline-hidden.home.has-header-video .custom-logo-link img { + max-height: 200px; + } + + .site-title { + font-size: 36px; + font-size: 2.25rem; + } + + .site-description { + font-size: 16px; + font-size: 1rem; + } + + /* Navigation */ + + .navigation-top { + bottom: 0; + font-size: 14px; + font-size: 0.875rem; + left: 0; + position: absolute; + right: 0; + width: 100%; + z-index: 3; + } + + .navigation-top .wrap { + max-width: 1000px; + /* The font size is 14px here and we need 50px padding in ems */ + padding: 0.75em 3.4166666666667em; + } + + .navigation-top nav { + margin-left: -1.25em; + } + + .site-navigation-fixed.navigation-top { + bottom: auto; + position: fixed; + left: 0; + right: 0; + top: 0; + width: 100%; + z-index: 7; + } + + .admin-bar .site-navigation-fixed.navigation-top { + top: 32px; + } + + /* Main Navigation */ + + .js .menu-toggle, + .js .dropdown-toggle { + display: none; + } + + .main-navigation { + width: auto; + } + + .js .main-navigation ul, + .js .main-navigation ul ul, + .js .main-navigation > div > ul { + display: block; + } + + .main-navigation ul { + background: transparent; + padding: 0; + } + + .main-navigation > div > ul { + border: 0; + margin-bottom: 0; + padding: 0; + } + + .main-navigation li { + border: 0; + display: inline-block; + } + + .main-navigation li li { + display: block; + } + + .main-navigation a { + padding: 1em 1.25em; + } + + .main-navigation ul ul { + background: #fff; + border: 1px solid #bbb; + left: -999em; + padding: 0; + position: absolute; + top: 100%; + z-index: 99999; + } + + .main-navigation ul li.menu-item-has-children:before, + .main-navigation ul li.menu-item-has-children:after, + .main-navigation ul li.page_item_has_children:before, + .main-navigation ul li.page_item_has_children:after { + border-style: solid; + border-width: 0 6px 6px; + content: ""; + display: none; + height: 0; + position: absolute; + right: 1em; + bottom: -1px; + width: 0; + z-index: 100000; + } + + .main-navigation ul li.menu-item-has-children.focus:before, + .main-navigation ul li.menu-item-has-children:hover:before, + .main-navigation ul li.menu-item-has-children.focus:after, + .main-navigation ul li.menu-item-has-children:hover:after, + .main-navigation ul li.page_item_has_children.focus:before, + .main-navigation ul li.page_item_has_children:hover:before, + .main-navigation ul li.page_item_has_children.focus:after, + .main-navigation ul li.page_item_has_children:hover:after { + display: block; + } + + .main-navigation ul li.menu-item-has-children:before, + .main-navigation ul li.page_item_has_children:before { + border-color: transparent transparent #bbb; + bottom: 0; + } + + .main-navigation ul li.menu-item-has-children:after, + .main-navigation ul li.page_item_has_children:after { + border-color: transparent transparent #fff; + } + + .main-navigation ul ul li:hover > ul, + .main-navigation ul ul li.focus > ul { + left: 100%; + right: auto; + } + + .main-navigation ul ul a { + padding: 0.75em 1.25em; + width: 16em; + } + + .main-navigation li li { + -webkit-transition: background-color 0.2s ease-in-out; + transition: background-color 0.2s ease-in-out; + } + + .main-navigation li li:hover, + .main-navigation li li.focus { + background: #767676; + } + + .main-navigation li li a { + -webkit-transition: color 0.3s ease-in-out; + transition: color 0.3s ease-in-out; + } + + .main-navigation li li.focus > a, + .main-navigation li li:focus > a, + .main-navigation li li:hover > a, + .main-navigation li li a:hover, + .main-navigation li li a:focus, + .main-navigation li li.current_page_item a:hover, + .main-navigation li li.current-menu-item a:hover, + .main-navigation li li.current_page_item a:focus, + .main-navigation li li.current-menu-item a:focus { + color: #fff; + } + + .main-navigation ul li:hover > ul, + .main-navigation ul li.focus > ul { + left: 0.5em; + right: auto; + } + + .main-navigation .menu-item-has-children > a > .icon, + .main-navigation .page_item_has_children > a > .icon { + display: inline; + left: 5px; + position: relative; + top: -1px; + } + + .main-navigation ul ul .menu-item-has-children > a > .icon, + .main-navigation ul ul .page_item_has_children > a > .icon { + margin-top: -9px; + left: auto; + position: absolute; + right: 1em; + top: 50%; + -webkit-transform: rotate(-90deg); /* Chrome, Safari, Opera */ + -ms-transform: rotate(-90deg); /* IE 9 */ + transform: rotate(-90deg); + } + + .main-navigation ul ul ul { + left: -999em; + margin-top: -1px; + top: 0; + } + + .main-navigation ul ul li.menu-item-has-children.focus:before, + .main-navigation ul ul li.menu-item-has-children:hover:before, + .main-navigation ul ul li.menu-item-has-children.focus:after, + .main-navigation ul ul li.menu-item-has-children:hover:after, + .main-navigation ul ul li.page_item_has_children.focus:before, + .main-navigation ul ul li.page_item_has_children:hover:before, + .main-navigation ul ul li.page_item_has_children.focus:after, + .main-navigation ul ul li.page_item_has_children:hover:after { + display: none; + } + + .site-header .site-navigation-fixed .menu-scroll-down { + display: none; + } + + /* Scroll down arrow */ + + .site-header .menu-scroll-down { + display: block; + padding: 1em; + position: absolute; + right: 0; + } + + .site-header .menu-scroll-down .icon { + -webkit-transform: rotate(90deg); /* Chrome, Safari, Opera */ + -ms-transform: rotate(90deg); /* IE 9 */ + transform: rotate(90deg); + } + + .site-header .menu-scroll-down { + color: #fff; + top: 2em; + } + + .site-header .navigation-top .menu-scroll-down { + color: #767676; + top: 0.7em; + } + + .menu-scroll-down:focus { + outline: thin dotted; + } + + .menu-scroll-down .icon { + height: 18px; + width: 18px; + } + + /* Front Page */ + + .twentyseventeen-front-page.has-header-image .site-branding, + .twentyseventeen-front-page.has-header-video .site-branding, + .home.blog.has-header-image .site-branding, + .home.blog.has-header-video .site-branding { + margin-bottom: 70px; + } + + .twentyseventeen-front-page.has-header-image .custom-header-media, + .twentyseventeen-front-page.has-header-video .custom-header-media, + .home.blog.has-header-image .custom-header-media, + .home.blog.has-header-video .custom-header-media { + height: 1200px; + height: 100vh; + max-height: 100%; + overflow: hidden; + } + + .twentyseventeen-front-page.has-header-image .custom-header-media:before, + .twentyseventeen-front-page.has-header-video .custom-header-media:before, + .home.blog.has-header-image .custom-header-media:before, + .home.blog.has-header-video .custom-header-media:before { + height: 33%; + } + + .admin-bar.twentyseventeen-front-page.has-header-image .custom-header-media, + .admin-bar.twentyseventeen-front-page.has-header-video .custom-header-media, + .admin-bar.home.blog.has-header-image .custom-header-media, + .admin-bar.home.blog.has-header-video .custom-header-media { + height: calc(100vh - 32px); + } + + .panel-content .wrap { + padding-bottom: 4.5em; + padding-top: 6em; + } + + .panel-image { + height: 100vh; + max-height: 1200px; + } + + /* With panel images 100% of the screen height, we're going to fix the background image where supported to create a parallax-like effect. */ + .background-fixed .panel-image { + background-attachment: fixed; + } + + .page-two-column .panel-content .entry-header { + float: left; + width: 36%; + } + + .page-two-column .panel-content .entry-content { + float: right; + width: 58%; + } + + /* Front Page - Recent Posts */ + + .page-two-column .panel-content .recent-posts { + clear: right; + float: right; + width: 58%; + } + + .panel-content .recent-posts article { + margin-bottom: 4em; + } + + .panel-content .recent-posts .entry-header, + .page-two-column #primary .panel-content .recent-posts .entry-header, + .panel-content .recent-posts .entry-content, + .page-two-column #primary .panel-content .recent-posts .entry-content { + float: none; + width: 100%; + } + + .panel-content .recent-posts .entry-header { + margin-bottom: 1.5em; + } + + .page .panel-content .recent-posts .entry-title { + font-size: 26px; + font-size: 1.625rem; + } + + /* Posts */ + + .site-content { + padding: 5.5em 0 0; + } + + .single-post .entry-title, + .page .entry-title { + font-size: 26px; + font-size: 1.625rem; + } + + .comments-pagination, + .post-navigation { + clear: both; + } + + .post-navigation .nav-previous { + float: left; + width: 50%; + } + + .post-navigation .nav-next { + float: right; + text-align: right; + width: 50%; + } + + .nav-next, + .post-navigation .nav-next { + margin-top: 0; + } + + /* Blog, archive, search */ + + .sticky .icon-thumb-tack { + height: 23px; + left: -2.5em; + top: 1.5em; + width: 32px; + } + + body:not(.has-sidebar):not(.page-one-column) .page-header, + body.has-sidebar.error404 #primary .page-header, + body.page-two-column:not(.archive) #primary .entry-header, + body.page-two-column.archive:not(.has-sidebar) #primary .page-header { + float: left; + width: 36%; + } + + .blog:not(.has-sidebar) #primary article, + .archive:not(.page-one-column):not(.has-sidebar) #primary article, + .search:not(.has-sidebar) #primary article, + .error404:not(.has-sidebar) #primary .page-content, + .error404.has-sidebar #primary .page-content, + body.page-two-column:not(.archive) #primary .entry-content, + body.page-two-column #comments { + float: right; + width: 58%; + } + + .blog .site-main > article, + .archive .site-main > article, + .search .site-main > article { + padding-bottom: 4em; + } + + .navigation.pagination { + clear: both; + float: right; + width: 58%; + } + + .has-sidebar .navigation.pagination, + .archive.page-one-column:not(.has-sidebar) .navigation.pagination { + float: none; + width: 100%; + } + + .entry-footer { + display: table; + width: 100%; + } + + .entry-footer .cat-tags-links { + display: table-cell; + vertical-align: middle; + width: 100%; + } + + .entry-footer .edit-link { + display: table-cell; + text-align: right; + vertical-align: middle; + } + + .entry-footer .edit-link a.post-edit-link { + margin-top: 0; + margin-left: 1em; + } + + /* Entry content */ + + /* without sidebar */ + + :not(.has-sidebar) .entry-content blockquote.alignleft { + margin-left: -17.5%; + width: 48%; + } + + :not(.has-sidebar) .entry-content blockquote.alignright { + margin-right: -17.5%; + width: 48%; + } + + /* with sidebar */ + + .has-sidebar .entry-content blockquote.alignleft { + margin-left: 0; + width: 34%; + } + + .has-sidebar .entry-content blockquote.alignright { + margin-right: 0; + width: 34%; + } + + .has-sidebar #primary .entry-content blockquote.alignright.below-entry-meta { + margin-right: -72.5%; + width: 62%; + } + + /* blog and archive */ + + .blog:not(.has-sidebar) .entry-content blockquote.alignleft, + .twentyseventeen-front-page.page-two-column .entry-content blockquote.alignleft, + .archive:not(.has-sidebar) .entry-content blockquote.alignleft, + .page-two-column .entry-content blockquote.alignleft { + margin-left: -72.5%; + width: 62%; + } + + .blog:not(.has-sidebar) .entry-content blockquote.alignright, + .twentyseventeen-front-page.page-two-column .entry-content blockquote.alignright, + .archive:not(.has-sidebar) .entry-content blockquote.alignright, + .page-two-column .entry-content blockquote.alignright { + margin-right: 0; + width: 36%; + } + + /* Post formats */ + + .format-quote blockquote .icon { + left: -1.5em; + } + + /* Pages */ + + .page.page-one-column .entry-header, + .twentyseventeen-front-page.page-one-column .entry-header, + .archive.page-one-column:not(.has-sidebar) .page-header { + margin-bottom: 4em; + } + + .page:not(.home) #content { + padding-bottom: 3.25em; + } + + /* 404 page */ + + .error404 .page-content { + padding-bottom: 9em; + } + + /* Comments */ + + #comments { + padding-top: 5em; + } + + .comments-title { + margin-bottom: 2.5em; + } + + ol.children .children { + padding-left: 2em; + } + + /* Posts pagination */ + + .nav-links .nav-title { + position: relative; + } + + .nav-title-icon-wrapper { + position: absolute; + text-align: center; + width: 2em; + } + + .nav-links .nav-previous .nav-title .nav-title-icon-wrapper { + left: -2em; + } + + .nav-links .nav-next .nav-title .nav-title-icon-wrapper { + right: -2em; + } + + /* Secondary */ + + #secondary { + font-size: 14px; + font-size: 0.875rem; + line-height: 1.6; + } + + /* Widgets */ + + h2.widget-title { + font-size: 11px; + font-size: 0.6875rem; + margin-bottom: 2em; + } + + /* Footer */ + + .site-footer { + font-size: 14px; + font-size: 0.875rem; + line-height: 1.6; + margin-top: 3em; + } + + .site-footer .widget-column.footer-widget-1 { + float: left; + width: 36%; + } + + .site-footer .widget-column.footer-widget-2 { + float: right; + width: 58%; + } + + .social-navigation { + clear: left; + float: left; + margin-bottom: 0; + width: 36%; + } + + .site-info { + float: left; + padding: 0.7em 0 0; + width: 58%; + } + + .social-navigation + .site-info { + margin-left: 6%; + } + + .site-info .sep { + margin: 0 0.5em; + display: inline; + visibility: visible; + height: auto; + width: auto; + } + + /* Gallery Columns */ + + .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%; + } +} + +@media screen and ( min-width: 67em ) { + + /* Layout */ + + /* Navigation */ + .navigation-top .wrap { + padding: 0.75em 2em; + } + + .navigation-top nav { + margin-left: 0; + } + + /* Sticky posts */ + + .sticky .icon-thumb-tack { + font-size: 32px; + font-size: 2rem; + height: 22px; + left: -1.25em; + top: 0.75em; + width: 32px; + } + + /* Pagination */ + + .page-numbers { + display: inline-block; + } + + .page-numbers.current { + font-size: 15px; + font-size: 0.9375rem; + } + + .page-numbers.current .screen-reader-text { + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + overflow: hidden; + position: absolute !important; + width: 1px; + } + + /* Comments */ + + .comment-body { + margin-left: 0; + } +} + +@media screen and ( min-width: 79em ) { + + .has-sidebar .entry-content blockquote.alignleft { + margin-left: -20%; + } + + .blog:not(.has-sidebar) .entry-content blockquote.alignright, + .archive:not(.has-sidebar) .entry-content blockquote.alignright, + .page-two-column .entry-content blockquote.alignright, + .twentyseventeen-front-page .entry-content blockquote.alignright { + margin-right: -20%; + } +} + +@media screen and ( max-width: 48.875em ) and ( min-width: 48em ) { + + .admin-bar .site-navigation-fixed.navigation-top, + .admin-bar .site-navigation-hidden.navigation-top { + top: 46px; + } +} + +/*-------------------------------------------------------------- +20.0 Print +--------------------------------------------------------------*/ + +@media print { + + /* Hide elements */ + + form, + button, + input, + select, + textarea, + .navigation-top, + .social-navigation, + #secondary, + .content-bottom-widgets, + .header-image, + .panel-image-prop, + .icon-thumb-tack, + .page-links, + .edit-link, + .post-navigation, + .pagination.navigation, + .comments-pagination, + .comment-respond, + .comment-edit-link, + .comment-reply-link, + .comment-metadata .edit-link, + .pingback .edit-link, + .site-footer aside.widget-area, + .site-info { + display: none !important; + } + + .entry-footer, + #comments, + .site-footer, + .single-featured-image-header { + border: 0; + } + + /* Font sizes */ + + body { + font-size: 12pt; + } + + h1 { + font-size: 24pt; + } + + h2 { + font-size: 22pt; + } + + h3 { + font-size: 17pt; + } + + h4 { + font-size: 12pt; + } + + h5 { + font-size: 11pt; + } + + h6 { + font-size: 12pt; + } + + .page .panel-content .entry-title, + .page-title, + body.page:not(.twentyseventeen-front-page) .entry-title { + font-size: 10pt; + } + + /* Layout */ + + .wrap { + padding-left: 5% !important; + padding-right: 5% !important; + max-width: none; + } + + /* Site Branding */ + + .site-header { + background: transparent; + padding: 0; + } + + .custom-header-media { + padding: 0; + } + + .twentyseventeen-front-page.has-header-image .site-branding, + .twentyseventeen-front-page.has-header-video .site-branding, + .home.blog.has-header-image .site-branding, + .home.blog.has-header-video .site-branding { + position: relative; + } + + .site-branding { + margin-top: 0; + margin-bottom: 1.75em !important; /* override styles added by JavaScript */ + } + + .site-title { + font-size: 25pt; + } + + .site-description { + font-size: 12pt; + opacity: 1; + } + + /* Posts */ + + .single-featured-image-header { + background: transparent; + } + + .entry-meta { + font-size: 9pt; + } + + /* Colors */ + + body, + .site { + background: none !important; /* Brute force since user agents all print differently. */ + } + + body, + a, + .site-title a, + .twentyseventeen-front-page.has-header-image .site-title, + .twentyseventeen-front-page.has-header-video .site-title, + .twentyseventeen-front-page.has-header-image .site-title a, + .twentyseventeen-front-page.has-header-video .site-title a { + color: #222 !important; /* Make sure color schemes don't affect to print */ + } + + h2, + h5, + blockquote, + .site-description, + .twentyseventeen-front-page.has-header-image .site-description, + .twentyseventeen-front-page.has-header-video .site-description, + .entry-meta, + .entry-meta a { + color: #777 !important; /* Make sure color schemes don't affect to print */ + } + + .entry-content blockquote.alignleft, + .entry-content blockquote.alignright { + font-size: 11pt; + width: 34%; + } + + .site-footer { + padding: 0; + } +} diff --git a/content/themes/twentyseventeen/template-parts/footer/footer-widgets.php b/content/themes/twentyseventeen/template-parts/footer/footer-widgets.php new file mode 100644 index 0000000..68ad216 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/footer/footer-widgets.php @@ -0,0 +1,35 @@ + + + + + + + diff --git a/content/themes/twentyseventeen/template-parts/footer/site-info.php b/content/themes/twentyseventeen/template-parts/footer/site-info.php new file mode 100644 index 0000000..9e5331b --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/footer/site-info.php @@ -0,0 +1,24 @@ + +
    diff --git a/content/themes/twentyseventeen/template-parts/header/header-image.php b/content/themes/twentyseventeen/template-parts/header/header-image.php new file mode 100644 index 0000000..34aaa6c --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/header/header-image.php @@ -0,0 +1,20 @@ + +
    + +
    + +
    + + + +
    diff --git a/content/themes/twentyseventeen/template-parts/header/site-branding.php b/content/themes/twentyseventeen/template-parts/header/site-branding.php new file mode 100644 index 0000000..d605a5e --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/header/site-branding.php @@ -0,0 +1,38 @@ + +
    +
    + + + +
    + +

    + +

    + + + +

    + +
    + + + 'arrow-right' ) ); ?> + + +
    +
    diff --git a/content/themes/twentyseventeen/template-parts/navigation/navigation-top.php b/content/themes/twentyseventeen/template-parts/navigation/navigation-top.php new file mode 100644 index 0000000..417e1c8 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/navigation/navigation-top.php @@ -0,0 +1,33 @@ + + diff --git a/content/themes/twentyseventeen/template-parts/page/content-front-page-panels.php b/content/themes/twentyseventeen/template-parts/page/content-front-page-panels.php new file mode 100644 index 0000000..074af0d --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/page/content-front-page-panels.php @@ -0,0 +1,87 @@ + + +
    > + + ID ), 'twentyseventeen-featured-image' ); + + // Calculate aspect ratio: h / w * 100%. + $ratio = $thumbnail[2] / $thumbnail[1] * 100; + ?> + +
    +
    +
    + + + +
    +
    +
    + ', '' ); ?> + + + +
    + +
    + "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + ?> +
    + + + + 3, + 'post_status' => 'publish', + 'ignore_sticky_posts' => true, + 'no_found_rows' => true, + ) + ); + ?> + + have_posts() ) : ?> + +
    + + have_posts() ) : + $recent_posts->the_post(); + get_template_part( 'template-parts/post/content', 'excerpt' ); + endwhile; + wp_reset_postdata(); + ?> +
    + + + +
    +
    + +
    diff --git a/content/themes/twentyseventeen/template-parts/page/content-front-page.php b/content/themes/twentyseventeen/template-parts/page/content-front-page.php new file mode 100644 index 0000000..5608ec6 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/page/content-front-page.php @@ -0,0 +1,52 @@ + +
    > + + ID ), 'twentyseventeen-featured-image' ); + + // Calculate aspect ratio: h / w * 100%. + $ratio = $thumbnail[2] / $thumbnail[1] * 100; + ?> + +
    +
    +
    + + + +
    +
    +
    + ', '' ); ?> + + + +
    + +
    + "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + ?> +
    + +
    +
    + +
    diff --git a/content/themes/twentyseventeen/template-parts/page/content-page.php b/content/themes/twentyseventeen/template-parts/page/content-page.php new file mode 100644 index 0000000..6e99666 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/page/content-page.php @@ -0,0 +1,32 @@ + + +
    > +
    + ', '' ); ?> + +
    +
    + '', + ) + ); + ?> +
    +
    diff --git a/content/themes/twentyseventeen/template-parts/post/content-audio.php b/content/themes/twentyseventeen/template-parts/post/content-audio.php new file mode 100644 index 0000000..07f9897 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/post/content-audio.php @@ -0,0 +1,109 @@ + + +
    > + 'thumb-tack' ) ); + } + ?> +
    + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + }; + echo '
  • '; + }; + + if ( is_single() ) { + the_title( '

    ', '

    ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

    ', '

    ' ); + } else { + the_title( '

    ', '

    ' ); + } + ?> + + + + + +
    + + + +
    + + +
    + + '; + echo $audio_html; + echo '
    '; + } + }; + + }; + + if ( is_single() || empty( $audio ) ) { + + the_content( + sprintf( + /* translators: %s: Post title. */ + __( 'Continue reading "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + + }; + ?> + +
    + + + + diff --git a/content/themes/twentyseventeen/template-parts/post/content-excerpt.php b/content/themes/twentyseventeen/template-parts/post/content-excerpt.php new file mode 100644 index 0000000..d16dc44 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/post/content-excerpt.php @@ -0,0 +1,48 @@ + + + diff --git a/content/themes/twentyseventeen/template-parts/post/content-gallery.php b/content/themes/twentyseventeen/template-parts/post/content-gallery.php new file mode 100644 index 0000000..7461d29 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/post/content-gallery.php @@ -0,0 +1,96 @@ + + +
    > + 'thumb-tack' ) ); + } + ?> +
    + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + }; + echo ''; + }; + + if ( is_single() ) { + the_title( '

    ', '

    ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

    ', '

    ' ); + } else { + the_title( '

    ', '

    ' ); + } + ?> +
    + + +
    + + + +
    + + +
    + + '; + echo get_post_gallery(); + echo '
    '; + }; + + }; + + if ( is_single() || ! get_post_gallery() ) { + + the_content( + sprintf( + /* translators: %s: Post title. */ + __( 'Continue reading "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + + }; + ?> + + + + + +
    diff --git a/content/themes/twentyseventeen/template-parts/post/content-image.php b/content/themes/twentyseventeen/template-parts/post/content-image.php new file mode 100644 index 0000000..6d4b5dc --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/post/content-image.php @@ -0,0 +1,86 @@ + + +
    > + 'thumb-tack' ) ); + } + ?> +
    + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + }; + echo ''; + }; + + if ( is_single() ) { + the_title( '

    ', '

    ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

    ', '

    ' ); + } else { + the_title( '

    ', '

    ' ); + } + ?> +
    + + +
    + + + +
    + + +
    + + "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + + }; + ?> + +
    + + + +
    diff --git a/content/themes/twentyseventeen/template-parts/post/content-none.php b/content/themes/twentyseventeen/template-parts/post/content-none.php new file mode 100644 index 0000000..46acac0 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/post/content-none.php @@ -0,0 +1,40 @@ + + +
    + +
    + + +

    + Get started here.', 'twentyseventeen' ), esc_url( admin_url( 'post-new.php' ) ) ); + ?> +

    + + + +

    + +
    +
    diff --git a/content/themes/twentyseventeen/template-parts/post/content-video.php b/content/themes/twentyseventeen/template-parts/post/content-video.php new file mode 100644 index 0000000..8c73044 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/post/content-video.php @@ -0,0 +1,107 @@ + + +
    > + 'thumb-tack' ) ); + } + ?> +
    + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + } + echo ''; + }; + + if ( is_single() ) { + the_title( '

    ', '

    ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

    ', '

    ' ); + } else { + the_title( '

    ', '

    ' ); + } + ?> +
    + + + + +
    + + + +
    + + +
    + + '; + echo $video_html; + echo '
    '; + } + }; + + }; + + if ( is_single() || empty( $video ) ) { + + the_content( + sprintf( + /* translators: %s: Post title. */ + __( 'Continue reading "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + }; + ?> + + + + + +
    diff --git a/content/themes/twentyseventeen/template-parts/post/content.php b/content/themes/twentyseventeen/template-parts/post/content.php new file mode 100644 index 0000000..e0f44d3 --- /dev/null +++ b/content/themes/twentyseventeen/template-parts/post/content.php @@ -0,0 +1,79 @@ + + +
    > + 'thumb-tack' ) ); + endif; + ?> +
    + '; + if ( is_single() ) { + twentyseventeen_posted_on(); + } else { + echo twentyseventeen_time_link(); + twentyseventeen_edit_link(); + }; + echo ''; + }; + + if ( is_single() ) { + the_title( '

    ', '

    ' ); + } elseif ( is_front_page() && is_home() ) { + the_title( '

    ', '

    ' ); + } else { + the_title( '

    ', '

    ' ); + } + ?> +
    + + +
    + + + +
    + + +
    + "%s"', 'twentyseventeen' ), + get_the_title() + ) + ); + + wp_link_pages( + array( + 'before' => '', + 'link_before' => '', + 'link_after' => '', + ) + ); + ?> +
    + + + +
    diff --git a/content/themes/twentytwenty/.stylelintrc.json b/content/themes/twentytwenty/.stylelintrc.json new file mode 100644 index 0000000..f888107 --- /dev/null +++ b/content/themes/twentytwenty/.stylelintrc.json @@ -0,0 +1,12 @@ +{ + "extends": [ + "stylelint-config-wordpress" + ], + "plugins": ["stylelint-a11y"], + "rules": { + "font-family-no-missing-generic-family-keyword": null, + "no-descending-specificity": null, + "a11y/no-outline-none": true, + "a11y/selector-pseudo-class-focus": true + } +} diff --git a/content/themes/twentytwenty/404.php b/content/themes/twentytwenty/404.php new file mode 100644 index 0000000..64c2503 --- /dev/null +++ b/content/themes/twentytwenty/404.php @@ -0,0 +1,36 @@ + + +
    + +
    + +

    + +

    + + __( '404 not found', 'twentytwenty' ), + ) + ); + ?> + +
    + +
    + + + + * { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + font-size: 18px; +} + +@supports ( font-variation-settings: normal ) { + + .editor-styles-wrapper > * { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } + +} + +.block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + color: inherit; + font-family: inherit; + font-size: inherit; +} + +.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover):not(:focus), +.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover):not(:focus) { + color: inherit; +} + + +/* Fonts ------------------------------------- */ + +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the Classic and block + * editors. The following font-face override fixes the issue by manually + * inserting a custom font that includes just a Hoefler Text space replacement + * for that character instead. + */ +@font-face { + font-family: NonBreakingSpaceOverride; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* ---------------------------------------------- +Inter variable font. Usage: + +@supports (font-variation-settings: normal) { + html { font-family: "Inter var", sans-serif; } +} +---------------------------------------------- */ + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: normal; + src: url(../fonts/inter/Inter-upright-var.woff2) format("woff2"); +} + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: italic; + src: url(../fonts/inter/Inter-italic-var.woff2) format("woff2"); +} + +/* Structure --------------------------------- */ + +.wp-block { + max-width: 610px; +} + +.wp-block[data-align="wide"] .wp-block[data-align="wide"], +.wp-block[data-align="full"] .wp-block[data-align="wide"] { + max-width: 1200px; +} + +.wp-block .wp-block[data-type="core/group"]:not([data-align="full"]):not([data-align="wide"]):not([data-align="left"]):not([data-align="right"]), +.wp-block .wp-block[data-type="core/cover"]:not([data-align="full"]):not([data-align="wide"]):not([data-align="left"]):not([data-align="right"]) { + margin-right: auto; + margin-left: auto; + max-width: 610px; +} + +.wp-block .wp-block[data-align="full"] { + margin-right: 0; + margin-left: 0; +} + +*[data-align="right"] .wp-block-edit, +*[data-align="left"] .wp-block-edit { + max-width: 50%; +} + +.wp-block[data-align="wide"] { + max-width: 1200px; +} + +.wp-block[data-align="full"] { + max-width: none; +} + +.editor-styles-wrapper .editor-rich-text__tinymce, +.editor-styles-wrapper .editor-rich-text__tinymce.mce-content-body { + line-height: 1.5; +} + + +/* Font Families ------------------------------ */ + +.editor-styles-wrapper p, +.editor-styles-wrapper ol, +.editor-styles-wrapper ul, +.editor-styles-wrapper dl, +.editor-styles-wrapper dt { + font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif; + letter-spacing: normal; +} + +.editor-post-title__block .editor-post-title__input, +.editor-styles-wrapper .wp-block h1, +.editor-styles-wrapper .wp-block h2, +.editor-styles-wrapper .wp-block h3, +.editor-styles-wrapper .wp-block h4, +.editor-styles-wrapper .wp-block h5, +.editor-styles-wrapper .wp-block h6, +.editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter, +.editor-styles-wrapper cite, +.editor-styles-wrapper figcaption, +.editor-styles-wrapper .wp-caption-text { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + .editor-post-title__block .editor-post-title__input, + .editor-styles-wrapper .wp-block h1, + .editor-styles-wrapper .wp-block h2, + .editor-styles-wrapper .wp-block h3, + .editor-styles-wrapper .wp-block h4, + .editor-styles-wrapper .wp-block h5, + .editor-styles-wrapper .wp-block h6, + .editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter, + .editor-styles-wrapper cite, + .editor-styles-wrapper figcaption, + .editor-styles-wrapper .wp-caption-text { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } + +} + + +/* Colors ------------------------------------ */ + +/* CUSTOM COLORS */ + +:root .has-accent-color { + color: #cd2653; +} + +:root .has-accent-background-color { + background-color: #cd2653; + color: #fff; +} + +:root .has-primary-color { + color: #000; +} + +:root .has-primary-background-color { + background-color: #000; + color: #f5efe0; +} + +:root .has-secondary-color { + color: #6d6d6d; +} + +:root .has-secondary-background-color { + background-color: #6d6d6d; + color: #fff; +} + +:root .has-subtle-background-color { + color: #dcd7ca; +} + +:root .has-subtle-background-background-color { + background-color: #dcd7ca; + color: #000; +} + +:root .has-background-color { + color: #f5efe0; +} + +:root .has-background-background-color { + background-color: #f5efe0; + color: #000; +} + +/* GENERAL COLORS */ + +.has-black-background-color { + background-color: #000; + color: #fff; +} + +.has-white-background-color { + background-color: #fff; + color: #000; +} + +.has-black-color { + color: #000; +} + +.has-white-color { + color: #fff; +} + + +/* Typography -------------------------------- */ + +.editor-styles-wrapper .editor-block-list__layout a { + color: #cd2653; + text-decoration: underline; +} + +.editor-styles-wrapper a:focus, +.editor-styles-wrapper a:hover { + text-decoration: none; +} + +.editor-post-title__block .editor-post-title__input, +.editor-styles-wrapper .wp-block h1, +.editor-styles-wrapper .wp-block h2, +.editor-styles-wrapper .wp-block h3, +.editor-styles-wrapper .wp-block h4, +.editor-styles-wrapper .wp-block h5, +.editor-styles-wrapper .wp-block h6 { + font-feature-settings: "lnum"; + font-variant-numeric: lining-nums; + font-weight: 700; + letter-spacing: -0.0415625em; + line-height: 1.25; + margin: 40px 0 25px; +} + +.editor-post-title__block .editor-post-title__input, +.editor-styles-wrapper .wp-block h1 { + font-size: 36px; + font-weight: 800; + line-height: 1.138888889; +} + +.editor-styles-wrapper .wp-block h2 { + font-size: 32px; +} + +.editor-styles-wrapper .wp-block h3 { + font-size: 28px; +} + +.editor-styles-wrapper .wp-block h4 { + font-size: 24px; +} + +.editor-styles-wrapper .wp-block h5 { + font-size: 21px; +} + +.editor-styles-wrapper .wp-block h6 { + font-size: 16px; + letter-spacing: 0.03125em; + text-transform: uppercase; +} + +.editor-styles-wrapper li, +.editor-styles-wrapper p, +.editor-styles-wrapper p.wp-block-paragraph { + line-height: 1.4; +} + +/* POST TITLE */ + +.wp-block.editor-post-title__block { + max-width: 1000px; +} + +.editor-styles-wrapper .editor-post-title__block .editor-post-title__input { + margin: 0; + text-align: center; +} + +/* DROP CAP */ + +.editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter { + color: #cd2653; + font-size: 5.1em; + font-weight: 800; + margin: 0.05em 0 0 0.1em; +} + + +/* Monospace --------------------------------- */ + +.editor-styles-wrapper code, +.editor-styles-wrapper kbd, +.editor-styles-wrapper pre, +.editor-styles-wrapper samp { + font-family: monospace; +} + +.editor-styles-wrapper kbd, +.editor-styles-wrapper pre, +.editor-styles-wrapper samp { + border-radius: 0; + font-size: 0.75em; + padding: 4px 6px; +} + +.editor-styles-wrapper pre { + border-color: #dcd7ca; + border-radius: 0; + line-height: 1.5; + padding: 1em; +} + + +/* Custom Text Sizes ------------------------- */ + +.editor-styles-wrapper p.has-large-font-size.editor-rich-text__tinymce, +.editor-styles-wrapper p.has-large-font-size.editor-rich-text__tinymce.mce-content-body, +.editor-styles-wrapper p.has-larger-font-size.editor-rich-text__tinymce, +.editor-styles-wrapper p.has-larger-font-size.editor-rich-text__tinymce.mce-content-body { + line-height: 1.4; +} + +.editor-styles-wrapper p.has-small-font-size { + font-size: 0.842em; +} + +.editor-styles-wrapper p.has-normal-font-size, +.editor-styles-wrapper p.has-regular-font-size { + font-size: 1em; +} + +.editor-styles-wrapper p.has-medium-font-size { + font-size: 1.1em; +} + +.editor-styles-wrapper p.has-large-font-size { + font-size: 1.25em; +} + +.editor-styles-wrapper p.has-larger-font-size { + font-size: 1.5em; +} + + +/* Post Media -------------------------------- */ + +.editor-styles-wrapper figure { + margin: 0; +} + +.editor-styles-wrapper .alignleft, +.editor-styles-wrapper .alignright { + margin-bottom: 1.2em; + max-width: 260px; +} + +.editor-styles-wrapper .wp-caption .alignleft, +.editor-styles-wrapper .wp-caption .alignright { + margin-bottom: 0; +} + +.editor-styles-wrapper .alignleft { + margin-left: 1em; +} + +.editor-styles-wrapper .alignright { + margin-right: 1em; +} + +.editor-styles-wrapper figcaption { + color: #6d6d6d; + font-size: 15px; + font-weight: 500; + line-height: 1.2; + margin-top: 5px; + text-align: inherit; +} + + +/* Forms ------------------------------------- */ + +.editor-styles-wrapper fieldset { + border: 2px solid #dcd7ca; + padding: 20px; +} + +.editor-styles-wrapper legend { + font-size: 0.85em; + font-weight: 700; + padding: 0 10px; +} + +.editor-styles-wrapper label { + font-size: 15px; + font-weight: 600; +} + + +/* Block: Base Margins ---------------------- */ + +/* Block: Shared Widget Styles -------------- */ + +.editor-styles-wrapper ul.wp-block-archives, +.editor-styles-wrapper ul.wp-block-categories, +.editor-styles-wrapper ul.wp-block-latest-posts, +.editor-styles-wrapper ul.wp-block-categories__list { + font-family: inherit; + list-style: none; + margin: 40px 0; + padding-right: 0; +} + +.editor-styles-wrapper ul.wp-block-categories__list ul { + margin: 0; +} + +.editor-styles-wrapper ul.wp-block-archives li, +.editor-styles-wrapper ul.wp-block-categories li, +.editor-styles-wrapper ul.wp-block-latest-posts li, +.editor-styles-wrapper ul.wp-block-categories__list li { + color: #6d6d6d; + line-height: 1.476; + margin: 5px 0 0 0; +} + +.editor-styles-wrapper ul.wp-block-archives li li, +.editor-styles-wrapper ul.wp-block-categories li li, +.editor-styles-wrapper ul.wp-block-categories__list li li, +.editor-styles-wrapper ul.wp-block-latest-posts li li { + margin-right: 20px; +} + +.editor-styles-wrapper .wp-block-archives li > a, +.editor-styles-wrapper .wp-block-categories li > a, +.editor-styles-wrapper .wp-block-latest-posts li > a { + font-weight: 700; + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-archives li > a:focus, +.editor-styles-wrapper .wp-block-archives li > a:hover, +.editor-styles-wrapper .wp-block-categories li > a:focus, +.editor-styles-wrapper .wp-block-categories li > a:hover, +.editor-styles-wrapper .wp-block-latest-posts li > a:focus, +.editor-styles-wrapper .wp-block-latest-posts li > a:hover { + font-weight: 700; + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-archives.aligncenter, +.editor-styles-wrapper .wp-block-categories.aligncenter { + text-align: center; +} + +.editor-styles-wrapper .wp-block-latest-comments time, +.editor-styles-wrapper .wp-block-latest-posts time { + color: #6d6d6d; + font-size: 0.7em; + font-weight: 600; + letter-spacing: normal; + line-height: 1.476; + margin-top: 0.15em; +} + + +/* Block: Table ------------------------------ */ + +.editor-styles-wrapper .wp-block-table { + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + font-size: 18px; + margin-bottom: 1.1em; + width: 100%; +} + +.editor-styles-wrapper .wp-block-table, +.editor-styles-wrapper .wp-block-table * { + border-color: #dcd7ca; +} + +.editor-styles-wrapper .wp-block-table tr { + border: none; +} + +.editor-styles-wrapper .wp-block-table caption { + background: #dcd7ca; + text-align: center; +} + +.editor-styles-wrapper .wp-block-table th, +.editor-styles-wrapper .wp-block-table td { + line-height: 1.4; + margin: 0; + overflow: visible; + padding: 0; +} + +.editor-styles-wrapper .wp-block-table .wp-block-table__cell-content { + padding: 0.5em; +} + +.editor-styles-wrapper .wp-block-table thead { + vertical-align: bottom; + white-space: nowrap; + text-align: inherit; +} + +.editor-styles-wrapper .wp-block-table th { + font-weight: 700; + text-align: inherit; /* Prevents the header from being centered by default*/ +} + +.editor-styles-wrapper .wp-block-table th.has-text-align-center { + text-align: center; +} + +.editor-styles-wrapper .wp-block-table th.has-text-align-right { + text-align: left; +} + +.editor-styles-wrapper .wp-block-table th.has-text-align-left { + text-align: right; +} + +/* STYLE: STRIPES */ + +.editor-styles-wrapper .wp-block-table.is-style-stripes { + border: 1px solid #dcd7ca; +} + +.editor-styles-wrapper .wp-block-table.is-style-stripes tbody tr:nth-child(odd) { + background: #dcd7ca; +} + + +/* Block: Separator -------------------------- */ + +hr.wp-block-separator { + border-top: 1px solid #6d6d6d; + color: #6d6d6d; + margin: 30px 0; +} + +hr.wp-block-separator:not(.is-style-wide):not(.is-style-dots) { + max-width: 100%; +} + +hr.wp-block-separator:not(.is-style-dots) { + background: linear-gradient(to right, currentColor calc(50% - 16px), transparent calc(50% - 16px), transparent calc(50% + 16px), currentColor calc(50% + 16px)); + background-color: transparent !important; + border: none; + height: 1px; + overflow: visible; + position: relative; +} + +.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots) { + height: 1px; +} + +hr.wp-block-separator:not(.is-style-dots)::before, +hr.wp-block-separator:not(.is-style-dots)::after { + background: currentColor; + content: ""; + display: block; + height: 16px; + position: absolute; + top: calc(50% - 8px); + transform: rotate(-22.5deg); + width: 1px; +} + +hr.wp-block-separator::before { + right: calc(50% - 5px); +} + +hr.wp-block-separator::after { + left: calc(50% - 5px); +} + +/* STYLE: DOTS */ + +hr.wp-block-separator.is-style-dots::before { + font-size: 32px; + font-weight: 700; + letter-spacing: 1em; + padding-right: 1em; +} + + +/* Block: Quote ------------------------------ */ + +.editor-styles-wrapper blockquote { + margin: 0; +} + +.editor-styles-wrapper .wp-block-quote { + border-color: #cd2653; + border-style: solid; + border-width: 0 2px 0 0; + margin: 20px 0; + padding: 5px 20px 5px 0; +} + +.editor-styles-wrapper .wp-block-quote.has-text-align-center, +.editor-styles-wrapper .wp-block-quote[style*="text-align:center"], +.editor-styles-wrapper .wp-block-quote[style*="text-align: center"] { + border-width: 0; + padding: 5px 0; +} + +.editor-styles-wrapper .wp-block-quote.has-text-align-right, +.editor-styles-wrapper .wp-block-quote[style*="text-align:right"], +.editor-styles-wrapper .wp-block-quote[style*="text-align: right"] { + border-width: 0 0 0 2px; + padding: 5px 0 5px 20px; +} + +.editor-styles-wrapper cite, +.editor-styles-wrapper .wp-block-quote__citation, +.editor-styles-wrapper .wp-block-quote cite, +.editor-styles-wrapper .wp-block-quote footer { + color: #6d6d6d; + font-size: 14px; + font-weight: 600; + line-height: 1.25; +} + +.editor-styles-wrapper .wp-block-quote p { + color: inherit; + font-weight: 400; + margin: 0 0 20px 0; +} + +.editor-styles-wrapper .wp-block-quote.is-style-large { + border: none; + padding: 0; +} + +.editor-styles-wrapper .wp-block-quote.is-style-large p { + font-family: inherit; + font-size: 24px; + font-style: normal; + font-weight: 700; + letter-spacing: -0.035714286em; + line-height: 1.285714286; +} + +.editor-styles-wrapper .wp-block-quote.is-style-large .wp-block-quote__citation, +.editor-styles-wrapper .wp-block-quote.is-style-large cite, +.editor-styles-wrapper .wp-block-quote.is-style-large footer { + font-size: 16px; +} + + +/* Block: Code, Verse and Preformatted ------- */ + +.editor-styles-wrapper .wp-block-code { + color: inherit; +} + +.editor-styles-wrapper .wp-block-code, +.editor-styles-wrapper .wp-block-preformatted pre, +.editor-styles-wrapper .wp-block-verse pre { + border: 1px solid #dcd7ca; + border-radius: 0; + padding: 30px; +} + +.editor-styles-wrapper .wp-block-freeform.block-library-rich-text__tinymce pre, +.editor-styles-wrapper .wp-block-preformatted pre, +.editor-styles-wrapper .wp-block-code .block-editor-plain-text, +.editor-styles-wrapper .wp-block-verse pre { + background: transparent; + color: inherit; + font-family: monospace; + font-size: 14px; +} + +/* Block: Cover ------------------------------ */ + +.editor-styles-wrapper .wp-block-cover-image .wp-block-cover__inner-container, +.editor-styles-wrapper .wp-block-cover .wp-block-cover__inner-container { + margin: 0 auto; + width: calc(100% - 40px); +} + +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"], +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] { + height: auto; + max-height: none; +} + +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] .wp-block-cover { + text-align: right; +} + +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"] .wp-block-cover { + text-align: left; +} + +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"] .block-editor-block-list__block-edit, +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] .block-editor-block-list__block-edit { + float: none; + margin-right: 0; + margin-left: 0; + max-width: 100%; +} + +.wp-block-cover-image .wp-block-cover-image-text, +.wp-block-cover-image .wp-block-cover-text, +.wp-block-cover-image h2, +.wp-block-cover .wp-block-cover-image-text, +.wp-block-cover .wp-block-cover-text, +.wp-block-cover h2 { + max-width: 100%; +} + +.editor-styles-wrapper .wp-block-cover a { + color: inherit; +} + +/* Block: Shared Media Styles ---------------- */ + +.wp-block[data-type*="core-embed"][data-align="full"] figcaption, +.wp-block[data-type="core/image"][data-align="full"] figcaption, +.wp-block[data-type="core/gallery"][data-align="full"] .blocks-gallery-caption { + padding: 0 14px; +} + +/* Block: Paragraph -------------------------- */ + +/* Block: Pullquote -------------------------- */ + +.editor-styles-wrapper .wp-block-pullquote { + border: none; + color: inherit; + padding: 0; + position: relative; + text-align: center; +} + +.editor-styles-wrapper .wp-block-pullquote::before { + background: #fff; + border-radius: 50%; + color: #cd2653; + content: "”"; + display: block; + font-size: 62px; + font-weight: 500; + line-height: 1.2; + margin: 0 auto 15px auto; + text-align: center; + height: 44px; + width: 44px; +} + +.editor-styles-wrapper .wp-block .wp-block-pullquote p { + font-family: inherit; + font-size: 28px; + font-weight: 700; + line-height: 1.178571429; + letter-spacing: -0.041785714em; + margin-bottom: 20px; +} + +.editor-styles-wrapper .wp-block .wp-block-pullquote p:last-child { + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block .wp-block-pullquote p, +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote > .block-editor-rich-text p, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .editor-rich-text p, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .editor-rich-text p { + font-size: 28px; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"], +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] { + height: auto; + max-height: none; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote.is-style-solid-color blockquote { + text-align: right; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote.is-style-solid-color blockquote { + text-align: left; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .block-editor-block-list__block-edit, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .block-editor-block-list__block-edit { + float: none; + margin-right: 0; + margin-left: 0; + max-width: 100%; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .block-editor-block-list__block-edit .wp-block-pullquote::before { + margin-left: 0; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .block-editor-block-list__block-edit .wp-block-pullquote::before { + margin-right: 0; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .is-style-solid-color::before { + left: 20px; + transform: translateY(-50%); +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .is-style-solid-color::before { + right: 20px; + transform: translateY(-50%); +} + +.editor-styles-wrapper .wp-block-pullquote__citation, +.editor-styles-wrapper .wp-block-pullquote cite, +.editor-styles-wrapper .wp-block-pullquote footer { + color: #6d6d6d; + font-size: 16px; + font-weight: 500; + margin-top: 12px; + text-transform: none; +} + +/* STYLE: SOLID COLOR */ + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color { + padding: 30px 20px; + position: relative; +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color::before { + position: absolute; + top: 0; + right: 50%; + transform: translateY(-50%) translateX(50%); +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 100%; + text-align: center; +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation, +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color .wp-block-pullquote cite, +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color .wp-block-pullquote footer { + color: inherit; +} + + +/* Block: Verse ------------------------------ */ + +.editor-styles-wrapper .wp-block-verse pre, +.editor-styles-wrapper pre.wp-block-verse { + font-size: 0.75em; +} + + +/* Block: Button ----------------------------- */ + +.editor-styles-wrapper .wp-block-button__link, +.editor-styles-wrapper .wp-block-file__button { + background: #cd2653; + border-radius: 0; + color: #fff; + font-size: 15px; + font-weight: 600; + letter-spacing: 0.0333em; + line-height: 1.25; + padding: 1.1em 1.44em; + text-transform: uppercase; +} + +.editor-styles-wrapper .wp-block-button .wp-block-button__link.mce-content-body { + line-height: 1.1; +} + +/* BUTTON STYLE: OUTLINE */ + +.editor-styles-wrapper .is-style-outline .wp-block-button__link { + background: none; + border-color: currentColor; + color: #cd2653; + padding: calc(1.1em - 2px) calc(1.44em - 2px); +} + +/* BUTTON STYLE: SQUARED */ + +.editor-styles-wrapper .is-style-squared .wp-block-button__link { + border-radius: 0; +} + + +/* Block: Latest Comments -------------------- */ + +.editor-styles-wrapper .wp-block-latest-comments { + font-family: inherit; + margin-right: 0; +} + +.editor-styles-wrapper .wp-block-latest-comments li.wp-block-latest-comments__comment { + font-size: inherit; + margin-bottom: 20px; +} + +.editor-styles-wrapper .wp-block-latest-comments li.wp-block-latest-comments__comment:last-child { + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-meta, +.editor-styles-wrapper .wp-block-latest-comments__comment-excerpt { + margin-right: 0 !important; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-meta { + font-weight: 700; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-meta a { + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-meta a:focus, +.editor-styles-wrapper .wp-block-latest-comments__comment-meta a:hover { + text-decoration: none; +} + +/* HAS AVATAR */ + +.editor-styles-wrapper .wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment { + display: flex; +} + +.editor-styles-wrapper .wp-block-latest-comments.has-avatars img.avatar { + flex-shrink: 0; + margin: 5px 0 0 15px; +} + +/* HAS EXCERPT */ + +.editor-styles-wrapper .wp-block-latest-comments__comment-excerpt { + margin: 0; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-excerpt p { + font-family: inherit; + font-size: 0.7em; + margin: 10px 0 0; +} + + +/* Block: Latest Posts ----------------------- */ + +.editor-styles-wrapper ul.wp-block-latest-posts:not(.is-grid) li { + margin-top: 15px; +} + +/* STYLE: GRID */ + +.editor-styles-wrapper .wp-block-latest-posts.is-grid li { + border-color: #dcd7ca; +} + +.editor-styles-wrapper ul.wp-block-latest-posts.is-grid li { + border-style: solid; + border-width: 2px 0 0; + line-height: 1.25; + margin: 20px 0 16px 16px; + padding-top: 12px; +} + +.editor-styles-wrapper .wp-block-latest-posts__post-excerpt { + font-size: 0.95em; + line-height: 1.4; + margin-top: 15px; +} + +/* Block: Shortcode -------------------------- */ + +.editor-styles-wrapper .wp-block-shortcode textarea { + color: #191e23; +} + +/* Block: Embed ------------------------------ */ + +.editor-styles-wrapper .wp-block-embed { + margin-bottom: 30px; + margin-top: 30px; +} + +.editor-styles-wrapper .wp-block[data-type*="core-embed"][data-align="center"] * { + margin-right: auto; + margin-left: auto; +} + +/* Block: File ------------------------------- */ + +.editor-styles-wrapper .wp-block-file { + background: none; + padding: 0; +} + +.editor-styles-wrapper .wp-block-file__content-wrapper { + align-items: center; + display: flex; + justify-content: space-between; +} + +.editor-styles-wrapper .wp-block-file .wp-block-file__textlink { + color: #cd2653; + font-weight: 700; + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-file .wp-block-file__textlink:focus, +.editor-styles-wrapper .wp-block-file .wp-block-file__textlink:hover { + text-decoration: underline; +} + +.editor-styles-wrapper .wp-block-file .wp-block-file__button { + font-size: 14px; + padding: 1em 1.25em; +} + +/* Block: Image ------------------------------ */ + +.editor-styles-wrapper .wp-block-image { + margin-bottom: 30px; + margin-top: 30px; +} + +.editor-styles-wrapper .wp-block-image.is-resized { + margin-right: auto; + margin-left: auto; +} + +/* Block: Group ------------------------------ */ + +.editor-styles-wrapper .wp-block-group.has-background { + padding: 20px; +} + +.wp-block-group .wp-block[data-type="core/heading"]:first-child * { + margin-top: 0; +} + +.wp-block[data-type="core/group"] > .editor-block-list__block-edit > div > .wp-block-group.has-background > .wp-block-group__inner-container > .editor-inner-blocks > .editor-block-list__layout > .wp-block[data-align="full"], +.wp-block[data-type="core/group"][data-align="full"] > .editor-block-list__block-edit > div > .wp-block-group.has-background > .wp-block-group__inner-container > .editor-inner-blocks > .editor-block-list__layout > .wp-block[data-align="full"] { + margin-right: 0; + width: 100%; +} + +/* Block: Paragraph -------------------------- */ + + +/* X. Media Queries +/* ------------------------------------------- */ + + +@media ( min-width: 480px ) { + + + /* STRUCTURE */ + + .editor-styles-wrapper .wp-block[data-align="right"] { + margin-left: 0; + } + + .editor-styles-wrapper .wp-block[data-align="left"] { + margin: 0; + } + + /* BLOCK: COVER */ + + .wp-block[data-type="core/cover"][data-align="left"] [data-block], + .wp-block[data-type="core/cover"][data-align="right"] [data-block] { + margin-top: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"] .block-editor-block-list__block-edit { + float: left; + margin-right: 20px; + max-width: 260px; + } + + .editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] .block-editor-block-list__block-edit { + float: right; + margin-left: 20px; + max-width: 260px; + } + + .editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"] .wp-block-pullquote::before { + margin-left: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] .wp-block-pullquote::before { + margin-right: 0; + } + + /* BLOCK: PULL QUOTE */ + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"], + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] { + height: 0; + max-width: 260px; + } + + .wp-block[data-type="core/pullquote"][data-align="left"] [data-block], + .wp-block[data-type="core/pullquote"][data-align="right"] [data-block] { + margin-top: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .block-editor-block-list__block-edit { + float: left; + margin-right: 20px; + max-width: 260px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .block-editor-block-list__block-edit { + float: right; + margin-left: 20px; + max-width: 260px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote::before { + margin-left: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote::before { + margin-right: 0; + } + + +} + +@media ( min-width: 600px ) { + + + /* BLOCK: SHARED MEDIA STYLES */ + + .wp-block[data-type*="core-embed"][data-align="full"] figcaption, + .wp-block[data-type="core/image"][data-align="full"] figcaption, + .wp-block[data-type="core/gallery"][data-align="full"] .blocks-gallery-caption { + padding: 0 45px; + } + + /* BLOCK: COLUMNS */ + + .editor-styles-wrapper .wp-block[data-type="core/column"] h1, + .editor-styles-wrapper .wp-block[data-type="core/column"] h2, + .editor-styles-wrapper .wp-block[data-type="core/column"] h3, + .editor-styles-wrapper .wp-block[data-type="core/column"] h4, + .editor-styles-wrapper .wp-block[data-type="core/column"] h5, + .editor-styles-wrapper .wp-block[data-type="core/column"] h6 { + margin: 35px 0 20px 0; + } + + /* BLOCK: PULLQUOTE */ + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .block-editor-block-list__block-edit { + margin-left: -30px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .block-editor-block-list__block-edit { + margin-right: -30px; + } + + +} + +@media ( min-width: 700px ) { + + /* STRUCTURE */ + + .editor-styles-wrapper > * { + font-size: 21px; + } + + /* TYPOGRAPHY */ + + .editor-post-title__block .editor-post-title__input, + .editor-styles-wrapper .wp-block h1 { + font-size: 64px; + } + + .editor-styles-wrapper .wp-block h2 { + font-size: 48px; + } + + .editor-styles-wrapper .wp-block h3 { + font-size: 40px; + } + + .editor-styles-wrapper .wp-block h4 { + font-size: 32px; + } + + .editor-styles-wrapper .wp-block h5 { + font-size: 24px; + } + + .editor-styles-wrapper li, + .editor-styles-wrapper p, + .editor-styles-wrapper p.wp-block-paragraph { + line-height: 1.476; + } + + /* FORMS */ + + .editor-styles-wrapper fieldset { + padding: 30px; + } + + .editor-styles-wrapper legend { + padding: 0 15px; + } + + /* BLOCK: BASE MARGINS */ + + /* BLOCK: BUTTON */ + + .editor-styles-wrapper .wp-block-button__link, + .editor-styles-wrapper .wp-block-file__button { + font-size: 17px; + } + + /* BLOCK: CODE */ + + .editor-styles-wrapper .wp-block-preformatted pre, + .editor-styles-wrapper .wp-block-code .block-editor-plain-text, + .editor-styles-wrapper .wp-block-verse pre { + font-size: 16px; + } + + /* BLOCK: COLUMNS */ + + .wp-block-column { + font-size: 16px; + } + + /* BLOCK: COVER */ + + .editor-styles-wrapper .wp-block-cover-image .wp-block-cover__inner-container, + .editor-styles-wrapper .wp-block-cover .wp-block-cover__inner-container { + width: calc(100% - 80px); + } + + /* BLOCK: GROUP */ + + .editor-styles-wrapper .wp-block:not([data-align="wide"]):not([data-align="full"]) div:not([class*="__inner-container"]) .wp-block-group.has-background, + .editor-styles-wrapper .wp-block div[class*="__inner-container"] .wp-block[data-align="wide"] .wp-block-group.has-background, + .editor-styles-wrapper .wp-block div[class*="__inner-container"] .wp-block[data-align="full"] .wp-block-group.has-background { + padding: 40px; + } + + .editor-styles-wrapper .wp-block[data-align="wide"] .wp-block-group.has-background, + .editor-styles-wrapper .wp-block[data-align="full"] .wp-block-group.has-background { + padding: 80px; + } + + /* BLOCK: LATEST POSTS */ + + /* BLOCK: PULLQUOTE */ + + .editor-styles-wrapper .wp-block .wp-block-pullquote p, + .editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote > .block-editor-rich-text p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .editor-rich-text p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .editor-rich-text p { + font-size: 32px; + } + + .editor-styles-wrapper .wp-block-pullquote__citation, + .editor-styles-wrapper .wp-block-pullquote cite, + .editor-styles-wrapper .wp-block-pullquote footer { + margin-top: 20px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] .wp-block-pullquote::before, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote::before { + font-size: 113px; + height: 80px; + margin-bottom: 20px; + width: 80px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] .wp-block-pullquote.is-style-solid-color, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote.is-style-solid-color { + padding: 60px 40px 40px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote:not(.is-style-solid-color) { + padding-right: 10px; + padding-left: 10px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] blockquote p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] blockquote p { + font-size: 48px; + line-height: 1.203125; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] p { + font-size: 32px; + line-height: 1.1875; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .is-style-solid-color p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .is-style-solid-color p { + font-size: 26px; + } + + /* BLOCK: TABLE */ + + .editor-styles-wrapper table.wp-block-table { + font-size: 18px; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator { + margin-bottom: 60px; + margin-top: 60px; + } + +} + + +@media ( min-width: 1000px ) { + + + /* BLOCK: COLUMNS */ + + .wp-block-column { + font-size: 18px; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator { + margin-bottom: 80px; + margin-top: 80px; + } + + hr.wp-block-separator.is-style-wide { + margin-right: -70px; + margin-left: -70px; + } + + +} + + +@media ( min-width: 1220px ) { + + + /* TYPOGRAPHY */ + + .editor-post-title__block .editor-post-title__input, + .editor-styles-wrapper .wp-block h1 { + font-size: 84px; + } + + .editor-styles-wrapper .wp-block h6 { + font-size: 18px; + } + + /* BLOCK: PULLQUOTE */ + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] .wp-block-pullquote.is-style-solid-color, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote.is-style-solid-color { + padding: 90px 40px 80px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] blockquote p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] blockquote p { + font-size: 64px; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator.is-style-wide { + margin-right: -150px; + margin-left: -150px; + } + +} + + +@media ( min-width: 1360px ) { + + + /* STRUCTURE */ + + .editor-styles-wrapper .wp-block[data-align="left"], + .editor-styles-wrapper .wp-block[data-align="right"] { + margin: 0 auto; + max-width: 1220px; + } + + + /* BLOCK: PULLQUOTE */ + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .is-style-solid-color::before, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .is-style-solid-color::before { + top: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"], + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] { + margin: 0 auto; + max-width: 1220px; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator.is-style-wide { + margin-right: -200px; + margin-left: -200px; + } + + +} diff --git a/content/themes/twentytwenty/assets/css/editor-style-block.css b/content/themes/twentytwenty/assets/css/editor-style-block.css new file mode 100644 index 0000000..55d1446 --- /dev/null +++ b/content/themes/twentytwenty/assets/css/editor-style-block.css @@ -0,0 +1,1454 @@ +/* ------------------------------------------- */ + +/* Twenty Twenty Editor Styles — Block Editor +/* ------------------------------------------- */ + +.editor-styles-wrapper { + background: #f5efe0; + color: #000; + letter-spacing: -0.015em; + -moz-font-smoothing: antialiased; + -webkit-font-smoothing: antialiased; +} + +.editor-styles-wrapper > * { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + font-size: 18px; +} + +@supports ( font-variation-settings: normal ) { + + .editor-styles-wrapper > * { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } + +} + +.block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + color: inherit; + font-family: inherit; + font-size: inherit; +} + +.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover):not(:focus), +.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover):not(:focus) { + color: inherit; +} + + +/* Fonts ------------------------------------- */ + +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the Classic and block + * editors. The following font-face override fixes the issue by manually + * inserting a custom font that includes just a Hoefler Text space replacement + * for that character instead. + */ +@font-face { + font-family: NonBreakingSpaceOverride; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* ---------------------------------------------- +Inter variable font. Usage: + +@supports (font-variation-settings: normal) { + html { font-family: "Inter var", sans-serif; } +} +---------------------------------------------- */ + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: normal; + src: url(../fonts/inter/Inter-upright-var.woff2) format("woff2"); +} + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: italic; + src: url(../fonts/inter/Inter-italic-var.woff2) format("woff2"); +} + +/* Structure --------------------------------- */ + +.wp-block { + max-width: 610px; +} + +.wp-block[data-align="wide"] .wp-block[data-align="wide"], +.wp-block[data-align="full"] .wp-block[data-align="wide"] { + max-width: 1200px; +} + +.wp-block .wp-block[data-type="core/group"]:not([data-align="full"]):not([data-align="wide"]):not([data-align="left"]):not([data-align="right"]), +.wp-block .wp-block[data-type="core/cover"]:not([data-align="full"]):not([data-align="wide"]):not([data-align="left"]):not([data-align="right"]) { + margin-left: auto; + margin-right: auto; + max-width: 610px; +} + +.wp-block .wp-block[data-align="full"] { + margin-left: 0; + margin-right: 0; +} + +*[data-align="right"] .wp-block-edit, +*[data-align="left"] .wp-block-edit { + max-width: 50%; +} + +.wp-block[data-align="wide"] { + max-width: 1200px; +} + +.wp-block[data-align="full"] { + max-width: none; +} + +.editor-styles-wrapper .editor-rich-text__tinymce, +.editor-styles-wrapper .editor-rich-text__tinymce.mce-content-body { + line-height: 1.5; +} + + +/* Font Families ------------------------------ */ + +.editor-styles-wrapper p, +.editor-styles-wrapper ol, +.editor-styles-wrapper ul, +.editor-styles-wrapper dl, +.editor-styles-wrapper dt { + font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif; + letter-spacing: normal; +} + +.editor-post-title__block .editor-post-title__input, +.editor-styles-wrapper .wp-block h1, +.editor-styles-wrapper .wp-block h2, +.editor-styles-wrapper .wp-block h3, +.editor-styles-wrapper .wp-block h4, +.editor-styles-wrapper .wp-block h5, +.editor-styles-wrapper .wp-block h6, +.editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter, +.editor-styles-wrapper cite, +.editor-styles-wrapper figcaption, +.editor-styles-wrapper .wp-caption-text { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + .editor-post-title__block .editor-post-title__input, + .editor-styles-wrapper .wp-block h1, + .editor-styles-wrapper .wp-block h2, + .editor-styles-wrapper .wp-block h3, + .editor-styles-wrapper .wp-block h4, + .editor-styles-wrapper .wp-block h5, + .editor-styles-wrapper .wp-block h6, + .editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter, + .editor-styles-wrapper cite, + .editor-styles-wrapper figcaption, + .editor-styles-wrapper .wp-caption-text { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } + +} + + +/* Colors ------------------------------------ */ + +/* CUSTOM COLORS */ + +:root .has-accent-color { + color: #cd2653; +} + +:root .has-accent-background-color { + background-color: #cd2653; + color: #fff; +} + +:root .has-primary-color { + color: #000; +} + +:root .has-primary-background-color { + background-color: #000; + color: #f5efe0; +} + +:root .has-secondary-color { + color: #6d6d6d; +} + +:root .has-secondary-background-color { + background-color: #6d6d6d; + color: #fff; +} + +:root .has-subtle-background-color { + color: #dcd7ca; +} + +:root .has-subtle-background-background-color { + background-color: #dcd7ca; + color: #000; +} + +:root .has-background-color { + color: #f5efe0; +} + +:root .has-background-background-color { + background-color: #f5efe0; + color: #000; +} + +/* GENERAL COLORS */ + +.has-black-background-color { + background-color: #000; + color: #fff; +} + +.has-white-background-color { + background-color: #fff; + color: #000; +} + +.has-black-color { + color: #000; +} + +.has-white-color { + color: #fff; +} + + +/* Typography -------------------------------- */ + +.editor-styles-wrapper .editor-block-list__layout a { + color: #cd2653; + text-decoration: underline; +} + +.editor-styles-wrapper a:focus, +.editor-styles-wrapper a:hover { + text-decoration: none; +} + +.editor-post-title__block .editor-post-title__input, +.editor-styles-wrapper .wp-block h1, +.editor-styles-wrapper .wp-block h2, +.editor-styles-wrapper .wp-block h3, +.editor-styles-wrapper .wp-block h4, +.editor-styles-wrapper .wp-block h5, +.editor-styles-wrapper .wp-block h6 { + font-feature-settings: "lnum"; + font-variant-numeric: lining-nums; + font-weight: 700; + letter-spacing: -0.0415625em; + line-height: 1.25; + margin: 40px 0 25px; +} + +.editor-post-title__block .editor-post-title__input, +.editor-styles-wrapper .wp-block h1 { + font-size: 36px; + font-weight: 800; + line-height: 1.138888889; +} + +.editor-styles-wrapper .wp-block h2 { + font-size: 32px; +} + +.editor-styles-wrapper .wp-block h3 { + font-size: 28px; +} + +.editor-styles-wrapper .wp-block h4 { + font-size: 24px; +} + +.editor-styles-wrapper .wp-block h5 { + font-size: 21px; +} + +.editor-styles-wrapper .wp-block h6 { + font-size: 16px; + letter-spacing: 0.03125em; + text-transform: uppercase; +} + +.editor-styles-wrapper li, +.editor-styles-wrapper p, +.editor-styles-wrapper p.wp-block-paragraph { + line-height: 1.4; +} + +/* POST TITLE */ + +.wp-block.editor-post-title__block { + max-width: 1000px; +} + +.editor-styles-wrapper .editor-post-title__block .editor-post-title__input { + margin: 0; + text-align: center; +} + +/* DROP CAP */ + +.editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter { + color: #cd2653; + font-size: 5.1em; + font-weight: 800; + margin: 0.05em 0.1em 0 0; +} + + +/* Monospace --------------------------------- */ + +.editor-styles-wrapper code, +.editor-styles-wrapper kbd, +.editor-styles-wrapper pre, +.editor-styles-wrapper samp { + font-family: monospace; +} + +.editor-styles-wrapper kbd, +.editor-styles-wrapper pre, +.editor-styles-wrapper samp { + border-radius: 0; + font-size: 0.75em; + padding: 4px 6px; +} + +.editor-styles-wrapper pre { + border-color: #dcd7ca; + border-radius: 0; + line-height: 1.5; + padding: 1em; +} + + +/* Custom Text Sizes ------------------------- */ + +.editor-styles-wrapper p.has-large-font-size.editor-rich-text__tinymce, +.editor-styles-wrapper p.has-large-font-size.editor-rich-text__tinymce.mce-content-body, +.editor-styles-wrapper p.has-larger-font-size.editor-rich-text__tinymce, +.editor-styles-wrapper p.has-larger-font-size.editor-rich-text__tinymce.mce-content-body { + line-height: 1.4; +} + +.editor-styles-wrapper p.has-small-font-size { + font-size: 0.842em; +} + +.editor-styles-wrapper p.has-normal-font-size, +.editor-styles-wrapper p.has-regular-font-size { + font-size: 1em; +} + +.editor-styles-wrapper p.has-medium-font-size { + font-size: 1.1em; +} + +.editor-styles-wrapper p.has-large-font-size { + font-size: 1.25em; +} + +.editor-styles-wrapper p.has-larger-font-size { + font-size: 1.5em; +} + + +/* Post Media -------------------------------- */ + +.editor-styles-wrapper figure { + margin: 0; +} + +.editor-styles-wrapper .alignleft, +.editor-styles-wrapper .alignright { + margin-bottom: 1.2em; + max-width: 260px; +} + +.editor-styles-wrapper .wp-caption .alignleft, +.editor-styles-wrapper .wp-caption .alignright { + margin-bottom: 0; +} + +.editor-styles-wrapper .alignleft { + margin-right: 1em; +} + +.editor-styles-wrapper .alignright { + margin-left: 1em; +} + +.editor-styles-wrapper figcaption { + color: #6d6d6d; + font-size: 15px; + font-weight: 500; + line-height: 1.2; + margin-top: 5px; + text-align: inherit; +} + + +/* Forms ------------------------------------- */ + +.editor-styles-wrapper fieldset { + border: 2px solid #dcd7ca; + padding: 20px; +} + +.editor-styles-wrapper legend { + font-size: 0.85em; + font-weight: 700; + padding: 0 10px; +} + +.editor-styles-wrapper label { + font-size: 15px; + font-weight: 600; +} + + +/* Block: Base Margins ---------------------- */ + +/* Block: Shared Widget Styles -------------- */ + +.editor-styles-wrapper ul.wp-block-archives, +.editor-styles-wrapper ul.wp-block-categories, +.editor-styles-wrapper ul.wp-block-latest-posts, +.editor-styles-wrapper ul.wp-block-categories__list { + font-family: inherit; + list-style: none; + margin: 40px 0; + padding-left: 0; +} + +.editor-styles-wrapper ul.wp-block-categories__list ul { + margin: 0; +} + +.editor-styles-wrapper ul.wp-block-archives li, +.editor-styles-wrapper ul.wp-block-categories li, +.editor-styles-wrapper ul.wp-block-latest-posts li, +.editor-styles-wrapper ul.wp-block-categories__list li { + color: #6d6d6d; + line-height: 1.476; + margin: 5px 0 0 0; +} + +.editor-styles-wrapper ul.wp-block-archives li li, +.editor-styles-wrapper ul.wp-block-categories li li, +.editor-styles-wrapper ul.wp-block-categories__list li li, +.editor-styles-wrapper ul.wp-block-latest-posts li li { + margin-left: 20px; +} + +.editor-styles-wrapper .wp-block-archives li > a, +.editor-styles-wrapper .wp-block-categories li > a, +.editor-styles-wrapper .wp-block-latest-posts li > a { + font-weight: 700; + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-archives li > a:focus, +.editor-styles-wrapper .wp-block-archives li > a:hover, +.editor-styles-wrapper .wp-block-categories li > a:focus, +.editor-styles-wrapper .wp-block-categories li > a:hover, +.editor-styles-wrapper .wp-block-latest-posts li > a:focus, +.editor-styles-wrapper .wp-block-latest-posts li > a:hover { + font-weight: 700; + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-archives.aligncenter, +.editor-styles-wrapper .wp-block-categories.aligncenter { + text-align: center; +} + +.editor-styles-wrapper .wp-block-latest-comments time, +.editor-styles-wrapper .wp-block-latest-posts time { + color: #6d6d6d; + font-size: 0.7em; + font-weight: 600; + letter-spacing: normal; + line-height: 1.476; + margin-top: 0.15em; +} + + +/* Block: Table ------------------------------ */ + +.editor-styles-wrapper .wp-block-table { + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + font-size: 18px; + margin-bottom: 1.1em; + width: 100%; +} + +.editor-styles-wrapper .wp-block-table, +.editor-styles-wrapper .wp-block-table * { + border-color: #dcd7ca; +} + +.editor-styles-wrapper .wp-block-table tr { + border: none; +} + +.editor-styles-wrapper .wp-block-table caption { + background: #dcd7ca; + text-align: center; +} + +.editor-styles-wrapper .wp-block-table th, +.editor-styles-wrapper .wp-block-table td { + line-height: 1.4; + margin: 0; + overflow: visible; + padding: 0; +} + +.editor-styles-wrapper .wp-block-table .wp-block-table__cell-content { + padding: 0.5em; +} + +.editor-styles-wrapper .wp-block-table thead { + vertical-align: bottom; + white-space: nowrap; + text-align: inherit; +} + +.editor-styles-wrapper .wp-block-table th { + font-weight: 700; + text-align: inherit; /* Prevents the header from being centered by default*/ +} + +.editor-styles-wrapper .wp-block-table th.has-text-align-center { + text-align: center; +} + +.editor-styles-wrapper .wp-block-table th.has-text-align-right { + text-align: right; +} + +.editor-styles-wrapper .wp-block-table th.has-text-align-left { + text-align: left; +} + +/* STYLE: STRIPES */ + +.editor-styles-wrapper .wp-block-table.is-style-stripes { + border: 1px solid #dcd7ca; +} + +.editor-styles-wrapper .wp-block-table.is-style-stripes tbody tr:nth-child(odd) { + background: #dcd7ca; +} + + +/* Block: Separator -------------------------- */ + +hr.wp-block-separator { + border-top: 1px solid #6d6d6d; + color: #6d6d6d; + margin: 30px 0; +} + +hr.wp-block-separator:not(.is-style-wide):not(.is-style-dots) { + max-width: 100%; +} + +hr.wp-block-separator:not(.is-style-dots) { + background: linear-gradient(to left, currentColor calc(50% - 16px), transparent calc(50% - 16px), transparent calc(50% + 16px), currentColor calc(50% + 16px)); + background-color: transparent !important; + border: none; + height: 1px; + overflow: visible; + position: relative; +} + +.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots) { + height: 1px; +} + +hr.wp-block-separator:not(.is-style-dots)::before, +hr.wp-block-separator:not(.is-style-dots)::after { + background: currentColor; + content: ""; + display: block; + height: 16px; + position: absolute; + top: calc(50% - 8px); + transform: rotate(22.5deg); + width: 1px; +} + +hr.wp-block-separator::before { + left: calc(50% - 5px); +} + +hr.wp-block-separator::after { + right: calc(50% - 5px); +} + +/* STYLE: DOTS */ + +hr.wp-block-separator.is-style-dots::before { + font-size: 32px; + font-weight: 700; + letter-spacing: 1em; + padding-left: 1em; +} + + +/* Block: Quote ------------------------------ */ + +.editor-styles-wrapper blockquote { + margin: 0; +} + +.editor-styles-wrapper .wp-block-quote { + border-color: #cd2653; + border-style: solid; + border-width: 0 0 0 2px; + margin: 20px 0; + padding: 5px 0 5px 20px; +} + +.editor-styles-wrapper .wp-block-quote.has-text-align-center, +.editor-styles-wrapper .wp-block-quote[style*="text-align:center"], +.editor-styles-wrapper .wp-block-quote[style*="text-align: center"] { + border-width: 0; + padding: 5px 0; +} + +.editor-styles-wrapper .wp-block-quote.has-text-align-right, +.editor-styles-wrapper .wp-block-quote[style*="text-align:right"], +.editor-styles-wrapper .wp-block-quote[style*="text-align: right"] { + border-width: 0 2px 0 0; + padding: 5px 20px 5px 0; +} + +.editor-styles-wrapper cite, +.editor-styles-wrapper .wp-block-quote__citation, +.editor-styles-wrapper .wp-block-quote cite, +.editor-styles-wrapper .wp-block-quote footer { + color: #6d6d6d; + font-size: 14px; + font-weight: 600; + line-height: 1.25; +} + +.editor-styles-wrapper .wp-block-quote p { + color: inherit; + font-weight: 400; + margin: 0 0 20px 0; +} + +.editor-styles-wrapper .wp-block-quote.is-style-large { + border: none; + padding: 0; +} + +.editor-styles-wrapper .wp-block-quote.is-style-large p { + font-family: inherit; + font-size: 24px; + font-style: normal; + font-weight: 700; + letter-spacing: -0.035714286em; + line-height: 1.285714286; +} + +.editor-styles-wrapper .wp-block-quote.is-style-large .wp-block-quote__citation, +.editor-styles-wrapper .wp-block-quote.is-style-large cite, +.editor-styles-wrapper .wp-block-quote.is-style-large footer { + font-size: 16px; +} + + +/* Block: Code, Verse and Preformatted ------- */ + +.editor-styles-wrapper .wp-block-code { + color: inherit; +} + +.editor-styles-wrapper .wp-block-code, +.editor-styles-wrapper .wp-block-preformatted pre, +.editor-styles-wrapper .wp-block-verse pre { + border: 1px solid #dcd7ca; + border-radius: 0; + padding: 30px; +} + +.editor-styles-wrapper .wp-block-freeform.block-library-rich-text__tinymce pre, +.editor-styles-wrapper .wp-block-preformatted pre, +.editor-styles-wrapper .wp-block-code .block-editor-plain-text, +.editor-styles-wrapper .wp-block-verse pre { + background: transparent; + color: inherit; + font-family: monospace; + font-size: 14px; +} + +/* Block: Cover ------------------------------ */ + +.editor-styles-wrapper .wp-block-cover-image .wp-block-cover__inner-container, +.editor-styles-wrapper .wp-block-cover .wp-block-cover__inner-container { + margin: 0 auto; + width: calc(100% - 40px); +} + +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"], +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] { + height: auto; + max-height: none; +} + +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] .wp-block-cover { + text-align: left; +} + +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"] .wp-block-cover { + text-align: right; +} + +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"] .block-editor-block-list__block-edit, +.editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] .block-editor-block-list__block-edit { + float: none; + margin-left: 0; + margin-right: 0; + max-width: 100%; +} + +.wp-block-cover-image .wp-block-cover-image-text, +.wp-block-cover-image .wp-block-cover-text, +.wp-block-cover-image h2, +.wp-block-cover .wp-block-cover-image-text, +.wp-block-cover .wp-block-cover-text, +.wp-block-cover h2 { + max-width: 100%; +} + +.editor-styles-wrapper .wp-block-cover a { + color: inherit; +} + +/* Block: Shared Media Styles ---------------- */ + +.wp-block[data-type*="core-embed"][data-align="full"] figcaption, +.wp-block[data-type="core/image"][data-align="full"] figcaption, +.wp-block[data-type="core/gallery"][data-align="full"] .blocks-gallery-caption { + padding: 0 14px; +} + +/* Block: Paragraph -------------------------- */ + +/* Block: Pullquote -------------------------- */ + +.editor-styles-wrapper .wp-block-pullquote { + border: none; + color: inherit; + padding: 0; + position: relative; + text-align: center; +} + +.editor-styles-wrapper .wp-block-pullquote::before { + background: #fff; + border-radius: 50%; + color: #cd2653; + content: "”"; + display: block; + font-size: 62px; + font-weight: 500; + line-height: 1.2; + margin: 0 auto 15px auto; + text-align: center; + height: 44px; + width: 44px; +} + +.editor-styles-wrapper .wp-block .wp-block-pullquote p { + font-family: inherit; + font-size: 28px; + font-weight: 700; + line-height: 1.178571429; + letter-spacing: -0.041785714em; + margin-bottom: 20px; +} + +.editor-styles-wrapper .wp-block .wp-block-pullquote p:last-child { + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block .wp-block-pullquote p, +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote > .block-editor-rich-text p, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .editor-rich-text p, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .editor-rich-text p { + font-size: 28px; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"], +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] { + height: auto; + max-height: none; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote.is-style-solid-color blockquote { + text-align: left; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote.is-style-solid-color blockquote { + text-align: right; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .block-editor-block-list__block-edit, +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .block-editor-block-list__block-edit { + float: none; + margin-left: 0; + margin-right: 0; + max-width: 100%; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .block-editor-block-list__block-edit .wp-block-pullquote::before { + margin-right: 0; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .block-editor-block-list__block-edit .wp-block-pullquote::before { + margin-left: 0; +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .is-style-solid-color::before { + right: 20px; + transform: translateY(-50%); +} + +.editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .is-style-solid-color::before { + left: 20px; + transform: translateY(-50%); +} + +.editor-styles-wrapper .wp-block-pullquote__citation, +.editor-styles-wrapper .wp-block-pullquote cite, +.editor-styles-wrapper .wp-block-pullquote footer { + color: #6d6d6d; + font-size: 16px; + font-weight: 500; + margin-top: 12px; + text-transform: none; +} + +/* STYLE: SOLID COLOR */ + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color { + padding: 30px 20px; + position: relative; +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color::before { + position: absolute; + top: 0; + left: 50%; + transform: translateY(-50%) translateX(-50%); +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote { + max-width: 100%; + text-align: center; +} + +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation, +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color .wp-block-pullquote cite, +.editor-styles-wrapper .wp-block-pullquote.is-style-solid-color .wp-block-pullquote footer { + color: inherit; +} + + +/* Block: Verse ------------------------------ */ + +.editor-styles-wrapper .wp-block-verse pre, +.editor-styles-wrapper pre.wp-block-verse { + font-size: 0.75em; +} + + +/* Block: Button ----------------------------- */ + +.editor-styles-wrapper .wp-block-button__link, +.editor-styles-wrapper .wp-block-file__button { + background: #cd2653; + border-radius: 0; + color: #fff; + font-size: 15px; + font-weight: 600; + letter-spacing: 0.0333em; + line-height: 1.25; + padding: 1.1em 1.44em; + text-transform: uppercase; +} + +.editor-styles-wrapper .wp-block-button .wp-block-button__link.mce-content-body { + line-height: 1.1; +} + +/* BUTTON STYLE: OUTLINE */ + +.editor-styles-wrapper .is-style-outline .wp-block-button__link { + background: none; + border-color: currentColor; + color: #cd2653; + padding: calc(1.1em - 2px) calc(1.44em - 2px); +} + +/* BUTTON STYLE: SQUARED */ + +.editor-styles-wrapper .is-style-squared .wp-block-button__link { + border-radius: 0; +} + + +/* Block: Latest Comments -------------------- */ + +.editor-styles-wrapper .wp-block-latest-comments { + font-family: inherit; + margin-left: 0; +} + +.editor-styles-wrapper .wp-block-latest-comments li.wp-block-latest-comments__comment { + font-size: inherit; + margin-bottom: 20px; +} + +.editor-styles-wrapper .wp-block-latest-comments li.wp-block-latest-comments__comment:last-child { + margin-bottom: 0; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-meta, +.editor-styles-wrapper .wp-block-latest-comments__comment-excerpt { + margin-left: 0 !important; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-meta { + font-weight: 700; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-meta a { + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-meta a:focus, +.editor-styles-wrapper .wp-block-latest-comments__comment-meta a:hover { + text-decoration: none; +} + +/* HAS AVATAR */ + +.editor-styles-wrapper .wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment { + display: flex; +} + +.editor-styles-wrapper .wp-block-latest-comments.has-avatars img.avatar { + flex-shrink: 0; + margin: 5px 15px 0 0; +} + +/* HAS EXCERPT */ + +.editor-styles-wrapper .wp-block-latest-comments__comment-excerpt { + margin: 0; +} + +.editor-styles-wrapper .wp-block-latest-comments__comment-excerpt p { + font-family: inherit; + font-size: 0.7em; + margin: 10px 0 0; +} + + +/* Block: Latest Posts ----------------------- */ + +.editor-styles-wrapper ul.wp-block-latest-posts:not(.is-grid) li { + margin-top: 15px; +} + +/* STYLE: GRID */ + +.editor-styles-wrapper .wp-block-latest-posts.is-grid li { + border-color: #dcd7ca; +} + +.editor-styles-wrapper ul.wp-block-latest-posts.is-grid li { + border-style: solid; + border-width: 2px 0 0; + line-height: 1.25; + margin: 20px 16px 16px 0; + padding-top: 12px; +} + +.editor-styles-wrapper .wp-block-latest-posts__post-excerpt { + font-size: 0.95em; + line-height: 1.4; + margin-top: 15px; +} + +/* Block: Shortcode -------------------------- */ + +.editor-styles-wrapper .wp-block-shortcode textarea { + color: #191e23; +} + +/* Block: Embed ------------------------------ */ + +.editor-styles-wrapper .wp-block-embed { + margin-bottom: 30px; + margin-top: 30px; +} + +.editor-styles-wrapper .wp-block[data-type*="core-embed"][data-align="center"] * { + margin-left: auto; + margin-right: auto; +} + +/* Block: File ------------------------------- */ + +.editor-styles-wrapper .wp-block-file { + background: none; + padding: 0; +} + +.editor-styles-wrapper .wp-block-file__content-wrapper { + align-items: center; + display: flex; + justify-content: space-between; +} + +.editor-styles-wrapper .wp-block-file .wp-block-file__textlink { + color: #cd2653; + font-weight: 700; + text-decoration: none; +} + +.editor-styles-wrapper .wp-block-file .wp-block-file__textlink:focus, +.editor-styles-wrapper .wp-block-file .wp-block-file__textlink:hover { + text-decoration: underline; +} + +.editor-styles-wrapper .wp-block-file .wp-block-file__button { + font-size: 14px; + padding: 1em 1.25em; +} + +/* Block: Image ------------------------------ */ + +.editor-styles-wrapper .wp-block-image { + margin-bottom: 30px; + margin-top: 30px; +} + +.editor-styles-wrapper .wp-block-image.is-resized { + margin-left: auto; + margin-right: auto; +} + +/* Block: Group ------------------------------ */ + +.editor-styles-wrapper .wp-block-group.has-background { + padding: 20px; +} + +.wp-block-group .wp-block[data-type="core/heading"]:first-child * { + margin-top: 0; +} + +.wp-block[data-type="core/group"] > .editor-block-list__block-edit > div > .wp-block-group.has-background > .wp-block-group__inner-container > .editor-inner-blocks > .editor-block-list__layout > .wp-block[data-align="full"], +.wp-block[data-type="core/group"][data-align="full"] > .editor-block-list__block-edit > div > .wp-block-group.has-background > .wp-block-group__inner-container > .editor-inner-blocks > .editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: 0; + width: 100%; +} + +/* Block: Paragraph -------------------------- */ + + +/* X. Media Queries +/* ------------------------------------------- */ + + +@media ( min-width: 480px ) { + + + /* STRUCTURE */ + + .editor-styles-wrapper .wp-block[data-align="right"] { + margin-right: 0; + } + + .editor-styles-wrapper .wp-block[data-align="left"] { + margin: 0; + } + + /* BLOCK: COVER */ + + .wp-block[data-type="core/cover"][data-align="left"] [data-block], + .wp-block[data-type="core/cover"][data-align="right"] [data-block] { + margin-top: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"] .block-editor-block-list__block-edit { + float: right; + margin-left: 20px; + max-width: 260px; + } + + .editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] .block-editor-block-list__block-edit { + float: left; + margin-right: 20px; + max-width: 260px; + } + + .editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="right"] .wp-block-pullquote::before { + margin-right: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/cover"][data-align="left"] .wp-block-pullquote::before { + margin-left: 0; + } + + /* BLOCK: PULL QUOTE */ + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"], + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] { + height: 0; + max-width: 260px; + } + + .wp-block[data-type="core/pullquote"][data-align="left"] [data-block], + .wp-block[data-type="core/pullquote"][data-align="right"] [data-block] { + margin-top: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .block-editor-block-list__block-edit { + float: right; + margin-left: 20px; + max-width: 260px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .block-editor-block-list__block-edit { + float: left; + margin-right: 20px; + max-width: 260px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .wp-block-pullquote::before { + margin-right: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .wp-block-pullquote::before { + margin-left: 0; + } + + +} + +@media ( min-width: 600px ) { + + + /* BLOCK: SHARED MEDIA STYLES */ + + .wp-block[data-type*="core-embed"][data-align="full"] figcaption, + .wp-block[data-type="core/image"][data-align="full"] figcaption, + .wp-block[data-type="core/gallery"][data-align="full"] .blocks-gallery-caption { + padding: 0 45px; + } + + /* BLOCK: COLUMNS */ + + .editor-styles-wrapper .wp-block[data-type="core/column"] h1, + .editor-styles-wrapper .wp-block[data-type="core/column"] h2, + .editor-styles-wrapper .wp-block[data-type="core/column"] h3, + .editor-styles-wrapper .wp-block[data-type="core/column"] h4, + .editor-styles-wrapper .wp-block[data-type="core/column"] h5, + .editor-styles-wrapper .wp-block[data-type="core/column"] h6 { + margin: 35px 0 20px 0; + } + + /* BLOCK: PULLQUOTE */ + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .block-editor-block-list__block-edit { + margin-right: -30px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .block-editor-block-list__block-edit { + margin-left: -30px; + } + + +} + +@media ( min-width: 700px ) { + + /* STRUCTURE */ + + .editor-styles-wrapper > * { + font-size: 21px; + } + + /* TYPOGRAPHY */ + + .editor-post-title__block .editor-post-title__input, + .editor-styles-wrapper .wp-block h1 { + font-size: 64px; + } + + .editor-styles-wrapper .wp-block h2 { + font-size: 48px; + } + + .editor-styles-wrapper .wp-block h3 { + font-size: 40px; + } + + .editor-styles-wrapper .wp-block h4 { + font-size: 32px; + } + + .editor-styles-wrapper .wp-block h5 { + font-size: 24px; + } + + .editor-styles-wrapper li, + .editor-styles-wrapper p, + .editor-styles-wrapper p.wp-block-paragraph { + line-height: 1.476; + } + + /* FORMS */ + + .editor-styles-wrapper fieldset { + padding: 30px; + } + + .editor-styles-wrapper legend { + padding: 0 15px; + } + + /* BLOCK: BASE MARGINS */ + + /* BLOCK: BUTTON */ + + .editor-styles-wrapper .wp-block-button__link, + .editor-styles-wrapper .wp-block-file__button { + font-size: 17px; + } + + /* BLOCK: CODE */ + + .editor-styles-wrapper .wp-block-preformatted pre, + .editor-styles-wrapper .wp-block-code .block-editor-plain-text, + .editor-styles-wrapper .wp-block-verse pre { + font-size: 16px; + } + + /* BLOCK: COLUMNS */ + + .wp-block-column { + font-size: 16px; + } + + /* BLOCK: COVER */ + + .editor-styles-wrapper .wp-block-cover-image .wp-block-cover__inner-container, + .editor-styles-wrapper .wp-block-cover .wp-block-cover__inner-container { + width: calc(100% - 80px); + } + + /* BLOCK: GROUP */ + + .editor-styles-wrapper .wp-block:not([data-align="wide"]):not([data-align="full"]) div:not([class*="__inner-container"]) .wp-block-group.has-background, + .editor-styles-wrapper .wp-block div[class*="__inner-container"] .wp-block[data-align="wide"] .wp-block-group.has-background, + .editor-styles-wrapper .wp-block div[class*="__inner-container"] .wp-block[data-align="full"] .wp-block-group.has-background { + padding: 40px; + } + + .editor-styles-wrapper .wp-block[data-align="wide"] .wp-block-group.has-background, + .editor-styles-wrapper .wp-block[data-align="full"] .wp-block-group.has-background { + padding: 80px; + } + + /* BLOCK: LATEST POSTS */ + + /* BLOCK: PULLQUOTE */ + + .editor-styles-wrapper .wp-block .wp-block-pullquote p, + .editor-styles-wrapper .wp-block-pullquote.is-style-solid-color blockquote > .block-editor-rich-text p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .editor-rich-text p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .editor-rich-text p { + font-size: 32px; + } + + .editor-styles-wrapper .wp-block-pullquote__citation, + .editor-styles-wrapper .wp-block-pullquote cite, + .editor-styles-wrapper .wp-block-pullquote footer { + margin-top: 20px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] .wp-block-pullquote::before, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote::before { + font-size: 113px; + height: 80px; + margin-bottom: 20px; + width: 80px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] .wp-block-pullquote.is-style-solid-color, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote.is-style-solid-color { + padding: 60px 40px 40px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote:not(.is-style-solid-color) { + padding-left: 10px; + padding-right: 10px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] blockquote p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] blockquote p { + font-size: 48px; + line-height: 1.203125; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] p { + font-size: 32px; + line-height: 1.1875; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .is-style-solid-color p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .is-style-solid-color p { + font-size: 26px; + } + + /* BLOCK: TABLE */ + + .editor-styles-wrapper table.wp-block-table { + font-size: 18px; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator { + margin-bottom: 60px; + margin-top: 60px; + } + +} + + +@media ( min-width: 1000px ) { + + + /* BLOCK: COLUMNS */ + + .wp-block-column { + font-size: 18px; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator { + margin-bottom: 80px; + margin-top: 80px; + } + + hr.wp-block-separator.is-style-wide { + margin-left: -70px; + margin-right: -70px; + } + + +} + + +@media ( min-width: 1220px ) { + + + /* TYPOGRAPHY */ + + .editor-post-title__block .editor-post-title__input, + .editor-styles-wrapper .wp-block h1 { + font-size: 84px; + } + + .editor-styles-wrapper .wp-block h6 { + font-size: 18px; + } + + /* BLOCK: PULLQUOTE */ + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] .wp-block-pullquote.is-style-solid-color, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] .wp-block-pullquote.is-style-solid-color { + padding: 90px 40px 80px; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="wide"] blockquote p, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="full"] blockquote p { + font-size: 64px; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator.is-style-wide { + margin-left: -150px; + margin-right: -150px; + } + +} + + +@media ( min-width: 1360px ) { + + + /* STRUCTURE */ + + .editor-styles-wrapper .wp-block[data-align="left"], + .editor-styles-wrapper .wp-block[data-align="right"] { + margin: 0 auto; + max-width: 1220px; + } + + + /* BLOCK: PULLQUOTE */ + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"] .is-style-solid-color::before, + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] .is-style-solid-color::before { + top: 0; + } + + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="left"], + .editor-styles-wrapper .wp-block[data-type="core/pullquote"][data-align="right"] { + margin: 0 auto; + max-width: 1220px; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator.is-style-wide { + margin-left: -200px; + margin-right: -200px; + } + + +} diff --git a/content/themes/twentytwenty/assets/css/editor-style-classic-rtl.css b/content/themes/twentytwenty/assets/css/editor-style-classic-rtl.css new file mode 100644 index 0000000..9eaf83f --- /dev/null +++ b/content/themes/twentytwenty/assets/css/editor-style-classic-rtl.css @@ -0,0 +1,600 @@ +/* -------------------------------------------------------------------------- */ + +/* Twenty Twenty Editor Styles — Classic Editor +/* -------------------------------------------------------------------------- */ + + +/* Fonts ------------------------------------- */ + +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the classic editor and + * block editor. The following font-face override fixes the issue by manually + * inserting a custom font that includes just a Hoefler Text space replacement + * for that character instead. + */ +@font-face { + font-family: NonBreakingSpaceOverride; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* ---------------------------------------------- +Inter variable font. Usage: + +@supports (font-variation-settings: normal) { + html { font-family: "Inter var", sans-serif; } +} +---------------------------------------------- */ + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: normal; + src: url(../fonts/inter/Inter-upright-var.woff2) format("woff2"); +} + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: italic; + src: url(../fonts/inter/Inter-italic-var.woff2) format("woff2"); +} + +/* Structure --------------------------------- */ + +body#tinymce.wp-editor.content { /* stylelint-disable-line no-duplicate-selectors */ + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + body#tinymce.wp-editor.content { /* stylelint-disable-line no-duplicate-selectors */ + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } + +} + +body#tinymce.wp-editor.content { /* stylelint-disable-line no-duplicate-selectors */ + background: #f5efe0; + color: #000; + font-size: 21px; + letter-spacing: -0.015em; + margin: 0 auto; + max-width: calc(100% - 40px); + width: 580px; +} + +body#tinymce.wp-editor.content * { + box-sizing: border-box; + -webkit-font-smoothing: antialiased; +} + +body#tinymce.wp-editor.content p, +body#tinymce.wp-editor.content ol, +body#tinymce.wp-editor.content ul, +body#tinymce.wp-editor.content dl, +body#tinymce.wp-editor.content dt { + font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif; + letter-spacing: normal; +} + +body#tinymce.wp-editor.content p, +body#tinymce.wp-editor.content ul, +body#tinymce.wp-editor.content ol, +body#tinymce.wp-editor.content blockquote { + line-height: 1.5; + margin-bottom: 1.5em; +} + +body#tinymce.wp-editor.content code, +body#tinymce.wp-editor.content kbd, +body#tinymce.wp-editor.content samp { + background: rgba(0, 0, 0, 0.075); +} + +body#tinymce.wp-editor.content code, +body#tinymce.wp-editor.content kbd, +body#tinymce.wp-editor.content pre, +body#tinymce.wp-editor.content samp { + font-family: monospace; + color: inherit; + font-size: 15px; +} + +body#tinymce.wp-editor.content pre { + border: 1px solid #dcd7ca; + line-height: 1.5; + margin: 40px 0; + overflow: auto; + padding: 30px; + text-align: right; +} + +body#tinymce.wp-editor.content a, +body#tinymce.wp-editor.content a:focus, +body#tinymce.wp-editor.content a:hover { + color: #cd2653; + text-decoration: underline; +} + +body#tinymce.wp-editor.content img { + height: auto; + max-width: 100%; +} + +body#tinymce.wp-editor.content img[data-wp-more] { + height: 16px; +} + +body#tinymce.wp-editor.content hr { + border: none; + border-top: 1px solid #dcd7ca; + margin: 2em auto; + width: 100%; +} + +body#tinymce.wp-editor.content hr:not(.is-style-dots) { + background: linear-gradient(to right, currentColor calc(50% - 16px), transparent calc(50% - 16px), transparent calc(50% + 16px), currentColor calc(50% + 16px)); + border: none; + color: #6d6d6d; + height: 1px; + margin: 80px 0; + overflow: visible; + position: relative; +} + +body#tinymce.wp-editor.content hr:not(.is-style-dots)::before, +body#tinymce.wp-editor.content hr:not(.is-style-dots)::after { + background: currentColor; + content: ""; + display: block; + height: 16px; + position: absolute; + top: calc(50% - 8px); + transform: rotate(-22.5deg); + width: 1px; +} + +body#tinymce.wp-editor.content hr::before { + right: calc(50% - 5px); +} + +body#tinymce.wp-editor.content hr::after { + left: calc(50% - 5px); +} + +body#tinymce.wp-editor.content dt { + font-weight: 600; +} + +body#tinymce.wp-editor.content dd { + line-height: 1.5; +} + +body#tinymce.wp-editor.content dd + dt { + margin-top: 1.5rem; +} + + +/* Font Families ----------------------------- */ + +body#tinymce.wp-editor.content figcaption, +body#tinymce.wp-editor.content .wp-caption-text, +body#tinymce.wp-editor.content .wp-caption-dd, +body#tinymce.wp-editor.content cite, +body#tinymce.wp-editor.content table { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + line-height: 1; +} + +@supports ( font-variation-settings: normal ) { + + body#tinymce.wp-editor.content figcaption, + body#tinymce.wp-editor.content .wp-caption-text, + body#tinymce.wp-editor.content .wp-caption-dd, + body#tinymce.wp-editor.content cite, + body#tinymce.wp-editor.content table { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + + +/* Titles ------------------------------------ */ + +body#tinymce.wp-editor.content h1, +body#tinymce.wp-editor.content h2, +body#tinymce.wp-editor.content h3, +body#tinymce.wp-editor.content h4, +body#tinymce.wp-editor.content h5, +body#tinymce.wp-editor.content h6 { + font-feature-settings: "lnum"; + font-variant-numeric: lining-nums; + font-weight: 700; + letter-spacing: -0.0415625em; + line-height: 1.25; + margin: 40px 0 25px; +} + +body#tinymce.wp-editor.content h1 { + font-size: 84px; + font-weight: 800; + line-height: 1.138888889; +} + +body#tinymce.wp-editor.content h2 { + font-size: 48px; +} + +body#tinymce.wp-editor.content h3 { + font-size: 40px; +} + +body#tinymce.wp-editor.content h4 { + font-size: 32px; +} + +body#tinymce.wp-editor.content h5 { + font-size: 24px; +} + +body#tinymce.wp-editor.content h6 { + font-size: 18px; + letter-spacing: 0.03125em; + text-transform: uppercase; +} + +/* Blockquote -------------------------------- */ + +body#tinymce.wp-editor.content blockquote { + border: none; + border-right: 2px solid #cd2653; + margin: 0 0 1.6em 0; + padding: 0.25em 1em 0.25em 0; +} + +body#tinymce.wp-editor.content blockquote p { + font-style: normal; + font-weight: 400; + margin: 0; +} + +body#tinymce.wp-editor.content cite { + color: #6d6d6d; + font-size: 16px; + font-weight: 500; + font-style: normal; +} + +body#tinymce.wp-editor.content blockquote cite { + display: block; + margin-top: 20px; +} + + +/* Lists ------------------------------------- */ + +body#tinymce.wp-editor.content ul { + margin-right: 1.5em; + padding-right: 0; + list-style: disc; +} + +body#tinymce.wp-editor.content ol { + margin-right: 1.5em; + padding-right: 0; + list-style: square; +} + +body#tinymce.wp-editor.content ul ul { + list-style: circle; +} + +body#tinymce.wp-editor.content ul ul ul { + list-style: square; +} + +body#tinymce.wp-editor.content ol ol { + list-style: lower-alpha; +} + +body#tinymce.wp-editor.content ol ol ol { + list-style: lower-roman; +} + +body#tinymce.wp-editor.content ul ul, +body#tinymce.wp-editor.content ul ol, +body#tinymce.wp-editor.content ol ul, +body#tinymce.wp-editor.content ol ol { + margin-bottom: 0; +} + +body#tinymce.wp-editor.content li { + line-height: 1.5; + margin-bottom: 0.5em; +} + +body#tinymce.wp-editor.content ol > li:last-child, +body#tinymce.wp-editor.content ul > li:last-child { + margin-bottom: 0; +} + +body#tinymce.wp-editor.content ol > li:first-child, +body#tinymce.wp-editor.content ul > li:first-child { + margin-top: 0.5em; +} + + +/* Post Media -------------------------------- */ + +body#tinymce.wp-editor.content figure, +body#tinymce.wp-editor.content video { + display: block; + margin: 0; +} + +body#tinymce.wp-editor.content .wp-caption { + margin-bottom: 1.5em; +} + +body#tinymce.wp-editor.content img.alignleft, +body#tinymce.wp-editor.content .alignleft img, +body#tinymce.wp-editor.content img.aligncenter, +body#tinymce.wp-editor.content .aligncenter img, +body#tinymce.wp-editor.content img.alignright, +body#tinymce.wp-editor.content .alignright img, +body#tinymce.wp-editor.content img.alignnone, +body#tinymce.wp-editor.content .alignnone img { + display: block; +} + +body#tinymce.wp-editor.content .aligncenter, +body#tinymce.wp-editor.content .alignnone, +body#tinymce.wp-editor.content .alignwide, +body#tinymce.wp-editor.content .alignfull { + margin: 50px auto; +} + +body#tinymce.wp-editor.content .alignleft, +body#tinymce.wp-editor.content .alignright { + margin-bottom: 25px; + max-width: 50%; +} + +body#tinymce.wp-editor.content .wp-caption img { + display: block; +} + +body#tinymce.wp-editor.content .wp-caption .alignleft, +body#tinymce.wp-editor.content .wp-caption .alignright { + margin-bottom: 0; +} + +body#tinymce.wp-editor.content .alignleft { + float: left; + margin-left: 25px; + max-width: 260px; +} + +body#tinymce.wp-editor.content .alignright { + float: right; + margin-right: 25px; + max-width: 260px; +} + +body#tinymce.wp-editor.content .wpview[data-wpview-type="gallery"] + .wpview[data-wpview-type="gallery"] { + margin-top: -34px; +} + +body#tinymce.wp-editor.content figcaption, +body#tinymce.wp-editor.content .wp-caption-text, +body#tinymce.wp-editor.content .wp-caption-dd, +body#tinymce.wp-editor.content .gallery-caption { + color: #6d6d6d; + display: block; + font-size: 15px; + font-weight: 500; + line-height: 1.2; + margin: 18px 0 0; +} + +body#tinymce.wp-editor.content figcaption a, +body#tinymce.wp-editor.content .wp-caption-text a, +body#tinymce.wp-editor.content .wp-caption-dd a, +body#tinymce.wp-editor.content .gallery-caption a { + color: inherit; +} + + +/* Tables ------------------------------------ */ + +body#tinymce.wp-editor.content table { + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + font-size: 18px; + width: 100%; +} + +body#tinymce.wp-editor.content th, +body#tinymce.wp-editor.content td { + line-height: 1.2; + margin: 0; + overflow: visible; + padding: 0.5em; +} + +body#tinymce.wp-editor.content caption { + text-align: center; + padding: 0.5em; +} + +body#tinymce.wp-editor.content thead { + vertical-align: bottom; + white-space: nowrap; +} + +body#tinymce.wp-editor.content th { + text-align: right; +} + + +/* Forms ------------------------------------- */ + +body#tinymce.wp-editor.content fieldset { + border: 2px solid #dcd7ca; + padding: 30px; +} + +body#tinymce.wp-editor.content fieldset legend { + font-size: 0.85em; + font-weight: 700; + padding: 0 15px; +} + +body#tinymce.wp-editor.content label { + display: block; + font-size: 15px; + font-weight: 600; + margin: 0 0 5px 0; +} + +body#tinymce.wp-editor.content input, +body#tinymce.wp-editor.content textarea { + border-color: #dcd7ca; + color: inherit; + font-family: inherit; + font-size: inherit; +} + +body#tinymce.wp-editor.content input[type="text"], +body#tinymce.wp-editor.content input[type="password"], +body#tinymce.wp-editor.content input[type="email"], +body#tinymce.wp-editor.content input[type="url"], +body#tinymce.wp-editor.content input[type="date"], +body#tinymce.wp-editor.content input[type="month"], +body#tinymce.wp-editor.content input[type="time"], +body#tinymce.wp-editor.content input[type="datetime"], +body#tinymce.wp-editor.content input[type="datetime-local"], +body#tinymce.wp-editor.content input[type="week"], +body#tinymce.wp-editor.content input[type="number"], +body#tinymce.wp-editor.content input[type="search"], +body#tinymce.wp-editor.content input[type="tel"], +body#tinymce.wp-editor.content input[type="color"], +body#tinymce.wp-editor.content textarea { + -webkit-appearance: none; + -moz-appearance: none; + background: transparent; + border-radius: 3px; + border-style: solid; + border-width: 0.1rem; + box-shadow: none; + display: block; + font-size: inherit; + font-weight: 400; + margin: 0; + max-width: 100%; + padding: 13.5px 18px; + width: 100%; + word-break: normal; +} + +body#tinymce.wp-editor.content textarea { + height: 200px; + line-height: 1.5; + width: 100%; +} + +body#tinymce.wp-editor.content button, +body#tinymce.wp-editor.content .faux-button, +body#tinymce.wp-editor.content .wp-block-button__link, +body#tinymce.wp-editor.content .wp-block-file__button, +body#tinymce.wp-editor.content input[type="button"], +body#tinymce.wp-editor.content input[type="reset"], +body#tinymce.wp-editor.content input[type="submit"] { + -webkit-appearance: none; + -moz-appearance: none; + background: #cd2653; + border: none; + border-radius: 0; + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 17px; + font-weight: 600; + letter-spacing: 0.0333em; + line-height: 1.25; + margin: 0; + padding: 1.1em 1.44em; + text-align: center; + text-decoration: none; + text-transform: uppercase; +} + +body#tinymce.wp-editor.content button:focus, +body#tinymce.wp-editor.content button:hover, +body#tinymce.wp-editor.content .faux-button:hover, +body#tinymce.wp-editor.content .faux-button:focus, +body#tinymce.wp-editor.content .wp-block-button__link:focus, +body#tinymce.wp-editor.content .wp-block-button__link:hover, +body#tinymce.wp-editor.content .wp-block-file__button:focus, +body#tinymce.wp-editor.content .wp-block-file__button:hover, +body#tinymce.wp-editor.content input[type="button"]:focus, +body#tinymce.wp-editor.content input[type="button"]:hover, +body#tinymce.wp-editor.content input[type="reset"]:focus, +body#tinymce.wp-editor.content input[type="reset"]:hover, +body#tinymce.wp-editor.content input[type="submit"]:focus, +body#tinymce.wp-editor.content input[type="submit"]:hover { + color: #fff; + text-decoration: underline; +} + +.wp-block-button:not(.alignleft):not(.alignright) { + margin-bottom: 30px; + margin-top: 30px; +} + +/* BUTTON ALIGN: CENTER */ + +.wp-block-button.aligncenter { + text-align: center; +} + +/* BUTTON STYLE: OUTLINE */ + +body#tinymce.wp-editor.content .is-style-outline .wp-block-button__link, +body#tinymce.wp-editor.content .is-style-outline .wp-block-button__link:focus, +body#tinymce.wp-editor.content .is-style-outline .wp-block-button__link:hover { + color: #cd2653; +} + +body#tinymce.wp-editor.content .is-style-outline .wp-block-button__link { + background: none; + border: 2px solid currentColor; + padding: calc(1.1em - 2px) calc(1.44em - 2px); +} + +/* BUTTON STYLE: SQUARED */ + +body#tinymce.wp-editor.content .is-style-squared .wp-block-button__link { + border-radius: 0; +} + + +/* Blocks ------------------------------------ */ + +/* BLOCK: HELPER CLASSES */ + +body#tinymce.wp-editor.content .has-background { + padding: 20px; +} + +/* BLOCK: GALLERY */ + +body#tinymce.wp-editor.content ul.wp-block-gallery { + list-style: none; + margin-right: 0; +} + +body#tinymce.wp-editor.content ul.wp-block-gallery li { + margin-right: 0; +} diff --git a/content/themes/twentytwenty/assets/css/editor-style-classic.css b/content/themes/twentytwenty/assets/css/editor-style-classic.css new file mode 100644 index 0000000..564da9c --- /dev/null +++ b/content/themes/twentytwenty/assets/css/editor-style-classic.css @@ -0,0 +1,604 @@ +/* -------------------------------------------------------------------------- */ + +/* Twenty Twenty Editor Styles — Classic Editor +/* -------------------------------------------------------------------------- */ + + +/* Fonts ------------------------------------- */ + +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the classic editor and + * block editor. The following font-face override fixes the issue by manually + * inserting a custom font that includes just a Hoefler Text space replacement + * for that character instead. + */ +@font-face { + font-family: NonBreakingSpaceOverride; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* ---------------------------------------------- +Inter variable font. Usage: + +@supports (font-variation-settings: normal) { + html { font-family: "Inter var", sans-serif; } +} +---------------------------------------------- */ + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: normal; + src: url(../fonts/inter/Inter-upright-var.woff2) format("woff2"); +} + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: italic; + src: url(../fonts/inter/Inter-italic-var.woff2) format("woff2"); +} + +/* Structure --------------------------------- */ + +body#tinymce.wp-editor.content { /* stylelint-disable-line no-duplicate-selectors */ + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + body#tinymce.wp-editor.content { /* stylelint-disable-line no-duplicate-selectors */ + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } + +} + +body#tinymce.wp-editor.content { /* stylelint-disable-line no-duplicate-selectors */ + background: #f5efe0; + color: #000; + font-size: 21px; + letter-spacing: -0.015em; + margin: 0 auto; + max-width: calc(100% - 40px); + width: 580px; +} + +body#tinymce.wp-editor.content * { + box-sizing: border-box; + -webkit-font-smoothing: antialiased; +} + +body#tinymce.wp-editor.content p, +body#tinymce.wp-editor.content ol, +body#tinymce.wp-editor.content ul, +body#tinymce.wp-editor.content dl, +body#tinymce.wp-editor.content dt { + font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif; + letter-spacing: normal; +} + +body#tinymce.wp-editor.content p, +body#tinymce.wp-editor.content ul, +body#tinymce.wp-editor.content ol, +body#tinymce.wp-editor.content blockquote { + line-height: 1.5; + margin-bottom: 1.5em; +} + +body#tinymce.wp-editor.content code, +body#tinymce.wp-editor.content kbd, +body#tinymce.wp-editor.content samp { + background: rgba(0, 0, 0, 0.075); +} + +body#tinymce.wp-editor.content code, +body#tinymce.wp-editor.content kbd, +body#tinymce.wp-editor.content pre, +body#tinymce.wp-editor.content samp { + font-family: monospace; + color: inherit; + font-size: 15px; +} + +body#tinymce.wp-editor.content pre { + border: 1px solid #dcd7ca; + line-height: 1.5; + margin: 40px 0; + overflow: auto; + padding: 30px; + text-align: left; +} + +body#tinymce.wp-editor.content a, +body#tinymce.wp-editor.content a:focus, +body#tinymce.wp-editor.content a:hover { + color: #cd2653; + text-decoration: underline; +} + +body#tinymce.wp-editor.content img { + height: auto; + max-width: 100%; +} + +body#tinymce.wp-editor.content img[data-wp-more] { + height: 16px; +} + +body#tinymce.wp-editor.content hr { + border: none; + border-top: 1px solid #dcd7ca; + margin: 2em auto; + width: 100%; +} + +body#tinymce.wp-editor.content hr:not(.is-style-dots) { + background: linear-gradient(to left, currentColor calc(50% - 16px), transparent calc(50% - 16px), transparent calc(50% + 16px), currentColor calc(50% + 16px)); + border: none; + color: #6d6d6d; + height: 1px; + margin: 80px 0; + overflow: visible; + position: relative; +} + +body#tinymce.wp-editor.content hr:not(.is-style-dots)::before, +body#tinymce.wp-editor.content hr:not(.is-style-dots)::after { + background: currentColor; + content: ""; + display: block; + height: 16px; + position: absolute; + top: calc(50% - 8px); + transform: rotate(22.5deg); + width: 1px; +} + +body#tinymce.wp-editor.content hr::before { + left: calc(50% - 5px); +} + +body#tinymce.wp-editor.content hr::after { + right: calc(50% - 5px); +} + +body#tinymce.wp-editor.content dt { + font-weight: 600; +} + +body#tinymce.wp-editor.content dd { + line-height: 1.5; +} + +body#tinymce.wp-editor.content dd + dt { + margin-top: 1.5rem; +} + + +/* Font Families ----------------------------- */ + +body#tinymce.wp-editor.content figcaption, +body#tinymce.wp-editor.content .wp-caption-text, +body#tinymce.wp-editor.content .wp-caption-dd, +body#tinymce.wp-editor.content cite, +body#tinymce.wp-editor.content table { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + line-height: 1; +} + +@supports ( font-variation-settings: normal ) { + + body#tinymce.wp-editor.content figcaption, + body#tinymce.wp-editor.content .wp-caption-text, + body#tinymce.wp-editor.content .wp-caption-dd, + body#tinymce.wp-editor.content cite, + body#tinymce.wp-editor.content table { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + + +/* Titles ------------------------------------ */ + +body#tinymce.wp-editor.content h1, +body#tinymce.wp-editor.content h2, +body#tinymce.wp-editor.content h3, +body#tinymce.wp-editor.content h4, +body#tinymce.wp-editor.content h5, +body#tinymce.wp-editor.content h6 { + font-feature-settings: "lnum"; + font-variant-numeric: lining-nums; + font-weight: 700; + letter-spacing: -0.0415625em; + line-height: 1.25; + margin: 40px 0 25px; +} + +body#tinymce.wp-editor.content h1 { + font-size: 84px; + font-weight: 800; + line-height: 1.138888889; +} + +body#tinymce.wp-editor.content h2 { + font-size: 48px; +} + +body#tinymce.wp-editor.content h3 { + font-size: 40px; +} + +body#tinymce.wp-editor.content h4 { + font-size: 32px; +} + +body#tinymce.wp-editor.content h5 { + font-size: 24px; +} + +body#tinymce.wp-editor.content h6 { + font-size: 18px; + letter-spacing: 0.03125em; + text-transform: uppercase; +} + +/* Blockquote -------------------------------- */ + +body#tinymce.wp-editor.content blockquote { + border: none; + border-left: 2px solid #cd2653; + margin: 0 0 1.6em 0; + padding: 0.25em 0 0.25em 1em; +} + +body#tinymce.wp-editor.content blockquote p { + font-style: normal; + font-weight: 400; + margin: 0; +} + +body#tinymce.wp-editor.content cite { + color: #6d6d6d; + font-size: 16px; + font-weight: 500; + font-style: normal; +} + +body#tinymce.wp-editor.content blockquote cite { + display: block; + margin-top: 20px; +} + + +/* Lists ------------------------------------- */ + +body#tinymce.wp-editor.content ul { + margin-left: 1.5em; + padding-left: 0; + list-style: disc; +} + +body#tinymce.wp-editor.content ol { + margin-left: 1.5em; + padding-left: 0; + list-style: square; +} + +body#tinymce.wp-editor.content ul ul { + list-style: circle; +} + +body#tinymce.wp-editor.content ul ul ul { + list-style: square; +} + +body#tinymce.wp-editor.content ol ol { + list-style: lower-alpha; +} + +body#tinymce.wp-editor.content ol ol ol { + list-style: lower-roman; +} + +body#tinymce.wp-editor.content ul ul, +body#tinymce.wp-editor.content ul ol, +body#tinymce.wp-editor.content ol ul, +body#tinymce.wp-editor.content ol ol { + margin-bottom: 0; +} + +body#tinymce.wp-editor.content li { + line-height: 1.5; + margin-bottom: 0.5em; +} + +body#tinymce.wp-editor.content ol > li:last-child, +body#tinymce.wp-editor.content ul > li:last-child { + margin-bottom: 0; +} + +body#tinymce.wp-editor.content ol > li:first-child, +body#tinymce.wp-editor.content ul > li:first-child { + margin-top: 0.5em; +} + + +/* Post Media -------------------------------- */ + +body#tinymce.wp-editor.content figure, +body#tinymce.wp-editor.content video { + display: block; + margin: 0; +} + +body#tinymce.wp-editor.content .wp-caption { + margin-bottom: 1.5em; +} + +body#tinymce.wp-editor.content img.alignleft, +body#tinymce.wp-editor.content .alignleft img, +body#tinymce.wp-editor.content img.aligncenter, +body#tinymce.wp-editor.content .aligncenter img, +body#tinymce.wp-editor.content img.alignright, +body#tinymce.wp-editor.content .alignright img, +body#tinymce.wp-editor.content img.alignnone, +body#tinymce.wp-editor.content .alignnone img { + display: block; +} + +body#tinymce.wp-editor.content .aligncenter, +body#tinymce.wp-editor.content .alignnone, +body#tinymce.wp-editor.content .alignwide, +body#tinymce.wp-editor.content .alignfull { + margin: 50px auto; +} + +body#tinymce.wp-editor.content .alignleft, +body#tinymce.wp-editor.content .alignright { + margin-bottom: 25px; + max-width: 50%; +} + +body#tinymce.wp-editor.content .wp-caption img { + display: block; +} + +body#tinymce.wp-editor.content .wp-caption .alignleft, +body#tinymce.wp-editor.content .wp-caption .alignright { + margin-bottom: 0; +} + +body#tinymce.wp-editor.content .alignleft { + + /*rtl:ignore*/ + float: left; + margin-right: 25px; + max-width: 260px; +} + +body#tinymce.wp-editor.content .alignright { + + /*rtl:ignore*/ + float: right; + margin-left: 25px; + max-width: 260px; +} + +body#tinymce.wp-editor.content .wpview[data-wpview-type="gallery"] + .wpview[data-wpview-type="gallery"] { + margin-top: -34px; +} + +body#tinymce.wp-editor.content figcaption, +body#tinymce.wp-editor.content .wp-caption-text, +body#tinymce.wp-editor.content .wp-caption-dd, +body#tinymce.wp-editor.content .gallery-caption { + color: #6d6d6d; + display: block; + font-size: 15px; + font-weight: 500; + line-height: 1.2; + margin: 18px 0 0; +} + +body#tinymce.wp-editor.content figcaption a, +body#tinymce.wp-editor.content .wp-caption-text a, +body#tinymce.wp-editor.content .wp-caption-dd a, +body#tinymce.wp-editor.content .gallery-caption a { + color: inherit; +} + + +/* Tables ------------------------------------ */ + +body#tinymce.wp-editor.content table { + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + font-size: 18px; + width: 100%; +} + +body#tinymce.wp-editor.content th, +body#tinymce.wp-editor.content td { + line-height: 1.2; + margin: 0; + overflow: visible; + padding: 0.5em; +} + +body#tinymce.wp-editor.content caption { + text-align: center; + padding: 0.5em; +} + +body#tinymce.wp-editor.content thead { + vertical-align: bottom; + white-space: nowrap; +} + +body#tinymce.wp-editor.content th { + text-align: left; +} + + +/* Forms ------------------------------------- */ + +body#tinymce.wp-editor.content fieldset { + border: 2px solid #dcd7ca; + padding: 30px; +} + +body#tinymce.wp-editor.content fieldset legend { + font-size: 0.85em; + font-weight: 700; + padding: 0 15px; +} + +body#tinymce.wp-editor.content label { + display: block; + font-size: 15px; + font-weight: 600; + margin: 0 0 5px 0; +} + +body#tinymce.wp-editor.content input, +body#tinymce.wp-editor.content textarea { + border-color: #dcd7ca; + color: inherit; + font-family: inherit; + font-size: inherit; +} + +body#tinymce.wp-editor.content input[type="text"], +body#tinymce.wp-editor.content input[type="password"], +body#tinymce.wp-editor.content input[type="email"], +body#tinymce.wp-editor.content input[type="url"], +body#tinymce.wp-editor.content input[type="date"], +body#tinymce.wp-editor.content input[type="month"], +body#tinymce.wp-editor.content input[type="time"], +body#tinymce.wp-editor.content input[type="datetime"], +body#tinymce.wp-editor.content input[type="datetime-local"], +body#tinymce.wp-editor.content input[type="week"], +body#tinymce.wp-editor.content input[type="number"], +body#tinymce.wp-editor.content input[type="search"], +body#tinymce.wp-editor.content input[type="tel"], +body#tinymce.wp-editor.content input[type="color"], +body#tinymce.wp-editor.content textarea { + -webkit-appearance: none; + -moz-appearance: none; + background: transparent; + border-radius: 3px; + border-style: solid; + border-width: 0.1rem; + box-shadow: none; + display: block; + font-size: inherit; + font-weight: 400; + margin: 0; + max-width: 100%; + padding: 13.5px 18px; + width: 100%; + word-break: normal; +} + +body#tinymce.wp-editor.content textarea { + height: 200px; + line-height: 1.5; + width: 100%; +} + +body#tinymce.wp-editor.content button, +body#tinymce.wp-editor.content .faux-button, +body#tinymce.wp-editor.content .wp-block-button__link, +body#tinymce.wp-editor.content .wp-block-file__button, +body#tinymce.wp-editor.content input[type="button"], +body#tinymce.wp-editor.content input[type="reset"], +body#tinymce.wp-editor.content input[type="submit"] { + -webkit-appearance: none; + -moz-appearance: none; + background: #cd2653; + border: none; + border-radius: 0; + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 17px; + font-weight: 600; + letter-spacing: 0.0333em; + line-height: 1.25; + margin: 0; + padding: 1.1em 1.44em; + text-align: center; + text-decoration: none; + text-transform: uppercase; +} + +body#tinymce.wp-editor.content button:focus, +body#tinymce.wp-editor.content button:hover, +body#tinymce.wp-editor.content .faux-button:hover, +body#tinymce.wp-editor.content .faux-button:focus, +body#tinymce.wp-editor.content .wp-block-button__link:focus, +body#tinymce.wp-editor.content .wp-block-button__link:hover, +body#tinymce.wp-editor.content .wp-block-file__button:focus, +body#tinymce.wp-editor.content .wp-block-file__button:hover, +body#tinymce.wp-editor.content input[type="button"]:focus, +body#tinymce.wp-editor.content input[type="button"]:hover, +body#tinymce.wp-editor.content input[type="reset"]:focus, +body#tinymce.wp-editor.content input[type="reset"]:hover, +body#tinymce.wp-editor.content input[type="submit"]:focus, +body#tinymce.wp-editor.content input[type="submit"]:hover { + color: #fff; + text-decoration: underline; +} + +.wp-block-button:not(.alignleft):not(.alignright) { + margin-bottom: 30px; + margin-top: 30px; +} + +/* BUTTON ALIGN: CENTER */ + +.wp-block-button.aligncenter { + text-align: center; +} + +/* BUTTON STYLE: OUTLINE */ + +body#tinymce.wp-editor.content .is-style-outline .wp-block-button__link, +body#tinymce.wp-editor.content .is-style-outline .wp-block-button__link:focus, +body#tinymce.wp-editor.content .is-style-outline .wp-block-button__link:hover { + color: #cd2653; +} + +body#tinymce.wp-editor.content .is-style-outline .wp-block-button__link { + background: none; + border: 2px solid currentColor; + padding: calc(1.1em - 2px) calc(1.44em - 2px); +} + +/* BUTTON STYLE: SQUARED */ + +body#tinymce.wp-editor.content .is-style-squared .wp-block-button__link { + border-radius: 0; +} + + +/* Blocks ------------------------------------ */ + +/* BLOCK: HELPER CLASSES */ + +body#tinymce.wp-editor.content .has-background { + padding: 20px; +} + +/* BLOCK: GALLERY */ + +body#tinymce.wp-editor.content ul.wp-block-gallery { + list-style: none; + margin-left: 0; +} + +body#tinymce.wp-editor.content ul.wp-block-gallery li { + margin-left: 0; +} diff --git a/content/themes/twentytwenty/assets/fonts/inter/Inter-italic-var.woff2 b/content/themes/twentytwenty/assets/fonts/inter/Inter-italic-var.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2300488bdb606932274af888ef9ebb26bd172bcf GIT binary patch literal 236832 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

    2i@fz~+#GUU6!4!6~2#ovn<^L&E4t0p@`f(deo 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 z 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 z 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

    9290p#%i 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%0A`)wh6wc*hCYPF_#5c~P~YKS{jc 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 z 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 z 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 c&&dRhh#a}CRSfO2 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 rRDUU6Qus5nq+)Cpt~Pl-oN}0XINF; literal 0 HcmV?d00001 diff --git a/content/themes/twentytwenty/assets/images/2020-landscape-1.png b/content/themes/twentytwenty/assets/images/2020-landscape-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ab55b91be8ee228e516e2dda0d0166eef3c10724 GIT binary patch literal 1211 zcmeAS@N?(olHy`uVBq!ia0y~yVA;UHz|6?P3=**mSOlch1AIbU_gaMPHVF^3YcmOoR-_yl0q=NCyHCM*N0V1vke<#KV z1bldJD0RqW@k1L9prI6j1FjTlhiO)I|5n#l{K|6EeRGcN%BP~|R1A7TUdeO9NZ);e9KIMX6ic!Y9bjPp_yAI%sW}p`t

      9(S literal 0 HcmV?d00001 diff --git a/content/themes/twentytwenty/assets/images/2020-landscape-2.png b/content/themes/twentytwenty/assets/images/2020-landscape-2.png new file mode 100644 index 0000000000000000000000000000000000000000..844d377ea5ac28a017cf5a816e0eb370a63f2058 GIT binary patch literal 6248 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 literal 0 HcmV?d00001 diff --git a/content/themes/twentytwenty/assets/images/2020-three-quarters-1.png b/content/themes/twentytwenty/assets/images/2020-three-quarters-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d02d9176f0874ceda6ddc01f75b5dc025c59183f GIT binary patch literal 2333 zcmeAS@N?(olHy`uVBq!ia0y~yVCi6BU{2#;28t|`cIX9CCj)#!T=!apY_JSoXBoWS zGI*_J@HWfft(L+2EJC)L1+6y=*kBg0&NN`DiQh64zxAd8%T4??mP zGIXD1=qA&E2|A7wb(~fi`xdI07OR-8Huf!1H7ip!pRMn7x$+(;^T1kA z_9FLlm2o*JRArblJc<2vg30rRavMvWbr3p)=V-BFk<~rq!W9Em!9*U+SXH-8ZK_w!=?+ zG>p-raF(nke|2bsaHu7JehWv-irdAqOoRit!QPx<)>B)D%{2@e)A||Ce&Sp(lWO(W zz!sV0)w;R+wg(>v2VC=?wdH3QDM%?OIk+$=F}bk783LcCN`)DB_k-Fy44$rjF6*2U FngIPe)^q>> literal 0 HcmV?d00001 diff --git a/content/themes/twentytwenty/assets/images/2020-three-quarters-2.png b/content/themes/twentytwenty/assets/images/2020-three-quarters-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1dd1abe35ef112bf243b86864bd73177b86daa GIT binary patch literal 2708 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%0AU2KD8+Uc&O}=!{@=)Wltw3l@<&|LOU|e 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 Iiq*^i0o<^UjQ{`u literal 0 HcmV?d00001 diff --git a/content/themes/twentytwenty/assets/images/2020-three-quarters-4.png b/content/themes/twentytwenty/assets/images/2020-three-quarters-4.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7c7f0d73eb8a07a1c8fd35948bad4e3bf93ed0 GIT binary patch literal 2185 zcmeAS@N?(olHy`uVBq!ia0y~yVCi6BU{2#;28t|`cIX9CP60k4u6r#)Hk$_I%In8U zX~auwZZQqWlQ&3^(oB@r+GOG%C!^^trsyZGw9eSiMNCdlK-54$%uP(*NI-m#MaWuX zKUXpNlM;&;GB9v3dAc};R4~4|a*)v>fQNO1-M@dzhgobHRh(5=d*8fDF%WI&U=U>N z;1CcTWsC;GXi6Alx!~gaySxH|3Q7%uCK8@pE-f7bf=Wz+g{v#?nppK&aJjLs2IlRJ zz+!{pfI|K2z&F~Xxp}lC8~(+4jtff%hl2|+vyME*in&%B7#La>G5nCrz3^``o3DU^ x-McmmNNAX_DJVI(Feov(uxu#1x4`x%uikZSPUh;ZC;CB!gr}>Y%Q~loCID!2-b4TZ literal 0 HcmV?d00001 diff --git a/content/themes/twentytwenty/assets/js/color-calculations.js b/content/themes/twentytwenty/assets/js/color-calculations.js new file mode 100644 index 0000000..2587a48 --- /dev/null +++ b/content/themes/twentytwenty/assets/js/color-calculations.js @@ -0,0 +1,156 @@ +/* global Color */ +/* eslint no-unused-vars: off */ +/** + * Color Calculations. + * + * @since Twenty Twenty 1.0 + * + * @param {string} backgroundColor - The background color. + * @param {number} accentHue - The hue for our accent color. + * + * @return {Object} - this + */ +function _twentyTwentyColor( backgroundColor, accentHue ) { + // Set the object properties. + this.backgroundColor = backgroundColor; + this.accentHue = accentHue; + this.bgColorObj = new Color( backgroundColor ); + this.textColorObj = this.bgColorObj.getMaxContrastColor(); + this.textColor = this.textColorObj.toCSS(); + this.isDark = 0.5 > this.bgColorObj.toLuminosity(); + this.isLight = ! this.isDark; + + // Return the object. + return this; +} + +/** + * Builds an array of Color objects based on the accent hue. + * For improved performance we only build half the array + * depending on dark/light background-color. + * + * @since Twenty Twenty 1.0 + * + * @return {Object} - this + */ +_twentyTwentyColor.prototype.setAccentColorsArray = function() { + var self = this, + minSaturation = 65, + maxSaturation = 100, + minLightness = 30, + maxLightness = 80, + stepSaturation = 2, + stepLightness = 2, + pushColor = function() { + var colorObj = new Color( { + h: self.accentHue, + s: s, + l: l + } ), + item, + /** + * Get a score for this color in contrast to its background color and surrounding text. + * + * @since Twenty Twenty 1.0 + * + * @param {number} contrastBackground - WCAG contrast with the background color. + * @param {number} contrastSurroundingText - WCAG contrast with surrounding text. + * @return {number} - 0 is best, higher numbers have bigger difference with the desired scores. + */ + getScore = function( contrastBackground, contrastSurroundingText ) { + var diffBackground = ( 7 >= contrastBackground ) ? 0 : 7 - contrastBackground, + diffSurroundingText = ( 3 >= contrastSurroundingText ) ? 0 : 3 - contrastSurroundingText; + + return diffBackground + diffSurroundingText; + }; + + item = { + color: colorObj, + contrastBackground: colorObj.getDistanceLuminosityFrom( self.bgColorObj ), + contrastText: colorObj.getDistanceLuminosityFrom( self.textColorObj ) + }; + + // Check a minimum of 4.5:1 contrast with the background and 3:1 with surrounding text. + if ( 4.5 > item.contrastBackground || 3 > item.contrastText ) { + return; + } + + // Get a score for this color by multiplying the 2 contrasts. + // We'll use that to sort the array. + item.score = getScore( item.contrastBackground, item.contrastText ); + + self.accentColorsArray.push( item ); + }, + s, l, aaa; + + this.accentColorsArray = []; + + // We're using `for` loops here because they perform marginally better than other loops. + for ( s = minSaturation; s <= maxSaturation; s += stepSaturation ) { + for ( l = minLightness; l <= maxLightness; l += stepLightness ) { + pushColor( s, l ); + } + } + + // Check if we have colors that are AAA compliant. + aaa = this.accentColorsArray.filter( function( color ) { + return 7 <= color.contrastBackground; + } ); + + // If we have AAA-compliant colors, always prefer them. + if ( aaa.length ) { + this.accentColorsArray = aaa; + } + + // Sort colors by contrast. + this.accentColorsArray.sort( function( a, b ) { + return a.score - b.score; + } ); + return this; +}; + +/** + * Get accessible text-color. + * + * @since Twenty Twenty 1.0 + * + * @return {Color} - Returns a Color object. + */ +_twentyTwentyColor.prototype.getTextColor = function() { + return this.textColor; +}; + +/** + * Get accessible color for the defined accent-hue and background-color. + * + * @since Twenty Twenty 1.0 + * + * @return {Color} - Returns a Color object. + */ +_twentyTwentyColor.prototype.getAccentColor = function() { + var fallback; + + // If we have colors returns the 1st one - it has the highest score. + if ( this.accentColorsArray[0] ) { + return this.accentColorsArray[0].color; + } + + // Fallback. + fallback = new Color( 'hsl(' + this.accentHue + ',75%,50%)' ); + return fallback.getReadableContrastingColor( this.bgColorObj, 4.5 ); +}; + +/** + * Return a new instance of the _twentyTwentyColor object. + * + * @since Twenty Twenty 1.0 + * + * @param {string} backgroundColor - The background color. + * @param {number} accentHue - The hue for our accent color. + * @return {Object} - this + */ +function twentyTwentyColor( backgroundColor, accentHue ) {// jshint ignore:line + var color = new _twentyTwentyColor( backgroundColor, accentHue ); + color.setAccentColorsArray(); + return color; +} diff --git a/content/themes/twentytwenty/assets/js/customize-controls.js b/content/themes/twentytwenty/assets/js/customize-controls.js new file mode 100644 index 0000000..26136e2 --- /dev/null +++ b/content/themes/twentytwenty/assets/js/customize-controls.js @@ -0,0 +1,90 @@ +/* global twentyTwentyBgColors, twentyTwentyColor, jQuery, wp, _ */ +/** + * Customizer enhancements for a better user experience. + * + * Contains extra logic for our Customizer controls & settings. + * + * @since Twenty Twenty 1.0 + */ + +( function() { + // Wait until the customizer has finished loading. + wp.customize.bind( 'ready', function() { + // Add a listener for accent-color changes. + wp.customize( 'accent_hue', function( value ) { + value.bind( function( to ) { + // Update the value for our accessible colors for all areas. + Object.keys( twentyTwentyBgColors ).forEach( function( context ) { + var backgroundColorValue; + if ( twentyTwentyBgColors[ context ].color ) { + backgroundColorValue = twentyTwentyBgColors[ context ].color; + } else { + backgroundColorValue = wp.customize( twentyTwentyBgColors[ context ].setting ).get(); + } + twentyTwentySetAccessibleColorsValue( context, backgroundColorValue, to ); + } ); + } ); + } ); + + // Add a listener for background-color changes. + Object.keys( twentyTwentyBgColors ).forEach( function( context ) { + wp.customize( twentyTwentyBgColors[ context ].setting, function( value ) { + value.bind( function( to ) { + // Update the value for our accessible colors for this area. + twentyTwentySetAccessibleColorsValue( context, to, wp.customize( 'accent_hue' ).get(), to ); + } ); + } ); + } ); + } ); + + /** + * Updates the value of the "accent_accessible_colors" setting. + * + * @since Twenty Twenty 1.0 + * + * @param {string} context The area for which we want to get colors. Can be for example "content", "header" etc. + * @param {string} backgroundColor The background color (HEX value). + * @param {number} accentHue Numeric representation of the selected hue (0 - 359). + * + * @return {void} + */ + function twentyTwentySetAccessibleColorsValue( context, backgroundColor, accentHue ) { + var value, colors; + + // Get the current value for our accessible colors, and make sure it's an object. + value = wp.customize( 'accent_accessible_colors' ).get(); + value = ( _.isObject( value ) && ! _.isArray( value ) ) ? value : {}; + + // Get accessible colors for the defined background-color and hue. + colors = twentyTwentyColor( backgroundColor, accentHue ); + + // Sanity check. + if ( colors.getAccentColor() && 'function' === typeof colors.getAccentColor().toCSS ) { + // Update the value for this context. + value[ context ] = { + text: colors.getTextColor(), + accent: colors.getAccentColor().toCSS(), + background: backgroundColor + }; + + // Get borders color. + value[ context ].borders = colors.bgColorObj + .clone() + .getReadableContrastingColor( colors.bgColorObj, 1.36 ) + .toCSS(); + + // Get secondary color. + value[ context ].secondary = colors.bgColorObj + .clone() + .getReadableContrastingColor( colors.bgColorObj ) + .s( colors.bgColorObj.s() / 2 ) + .toCSS(); + } + + // Change the value. + wp.customize( 'accent_accessible_colors' ).set( value ); + + // Small hack to save the option. + wp.customize( 'accent_accessible_colors' )._dirty = true; + } +}( jQuery ) ); diff --git a/content/themes/twentytwenty/assets/js/customize-preview.js b/content/themes/twentytwenty/assets/js/customize-preview.js new file mode 100644 index 0000000..6bb361c --- /dev/null +++ b/content/themes/twentytwenty/assets/js/customize-preview.js @@ -0,0 +1,186 @@ +/* global twentyTwentyBgColors, twentyTwentyPreviewEls, jQuery, _, wp */ +/** + * Customizer enhancements for a better user experience. + * + * Contains handlers to make Theme Customizer preview reload changes asynchronously. + * + * @since Twenty Twenty 1.0 + */ + +( function( $, api, _ ) { + /** + * Return a value for our partial refresh. + * + * @param {Object} partial Current partial. + * + * @return {jQuery.Promise} Resolved promise. + */ + function returnDeferred( partial ) { + var deferred = new $.Deferred(); + + deferred.resolveWith( partial, _.map( partial.placements(), function() { + return ''; + } ) ); + + return deferred.promise(); + } + + // Selective refresh for "Fixed Background Image". + api.selectiveRefresh.partialConstructor.cover_fixed = api.selectiveRefresh.Partial.extend( { + + /** + * Override the refresh method. + * + * @return {jQuery.Promise} Resolved promise. + */ + refresh: function() { + var partial, cover, params; + + partial = this; + params = partial.params; + cover = $( params.selector ); + + if ( cover.length && cover.hasClass( 'bg-image' ) ) { + cover.toggleClass( 'bg-attachment-fixed' ); + } + + return returnDeferred( partial ); + } + + } ); + + // Selective refresh for "Image Overlay Opacity". + api.selectiveRefresh.partialConstructor.cover_opacity = api.selectiveRefresh.Partial.extend( { + + /** + * Input attributes. + * + * @type {Object} + */ + attrs: {}, + + /** + * Override the refresh method. + * + * @return {jQuery.Promise} Resolved promise. + */ + refresh: function() { + var partial, ranges, attrs, setting, params, cover, className, classNames; + + partial = this; + attrs = partial.attrs; + ranges = _.range( attrs.min, attrs.max + attrs.step, attrs.step ); + params = partial.params; + setting = api( params.primarySetting ); + cover = $( params.selector ); + + if ( cover.length ) { + classNames = _.map( ranges, function( val ) { + return 'opacity-' + val; + } ); + + className = classNames[ ranges.indexOf( parseInt( setting.get(), 10 ) ) ]; + + cover.removeClass( classNames.join( ' ' ) ); + cover.addClass( className ); + } + + return returnDeferred( partial ); + } + + } ); + + // Add listener for the "header_footer_background_color" control. + api( 'header_footer_background_color', function( value ) { + value.bind( function( to ) { + // Add background color to header and footer wrappers. + $( 'body:not(.overlay-header)#site-header, #site-footer' ).css( 'background-color', to ); + + // Change body classes if this is the same background-color as the content background. + if ( to.toLowerCase() === api( 'background_color' ).get().toLowerCase() ) { + $( 'body' ).addClass( 'reduced-spacing' ); + } else { + $( 'body' ).removeClass( 'reduced-spacing' ); + } + } ); + } ); + + // Add listener for the "background_color" control. + api( 'background_color', function( value ) { + value.bind( function( to ) { + // Change body classes if this is the same background-color as the header/footer background. + if ( to.toLowerCase() === api( 'header_footer_background_color' ).get().toLowerCase() ) { + $( 'body' ).addClass( 'reduced-spacing' ); + } else { + $( 'body' ).removeClass( 'reduced-spacing' ); + } + } ); + } ); + + // Add listener for the accent color. + api( 'accent_hue', function( value ) { + value.bind( function() { + // Generate the styles. + // Add a small delay to be sure the accessible colors were generated. + setTimeout( function() { + Object.keys( twentyTwentyBgColors ).forEach( function( context ) { + twentyTwentyGenerateColorA11yPreviewStyles( context ); + } ); + }, 50 ); + } ); + } ); + + // Add listeners for background-color settings. + Object.keys( twentyTwentyBgColors ).forEach( function( context ) { + wp.customize( twentyTwentyBgColors[ context ].setting, function( value ) { + value.bind( function() { + // Generate the styles. + // Add a small delay to be sure the accessible colors were generated. + setTimeout( function() { + twentyTwentyGenerateColorA11yPreviewStyles( context ); + }, 50 ); + } ); + } ); + } ); + + /** + * Add styles to elements in the preview pane. + * + * @since Twenty Twenty 1.0 + * + * @param {string} context The area for which we want to generate styles. Can be for example "content", "header" etc. + * + * @return {void} + */ + function twentyTwentyGenerateColorA11yPreviewStyles( context ) { + // Get the accessible colors option. + var a11yColors = window.parent.wp.customize( 'accent_accessible_colors' ).get(), + stylesheedID = 'twentytwenty-customizer-styles-' + context, + stylesheet = $( '#' + stylesheedID ), + styles = ''; + // If the stylesheet doesn't exist, create it and append it to . + if ( ! stylesheet.length ) { + $( '#twentytwenty-style-inline-css' ).after( '' ); + stylesheet = $( '#' + stylesheedID ); + } + if ( ! _.isUndefined( a11yColors[ context ] ) ) { + // Check if we have elements defined. + if ( twentyTwentyPreviewEls[ context ] ) { + _.each( twentyTwentyPreviewEls[ context ], function( items, setting ) { + _.each( items, function( elements, property ) { + if ( ! _.isUndefined( a11yColors[ context ][ setting ] ) ) { + styles += elements.join( ',' ) + '{' + property + ':' + a11yColors[ context ][ setting ] + ';}'; + } + } ); + } ); + } + } + // Add styles. + stylesheet.html( styles ); + } + // Generate styles on load. Handles page-changes on the preview pane. + $( document ).ready( function() { + twentyTwentyGenerateColorA11yPreviewStyles( 'content' ); + twentyTwentyGenerateColorA11yPreviewStyles( 'header-footer' ); + } ); +}( jQuery, wp.customize, _ ) ); diff --git a/content/themes/twentytwenty/assets/js/customize.js b/content/themes/twentytwenty/assets/js/customize.js new file mode 100644 index 0000000..2a38ace --- /dev/null +++ b/content/themes/twentytwenty/assets/js/customize.js @@ -0,0 +1,27 @@ +/* global wp, jQuery */ + +( function( $, api ) { + $( document ).ready( function() { + // Make it possible to reset the color based on a radio input's value. + // `active` can be either `custom` or `default`. + api.control( 'accent_hue_active' ).setting.bind( function( active ) { + var control = api.control( 'accent_hue' ); // Get the accent hue control. + + if ( 'custom' === active ) { + // Activate the hue color picker control and focus it. + control.activate( { + completeCallback: function() { + control.focus(); + } + } ); + } else { + // If the `custom` option isn't selected, deactivate the hue color picker and set a default. + control.deactivate( { + completeCallback: function() { + control.setting.set( control.params.defaultValue ); + } + } ); + } + } ); + } ); +}( jQuery, wp.customize ) ); diff --git a/content/themes/twentytwenty/assets/js/editor-script-block.js b/content/themes/twentytwenty/assets/js/editor-script-block.js new file mode 100644 index 0000000..3ff08d5 --- /dev/null +++ b/content/themes/twentytwenty/assets/js/editor-script-block.js @@ -0,0 +1,9 @@ +/** + * Remove squared button style + * + * @since Twenty Twenty 1.0 + */ +/* global wp */ +wp.domReady( function() { + wp.blocks.unregisterBlockStyle( 'core/button', 'squared' ); +} ); diff --git a/content/themes/twentytwenty/assets/js/index.js b/content/themes/twentytwenty/assets/js/index.js new file mode 100644 index 0000000..c6f7a0a --- /dev/null +++ b/content/themes/twentytwenty/assets/js/index.js @@ -0,0 +1,817 @@ +/* ----------------------------------------------------------------------------------------------- + Namespace +--------------------------------------------------------------------------------------------------- */ + +var twentytwenty = twentytwenty || {}; + +// Set a default value for scrolled. +twentytwenty.scrolled = 0; + +// polyfill closest +// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill +if ( ! Element.prototype.closest ) { + Element.prototype.closest = function( s ) { + var el = this; + + do { + if ( el.matches( s ) ) { + return el; + } + + el = el.parentElement || el.parentNode; + } while ( el !== null && el.nodeType === 1 ); + + return null; + }; +} + +// polyfill forEach +// https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Polyfill +if ( window.NodeList && ! NodeList.prototype.forEach ) { + NodeList.prototype.forEach = function( callback, thisArg ) { + var i; + var len = this.length; + + thisArg = thisArg || window; + + for ( i = 0; i < len; i++ ) { + callback.call( thisArg, this[ i ], i, this ); + } + }; +} + +// event "polyfill" +twentytwenty.createEvent = function( eventName ) { + var event; + if ( typeof window.Event === 'function' ) { + event = new Event( eventName ); + } else { + event = document.createEvent( 'Event' ); + event.initEvent( eventName, true, false ); + } + return event; +}; + +// matches "polyfill" +// https://developer.mozilla.org/es/docs/Web/API/Element/matches +if ( ! Element.prototype.matches ) { + Element.prototype.matches = + Element.prototype.matchesSelector || + Element.prototype.mozMatchesSelector || + Element.prototype.msMatchesSelector || + Element.prototype.oMatchesSelector || + Element.prototype.webkitMatchesSelector || + function( s ) { + var matches = ( this.document || this.ownerDocument ).querySelectorAll( s ), + i = matches.length; + while ( --i >= 0 && matches.item( i ) !== this ) {} + return i > -1; + }; +} + +// Add a class to the body for when touch is enabled for browsers that don't support media queries +// for interaction media features. Adapted from . +twentytwenty.touchEnabled = { + + init: function() { + var matchMedia = function() { + // Include the 'heartz' as a way to have a non matching MQ to help terminate the join. See . + var prefixes = [ '-webkit-', '-moz-', '-o-', '-ms-' ]; + var query = [ '(', prefixes.join( 'touch-enabled),(' ), 'heartz', ')' ].join( '' ); + return window.matchMedia && window.matchMedia( query ).matches; + }; + + if ( ( 'ontouchstart' in window ) || ( window.DocumentTouch && document instanceof window.DocumentTouch ) || matchMedia() ) { + document.body.classList.add( 'touch-enabled' ); + } + } +}; // twentytwenty.touchEnabled + +/* ----------------------------------------------------------------------------------------------- + Cover Modals +--------------------------------------------------------------------------------------------------- */ + +twentytwenty.coverModals = { + + init: function() { + if ( document.querySelector( '.cover-modal' ) ) { + // Handle cover modals when they're toggled. + this.onToggle(); + + // When toggled, untoggle if visitor clicks on the wrapping element of the modal. + this.outsideUntoggle(); + + // Close on escape key press. + this.closeOnEscape(); + + // Hide and show modals before and after their animations have played out. + this.hideAndShowModals(); + } + }, + + // Handle cover modals when they're toggled. + onToggle: function() { + document.querySelectorAll( '.cover-modal' ).forEach( function( element ) { + element.addEventListener( 'toggled', function( event ) { + var modal = event.target, + body = document.body; + + if ( modal.classList.contains( 'active' ) ) { + body.classList.add( 'showing-modal' ); + } else { + body.classList.remove( 'showing-modal' ); + body.classList.add( 'hiding-modal' ); + + // Remove the hiding class after a delay, when animations have been run. + setTimeout( function() { + body.classList.remove( 'hiding-modal' ); + }, 500 ); + } + } ); + } ); + }, + + // Close modal on outside click. + outsideUntoggle: function() { + document.addEventListener( 'click', function( event ) { + var target = event.target; + var modal = document.querySelector( '.cover-modal.active' ); + + // if target onclick is with # within the href attribute + if ( event.target.tagName.toLowerCase() === 'a' && event.target.hash.includes( '#' ) && modal !== null ) { + // untoggle the modal + this.untoggleModal( modal ); + // wait 550 and scroll to the anchor + setTimeout( function() { + var anchor = document.getElementById( event.target.hash.slice( 1 ) ); + anchor.scrollIntoView(); + }, 550 ); + } + + if ( target === modal ) { + this.untoggleModal( target ); + } + }.bind( this ) ); + }, + + // Close modal on escape key press. + closeOnEscape: function() { + document.addEventListener( 'keydown', function( event ) { + if ( event.keyCode === 27 ) { + event.preventDefault(); + document.querySelectorAll( '.cover-modal.active' ).forEach( function( element ) { + this.untoggleModal( element ); + }.bind( this ) ); + } + }.bind( this ) ); + }, + + // Hide and show modals before and after their animations have played out. + hideAndShowModals: function() { + var _doc = document, + _win = window, + modals = _doc.querySelectorAll( '.cover-modal' ), + htmlStyle = _doc.documentElement.style, + adminBar = _doc.querySelector( '#wpadminbar' ); + + function getAdminBarHeight( negativeValue ) { + var height, + currentScroll = _win.pageYOffset; + + if ( adminBar ) { + height = currentScroll + adminBar.getBoundingClientRect().height; + + return negativeValue ? -height : height; + } + + return currentScroll === 0 ? 0 : -currentScroll; + } + + function htmlStyles() { + var overflow = _win.innerHeight > _doc.documentElement.getBoundingClientRect().height; + + return { + 'overflow-y': overflow ? 'hidden' : 'scroll', + position: 'fixed', + width: '100%', + top: getAdminBarHeight( true ) + 'px', + left: 0 + }; + } + + // Show the modal. + modals.forEach( function( modal ) { + modal.addEventListener( 'toggle-target-before-inactive', function( event ) { + var styles = htmlStyles(), + offsetY = _win.pageYOffset, + paddingTop = ( Math.abs( getAdminBarHeight() ) - offsetY ) + 'px', + mQuery = _win.matchMedia( '(max-width: 600px)' ); + + if ( event.target !== modal ) { + return; + } + + Object.keys( styles ).forEach( function( styleKey ) { + htmlStyle.setProperty( styleKey, styles[ styleKey ] ); + } ); + + _win.twentytwenty.scrolled = parseInt( styles.top, 10 ); + + if ( adminBar ) { + _doc.body.style.setProperty( 'padding-top', paddingTop ); + + if ( mQuery.matches ) { + if ( offsetY >= getAdminBarHeight() ) { + modal.style.setProperty( 'top', 0 ); + } else { + modal.style.setProperty( 'top', ( getAdminBarHeight() - offsetY ) + 'px' ); + } + } + } + + modal.classList.add( 'show-modal' ); + } ); + + // Hide the modal after a delay, so animations have time to play out. + modal.addEventListener( 'toggle-target-after-inactive', function( event ) { + if ( event.target !== modal ) { + return; + } + + setTimeout( function() { + var clickedEl = twentytwenty.toggles.clickedEl; + + modal.classList.remove( 'show-modal' ); + + Object.keys( htmlStyles() ).forEach( function( styleKey ) { + htmlStyle.removeProperty( styleKey ); + } ); + + if ( adminBar ) { + _doc.body.style.removeProperty( 'padding-top' ); + modal.style.removeProperty( 'top' ); + } + + if ( clickedEl !== false ) { + clickedEl.focus(); + clickedEl = false; + } + + _win.scrollTo( 0, Math.abs( _win.twentytwenty.scrolled + getAdminBarHeight() ) ); + + _win.twentytwenty.scrolled = 0; + }, 500 ); + } ); + } ); + }, + + // Untoggle a modal. + untoggleModal: function( modal ) { + var modalTargetClass, + modalToggle = false; + + // If the modal has specified the string (ID or class) used by toggles to target it, untoggle the toggles with that target string. + // The modal-target-string must match the string toggles use to target the modal. + if ( modal.dataset.modalTargetString ) { + modalTargetClass = modal.dataset.modalTargetString; + + modalToggle = document.querySelector( '*[data-toggle-target="' + modalTargetClass + '"]' ); + } + + // If a modal toggle exists, trigger it so all of the toggle options are included. + if ( modalToggle ) { + modalToggle.click(); + + // If one doesn't exist, just hide the modal. + } else { + modal.classList.remove( 'active' ); + } + } + +}; // twentytwenty.coverModals + +/* ----------------------------------------------------------------------------------------------- + Intrinsic Ratio Embeds +--------------------------------------------------------------------------------------------------- */ + +twentytwenty.intrinsicRatioVideos = { + + init: function() { + this.makeFit(); + + window.addEventListener( 'resize', function() { + this.makeFit(); + }.bind( this ) ); + }, + + makeFit: function() { + document.querySelectorAll( 'iframe, object, video' ).forEach( function( video ) { + var ratio, iTargetWidth, + container = video.parentNode; + + // Skip videos we want to ignore. + if ( video.classList.contains( 'intrinsic-ignore' ) || video.parentNode.classList.contains( 'intrinsic-ignore' ) ) { + return true; + } + + if ( ! video.dataset.origwidth ) { + // Get the video element proportions. + video.setAttribute( 'data-origwidth', video.width ); + video.setAttribute( 'data-origheight', video.height ); + } + + iTargetWidth = container.offsetWidth; + + // Get ratio from proportions. + ratio = iTargetWidth / video.dataset.origwidth; + + // Scale based on ratio, thus retaining proportions. + video.style.width = iTargetWidth + 'px'; + video.style.height = ( video.dataset.origheight * ratio ) + 'px'; + } ); + } + +}; // twentytwenty.instrinsicRatioVideos + +/* ----------------------------------------------------------------------------------------------- + Modal Menu +--------------------------------------------------------------------------------------------------- */ +twentytwenty.modalMenu = { + + init: function() { + // If the current menu item is in a sub level, expand all the levels higher up on load. + this.expandLevel(); + this.keepFocusInModal(); + }, + + expandLevel: function() { + var modalMenus = document.querySelectorAll( '.modal-menu' ); + + modalMenus.forEach( function( modalMenu ) { + var activeMenuItem = modalMenu.querySelector( '.current-menu-item' ); + + if ( activeMenuItem ) { + twentytwentyFindParents( activeMenuItem, 'li' ).forEach( function( element ) { + var subMenuToggle = element.querySelector( '.sub-menu-toggle' ); + if ( subMenuToggle ) { + twentytwenty.toggles.performToggle( subMenuToggle, true ); + } + } ); + } + } ); + }, + + keepFocusInModal: function() { + var _doc = document; + + _doc.addEventListener( 'keydown', function( event ) { + var toggleTarget, modal, selectors, elements, menuType, bottomMenu, activeEl, lastEl, firstEl, tabKey, shiftKey, + clickedEl = twentytwenty.toggles.clickedEl; + + if ( clickedEl && _doc.body.classList.contains( 'showing-modal' ) ) { + toggleTarget = clickedEl.dataset.toggleTarget; + selectors = 'input, a, button'; + modal = _doc.querySelector( toggleTarget ); + + elements = modal.querySelectorAll( selectors ); + elements = Array.prototype.slice.call( elements ); + + if ( '.menu-modal' === toggleTarget ) { + menuType = window.matchMedia( '(min-width: 1000px)' ).matches; + menuType = menuType ? '.expanded-menu' : '.mobile-menu'; + + elements = elements.filter( function( element ) { + return null !== element.closest( menuType ) && null !== element.offsetParent; + } ); + + elements.unshift( _doc.querySelector( '.close-nav-toggle' ) ); + + bottomMenu = _doc.querySelector( '.menu-bottom > nav' ); + + if ( bottomMenu ) { + bottomMenu.querySelectorAll( selectors ).forEach( function( element ) { + elements.push( element ); + } ); + } + } + + lastEl = elements[ elements.length - 1 ]; + firstEl = elements[0]; + activeEl = _doc.activeElement; + tabKey = event.keyCode === 9; + shiftKey = event.shiftKey; + + if ( ! shiftKey && tabKey && lastEl === activeEl ) { + event.preventDefault(); + firstEl.focus(); + } + + if ( shiftKey && tabKey && firstEl === activeEl ) { + event.preventDefault(); + lastEl.focus(); + } + } + } ); + } +}; // twentytwenty.modalMenu + +/* ----------------------------------------------------------------------------------------------- + Primary Menu +--------------------------------------------------------------------------------------------------- */ + +twentytwenty.primaryMenu = { + + init: function() { + this.focusMenuWithChildren(); + }, + + // The focusMenuWithChildren() function implements Keyboard Navigation in the Primary Menu + // by adding the '.focus' class to all 'li.menu-item-has-children' when the focus is on the 'a' element. + focusMenuWithChildren: function() { + // Get all the link elements within the primary menu. + var links, i, len, + menu = document.querySelector( '.primary-menu-wrapper' ); + + if ( ! menu ) { + return false; + } + + links = menu.getElementsByTagName( 'a' ); + + // Each time a menu link is focused or blurred, toggle focus. + for ( i = 0, len = links.length; i < len; i++ ) { + links[i].addEventListener( 'focus', toggleFocus, true ); + links[i].addEventListener( 'blur', toggleFocus, true ); + } + + //Sets or removes the .focus class on an element. + function toggleFocus() { + var self = this; + + // Move up through the ancestors of the current link until we hit .primary-menu. + while ( -1 === self.className.indexOf( 'primary-menu' ) ) { + // On li elements toggle the class .focus. + if ( 'li' === self.tagName.toLowerCase() ) { + if ( -1 !== self.className.indexOf( 'focus' ) ) { + self.className = self.className.replace( ' focus', '' ); + } else { + self.className += ' focus'; + } + } + self = self.parentElement; + } + } + } +}; // twentytwenty.primaryMenu + +/* ----------------------------------------------------------------------------------------------- + Toggles +--------------------------------------------------------------------------------------------------- */ + +twentytwenty.toggles = { + + clickedEl: false, + + init: function() { + // Do the toggle. + this.toggle(); + + // Check for toggle/untoggle on resize. + this.resizeCheck(); + + // Check for untoggle on escape key press. + this.untoggleOnEscapeKeyPress(); + }, + + performToggle: function( element, instantly ) { + var target, timeOutTime, classToToggle, + self = this, + _doc = document, + // Get our targets. + toggle = element, + targetString = toggle.dataset.toggleTarget, + activeClass = 'active'; + + // Elements to focus after modals are closed. + if ( ! _doc.querySelectorAll( '.show-modal' ).length ) { + self.clickedEl = _doc.activeElement; + } + + if ( targetString === 'next' ) { + target = toggle.nextSibling; + } else { + target = _doc.querySelector( targetString ); + } + + // Trigger events on the toggle targets before they are toggled. + if ( target.classList.contains( activeClass ) ) { + target.dispatchEvent( twentytwenty.createEvent( 'toggle-target-before-active' ) ); + } else { + target.dispatchEvent( twentytwenty.createEvent( 'toggle-target-before-inactive' ) ); + } + + // Get the class to toggle, if specified. + classToToggle = toggle.dataset.classToToggle ? toggle.dataset.classToToggle : activeClass; + + // For cover modals, set a short timeout duration so the class animations have time to play out. + timeOutTime = 0; + + if ( target.classList.contains( 'cover-modal' ) ) { + timeOutTime = 10; + } + + setTimeout( function() { + var focusElement, + subMenued = target.classList.contains( 'sub-menu' ), + newTarget = subMenued ? toggle.closest( '.menu-item' ).querySelector( '.sub-menu' ) : target, + duration = toggle.dataset.toggleDuration; + + // Toggle the target of the clicked toggle. + if ( toggle.dataset.toggleType === 'slidetoggle' && ! instantly && duration !== '0' ) { + twentytwentyMenuToggle( newTarget, duration ); + } else { + newTarget.classList.toggle( classToToggle ); + } + + // If the toggle target is 'next', only give the clicked toggle the active class. + if ( targetString === 'next' ) { + toggle.classList.toggle( activeClass ); + } else if ( target.classList.contains( 'sub-menu' ) ) { + toggle.classList.toggle( activeClass ); + } else { + // If not, toggle all toggles with this toggle target. + _doc.querySelector( '*[data-toggle-target="' + targetString + '"]' ).classList.toggle( activeClass ); + } + + // Toggle aria-expanded on the toggle. + twentytwentyToggleAttribute( toggle, 'aria-expanded', 'true', 'false' ); + + if ( self.clickedEl && -1 !== toggle.getAttribute( 'class' ).indexOf( 'close-' ) ) { + twentytwentyToggleAttribute( self.clickedEl, 'aria-expanded', 'true', 'false' ); + } + + // Toggle body class. + if ( toggle.dataset.toggleBodyClass ) { + _doc.body.classList.toggle( toggle.dataset.toggleBodyClass ); + } + + // Check whether to set focus. + if ( toggle.dataset.setFocus ) { + focusElement = _doc.querySelector( toggle.dataset.setFocus ); + + if ( focusElement ) { + if ( target.classList.contains( activeClass ) ) { + focusElement.focus(); + } else { + focusElement.blur(); + } + } + } + + // Trigger the toggled event on the toggle target. + target.dispatchEvent( twentytwenty.createEvent( 'toggled' ) ); + + // Trigger events on the toggle targets after they are toggled. + if ( target.classList.contains( activeClass ) ) { + target.dispatchEvent( twentytwenty.createEvent( 'toggle-target-after-active' ) ); + } else { + target.dispatchEvent( twentytwenty.createEvent( 'toggle-target-after-inactive' ) ); + } + }, timeOutTime ); + }, + + // Do the toggle. + toggle: function() { + var self = this; + + document.querySelectorAll( '*[data-toggle-target]' ).forEach( function( element ) { + element.addEventListener( 'click', function( event ) { + event.preventDefault(); + self.performToggle( element ); + } ); + } ); + }, + + // Check for toggle/untoggle on screen resize. + resizeCheck: function() { + if ( document.querySelectorAll( '*[data-untoggle-above], *[data-untoggle-below], *[data-toggle-above], *[data-toggle-below]' ).length ) { + window.addEventListener( 'resize', function() { + var winWidth = window.innerWidth, + toggles = document.querySelectorAll( '.toggle' ); + + toggles.forEach( function( toggle ) { + var unToggleAbove = toggle.dataset.untoggleAbove, + unToggleBelow = toggle.dataset.untoggleBelow, + toggleAbove = toggle.dataset.toggleAbove, + toggleBelow = toggle.dataset.toggleBelow; + + // If no width comparison is set, continue. + if ( ! unToggleAbove && ! unToggleBelow && ! toggleAbove && ! toggleBelow ) { + return; + } + + // If the toggle width comparison is true, toggle the toggle. + if ( + ( ( ( unToggleAbove && winWidth > unToggleAbove ) || + ( unToggleBelow && winWidth < unToggleBelow ) ) && + toggle.classList.contains( 'active' ) ) || + ( ( ( toggleAbove && winWidth > toggleAbove ) || + ( toggleBelow && winWidth < toggleBelow ) ) && + ! toggle.classList.contains( 'active' ) ) + ) { + toggle.click(); + } + } ); + } ); + } + }, + + // Close toggle on escape key press. + untoggleOnEscapeKeyPress: function() { + document.addEventListener( 'keyup', function( event ) { + if ( event.key === 'Escape' ) { + document.querySelectorAll( '*[data-untoggle-on-escape].active' ).forEach( function( element ) { + if ( element.classList.contains( 'active' ) ) { + element.click(); + } + } ); + } + } ); + } + +}; // twentytwenty.toggles + +/** + * 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 twentytwentyDomReady( fn ) { + if ( typeof fn !== 'function' ) { + return; + } + + if ( document.readyState === 'interactive' || document.readyState === 'complete' ) { + return fn(); + } + + document.addEventListener( 'DOMContentLoaded', fn, false ); +} + +twentytwentyDomReady( function() { + twentytwenty.toggles.init(); // Handle toggles. + twentytwenty.coverModals.init(); // Handle cover modals. + twentytwenty.intrinsicRatioVideos.init(); // Retain aspect ratio of videos on window resize. + twentytwenty.modalMenu.init(); // Modal Menu. + twentytwenty.primaryMenu.init(); // Primary Menu. + twentytwenty.touchEnabled.init(); // Add class to body if device is touch-enabled. +} ); + +/* ----------------------------------------------------------------------------------------------- + Helper functions +--------------------------------------------------------------------------------------------------- */ + +/* Toggle an attribute ----------------------- */ + +function twentytwentyToggleAttribute( element, attribute, trueVal, falseVal ) { + if ( trueVal === undefined ) { + trueVal = true; + } + if ( falseVal === undefined ) { + falseVal = false; + } + if ( element.getAttribute( attribute ) !== trueVal ) { + element.setAttribute( attribute, trueVal ); + } else { + element.setAttribute( attribute, falseVal ); + } +} + +/** + * Toggle a menu item on or off. + * + * @param {HTMLElement} target + * @param {number} duration + */ +function twentytwentyMenuToggle( target, duration ) { + var initialParentHeight, finalParentHeight, menu, menuItems, transitionListener, + initialPositions = [], + finalPositions = []; + + if ( ! target ) { + return; + } + + menu = target.closest( '.menu-wrapper' ); + + // Step 1: look at the initial positions of every menu item. + menuItems = menu.querySelectorAll( '.menu-item' ); + + menuItems.forEach( function( menuItem, index ) { + initialPositions[ index ] = { x: menuItem.offsetLeft, y: menuItem.offsetTop }; + } ); + initialParentHeight = target.parentElement.offsetHeight; + + target.classList.add( 'toggling-target' ); + + // Step 2: toggle target menu item and look at the final positions of every menu item. + target.classList.toggle( 'active' ); + + menuItems.forEach( function( menuItem, index ) { + finalPositions[ index ] = { x: menuItem.offsetLeft, y: menuItem.offsetTop }; + } ); + finalParentHeight = target.parentElement.offsetHeight; + + // Step 3: close target menu item again. + // The whole process happens without giving the browser a chance to render, so it's invisible. + target.classList.toggle( 'active' ); + + /* + * Step 4: prepare animation. + * Position all the items with absolute offsets, at the same starting position. + * Shouldn't result in any visual changes if done right. + */ + menu.classList.add( 'is-toggling' ); + target.classList.toggle( 'active' ); + menuItems.forEach( function( menuItem, index ) { + var initialPosition = initialPositions[ index ]; + if ( initialPosition.y === 0 && menuItem.parentElement === target ) { + initialPosition.y = initialParentHeight; + } + menuItem.style.transform = 'translate(' + initialPosition.x + 'px, ' + initialPosition.y + 'px)'; + } ); + + /* + * The double rAF is unfortunately needed, since we're toggling CSS classes, and + * the only way to ensure layout completion here across browsers is to wait twice. + * This just delays the start of the animation by 2 frames and is thus not an issue. + */ + requestAnimationFrame( function() { + requestAnimationFrame( function() { + /* + * Step 5: start animation by moving everything to final position. + * All the layout work has already happened, while we were preparing for the animation. + * The animation now runs entirely in CSS, using cheap CSS properties (opacity and transform) + * that don't trigger the layout or paint stages. + */ + menu.classList.add( 'is-animating' ); + menuItems.forEach( function( menuItem, index ) { + var finalPosition = finalPositions[ index ]; + if ( finalPosition.y === 0 && menuItem.parentElement === target ) { + finalPosition.y = finalParentHeight; + } + if ( duration !== undefined ) { + menuItem.style.transitionDuration = duration + 'ms'; + } + menuItem.style.transform = 'translate(' + finalPosition.x + 'px, ' + finalPosition.y + 'px)'; + } ); + if ( duration !== undefined ) { + target.style.transitionDuration = duration + 'ms'; + } + } ); + + // Step 6: finish toggling. + // Remove all transient classes when the animation ends. + transitionListener = function() { + menu.classList.remove( 'is-animating' ); + menu.classList.remove( 'is-toggling' ); + target.classList.remove( 'toggling-target' ); + menuItems.forEach( function( menuItem ) { + menuItem.style.transform = ''; + menuItem.style.transitionDuration = ''; + } ); + target.style.transitionDuration = ''; + target.removeEventListener( 'transitionend', transitionListener ); + }; + + target.addEventListener( 'transitionend', transitionListener ); + } ); +} + +/** + * Traverses the DOM up to find elements matching the query. + * + * @param {HTMLElement} target + * @param {string} query + * @return {NodeList} parents matching query + */ +function twentytwentyFindParents( target, query ) { + var parents = []; + + // Recursively go up the DOM adding matches to the parents array. + function traverse( item ) { + var parent = item.parentNode; + if ( parent instanceof HTMLElement ) { + if ( parent.matches( query ) ) { + parents.push( parent ); + } + traverse( parent ); + } + } + + traverse( target ); + + return parents; +} diff --git a/content/themes/twentytwenty/assets/js/skip-link-focus-fix.js b/content/themes/twentytwenty/assets/js/skip-link-focus-fix.js new file mode 100644 index 0000000..181b797 --- /dev/null +++ b/content/themes/twentytwenty/assets/js/skip-link-focus-fix.js @@ -0,0 +1,33 @@ +/** + * File skip-link-focus-fix.js. + * + * Helps with accessibility for keyboard only users. + * + * This is the source file for what is minified in the twentytwenty_skip_link_focus_fix() PHP function. + * + * Learn more: https://git.io/vWdr2 + */ +( function() { + var isIe = /(trident|msie)/i.test( navigator.userAgent ); + + if ( isIe && document.getElementById && window.addEventListener ) { + window.addEventListener( 'hashchange', function() { + var id = location.hash.substring( 1 ), + element; + + if ( ! ( /^[A-z0-9_-]+$/.test( id ) ) ) { + return; + } + + element = document.getElementById( id ); + + if ( element ) { + if ( ! ( /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) ) { + element.tabIndex = -1; + } + + element.focus(); + } + }, false ); + } +}() ); diff --git a/content/themes/twentytwenty/classes/class-twentytwenty-customize.php b/content/themes/twentytwenty/classes/class-twentytwenty-customize.php new file mode 100644 index 0000000..ff7c70c --- /dev/null +++ b/content/themes/twentytwenty/classes/class-twentytwenty-customize.php @@ -0,0 +1,526 @@ +get_setting( 'blogname' )->transport = 'postMessage'; + $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; + + $wp_customize->selective_refresh->add_partial( + 'blogname', + array( + 'selector' => '.site-title a', + 'render_callback' => 'twentytwenty_customize_partial_blogname', + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'blogdescription', + array( + 'selector' => '.site-description', + 'render_callback' => 'twentytwenty_customize_partial_blogdescription', + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'custom_logo', + array( + 'selector' => '.header-titles [class*=site-]:not(.site-description)', + 'render_callback' => 'twentytwenty_customize_partial_site_logo', + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'retina_logo', + array( + 'selector' => '.header-titles [class*=site-]:not(.site-description)', + 'render_callback' => 'twentytwenty_customize_partial_site_logo', + ) + ); + + /** + * Site Identity + */ + + /* 2X Header Logo ---------------- */ + $wp_customize->add_setting( + 'retina_logo', + array( + 'capability' => 'edit_theme_options', + 'sanitize_callback' => array( __CLASS__, 'sanitize_checkbox' ), + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'retina_logo', + array( + 'type' => 'checkbox', + 'section' => 'title_tagline', + 'priority' => 10, + 'label' => __( 'Retina logo', 'twentytwenty' ), + 'description' => __( 'Scales the logo to half its uploaded size, making it sharp on high-res screens.', 'twentytwenty' ), + ) + ); + + // Header & Footer Background Color. + $wp_customize->add_setting( + 'header_footer_background_color', + array( + 'default' => '#ffffff', + 'sanitize_callback' => 'sanitize_hex_color', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'header_footer_background_color', + array( + 'label' => __( 'Header & Footer Background Color', 'twentytwenty' ), + 'section' => 'colors', + ) + ) + ); + + // Enable picking an accent color. + $wp_customize->add_setting( + 'accent_hue_active', + array( + 'capability' => 'edit_theme_options', + 'sanitize_callback' => array( __CLASS__, 'sanitize_select' ), + 'transport' => 'postMessage', + 'default' => 'default', + ) + ); + + $wp_customize->add_control( + 'accent_hue_active', + array( + 'type' => 'radio', + 'section' => 'colors', + 'label' => __( 'Primary Color', 'twentytwenty' ), + 'choices' => array( + 'default' => __( 'Default', 'twentytwenty' ), + 'custom' => __( 'Custom', 'twentytwenty' ), + ), + ) + ); + + /** + * Implementation for the accent color. + * This is different to all other color options because of the accessibility enhancements. + * The control is a hue-only colorpicker, and there is a separate setting that holds values + * for other colors calculated based on the selected hue and various background-colors on the page. + * + * @since Twenty Twenty 1.0 + */ + + // Add the setting for the hue colorpicker. + $wp_customize->add_setting( + 'accent_hue', + array( + 'default' => 344, + 'type' => 'theme_mod', + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage', + ) + ); + + // Add setting to hold colors derived from the accent hue. + $wp_customize->add_setting( + 'accent_accessible_colors', + array( + 'default' => array( + 'content' => array( + 'text' => '#000000', + 'accent' => '#cd2653', + 'secondary' => '#6d6d6d', + 'borders' => '#dcd7ca', + ), + 'header-footer' => array( + 'text' => '#000000', + 'accent' => '#cd2653', + 'secondary' => '#6d6d6d', + 'borders' => '#dcd7ca', + ), + ), + 'type' => 'theme_mod', + 'transport' => 'postMessage', + 'sanitize_callback' => array( __CLASS__, 'sanitize_accent_accessible_colors' ), + ) + ); + + // Add the hue-only colorpicker for the accent color. + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'accent_hue', + array( + 'section' => 'colors', + 'settings' => 'accent_hue', + 'description' => __( 'Apply a custom color for links, buttons, featured images.', 'twentytwenty' ), + 'mode' => 'hue', + 'active_callback' => function() use ( $wp_customize ) { + return ( 'custom' === $wp_customize->get_setting( 'accent_hue_active' )->value() ); + }, + ) + ) + ); + + // Update background color with postMessage, so inline CSS output is updated as well. + $wp_customize->get_setting( 'background_color' )->transport = 'postMessage'; + + /** + * Theme Options + */ + + $wp_customize->add_section( + 'options', + array( + 'title' => __( 'Theme Options', 'twentytwenty' ), + 'priority' => 40, + 'capability' => 'edit_theme_options', + ) + ); + + /* Enable Header Search ----------------------------------------------- */ + + $wp_customize->add_setting( + 'enable_header_search', + array( + 'capability' => 'edit_theme_options', + 'default' => true, + 'sanitize_callback' => array( __CLASS__, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'enable_header_search', + array( + 'type' => 'checkbox', + 'section' => 'options', + 'priority' => 10, + 'label' => __( 'Show search in header', 'twentytwenty' ), + ) + ); + + /* Show author bio ---------------------------------------------------- */ + + $wp_customize->add_setting( + 'show_author_bio', + array( + 'capability' => 'edit_theme_options', + 'default' => true, + 'sanitize_callback' => array( __CLASS__, 'sanitize_checkbox' ), + ) + ); + + $wp_customize->add_control( + 'show_author_bio', + array( + 'type' => 'checkbox', + 'section' => 'options', + 'priority' => 10, + 'label' => __( 'Show author bio', 'twentytwenty' ), + ) + ); + + /* Display full content or excerpts on the blog and archives --------- */ + + $wp_customize->add_setting( + 'blog_content', + array( + 'capability' => 'edit_theme_options', + 'default' => 'full', + 'sanitize_callback' => array( __CLASS__, 'sanitize_select' ), + ) + ); + + $wp_customize->add_control( + 'blog_content', + array( + 'type' => 'radio', + 'section' => 'options', + 'priority' => 10, + 'label' => __( 'On archive pages, posts show:', 'twentytwenty' ), + 'choices' => array( + 'full' => __( 'Full text', 'twentytwenty' ), + 'summary' => __( 'Summary', 'twentytwenty' ), + ), + ) + ); + + /** + * Template: Cover Template. + */ + $wp_customize->add_section( + 'cover_template_options', + array( + 'title' => __( 'Cover Template', 'twentytwenty' ), + 'capability' => 'edit_theme_options', + 'description' => __( 'Settings for the "Cover Template" page template. Add a featured image to use as background.', 'twentytwenty' ), + 'priority' => 42, + ) + ); + + /* Overlay Fixed Background ------ */ + + $wp_customize->add_setting( + 'cover_template_fixed_background', + array( + 'capability' => 'edit_theme_options', + 'default' => true, + 'sanitize_callback' => array( __CLASS__, 'sanitize_checkbox' ), + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'cover_template_fixed_background', + array( + 'type' => 'checkbox', + 'section' => 'cover_template_options', + 'label' => __( 'Fixed Background Image', 'twentytwenty' ), + 'description' => __( 'Creates a parallax effect when the visitor scrolls.', 'twentytwenty' ), + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'cover_template_fixed_background', + array( + 'selector' => '.cover-header', + 'type' => 'cover_fixed', + ) + ); + + /* Separator --------------------- */ + + $wp_customize->add_setting( + 'cover_template_separator_1', + array( + 'sanitize_callback' => 'wp_filter_nohtml_kses', + ) + ); + + $wp_customize->add_control( + new TwentyTwenty_Separator_Control( + $wp_customize, + 'cover_template_separator_1', + array( + 'section' => 'cover_template_options', + ) + ) + ); + + /* Overlay Background Color ------ */ + + $wp_customize->add_setting( + 'cover_template_overlay_background_color', + array( + 'default' => twentytwenty_get_color_for_area( 'content', 'accent' ), + 'sanitize_callback' => 'sanitize_hex_color', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'cover_template_overlay_background_color', + array( + 'label' => __( 'Overlay Background Color', 'twentytwenty' ), + 'description' => __( 'The color used for the overlay. Defaults to the accent color.', 'twentytwenty' ), + 'section' => 'cover_template_options', + ) + ) + ); + + /* Overlay Text Color ------------ */ + + $wp_customize->add_setting( + 'cover_template_overlay_text_color', + array( + 'default' => '#ffffff', + 'sanitize_callback' => 'sanitize_hex_color', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Color_Control( + $wp_customize, + 'cover_template_overlay_text_color', + array( + 'label' => __( 'Overlay Text Color', 'twentytwenty' ), + 'description' => __( 'The color used for the text in the overlay.', 'twentytwenty' ), + 'section' => 'cover_template_options', + ) + ) + ); + + /* Overlay Color Opacity --------- */ + + $wp_customize->add_setting( + 'cover_template_overlay_opacity', + array( + 'default' => 80, + 'sanitize_callback' => 'absint', + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + 'cover_template_overlay_opacity', + array( + 'label' => __( 'Overlay Opacity', 'twentytwenty' ), + 'description' => __( 'Make sure that the contrast is high enough so that the text is readable.', 'twentytwenty' ), + 'section' => 'cover_template_options', + 'type' => 'range', + 'input_attrs' => twentytwenty_customize_opacity_range(), + ) + ); + + $wp_customize->selective_refresh->add_partial( + 'cover_template_overlay_opacity', + array( + 'selector' => '.cover-color-overlay', + 'type' => 'cover_opacity', + ) + ); + } + + /** + * Sanitization callback for the "accent_accessible_colors" setting. + * + * @static + * @access public + * @since Twenty Twenty 1.0 + * @param array $value The value we want to sanitize. + * @return array Returns sanitized value. Each item in the array gets sanitized separately. + */ + public static function sanitize_accent_accessible_colors( $value ) { + + // Make sure the value is an array. Do not typecast, use empty array as fallback. + $value = is_array( $value ) ? $value : array(); + + // Loop values. + foreach ( $value as $area => $values ) { + foreach ( $values as $context => $color_val ) { + $value[ $area ][ $context ] = sanitize_hex_color( $color_val ); + } + } + + return $value; + } + + /** + * Sanitize select. + * + * @param string $input The input from the setting. + * @param object $setting The selected setting. + * + * @return string $input|$setting->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 boolean for checkbox. + * + * @param bool $checked Whether or not a box is checked. + * + * @return bool + */ + public static function sanitize_checkbox( $checked ) { + return ( ( isset( $checked ) && true === $checked ) ? true : false ); + } + + } + + // Setup the Theme Customizer settings and controls. + add_action( 'customize_register', array( 'TwentyTwenty_Customize', 'register' ) ); + +} + +/** + * PARTIAL REFRESH FUNCTIONS + * */ +if ( ! function_exists( 'twentytwenty_customize_partial_blogname' ) ) { + /** + * Render the site title for the selective refresh partial. + */ + function twentytwenty_customize_partial_blogname() { + bloginfo( 'name' ); + } +} + +if ( ! function_exists( 'twentytwenty_customize_partial_blogdescription' ) ) { + /** + * Render the site description for the selective refresh partial. + */ + function twentytwenty_customize_partial_blogdescription() { + bloginfo( 'description' ); + } +} + +if ( ! function_exists( 'twentytwenty_customize_partial_site_logo' ) ) { + /** + * Render the site logo for the selective refresh partial. + * + * Doing it this way so we don't have issues with `render_callback`'s arguments. + */ + function twentytwenty_customize_partial_site_logo() { + twentytwenty_site_logo(); + } +} + + +/** + * Input attributes for cover overlay opacity option. + * + * @return array Array containing attribute names and their values. + */ +function twentytwenty_customize_opacity_range() { + /** + * Filter the input attributes for opacity + * + * @param array $attrs { + * The attributes + * + * @type int $min Minimum value + * @type int $max Maximum value + * @type int $step Interval between numbers + * } + */ + return apply_filters( + 'twentytwenty_customize_opacity_range', + array( + 'min' => 0, + 'max' => 90, + 'step' => 5, + ) + ); +} diff --git a/content/themes/twentytwenty/classes/class-twentytwenty-non-latin-languages.php b/content/themes/twentytwenty/classes/class-twentytwenty-non-latin-languages.php new file mode 100644 index 0000000..df95c56 --- /dev/null +++ b/content/themes/twentytwenty/classes/class-twentytwenty-non-latin-languages.php @@ -0,0 +1,122 @@ + array( 'Tahoma', 'Arial', 'sans-serif' ), + 'ary' => array( 'Tahoma', 'Arial', 'sans-serif' ), + 'azb' => array( 'Tahoma', 'Arial', 'sans-serif' ), + 'ckb' => array( 'Tahoma', 'Arial', 'sans-serif' ), + 'fa-IR' => array( 'Tahoma', 'Arial', 'sans-serif' ), + 'haz' => array( 'Tahoma', 'Arial', 'sans-serif' ), + 'ps' => array( 'Tahoma', 'Arial', 'sans-serif' ), + + // Chinese Simplified (China) - Noto Sans SC. + 'zh-CN' => array( '\'PingFang SC\'', '\'Helvetica Neue\'', '\'Microsoft YaHei New\'', '\'STHeiti Light\'', 'sans-serif' ), + + // Chinese Traditional (Taiwan) - Noto Sans TC. + 'zh-TW' => array( '\'PingFang TC\'', '\'Helvetica Neue\'', '\'Microsoft YaHei New\'', '\'STHeiti Light\'', 'sans-serif' ), + + // Chinese (Hong Kong) - Noto Sans HK. + 'zh-HK' => array( '\'PingFang HK\'', '\'Helvetica Neue\'', '\'Microsoft YaHei New\'', '\'STHeiti Light\'', 'sans-serif' ), + + // Cyrillic. + 'bel' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + 'bg-BG' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + 'kk' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + 'mk-MK' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + 'mn' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + 'ru-RU' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + 'sah' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + 'sr-RS' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + 'tt-RU' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + 'uk' => array( '\'Helvetica Neue\'', 'Helvetica', '\'Segoe UI\'', 'Arial', 'sans-serif' ), + + // Devanagari. + 'bn-BD' => array( 'Arial', 'sans-serif' ), + 'hi-IN' => array( 'Arial', 'sans-serif' ), + 'mr' => array( 'Arial', 'sans-serif' ), + 'ne-NP' => array( 'Arial', 'sans-serif' ), + + // Greek. + 'el' => array( '\'Helvetica Neue\', Helvetica, Arial, sans-serif' ), + + // Gujarati. + 'gu' => array( 'Arial', 'sans-serif' ), + + // Hebrew. + 'he-IL' => array( '\'Arial Hebrew\'', 'Arial', 'sans-serif' ), + + // Japanese. + 'ja' => array( 'sans-serif' ), + + // Korean. + 'ko-KR' => array( '\'Apple SD Gothic Neo\'', '\'Malgun Gothic\'', '\'Nanum Gothic\'', 'Dotum', 'sans-serif' ), + + // Thai. + 'th' => array( '\'Sukhumvit Set\'', '\'Helvetica Neue\'', 'Helvetica', 'Arial', 'sans-serif' ), + + // Vietnamese. + 'vi' => array( '\'Libre Franklin\'', 'sans-serif' ), + + ) + ); + + // Return if the selected language has no fallback fonts. + if ( empty( $font_family[ $locale ] ) ) { + return; + } + + // Define elements to apply fallback fonts to. + $elements = apply_filters( + 'twentytwenty_get_localized_font_family_elements', + array( + 'front-end' => array( 'body', 'input', 'textarea', 'button', '.button', '.faux-button', '.wp-block-button__link', '.wp-block-file__button', '.has-drop-cap:not(:focus)::first-letter', '.has-drop-cap:not(:focus)::first-letter', '.entry-content .wp-block-archives', '.entry-content .wp-block-categories', '.entry-content .wp-block-cover-image', '.entry-content .wp-block-latest-comments', '.entry-content .wp-block-latest-posts', '.entry-content .wp-block-pullquote', '.entry-content .wp-block-quote.is-large', '.entry-content .wp-block-quote.is-style-large', '.entry-content .wp-block-archives *', '.entry-content .wp-block-categories *', '.entry-content .wp-block-latest-posts *', '.entry-content .wp-block-latest-comments *', '.entry-content p', '.entry-content ol', '.entry-content ul', '.entry-content dl', '.entry-content dt', '.entry-content cite', '.entry-content figcaption', '.entry-content .wp-caption-text', '.comment-content p', '.comment-content ol', '.comment-content ul', '.comment-content dl', '.comment-content dt', '.comment-content cite', '.comment-content figcaption', '.comment-content .wp-caption-text', '.widget_text p', '.widget_text ol', '.widget_text ul', '.widget_text dl', '.widget_text dt', '.widget-content .rssSummary', '.widget-content cite', '.widget-content figcaption', '.widget-content .wp-caption-text' ), + 'block-editor' => array( '.editor-styles-wrapper > *', '.editor-styles-wrapper p', '.editor-styles-wrapper ol', '.editor-styles-wrapper ul', '.editor-styles-wrapper dl', '.editor-styles-wrapper dt', '.editor-post-title__block .editor-post-title__input', '.editor-styles-wrapper .wp-block h1', '.editor-styles-wrapper .wp-block h2', '.editor-styles-wrapper .wp-block h3', '.editor-styles-wrapper .wp-block h4', '.editor-styles-wrapper .wp-block h5', '.editor-styles-wrapper .wp-block h6', '.editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter', '.editor-styles-wrapper cite', '.editor-styles-wrapper figcaption', '.editor-styles-wrapper .wp-caption-text' ), + 'classic-editor' => array( 'body#tinymce.wp-editor', 'body#tinymce.wp-editor p', 'body#tinymce.wp-editor ol', 'body#tinymce.wp-editor ul', 'body#tinymce.wp-editor dl', 'body#tinymce.wp-editor dt', 'body#tinymce.wp-editor figcaption', 'body#tinymce.wp-editor .wp-caption-text', 'body#tinymce.wp-editor .wp-caption-dd', 'body#tinymce.wp-editor cite', 'body#tinymce.wp-editor table' ), + ) + ); + + // Return if the specified type doesn't exist. + if ( empty( $elements[ $type ] ) ) { + return; + } + + // Return the specified styles. + return twentytwenty_generate_css( implode( ',', $elements[ $type ] ), 'font-family', implode( ',', $font_family[ $locale ] ), null, null, false ); + + } + } +} diff --git a/content/themes/twentytwenty/classes/class-twentytwenty-script-loader.php b/content/themes/twentytwenty/classes/class-twentytwenty-script-loader.php new file mode 100644 index 0000000..cc05187 --- /dev/null +++ b/content/themes/twentytwenty/classes/class-twentytwenty-script-loader.php @@ -0,0 +1,47 @@ +get_data( $handle, $attr ) ) { + continue; + } + // Prevent adding attribute when already added in #12009. + if ( ! preg_match( ":\s$attr(=|>|\s):", $tag ) ) { + $tag = preg_replace( ':(?=>):', " $attr", $tag, 1 ); + } + // Only allow async or defer, not both. + break; + } + return $tag; + } + + } +} diff --git a/content/themes/twentytwenty/classes/class-twentytwenty-separator-control.php b/content/themes/twentytwenty/classes/class-twentytwenty-separator-control.php new file mode 100644 index 0000000..0682373 --- /dev/null +++ b/content/themes/twentytwenty/classes/class-twentytwenty-separator-control.php @@ -0,0 +1,26 @@ +'; + } + + } + } +} diff --git a/content/themes/twentytwenty/classes/class-twentytwenty-svg-icons.php b/content/themes/twentytwenty/classes/class-twentytwenty-svg-icons.php new file mode 100644 index 0000000..9e50f6b --- /dev/null +++ b/content/themes/twentytwenty/classes/class-twentytwenty-svg-icons.php @@ -0,0 +1,267 @@ +\s*<', $svg ); // Remove whitespace between SVG tags. + return $svg; + } + return null; + } + + /** + * GET SOCIAL LINK SVG + * Detects the social network from a URL and returns the SVG code for its icon. + * + * @param string $uri The URL to retrieve SVG for. + */ + public static function get_social_link_svg( $uri ) { + 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 twentytwenty_get_theme_svg( $icon, 'social' ); + } + } + return null; + } + + /** + * ICON STORAGE + * Store the code for all SVGs in an array. + * + * @var array + */ + public static $ui_icons = array( + 'arrow-down' => ' + + ', + 'arrow-down-circled' => ' + + ', + 'bookmark' => ' + + ', + 'calendar' => ' + + ', + 'chevron-down' => ' + + ', + 'comment' => ' + + ', + 'cross' => ' + + ', + 'ellipsis' => ' + + ', + 'edit' => ' + + ', + 'folder' => ' + + ', + 'link' => ' + + ', + 'search' => ' + + ', + 'tag' => ' + + ', + 'user' => ' + + ', + ); + + /** + * 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', + ), + 'facebook' => array( + 'facebook.com', + 'fb.me', + ), + 'feed' => array( + 'feed', + ), + 'google' => array( + 'g.page', + ), + 'lastfm' => array( + 'last.fm', + ), + 'mail' => array( + 'mailto:', + ), + 'pocket' => array( + 'getpocket.com', + ), + 'twitch' => array( + 'twitch.tv', + ), + 'wordpress' => array( + 'wordpress.com', + 'wordpress.org', + ), + ); + + /** + * Social Icons – svg sources. + * + * @var array + */ + public static $social_icons = array( + '500px' => '', + + 'amazon' => '', + + 'bandcamp' => '', + + 'behance' => '', + + 'codepen' => '', + + 'deviantart' => '', + + 'dribbble' => '', + + 'dropbox' => '', + + 'etsy' => '', + + 'facebook' => '', + + 'feed' => '', + + 'flickr' => '', + + 'foursquare' => '', + + 'goodreads' => '', + + 'google' => '', + + 'github' => '', + + 'instagram' => '', + + 'lastfm' => '', + + 'linkedin' => '', + + 'mail' => '', + + 'mastodon' => '', + + 'medium' => '', + + 'meetup' => '', + + 'pinterest' => '', + + 'pocket' => '', + + 'reddit' => '', + + 'skype' => '', + + 'snapchat' => '', + + 'soundcloud' => '', + + 'spotify' => '', + + 'tumblr' => '', + + 'tiktok' => '', + + 'twitch' => '', + + 'twitter' => '', + + 'vimeo' => '', + + 'vk' => '', + + 'whatsapp' => ' +', + + // phpcs:disable WordPress.WP.CapitalPDangit.Misspelled + 'wordpress' => '', + + 'yelp' => '', + + 'youtube' => '', + + ); + + } +} diff --git a/content/themes/twentytwenty/classes/class-twentytwenty-walker-comment.php b/content/themes/twentytwenty/classes/class-twentytwenty-walker-comment.php new file mode 100644 index 0000000..eda038e --- /dev/null +++ b/content/themes/twentytwenty/classes/class-twentytwenty-walker-comment.php @@ -0,0 +1,142 @@ + + < id="comment-" has_children ? 'parent' : '', $comment ); ?>> +
      + + +
      + + comment_approved ) { + ?> +

      + + +
      + + 'div-comment', + 'depth' => $depth, + 'max_depth' => $args['max_depth'], + 'before' => '', + 'after' => '', + ) + ) + ); + + $by_post_author = twentytwenty_is_comment_by_post_author( $comment ); + + if ( $comment_reply_link || $by_post_author ) { + ?> + +
      + + ' . __( 'By Post Author', 'twentytwenty' ) . ''; + } + ?> + +
      + + + +
      + + ID ); + + if ( isset( $args['pages_with_children'][ $page->ID ] ) ) { + $css_class[] = 'page_item_has_children'; + } + + if ( ! empty( $current_page ) ) { + $_current_page = get_post( $current_page ); + if ( $_current_page && in_array( $page->ID, $_current_page->ancestors, true ) ) { + $css_class[] = 'current_page_ancestor'; + } + if ( $page->ID === $current_page ) { + $css_class[] = 'current_page_item'; + } elseif ( $_current_page && $page->ID === $_current_page->post_parent ) { + $css_class[] = 'current_page_parent'; + } + } elseif ( get_option( 'page_for_posts' ) === $page->ID ) { + $css_class[] = 'current_page_parent'; + } + + /** This filter is documented in wp-includes/class-walker-page.php */ + $css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) ); + $css_classes = $css_classes ? ' class="' . esc_attr( $css_classes ) . '"' : ''; + + if ( '' === $page->post_title ) { + /* translators: %d: ID of a post. */ + $page->post_title = sprintf( __( '#%d (no title)', 'twentytwenty' ), $page->ID ); + } + + $args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before']; + $args['link_after'] = empty( $args['link_after'] ) ? '' : $args['link_after']; + + $atts = array(); + $atts['href'] = get_permalink( $page->ID ); + $atts['aria-current'] = ( $page->ID === $current_page ) ? 'page' : ''; + + /** This filter is documented in wp-includes/class-walker-page.php */ + $atts = apply_filters( 'page_menu_link_attributes', $atts, $page, $depth, $args, $current_page ); + + $attributes = ''; + foreach ( $atts as $attr => $value ) { + if ( ! empty( $value ) ) { + $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); + $attributes .= ' ' . $attr . '="' . $value . '"'; + } + } + + $args['list_item_before'] = ''; + $args['list_item_after'] = ''; + + // Wrap the link in a div and append a sub menu toggle. + if ( isset( $args['show_toggles'] ) && true === $args['show_toggles'] ) { + // Wrap the menu item link contents in a div, used for positioning. + $args['list_item_before'] = '
      '; + $args['list_item_after'] = ''; + + // Add a toggle to items with children. + if ( isset( $args['pages_with_children'][ $page->ID ] ) ) { + + $toggle_target_string = '.menu-modal .page-item-' . $page->ID . ' > ul'; + $toggle_duration = twentytwenty_toggle_duration(); + + // Add the sub menu toggle. + $args['list_item_after'] .= ''; + + } + + // Close the wrapper. + $args['list_item_after'] .= '
      '; + } + + // Add icons to menu items with children. + if ( isset( $args['show_sub_menu_icons'] ) && true === $args['show_sub_menu_icons'] ) { + if ( isset( $args['pages_with_children'][ $page->ID ] ) ) { + $args['list_item_after'] = ''; + } + } + + $output .= $indent . sprintf( + '%s%s%s%s%s', + $css_classes, + $args['list_item_before'], + $attributes, + $args['link_before'], + /** This filter is documented in wp-includes/post-template.php */ + apply_filters( 'the_title', $page->post_title, $page->ID ), + $args['link_after'], + $args['list_item_after'] + ); + + if ( ! empty( $args['show_date'] ) ) { + if ( 'modified' === $args['show_date'] ) { + $time = $page->post_modified; + } else { + $time = $page->post_date; + } + + $date_format = empty( $args['date_format'] ) ? '' : $args['date_format']; + $output .= ' ' . mysql2date( $date_format, $time ); + } + } + } +} diff --git a/content/themes/twentytwenty/comments.php b/content/themes/twentytwenty/comments.php new file mode 100644 index 0000000..9bc2d9b --- /dev/null +++ b/content/themes/twentytwenty/comments.php @@ -0,0 +1,132 @@ + + +
      + + + +
      + +

      + +

      + +
      + +
      + + new TwentyTwenty_Walker_Comment(), + 'avatar_size' => 120, + 'style' => 'div', + ) + ); + + $comment_pagination = paginate_comments_links( + array( + 'echo' => false, + 'end_size' => 0, + 'mid_size' => 0, + 'next_text' => __( 'Newer Comments', 'twentytwenty' ) . ' ', + 'prev_text' => ' ' . __( 'Older Comments', 'twentytwenty' ), + ) + ); + + if ( $comment_pagination ) { + $pagination_classes = ''; + + // If we're only showing the "Next" link, add a class indicating so. + if ( false === strpos( $comment_pagination, 'prev page-numbers' ) ) { + $pagination_classes = ' only-next'; + } + ?> + + + + + +
      + +
      + + '; + } + + comment_form( + array( + 'class_form' => 'section-inner thin max-percentage', + 'title_reply_before' => '

      ', + 'title_reply_after' => '

      ', + ) + ); + +} elseif ( is_single() ) { + + if ( $comments ) { + echo ''; + } + + ?> + +
      + +

      + +
      + + + + + + + + diff --git a/content/themes/twentytwenty/functions.php b/content/themes/twentytwenty/functions.php new file mode 100644 index 0000000..5fe5f58 --- /dev/null +++ b/content/themes/twentytwenty/functions.php @@ -0,0 +1,760 @@ + 'f5efe0', + ) + ); + + // Set content-width. + global $content_width; + if ( ! isset( $content_width ) ) { + $content_width = 580; + } + + /* + * 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' ); + + // Set post thumbnail size. + set_post_thumbnail_size( 1200, 9999 ); + + // Add custom image size used in Cover Template. + add_image_size( 'twentytwenty-fullscreen', 1980, 9999 ); + + // Custom logo. + $logo_width = 120; + $logo_height = 90; + + // If the retina setting is active, double the recommended width and height. + if ( get_theme_mod( 'retina_logo', false ) ) { + $logo_width = floor( $logo_width * 2 ); + $logo_height = floor( $logo_height * 2 ); + } + + add_theme_support( + 'custom-logo', + array( + 'height' => $logo_height, + 'width' => $logo_width, + 'flex-height' => true, + 'flex-width' => true, + ) + ); + + /* + * Let WordPress manage the document title. + * By adding theme support, we declare that this theme does not use a + * hard-coded tag in the document head, and expect WordPress to + * provide it for us. + */ + add_theme_support( 'title-tag' ); + + /* + * Switch default core markup for search form, comment form, and comments + * to output valid HTML5. + */ + add_theme_support( + 'html5', + array( + 'search-form', + 'comment-form', + 'comment-list', + 'gallery', + 'caption', + 'script', + 'style', + ) + ); + + /* + * Make theme available for translation. + * Translations can be filed in the /languages/ directory. + * If you're building a theme based on Twenty Twenty, use a find and replace + * to change 'twentytwenty' to the name of your theme in all the template files. + */ + load_theme_textdomain( 'twentytwenty' ); + + // Add support for full and wide align images. + add_theme_support( 'align-wide' ); + + // Add support for responsive embeds. + add_theme_support( 'responsive-embeds' ); + + /* + * Adds starter content to highlight the theme on fresh sites. + * This is done conditionally to avoid loading the starter content on every + * page load, as it is a one-off operation only needed once in the customizer. + */ + if ( is_customize_preview() ) { + require get_template_directory() . '/inc/starter-content.php'; + add_theme_support( 'starter-content', twentytwenty_get_starter_content() ); + } + + // Add theme support for selective refresh for widgets. + add_theme_support( 'customize-selective-refresh-widgets' ); + + /* + * Adds `async` and `defer` support for scripts registered or enqueued + * by the theme. + */ + $loader = new TwentyTwenty_Script_Loader(); + add_filter( 'script_loader_tag', array( $loader, 'filter_script_loader_tag' ), 10, 2 ); + +} + +add_action( 'after_setup_theme', 'twentytwenty_theme_support' ); + +/** + * REQUIRED FILES + * Include required files. + */ +require get_template_directory() . '/inc/template-tags.php'; + +// Handle SVG icons. +require get_template_directory() . '/classes/class-twentytwenty-svg-icons.php'; +require get_template_directory() . '/inc/svg-icons.php'; + +// Handle Customizer settings. +require get_template_directory() . '/classes/class-twentytwenty-customize.php'; + +// Require Separator Control class. +require get_template_directory() . '/classes/class-twentytwenty-separator-control.php'; + +// Custom comment walker. +require get_template_directory() . '/classes/class-twentytwenty-walker-comment.php'; + +// Custom page walker. +require get_template_directory() . '/classes/class-twentytwenty-walker-page.php'; + +// Custom script loader class. +require get_template_directory() . '/classes/class-twentytwenty-script-loader.php'; + +// Non-latin language handling. +require get_template_directory() . '/classes/class-twentytwenty-non-latin-languages.php'; + +// Custom CSS. +require get_template_directory() . '/inc/custom-css.php'; + +/** + * Register and Enqueue Styles. + */ +function twentytwenty_register_styles() { + + $theme_version = wp_get_theme()->get( 'Version' ); + + wp_enqueue_style( 'twentytwenty-style', get_stylesheet_uri(), array(), $theme_version ); + wp_style_add_data( 'twentytwenty-style', 'rtl', 'replace' ); + + // Add output of Customizer settings as inline style. + wp_add_inline_style( 'twentytwenty-style', twentytwenty_get_customizer_css( 'front-end' ) ); + + // Add print CSS. + wp_enqueue_style( 'twentytwenty-print-style', get_template_directory_uri() . '/print.css', null, $theme_version, 'print' ); + +} + +add_action( 'wp_enqueue_scripts', 'twentytwenty_register_styles' ); + +/** + * Register and Enqueue Scripts. + */ +function twentytwenty_register_scripts() { + + $theme_version = wp_get_theme()->get( 'Version' ); + + if ( ( ! is_admin() ) && is_singular() && comments_open() && get_option( 'thread_comments' ) ) { + wp_enqueue_script( 'comment-reply' ); + } + + wp_enqueue_script( 'twentytwenty-js', get_template_directory_uri() . '/assets/js/index.js', array(), $theme_version, false ); + wp_script_add_data( 'twentytwenty-js', 'async', true ); + +} + +add_action( 'wp_enqueue_scripts', 'twentytwenty_register_scripts' ); + +/** + * Fix skip link focus in IE11. + * + * This does not enqueue the script because it is tiny and because it is only for IE11, + * thus it does not warrant having an entire dedicated blocking script being loaded. + * + * @link https://git.io/vWdr2 + */ +function twentytwenty_skip_link_focus_fix() { + // The following is minified via `terser --compress --mangle -- assets/js/skip-link-focus-fix.js`. + ?> + <script> + /(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1); + </script> + <?php +} +add_action( 'wp_print_footer_scripts', 'twentytwenty_skip_link_focus_fix' ); + +/** Enqueue non-latin language styles + * + * @since Twenty Twenty 1.0 + * + * @return void + */ +function twentytwenty_non_latin_languages() { + $custom_css = TwentyTwenty_Non_Latin_Languages::get_non_latin_css( 'front-end' ); + + if ( $custom_css ) { + wp_add_inline_style( 'twentytwenty-style', $custom_css ); + } +} + +add_action( 'wp_enqueue_scripts', 'twentytwenty_non_latin_languages' ); + +/** + * Register navigation menus uses wp_nav_menu in five places. + */ +function twentytwenty_menus() { + + $locations = array( + 'primary' => __( 'Desktop Horizontal Menu', 'twentytwenty' ), + 'expanded' => __( 'Desktop Expanded Menu', 'twentytwenty' ), + 'mobile' => __( 'Mobile Menu', 'twentytwenty' ), + 'footer' => __( 'Footer Menu', 'twentytwenty' ), + 'social' => __( 'Social Menu', 'twentytwenty' ), + ); + + register_nav_menus( $locations ); +} + +add_action( 'init', 'twentytwenty_menus' ); + +/** + * Get the information about the logo. + * + * @param string $html The HTML output from get_custom_logo (core function). + * + * @return string $html + */ +function twentytwenty_get_custom_logo( $html ) { + + $logo_id = get_theme_mod( 'custom_logo' ); + + if ( ! $logo_id ) { + return $html; + } + + $logo = wp_get_attachment_image_src( $logo_id, 'full' ); + + if ( $logo ) { + // For clarity. + $logo_width = esc_attr( $logo[1] ); + $logo_height = esc_attr( $logo[2] ); + + // If the retina logo setting is active, reduce the width/height by half. + if ( get_theme_mod( 'retina_logo', false ) ) { + $logo_width = floor( $logo_width / 2 ); + $logo_height = floor( $logo_height / 2 ); + + $search = array( + '/width=\"\d+\"/iU', + '/height=\"\d+\"/iU', + ); + + $replace = array( + "width=\"{$logo_width}\"", + "height=\"{$logo_height}\"", + ); + + // Add a style attribute with the height, or append the height to the style attribute if the style attribute already exists. + if ( strpos( $html, ' style=' ) === false ) { + $search[] = '/(src=)/'; + $replace[] = "style=\"height: {$logo_height}px;\" src="; + } else { + $search[] = '/(style="[^"]*)/'; + $replace[] = "$1 height: {$logo_height}px;"; + } + + $html = preg_replace( $search, $replace, $html ); + + } + } + + return $html; + +} + +add_filter( 'get_custom_logo', 'twentytwenty_get_custom_logo' ); + +if ( ! function_exists( 'wp_body_open' ) ) { + + /** + * Shim for wp_body_open, ensuring backward compatibility with versions of WordPress older than 5.2. + */ + function wp_body_open() { + do_action( 'wp_body_open' ); + } +} + +/** + * Include a skip to content link at the top of the page so that users can bypass the menu. + */ +function twentytwenty_skip_link() { + echo '<a class="skip-link screen-reader-text" href="#site-content">' . __( 'Skip to the content', 'twentytwenty' ) . '</a>'; +} + +add_action( 'wp_body_open', 'twentytwenty_skip_link', 5 ); + +/** + * Register widget areas. + * + * @link https://developer.wordpress.org/themes/functionality/sidebars/#registering-a-sidebar + */ +function twentytwenty_sidebar_registration() { + + // Arguments used in all register_sidebar() calls. + $shared_args = array( + 'before_title' => '<h2 class="widget-title subheading heading-size-3">', + 'after_title' => '</h2>', + 'before_widget' => '<div class="widget %2$s"><div class="widget-content">', + 'after_widget' => '</div></div>', + ); + + // Footer #1. + register_sidebar( + array_merge( + $shared_args, + array( + 'name' => __( 'Footer #1', 'twentytwenty' ), + 'id' => 'sidebar-1', + 'description' => __( 'Widgets in this area will be displayed in the first column in the footer.', 'twentytwenty' ), + ) + ) + ); + + // Footer #2. + register_sidebar( + array_merge( + $shared_args, + array( + 'name' => __( 'Footer #2', 'twentytwenty' ), + 'id' => 'sidebar-2', + 'description' => __( 'Widgets in this area will be displayed in the second column in the footer.', 'twentytwenty' ), + ) + ) + ); + +} + +add_action( 'widgets_init', 'twentytwenty_sidebar_registration' ); + +/** + * Enqueue supplemental block editor styles. + */ +function twentytwenty_block_editor_styles() { + + $css_dependencies = array(); + + // Enqueue the editor styles. + wp_enqueue_style( 'twentytwenty-block-editor-styles', get_theme_file_uri( '/assets/css/editor-style-block.css' ), $css_dependencies, wp_get_theme()->get( 'Version' ), 'all' ); + wp_style_add_data( 'twentytwenty-block-editor-styles', 'rtl', 'replace' ); + + // Add inline style from the Customizer. + wp_add_inline_style( 'twentytwenty-block-editor-styles', twentytwenty_get_customizer_css( 'block-editor' ) ); + + // Add inline style for non-latin fonts. + wp_add_inline_style( 'twentytwenty-block-editor-styles', TwentyTwenty_Non_Latin_Languages::get_non_latin_css( 'block-editor' ) ); + + // Enqueue the editor script. + wp_enqueue_script( 'twentytwenty-block-editor-script', get_theme_file_uri( '/assets/js/editor-script-block.js' ), array( 'wp-blocks', 'wp-dom' ), wp_get_theme()->get( 'Version' ), true ); +} + +add_action( 'enqueue_block_editor_assets', 'twentytwenty_block_editor_styles', 1, 1 ); + +/** + * Enqueue classic editor styles. + */ +function twentytwenty_classic_editor_styles() { + + $classic_editor_styles = array( + '/assets/css/editor-style-classic.css', + ); + + add_editor_style( $classic_editor_styles ); + +} + +add_action( 'init', 'twentytwenty_classic_editor_styles' ); + +/** + * Output Customizer settings in the classic editor. + * Adds styles to the head of the TinyMCE iframe. Kudos to @Otto42 for the original solution. + * + * @param array $mce_init TinyMCE styles. + * + * @return array $mce_init TinyMCE styles. + */ +function twentytwenty_add_classic_editor_customizer_styles( $mce_init ) { + + $styles = twentytwenty_get_customizer_css( 'classic-editor' ); + + if ( ! isset( $mce_init['content_style'] ) ) { + $mce_init['content_style'] = $styles . ' '; + } else { + $mce_init['content_style'] .= ' ' . $styles . ' '; + } + + return $mce_init; + +} + +add_filter( 'tiny_mce_before_init', 'twentytwenty_add_classic_editor_customizer_styles' ); + +/** + * Output non-latin font styles in the classic editor. + * Adds styles to the head of the TinyMCE iframe. Kudos to @Otto42 for the original solution. + * + * @param array $mce_init TinyMCE styles. + * + * @return array $mce_init TinyMCE styles. + */ +function twentytwenty_add_classic_editor_non_latin_styles( $mce_init ) { + + $styles = TwentyTwenty_Non_Latin_Languages::get_non_latin_css( 'classic-editor' ); + + // Return if there are no styles to add. + if ( ! $styles ) { + return $mce_init; + } + + if ( ! isset( $mce_init['content_style'] ) ) { + $mce_init['content_style'] = $styles . ' '; + } else { + $mce_init['content_style'] .= ' ' . $styles . ' '; + } + + return $mce_init; + +} + +add_filter( 'tiny_mce_before_init', 'twentytwenty_add_classic_editor_non_latin_styles' ); + +/** + * Block Editor Settings. + * Add custom colors and font sizes to the block editor. + */ +function twentytwenty_block_editor_settings() { + + // Block Editor Palette. + $editor_color_palette = array( + array( + 'name' => __( 'Accent Color', 'twentytwenty' ), + 'slug' => 'accent', + 'color' => twentytwenty_get_color_for_area( 'content', 'accent' ), + ), + array( + 'name' => __( 'Primary', 'twentytwenty' ), + 'slug' => 'primary', + 'color' => twentytwenty_get_color_for_area( 'content', 'text' ), + ), + array( + 'name' => __( 'Secondary', 'twentytwenty' ), + 'slug' => 'secondary', + 'color' => twentytwenty_get_color_for_area( 'content', 'secondary' ), + ), + array( + 'name' => __( 'Subtle Background', 'twentytwenty' ), + 'slug' => 'subtle-background', + 'color' => twentytwenty_get_color_for_area( 'content', 'borders' ), + ), + ); + + // Add the background option. + $background_color = get_theme_mod( 'background_color' ); + if ( ! $background_color ) { + $background_color_arr = get_theme_support( 'custom-background' ); + $background_color = $background_color_arr[0]['default-color']; + } + $editor_color_palette[] = array( + 'name' => __( 'Background Color', 'twentytwenty' ), + 'slug' => 'background', + 'color' => '#' . $background_color, + ); + + // If we have accent colors, add them to the block editor palette. + if ( $editor_color_palette ) { + add_theme_support( 'editor-color-palette', $editor_color_palette ); + } + + // Block Editor Font Sizes. + add_theme_support( + 'editor-font-sizes', + array( + array( + 'name' => _x( 'Small', 'Name of the small font size in the block editor', 'twentytwenty' ), + 'shortName' => _x( 'S', 'Short name of the small font size in the block editor.', 'twentytwenty' ), + 'size' => 18, + 'slug' => 'small', + ), + array( + 'name' => _x( 'Regular', 'Name of the regular font size in the block editor', 'twentytwenty' ), + 'shortName' => _x( 'M', 'Short name of the regular font size in the block editor.', 'twentytwenty' ), + 'size' => 21, + 'slug' => 'normal', + ), + array( + 'name' => _x( 'Large', 'Name of the large font size in the block editor', 'twentytwenty' ), + 'shortName' => _x( 'L', 'Short name of the large font size in the block editor.', 'twentytwenty' ), + 'size' => 26.25, + 'slug' => 'large', + ), + array( + 'name' => _x( 'Larger', 'Name of the larger font size in the block editor', 'twentytwenty' ), + 'shortName' => _x( 'XL', 'Short name of the larger font size in the block editor.', 'twentytwenty' ), + 'size' => 32, + 'slug' => 'larger', + ), + ) + ); + + // If we have a dark background color then add support for dark editor style. + // We can determine if the background color is dark by checking if the text-color is white. + if ( '#ffffff' === strtolower( twentytwenty_get_color_for_area( 'content', 'text' ) ) ) { + add_theme_support( 'dark-editor-style' ); + } + +} + +add_action( 'after_setup_theme', 'twentytwenty_block_editor_settings' ); + +/** + * Overwrite default more tag with styling and screen reader markup. + * + * @param string $html The default output HTML for the more tag. + * + * @return string $html + */ +function twentytwenty_read_more_tag( $html ) { + return preg_replace( '/<a(.*)>(.*)<\/a>/iU', sprintf( '<div class="read-more-button-wrap"><a$1><span class="faux-button">$2</span> <span class="screen-reader-text">"%1$s"</span></a></div>', get_the_title( get_the_ID() ) ), $html ); +} + +add_filter( 'the_content_more_link', 'twentytwenty_read_more_tag' ); + +/** + * Enqueues scripts for customizer controls & settings. + * + * @since Twenty Twenty 1.0 + * + * @return void + */ +function twentytwenty_customize_controls_enqueue_scripts() { + $theme_version = wp_get_theme()->get( 'Version' ); + + // Add main customizer js file. + wp_enqueue_script( 'twentytwenty-customize', get_template_directory_uri() . '/assets/js/customize.js', array( 'jquery' ), $theme_version, false ); + + // Add script for color calculations. + wp_enqueue_script( 'twentytwenty-color-calculations', get_template_directory_uri() . '/assets/js/color-calculations.js', array( 'wp-color-picker' ), $theme_version, false ); + + // Add script for controls. + wp_enqueue_script( 'twentytwenty-customize-controls', get_template_directory_uri() . '/assets/js/customize-controls.js', array( 'twentytwenty-color-calculations', 'customize-controls', 'underscore', 'jquery' ), $theme_version, false ); + wp_localize_script( 'twentytwenty-customize-controls', 'twentyTwentyBgColors', twentytwenty_get_customizer_color_vars() ); +} + +add_action( 'customize_controls_enqueue_scripts', 'twentytwenty_customize_controls_enqueue_scripts' ); + +/** + * Enqueue scripts for the customizer preview. + * + * @since Twenty Twenty 1.0 + * + * @return void + */ +function twentytwenty_customize_preview_init() { + $theme_version = wp_get_theme()->get( 'Version' ); + + wp_enqueue_script( 'twentytwenty-customize-preview', get_theme_file_uri( '/assets/js/customize-preview.js' ), array( 'customize-preview', 'customize-selective-refresh', 'jquery' ), $theme_version, true ); + wp_localize_script( 'twentytwenty-customize-preview', 'twentyTwentyBgColors', twentytwenty_get_customizer_color_vars() ); + wp_localize_script( 'twentytwenty-customize-preview', 'twentyTwentyPreviewEls', twentytwenty_get_elements_array() ); + + wp_add_inline_script( + 'twentytwenty-customize-preview', + sprintf( + 'wp.customize.selectiveRefresh.partialConstructor[ %1$s ].prototype.attrs = %2$s;', + wp_json_encode( 'cover_opacity' ), + wp_json_encode( twentytwenty_customize_opacity_range() ) + ) + ); +} + +add_action( 'customize_preview_init', 'twentytwenty_customize_preview_init' ); + +/** + * Get accessible color for an area. + * + * @since Twenty Twenty 1.0 + * + * @param string $area The area we want to get the colors for. + * @param string $context Can be 'text' or 'accent'. + * @return string Returns a HEX color. + */ +function twentytwenty_get_color_for_area( $area = 'content', $context = 'text' ) { + + // Get the value from the theme-mod. + $settings = get_theme_mod( + 'accent_accessible_colors', + array( + 'content' => array( + 'text' => '#000000', + 'accent' => '#cd2653', + 'secondary' => '#6d6d6d', + 'borders' => '#dcd7ca', + ), + 'header-footer' => array( + 'text' => '#000000', + 'accent' => '#cd2653', + 'secondary' => '#6d6d6d', + 'borders' => '#dcd7ca', + ), + ) + ); + + // If we have a value return it. + if ( isset( $settings[ $area ] ) && isset( $settings[ $area ][ $context ] ) ) { + return $settings[ $area ][ $context ]; + } + + // Return false if the option doesn't exist. + return false; +} + +/** + * Returns an array of variables for the customizer preview. + * + * @since Twenty Twenty 1.0 + * + * @return array + */ +function twentytwenty_get_customizer_color_vars() { + $colors = array( + 'content' => array( + 'setting' => 'background_color', + ), + 'header-footer' => array( + 'setting' => 'header_footer_background_color', + ), + ); + return $colors; +} + +/** + * Get an array of elements. + * + * @since Twenty Twenty 1.0 + * + * @return array + */ +function twentytwenty_get_elements_array() { + + // The array is formatted like this: + // [key-in-saved-setting][sub-key-in-setting][css-property] = [elements]. + $elements = array( + 'content' => array( + 'accent' => array( + 'color' => array( '.color-accent', '.color-accent-hover:hover', '.color-accent-hover:focus', ':root .has-accent-color', '.has-drop-cap:not(:focus):first-letter', '.wp-block-button.is-style-outline', 'a' ), + 'border-color' => array( 'blockquote', '.border-color-accent', '.border-color-accent-hover:hover', '.border-color-accent-hover:focus' ), + 'background-color' => array( 'button:not(.toggle)', '.button', '.faux-button', '.wp-block-button__link', '.wp-block-file .wp-block-file__button', 'input[type="button"]', 'input[type="reset"]', 'input[type="submit"]', '.bg-accent', '.bg-accent-hover:hover', '.bg-accent-hover:focus', ':root .has-accent-background-color', '.comment-reply-link' ), + 'fill' => array( '.fill-children-accent', '.fill-children-accent *' ), + ), + 'background' => array( + 'color' => array( ':root .has-background-color', 'button', '.button', '.faux-button', '.wp-block-button__link', '.wp-block-file__button', 'input[type="button"]', 'input[type="reset"]', 'input[type="submit"]', '.wp-block-button', '.comment-reply-link', '.has-background.has-primary-background-color:not(.has-text-color)', '.has-background.has-primary-background-color *:not(.has-text-color)', '.has-background.has-accent-background-color:not(.has-text-color)', '.has-background.has-accent-background-color *:not(.has-text-color)' ), + 'background-color' => array( ':root .has-background-background-color' ), + ), + 'text' => array( + 'color' => array( 'body', '.entry-title a', ':root .has-primary-color' ), + 'background-color' => array( ':root .has-primary-background-color' ), + ), + 'secondary' => array( + 'color' => array( 'cite', 'figcaption', '.wp-caption-text', '.post-meta', '.entry-content .wp-block-archives li', '.entry-content .wp-block-categories li', '.entry-content .wp-block-latest-posts li', '.wp-block-latest-comments__comment-date', '.wp-block-latest-posts__post-date', '.wp-block-embed figcaption', '.wp-block-image figcaption', '.wp-block-pullquote cite', '.comment-metadata', '.comment-respond .comment-notes', '.comment-respond .logged-in-as', '.pagination .dots', '.entry-content hr:not(.has-background)', 'hr.styled-separator', ':root .has-secondary-color' ), + 'background-color' => array( ':root .has-secondary-background-color' ), + ), + 'borders' => array( + 'border-color' => array( 'pre', 'fieldset', 'input', 'textarea', 'table', 'table *', 'hr' ), + 'background-color' => array( 'caption', 'code', 'code', 'kbd', 'samp', '.wp-block-table.is-style-stripes tbody tr:nth-child(odd)', ':root .has-subtle-background-background-color' ), + 'border-bottom-color' => array( '.wp-block-table.is-style-stripes' ), + 'border-top-color' => array( '.wp-block-latest-posts.is-grid li' ), + 'color' => array( ':root .has-subtle-background-color' ), + ), + ), + 'header-footer' => array( + 'accent' => array( + 'color' => array( 'body:not(.overlay-header) .primary-menu > li > a', 'body:not(.overlay-header) .primary-menu > li > .icon', '.modal-menu a', '.footer-menu a, .footer-widgets a', '#site-footer .wp-block-button.is-style-outline', '.wp-block-pullquote:before', '.singular:not(.overlay-header) .entry-header a', '.archive-header a', '.header-footer-group .color-accent', '.header-footer-group .color-accent-hover:hover' ), + 'background-color' => array( '.social-icons a', '#site-footer button:not(.toggle)', '#site-footer .button', '#site-footer .faux-button', '#site-footer .wp-block-button__link', '#site-footer .wp-block-file__button', '#site-footer input[type="button"]', '#site-footer input[type="reset"]', '#site-footer input[type="submit"]' ), + ), + 'background' => array( + 'color' => array( '.social-icons a', 'body:not(.overlay-header) .primary-menu ul', '.header-footer-group button', '.header-footer-group .button', '.header-footer-group .faux-button', '.header-footer-group .wp-block-button:not(.is-style-outline) .wp-block-button__link', '.header-footer-group .wp-block-file__button', '.header-footer-group input[type="button"]', '.header-footer-group input[type="reset"]', '.header-footer-group input[type="submit"]' ), + 'background-color' => array( '#site-header', '.footer-nav-widgets-wrapper', '#site-footer', '.menu-modal', '.menu-modal-inner', '.search-modal-inner', '.archive-header', '.singular .entry-header', '.singular .featured-media:before', '.wp-block-pullquote:before' ), + ), + 'text' => array( + 'color' => array( '.header-footer-group', 'body:not(.overlay-header) #site-header .toggle', '.menu-modal .toggle' ), + 'background-color' => array( 'body:not(.overlay-header) .primary-menu ul' ), + 'border-bottom-color' => array( 'body:not(.overlay-header) .primary-menu > li > ul:after' ), + 'border-left-color' => array( 'body:not(.overlay-header) .primary-menu ul ul:after' ), + ), + 'secondary' => array( + 'color' => array( '.site-description', 'body:not(.overlay-header) .toggle-inner .toggle-text', '.widget .post-date', '.widget .rss-date', '.widget_archive li', '.widget_categories li', '.widget cite', '.widget_pages li', '.widget_meta li', '.widget_nav_menu li', '.powered-by-wordpress', '.to-the-top', '.singular .entry-header .post-meta', '.singular:not(.overlay-header) .entry-header .post-meta a' ), + ), + 'borders' => array( + 'border-color' => array( '.header-footer-group pre', '.header-footer-group fieldset', '.header-footer-group input', '.header-footer-group textarea', '.header-footer-group table', '.header-footer-group table *', '.footer-nav-widgets-wrapper', '#site-footer', '.menu-modal nav *', '.footer-widgets-outer-wrapper', '.footer-top' ), + 'background-color' => array( '.header-footer-group table caption', 'body:not(.overlay-header) .header-inner .toggle-wrapper::before' ), + ), + ), + ); + + /** + * Filters Twenty Twenty theme elements + * + * @since Twenty Twenty 1.0 + * + * @param array Array of elements + */ + return apply_filters( 'twentytwenty_get_elements_array', $elements ); +} diff --git a/content/themes/twentytwenty/header.php b/content/themes/twentytwenty/header.php new file mode 100644 index 0000000..7095b4a --- /dev/null +++ b/content/themes/twentytwenty/header.php @@ -0,0 +1,187 @@ +<?php +/** + * Header file for the Twenty Twenty WordPress default theme. + * + * @link https://developer.wordpress.org/themes/basics/template-files/#template-partials + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +?><!DOCTYPE html> + +<html class="no-js" <?php language_attributes(); ?>> + + <head> + + <meta charset="<?php bloginfo( 'charset' ); ?>"> + <meta name="viewport" content="width=device-width, initial-scale=1.0" > + + <link rel="profile" href="https://gmpg.org/xfn/11"> + + <?php wp_head(); ?> + + </head> + + <body <?php body_class(); ?>> + + <?php + wp_body_open(); + ?> + + <header id="site-header" class="header-footer-group" role="banner"> + + <div class="header-inner section-inner"> + + <div class="header-titles-wrapper"> + + <?php + + // Check whether the header search is activated in the customizer. + $enable_header_search = get_theme_mod( 'enable_header_search', true ); + + if ( true === $enable_header_search ) { + + ?> + + <button class="toggle search-toggle mobile-search-toggle" data-toggle-target=".search-modal" data-toggle-body-class="showing-search-modal" data-set-focus=".search-modal .search-field" aria-expanded="false"> + <span class="toggle-inner"> + <span class="toggle-icon"> + <?php twentytwenty_the_theme_svg( 'search' ); ?> + </span> + <span class="toggle-text"><?php _e( 'Search', 'twentytwenty' ); ?></span> + </span> + </button><!-- .search-toggle --> + + <?php } ?> + + <div class="header-titles"> + + <?php + // Site title or logo. + twentytwenty_site_logo(); + + // Site description. + twentytwenty_site_description(); + ?> + + </div><!-- .header-titles --> + + <button class="toggle nav-toggle mobile-nav-toggle" data-toggle-target=".menu-modal" data-toggle-body-class="showing-menu-modal" aria-expanded="false" data-set-focus=".close-nav-toggle"> + <span class="toggle-inner"> + <span class="toggle-icon"> + <?php twentytwenty_the_theme_svg( 'ellipsis' ); ?> + </span> + <span class="toggle-text"><?php _e( 'Menu', 'twentytwenty' ); ?></span> + </span> + </button><!-- .nav-toggle --> + + </div><!-- .header-titles-wrapper --> + + <div class="header-navigation-wrapper"> + + <?php + if ( has_nav_menu( 'primary' ) || ! has_nav_menu( 'expanded' ) ) { + ?> + + <nav class="primary-menu-wrapper" aria-label="<?php esc_attr_e( 'Horizontal', 'twentytwenty' ); ?>" role="navigation"> + + <ul class="primary-menu reset-list-style"> + + <?php + if ( has_nav_menu( 'primary' ) ) { + + wp_nav_menu( + array( + 'container' => '', + 'items_wrap' => '%3$s', + 'theme_location' => 'primary', + ) + ); + + } elseif ( ! has_nav_menu( 'expanded' ) ) { + + wp_list_pages( + array( + 'match_menu_classes' => true, + 'show_sub_menu_icons' => true, + 'title_li' => false, + 'walker' => new TwentyTwenty_Walker_Page(), + ) + ); + + } + ?> + + </ul> + + </nav><!-- .primary-menu-wrapper --> + + <?php + } + + if ( true === $enable_header_search || has_nav_menu( 'expanded' ) ) { + ?> + + <div class="header-toggles hide-no-js"> + + <?php + if ( has_nav_menu( 'expanded' ) ) { + ?> + + <div class="toggle-wrapper nav-toggle-wrapper has-expanded-menu"> + + <button class="toggle nav-toggle desktop-nav-toggle" data-toggle-target=".menu-modal" data-toggle-body-class="showing-menu-modal" aria-expanded="false" data-set-focus=".close-nav-toggle"> + <span class="toggle-inner"> + <span class="toggle-text"><?php _e( 'Menu', 'twentytwenty' ); ?></span> + <span class="toggle-icon"> + <?php twentytwenty_the_theme_svg( 'ellipsis' ); ?> + </span> + </span> + </button><!-- .nav-toggle --> + + </div><!-- .nav-toggle-wrapper --> + + <?php + } + + if ( true === $enable_header_search ) { + ?> + + <div class="toggle-wrapper search-toggle-wrapper"> + + <button class="toggle search-toggle desktop-search-toggle" data-toggle-target=".search-modal" data-toggle-body-class="showing-search-modal" data-set-focus=".search-modal .search-field" aria-expanded="false"> + <span class="toggle-inner"> + <?php twentytwenty_the_theme_svg( 'search' ); ?> + <span class="toggle-text"><?php _e( 'Search', 'twentytwenty' ); ?></span> + </span> + </button><!-- .search-toggle --> + + </div> + + <?php + } + ?> + + </div><!-- .header-toggles --> + <?php + } + ?> + + </div><!-- .header-navigation-wrapper --> + + </div><!-- .header-inner --> + + <?php + // Output the search modal (if it is activated in the customizer). + if ( true === $enable_header_search ) { + get_template_part( 'template-parts/modal-search' ); + } + ?> + + </header><!-- #site-header --> + + <?php + // Output the menu modal. + get_template_part( 'template-parts/modal-menu' ); diff --git a/content/themes/twentytwenty/inc/custom-css.php b/content/themes/twentytwenty/inc/custom-css.php new file mode 100644 index 0000000..7c40de2 --- /dev/null +++ b/content/themes/twentytwenty/inc/custom-css.php @@ -0,0 +1,191 @@ +<?php +/** + * Twenty Twenty Custom CSS + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +if ( ! function_exists( 'twentytwenty_generate_css' ) ) { + + /** + * Generate CSS. + * + * @param string $selector The CSS selector. + * @param string $style The CSS style. + * @param string $value The CSS value. + * @param string $prefix The CSS prefix. + * @param string $suffix The CSS suffix. + * @param bool $echo Echo the styles. + */ + function twentytwenty_generate_css( $selector, $style, $value, $prefix = '', $suffix = '', $echo = true ) { + + $return = ''; + + /* + * Bail early if we have no $selector elements or properties and $value. + */ + if ( ! $value || ! $selector ) { + + return; + } + + $return = sprintf( '%s { %s: %s; }', $selector, $style, $prefix . $value . $suffix ); + + if ( $echo ) { + + echo $return; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- We need to double check this, but for now, we want to pass PHPCS ;) + + } + + return $return; + + } +} + +if ( ! function_exists( 'twentytwenty_get_customizer_css' ) ) { + + /** + * Get CSS Built from Customizer Options. + * Build CSS reflecting colors, fonts and other options set in the Customizer, and return them for output. + * + * @param string $type Whether to return CSS for the "front-end", "block-editor" or "classic-editor". + */ + function twentytwenty_get_customizer_css( $type = 'front-end' ) { + + // Get variables. + $body = sanitize_hex_color( twentytwenty_get_color_for_area( 'content', 'text' ) ); + $body_default = '#000000'; + $secondary = sanitize_hex_color( twentytwenty_get_color_for_area( 'content', 'secondary' ) ); + $secondary_default = '#6d6d6d'; + $borders = sanitize_hex_color( twentytwenty_get_color_for_area( 'content', 'borders' ) ); + $borders_default = '#dcd7ca'; + $accent = sanitize_hex_color( twentytwenty_get_color_for_area( 'content', 'accent' ) ); + $accent_default = '#cd2653'; + + // Header. + $header_footer_background = sanitize_hex_color( twentytwenty_get_color_for_area( 'header-footer', 'background' ) ); + $header_footer_background_default = '#ffffff'; + + // Cover. + $cover = sanitize_hex_color( get_theme_mod( 'cover_template_overlay_text_color' ) ); + $cover_default = '#ffffff'; + + // Background. + $background = sanitize_hex_color_no_hash( get_theme_mod( 'background_color' ) ); + $background_default = 'f5efe0'; + + ob_start(); + + /** + * Note – Styles are applied in this order: + * 1. Element specific + * 2. Helper classes + * + * This enables all helper classes to overwrite base element styles, + * meaning that any color classes applied in the block editor will + * have a higher priority than the base element styles. + */ + + // Front-End Styles. + if ( 'front-end' === $type ) { + + // Auto-calculated colors. + $elements_definitions = twentytwenty_get_elements_array(); + foreach ( $elements_definitions as $context => $props ) { + foreach ( $props as $key => $definitions ) { + foreach ( $definitions as $property => $elements ) { + /* + * If we don't have an elements array or it is empty + * then skip this iteration early; + */ + if ( ! is_array( $elements ) || empty( $elements ) ) { + continue; + } + $val = twentytwenty_get_color_for_area( $context, $key ); + if ( $val ) { + twentytwenty_generate_css( implode( ',', $elements ), $property, $val ); + } + } + } + } + + if ( $cover && $cover !== $cover_default ) { + twentytwenty_generate_css( '.overlay-header .header-inner', 'color', $cover ); + twentytwenty_generate_css( '.cover-header .entry-header *', 'color', $cover ); + } + + // Block Editor Styles. + } elseif ( 'block-editor' === $type ) { + + // Colors. + // Accent color. + if ( $accent && $accent !== $accent_default ) { + twentytwenty_generate_css( '.has-accent-color, .editor-styles-wrapper .editor-block-list__layout a, .editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter, .editor-styles-wrapper .wp-block-button.is-style-outline .wp-block-button__link, .editor-styles-wrapper .wp-block-pullquote::before, .editor-styles-wrapper .wp-block-file .wp-block-file__textlink', 'color', $accent ); + twentytwenty_generate_css( '.editor-styles-wrapper .wp-block-quote', 'border-color', $accent, '' ); + twentytwenty_generate_css( '.has-accent-background-color, .editor-styles-wrapper .wp-block-button__link, .editor-styles-wrapper .wp-block-file__button', 'background-color', $accent ); + } + + // Background color. + if ( $background && $background !== $background_default ) { + twentytwenty_generate_css( '.editor-styles-wrapper', 'background-color', '#' . $background ); + twentytwenty_generate_css( '.has-background.has-primary-background-color:not(.has-text-color),.has-background.has-primary-background-color *:not(.has-text-color),.has-background.has-accent-background-color:not(.has-text-color),.has-background.has-accent-background-color *:not(.has-text-color)', 'color', '#' . $background ); + } + + // Borders color. + if ( $borders && $borders !== $borders_default ) { + twentytwenty_generate_css( '.editor-styles-wrapper .wp-block-code, .editor-styles-wrapper pre, .editor-styles-wrapper .wp-block-preformatted pre, .editor-styles-wrapper .wp-block-verse pre, .editor-styles-wrapper fieldset, .editor-styles-wrapper .wp-block-table, .editor-styles-wrapper .wp-block-table *, .editor-styles-wrapper .wp-block-table.is-style-stripes, .editor-styles-wrapper .wp-block-latest-posts.is-grid li', 'border-color', $borders ); + twentytwenty_generate_css( '.editor-styles-wrapper .wp-block-table caption, .editor-styles-wrapper .wp-block-table.is-style-stripes tbody tr:nth-child(odd)', 'background-color', $borders ); + } + + // Text color. + if ( $body && $body !== $body_default ) { + twentytwenty_generate_css( 'body .editor-styles-wrapper, .editor-post-title__block .editor-post-title__input, .editor-post-title__block .editor-post-title__input:focus', 'color', $body ); + } + + // Secondary color. + if ( $secondary && $secondary !== $secondary_default ) { + twentytwenty_generate_css( '.editor-styles-wrapper figcaption, .editor-styles-wrapper cite, .editor-styles-wrapper .wp-block-quote__citation, .editor-styles-wrapper .wp-block-quote cite, .editor-styles-wrapper .wp-block-quote footer, .editor-styles-wrapper .wp-block-pullquote__citation, .editor-styles-wrapper .wp-block-pullquote cite, .editor-styles-wrapper .wp-block-pullquote footer, .editor-styles-wrapper ul.wp-block-archives li, .editor-styles-wrapper ul.wp-block-categories li, .editor-styles-wrapper ul.wp-block-latest-posts li, .editor-styles-wrapper ul.wp-block-categories__list li, .editor-styles-wrapper .wp-block-latest-comments time, .editor-styles-wrapper .wp-block-latest-posts time', 'color', $secondary ); + } + + // Header Footer Background Color. + if ( $header_footer_background && $header_footer_background !== $header_footer_background_default ) { + twentytwenty_generate_css( '.editor-styles-wrapper .wp-block-pullquote::before', 'background-color', $header_footer_background ); + } + } elseif ( 'classic-editor' === $type ) { + + // Colors. + // Accent color. + if ( $accent && $accent !== $accent_default ) { + twentytwenty_generate_css( 'body#tinymce.wp-editor.content a, body#tinymce.wp-editor.content a:focus, body#tinymce.wp-editor.content a:hover', 'color', $accent ); + twentytwenty_generate_css( 'body#tinymce.wp-editor.content blockquote, body#tinymce.wp-editor.content .wp-block-quote', 'border-color', $accent, '', ' !important' ); + twentytwenty_generate_css( 'body#tinymce.wp-editor.content button, body#tinymce.wp-editor.content .faux-button, body#tinymce.wp-editor.content .wp-block-button__link, body#tinymce.wp-editor.content .wp-block-file__button, body#tinymce.wp-editor.content input[type=\'button\'], body#tinymce.wp-editor.content input[type=\'reset\'], body#tinymce.wp-editor.content input[type=\'submit\']', 'background-color', $accent ); + } + + // Background color. + if ( $background && $background !== $background_default ) { + twentytwenty_generate_css( 'body#tinymce.wp-editor.content', 'background-color', '#' . $background ); + } + + // Text color. + if ( $body && $body !== $body_default ) { + twentytwenty_generate_css( 'body#tinymce.wp-editor.content', 'color', $body ); + } + + // Secondary color. + if ( $secondary && $secondary !== $secondary_default ) { + twentytwenty_generate_css( 'body#tinymce.wp-editor.content hr:not(.is-style-dots), body#tinymce.wp-editor.content cite, body#tinymce.wp-editor.content figcaption, body#tinymce.wp-editor.content .wp-caption-text, body#tinymce.wp-editor.content .wp-caption-dd, body#tinymce.wp-editor.content .gallery-caption', 'color', $secondary ); + } + + // Borders color. + if ( $borders && $borders !== $borders_default ) { + twentytwenty_generate_css( 'body#tinymce.wp-editor.content pre, body#tinymce.wp-editor.content hr, body#tinymce.wp-editor.content fieldset,body#tinymce.wp-editor.content input, body#tinymce.wp-editor.content textarea', 'border-color', $borders ); + } + } + + // Return the results. + return ob_get_clean(); + + } +} diff --git a/content/themes/twentytwenty/inc/starter-content.php b/content/themes/twentytwenty/inc/starter-content.php new file mode 100644 index 0000000..08f91c0 --- /dev/null +++ b/content/themes/twentytwenty/inc/starter-content.php @@ -0,0 +1,217 @@ +<?php +/** + * Twenty Twenty Starter Content + * + * @link https://make.wordpress.org/core/2016/11/30/starter-content-for-themes-in-4-7/ + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +/** + * Function to return the array of starter content for the theme. + * + * Passes it through the `twentytwenty_starter_content` filter before returning. + * + * @since Twenty Twenty 1.0 + * @return array a filtered array of args for the starter_content. + */ +function twentytwenty_get_starter_content() { + + // Define and register starter content to showcase the theme on new sites. + $starter_content = array( + 'widgets' => array( + // Place one core-defined widgets in the first footer widget area. + 'sidebar-1' => array( + 'text_about', + ), + // Place one core-defined widgets in the second footer widget area. + 'sidebar-2' => array( + 'text_business_info', + ), + ), + + // Create the custom image attachments used as post thumbnails for pages. + 'attachments' => array( + 'image-opening' => array( + 'post_title' => _x( 'The New UMoMA Opens its Doors', 'Theme starter content', 'twentytwenty' ), + 'file' => 'assets/images/2020-landscape-1.png', // URL relative to the template directory. + ), + ), + + // Specify the core-defined pages to create and add custom thumbnails to some of them. + 'posts' => array( + 'front' => array( + 'post_type' => 'page', + 'post_title' => __( 'The New UMoMA Opens its Doors', 'twentytwenty' ), + // Use the above featured image with the predefined about page. + 'thumbnail' => '{{image-opening}}', + 'post_content' => join( + '', + array( + '<!-- wp:group {"align":"wide"} -->', + '<div class="wp-block-group alignwide"><div class="wp-block-group__inner-container"><!-- wp:heading {"align":"center"} -->', + '<h2 class="has-text-align-center">' . __( 'The premier destination for modern art in Northern Sweden. Open from 10 AM to 6 PM every day during the summer months.', 'twentytwenty' ) . '</h2>', + '<!-- /wp:heading --></div></div>', + '<!-- /wp:group -->', + '<!-- wp:columns {"align":"wide"} -->', + '<div class="wp-block-columns alignwide"><!-- wp:column -->', + '<div class="wp-block-column"><!-- wp:group -->', + '<div class="wp-block-group"><div class="wp-block-group__inner-container">', + '<!-- wp:image {"align":"full","id":37,"sizeSlug":"full"} -->', + '<figure class="wp-block-image alignfull size-full"><img src="' . get_theme_file_uri() . '/assets/images/2020-three-quarters-1.png" alt="" class="wp-image-37"/></figure>', + '<!-- /wp:image -->', + '<!-- wp:heading {"level":3} -->', + '<h3>' . __( 'Works and Days', 'twentytwenty' ) . '</h3>', + '<!-- /wp:heading -->', + '<!-- wp:paragraph -->', + '<p>' . __( 'August 1 -- December 1', 'twentytwenty' ) . '</p>', + '<!-- /wp:paragraph -->', + '<!-- wp:button {"className":"is-style-outline"} -->', + '<div class="wp-block-button is-style-outline"><a class="wp-block-button__link" href="https://make.wordpress.org/core/2019/09/27/block-editor-theme-related-updates-in-wordpress-5-3/">' . __( 'Read More', 'twentytwenty' ) . '</a></div>', + '<!-- /wp:button --></div></div>', + '<!-- /wp:group -->', + '<!-- wp:group -->', + '<div class="wp-block-group"><div class="wp-block-group__inner-container">', + '<!-- wp:image {"align":"full","id":37,"sizeSlug":"full"} -->', + '<figure class="wp-block-image alignfull size-full"><img src="' . get_theme_file_uri() . '/assets/images/2020-three-quarters-3.png" alt="" class="wp-image-37"/></figure>', + '<!-- /wp:image -->', + '<!-- wp:heading {"level":3} -->', + '<h3>' . __( 'Theatre of Operations', 'twentytwenty' ) . '</h3>', + '<!-- /wp:heading -->', + '<!-- wp:paragraph -->', + '<p>' . __( 'October 1 -- December 1', 'twentytwenty' ) . '</p>', + '<!-- /wp:paragraph -->', + '<!-- wp:button {"className":"is-style-outline"} -->', + '<div class="wp-block-button is-style-outline"><a class="wp-block-button__link" href="https://make.wordpress.org/core/2019/09/27/block-editor-theme-related-updates-in-wordpress-5-3/">' . __( 'Read More', 'twentytwenty' ) . '</a></div>', + '<!-- /wp:button --></div></div>', + '<!-- /wp:group --></div>', + '<!-- /wp:column -->', + '<!-- wp:column -->', + '<div class="wp-block-column"><!-- wp:group -->', + '<div class="wp-block-group"><div class="wp-block-group__inner-container">', + '<!-- wp:image {"align":"full","id":37,"sizeSlug":"full"} -->', + '<figure class="wp-block-image alignfull size-full"><img src="' . get_theme_file_uri() . '/assets/images/2020-three-quarters-2.png" alt="" class="wp-image-37"/></figure>', + '<!-- /wp:image -->', + '<!-- wp:heading {"level":3} -->', + '<h3>' . __( 'The Life I Deserve', 'twentytwenty' ) . '</h3>', + '<!-- /wp:heading -->', + '<!-- wp:paragraph -->', + '<p>' . __( 'August 1 -- December 1', 'twentytwenty' ) . '</p>', + '<!-- /wp:paragraph -->', + '<!-- wp:button {"className":"is-style-outline"} -->', + '<div class="wp-block-button is-style-outline"><a class="wp-block-button__link" href="https://make.wordpress.org/core/2019/09/27/block-editor-theme-related-updates-in-wordpress-5-3/">' . __( 'Read More', 'twentytwenty' ) . '</a></div>', + '<!-- /wp:button --></div></div>', + '<!-- /wp:group -->', + '<!-- wp:group -->', + '<div class="wp-block-group"><div class="wp-block-group__inner-container">', + '<!-- wp:image {"align":"full","id":37,"sizeSlug":"full"} -->', + '<figure class="wp-block-image alignfull size-full"><img src="' . get_theme_file_uri() . '/assets/images/2020-three-quarters-4.png" alt="" class="wp-image-37"/></figure>', + '<!-- /wp:image -->', + '<!-- wp:heading {"level":3} -->', + '<h3>' . __( 'From Signac to Matisse', 'twentytwenty' ) . '</h3>', + '<!-- /wp:heading -->', + '<!-- wp:paragraph -->', + '<p>' . __( 'October 1 -- December 1', 'twentytwenty' ) . '</p>', + '<!-- /wp:paragraph -->', + '<!-- wp:button {"className":"is-style-outline"} -->', + '<div class="wp-block-button is-style-outline"><a class="wp-block-button__link" href="https://make.wordpress.org/core/2019/09/27/block-editor-theme-related-updates-in-wordpress-5-3/">' . __( 'Read More', 'twentytwenty' ) . '</a></div>', + '<!-- /wp:button --></div></div>', + '<!-- /wp:group --></div>', + '<!-- /wp:column --></div>', + '<!-- /wp:columns -->', + '<!-- wp:image {"align":"full","id":37,"sizeSlug":"full"} -->', + '<figure class="wp-block-image alignfull size-full"><img src="' . get_theme_file_uri() . '/assets/images/2020-landscape-2.png" alt="" class="wp-image-37"/></figure>', + '<!-- /wp:image -->', + '<!-- wp:group {"align":"wide"} -->', + '<div class="wp-block-group alignwide"><div class="wp-block-group__inner-container"><!-- wp:heading {"align":"center","textColor":"accent"} -->', + '<h2 class="has-accent-color has-text-align-center">' . __( '“Cyborgs, as the philosopher Donna Haraway established, are not reverent. They do not remember the cosmos.”', 'twentytwenty' ) . '</h2>', + '<!-- /wp:heading --></div></div>', + '<!-- /wp:group -->', + '<!-- wp:paragraph {"dropCap":true} -->', + '<p class="has-drop-cap">' . __( 'With seven floors of striking architecture, UMoMA shows exhibitions of international contemporary art, sometimes along with art historical retrospectives. Existential, political and philosophical issues are intrinsic to our programme. As visitor you are invited to guided tours artist talks, lectures, film screenings and other events with free admission', 'twentytwenty' ) . '</p>', + '<!-- /wp:paragraph -->', + '<!-- wp:paragraph -->', + '<p>' . __( 'The exhibitions are produced by UMoMA in collaboration with artists and museums around the world and they often attract international attention. UMoMA has received a Special Commendation from the European Museum of the Year, and was among the top candidates for the Swedish Museum of the Year Award as well as for the Council of Europe Museum Prize.', 'twentytwenty' ) . '</p>', + '<!-- /wp:paragraph -->', + '<!-- wp:paragraph -->', + '<p></p>', + '<!-- /wp:paragraph -->', + '<!-- wp:group {"customBackgroundColor":"#ffffff","align":"wide"} -->', + '<div class="wp-block-group alignwide has-background" style="background-color:#ffffff"><div class="wp-block-group__inner-container"><!-- wp:group -->', + '<div class="wp-block-group"><div class="wp-block-group__inner-container"><!-- wp:heading {"align":"center"} -->', + '<h2 class="has-text-align-center">' . __( 'Become a Member and Get Exclusive Offers!', 'twentytwenty' ) . '</h2>', + '<!-- /wp:heading -->', + '<!-- wp:paragraph {"align":"center"} -->', + '<p class="has-text-align-center">' . __( 'Members get access to exclusive exhibits and sales. Our memberships cost $99.99 and are billed annually.', 'twentytwenty' ) . '</p>', + '<!-- /wp:paragraph -->', + '<!-- wp:button {"align":"center"} -->', + '<div class="wp-block-button aligncenter"><a class="wp-block-button__link" href="https://make.wordpress.org/core/2019/09/27/block-editor-theme-related-updates-in-wordpress-5-3/">' . __( 'Join the Club', 'twentytwenty' ) . '</a></div>', + '<!-- /wp:button --></div></div>', + '<!-- /wp:group --></div></div>', + '<!-- /wp:group -->', + '<!-- wp:gallery {"ids":[39,38],"align":"wide"} -->', + '<figure class="wp-block-gallery alignwide columns-2 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img src="' . get_theme_file_uri() . '/assets/images/2020-square-2.png" alt="" data-id="39" data-full-url="' . get_theme_file_uri() . '/assets/images/2020-square-2.png" data-link="assets/images/2020-square-2/" class="wp-image-39"/></figure></li><li class="blocks-gallery-item"><figure><img src="' . get_theme_file_uri() . '/assets/images/2020-square-1.png" alt="" data-id="38" data-full-url="' . get_theme_file_uri() . '/assets/images/2020-square-1.png" data-link="' . get_theme_file_uri() . '/assets/images/2020-square-1/" class="wp-image-38"/></figure></li></ul></figure>', + '<!-- /wp:gallery -->', + ) + ), + ), + 'about', + 'contact', + 'blog', + ), + + // Default to a static front page and assign the front and posts pages. + 'options' => array( + 'show_on_front' => 'page', + 'page_on_front' => '{{front}}', + 'page_for_posts' => '{{blog}}', + ), + + // Set up nav menus for each of the two areas registered in the theme. + 'nav_menus' => array( + // Assign a menu to the "primary" location. + 'primary' => array( + 'name' => __( 'Primary', 'twentytwenty' ), + 'items' => array( + 'link_home', // Note that the core "home" page is actually a link in case a static front page is not used. + 'page_about', + 'page_blog', + 'page_contact', + ), + ), + // This replicates primary just to demonstrate the expanded menu. + 'expanded' => array( + 'name' => __( 'Primary', 'twentytwenty' ), + 'items' => array( + 'link_home', // Note that the core "home" page is actually a link in case a static front page is not used. + 'page_about', + 'page_blog', + 'page_contact', + ), + ), + // Assign a menu to the "social" location. + 'social' => array( + 'name' => __( 'Social Links Menu', 'twentytwenty' ), + 'items' => array( + 'link_yelp', + 'link_facebook', + 'link_twitter', + 'link_instagram', + 'link_email', + ), + ), + ), + ); + + /** + * Filters Twenty Twenty array of starter content. + * + * @since Twenty Twenty 1.0 + * + * @param array $starter_content Array of starter content. + */ + return apply_filters( 'twentytwenty_starter_content', $starter_content ); + +} diff --git a/content/themes/twentytwenty/inc/svg-icons.php b/content/themes/twentytwenty/inc/svg-icons.php new file mode 100644 index 0000000..8882a13 --- /dev/null +++ b/content/themes/twentytwenty/inc/svg-icons.php @@ -0,0 +1,70 @@ +<?php +/** + * Twenty Twenty SVG Icon helper functions + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +if ( ! function_exists( 'twentytwenty_the_theme_svg' ) ) { + /** + * Output and Get Theme SVG. + * Output and get the SVG markup for an icon in the TwentyTwenty_SVG_Icons class. + * + * @param string $svg_name The name of the icon. + * @param string $group The group the icon belongs to. + * @param string $color Color code. + */ + function twentytwenty_the_theme_svg( $svg_name, $group = 'ui', $color = '' ) { + echo twentytwenty_get_theme_svg( $svg_name, $group, $color ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped in twentytwenty_get_theme_svg(). + } +} + +if ( ! function_exists( 'twentytwenty_get_theme_svg' ) ) { + + /** + * Get information about the SVG icon. + * + * @param string $svg_name The name of the icon. + * @param string $group The group the icon belongs to. + * @param string $color Color code. + */ + function twentytwenty_get_theme_svg( $svg_name, $group = 'ui', $color = '' ) { + + // Make sure that only our allowed tags and attributes are included. + $svg = wp_kses( + TwentyTwenty_SVG_Icons::get_svg( $svg_name, $group, $color ), + 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/content/themes/twentytwenty/inc/template-tags.php b/content/themes/twentytwenty/inc/template-tags.php new file mode 100644 index 0000000..1f09b96 --- /dev/null +++ b/content/themes/twentytwenty/inc/template-tags.php @@ -0,0 +1,790 @@ +<?php +/** + * Custom template tags for this theme. + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +/** + * Table of Contents: + * Logo & Description + * Comments + * Post Meta + * Menus + * Classes + * Archives + * Miscellaneous + */ + +/** + * Logo & Description + */ +/** + * Displays the site logo, either text or image. + * + * @param array $args Arguments for displaying the site logo either as an image or text. + * @param boolean $echo Echo or return the HTML. + * + * @return string $html Compiled HTML based on our arguments. + */ +function twentytwenty_site_logo( $args = array(), $echo = true ) { + $logo = get_custom_logo(); + $site_title = get_bloginfo( 'name' ); + $contents = ''; + $classname = ''; + + $defaults = array( + 'logo' => '%1$s<span class="screen-reader-text">%2$s</span>', + 'logo_class' => 'site-logo', + 'title' => '<a href="%1$s">%2$s</a>', + 'title_class' => 'site-title', + 'home_wrap' => '<h1 class="%1$s">%2$s</h1>', + 'single_wrap' => '<div class="%1$s faux-heading">%2$s</div>', + 'condition' => ( is_front_page() || is_home() ) && ! is_page(), + ); + + $args = wp_parse_args( $args, $defaults ); + + /** + * Filters the arguments for `twentytwenty_site_logo()`. + * + * @param array $args Parsed arguments. + * @param array $defaults Function's default arguments. + */ + $args = apply_filters( 'twentytwenty_site_logo_args', $args, $defaults ); + + if ( has_custom_logo() ) { + $contents = sprintf( $args['logo'], $logo, esc_html( $site_title ) ); + $classname = $args['logo_class']; + } else { + $contents = sprintf( $args['title'], esc_url( get_home_url( null, '/' ) ), esc_html( $site_title ) ); + $classname = $args['title_class']; + } + + $wrap = $args['condition'] ? 'home_wrap' : 'single_wrap'; + + $html = sprintf( $args[ $wrap ], $classname, $contents ); + + /** + * Filters the arguments for `twentytwenty_site_logo()`. + * + * @param string $html Compiled html based on our arguments. + * @param array $args Parsed arguments. + * @param string $classname Class name based on current view, home or single. + * @param string $contents HTML for site title or logo. + */ + $html = apply_filters( 'twentytwenty_site_logo', $html, $args, $classname, $contents ); + + if ( ! $echo ) { + return $html; + } + + echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + +} + +/** + * Displays the site description. + * + * @param boolean $echo Echo or return the html. + * + * @return string $html The HTML to display. + */ +function twentytwenty_site_description( $echo = true ) { + $description = get_bloginfo( 'description' ); + + if ( ! $description ) { + return; + } + + $wrapper = '<div class="site-description">%s</div><!-- .site-description -->'; + + $html = sprintf( $wrapper, esc_html( $description ) ); + + /** + * Filters the html for the site description. + * + * @since Twenty Twenty 1.0 + * + * @param string $html The HTML to display. + * @param string $description Site description via `bloginfo()`. + * @param string $wrapper The format used in case you want to reuse it in a `sprintf()`. + */ + $html = apply_filters( 'twentytwenty_site_description', $html, $description, $wrapper ); + + if ( ! $echo ) { + return $html; + } + + echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped +} + +/** + * Comments + */ +/** + * Check if the specified comment is written by the author of the post commented on. + * + * @param object $comment Comment data. + * + * @return bool + */ +function twentytwenty_is_comment_by_post_author( $comment = null ) { + + if ( is_object( $comment ) && $comment->user_id > 0 ) { + + $user = get_userdata( $comment->user_id ); + $post = get_post( $comment->comment_post_ID ); + + if ( ! empty( $user ) && ! empty( $post ) ) { + + return $comment->user_id === $post->post_author; + + } + } + return false; + +} + +/** + * Filter comment reply link to not JS scroll. + * Filter the comment reply link to add a class indicating it should not use JS slow-scroll, as it + * makes it scroll to the wrong position on the page. + * + * @param string $link Link to the top of the page. + * + * @return string $link Link to the top of the page. + */ +function twentytwenty_filter_comment_reply_link( $link ) { + + $link = str_replace( 'class=\'', 'class=\'do-not-scroll ', $link ); + return $link; + +} + +add_filter( 'comment_reply_link', 'twentytwenty_filter_comment_reply_link' ); + +/** + * Post Meta + */ +/** + * Get and Output Post Meta. + * If it's a single post, output the post meta values specified in the Customizer settings. + * + * @param int $post_id The ID of the post for which the post meta should be output. + * @param string $location Which post meta location to output – single or preview. + */ +function twentytwenty_the_post_meta( $post_id = null, $location = 'single-top' ) { + + echo twentytwenty_get_post_meta( $post_id, $location ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped in twentytwenty_get_post_meta(). + +} + +/** + * Filters the edit post link to add an icon and use the post meta structure. + * + * @param string $link Anchor tag for the edit link. + * @param int $post_id Post ID. + * @param string $text Anchor text. + */ +function twentytwenty_edit_post_link( $link, $post_id, $text ) { + if ( is_admin() ) { + return $link; + } + + $edit_url = get_edit_post_link( $post_id ); + + if ( ! $edit_url ) { + return; + } + + $text = sprintf( + wp_kses( + /* translators: %s: Post title. Only visible to screen readers. */ + __( 'Edit <span class="screen-reader-text">%s</span>', 'twentytwenty' ), + array( + 'span' => array( + 'class' => array(), + ), + ) + ), + get_the_title( $post_id ) + ); + + return '<div class="post-meta-wrapper post-meta-edit-link-wrapper"><ul class="post-meta"><li class="post-edit meta-wrapper"><span class="meta-icon">' . twentytwenty_get_theme_svg( 'edit' ) . '</span><span class="meta-text"><a href="' . esc_url( $edit_url ) . '">' . $text . '</a></span></li></ul><!-- .post-meta --></div><!-- .post-meta-wrapper -->'; + +} + +add_filter( 'edit_post_link', 'twentytwenty_edit_post_link', 10, 3 ); + +/** + * Get the post meta. + * + * @param int $post_id The ID of the post. + * @param string $location The location where the meta is shown. + */ +function twentytwenty_get_post_meta( $post_id = null, $location = 'single-top' ) { + + // Require post ID. + if ( ! $post_id ) { + return; + } + + /** + * Filters post types array + * + * This filter can be used to hide post meta information of post, page or custom post type registerd by child themes or plugins + * + * @since Twenty Twenty 1.0 + * + * @param array Array of post types + */ + $disallowed_post_types = apply_filters( 'twentytwenty_disallowed_post_types_for_meta_output', array( 'page' ) ); + // Check whether the post type is allowed to output post meta. + if ( in_array( get_post_type( $post_id ), $disallowed_post_types, true ) ) { + return; + } + + $post_meta_wrapper_classes = ''; + $post_meta_classes = ''; + + // Get the post meta settings for the location specified. + if ( 'single-top' === $location ) { + /** + * Filters post meta info visibility + * + * Use this filter to hide post meta information like Author, Post date, Comments, Is sticky status + * + * @since Twenty Twenty 1.0 + * + * @param array $args { + * @type string 'author' + * @type string 'post-date' + * @type string 'comments' + * @type string 'sticky' + * } + */ + $post_meta = apply_filters( + 'twentytwenty_post_meta_location_single_top', + array( + 'author', + 'post-date', + 'comments', + 'sticky', + ) + ); + + $post_meta_wrapper_classes = ' post-meta-single post-meta-single-top'; + + } elseif ( 'single-bottom' === $location ) { + + /** + * Filters post tags visibility + * + * Use this filter to hide post tags + * + * @since Twenty Twenty 1.0 + * + * @param array $args { + * @type string 'tags' + * } + */ + $post_meta = apply_filters( + 'twentytwenty_post_meta_location_single_bottom', + array( + 'tags', + ) + ); + + $post_meta_wrapper_classes = ' post-meta-single post-meta-single-bottom'; + + } + + // If the post meta setting has the value 'empty', it's explicitly empty and the default post meta shouldn't be output. + if ( $post_meta && ! in_array( 'empty', $post_meta, true ) ) { + + // Make sure we don't output an empty container. + $has_meta = false; + + global $post; + $the_post = get_post( $post_id ); + setup_postdata( $the_post ); + + ob_start(); + + ?> + + <div class="post-meta-wrapper<?php echo esc_attr( $post_meta_wrapper_classes ); ?>"> + + <ul class="post-meta<?php echo esc_attr( $post_meta_classes ); ?>"> + + <?php + + /** + * Fires before post meta html display. + * + * Allow output of additional post meta info to be added by child themes and plugins. + * + * @since Twenty Twenty 1.0 + * @since Twenty Twenty 1.1 Added the `$post_meta` and `$location` parameters. + * + * @param int $post_id Post ID. + * @param array $post_meta An array of post meta information. + * @param string $location The location where the meta is shown. + * Accepts 'single-top' or 'single-bottom'. + */ + do_action( 'twentytwenty_start_of_post_meta_list', $post_id, $post_meta, $location ); + + // Author. + if ( post_type_supports( get_post_type( $post_id ), 'author' ) && in_array( 'author', $post_meta, true ) ) { + + $has_meta = true; + ?> + <li class="post-author meta-wrapper"> + <span class="meta-icon"> + <span class="screen-reader-text"><?php _e( 'Post author', 'twentytwenty' ); ?></span> + <?php twentytwenty_the_theme_svg( 'user' ); ?> + </span> + <span class="meta-text"> + <?php + printf( + /* translators: %s: Author name. */ + __( 'By %s', 'twentytwenty' ), + '<a href="' . esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ) . '">' . esc_html( get_the_author_meta( 'display_name' ) ) . '</a>' + ); + ?> + </span> + </li> + <?php + + } + + // Post date. + if ( in_array( 'post-date', $post_meta, true ) ) { + + $has_meta = true; + ?> + <li class="post-date meta-wrapper"> + <span class="meta-icon"> + <span class="screen-reader-text"><?php _e( 'Post date', 'twentytwenty' ); ?></span> + <?php twentytwenty_the_theme_svg( 'calendar' ); ?> + </span> + <span class="meta-text"> + <a href="<?php the_permalink(); ?>"><?php the_time( get_option( 'date_format' ) ); ?></a> + </span> + </li> + <?php + + } + + // Categories. + if ( in_array( 'categories', $post_meta, true ) && has_category() ) { + + $has_meta = true; + ?> + <li class="post-categories meta-wrapper"> + <span class="meta-icon"> + <span class="screen-reader-text"><?php _e( 'Categories', 'twentytwenty' ); ?></span> + <?php twentytwenty_the_theme_svg( 'folder' ); ?> + </span> + <span class="meta-text"> + <?php _ex( 'In', 'A string that is output before one or more categories', 'twentytwenty' ); ?> <?php the_category( ', ' ); ?> + </span> + </li> + <?php + + } + + // Tags. + if ( in_array( 'tags', $post_meta, true ) && has_tag() ) { + + $has_meta = true; + ?> + <li class="post-tags meta-wrapper"> + <span class="meta-icon"> + <span class="screen-reader-text"><?php _e( 'Tags', 'twentytwenty' ); ?></span> + <?php twentytwenty_the_theme_svg( 'tag' ); ?> + </span> + <span class="meta-text"> + <?php the_tags( '', ', ', '' ); ?> + </span> + </li> + <?php + + } + + // Comments link. + if ( in_array( 'comments', $post_meta, true ) && ! post_password_required() && ( comments_open() || get_comments_number() ) ) { + + $has_meta = true; + ?> + <li class="post-comment-link meta-wrapper"> + <span class="meta-icon"> + <?php twentytwenty_the_theme_svg( 'comment' ); ?> + </span> + <span class="meta-text"> + <?php comments_popup_link(); ?> + </span> + </li> + <?php + + } + + // Sticky. + if ( in_array( 'sticky', $post_meta, true ) && is_sticky() ) { + + $has_meta = true; + ?> + <li class="post-sticky meta-wrapper"> + <span class="meta-icon"> + <?php twentytwenty_the_theme_svg( 'bookmark' ); ?> + </span> + <span class="meta-text"> + <?php _e( 'Sticky post', 'twentytwenty' ); ?> + </span> + </li> + <?php + + } + + /** + * Fires after post meta html display. + * + * Allow output of additional post meta info to be added by child themes and plugins. + * + * @since Twenty Twenty 1.0 + * @since Twenty Twenty 1.1 Added the `$post_meta` and `$location` parameters. + * + * @param int $post_id Post ID. + * @param array $post_meta An array of post meta information. + * @param string $location The location where the meta is shown. + * Accepts 'single-top' or 'single-bottom'. + */ + do_action( 'twentytwenty_end_of_post_meta_list', $post_id, $post_meta, $location ); + + ?> + + </ul><!-- .post-meta --> + + </div><!-- .post-meta-wrapper --> + + <?php + + wp_reset_postdata(); + + $meta_output = ob_get_clean(); + + // If there is meta to output, return it. + if ( $has_meta && $meta_output ) { + + return $meta_output; + + } + } + +} + +/** + * Menus + */ +/** + * Filter Classes of wp_list_pages items to match menu items. + * Filter the class applied to wp_list_pages() items with children to match the menu class, to simplify. + * styling of sub levels in the fallback. Only applied if the match_menu_classes argument is set. + * + * @param array $css_class CSS Class names. + * @param string $item Comment. + * @param int $depth Depth of the current comment. + * @param array $args An array of arguments. + * @param string $current_page Whether or not the item is the current item. + * + * @return array $css_class CSS Class names. + */ +function twentytwenty_filter_wp_list_pages_item_classes( $css_class, $item, $depth, $args, $current_page ) { + + // Only apply to wp_list_pages() calls with match_menu_classes set to true. + $match_menu_classes = isset( $args['match_menu_classes'] ); + + if ( ! $match_menu_classes ) { + return $css_class; + } + + // Add current menu item class. + if ( in_array( 'current_page_item', $css_class, true ) ) { + $css_class[] = 'current-menu-item'; + } + + // Add menu item has children class. + if ( in_array( 'page_item_has_children', $css_class, true ) ) { + $css_class[] = 'menu-item-has-children'; + } + + return $css_class; + +} + +add_filter( 'page_css_class', 'twentytwenty_filter_wp_list_pages_item_classes', 10, 5 ); + +/** + * Add a Sub Nav Toggle to the Expanded Menu and Mobile Menu. + * + * @param stdClass $args An array of arguments. + * @param string $item Menu item. + * @param int $depth Depth of the current menu item. + * + * @return stdClass $args An object of wp_nav_menu() arguments. + */ +function twentytwenty_add_sub_toggles_to_main_menu( $args, $item, $depth ) { + + // Add sub menu toggles to the Expanded Menu with toggles. + if ( isset( $args->show_toggles ) && $args->show_toggles ) { + + // Wrap the menu item link contents in a div, used for positioning. + $args->before = '<div class="ancestor-wrapper">'; + $args->after = ''; + + // Add a toggle to items with children. + if ( in_array( 'menu-item-has-children', $item->classes, true ) ) { + + $toggle_target_string = '.menu-modal .menu-item-' . $item->ID . ' > .sub-menu'; + $toggle_duration = twentytwenty_toggle_duration(); + + // Add the sub menu toggle. + $args->after .= '<button class="toggle sub-menu-toggle fill-children-current-color" data-toggle-target="' . $toggle_target_string . '" data-toggle-type="slidetoggle" data-toggle-duration="' . absint( $toggle_duration ) . '" aria-expanded="false"><span class="screen-reader-text">' . __( 'Show sub menu', 'twentytwenty' ) . '</span>' . twentytwenty_get_theme_svg( 'chevron-down' ) . '</button>'; + + } + + // Close the wrapper. + $args->after .= '</div><!-- .ancestor-wrapper -->'; + + // Add sub menu icons to the primary menu without toggles. + } elseif ( 'primary' === $args->theme_location ) { + if ( in_array( 'menu-item-has-children', $item->classes, true ) ) { + $args->after = '<span class="icon"></span>'; + } else { + $args->after = ''; + } + } + + return $args; + +} + +add_filter( 'nav_menu_item_args', 'twentytwenty_add_sub_toggles_to_main_menu', 10, 3 ); + +/** + * Display SVG icons in social links menu. + * + * @param string $item_output The menu item output. + * @param WP_Post $item Menu item object. + * @param int $depth Depth of the menu. + * @param array $args wp_nav_menu() arguments. + * @return string $item_output The menu item output with social icon. + */ +function twentytwenty_nav_menu_social_icons( $item_output, $item, $depth, $args ) { + // Change SVG icon inside social links menu if there is supported URL. + if ( 'social' === $args->theme_location ) { + $svg = TwentyTwenty_SVG_Icons::get_social_link_svg( $item->url ); + if ( empty( $svg ) ) { + $svg = twentytwenty_get_theme_svg( 'link' ); + } + $item_output = str_replace( $args->link_after, '</span>' . $svg, $item_output ); + } + + return $item_output; +} + +add_filter( 'walker_nav_menu_start_el', 'twentytwenty_nav_menu_social_icons', 10, 4 ); + +/** + * Classes + */ +/** + * Add No-JS Class. + * If we're missing JavaScript support, the HTML element will have a no-js class. + */ +function twentytwenty_no_js_class() { + + ?> + <script>document.documentElement.className = document.documentElement.className.replace( 'no-js', 'js' );</script> + <?php + +} + +add_action( 'wp_head', 'twentytwenty_no_js_class' ); + +/** + * Add conditional body classes. + * + * @param array $classes Classes added to the body tag. + * + * @return array $classes Classes added to the body tag. + */ +function twentytwenty_body_classes( $classes ) { + + global $post; + $post_type = isset( $post ) ? $post->post_type : false; + + // Check whether we're singular. + if ( is_singular() ) { + $classes[] = 'singular'; + } + + // Check whether the current page should have an overlay header. + if ( is_page_template( array( 'templates/template-cover.php' ) ) ) { + $classes[] = 'overlay-header'; + } + + // Check whether the current page has full-width content. + if ( is_page_template( array( 'templates/template-full-width.php' ) ) ) { + $classes[] = 'has-full-width-content'; + } + + // Check for enabled search. + if ( true === get_theme_mod( 'enable_header_search', true ) ) { + $classes[] = 'enable-search-modal'; + } + + // Check for post thumbnail. + if ( is_singular() && has_post_thumbnail() ) { + $classes[] = 'has-post-thumbnail'; + } elseif ( is_singular() ) { + $classes[] = 'missing-post-thumbnail'; + } + + // Check whether we're in the customizer preview. + if ( is_customize_preview() ) { + $classes[] = 'customizer-preview'; + } + + // Check if posts have single pagination. + if ( is_single() && ( get_next_post() || get_previous_post() ) ) { + $classes[] = 'has-single-pagination'; + } else { + $classes[] = 'has-no-pagination'; + } + + // Check if we're showing comments. + if ( $post && ( ( 'post' === $post_type || comments_open() || get_comments_number() ) && ! post_password_required() ) ) { + $classes[] = 'showing-comments'; + } else { + $classes[] = 'not-showing-comments'; + } + + // Check if avatars are visible. + $classes[] = get_option( 'show_avatars' ) ? 'show-avatars' : 'hide-avatars'; + + // Slim page template class names (class = name - file suffix). + if ( is_page_template() ) { + $classes[] = basename( get_page_template_slug(), '.php' ); + } + + // Check for the elements output in the top part of the footer. + $has_footer_menu = has_nav_menu( 'footer' ); + $has_social_menu = has_nav_menu( 'social' ); + $has_sidebar_1 = is_active_sidebar( 'sidebar-1' ); + $has_sidebar_2 = is_active_sidebar( 'sidebar-2' ); + + // Add a class indicating whether those elements are output. + if ( $has_footer_menu || $has_social_menu || $has_sidebar_1 || $has_sidebar_2 ) { + $classes[] = 'footer-top-visible'; + } else { + $classes[] = 'footer-top-hidden'; + } + + // Get header/footer background color. + $header_footer_background = get_theme_mod( 'header_footer_background_color', '#ffffff' ); + $header_footer_background = strtolower( '#' . ltrim( $header_footer_background, '#' ) ); + + // Get content background color. + $background_color = get_theme_mod( 'background_color', 'f5efe0' ); + $background_color = strtolower( '#' . ltrim( $background_color, '#' ) ); + + // Add extra class if main background and header/footer background are the same color. + if ( $background_color === $header_footer_background ) { + $classes[] = 'reduced-spacing'; + } + + return $classes; + +} + +add_filter( 'body_class', 'twentytwenty_body_classes' ); + +/** + * Archives + */ +/** + * Filters the archive title and styles the word before the first colon. + * + * @param string $title Current archive title. + * + * @return string $title Current archive title. + */ +function twentytwenty_get_the_archive_title( $title ) { + + $regex = apply_filters( + 'twentytwenty_get_the_archive_title_regex', + array( + 'pattern' => '/(\A[^\:]+\:)/', + 'replacement' => '<span class="color-accent">$1</span>', + ) + ); + + if ( empty( $regex ) ) { + + return $title; + + } + + return preg_replace( $regex['pattern'], $regex['replacement'], $title ); + +} + +add_filter( 'get_the_archive_title', 'twentytwenty_get_the_archive_title' ); + +/** + * Miscellaneous + */ +/** + * Toggle animation duration in milliseconds. + * + * @return integer Duration in milliseconds + */ +function twentytwenty_toggle_duration() { + /** + * Filters the animation duration/speed used usually for submenu toggles. + * + * @since Twenty Twenty 1.0 + * + * @param integer $duration Duration in milliseconds. + */ + $duration = apply_filters( 'twentytwenty_toggle_duration', 250 ); + + return $duration; +} + +/** + * Get unique ID. + * + * This is a PHP implementation of Underscore's uniqueId method. A static variable + * contains an integer that is incremented with each call. This number is returned + * with the optional prefix. As such the returned value is not universally unique, + * but it is unique across the life of the PHP process. + * + * @see wp_unique_id() Themes requiring WordPress 5.0.3 and greater should use this instead. + * + * @staticvar int $id_counter + * + * @param string $prefix Prefix for the returned ID. + * @return string Unique ID. + */ +function twentytwenty_unique_id( $prefix = '' ) { + static $id_counter = 0; + if ( function_exists( 'wp_unique_id' ) ) { + return wp_unique_id( $prefix ); + } + return $prefix . (string) ++$id_counter; +} diff --git a/content/themes/twentytwenty/index.php b/content/themes/twentytwenty/index.php new file mode 100644 index 0000000..54700e8 --- /dev/null +++ b/content/themes/twentytwenty/index.php @@ -0,0 +1,117 @@ +<?php +/** + * The main template file + * + * This is the most generic template file in a WordPress theme + * and one of the two required files for a theme (the other being style.css). + * It is used to display a page when nothing more specific matches a query. + * E.g., it puts together the home page when no home.php file exists. + * + * @link https://developer.wordpress.org/themes/basics/template-hierarchy/ + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +get_header(); +?> + +<main id="site-content" role="main"> + + <?php + + $archive_title = ''; + $archive_subtitle = ''; + + if ( is_search() ) { + global $wp_query; + + $archive_title = sprintf( + '%1$s %2$s', + '<span class="color-accent">' . __( 'Search:', 'twentytwenty' ) . '</span>', + '“' . get_search_query() . '”' + ); + + if ( $wp_query->found_posts ) { + $archive_subtitle = sprintf( + /* translators: %s: Number of search results. */ + _n( + 'We found %s result for your search.', + 'We found %s results for your search.', + $wp_query->found_posts, + 'twentytwenty' + ), + number_format_i18n( $wp_query->found_posts ) + ); + } else { + $archive_subtitle = __( 'We could not find any results for your search. You can give it another try through the search form below.', 'twentytwenty' ); + } + } elseif ( ! is_home() ) { + $archive_title = get_the_archive_title(); + $archive_subtitle = get_the_archive_description(); + } + + if ( $archive_title || $archive_subtitle ) { + ?> + + <header class="archive-header has-text-align-center header-footer-group"> + + <div class="archive-header-inner section-inner medium"> + + <?php if ( $archive_title ) { ?> + <h1 class="archive-title"><?php echo wp_kses_post( $archive_title ); ?></h1> + <?php } ?> + + <?php if ( $archive_subtitle ) { ?> + <div class="archive-subtitle section-inner thin max-percentage intro-text"><?php echo wp_kses_post( wpautop( $archive_subtitle ) ); ?></div> + <?php } ?> + + </div><!-- .archive-header-inner --> + + </header><!-- .archive-header --> + + <?php + } + + if ( have_posts() ) { + + $i = 0; + + while ( have_posts() ) { + $i++; + if ( $i > 1 ) { + echo '<hr class="post-separator styled-separator is-style-wide section-inner" aria-hidden="true" />'; + } + the_post(); + + get_template_part( 'template-parts/content', get_post_type() ); + + } + } elseif ( is_search() ) { + ?> + + <div class="no-search-results-form section-inner thin"> + + <?php + get_search_form( + array( + 'label' => __( 'search again', 'twentytwenty' ), + ) + ); + ?> + + </div><!-- .no-search-results --> + + <?php + } + ?> + + <?php get_template_part( 'template-parts/pagination' ); ?> + +</main><!-- #site-content --> + +<?php get_template_part( 'template-parts/footer-menus-widgets' ); ?> + +<?php +get_footer(); diff --git a/content/themes/twentytwenty/package-lock.json b/content/themes/twentytwenty/package-lock.json new file mode 100644 index 0000000..e2d5a61 --- /dev/null +++ b/content/themes/twentytwenty/package-lock.json @@ -0,0 +1,13041 @@ +{ + "name": "twentytwenty", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.0.tgz", + "integrity": "sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helpers": "^7.6.0", + "@babel/parser": "^7.6.0", + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.0", + "@babel/types": "^7.6.0", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", + "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0", + "esutils": "^2.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.0.tgz", + "integrity": "sha512-W9kao7OBleOjfXtFGgArGRX6eCP0UEcA2ZWEWNkJdRZnHhW4eEbeswbG3EwaRsnQUAEGWYgMq1HsIXuNNNy2eQ==", + "dev": true, + "requires": { + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz", + "integrity": "sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", + "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz", + "integrity": "sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.13" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", + "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.0.tgz", + "integrity": "sha512-Da8tMf7uClzwUm/pnJ1S93m/aRXmoYNDD7TkHua8xBDdaAs54uZpTWvEt6NGwmoVMb9mZbntfTqmG2oSzN/7Vg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/preset-env": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.0.tgz", + "integrity": "sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.0", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.6.0", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.0.tgz", + "integrity": "sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@hapi/address": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.1.tgz", + "integrity": "sha512-DYuHzu978pP1XW1GD3HGvLnAFjbQTIgc2+V153FGkbS2pgo9haigCdwBnUDrbhaOkgiJlbZvoEqDrcxSLHpiWA==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.4.tgz", + "integrity": "sha512-Ze5SDNt325yZvNO7s5C4fXDscjJ6dcqLFXJQ/M7dZRQCewuDj2iDUuBi6jLQt+APbW9RjjVEvLr35FXuOEqjow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", + "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", + "dev": true, + "requires": { + "@hapi/hoek": "8.x.x" + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", + "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", + "dev": true + }, + "@types/vfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", + "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/unist": "*", + "@types/vfile-message": "*" + } + }, + "@types/vfile-message": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", + "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/unist": "*" + } + }, + "@types/yargs": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", + "dev": true + }, + "@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", + "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-scope": "^4.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.4.3.tgz", + "integrity": "sha512-S6npYhPcTHDYe9nlsKa9CyWByFi8Vj8HovcAgtmMAQZUOczOZbQ8CnwMYKYC5HEZzxEE+oY0jfQk4cVlI3J59Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/wast-parser": "1.4.3", + "debug": "^3.1.0", + "webassemblyjs": "1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz", + "integrity": "sha512-3zTkSFswwZOPNHnzkP9ONq4bjJSeKVMcuahGXubrlLmZP8fmTIJ58dW7h/zOVWiFSuG2em3/HH3BlCN7wyu9Rw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz", + "integrity": "sha512-e8+KZHh+RV8MUvoSRtuT1sFXskFnWG9vbDy47Oa166xX+l0dD5sERJ21g5/tcH8Yo95e9IN3u7Jc3NbhnUcSkw==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz", + "integrity": "sha512-9FgHEtNsZQYaKrGCtsjswBil48Qp1agrzRcPzCbQloCoaTbOXLJ9IRmqT+uEZbenpULLRNFugz3I4uw18hJM8w==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.4.3" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz", + "integrity": "sha512-JINY76U+702IRf7ePukOt037RwmtH59JHvcdWbTTyHi18ixmQ+uOuNhcdCcQHTquDAH35/QgFlp3Y9KqtyJsCQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz", + "integrity": "sha512-I7bS+HaO0K07Io89qhJv+z1QipTpuramGwUSDkwEaficbSvCcL92CUZEtgykfNtk5wb0CoLQwWlmXTwGbNZUeQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz", + "integrity": "sha512-p0yeeO/h2r30PyjnJX9xXSR6EDcvJd/jC6xa/Pxg4lpfcNi7JUswOpqDToZQ55HMMVhXDih/yqkaywHWGLxqyQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-buffer": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/wasm-gen": "1.4.3", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/leb128": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.4.3.tgz", + "integrity": "sha512-4u0LJLSPzuRDWHwdqsrThYn+WqMFVqbI2ltNrHvZZkzFPO8XOZ0HFQ5eVc4jY/TNHgXcnwrHjONhPGYuuf//KQ==", + "dev": true, + "requires": { + "leb": "^0.3.0" + } + }, + "@webassemblyjs/validation": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/validation/-/validation-1.4.3.tgz", + "integrity": "sha512-R+rRMKfhd9mq0rj2mhU9A9NKI2l/Rw65vIYzz4lui7eTKPcCu1l7iZNi4b9Gen8D42Sqh/KGiaQNk/x5Tn/iBQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3" + } + }, + "@webassemblyjs/wasm-edit": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz", + "integrity": "sha512-qzuwUn771PV6/LilqkXcS0ozJYAeY/OKbXIWU3a8gexuqb6De2p4ya/baBeH5JQ2WJdfhWhSvSbu86Vienttpw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-buffer": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/helper-wasm-section": "1.4.3", + "@webassemblyjs/wasm-gen": "1.4.3", + "@webassemblyjs/wasm-opt": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "@webassemblyjs/wast-printer": "1.4.3", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz", + "integrity": "sha512-eR394T8dHZfpLJ7U/Z5pFSvxl1L63JdREebpv9gYc55zLhzzdJPAuxjBYT4XqevUdW67qU2s0nNA3kBuNJHbaQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/leb128": "1.4.3" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz", + "integrity": "sha512-7Gp+nschuKiDuAL1xmp4Xz0rgEbxioFXw4nCFYEmy+ytynhBnTeGc9W9cB1XRu1w8pqRU2lbj2VBBA4cL5Z2Kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-buffer": "1.4.3", + "@webassemblyjs/wasm-gen": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz", + "integrity": "sha512-KXBjtlwA3BVukR/yWHC9GF+SCzBcgj0a7lm92kTOaa4cbjaTaa47bCjXw6cX4SGQpkncB9PU2hHGYVyyI7wFRg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/leb128": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "webassemblyjs": "1.4.3" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz", + "integrity": "sha512-QhCsQzqV0CpsEkRYyTzQDilCNUZ+5j92f+g35bHHNqS22FppNTywNFfHPq8ZWZfYCgbectc+PoghD+xfzVFh1Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/floating-point-hex-parser": "1.4.3", + "@webassemblyjs/helper-code-frame": "1.4.3", + "@webassemblyjs/helper-fsm": "1.4.3", + "long": "^3.2.0", + "webassemblyjs": "1.4.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz", + "integrity": "sha512-EgXk4anf8jKmuZJsqD8qy5bz2frEQhBvZruv+bqwNoLWUItjNSFygk8ywL3JTEz9KtxTlAmqTXNrdD1d9gNDtg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/wast-parser": "1.4.3", + "long": "^3.2.0" + } + }, + "@wordpress/babel-plugin-import-jsx-pragma": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-2.3.0.tgz", + "integrity": "sha512-b45c4x1+OvQm1f6egrBruO8eVF4bRVRZ8ojM1ttDcMi+K/qXfun3J6O8xXpSnA5eeNCZaJL3DhIk/aoNBbpwzw==", + "dev": true + }, + "@wordpress/babel-preset-default": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-4.6.0.tgz", + "integrity": "sha512-qx7sHrhsdb5NOHxXFDoTgKU2G8zCB+fBO2PZdkF5x+6PRdqfvbiJ1i848qcMARSqhwY7tHB3R7KOPLZGHbq2hw==", + "dev": true, + "requires": { + "@babel/core": "^7.4.4", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/plugin-transform-react-jsx": "^7.3.0", + "@babel/plugin-transform-runtime": "^7.4.4", + "@babel/preset-env": "^7.4.4", + "@babel/runtime": "^7.4.4", + "@wordpress/babel-plugin-import-jsx-pragma": "^2.3.0", + "@wordpress/browserslist-config": "^2.6.0", + "@wordpress/element": "^2.8.0", + "core-js": "^3.1.4" + } + }, + "@wordpress/browserslist-config": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-2.6.0.tgz", + "integrity": "sha512-vRgzGoxhcNVChBP30XZlyK4w6r/9ZpO+Fi1dzmButp31lUEb1pT5WBxTIQl3HE0JZ9YTEJ00WWGO5sjGi5MHZA==", + "dev": true + }, + "@wordpress/dependency-extraction-webpack-plugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-2.0.0.tgz", + "integrity": "sha512-RJSbpnLBndYu02jrzbk0MTUi4uoOiEHXYSe9s8YM/40yJnUm6k1PvrytDG6VxFbjFARCCOzKgU70L+/xeC4pLQ==", + "dev": true, + "requires": { + "json2php": "^0.0.4", + "webpack": "^4.8.3", + "webpack-sources": "^1.3.0" + } + }, + "@wordpress/element": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-2.8.0.tgz", + "integrity": "sha512-fjFKf4h6dxjlTW4HKp+UNcCQDQaUGFLwjK6hMmet5YhklYvyg/+3bvDx1qqxe1BbY7kYvVhzVmldhJctOKPglQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.4", + "@wordpress/escape-html": "^1.5.0", + "lodash": "^4.17.14", + "react": "^16.9.0", + "react-dom": "^16.9.0" + } + }, + "@wordpress/escape-html": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-1.5.0.tgz", + "integrity": "sha512-9jGwPbpdJ309EP4Acf6/zwHWeuYi0Bi5RAZx9q+BIYC7bjxLs3oFDS5QkEAi2mzrVAhIz+BbEWBGRg70U1RLlA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@wordpress/eslint-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-3.1.0.tgz", + "integrity": "sha512-i/eNTWll3OH7rFukG2pNZXlOl0xihnuxg/2maEEMGzLS8dA8TEwyzCUXCqKycpOLR9sqODhdWFjeQBAPIjpZHg==", + "dev": true, + "requires": { + "babel-eslint": "^10.0.2", + "eslint-plugin-jest": "^22.15.1", + "eslint-plugin-jsdoc": "^15.8.0", + "eslint-plugin-jsx-a11y": "^6.2.3", + "eslint-plugin-react": "^7.14.3", + "eslint-plugin-react-hooks": "^1.6.1", + "globals": "^12.0.0", + "requireindex": "^1.2.0" + }, + "dependencies": { + "globals": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.1.0.tgz", + "integrity": "sha512-GQ4xcAfbMWx/Lly8PUHIn8/t2o7YEoMWnQ7nhJtjEJ1gs8I4Y+koc0GiraVMaSjc9Ghz99obkMau/tSK/ACEsQ==", + "dev": true, + "requires": { + "type-fest": "^0.6.0" + } + } + } + }, + "@wordpress/jest-console": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-3.3.0.tgz", + "integrity": "sha512-ga6KMvj81IclhT/3z7GYQZPdVYhBbasjYbCuzMwyFLMDGu3AZJVsxhTFufr2co3cSi03Z8dhWL2Mm9IEzQujdA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.4", + "jest-matcher-utils": "^24.7.0", + "lodash": "^4.17.14" + } + }, + "@wordpress/jest-preset-default": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-5.1.0.tgz", + "integrity": "sha512-BqUkdxlE2RpLwQ+I9O5Tt5RrrxShfLK8Q3cooK+gjOv7ycaD81qkngwIx9oRdSf9iscFkVIAhRiVTNnNba9Hjg==", + "dev": true, + "requires": { + "@wordpress/jest-console": "^3.3.0", + "babel-jest": "^24.7.1", + "enzyme": "^3.9.0", + "enzyme-adapter-react-16": "^1.10.0", + "enzyme-to-json": "^3.3.5" + } + }, + "@wordpress/npm-package-json-lint-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-2.1.0.tgz", + "integrity": "sha512-NSwcK7GtlmW5O5ZMG7elRKBa9sPws17Sadjlztig6ShOuhlLFeHYk99tUenpmJ/PYOZex4fSJ5e9mqjPyKunjw==", + "dev": true + }, + "@wordpress/scripts": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-5.0.0.tgz", + "integrity": "sha512-pidfRYMyG8RBwLLGto6VuMgeOrnfI/Ah/e4IBhvnLLMZOq1KW1mT8Am1k9idrMSnab0cmhOuNVQ2qifk/DR1aA==", + "dev": true, + "requires": { + "@wordpress/babel-preset-default": "^4.6.0", + "@wordpress/dependency-extraction-webpack-plugin": "^2.0.0", + "@wordpress/eslint-plugin": "^3.1.0", + "@wordpress/jest-preset-default": "^5.1.0", + "@wordpress/npm-package-json-lint-config": "^2.1.0", + "babel-jest": "^24.7.1", + "babel-loader": "^8.0.5", + "chalk": "^2.4.1", + "check-node-version": "^3.1.1", + "command-exists": "1.2.8", + "cross-spawn": "^5.1.0", + "decompress-zip": "0.2.2", + "eslint": "^6.1.0", + "jest": "^24.7.1", + "jest-puppeteer": "^4.3.0", + "js-yaml": "3.13.1", + "lodash": "^4.17.14", + "minimist": "^1.2.0", + "npm-package-json-lint": "^3.6.0", + "puppeteer": "^1.19.0", + "read-pkg-up": "^1.0.1", + "request": "2.88.0", + "resolve-bin": "^0.4.0", + "source-map-loader": "^0.2.4", + "sprintf-js": "^1.1.1", + "stylelint": "^9.10.1", + "stylelint-config-wordpress": "^13.1.0", + "thread-loader": "^2.1.2", + "webpack": "4.8.3", + "webpack-bundle-analyzer": "^3.3.2", + "webpack-cli": "^3.1.2", + "webpack-livereload-plugin": "^2.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "abab": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", + "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "dev": true + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "airbnb-prop-types": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz", + "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", + "dev": true, + "requires": { + "array.prototype.find": "^2.1.0", + "function.prototype.name": "^1.1.1", + "has": "^1.0.3", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0", + "prop-types": "^15.7.2", + "prop-types-exact": "^1.2.0", + "react-is": "^16.9.0" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.find": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", + "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.13.0" + } + }, + "array.prototype.flat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", + "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "dev": true, + "requires": { + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "dev": true, + "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + } + }, + "bail": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", + "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "dev": true, + "requires": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "dev": true, + "requires": { + "bytes": "1", + "string_decoder": "0.10" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" + } + }, + "bser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "ccount": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", + "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==", + "dev": true + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "character-entities": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", + "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==", + "dev": true + }, + "character-entities-html4": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.3.tgz", + "integrity": "sha512-SwnyZ7jQBCRHELk9zf2CN5AnGEc2nA+uKMZLHvcqhpPprjkYhiLn0DywMHgN5ttFZuITMATbh68M6VIVKwJbcg==", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", + "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", + "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-node-version": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/check-node-version/-/check-node-version-3.3.0.tgz", + "integrity": "sha512-OAtp7prQf+8YYKn2UB/fK1Ppb9OT+apW56atoKYUvucYLPq69VozOY0B295okBwCKymk2cictrS3qsdcZwyfzw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "map-values": "^1.0.1", + "minimist": "^1.2.0", + "object-filter": "^1.0.2", + "object.assign": "^4.0.4", + "run-parallel": "^1.1.4", + "semver": "^5.0.3" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "dev": true + }, + "chrome-trace-event": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz", + "integrity": "sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "dev": true, + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "clone-regexp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", + "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", + "dev": true, + "requires": { + "is-regexp": "^1.0.0", + "is-supported-regexp-flag": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collapse-white-space": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", + "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-exists": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", + "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==", + "dev": true + }, + "commander": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", + "dev": true + }, + "comment-parser": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.6.2.tgz", + "integrity": "sha512-Wdms0Q8d4vvb2Yk72OwZjwNWtMklbC5Re7lD9cjCP/AG1fhocmc0TrxGBBAXPLy8fZQPrfHGgyygwI0lA7pbzA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concurrently": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", + "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "date-fns": "^1.30.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^4.5.0", + "tree-kill": "^1.2.1", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", + "dev": true + }, + "core-js-compat": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", + "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", + "dev": true, + "requires": { + "browserslist": "^4.6.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cwd": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", + "integrity": "sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=", + "dev": true, + "requires": { + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "damerau-levenshtein": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-zip": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.2.2.tgz", + "integrity": "sha512-v+Na3Ck86Px7s2ix+f77pMQC3GlkxHHN+YyvnkEW7+xX5F39pcDpIV/VFvGYk8MznTFcMoPjL3XNWEJLXWoSPw==", + "dev": true, + "requires": { + "binary": "^0.3.0", + "graceful-fs": "^4.1.3", + "mkpath": "^0.1.0", + "nopt": "^3.0.1", + "q": "^1.1.2", + "readable-stream": "^1.1.8", + "touch": "0.0.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", + "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", + "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.262", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.262.tgz", + "integrity": "sha512-YFr53qZWr2pWkiTUorWEhAweujdf0ALiUp8VkNa0WGtbMVR+kZ8jNy3VTCemLsA4sT6+srCqehNn8TEAD0Ngrw==", + "dev": true + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "enzyme": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.10.0.tgz", + "integrity": "sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg==", + "dev": true, + "requires": { + "array.prototype.flat": "^1.2.1", + "cheerio": "^1.0.0-rc.2", + "function.prototype.name": "^1.1.0", + "has": "^1.0.3", + "html-element-map": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-callable": "^1.1.4", + "is-number-object": "^1.0.3", + "is-regex": "^1.0.4", + "is-string": "^1.0.4", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.6.0", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4", + "object.values": "^1.0.4", + "raf": "^3.4.0", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.1.2" + } + }, + "enzyme-adapter-react-16": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.14.0.tgz", + "integrity": "sha512-7PcOF7pb4hJUvjY7oAuPGpq3BmlCig3kxXGi2kFx0YzJHppqX1K8IIV9skT1IirxXlu8W7bneKi+oQ10QRnhcA==", + "dev": true, + "requires": { + "enzyme-adapter-utils": "^1.12.0", + "has": "^1.0.3", + "object.assign": "^4.1.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "react-is": "^16.8.6", + "react-test-renderer": "^16.0.0-0", + "semver": "^5.7.0" + } + }, + "enzyme-adapter-utils": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.0.tgz", + "integrity": "sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA==", + "dev": true, + "requires": { + "airbnb-prop-types": "^2.13.2", + "function.prototype.name": "^1.1.0", + "object.assign": "^4.1.0", + "object.fromentries": "^2.0.0", + "prop-types": "^15.7.2", + "semver": "^5.6.0" + } + }, + "enzyme-to-json": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.4.0.tgz", + "integrity": "sha512-gbu8P8PMAtb+qtKuGVRdZIYxWHC03q1dGS3EKRmUzmTDIracu3o6cQ0d4xI2YWojbelbxjYOsmqM5EgAL0WgIA==", + "dev": true, + "requires": { + "lodash": "^4.17.12" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.0.tgz", + "integrity": "sha512-M6t3j3Vt3uDicrViMP5fLq2AeADNrCVFD8Oj4Qt2MHsX0mPYG7D5XdnEfSdRpaHQzjAJ19wu+I1mw9rQYMTAPg==", + "dev": true, + "requires": { + "string-template": "~0.2.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", + "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "eslint": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.4.0.tgz", + "integrity": "sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.2", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.4.1", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "22.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.17.0.tgz", + "integrity": "sha512-WT4DP4RoGBhIQjv+5D0FM20fAdAUstfYAf/mkufLNTojsfgzc5/IYW22cIg/Q4QBavAZsROQlqppiWDpFZDS8Q==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^1.13.0" + } + }, + "eslint-plugin-jsdoc": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-15.9.2.tgz", + "integrity": "sha512-dJjIWFJlh4ti3CegWYN0jUUdjEsWvJ8TZJ/cMQldioVLxMmU3UZeZsHzxYcCicJwSVhQ+uGm+dbUyEIm0slX3Q==", + "dev": true, + "requires": { + "comment-parser": "^0.6.2", + "debug": "^4.1.1", + "jsdoctypeparser": "5.0.1", + "lodash": "^4.17.15", + "object.entries-ponyfill": "^1.0.1", + "regextras": "^0.6.1" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.5", + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1" + } + }, + "eslint-plugin-react": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", + "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.1.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.10.1" + } + }, + "eslint-plugin-react-hooks": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", + "dev": true + }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", + "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-jsx": "^5.0.2", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "execall": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", + "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "dev": true, + "requires": { + "clone-regexp": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + } + }, + "expect-puppeteer": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-4.3.0.tgz", + "integrity": "sha512-p8N/KSVPG9PAOJlftK5f1n3JrULJ6Qq1EQ8r/n9xzkX2NmXbK8PcnJnkSAEzEHrMycELKGnlJV7M5nkgm+wEWA==", + "dev": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-file-up": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", + "integrity": "sha1-z2gJG8+fMApA2kEbN9pczlovvqA=", + "dev": true, + "requires": { + "fs-exists-sync": "^0.1.0", + "resolve-dir": "^0.1.0" + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "find-pkg": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", + "integrity": "sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc=", + "dev": true, + "requires": { + "find-file-up": "^0.1.2" + } + }, + "find-process": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.2.tgz", + "integrity": "sha512-O83EVJr4dWvHJ7QpUzANNAMeQVKukRzRqRx4AIzdLYRrQorRdbqDwLPigkd9PYPhJRhmNPAoVjOm9bcwSmcZaw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "commander": "^2.11.0", + "debug": "^2.6.8" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", + "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", + "dev": true, + "requires": { + "colors": "~0.6.0-1", + "commander": "~2.1.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": false, + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": false, + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": false, + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "resolved": false, + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": false, + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": false, + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": false, + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": false, + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": false, + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": false, + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": false, + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": false, + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "resolved": false, + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "resolved": false, + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": false, + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "resolved": false, + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "resolved": false, + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "resolved": false, + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": false, + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": false, + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "resolved": false, + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": false, + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": false, + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": false, + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "resolved": false, + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": false, + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": false, + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": false, + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": false, + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": false, + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "resolved": false, + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": false, + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "resolved": false, + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": false, + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "resolved": false, + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz", + "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1", + "functions-have-names": "^1.1.1", + "is-callable": "^1.1.4" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "functions-have-names": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.1.1.tgz", + "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + }, + "dependencies": { + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + } + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + }, + "dependencies": { + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "gonzales-pe": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.4.tgz", + "integrity": "sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ==", + "dev": true, + "requires": { + "minimist": "1.1.x" + }, + "dependencies": { + "minimist": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "handlebars": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.2.tgz", + "integrity": "sha512-cIv17+GhL8pHHnRJzGu2wwcthL5sb8uDKBHvZ2Dtu5s1YNt0ljbzKbamnc+gr69y7bzwQiBdr5+hOpRd5pnOdg==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "commander": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", + "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==", + "dev": true, + "optional": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true + }, + "html-element-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.1.0.tgz", + "integrity": "sha512-iqiG3dTZmy+uUaTmHarTL+3/A2VW9ox/9uasKEZC+R/wAtUrTcRlXPSaPqsnWPfIu8wqn09jQNwMRqzL54jSYA==", + "dev": true, + "requires": { + "array-filter": "^1.0.0" + } + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "irregular-plurals": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", + "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", + "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==", + "dev": true + }, + "is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", + "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", + "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-decimal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", + "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", + "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-supported-regexp-flag": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", + "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-whitespace-character": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", + "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-word-character": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz", + "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" + }, + "dependencies": { + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "dev": true, + "requires": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + } + } + }, + "jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + } + }, + "jest-dev-server": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-4.3.0.tgz", + "integrity": "sha512-bC9flKY2G1honQ/UI0gEhb0wFnDhpFr7xidC8Nk+evi7TgnNtfsGIzzF2dcIhF1G9BGF0n/M7CJrMAzwQhyTPA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cwd": "^0.10.0", + "find-process": "^1.4.2", + "prompts": "^2.1.0", + "spawnd": "^4.0.0", + "tree-kill": "^1.2.1", + "wait-on": "^3.3.0" + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" + } + }, + "jest-environment-puppeteer": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-4.3.0.tgz", + "integrity": "sha512-ZighMsU39bnacn2ylyHb88CB+ldgCfXGD3lS78k4PEo8A8xyt6+2mxmSR62FH3Y7K+W2gPDu5+QM3/LZuq42fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cwd": "^0.10.0", + "jest-dev-server": "^4.3.0", + "merge-deep": "^3.0.2" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" + } + }, + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "dev": true, + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-puppeteer": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-4.3.0.tgz", + "integrity": "sha512-WXhaWlbQl01xadZyNmdZntrtIr8uWUmgjPogDih7dOnr3G/xRr3A034SCqdjwV6fE0tqz7c5hwO8oBTyGZPRgA==", + "dev": true, + "requires": { + "expect-puppeteer": "^4.3.0", + "jest-environment-puppeteer": "^4.3.0" + } + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" + } + }, + "jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, + "jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + } + }, + "jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.9.0", + "string-length": "^2.0.0" + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdoctypeparser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-5.0.1.tgz", + "integrity": "sha512-dYwcK6TKzvq+ZKtbp4sbQSW9JMo6s+4YFfUs5D/K7bZsn3s1NhEhZ+jmIPzby0HbkbECBe+hNPEa6a+E21o94w==", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json2php": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.4.tgz", + "integrity": "sha1-a9haHdpqXdfpECK7JEA8wbfC7jQ=", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", + "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "known-css-properties": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.11.0.tgz", + "integrity": "sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==", + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "leb": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz", + "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=", + "dev": true + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, + "longest-streak": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.3.tgz", + "integrity": "sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "map-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz", + "integrity": "sha1-douOecAJvytk/ugG4ip7HEGQyZA=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz", + "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==", + "dev": true + }, + "markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true + }, + "mathml-tag-names": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz", + "integrity": "sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdast-util-compact": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.3.tgz", + "integrity": "sha512-nRiU5GpNy62rZppDKbLwhhtw5DXoFMqw9UNZFmlPsNaQCZ//WLjGKUwWMdJrUH+Se7UvtO2gXtAMe0g/N+eI5w==", + "dev": true, + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "merge-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", + "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mkpath": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", + "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=", + "dev": true + }, + "moo": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", + "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nearley": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.19.0.tgz", + "integrity": "sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "moo": "^0.4.3", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6", + "semver": "^5.4.1" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-releases": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.32.tgz", + "integrity": "sha512-VhVknkitq8dqtWoluagsGPn3dxTvN9fwgR59fV3D7sLBHe0JfDramsMI8n8mY//ccq/Kkrf8ZRHRpsyVZ3qw1A==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, + "npm-package-json-lint": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-3.7.0.tgz", + "integrity": "sha512-eWi1pZ/ZhPHAOMLC1+njBJj81yCu2Ek4VxhwpPHABvSVHS0dkaL6aKhSj/TX8Rtm/0rIg3edgMLt3kSRtWkFaA==", + "dev": true, + "requires": { + "ajv": "^6.10.0", + "chalk": "^2.4.2", + "glob": "^7.1.4", + "ignore": "^5.1.2", + "is-path-inside": "^2.1.0", + "is-plain-obj": "^1.1.0", + "is-resolvable": "^1.1.0", + "log-symbols": "^2.2.0", + "meow": "^5.0.0", + "plur": "^3.1.1", + "semver": "^5.6.0", + "strip-json-comments": "^2.0.1", + "validator": "^10.11.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-filter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz", + "integrity": "sha1-rwt5f/6+r4pSxmN87b6IFs/sG8g=", + "dev": true + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.entries-ponyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.entries-ponyfill/-/object.entries-ponyfill-1.0.1.tgz", + "integrity": "sha1-Kavfd8v70mVm3RqiTp2I9lQz0lY=", + "dev": true + }, + "object.fromentries": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", + "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.11.0", + "function-bind": "^1.1.1", + "has": "^1.0.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "plur": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", + "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "dev": true, + "requires": { + "irregular-plurals": "^2.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "portfinder": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz", + "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-cli": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-6.1.3.tgz", + "integrity": "sha512-eieqJU+OR1OFc/lQqMsDmROTJpoMZFvoAQ+82utBQ8/8qGMTfH9bBSPsTdsagYA8uvNzxHw2I2cNSSJkLAGhvw==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "chokidar": "^2.0.0", + "dependency-graph": "^0.8.0", + "fs-extra": "^7.0.0", + "get-stdin": "^6.0.0", + "globby": "^9.0.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "postcss-reporter": "^6.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "yargs": "^12.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", + "dev": true, + "requires": { + "htmlparser2": "^3.10.0" + } + }, + "postcss-jsx": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/postcss-jsx/-/postcss-jsx-0.36.3.tgz", + "integrity": "sha512-yV8Ndo6KzU8eho5mCn7LoLUGPkXrRXRjhMpX4AaYJ9wLJPv099xbtpbRQ8FrPnzVxb/cuMebbPR7LweSt+hTfA==", + "dev": true, + "requires": { + "@babel/core": ">=7.2.2" + } + }, + "postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-markdown": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.36.0.tgz", + "integrity": "sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==", + "dev": true, + "requires": { + "remark": "^10.0.1", + "unist-util-find-all-after": "^1.0.2" + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, + "postcss-reporter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", + "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "lodash": "^4.17.11", + "log-symbols": "^2.2.0", + "postcss": "^7.0.7" + }, + "dependencies": { + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "postcss-safe-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", + "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-sass": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.5.tgz", + "integrity": "sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A==", + "dev": true, + "requires": { + "gonzales-pe": "^4.2.3", + "postcss": "^7.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-scss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz", + "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prompts": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "prop-types-exact": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", + "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", + "dev": true, + "requires": { + "has": "^1.0.3", + "object.assign": "^4.1.0", + "reflect.ownkeys": "^0.2.0" + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "puppeteer": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "dependencies": { + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "requires": { + "performance-now": "^2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } + }, + "react-is": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", + "dev": true + }, + "react-test-renderer": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.9.0.tgz", + "integrity": "sha512-R62stB73qZyhrJo7wmCW9jgl/07ai+YzvouvCXIJLBkRlRqLx4j9RqcLEAfNfU3OxTGucqR2Whmn3/Aad6L3hQ==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "react-is": "^16.9.0", + "scheduler": "^0.15.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "reflect.ownkeys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", + "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.13.tgz", + "integrity": "sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regextras": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.6.1.tgz", + "integrity": "sha512-EzIHww9xV2Kpqx+corS/I7OBmf2rZ0pKKJPsw5Dc+l6Zq1TslDmtRIP9maVn3UH+72MIXmn8zzDgP07ihQogUA==", + "dev": true + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remark": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", + "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==", + "dev": true, + "requires": { + "remark-parse": "^6.0.0", + "remark-stringify": "^6.0.0", + "unified": "^7.0.0" + } + }, + "remark-parse": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", + "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", + "dev": true, + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + } + }, + "remark-stringify": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz", + "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^1.1.0", + "mdast-util-compact": "^1.0.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^1.0.1", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-bin": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.0.tgz", + "integrity": "sha1-RxMiSYkRAa+xmZH+k3ywpfBy5dk=", + "dev": true, + "requires": { + "find-parent-dir": "~0.3.0" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "rtlcss": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.4.0.tgz", + "integrity": "sha512-hdjFhZ5FCI0ABOfyXOMOhBtwPWtANLCG7rOiOcRf+yi5eDdxmDjqBruWouEnwVdzfh/TWF6NNncIEsigOCFZOA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "findup": "^0.1.5", + "mkdirp": "^0.5.1", + "postcss": "^6.0.14", + "strip-json-comments": "^2.0.0" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "scheduler": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz", + "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sisteransi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spawnd": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-4.0.0.tgz", + "integrity": "sha512-ql3qhJnhAkvXpaqKBWOqou1rUTSQhFRaZkyOT+MTFB4xY3X+brgw6LTWV2wHuE9A6YPhrNe1cbg7S+jAYnbC0Q==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "signal-exit": "^3.0.2", + "tree-kill": "^1.2.1", + "wait-port": "^0.2.2" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "state-toggle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz", + "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trim": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz", + "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.13.0", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-entities": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", + "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", + "dev": true, + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "stylelint": { + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.10.1.tgz", + "integrity": "sha512-9UiHxZhOAHEgeQ7oLGwrwoDR8vclBKlSX7r4fH0iuu0SfPwFaLkb1c7Q2j1cqg9P7IDXeAV2TvQML/fRQzGBBQ==", + "dev": true, + "requires": { + "autoprefixer": "^9.0.0", + "balanced-match": "^1.0.0", + "chalk": "^2.4.1", + "cosmiconfig": "^5.0.0", + "debug": "^4.0.0", + "execall": "^1.0.0", + "file-entry-cache": "^4.0.0", + "get-stdin": "^6.0.0", + "global-modules": "^2.0.0", + "globby": "^9.0.0", + "globjoin": "^0.1.4", + "html-tags": "^2.0.0", + "ignore": "^5.0.4", + "import-lazy": "^3.1.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.11.0", + "leven": "^2.1.0", + "lodash": "^4.17.4", + "log-symbols": "^2.0.0", + "mathml-tag-names": "^2.0.1", + "meow": "^5.0.0", + "micromatch": "^3.1.10", + "normalize-selector": "^0.2.0", + "pify": "^4.0.0", + "postcss": "^7.0.13", + "postcss-html": "^0.36.0", + "postcss-jsx": "^0.36.0", + "postcss-less": "^3.1.0", + "postcss-markdown": "^0.36.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-reporter": "^6.0.0", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.0", + "postcss-sass": "^0.3.5", + "postcss-scss": "^2.0.0", + "postcss-selector-parser": "^3.1.0", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^3.3.0", + "resolve-from": "^4.0.0", + "signal-exit": "^3.0.2", + "slash": "^2.0.0", + "specificity": "^0.4.1", + "string-width": "^3.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^5.0.0" + }, + "dependencies": { + "file-entry-cache": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-4.0.0.tgz", + "integrity": "sha512-AVSwsnbV8vH/UVbvgEhf3saVQXORNv0ZzSkvkhQIaia5Tia+JhGTaa/ePUSVoPHQyGayQNmYfkzFi3WZV5zcpA==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "stylelint-a11y": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/stylelint-a11y/-/stylelint-a11y-1.2.1.tgz", + "integrity": "sha512-yfH6ibVkfAlAt7J5ExrzpBPFCSWDTxBL9svdFZ6BfGF5hRmFgTS03x4r/rBAAaNDpgKE32CQz5qcLbgOLzuxfA==", + "dev": true + }, + "stylelint-config-recommended": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-2.2.0.tgz", + "integrity": "sha512-bZ+d4RiNEfmoR74KZtCKmsABdBJr4iXRiCso+6LtMJPw5rd/KnxUWTxht7TbafrTJK1YRjNgnN0iVZaJfc3xJA==", + "dev": true + }, + "stylelint-config-recommended-scss": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-3.3.0.tgz", + "integrity": "sha512-BvuuLYwoet8JutOP7K1a8YaiENN+0HQn390eDi0SWe1h7Uhx6O3GUQ6Ubgie9b/AmHX4Btmp+ZzVGbzriFTBcA==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^2.2.0" + } + }, + "stylelint-config-wordpress": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-wordpress/-/stylelint-config-wordpress-13.1.0.tgz", + "integrity": "sha512-dpKj2/d3/XjDVoOvQzd54GoM8Rj5zldluOZKkVhBCc4JYMc6r1VYL5hpcgIjqy/i2Hyqg4Rh7zTafE/2AWq//w==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^2.1.0", + "stylelint-config-recommended-scss": "^3.2.0", + "stylelint-scss": "^3.3.0" + } + }, + "stylelint-scss": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.11.0.tgz", + "integrity": "sha512-2rA9hV8+ebvzGyRBQt/KCLDS1o11SEVRzOBlhAbqk4u1PVnWcjUhRhKIGGGWcyM4QE9t+YWivbnq6kjdeHg2Nw==", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + } + } + }, + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", + "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "requires": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "touch": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", + "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "trim-trailing-lines": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz", + "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==", + "dev": true + }, + "trough": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", + "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==", + "dev": true + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + } + }, + "unherit": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz", + "integrity": "sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "xtend": "^4.0.1" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, + "unified": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", + "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "@types/vfile": "^3.0.0", + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^3.0.0", + "x-is-string": "^0.1.0" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unist-util-find-all-after": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.4.tgz", + "integrity": "sha512-CaxvMjTd+yF93BKLJvZnEfqdM7fgEACsIpQqz8vIj9CJnUb9VpyymFS3tg6TCtgrF7vfCJBF5jbT2Ox9CBRYRQ==", + "dev": true, + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "dev": true + }, + "unist-util-remove-position": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz", + "integrity": "sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA==", + "dev": true, + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "dev": true + }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dev": true, + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "dev": true, + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", + "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "dev": true, + "requires": { + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } + } + }, + "vfile-location": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.5.tgz", + "integrity": "sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ==", + "dev": true + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "dev": true, + "requires": { + "unist-util-stringify-position": "^1.1.1" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "wait-on": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", + "minimist": "^1.2.0", + "request": "^2.88.0", + "rx": "^4.1.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "wait-port": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.2.tgz", + "integrity": "sha1-1RpJHkhKF791qUfnEaLwErTm8uM=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "commander": "^2.9.0", + "debug": "^2.6.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webassemblyjs": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webassemblyjs/-/webassemblyjs-1.4.3.tgz", + "integrity": "sha512-4lOV1Lv6olz0PJkDGQEp82HempAn147e6BXijWDzz9g7/2nSebVP9GVg62Fz5ZAs55mxq13GA0XLyvY8XkyDjg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/validation": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "@webassemblyjs/wast-parser": "1.4.3", + "long": "^3.2.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.8.3.tgz", + "integrity": "sha512-/hfAjBISycdK597lxONjKEFX7dSIU1PsYwC3XlXUXoykWBlv9QV5HnO+ql3HvrrgfBJ7WXdnjO9iGPR2aAc5sw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/wasm-edit": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "acorn": "^5.0.0", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^0.1.1", + "enhanced-resolve": "^4.0.0", + "eslint-scope": "^3.7.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" + } + }, + "webpack-bundle-analyzer": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.5.0.tgz", + "integrity": "sha512-NzueflueLSJxWGzDlMq5oUV+P8Qoq6yiaQlXGCbDYUpHEKlmzWdPLBJ4k/B6HTdAP/vHM8ply1Fx08mDnY+S8Q==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-cli": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.9.tgz", + "integrity": "sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + } + } + }, + "webpack-livereload-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-livereload-plugin/-/webpack-livereload-plugin-2.2.0.tgz", + "integrity": "sha512-sx9xA5mHoNOUgLQI0PmXT3KV9ecsVmUaTgr+fsoL69qAOHw/7VzkL1+ZMDQ8n0dPbWounswK6cBRSgMod7Nhgg==", + "dev": true, + "requires": { + "portfinder": "^1.0.17", + "tiny-lr": "^1.1.1" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + } + } +} diff --git a/content/themes/twentytwenty/package.json b/content/themes/twentytwenty/package.json new file mode 100644 index 0000000..ba74d72 --- /dev/null +++ b/content/themes/twentytwenty/package.json @@ -0,0 +1,59 @@ +{ + "name": "twentytwenty", + "version": "1.0.0", + "description": "Default WP Theme", + "author": "The WordPress Contributors", + "license": "GPL-2.0-or-later", + "keywords": [ + "WordPress", + "Theme", + "TwentyTwenty" + ], + "homepage": "https://github.com/wordpress/twentytwenty#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/wordpress/twentytwenty.git" + }, + "bugs": { + "url": "https://github.com/wordpress/twentytwenty/issues" + }, + "devDependencies": { + "@wordpress/browserslist-config": "^2.6.0", + "@wordpress/scripts": "^5.0.0", + "autoprefixer": "^9.6.1", + "concurrently": "^4.1.2", + "postcss-cli": "^6.1.3", + "rtlcss": "^2.4.0", + "stylelint-a11y": "^1.2.1" + }, + "browserslist": [ + "extends @wordpress/browserslist-config" + ], + "rtlcssConfig": { + "options": { + "autoRename": false, + "autoRenameStrict": false, + "blacklist": {}, + "clean": true, + "greedy": false, + "processUrls": false, + "stringMap": [] + }, + "plugins": [], + "map": false + }, + "scripts": { + "build": "npm run build:vendor-prefixes && npm run build:rtl", + "build:rtl": "concurrently \"npm run build:rtl-style\" \"npm run build:rtl-esb\" \"npm run build:rtl-esc\"", + "build:rtl-style": "rtlcss style.css style-rtl.css", + "build:rtl-esb": "rtlcss assets/css/editor-style-block.css assets/css/editor-style-block-rtl.css", + "build:rtl-esc": "rtlcss assets/css/editor-style-classic.css assets/css/editor-style-classic-rtl.css", + "build:vendor-prefixes": "concurrently \"npm run build:vendor-prefixes-style\" \"npm run build:vendor-prefixes-esb\" \"npm run build:vendor-prefixes-esc\"", + "build:vendor-prefixes-style": "postcss -r --no-map style.css assets/css/editor-style-block.css assets/css/editor-style-classic.css", + "build:vendor-prefixes-esb": "postcss -r --no-map assets/css/editor-style-block.css ", + "build:vendor-prefixes-esc": "postcss -r --no-map assets/css/editor-style-classic.css", + "lint:css": "wp-scripts lint-style 'style.css' 'assets/**/*.css'", + "lint:js": "wp-scripts lint-js 'assets/**/*.js'", + "lint:pkg-json": "wp-scripts lint-pkg-json" + } +} diff --git a/content/themes/twentytwenty/print.css b/content/themes/twentytwenty/print.css new file mode 100644 index 0000000..0ab0ce9 --- /dev/null +++ b/content/themes/twentytwenty/print.css @@ -0,0 +1,165 @@ +@charset "UTF-8"; + +/* +Theme Name: Twenty Twenty +Adding print support. The print styles are based on the the great work of +Andreas Hecht in https://www.jotform.com/blog/css-perfect-print-stylesheet-98272/. +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- +# Margins +# Paddings +# Width +# Typography +# Page breaks +# Links +# Visibility +--------------------------------------------------------------*/ +@media print { + + /* Margins */ + + @page { + margin: 2cm; + } + + .entry-header, + .site-footer { + margin: 0; + } + + /* Paddings */ + + .posts { + padding: 0; + } + + /* Width */ + + .entry-content, + .entry-content p, + .section-inner, + .section-inner.max-percentage, + .section-inner.medium, + .section-inner.small, + .section-inner.thin { + max-width: 100%; + width: 100%; + } + + /* Fonts */ + + body { + background: #fff !important; + color: #000; + font: 13pt Georgia, "Times New Roman", Times, serif; + line-height: 1.3; + } + + h1 { + font-size: 20pt; + } + + h2, + h2.entry-title, + h3, + h4, + .has-normal-font-size, + .has-regular-font-size, + .has-large-font-size, + .comments-header { + font-size: 14pt; + margin-top: 1cm; + } + + /* Page breaks */ + + a { + page-break-inside: avoid; + } + + blockquote { + page-break-inside: avoid; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + page-break-after: avoid; + page-break-inside: avoid; + } + + img { + page-break-inside: avoid; + page-break-after: avoid; + } + + table, + pre { + page-break-inside: avoid; + } + + ul, + ol, + dl { + page-break-before: avoid; + } + + /* Links */ + + a:link, + a:visited, + a { + background: transparent; + font-weight: bold; + text-decoration: underline; + } + + a { + page-break-inside: avoid; + } + + a[href^="http"]:after { + content: " < " attr(href) "> "; + } + + a:after > img { + content: ""; + } + + article a[href^="#"]:after { + content: ""; + } + + a:not(:local-link):after { + content: " < " attr(href) "> "; + } + + /* Visibility */ + + #site-header, + .comment-form, + .comments-wrapper, + .comment .comment-metadata, + .footer-social-wrapper, + .footer-widgets-outer-wrapper, + .header-navigation-wrapper, + .pagination-wrapper, + .post-meta-wrapper.post-meta-single-bottom, + .post-separator, + .site-logo img { + display: none; + } + + .entry-content .wp-block-button .wp-block-button__link, + .entry-content .wp-block-button .wp-block-file__button, + .entry-content .button { + background: none; + color: #000; + } +} diff --git a/content/themes/twentytwenty/readme.txt b/content/themes/twentytwenty/readme.txt new file mode 100644 index 0000000..cee43d5 --- /dev/null +++ b/content/themes/twentytwenty/readme.txt @@ -0,0 +1,108 @@ +=== Twenty Twenty === +Contributors: the WordPress team +Tested up to: 5.3 +Stable tag: 1.2 +License: GPLv2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html + +Default theme for 2020. + +== Description == + +Our default theme for 2020 is designed to take full advantage of the +flexibility of the block editor. Organizations and businesses have the +ability to create dynamic landing pages with endless layouts using the +group and column blocks. The centered content column and fine-tuned +typography also makes it perfect for traditional blogs. Complete editor +styles give you a good idea of what your content will look like, even +before you publish. You can give your site a personal touch by changing +the background colors and the accent color in the Customizer. The colors of +all elements on your site are automatically calculated based on the colors +you pick, ensuring a high, accessible color contrast for your visitors. + +== Changelog == + += 1.2 = +* Released: March 31, 2020 + +https://wordpress.org/support/article/twenty-twenty-changelog/#Version_1.2 + += 1.1 = +* Released: December 12, 2019 + +https://wordpress.org/support/article/twenty-twenty-changelog/#Version_1.1 + += 1.0 = +* Released: November 12, 2019 + +Initial release + +== Copyright == + +Twenty Twenty WordPress Theme, Copyright 2019-2020 WordPress.org +Twenty Twenty 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. + +Twenty Twenty is derived from the Chaplin Theme, Copyright 2019 Anders Norén +Chaplin Theme is distributed under the terms of the GNU GPL version 2.0 + +Twenty Twenty bundles the following third-party resources: + +Illustrations by Tammie Lister +License: Creative Commons Zero (CC0), https://creativecommons.org/publicdomain/zero/1.0/ + +Inter Font +Copyright (c) 2016-2019 The Inter Project Authors (me@rsms.me) +License: SIL Open Font License, 1.1, https://opensource.org/licenses/OFL-1.1 +Source: https://rsms.me/inter/ + +Bespoke Icons Created For Twenty Twenty +License: Creative Commons Zero (CC0), https://creativecommons.org/publicdomain/zero/1.0/ +List of bespoke icons: +- Search icon +- Menu icon + +Feather Icons +Copyright (c) 2013-2017 Cole Bemis +License: MIT License, https://opensource.org/licenses/MIT +Source: https://feathericons.com +Used for post meta icons, and the link icon in the social menu. + +TikTok Icon +License: GPLv2 +Source: Émilie Lebrun - @Emlebrun +Used for TikTok social icon. + +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 (c) 2018-2020 WordPress.org +License: GPLv2 +Source: https://wordpress.org/themes/twentynineteen/ +Included as part of the following classes and functions: +- TwentyTwenty_SVG_Icons +- twentytwenty_the_theme_svg() +- twentytwenty_get_theme_svg() +- twentytwenty_nav_menu_social_icons() + +Code from Twenty Seventeen +Copyright (c) 2016-2020 WordPress.org +License: GPLv2 +Source: https://wordpress.org/themes/twentyseventeen/ +Included as part of the following classes and functions: +- twentytwenty_unique_id() + +Underscores +https://underscores.me/, (C) 2012-2019 Automattic, Inc., [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html) diff --git a/content/themes/twentytwenty/screenshot.png b/content/themes/twentytwenty/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c2359ec8af5c6ea15ca0727bdb886e2bbcbc100a GIT binary patch literal 53066 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�AOF%{fhspbcpn=RR$U3n0;5;l==CB`&Z^!EA9x>^q?PTfH);g|y z_>lSD>)<XLn1t2`&!cwAE*XS_Bjwum(W<#H6>)TrG%|jRBwYIZ42l)VLtGs{wDr^X zeR`ZmJ0_8cEuvUc!TL1Td(=E<#G2-5+7ky)i{KtJ(;uqF5+{5<4q;o>v1M{>>Xx06 zDAA?)j3SOITYLz6`l`oZu$KYgD^;IZ)8rQ}^_SxklAaS>@f2XRF;QxFI@9hg!cTJs zEXcQAP}9lQ1Hy5wqPjPnt#G<DwvRl+prxW>$GCI!`cb|=!3^iY@O<OfnOUCD2}Q<4 z<+L@YH1FMuOY>0IC!`$^X|y0oZg?`Y*Hml{JBmZ7#MPWb<MB<^L<k(}dkiG5_W2QI zuyx=M$sUk|s75UKl~+h3!O_4|xyT6P*NsaK2ks9bGiy$uocQ7;dx3kO%~dhNpEfRh zIUW2Ni4!VSI^h*MC$9laLWs7ef5K+|Cv$Q}XRyqgP`>D7YPKqdT6=9>={PPr%AoqQ z!ZCjcT1Q8mEn{jF#A^H4E8>Okkf&&sHY*}caWRm|<V(16kTxrSx^kGV3IpN9r=+U^ zyZVTn0-DAJ++!>#^UEo_8hsPg+z|{yS=6&anrTzmobF2*3VZ(C5rubM_40k_5<6Qi zP|6fabsex;(!3`6!R*0zZWey0cR@p2?>;8?@vuYW3JI3urRYH^KdxvH0|C?lFwmWA zTu9*HXv#6v);TJc->!b%s#fx=@oTbZ*|C&!V{*v>wBmqOFh}apVgXv?tLx^aeU~Pq z*E7{U7PSUG$6uRAPiFJ=*@vxaH;&GGmhU)elS(^-R$dc9)-k2yAZ2h=`FM~dC|^1d z%fHA`y#kEPN?RnLQN*bZ+PfB_-e{Z8Df&K3VfwwT>HBc@gB`!?n`c)0o)(-n9@CKN z&Ok6P=ls0tkN9&s;?Zig@W$z?^_GvlFw3aDBo#?aHkn5|pFRylS}9hIst!{_(eQz| zJHkRB`?0T=SIy_yYrZy~yRWLg1i$6axgkc&1F~_aLMzVXp2b0Pv$H8SMUd3FsIxKQ zD|ZghYw!=3mzOL2{QU6qV4=ve73_Pu<pKG?7A8A8*26I}$6)&jjINJc3J{YSU?&Ho z{7yb0yb64FA6y-A5`++@UUOU9aJZ9{xNwk0k$cax^UIA5bG_|V7-Z-U1;r<@f?auF zHCE^4_Z#UShLxl+jMv1ffUs+Zujaxl7Z<`v)$iZquQ&@$745yj%a>vDpa1w#h4Nr~ zJEVPs0d)2L06T+&Boe##vy+#9$fVJuNA)x6V0cm7Y~e03uWDhSi7<-|M*+QATwPyx zH=@)jMOxZB`{KgO4NjoJs5+(^4Qxyk{UAY%a`jb5hoq~!jSX0-F#2nJnT_l#bK+}Y z7Z4zCaK3zFL&I)eU!PpxhHO%;Zys+Gtdz*D8(+|N<-NSmQJ9{d-e)J7GtWcX?%Li> zIU_EKPBjcWRu)fBPn(7I)>g5Rm?xJEQH{sEfpMjLtS7PZ0YvqKGjb%+n1ZpHgXBaJ z-7T^HPgoNw7&RUxn7Cvlo)P)kTVogY^ntiQOzRU(*z0?H>?O?&4J9{MnXaxZ#7$&4 zMWm!10?zfx$t0HyagugJPVjz)OGRkkVX!?{wI*E#`UePkNtS*;4d)9W0lP5xqda|? z)*G=kbTb78czdu01_rRb4zEiTUsHW79X)!QL0_dK>xZm4U(`(Iy{;}4D+)A!@}F~D znY&;go7y~uISJ69x`c>Gps>hvP~uy-p**XNorQ`4-4KcI8|+9N2JZ4_v`p2-aZ6PX zbM;>plZJetN3oNN&o06If$@Hisp_L4{=*^k=C{qwK^Ko<$*QQ(q*b9bXkQ($J&(Bf zzNejDN0Ppiyw|tY7J-8i-}*H@4jqWDr2b6>EjtBObx2yjuJA*(IO78JhJw@2tES`O z`D_W_^H}_o$+6P}YLj~DBQ^)cTVD&C7$IluW?;S8x}3&(=V>QA&)z@<zk82j^Qewh z=pF}C+x^gLAUXW8a^2%SBT>SR1k=bmDsjaRZ->8pVf*gSV`dI)-NHZ}AzP;I5ST5h zWuA*Zhe-#plSB54V-9N%>5$|0tMEpWXjByw&+~Wps)jEvUgz1`BgH<JHRSP_A9XZ) zDWcU&8#8+qi>29T*>wNKOSU@oTzLW^dGD(zTGz+e7tCvMUedI8@0xe*2}S2)4m5oF z^eL_63CP~we)n#V7L)Cn-Q;EvZq5f!dD`a$k&%&-VYcR%b8PL~L8w}>MLai4*wY%3 z`H^q}bDYu-u>|(L=qL)t_o6?<ARKL;qtHJYM5VL)Q2l~eGoL~@AmN7lAyr(SH-()7 zKN@NoeeRt=oC5(jJG+SFtLqXo1l5PTPqXOnGhW~y6@b5Qez5E5$FKo*r2)XBmpWEe zRlU5t)R()k!6Bj~zbJC)eA6HAOC&VJ#x%&m$yuv%PBE&d#3AwcRZ1wR?ye_iFrC_< z?YDzoF747$A^se1d;2}?vhi@*P5(`FVHHUoL5@;RObtxY@+d-~NZf?ijH^x`Kfcxc z+i-uDvm7N3vqd+j7st)hqJx`8S`<})*ce`Tn5NlyD2EV#{^G>(vArD>8eb0Q0lggh za?F=+;c{P>)cRt8p$p<`(7oMNE^oZmtx-#QC*GY_f^r6vfXzaFc~kOQ`9%!EcS4^1 zsfUN2QLa@a)(N3mX^gbNoOvBCoZVo)%|2m!%xb@)g;P*iMC3BH^|@p`-E=3Yg~1C8 z48Fg<et$7k6xA7jzmH_;M+bhW)IFUEy@$>IL?QX5jM<8s!m&3k6=cP$>3r;uBXZCR zOitO)9&bbD^*v5x^1WNBq8DYZr7}kwxd~iN+}9q4QHpL`*2~VE=HLBc_6i>dmj)7m zYnYi9L`<$QS0DP}od<2SZPbGtGIJG=)dyKINDl21?Jn_=B0}c=5ZU<Ba;kADqsjWI zg_79C{5WIzDUvng4_FHj6uZaE3LmMTk$TYbtxBlb*_&FwHtCSHX(f})G$Yj)(|_|8 z^@|xhd)+vH5+5I4u<j{)(1tJwivPKyiN`$PV<*I9NVs6acpSnxOpAj2_A^sDMe)Ow zF#?59QgFx0Dyt(hyn*Scz~W1@$H6qS`i<qQ$@G@%Y(9i73K#=2JOb+EkCiVY48?bK z*5E*2DP57E8A@6dwIiD9qmJTyheOPwUW0}x!gJkuOvmN?v&)~3swwRpb0d3V_P}l1 z*xzfKhYP}P((9y8W&k-QleS}|Ao7N)Vwt*VV}*>Bk|_pLjewvksp;=i3-X<1l`|g3 zdJ#Rh(!cp?NSj(naxrrkx$~QKPI=QEh|Aa^?j>FBvU438MDyW>^?e<h-a?{U+y{C9 zYm?+bMf}ICx-*Q;;h<yYugY@Rv;jTinENow3347$T?&7i3CTN%t1MHj$MH1s(=T&8 zUoA7PlUFZ3Zb_&UjTn|#mmvm?r0DrveA`-efA~YRCfga#NVp%5eURmM<QH+Yk3l6t zaQ*f2j18`AYHn%HI+hVhsA$xhRJ<MWR?6d<bZILDq8RqoUwuJQzZYBjh{|Y71tu?g zRKSbsh&ipYF_4s~9CkAnSc*$a4HNQr0zq|^Mu=8=iW;{nL{|H=TtYqzyzish8aOYJ zTq9D`SFPZn-4x!GM5dB1td!E2S%uhHzKC49!hvAj<rmjco=Sfw-|JsOcyTVTXT-FK zCZH;G53NdWh?useed;XqbyP*_hxXXJ67DcC`D=gm&Z}Gyyyj{7Cq;qBu8A}XG!y)< zk@6*VVKyY;PjqTa&(uNrrFqK3^v*-8d_s~lWM+2Mn1;7*o3ChV|MTWbBpYYEuocs{ z&9k+ra7cswf$IX22=eo8?|a$_RtoQbo_^7r?5^h)q~#U}CUXF@kra|#!}?UDujp&6 z>-2Nf99nCCGKWCTE5?hgJ9oHh_>JodWKGSlR8||}9VgHsJl3>C8Zt!#wQm)X;B@*W zblj}ne0BpXXb7MZ?-yo}5Dh(ar6pPB00lyXjT;18)aems2CI~>eXYNVst9D0zC9|1 zDCsR4f)L+mGVxtg3_Ty40(K|y3M%3-_8n*YIKXe`W!qO#Rn?gUF}x|A1_!&uD98~H z$~Y>0CGxGN8SmxrLI(%uBIUv@i{^h+R%4-Y3nTo1lsz>{Ncx-?pw|1!O{kR^C&Vxy zY)pHH#i%(9ZLorVeJlC{uGKDe@8xrh@wDwdFKYd6sCps`;_J4d+Xmrx{qmsmE`z`V zl-NcFA*}?iT!}%E4Jf?aHXz*8SBL0>EUrvTxkrzEw?nW-3nrLCE-3+P>J@H!*lYJ| zUg95=Y{?({h#J`S?2#|wLf=tuA*uL8$BKYJ&vW{9upo+>Ch1#DOqO}#=yN+LoqtT; z;b{^BBt-Xa>bEs1ZX<5r@w2iA?9*>+FWJac;mQ{PX|H<a?EO#pX25RwPnKXuY_R0( z&G{pRs@Ii4^<}z7VXS$8I{X69@6r9#Be;_vB|el*#6S2%qba7XY_&qsKja%zv3iJU zp9JN@YYN&E&bg3Iqhb-zlzRG6rFIK-_<17|v~{sH;njP^kDV`(A8cJUA83K{vr%i8 zW)wL`X<yTZ#vTklK<f#fl^hD6X+^PBPP|cAF*DULNNvp(2tg3s$pqscx+$z#V0Nl% z{?J`qkLZY|eKq;)HM^vBZ~5%Ic#<dF8N6rnZ(dSo@;uVABw#hiRx;UfL!mcaV(xpw zo9Br%5Zc3CZRz}}V4{&Y`XhXv;^}-{GZH)k=?9BB+l*lNg>==pl&pesV8|<LCYJ~H zn`%gFbw~&l@D6adak;f}a~RtDVZ>7{fX%@;hg+HY06oznj{=FhpvH@AG@S`+kZ`Ab zuN!NVFD`s8cCNX(0f)KcHCvK6o6h=UvqolRjB~7){w1J?_c+1~acGTNbw=~%b6oii z?`#%ow(yXPCbsJ1<<Ui{Fh>Ro8l>Wt$FiQ+u29k<7F+HIj()Dy`9Z9WelvKAbknZH zkUk&v1TUYe(jQ_dzT0;Se=kU-WM_9)wqE-c^c>|Stt)3l+OCRF(|5jO5=aFG6->Y0 zi}~X;cKY*0w8}3Zgj9W>!`_g7MY$U<o?MZ!?shxFt3#<JXjO=g!uDq$l=&A>n7f;< z?pkZ6*+^Un1-Ys}<{lQ{NM{UX{gOR4`5=RiYC=F&QbCiQ4&$Ky<EMJ3L;kJE8BK0D zenhCY6^{y8qw@>?zEKBmiW>Y=w`G!rNQ$Z!;tO#1DLbLR$kTc3$U*8($(K<A@t12| z7)gY>ux@p#{#O`HgJ`rCg5g5+YBdBhmPL06+l-&oA;V8|E28E^>yZ%0yud|sP3Hs6 z5*?Z$UVPSD4(3k1px9#rmMi#DXoh}CK>KhWFJAOVbppb5(8zei+to7hC*?3OY7T-` z7^?!$4PM)y6GSTGIa(!;hv^d9&(<ER{;A<vx`3B?f)2G}0uMEoI+8b1!mblrcOVl~ znU~u$_?@H!20pZvgUnJT&C4UgrG_$Klr;|w<_@M2MZ}d7v(W2nhb9#$zsT0AOH$RG z{sEPg#yX)t(0Zd;eYav!_v?4{w@)qaoo4DLYjo7L@^T%}<vPj5erPv%ApOWe$DDB@ zh}CFyk@1*&9DNr^<|+Rgztq7WAvbdA#D>4dhe3`38q0>MT44r&a2&m2B(o{hj94Vv z(VN`LHpqo8UUGyi<f=tQ`p3*ZrPCI?k}O04J*zX3DV^NO+{59~6OnLS-3yx`&A)@^ zE<HI{UTpdT2=O^k?nRds?%j%LcWbB6x0tQKYti<zry%P6xV<$$VLU~Sb*xEeP>&Ja z`I2AZp(HmD)>9&2BX0f)M@;oR$Y`sRv~Uo{-ZCpw6r$H~D9H1X{Mkdx$!OOF9Kolc zHBjdT@LMDQM8DUW^z-#JQBh?2N8t&Q*!f%Fu*-w-6H&G%JW=V)RA&!eo!~%lx@RQH z4mtUD#29M0vj`H2eZ(W8WIgnycnbC}>Sc$qitn`0Ll$rg;_{_a$PpVrbbptH{?Q}S zP6bQdUQ_=~4c8jDTDeU%sU$K>xefBsx8d-tqJevX+@oL{K4dW*I~__5&&t<tk(0e% zNNA@ZHOYP@Us6?*!u01Zk<7Ev*Yk7NI@3NFOf4aItWaTO|7aAK_DUvkOr^4C_8L>- zv$;RT)3op7iV8-9b!=ql^Zbj$dM0q@$;j=m<YDp|tUJu}6D0wr(+>%=WAJ*4ono4g z2hze(3Z2;AQn}*dXa%}8L^Hftz5_3y;(f69UgTk6CXXO2A*z0_<4hFYL@jruFQGLt zVqtDMg68Cv7|VFJO)7J;XVJrYTX>s{gtxMGtFf&>sUDxXVDAIbvb2j{sN{A`dM!uW zP=GUG8p(8$9tOWV>W+#Z9(Q;LypJIAd*+h$UBxA7$rl5iId@E$9@E<BB~c_u-v?ti zIu6?EQ_}QPTH3PS=gFY9NfH10h*%T~5aQoBU9DM2dY{uMUVLx&oagHs*O2Rsv0NsM z0yeG}jvnT6mNjyiLT6t$t$O2#U~zz5GqUC26iDQ;YqAI1LGC0lyivG|`{Eu5OKkiu zxn+#{vw2YGuW1`6h2KV4DH)y`wbMA_^`5kZMR7ugGIPZ?%l6VAMrL3N(Rk&|*ThRa zsJAMH)tfI<!;^5APewRmQTow?S3*QLW+9<@=Xc4+B&Xjb5kcE&j$n`LNX5!?yf%E2 zQGXt7gi;xVT?E~`^r#ivD<%EO+6tyZ#-YWu*czq3Nn^;Tml_CvgBewLO-yS@o{Wkd zu0Tta@~r<*0VO78XsGYSU@1lik2Tg(9i~Gis4<<$MbR=Xr-PquORgS9wI1|k&Szh1 ztaRI)C{07BZBBRZZP|rY*Ngbf&dL{uMXOTiGgVQSAMiK0CQCHBk$5qBvv?H}$Ar*L zCE{lBerQ?WT}3)?V0~?vZAh79VzV-@@MKW>6X|Gu^qU&@1&q)D9r&yGrIPbOMwO|F zA9c1~>8L$J3cK?pit)!G%=&hsb3w83(IIaB<^5Xd5!9kV#2l}M8+i=lL&i?zEb&ly z741eAOND=`+AGT}$!=$VEBV;exP8to5A{>3#RQK!hH!a*HP{nGXU>}!&%2Y^YaMnO zB~fot(pm(4W`MHEt{c1dAi9RB*QGB<NmiOPX&w^Jh)NkP`a$O`S`t-wbJ}~HZWK8H zEy;?pcmS468DuWfY=f5+pt3jqw{J;N1Tnve?mC0BMN1C4TKX{)Bla@aj|<*eoXqJ7 zz5B-Pr^h>LF`VW6vduAC{CKetX$+(A0qv5WYU_C@Cq<7<Cdw+^q#P@V&<RXZ`%*Ez zI#~Y|DYK;pKW-Ry4#P5CuT9;gkTJXC6n)lP{)AEa1Ohh)Q^r?Ok}9uavA$C4+BqGs zVXX$%x{1B}urSNF!jmhn8}9y-Dd08Z_I>B>i`9{+?eMgQ{8v4CK7!bM;<;2ta<bQt z@t2f+g5~hGLzVPWBagDNJ}!y5dentp*y}QyLlU{UGxKWMMBWxiz1WX!r$mxaOXoeV ze$)m}^k2Jx`5cxaU69K_mb6^dq#B~YAfGwOik>Yu*&ld0eGy@Cgd3gwMb3oZbfvE1 z!?nDnz}<!&F(?ohPj_Gst{(lYov&G6@gw5gzswd&|CDb0(oBwvw&oILFwl@K@bw<Y zn+J9vI=4LqHl7Ui{<$-zoVy%!b$R&E^-D*m<Yaf$qRr{uPV4te{pay=4yCc5;-%fV zE3m_Lk<@R@4{*4s!#cP`K*-3gu-C+BlKI|=$S3H+6GpU~tUu1lUOj^KSsc@lV!zu> z<Gg5Vyeo}^K!>B`A9nU}Kpt@#pO=)iK}O1qzA5%G?L0~$Qy)IS<T!bx;A#{(=GOh( zd3faRXD?M)*C$pNWz_Wquc!`{`sALhXUblfRmOAS=h}1KFdJGvh_{pcF_F1NrCUUX z_+0ET=H2tx$&`W85izC;!ce2Uc=S0LYWGc+Kvg1qu4uEDE$z$XoWx>hZ;2ma6Xdd* z0X<NHgD3lXD8II4@v7kDeERV7yh#Ol;sLtn3EZ!KHt|h$XP$Bt!RlOIfmDWNjTh{U zG~AE4m(e<^BgOHEH>^xyB51d@aHz41WnD|=myv4)CIjZqp_d7t?v#+$VF`6J4l+fN zreUwkbRQj>%cW|XjZYg&rMe8GV{7ui@lZaM7RS<}4)GyRn4QxsUM6LH_1^x%X_L05 ztp4&2@liS5EpP!&wsW+)C*OZWr=7Sr*K}k$G&;Rsd42#cCrA~`Rbyb2m%G^dataUc zeN1+inoO|v@?%435}{#OvI2`34gRYZ?fRwth;wZMpsP_B^GXd?>ugJC(k!jIMxpD< z_d6VJPjFXWuxxp^zH=Z8zvNpviYs}WgvWHuNGGoI8|!PPER>pn7Nh&;E6;|h^=X8x zAOyhQ?+)p{_4wY21A*FMkk2dL_h|6a8X*5d7^kKG|CibQ&xG-`$X{&oJ<R_rtn$Cf z-lqFSR#*B<_}>3>F1#t^_9x=MiqZb=pMX4Uuko0f50}vZg{<5_OYS`Fd*tj9%5W}2 zCfZ)K&85X;{o)m8XUW3S2tOw$@Uyhn=^iEsbl5JoS@Kr|Ec_LH{7cZozuEKt&k&0L zW945S@j;v3IMVDaB*7T8^u}7k85z*D-F>Wb`~97Sj-H=&ckm6HGz1-Gepi$|+!Yuv z{km)BtN)$t;`P8QOBsS+Eua*9Z11fS?as%(RvWST;;Y_^Mh2JyApOP3%&puXI!^hk z4q0k1T5cvI=#T(Y{a0B#_VTjD4th<Qx3%u7E({3+r!!vZlKRW7Ip|-EToi0Ap1wrI zPFM5j`X<5oU~iLybX7zB{tPBSLZAg7$ZpvkElicF|Gc<hOvCPE2DV`b$O$`3Z{x0o zawqTa{BUl*d_Fs1ppkVOJX76LxpUoupDR%F$bG1Z^ZWZsX4PBun5`sM@D$g47TH|C zl+zLy0%QjWD8cK&>9LCEvoZ5S{mwFgqJZk}K+kV)-F5M~YOdmXp5wVLF%z);If&hX zs?P#4{Qc#%_cT@vHS(WB_?M5;EkgqM{rs0}{1=H7{xXeVko}uC&+z44o;rg<8+jVW z#Bx}~->+J^6D%}TYT7UK%&IDyvb>ZR*_!?I?DFNMuG5jkcMr5%f(Pm?bp)W1{C~%! z{eS`N)nfMIK8U8u$irjn-2&43RO?HL=Nz8SKRUxNusdD6J32Fmbj6H6?Oh|c51tC9 zREgA@Xju89DmDE~qTRF~0@0FX*(>1HF+P8o_yV#0Dcl@r{?^Ur0I{yEUy@w6Z*#tr zRZDe_ykq#haq5P@wa(4Q`I%J+LZPWe4q%D=X1~w^41++(Z>9?v4scjdfAd%XE(#qO z>6Q^=ngs%Q4aA7w#Fksa02=fcMFthvU><PY-|QKnl{CNu0O%*3LP&t;GXHK2y(L-v zds#rIzhyZiqe6j(zZ%2;v#i_c@JrSPuvh;-DEgmdp+Wy<S1;y2Df*veVZl*<+Z9Fh zA3^y?S;T<#zc3_c`j4Reqbz0s>0cOfss3kB{=u&QascRX{{&@1$<V_pusYSga2y!j zTS^cNLZ}akVY9;<N=i5>xs-@4xx8b``26I>hRwSJ3N5nRfxaDkXg=y%eNZ#T&P=eS zjqg=jXGwUE?VFETZ(_{LeM|1oks=mW(AQ9b(+Lo9nX2^+p@xZ9l><m{dawj3q7Xat z&0$3JoaNVijI~d$E_71|LIlF`pBroTN6PP2ZbW4CVJJ1-I*m^=Z#pA`Jm)WGdq0}) z>QdG;@@+6DnB<YPxrWS4)SCv4;OH)_&t1hvx0v+Ha02@MtVdmIE4e92Zir!1jb@@N zjHC=Dp2Qu*iBo5}H37*N?U!ch?_;~`ACqfM@)hM71J<JgZg@LflH_eOdovxF{<OfF zs(7%0`3<!2JtLp;DC5=hORl(}hwH$dSs)q@cmdIQ1h)m!uQyO>;1d)Th)0tKV$W`? zA;8Mu*PGk(ZW~+zk#%&4+c-Gj1*}-YZVNCFcNYdMnSK>O@EsIb!~Ckgjllc+dAAKT zWo`xB#{N~=4na$*;Yw-)z$p?$w>kikfdRbT=0<0xAu0O_zYkmx-quLow)&;gZShO_ zU;6%2)vdOFRzZsd5dMECcpC=@{-xDz0X%7e$8X(ltAGcf=Ra4C|F-P6U4N^k{ll1B zqyMP71>(;tENDFx^|vCo$N^8-Z}tCXITRH*^s65D4*?#(QNIP{U#mKerG9Dg|I*R1 z`OKf{IRxZ%&OXxcb(iA1XMK$N29Bk6vzRQ^<X16L=b+Pl3&zLaB9C@fm1L3OnBV|) z7&!w{zCQ$fkCqsMY<iB0K!($z!fBKI)o<T)rn0H|Jr%p5vdtU`fPinG>Vyz1aKPcB z?l*;@;?PR6$kM7IwGf9^s^%-`xU8e!Zu3RM#&{v=<67}8lW7zL42*y=BjuwaYW%Br z1}DyjVxRr!FJQT`y)VAo_LJfBH<v^HFS-lGp<=0p$WRFIR78d&K_Myb=7T{%i^Q@K zQujx`<C|L3EVr7W0&3p_G%Ndc)*q*1fzkdH1!KOo2IveBO9+(y>bF{ef%l3)`A0)Q zFDQhO_|~333{wZ%{wW3i3mc&J9)Ji05b=-b{L%0il3agCN%$r1pQZd4>S6vN<=0^R zvy}g%dPI1CfUq{1m`fDv$H!xP7aYLl`FEofo{U`I7rheuexgU87^9a0*wlsbccbc- z4vT81ECFmmfZ0H!+mTZMEXKL}cZd>DfkS`Cmf@HG{0%OJf5bU~0l@GN=oDaSjDJGM z0AT(H8n?awVc@@Zu7&m|r2o<(Fo>P&fcV>CoA){MXw72Cz8!B<tiLOFvbXY~@POV! zB6j&o(=5R~bsMlXfD7&KmcWEAb{E>SV}m@zlhcas&_-eX=@&9EA=e!(g<q!A{Jp{7 zrpy1@JN}&y{(;BsJoyvgf9Je^ddIIB`UiObt$NCAe@E)yN%<c;FC+e+<NP0{NKlZv Z0rgK_zDCEjD`3$JQjk%Vu7aBc{y&~pl5_w7 literal 0 HcmV?d00001 diff --git a/content/themes/twentytwenty/searchform.php b/content/themes/twentytwenty/searchform.php new file mode 100644 index 0000000..2acf830 --- /dev/null +++ b/content/themes/twentytwenty/searchform.php @@ -0,0 +1,28 @@ +<?php +/** + * The searchform.php template. + * + * Used any time that get_search_form() is called. + * + * @link https://developer.wordpress.org/themes/basics/template-hierarchy/ + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +/* + * Generate a unique ID for each form and a string containing an aria-label + * if one was passed to get_search_form() in the args array. + */ +$twentytwenty_unique_id = twentytwenty_unique_id( 'search-form-' ); + +$twentytwenty_aria_label = ! empty( $args['label'] ) ? 'aria-label="' . esc_attr( $args['label'] ) . '"' : ''; +?> +<form role="search" <?php echo $twentytwenty_aria_label; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Escaped above. ?> method="get" class="search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>"> + <label for="<?php echo esc_attr( $twentytwenty_unique_id ); ?>"> + <span class="screen-reader-text"><?php _e( 'Search for:', 'twentytwenty' ); // phpcs:ignore: WordPress.Security.EscapeOutput.UnsafePrintingFunction -- core trusts translations ?></span> + <input type="search" id="<?php echo esc_attr( $twentytwenty_unique_id ); ?>" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder', 'twentytwenty' ); ?>" value="<?php echo get_search_query(); ?>" name="s" /> + </label> + <input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button', 'twentytwenty' ); ?>" /> +</form> diff --git a/content/themes/twentytwenty/singular.php b/content/themes/twentytwenty/singular.php new file mode 100644 index 0000000..857bc6f --- /dev/null +++ b/content/themes/twentytwenty/singular.php @@ -0,0 +1,34 @@ +<?php +/** + * The template for displaying single posts and pages. + * + * @link https://developer.wordpress.org/themes/basics/template-hierarchy/ + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +get_header(); +?> + +<main id="site-content" role="main"> + + <?php + + if ( have_posts() ) { + + while ( have_posts() ) { + the_post(); + + get_template_part( 'template-parts/content', get_post_type() ); + } + } + + ?> + +</main><!-- #site-content --> + +<?php get_template_part( 'template-parts/footer-menus-widgets' ); ?> + +<?php get_footer(); ?> diff --git a/content/themes/twentytwenty/style-rtl.css b/content/themes/twentytwenty/style-rtl.css new file mode 100644 index 0000000..f3c0ac0 --- /dev/null +++ b/content/themes/twentytwenty/style-rtl.css @@ -0,0 +1,6357 @@ +/* +Theme Name: Twenty Twenty +Text Domain: twentytwenty +Version: 1.2 +Requires at least: 4.7 +Requires PHP: 5.2.4 +Description: Our default theme for 2020 is designed to take full advantage of the flexibility of the block editor. Organizations and businesses have the ability to create dynamic landing pages with endless layouts using the group and column blocks. The centered content column and fine-tuned typography also makes it perfect for traditional blogs. Complete editor styles give you a good idea of what your content will look like, even before you publish. You can give your site a personal touch by changing the background colors and the accent color in the Customizer. The colors of all elements on your site are automatically calculated based on the colors you pick, ensuring a high, accessible color contrast for your visitors. +Tags: blog, one-column, custom-background, custom-colors, custom-logo, custom-menu, editor-style, featured-images, footer-widgets, full-width-template, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready, block-styles, wide-blocks, accessibility-ready +Author: the WordPress team +Author URI: https://wordpress.org/ +Theme URI: https://wordpress.org/themes/twentytwenty/ +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html + +All files, unless otherwise stated, are released under the GNU General Public +License version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned +with others. +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- + + 0. CSS Reset + 1. Document Setup + 2. Element Base + 3. Helper Classes + 4. Site Header + 5. Menu Modal + 6. Search Modal + 7. Page Templates + a. Template: Cover Template + c. Template: Full Width + 8. Post: Archive + 9. Post: Single + 10. Blocks + 11. Entry Content + 12. Comments + 13. Site Pagination + 14. Error 404 + 15. Widgets + 16. Site Footer + 17. Media Queries + +----------------------------------------------------------------------------- */ + + +/* -------------------------------------------------------------------------- */ + +/* 0. CSS Reset +/* -------------------------------------------------------------------------- */ + + +html, +body { + border: none; + margin: 0; + padding: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +address, +big, +cite, +code, +em, +font, +img, +small, +strike, +sub, +sup, +li, +ol, +ul, +fieldset, +form, +label, +legend, +button, +table, +caption, +tr, +th, +td { + border: none; + font-size: inherit; + line-height: inherit; + margin: 0; + padding: 0; + text-align: inherit; +} + +blockquote::before, +blockquote::after { + content: ""; +} + + +/* -------------------------------------------------------------------------- */ + +/* 1. Document Setup +/* -------------------------------------------------------------------------- */ + + +html { + font-size: 62.5%; /* 1rem = 10px */ + scroll-behavior: smooth; +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } +} + +body { + background: #f5efe0; + box-sizing: border-box; + color: #000; + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + font-size: 1.8rem; + letter-spacing: -0.015em; + text-align: right; +} + +@supports ( font-variation-settings: normal ) { + + body { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + +*, +*::before, +*::after { + box-sizing: inherit; + -webkit-font-smoothing: antialiased; + word-break: break-word; + word-wrap: break-word; +} + +#site-content { + overflow: hidden; +} + + +/* Clearing ---------------------------------- */ + +.group::after, +.entry-content::after { + clear: both; + content: ""; + display: block; +} + + +/* Base Transitions -------------------------- */ + +a, +path { + transition: all 0.15s linear; +} + + +/* Screen Reader Text ------------------------ */ + +.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; + word-break: normal; +} + +.screen-reader-text:focus { + background-color: #f1f1f1; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + -webkit-clip-path: none; + clip-path: none; + color: #21759b; + display: block; + font-size: 0.875rem; + font-weight: 700; + height: auto; + left: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; +} + + +/* Skip Link --------------------------------- */ + +.skip-link { + right: -9999rem; + top: 2.5rem; + z-index: 999999999; + text-decoration: underline; +} + +.skip-link:focus { + display: block; + right: 6px; + top: 7px; + font-size: 14px; + font-weight: 600; + text-decoration: none; + line-height: normal; + padding: 15px 23px 14px; + z-index: 100000; + left: auto; +} + + +/* Fonts ------------------------------------- */ + +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the classic editor and + * block editor. The following font-face override fixes the issue by manually + * inserting a custom font that includes just a Hoefler Text space replacement + * for that character instead. + */ +@font-face { + font-family: NonBreakingSpaceOverride; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* ---------------------------------------------- +Inter variable font. Usage: + +@supports (font-variation-settings: normal) { + html { font-family: 'Inter var', sans-serif; } +} +---------------------------------------------- */ + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: normal; + font-display: swap; + src: url(./assets/fonts/inter/Inter-upright-var.woff2) format("woff2"); +} + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: italic; + font-display: swap; + src: url(./assets/fonts/inter/Inter-italic-var.woff2) format("woff2"); +} + + +/* Accessibility Settings -------------------- */ + +@media ( prefers-reduced-motion: reduce ) { + + * { + animation-duration: 0s !important; + transition-duration: 0s !important; + } +} + + +/* -------------------------------------------------------------------------- */ + +/* 2. Element Base +/* ---------------------------------------------*---------------------------- */ + + +main { + display: block; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.faux-heading { + font-feature-settings: "lnum"; + font-variant-numeric: lining-nums; + font-weight: 700; + letter-spacing: -0.0415625em; + line-height: 1.25; + margin: 3.5rem 0 2rem; +} + +h1, +.heading-size-1 { + font-size: 3.6rem; + font-weight: 800; + line-height: 1.138888889; +} + +h2, +.heading-size-2 { + font-size: 3.2rem; +} + +h3, +.heading-size-3 { + font-size: 2.8rem; +} + +h4, +.heading-size-4 { + font-size: 2.4rem; +} + +h5, +.heading-size-5 { + font-size: 2.1rem; +} + +h6, +.heading-size-6 { + font-size: 1.6rem; + letter-spacing: 0.03125em; + text-transform: uppercase; +} + +p { + line-height: 1.5; + margin: 0 0 1em 0; +} + +em, +i, +q, +dfn { + font-style: italic; +} + +em em, +em i, +i em, +i i, +cite em, +cite i { + font-weight: bolder; +} + +big { + font-size: 1.2em; +} + +small { + font-size: 0.75em; +} + +b, +strong { + font-weight: 700; +} + +ins { + text-decoration: underline; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +abbr, +acronym { + cursor: help; +} + +address { + line-height: 1.5; + margin: 0 0 2rem 0; +} + +hr { + border-style: solid; + border-width: 0.1rem 0 0 0; + border-color: #dcd7ca; + margin: 4rem 0; +} + +.entry-content hr, +hr.styled-separator { + background: linear-gradient(to right, currentColor calc(50% - 16px), transparent calc(50% - 16px), transparent calc(50% + 16px), currentColor calc(50% + 16px)); + background-color: transparent !important; + border: none; + height: 0.1rem; + overflow: visible; + position: relative; +} + +.entry-content hr:not(.has-background), +hr.styled-separator { + color: #6d6d6d; +} + +.entry-content hr::before, +.entry-content hr::after, +hr.styled-separator::before, +hr.styled-separator::after { + background: currentColor; + content: ""; + display: block; + height: 1.6rem; + position: absolute; + top: calc(50% - 0.8rem); + transform: rotate(-22.5deg); + width: 0.1rem; +} + +.entry-content hr::before, +hr.styled-separator::before { + right: calc(50% - 0.5rem); +} + +.entry-content hr::after, +hr.styled-separator::after { + left: calc(50% - 0.5rem); +} + +a { + color: #cd2653; + text-decoration: underline; +} + +a:hover, +a:focus { + text-decoration: none; +} + + +/* Lists ------------------------------------- */ + +ul, +ol { + margin: 0 3rem 3rem 0; +} + +ul { + list-style: disc; +} + +ul ul { + list-style: circle; +} + +ul ul ul { + list-style: square; +} + +ol { + list-style: decimal; +} + +ol ol { + list-style: lower-alpha; +} + +ol ol ol { + list-style: lower-roman; +} + +li { + line-height: 1.5; + margin: 0.5rem 2rem 0 0; +} + +li > ul, +li > ol { + margin: 1rem 2rem 0 0; +} + +.reset-list-style, +.reset-list-style ul, +.reset-list-style ol { + list-style: none; + margin: 0; +} + +.reset-list-style li { + margin: 0; +} + +dt, +dd { + line-height: 1.5; +} + +dt { + font-weight: 700; +} + +dt + dd { + margin-top: 0.5rem; +} + +dd + dt { + margin-top: 1.5rem; +} + + +/* Quotes ------------------------------------ */ + +blockquote { + border-color: #cd2653; + border-style: solid; + border-width: 0 0 0 0.2rem; + color: inherit; + font-size: 1em; + margin: 4rem 0; + padding: 0.5rem 0 0.5rem 2rem; +} + +cite { + color: #6d6d6d; + font-size: 1.4rem; + font-style: normal; + font-weight: 600; + line-height: 1.25; +} + +blockquote cite { + display: block; + margin: 2rem 0 0 0; +} + +blockquote p:last-child { + margin: 0; +} + + +/* Code -------------------------------------- */ + +code, +kbd, +pre, +samp { + font-family: monospace; + font-size: 0.9em; + padding: 0.4rem 0.6rem; +} + +code, +kbd, +samp { + background: rgba(0, 0, 0, 0.075); + border-radius: 0.2rem; +} + +pre { + border: 0.1rem solid #dcd7ca; + line-height: 1.5; + margin: 4rem 0; + overflow: auto; + padding: 3rem 2rem; + text-align: right; +} + +pre code { + background: transparent; + padding: 0; +} + + +/* Media ------------------------------------- */ + +figure { + display: block; + margin: 0; +} + +iframe { + display: block; + max-width: 100%; +} + +video { + display: block; +} + +svg, +img, +embed, +object { + display: block; + height: auto; + max-width: 100%; +} + +figcaption, +.wp-caption-text { + color: #6d6d6d; + display: block; + font-size: 1.5rem; + font-weight: 500; + line-height: 1.2; + margin-top: 1.5rem; +} + +figcaption a, +.wp-caption-text a { + color: inherit; +} + +blockquote.instagram-media, +iframe.instagram-media { + margin: auto !important; +} + + +/* GALLERIES */ + +.gallery { + display: flex; + flex-wrap: wrap; + margin: 3em -0.8em 3em 0; + width: calc(100% + 1.6em); +} + +.gallery-item { + margin: 0.8em 0; + padding: 0 0.8em; + width: 100%; +} + +.gallery-caption { + display: block; + margin-top: 0.8em; +} + + +/* Inputs ------------------------------------ */ + +fieldset { + border: 0.2rem solid #dcd7ca; + padding: 2rem; +} + +legend { + font-size: 0.85em; + font-weight: 700; + padding: 0 1rem; +} + +label { + display: block; + font-size: 1.6rem; + font-weight: 400; + margin: 0 0 0.5rem 0; +} + +label.inline, +input[type="checkbox"] + label { + display: inline; + font-weight: 400; + margin-right: 0.5rem; +} + +input[type="checkbox"] { + -webkit-appearance: none; + -moz-appearance: none; + position: relative; + top: 2px; + display: inline-block; + margin: 0; + width: 1.5rem; + min-width: 1.5rem; + height: 1.5rem; + background: #fff; + border-radius: 0; + border-style: solid; + border-width: 0.1rem; + border-color: #dcd7ca; + box-shadow: none; + cursor: pointer; +} + +input[type="checkbox"]:checked::before { + /* Use the "Yes" SVG Dashicon */ + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23000000%27%2F%3E%3C%2Fsvg%3E"); + position: absolute; + display: inline-block; + margin: -0.1875rem -0.25rem 0 0; + height: 1.75rem; + width: 1.75rem; +} + +input, +textarea, +button, +.button, +.faux-button, +.wp-block-button__link, +.wp-block-file__button { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + line-height: 1; +} + +@supports ( font-variation-settings: normal ) { + + input, + textarea, + button, + .button, + .faux-button, + .faux-button.more-link, + .wp-block-button__link, + .wp-block-file__button { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + +input, +textarea { + border-color: #dcd7ca; + color: #000; +} + +code, +input[type="url"], +input[type="email"], +input[type="tel"] { + direction: ltr; +} + +input[type="text"], +input[type="password"], +input[type="email"], +input[type="url"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="week"], +input[type="number"], +input[type="search"], +input[type="tel"], +input[type="color"], +textarea { + -webkit-appearance: none; + -moz-appearance: none; + background: #fff; + border-radius: 0; + border-style: solid; + border-width: 0.1rem; + box-shadow: none; + display: block; + font-size: 1.6rem; + letter-spacing: -0.015em; + margin: 0; + max-width: 100%; + padding: 1.5rem 1.8rem; + width: 100%; +} + +select { + font-size: 1em; +} + +textarea { + height: 12rem; + line-height: 1.5; + width: 100%; +} + +input::-webkit-input-placeholder { + line-height: normal; +} + +input:-ms-input-placeholder { + line-height: normal; +} + +input::-moz-placeholder { + line-height: revert; /* Reset to the value from the user-agent stylesheet. */ +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { + display: none; +} + +button, +.button, +.faux-button, +.wp-block-button__link, +.wp-block-file .wp-block-file__button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: none; + -moz-appearance: none; + background: #cd2653; + border: none; + border-radius: 0; + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 1.5rem; + font-weight: 600; + letter-spacing: 0.0333em; + line-height: 1.25; + margin: 0; + opacity: 1; + padding: 1.1em 1.44em; + text-align: center; + text-decoration: none; + text-transform: uppercase; + transition: opacity 0.15s linear; +} + +button:focus, +button:hover, +.button:focus, +.button:hover, +.faux-button:focus, +.faux-button:hover, +.wp-block-button .wp-block-button__link:focus, +.wp-block-button .wp-block-button__link:hover, +.wp-block-file .wp-block-file__button:focus, +.wp-block-file .wp-block-file__button:hover, +input[type="button"]:focus, +input[type="button"]:hover, +input[type="reset"]:focus, +input[type="reset"]:hover, +input[type="submit"]:focus, +input[type="submit"]:hover { + text-decoration: underline; +} + +input[type="text"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="password"]: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 { + border-color: currentColor; +} + +input[type="search"]:focus { + outline: thin dotted; + outline-offset: -4px; +} + +/* Tables ------------------------------------ */ + +table { + border: 0.1rem solid #dcd7ca; + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + font-size: 1.6rem; + margin: 4rem 0; + max-width: 100%; + overflow: hidden; + width: 100%; +} + +.alignleft > table { + margin: 0; +} + +.alignright > table { + margin: 0; +} + +th, +td { + border: 0.1rem solid #dcd7ca; + line-height: 1.4; + margin: 0; + overflow: visible; + padding: 0.5em; +} + +caption { + background: #dcd7ca; + font-weight: 600; + padding: 0.5em; + text-align: center; +} + +thead { + vertical-align: bottom; + white-space: nowrap; +} + +th { + font-weight: 700; +} + + +/* -------------------------------------------------------------------------- */ + +/* 3. Helper Classes +/* -------------------------------------------------------------------------- */ + + +/* Layout ------------------------------------ */ + +.no-margin { + margin: 0; +} + +.no-padding { + padding: 0; +} + +.screen-height { + min-height: 100vh; +} + +.admin-bar .screen-height { + min-height: calc(100vh - 32px); +} + +@media (max-width: 782px) { + + .admin-bar .screen-height { + min-height: calc(100vh - 46px); + } +} + +.screen-width { + position: relative; + right: calc(50% - 50vw); + width: 100vw; +} + +/* Sections ---------------------------------- */ + +section { + padding: 5rem 0; + width: 100%; +} + +.section-inner { + margin-right: auto; + margin-left: auto; + max-width: 120rem; + width: calc(100% - 4rem); +} + +.section-inner.max-percentage { + width: 100%; +} + +.section-inner.thin { + max-width: 58rem; +} + +.section-inner.small { + max-width: 80rem; +} + +.section-inner.medium { + max-width: 100rem; +} + +.section-inner.no-margin { + margin: 0; +} + + +/* Toggles ----------------------------------- */ + +.toggle { + -moz-appearance: none; + -webkit-appearance: none; + color: inherit; + cursor: pointer; + font-family: inherit; + position: relative; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + text-align: inherit; + user-select: none; +} + +button.toggle { + background: none; + border: none; + box-shadow: none; + border-radius: 0; + font-size: inherit; + font-weight: 400; + letter-spacing: inherit; + padding: 0; + text-transform: none; +} + +/* Hiding and Showing ------------------------ */ + +.js .show-js { + display: block !important; +} + +.js .hide-js { + display: none !important; +} + +.no-js .show-no-js { + display: block !important; +} + +.no-js .hide-no-js { + display: none !important; +} + + +/* Typography -------------------------------- */ + +.font-size-xl { + font-size: 1.25em; +} + +.font-size-xs { + font-size: 0.8em; +} + +.no-select { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + + +/* Colors ------------------------------------ */ + +/* COLOR */ + +.color-accent, +.color-accent-hover:focus, +.color-accent-hover:hover { + color: #cd2653; +} + +/* BACKGROUND COLOR */ + +.bg-accent, +.bg-accent-hover:focus, +.bg-accent-hover:hover { + background-color: #cd2653; +} + +/* BORDER COLOR */ + +.border-color-accent, +.border-color-accent-hover:focus, +.border-color-accent-hover:hover { + border-color: #cd2653; +} + +/* FILL COLOR */ + +.fill-children-accent, +.fill-children-accent * { + fill: #cd2653; +} + +.fill-children-current-color, +.fill-children-current-color * { + fill: currentColor; +} + + +/* Opacity ----------------------------------- */ + +.opacity-0 { + opacity: 0; +} + +.opacity-5 { + opacity: 0.05; +} + +.opacity-10 { + opacity: 0.1; +} + +.opacity-15 { + opacity: 0.15; +} + +.opacity-20 { + opacity: 0.2; +} + +.opacity-25 { + opacity: 0.25; +} + +.opacity-30 { + opacity: 0.3; +} + +.opacity-35 { + opacity: 0.35; +} + +.opacity-40 { + opacity: 0.4; +} + +.opacity-45 { + opacity: 0.45; +} + +.opacity-50 { + opacity: 0.5; +} + +.opacity-55 { + opacity: 0.55; +} + +.opacity-60 { + opacity: 0.6; +} + +.opacity-65 { + opacity: 0.65; +} + +.opacity-70 { + opacity: 0.7; +} + +.opacity-75 { + opacity: 0.75; +} + +.opacity-80 { + opacity: 0.8; +} + +.opacity-85 { + opacity: 0.85; +} + +.opacity-90 { + opacity: 0.9; +} + +.blend-mode-exclusion { + mix-blend-mode: exclusion; +} + +.blend-mode-hue { + mix-blend-mode: hue; +} + +.blend-mode-saturation { + mix-blend-mode: saturation; +} + +.blend-mode-color { + mix-blend-mode: color; +} + +.blend-mode-luminosity { + mix-blend-mode: luminosity; +} + + +/* Image Classes ----------------------------- */ + +.bg-image { + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} + +.bg-attachment-fixed { + background-attachment: fixed; +} + +@supports ( -webkit-overflow-scrolling: touch ) { + + .bg-attachment-fixed { + background-attachment: scroll; + } +} + +@media ( prefers-reduced-motion: reduce ) { + + .bg-attachment-fixed { + background-attachment: scroll; + } +} + +.wp-block-image.is-resized { + margin-right: auto; + margin-left: auto; +} + +/* Search Form ------------------------------- */ + +.search-form { + align-items: stretch; + display: flex; + flex-wrap: nowrap; + margin: 0 -0.8rem -0.8rem 0; +} + +.search-form .search-field, +.search-form .search-submit { + margin: 0 0.8rem 0.8rem 0; +} + +.search-form label { + align-items: stretch; + display: flex; + font-size: inherit; + margin: 0; + width: 100%; +} + +.search-form .search-field { + width: 100%; +} + +.search-form .search-submit { + flex-shrink: 0; +} + +.search-form .search-submit:focus, +.search-form .search-submit:hover { + text-decoration: none; +} + + +/* Social Icons ------------------------------ */ + +ul.social-icons { + display: flex; + flex-wrap: wrap; + margin: -0.9rem -0.9rem 0 0; + width: calc(100% + 0.9rem); +} + +ul.social-icons li { + margin: 0.9rem 0.9rem 0 0; +} + +.social-icons a { + align-items: center; + background: #cd2653; + border-radius: 50%; + color: #fff; + display: flex; + height: 4.4rem; + justify-content: center; + padding: 0; + text-decoration: none; + transition: transform 0.15s ease-in-out; + width: 4.4rem; +} + +.social-icons a:focus, +.social-icons a:hover { + transform: scale(1.1); + text-decoration: none; +} + + +/* Cover Modals ------------------------------ */ + +.cover-modal { + display: none; + -ms-overflow-style: none; + overflow: -moz-scrollbars-none; +} + +.cover-modal::-webkit-scrollbar { + display: none !important; +} + +.cover-modal.show-modal { + display: block; + cursor: pointer; +} + +.cover-modal.show-modal > * { + cursor: default; +} + + +/* -------------------------------------------------------------------------- */ + +/* 4. Site Header +/* -------------------------------------------------------------------------- */ + + +#site-header { + background: #fff; + position: relative; +} + +.header-inner { + max-width: 168rem; + padding: 3.15rem 0; + z-index: 100; +} + +/* Header Titles ----------------------------- */ + +.header-titles-wrapper { + align-items: center; + display: flex; + justify-content: center; + padding: 0 4rem; + text-align: center; +} + +body:not(.enable-search-modal) .header-titles-wrapper { + justify-content: flex-start; + padding-right: 0; + text-align: right; +} + +.site-title, +.site-logo, +.site-description { + margin: 0; +} + +.site-title { + font-size: 2.1rem; + font-weight: 600; + line-height: 1; +} + +.site-title a { + color: inherit; + display: block; + text-decoration: none; +} + +.site-title a:hover, +.site-title a:focus { + text-decoration: underline; +} + +.site-description { + margin-top: 1rem; + color: #6d6d6d; + font-size: 1.8rem; + font-weight: 500; + display: none; + letter-spacing: -0.0311em; + transition: all 0.15s linear; +} + +.site-logo a, +.site-logo img { + display: block; +} + +.header-titles .site-logo .site-logo { + margin: 0; +} + +.site-logo img { + max-height: 6rem; + margin: 0 auto; + width: auto; +} + +body:not(.enable-search-modal) .site-logo img { + margin: 0; +} + +/* Overlay Header ---------------------------- */ + +.overlay-header #site-header { + background: transparent; + margin: 0; + position: absolute; + right: 0; + left: 0; + top: 0; + z-index: 2; +} + +.overlay-header .header-inner { + color: #fff; +} + +.overlay-header .site-description, +.overlay-header .toggle { + color: inherit; +} + +.overlay-header .header-inner .toggle-wrapper::before { + background-color: currentColor; + opacity: 0.25; +} + +.admin-bar.overlay-header #site-header { + top: 32px; +} + +@media (max-width: 782px) { + + .admin-bar.overlay-header #site-header { + top: 46px; + } +} + +/* Header Navigation ------------------------- */ + +.header-navigation-wrapper { + display: none; +} + +/* Header Toggles ---------------------------- */ + +.header-toggles { + display: none; +} + +.header-inner .toggle { + align-items: center; + display: flex; + overflow: visible; + padding: 0 2rem; +} + +.header-inner .toggle svg { + display: block; + position: relative; + z-index: 1; +} + +.header-inner .toggle path { + fill: currentColor; +} + +.toggle-inner { + display: flex; + justify-content: center; + height: 2.3rem; + position: relative; +} + +.toggle-icon { + display: block; + overflow: hidden; +} + +.toggle-inner .toggle-text { + color: #6d6d6d; + font-size: 1rem; + font-weight: 600; + position: absolute; + top: calc(100% + 0.5rem); + width: auto; + white-space: nowrap; + word-break: break-all; +} + +.overlay-header .toggle-text { + color: inherit; +} + +.header-inner .toggle:focus .toggle-text, +.header-inner .toggle:hover .toggle-text { + text-decoration: underline; +} + +/* Search Toggle ----------------------------- */ + +.search-toggle { + position: absolute; + bottom: 0; + right: 0; + top: 0; +} + +.search-toggle .toggle-icon, +.search-toggle svg { + height: 2.5rem; + max-width: 2.3rem; + width: 2.3rem; +} + +/* Navigation Toggle ------------------------- */ + +.nav-toggle { + position: absolute; + bottom: 0; + left: 0; + top: 0; + width: 6.6rem; +} + +.nav-toggle .toggle-icon, +.nav-toggle svg { + height: 0.8rem; + width: 2.6rem; +} + +.nav-toggle .toggle-inner { + padding-top: 0.8rem; +} + +/* Primary Menu ---------------------------- */ + +.primary-menu-wrapper { + display: none; +} + +ul.primary-menu { + display: flex; + font-size: 1.8rem; + font-weight: 500; + letter-spacing: -0.0277em; + flex-wrap: wrap; + justify-content: flex-end; + margin: -0.8rem -1.6rem 0 0; +} + +.primary-menu .icon { + display: block; + height: 0.7rem; + position: absolute; + pointer-events: none; + transform: rotate(45deg); + width: 1.3rem; +} + +.primary-menu .icon::before, +.primary-menu .icon::after { + content: ""; + display: block; + background-color: currentColor; + position: absolute; + bottom: calc(50% - 0.1rem); + right: 0; +} + +.primary-menu .icon::before { + height: 0.9rem; + width: 0.2rem; +} + +.primary-menu .icon::after { + height: 0.2rem; + width: 0.9rem; +} + +.primary-menu li { + font-size: inherit; + line-height: 1.25; + position: relative; +} + +.primary-menu > li { + margin: 0.8rem 1.6rem 0 0; +} + +.primary-menu > li.menu-item-has-children > a { + padding-left: 2rem; +} + +.primary-menu > li > .icon { + left: -0.5rem; + top: calc(50% - 0.4rem); +} + +.primary-menu a { + color: inherit; + display: block; + line-height: 1.2; + text-decoration: none; + word-break: normal; + word-wrap: normal; +} + +.primary-menu a:hover, +.primary-menu a:focus, +.primary-menu .current_page_ancestor { + text-decoration: underline; +} + +.primary-menu li.current-menu-item > a, +.primary-menu li.current-menu-item > .link-icon-wrapper > a { + text-decoration: underline; +} + +.primary-menu li.current-menu-item > a:hover, +.primary-menu li.current-menu-item > .link-icon-wrapper > a:hover, +.primary-menu li.current-menu-item > a:focus, +.primary-menu li.current-menu-item > .link-icon-wrapper > a:focus { + text-decoration: none; +} + +/* SUB MENU */ + +.primary-menu ul { + background: #000; + border-radius: 0.4rem; + color: #fff; + font-size: 1.7rem; + opacity: 0; + padding: 1rem 0; + position: absolute; + left: 9999rem; + top: calc(100% + 2rem); + transition: opacity 0.15s linear, transform 0.15s linear, left 0s 0.15s; + transform: translateY(0.6rem); + width: 20rem; + z-index: 1; +} + +.primary-menu li.menu-item-has-children:hover > ul, +.primary-menu li.menu-item-has-children:focus > ul, +.primary-menu li.menu-item-has-children.focus > ul { + left: 0; + opacity: 1; + transform: translateY(0); + transition: opacity 0.15s linear, transform 0.15s linear; +} + +.primary-menu ul::before, +.primary-menu ul::after { + content: ""; + display: block; + position: absolute; + bottom: 100%; +} + +.primary-menu ul::before { + height: 2rem; + right: 0; + left: 0; +} + +.primary-menu ul::after { + border: 0.8rem solid transparent; + border-bottom-color: #000; + left: 1.8rem; +} + +.primary-menu ul a { + background: transparent; + border: none; + color: inherit; + display: block; + padding: 1rem 2rem; + transition: background-color 0.15s linear; + width: 100%; +} + +.primary-menu ul li.menu-item-has-children > a { + padding-left: 4.5rem; +} + +.primary-menu ul li.menu-item-has-children .icon { + position: absolute; + left: 1.5rem; + top: calc(50% - 0.5rem); +} + +/* DEEP DOWN */ + +.primary-menu ul ul { + top: -1rem; +} + +.primary-menu ul li.menu-item-has-children:hover > ul, +.primary-menu ul li.menu-item-has-children:focus > ul, +.primary-menu ul li.menu-item-has-children.focus > ul { + left: calc(100% + 2rem); +} + +.primary-menu ul ul::before { + bottom: 0; + height: auto; + right: auto; + left: -2rem; + top: 0; + width: 2rem; +} + +.primary-menu ul ul::after { + border-bottom-color: transparent; + border-left-color: #000; + bottom: auto; + left: -1.6rem; + top: 2rem; +} + +.rtl .primary-menu ul ul::after { + transform: rotate(-180deg); +} + +/* + * Enable nav submenu expansion with tapping on arrows on large-viewport + * touch interfaces (e.g. tablets or laptops with touch screens). + * These rules are supported by all browsers (>IE11) and when JS is disabled. + */ +@media (any-pointer: coarse) { + + .primary-menu > li.menu-item-has-children > a { + padding-left: 0; + margin-left: 2rem; + } + + .primary-menu ul li.menu-item-has-children > a { + margin-left: 4.5rem; + padding-left: 0; + width: unset; + } + +} + +/* Repeat previous rules for IE11 (when JS enabled for polyfill). */ +body.touch-enabled .primary-menu > li.menu-item-has-children > a { + padding-left: 0; + margin-left: 2rem; +} + +body.touch-enabled .primary-menu ul li.menu-item-has-children > a { + margin-left: 4.5rem; + padding-left: 0; + width: unset; +} + +/* -------------------------------------------------------------------------- */ + +/* 5. Menu Modal +/* -------------------------------------------------------------------------- */ + + +.menu-modal { + background: #fff; + display: none; + opacity: 0; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + bottom: 0; + right: -99999rem; + left: 99999rem; + top: 0; + transition: opacity 0.25s ease-in, right 0s 0.25s, left 0s 0.25s; + z-index: 99; +} + +.admin-bar .menu-modal { + top: 32px; +} + +@media (max-width: 782px) { + + .admin-bar .menu-modal { + top: 46px; + } +} + +.menu-modal.show-modal { + display: flex; +} + +.menu-modal.active { + right: 0; + opacity: 1; + left: 0; + transition: opacity 0.25s ease-out; +} + +.menu-modal-inner { + background: #fff; + display: flex; + justify-content: stretch; + overflow: auto; + -ms-overflow-style: auto; + width: 100%; +} + +.menu-wrapper { + display: flex; + flex-direction: column; + justify-content: space-between; + position: relative; +} + +button.close-nav-toggle { + align-items: center; + display: flex; + font-size: 1.6rem; + font-weight: 500; + justify-content: flex-end; + padding: 3.1rem 0; + width: 100%; +} + +button.close-nav-toggle svg { + height: 1.6rem; + width: 1.6rem; +} + +button.close-nav-toggle .toggle-text { + margin-left: 1.6rem; +} + +.menu-modal .menu-top { + flex-shrink: 0; +} + + +/* Main Menu --------------------------------- */ + +.modal-menu { + position: relative; + right: calc(50% - 50vw); + width: 100vw; +} + +.modal-menu li { + border-color: #dedfdf; + border-style: solid; + border-width: 0.1rem 0 0 0; + display: flex; + flex-wrap: wrap; + line-height: 1; + justify-content: flex-start; + margin: 0; +} + +.modal-menu > li > a, +.modal-menu > li > .ancestor-wrapper > a { + font-size: 2rem; + font-weight: 700; + letter-spacing: -0.0375em; +} + +.modal-menu > li:last-child { + border-bottom-width: 0.1rem; +} + +.modal-menu .ancestor-wrapper { + display: flex; + justify-content: space-between; + width: 100%; +} + +.modal-menu a { + display: block; + padding: 2rem 2.5rem; + text-decoration: none; + width: 100%; +} + +.modal-menu a:focus, +.modal-menu a:hover, +.modal-menu li.current-menu-item > .ancestor-wrapper > a, +.modal-menu li.current_page_ancestor > .ancestor-wrapper > a { + text-decoration: underline; +} + +button.sub-menu-toggle { + border-right: 0.1rem solid #dedfdf; + flex-shrink: 0; + margin: 1rem 0; + padding: 0 2.5rem; +} + +button.sub-menu-toggle svg { + height: 0.9rem; + transition: transform 0.15s linear; + width: 1.5rem; +} + +button.sub-menu-toggle.active svg { + transform: rotate(-180deg); +} + +.modal-menu ul { + display: none; + margin: 0; + width: 100%; +} + +.modal-menu ul li { + border-right-width: 1rem; +} + +.modal-menu ul li a { + color: inherit; + font-weight: 500; +} + +/* Main menu animation ----------------------- */ + +.menu-wrapper .menu-item { + position: relative; +} + +.menu-wrapper .active { + display: block; +} + +.menu-wrapper.is-toggling { + pointer-events: none; +} + +.menu-wrapper.is-toggling .menu-item { + position: absolute; + top: 0; + right: 0; + margin: 0; + width: 100%; +} + +.menu-wrapper.is-toggling .menu-bottom .social-menu .menu-item { + width: auto; +} + +.menu-wrapper.is-animating .menu-item, +.menu-wrapper.is-animating .toggling-target { + transition-duration: 250ms; +} + +.menu-wrapper.is-animating .menu-item { + transition-property: transform; +} + +.menu-wrapper.is-toggling .toggling-target { + display: block; + position: absolute; + top: 0; + right: 0; + opacity: 1; +} + +.menu-wrapper.is-toggling .toggling-target.active { + opacity: 0; +} + +.menu-wrapper.is-animating.is-toggling .toggling-target { + display: block; + transition-property: opacity; + opacity: 0; +} + +.menu-wrapper.is-animating.is-toggling .toggling-target.active { + opacity: 1; +} + +.menu-wrapper.is-toggling .modal-menu > li:last-child li { + border-top-color: transparent; + border-bottom-width: 0.1rem; +} + +@media (prefers-reduced-motion: reduce) { + + .menu-wrapper.is-animating .menu-item, + .menu-wrapper.is-animating .toggling-target { + transition-duration: 1ms !important; + } + +} + + +/* Expanded Menu ----------------------------- */ + +.expanded-menu { + display: none; +} + +.mobile-menu { + display: block; +} + + +/* Menu Bottom ------------------------------- */ + +.menu-bottom { + flex-shrink: 0; + padding: 4rem 0; +} + +.menu-bottom nav { + width: 100%; +} + +.menu-copyright { + display: none; + font-size: 1.6rem; + font-weight: 500; + margin: 0; +} + +.menu-copyright a:focus, +.menu-copyright a:hover { + text-decoration: underline; +} + +.menu-bottom .social-menu { + justify-content: center; +} + + +/* -------------------------------------------------------------------------- */ + +/* 6. Search Modal +/* -------------------------------------------------------------------------- */ + + +.search-modal { + background: rgba(0, 0, 0, 0.2); + display: none; + opacity: 0; + position: fixed; + bottom: 0; + right: -9999rem; + top: 0; + transition: opacity 0.2s linear, right 0s 0.2s linear; + width: 100%; + z-index: 999; +} + +.admin-bar .search-modal.active { + top: 32px; +} + +@media (max-width: 782px) { + + .admin-bar .search-modal.active { + top: 46px; + } +} + +.search-modal-inner { + background: #fff; + transform: translateY(-100%); + transition: transform 0.15s linear, box-shadow 0.15s linear; +} + +.search-modal-inner .section-inner { + display: flex; + justify-content: space-between; + max-width: 168rem; +} + +.search-modal.active { + right: 0; + opacity: 1; + transition: opacity 0.2s linear; +} + +.search-modal.active .search-modal-inner { + box-shadow: 0 0 2rem 0 rgba(0, 0, 0, 0.08); + transform: translateY(0); + transition: transform 0.25s ease-in-out, box-shadow 0.1s 0.25s linear; +} + +button.search-untoggle { + align-items: center; + display: flex; + flex-shrink: 0; + justify-content: center; + margin-left: -2.5rem; + padding: 0 2.5rem; +} + +.search-modal button.search-untoggle { + color: inherit; +} + +.search-modal.active .search-untoggle { + animation: popIn both 0.3s 0.2s; +} + +.search-untoggle svg { + height: 1.5rem; + transition: transform 0.15s ease-in-out; + width: 1.5rem; +} + +.search-untoggle:focus svg, +.search-untoggle:hover svg { + transform: scale(1.15); +} + + +/* Modal Search Form ------------------------- */ + +.search-modal form { + margin: 0; + position: relative; + width: 100%; +} + +.search-modal .search-field { + background: none; + border: none; + border-radius: 0; + color: inherit; + font-size: 2rem; + letter-spacing: -0.0277em; + height: 8.4rem; + margin: 0 -2rem 0 0; + max-width: calc(100% + 2rem); + padding: 0 2rem 0 0; + width: calc(100% + 2rem); +} + +.search-modal .search-field::-webkit-input-placeholder { + color: inherit; +} + +.search-modal .search-field:-ms-input-placeholder { + color: inherit; +} + +.search-modal .search-field::-moz-placeholder { + color: inherit; + line-height: 4; +} + +.search-modal .search-submit { + position: absolute; + left: -9999rem; + top: 50%; + transform: translateY(-50%); +} + +.search-modal .search-submit:focus { + left: 0; +} + + +/* -------------------------------------------------------------------------- */ + +/* 7a. Template: Cover Template +/* -------------------------------------------------------------------------- */ + + +.cover-header { + display: flex; + overflow: hidden; +} + +.cover-header-inner-wrapper { + display: flex; + position: relative; + flex-direction: column; + justify-content: flex-end; + width: 100%; +} + +.cover-header-inner { + padding: 10rem 0 5rem 0; + width: 100%; +} + +.cover-color-overlay, +.cover-color-overlay::before { + position: absolute; + bottom: 0; + right: 0; + left: 0; + top: 0; +} + +.cover-color-overlay::before { + background: currentColor; + content: ""; + display: block; +} + +.cover-header .entry-header { + position: relative; + width: 100%; + z-index: 1; +} + +.cover-header .entry-header * { + color: #fff; +} + +body.template-cover .entry-header { + background: transparent; + padding: 0; +} + +.cover-header h1, +.cover-header h2, +.cover-header h3, +.cover-header h4, +.cover-header h5, +.cover-header h6, +.cover-header .faux-heading { + color: inherit; +} + +.cover-header .entry-header a { + color: inherit; +} + +/* To The Content ---------------------------- */ + +.to-the-content-wrapper { + position: absolute; + right: 0; + left: 0; + top: calc(100% + 0.5rem); +} + +.to-the-content { + align-items: center; + display: flex; + justify-content: center; + height: 4rem; + text-decoration: none; +} + +.to-the-content svg { + height: 2rem; + transition: transform 0.15s linear; + transform: translateY(0); + width: 1.767rem; +} + +.to-the-content:focus svg, +.to-the-content:hover svg { + transform: translateY(20%); +} + + +/* -------------------------------------------------------------------------- */ + +/* 7c. Template: Full Width +/* -------------------------------------------------------------------------- */ + + +body.template-full-width .entry-content > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide), +body.template-full-width [class*="__inner-container"] > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + max-width: 120rem; +} + +body.template-full-width .entry-content .alignleft, +body.template-full-width .entry-content .alignright { + position: static; +} + +body.template-full-width .entry-content .alignleft, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > .alignleft, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > p .alignleft, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > .wp-block-image .alignleft { + margin-left: 0; + position: static; +} + +body.template-full-width .entry-content > .alignleft, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignleft, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignleft, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft { + margin-left: 2rem; + position: static; +} + +body.template-full-width .entry-content .alignright, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > .alignright, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > p .alignright, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > .wp-block-image .alignright { + margin-right: 0; + position: static; +} + +body.template-full-width .entry-content > .alignright, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignright, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignright, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright { + margin-right: 2rem; + position: static; +} + + +/* -------------------------------------------------------------------------- */ + +/* 8. Post: Archive +/* -------------------------------------------------------------------------- */ + + +/* Archive Header ---------------------------- */ + +.archive-header { + background-color: #fff; + padding: 4rem 0; +} + +.reduced-spacing .archive-header { + padding-bottom: 2rem; +} + +.archive-title { + font-size: 2.4rem; + font-weight: 700; + letter-spacing: -0.026666667em; + margin: 0; +} + +.archive-subtitle p:last-child { + margin-bottom: 0; +} + + +/* Posts ------------------------------------- */ + +body:not(.singular) main > article:first-of-type { + padding: 4rem 0 0; +} + + +/* Search Results ---------------------------- */ + +.no-search-results-form { + padding-top: 5rem; +} + + +/* -------------------------------------------------------------------------- */ + +/* 9. Post: Single +/* -------------------------------------------------------------------------- */ + + +/* Post Header ------------------------------- */ + +.singular .entry-header { + background-color: #fff; + padding: 4rem 0; +} + +.entry-categories { + line-height: 1.25; + margin-bottom: 2rem; +} + +.entry-categories-inner { + justify-content: center; + display: flex; + flex-wrap: wrap; + margin: -0.5rem -1rem 0 0; +} + +.entry-categories a { + border-bottom: 0.15rem solid currentColor; + font-size: 1.4rem; + font-weight: 700; + letter-spacing: 0.036666667em; + margin: 0.5rem 1rem 0 0; + text-decoration: none; + text-transform: uppercase; +} + +.entry-categories a:focus, +.entry-categories a:hover { + border-bottom-color: transparent; +} + +h1.entry-title, +h2.entry-title { + margin: 0; +} + +.entry-title a { + color: inherit; + text-decoration: none; +} + +.entry-title a:focus, +.entry-title a:hover { + text-decoration: underline; +} + +.intro-text { + margin-top: 2rem; +} + +.singular .intro-text { + font-size: 2rem; + letter-spacing: -0.0315em; + line-height: 1.4; +} + +/* POST META */ + +.post-meta-single-top .post-meta { + justify-content: center; +} + +.post-meta-wrapper { + margin-top: 2rem; + margin-left: auto; + margin-right: auto; + max-width: 58rem; + width: 100%; +} + +.post-meta { + color: #6d6d6d; + display: flex; + flex-wrap: wrap; + font-size: 1.5rem; + font-weight: 500; + list-style: none; + margin: -1rem -2rem 0 0; +} + +.post-meta li { + flex-shrink: 0; + letter-spacing: -0.016875em; + margin: 1rem 2rem 0 0; + max-width: calc(100% - 2rem); +} + +.post-meta a { + color: inherit; + text-decoration: none; +} + +.post-meta a:focus, +.post-meta a:hover { + text-decoration: underline; +} + +.post-meta .meta-wrapper { + align-items: center; + display: flex; + flex-wrap: nowrap; +} + +.post-meta .meta-icon { + flex-shrink: 0; + margin-left: 1rem; +} + +.sticky .post-sticky { + color: inherit; +} + +.post-meta .post-author .meta-icon svg { + width: 1.6rem; + height: 1.8rem; +} + +.post-meta .post-categories .meta-icon svg { + width: 1.8rem; + height: 1.7rem; +} + +.post-meta .post-comment-link .meta-icon svg { + width: 1.8rem; + height: 1.8rem; +} + +.post-meta .post-date .meta-icon svg { + width: 1.7rem; + height: 1.8rem; +} + +.post-meta .post-edit .meta-icon svg { + width: 1.8rem; + height: 1.8rem; +} + +.post-meta .post-sticky .meta-icon svg { + width: 1.5rem; + height: 1.8rem; +} + +.post-meta .post-tags .meta-icon svg { + width: 1.8rem; + height: 1.8rem; +} + +.post-meta svg * { + fill: currentColor; +} + + +/* Featured Media ---------------------------- */ + +.featured-media { + margin-top: 5rem; + position: relative; +} + +.singular .featured-media { + margin-top: 0; +} + +.singular .featured-media-inner { + position: relative; + right: calc(50% - 50vw); + width: 100vw; +} + +.singular .featured-media::before { + background: #fff; + content: ""; + display: block; + position: absolute; + bottom: 50%; + right: 0; + left: 0; + top: 0; +} + +.featured-media img { + margin: 0 auto; +} + +.featured-media figcaption { + margin: 1.5rem auto 0 auto; + text-align: center; + width: calc(100% - 5rem); +} + +.post-inner { + padding-top: 5rem; +} + +.reduced-spacing.missing-post-thumbnail .post-inner { + padding-top: 0; +} + + +/* Post Footer ------------------------------- */ + +/* POST NAV LINKS */ + +.post-nav-links { + border-radius: 0.4rem; + display: flex; + font-size: 0.9em; + font-weight: 600; + line-height: 1; + margin: 3em auto 0 auto; + padding: 0; + width: calc(100% - 4rem); + max-width: 58rem; +} + +.post-nav-links > span.label { + padding: 1em 0; +} + +.post-nav-links > * { + padding: 1em 0.75em; +} + +/* POST META BOTTOM */ + +.post-meta-wrapper.post-meta-single-bottom { + margin-top: 3rem; +} + + +/* Author Bio -------------------------------- */ + +.author-bio { + margin-top: 4rem; + margin-left: auto; + margin-right: auto; + max-width: 58rem; + width: 100%; +} + +.hide-avatars .author-bio { + padding-right: 0; +} + +.author-bio .author-title-wrapper { + align-items: center; + display: flex; + margin: 0 0 1rem 0; +} + +.author-bio .avatar { + border-radius: 50%; + margin-left: 1.5rem; + height: 5rem; + width: 5rem; +} + +.hide-avatars img.avatar { + display: none; +} + +.author-bio p:last-child { + margin-bottom: 0; +} + +.author-bio .author-title { + margin: 0; +} + +.author-bio .author-link { + display: block; + font-size: 1.6rem; + font-weight: 600; + margin-top: 1em; + text-decoration: none; +} + +.author-bio .author-link:focus, +.author-bio .author-link:hover { + text-decoration: underline; +} + + +/* Single Pagination ------------------------- */ + +.pagination-single { + font-size: 1.8rem; + margin-top: 5rem; +} + +.pagination-single-inner { + display: flex; + flex-direction: column; +} + +.pagination-single hr:first-child { + margin: 0 0 2.8rem 0; +} + +.pagination-single hr:last-child { + margin: 2.8rem 0 0.8rem 0; +} + +.pagination-single a { + align-items: baseline; + display: flex; + font-weight: 600; + letter-spacing: -0.0275em; + text-decoration: none; + flex: 1; +} + +.pagination-single a + a { + margin-top: 1rem; +} + +.pagination-single a .arrow { + margin-left: 1rem; +} + +.pagination-single a:focus .title, +.pagination-single a:hover .title { + text-decoration: underline; +} + + +/* -------------------------------------------------------------------------- */ + +/* 10. Blocks +/* -------------------------------------------------------------------------- */ + + +/* Block Colors ------------------------------ */ + +.has-text-color a { + color: inherit; +} + +/* CUSTOM COLORS */ + +:root .has-accent-color { + color: #cd2653; +} + +:root .has-accent-background-color { + background-color: #cd2653; + color: #fff; +} + +:root .has-primary-color { + color: #000; +} + +:root .has-primary-background-color { + background-color: #000; + color: #f5efe0; +} + +:root .has-secondary-color { + color: #6d6d6d; +} + +:root .has-secondary-background-color { + background-color: #6d6d6d; + color: #fff; +} + +:root .has-subtle-background-color { + color: #dcd7ca; +} + +:root .has-subtle-background-background-color { + background-color: #dcd7ca; + color: #000; +} + +:root .has-background-color { + color: #f5efe0; +} + +:root .has-background-background-color { + background-color: #f5efe0; + color: #000; +} + + +/* Block Typography Classes ------------------ */ + +.has-text-align-left { + text-align: left; +} + +.has-text-align-center { + text-align: center; +} + +.has-text-align-right { + text-align: left; +} + +.has-drop-cap:not(:focus)::first-letter { + color: #cd2653; + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + font-size: 5.1em; + font-weight: 800; + margin: 0.05em 0 0 0.1em; +} + +.has-drop-cap:not(:focus)::first-letter::after { + content: ""; + display: table; + clear: both; +} + +.has-drop-cap:not(:focus)::after { + padding: 0; +} + + +/* Block Font Families ----------------------- */ + +.has-drop-cap:not(:focus)::first-letter, +.entry-content .wp-block-archives, +.entry-content .wp-block-categories, +.entry-content .wp-block-cover-image, +.entry-content .wp-block-latest-comments, +.entry-content .wp-block-latest-posts, +.entry-content .wp-block-pullquote, +.entry-content .wp-block-quote.is-large, +.entry-content .wp-block-quote.is-style-large { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + .has-drop-cap:not(:focus)::first-letter, + .entry-content .wp-block-archives, + .entry-content .wp-block-categories, + .entry-content .wp-block-latest-posts, + .entry-content .wp-block-latest-comments, + .entry-content .wp-block-cover-image p, + .entry-content .wp-block-pullquote { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + +/* Block Font Sizes -------------------------- */ + +.entry-content .has-small-font-size { + font-size: 0.842em; +} + +.entry-content .has-normal-font-size, +.entry-content .has-regular-font-size { + font-size: 1em; +} + +.entry-content .has-medium-font-size { + font-size: 1.1em; + line-height: 1.45; +} + +.entry-content .has-large-font-size { + font-size: 1.25em; + line-height: 1.4; +} + +.entry-content .has-larger-font-size { + font-size: 1.5em; + line-height: 1.3; +} + + +/* Block: Base Margins ----------------------- */ + +*[class*="_inner-container"] > *:first-child { + margin-top: 0; +} + +*[class*="_inner-container"] > *:last-child { + margin-bottom: 0; +} + +.wp-block-archives:not(.alignwide):not(.alignfull), +.wp-block-categories:not(.alignwide):not(.alignfull), +.wp-block-code, +.wp-block-columns:not(.alignwide):not(.alignfull), +.wp-block-cover:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), +.wp-block-embed:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), +.wp-block-gallery:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), +.wp-block-group:not(.has-background):not(.alignwide):not(.alignfull), +.wp-block-image:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), +.wp-block-latest-comments:not(.aligncenter):not(.alignleft):not(.alignright), +.wp-block-latest-posts:not(.aligncenter):not(.alignleft):not(.alignright), +.wp-block-media-text:not(.alignwide):not(.alignfull), +.wp-block-preformatted, +.wp-block-pullquote:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright), +.wp-block-quote, +.wp-block-quote.is-large, +.wp-block-quote.is-style-large, +.wp-block-verse, +.wp-block-video:not(.alignwide):not(.alignfull) { + margin-bottom: 3rem; + margin-top: 3rem; +} + + +/* Block: Shared Nesting Alignment Resets ---- */ + +[class*="__inner-container"] .wp-block-group:not(.alignfull):not(.alignwide):not(.alignleft):not(.alignright), +[class*="__inner-container"] .wp-block-cover:not(.alignfull):not(.alignwide):not(.alignleft):not(.alignright) { + margin-right: auto; + margin-left: auto; + max-width: 58rem; +} + + +/* Block: Shared Widget Styles --------------- */ + +.wp-block-archives, +.wp-block-categories, +.wp-block-latest-posts, +.wp-block-latest-comments { + list-style: none; + margin-right: 0; +} + +.wp-block-archives ul, +.wp-block-categories ul, +.wp-block-latest-posts ul, +.wp-block-latest-comments ul { + list-style: none; +} + +.entry-content .wp-block-archives > li, +.entry-content .wp-block-categories > li, +.entry-content .wp-block-latest-posts > li, +.entry-content .wp-block-latest-comment > li { + margin-right: 0; +} + +.entry-content .wp-block-archives > li:last-child, +.entry-content .wp-block-categories > li:last-child, +.entry-content .wp-block-latest-posts > li:last-child, +.entry-content .wp-block-latest-comment > li:last-child { + margin-bottom: 0; +} + +.entry-content .wp-block-archives *, +.entry-content .wp-block-categories *, +.entry-content .wp-block-latest-posts *, +.entry-content .wp-block-latest-comments * { + font-family: inherit; +} + +.entry-content .wp-block-archives li, +.entry-content .wp-block-categories li, +.entry-content .wp-block-latest-posts li { + color: #6d6d6d; +} + +.wp-block-archives a, +.wp-block-categories a, +.wp-block-latest-posts a, +.wp-block-latest-comments a { + font-weight: 700; + text-decoration: none; +} + +.wp-block-archives a:hover, +.wp-block-categories a:hover, +.wp-block-latest-posts a:hover, +.wp-block-latest-comments a:hover, +.wp-block-archives a:focus, +.wp-block-categories a:focus, +.wp-block-latest-posts a:focus, +.wp-block-latest-comments a:focus { + text-decoration: underline; +} + +.wp-block-latest-posts a, +.wp-block-latest-comments__comment-meta { + font-weight: 700; + letter-spacing: -0.025em; + line-height: 1.25; +} + +.wp-block-latest-comments__comment-date, +.wp-block-latest-posts__post-date { + color: #6d6d6d; + font-size: 0.7em; + font-weight: 600; + letter-spacing: normal; + margin-top: 0.15em; +} + + +/* Block: Shared Media Styles ---------------- */ + +.wp-block-embed figcaption, +.wp-block-image figcaption { + color: #6d6d6d; + font-size: 1.4rem; + margin-bottom: 0; + margin-top: 1.5rem; +} + +/* Block: Audio ------------------------------ */ + +.wp-block-audio audio { + width: 100%; +} + +/* Block: Button ----------------------------- */ + +.wp-block-button { + margin: 3rem 0; +} + +.wp-block-button.is-style-outline { + color: #cd2653; +} + +.is-style-outline .wp-block-button__link:not(.has-text-color) { + color: inherit; +} + +.is-style-outline .wp-block-button__link { + padding: calc(1.1em - 0.2rem) calc(1.44em - 0.2rem); +} + +/* Block: Columns ---------------------------- */ + +.wp-block-columns.alignfull, +.alignfull:not(.has-background) .wp-block-columns { + padding-right: 2rem; + padding-left: 2rem; +} + +.wp-block-column { + margin-bottom: 3.2rem; +} + +.wp-block-column > *:first-child { + margin-top: 0; +} + +.wp-block-column > *:last-child { + margin-bottom: 0; +} + +/* Block: Cover ------------------------------ */ + +.wp-block-cover-image .wp-block-cover__inner-container, +.wp-block-cover .wp-block-cover__inner-container { + width: calc(100% - 4rem); + padding: 2rem 0; +} + +.wp-block-cover-image .wp-block-cover-image-text, +.wp-block-cover-image .wp-block-cover-text, +.wp-block-cover-image h2, +.wp-block-cover .wp-block-cover-image-text, +.wp-block-cover .wp-block-cover-text, +.wp-block-cover h2 { + max-width: 100%; + padding: 0; +} + +.wp-block-cover-image h2, +.wp-block-cover h2 { + font-size: 3.2rem; +} + +/* Block: Embed ------------------------------ */ + +/* Block: File ------------------------------- */ + +.wp-block-file { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} + +.wp-block-file a:not(.wp-block-file__button) { + font-weight: 700; + text-decoration: none; +} + +.wp-block-file a:not(.wp-block-file__button):not(:last-child) { + margin-left: 1rem; +} + +.wp-block-file a:not(.wp-block-file__button):focus, +.wp-block-file a:not(.wp-block-file__button):hover { + text-decoration: underline; +} + +.wp-block-file .wp-block-file__button { + font-size: 1.5rem; + padding: 1em 1.25em; +} + +.wp-block-file a.wp-block-file__button:visited { + opacity: 1; +} + +.wp-block-file a.wp-block-file__button:active, +.wp-block-file a.wp-block-file__button:focus, +.wp-block-file a.wp-block-file__button:hover { + opacity: 1; + text-decoration: underline; +} + + +/* Block: Gallery ---------------------------- */ + +.wp-block-gallery ul { + list-style: none; + margin: 0 0 -1.6rem 0; +} + +figure.wp-block-gallery.alignnone, +figure.wp-block-gallery.aligncenter { + margin-bottom: 3rem; + margin-top: 3rem; +} + +figure.wp-block-gallery.alignleft { + margin: 0.3rem 0 2rem 2rem; +} + +figure.wp-block-gallery.alignright { + margin: 0.3rem 2rem 2rem 0; +} + +figure.wp-block-gallery.alignwide { + margin-bottom: 4rem; + margin-top: 4rem; +} + +figure.wp-block-gallery.alignfull { + margin-bottom: 5rem; + margin-top: 5rem; +} + +/* Block: Group ------------------------------ */ + +.wp-block-group.has-background { + padding: 2rem; + margin-bottom: 0; + margin-top: 0; +} + +.wp-block-group__inner-container { + margin: 0 auto; +} + +.wp-block-group__inner-container, +.entry-content .wp-block-group p { + max-width: 100%; +} + +.alignfull:not(.has-background) > .wp-block-group__inner-container > p:not(.has-background-color) { + padding-right: 2rem; + padding-left: 2rem; +} + +/* Block: Image ------------------------------ */ + +/* Block: Media And Text --------------------- */ + +.wp-block-media-text .wp-block-media-text__content { + padding: 3rem 2rem; +} + +.wp-block-media-text .wp-block-media-text__content p { + max-width: none; +} + +.wp-block-media-text__content > *:first-child { + margin-top: 0; +} + +.wp-block-media-text__content > *:last-child { + margin-bottom: 0; +} + +/* Block: Pullquote -------------------------- */ + +/* STYLE: DEFAULT */ + +.wp-block-pullquote { + padding: 0; + position: relative; +} + +.wp-block-pullquote.alignleft, +.wp-block-pullquote.alignright { + max-width: calc(100% - 4rem); +} + +.wp-block-pullquote::before { + background: #fff; + border-radius: 50%; + color: #cd2653; + content: "”"; + display: block; + font-size: 6.2rem; + font-weight: 500; + line-height: 1.2; + margin: 0 auto 1.5rem auto; + text-align: center; + height: 4.4rem; + width: 4.4rem; +} + +.reduced-spacing .wp-block-pullquote::before { + border: 0.1rem solid currentColor; + font-size: 5.9rem; +} + +.wp-block-pullquote blockquote { + border: none; + margin: 0; + padding: 0; +} + +.wp-block-pullquote blockquote p { + font-family: inherit; + font-size: 2.8rem; + font-weight: 700; + line-height: 1.178571429; + letter-spacing: -0.041785714em; + max-width: 100%; +} + +.wp-block-pullquote p:last-of-type { + margin-bottom: 0; +} + +.wp-block-pullquote cite { + color: #6d6d6d; + font-size: 1.6rem; + font-weight: 500; + margin-top: 1.2rem; +} + +.wp-block-pullquote.alignleft p, +.wp-block-pullquote.alignright p { + font-size: 2.8rem; +} + +.wp-block-pullquote.alignleft { + text-align: right; +} + +.wp-block-pullquote.alignright { + text-align: left; +} + +.wp-block-pullquote.alignleft::before { + margin-right: 0; +} + +.wp-block-pullquote.alignright::before { + margin-left: 0; +} + +/* STYLE: SOLID BACKGROUND COLOR */ + +.wp-block-pullquote.is-style-solid-color { + padding: 3rem 2rem; +} + +.wp-block-pullquote.is-style-solid-color::before { + position: absolute; + top: 0; + right: 50%; + transform: translateY(-50%) translateX(50%); +} + +.wp-block-pullquote.is-style-solid-color.alignleft::before, +.wp-block-pullquote.is-style-solid-color.alignright::before { + transform: translateY(-50%); +} + +.wp-block-pullquote.is-style-solid-color.alignleft::before { + right: 2rem; +} + +.wp-block-pullquote.is-style-solid-color.alignright::before { + right: auto; + left: 2rem; +} + +.wp-block-pullquote.is-style-solid-color blockquote { + max-width: 100%; + text-align: inherit; +} + +.wp-block-pullquote.is-style-solid-color cite { + color: inherit; +} + +/* Block: Separator ------------------------- */ + +hr.wp-block-separator { + margin: 3rem 0; +} + +/* STYLE: WIDE */ + +.wp-block-separator.is-style-wide { + max-width: calc(100vw - 4rem); + position: relative; + width: 100%; +} + +/* STYLE: DOTS */ + +.wp-block-separator.is-style-dots::before { + background: none; + color: inherit; + font-size: 3.2rem; + font-weight: 700; + height: auto; + letter-spacing: 1em; + padding-right: 1em; + position: static; + transform: none; + width: auto; +} + +.wp-block-separator.is-style-dots::after { + content: none; +} + + +/* Block: Search ----------------------------- */ + +.wp-block-search .wp-block-search__input { + width: auto; +} + +/* Block: Table ------------------------------ */ + +.wp-block-table.is-style-stripes tbody tr:nth-child(odd) { + background: #dcd7ca; +} + +figure.wp-block-table.is-style-stripes { + border-bottom: none; +} + +.wp-block-table.is-style-stripes table { + border-collapse: inherit; +} + +/* Block: Quote ------------------------------ */ + +.wp-block-quote p, +.wp-block-quote cite { + text-align: inherit; +} + +.wp-block-quote[style="text-align:center"] { + border-width: 0; + padding: 0; +} + +.wp-block-quote[style="text-align:right"] { + border-width: 0 0.2rem 0 0; + padding: 0 2rem 0 0; +} + +/* STYLE: LARGE */ + +.wp-block-quote.is-large, +.wp-block-quote.is-style-large { + border: none; + padding: 0; + margin-right: auto; + margin-left: auto; +} + +.wp-block-quote.is-large p, +.wp-block-quote.is-style-large p { + font-family: inherit; + font-size: 2.4rem; + font-style: normal; + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.285; +} + +.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: 1.6rem; + text-align: inherit; +} + +/* Block: Widget Latest Comments ------------- */ + +.entry-content .wp-block-latest-comments li { + margin: 2rem 0; +} + +.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt, +.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta { + margin-right: 5.5rem; +} + +.entry-content .wp-block-latest-comments a { + text-decoration: none; +} + +.entry-content .wp-block-latest-comments a:hover, +.entry-content .wp-block-latest-comments a:focus { + text-decoration: underline; +} + +.wp-block-latest-comments__comment { + font-size: inherit; +} + +.wp-block-latest-comments__comment-date { + margin-top: 0.4em; +} + +.wp-block-latest-comments__comment-excerpt p { + font-size: 0.7em; + margin: 0.9rem 0 2rem 0; +} + +/* Block: Widget Latest Posts ---------------- */ + +.wp-block-latest-posts.is-grid li { + border-top: 0.2rem solid #dcd7ca; + margin-top: 2rem; + padding-top: 1rem; +} + +.wp-block-latest-posts.has-dates { + list-style: none; +} + +.wp-block-latest-posts.has-dates:not(.is-grid) li { + margin-top: 1.5rem; +} + +.wp-block-latest-posts.has-dates:not(.is-grid) li:first-child { + margin-top: 0; +} + + +/* -------------------------------------------------------------------------- */ + +/* 11. Entry Content +/* -------------------------------------------------------------------------- */ + + +.entry-content { + line-height: 1.5; +} + +.entry-content > * { + margin-right: auto; + margin-left: auto; + margin-bottom: 1.25em; +} + +.entry-content > *:first-child { + margin-top: 0; +} + +.entry-content > *:last-child { + margin-bottom: 0; +} + +.read-more-button-wrap { + margin-top: 1em; + text-align: center; +} + +.entry-content a:hover, +.entry-content a:focus { + text-decoration: none; +} + +.entry-content p, +.entry-content li { + line-height: 1.4; +} + +.entry-content li img { + display: inline-block; +} + +.entry-content h1, +.entry-content h2, +.entry-content h3, +.entry-content h4, +.entry-content h5, +.entry-content h6 { + margin: 3.5rem auto 2rem; +} + +.entry-content ul ul, +.entry-content ol ol, +.entry-content ul ol, +.entry-content ol ul { + margin-bottom: 1rem; +} + +.entry-content hr { + margin: 4rem auto; +} + +.post-inner .entry-content > .wp-block-cover.alignwide:first-child, +.post-inner .entry-content > .wp-block-cover.alignfull:first-child { + margin-top: 0; +} + +/* Font Families ----------------------------- */ + +.entry-content { + font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif; + letter-spacing: normal; +} + +.entry-content h1, +.entry-content h2, +.entry-content h3, +.entry-content h4, +.entry-content h5, +.entry-content h6, +.entry-content cite, +.entry-content figcaption, +.entry-content table, +.entry-content address, +.entry-content .wp-caption-text, +.entry-content .wp-block-file { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + .entry-content h1, + .entry-content h2, + .entry-content h3, + .entry-content h4, + .entry-content h5, + .entry-content h6, + .entry-content cite, + .entry-content figcaption, + .entry-content table, + .entry-content address, + .entry-content .wp-caption-text, + .entry-content .wp-block-file { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + + +/* Alignment Classes ------------------------- */ + +.entry-content > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + max-width: 58rem; + width: calc(100% - 4rem); +} + +[class*="__inner-container"] > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + max-width: 58rem; + width: 100%; +} + +.alignnone, +.aligncenter, +.alignleft, +.alignright, +.alignwide { + margin-top: 4rem; + margin-left: auto; + margin-bottom: 4rem; + margin-right: auto; +} + +[class*="__inner-container"] > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright) { + margin-right: auto; + margin-left: auto; +} + +/* Full */ + +.alignfull { + margin-top: 5rem; + margin-left: auto; + margin-bottom: 5rem; + margin-right: auto; + max-width: 100vw; + position: relative; + width: 100%; +} + +[class*="__inner-container"] > .alignfull { + max-width: 100%; +} + +/* Wide */ + +.alignwide { + max-width: 120rem; + position: relative; + width: calc(100% - 4rem); +} + +[class*="__inner-container"] > .alignwide { + width: 100%; +} + +/* Center */ + +.aligncenter, +.aligncenter img { + margin-right: auto; + margin-left: auto; +} + +/* Left and right */ + +.alignleft, +.alignright { + max-width: 50%; +} + +.alignleft { + float: left; + margin: 0.3rem 2rem 2rem 2rem; +} + +.alignright { + float: right; + margin: 0.3rem 2rem 2rem 2rem; +} + +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignleft, +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignleft, +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft { + margin-left: 2rem; +} + +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignright, +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignright, +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright { + margin-right: 2rem; +} + +/* Entry Media ------------------------------- */ + +.alignfull > figcaption, +.alignfull > .wp-caption-text { + margin-right: auto; + margin-left: auto; + max-width: 58rem; + width: calc(100% - 4rem); +} + + +/* -------------------------------------------------------------------------- */ + +/* 12. Comments +/* -------------------------------------------------------------------------- */ + + +/* Comment Headers ----------------------------- */ + +.comments-wrapper { + margin-top: 5rem; +} + +.comment-reply-title { + margin: 0 0 4rem 0; + text-align: center; +} + + +/* Comment Item ----------------------------- */ + +/* COMMENT HEADER */ + +.comments .comment, +.comments .pingback, +.comments .trackback, +.comments .review { + padding-top: 3.5rem; +} + +div.comment:first-of-type { + margin-top: 3.5rem; + padding-top: 0; +} + +.comments .comments-header + div { + margin-top: 0; + padding-top: 0; +} + +.comment-body { + position: relative; +} + +.comment .comment { + padding-right: 5%; +} + +.comment-meta { + line-height: 1.1; + margin-bottom: 1.5rem; + min-height: 5rem; + padding-right: 5rem; + position: relative; +} + +.hide-avatars .comment-meta { + min-height: 0; + padding-right: 0; +} + +.comment-meta a { + color: inherit; +} + +.comment-author { + font-size: 1.8rem; + font-weight: 700; + letter-spacing: -0.027777778em; +} + +.comment-author a { + text-decoration: underline; +} + +.comment-author a:hover, +.comment-author a:focus { + text-decoration: none; +} + +.comment-meta .avatar { + height: 4rem; + position: absolute; + right: 0; + top: 0; + width: 4rem; +} + +.comment-author .url { + text-decoration: underline; +} + +.comment-metadata { + color: #6d6d6d; + font-size: 1.4rem; + font-weight: 500; + margin-top: 0.6rem; +} + +.comment-metadata a { + text-decoration: none; +} + +.comment-metadata a:focus, +.comment-metadata a:hover { + text-decoration: underline; +} + + +/* COMMENT CONTENT */ + +.comment-content.entry-content > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + width: 100%; +} + +.comment-content.entry-content .alignleft { + margin-left: 0; +} + +.comment-content.entry-content .alignright { + margin-right: 0; +} + +/* COMMENT FOOTER */ + +.comment-footer-meta { + align-items: center; + display: flex; + flex-wrap: wrap; + font-size: 1.2rem; + font-weight: 600; + justify-content: flex-start; + letter-spacing: 0.030833333em; + line-height: 1; + margin: 1.5rem -1.5rem -1rem 0; + text-transform: uppercase; +} + +.comment-footer-meta > * { + margin: 0 1.5rem 1rem 0; +} + +.comment-reply-link { + background-color: #cd2653; + color: #fff; + display: block; + padding: 0.7rem; +} + +.bypostauthor .comment-footer-meta .by-post-author { + display: block; +} + +.comment-footer-meta a { + text-decoration: none; +} + +.comment-footer-meta a:focus, +.comment-footer-meta a:hover { + text-decoration: underline; +} + + +/* Pingbacks & Trackbacks ------------------------- */ + +.pingback .comment-meta, +.trackback .comment-meta { + padding-right: 0; +} + + +/* Comments Pagination ---------------------------- */ + +.comments-pagination { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + margin-top: 6rem; + text-align: center; +} + +.comments-pagination.only-next { + justify-content: flex-end; +} + +.comments-pagination .page-numbers { + display: none; + text-decoration: none; +} + +.comments-pagination .page-numbers:focus, +.comments-pagination .page-numbers:hover { + text-decoration: underline; +} + +.comments-pagination .prev, +.comments-pagination .next { + display: block; +} + +.comments-pagination .prev { + right: 0; +} + +.comments-pagination .next { + left: 0; + text-align: left; +} + + +/* Comment Respond ---------------------------- */ + +.comment-respond::after { + clear: both; + content: ""; + display: block; +} + +.comment-respond .comment-notes, +.comment-respond .logged-in-as { + color: #6d6d6d; + font-size: 1.6rem; + line-height: 1.4; + margin: -3rem 0 4rem 0; + text-align: center; +} + +.comment-respond .comment-notes a, +.comment-respond .logged-in-as a { + color: inherit; + text-decoration: none; +} + +.comment-respond .comment-notes a:focus, +.comment-respond .comment-notes a:hover, +.comment-respond .logged-in-as a:focus, +.comment-respond .logged-in-as a:hover { + text-decoration: underline; +} + +.comment-respond p { + line-height: 1.1; + margin-bottom: 2rem; + margin-right: auto; + margin-left: auto; +} + +.comment-respond p:not(.comment-notes) { + max-width: 58rem; +} + +.comment-form-cookies-consent { + align-items: baseline; + display: flex; +} + +.comment-respond > p:last-of-type { + margin-bottom: 0; +} + +.comment-respond label { + display: block; +} + +.comment-respond input[type="checkbox"] + label { + font-size: 1.5rem; + line-height: 1.25; +} + +.comment-respond input[type="text"], +.comment-respond input[type="email"], +.comment-respond textarea { + margin-bottom: 0; +} + +.comment-respond textarea { + height: 15rem; +} + +.comment-respond #submit { + display: block; +} + +.comment-respond .comments-closed { + text-align: center; +} + + +/* Reply Respond ---------------------------- */ + +.comments .comment-respond { + padding: 3rem 0 0; +} + +.comments .comment-respond .comment-reply-title, +.comments .comment-respond .comment-notes, +.comments .comment-respond .logged-in-as { + text-align: right; +} + +.comment-reply-title small { + display: block; + font-size: 1.6rem; + font-weight: 600; + letter-spacing: -0.0277em; + margin: 0.5rem 0 0 0; + white-space: nowrap; +} + +.comment-reply-title small a { + text-decoration: none; +} + +.comment-reply-title small a:focus, +.comment-reply-title small a:hover { + text-decoration: underline; +} + + +/* -------------------------------------------------------------------------- */ + +/* 13. Site Pagination +/* -------------------------------------------------------------------------- */ + + +.pagination .nav-links { + align-items: baseline; + display: flex; + flex-wrap: wrap; + font-size: 1.8rem; + font-weight: 600; + margin: -1.5rem -2.5rem 0 0; + width: calc(100% + 2.5rem); +} + +.pagination-separator { + margin: 5rem 0; +} + +.nav-links > * { + margin: 1.5rem 2.5rem 0 0; +} + +.nav-links .placeholder { + display: none; + visibility: hidden; +} + +.pagination a { + text-decoration: none; +} + +.pagination a:focus, +.pagination a:hover { + text-decoration: underline; +} + +.pagination .dots { + transform: translateY(-0.3em); + color: #6d6d6d; +} + +.nav-short { + display: none; +} + +/* -------------------------------------------------------------------------- */ + +/* 14. Error 404 +/* -------------------------------------------------------------------------- */ + + +.error404 #site-content { + padding-top: 4rem; +} + +.error404-content { + text-align: center; +} + +.error404 #site-content .search-form { + justify-content: center; + margin-top: 3rem; +} + + +/* -------------------------------------------------------------------------- */ + +/* 15. Widgets +/* -------------------------------------------------------------------------- */ + + +/* Widget Base ------------------------------- */ + +.widget { + margin-top: 3rem; +} + +.widget:first-child { + margin-top: 0; +} + +.widget-content > div > *:first-child { + margin-top: 0; +} + +.widget-content > div > *:last-child { + margin-bottom: 0; +} + +.widget .widget-title { + margin: 0 0 2rem; +} + +.widget li { + margin: 2rem 0 0 0; +} + +.widget li:first-child, +.widget li > ul, +.widget li > ol { + margin-top: 0; +} + +.widget table, +.widget table * { + border-color: #dedfdf; +} + +.widget table caption { + background-color: #dedfdf; +} + +.widget .post-date, +.widget .rss-date { + color: #6d6d6d; + display: block; + font-size: 0.85em; + font-weight: 500; + margin-top: 0.2rem; +} + +.widget select { + max-width: 100%; +} + +/* Font Families ----------------------------- */ + +.widget_text p, +.widget_text ol, +.widget_text ul, +.widget_text dl, +.widget_text dt, +.widget-content .rssSummary { + font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif; + letter-spacing: normal; +} + +.widget-content cite, +.widget-content figcaption, +.widget-content .wp-caption-text { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + .widget-content cite, + .widget-content figcaption, + .widget-content .wp-caption-text { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + +/* Base List Widget -------------------------- */ + +.widget_archive ul, +.widget_categories ul, +.widget_pages ul, +.widget_meta ul, +.widget_nav_menu ul, +.widget_recent_comments ul, +.widget_recent_entries ul, +.widget_rss ul { + list-style: none; + margin: 0; +} + +.widget_archive li, +.widget_categories li, +.widget_pages li, +.widget_meta li, +.widget_nav_menu li { + color: #6d6d6d; + margin: 0.3rem 0; +} + +.widget_archive li li, +.widget_categories li li, +.widget_pages li li, +.widget_meta li li, +.widget_nav_menu li li { + margin-right: 2rem; +} + +.widget_archive a, +.widget_categories a, +.widget_pages a, +.widget_meta a, +.widget_nav_menu a { + font-weight: 700; + text-decoration: none; +} + +.widget_archive a:focus, +.widget_archive a:hover, +.widget_categories a:focus, +.widget_categories a:hover, +.widget_pages a:focus, +.widget_pages a:hover, +.widget_meta a:focus, +.widget_meta a:hover, +.widget_nav_menu a:focus, +.widget_nav_menu a:hover { + text-decoration: underline; +} + +/* Widget: Calendar -------------------------- */ + +.calendar_wrap { + font-size: 2.4rem; +} + +.calendar_wrap th, +.calendar_wrap td, +.wp-calendar-nav span { + display: table-cell; + font-size: 1em; + font-weight: 500; + line-height: 1; + padding: 2.5% 2.5% 1.75% 2.5%; + text-align: center; +} + +.wp-calendar-table { + margin-bottom: 0; +} + +.wp-calendar-nav { + display: table; + width: 100%; + font-size: 1.8rem; +} + +.calendar_wrap tfoot td { + border-bottom: none; +} + +.calendar_wrap tfoot a, +.calendar_wrap .wp-calendar-nav a { + text-decoration: none; +} + +.calendar_wrap tfoot #prev, +.calendar_wrap .wp-calendar-nav-prev { + text-align: right; +} + +.calendar_wrap tfoot #next, +.calendar_wrap .wp-calendar-nav-next { + text-align: left; +} + +/* Widget: Image ----------------------------- */ + +/* Widget: Gallery --------------------------- */ + +.widget_media_gallery .gallery { + margin: 0 -0.4em -0.8em -0.4em; + width: calc(100% + 0.8em); +} + +.widget_media_gallery .gallery-item { + margin: 0 0 0.8em 0; + padding: 0 0.4em; +} + +/* Widget: Nav Menu -------------------------- */ + +.widget_nav_menu .widget-content > div > ul { + margin-right: 0; +} + +/* Widget: Recent Comments ------------------- */ + +.widget_recent_comments li { + font-weight: 700; +} + +.widget_recent_comments a { + text-decoration: none; +} + +.widget_recent_comments a:focus, +.widget_recent_comments a:hover { + text-decoration: underline; +} + +/* Widget: Recent Entries -------------------- */ + +.widget_recent_entries a { + font-weight: 700; + text-decoration: none; +} + +.widget_recent_entries a:focus, +.widget_recent_entries a:hover { + text-decoration: underline; +} + +/* Widget: RSS ------------------------------- */ + +.widget_rss .widget-title a.rsswidget:first-of-type { + display: none; +} + +.widget_rss .rsswidget { + font-weight: 700; +} + +.widget_rss a { + text-decoration: none; +} + +.widget_rss a:focus, +.widget_rss a:hover { + text-decoration: underline; +} + +.widget_rss .rssSummary { + margin-top: 0.5rem; +} + +.widget_rss cite::before { + content: "— "; +} + +/* Widget: Search ---------------------------- */ + +.widget_search .search-field { + border-color: #dedfdf; +} + +/* Widget: Tag Cloud ------------------------- */ + +.widget_tag_cloud a { + font-weight: 700; + margin-left: 0.5rem; + text-decoration: none; + white-space: nowrap; +} + +.widget_tag_cloud a:focus, +.widget_tag_cloud a:hover { + text-decoration: underline; +} + +/* Widget: Text ------------------------------ */ + + +/* -------------------------------------------------------------------------- */ + +/* 16. Site Footer +/* -------------------------------------------------------------------------- */ + + +.footer-nav-widgets-wrapper, +#site-footer { + background-color: #fff; + border-color: #dedfdf; + border-style: solid; + border-width: 0; +} + +.footer-top-visible .footer-nav-widgets-wrapper, +.footer-top-hidden #site-footer { + margin-top: 5rem; +} + +.reduced-spacing.footer-top-visible .footer-nav-widgets-wrapper, +.reduced-spacing.footer-top-hidden #site-footer { + border-top-width: 0.1rem; +} + +.footer-top, +.footer-widgets-outer-wrapper, +#site-footer { + padding: 3rem 0; +} + + +/* Footer Top -------------------------------- */ + +.footer-top { + display: flex; + border-bottom: 0.1rem solid #dedfdf; + justify-content: space-between; +} + +/* FOOTER MENU */ + +.footer-menu { + font-size: 1.8rem; + font-weight: 700; + letter-spacing: -0.0277em; +} + +.footer-menu li { + line-height: 1.25; + margin: 0.25em 0 0 0; +} + +.footer-menu a { + text-decoration: none; + word-break: normal; + word-wrap: normal; +} + +.footer-menu a:hover, +.footer-menu a:focus { + text-decoration: underline; +} + +/* FOOTER SOCIAL */ + +.footer-social-wrapper { + margin: 0; + width: 100%; +} + +.has-footer-menu .footer-social-wrapper { + flex-shrink: 0; + margin-right: 1rem; + width: 50%; +} + +ul.footer-social { + margin: -0.5rem -0.5rem 0 0; +} + +.has-footer-menu .footer-social { + justify-content: flex-end; +} + +ul.footer-social li { + margin: 0.5rem 0.5rem 0 0; +} + +.footer-social a { + background-color: #cd2653; + height: 3.6rem; + width: 3.6rem; +} + +.footer-social a::before { + font-size: 1.6rem; +} + +/* Footer Widgets ---------------------------- */ + +.footer-widgets-outer-wrapper { + border-bottom: 0.1rem solid #dedfdf; +} + +.footer-widgets + .footer-widgets { + margin-top: 3rem; +} + +/* Footer Bottom ----------------------------- */ + +#site-footer { + font-size: 1.6rem; +} + +#site-footer .section-inner { + align-items: baseline; + display: flex; + justify-content: space-between; +} + +#site-footer a { + text-decoration: none; +} + +#site-footer a:focus, +#site-footer a:hover { + text-decoration: underline; +} + +.footer-copyright a, +.powered-by-wordpress a { + color: inherit; +} + +.powered-by-wordpress, +.to-the-top { + color: #6d6d6d; +} + +a.to-the-top > * { + pointer-events: none; +} + +.footer-copyright { + font-weight: 600; + margin: 0; +} + +.powered-by-wordpress { + display: none; + margin: 0 2.4rem 0 0; +} + +.to-the-top-long { + display: none; +} + + +/* -------------------------------------------------------------------------- */ + +/* 17. Media Queries +/* -------------------------------------------------------------------------- */ + +@media ( max-width: 479px ) { + + /* Blocks -------------------------------- */ + + .wp-block-pullquote.alignleft, + .wp-block-pullquote.alignright { + float: none; + } + + /* Entry Content ------------------------- */ + + /* LISTS */ + + ul, + ol { + margin: 0 2rem 3rem 0; + } + + li { + margin: 0.5rem 1rem 0 0; + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em 0 0 0; + } +} + +@media ( min-width: 480px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: BASE ALIGNMENT WIDTH */ + + .wp-block-pullquote.alignleft, + .wp-block-pullquote.alignright, + .wp-block-cover-image.alignleft, + .wp-block-cover-image.alignright, + .wp-block-cover.alignleft, + .wp-block-cover.alignright, + .wp-block-embed.alignleft, + .wp-block-embed.alignright, + .wp-block-gallery.alignleft, + .wp-block-gallery.alignright { + max-width: 26rem; + } + + /* BLOCK: TABLE WIDTH */ + .wp-block-table.alignleft, + .wp-block-table.alignright { + max-width: 100%; + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .alignleft, + .alignright { + max-width: 26rem; + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em 0 0 0; + } +} + +@media ( max-width: 599px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + /* While columns are stacked */ + .wp-block-column:last-child { + margin-bottom: 0; + } + + .wp-block-columns + .wp-block-columns { + margin-top: 0.2rem; + } + + .wp-block-columns.alignwide + .wp-block-columns.alignwide { + margin-top: -0.8rem; + } + + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -1.8rem; + } + + /* Template -------------------------------- */ + + /* TEMPLATE: COVER */ + + .template-cover .post-inner .post-meta-wrapper, + .template-cover .post-inner .author-bio { + width: calc( 100% - 4rem ); + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em 0 0 0; + } +} + +@media ( min-width: 600px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + .wp-block-columns.alignwide + .wp-block-columns.alignwide, + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -4rem; + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em 0 0 0; + } +} + +@media ( min-width: 660px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignleft { + margin-left: calc(( 100vw - 58rem - 8rem ) / -2); + } + + figure.wp-block-gallery.alignright { + margin-right: calc(( 100vw - 58rem - 8rem ) / -2); + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .entry-content > .alignleft { + margin-left: 4rem; + } + + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft { + margin-left: calc(( 100vw - 58rem - 8rem ) / -2); + } + + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .alignleft, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .wp-block-image .alignleft { + margin-left: 0; + } + + .entry-content > .alignright { + margin-right: 4rem; + } + + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright { + margin-right: calc(( 100vw - 58rem - 8rem ) / -2); + } + + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .alignright, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > p .alignright, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .wp-block-image .alignright { + margin-right: 0; + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em auto 0 auto; + } +} + +@media ( min-width: 700px ) { + + /* Element Base ------------------------- */ + + ul, + ol { + margin-bottom: 4rem; + } + + pre { + padding: 3rem; + } + + hr { + margin: 8rem auto; + } + + table { + font-size: 1.8rem; + } + + /* VANILLA GALLERIES */ + + .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%; + } + + /* TITLES */ + + h1, + .heading-size-1, + h2, + .heading-size-2, + h3, + .heading-size-3 { + margin: 6rem auto 3rem; + } + + h4, + .heading-size-4, + h5, + .heading-size-5, + h6, + .heading-size-6 { + margin: 4.5rem auto 2.5rem; + } + + h1, + .heading-size-1 { + font-size: 6.4rem; + } + + h2, + .heading-size-2 { + font-size: 4.8rem; + } + + h3, + .heading-size-3 { + font-size: 4rem; + } + + h4, + .heading-size-4 { + font-size: 3.2rem; + } + + h5, + .heading-size-5 { + font-size: 2.4rem; + } + + h6, + .heading-size-6 { + font-size: 1.8rem; + } + + /* INPUTS */ + + fieldset { + padding: 3rem; + } + + legend { + padding: 0 1.5rem; + } + + button, + .button, + .faux-button, + .wp-block-button__link, + input[type="button"], + input[type="reset"], + input[type="submit"] { + font-size: 1.7rem; + } + + /* MEDIA */ + + figcaption, + .wp-caption-text { + margin-top: 1.8rem; + } + + + /* Helper Classes ------------------------- */ + + /* SECTIONS */ + + section { + padding: 8rem 0; + } + + .section-inner { + width: calc(100% - 8rem); + } + + + /* Site Header --------------------------- */ + + .header-inner { + padding: 3.8rem 0; + } + + .site-title { + font-size: 2.4rem; + font-weight: 700; + } + + .site-description { + display: block; + } + + .site-logo img { + max-height: 9rem; + transition: height 0.15s linear, width 0.15s linear, max-height 0.15s linear; + } + + /* HEADER TOGGLES */ + + .toggle-inner .toggle-text { + font-size: 1.2rem; + } + + .search-toggle { + right: 2rem; + } + + .nav-toggle { + left: 2rem; + } + + + /* Menu Modal ---------------------------- */ + + button.close-nav-toggle { + font-size: 1.8rem; + padding: 4rem 0; + } + + button.close-nav-toggle svg { + height: 2rem; + width: 2rem; + } + + button.close-nav-toggle .toggle-text { + margin-left: 2.1rem; + } + + .modal-menu { + right: auto; + width: 100%; + } + + .modal-menu > li > a, + .modal-menu > li > .ancestor-wrapper > a { + font-size: 2.4rem; + padding: 2.5rem 0; + } + + .modal-menu ul li { + border-right-color: transparent; + } + + .modal-menu > li > .ancestor-wrapper > button.sub-menu-toggle { + padding: 0 3rem; + } + + .modal-menu > li > .ancestor-wrapper > button.sub-menu-toggle svg { + height: 1.1rem; + width: 1.8rem; + } + + .menu-bottom { + align-items: center; + display: flex; + justify-content: space-between; + padding: 4.4rem 0; + } + + .menu-copyright { + display: block; + flex-shrink: 0; + margin-left: 4rem; + } + + /* Modal Search Form ------------------------- */ + + .search-modal form { + position: relative; + width: 100%; + } + + .search-untoggle svg { + height: 2.5rem; + width: 2.5rem; + } + + .search-modal .search-field { + border: none; + font-size: 3.2rem; + height: 14rem; + } + + .search-modal .search-field::-moz-placeholder { + line-height: 4.375; + } + + /* Sub Page ------------------------------ */ + + /* FEATURED MEDIA */ + + .featured-media figcaption { + margin: 2rem auto 0 auto; + width: calc(100% - 8rem); + } + + /* Template: Cover Template -------------- */ + + .cover-header-inner { + padding: 18rem 0 8rem 0; + } + + .to-the-content-wrapper { + top: calc(100% + 1.8rem); + } + + .to-the-content { + height: 6rem; + } + + .to-the-content svg { + height: 2.4rem; + width: 2.12rem; + } + + /* Template: Full Width ------------------ */ + + body.template-full-width .entry-content > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + width: calc(100% - 8rem); + } + + body.template-full-width .alignfull:not(.has-background) > .wp-block-group__inner-container > p:not(.has-background-color) { + padding-right: 4rem; + padding-left: 4rem; + } + + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft { + margin-left: 4rem; + } + + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + margin-right: 4rem; + } + + /* Post: Archive ------------------------- */ + + .archive-header { + padding: 8rem 0; + } + + .reduced-spacing .archive-header { + padding-bottom: 3rem; + } + + .archive-title { + font-size: 3.2rem; + } + + body:not(.singular) main > article:first-of-type { + padding: 8rem 0 0; + } + + h2.entry-title { + font-size: 6.4rem; + } + + /* SEARCH RESULTS */ + + .no-search-results-form { + padding-top: 8rem; + } + + /* Post: Single -------------------------- */ + + /* POST HEADER */ + + .singular .entry-header { + padding: 8rem 0; + } + + .entry-categories { + margin-bottom: 3rem; + } + + .entry-categories-inner { + margin: -1rem -2rem 0 0; + } + + .entry-categories a { + font-size: 1.5rem; + margin: 1rem 2rem 0 0; + } + + .intro-text { + font-size: 2rem; + margin-top: 2.5rem; + } + + .singular .intro-text { + font-size: 2.6rem; + } + + .post-meta-wrapper { + margin-top: 3rem; + } + + .post-meta { + font-size: 1.6rem; + margin: -1.4rem -3rem 0 0; + } + + .post-meta li { + margin: 1.4rem 3rem 0 0; + max-width: calc(100% - 3rem); + } + + .featured-media { + margin-top: 6rem; + } + + .post-inner { + padding-top: 8rem; + } + + /* POST FOOTER */ + + .post-meta-wrapper.post-meta-single-bottom { + margin-top: 4rem; + } + + /* AUTHOR BIO */ + + .author-bio { + margin-top: 8rem; + min-height: 8rem; + padding-right: 10rem; + position: relative; + } + + .author-bio .avatar { + position: absolute; + right: 0; + top: 0; + height: 8rem; + width: 8rem; + } + + /* SINGLE PAGINATION */ + + .pagination-single { + font-size: 2.4rem; + margin-top: 8rem; + } + + .pagination-single-inner { + flex-direction: row; + justify-content: space-between; + } + + .pagination-single.only-next .pagination-single-inner { + justify-content: flex-end; + } + + .pagination-single hr:first-child { + margin: 0 0 4rem 0; + } + + .pagination-single hr:last-child { + margin: 4rem 0 0.8rem 0; + } + + .pagination-single a + a { + margin: 0 4rem 0 0; + } + + .pagination-single a .arrow { + margin: 0 0 0 2rem; + } + + .pagination-single .next-post { + flex-direction: row-reverse; + text-align: left; + } + + .pagination-single .next-post .arrow { + margin: 0 2rem 0 0; + } + + /* Blocks -------------------------------- */ + + /* BLOCK: SHARED MEDIA STYLES */ + + .wp-block-embed figcaption, + .wp-block-image figcaption { + font-size: 1.6rem; + } + + /* BLOCK: BASE MARGINS */ + + .wp-block-archives:not(.alignwide):not(.alignfull), + .wp-block-categories:not(.alignwide):not(.alignfull), + .wp-block-code, + .wp-block-columns:not(.alignwide):not(.alignfull), + .wp-block-cover:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), + .wp-block-embed:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), + .wp-block-gallery:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), + .wp-block-group:not(.has-background):not(.alignwide):not(.alignfull), + .wp-block-image:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), + .wp-block-latest-comments:not(.aligncenter):not(.alignleft):not(.alignright), + .wp-block-latest-posts:not(.aligncenter):not(.alignleft):not(.alignright), + .wp-block-media-text:not(.alignwide):not(.alignfull), + .wp-block-preformatted, + .wp-block-pullquote:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright), + .wp-block-quote, + .wp-block-quote.is-large, + .wp-block-quote.is-style-large, + .wp-block-verse, + .wp-block-video:not(.alignwide):not(.alignfull) { + margin-bottom: 4rem; + margin-top: 4rem; + } + + /* BLOCK: COLUMNS */ + + .wp-block-columns.alignwide + .wp-block-columns.alignwide, + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -6rem; + } + + .entry-content .wp-block-columns h1, + .entry-content .wp-block-columns h2, + .entry-content .wp-block-columns h3, + .entry-content .wp-block-columns h4, + .entry-content .wp-block-columns h5, + .entry-content .wp-block-columns h6 { + margin: 3.5rem 0 2rem; + } + + /* BLOCK: COVER */ + + .wp-block-cover-image .wp-block-cover__inner-container, + .wp-block-cover .wp-block-cover__inner-container { + width: calc(100% - 8rem); + } + + .wp-block-cover-image h2, + .wp-block-cover h2 { + font-size: 4.8rem; + } + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignnone, + figure.wp-block-gallery.aligncenter { + margin-bottom: 4rem; + margin-top: 4rem; + } + + figure.wp-block-gallery.alignwide, + figure.wp-block-gallery.alignfull { + margin-bottom: 6rem; + margin-top: 6rem; + } + + /* BLOCK: GROUP */ + + .wp-block-group.has-background { + padding: 4rem; + margin-top: 0; + margin-bottom: 0; + } + + .alignfull:not(.has-background) > .wp-block-group__inner-container > p:not(.has-background-color) { + padding-right: 0; + padding-left: 0; + } + + /* BLOCK: MEDIA AND TEXT */ + + .wp-block-media-text .wp-block-media-text__content { + padding: 4rem; + } + + /* BLOCK: PULLQUOTE */ + + .wp-block-pullquote blockquote p { + font-size: 3.2rem; + } + + .wp-block-pullquote cite { + margin-top: 2rem; + } + + .wp-block-pullquote.alignfull:not(.is-style-solid-color) { + padding-right: 1rem; + padding-left: 1rem; + } + + .wp-block-pullquote.alignwide::before, + .wp-block-pullquote.alignfull::before { + font-size: 11.272727272rem; + height: 8rem; + margin-bottom: 2rem; + width: 8rem; + } + + .wp-block-pullquote.alignwide blockquote p, + .wp-block-pullquote.alignfull blockquote p { + font-size: 4.8rem; + line-height: 1.203125; + } + + .wp-block-pullquote.alignleft p, + .wp-block-pullquote.alignright p, + .wp-block-pullquote.alignleft.is-style-solid-color blockquote p, + .wp-block-pullquote.alignright.is-style-solid-color blockquote p { + font-size: 3.2rem; + line-height: 1.1875; + } + + .wp-block-pullquote.is-style-solid-color.alignwide, + .wp-block-pullquote.is-style-solid-color.alignfull { + padding: 6rem 4rem 4rem; + } + + .wp-block-pullquote.alignleft.is-style-solid-color blockquote p, + .wp-block-pullquote.alignright.is-style-solid-color blockquote p { + font-size: 2.6rem; + } + + /* BLOCK: QUOTE */ + + .wp-block-quote.is-large p, + .wp-block-quote.is-style-large p { + font-size: 2.8rem; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator { + margin: 6rem auto; + } + + .wp-block-separator.is-style-wide { + max-width: calc(100vw - 8rem); + } + + /* Entry Content ------------------------- */ + + .entry-content { + font-size: 2.1rem; + } + + .entry-content p, + .entry-content li { + line-height: 1.476; + } + + .entry-content h1, + .entry-content h2, + .entry-content h3 { + margin: 6rem auto 3rem; + } + + .entry-content h4, + .entry-content h5, + .entry-content h6 { + margin: 4.5rem auto 2.5rem; + } + + .alignnone, + .aligncenter { + margin-bottom: 4rem; + margin-top: 4rem; + } + + .alignleft { + margin: 0.3rem 2rem 2rem 0; + } + + .alignright { + margin: 0.3rem 0 2rem 2rem; + } + + .entry-content > .alignwide:not(.wp-block-group.has-background), + .entry-content > .alignfull:not(.wp-block-group.has-background) { + margin-bottom: 6rem; + margin-top: 6rem; + } + + .entry-content > .alignwide { + max-width: calc(100vw - 8rem); + width: calc(100vw - 8rem); + } + + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft { + margin-left: 4rem; + } + + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright { + margin-right: 4rem; + } + + .entry-content > .alignwide:first-child, + .entry-content > .alignfull:first-child { + margin-bottom: 8rem; + } + + /* ENTRY MEDIA */ + + .alignfull > figcaption, + .alignfull > .wp-caption-text { + width: calc(100% - 8rem); + } + + /* Comments ------------------------------ */ + + .comments-wrapper { + margin-top: 8rem; + } + + .comment-reply-title { + margin-bottom: 4.6rem; + } + + .comment-respond p.comment-notes, + .comment-respond p.logged-in-as { + font-size: 1.8rem; + letter-spacing: -0.025em; + margin: -2.5rem 0 4.4rem 0; + } + + .comments .comment, + .comments .pingback, + .comments .trackback, + .comments .review { + padding-top: 5rem; + } + + div.comment:first-of-type { + margin-top: 5rem; + } + + .comment-meta { + margin-bottom: 2rem; + min-height: 6rem; + padding: 0.3rem 7.5rem 0 0; + } + + .comment-meta .avatar { + display: block; + height: 6rem; + position: absolute; + right: 0; + top: 0; + width: 6rem; + } + + .comment-author { + font-size: 2.4rem; + } + + .comment-metadata { + font-size: 1.6rem; + margin-top: 0.8rem; + } + + .comment-footer-meta { + margin-top: 2.5rem; + } + + .comments-pagination { + margin-top: 8rem; + } + + /* PINGBACKS & TRACKBACKS */ + + .pingback .comment-body { + padding: 0; + } + + /* COMMENT RESPOND */ + + .comment-respond p { + margin-bottom: 2.5rem; + } + + .comment-form p.logged-in-as { + margin: -2.5rem 0 4.4rem 0; + } + + .comment-respond .comment-form-author, + .comment-respond .comment-form-email { + float: right; + width: calc(50% - 1rem); + } + + .comment-respond .comment-form-email { + margin-right: 2rem; + } + + .comments .comment-respond { + padding: 5rem 0 0; + } + + .comment-reply-title small { + display: inline; + margin: 0 0.5rem 0 0; + } + + /* Site Pagination ----------------------- */ + + .pagination-separator { + margin: 8rem 0; + } + + /* Display the full text for Newer and Older Posts. */ + + .nav-short { + display: inline; + } + + .pagination .nav-links { + font-size: 2.4rem; + font-weight: 700; + margin: -2.5rem -4rem 0 0; + } + + .nav-links > * { + margin: 2.5rem 4rem 0 0; + } + + + /* Error 404 ----------------------------- */ + + .error404 #site-content { + padding-top: 8rem; + } + + /* Widgets ------------------------------- */ + + .widget .widget-title { + margin-bottom: 3rem; + } + + /* Site Footer --------------------------- */ + + .footer-top-visible .footer-nav-widgets-wrapper, + .footer-top-hidden #site-footer { + margin-top: 8rem; + } + + /* FOOTER TOP */ + + .footer-top { + padding: 3.7rem 0; + } + + .footer-menu { + font-size: 2.4rem; + margin: -0.8rem -1.6rem 0 0; + } + + .footer-menu li { + margin: 0.8rem 1.6rem 0 0; + } + + .has-footer-menu .footer-social-wrapper { + flex: 1; + margin-right: 4rem; + width: auto; + } + + /* FOOTER WIDGETS */ + + .footer-widgets-outer-wrapper { + padding: 8rem 0; + } + + .footer-widgets-wrapper { + display: flex; + justify-content: space-between; + margin-right: -4rem; + width: calc(100% + 4rem); + } + + .footer-widgets { + margin-right: 4rem; + width: 50%; + } + + .footer-widgets + .footer-widgets { + margin-top: 0; + } + + .footer-widgets .widget { + border-top: none; + margin-top: 5rem; + padding-top: 0; + } + + .footer-widgets .widget:first-child { + margin-top: 0; + } + + /* FOOTER BOTTOM */ + + #site-footer { + font-size: 1.8rem; + padding: 4.3rem 0; + } + + .footer-credits { + display: flex; + } + + .footer-copyright { + font-weight: 700; + } + + .powered-by-wordpress { + display: block; + } + + .to-the-top-long { + display: inline; + } + + .to-the-top-short { + display: none; + } + +} + +@media (min-width: 782px) { + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + .wp-block-column { + margin-bottom: 0; + } + + .wp-block-columns.alignwide + .wp-block-columns.alignwide, + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -2.8rem; + } +} + +@media ( min-width: 1000px ) { + + + /* Document Setup ------------------------ */ + + /* Helper Classes ------------------------ */ + + /* Site Header --------------------------- */ + + #site-header { + z-index: 2; + } + + .header-inner { + align-items: center; + display: flex; + justify-content: space-between; + padding: 2.8rem 0; + } + + .header-titles-wrapper { + margin-left: 4rem; + max-width: 50%; + padding: 0; + text-align: right; + } + + .header-titles { + align-items: baseline; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + margin: -1rem -2.4rem 0 0; + } + + .header-titles .site-title, + .header-titles .site-logo, + .header-titles .site-description { + margin: 1rem 2.4rem 0 0; + } + + .wp-custom-logo .header-titles { + align-items: center; + } + + /* HEADER NAVIGATION */ + + .header-navigation-wrapper { + align-items: center; + display: flex; + } + + .primary-menu-wrapper { + display: block; + width: 100%; + } + + /* HEADER TOGGLES */ + + .mobile-search-toggle, + .mobile-nav-toggle { + display: none !important; + } + + .primary-menu-wrapper + .header-toggles { + margin-right: 3rem; + } + + .header-toggles { + display: flex; + flex-shrink: 0; + margin-left: -3rem; + } + + .header-inner .toggle { + height: 4.4rem; + padding: 0 3rem; + position: relative; + bottom: auto; + right: auto; + left: auto; + top: auto; + width: auto; + } + + .header-inner .toggle-wrapper { + position: relative; + } + + .header-inner .toggle-wrapper::before { + background: #dedfdf; + content: ""; + display: block; + height: 2.7rem; + position: absolute; + right: 0; + top: calc(50% - 1.35rem); + width: 0.1rem; + } + + .header-inner .toggle-wrapper:first-child::before { + content: none; + } + + .header-inner .primary-menu-wrapper + .header-toggles .toggle-wrapper:first-child::before { + content: ""; + } + + .nav-toggle-wrapper:not(.has-expanded-menu) { + display: none; + } + + .toggle-inner { + position: static; + } + + .toggle-inner .toggle-text { + right: 0; + left: 0; + text-align: center; + top: calc(100% - 0.3rem); + width: auto; + } + + .header-toggles:only-child .nav-toggle .toggle-inner { + padding-top: 0; + } + + .header-toggles:only-child .toggle-inner { + display: flex; + flex-wrap: nowrap; + align-items: center; + } + + .header-toggles:only-child .toggle-inner .svg-icon { + order: 1; + } + + .header-toggles:only-child .toggle-inner .toggle-text { + position: static; + padding-left: 20px; + font-size: 15px; + color: inherit; + } + + /* Menu Modal ---------------------------- */ + + .menu-modal { + opacity: 1; + justify-content: flex-end; + padding: 0; + transition: background-color 0.3s ease-in, right 0s 0.3s, left 0s 0.3s; + } + + .menu-modal.cover-modal { + background: rgba(0, 0, 0, 0); + } + + .menu-modal.active { + background: rgba(0, 0, 0, 0.2); + transition: background-color 0.3s ease-out; + } + + .menu-wrapper.section-inner { + width: calc(100% - 8rem); + } + + .menu-modal-inner { + box-shadow: 0 0 2rem 0 rgba(0, 0, 0, 0.1); + opacity: 0; + padding: 0; + transform: translateX(-20rem); + transition: transform 0.2s ease-in, opacity 0.2s ease-in; + width: 50rem; + } + + .menu-modal.active .menu-modal-inner { + opacity: 1; + transform: translateX(0); + transition-timing-function: ease-out; + } + + .mobile-menu { + display: none; + } + + .expanded-menu { + display: block; + } + + .menu-bottom { + padding: 6rem 0; + } + + .menu-bottom .social-menu { + justify-content: flex-start; + } + + /* Sub Page ------------------------------ */ + + /* FEATURED MEDIA */ + + .featured-media figcaption { + width: 100%; + } + + /* Template: Full Width ------------------ */ + + .template-full-width .wp-block-image .alignleft { + margin-right: 2rem; + } + + .template-full-width .wp-block-image .alignright { + margin-left: 2rem; + } + + /* Post: Archive ------------------------- */ + + /* Post: Single -------------------------- */ + + .singular .intro-text { + font-size: 2.8rem; + } + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + .wp-block-columns.alignwide + .wp-block-columns.alignwide, + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -4.8rem; + } + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignwide, + figure.wp-block-gallery.alignfull { + margin-bottom: 8rem; + margin-top: 8rem; + } + + /* BLOCK: GROUP */ + + .entry-content > .wp-block-group.alignwide.has-background, + .entry-content > .wp-block-group.alignfull.has-background { + padding: 8rem 4rem; + margin-bottom: 0; + margin-top: 0; + } + + /* BLOCK: IMAGE */ + + .wp-block-image .alignleft { + margin-right: 0; + } + + .wp-block-image .alignright { + margin-left: 0; + } + + .wp-block-image .aligncenter figcaption { + text-align: center; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator { + margin: 8rem auto; + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .entry-content > .alignleft, + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft { + position: absolute; + right: calc((100vw - 58rem) / 2 + 58rem + 2rem); + max-width: calc((100% - 58rem) / 2 - 6rem); + } + + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .alignleft, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .wp-block-image .alignleft { + position: relative; + right: inherit; + max-width: inherit; + } + + [class*="wp-block"].alignwide [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft { + position: absolute; + right: calc((100% - 58rem) / 2 + 58rem + 4rem); + max-width: calc((100% - 58rem) / 2 - 4rem); + } + + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .wp-block-image .alignleft { + right: calc((100% - 58rem) / 2 + 58rem); + } + + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft { + margin-left: 4rem; + } + + .entry-content > .alignright, + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright, + [class*="__inner-container"] > .alignright { + position: absolute; + left: calc((100vw - 58rem) / 2 + 58rem + 2rem); + max-width: calc((100% - 58rem) / 2 - 6rem); + } + + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .alignright, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > p .alignright, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .wp-block-image .alignright { + position: relative; + left: inherit; + max-width: inherit; + } + + [class*="wp-block"].alignwide [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide [class*="__inner-container"] > .wp-block-image .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + position: absolute; + left: calc((100% - 58rem) / 2 + 58rem + 4rem); + max-width: calc((100% - 58rem) / 2 - 4rem); + } + + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .wp-block-image .alignright { + left: calc((100% - 58rem) / 2 + 58rem + 4rem); + } + + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + margin-right: 4rem; + } + + .entry-content > .alignwide:not(.wp-block-group.has-background), + .entry-content > .alignfull:not(.wp-block-group.has-background) { + margin-bottom: 8rem; + margin-top: 8rem; + } + + /* ENTRY MEDIA */ + + .alignfull > figcaption, + .alignfull > .wp-caption-text { + width: calc(100% - 10rem); + } + + /* Comments ------------------------------ */ + + .comment-meta { + padding-right: 0; + } + + .comment-meta .avatar { + right: -8rem; + } + + /* Site Pagination ----------------------- */ + + .pagination .nav-links { + justify-content: space-between; + margin: 0; + width: 100%; + } + + .nav-links > * { + margin: 0 2rem; + } + + .pagination .next, + .pagination .prev { + display: block; + } + + .pagination .prev { + margin: 0 0 0 auto; + } + + .pagination .next { + text-align: left; + margin: 0 auto 0 0; + } + + /* Site Footer --------------------------- */ + + /* FOOTER TOP */ + + .footer-top { + align-items: center; + } + + .footer-menu { + align-items: baseline; + display: flex; + justify-content: flex-start; + flex-wrap: wrap; + font-size: 2.1rem; + margin: -1.2rem -2.4rem 0 0; + } + + .footer-menu li { + margin: 1.2rem 2.4rem 0 0; + } +} + + +@media ( min-width: 1220px ) { + + /* Element Base -------------------------- */ + + /* TITLES */ + + h1, + .heading-size-1 { + font-size: 8.4rem; + } + + /* Helper Classes ------------------------ */ + + /* Site Header --------------------------- */ + + /* PRIMARY MENU */ + + ul.primary-menu { + margin: -0.8rem -2.5rem 0 0; + } + + .primary-menu > li { + margin: 0.8rem 2.5rem 0 0; + } + + /* HEADER TOGGLES */ + + .primary-menu-wrapper + .header-toggles { + margin-right: 4rem; + } + + .header-toggles { + margin-left: -4rem; + } + + .header-toggles .toggle { + padding: 0 4rem; + } + + /* Menu Modal ---------------------------- */ + + /* Search Modal -------------------------- */ + + /* Sub Page ------------------------------ */ + + /* Template: Cover Template -------------- */ + + .cover-header + .post-inner { + padding-top: 10rem; + } + + /* Post: Archive ------------------------- */ + + /* Post: Single -------------------------- */ + + .singular .intro-text { + font-size: 3.2rem; + letter-spacing: -0.03125em; + line-height: 1.375; + } + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -6rem; + } + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignfull { + margin-bottom: 10rem; + margin-top: 10rem; + } + + /* BLOCK: GROUP */ + + .entry-content > .wp-block-group.alignwide.has-background, + .entry-content > .wp-block-group.alignfull.has-background { + padding: 8rem 6rem; + margin-bottom: 0; + margin-top: 0; + } + + /* BLOCK: PULLQUOTE */ + + .wp-block-pullquote.alignwide blockquote p, + .wp-block-pullquote.alignfull blockquote p { + font-size: 6.4rem; + } + + .wp-block-pullquote.is-style-solid-color.alignwide, + .wp-block-pullquote.is-style-solid-color.alignfull { + padding: 9rem 4rem 8rem; + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .entry-content > .alignfull { + margin-bottom: 10rem; + margin-top: 10rem; + } + + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .wp-block-image .alignleft { + right: calc((100% - 58rem) / 2 + 58rem - 2rem); + } + + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .wp-block-image .alignright { + left: calc((100% - 58rem) / 2 + 58rem + 6rem); + } + + /* Comments ------------------------------ */ + + .comment-reply-title { + font-size: 5.6rem; + line-height: 1.2; + margin-bottom: 6rem; + } + + .comment-respond p.comment-notes, + .comment-respond p.logged-in-as { + margin: -4rem 0 6rem 0; + } + + .comments .comment-respond .comment-reply-title { + font-size: 4.8rem; + } + + .comments .comment-respond p.comment-notes, + .comments .comment-respond p.logged-in-as { + margin: -4.5rem 0 4rem 0; + } + + /* Site Pagination ----------------------- */ + + /* Widgets ------------------------------- */ + + .widget-content { + font-size: 2.1rem; + } + + /* Site Footer --------------------------- */ + + .footer-menu { + font-size: 2.4rem; + margin: -1.5rem -3rem 0 0; + } + + .footer-menu li { + margin: 1.5rem 3rem 0 0; + } + + ul.footer-social { + margin: -1rem -1rem 0 0; + } + + ul.footer-social li { + margin: 1rem 1rem 0 0; + } + + .footer-social a { + height: 4.4rem; + width: 4.4rem; + } + + .footer-social a::before { + font-size: 2rem; + } + + /* FOOTER WIDGETS */ + + .footer-widgets-wrapper { + margin-right: -6rem; + width: calc(100% + 6rem); + } + + .footer-widgets { + margin-right: 6rem; + } + +} + +@media ( min-width: 1240px ) { + + + /* Blocks -------------------------------- */ + + body.template-full-width .entry-content > .alignleft { + margin-left: calc(( 100vw - 120rem ) / 2); + } + + body.template-full-width .entry-content > .alignright { + margin-right: calc(( 100vw - 120rem ) / 2); + } + +} + +@media ( min-width: 1280px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignleft { + margin-left: -31rem; + } + + figure.wp-block-gallery.alignright { + margin-right: -31rem; + } + + /* BLOCK: SEPARATOR */ + + .wp-block-separator.is-style-wide { + max-width: 120rem; + width: 120rem; + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .entry-content > .alignleft, + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft { + right: calc((100vw - 58rem) / 2 + 58rem + 4rem); + margin-left: -31rem; + } + + .entry-content > .alignright, + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright { + left: calc((100vw - 58rem) / 2 + 58rem + 4rem); + margin-right: -31rem; + } + + .entry-content > .alignwide { + max-width: 120rem; + width: 120rem; + } + + [class*="__inner-container"] > .alignwide { + max-width: 120rem; + width: 100%; + } + + .alignleft, + .alignright, + .entry-content > .alignleft, + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft, + .entry-content > .alignright, + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + max-width: 25rem; + } + + /* Template: Full Width ------------------ */ + + body.template-full-width .alignfull:not(.has-background) > .wp-block-group__inner-container > p:not(.has-background-color) { + padding-right: 0; + padding-left: 0; + } + + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft { + margin-left: 0; + } + + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + margin-right: 0; + } + +} + +@media ( min-width: 1330px ) { + + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .alignleft, + .alignright, + .entry-content > .alignleft, + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft, + .entry-content > .alignright, + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + max-width: 29rem; + } + + /* Blocks -------------------------------- */ + + /* BLOCK: PULLQUOTE */ + + .wp-block-pullquote.is-style-solid-color.alignleft::before, + .wp-block-pullquote.is-style-solid-color.alignright::before { + top: 0; + } +} diff --git a/content/themes/twentytwenty/style.css b/content/themes/twentytwenty/style.css new file mode 100644 index 0000000..dfcd64f --- /dev/null +++ b/content/themes/twentytwenty/style.css @@ -0,0 +1,6471 @@ +/* +Theme Name: Twenty Twenty +Text Domain: twentytwenty +Version: 1.2 +Requires at least: 4.7 +Requires PHP: 5.2.4 +Description: Our default theme for 2020 is designed to take full advantage of the flexibility of the block editor. Organizations and businesses have the ability to create dynamic landing pages with endless layouts using the group and column blocks. The centered content column and fine-tuned typography also makes it perfect for traditional blogs. Complete editor styles give you a good idea of what your content will look like, even before you publish. You can give your site a personal touch by changing the background colors and the accent color in the Customizer. The colors of all elements on your site are automatically calculated based on the colors you pick, ensuring a high, accessible color contrast for your visitors. +Tags: blog, one-column, custom-background, custom-colors, custom-logo, custom-menu, editor-style, featured-images, footer-widgets, full-width-template, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready, block-styles, wide-blocks, accessibility-ready +Author: the WordPress team +Author URI: https://wordpress.org/ +Theme URI: https://wordpress.org/themes/twentytwenty/ +License: GNU General Public License v2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html + +All files, unless otherwise stated, are released under the GNU General Public +License version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) + +This theme, like WordPress, is licensed under the GPL. +Use it to make something cool, have fun, and share what you've learned +with others. +*/ + +/*-------------------------------------------------------------- +>>> TABLE OF CONTENTS: +---------------------------------------------------------------- + + 0. CSS Reset + 1. Document Setup + 2. Element Base + 3. Helper Classes + 4. Site Header + 5. Menu Modal + 6. Search Modal + 7. Page Templates + a. Template: Cover Template + c. Template: Full Width + 8. Post: Archive + 9. Post: Single + 10. Blocks + 11. Entry Content + 12. Comments + 13. Site Pagination + 14. Error 404 + 15. Widgets + 16. Site Footer + 17. Media Queries + +----------------------------------------------------------------------------- */ + + +/* -------------------------------------------------------------------------- */ + +/* 0. CSS Reset +/* -------------------------------------------------------------------------- */ + + +html, +body { + border: none; + margin: 0; + padding: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +address, +big, +cite, +code, +em, +font, +img, +small, +strike, +sub, +sup, +li, +ol, +ul, +fieldset, +form, +label, +legend, +button, +table, +caption, +tr, +th, +td { + border: none; + font-size: inherit; + line-height: inherit; + margin: 0; + padding: 0; + text-align: inherit; +} + +blockquote::before, +blockquote::after { + content: ""; +} + + +/* -------------------------------------------------------------------------- */ + +/* 1. Document Setup +/* -------------------------------------------------------------------------- */ + + +html { + font-size: 62.5%; /* 1rem = 10px */ + scroll-behavior: smooth; +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } +} + +body { + background: #f5efe0; + box-sizing: border-box; + color: #000; + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + font-size: 1.8rem; + letter-spacing: -0.015em; + text-align: left; +} + +@supports ( font-variation-settings: normal ) { + + body { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + +*, +*::before, +*::after { + box-sizing: inherit; + -webkit-font-smoothing: antialiased; + word-break: break-word; + word-wrap: break-word; +} + +#site-content { + overflow: hidden; +} + + +/* Clearing ---------------------------------- */ + +.group::after, +.entry-content::after { + clear: both; + content: ""; + display: block; +} + + +/* Base Transitions -------------------------- */ + +a, +path { + transition: all 0.15s linear; +} + + +/* Screen Reader Text ------------------------ */ + +.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; + word-break: normal; +} + +.screen-reader-text:focus { + background-color: #f1f1f1; + border-radius: 3px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + -webkit-clip-path: none; + clip-path: none; + color: #21759b; + display: block; + font-size: 0.875rem; + font-weight: 700; + height: auto; + right: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; +} + + +/* Skip Link --------------------------------- */ + +.skip-link { + left: -9999rem; + top: 2.5rem; + z-index: 999999999; + text-decoration: underline; +} + +.skip-link:focus { + display: block; + left: 6px; + top: 7px; + font-size: 14px; + font-weight: 600; + text-decoration: none; + line-height: normal; + padding: 15px 23px 14px; + z-index: 100000; + right: auto; +} + + +/* Fonts ------------------------------------- */ + +/* + * Chrome renders extra-wide   characters for the Hoefler Text font. + * This results in a jumping cursor when typing in both the classic editor and + * block editor. The following font-face override fixes the issue by manually + * inserting a custom font that includes just a Hoefler Text space replacement + * for that character instead. + */ +@font-face { + font-family: NonBreakingSpaceOverride; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMoAA0AAAAACDQAAALTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACCahEICjx3CywAATYCJANUBCAFhiEHgWwbXQfILgpsY+rQRRARwyAs6uL7pxzYhxEE+32b3aeHmifR6tklkS9hiZA0ewkqGRJE+H7/+6378ASViK/PGeavqJyOzsceKi1s3BCiQsiOdn1r/RBgIJYEgCUhbm/8/8/h4saPssnTNkkiWUBrTRtjmQSajw3Ui3pZ3LYDPD+XG2C3JA/yKAS8/rU5eNfuGqRf4eNNgV4YAlIIgxglEkWe6FYpq10+wi3g+/nUgvgPFczNrz/RsTgVm/zfbPuHZlsuQECxuyqBcQwKFBjFgKO8AqP4bAN9tFJtnM9xPcbNjeXS/x1wY/xU52f5W/X1+9cnH4YwKIaoRRAkUkj/YlAAeF/624foiIDBgBmgQBeGAyhBljUPZUm/l2dTvmpqcBDUOHdbPZWd8JsBAsGr4w8/EDn82/bUPx4eh0YNrQTBuHO2FjQEAGBwK0DeI37DpQVqdERS4gZBhpeUhWCfLFz7J99aEBgsJCHvUGAdAPp4IADDCAPCEFMGpMZ9AQpTfQtQGhLbGVBZFV8BaqNyP68oTZgHNj3M8kBPfXTTC9t90UuzYhy9ciH0grVlOcqyCytisvbsERsEYztiznR0WCrmTksJwbSNK6fd1Rvr25I9oLvctUoEbNOmXJbqgYgPXEHJ82IUsrCnpkxh23F1rfZ2zcRnJYoXtauB3VTFkFXQg3uoZYD5qE0kdjDtoDoF1h2bulGmev5HbYhbrjtohQSRI4aNOkffIcT+d3v6atpaYh3JvPoQsztCcqvaBkppDSPcQ3bw3KaCBo1f5CJWTZEgW3LjLofYg51MaVezrx8xZitYbQ9KYeoRaqQdVLwSEfrKXLK1otCWOKNdR/YwYAfon5Yk8O2MJfSD10dPGA5PIJJQMkah0ugMJiv6x4Dm7LEa8xnrRGGGLAg4sAlbsA07sAt76DOsXKO3hIjtIlpnnFrt1qW4kh6NhS83P/6HB/fl1SMAAA==) format("woff2"), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUQAA0AAAAACDQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAE9AAAABwAAAAchf5yU0dERUYAAATYAAAAHAAAAB4AJwAbT1MvMgAAAaAAAABJAAAAYJAcgU5jbWFwAAACIAAAAF4AAAFqUUxBZ2dhc3AAAATQAAAACAAAAAgAAAAQZ2x5ZgAAApAAAAAyAAAAPL0n8y9oZWFkAAABMAAAADAAAAA2Fi93Z2hoZWEAAAFgAAAAHQAAACQOSgWaaG10eAAAAewAAAAzAAAAVC7TAQBsb2NhAAACgAAAABAAAAAsAOQBAm1heHAAAAGAAAAAHQAAACAAWQALbmFtZQAAAsQAAAF6AAADIYvD/Adwb3N0AAAEQAAAAI4AAADsapk2o3jaY2BkYGAA4ov5mwzj+W2+MnCzXwCKMNzgCBSB0LfbQDQ7AxuI4mBgAlEAFKQIRHjaY2BkYGD3+NvCwMDBAALsDAyMDKhAFAA3+wH3AAAAeNpjYGRgYBBl4GBgYgABEMnIABJzAPMZAAVmAGUAAAB42mNgZlJhnMDAysDCKsKygYGBYRqEZtrDYMT4D8gHSmEHjgUFOQwODAqqf9g9/rYwMLB7MNUAhRlBcsxBrMlASoGBEQAj8QtyAAAAeNrjYGBkAAGmWQwMjO8gmBnIZ2NA0ExAzNjAAFYJVn0ASBsD6VAIDZb7AtELAgANIgb9AHjaY2BgYGaAYBkGRgYQSAHyGMF8FgYPIM3HwMHAxMDGoMCwQIFLQV8hXvXP//9AcRCfAcb///h/ygPW+w/vb7olBjUHCTCyMcAFGZmABBO6AogThgZgIUsXAEDcEzcAAHjaY2BgECMCyoEgACZaAed42mNgYmRgYGBnYGNgYAZSDJqMgorCgoqCjECRXwwNrCAKSP5mAAFGBiRgyAAAi/YFBQAAeNqtkc1OwkAUhU/5M25cEhcsZick0AwlBJq6MWwgJkAgYV/KAA2lJeUn+hY+gktXvpKv4dLTMqKycGHsTZNv7px7z50ZAFd4hYHjdw1Ls4EiHjVncIFnzVnc4F1zDkWjrzmPW+NNcwGlzIRKI3fJlUyrEjZQxb3mDH2fNGfRx4vmHKqG0JzHg6E0F9DOlFBGBxUI1GEzLNT4S0aLuTtsGAEUuYcQHkyg3KmIum1bNUvKlrjbbAIleqHHnS4iSudpQcySMYtdFiXlAxzSbAwfMxK6kZoHKhbjjespMTioOPZnzI+4ucCeTVyKMVKLfeAS6vSWaTinuZwzyy/Dc7vaed+6KaV0kukdPUk6yOcctZPvvxxqksq2lEW8RvHjMEO2FCl/zy6p3NEm0R9OFSafJdldc4QVeyaaObMBO0/5cCaa6d9Ggyubxire+lEojscdjoWUR1xGOy8KD8mG2ZLO2l2paDc3A39qmU2z2W5YNv5+u79e6QfGJY/hAAB42m3NywrCMBQE0DupWp/1AYI7/6DEaLQu66Mrd35BKUWKJSlFv1+rue4cGM7shgR981qSon+ZNwUJ8iDgoYU2OvDRRQ99DDDECAHGmGCKmf80hZSx/Kik/LliFbtmN6xmt+yOjdg9GztV4tROnRwX/Bsaaw51nt4Lc7tWaZYHp/MlzKx51LZs5htNri+2AAAAAQAB//8AD3jaY2BkYGDgAWIxIGZiYARCESBmAfMYAAR6AEMAAAABAAAAANXtRbgAAAAA2AhRFAAAAADYCNuG) format("woff"); +} + +/* ---------------------------------------------- +Inter variable font. Usage: + +@supports (font-variation-settings: normal) { + html { font-family: 'Inter var', sans-serif; } +} +---------------------------------------------- */ + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: normal; + font-display: swap; + src: url(./assets/fonts/inter/Inter-upright-var.woff2) format("woff2"); +} + +@font-face { + font-family: "Inter var"; + font-weight: 100 900; /* stylelint-disable-line font-weight-notation */ + font-style: italic; + font-display: swap; + src: url(./assets/fonts/inter/Inter-italic-var.woff2) format("woff2"); +} + + +/* Accessibility Settings -------------------- */ + +@media ( prefers-reduced-motion: reduce ) { + + * { + animation-duration: 0s !important; + transition-duration: 0s !important; + } +} + + +/* -------------------------------------------------------------------------- */ + +/* 2. Element Base +/* ---------------------------------------------*---------------------------- */ + + +main { + display: block; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.faux-heading { + font-feature-settings: "lnum"; + font-variant-numeric: lining-nums; + font-weight: 700; + letter-spacing: -0.0415625em; + line-height: 1.25; + margin: 3.5rem 0 2rem; +} + +h1, +.heading-size-1 { + font-size: 3.6rem; + font-weight: 800; + line-height: 1.138888889; +} + +h2, +.heading-size-2 { + font-size: 3.2rem; +} + +h3, +.heading-size-3 { + font-size: 2.8rem; +} + +h4, +.heading-size-4 { + font-size: 2.4rem; +} + +h5, +.heading-size-5 { + font-size: 2.1rem; +} + +h6, +.heading-size-6 { + font-size: 1.6rem; + letter-spacing: 0.03125em; + text-transform: uppercase; +} + +p { + line-height: 1.5; + margin: 0 0 1em 0; +} + +em, +i, +q, +dfn { + font-style: italic; +} + +em em, +em i, +i em, +i i, +cite em, +cite i { + font-weight: bolder; +} + +big { + font-size: 1.2em; +} + +small { + font-size: 0.75em; +} + +b, +strong { + font-weight: 700; +} + +ins { + text-decoration: underline; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +abbr, +acronym { + cursor: help; +} + +address { + line-height: 1.5; + margin: 0 0 2rem 0; +} + +hr { + border-style: solid; + border-width: 0.1rem 0 0 0; + border-color: #dcd7ca; + margin: 4rem 0; +} + +.entry-content hr, +hr.styled-separator { + background: linear-gradient(to left, currentColor calc(50% - 16px), transparent calc(50% - 16px), transparent calc(50% + 16px), currentColor calc(50% + 16px)); + background-color: transparent !important; + border: none; + height: 0.1rem; + overflow: visible; + position: relative; +} + +.entry-content hr:not(.has-background), +hr.styled-separator { + color: #6d6d6d; +} + +.entry-content hr::before, +.entry-content hr::after, +hr.styled-separator::before, +hr.styled-separator::after { + background: currentColor; + content: ""; + display: block; + height: 1.6rem; + position: absolute; + top: calc(50% - 0.8rem); + transform: rotate(22.5deg); + width: 0.1rem; +} + +.entry-content hr::before, +hr.styled-separator::before { + left: calc(50% - 0.5rem); +} + +.entry-content hr::after, +hr.styled-separator::after { + right: calc(50% - 0.5rem); +} + +a { + color: #cd2653; + text-decoration: underline; +} + +a:hover, +a:focus { + text-decoration: none; +} + + +/* Lists ------------------------------------- */ + +ul, +ol { + margin: 0 0 3rem 3rem; +} + +ul { + list-style: disc; +} + +ul ul { + list-style: circle; +} + +ul ul ul { + list-style: square; +} + +ol { + list-style: decimal; +} + +ol ol { + list-style: lower-alpha; +} + +ol ol ol { + list-style: lower-roman; +} + +li { + line-height: 1.5; + margin: 0.5rem 0 0 2rem; +} + +li > ul, +li > ol { + margin: 1rem 0 0 2rem; +} + +.reset-list-style, +.reset-list-style ul, +.reset-list-style ol { + list-style: none; + margin: 0; +} + +.reset-list-style li { + margin: 0; +} + +dt, +dd { + line-height: 1.5; +} + +dt { + font-weight: 700; +} + +dt + dd { + margin-top: 0.5rem; +} + +dd + dt { + margin-top: 1.5rem; +} + + +/* Quotes ------------------------------------ */ + +blockquote { + border-color: #cd2653; + border-style: solid; + + /*rtl:ignore*/ + border-width: 0 0 0 0.2rem; + color: inherit; + font-size: 1em; + margin: 4rem 0; + + /*rtl:ignore*/ + padding: 0.5rem 0 0.5rem 2rem; +} + +cite { + color: #6d6d6d; + font-size: 1.4rem; + font-style: normal; + font-weight: 600; + line-height: 1.25; +} + +blockquote cite { + display: block; + margin: 2rem 0 0 0; +} + +blockquote p:last-child { + margin: 0; +} + + +/* Code -------------------------------------- */ + +code, +kbd, +pre, +samp { + font-family: monospace; + font-size: 0.9em; + padding: 0.4rem 0.6rem; +} + +code, +kbd, +samp { + background: rgba(0, 0, 0, 0.075); + border-radius: 0.2rem; +} + +pre { + border: 0.1rem solid #dcd7ca; + line-height: 1.5; + margin: 4rem 0; + overflow: auto; + padding: 3rem 2rem; + text-align: left; +} + +pre code { + background: transparent; + padding: 0; +} + + +/* Media ------------------------------------- */ + +figure { + display: block; + margin: 0; +} + +iframe { + display: block; + max-width: 100%; +} + +video { + display: block; +} + +svg, +img, +embed, +object { + display: block; + height: auto; + max-width: 100%; +} + +figcaption, +.wp-caption-text { + color: #6d6d6d; + display: block; + font-size: 1.5rem; + font-weight: 500; + line-height: 1.2; + margin-top: 1.5rem; +} + +figcaption a, +.wp-caption-text a { + color: inherit; +} + +blockquote.instagram-media, +iframe.instagram-media { + margin: auto !important; +} + + +/* GALLERIES */ + +.gallery { + display: flex; + flex-wrap: wrap; + margin: 3em 0 3em -0.8em; + width: calc(100% + 1.6em); +} + +.gallery-item { + margin: 0.8em 0; + padding: 0 0.8em; + width: 100%; +} + +.gallery-caption { + display: block; + margin-top: 0.8em; +} + + +/* Inputs ------------------------------------ */ + +fieldset { + border: 0.2rem solid #dcd7ca; + padding: 2rem; +} + +legend { + font-size: 0.85em; + font-weight: 700; + padding: 0 1rem; +} + +label { + display: block; + font-size: 1.6rem; + font-weight: 400; + margin: 0 0 0.5rem 0; +} + +label.inline, +input[type="checkbox"] + label { + display: inline; + font-weight: 400; + margin-left: 0.5rem; +} + +input[type="checkbox"] { + -webkit-appearance: none; + -moz-appearance: none; + position: relative; + top: 2px; + display: inline-block; + margin: 0; + width: 1.5rem; + min-width: 1.5rem; + height: 1.5rem; + background: #fff; + border-radius: 0; + border-style: solid; + border-width: 0.1rem; + border-color: #dcd7ca; + box-shadow: none; + cursor: pointer; +} + +input[type="checkbox"]:checked::before { + /* Use the "Yes" SVG Dashicon */ + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23000000%27%2F%3E%3C%2Fsvg%3E"); + position: absolute; + display: inline-block; + margin: -0.1875rem 0 0 -0.25rem; + height: 1.75rem; + width: 1.75rem; +} + +input, +textarea, +button, +.button, +.faux-button, +.wp-block-button__link, +.wp-block-file__button { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + line-height: 1; +} + +@supports ( font-variation-settings: normal ) { + + input, + textarea, + button, + .button, + .faux-button, + .faux-button.more-link, + .wp-block-button__link, + .wp-block-file__button { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + +input, +textarea { + border-color: #dcd7ca; + color: #000; +} + +code, +input[type="url"], +input[type="email"], +input[type="tel"] { + + /*rtl:ignore*/ + direction: ltr; +} + +input[type="text"], +input[type="password"], +input[type="email"], +input[type="url"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="week"], +input[type="number"], +input[type="search"], +input[type="tel"], +input[type="color"], +textarea { + -webkit-appearance: none; + -moz-appearance: none; + background: #fff; + border-radius: 0; + border-style: solid; + border-width: 0.1rem; + box-shadow: none; + display: block; + font-size: 1.6rem; + letter-spacing: -0.015em; + margin: 0; + max-width: 100%; + padding: 1.5rem 1.8rem; + width: 100%; +} + +select { + font-size: 1em; +} + +textarea { + height: 12rem; + line-height: 1.5; + width: 100%; +} + +input::-webkit-input-placeholder { + line-height: normal; +} + +input:-ms-input-placeholder { + line-height: normal; +} + +input::-moz-placeholder { + line-height: revert; /* Reset to the value from the user-agent stylesheet. */ +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { + display: none; +} + +button, +.button, +.faux-button, +.wp-block-button__link, +.wp-block-file .wp-block-file__button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: none; + -moz-appearance: none; + background: #cd2653; + border: none; + border-radius: 0; + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 1.5rem; + font-weight: 600; + letter-spacing: 0.0333em; + line-height: 1.25; + margin: 0; + opacity: 1; + padding: 1.1em 1.44em; + text-align: center; + text-decoration: none; + text-transform: uppercase; + transition: opacity 0.15s linear; +} + +button:focus, +button:hover, +.button:focus, +.button:hover, +.faux-button:focus, +.faux-button:hover, +.wp-block-button .wp-block-button__link:focus, +.wp-block-button .wp-block-button__link:hover, +.wp-block-file .wp-block-file__button:focus, +.wp-block-file .wp-block-file__button:hover, +input[type="button"]:focus, +input[type="button"]:hover, +input[type="reset"]:focus, +input[type="reset"]:hover, +input[type="submit"]:focus, +input[type="submit"]:hover { + text-decoration: underline; +} + +input[type="text"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="password"]: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 { + border-color: currentColor; +} + +input[type="search"]:focus { + outline: thin dotted; + outline-offset: -4px; +} + +/* Tables ------------------------------------ */ + +table { + border: 0.1rem solid #dcd7ca; + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + font-size: 1.6rem; + margin: 4rem 0; + max-width: 100%; + overflow: hidden; + width: 100%; +} + +.alignleft > table { + margin: 0; +} + +.alignright > table { + margin: 0; +} + +th, +td { + border: 0.1rem solid #dcd7ca; + line-height: 1.4; + margin: 0; + overflow: visible; + padding: 0.5em; +} + +caption { + background: #dcd7ca; + font-weight: 600; + padding: 0.5em; + text-align: center; +} + +thead { + vertical-align: bottom; + white-space: nowrap; +} + +th { + font-weight: 700; +} + + +/* -------------------------------------------------------------------------- */ + +/* 3. Helper Classes +/* -------------------------------------------------------------------------- */ + + +/* Layout ------------------------------------ */ + +.no-margin { + margin: 0; +} + +.no-padding { + padding: 0; +} + +.screen-height { + min-height: 100vh; +} + +.admin-bar .screen-height { + min-height: calc(100vh - 32px); +} + +@media (max-width: 782px) { + + .admin-bar .screen-height { + min-height: calc(100vh - 46px); + } +} + +.screen-width { + position: relative; + left: calc(50% - 50vw); + width: 100vw; +} + +/* Sections ---------------------------------- */ + +section { + padding: 5rem 0; + width: 100%; +} + +.section-inner { + margin-left: auto; + margin-right: auto; + max-width: 120rem; + width: calc(100% - 4rem); +} + +.section-inner.max-percentage { + width: 100%; +} + +.section-inner.thin { + max-width: 58rem; +} + +.section-inner.small { + max-width: 80rem; +} + +.section-inner.medium { + max-width: 100rem; +} + +.section-inner.no-margin { + margin: 0; +} + + +/* Toggles ----------------------------------- */ + +.toggle { + -moz-appearance: none; + -webkit-appearance: none; + color: inherit; + cursor: pointer; + font-family: inherit; + position: relative; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + text-align: inherit; + user-select: none; +} + +button.toggle { + background: none; + border: none; + box-shadow: none; + border-radius: 0; + font-size: inherit; + font-weight: 400; + letter-spacing: inherit; + padding: 0; + text-transform: none; +} + +/* Hiding and Showing ------------------------ */ + +.js .show-js { + display: block !important; +} + +.js .hide-js { + display: none !important; +} + +.no-js .show-no-js { + display: block !important; +} + +.no-js .hide-no-js { + display: none !important; +} + + +/* Typography -------------------------------- */ + +.font-size-xl { + font-size: 1.25em; +} + +.font-size-xs { + font-size: 0.8em; +} + +.no-select { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + + +/* Colors ------------------------------------ */ + +/* COLOR */ + +.color-accent, +.color-accent-hover:focus, +.color-accent-hover:hover { + color: #cd2653; +} + +/* BACKGROUND COLOR */ + +.bg-accent, +.bg-accent-hover:focus, +.bg-accent-hover:hover { + background-color: #cd2653; +} + +/* BORDER COLOR */ + +.border-color-accent, +.border-color-accent-hover:focus, +.border-color-accent-hover:hover { + border-color: #cd2653; +} + +/* FILL COLOR */ + +.fill-children-accent, +.fill-children-accent * { + fill: #cd2653; +} + +.fill-children-current-color, +.fill-children-current-color * { + fill: currentColor; +} + + +/* Opacity ----------------------------------- */ + +.opacity-0 { + opacity: 0; +} + +.opacity-5 { + opacity: 0.05; +} + +.opacity-10 { + opacity: 0.1; +} + +.opacity-15 { + opacity: 0.15; +} + +.opacity-20 { + opacity: 0.2; +} + +.opacity-25 { + opacity: 0.25; +} + +.opacity-30 { + opacity: 0.3; +} + +.opacity-35 { + opacity: 0.35; +} + +.opacity-40 { + opacity: 0.4; +} + +.opacity-45 { + opacity: 0.45; +} + +.opacity-50 { + opacity: 0.5; +} + +.opacity-55 { + opacity: 0.55; +} + +.opacity-60 { + opacity: 0.6; +} + +.opacity-65 { + opacity: 0.65; +} + +.opacity-70 { + opacity: 0.7; +} + +.opacity-75 { + opacity: 0.75; +} + +.opacity-80 { + opacity: 0.8; +} + +.opacity-85 { + opacity: 0.85; +} + +.opacity-90 { + opacity: 0.9; +} + +.blend-mode-exclusion { + mix-blend-mode: exclusion; +} + +.blend-mode-hue { + mix-blend-mode: hue; +} + +.blend-mode-saturation { + mix-blend-mode: saturation; +} + +.blend-mode-color { + mix-blend-mode: color; +} + +.blend-mode-luminosity { + mix-blend-mode: luminosity; +} + + +/* Image Classes ----------------------------- */ + +.bg-image { + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} + +.bg-attachment-fixed { + background-attachment: fixed; +} + +@supports ( -webkit-overflow-scrolling: touch ) { + + .bg-attachment-fixed { + background-attachment: scroll; + } +} + +@media ( prefers-reduced-motion: reduce ) { + + .bg-attachment-fixed { + background-attachment: scroll; + } +} + +.wp-block-image.is-resized { + margin-left: auto; + margin-right: auto; +} + +/* Search Form ------------------------------- */ + +.search-form { + align-items: stretch; + display: flex; + flex-wrap: nowrap; + margin: 0 0 -0.8rem -0.8rem; +} + +.search-form .search-field, +.search-form .search-submit { + margin: 0 0 0.8rem 0.8rem; +} + +.search-form label { + align-items: stretch; + display: flex; + font-size: inherit; + margin: 0; + width: 100%; +} + +.search-form .search-field { + width: 100%; +} + +.search-form .search-submit { + flex-shrink: 0; +} + +.search-form .search-submit:focus, +.search-form .search-submit:hover { + text-decoration: none; +} + + +/* Social Icons ------------------------------ */ + +ul.social-icons { + display: flex; + flex-wrap: wrap; + margin: -0.9rem 0 0 -0.9rem; + width: calc(100% + 0.9rem); +} + +ul.social-icons li { + margin: 0.9rem 0 0 0.9rem; +} + +.social-icons a { + align-items: center; + background: #cd2653; + border-radius: 50%; + color: #fff; + display: flex; + height: 4.4rem; + justify-content: center; + padding: 0; + text-decoration: none; + transition: transform 0.15s ease-in-out; + width: 4.4rem; +} + +.social-icons a:focus, +.social-icons a:hover { + transform: scale(1.1); + text-decoration: none; +} + + +/* Cover Modals ------------------------------ */ + +.cover-modal { + display: none; + -ms-overflow-style: none; + overflow: -moz-scrollbars-none; +} + +.cover-modal::-webkit-scrollbar { + display: none !important; +} + +.cover-modal.show-modal { + display: block; + cursor: pointer; +} + +.cover-modal.show-modal > * { + cursor: default; +} + + +/* -------------------------------------------------------------------------- */ + +/* 4. Site Header +/* -------------------------------------------------------------------------- */ + + +#site-header { + background: #fff; + position: relative; +} + +.header-inner { + max-width: 168rem; + padding: 3.15rem 0; + z-index: 100; +} + +/* Header Titles ----------------------------- */ + +.header-titles-wrapper { + align-items: center; + display: flex; + justify-content: center; + padding: 0 4rem; + text-align: center; +} + +body:not(.enable-search-modal) .header-titles-wrapper { + justify-content: flex-start; + padding-left: 0; + text-align: left; +} + +.site-title, +.site-logo, +.site-description { + margin: 0; +} + +.site-title { + font-size: 2.1rem; + font-weight: 600; + line-height: 1; +} + +.site-title a { + color: inherit; + display: block; + text-decoration: none; +} + +.site-title a:hover, +.site-title a:focus { + text-decoration: underline; +} + +.site-description { + margin-top: 1rem; + color: #6d6d6d; + font-size: 1.8rem; + font-weight: 500; + display: none; + letter-spacing: -0.0311em; + transition: all 0.15s linear; +} + +.site-logo a, +.site-logo img { + display: block; +} + +.header-titles .site-logo .site-logo { + margin: 0; +} + +.site-logo img { + max-height: 6rem; + margin: 0 auto; + width: auto; +} + +body:not(.enable-search-modal) .site-logo img { + margin: 0; +} + +/* Overlay Header ---------------------------- */ + +.overlay-header #site-header { + background: transparent; + margin: 0; + position: absolute; + left: 0; + right: 0; + top: 0; + z-index: 2; +} + +.overlay-header .header-inner { + color: #fff; +} + +.overlay-header .site-description, +.overlay-header .toggle { + color: inherit; +} + +.overlay-header .header-inner .toggle-wrapper::before { + background-color: currentColor; + opacity: 0.25; +} + +.admin-bar.overlay-header #site-header { + top: 32px; +} + +@media (max-width: 782px) { + + .admin-bar.overlay-header #site-header { + top: 46px; + } +} + +/* Header Navigation ------------------------- */ + +.header-navigation-wrapper { + display: none; +} + +/* Header Toggles ---------------------------- */ + +.header-toggles { + display: none; +} + +.header-inner .toggle { + align-items: center; + display: flex; + overflow: visible; + padding: 0 2rem; +} + +.header-inner .toggle svg { + display: block; + position: relative; + z-index: 1; +} + +.header-inner .toggle path { + fill: currentColor; +} + +.toggle-inner { + display: flex; + justify-content: center; + height: 2.3rem; + position: relative; +} + +.toggle-icon { + display: block; + overflow: hidden; +} + +.toggle-inner .toggle-text { + color: #6d6d6d; + font-size: 1rem; + font-weight: 600; + position: absolute; + top: calc(100% + 0.5rem); + width: auto; + white-space: nowrap; + word-break: break-all; +} + +.overlay-header .toggle-text { + color: inherit; +} + +.header-inner .toggle:focus .toggle-text, +.header-inner .toggle:hover .toggle-text { + text-decoration: underline; +} + +/* Search Toggle ----------------------------- */ + +.search-toggle { + position: absolute; + bottom: 0; + left: 0; + top: 0; +} + +.search-toggle .toggle-icon, +.search-toggle svg { + height: 2.5rem; + max-width: 2.3rem; + width: 2.3rem; +} + +/* Navigation Toggle ------------------------- */ + +.nav-toggle { + position: absolute; + bottom: 0; + right: 0; + top: 0; + width: 6.6rem; +} + +.nav-toggle .toggle-icon, +.nav-toggle svg { + height: 0.8rem; + width: 2.6rem; +} + +.nav-toggle .toggle-inner { + padding-top: 0.8rem; +} + +/* Primary Menu ---------------------------- */ + +.primary-menu-wrapper { + display: none; +} + +ul.primary-menu { + display: flex; + font-size: 1.8rem; + font-weight: 500; + letter-spacing: -0.0277em; + flex-wrap: wrap; + justify-content: flex-end; + margin: -0.8rem 0 0 -1.6rem; +} + +.primary-menu .icon { + display: block; + height: 0.7rem; + position: absolute; + pointer-events: none; + transform: rotate(-45deg); + width: 1.3rem; +} + +.primary-menu .icon::before, +.primary-menu .icon::after { + content: ""; + display: block; + background-color: currentColor; + position: absolute; + bottom: calc(50% - 0.1rem); + left: 0; +} + +.primary-menu .icon::before { + height: 0.9rem; + width: 0.2rem; +} + +.primary-menu .icon::after { + height: 0.2rem; + width: 0.9rem; +} + +.primary-menu li { + font-size: inherit; + line-height: 1.25; + position: relative; +} + +.primary-menu > li { + margin: 0.8rem 0 0 1.6rem; +} + +.primary-menu > li.menu-item-has-children > a { + padding-right: 2rem; +} + +.primary-menu > li > .icon { + right: -0.5rem; + top: calc(50% - 0.4rem); +} + +.primary-menu a { + color: inherit; + display: block; + line-height: 1.2; + text-decoration: none; + word-break: normal; + word-wrap: normal; +} + +.primary-menu a:hover, +.primary-menu a:focus, +.primary-menu .current_page_ancestor { + text-decoration: underline; +} + +.primary-menu li.current-menu-item > a, +.primary-menu li.current-menu-item > .link-icon-wrapper > a { + text-decoration: underline; +} + +.primary-menu li.current-menu-item > a:hover, +.primary-menu li.current-menu-item > .link-icon-wrapper > a:hover, +.primary-menu li.current-menu-item > a:focus, +.primary-menu li.current-menu-item > .link-icon-wrapper > a:focus { + text-decoration: none; +} + +/* SUB MENU */ + +.primary-menu ul { + background: #000; + border-radius: 0.4rem; + color: #fff; + font-size: 1.7rem; + opacity: 0; + padding: 1rem 0; + position: absolute; + right: 9999rem; + top: calc(100% + 2rem); + transition: opacity 0.15s linear, transform 0.15s linear, right 0s 0.15s; + transform: translateY(0.6rem); + width: 20rem; + z-index: 1; +} + +.primary-menu li.menu-item-has-children:hover > ul, +.primary-menu li.menu-item-has-children:focus > ul, +.primary-menu li.menu-item-has-children.focus > ul { + right: 0; + opacity: 1; + transform: translateY(0); + transition: opacity 0.15s linear, transform 0.15s linear; +} + +.primary-menu ul::before, +.primary-menu ul::after { + content: ""; + display: block; + position: absolute; + bottom: 100%; +} + +.primary-menu ul::before { + height: 2rem; + left: 0; + right: 0; +} + +.primary-menu ul::after { + border: 0.8rem solid transparent; + border-bottom-color: #000; + right: 1.8rem; +} + +.primary-menu ul a { + background: transparent; + border: none; + color: inherit; + display: block; + padding: 1rem 2rem; + transition: background-color 0.15s linear; + width: 100%; +} + +.primary-menu ul li.menu-item-has-children > a { + padding-right: 4.5rem; +} + +.primary-menu ul li.menu-item-has-children .icon { + position: absolute; + right: 1.5rem; + top: calc(50% - 0.5rem); +} + +/* DEEP DOWN */ + +.primary-menu ul ul { + top: -1rem; +} + +.primary-menu ul li.menu-item-has-children:hover > ul, +.primary-menu ul li.menu-item-has-children:focus > ul, +.primary-menu ul li.menu-item-has-children.focus > ul { + right: calc(100% + 2rem); +} + +.primary-menu ul ul::before { + bottom: 0; + height: auto; + left: auto; + right: -2rem; + top: 0; + width: 2rem; +} + +.primary-menu ul ul::after { + border-bottom-color: transparent; + + /*rtl:ignore*/ + border-left-color: #000; + bottom: auto; + right: -1.6rem; + top: 2rem; +} + +.rtl .primary-menu ul ul::after { + transform: rotate(180deg); +} + +/* + * Enable nav submenu expansion with tapping on arrows on large-viewport + * touch interfaces (e.g. tablets or laptops with touch screens). + * These rules are supported by all browsers (>IE11) and when JS is disabled. + */ +@media (any-pointer: coarse) { + + .primary-menu > li.menu-item-has-children > a { + padding-right: 0; + margin-right: 2rem; + } + + .primary-menu ul li.menu-item-has-children > a { + margin-right: 4.5rem; + padding-right: 0; + width: unset; + } + +} + +/* Repeat previous rules for IE11 (when JS enabled for polyfill). */ +body.touch-enabled .primary-menu > li.menu-item-has-children > a { + padding-right: 0; + margin-right: 2rem; +} + +body.touch-enabled .primary-menu ul li.menu-item-has-children > a { + margin-right: 4.5rem; + padding-right: 0; + width: unset; +} + +/* -------------------------------------------------------------------------- */ + +/* 5. Menu Modal +/* -------------------------------------------------------------------------- */ + + +.menu-modal { + background: #fff; + display: none; + opacity: 0; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + bottom: 0; + left: -99999rem; + right: 99999rem; + top: 0; + transition: opacity 0.25s ease-in, left 0s 0.25s, right 0s 0.25s; + z-index: 99; +} + +.admin-bar .menu-modal { + top: 32px; +} + +@media (max-width: 782px) { + + .admin-bar .menu-modal { + top: 46px; + } +} + +.menu-modal.show-modal { + display: flex; +} + +.menu-modal.active { + left: 0; + opacity: 1; + right: 0; + transition: opacity 0.25s ease-out; +} + +.menu-modal-inner { + background: #fff; + display: flex; + justify-content: stretch; + overflow: auto; + -ms-overflow-style: auto; + width: 100%; +} + +.menu-wrapper { + display: flex; + flex-direction: column; + justify-content: space-between; + position: relative; +} + +button.close-nav-toggle { + align-items: center; + display: flex; + font-size: 1.6rem; + font-weight: 500; + justify-content: flex-end; + padding: 3.1rem 0; + width: 100%; +} + +button.close-nav-toggle svg { + height: 1.6rem; + width: 1.6rem; +} + +button.close-nav-toggle .toggle-text { + margin-right: 1.6rem; +} + +.menu-modal .menu-top { + flex-shrink: 0; +} + + +/* Main Menu --------------------------------- */ + +.modal-menu { + position: relative; + left: calc(50% - 50vw); + width: 100vw; +} + +.modal-menu li { + border-color: #dedfdf; + border-style: solid; + border-width: 0.1rem 0 0 0; + display: flex; + flex-wrap: wrap; + line-height: 1; + justify-content: flex-start; + margin: 0; +} + +.modal-menu > li > a, +.modal-menu > li > .ancestor-wrapper > a { + font-size: 2rem; + font-weight: 700; + letter-spacing: -0.0375em; +} + +.modal-menu > li:last-child { + border-bottom-width: 0.1rem; +} + +.modal-menu .ancestor-wrapper { + display: flex; + justify-content: space-between; + width: 100%; +} + +.modal-menu a { + display: block; + padding: 2rem 2.5rem; + text-decoration: none; + width: 100%; +} + +.modal-menu a:focus, +.modal-menu a:hover, +.modal-menu li.current-menu-item > .ancestor-wrapper > a, +.modal-menu li.current_page_ancestor > .ancestor-wrapper > a { + text-decoration: underline; +} + +button.sub-menu-toggle { + border-left: 0.1rem solid #dedfdf; + flex-shrink: 0; + margin: 1rem 0; + padding: 0 2.5rem; +} + +button.sub-menu-toggle svg { + height: 0.9rem; + transition: transform 0.15s linear; + width: 1.5rem; +} + +button.sub-menu-toggle.active svg { + transform: rotate(180deg); +} + +.modal-menu ul { + display: none; + margin: 0; + width: 100%; +} + +.modal-menu ul li { + border-left-width: 1rem; +} + +.modal-menu ul li a { + color: inherit; + font-weight: 500; +} + +/* Main menu animation ----------------------- */ + +.menu-wrapper .menu-item { + position: relative; +} + +.menu-wrapper .active { + display: block; +} + +.menu-wrapper.is-toggling { + pointer-events: none; +} + +.menu-wrapper.is-toggling .menu-item { + position: absolute; + top: 0; + left: 0; + margin: 0; + width: 100%; +} + +.menu-wrapper.is-toggling .menu-bottom .social-menu .menu-item { + width: auto; +} + +.menu-wrapper.is-animating .menu-item, +.menu-wrapper.is-animating .toggling-target { + transition-duration: 250ms; +} + +.menu-wrapper.is-animating .menu-item { + transition-property: transform; +} + +.menu-wrapper.is-toggling .toggling-target { + display: block; + position: absolute; + top: 0; + left: 0; + opacity: 1; +} + +.menu-wrapper.is-toggling .toggling-target.active { + opacity: 0; +} + +.menu-wrapper.is-animating.is-toggling .toggling-target { + display: block; + transition-property: opacity; + opacity: 0; +} + +.menu-wrapper.is-animating.is-toggling .toggling-target.active { + opacity: 1; +} + +.menu-wrapper.is-toggling .modal-menu > li:last-child li { + border-top-color: transparent; + border-bottom-width: 0.1rem; +} + +@media (prefers-reduced-motion: reduce) { + + .menu-wrapper.is-animating .menu-item, + .menu-wrapper.is-animating .toggling-target { + transition-duration: 1ms !important; + } + +} + + +/* Expanded Menu ----------------------------- */ + +.expanded-menu { + display: none; +} + +.mobile-menu { + display: block; +} + + +/* Menu Bottom ------------------------------- */ + +.menu-bottom { + flex-shrink: 0; + padding: 4rem 0; +} + +.menu-bottom nav { + width: 100%; +} + +.menu-copyright { + display: none; + font-size: 1.6rem; + font-weight: 500; + margin: 0; +} + +.menu-copyright a:focus, +.menu-copyright a:hover { + text-decoration: underline; +} + +.menu-bottom .social-menu { + justify-content: center; +} + + +/* -------------------------------------------------------------------------- */ + +/* 6. Search Modal +/* -------------------------------------------------------------------------- */ + + +.search-modal { + background: rgba(0, 0, 0, 0.2); + display: none; + opacity: 0; + position: fixed; + bottom: 0; + left: -9999rem; + top: 0; + transition: opacity 0.2s linear, left 0s 0.2s linear; + width: 100%; + z-index: 999; +} + +.admin-bar .search-modal.active { + top: 32px; +} + +@media (max-width: 782px) { + + .admin-bar .search-modal.active { + top: 46px; + } +} + +.search-modal-inner { + background: #fff; + transform: translateY(-100%); + transition: transform 0.15s linear, box-shadow 0.15s linear; +} + +.search-modal-inner .section-inner { + display: flex; + justify-content: space-between; + max-width: 168rem; +} + +.search-modal.active { + left: 0; + opacity: 1; + transition: opacity 0.2s linear; +} + +.search-modal.active .search-modal-inner { + box-shadow: 0 0 2rem 0 rgba(0, 0, 0, 0.08); + transform: translateY(0); + transition: transform 0.25s ease-in-out, box-shadow 0.1s 0.25s linear; +} + +button.search-untoggle { + align-items: center; + display: flex; + flex-shrink: 0; + justify-content: center; + margin-right: -2.5rem; + padding: 0 2.5rem; +} + +.search-modal button.search-untoggle { + color: inherit; +} + +.search-modal.active .search-untoggle { + animation: popIn both 0.3s 0.2s; +} + +.search-untoggle svg { + height: 1.5rem; + transition: transform 0.15s ease-in-out; + width: 1.5rem; +} + +.search-untoggle:focus svg, +.search-untoggle:hover svg { + transform: scale(1.15); +} + + +/* Modal Search Form ------------------------- */ + +.search-modal form { + margin: 0; + position: relative; + width: 100%; +} + +.search-modal .search-field { + background: none; + border: none; + border-radius: 0; + color: inherit; + font-size: 2rem; + letter-spacing: -0.0277em; + height: 8.4rem; + margin: 0 0 0 -2rem; + max-width: calc(100% + 2rem); + padding: 0 0 0 2rem; + width: calc(100% + 2rem); +} + +.search-modal .search-field::-webkit-input-placeholder { + color: inherit; +} + +.search-modal .search-field:-ms-input-placeholder { + color: inherit; +} + +.search-modal .search-field::-moz-placeholder { + color: inherit; + line-height: 4; +} + +.search-modal .search-submit { + position: absolute; + right: -9999rem; + top: 50%; + transform: translateY(-50%); +} + +.search-modal .search-submit:focus { + right: 0; +} + + +/* -------------------------------------------------------------------------- */ + +/* 7a. Template: Cover Template +/* -------------------------------------------------------------------------- */ + + +.cover-header { + display: flex; + overflow: hidden; +} + +.cover-header-inner-wrapper { + display: flex; + position: relative; + flex-direction: column; + justify-content: flex-end; + width: 100%; +} + +.cover-header-inner { + padding: 10rem 0 5rem 0; + width: 100%; +} + +.cover-color-overlay, +.cover-color-overlay::before { + position: absolute; + bottom: 0; + left: 0; + right: 0; + top: 0; +} + +.cover-color-overlay::before { + background: currentColor; + content: ""; + display: block; +} + +.cover-header .entry-header { + position: relative; + width: 100%; + z-index: 1; +} + +.cover-header .entry-header * { + color: #fff; +} + +body.template-cover .entry-header { + background: transparent; + padding: 0; +} + +.cover-header h1, +.cover-header h2, +.cover-header h3, +.cover-header h4, +.cover-header h5, +.cover-header h6, +.cover-header .faux-heading { + color: inherit; +} + +.cover-header .entry-header a { + color: inherit; +} + +/* To The Content ---------------------------- */ + +.to-the-content-wrapper { + position: absolute; + left: 0; + right: 0; + top: calc(100% + 0.5rem); +} + +.to-the-content { + align-items: center; + display: flex; + justify-content: center; + height: 4rem; + text-decoration: none; +} + +.to-the-content svg { + height: 2rem; + transition: transform 0.15s linear; + transform: translateY(0); + width: 1.767rem; +} + +.to-the-content:focus svg, +.to-the-content:hover svg { + transform: translateY(20%); +} + + +/* -------------------------------------------------------------------------- */ + +/* 7c. Template: Full Width +/* -------------------------------------------------------------------------- */ + + +body.template-full-width .entry-content > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide), +body.template-full-width [class*="__inner-container"] > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + max-width: 120rem; +} + +body.template-full-width .entry-content .alignleft, +body.template-full-width .entry-content .alignright { + position: static; +} + +body.template-full-width .entry-content .alignleft, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > .alignleft, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > p .alignleft, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-left: 0; + position: static; +} + +body.template-full-width .entry-content > .alignleft, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignleft, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignleft, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-left: 2rem; + position: static; +} + +body.template-full-width .entry-content .alignright, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > .alignright, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > p .alignright, +body.template-full-width [class*="wp-block"].alignwide [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-right: 0; + position: static; +} + +body.template-full-width .entry-content > .alignright, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignright, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignright, +body.template-full-width [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-right: 2rem; + position: static; +} + + +/* -------------------------------------------------------------------------- */ + +/* 8. Post: Archive +/* -------------------------------------------------------------------------- */ + + +/* Archive Header ---------------------------- */ + +.archive-header { + background-color: #fff; + padding: 4rem 0; +} + +.reduced-spacing .archive-header { + padding-bottom: 2rem; +} + +.archive-title { + font-size: 2.4rem; + font-weight: 700; + letter-spacing: -0.026666667em; + margin: 0; +} + +.archive-subtitle p:last-child { + margin-bottom: 0; +} + + +/* Posts ------------------------------------- */ + +body:not(.singular) main > article:first-of-type { + padding: 4rem 0 0; +} + + +/* Search Results ---------------------------- */ + +.no-search-results-form { + padding-top: 5rem; +} + + +/* -------------------------------------------------------------------------- */ + +/* 9. Post: Single +/* -------------------------------------------------------------------------- */ + + +/* Post Header ------------------------------- */ + +.singular .entry-header { + background-color: #fff; + padding: 4rem 0; +} + +.entry-categories { + line-height: 1.25; + margin-bottom: 2rem; +} + +.entry-categories-inner { + justify-content: center; + display: flex; + flex-wrap: wrap; + margin: -0.5rem 0 0 -1rem; +} + +.entry-categories a { + border-bottom: 0.15rem solid currentColor; + font-size: 1.4rem; + font-weight: 700; + letter-spacing: 0.036666667em; + margin: 0.5rem 0 0 1rem; + text-decoration: none; + text-transform: uppercase; +} + +.entry-categories a:focus, +.entry-categories a:hover { + border-bottom-color: transparent; +} + +h1.entry-title, +h2.entry-title { + margin: 0; +} + +.entry-title a { + color: inherit; + text-decoration: none; +} + +.entry-title a:focus, +.entry-title a:hover { + text-decoration: underline; +} + +.intro-text { + margin-top: 2rem; +} + +.singular .intro-text { + font-size: 2rem; + letter-spacing: -0.0315em; + line-height: 1.4; +} + +/* POST META */ + +.post-meta-single-top .post-meta { + justify-content: center; +} + +.post-meta-wrapper { + margin-top: 2rem; + margin-right: auto; + margin-left: auto; + max-width: 58rem; + width: 100%; +} + +.post-meta { + color: #6d6d6d; + display: flex; + flex-wrap: wrap; + font-size: 1.5rem; + font-weight: 500; + list-style: none; + margin: -1rem 0 0 -2rem; +} + +.post-meta li { + flex-shrink: 0; + letter-spacing: -0.016875em; + margin: 1rem 0 0 2rem; + max-width: calc(100% - 2rem); +} + +.post-meta a { + color: inherit; + text-decoration: none; +} + +.post-meta a:focus, +.post-meta a:hover { + text-decoration: underline; +} + +.post-meta .meta-wrapper { + align-items: center; + display: flex; + flex-wrap: nowrap; +} + +.post-meta .meta-icon { + flex-shrink: 0; + margin-right: 1rem; +} + +.sticky .post-sticky { + color: inherit; +} + +.post-meta .post-author .meta-icon svg { + width: 1.6rem; + height: 1.8rem; +} + +.post-meta .post-categories .meta-icon svg { + width: 1.8rem; + height: 1.7rem; +} + +.post-meta .post-comment-link .meta-icon svg { + width: 1.8rem; + height: 1.8rem; +} + +.post-meta .post-date .meta-icon svg { + width: 1.7rem; + height: 1.8rem; +} + +.post-meta .post-edit .meta-icon svg { + width: 1.8rem; + height: 1.8rem; +} + +.post-meta .post-sticky .meta-icon svg { + width: 1.5rem; + height: 1.8rem; +} + +.post-meta .post-tags .meta-icon svg { + width: 1.8rem; + height: 1.8rem; +} + +.post-meta svg * { + fill: currentColor; +} + + +/* Featured Media ---------------------------- */ + +.featured-media { + margin-top: 5rem; + position: relative; +} + +.singular .featured-media { + margin-top: 0; +} + +.singular .featured-media-inner { + position: relative; + left: calc(50% - 50vw); + width: 100vw; +} + +.singular .featured-media::before { + background: #fff; + content: ""; + display: block; + position: absolute; + bottom: 50%; + left: 0; + right: 0; + top: 0; +} + +.featured-media img { + margin: 0 auto; +} + +.featured-media figcaption { + margin: 1.5rem auto 0 auto; + text-align: center; + width: calc(100% - 5rem); +} + +.post-inner { + padding-top: 5rem; +} + +.reduced-spacing.missing-post-thumbnail .post-inner { + padding-top: 0; +} + + +/* Post Footer ------------------------------- */ + +/* POST NAV LINKS */ + +.post-nav-links { + border-radius: 0.4rem; + display: flex; + font-size: 0.9em; + font-weight: 600; + line-height: 1; + margin: 3em auto 0 auto; + padding: 0; + width: calc(100% - 4rem); + max-width: 58rem; +} + +.post-nav-links > span.label { + padding: 1em 0; +} + +.post-nav-links > * { + padding: 1em 0.75em; +} + +/* POST META BOTTOM */ + +.post-meta-wrapper.post-meta-single-bottom { + margin-top: 3rem; +} + + +/* Author Bio -------------------------------- */ + +.author-bio { + margin-top: 4rem; + margin-right: auto; + margin-left: auto; + max-width: 58rem; + width: 100%; +} + +.hide-avatars .author-bio { + padding-left: 0; +} + +.author-bio .author-title-wrapper { + align-items: center; + display: flex; + margin: 0 0 1rem 0; +} + +.author-bio .avatar { + border-radius: 50%; + margin-right: 1.5rem; + height: 5rem; + width: 5rem; +} + +.hide-avatars img.avatar { + display: none; +} + +.author-bio p:last-child { + margin-bottom: 0; +} + +.author-bio .author-title { + margin: 0; +} + +.author-bio .author-link { + display: block; + font-size: 1.6rem; + font-weight: 600; + margin-top: 1em; + text-decoration: none; +} + +.author-bio .author-link:focus, +.author-bio .author-link:hover { + text-decoration: underline; +} + + +/* Single Pagination ------------------------- */ + +.pagination-single { + font-size: 1.8rem; + margin-top: 5rem; +} + +.pagination-single-inner { + display: flex; + flex-direction: column; +} + +.pagination-single hr:first-child { + margin: 0 0 2.8rem 0; +} + +.pagination-single hr:last-child { + margin: 2.8rem 0 0.8rem 0; +} + +.pagination-single a { + align-items: baseline; + display: flex; + font-weight: 600; + letter-spacing: -0.0275em; + text-decoration: none; + flex: 1; +} + +.pagination-single a + a { + margin-top: 1rem; +} + +.pagination-single a .arrow { + margin-right: 1rem; +} + +.pagination-single a:focus .title, +.pagination-single a:hover .title { + text-decoration: underline; +} + + +/* -------------------------------------------------------------------------- */ + +/* 10. Blocks +/* -------------------------------------------------------------------------- */ + + +/* Block Colors ------------------------------ */ + +.has-text-color a { + color: inherit; +} + +/* CUSTOM COLORS */ + +:root .has-accent-color { + color: #cd2653; +} + +:root .has-accent-background-color { + background-color: #cd2653; + color: #fff; +} + +:root .has-primary-color { + color: #000; +} + +:root .has-primary-background-color { + background-color: #000; + color: #f5efe0; +} + +:root .has-secondary-color { + color: #6d6d6d; +} + +:root .has-secondary-background-color { + background-color: #6d6d6d; + color: #fff; +} + +:root .has-subtle-background-color { + color: #dcd7ca; +} + +:root .has-subtle-background-background-color { + background-color: #dcd7ca; + color: #000; +} + +:root .has-background-color { + color: #f5efe0; +} + +:root .has-background-background-color { + background-color: #f5efe0; + color: #000; +} + + +/* Block Typography Classes ------------------ */ + +.has-text-align-left { + + /*rtl:ignore*/ + text-align: left; +} + +.has-text-align-center { + text-align: center; +} + +.has-text-align-right { + text-align: right; +} + +.has-drop-cap:not(:focus)::first-letter { + color: #cd2653; + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + font-size: 5.1em; + font-weight: 800; + margin: 0.05em 0.1em 0 0; +} + +.has-drop-cap:not(:focus)::first-letter::after { + content: ""; + display: table; + clear: both; +} + +.has-drop-cap:not(:focus)::after { + padding: 0; +} + + +/* Block Font Families ----------------------- */ + +.has-drop-cap:not(:focus)::first-letter, +.entry-content .wp-block-archives, +.entry-content .wp-block-categories, +.entry-content .wp-block-cover-image, +.entry-content .wp-block-latest-comments, +.entry-content .wp-block-latest-posts, +.entry-content .wp-block-pullquote, +.entry-content .wp-block-quote.is-large, +.entry-content .wp-block-quote.is-style-large { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + .has-drop-cap:not(:focus)::first-letter, + .entry-content .wp-block-archives, + .entry-content .wp-block-categories, + .entry-content .wp-block-latest-posts, + .entry-content .wp-block-latest-comments, + .entry-content .wp-block-cover-image p, + .entry-content .wp-block-pullquote { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + +/* Block Font Sizes -------------------------- */ + +.entry-content .has-small-font-size { + font-size: 0.842em; +} + +.entry-content .has-normal-font-size, +.entry-content .has-regular-font-size { + font-size: 1em; +} + +.entry-content .has-medium-font-size { + font-size: 1.1em; + line-height: 1.45; +} + +.entry-content .has-large-font-size { + font-size: 1.25em; + line-height: 1.4; +} + +.entry-content .has-larger-font-size { + font-size: 1.5em; + line-height: 1.3; +} + + +/* Block: Base Margins ----------------------- */ + +*[class*="_inner-container"] > *:first-child { + margin-top: 0; +} + +*[class*="_inner-container"] > *:last-child { + margin-bottom: 0; +} + +.wp-block-archives:not(.alignwide):not(.alignfull), +.wp-block-categories:not(.alignwide):not(.alignfull), +.wp-block-code, +.wp-block-columns:not(.alignwide):not(.alignfull), +.wp-block-cover:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), +.wp-block-embed:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), +.wp-block-gallery:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), +.wp-block-group:not(.has-background):not(.alignwide):not(.alignfull), +.wp-block-image:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), +.wp-block-latest-comments:not(.aligncenter):not(.alignleft):not(.alignright), +.wp-block-latest-posts:not(.aligncenter):not(.alignleft):not(.alignright), +.wp-block-media-text:not(.alignwide):not(.alignfull), +.wp-block-preformatted, +.wp-block-pullquote:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright), +.wp-block-quote, +.wp-block-quote.is-large, +.wp-block-quote.is-style-large, +.wp-block-verse, +.wp-block-video:not(.alignwide):not(.alignfull) { + margin-bottom: 3rem; + margin-top: 3rem; +} + + +/* Block: Shared Nesting Alignment Resets ---- */ + +[class*="__inner-container"] .wp-block-group:not(.alignfull):not(.alignwide):not(.alignleft):not(.alignright), +[class*="__inner-container"] .wp-block-cover:not(.alignfull):not(.alignwide):not(.alignleft):not(.alignright) { + margin-left: auto; + margin-right: auto; + max-width: 58rem; +} + + +/* Block: Shared Widget Styles --------------- */ + +.wp-block-archives, +.wp-block-categories, +.wp-block-latest-posts, +.wp-block-latest-comments { + list-style: none; + margin-left: 0; +} + +.wp-block-archives ul, +.wp-block-categories ul, +.wp-block-latest-posts ul, +.wp-block-latest-comments ul { + list-style: none; +} + +.entry-content .wp-block-archives > li, +.entry-content .wp-block-categories > li, +.entry-content .wp-block-latest-posts > li, +.entry-content .wp-block-latest-comment > li { + margin-left: 0; +} + +.entry-content .wp-block-archives > li:last-child, +.entry-content .wp-block-categories > li:last-child, +.entry-content .wp-block-latest-posts > li:last-child, +.entry-content .wp-block-latest-comment > li:last-child { + margin-bottom: 0; +} + +.entry-content .wp-block-archives *, +.entry-content .wp-block-categories *, +.entry-content .wp-block-latest-posts *, +.entry-content .wp-block-latest-comments * { + font-family: inherit; +} + +.entry-content .wp-block-archives li, +.entry-content .wp-block-categories li, +.entry-content .wp-block-latest-posts li { + color: #6d6d6d; +} + +.wp-block-archives a, +.wp-block-categories a, +.wp-block-latest-posts a, +.wp-block-latest-comments a { + font-weight: 700; + text-decoration: none; +} + +.wp-block-archives a:hover, +.wp-block-categories a:hover, +.wp-block-latest-posts a:hover, +.wp-block-latest-comments a:hover, +.wp-block-archives a:focus, +.wp-block-categories a:focus, +.wp-block-latest-posts a:focus, +.wp-block-latest-comments a:focus { + text-decoration: underline; +} + +.wp-block-latest-posts a, +.wp-block-latest-comments__comment-meta { + font-weight: 700; + letter-spacing: -0.025em; + line-height: 1.25; +} + +.wp-block-latest-comments__comment-date, +.wp-block-latest-posts__post-date { + color: #6d6d6d; + font-size: 0.7em; + font-weight: 600; + letter-spacing: normal; + margin-top: 0.15em; +} + + +/* Block: Shared Media Styles ---------------- */ + +.wp-block-embed figcaption, +.wp-block-image figcaption { + color: #6d6d6d; + font-size: 1.4rem; + margin-bottom: 0; + margin-top: 1.5rem; +} + +/* Block: Audio ------------------------------ */ + +.wp-block-audio audio { + width: 100%; +} + +/* Block: Button ----------------------------- */ + +.wp-block-button { + margin: 3rem 0; +} + +.wp-block-button.is-style-outline { + color: #cd2653; +} + +.is-style-outline .wp-block-button__link:not(.has-text-color) { + color: inherit; +} + +.is-style-outline .wp-block-button__link { + padding: calc(1.1em - 0.2rem) calc(1.44em - 0.2rem); +} + +/* Block: Columns ---------------------------- */ + +.wp-block-columns.alignfull, +.alignfull:not(.has-background) .wp-block-columns { + padding-left: 2rem; + padding-right: 2rem; +} + +.wp-block-column { + margin-bottom: 3.2rem; +} + +.wp-block-column > *:first-child { + margin-top: 0; +} + +.wp-block-column > *:last-child { + margin-bottom: 0; +} + +/* Block: Cover ------------------------------ */ + +.wp-block-cover-image .wp-block-cover__inner-container, +.wp-block-cover .wp-block-cover__inner-container { + width: calc(100% - 4rem); + padding: 2rem 0; +} + +.wp-block-cover-image .wp-block-cover-image-text, +.wp-block-cover-image .wp-block-cover-text, +.wp-block-cover-image h2, +.wp-block-cover .wp-block-cover-image-text, +.wp-block-cover .wp-block-cover-text, +.wp-block-cover h2 { + max-width: 100%; + padding: 0; +} + +.wp-block-cover-image h2, +.wp-block-cover h2 { + font-size: 3.2rem; +} + +/* Block: Embed ------------------------------ */ + +/* Block: File ------------------------------- */ + +.wp-block-file { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} + +.wp-block-file a:not(.wp-block-file__button) { + font-weight: 700; + text-decoration: none; +} + +.wp-block-file a:not(.wp-block-file__button):not(:last-child) { + margin-right: 1rem; +} + +.wp-block-file a:not(.wp-block-file__button):focus, +.wp-block-file a:not(.wp-block-file__button):hover { + text-decoration: underline; +} + +.wp-block-file .wp-block-file__button { + font-size: 1.5rem; + padding: 1em 1.25em; +} + +.wp-block-file a.wp-block-file__button:visited { + opacity: 1; +} + +.wp-block-file a.wp-block-file__button:active, +.wp-block-file a.wp-block-file__button:focus, +.wp-block-file a.wp-block-file__button:hover { + opacity: 1; + text-decoration: underline; +} + + +/* Block: Gallery ---------------------------- */ + +.wp-block-gallery ul { + list-style: none; + margin: 0 0 -1.6rem 0; +} + +figure.wp-block-gallery.alignnone, +figure.wp-block-gallery.aligncenter { + margin-bottom: 3rem; + margin-top: 3rem; +} + +figure.wp-block-gallery.alignleft { + margin: 0.3rem 2rem 2rem 0; +} + +figure.wp-block-gallery.alignright { + margin: 0.3rem 0 2rem 2rem; +} + +figure.wp-block-gallery.alignwide { + margin-bottom: 4rem; + margin-top: 4rem; +} + +figure.wp-block-gallery.alignfull { + margin-bottom: 5rem; + margin-top: 5rem; +} + +/* Block: Group ------------------------------ */ + +.wp-block-group.has-background { + padding: 2rem; + margin-bottom: 0; + margin-top: 0; +} + +.wp-block-group__inner-container { + margin: 0 auto; +} + +.wp-block-group__inner-container, +.entry-content .wp-block-group p { + max-width: 100%; +} + +.alignfull:not(.has-background) > .wp-block-group__inner-container > p:not(.has-background-color) { + padding-left: 2rem; + padding-right: 2rem; +} + +/* Block: Image ------------------------------ */ + +/* Block: Media And Text --------------------- */ + +.wp-block-media-text .wp-block-media-text__content { + padding: 3rem 2rem; +} + +.wp-block-media-text .wp-block-media-text__content p { + max-width: none; +} + +.wp-block-media-text__content > *:first-child { + margin-top: 0; +} + +.wp-block-media-text__content > *:last-child { + margin-bottom: 0; +} + +/* Block: Pullquote -------------------------- */ + +/* STYLE: DEFAULT */ + +.wp-block-pullquote { + padding: 0; + position: relative; +} + +.wp-block-pullquote.alignleft, +.wp-block-pullquote.alignright { + max-width: calc(100% - 4rem); +} + +.wp-block-pullquote::before { + background: #fff; + border-radius: 50%; + color: #cd2653; + content: "”"; + display: block; + font-size: 6.2rem; + font-weight: 500; + line-height: 1.2; + margin: 0 auto 1.5rem auto; + text-align: center; + height: 4.4rem; + width: 4.4rem; +} + +.reduced-spacing .wp-block-pullquote::before { + border: 0.1rem solid currentColor; + font-size: 5.9rem; +} + +.wp-block-pullquote blockquote { + border: none; + margin: 0; + padding: 0; +} + +.wp-block-pullquote blockquote p { + font-family: inherit; + font-size: 2.8rem; + font-weight: 700; + line-height: 1.178571429; + letter-spacing: -0.041785714em; + max-width: 100%; +} + +.wp-block-pullquote p:last-of-type { + margin-bottom: 0; +} + +.wp-block-pullquote cite { + color: #6d6d6d; + font-size: 1.6rem; + font-weight: 500; + margin-top: 1.2rem; +} + +.wp-block-pullquote.alignleft p, +.wp-block-pullquote.alignright p { + font-size: 2.8rem; +} + +.wp-block-pullquote.alignleft { + text-align: left; +} + +.wp-block-pullquote.alignright { + text-align: right; +} + +.wp-block-pullquote.alignleft::before { + margin-left: 0; +} + +.wp-block-pullquote.alignright::before { + margin-right: 0; +} + +/* STYLE: SOLID BACKGROUND COLOR */ + +.wp-block-pullquote.is-style-solid-color { + padding: 3rem 2rem; +} + +.wp-block-pullquote.is-style-solid-color::before { + position: absolute; + top: 0; + left: 50%; + transform: translateY(-50%) translateX(-50%); +} + +.wp-block-pullquote.is-style-solid-color.alignleft::before, +.wp-block-pullquote.is-style-solid-color.alignright::before { + transform: translateY(-50%); +} + +.wp-block-pullquote.is-style-solid-color.alignleft::before { + left: 2rem; +} + +.wp-block-pullquote.is-style-solid-color.alignright::before { + left: auto; + right: 2rem; +} + +.wp-block-pullquote.is-style-solid-color blockquote { + max-width: 100%; + text-align: inherit; +} + +.wp-block-pullquote.is-style-solid-color cite { + color: inherit; +} + +/* Block: Separator ------------------------- */ + +hr.wp-block-separator { + margin: 3rem 0; +} + +/* STYLE: WIDE */ + +.wp-block-separator.is-style-wide { + max-width: calc(100vw - 4rem); + position: relative; + width: 100%; +} + +/* STYLE: DOTS */ + +.wp-block-separator.is-style-dots::before { + background: none; + color: inherit; + font-size: 3.2rem; + font-weight: 700; + height: auto; + letter-spacing: 1em; + padding-left: 1em; + position: static; + transform: none; + width: auto; +} + +.wp-block-separator.is-style-dots::after { + content: none; +} + + +/* Block: Search ----------------------------- */ + +.wp-block-search .wp-block-search__input { + width: auto; +} + +/* Block: Table ------------------------------ */ + +.wp-block-table.is-style-stripes tbody tr:nth-child(odd) { + background: #dcd7ca; +} + +figure.wp-block-table.is-style-stripes { + border-bottom: none; +} + +.wp-block-table.is-style-stripes table { + border-collapse: inherit; +} + +/* Block: Quote ------------------------------ */ + +.wp-block-quote p, +.wp-block-quote cite { + text-align: inherit; +} + +.wp-block-quote[style="text-align:center"] { + border-width: 0; + padding: 0; +} + +.wp-block-quote[style="text-align:right"] { + + /*rtl:begin:ignore*/ + border-width: 0 0.2rem 0 0; + padding: 0 2rem 0 0; + + /*rtl:end:ignore*/ +} + +/* STYLE: LARGE */ + +.wp-block-quote.is-large, +.wp-block-quote.is-style-large { + border: none; + padding: 0; + margin-left: auto; + margin-right: auto; +} + +.wp-block-quote.is-large p, +.wp-block-quote.is-style-large p { + font-family: inherit; + font-size: 2.4rem; + font-style: normal; + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.285; +} + +.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: 1.6rem; + text-align: inherit; +} + +/* Block: Widget Latest Comments ------------- */ + +.entry-content .wp-block-latest-comments li { + margin: 2rem 0; +} + +.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt, +.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta { + margin-left: 5.5rem; +} + +.entry-content .wp-block-latest-comments a { + text-decoration: none; +} + +.entry-content .wp-block-latest-comments a:hover, +.entry-content .wp-block-latest-comments a:focus { + text-decoration: underline; +} + +.wp-block-latest-comments__comment { + font-size: inherit; +} + +.wp-block-latest-comments__comment-date { + margin-top: 0.4em; +} + +.wp-block-latest-comments__comment-excerpt p { + font-size: 0.7em; + margin: 0.9rem 0 2rem 0; +} + +/* Block: Widget Latest Posts ---------------- */ + +.wp-block-latest-posts.is-grid li { + border-top: 0.2rem solid #dcd7ca; + margin-top: 2rem; + padding-top: 1rem; +} + +.wp-block-latest-posts.has-dates { + list-style: none; +} + +.wp-block-latest-posts.has-dates:not(.is-grid) li { + margin-top: 1.5rem; +} + +.wp-block-latest-posts.has-dates:not(.is-grid) li:first-child { + margin-top: 0; +} + + +/* -------------------------------------------------------------------------- */ + +/* 11. Entry Content +/* -------------------------------------------------------------------------- */ + + +.entry-content { + line-height: 1.5; +} + +.entry-content > * { + margin-left: auto; + margin-right: auto; + margin-bottom: 1.25em; +} + +.entry-content > *:first-child { + margin-top: 0; +} + +.entry-content > *:last-child { + margin-bottom: 0; +} + +.read-more-button-wrap { + margin-top: 1em; + text-align: center; +} + +.entry-content a:hover, +.entry-content a:focus { + text-decoration: none; +} + +.entry-content p, +.entry-content li { + line-height: 1.4; +} + +.entry-content li img { + display: inline-block; +} + +.entry-content h1, +.entry-content h2, +.entry-content h3, +.entry-content h4, +.entry-content h5, +.entry-content h6 { + margin: 3.5rem auto 2rem; +} + +.entry-content ul ul, +.entry-content ol ol, +.entry-content ul ol, +.entry-content ol ul { + margin-bottom: 1rem; +} + +.entry-content hr { + margin: 4rem auto; +} + +.post-inner .entry-content > .wp-block-cover.alignwide:first-child, +.post-inner .entry-content > .wp-block-cover.alignfull:first-child { + margin-top: 0; +} + +/* Font Families ----------------------------- */ + +.entry-content { + font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif; + letter-spacing: normal; +} + +.entry-content h1, +.entry-content h2, +.entry-content h3, +.entry-content h4, +.entry-content h5, +.entry-content h6, +.entry-content cite, +.entry-content figcaption, +.entry-content table, +.entry-content address, +.entry-content .wp-caption-text, +.entry-content .wp-block-file { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + .entry-content h1, + .entry-content h2, + .entry-content h3, + .entry-content h4, + .entry-content h5, + .entry-content h6, + .entry-content cite, + .entry-content figcaption, + .entry-content table, + .entry-content address, + .entry-content .wp-caption-text, + .entry-content .wp-block-file { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + + +/* Alignment Classes ------------------------- */ + +.entry-content > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + max-width: 58rem; + width: calc(100% - 4rem); +} + +[class*="__inner-container"] > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + max-width: 58rem; + width: 100%; +} + +.alignnone, +.aligncenter, +.alignleft, +.alignright, +.alignwide { + margin-top: 4rem; + margin-right: auto; + margin-bottom: 4rem; + margin-left: auto; +} + +[class*="__inner-container"] > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright) { + margin-left: auto; + margin-right: auto; +} + +/* Full */ + +.alignfull { + margin-top: 5rem; + margin-right: auto; + margin-bottom: 5rem; + margin-left: auto; + max-width: 100vw; + position: relative; + width: 100%; +} + +[class*="__inner-container"] > .alignfull { + max-width: 100%; +} + +/* Wide */ + +.alignwide { + max-width: 120rem; + position: relative; + width: calc(100% - 4rem); +} + +[class*="__inner-container"] > .alignwide { + width: 100%; +} + +/* Center */ + +.aligncenter, +.aligncenter img { + margin-left: auto; + margin-right: auto; +} + +/* Left and right */ + +.alignleft, +.alignright { + max-width: 50%; +} + +.alignleft { + + /*rtl:ignore*/ + float: left; + margin: 0.3rem 2rem 2rem 2rem; +} + +.alignright { + + /*rtl:ignore*/ + float: right; + margin: 0.3rem 2rem 2rem 2rem; +} + +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignleft, +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignleft, +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-left: 2rem; +} + +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignright, +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignright, +[class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-right: 2rem; +} + +/* Entry Media ------------------------------- */ + +.alignfull > figcaption, +.alignfull > .wp-caption-text { + margin-left: auto; + margin-right: auto; + max-width: 58rem; + width: calc(100% - 4rem); +} + + +/* -------------------------------------------------------------------------- */ + +/* 12. Comments +/* -------------------------------------------------------------------------- */ + + +/* Comment Headers ----------------------------- */ + +.comments-wrapper { + margin-top: 5rem; +} + +.comment-reply-title { + margin: 0 0 4rem 0; + text-align: center; +} + + +/* Comment Item ----------------------------- */ + +/* COMMENT HEADER */ + +.comments .comment, +.comments .pingback, +.comments .trackback, +.comments .review { + padding-top: 3.5rem; +} + +div.comment:first-of-type { + margin-top: 3.5rem; + padding-top: 0; +} + +.comments .comments-header + div { + margin-top: 0; + padding-top: 0; +} + +.comment-body { + position: relative; +} + +.comment .comment { + padding-left: 5%; +} + +.comment-meta { + line-height: 1.1; + margin-bottom: 1.5rem; + min-height: 5rem; + padding-left: 5rem; + position: relative; +} + +.hide-avatars .comment-meta { + min-height: 0; + padding-left: 0; +} + +.comment-meta a { + color: inherit; +} + +.comment-author { + font-size: 1.8rem; + font-weight: 700; + letter-spacing: -0.027777778em; +} + +.comment-author a { + text-decoration: underline; +} + +.comment-author a:hover, +.comment-author a:focus { + text-decoration: none; +} + +.comment-meta .avatar { + height: 4rem; + position: absolute; + left: 0; + top: 0; + width: 4rem; +} + +.comment-author .url { + text-decoration: underline; +} + +.comment-metadata { + color: #6d6d6d; + font-size: 1.4rem; + font-weight: 500; + margin-top: 0.6rem; +} + +.comment-metadata a { + text-decoration: none; +} + +.comment-metadata a:focus, +.comment-metadata a:hover { + text-decoration: underline; +} + + +/* COMMENT CONTENT */ + +.comment-content.entry-content > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + width: 100%; +} + +.comment-content.entry-content .alignleft { + + /*rtl:ignore*/ + margin-left: 0; +} + +.comment-content.entry-content .alignright { + + /*rtl:ignore*/ + margin-right: 0; +} + +/* COMMENT FOOTER */ + +.comment-footer-meta { + align-items: center; + display: flex; + flex-wrap: wrap; + font-size: 1.2rem; + font-weight: 600; + justify-content: flex-start; + letter-spacing: 0.030833333em; + line-height: 1; + margin: 1.5rem 0 -1rem -1.5rem; + text-transform: uppercase; +} + +.comment-footer-meta > * { + margin: 0 0 1rem 1.5rem; +} + +.comment-reply-link { + background-color: #cd2653; + color: #fff; + display: block; + padding: 0.7rem; +} + +.bypostauthor .comment-footer-meta .by-post-author { + display: block; +} + +.comment-footer-meta a { + text-decoration: none; +} + +.comment-footer-meta a:focus, +.comment-footer-meta a:hover { + text-decoration: underline; +} + + +/* Pingbacks & Trackbacks ------------------------- */ + +.pingback .comment-meta, +.trackback .comment-meta { + padding-left: 0; +} + + +/* Comments Pagination ---------------------------- */ + +.comments-pagination { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + margin-top: 6rem; + text-align: center; +} + +.comments-pagination.only-next { + justify-content: flex-end; +} + +.comments-pagination .page-numbers { + display: none; + text-decoration: none; +} + +.comments-pagination .page-numbers:focus, +.comments-pagination .page-numbers:hover { + text-decoration: underline; +} + +.comments-pagination .prev, +.comments-pagination .next { + display: block; +} + +.comments-pagination .prev { + left: 0; +} + +.comments-pagination .next { + right: 0; + text-align: right; +} + + +/* Comment Respond ---------------------------- */ + +.comment-respond::after { + clear: both; + content: ""; + display: block; +} + +.comment-respond .comment-notes, +.comment-respond .logged-in-as { + color: #6d6d6d; + font-size: 1.6rem; + line-height: 1.4; + margin: -3rem 0 4rem 0; + text-align: center; +} + +.comment-respond .comment-notes a, +.comment-respond .logged-in-as a { + color: inherit; + text-decoration: none; +} + +.comment-respond .comment-notes a:focus, +.comment-respond .comment-notes a:hover, +.comment-respond .logged-in-as a:focus, +.comment-respond .logged-in-as a:hover { + text-decoration: underline; +} + +.comment-respond p { + line-height: 1.1; + margin-bottom: 2rem; + margin-left: auto; + margin-right: auto; +} + +.comment-respond p:not(.comment-notes) { + max-width: 58rem; +} + +.comment-form-cookies-consent { + align-items: baseline; + display: flex; +} + +.comment-respond > p:last-of-type { + margin-bottom: 0; +} + +.comment-respond label { + display: block; +} + +.comment-respond input[type="checkbox"] + label { + font-size: 1.5rem; + line-height: 1.25; +} + +.comment-respond input[type="text"], +.comment-respond input[type="email"], +.comment-respond textarea { + margin-bottom: 0; +} + +.comment-respond textarea { + height: 15rem; +} + +.comment-respond #submit { + display: block; +} + +.comment-respond .comments-closed { + text-align: center; +} + + +/* Reply Respond ---------------------------- */ + +.comments .comment-respond { + padding: 3rem 0 0; +} + +.comments .comment-respond .comment-reply-title, +.comments .comment-respond .comment-notes, +.comments .comment-respond .logged-in-as { + text-align: left; +} + +.comment-reply-title small { + display: block; + font-size: 1.6rem; + font-weight: 600; + letter-spacing: -0.0277em; + margin: 0.5rem 0 0 0; + white-space: nowrap; +} + +.comment-reply-title small a { + text-decoration: none; +} + +.comment-reply-title small a:focus, +.comment-reply-title small a:hover { + text-decoration: underline; +} + + +/* -------------------------------------------------------------------------- */ + +/* 13. Site Pagination +/* -------------------------------------------------------------------------- */ + + +.pagination .nav-links { + align-items: baseline; + display: flex; + flex-wrap: wrap; + font-size: 1.8rem; + font-weight: 600; + margin: -1.5rem 0 0 -2.5rem; + width: calc(100% + 2.5rem); +} + +.pagination-separator { + margin: 5rem 0; +} + +.nav-links > * { + margin: 1.5rem 0 0 2.5rem; +} + +.nav-links .placeholder { + display: none; + visibility: hidden; +} + +.pagination a { + text-decoration: none; +} + +.pagination a:focus, +.pagination a:hover { + text-decoration: underline; +} + +.pagination .dots { + transform: translateY(-0.3em); + color: #6d6d6d; +} + +.nav-short { + display: none; +} + +/* -------------------------------------------------------------------------- */ + +/* 14. Error 404 +/* -------------------------------------------------------------------------- */ + + +.error404 #site-content { + padding-top: 4rem; +} + +.error404-content { + text-align: center; +} + +.error404 #site-content .search-form { + justify-content: center; + margin-top: 3rem; +} + + +/* -------------------------------------------------------------------------- */ + +/* 15. Widgets +/* -------------------------------------------------------------------------- */ + + +/* Widget Base ------------------------------- */ + +.widget { + margin-top: 3rem; +} + +.widget:first-child { + margin-top: 0; +} + +.widget-content > div > *:first-child { + margin-top: 0; +} + +.widget-content > div > *:last-child { + margin-bottom: 0; +} + +.widget .widget-title { + margin: 0 0 2rem; +} + +.widget li { + margin: 2rem 0 0 0; +} + +.widget li:first-child, +.widget li > ul, +.widget li > ol { + margin-top: 0; +} + +.widget table, +.widget table * { + border-color: #dedfdf; +} + +.widget table caption { + background-color: #dedfdf; +} + +.widget .post-date, +.widget .rss-date { + color: #6d6d6d; + display: block; + font-size: 0.85em; + font-weight: 500; + margin-top: 0.2rem; +} + +.widget select { + max-width: 100%; +} + +/* Font Families ----------------------------- */ + +.widget_text p, +.widget_text ol, +.widget_text ul, +.widget_text dl, +.widget_text dt, +.widget-content .rssSummary { + font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif; + letter-spacing: normal; +} + +.widget-content cite, +.widget-content figcaption, +.widget-content .wp-caption-text { + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; +} + +@supports ( font-variation-settings: normal ) { + + .widget-content cite, + .widget-content figcaption, + .widget-content .wp-caption-text { + font-family: "Inter var", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, sans-serif; + } +} + +/* Base List Widget -------------------------- */ + +.widget_archive ul, +.widget_categories ul, +.widget_pages ul, +.widget_meta ul, +.widget_nav_menu ul, +.widget_recent_comments ul, +.widget_recent_entries ul, +.widget_rss ul { + list-style: none; + margin: 0; +} + +.widget_archive li, +.widget_categories li, +.widget_pages li, +.widget_meta li, +.widget_nav_menu li { + color: #6d6d6d; + margin: 0.3rem 0; +} + +.widget_archive li li, +.widget_categories li li, +.widget_pages li li, +.widget_meta li li, +.widget_nav_menu li li { + margin-left: 2rem; +} + +.widget_archive a, +.widget_categories a, +.widget_pages a, +.widget_meta a, +.widget_nav_menu a { + font-weight: 700; + text-decoration: none; +} + +.widget_archive a:focus, +.widget_archive a:hover, +.widget_categories a:focus, +.widget_categories a:hover, +.widget_pages a:focus, +.widget_pages a:hover, +.widget_meta a:focus, +.widget_meta a:hover, +.widget_nav_menu a:focus, +.widget_nav_menu a:hover { + text-decoration: underline; +} + +/* Widget: Calendar -------------------------- */ + +.calendar_wrap { + font-size: 2.4rem; +} + +.calendar_wrap th, +.calendar_wrap td, +.wp-calendar-nav span { + display: table-cell; + font-size: 1em; + font-weight: 500; + line-height: 1; + padding: 2.5% 2.5% 1.75% 2.5%; + text-align: center; +} + +.wp-calendar-table { + margin-bottom: 0; +} + +.wp-calendar-nav { + display: table; + width: 100%; + font-size: 1.8rem; +} + +.calendar_wrap tfoot td { + border-bottom: none; +} + +.calendar_wrap tfoot a, +.calendar_wrap .wp-calendar-nav a { + text-decoration: none; +} + +.calendar_wrap tfoot #prev, +.calendar_wrap .wp-calendar-nav-prev { + text-align: left; +} + +.calendar_wrap tfoot #next, +.calendar_wrap .wp-calendar-nav-next { + text-align: right; +} + +/* Widget: Image ----------------------------- */ + +/* Widget: Gallery --------------------------- */ + +.widget_media_gallery .gallery { + margin: 0 -0.4em -0.8em -0.4em; + width: calc(100% + 0.8em); +} + +.widget_media_gallery .gallery-item { + margin: 0 0 0.8em 0; + padding: 0 0.4em; +} + +/* Widget: Nav Menu -------------------------- */ + +.widget_nav_menu .widget-content > div > ul { + margin-left: 0; +} + +/* Widget: Recent Comments ------------------- */ + +.widget_recent_comments li { + font-weight: 700; +} + +.widget_recent_comments a { + text-decoration: none; +} + +.widget_recent_comments a:focus, +.widget_recent_comments a:hover { + text-decoration: underline; +} + +/* Widget: Recent Entries -------------------- */ + +.widget_recent_entries a { + font-weight: 700; + text-decoration: none; +} + +.widget_recent_entries a:focus, +.widget_recent_entries a:hover { + text-decoration: underline; +} + +/* Widget: RSS ------------------------------- */ + +.widget_rss .widget-title a.rsswidget:first-of-type { + display: none; +} + +.widget_rss .rsswidget { + font-weight: 700; +} + +.widget_rss a { + text-decoration: none; +} + +.widget_rss a:focus, +.widget_rss a:hover { + text-decoration: underline; +} + +.widget_rss .rssSummary { + margin-top: 0.5rem; +} + +.widget_rss cite::before { + content: "— "; +} + +/* Widget: Search ---------------------------- */ + +.widget_search .search-field { + border-color: #dedfdf; +} + +/* Widget: Tag Cloud ------------------------- */ + +.widget_tag_cloud a { + font-weight: 700; + margin-right: 0.5rem; + text-decoration: none; + white-space: nowrap; +} + +.widget_tag_cloud a:focus, +.widget_tag_cloud a:hover { + text-decoration: underline; +} + +/* Widget: Text ------------------------------ */ + + +/* -------------------------------------------------------------------------- */ + +/* 16. Site Footer +/* -------------------------------------------------------------------------- */ + + +.footer-nav-widgets-wrapper, +#site-footer { + background-color: #fff; + border-color: #dedfdf; + border-style: solid; + border-width: 0; +} + +.footer-top-visible .footer-nav-widgets-wrapper, +.footer-top-hidden #site-footer { + margin-top: 5rem; +} + +.reduced-spacing.footer-top-visible .footer-nav-widgets-wrapper, +.reduced-spacing.footer-top-hidden #site-footer { + border-top-width: 0.1rem; +} + +.footer-top, +.footer-widgets-outer-wrapper, +#site-footer { + padding: 3rem 0; +} + + +/* Footer Top -------------------------------- */ + +.footer-top { + display: flex; + border-bottom: 0.1rem solid #dedfdf; + justify-content: space-between; +} + +/* FOOTER MENU */ + +.footer-menu { + font-size: 1.8rem; + font-weight: 700; + letter-spacing: -0.0277em; +} + +.footer-menu li { + line-height: 1.25; + margin: 0.25em 0 0 0; +} + +.footer-menu a { + text-decoration: none; + word-break: normal; + word-wrap: normal; +} + +.footer-menu a:hover, +.footer-menu a:focus { + text-decoration: underline; +} + +/* FOOTER SOCIAL */ + +.footer-social-wrapper { + margin: 0; + width: 100%; +} + +.has-footer-menu .footer-social-wrapper { + flex-shrink: 0; + margin-left: 1rem; + width: 50%; +} + +ul.footer-social { + margin: -0.5rem 0 0 -0.5rem; +} + +.has-footer-menu .footer-social { + justify-content: flex-end; +} + +ul.footer-social li { + margin: 0.5rem 0 0 0.5rem; +} + +.footer-social a { + background-color: #cd2653; + height: 3.6rem; + width: 3.6rem; +} + +.footer-social a::before { + font-size: 1.6rem; +} + +/* Footer Widgets ---------------------------- */ + +.footer-widgets-outer-wrapper { + border-bottom: 0.1rem solid #dedfdf; +} + +.footer-widgets + .footer-widgets { + margin-top: 3rem; +} + +/* Footer Bottom ----------------------------- */ + +#site-footer { + font-size: 1.6rem; +} + +#site-footer .section-inner { + align-items: baseline; + display: flex; + justify-content: space-between; +} + +#site-footer a { + text-decoration: none; +} + +#site-footer a:focus, +#site-footer a:hover { + text-decoration: underline; +} + +.footer-copyright a, +.powered-by-wordpress a { + color: inherit; +} + +.powered-by-wordpress, +.to-the-top { + color: #6d6d6d; +} + +a.to-the-top > * { + pointer-events: none; +} + +.footer-copyright { + font-weight: 600; + margin: 0; +} + +.powered-by-wordpress { + display: none; + margin: 0 0 0 2.4rem; +} + +.to-the-top-long { + display: none; +} + + +/* -------------------------------------------------------------------------- */ + +/* 17. Media Queries +/* -------------------------------------------------------------------------- */ + +@media ( max-width: 479px ) { + + /* Blocks -------------------------------- */ + + .wp-block-pullquote.alignleft, + .wp-block-pullquote.alignright { + float: none; + } + + /* Entry Content ------------------------- */ + + /* LISTS */ + + ul, + ol { + margin: 0 0 3rem 2rem; + } + + li { + margin: 0.5rem 0 0 1rem; + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em 0 0 0; + } +} + +@media ( min-width: 480px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: BASE ALIGNMENT WIDTH */ + + .wp-block-pullquote.alignleft, + .wp-block-pullquote.alignright, + .wp-block-cover-image.alignleft, + .wp-block-cover-image.alignright, + .wp-block-cover.alignleft, + .wp-block-cover.alignright, + .wp-block-embed.alignleft, + .wp-block-embed.alignright, + .wp-block-gallery.alignleft, + .wp-block-gallery.alignright { + max-width: 26rem; + } + + /* BLOCK: TABLE WIDTH */ + .wp-block-table.alignleft, + .wp-block-table.alignright { + max-width: 100%; + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .alignleft, + .alignright { + max-width: 26rem; + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em 0 0 0; + } +} + +@media ( max-width: 599px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + /* While columns are stacked */ + .wp-block-column:last-child { + margin-bottom: 0; + } + + .wp-block-columns + .wp-block-columns { + margin-top: 0.2rem; + } + + .wp-block-columns.alignwide + .wp-block-columns.alignwide { + margin-top: -0.8rem; + } + + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -1.8rem; + } + + /* Template -------------------------------- */ + + /* TEMPLATE: COVER */ + + .template-cover .post-inner .post-meta-wrapper, + .template-cover .post-inner .author-bio { + width: calc( 100% - 4rem ); + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em 0 0 0; + } +} + +@media ( min-width: 600px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + .wp-block-columns.alignwide + .wp-block-columns.alignwide, + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -4rem; + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em 0 0 0; + } +} + +@media ( min-width: 660px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignleft { + + /*rtl:ignore*/ + margin-left: calc(( 100vw - 58rem - 8rem ) / -2); + } + + figure.wp-block-gallery.alignright { + + /*rtl:ignore*/ + margin-right: calc(( 100vw - 58rem - 8rem ) / -2); + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .entry-content > .alignleft { + + /*rtl:ignore*/ + margin-left: 4rem; + } + + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-left: calc(( 100vw - 58rem - 8rem ) / -2); + } + + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .alignleft, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-left: 0; + } + + .entry-content > .alignright { + + /*rtl:ignore*/ + margin-right: 4rem; + } + + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-right: calc(( 100vw - 58rem - 8rem ) / -2); + } + + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .alignright, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > p .alignright, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-right: 0; + } + + /* Post Footer --------------------------- */ + + /* POST NAV LINKS */ + + .post-nav-links { + margin: 3em auto 0 auto; + } +} + +@media ( min-width: 700px ) { + + /* Element Base ------------------------- */ + + ul, + ol { + margin-bottom: 4rem; + } + + pre { + padding: 3rem; + } + + hr { + margin: 8rem auto; + } + + table { + font-size: 1.8rem; + } + + /* VANILLA GALLERIES */ + + .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%; + } + + /* TITLES */ + + h1, + .heading-size-1, + h2, + .heading-size-2, + h3, + .heading-size-3 { + margin: 6rem auto 3rem; + } + + h4, + .heading-size-4, + h5, + .heading-size-5, + h6, + .heading-size-6 { + margin: 4.5rem auto 2.5rem; + } + + h1, + .heading-size-1 { + font-size: 6.4rem; + } + + h2, + .heading-size-2 { + font-size: 4.8rem; + } + + h3, + .heading-size-3 { + font-size: 4rem; + } + + h4, + .heading-size-4 { + font-size: 3.2rem; + } + + h5, + .heading-size-5 { + font-size: 2.4rem; + } + + h6, + .heading-size-6 { + font-size: 1.8rem; + } + + /* INPUTS */ + + fieldset { + padding: 3rem; + } + + legend { + padding: 0 1.5rem; + } + + button, + .button, + .faux-button, + .wp-block-button__link, + input[type="button"], + input[type="reset"], + input[type="submit"] { + font-size: 1.7rem; + } + + /* MEDIA */ + + figcaption, + .wp-caption-text { + margin-top: 1.8rem; + } + + + /* Helper Classes ------------------------- */ + + /* SECTIONS */ + + section { + padding: 8rem 0; + } + + .section-inner { + width: calc(100% - 8rem); + } + + + /* Site Header --------------------------- */ + + .header-inner { + padding: 3.8rem 0; + } + + .site-title { + font-size: 2.4rem; + font-weight: 700; + } + + .site-description { + display: block; + } + + .site-logo img { + max-height: 9rem; + transition: height 0.15s linear, width 0.15s linear, max-height 0.15s linear; + } + + /* HEADER TOGGLES */ + + .toggle-inner .toggle-text { + font-size: 1.2rem; + } + + .search-toggle { + left: 2rem; + } + + .nav-toggle { + right: 2rem; + } + + + /* Menu Modal ---------------------------- */ + + button.close-nav-toggle { + font-size: 1.8rem; + padding: 4rem 0; + } + + button.close-nav-toggle svg { + height: 2rem; + width: 2rem; + } + + button.close-nav-toggle .toggle-text { + margin-right: 2.1rem; + } + + .modal-menu { + left: auto; + width: 100%; + } + + .modal-menu > li > a, + .modal-menu > li > .ancestor-wrapper > a { + font-size: 2.4rem; + padding: 2.5rem 0; + } + + .modal-menu ul li { + border-left-color: transparent; + } + + .modal-menu > li > .ancestor-wrapper > button.sub-menu-toggle { + padding: 0 3rem; + } + + .modal-menu > li > .ancestor-wrapper > button.sub-menu-toggle svg { + height: 1.1rem; + width: 1.8rem; + } + + .menu-bottom { + align-items: center; + display: flex; + justify-content: space-between; + padding: 4.4rem 0; + } + + .menu-copyright { + display: block; + flex-shrink: 0; + margin-right: 4rem; + } + + /* Modal Search Form ------------------------- */ + + .search-modal form { + position: relative; + width: 100%; + } + + .search-untoggle svg { + height: 2.5rem; + width: 2.5rem; + } + + .search-modal .search-field { + border: none; + font-size: 3.2rem; + height: 14rem; + } + + .search-modal .search-field::-moz-placeholder { + line-height: 4.375; + } + + /* Sub Page ------------------------------ */ + + /* FEATURED MEDIA */ + + .featured-media figcaption { + margin: 2rem auto 0 auto; + width: calc(100% - 8rem); + } + + /* Template: Cover Template -------------- */ + + .cover-header-inner { + padding: 18rem 0 8rem 0; + } + + .to-the-content-wrapper { + top: calc(100% + 1.8rem); + } + + .to-the-content { + height: 6rem; + } + + .to-the-content svg { + height: 2.4rem; + width: 2.12rem; + } + + /* Template: Full Width ------------------ */ + + body.template-full-width .entry-content > *:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.is-style-wide) { + width: calc(100% - 8rem); + } + + body.template-full-width .alignfull:not(.has-background) > .wp-block-group__inner-container > p:not(.has-background-color) { + padding-left: 4rem; + padding-right: 4rem; + } + + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-left: 4rem; + } + + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-right: 4rem; + } + + /* Post: Archive ------------------------- */ + + .archive-header { + padding: 8rem 0; + } + + .reduced-spacing .archive-header { + padding-bottom: 3rem; + } + + .archive-title { + font-size: 3.2rem; + } + + body:not(.singular) main > article:first-of-type { + padding: 8rem 0 0; + } + + h2.entry-title { + font-size: 6.4rem; + } + + /* SEARCH RESULTS */ + + .no-search-results-form { + padding-top: 8rem; + } + + /* Post: Single -------------------------- */ + + /* POST HEADER */ + + .singular .entry-header { + padding: 8rem 0; + } + + .entry-categories { + margin-bottom: 3rem; + } + + .entry-categories-inner { + margin: -1rem 0 0 -2rem; + } + + .entry-categories a { + font-size: 1.5rem; + margin: 1rem 0 0 2rem; + } + + .intro-text { + font-size: 2rem; + margin-top: 2.5rem; + } + + .singular .intro-text { + font-size: 2.6rem; + } + + .post-meta-wrapper { + margin-top: 3rem; + } + + .post-meta { + font-size: 1.6rem; + margin: -1.4rem 0 0 -3rem; + } + + .post-meta li { + margin: 1.4rem 0 0 3rem; + max-width: calc(100% - 3rem); + } + + .featured-media { + margin-top: 6rem; + } + + .post-inner { + padding-top: 8rem; + } + + /* POST FOOTER */ + + .post-meta-wrapper.post-meta-single-bottom { + margin-top: 4rem; + } + + /* AUTHOR BIO */ + + .author-bio { + margin-top: 8rem; + min-height: 8rem; + padding-left: 10rem; + position: relative; + } + + .author-bio .avatar { + position: absolute; + left: 0; + top: 0; + height: 8rem; + width: 8rem; + } + + /* SINGLE PAGINATION */ + + .pagination-single { + font-size: 2.4rem; + margin-top: 8rem; + } + + .pagination-single-inner { + flex-direction: row; + justify-content: space-between; + } + + .pagination-single.only-next .pagination-single-inner { + justify-content: flex-end; + } + + .pagination-single hr:first-child { + margin: 0 0 4rem 0; + } + + .pagination-single hr:last-child { + margin: 4rem 0 0.8rem 0; + } + + .pagination-single a + a { + margin: 0 0 0 4rem; + } + + .pagination-single a .arrow { + margin: 0 2rem 0 0; + } + + .pagination-single .next-post { + flex-direction: row-reverse; + text-align: right; + } + + .pagination-single .next-post .arrow { + margin: 0 0 0 2rem; + } + + /* Blocks -------------------------------- */ + + /* BLOCK: SHARED MEDIA STYLES */ + + .wp-block-embed figcaption, + .wp-block-image figcaption { + font-size: 1.6rem; + } + + /* BLOCK: BASE MARGINS */ + + .wp-block-archives:not(.alignwide):not(.alignfull), + .wp-block-categories:not(.alignwide):not(.alignfull), + .wp-block-code, + .wp-block-columns:not(.alignwide):not(.alignfull), + .wp-block-cover:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), + .wp-block-embed:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), + .wp-block-gallery:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), + .wp-block-group:not(.has-background):not(.alignwide):not(.alignfull), + .wp-block-image:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright):not(.aligncenter), + .wp-block-latest-comments:not(.aligncenter):not(.alignleft):not(.alignright), + .wp-block-latest-posts:not(.aligncenter):not(.alignleft):not(.alignright), + .wp-block-media-text:not(.alignwide):not(.alignfull), + .wp-block-preformatted, + .wp-block-pullquote:not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright), + .wp-block-quote, + .wp-block-quote.is-large, + .wp-block-quote.is-style-large, + .wp-block-verse, + .wp-block-video:not(.alignwide):not(.alignfull) { + margin-bottom: 4rem; + margin-top: 4rem; + } + + /* BLOCK: COLUMNS */ + + .wp-block-columns.alignwide + .wp-block-columns.alignwide, + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -6rem; + } + + .entry-content .wp-block-columns h1, + .entry-content .wp-block-columns h2, + .entry-content .wp-block-columns h3, + .entry-content .wp-block-columns h4, + .entry-content .wp-block-columns h5, + .entry-content .wp-block-columns h6 { + margin: 3.5rem 0 2rem; + } + + /* BLOCK: COVER */ + + .wp-block-cover-image .wp-block-cover__inner-container, + .wp-block-cover .wp-block-cover__inner-container { + width: calc(100% - 8rem); + } + + .wp-block-cover-image h2, + .wp-block-cover h2 { + font-size: 4.8rem; + } + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignnone, + figure.wp-block-gallery.aligncenter { + margin-bottom: 4rem; + margin-top: 4rem; + } + + figure.wp-block-gallery.alignwide, + figure.wp-block-gallery.alignfull { + margin-bottom: 6rem; + margin-top: 6rem; + } + + /* BLOCK: GROUP */ + + .wp-block-group.has-background { + padding: 4rem; + margin-top: 0; + margin-bottom: 0; + } + + .alignfull:not(.has-background) > .wp-block-group__inner-container > p:not(.has-background-color) { + padding-left: 0; + padding-right: 0; + } + + /* BLOCK: MEDIA AND TEXT */ + + .wp-block-media-text .wp-block-media-text__content { + padding: 4rem; + } + + /* BLOCK: PULLQUOTE */ + + .wp-block-pullquote blockquote p { + font-size: 3.2rem; + } + + .wp-block-pullquote cite { + margin-top: 2rem; + } + + .wp-block-pullquote.alignfull:not(.is-style-solid-color) { + padding-left: 1rem; + padding-right: 1rem; + } + + .wp-block-pullquote.alignwide::before, + .wp-block-pullquote.alignfull::before { + font-size: 11.272727272rem; + height: 8rem; + margin-bottom: 2rem; + width: 8rem; + } + + .wp-block-pullquote.alignwide blockquote p, + .wp-block-pullquote.alignfull blockquote p { + font-size: 4.8rem; + line-height: 1.203125; + } + + .wp-block-pullquote.alignleft p, + .wp-block-pullquote.alignright p, + .wp-block-pullquote.alignleft.is-style-solid-color blockquote p, + .wp-block-pullquote.alignright.is-style-solid-color blockquote p { + font-size: 3.2rem; + line-height: 1.1875; + } + + .wp-block-pullquote.is-style-solid-color.alignwide, + .wp-block-pullquote.is-style-solid-color.alignfull { + padding: 6rem 4rem 4rem; + } + + .wp-block-pullquote.alignleft.is-style-solid-color blockquote p, + .wp-block-pullquote.alignright.is-style-solid-color blockquote p { + font-size: 2.6rem; + } + + /* BLOCK: QUOTE */ + + .wp-block-quote.is-large p, + .wp-block-quote.is-style-large p { + font-size: 2.8rem; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator { + margin: 6rem auto; + } + + .wp-block-separator.is-style-wide { + max-width: calc(100vw - 8rem); + } + + /* Entry Content ------------------------- */ + + .entry-content { + font-size: 2.1rem; + } + + .entry-content p, + .entry-content li { + line-height: 1.476; + } + + .entry-content h1, + .entry-content h2, + .entry-content h3 { + margin: 6rem auto 3rem; + } + + .entry-content h4, + .entry-content h5, + .entry-content h6 { + margin: 4.5rem auto 2.5rem; + } + + .alignnone, + .aligncenter { + margin-bottom: 4rem; + margin-top: 4rem; + } + + .alignleft { + + /*rtl:ignore*/ + margin: 0.3rem 2rem 2rem 0; + } + + .alignright { + + /*rtl:ignore*/ + margin: 0.3rem 0 2rem 2rem; + } + + .entry-content > .alignwide:not(.wp-block-group.has-background), + .entry-content > .alignfull:not(.wp-block-group.has-background) { + margin-bottom: 6rem; + margin-top: 6rem; + } + + .entry-content > .alignwide { + max-width: calc(100vw - 8rem); + width: calc(100vw - 8rem); + } + + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-left: 4rem; + } + + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-right: 4rem; + } + + .entry-content > .alignwide:first-child, + .entry-content > .alignfull:first-child { + margin-bottom: 8rem; + } + + /* ENTRY MEDIA */ + + .alignfull > figcaption, + .alignfull > .wp-caption-text { + width: calc(100% - 8rem); + } + + /* Comments ------------------------------ */ + + .comments-wrapper { + margin-top: 8rem; + } + + .comment-reply-title { + margin-bottom: 4.6rem; + } + + .comment-respond p.comment-notes, + .comment-respond p.logged-in-as { + font-size: 1.8rem; + letter-spacing: -0.025em; + margin: -2.5rem 0 4.4rem 0; + } + + .comments .comment, + .comments .pingback, + .comments .trackback, + .comments .review { + padding-top: 5rem; + } + + div.comment:first-of-type { + margin-top: 5rem; + } + + .comment-meta { + margin-bottom: 2rem; + min-height: 6rem; + padding: 0.3rem 0 0 7.5rem; + } + + .comment-meta .avatar { + display: block; + height: 6rem; + position: absolute; + left: 0; + top: 0; + width: 6rem; + } + + .comment-author { + font-size: 2.4rem; + } + + .comment-metadata { + font-size: 1.6rem; + margin-top: 0.8rem; + } + + .comment-footer-meta { + margin-top: 2.5rem; + } + + .comments-pagination { + margin-top: 8rem; + } + + /* PINGBACKS & TRACKBACKS */ + + .pingback .comment-body { + padding: 0; + } + + /* COMMENT RESPOND */ + + .comment-respond p { + margin-bottom: 2.5rem; + } + + .comment-form p.logged-in-as { + margin: -2.5rem 0 4.4rem 0; + } + + .comment-respond .comment-form-author, + .comment-respond .comment-form-email { + float: left; + width: calc(50% - 1rem); + } + + .comment-respond .comment-form-email { + margin-left: 2rem; + } + + .comments .comment-respond { + padding: 5rem 0 0; + } + + .comment-reply-title small { + display: inline; + margin: 0 0 0 0.5rem; + } + + /* Site Pagination ----------------------- */ + + .pagination-separator { + margin: 8rem 0; + } + + /* Display the full text for Newer and Older Posts. */ + + .nav-short { + display: inline; + } + + .pagination .nav-links { + font-size: 2.4rem; + font-weight: 700; + margin: -2.5rem 0 0 -4rem; + } + + .nav-links > * { + margin: 2.5rem 0 0 4rem; + } + + + /* Error 404 ----------------------------- */ + + .error404 #site-content { + padding-top: 8rem; + } + + /* Widgets ------------------------------- */ + + .widget .widget-title { + margin-bottom: 3rem; + } + + /* Site Footer --------------------------- */ + + .footer-top-visible .footer-nav-widgets-wrapper, + .footer-top-hidden #site-footer { + margin-top: 8rem; + } + + /* FOOTER TOP */ + + .footer-top { + padding: 3.7rem 0; + } + + .footer-menu { + font-size: 2.4rem; + margin: -0.8rem 0 0 -1.6rem; + } + + .footer-menu li { + margin: 0.8rem 0 0 1.6rem; + } + + .has-footer-menu .footer-social-wrapper { + flex: 1; + margin-left: 4rem; + width: auto; + } + + /* FOOTER WIDGETS */ + + .footer-widgets-outer-wrapper { + padding: 8rem 0; + } + + .footer-widgets-wrapper { + display: flex; + justify-content: space-between; + margin-left: -4rem; + width: calc(100% + 4rem); + } + + .footer-widgets { + margin-left: 4rem; + width: 50%; + } + + .footer-widgets + .footer-widgets { + margin-top: 0; + } + + .footer-widgets .widget { + border-top: none; + margin-top: 5rem; + padding-top: 0; + } + + .footer-widgets .widget:first-child { + margin-top: 0; + } + + /* FOOTER BOTTOM */ + + #site-footer { + font-size: 1.8rem; + padding: 4.3rem 0; + } + + .footer-credits { + display: flex; + } + + .footer-copyright { + font-weight: 700; + } + + .powered-by-wordpress { + display: block; + } + + .to-the-top-long { + display: inline; + } + + .to-the-top-short { + display: none; + } + +} + +@media (min-width: 782px) { + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + .wp-block-column { + margin-bottom: 0; + } + + .wp-block-columns.alignwide + .wp-block-columns.alignwide, + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -2.8rem; + } +} + +@media ( min-width: 1000px ) { + + + /* Document Setup ------------------------ */ + + /* Helper Classes ------------------------ */ + + /* Site Header --------------------------- */ + + #site-header { + z-index: 2; + } + + .header-inner { + align-items: center; + display: flex; + justify-content: space-between; + padding: 2.8rem 0; + } + + .header-titles-wrapper { + margin-right: 4rem; + max-width: 50%; + padding: 0; + text-align: left; + } + + .header-titles { + align-items: baseline; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + margin: -1rem 0 0 -2.4rem; + } + + .header-titles .site-title, + .header-titles .site-logo, + .header-titles .site-description { + margin: 1rem 0 0 2.4rem; + } + + .wp-custom-logo .header-titles { + align-items: center; + } + + /* HEADER NAVIGATION */ + + .header-navigation-wrapper { + align-items: center; + display: flex; + } + + .primary-menu-wrapper { + display: block; + width: 100%; + } + + /* HEADER TOGGLES */ + + .mobile-search-toggle, + .mobile-nav-toggle { + display: none !important; + } + + .primary-menu-wrapper + .header-toggles { + margin-left: 3rem; + } + + .header-toggles { + display: flex; + flex-shrink: 0; + margin-right: -3rem; + } + + .header-inner .toggle { + height: 4.4rem; + padding: 0 3rem; + position: relative; + bottom: auto; + left: auto; + right: auto; + top: auto; + width: auto; + } + + .header-inner .toggle-wrapper { + position: relative; + } + + .header-inner .toggle-wrapper::before { + background: #dedfdf; + content: ""; + display: block; + height: 2.7rem; + position: absolute; + left: 0; + top: calc(50% - 1.35rem); + width: 0.1rem; + } + + .header-inner .toggle-wrapper:first-child::before { + content: none; + } + + .header-inner .primary-menu-wrapper + .header-toggles .toggle-wrapper:first-child::before { + content: ""; + } + + .nav-toggle-wrapper:not(.has-expanded-menu) { + display: none; + } + + .toggle-inner { + position: static; + } + + .toggle-inner .toggle-text { + left: 0; + right: 0; + text-align: center; + top: calc(100% - 0.3rem); + width: auto; + } + + .header-toggles:only-child .nav-toggle .toggle-inner { + padding-top: 0; + } + + .header-toggles:only-child .toggle-inner { + display: flex; + flex-wrap: nowrap; + align-items: center; + } + + .header-toggles:only-child .toggle-inner .svg-icon { + order: 1; + } + + .header-toggles:only-child .toggle-inner .toggle-text { + position: static; + padding-right: 20px; + font-size: 15px; + color: inherit; + } + + /* Menu Modal ---------------------------- */ + + .menu-modal { + opacity: 1; + justify-content: flex-end; + padding: 0; + transition: background-color 0.3s ease-in, left 0s 0.3s, right 0s 0.3s; + } + + .menu-modal.cover-modal { + background: rgba(0, 0, 0, 0); + } + + .menu-modal.active { + background: rgba(0, 0, 0, 0.2); + transition: background-color 0.3s ease-out; + } + + .menu-wrapper.section-inner { + width: calc(100% - 8rem); + } + + .menu-modal-inner { + box-shadow: 0 0 2rem 0 rgba(0, 0, 0, 0.1); + opacity: 0; + padding: 0; + transform: translateX(20rem); + transition: transform 0.2s ease-in, opacity 0.2s ease-in; + width: 50rem; + } + + .menu-modal.active .menu-modal-inner { + opacity: 1; + transform: translateX(0); + transition-timing-function: ease-out; + } + + .mobile-menu { + display: none; + } + + .expanded-menu { + display: block; + } + + .menu-bottom { + padding: 6rem 0; + } + + .menu-bottom .social-menu { + justify-content: flex-start; + } + + /* Sub Page ------------------------------ */ + + /* FEATURED MEDIA */ + + .featured-media figcaption { + width: 100%; + } + + /* Template: Full Width ------------------ */ + + .template-full-width .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-right: 2rem; + } + + .template-full-width .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-left: 2rem; + } + + /* Post: Archive ------------------------- */ + + /* Post: Single -------------------------- */ + + .singular .intro-text { + font-size: 2.8rem; + } + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + .wp-block-columns.alignwide + .wp-block-columns.alignwide, + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -4.8rem; + } + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignwide, + figure.wp-block-gallery.alignfull { + margin-bottom: 8rem; + margin-top: 8rem; + } + + /* BLOCK: GROUP */ + + .entry-content > .wp-block-group.alignwide.has-background, + .entry-content > .wp-block-group.alignfull.has-background { + padding: 8rem 4rem; + margin-bottom: 0; + margin-top: 0; + } + + /* BLOCK: IMAGE */ + + .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-right: 0; + } + + .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-left: 0; + } + + .wp-block-image .aligncenter figcaption { + text-align: center; + } + + /* BLOCK: SEPARATOR */ + + hr.wp-block-separator { + margin: 8rem auto; + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .entry-content > .alignleft, + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft { + position: absolute; + + /*rtl:ignore*/ + right: calc((100vw - 58rem) / 2 + 58rem + 2rem); + max-width: calc((100% - 58rem) / 2 - 6rem); + } + + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .alignleft, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .wp-block-image .alignleft { + position: relative; + + /*rtl:ignore*/ + right: inherit; + max-width: inherit; + } + + [class*="wp-block"].alignwide [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft { + position: absolute; + + /*rtl:ignore*/ + right: calc((100% - 58rem) / 2 + 58rem + 4rem); + max-width: calc((100% - 58rem) / 2 - 4rem); + } + + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + right: calc((100% - 58rem) / 2 + 58rem); + } + + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-left: 4rem; + } + + .entry-content > .alignright, + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright, + [class*="__inner-container"] > .alignright { + position: absolute; + + /*rtl:ignore*/ + left: calc((100vw - 58rem) / 2 + 58rem + 2rem); + max-width: calc((100% - 58rem) / 2 - 6rem); + } + + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .alignright, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > p .alignright, + [class*="wp-block"]:not(.alignwide):not(.alignfull) [class*="__inner-container"] > .wp-block-image .alignright { + position: relative; + + /*rtl:ignore*/ + left: inherit; + max-width: inherit; + } + + [class*="wp-block"].alignwide [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide [class*="__inner-container"] > .wp-block-image .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + position: absolute; + + /*rtl:ignore*/ + left: calc((100% - 58rem) / 2 + 58rem + 4rem); + max-width: calc((100% - 58rem) / 2 - 4rem); + } + + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + left: calc((100% - 58rem) / 2 + 58rem + 4rem); + } + + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-right: 4rem; + } + + .entry-content > .alignwide:not(.wp-block-group.has-background), + .entry-content > .alignfull:not(.wp-block-group.has-background) { + margin-bottom: 8rem; + margin-top: 8rem; + } + + /* ENTRY MEDIA */ + + .alignfull > figcaption, + .alignfull > .wp-caption-text { + width: calc(100% - 10rem); + } + + /* Comments ------------------------------ */ + + .comment-meta { + padding-left: 0; + } + + .comment-meta .avatar { + left: -8rem; + } + + /* Site Pagination ----------------------- */ + + .pagination .nav-links { + justify-content: space-between; + margin: 0; + width: 100%; + } + + .nav-links > * { + margin: 0 2rem; + } + + .pagination .next, + .pagination .prev { + display: block; + } + + .pagination .prev { + margin: 0 auto 0 0; + } + + .pagination .next { + text-align: right; + margin: 0 0 0 auto; + } + + /* Site Footer --------------------------- */ + + /* FOOTER TOP */ + + .footer-top { + align-items: center; + } + + .footer-menu { + align-items: baseline; + display: flex; + justify-content: flex-start; + flex-wrap: wrap; + font-size: 2.1rem; + margin: -1.2rem 0 0 -2.4rem; + } + + .footer-menu li { + margin: 1.2rem 0 0 2.4rem; + } +} + + +@media ( min-width: 1220px ) { + + /* Element Base -------------------------- */ + + /* TITLES */ + + h1, + .heading-size-1 { + font-size: 8.4rem; + } + + /* Helper Classes ------------------------ */ + + /* Site Header --------------------------- */ + + /* PRIMARY MENU */ + + ul.primary-menu { + margin: -0.8rem 0 0 -2.5rem; + } + + .primary-menu > li { + margin: 0.8rem 0 0 2.5rem; + } + + /* HEADER TOGGLES */ + + .primary-menu-wrapper + .header-toggles { + margin-left: 4rem; + } + + .header-toggles { + margin-right: -4rem; + } + + .header-toggles .toggle { + padding: 0 4rem; + } + + /* Menu Modal ---------------------------- */ + + /* Search Modal -------------------------- */ + + /* Sub Page ------------------------------ */ + + /* Template: Cover Template -------------- */ + + .cover-header + .post-inner { + padding-top: 10rem; + } + + /* Post: Archive ------------------------- */ + + /* Post: Single -------------------------- */ + + .singular .intro-text { + font-size: 3.2rem; + letter-spacing: -0.03125em; + line-height: 1.375; + } + + /* Blocks -------------------------------- */ + + /* BLOCK: COLUMNS */ + + .wp-block-columns.alignfull + .wp-block-columns.alignfull { + margin-top: -6rem; + } + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignfull { + margin-bottom: 10rem; + margin-top: 10rem; + } + + /* BLOCK: GROUP */ + + .entry-content > .wp-block-group.alignwide.has-background, + .entry-content > .wp-block-group.alignfull.has-background { + padding: 8rem 6rem; + margin-bottom: 0; + margin-top: 0; + } + + /* BLOCK: PULLQUOTE */ + + .wp-block-pullquote.alignwide blockquote p, + .wp-block-pullquote.alignfull blockquote p { + font-size: 6.4rem; + } + + .wp-block-pullquote.is-style-solid-color.alignwide, + .wp-block-pullquote.is-style-solid-color.alignfull { + padding: 9rem 4rem 8rem; + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .entry-content > .alignfull { + margin-bottom: 10rem; + margin-top: 10rem; + } + + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + right: calc((100% - 58rem) / 2 + 58rem - 2rem); + } + + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide.has-background [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + left: calc((100% - 58rem) / 2 + 58rem + 6rem); + } + + /* Comments ------------------------------ */ + + .comment-reply-title { + font-size: 5.6rem; + line-height: 1.2; + margin-bottom: 6rem; + } + + .comment-respond p.comment-notes, + .comment-respond p.logged-in-as { + margin: -4rem 0 6rem 0; + } + + .comments .comment-respond .comment-reply-title { + font-size: 4.8rem; + } + + .comments .comment-respond p.comment-notes, + .comments .comment-respond p.logged-in-as { + margin: -4.5rem 0 4rem 0; + } + + /* Site Pagination ----------------------- */ + + /* Widgets ------------------------------- */ + + .widget-content { + font-size: 2.1rem; + } + + /* Site Footer --------------------------- */ + + .footer-menu { + font-size: 2.4rem; + margin: -1.5rem 0 0 -3rem; + } + + .footer-menu li { + margin: 1.5rem 0 0 3rem; + } + + ul.footer-social { + margin: -1rem 0 0 -1rem; + } + + ul.footer-social li { + margin: 1rem 0 0 1rem; + } + + .footer-social a { + height: 4.4rem; + width: 4.4rem; + } + + .footer-social a::before { + font-size: 2rem; + } + + /* FOOTER WIDGETS */ + + .footer-widgets-wrapper { + margin-left: -6rem; + width: calc(100% + 6rem); + } + + .footer-widgets { + margin-left: 6rem; + } + +} + +@media ( min-width: 1240px ) { + + + /* Blocks -------------------------------- */ + + body.template-full-width .entry-content > .alignleft { + + /*rtl:ignore*/ + margin-left: calc(( 100vw - 120rem ) / 2); + } + + body.template-full-width .entry-content > .alignright { + + /*rtl:ignore*/ + margin-right: calc(( 100vw - 120rem ) / 2); + } + +} + +@media ( min-width: 1280px ) { + + /* Blocks -------------------------------- */ + + /* BLOCK: GALLERY */ + + figure.wp-block-gallery.alignleft { + + /*rtl:ignore*/ + margin-left: -31rem; + } + + figure.wp-block-gallery.alignright { + + /*rtl:ignore*/ + margin-right: -31rem; + } + + /* BLOCK: SEPARATOR */ + + .wp-block-separator.is-style-wide { + max-width: 120rem; + width: 120rem; + } + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .entry-content > .alignleft, + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft { + + /*rtl:ignore*/ + right: calc((100vw - 58rem) / 2 + 58rem + 4rem); + + /*rtl:ignore*/ + margin-left: -31rem; + } + + .entry-content > .alignright, + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright { + + /*rtl:ignore*/ + left: calc((100vw - 58rem) / 2 + 58rem + 4rem); + + /*rtl:ignore*/ + margin-right: -31rem; + } + + .entry-content > .alignwide { + max-width: 120rem; + width: 120rem; + } + + [class*="__inner-container"] > .alignwide { + max-width: 120rem; + width: 100%; + } + + .alignleft, + .alignright, + .entry-content > .alignleft, + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft, + .entry-content > .alignright, + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + max-width: 25rem; + } + + /* Template: Full Width ------------------ */ + + body.template-full-width .alignfull:not(.has-background) > .wp-block-group__inner-container > p:not(.has-background-color) { + padding-left: 0; + padding-right: 0; + } + + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft { + + /*rtl:ignore*/ + margin-left: 0; + } + + body.template-full-width [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + + /*rtl:ignore*/ + margin-right: 0; + } + +} + +@media ( min-width: 1330px ) { + + + /* Entry Content ------------------------- */ + + /* ALIGNMENT CLASSES */ + + .alignleft, + .alignright, + .entry-content > .alignleft, + .entry-content > p .alignleft, + .entry-content > .wp-block-image .alignleft, + .entry-content > .alignright, + .entry-content > p .alignright, + .entry-content > .wp-block-image .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignleft, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignleft, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignwide:not(.has-background) [class*="__inner-container"] > .wp-block-image .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > p .alignright, + [class*="wp-block"].alignfull [class*="__inner-container"] > .wp-block-image .alignright { + max-width: 29rem; + } + + /* Blocks -------------------------------- */ + + /* BLOCK: PULLQUOTE */ + + .wp-block-pullquote.is-style-solid-color.alignleft::before, + .wp-block-pullquote.is-style-solid-color.alignright::before { + top: 0; + } +} diff --git a/content/themes/twentytwenty/template-parts/content-cover.php b/content/themes/twentytwenty/template-parts/content-cover.php new file mode 100644 index 0000000..f1150cb --- /dev/null +++ b/content/themes/twentytwenty/template-parts/content-cover.php @@ -0,0 +1,182 @@ +<?php +/** + * Displays the content when the cover template is used. + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +?> + +<article <?php post_class(); ?> id="post-<?php the_ID(); ?>"> + <?php + // On the cover page template, output the cover header. + $cover_header_style = ''; + $cover_header_classes = ''; + + $color_overlay_style = ''; + $color_overlay_classes = ''; + + $image_url = ! post_password_required() ? get_the_post_thumbnail_url( get_the_ID(), 'twentytwenty-fullscreen' ) : ''; + + if ( $image_url ) { + $cover_header_style = ' style="background-image: url( ' . esc_url( $image_url ) . ' );"'; + $cover_header_classes = ' bg-image'; + } + + // Get the color used for the color overlay. + $color_overlay_color = get_theme_mod( 'cover_template_overlay_background_color' ); + if ( $color_overlay_color ) { + $color_overlay_style = ' style="color: ' . esc_attr( $color_overlay_color ) . ';"'; + } else { + $color_overlay_style = ''; + } + + // Get the fixed background attachment option. + if ( get_theme_mod( 'cover_template_fixed_background', true ) ) { + $cover_header_classes .= ' bg-attachment-fixed'; + } + + // Get the opacity of the color overlay. + $color_overlay_opacity = get_theme_mod( 'cover_template_overlay_opacity' ); + $color_overlay_opacity = ( false === $color_overlay_opacity ) ? 80 : $color_overlay_opacity; + $color_overlay_classes .= ' opacity-' . $color_overlay_opacity; + ?> + + <div class="cover-header <?php echo $cover_header_classes; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- static output ?>"<?php echo $cover_header_style; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- We need to double check this, but for now, we want to pass PHPCS ;) ?>> + <div class="cover-header-inner-wrapper screen-height"> + <div class="cover-header-inner"> + <div class="cover-color-overlay color-accent<?php echo esc_attr( $color_overlay_classes ); ?>"<?php echo $color_overlay_style; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- We need to double check this, but for now, we want to pass PHPCS ;) ?>></div> + + <header class="entry-header has-text-align-center"> + <div class="entry-header-inner section-inner medium"> + + <?php + + /** + * Allow child themes and plugins to filter the display of the categories in the article header. + * + * @since Twenty Twenty 1.0 + * + * @param bool Whether to show the categories in article header, Default true. + */ + $show_categories = apply_filters( 'twentytwenty_show_categories_in_entry_header', true ); + + if ( true === $show_categories && has_category() ) { + ?> + + <div class="entry-categories"> + <span class="screen-reader-text"><?php _e( 'Categories', 'twentytwenty' ); ?></span> + <div class="entry-categories-inner"> + <?php the_category( ' ' ); ?> + </div><!-- .entry-categories-inner --> + </div><!-- .entry-categories --> + + <?php + } + + the_title( '<h1 class="entry-title">', '</h1>' ); + + if ( is_page() ) { + ?> + + <div class="to-the-content-wrapper"> + + <a href="#post-inner" class="to-the-content fill-children-current-color"> + <?php twentytwenty_the_theme_svg( 'arrow-down' ); ?> + <div class="screen-reader-text"><?php _e( 'Scroll Down', 'twentytwenty' ); ?></div> + </a><!-- .to-the-content --> + + </div><!-- .to-the-content-wrapper --> + + <?php + } else { + + $intro_text_width = ''; + + if ( is_singular() ) { + $intro_text_width = ' small'; + } else { + $intro_text_width = ' thin'; + } + + if ( has_excerpt() ) { + ?> + + <div class="intro-text section-inner max-percentage<?php echo esc_attr( $intro_text_width ); ?>"> + <?php the_excerpt(); ?> + </div> + + <?php + } + + twentytwenty_the_post_meta( get_the_ID(), 'single-top' ); + + } + ?> + + </div><!-- .entry-header-inner --> + </header><!-- .entry-header --> + + </div><!-- .cover-header-inner --> + </div><!-- .cover-header-inner-wrapper --> + </div><!-- .cover-header --> + + <div class="post-inner" id="post-inner"> + + <div class="entry-content"> + + <?php + the_content(); + ?> + + </div><!-- .entry-content --> + <?php + wp_link_pages( + array( + 'before' => '<nav class="post-nav-links bg-light-background" aria-label="' . esc_attr__( 'Page', 'twentytwenty' ) . '"><span class="label">' . __( 'Pages:', 'twentytwenty' ) . '</span>', + 'after' => '</nav>', + 'link_before' => '<span class="page-number">', + 'link_after' => '</span>', + ) + ); + + edit_post_link(); + // Single bottom post meta. + twentytwenty_the_post_meta( get_the_ID(), 'single-bottom' ); + + if ( post_type_supports( get_post_type( get_the_ID() ), 'author' ) && is_single() ) { + + get_template_part( 'template-parts/entry-author-bio' ); + + } + ?> + + </div><!-- .post-inner --> + + <?php + + if ( is_single() ) { + + get_template_part( 'template-parts/navigation' ); + } + + /** + * Output comments wrapper if it's a post, or if comments are open, + * or if there's a comment number – and check for password. + * */ + if ( ( is_single() || is_page() ) && ( comments_open() || get_comments_number() ) && ! post_password_required() ) { + ?> + + <div class="comments-wrapper section-inner"> + + <?php comments_template(); ?> + + </div><!-- .comments-wrapper --> + + <?php + } + ?> + +</article><!-- .post --> diff --git a/content/themes/twentytwenty/template-parts/content.php b/content/themes/twentytwenty/template-parts/content.php new file mode 100644 index 0000000..ed0cf51 --- /dev/null +++ b/content/themes/twentytwenty/template-parts/content.php @@ -0,0 +1,94 @@ +<?php +/** + * The default template for displaying content + * + * Used for both singular and index. + * + * @link https://developer.wordpress.org/themes/basics/template-hierarchy/ + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +?> + +<article <?php post_class(); ?> id="post-<?php the_ID(); ?>"> + + <?php + + get_template_part( 'template-parts/entry-header' ); + + if ( ! is_search() ) { + get_template_part( 'template-parts/featured-image' ); + } + + ?> + + <div class="post-inner <?php echo is_page_template( 'templates/template-full-width.php' ) ? '' : 'thin'; ?> "> + + <div class="entry-content"> + + <?php + if ( is_search() || ! is_singular() && 'summary' === get_theme_mod( 'blog_content', 'full' ) ) { + the_excerpt(); + } else { + the_content( __( 'Continue reading', 'twentytwenty' ) ); + } + ?> + + </div><!-- .entry-content --> + + </div><!-- .post-inner --> + + <div class="section-inner"> + <?php + wp_link_pages( + array( + 'before' => '<nav class="post-nav-links bg-light-background" aria-label="' . esc_attr__( 'Page', 'twentytwenty' ) . '"><span class="label">' . __( 'Pages:', 'twentytwenty' ) . '</span>', + 'after' => '</nav>', + 'link_before' => '<span class="page-number">', + 'link_after' => '</span>', + ) + ); + + edit_post_link(); + + // Single bottom post meta. + twentytwenty_the_post_meta( get_the_ID(), 'single-bottom' ); + + if ( post_type_supports( get_post_type( get_the_ID() ), 'author' ) && is_single() ) { + + get_template_part( 'template-parts/entry-author-bio' ); + + } + ?> + + </div><!-- .section-inner --> + + <?php + + if ( is_single() ) { + + get_template_part( 'template-parts/navigation' ); + + } + + /** + * Output comments wrapper if it's a post, or if comments are open, + * or if there's a comment number – and check for password. + * */ + if ( ( is_single() || is_page() ) && ( comments_open() || get_comments_number() ) && ! post_password_required() ) { + ?> + + <div class="comments-wrapper section-inner"> + + <?php comments_template(); ?> + + </div><!-- .comments-wrapper --> + + <?php + } + ?> + +</article><!-- .post --> diff --git a/content/themes/twentytwenty/template-parts/entry-author-bio.php b/content/themes/twentytwenty/template-parts/entry-author-bio.php new file mode 100644 index 0000000..b96fa31 --- /dev/null +++ b/content/themes/twentytwenty/template-parts/entry-author-bio.php @@ -0,0 +1,33 @@ +<?php +/** + * The template for displaying Author info + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +if ( (bool) get_the_author_meta( 'description' ) && (bool) get_theme_mod( 'show_author_bio', true ) ) : ?> +<div class="author-bio"> + <div class="author-title-wrapper"> + <div class="author-avatar vcard"> + <?php echo get_avatar( get_the_author_meta( 'ID' ), 160 ); ?> + </div> + <h2 class="author-title heading-size-4"> + <?php + printf( + /* translators: %s: Author name. */ + __( 'By %s', 'twentytwenty' ), + esc_html( get_the_author() ) + ); + ?> + </h2> + </div><!-- .author-name --> + <div class="author-description"> + <?php echo wp_kses_post( wpautop( get_the_author_meta( 'description' ) ) ); ?> + <a class="author-link" href="<?php echo esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ); ?>" rel="author"> + <?php _e( 'View Archive <span aria-hidden="true">→</span>', 'twentytwenty' ); ?> + </a> + </div><!-- .author-description --> +</div><!-- .author-bio --> +<?php endif; ?> diff --git a/content/themes/twentytwenty/template-parts/entry-header.php b/content/themes/twentytwenty/template-parts/entry-header.php new file mode 100644 index 0000000..b5b6909 --- /dev/null +++ b/content/themes/twentytwenty/template-parts/entry-header.php @@ -0,0 +1,75 @@ +<?php +/** + * Displays the post header + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +$entry_header_classes = ''; + +if ( is_singular() ) { + $entry_header_classes .= ' header-footer-group'; +} + +?> + +<header class="entry-header has-text-align-center<?php echo esc_attr( $entry_header_classes ); ?>"> + + <div class="entry-header-inner section-inner medium"> + + <?php + /** + * Allow child themes and plugins to filter the display of the categories in the entry header. + * + * @since Twenty Twenty 1.0 + * + * @param bool Whether to show the categories in header, Default true. + */ + $show_categories = apply_filters( 'twentytwenty_show_categories_in_entry_header', true ); + + if ( true === $show_categories && has_category() ) { + ?> + + <div class="entry-categories"> + <span class="screen-reader-text"><?php _e( 'Categories', 'twentytwenty' ); ?></span> + <div class="entry-categories-inner"> + <?php the_category( ' ' ); ?> + </div><!-- .entry-categories-inner --> + </div><!-- .entry-categories --> + + <?php + } + + if ( is_singular() ) { + the_title( '<h1 class="entry-title">', '</h1>' ); + } else { + the_title( '<h2 class="entry-title heading-size-1"><a href="' . esc_url( get_permalink() ) . '">', '</a></h2>' ); + } + + $intro_text_width = ''; + + if ( is_singular() ) { + $intro_text_width = ' small'; + } else { + $intro_text_width = ' thin'; + } + + if ( has_excerpt() && is_singular() ) { + ?> + + <div class="intro-text section-inner max-percentage<?php echo $intro_text_width; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- static output ?>"> + <?php the_excerpt(); ?> + </div> + + <?php + } + + // Default to displaying the post meta. + twentytwenty_the_post_meta( get_the_ID(), 'single-top' ); + ?> + + </div><!-- .entry-header-inner --> + +</header><!-- .entry-header --> diff --git a/content/themes/twentytwenty/template-parts/featured-image.php b/content/themes/twentytwenty/template-parts/featured-image.php new file mode 100644 index 0000000..8128378 --- /dev/null +++ b/content/themes/twentytwenty/template-parts/featured-image.php @@ -0,0 +1,43 @@ +<?php +/** + * Displays the featured image + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +if ( has_post_thumbnail() && ! post_password_required() ) { + + $featured_media_inner_classes = ''; + + // Make the featured media thinner on archive pages. + if ( ! is_singular() ) { + $featured_media_inner_classes .= ' medium'; + } + ?> + + <figure class="featured-media"> + + <div class="featured-media-inner section-inner<?php echo $featured_media_inner_classes; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- static output ?>"> + + <?php + the_post_thumbnail(); + + $caption = get_the_post_thumbnail_caption(); + + if ( $caption ) { + ?> + + <figcaption class="wp-caption-text"><?php echo esc_html( $caption ); ?></figcaption> + + <?php + } + ?> + + </div><!-- .featured-media-inner --> + + </figure><!-- .featured-media --> + + <?php +} diff --git a/content/themes/twentytwenty/template-parts/footer-menus-widgets.php b/content/themes/twentytwenty/template-parts/footer-menus-widgets.php new file mode 100644 index 0000000..bb3e696 --- /dev/null +++ b/content/themes/twentytwenty/template-parts/footer-menus-widgets.php @@ -0,0 +1,119 @@ +<?php +/** + * Displays the menus and widgets at the end of the main element. + * Visually, this output is presented as part of the footer element. + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +$has_footer_menu = has_nav_menu( 'footer' ); +$has_social_menu = has_nav_menu( 'social' ); + +$has_sidebar_1 = is_active_sidebar( 'sidebar-1' ); +$has_sidebar_2 = is_active_sidebar( 'sidebar-2' ); + +// Only output the container if there are elements to display. +if ( $has_footer_menu || $has_social_menu || $has_sidebar_1 || $has_sidebar_2 ) { + ?> + + <div class="footer-nav-widgets-wrapper header-footer-group"> + + <div class="footer-inner section-inner"> + + <?php + + $footer_top_classes = ''; + + $footer_top_classes .= $has_footer_menu ? ' has-footer-menu' : ''; + $footer_top_classes .= $has_social_menu ? ' has-social-menu' : ''; + + if ( $has_footer_menu || $has_social_menu ) { + ?> + <div class="footer-top<?php echo $footer_top_classes; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- static output ?>"> + <?php if ( $has_footer_menu ) { ?> + + <nav aria-label="<?php esc_attr_e( 'Footer', 'twentytwenty' ); ?>" role="navigation" class="footer-menu-wrapper"> + + <ul class="footer-menu reset-list-style"> + <?php + wp_nav_menu( + array( + 'container' => '', + 'depth' => 1, + 'items_wrap' => '%3$s', + 'theme_location' => 'footer', + ) + ); + ?> + </ul> + + </nav><!-- .site-nav --> + + <?php } ?> + <?php if ( $has_social_menu ) { ?> + + <nav aria-label="<?php esc_attr_e( 'Social links', 'twentytwenty' ); ?>" class="footer-social-wrapper"> + + <ul class="social-menu footer-social reset-list-style social-icons fill-children-current-color"> + + <?php + wp_nav_menu( + array( + 'theme_location' => 'social', + 'container' => '', + 'container_class' => '', + 'items_wrap' => '%3$s', + 'menu_id' => '', + 'menu_class' => '', + 'depth' => 1, + 'link_before' => '<span class="screen-reader-text">', + 'link_after' => '</span>', + 'fallback_cb' => '', + ) + ); + ?> + + </ul><!-- .footer-social --> + + </nav><!-- .footer-social-wrapper --> + + <?php } ?> + </div><!-- .footer-top --> + + <?php } ?> + + <?php if ( $has_sidebar_1 || $has_sidebar_2 ) { ?> + + <aside class="footer-widgets-outer-wrapper" role="complementary"> + + <div class="footer-widgets-wrapper"> + + <?php if ( $has_sidebar_1 ) { ?> + + <div class="footer-widgets column-one grid-item"> + <?php dynamic_sidebar( 'sidebar-1' ); ?> + </div> + + <?php } ?> + + <?php if ( $has_sidebar_2 ) { ?> + + <div class="footer-widgets column-two grid-item"> + <?php dynamic_sidebar( 'sidebar-2' ); ?> + </div> + + <?php } ?> + + </div><!-- .footer-widgets-wrapper --> + + </aside><!-- .footer-widgets-outer-wrapper --> + + <?php } ?> + + </div><!-- .footer-inner --> + + </div><!-- .footer-nav-widgets-wrapper --> + +<?php } ?> diff --git a/content/themes/twentytwenty/template-parts/modal-menu.php b/content/themes/twentytwenty/template-parts/modal-menu.php new file mode 100644 index 0000000..f1d86e3 --- /dev/null +++ b/content/themes/twentytwenty/template-parts/modal-menu.php @@ -0,0 +1,148 @@ +<?php +/** + * Displays the menu icon and modal + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +?> + +<div class="menu-modal cover-modal header-footer-group" data-modal-target-string=".menu-modal"> + + <div class="menu-modal-inner modal-inner"> + + <div class="menu-wrapper section-inner"> + + <div class="menu-top"> + + <button class="toggle close-nav-toggle fill-children-current-color" data-toggle-target=".menu-modal" data-toggle-body-class="showing-menu-modal" aria-expanded="false" data-set-focus=".menu-modal"> + <span class="toggle-text"><?php _e( 'Close Menu', 'twentytwenty' ); ?></span> + <?php twentytwenty_the_theme_svg( 'cross' ); ?> + </button><!-- .nav-toggle --> + + <?php + + $mobile_menu_location = ''; + + // If the mobile menu location is not set, use the primary and expanded locations as fallbacks, in that order. + if ( has_nav_menu( 'mobile' ) ) { + $mobile_menu_location = 'mobile'; + } elseif ( has_nav_menu( 'primary' ) ) { + $mobile_menu_location = 'primary'; + } elseif ( has_nav_menu( 'expanded' ) ) { + $mobile_menu_location = 'expanded'; + } + + if ( has_nav_menu( 'expanded' ) ) { + + $expanded_nav_classes = ''; + + if ( 'expanded' === $mobile_menu_location ) { + $expanded_nav_classes .= ' mobile-menu'; + } + + ?> + + <nav class="expanded-menu<?php echo esc_attr( $expanded_nav_classes ); ?>" aria-label="<?php esc_attr_e( 'Expanded', 'twentytwenty' ); ?>" role="navigation"> + + <ul class="modal-menu reset-list-style"> + <?php + if ( has_nav_menu( 'expanded' ) ) { + wp_nav_menu( + array( + 'container' => '', + 'items_wrap' => '%3$s', + 'show_toggles' => true, + 'theme_location' => 'expanded', + ) + ); + } + ?> + </ul> + + </nav> + + <?php + } + + if ( 'expanded' !== $mobile_menu_location ) { + ?> + + <nav class="mobile-menu" aria-label="<?php esc_attr_e( 'Mobile', 'twentytwenty' ); ?>" role="navigation"> + + <ul class="modal-menu reset-list-style"> + + <?php + if ( $mobile_menu_location ) { + + wp_nav_menu( + array( + 'container' => '', + 'items_wrap' => '%3$s', + 'show_toggles' => true, + 'theme_location' => $mobile_menu_location, + ) + ); + + } else { + + wp_list_pages( + array( + 'match_menu_classes' => true, + 'show_toggles' => true, + 'title_li' => false, + 'walker' => new TwentyTwenty_Walker_Page(), + ) + ); + + } + ?> + + </ul> + + </nav> + + <?php + } + ?> + + </div><!-- .menu-top --> + + <div class="menu-bottom"> + + <?php if ( has_nav_menu( 'social' ) ) { ?> + + <nav aria-label="<?php esc_attr_e( 'Expanded Social links', 'twentytwenty' ); ?>" role="navigation"> + <ul class="social-menu reset-list-style social-icons fill-children-current-color"> + + <?php + wp_nav_menu( + array( + 'theme_location' => 'social', + 'container' => '', + 'container_class' => '', + 'items_wrap' => '%3$s', + 'menu_id' => '', + 'menu_class' => '', + 'depth' => 1, + 'link_before' => '<span class="screen-reader-text">', + 'link_after' => '</span>', + 'fallback_cb' => '', + ) + ); + ?> + + </ul> + </nav><!-- .social-menu --> + + <?php } ?> + + </div><!-- .menu-bottom --> + + </div><!-- .menu-wrapper --> + + </div><!-- .menu-modal-inner --> + +</div><!-- .menu-modal --> diff --git a/content/themes/twentytwenty/template-parts/modal-search.php b/content/themes/twentytwenty/template-parts/modal-search.php new file mode 100644 index 0000000..f0b51bd --- /dev/null +++ b/content/themes/twentytwenty/template-parts/modal-search.php @@ -0,0 +1,34 @@ +<?php +/** + * Displays the search icon and modal + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +?> +<div class="search-modal cover-modal header-footer-group" data-modal-target-string=".search-modal"> + + <div class="search-modal-inner modal-inner"> + + <div class="section-inner"> + + <?php + get_search_form( + array( + 'label' => __( 'Search for:', 'twentytwenty' ), + ) + ); + ?> + + <button class="toggle search-untoggle close-search-toggle fill-children-current-color" data-toggle-target=".search-modal" data-toggle-body-class="showing-search-modal" data-set-focus=".search-modal .search-field" aria-expanded="false"> + <span class="screen-reader-text"><?php _e( 'Close search', 'twentytwenty' ); ?></span> + <?php twentytwenty_the_theme_svg( 'cross' ); ?> + </button><!-- .search-toggle --> + + </div><!-- .section-inner --> + + </div><!-- .search-modal-inner --> + +</div><!-- .menu-modal --> diff --git a/content/themes/twentytwenty/template-parts/navigation.php b/content/themes/twentytwenty/template-parts/navigation.php new file mode 100644 index 0000000..b9e339b --- /dev/null +++ b/content/themes/twentytwenty/template-parts/navigation.php @@ -0,0 +1,61 @@ +<?php +/** + * Displays the next and previous post navigation in single posts. + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +$next_post = get_next_post(); +$prev_post = get_previous_post(); + +if ( $next_post || $prev_post ) { + + $pagination_classes = ''; + + if ( ! $next_post ) { + $pagination_classes = ' only-one only-prev'; + } elseif ( ! $prev_post ) { + $pagination_classes = ' only-one only-next'; + } + + ?> + + <nav class="pagination-single section-inner<?php echo esc_attr( $pagination_classes ); ?>" aria-label="<?php esc_attr_e( 'Post', 'twentytwenty' ); ?>" role="navigation"> + + <hr class="styled-separator is-style-wide" aria-hidden="true" /> + + <div class="pagination-single-inner"> + + <?php + if ( $prev_post ) { + ?> + + <a class="previous-post" href="<?php echo esc_url( get_permalink( $prev_post->ID ) ); ?>"> + <span class="arrow" aria-hidden="true">←</span> + <span class="title"><span class="title-inner"><?php echo wp_kses_post( get_the_title( $prev_post->ID ) ); ?></span></span> + </a> + + <?php + } + + if ( $next_post ) { + ?> + + <a class="next-post" href="<?php echo esc_url( get_permalink( $next_post->ID ) ); ?>"> + <span class="arrow" aria-hidden="true">→</span> + <span class="title"><span class="title-inner"><?php echo wp_kses_post( get_the_title( $next_post->ID ) ); ?></span></span> + </a> + <?php + } + ?> + + </div><!-- .pagination-single-inner --> + + <hr class="styled-separator is-style-wide" aria-hidden="true" /> + + </nav><!-- .pagination-single --> + + <?php +} diff --git a/content/themes/twentytwenty/template-parts/pagination.php b/content/themes/twentytwenty/template-parts/pagination.php new file mode 100644 index 0000000..23c8bfb --- /dev/null +++ b/content/themes/twentytwenty/template-parts/pagination.php @@ -0,0 +1,58 @@ +<?php +/** + * A template partial to output pagination for the Twenty Twenty default theme. + * + * @link https://developer.wordpress.org/themes/basics/template-files/#template-partials + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +/** + * Translators: + * This text contains HTML to allow the text to be shorter on small screens. + * The text inside the span with the class nav-short will be hidden on small screens. + */ + +$prev_text = sprintf( + '%s <span class="nav-prev-text">%s</span>', + '<span aria-hidden="true">←</span>', + __( 'Newer <span class="nav-short">Posts</span>', 'twentytwenty' ) +); +$next_text = sprintf( + '<span class="nav-next-text">%s</span> %s', + __( 'Older <span class="nav-short">Posts</span>', 'twentytwenty' ), + '<span aria-hidden="true">→</span>' +); + +$posts_pagination = get_the_posts_pagination( + array( + 'mid_size' => 1, + 'prev_text' => $prev_text, + 'next_text' => $next_text, + ) +); + +// If we're not outputting the previous page link, prepend a placeholder with `visibility: hidden` to take its place. +if ( strpos( $posts_pagination, 'prev page-numbers' ) === false ) { + $posts_pagination = str_replace( '<div class="nav-links">', '<div class="nav-links"><span class="prev page-numbers placeholder" aria-hidden="true">' . $prev_text . '</span>', $posts_pagination ); +} + +// If we're not outputting the next page link, append a placeholder with `visibility: hidden` to take its place. +if ( strpos( $posts_pagination, 'next page-numbers' ) === false ) { + $posts_pagination = str_replace( '</div>', '<span class="next page-numbers placeholder" aria-hidden="true">' . $next_text . '</span></div>', $posts_pagination ); +} + +if ( $posts_pagination ) { ?> + + <div class="pagination-wrapper section-inner"> + + <hr class="styled-separator pagination-separator is-style-wide" aria-hidden="true" /> + + <?php echo $posts_pagination; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- already escaped during generation. ?> + + </div><!-- .pagination-wrapper --> + + <?php +} diff --git a/content/themes/twentytwenty/templates/template-cover.php b/content/themes/twentytwenty/templates/template-cover.php new file mode 100644 index 0000000..20e20cf --- /dev/null +++ b/content/themes/twentytwenty/templates/template-cover.php @@ -0,0 +1,33 @@ +<?php +/** + * Template Name: Cover Template + * Template Post Type: post, page + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +get_header(); +?> + +<main id="site-content" role="main"> + + <?php + + if ( have_posts() ) { + + while ( have_posts() ) { + the_post(); + + get_template_part( 'template-parts/content-cover' ); + } + } + + ?> + +</main><!-- #site-content --> + +<?php get_template_part( 'template-parts/footer-menus-widgets' ); ?> + +<?php get_footer(); ?> diff --git a/content/themes/twentytwenty/templates/template-full-width.php b/content/themes/twentytwenty/templates/template-full-width.php new file mode 100644 index 0000000..97ea256 --- /dev/null +++ b/content/themes/twentytwenty/templates/template-full-width.php @@ -0,0 +1,11 @@ +<?php +/** + * Template Name: Full Width Template + * Template Post Type: post, page + * + * @package WordPress + * @subpackage Twenty_Twenty + * @since Twenty Twenty 1.0 + */ + +get_template_part( 'singular' ); diff --git a/index.php b/index.php new file mode 100644 index 0000000..cc2a532 --- /dev/null +++ b/index.php @@ -0,0 +1,17 @@ +<?php +/** + * Front to the WordPress application. This file doesn't do anything, but loads + * wp-blog-header.php which does and tells WordPress to load the theme. + * + * @package WordPress + */ + +/** + * Tells WordPress to load the WordPress theme and output it. + * + * @var bool + */ +define( 'WP_USE_THEMES', true ); + +/** Loads the WordPress Environment and Template */ +require __DIR__ . '/wp-blog-header.php'; diff --git a/web/assets/bootstrap/css/bootstrap.min.css b/web/assets/bootstrap/css/bootstrap.min.css deleted file mode 100644 index 186aa69..0000000 --- a/web/assets/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map *//*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/web/assets/bootstrap/js/bootstrap.min.js b/web/assets/bootstrap/js/bootstrap.min.js deleted file mode 100644 index 133aeec..0000000 --- a/web/assets/bootstrap/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under the MIT license - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")), -d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/web/assets/css/styles.css b/web/assets/css/styles.css deleted file mode 100644 index 4e881e1..0000000 --- a/web/assets/css/styles.css +++ /dev/null @@ -1,242 +0,0 @@ -html{ - background-color:#FFF; - background-image:none; -} - -html, body{ - width:100%; - height:auto; - background-image:url(../../assets/img/fondMotif.jpg); - position:relative; - font-family:'Quicksand'; - overflow-x:hidden; - max-width:1480px; - margin:0 auto; - text-align:center; -} - -/**********/ -/* HEADER */ - -header::before{ - position:absolute; - width:100%; - height:6px; - display:block; - content:""; - background-color:#FF9700; - z-index:3; - top:0; - left:0; -} - -header::after{ - position:absolute; - width:120%; - height:100px; - display:block; - content:""; - background-color:#021B45; - border-radius:45%; - top:-20px; - left:-10%; -} - -header.row{ - text-align:center; -} -header .row div{ - z-index:5; - padding-top: 17px; - height:175px; -} -@media(max-width:380px) { - header .row div img{ - width:100%; - position:relative; - z-index:5; - - } -} - -@media (min-width:1300px) { - header .row div img{ - position:relative; - z-index:5; - } -} - - -/**********/ -/* CONTENT */ - -/* première ligne */ - - -p#slogan{ - color:#021B45; - position: absolute; - left: 0; - right:0; - margin-top: 50px; - -} - -@media (max-width:768px){ - p#slogan{ - position: relative; - } -} - -@media (max-width:380px){ -p#slogan{ - margin:12px 0; - } -} - -p#slogan span{ - display:block; -} - - -img#les-garnies{ - width:100%; - height:auto; - max-width:100%; -} - - -img#les-snacking{ - width:100%; - max-width:100%; - height:auto; -} - - -/* seconde ligne */ - - -#p-site-en-construction{ - color:#FF9700; - position: absolute; - left: 0; - right:0; - -} - -@media (max-width:767px) { -#p-site-en-construction{ - position:static; - } -} - -#p-site-en-construction span{ - display:block; -} - - -#lfb-like { - position:absolute; - left:0; - right:0; - bottom:33px; - margin:auto; - -} - -@media (max-width:768px){ - #lfb-like{ - position: static; - margin: 25px 0; - display: block; - } -} - -@media (max-width:767px) { - img#fb-img{ - margin-top:7px; - margin-bottom:15px; - } -} - -img#les-bio{ - width:100%; - max-width:100%; - height:auto; -} - -img#les-sans-gluten{ - width:100%; - max-width:100%; - height:auto; -} - - -@media (min-width:767px) { - div#row-down.row{ - position:relative; - } -} - - -/**********/ -/* FOOTER */ - -footer p{ - background-color:#021B45; - color:#FFFFFF; - margin:0; - font-size:15px; -} - -@media (max-width:380px){ - footer p{ - text-align:center; - position:relative; - font-size:10px; - } -} - -@media (min-width:768px) { - footer span{ - display:inline; - } -} - -footerspan{ - display:block; -} - -@media(max-width:767px) { - p{ - text-align:center; - position:relative; - font-size:22px; - } -} - -@media (max-width:380px){ - p{ - text-align:center; - position:relative; - font-size:15px; - } -} - - -@media (min-width:767px) { - p{ - text-align:center; - margin-top:0%; - font-size:16px; - left:0; - } -} - -@media (min-width:1200px) { - p{ - text-align:center; - position:relative; - font-size:22px; - } -} diff --git a/web/assets/img/Regalette---Logo.png b/web/assets/img/Regalette---Logo.png deleted file mode 100644 index 26186ced90ee372a2af128d9674a99a889f06034..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14809 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 diff --git a/web/assets/img/Regalette---LogoFB.png b/web/assets/img/Regalette---LogoFB.png deleted file mode 100644 index 3a8e5e1a644056212ee4fa3502f60ebea1f3ebb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I$HP)<h;3K|Lk000e1NJLTq001Wd001Wl1^@s6jH6LC0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz#Ysd#RCwBAV88<Y{r~U4FbDu6h!Bu< z=VoMNT=f6{e{Ud{eSqEc6X=#LK)1xRfOyPIOaXuY{R?6k9Dp6@uwW)8ru9r99?)T` z41)~(`}a?UiD3|fLG3sedRe5et->H6z{9}J$<FZS?>~m`KYuX*(-y<~4__FrUcWam zjw{RzW5~`3VGt7J!zzFD#3csburm5O4p<y8Y*^OLU~6qK_|jZkT{=Y$qnYFQ`M4QU z6a5BfhKP^yVgMGRSmi!_`pR(m+FdyR^3{9vb)342ELQPlt9CKeHqT~w|MBy{MXRi= z1Xl5ut_4IpjAo8wWW+B1;?=w1Q$vh8ZorC?qMQhZqU;FN1{nt%R<%!WY{U@jowA&v zZ^{bVIF6N-g@KEkgDAC}T$qjQj~~Ab-e|pf=h5JG+}E!^2B+hG{rnBAzV6U2L)?Gx zoMGR=vnXOl`f9+2B`=2By$8;q@bBDt3~qQ5>KZlxsd{RK$mUgD4AvHU7~(>59;6u4 zFj@$YI&Rc)qmCPO+^FM*s^gfMm~Ia`hXLIL8`<2z$jG=3$oxr53qgZB_%IOs2jU+< l_S%2{{%su0vC04tU;sd2gS5^`A~gU2002ovPDHLkV1k3j|Jncm diff --git a/web/assets/img/bio-image.png b/web/assets/img/bio-image.png deleted file mode 100644 index b972b10a3edee5aad74e845e10184f0540d5d584..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126980 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℞c^FH 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 diff --git a/web/assets/img/fondMotif.jpg b/web/assets/img/fondMotif.jpg deleted file mode 100644 index 576410f6cc70d5fd9cfe56377531c57711ca4a52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11089 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 V!G{wgsrqFv%1n<kx0r4}{Xfxy@Qwfg diff --git a/web/assets/img/glutenless.png b/web/assets/img/glutenless.png deleted file mode 100644 index fa0058bb25faa2c74fe30823e662cb5eceea3243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132133 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%0DWn26qolb+3Cnp6& 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 CS;TJ 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 diff --git a/web/assets/img/regalette.png b/web/assets/img/regalette.png deleted file mode 100644 index 388a7a6907868a9a2049be86a751398b55c5f563..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82170 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 o@>p35#(6-7Lu^(t<wgc2$JT{im_}KFlnb*%a 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 Z2NUuiqTi&K2XmI9cfv?F|Cn9q{{cC`+bIA5 diff --git a/web/assets/img/regalette2016.png b/web/assets/img/regalette2016.png deleted file mode 100644 index 45ce3ab3cb6772f9ddffc5be15fa6956984406a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62882 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Íl(sn$c)%*4Gpwtt5%14K(t6j>wR_f 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 diff --git a/web/assets/img/version2-les-garnies.png b/web/assets/img/version2-les-garnies.png deleted file mode 100644 index 7da99ffe937a0b3dc43d64065267c52a7654ca88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205472 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 Op;Ra5!i1 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 diff --git a/web/assets/img/version2images-bios.png b/web/assets/img/version2images-bios.png deleted file mode 100644 index 958eb0957cbb52bab56e37a1425d6a4881c29a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127288 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%0ABCaU$mpi&%{h3*L3kXdip(Njb72i`C+N~p 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 diff --git a/web/assets/img/version2images-sans-glutent.png b/web/assets/img/version2images-sans-glutent.png deleted file mode 100644 index b7d926e2ffa6e763be20edb7ef18d1e6b7ddf3f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130680 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%0De)%hx;U_<R89Vn3<Is^&xLqdr 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 P$3qVEMH(q(6!3ol3PA=v diff --git a/web/assets/img/version2images-snacking.png b/web/assets/img/version2images-snacking.png deleted file mode 100644 index f409c103fa7655a6b4a2173eaf573f0a22f269df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165343 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 aQ-Dy}X1!Bp$#=l}PhLhvx=PYC<o^Sb4a{)> diff --git a/web/assets/js/jquery.min.js b/web/assets/js/jquery.min.js deleted file mode 100644 index 0f60b7b..0000000 --- a/web/assets/js/jquery.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; - -return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){ -return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m}); diff --git a/web/index.html b/web/index.html deleted file mode 100644 index 5ddedb0..0000000 --- a/web/index.html +++ /dev/null @@ -1,79 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Régalette - - - - - - - - - - - - - - - - - - -
      - - - -
      -
      -
      -
      -
      - -
      -

      Les ateliers Régalette, "Savoir imaginer et Savoir faire"

      - -
      - -
      - -
      - -
      -
      - - -
      - -
      - -
      -
      - - -
      - -

      Site en construction

      - -
      - - -
      - -
      - - - - - - - - diff --git a/wp-activate.php b/wp-activate.php new file mode 100644 index 0000000..446cb73 --- /dev/null +++ b/wp-activate.php @@ -0,0 +1,214 @@ +get_error_code() ) ) { + status_header( 404 ); +} elseif ( is_wp_error( $result ) ) { + $error_code = $result->get_error_code(); + + if ( ! in_array( $error_code, $valid_error_codes ) ) { + status_header( 400 ); + } +} + +nocache_headers(); + +if ( is_object( $wp_object_cache ) ) { + $wp_object_cache->cache_enabled = false; +} + +// Fix for page title. +$wp_query->is_404 = false; + +/** + * Fires before the Site Activation page is loaded. + * + * @since 3.0.0 + */ +do_action( 'activate_header' ); + +/** + * Adds an action hook specific to this page. + * + * Fires on {@see 'wp_head'}. + * + * @since MU (3.0.0) + */ +function do_activate_header() { + /** + * Fires before the Site Activation page is loaded. + * + * Fires on the {@see 'wp_head'} action. + * + * @since 3.0.0 + */ + do_action( 'activate_wp_head' ); +} +add_action( 'wp_head', 'do_activate_header' ); + +/** + * Loads styles specific to this page. + * + * @since MU (3.0.0) + */ +function wpmu_activate_stylesheet() { + ?> + + + +
      +
      + + +

      +
      +

      + +
      +

      +

      + +

      +
      + + get_error_code(), $valid_error_codes ) ) { + $signup = $result->get_error_data(); + ?> +

      + '; + if ( '' === $signup->domain . $signup->path ) { + printf( + /* translators: 1: Login URL, 2: Username, 3: User email address, 4: Lost password URL. */ + __( 'Your account has been activated. You may now log in to the site using your chosen username of “%2$s”. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can reset your password.' ), + network_site_url( 'wp-login.php', 'login' ), + $signup->user_login, + $signup->user_email, + wp_lostpassword_url() + ); + } else { + printf( + /* translators: 1: Site URL, 2: Username, 3: User email address, 4: Lost password URL. */ + __( 'Your site at %1$s is active. You may now log in to your site using your chosen username of “%2$s”. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can reset your password.' ), + sprintf( '%1$s', $signup->domain ), + $signup->user_login, + $signup->user_email, + wp_lostpassword_url() + ); + } + echo '

      '; + } elseif ( null === $result || is_wp_error( $result ) ) { + ?> +

      + +

      get_error_message(); ?>

      + + +

      + +
      +

      user_login; ?>

      +

      +
      + + +

      + View your site or Log in' ), $url, esc_url( $login_url ) ); + ?> +

      + +

      + Log in or go back to the homepage.' ), network_site_url( 'wp-login.php', 'login' ), network_home_url() ); + ?> +

      + +
      +
      + + +
      + +
      +
      +

      + + +

      +
      + +
      +

      + +

      +
      + + +
      + +
      +

      + +

      +
      + +
      + +
      +
      +

      +

      + Version %1$s addressed some security issues and fixed %2$s bug.', + 'Version %1$s addressed some security issues and fixed %2$s bugs.', + 23 + ), + '5.4.2', + number_format_i18n( 23 ) + ); + ?> + the release notes.' ), + sprintf( + /* translators: %s: WordPress version */ + esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ), + sanitize_title( '5.4.2' ) + ) + ); + ?> +

      +

      + Version %1$s addressed some security issues and fixed %2$s bug.', + 'Version %1$s addressed some security issues and fixed %2$s bugs.', + 11 + ), + '5.4.1', + number_format_i18n( 11 ) + ); + ?> + the release notes.' ), + sprintf( + /* translators: %s: WordPress version */ + esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ), + sanitize_title( '5.4.1' ) + ) + ); + ?> +

      +
      +
      + +
      + +
      +

      + +

      +
      +

      + +

      +

      + + +

      +
      +
      +

      + +

      +

      + +

      +
      +
      + +
      + +
      +
      +
      + +
      +
      +
      +

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

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

      Gutenberg plugin. You’ll get to be the first to use new and exciting features in the block editor, before anyone else has seen them!' ); ?>

      +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      +

      +

      +

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

      +
      +
      + +
      + +
      +
      + +
      +
      + +
      + +
      +
      +

      +

      + +

      +

      + wp_nav_menu_item_custom_fields' + ); + ?> +

      +

      + wp_nav_menu_item_custom_fields_customize_template' + ); + ?> +

      +

      + +

      +
      +
      +

      +
        +
      • Radically simpler block styling. Negative margins and default padding are gone! Now you can style blocks the way you need them. And, a refactor got rid of four redundant wrapper divs.' ); ?>
      • +
      • +
      • +
      • +
      +
      +
      + +
      + +
      +
      +

      + WordPress 5.4 Field Guide.' ), + 'https://make.wordpress.org/core/2020/03/03/wordpress-5-4-field-guide/' + ); + ?> +

      +
      +
      + +
      + +
      + + + + | + + +
      +
      +Version %s addressed one security issue.' ); +/* translators: %s: WordPress version number. */ +__( 'Version %s addressed some security issues.' ); + +/* translators: 1: WordPress version number, 2: Plural number of bugs. */ +_n_noop( + 'Version %1$s addressed %2$s bug.', + 'Version %1$s addressed %2$s bugs.' +); + +/* translators: 1: WordPress version number, 2: Plural number of bugs. Singular security issue. */ +_n_noop( + 'Version %1$s addressed a security issue and fixed %2$s bug.', + 'Version %1$s addressed a security issue and fixed %2$s bugs.' +); + +/* translators: 1: WordPress version number, 2: Plural number of bugs. More than one security issue. */ +_n_noop( + 'Version %1$s addressed some security issues and fixed %2$s bug.', + 'Version %1$s addressed some security issues and fixed %2$s bugs.' +); + +/* translators: %s: Documentation URL. */ +__( 'For more information, see the release notes.' ); diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php new file mode 100644 index 0000000..d3dc4da --- /dev/null +++ b/wp-admin/admin-ajax.php @@ -0,0 +1,193 @@ + + +
      +
      +
      + + + + +
      + + + diff --git a/wp-admin/admin-functions.php b/wp-admin/admin-functions.php new file mode 100644 index 0000000..a9ff3f4 --- /dev/null +++ b/wp-admin/admin-functions.php @@ -0,0 +1,15 @@ +site_name ) ); +} elseif ( is_user_admin() ) { + /* translators: User dashboard screen title. %s: Network title. */ + $admin_title = sprintf( __( 'User Dashboard: %s' ), esc_html( get_network()->site_name ) ); +} else { + $admin_title = get_bloginfo( 'name' ); +} + +if ( $admin_title == $title ) { + /* translators: Admin screen title. %s: Admin screen name. */ + $admin_title = sprintf( __( '%s — WordPress' ), $title ); +} else { + /* translators: Admin screen title. 1: Admin screen name, 2: Network or site name. */ + $admin_title = sprintf( __( '%1$s ‹ %2$s — WordPress' ), $title, $admin_title ); +} + +if ( wp_is_recovery_mode() ) { + /* translators: %s: Admin screen title. */ + $admin_title = sprintf( __( 'Recovery Mode — %s' ), $admin_title ); +} + +/** + * Filters the title tag content for an admin page. + * + * @since 3.1.0 + * + * @param string $admin_title The page title, with extra context added. + * @param string $title The original page title. + */ +$admin_title = apply_filters( 'admin_title', $admin_title, $title ); + +wp_user_settings(); + +_wp_admin_html_begin(); +?> +<?php echo $admin_title; ?> + + + +post_type ) { + $admin_body_class .= ' post-type-' . $current_screen->post_type; +} + +if ( $current_screen->taxonomy ) { + $admin_body_class .= ' taxonomy-' . $current_screen->taxonomy; +} + +$admin_body_class .= ' branch-' . str_replace( array( '.', ',' ), '-', floatval( get_bloginfo( 'version' ) ) ); +$admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', get_bloginfo( 'version' ) ) ); +$admin_body_class .= ' admin-color-' . sanitize_html_class( get_user_option( 'admin_color' ), 'fresh' ); +$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) ); + +if ( wp_is_mobile() ) { + $admin_body_class .= ' mobile'; +} + +if ( is_multisite() ) { + $admin_body_class .= ' multisite'; +} + +if ( is_network_admin() ) { + $admin_body_class .= ' network-admin'; +} + +$admin_body_class .= ' no-customize-support no-svg'; + +if ( $current_screen->is_block_editor() ) { + // Default to is-fullscreen-mode to avoid jumps in the UI. + $admin_body_class .= ' block-editor-page is-fullscreen-mode wp-embed-responsive'; + + if ( current_theme_supports( 'editor-styles' ) && current_theme_supports( 'dark-editor-style' ) ) { + $admin_body_class .= ' is-dark-theme'; + } +} + +?> + + + + + + + +
      + +
      + + + +
      +set_parentage( $parent_file ); + +?> + +
      +render_screen_meta(); + +if ( is_network_admin() ) { + /** + * Prints network admin screen notices. + * + * @since 3.1.0 + */ + do_action( 'network_admin_notices' ); +} elseif ( is_user_admin() ) { + /** + * Prints user admin screen notices. + * + * @since 3.1.0 + */ + do_action( 'user_admin_notices' ); +} else { + /** + * Prints admin screen notices. + * + * @since 3.1.0 + */ + do_action( 'admin_notices' ); +} + +/** + * Prints generic admin screen notices. + * + * @since 3.1.0 + */ +do_action( 'all_admin_notices' ); + +if ( 'options-general.php' === $parent_file ) { + require ABSPATH . 'wp-admin/options-head.php'; +} diff --git a/wp-admin/admin-post.php b/wp-admin/admin-post.php new file mode 100644 index 0000000..803a006 --- /dev/null +++ b/wp-admin/admin-post.php @@ -0,0 +1,72 @@ + 50 && mt_rand( 0, (int) ( $c / 50 ) ) === 1 ) ) { + require_once ABSPATH . WPINC . '/http.php'; + $response = wp_remote_get( + admin_url( 'upgrade.php?step=1' ), + array( + 'timeout' => 120, + 'httpversion' => '1.1', + ) + ); + /** This action is documented in wp-admin/network/upgrade.php */ + do_action( 'after_mu_upgrade', $response ); + unset( $response ); + } + unset( $c ); + } +} + +require_once ABSPATH . 'wp-admin/includes/admin.php'; + +auth_redirect(); + +// Schedule Trash collection. +if ( ! wp_next_scheduled( 'wp_scheduled_delete' ) && ! wp_installing() ) { + wp_schedule_event( time(), 'daily', 'wp_scheduled_delete' ); +} + +// Schedule transient cleanup. +if ( ! wp_next_scheduled( 'delete_expired_transients' ) && ! wp_installing() ) { + wp_schedule_event( time(), 'daily', 'delete_expired_transients' ); +} + +set_screen_options(); + +$date_format = __( 'F j, Y' ); +$time_format = __( 'g:i a' ); + +wp_enqueue_script( 'common' ); + +/** + * $pagenow is set in vars.php + * $wp_importers is sometimes set in wp-admin/includes/import.php + * The remaining variables are imported as globals elsewhere, declared as globals here + * + * @global string $pagenow + * @global array $wp_importers + * @global string $hook_suffix + * @global string $plugin_page + * @global string $typenow + * @global string $taxnow + */ +global $pagenow, $wp_importers, $hook_suffix, $plugin_page, $typenow, $taxnow; + +$page_hook = null; + +$editing = false; + +if ( isset( $_GET['page'] ) ) { + $plugin_page = wp_unslash( $_GET['page'] ); + $plugin_page = plugin_basename( $plugin_page ); +} + +if ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) ) { + $typenow = $_REQUEST['post_type']; +} else { + $typenow = ''; +} + +if ( isset( $_REQUEST['taxonomy'] ) && taxonomy_exists( $_REQUEST['taxonomy'] ) ) { + $taxnow = $_REQUEST['taxonomy']; +} else { + $taxnow = ''; +} + +if ( WP_NETWORK_ADMIN ) { + require ABSPATH . 'wp-admin/network/menu.php'; +} elseif ( WP_USER_ADMIN ) { + require ABSPATH . 'wp-admin/user/menu.php'; +} else { + require ABSPATH . 'wp-admin/menu.php'; +} + +if ( current_user_can( 'manage_options' ) ) { + wp_raise_memory_limit( 'admin' ); +} + +/** + * Fires as an admin screen or script is being initialized. + * + * Note, this does not just run on user-facing admin screens. + * It runs on admin-ajax.php and admin-post.php as well. + * + * This is roughly analogous to the more general {@see 'init'} hook, which fires earlier. + * + * @since 2.5.0 + */ +do_action( 'admin_init' ); + +if ( isset( $plugin_page ) ) { + if ( ! empty( $typenow ) ) { + $the_parent = $pagenow . '?post_type=' . $typenow; + } else { + $the_parent = $pagenow; + } + + $page_hook = get_plugin_page_hook( $plugin_page, $the_parent ); + if ( ! $page_hook ) { + $page_hook = get_plugin_page_hook( $plugin_page, $plugin_page ); + + // Back-compat for plugins using add_management_page(). + if ( empty( $page_hook ) && 'edit.php' === $pagenow && get_plugin_page_hook( $plugin_page, 'tools.php' ) ) { + // There could be plugin specific params on the URL, so we need the whole query string. + if ( ! empty( $_SERVER['QUERY_STRING'] ) ) { + $query_string = $_SERVER['QUERY_STRING']; + } else { + $query_string = 'page=' . $plugin_page; + } + wp_redirect( admin_url( 'tools.php?' . $query_string ) ); + exit; + } + } + unset( $the_parent ); +} + +$hook_suffix = ''; +if ( isset( $page_hook ) ) { + $hook_suffix = $page_hook; +} elseif ( isset( $plugin_page ) ) { + $hook_suffix = $plugin_page; +} elseif ( isset( $pagenow ) ) { + $hook_suffix = $pagenow; +} + +set_current_screen(); + +// Handle plugin admin pages. +if ( isset( $plugin_page ) ) { + if ( $page_hook ) { + /** + * Fires before a particular screen is loaded. + * + * The load-* hook fires in a number of contexts. This hook is for plugin screens + * where a callback is provided when the screen is registered. + * + * The dynamic portion of the hook name, `$page_hook`, refers to a mixture of plugin + * page information including: + * 1. The page type. If the plugin page is registered as a submenu page, such as for + * Settings, the page type would be 'settings'. Otherwise the type is 'toplevel'. + * 2. A separator of '_page_'. + * 3. The plugin basename minus the file extension. + * + * Together, the three parts form the `$page_hook`. Citing the example above, + * the hook name used would be 'load-settings_page_pluginbasename'. + * + * @see get_plugin_page_hook() + * + * @since 2.1.0 + */ + do_action( "load-{$page_hook}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + if ( ! isset( $_GET['noheader'] ) ) { + require_once ABSPATH . 'wp-admin/admin-header.php'; + } + + /** + * Used to call the registered callback for a plugin screen. + * + * This hook uses a dynamic hook name, `$page_hook`, which refers to a mixture of plugin + * page information including: + * 1. The page type. If the plugin page is registered as a submenu page, such as for + * Settings, the page type would be 'settings'. Otherwise the type is 'toplevel'. + * 2. A separator of '_page_'. + * 3. The plugin basename minus the file extension. + * + * Together, the three parts form the `$page_hook`. Citing the example above, + * the hook name used would be 'settings_page_pluginbasename'. + * + * @see get_plugin_page_hook() + * + * @since 1.5.0 + */ + do_action( $page_hook ); + } else { + if ( validate_file( $plugin_page ) ) { + wp_die( __( 'Invalid plugin page.' ) ); + } + + if ( ! ( file_exists( WP_PLUGIN_DIR . "/$plugin_page" ) && is_file( WP_PLUGIN_DIR . "/$plugin_page" ) ) && ! ( file_exists( WPMU_PLUGIN_DIR . "/$plugin_page" ) && is_file( WPMU_PLUGIN_DIR . "/$plugin_page" ) ) ) { + /* translators: %s: Admin page generated by a plugin. */ + wp_die( sprintf( __( 'Cannot load %s.' ), htmlentities( $plugin_page ) ) ); + } + + /** + * Fires before a particular screen is loaded. + * + * The load-* hook fires in a number of contexts. This hook is for plugin screens + * where the file to load is directly included, rather than the use of a function. + * + * The dynamic portion of the hook name, `$plugin_page`, refers to the plugin basename. + * + * @see plugin_basename() + * + * @since 1.5.0 + */ + do_action( "load-{$plugin_page}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + if ( ! isset( $_GET['noheader'] ) ) { + require_once ABSPATH . 'wp-admin/admin-header.php'; + } + + if ( file_exists( WPMU_PLUGIN_DIR . "/$plugin_page" ) ) { + include WPMU_PLUGIN_DIR . "/$plugin_page"; + } else { + include WP_PLUGIN_DIR . "/$plugin_page"; + } + } + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + + exit(); +} elseif ( isset( $_GET['import'] ) ) { + + $importer = $_GET['import']; + + if ( ! current_user_can( 'import' ) ) { + wp_die( __( 'Sorry, you are not allowed to import content into this site.' ) ); + } + + if ( validate_file( $importer ) ) { + wp_redirect( admin_url( 'import.php?invalid=' . $importer ) ); + exit; + } + + if ( ! isset( $wp_importers[ $importer ] ) || ! is_callable( $wp_importers[ $importer ][2] ) ) { + wp_redirect( admin_url( 'import.php?invalid=' . $importer ) ); + exit; + } + + /** + * Fires before an importer screen is loaded. + * + * The dynamic portion of the hook name, `$importer`, refers to the importer slug. + * + * @since 3.5.0 + */ + do_action( "load-importer-{$importer}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + $parent_file = 'tools.php'; + $submenu_file = 'import.php'; + $title = __( 'Import' ); + + if ( ! isset( $_GET['noheader'] ) ) { + require_once ABSPATH . 'wp-admin/admin-header.php'; + } + + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + + define( 'WP_IMPORTING', true ); + + /** + * Whether to filter imported data through kses on import. + * + * Multisite uses this hook to filter all data through kses by default, + * as a super administrator may be assisting an untrusted user. + * + * @since 3.1.0 + * + * @param bool $force Whether to force data to be filtered through kses. Default false. + */ + if ( apply_filters( 'force_filtered_html_on_import', false ) ) { + kses_init_filters(); // Always filter imported data with kses on multisite. + } + + call_user_func( $wp_importers[ $importer ][2] ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + + // Make sure rules are flushed. + flush_rewrite_rules( false ); + + exit(); +} else { + /** + * Fires before a particular screen is loaded. + * + * The load-* hook fires in a number of contexts. This hook is for core screens. + * + * The dynamic portion of the hook name, `$pagenow`, is a global variable + * referring to the filename of the current page, such as 'admin.php', + * 'post-new.php' etc. A complete hook for the latter would be + * 'load-post-new.php'. + * + * @since 2.1.0 + */ + do_action( "load-{$pagenow}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /* + * The following hooks are fired to ensure backward compatibility. + * In all other cases, 'load-' . $pagenow should be used instead. + */ + if ( 'page' === $typenow ) { + if ( 'post-new.php' === $pagenow ) { + do_action( 'load-page-new.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } elseif ( 'post.php' === $pagenow ) { + do_action( 'load-page.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } + } elseif ( 'edit-tags.php' === $pagenow ) { + if ( 'category' === $taxnow ) { + do_action( 'load-categories.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } elseif ( 'link_category' === $taxnow ) { + do_action( 'load-edit-link-categories.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } + } elseif ( 'term.php' === $pagenow ) { + do_action( 'load-edit-tags.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } +} + +if ( ! empty( $_REQUEST['action'] ) ) { + $action = $_REQUEST['action']; + + /** + * Fires when an 'action' request variable is sent. + * + * The dynamic portion of the hook name, `$action`, refers to + * the action derived from the `GET` or `POST` request. + * + * @since 2.6.0 + */ + do_action( "admin_action_{$action}" ); +} diff --git a/wp-admin/async-upload.php b/wp-admin/async-upload.php new file mode 100644 index 0000000..0419e71 --- /dev/null +++ b/wp-admin/async-upload.php @@ -0,0 +1,129 @@ +post_type ) { + wp_die( __( 'Invalid post type.' ) ); + } + if ( ! current_user_can( 'edit_post', $id ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this item.' ) ); + } + + switch ( $_REQUEST['fetch'] ) { + case 3: + $thumb_url = wp_get_attachment_image_src( $id, 'thumbnail', true ); + if ( $thumb_url ) { + echo ''; + } + echo '' . _x( 'Edit', 'media item' ) . ''; + + // Title shouldn't ever be empty, but use filename just in case. + $file = get_attached_file( $post->ID ); + $title = $post->post_title ? $post->post_title : wp_basename( $file ); + echo '
      ' . esc_html( wp_html_excerpt( $title, 60, '…' ) ) . '
      '; + break; + case 2: + add_filter( 'attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2 ); + echo get_media_item( + $id, + array( + 'send' => false, + 'delete' => true, + ) + ); + break; + default: + add_filter( 'attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2 ); + echo get_media_item( $id ); + break; + } + exit; +} + +check_admin_referer( 'media-form' ); + +$post_id = 0; +if ( isset( $_REQUEST['post_id'] ) ) { + $post_id = absint( $_REQUEST['post_id'] ); + if ( ! get_post( $post_id ) || ! current_user_can( 'edit_post', $post_id ) ) { + $post_id = 0; + } +} + +$id = media_handle_upload( 'async-upload', $post_id ); +if ( is_wp_error( $id ) ) { + printf( + '
      %s %s
      %s
      ', + sprintf( + '', + __( 'Dismiss' ) + ), + sprintf( + /* translators: %s: Name of the file that failed to upload. */ + __( '“%s” has failed to upload.' ), + esc_html( $_FILES['async-upload']['name'] ) + ), + esc_html( $id->get_error_message() ) + ); + exit; +} + +if ( $_REQUEST['short'] ) { + // Short form response - attachment ID only. + echo $id; +} else { + // Long form response - big chunk of HTML. + $type = $_REQUEST['type']; + + /** + * Filters the returned ID of an uploaded attachment. + * + * The dynamic portion of the hook name, `$type`, refers to the attachment type, + * such as 'image', 'audio', 'video', 'file', etc. + * + * @since 2.5.0 + * + * @param int $id Uploaded attachment ID. + */ + echo apply_filters( "async_upload_{$type}", $id ); +} diff --git a/wp-admin/comment.php b/wp-admin/comment.php new file mode 100644 index 0000000..3f20c3c --- /dev/null +++ b/wp-admin/comment.php @@ -0,0 +1,360 @@ +add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

      ' . __( 'You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error.' ) . '

      ' . + '

      ' . __( 'You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment.' ) . '

      ', + ) + ); + + get_current_screen()->set_help_sidebar( + '

      ' . __( 'For more information:' ) . '

      ' . + '

      ' . __( 'Documentation on Comments' ) . '

      ' . + '

      ' . __( 'Support' ) . '

      ' + ); + + wp_enqueue_script( 'comment' ); + require_once ABSPATH . 'wp-admin/admin-header.php'; + + $comment_id = absint( $_GET['c'] ); + + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + comment_footer_die( __( 'Invalid comment ID.' ) . sprintf( ' ' . __( 'Go back' ) . '.', 'javascript:history.go(-1)' ) ); + } + + if ( ! current_user_can( 'edit_comment', $comment_id ) ) { + comment_footer_die( __( 'Sorry, you are not allowed to edit this comment.' ) ); + } + + if ( 'trash' == $comment->comment_approved ) { + comment_footer_die( __( 'This comment is in the Trash. Please move it out of the Trash if you want to edit it.' ) ); + } + + $comment = get_comment_to_edit( $comment_id ); + + require ABSPATH . 'wp-admin/edit-form-comment.php'; + + break; + + case 'delete': + case 'approve': + case 'trash': + case 'spam': + $title = __( 'Moderate Comment' ); + + $comment_id = absint( $_GET['c'] ); + + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + wp_redirect( admin_url( 'edit-comments.php?error=1' ) ); + die(); + } + + if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) { + wp_redirect( admin_url( 'edit-comments.php?error=2' ) ); + die(); + } + + // No need to re-approve/re-trash/re-spam a comment. + if ( str_replace( '1', 'approve', $comment->comment_approved ) == $action ) { + wp_redirect( admin_url( 'edit-comments.php?same=' . $comment_id ) ); + die(); + } + + require_once ABSPATH . 'wp-admin/admin-header.php'; + + $formaction = $action . 'comment'; + $nonce_action = 'approve' == $action ? 'approve-comment_' : 'delete-comment_'; + $nonce_action .= $comment_id; + + ?> +
      + +

      + + comment_approved ) { // If not unapproved. + $message = ''; + switch ( $comment->comment_approved ) { + case '1': + $message = __( 'This comment is currently approved.' ); + break; + case 'spam': + $message = __( 'This comment is currently marked as spam.' ); + break; + case 'trash': + $message = __( 'This comment is currently in the Trash.' ); + break; + } + if ( $message ) { + echo '

      ' . $message . '

      '; + } + } + ?> +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + comment_post_ID; + if ( current_user_can( 'edit_post', $post_id ) ) { + $post_link = ""; + $post_link .= esc_html( get_the_title( $post_id ) ) . ''; + } else { + $post_link = esc_html( get_the_title( $post_id ) ); + } + echo $post_link; + + if ( $comment->comment_parent ) { + $parent = get_comment( $comment->comment_parent ); + $parent_link = esc_url( get_comment_link( $parent ) ); + $name = get_comment_author( $parent ); + printf( + /* translators: %s: Comment link. */ + ' | ' . __( 'In reply to %s.' ), + '' . $name . '' + ); + } + ?> +
      + comment_post_ID ) ) { + echo '' . $submitted . ''; + } else { + echo $submitted; + } + ?> +
      + +

      comment_ID}" ); ?>">

      +
      + +
      + +

      + + +

      + + + + + +
      + +
      + ' . __( 'Go back' ) . '.', 'edit-comments.php' ) ); + } + if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) { + comment_footer_die( __( 'Sorry, you are not allowed to edit comments on this post.' ) ); + } + + if ( '' != wp_get_referer() && ! $noredir && false === strpos( wp_get_referer(), 'comment.php' ) ) { + $redir = wp_get_referer(); + } elseif ( '' != wp_get_original_referer() && ! $noredir ) { + $redir = wp_get_original_referer(); + } elseif ( in_array( $action, array( 'approvecomment', 'unapprovecomment' ) ) ) { + $redir = admin_url( 'edit-comments.php?p=' . absint( $comment->comment_post_ID ) ); + } else { + $redir = admin_url( 'edit-comments.php' ); + } + + $redir = remove_query_arg( array( 'spammed', 'unspammed', 'trashed', 'untrashed', 'deleted', 'ids', 'approved', 'unapproved' ), $redir ); + + switch ( $action ) { + case 'deletecomment': + wp_delete_comment( $comment ); + $redir = add_query_arg( array( 'deleted' => '1' ), $redir ); + break; + case 'trashcomment': + wp_trash_comment( $comment ); + $redir = add_query_arg( + array( + 'trashed' => '1', + 'ids' => $comment_id, + ), + $redir + ); + break; + case 'untrashcomment': + wp_untrash_comment( $comment ); + $redir = add_query_arg( array( 'untrashed' => '1' ), $redir ); + break; + case 'spamcomment': + wp_spam_comment( $comment ); + $redir = add_query_arg( + array( + 'spammed' => '1', + 'ids' => $comment_id, + ), + $redir + ); + break; + case 'unspamcomment': + wp_unspam_comment( $comment ); + $redir = add_query_arg( array( 'unspammed' => '1' ), $redir ); + break; + case 'approvecomment': + wp_set_comment_status( $comment, 'approve' ); + $redir = add_query_arg( array( 'approved' => 1 ), $redir ); + break; + case 'unapprovecomment': + wp_set_comment_status( $comment, 'hold' ); + $redir = add_query_arg( array( 'unapproved' => 1 ), $redir ); + break; + } + + wp_redirect( $redir ); + die; + + case 'editedcomment': + $comment_id = absint( $_POST['comment_ID'] ); + $comment_post_id = absint( $_POST['comment_post_ID'] ); + + check_admin_referer( 'update-comment_' . $comment_id ); + + edit_comment(); + + $location = ( empty( $_POST['referredby'] ) ? "edit-comments.php?p=$comment_post_id" : $_POST['referredby'] ) . '#comment-' . $comment_id; + + /** + * Filters the URI the user is redirected to after editing a comment in the admin. + * + * @since 2.1.0 + * + * @param string $location The URI the user will be redirected to. + * @param int $comment_id The ID of the comment being edited. + */ + $location = apply_filters( 'comment_edit_redirect', $location, $comment_id ); + wp_redirect( $location ); + + exit(); + + default: + wp_die( __( 'Unknown action.' ) ); + +} // End switch. + +require_once ABSPATH . 'wp-admin/admin-footer.php'; diff --git a/wp-admin/credits.php b/wp-admin/credits.php new file mode 100644 index 0000000..2fdb126 --- /dev/null +++ b/wp-admin/credits.php @@ -0,0 +1,150 @@ + +
      + +
      +
      +

      + + +

      +
      + +
      +

      + +

      +
      + + +
      + +
      +
      +

      + + + +

      + worldwide team of passionate individuals. Get involved in WordPress.' ), + __( 'https://wordpress.org/about/' ), + __( 'https://make.wordpress.org/' ) + ); + ?> +

      + + + +

      + +

      +

      + Get involved in WordPress.' ), + __( 'https://make.wordpress.org/' ) + ); + ?> +

      + + +
      + +
      + +
      +
      + +'; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + exit; +} +?> + +
      + +
      +
      + + + +
      +
      + +
      + +
      +
      + + +
      +
      + +
      + + +
      +
      + + + +
      +
      + +
      + + +
      +
      + + +
      +
      +
      + div { + display: flex; +} + +.about__header > div > * { + align-self: flex-end; +} + +.about__header-title { + min-height: 24em; + max-height: 32em; + height: 80vh; + padding: 0 32px; +} + +.about__header-title p { + margin: 0; + padding: 0; + font-size: 4em; + line-height: 1; + font-weight: 500; + color: #1730e5; + color: var(--accent-1); +} + +.about__header-title p span { + display: inline-block; + color: #216bce; + color: var(--accent-2); +} + +.about__header-text { + padding: 16px 32px 32px; + font-size: 1.5em; + line-height: 1.4; +} + +.about__header-text p { + margin: 0; +} + +.about__header-navigation { + padding-top: 0; + background: #216bce; + background: var(--nav-background); + color: #f3f4f5; + color: var(--nav-color); + border-bottom: 3px solid #1730e5; + border-bottom: 3px solid var(--nav-border); +} + +.about__header-navigation .nav-tab { + margin-right: 0; + padding: 24px 32px; + font-size: 1.4em; + line-height: 1; + border-width: 0 0 3px; + border-style: solid; + border-color: transparent; + background: transparent; + color: inherit; +} + +.about__header-navigation .nav-tab:hover, +.about__header-navigation .nav-tab:active { + background-color: #1730e5; + background-color: var(--accent-1); +} + +.about__header-navigation .nav-tab-active { + margin-bottom: -3px; + border-width: 0 0 6px; + border-color: #bde7f0; + border-color: var(--accent-3); +} + +.about__header-navigation .nav-tab-active:hover, +.about__header-navigation .nav-tab-active:active { + background-color: #1730e5; + background-color: var(--accent-1); + border-color: #bde7f0; + border-color: var(--accent-3); +} + +@media screen and (max-width: 782px) { + .about__container .about__header-text { + font-size: 1.4em; + } + + .about__header-title { + min-height: 0; + max-height: none; + height: auto; + /* + * 60% is a "magic" number to create a top offset approx-equal to the height of the background image, + * which scales to match the container width. + */ + padding-top: 60%; + } + + .about__header-navigation .nav-tab { + margin-top: 0; + margin-left: 0; + padding: 24px 16px; + } +} + +@media screen and (max-width: 480px) { + .about__header-title p { + font-size: 3.2em; + } + + .about__header-navigation .nav-tab { + float: none; + display: block; + margin-bottom: 0; + padding: 16px 16px; + border-right-width: 6px; + border-bottom: none; + } + + .about__header-navigation .nav-tab-active { + border-bottom: none; + border-right-width: 6px; + } +} + + +/*------------------------------------------------------------------------------ + 2.0 - Credits Page +------------------------------------------------------------------------------*/ + +.about__section .wp-people-group { + margin: 0; +} + +.about__section .wp-person { + display: inline-block; + vertical-align: top; + box-sizing: border-box; + padding: 0 0 1em 1em; + height: 6em; + width: calc( 33% - 4px ); + min-width: 280px; +} + +.about__section .compact .wp-person { + height: auto; + width: calc( 25% - 4px ); + min-width: 220px; + padding-bottom: 0.5em; +} + +.about__section .wp-person .gravatar { + float: right; + margin: -4px 0 0.85em 0.85em; + padding: 1px; + width: 80px; + height: 80px; + border-radius: 100%; +} + +.about__section .compact .wp-person .gravatar { + width: 40px; + height: 40px; +} + +.about__section .wp-person .web { + font-size: 1.4em; + font-weight: 600; + text-decoration: none; + color: #32373c; + color: var(--text); +} + +.about__section .wp-person .web:hover { + text-decoration: underline; +} + +.about__section .compact .wp-person .web { + font-size: 1.2em; +} + +.about__section .wp-person .title { + display: block; + margin-top: 0.5em; +} + +@media screen and (max-width: 480px) { + .about__section .wp-person { + min-width: 100%; + } + + .about__section .wp-person .gravatar { + width: 60px; + height: 60px; + } + + .about__section .wp-person .web { + font-size: 1em; + } + + .about__section .compact .wp-person .web { + font-size: 1em; + } +} + + +/*------------------------------------------------------------------------------ + 3.0 - Freedoms Page +------------------------------------------------------------------------------*/ + +.about__section .column .freedoms-image { + margin-bottom: 1em; +} + + +/*------------------------------------------------------------------------------ + x.2.0 - Legacy About Styles: Global +------------------------------------------------------------------------------*/ + +.about-wrap { + position: relative; + margin: 25px 20px 0 40px; + max-width: 1050px; /* readability */ + font-size: 15px; +} + +.about-wrap.full-width-layout { + max-width: 1200px; +} + +.about-wrap-content { + max-width: 1050px; +} + +.about-wrap div.updated, +.about-wrap div.error, +.about-wrap .notice { + display: none !important; +} + +.about-wrap hr { + border: 0; + height: 0; + margin: 3em 0 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +.about-wrap img { + margin: 0; + width: 100%; + height: auto; + vertical-align: middle; +} + +.about-wrap .inline-svg img { + max-width: 100%; + width: auto; + height: auto; +} + +.about-wrap video { + margin: 1.5em auto; +} + +/* WordPress Version Badge */ + +.wp-badge { + background: #0073aa url(../images/w-logo-white.png?ver=20160308) no-repeat; + background-position: center 25px; + background-size: 80px 80px; + color: #fff; + font-size: 14px; + text-align: center; + font-weight: 600; + margin: 5px 0 0; + padding-top: 120px; + height: 40px; + display: inline-block; + width: 140px; + text-rendering: optimizeLegibility; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); +} + +.svg .wp-badge { + background-image: url(../images/wordpress-logo-white.svg?ver=20160308); +} + +.about-wrap .wp-badge { + position: absolute; + top: 0; + left: 0; +} + +/* Tabs */ + +.about-wrap .nav-tab { + padding-left: 15px; + padding-right: 15px; + font-size: 18px; + line-height: 1.33333333; +} + +/* x.2.1 - Typography */ + +.about-wrap h1 { + margin: 0.2em 0 0 200px; + padding: 0; + color: #32373c; + line-height: 1.2; + font-size: 2.8em; + font-weight: 400; +} + +.about-wrap h2 { + margin: 40px 0 0.6em; + font-size: 2.7em; + line-height: 1.3; + font-weight: 300; + text-align: center; +} + +.about-wrap h3 { + margin: 1.25em 0 0.6em; + font-size: 1.4em; + line-height: 1.5; +} + +.about-wrap h4 { + font-size: 16px; + color: #23282d; +} + +.about-wrap p { + line-height: 1.5; + font-size: 16px; +} + +.about-wrap code, +.about-wrap ol li p { + font-size: 14px; + font-weight: 400; +} + +.about-wrap figcaption { + font-size: 13px; + text-align: center; + color: white; + text-overflow: ellipsis; +} + +.about-wrap .about-description, +.about-wrap .about-text { + margin-top: 1.4em; + font-weight: 400; + line-height: 1.6; + font-size: 19px; +} + +.about-wrap .about-text { + margin: 1em 0 1em 200px; + color: #555d66; +} + +/* x.2.2 - Structure */ + +.about-wrap .has-1-columns, +.about-wrap .has-2-columns, +.about-wrap .has-3-columns, +.about-wrap .has-4-columns { + display: -ms-grid; + display: grid; + max-width: 800px; + margin-top: 40px; + margin-right: auto; + margin-left: auto; +} + +.about-wrap .column { + margin-left: 20px; + margin-right: 20px; +} + +.about-wrap .is-wide { + max-width: 760px; +} + +.about-wrap .is-fullwidth { + max-width: 100%; +} + +.about-wrap .has-1-columns { + display: block; + max-width: 680px; + margin: 0 auto 40px; +} + +.about-wrap .has-2-columns { + -ms-grid-columns: 1fr 1fr; + grid-template-columns: 1fr 1fr; +} + +.about-wrap .has-2-columns .column:nth-of-type(2n+1) { + -ms-grid-column: 1; + grid-column-start: 1; +} + +.about-wrap .has-2-columns .column:nth-of-type(2n) { + -ms-grid-column: 2; + grid-column-start: 2; +} + +.about-wrap .has-2-columns.is-wider-right { + -ms-grid-columns: 1fr 2fr; + grid-template-columns: 1fr 2fr; +} + +.about-wrap .has-2-columns.is-wider-left { + -ms-grid-columns: 2fr 1fr; + grid-template-columns: 2fr 1fr; +} + +.about-wrap .has-3-columns { + -ms-grid-columns: (1fr)[3]; + grid-template-columns: repeat(3, 1fr); +} + +.about-wrap .has-3-columns .column:nth-of-type(3n+1) { + -ms-grid-column: 1; + grid-column-start: 1; +} + +.about-wrap .has-3-columns .column:nth-of-type(3n+2) { + -ms-grid-column: 2; + grid-column-start: 2; +} + +.about-wrap .has-3-columns .column:nth-of-type(3n) { + -ms-grid-column: 3; + grid-column-start: 3; +} + +.about-wrap .has-4-columns { + -ms-grid-columns: (1fr)[4]; + grid-template-columns: repeat(4, 1fr); +} + +.about-wrap .has-4-columns .column:nth-of-type(4n+1) { + -ms-grid-column: 1; + grid-column-start: 1; +} + +.about-wrap .has-4-columns .column:nth-of-type(4n+2) { + -ms-grid-column: 2; + grid-column-start: 2; +} + +.about-wrap .has-4-columns .column:nth-of-type(4n+3) { + -ms-grid-column: 3; + grid-column-start: 3; +} + +.about-wrap .has-4-columns .column:nth-of-type(4n) { + -ms-grid-column: 4; + grid-column-start: 4; +} + +.about-wrap .column :first-child { + margin-top: 0; +} + +.about-wrap .aligncenter { + text-align: center; +} + +.about-wrap .alignleft { + float: right; + margin-left: 40px; +} + +.about-wrap .alignright { + float: left; + margin-right: 40px; +} + +.about-wrap .is-vertically-aligned-top { + -ms-grid-row-align: start; + align-self: start; +} + +.about-wrap .is-vertically-aligned-center { + -ms-grid-row-align: center; + align-self: center; +} + +.about-wrap .is-vertically-aligned-bottom { + -ms-grid-row-align: end; + align-self: end; +} + +/* x.2.3 - Point Releases */ + +.about-wrap .point-releases { + margin-top: 5px; + border-bottom: 1px solid #ddd; +} + +.about-wrap .changelog { + margin-bottom: 40px; +} + +.about-wrap .changelog.point-releases h3 { + padding-top: 35px; +} + +.about-wrap .changelog.point-releases h3:first-child { + padding-top: 7px; +} + +.about-wrap .changelog.feature-section .col { + margin-top: 40px; +} + +/*------------------------------------------------------------------------------ + x.3.0 - Legacy About Styles: About Page +------------------------------------------------------------------------------*/ + +/* x.3.1 - Typography */ + +.about-wrap .lead-description { + font-size: 1.5em; + text-align: center; +} + +.about-wrap .feature-section p { + margin-top: 0.6em; +} + +/* x.3.2 - Structure */ + +.about-wrap .headline-feature { + margin: 0 auto 40px; + max-width: 680px; +} + +.about-wrap .headline-feature h2 { + margin: 50px 0 0; +} + +.about-wrap .headline-feature img { + max-width: 600px; + width: 100%; +} + +/* Return to Dashboard Home link */ + +.about-wrap .return-to-dashboard { + margin: 30px -5px 0 0; + font-size: 14px; + font-weight: 600; +} + +.about-wrap .return-to-dashboard a { + text-decoration: none; + padding: 0 5px; +} + +/*------------------------------------------------------------------------------ + x.4.0 - Legacy About Styles: Credits & Freedoms Pages +------------------------------------------------------------------------------*/ + +/* Credits */ + +.about-wrap h2.wp-people-group { + margin: 2.6em 0 1.33em; + padding: 0; + font-size: 16px; + line-height: inherit; + font-weight: 600; + text-align: right; +} + +.about-wrap .wp-people-group { + padding: 0 5px; + margin: 0 -5px 0 -15px; +} + +.about-wrap .compact { + margin-bottom: 0; +} + +.about-wrap .wp-person { + display: inline-block; + vertical-align: top; + margin-left: 10px; + padding-bottom: 15px; + height: 70px; + width: 280px; +} + +.about-wrap .compact .wp-person { + height: auto; + width: 180px; + padding-bottom: 0; + margin-bottom: 0; +} + +.about-wrap .wp-person .gravatar { + float: right; + margin: 0 0 10px 10px; + padding: 1px; + width: 60px; + height: 60px; +} + +.about-wrap .compact .wp-person .gravatar { + width: 30px; + height: 30px; +} + +.about-wrap .wp-person .web { + margin: 6px 0 2px; + font-size: 16px; + font-weight: 400; + line-height: 2; + text-decoration: none; +} + +.about-wrap .wp-person .title { + display: block; +} + +.about-wrap #wp-people-group-validators + p.wp-credits-list { + margin-top: 0; +} + +.about-wrap p.wp-credits-list a { + white-space: nowrap; +} + +/* Freedoms */ + +.freedoms-php .about-wrap ol { + margin: 40px 60px; +} + +.freedoms-php .about-wrap ol li { + list-style-type: decimal; + font-weight: 600; +} + +.freedoms-php .about-wrap ol p { + font-weight: 400; + margin: 0.6em 0; +} + +.freedoms-php .column .freedoms-image { + background-image: url('https://s.w.org/wp-content/themes/pub/wporg-main/images/freedoms-2x.png'); + background-size: 100%; + padding-top: 100%; +} + +.freedoms-php .column:nth-of-type(2) .freedoms-image { + background-position: 100% 34%; +} + +.freedoms-php .column:nth-of-type(3) .freedoms-image { + background-position: 100% 66%; +} + +.freedoms-php .column:nth-of-type(4) .freedoms-image { + background-position: 100% 100%; +} + +/*------------------------------------------------------------------------------ + x.5.0 - Legacy About Styles: Media Queries +------------------------------------------------------------------------------*/ + +@media screen and (max-width: 782px) { + .about-wrap .has-3-columns, + .about-wrap .has-4-columns { + -ms-grid-columns: 1fr 1fr; + grid-template-columns: 1fr 1fr; + } + + .about-wrap .has-3-columns .column:nth-of-type(3n+1), + .about-wrap .has-4-columns .column:nth-of-type(4n+1) { + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row: 1; + grid-row-start: 1; + } + + .about-wrap .has-3-columns .column:nth-of-type(3n+2), + .about-wrap .has-4-columns .column:nth-of-type(4n+2) { + -ms-grid-column: 2; + grid-column-start: 2; + -ms-grid-row: 1; + grid-row-start: 1; + } + + .about-wrap .has-3-columns .column:nth-of-type(3n), + .about-wrap .has-4-columns .column:nth-of-type(4n+3) { + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row: 2; + grid-row-start: 2; + } + + .about-wrap .has-4-columns .column:nth-of-type(4n) { + -ms-grid-column: 2; + grid-column-start: 2; + -ms-grid-row: 2; + grid-row-start: 2; + } +} + +@media screen and (max-width: 600px) { + .about-wrap .has-2-columns, + .about-wrap .has-3-columns, + .about-wrap .has-4-columns { + display: block; + } + + .about-wrap :not(.is-wider-right):not(.is-wider-left) .column { + margin-left: 0; + margin-right: 0; + } + + .about-wrap .has-2-columns.is-wider-right, + .about-wrap .has-2-columns.is-wider-left { + display: -ms-grid; + display: grid; + } +} + +@media only screen and (max-width: 500px) { + .about-wrap { + margin-left: 20px; + margin-right: 10px; + } + + .about-wrap h1, + .about-wrap .about-text { + margin-left: 0; + } + + .about-wrap .about-text { + margin-bottom: 0.25em; + } + + .about-wrap .wp-badge { + position: relative; + margin-bottom: 1.5em; + width: 100%; + } +} + +@media only screen and (max-width: 480px) { + .about-wrap .has-2-columns.is-wider-right, + .about-wrap .has-2-columns.is-wider-left { + display: block; + } + + .about-wrap .column { + margin-left: 0; + margin-right: 0; + } + + .about-wrap .has-2-columns.is-wider-right img, + .about-wrap .has-2-columns.is-wider-left img { + max-width: 160px; + } +} diff --git a/wp-admin/css/about-rtl.min.css b/wp-admin/css/about-rtl.min.css new file mode 100644 index 0000000..6b6a565 --- /dev/null +++ b/wp-admin/css/about-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.about__container{--background:#f3f4f5;--subtle-background:#bde7f0;--text:#32373c;--text-light:#f3f4f5;--nav-background:#216bce;--nav-border:#1730e5;--nav-color:#f3f4f5;--accent-1:#1730e5;--accent-2:#216bce;--accent-3:#bde7f0}.about-php,.credits-php,.freedoms-php,.privacy-php{background:#fff}.about-php #wpcontent,.credits-php #wpcontent,.freedoms-php #wpcontent,.privacy-php #wpcontent{background:#fff;padding:0 24px}@media screen and (max-width:782px){.about-php.auto-fold #wpcontent,.credits-php.auto-fold #wpcontent,.freedoms-php.auto-fold #wpcontent,.privacy-php.auto-fold #wpcontent{padding-right:24px}}.about__container{max-width:1000px;margin:24px auto;clear:both}.about__container .alignleft{float:right}.about__container .alignright{float:left}.about__container .aligncenter{text-align:center}.about__container .is-vertically-aligned-top{-ms-grid-row-align:start;align-self:start}.about__container .is-vertically-aligned-center{-ms-grid-row-align:center;align-self:center}.about__container .is-vertically-aligned-bottom{-ms-grid-row-align:end;align-self:end}.about__section{background:#f3f4f5;background:var(--background);clear:both}.about__container .has-accent-background-color{color:#f3f4f5;color:var(--text-light);background-color:#1730e5;background-color:var(--accent-1)}.about__container .has-subtle-background-color{background-color:#bde7f0;background-color:var(--subtle-background)}.about__section{margin:0}.about__section .column{padding:32px}.about__section .column.is-edge-to-edge{padding:0}.about__section .column p:first-of-type{margin-top:0}.about__section .column p:last-of-type{margin-bottom:0}.about__section .is-section-header{margin-bottom:0;padding:32px 32px 0}.about__section .is-section-header:first-child:last-child{padding:0}.about__section.is-feature{padding:32px}.about__section.is-feature p{margin:0}.about__section.is-feature p+p{margin-top:1rem}.about__section.has-2-columns,.about__section.has-3-columns,.about__section.has-4-columns{display:-ms-grid;display:grid}.about__section.has-2-columns{-ms-grid-columns:1fr 1fr;grid-template-columns:1fr 1fr}.about__section.has-2-columns.is-wider-right{-ms-grid-columns:1fr 2fr;grid-template-columns:1fr 2fr}.about__section.has-2-columns.is-wider-left{-ms-grid-columns:2fr 1fr;grid-template-columns:2fr 1fr}.about__section.has-2-columns .is-section-header{-ms-grid-column:1;grid-column-start:1;-ms-grid-column-span:2;grid-column-end:span 2}.about__section.has-2-columns .column:nth-of-type(2n+1){-ms-grid-column:1;grid-column-start:1}.about__section.has-2-columns .column:nth-of-type(2n){-ms-grid-column:2;grid-column-start:2}.about__section.has-3-columns{-ms-grid-columns:(1fr)[3];grid-template-columns:repeat(3,1fr)}.about__section.has-3-columns .is-section-header{-ms-grid-column:1;grid-column-start:1;-ms-grid-column-span:3;grid-column-end:span 3}.about__section.has-3-columns .column:nth-of-type(3n+1){-ms-grid-column:1;grid-column-start:1}.about__section.has-3-columns .column:nth-of-type(3n+2){-ms-grid-column:2;grid-column-start:2}.about__section.has-3-columns .column:nth-of-type(3n){-ms-grid-column:3;grid-column-start:3}.about__section.has-4-columns{-ms-grid-columns:(1fr)[4];grid-template-columns:repeat(4,1fr)}.about__section.has-4-columns .is-section-header{-ms-grid-column:1;grid-column-start:1;-ms-grid-column-span:4;grid-column-end:span 4}.about__section.has-4-columns .column:nth-of-type(4n+1){-ms-grid-column:1;grid-column-start:1}.about__section.has-4-columns .column:nth-of-type(4n+2){-ms-grid-column:2;grid-column-start:2}.about__section.has-4-columns .column:nth-of-type(4n+3){-ms-grid-column:3;grid-column-start:3}.about__section.has-4-columns .column:nth-of-type(4n){-ms-grid-column:4;grid-column-start:4}.about__section.has-2-columns .is-section-header~.column,.about__section.has-3-columns .is-section-header~.column,.about__section.has-4-columns .is-section-header~.column{-ms-grid-row:2;grid-row-start:2}@media screen and (max-width:782px){.about__section.has-3-columns,.about__section.has-4-columns{display:block;padding-bottom:16px}.about__section.has-3-columns .column:nth-of-type(n),.about__section.has-4-columns .column:nth-of-type(n){padding-top:16px;padding-bottom:16px}}@media screen and (max-width:600px){.about__section.has-2-columns{display:flex;flex-wrap:wrap;align-content:stretch;padding-bottom:16px}.about__section.has-2-columns .column:nth-of-type(n){padding-top:16px;padding-bottom:16px;width:100%}.about__section.has-2-columns .is-edge-to-edge{order:-1}}.about__container{line-height:1.4}.about__container h1{margin:0 0 1em;padding:0;font-weight:600;color:inherit}.about__container h1,.about__container h2{margin-top:0;font-size:1.4em;line-height:1.4}.about__container h2.is-smaller-heading,.about__container h3{margin-top:0;font-size:1em}.about__container p{font-size:inherit;line-height:inherit}.about__section a{color:#1730e5;color:var(--accent-1);text-decoration:underline}.about__section a:active,.about__section a:focus,.about__section a:hover{text-decoration:none}.wp-credits-list a{text-decoration:none}.wp-credits-list a:active,.wp-credits-list a:focus,.wp-credits-list a:hover{text-decoration:underline}.about__container ul{list-style:disc;margin-right:16px}.about__container img{margin:0;vertical-align:middle}.about__container .about__image{display:-ms-grid;display:grid;align-items:center;justify-content:center;height:100%;overflow:hidden}.about__container .about__image img{max-width:100%;width:100%;height:auto}.about__container hr{margin:0;height:32px;border:none}.about__container hr.is-small{height:8px}.about__container .notice,.about__container div.error,.about__container div.updated{display:none!important}.about__section{font-size:1.2em}.about__section.is-feature{font-size:1.6em;font-weight:600;text-align:center}@media screen and (max-width:480px){.about__section.is-feature{font-size:1.4em;font-weight:500}}.about__header{margin-bottom:32px;background-color:#f3f4f5;background-color:var(--background);background-repeat:no-repeat;background-position:top left;background-size:contain;background-image:url(https://s.w.org/images/core/5.4/header-diagonal.svg)}.rtl .about__header{background-image:url(https://s.w.org/images/core/5.4/header-diagonal-rtl.svg)}.about__header>div{display:flex}.about__header>div>*{align-self:flex-end}.about__header-title{min-height:24em;max-height:32em;height:80vh;padding:0 32px}.about__header-title p{margin:0;padding:0;font-size:4em;line-height:1;font-weight:500;color:#1730e5;color:var(--accent-1)}.about__header-title p span{display:inline-block;color:#216bce;color:var(--accent-2)}.about__header-text{padding:16px 32px 32px;font-size:1.5em;line-height:1.4}.about__header-text p{margin:0}.about__header-navigation{padding-top:0;background:#216bce;background:var(--nav-background);color:#f3f4f5;color:var(--nav-color);border-bottom:3px solid #1730e5;border-bottom:3px solid var(--nav-border)}.about__header-navigation .nav-tab{margin-right:0;padding:24px 32px;font-size:1.4em;line-height:1;border-width:0 0 3px;border-style:solid;border-color:transparent;background:0 0;color:inherit}.about__header-navigation .nav-tab:active,.about__header-navigation .nav-tab:hover{background-color:#1730e5;background-color:var(--accent-1)}.about__header-navigation .nav-tab-active{margin-bottom:-3px;border-width:0 0 6px;border-color:#bde7f0;border-color:var(--accent-3)}.about__header-navigation .nav-tab-active:active,.about__header-navigation .nav-tab-active:hover{background-color:#1730e5;background-color:var(--accent-1);border-color:#bde7f0;border-color:var(--accent-3)}@media screen and (max-width:782px){.about__container .about__header-text{font-size:1.4em}.about__header-title{min-height:0;max-height:none;height:auto;padding-top:60%}.about__header-navigation .nav-tab{margin-top:0;margin-left:0;padding:24px 16px}}@media screen and (max-width:480px){.about__header-title p{font-size:3.2em}.about__header-navigation .nav-tab{float:none;display:block;margin-bottom:0;padding:16px 16px;border-right-width:6px;border-bottom:none}.about__header-navigation .nav-tab-active{border-bottom:none;border-right-width:6px}}.about__section .wp-people-group{margin:0}.about__section .wp-person{display:inline-block;vertical-align:top;box-sizing:border-box;padding:0 0 1em 1em;height:6em;width:calc(33% - 4px);min-width:280px}.about__section .compact .wp-person{height:auto;width:calc(25% - 4px);min-width:220px;padding-bottom:.5em}.about__section .wp-person .gravatar{float:right;margin:-4px 0 .85em .85em;padding:1px;width:80px;height:80px;border-radius:100%}.about__section .compact .wp-person .gravatar{width:40px;height:40px}.about__section .wp-person .web{font-size:1.4em;font-weight:600;text-decoration:none;color:#32373c;color:var(--text)}.about__section .wp-person .web:hover{text-decoration:underline}.about__section .compact .wp-person .web{font-size:1.2em}.about__section .wp-person .title{display:block;margin-top:.5em}@media screen and (max-width:480px){.about__section .wp-person{min-width:100%}.about__section .wp-person .gravatar{width:60px;height:60px}.about__section .wp-person .web{font-size:1em}.about__section .compact .wp-person .web{font-size:1em}}.about__section .column .freedoms-image{margin-bottom:1em}.about-wrap{position:relative;margin:25px 20px 0 40px;max-width:1050px;font-size:15px}.about-wrap.full-width-layout{max-width:1200px}.about-wrap-content{max-width:1050px}.about-wrap .notice,.about-wrap div.error,.about-wrap div.updated{display:none!important}.about-wrap hr{border:0;height:0;margin:3em 0 0;border-top:1px solid rgba(0,0,0,.1)}.about-wrap img{margin:0;width:100%;height:auto;vertical-align:middle}.about-wrap .inline-svg img{max-width:100%;width:auto;height:auto}.about-wrap video{margin:1.5em auto}.wp-badge{background:#0073aa url(../images/w-logo-white.png?ver=20160308) no-repeat;background-position:center 25px;background-size:80px 80px;color:#fff;font-size:14px;text-align:center;font-weight:600;margin:5px 0 0;padding-top:120px;height:40px;display:inline-block;width:140px;text-rendering:optimizeLegibility;box-shadow:0 1px 3px rgba(0,0,0,.2)}.svg .wp-badge{background-image:url(../images/wordpress-logo-white.svg?ver=20160308)}.about-wrap .wp-badge{position:absolute;top:0;left:0}.about-wrap .nav-tab{padding-left:15px;padding-right:15px;font-size:18px;line-height:1.33333333}.about-wrap h1{margin:.2em 0 0 200px;padding:0;color:#32373c;line-height:1.2;font-size:2.8em;font-weight:400}.about-wrap h2{margin:40px 0 .6em;font-size:2.7em;line-height:1.3;font-weight:300;text-align:center}.about-wrap h3{margin:1.25em 0 .6em;font-size:1.4em;line-height:1.5}.about-wrap h4{font-size:16px;color:#23282d}.about-wrap p{line-height:1.5;font-size:16px}.about-wrap code,.about-wrap ol li p{font-size:14px;font-weight:400}.about-wrap figcaption{font-size:13px;text-align:center;color:#fff;text-overflow:ellipsis}.about-wrap .about-description,.about-wrap .about-text{margin-top:1.4em;font-weight:400;line-height:1.6;font-size:19px}.about-wrap .about-text{margin:1em 0 1em 200px;color:#555d66}.about-wrap .has-1-columns,.about-wrap .has-2-columns,.about-wrap .has-3-columns,.about-wrap .has-4-columns{display:-ms-grid;display:grid;max-width:800px;margin-top:40px;margin-right:auto;margin-left:auto}.about-wrap .column{margin-left:20px;margin-right:20px}.about-wrap .is-wide{max-width:760px}.about-wrap .is-fullwidth{max-width:100%}.about-wrap .has-1-columns{display:block;max-width:680px;margin:0 auto 40px}.about-wrap .has-2-columns{-ms-grid-columns:1fr 1fr;grid-template-columns:1fr 1fr}.about-wrap .has-2-columns .column:nth-of-type(2n+1){-ms-grid-column:1;grid-column-start:1}.about-wrap .has-2-columns .column:nth-of-type(2n){-ms-grid-column:2;grid-column-start:2}.about-wrap .has-2-columns.is-wider-right{-ms-grid-columns:1fr 2fr;grid-template-columns:1fr 2fr}.about-wrap .has-2-columns.is-wider-left{-ms-grid-columns:2fr 1fr;grid-template-columns:2fr 1fr}.about-wrap .has-3-columns{-ms-grid-columns:(1fr)[3];grid-template-columns:repeat(3,1fr)}.about-wrap .has-3-columns .column:nth-of-type(3n+1){-ms-grid-column:1;grid-column-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n+2){-ms-grid-column:2;grid-column-start:2}.about-wrap .has-3-columns .column:nth-of-type(3n){-ms-grid-column:3;grid-column-start:3}.about-wrap .has-4-columns{-ms-grid-columns:(1fr)[4];grid-template-columns:repeat(4,1fr)}.about-wrap .has-4-columns .column:nth-of-type(4n+1){-ms-grid-column:1;grid-column-start:1}.about-wrap .has-4-columns .column:nth-of-type(4n+2){-ms-grid-column:2;grid-column-start:2}.about-wrap .has-4-columns .column:nth-of-type(4n+3){-ms-grid-column:3;grid-column-start:3}.about-wrap .has-4-columns .column:nth-of-type(4n){-ms-grid-column:4;grid-column-start:4}.about-wrap .column :first-child{margin-top:0}.about-wrap .aligncenter{text-align:center}.about-wrap .alignleft{float:right;margin-left:40px}.about-wrap .alignright{float:left;margin-right:40px}.about-wrap .is-vertically-aligned-top{-ms-grid-row-align:start;align-self:start}.about-wrap .is-vertically-aligned-center{-ms-grid-row-align:center;align-self:center}.about-wrap .is-vertically-aligned-bottom{-ms-grid-row-align:end;align-self:end}.about-wrap .point-releases{margin-top:5px;border-bottom:1px solid #ddd}.about-wrap .changelog{margin-bottom:40px}.about-wrap .changelog.point-releases h3{padding-top:35px}.about-wrap .changelog.point-releases h3:first-child{padding-top:7px}.about-wrap .changelog.feature-section .col{margin-top:40px}.about-wrap .lead-description{font-size:1.5em;text-align:center}.about-wrap .feature-section p{margin-top:.6em}.about-wrap .headline-feature{margin:0 auto 40px;max-width:680px}.about-wrap .headline-feature h2{margin:50px 0 0}.about-wrap .headline-feature img{max-width:600px;width:100%}.about-wrap .return-to-dashboard{margin:30px -5px 0 0;font-size:14px;font-weight:600}.about-wrap .return-to-dashboard a{text-decoration:none;padding:0 5px}.about-wrap h2.wp-people-group{margin:2.6em 0 1.33em;padding:0;font-size:16px;line-height:inherit;font-weight:600;text-align:right}.about-wrap .wp-people-group{padding:0 5px;margin:0 -5px 0 -15px}.about-wrap .compact{margin-bottom:0}.about-wrap .wp-person{display:inline-block;vertical-align:top;margin-left:10px;padding-bottom:15px;height:70px;width:280px}.about-wrap .compact .wp-person{height:auto;width:180px;padding-bottom:0;margin-bottom:0}.about-wrap .wp-person .gravatar{float:right;margin:0 0 10px 10px;padding:1px;width:60px;height:60px}.about-wrap .compact .wp-person .gravatar{width:30px;height:30px}.about-wrap .wp-person .web{margin:6px 0 2px;font-size:16px;font-weight:400;line-height:2;text-decoration:none}.about-wrap .wp-person .title{display:block}.about-wrap #wp-people-group-validators+p.wp-credits-list{margin-top:0}.about-wrap p.wp-credits-list a{white-space:nowrap}.freedoms-php .about-wrap ol{margin:40px 60px}.freedoms-php .about-wrap ol li{list-style-type:decimal;font-weight:600}.freedoms-php .about-wrap ol p{font-weight:400;margin:.6em 0}.freedoms-php .column .freedoms-image{background-image:url(https://s.w.org/wp-content/themes/pub/wporg-main/images/freedoms-2x.png);background-size:100%;padding-top:100%}.freedoms-php .column:nth-of-type(2) .freedoms-image{background-position:100% 34%}.freedoms-php .column:nth-of-type(3) .freedoms-image{background-position:100% 66%}.freedoms-php .column:nth-of-type(4) .freedoms-image{background-position:100% 100%}@media screen and (max-width:782px){.about-wrap .has-3-columns,.about-wrap .has-4-columns{-ms-grid-columns:1fr 1fr;grid-template-columns:1fr 1fr}.about-wrap .has-3-columns .column:nth-of-type(3n+1),.about-wrap .has-4-columns .column:nth-of-type(4n+1){-ms-grid-column:1;grid-column-start:1;-ms-grid-row:1;grid-row-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n+2),.about-wrap .has-4-columns .column:nth-of-type(4n+2){-ms-grid-column:2;grid-column-start:2;-ms-grid-row:1;grid-row-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n),.about-wrap .has-4-columns .column:nth-of-type(4n+3){-ms-grid-column:1;grid-column-start:1;-ms-grid-row:2;grid-row-start:2}.about-wrap .has-4-columns .column:nth-of-type(4n){-ms-grid-column:2;grid-column-start:2;-ms-grid-row:2;grid-row-start:2}}@media screen and (max-width:600px){.about-wrap .has-2-columns,.about-wrap .has-3-columns,.about-wrap .has-4-columns{display:block}.about-wrap :not(.is-wider-right):not(.is-wider-left) .column{margin-left:0;margin-right:0}.about-wrap .has-2-columns.is-wider-left,.about-wrap .has-2-columns.is-wider-right{display:-ms-grid;display:grid}}@media only screen and (max-width:500px){.about-wrap{margin-left:20px;margin-right:10px}.about-wrap .about-text,.about-wrap h1{margin-left:0}.about-wrap .about-text{margin-bottom:.25em}.about-wrap .wp-badge{position:relative;margin-bottom:1.5em;width:100%}}@media only screen and (max-width:480px){.about-wrap .has-2-columns.is-wider-left,.about-wrap .has-2-columns.is-wider-right{display:block}.about-wrap .column{margin-left:0;margin-right:0}.about-wrap .has-2-columns.is-wider-left img,.about-wrap .has-2-columns.is-wider-right img{max-width:160px}} \ No newline at end of file diff --git a/wp-admin/css/about.css b/wp-admin/css/about.css new file mode 100644 index 0000000..0cfca9f --- /dev/null +++ b/wp-admin/css/about.css @@ -0,0 +1,1201 @@ +/*------------------------------------------------------------------------------ + 22.0 - About Pages + + 1.0 Global: About, Credits, Freedoms, Privacy + 1.1 Layout + 1.2 Typography & Elements + 1.3 Header + 2.0 Credits Page + 3.0 Freedoms Page + x.2.0 Legacy About Styles: Global + x.2.1 Typography + x.2.2 Structure + x.2.3 Point Releases + x.3.0 Legacy About Styles: About Page + x.3.1 Typography + x.3.2 Structure + x.4.0 Legacy About Styles: Credits & Freedoms Pages + x.5.0 Legacy About Styles: Media Queries +------------------------------------------------------------------------------*/ + +.about__container { + /* Section backgrounds */ + --background: #f3f4f5; + --subtle-background: #bde7f0; + /* Main text color */ + --text: #32373c; + --text-light: #f3f4f5; + /* Navigation colors. */ + --nav-background: #216bce; + --nav-border: #1730e5; + --nav-color: #f3f4f5; + /* Reds, used as accents & in header. */ + --accent-1: #1730e5; + --accent-2: #216bce; + --accent-3: #bde7f0; +} + +/*------------------------------------------------------------------------------ + 1.0 - Global: About, Credits, Freedoms, Privacy +------------------------------------------------------------------------------*/ + +.about-php, +.credits-php, +.freedoms-php, +.privacy-php { + background: #fff; +} + +.about-php #wpcontent, +.credits-php #wpcontent, +.freedoms-php #wpcontent, +.privacy-php #wpcontent { + background: white; + padding: 0 24px; +} + +@media screen and (max-width: 782px) { + .about-php.auto-fold #wpcontent, + .credits-php.auto-fold #wpcontent, + .freedoms-php.auto-fold #wpcontent, + .privacy-php.auto-fold #wpcontent { + padding-left: 24px; + } +} + +.about__container { + max-width: 1000px; + margin: 24px auto; + clear: both; +} + +.about__container .alignleft { + float: left; +} + +.about__container .alignright { + float: right; +} + +.about__container .aligncenter { + text-align: center; +} + +.about__container .is-vertically-aligned-top { + -ms-grid-row-align: start; + align-self: start; +} + +.about__container .is-vertically-aligned-center { + -ms-grid-row-align: center; + align-self: center; +} + +.about__container .is-vertically-aligned-bottom { + -ms-grid-row-align: end; + align-self: end; +} + +.about__section { + background: #f3f4f5; + background: var(--background); + clear: both; +} + +.about__container .has-accent-background-color { + color: #f3f4f5; + color: var(--text-light); + background-color: #1730e5; + background-color: var(--accent-1); +} + +.about__container .has-subtle-background-color { + background-color: #bde7f0; + background-color: var(--subtle-background); +} + +/* 1.1 - Layout */ + +.about__section { + margin: 0; +} + +.about__section .column { + padding: 32px; +} + +.about__section .column.is-edge-to-edge { + padding: 0; +} + +.about__section .column p:first-of-type { + margin-top: 0; +} + +.about__section .column p:last-of-type { + margin-bottom: 0; +} + +.about__section .is-section-header { + margin-bottom: 0; + padding: 32px 32px 0; +} + +/* Section header is alone in a container. */ +.about__section .is-section-header:first-child:last-child { + padding: 0; +} + +.about__section.is-feature { + padding: 32px; +} + +.about__section.is-feature p { + margin: 0; +} + +.about__section.is-feature p + p { + margin-top: 1rem; +} + +.about__section.has-2-columns, +.about__section.has-3-columns, +.about__section.has-4-columns { + display: -ms-grid; + display: grid; +} + +.about__section.has-2-columns { + -ms-grid-columns: 1fr 1fr; + grid-template-columns: 1fr 1fr; +} + +.about__section.has-2-columns.is-wider-right { + -ms-grid-columns: 1fr 2fr; + grid-template-columns: 1fr 2fr; +} + +.about__section.has-2-columns.is-wider-left { + -ms-grid-columns: 2fr 1fr; + grid-template-columns: 2fr 1fr; +} + +.about__section.has-2-columns .is-section-header { + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-column-span: 2; + grid-column-end: span 2; +} + +.about__section.has-2-columns .column:nth-of-type(2n+1) { + -ms-grid-column: 1; + grid-column-start: 1; +} + +.about__section.has-2-columns .column:nth-of-type(2n) { + -ms-grid-column: 2; + grid-column-start: 2; +} + +.about__section.has-3-columns { + -ms-grid-columns: (1fr)[3]; + grid-template-columns: repeat(3, 1fr); +} + +.about__section.has-3-columns .is-section-header { + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-column-span: 3; + grid-column-end: span 3; +} + +.about__section.has-3-columns .column:nth-of-type(3n+1) { + -ms-grid-column: 1; + grid-column-start: 1; +} + +.about__section.has-3-columns .column:nth-of-type(3n+2) { + -ms-grid-column: 2; + grid-column-start: 2; +} + +.about__section.has-3-columns .column:nth-of-type(3n) { + -ms-grid-column: 3; + grid-column-start: 3; +} + +.about__section.has-4-columns { + -ms-grid-columns: (1fr)[4]; + grid-template-columns: repeat(4, 1fr); +} + +.about__section.has-4-columns .is-section-header { + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-column-span: 4; + grid-column-end: span 4; +} + +.about__section.has-4-columns .column:nth-of-type(4n+1) { + -ms-grid-column: 1; + grid-column-start: 1; +} + +.about__section.has-4-columns .column:nth-of-type(4n+2) { + -ms-grid-column: 2; + grid-column-start: 2; +} + +.about__section.has-4-columns .column:nth-of-type(4n+3) { + -ms-grid-column: 3; + grid-column-start: 3; +} + +.about__section.has-4-columns .column:nth-of-type(4n) { + -ms-grid-column: 4; + grid-column-start: 4; +} + +/* Any columns following a section header need to be expicitly put into the second row, for IE support. */ +.about__section.has-2-columns .is-section-header ~ .column, +.about__section.has-3-columns .is-section-header ~ .column, +.about__section.has-4-columns .is-section-header ~ .column { + -ms-grid-row: 2; + grid-row-start: 2; +} + +@media screen and (max-width: 782px) { + .about__section.has-3-columns, + .about__section.has-4-columns { + display: block; + padding-bottom: 16px; + } + + .about__section.has-3-columns .column:nth-of-type(n), + .about__section.has-4-columns .column:nth-of-type(n) { + padding-top: 16px; + padding-bottom: 16px; + } +} + +@media screen and (max-width: 600px) { + .about__section.has-2-columns { + display: flex; /* This is flex, not block, so we can use order below. */ + flex-wrap: wrap; + align-content: stretch; + padding-bottom: 16px; + } + + .about__section.has-2-columns .column:nth-of-type(n) { + padding-top: 16px; + padding-bottom: 16px; + width: 100%; + } + + .about__section.has-2-columns .is-edge-to-edge { + order: -1; + } +} + +/* 1.2 - Typography & Elements */ + +.about__container { + line-height: 1.4; +} + +.about__container h1 { + margin: 0 0 1em; + padding: 0; + font-weight: 600; + color: inherit; +} + +.about__container h1, +.about__container h2 { + margin-top: 0; + font-size: 1.4em; + line-height: 1.4; +} + +.about__container h3, +.about__container h2.is-smaller-heading { + margin-top: 0; + font-size: 1em; +} + +.about__container p { + font-size: inherit; + line-height: inherit; +} + +.about__section a { + color: #1730e5; + color: var(--accent-1); + text-decoration: underline; +} + +.about__section a:hover, +.about__section a:active, +.about__section a:focus { + text-decoration: none; +} + +.wp-credits-list a { + text-decoration: none; +} + +.wp-credits-list a:hover, +.wp-credits-list a:active, +.wp-credits-list a:focus { + text-decoration: underline; +} + +.about__container ul { + list-style: disc; + margin-left: 16px; +} + +.about__container img { + margin: 0; + vertical-align: middle; +} + +.about__container .about__image { + display: -ms-grid; + display: grid; + align-items: center; + justify-content: center; + height: 100%; + overflow: hidden; +} + +.about__container .about__image img { + max-width: 100%; + width: 100%; + height: auto; +} + +.about__container hr { + margin: 0; + height: 32px; + border: none; +} + +.about__container hr.is-small { + height: 8px; +} + +.about__container div.updated, +.about__container div.error, +.about__container .notice { + display: none !important; +} + +.about__section { + font-size: 1.2em; +} + +.about__section.is-feature { + font-size: 1.6em; + font-weight: 600; + text-align: center; +} + +@media screen and (max-width: 480px) { + .about__section.is-feature { + font-size: 1.4em; + font-weight: 500; + } +} + +/* 1.3 - Header */ + +.about__header { + margin-bottom: 32px; + background-color: #f3f4f5; + background-color: var(--background); + background-repeat: no-repeat; + background-position: top right; + background-size: contain; + background-image: url('https://s.w.org/images/core/5.4/header-diagonal.svg'); +} + +.rtl .about__header { + background-image: url('https://s.w.org/images/core/5.4/header-diagonal-rtl.svg'); +} + +.about__header > div { + display: flex; +} + +.about__header > div > * { + align-self: flex-end; +} + +.about__header-title { + min-height: 24em; + max-height: 32em; + height: 80vh; + padding: 0 32px; +} + +.about__header-title p { + margin: 0; + padding: 0; + font-size: 4em; + line-height: 1; + font-weight: 500; + color: #1730e5; + color: var(--accent-1); +} + +.about__header-title p span { + display: inline-block; + color: #216bce; + color: var(--accent-2); +} + +.about__header-text { + padding: 16px 32px 32px; + font-size: 1.5em; + line-height: 1.4; +} + +.about__header-text p { + margin: 0; +} + +.about__header-navigation { + padding-top: 0; + background: #216bce; + background: var(--nav-background); + color: #f3f4f5; + color: var(--nav-color); + border-bottom: 3px solid #1730e5; + border-bottom: 3px solid var(--nav-border); +} + +.about__header-navigation .nav-tab { + margin-left: 0; + padding: 24px 32px; + font-size: 1.4em; + line-height: 1; + border-width: 0 0 3px; + border-style: solid; + border-color: transparent; + background: transparent; + color: inherit; +} + +.about__header-navigation .nav-tab:hover, +.about__header-navigation .nav-tab:active { + background-color: #1730e5; + background-color: var(--accent-1); +} + +.about__header-navigation .nav-tab-active { + margin-bottom: -3px; + border-width: 0 0 6px; + border-color: #bde7f0; + border-color: var(--accent-3); +} + +.about__header-navigation .nav-tab-active:hover, +.about__header-navigation .nav-tab-active:active { + background-color: #1730e5; + background-color: var(--accent-1); + border-color: #bde7f0; + border-color: var(--accent-3); +} + +@media screen and (max-width: 782px) { + .about__container .about__header-text { + font-size: 1.4em; + } + + .about__header-title { + min-height: 0; + max-height: none; + height: auto; + /* + * 60% is a "magic" number to create a top offset approx-equal to the height of the background image, + * which scales to match the container width. + */ + padding-top: 60%; + } + + .about__header-navigation .nav-tab { + margin-top: 0; + margin-right: 0; + padding: 24px 16px; + } +} + +@media screen and (max-width: 480px) { + .about__header-title p { + font-size: 3.2em; + } + + .about__header-navigation .nav-tab { + float: none; + display: block; + margin-bottom: 0; + padding: 16px 16px; + border-left-width: 6px; + border-bottom: none; + } + + .about__header-navigation .nav-tab-active { + border-bottom: none; + border-left-width: 6px; + } +} + + +/*------------------------------------------------------------------------------ + 2.0 - Credits Page +------------------------------------------------------------------------------*/ + +.about__section .wp-people-group { + margin: 0; +} + +.about__section .wp-person { + display: inline-block; + vertical-align: top; + box-sizing: border-box; + padding: 0 1em 1em 0; + height: 6em; + width: calc( 33% - 4px ); + min-width: 280px; +} + +.about__section .compact .wp-person { + height: auto; + width: calc( 25% - 4px ); + min-width: 220px; + padding-bottom: 0.5em; +} + +.about__section .wp-person .gravatar { + float: left; + margin: -4px 0.85em 0.85em 0; + padding: 1px; + width: 80px; + height: 80px; + border-radius: 100%; +} + +.about__section .compact .wp-person .gravatar { + width: 40px; + height: 40px; +} + +.about__section .wp-person .web { + font-size: 1.4em; + font-weight: 600; + text-decoration: none; + color: #32373c; + color: var(--text); +} + +.about__section .wp-person .web:hover { + text-decoration: underline; +} + +.about__section .compact .wp-person .web { + font-size: 1.2em; +} + +.about__section .wp-person .title { + display: block; + margin-top: 0.5em; +} + +@media screen and (max-width: 480px) { + .about__section .wp-person { + min-width: 100%; + } + + .about__section .wp-person .gravatar { + width: 60px; + height: 60px; + } + + .about__section .wp-person .web { + font-size: 1em; + } + + .about__section .compact .wp-person .web { + font-size: 1em; + } +} + + +/*------------------------------------------------------------------------------ + 3.0 - Freedoms Page +------------------------------------------------------------------------------*/ + +.about__section .column .freedoms-image { + margin-bottom: 1em; +} + + +/*------------------------------------------------------------------------------ + x.2.0 - Legacy About Styles: Global +------------------------------------------------------------------------------*/ + +.about-wrap { + position: relative; + margin: 25px 40px 0 20px; + max-width: 1050px; /* readability */ + font-size: 15px; +} + +.about-wrap.full-width-layout { + max-width: 1200px; +} + +.about-wrap-content { + max-width: 1050px; +} + +.about-wrap div.updated, +.about-wrap div.error, +.about-wrap .notice { + display: none !important; +} + +.about-wrap hr { + border: 0; + height: 0; + margin: 3em 0 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +.about-wrap img { + margin: 0; + width: 100%; + height: auto; + vertical-align: middle; +} + +.about-wrap .inline-svg img { + max-width: 100%; + width: auto; + height: auto; +} + +.about-wrap video { + margin: 1.5em auto; +} + +/* WordPress Version Badge */ + +.wp-badge { + background: #0073aa url(../images/w-logo-white.png?ver=20160308) no-repeat; + background-position: center 25px; + background-size: 80px 80px; + color: #fff; + font-size: 14px; + text-align: center; + font-weight: 600; + margin: 5px 0 0; + padding-top: 120px; + height: 40px; + display: inline-block; + width: 140px; + text-rendering: optimizeLegibility; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); +} + +.svg .wp-badge { + background-image: url(../images/wordpress-logo-white.svg?ver=20160308); +} + +.about-wrap .wp-badge { + position: absolute; + top: 0; + right: 0; +} + +/* Tabs */ + +.about-wrap .nav-tab { + padding-right: 15px; + padding-left: 15px; + font-size: 18px; + line-height: 1.33333333; +} + +/* x.2.1 - Typography */ + +.about-wrap h1 { + margin: 0.2em 200px 0 0; + padding: 0; + color: #32373c; + line-height: 1.2; + font-size: 2.8em; + font-weight: 400; +} + +.about-wrap h2 { + margin: 40px 0 0.6em; + font-size: 2.7em; + line-height: 1.3; + font-weight: 300; + text-align: center; +} + +.about-wrap h3 { + margin: 1.25em 0 0.6em; + font-size: 1.4em; + line-height: 1.5; +} + +.about-wrap h4 { + font-size: 16px; + color: #23282d; +} + +.about-wrap p { + line-height: 1.5; + font-size: 16px; +} + +.about-wrap code, +.about-wrap ol li p { + font-size: 14px; + font-weight: 400; +} + +.about-wrap figcaption { + font-size: 13px; + text-align: center; + color: white; + text-overflow: ellipsis; +} + +.about-wrap .about-description, +.about-wrap .about-text { + margin-top: 1.4em; + font-weight: 400; + line-height: 1.6; + font-size: 19px; +} + +.about-wrap .about-text { + margin: 1em 200px 1em 0; + color: #555d66; +} + +/* x.2.2 - Structure */ + +.about-wrap .has-1-columns, +.about-wrap .has-2-columns, +.about-wrap .has-3-columns, +.about-wrap .has-4-columns { + display: -ms-grid; + display: grid; + max-width: 800px; + margin-top: 40px; + margin-left: auto; + margin-right: auto; +} + +.about-wrap .column { + margin-right: 20px; + margin-left: 20px; +} + +.about-wrap .is-wide { + max-width: 760px; +} + +.about-wrap .is-fullwidth { + max-width: 100%; +} + +.about-wrap .has-1-columns { + display: block; + max-width: 680px; + margin: 0 auto 40px; +} + +.about-wrap .has-2-columns { + -ms-grid-columns: 1fr 1fr; + grid-template-columns: 1fr 1fr; +} + +.about-wrap .has-2-columns .column:nth-of-type(2n+1) { + -ms-grid-column: 1; + grid-column-start: 1; +} + +.about-wrap .has-2-columns .column:nth-of-type(2n) { + -ms-grid-column: 2; + grid-column-start: 2; +} + +.about-wrap .has-2-columns.is-wider-right { + -ms-grid-columns: 1fr 2fr; + grid-template-columns: 1fr 2fr; +} + +.about-wrap .has-2-columns.is-wider-left { + -ms-grid-columns: 2fr 1fr; + grid-template-columns: 2fr 1fr; +} + +.about-wrap .has-3-columns { + -ms-grid-columns: (1fr)[3]; + grid-template-columns: repeat(3, 1fr); +} + +.about-wrap .has-3-columns .column:nth-of-type(3n+1) { + -ms-grid-column: 1; + grid-column-start: 1; +} + +.about-wrap .has-3-columns .column:nth-of-type(3n+2) { + -ms-grid-column: 2; + grid-column-start: 2; +} + +.about-wrap .has-3-columns .column:nth-of-type(3n) { + -ms-grid-column: 3; + grid-column-start: 3; +} + +.about-wrap .has-4-columns { + -ms-grid-columns: (1fr)[4]; + grid-template-columns: repeat(4, 1fr); +} + +.about-wrap .has-4-columns .column:nth-of-type(4n+1) { + -ms-grid-column: 1; + grid-column-start: 1; +} + +.about-wrap .has-4-columns .column:nth-of-type(4n+2) { + -ms-grid-column: 2; + grid-column-start: 2; +} + +.about-wrap .has-4-columns .column:nth-of-type(4n+3) { + -ms-grid-column: 3; + grid-column-start: 3; +} + +.about-wrap .has-4-columns .column:nth-of-type(4n) { + -ms-grid-column: 4; + grid-column-start: 4; +} + +.about-wrap .column :first-child { + margin-top: 0; +} + +.about-wrap .aligncenter { + text-align: center; +} + +.about-wrap .alignleft { + float: left; + margin-right: 40px; +} + +.about-wrap .alignright { + float: right; + margin-left: 40px; +} + +.about-wrap .is-vertically-aligned-top { + -ms-grid-row-align: start; + align-self: start; +} + +.about-wrap .is-vertically-aligned-center { + -ms-grid-row-align: center; + align-self: center; +} + +.about-wrap .is-vertically-aligned-bottom { + -ms-grid-row-align: end; + align-self: end; +} + +/* x.2.3 - Point Releases */ + +.about-wrap .point-releases { + margin-top: 5px; + border-bottom: 1px solid #ddd; +} + +.about-wrap .changelog { + margin-bottom: 40px; +} + +.about-wrap .changelog.point-releases h3 { + padding-top: 35px; +} + +.about-wrap .changelog.point-releases h3:first-child { + padding-top: 7px; +} + +.about-wrap .changelog.feature-section .col { + margin-top: 40px; +} + +/*------------------------------------------------------------------------------ + x.3.0 - Legacy About Styles: About Page +------------------------------------------------------------------------------*/ + +/* x.3.1 - Typography */ + +.about-wrap .lead-description { + font-size: 1.5em; + text-align: center; +} + +.about-wrap .feature-section p { + margin-top: 0.6em; +} + +/* x.3.2 - Structure */ + +.about-wrap .headline-feature { + margin: 0 auto 40px; + max-width: 680px; +} + +.about-wrap .headline-feature h2 { + margin: 50px 0 0; +} + +.about-wrap .headline-feature img { + max-width: 600px; + width: 100%; +} + +/* Return to Dashboard Home link */ + +.about-wrap .return-to-dashboard { + margin: 30px 0 0 -5px; + font-size: 14px; + font-weight: 600; +} + +.about-wrap .return-to-dashboard a { + text-decoration: none; + padding: 0 5px; +} + +/*------------------------------------------------------------------------------ + x.4.0 - Legacy About Styles: Credits & Freedoms Pages +------------------------------------------------------------------------------*/ + +/* Credits */ + +.about-wrap h2.wp-people-group { + margin: 2.6em 0 1.33em; + padding: 0; + font-size: 16px; + line-height: inherit; + font-weight: 600; + text-align: left; +} + +.about-wrap .wp-people-group { + padding: 0 5px; + margin: 0 -15px 0 -5px; +} + +.about-wrap .compact { + margin-bottom: 0; +} + +.about-wrap .wp-person { + display: inline-block; + vertical-align: top; + margin-right: 10px; + padding-bottom: 15px; + height: 70px; + width: 280px; +} + +.about-wrap .compact .wp-person { + height: auto; + width: 180px; + padding-bottom: 0; + margin-bottom: 0; +} + +.about-wrap .wp-person .gravatar { + float: left; + margin: 0 10px 10px 0; + padding: 1px; + width: 60px; + height: 60px; +} + +.about-wrap .compact .wp-person .gravatar { + width: 30px; + height: 30px; +} + +.about-wrap .wp-person .web { + margin: 6px 0 2px; + font-size: 16px; + font-weight: 400; + line-height: 2; + text-decoration: none; +} + +.about-wrap .wp-person .title { + display: block; +} + +.about-wrap #wp-people-group-validators + p.wp-credits-list { + margin-top: 0; +} + +.about-wrap p.wp-credits-list a { + white-space: nowrap; +} + +/* Freedoms */ + +.freedoms-php .about-wrap ol { + margin: 40px 60px; +} + +.freedoms-php .about-wrap ol li { + list-style-type: decimal; + font-weight: 600; +} + +.freedoms-php .about-wrap ol p { + font-weight: 400; + margin: 0.6em 0; +} + +.freedoms-php .column .freedoms-image { + background-image: url('https://s.w.org/wp-content/themes/pub/wporg-main/images/freedoms-2x.png'); + background-size: 100%; + padding-top: 100%; +} + +.freedoms-php .column:nth-of-type(2) .freedoms-image { + background-position: 0 34%; +} + +.freedoms-php .column:nth-of-type(3) .freedoms-image { + background-position: 0 66%; +} + +.freedoms-php .column:nth-of-type(4) .freedoms-image { + background-position: 0 100%; +} + +/*------------------------------------------------------------------------------ + x.5.0 - Legacy About Styles: Media Queries +------------------------------------------------------------------------------*/ + +@media screen and (max-width: 782px) { + .about-wrap .has-3-columns, + .about-wrap .has-4-columns { + -ms-grid-columns: 1fr 1fr; + grid-template-columns: 1fr 1fr; + } + + .about-wrap .has-3-columns .column:nth-of-type(3n+1), + .about-wrap .has-4-columns .column:nth-of-type(4n+1) { + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row: 1; + grid-row-start: 1; + } + + .about-wrap .has-3-columns .column:nth-of-type(3n+2), + .about-wrap .has-4-columns .column:nth-of-type(4n+2) { + -ms-grid-column: 2; + grid-column-start: 2; + -ms-grid-row: 1; + grid-row-start: 1; + } + + .about-wrap .has-3-columns .column:nth-of-type(3n), + .about-wrap .has-4-columns .column:nth-of-type(4n+3) { + -ms-grid-column: 1; + grid-column-start: 1; + -ms-grid-row: 2; + grid-row-start: 2; + } + + .about-wrap .has-4-columns .column:nth-of-type(4n) { + -ms-grid-column: 2; + grid-column-start: 2; + -ms-grid-row: 2; + grid-row-start: 2; + } +} + +@media screen and (max-width: 600px) { + .about-wrap .has-2-columns, + .about-wrap .has-3-columns, + .about-wrap .has-4-columns { + display: block; + } + + .about-wrap :not(.is-wider-right):not(.is-wider-left) .column { + margin-right: 0; + margin-left: 0; + } + + .about-wrap .has-2-columns.is-wider-right, + .about-wrap .has-2-columns.is-wider-left { + display: -ms-grid; + display: grid; + } +} + +@media only screen and (max-width: 500px) { + .about-wrap { + margin-right: 20px; + margin-left: 10px; + } + + .about-wrap h1, + .about-wrap .about-text { + margin-right: 0; + } + + .about-wrap .about-text { + margin-bottom: 0.25em; + } + + .about-wrap .wp-badge { + position: relative; + margin-bottom: 1.5em; + width: 100%; + } +} + +@media only screen and (max-width: 480px) { + .about-wrap .has-2-columns.is-wider-right, + .about-wrap .has-2-columns.is-wider-left { + display: block; + } + + .about-wrap .column { + margin-right: 0; + margin-left: 0; + } + + .about-wrap .has-2-columns.is-wider-right img, + .about-wrap .has-2-columns.is-wider-left img { + max-width: 160px; + } +} diff --git a/wp-admin/css/about.min.css b/wp-admin/css/about.min.css new file mode 100644 index 0000000..0cdb3c0 --- /dev/null +++ b/wp-admin/css/about.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.about__container{--background:#f3f4f5;--subtle-background:#bde7f0;--text:#32373c;--text-light:#f3f4f5;--nav-background:#216bce;--nav-border:#1730e5;--nav-color:#f3f4f5;--accent-1:#1730e5;--accent-2:#216bce;--accent-3:#bde7f0}.about-php,.credits-php,.freedoms-php,.privacy-php{background:#fff}.about-php #wpcontent,.credits-php #wpcontent,.freedoms-php #wpcontent,.privacy-php #wpcontent{background:#fff;padding:0 24px}@media screen and (max-width:782px){.about-php.auto-fold #wpcontent,.credits-php.auto-fold #wpcontent,.freedoms-php.auto-fold #wpcontent,.privacy-php.auto-fold #wpcontent{padding-left:24px}}.about__container{max-width:1000px;margin:24px auto;clear:both}.about__container .alignleft{float:left}.about__container .alignright{float:right}.about__container .aligncenter{text-align:center}.about__container .is-vertically-aligned-top{-ms-grid-row-align:start;align-self:start}.about__container .is-vertically-aligned-center{-ms-grid-row-align:center;align-self:center}.about__container .is-vertically-aligned-bottom{-ms-grid-row-align:end;align-self:end}.about__section{background:#f3f4f5;background:var(--background);clear:both}.about__container .has-accent-background-color{color:#f3f4f5;color:var(--text-light);background-color:#1730e5;background-color:var(--accent-1)}.about__container .has-subtle-background-color{background-color:#bde7f0;background-color:var(--subtle-background)}.about__section{margin:0}.about__section .column{padding:32px}.about__section .column.is-edge-to-edge{padding:0}.about__section .column p:first-of-type{margin-top:0}.about__section .column p:last-of-type{margin-bottom:0}.about__section .is-section-header{margin-bottom:0;padding:32px 32px 0}.about__section .is-section-header:first-child:last-child{padding:0}.about__section.is-feature{padding:32px}.about__section.is-feature p{margin:0}.about__section.is-feature p+p{margin-top:1rem}.about__section.has-2-columns,.about__section.has-3-columns,.about__section.has-4-columns{display:-ms-grid;display:grid}.about__section.has-2-columns{-ms-grid-columns:1fr 1fr;grid-template-columns:1fr 1fr}.about__section.has-2-columns.is-wider-right{-ms-grid-columns:1fr 2fr;grid-template-columns:1fr 2fr}.about__section.has-2-columns.is-wider-left{-ms-grid-columns:2fr 1fr;grid-template-columns:2fr 1fr}.about__section.has-2-columns .is-section-header{-ms-grid-column:1;grid-column-start:1;-ms-grid-column-span:2;grid-column-end:span 2}.about__section.has-2-columns .column:nth-of-type(2n+1){-ms-grid-column:1;grid-column-start:1}.about__section.has-2-columns .column:nth-of-type(2n){-ms-grid-column:2;grid-column-start:2}.about__section.has-3-columns{-ms-grid-columns:(1fr)[3];grid-template-columns:repeat(3,1fr)}.about__section.has-3-columns .is-section-header{-ms-grid-column:1;grid-column-start:1;-ms-grid-column-span:3;grid-column-end:span 3}.about__section.has-3-columns .column:nth-of-type(3n+1){-ms-grid-column:1;grid-column-start:1}.about__section.has-3-columns .column:nth-of-type(3n+2){-ms-grid-column:2;grid-column-start:2}.about__section.has-3-columns .column:nth-of-type(3n){-ms-grid-column:3;grid-column-start:3}.about__section.has-4-columns{-ms-grid-columns:(1fr)[4];grid-template-columns:repeat(4,1fr)}.about__section.has-4-columns .is-section-header{-ms-grid-column:1;grid-column-start:1;-ms-grid-column-span:4;grid-column-end:span 4}.about__section.has-4-columns .column:nth-of-type(4n+1){-ms-grid-column:1;grid-column-start:1}.about__section.has-4-columns .column:nth-of-type(4n+2){-ms-grid-column:2;grid-column-start:2}.about__section.has-4-columns .column:nth-of-type(4n+3){-ms-grid-column:3;grid-column-start:3}.about__section.has-4-columns .column:nth-of-type(4n){-ms-grid-column:4;grid-column-start:4}.about__section.has-2-columns .is-section-header~.column,.about__section.has-3-columns .is-section-header~.column,.about__section.has-4-columns .is-section-header~.column{-ms-grid-row:2;grid-row-start:2}@media screen and (max-width:782px){.about__section.has-3-columns,.about__section.has-4-columns{display:block;padding-bottom:16px}.about__section.has-3-columns .column:nth-of-type(n),.about__section.has-4-columns .column:nth-of-type(n){padding-top:16px;padding-bottom:16px}}@media screen and (max-width:600px){.about__section.has-2-columns{display:flex;flex-wrap:wrap;align-content:stretch;padding-bottom:16px}.about__section.has-2-columns .column:nth-of-type(n){padding-top:16px;padding-bottom:16px;width:100%}.about__section.has-2-columns .is-edge-to-edge{order:-1}}.about__container{line-height:1.4}.about__container h1{margin:0 0 1em;padding:0;font-weight:600;color:inherit}.about__container h1,.about__container h2{margin-top:0;font-size:1.4em;line-height:1.4}.about__container h2.is-smaller-heading,.about__container h3{margin-top:0;font-size:1em}.about__container p{font-size:inherit;line-height:inherit}.about__section a{color:#1730e5;color:var(--accent-1);text-decoration:underline}.about__section a:active,.about__section a:focus,.about__section a:hover{text-decoration:none}.wp-credits-list a{text-decoration:none}.wp-credits-list a:active,.wp-credits-list a:focus,.wp-credits-list a:hover{text-decoration:underline}.about__container ul{list-style:disc;margin-left:16px}.about__container img{margin:0;vertical-align:middle}.about__container .about__image{display:-ms-grid;display:grid;align-items:center;justify-content:center;height:100%;overflow:hidden}.about__container .about__image img{max-width:100%;width:100%;height:auto}.about__container hr{margin:0;height:32px;border:none}.about__container hr.is-small{height:8px}.about__container .notice,.about__container div.error,.about__container div.updated{display:none!important}.about__section{font-size:1.2em}.about__section.is-feature{font-size:1.6em;font-weight:600;text-align:center}@media screen and (max-width:480px){.about__section.is-feature{font-size:1.4em;font-weight:500}}.about__header{margin-bottom:32px;background-color:#f3f4f5;background-color:var(--background);background-repeat:no-repeat;background-position:top right;background-size:contain;background-image:url(https://s.w.org/images/core/5.4/header-diagonal.svg)}.rtl .about__header{background-image:url(https://s.w.org/images/core/5.4/header-diagonal-rtl.svg)}.about__header>div{display:flex}.about__header>div>*{align-self:flex-end}.about__header-title{min-height:24em;max-height:32em;height:80vh;padding:0 32px}.about__header-title p{margin:0;padding:0;font-size:4em;line-height:1;font-weight:500;color:#1730e5;color:var(--accent-1)}.about__header-title p span{display:inline-block;color:#216bce;color:var(--accent-2)}.about__header-text{padding:16px 32px 32px;font-size:1.5em;line-height:1.4}.about__header-text p{margin:0}.about__header-navigation{padding-top:0;background:#216bce;background:var(--nav-background);color:#f3f4f5;color:var(--nav-color);border-bottom:3px solid #1730e5;border-bottom:3px solid var(--nav-border)}.about__header-navigation .nav-tab{margin-left:0;padding:24px 32px;font-size:1.4em;line-height:1;border-width:0 0 3px;border-style:solid;border-color:transparent;background:0 0;color:inherit}.about__header-navigation .nav-tab:active,.about__header-navigation .nav-tab:hover{background-color:#1730e5;background-color:var(--accent-1)}.about__header-navigation .nav-tab-active{margin-bottom:-3px;border-width:0 0 6px;border-color:#bde7f0;border-color:var(--accent-3)}.about__header-navigation .nav-tab-active:active,.about__header-navigation .nav-tab-active:hover{background-color:#1730e5;background-color:var(--accent-1);border-color:#bde7f0;border-color:var(--accent-3)}@media screen and (max-width:782px){.about__container .about__header-text{font-size:1.4em}.about__header-title{min-height:0;max-height:none;height:auto;padding-top:60%}.about__header-navigation .nav-tab{margin-top:0;margin-right:0;padding:24px 16px}}@media screen and (max-width:480px){.about__header-title p{font-size:3.2em}.about__header-navigation .nav-tab{float:none;display:block;margin-bottom:0;padding:16px 16px;border-left-width:6px;border-bottom:none}.about__header-navigation .nav-tab-active{border-bottom:none;border-left-width:6px}}.about__section .wp-people-group{margin:0}.about__section .wp-person{display:inline-block;vertical-align:top;box-sizing:border-box;padding:0 1em 1em 0;height:6em;width:calc(33% - 4px);min-width:280px}.about__section .compact .wp-person{height:auto;width:calc(25% - 4px);min-width:220px;padding-bottom:.5em}.about__section .wp-person .gravatar{float:left;margin:-4px .85em .85em 0;padding:1px;width:80px;height:80px;border-radius:100%}.about__section .compact .wp-person .gravatar{width:40px;height:40px}.about__section .wp-person .web{font-size:1.4em;font-weight:600;text-decoration:none;color:#32373c;color:var(--text)}.about__section .wp-person .web:hover{text-decoration:underline}.about__section .compact .wp-person .web{font-size:1.2em}.about__section .wp-person .title{display:block;margin-top:.5em}@media screen and (max-width:480px){.about__section .wp-person{min-width:100%}.about__section .wp-person .gravatar{width:60px;height:60px}.about__section .wp-person .web{font-size:1em}.about__section .compact .wp-person .web{font-size:1em}}.about__section .column .freedoms-image{margin-bottom:1em}.about-wrap{position:relative;margin:25px 40px 0 20px;max-width:1050px;font-size:15px}.about-wrap.full-width-layout{max-width:1200px}.about-wrap-content{max-width:1050px}.about-wrap .notice,.about-wrap div.error,.about-wrap div.updated{display:none!important}.about-wrap hr{border:0;height:0;margin:3em 0 0;border-top:1px solid rgba(0,0,0,.1)}.about-wrap img{margin:0;width:100%;height:auto;vertical-align:middle}.about-wrap .inline-svg img{max-width:100%;width:auto;height:auto}.about-wrap video{margin:1.5em auto}.wp-badge{background:#0073aa url(../images/w-logo-white.png?ver=20160308) no-repeat;background-position:center 25px;background-size:80px 80px;color:#fff;font-size:14px;text-align:center;font-weight:600;margin:5px 0 0;padding-top:120px;height:40px;display:inline-block;width:140px;text-rendering:optimizeLegibility;box-shadow:0 1px 3px rgba(0,0,0,.2)}.svg .wp-badge{background-image:url(../images/wordpress-logo-white.svg?ver=20160308)}.about-wrap .wp-badge{position:absolute;top:0;right:0}.about-wrap .nav-tab{padding-right:15px;padding-left:15px;font-size:18px;line-height:1.33333333}.about-wrap h1{margin:.2em 200px 0 0;padding:0;color:#32373c;line-height:1.2;font-size:2.8em;font-weight:400}.about-wrap h2{margin:40px 0 .6em;font-size:2.7em;line-height:1.3;font-weight:300;text-align:center}.about-wrap h3{margin:1.25em 0 .6em;font-size:1.4em;line-height:1.5}.about-wrap h4{font-size:16px;color:#23282d}.about-wrap p{line-height:1.5;font-size:16px}.about-wrap code,.about-wrap ol li p{font-size:14px;font-weight:400}.about-wrap figcaption{font-size:13px;text-align:center;color:#fff;text-overflow:ellipsis}.about-wrap .about-description,.about-wrap .about-text{margin-top:1.4em;font-weight:400;line-height:1.6;font-size:19px}.about-wrap .about-text{margin:1em 200px 1em 0;color:#555d66}.about-wrap .has-1-columns,.about-wrap .has-2-columns,.about-wrap .has-3-columns,.about-wrap .has-4-columns{display:-ms-grid;display:grid;max-width:800px;margin-top:40px;margin-left:auto;margin-right:auto}.about-wrap .column{margin-right:20px;margin-left:20px}.about-wrap .is-wide{max-width:760px}.about-wrap .is-fullwidth{max-width:100%}.about-wrap .has-1-columns{display:block;max-width:680px;margin:0 auto 40px}.about-wrap .has-2-columns{-ms-grid-columns:1fr 1fr;grid-template-columns:1fr 1fr}.about-wrap .has-2-columns .column:nth-of-type(2n+1){-ms-grid-column:1;grid-column-start:1}.about-wrap .has-2-columns .column:nth-of-type(2n){-ms-grid-column:2;grid-column-start:2}.about-wrap .has-2-columns.is-wider-right{-ms-grid-columns:1fr 2fr;grid-template-columns:1fr 2fr}.about-wrap .has-2-columns.is-wider-left{-ms-grid-columns:2fr 1fr;grid-template-columns:2fr 1fr}.about-wrap .has-3-columns{-ms-grid-columns:(1fr)[3];grid-template-columns:repeat(3,1fr)}.about-wrap .has-3-columns .column:nth-of-type(3n+1){-ms-grid-column:1;grid-column-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n+2){-ms-grid-column:2;grid-column-start:2}.about-wrap .has-3-columns .column:nth-of-type(3n){-ms-grid-column:3;grid-column-start:3}.about-wrap .has-4-columns{-ms-grid-columns:(1fr)[4];grid-template-columns:repeat(4,1fr)}.about-wrap .has-4-columns .column:nth-of-type(4n+1){-ms-grid-column:1;grid-column-start:1}.about-wrap .has-4-columns .column:nth-of-type(4n+2){-ms-grid-column:2;grid-column-start:2}.about-wrap .has-4-columns .column:nth-of-type(4n+3){-ms-grid-column:3;grid-column-start:3}.about-wrap .has-4-columns .column:nth-of-type(4n){-ms-grid-column:4;grid-column-start:4}.about-wrap .column :first-child{margin-top:0}.about-wrap .aligncenter{text-align:center}.about-wrap .alignleft{float:left;margin-right:40px}.about-wrap .alignright{float:right;margin-left:40px}.about-wrap .is-vertically-aligned-top{-ms-grid-row-align:start;align-self:start}.about-wrap .is-vertically-aligned-center{-ms-grid-row-align:center;align-self:center}.about-wrap .is-vertically-aligned-bottom{-ms-grid-row-align:end;align-self:end}.about-wrap .point-releases{margin-top:5px;border-bottom:1px solid #ddd}.about-wrap .changelog{margin-bottom:40px}.about-wrap .changelog.point-releases h3{padding-top:35px}.about-wrap .changelog.point-releases h3:first-child{padding-top:7px}.about-wrap .changelog.feature-section .col{margin-top:40px}.about-wrap .lead-description{font-size:1.5em;text-align:center}.about-wrap .feature-section p{margin-top:.6em}.about-wrap .headline-feature{margin:0 auto 40px;max-width:680px}.about-wrap .headline-feature h2{margin:50px 0 0}.about-wrap .headline-feature img{max-width:600px;width:100%}.about-wrap .return-to-dashboard{margin:30px 0 0 -5px;font-size:14px;font-weight:600}.about-wrap .return-to-dashboard a{text-decoration:none;padding:0 5px}.about-wrap h2.wp-people-group{margin:2.6em 0 1.33em;padding:0;font-size:16px;line-height:inherit;font-weight:600;text-align:left}.about-wrap .wp-people-group{padding:0 5px;margin:0 -15px 0 -5px}.about-wrap .compact{margin-bottom:0}.about-wrap .wp-person{display:inline-block;vertical-align:top;margin-right:10px;padding-bottom:15px;height:70px;width:280px}.about-wrap .compact .wp-person{height:auto;width:180px;padding-bottom:0;margin-bottom:0}.about-wrap .wp-person .gravatar{float:left;margin:0 10px 10px 0;padding:1px;width:60px;height:60px}.about-wrap .compact .wp-person .gravatar{width:30px;height:30px}.about-wrap .wp-person .web{margin:6px 0 2px;font-size:16px;font-weight:400;line-height:2;text-decoration:none}.about-wrap .wp-person .title{display:block}.about-wrap #wp-people-group-validators+p.wp-credits-list{margin-top:0}.about-wrap p.wp-credits-list a{white-space:nowrap}.freedoms-php .about-wrap ol{margin:40px 60px}.freedoms-php .about-wrap ol li{list-style-type:decimal;font-weight:600}.freedoms-php .about-wrap ol p{font-weight:400;margin:.6em 0}.freedoms-php .column .freedoms-image{background-image:url(https://s.w.org/wp-content/themes/pub/wporg-main/images/freedoms-2x.png);background-size:100%;padding-top:100%}.freedoms-php .column:nth-of-type(2) .freedoms-image{background-position:0 34%}.freedoms-php .column:nth-of-type(3) .freedoms-image{background-position:0 66%}.freedoms-php .column:nth-of-type(4) .freedoms-image{background-position:0 100%}@media screen and (max-width:782px){.about-wrap .has-3-columns,.about-wrap .has-4-columns{-ms-grid-columns:1fr 1fr;grid-template-columns:1fr 1fr}.about-wrap .has-3-columns .column:nth-of-type(3n+1),.about-wrap .has-4-columns .column:nth-of-type(4n+1){-ms-grid-column:1;grid-column-start:1;-ms-grid-row:1;grid-row-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n+2),.about-wrap .has-4-columns .column:nth-of-type(4n+2){-ms-grid-column:2;grid-column-start:2;-ms-grid-row:1;grid-row-start:1}.about-wrap .has-3-columns .column:nth-of-type(3n),.about-wrap .has-4-columns .column:nth-of-type(4n+3){-ms-grid-column:1;grid-column-start:1;-ms-grid-row:2;grid-row-start:2}.about-wrap .has-4-columns .column:nth-of-type(4n){-ms-grid-column:2;grid-column-start:2;-ms-grid-row:2;grid-row-start:2}}@media screen and (max-width:600px){.about-wrap .has-2-columns,.about-wrap .has-3-columns,.about-wrap .has-4-columns{display:block}.about-wrap :not(.is-wider-right):not(.is-wider-left) .column{margin-right:0;margin-left:0}.about-wrap .has-2-columns.is-wider-left,.about-wrap .has-2-columns.is-wider-right{display:-ms-grid;display:grid}}@media only screen and (max-width:500px){.about-wrap{margin-right:20px;margin-left:10px}.about-wrap .about-text,.about-wrap h1{margin-right:0}.about-wrap .about-text{margin-bottom:.25em}.about-wrap .wp-badge{position:relative;margin-bottom:1.5em;width:100%}}@media only screen and (max-width:480px){.about-wrap .has-2-columns.is-wider-left,.about-wrap .has-2-columns.is-wider-right{display:block}.about-wrap .column{margin-right:0;margin-left:0}.about-wrap .has-2-columns.is-wider-left img,.about-wrap .has-2-columns.is-wider-right img{max-width:160px}} \ No newline at end of file diff --git a/wp-admin/css/admin-menu-rtl.css b/wp-admin/css/admin-menu-rtl.css new file mode 100644 index 0000000..b8aa25c --- /dev/null +++ b/wp-admin/css/admin-menu-rtl.css @@ -0,0 +1,930 @@ +/*! This file is auto-generated */ +#adminmenuback, +#adminmenuwrap, +#adminmenu, +#adminmenu .wp-submenu { + width: 160px; + background-color: #23282d; +} + +#adminmenuback { + position: fixed; + top: 0; + bottom: -120px; + z-index: 1; /* positive z-index to avoid elastic scrolling woes in Safari */ +} + +#adminmenu { + clear: right; + margin: 12px 0; + padding: 0; + list-style: none; +} + +.folded #adminmenuback, +.folded #adminmenuwrap, +.folded #adminmenu, +.folded #adminmenu li.menu-top { + width: 36px; +} + +.icon16 { + height: 18px; + width: 18px; + padding: 6px 6px; + margin: -6px -8px 0 0; + float: right; +} + +/* New Menu icons */ + +.icon16:before { + color: #82878c; /* same as new icons */ + font: normal 20px/1 dashicons; + speak: none; + padding: 6px 0; + height: 34px; + width: 20px; + display: inline-block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + transition: all .1s ease-in-out; +} + +.icon16.icon-dashboard:before { + content: "\f226"; +} + +.icon16.icon-post:before { + content: "\f109"; +} + +.icon16.icon-media:before { + content: "\f104"; +} + +.icon16.icon-links:before { + content: "\f103"; +} + +.icon16.icon-page:before { + content: "\f105"; +} + +.icon16.icon-comments:before { + content: "\f101"; + margin-top: 1px; +} + +.icon16.icon-appearance:before { + content: "\f100"; +} + +.icon16.icon-plugins:before { + content: "\f106"; +} + +.icon16.icon-users:before { + content: "\f110"; +} + +.icon16.icon-tools:before { + content: "\f107"; +} + +.icon16.icon-settings:before { + content: "\f108"; +} + +.icon16.icon-site:before { + content: "\f541"; +} + +.icon16.icon-generic:before { + content: "\f111"; +} + +/* hide background-image for icons above */ +.icon16.icon-dashboard, +.menu-icon-dashboard div.wp-menu-image, +.icon16.icon-post, +.menu-icon-post div.wp-menu-image, +.icon16.icon-media, +.menu-icon-media div.wp-menu-image, +.icon16.icon-links, +.menu-icon-links div.wp-menu-image, +.icon16.icon-page, +.menu-icon-page div.wp-menu-image, +.icon16.icon-comments, +.menu-icon-comments div.wp-menu-image, +.icon16.icon-appearance, +.menu-icon-appearance div.wp-menu-image, +.icon16.icon-plugins, +.menu-icon-plugins div.wp-menu-image, +.icon16.icon-users, +.menu-icon-users div.wp-menu-image, +.icon16.icon-tools, +.menu-icon-tools div.wp-menu-image, +.icon16.icon-settings, +.menu-icon-settings div.wp-menu-image, +.icon16.icon-site, +.menu-icon-site div.wp-menu-image, +.icon16.icon-generic, +.menu-icon-generic div.wp-menu-image { + background-image: none !important; +} + +/*------------------------------------------------------------------------------ + 7.0 - Main Navigation (Left Menu) +------------------------------------------------------------------------------*/ + +#adminmenuwrap { + position: relative; + float: right; + z-index: 9990; +} + +/* side admin menu */ +#adminmenu * { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#adminmenu li { + margin: 0; + padding: 0; + cursor: pointer; +} + +#adminmenu a { + display: block; + line-height: 1.3; + padding: 2px 5px; + color: #eee; +} + +#adminmenu .wp-submenu a { + color: #b4b9be; + color: rgba(240, 245, 250, 0.7); + font-size: 13px; + line-height: 1.4; + margin: 0; + padding: 5px 0; +} + +#adminmenu .wp-submenu a:hover, +#adminmenu .wp-submenu a:focus { + background: none; +} + +#adminmenu a:hover, +#adminmenu li.menu-top > a:focus, +#adminmenu .wp-submenu a:hover, +#adminmenu .wp-submenu a:focus { + color: #00b9eb; +} + +#adminmenu li.menu-top { + border: none; + min-height: 34px; + position: relative; +} + +#adminmenu .wp-submenu { + list-style: none; + position: absolute; + top: -1000em; + right: 160px; + overflow: visible; + word-wrap: break-word; +} + +#adminmenu .wp-submenu, +.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu { + padding: 7px 0 8px; + z-index: 9999; + background-color: #32373c; + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); +} + +.js #adminmenu .sub-open, +.js #adminmenu .opensub .wp-submenu, +#adminmenu a.menu-top:focus + .wp-submenu, +.no-js li.wp-has-submenu:hover .wp-submenu { + top: -1px; +} + +#adminmenu .wp-has-current-submenu .wp-submenu, +.no-js li.wp-has-current-submenu:hover .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu.sub-open, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu { + position: relative; + z-index: 3; + top: auto; + right: auto; + left: auto; + bottom: auto; + border: 0 none; + margin-top: 0; + box-shadow: none; + background-color: #32373c; +} + +/* ensure that wp-submenu's box shadow doesn't appear on top of the focused menu item's background. */ +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + position: relative; + background-color: #191e23; + color: #00b9eb; +} + +.folded #adminmenu li.menu-top:hover, +.folded #adminmenu li.opensub > a.menu-top, +.folded #adminmenu li > a.menu-top:focus { + z-index: 10000; +} + +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.current a.menu-top, +.folded #adminmenu li.wp-has-current-submenu, +.folded #adminmenu li.current.menu-top, +#adminmenu .wp-menu-arrow, +#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head, +#adminmenu .wp-menu-arrow div { + background: #0073aa; + color: #fff; +} + +.folded #adminmenu .wp-submenu.sub-open, +.folded #adminmenu .opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open, +.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu a.menu-top:focus + .wp-submenu, +.folded #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu, +.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu { + top: 0; + right: 36px; +} + +.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu { + position: absolute; + top: -1000em; +} + +#adminmenu .wp-not-current-submenu .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu { + min-width: 160px; + width: auto; +} + +#adminmenu .wp-submenu li.current, +#adminmenu .wp-submenu li.current a, +#adminmenu .opensub .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-submenu li.current a:hover, +#adminmenu .wp-submenu li.current a:focus { + color: #fff; +} + +#adminmenu .wp-not-current-submenu li > a, +.folded #adminmenu .wp-has-current-submenu li > a { + padding-left: 16px; + padding-right: 14px; + /* Exclude from the transition the outline for Windows High Contrast mode */ + transition: all .1s ease-in-out, outline 0s; +} + +#adminmenu .wp-has-current-submenu ul > li > a, +.folded #adminmenu li.menu-top .wp-submenu > li > a { + padding: 5px 12px; +} + +#adminmenu a.menu-top, +#adminmenu .wp-submenu-head { + font-size: 14px; + font-weight: 400; + line-height: 1.3; + padding: 0; +} + +#adminmenu .wp-submenu-head { + display: none; +} + +.folded #adminmenu .wp-menu-name { + position: absolute; + right: -999px; +} + +.folded #adminmenu .wp-submenu-head { + display: block; +} + +#adminmenu .wp-submenu li { + padding: 0; + margin: 0; +} + +#adminmenu .wp-menu-image img { + padding: 9px 0 0 0; + opacity: 0.6; + filter: alpha(opacity=60); +} + +#adminmenu div.wp-menu-name { + padding: 8px 0; +} + +#adminmenu div.wp-menu-image { + float: right; + width: 36px; + height: 34px; + margin: 0; + text-align: center; +} + +#adminmenu div.wp-menu-image.svg { + background-repeat: no-repeat; + background-position: center; + background-size: 20px auto; +} + +div.wp-menu-image:before { + color: #a0a5aa; + color: rgba(240, 245, 250, 0.6); + padding: 7px 0; + transition: all .1s ease-in-out; +} + +#adminmenu div.wp-menu-image:before { + color: #a0a5aa; + color: rgba(240, 245, 250, 0.6); +} + +#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before, +#adminmenu .wp-has-current-submenu div.wp-menu-image:before, +#adminmenu .current div.wp-menu-image:before, +#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before { + color: #fff; +} + +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before { + color: #00b9eb; +} + +/* IE8 doesn't redraw the pseudo elements unless you make a change to the content, this restore the initial color after hover */ +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #a0a5aa; +} + +.folded #adminmenu div.wp-menu-image { + width: 35px; + height: 30px; + position: absolute; + z-index: 25; +} + +.folded #adminmenu a.menu-top { + height: 34px; +} + +/* No @font-face support */ +.no-font-face #adminmenu .wp-menu-image { + display: none; +} + +.no-font-face #adminmenu div.wp-menu-name { + padding: 8px 12px; +} + +.no-font-face.auto-fold #adminmenu .wp-menu-name { + margin-right: 0; +} +/* End no @font-face support */ + +/* Sticky admin menu */ +.sticky-menu #adminmenuwrap { + position: fixed; +} + +/* A new arrow */ + +.wp-menu-arrow { + display: none !important; +} + +ul#adminmenu a.wp-has-current-submenu { + position: relative; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + left: 0; + border: solid 8px transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-left-color: #f1f1f1; + top: 50%; + margin-top: -8px; +} + +.folded ul#adminmenu li:hover a.wp-has-current-submenu:after { + display: none; +} + +.folded ul#adminmenu a.wp-has-current-submenu:after, +.folded ul#adminmenu > li a.current:after { + border-width: 4px; + margin-top: -4px; +} + +/* flyout menu arrow */ +#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { + left: 0; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-width: 8px; + top: 10px; + z-index: 10000; +} + +.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { + border-width: 4px; + margin-top: -4px; + top: 18px; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-left-color: #32373c; +} + +#adminmenu li.menu-top:hover .wp-menu-image img, +#adminmenu li.wp-has-current-submenu .wp-menu-image img { + opacity: 1; + filter: alpha(opacity=100); +} + +#adminmenu li.wp-menu-separator { + height: 5px; + padding: 0; + margin: 0 0 6px 0; + cursor: inherit; +} + +/* @todo: is this even needed given that it's nested beneath the above li.wp-menu-separator? */ +#adminmenu div.separator { + height: 2px; + padding: 0; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #fff; + font-weight: 400; + font-size: 14px; + padding: 8px 11px 8px 4px; + margin: -7px 0px 4px; +} + +#adminmenu li.current, +.folded #adminmenu li.wp-menu-open { + border: 0 none; +} + +/* @todo: consider to use a single rule for these counters and the list table comments counters. */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + display: inline-block; + vertical-align: top; + box-sizing: border-box; + margin: 1px 2px -1px 0; + padding: 0 5px; + min-width: 18px; + height: 18px; + border-radius: 9px; + background-color: #ca4a1f; + color: #fff; + font-size: 11px; + line-height: 1.6; + text-align: center; + z-index: 26; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins { + background-color: #ca4a1f; + color: #fff; +} + +#adminmenu li span.count-0 { + display: none; +} + +#collapse-button { + display: block; + width: 100%; + height: 34px; + margin: 0; + border: none; + padding: 0; + position: relative; + overflow: visible; + background: none; + color: #aaa; + cursor: pointer; +} + +#collapse-button:hover { + color: #00b9eb; +} + +#collapse-button:focus { + color: #00b9eb; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; + outline-offset: -1px; +} + +#collapse-button .collapse-button-icon, +#collapse-button .collapse-button-label { + /* absolutely positioned to avoid 1px shift in IE when button is pressed */ + display: block; + position: absolute; + top: 0; + right: 0; +} + +#collapse-button .collapse-button-label { + top: 8px; +} + +#collapse-button .collapse-button-icon { + width: 36px; + height: 34px; +} + +#collapse-button .collapse-button-label { + padding: 0 36px 0 0; +} + +.folded #collapse-button .collapse-button-label { + display: none; +} + +#collapse-button .collapse-button-icon:after { + content: "\f148"; + display: block; + position: relative; + top: 7px; + text-align: center; + font: normal 20px/1 dashicons !important; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* rtl:ignore */ +.folded #collapse-button .collapse-button-icon:after, +.rtl #collapse-button .collapse-button-icon:after { + transform: rotate(180deg); +} + +.rtl.folded #collapse-button .collapse-button-icon:after { + transform: none; +} + +#collapse-button .collapse-button-icon:after, +#collapse-button .collapse-button-label { + transition: all .1s ease-in-out; +} + +/** + * Toolbar menu toggle + */ +li#wp-admin-bar-menu-toggle { + display: none; +} + +/* Hide-if-customize for items we can't add classes to */ +.customize-support #menu-appearance a[href="themes.php?page=custom-header"], +.customize-support #menu-appearance a[href="themes.php?page=custom-background"] { + display: none; +} + +/* Auto-folding of the admin menu */ +@media only screen and (max-width: 960px) { + .auto-fold #wpcontent, + .auto-fold #wpfooter { + margin-right: 36px; + } + + .auto-fold #adminmenuback, + .auto-fold #adminmenuwrap, + .auto-fold #adminmenu, + .auto-fold #adminmenu li.menu-top { + width: 36px; + } + + .auto-fold #adminmenu .wp-submenu.sub-open, + .auto-fold #adminmenu .opensub .wp-submenu, + .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open, + .auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu, + .auto-fold #adminmenu a.menu-top:focus + .wp-submenu, + .auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu { + top: 0px; + right: 36px; + } + + .auto-fold #adminmenu a.wp-has-current-submenu:focus + .wp-submenu, + .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu { + position: absolute; + top: -1000em; + margin-left: -1px; + padding: 7px 0 8px; + z-index: 9999; + } + + .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu { + min-width: 150px; + width: auto; + } + + .auto-fold #adminmenu .wp-has-current-submenu li > a { + padding-left: 16px; + padding-right: 14px; + } + + + .auto-fold #adminmenu li.menu-top .wp-submenu > li > a { + padding-right: 12px; + } + + .auto-fold #adminmenu .wp-menu-name { + position: absolute; + right: -999px; + } + + .auto-fold #adminmenu .wp-submenu-head { + display: block; + } + + .auto-fold #adminmenu div.wp-menu-image { + height: 30px; + width: 34px; + position: absolute; + z-index: 25; + } + + .auto-fold #adminmenu a.menu-top { + height: 34px; + } + + .auto-fold #adminmenu li.wp-menu-open { + border: 0 none; + } + + .auto-fold #adminmenu .wp-has-current-submenu.menu-top-last { + margin-bottom: 0; + } + + .auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after { + display: none; + } + + .auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { + border-width: 4px; + margin-top: -4px; + top: 16px; + } + + .auto-fold ul#adminmenu a.wp-has-current-submenu:after, + .auto-fold ul#adminmenu > li a.current:after { + border-width: 4px; + margin-top: -4px; + } + + .auto-fold #adminmenu li.menu-top:hover, + .auto-fold #adminmenu li.opensub > a.menu-top, + .auto-fold #adminmenu li > a.menu-top:focus { + z-index: 10000; + } + + .auto-fold #collapse-menu .collapse-button-label { + display: none; + } + + /* rtl:ignore */ + .auto-fold #collapse-button .collapse-button-icon:after { + transform: rotate(180deg); + } + + .rtl.auto-fold #collapse-button .collapse-button-icon:after { + transform: none; + } + +} + +@media screen and (max-width: 782px) { + .auto-fold #wpcontent { + position: relative; + margin-right: 0; + padding-right: 10px; + } + + .sticky-menu #adminmenuwrap { + position: relative; + z-index: auto; + top: 0; + } + + /* Sidebar Adjustments */ + .auto-fold #adminmenu, + .auto-fold #adminmenuback, + .auto-fold #adminmenuwrap { + position: absolute; + width: 190px; + z-index: 100; + } + + .auto-fold #adminmenuback { + position: fixed; + } + + .auto-fold #adminmenuback, + .auto-fold #adminmenuwrap { + display: none; + } + + .auto-fold .wp-responsive-open #adminmenuback, + .auto-fold .wp-responsive-open #adminmenuwrap { + display: block; + } + + .auto-fold #adminmenu li.menu-top { + width: 100%; + } + + /* Resize the admin menu items to a comfortable touch size */ + .auto-fold #adminmenu li a { + font-size: 16px; + padding: 5px; + } + + .auto-fold #adminmenu li.menu-top .wp-submenu > li > a { + padding: 10px 20px 10px 10px; + } + + /* Restore the menu names */ + .auto-fold #adminmenu .wp-menu-name { + position: static; + margin-right: 35px; + } + + /* Switch the arrow side */ + .auto-fold ul#adminmenu a.wp-has-current-submenu:after, + .auto-fold ul#adminmenu > li.current > a.current:after { + border-width: 8px; + margin-top: -8px; + } + + .auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { + display: none; + } + + /* Make the submenus appear correctly when tapped. */ + #adminmenu .wp-submenu { + position: relative; + display: none; + } + + .auto-fold #adminmenu .selected .wp-submenu, + .auto-fold #adminmenu .wp-menu-open .wp-submenu { + position: relative; + display: block; + top: 0; + right: -1px; + box-shadow: none; + } + + .auto-fold #adminmenu .selected .wp-submenu:after, + .auto-fold #adminmenu .wp-menu-open .wp-submenu:after { + display: none; + } + + .auto-fold #adminmenu .opensub .wp-submenu { + display: none; + } + + .auto-fold #adminmenu .selected .wp-submenu { + display: block; + } + + .auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after { + display: block; + } + + .auto-fold #adminmenu a.menu-top:focus + .wp-submenu, + .auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu { + position: relative; + right: -1px; + left: 0; + top: 0; + } + + /* Remove submenu headers and adjust sub meu*/ + #adminmenu .wp-submenu .wp-submenu-head { + display: none; + } + + /* Toolbar menu toggle */ + #wp-responsive-toggle { + position: fixed; + top: 5px; + right: 4px; + padding-left: 10px; + z-index: 99999; + border: none; + box-sizing: border-box; + } + + #wpadminbar #wp-admin-bar-menu-toggle a { + display: block; + padding: 0; + overflow: hidden; + outline: none; + text-decoration: none; + border: 1px solid transparent; + background: none; + height: 44px; + margin-right: -1px; + } + + .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #32373c; + } + + li#wp-admin-bar-menu-toggle { + display: block; + } + + #wpadminbar #wp-admin-bar-menu-toggle a:hover { + border: 1px solid transparent; + } + + #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + content: "\f228"; + display: inline-block; + float: right; + font: normal 40px/45px dashicons; + vertical-align: middle; + outline: none; + margin: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + height: 44px; + width: 50px; + padding: 0; + border: none; + text-align: center; + text-decoration: none; + box-sizing: border-box; + } + + .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #00b9eb; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + #adminmenuwrap, + #adminmenuback { + display: none; + } + + .wp-responsive-open #adminmenuwrap, + .wp-responsive-open #adminmenuback { + display: block; + } + + .auto-fold #adminmenu { + top: 46px; + } +} diff --git a/wp-admin/css/admin-menu-rtl.min.css b/wp-admin/css/admin-menu-rtl.min.css new file mode 100644 index 0000000..f024383 --- /dev/null +++ b/wp-admin/css/admin-menu-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#adminmenu,#adminmenu .wp-submenu,#adminmenuback,#adminmenuwrap{width:160px;background-color:#23282d}#adminmenuback{position:fixed;top:0;bottom:-120px;z-index:1}#adminmenu{clear:right;margin:12px 0;padding:0;list-style:none}.folded #adminmenu,.folded #adminmenu li.menu-top,.folded #adminmenuback,.folded #adminmenuwrap{width:36px}.icon16{height:18px;width:18px;padding:6px 6px;margin:-6px -8px 0 0;float:right}.icon16:before{color:#82878c;font:normal 20px/1 dashicons;speak:none;padding:6px 0;height:34px;width:20px;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transition:all .1s ease-in-out}.icon16.icon-dashboard:before{content:"\f226"}.icon16.icon-post:before{content:"\f109"}.icon16.icon-media:before{content:"\f104"}.icon16.icon-links:before{content:"\f103"}.icon16.icon-page:before{content:"\f105"}.icon16.icon-comments:before{content:"\f101";margin-top:1px}.icon16.icon-appearance:before{content:"\f100"}.icon16.icon-plugins:before{content:"\f106"}.icon16.icon-users:before{content:"\f110"}.icon16.icon-tools:before{content:"\f107"}.icon16.icon-settings:before{content:"\f108"}.icon16.icon-site:before{content:"\f541"}.icon16.icon-generic:before{content:"\f111"}.icon16.icon-appearance,.icon16.icon-comments,.icon16.icon-dashboard,.icon16.icon-generic,.icon16.icon-links,.icon16.icon-media,.icon16.icon-page,.icon16.icon-plugins,.icon16.icon-post,.icon16.icon-settings,.icon16.icon-site,.icon16.icon-tools,.icon16.icon-users,.menu-icon-appearance div.wp-menu-image,.menu-icon-comments div.wp-menu-image,.menu-icon-dashboard div.wp-menu-image,.menu-icon-generic div.wp-menu-image,.menu-icon-links div.wp-menu-image,.menu-icon-media div.wp-menu-image,.menu-icon-page div.wp-menu-image,.menu-icon-plugins div.wp-menu-image,.menu-icon-post div.wp-menu-image,.menu-icon-settings div.wp-menu-image,.menu-icon-site div.wp-menu-image,.menu-icon-tools div.wp-menu-image,.menu-icon-users div.wp-menu-image{background-image:none!important}#adminmenuwrap{position:relative;float:right;z-index:9990}#adminmenu *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#adminmenu li{margin:0;padding:0;cursor:pointer}#adminmenu a{display:block;line-height:1.3;padding:2px 5px;color:#eee}#adminmenu .wp-submenu a{color:#b4b9be;color:rgba(240,245,250,.7);font-size:13px;line-height:1.4;margin:0;padding:5px 0}#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover{background:0 0}#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a:hover,#adminmenu li.menu-top>a:focus{color:#00b9eb}#adminmenu li.menu-top{border:none;min-height:34px;position:relative}#adminmenu .wp-submenu{list-style:none;position:absolute;top:-1000em;right:160px;overflow:visible;word-wrap:break-word}#adminmenu .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu,.folded #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{padding:7px 0 8px;z-index:9999;background-color:#32373c;box-shadow:0 3px 5px rgba(0,0,0,.2)}#adminmenu a.menu-top:focus+.wp-submenu,.js #adminmenu .opensub .wp-submenu,.js #adminmenu .sub-open,.no-js li.wp-has-submenu:hover .wp-submenu{top:-1px}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu .wp-submenu.sub-open,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.no-js li.wp-has-current-submenu:hover .wp-submenu{position:relative;z-index:3;top:auto;right:auto;left:auto;bottom:auto;border:0 none;margin-top:0;box-shadow:none;background-color:#32373c}#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{position:relative;background-color:#191e23;color:#00b9eb}.folded #adminmenu li.menu-top:hover,.folded #adminmenu li.opensub>a.menu-top,.folded #adminmenu li>a.menu-top:focus{z-index:10000}#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu .wp-menu-arrow,#adminmenu .wp-menu-arrow div,#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top,.folded #adminmenu li.wp-has-current-submenu{background:#0073aa;color:#fff}.folded #adminmenu .opensub .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,.folded #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu,.folded #adminmenu .wp-submenu.sub-open,.folded #adminmenu a.menu-top:focus+.wp-submenu,.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu{top:0;right:36px}.folded #adminmenu .wp-has-current-submenu .wp-submenu,.folded #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{position:absolute;top:-1000em}#adminmenu .wp-not-current-submenu .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{min-width:160px;width:auto}#adminmenu .opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-not-current-submenu li>a,.folded #adminmenu .wp-has-current-submenu li>a{padding-left:16px;padding-right:14px;transition:all .1s ease-in-out,outline 0s}#adminmenu .wp-has-current-submenu ul>li>a,.folded #adminmenu li.menu-top .wp-submenu>li>a{padding:5px 12px}#adminmenu .wp-submenu-head,#adminmenu a.menu-top{font-size:14px;font-weight:400;line-height:1.3;padding:0}#adminmenu .wp-submenu-head{display:none}.folded #adminmenu .wp-menu-name{position:absolute;right:-999px}.folded #adminmenu .wp-submenu-head{display:block}#adminmenu .wp-submenu li{padding:0;margin:0}#adminmenu .wp-menu-image img{padding:9px 0 0 0;opacity:.6;filter:alpha(opacity=60)}#adminmenu div.wp-menu-name{padding:8px 0}#adminmenu div.wp-menu-image{float:right;width:36px;height:34px;margin:0;text-align:center}#adminmenu div.wp-menu-image.svg{background-repeat:no-repeat;background-position:center;background-size:20px auto}div.wp-menu-image:before{color:#a0a5aa;color:rgba(240,245,250,.6);padding:7px 0;transition:all .1s ease-in-out}#adminmenu div.wp-menu-image:before{color:#a0a5aa;color:rgba(240,245,250,.6)}#adminmenu .current div.wp-menu-image:before,#adminmenu .wp-has-current-submenu div.wp-menu-image:before,#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before{color:#fff}#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#00b9eb}.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#a0a5aa}.folded #adminmenu div.wp-menu-image{width:35px;height:30px;position:absolute;z-index:25}.folded #adminmenu a.menu-top{height:34px}.no-font-face #adminmenu .wp-menu-image{display:none}.no-font-face #adminmenu div.wp-menu-name{padding:8px 12px}.no-font-face.auto-fold #adminmenu .wp-menu-name{margin-right:0}.sticky-menu #adminmenuwrap{position:fixed}.wp-menu-arrow{display:none!important}ul#adminmenu a.wp-has-current-submenu{position:relative}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{left:0;border:solid 8px transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-left-color:#f1f1f1;top:50%;margin-top:-8px}.folded ul#adminmenu li:hover a.wp-has-current-submenu:after{display:none}.folded ul#adminmenu a.wp-has-current-submenu:after,.folded ul#adminmenu>li a.current:after{border-width:4px;margin-top:-4px}#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{left:0;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-width:8px;top:10px;z-index:10000}.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{border-width:4px;margin-top:-4px;top:18px}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-left-color:#32373c}#adminmenu li.menu-top:hover .wp-menu-image img,#adminmenu li.wp-has-current-submenu .wp-menu-image img{opacity:1;filter:alpha(opacity=100)}#adminmenu li.wp-menu-separator{height:5px;padding:0;margin:0 0 6px 0;cursor:inherit}#adminmenu div.separator{height:2px;padding:0}#adminmenu .wp-submenu .wp-submenu-head{color:#fff;font-weight:400;font-size:14px;padding:8px 11px 8px 4px;margin:-7px 0 4px}#adminmenu li.current,.folded #adminmenu li.wp-menu-open{border:0 none}#adminmenu .awaiting-mod,#adminmenu .update-plugins{display:inline-block;vertical-align:top;box-sizing:border-box;margin:1px 2px -1px 0;padding:0 5px;min-width:18px;height:18px;border-radius:9px;background-color:#ca4a1f;color:#fff;font-size:11px;line-height:1.6;text-align:center;z-index:26}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod{background-color:#ca4a1f;color:#fff}#adminmenu li span.count-0{display:none}#collapse-button{display:block;width:100%;height:34px;margin:0;border:none;padding:0;position:relative;overflow:visible;background:0 0;color:#aaa;cursor:pointer}#collapse-button:hover{color:#00b9eb}#collapse-button:focus{color:#00b9eb;outline:1px solid transparent;outline-offset:-1px}#collapse-button .collapse-button-icon,#collapse-button .collapse-button-label{display:block;position:absolute;top:0;right:0}#collapse-button .collapse-button-label{top:8px}#collapse-button .collapse-button-icon{width:36px;height:34px}#collapse-button .collapse-button-label{padding:0 36px 0 0}.folded #collapse-button .collapse-button-label{display:none}#collapse-button .collapse-button-icon:after{content:"\f148";display:block;position:relative;top:7px;text-align:center;font:normal 20px/1 dashicons!important;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.folded #collapse-button .collapse-button-icon:after,.rtl #collapse-button .collapse-button-icon:after{transform:rotate(180deg)}.rtl.folded #collapse-button .collapse-button-icon:after{transform:none}#collapse-button .collapse-button-icon:after,#collapse-button .collapse-button-label{transition:all .1s ease-in-out}li#wp-admin-bar-menu-toggle{display:none}.customize-support #menu-appearance a[href="themes.php?page=custom-background"],.customize-support #menu-appearance a[href="themes.php?page=custom-header"]{display:none}@media only screen and (max-width:960px){.auto-fold #wpcontent,.auto-fold #wpfooter{margin-right:36px}.auto-fold #adminmenu,.auto-fold #adminmenu li.menu-top,.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{width:36px}.auto-fold #adminmenu .opensub .wp-submenu,.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu,.auto-fold #adminmenu .wp-submenu.sub-open,.auto-fold #adminmenu a.menu-top:focus+.wp-submenu{top:0;right:36px}.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu,.auto-fold #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{position:absolute;top:-1000em;margin-left:-1px;padding:7px 0 8px;z-index:9999}.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu{min-width:150px;width:auto}.auto-fold #adminmenu .wp-has-current-submenu li>a{padding-left:16px;padding-right:14px}.auto-fold #adminmenu li.menu-top .wp-submenu>li>a{padding-right:12px}.auto-fold #adminmenu .wp-menu-name{position:absolute;right:-999px}.auto-fold #adminmenu .wp-submenu-head{display:block}.auto-fold #adminmenu div.wp-menu-image{height:30px;width:34px;position:absolute;z-index:25}.auto-fold #adminmenu a.menu-top{height:34px}.auto-fold #adminmenu li.wp-menu-open{border:0 none}.auto-fold #adminmenu .wp-has-current-submenu.menu-top-last{margin-bottom:0}.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after{display:none}.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{border-width:4px;margin-top:-4px;top:16px}.auto-fold ul#adminmenu a.wp-has-current-submenu:after,.auto-fold ul#adminmenu>li a.current:after{border-width:4px;margin-top:-4px}.auto-fold #adminmenu li.menu-top:hover,.auto-fold #adminmenu li.opensub>a.menu-top,.auto-fold #adminmenu li>a.menu-top:focus{z-index:10000}.auto-fold #collapse-menu .collapse-button-label{display:none}.auto-fold #collapse-button .collapse-button-icon:after{transform:rotate(180deg)}.rtl.auto-fold #collapse-button .collapse-button-icon:after{transform:none}}@media screen and (max-width:782px){.auto-fold #wpcontent{position:relative;margin-right:0;padding-right:10px}.sticky-menu #adminmenuwrap{position:relative;z-index:auto;top:0}.auto-fold #adminmenu,.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{position:absolute;width:190px;z-index:100}.auto-fold #adminmenuback{position:fixed}.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{display:none}.auto-fold .wp-responsive-open #adminmenuback,.auto-fold .wp-responsive-open #adminmenuwrap{display:block}.auto-fold #adminmenu li.menu-top{width:100%}.auto-fold #adminmenu li a{font-size:16px;padding:5px}.auto-fold #adminmenu li.menu-top .wp-submenu>li>a{padding:10px 20px 10px 10px}.auto-fold #adminmenu .wp-menu-name{position:static;margin-right:35px}.auto-fold ul#adminmenu a.wp-has-current-submenu:after,.auto-fold ul#adminmenu>li.current>a.current:after{border-width:8px;margin-top:-8px}.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{display:none}#adminmenu .wp-submenu{position:relative;display:none}.auto-fold #adminmenu .selected .wp-submenu,.auto-fold #adminmenu .wp-menu-open .wp-submenu{position:relative;display:block;top:0;right:-1px;box-shadow:none}.auto-fold #adminmenu .selected .wp-submenu:after,.auto-fold #adminmenu .wp-menu-open .wp-submenu:after{display:none}.auto-fold #adminmenu .opensub .wp-submenu{display:none}.auto-fold #adminmenu .selected .wp-submenu{display:block}.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after{display:block}.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.auto-fold #adminmenu a.menu-top:focus+.wp-submenu{position:relative;right:-1px;left:0;top:0}#adminmenu .wp-submenu .wp-submenu-head{display:none}#wp-responsive-toggle{position:fixed;top:5px;right:4px;padding-left:10px;z-index:99999;border:none;box-sizing:border-box}#wpadminbar #wp-admin-bar-menu-toggle a{display:block;padding:0;overflow:hidden;outline:0;text-decoration:none;border:1px solid transparent;background:0 0;height:44px;margin-right:-1px}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#32373c}li#wp-admin-bar-menu-toggle{display:block}#wpadminbar #wp-admin-bar-menu-toggle a:hover{border:1px solid transparent}#wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{content:"\f228";display:inline-block;float:right;font:normal 40px/45px dashicons;vertical-align:middle;outline:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;height:44px;width:50px;padding:0;border:none;text-align:center;text-decoration:none;box-sizing:border-box}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#00b9eb}}@media screen and (max-width:600px){#adminmenuback,#adminmenuwrap{display:none}.wp-responsive-open #adminmenuback,.wp-responsive-open #adminmenuwrap{display:block}.auto-fold #adminmenu{top:46px}} \ No newline at end of file diff --git a/wp-admin/css/admin-menu.css b/wp-admin/css/admin-menu.css new file mode 100644 index 0000000..a3d8f4f --- /dev/null +++ b/wp-admin/css/admin-menu.css @@ -0,0 +1,929 @@ +#adminmenuback, +#adminmenuwrap, +#adminmenu, +#adminmenu .wp-submenu { + width: 160px; + background-color: #23282d; +} + +#adminmenuback { + position: fixed; + top: 0; + bottom: -120px; + z-index: 1; /* positive z-index to avoid elastic scrolling woes in Safari */ +} + +#adminmenu { + clear: left; + margin: 12px 0; + padding: 0; + list-style: none; +} + +.folded #adminmenuback, +.folded #adminmenuwrap, +.folded #adminmenu, +.folded #adminmenu li.menu-top { + width: 36px; +} + +.icon16 { + height: 18px; + width: 18px; + padding: 6px 6px; + margin: -6px 0 0 -8px; + float: left; +} + +/* New Menu icons */ + +.icon16:before { + color: #82878c; /* same as new icons */ + font: normal 20px/1 dashicons; + speak: none; + padding: 6px 0; + height: 34px; + width: 20px; + display: inline-block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + transition: all .1s ease-in-out; +} + +.icon16.icon-dashboard:before { + content: "\f226"; +} + +.icon16.icon-post:before { + content: "\f109"; +} + +.icon16.icon-media:before { + content: "\f104"; +} + +.icon16.icon-links:before { + content: "\f103"; +} + +.icon16.icon-page:before { + content: "\f105"; +} + +.icon16.icon-comments:before { + content: "\f101"; + margin-top: 1px; +} + +.icon16.icon-appearance:before { + content: "\f100"; +} + +.icon16.icon-plugins:before { + content: "\f106"; +} + +.icon16.icon-users:before { + content: "\f110"; +} + +.icon16.icon-tools:before { + content: "\f107"; +} + +.icon16.icon-settings:before { + content: "\f108"; +} + +.icon16.icon-site:before { + content: "\f541"; +} + +.icon16.icon-generic:before { + content: "\f111"; +} + +/* hide background-image for icons above */ +.icon16.icon-dashboard, +.menu-icon-dashboard div.wp-menu-image, +.icon16.icon-post, +.menu-icon-post div.wp-menu-image, +.icon16.icon-media, +.menu-icon-media div.wp-menu-image, +.icon16.icon-links, +.menu-icon-links div.wp-menu-image, +.icon16.icon-page, +.menu-icon-page div.wp-menu-image, +.icon16.icon-comments, +.menu-icon-comments div.wp-menu-image, +.icon16.icon-appearance, +.menu-icon-appearance div.wp-menu-image, +.icon16.icon-plugins, +.menu-icon-plugins div.wp-menu-image, +.icon16.icon-users, +.menu-icon-users div.wp-menu-image, +.icon16.icon-tools, +.menu-icon-tools div.wp-menu-image, +.icon16.icon-settings, +.menu-icon-settings div.wp-menu-image, +.icon16.icon-site, +.menu-icon-site div.wp-menu-image, +.icon16.icon-generic, +.menu-icon-generic div.wp-menu-image { + background-image: none !important; +} + +/*------------------------------------------------------------------------------ + 7.0 - Main Navigation (Left Menu) +------------------------------------------------------------------------------*/ + +#adminmenuwrap { + position: relative; + float: left; + z-index: 9990; +} + +/* side admin menu */ +#adminmenu * { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#adminmenu li { + margin: 0; + padding: 0; + cursor: pointer; +} + +#adminmenu a { + display: block; + line-height: 1.3; + padding: 2px 5px; + color: #eee; +} + +#adminmenu .wp-submenu a { + color: #b4b9be; + color: rgba(240, 245, 250, 0.7); + font-size: 13px; + line-height: 1.4; + margin: 0; + padding: 5px 0; +} + +#adminmenu .wp-submenu a:hover, +#adminmenu .wp-submenu a:focus { + background: none; +} + +#adminmenu a:hover, +#adminmenu li.menu-top > a:focus, +#adminmenu .wp-submenu a:hover, +#adminmenu .wp-submenu a:focus { + color: #00b9eb; +} + +#adminmenu li.menu-top { + border: none; + min-height: 34px; + position: relative; +} + +#adminmenu .wp-submenu { + list-style: none; + position: absolute; + top: -1000em; + left: 160px; + overflow: visible; + word-wrap: break-word; +} + +#adminmenu .wp-submenu, +.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu { + padding: 7px 0 8px; + z-index: 9999; + background-color: #32373c; + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); +} + +.js #adminmenu .sub-open, +.js #adminmenu .opensub .wp-submenu, +#adminmenu a.menu-top:focus + .wp-submenu, +.no-js li.wp-has-submenu:hover .wp-submenu { + top: -1px; +} + +#adminmenu .wp-has-current-submenu .wp-submenu, +.no-js li.wp-has-current-submenu:hover .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu.sub-open, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu { + position: relative; + z-index: 3; + top: auto; + left: auto; + right: auto; + bottom: auto; + border: 0 none; + margin-top: 0; + box-shadow: none; + background-color: #32373c; +} + +/* ensure that wp-submenu's box shadow doesn't appear on top of the focused menu item's background. */ +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + position: relative; + background-color: #191e23; + color: #00b9eb; +} + +.folded #adminmenu li.menu-top:hover, +.folded #adminmenu li.opensub > a.menu-top, +.folded #adminmenu li > a.menu-top:focus { + z-index: 10000; +} + +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.current a.menu-top, +.folded #adminmenu li.wp-has-current-submenu, +.folded #adminmenu li.current.menu-top, +#adminmenu .wp-menu-arrow, +#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head, +#adminmenu .wp-menu-arrow div { + background: #0073aa; + color: #fff; +} + +.folded #adminmenu .wp-submenu.sub-open, +.folded #adminmenu .opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open, +.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu a.menu-top:focus + .wp-submenu, +.folded #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu, +.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu { + top: 0; + left: 36px; +} + +.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu { + position: absolute; + top: -1000em; +} + +#adminmenu .wp-not-current-submenu .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu { + min-width: 160px; + width: auto; +} + +#adminmenu .wp-submenu li.current, +#adminmenu .wp-submenu li.current a, +#adminmenu .opensub .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-submenu li.current a:hover, +#adminmenu .wp-submenu li.current a:focus { + color: #fff; +} + +#adminmenu .wp-not-current-submenu li > a, +.folded #adminmenu .wp-has-current-submenu li > a { + padding-right: 16px; + padding-left: 14px; + /* Exclude from the transition the outline for Windows High Contrast mode */ + transition: all .1s ease-in-out, outline 0s; +} + +#adminmenu .wp-has-current-submenu ul > li > a, +.folded #adminmenu li.menu-top .wp-submenu > li > a { + padding: 5px 12px; +} + +#adminmenu a.menu-top, +#adminmenu .wp-submenu-head { + font-size: 14px; + font-weight: 400; + line-height: 1.3; + padding: 0; +} + +#adminmenu .wp-submenu-head { + display: none; +} + +.folded #adminmenu .wp-menu-name { + position: absolute; + left: -999px; +} + +.folded #adminmenu .wp-submenu-head { + display: block; +} + +#adminmenu .wp-submenu li { + padding: 0; + margin: 0; +} + +#adminmenu .wp-menu-image img { + padding: 9px 0 0 0; + opacity: 0.6; + filter: alpha(opacity=60); +} + +#adminmenu div.wp-menu-name { + padding: 8px 0; +} + +#adminmenu div.wp-menu-image { + float: left; + width: 36px; + height: 34px; + margin: 0; + text-align: center; +} + +#adminmenu div.wp-menu-image.svg { + background-repeat: no-repeat; + background-position: center; + background-size: 20px auto; +} + +div.wp-menu-image:before { + color: #a0a5aa; + color: rgba(240, 245, 250, 0.6); + padding: 7px 0; + transition: all .1s ease-in-out; +} + +#adminmenu div.wp-menu-image:before { + color: #a0a5aa; + color: rgba(240, 245, 250, 0.6); +} + +#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before, +#adminmenu .wp-has-current-submenu div.wp-menu-image:before, +#adminmenu .current div.wp-menu-image:before, +#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before { + color: #fff; +} + +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before { + color: #00b9eb; +} + +/* IE8 doesn't redraw the pseudo elements unless you make a change to the content, this restore the initial color after hover */ +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #a0a5aa; +} + +.folded #adminmenu div.wp-menu-image { + width: 35px; + height: 30px; + position: absolute; + z-index: 25; +} + +.folded #adminmenu a.menu-top { + height: 34px; +} + +/* No @font-face support */ +.no-font-face #adminmenu .wp-menu-image { + display: none; +} + +.no-font-face #adminmenu div.wp-menu-name { + padding: 8px 12px; +} + +.no-font-face.auto-fold #adminmenu .wp-menu-name { + margin-left: 0; +} +/* End no @font-face support */ + +/* Sticky admin menu */ +.sticky-menu #adminmenuwrap { + position: fixed; +} + +/* A new arrow */ + +.wp-menu-arrow { + display: none !important; +} + +ul#adminmenu a.wp-has-current-submenu { + position: relative; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + right: 0; + border: solid 8px transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-right-color: #f1f1f1; + top: 50%; + margin-top: -8px; +} + +.folded ul#adminmenu li:hover a.wp-has-current-submenu:after { + display: none; +} + +.folded ul#adminmenu a.wp-has-current-submenu:after, +.folded ul#adminmenu > li a.current:after { + border-width: 4px; + margin-top: -4px; +} + +/* flyout menu arrow */ +#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { + right: 0; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-width: 8px; + top: 10px; + z-index: 10000; +} + +.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { + border-width: 4px; + margin-top: -4px; + top: 18px; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-right-color: #32373c; +} + +#adminmenu li.menu-top:hover .wp-menu-image img, +#adminmenu li.wp-has-current-submenu .wp-menu-image img { + opacity: 1; + filter: alpha(opacity=100); +} + +#adminmenu li.wp-menu-separator { + height: 5px; + padding: 0; + margin: 0 0 6px 0; + cursor: inherit; +} + +/* @todo: is this even needed given that it's nested beneath the above li.wp-menu-separator? */ +#adminmenu div.separator { + height: 2px; + padding: 0; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #fff; + font-weight: 400; + font-size: 14px; + padding: 8px 4px 8px 11px; + margin: -7px 0px 4px; +} + +#adminmenu li.current, +.folded #adminmenu li.wp-menu-open { + border: 0 none; +} + +/* @todo: consider to use a single rule for these counters and the list table comments counters. */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + display: inline-block; + vertical-align: top; + box-sizing: border-box; + margin: 1px 0 -1px 2px; + padding: 0 5px; + min-width: 18px; + height: 18px; + border-radius: 9px; + background-color: #ca4a1f; + color: #fff; + font-size: 11px; + line-height: 1.6; + text-align: center; + z-index: 26; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins { + background-color: #ca4a1f; + color: #fff; +} + +#adminmenu li span.count-0 { + display: none; +} + +#collapse-button { + display: block; + width: 100%; + height: 34px; + margin: 0; + border: none; + padding: 0; + position: relative; + overflow: visible; + background: none; + color: #aaa; + cursor: pointer; +} + +#collapse-button:hover { + color: #00b9eb; +} + +#collapse-button:focus { + color: #00b9eb; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; + outline-offset: -1px; +} + +#collapse-button .collapse-button-icon, +#collapse-button .collapse-button-label { + /* absolutely positioned to avoid 1px shift in IE when button is pressed */ + display: block; + position: absolute; + top: 0; + left: 0; +} + +#collapse-button .collapse-button-label { + top: 8px; +} + +#collapse-button .collapse-button-icon { + width: 36px; + height: 34px; +} + +#collapse-button .collapse-button-label { + padding: 0 0 0 36px; +} + +.folded #collapse-button .collapse-button-label { + display: none; +} + +#collapse-button .collapse-button-icon:after { + content: "\f148"; + display: block; + position: relative; + top: 7px; + text-align: center; + font: normal 20px/1 dashicons !important; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* rtl:ignore */ +.folded #collapse-button .collapse-button-icon:after, +.rtl #collapse-button .collapse-button-icon:after { + transform: rotate(180deg); +} + +.rtl.folded #collapse-button .collapse-button-icon:after { + transform: none; +} + +#collapse-button .collapse-button-icon:after, +#collapse-button .collapse-button-label { + transition: all .1s ease-in-out; +} + +/** + * Toolbar menu toggle + */ +li#wp-admin-bar-menu-toggle { + display: none; +} + +/* Hide-if-customize for items we can't add classes to */ +.customize-support #menu-appearance a[href="themes.php?page=custom-header"], +.customize-support #menu-appearance a[href="themes.php?page=custom-background"] { + display: none; +} + +/* Auto-folding of the admin menu */ +@media only screen and (max-width: 960px) { + .auto-fold #wpcontent, + .auto-fold #wpfooter { + margin-left: 36px; + } + + .auto-fold #adminmenuback, + .auto-fold #adminmenuwrap, + .auto-fold #adminmenu, + .auto-fold #adminmenu li.menu-top { + width: 36px; + } + + .auto-fold #adminmenu .wp-submenu.sub-open, + .auto-fold #adminmenu .opensub .wp-submenu, + .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open, + .auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu, + .auto-fold #adminmenu a.menu-top:focus + .wp-submenu, + .auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu { + top: 0px; + left: 36px; + } + + .auto-fold #adminmenu a.wp-has-current-submenu:focus + .wp-submenu, + .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu { + position: absolute; + top: -1000em; + margin-right: -1px; + padding: 7px 0 8px; + z-index: 9999; + } + + .auto-fold #adminmenu .wp-has-current-submenu .wp-submenu { + min-width: 150px; + width: auto; + } + + .auto-fold #adminmenu .wp-has-current-submenu li > a { + padding-right: 16px; + padding-left: 14px; + } + + + .auto-fold #adminmenu li.menu-top .wp-submenu > li > a { + padding-left: 12px; + } + + .auto-fold #adminmenu .wp-menu-name { + position: absolute; + left: -999px; + } + + .auto-fold #adminmenu .wp-submenu-head { + display: block; + } + + .auto-fold #adminmenu div.wp-menu-image { + height: 30px; + width: 34px; + position: absolute; + z-index: 25; + } + + .auto-fold #adminmenu a.menu-top { + height: 34px; + } + + .auto-fold #adminmenu li.wp-menu-open { + border: 0 none; + } + + .auto-fold #adminmenu .wp-has-current-submenu.menu-top-last { + margin-bottom: 0; + } + + .auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after { + display: none; + } + + .auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { + border-width: 4px; + margin-top: -4px; + top: 16px; + } + + .auto-fold ul#adminmenu a.wp-has-current-submenu:after, + .auto-fold ul#adminmenu > li a.current:after { + border-width: 4px; + margin-top: -4px; + } + + .auto-fold #adminmenu li.menu-top:hover, + .auto-fold #adminmenu li.opensub > a.menu-top, + .auto-fold #adminmenu li > a.menu-top:focus { + z-index: 10000; + } + + .auto-fold #collapse-menu .collapse-button-label { + display: none; + } + + /* rtl:ignore */ + .auto-fold #collapse-button .collapse-button-icon:after { + transform: rotate(180deg); + } + + .rtl.auto-fold #collapse-button .collapse-button-icon:after { + transform: none; + } + +} + +@media screen and (max-width: 782px) { + .auto-fold #wpcontent { + position: relative; + margin-left: 0; + padding-left: 10px; + } + + .sticky-menu #adminmenuwrap { + position: relative; + z-index: auto; + top: 0; + } + + /* Sidebar Adjustments */ + .auto-fold #adminmenu, + .auto-fold #adminmenuback, + .auto-fold #adminmenuwrap { + position: absolute; + width: 190px; + z-index: 100; + } + + .auto-fold #adminmenuback { + position: fixed; + } + + .auto-fold #adminmenuback, + .auto-fold #adminmenuwrap { + display: none; + } + + .auto-fold .wp-responsive-open #adminmenuback, + .auto-fold .wp-responsive-open #adminmenuwrap { + display: block; + } + + .auto-fold #adminmenu li.menu-top { + width: 100%; + } + + /* Resize the admin menu items to a comfortable touch size */ + .auto-fold #adminmenu li a { + font-size: 16px; + padding: 5px; + } + + .auto-fold #adminmenu li.menu-top .wp-submenu > li > a { + padding: 10px 10px 10px 20px; + } + + /* Restore the menu names */ + .auto-fold #adminmenu .wp-menu-name { + position: static; + margin-left: 35px; + } + + /* Switch the arrow side */ + .auto-fold ul#adminmenu a.wp-has-current-submenu:after, + .auto-fold ul#adminmenu > li.current > a.current:after { + border-width: 8px; + margin-top: -8px; + } + + .auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after { + display: none; + } + + /* Make the submenus appear correctly when tapped. */ + #adminmenu .wp-submenu { + position: relative; + display: none; + } + + .auto-fold #adminmenu .selected .wp-submenu, + .auto-fold #adminmenu .wp-menu-open .wp-submenu { + position: relative; + display: block; + top: 0; + left: -1px; + box-shadow: none; + } + + .auto-fold #adminmenu .selected .wp-submenu:after, + .auto-fold #adminmenu .wp-menu-open .wp-submenu:after { + display: none; + } + + .auto-fold #adminmenu .opensub .wp-submenu { + display: none; + } + + .auto-fold #adminmenu .selected .wp-submenu { + display: block; + } + + .auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after { + display: block; + } + + .auto-fold #adminmenu a.menu-top:focus + .wp-submenu, + .auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu { + position: relative; + left: -1px; + right: 0; + top: 0; + } + + /* Remove submenu headers and adjust sub meu*/ + #adminmenu .wp-submenu .wp-submenu-head { + display: none; + } + + /* Toolbar menu toggle */ + #wp-responsive-toggle { + position: fixed; + top: 5px; + left: 4px; + padding-right: 10px; + z-index: 99999; + border: none; + box-sizing: border-box; + } + + #wpadminbar #wp-admin-bar-menu-toggle a { + display: block; + padding: 0; + overflow: hidden; + outline: none; + text-decoration: none; + border: 1px solid transparent; + background: none; + height: 44px; + margin-left: -1px; + } + + .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #32373c; + } + + li#wp-admin-bar-menu-toggle { + display: block; + } + + #wpadminbar #wp-admin-bar-menu-toggle a:hover { + border: 1px solid transparent; + } + + #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + content: "\f228"; + display: inline-block; + float: left; + font: normal 40px/45px dashicons; + vertical-align: middle; + outline: none; + margin: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + height: 44px; + width: 50px; + padding: 0; + border: none; + text-align: center; + text-decoration: none; + box-sizing: border-box; + } + + .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #00b9eb; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + #adminmenuwrap, + #adminmenuback { + display: none; + } + + .wp-responsive-open #adminmenuwrap, + .wp-responsive-open #adminmenuback { + display: block; + } + + .auto-fold #adminmenu { + top: 46px; + } +} diff --git a/wp-admin/css/admin-menu.min.css b/wp-admin/css/admin-menu.min.css new file mode 100644 index 0000000..7c855a4 --- /dev/null +++ b/wp-admin/css/admin-menu.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#adminmenu,#adminmenu .wp-submenu,#adminmenuback,#adminmenuwrap{width:160px;background-color:#23282d}#adminmenuback{position:fixed;top:0;bottom:-120px;z-index:1}#adminmenu{clear:left;margin:12px 0;padding:0;list-style:none}.folded #adminmenu,.folded #adminmenu li.menu-top,.folded #adminmenuback,.folded #adminmenuwrap{width:36px}.icon16{height:18px;width:18px;padding:6px 6px;margin:-6px 0 0 -8px;float:left}.icon16:before{color:#82878c;font:normal 20px/1 dashicons;speak:none;padding:6px 0;height:34px;width:20px;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transition:all .1s ease-in-out}.icon16.icon-dashboard:before{content:"\f226"}.icon16.icon-post:before{content:"\f109"}.icon16.icon-media:before{content:"\f104"}.icon16.icon-links:before{content:"\f103"}.icon16.icon-page:before{content:"\f105"}.icon16.icon-comments:before{content:"\f101";margin-top:1px}.icon16.icon-appearance:before{content:"\f100"}.icon16.icon-plugins:before{content:"\f106"}.icon16.icon-users:before{content:"\f110"}.icon16.icon-tools:before{content:"\f107"}.icon16.icon-settings:before{content:"\f108"}.icon16.icon-site:before{content:"\f541"}.icon16.icon-generic:before{content:"\f111"}.icon16.icon-appearance,.icon16.icon-comments,.icon16.icon-dashboard,.icon16.icon-generic,.icon16.icon-links,.icon16.icon-media,.icon16.icon-page,.icon16.icon-plugins,.icon16.icon-post,.icon16.icon-settings,.icon16.icon-site,.icon16.icon-tools,.icon16.icon-users,.menu-icon-appearance div.wp-menu-image,.menu-icon-comments div.wp-menu-image,.menu-icon-dashboard div.wp-menu-image,.menu-icon-generic div.wp-menu-image,.menu-icon-links div.wp-menu-image,.menu-icon-media div.wp-menu-image,.menu-icon-page div.wp-menu-image,.menu-icon-plugins div.wp-menu-image,.menu-icon-post div.wp-menu-image,.menu-icon-settings div.wp-menu-image,.menu-icon-site div.wp-menu-image,.menu-icon-tools div.wp-menu-image,.menu-icon-users div.wp-menu-image{background-image:none!important}#adminmenuwrap{position:relative;float:left;z-index:9990}#adminmenu *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#adminmenu li{margin:0;padding:0;cursor:pointer}#adminmenu a{display:block;line-height:1.3;padding:2px 5px;color:#eee}#adminmenu .wp-submenu a{color:#b4b9be;color:rgba(240,245,250,.7);font-size:13px;line-height:1.4;margin:0;padding:5px 0}#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover{background:0 0}#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a:hover,#adminmenu li.menu-top>a:focus{color:#00b9eb}#adminmenu li.menu-top{border:none;min-height:34px;position:relative}#adminmenu .wp-submenu{list-style:none;position:absolute;top:-1000em;left:160px;overflow:visible;word-wrap:break-word}#adminmenu .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu,.folded #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{padding:7px 0 8px;z-index:9999;background-color:#32373c;box-shadow:0 3px 5px rgba(0,0,0,.2)}#adminmenu a.menu-top:focus+.wp-submenu,.js #adminmenu .opensub .wp-submenu,.js #adminmenu .sub-open,.no-js li.wp-has-submenu:hover .wp-submenu{top:-1px}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu .wp-submenu.sub-open,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.no-js li.wp-has-current-submenu:hover .wp-submenu{position:relative;z-index:3;top:auto;left:auto;right:auto;bottom:auto;border:0 none;margin-top:0;box-shadow:none;background-color:#32373c}#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{position:relative;background-color:#191e23;color:#00b9eb}.folded #adminmenu li.menu-top:hover,.folded #adminmenu li.opensub>a.menu-top,.folded #adminmenu li>a.menu-top:focus{z-index:10000}#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu .wp-menu-arrow,#adminmenu .wp-menu-arrow div,#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top,.folded #adminmenu li.wp-has-current-submenu{background:#0073aa;color:#fff}.folded #adminmenu .opensub .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,.folded #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu,.folded #adminmenu .wp-submenu.sub-open,.folded #adminmenu a.menu-top:focus+.wp-submenu,.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu{top:0;left:36px}.folded #adminmenu .wp-has-current-submenu .wp-submenu,.folded #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{position:absolute;top:-1000em}#adminmenu .wp-not-current-submenu .wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{min-width:160px;width:auto}#adminmenu .opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-not-current-submenu li>a,.folded #adminmenu .wp-has-current-submenu li>a{padding-right:16px;padding-left:14px;transition:all .1s ease-in-out,outline 0s}#adminmenu .wp-has-current-submenu ul>li>a,.folded #adminmenu li.menu-top .wp-submenu>li>a{padding:5px 12px}#adminmenu .wp-submenu-head,#adminmenu a.menu-top{font-size:14px;font-weight:400;line-height:1.3;padding:0}#adminmenu .wp-submenu-head{display:none}.folded #adminmenu .wp-menu-name{position:absolute;left:-999px}.folded #adminmenu .wp-submenu-head{display:block}#adminmenu .wp-submenu li{padding:0;margin:0}#adminmenu .wp-menu-image img{padding:9px 0 0 0;opacity:.6;filter:alpha(opacity=60)}#adminmenu div.wp-menu-name{padding:8px 0}#adminmenu div.wp-menu-image{float:left;width:36px;height:34px;margin:0;text-align:center}#adminmenu div.wp-menu-image.svg{background-repeat:no-repeat;background-position:center;background-size:20px auto}div.wp-menu-image:before{color:#a0a5aa;color:rgba(240,245,250,.6);padding:7px 0;transition:all .1s ease-in-out}#adminmenu div.wp-menu-image:before{color:#a0a5aa;color:rgba(240,245,250,.6)}#adminmenu .current div.wp-menu-image:before,#adminmenu .wp-has-current-submenu div.wp-menu-image:before,#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before{color:#fff}#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before{color:#00b9eb}.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#a0a5aa}.folded #adminmenu div.wp-menu-image{width:35px;height:30px;position:absolute;z-index:25}.folded #adminmenu a.menu-top{height:34px}.no-font-face #adminmenu .wp-menu-image{display:none}.no-font-face #adminmenu div.wp-menu-name{padding:8px 12px}.no-font-face.auto-fold #adminmenu .wp-menu-name{margin-left:0}.sticky-menu #adminmenuwrap{position:fixed}.wp-menu-arrow{display:none!important}ul#adminmenu a.wp-has-current-submenu{position:relative}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{right:0;border:solid 8px transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-right-color:#f1f1f1;top:50%;margin-top:-8px}.folded ul#adminmenu li:hover a.wp-has-current-submenu:after{display:none}.folded ul#adminmenu a.wp-has-current-submenu:after,.folded ul#adminmenu>li a.current:after{border-width:4px;margin-top:-4px}#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{right:0;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-width:8px;top:10px;z-index:10000}.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{border-width:4px;margin-top:-4px;top:18px}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-right-color:#32373c}#adminmenu li.menu-top:hover .wp-menu-image img,#adminmenu li.wp-has-current-submenu .wp-menu-image img{opacity:1;filter:alpha(opacity=100)}#adminmenu li.wp-menu-separator{height:5px;padding:0;margin:0 0 6px 0;cursor:inherit}#adminmenu div.separator{height:2px;padding:0}#adminmenu .wp-submenu .wp-submenu-head{color:#fff;font-weight:400;font-size:14px;padding:8px 4px 8px 11px;margin:-7px 0 4px}#adminmenu li.current,.folded #adminmenu li.wp-menu-open{border:0 none}#adminmenu .awaiting-mod,#adminmenu .update-plugins{display:inline-block;vertical-align:top;box-sizing:border-box;margin:1px 0 -1px 2px;padding:0 5px;min-width:18px;height:18px;border-radius:9px;background-color:#ca4a1f;color:#fff;font-size:11px;line-height:1.6;text-align:center;z-index:26}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod{background-color:#ca4a1f;color:#fff}#adminmenu li span.count-0{display:none}#collapse-button{display:block;width:100%;height:34px;margin:0;border:none;padding:0;position:relative;overflow:visible;background:0 0;color:#aaa;cursor:pointer}#collapse-button:hover{color:#00b9eb}#collapse-button:focus{color:#00b9eb;outline:1px solid transparent;outline-offset:-1px}#collapse-button .collapse-button-icon,#collapse-button .collapse-button-label{display:block;position:absolute;top:0;left:0}#collapse-button .collapse-button-label{top:8px}#collapse-button .collapse-button-icon{width:36px;height:34px}#collapse-button .collapse-button-label{padding:0 0 0 36px}.folded #collapse-button .collapse-button-label{display:none}#collapse-button .collapse-button-icon:after{content:"\f148";display:block;position:relative;top:7px;text-align:center;font:normal 20px/1 dashicons!important;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.folded #collapse-button .collapse-button-icon:after,.rtl #collapse-button .collapse-button-icon:after{transform:rotate(180deg)}.rtl.folded #collapse-button .collapse-button-icon:after{transform:none}#collapse-button .collapse-button-icon:after,#collapse-button .collapse-button-label{transition:all .1s ease-in-out}li#wp-admin-bar-menu-toggle{display:none}.customize-support #menu-appearance a[href="themes.php?page=custom-background"],.customize-support #menu-appearance a[href="themes.php?page=custom-header"]{display:none}@media only screen and (max-width:960px){.auto-fold #wpcontent,.auto-fold #wpfooter{margin-left:36px}.auto-fold #adminmenu,.auto-fold #adminmenu li.menu-top,.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{width:36px}.auto-fold #adminmenu .opensub .wp-submenu,.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu,.auto-fold #adminmenu .wp-submenu.sub-open,.auto-fold #adminmenu a.menu-top:focus+.wp-submenu{top:0;left:36px}.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu,.auto-fold #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{position:absolute;top:-1000em;margin-right:-1px;padding:7px 0 8px;z-index:9999}.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu{min-width:150px;width:auto}.auto-fold #adminmenu .wp-has-current-submenu li>a{padding-right:16px;padding-left:14px}.auto-fold #adminmenu li.menu-top .wp-submenu>li>a{padding-left:12px}.auto-fold #adminmenu .wp-menu-name{position:absolute;left:-999px}.auto-fold #adminmenu .wp-submenu-head{display:block}.auto-fold #adminmenu div.wp-menu-image{height:30px;width:34px;position:absolute;z-index:25}.auto-fold #adminmenu a.menu-top{height:34px}.auto-fold #adminmenu li.wp-menu-open{border:0 none}.auto-fold #adminmenu .wp-has-current-submenu.menu-top-last{margin-bottom:0}.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after{display:none}.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{border-width:4px;margin-top:-4px;top:16px}.auto-fold ul#adminmenu a.wp-has-current-submenu:after,.auto-fold ul#adminmenu>li a.current:after{border-width:4px;margin-top:-4px}.auto-fold #adminmenu li.menu-top:hover,.auto-fold #adminmenu li.opensub>a.menu-top,.auto-fold #adminmenu li>a.menu-top:focus{z-index:10000}.auto-fold #collapse-menu .collapse-button-label{display:none}.auto-fold #collapse-button .collapse-button-icon:after{transform:rotate(180deg)}.rtl.auto-fold #collapse-button .collapse-button-icon:after{transform:none}}@media screen and (max-width:782px){.auto-fold #wpcontent{position:relative;margin-left:0;padding-left:10px}.sticky-menu #adminmenuwrap{position:relative;z-index:auto;top:0}.auto-fold #adminmenu,.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{position:absolute;width:190px;z-index:100}.auto-fold #adminmenuback{position:fixed}.auto-fold #adminmenuback,.auto-fold #adminmenuwrap{display:none}.auto-fold .wp-responsive-open #adminmenuback,.auto-fold .wp-responsive-open #adminmenuwrap{display:block}.auto-fold #adminmenu li.menu-top{width:100%}.auto-fold #adminmenu li a{font-size:16px;padding:5px}.auto-fold #adminmenu li.menu-top .wp-submenu>li>a{padding:10px 10px 10px 20px}.auto-fold #adminmenu .wp-menu-name{position:static;margin-left:35px}.auto-fold ul#adminmenu a.wp-has-current-submenu:after,.auto-fold ul#adminmenu>li.current>a.current:after{border-width:8px;margin-top:-8px}.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after{display:none}#adminmenu .wp-submenu{position:relative;display:none}.auto-fold #adminmenu .selected .wp-submenu,.auto-fold #adminmenu .wp-menu-open .wp-submenu{position:relative;display:block;top:0;left:-1px;box-shadow:none}.auto-fold #adminmenu .selected .wp-submenu:after,.auto-fold #adminmenu .wp-menu-open .wp-submenu:after{display:none}.auto-fold #adminmenu .opensub .wp-submenu{display:none}.auto-fold #adminmenu .selected .wp-submenu{display:block}.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after{display:block}.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus+.wp-submenu,.auto-fold #adminmenu a.menu-top:focus+.wp-submenu{position:relative;left:-1px;right:0;top:0}#adminmenu .wp-submenu .wp-submenu-head{display:none}#wp-responsive-toggle{position:fixed;top:5px;left:4px;padding-right:10px;z-index:99999;border:none;box-sizing:border-box}#wpadminbar #wp-admin-bar-menu-toggle a{display:block;padding:0;overflow:hidden;outline:0;text-decoration:none;border:1px solid transparent;background:0 0;height:44px;margin-left:-1px}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#32373c}li#wp-admin-bar-menu-toggle{display:block}#wpadminbar #wp-admin-bar-menu-toggle a:hover{border:1px solid transparent}#wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{content:"\f228";display:inline-block;float:left;font:normal 40px/45px dashicons;vertical-align:middle;outline:0;margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;height:44px;width:50px;padding:0;border:none;text-align:center;text-decoration:none;box-sizing:border-box}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#00b9eb}}@media screen and (max-width:600px){#adminmenuback,#adminmenuwrap{display:none}.wp-responsive-open #adminmenuback,.wp-responsive-open #adminmenuwrap{display:block}.auto-fold #adminmenu{top:46px}} \ No newline at end of file diff --git a/wp-admin/css/code-editor-rtl.css b/wp-admin/css/code-editor-rtl.css new file mode 100644 index 0000000..b329c81 --- /dev/null +++ b/wp-admin/css/code-editor-rtl.css @@ -0,0 +1,77 @@ +/*! This file is auto-generated */ +.wrap [class*="CodeMirror-lint-marker"], +.wp-core-ui [class*="CodeMirror-lint-message"], +.wrap .CodeMirror-lint-marker-multiple { + background-image: none; +} + +.wp-core-ui .CodeMirror-lint-marker-error, +.wp-core-ui .CodeMirror-lint-marker-warning { + cursor: help; +} + +.wrap .CodeMirror-lint-marker-multiple { + position: absolute; + top: 0; +} + +.wrap [class*="CodeMirror-lint-marker"]:before { + font: normal 18px/1 dashicons; + position: relative; + top: -2px; +} + +.wp-core-ui [class*="CodeMirror-lint-message"]:before { + font: normal 16px/1 dashicons; + right: 16px; + position: absolute; +} + +.wp-core-ui .CodeMirror-lint-message-error, +.wp-core-ui .CodeMirror-lint-message-warning { + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); + margin: 5px 0 2px; + padding: 3px 28px 3px 12px; +} + +.wp-core-ui .CodeMirror-lint-message-warning { + background-color: #fff8e5; + border-right: 4px solid #ffb900; +} + +.wrap .CodeMirror-lint-marker-warning:before, +.wp-core-ui .CodeMirror-lint-message-warning:before { + content: "\f534"; + color: #f6a306; +} + +.wp-core-ui .CodeMirror-lint-message-error { + background-color: #fbeaea; + border-right: 4px solid #dc3232; +} + +.wrap .CodeMirror-lint-marker-error:before, +.wp-core-ui .CodeMirror-lint-message-error:before { + content: "\f153"; + color: #dc3232; +} + +.wp-core-ui .CodeMirror-lint-tooltip { + background: none; + border: none; + border-radius: 0; + direction: rtl; +} + +.wrap .CodeMirror .CodeMirror-matchingbracket { + background: rgba(255, 150, 0, 0.3); + color: inherit; +} + +.CodeMirror { + text-align: right; +} + +.wrap .CodeMirror .CodeMirror-linenumber { + color: #666; +} diff --git a/wp-admin/css/code-editor-rtl.min.css b/wp-admin/css/code-editor-rtl.min.css new file mode 100644 index 0000000..b3cb2d9 --- /dev/null +++ b/wp-admin/css/code-editor-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-core-ui [class*=CodeMirror-lint-message],.wrap .CodeMirror-lint-marker-multiple,.wrap [class*=CodeMirror-lint-marker]{background-image:none}.wp-core-ui .CodeMirror-lint-marker-error,.wp-core-ui .CodeMirror-lint-marker-warning{cursor:help}.wrap .CodeMirror-lint-marker-multiple{position:absolute;top:0}.wrap [class*=CodeMirror-lint-marker]:before{font:normal 18px/1 dashicons;position:relative;top:-2px}.wp-core-ui [class*=CodeMirror-lint-message]:before{font:normal 16px/1 dashicons;right:16px;position:absolute}.wp-core-ui .CodeMirror-lint-message-error,.wp-core-ui .CodeMirror-lint-message-warning{box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:5px 0 2px;padding:3px 28px 3px 12px}.wp-core-ui .CodeMirror-lint-message-warning{background-color:#fff8e5;border-right:4px solid #ffb900}.wp-core-ui .CodeMirror-lint-message-warning:before,.wrap .CodeMirror-lint-marker-warning:before{content:"\f534";color:#f6a306}.wp-core-ui .CodeMirror-lint-message-error{background-color:#fbeaea;border-right:4px solid #dc3232}.wp-core-ui .CodeMirror-lint-message-error:before,.wrap .CodeMirror-lint-marker-error:before{content:"\f153";color:#dc3232}.wp-core-ui .CodeMirror-lint-tooltip{background:0 0;border:none;border-radius:0;direction:rtl}.wrap .CodeMirror .CodeMirror-matchingbracket{background:rgba(255,150,0,.3);color:inherit}.CodeMirror{text-align:right}.wrap .CodeMirror .CodeMirror-linenumber{color:#666} \ No newline at end of file diff --git a/wp-admin/css/code-editor.css b/wp-admin/css/code-editor.css new file mode 100644 index 0000000..27db1fd --- /dev/null +++ b/wp-admin/css/code-editor.css @@ -0,0 +1,76 @@ +.wrap [class*="CodeMirror-lint-marker"], +.wp-core-ui [class*="CodeMirror-lint-message"], +.wrap .CodeMirror-lint-marker-multiple { + background-image: none; +} + +.wp-core-ui .CodeMirror-lint-marker-error, +.wp-core-ui .CodeMirror-lint-marker-warning { + cursor: help; +} + +.wrap .CodeMirror-lint-marker-multiple { + position: absolute; + top: 0; +} + +.wrap [class*="CodeMirror-lint-marker"]:before { + font: normal 18px/1 dashicons; + position: relative; + top: -2px; +} + +.wp-core-ui [class*="CodeMirror-lint-message"]:before { + font: normal 16px/1 dashicons; + left: 16px; + position: absolute; +} + +.wp-core-ui .CodeMirror-lint-message-error, +.wp-core-ui .CodeMirror-lint-message-warning { + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); + margin: 5px 0 2px; + padding: 3px 12px 3px 28px; +} + +.wp-core-ui .CodeMirror-lint-message-warning { + background-color: #fff8e5; + border-left: 4px solid #ffb900; +} + +.wrap .CodeMirror-lint-marker-warning:before, +.wp-core-ui .CodeMirror-lint-message-warning:before { + content: "\f534"; + color: #f6a306; +} + +.wp-core-ui .CodeMirror-lint-message-error { + background-color: #fbeaea; + border-left: 4px solid #dc3232; +} + +.wrap .CodeMirror-lint-marker-error:before, +.wp-core-ui .CodeMirror-lint-message-error:before { + content: "\f153"; + color: #dc3232; +} + +.wp-core-ui .CodeMirror-lint-tooltip { + background: none; + border: none; + border-radius: 0; + direction: ltr; +} + +.wrap .CodeMirror .CodeMirror-matchingbracket { + background: rgba(255, 150, 0, 0.3); + color: inherit; +} + +.CodeMirror { + text-align: left; +} + +.wrap .CodeMirror .CodeMirror-linenumber { + color: #666; +} diff --git a/wp-admin/css/code-editor.min.css b/wp-admin/css/code-editor.min.css new file mode 100644 index 0000000..1032975 --- /dev/null +++ b/wp-admin/css/code-editor.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-core-ui [class*=CodeMirror-lint-message],.wrap .CodeMirror-lint-marker-multiple,.wrap [class*=CodeMirror-lint-marker]{background-image:none}.wp-core-ui .CodeMirror-lint-marker-error,.wp-core-ui .CodeMirror-lint-marker-warning{cursor:help}.wrap .CodeMirror-lint-marker-multiple{position:absolute;top:0}.wrap [class*=CodeMirror-lint-marker]:before{font:normal 18px/1 dashicons;position:relative;top:-2px}.wp-core-ui [class*=CodeMirror-lint-message]:before{font:normal 16px/1 dashicons;left:16px;position:absolute}.wp-core-ui .CodeMirror-lint-message-error,.wp-core-ui .CodeMirror-lint-message-warning{box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:5px 0 2px;padding:3px 12px 3px 28px}.wp-core-ui .CodeMirror-lint-message-warning{background-color:#fff8e5;border-left:4px solid #ffb900}.wp-core-ui .CodeMirror-lint-message-warning:before,.wrap .CodeMirror-lint-marker-warning:before{content:"\f534";color:#f6a306}.wp-core-ui .CodeMirror-lint-message-error{background-color:#fbeaea;border-left:4px solid #dc3232}.wp-core-ui .CodeMirror-lint-message-error:before,.wrap .CodeMirror-lint-marker-error:before{content:"\f153";color:#dc3232}.wp-core-ui .CodeMirror-lint-tooltip{background:0 0;border:none;border-radius:0;direction:ltr}.wrap .CodeMirror .CodeMirror-matchingbracket{background:rgba(255,150,0,.3);color:inherit}.CodeMirror{text-align:left}.wrap .CodeMirror .CodeMirror-linenumber{color:#666} \ No newline at end of file diff --git a/wp-admin/css/color-picker-rtl.css b/wp-admin/css/color-picker-rtl.css new file mode 100644 index 0000000..bc21cda --- /dev/null +++ b/wp-admin/css/color-picker-rtl.css @@ -0,0 +1,179 @@ +/*! This file is auto-generated */ +/* rtl:ignore */ +.wp-color-picker { + width: 80px; + direction: ltr; +} + +.wp-picker-container .hidden { + display: none; +} + +/* Needs higher specificiity. */ +.wp-picker-container .wp-color-result.button { + min-height: 30px; + margin: 0 0px 6px 6px; + padding: 0 30px 0 0; + font-size: 11px; +} + +.wp-color-result-text { + background: #f7f7f7; + border-radius: 2px 0 0 2px; + border-right: 1px solid #ccc; + color: #555; + display: block; + line-height: 2.54545455; /* 28px */ + padding: 0 6px; + text-align: center; +} + +.wp-color-result:hover, +.wp-color-result:focus { + background: #fafafa; + border-color: #999; + color: #23282d; +} + +.wp-color-result:hover:after, +.wp-color-result:focus:after { + color: #23282d; + border-color: #a0a5aa; + border-right: 1px solid #999; +} + +.wp-picker-container { + display: inline-block; +} + +.wp-color-result:focus { + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +.wp-color-result:active { + /* See Trac ticket #39662 */ + transform: none !important; +} + +.wp-picker-open + .wp-picker-input-wrap { + display: inline-block; + vertical-align: top; +} + +.wp-picker-input-wrap label { + display: inline-block; + vertical-align: top; +} + +/* For the old `custom-background` page, to override the inline-block and margins from `.form-table td fieldset label`. */ +.form-table .wp-picker-input-wrap label { + margin: 0 !important; +} + +.wp-picker-input-wrap .button.wp-picker-default, +.wp-customizer .wp-picker-input-wrap .button.wp-picker-default { + margin-right: 6px; + padding: 0 8px; + line-height: 2.54545455; /* 28px */ + min-height: 30px; +} + +.wp-picker-container .iris-square-slider .ui-slider-handle:focus { + background-color: #555 +} + +.wp-picker-container .iris-picker { + border-radius: 0; + border-color: #ddd; + margin-top: 6px; +} + +.wp-picker-container input[type="text"].wp-color-picker { + width: 4rem; + font-size: 12px; + font-family: monospace; + line-height: 2.33333333; /* 28px */ + margin: 0; + padding: 0 5px; + vertical-align: top; + min-height: 30px; +} + +.wp-color-picker::-webkit-input-placeholder { + color: #72777c; +} + +.wp-color-picker::-moz-placeholder { + color: #72777c; + opacity: 1; +} + +.wp-color-picker:-ms-input-placeholder { + color: #72777c; +} + +.wp-picker-container input[type="text"].iris-error { + background-color: #ffebe8; + border-color: #c00; + color: #000; +} + +.iris-picker .ui-square-handle:focus, +.iris-picker .iris-strip .ui-slider-handle:focus { + border-color: #007cba; + border-style: solid; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; +} + +.iris-picker .iris-palette:focus { + box-shadow: 0 0 0 2px #007cba; +} + +@media screen and (max-width: 782px) { + .wp-picker-container input[type="text"].wp-color-picker { + width: 5rem; + font-size: 16px; + line-height: 1.875; /* 30px */ + min-height: 32px; + } + + .wp-customizer .wp-picker-container input[type="text"].wp-color-picker { + padding: 0 5px; + } + + .wp-picker-input-wrap .button.wp-picker-default { + padding: 0 8px; + line-height: 2.14285714; /* 30px */ + min-height: 32px; + } + + .wp-customizer .wp-picker-input-wrap .button.wp-picker-default { + padding: 0 8px; + font-size: 14px; + line-height: 2.14285714; /* 30px */ + min-height: 32px; + } + + .wp-picker-container .wp-color-result.button { + padding: 0 40px 0 0; + font-size: 14px; + line-height: 2.14285714; /* 30px */ + } + + .wp-customizer .wp-picker-container .wp-color-result.button { + font-size: 14px; + line-height: 2.14285714; /* 30px */ + } + + .wp-picker-container .wp-color-result-text { + padding: 0 14px; + font-size: inherit; + line-height: inherit; + } + + .wp-customizer .wp-picker-container .wp-color-result-text { + padding: 0 10px; + } +} diff --git a/wp-admin/css/color-picker-rtl.min.css b/wp-admin/css/color-picker-rtl.min.css new file mode 100644 index 0000000..9529a25 --- /dev/null +++ b/wp-admin/css/color-picker-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-color-picker{width:80px;direction:ltr}.wp-picker-container .hidden{display:none}.wp-picker-container .wp-color-result.button{min-height:30px;margin:0 0 6px 6px;padding:0 30px 0 0;font-size:11px}.wp-color-result-text{background:#f7f7f7;border-radius:2px 0 0 2px;border-right:1px solid #ccc;color:#555;display:block;line-height:2.54545455;padding:0 6px;text-align:center}.wp-color-result:focus,.wp-color-result:hover{background:#fafafa;border-color:#999;color:#23282d}.wp-color-result:focus:after,.wp-color-result:hover:after{color:#23282d;border-color:#a0a5aa;border-right:1px solid #999}.wp-picker-container{display:inline-block}.wp-color-result:focus{border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}.wp-color-result:active{transform:none!important}.wp-picker-open+.wp-picker-input-wrap{display:inline-block;vertical-align:top}.wp-picker-input-wrap label{display:inline-block;vertical-align:top}.form-table .wp-picker-input-wrap label{margin:0!important}.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,.wp-picker-input-wrap .button.wp-picker-default{margin-right:6px;padding:0 8px;line-height:2.54545455;min-height:30px}.wp-picker-container .iris-square-slider .ui-slider-handle:focus{background-color:#555}.wp-picker-container .iris-picker{border-radius:0;border-color:#ddd;margin-top:6px}.wp-picker-container input[type=text].wp-color-picker{width:4rem;font-size:12px;font-family:monospace;line-height:2.33333333;margin:0;padding:0 5px;vertical-align:top;min-height:30px}.wp-color-picker::-webkit-input-placeholder{color:#72777c}.wp-color-picker::-moz-placeholder{color:#72777c;opacity:1}.wp-color-picker:-ms-input-placeholder{color:#72777c}.wp-picker-container input[type=text].iris-error{background-color:#ffebe8;border-color:#c00;color:#000}.iris-picker .iris-strip .ui-slider-handle:focus,.iris-picker .ui-square-handle:focus{border-color:#007cba;border-style:solid;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.iris-picker .iris-palette:focus{box-shadow:0 0 0 2px #007cba}@media screen and (max-width:782px){.wp-picker-container input[type=text].wp-color-picker{width:5rem;font-size:16px;line-height:1.875;min-height:32px}.wp-customizer .wp-picker-container input[type=text].wp-color-picker{padding:0 5px}.wp-picker-input-wrap .button.wp-picker-default{padding:0 8px;line-height:2.14285714;min-height:32px}.wp-customizer .wp-picker-input-wrap .button.wp-picker-default{padding:0 8px;font-size:14px;line-height:2.14285714;min-height:32px}.wp-picker-container .wp-color-result.button{padding:0 40px 0 0;font-size:14px;line-height:2.14285714}.wp-customizer .wp-picker-container .wp-color-result.button{font-size:14px;line-height:2.14285714}.wp-picker-container .wp-color-result-text{padding:0 14px;font-size:inherit;line-height:inherit}.wp-customizer .wp-picker-container .wp-color-result-text{padding:0 10px}} \ No newline at end of file diff --git a/wp-admin/css/color-picker.css b/wp-admin/css/color-picker.css new file mode 100644 index 0000000..beec826 --- /dev/null +++ b/wp-admin/css/color-picker.css @@ -0,0 +1,178 @@ +/* rtl:ignore */ +.wp-color-picker { + width: 80px; + direction: ltr; +} + +.wp-picker-container .hidden { + display: none; +} + +/* Needs higher specificiity. */ +.wp-picker-container .wp-color-result.button { + min-height: 30px; + margin: 0 6px 6px 0px; + padding: 0 0 0 30px; + font-size: 11px; +} + +.wp-color-result-text { + background: #f7f7f7; + border-radius: 0 2px 2px 0; + border-left: 1px solid #ccc; + color: #555; + display: block; + line-height: 2.54545455; /* 28px */ + padding: 0 6px; + text-align: center; +} + +.wp-color-result:hover, +.wp-color-result:focus { + background: #fafafa; + border-color: #999; + color: #23282d; +} + +.wp-color-result:hover:after, +.wp-color-result:focus:after { + color: #23282d; + border-color: #a0a5aa; + border-left: 1px solid #999; +} + +.wp-picker-container { + display: inline-block; +} + +.wp-color-result:focus { + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +.wp-color-result:active { + /* See Trac ticket #39662 */ + transform: none !important; +} + +.wp-picker-open + .wp-picker-input-wrap { + display: inline-block; + vertical-align: top; +} + +.wp-picker-input-wrap label { + display: inline-block; + vertical-align: top; +} + +/* For the old `custom-background` page, to override the inline-block and margins from `.form-table td fieldset label`. */ +.form-table .wp-picker-input-wrap label { + margin: 0 !important; +} + +.wp-picker-input-wrap .button.wp-picker-default, +.wp-customizer .wp-picker-input-wrap .button.wp-picker-default { + margin-left: 6px; + padding: 0 8px; + line-height: 2.54545455; /* 28px */ + min-height: 30px; +} + +.wp-picker-container .iris-square-slider .ui-slider-handle:focus { + background-color: #555 +} + +.wp-picker-container .iris-picker { + border-radius: 0; + border-color: #ddd; + margin-top: 6px; +} + +.wp-picker-container input[type="text"].wp-color-picker { + width: 4rem; + font-size: 12px; + font-family: monospace; + line-height: 2.33333333; /* 28px */ + margin: 0; + padding: 0 5px; + vertical-align: top; + min-height: 30px; +} + +.wp-color-picker::-webkit-input-placeholder { + color: #72777c; +} + +.wp-color-picker::-moz-placeholder { + color: #72777c; + opacity: 1; +} + +.wp-color-picker:-ms-input-placeholder { + color: #72777c; +} + +.wp-picker-container input[type="text"].iris-error { + background-color: #ffebe8; + border-color: #c00; + color: #000; +} + +.iris-picker .ui-square-handle:focus, +.iris-picker .iris-strip .ui-slider-handle:focus { + border-color: #007cba; + border-style: solid; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; +} + +.iris-picker .iris-palette:focus { + box-shadow: 0 0 0 2px #007cba; +} + +@media screen and (max-width: 782px) { + .wp-picker-container input[type="text"].wp-color-picker { + width: 5rem; + font-size: 16px; + line-height: 1.875; /* 30px */ + min-height: 32px; + } + + .wp-customizer .wp-picker-container input[type="text"].wp-color-picker { + padding: 0 5px; + } + + .wp-picker-input-wrap .button.wp-picker-default { + padding: 0 8px; + line-height: 2.14285714; /* 30px */ + min-height: 32px; + } + + .wp-customizer .wp-picker-input-wrap .button.wp-picker-default { + padding: 0 8px; + font-size: 14px; + line-height: 2.14285714; /* 30px */ + min-height: 32px; + } + + .wp-picker-container .wp-color-result.button { + padding: 0 0 0 40px; + font-size: 14px; + line-height: 2.14285714; /* 30px */ + } + + .wp-customizer .wp-picker-container .wp-color-result.button { + font-size: 14px; + line-height: 2.14285714; /* 30px */ + } + + .wp-picker-container .wp-color-result-text { + padding: 0 14px; + font-size: inherit; + line-height: inherit; + } + + .wp-customizer .wp-picker-container .wp-color-result-text { + padding: 0 10px; + } +} diff --git a/wp-admin/css/color-picker.min.css b/wp-admin/css/color-picker.min.css new file mode 100644 index 0000000..df0b92c --- /dev/null +++ b/wp-admin/css/color-picker.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-color-picker{width:80px;direction:ltr}.wp-picker-container .hidden{display:none}.wp-picker-container .wp-color-result.button{min-height:30px;margin:0 6px 6px 0;padding:0 0 0 30px;font-size:11px}.wp-color-result-text{background:#f7f7f7;border-radius:0 2px 2px 0;border-left:1px solid #ccc;color:#555;display:block;line-height:2.54545455;padding:0 6px;text-align:center}.wp-color-result:focus,.wp-color-result:hover{background:#fafafa;border-color:#999;color:#23282d}.wp-color-result:focus:after,.wp-color-result:hover:after{color:#23282d;border-color:#a0a5aa;border-left:1px solid #999}.wp-picker-container{display:inline-block}.wp-color-result:focus{border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}.wp-color-result:active{transform:none!important}.wp-picker-open+.wp-picker-input-wrap{display:inline-block;vertical-align:top}.wp-picker-input-wrap label{display:inline-block;vertical-align:top}.form-table .wp-picker-input-wrap label{margin:0!important}.wp-customizer .wp-picker-input-wrap .button.wp-picker-default,.wp-picker-input-wrap .button.wp-picker-default{margin-left:6px;padding:0 8px;line-height:2.54545455;min-height:30px}.wp-picker-container .iris-square-slider .ui-slider-handle:focus{background-color:#555}.wp-picker-container .iris-picker{border-radius:0;border-color:#ddd;margin-top:6px}.wp-picker-container input[type=text].wp-color-picker{width:4rem;font-size:12px;font-family:monospace;line-height:2.33333333;margin:0;padding:0 5px;vertical-align:top;min-height:30px}.wp-color-picker::-webkit-input-placeholder{color:#72777c}.wp-color-picker::-moz-placeholder{color:#72777c;opacity:1}.wp-color-picker:-ms-input-placeholder{color:#72777c}.wp-picker-container input[type=text].iris-error{background-color:#ffebe8;border-color:#c00;color:#000}.iris-picker .iris-strip .ui-slider-handle:focus,.iris-picker .ui-square-handle:focus{border-color:#007cba;border-style:solid;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.iris-picker .iris-palette:focus{box-shadow:0 0 0 2px #007cba}@media screen and (max-width:782px){.wp-picker-container input[type=text].wp-color-picker{width:5rem;font-size:16px;line-height:1.875;min-height:32px}.wp-customizer .wp-picker-container input[type=text].wp-color-picker{padding:0 5px}.wp-picker-input-wrap .button.wp-picker-default{padding:0 8px;line-height:2.14285714;min-height:32px}.wp-customizer .wp-picker-input-wrap .button.wp-picker-default{padding:0 8px;font-size:14px;line-height:2.14285714;min-height:32px}.wp-picker-container .wp-color-result.button{padding:0 0 0 40px;font-size:14px;line-height:2.14285714}.wp-customizer .wp-picker-container .wp-color-result.button{font-size:14px;line-height:2.14285714}.wp-picker-container .wp-color-result-text{padding:0 14px;font-size:inherit;line-height:inherit}.wp-customizer .wp-picker-container .wp-color-result-text{padding:0 10px}} \ No newline at end of file diff --git a/wp-admin/css/colors/_admin.scss b/wp-admin/css/colors/_admin.scss new file mode 100644 index 0000000..ca01267 --- /dev/null +++ b/wp-admin/css/colors/_admin.scss @@ -0,0 +1,581 @@ + +@import 'variables'; +@import 'mixins'; + +@function url-friendly-colour( $color ) { + @return '%23' + str-slice( '#{ $color }', 2, -1 ); +} + +body { + background: $body-background; +} + + +/* Links */ + +a { + color: $link; + + &:hover, + &:active, + &:focus { + color: $link-focus; + } +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + + +/* Forms */ + +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27#{url-friendly-colour($form-checked)}%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: $form-checked; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: $link-focus; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: $highlight-color; + box-shadow: 0 0 0 1px $highlight-color; +} + + +/* Core UI */ + +.wp-core-ui { + + .button { + border-color: #7e8993; + color: #32373c; + } + + .button.hover, + .button:hover, + .button.focus, + .button:focus { + border-color: darken( #7e8993, 5% ); + color: darken( #32373c, 5% ); + } + + .button.focus, + .button:focus { + border-color: #7e8993; + color: darken( #32373c, 5% ); + box-shadow: 0 0 0 1px #32373c; + } + + .button:active { + border-color: #7e8993; + color: darken( #32373c, 5% ); + box-shadow: none; + } + + .button.active, + .button.active:focus, + .button.active:hover { + border-color: $button-color; + color: darken( #32373c, 5% ); + box-shadow: inset 0 2px 5px -3px $button-color; + } + + .button.active:focus { + box-shadow: 0 0 0 1px #32373c; + } + + .button-primary { + @include button( $button-color ); + } + + .button-group > .button.active { + border-color: $button-color; + } + + .wp-ui-primary { + color: $text-color; + background-color: $base-color; + } + .wp-ui-text-primary { + color: $base-color; + } + + .wp-ui-highlight { + color: $menu-highlight-text; + background-color: $menu-highlight-background; + } + .wp-ui-text-highlight { + color: $menu-highlight-background; + } + + .wp-ui-notification { + color: $menu-bubble-text; + background-color: $menu-bubble-background; + } + .wp-ui-text-notification { + color: $menu-bubble-background; + } + + .wp-ui-text-icon { + color: $menu-icon; + } +} + + +/* List tables */ + +.wrap .add-new-h2:hover, /* deprecated */ +.wrap .page-title-action:hover { + color: $menu-text; + background-color: $menu-background; +} + +.view-switch a.current:before { + color: $menu-background; +} + +.view-switch a:hover:before { + color: $menu-bubble-background; +} + + +/* Admin Menu */ + +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: $menu-background; +} + +#adminmenu a { + color: $menu-text; +} + +#adminmenu div.wp-menu-image:before { + color: $menu-icon; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: $menu-highlight-text; + background-color: $menu-highlight-background; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: $menu-highlight-icon; +} + + +/* Active tabs use a bottom border color that matches the page background color. */ + +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: $body-background; + border-bottom-color: $body-background; +} + + +/* Admin Menu: submenu */ + +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: $menu-submenu-background; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-right-color: $menu-submenu-background; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: $menu-submenu-text; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: $menu-submenu-text; + + &:focus, &:hover { + color: $menu-submenu-focus-text; + } +} + + +/* Admin Menu: current */ + +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: $menu-submenu-current-text; + + &:hover, &:focus { + color: $menu-submenu-focus-text; + } +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-right-color: $body-background; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: $menu-current-text; + background: $menu-current-background; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: $menu-current-icon; +} + + +/* Admin Menu: bubble */ + +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: $menu-bubble-text; + background: $menu-bubble-background; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: $menu-bubble-current-text; + background: $menu-bubble-current-background; +} + + +/* Admin Menu: collapse button */ + +#collapse-button { + color: $menu-collapse-text; +} + +#collapse-button:hover, +#collapse-button:focus { + color: $menu-submenu-focus-text; +} + +/* Admin Bar */ + +#wpadminbar { + color: $menu-text; + background: $menu-background; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: $menu-text; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: $menu-icon; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: $menu-submenu-focus-text; + background: $menu-submenu-background; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: $menu-submenu-focus-text; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: $menu-highlight-icon; +} + + +/* Admin Bar: submenu */ + +#wpadminbar .menupop .ab-sub-wrapper { + background: $menu-submenu-background; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: $menu-submenu-background-alt; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: $menu-submenu-text; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: $menu-icon; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: $menu-submenu-focus-text; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: $menu-submenu-focus-text; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: $menu-icon; +} + + +/* Admin Bar: search */ + +#wpadminbar #adminbarsearch:before { + color: $menu-icon; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: $menu-text; + background: $adminbar-input-background; +} + +/* Admin Bar: recovery mode */ + +#wpadminbar #wp-admin-bar-recovery-mode { + color: $adminbar-recovery-exit-text; + background-color: $adminbar-recovery-exit-background; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: $adminbar-recovery-exit-text; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: $adminbar-recovery-exit-text; + background-color: $adminbar-recovery-exit-background-alt; +} + +/* Admin Bar: my account */ + +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: $adminbar-avatar-frame; + background-color: $adminbar-avatar-frame; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: $menu-text; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: $menu-submenu-focus-text; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: $menu-submenu-text; +} + + +/* Pointers */ + +.wp-pointer .wp-pointer-content h3 { + background-color: $highlight-color; + border-color: darken( $highlight-color, 5% ); +} + +.wp-pointer .wp-pointer-content h3:before { + color: $highlight-color; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: $highlight-color; +} + + +/* Media */ + +.media-item .bar, +.media-progress-bar div { + background-color: $highlight-color; +} + +.details.attachment { + box-shadow: + inset 0 0 0 3px #fff, + inset 0 0 0 7px $highlight-color; +} + +.attachment.details .check { + background-color: $highlight-color; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px $highlight-color; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px $highlight-color; +} + + +/* Themes */ + +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: $highlight-color; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: $highlight-color; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: $menu-background; +} + +body.more-filters-opened .more-filters { + color: $menu-text; + background-color: $menu-background; +} + +body.more-filters-opened .more-filters:before { + color: $menu-text; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: $menu-highlight-background; + color: $menu-highlight-text; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: $menu-highlight-text; +} + +/* Widgets */ + +.widgets-chooser li.widgets-chooser-selected { + background-color: $menu-highlight-background; + color: $menu-highlight-text; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: $menu-highlight-text; +} + +/* Responsive Component */ + +div#wp-responsive-toggle a:before { + color: $menu-icon; +} + +.wp-responsive-open div#wp-responsive-toggle a { + // ToDo: make inset border + border-color: transparent; + background: $menu-highlight-background; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: $menu-submenu-background; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: $menu-icon; +} + +/* TinyMCE */ + +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: $highlight-color; +} diff --git a/wp-admin/css/colors/_mixins.scss b/wp-admin/css/colors/_mixins.scss new file mode 100644 index 0000000..4d0c079 --- /dev/null +++ b/wp-admin/css/colors/_mixins.scss @@ -0,0 +1,47 @@ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +@mixin button( $button-color, $button-text-color: #fff ) { + background: $button-color; + border-color: $button-color; + color: $button-text-color; + + &:hover, + &:focus { + background: lighten( $button-color, 3% ); + border-color: darken( $button-color, 3% ); + color: $button-text-color; + } + + &:focus { + box-shadow: + 0 0 0 1px #fff, + 0 0 0 3px $button-color; + } + + &:active { + background: darken( $button-color, 5% ); + border-color: darken( $button-color, 5% ); + color: $button-text-color; + } + + &.active, + &.active:focus, + &.active:hover { + background: $button-color; + color: $button-text-color; + border-color: darken( $button-color, 15% ); + box-shadow: inset 0 2px 5px -3px darken( $button-color, 50% ); + } + + &[disabled], + &:disabled, + &.button-primary-disabled, + &.disabled { + color: hsl( hue( $button-color ), 10%, 80% ) !important; + background: darken( $button-color, 8% ) !important; + border-color: darken( $button-color, 8% ) !important; + text-shadow: none !important; + } +} diff --git a/wp-admin/css/colors/_variables.scss b/wp-admin/css/colors/_variables.scss new file mode 100644 index 0000000..c73ba35 --- /dev/null +++ b/wp-admin/css/colors/_variables.scss @@ -0,0 +1,63 @@ +// assign default value to all undefined variables + + +// core variables + +$text-color: #fff !default; +$base-color: #23282d !default; +$icon-color: hsl( hue( $base-color ), 7%, 95% ) !default; +$highlight-color: #0073aa !default; +$notification-color: #d54e21 !default; + + +// global + +$body-background: #f1f1f1 !default; + +$link: #0073aa !default; +$link-focus: lighten( $link, 10% ) !default; + +$button-color: $highlight-color !default; +$button-text-color: $text-color !default; + +$form-checked: #7e8993 !default; + +// admin menu & admin-bar + +$menu-text: $text-color !default; +$menu-icon: $icon-color !default; +$menu-background: $base-color !default; + +$menu-highlight-text: $text-color !default; +$menu-highlight-icon: $text-color !default; +$menu-highlight-background: $highlight-color !default; + +$menu-current-text: $menu-highlight-text !default; +$menu-current-icon: $menu-highlight-icon !default; +$menu-current-background: $menu-highlight-background !default; + +$menu-submenu-text: mix( $base-color, $text-color, 30% ) !default; +$menu-submenu-background: darken( $base-color, 7% ) !default; +$menu-submenu-background-alt: desaturate( lighten( $menu-background, 7% ), 7% ) !default; + +$menu-submenu-focus-text: $highlight-color !default; +$menu-submenu-current-text: $text-color !default; + +$menu-bubble-text: $text-color !default; +$menu-bubble-background: $notification-color !default; +$menu-bubble-current-text: $text-color !default; +$menu-bubble-current-background: $menu-submenu-background !default; + +$menu-collapse-text: $menu-icon !default; +$menu-collapse-icon: $menu-icon !default; +$menu-collapse-focus-text: $text-color !default; +$menu-collapse-focus-icon: $menu-highlight-icon !default; + +$adminbar-avatar-frame: lighten( $menu-background, 7% ) !default; +$adminbar-input-background: lighten( $menu-background, 7% ) !default; + +$adminbar-recovery-exit-text: $menu-bubble-text !default; +$adminbar-recovery-exit-background: $menu-bubble-background !default; +$adminbar-recovery-exit-background-alt: mix(black, $adminbar-recovery-exit-background, 10%) !default; + +$menu-customizer-text: mix( $base-color, $text-color, 40% ) !default; diff --git a/wp-admin/css/colors/blue/colors-rtl.css b/wp-admin/css/colors/blue/colors-rtl.css new file mode 100644 index 0000000..09e3930 --- /dev/null +++ b/wp-admin/css/colors/blue/colors-rtl.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #7e8993; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #096484; + box-shadow: 0 0 0 1px #096484; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #e1a948; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #e1a948; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #e1a948; + border-color: #e1a948; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #e3af55; + border-color: #dfa33b; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e1a948; +} + +.wp-core-ui .button-primary:active { + background: #dd9f32; + border-color: #dd9f32; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #e1a948; + color: #fff; + border-color: #bd831f; + box-shadow: inset 0 2px 5px -3px #241906; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #d1cdc7 !important; + background: #db9925 !important; + border-color: #db9925 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #e1a948; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #52accc; +} + +.wp-core-ui .wp-ui-text-primary { + color: #52accc; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #096484; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #096484; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #e1a948; +} + +.wp-core-ui .wp-ui-text-notification { + color: #e1a948; +} + +.wp-core-ui .wp-ui-text-icon { + color: #e5f8ff; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #52accc; +} + +.view-switch a.current:before { + color: #52accc; +} + +.view-switch a:hover:before { + color: #e1a948; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #52accc; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #e5f8ff; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #096484; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #4796b3; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-left-color: #4796b3; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #e2ecf1; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #e2ecf1; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #fff; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #fff; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-left-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #096484; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #e1a948; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #4796b3; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #e5f8ff; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #fff; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #52accc; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #e5f8ff; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #fff; + background: #4796b3; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #fff; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #4796b3; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #74b6ce; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #e2ecf1; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #e5f8ff; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #fff; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #fff; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #e5f8ff; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #e5f8ff; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #6eb9d4; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #e1a948; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #cb9841; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #6eb9d4; + background-color: #6eb9d4; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #e2ecf1; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #096484; + border-color: #07526c; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #096484; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #096484; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #096484; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #096484; +} + +.attachment.details .check { + background-color: #096484; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #096484; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #096484; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #096484; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #096484; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #52accc; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #52accc; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #096484; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #096484; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #e5f8ff; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #096484; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #4796b3; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #e5f8ff; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #096484; +} diff --git a/wp-admin/css/colors/blue/colors-rtl.min.css b/wp-admin/css/colors/blue/colors-rtl.min.css new file mode 100644 index 0000000..dee99ea --- /dev/null +++ b/wp-admin/css/colors/blue/colors-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#096484;box-shadow:0 0 0 1px #096484}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#e1a948;color:#262a2e;box-shadow:inset 0 2px 5px -3px #e1a948}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#e1a948;border-color:#e1a948;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#e3af55;border-color:#dfa33b;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #e1a948}.wp-core-ui .button-primary:active{background:#dd9f32;border-color:#dd9f32;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#e1a948;color:#fff;border-color:#bd831f;box-shadow:inset 0 2px 5px -3px #241906}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#d1cdc7!important;background:#db9925!important;border-color:#db9925!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#e1a948}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#52accc}.wp-core-ui .wp-ui-text-primary{color:#52accc}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#096484}.wp-core-ui .wp-ui-text-highlight{color:#096484}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#e1a948}.wp-core-ui .wp-ui-text-notification{color:#e1a948}.wp-core-ui .wp-ui-text-icon{color:#e5f8ff}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#52accc}.view-switch a.current:before{color:#52accc}.view-switch a:hover:before{color:#e1a948}#adminmenu,#adminmenuback,#adminmenuwrap{background:#52accc}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#e5f8ff}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#096484}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#4796b3}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-left-color:#4796b3}#adminmenu .wp-submenu .wp-submenu-head{color:#e2ecf1}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#e2ecf1}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#fff}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#096484}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#e1a948}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#4796b3}#collapse-button{color:#e5f8ff}#collapse-button:focus,#collapse-button:hover{color:#fff}#wpadminbar{color:#fff;background:#52accc}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#e5f8ff}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#fff;background:#4796b3}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#fff}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#4796b3}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#74b6ce}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#e2ecf1}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#e5f8ff}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#fff}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#fff}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#e5f8ff}#wpadminbar #adminbarsearch:before{color:#e5f8ff}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#6eb9d4}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#e1a948}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#cb9841}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#6eb9d4;background-color:#6eb9d4}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info .username{color:#e2ecf1}.wp-pointer .wp-pointer-content h3{background-color:#096484;border-color:#07526c}.wp-pointer .wp-pointer-content h3:before{color:#096484}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#096484}.media-item .bar,.media-progress-bar div{background-color:#096484}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #096484}.attachment.details .check{background-color:#096484;box-shadow:0 0 0 1px #fff,0 0 0 2px #096484}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #096484}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#096484}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#096484}.theme-filter.current,.theme-section.current{border-bottom-color:#52accc}body.more-filters-opened .more-filters{color:#fff;background-color:#52accc}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#096484;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#096484;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#e5f8ff}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#096484}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#4796b3}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#e5f8ff}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#096484} \ No newline at end of file diff --git a/wp-admin/css/colors/blue/colors.css b/wp-admin/css/colors/blue/colors.css new file mode 100644 index 0000000..5f124f9 --- /dev/null +++ b/wp-admin/css/colors/blue/colors.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #7e8993; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #096484; + box-shadow: 0 0 0 1px #096484; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #e1a948; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #e1a948; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #e1a948; + border-color: #e1a948; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #e3af55; + border-color: #dfa33b; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e1a948; +} + +.wp-core-ui .button-primary:active { + background: #dd9f32; + border-color: #dd9f32; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #e1a948; + color: #fff; + border-color: #bd831f; + box-shadow: inset 0 2px 5px -3px #241906; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #d1cdc7 !important; + background: #db9925 !important; + border-color: #db9925 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #e1a948; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #52accc; +} + +.wp-core-ui .wp-ui-text-primary { + color: #52accc; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #096484; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #096484; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #e1a948; +} + +.wp-core-ui .wp-ui-text-notification { + color: #e1a948; +} + +.wp-core-ui .wp-ui-text-icon { + color: #e5f8ff; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #52accc; +} + +.view-switch a.current:before { + color: #52accc; +} + +.view-switch a:hover:before { + color: #e1a948; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #52accc; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #e5f8ff; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #096484; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #4796b3; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-right-color: #4796b3; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #e2ecf1; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #e2ecf1; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #fff; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #fff; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-right-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #096484; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #e1a948; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #4796b3; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #e5f8ff; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #fff; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #52accc; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #e5f8ff; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #fff; + background: #4796b3; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #fff; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #4796b3; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #74b6ce; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #e2ecf1; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #e5f8ff; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #fff; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #fff; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #e5f8ff; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #e5f8ff; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #6eb9d4; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #e1a948; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #cb9841; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #6eb9d4; + background-color: #6eb9d4; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #e2ecf1; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #096484; + border-color: #07526c; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #096484; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #096484; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #096484; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #096484; +} + +.attachment.details .check { + background-color: #096484; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #096484; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #096484; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #096484; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #096484; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #52accc; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #52accc; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #096484; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #096484; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #e5f8ff; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #096484; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #4796b3; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #e5f8ff; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #096484; +} diff --git a/wp-admin/css/colors/blue/colors.min.css b/wp-admin/css/colors/blue/colors.min.css new file mode 100644 index 0000000..02f8c42 --- /dev/null +++ b/wp-admin/css/colors/blue/colors.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#096484;box-shadow:0 0 0 1px #096484}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#e1a948;color:#262a2e;box-shadow:inset 0 2px 5px -3px #e1a948}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#e1a948;border-color:#e1a948;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#e3af55;border-color:#dfa33b;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #e1a948}.wp-core-ui .button-primary:active{background:#dd9f32;border-color:#dd9f32;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#e1a948;color:#fff;border-color:#bd831f;box-shadow:inset 0 2px 5px -3px #241906}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#d1cdc7!important;background:#db9925!important;border-color:#db9925!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#e1a948}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#52accc}.wp-core-ui .wp-ui-text-primary{color:#52accc}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#096484}.wp-core-ui .wp-ui-text-highlight{color:#096484}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#e1a948}.wp-core-ui .wp-ui-text-notification{color:#e1a948}.wp-core-ui .wp-ui-text-icon{color:#e5f8ff}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#52accc}.view-switch a.current:before{color:#52accc}.view-switch a:hover:before{color:#e1a948}#adminmenu,#adminmenuback,#adminmenuwrap{background:#52accc}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#e5f8ff}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#096484}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#4796b3}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-right-color:#4796b3}#adminmenu .wp-submenu .wp-submenu-head{color:#e2ecf1}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#e2ecf1}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#fff}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#096484}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#e1a948}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#4796b3}#collapse-button{color:#e5f8ff}#collapse-button:focus,#collapse-button:hover{color:#fff}#wpadminbar{color:#fff;background:#52accc}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#e5f8ff}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#fff;background:#4796b3}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#fff}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#4796b3}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#74b6ce}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#e2ecf1}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#e5f8ff}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#fff}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#fff}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#e5f8ff}#wpadminbar #adminbarsearch:before{color:#e5f8ff}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#6eb9d4}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#e1a948}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#cb9841}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#6eb9d4;background-color:#6eb9d4}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info .username{color:#e2ecf1}.wp-pointer .wp-pointer-content h3{background-color:#096484;border-color:#07526c}.wp-pointer .wp-pointer-content h3:before{color:#096484}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#096484}.media-item .bar,.media-progress-bar div{background-color:#096484}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #096484}.attachment.details .check{background-color:#096484;box-shadow:0 0 0 1px #fff,0 0 0 2px #096484}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #096484}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#096484}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#096484}.theme-filter.current,.theme-section.current{border-bottom-color:#52accc}body.more-filters-opened .more-filters{color:#fff;background-color:#52accc}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#096484;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#096484;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#e5f8ff}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#096484}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#4796b3}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#e5f8ff}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#096484} \ No newline at end of file diff --git a/wp-admin/css/colors/blue/colors.scss b/wp-admin/css/colors/blue/colors.scss new file mode 100644 index 0000000..b254d73 --- /dev/null +++ b/wp-admin/css/colors/blue/colors.scss @@ -0,0 +1,11 @@ +$base-color: #52accc; +$icon-color: #e5f8ff; +$highlight-color: #096484; +$notification-color: #e1a948; +$button-color: #e1a948; + +$menu-submenu-text: #e2ecf1; +$menu-submenu-focus-text: #fff; +$menu-submenu-background: #4796b3; + +@import "../_admin.scss"; diff --git a/wp-admin/css/colors/coffee/colors-rtl.css b/wp-admin/css/colors/coffee/colors-rtl.css new file mode 100644 index 0000000..2dd9a12 --- /dev/null +++ b/wp-admin/css/colors/coffee/colors-rtl.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%2359524c%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #59524c; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #c7a589; + box-shadow: 0 0 0 1px #c7a589; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #c7a589; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #c7a589; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #c7a589; + border-color: #c7a589; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #ccad93; + border-color: #c29d7f; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #c7a589; +} + +.wp-core-ui .button-primary:active { + background: #bf9878; + border-color: #bf9878; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #c7a589; + color: #fff; + border-color: #ae7d55; + box-shadow: inset 0 2px 5px -3px #37271a; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #d1ccc7 !important; + background: #ba906d !important; + border-color: #ba906d !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #c7a589; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #59524c; +} + +.wp-core-ui .wp-ui-text-primary { + color: #59524c; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #c7a589; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #c7a589; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #9ea476; +} + +.wp-core-ui .wp-ui-text-notification { + color: #9ea476; +} + +.wp-core-ui .wp-ui-text-icon { + color: #f3f2f1; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #59524c; +} + +.view-switch a.current:before { + color: #59524c; +} + +.view-switch a:hover:before { + color: #9ea476; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #59524c; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #f3f2f1; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #c7a589; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #46403c; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-left-color: #46403c; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #cdcbc9; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #cdcbc9; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #c7a589; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #c7a589; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-left-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #c7a589; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #9ea476; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #46403c; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #f3f2f1; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #c7a589; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #59524c; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #f3f2f1; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #c7a589; + background: #46403c; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #c7a589; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #46403c; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #656463; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #cdcbc9; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #f3f2f1; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #c7a589; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #c7a589; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #f3f2f1; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #f3f2f1; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #6c645c; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #9ea476; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #8e946a; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #6c645c; + background-color: #6c645c; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #c7a589; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #cdcbc9; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #c7a589; + border-color: #bf9878; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #c7a589; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #c7a589; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #c7a589; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #c7a589; +} + +.attachment.details .check { + background-color: #c7a589; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #c7a589; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #c7a589; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #c7a589; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #c7a589; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #59524c; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #59524c; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #c7a589; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #c7a589; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #f3f2f1; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #c7a589; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #46403c; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #f3f2f1; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #c7a589; +} diff --git a/wp-admin/css/colors/coffee/colors-rtl.min.css b/wp-admin/css/colors/coffee/colors-rtl.min.css new file mode 100644 index 0000000..32a5b2f --- /dev/null +++ b/wp-admin/css/colors/coffee/colors-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%2359524c%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#59524c}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#c7a589;box-shadow:0 0 0 1px #c7a589}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#c7a589;color:#262a2e;box-shadow:inset 0 2px 5px -3px #c7a589}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#c7a589;border-color:#c7a589;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#ccad93;border-color:#c29d7f;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #c7a589}.wp-core-ui .button-primary:active{background:#bf9878;border-color:#bf9878;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#c7a589;color:#fff;border-color:#ae7d55;box-shadow:inset 0 2px 5px -3px #37271a}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#d1ccc7!important;background:#ba906d!important;border-color:#ba906d!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#c7a589}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#59524c}.wp-core-ui .wp-ui-text-primary{color:#59524c}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#c7a589}.wp-core-ui .wp-ui-text-highlight{color:#c7a589}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#9ea476}.wp-core-ui .wp-ui-text-notification{color:#9ea476}.wp-core-ui .wp-ui-text-icon{color:#f3f2f1}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#59524c}.view-switch a.current:before{color:#59524c}.view-switch a:hover:before{color:#9ea476}#adminmenu,#adminmenuback,#adminmenuwrap{background:#59524c}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f3f2f1}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#c7a589}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#46403c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-left-color:#46403c}#adminmenu .wp-submenu .wp-submenu-head{color:#cdcbc9}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#cdcbc9}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#c7a589}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#c7a589}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#c7a589}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#9ea476}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#46403c}#collapse-button{color:#f3f2f1}#collapse-button:focus,#collapse-button:hover{color:#c7a589}#wpadminbar{color:#fff;background:#59524c}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f3f2f1}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#c7a589;background:#46403c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#c7a589}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#46403c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#656463}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#cdcbc9}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f3f2f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#c7a589}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#c7a589}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f3f2f1}#wpadminbar #adminbarsearch:before{color:#f3f2f1}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#6c645c}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#9ea476}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#8e946a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#6c645c;background-color:#6c645c}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#c7a589}#wpadminbar #wp-admin-bar-user-info .username{color:#cdcbc9}.wp-pointer .wp-pointer-content h3{background-color:#c7a589;border-color:#bf9878}.wp-pointer .wp-pointer-content h3:before{color:#c7a589}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#c7a589}.media-item .bar,.media-progress-bar div{background-color:#c7a589}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #c7a589}.attachment.details .check{background-color:#c7a589;box-shadow:0 0 0 1px #fff,0 0 0 2px #c7a589}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #c7a589}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#c7a589}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#c7a589}.theme-filter.current,.theme-section.current{border-bottom-color:#59524c}body.more-filters-opened .more-filters{color:#fff;background-color:#59524c}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#c7a589;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#c7a589;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#f3f2f1}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#c7a589}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#46403c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f3f2f1}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#c7a589} \ No newline at end of file diff --git a/wp-admin/css/colors/coffee/colors.css b/wp-admin/css/colors/coffee/colors.css new file mode 100644 index 0000000..bb0a9e7 --- /dev/null +++ b/wp-admin/css/colors/coffee/colors.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%2359524c%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #59524c; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #c7a589; + box-shadow: 0 0 0 1px #c7a589; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #c7a589; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #c7a589; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #c7a589; + border-color: #c7a589; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #ccad93; + border-color: #c29d7f; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #c7a589; +} + +.wp-core-ui .button-primary:active { + background: #bf9878; + border-color: #bf9878; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #c7a589; + color: #fff; + border-color: #ae7d55; + box-shadow: inset 0 2px 5px -3px #37271a; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #d1ccc7 !important; + background: #ba906d !important; + border-color: #ba906d !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #c7a589; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #59524c; +} + +.wp-core-ui .wp-ui-text-primary { + color: #59524c; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #c7a589; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #c7a589; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #9ea476; +} + +.wp-core-ui .wp-ui-text-notification { + color: #9ea476; +} + +.wp-core-ui .wp-ui-text-icon { + color: #f3f2f1; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #59524c; +} + +.view-switch a.current:before { + color: #59524c; +} + +.view-switch a:hover:before { + color: #9ea476; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #59524c; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #f3f2f1; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #c7a589; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #46403c; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-right-color: #46403c; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #cdcbc9; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #cdcbc9; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #c7a589; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #c7a589; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-right-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #c7a589; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #9ea476; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #46403c; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #f3f2f1; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #c7a589; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #59524c; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #f3f2f1; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #c7a589; + background: #46403c; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #c7a589; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #46403c; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #656463; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #cdcbc9; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #f3f2f1; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #c7a589; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #c7a589; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #f3f2f1; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #f3f2f1; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #6c645c; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #9ea476; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #8e946a; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #6c645c; + background-color: #6c645c; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #c7a589; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #cdcbc9; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #c7a589; + border-color: #bf9878; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #c7a589; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #c7a589; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #c7a589; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #c7a589; +} + +.attachment.details .check { + background-color: #c7a589; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #c7a589; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #c7a589; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #c7a589; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #c7a589; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #59524c; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #59524c; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #c7a589; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #c7a589; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #f3f2f1; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #c7a589; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #46403c; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #f3f2f1; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #c7a589; +} diff --git a/wp-admin/css/colors/coffee/colors.min.css b/wp-admin/css/colors/coffee/colors.min.css new file mode 100644 index 0000000..18c3c21 --- /dev/null +++ b/wp-admin/css/colors/coffee/colors.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%2359524c%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#59524c}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#c7a589;box-shadow:0 0 0 1px #c7a589}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#c7a589;color:#262a2e;box-shadow:inset 0 2px 5px -3px #c7a589}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#c7a589;border-color:#c7a589;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#ccad93;border-color:#c29d7f;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #c7a589}.wp-core-ui .button-primary:active{background:#bf9878;border-color:#bf9878;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#c7a589;color:#fff;border-color:#ae7d55;box-shadow:inset 0 2px 5px -3px #37271a}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#d1ccc7!important;background:#ba906d!important;border-color:#ba906d!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#c7a589}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#59524c}.wp-core-ui .wp-ui-text-primary{color:#59524c}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#c7a589}.wp-core-ui .wp-ui-text-highlight{color:#c7a589}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#9ea476}.wp-core-ui .wp-ui-text-notification{color:#9ea476}.wp-core-ui .wp-ui-text-icon{color:#f3f2f1}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#59524c}.view-switch a.current:before{color:#59524c}.view-switch a:hover:before{color:#9ea476}#adminmenu,#adminmenuback,#adminmenuwrap{background:#59524c}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f3f2f1}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#c7a589}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#46403c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-right-color:#46403c}#adminmenu .wp-submenu .wp-submenu-head{color:#cdcbc9}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#cdcbc9}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#c7a589}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#c7a589}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#c7a589}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#9ea476}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#46403c}#collapse-button{color:#f3f2f1}#collapse-button:focus,#collapse-button:hover{color:#c7a589}#wpadminbar{color:#fff;background:#59524c}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f3f2f1}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#c7a589;background:#46403c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#c7a589}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#46403c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#656463}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#cdcbc9}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f3f2f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#c7a589}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#c7a589}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f3f2f1}#wpadminbar #adminbarsearch:before{color:#f3f2f1}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#6c645c}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#9ea476}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#8e946a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#6c645c;background-color:#6c645c}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#c7a589}#wpadminbar #wp-admin-bar-user-info .username{color:#cdcbc9}.wp-pointer .wp-pointer-content h3{background-color:#c7a589;border-color:#bf9878}.wp-pointer .wp-pointer-content h3:before{color:#c7a589}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#c7a589}.media-item .bar,.media-progress-bar div{background-color:#c7a589}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #c7a589}.attachment.details .check{background-color:#c7a589;box-shadow:0 0 0 1px #fff,0 0 0 2px #c7a589}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #c7a589}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#c7a589}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#c7a589}.theme-filter.current,.theme-section.current{border-bottom-color:#59524c}body.more-filters-opened .more-filters{color:#fff;background-color:#59524c}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#c7a589;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#c7a589;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#f3f2f1}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#c7a589}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#46403c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f3f2f1}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#c7a589} \ No newline at end of file diff --git a/wp-admin/css/colors/coffee/colors.scss b/wp-admin/css/colors/coffee/colors.scss new file mode 100644 index 0000000..49bee9b --- /dev/null +++ b/wp-admin/css/colors/coffee/colors.scss @@ -0,0 +1,7 @@ +$base-color: #59524c; +$highlight-color: #c7a589; +$notification-color: #9ea476; + +$form-checked: $base-color; + +@import "../_admin.scss"; diff --git a/wp-admin/css/colors/ectoplasm/colors-rtl.css b/wp-admin/css/colors/ectoplasm/colors-rtl.css new file mode 100644 index 0000000..a50b26f --- /dev/null +++ b/wp-admin/css/colors/ectoplasm/colors-rtl.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23523f6d%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #523f6d; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #a3b745; + box-shadow: 0 0 0 1px #a3b745; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #a3b745; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #a3b745; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #a3b745; + border-color: #a3b745; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #a9bd4f; + border-color: #99ac41; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #a3b745; +} + +.wp-core-ui .button-primary:active { + background: #93a43e; + border-color: #93a43e; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #a3b745; + color: #fff; + border-color: #727f30; + box-shadow: inset 0 2px 5px -3px black; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #cfd1c7 !important; + background: #89993a !important; + border-color: #89993a !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #a3b745; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #523f6d; +} + +.wp-core-ui .wp-ui-text-primary { + color: #523f6d; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #a3b745; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #a3b745; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #d46f15; +} + +.wp-core-ui .wp-ui-text-notification { + color: #d46f15; +} + +.wp-core-ui .wp-ui-text-icon { + color: #ece6f6; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #523f6d; +} + +.view-switch a.current:before { + color: #523f6d; +} + +.view-switch a:hover:before { + color: #d46f15; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #523f6d; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #ece6f6; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #a3b745; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #413256; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-left-color: #413256; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #cbc5d3; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #cbc5d3; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #a3b745; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #a3b745; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-left-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #a3b745; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #d46f15; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #413256; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #ece6f6; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #a3b745; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #523f6d; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #ece6f6; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #a3b745; + background: #413256; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #a3b745; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #413256; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #64537c; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #cbc5d3; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #ece6f6; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #a3b745; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #a3b745; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #ece6f6; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #ece6f6; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #634c84; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #d46f15; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #bf6413; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #634c84; + background-color: #634c84; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #a3b745; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #cbc5d3; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #a3b745; + border-color: #93a43e; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #a3b745; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #a3b745; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #a3b745; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #a3b745; +} + +.attachment.details .check { + background-color: #a3b745; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #a3b745; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #a3b745; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #a3b745; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #a3b745; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #523f6d; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #523f6d; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #a3b745; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #a3b745; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #ece6f6; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #a3b745; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #413256; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #ece6f6; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #a3b745; +} diff --git a/wp-admin/css/colors/ectoplasm/colors-rtl.min.css b/wp-admin/css/colors/ectoplasm/colors-rtl.min.css new file mode 100644 index 0000000..8aaa8fc --- /dev/null +++ b/wp-admin/css/colors/ectoplasm/colors-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23523f6d%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#523f6d}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#a3b745;box-shadow:0 0 0 1px #a3b745}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#a3b745;color:#262a2e;box-shadow:inset 0 2px 5px -3px #a3b745}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#a3b745;border-color:#a3b745;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#a9bd4f;border-color:#99ac41;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b745}.wp-core-ui .button-primary:active{background:#93a43e;border-color:#93a43e;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#a3b745;color:#fff;border-color:#727f30;box-shadow:inset 0 2px 5px -3px #000}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#89993a!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#a3b745}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#523f6d}.wp-core-ui .wp-ui-text-primary{color:#523f6d}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#a3b745}.wp-core-ui .wp-ui-text-highlight{color:#a3b745}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#d46f15}.wp-core-ui .wp-ui-text-notification{color:#d46f15}.wp-core-ui .wp-ui-text-icon{color:#ece6f6}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#523f6d}.view-switch a.current:before{color:#523f6d}.view-switch a:hover:before{color:#d46f15}#adminmenu,#adminmenuback,#adminmenuwrap{background:#523f6d}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#ece6f6}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#a3b745}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#413256}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-left-color:#413256}#adminmenu .wp-submenu .wp-submenu-head{color:#cbc5d3}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#cbc5d3}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#a3b745}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#a3b745}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#a3b745}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#d46f15}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#413256}#collapse-button{color:#ece6f6}#collapse-button:focus,#collapse-button:hover{color:#a3b745}#wpadminbar{color:#fff;background:#523f6d}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#ece6f6}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#a3b745;background:#413256}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#a3b745}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#413256}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#64537c}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#cbc5d3}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#ece6f6}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#a3b745}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#a3b745}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#ece6f6}#wpadminbar #adminbarsearch:before{color:#ece6f6}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#634c84}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d46f15}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#bf6413}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#634c84;background-color:#634c84}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#a3b745}#wpadminbar #wp-admin-bar-user-info .username{color:#cbc5d3}.wp-pointer .wp-pointer-content h3{background-color:#a3b745;border-color:#93a43e}.wp-pointer .wp-pointer-content h3:before{color:#a3b745}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#a3b745}.media-item .bar,.media-progress-bar div{background-color:#a3b745}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #a3b745}.attachment.details .check{background-color:#a3b745;box-shadow:0 0 0 1px #fff,0 0 0 2px #a3b745}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b745}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#a3b745}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#a3b745}.theme-filter.current,.theme-section.current{border-bottom-color:#523f6d}body.more-filters-opened .more-filters{color:#fff;background-color:#523f6d}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#a3b745;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#a3b745;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#ece6f6}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#a3b745}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#413256}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#ece6f6}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#a3b745} \ No newline at end of file diff --git a/wp-admin/css/colors/ectoplasm/colors.css b/wp-admin/css/colors/ectoplasm/colors.css new file mode 100644 index 0000000..f5a1149 --- /dev/null +++ b/wp-admin/css/colors/ectoplasm/colors.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23523f6d%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #523f6d; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #a3b745; + box-shadow: 0 0 0 1px #a3b745; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #a3b745; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #a3b745; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #a3b745; + border-color: #a3b745; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #a9bd4f; + border-color: #99ac41; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #a3b745; +} + +.wp-core-ui .button-primary:active { + background: #93a43e; + border-color: #93a43e; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #a3b745; + color: #fff; + border-color: #727f30; + box-shadow: inset 0 2px 5px -3px black; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #cfd1c7 !important; + background: #89993a !important; + border-color: #89993a !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #a3b745; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #523f6d; +} + +.wp-core-ui .wp-ui-text-primary { + color: #523f6d; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #a3b745; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #a3b745; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #d46f15; +} + +.wp-core-ui .wp-ui-text-notification { + color: #d46f15; +} + +.wp-core-ui .wp-ui-text-icon { + color: #ece6f6; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #523f6d; +} + +.view-switch a.current:before { + color: #523f6d; +} + +.view-switch a:hover:before { + color: #d46f15; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #523f6d; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #ece6f6; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #a3b745; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #413256; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-right-color: #413256; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #cbc5d3; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #cbc5d3; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #a3b745; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #a3b745; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-right-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #a3b745; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #d46f15; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #413256; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #ece6f6; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #a3b745; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #523f6d; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #ece6f6; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #a3b745; + background: #413256; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #a3b745; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #413256; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #64537c; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #cbc5d3; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #ece6f6; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #a3b745; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #a3b745; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #ece6f6; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #ece6f6; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #634c84; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #d46f15; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #bf6413; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #634c84; + background-color: #634c84; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #a3b745; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #cbc5d3; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #a3b745; + border-color: #93a43e; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #a3b745; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #a3b745; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #a3b745; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #a3b745; +} + +.attachment.details .check { + background-color: #a3b745; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #a3b745; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #a3b745; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #a3b745; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #a3b745; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #523f6d; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #523f6d; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #a3b745; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #a3b745; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #ece6f6; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #a3b745; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #413256; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #ece6f6; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #a3b745; +} diff --git a/wp-admin/css/colors/ectoplasm/colors.min.css b/wp-admin/css/colors/ectoplasm/colors.min.css new file mode 100644 index 0000000..9325999 --- /dev/null +++ b/wp-admin/css/colors/ectoplasm/colors.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23523f6d%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#523f6d}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#a3b745;box-shadow:0 0 0 1px #a3b745}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#a3b745;color:#262a2e;box-shadow:inset 0 2px 5px -3px #a3b745}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#a3b745;border-color:#a3b745;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#a9bd4f;border-color:#99ac41;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b745}.wp-core-ui .button-primary:active{background:#93a43e;border-color:#93a43e;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#a3b745;color:#fff;border-color:#727f30;box-shadow:inset 0 2px 5px -3px #000}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#89993a!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#a3b745}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#523f6d}.wp-core-ui .wp-ui-text-primary{color:#523f6d}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#a3b745}.wp-core-ui .wp-ui-text-highlight{color:#a3b745}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#d46f15}.wp-core-ui .wp-ui-text-notification{color:#d46f15}.wp-core-ui .wp-ui-text-icon{color:#ece6f6}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#523f6d}.view-switch a.current:before{color:#523f6d}.view-switch a:hover:before{color:#d46f15}#adminmenu,#adminmenuback,#adminmenuwrap{background:#523f6d}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#ece6f6}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#a3b745}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#413256}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-right-color:#413256}#adminmenu .wp-submenu .wp-submenu-head{color:#cbc5d3}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#cbc5d3}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#a3b745}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#a3b745}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#a3b745}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#d46f15}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#413256}#collapse-button{color:#ece6f6}#collapse-button:focus,#collapse-button:hover{color:#a3b745}#wpadminbar{color:#fff;background:#523f6d}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#ece6f6}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#a3b745;background:#413256}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#a3b745}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#413256}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#64537c}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#cbc5d3}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#ece6f6}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#a3b745}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#a3b745}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#ece6f6}#wpadminbar #adminbarsearch:before{color:#ece6f6}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#634c84}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d46f15}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#bf6413}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#634c84;background-color:#634c84}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#a3b745}#wpadminbar #wp-admin-bar-user-info .username{color:#cbc5d3}.wp-pointer .wp-pointer-content h3{background-color:#a3b745;border-color:#93a43e}.wp-pointer .wp-pointer-content h3:before{color:#a3b745}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#a3b745}.media-item .bar,.media-progress-bar div{background-color:#a3b745}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #a3b745}.attachment.details .check{background-color:#a3b745;box-shadow:0 0 0 1px #fff,0 0 0 2px #a3b745}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b745}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#a3b745}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#a3b745}.theme-filter.current,.theme-section.current{border-bottom-color:#523f6d}body.more-filters-opened .more-filters{color:#fff;background-color:#523f6d}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#a3b745;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#a3b745;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#ece6f6}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#a3b745}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#413256}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#ece6f6}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#a3b745} \ No newline at end of file diff --git a/wp-admin/css/colors/ectoplasm/colors.scss b/wp-admin/css/colors/ectoplasm/colors.scss new file mode 100644 index 0000000..8d14570 --- /dev/null +++ b/wp-admin/css/colors/ectoplasm/colors.scss @@ -0,0 +1,8 @@ +$base-color: #523f6d; +$icon-color: #ece6f6; +$highlight-color: #a3b745; +$notification-color: #d46f15; + +$form-checked: $base-color; + +@import "../_admin.scss"; diff --git a/wp-admin/css/colors/light/colors-rtl.css b/wp-admin/css/colors/light/colors-rtl.css new file mode 100644 index 0000000..d9ccaa5 --- /dev/null +++ b/wp-admin/css/colors/light/colors-rtl.css @@ -0,0 +1,599 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f5f5f5; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #7e8993; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #04a4cc; + box-shadow: 0 0 0 1px #04a4cc; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #04a4cc; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #04a4cc; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #04a4cc; + border-color: #04a4cc; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #04b0db; + border-color: #0498bd; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #04a4cc; +} + +.wp-core-ui .button-primary:active { + background: #0490b3; + border-color: #0490b3; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #04a4cc; + color: #fff; + border-color: #036881; + box-shadow: inset 0 2px 5px -3px black; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #c7cfd1 !important; + background: #0384a4 !important; + border-color: #0384a4 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #04a4cc; +} + +.wp-core-ui .wp-ui-primary { + color: #333; + background-color: #e5e5e5; +} + +.wp-core-ui .wp-ui-text-primary { + color: #e5e5e5; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #888; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #888; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #d64e07; +} + +.wp-core-ui .wp-ui-text-notification { + color: #d64e07; +} + +.wp-core-ui .wp-ui-text-icon { + color: #999; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #333; + background-color: #e5e5e5; +} + +.view-switch a.current:before { + color: #e5e5e5; +} + +.view-switch a:hover:before { + color: #d64e07; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #e5e5e5; +} + +#adminmenu a { + color: #333; +} + +#adminmenu div.wp-menu-image:before { + color: #999; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #888; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #ccc; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f5f5f5; + border-bottom-color: #f5f5f5; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #fff; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-left-color: #fff; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #686868; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #686868; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #04a4cc; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #333; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #04a4cc; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-left-color: #f5f5f5; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #888; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #ccc; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #d64e07; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #333; + background: #fff; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #777; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #04a4cc; +} + +/* Admin Bar */ +#wpadminbar { + color: #333; + background: #e5e5e5; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #333; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #999; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #04a4cc; + background: #fff; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #04a4cc; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #ccc; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #fff; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #f7f7f7; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #686868; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #999; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #04a4cc; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #04a4cc; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #999; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #999; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #333; + background: #f7f7f7; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #d64e07; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #c14606; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #f7f7f7; + background-color: #f7f7f7; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #333; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #04a4cc; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #686868; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #04a4cc; + border-color: #0490b3; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #04a4cc; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #04a4cc; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #04a4cc; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #04a4cc; +} + +.attachment.details .check { + background-color: #04a4cc; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #04a4cc; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #04a4cc; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #04a4cc; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #04a4cc; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #e5e5e5; +} + +body.more-filters-opened .more-filters { + color: #333; + background-color: #e5e5e5; +} + +body.more-filters-opened .more-filters:before { + color: #333; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #888; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #888; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #999; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #888; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #fff; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #999; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #04a4cc; +} + +/* temporary fix for admin-bar hover color */ +#wpadminbar .ab-top-menu > li:hover > .ab-item, +#wpadminbar .ab-top-menu > li.hover > .ab-item, +#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default li:hover span.ab-label, +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary li.hover span.ab-label, +#wpadminbar .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #333; +} + +/* Override the theme filter highlight color for this scheme */ +.theme-section.current, +.theme-filter.current { + border-bottom-color: #04a4cc; +} diff --git a/wp-admin/css/colors/light/colors-rtl.min.css b/wp-admin/css/colors/light/colors-rtl.min.css new file mode 100644 index 0000000..e6a6519 --- /dev/null +++ b/wp-admin/css/colors/light/colors-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f5f5f5}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#04a4cc;box-shadow:0 0 0 1px #04a4cc}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#04a4cc;color:#262a2e;box-shadow:inset 0 2px 5px -3px #04a4cc}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#04a4cc;border-color:#04a4cc;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#04b0db;border-color:#0498bd;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #04a4cc}.wp-core-ui .button-primary:active{background:#0490b3;border-color:#0490b3;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#04a4cc;color:#fff;border-color:#036881;box-shadow:inset 0 2px 5px -3px #000}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#0384a4!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#04a4cc}.wp-core-ui .wp-ui-primary{color:#333;background-color:#e5e5e5}.wp-core-ui .wp-ui-text-primary{color:#e5e5e5}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#888}.wp-core-ui .wp-ui-text-highlight{color:#888}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#d64e07}.wp-core-ui .wp-ui-text-notification{color:#d64e07}.wp-core-ui .wp-ui-text-icon{color:#999}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#333;background-color:#e5e5e5}.view-switch a.current:before{color:#e5e5e5}.view-switch a:hover:before{color:#d64e07}#adminmenu,#adminmenuback,#adminmenuwrap{background:#e5e5e5}#adminmenu a{color:#333}#adminmenu div.wp-menu-image:before{color:#999}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#888}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#ccc}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f5f5f5;border-bottom-color:#f5f5f5}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#fff}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-left-color:#fff}#adminmenu .wp-submenu .wp-submenu-head{color:#686868}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#686868}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#04a4cc}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#333}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#04a4cc}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f5f5f5}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#888}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#ccc}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#d64e07}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#333;background:#fff}#collapse-button{color:#777}#collapse-button:focus,#collapse-button:hover{color:#04a4cc}#wpadminbar{color:#333;background:#e5e5e5}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#333}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#999}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#04a4cc;background:#fff}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#04a4cc}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#ccc}#wpadminbar .menupop .ab-sub-wrapper{background:#fff}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#f7f7f7}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#686868}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#999}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#04a4cc}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#04a4cc}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#999}#wpadminbar #adminbarsearch:before{color:#999}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#333;background:#f7f7f7}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d64e07}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#c14606}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#f7f7f7;background-color:#f7f7f7}#wpadminbar #wp-admin-bar-user-info .display-name{color:#333}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#04a4cc}#wpadminbar #wp-admin-bar-user-info .username{color:#686868}.wp-pointer .wp-pointer-content h3{background-color:#04a4cc;border-color:#0490b3}.wp-pointer .wp-pointer-content h3:before{color:#04a4cc}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#04a4cc}.media-item .bar,.media-progress-bar div{background-color:#04a4cc}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #04a4cc}.attachment.details .check{background-color:#04a4cc;box-shadow:0 0 0 1px #fff,0 0 0 2px #04a4cc}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #04a4cc}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#04a4cc}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#04a4cc}.theme-filter.current,.theme-section.current{border-bottom-color:#e5e5e5}body.more-filters-opened .more-filters{color:#333;background-color:#e5e5e5}body.more-filters-opened .more-filters:before{color:#333}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#888;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#888;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#999}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#888}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#fff}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#999}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#04a4cc}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar .ab-top-menu>li:hover>.ab-item,#wpadminbar .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default li:hover span.ab-label,#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary li.hover span.ab-label{color:#333}.theme-filter.current,.theme-section.current{border-bottom-color:#04a4cc} \ No newline at end of file diff --git a/wp-admin/css/colors/light/colors.css b/wp-admin/css/colors/light/colors.css new file mode 100644 index 0000000..5585c71 --- /dev/null +++ b/wp-admin/css/colors/light/colors.css @@ -0,0 +1,599 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f5f5f5; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #7e8993; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #04a4cc; + box-shadow: 0 0 0 1px #04a4cc; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #04a4cc; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #04a4cc; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #04a4cc; + border-color: #04a4cc; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #04b0db; + border-color: #0498bd; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #04a4cc; +} + +.wp-core-ui .button-primary:active { + background: #0490b3; + border-color: #0490b3; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #04a4cc; + color: #fff; + border-color: #036881; + box-shadow: inset 0 2px 5px -3px black; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #c7cfd1 !important; + background: #0384a4 !important; + border-color: #0384a4 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #04a4cc; +} + +.wp-core-ui .wp-ui-primary { + color: #333; + background-color: #e5e5e5; +} + +.wp-core-ui .wp-ui-text-primary { + color: #e5e5e5; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #888; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #888; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #d64e07; +} + +.wp-core-ui .wp-ui-text-notification { + color: #d64e07; +} + +.wp-core-ui .wp-ui-text-icon { + color: #999; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #333; + background-color: #e5e5e5; +} + +.view-switch a.current:before { + color: #e5e5e5; +} + +.view-switch a:hover:before { + color: #d64e07; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #e5e5e5; +} + +#adminmenu a { + color: #333; +} + +#adminmenu div.wp-menu-image:before { + color: #999; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #888; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #ccc; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f5f5f5; + border-bottom-color: #f5f5f5; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #fff; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-right-color: #fff; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #686868; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #686868; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #04a4cc; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #333; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #04a4cc; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-right-color: #f5f5f5; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #888; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #ccc; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #d64e07; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #333; + background: #fff; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #777; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #04a4cc; +} + +/* Admin Bar */ +#wpadminbar { + color: #333; + background: #e5e5e5; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #333; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #999; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #04a4cc; + background: #fff; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #04a4cc; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #ccc; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #fff; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #f7f7f7; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #686868; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #999; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #04a4cc; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #04a4cc; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #999; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #999; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #333; + background: #f7f7f7; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #d64e07; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #c14606; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #f7f7f7; + background-color: #f7f7f7; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #333; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #04a4cc; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #686868; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #04a4cc; + border-color: #0490b3; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #04a4cc; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #04a4cc; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #04a4cc; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #04a4cc; +} + +.attachment.details .check { + background-color: #04a4cc; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #04a4cc; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #04a4cc; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #04a4cc; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #04a4cc; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #e5e5e5; +} + +body.more-filters-opened .more-filters { + color: #333; + background-color: #e5e5e5; +} + +body.more-filters-opened .more-filters:before { + color: #333; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #888; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #888; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #999; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #888; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #fff; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #999; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #04a4cc; +} + +/* temporary fix for admin-bar hover color */ +#wpadminbar .ab-top-menu > li:hover > .ab-item, +#wpadminbar .ab-top-menu > li.hover > .ab-item, +#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default li:hover span.ab-label, +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary li.hover span.ab-label, +#wpadminbar .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #333; +} + +/* Override the theme filter highlight color for this scheme */ +.theme-section.current, +.theme-filter.current { + border-bottom-color: #04a4cc; +} diff --git a/wp-admin/css/colors/light/colors.min.css b/wp-admin/css/colors/light/colors.min.css new file mode 100644 index 0000000..2f51ced --- /dev/null +++ b/wp-admin/css/colors/light/colors.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f5f5f5}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#04a4cc;box-shadow:0 0 0 1px #04a4cc}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#04a4cc;color:#262a2e;box-shadow:inset 0 2px 5px -3px #04a4cc}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#04a4cc;border-color:#04a4cc;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#04b0db;border-color:#0498bd;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #04a4cc}.wp-core-ui .button-primary:active{background:#0490b3;border-color:#0490b3;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#04a4cc;color:#fff;border-color:#036881;box-shadow:inset 0 2px 5px -3px #000}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#0384a4!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#04a4cc}.wp-core-ui .wp-ui-primary{color:#333;background-color:#e5e5e5}.wp-core-ui .wp-ui-text-primary{color:#e5e5e5}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#888}.wp-core-ui .wp-ui-text-highlight{color:#888}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#d64e07}.wp-core-ui .wp-ui-text-notification{color:#d64e07}.wp-core-ui .wp-ui-text-icon{color:#999}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#333;background-color:#e5e5e5}.view-switch a.current:before{color:#e5e5e5}.view-switch a:hover:before{color:#d64e07}#adminmenu,#adminmenuback,#adminmenuwrap{background:#e5e5e5}#adminmenu a{color:#333}#adminmenu div.wp-menu-image:before{color:#999}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#888}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#ccc}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f5f5f5;border-bottom-color:#f5f5f5}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#fff}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-right-color:#fff}#adminmenu .wp-submenu .wp-submenu-head{color:#686868}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#686868}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#04a4cc}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#333}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#04a4cc}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f5f5f5}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#888}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#ccc}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#d64e07}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#333;background:#fff}#collapse-button{color:#777}#collapse-button:focus,#collapse-button:hover{color:#04a4cc}#wpadminbar{color:#333;background:#e5e5e5}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#333}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#999}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#04a4cc;background:#fff}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#04a4cc}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#ccc}#wpadminbar .menupop .ab-sub-wrapper{background:#fff}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#f7f7f7}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#686868}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#999}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#04a4cc}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#04a4cc}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#999}#wpadminbar #adminbarsearch:before{color:#999}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#333;background:#f7f7f7}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d64e07}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#c14606}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#f7f7f7;background-color:#f7f7f7}#wpadminbar #wp-admin-bar-user-info .display-name{color:#333}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#04a4cc}#wpadminbar #wp-admin-bar-user-info .username{color:#686868}.wp-pointer .wp-pointer-content h3{background-color:#04a4cc;border-color:#0490b3}.wp-pointer .wp-pointer-content h3:before{color:#04a4cc}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#04a4cc}.media-item .bar,.media-progress-bar div{background-color:#04a4cc}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #04a4cc}.attachment.details .check{background-color:#04a4cc;box-shadow:0 0 0 1px #fff,0 0 0 2px #04a4cc}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #04a4cc}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#04a4cc}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#04a4cc}.theme-filter.current,.theme-section.current{border-bottom-color:#e5e5e5}body.more-filters-opened .more-filters{color:#333;background-color:#e5e5e5}body.more-filters-opened .more-filters:before{color:#333}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#888;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#888;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#999}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#888}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#fff}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#999}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#04a4cc}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar .ab-top-menu>li:hover>.ab-item,#wpadminbar .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default li:hover span.ab-label,#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary li.hover span.ab-label{color:#333}.theme-filter.current,.theme-section.current{border-bottom-color:#04a4cc} \ No newline at end of file diff --git a/wp-admin/css/colors/light/colors.scss b/wp-admin/css/colors/light/colors.scss new file mode 100644 index 0000000..ab4230b --- /dev/null +++ b/wp-admin/css/colors/light/colors.scss @@ -0,0 +1,38 @@ +$base-color: #e5e5e5; +$icon-color: #999; +$text-color: #333; +$highlight-color: #04a4cc; +$notification-color: #d64e07; + +$body-background: #f5f5f5; + +$menu-highlight-text: #fff; +$menu-highlight-icon: #ccc; +$menu-highlight-background: #888; + +$menu-bubble-text: #fff; +$menu-avatar-frame: #aaa; +$menu-submenu-background: #fff; + +$menu-collapse-text: #777; +$menu-collapse-focus-icon: #555; + +@import "../_admin.scss"; + +/* temporary fix for admin-bar hover color */ +#wpadminbar .ab-top-menu > li:hover > .ab-item, +#wpadminbar .ab-top-menu > li.hover > .ab-item, +#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default li:hover span.ab-label, +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary li.hover span.ab-label, +#wpadminbar .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: $text-color; +} + +/* Override the theme filter highlight color for this scheme */ +.theme-section.current, +.theme-filter.current { + border-bottom-color: $highlight-color; +} diff --git a/wp-admin/css/colors/midnight/colors-rtl.css b/wp-admin/css/colors/midnight/colors-rtl.css new file mode 100644 index 0000000..0e2ed20 --- /dev/null +++ b/wp-admin/css/colors/midnight/colors-rtl.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #7e8993; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #e14d43; + box-shadow: 0 0 0 1px #e14d43; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #e14d43; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #e14d43; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #e14d43; + border-color: #e14d43; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #e35950; + border-color: #df4136; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e14d43; +} + +.wp-core-ui .button-primary:active { + background: #dd382d; + border-color: #dd382d; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #e14d43; + color: #fff; + border-color: #ba281e; + box-shadow: inset 0 2px 5px -3px #200705; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #d1c8c7 !important; + background: #d92e23 !important; + border-color: #d92e23 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #e14d43; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #363b3f; +} + +.wp-core-ui .wp-ui-text-primary { + color: #363b3f; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #e14d43; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #e14d43; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #69a8bb; +} + +.wp-core-ui .wp-ui-text-notification { + color: #69a8bb; +} + +.wp-core-ui .wp-ui-text-icon { + color: #f1f2f3; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #363b3f; +} + +.view-switch a.current:before { + color: #363b3f; +} + +.view-switch a:hover:before { + color: #69a8bb; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #363b3f; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #f1f2f3; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #e14d43; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #26292c; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-left-color: #26292c; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #c3c4c5; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #c3c4c5; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #e14d43; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #e14d43; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-left-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #e14d43; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #69a8bb; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #26292c; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #f1f2f3; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #e14d43; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #363b3f; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #f1f2f3; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #e14d43; + background: #26292c; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #e14d43; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #26292c; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #4c4c4d; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #c3c4c5; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #f1f2f3; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #e14d43; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #e14d43; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #f1f2f3; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #f1f2f3; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #464d52; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #69a8bb; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #5f97a8; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #464d52; + background-color: #464d52; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #e14d43; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #c3c4c5; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #e14d43; + border-color: #dd382d; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #e14d43; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #e14d43; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #e14d43; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #e14d43; +} + +.attachment.details .check { + background-color: #e14d43; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #e14d43; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e14d43; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #e14d43; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #e14d43; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #363b3f; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #363b3f; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #e14d43; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #e14d43; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #f1f2f3; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #e14d43; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #26292c; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #f1f2f3; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #e14d43; +} diff --git a/wp-admin/css/colors/midnight/colors-rtl.min.css b/wp-admin/css/colors/midnight/colors-rtl.min.css new file mode 100644 index 0000000..c04454c --- /dev/null +++ b/wp-admin/css/colors/midnight/colors-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#e14d43;box-shadow:0 0 0 1px #e14d43}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#e14d43;color:#262a2e;box-shadow:inset 0 2px 5px -3px #e14d43}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#e14d43;border-color:#e14d43;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#e35950;border-color:#df4136;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}.wp-core-ui .button-primary:active{background:#dd382d;border-color:#dd382d;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#e14d43;color:#fff;border-color:#ba281e;box-shadow:inset 0 2px 5px -3px #200705}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#d1c8c7!important;background:#d92e23!important;border-color:#d92e23!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#e14d43}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#363b3f}.wp-core-ui .wp-ui-text-primary{color:#363b3f}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#e14d43}.wp-core-ui .wp-ui-text-highlight{color:#e14d43}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#69a8bb}.wp-core-ui .wp-ui-text-notification{color:#69a8bb}.wp-core-ui .wp-ui-text-icon{color:#f1f2f3}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#363b3f}.view-switch a.current:before{color:#363b3f}.view-switch a:hover:before{color:#69a8bb}#adminmenu,#adminmenuback,#adminmenuwrap{background:#363b3f}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f1f2f3}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#e14d43}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#26292c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-left-color:#26292c}#adminmenu .wp-submenu .wp-submenu-head{color:#c3c4c5}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#c3c4c5}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#e14d43}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#e14d43}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#e14d43}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#69a8bb}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#26292c}#collapse-button{color:#f1f2f3}#collapse-button:focus,#collapse-button:hover{color:#e14d43}#wpadminbar{color:#fff;background:#363b3f}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f1f2f3}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#e14d43;background:#26292c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#e14d43}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#26292c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#4c4c4d}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#c3c4c5}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f1f2f3}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#e14d43}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#e14d43}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f1f2f3}#wpadminbar #adminbarsearch:before{color:#f1f2f3}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#464d52}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#69a8bb}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#5f97a8}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#464d52;background-color:#464d52}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#e14d43}#wpadminbar #wp-admin-bar-user-info .username{color:#c3c4c5}.wp-pointer .wp-pointer-content h3{background-color:#e14d43;border-color:#dd382d}.wp-pointer .wp-pointer-content h3:before{color:#e14d43}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#e14d43}.media-item .bar,.media-progress-bar div{background-color:#e14d43}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #e14d43}.attachment.details .check{background-color:#e14d43;box-shadow:0 0 0 1px #fff,0 0 0 2px #e14d43}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#e14d43}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#e14d43}.theme-filter.current,.theme-section.current{border-bottom-color:#363b3f}body.more-filters-opened .more-filters{color:#fff;background-color:#363b3f}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#e14d43;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#e14d43;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#f1f2f3}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#e14d43}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#26292c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f1f2f3}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#e14d43} \ No newline at end of file diff --git a/wp-admin/css/colors/midnight/colors.css b/wp-admin/css/colors/midnight/colors.css new file mode 100644 index 0000000..3686fc8 --- /dev/null +++ b/wp-admin/css/colors/midnight/colors.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #7e8993; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #e14d43; + box-shadow: 0 0 0 1px #e14d43; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #e14d43; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #e14d43; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #e14d43; + border-color: #e14d43; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #e35950; + border-color: #df4136; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e14d43; +} + +.wp-core-ui .button-primary:active { + background: #dd382d; + border-color: #dd382d; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #e14d43; + color: #fff; + border-color: #ba281e; + box-shadow: inset 0 2px 5px -3px #200705; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #d1c8c7 !important; + background: #d92e23 !important; + border-color: #d92e23 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #e14d43; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #363b3f; +} + +.wp-core-ui .wp-ui-text-primary { + color: #363b3f; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #e14d43; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #e14d43; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #69a8bb; +} + +.wp-core-ui .wp-ui-text-notification { + color: #69a8bb; +} + +.wp-core-ui .wp-ui-text-icon { + color: #f1f2f3; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #363b3f; +} + +.view-switch a.current:before { + color: #363b3f; +} + +.view-switch a:hover:before { + color: #69a8bb; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #363b3f; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #f1f2f3; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #e14d43; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #26292c; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-right-color: #26292c; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #c3c4c5; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #c3c4c5; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #e14d43; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #e14d43; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-right-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #e14d43; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #69a8bb; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #26292c; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #f1f2f3; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #e14d43; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #363b3f; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #f1f2f3; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #e14d43; + background: #26292c; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #e14d43; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #26292c; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #4c4c4d; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #c3c4c5; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #f1f2f3; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #e14d43; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #e14d43; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #f1f2f3; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #f1f2f3; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #464d52; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #69a8bb; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #5f97a8; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #464d52; + background-color: #464d52; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #e14d43; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #c3c4c5; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #e14d43; + border-color: #dd382d; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #e14d43; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #e14d43; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #e14d43; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #e14d43; +} + +.attachment.details .check { + background-color: #e14d43; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #e14d43; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #e14d43; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #e14d43; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #e14d43; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #363b3f; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #363b3f; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #e14d43; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #e14d43; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #f1f2f3; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #e14d43; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #26292c; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #f1f2f3; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #e14d43; +} diff --git a/wp-admin/css/colors/midnight/colors.min.css b/wp-admin/css/colors/midnight/colors.min.css new file mode 100644 index 0000000..355f2d7 --- /dev/null +++ b/wp-admin/css/colors/midnight/colors.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#e14d43;box-shadow:0 0 0 1px #e14d43}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#e14d43;color:#262a2e;box-shadow:inset 0 2px 5px -3px #e14d43}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#e14d43;border-color:#e14d43;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#e35950;border-color:#df4136;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}.wp-core-ui .button-primary:active{background:#dd382d;border-color:#dd382d;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#e14d43;color:#fff;border-color:#ba281e;box-shadow:inset 0 2px 5px -3px #200705}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#d1c8c7!important;background:#d92e23!important;border-color:#d92e23!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#e14d43}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#363b3f}.wp-core-ui .wp-ui-text-primary{color:#363b3f}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#e14d43}.wp-core-ui .wp-ui-text-highlight{color:#e14d43}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#69a8bb}.wp-core-ui .wp-ui-text-notification{color:#69a8bb}.wp-core-ui .wp-ui-text-icon{color:#f1f2f3}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#363b3f}.view-switch a.current:before{color:#363b3f}.view-switch a:hover:before{color:#69a8bb}#adminmenu,#adminmenuback,#adminmenuwrap{background:#363b3f}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f1f2f3}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#e14d43}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#26292c}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-right-color:#26292c}#adminmenu .wp-submenu .wp-submenu-head{color:#c3c4c5}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#c3c4c5}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#e14d43}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#e14d43}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#e14d43}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#69a8bb}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#26292c}#collapse-button{color:#f1f2f3}#collapse-button:focus,#collapse-button:hover{color:#e14d43}#wpadminbar{color:#fff;background:#363b3f}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f1f2f3}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#e14d43;background:#26292c}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#e14d43}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#26292c}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#4c4c4d}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#c3c4c5}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f1f2f3}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#e14d43}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#e14d43}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f1f2f3}#wpadminbar #adminbarsearch:before{color:#f1f2f3}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#464d52}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#69a8bb}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#5f97a8}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#464d52;background-color:#464d52}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#e14d43}#wpadminbar #wp-admin-bar-user-info .username{color:#c3c4c5}.wp-pointer .wp-pointer-content h3{background-color:#e14d43;border-color:#dd382d}.wp-pointer .wp-pointer-content h3:before{color:#e14d43}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#e14d43}.media-item .bar,.media-progress-bar div{background-color:#e14d43}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #e14d43}.attachment.details .check{background-color:#e14d43;box-shadow:0 0 0 1px #fff,0 0 0 2px #e14d43}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#e14d43}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#e14d43}.theme-filter.current,.theme-section.current{border-bottom-color:#363b3f}body.more-filters-opened .more-filters{color:#fff;background-color:#363b3f}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#e14d43;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#e14d43;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#f1f2f3}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#e14d43}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#26292c}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f1f2f3}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#e14d43} \ No newline at end of file diff --git a/wp-admin/css/colors/midnight/colors.scss b/wp-admin/css/colors/midnight/colors.scss new file mode 100644 index 0000000..591232b --- /dev/null +++ b/wp-admin/css/colors/midnight/colors.scss @@ -0,0 +1,5 @@ +$base-color: #363b3f; +$highlight-color: #e14d43; +$notification-color: #69a8bb; + +@import "../_admin.scss"; diff --git a/wp-admin/css/colors/ocean/colors-rtl.css b/wp-admin/css/colors/ocean/colors-rtl.css new file mode 100644 index 0000000..50c52ac --- /dev/null +++ b/wp-admin/css/colors/ocean/colors-rtl.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23738e96%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #738e96; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #9ebaa0; + box-shadow: 0 0 0 1px #9ebaa0; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #9ebaa0; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #9ebaa0; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #9ebaa0; + border-color: #9ebaa0; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #a7c0a9; + border-color: #95b497; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #9ebaa0; +} + +.wp-core-ui .button-primary:active { + background: #8faf91; + border-color: #8faf91; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #9ebaa0; + color: #fff; + border-color: #719a74; + box-shadow: inset 0 2px 5px -3px #253426; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #c7d1c8 !important; + background: #86a989 !important; + border-color: #86a989 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #9ebaa0; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #738e96; +} + +.wp-core-ui .wp-ui-text-primary { + color: #738e96; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #9ebaa0; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #9ebaa0; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #aa9d88; +} + +.wp-core-ui .wp-ui-text-notification { + color: #aa9d88; +} + +.wp-core-ui .wp-ui-text-icon { + color: #f2fcff; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #738e96; +} + +.view-switch a.current:before { + color: #738e96; +} + +.view-switch a:hover:before { + color: #aa9d88; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #738e96; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #f2fcff; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #9ebaa0; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #627c83; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-left-color: #627c83; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #d5dde0; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #d5dde0; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #9ebaa0; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #9ebaa0; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-left-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #9ebaa0; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #aa9d88; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #627c83; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #f2fcff; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #9ebaa0; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #738e96; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #f2fcff; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #9ebaa0; + background: #627c83; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #9ebaa0; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #627c83; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #8f9a9e; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #d5dde0; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #f2fcff; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #9ebaa0; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #9ebaa0; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #f2fcff; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #f2fcff; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #879ea5; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #aa9d88; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #998d7a; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #879ea5; + background-color: #879ea5; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #9ebaa0; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #d5dde0; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #9ebaa0; + border-color: #8faf91; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #9ebaa0; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #9ebaa0; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #9ebaa0; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #9ebaa0; +} + +.attachment.details .check { + background-color: #9ebaa0; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #9ebaa0; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #9ebaa0; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #9ebaa0; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #9ebaa0; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #738e96; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #738e96; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #9ebaa0; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #9ebaa0; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #f2fcff; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #9ebaa0; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #627c83; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #f2fcff; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #9ebaa0; +} diff --git a/wp-admin/css/colors/ocean/colors-rtl.min.css b/wp-admin/css/colors/ocean/colors-rtl.min.css new file mode 100644 index 0000000..e0877d2 --- /dev/null +++ b/wp-admin/css/colors/ocean/colors-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23738e96%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#738e96}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#9ebaa0;box-shadow:0 0 0 1px #9ebaa0}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#9ebaa0;color:#262a2e;box-shadow:inset 0 2px 5px -3px #9ebaa0}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#9ebaa0;border-color:#9ebaa0;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#a7c0a9;border-color:#95b497;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #9ebaa0}.wp-core-ui .button-primary:active{background:#8faf91;border-color:#8faf91;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#9ebaa0;color:#fff;border-color:#719a74;box-shadow:inset 0 2px 5px -3px #253426}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#c7d1c8!important;background:#86a989!important;border-color:#86a989!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#9ebaa0}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#738e96}.wp-core-ui .wp-ui-text-primary{color:#738e96}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#9ebaa0}.wp-core-ui .wp-ui-text-highlight{color:#9ebaa0}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#aa9d88}.wp-core-ui .wp-ui-text-notification{color:#aa9d88}.wp-core-ui .wp-ui-text-icon{color:#f2fcff}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#738e96}.view-switch a.current:before{color:#738e96}.view-switch a:hover:before{color:#aa9d88}#adminmenu,#adminmenuback,#adminmenuwrap{background:#738e96}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f2fcff}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#9ebaa0}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#627c83}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-left-color:#627c83}#adminmenu .wp-submenu .wp-submenu-head{color:#d5dde0}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#d5dde0}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#9ebaa0}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#9ebaa0}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#9ebaa0}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#aa9d88}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#627c83}#collapse-button{color:#f2fcff}#collapse-button:focus,#collapse-button:hover{color:#9ebaa0}#wpadminbar{color:#fff;background:#738e96}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f2fcff}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#9ebaa0;background:#627c83}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#9ebaa0}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#627c83}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#8f9a9e}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#d5dde0}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f2fcff}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#9ebaa0}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#9ebaa0}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f2fcff}#wpadminbar #adminbarsearch:before{color:#f2fcff}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#879ea5}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#aa9d88}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#998d7a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#879ea5;background-color:#879ea5}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#9ebaa0}#wpadminbar #wp-admin-bar-user-info .username{color:#d5dde0}.wp-pointer .wp-pointer-content h3{background-color:#9ebaa0;border-color:#8faf91}.wp-pointer .wp-pointer-content h3:before{color:#9ebaa0}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#9ebaa0}.media-item .bar,.media-progress-bar div{background-color:#9ebaa0}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #9ebaa0}.attachment.details .check{background-color:#9ebaa0;box-shadow:0 0 0 1px #fff,0 0 0 2px #9ebaa0}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #9ebaa0}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#9ebaa0}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#9ebaa0}.theme-filter.current,.theme-section.current{border-bottom-color:#738e96}body.more-filters-opened .more-filters{color:#fff;background-color:#738e96}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#9ebaa0;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#9ebaa0;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#f2fcff}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#9ebaa0}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#627c83}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f2fcff}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#9ebaa0} \ No newline at end of file diff --git a/wp-admin/css/colors/ocean/colors.css b/wp-admin/css/colors/ocean/colors.css new file mode 100644 index 0000000..f77fe4c --- /dev/null +++ b/wp-admin/css/colors/ocean/colors.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23738e96%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #738e96; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #9ebaa0; + box-shadow: 0 0 0 1px #9ebaa0; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #9ebaa0; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #9ebaa0; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #9ebaa0; + border-color: #9ebaa0; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #a7c0a9; + border-color: #95b497; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #9ebaa0; +} + +.wp-core-ui .button-primary:active { + background: #8faf91; + border-color: #8faf91; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #9ebaa0; + color: #fff; + border-color: #719a74; + box-shadow: inset 0 2px 5px -3px #253426; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #c7d1c8 !important; + background: #86a989 !important; + border-color: #86a989 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #9ebaa0; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #738e96; +} + +.wp-core-ui .wp-ui-text-primary { + color: #738e96; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #9ebaa0; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #9ebaa0; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #aa9d88; +} + +.wp-core-ui .wp-ui-text-notification { + color: #aa9d88; +} + +.wp-core-ui .wp-ui-text-icon { + color: #f2fcff; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #738e96; +} + +.view-switch a.current:before { + color: #738e96; +} + +.view-switch a:hover:before { + color: #aa9d88; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #738e96; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #f2fcff; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #9ebaa0; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #627c83; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-right-color: #627c83; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #d5dde0; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #d5dde0; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #9ebaa0; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #9ebaa0; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-right-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #9ebaa0; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #aa9d88; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #627c83; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #f2fcff; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #9ebaa0; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #738e96; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #f2fcff; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #9ebaa0; + background: #627c83; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #9ebaa0; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #627c83; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #8f9a9e; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #d5dde0; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #f2fcff; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #9ebaa0; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #9ebaa0; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #f2fcff; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #f2fcff; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #879ea5; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #aa9d88; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #998d7a; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #879ea5; + background-color: #879ea5; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #9ebaa0; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #d5dde0; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #9ebaa0; + border-color: #8faf91; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #9ebaa0; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #9ebaa0; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #9ebaa0; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #9ebaa0; +} + +.attachment.details .check { + background-color: #9ebaa0; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #9ebaa0; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #9ebaa0; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #9ebaa0; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #9ebaa0; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #738e96; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #738e96; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #9ebaa0; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #9ebaa0; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #f2fcff; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #9ebaa0; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #627c83; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #f2fcff; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #9ebaa0; +} diff --git a/wp-admin/css/colors/ocean/colors.min.css b/wp-admin/css/colors/ocean/colors.min.css new file mode 100644 index 0000000..7fcd74f --- /dev/null +++ b/wp-admin/css/colors/ocean/colors.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%23738e96%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#738e96}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#9ebaa0;box-shadow:0 0 0 1px #9ebaa0}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#9ebaa0;color:#262a2e;box-shadow:inset 0 2px 5px -3px #9ebaa0}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#9ebaa0;border-color:#9ebaa0;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#a7c0a9;border-color:#95b497;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #9ebaa0}.wp-core-ui .button-primary:active{background:#8faf91;border-color:#8faf91;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#9ebaa0;color:#fff;border-color:#719a74;box-shadow:inset 0 2px 5px -3px #253426}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#c7d1c8!important;background:#86a989!important;border-color:#86a989!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#9ebaa0}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#738e96}.wp-core-ui .wp-ui-text-primary{color:#738e96}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#9ebaa0}.wp-core-ui .wp-ui-text-highlight{color:#9ebaa0}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#aa9d88}.wp-core-ui .wp-ui-text-notification{color:#aa9d88}.wp-core-ui .wp-ui-text-icon{color:#f2fcff}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#738e96}.view-switch a.current:before{color:#738e96}.view-switch a:hover:before{color:#aa9d88}#adminmenu,#adminmenuback,#adminmenuwrap{background:#738e96}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f2fcff}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#9ebaa0}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#627c83}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-right-color:#627c83}#adminmenu .wp-submenu .wp-submenu-head{color:#d5dde0}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#d5dde0}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#9ebaa0}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#9ebaa0}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#9ebaa0}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#aa9d88}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#627c83}#collapse-button{color:#f2fcff}#collapse-button:focus,#collapse-button:hover{color:#9ebaa0}#wpadminbar{color:#fff;background:#738e96}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f2fcff}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#9ebaa0;background:#627c83}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#9ebaa0}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#627c83}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#8f9a9e}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#d5dde0}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f2fcff}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#9ebaa0}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#9ebaa0}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f2fcff}#wpadminbar #adminbarsearch:before{color:#f2fcff}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#879ea5}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#aa9d88}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#998d7a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#879ea5;background-color:#879ea5}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#9ebaa0}#wpadminbar #wp-admin-bar-user-info .username{color:#d5dde0}.wp-pointer .wp-pointer-content h3{background-color:#9ebaa0;border-color:#8faf91}.wp-pointer .wp-pointer-content h3:before{color:#9ebaa0}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#9ebaa0}.media-item .bar,.media-progress-bar div{background-color:#9ebaa0}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #9ebaa0}.attachment.details .check{background-color:#9ebaa0;box-shadow:0 0 0 1px #fff,0 0 0 2px #9ebaa0}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #9ebaa0}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#9ebaa0}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#9ebaa0}.theme-filter.current,.theme-section.current{border-bottom-color:#738e96}body.more-filters-opened .more-filters{color:#fff;background-color:#738e96}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#9ebaa0;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#9ebaa0;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#f2fcff}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#9ebaa0}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#627c83}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f2fcff}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#9ebaa0} \ No newline at end of file diff --git a/wp-admin/css/colors/ocean/colors.scss b/wp-admin/css/colors/ocean/colors.scss new file mode 100644 index 0000000..d52339c --- /dev/null +++ b/wp-admin/css/colors/ocean/colors.scss @@ -0,0 +1,8 @@ +$base-color: #738e96; +$icon-color: #f2fcff; +$highlight-color: #9ebaa0; +$notification-color: #aa9d88; + +$form-checked: $base-color; + +@import "../_admin.scss"; diff --git a/wp-admin/css/colors/sunrise/colors-rtl.css b/wp-admin/css/colors/sunrise/colors-rtl.css new file mode 100644 index 0000000..30d1e8b --- /dev/null +++ b/wp-admin/css/colors/sunrise/colors-rtl.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #7e8993; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #dd823b; + box-shadow: 0 0 0 1px #dd823b; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #dd823b; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #dd823b; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #dd823b; + border-color: #dd823b; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #df8a48; + border-color: #db7a2e; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #dd823b; +} + +.wp-core-ui .button-primary:active { + background: #d97426; + border-color: #d97426; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #dd823b; + color: #fff; + border-color: #ad5d1e; + box-shadow: inset 0 2px 5px -3px #150b04; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #d1cbc7 !important; + background: #cc6d23 !important; + border-color: #cc6d23 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #dd823b; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #cf4944; +} + +.wp-core-ui .wp-ui-text-primary { + color: #cf4944; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #dd823b; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #dd823b; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #ccaf0b; +} + +.wp-core-ui .wp-ui-text-notification { + color: #ccaf0b; +} + +.wp-core-ui .wp-ui-text-icon { + color: #f3f1f1; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #cf4944; +} + +.view-switch a.current:before { + color: #cf4944; +} + +.view-switch a:hover:before { + color: #ccaf0b; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #cf4944; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #f3f1f1; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #dd823b; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #be3631; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-left-color: #be3631; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #f1c8c7; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #f1c8c7; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #f7e3d3; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #f7e3d3; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-left-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #dd823b; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #ccaf0b; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #be3631; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #f3f1f1; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #f7e3d3; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #cf4944; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #f3f1f1; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #f7e3d3; + background: #be3631; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #f7e3d3; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #be3631; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #cf6b67; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #f1c8c7; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #f3f1f1; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #f7e3d3; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #f7e3d3; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #f3f1f1; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #f3f1f1; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #d66560; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #ccaf0b; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #b89e0a; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #d66560; + background-color: #d66560; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #f7e3d3; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #f1c8c7; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #dd823b; + border-color: #d97426; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #dd823b; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #dd823b; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #dd823b; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #dd823b; +} + +.attachment.details .check { + background-color: #dd823b; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #dd823b; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #dd823b; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #dd823b; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #dd823b; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #cf4944; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #cf4944; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #dd823b; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #dd823b; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #f3f1f1; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #dd823b; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #be3631; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #f3f1f1; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #dd823b; +} diff --git a/wp-admin/css/colors/sunrise/colors-rtl.min.css b/wp-admin/css/colors/sunrise/colors-rtl.min.css new file mode 100644 index 0000000..c28bb77 --- /dev/null +++ b/wp-admin/css/colors/sunrise/colors-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#dd823b;box-shadow:0 0 0 1px #dd823b}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#dd823b;color:#262a2e;box-shadow:inset 0 2px 5px -3px #dd823b}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#dd823b;border-color:#dd823b;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#df8a48;border-color:#db7a2e;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #dd823b}.wp-core-ui .button-primary:active{background:#d97426;border-color:#d97426;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#dd823b;color:#fff;border-color:#ad5d1e;box-shadow:inset 0 2px 5px -3px #150b04}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#d1cbc7!important;background:#cc6d23!important;border-color:#cc6d23!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#dd823b}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#cf4944}.wp-core-ui .wp-ui-text-primary{color:#cf4944}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#dd823b}.wp-core-ui .wp-ui-text-highlight{color:#dd823b}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#ccaf0b}.wp-core-ui .wp-ui-text-notification{color:#ccaf0b}.wp-core-ui .wp-ui-text-icon{color:#f3f1f1}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#cf4944}.view-switch a.current:before{color:#cf4944}.view-switch a:hover:before{color:#ccaf0b}#adminmenu,#adminmenuback,#adminmenuwrap{background:#cf4944}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f3f1f1}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#dd823b}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#be3631}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-left-color:#be3631}#adminmenu .wp-submenu .wp-submenu-head{color:#f1c8c7}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#f1c8c7}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#f7e3d3}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#f7e3d3}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-left-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#dd823b}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#ccaf0b}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#be3631}#collapse-button{color:#f3f1f1}#collapse-button:focus,#collapse-button:hover{color:#f7e3d3}#wpadminbar{color:#fff;background:#cf4944}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f3f1f1}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#f7e3d3;background:#be3631}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#f7e3d3}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#be3631}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#cf6b67}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#f1c8c7}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f3f1f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#f7e3d3}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#f7e3d3}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f3f1f1}#wpadminbar #adminbarsearch:before{color:#f3f1f1}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#d66560}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#ccaf0b}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#b89e0a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#d66560;background-color:#d66560}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#f7e3d3}#wpadminbar #wp-admin-bar-user-info .username{color:#f1c8c7}.wp-pointer .wp-pointer-content h3{background-color:#dd823b;border-color:#d97426}.wp-pointer .wp-pointer-content h3:before{color:#dd823b}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#dd823b}.media-item .bar,.media-progress-bar div{background-color:#dd823b}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #dd823b}.attachment.details .check{background-color:#dd823b;box-shadow:0 0 0 1px #fff,0 0 0 2px #dd823b}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #dd823b}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#dd823b}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#dd823b}.theme-filter.current,.theme-section.current{border-bottom-color:#cf4944}body.more-filters-opened .more-filters{color:#fff;background-color:#cf4944}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#dd823b;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#dd823b;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#f3f1f1}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#dd823b}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#be3631}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f3f1f1}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#dd823b} \ No newline at end of file diff --git a/wp-admin/css/colors/sunrise/colors.css b/wp-admin/css/colors/sunrise/colors.css new file mode 100644 index 0000000..dbe99b7 --- /dev/null +++ b/wp-admin/css/colors/sunrise/colors.css @@ -0,0 +1,581 @@ +/*! This file is auto-generated */ +/* + * Button mixin- creates a button effect with correct + * highlights/shadows, based on a base color. + */ +body { + background: #f1f1f1; +} + +/* Links */ +a { + color: #0073aa; +} + +a:hover, a:active, a:focus { + color: #0096dd; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +span.wp-media-buttons-icon:before { + color: currentColor; +} + +/* Forms */ +input[type=checkbox]:checked::before { + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E"); +} + +input[type=radio]:checked::before { + background: #7e8993; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #0096dd; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]: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, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #dd823b; + box-shadow: 0 0 0 1px #dd823b; +} + +/* Core UI */ +.wp-core-ui .button { + border-color: #7e8993; + color: #32373c; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #717c87; + color: #262a2e; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus { + border-color: #7e8993; + color: #262a2e; + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button:active { + border-color: #7e8993; + color: #262a2e; + box-shadow: none; +} + +.wp-core-ui .button.active, +.wp-core-ui .button.active:focus, +.wp-core-ui .button.active:hover { + border-color: #dd823b; + color: #262a2e; + box-shadow: inset 0 2px 5px -3px #dd823b; +} + +.wp-core-ui .button.active:focus { + box-shadow: 0 0 0 1px #32373c; +} + +.wp-core-ui .button-primary { + background: #dd823b; + border-color: #dd823b; + color: #fff; +} + +.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus { + background: #df8a48; + border-color: #db7a2e; + color: #fff; +} + +.wp-core-ui .button-primary:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #dd823b; +} + +.wp-core-ui .button-primary:active { + background: #d97426; + border-color: #d97426; + color: #fff; +} + +.wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary.active:hover { + background: #dd823b; + color: #fff; + border-color: #ad5d1e; + box-shadow: inset 0 2px 5px -3px #150b04; +} + +.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled { + color: #d1cbc7 !important; + background: #cc6d23 !important; + border-color: #cc6d23 !important; + text-shadow: none !important; +} + +.wp-core-ui .button-group > .button.active { + border-color: #dd823b; +} + +.wp-core-ui .wp-ui-primary { + color: #fff; + background-color: #cf4944; +} + +.wp-core-ui .wp-ui-text-primary { + color: #cf4944; +} + +.wp-core-ui .wp-ui-highlight { + color: #fff; + background-color: #dd823b; +} + +.wp-core-ui .wp-ui-text-highlight { + color: #dd823b; +} + +.wp-core-ui .wp-ui-notification { + color: #fff; + background-color: #ccaf0b; +} + +.wp-core-ui .wp-ui-text-notification { + color: #ccaf0b; +} + +.wp-core-ui .wp-ui-text-icon { + color: #f3f1f1; +} + +/* List tables */ +.wrap .add-new-h2:hover, +.wrap .page-title-action:hover { + color: #fff; + background-color: #cf4944; +} + +.view-switch a.current:before { + color: #cf4944; +} + +.view-switch a:hover:before { + color: #ccaf0b; +} + +/* Admin Menu */ +#adminmenuback, +#adminmenuwrap, +#adminmenu { + background: #cf4944; +} + +#adminmenu a { + color: #fff; +} + +#adminmenu div.wp-menu-image:before { + color: #f3f1f1; +} + +#adminmenu a:hover, +#adminmenu li.menu-top:hover, +#adminmenu li.opensub > a.menu-top, +#adminmenu li > a.menu-top:focus { + color: #fff; + background-color: #dd823b; +} + +#adminmenu li.menu-top:hover div.wp-menu-image:before, +#adminmenu li.opensub > a.menu-top div.wp-menu-image:before { + color: #fff; +} + +/* Active tabs use a bottom border color that matches the page background color. */ +.about-wrap .nav-tab-active, +.nav-tab-active, +.nav-tab-active:hover { + background-color: #f1f1f1; + border-bottom-color: #f1f1f1; +} + +/* Admin Menu: submenu */ +#adminmenu .wp-submenu, +#adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu { + background: #be3631; +} + +#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after { + border-right-color: #be3631; +} + +#adminmenu .wp-submenu .wp-submenu-head { + color: #f1c8c7; +} + +#adminmenu .wp-submenu a, +#adminmenu .wp-has-current-submenu .wp-submenu a, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a { + color: #f1c8c7; +} + +#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu .wp-submenu a:hover, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus, +.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover { + color: #f7e3d3; +} + +/* Admin Menu: current */ +#adminmenu .wp-submenu li.current a, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { + color: #fff; +} + +#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover, +#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover, +#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus { + color: #f7e3d3; +} + +ul#adminmenu a.wp-has-current-submenu:after, +ul#adminmenu > li.current > a.current:after { + border-right-color: #f1f1f1; +} + +#adminmenu li.current a.menu-top, +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, +.folded #adminmenu li.current.menu-top { + color: #fff; + background: #dd823b; +} + +#adminmenu li.wp-has-current-submenu div.wp-menu-image:before, +#adminmenu a.current:hover div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before, +#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before, +#adminmenu li:hover div.wp-menu-image:before, +#adminmenu li a:focus div.wp-menu-image:before, +#adminmenu li.opensub div.wp-menu-image:before, +.ie8 #adminmenu li.opensub div.wp-menu-image:before { + color: #fff; +} + +/* Admin Menu: bubble */ +#adminmenu .awaiting-mod, +#adminmenu .update-plugins { + color: #fff; + background: #ccaf0b; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins, +#adminmenu li:hover a .awaiting-mod, +#adminmenu li.menu-top:hover > a .update-plugins { + color: #fff; + background: #be3631; +} + +/* Admin Menu: collapse button */ +#collapse-button { + color: #f3f1f1; +} + +#collapse-button:hover, +#collapse-button:focus { + color: #f7e3d3; +} + +/* Admin Bar */ +#wpadminbar { + color: #fff; + background: #cf4944; +} + +#wpadminbar .ab-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #fff; +} + +#wpadminbar .ab-icon, +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar .ab-item:after { + color: #f3f1f1; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, +#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { + color: #f7e3d3; + background: #be3631; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #f7e3d3; +} + +#wpadminbar:not(.mobile) li:hover .ab-icon:before, +#wpadminbar:not(.mobile) li:hover .ab-item:before, +#wpadminbar:not(.mobile) li:hover .ab-item:after, +#wpadminbar:not(.mobile) li:hover #adminbarsearch:before { + color: #fff; +} + +/* Admin Bar: submenu */ +#wpadminbar .menupop .ab-sub-wrapper { + background: #be3631; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #cf6b67; +} + +#wpadminbar .ab-submenu .ab-item, +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #f1c8c7; +} + +#wpadminbar .quicklinks li .blavatar, +#wpadminbar .menupop .menupop > .ab-item:before { + color: #f3f1f1; +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #f7e3d3; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar, +#wpadminbar .menupop .menupop > .ab-item:hover:before, +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #f7e3d3; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #f3f1f1; +} + +/* Admin Bar: search */ +#wpadminbar #adminbarsearch:before { + color: #f3f1f1; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + color: #fff; + background: #d66560; +} + +/* Admin Bar: recovery mode */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #ccaf0b; +} + +#wpadminbar #wp-admin-bar-recovery-mode .ab-item, +#wpadminbar #wp-admin-bar-recovery-mode a.ab-item { + color: #fff; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover > .ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #b89e0a; +} + +/* Admin Bar: my account */ +#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + border-color: #d66560; + background-color: #d66560; +} + +#wpadminbar #wp-admin-bar-user-info .display-name { + color: #fff; +} + +#wpadminbar #wp-admin-bar-user-info a:hover .display-name { + color: #f7e3d3; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #f1c8c7; +} + +/* Pointers */ +.wp-pointer .wp-pointer-content h3 { + background-color: #dd823b; + border-color: #d97426; +} + +.wp-pointer .wp-pointer-content h3:before { + color: #dd823b; +} + +.wp-pointer.wp-pointer-top .wp-pointer-arrow, +.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow, +.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { + border-bottom-color: #dd823b; +} + +/* Media */ +.media-item .bar, +.media-progress-bar div { + background-color: #dd823b; +} + +.details.attachment { + box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #dd823b; +} + +.attachment.details .check { + background-color: #dd823b; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px #dd823b; +} + +.media-selection .attachment.selection.details .thumbnail { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #dd823b; +} + +/* Themes */ +.theme-browser .theme.active .theme-name, +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + background: #dd823b; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + color: #dd823b; +} + +.theme-section.current, +.theme-filter.current { + border-bottom-color: #cf4944; +} + +body.more-filters-opened .more-filters { + color: #fff; + background-color: #cf4944; +} + +body.more-filters-opened .more-filters:before { + color: #fff; +} + +body.more-filters-opened .more-filters:hover, +body.more-filters-opened .more-filters:focus { + background-color: #dd823b; + color: #fff; +} + +body.more-filters-opened .more-filters:hover:before, +body.more-filters-opened .more-filters:focus:before { + color: #fff; +} + +/* Widgets */ +.widgets-chooser li.widgets-chooser-selected { + background-color: #dd823b; + color: #fff; +} + +.widgets-chooser li.widgets-chooser-selected:before, +.widgets-chooser li.widgets-chooser-selected:focus:before { + color: #fff; +} + +/* Responsive Component */ +div#wp-responsive-toggle a:before { + color: #f3f1f1; +} + +.wp-responsive-open div#wp-responsive-toggle a { + border-color: transparent; + background: #dd823b; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { + background: #be3631; +} + +.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { + color: #f3f1f1; +} + +/* TinyMCE */ +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item.mce-selected, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item-normal.mce-active, +.mce-container.mce-menu .mce-menu-item-preview.mce-active { + background: #dd823b; +} diff --git a/wp-admin/css/colors/sunrise/colors.min.css b/wp-admin/css/colors/sunrise/colors.min.css new file mode 100644 index 0000000..8120bcd --- /dev/null +++ b/wp-admin/css/colors/sunrise/colors.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{background:#f1f1f1}a{color:#0073aa}a:active,a:focus,a:hover{color:#0096dd}#post-body #visibility:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before,span.wp-media-buttons-icon:before{color:currentColor}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%237e8993%27%2F%3E%3C%2Fsvg%3E)}input[type=radio]:checked::before{background:#7e8993}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#0096dd}input[type=checkbox]:focus,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=radio]: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{border-color:#dd823b;box-shadow:0 0 0 1px #dd823b}.wp-core-ui .button{border-color:#7e8993;color:#32373c}.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{border-color:#717c87;color:#262a2e}.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#7e8993;color:#262a2e;box-shadow:0 0 0 1px #32373c}.wp-core-ui .button:active{border-color:#7e8993;color:#262a2e;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:focus,.wp-core-ui .button.active:hover{border-color:#dd823b;color:#262a2e;box-shadow:inset 0 2px 5px -3px #dd823b}.wp-core-ui .button.active:focus{box-shadow:0 0 0 1px #32373c}.wp-core-ui .button-primary{background:#dd823b;border-color:#dd823b;color:#fff}.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#df8a48;border-color:#db7a2e;color:#fff}.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #dd823b}.wp-core-ui .button-primary:active{background:#d97426;border-color:#d97426;color:#fff}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover{background:#dd823b;color:#fff;border-color:#ad5d1e;box-shadow:inset 0 2px 5px -3px #150b04}.wp-core-ui .button-primary.button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#d1cbc7!important;background:#cc6d23!important;border-color:#cc6d23!important;text-shadow:none!important}.wp-core-ui .button-group>.button.active{border-color:#dd823b}.wp-core-ui .wp-ui-primary{color:#fff;background-color:#cf4944}.wp-core-ui .wp-ui-text-primary{color:#cf4944}.wp-core-ui .wp-ui-highlight{color:#fff;background-color:#dd823b}.wp-core-ui .wp-ui-text-highlight{color:#dd823b}.wp-core-ui .wp-ui-notification{color:#fff;background-color:#ccaf0b}.wp-core-ui .wp-ui-text-notification{color:#ccaf0b}.wp-core-ui .wp-ui-text-icon{color:#f3f1f1}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{color:#fff;background-color:#cf4944}.view-switch a.current:before{color:#cf4944}.view-switch a:hover:before{color:#ccaf0b}#adminmenu,#adminmenuback,#adminmenuwrap{background:#cf4944}#adminmenu a{color:#fff}#adminmenu div.wp-menu-image:before{color:#f3f1f1}#adminmenu a:hover,#adminmenu li.menu-top:hover,#adminmenu li.opensub>a.menu-top,#adminmenu li>a.menu-top:focus{color:#fff;background-color:#dd823b}#adminmenu li.menu-top:hover div.wp-menu-image:before,#adminmenu li.opensub>a.menu-top div.wp-menu-image:before{color:#fff}.about-wrap .nav-tab-active,.nav-tab-active,.nav-tab-active:hover{background-color:#f1f1f1;border-bottom-color:#f1f1f1}#adminmenu .wp-has-current-submenu .wp-submenu,#adminmenu .wp-has-current-submenu.opensub .wp-submenu,#adminmenu .wp-submenu,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu,.folded #adminmenu .wp-has-current-submenu .wp-submenu{background:#be3631}#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after{border-right-color:#be3631}#adminmenu .wp-submenu .wp-submenu-head{color:#f1c8c7}#adminmenu .wp-has-current-submenu .wp-submenu a,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a,#adminmenu .wp-submenu a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a,.folded #adminmenu .wp-has-current-submenu .wp-submenu a{color:#f1c8c7}#adminmenu .wp-has-current-submenu .wp-submenu a:focus,#adminmenu .wp-has-current-submenu .wp-submenu a:hover,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover,#adminmenu .wp-submenu a:focus,#adminmenu .wp-submenu a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu a:hover,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover{color:#f7e3d3}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a,#adminmenu .wp-submenu li.current a,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a{color:#fff}#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus,#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,#adminmenu .wp-submenu li.current a:focus,#adminmenu .wp-submenu li.current a:hover,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:focus,#adminmenu a.wp-has-current-submenu:focus+.wp-submenu li.current a:hover{color:#f7e3d3}ul#adminmenu a.wp-has-current-submenu:after,ul#adminmenu>li.current>a.current:after{border-right-color:#f1f1f1}#adminmenu li.current a.menu-top,#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{color:#fff;background:#dd823b}#adminmenu a.current:hover div.wp-menu-image:before,#adminmenu li a:focus div.wp-menu-image:before,#adminmenu li.opensub div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,#adminmenu li:hover div.wp-menu-image:before,.ie8 #adminmenu li.opensub div.wp-menu-image:before{color:#fff}#adminmenu .awaiting-mod,#adminmenu .update-plugins{color:#fff;background:#ccaf0b}#adminmenu li a.wp-has-current-submenu .update-plugins,#adminmenu li.current a .awaiting-mod,#adminmenu li.menu-top:hover>a .update-plugins,#adminmenu li:hover a .awaiting-mod{color:#fff;background:#be3631}#collapse-button{color:#f3f1f1}#collapse-button:focus,#collapse-button:hover{color:#f7e3d3}#wpadminbar{color:#fff;background:#cf4944}#wpadminbar .ab-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#fff}#wpadminbar .ab-icon,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:after,#wpadminbar .ab-item:before{color:#f3f1f1}#wpadminbar .ab-top-menu>li.menupop.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar.nojs .ab-top-menu>li.menupop:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{color:#f7e3d3;background:#be3631}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li.hover span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label{color:#f7e3d3}#wpadminbar:not(.mobile) li:hover #adminbarsearch:before,#wpadminbar:not(.mobile) li:hover .ab-icon:before,#wpadminbar:not(.mobile) li:hover .ab-item:after,#wpadminbar:not(.mobile) li:hover .ab-item:before{color:#fff}#wpadminbar .menupop .ab-sub-wrapper{background:#be3631}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#cf6b67}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#f1c8c7}#wpadminbar .menupop .menupop>.ab-item:before,#wpadminbar .quicklinks li .blavatar{color:#f3f1f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#f7e3d3}#wpadminbar .menupop .menupop>.ab-item:hover:before,#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar,#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#f7e3d3}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#f3f1f1}#wpadminbar #adminbarsearch:before{color:#f3f1f1}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{color:#fff;background:#d66560}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#ccaf0b}#wpadminbar #wp-admin-bar-recovery-mode .ab-item,#wpadminbar #wp-admin-bar-recovery-mode a.ab-item{color:#fff}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#b89e0a}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{border-color:#d66560;background-color:#d66560}#wpadminbar #wp-admin-bar-user-info .display-name{color:#fff}#wpadminbar #wp-admin-bar-user-info a:hover .display-name{color:#f7e3d3}#wpadminbar #wp-admin-bar-user-info .username{color:#f1c8c7}.wp-pointer .wp-pointer-content h3{background-color:#dd823b;border-color:#d97426}.wp-pointer .wp-pointer-content h3:before{color:#dd823b}.wp-pointer.wp-pointer-top .wp-pointer-arrow,.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#dd823b}.media-item .bar,.media-progress-bar div{background-color:#dd823b}.details.attachment{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #dd823b}.attachment.details .check{background-color:#dd823b;box-shadow:0 0 0 1px #fff,0 0 0 2px #dd823b}.media-selection .attachment.selection.details .thumbnail{box-shadow:0 0 0 1px #fff,0 0 0 3px #dd823b}.theme-browser .theme.active .theme-name,.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{background:#dd823b}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{color:#dd823b}.theme-filter.current,.theme-section.current{border-bottom-color:#cf4944}body.more-filters-opened .more-filters{color:#fff;background-color:#cf4944}body.more-filters-opened .more-filters:before{color:#fff}body.more-filters-opened .more-filters:focus,body.more-filters-opened .more-filters:hover{background-color:#dd823b;color:#fff}body.more-filters-opened .more-filters:focus:before,body.more-filters-opened .more-filters:hover:before{color:#fff}.widgets-chooser li.widgets-chooser-selected{background-color:#dd823b;color:#fff}.widgets-chooser li.widgets-chooser-selected:before,.widgets-chooser li.widgets-chooser-selected:focus:before{color:#fff}div#wp-responsive-toggle a:before{color:#f3f1f1}.wp-responsive-open div#wp-responsive-toggle a{border-color:transparent;background:#dd823b}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a{background:#be3631}.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before{color:#f3f1f1}.mce-container.mce-menu .mce-menu-item-normal.mce-active,.mce-container.mce-menu .mce-menu-item-preview.mce-active,.mce-container.mce-menu .mce-menu-item.mce-selected,.mce-container.mce-menu .mce-menu-item:focus,.mce-container.mce-menu .mce-menu-item:hover{background:#dd823b} \ No newline at end of file diff --git a/wp-admin/css/colors/sunrise/colors.scss b/wp-admin/css/colors/sunrise/colors.scss new file mode 100644 index 0000000..5dd8d82 --- /dev/null +++ b/wp-admin/css/colors/sunrise/colors.scss @@ -0,0 +1,6 @@ +$base-color: #cf4944; +$highlight-color: #dd823b; +$notification-color: #ccaf0b; +$menu-submenu-focus-text: lighten( $highlight-color, 35% ); + +@import "../_admin.scss"; diff --git a/wp-admin/css/common-rtl.css b/wp-admin/css/common-rtl.css new file mode 100644 index 0000000..4371863 --- /dev/null +++ b/wp-admin/css/common-rtl.css @@ -0,0 +1,4066 @@ +/*! This file is auto-generated */ +/* 2 column liquid layout */ +#wpwrap { + height: auto; + min-height: 100%; + width: 100%; + position: relative; + -webkit-font-smoothing: subpixel-antialiased; +} + +#wpcontent { + height: 100%; + padding-right: 20px; +} + +#wpcontent, +#wpfooter { + margin-right: 160px; +} + +.folded #wpcontent, +.folded #wpfooter { + margin-right: 36px; +} + +#wpbody-content { + padding-bottom: 65px; + float: right; + width: 100%; + overflow: visible !important; +} + +/* inner 2 column liquid layout */ + +.inner-sidebar { + float: left; + clear: left; + display: none; + width: 281px; + position: relative; +} + +.columns-2 .inner-sidebar { + margin-left: auto; + width: 286px; + display: block; +} + +.inner-sidebar #side-sortables, +.columns-2 .inner-sidebar #side-sortables { + min-height: 300px; + width: 280px; + padding: 0; +} + +.has-right-sidebar .inner-sidebar { + display: block; +} + +.has-right-sidebar #post-body { + float: right; + clear: right; + width: 100%; + margin-left: -2000px; +} + +.has-right-sidebar #post-body-content { + margin-left: 300px; + float: none; + width: auto; +} + +/* 2 columns main area */ + +#col-left { + float: right; + width: 35%; +} + +#col-right { + float: left; + width: 65%; +} + +#col-left .col-wrap { + padding: 0 0 0 6px; +} + +#col-right .col-wrap { + padding: 0 6px 0 0; +} + +/* utility classes */ +.alignleft { + float: right; +} + +.alignright { + float: left; +} + +.textleft { + text-align: right; +} + +.textright { + text-align: left; +} + +.clear { + clear: both; +} + +/* modern clearfix */ +.wp-clearfix:after { + content: ""; + display: table; + clear: both; +} + +/* Hide visually but not from screen readers */ +.screen-reader-text, +.screen-reader-text span, +.ui-helper-hidden-accessible { + 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; + width: 1px; + word-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */ +} + +.button .screen-reader-text { + height: auto; /* Fixes a Safari+VoiceOver bug, see ticket #42006 */ +} + +.screen-reader-shortcut { + position: absolute; + top: -1000em; +} + +.screen-reader-shortcut:focus { + right: 6px; + top: -25px; + height: auto; + width: auto; + display: block; + font-size: 14px; + font-weight: 600; + padding: 15px 23px 14px; + background: #f1f1f1; + color: #0073aa; + z-index: 100000; + line-height: normal; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + text-decoration: none; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +.hidden, +.js .closed .inside, +.js .hide-if-js, +.no-js .hide-if-no-js, +.js.wp-core-ui .hide-if-js, +.js .wp-core-ui .hide-if-js, +.no-js.wp-core-ui .hide-if-no-js, +.no-js .wp-core-ui .hide-if-no-js { + display: none; +} + +/* @todo: Take a second look. Large chunks of shared color, from the colors.css merge */ +.widget-top, +.menu-item-handle, +.widget-inside, +#menu-settings-column .accordion-container, +#menu-management .menu-edit, +.manage-menus, +table.widefat, +.stuffbox, +p.popular-tags, +.widgets-holder-wrap, +.wp-editor-container, +.popular-tags, +.feature-filter, +.imgedit-group, +.comment-ays { + border: 1px solid #ccd0d4; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); +} + +table.widefat, +.wp-editor-container, +.stuffbox, +p.popular-tags, +.widgets-holder-wrap, +.popular-tags, +.feature-filter, +.imgedit-group, +.comment-ays { + background: #fff; +} + +/* general */ +html, +body { + height: 100%; + margin: 0; + padding: 0; +} + +body { + background: #f1f1f1; + color: #444; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + line-height: 1.4em; + min-width: 600px; +} + +body.iframe { + min-width: 0; + padding-top: 1px; +} + +body.modal-open { + overflow: hidden; +} + +body.mobile.modal-open #wpwrap { + overflow: hidden; + position: fixed; + height: 100%; +} + +iframe, +img { + border: 0; +} + +td { + font-family: inherit; + font-size: inherit; + font-weight: inherit; + line-height: inherit; +} + +/* Any change to the default link style must be applied to button-link too. */ +a { + color: #0073aa; + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; +} + +a, +div { + outline: 0; +} + +a:hover, +a:active { + color: #00a0d2; +} + +a:focus, +a:focus .media-icon img, +.wp-person a:focus .gravatar { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.ie8 a:focus { + outline: #5b9dd9 solid 1px; +} + +#adminmenu a:focus { + box-shadow: none; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; + outline-offset: -1px; +} + +.screen-reader-text:focus { + box-shadow: none; + outline: none; +} + +blockquote, +q { + quotes: none; +} + +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; + content: none; +} + +p { + font-size: 13px; + line-height: 1.5; + margin: 1em 0; +} + +blockquote { + margin: 1em; +} + +li, +dd { + margin-bottom: 6px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + display: block; + font-weight: 600; +} + +h1 { + color: #23282d; + font-size: 2em; + margin: .67em 0; +} + +h2, +h3 { + color: #23282d; + font-size: 1.3em; + margin: 1em 0; +} + +.update-core-php h2 { + margin-top: 2em; +} + +.update-php h2, +.update-messages h2, +h4 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +ul, +ol { + padding: 0; +} + +ul { + list-style: none; +} + +ol { + list-style-type: decimal; + margin-right: 2em; +} + +ul.ul-disc { + list-style: disc outside; +} + +ul.ul-square { + list-style: square outside; +} + +ol.ol-decimal { + list-style: decimal outside; +} + +ul.ul-disc, +ul.ul-square, +ol.ol-decimal { + margin-right: 1.8em; +} + +ul.ul-disc > li, +ul.ul-square > li, +ol.ol-decimal > li { + margin: 0 0 0.5em; +} + +/* rtl:ignore */ +.ltr { + direction: ltr; +} + +/* rtl:ignore */ +.code, +code { + font-family: Consolas, Monaco, monospace; + direction: ltr; + unicode-bidi: embed; +} + +kbd, +code { + padding: 3px 5px 2px 5px; + margin: 0 1px; + background: #eaeaea; + background: rgba(0, 0, 0, 0.07); + font-size: 13px; +} + +.subsubsub { + list-style: none; + margin: 8px 0 0; + padding: 0; + font-size: 13px; + float: right; + color: #666; +} + +.subsubsub a { + line-height: 2; + padding: .2em; + text-decoration: none; +} + +.subsubsub a .count, +.subsubsub a.current .count { + color: #555d66; /* #f1f1f1 background */ + font-weight: 400; +} + +.subsubsub a.current { + font-weight: 600; + border: none; +} + +.subsubsub li { + display: inline-block; + margin: 0; + padding: 0; + white-space: nowrap; +} + +.wp-die-message { + font-size: 13px; + line-height: 1.5; + margin: 1em 0; +} + +/* .widefat - main style for tables */ +.widefat { + border-spacing: 0; + width: 100%; + clear: both; + margin: 0; +} + +.widefat * { + word-wrap: break-word; +} + +.widefat a, +.widefat button.button-link { + text-decoration: none; +} + +.widefat td, +.widefat th { + padding: 8px 10px; +} + +.widefat thead th, +.widefat thead td { + border-bottom: 1px solid #ccd0d4; +} + +.widefat tfoot th, +.widefat tfoot td { + border-top: 1px solid #ccd0d4; + border-bottom: none; +} + +.widefat .no-items td { + border-bottom-width: 0; +} + +.widefat td { + vertical-align: top; +} + +.widefat td, +.widefat td p, +.widefat td ol, +.widefat td ul { + font-size: 13px; + line-height: 1.5em; +} + +.widefat th, +.widefat thead td, +.widefat tfoot td { + text-align: right; + line-height: 1.3em; + font-size: 14px; +} + +.widefat th input, +.updates-table td input, +.widefat thead td input, +.widefat tfoot td input { + margin: 0 8px 0 0; + padding: 0; + vertical-align: text-top; +} + +.widefat .check-column { + width: 2.2em; + padding: 6px 0 25px; + vertical-align: top; +} + +.widefat tbody th.check-column { + padding: 9px 0 22px; +} + +.widefat thead td.check-column, +.widefat tbody th.check-column, +.updates-table tbody td.check-column, +.widefat tfoot td.check-column { + padding: 11px 3px 0 0; +} + +.widefat thead td.check-column, +.widefat tfoot td.check-column { + padding-top: 4px; + vertical-align: middle; +} + +.update-php div.updated, +.update-php div.error { + margin-right: 0; +} + +.no-js .widefat thead .check-column input, +.no-js .widefat tfoot .check-column input { + display: none; +} + +.widefat .num, +.column-comments, +.column-links, +.column-posts { + text-align: center; +} + +.widefat th#comments { + vertical-align: middle; +} + +.wrap { + margin: 10px 2px 0 20px; +} + +.wrap.block-editor-no-js { + padding-right: 20px; +} + +.wrap > h2:first-child, /* Back-compat for pre-4.4 */ +.wrap [class$="icon32"] + h2, /* Back-compat for pre-4.4 */ +.postbox .inside h2, /* Back-compat for pre-4.4 */ +.wrap h1 { + font-size: 23px; + font-weight: 400; + margin: 0; + padding: 9px 0 4px 0; + line-height: 1.3; +} + +.wrap h1.wp-heading-inline { + display: inline-block; + margin-left: 5px; +} + +.wp-header-end { + visibility: hidden; + margin: -2px 0 0; +} + +.subtitle { + margin: 0; + padding-right: 25px; + color: #555d66; + font-size: 14px; + font-weight: 400; + line-height: 1; +} + +.wrap .add-new-h2, /* deprecated */ +.wrap .add-new-h2:active, /* deprecated */ +.wrap .page-title-action, +.wrap .page-title-action:active { + margin-right: 4px; + padding: 4px 8px; + position: relative; + top: -3px; + text-decoration: none; + border: 1px solid #0071a1; + border-radius: 2px; + text-shadow: none; + font-weight: 600; + font-size: 13px; + line-height: normal; /* IE8-IE11 need this for buttons */ + color: #0071a1; /* use the standard color used for buttons */ + background: #f3f5f6; + cursor: pointer; +} + +.wrap .wp-heading-inline + .page-title-action { + margin-right: 0; +} + +.wrap .add-new-h2:hover, /* deprecated */ +.wrap .page-title-action:hover { + background: #f1f1f1; + border-color: #016087; + color: #016087; +} + +/* lower specificity: color needs to be overridden by :hover and :active */ +.page-title-action:focus { + color: #016087; +} + +/* Dashicon for language options on General Settings and Profile screens */ +.form-table th label[for="locale"] .dashicons, +.form-table th label[for="WPLANG"] .dashicons { + margin-right: 5px; +} + +.wrap .page-title-action:focus { + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.wrap h1.long-header { + padding-left: 0; +} + +.wp-dialog { + background-color: #fff; +} + +.widgets-chooser ul, +#widgets-left .widget-in-question .widget-top, +#available-widgets .widget-top:hover, +div#widgets-right .widget-top:hover, +#widgets-left .widget-top:hover { + border-color: #999; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.sorthelper { + background-color: #ccf3fa; +} + +.ac_match, +.subsubsub a.current { + color: #000; +} + +.striped > tbody > :nth-child(odd), +ul.striped > :nth-child(odd), +.alternate { + background-color: #f9f9f9; +} + +.bar { + background-color: #e8e8e8; + border-left-color: #99d; +} + +/* Helper classes for plugins to leverage the active WordPress color scheme */ + +.highlight { + background-color: #e4f2fd; + color: #000; +} + +.wp-ui-primary { + color: #fff; + background-color: #32373c; +} +.wp-ui-text-primary { + color: #32373c; +} + +.wp-ui-highlight { + color: #fff; + background-color: #1e8cbe; +} +.wp-ui-text-highlight { + color: #1e8cbe; +} + +.wp-ui-notification { + color: #fff; + background-color: #d54e21; +} +.wp-ui-text-notification { + color: #d54e21; +} + +.wp-ui-text-icon { + color: #82878c; /* same as new icons */ +} + +/* For emoji replacement images */ +img.emoji { + display: inline !important; + border: none !important; + height: 1em !important; + width: 1em !important; + margin: 0 .07em !important; + vertical-align: -0.1em !important; + background: none !important; + padding: 0 !important; + box-shadow: none !important; +} + +/*------------------------------------------------------------------------------ + 1.0 - Text Styles +------------------------------------------------------------------------------*/ + +.widget .widget-top, +.postbox .hndle, +.stuffbox .hndle, +.control-section .accordion-section-title, +.sidebar-name, +#nav-menu-header, +#nav-menu-footer, +.menu-item-handle, +.checkbox, +.side-info, +#your-profile #rich_editing, +.widefat thead th, +.widefat thead td, +.widefat tfoot th, +.widefat tfoot td { + line-height: 1.4em; +} + +.widget .widget-top, +.menu-item-handle { + background: #fafafa; + color: #23282d; +} + +.postbox .hndle, +.stuffbox .hndle { + border-bottom: 1px solid #ccd0d4; +} + +.quicktags { + background-color: #ccc; + color: #000; + font-size: 12px; +} + +.icon32 { + display: none; +} + +/* @todo can we combine these into a class or use an existing dashicon one? */ +.welcome-panel .welcome-panel-close:before, +.tagchecklist .ntdelbutton .remove-tag-icon:before, +#bulk-titles div a:before, +.notice-dismiss:before { + background: none; + color: #72777c; + content: "\f153"; + display: block; + font: normal 16px/20px dashicons; + speak: none; + height: 20px; + text-align: center; + width: 20px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.welcome-panel .welcome-panel-close:before { + margin: 0; +} + +#bulk-titles div a:before { + margin: 1px 0; +} + +.tagchecklist .ntdelbutton .remove-tag-icon:before { + margin-right: 2px; + border-radius: 50%; + color: #0073aa; + /* vertically center the icon cross browsers */ + line-height: 1.28; +} + +.tagchecklist .ntdelbutton:focus { + outline: 0; +} + +.welcome-panel .welcome-panel-close:hover:before, +.welcome-panel .welcome-panel-close:focus:before, +.tagchecklist .ntdelbutton:hover .remove-tag-icon:before, +.tagchecklist .ntdelbutton:focus .remove-tag-icon:before, +#bulk-titles div a:hover:before, +#bulk-titles div a:focus:before { + color: #c00; +} + +.tagchecklist .ntdelbutton:focus .remove-tag-icon:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.key-labels label { + line-height: 24px; +} + +strong, b { + font-weight: 600; +} + +.pre { + /* https://developer.mozilla.org/en-US/docs/CSS/white-space */ + white-space: pre-wrap; /* css-3 */ + word-wrap: break-word; /* IE 5.5 - 7 */ +} + +.howto { + color: #666; + font-style: italic; + display: block; +} + +p.install-help { + margin: 8px 0; + font-style: italic; +} + +.no-break { + white-space: nowrap; +} + +hr { + border: 0; + border-top: 1px solid #ddd; + border-bottom: 1px solid #fafafa; +} + +.row-actions span.delete a, +.row-actions span.trash a, +.row-actions span.spam a, +.plugins a.delete, +#all-plugins-table .plugins a.delete, +#search-plugins-table .plugins a.delete, +.submitbox .submitdelete, +#media-items a.delete, +#media-items a.delete-permanently, +#nav-menu-footer .menu-delete, +#delete-link a.delete { + color: #a00; +} + +abbr.required, +span.required, +.file-error, +.row-actions .delete a:hover, +.row-actions .trash a:hover, +.row-actions .spam a:hover, +.plugins a.delete:hover, +#all-plugins-table .plugins a.delete:hover, +#search-plugins-table .plugins a.delete:hover, +.submitbox .submitdelete:hover, +#media-items a.delete:hover, +#media-items a.delete-permanently:hover, +#nav-menu-footer .menu-delete:hover, +#delete-link a.delete:hover { + color: #dc3232; + border: none; +} + +/*------------------------------------------------------------------------------ + 3.0 - Actions +------------------------------------------------------------------------------*/ + +#major-publishing-actions { + padding: 10px; + clear: both; + border-top: 1px solid #ddd; + background: #f5f5f5; +} + +#delete-action { + float: right; + line-height: 2.30769231; /* 30px */ +} + +#delete-link { + line-height: 2.30769231; /* 30px */ + vertical-align: middle; + text-align: right; + margin-right: 8px; +} + +#delete-link a { + text-decoration: none; +} + +#publishing-action { + text-align: left; + float: left; + line-height: 1.9; +} + +#publishing-action .spinner { + float: none; + margin-top: 5px; +} + +#misc-publishing-actions { + padding: 6px 0 0; +} + +.misc-pub-section { + padding: 6px 10px 8px; +} + +.misc-pub-filename { + word-wrap: break-word; +} + +#minor-publishing-actions { + padding: 10px 10px 0 10px; + text-align: left; +} + +#save-post { + float: right; +} + +.preview { + float: left; +} + +#sticky-span { + margin-right: 18px; +} + +.approve, +.unapproved .unapprove { + display: none; +} + +.unapproved .approve, +.spam .approve, +.trash .approve { + display: inline; +} + +td.action-links, +th.action-links { + text-align: left; +} + +#misc-publishing-actions .notice { + margin-right: 10px; + margin-left: 10px; +} + +/* Filter bar */ +.wp-filter { + display: inline-block; + position: relative; + box-sizing: border-box; + margin: 12px 0 25px; + padding: 0 10px; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + border: 1px solid #ccd0d4; + background: #fff; + color: #555; + font-size: 13px; +} + +.wp-filter a { + text-decoration: none; +} + +.filter-count { + display: inline-block; + vertical-align: middle; + min-width: 4em; +} + +.title-count, +.filter-count .count { + display: inline-block; + position: relative; + top: -1px; + padding: 4px 10px; + border-radius: 30px; + background: #72777c; + color: #fff; + font-size: 14px; + font-weight: 600; +} + +/* not a part of filter bar, but derived from it, so here for now */ +.title-count { + display: inline; + top: -3px; + margin-right: 5px; + margin-left: 20px; +} + +.filter-items { + float: right; +} + +.filter-links { + display: inline-block; + margin: 0; +} + +.filter-links li { + display: inline-block; + margin: 0; +} + +.filter-links li > a { + display: inline-block; + margin: 0 10px; + padding: 15px 0; + border-bottom: 4px solid #fff; + color: #666; + cursor: pointer; +} + +.filter-links .current { + box-shadow: none; + border-bottom: 4px solid #666; + color: #23282d; +} + +.filter-links li > a:hover, +.filter-links li > a:focus, +.show-filters .filter-links a.current:hover, +.show-filters .filter-links a.current:focus { + color: #00a0d2; +} + +.wp-filter .search-form { + float: left; + margin: 10px 0; +} + +.wp-filter .search-form input[type="search"] { + margin: 1px 0; + width: 280px; + max-width: 100%; +} + +.wp-filter .search-form select { + margin: 0; +} + +.wp-filter .search-form.search-plugins { + display: inline-block; +} + +.wp-filter .button.drawer-toggle { + margin: 10px 9px 0; + padding: 0 6px 0 10px; + border-color: transparent; + background-color: transparent; + color: #666; + vertical-align: baseline; + box-shadow: none; +} + +.wp-filter .drawer-toggle:before { + content: "\f111"; + margin: 0 0 0 5px; + color: #72777c; + font: normal 16px/1 dashicons; + vertical-align: text-bottom; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-filter .button.drawer-toggle:hover, +.wp-filter .drawer-toggle:hover:before, +.wp-filter .button.drawer-toggle:focus, +.wp-filter .drawer-toggle:focus:before { + background-color: transparent; + color: #00a0d2; +} + +.wp-filter .button.drawer-toggle:hover, +.wp-filter .button.drawer-toggle:focus:active { + border-color: transparent; +} + +.wp-filter .button.drawer-toggle:focus { + border-color: #5b9dd9; +} + +.wp-filter .button.drawer-toggle:active { + background: transparent; + box-shadow: none; + transform: none; +} + +.wp-filter .drawer-toggle.current:before { + color: #fff; +} + +.filter-drawer, +.wp-filter .favorites-form { + display: none; + margin: 0 -20px 0 -10px; + padding: 20px; + border-top: 1px solid #eee; + background: #fafafa; + overflow: hidden; +} + +.show-filters .filter-drawer, +.show-favorites-form .favorites-form { + display: block; +} + +.show-filters .filter-links a.current { + border-bottom: none; +} + +.show-filters .wp-filter .button.drawer-toggle { + border-radius: 2px; + background: #72777c; + color: #fff; +} + +.show-filters .wp-filter .drawer-toggle:hover, +.show-filters .wp-filter .drawer-toggle:focus { + background: rgb(46, 162, 204); +} + +.show-filters .wp-filter .drawer-toggle:before { + color: #fff; +} + +.filter-group { + box-sizing: border-box; + position: relative; + float: right; + margin: 0 0 0 1%; + padding: 20px 10px 10px; + width: 24%; + background: #fff; + border: 1px solid #e5e5e5; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); +} + +.filter-group legend { + position: absolute; + top: 10px; + display: block; + margin: 0; + padding: 0; + font-size: 1em; + font-weight: 600; +} + +.filter-drawer .filter-group-feature { + margin: 28px 0 0; + list-style-type: none; + font-size: 12px; +} + +.filter-drawer .filter-group-feature input, +.filter-drawer .filter-group-feature label { + line-height: 1.4; +} + +.filter-drawer .filter-group-feature input { + position: absolute; + margin: 0; +} + +.filter-group .filter-group-feature label { + display: block; + margin: 14px 23px 14px 0px; +} + +.filter-drawer .buttons { + clear: both; + margin-bottom: 20px; +} + +.filter-drawer .filter-group + .buttons { + margin-bottom: 0; + padding-top: 20px; +} + +.filter-drawer .buttons .button span { + display: inline-block; + opacity: 0.8; + font-size: 12px; + text-indent: 10px; +} + +.wp-filter .button.clear-filters { + display: none; + margin-right: 10px; +} + +.wp-filter .button-link.edit-filters { + padding: 0 5px; + line-height: 2.2; +} + +.filtered-by { + display: none; + margin: 0; +} + +.filtered-by > span { + font-weight: 600; +} + +.filtered-by a { + margin-right: 10px; +} + +.filtered-by .tags { + display: inline; +} + +.filtered-by .tag { + margin: 0 5px; + padding: 4px 8px; + border: 1px solid #e5e5e5; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + background: #fff; + font-size: 11px; +} + +.filters-applied .filter-group, +.filters-applied .filter-drawer .buttons, +.filters-applied .filter-drawer br { + display: none !important; +} + +.filters-applied .filtered-by { + display: block; +} + +.filters-applied .filter-drawer { + padding: 20px; +} + +.show-filters .favorites-form, +.show-filters .content-filterable, +.show-filters.filters-applied.loading-content .content-filterable, +.loading-content .content-filterable, +.error .content-filterable { + display: none; +} + +.show-filters.filters-applied .content-filterable { + display: block; +} + +.loading-content .spinner { + display: block; + margin: 40px auto 0; + float: none; +} + +@media only screen and (max-width: 1120px) { + .filter-drawer { + border-bottom: 1px solid #eee; + } + + .filter-group { + margin-bottom: 0; + margin-top: 5px; + width: 100%; + } + + .filter-group li { + margin: 10px 0; + } +} + +@media only screen and (max-width: 1000px) { + .filter-items { + float: none; + } + + .wp-filter .media-toolbar-primary, + .wp-filter .media-toolbar-secondary, + .wp-filter .search-form { + float: none; /* Remove float from media-views.css */ + position: relative; + max-width: 100%; + } +} + +@media only screen and (max-width: 782px) { + .filter-group li { + padding: 0; + width: 50%; + } +} + +@media only screen and (max-width: 320px) { + .filter-count { + display: none; + } + + .wp-filter .drawer-toggle { + margin: 10px 0; + } + + .filter-group li, + .wp-filter .search-form input[type="search"] { + width: 100%; + } +} + +/*------------------------------------------------------------------------------ + 4.0 - Notifications +------------------------------------------------------------------------------*/ + +.notice, +div.updated, +div.error { + background: #fff; + border: 1px solid #ccd0d4; + border-right-width: 4px; + box-shadow: 0 1px 1px rgba(0,0,0,.04); + margin: 5px 15px 2px; + padding: 1px 12px; +} + +div[class="update-message"] { /* back-compat for pre-4.6 */ + padding: 0.5em 0 0.5em 12px; +} + +.notice p, +.notice-title, +div.updated p, +div.error p, +.form-table td .notice p { + margin: 0.5em 0; + padding: 2px; +} + +.error a { + text-decoration: underline; +} + +.updated a { + padding-bottom: 2px; +} + +.notice-alt { + box-shadow: none; +} + +.notice-large { + padding: 10px 20px; +} + +.notice-title { + display: inline-block; + color: #23282d; + font-size: 18px; +} + +.wp-core-ui .notice.is-dismissible { + padding-left: 38px; + position: relative; +} + +.notice-dismiss { + position: absolute; + top: 0; + left: 1px; + border: none; + margin: 0; + padding: 9px; + background: none; + color: #72777c; + cursor: pointer; +} + +.notice-dismiss:hover:before, +.notice-dismiss:active:before, +.notice-dismiss:focus:before { + color: #c00; +} + +.notice-dismiss:focus { + outline: none; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.ie8 .notice-dismiss:focus { + outline: 1px solid #5b9dd9; +} + +.notice-success, +div.updated { + border-right-color: #46b450; +} + +.notice-success.notice-alt { + background-color: #ecf7ed; +} + +.notice-warning { + border-right-color: #ffb900; +} + +.notice-warning.notice-alt { + background-color: #fff8e5; +} + +.notice-error, +div.error { + border-right-color: #dc3232; +} + +.notice-error.notice-alt { + background-color: #fbeaea; +} + +.notice-info { + border-right-color: #00a0d2; +} + +.notice-info.notice-alt { + background-color: #e5f5fa; +} + +.update-message p:before, +.updating-message p:before, +.updated-message p:before, +.import-php .updating-message:before, +.button.updating-message:before, +.button.updated-message:before, +.button.installed:before, +.button.installing:before { + display: inline-block; + font: normal 20px/1 'dashicons'; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + vertical-align: top; +} + +.wrap .notice, +.wrap div.updated, +.wrap div.error, +.media-upload-form .notice, +.media-upload-form div.error { + margin: 5px 0 15px; +} + +.wrap #templateside .notice { + display: block; + margin: 0; + padding: 5px 8px; + font-weight: 600; + text-decoration: none; +} + +.wrap #templateside span.notice { + margin-right: -12px; +} + +#templateside li.notice a { + padding: 0; +} + +/* Update icon. */ +.update-message p:before, +.updating-message p:before, +.import-php .updating-message:before, +.button.updating-message:before, +.button.installing:before { + color: #f56e28; + content: "\f463"; +} + +/* Spins the update icon. */ +.updating-message p:before, +.import-php .updating-message:before, +.button.updating-message:before, +.button.installing:before { + animation: rotation 2s infinite linear; +} + +/* Updated icon (check mark). */ +.updated-message p:before, +.installed p:before, +.button.updated-message:before { + color: #79ba49; + content: "\f147"; +} + +/* Error icon. */ +.update-message.notice-error p:before { + color: #dc3232; + content: "\f534"; +} + +.wrap .notice p:before, +.import-php .updating-message:before { + margin-left: 6px; + vertical-align: bottom; +} + +#update-nag, +.update-nag { + display: inline-block; + line-height: 1.4; + padding: 11px 15px; + font-size: 14px; + text-align: right; + margin: 25px 2px 0 20px; + background-color: #fff; + border-right: 4px solid #ffba00; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); +} + +ul#dismissed-updates { + display: none; +} + +#dismissed-updates li > p { + margin-top: 0; +} + +#dismiss, +#undismiss { + margin-right: 0.5em; +} + +form.upgrade { + margin-top: 8px; +} + +form.upgrade .hint { + font-style: italic; + font-size: 85%; + margin: -0.5em 0 2em 0; +} + +.update-php .spinner { + float: none; + margin: -4px 0; +} + +#ajax-loading, +.ajax-loading, +.ajax-feedback, +.imgedit-wait-spin, +.list-ajax-loading { /* deprecated */ + visibility: hidden; +} + +#ajax-response.alignleft { + margin-right: 2em; +} + +.button.updating-message:before, +.button.updated-message:before, +.button.installed:before, +.button.installing:before { + margin: 3px -2px 0 5px; +} + +.button-primary.updating-message:before { + color: #fff; +} + +.button-primary.updated-message:before { + color: #66c6e4; +} + +.button.updated-message { + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; +} + +@media aural { + .wrap .notice p:before, + .button.installing:before, + .button.installed:before, + .update-message p:before { + speak: none; + } +} + + +/* @todo: this does not need its own section anymore */ +/*------------------------------------------------------------------------------ + 6.0 - Admin Header +------------------------------------------------------------------------------*/ +#adminmenu a, +#taglist a, +#catlist a { + text-decoration: none; +} + +/*------------------------------------------------------------------------------ + 6.1 - Screen Options Tabs +------------------------------------------------------------------------------*/ + +#screen-options-wrap, +#contextual-help-wrap { + margin: 0; + padding: 8px 20px 12px; + position: relative; +} + +#contextual-help-wrap { + overflow: auto; + margin-right: 0 !important; +} + +#screen-meta-links { + float: left; + margin: 0 0 0 20px; +} + +/* screen options and help tabs revert */ +#screen-meta { + display: none; + margin: 0 0px -1px 20px; + position: relative; + background-color: #fff; + border: 1px solid #ccd0d4; + border-top: none; + box-shadow: 0 0 0 transparent; +} + +#screen-options-link-wrap, +#contextual-help-link-wrap { + float: right; + margin: 0 6px 0 0; +} + +#screen-meta-links .screen-meta-toggle { + position: relative; + top: 0; +} + +#screen-meta-links .show-settings { + border: 1px solid #ccd0d4; + border-top: none; + height: auto; + margin-bottom: 0; + padding: 3px 16px 3px 6px; + background: #fff; + border-radius: 0 0 4px 4px; + color: #72777c; + line-height: 1.7; + box-shadow: 0 0 0 transparent; + transition: box-shadow 0.1s linear; +} + +#screen-meta-links .show-settings:hover, +#screen-meta-links .show-settings:active, +#screen-meta-links .show-settings:focus { + color: #32373c; +} + +#screen-meta-links .show-settings:focus { + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +#screen-meta-links .show-settings:active { + transform: none; +} + +#screen-meta-links .show-settings:after { + left: 0; + content: "\f140"; + font: normal 20px/1 dashicons; + speak: none; + display: inline-block; + padding: 0 0 0 5px; + bottom: 2px; + position: relative; + vertical-align: bottom; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #72777c; +} + +#screen-meta-links .screen-meta-active:after { + content: "\f142"; +} + +/* end screen options and help tabs */ + +.toggle-arrow { + background-repeat: no-repeat; + background-position: top right; + background-color: transparent; + height: 22px; + line-height: 22px; + display: block; +} + +.toggle-arrow-active { + background-position: bottom right; +} + +#screen-options-wrap h5, /* Back-compat for old plugins */ +#screen-options-wrap legend, +#contextual-help-wrap h5 { + margin: 0; + padding: 8px 0; + font-size: 13px; + font-weight: 600; +} + +.ie8 #screen-options-wrap legend { + color: inherit; +} + +.metabox-prefs label { + display: inline-block; + padding-left: 15px; + line-height: 2.35; +} + +#number-of-columns { + display: inline-block; + vertical-align: middle; + line-height: 30px; +} + +.metabox-prefs input[type=checkbox] { + margin-top: 0; + margin-left: 6px; +} + +.metabox-prefs label input, +.metabox-prefs label input[type=checkbox] { + margin: -4px 0 0 5px; +} + +.metabox-prefs .columns-prefs label input { + margin: -1px 0 0 2px; +} + +.metabox-prefs label a { + display: none; +} + +.metabox-prefs .screen-options input, +.metabox-prefs .screen-options label { + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.metabox-prefs .screen-options .screen-per-page { + margin-left: 15px; +} + +.metabox-prefs .screen-options label { + line-height: 2.2; + padding-left: 0; +} + +.screen-options + .screen-options { + margin-top: 10px; +} + +.metabox-prefs .submit { + margin-top: 1em; + padding: 0; +} + +/*------------------------------------------------------------------------------ + 6.2 - Help Menu +------------------------------------------------------------------------------*/ + +#contextual-help-wrap { + padding: 0; +} + +#contextual-help-columns { + position: relative; +} + +#contextual-help-back { + position: absolute; + top: 0; + bottom: 0; + right: 150px; + left: 170px; + border: 1px solid #ccd0d4; + border-top: none; + border-bottom: none; + background: #f6fbfd; +} + +#contextual-help-wrap.no-sidebar #contextual-help-back { + left: 0; + border-left-width: 0; + border-bottom-left-radius: 2px; +} + +.contextual-help-tabs { + float: right; + width: 150px; + margin: 0; +} + +.contextual-help-tabs ul { + margin: 1em 0; +} + +.contextual-help-tabs li { + margin-bottom: 0; + list-style-type: none; + border-style: solid; + border-width: 0 2px 0 0; + border-color: transparent; +} + +.contextual-help-tabs a { + display: block; + padding: 5px 12px 5px 5px; + line-height: 1.4; + text-decoration: none; + border: 1px solid transparent; + border-left: none; + border-right: none; +} + +.contextual-help-tabs a:hover { + color: #32373c; +} + +.contextual-help-tabs .active { + padding: 0; + margin: 0 0 0 -1px; + border-right: 2px solid #00a0d2; + background: #f6fbfd; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.02), 0 1px 0 rgba(0, 0, 0, 0.02); +} + +.contextual-help-tabs .active a { + border-color: #ccd0d4; + color: #32373c; +} + +.contextual-help-tabs-wrap { + padding: 0 20px; + overflow: auto; +} + +.help-tab-content { + display: none; + margin: 0 0 12px 22px; + line-height: 1.6; +} + +.help-tab-content.active { + display: block; +} + +.help-tab-content ul li { + list-style-type: disc; + margin-right: 18px; +} + +.contextual-help-sidebar { + width: 150px; + float: left; + padding: 0 12px 0 8px; + overflow: auto; +} + +/*------------------------------------------------------------------------------ + 8.0 - Layout Blocks +------------------------------------------------------------------------------*/ + +html.wp-toolbar { + padding-top: 32px; + box-sizing: border-box; +} + +.widefat th, +.widefat td { + color: #555; +} + +.widefat th, +.widefat thead td, +.widefat tfoot td { + font-weight: 400; +} + +.widefat thead tr th, +.widefat thead tr td, +.widefat tfoot tr th, +.widefat tfoot tr td { + color: #32373c; +} + +.widefat td p { + margin: 2px 0 0.8em; +} + +.widefat p, +.widefat ol, +.widefat ul { + color: #32373c; +} + +.widefat .column-comment p { + margin: 0.6em 0; +} + +.widefat .column-comment ul { + list-style: initial; + margin-right: 2em; +} + +/* Screens with postboxes */ +.postbox-container { + float: right; +} + +.postbox-container .meta-box-sortables { + box-sizing: border-box; +} + +#wpbody-content .metabox-holder { + padding-top: 10px; +} + +.metabox-holder .postbox-container .empty-container { + border: 3px dashed #b4b9be; + height: 250px; + position: relative; +} + +.metabox-holder .postbox-container .empty-container:after { + content: attr(data-emptystring); + margin: auto; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + height: 1em; + width: 200px; + text-align: center; + color: #ccc; + font-size: 18px; + display: none; +} + +.metabox-holder.columns-1 .postbox-container .empty-container, +.columns-2 #postbox-container-3 .empty-container, +.columns-2 #postbox-container-4 .empty-container, +.columns-3 #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; +} + +#post-body-content { + width: 100%; + min-width: 463px; + float: right; +} + +#post-body.columns-2 #postbox-container-1 { + float: left; + margin-left: -300px; + width: 280px; +} + +#post-body.columns-2 #side-sortables { + min-height: 250px; +} + +/* one column on the dash */ +@media only screen and (max-width: 799px) { + #wpbody-content .metabox-holder .postbox-container .empty-container { + border: 0 none; + height: 0; + min-height: 0; + } +} + +.js .widget .widget-top, +.js .postbox .hndle { + cursor: move; +} + +.js .widget .widget-top.is-non-sortable, +.js .postbox .hndle.is-non-sortable { + cursor: auto; +} + +.hndle a { + font-size: 11px; + font-weight: 400; +} + +.postbox .handlediv { + display: none; + float: left; + width: 36px; + height: 36px; + margin: 0; + padding: 0; + border: 0; + background: none; + cursor: pointer; +} + +.js .postbox .handlediv { + display: block; +} + +.sortable-placeholder { + border: 1px dashed #b4b9be; + margin-bottom: 20px; +} + +.postbox, +.stuffbox { + margin-bottom: 20px; + padding: 0; + line-height: 1; +} + +/* user-select is not a part of the CSS standard - may change behavior in the future */ +.postbox .hndle, +.stuffbox .hndle { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.postbox .inside { + padding: 0 12px 12px; + line-height: 1.4; + font-size: 13px; +} + +.stuffbox .inside { + padding: 0; + line-height: 1.4; + font-size: 13px; + margin-top: 0; +} + +.postbox .inside { + margin: 11px 0; + position: relative; +} + +.postbox .inside > p:last-child, +.rss-widget ul li:last-child { + margin-bottom: 1px !important; +} + +.postbox.closed h3 { + border: none; + box-shadow: none; +} + +.postbox table.form-table { + margin-bottom: 0; +} + +.postbox table.widefat { + box-shadow: none; +} + +.temp-border { + border: 1px dotted #ccc; +} + +.columns-prefs label { + padding: 0 0 0 10px; +} + +/* @todo: what is this doing here */ +#dashboard_right_now .versions .b, +#post-status-display, +#post-visibility-display, +#adminmenu .wp-submenu li.current, +#adminmenu .wp-submenu li.current a, +#adminmenu .wp-submenu li.current a:hover, +.media-item .percent, +.plugins .name, +#pass-strength-result.strong, +#pass-strength-result.short, +#ed_reply_toolbar #ed_reply_strong, +.item-controls .item-order a, +.feature-filter .feature-name, +#comment-status-display { + font-weight: 600; +} + +/*------------------------------------------------------------------------------ + 21.0 - Admin Footer +------------------------------------------------------------------------------*/ + +#wpfooter { + position: absolute; + bottom: 0; + right: 0; + left: 0; + padding: 10px 20px; + color: #555d66; +} + +#wpfooter p { + font-size: 13px; + margin: 0; + line-height: 1.55; +} + +#footer-thankyou { + font-style: italic; +} + +/*------------------------------------------------------------------------------ + 25.0 - Tabbed Admin Screen Interface (Experimental) +------------------------------------------------------------------------------*/ + +.nav-tab { + float: right; + border: 1px solid #ccc; + border-bottom: none; + margin-right: 0.5em; /* half the font size so set the font size properly */ + padding: 5px 10px; + font-size: 14px; + line-height: 1.71428571; + font-weight: 600; + background: #e5e5e5; + color: #555; + text-decoration: none; + white-space: nowrap; +} + +h3 .nav-tab, /* Back-compat for pre-4.4 */ +.nav-tab-small .nav-tab { + padding: 5px 14px; + font-size: 12px; + line-height: 1.33; +} + +.nav-tab:hover, +.nav-tab:focus { + background-color: #fff; + color: #444; +} + +.nav-tab-active, +.nav-tab:focus:active { + box-shadow: none; +} + +.nav-tab-active { + margin-bottom: -1px; + color: #444; +} + +.nav-tab-active, +.nav-tab-active:hover, +.nav-tab-active:focus, +.nav-tab-active:focus:active { + border-bottom: 1px solid #f1f1f1; + background: #f1f1f1; + color: #000; +} + +h1.nav-tab-wrapper, /* Back-compat for pre-4.4 */ +.wrap h2.nav-tab-wrapper, /* higher specificity to override .wrap > h2:first-child */ +.nav-tab-wrapper { + border-bottom: 1px solid #ccc; + margin: 0; + padding-top: 9px; + padding-bottom: 0; + line-height: inherit; +} + +/* Back-compat for plugins. Deprecated. Use .wp-clearfix instead. */ +.nav-tab-wrapper:not(.wp-clearfix):after { + content: ""; + display: table; + clear: both; +} + +.ie8 .nav-tab-wrapper { + /* contain floats establishing a new block formatting context */ + display: inline-block; + width: 100%; + vertical-align: top; +} + +/*------------------------------------------------------------------------------ + 26.0 - Misc +------------------------------------------------------------------------------*/ + +.spinner { + background: url(../images/spinner.gif) no-repeat; + background-size: 20px 20px; + display: inline-block; + visibility: hidden; + float: left; + vertical-align: middle; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 4px 10px 0; +} + +.spinner.is-active, +.loading-content .spinner { + visibility: visible; +} + +#template > div { + margin-left: 16em; +} +#template .notice { + margin-top: 1em; + margin-left: 3%; +} +#template .notice p { + width: auto; +} +#template .submit .spinner { + float: none; +} + +.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */ +.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */ +.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */ +.metabox-holder h2.hndle { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +/* Back-compat for nav-menus screen */ +.nav-menus-php .metabox-holder h3 { + padding: 10px 14px 11px 10px; + line-height: 1.5; +} + +#templateside ul li a { + text-decoration: none; +} + +.plugin-install #description, +.plugin-install-network #description { + width: 60%; +} + +table .vers, +table .column-visible, +table .column-rating { + text-align: right; +} + +.attention, +.error-message { + color: #dc3232; + font-weight: 600; +} + +/* Scrollbar fix for bulk upgrade iframe */ +body.iframe { + height: 98%; +} + +/* Upgrader styles, Specific to Language Packs */ +.lp-show-latest p { + display: none; +} +.lp-show-latest p:last-child, +.lp-show-latest .lp-error p { + display: block; +} + +/* - Only used once or twice in all of WP - deprecate for global style +------------------------------------------------------------------------------*/ +.media-icon { + width: 62px; /* icon + border */ + text-align: center; +} + +.media-icon img { + border: 1px solid #e5e5e5; + border: 1px solid rgba(0, 0, 0, 0.07); +} + +#howto { + font-size: 11px; + margin: 0 5px; + display: block; +} + +.importers { + font-size: 16px; + width: auto; +} + +.importers td { + padding-left: 14px; + line-height: 1.4; +} + +.importers .import-system { + max-width: 250px; +} + +.importers td.desc { + max-width: 500px; +} + +.importer-title, +.importer-desc, +.importer-action { + display: block; +} + +.importer-title { + color: #000; + font-size: 14px; + font-weight: 400; + margin-bottom: .2em; +} + +.importer-action { + line-height: 1.55; /* Same as with .updating-message */ + color: #555; + margin-bottom: 1em; +} + +#post-body #post-body-content #namediv h3, /* Back-compat for pre-4.4 */ +#post-body #post-body-content #namediv h2 { + margin-top: 0; +} + +.edit-comment-author { + color: #222; + border-bottom: 1px solid #eee; +} + +#namediv h3 label, /* Back-compat for pre-4.4 */ +#namediv h2 label { + vertical-align: baseline; +} + +#namediv table { + width: 100%; +} + +#namediv td.first { + width: 10px; + white-space: nowrap; +} + +#namediv input { + width: 98%; +} + +#namediv p { + margin: 10px 0; +} + +#submitdiv h3 { + margin-bottom: 0 !important; +} + +/* - Used - but could/should be deprecated with a CSS reset +------------------------------------------------------------------------------*/ +.zerosize { + height: 0; + width: 0; + margin: 0; + border: 0; + padding: 0; + overflow: hidden; + position: absolute; +} + +br.clear { + height: 2px; + line-height: 0.15; +} + +.checkbox { + border: none; + margin: 0; + padding: 0; +} + +fieldset { + border: 0; + padding: 0; + margin: 0; +} + +.post-categories { + display: inline; + margin: 0; + padding: 0; +} + +.post-categories li { + display: inline; +} + +/* Star Ratings - Back-compat for pre-3.8 */ +div.star-holder { + position: relative; + height: 17px; + width: 100px; + background: url(../images/stars.png?ver=20121108) repeat-x bottom left; +} + +div.star-holder .star-rating { + background: url(../images/stars.png?ver=20121108) repeat-x top left; + height: 17px; + float: right; +} + +/* Star Ratings */ +.star-rating { + white-space: nowrap; +} +.star-rating .star { + display: inline-block; + width: 20px; + height: 20px; + -webkit-font-smoothing: antialiased; + font-size: 20px; + line-height: 1; + font-family: dashicons; + text-decoration: inherit; + font-weight: 400; + font-style: normal; + vertical-align: top; + transition: color .1s ease-in; + text-align: center; + color: #ffb900; +} + +.star-rating .star-full:before { + content: "\f155"; +} + +.star-rating .star-half:before { + content: "\f459"; +} + +.rtl .star-rating .star-half { + transform: rotateY(180deg); +} + +.star-rating .star-empty:before { + content: "\f154"; +} + +div.action-links { + font-weight: 400; + margin: 6px 0 0; +} + +/* Plugin install thickbox */ +#plugin-information { + background: #fff; + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + height: 100%; + padding: 0; +} + +#plugin-information-scrollable { + overflow: auto; + -webkit-overflow-scrolling: touch; + height: 100%; +} + +#plugin-information-title { + padding: 0 26px; + background: #f5f5f5; + font-size: 22px; + font-weight: 600; + line-height: 2.4; + position: relative; + height: 56px; +} + +#plugin-information-title.with-banner { + margin-left: 0; + height: 250px; + background-size: cover; +} + +#plugin-information-title h2 { + font-size: 1em; + font-weight: 600; + padding: 0; + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#plugin-information-title.with-banner h2 { + position: relative; + font-family: "Helvetica Neue", sans-serif; + display: inline-block; + font-size: 30px; + line-height: 1.68; + box-sizing: border-box; + max-width: 100%; + padding: 0 15px; + margin-top: 174px; + color: #fff; + background: rgba(30, 30, 30, 0.9); + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); + box-shadow: 0 0 30px rgba(255, 255, 255, 0.1); + border-radius: 8px; +} + +#plugin-information-title div.vignette { + display: none; +} + +#plugin-information-title.with-banner div.vignette { + position: absolute; + display: block; + top: 0; + right: 0; + height: 250px; + width: 100%; + background: transparent; + box-shadow: inset 0 0 50px 4px rgba(0, 0, 0, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +#plugin-information-tabs { + padding: 0 16px; + position: relative; + left: 0; + right: 0; + min-height: 36px; + font-size: 0; + z-index: 1; + border-bottom: 1px solid #ddd; + background: #f3f3f3; +} + +#plugin-information-tabs a { + position: relative; + display: inline-block; + padding: 9px 10px; + margin: 0; + height: 18px; + line-height: 1.3; + font-size: 14px; + text-decoration: none; + transition: none; +} + +#plugin-information-tabs a.current { + margin: 0 -1px -1px; + background: #fff; + border: 1px solid #ddd; + border-bottom-color: #fff; + padding-top: 8px; + color: #32373c; +} + +#plugin-information-tabs.with-banner a.current { + border-top: none; + padding-top: 9px; +} + +#plugin-information-tabs a:active, +#plugin-information-tabs a:focus { + outline: none; +} + +#plugin-information-content { + overflow: hidden; /* equal height column trick */ + background: #fff; + position: relative; + top: 0; + left: 0; + right: 0; + min-height: 100%; + /* Height of title + tabs + install now */ + min-height: calc( 100% - 152px ); +} + +#plugin-information-content.with-banner { + /* Height of banner + tabs + install now */ + min-height: calc( 100% - 346px ); +} + +#section-holder { + position: relative; + top: 0; + left: 250px; + bottom: 0; + right: 0; + margin-top: 10px; + margin-left: 250px; /* FYI box */ + padding: 10px 26px; + margin-bottom: -99939px; /* 60px less than the padding below to accommodate footer */ + padding-bottom: 99999px; /* equal height column trick */ +} + +#section-holder .notice { + margin: 5px 0 15px; +} + +#section-holder .updated { + margin: 16px 0; +} + +#plugin-information .fyi { + float: left; + position: relative; + top: 0; + left: 0; + padding: 16px; + margin-bottom: -99939px; /* 60px less than the padding below to accommodate footer */ + padding-bottom: 99999px; /* equal height column trick */ + width: 217px; + border-right: 1px solid #ddd; + background: #f3f3f3; + color: #666; +} + +#plugin-information .fyi strong { + color: #444; +} + +#plugin-information .fyi h3 { + font-weight: 600; + text-transform: uppercase; + font-size: 12px; + color: #666; + margin: 24px 0 8px; +} + +#plugin-information .fyi h2 { + font-size: 0.9em; + margin-bottom: 0; + margin-left: 0; +} + +#plugin-information .fyi ul { + padding: 0; + margin: 0; + list-style: none; +} + +#plugin-information .fyi li { + margin: 0 0 10px; +} + +#plugin-information .fyi-description { + margin-top: 0; +} + +#plugin-information .counter-container { + margin: 3px 0; +} + +#plugin-information .counter-label { + float: right; + margin-left: 5px; + min-width: 55px; +} + +#plugin-information .counter-back { + height: 17px; + width: 92px; + background-color: #e5e5e5; + float: right; +} + +#plugin-information .counter-bar { + height: 17px; + background-color: #ffc733; /* slightly lighter than stars due to larger expanse */ + float: right; +} + +#plugin-information .counter-count { + margin-right: 5px; +} + +#plugin-information .fyi ul.contributors { + margin-top: 10px; +} + +#plugin-information .fyi ul.contributors li { + display: inline-block; + margin-left: 8px; + vertical-align: middle; +} + +#plugin-information .fyi ul.contributors li { + display: inline-block; + margin-left: 8px; + vertical-align: middle; +} + +#plugin-information .fyi ul.contributors li img { + vertical-align: middle; + margin-left: 4px; +} + +#plugin-information-footer { + padding: 13px 16px; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 33px; /* 33+13+13+1=60 */ + border-top: 1px solid #ddd; + background: #f3f3f3; +} + +/* rtl:ignore */ +#plugin-information .section { + direction: ltr; +} + +/* rtl:ignore */ +#plugin-information .section ul, +#plugin-information .section ol { + list-style-type: disc; + margin-left: 24px; +} + +#plugin-information .section, +#plugin-information .section p { + font-size: 14px; + line-height: 1.7; +} + +#plugin-information #section-screenshots ol { + list-style: none; + margin: 0; +} + +#plugin-information #section-screenshots li img { + vertical-align: text-top; + margin-top: 16px; + max-width: 100%; + width: auto; + height: auto; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); +} + +/* rtl:ignore */ +#plugin-information #section-screenshots li p { + font-style: italic; + padding-left: 20px; +} + +#plugin-information pre { + padding: 7px; + overflow: auto; + border: 1px solid #ccc; +} + +#plugin-information blockquote { + border-right: 2px solid #ddd; + color: #666; + font-style: italic; + margin: 1em 0; + padding: 0 1em 0 0; +} + +/* rtl:ignore */ +#plugin-information .review { + overflow: hidden; /* clearfix */ + width: 100%; + margin-bottom: 20px; + border-bottom: 1px solid #e5e5e5; +} + +#plugin-information .review-title-section { + overflow: hidden; /* clearfix */ +} + +/* rtl:ignore */ +#plugin-information .review-title-section h4 { + display: inline-block; + float: left; + margin: 0 6px 0 0; +} + +#plugin-information .reviewer-info p { + clear: both; + margin: 0; + padding-top: 2px; +} + +/* rtl:ignore */ +#plugin-information .reviewer-info .avatar { + float: left; + margin: 4px 6px 0 0; +} + +/* rtl:ignore */ +#plugin-information .reviewer-info .star-rating { + float: left; +} + +/* rtl:ignore */ +#plugin-information .review-meta { + float: left; + margin-left: 0.75em; +} + +/* rtl:ignore */ +#plugin-information .review-body { + float: left; + width: 100%; +} + +.plugin-version-author-uri { + font-size: 13px; +} + +/* For non-js plugin installation screen ticket #36430. */ +.update-php .button.button-primary { + margin-left: 1em; +} + +@media screen and (max-width: 771px) { + #plugin-information-title.with-banner { + height: 100px; + } + + #plugin-information-title.with-banner h2 { + margin-top: 30px; + font-size: 20px; + line-height: 2; + max-width: 85%; + } + + #plugin-information-title.with-banner div.vignette { + height: 100px; + } + + #plugin-information-tabs { + overflow: hidden; /* clearfix */ + padding: 0; + height: auto; /* let tabs wrap */ + } + + #plugin-information-tabs a.current { + margin-bottom: 0; + border-bottom: none; + } + + #plugin-information .fyi { + float: none; + border: 1px solid #ddd; + position: static; + width: auto; + margin: 26px 26px 0; + padding-bottom: 0; /* reset from the two column height fix */ + } + + #section-holder { + position: static; + margin: 0; + padding-bottom: 70px; /* reset from the two column height fix, plus accommodate footer */ + } + + #plugin-information .fyi h3, + #plugin-information .fyi small { + display: none; + } + + #plugin-information-footer { + padding: 12px 16px 0; + height: 46px; + } +} + +/* Thickbox for the Plugin details modal. */ +#TB_window.plugin-details-modal { + background: #fcfcfc; +} + +#TB_window.plugin-details-modal.thickbox-loading:before { + content: ""; + display: block; + width: 20px; + height: 20px; + position: absolute; + right: 50%; + top: 50%; + z-index: -1; + margin: -10px -10px 0 0; + background: #fcfcfc url(../images/spinner.gif) no-repeat center; + background-size: 20px 20px; + transform: translateZ(0); +} + +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + #TB_window.plugin-details-modal.thickbox-loading:before { + background-image: url(../images/spinner-2x.gif); + } +} + +.plugin-details-modal #TB_title { + float: right; + height: 1px; +} + +.plugin-details-modal #TB_ajaxWindowTitle { + display: none; +} + +.plugin-details-modal #TB_closeWindowButton { + right: auto; + left: -30px; + color: #eee; +} + +.plugin-details-modal #TB_closeWindowButton:hover, +.plugin-details-modal #TB_closeWindowButton:focus { + color: #00a0d2; + outline: none; + box-shadow: none; +} + +.plugin-details-modal .tb-close-icon { + display: none; +} + +.plugin-details-modal #TB_closeWindowButton:after { + content: "\f335"; + font: normal 32px/29px 'dashicons'; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* move plugin install close icon to top on narrow screens */ +@media screen and (max-width: 830px) { + .plugin-details-modal #TB_closeWindowButton { + left: 0; + top: -30px; + } +} + +/* @todo: move this. */ +img { + border: none; +} + +/* Metabox collapse arrow indicators */ +.sidebar-name .toggle-indicator:before, +.js .meta-box-sortables .postbox .toggle-indicator:before, +.bulk-action-notice .toggle-indicator:before, +.privacy-text-box .toggle-indicator:before { + content: "\f142"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +.js .widgets-holder-wrap.closed .toggle-indicator:before, +.js .meta-box-sortables .postbox.closed .handlediv .toggle-indicator:before, +.bulk-action-notice .bulk-action-errors-collapsed .toggle-indicator:before, +.privacy-text-box.closed .toggle-indicator:before { + content: "\f140"; +} + +.js .postbox .handlediv .toggle-indicator:before { + margin-top: 4px; + width: 20px; + border-radius: 50%; + text-indent: -1px; /* account for the dashicon alignment */ +} + +.rtl.js .postbox .handlediv .toggle-indicator:before { + text-indent: 1px; /* account for the dashicon alignment */ +} + +.bulk-action-notice .toggle-indicator:before { + line-height: 16px; + vertical-align: top; + color: #72777c; +} + +.js .postbox .handlediv:focus { + box-shadow: none; + outline: none; +} + +.js .postbox .handlediv:focus .toggle-indicator:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +/* @todo: appears to be Press This only and overridden */ +#photo-add-url-div input[type="text"] { + width: 300px; +} + +/* Theme/Plugin Editor */ +.alignleft h2 { + margin: 0; +} + +#template textarea { + font-family: Consolas, Monaco, monospace; + font-size: 13px; + background: #f9f9f9; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; +} + +#template textarea, +#template .CodeMirror { + width: 100%; + min-height: 60vh; + height: calc( 100vh - 295px ); + border: 1px solid #ddd; + box-sizing: border-box; +} + +#templateside > h2 { + padding-top: 6px; + padding-bottom: 7px; + margin: 0; +} + +#templateside ol, +#templateside ul { + margin: 0; + padding: 0; +} +#templateside > ul { + box-sizing: border-box; + margin-top: 0; + overflow: auto; + padding: 0; + min-height: 60vh; + height: calc(100vh - 295px); + background-color: #f7f7f7; + border: 1px solid #ddd; + border-right: none; +} +#templateside ul ul { + padding-right: 12px; +} +#templateside > ul > li > ul[role=group] { + padding-right: 0; +} + +/* + * Styles for Theme and Plugin editors. + */ + +/* Hide collapsed items. */ +[role="treeitem"][aria-expanded="false"] > ul { + display: none; +} + +/* Use arrow dashicons for folder states, but hide from screen readers. */ +[role="treeitem"] span[aria-hidden] { + display: inline; + font-family: dashicons; + font-size: 20px; + position: absolute; + pointer-events: none; +} +[role="treeitem"][aria-expanded="false"] > .folder-label .icon:after { + content: "\f141"; +} +[role="treeitem"][aria-expanded="true"] > .folder-label .icon:after { + content: "\f140"; +} +[role="treeitem"] .folder-label { + display: block; + padding: 3px 12px 3px 3px; + cursor: pointer; +} + +/* Remove outline, and create our own focus and hover styles */ +[role="treeitem"] { + outline: 0; +} +[role="treeitem"] .folder-label.focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} +[role="treeitem"].hover, +[role="treeitem"] .folder-label.hover { + background-color: #eaeaea; +} + +.tree-folder { + margin: 0; + position: relative; +} +[role="treeitem"] li { + position: relative; +} + +/* Styles for folder indicators/depth */ +.tree-folder .tree-folder::after { + content: ""; + display: block; + position: absolute; + right: 2px; + border-right: 1px solid #ccc; + top: -13px; + bottom: 10px; +} +.tree-folder > li::before { + content: ""; + position: absolute; + display: block; + border-right: 1px solid #ccc; + right: 2px; + top: -5px; + height: 18px; + width: 7px; + border-bottom: 1px solid #ccc; +} +.tree-folder > li::after { + content: ""; + position: absolute; + display: block; + border-right: 1px solid #ccc; + right: 2px; + bottom: -7px; + top: 0; +} + +/* current-file needs to adjustment for .notice styles */ +#templateside .current-file { + margin: -4px 0 -2px; +} +.tree-folder > .current-file::before { + right: 4px; + height: 15px; + width: 0px; + border-right: none; + top: 3px; +} +.tree-folder > .current-file::after { + bottom: -4px; + height: 7px; + right: 2px; + top: auto; +} + +/* Lines shouldn't continue on last item */ +.tree-folder > li:last-child::after, +.tree-folder li:last-child > .tree-folder::after { + display: none; +} + + +#theme-plugin-editor-label { + display: inline-block; + margin-bottom: 1em; + font-weight: 600; +} + +/* rtl:ignore */ +#template textarea, +#docs-list { + direction: ltr; +} + +.fileedit-sub #theme, +.fileedit-sub #plugin { + max-width: 40%; +} +.fileedit-sub .alignright { + text-align: left; +} + +#template p { + width: 97%; +} + +#file-editor-linting-error { + margin-top: 1em; + margin-bottom: 1em; +} +#file-editor-linting-error > .notice { + margin: 0; + display: inline-block; +} +#file-editor-linting-error > .notice > p { + width: auto; +} +#template .submit { + margin-top: 1em; + padding: 0; +} + +#template .submit input[type=submit][disabled] { + cursor: not-allowed; +} +#templateside { + float: left; + width: 16em; + word-wrap: break-word; +} + +#postcustomstuff p.submit { + margin: 0; +} + +#templateside h4 { + margin: 1em 0 0; +} + +#templateside li { + margin: 4px 0; +} + +#templateside li:not(.howto) a, +.theme-editor-php .highlight { + display: block; + padding: 3px 12px 3px 0; + text-decoration: none; +} + +#templateside li:not(.howto) > a:first-of-type { + padding-top: 0; +} + +#templateside li.howto { + padding: 6px 12px 12px 12px; +} + +.theme-editor-php .highlight { + margin: -3px -12px -3px 3px; +} + +#templateside .highlight { + border: none; + font-weight: 600; +} + +.nonessential { + color: #666; + font-size: 11px; + font-style: italic; + padding-right: 12px; +} + +#documentation { + margin-top: 10px; +} + +#documentation label { + line-height: 1.8; + vertical-align: baseline; + font-weight: 600; +} + +.fileedit-sub { + padding: 10px 0 8px; + line-height: 180%; +} + +#file-editor-warning .file-editor-warning-content { + margin: 25px; +} + +/* @todo: can we use a common class for these? */ +.nav-menus-php .item-edit:before, +.widget-top .widget-action .toggle-indicator:before, +.control-section .accordion-section-title:after, +.accordion-section-title:after { + content: "\f140"; + font: normal 20px/1 dashicons; + speak: none; + display: block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +.widget-top .widget-action .toggle-indicator:before { + padding: 1px 0px 1px 2px; + border-radius: 50%; +} + +.handlediv, +.postbox .handlediv.button-link, +.item-edit, +.toggle-indicator, +.accordion-section-title:after { + color: #72777c; +} + +.widget-action { + color: #555d66; /* #fafafa background in the Widgets screen */ +} + +.widget-top:hover .widget-action, +.widget-action:focus, +.handlediv:hover, +.handlediv:focus, +.postbox .handlediv.button-link:hover, +.postbox .handlediv.button-link:focus, +.item-edit:hover, +.item-edit:focus, +.sidebar-name:hover .toggle-indicator, +.accordion-section-title:hover:after { + color: #23282d; +} + +.widget-top .widget-action:focus .toggle-indicator:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.control-section .accordion-section-title:after, +.accordion-section-title:after { + float: left; + left: 20px; + top: -2px; +} + +.control-section.open .accordion-section-title:after, +#customize-info.open .accordion-section-title:after, +.nav-menus-php .menu-item-edit-active .item-edit:before, +.widget.open .widget-top .widget-action .toggle-indicator:before, +.widget.widget-in-question .widget-top .widget-action .toggle-indicator:before { + content: "\f142"; +} + +/*! + * jQuery UI Draggable/Sortable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ +.ui-draggable-handle, +.ui-sortable-handle { + touch-action: none; +} + +/* Accordion */ +.accordion-section { + border-bottom: 1px solid #ddd; + margin: 0; +} + +.accordion-section.open .accordion-section-content, +.no-js .accordion-section .accordion-section-content { + display: block; +} + +.accordion-section.open:hover { + border-bottom-color: #ddd; +} + +.accordion-section-content { + display: none; + padding: 10px 20px 15px; + overflow: hidden; + background: #fff; +} + +.accordion-section-title { + margin: 0; + padding: 12px 15px 15px; + position: relative; + border-right: 1px solid #ddd; + border-left: 1px solid #ddd; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.js .accordion-section-title { + cursor: pointer; +} + +.js .accordion-section-title:after { + position: absolute; + top: 12px; + left: 10px; + z-index: 1; +} + +.accordion-section-title:focus { + outline: none; +} + +.accordion-section-title:hover:after, +.accordion-section-title:focus:after { + border-color: #a0a5aa transparent; +} + +.cannot-expand .accordion-section-title { + cursor: auto; +} + +.cannot-expand .accordion-section-title:after { + display: none; +} + +.control-section .accordion-section-title, +.customize-pane-child .accordion-section-title { + border-right: none; + border-left: none; + padding: 10px 14px 11px 10px; + line-height: 1.55; + background: #fff; +} + +.control-section .accordion-section-title:after, +.customize-pane-child .accordion-section-title:after { + top: calc(50% - 10px); /* Arrow height is 20px, so use half of that to vertically center */ +} + +.js .control-section:hover .accordion-section-title, +.js .control-section .accordion-section-title:hover, +.js .control-section.open .accordion-section-title, +.js .control-section .accordion-section-title:focus { + color: #23282d; + background: #f5f5f5; +} + +.control-section.open .accordion-section-title { + /* When expanded */ + border-bottom: 1px solid #ddd; +} + +/* Edit Site */ +.network-admin .edit-site-actions { + margin-top: 0; +} + +/* My Sites */ +.my-sites { + display: block; + overflow: auto; + zoom: 1; +} + +.my-sites li { + display: block; + padding: 8px 3%; + min-height: 130px; + margin: 0; +} + +@media only screen and (max-width: 599px) { + .my-sites li { + min-height: 0; + } +} + +@media only screen and (min-width: 600px) { + .my-sites.striped li { + background-color: #fff; + position: relative; + } + .my-sites.striped li:after { + content: ""; + width: 1px; + height: 100%; + position: absolute; + top: 0; + left: 0; + background: #ccc; + } + +} +@media only screen and (min-width: 600px) and (max-width: 699px) { + .my-sites li{ + float: right; + width: 44%; + } + .my-sites.striped li { + background-color: #fff; + } + .my-sites.striped li:nth-of-type(2n+1) { + clear: right; + } + .my-sites.striped li:nth-of-type(2n+2):after { + content: none; + } + .my-sites li:nth-of-type(4n+1), + .my-sites li:nth-of-type(4n+2) { + background-color: #f9f9f9; + } + +} + +@media only screen and (min-width: 700px) and (max-width: 1199px) { + .my-sites li { + float: right; + width: 27.333333%; + background-color: #fff; + } + .my-sites.striped li:nth-of-type(3n+3):after { + content: none; + } + .my-sites li:nth-of-type(6n+1), + .my-sites li:nth-of-type(6n+2), + .my-sites li:nth-of-type(6n+3) { + background-color: #f9f9f9; + } +} + +@media only screen and (min-width: 1200px) and (max-width: 1399px) { + .my-sites li { + float: right; + width: 21%; + padding: 8px 2%; + background-color: #fff; + } + .my-sites.striped li:nth-of-type(4n+1) { + clear: right; + } + .my-sites.striped li:nth-of-type(4n+4):after { + content: none; + } + .my-sites li:nth-of-type(8n+1), + .my-sites li:nth-of-type(8n+2), + .my-sites li:nth-of-type(8n+3), + .my-sites li:nth-of-type(8n+4) { + background-color: #f9f9f9; + } +} + +@media only screen and (min-width: 1400px) and (max-width: 1599px) { + .my-sites li { + float: right; + width: 16%; + padding: 8px 2%; + background-color: #fff; + } + .my-sites.striped li:nth-of-type(5n+1) { + clear: right; + } + .my-sites.striped li:nth-of-type(5n+5):after { + content: none; + } + .my-sites li:nth-of-type(10n+1), + .my-sites li:nth-of-type(10n+2), + .my-sites li:nth-of-type(10n+3), + .my-sites li:nth-of-type(10n+4), + .my-sites li:nth-of-type(10n+5) { + background-color: #f9f9f9; + } +} + +@media only screen and (min-width: 1600px) { + .my-sites li { + float: right; + width: 12.666666%; + padding: 8px 2%; + background-color: #fff; + } + .my-sites.striped li:nth-of-type(6n+1) { + clear: right; + } + .my-sites.striped li:nth-of-type(6n+6):after { + content: none; + } + .my-sites li:nth-of-type(12n+1), + .my-sites li:nth-of-type(12n+2), + .my-sites li:nth-of-type(12n+3), + .my-sites li:nth-of-type(12n+4), + .my-sites li:nth-of-type(12n+5), + .my-sites li:nth-of-type(12n+6) { + background-color: #f9f9f9; + } +} + +.my-sites li a { + text-decoration: none; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + /* Back-compat for pre-3.8 */ + div.star-holder, + div.star-holder .star-rating { + background: url(../images/stars-2x.png?ver=20121108) repeat-x bottom left; + background-size: 21px 37px; + } + + .spinner { + background-image: url(../images/spinner-2x.gif); + } + + /* @todo: evaluate - most of these were likely replaced by dashicons */ + .curtime #timestamp, + #screen-meta-links a.show-settings, + .widget-top .widget-action, + .widget-top .widget-action:hover, + .sidebar-name .toggle-indicator, + .sidebar-name:hover .toggle-indicator, + .meta-box-sortables .postbox:hover .handlediv, + #bulk-titles div a, + #bulk-titles div a:hover { + background: none !important; + } + +} + +@-ms-viewport { + width: device-width; +} + +@media screen and (max-width: 782px) { + html.wp-toolbar { + padding-top: 46px; + } + + .screen-reader-shortcut:focus { + top: -39px; + } + + body { + min-width: 240px; + overflow-x: hidden; + } + + body * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important; + } + + #wpcontent { + position: relative; + margin-right: 0; + padding-right: 10px; + } + + #wpbody-content { + padding-bottom: 100px; + } + + .wrap { + clear: both; + margin-left: 12px; + margin-right: 0; + } + + /* categories */ + #col-left, + #col-right { + float: none; + width: auto; + } + + #col-left .col-wrap, + #col-right .col-wrap { + padding: 0; + } + + /* Hidden Elements */ + #collapse-menu, + .post-format-select { + display: none !important; + } + + .wrap h1.wp-heading-inline { + margin-bottom: 0.5em; + } + + .wrap .add-new-h2, /* deprecated */ + .wrap .add-new-h2:active, /* deprecated */ + .wrap .page-title-action, + .wrap .page-title-action:active { + padding: 10px 15px; + font-size: 14px; + white-space: nowrap; + } + + /* Feedback Messages */ + .notice, + .wrap div.updated, + .wrap div.error, + .media-upload-form div.error { + margin: 20px 0 10px 0; + padding: 5px 10px; + font-size: 14px; + line-height: 175%; + } + + .wp-core-ui .notice.is-dismissible { + padding-left: 46px; + } + + .notice-dismiss { + padding: 13px; + } + + .wrap .icon32 + h2 { + margin-top: -2px; + } + + .wp-responsive-open #wpbody { + left: -16em; + } + + code { + word-wrap: break-word; + word-wrap: anywhere; /* Firefox. Allow breaking long words anywhere */ + word-break: break-word; /* Webkit: Treated similarly to word-wrap: break-word */ + } + + /* General Metabox */ + .postbox { + font-size: 14px; + } + + .metabox-holder h3.hndle, /* Back-compat for pre-4.4 */ + .metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */ + .metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */ + .metabox-holder h2 { + padding: 12px; + } + + .postbox .handlediv { + margin-top: 3px; + } + + /* Subsubsub Nav */ + .subsubsub { + font-size: 16px; + text-align: center; + margin-bottom: 15px; + } + + /* Theme/Plugin File Editor */ + + #template textarea, + #template .CodeMirror { + box-sizing: border-box; + } + + #templateside { + float: none; + width: auto; + } + + #templateside > ul { + border-right: 1px solid #ddd; + } + + #templateside li { + margin: 0; + } + + #templateside li:not(.howto) a { + display: block; + padding: 5px; + } + #templateside li.howto { + padding: 12px; + } + + #templateside .highlight { + padding: 5px; + margin-right: -5px; + margin-top: -5px; + } + + #template > div, + #template .notice { + float: none; + margin: 1em 0; + width: auto; + } + + #template .CodeMirror, + #template textarea { + width: 100%; + } + + #templateside ul ul { + padding-right: 1.5em; + } + [role="treeitem"] .folder-label { + display: block; + padding: 5px; + } + .tree-folder > li::before, + .tree-folder > li::after, + .tree-folder .tree-folder::after { + right: -8px; + } + .tree-folder > li::before { + top: 0px; + height: 13px; + } + .tree-folder > .current-file::before { + right: -5px; + top: 7px; + width: 4px; + } + .tree-folder > .current-file::after { + height: 9px; + right: -8px; + } + .wrap #templateside span.notice { + margin-right: -5px; + width: 100%; + } + + .fileedit-sub .alignright { + float: right; + margin-top: 15px; + width: 100%; + text-align: right; + } + + .fileedit-sub .alignright label { + display: block; + } + + .fileedit-sub #theme, + .fileedit-sub #plugin { + margin-right: 0; + max-width: 70%; + } + + .fileedit-sub input[type="submit"] { + margin-bottom: 0; + } + + #documentation label[for="docs-list"] { + display: block; + } + + #documentation select[name="docs-list"] { + margin-right: 0; + max-width: 60%; + } + + #documentation input[type="button"] { + margin-bottom: 0; + } + + #wpfooter { + display: none; + } + + #comments-form .checkforspam { + display: none; + } + + .edit-comment-author { + margin: 2px 0 0; + } + + .filter-drawer .filter-group-feature input, + .filter-drawer .filter-group-feature label { + line-height: 2.1; + } + + .filter-drawer .filter-group-feature label { + margin-right: 32px; + } + + .wp-filter .button.drawer-toggle { + font-size: 13px; + line-height: 2; + height: 28px; + } + + /* Fix help tab columns for smaller screens */ + #screen-meta #contextual-help-wrap { + overflow: visible; + } + + #screen-meta #contextual-help-back, + #screen-meta .contextual-help-sidebar { + display: none; + } + + #screen-meta .contextual-help-tabs { + clear: both; + width: 100%; + float: none; + } + + #screen-meta .contextual-help-tabs ul { + margin: 0 0 1em; + padding: 1em 0 0; + } + + #screen-meta .contextual-help-tabs .active { + margin: 0; + } + + #screen-meta .contextual-help-tabs-wrap { + clear: both; + max-width: 100%; + float: none; + } + + #screen-meta-links { + margin-bottom: 20px; /* Add margins beneath links for better spacing between boxes and elements */ + } + + .wp-filter .search-form input[type="search"] { + font-size: 1rem; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + /* Disable horizontal scroll when responsive menu is open + since we push the main content off to the right. */ + #wpwrap.wp-responsive-open { + overflow-x: hidden; + } + + html.wp-toolbar { + padding-top: 0; + } + + .screen-reader-shortcut:focus { + top: 7px; + } + + #wpbody { + padding-top: 46px; + } + + /* Keep full-width boxes on Edit Post page from causing horizontal scroll */ + div#post-body.metabox-holder.columns-1 { + overflow-x: hidden; + } + + h1.nav-tab-wrapper, + .wrap h2.nav-tab-wrapper, + .nav-tab-wrapper { + border-bottom: 0; + } + + h1 .nav-tab, + h2 .nav-tab, + h3 .nav-tab, + nav .nav-tab { + margin: 10px 0 0 10px; + border-bottom: 1px solid #ccc; + } + + .nav-tab-active:hover, + .nav-tab-active:focus, + .nav-tab-active:focus:active { + border-bottom: 1px solid #ccc; + } + + .wp-filter .search-form input[type="search"] { + width: 100%; + } +} + +@media screen and (max-width: 320px) { + /* Prevent default center alignment and larger font for the Right Now widget when + the network dashboard is viewed on a small mobile device. */ + #network_dashboard_right_now .subsubsub { + font-size: 14px; + text-align: right; + } +} diff --git a/wp-admin/css/common-rtl.min.css b/wp-admin/css/common-rtl.min.css new file mode 100644 index 0000000..ae04849 --- /dev/null +++ b/wp-admin/css/common-rtl.min.css @@ -0,0 +1,9 @@ +/*! This file is auto-generated */ +#wpwrap{height:auto;min-height:100%;width:100%;position:relative;-webkit-font-smoothing:subpixel-antialiased}#wpcontent{height:100%;padding-right:20px}#wpcontent,#wpfooter{margin-right:160px}.folded #wpcontent,.folded #wpfooter{margin-right:36px}#wpbody-content{padding-bottom:65px;float:right;width:100%;overflow:visible!important}.inner-sidebar{float:left;clear:left;display:none;width:281px;position:relative}.columns-2 .inner-sidebar{margin-left:auto;width:286px;display:block}.columns-2 .inner-sidebar #side-sortables,.inner-sidebar #side-sortables{min-height:300px;width:280px;padding:0}.has-right-sidebar .inner-sidebar{display:block}.has-right-sidebar #post-body{float:right;clear:right;width:100%;margin-left:-2000px}.has-right-sidebar #post-body-content{margin-left:300px;float:none;width:auto}#col-left{float:right;width:35%}#col-right{float:left;width:65%}#col-left .col-wrap{padding:0 0 0 6px}#col-right .col-wrap{padding:0 6px 0 0}.alignleft{float:right}.alignright{float:left}.textleft{text-align:right}.textright{text-align:left}.clear{clear:both}.wp-clearfix:after{content:"";display:table;clear:both}.screen-reader-text,.screen-reader-text span,.ui-helper-hidden-accessible{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;width:1px;word-wrap:normal!important}.button .screen-reader-text{height:auto}.screen-reader-shortcut{position:absolute;top:-1000em}.screen-reader-shortcut:focus{right:6px;top:-25px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#0073aa;z-index:100000;line-height:normal;box-shadow:0 0 2px 2px rgba(0,0,0,.6);text-decoration:none;outline:2px solid transparent;outline-offset:-2px}.hidden,.js .closed .inside,.js .hide-if-js,.js .wp-core-ui .hide-if-js,.js.wp-core-ui .hide-if-js,.no-js .hide-if-no-js,.no-js .wp-core-ui .hide-if-no-js,.no-js.wp-core-ui .hide-if-no-js{display:none}#menu-management .menu-edit,#menu-settings-column .accordion-container,.comment-ays,.feature-filter,.imgedit-group,.manage-menus,.menu-item-handle,.popular-tags,.stuffbox,.widget-inside,.widget-top,.widgets-holder-wrap,.wp-editor-container,p.popular-tags,table.widefat{border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04)}.comment-ays,.feature-filter,.imgedit-group,.popular-tags,.stuffbox,.widgets-holder-wrap,.wp-editor-container,p.popular-tags,table.widefat{background:#fff}body,html{height:100%;margin:0;padding:0}body{background:#f1f1f1;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.4em;min-width:600px}body.iframe{min-width:0;padding-top:1px}body.modal-open{overflow:hidden}body.mobile.modal-open #wpwrap{overflow:hidden;position:fixed;height:100%}iframe,img{border:0}td{font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit}a{color:#0073aa;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}a,div{outline:0}a:active,a:hover{color:#00a0d2}.wp-person a:focus .gravatar,a:focus,a:focus .media-icon img{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:1px solid transparent}.ie8 a:focus{outline:#5b9dd9 solid 1px}#adminmenu a:focus{box-shadow:none;outline:1px solid transparent;outline-offset:-1px}.screen-reader-text:focus{box-shadow:none;outline:0}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}p{font-size:13px;line-height:1.5;margin:1em 0}blockquote{margin:1em}dd,li{margin-bottom:6px}h1,h2,h3,h4,h5,h6{display:block;font-weight:600}h1{color:#23282d;font-size:2em;margin:.67em 0}h2,h3{color:#23282d;font-size:1.3em;margin:1em 0}.update-core-php h2{margin-top:2em}.update-messages h2,.update-php h2,h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}ol,ul{padding:0}ul{list-style:none}ol{list-style-type:decimal;margin-right:2em}ul.ul-disc{list-style:disc outside}ul.ul-square{list-style:square outside}ol.ol-decimal{list-style:decimal outside}ol.ol-decimal,ul.ul-disc,ul.ul-square{margin-right:1.8em}ol.ol-decimal>li,ul.ul-disc>li,ul.ul-square>li{margin:0 0 .5em}.ltr{direction:ltr}.code,code{font-family:Consolas,Monaco,monospace;direction:ltr;unicode-bidi:embed}code,kbd{padding:3px 5px 2px 5px;margin:0 1px;background:#eaeaea;background:rgba(0,0,0,.07);font-size:13px}.subsubsub{list-style:none;margin:8px 0 0;padding:0;font-size:13px;float:right;color:#666}.subsubsub a{line-height:2;padding:.2em;text-decoration:none}.subsubsub a .count,.subsubsub a.current .count{color:#555d66;font-weight:400}.subsubsub a.current{font-weight:600;border:none}.subsubsub li{display:inline-block;margin:0;padding:0;white-space:nowrap}.wp-die-message{font-size:13px;line-height:1.5;margin:1em 0}.widefat{border-spacing:0;width:100%;clear:both;margin:0}.widefat *{word-wrap:break-word}.widefat a,.widefat button.button-link{text-decoration:none}.widefat td,.widefat th{padding:8px 10px}.widefat thead td,.widefat thead th{border-bottom:1px solid #ccd0d4}.widefat tfoot td,.widefat tfoot th{border-top:1px solid #ccd0d4;border-bottom:none}.widefat .no-items td{border-bottom-width:0}.widefat td{vertical-align:top}.widefat td,.widefat td ol,.widefat td p,.widefat td ul{font-size:13px;line-height:1.5em}.widefat tfoot td,.widefat th,.widefat thead td{text-align:right;line-height:1.3em;font-size:14px}.updates-table td input,.widefat tfoot td input,.widefat th input,.widefat thead td input{margin:0 8px 0 0;padding:0;vertical-align:text-top}.widefat .check-column{width:2.2em;padding:6px 0 25px;vertical-align:top}.widefat tbody th.check-column{padding:9px 0 22px}.updates-table tbody td.check-column,.widefat tbody th.check-column,.widefat tfoot td.check-column,.widefat thead td.check-column{padding:11px 3px 0 0}.widefat tfoot td.check-column,.widefat thead td.check-column{padding-top:4px;vertical-align:middle}.update-php div.error,.update-php div.updated{margin-right:0}.no-js .widefat tfoot .check-column input,.no-js .widefat thead .check-column input{display:none}.column-comments,.column-links,.column-posts,.widefat .num{text-align:center}.widefat th#comments{vertical-align:middle}.wrap{margin:10px 2px 0 20px}.wrap.block-editor-no-js{padding-right:20px}.postbox .inside h2,.wrap [class$=icon32]+h2,.wrap h1,.wrap>h2:first-child{font-size:23px;font-weight:400;margin:0;padding:9px 0 4px 0;line-height:1.3}.wrap h1.wp-heading-inline{display:inline-block;margin-left:5px}.wp-header-end{visibility:hidden;margin:-2px 0 0}.subtitle{margin:0;padding-right:25px;color:#555d66;font-size:14px;font-weight:400;line-height:1}.wrap .add-new-h2,.wrap .add-new-h2:active,.wrap .page-title-action,.wrap .page-title-action:active{margin-right:4px;padding:4px 8px;position:relative;top:-3px;text-decoration:none;border:1px solid #0071a1;border-radius:2px;text-shadow:none;font-weight:600;font-size:13px;line-height:normal;color:#0071a1;background:#f3f5f6;cursor:pointer}.wrap .wp-heading-inline+.page-title-action{margin-right:0}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{background:#f1f1f1;border-color:#016087;color:#016087}.page-title-action:focus{color:#016087}.form-table th label[for=WPLANG] .dashicons,.form-table th label[for=locale] .dashicons{margin-right:5px}.wrap .page-title-action:focus{border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.wrap h1.long-header{padding-left:0}.wp-dialog{background-color:#fff}#available-widgets .widget-top:hover,#widgets-left .widget-in-question .widget-top,#widgets-left .widget-top:hover,.widgets-chooser ul,div#widgets-right .widget-top:hover{border-color:#999;box-shadow:0 1px 2px rgba(0,0,0,.1)}.sorthelper{background-color:#ccf3fa}.ac_match,.subsubsub a.current{color:#000}.alternate,.striped>tbody>:nth-child(odd),ul.striped>:nth-child(odd){background-color:#f9f9f9}.bar{background-color:#e8e8e8;border-left-color:#99d}.highlight{background-color:#e4f2fd;color:#000}.wp-ui-primary{color:#fff;background-color:#32373c}.wp-ui-text-primary{color:#32373c}.wp-ui-highlight{color:#fff;background-color:#1e8cbe}.wp-ui-text-highlight{color:#1e8cbe}.wp-ui-notification{color:#fff;background-color:#d54e21}.wp-ui-text-notification{color:#d54e21}.wp-ui-text-icon{color:#82878c}img.emoji{display:inline!important;border:none!important;height:1em!important;width:1em!important;margin:0 .07em!important;vertical-align:-.1em!important;background:0 0!important;padding:0!important;box-shadow:none!important}#nav-menu-footer,#nav-menu-header,#your-profile #rich_editing,.checkbox,.control-section .accordion-section-title,.menu-item-handle,.postbox .hndle,.side-info,.sidebar-name,.stuffbox .hndle,.widefat tfoot td,.widefat tfoot th,.widefat thead td,.widefat thead th,.widget .widget-top{line-height:1.4em}.menu-item-handle,.widget .widget-top{background:#fafafa;color:#23282d}.postbox .hndle,.stuffbox .hndle{border-bottom:1px solid #ccd0d4}.quicktags{background-color:#ccc;color:#000;font-size:12px}.icon32{display:none}#bulk-titles div a:before,.notice-dismiss:before,.tagchecklist .ntdelbutton .remove-tag-icon:before,.welcome-panel .welcome-panel-close:before{background:0 0;color:#72777c;content:"\f153";display:block;font:normal 16px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.welcome-panel .welcome-panel-close:before{margin:0}#bulk-titles div a:before{margin:1px 0}.tagchecklist .ntdelbutton .remove-tag-icon:before{margin-right:2px;border-radius:50%;color:#0073aa;line-height:1.28}.tagchecklist .ntdelbutton:focus{outline:0}#bulk-titles div a:focus:before,#bulk-titles div a:hover:before,.tagchecklist .ntdelbutton:focus .remove-tag-icon:before,.tagchecklist .ntdelbutton:hover .remove-tag-icon:before,.welcome-panel .welcome-panel-close:focus:before,.welcome-panel .welcome-panel-close:hover:before{color:#c00}.tagchecklist .ntdelbutton:focus .remove-tag-icon:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.key-labels label{line-height:24px}b,strong{font-weight:600}.pre{white-space:pre-wrap;word-wrap:break-word}.howto{color:#666;font-style:italic;display:block}p.install-help{margin:8px 0;font-style:italic}.no-break{white-space:nowrap}hr{border:0;border-top:1px solid #ddd;border-bottom:1px solid #fafafa}#all-plugins-table .plugins a.delete,#delete-link a.delete,#media-items a.delete,#media-items a.delete-permanently,#nav-menu-footer .menu-delete,#search-plugins-table .plugins a.delete,.plugins a.delete,.row-actions span.delete a,.row-actions span.spam a,.row-actions span.trash a,.submitbox .submitdelete{color:#a00}#all-plugins-table .plugins a.delete:hover,#delete-link a.delete:hover,#media-items a.delete-permanently:hover,#media-items a.delete:hover,#nav-menu-footer .menu-delete:hover,#search-plugins-table .plugins a.delete:hover,.file-error,.plugins a.delete:hover,.row-actions .delete a:hover,.row-actions .spam a:hover,.row-actions .trash a:hover,.submitbox .submitdelete:hover,abbr.required,span.required{color:#dc3232;border:none}#major-publishing-actions{padding:10px;clear:both;border-top:1px solid #ddd;background:#f5f5f5}#delete-action{float:right;line-height:2.30769231}#delete-link{line-height:2.30769231;vertical-align:middle;text-align:right;margin-right:8px}#delete-link a{text-decoration:none}#publishing-action{text-align:left;float:left;line-height:1.9}#publishing-action .spinner{float:none;margin-top:5px}#misc-publishing-actions{padding:6px 0 0}.misc-pub-section{padding:6px 10px 8px}.misc-pub-filename{word-wrap:break-word}#minor-publishing-actions{padding:10px 10px 0 10px;text-align:left}#save-post{float:right}.preview{float:left}#sticky-span{margin-right:18px}.approve,.unapproved .unapprove{display:none}.spam .approve,.trash .approve,.unapproved .approve{display:inline}td.action-links,th.action-links{text-align:left}#misc-publishing-actions .notice{margin-right:10px;margin-left:10px}.wp-filter{display:inline-block;position:relative;box-sizing:border-box;margin:12px 0 25px;padding:0 10px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.04);border:1px solid #ccd0d4;background:#fff;color:#555;font-size:13px}.wp-filter a{text-decoration:none}.filter-count{display:inline-block;vertical-align:middle;min-width:4em}.filter-count .count,.title-count{display:inline-block;position:relative;top:-1px;padding:4px 10px;border-radius:30px;background:#72777c;color:#fff;font-size:14px;font-weight:600}.title-count{display:inline;top:-3px;margin-right:5px;margin-left:20px}.filter-items{float:right}.filter-links{display:inline-block;margin:0}.filter-links li{display:inline-block;margin:0}.filter-links li>a{display:inline-block;margin:0 10px;padding:15px 0;border-bottom:4px solid #fff;color:#666;cursor:pointer}.filter-links .current{box-shadow:none;border-bottom:4px solid #666;color:#23282d}.filter-links li>a:focus,.filter-links li>a:hover,.show-filters .filter-links a.current:focus,.show-filters .filter-links a.current:hover{color:#00a0d2}.wp-filter .search-form{float:left;margin:10px 0}.wp-filter .search-form input[type=search]{margin:1px 0;width:280px;max-width:100%}.wp-filter .search-form select{margin:0}.wp-filter .search-form.search-plugins{display:inline-block}.wp-filter .button.drawer-toggle{margin:10px 9px 0;padding:0 6px 0 10px;border-color:transparent;background-color:transparent;color:#666;vertical-align:baseline;box-shadow:none}.wp-filter .drawer-toggle:before{content:"\f111";margin:0 0 0 5px;color:#72777c;font:normal 16px/1 dashicons;vertical-align:text-bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-filter .button.drawer-toggle:focus,.wp-filter .button.drawer-toggle:hover,.wp-filter .drawer-toggle:focus:before,.wp-filter .drawer-toggle:hover:before{background-color:transparent;color:#00a0d2}.wp-filter .button.drawer-toggle:focus:active,.wp-filter .button.drawer-toggle:hover{border-color:transparent}.wp-filter .button.drawer-toggle:focus{border-color:#5b9dd9}.wp-filter .button.drawer-toggle:active{background:0 0;box-shadow:none;transform:none}.wp-filter .drawer-toggle.current:before{color:#fff}.filter-drawer,.wp-filter .favorites-form{display:none;margin:0 -20px 0 -10px;padding:20px;border-top:1px solid #eee;background:#fafafa;overflow:hidden}.show-favorites-form .favorites-form,.show-filters .filter-drawer{display:block}.show-filters .filter-links a.current{border-bottom:none}.show-filters .wp-filter .button.drawer-toggle{border-radius:2px;background:#72777c;color:#fff}.show-filters .wp-filter .drawer-toggle:focus,.show-filters .wp-filter .drawer-toggle:hover{background:#2ea2cc}.show-filters .wp-filter .drawer-toggle:before{color:#fff}.filter-group{box-sizing:border-box;position:relative;float:right;margin:0 0 0 1%;padding:20px 10px 10px;width:24%;background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04)}.filter-group legend{position:absolute;top:10px;display:block;margin:0;padding:0;font-size:1em;font-weight:600}.filter-drawer .filter-group-feature{margin:28px 0 0;list-style-type:none;font-size:12px}.filter-drawer .filter-group-feature input,.filter-drawer .filter-group-feature label{line-height:1.4}.filter-drawer .filter-group-feature input{position:absolute;margin:0}.filter-group .filter-group-feature label{display:block;margin:14px 23px 14px 0}.filter-drawer .buttons{clear:both;margin-bottom:20px}.filter-drawer .filter-group+.buttons{margin-bottom:0;padding-top:20px}.filter-drawer .buttons .button span{display:inline-block;opacity:.8;font-size:12px;text-indent:10px}.wp-filter .button.clear-filters{display:none;margin-right:10px}.wp-filter .button-link.edit-filters{padding:0 5px;line-height:2.2}.filtered-by{display:none;margin:0}.filtered-by>span{font-weight:600}.filtered-by a{margin-right:10px}.filtered-by .tags{display:inline}.filtered-by .tag{margin:0 5px;padding:4px 8px;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;font-size:11px}.filters-applied .filter-drawer .buttons,.filters-applied .filter-drawer br,.filters-applied .filter-group{display:none!important}.filters-applied .filtered-by{display:block}.filters-applied .filter-drawer{padding:20px}.error .content-filterable,.loading-content .content-filterable,.show-filters .content-filterable,.show-filters .favorites-form,.show-filters.filters-applied.loading-content .content-filterable{display:none}.show-filters.filters-applied .content-filterable{display:block}.loading-content .spinner{display:block;margin:40px auto 0;float:none}@media only screen and (max-width:1120px){.filter-drawer{border-bottom:1px solid #eee}.filter-group{margin-bottom:0;margin-top:5px;width:100%}.filter-group li{margin:10px 0}}@media only screen and (max-width:1000px){.filter-items{float:none}.wp-filter .media-toolbar-primary,.wp-filter .media-toolbar-secondary,.wp-filter .search-form{float:none;position:relative;max-width:100%}}@media only screen and (max-width:782px){.filter-group li{padding:0;width:50%}}@media only screen and (max-width:320px){.filter-count{display:none}.wp-filter .drawer-toggle{margin:10px 0}.filter-group li,.wp-filter .search-form input[type=search]{width:100%}}.notice,div.error,div.updated{background:#fff;border:1px solid #ccd0d4;border-right-width:4px;box-shadow:0 1px 1px rgba(0,0,0,.04);margin:5px 15px 2px;padding:1px 12px}div[class=update-message]{padding:.5em 0 .5em 12px}.form-table td .notice p,.notice p,.notice-title,div.error p,div.updated p{margin:.5em 0;padding:2px}.error a{text-decoration:underline}.updated a{padding-bottom:2px}.notice-alt{box-shadow:none}.notice-large{padding:10px 20px}.notice-title{display:inline-block;color:#23282d;font-size:18px}.wp-core-ui .notice.is-dismissible{padding-left:38px;position:relative}.notice-dismiss{position:absolute;top:0;left:1px;border:none;margin:0;padding:9px;background:0 0;color:#72777c;cursor:pointer}.notice-dismiss:active:before,.notice-dismiss:focus:before,.notice-dismiss:hover:before{color:#c00}.notice-dismiss:focus{outline:0;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.ie8 .notice-dismiss:focus{outline:1px solid #5b9dd9}.notice-success,div.updated{border-right-color:#46b450}.notice-success.notice-alt{background-color:#ecf7ed}.notice-warning{border-right-color:#ffb900}.notice-warning.notice-alt{background-color:#fff8e5}.notice-error,div.error{border-right-color:#dc3232}.notice-error.notice-alt{background-color:#fbeaea}.notice-info{border-right-color:#00a0d2}.notice-info.notice-alt{background-color:#e5f5fa}.button.installed:before,.button.installing:before,.button.updated-message:before,.button.updating-message:before,.import-php .updating-message:before,.update-message p:before,.updated-message p:before,.updating-message p:before{display:inline-block;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.media-upload-form .notice,.media-upload-form div.error,.wrap .notice,.wrap div.error,.wrap div.updated{margin:5px 0 15px}.wrap #templateside .notice{display:block;margin:0;padding:5px 8px;font-weight:600;text-decoration:none}.wrap #templateside span.notice{margin-right:-12px}#templateside li.notice a{padding:0}.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.update-message p:before,.updating-message p:before{color:#f56e28;content:"\f463"}.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.updating-message p:before{animation:rotation 2s infinite linear}.button.updated-message:before,.installed p:before,.updated-message p:before{color:#79ba49;content:"\f147"}.update-message.notice-error p:before{color:#dc3232;content:"\f534"}.import-php .updating-message:before,.wrap .notice p:before{margin-left:6px;vertical-align:bottom}#update-nag,.update-nag{display:inline-block;line-height:1.4;padding:11px 15px;font-size:14px;text-align:right;margin:25px 2px 0 20px;background-color:#fff;border-right:4px solid #ffba00;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}ul#dismissed-updates{display:none}#dismissed-updates li>p{margin-top:0}#dismiss,#undismiss{margin-right:.5em}form.upgrade{margin-top:8px}form.upgrade .hint{font-style:italic;font-size:85%;margin:-.5em 0 2em 0}.update-php .spinner{float:none;margin:-4px 0}#ajax-loading,.ajax-feedback,.ajax-loading,.imgedit-wait-spin,.list-ajax-loading{visibility:hidden}#ajax-response.alignleft{margin-right:2em}.button.installed:before,.button.installing:before,.button.updated-message:before,.button.updating-message:before{margin:3px -2px 0 5px}.button-primary.updating-message:before{color:#fff}.button-primary.updated-message:before{color:#66c6e4}.button.updated-message{transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}@media aural{.button.installed:before,.button.installing:before,.update-message p:before,.wrap .notice p:before{speak:none}}#adminmenu a,#catlist a,#taglist a{text-decoration:none}#contextual-help-wrap,#screen-options-wrap{margin:0;padding:8px 20px 12px;position:relative}#contextual-help-wrap{overflow:auto;margin-right:0!important}#screen-meta-links{float:left;margin:0 0 0 20px}#screen-meta{display:none;margin:0 0 -1px 20px;position:relative;background-color:#fff;border:1px solid #ccd0d4;border-top:none;box-shadow:0 0 0 transparent}#contextual-help-link-wrap,#screen-options-link-wrap{float:right;margin:0 6px 0 0}#screen-meta-links .screen-meta-toggle{position:relative;top:0}#screen-meta-links .show-settings{border:1px solid #ccd0d4;border-top:none;height:auto;margin-bottom:0;padding:3px 16px 3px 6px;background:#fff;border-radius:0 0 4px 4px;color:#72777c;line-height:1.7;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear}#screen-meta-links .show-settings:active,#screen-meta-links .show-settings:focus,#screen-meta-links .show-settings:hover{color:#32373c}#screen-meta-links .show-settings:focus{border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}#screen-meta-links .show-settings:active{transform:none}#screen-meta-links .show-settings:after{left:0;content:"\f140";font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 0 0 5px;bottom:2px;position:relative;vertical-align:bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#72777c}#screen-meta-links .screen-meta-active:after{content:"\f142"}.toggle-arrow{background-repeat:no-repeat;background-position:top right;background-color:transparent;height:22px;line-height:22px;display:block}.toggle-arrow-active{background-position:bottom right}#contextual-help-wrap h5,#screen-options-wrap h5,#screen-options-wrap legend{margin:0;padding:8px 0;font-size:13px;font-weight:600}.ie8 #screen-options-wrap legend{color:inherit}.metabox-prefs label{display:inline-block;padding-left:15px;line-height:2.35}#number-of-columns{display:inline-block;vertical-align:middle;line-height:30px}.metabox-prefs input[type=checkbox]{margin-top:0;margin-left:6px}.metabox-prefs label input,.metabox-prefs label input[type=checkbox]{margin:-4px 0 0 5px}.metabox-prefs .columns-prefs label input{margin:-1px 0 0 2px}.metabox-prefs label a{display:none}.metabox-prefs .screen-options input,.metabox-prefs .screen-options label{margin-top:0;margin-bottom:0;vertical-align:middle}.metabox-prefs .screen-options .screen-per-page{margin-left:15px}.metabox-prefs .screen-options label{line-height:2.2;padding-left:0}.screen-options+.screen-options{margin-top:10px}.metabox-prefs .submit{margin-top:1em;padding:0}#contextual-help-wrap{padding:0}#contextual-help-columns{position:relative}#contextual-help-back{position:absolute;top:0;bottom:0;right:150px;left:170px;border:1px solid #ccd0d4;border-top:none;border-bottom:none;background:#f6fbfd}#contextual-help-wrap.no-sidebar #contextual-help-back{left:0;border-left-width:0;border-bottom-left-radius:2px}.contextual-help-tabs{float:right;width:150px;margin:0}.contextual-help-tabs ul{margin:1em 0}.contextual-help-tabs li{margin-bottom:0;list-style-type:none;border-style:solid;border-width:0 2px 0 0;border-color:transparent}.contextual-help-tabs a{display:block;padding:5px 12px 5px 5px;line-height:1.4;text-decoration:none;border:1px solid transparent;border-left:none;border-right:none}.contextual-help-tabs a:hover{color:#32373c}.contextual-help-tabs .active{padding:0;margin:0 0 0 -1px;border-right:2px solid #00a0d2;background:#f6fbfd;box-shadow:0 2px 0 rgba(0,0,0,.02),0 1px 0 rgba(0,0,0,.02)}.contextual-help-tabs .active a{border-color:#ccd0d4;color:#32373c}.contextual-help-tabs-wrap{padding:0 20px;overflow:auto}.help-tab-content{display:none;margin:0 0 12px 22px;line-height:1.6}.help-tab-content.active{display:block}.help-tab-content ul li{list-style-type:disc;margin-right:18px}.contextual-help-sidebar{width:150px;float:left;padding:0 12px 0 8px;overflow:auto}html.wp-toolbar{padding-top:32px;box-sizing:border-box}.widefat td,.widefat th{color:#555}.widefat tfoot td,.widefat th,.widefat thead td{font-weight:400}.widefat tfoot tr td,.widefat tfoot tr th,.widefat thead tr td,.widefat thead tr th{color:#32373c}.widefat td p{margin:2px 0 .8em}.widefat ol,.widefat p,.widefat ul{color:#32373c}.widefat .column-comment p{margin:.6em 0}.widefat .column-comment ul{list-style:initial;margin-right:2em}.postbox-container{float:right}.postbox-container .meta-box-sortables{box-sizing:border-box}#wpbody-content .metabox-holder{padding-top:10px}.metabox-holder .postbox-container .empty-container{border:3px dashed #b4b9be;height:250px;position:relative}.metabox-holder .postbox-container .empty-container:after{content:attr(data-emptystring);margin:auto;position:absolute;top:0;right:0;bottom:0;left:0;height:1em;width:200px;text-align:center;color:#ccc;font-size:18px;display:none}.columns-2 #postbox-container-3 .empty-container,.columns-2 #postbox-container-4 .empty-container,.columns-3 #postbox-container-4 .empty-container,.metabox-holder.columns-1 .postbox-container .empty-container{border:0 none;height:0;min-height:0}#post-body-content{width:100%;min-width:463px;float:right}#post-body.columns-2 #postbox-container-1{float:left;margin-left:-300px;width:280px}#post-body.columns-2 #side-sortables{min-height:250px}@media only screen and (max-width:799px){#wpbody-content .metabox-holder .postbox-container .empty-container{border:0 none;height:0;min-height:0}}.js .postbox .hndle,.js .widget .widget-top{cursor:move}.js .postbox .hndle.is-non-sortable,.js .widget .widget-top.is-non-sortable{cursor:auto}.hndle a{font-size:11px;font-weight:400}.postbox .handlediv{display:none;float:left;width:36px;height:36px;margin:0;padding:0;border:0;background:0 0;cursor:pointer}.js .postbox .handlediv{display:block}.sortable-placeholder{border:1px dashed #b4b9be;margin-bottom:20px}.postbox,.stuffbox{margin-bottom:20px;padding:0;line-height:1}.postbox .hndle,.stuffbox .hndle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.postbox .inside{padding:0 12px 12px;line-height:1.4;font-size:13px}.stuffbox .inside{padding:0;line-height:1.4;font-size:13px;margin-top:0}.postbox .inside{margin:11px 0;position:relative}.postbox .inside>p:last-child,.rss-widget ul li:last-child{margin-bottom:1px!important}.postbox.closed h3{border:none;box-shadow:none}.postbox table.form-table{margin-bottom:0}.postbox table.widefat{box-shadow:none}.temp-border{border:1px dotted #ccc}.columns-prefs label{padding:0 0 0 10px}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover,#comment-status-display,#dashboard_right_now .versions .b,#ed_reply_toolbar #ed_reply_strong,#pass-strength-result.short,#pass-strength-result.strong,#post-status-display,#post-visibility-display,.feature-filter .feature-name,.item-controls .item-order a,.media-item .percent,.plugins .name{font-weight:600}#wpfooter{position:absolute;bottom:0;right:0;left:0;padding:10px 20px;color:#555d66}#wpfooter p{font-size:13px;margin:0;line-height:1.55}#footer-thankyou{font-style:italic}.nav-tab{float:right;border:1px solid #ccc;border-bottom:none;margin-right:.5em;padding:5px 10px;font-size:14px;line-height:1.71428571;font-weight:600;background:#e5e5e5;color:#555;text-decoration:none;white-space:nowrap}.nav-tab-small .nav-tab,h3 .nav-tab{padding:5px 14px;font-size:12px;line-height:1.33}.nav-tab:focus,.nav-tab:hover{background-color:#fff;color:#444}.nav-tab-active,.nav-tab:focus:active{box-shadow:none}.nav-tab-active{margin-bottom:-1px;color:#444}.nav-tab-active,.nav-tab-active:focus,.nav-tab-active:focus:active,.nav-tab-active:hover{border-bottom:1px solid #f1f1f1;background:#f1f1f1;color:#000}.nav-tab-wrapper,.wrap h2.nav-tab-wrapper,h1.nav-tab-wrapper{border-bottom:1px solid #ccc;margin:0;padding-top:9px;padding-bottom:0;line-height:inherit}.nav-tab-wrapper:not(.wp-clearfix):after{content:"";display:table;clear:both}.ie8 .nav-tab-wrapper{display:inline-block;width:100%;vertical-align:top}.spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;display:inline-block;visibility:hidden;float:left;vertical-align:middle;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:4px 10px 0}.loading-content .spinner,.spinner.is-active{visibility:visible}#template>div{margin-left:16em}#template .notice{margin-top:1em;margin-left:3%}#template .notice p{width:auto}#template .submit .spinner{float:none}.metabox-holder .postbox>h3,.metabox-holder .stuffbox>h3,.metabox-holder h2.hndle,.metabox-holder h3.hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.nav-menus-php .metabox-holder h3{padding:10px 14px 11px 10px;line-height:1.5}#templateside ul li a{text-decoration:none}.plugin-install #description,.plugin-install-network #description{width:60%}table .column-rating,table .column-visible,table .vers{text-align:right}.attention,.error-message{color:#dc3232;font-weight:600}body.iframe{height:98%}.lp-show-latest p{display:none}.lp-show-latest .lp-error p,.lp-show-latest p:last-child{display:block}.media-icon{width:62px;text-align:center}.media-icon img{border:1px solid #e5e5e5;border:1px solid rgba(0,0,0,.07)}#howto{font-size:11px;margin:0 5px;display:block}.importers{font-size:16px;width:auto}.importers td{padding-left:14px;line-height:1.4}.importers .import-system{max-width:250px}.importers td.desc{max-width:500px}.importer-action,.importer-desc,.importer-title{display:block}.importer-title{color:#000;font-size:14px;font-weight:400;margin-bottom:.2em}.importer-action{line-height:1.55;color:#555;margin-bottom:1em}#post-body #post-body-content #namediv h2,#post-body #post-body-content #namediv h3{margin-top:0}.edit-comment-author{color:#222;border-bottom:1px solid #eee}#namediv h2 label,#namediv h3 label{vertical-align:baseline}#namediv table{width:100%}#namediv td.first{width:10px;white-space:nowrap}#namediv input{width:98%}#namediv p{margin:10px 0}#submitdiv h3{margin-bottom:0!important}.zerosize{height:0;width:0;margin:0;border:0;padding:0;overflow:hidden;position:absolute}br.clear{height:2px;line-height:.15}.checkbox{border:none;margin:0;padding:0}fieldset{border:0;padding:0;margin:0}.post-categories{display:inline;margin:0;padding:0}.post-categories li{display:inline}div.star-holder{position:relative;height:17px;width:100px;background:url(../images/stars.png?ver=20121108) repeat-x bottom left}div.star-holder .star-rating{background:url(../images/stars.png?ver=20121108) repeat-x top left;height:17px;float:right}.star-rating{white-space:nowrap}.star-rating .star{display:inline-block;width:20px;height:20px;-webkit-font-smoothing:antialiased;font-size:20px;line-height:1;font-family:dashicons;text-decoration:inherit;font-weight:400;font-style:normal;vertical-align:top;transition:color .1s ease-in;text-align:center;color:#ffb900}.star-rating .star-full:before{content:"\f155"}.star-rating .star-half:before{content:"\f459"}.rtl .star-rating .star-half{transform:rotateY(180deg)}.star-rating .star-empty:before{content:"\f154"}div.action-links{font-weight:400;margin:6px 0 0}#plugin-information{background:#fff;position:fixed;top:0;left:0;bottom:0;right:0;height:100%;padding:0}#plugin-information-scrollable{overflow:auto;-webkit-overflow-scrolling:touch;height:100%}#plugin-information-title{padding:0 26px;background:#f5f5f5;font-size:22px;font-weight:600;line-height:2.4;position:relative;height:56px}#plugin-information-title.with-banner{margin-left:0;height:250px;background-size:cover}#plugin-information-title h2{font-size:1em;font-weight:600;padding:0;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#plugin-information-title.with-banner h2{position:relative;font-family:"Helvetica Neue",sans-serif;display:inline-block;font-size:30px;line-height:1.68;box-sizing:border-box;max-width:100%;padding:0 15px;margin-top:174px;color:#fff;background:rgba(30,30,30,.9);text-shadow:0 1px 3px rgba(0,0,0,.4);box-shadow:0 0 30px rgba(255,255,255,.1);border-radius:8px}#plugin-information-title div.vignette{display:none}#plugin-information-title.with-banner div.vignette{position:absolute;display:block;top:0;right:0;height:250px;width:100%;background:0 0;box-shadow:inset 0 0 50px 4px rgba(0,0,0,.2),inset 0 -1px 0 rgba(0,0,0,.1)}#plugin-information-tabs{padding:0 16px;position:relative;left:0;right:0;min-height:36px;font-size:0;z-index:1;border-bottom:1px solid #ddd;background:#f3f3f3}#plugin-information-tabs a{position:relative;display:inline-block;padding:9px 10px;margin:0;height:18px;line-height:1.3;font-size:14px;text-decoration:none;transition:none}#plugin-information-tabs a.current{margin:0 -1px -1px;background:#fff;border:1px solid #ddd;border-bottom-color:#fff;padding-top:8px;color:#32373c}#plugin-information-tabs.with-banner a.current{border-top:none;padding-top:9px}#plugin-information-tabs a:active,#plugin-information-tabs a:focus{outline:0}#plugin-information-content{overflow:hidden;background:#fff;position:relative;top:0;left:0;right:0;min-height:100%;min-height:calc(100% - 152px)}#plugin-information-content.with-banner{min-height:calc(100% - 346px)}#section-holder{position:relative;top:0;left:250px;bottom:0;right:0;margin-top:10px;margin-left:250px;padding:10px 26px;margin-bottom:-99939px;padding-bottom:99999px}#section-holder .notice{margin:5px 0 15px}#section-holder .updated{margin:16px 0}#plugin-information .fyi{float:left;position:relative;top:0;left:0;padding:16px;margin-bottom:-99939px;padding-bottom:99999px;width:217px;border-right:1px solid #ddd;background:#f3f3f3;color:#666}#plugin-information .fyi strong{color:#444}#plugin-information .fyi h3{font-weight:600;text-transform:uppercase;font-size:12px;color:#666;margin:24px 0 8px}#plugin-information .fyi h2{font-size:.9em;margin-bottom:0;margin-left:0}#plugin-information .fyi ul{padding:0;margin:0;list-style:none}#plugin-information .fyi li{margin:0 0 10px}#plugin-information .fyi-description{margin-top:0}#plugin-information .counter-container{margin:3px 0}#plugin-information .counter-label{float:right;margin-left:5px;min-width:55px}#plugin-information .counter-back{height:17px;width:92px;background-color:#e5e5e5;float:right}#plugin-information .counter-bar{height:17px;background-color:#ffc733;float:right}#plugin-information .counter-count{margin-right:5px}#plugin-information .fyi ul.contributors{margin-top:10px}#plugin-information .fyi ul.contributors li{display:inline-block;margin-left:8px;vertical-align:middle}#plugin-information .fyi ul.contributors li{display:inline-block;margin-left:8px;vertical-align:middle}#plugin-information .fyi ul.contributors li img{vertical-align:middle;margin-left:4px}#plugin-information-footer{padding:13px 16px;position:absolute;left:0;bottom:0;right:0;height:33px;border-top:1px solid #ddd;background:#f3f3f3}#plugin-information .section{direction:ltr}#plugin-information .section ol,#plugin-information .section ul{list-style-type:disc;margin-left:24px}#plugin-information .section,#plugin-information .section p{font-size:14px;line-height:1.7}#plugin-information #section-screenshots ol{list-style:none;margin:0}#plugin-information #section-screenshots li img{vertical-align:text-top;margin-top:16px;max-width:100%;width:auto;height:auto;box-shadow:0 1px 2px rgba(0,0,0,.3)}#plugin-information #section-screenshots li p{font-style:italic;padding-left:20px}#plugin-information pre{padding:7px;overflow:auto;border:1px solid #ccc}#plugin-information blockquote{border-right:2px solid #ddd;color:#666;font-style:italic;margin:1em 0;padding:0 1em 0 0}#plugin-information .review{overflow:hidden;width:100%;margin-bottom:20px;border-bottom:1px solid #e5e5e5}#plugin-information .review-title-section{overflow:hidden}#plugin-information .review-title-section h4{display:inline-block;float:left;margin:0 6px 0 0}#plugin-information .reviewer-info p{clear:both;margin:0;padding-top:2px}#plugin-information .reviewer-info .avatar{float:left;margin:4px 6px 0 0}#plugin-information .reviewer-info .star-rating{float:left}#plugin-information .review-meta{float:left;margin-left:.75em}#plugin-information .review-body{float:left;width:100%}.plugin-version-author-uri{font-size:13px}.update-php .button.button-primary{margin-left:1em}@media screen and (max-width:771px){#plugin-information-title.with-banner{height:100px}#plugin-information-title.with-banner h2{margin-top:30px;font-size:20px;line-height:2;max-width:85%}#plugin-information-title.with-banner div.vignette{height:100px}#plugin-information-tabs{overflow:hidden;padding:0;height:auto}#plugin-information-tabs a.current{margin-bottom:0;border-bottom:none}#plugin-information .fyi{float:none;border:1px solid #ddd;position:static;width:auto;margin:26px 26px 0;padding-bottom:0}#section-holder{position:static;margin:0;padding-bottom:70px}#plugin-information .fyi h3,#plugin-information .fyi small{display:none}#plugin-information-footer{padding:12px 16px 0;height:46px}}#TB_window.plugin-details-modal{background:#fcfcfc}#TB_window.plugin-details-modal.thickbox-loading:before{content:"";display:block;width:20px;height:20px;position:absolute;right:50%;top:50%;z-index:-1;margin:-10px -10px 0 0;background:#fcfcfc url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){#TB_window.plugin-details-modal.thickbox-loading:before{background-image:url(../images/spinner-2x.gif)}}.plugin-details-modal #TB_title{float:right;height:1px}.plugin-details-modal #TB_ajaxWindowTitle{display:none}.plugin-details-modal #TB_closeWindowButton{right:auto;left:-30px;color:#eee}.plugin-details-modal #TB_closeWindowButton:focus,.plugin-details-modal #TB_closeWindowButton:hover{color:#00a0d2;outline:0;box-shadow:none}.plugin-details-modal .tb-close-icon{display:none}.plugin-details-modal #TB_closeWindowButton:after{content:"\f335";font:normal 32px/29px dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media screen and (max-width:830px){.plugin-details-modal #TB_closeWindowButton{left:0;top:-30px}}img{border:none}.bulk-action-notice .toggle-indicator:before,.js .meta-box-sortables .postbox .toggle-indicator:before,.privacy-text-box .toggle-indicator:before,.sidebar-name .toggle-indicator:before{content:"\f142";display:inline-block;font:normal 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.bulk-action-notice .bulk-action-errors-collapsed .toggle-indicator:before,.js .meta-box-sortables .postbox.closed .handlediv .toggle-indicator:before,.js .widgets-holder-wrap.closed .toggle-indicator:before,.privacy-text-box.closed .toggle-indicator:before{content:"\f140"}.js .postbox .handlediv .toggle-indicator:before{margin-top:4px;width:20px;border-radius:50%;text-indent:-1px}.rtl.js .postbox .handlediv .toggle-indicator:before{text-indent:1px}.bulk-action-notice .toggle-indicator:before{line-height:16px;vertical-align:top;color:#72777c}.js .postbox .handlediv:focus{box-shadow:none;outline:0}.js .postbox .handlediv:focus .toggle-indicator:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}#photo-add-url-div input[type=text]{width:300px}.alignleft h2{margin:0}#template textarea{font-family:Consolas,Monaco,monospace;font-size:13px;background:#f9f9f9;-moz-tab-size:4;-o-tab-size:4;tab-size:4}#template .CodeMirror,#template textarea{width:100%;min-height:60vh;height:calc(100vh - 295px);border:1px solid #ddd;box-sizing:border-box}#templateside>h2{padding-top:6px;padding-bottom:7px;margin:0}#templateside ol,#templateside ul{margin:0;padding:0}#templateside>ul{box-sizing:border-box;margin-top:0;overflow:auto;padding:0;min-height:60vh;height:calc(100vh - 295px);background-color:#f7f7f7;border:1px solid #ddd;border-right:none}#templateside ul ul{padding-right:12px}#templateside>ul>li>ul[role=group]{padding-right:0}[role=treeitem][aria-expanded=false]>ul{display:none}[role=treeitem] span[aria-hidden]{display:inline;font-family:dashicons;font-size:20px;position:absolute;pointer-events:none}[role=treeitem][aria-expanded=false]>.folder-label .icon:after{content:"\f141"}[role=treeitem][aria-expanded=true]>.folder-label .icon:after{content:"\f140"}[role=treeitem] .folder-label{display:block;padding:3px 12px 3px 3px;cursor:pointer}[role=treeitem]{outline:0}[role=treeitem] .folder-label.focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}[role=treeitem] .folder-label.hover,[role=treeitem].hover{background-color:#eaeaea}.tree-folder{margin:0;position:relative}[role=treeitem] li{position:relative}.tree-folder .tree-folder::after{content:"";display:block;position:absolute;right:2px;border-right:1px solid #ccc;top:-13px;bottom:10px}.tree-folder>li::before{content:"";position:absolute;display:block;border-right:1px solid #ccc;right:2px;top:-5px;height:18px;width:7px;border-bottom:1px solid #ccc}.tree-folder>li::after{content:"";position:absolute;display:block;border-right:1px solid #ccc;right:2px;bottom:-7px;top:0}#templateside .current-file{margin:-4px 0 -2px}.tree-folder>.current-file::before{right:4px;height:15px;width:0;border-right:none;top:3px}.tree-folder>.current-file::after{bottom:-4px;height:7px;right:2px;top:auto}.tree-folder li:last-child>.tree-folder::after,.tree-folder>li:last-child::after{display:none}#theme-plugin-editor-label{display:inline-block;margin-bottom:1em;font-weight:600}#docs-list,#template textarea{direction:ltr}.fileedit-sub #plugin,.fileedit-sub #theme{max-width:40%}.fileedit-sub .alignright{text-align:left}#template p{width:97%}#file-editor-linting-error{margin-top:1em;margin-bottom:1em}#file-editor-linting-error>.notice{margin:0;display:inline-block}#file-editor-linting-error>.notice>p{width:auto}#template .submit{margin-top:1em;padding:0}#template .submit input[type=submit][disabled]{cursor:not-allowed}#templateside{float:left;width:16em;word-wrap:break-word}#postcustomstuff p.submit{margin:0}#templateside h4{margin:1em 0 0}#templateside li{margin:4px 0}#templateside li:not(.howto) a,.theme-editor-php .highlight{display:block;padding:3px 12px 3px 0;text-decoration:none}#templateside li:not(.howto)>a:first-of-type{padding-top:0}#templateside li.howto{padding:6px 12px 12px 12px}.theme-editor-php .highlight{margin:-3px -12px -3px 3px}#templateside .highlight{border:none;font-weight:600}.nonessential{color:#666;font-size:11px;font-style:italic;padding-right:12px}#documentation{margin-top:10px}#documentation label{line-height:1.8;vertical-align:baseline;font-weight:600}.fileedit-sub{padding:10px 0 8px;line-height:180%}#file-editor-warning .file-editor-warning-content{margin:25px}.accordion-section-title:after,.control-section .accordion-section-title:after,.nav-menus-php .item-edit:before,.widget-top .widget-action .toggle-indicator:before{content:"\f140";font:normal 20px/1 dashicons;speak:none;display:block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.widget-top .widget-action .toggle-indicator:before{padding:1px 0 1px 2px;border-radius:50%}.accordion-section-title:after,.handlediv,.item-edit,.postbox .handlediv.button-link,.toggle-indicator{color:#72777c}.widget-action{color:#555d66}.accordion-section-title:hover:after,.handlediv:focus,.handlediv:hover,.item-edit:focus,.item-edit:hover,.postbox .handlediv.button-link:focus,.postbox .handlediv.button-link:hover,.sidebar-name:hover .toggle-indicator,.widget-action:focus,.widget-top:hover .widget-action{color:#23282d}.widget-top .widget-action:focus .toggle-indicator:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.accordion-section-title:after,.control-section .accordion-section-title:after{float:left;left:20px;top:-2px}#customize-info.open .accordion-section-title:after,.control-section.open .accordion-section-title:after,.nav-menus-php .menu-item-edit-active .item-edit:before,.widget.open .widget-top .widget-action .toggle-indicator:before,.widget.widget-in-question .widget-top .widget-action .toggle-indicator:before{content:"\f142"}/*! + * jQuery UI Draggable/Sortable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */.ui-draggable-handle,.ui-sortable-handle{touch-action:none}.accordion-section{border-bottom:1px solid #ddd;margin:0}.accordion-section.open .accordion-section-content,.no-js .accordion-section .accordion-section-content{display:block}.accordion-section.open:hover{border-bottom-color:#ddd}.accordion-section-content{display:none;padding:10px 20px 15px;overflow:hidden;background:#fff}.accordion-section-title{margin:0;padding:12px 15px 15px;position:relative;border-right:1px solid #ddd;border-left:1px solid #ddd;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.js .accordion-section-title{cursor:pointer}.js .accordion-section-title:after{position:absolute;top:12px;left:10px;z-index:1}.accordion-section-title:focus{outline:0}.accordion-section-title:focus:after,.accordion-section-title:hover:after{border-color:#a0a5aa transparent}.cannot-expand .accordion-section-title{cursor:auto}.cannot-expand .accordion-section-title:after{display:none}.control-section .accordion-section-title,.customize-pane-child .accordion-section-title{border-right:none;border-left:none;padding:10px 14px 11px 10px;line-height:1.55;background:#fff}.control-section .accordion-section-title:after,.customize-pane-child .accordion-section-title:after{top:calc(50% - 10px)}.js .control-section .accordion-section-title:focus,.js .control-section .accordion-section-title:hover,.js .control-section.open .accordion-section-title,.js .control-section:hover .accordion-section-title{color:#23282d;background:#f5f5f5}.control-section.open .accordion-section-title{border-bottom:1px solid #ddd}.network-admin .edit-site-actions{margin-top:0}.my-sites{display:block;overflow:auto;zoom:1}.my-sites li{display:block;padding:8px 3%;min-height:130px;margin:0}@media only screen and (max-width:599px){.my-sites li{min-height:0}}@media only screen and (min-width:600px){.my-sites.striped li{background-color:#fff;position:relative}.my-sites.striped li:after{content:"";width:1px;height:100%;position:absolute;top:0;left:0;background:#ccc}}@media only screen and (min-width:600px) and (max-width:699px){.my-sites li{float:right;width:44%}.my-sites.striped li{background-color:#fff}.my-sites.striped li:nth-of-type(2n+1){clear:right}.my-sites.striped li:nth-of-type(2n+2):after{content:none}.my-sites li:nth-of-type(4n+1),.my-sites li:nth-of-type(4n+2){background-color:#f9f9f9}}@media only screen and (min-width:700px) and (max-width:1199px){.my-sites li{float:right;width:27.333333%;background-color:#fff}.my-sites.striped li:nth-of-type(3n+3):after{content:none}.my-sites li:nth-of-type(6n+1),.my-sites li:nth-of-type(6n+2),.my-sites li:nth-of-type(6n+3){background-color:#f9f9f9}}@media only screen and (min-width:1200px) and (max-width:1399px){.my-sites li{float:right;width:21%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(4n+1){clear:right}.my-sites.striped li:nth-of-type(4n+4):after{content:none}.my-sites li:nth-of-type(8n+1),.my-sites li:nth-of-type(8n+2),.my-sites li:nth-of-type(8n+3),.my-sites li:nth-of-type(8n+4){background-color:#f9f9f9}}@media only screen and (min-width:1400px) and (max-width:1599px){.my-sites li{float:right;width:16%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(5n+1){clear:right}.my-sites.striped li:nth-of-type(5n+5):after{content:none}.my-sites li:nth-of-type(10n+1),.my-sites li:nth-of-type(10n+2),.my-sites li:nth-of-type(10n+3),.my-sites li:nth-of-type(10n+4),.my-sites li:nth-of-type(10n+5){background-color:#f9f9f9}}@media only screen and (min-width:1600px){.my-sites li{float:right;width:12.666666%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(6n+1){clear:right}.my-sites.striped li:nth-of-type(6n+6):after{content:none}.my-sites li:nth-of-type(12n+1),.my-sites li:nth-of-type(12n+2),.my-sites li:nth-of-type(12n+3),.my-sites li:nth-of-type(12n+4),.my-sites li:nth-of-type(12n+5),.my-sites li:nth-of-type(12n+6){background-color:#f9f9f9}}.my-sites li a{text-decoration:none}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){div.star-holder,div.star-holder .star-rating{background:url(../images/stars-2x.png?ver=20121108) repeat-x bottom left;background-size:21px 37px}.spinner{background-image:url(../images/spinner-2x.gif)}#bulk-titles div a,#bulk-titles div a:hover,#screen-meta-links a.show-settings,.curtime #timestamp,.meta-box-sortables .postbox:hover .handlediv,.sidebar-name .toggle-indicator,.sidebar-name:hover .toggle-indicator,.widget-top .widget-action,.widget-top .widget-action:hover{background:0 0!important}}@-ms-viewport{width:device-width}@media screen and (max-width:782px){html.wp-toolbar{padding-top:46px}.screen-reader-shortcut:focus{top:-39px}body{min-width:240px;overflow-x:hidden}body *{-webkit-tap-highlight-color:rgba(0,0,0,0)!important}#wpcontent{position:relative;margin-right:0;padding-right:10px}#wpbody-content{padding-bottom:100px}.wrap{clear:both;margin-left:12px;margin-right:0}#col-left,#col-right{float:none;width:auto}#col-left .col-wrap,#col-right .col-wrap{padding:0}#collapse-menu,.post-format-select{display:none!important}.wrap h1.wp-heading-inline{margin-bottom:.5em}.wrap .add-new-h2,.wrap .add-new-h2:active,.wrap .page-title-action,.wrap .page-title-action:active{padding:10px 15px;font-size:14px;white-space:nowrap}.media-upload-form div.error,.notice,.wrap div.error,.wrap div.updated{margin:20px 0 10px 0;padding:5px 10px;font-size:14px;line-height:175%}.wp-core-ui .notice.is-dismissible{padding-left:46px}.notice-dismiss{padding:13px}.wrap .icon32+h2{margin-top:-2px}.wp-responsive-open #wpbody{left:-16em}code{word-wrap:break-word;word-wrap:anywhere;word-break:break-word}.postbox{font-size:14px}.metabox-holder .postbox>h3,.metabox-holder .stuffbox>h3,.metabox-holder h2,.metabox-holder h3.hndle{padding:12px}.postbox .handlediv{margin-top:3px}.subsubsub{font-size:16px;text-align:center;margin-bottom:15px}#template .CodeMirror,#template textarea{box-sizing:border-box}#templateside{float:none;width:auto}#templateside>ul{border-right:1px solid #ddd}#templateside li{margin:0}#templateside li:not(.howto) a{display:block;padding:5px}#templateside li.howto{padding:12px}#templateside .highlight{padding:5px;margin-right:-5px;margin-top:-5px}#template .notice,#template>div{float:none;margin:1em 0;width:auto}#template .CodeMirror,#template textarea{width:100%}#templateside ul ul{padding-right:1.5em}[role=treeitem] .folder-label{display:block;padding:5px}.tree-folder .tree-folder::after,.tree-folder>li::after,.tree-folder>li::before{right:-8px}.tree-folder>li::before{top:0;height:13px}.tree-folder>.current-file::before{right:-5px;top:7px;width:4px}.tree-folder>.current-file::after{height:9px;right:-8px}.wrap #templateside span.notice{margin-right:-5px;width:100%}.fileedit-sub .alignright{float:right;margin-top:15px;width:100%;text-align:right}.fileedit-sub .alignright label{display:block}.fileedit-sub #plugin,.fileedit-sub #theme{margin-right:0;max-width:70%}.fileedit-sub input[type=submit]{margin-bottom:0}#documentation label[for=docs-list]{display:block}#documentation select[name=docs-list]{margin-right:0;max-width:60%}#documentation input[type=button]{margin-bottom:0}#wpfooter{display:none}#comments-form .checkforspam{display:none}.edit-comment-author{margin:2px 0 0}.filter-drawer .filter-group-feature input,.filter-drawer .filter-group-feature label{line-height:2.1}.filter-drawer .filter-group-feature label{margin-right:32px}.wp-filter .button.drawer-toggle{font-size:13px;line-height:2;height:28px}#screen-meta #contextual-help-wrap{overflow:visible}#screen-meta #contextual-help-back,#screen-meta .contextual-help-sidebar{display:none}#screen-meta .contextual-help-tabs{clear:both;width:100%;float:none}#screen-meta .contextual-help-tabs ul{margin:0 0 1em;padding:1em 0 0}#screen-meta .contextual-help-tabs .active{margin:0}#screen-meta .contextual-help-tabs-wrap{clear:both;max-width:100%;float:none}#screen-meta-links{margin-bottom:20px}.wp-filter .search-form input[type=search]{font-size:1rem}}@media screen and (max-width:600px){#wpwrap.wp-responsive-open{overflow-x:hidden}html.wp-toolbar{padding-top:0}.screen-reader-shortcut:focus{top:7px}#wpbody{padding-top:46px}div#post-body.metabox-holder.columns-1{overflow-x:hidden}.nav-tab-wrapper,.wrap h2.nav-tab-wrapper,h1.nav-tab-wrapper{border-bottom:0}h1 .nav-tab,h2 .nav-tab,h3 .nav-tab,nav .nav-tab{margin:10px 0 0 10px;border-bottom:1px solid #ccc}.nav-tab-active:focus,.nav-tab-active:focus:active,.nav-tab-active:hover{border-bottom:1px solid #ccc}.wp-filter .search-form input[type=search]{width:100%}}@media screen and (max-width:320px){#network_dashboard_right_now .subsubsub{font-size:14px;text-align:right}} \ No newline at end of file diff --git a/wp-admin/css/common.css b/wp-admin/css/common.css new file mode 100644 index 0000000..8d7abd4 --- /dev/null +++ b/wp-admin/css/common.css @@ -0,0 +1,4065 @@ +/* 2 column liquid layout */ +#wpwrap { + height: auto; + min-height: 100%; + width: 100%; + position: relative; + -webkit-font-smoothing: subpixel-antialiased; +} + +#wpcontent { + height: 100%; + padding-left: 20px; +} + +#wpcontent, +#wpfooter { + margin-left: 160px; +} + +.folded #wpcontent, +.folded #wpfooter { + margin-left: 36px; +} + +#wpbody-content { + padding-bottom: 65px; + float: left; + width: 100%; + overflow: visible !important; +} + +/* inner 2 column liquid layout */ + +.inner-sidebar { + float: right; + clear: right; + display: none; + width: 281px; + position: relative; +} + +.columns-2 .inner-sidebar { + margin-right: auto; + width: 286px; + display: block; +} + +.inner-sidebar #side-sortables, +.columns-2 .inner-sidebar #side-sortables { + min-height: 300px; + width: 280px; + padding: 0; +} + +.has-right-sidebar .inner-sidebar { + display: block; +} + +.has-right-sidebar #post-body { + float: left; + clear: left; + width: 100%; + margin-right: -2000px; +} + +.has-right-sidebar #post-body-content { + margin-right: 300px; + float: none; + width: auto; +} + +/* 2 columns main area */ + +#col-left { + float: left; + width: 35%; +} + +#col-right { + float: right; + width: 65%; +} + +#col-left .col-wrap { + padding: 0 6px 0 0; +} + +#col-right .col-wrap { + padding: 0 0 0 6px; +} + +/* utility classes */ +.alignleft { + float: left; +} + +.alignright { + float: right; +} + +.textleft { + text-align: left; +} + +.textright { + text-align: right; +} + +.clear { + clear: both; +} + +/* modern clearfix */ +.wp-clearfix:after { + content: ""; + display: table; + clear: both; +} + +/* Hide visually but not from screen readers */ +.screen-reader-text, +.screen-reader-text span, +.ui-helper-hidden-accessible { + 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; + width: 1px; + word-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */ +} + +.button .screen-reader-text { + height: auto; /* Fixes a Safari+VoiceOver bug, see ticket #42006 */ +} + +.screen-reader-shortcut { + position: absolute; + top: -1000em; +} + +.screen-reader-shortcut:focus { + left: 6px; + top: -25px; + height: auto; + width: auto; + display: block; + font-size: 14px; + font-weight: 600; + padding: 15px 23px 14px; + background: #f1f1f1; + color: #0073aa; + z-index: 100000; + line-height: normal; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + text-decoration: none; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +.hidden, +.js .closed .inside, +.js .hide-if-js, +.no-js .hide-if-no-js, +.js.wp-core-ui .hide-if-js, +.js .wp-core-ui .hide-if-js, +.no-js.wp-core-ui .hide-if-no-js, +.no-js .wp-core-ui .hide-if-no-js { + display: none; +} + +/* @todo: Take a second look. Large chunks of shared color, from the colors.css merge */ +.widget-top, +.menu-item-handle, +.widget-inside, +#menu-settings-column .accordion-container, +#menu-management .menu-edit, +.manage-menus, +table.widefat, +.stuffbox, +p.popular-tags, +.widgets-holder-wrap, +.wp-editor-container, +.popular-tags, +.feature-filter, +.imgedit-group, +.comment-ays { + border: 1px solid #ccd0d4; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); +} + +table.widefat, +.wp-editor-container, +.stuffbox, +p.popular-tags, +.widgets-holder-wrap, +.popular-tags, +.feature-filter, +.imgedit-group, +.comment-ays { + background: #fff; +} + +/* general */ +html, +body { + height: 100%; + margin: 0; + padding: 0; +} + +body { + background: #f1f1f1; + color: #444; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + line-height: 1.4em; + min-width: 600px; +} + +body.iframe { + min-width: 0; + padding-top: 1px; +} + +body.modal-open { + overflow: hidden; +} + +body.mobile.modal-open #wpwrap { + overflow: hidden; + position: fixed; + height: 100%; +} + +iframe, +img { + border: 0; +} + +td { + font-family: inherit; + font-size: inherit; + font-weight: inherit; + line-height: inherit; +} + +/* Any change to the default link style must be applied to button-link too. */ +a { + color: #0073aa; + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; +} + +a, +div { + outline: 0; +} + +a:hover, +a:active { + color: #00a0d2; +} + +a:focus, +a:focus .media-icon img, +.wp-person a:focus .gravatar { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.ie8 a:focus { + outline: #5b9dd9 solid 1px; +} + +#adminmenu a:focus { + box-shadow: none; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; + outline-offset: -1px; +} + +.screen-reader-text:focus { + box-shadow: none; + outline: none; +} + +blockquote, +q { + quotes: none; +} + +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ""; + content: none; +} + +p { + font-size: 13px; + line-height: 1.5; + margin: 1em 0; +} + +blockquote { + margin: 1em; +} + +li, +dd { + margin-bottom: 6px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + display: block; + font-weight: 600; +} + +h1 { + color: #23282d; + font-size: 2em; + margin: .67em 0; +} + +h2, +h3 { + color: #23282d; + font-size: 1.3em; + margin: 1em 0; +} + +.update-core-php h2 { + margin-top: 2em; +} + +.update-php h2, +.update-messages h2, +h4 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +ul, +ol { + padding: 0; +} + +ul { + list-style: none; +} + +ol { + list-style-type: decimal; + margin-left: 2em; +} + +ul.ul-disc { + list-style: disc outside; +} + +ul.ul-square { + list-style: square outside; +} + +ol.ol-decimal { + list-style: decimal outside; +} + +ul.ul-disc, +ul.ul-square, +ol.ol-decimal { + margin-left: 1.8em; +} + +ul.ul-disc > li, +ul.ul-square > li, +ol.ol-decimal > li { + margin: 0 0 0.5em; +} + +/* rtl:ignore */ +.ltr { + direction: ltr; +} + +/* rtl:ignore */ +.code, +code { + font-family: Consolas, Monaco, monospace; + direction: ltr; + unicode-bidi: embed; +} + +kbd, +code { + padding: 3px 5px 2px 5px; + margin: 0 1px; + background: #eaeaea; + background: rgba(0, 0, 0, 0.07); + font-size: 13px; +} + +.subsubsub { + list-style: none; + margin: 8px 0 0; + padding: 0; + font-size: 13px; + float: left; + color: #666; +} + +.subsubsub a { + line-height: 2; + padding: .2em; + text-decoration: none; +} + +.subsubsub a .count, +.subsubsub a.current .count { + color: #555d66; /* #f1f1f1 background */ + font-weight: 400; +} + +.subsubsub a.current { + font-weight: 600; + border: none; +} + +.subsubsub li { + display: inline-block; + margin: 0; + padding: 0; + white-space: nowrap; +} + +.wp-die-message { + font-size: 13px; + line-height: 1.5; + margin: 1em 0; +} + +/* .widefat - main style for tables */ +.widefat { + border-spacing: 0; + width: 100%; + clear: both; + margin: 0; +} + +.widefat * { + word-wrap: break-word; +} + +.widefat a, +.widefat button.button-link { + text-decoration: none; +} + +.widefat td, +.widefat th { + padding: 8px 10px; +} + +.widefat thead th, +.widefat thead td { + border-bottom: 1px solid #ccd0d4; +} + +.widefat tfoot th, +.widefat tfoot td { + border-top: 1px solid #ccd0d4; + border-bottom: none; +} + +.widefat .no-items td { + border-bottom-width: 0; +} + +.widefat td { + vertical-align: top; +} + +.widefat td, +.widefat td p, +.widefat td ol, +.widefat td ul { + font-size: 13px; + line-height: 1.5em; +} + +.widefat th, +.widefat thead td, +.widefat tfoot td { + text-align: left; + line-height: 1.3em; + font-size: 14px; +} + +.widefat th input, +.updates-table td input, +.widefat thead td input, +.widefat tfoot td input { + margin: 0 0 0 8px; + padding: 0; + vertical-align: text-top; +} + +.widefat .check-column { + width: 2.2em; + padding: 6px 0 25px; + vertical-align: top; +} + +.widefat tbody th.check-column { + padding: 9px 0 22px; +} + +.widefat thead td.check-column, +.widefat tbody th.check-column, +.updates-table tbody td.check-column, +.widefat tfoot td.check-column { + padding: 11px 0 0 3px; +} + +.widefat thead td.check-column, +.widefat tfoot td.check-column { + padding-top: 4px; + vertical-align: middle; +} + +.update-php div.updated, +.update-php div.error { + margin-left: 0; +} + +.no-js .widefat thead .check-column input, +.no-js .widefat tfoot .check-column input { + display: none; +} + +.widefat .num, +.column-comments, +.column-links, +.column-posts { + text-align: center; +} + +.widefat th#comments { + vertical-align: middle; +} + +.wrap { + margin: 10px 20px 0 2px; +} + +.wrap.block-editor-no-js { + padding-left: 20px; +} + +.wrap > h2:first-child, /* Back-compat for pre-4.4 */ +.wrap [class$="icon32"] + h2, /* Back-compat for pre-4.4 */ +.postbox .inside h2, /* Back-compat for pre-4.4 */ +.wrap h1 { + font-size: 23px; + font-weight: 400; + margin: 0; + padding: 9px 0 4px 0; + line-height: 1.3; +} + +.wrap h1.wp-heading-inline { + display: inline-block; + margin-right: 5px; +} + +.wp-header-end { + visibility: hidden; + margin: -2px 0 0; +} + +.subtitle { + margin: 0; + padding-left: 25px; + color: #555d66; + font-size: 14px; + font-weight: 400; + line-height: 1; +} + +.wrap .add-new-h2, /* deprecated */ +.wrap .add-new-h2:active, /* deprecated */ +.wrap .page-title-action, +.wrap .page-title-action:active { + margin-left: 4px; + padding: 4px 8px; + position: relative; + top: -3px; + text-decoration: none; + border: 1px solid #0071a1; + border-radius: 2px; + text-shadow: none; + font-weight: 600; + font-size: 13px; + line-height: normal; /* IE8-IE11 need this for buttons */ + color: #0071a1; /* use the standard color used for buttons */ + background: #f3f5f6; + cursor: pointer; +} + +.wrap .wp-heading-inline + .page-title-action { + margin-left: 0; +} + +.wrap .add-new-h2:hover, /* deprecated */ +.wrap .page-title-action:hover { + background: #f1f1f1; + border-color: #016087; + color: #016087; +} + +/* lower specificity: color needs to be overridden by :hover and :active */ +.page-title-action:focus { + color: #016087; +} + +/* Dashicon for language options on General Settings and Profile screens */ +.form-table th label[for="locale"] .dashicons, +.form-table th label[for="WPLANG"] .dashicons { + margin-left: 5px; +} + +.wrap .page-title-action:focus { + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.wrap h1.long-header { + padding-right: 0; +} + +.wp-dialog { + background-color: #fff; +} + +.widgets-chooser ul, +#widgets-left .widget-in-question .widget-top, +#available-widgets .widget-top:hover, +div#widgets-right .widget-top:hover, +#widgets-left .widget-top:hover { + border-color: #999; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.sorthelper { + background-color: #ccf3fa; +} + +.ac_match, +.subsubsub a.current { + color: #000; +} + +.striped > tbody > :nth-child(odd), +ul.striped > :nth-child(odd), +.alternate { + background-color: #f9f9f9; +} + +.bar { + background-color: #e8e8e8; + border-right-color: #99d; +} + +/* Helper classes for plugins to leverage the active WordPress color scheme */ + +.highlight { + background-color: #e4f2fd; + color: #000; +} + +.wp-ui-primary { + color: #fff; + background-color: #32373c; +} +.wp-ui-text-primary { + color: #32373c; +} + +.wp-ui-highlight { + color: #fff; + background-color: #1e8cbe; +} +.wp-ui-text-highlight { + color: #1e8cbe; +} + +.wp-ui-notification { + color: #fff; + background-color: #d54e21; +} +.wp-ui-text-notification { + color: #d54e21; +} + +.wp-ui-text-icon { + color: #82878c; /* same as new icons */ +} + +/* For emoji replacement images */ +img.emoji { + display: inline !important; + border: none !important; + height: 1em !important; + width: 1em !important; + margin: 0 .07em !important; + vertical-align: -0.1em !important; + background: none !important; + padding: 0 !important; + box-shadow: none !important; +} + +/*------------------------------------------------------------------------------ + 1.0 - Text Styles +------------------------------------------------------------------------------*/ + +.widget .widget-top, +.postbox .hndle, +.stuffbox .hndle, +.control-section .accordion-section-title, +.sidebar-name, +#nav-menu-header, +#nav-menu-footer, +.menu-item-handle, +.checkbox, +.side-info, +#your-profile #rich_editing, +.widefat thead th, +.widefat thead td, +.widefat tfoot th, +.widefat tfoot td { + line-height: 1.4em; +} + +.widget .widget-top, +.menu-item-handle { + background: #fafafa; + color: #23282d; +} + +.postbox .hndle, +.stuffbox .hndle { + border-bottom: 1px solid #ccd0d4; +} + +.quicktags { + background-color: #ccc; + color: #000; + font-size: 12px; +} + +.icon32 { + display: none; +} + +/* @todo can we combine these into a class or use an existing dashicon one? */ +.welcome-panel .welcome-panel-close:before, +.tagchecklist .ntdelbutton .remove-tag-icon:before, +#bulk-titles div a:before, +.notice-dismiss:before { + background: none; + color: #72777c; + content: "\f153"; + display: block; + font: normal 16px/20px dashicons; + speak: none; + height: 20px; + text-align: center; + width: 20px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.welcome-panel .welcome-panel-close:before { + margin: 0; +} + +#bulk-titles div a:before { + margin: 1px 0; +} + +.tagchecklist .ntdelbutton .remove-tag-icon:before { + margin-left: 2px; + border-radius: 50%; + color: #0073aa; + /* vertically center the icon cross browsers */ + line-height: 1.28; +} + +.tagchecklist .ntdelbutton:focus { + outline: 0; +} + +.welcome-panel .welcome-panel-close:hover:before, +.welcome-panel .welcome-panel-close:focus:before, +.tagchecklist .ntdelbutton:hover .remove-tag-icon:before, +.tagchecklist .ntdelbutton:focus .remove-tag-icon:before, +#bulk-titles div a:hover:before, +#bulk-titles div a:focus:before { + color: #c00; +} + +.tagchecklist .ntdelbutton:focus .remove-tag-icon:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.key-labels label { + line-height: 24px; +} + +strong, b { + font-weight: 600; +} + +.pre { + /* https://developer.mozilla.org/en-US/docs/CSS/white-space */ + white-space: pre-wrap; /* css-3 */ + word-wrap: break-word; /* IE 5.5 - 7 */ +} + +.howto { + color: #666; + font-style: italic; + display: block; +} + +p.install-help { + margin: 8px 0; + font-style: italic; +} + +.no-break { + white-space: nowrap; +} + +hr { + border: 0; + border-top: 1px solid #ddd; + border-bottom: 1px solid #fafafa; +} + +.row-actions span.delete a, +.row-actions span.trash a, +.row-actions span.spam a, +.plugins a.delete, +#all-plugins-table .plugins a.delete, +#search-plugins-table .plugins a.delete, +.submitbox .submitdelete, +#media-items a.delete, +#media-items a.delete-permanently, +#nav-menu-footer .menu-delete, +#delete-link a.delete { + color: #a00; +} + +abbr.required, +span.required, +.file-error, +.row-actions .delete a:hover, +.row-actions .trash a:hover, +.row-actions .spam a:hover, +.plugins a.delete:hover, +#all-plugins-table .plugins a.delete:hover, +#search-plugins-table .plugins a.delete:hover, +.submitbox .submitdelete:hover, +#media-items a.delete:hover, +#media-items a.delete-permanently:hover, +#nav-menu-footer .menu-delete:hover, +#delete-link a.delete:hover { + color: #dc3232; + border: none; +} + +/*------------------------------------------------------------------------------ + 3.0 - Actions +------------------------------------------------------------------------------*/ + +#major-publishing-actions { + padding: 10px; + clear: both; + border-top: 1px solid #ddd; + background: #f5f5f5; +} + +#delete-action { + float: left; + line-height: 2.30769231; /* 30px */ +} + +#delete-link { + line-height: 2.30769231; /* 30px */ + vertical-align: middle; + text-align: left; + margin-left: 8px; +} + +#delete-link a { + text-decoration: none; +} + +#publishing-action { + text-align: right; + float: right; + line-height: 1.9; +} + +#publishing-action .spinner { + float: none; + margin-top: 5px; +} + +#misc-publishing-actions { + padding: 6px 0 0; +} + +.misc-pub-section { + padding: 6px 10px 8px; +} + +.misc-pub-filename { + word-wrap: break-word; +} + +#minor-publishing-actions { + padding: 10px 10px 0 10px; + text-align: right; +} + +#save-post { + float: left; +} + +.preview { + float: right; +} + +#sticky-span { + margin-left: 18px; +} + +.approve, +.unapproved .unapprove { + display: none; +} + +.unapproved .approve, +.spam .approve, +.trash .approve { + display: inline; +} + +td.action-links, +th.action-links { + text-align: right; +} + +#misc-publishing-actions .notice { + margin-left: 10px; + margin-right: 10px; +} + +/* Filter bar */ +.wp-filter { + display: inline-block; + position: relative; + box-sizing: border-box; + margin: 12px 0 25px; + padding: 0 10px; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + border: 1px solid #ccd0d4; + background: #fff; + color: #555; + font-size: 13px; +} + +.wp-filter a { + text-decoration: none; +} + +.filter-count { + display: inline-block; + vertical-align: middle; + min-width: 4em; +} + +.title-count, +.filter-count .count { + display: inline-block; + position: relative; + top: -1px; + padding: 4px 10px; + border-radius: 30px; + background: #72777c; + color: #fff; + font-size: 14px; + font-weight: 600; +} + +/* not a part of filter bar, but derived from it, so here for now */ +.title-count { + display: inline; + top: -3px; + margin-left: 5px; + margin-right: 20px; +} + +.filter-items { + float: left; +} + +.filter-links { + display: inline-block; + margin: 0; +} + +.filter-links li { + display: inline-block; + margin: 0; +} + +.filter-links li > a { + display: inline-block; + margin: 0 10px; + padding: 15px 0; + border-bottom: 4px solid #fff; + color: #666; + cursor: pointer; +} + +.filter-links .current { + box-shadow: none; + border-bottom: 4px solid #666; + color: #23282d; +} + +.filter-links li > a:hover, +.filter-links li > a:focus, +.show-filters .filter-links a.current:hover, +.show-filters .filter-links a.current:focus { + color: #00a0d2; +} + +.wp-filter .search-form { + float: right; + margin: 10px 0; +} + +.wp-filter .search-form input[type="search"] { + margin: 1px 0; + width: 280px; + max-width: 100%; +} + +.wp-filter .search-form select { + margin: 0; +} + +.wp-filter .search-form.search-plugins { + display: inline-block; +} + +.wp-filter .button.drawer-toggle { + margin: 10px 9px 0; + padding: 0 10px 0 6px; + border-color: transparent; + background-color: transparent; + color: #666; + vertical-align: baseline; + box-shadow: none; +} + +.wp-filter .drawer-toggle:before { + content: "\f111"; + margin: 0 5px 0 0; + color: #72777c; + font: normal 16px/1 dashicons; + vertical-align: text-bottom; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-filter .button.drawer-toggle:hover, +.wp-filter .drawer-toggle:hover:before, +.wp-filter .button.drawer-toggle:focus, +.wp-filter .drawer-toggle:focus:before { + background-color: transparent; + color: #00a0d2; +} + +.wp-filter .button.drawer-toggle:hover, +.wp-filter .button.drawer-toggle:focus:active { + border-color: transparent; +} + +.wp-filter .button.drawer-toggle:focus { + border-color: #5b9dd9; +} + +.wp-filter .button.drawer-toggle:active { + background: transparent; + box-shadow: none; + transform: none; +} + +.wp-filter .drawer-toggle.current:before { + color: #fff; +} + +.filter-drawer, +.wp-filter .favorites-form { + display: none; + margin: 0 -10px 0 -20px; + padding: 20px; + border-top: 1px solid #eee; + background: #fafafa; + overflow: hidden; +} + +.show-filters .filter-drawer, +.show-favorites-form .favorites-form { + display: block; +} + +.show-filters .filter-links a.current { + border-bottom: none; +} + +.show-filters .wp-filter .button.drawer-toggle { + border-radius: 2px; + background: #72777c; + color: #fff; +} + +.show-filters .wp-filter .drawer-toggle:hover, +.show-filters .wp-filter .drawer-toggle:focus { + background: rgb(46, 162, 204); +} + +.show-filters .wp-filter .drawer-toggle:before { + color: #fff; +} + +.filter-group { + box-sizing: border-box; + position: relative; + float: left; + margin: 0 1% 0 0; + padding: 20px 10px 10px; + width: 24%; + background: #fff; + border: 1px solid #e5e5e5; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); +} + +.filter-group legend { + position: absolute; + top: 10px; + display: block; + margin: 0; + padding: 0; + font-size: 1em; + font-weight: 600; +} + +.filter-drawer .filter-group-feature { + margin: 28px 0 0; + list-style-type: none; + font-size: 12px; +} + +.filter-drawer .filter-group-feature input, +.filter-drawer .filter-group-feature label { + line-height: 1.4; +} + +.filter-drawer .filter-group-feature input { + position: absolute; + margin: 0; +} + +.filter-group .filter-group-feature label { + display: block; + margin: 14px 0px 14px 23px; +} + +.filter-drawer .buttons { + clear: both; + margin-bottom: 20px; +} + +.filter-drawer .filter-group + .buttons { + margin-bottom: 0; + padding-top: 20px; +} + +.filter-drawer .buttons .button span { + display: inline-block; + opacity: 0.8; + font-size: 12px; + text-indent: 10px; +} + +.wp-filter .button.clear-filters { + display: none; + margin-left: 10px; +} + +.wp-filter .button-link.edit-filters { + padding: 0 5px; + line-height: 2.2; +} + +.filtered-by { + display: none; + margin: 0; +} + +.filtered-by > span { + font-weight: 600; +} + +.filtered-by a { + margin-left: 10px; +} + +.filtered-by .tags { + display: inline; +} + +.filtered-by .tag { + margin: 0 5px; + padding: 4px 8px; + border: 1px solid #e5e5e5; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + background: #fff; + font-size: 11px; +} + +.filters-applied .filter-group, +.filters-applied .filter-drawer .buttons, +.filters-applied .filter-drawer br { + display: none !important; +} + +.filters-applied .filtered-by { + display: block; +} + +.filters-applied .filter-drawer { + padding: 20px; +} + +.show-filters .favorites-form, +.show-filters .content-filterable, +.show-filters.filters-applied.loading-content .content-filterable, +.loading-content .content-filterable, +.error .content-filterable { + display: none; +} + +.show-filters.filters-applied .content-filterable { + display: block; +} + +.loading-content .spinner { + display: block; + margin: 40px auto 0; + float: none; +} + +@media only screen and (max-width: 1120px) { + .filter-drawer { + border-bottom: 1px solid #eee; + } + + .filter-group { + margin-bottom: 0; + margin-top: 5px; + width: 100%; + } + + .filter-group li { + margin: 10px 0; + } +} + +@media only screen and (max-width: 1000px) { + .filter-items { + float: none; + } + + .wp-filter .media-toolbar-primary, + .wp-filter .media-toolbar-secondary, + .wp-filter .search-form { + float: none; /* Remove float from media-views.css */ + position: relative; + max-width: 100%; + } +} + +@media only screen and (max-width: 782px) { + .filter-group li { + padding: 0; + width: 50%; + } +} + +@media only screen and (max-width: 320px) { + .filter-count { + display: none; + } + + .wp-filter .drawer-toggle { + margin: 10px 0; + } + + .filter-group li, + .wp-filter .search-form input[type="search"] { + width: 100%; + } +} + +/*------------------------------------------------------------------------------ + 4.0 - Notifications +------------------------------------------------------------------------------*/ + +.notice, +div.updated, +div.error { + background: #fff; + border: 1px solid #ccd0d4; + border-left-width: 4px; + box-shadow: 0 1px 1px rgba(0,0,0,.04); + margin: 5px 15px 2px; + padding: 1px 12px; +} + +div[class="update-message"] { /* back-compat for pre-4.6 */ + padding: 0.5em 12px 0.5em 0; +} + +.notice p, +.notice-title, +div.updated p, +div.error p, +.form-table td .notice p { + margin: 0.5em 0; + padding: 2px; +} + +.error a { + text-decoration: underline; +} + +.updated a { + padding-bottom: 2px; +} + +.notice-alt { + box-shadow: none; +} + +.notice-large { + padding: 10px 20px; +} + +.notice-title { + display: inline-block; + color: #23282d; + font-size: 18px; +} + +.wp-core-ui .notice.is-dismissible { + padding-right: 38px; + position: relative; +} + +.notice-dismiss { + position: absolute; + top: 0; + right: 1px; + border: none; + margin: 0; + padding: 9px; + background: none; + color: #72777c; + cursor: pointer; +} + +.notice-dismiss:hover:before, +.notice-dismiss:active:before, +.notice-dismiss:focus:before { + color: #c00; +} + +.notice-dismiss:focus { + outline: none; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.ie8 .notice-dismiss:focus { + outline: 1px solid #5b9dd9; +} + +.notice-success, +div.updated { + border-left-color: #46b450; +} + +.notice-success.notice-alt { + background-color: #ecf7ed; +} + +.notice-warning { + border-left-color: #ffb900; +} + +.notice-warning.notice-alt { + background-color: #fff8e5; +} + +.notice-error, +div.error { + border-left-color: #dc3232; +} + +.notice-error.notice-alt { + background-color: #fbeaea; +} + +.notice-info { + border-left-color: #00a0d2; +} + +.notice-info.notice-alt { + background-color: #e5f5fa; +} + +.update-message p:before, +.updating-message p:before, +.updated-message p:before, +.import-php .updating-message:before, +.button.updating-message:before, +.button.updated-message:before, +.button.installed:before, +.button.installing:before { + display: inline-block; + font: normal 20px/1 'dashicons'; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + vertical-align: top; +} + +.wrap .notice, +.wrap div.updated, +.wrap div.error, +.media-upload-form .notice, +.media-upload-form div.error { + margin: 5px 0 15px; +} + +.wrap #templateside .notice { + display: block; + margin: 0; + padding: 5px 8px; + font-weight: 600; + text-decoration: none; +} + +.wrap #templateside span.notice { + margin-left: -12px; +} + +#templateside li.notice a { + padding: 0; +} + +/* Update icon. */ +.update-message p:before, +.updating-message p:before, +.import-php .updating-message:before, +.button.updating-message:before, +.button.installing:before { + color: #f56e28; + content: "\f463"; +} + +/* Spins the update icon. */ +.updating-message p:before, +.import-php .updating-message:before, +.button.updating-message:before, +.button.installing:before { + animation: rotation 2s infinite linear; +} + +/* Updated icon (check mark). */ +.updated-message p:before, +.installed p:before, +.button.updated-message:before { + color: #79ba49; + content: "\f147"; +} + +/* Error icon. */ +.update-message.notice-error p:before { + color: #dc3232; + content: "\f534"; +} + +.wrap .notice p:before, +.import-php .updating-message:before { + margin-right: 6px; + vertical-align: bottom; +} + +#update-nag, +.update-nag { + display: inline-block; + line-height: 1.4; + padding: 11px 15px; + font-size: 14px; + text-align: left; + margin: 25px 20px 0 2px; + background-color: #fff; + border-left: 4px solid #ffba00; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); +} + +ul#dismissed-updates { + display: none; +} + +#dismissed-updates li > p { + margin-top: 0; +} + +#dismiss, +#undismiss { + margin-left: 0.5em; +} + +form.upgrade { + margin-top: 8px; +} + +form.upgrade .hint { + font-style: italic; + font-size: 85%; + margin: -0.5em 0 2em 0; +} + +.update-php .spinner { + float: none; + margin: -4px 0; +} + +#ajax-loading, +.ajax-loading, +.ajax-feedback, +.imgedit-wait-spin, +.list-ajax-loading { /* deprecated */ + visibility: hidden; +} + +#ajax-response.alignleft { + margin-left: 2em; +} + +.button.updating-message:before, +.button.updated-message:before, +.button.installed:before, +.button.installing:before { + margin: 3px 5px 0 -2px; +} + +.button-primary.updating-message:before { + color: #fff; +} + +.button-primary.updated-message:before { + color: #66c6e4; +} + +.button.updated-message { + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; +} + +@media aural { + .wrap .notice p:before, + .button.installing:before, + .button.installed:before, + .update-message p:before { + speak: none; + } +} + + +/* @todo: this does not need its own section anymore */ +/*------------------------------------------------------------------------------ + 6.0 - Admin Header +------------------------------------------------------------------------------*/ +#adminmenu a, +#taglist a, +#catlist a { + text-decoration: none; +} + +/*------------------------------------------------------------------------------ + 6.1 - Screen Options Tabs +------------------------------------------------------------------------------*/ + +#screen-options-wrap, +#contextual-help-wrap { + margin: 0; + padding: 8px 20px 12px; + position: relative; +} + +#contextual-help-wrap { + overflow: auto; + margin-left: 0 !important; +} + +#screen-meta-links { + float: right; + margin: 0 20px 0 0; +} + +/* screen options and help tabs revert */ +#screen-meta { + display: none; + margin: 0 20px -1px 0px; + position: relative; + background-color: #fff; + border: 1px solid #ccd0d4; + border-top: none; + box-shadow: 0 0 0 transparent; +} + +#screen-options-link-wrap, +#contextual-help-link-wrap { + float: left; + margin: 0 0 0 6px; +} + +#screen-meta-links .screen-meta-toggle { + position: relative; + top: 0; +} + +#screen-meta-links .show-settings { + border: 1px solid #ccd0d4; + border-top: none; + height: auto; + margin-bottom: 0; + padding: 3px 6px 3px 16px; + background: #fff; + border-radius: 0 0 4px 4px; + color: #72777c; + line-height: 1.7; + box-shadow: 0 0 0 transparent; + transition: box-shadow 0.1s linear; +} + +#screen-meta-links .show-settings:hover, +#screen-meta-links .show-settings:active, +#screen-meta-links .show-settings:focus { + color: #32373c; +} + +#screen-meta-links .show-settings:focus { + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +#screen-meta-links .show-settings:active { + transform: none; +} + +#screen-meta-links .show-settings:after { + right: 0; + content: "\f140"; + font: normal 20px/1 dashicons; + speak: none; + display: inline-block; + padding: 0 5px 0 0; + bottom: 2px; + position: relative; + vertical-align: bottom; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #72777c; +} + +#screen-meta-links .screen-meta-active:after { + content: "\f142"; +} + +/* end screen options and help tabs */ + +.toggle-arrow { + background-repeat: no-repeat; + background-position: top left; + background-color: transparent; + height: 22px; + line-height: 22px; + display: block; +} + +.toggle-arrow-active { + background-position: bottom left; +} + +#screen-options-wrap h5, /* Back-compat for old plugins */ +#screen-options-wrap legend, +#contextual-help-wrap h5 { + margin: 0; + padding: 8px 0; + font-size: 13px; + font-weight: 600; +} + +.ie8 #screen-options-wrap legend { + color: inherit; +} + +.metabox-prefs label { + display: inline-block; + padding-right: 15px; + line-height: 2.35; +} + +#number-of-columns { + display: inline-block; + vertical-align: middle; + line-height: 30px; +} + +.metabox-prefs input[type=checkbox] { + margin-top: 0; + margin-right: 6px; +} + +.metabox-prefs label input, +.metabox-prefs label input[type=checkbox] { + margin: -4px 5px 0 0; +} + +.metabox-prefs .columns-prefs label input { + margin: -1px 2px 0 0; +} + +.metabox-prefs label a { + display: none; +} + +.metabox-prefs .screen-options input, +.metabox-prefs .screen-options label { + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.metabox-prefs .screen-options .screen-per-page { + margin-right: 15px; +} + +.metabox-prefs .screen-options label { + line-height: 2.2; + padding-right: 0; +} + +.screen-options + .screen-options { + margin-top: 10px; +} + +.metabox-prefs .submit { + margin-top: 1em; + padding: 0; +} + +/*------------------------------------------------------------------------------ + 6.2 - Help Menu +------------------------------------------------------------------------------*/ + +#contextual-help-wrap { + padding: 0; +} + +#contextual-help-columns { + position: relative; +} + +#contextual-help-back { + position: absolute; + top: 0; + bottom: 0; + left: 150px; + right: 170px; + border: 1px solid #ccd0d4; + border-top: none; + border-bottom: none; + background: #f6fbfd; +} + +#contextual-help-wrap.no-sidebar #contextual-help-back { + right: 0; + border-right-width: 0; + border-bottom-right-radius: 2px; +} + +.contextual-help-tabs { + float: left; + width: 150px; + margin: 0; +} + +.contextual-help-tabs ul { + margin: 1em 0; +} + +.contextual-help-tabs li { + margin-bottom: 0; + list-style-type: none; + border-style: solid; + border-width: 0 0 0 2px; + border-color: transparent; +} + +.contextual-help-tabs a { + display: block; + padding: 5px 5px 5px 12px; + line-height: 1.4; + text-decoration: none; + border: 1px solid transparent; + border-right: none; + border-left: none; +} + +.contextual-help-tabs a:hover { + color: #32373c; +} + +.contextual-help-tabs .active { + padding: 0; + margin: 0 -1px 0 0; + border-left: 2px solid #00a0d2; + background: #f6fbfd; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.02), 0 1px 0 rgba(0, 0, 0, 0.02); +} + +.contextual-help-tabs .active a { + border-color: #ccd0d4; + color: #32373c; +} + +.contextual-help-tabs-wrap { + padding: 0 20px; + overflow: auto; +} + +.help-tab-content { + display: none; + margin: 0 22px 12px 0; + line-height: 1.6; +} + +.help-tab-content.active { + display: block; +} + +.help-tab-content ul li { + list-style-type: disc; + margin-left: 18px; +} + +.contextual-help-sidebar { + width: 150px; + float: right; + padding: 0 8px 0 12px; + overflow: auto; +} + +/*------------------------------------------------------------------------------ + 8.0 - Layout Blocks +------------------------------------------------------------------------------*/ + +html.wp-toolbar { + padding-top: 32px; + box-sizing: border-box; +} + +.widefat th, +.widefat td { + color: #555; +} + +.widefat th, +.widefat thead td, +.widefat tfoot td { + font-weight: 400; +} + +.widefat thead tr th, +.widefat thead tr td, +.widefat tfoot tr th, +.widefat tfoot tr td { + color: #32373c; +} + +.widefat td p { + margin: 2px 0 0.8em; +} + +.widefat p, +.widefat ol, +.widefat ul { + color: #32373c; +} + +.widefat .column-comment p { + margin: 0.6em 0; +} + +.widefat .column-comment ul { + list-style: initial; + margin-left: 2em; +} + +/* Screens with postboxes */ +.postbox-container { + float: left; +} + +.postbox-container .meta-box-sortables { + box-sizing: border-box; +} + +#wpbody-content .metabox-holder { + padding-top: 10px; +} + +.metabox-holder .postbox-container .empty-container { + border: 3px dashed #b4b9be; + height: 250px; + position: relative; +} + +.metabox-holder .postbox-container .empty-container:after { + content: attr(data-emptystring); + margin: auto; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + height: 1em; + width: 200px; + text-align: center; + color: #ccc; + font-size: 18px; + display: none; +} + +.metabox-holder.columns-1 .postbox-container .empty-container, +.columns-2 #postbox-container-3 .empty-container, +.columns-2 #postbox-container-4 .empty-container, +.columns-3 #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; +} + +#post-body-content { + width: 100%; + min-width: 463px; + float: left; +} + +#post-body.columns-2 #postbox-container-1 { + float: right; + margin-right: -300px; + width: 280px; +} + +#post-body.columns-2 #side-sortables { + min-height: 250px; +} + +/* one column on the dash */ +@media only screen and (max-width: 799px) { + #wpbody-content .metabox-holder .postbox-container .empty-container { + border: 0 none; + height: 0; + min-height: 0; + } +} + +.js .widget .widget-top, +.js .postbox .hndle { + cursor: move; +} + +.js .widget .widget-top.is-non-sortable, +.js .postbox .hndle.is-non-sortable { + cursor: auto; +} + +.hndle a { + font-size: 11px; + font-weight: 400; +} + +.postbox .handlediv { + display: none; + float: right; + width: 36px; + height: 36px; + margin: 0; + padding: 0; + border: 0; + background: none; + cursor: pointer; +} + +.js .postbox .handlediv { + display: block; +} + +.sortable-placeholder { + border: 1px dashed #b4b9be; + margin-bottom: 20px; +} + +.postbox, +.stuffbox { + margin-bottom: 20px; + padding: 0; + line-height: 1; +} + +/* user-select is not a part of the CSS standard - may change behavior in the future */ +.postbox .hndle, +.stuffbox .hndle { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.postbox .inside { + padding: 0 12px 12px; + line-height: 1.4; + font-size: 13px; +} + +.stuffbox .inside { + padding: 0; + line-height: 1.4; + font-size: 13px; + margin-top: 0; +} + +.postbox .inside { + margin: 11px 0; + position: relative; +} + +.postbox .inside > p:last-child, +.rss-widget ul li:last-child { + margin-bottom: 1px !important; +} + +.postbox.closed h3 { + border: none; + box-shadow: none; +} + +.postbox table.form-table { + margin-bottom: 0; +} + +.postbox table.widefat { + box-shadow: none; +} + +.temp-border { + border: 1px dotted #ccc; +} + +.columns-prefs label { + padding: 0 10px 0 0; +} + +/* @todo: what is this doing here */ +#dashboard_right_now .versions .b, +#post-status-display, +#post-visibility-display, +#adminmenu .wp-submenu li.current, +#adminmenu .wp-submenu li.current a, +#adminmenu .wp-submenu li.current a:hover, +.media-item .percent, +.plugins .name, +#pass-strength-result.strong, +#pass-strength-result.short, +#ed_reply_toolbar #ed_reply_strong, +.item-controls .item-order a, +.feature-filter .feature-name, +#comment-status-display { + font-weight: 600; +} + +/*------------------------------------------------------------------------------ + 21.0 - Admin Footer +------------------------------------------------------------------------------*/ + +#wpfooter { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 10px 20px; + color: #555d66; +} + +#wpfooter p { + font-size: 13px; + margin: 0; + line-height: 1.55; +} + +#footer-thankyou { + font-style: italic; +} + +/*------------------------------------------------------------------------------ + 25.0 - Tabbed Admin Screen Interface (Experimental) +------------------------------------------------------------------------------*/ + +.nav-tab { + float: left; + border: 1px solid #ccc; + border-bottom: none; + margin-left: 0.5em; /* half the font size so set the font size properly */ + padding: 5px 10px; + font-size: 14px; + line-height: 1.71428571; + font-weight: 600; + background: #e5e5e5; + color: #555; + text-decoration: none; + white-space: nowrap; +} + +h3 .nav-tab, /* Back-compat for pre-4.4 */ +.nav-tab-small .nav-tab { + padding: 5px 14px; + font-size: 12px; + line-height: 1.33; +} + +.nav-tab:hover, +.nav-tab:focus { + background-color: #fff; + color: #444; +} + +.nav-tab-active, +.nav-tab:focus:active { + box-shadow: none; +} + +.nav-tab-active { + margin-bottom: -1px; + color: #444; +} + +.nav-tab-active, +.nav-tab-active:hover, +.nav-tab-active:focus, +.nav-tab-active:focus:active { + border-bottom: 1px solid #f1f1f1; + background: #f1f1f1; + color: #000; +} + +h1.nav-tab-wrapper, /* Back-compat for pre-4.4 */ +.wrap h2.nav-tab-wrapper, /* higher specificity to override .wrap > h2:first-child */ +.nav-tab-wrapper { + border-bottom: 1px solid #ccc; + margin: 0; + padding-top: 9px; + padding-bottom: 0; + line-height: inherit; +} + +/* Back-compat for plugins. Deprecated. Use .wp-clearfix instead. */ +.nav-tab-wrapper:not(.wp-clearfix):after { + content: ""; + display: table; + clear: both; +} + +.ie8 .nav-tab-wrapper { + /* contain floats establishing a new block formatting context */ + display: inline-block; + width: 100%; + vertical-align: top; +} + +/*------------------------------------------------------------------------------ + 26.0 - Misc +------------------------------------------------------------------------------*/ + +.spinner { + background: url(../images/spinner.gif) no-repeat; + background-size: 20px 20px; + display: inline-block; + visibility: hidden; + float: right; + vertical-align: middle; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 4px 10px 0; +} + +.spinner.is-active, +.loading-content .spinner { + visibility: visible; +} + +#template > div { + margin-right: 16em; +} +#template .notice { + margin-top: 1em; + margin-right: 3%; +} +#template .notice p { + width: auto; +} +#template .submit .spinner { + float: none; +} + +.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */ +.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */ +.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */ +.metabox-holder h2.hndle { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +/* Back-compat for nav-menus screen */ +.nav-menus-php .metabox-holder h3 { + padding: 10px 10px 11px 14px; + line-height: 1.5; +} + +#templateside ul li a { + text-decoration: none; +} + +.plugin-install #description, +.plugin-install-network #description { + width: 60%; +} + +table .vers, +table .column-visible, +table .column-rating { + text-align: left; +} + +.attention, +.error-message { + color: #dc3232; + font-weight: 600; +} + +/* Scrollbar fix for bulk upgrade iframe */ +body.iframe { + height: 98%; +} + +/* Upgrader styles, Specific to Language Packs */ +.lp-show-latest p { + display: none; +} +.lp-show-latest p:last-child, +.lp-show-latest .lp-error p { + display: block; +} + +/* - Only used once or twice in all of WP - deprecate for global style +------------------------------------------------------------------------------*/ +.media-icon { + width: 62px; /* icon + border */ + text-align: center; +} + +.media-icon img { + border: 1px solid #e5e5e5; + border: 1px solid rgba(0, 0, 0, 0.07); +} + +#howto { + font-size: 11px; + margin: 0 5px; + display: block; +} + +.importers { + font-size: 16px; + width: auto; +} + +.importers td { + padding-right: 14px; + line-height: 1.4; +} + +.importers .import-system { + max-width: 250px; +} + +.importers td.desc { + max-width: 500px; +} + +.importer-title, +.importer-desc, +.importer-action { + display: block; +} + +.importer-title { + color: #000; + font-size: 14px; + font-weight: 400; + margin-bottom: .2em; +} + +.importer-action { + line-height: 1.55; /* Same as with .updating-message */ + color: #555; + margin-bottom: 1em; +} + +#post-body #post-body-content #namediv h3, /* Back-compat for pre-4.4 */ +#post-body #post-body-content #namediv h2 { + margin-top: 0; +} + +.edit-comment-author { + color: #222; + border-bottom: 1px solid #eee; +} + +#namediv h3 label, /* Back-compat for pre-4.4 */ +#namediv h2 label { + vertical-align: baseline; +} + +#namediv table { + width: 100%; +} + +#namediv td.first { + width: 10px; + white-space: nowrap; +} + +#namediv input { + width: 98%; +} + +#namediv p { + margin: 10px 0; +} + +#submitdiv h3 { + margin-bottom: 0 !important; +} + +/* - Used - but could/should be deprecated with a CSS reset +------------------------------------------------------------------------------*/ +.zerosize { + height: 0; + width: 0; + margin: 0; + border: 0; + padding: 0; + overflow: hidden; + position: absolute; +} + +br.clear { + height: 2px; + line-height: 0.15; +} + +.checkbox { + border: none; + margin: 0; + padding: 0; +} + +fieldset { + border: 0; + padding: 0; + margin: 0; +} + +.post-categories { + display: inline; + margin: 0; + padding: 0; +} + +.post-categories li { + display: inline; +} + +/* Star Ratings - Back-compat for pre-3.8 */ +div.star-holder { + position: relative; + height: 17px; + width: 100px; + background: url(../images/stars.png?ver=20121108) repeat-x bottom left; +} + +div.star-holder .star-rating { + background: url(../images/stars.png?ver=20121108) repeat-x top left; + height: 17px; + float: left; +} + +/* Star Ratings */ +.star-rating { + white-space: nowrap; +} +.star-rating .star { + display: inline-block; + width: 20px; + height: 20px; + -webkit-font-smoothing: antialiased; + font-size: 20px; + line-height: 1; + font-family: dashicons; + text-decoration: inherit; + font-weight: 400; + font-style: normal; + vertical-align: top; + transition: color .1s ease-in; + text-align: center; + color: #ffb900; +} + +.star-rating .star-full:before { + content: "\f155"; +} + +.star-rating .star-half:before { + content: "\f459"; +} + +.rtl .star-rating .star-half { + transform: rotateY(180deg); +} + +.star-rating .star-empty:before { + content: "\f154"; +} + +div.action-links { + font-weight: 400; + margin: 6px 0 0; +} + +/* Plugin install thickbox */ +#plugin-information { + background: #fff; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + height: 100%; + padding: 0; +} + +#plugin-information-scrollable { + overflow: auto; + -webkit-overflow-scrolling: touch; + height: 100%; +} + +#plugin-information-title { + padding: 0 26px; + background: #f5f5f5; + font-size: 22px; + font-weight: 600; + line-height: 2.4; + position: relative; + height: 56px; +} + +#plugin-information-title.with-banner { + margin-right: 0; + height: 250px; + background-size: cover; +} + +#plugin-information-title h2 { + font-size: 1em; + font-weight: 600; + padding: 0; + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#plugin-information-title.with-banner h2 { + position: relative; + font-family: "Helvetica Neue", sans-serif; + display: inline-block; + font-size: 30px; + line-height: 1.68; + box-sizing: border-box; + max-width: 100%; + padding: 0 15px; + margin-top: 174px; + color: #fff; + background: rgba(30, 30, 30, 0.9); + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); + box-shadow: 0 0 30px rgba(255, 255, 255, 0.1); + border-radius: 8px; +} + +#plugin-information-title div.vignette { + display: none; +} + +#plugin-information-title.with-banner div.vignette { + position: absolute; + display: block; + top: 0; + left: 0; + height: 250px; + width: 100%; + background: transparent; + box-shadow: inset 0 0 50px 4px rgba(0, 0, 0, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +#plugin-information-tabs { + padding: 0 16px; + position: relative; + right: 0; + left: 0; + min-height: 36px; + font-size: 0; + z-index: 1; + border-bottom: 1px solid #ddd; + background: #f3f3f3; +} + +#plugin-information-tabs a { + position: relative; + display: inline-block; + padding: 9px 10px; + margin: 0; + height: 18px; + line-height: 1.3; + font-size: 14px; + text-decoration: none; + transition: none; +} + +#plugin-information-tabs a.current { + margin: 0 -1px -1px; + background: #fff; + border: 1px solid #ddd; + border-bottom-color: #fff; + padding-top: 8px; + color: #32373c; +} + +#plugin-information-tabs.with-banner a.current { + border-top: none; + padding-top: 9px; +} + +#plugin-information-tabs a:active, +#plugin-information-tabs a:focus { + outline: none; +} + +#plugin-information-content { + overflow: hidden; /* equal height column trick */ + background: #fff; + position: relative; + top: 0; + right: 0; + left: 0; + min-height: 100%; + /* Height of title + tabs + install now */ + min-height: calc( 100% - 152px ); +} + +#plugin-information-content.with-banner { + /* Height of banner + tabs + install now */ + min-height: calc( 100% - 346px ); +} + +#section-holder { + position: relative; + top: 0; + right: 250px; + bottom: 0; + left: 0; + margin-top: 10px; + margin-right: 250px; /* FYI box */ + padding: 10px 26px; + margin-bottom: -99939px; /* 60px less than the padding below to accommodate footer */ + padding-bottom: 99999px; /* equal height column trick */ +} + +#section-holder .notice { + margin: 5px 0 15px; +} + +#section-holder .updated { + margin: 16px 0; +} + +#plugin-information .fyi { + float: right; + position: relative; + top: 0; + right: 0; + padding: 16px; + margin-bottom: -99939px; /* 60px less than the padding below to accommodate footer */ + padding-bottom: 99999px; /* equal height column trick */ + width: 217px; + border-left: 1px solid #ddd; + background: #f3f3f3; + color: #666; +} + +#plugin-information .fyi strong { + color: #444; +} + +#plugin-information .fyi h3 { + font-weight: 600; + text-transform: uppercase; + font-size: 12px; + color: #666; + margin: 24px 0 8px; +} + +#plugin-information .fyi h2 { + font-size: 0.9em; + margin-bottom: 0; + margin-right: 0; +} + +#plugin-information .fyi ul { + padding: 0; + margin: 0; + list-style: none; +} + +#plugin-information .fyi li { + margin: 0 0 10px; +} + +#plugin-information .fyi-description { + margin-top: 0; +} + +#plugin-information .counter-container { + margin: 3px 0; +} + +#plugin-information .counter-label { + float: left; + margin-right: 5px; + min-width: 55px; +} + +#plugin-information .counter-back { + height: 17px; + width: 92px; + background-color: #e5e5e5; + float: left; +} + +#plugin-information .counter-bar { + height: 17px; + background-color: #ffc733; /* slightly lighter than stars due to larger expanse */ + float: left; +} + +#plugin-information .counter-count { + margin-left: 5px; +} + +#plugin-information .fyi ul.contributors { + margin-top: 10px; +} + +#plugin-information .fyi ul.contributors li { + display: inline-block; + margin-right: 8px; + vertical-align: middle; +} + +#plugin-information .fyi ul.contributors li { + display: inline-block; + margin-right: 8px; + vertical-align: middle; +} + +#plugin-information .fyi ul.contributors li img { + vertical-align: middle; + margin-right: 4px; +} + +#plugin-information-footer { + padding: 13px 16px; + position: absolute; + right: 0; + bottom: 0; + left: 0; + height: 33px; /* 33+13+13+1=60 */ + border-top: 1px solid #ddd; + background: #f3f3f3; +} + +/* rtl:ignore */ +#plugin-information .section { + direction: ltr; +} + +/* rtl:ignore */ +#plugin-information .section ul, +#plugin-information .section ol { + list-style-type: disc; + margin-left: 24px; +} + +#plugin-information .section, +#plugin-information .section p { + font-size: 14px; + line-height: 1.7; +} + +#plugin-information #section-screenshots ol { + list-style: none; + margin: 0; +} + +#plugin-information #section-screenshots li img { + vertical-align: text-top; + margin-top: 16px; + max-width: 100%; + width: auto; + height: auto; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); +} + +/* rtl:ignore */ +#plugin-information #section-screenshots li p { + font-style: italic; + padding-left: 20px; +} + +#plugin-information pre { + padding: 7px; + overflow: auto; + border: 1px solid #ccc; +} + +#plugin-information blockquote { + border-left: 2px solid #ddd; + color: #666; + font-style: italic; + margin: 1em 0; + padding: 0 0 0 1em; +} + +/* rtl:ignore */ +#plugin-information .review { + overflow: hidden; /* clearfix */ + width: 100%; + margin-bottom: 20px; + border-bottom: 1px solid #e5e5e5; +} + +#plugin-information .review-title-section { + overflow: hidden; /* clearfix */ +} + +/* rtl:ignore */ +#plugin-information .review-title-section h4 { + display: inline-block; + float: left; + margin: 0 6px 0 0; +} + +#plugin-information .reviewer-info p { + clear: both; + margin: 0; + padding-top: 2px; +} + +/* rtl:ignore */ +#plugin-information .reviewer-info .avatar { + float: left; + margin: 4px 6px 0 0; +} + +/* rtl:ignore */ +#plugin-information .reviewer-info .star-rating { + float: left; +} + +/* rtl:ignore */ +#plugin-information .review-meta { + float: left; + margin-left: 0.75em; +} + +/* rtl:ignore */ +#plugin-information .review-body { + float: left; + width: 100%; +} + +.plugin-version-author-uri { + font-size: 13px; +} + +/* For non-js plugin installation screen ticket #36430. */ +.update-php .button.button-primary { + margin-right: 1em; +} + +@media screen and (max-width: 771px) { + #plugin-information-title.with-banner { + height: 100px; + } + + #plugin-information-title.with-banner h2 { + margin-top: 30px; + font-size: 20px; + line-height: 2; + max-width: 85%; + } + + #plugin-information-title.with-banner div.vignette { + height: 100px; + } + + #plugin-information-tabs { + overflow: hidden; /* clearfix */ + padding: 0; + height: auto; /* let tabs wrap */ + } + + #plugin-information-tabs a.current { + margin-bottom: 0; + border-bottom: none; + } + + #plugin-information .fyi { + float: none; + border: 1px solid #ddd; + position: static; + width: auto; + margin: 26px 26px 0; + padding-bottom: 0; /* reset from the two column height fix */ + } + + #section-holder { + position: static; + margin: 0; + padding-bottom: 70px; /* reset from the two column height fix, plus accommodate footer */ + } + + #plugin-information .fyi h3, + #plugin-information .fyi small { + display: none; + } + + #plugin-information-footer { + padding: 12px 16px 0; + height: 46px; + } +} + +/* Thickbox for the Plugin details modal. */ +#TB_window.plugin-details-modal { + background: #fcfcfc; +} + +#TB_window.plugin-details-modal.thickbox-loading:before { + content: ""; + display: block; + width: 20px; + height: 20px; + position: absolute; + left: 50%; + top: 50%; + z-index: -1; + margin: -10px 0 0 -10px; + background: #fcfcfc url(../images/spinner.gif) no-repeat center; + background-size: 20px 20px; + transform: translateZ(0); +} + +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + #TB_window.plugin-details-modal.thickbox-loading:before { + background-image: url(../images/spinner-2x.gif); + } +} + +.plugin-details-modal #TB_title { + float: left; + height: 1px; +} + +.plugin-details-modal #TB_ajaxWindowTitle { + display: none; +} + +.plugin-details-modal #TB_closeWindowButton { + left: auto; + right: -30px; + color: #eee; +} + +.plugin-details-modal #TB_closeWindowButton:hover, +.plugin-details-modal #TB_closeWindowButton:focus { + color: #00a0d2; + outline: none; + box-shadow: none; +} + +.plugin-details-modal .tb-close-icon { + display: none; +} + +.plugin-details-modal #TB_closeWindowButton:after { + content: "\f335"; + font: normal 32px/29px 'dashicons'; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* move plugin install close icon to top on narrow screens */ +@media screen and (max-width: 830px) { + .plugin-details-modal #TB_closeWindowButton { + right: 0; + top: -30px; + } +} + +/* @todo: move this. */ +img { + border: none; +} + +/* Metabox collapse arrow indicators */ +.sidebar-name .toggle-indicator:before, +.js .meta-box-sortables .postbox .toggle-indicator:before, +.bulk-action-notice .toggle-indicator:before, +.privacy-text-box .toggle-indicator:before { + content: "\f142"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +.js .widgets-holder-wrap.closed .toggle-indicator:before, +.js .meta-box-sortables .postbox.closed .handlediv .toggle-indicator:before, +.bulk-action-notice .bulk-action-errors-collapsed .toggle-indicator:before, +.privacy-text-box.closed .toggle-indicator:before { + content: "\f140"; +} + +.js .postbox .handlediv .toggle-indicator:before { + margin-top: 4px; + width: 20px; + border-radius: 50%; + text-indent: -1px; /* account for the dashicon alignment */ +} + +.rtl.js .postbox .handlediv .toggle-indicator:before { + text-indent: 1px; /* account for the dashicon alignment */ +} + +.bulk-action-notice .toggle-indicator:before { + line-height: 16px; + vertical-align: top; + color: #72777c; +} + +.js .postbox .handlediv:focus { + box-shadow: none; + outline: none; +} + +.js .postbox .handlediv:focus .toggle-indicator:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +/* @todo: appears to be Press This only and overridden */ +#photo-add-url-div input[type="text"] { + width: 300px; +} + +/* Theme/Plugin Editor */ +.alignleft h2 { + margin: 0; +} + +#template textarea { + font-family: Consolas, Monaco, monospace; + font-size: 13px; + background: #f9f9f9; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; +} + +#template textarea, +#template .CodeMirror { + width: 100%; + min-height: 60vh; + height: calc( 100vh - 295px ); + border: 1px solid #ddd; + box-sizing: border-box; +} + +#templateside > h2 { + padding-top: 6px; + padding-bottom: 7px; + margin: 0; +} + +#templateside ol, +#templateside ul { + margin: 0; + padding: 0; +} +#templateside > ul { + box-sizing: border-box; + margin-top: 0; + overflow: auto; + padding: 0; + min-height: 60vh; + height: calc(100vh - 295px); + background-color: #f7f7f7; + border: 1px solid #ddd; + border-left: none; +} +#templateside ul ul { + padding-left: 12px; +} +#templateside > ul > li > ul[role=group] { + padding-left: 0; +} + +/* + * Styles for Theme and Plugin editors. + */ + +/* Hide collapsed items. */ +[role="treeitem"][aria-expanded="false"] > ul { + display: none; +} + +/* Use arrow dashicons for folder states, but hide from screen readers. */ +[role="treeitem"] span[aria-hidden] { + display: inline; + font-family: dashicons; + font-size: 20px; + position: absolute; + pointer-events: none; +} +[role="treeitem"][aria-expanded="false"] > .folder-label .icon:after { + content: "\f139"; +} +[role="treeitem"][aria-expanded="true"] > .folder-label .icon:after { + content: "\f140"; +} +[role="treeitem"] .folder-label { + display: block; + padding: 3px 3px 3px 12px; + cursor: pointer; +} + +/* Remove outline, and create our own focus and hover styles */ +[role="treeitem"] { + outline: 0; +} +[role="treeitem"] .folder-label.focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} +[role="treeitem"].hover, +[role="treeitem"] .folder-label.hover { + background-color: #eaeaea; +} + +.tree-folder { + margin: 0; + position: relative; +} +[role="treeitem"] li { + position: relative; +} + +/* Styles for folder indicators/depth */ +.tree-folder .tree-folder::after { + content: ""; + display: block; + position: absolute; + left: 2px; + border-left: 1px solid #ccc; + top: -13px; + bottom: 10px; +} +.tree-folder > li::before { + content: ""; + position: absolute; + display: block; + border-left: 1px solid #ccc; + left: 2px; + top: -5px; + height: 18px; + width: 7px; + border-bottom: 1px solid #ccc; +} +.tree-folder > li::after { + content: ""; + position: absolute; + display: block; + border-left: 1px solid #ccc; + left: 2px; + bottom: -7px; + top: 0; +} + +/* current-file needs to adjustment for .notice styles */ +#templateside .current-file { + margin: -4px 0 -2px; +} +.tree-folder > .current-file::before { + left: 4px; + height: 15px; + width: 0px; + border-left: none; + top: 3px; +} +.tree-folder > .current-file::after { + bottom: -4px; + height: 7px; + left: 2px; + top: auto; +} + +/* Lines shouldn't continue on last item */ +.tree-folder > li:last-child::after, +.tree-folder li:last-child > .tree-folder::after { + display: none; +} + + +#theme-plugin-editor-label { + display: inline-block; + margin-bottom: 1em; + font-weight: 600; +} + +/* rtl:ignore */ +#template textarea, +#docs-list { + direction: ltr; +} + +.fileedit-sub #theme, +.fileedit-sub #plugin { + max-width: 40%; +} +.fileedit-sub .alignright { + text-align: right; +} + +#template p { + width: 97%; +} + +#file-editor-linting-error { + margin-top: 1em; + margin-bottom: 1em; +} +#file-editor-linting-error > .notice { + margin: 0; + display: inline-block; +} +#file-editor-linting-error > .notice > p { + width: auto; +} +#template .submit { + margin-top: 1em; + padding: 0; +} + +#template .submit input[type=submit][disabled] { + cursor: not-allowed; +} +#templateside { + float: right; + width: 16em; + word-wrap: break-word; +} + +#postcustomstuff p.submit { + margin: 0; +} + +#templateside h4 { + margin: 1em 0 0; +} + +#templateside li { + margin: 4px 0; +} + +#templateside li:not(.howto) a, +.theme-editor-php .highlight { + display: block; + padding: 3px 0 3px 12px; + text-decoration: none; +} + +#templateside li:not(.howto) > a:first-of-type { + padding-top: 0; +} + +#templateside li.howto { + padding: 6px 12px 12px 12px; +} + +.theme-editor-php .highlight { + margin: -3px 3px -3px -12px; +} + +#templateside .highlight { + border: none; + font-weight: 600; +} + +.nonessential { + color: #666; + font-size: 11px; + font-style: italic; + padding-left: 12px; +} + +#documentation { + margin-top: 10px; +} + +#documentation label { + line-height: 1.8; + vertical-align: baseline; + font-weight: 600; +} + +.fileedit-sub { + padding: 10px 0 8px; + line-height: 180%; +} + +#file-editor-warning .file-editor-warning-content { + margin: 25px; +} + +/* @todo: can we use a common class for these? */ +.nav-menus-php .item-edit:before, +.widget-top .widget-action .toggle-indicator:before, +.control-section .accordion-section-title:after, +.accordion-section-title:after { + content: "\f140"; + font: normal 20px/1 dashicons; + speak: none; + display: block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +.widget-top .widget-action .toggle-indicator:before { + padding: 1px 2px 1px 0px; + border-radius: 50%; +} + +.handlediv, +.postbox .handlediv.button-link, +.item-edit, +.toggle-indicator, +.accordion-section-title:after { + color: #72777c; +} + +.widget-action { + color: #555d66; /* #fafafa background in the Widgets screen */ +} + +.widget-top:hover .widget-action, +.widget-action:focus, +.handlediv:hover, +.handlediv:focus, +.postbox .handlediv.button-link:hover, +.postbox .handlediv.button-link:focus, +.item-edit:hover, +.item-edit:focus, +.sidebar-name:hover .toggle-indicator, +.accordion-section-title:hover:after { + color: #23282d; +} + +.widget-top .widget-action:focus .toggle-indicator:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.control-section .accordion-section-title:after, +.accordion-section-title:after { + float: right; + right: 20px; + top: -2px; +} + +.control-section.open .accordion-section-title:after, +#customize-info.open .accordion-section-title:after, +.nav-menus-php .menu-item-edit-active .item-edit:before, +.widget.open .widget-top .widget-action .toggle-indicator:before, +.widget.widget-in-question .widget-top .widget-action .toggle-indicator:before { + content: "\f142"; +} + +/*! + * jQuery UI Draggable/Sortable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ +.ui-draggable-handle, +.ui-sortable-handle { + touch-action: none; +} + +/* Accordion */ +.accordion-section { + border-bottom: 1px solid #ddd; + margin: 0; +} + +.accordion-section.open .accordion-section-content, +.no-js .accordion-section .accordion-section-content { + display: block; +} + +.accordion-section.open:hover { + border-bottom-color: #ddd; +} + +.accordion-section-content { + display: none; + padding: 10px 20px 15px; + overflow: hidden; + background: #fff; +} + +.accordion-section-title { + margin: 0; + padding: 12px 15px 15px; + position: relative; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.js .accordion-section-title { + cursor: pointer; +} + +.js .accordion-section-title:after { + position: absolute; + top: 12px; + right: 10px; + z-index: 1; +} + +.accordion-section-title:focus { + outline: none; +} + +.accordion-section-title:hover:after, +.accordion-section-title:focus:after { + border-color: #a0a5aa transparent; +} + +.cannot-expand .accordion-section-title { + cursor: auto; +} + +.cannot-expand .accordion-section-title:after { + display: none; +} + +.control-section .accordion-section-title, +.customize-pane-child .accordion-section-title { + border-left: none; + border-right: none; + padding: 10px 10px 11px 14px; + line-height: 1.55; + background: #fff; +} + +.control-section .accordion-section-title:after, +.customize-pane-child .accordion-section-title:after { + top: calc(50% - 10px); /* Arrow height is 20px, so use half of that to vertically center */ +} + +.js .control-section:hover .accordion-section-title, +.js .control-section .accordion-section-title:hover, +.js .control-section.open .accordion-section-title, +.js .control-section .accordion-section-title:focus { + color: #23282d; + background: #f5f5f5; +} + +.control-section.open .accordion-section-title { + /* When expanded */ + border-bottom: 1px solid #ddd; +} + +/* Edit Site */ +.network-admin .edit-site-actions { + margin-top: 0; +} + +/* My Sites */ +.my-sites { + display: block; + overflow: auto; + zoom: 1; +} + +.my-sites li { + display: block; + padding: 8px 3%; + min-height: 130px; + margin: 0; +} + +@media only screen and (max-width: 599px) { + .my-sites li { + min-height: 0; + } +} + +@media only screen and (min-width: 600px) { + .my-sites.striped li { + background-color: #fff; + position: relative; + } + .my-sites.striped li:after { + content: ""; + width: 1px; + height: 100%; + position: absolute; + top: 0; + right: 0; + background: #ccc; + } + +} +@media only screen and (min-width: 600px) and (max-width: 699px) { + .my-sites li{ + float: left; + width: 44%; + } + .my-sites.striped li { + background-color: #fff; + } + .my-sites.striped li:nth-of-type(2n+1) { + clear: left; + } + .my-sites.striped li:nth-of-type(2n+2):after { + content: none; + } + .my-sites li:nth-of-type(4n+1), + .my-sites li:nth-of-type(4n+2) { + background-color: #f9f9f9; + } + +} + +@media only screen and (min-width: 700px) and (max-width: 1199px) { + .my-sites li { + float: left; + width: 27.333333%; + background-color: #fff; + } + .my-sites.striped li:nth-of-type(3n+3):after { + content: none; + } + .my-sites li:nth-of-type(6n+1), + .my-sites li:nth-of-type(6n+2), + .my-sites li:nth-of-type(6n+3) { + background-color: #f9f9f9; + } +} + +@media only screen and (min-width: 1200px) and (max-width: 1399px) { + .my-sites li { + float: left; + width: 21%; + padding: 8px 2%; + background-color: #fff; + } + .my-sites.striped li:nth-of-type(4n+1) { + clear: left; + } + .my-sites.striped li:nth-of-type(4n+4):after { + content: none; + } + .my-sites li:nth-of-type(8n+1), + .my-sites li:nth-of-type(8n+2), + .my-sites li:nth-of-type(8n+3), + .my-sites li:nth-of-type(8n+4) { + background-color: #f9f9f9; + } +} + +@media only screen and (min-width: 1400px) and (max-width: 1599px) { + .my-sites li { + float: left; + width: 16%; + padding: 8px 2%; + background-color: #fff; + } + .my-sites.striped li:nth-of-type(5n+1) { + clear: left; + } + .my-sites.striped li:nth-of-type(5n+5):after { + content: none; + } + .my-sites li:nth-of-type(10n+1), + .my-sites li:nth-of-type(10n+2), + .my-sites li:nth-of-type(10n+3), + .my-sites li:nth-of-type(10n+4), + .my-sites li:nth-of-type(10n+5) { + background-color: #f9f9f9; + } +} + +@media only screen and (min-width: 1600px) { + .my-sites li { + float: left; + width: 12.666666%; + padding: 8px 2%; + background-color: #fff; + } + .my-sites.striped li:nth-of-type(6n+1) { + clear: left; + } + .my-sites.striped li:nth-of-type(6n+6):after { + content: none; + } + .my-sites li:nth-of-type(12n+1), + .my-sites li:nth-of-type(12n+2), + .my-sites li:nth-of-type(12n+3), + .my-sites li:nth-of-type(12n+4), + .my-sites li:nth-of-type(12n+5), + .my-sites li:nth-of-type(12n+6) { + background-color: #f9f9f9; + } +} + +.my-sites li a { + text-decoration: none; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + /* Back-compat for pre-3.8 */ + div.star-holder, + div.star-holder .star-rating { + background: url(../images/stars-2x.png?ver=20121108) repeat-x bottom left; + background-size: 21px 37px; + } + + .spinner { + background-image: url(../images/spinner-2x.gif); + } + + /* @todo: evaluate - most of these were likely replaced by dashicons */ + .curtime #timestamp, + #screen-meta-links a.show-settings, + .widget-top .widget-action, + .widget-top .widget-action:hover, + .sidebar-name .toggle-indicator, + .sidebar-name:hover .toggle-indicator, + .meta-box-sortables .postbox:hover .handlediv, + #bulk-titles div a, + #bulk-titles div a:hover { + background: none !important; + } + +} + +@-ms-viewport { + width: device-width; +} + +@media screen and (max-width: 782px) { + html.wp-toolbar { + padding-top: 46px; + } + + .screen-reader-shortcut:focus { + top: -39px; + } + + body { + min-width: 240px; + overflow-x: hidden; + } + + body * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important; + } + + #wpcontent { + position: relative; + margin-left: 0; + padding-left: 10px; + } + + #wpbody-content { + padding-bottom: 100px; + } + + .wrap { + clear: both; + margin-right: 12px; + margin-left: 0; + } + + /* categories */ + #col-left, + #col-right { + float: none; + width: auto; + } + + #col-left .col-wrap, + #col-right .col-wrap { + padding: 0; + } + + /* Hidden Elements */ + #collapse-menu, + .post-format-select { + display: none !important; + } + + .wrap h1.wp-heading-inline { + margin-bottom: 0.5em; + } + + .wrap .add-new-h2, /* deprecated */ + .wrap .add-new-h2:active, /* deprecated */ + .wrap .page-title-action, + .wrap .page-title-action:active { + padding: 10px 15px; + font-size: 14px; + white-space: nowrap; + } + + /* Feedback Messages */ + .notice, + .wrap div.updated, + .wrap div.error, + .media-upload-form div.error { + margin: 20px 0 10px 0; + padding: 5px 10px; + font-size: 14px; + line-height: 175%; + } + + .wp-core-ui .notice.is-dismissible { + padding-right: 46px; + } + + .notice-dismiss { + padding: 13px; + } + + .wrap .icon32 + h2 { + margin-top: -2px; + } + + .wp-responsive-open #wpbody { + right: -16em; + } + + code { + word-wrap: break-word; + word-wrap: anywhere; /* Firefox. Allow breaking long words anywhere */ + word-break: break-word; /* Webkit: Treated similarly to word-wrap: break-word */ + } + + /* General Metabox */ + .postbox { + font-size: 14px; + } + + .metabox-holder h3.hndle, /* Back-compat for pre-4.4 */ + .metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */ + .metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */ + .metabox-holder h2 { + padding: 12px; + } + + .postbox .handlediv { + margin-top: 3px; + } + + /* Subsubsub Nav */ + .subsubsub { + font-size: 16px; + text-align: center; + margin-bottom: 15px; + } + + /* Theme/Plugin File Editor */ + + #template textarea, + #template .CodeMirror { + box-sizing: border-box; + } + + #templateside { + float: none; + width: auto; + } + + #templateside > ul { + border-left: 1px solid #ddd; + } + + #templateside li { + margin: 0; + } + + #templateside li:not(.howto) a { + display: block; + padding: 5px; + } + #templateside li.howto { + padding: 12px; + } + + #templateside .highlight { + padding: 5px; + margin-left: -5px; + margin-top: -5px; + } + + #template > div, + #template .notice { + float: none; + margin: 1em 0; + width: auto; + } + + #template .CodeMirror, + #template textarea { + width: 100%; + } + + #templateside ul ul { + padding-left: 1.5em; + } + [role="treeitem"] .folder-label { + display: block; + padding: 5px; + } + .tree-folder > li::before, + .tree-folder > li::after, + .tree-folder .tree-folder::after { + left: -8px; + } + .tree-folder > li::before { + top: 0px; + height: 13px; + } + .tree-folder > .current-file::before { + left: -5px; + top: 7px; + width: 4px; + } + .tree-folder > .current-file::after { + height: 9px; + left: -8px; + } + .wrap #templateside span.notice { + margin-left: -5px; + width: 100%; + } + + .fileedit-sub .alignright { + float: left; + margin-top: 15px; + width: 100%; + text-align: left; + } + + .fileedit-sub .alignright label { + display: block; + } + + .fileedit-sub #theme, + .fileedit-sub #plugin { + margin-left: 0; + max-width: 70%; + } + + .fileedit-sub input[type="submit"] { + margin-bottom: 0; + } + + #documentation label[for="docs-list"] { + display: block; + } + + #documentation select[name="docs-list"] { + margin-left: 0; + max-width: 60%; + } + + #documentation input[type="button"] { + margin-bottom: 0; + } + + #wpfooter { + display: none; + } + + #comments-form .checkforspam { + display: none; + } + + .edit-comment-author { + margin: 2px 0 0; + } + + .filter-drawer .filter-group-feature input, + .filter-drawer .filter-group-feature label { + line-height: 2.1; + } + + .filter-drawer .filter-group-feature label { + margin-left: 32px; + } + + .wp-filter .button.drawer-toggle { + font-size: 13px; + line-height: 2; + height: 28px; + } + + /* Fix help tab columns for smaller screens */ + #screen-meta #contextual-help-wrap { + overflow: visible; + } + + #screen-meta #contextual-help-back, + #screen-meta .contextual-help-sidebar { + display: none; + } + + #screen-meta .contextual-help-tabs { + clear: both; + width: 100%; + float: none; + } + + #screen-meta .contextual-help-tabs ul { + margin: 0 0 1em; + padding: 1em 0 0; + } + + #screen-meta .contextual-help-tabs .active { + margin: 0; + } + + #screen-meta .contextual-help-tabs-wrap { + clear: both; + max-width: 100%; + float: none; + } + + #screen-meta-links { + margin-bottom: 20px; /* Add margins beneath links for better spacing between boxes and elements */ + } + + .wp-filter .search-form input[type="search"] { + font-size: 1rem; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + /* Disable horizontal scroll when responsive menu is open + since we push the main content off to the right. */ + #wpwrap.wp-responsive-open { + overflow-x: hidden; + } + + html.wp-toolbar { + padding-top: 0; + } + + .screen-reader-shortcut:focus { + top: 7px; + } + + #wpbody { + padding-top: 46px; + } + + /* Keep full-width boxes on Edit Post page from causing horizontal scroll */ + div#post-body.metabox-holder.columns-1 { + overflow-x: hidden; + } + + h1.nav-tab-wrapper, + .wrap h2.nav-tab-wrapper, + .nav-tab-wrapper { + border-bottom: 0; + } + + h1 .nav-tab, + h2 .nav-tab, + h3 .nav-tab, + nav .nav-tab { + margin: 10px 10px 0 0; + border-bottom: 1px solid #ccc; + } + + .nav-tab-active:hover, + .nav-tab-active:focus, + .nav-tab-active:focus:active { + border-bottom: 1px solid #ccc; + } + + .wp-filter .search-form input[type="search"] { + width: 100%; + } +} + +@media screen and (max-width: 320px) { + /* Prevent default center alignment and larger font for the Right Now widget when + the network dashboard is viewed on a small mobile device. */ + #network_dashboard_right_now .subsubsub { + font-size: 14px; + text-align: left; + } +} diff --git a/wp-admin/css/common.min.css b/wp-admin/css/common.min.css new file mode 100644 index 0000000..f72cbaa --- /dev/null +++ b/wp-admin/css/common.min.css @@ -0,0 +1,9 @@ +/*! This file is auto-generated */ +#wpwrap{height:auto;min-height:100%;width:100%;position:relative;-webkit-font-smoothing:subpixel-antialiased}#wpcontent{height:100%;padding-left:20px}#wpcontent,#wpfooter{margin-left:160px}.folded #wpcontent,.folded #wpfooter{margin-left:36px}#wpbody-content{padding-bottom:65px;float:left;width:100%;overflow:visible!important}.inner-sidebar{float:right;clear:right;display:none;width:281px;position:relative}.columns-2 .inner-sidebar{margin-right:auto;width:286px;display:block}.columns-2 .inner-sidebar #side-sortables,.inner-sidebar #side-sortables{min-height:300px;width:280px;padding:0}.has-right-sidebar .inner-sidebar{display:block}.has-right-sidebar #post-body{float:left;clear:left;width:100%;margin-right:-2000px}.has-right-sidebar #post-body-content{margin-right:300px;float:none;width:auto}#col-left{float:left;width:35%}#col-right{float:right;width:65%}#col-left .col-wrap{padding:0 6px 0 0}#col-right .col-wrap{padding:0 0 0 6px}.alignleft{float:left}.alignright{float:right}.textleft{text-align:left}.textright{text-align:right}.clear{clear:both}.wp-clearfix:after{content:"";display:table;clear:both}.screen-reader-text,.screen-reader-text span,.ui-helper-hidden-accessible{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;width:1px;word-wrap:normal!important}.button .screen-reader-text{height:auto}.screen-reader-shortcut{position:absolute;top:-1000em}.screen-reader-shortcut:focus{left:6px;top:-25px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#0073aa;z-index:100000;line-height:normal;box-shadow:0 0 2px 2px rgba(0,0,0,.6);text-decoration:none;outline:2px solid transparent;outline-offset:-2px}.hidden,.js .closed .inside,.js .hide-if-js,.js .wp-core-ui .hide-if-js,.js.wp-core-ui .hide-if-js,.no-js .hide-if-no-js,.no-js .wp-core-ui .hide-if-no-js,.no-js.wp-core-ui .hide-if-no-js{display:none}#menu-management .menu-edit,#menu-settings-column .accordion-container,.comment-ays,.feature-filter,.imgedit-group,.manage-menus,.menu-item-handle,.popular-tags,.stuffbox,.widget-inside,.widget-top,.widgets-holder-wrap,.wp-editor-container,p.popular-tags,table.widefat{border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04)}.comment-ays,.feature-filter,.imgedit-group,.popular-tags,.stuffbox,.widgets-holder-wrap,.wp-editor-container,p.popular-tags,table.widefat{background:#fff}body,html{height:100%;margin:0;padding:0}body{background:#f1f1f1;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.4em;min-width:600px}body.iframe{min-width:0;padding-top:1px}body.modal-open{overflow:hidden}body.mobile.modal-open #wpwrap{overflow:hidden;position:fixed;height:100%}iframe,img{border:0}td{font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit}a{color:#0073aa;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}a,div{outline:0}a:active,a:hover{color:#00a0d2}.wp-person a:focus .gravatar,a:focus,a:focus .media-icon img{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:1px solid transparent}.ie8 a:focus{outline:#5b9dd9 solid 1px}#adminmenu a:focus{box-shadow:none;outline:1px solid transparent;outline-offset:-1px}.screen-reader-text:focus{box-shadow:none;outline:0}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}p{font-size:13px;line-height:1.5;margin:1em 0}blockquote{margin:1em}dd,li{margin-bottom:6px}h1,h2,h3,h4,h5,h6{display:block;font-weight:600}h1{color:#23282d;font-size:2em;margin:.67em 0}h2,h3{color:#23282d;font-size:1.3em;margin:1em 0}.update-core-php h2{margin-top:2em}.update-messages h2,.update-php h2,h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}ol,ul{padding:0}ul{list-style:none}ol{list-style-type:decimal;margin-left:2em}ul.ul-disc{list-style:disc outside}ul.ul-square{list-style:square outside}ol.ol-decimal{list-style:decimal outside}ol.ol-decimal,ul.ul-disc,ul.ul-square{margin-left:1.8em}ol.ol-decimal>li,ul.ul-disc>li,ul.ul-square>li{margin:0 0 .5em}.ltr{direction:ltr}.code,code{font-family:Consolas,Monaco,monospace;direction:ltr;unicode-bidi:embed}code,kbd{padding:3px 5px 2px 5px;margin:0 1px;background:#eaeaea;background:rgba(0,0,0,.07);font-size:13px}.subsubsub{list-style:none;margin:8px 0 0;padding:0;font-size:13px;float:left;color:#666}.subsubsub a{line-height:2;padding:.2em;text-decoration:none}.subsubsub a .count,.subsubsub a.current .count{color:#555d66;font-weight:400}.subsubsub a.current{font-weight:600;border:none}.subsubsub li{display:inline-block;margin:0;padding:0;white-space:nowrap}.wp-die-message{font-size:13px;line-height:1.5;margin:1em 0}.widefat{border-spacing:0;width:100%;clear:both;margin:0}.widefat *{word-wrap:break-word}.widefat a,.widefat button.button-link{text-decoration:none}.widefat td,.widefat th{padding:8px 10px}.widefat thead td,.widefat thead th{border-bottom:1px solid #ccd0d4}.widefat tfoot td,.widefat tfoot th{border-top:1px solid #ccd0d4;border-bottom:none}.widefat .no-items td{border-bottom-width:0}.widefat td{vertical-align:top}.widefat td,.widefat td ol,.widefat td p,.widefat td ul{font-size:13px;line-height:1.5em}.widefat tfoot td,.widefat th,.widefat thead td{text-align:left;line-height:1.3em;font-size:14px}.updates-table td input,.widefat tfoot td input,.widefat th input,.widefat thead td input{margin:0 0 0 8px;padding:0;vertical-align:text-top}.widefat .check-column{width:2.2em;padding:6px 0 25px;vertical-align:top}.widefat tbody th.check-column{padding:9px 0 22px}.updates-table tbody td.check-column,.widefat tbody th.check-column,.widefat tfoot td.check-column,.widefat thead td.check-column{padding:11px 0 0 3px}.widefat tfoot td.check-column,.widefat thead td.check-column{padding-top:4px;vertical-align:middle}.update-php div.error,.update-php div.updated{margin-left:0}.no-js .widefat tfoot .check-column input,.no-js .widefat thead .check-column input{display:none}.column-comments,.column-links,.column-posts,.widefat .num{text-align:center}.widefat th#comments{vertical-align:middle}.wrap{margin:10px 20px 0 2px}.wrap.block-editor-no-js{padding-left:20px}.postbox .inside h2,.wrap [class$=icon32]+h2,.wrap h1,.wrap>h2:first-child{font-size:23px;font-weight:400;margin:0;padding:9px 0 4px 0;line-height:1.3}.wrap h1.wp-heading-inline{display:inline-block;margin-right:5px}.wp-header-end{visibility:hidden;margin:-2px 0 0}.subtitle{margin:0;padding-left:25px;color:#555d66;font-size:14px;font-weight:400;line-height:1}.wrap .add-new-h2,.wrap .add-new-h2:active,.wrap .page-title-action,.wrap .page-title-action:active{margin-left:4px;padding:4px 8px;position:relative;top:-3px;text-decoration:none;border:1px solid #0071a1;border-radius:2px;text-shadow:none;font-weight:600;font-size:13px;line-height:normal;color:#0071a1;background:#f3f5f6;cursor:pointer}.wrap .wp-heading-inline+.page-title-action{margin-left:0}.wrap .add-new-h2:hover,.wrap .page-title-action:hover{background:#f1f1f1;border-color:#016087;color:#016087}.page-title-action:focus{color:#016087}.form-table th label[for=WPLANG] .dashicons,.form-table th label[for=locale] .dashicons{margin-left:5px}.wrap .page-title-action:focus{border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.wrap h1.long-header{padding-right:0}.wp-dialog{background-color:#fff}#available-widgets .widget-top:hover,#widgets-left .widget-in-question .widget-top,#widgets-left .widget-top:hover,.widgets-chooser ul,div#widgets-right .widget-top:hover{border-color:#999;box-shadow:0 1px 2px rgba(0,0,0,.1)}.sorthelper{background-color:#ccf3fa}.ac_match,.subsubsub a.current{color:#000}.alternate,.striped>tbody>:nth-child(odd),ul.striped>:nth-child(odd){background-color:#f9f9f9}.bar{background-color:#e8e8e8;border-right-color:#99d}.highlight{background-color:#e4f2fd;color:#000}.wp-ui-primary{color:#fff;background-color:#32373c}.wp-ui-text-primary{color:#32373c}.wp-ui-highlight{color:#fff;background-color:#1e8cbe}.wp-ui-text-highlight{color:#1e8cbe}.wp-ui-notification{color:#fff;background-color:#d54e21}.wp-ui-text-notification{color:#d54e21}.wp-ui-text-icon{color:#82878c}img.emoji{display:inline!important;border:none!important;height:1em!important;width:1em!important;margin:0 .07em!important;vertical-align:-.1em!important;background:0 0!important;padding:0!important;box-shadow:none!important}#nav-menu-footer,#nav-menu-header,#your-profile #rich_editing,.checkbox,.control-section .accordion-section-title,.menu-item-handle,.postbox .hndle,.side-info,.sidebar-name,.stuffbox .hndle,.widefat tfoot td,.widefat tfoot th,.widefat thead td,.widefat thead th,.widget .widget-top{line-height:1.4em}.menu-item-handle,.widget .widget-top{background:#fafafa;color:#23282d}.postbox .hndle,.stuffbox .hndle{border-bottom:1px solid #ccd0d4}.quicktags{background-color:#ccc;color:#000;font-size:12px}.icon32{display:none}#bulk-titles div a:before,.notice-dismiss:before,.tagchecklist .ntdelbutton .remove-tag-icon:before,.welcome-panel .welcome-panel-close:before{background:0 0;color:#72777c;content:"\f153";display:block;font:normal 16px/20px dashicons;speak:none;height:20px;text-align:center;width:20px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.welcome-panel .welcome-panel-close:before{margin:0}#bulk-titles div a:before{margin:1px 0}.tagchecklist .ntdelbutton .remove-tag-icon:before{margin-left:2px;border-radius:50%;color:#0073aa;line-height:1.28}.tagchecklist .ntdelbutton:focus{outline:0}#bulk-titles div a:focus:before,#bulk-titles div a:hover:before,.tagchecklist .ntdelbutton:focus .remove-tag-icon:before,.tagchecklist .ntdelbutton:hover .remove-tag-icon:before,.welcome-panel .welcome-panel-close:focus:before,.welcome-panel .welcome-panel-close:hover:before{color:#c00}.tagchecklist .ntdelbutton:focus .remove-tag-icon:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.key-labels label{line-height:24px}b,strong{font-weight:600}.pre{white-space:pre-wrap;word-wrap:break-word}.howto{color:#666;font-style:italic;display:block}p.install-help{margin:8px 0;font-style:italic}.no-break{white-space:nowrap}hr{border:0;border-top:1px solid #ddd;border-bottom:1px solid #fafafa}#all-plugins-table .plugins a.delete,#delete-link a.delete,#media-items a.delete,#media-items a.delete-permanently,#nav-menu-footer .menu-delete,#search-plugins-table .plugins a.delete,.plugins a.delete,.row-actions span.delete a,.row-actions span.spam a,.row-actions span.trash a,.submitbox .submitdelete{color:#a00}#all-plugins-table .plugins a.delete:hover,#delete-link a.delete:hover,#media-items a.delete-permanently:hover,#media-items a.delete:hover,#nav-menu-footer .menu-delete:hover,#search-plugins-table .plugins a.delete:hover,.file-error,.plugins a.delete:hover,.row-actions .delete a:hover,.row-actions .spam a:hover,.row-actions .trash a:hover,.submitbox .submitdelete:hover,abbr.required,span.required{color:#dc3232;border:none}#major-publishing-actions{padding:10px;clear:both;border-top:1px solid #ddd;background:#f5f5f5}#delete-action{float:left;line-height:2.30769231}#delete-link{line-height:2.30769231;vertical-align:middle;text-align:left;margin-left:8px}#delete-link a{text-decoration:none}#publishing-action{text-align:right;float:right;line-height:1.9}#publishing-action .spinner{float:none;margin-top:5px}#misc-publishing-actions{padding:6px 0 0}.misc-pub-section{padding:6px 10px 8px}.misc-pub-filename{word-wrap:break-word}#minor-publishing-actions{padding:10px 10px 0 10px;text-align:right}#save-post{float:left}.preview{float:right}#sticky-span{margin-left:18px}.approve,.unapproved .unapprove{display:none}.spam .approve,.trash .approve,.unapproved .approve{display:inline}td.action-links,th.action-links{text-align:right}#misc-publishing-actions .notice{margin-left:10px;margin-right:10px}.wp-filter{display:inline-block;position:relative;box-sizing:border-box;margin:12px 0 25px;padding:0 10px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.04);border:1px solid #ccd0d4;background:#fff;color:#555;font-size:13px}.wp-filter a{text-decoration:none}.filter-count{display:inline-block;vertical-align:middle;min-width:4em}.filter-count .count,.title-count{display:inline-block;position:relative;top:-1px;padding:4px 10px;border-radius:30px;background:#72777c;color:#fff;font-size:14px;font-weight:600}.title-count{display:inline;top:-3px;margin-left:5px;margin-right:20px}.filter-items{float:left}.filter-links{display:inline-block;margin:0}.filter-links li{display:inline-block;margin:0}.filter-links li>a{display:inline-block;margin:0 10px;padding:15px 0;border-bottom:4px solid #fff;color:#666;cursor:pointer}.filter-links .current{box-shadow:none;border-bottom:4px solid #666;color:#23282d}.filter-links li>a:focus,.filter-links li>a:hover,.show-filters .filter-links a.current:focus,.show-filters .filter-links a.current:hover{color:#00a0d2}.wp-filter .search-form{float:right;margin:10px 0}.wp-filter .search-form input[type=search]{margin:1px 0;width:280px;max-width:100%}.wp-filter .search-form select{margin:0}.wp-filter .search-form.search-plugins{display:inline-block}.wp-filter .button.drawer-toggle{margin:10px 9px 0;padding:0 10px 0 6px;border-color:transparent;background-color:transparent;color:#666;vertical-align:baseline;box-shadow:none}.wp-filter .drawer-toggle:before{content:"\f111";margin:0 5px 0 0;color:#72777c;font:normal 16px/1 dashicons;vertical-align:text-bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-filter .button.drawer-toggle:focus,.wp-filter .button.drawer-toggle:hover,.wp-filter .drawer-toggle:focus:before,.wp-filter .drawer-toggle:hover:before{background-color:transparent;color:#00a0d2}.wp-filter .button.drawer-toggle:focus:active,.wp-filter .button.drawer-toggle:hover{border-color:transparent}.wp-filter .button.drawer-toggle:focus{border-color:#5b9dd9}.wp-filter .button.drawer-toggle:active{background:0 0;box-shadow:none;transform:none}.wp-filter .drawer-toggle.current:before{color:#fff}.filter-drawer,.wp-filter .favorites-form{display:none;margin:0 -10px 0 -20px;padding:20px;border-top:1px solid #eee;background:#fafafa;overflow:hidden}.show-favorites-form .favorites-form,.show-filters .filter-drawer{display:block}.show-filters .filter-links a.current{border-bottom:none}.show-filters .wp-filter .button.drawer-toggle{border-radius:2px;background:#72777c;color:#fff}.show-filters .wp-filter .drawer-toggle:focus,.show-filters .wp-filter .drawer-toggle:hover{background:#2ea2cc}.show-filters .wp-filter .drawer-toggle:before{color:#fff}.filter-group{box-sizing:border-box;position:relative;float:left;margin:0 1% 0 0;padding:20px 10px 10px;width:24%;background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04)}.filter-group legend{position:absolute;top:10px;display:block;margin:0;padding:0;font-size:1em;font-weight:600}.filter-drawer .filter-group-feature{margin:28px 0 0;list-style-type:none;font-size:12px}.filter-drawer .filter-group-feature input,.filter-drawer .filter-group-feature label{line-height:1.4}.filter-drawer .filter-group-feature input{position:absolute;margin:0}.filter-group .filter-group-feature label{display:block;margin:14px 0 14px 23px}.filter-drawer .buttons{clear:both;margin-bottom:20px}.filter-drawer .filter-group+.buttons{margin-bottom:0;padding-top:20px}.filter-drawer .buttons .button span{display:inline-block;opacity:.8;font-size:12px;text-indent:10px}.wp-filter .button.clear-filters{display:none;margin-left:10px}.wp-filter .button-link.edit-filters{padding:0 5px;line-height:2.2}.filtered-by{display:none;margin:0}.filtered-by>span{font-weight:600}.filtered-by a{margin-left:10px}.filtered-by .tags{display:inline}.filtered-by .tag{margin:0 5px;padding:4px 8px;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;font-size:11px}.filters-applied .filter-drawer .buttons,.filters-applied .filter-drawer br,.filters-applied .filter-group{display:none!important}.filters-applied .filtered-by{display:block}.filters-applied .filter-drawer{padding:20px}.error .content-filterable,.loading-content .content-filterable,.show-filters .content-filterable,.show-filters .favorites-form,.show-filters.filters-applied.loading-content .content-filterable{display:none}.show-filters.filters-applied .content-filterable{display:block}.loading-content .spinner{display:block;margin:40px auto 0;float:none}@media only screen and (max-width:1120px){.filter-drawer{border-bottom:1px solid #eee}.filter-group{margin-bottom:0;margin-top:5px;width:100%}.filter-group li{margin:10px 0}}@media only screen and (max-width:1000px){.filter-items{float:none}.wp-filter .media-toolbar-primary,.wp-filter .media-toolbar-secondary,.wp-filter .search-form{float:none;position:relative;max-width:100%}}@media only screen and (max-width:782px){.filter-group li{padding:0;width:50%}}@media only screen and (max-width:320px){.filter-count{display:none}.wp-filter .drawer-toggle{margin:10px 0}.filter-group li,.wp-filter .search-form input[type=search]{width:100%}}.notice,div.error,div.updated{background:#fff;border:1px solid #ccd0d4;border-left-width:4px;box-shadow:0 1px 1px rgba(0,0,0,.04);margin:5px 15px 2px;padding:1px 12px}div[class=update-message]{padding:.5em 12px .5em 0}.form-table td .notice p,.notice p,.notice-title,div.error p,div.updated p{margin:.5em 0;padding:2px}.error a{text-decoration:underline}.updated a{padding-bottom:2px}.notice-alt{box-shadow:none}.notice-large{padding:10px 20px}.notice-title{display:inline-block;color:#23282d;font-size:18px}.wp-core-ui .notice.is-dismissible{padding-right:38px;position:relative}.notice-dismiss{position:absolute;top:0;right:1px;border:none;margin:0;padding:9px;background:0 0;color:#72777c;cursor:pointer}.notice-dismiss:active:before,.notice-dismiss:focus:before,.notice-dismiss:hover:before{color:#c00}.notice-dismiss:focus{outline:0;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.ie8 .notice-dismiss:focus{outline:1px solid #5b9dd9}.notice-success,div.updated{border-left-color:#46b450}.notice-success.notice-alt{background-color:#ecf7ed}.notice-warning{border-left-color:#ffb900}.notice-warning.notice-alt{background-color:#fff8e5}.notice-error,div.error{border-left-color:#dc3232}.notice-error.notice-alt{background-color:#fbeaea}.notice-info{border-left-color:#00a0d2}.notice-info.notice-alt{background-color:#e5f5fa}.button.installed:before,.button.installing:before,.button.updated-message:before,.button.updating-message:before,.import-php .updating-message:before,.update-message p:before,.updated-message p:before,.updating-message p:before{display:inline-block;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.media-upload-form .notice,.media-upload-form div.error,.wrap .notice,.wrap div.error,.wrap div.updated{margin:5px 0 15px}.wrap #templateside .notice{display:block;margin:0;padding:5px 8px;font-weight:600;text-decoration:none}.wrap #templateside span.notice{margin-left:-12px}#templateside li.notice a{padding:0}.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.update-message p:before,.updating-message p:before{color:#f56e28;content:"\f463"}.button.installing:before,.button.updating-message:before,.import-php .updating-message:before,.updating-message p:before{animation:rotation 2s infinite linear}.button.updated-message:before,.installed p:before,.updated-message p:before{color:#79ba49;content:"\f147"}.update-message.notice-error p:before{color:#dc3232;content:"\f534"}.import-php .updating-message:before,.wrap .notice p:before{margin-right:6px;vertical-align:bottom}#update-nag,.update-nag{display:inline-block;line-height:1.4;padding:11px 15px;font-size:14px;text-align:left;margin:25px 20px 0 2px;background-color:#fff;border-left:4px solid #ffba00;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}ul#dismissed-updates{display:none}#dismissed-updates li>p{margin-top:0}#dismiss,#undismiss{margin-left:.5em}form.upgrade{margin-top:8px}form.upgrade .hint{font-style:italic;font-size:85%;margin:-.5em 0 2em 0}.update-php .spinner{float:none;margin:-4px 0}#ajax-loading,.ajax-feedback,.ajax-loading,.imgedit-wait-spin,.list-ajax-loading{visibility:hidden}#ajax-response.alignleft{margin-left:2em}.button.installed:before,.button.installing:before,.button.updated-message:before,.button.updating-message:before{margin:3px 5px 0 -2px}.button-primary.updating-message:before{color:#fff}.button-primary.updated-message:before{color:#66c6e4}.button.updated-message{transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}@media aural{.button.installed:before,.button.installing:before,.update-message p:before,.wrap .notice p:before{speak:none}}#adminmenu a,#catlist a,#taglist a{text-decoration:none}#contextual-help-wrap,#screen-options-wrap{margin:0;padding:8px 20px 12px;position:relative}#contextual-help-wrap{overflow:auto;margin-left:0!important}#screen-meta-links{float:right;margin:0 20px 0 0}#screen-meta{display:none;margin:0 20px -1px 0;position:relative;background-color:#fff;border:1px solid #ccd0d4;border-top:none;box-shadow:0 0 0 transparent}#contextual-help-link-wrap,#screen-options-link-wrap{float:left;margin:0 0 0 6px}#screen-meta-links .screen-meta-toggle{position:relative;top:0}#screen-meta-links .show-settings{border:1px solid #ccd0d4;border-top:none;height:auto;margin-bottom:0;padding:3px 6px 3px 16px;background:#fff;border-radius:0 0 4px 4px;color:#72777c;line-height:1.7;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear}#screen-meta-links .show-settings:active,#screen-meta-links .show-settings:focus,#screen-meta-links .show-settings:hover{color:#32373c}#screen-meta-links .show-settings:focus{border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}#screen-meta-links .show-settings:active{transform:none}#screen-meta-links .show-settings:after{right:0;content:"\f140";font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 5px 0 0;bottom:2px;position:relative;vertical-align:bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#72777c}#screen-meta-links .screen-meta-active:after{content:"\f142"}.toggle-arrow{background-repeat:no-repeat;background-position:top left;background-color:transparent;height:22px;line-height:22px;display:block}.toggle-arrow-active{background-position:bottom left}#contextual-help-wrap h5,#screen-options-wrap h5,#screen-options-wrap legend{margin:0;padding:8px 0;font-size:13px;font-weight:600}.ie8 #screen-options-wrap legend{color:inherit}.metabox-prefs label{display:inline-block;padding-right:15px;line-height:2.35}#number-of-columns{display:inline-block;vertical-align:middle;line-height:30px}.metabox-prefs input[type=checkbox]{margin-top:0;margin-right:6px}.metabox-prefs label input,.metabox-prefs label input[type=checkbox]{margin:-4px 5px 0 0}.metabox-prefs .columns-prefs label input{margin:-1px 2px 0 0}.metabox-prefs label a{display:none}.metabox-prefs .screen-options input,.metabox-prefs .screen-options label{margin-top:0;margin-bottom:0;vertical-align:middle}.metabox-prefs .screen-options .screen-per-page{margin-right:15px}.metabox-prefs .screen-options label{line-height:2.2;padding-right:0}.screen-options+.screen-options{margin-top:10px}.metabox-prefs .submit{margin-top:1em;padding:0}#contextual-help-wrap{padding:0}#contextual-help-columns{position:relative}#contextual-help-back{position:absolute;top:0;bottom:0;left:150px;right:170px;border:1px solid #ccd0d4;border-top:none;border-bottom:none;background:#f6fbfd}#contextual-help-wrap.no-sidebar #contextual-help-back{right:0;border-right-width:0;border-bottom-right-radius:2px}.contextual-help-tabs{float:left;width:150px;margin:0}.contextual-help-tabs ul{margin:1em 0}.contextual-help-tabs li{margin-bottom:0;list-style-type:none;border-style:solid;border-width:0 0 0 2px;border-color:transparent}.contextual-help-tabs a{display:block;padding:5px 5px 5px 12px;line-height:1.4;text-decoration:none;border:1px solid transparent;border-right:none;border-left:none}.contextual-help-tabs a:hover{color:#32373c}.contextual-help-tabs .active{padding:0;margin:0 -1px 0 0;border-left:2px solid #00a0d2;background:#f6fbfd;box-shadow:0 2px 0 rgba(0,0,0,.02),0 1px 0 rgba(0,0,0,.02)}.contextual-help-tabs .active a{border-color:#ccd0d4;color:#32373c}.contextual-help-tabs-wrap{padding:0 20px;overflow:auto}.help-tab-content{display:none;margin:0 22px 12px 0;line-height:1.6}.help-tab-content.active{display:block}.help-tab-content ul li{list-style-type:disc;margin-left:18px}.contextual-help-sidebar{width:150px;float:right;padding:0 8px 0 12px;overflow:auto}html.wp-toolbar{padding-top:32px;box-sizing:border-box}.widefat td,.widefat th{color:#555}.widefat tfoot td,.widefat th,.widefat thead td{font-weight:400}.widefat tfoot tr td,.widefat tfoot tr th,.widefat thead tr td,.widefat thead tr th{color:#32373c}.widefat td p{margin:2px 0 .8em}.widefat ol,.widefat p,.widefat ul{color:#32373c}.widefat .column-comment p{margin:.6em 0}.widefat .column-comment ul{list-style:initial;margin-left:2em}.postbox-container{float:left}.postbox-container .meta-box-sortables{box-sizing:border-box}#wpbody-content .metabox-holder{padding-top:10px}.metabox-holder .postbox-container .empty-container{border:3px dashed #b4b9be;height:250px;position:relative}.metabox-holder .postbox-container .empty-container:after{content:attr(data-emptystring);margin:auto;position:absolute;top:0;left:0;bottom:0;right:0;height:1em;width:200px;text-align:center;color:#ccc;font-size:18px;display:none}.columns-2 #postbox-container-3 .empty-container,.columns-2 #postbox-container-4 .empty-container,.columns-3 #postbox-container-4 .empty-container,.metabox-holder.columns-1 .postbox-container .empty-container{border:0 none;height:0;min-height:0}#post-body-content{width:100%;min-width:463px;float:left}#post-body.columns-2 #postbox-container-1{float:right;margin-right:-300px;width:280px}#post-body.columns-2 #side-sortables{min-height:250px}@media only screen and (max-width:799px){#wpbody-content .metabox-holder .postbox-container .empty-container{border:0 none;height:0;min-height:0}}.js .postbox .hndle,.js .widget .widget-top{cursor:move}.js .postbox .hndle.is-non-sortable,.js .widget .widget-top.is-non-sortable{cursor:auto}.hndle a{font-size:11px;font-weight:400}.postbox .handlediv{display:none;float:right;width:36px;height:36px;margin:0;padding:0;border:0;background:0 0;cursor:pointer}.js .postbox .handlediv{display:block}.sortable-placeholder{border:1px dashed #b4b9be;margin-bottom:20px}.postbox,.stuffbox{margin-bottom:20px;padding:0;line-height:1}.postbox .hndle,.stuffbox .hndle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.postbox .inside{padding:0 12px 12px;line-height:1.4;font-size:13px}.stuffbox .inside{padding:0;line-height:1.4;font-size:13px;margin-top:0}.postbox .inside{margin:11px 0;position:relative}.postbox .inside>p:last-child,.rss-widget ul li:last-child{margin-bottom:1px!important}.postbox.closed h3{border:none;box-shadow:none}.postbox table.form-table{margin-bottom:0}.postbox table.widefat{box-shadow:none}.temp-border{border:1px dotted #ccc}.columns-prefs label{padding:0 10px 0 0}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover,#comment-status-display,#dashboard_right_now .versions .b,#ed_reply_toolbar #ed_reply_strong,#pass-strength-result.short,#pass-strength-result.strong,#post-status-display,#post-visibility-display,.feature-filter .feature-name,.item-controls .item-order a,.media-item .percent,.plugins .name{font-weight:600}#wpfooter{position:absolute;bottom:0;left:0;right:0;padding:10px 20px;color:#555d66}#wpfooter p{font-size:13px;margin:0;line-height:1.55}#footer-thankyou{font-style:italic}.nav-tab{float:left;border:1px solid #ccc;border-bottom:none;margin-left:.5em;padding:5px 10px;font-size:14px;line-height:1.71428571;font-weight:600;background:#e5e5e5;color:#555;text-decoration:none;white-space:nowrap}.nav-tab-small .nav-tab,h3 .nav-tab{padding:5px 14px;font-size:12px;line-height:1.33}.nav-tab:focus,.nav-tab:hover{background-color:#fff;color:#444}.nav-tab-active,.nav-tab:focus:active{box-shadow:none}.nav-tab-active{margin-bottom:-1px;color:#444}.nav-tab-active,.nav-tab-active:focus,.nav-tab-active:focus:active,.nav-tab-active:hover{border-bottom:1px solid #f1f1f1;background:#f1f1f1;color:#000}.nav-tab-wrapper,.wrap h2.nav-tab-wrapper,h1.nav-tab-wrapper{border-bottom:1px solid #ccc;margin:0;padding-top:9px;padding-bottom:0;line-height:inherit}.nav-tab-wrapper:not(.wp-clearfix):after{content:"";display:table;clear:both}.ie8 .nav-tab-wrapper{display:inline-block;width:100%;vertical-align:top}.spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;display:inline-block;visibility:hidden;float:right;vertical-align:middle;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:4px 10px 0}.loading-content .spinner,.spinner.is-active{visibility:visible}#template>div{margin-right:16em}#template .notice{margin-top:1em;margin-right:3%}#template .notice p{width:auto}#template .submit .spinner{float:none}.metabox-holder .postbox>h3,.metabox-holder .stuffbox>h3,.metabox-holder h2.hndle,.metabox-holder h3.hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}.nav-menus-php .metabox-holder h3{padding:10px 10px 11px 14px;line-height:1.5}#templateside ul li a{text-decoration:none}.plugin-install #description,.plugin-install-network #description{width:60%}table .column-rating,table .column-visible,table .vers{text-align:left}.attention,.error-message{color:#dc3232;font-weight:600}body.iframe{height:98%}.lp-show-latest p{display:none}.lp-show-latest .lp-error p,.lp-show-latest p:last-child{display:block}.media-icon{width:62px;text-align:center}.media-icon img{border:1px solid #e5e5e5;border:1px solid rgba(0,0,0,.07)}#howto{font-size:11px;margin:0 5px;display:block}.importers{font-size:16px;width:auto}.importers td{padding-right:14px;line-height:1.4}.importers .import-system{max-width:250px}.importers td.desc{max-width:500px}.importer-action,.importer-desc,.importer-title{display:block}.importer-title{color:#000;font-size:14px;font-weight:400;margin-bottom:.2em}.importer-action{line-height:1.55;color:#555;margin-bottom:1em}#post-body #post-body-content #namediv h2,#post-body #post-body-content #namediv h3{margin-top:0}.edit-comment-author{color:#222;border-bottom:1px solid #eee}#namediv h2 label,#namediv h3 label{vertical-align:baseline}#namediv table{width:100%}#namediv td.first{width:10px;white-space:nowrap}#namediv input{width:98%}#namediv p{margin:10px 0}#submitdiv h3{margin-bottom:0!important}.zerosize{height:0;width:0;margin:0;border:0;padding:0;overflow:hidden;position:absolute}br.clear{height:2px;line-height:.15}.checkbox{border:none;margin:0;padding:0}fieldset{border:0;padding:0;margin:0}.post-categories{display:inline;margin:0;padding:0}.post-categories li{display:inline}div.star-holder{position:relative;height:17px;width:100px;background:url(../images/stars.png?ver=20121108) repeat-x bottom left}div.star-holder .star-rating{background:url(../images/stars.png?ver=20121108) repeat-x top left;height:17px;float:left}.star-rating{white-space:nowrap}.star-rating .star{display:inline-block;width:20px;height:20px;-webkit-font-smoothing:antialiased;font-size:20px;line-height:1;font-family:dashicons;text-decoration:inherit;font-weight:400;font-style:normal;vertical-align:top;transition:color .1s ease-in;text-align:center;color:#ffb900}.star-rating .star-full:before{content:"\f155"}.star-rating .star-half:before{content:"\f459"}.rtl .star-rating .star-half{transform:rotateY(180deg)}.star-rating .star-empty:before{content:"\f154"}div.action-links{font-weight:400;margin:6px 0 0}#plugin-information{background:#fff;position:fixed;top:0;right:0;bottom:0;left:0;height:100%;padding:0}#plugin-information-scrollable{overflow:auto;-webkit-overflow-scrolling:touch;height:100%}#plugin-information-title{padding:0 26px;background:#f5f5f5;font-size:22px;font-weight:600;line-height:2.4;position:relative;height:56px}#plugin-information-title.with-banner{margin-right:0;height:250px;background-size:cover}#plugin-information-title h2{font-size:1em;font-weight:600;padding:0;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#plugin-information-title.with-banner h2{position:relative;font-family:"Helvetica Neue",sans-serif;display:inline-block;font-size:30px;line-height:1.68;box-sizing:border-box;max-width:100%;padding:0 15px;margin-top:174px;color:#fff;background:rgba(30,30,30,.9);text-shadow:0 1px 3px rgba(0,0,0,.4);box-shadow:0 0 30px rgba(255,255,255,.1);border-radius:8px}#plugin-information-title div.vignette{display:none}#plugin-information-title.with-banner div.vignette{position:absolute;display:block;top:0;left:0;height:250px;width:100%;background:0 0;box-shadow:inset 0 0 50px 4px rgba(0,0,0,.2),inset 0 -1px 0 rgba(0,0,0,.1)}#plugin-information-tabs{padding:0 16px;position:relative;right:0;left:0;min-height:36px;font-size:0;z-index:1;border-bottom:1px solid #ddd;background:#f3f3f3}#plugin-information-tabs a{position:relative;display:inline-block;padding:9px 10px;margin:0;height:18px;line-height:1.3;font-size:14px;text-decoration:none;transition:none}#plugin-information-tabs a.current{margin:0 -1px -1px;background:#fff;border:1px solid #ddd;border-bottom-color:#fff;padding-top:8px;color:#32373c}#plugin-information-tabs.with-banner a.current{border-top:none;padding-top:9px}#plugin-information-tabs a:active,#plugin-information-tabs a:focus{outline:0}#plugin-information-content{overflow:hidden;background:#fff;position:relative;top:0;right:0;left:0;min-height:100%;min-height:calc(100% - 152px)}#plugin-information-content.with-banner{min-height:calc(100% - 346px)}#section-holder{position:relative;top:0;right:250px;bottom:0;left:0;margin-top:10px;margin-right:250px;padding:10px 26px;margin-bottom:-99939px;padding-bottom:99999px}#section-holder .notice{margin:5px 0 15px}#section-holder .updated{margin:16px 0}#plugin-information .fyi{float:right;position:relative;top:0;right:0;padding:16px;margin-bottom:-99939px;padding-bottom:99999px;width:217px;border-left:1px solid #ddd;background:#f3f3f3;color:#666}#plugin-information .fyi strong{color:#444}#plugin-information .fyi h3{font-weight:600;text-transform:uppercase;font-size:12px;color:#666;margin:24px 0 8px}#plugin-information .fyi h2{font-size:.9em;margin-bottom:0;margin-right:0}#plugin-information .fyi ul{padding:0;margin:0;list-style:none}#plugin-information .fyi li{margin:0 0 10px}#plugin-information .fyi-description{margin-top:0}#plugin-information .counter-container{margin:3px 0}#plugin-information .counter-label{float:left;margin-right:5px;min-width:55px}#plugin-information .counter-back{height:17px;width:92px;background-color:#e5e5e5;float:left}#plugin-information .counter-bar{height:17px;background-color:#ffc733;float:left}#plugin-information .counter-count{margin-left:5px}#plugin-information .fyi ul.contributors{margin-top:10px}#plugin-information .fyi ul.contributors li{display:inline-block;margin-right:8px;vertical-align:middle}#plugin-information .fyi ul.contributors li{display:inline-block;margin-right:8px;vertical-align:middle}#plugin-information .fyi ul.contributors li img{vertical-align:middle;margin-right:4px}#plugin-information-footer{padding:13px 16px;position:absolute;right:0;bottom:0;left:0;height:33px;border-top:1px solid #ddd;background:#f3f3f3}#plugin-information .section{direction:ltr}#plugin-information .section ol,#plugin-information .section ul{list-style-type:disc;margin-left:24px}#plugin-information .section,#plugin-information .section p{font-size:14px;line-height:1.7}#plugin-information #section-screenshots ol{list-style:none;margin:0}#plugin-information #section-screenshots li img{vertical-align:text-top;margin-top:16px;max-width:100%;width:auto;height:auto;box-shadow:0 1px 2px rgba(0,0,0,.3)}#plugin-information #section-screenshots li p{font-style:italic;padding-left:20px}#plugin-information pre{padding:7px;overflow:auto;border:1px solid #ccc}#plugin-information blockquote{border-left:2px solid #ddd;color:#666;font-style:italic;margin:1em 0;padding:0 0 0 1em}#plugin-information .review{overflow:hidden;width:100%;margin-bottom:20px;border-bottom:1px solid #e5e5e5}#plugin-information .review-title-section{overflow:hidden}#plugin-information .review-title-section h4{display:inline-block;float:left;margin:0 6px 0 0}#plugin-information .reviewer-info p{clear:both;margin:0;padding-top:2px}#plugin-information .reviewer-info .avatar{float:left;margin:4px 6px 0 0}#plugin-information .reviewer-info .star-rating{float:left}#plugin-information .review-meta{float:left;margin-left:.75em}#plugin-information .review-body{float:left;width:100%}.plugin-version-author-uri{font-size:13px}.update-php .button.button-primary{margin-right:1em}@media screen and (max-width:771px){#plugin-information-title.with-banner{height:100px}#plugin-information-title.with-banner h2{margin-top:30px;font-size:20px;line-height:2;max-width:85%}#plugin-information-title.with-banner div.vignette{height:100px}#plugin-information-tabs{overflow:hidden;padding:0;height:auto}#plugin-information-tabs a.current{margin-bottom:0;border-bottom:none}#plugin-information .fyi{float:none;border:1px solid #ddd;position:static;width:auto;margin:26px 26px 0;padding-bottom:0}#section-holder{position:static;margin:0;padding-bottom:70px}#plugin-information .fyi h3,#plugin-information .fyi small{display:none}#plugin-information-footer{padding:12px 16px 0;height:46px}}#TB_window.plugin-details-modal{background:#fcfcfc}#TB_window.plugin-details-modal.thickbox-loading:before{content:"";display:block;width:20px;height:20px;position:absolute;left:50%;top:50%;z-index:-1;margin:-10px 0 0 -10px;background:#fcfcfc url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){#TB_window.plugin-details-modal.thickbox-loading:before{background-image:url(../images/spinner-2x.gif)}}.plugin-details-modal #TB_title{float:left;height:1px}.plugin-details-modal #TB_ajaxWindowTitle{display:none}.plugin-details-modal #TB_closeWindowButton{left:auto;right:-30px;color:#eee}.plugin-details-modal #TB_closeWindowButton:focus,.plugin-details-modal #TB_closeWindowButton:hover{color:#00a0d2;outline:0;box-shadow:none}.plugin-details-modal .tb-close-icon{display:none}.plugin-details-modal #TB_closeWindowButton:after{content:"\f335";font:normal 32px/29px dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media screen and (max-width:830px){.plugin-details-modal #TB_closeWindowButton{right:0;top:-30px}}img{border:none}.bulk-action-notice .toggle-indicator:before,.js .meta-box-sortables .postbox .toggle-indicator:before,.privacy-text-box .toggle-indicator:before,.sidebar-name .toggle-indicator:before{content:"\f142";display:inline-block;font:normal 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.bulk-action-notice .bulk-action-errors-collapsed .toggle-indicator:before,.js .meta-box-sortables .postbox.closed .handlediv .toggle-indicator:before,.js .widgets-holder-wrap.closed .toggle-indicator:before,.privacy-text-box.closed .toggle-indicator:before{content:"\f140"}.js .postbox .handlediv .toggle-indicator:before{margin-top:4px;width:20px;border-radius:50%;text-indent:-1px}.rtl.js .postbox .handlediv .toggle-indicator:before{text-indent:1px}.bulk-action-notice .toggle-indicator:before{line-height:16px;vertical-align:top;color:#72777c}.js .postbox .handlediv:focus{box-shadow:none;outline:0}.js .postbox .handlediv:focus .toggle-indicator:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}#photo-add-url-div input[type=text]{width:300px}.alignleft h2{margin:0}#template textarea{font-family:Consolas,Monaco,monospace;font-size:13px;background:#f9f9f9;-moz-tab-size:4;-o-tab-size:4;tab-size:4}#template .CodeMirror,#template textarea{width:100%;min-height:60vh;height:calc(100vh - 295px);border:1px solid #ddd;box-sizing:border-box}#templateside>h2{padding-top:6px;padding-bottom:7px;margin:0}#templateside ol,#templateside ul{margin:0;padding:0}#templateside>ul{box-sizing:border-box;margin-top:0;overflow:auto;padding:0;min-height:60vh;height:calc(100vh - 295px);background-color:#f7f7f7;border:1px solid #ddd;border-left:none}#templateside ul ul{padding-left:12px}#templateside>ul>li>ul[role=group]{padding-left:0}[role=treeitem][aria-expanded=false]>ul{display:none}[role=treeitem] span[aria-hidden]{display:inline;font-family:dashicons;font-size:20px;position:absolute;pointer-events:none}[role=treeitem][aria-expanded=false]>.folder-label .icon:after{content:"\f139"}[role=treeitem][aria-expanded=true]>.folder-label .icon:after{content:"\f140"}[role=treeitem] .folder-label{display:block;padding:3px 3px 3px 12px;cursor:pointer}[role=treeitem]{outline:0}[role=treeitem] .folder-label.focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}[role=treeitem] .folder-label.hover,[role=treeitem].hover{background-color:#eaeaea}.tree-folder{margin:0;position:relative}[role=treeitem] li{position:relative}.tree-folder .tree-folder::after{content:"";display:block;position:absolute;left:2px;border-left:1px solid #ccc;top:-13px;bottom:10px}.tree-folder>li::before{content:"";position:absolute;display:block;border-left:1px solid #ccc;left:2px;top:-5px;height:18px;width:7px;border-bottom:1px solid #ccc}.tree-folder>li::after{content:"";position:absolute;display:block;border-left:1px solid #ccc;left:2px;bottom:-7px;top:0}#templateside .current-file{margin:-4px 0 -2px}.tree-folder>.current-file::before{left:4px;height:15px;width:0;border-left:none;top:3px}.tree-folder>.current-file::after{bottom:-4px;height:7px;left:2px;top:auto}.tree-folder li:last-child>.tree-folder::after,.tree-folder>li:last-child::after{display:none}#theme-plugin-editor-label{display:inline-block;margin-bottom:1em;font-weight:600}#docs-list,#template textarea{direction:ltr}.fileedit-sub #plugin,.fileedit-sub #theme{max-width:40%}.fileedit-sub .alignright{text-align:right}#template p{width:97%}#file-editor-linting-error{margin-top:1em;margin-bottom:1em}#file-editor-linting-error>.notice{margin:0;display:inline-block}#file-editor-linting-error>.notice>p{width:auto}#template .submit{margin-top:1em;padding:0}#template .submit input[type=submit][disabled]{cursor:not-allowed}#templateside{float:right;width:16em;word-wrap:break-word}#postcustomstuff p.submit{margin:0}#templateside h4{margin:1em 0 0}#templateside li{margin:4px 0}#templateside li:not(.howto) a,.theme-editor-php .highlight{display:block;padding:3px 0 3px 12px;text-decoration:none}#templateside li:not(.howto)>a:first-of-type{padding-top:0}#templateside li.howto{padding:6px 12px 12px 12px}.theme-editor-php .highlight{margin:-3px 3px -3px -12px}#templateside .highlight{border:none;font-weight:600}.nonessential{color:#666;font-size:11px;font-style:italic;padding-left:12px}#documentation{margin-top:10px}#documentation label{line-height:1.8;vertical-align:baseline;font-weight:600}.fileedit-sub{padding:10px 0 8px;line-height:180%}#file-editor-warning .file-editor-warning-content{margin:25px}.accordion-section-title:after,.control-section .accordion-section-title:after,.nav-menus-php .item-edit:before,.widget-top .widget-action .toggle-indicator:before{content:"\f140";font:normal 20px/1 dashicons;speak:none;display:block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.widget-top .widget-action .toggle-indicator:before{padding:1px 2px 1px 0;border-radius:50%}.accordion-section-title:after,.handlediv,.item-edit,.postbox .handlediv.button-link,.toggle-indicator{color:#72777c}.widget-action{color:#555d66}.accordion-section-title:hover:after,.handlediv:focus,.handlediv:hover,.item-edit:focus,.item-edit:hover,.postbox .handlediv.button-link:focus,.postbox .handlediv.button-link:hover,.sidebar-name:hover .toggle-indicator,.widget-action:focus,.widget-top:hover .widget-action{color:#23282d}.widget-top .widget-action:focus .toggle-indicator:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.accordion-section-title:after,.control-section .accordion-section-title:after{float:right;right:20px;top:-2px}#customize-info.open .accordion-section-title:after,.control-section.open .accordion-section-title:after,.nav-menus-php .menu-item-edit-active .item-edit:before,.widget.open .widget-top .widget-action .toggle-indicator:before,.widget.widget-in-question .widget-top .widget-action .toggle-indicator:before{content:"\f142"}/*! + * jQuery UI Draggable/Sortable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */.ui-draggable-handle,.ui-sortable-handle{touch-action:none}.accordion-section{border-bottom:1px solid #ddd;margin:0}.accordion-section.open .accordion-section-content,.no-js .accordion-section .accordion-section-content{display:block}.accordion-section.open:hover{border-bottom-color:#ddd}.accordion-section-content{display:none;padding:10px 20px 15px;overflow:hidden;background:#fff}.accordion-section-title{margin:0;padding:12px 15px 15px;position:relative;border-left:1px solid #ddd;border-right:1px solid #ddd;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.js .accordion-section-title{cursor:pointer}.js .accordion-section-title:after{position:absolute;top:12px;right:10px;z-index:1}.accordion-section-title:focus{outline:0}.accordion-section-title:focus:after,.accordion-section-title:hover:after{border-color:#a0a5aa transparent}.cannot-expand .accordion-section-title{cursor:auto}.cannot-expand .accordion-section-title:after{display:none}.control-section .accordion-section-title,.customize-pane-child .accordion-section-title{border-left:none;border-right:none;padding:10px 10px 11px 14px;line-height:1.55;background:#fff}.control-section .accordion-section-title:after,.customize-pane-child .accordion-section-title:after{top:calc(50% - 10px)}.js .control-section .accordion-section-title:focus,.js .control-section .accordion-section-title:hover,.js .control-section.open .accordion-section-title,.js .control-section:hover .accordion-section-title{color:#23282d;background:#f5f5f5}.control-section.open .accordion-section-title{border-bottom:1px solid #ddd}.network-admin .edit-site-actions{margin-top:0}.my-sites{display:block;overflow:auto;zoom:1}.my-sites li{display:block;padding:8px 3%;min-height:130px;margin:0}@media only screen and (max-width:599px){.my-sites li{min-height:0}}@media only screen and (min-width:600px){.my-sites.striped li{background-color:#fff;position:relative}.my-sites.striped li:after{content:"";width:1px;height:100%;position:absolute;top:0;right:0;background:#ccc}}@media only screen and (min-width:600px) and (max-width:699px){.my-sites li{float:left;width:44%}.my-sites.striped li{background-color:#fff}.my-sites.striped li:nth-of-type(2n+1){clear:left}.my-sites.striped li:nth-of-type(2n+2):after{content:none}.my-sites li:nth-of-type(4n+1),.my-sites li:nth-of-type(4n+2){background-color:#f9f9f9}}@media only screen and (min-width:700px) and (max-width:1199px){.my-sites li{float:left;width:27.333333%;background-color:#fff}.my-sites.striped li:nth-of-type(3n+3):after{content:none}.my-sites li:nth-of-type(6n+1),.my-sites li:nth-of-type(6n+2),.my-sites li:nth-of-type(6n+3){background-color:#f9f9f9}}@media only screen and (min-width:1200px) and (max-width:1399px){.my-sites li{float:left;width:21%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(4n+1){clear:left}.my-sites.striped li:nth-of-type(4n+4):after{content:none}.my-sites li:nth-of-type(8n+1),.my-sites li:nth-of-type(8n+2),.my-sites li:nth-of-type(8n+3),.my-sites li:nth-of-type(8n+4){background-color:#f9f9f9}}@media only screen and (min-width:1400px) and (max-width:1599px){.my-sites li{float:left;width:16%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(5n+1){clear:left}.my-sites.striped li:nth-of-type(5n+5):after{content:none}.my-sites li:nth-of-type(10n+1),.my-sites li:nth-of-type(10n+2),.my-sites li:nth-of-type(10n+3),.my-sites li:nth-of-type(10n+4),.my-sites li:nth-of-type(10n+5){background-color:#f9f9f9}}@media only screen and (min-width:1600px){.my-sites li{float:left;width:12.666666%;padding:8px 2%;background-color:#fff}.my-sites.striped li:nth-of-type(6n+1){clear:left}.my-sites.striped li:nth-of-type(6n+6):after{content:none}.my-sites li:nth-of-type(12n+1),.my-sites li:nth-of-type(12n+2),.my-sites li:nth-of-type(12n+3),.my-sites li:nth-of-type(12n+4),.my-sites li:nth-of-type(12n+5),.my-sites li:nth-of-type(12n+6){background-color:#f9f9f9}}.my-sites li a{text-decoration:none}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){div.star-holder,div.star-holder .star-rating{background:url(../images/stars-2x.png?ver=20121108) repeat-x bottom left;background-size:21px 37px}.spinner{background-image:url(../images/spinner-2x.gif)}#bulk-titles div a,#bulk-titles div a:hover,#screen-meta-links a.show-settings,.curtime #timestamp,.meta-box-sortables .postbox:hover .handlediv,.sidebar-name .toggle-indicator,.sidebar-name:hover .toggle-indicator,.widget-top .widget-action,.widget-top .widget-action:hover{background:0 0!important}}@-ms-viewport{width:device-width}@media screen and (max-width:782px){html.wp-toolbar{padding-top:46px}.screen-reader-shortcut:focus{top:-39px}body{min-width:240px;overflow-x:hidden}body *{-webkit-tap-highlight-color:rgba(0,0,0,0)!important}#wpcontent{position:relative;margin-left:0;padding-left:10px}#wpbody-content{padding-bottom:100px}.wrap{clear:both;margin-right:12px;margin-left:0}#col-left,#col-right{float:none;width:auto}#col-left .col-wrap,#col-right .col-wrap{padding:0}#collapse-menu,.post-format-select{display:none!important}.wrap h1.wp-heading-inline{margin-bottom:.5em}.wrap .add-new-h2,.wrap .add-new-h2:active,.wrap .page-title-action,.wrap .page-title-action:active{padding:10px 15px;font-size:14px;white-space:nowrap}.media-upload-form div.error,.notice,.wrap div.error,.wrap div.updated{margin:20px 0 10px 0;padding:5px 10px;font-size:14px;line-height:175%}.wp-core-ui .notice.is-dismissible{padding-right:46px}.notice-dismiss{padding:13px}.wrap .icon32+h2{margin-top:-2px}.wp-responsive-open #wpbody{right:-16em}code{word-wrap:break-word;word-wrap:anywhere;word-break:break-word}.postbox{font-size:14px}.metabox-holder .postbox>h3,.metabox-holder .stuffbox>h3,.metabox-holder h2,.metabox-holder h3.hndle{padding:12px}.postbox .handlediv{margin-top:3px}.subsubsub{font-size:16px;text-align:center;margin-bottom:15px}#template .CodeMirror,#template textarea{box-sizing:border-box}#templateside{float:none;width:auto}#templateside>ul{border-left:1px solid #ddd}#templateside li{margin:0}#templateside li:not(.howto) a{display:block;padding:5px}#templateside li.howto{padding:12px}#templateside .highlight{padding:5px;margin-left:-5px;margin-top:-5px}#template .notice,#template>div{float:none;margin:1em 0;width:auto}#template .CodeMirror,#template textarea{width:100%}#templateside ul ul{padding-left:1.5em}[role=treeitem] .folder-label{display:block;padding:5px}.tree-folder .tree-folder::after,.tree-folder>li::after,.tree-folder>li::before{left:-8px}.tree-folder>li::before{top:0;height:13px}.tree-folder>.current-file::before{left:-5px;top:7px;width:4px}.tree-folder>.current-file::after{height:9px;left:-8px}.wrap #templateside span.notice{margin-left:-5px;width:100%}.fileedit-sub .alignright{float:left;margin-top:15px;width:100%;text-align:left}.fileedit-sub .alignright label{display:block}.fileedit-sub #plugin,.fileedit-sub #theme{margin-left:0;max-width:70%}.fileedit-sub input[type=submit]{margin-bottom:0}#documentation label[for=docs-list]{display:block}#documentation select[name=docs-list]{margin-left:0;max-width:60%}#documentation input[type=button]{margin-bottom:0}#wpfooter{display:none}#comments-form .checkforspam{display:none}.edit-comment-author{margin:2px 0 0}.filter-drawer .filter-group-feature input,.filter-drawer .filter-group-feature label{line-height:2.1}.filter-drawer .filter-group-feature label{margin-left:32px}.wp-filter .button.drawer-toggle{font-size:13px;line-height:2;height:28px}#screen-meta #contextual-help-wrap{overflow:visible}#screen-meta #contextual-help-back,#screen-meta .contextual-help-sidebar{display:none}#screen-meta .contextual-help-tabs{clear:both;width:100%;float:none}#screen-meta .contextual-help-tabs ul{margin:0 0 1em;padding:1em 0 0}#screen-meta .contextual-help-tabs .active{margin:0}#screen-meta .contextual-help-tabs-wrap{clear:both;max-width:100%;float:none}#screen-meta-links{margin-bottom:20px}.wp-filter .search-form input[type=search]{font-size:1rem}}@media screen and (max-width:600px){#wpwrap.wp-responsive-open{overflow-x:hidden}html.wp-toolbar{padding-top:0}.screen-reader-shortcut:focus{top:7px}#wpbody{padding-top:46px}div#post-body.metabox-holder.columns-1{overflow-x:hidden}.nav-tab-wrapper,.wrap h2.nav-tab-wrapper,h1.nav-tab-wrapper{border-bottom:0}h1 .nav-tab,h2 .nav-tab,h3 .nav-tab,nav .nav-tab{margin:10px 10px 0 0;border-bottom:1px solid #ccc}.nav-tab-active:focus,.nav-tab-active:focus:active,.nav-tab-active:hover{border-bottom:1px solid #ccc}.wp-filter .search-form input[type=search]{width:100%}}@media screen and (max-width:320px){#network_dashboard_right_now .subsubsub{font-size:14px;text-align:left}} \ No newline at end of file diff --git a/wp-admin/css/customize-controls-rtl.css b/wp-admin/css/customize-controls-rtl.css new file mode 100644 index 0000000..8662414 --- /dev/null +++ b/wp-admin/css/customize-controls-rtl.css @@ -0,0 +1,2962 @@ +/*! This file is auto-generated */ +body { + overflow: hidden; + -webkit-text-size-adjust: 100%; +} + +.customize-controls-close, +.widget-control-actions a { + text-decoration: none; +} + +#customize-controls h3 { + font-size: 14px; +} + +#customize-controls img { + max-width: 100%; +} + +#customize-controls .submit { + text-align: center; +} + +#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked { + background-color: rgba(0, 0, 0, 0.7); + padding: 25px; +} + +#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .customize-changeset-locked-message { + margin-right: auto; + margin-left: auto; + max-width: 366px; + min-height: 64px; + width: auto; + padding: 25px 109px 25px 25px; + position: relative; + background: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + line-height: 1.5; + overflow-y: auto; + text-align: right; + top: calc( 50% - 100px ); +} + +#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .currently-editing { + margin-top: 0; +} +#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .action-buttons { + margin-bottom: 0; +} + +.customize-changeset-locked-avatar { + width: 64px; + position: absolute; + right: 25px; + top: 25px; +} + +.wp-core-ui.wp-customizer .customize-changeset-locked-message a.button { + margin-left: 10px; + margin-top: 0; +} + +#customize-controls .description { + color: #555d66; +} + +#customize-save-button-wrapper { + float: left; + margin-top: 9px; +} + +body:not(.ready) #customize-save-button-wrapper .save { + visibility: hidden; +} +#customize-save-button-wrapper .save { + float: right; + border-radius: 3px; + box-shadow: none; /* @todo Adjust box shadow based on the disable states of paired button. */ + margin-top: 0; +} + +#customize-save-button-wrapper .save:focus, #publish-settings:focus { + box-shadow: 0 1px 0 #0073aa, 0 0 2px 1px #33b3db; /* This is default box shadow for focus */ +} + +#customize-save-button-wrapper .save.has-next-sibling { + border-radius: 0 3px 3px 0; +} + +#customize-sidebar-outer-content { + position: absolute; + top: 0; + bottom: 0; + right: 0; + visibility: hidden; + overflow-x: hidden; + overflow-y: auto; + width: 100%; + margin: 0; + z-index: -1; + background: #eee; + transition: right .18s; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + height: 100%; +} + +#customize-theme-controls .control-section-outer { + display: none !important; +} + +#customize-outer-theme-controls .accordion-section-content { + padding: 12px; +} + +#customize-outer-theme-controls .accordion-section-content.open { + display: block; +} + +.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content { + visibility: visible; + right: 100%; + transition: right .18s; +} + +.customize-outer-pane-parent { + margin: 0; +} + +.outer-section-open .wp-full-overlay.expanded .wp-full-overlay-main { + right: 300px; + opacity: 0.4; +} + +.outer-section-open .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main, +.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main, +.adding-menu-items .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main, +.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main, +.adding-widget .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main, +.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main { + right: 64%; +} + +#customize-outer-theme-controls li.notice { + padding-top: 8px; + padding-bottom: 8px; + margin-right: 0; + margin-bottom: 10px; +} + +#publish-settings { + text-indent: 0; + border-radius: 3px 0 0 3px; + padding-right: 0; + padding-left: 0; + box-shadow: none; /* @todo Adjust box shadow based on the disable states of paired button. */ + font-size: 14px; + width: 30px; + float: right; + transform: none; + margin-top: 0; + line-height: 2; +} + +body:not(.ready) #publish-settings, +body.trashing #customize-save-button-wrapper .save, +body.trashing #publish-settings { + display: none; +} + +#customize-header-actions .spinner { + margin-top: 13px; + margin-left: 4px; +} + +.saving #customize-header-actions .spinner, +.trashing #customize-header-actions .spinner { + visibility: visible; +} + +#customize-header-actions { + border-bottom: 1px solid #ddd; +} + +#customize-controls .wp-full-overlay-sidebar-content { + overflow-y: auto; + overflow-x: hidden; +} + +.outer-section-open #customize-controls .wp-full-overlay-sidebar-content { + background: #eee; +} + +#customize-controls .customize-info { + border: none; + border-bottom: 1px solid #ddd; + margin-bottom: 15px; +} + +#customize-control-changeset_status .customize-inside-control-row, +#customize-control-changeset_preview_link input { + background-color: #ffffff; + border-bottom: 1px solid #ddd; + box-sizing: content-box; + width: 100%; + margin-right: -12px; + padding-right: 12px; + padding-left: 12px; +} + +#customize-control-trash_changeset { + margin-top: 20px; +} +#customize-control-trash_changeset .button-link { + position: relative; + padding-right: 24px; + display: inline-block; +} +#customize-control-trash_changeset .button-link:before { + content: "\f182"; + font: normal 22px dashicons; + text-decoration: none; + position: absolute; + right: 0; + top: -2px; +} + +#customize-controls .date-input:invalid { + border-color: #dc3232; +} + +#customize-control-changeset_status .customize-inside-control-row { + padding-top: 10px; + padding-bottom: 10px; + font-weight: 500; +} + +#customize-control-changeset_status .customize-inside-control-row:first-of-type { + border-top: 1px solid #ddd; +} + +#customize-control-changeset_status .customize-control-title { + margin-bottom: 6px; +} + +#customize-control-changeset_status input { + margin-right: 0; +} + +#customize-control-changeset_preview_link { + position: relative; + display: block; +} + +.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button { + margin: 0; + position: absolute; + bottom: 9px; + left: 0; +} + +.preview-link-wrapper { + position: relative; +} + +.customize-copy-preview-link:before, +.customize-copy-preview-link:after { + content: ""; + height: 28px; + position: absolute; + background: #ffffff; + top: -1px; +} + +.customize-copy-preview-link:before { + right: -10px; + width: 9px; + opacity: 0.75; +} + +.customize-copy-preview-link:after { + right: -5px; + width: 4px; + opacity: 0.8; +} + +#customize-control-changeset_preview_link input { + line-height: 2.85714286; /* 40px */ + border-top: 1px solid #ddd; + border-right: none; + border-left: none; + text-indent: -999px; + color: #fff; + /* Only necessary for IE11 */ + min-height: 40px; +} + +#customize-control-changeset_preview_link label { + position: relative; + display: block; +} + +#customize-control-changeset_preview_link a { + display: inline-block; + position: absolute; + white-space: nowrap; + overflow: hidden; + width: 90%; + bottom: 14px; + font-size: 14px; + text-decoration: none; +} + +#customize-control-changeset_preview_link a.disabled, +#customize-control-changeset_preview_link a.disabled:active, +#customize-control-changeset_preview_link a.disabled:focus, +#customize-control-changeset_preview_link a.disabled:visited { + color: black; + opacity: 0.4; + cursor: default; + outline: none; + box-shadow: none; +} + +#sub-accordion-section-publish_settings .customize-section-description-container { + display: none; +} + +#customize-controls .customize-info.section-meta { + margin-bottom: 15px; +} + +.customize-control-date_time .customize-control-description + .date-time-fields.includes-time { + margin-top: 10px; +} + +.customize-control.customize-control-date_time .date-time-fields .date-input.day { + margin-left: 0; +} + +.date-time-fields .date-input.month { + width: auto; + margin: 0; +} + +.date-time-fields .date-input.day, +.date-time-fields .date-input.hour, +.date-time-fields .date-input.minute { + width: 46px; +} + +.date-time-fields .date-input.year { + width: 65px; +} + +.date-time-fields .date-input.meridian { + width: auto; + margin: 0; +} + +.date-time-fields .time-row { + margin-top: 12px; +} + +#customize-control-changeset_preview_link { + margin-top: 6px; +} + +#customize-control-changeset_status { + margin-bottom: 0; + padding-bottom: 0; +} + +#customize-control-changeset_scheduled_date { + box-sizing: content-box; + width: 100%; + margin-right: -12px; + padding: 12px; + background: #ffffff; + border-bottom: 1px solid #ddd; + margin-bottom: 0; +} + +#customize-control-changeset_scheduled_date .customize-control-description { + font-style: normal; +} + +#customize-controls .customize-info.is-in-view, +#customize-controls .customize-section-title.is-in-view { + position: absolute; + z-index: 9; + width: 100%; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); +} + +#customize-controls .customize-section-title.is-in-view { + margin-top: 0; +} + +#customize-controls .customize-info.is-in-view + .accordion-section { + margin-top: 15px; +} + +#customize-controls .customize-info.is-sticky, +#customize-controls .customize-section-title.is-sticky { + position: fixed; + top: 46px; +} + +#customize-controls .customize-info .accordion-section-title { + background: #fff; + color: #555d66; + border-right: none; + border-left: none; + border-bottom: none; + cursor: default; +} + +#customize-controls .customize-info.open .accordion-section-title:after, +#customize-controls .customize-info .accordion-section-title:hover:after, +#customize-controls .customize-info .accordion-section-title:focus:after { + color: #32373c; +} + +#customize-controls .customize-info .accordion-section-title:after { + display: none; +} + +#customize-controls .customize-info .preview-notice { + font-size: 13px; + line-height: 1.9; +} + +#customize-controls .customize-pane-child .customize-section-title h3, +#customize-controls .customize-pane-child h3.customize-section-title, +#customize-outer-theme-controls .customize-pane-child .customize-section-title h3, +#customize-outer-theme-controls .customize-pane-child h3.customize-section-title, +#customize-controls .customize-info .panel-title { + font-size: 20px; + font-weight: 200; + line-height: 26px; + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +#customize-controls .customize-section-title span.customize-action { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +#customize-controls .customize-info .customize-help-toggle { + position: absolute; + top: 4px; + left: 1px; + padding: 20px 10px 10px 20px; + width: 20px; + height: 20px; + cursor: pointer; + box-shadow: none; + -webkit-appearance: none; + background: transparent; + color: #555d66; + border: none; +} + +#customize-controls .customize-info .customize-help-toggle:before { + position: absolute; + top: 5px; + right: 6px; +} + +#customize-controls .customize-info.open .customize-help-toggle, +#customize-controls .customize-info .customize-help-toggle:focus, +#customize-controls .customize-info .customize-help-toggle:hover { + color: #0073aa; +} + +#customize-controls .customize-info .customize-panel-description, +#customize-controls .customize-info .customize-section-description, +#customize-outer-theme-controls .customize-info .customize-section-description, +#customize-controls .no-widget-areas-rendered-notice { + color: #555d66; + display: none; + background: #fff; + padding: 12px 15px; + border-top: 1px solid #ddd; +} + +#customize-controls .customize-info .customize-panel-description.open + .no-widget-areas-rendered-notice { + border-top: none; +} +.no-widget-areas-rendered-notice { + font-style: italic; +} +.no-widget-areas-rendered-notice p:first-child { + margin-top: 0; +} +.no-widget-areas-rendered-notice p:last-child { + margin-bottom: 0; +} + +#customize-controls .customize-info .customize-section-description { + margin-bottom: 15px; +} + +#customize-controls .customize-info .customize-panel-description p:first-child, +#customize-controls .customize-info .customize-section-description p:first-child { + margin-top: 0; +} + +#customize-controls .customize-info .customize-panel-description p:last-child, +#customize-controls .customize-info .customize-section-description p:last-child { + margin-bottom: 0; +} + +#customize-controls .current-panel .control-section > h3.accordion-section-title { + padding-left: 30px; +} + +#customize-theme-controls .control-section, +#customize-outer-theme-controls .control-section { + border: none; +} + +#customize-theme-controls .accordion-section-title, +#customize-outer-theme-controls .accordion-section-title { + color: #555d66; + background-color: #fff; + border-bottom: 1px solid #ddd; + border-right: 4px solid #fff; + transition: + .15s color ease-in-out, + .15s background-color ease-in-out, + .15s border-color ease-in-out; +} + +#customize-controls #customize-theme-controls .customize-themes-panel .accordion-section-title { + color: #555; + background-color: #fff; + border-right: 4px solid #fff; +} + +#customize-theme-controls .accordion-section-title:after, +#customize-outer-theme-controls .accordion-section-title:after { + content: "\f341"; + color: #a0a5aa; +} + +#customize-theme-controls .accordion-section-content, +#customize-outer-theme-controls .accordion-section-content { + color: #555d66; + background: transparent; +} + +#customize-controls .control-section:hover > .accordion-section-title, +#customize-controls .control-section .accordion-section-title:hover, +#customize-controls .control-section.open .accordion-section-title, +#customize-controls .control-section .accordion-section-title:focus { + color: #0073aa; + background: #f3f3f5; + border-right-color: #0073aa; +} + +#accordion-section-themes + .control-section { + border-top: 1px solid #ddd; +} + +.js .control-section:hover .accordion-section-title, +.js .control-section .accordion-section-title:hover, +.js .control-section.open .accordion-section-title, +.js .control-section .accordion-section-title:focus { + background: #f3f3f5; +} + +#customize-theme-controls .control-section:hover > .accordion-section-title:after, +#customize-theme-controls .control-section .accordion-section-title:hover:after, +#customize-theme-controls .control-section.open .accordion-section-title:after, +#customize-theme-controls .control-section .accordion-section-title:focus:after, +#customize-outer-theme-controls .control-section:hover > .accordion-section-title:after, +#customize-outer-theme-controls .control-section .accordion-section-title:hover:after, +#customize-outer-theme-controls .control-section.open .accordion-section-title:after, +#customize-outer-theme-controls .control-section .accordion-section-title:focus:after { + color: #0073aa; +} + +#customize-theme-controls .control-section.open { + border-bottom: 1px solid #eee; +} + +#customize-theme-controls .control-section.open .accordion-section-title, +#customize-outer-theme-controls .control-section.open .accordion-section-title { + border-bottom-color: #eee !important; +} + +#customize-theme-controls .control-section:last-of-type.open, +#customize-theme-controls .control-section:last-of-type > .accordion-section-title { + border-bottom-color: #ddd; +} + +#customize-theme-controls .control-panel-content:not(.control-panel-nav_menus) .control-section:nth-child(2), +#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu, +#customize-theme-controls .control-section-nav_menu_locations .accordion-section-title { + border-top: 1px solid #ddd; +} + +#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu + .control-section-nav_menu { + border-top: none; +} + +#customize-theme-controls > ul { + margin: 0; +} + +#customize-theme-controls .accordion-section-content { + position: absolute; + top: 0; + right: 100%; + width: 100%; + margin: 0; + padding: 12px; + box-sizing: border-box; +} + +#customize-info, +#customize-theme-controls .customize-pane-parent, +#customize-theme-controls .customize-pane-child { + overflow: visible; + width: 100%; + margin: 0; + padding: 0; + box-sizing: border-box; + transition: 0.18s transform cubic-bezier(0.645, 0.045, 0.355, 1); /* easeInOutCubic */ +} + +#customize-theme-controls .customize-pane-child.skip-transition { + transition: none; +} + +#customize-info, +#customize-theme-controls .customize-pane-parent { + position: relative; + visibility: visible; + height: auto; + max-height: none; + overflow: auto; + transform: none; +} + +#customize-theme-controls .customize-pane-child { + position: absolute; + top: 0; + right: 0; + visibility: hidden; + height: 0; + max-height: none; + overflow: hidden; + transform: translateX(-100%); +} + +#customize-theme-controls .customize-pane-child.open, +#customize-theme-controls .customize-pane-child.current-panel { + transform: none; +} + +.section-open #customize-theme-controls .customize-pane-parent, +.in-sub-panel #customize-theme-controls .customize-pane-parent, +.section-open #customize-info, +.in-sub-panel #customize-info, +.in-sub-panel.section-open #customize-theme-controls .customize-pane-child.current-panel { + visibility: hidden; + height: 0; + overflow: hidden; + transform: translateX(100%); +} + +.section-open #customize-theme-controls .customize-pane-parent.busy, +.in-sub-panel #customize-theme-controls .customize-pane-parent.busy, +.section-open #customize-info.busy, +.in-sub-panel #customize-info.busy, +.busy.section-open.in-sub-panel #customize-theme-controls .customize-pane-child.current-panel, +#customize-theme-controls .customize-pane-child.open, +#customize-theme-controls .customize-pane-child.current-panel, +#customize-theme-controls .customize-pane-child.busy { + visibility: visible; + height: auto; + overflow: auto; +} + +#customize-theme-controls .customize-pane-child.accordion-section-content, +#customize-theme-controls .customize-pane-child.accordion-sub-container { + display: block; + overflow-x: hidden; +} + +#customize-theme-controls .customize-pane-child.accordion-section-content { + padding: 12px; +} + +#customize-theme-controls .customize-pane-child.menu li { + position: static; +} + +.customize-section-description-container, +.control-section-nav_menu .customize-section-description-container, +.control-section-new_menu .customize-section-description-container { + margin-bottom: 15px; +} + +.control-section-nav_menu .customize-control, +.control-section-new_menu .customize-control { + /* Override default `margin-bottom` for `.customize-control` */ + margin-bottom: 0; +} + +.customize-section-title { + margin: -12px -12px 0 -12px; + border-bottom: 1px solid #ddd; + background: #fff; +} + +div.customize-section-description { + margin-top: 22px; +} + +.customize-info div.customize-section-description { + margin-top: 0; +} + +div.customize-section-description p:first-child { + margin-top: 0; +} + +div.customize-section-description p:last-child { + margin-bottom: 0; +} + +#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child { + border-bottom: 1px solid #ddd; + padding: 12px 12px 12px 12px; +} + +.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child { + padding: 12px 12px 13px 12px; +} + +.customize-section-title h3, +h3.customize-section-title { + padding: 10px 14px 12px 10px; + margin: 0; + line-height: 21px; + color: #555d66; +} + +.accordion-sub-container.control-panel-content { + display: none; + position: absolute; + top: 0; + width: 100%; +} + +.accordion-sub-container.control-panel-content.busy { + display: block; +} + +.current-panel .accordion-sub-container.control-panel-content { + width: 100%; +} + +.customize-controls-close { + display: block; + position: absolute; + top: 0; + right: 0; + width: 45px; + height: 41px; + padding: 0 0 0 2px; + background: #eee; + border: none; + border-top: 4px solid #eee; + border-left: 1px solid #ddd; + color: #444; + text-align: right; + cursor: pointer; + transition: + color .15s ease-in-out, + border-color .15s ease-in-out, + background .15s ease-in-out; + box-sizing: content-box; +} + +.customize-panel-back, +.customize-section-back { + display: block; + float: right; + width: 48px; + height: 71px; + padding: 0 0 0 24px; + margin: 0; + background: #fff; + border: none; + border-left: 1px solid #ddd; + border-right: 4px solid #fff; + box-shadow: none; + cursor: pointer; + transition: + color .15s ease-in-out, + border-color .15s ease-in-out, + background .15s ease-in-out; +} + +.customize-section-back { + height: 74px; +} + +.ios .customize-panel-back { + display: none; +} + +.ios .expanded.in-sub-panel .customize-panel-back { + display: block; +} + +#customize-controls .panel-meta.customize-info .accordion-section-title { + margin-right: 48px; + border-right: none; +} + +#customize-controls .panel-meta.customize-info .accordion-section-title:hover, +#customize-controls .cannot-expand:hover .accordion-section-title { + background: #fff; + color: #555d66; + border-right-color: #fff; +} + +.customize-controls-close:focus, +.customize-controls-close:hover, +.customize-controls-preview-toggle:focus, +.customize-controls-preview-toggle:hover { + background: #fff; + color: #0073aa; + border-top-color: #0073aa; + outline: none; + box-shadow: none; +} + + +.customize-panel-back:hover, +.customize-panel-back:focus, +.customize-section-back:hover, +.customize-section-back:focus { + color: #0073aa; + background: #f3f3f5; + border-right-color: #0073aa; + outline: none; + box-shadow: none; +} + +.customize-controls-close:before { + font: normal 22px/45px dashicons; + content: "\f335"; + position: relative; + top: -3px; + right: 13px; +} + +.customize-panel-back:before, +.customize-section-back:before { + font: normal 20px/72px dashicons; + content: "\f345"; + position: relative; + right: 9px; +} + +.wp-full-overlay-sidebar .wp-full-overlay-header { + background-color: #eee; + transition: padding ease-in-out .18s; +} + +.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header { + padding-right: 62px; +} + +p.customize-section-description { + font-style: normal; + margin-top: 22px; + margin-bottom: 0; +} + +.customize-section-description ul { + margin-right: 1em; +} + +.customize-section-description ul > li { + list-style: disc; +} + +.section-description-buttons { + text-align: left; +} + +.section-description-buttons button.button-link { + color: #0073aa; + text-decoration: underline; +} + +.customize-control { + width: 100%; + float: right; + clear: both; + margin-bottom: 12px; +} + +.customize-control input[type="text"], +.customize-control input[type="password"], +.customize-control input[type="email"], +.customize-control input[type="number"], +.customize-control input[type="search"], +.customize-control input[type="tel"], +.customize-control input[type="url"] { + width: 100%; + margin: 0; +} + +.customize-control-hidden { + margin: 0; +} + +.customize-control-textarea textarea { + width: 100%; + resize: vertical; +} + +.customize-control select { + width: 100%; +} + +.customize-control select[multiple] { + height: auto; +} + +.customize-control-title { + display: block; + font-size: 14px; + line-height: 1.75; + font-weight: 600; + margin-bottom: 4px; +} + +.customize-control-description { + display: block; + font-style: italic; + line-height: 1.4; + margin-top: 0; + margin-bottom: 5px; +} + +.customize-section-description a.external-link:after { + font: 16px/11px dashicons; + content: "\f310"; + top: 3px; + position: relative; + padding-right: 3px; + display: inline-block; + text-decoration: none; +} + +.customize-control-color .color-picker, +.customize-control-upload div { + line-height: 28px; +} + +.customize-control .customize-inside-control-row { + line-height: 1.6; + display: block; + margin-right: 24px; + padding-top: 6px; + padding-bottom: 6px; +} + +.customize-control-radio input, +.customize-control-checkbox input, +.customize-control-nav_menu_auto_add input { + margin-left: 4px; + margin-right: -24px; +} + +.customize-control-radio { + padding: 5px 0 10px; +} + +.customize-control-radio .customize-control-title { + margin-bottom: 0; + line-height: 1.6; +} + +.customize-control-radio .customize-control-title + .customize-control-description { + margin-top: 7px; +} + +.customize-control-radio label, +.customize-control-checkbox label { + vertical-align: top; +} + +.customize-control .attachment-thumb.type-icon { + float: right; + margin: 10px; + width: auto; +} + +.customize-control .attachment-title { + font-weight: 600; + margin: 0; + padding: 5px 10px; +} + +.customize-control .attachment-meta { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; + padding: 0 10px; +} + +.customize-control .attachment-meta-title { + padding-top: 7px; +} + +/* Remove descender space. */ +.customize-control .thumbnail-image, +.customize-control-header .current, +.customize-control .wp-media-wrapper.wp-video { + line-height: 0; +} + +/* Remove descender space. */ +.customize-control-site_icon .favicon-preview .browser-preview { + vertical-align: top; +} + +.customize-control .thumbnail-image img { + cursor: pointer; +} + +#customize-controls .thumbnail-audio .thumbnail { + max-width: 64px; + max-height: 64px; + margin: 10px; + float: right; +} + +#available-menu-items .accordion-section-content .new-content-item, +.customize-control-dropdown-pages .new-content-item { + width: calc(100% - 30px); + padding: 8px 15px; + position: absolute; + bottom: 0; + z-index: 10; + background: #eee; + display: flex; +} + +.customize-control-dropdown-pages .new-content-item { + width: 100%; + padding: 5px 1px 5px 0; + position: relative; +} + +#available-menu-items .new-content-item .create-item-input, +.customize-control-dropdown-pages .new-content-item .create-item-input { + flex-grow: 10; +} + +#available-menu-items .new-content-item .add-content, +.customize-control-dropdown-pages .new-content-item .add-content { + margin: 2px 6px 2px 0; + flex-grow: 1; +} + +.customize-control-dropdown-pages .new-content-item .create-item-input.invalid { + border: 1px solid #dc3232; +} + +.customize-control-dropdown-pages .add-new-toggle { + margin-right: 1px; + font-weight: 600; + line-height: 2.2; +} + +#customize-preview iframe { + width: 100%; + height: 100%; + position: absolute; +} +#customize-preview iframe + iframe { + visibility: hidden; +} + +.wp-full-overlay-sidebar { + background: #eee; + border-left: 1px solid #ddd; +} + + +/** + * Notifications + */ + +#customize-controls .customize-control-notifications-container { /* Scoped to #customize-controls for specificity over notification styles in common.css. */ + margin: 4px 0 8px 0; + padding: 0; + cursor: default; +} + +#customize-controls .customize-control-widget_form.has-error .widget .widget-top, +.customize-control-nav_menu_item.has-error .menu-item-bar .menu-item-handle { + box-shadow: inset 0 0 0 2px #dc3232; + transition: .15s box-shadow linear; +} + +#customize-controls .customize-control-notifications-container li.notice { + list-style: none; + margin: 0 0 6px 0; + padding: 9px 14px; + overflow: hidden; +} +#customize-controls .customize-control-notifications-container .notice.is-dismissible { + padding-left: 38px; +} + +.customize-control-notifications-container li.notice:last-child { + margin-bottom: 0; +} + +#customize-controls .customize-control-nav_menu_item .customize-control-notifications-container { + margin-top: 0; +} + +#customize-controls .customize-control-widget_form .customize-control-notifications-container { + margin-top: 8px; +} + +.customize-control-text.has-error input { + outline: 2px solid #dc3232; +} + +#customize-controls #customize-notifications-area { + position: absolute; + top: 46px; + width: 100%; + border-bottom: 1px solid #ddd; + display: block; + padding: 0; + margin: 0; +} + +.wp-full-overlay.collapsed #customize-controls #customize-notifications-area { + display: none !important; +} + +#customize-controls #customize-notifications-area:not(.has-overlay-notifications), +#customize-controls .customize-section-title > .customize-control-notifications-container:not(.has-overlay-notifications), +#customize-controls .panel-meta > .customize-control-notifications-container:not(.has-overlay-notifications) { + max-height: 210px; + overflow-x: hidden; + overflow-y: auto; +} + +#customize-controls #customize-notifications-area > ul, +#customize-controls #customize-notifications-area .notice, +#customize-controls .panel-meta > .customize-control-notifications-container, +#customize-controls .panel-meta > .customize-control-notifications-container .notice, +#customize-controls .customize-section-title > .customize-control-notifications-container, +#customize-controls .customize-section-title > .customize-control-notifications-container .notice { + margin: 0; +} +#customize-controls .panel-meta > .customize-control-notifications-container, +#customize-controls .customize-section-title > .customize-control-notifications-container { + border-top: 1px solid #ddd; +} +#customize-controls #customize-notifications-area .notice, +#customize-controls .panel-meta > .customize-control-notifications-container .notice, +#customize-controls .customize-section-title > .customize-control-notifications-container .notice { + padding: 9px 14px; +} +#customize-controls #customize-notifications-area .notice.is-dismissible, +#customize-controls .panel-meta > .customize-control-notifications-container .notice.is-dismissible, +#customize-controls .customize-section-title > .customize-control-notifications-container .notice.is-dismissible { + padding-left: 38px; +} +#customize-controls #customize-notifications-area .notice + .notice, +#customize-controls .panel-meta > .customize-control-notifications-container .notice + .notice, +#customize-controls .customize-section-title > .customize-control-notifications-container .notice + .notice { + margin-top: 1px; +} + +@keyframes customize-fade-in { + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +#customize-controls .notice.notification-overlay, +#customize-controls #customize-notifications-area .notice.notification-overlay { + margin: 0; + border-right: 0; /* @todo Appropriate styles could be added for notice-error, notice-warning, notice-success, etc */ +} + +#customize-controls .customize-control-notifications-container.has-overlay-notifications { + animation: customize-fade-in 0.5s; + z-index: 30; +} + +/* Note: Styles for this are also defined in themes.css */ +#customize-controls #customize-notifications-area .notice.notification-overlay .notification-message { + clear: both; + color: #191e23; + font-size: 18px; + font-style: normal; + margin: 0; + padding: 2em 0; + text-align: center; + width: 100%; + display: block; + top: 50%; + position: relative; +} + +/* Style for custom settings */ + +/** + * Static front page + */ + +#customize-control-show_on_front.has-error { + margin-bottom: 0; +} +#customize-control-show_on_front.has-error .customize-control-notifications-container { + margin-top: 12px; +} + +/** + * Dropdowns + */ + +.accordion-section .dropdown { + float: right; + display: block; + position: relative; + cursor: pointer; +} + +.accordion-section .dropdown-content { + overflow: hidden; + float: right; + min-width: 30px; + height: 16px; + line-height: 16px; + margin-left: 16px; + padding: 4px 5px; + border: 2px solid #eee; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* @todo maybe no more used? */ +.customize-control .dropdown-arrow { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 20px; + background: #eee; +} + +.customize-control .dropdown-arrow:after { + content: "\f140"; + font: normal 20px/1 dashicons; + speak: none; + display: block; + padding: 0; + text-indent: 0; + text-align: center; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #32373c; +} + +.customize-control .dropdown-status { + color: #32373c; + background: #eee; + display: none; + max-width: 112px; +} + +.customize-control-color .dropdown { + margin-left: 5px; + margin-bottom: 5px; +} + +.customize-control-color .dropdown .dropdown-content { + background-color: #555d66; + border: 1px solid rgba(0, 0, 0, 0.15); +} + +.customize-control-color .dropdown:hover .dropdown-content { + border-color: rgba(0, 0, 0, 0.25); +} + +/** + * iOS can't scroll iframes, + * instead it expands the iframe size to match the size of the content + */ + +.ios .wp-full-overlay { + position: relative; +} + +.ios #customize-controls .wp-full-overlay-sidebar-content { + -webkit-overflow-scrolling: touch; +} + +/* Media controls */ + +.customize-control .actions .button { + margin-top: 12px; +} + +.customize-control-header .actions, +.customize-control-header .uploaded { + margin-bottom: 18px; +} + +.customize-control-header .uploaded button:not(.random), +.customize-control-header .default button:not(.random) { + width: 100%; + padding: 0; + margin: 0; + background: none; + border: none; + color: inherit; + cursor: pointer; +} + +.customize-control-header button img { + display: block; +} + +.customize-control .attachment-media-view .remove-button, +.customize-control .attachment-media-view .default-button, +.customize-control .attachment-media-view .upload-button, +.customize-control-header button.new, +.customize-control-header button.remove { + width: auto; + height: auto; + white-space: normal; +} + +.customize-control .attachment-media-view .thumbnail, +.customize-control-header .current .container { + overflow: hidden; +} + +.customize-control .attachment-media-view .placeholder, +.customize-control .attachment-media-view .button-add-media, +.customize-control-header .placeholder { + width: 100%; + position: relative; + text-align: center; + cursor: default; + border: 1px dashed #b4b9be; + box-sizing: border-box; + padding: 9px 0; + line-height: 1.6; +} + +.customize-control .attachment-media-view .button-add-media { + cursor: pointer; + background-color: #edeff0; + color: #32373c; +} + +.customize-control .attachment-media-view .button-add-media:hover { + background-color: #fbfbfc; +} + +.customize-control .attachment-media-view .button-add-media:focus { + background-color: #fbfbfc; + border-color: #007cba; + border-style: solid; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; +} + +.customize-control-header .inner { + display: none; + position: absolute; + width: 100%; + color: #555d66; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +.customize-control-header .inner, +.customize-control-header .inner .dashicons { + line-height: 20px; + top: 8px; +} + +.customize-control-header .list .inner, +.customize-control-header .list .inner .dashicons { + top: 9px; +} + +.customize-control-header .header-view { + position: relative; + width: 100%; + margin-bottom: 12px; +} + +.customize-control-header .header-view:last-child { + margin-bottom: 0px; +} + +/* Convoluted, but 'outline' support isn't good enough yet */ +.customize-control-header .header-view:after { + border: 0; +} + +.customize-control-header .header-view.selected .choice:focus { + outline: none; +} + +.customize-control-header .header-view.selected:after { + content: ""; + position: absolute; + height: auto; + top: 0; + right: 0; + bottom: 0; + left: 0; + border: 4px solid #00a0d2; + border-radius: 2px; +} + +.customize-control-header .header-view.button.selected { + border: 0; +} + +/* Header control: overlay "close" button */ + +.customize-control-header .uploaded .header-view .close { + font-size: 20px; + color: #fff; + background: #555d66; + background: rgba(0, 0, 0, 0.5); + position: absolute; + top: 10px; + right: -999px; + z-index: 1; + width: 26px; + height: 26px; + cursor: pointer; +} + +.customize-control-header .header-view:hover .close, +.customize-control-header .header-view .close:focus { + right: auto; + left: 10px; +} + +.customize-control-header .header-view .close:focus { + outline: 1px solid #5b9dd9; +} + +/* Header control: randomiz(s)er */ + +.customize-control-header .random.placeholder { + cursor: pointer; + border-radius: 2px; + height: 40px; +} + +.customize-control-header button.random { + width: 100%; + height: auto; + min-height: 40px; + white-space: normal; +} + +.customize-control-header button.random .dice { + margin-top: 4px; +} + +.customize-control-header .placeholder:hover .dice, +.customize-control-header .header-view:hover > button.random .dice { + animation: dice-color-change 3s infinite; +} + +.button-see-me { + animation: bounce .7s 1; + transform-origin: center bottom; +} + +@keyframes bounce { + from, 20%, 53%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transform: translate3d(0,0,0); + } + + 40%, 43% { + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transform: translate3d(0, -12px, 0); + } + + 70% { + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transform: translate3d(0, -6px, 0); + } + + 90% { + transform: translate3d(0,-1px,0); + } +} + +.customize-control-header .choice { + position: relative; + display: block; + margin-bottom: 9px; +} + +.customize-control-header .choice:focus { + outline: none; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 3px 1px rgba(30, 140, 190, 0.8); +} + +.customize-control-header .uploaded div:last-child > .choice { + margin-bottom: 0; +} + +.customize-control .attachment-media-view .thumbnail-image img, +.customize-control-header img { + max-width: 100%; +} + +.customize-control .attachment-media-view .remove-button, +.customize-control .attachment-media-view .default-button, +.customize-control-header .remove { + margin-left: 8px; +} + +/* Background position control */ +.customize-control-background_position .background-position-control .button-group { + display: block; +} + +/** + * Code Editor Control and Custom CSS Section + * + * Modifications to the Section Container to make the textarea full-width and + * full-height, if the control is the only control in the section. + */ + +.customize-control-code_editor textarea { + width: 100%; + font-family: Consolas, Monaco, monospace; + font-size: 12px; + padding: 6px 8px; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +.customize-control-code_editor textarea, +.customize-control-code_editor .CodeMirror { + height: 14em; +} + +#customize-controls .customize-section-description-container.section-meta.customize-info { + border-bottom: none; +} + +#sub-accordion-section-custom_css .customize-control-notifications-container { + margin-bottom: 15px; +} + +#customize-control-custom_css textarea { + display: block; + height: 500px; +} + +.customize-section-description-container + #customize-control-custom_css .customize-control-title { + margin-right: 12px; +} + +.customize-section-description-container + #customize-control-custom_css:last-child textarea { + border-left: 0; + border-right: 0; + height: calc( 100vh - 185px ); + resize: none; +} + +.customize-section-description-container + #customize-control-custom_css:last-child { + margin-right: -12px; + width: 299px; + width: calc( 100% + 24px ); + margin-bottom: -12px; +} + +.customize-section-description-container + #customize-control-custom_css:last-child .CodeMirror { + height: calc( 100vh - 185px ); +} + +.CodeMirror-lint-tooltip, +.CodeMirror-hints { + z-index: 500000 !important; +} + +.customize-section-description-container + #customize-control-custom_css:last-child .customize-control-notifications-container { + margin-right: 12px; + margin-left: 12px; +} + +.theme-browser .theme.active .theme-actions, +.wp-customizer .theme-browser .theme .theme-actions { + padding: 9px 15px; + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); +} + +@media screen and (max-width: 640px) { + .customize-section-description-container + #customize-control-custom_css:last-child { + margin-left: 0; + } + + .customize-section-description-container + #customize-control-custom_css:last-child textarea { + height: calc( 100vh - 140px ); + } +} + +/** + * Themes + */ + +#customize-theme-controls .control-panel-themes { + border-bottom: none; +} + +#customize-theme-controls .control-panel-themes > .accordion-section-title:hover, /* Not a focusable element. */ +#customize-theme-controls .control-panel-themes > .accordion-section-title { + cursor: default; + background: #fff; + color: #555d66; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + border-right: none; + border-left: none; + margin: 0 0 15px 0; + padding-left: 100px; /* Space for the button */ +} + +#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child:hover, /* Not a focusable element. */ +#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child { + border-top: 0; +} + +#customize-theme-controls .control-section-themes > .accordion-section-title:hover, /* Not a focusable element. */ +#customize-theme-controls .control-section-themes > .accordion-section-title { + margin: 0 0 15px; +} + +#customize-controls .customize-themes-panel .accordion-section-title:hover, +#customize-controls .customize-themes-panel .accordion-section-title { + margin: 15px -8px; +} + +#customize-controls .control-section-themes .accordion-section-title, +#customize-controls .customize-themes-panel .accordion-section-title { + padding-left: 100px; /* Space for the button */ +} + +.control-panel-themes .accordion-section-title span.customize-action, +#customize-controls .customize-section-title span.customize-action, +#customize-controls .control-section-themes .accordion-section-title span.customize-action, +#customize-controls .customize-section-title span.customize-action { + font-size: 13px; + display: block; + font-weight: 400; +} + +#customize-theme-controls .control-panel-themes .accordion-section-title .change-theme { + position: absolute; + left: 10px; + top: 50%; + margin-top: -14px; + font-weight: 400; +} + +#customize-theme-controls .control-panel-themes > .accordion-section-title:after { + display: none; +} + +.control-panel-themes .customize-themes-full-container { + position: fixed; + top: 0; + right: 0; + transition: .18s right ease-in-out; + margin: 0 300px 0 0; + padding: 71px 0 25px; + overflow-y: scroll; + width: calc(100% - 300px); + height: calc(100% - 96px); + background: #eee; + z-index: 20; +} + +@media screen and (min-width: 1670px) { + .control-panel-themes .customize-themes-full-container { + width: 82%; + left: 0; + right: initial; + } +} + +.modal-open .control-panel-themes .customize-themes-full-container { + overflow-y: visible; +} + +/* Animations for opening the themes panel */ +#customize-save-button-wrapper, +#customize-header-actions .spinner, +#customize-header-actions .customize-controls-preview-toggle { + transition: .18s margin ease-in-out; +} + +#customize-footer-actions, +#customize-footer-actions .collapse-sidebar { + bottom: 0; + transition: .18s bottom ease-in-out; +} + +.in-themes-panel:not(.animating) #customize-header-actions .spinner, +.in-themes-panel:not(.animating) #customize-header-actions .customize-controls-preview-toggle, +.in-themes-panel:not(.animating) #customize-preview, +.in-themes-panel:not(.animating) #customize-footer-actions { + visibility: hidden; +} + +.wp-full-overlay.in-themes-panel { + background: #eee; /* Prevents a black flash when fading in the panel */ +} + +.in-themes-panel #customize-save-button-wrapper, +.in-themes-panel #customize-header-actions .spinner, +.in-themes-panel #customize-header-actions .customize-controls-preview-toggle { + margin-top: -46px; /* Height of header actions bar */ +} + +.in-themes-panel #customize-footer-actions, +.in-themes-panel #customize-footer-actions .collapse-sidebar { + bottom: -45px; +} + +/* Don't show the theme count while the panel opens, as it's in the wrong place during the animation */ +.in-themes-panel.animating .control-panel-themes .filter-themes-count { + display: none; +} + +.in-themes-panel.wp-full-overlay .wp-full-overlay-sidebar-content { + bottom: 0; +} + +.themes-filter-bar .feature-filter-toggle { + float: left; + margin: 3px 25px 3px 0; +} + +.themes-filter-bar .feature-filter-toggle:before { + content: "\f111"; + margin: 0 0 0 5px; + font: normal 16px/1 dashicons; + vertical-align: text-bottom; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.themes-filter-bar .feature-filter-toggle.open { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); +} + +.themes-filter-bar .feature-filter-toggle .filter-count-filters { + display: none; +} + +.filter-drawer { + box-sizing: border-box; + width: 100%; + position: absolute; + top: 46px; + right: 0; + padding: 25px 25px 25px 0; + border-top: 0; + margin: 0; + background: #eee; + border-bottom: 1px solid #ddd; +} + +.filter-drawer .filter-group { + margin: 0 0 0 25px; + width: calc( (100% - 75px) / 3); + min-width: 200px; + max-width: 320px; +} + +/* Adds a delay before fading in to avoid it "jumping" */ +@keyframes themes-fade-in { + 0% { + opacity: 0; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +.control-panel-themes .customize-themes-full-container.animate { + animation: .6s themes-fade-in 1; +} + +.in-themes-panel:not(.animating) .control-panel-themes .filter-themes-count { + animation: .6s themes-fade-in 1; +} + +.control-panel-themes .filter-themes-count { + position: relative; + float: left; + line-height: 2.6; +} + +.control-panel-themes .filter-themes-count .themes-displayed { + font-weight: 600; + color: #555d66; +} + +.customize-themes-notifications { + margin: 0; +} + +.control-panel-themes .customize-themes-notifications .notice { + margin: 0 0 25px 0; +} + +.customize-themes-full-container .customize-themes-section { + display: none !important; /* There is unknown JS that perpetually tries to show all theme sections when more items are added. */ + overflow: hidden; +} + +.customize-themes-full-container .customize-themes-section.current-section { + display: list-item !important; /* There is unknown JS that perpetually tries to show all theme sections when more items are added. */ +} + +.control-section .customize-section-text-before { + padding: 0 15px 8px 0; + margin: 15px 0 0 0; + line-height: 16px; + border-bottom: 1px solid #ddd; + color: #555d66; +} + +.control-panel-themes .customize-themes-section-title { + width: 100%; + background: #fff; + box-shadow: none; + outline: none; + border-top: none; + border-bottom: 1px solid #ddd; + border-right: 4px solid #fff; + border-left: none; + cursor: pointer; + padding: 10px 15px; + position: relative; + text-align: right; + font-size: 14px; + font-weight: 600; + color: #555d66; + text-shadow: none; +} + +.control-panel-themes #accordion-section-installed_themes { + border-top: 1px solid #ddd; +} + +.control-panel-themes .theme-section { + margin: 0; + position: relative; +} + +.control-panel-themes .customize-themes-section-title:focus, +.control-panel-themes .customize-themes-section-title:hover { + border-right-color: #0073aa; + color: #0073aa; + background: #f5f5f5; +} + +.customize-themes-section-title:not(.selected):after { + content: ""; + display: block; + position: absolute; + top: 9px; + left: 15px; + width: 18px; + height: 18px; + border-radius: 100%; + border: 1px solid #ccc; + background: #fff; +} + +.control-panel-themes .theme-section .customize-themes-section-title.selected:after { + content: "\f147"; + font: 16px/1 dashicons; + box-sizing: border-box; + width: 20px; + height: 20px; + padding: 3px 1px 1px 3px; /* Re-align the icon to the smaller grid */ + border-radius: 100%; + position: absolute; + top: 9px; + left: 15px; + background: #0073aa; + color: #fff; +} + +.control-panel-themes .customize-themes-section-title.selected { + color: #0073aa; +} + +#customize-theme-controls .themes.accordion-section-content { + position: relative; + right: 0; + padding: 0; + width: 100%; +} + +.loading .customize-themes-section .spinner { + display: block; + visibility: visible; + position: relative; + clear: both; + width: 20px; + height: 20px; + right: calc(50% - 10px); + float: none; + margin-top: 50px; +} + +.customize-themes-section .no-themes, +.customize-themes-section .no-themes-local { + display: none; +} + +.themes-section-installed_themes .theme .notice-success:not(.updated-message) { + display: none; /* Hide "installed" notice on installed themes tab. */ +} + +.customize-control-theme .theme { + width: 100%; + margin: 0; + border: 1px solid #ddd; + background: #fff; +} + +.customize-control-theme .theme .theme-name, .customize-control-theme .theme .theme-actions { + background: #fff; + border: none; +} + +.customize-control.customize-control-theme { /* override most properties on .customize-control */ + box-sizing: border-box; + width: 25%; + max-width: 600px; /* Max. screenshot size / 2 */ + margin: 0 0 25px 25px; + padding: 0; + clear: none; +} + +/* 5 columns above 2100px */ +@media screen and (min-width: 2101px) { + .customize-control.customize-control-theme { + width: calc( ( 100% - 125px ) / 5 - 1px ); /* 1px offset accounts for browser rounding, typical all grids */ + } +} + +/* 4 columns up to 2100px */ +@media screen and (min-width: 1601px) and (max-width: 2100px) { + .customize-control.customize-control-theme { + width: calc( ( 100% - 100px ) / 4 - 1px ); + } +} + +/* 3 columns up to 1600px */ +@media screen and (min-width: 1201px) and (max-width: 1600px) { + .customize-control.customize-control-theme { + width: calc( ( 100% - 75px ) / 3 - 1px ); + } +} + +/* 2 columns up to 1200px */ +@media screen and (min-width: 851px) and (max-width: 1200px) { + .customize-control.customize-control-theme { + width: calc( ( 100% - 50px ) / 2 - 1px ); + + } +} + +/* 1 column up to 850 px */ +@media screen and (max-width: 850px) { + .customize-control.customize-control-theme { + width: 100%; + } +} + +.wp-customizer .theme-browser .themes { + padding: 0 25px 25px 0; + transition: .18s margin-top linear; +} + +.wp-customizer .theme-browser .theme .theme-actions { + opacity: 1; +} + +#customize-controls h3.theme-name { + font-size: 15px; +} + +#customize-controls .theme-overlay .theme-name { + font-size: 32px; +} + +.customize-preview-header.themes-filter-bar { + position: fixed; + top: 0; + right: 300px; + width: calc(100% - 300px); + height: 46px; + background: #eee; + z-index: 10; + padding: 6px 25px; + box-sizing: border-box; + border-bottom: 1px solid #ddd; +} + +@media screen and (min-width: 1670px) { + .customize-preview-header.themes-filter-bar { + width: 82%; + left: 0; + right: initial; + } +} + +.themes-filter-bar .themes-filter-container { + margin: 0; + padding: 0; +} + +.themes-filter-bar .wp-filter-search { + line-height: 1.8; + padding: 6px 30px 6px 10px; + max-width: 100%; + width: 40%; + min-width: 300px; + position: absolute; + top: 6px; + right: 25px; + height: 32px; + margin: 1px 0; +} + +/* Unstick the filter bar on short windows/screens. This breakpoint is based on the + current length of .org feature filters assuming translations do not wrap lines. */ +@media screen and (max-height: 540px), screen and (max-width: 1018px) { + .customize-preview-header.themes-filter-bar { + position: relative; + right: 0; + width: 100%; + margin: 0 0 25px 0; + } + .filter-drawer { + top: 46px; + } + .wp-customizer .theme-browser .themes { + padding: 0 25px 25px 0; + overflow: hidden; + } + + .control-panel-themes .customize-themes-full-container { + margin-top: 0; + padding: 0; + height: 100%; + width: calc(100% - 300px); + } +} + +@media screen and (max-width: 1018px) { + .filter-drawer .filter-group { + width: calc( (100% - 50px) / 2); + } +} + +@media screen and (max-width: 900px) { + .customize-preview-header.themes-filter-bar { + height: 86px; + padding-top: 46px; + } + + .themes-filter-bar .wp-filter-search { + width: calc(100% - 50px); + margin: 0; + min-width: 200px; + } + + .filter-drawer { + top: 86px; + } + + .control-panel-themes .filter-themes-count { + float: right; + } +} + +@media screen and (max-width: 792px) { + .filter-drawer .filter-group { + width: calc( 100% - 25px); + } +} + +.control-panel-themes .customize-themes-mobile-back { + display: none; +} + +/* Mobile - toggle between themes and filters */ +@media screen and (max-width: 600px) { + + .filter-drawer { + top: 132px; + } + + .wp-full-overlay.showing-themes .control-panel-themes .filter-themes-count .filter-themes { + display: block; + float: left; + } + + .control-panel-themes .customize-themes-full-container { + width: 100%; + margin: 0; + padding-top: 46px; + height: calc(100% - 46px); + z-index: 1; + display: none; + } + + .showing-themes .control-panel-themes .customize-themes-full-container { + display: block; + } + + .wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back { + display: block; + position: fixed; + top: 0; + right: 0; + background: #eee; + color: #444; + border-radius: 0; + box-shadow: none; + border: none; + height: 46px; + width: 100%; + z-index: 10; + text-align: right; + text-shadow: none; + border-bottom: 1px solid #ddd; + border-right: 4px solid transparent; + margin: 0; + padding: 0; + font-size: 0; + overflow: hidden; + } + + .wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:before { + right: 0; + top: 0; + height: 46px; + width: 26px; + display: block; + line-height: 2.3; + padding: 0 8px 0 8px; + border-left: 1px solid #ddd; + } + + .wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:hover, + .wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:focus { + color: #0073aa; + background: #f3f3f5; + border-right-color: #0073aa; + outline: none; + box-shadow: none; + } + + .showing-themes #customize-header-actions { + display: none; + } + + #customize-controls { + width: 100%; + } +} + +/* Details View */ +.wp-customizer .theme-overlay { + display: none; +} + +.wp-customizer.modal-open .theme-overlay { + position: fixed; + right: 0; + top: 0; + left: 0; + bottom: 0; + z-index: 109; +} + +/* Avoid a z-index war by resetting elements that should be under the overlay. + This is likely required because of the way that sections and panels are positioned. */ +.wp-customizer.modal-open #customize-header-actions, +.wp-customizer.modal-open .control-panel-themes .filter-themes-count, +.wp-customizer.modal-open .control-panel-themes .customize-themes-section-title.selected:after { + z-index: -1; +} + +.wp-full-overlay.in-themes-panel.themes-panel-expanded #customize-controls .wp-full-overlay-sidebar-content { + overflow: visible; +} + +.wp-customizer .theme-overlay .theme-backdrop { + background: rgba(238, 238, 238, 0.75); + position: fixed; + z-index: 110; +} + +.wp-customizer .theme-overlay .star-rating { + float: right; + margin-left: 8px; +} + +.wp-customizer .theme-rating .num-ratings { + line-height: 20px; +} + +.wp-customizer .theme-overlay .theme-wrap { + right: 90px; + left: 90px; + top: 45px; + bottom: 45px; + z-index: 120; +} + +.wp-customizer .theme-overlay .theme-actions { + text-align: left; /* Because there're only one or two actions, match the UI pattern of media modals and right-align the action. */ + padding: 10px 25px; + background: #eee; + border-top: 1px solid #ddd; +} + +.wp-customizer .theme-overlay .theme-actions .theme-install.preview { + margin-right: 8px; +} + +.control-panel-themes .theme-actions .delete-theme { + right: 15px; /* these override themes.css on mobile */ + left: auto; + bottom: auto; + position: absolute; +} + +.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content { + overflow: visible; /* Prevent the top-level Customizer controls from becoming visible when elements on the right of the details modal are focused. */ +} + +.wp-customizer .theme-header { + background: #eee; +} + +.wp-customizer .theme-overlay .theme-header button, +.wp-customizer .theme-overlay .theme-header .close:before { + color: #444; +} + +.wp-customizer .theme-overlay .theme-header .close:focus, +.wp-customizer .theme-overlay .theme-header .close:hover, +.wp-customizer .theme-overlay .theme-header .right:focus, +.wp-customizer .theme-overlay .theme-header .right:hover, +.wp-customizer .theme-overlay .theme-header .left:focus, +.wp-customizer .theme-overlay .theme-header .left:hover { + background: #fff; + border-bottom: 4px solid #0073aa; + color: #0073aa; +} + +.wp-customizer .theme-overlay .theme-header .close:focus:before, +.wp-customizer .theme-overlay .theme-header .close:hover:before { + color: #0073aa; +} + +.wp-customizer .theme-overlay .theme-header button.disabled, +.wp-customizer .theme-overlay .theme-header button.disabled:hover, +.wp-customizer .theme-overlay .theme-header button.disabled:focus { + border-bottom: none; + background: transparent; + color: #ccc; +} + +/* Small Screens */ +@media (max-width: 850px), (max-height: 472px) { + .wp-customizer .theme-overlay .theme-wrap { + right: 0; + left: 0; + top: 0; + bottom: 0; + } + + .wp-customizer .theme-browser .themes { + padding-left: 25px; + } +} + +/* Handle cheaters. */ +body.cheatin { + font-size: medium; + height: auto; + background: #fff; + margin: 50px auto 2em; + padding: 1em 2em; + max-width: 700px; + min-width: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13); +} + +body.cheatin h1 { + border-bottom: 1px solid #ddd; + clear: both; + color: #555d66; + font-size: 24px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + margin: 30px 0 0 0; + padding: 0; + padding-bottom: 7px; +} + +body.cheatin p { + font-size: 14px; + line-height: 1.5; + margin: 25px 0 20px; +} + +/** + * Widgets and Menus common styles + */ + +/* higher specificity than .wp-core-ui .button */ +#customize-theme-controls .add-new-widget, +#customize-theme-controls .add-new-menu-item { + cursor: pointer; + float: left; + margin: 0; + margin-right: 10px; + transition: all 0.2s; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + outline: none; +} + +.reordering .add-new-widget, +.reordering .add-new-menu-item { + opacity: 0.2; + pointer-events: none; + cursor: not-allowed; /* doesn't work in conjunction with pointer-events */ +} + +.add-new-widget:before, +.add-new-menu-item:before, +#available-menu-items .new-content-item .add-content:before { + content: "\f132"; + display: inline-block; + position: relative; + right: -2px; + top: 0; + font: normal 20px/1 dashicons; + vertical-align: middle; + transition: all 0.2s; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Reordering */ +.reorder-toggle { + float: left; + padding: 5px 8px; + text-decoration: none; + cursor: pointer; + outline: none; +} + +.reorder, +.reordering .reorder-done { + display: block; + padding: 5px 8px; +} + +.reorder-done, +.reordering .reorder { + display: none; +} + +.widget-reorder-nav span, +.menu-item-reorder-nav button { + position: relative; + overflow: hidden; + float: right; + display: block; + width: 33px; /* was 42px for mobile */ + height: 43px; + color: #82878c; + text-indent: -9999px; + cursor: pointer; + outline: none; +} + +.menu-item-reorder-nav button { + width: 30px; + height: 40px; + background: transparent; + border: none; + box-shadow: none; +} + +.widget-reorder-nav span:before, +.menu-item-reorder-nav button:before { + display: inline-block; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + font: normal 20px/43px dashicons; + text-align: center; + text-indent: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.widget-reorder-nav span:hover, +.widget-reorder-nav span:focus, +.menu-item-reorder-nav button:hover, +.menu-item-reorder-nav button:focus { + color: #191e23; + background: #eee; +} + +.move-widget-down:before, +.menus-move-down:before { + content: "\f347"; +} + +.move-widget-up:before, +.menus-move-up:before { + content: "\f343"; +} + +#customize-theme-controls .first-widget .move-widget-up, +#customize-theme-controls .last-widget .move-widget-down, +.move-up-disabled .menus-move-up, +.move-down-disabled .menus-move-down, +.move-right-disabled .menus-move-right, +.move-left-disabled .menus-move-left { + color: #d5d5d5; + background-color: #fff; + cursor: default; + pointer-events: none; +} + +/** + * New widget and Add-menu-items modes and panels + */ + +.wp-full-overlay-main { + left: auto; /* this overrides a right: 0; which causes the preview to resize, I'd rather have it go off screen at the normal size. */ + width: 100%; +} + +body.adding-widget .add-new-widget, +body.adding-widget .add-new-widget:hover, +.adding-menu-items .add-new-menu-item, +.adding-menu-items .add-new-menu-item:hover, +.add-menu-toggle.open, +.add-menu-toggle.open:hover { + background: #eee; + border-color: #929793; + color: #32373c; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); +} + +body.adding-widget .add-new-widget:before, +.adding-menu-items .add-new-menu-item:before, +#accordion-section-add_menu .add-new-menu-item.open:before { + transform: rotate(-45deg); +} + +#available-widgets, +#available-menu-items { + position: absolute; + top: 0; + bottom: 0; + right: -301px; + visibility: hidden; + overflow-x: hidden; + overflow-y: auto; + width: 300px; + margin: 0; + z-index: 4; + background: #eee; + transition: right .18s; + border-left: 1px solid #ddd; +} + +#available-widgets .customize-section-title, +#available-menu-items .customize-section-title { + display: none; +} + +#available-widgets-list { + top: 60px; + position: absolute; + overflow: auto; + bottom: 0; + width: 100%; + border-top: 1px solid #ddd; +} + +.no-widgets-found #available-widgets-list { + border-top: none; +} + +#available-widgets-filter { + position: fixed; + top: 0; + z-index: 1; + width: 300px; + background: #eee; +} + +/* search field container */ +#available-widgets-filter, +#available-menu-items-search .accordion-section-title { + padding: 13px 15px; + box-sizing: border-box; +} + +#available-widgets-filter input, +#available-menu-items-search input { + width: 100%; + min-height: 32px; + margin: 1px 0; + padding: 0 30px; +} + +#available-widgets-filter input::-ms-clear, +#available-menu-items-search input::-ms-clear { + display: none; /* remove the "x" in IE, which conflicts with the "x" icon on button.clear-results */ +} + +#available-menu-items-search .search-icon, +#available-widgets-filter .search-icon { + display: block; + position: absolute; + top: 15px; /* 13 container padding +1 input margin +1 input border */ + right: 16px; + width: 30px; + height: 30px; + line-height: 2.1; + text-align: center; + color: #72777c; +} + +#available-widgets-filter .clear-results, +#available-menu-items-search .clear-results { + position: absolute; + top: 15px; /* 13 container padding +1 input margin +1 input border */ + left: 16px; + width: 30px; + height: 30px; + padding: 0; + border: 0; + cursor: pointer; + background: none; + color: #a00; + text-decoration: none; + outline: 0; +} + +#available-widgets-filter .clear-results, +#available-menu-items-search .clear-results, +#available-menu-items-search.loading .clear-results.is-visible { + display: none; +} + +#available-widgets-filter .clear-results.is-visible, +#available-menu-items-search .clear-results.is-visible { + display: block; +} + +#available-widgets-filter .clear-results:before, +#available-menu-items-search .clear-results:before { + content: "\f335"; + font: normal 20px/1 dashicons; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#available-widgets-filter .clear-results:hover, +#available-widgets-filter .clear-results:focus, +#available-menu-items-search .clear-results:hover, +#available-menu-items-search .clear-results:focus { + color: #dc3232; +} + +#available-widgets-filter .clear-results:focus, +#available-menu-items-search .clear-results:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +#available-menu-items-search .search-icon:after, +#available-widgets-filter .search-icon:after, +.themes-filter-bar .search-icon:after { + content: "\f179"; + font: normal 20px/1 dashicons; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.themes-filter-bar .search-icon { + position: absolute; + top: 7px; + right: 26px; + z-index: 1; + color: #72777c; + height: 30px; + width: 30px; + line-height: 2; + text-align: center; +} + +.no-widgets-found-message { + display: none; + margin: 0; + padding: 0 15px; + line-height: inherit; +} + +.no-widgets-found .no-widgets-found-message { + display: block; +} + +#available-widgets .widget-top, +#available-widgets .widget-top:hover, +#available-menu-items .item-top, +#available-menu-items .item-top:hover { + border: none; + background: transparent; + box-shadow: none; +} + +#available-widgets .widget-tpl, +#available-menu-items .item-tpl { + position: relative; + padding: 15px 60px 15px 15px; + background: #fff; + border-bottom: 1px solid #ddd; + border-right: 4px solid #fff; + transition: + .15s color ease-in-out, + .15s background-color ease-in-out, + .15s border-color ease-in-out; + cursor: pointer; + display: none; +} + +#available-widgets .widget, +#available-menu-items .item { + position: static; +} + + +/* Responsive */ +.customize-controls-preview-toggle { + display: none; +} + +@media only screen and (max-width: 782px) { + .wp-customizer .theme:not(.active):hover .theme-actions, + .wp-customizer .theme:not(.active):focus .theme-actions { + display: block; + } + + .wp-customizer .theme-browser .theme.active .theme-name span { + display: inline; + } + + .customize-control-header button.random .dice { + margin-top: 0; + } + + .customize-control-radio .customize-inside-control-row, + .customize-control-checkbox .customize-inside-control-row, + .customize-control-nav_menu_auto_add .customize-inside-control-row { + margin-right: 32px; + } + + .customize-control-radio input, + .customize-control-checkbox input, + .customize-control-nav_menu_auto_add input { + margin-right: -32px; + } + + .customize-control input[type="radio"] + label + br, + .customize-control input[type="checkbox"] + label + br { + line-height: 2.5; /* For widgets checkboxes */ + } + + .customize-control .date-time-fields select { + height: 39px; + } + + .date-time-fields .date-input.month { + width: 79px; + } + + .date-time-fields .date-input.day, + .date-time-fields .date-input.hour, + .date-time-fields .date-input.minute { + width: 55px; + } + + .date-time-fields .date-input.year { + width: 80px; + } + + #customize-control-changeset_preview_link a { + bottom: 16px; + } + + .preview-link-wrapper .customize-copy-preview-link.preview-control-element.button { + bottom: 10px; + } + + .media-widget-control .media-widget-buttons .button.edit-media, + .media-widget-control .media-widget-buttons .button.change-media, + .media-widget-control .media-widget-buttons .button.select-media { + margin-top: 12px; + } + + .wp-core-ui .themes-filter-bar .feature-filter-toggle { + margin: 3px 25px 3px 0; + } +} + +@media screen and (max-width: 1200px) { + .outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main, + .adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main, + .adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main { + right: 67%; + } +} + +@media screen and (max-width: 640px) { + + /* when the sidebar is collapsed and switching to responsive view, + bring it back see ticket #35220 */ + .wp-full-overlay.collapsed #customize-controls { + margin-right: 0; + } + + .wp-full-overlay-sidebar .wp-full-overlay-sidebar-content { + bottom: 0; + } + + .customize-controls-preview-toggle { + display: block; + position: absolute; + top: 0; + right: 48px; + line-height: 3.2; + font-size: 14px; + padding: 0 12px; + margin: 0; + height: 45px; + background: #eee; + border: 0; + border-left: 1px solid #ddd; + color: #555d66; + cursor: pointer; + transition: color .1s ease-in-out, background .1s ease-in-out; + } + + #customize-footer-actions, + /*#customize-preview,*/ + .customize-controls-preview-toggle .controls, + .preview-only .wp-full-overlay-sidebar-content, + .preview-only .customize-controls-preview-toggle .preview { + display: none; + } + + .preview-only #customize-save-button-wrapper { + margin-top: -46px; + } + + .customize-controls-preview-toggle .preview:before, + .customize-controls-preview-toggle .controls:before { + font: normal 20px/1 dashicons; + content: "\f177"; + position: relative; + top: 4px; + margin-left: 6px; + } + + .customize-controls-preview-toggle .controls:before { + content: "\f540"; + } + + .preview-only #customize-controls { + height: 45px; + } + + .preview-only #customize-preview, + .preview-only .customize-controls-preview-toggle .controls { + display: block; + } + + .wp-core-ui.wp-customizer .button { + min-height: 30px; + padding: 0 14px; + line-height: 2; + font-size: 14px; + vertical-align: middle; + } + + #customize-control-changeset_status .customize-inside-control-row { + padding-top: 15px; + } + + body.adding-widget div#available-widgets, + body.adding-menu-items div#available-menu-items, + body.outer-section-open div#customize-sidebar-outer-content { + width: 100%; + } + + #available-widgets .customize-section-title, + #available-menu-items .customize-section-title { + display: block; + margin: 0; + } + + #available-widgets .customize-section-back, + #available-menu-items .customize-section-back { + height: 69px; + } + + #available-widgets .customize-section-title h3, + #available-menu-items .customize-section-title h3 { + font-size: 20px; + font-weight: 200; + padding: 9px 14px 12px 10px; + margin: 0; + line-height: 24px; + color: #555d66; + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + #available-widgets .customize-section-title .customize-action, + #available-menu-items .customize-section-title .customize-action { + font-size: 13px; + display: block; + font-weight: 400; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + #available-widgets-filter { + position: relative; + width: 100%; + height: auto; + } + + #available-widgets-list { + top: 130px; + } + + #available-menu-items-search .clear-results, + #available-menu-items-search .search-icon { + top: 85px; /* 70 section title height + 13 container padding +1 input margin +1 input border */ + } + + .reorder, + .reordering .reorder-done { + padding: 8px; + } + + .wp-core-ui .themes-filter-bar .feature-filter-toggle { + margin: 0; + } +} + +@media screen and (max-width: 600px) { + .wp-full-overlay.expanded { + margin-right: 0; + } + + body.adding-widget div#available-widgets, + body.adding-menu-items div#available-menu-items, + body.outer-section-open div#customize-sidebar-outer-content { + top: 46px; + z-index: 10; + } + + body.wp-customizer .wp-full-overlay.expanded #customize-sidebar-outer-content { + right: -100%; + } + + body.wp-customizer.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content { + right: 0; + } +} diff --git a/wp-admin/css/customize-controls-rtl.min.css b/wp-admin/css/customize-controls-rtl.min.css new file mode 100644 index 0000000..f8be857 --- /dev/null +++ b/wp-admin/css/customize-controls-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{overflow:hidden;-webkit-text-size-adjust:100%}.customize-controls-close,.widget-control-actions a{text-decoration:none}#customize-controls h3{font-size:14px}#customize-controls img{max-width:100%}#customize-controls .submit{text-align:center}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked{background-color:rgba(0,0,0,.7);padding:25px}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .customize-changeset-locked-message{margin-right:auto;margin-left:auto;max-width:366px;min-height:64px;width:auto;padding:25px 109px 25px 25px;position:relative;background:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);line-height:1.5;overflow-y:auto;text-align:right;top:calc(50% - 100px)}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .currently-editing{margin-top:0}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .action-buttons{margin-bottom:0}.customize-changeset-locked-avatar{width:64px;position:absolute;right:25px;top:25px}.wp-core-ui.wp-customizer .customize-changeset-locked-message a.button{margin-left:10px;margin-top:0}#customize-controls .description{color:#555d66}#customize-save-button-wrapper{float:left;margin-top:9px}body:not(.ready) #customize-save-button-wrapper .save{visibility:hidden}#customize-save-button-wrapper .save{float:right;border-radius:3px;box-shadow:none;margin-top:0}#customize-save-button-wrapper .save:focus,#publish-settings:focus{box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db}#customize-save-button-wrapper .save.has-next-sibling{border-radius:0 3px 3px 0}#customize-sidebar-outer-content{position:absolute;top:0;bottom:0;right:0;visibility:hidden;overflow-x:hidden;overflow-y:auto;width:100%;margin:0;z-index:-1;background:#eee;transition:right .18s;border-left:1px solid #ddd;border-right:1px solid #ddd;height:100%}#customize-theme-controls .control-section-outer{display:none!important}#customize-outer-theme-controls .accordion-section-content{padding:12px}#customize-outer-theme-controls .accordion-section-content.open{display:block}.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{visibility:visible;right:100%;transition:right .18s}.customize-outer-pane-parent{margin:0}.outer-section-open .wp-full-overlay.expanded .wp-full-overlay-main{right:300px;opacity:.4}.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-menu-items .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main{right:64%}#customize-outer-theme-controls li.notice{padding-top:8px;padding-bottom:8px;margin-right:0;margin-bottom:10px}#publish-settings{text-indent:0;border-radius:3px 0 0 3px;padding-right:0;padding-left:0;box-shadow:none;font-size:14px;width:30px;float:right;transform:none;margin-top:0;line-height:2}body.trashing #customize-save-button-wrapper .save,body.trashing #publish-settings,body:not(.ready) #publish-settings{display:none}#customize-header-actions .spinner{margin-top:13px;margin-left:4px}.saving #customize-header-actions .spinner,.trashing #customize-header-actions .spinner{visibility:visible}#customize-header-actions{border-bottom:1px solid #ddd}#customize-controls .wp-full-overlay-sidebar-content{overflow-y:auto;overflow-x:hidden}.outer-section-open #customize-controls .wp-full-overlay-sidebar-content{background:#eee}#customize-controls .customize-info{border:none;border-bottom:1px solid #ddd;margin-bottom:15px}#customize-control-changeset_preview_link input,#customize-control-changeset_status .customize-inside-control-row{background-color:#fff;border-bottom:1px solid #ddd;box-sizing:content-box;width:100%;margin-right:-12px;padding-right:12px;padding-left:12px}#customize-control-trash_changeset{margin-top:20px}#customize-control-trash_changeset .button-link{position:relative;padding-right:24px;display:inline-block}#customize-control-trash_changeset .button-link:before{content:"\f182";font:normal 22px dashicons;text-decoration:none;position:absolute;right:0;top:-2px}#customize-controls .date-input:invalid{border-color:#dc3232}#customize-control-changeset_status .customize-inside-control-row{padding-top:10px;padding-bottom:10px;font-weight:500}#customize-control-changeset_status .customize-inside-control-row:first-of-type{border-top:1px solid #ddd}#customize-control-changeset_status .customize-control-title{margin-bottom:6px}#customize-control-changeset_status input{margin-right:0}#customize-control-changeset_preview_link{position:relative;display:block}.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button{margin:0;position:absolute;bottom:9px;left:0}.preview-link-wrapper{position:relative}.customize-copy-preview-link:after,.customize-copy-preview-link:before{content:"";height:28px;position:absolute;background:#fff;top:-1px}.customize-copy-preview-link:before{right:-10px;width:9px;opacity:.75}.customize-copy-preview-link:after{right:-5px;width:4px;opacity:.8}#customize-control-changeset_preview_link input{line-height:2.85714286;border-top:1px solid #ddd;border-right:none;border-left:none;text-indent:-999px;color:#fff;min-height:40px}#customize-control-changeset_preview_link label{position:relative;display:block}#customize-control-changeset_preview_link a{display:inline-block;position:absolute;white-space:nowrap;overflow:hidden;width:90%;bottom:14px;font-size:14px;text-decoration:none}#customize-control-changeset_preview_link a.disabled,#customize-control-changeset_preview_link a.disabled:active,#customize-control-changeset_preview_link a.disabled:focus,#customize-control-changeset_preview_link a.disabled:visited{color:#000;opacity:.4;cursor:default;outline:0;box-shadow:none}#sub-accordion-section-publish_settings .customize-section-description-container{display:none}#customize-controls .customize-info.section-meta{margin-bottom:15px}.customize-control-date_time .customize-control-description+.date-time-fields.includes-time{margin-top:10px}.customize-control.customize-control-date_time .date-time-fields .date-input.day{margin-left:0}.date-time-fields .date-input.month{width:auto;margin:0}.date-time-fields .date-input.day,.date-time-fields .date-input.hour,.date-time-fields .date-input.minute{width:46px}.date-time-fields .date-input.year{width:65px}.date-time-fields .date-input.meridian{width:auto;margin:0}.date-time-fields .time-row{margin-top:12px}#customize-control-changeset_preview_link{margin-top:6px}#customize-control-changeset_status{margin-bottom:0;padding-bottom:0}#customize-control-changeset_scheduled_date{box-sizing:content-box;width:100%;margin-right:-12px;padding:12px;background:#fff;border-bottom:1px solid #ddd;margin-bottom:0}#customize-control-changeset_scheduled_date .customize-control-description{font-style:normal}#customize-controls .customize-info.is-in-view,#customize-controls .customize-section-title.is-in-view{position:absolute;z-index:9;width:100%;box-shadow:0 1px 0 rgba(0,0,0,.1)}#customize-controls .customize-section-title.is-in-view{margin-top:0}#customize-controls .customize-info.is-in-view+.accordion-section{margin-top:15px}#customize-controls .customize-info.is-sticky,#customize-controls .customize-section-title.is-sticky{position:fixed;top:46px}#customize-controls .customize-info .accordion-section-title{background:#fff;color:#555d66;border-right:none;border-left:none;border-bottom:none;cursor:default}#customize-controls .customize-info .accordion-section-title:focus:after,#customize-controls .customize-info .accordion-section-title:hover:after,#customize-controls .customize-info.open .accordion-section-title:after{color:#32373c}#customize-controls .customize-info .accordion-section-title:after{display:none}#customize-controls .customize-info .preview-notice{font-size:13px;line-height:1.9}#customize-controls .customize-info .panel-title,#customize-controls .customize-pane-child .customize-section-title h3,#customize-controls .customize-pane-child h3.customize-section-title,#customize-outer-theme-controls .customize-pane-child .customize-section-title h3,#customize-outer-theme-controls .customize-pane-child h3.customize-section-title{font-size:20px;font-weight:200;line-height:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#customize-controls .customize-section-title span.customize-action{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#customize-controls .customize-info .customize-help-toggle{position:absolute;top:4px;left:1px;padding:20px 10px 10px 20px;width:20px;height:20px;cursor:pointer;box-shadow:none;-webkit-appearance:none;background:0 0;color:#555d66;border:none}#customize-controls .customize-info .customize-help-toggle:before{position:absolute;top:5px;right:6px}#customize-controls .customize-info .customize-help-toggle:focus,#customize-controls .customize-info .customize-help-toggle:hover,#customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}#customize-controls .customize-info .customize-panel-description,#customize-controls .customize-info .customize-section-description,#customize-controls .no-widget-areas-rendered-notice,#customize-outer-theme-controls .customize-info .customize-section-description{color:#555d66;display:none;background:#fff;padding:12px 15px;border-top:1px solid #ddd}#customize-controls .customize-info .customize-panel-description.open+.no-widget-areas-rendered-notice{border-top:none}.no-widget-areas-rendered-notice{font-style:italic}.no-widget-areas-rendered-notice p:first-child{margin-top:0}.no-widget-areas-rendered-notice p:last-child{margin-bottom:0}#customize-controls .customize-info .customize-section-description{margin-bottom:15px}#customize-controls .customize-info .customize-panel-description p:first-child,#customize-controls .customize-info .customize-section-description p:first-child{margin-top:0}#customize-controls .customize-info .customize-panel-description p:last-child,#customize-controls .customize-info .customize-section-description p:last-child{margin-bottom:0}#customize-controls .current-panel .control-section>h3.accordion-section-title{padding-left:30px}#customize-outer-theme-controls .control-section,#customize-theme-controls .control-section{border:none}#customize-outer-theme-controls .accordion-section-title,#customize-theme-controls .accordion-section-title{color:#555d66;background-color:#fff;border-bottom:1px solid #ddd;border-right:4px solid #fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}#customize-controls #customize-theme-controls .customize-themes-panel .accordion-section-title{color:#555;background-color:#fff;border-right:4px solid #fff}#customize-outer-theme-controls .accordion-section-title:after,#customize-theme-controls .accordion-section-title:after{content:"\f341";color:#a0a5aa}#customize-outer-theme-controls .accordion-section-content,#customize-theme-controls .accordion-section-content{color:#555d66;background:0 0}#customize-controls .control-section .accordion-section-title:focus,#customize-controls .control-section .accordion-section-title:hover,#customize-controls .control-section.open .accordion-section-title,#customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;background:#f3f3f5;border-right-color:#0073aa}#accordion-section-themes+.control-section{border-top:1px solid #ddd}.js .control-section .accordion-section-title:focus,.js .control-section .accordion-section-title:hover,.js .control-section.open .accordion-section-title,.js .control-section:hover .accordion-section-title{background:#f3f3f5}#customize-outer-theme-controls .control-section .accordion-section-title:focus:after,#customize-outer-theme-controls .control-section .accordion-section-title:hover:after,#customize-outer-theme-controls .control-section.open .accordion-section-title:after,#customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,#customize-theme-controls .control-section .accordion-section-title:focus:after,#customize-theme-controls .control-section .accordion-section-title:hover:after,#customize-theme-controls .control-section.open .accordion-section-title:after,#customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}#customize-theme-controls .control-section.open{border-bottom:1px solid #eee}#customize-outer-theme-controls .control-section.open .accordion-section-title,#customize-theme-controls .control-section.open .accordion-section-title{border-bottom-color:#eee!important}#customize-theme-controls .control-section:last-of-type.open,#customize-theme-controls .control-section:last-of-type>.accordion-section-title{border-bottom-color:#ddd}#customize-theme-controls .control-panel-content:not(.control-panel-nav_menus) .control-section:nth-child(2),#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu,#customize-theme-controls .control-section-nav_menu_locations .accordion-section-title{border-top:1px solid #ddd}#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu+.control-section-nav_menu{border-top:none}#customize-theme-controls>ul{margin:0}#customize-theme-controls .accordion-section-content{position:absolute;top:0;right:100%;width:100%;margin:0;padding:12px;box-sizing:border-box}#customize-info,#customize-theme-controls .customize-pane-child,#customize-theme-controls .customize-pane-parent{overflow:visible;width:100%;margin:0;padding:0;box-sizing:border-box;transition:.18s transform cubic-bezier(.645,.045,.355,1)}#customize-theme-controls .customize-pane-child.skip-transition{transition:none}#customize-info,#customize-theme-controls .customize-pane-parent{position:relative;visibility:visible;height:auto;max-height:none;overflow:auto;transform:none}#customize-theme-controls .customize-pane-child{position:absolute;top:0;right:0;visibility:hidden;height:0;max-height:none;overflow:hidden;transform:translateX(-100%)}#customize-theme-controls .customize-pane-child.current-panel,#customize-theme-controls .customize-pane-child.open{transform:none}.in-sub-panel #customize-info,.in-sub-panel #customize-theme-controls .customize-pane-parent,.in-sub-panel.section-open #customize-theme-controls .customize-pane-child.current-panel,.section-open #customize-info,.section-open #customize-theme-controls .customize-pane-parent{visibility:hidden;height:0;overflow:hidden;transform:translateX(100%)}#customize-theme-controls .customize-pane-child.busy,#customize-theme-controls .customize-pane-child.current-panel,#customize-theme-controls .customize-pane-child.open,.busy.section-open.in-sub-panel #customize-theme-controls .customize-pane-child.current-panel,.in-sub-panel #customize-info.busy,.in-sub-panel #customize-theme-controls .customize-pane-parent.busy,.section-open #customize-info.busy,.section-open #customize-theme-controls .customize-pane-parent.busy{visibility:visible;height:auto;overflow:auto}#customize-theme-controls .customize-pane-child.accordion-section-content,#customize-theme-controls .customize-pane-child.accordion-sub-container{display:block;overflow-x:hidden}#customize-theme-controls .customize-pane-child.accordion-section-content{padding:12px}#customize-theme-controls .customize-pane-child.menu li{position:static}.control-section-nav_menu .customize-section-description-container,.control-section-new_menu .customize-section-description-container,.customize-section-description-container{margin-bottom:15px}.control-section-nav_menu .customize-control,.control-section-new_menu .customize-control{margin-bottom:0}.customize-section-title{margin:-12px -12px 0 -12px;border-bottom:1px solid #ddd;background:#fff}div.customize-section-description{margin-top:22px}.customize-info div.customize-section-description{margin-top:0}div.customize-section-description p:first-child{margin-top:0}div.customize-section-description p:last-child{margin-bottom:0}#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child{border-bottom:1px solid #ddd;padding:12px 12px 12px 12px}.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child{padding:12px 12px 13px 12px}.customize-section-title h3,h3.customize-section-title{padding:10px 14px 12px 10px;margin:0;line-height:21px;color:#555d66}.accordion-sub-container.control-panel-content{display:none;position:absolute;top:0;width:100%}.accordion-sub-container.control-panel-content.busy{display:block}.current-panel .accordion-sub-container.control-panel-content{width:100%}.customize-controls-close{display:block;position:absolute;top:0;right:0;width:45px;height:41px;padding:0 0 0 2px;background:#eee;border:none;border-top:4px solid #eee;border-left:1px solid #ddd;color:#444;text-align:right;cursor:pointer;transition:color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out;box-sizing:content-box}.customize-panel-back,.customize-section-back{display:block;float:right;width:48px;height:71px;padding:0 0 0 24px;margin:0;background:#fff;border:none;border-left:1px solid #ddd;border-right:4px solid #fff;box-shadow:none;cursor:pointer;transition:color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out}.customize-section-back{height:74px}.ios .customize-panel-back{display:none}.ios .expanded.in-sub-panel .customize-panel-back{display:block}#customize-controls .panel-meta.customize-info .accordion-section-title{margin-right:48px;border-right:none}#customize-controls .cannot-expand:hover .accordion-section-title,#customize-controls .panel-meta.customize-info .accordion-section-title:hover{background:#fff;color:#555d66;border-right-color:#fff}.customize-controls-close:focus,.customize-controls-close:hover,.customize-controls-preview-toggle:focus,.customize-controls-preview-toggle:hover{background:#fff;color:#0073aa;border-top-color:#0073aa;outline:0;box-shadow:none}.customize-panel-back:focus,.customize-panel-back:hover,.customize-section-back:focus,.customize-section-back:hover{color:#0073aa;background:#f3f3f5;border-right-color:#0073aa;outline:0;box-shadow:none}.customize-controls-close:before{font:normal 22px/45px dashicons;content:"\f335";position:relative;top:-3px;right:13px}.customize-panel-back:before,.customize-section-back:before{font:normal 20px/72px dashicons;content:"\f345";position:relative;right:9px}.wp-full-overlay-sidebar .wp-full-overlay-header{background-color:#eee;transition:padding ease-in-out .18s}.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header{padding-right:62px}p.customize-section-description{font-style:normal;margin-top:22px;margin-bottom:0}.customize-section-description ul{margin-right:1em}.customize-section-description ul>li{list-style:disc}.section-description-buttons{text-align:left}.section-description-buttons button.button-link{color:#0073aa;text-decoration:underline}.customize-control{width:100%;float:right;clear:both;margin-bottom:12px}.customize-control input[type=email],.customize-control input[type=number],.customize-control input[type=password],.customize-control input[type=search],.customize-control input[type=tel],.customize-control input[type=text],.customize-control input[type=url]{width:100%;margin:0}.customize-control-hidden{margin:0}.customize-control-textarea textarea{width:100%;resize:vertical}.customize-control select{width:100%}.customize-control select[multiple]{height:auto}.customize-control-title{display:block;font-size:14px;line-height:1.75;font-weight:600;margin-bottom:4px}.customize-control-description{display:block;font-style:italic;line-height:1.4;margin-top:0;margin-bottom:5px}.customize-section-description a.external-link:after{font:16px/11px dashicons;content:"\f310";top:3px;position:relative;padding-right:3px;display:inline-block;text-decoration:none}.customize-control-color .color-picker,.customize-control-upload div{line-height:28px}.customize-control .customize-inside-control-row{line-height:1.6;display:block;margin-right:24px;padding-top:6px;padding-bottom:6px}.customize-control-checkbox input,.customize-control-nav_menu_auto_add input,.customize-control-radio input{margin-left:4px;margin-right:-24px}.customize-control-radio{padding:5px 0 10px}.customize-control-radio .customize-control-title{margin-bottom:0;line-height:1.6}.customize-control-radio .customize-control-title+.customize-control-description{margin-top:7px}.customize-control-checkbox label,.customize-control-radio label{vertical-align:top}.customize-control .attachment-thumb.type-icon{float:right;margin:10px;width:auto}.customize-control .attachment-title{font-weight:600;margin:0;padding:5px 10px}.customize-control .attachment-meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0;padding:0 10px}.customize-control .attachment-meta-title{padding-top:7px}.customize-control .thumbnail-image,.customize-control .wp-media-wrapper.wp-video,.customize-control-header .current{line-height:0}.customize-control-site_icon .favicon-preview .browser-preview{vertical-align:top}.customize-control .thumbnail-image img{cursor:pointer}#customize-controls .thumbnail-audio .thumbnail{max-width:64px;max-height:64px;margin:10px;float:right}#available-menu-items .accordion-section-content .new-content-item,.customize-control-dropdown-pages .new-content-item{width:calc(100% - 30px);padding:8px 15px;position:absolute;bottom:0;z-index:10;background:#eee;display:flex}.customize-control-dropdown-pages .new-content-item{width:100%;padding:5px 1px 5px 0;position:relative}#available-menu-items .new-content-item .create-item-input,.customize-control-dropdown-pages .new-content-item .create-item-input{flex-grow:10}#available-menu-items .new-content-item .add-content,.customize-control-dropdown-pages .new-content-item .add-content{margin:2px 6px 2px 0;flex-grow:1}.customize-control-dropdown-pages .new-content-item .create-item-input.invalid{border:1px solid #dc3232}.customize-control-dropdown-pages .add-new-toggle{margin-right:1px;font-weight:600;line-height:2.2}#customize-preview iframe{width:100%;height:100%;position:absolute}#customize-preview iframe+iframe{visibility:hidden}.wp-full-overlay-sidebar{background:#eee;border-left:1px solid #ddd}#customize-controls .customize-control-notifications-container{margin:4px 0 8px 0;padding:0;cursor:default}#customize-controls .customize-control-widget_form.has-error .widget .widget-top,.customize-control-nav_menu_item.has-error .menu-item-bar .menu-item-handle{box-shadow:inset 0 0 0 2px #dc3232;transition:.15s box-shadow linear}#customize-controls .customize-control-notifications-container li.notice{list-style:none;margin:0 0 6px 0;padding:9px 14px;overflow:hidden}#customize-controls .customize-control-notifications-container .notice.is-dismissible{padding-left:38px}.customize-control-notifications-container li.notice:last-child{margin-bottom:0}#customize-controls .customize-control-nav_menu_item .customize-control-notifications-container{margin-top:0}#customize-controls .customize-control-widget_form .customize-control-notifications-container{margin-top:8px}.customize-control-text.has-error input{outline:2px solid #dc3232}#customize-controls #customize-notifications-area{position:absolute;top:46px;width:100%;border-bottom:1px solid #ddd;display:block;padding:0;margin:0}.wp-full-overlay.collapsed #customize-controls #customize-notifications-area{display:none!important}#customize-controls #customize-notifications-area:not(.has-overlay-notifications),#customize-controls .customize-section-title>.customize-control-notifications-container:not(.has-overlay-notifications),#customize-controls .panel-meta>.customize-control-notifications-container:not(.has-overlay-notifications){max-height:210px;overflow-x:hidden;overflow-y:auto}#customize-controls #customize-notifications-area .notice,#customize-controls #customize-notifications-area>ul,#customize-controls .customize-section-title>.customize-control-notifications-container,#customize-controls .customize-section-title>.customize-control-notifications-container .notice,#customize-controls .panel-meta>.customize-control-notifications-container,#customize-controls .panel-meta>.customize-control-notifications-container .notice{margin:0}#customize-controls .customize-section-title>.customize-control-notifications-container,#customize-controls .panel-meta>.customize-control-notifications-container{border-top:1px solid #ddd}#customize-controls #customize-notifications-area .notice,#customize-controls .customize-section-title>.customize-control-notifications-container .notice,#customize-controls .panel-meta>.customize-control-notifications-container .notice{padding:9px 14px}#customize-controls #customize-notifications-area .notice.is-dismissible,#customize-controls .customize-section-title>.customize-control-notifications-container .notice.is-dismissible,#customize-controls .panel-meta>.customize-control-notifications-container .notice.is-dismissible{padding-left:38px}#customize-controls #customize-notifications-area .notice+.notice,#customize-controls .customize-section-title>.customize-control-notifications-container .notice+.notice,#customize-controls .panel-meta>.customize-control-notifications-container .notice+.notice{margin-top:1px}@keyframes customize-fade-in{0%{opacity:0}100%{opacity:1}}#customize-controls #customize-notifications-area .notice.notification-overlay,#customize-controls .notice.notification-overlay{margin:0;border-right:0}#customize-controls .customize-control-notifications-container.has-overlay-notifications{animation:customize-fade-in .5s;z-index:30}#customize-controls #customize-notifications-area .notice.notification-overlay .notification-message{clear:both;color:#191e23;font-size:18px;font-style:normal;margin:0;padding:2em 0;text-align:center;width:100%;display:block;top:50%;position:relative}#customize-control-show_on_front.has-error{margin-bottom:0}#customize-control-show_on_front.has-error .customize-control-notifications-container{margin-top:12px}.accordion-section .dropdown{float:right;display:block;position:relative;cursor:pointer}.accordion-section .dropdown-content{overflow:hidden;float:right;min-width:30px;height:16px;line-height:16px;margin-left:16px;padding:4px 5px;border:2px solid #eee;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.customize-control .dropdown-arrow{position:absolute;top:0;bottom:0;left:0;width:20px;background:#eee}.customize-control .dropdown-arrow:after{content:"\f140";font:normal 20px/1 dashicons;speak:none;display:block;padding:0;text-indent:0;text-align:center;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#32373c}.customize-control .dropdown-status{color:#32373c;background:#eee;display:none;max-width:112px}.customize-control-color .dropdown{margin-left:5px;margin-bottom:5px}.customize-control-color .dropdown .dropdown-content{background-color:#555d66;border:1px solid rgba(0,0,0,.15)}.customize-control-color .dropdown:hover .dropdown-content{border-color:rgba(0,0,0,.25)}.ios .wp-full-overlay{position:relative}.ios #customize-controls .wp-full-overlay-sidebar-content{-webkit-overflow-scrolling:touch}.customize-control .actions .button{margin-top:12px}.customize-control-header .actions,.customize-control-header .uploaded{margin-bottom:18px}.customize-control-header .default button:not(.random),.customize-control-header .uploaded button:not(.random){width:100%;padding:0;margin:0;background:0 0;border:none;color:inherit;cursor:pointer}.customize-control-header button img{display:block}.customize-control .attachment-media-view .default-button,.customize-control .attachment-media-view .remove-button,.customize-control .attachment-media-view .upload-button,.customize-control-header button.new,.customize-control-header button.remove{width:auto;height:auto;white-space:normal}.customize-control .attachment-media-view .thumbnail,.customize-control-header .current .container{overflow:hidden}.customize-control .attachment-media-view .button-add-media,.customize-control .attachment-media-view .placeholder,.customize-control-header .placeholder{width:100%;position:relative;text-align:center;cursor:default;border:1px dashed #b4b9be;box-sizing:border-box;padding:9px 0;line-height:1.6}.customize-control .attachment-media-view .button-add-media{cursor:pointer;background-color:#edeff0;color:#32373c}.customize-control .attachment-media-view .button-add-media:hover{background-color:#fbfbfc}.customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#007cba;border-style:solid;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.customize-control-header .inner{display:none;position:absolute;width:100%;color:#555d66;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.customize-control-header .inner,.customize-control-header .inner .dashicons{line-height:20px;top:8px}.customize-control-header .list .inner,.customize-control-header .list .inner .dashicons{top:9px}.customize-control-header .header-view{position:relative;width:100%;margin-bottom:12px}.customize-control-header .header-view:last-child{margin-bottom:0}.customize-control-header .header-view:after{border:0}.customize-control-header .header-view.selected .choice:focus{outline:0}.customize-control-header .header-view.selected:after{content:"";position:absolute;height:auto;top:0;right:0;bottom:0;left:0;border:4px solid #00a0d2;border-radius:2px}.customize-control-header .header-view.button.selected{border:0}.customize-control-header .uploaded .header-view .close{font-size:20px;color:#fff;background:#555d66;background:rgba(0,0,0,.5);position:absolute;top:10px;right:-999px;z-index:1;width:26px;height:26px;cursor:pointer}.customize-control-header .header-view .close:focus,.customize-control-header .header-view:hover .close{right:auto;left:10px}.customize-control-header .header-view .close:focus{outline:1px solid #5b9dd9}.customize-control-header .random.placeholder{cursor:pointer;border-radius:2px;height:40px}.customize-control-header button.random{width:100%;height:auto;min-height:40px;white-space:normal}.customize-control-header button.random .dice{margin-top:4px}.customize-control-header .header-view:hover>button.random .dice,.customize-control-header .placeholder:hover .dice{animation:dice-color-change 3s infinite}.button-see-me{animation:bounce .7s 1;transform-origin:center bottom}@keyframes bounce{20%,53%,80%,from,to{animation-timing-function:cubic-bezier(.215,.61,.355,1);transform:translate3d(0,0,0)}40%,43%{animation-timing-function:cubic-bezier(.755,.050,.855,.060);transform:translate3d(0,-12px,0)}70%{animation-timing-function:cubic-bezier(.755,.050,.855,.060);transform:translate3d(0,-6px,0)}90%{transform:translate3d(0,-1px,0)}}.customize-control-header .choice{position:relative;display:block;margin-bottom:9px}.customize-control-header .choice:focus{outline:0;box-shadow:0 0 0 1px #5b9dd9,0 0 3px 1px rgba(30,140,190,.8)}.customize-control-header .uploaded div:last-child>.choice{margin-bottom:0}.customize-control .attachment-media-view .thumbnail-image img,.customize-control-header img{max-width:100%}.customize-control .attachment-media-view .default-button,.customize-control .attachment-media-view .remove-button,.customize-control-header .remove{margin-left:8px}.customize-control-background_position .background-position-control .button-group{display:block}.customize-control-code_editor textarea{width:100%;font-family:Consolas,Monaco,monospace;font-size:12px;padding:6px 8px;-moz-tab-size:2;-o-tab-size:2;tab-size:2}.customize-control-code_editor .CodeMirror,.customize-control-code_editor textarea{height:14em}#customize-controls .customize-section-description-container.section-meta.customize-info{border-bottom:none}#sub-accordion-section-custom_css .customize-control-notifications-container{margin-bottom:15px}#customize-control-custom_css textarea{display:block;height:500px}.customize-section-description-container+#customize-control-custom_css .customize-control-title{margin-right:12px}.customize-section-description-container+#customize-control-custom_css:last-child textarea{border-left:0;border-right:0;height:calc(100vh - 185px);resize:none}.customize-section-description-container+#customize-control-custom_css:last-child{margin-right:-12px;width:299px;width:calc(100% + 24px);margin-bottom:-12px}.customize-section-description-container+#customize-control-custom_css:last-child .CodeMirror{height:calc(100vh - 185px)}.CodeMirror-hints,.CodeMirror-lint-tooltip{z-index:500000!important}.customize-section-description-container+#customize-control-custom_css:last-child .customize-control-notifications-container{margin-right:12px;margin-left:12px}.theme-browser .theme.active .theme-actions,.wp-customizer .theme-browser .theme .theme-actions{padding:9px 15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}@media screen and (max-width:640px){.customize-section-description-container+#customize-control-custom_css:last-child{margin-left:0}.customize-section-description-container+#customize-control-custom_css:last-child textarea{height:calc(100vh - 140px)}}#customize-theme-controls .control-panel-themes{border-bottom:none}#customize-theme-controls .control-panel-themes>.accordion-section-title,#customize-theme-controls .control-panel-themes>.accordion-section-title:hover{cursor:default;background:#fff;color:#555d66;border-top:1px solid #ddd;border-bottom:1px solid #ddd;border-right:none;border-left:none;margin:0 0 15px 0;padding-left:100px}#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child,#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child:hover{border-top:0}#customize-theme-controls .control-section-themes>.accordion-section-title,#customize-theme-controls .control-section-themes>.accordion-section-title:hover{margin:0 0 15px}#customize-controls .customize-themes-panel .accordion-section-title,#customize-controls .customize-themes-panel .accordion-section-title:hover{margin:15px -8px}#customize-controls .control-section-themes .accordion-section-title,#customize-controls .customize-themes-panel .accordion-section-title{padding-left:100px}#customize-controls .control-section-themes .accordion-section-title span.customize-action,#customize-controls .customize-section-title span.customize-action,.control-panel-themes .accordion-section-title span.customize-action{font-size:13px;display:block;font-weight:400}#customize-theme-controls .control-panel-themes .accordion-section-title .change-theme{position:absolute;left:10px;top:50%;margin-top:-14px;font-weight:400}#customize-theme-controls .control-panel-themes>.accordion-section-title:after{display:none}.control-panel-themes .customize-themes-full-container{position:fixed;top:0;right:0;transition:.18s right ease-in-out;margin:0 300px 0 0;padding:71px 0 25px;overflow-y:scroll;width:calc(100% - 300px);height:calc(100% - 96px);background:#eee;z-index:20}@media screen and (min-width:1670px){.control-panel-themes .customize-themes-full-container{width:82%;left:0;right:initial}}.modal-open .control-panel-themes .customize-themes-full-container{overflow-y:visible}#customize-header-actions .customize-controls-preview-toggle,#customize-header-actions .spinner,#customize-save-button-wrapper{transition:.18s margin ease-in-out}#customize-footer-actions,#customize-footer-actions .collapse-sidebar{bottom:0;transition:.18s bottom ease-in-out}.in-themes-panel:not(.animating) #customize-footer-actions,.in-themes-panel:not(.animating) #customize-header-actions .customize-controls-preview-toggle,.in-themes-panel:not(.animating) #customize-header-actions .spinner,.in-themes-panel:not(.animating) #customize-preview{visibility:hidden}.wp-full-overlay.in-themes-panel{background:#eee}.in-themes-panel #customize-header-actions .customize-controls-preview-toggle,.in-themes-panel #customize-header-actions .spinner,.in-themes-panel #customize-save-button-wrapper{margin-top:-46px}.in-themes-panel #customize-footer-actions,.in-themes-panel #customize-footer-actions .collapse-sidebar{bottom:-45px}.in-themes-panel.animating .control-panel-themes .filter-themes-count{display:none}.in-themes-panel.wp-full-overlay .wp-full-overlay-sidebar-content{bottom:0}.themes-filter-bar .feature-filter-toggle{float:left;margin:3px 25px 3px 0}.themes-filter-bar .feature-filter-toggle:before{content:"\f111";margin:0 0 0 5px;font:normal 16px/1 dashicons;vertical-align:text-bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.themes-filter-bar .feature-filter-toggle.open{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.themes-filter-bar .feature-filter-toggle .filter-count-filters{display:none}.filter-drawer{box-sizing:border-box;width:100%;position:absolute;top:46px;right:0;padding:25px 25px 25px 0;border-top:0;margin:0;background:#eee;border-bottom:1px solid #ddd}.filter-drawer .filter-group{margin:0 0 0 25px;width:calc((100% - 75px)/ 3);min-width:200px;max-width:320px}@keyframes themes-fade-in{0%{opacity:0}50%{opacity:0}100%{opacity:1}}.control-panel-themes .customize-themes-full-container.animate{animation:.6s themes-fade-in 1}.in-themes-panel:not(.animating) .control-panel-themes .filter-themes-count{animation:.6s themes-fade-in 1}.control-panel-themes .filter-themes-count{position:relative;float:left;line-height:2.6}.control-panel-themes .filter-themes-count .themes-displayed{font-weight:600;color:#555d66}.customize-themes-notifications{margin:0}.control-panel-themes .customize-themes-notifications .notice{margin:0 0 25px 0}.customize-themes-full-container .customize-themes-section{display:none!important;overflow:hidden}.customize-themes-full-container .customize-themes-section.current-section{display:list-item!important}.control-section .customize-section-text-before{padding:0 15px 8px 0;margin:15px 0 0 0;line-height:16px;border-bottom:1px solid #ddd;color:#555d66}.control-panel-themes .customize-themes-section-title{width:100%;background:#fff;box-shadow:none;outline:0;border-top:none;border-bottom:1px solid #ddd;border-right:4px solid #fff;border-left:none;cursor:pointer;padding:10px 15px;position:relative;text-align:right;font-size:14px;font-weight:600;color:#555d66;text-shadow:none}.control-panel-themes #accordion-section-installed_themes{border-top:1px solid #ddd}.control-panel-themes .theme-section{margin:0;position:relative}.control-panel-themes .customize-themes-section-title:focus,.control-panel-themes .customize-themes-section-title:hover{border-right-color:#0073aa;color:#0073aa;background:#f5f5f5}.customize-themes-section-title:not(.selected):after{content:"";display:block;position:absolute;top:9px;left:15px;width:18px;height:18px;border-radius:100%;border:1px solid #ccc;background:#fff}.control-panel-themes .theme-section .customize-themes-section-title.selected:after{content:"\f147";font:16px/1 dashicons;box-sizing:border-box;width:20px;height:20px;padding:3px 1px 1px 3px;border-radius:100%;position:absolute;top:9px;left:15px;background:#0073aa;color:#fff}.control-panel-themes .customize-themes-section-title.selected{color:#0073aa}#customize-theme-controls .themes.accordion-section-content{position:relative;right:0;padding:0;width:100%}.loading .customize-themes-section .spinner{display:block;visibility:visible;position:relative;clear:both;width:20px;height:20px;right:calc(50% - 10px);float:none;margin-top:50px}.customize-themes-section .no-themes,.customize-themes-section .no-themes-local{display:none}.themes-section-installed_themes .theme .notice-success:not(.updated-message){display:none}.customize-control-theme .theme{width:100%;margin:0;border:1px solid #ddd;background:#fff}.customize-control-theme .theme .theme-actions,.customize-control-theme .theme .theme-name{background:#fff;border:none}.customize-control.customize-control-theme{box-sizing:border-box;width:25%;max-width:600px;margin:0 0 25px 25px;padding:0;clear:none}@media screen and (min-width:2101px){.customize-control.customize-control-theme{width:calc((100% - 125px)/ 5 - 1px)}}@media screen and (min-width:1601px) and (max-width:2100px){.customize-control.customize-control-theme{width:calc((100% - 100px)/ 4 - 1px)}}@media screen and (min-width:1201px) and (max-width:1600px){.customize-control.customize-control-theme{width:calc((100% - 75px)/ 3 - 1px)}}@media screen and (min-width:851px) and (max-width:1200px){.customize-control.customize-control-theme{width:calc((100% - 50px)/ 2 - 1px)}}@media screen and (max-width:850px){.customize-control.customize-control-theme{width:100%}}.wp-customizer .theme-browser .themes{padding:0 25px 25px 0;transition:.18s margin-top linear}.wp-customizer .theme-browser .theme .theme-actions{opacity:1}#customize-controls h3.theme-name{font-size:15px}#customize-controls .theme-overlay .theme-name{font-size:32px}.customize-preview-header.themes-filter-bar{position:fixed;top:0;right:300px;width:calc(100% - 300px);height:46px;background:#eee;z-index:10;padding:6px 25px;box-sizing:border-box;border-bottom:1px solid #ddd}@media screen and (min-width:1670px){.customize-preview-header.themes-filter-bar{width:82%;left:0;right:initial}}.themes-filter-bar .themes-filter-container{margin:0;padding:0}.themes-filter-bar .wp-filter-search{line-height:1.8;padding:6px 30px 6px 10px;max-width:100%;width:40%;min-width:300px;position:absolute;top:6px;right:25px;height:32px;margin:1px 0}@media screen and (max-height:540px),screen and (max-width:1018px){.customize-preview-header.themes-filter-bar{position:relative;right:0;width:100%;margin:0 0 25px 0}.filter-drawer{top:46px}.wp-customizer .theme-browser .themes{padding:0 25px 25px 0;overflow:hidden}.control-panel-themes .customize-themes-full-container{margin-top:0;padding:0;height:100%;width:calc(100% - 300px)}}@media screen and (max-width:1018px){.filter-drawer .filter-group{width:calc((100% - 50px)/ 2)}}@media screen and (max-width:900px){.customize-preview-header.themes-filter-bar{height:86px;padding-top:46px}.themes-filter-bar .wp-filter-search{width:calc(100% - 50px);margin:0;min-width:200px}.filter-drawer{top:86px}.control-panel-themes .filter-themes-count{float:right}}@media screen and (max-width:792px){.filter-drawer .filter-group{width:calc(100% - 25px)}}.control-panel-themes .customize-themes-mobile-back{display:none}@media screen and (max-width:600px){.filter-drawer{top:132px}.wp-full-overlay.showing-themes .control-panel-themes .filter-themes-count .filter-themes{display:block;float:left}.control-panel-themes .customize-themes-full-container{width:100%;margin:0;padding-top:46px;height:calc(100% - 46px);z-index:1;display:none}.showing-themes .control-panel-themes .customize-themes-full-container{display:block}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back{display:block;position:fixed;top:0;right:0;background:#eee;color:#444;border-radius:0;box-shadow:none;border:none;height:46px;width:100%;z-index:10;text-align:right;text-shadow:none;border-bottom:1px solid #ddd;border-right:4px solid transparent;margin:0;padding:0;font-size:0;overflow:hidden}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:before{right:0;top:0;height:46px;width:26px;display:block;line-height:2.3;padding:0 8px 0 8px;border-left:1px solid #ddd}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:focus,.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:hover{color:#0073aa;background:#f3f3f5;border-right-color:#0073aa;outline:0;box-shadow:none}.showing-themes #customize-header-actions{display:none}#customize-controls{width:100%}}.wp-customizer .theme-overlay{display:none}.wp-customizer.modal-open .theme-overlay{position:fixed;right:0;top:0;left:0;bottom:0;z-index:109}.wp-customizer.modal-open #customize-header-actions,.wp-customizer.modal-open .control-panel-themes .customize-themes-section-title.selected:after,.wp-customizer.modal-open .control-panel-themes .filter-themes-count{z-index:-1}.wp-full-overlay.in-themes-panel.themes-panel-expanded #customize-controls .wp-full-overlay-sidebar-content{overflow:visible}.wp-customizer .theme-overlay .theme-backdrop{background:rgba(238,238,238,.75);position:fixed;z-index:110}.wp-customizer .theme-overlay .star-rating{float:right;margin-left:8px}.wp-customizer .theme-rating .num-ratings{line-height:20px}.wp-customizer .theme-overlay .theme-wrap{right:90px;left:90px;top:45px;bottom:45px;z-index:120}.wp-customizer .theme-overlay .theme-actions{text-align:left;padding:10px 25px;background:#eee;border-top:1px solid #ddd}.wp-customizer .theme-overlay .theme-actions .theme-install.preview{margin-right:8px}.control-panel-themes .theme-actions .delete-theme{right:15px;left:auto;bottom:auto;position:absolute}.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content{overflow:visible}.wp-customizer .theme-header{background:#eee}.wp-customizer .theme-overlay .theme-header .close:before,.wp-customizer .theme-overlay .theme-header button{color:#444}.wp-customizer .theme-overlay .theme-header .close:focus,.wp-customizer .theme-overlay .theme-header .close:hover,.wp-customizer .theme-overlay .theme-header .left:focus,.wp-customizer .theme-overlay .theme-header .left:hover,.wp-customizer .theme-overlay .theme-header .right:focus,.wp-customizer .theme-overlay .theme-header .right:hover{background:#fff;border-bottom:4px solid #0073aa;color:#0073aa}.wp-customizer .theme-overlay .theme-header .close:focus:before,.wp-customizer .theme-overlay .theme-header .close:hover:before{color:#0073aa}.wp-customizer .theme-overlay .theme-header button.disabled,.wp-customizer .theme-overlay .theme-header button.disabled:focus,.wp-customizer .theme-overlay .theme-header button.disabled:hover{border-bottom:none;background:0 0;color:#ccc}@media (max-width:850px),(max-height:472px){.wp-customizer .theme-overlay .theme-wrap{right:0;left:0;top:0;bottom:0}.wp-customizer .theme-browser .themes{padding-left:25px}}body.cheatin{font-size:medium;height:auto;background:#fff;margin:50px auto 2em;padding:1em 2em;max-width:700px;min-width:0;box-shadow:0 1px 3px rgba(0,0,0,.13)}body.cheatin h1{border-bottom:1px solid #ddd;clear:both;color:#555d66;font-size:24px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:30px 0 0 0;padding:0;padding-bottom:7px}body.cheatin p{font-size:14px;line-height:1.5;margin:25px 0 20px}#customize-theme-controls .add-new-menu-item,#customize-theme-controls .add-new-widget{cursor:pointer;float:left;margin:0;margin-right:10px;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0}.reordering .add-new-menu-item,.reordering .add-new-widget{opacity:.2;pointer-events:none;cursor:not-allowed}#available-menu-items .new-content-item .add-content:before,.add-new-menu-item:before,.add-new-widget:before{content:"\f132";display:inline-block;position:relative;right:-2px;top:0;font:normal 20px/1 dashicons;vertical-align:middle;transition:all .2s;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reorder-toggle{float:left;padding:5px 8px;text-decoration:none;cursor:pointer;outline:0}.reorder,.reordering .reorder-done{display:block;padding:5px 8px}.reorder-done,.reordering .reorder{display:none}.menu-item-reorder-nav button,.widget-reorder-nav span{position:relative;overflow:hidden;float:right;display:block;width:33px;height:43px;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}.menu-item-reorder-nav button{width:30px;height:40px;background:0 0;border:none;box-shadow:none}.menu-item-reorder-nav button:before,.widget-reorder-nav span:before{display:inline-block;position:absolute;top:0;left:0;width:100%;height:100%;font:normal 20px/43px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.menu-item-reorder-nav button:focus,.menu-item-reorder-nav button:hover,.widget-reorder-nav span:focus,.widget-reorder-nav span:hover{color:#191e23;background:#eee}.menus-move-down:before,.move-widget-down:before{content:"\f347"}.menus-move-up:before,.move-widget-up:before{content:"\f343"}#customize-theme-controls .first-widget .move-widget-up,#customize-theme-controls .last-widget .move-widget-down,.move-down-disabled .menus-move-down,.move-left-disabled .menus-move-left,.move-right-disabled .menus-move-right,.move-up-disabled .menus-move-up{color:#d5d5d5;background-color:#fff;cursor:default;pointer-events:none}.wp-full-overlay-main{left:auto;width:100%}.add-menu-toggle.open,.add-menu-toggle.open:hover,.adding-menu-items .add-new-menu-item,.adding-menu-items .add-new-menu-item:hover,body.adding-widget .add-new-widget,body.adding-widget .add-new-widget:hover{background:#eee;border-color:#929793;color:#32373c;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}#accordion-section-add_menu .add-new-menu-item.open:before,.adding-menu-items .add-new-menu-item:before,body.adding-widget .add-new-widget:before{transform:rotate(-45deg)}#available-menu-items,#available-widgets{position:absolute;top:0;bottom:0;right:-301px;visibility:hidden;overflow-x:hidden;overflow-y:auto;width:300px;margin:0;z-index:4;background:#eee;transition:right .18s;border-left:1px solid #ddd}#available-menu-items .customize-section-title,#available-widgets .customize-section-title{display:none}#available-widgets-list{top:60px;position:absolute;overflow:auto;bottom:0;width:100%;border-top:1px solid #ddd}.no-widgets-found #available-widgets-list{border-top:none}#available-widgets-filter{position:fixed;top:0;z-index:1;width:300px;background:#eee}#available-menu-items-search .accordion-section-title,#available-widgets-filter{padding:13px 15px;box-sizing:border-box}#available-menu-items-search input,#available-widgets-filter input{width:100%;min-height:32px;margin:1px 0;padding:0 30px}#available-menu-items-search input::-ms-clear,#available-widgets-filter input::-ms-clear{display:none}#available-menu-items-search .search-icon,#available-widgets-filter .search-icon{display:block;position:absolute;top:15px;right:16px;width:30px;height:30px;line-height:2.1;text-align:center;color:#72777c}#available-menu-items-search .clear-results,#available-widgets-filter .clear-results{position:absolute;top:15px;left:16px;width:30px;height:30px;padding:0;border:0;cursor:pointer;background:0 0;color:#a00;text-decoration:none;outline:0}#available-menu-items-search .clear-results,#available-menu-items-search.loading .clear-results.is-visible,#available-widgets-filter .clear-results{display:none}#available-menu-items-search .clear-results.is-visible,#available-widgets-filter .clear-results.is-visible{display:block}#available-menu-items-search .clear-results:before,#available-widgets-filter .clear-results:before{content:"\f335";font:normal 20px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#available-menu-items-search .clear-results:focus,#available-menu-items-search .clear-results:hover,#available-widgets-filter .clear-results:focus,#available-widgets-filter .clear-results:hover{color:#dc3232}#available-menu-items-search .clear-results:focus,#available-widgets-filter .clear-results:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}#available-menu-items-search .search-icon:after,#available-widgets-filter .search-icon:after,.themes-filter-bar .search-icon:after{content:"\f179";font:normal 20px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.themes-filter-bar .search-icon{position:absolute;top:7px;right:26px;z-index:1;color:#72777c;height:30px;width:30px;line-height:2;text-align:center}.no-widgets-found-message{display:none;margin:0;padding:0 15px;line-height:inherit}.no-widgets-found .no-widgets-found-message{display:block}#available-menu-items .item-top,#available-menu-items .item-top:hover,#available-widgets .widget-top,#available-widgets .widget-top:hover{border:none;background:0 0;box-shadow:none}#available-menu-items .item-tpl,#available-widgets .widget-tpl{position:relative;padding:15px 60px 15px 15px;background:#fff;border-bottom:1px solid #ddd;border-right:4px solid #fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out;cursor:pointer;display:none}#available-menu-items .item,#available-widgets .widget{position:static}.customize-controls-preview-toggle{display:none}@media only screen and (max-width:782px){.wp-customizer .theme:not(.active):focus .theme-actions,.wp-customizer .theme:not(.active):hover .theme-actions{display:block}.wp-customizer .theme-browser .theme.active .theme-name span{display:inline}.customize-control-header button.random .dice{margin-top:0}.customize-control-checkbox .customize-inside-control-row,.customize-control-nav_menu_auto_add .customize-inside-control-row,.customize-control-radio .customize-inside-control-row{margin-right:32px}.customize-control-checkbox input,.customize-control-nav_menu_auto_add input,.customize-control-radio input{margin-right:-32px}.customize-control input[type=checkbox]+label+br,.customize-control input[type=radio]+label+br{line-height:2.5}.customize-control .date-time-fields select{height:39px}.date-time-fields .date-input.month{width:79px}.date-time-fields .date-input.day,.date-time-fields .date-input.hour,.date-time-fields .date-input.minute{width:55px}.date-time-fields .date-input.year{width:80px}#customize-control-changeset_preview_link a{bottom:16px}.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button{bottom:10px}.media-widget-control .media-widget-buttons .button.change-media,.media-widget-control .media-widget-buttons .button.edit-media,.media-widget-control .media-widget-buttons .button.select-media{margin-top:12px}.wp-core-ui .themes-filter-bar .feature-filter-toggle{margin:3px 25px 3px 0}}@media screen and (max-width:1200px){.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main{right:67%}}@media screen and (max-width:640px){.wp-full-overlay.collapsed #customize-controls{margin-right:0}.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content{bottom:0}.customize-controls-preview-toggle{display:block;position:absolute;top:0;right:48px;line-height:3.2;font-size:14px;padding:0 12px;margin:0;height:45px;background:#eee;border:0;border-left:1px solid #ddd;color:#555d66;cursor:pointer;transition:color .1s ease-in-out,background .1s ease-in-out}#customize-footer-actions,.customize-controls-preview-toggle .controls,.preview-only .customize-controls-preview-toggle .preview,.preview-only .wp-full-overlay-sidebar-content{display:none}.preview-only #customize-save-button-wrapper{margin-top:-46px}.customize-controls-preview-toggle .controls:before,.customize-controls-preview-toggle .preview:before{font:normal 20px/1 dashicons;content:"\f177";position:relative;top:4px;margin-left:6px}.customize-controls-preview-toggle .controls:before{content:"\f540"}.preview-only #customize-controls{height:45px}.preview-only #customize-preview,.preview-only .customize-controls-preview-toggle .controls{display:block}.wp-core-ui.wp-customizer .button{min-height:30px;padding:0 14px;line-height:2;font-size:14px;vertical-align:middle}#customize-control-changeset_status .customize-inside-control-row{padding-top:15px}body.adding-menu-items div#available-menu-items,body.adding-widget div#available-widgets,body.outer-section-open div#customize-sidebar-outer-content{width:100%}#available-menu-items .customize-section-title,#available-widgets .customize-section-title{display:block;margin:0}#available-menu-items .customize-section-back,#available-widgets .customize-section-back{height:69px}#available-menu-items .customize-section-title h3,#available-widgets .customize-section-title h3{font-size:20px;font-weight:200;padding:9px 14px 12px 10px;margin:0;line-height:24px;color:#555d66;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#available-menu-items .customize-section-title .customize-action,#available-widgets .customize-section-title .customize-action{font-size:13px;display:block;font-weight:400;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#available-widgets-filter{position:relative;width:100%;height:auto}#available-widgets-list{top:130px}#available-menu-items-search .clear-results,#available-menu-items-search .search-icon{top:85px}.reorder,.reordering .reorder-done{padding:8px}.wp-core-ui .themes-filter-bar .feature-filter-toggle{margin:0}}@media screen and (max-width:600px){.wp-full-overlay.expanded{margin-right:0}body.adding-menu-items div#available-menu-items,body.adding-widget div#available-widgets,body.outer-section-open div#customize-sidebar-outer-content{top:46px;z-index:10}body.wp-customizer .wp-full-overlay.expanded #customize-sidebar-outer-content{right:-100%}body.wp-customizer.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{right:0}} \ No newline at end of file diff --git a/wp-admin/css/customize-controls.css b/wp-admin/css/customize-controls.css new file mode 100644 index 0000000..9933373 --- /dev/null +++ b/wp-admin/css/customize-controls.css @@ -0,0 +1,2961 @@ +body { + overflow: hidden; + -webkit-text-size-adjust: 100%; +} + +.customize-controls-close, +.widget-control-actions a { + text-decoration: none; +} + +#customize-controls h3 { + font-size: 14px; +} + +#customize-controls img { + max-width: 100%; +} + +#customize-controls .submit { + text-align: center; +} + +#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked { + background-color: rgba(0, 0, 0, 0.7); + padding: 25px; +} + +#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .customize-changeset-locked-message { + margin-left: auto; + margin-right: auto; + max-width: 366px; + min-height: 64px; + width: auto; + padding: 25px 25px 25px 109px; + position: relative; + background: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + line-height: 1.5; + overflow-y: auto; + text-align: left; + top: calc( 50% - 100px ); +} + +#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .currently-editing { + margin-top: 0; +} +#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .action-buttons { + margin-bottom: 0; +} + +.customize-changeset-locked-avatar { + width: 64px; + position: absolute; + left: 25px; + top: 25px; +} + +.wp-core-ui.wp-customizer .customize-changeset-locked-message a.button { + margin-right: 10px; + margin-top: 0; +} + +#customize-controls .description { + color: #555d66; +} + +#customize-save-button-wrapper { + float: right; + margin-top: 9px; +} + +body:not(.ready) #customize-save-button-wrapper .save { + visibility: hidden; +} +#customize-save-button-wrapper .save { + float: left; + border-radius: 3px; + box-shadow: none; /* @todo Adjust box shadow based on the disable states of paired button. */ + margin-top: 0; +} + +#customize-save-button-wrapper .save:focus, #publish-settings:focus { + box-shadow: 0 1px 0 #0073aa, 0 0 2px 1px #33b3db; /* This is default box shadow for focus */ +} + +#customize-save-button-wrapper .save.has-next-sibling { + border-radius: 3px 0 0 3px; +} + +#customize-sidebar-outer-content { + position: absolute; + top: 0; + bottom: 0; + left: 0; + visibility: hidden; + overflow-x: hidden; + overflow-y: auto; + width: 100%; + margin: 0; + z-index: -1; + background: #eee; + transition: left .18s; + border-right: 1px solid #ddd; + border-left: 1px solid #ddd; + height: 100%; +} + +#customize-theme-controls .control-section-outer { + display: none !important; +} + +#customize-outer-theme-controls .accordion-section-content { + padding: 12px; +} + +#customize-outer-theme-controls .accordion-section-content.open { + display: block; +} + +.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content { + visibility: visible; + left: 100%; + transition: left .18s; +} + +.customize-outer-pane-parent { + margin: 0; +} + +.outer-section-open .wp-full-overlay.expanded .wp-full-overlay-main { + left: 300px; + opacity: 0.4; +} + +.outer-section-open .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main, +.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main, +.adding-menu-items .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main, +.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main, +.adding-widget .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main, +.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main { + left: 64%; +} + +#customize-outer-theme-controls li.notice { + padding-top: 8px; + padding-bottom: 8px; + margin-left: 0; + margin-bottom: 10px; +} + +#publish-settings { + text-indent: 0; + border-radius: 0 3px 3px 0; + padding-left: 0; + padding-right: 0; + box-shadow: none; /* @todo Adjust box shadow based on the disable states of paired button. */ + font-size: 14px; + width: 30px; + float: left; + transform: none; + margin-top: 0; + line-height: 2; +} + +body:not(.ready) #publish-settings, +body.trashing #customize-save-button-wrapper .save, +body.trashing #publish-settings { + display: none; +} + +#customize-header-actions .spinner { + margin-top: 13px; + margin-right: 4px; +} + +.saving #customize-header-actions .spinner, +.trashing #customize-header-actions .spinner { + visibility: visible; +} + +#customize-header-actions { + border-bottom: 1px solid #ddd; +} + +#customize-controls .wp-full-overlay-sidebar-content { + overflow-y: auto; + overflow-x: hidden; +} + +.outer-section-open #customize-controls .wp-full-overlay-sidebar-content { + background: #eee; +} + +#customize-controls .customize-info { + border: none; + border-bottom: 1px solid #ddd; + margin-bottom: 15px; +} + +#customize-control-changeset_status .customize-inside-control-row, +#customize-control-changeset_preview_link input { + background-color: #ffffff; + border-bottom: 1px solid #ddd; + box-sizing: content-box; + width: 100%; + margin-left: -12px; + padding-left: 12px; + padding-right: 12px; +} + +#customize-control-trash_changeset { + margin-top: 20px; +} +#customize-control-trash_changeset .button-link { + position: relative; + padding-left: 24px; + display: inline-block; +} +#customize-control-trash_changeset .button-link:before { + content: "\f182"; + font: normal 22px dashicons; + text-decoration: none; + position: absolute; + left: 0; + top: -2px; +} + +#customize-controls .date-input:invalid { + border-color: #dc3232; +} + +#customize-control-changeset_status .customize-inside-control-row { + padding-top: 10px; + padding-bottom: 10px; + font-weight: 500; +} + +#customize-control-changeset_status .customize-inside-control-row:first-of-type { + border-top: 1px solid #ddd; +} + +#customize-control-changeset_status .customize-control-title { + margin-bottom: 6px; +} + +#customize-control-changeset_status input { + margin-left: 0; +} + +#customize-control-changeset_preview_link { + position: relative; + display: block; +} + +.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button { + margin: 0; + position: absolute; + bottom: 9px; + right: 0; +} + +.preview-link-wrapper { + position: relative; +} + +.customize-copy-preview-link:before, +.customize-copy-preview-link:after { + content: ""; + height: 28px; + position: absolute; + background: #ffffff; + top: -1px; +} + +.customize-copy-preview-link:before { + left: -10px; + width: 9px; + opacity: 0.75; +} + +.customize-copy-preview-link:after { + left: -5px; + width: 4px; + opacity: 0.8; +} + +#customize-control-changeset_preview_link input { + line-height: 2.85714286; /* 40px */ + border-top: 1px solid #ddd; + border-left: none; + border-right: none; + text-indent: -999px; + color: #fff; + /* Only necessary for IE11 */ + min-height: 40px; +} + +#customize-control-changeset_preview_link label { + position: relative; + display: block; +} + +#customize-control-changeset_preview_link a { + display: inline-block; + position: absolute; + white-space: nowrap; + overflow: hidden; + width: 90%; + bottom: 14px; + font-size: 14px; + text-decoration: none; +} + +#customize-control-changeset_preview_link a.disabled, +#customize-control-changeset_preview_link a.disabled:active, +#customize-control-changeset_preview_link a.disabled:focus, +#customize-control-changeset_preview_link a.disabled:visited { + color: black; + opacity: 0.4; + cursor: default; + outline: none; + box-shadow: none; +} + +#sub-accordion-section-publish_settings .customize-section-description-container { + display: none; +} + +#customize-controls .customize-info.section-meta { + margin-bottom: 15px; +} + +.customize-control-date_time .customize-control-description + .date-time-fields.includes-time { + margin-top: 10px; +} + +.customize-control.customize-control-date_time .date-time-fields .date-input.day { + margin-right: 0; +} + +.date-time-fields .date-input.month { + width: auto; + margin: 0; +} + +.date-time-fields .date-input.day, +.date-time-fields .date-input.hour, +.date-time-fields .date-input.minute { + width: 46px; +} + +.date-time-fields .date-input.year { + width: 65px; +} + +.date-time-fields .date-input.meridian { + width: auto; + margin: 0; +} + +.date-time-fields .time-row { + margin-top: 12px; +} + +#customize-control-changeset_preview_link { + margin-top: 6px; +} + +#customize-control-changeset_status { + margin-bottom: 0; + padding-bottom: 0; +} + +#customize-control-changeset_scheduled_date { + box-sizing: content-box; + width: 100%; + margin-left: -12px; + padding: 12px; + background: #ffffff; + border-bottom: 1px solid #ddd; + margin-bottom: 0; +} + +#customize-control-changeset_scheduled_date .customize-control-description { + font-style: normal; +} + +#customize-controls .customize-info.is-in-view, +#customize-controls .customize-section-title.is-in-view { + position: absolute; + z-index: 9; + width: 100%; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); +} + +#customize-controls .customize-section-title.is-in-view { + margin-top: 0; +} + +#customize-controls .customize-info.is-in-view + .accordion-section { + margin-top: 15px; +} + +#customize-controls .customize-info.is-sticky, +#customize-controls .customize-section-title.is-sticky { + position: fixed; + top: 46px; +} + +#customize-controls .customize-info .accordion-section-title { + background: #fff; + color: #555d66; + border-left: none; + border-right: none; + border-bottom: none; + cursor: default; +} + +#customize-controls .customize-info.open .accordion-section-title:after, +#customize-controls .customize-info .accordion-section-title:hover:after, +#customize-controls .customize-info .accordion-section-title:focus:after { + color: #32373c; +} + +#customize-controls .customize-info .accordion-section-title:after { + display: none; +} + +#customize-controls .customize-info .preview-notice { + font-size: 13px; + line-height: 1.9; +} + +#customize-controls .customize-pane-child .customize-section-title h3, +#customize-controls .customize-pane-child h3.customize-section-title, +#customize-outer-theme-controls .customize-pane-child .customize-section-title h3, +#customize-outer-theme-controls .customize-pane-child h3.customize-section-title, +#customize-controls .customize-info .panel-title { + font-size: 20px; + font-weight: 200; + line-height: 26px; + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +#customize-controls .customize-section-title span.customize-action { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +#customize-controls .customize-info .customize-help-toggle { + position: absolute; + top: 4px; + right: 1px; + padding: 20px 20px 10px 10px; + width: 20px; + height: 20px; + cursor: pointer; + box-shadow: none; + -webkit-appearance: none; + background: transparent; + color: #555d66; + border: none; +} + +#customize-controls .customize-info .customize-help-toggle:before { + position: absolute; + top: 5px; + left: 6px; +} + +#customize-controls .customize-info.open .customize-help-toggle, +#customize-controls .customize-info .customize-help-toggle:focus, +#customize-controls .customize-info .customize-help-toggle:hover { + color: #0073aa; +} + +#customize-controls .customize-info .customize-panel-description, +#customize-controls .customize-info .customize-section-description, +#customize-outer-theme-controls .customize-info .customize-section-description, +#customize-controls .no-widget-areas-rendered-notice { + color: #555d66; + display: none; + background: #fff; + padding: 12px 15px; + border-top: 1px solid #ddd; +} + +#customize-controls .customize-info .customize-panel-description.open + .no-widget-areas-rendered-notice { + border-top: none; +} +.no-widget-areas-rendered-notice { + font-style: italic; +} +.no-widget-areas-rendered-notice p:first-child { + margin-top: 0; +} +.no-widget-areas-rendered-notice p:last-child { + margin-bottom: 0; +} + +#customize-controls .customize-info .customize-section-description { + margin-bottom: 15px; +} + +#customize-controls .customize-info .customize-panel-description p:first-child, +#customize-controls .customize-info .customize-section-description p:first-child { + margin-top: 0; +} + +#customize-controls .customize-info .customize-panel-description p:last-child, +#customize-controls .customize-info .customize-section-description p:last-child { + margin-bottom: 0; +} + +#customize-controls .current-panel .control-section > h3.accordion-section-title { + padding-right: 30px; +} + +#customize-theme-controls .control-section, +#customize-outer-theme-controls .control-section { + border: none; +} + +#customize-theme-controls .accordion-section-title, +#customize-outer-theme-controls .accordion-section-title { + color: #555d66; + background-color: #fff; + border-bottom: 1px solid #ddd; + border-left: 4px solid #fff; + transition: + .15s color ease-in-out, + .15s background-color ease-in-out, + .15s border-color ease-in-out; +} + +#customize-controls #customize-theme-controls .customize-themes-panel .accordion-section-title { + color: #555; + background-color: #fff; + border-left: 4px solid #fff; +} + +#customize-theme-controls .accordion-section-title:after, +#customize-outer-theme-controls .accordion-section-title:after { + content: "\f345"; + color: #a0a5aa; +} + +#customize-theme-controls .accordion-section-content, +#customize-outer-theme-controls .accordion-section-content { + color: #555d66; + background: transparent; +} + +#customize-controls .control-section:hover > .accordion-section-title, +#customize-controls .control-section .accordion-section-title:hover, +#customize-controls .control-section.open .accordion-section-title, +#customize-controls .control-section .accordion-section-title:focus { + color: #0073aa; + background: #f3f3f5; + border-left-color: #0073aa; +} + +#accordion-section-themes + .control-section { + border-top: 1px solid #ddd; +} + +.js .control-section:hover .accordion-section-title, +.js .control-section .accordion-section-title:hover, +.js .control-section.open .accordion-section-title, +.js .control-section .accordion-section-title:focus { + background: #f3f3f5; +} + +#customize-theme-controls .control-section:hover > .accordion-section-title:after, +#customize-theme-controls .control-section .accordion-section-title:hover:after, +#customize-theme-controls .control-section.open .accordion-section-title:after, +#customize-theme-controls .control-section .accordion-section-title:focus:after, +#customize-outer-theme-controls .control-section:hover > .accordion-section-title:after, +#customize-outer-theme-controls .control-section .accordion-section-title:hover:after, +#customize-outer-theme-controls .control-section.open .accordion-section-title:after, +#customize-outer-theme-controls .control-section .accordion-section-title:focus:after { + color: #0073aa; +} + +#customize-theme-controls .control-section.open { + border-bottom: 1px solid #eee; +} + +#customize-theme-controls .control-section.open .accordion-section-title, +#customize-outer-theme-controls .control-section.open .accordion-section-title { + border-bottom-color: #eee !important; +} + +#customize-theme-controls .control-section:last-of-type.open, +#customize-theme-controls .control-section:last-of-type > .accordion-section-title { + border-bottom-color: #ddd; +} + +#customize-theme-controls .control-panel-content:not(.control-panel-nav_menus) .control-section:nth-child(2), +#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu, +#customize-theme-controls .control-section-nav_menu_locations .accordion-section-title { + border-top: 1px solid #ddd; +} + +#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu + .control-section-nav_menu { + border-top: none; +} + +#customize-theme-controls > ul { + margin: 0; +} + +#customize-theme-controls .accordion-section-content { + position: absolute; + top: 0; + left: 100%; + width: 100%; + margin: 0; + padding: 12px; + box-sizing: border-box; +} + +#customize-info, +#customize-theme-controls .customize-pane-parent, +#customize-theme-controls .customize-pane-child { + overflow: visible; + width: 100%; + margin: 0; + padding: 0; + box-sizing: border-box; + transition: 0.18s transform cubic-bezier(0.645, 0.045, 0.355, 1); /* easeInOutCubic */ +} + +#customize-theme-controls .customize-pane-child.skip-transition { + transition: none; +} + +#customize-info, +#customize-theme-controls .customize-pane-parent { + position: relative; + visibility: visible; + height: auto; + max-height: none; + overflow: auto; + transform: none; +} + +#customize-theme-controls .customize-pane-child { + position: absolute; + top: 0; + left: 0; + visibility: hidden; + height: 0; + max-height: none; + overflow: hidden; + transform: translateX(100%); +} + +#customize-theme-controls .customize-pane-child.open, +#customize-theme-controls .customize-pane-child.current-panel { + transform: none; +} + +.section-open #customize-theme-controls .customize-pane-parent, +.in-sub-panel #customize-theme-controls .customize-pane-parent, +.section-open #customize-info, +.in-sub-panel #customize-info, +.in-sub-panel.section-open #customize-theme-controls .customize-pane-child.current-panel { + visibility: hidden; + height: 0; + overflow: hidden; + transform: translateX(-100%); +} + +.section-open #customize-theme-controls .customize-pane-parent.busy, +.in-sub-panel #customize-theme-controls .customize-pane-parent.busy, +.section-open #customize-info.busy, +.in-sub-panel #customize-info.busy, +.busy.section-open.in-sub-panel #customize-theme-controls .customize-pane-child.current-panel, +#customize-theme-controls .customize-pane-child.open, +#customize-theme-controls .customize-pane-child.current-panel, +#customize-theme-controls .customize-pane-child.busy { + visibility: visible; + height: auto; + overflow: auto; +} + +#customize-theme-controls .customize-pane-child.accordion-section-content, +#customize-theme-controls .customize-pane-child.accordion-sub-container { + display: block; + overflow-x: hidden; +} + +#customize-theme-controls .customize-pane-child.accordion-section-content { + padding: 12px; +} + +#customize-theme-controls .customize-pane-child.menu li { + position: static; +} + +.customize-section-description-container, +.control-section-nav_menu .customize-section-description-container, +.control-section-new_menu .customize-section-description-container { + margin-bottom: 15px; +} + +.control-section-nav_menu .customize-control, +.control-section-new_menu .customize-control { + /* Override default `margin-bottom` for `.customize-control` */ + margin-bottom: 0; +} + +.customize-section-title { + margin: -12px -12px 0 -12px; + border-bottom: 1px solid #ddd; + background: #fff; +} + +div.customize-section-description { + margin-top: 22px; +} + +.customize-info div.customize-section-description { + margin-top: 0; +} + +div.customize-section-description p:first-child { + margin-top: 0; +} + +div.customize-section-description p:last-child { + margin-bottom: 0; +} + +#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child { + border-bottom: 1px solid #ddd; + padding: 12px 12px 12px 12px; +} + +.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child { + padding: 12px 12px 13px 12px; +} + +.customize-section-title h3, +h3.customize-section-title { + padding: 10px 10px 12px 14px; + margin: 0; + line-height: 21px; + color: #555d66; +} + +.accordion-sub-container.control-panel-content { + display: none; + position: absolute; + top: 0; + width: 100%; +} + +.accordion-sub-container.control-panel-content.busy { + display: block; +} + +.current-panel .accordion-sub-container.control-panel-content { + width: 100%; +} + +.customize-controls-close { + display: block; + position: absolute; + top: 0; + left: 0; + width: 45px; + height: 41px; + padding: 0 2px 0 0; + background: #eee; + border: none; + border-top: 4px solid #eee; + border-right: 1px solid #ddd; + color: #444; + text-align: left; + cursor: pointer; + transition: + color .15s ease-in-out, + border-color .15s ease-in-out, + background .15s ease-in-out; + box-sizing: content-box; +} + +.customize-panel-back, +.customize-section-back { + display: block; + float: left; + width: 48px; + height: 71px; + padding: 0 24px 0 0; + margin: 0; + background: #fff; + border: none; + border-right: 1px solid #ddd; + border-left: 4px solid #fff; + box-shadow: none; + cursor: pointer; + transition: + color .15s ease-in-out, + border-color .15s ease-in-out, + background .15s ease-in-out; +} + +.customize-section-back { + height: 74px; +} + +.ios .customize-panel-back { + display: none; +} + +.ios .expanded.in-sub-panel .customize-panel-back { + display: block; +} + +#customize-controls .panel-meta.customize-info .accordion-section-title { + margin-left: 48px; + border-left: none; +} + +#customize-controls .panel-meta.customize-info .accordion-section-title:hover, +#customize-controls .cannot-expand:hover .accordion-section-title { + background: #fff; + color: #555d66; + border-left-color: #fff; +} + +.customize-controls-close:focus, +.customize-controls-close:hover, +.customize-controls-preview-toggle:focus, +.customize-controls-preview-toggle:hover { + background: #fff; + color: #0073aa; + border-top-color: #0073aa; + outline: none; + box-shadow: none; +} + + +.customize-panel-back:hover, +.customize-panel-back:focus, +.customize-section-back:hover, +.customize-section-back:focus { + color: #0073aa; + background: #f3f3f5; + border-left-color: #0073aa; + outline: none; + box-shadow: none; +} + +.customize-controls-close:before { + font: normal 22px/45px dashicons; + content: "\f335"; + position: relative; + top: -3px; + left: 13px; +} + +.customize-panel-back:before, +.customize-section-back:before { + font: normal 20px/72px dashicons; + content: "\f341"; + position: relative; + left: 9px; +} + +.wp-full-overlay-sidebar .wp-full-overlay-header { + background-color: #eee; + transition: padding ease-in-out .18s; +} + +.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header { + padding-left: 62px; +} + +p.customize-section-description { + font-style: normal; + margin-top: 22px; + margin-bottom: 0; +} + +.customize-section-description ul { + margin-left: 1em; +} + +.customize-section-description ul > li { + list-style: disc; +} + +.section-description-buttons { + text-align: right; +} + +.section-description-buttons button.button-link { + color: #0073aa; + text-decoration: underline; +} + +.customize-control { + width: 100%; + float: left; + clear: both; + margin-bottom: 12px; +} + +.customize-control input[type="text"], +.customize-control input[type="password"], +.customize-control input[type="email"], +.customize-control input[type="number"], +.customize-control input[type="search"], +.customize-control input[type="tel"], +.customize-control input[type="url"] { + width: 100%; + margin: 0; +} + +.customize-control-hidden { + margin: 0; +} + +.customize-control-textarea textarea { + width: 100%; + resize: vertical; +} + +.customize-control select { + width: 100%; +} + +.customize-control select[multiple] { + height: auto; +} + +.customize-control-title { + display: block; + font-size: 14px; + line-height: 1.75; + font-weight: 600; + margin-bottom: 4px; +} + +.customize-control-description { + display: block; + font-style: italic; + line-height: 1.4; + margin-top: 0; + margin-bottom: 5px; +} + +.customize-section-description a.external-link:after { + font: 16px/11px dashicons; + content: "\f310"; + top: 3px; + position: relative; + padding-left: 3px; + display: inline-block; + text-decoration: none; +} + +.customize-control-color .color-picker, +.customize-control-upload div { + line-height: 28px; +} + +.customize-control .customize-inside-control-row { + line-height: 1.6; + display: block; + margin-left: 24px; + padding-top: 6px; + padding-bottom: 6px; +} + +.customize-control-radio input, +.customize-control-checkbox input, +.customize-control-nav_menu_auto_add input { + margin-right: 4px; + margin-left: -24px; +} + +.customize-control-radio { + padding: 5px 0 10px; +} + +.customize-control-radio .customize-control-title { + margin-bottom: 0; + line-height: 1.6; +} + +.customize-control-radio .customize-control-title + .customize-control-description { + margin-top: 7px; +} + +.customize-control-radio label, +.customize-control-checkbox label { + vertical-align: top; +} + +.customize-control .attachment-thumb.type-icon { + float: left; + margin: 10px; + width: auto; +} + +.customize-control .attachment-title { + font-weight: 600; + margin: 0; + padding: 5px 10px; +} + +.customize-control .attachment-meta { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 0; + padding: 0 10px; +} + +.customize-control .attachment-meta-title { + padding-top: 7px; +} + +/* Remove descender space. */ +.customize-control .thumbnail-image, +.customize-control-header .current, +.customize-control .wp-media-wrapper.wp-video { + line-height: 0; +} + +/* Remove descender space. */ +.customize-control-site_icon .favicon-preview .browser-preview { + vertical-align: top; +} + +.customize-control .thumbnail-image img { + cursor: pointer; +} + +#customize-controls .thumbnail-audio .thumbnail { + max-width: 64px; + max-height: 64px; + margin: 10px; + float: left; +} + +#available-menu-items .accordion-section-content .new-content-item, +.customize-control-dropdown-pages .new-content-item { + width: calc(100% - 30px); + padding: 8px 15px; + position: absolute; + bottom: 0; + z-index: 10; + background: #eee; + display: flex; +} + +.customize-control-dropdown-pages .new-content-item { + width: 100%; + padding: 5px 0 5px 1px; + position: relative; +} + +#available-menu-items .new-content-item .create-item-input, +.customize-control-dropdown-pages .new-content-item .create-item-input { + flex-grow: 10; +} + +#available-menu-items .new-content-item .add-content, +.customize-control-dropdown-pages .new-content-item .add-content { + margin: 2px 0 2px 6px; + flex-grow: 1; +} + +.customize-control-dropdown-pages .new-content-item .create-item-input.invalid { + border: 1px solid #dc3232; +} + +.customize-control-dropdown-pages .add-new-toggle { + margin-left: 1px; + font-weight: 600; + line-height: 2.2; +} + +#customize-preview iframe { + width: 100%; + height: 100%; + position: absolute; +} +#customize-preview iframe + iframe { + visibility: hidden; +} + +.wp-full-overlay-sidebar { + background: #eee; + border-right: 1px solid #ddd; +} + + +/** + * Notifications + */ + +#customize-controls .customize-control-notifications-container { /* Scoped to #customize-controls for specificity over notification styles in common.css. */ + margin: 4px 0 8px 0; + padding: 0; + cursor: default; +} + +#customize-controls .customize-control-widget_form.has-error .widget .widget-top, +.customize-control-nav_menu_item.has-error .menu-item-bar .menu-item-handle { + box-shadow: inset 0 0 0 2px #dc3232; + transition: .15s box-shadow linear; +} + +#customize-controls .customize-control-notifications-container li.notice { + list-style: none; + margin: 0 0 6px 0; + padding: 9px 14px; + overflow: hidden; +} +#customize-controls .customize-control-notifications-container .notice.is-dismissible { + padding-right: 38px; +} + +.customize-control-notifications-container li.notice:last-child { + margin-bottom: 0; +} + +#customize-controls .customize-control-nav_menu_item .customize-control-notifications-container { + margin-top: 0; +} + +#customize-controls .customize-control-widget_form .customize-control-notifications-container { + margin-top: 8px; +} + +.customize-control-text.has-error input { + outline: 2px solid #dc3232; +} + +#customize-controls #customize-notifications-area { + position: absolute; + top: 46px; + width: 100%; + border-bottom: 1px solid #ddd; + display: block; + padding: 0; + margin: 0; +} + +.wp-full-overlay.collapsed #customize-controls #customize-notifications-area { + display: none !important; +} + +#customize-controls #customize-notifications-area:not(.has-overlay-notifications), +#customize-controls .customize-section-title > .customize-control-notifications-container:not(.has-overlay-notifications), +#customize-controls .panel-meta > .customize-control-notifications-container:not(.has-overlay-notifications) { + max-height: 210px; + overflow-x: hidden; + overflow-y: auto; +} + +#customize-controls #customize-notifications-area > ul, +#customize-controls #customize-notifications-area .notice, +#customize-controls .panel-meta > .customize-control-notifications-container, +#customize-controls .panel-meta > .customize-control-notifications-container .notice, +#customize-controls .customize-section-title > .customize-control-notifications-container, +#customize-controls .customize-section-title > .customize-control-notifications-container .notice { + margin: 0; +} +#customize-controls .panel-meta > .customize-control-notifications-container, +#customize-controls .customize-section-title > .customize-control-notifications-container { + border-top: 1px solid #ddd; +} +#customize-controls #customize-notifications-area .notice, +#customize-controls .panel-meta > .customize-control-notifications-container .notice, +#customize-controls .customize-section-title > .customize-control-notifications-container .notice { + padding: 9px 14px; +} +#customize-controls #customize-notifications-area .notice.is-dismissible, +#customize-controls .panel-meta > .customize-control-notifications-container .notice.is-dismissible, +#customize-controls .customize-section-title > .customize-control-notifications-container .notice.is-dismissible { + padding-right: 38px; +} +#customize-controls #customize-notifications-area .notice + .notice, +#customize-controls .panel-meta > .customize-control-notifications-container .notice + .notice, +#customize-controls .customize-section-title > .customize-control-notifications-container .notice + .notice { + margin-top: 1px; +} + +@keyframes customize-fade-in { + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +#customize-controls .notice.notification-overlay, +#customize-controls #customize-notifications-area .notice.notification-overlay { + margin: 0; + border-left: 0; /* @todo Appropriate styles could be added for notice-error, notice-warning, notice-success, etc */ +} + +#customize-controls .customize-control-notifications-container.has-overlay-notifications { + animation: customize-fade-in 0.5s; + z-index: 30; +} + +/* Note: Styles for this are also defined in themes.css */ +#customize-controls #customize-notifications-area .notice.notification-overlay .notification-message { + clear: both; + color: #191e23; + font-size: 18px; + font-style: normal; + margin: 0; + padding: 2em 0; + text-align: center; + width: 100%; + display: block; + top: 50%; + position: relative; +} + +/* Style for custom settings */ + +/** + * Static front page + */ + +#customize-control-show_on_front.has-error { + margin-bottom: 0; +} +#customize-control-show_on_front.has-error .customize-control-notifications-container { + margin-top: 12px; +} + +/** + * Dropdowns + */ + +.accordion-section .dropdown { + float: left; + display: block; + position: relative; + cursor: pointer; +} + +.accordion-section .dropdown-content { + overflow: hidden; + float: left; + min-width: 30px; + height: 16px; + line-height: 16px; + margin-right: 16px; + padding: 4px 5px; + border: 2px solid #eee; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* @todo maybe no more used? */ +.customize-control .dropdown-arrow { + position: absolute; + top: 0; + bottom: 0; + right: 0; + width: 20px; + background: #eee; +} + +.customize-control .dropdown-arrow:after { + content: "\f140"; + font: normal 20px/1 dashicons; + speak: none; + display: block; + padding: 0; + text-indent: 0; + text-align: center; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #32373c; +} + +.customize-control .dropdown-status { + color: #32373c; + background: #eee; + display: none; + max-width: 112px; +} + +.customize-control-color .dropdown { + margin-right: 5px; + margin-bottom: 5px; +} + +.customize-control-color .dropdown .dropdown-content { + background-color: #555d66; + border: 1px solid rgba(0, 0, 0, 0.15); +} + +.customize-control-color .dropdown:hover .dropdown-content { + border-color: rgba(0, 0, 0, 0.25); +} + +/** + * iOS can't scroll iframes, + * instead it expands the iframe size to match the size of the content + */ + +.ios .wp-full-overlay { + position: relative; +} + +.ios #customize-controls .wp-full-overlay-sidebar-content { + -webkit-overflow-scrolling: touch; +} + +/* Media controls */ + +.customize-control .actions .button { + margin-top: 12px; +} + +.customize-control-header .actions, +.customize-control-header .uploaded { + margin-bottom: 18px; +} + +.customize-control-header .uploaded button:not(.random), +.customize-control-header .default button:not(.random) { + width: 100%; + padding: 0; + margin: 0; + background: none; + border: none; + color: inherit; + cursor: pointer; +} + +.customize-control-header button img { + display: block; +} + +.customize-control .attachment-media-view .remove-button, +.customize-control .attachment-media-view .default-button, +.customize-control .attachment-media-view .upload-button, +.customize-control-header button.new, +.customize-control-header button.remove { + width: auto; + height: auto; + white-space: normal; +} + +.customize-control .attachment-media-view .thumbnail, +.customize-control-header .current .container { + overflow: hidden; +} + +.customize-control .attachment-media-view .placeholder, +.customize-control .attachment-media-view .button-add-media, +.customize-control-header .placeholder { + width: 100%; + position: relative; + text-align: center; + cursor: default; + border: 1px dashed #b4b9be; + box-sizing: border-box; + padding: 9px 0; + line-height: 1.6; +} + +.customize-control .attachment-media-view .button-add-media { + cursor: pointer; + background-color: #edeff0; + color: #32373c; +} + +.customize-control .attachment-media-view .button-add-media:hover { + background-color: #fbfbfc; +} + +.customize-control .attachment-media-view .button-add-media:focus { + background-color: #fbfbfc; + border-color: #007cba; + border-style: solid; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; +} + +.customize-control-header .inner { + display: none; + position: absolute; + width: 100%; + color: #555d66; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +.customize-control-header .inner, +.customize-control-header .inner .dashicons { + line-height: 20px; + top: 8px; +} + +.customize-control-header .list .inner, +.customize-control-header .list .inner .dashicons { + top: 9px; +} + +.customize-control-header .header-view { + position: relative; + width: 100%; + margin-bottom: 12px; +} + +.customize-control-header .header-view:last-child { + margin-bottom: 0px; +} + +/* Convoluted, but 'outline' support isn't good enough yet */ +.customize-control-header .header-view:after { + border: 0; +} + +.customize-control-header .header-view.selected .choice:focus { + outline: none; +} + +.customize-control-header .header-view.selected:after { + content: ""; + position: absolute; + height: auto; + top: 0; + left: 0; + bottom: 0; + right: 0; + border: 4px solid #00a0d2; + border-radius: 2px; +} + +.customize-control-header .header-view.button.selected { + border: 0; +} + +/* Header control: overlay "close" button */ + +.customize-control-header .uploaded .header-view .close { + font-size: 20px; + color: #fff; + background: #555d66; + background: rgba(0, 0, 0, 0.5); + position: absolute; + top: 10px; + left: -999px; + z-index: 1; + width: 26px; + height: 26px; + cursor: pointer; +} + +.customize-control-header .header-view:hover .close, +.customize-control-header .header-view .close:focus { + left: auto; + right: 10px; +} + +.customize-control-header .header-view .close:focus { + outline: 1px solid #5b9dd9; +} + +/* Header control: randomiz(s)er */ + +.customize-control-header .random.placeholder { + cursor: pointer; + border-radius: 2px; + height: 40px; +} + +.customize-control-header button.random { + width: 100%; + height: auto; + min-height: 40px; + white-space: normal; +} + +.customize-control-header button.random .dice { + margin-top: 4px; +} + +.customize-control-header .placeholder:hover .dice, +.customize-control-header .header-view:hover > button.random .dice { + animation: dice-color-change 3s infinite; +} + +.button-see-me { + animation: bounce .7s 1; + transform-origin: center bottom; +} + +@keyframes bounce { + from, 20%, 53%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transform: translate3d(0,0,0); + } + + 40%, 43% { + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transform: translate3d(0, -12px, 0); + } + + 70% { + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transform: translate3d(0, -6px, 0); + } + + 90% { + transform: translate3d(0,-1px,0); + } +} + +.customize-control-header .choice { + position: relative; + display: block; + margin-bottom: 9px; +} + +.customize-control-header .choice:focus { + outline: none; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 3px 1px rgba(30, 140, 190, 0.8); +} + +.customize-control-header .uploaded div:last-child > .choice { + margin-bottom: 0; +} + +.customize-control .attachment-media-view .thumbnail-image img, +.customize-control-header img { + max-width: 100%; +} + +.customize-control .attachment-media-view .remove-button, +.customize-control .attachment-media-view .default-button, +.customize-control-header .remove { + margin-right: 8px; +} + +/* Background position control */ +.customize-control-background_position .background-position-control .button-group { + display: block; +} + +/** + * Code Editor Control and Custom CSS Section + * + * Modifications to the Section Container to make the textarea full-width and + * full-height, if the control is the only control in the section. + */ + +.customize-control-code_editor textarea { + width: 100%; + font-family: Consolas, Monaco, monospace; + font-size: 12px; + padding: 6px 8px; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +.customize-control-code_editor textarea, +.customize-control-code_editor .CodeMirror { + height: 14em; +} + +#customize-controls .customize-section-description-container.section-meta.customize-info { + border-bottom: none; +} + +#sub-accordion-section-custom_css .customize-control-notifications-container { + margin-bottom: 15px; +} + +#customize-control-custom_css textarea { + display: block; + height: 500px; +} + +.customize-section-description-container + #customize-control-custom_css .customize-control-title { + margin-left: 12px; +} + +.customize-section-description-container + #customize-control-custom_css:last-child textarea { + border-right: 0; + border-left: 0; + height: calc( 100vh - 185px ); + resize: none; +} + +.customize-section-description-container + #customize-control-custom_css:last-child { + margin-left: -12px; + width: 299px; + width: calc( 100% + 24px ); + margin-bottom: -12px; +} + +.customize-section-description-container + #customize-control-custom_css:last-child .CodeMirror { + height: calc( 100vh - 185px ); +} + +.CodeMirror-lint-tooltip, +.CodeMirror-hints { + z-index: 500000 !important; +} + +.customize-section-description-container + #customize-control-custom_css:last-child .customize-control-notifications-container { + margin-left: 12px; + margin-right: 12px; +} + +.theme-browser .theme.active .theme-actions, +.wp-customizer .theme-browser .theme .theme-actions { + padding: 9px 15px; + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); +} + +@media screen and (max-width: 640px) { + .customize-section-description-container + #customize-control-custom_css:last-child { + margin-right: 0; + } + + .customize-section-description-container + #customize-control-custom_css:last-child textarea { + height: calc( 100vh - 140px ); + } +} + +/** + * Themes + */ + +#customize-theme-controls .control-panel-themes { + border-bottom: none; +} + +#customize-theme-controls .control-panel-themes > .accordion-section-title:hover, /* Not a focusable element. */ +#customize-theme-controls .control-panel-themes > .accordion-section-title { + cursor: default; + background: #fff; + color: #555d66; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + border-left: none; + border-right: none; + margin: 0 0 15px 0; + padding-right: 100px; /* Space for the button */ +} + +#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child:hover, /* Not a focusable element. */ +#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child { + border-top: 0; +} + +#customize-theme-controls .control-section-themes > .accordion-section-title:hover, /* Not a focusable element. */ +#customize-theme-controls .control-section-themes > .accordion-section-title { + margin: 0 0 15px; +} + +#customize-controls .customize-themes-panel .accordion-section-title:hover, +#customize-controls .customize-themes-panel .accordion-section-title { + margin: 15px -8px; +} + +#customize-controls .control-section-themes .accordion-section-title, +#customize-controls .customize-themes-panel .accordion-section-title { + padding-right: 100px; /* Space for the button */ +} + +.control-panel-themes .accordion-section-title span.customize-action, +#customize-controls .customize-section-title span.customize-action, +#customize-controls .control-section-themes .accordion-section-title span.customize-action, +#customize-controls .customize-section-title span.customize-action { + font-size: 13px; + display: block; + font-weight: 400; +} + +#customize-theme-controls .control-panel-themes .accordion-section-title .change-theme { + position: absolute; + right: 10px; + top: 50%; + margin-top: -14px; + font-weight: 400; +} + +#customize-theme-controls .control-panel-themes > .accordion-section-title:after { + display: none; +} + +.control-panel-themes .customize-themes-full-container { + position: fixed; + top: 0; + left: 0; + transition: .18s left ease-in-out; + margin: 0 0 0 300px; + padding: 71px 0 25px; + overflow-y: scroll; + width: calc(100% - 300px); + height: calc(100% - 96px); + background: #eee; + z-index: 20; +} + +@media screen and (min-width: 1670px) { + .control-panel-themes .customize-themes-full-container { + width: 82%; + right: 0; + left: initial; + } +} + +.modal-open .control-panel-themes .customize-themes-full-container { + overflow-y: visible; +} + +/* Animations for opening the themes panel */ +#customize-save-button-wrapper, +#customize-header-actions .spinner, +#customize-header-actions .customize-controls-preview-toggle { + transition: .18s margin ease-in-out; +} + +#customize-footer-actions, +#customize-footer-actions .collapse-sidebar { + bottom: 0; + transition: .18s bottom ease-in-out; +} + +.in-themes-panel:not(.animating) #customize-header-actions .spinner, +.in-themes-panel:not(.animating) #customize-header-actions .customize-controls-preview-toggle, +.in-themes-panel:not(.animating) #customize-preview, +.in-themes-panel:not(.animating) #customize-footer-actions { + visibility: hidden; +} + +.wp-full-overlay.in-themes-panel { + background: #eee; /* Prevents a black flash when fading in the panel */ +} + +.in-themes-panel #customize-save-button-wrapper, +.in-themes-panel #customize-header-actions .spinner, +.in-themes-panel #customize-header-actions .customize-controls-preview-toggle { + margin-top: -46px; /* Height of header actions bar */ +} + +.in-themes-panel #customize-footer-actions, +.in-themes-panel #customize-footer-actions .collapse-sidebar { + bottom: -45px; +} + +/* Don't show the theme count while the panel opens, as it's in the wrong place during the animation */ +.in-themes-panel.animating .control-panel-themes .filter-themes-count { + display: none; +} + +.in-themes-panel.wp-full-overlay .wp-full-overlay-sidebar-content { + bottom: 0; +} + +.themes-filter-bar .feature-filter-toggle { + float: right; + margin: 3px 0 3px 25px; +} + +.themes-filter-bar .feature-filter-toggle:before { + content: "\f111"; + margin: 0 5px 0 0; + font: normal 16px/1 dashicons; + vertical-align: text-bottom; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.themes-filter-bar .feature-filter-toggle.open { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); +} + +.themes-filter-bar .feature-filter-toggle .filter-count-filters { + display: none; +} + +.filter-drawer { + box-sizing: border-box; + width: 100%; + position: absolute; + top: 46px; + left: 0; + padding: 25px 0 25px 25px; + border-top: 0; + margin: 0; + background: #eee; + border-bottom: 1px solid #ddd; +} + +.filter-drawer .filter-group { + margin: 0 25px 0 0; + width: calc( (100% - 75px) / 3); + min-width: 200px; + max-width: 320px; +} + +/* Adds a delay before fading in to avoid it "jumping" */ +@keyframes themes-fade-in { + 0% { + opacity: 0; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +.control-panel-themes .customize-themes-full-container.animate { + animation: .6s themes-fade-in 1; +} + +.in-themes-panel:not(.animating) .control-panel-themes .filter-themes-count { + animation: .6s themes-fade-in 1; +} + +.control-panel-themes .filter-themes-count { + position: relative; + float: right; + line-height: 2.6; +} + +.control-panel-themes .filter-themes-count .themes-displayed { + font-weight: 600; + color: #555d66; +} + +.customize-themes-notifications { + margin: 0; +} + +.control-panel-themes .customize-themes-notifications .notice { + margin: 0 0 25px 0; +} + +.customize-themes-full-container .customize-themes-section { + display: none !important; /* There is unknown JS that perpetually tries to show all theme sections when more items are added. */ + overflow: hidden; +} + +.customize-themes-full-container .customize-themes-section.current-section { + display: list-item !important; /* There is unknown JS that perpetually tries to show all theme sections when more items are added. */ +} + +.control-section .customize-section-text-before { + padding: 0 0 8px 15px; + margin: 15px 0 0 0; + line-height: 16px; + border-bottom: 1px solid #ddd; + color: #555d66; +} + +.control-panel-themes .customize-themes-section-title { + width: 100%; + background: #fff; + box-shadow: none; + outline: none; + border-top: none; + border-bottom: 1px solid #ddd; + border-left: 4px solid #fff; + border-right: none; + cursor: pointer; + padding: 10px 15px; + position: relative; + text-align: left; + font-size: 14px; + font-weight: 600; + color: #555d66; + text-shadow: none; +} + +.control-panel-themes #accordion-section-installed_themes { + border-top: 1px solid #ddd; +} + +.control-panel-themes .theme-section { + margin: 0; + position: relative; +} + +.control-panel-themes .customize-themes-section-title:focus, +.control-panel-themes .customize-themes-section-title:hover { + border-left-color: #0073aa; + color: #0073aa; + background: #f5f5f5; +} + +.customize-themes-section-title:not(.selected):after { + content: ""; + display: block; + position: absolute; + top: 9px; + right: 15px; + width: 18px; + height: 18px; + border-radius: 100%; + border: 1px solid #ccc; + background: #fff; +} + +.control-panel-themes .theme-section .customize-themes-section-title.selected:after { + content: "\f147"; + font: 16px/1 dashicons; + box-sizing: border-box; + width: 20px; + height: 20px; + padding: 3px 3px 1px 1px; /* Re-align the icon to the smaller grid */ + border-radius: 100%; + position: absolute; + top: 9px; + right: 15px; + background: #0073aa; + color: #fff; +} + +.control-panel-themes .customize-themes-section-title.selected { + color: #0073aa; +} + +#customize-theme-controls .themes.accordion-section-content { + position: relative; + left: 0; + padding: 0; + width: 100%; +} + +.loading .customize-themes-section .spinner { + display: block; + visibility: visible; + position: relative; + clear: both; + width: 20px; + height: 20px; + left: calc(50% - 10px); + float: none; + margin-top: 50px; +} + +.customize-themes-section .no-themes, +.customize-themes-section .no-themes-local { + display: none; +} + +.themes-section-installed_themes .theme .notice-success:not(.updated-message) { + display: none; /* Hide "installed" notice on installed themes tab. */ +} + +.customize-control-theme .theme { + width: 100%; + margin: 0; + border: 1px solid #ddd; + background: #fff; +} + +.customize-control-theme .theme .theme-name, .customize-control-theme .theme .theme-actions { + background: #fff; + border: none; +} + +.customize-control.customize-control-theme { /* override most properties on .customize-control */ + box-sizing: border-box; + width: 25%; + max-width: 600px; /* Max. screenshot size / 2 */ + margin: 0 25px 25px 0; + padding: 0; + clear: none; +} + +/* 5 columns above 2100px */ +@media screen and (min-width: 2101px) { + .customize-control.customize-control-theme { + width: calc( ( 100% - 125px ) / 5 - 1px ); /* 1px offset accounts for browser rounding, typical all grids */ + } +} + +/* 4 columns up to 2100px */ +@media screen and (min-width: 1601px) and (max-width: 2100px) { + .customize-control.customize-control-theme { + width: calc( ( 100% - 100px ) / 4 - 1px ); + } +} + +/* 3 columns up to 1600px */ +@media screen and (min-width: 1201px) and (max-width: 1600px) { + .customize-control.customize-control-theme { + width: calc( ( 100% - 75px ) / 3 - 1px ); + } +} + +/* 2 columns up to 1200px */ +@media screen and (min-width: 851px) and (max-width: 1200px) { + .customize-control.customize-control-theme { + width: calc( ( 100% - 50px ) / 2 - 1px ); + + } +} + +/* 1 column up to 850 px */ +@media screen and (max-width: 850px) { + .customize-control.customize-control-theme { + width: 100%; + } +} + +.wp-customizer .theme-browser .themes { + padding: 0 0 25px 25px; + transition: .18s margin-top linear; +} + +.wp-customizer .theme-browser .theme .theme-actions { + opacity: 1; +} + +#customize-controls h3.theme-name { + font-size: 15px; +} + +#customize-controls .theme-overlay .theme-name { + font-size: 32px; +} + +.customize-preview-header.themes-filter-bar { + position: fixed; + top: 0; + left: 300px; + width: calc(100% - 300px); + height: 46px; + background: #eee; + z-index: 10; + padding: 6px 25px; + box-sizing: border-box; + border-bottom: 1px solid #ddd; +} + +@media screen and (min-width: 1670px) { + .customize-preview-header.themes-filter-bar { + width: 82%; + right: 0; + left: initial; + } +} + +.themes-filter-bar .themes-filter-container { + margin: 0; + padding: 0; +} + +.themes-filter-bar .wp-filter-search { + line-height: 1.8; + padding: 6px 10px 6px 30px; + max-width: 100%; + width: 40%; + min-width: 300px; + position: absolute; + top: 6px; + left: 25px; + height: 32px; + margin: 1px 0; +} + +/* Unstick the filter bar on short windows/screens. This breakpoint is based on the + current length of .org feature filters assuming translations do not wrap lines. */ +@media screen and (max-height: 540px), screen and (max-width: 1018px) { + .customize-preview-header.themes-filter-bar { + position: relative; + left: 0; + width: 100%; + margin: 0 0 25px 0; + } + .filter-drawer { + top: 46px; + } + .wp-customizer .theme-browser .themes { + padding: 0 0 25px 25px; + overflow: hidden; + } + + .control-panel-themes .customize-themes-full-container { + margin-top: 0; + padding: 0; + height: 100%; + width: calc(100% - 300px); + } +} + +@media screen and (max-width: 1018px) { + .filter-drawer .filter-group { + width: calc( (100% - 50px) / 2); + } +} + +@media screen and (max-width: 900px) { + .customize-preview-header.themes-filter-bar { + height: 86px; + padding-top: 46px; + } + + .themes-filter-bar .wp-filter-search { + width: calc(100% - 50px); + margin: 0; + min-width: 200px; + } + + .filter-drawer { + top: 86px; + } + + .control-panel-themes .filter-themes-count { + float: left; + } +} + +@media screen and (max-width: 792px) { + .filter-drawer .filter-group { + width: calc( 100% - 25px); + } +} + +.control-panel-themes .customize-themes-mobile-back { + display: none; +} + +/* Mobile - toggle between themes and filters */ +@media screen and (max-width: 600px) { + + .filter-drawer { + top: 132px; + } + + .wp-full-overlay.showing-themes .control-panel-themes .filter-themes-count .filter-themes { + display: block; + float: right; + } + + .control-panel-themes .customize-themes-full-container { + width: 100%; + margin: 0; + padding-top: 46px; + height: calc(100% - 46px); + z-index: 1; + display: none; + } + + .showing-themes .control-panel-themes .customize-themes-full-container { + display: block; + } + + .wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back { + display: block; + position: fixed; + top: 0; + left: 0; + background: #eee; + color: #444; + border-radius: 0; + box-shadow: none; + border: none; + height: 46px; + width: 100%; + z-index: 10; + text-align: left; + text-shadow: none; + border-bottom: 1px solid #ddd; + border-left: 4px solid transparent; + margin: 0; + padding: 0; + font-size: 0; + overflow: hidden; + } + + .wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:before { + left: 0; + top: 0; + height: 46px; + width: 26px; + display: block; + line-height: 2.3; + padding: 0 8px 0 8px; + border-right: 1px solid #ddd; + } + + .wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:hover, + .wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:focus { + color: #0073aa; + background: #f3f3f5; + border-left-color: #0073aa; + outline: none; + box-shadow: none; + } + + .showing-themes #customize-header-actions { + display: none; + } + + #customize-controls { + width: 100%; + } +} + +/* Details View */ +.wp-customizer .theme-overlay { + display: none; +} + +.wp-customizer.modal-open .theme-overlay { + position: fixed; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 109; +} + +/* Avoid a z-index war by resetting elements that should be under the overlay. + This is likely required because of the way that sections and panels are positioned. */ +.wp-customizer.modal-open #customize-header-actions, +.wp-customizer.modal-open .control-panel-themes .filter-themes-count, +.wp-customizer.modal-open .control-panel-themes .customize-themes-section-title.selected:after { + z-index: -1; +} + +.wp-full-overlay.in-themes-panel.themes-panel-expanded #customize-controls .wp-full-overlay-sidebar-content { + overflow: visible; +} + +.wp-customizer .theme-overlay .theme-backdrop { + background: rgba(238, 238, 238, 0.75); + position: fixed; + z-index: 110; +} + +.wp-customizer .theme-overlay .star-rating { + float: left; + margin-right: 8px; +} + +.wp-customizer .theme-rating .num-ratings { + line-height: 20px; +} + +.wp-customizer .theme-overlay .theme-wrap { + left: 90px; + right: 90px; + top: 45px; + bottom: 45px; + z-index: 120; +} + +.wp-customizer .theme-overlay .theme-actions { + text-align: right; /* Because there're only one or two actions, match the UI pattern of media modals and right-align the action. */ + padding: 10px 25px; + background: #eee; + border-top: 1px solid #ddd; +} + +.wp-customizer .theme-overlay .theme-actions .theme-install.preview { + margin-left: 8px; +} + +.control-panel-themes .theme-actions .delete-theme { + left: 15px; /* these override themes.css on mobile */ + right: auto; + bottom: auto; + position: absolute; +} + +.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content { + overflow: visible; /* Prevent the top-level Customizer controls from becoming visible when elements on the right of the details modal are focused. */ +} + +.wp-customizer .theme-header { + background: #eee; +} + +.wp-customizer .theme-overlay .theme-header button, +.wp-customizer .theme-overlay .theme-header .close:before { + color: #444; +} + +.wp-customizer .theme-overlay .theme-header .close:focus, +.wp-customizer .theme-overlay .theme-header .close:hover, +.wp-customizer .theme-overlay .theme-header .right:focus, +.wp-customizer .theme-overlay .theme-header .right:hover, +.wp-customizer .theme-overlay .theme-header .left:focus, +.wp-customizer .theme-overlay .theme-header .left:hover { + background: #fff; + border-bottom: 4px solid #0073aa; + color: #0073aa; +} + +.wp-customizer .theme-overlay .theme-header .close:focus:before, +.wp-customizer .theme-overlay .theme-header .close:hover:before { + color: #0073aa; +} + +.wp-customizer .theme-overlay .theme-header button.disabled, +.wp-customizer .theme-overlay .theme-header button.disabled:hover, +.wp-customizer .theme-overlay .theme-header button.disabled:focus { + border-bottom: none; + background: transparent; + color: #ccc; +} + +/* Small Screens */ +@media (max-width: 850px), (max-height: 472px) { + .wp-customizer .theme-overlay .theme-wrap { + left: 0; + right: 0; + top: 0; + bottom: 0; + } + + .wp-customizer .theme-browser .themes { + padding-right: 25px; + } +} + +/* Handle cheaters. */ +body.cheatin { + font-size: medium; + height: auto; + background: #fff; + margin: 50px auto 2em; + padding: 1em 2em; + max-width: 700px; + min-width: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13); +} + +body.cheatin h1 { + border-bottom: 1px solid #ddd; + clear: both; + color: #555d66; + font-size: 24px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + margin: 30px 0 0 0; + padding: 0; + padding-bottom: 7px; +} + +body.cheatin p { + font-size: 14px; + line-height: 1.5; + margin: 25px 0 20px; +} + +/** + * Widgets and Menus common styles + */ + +/* higher specificity than .wp-core-ui .button */ +#customize-theme-controls .add-new-widget, +#customize-theme-controls .add-new-menu-item { + cursor: pointer; + float: right; + margin: 0; + margin-left: 10px; + transition: all 0.2s; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + outline: none; +} + +.reordering .add-new-widget, +.reordering .add-new-menu-item { + opacity: 0.2; + pointer-events: none; + cursor: not-allowed; /* doesn't work in conjunction with pointer-events */ +} + +.add-new-widget:before, +.add-new-menu-item:before, +#available-menu-items .new-content-item .add-content:before { + content: "\f132"; + display: inline-block; + position: relative; + left: -2px; + top: 0; + font: normal 20px/1 dashicons; + vertical-align: middle; + transition: all 0.2s; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Reordering */ +.reorder-toggle { + float: right; + padding: 5px 8px; + text-decoration: none; + cursor: pointer; + outline: none; +} + +.reorder, +.reordering .reorder-done { + display: block; + padding: 5px 8px; +} + +.reorder-done, +.reordering .reorder { + display: none; +} + +.widget-reorder-nav span, +.menu-item-reorder-nav button { + position: relative; + overflow: hidden; + float: left; + display: block; + width: 33px; /* was 42px for mobile */ + height: 43px; + color: #82878c; + text-indent: -9999px; + cursor: pointer; + outline: none; +} + +.menu-item-reorder-nav button { + width: 30px; + height: 40px; + background: transparent; + border: none; + box-shadow: none; +} + +.widget-reorder-nav span:before, +.menu-item-reorder-nav button:before { + display: inline-block; + position: absolute; + top: 0; + right: 0; + width: 100%; + height: 100%; + font: normal 20px/43px dashicons; + text-align: center; + text-indent: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.widget-reorder-nav span:hover, +.widget-reorder-nav span:focus, +.menu-item-reorder-nav button:hover, +.menu-item-reorder-nav button:focus { + color: #191e23; + background: #eee; +} + +.move-widget-down:before, +.menus-move-down:before { + content: "\f347"; +} + +.move-widget-up:before, +.menus-move-up:before { + content: "\f343"; +} + +#customize-theme-controls .first-widget .move-widget-up, +#customize-theme-controls .last-widget .move-widget-down, +.move-up-disabled .menus-move-up, +.move-down-disabled .menus-move-down, +.move-right-disabled .menus-move-right, +.move-left-disabled .menus-move-left { + color: #d5d5d5; + background-color: #fff; + cursor: default; + pointer-events: none; +} + +/** + * New widget and Add-menu-items modes and panels + */ + +.wp-full-overlay-main { + right: auto; /* this overrides a right: 0; which causes the preview to resize, I'd rather have it go off screen at the normal size. */ + width: 100%; +} + +body.adding-widget .add-new-widget, +body.adding-widget .add-new-widget:hover, +.adding-menu-items .add-new-menu-item, +.adding-menu-items .add-new-menu-item:hover, +.add-menu-toggle.open, +.add-menu-toggle.open:hover { + background: #eee; + border-color: #929793; + color: #32373c; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); +} + +body.adding-widget .add-new-widget:before, +.adding-menu-items .add-new-menu-item:before, +#accordion-section-add_menu .add-new-menu-item.open:before { + transform: rotate(45deg); +} + +#available-widgets, +#available-menu-items { + position: absolute; + top: 0; + bottom: 0; + left: -301px; + visibility: hidden; + overflow-x: hidden; + overflow-y: auto; + width: 300px; + margin: 0; + z-index: 4; + background: #eee; + transition: left .18s; + border-right: 1px solid #ddd; +} + +#available-widgets .customize-section-title, +#available-menu-items .customize-section-title { + display: none; +} + +#available-widgets-list { + top: 60px; + position: absolute; + overflow: auto; + bottom: 0; + width: 100%; + border-top: 1px solid #ddd; +} + +.no-widgets-found #available-widgets-list { + border-top: none; +} + +#available-widgets-filter { + position: fixed; + top: 0; + z-index: 1; + width: 300px; + background: #eee; +} + +/* search field container */ +#available-widgets-filter, +#available-menu-items-search .accordion-section-title { + padding: 13px 15px; + box-sizing: border-box; +} + +#available-widgets-filter input, +#available-menu-items-search input { + width: 100%; + min-height: 32px; + margin: 1px 0; + padding: 0 30px; +} + +#available-widgets-filter input::-ms-clear, +#available-menu-items-search input::-ms-clear { + display: none; /* remove the "x" in IE, which conflicts with the "x" icon on button.clear-results */ +} + +#available-menu-items-search .search-icon, +#available-widgets-filter .search-icon { + display: block; + position: absolute; + top: 15px; /* 13 container padding +1 input margin +1 input border */ + left: 16px; + width: 30px; + height: 30px; + line-height: 2.1; + text-align: center; + color: #72777c; +} + +#available-widgets-filter .clear-results, +#available-menu-items-search .clear-results { + position: absolute; + top: 15px; /* 13 container padding +1 input margin +1 input border */ + right: 16px; + width: 30px; + height: 30px; + padding: 0; + border: 0; + cursor: pointer; + background: none; + color: #a00; + text-decoration: none; + outline: 0; +} + +#available-widgets-filter .clear-results, +#available-menu-items-search .clear-results, +#available-menu-items-search.loading .clear-results.is-visible { + display: none; +} + +#available-widgets-filter .clear-results.is-visible, +#available-menu-items-search .clear-results.is-visible { + display: block; +} + +#available-widgets-filter .clear-results:before, +#available-menu-items-search .clear-results:before { + content: "\f335"; + font: normal 20px/1 dashicons; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#available-widgets-filter .clear-results:hover, +#available-widgets-filter .clear-results:focus, +#available-menu-items-search .clear-results:hover, +#available-menu-items-search .clear-results:focus { + color: #dc3232; +} + +#available-widgets-filter .clear-results:focus, +#available-menu-items-search .clear-results:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +#available-menu-items-search .search-icon:after, +#available-widgets-filter .search-icon:after, +.themes-filter-bar .search-icon:after { + content: "\f179"; + font: normal 20px/1 dashicons; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.themes-filter-bar .search-icon { + position: absolute; + top: 7px; + left: 26px; + z-index: 1; + color: #72777c; + height: 30px; + width: 30px; + line-height: 2; + text-align: center; +} + +.no-widgets-found-message { + display: none; + margin: 0; + padding: 0 15px; + line-height: inherit; +} + +.no-widgets-found .no-widgets-found-message { + display: block; +} + +#available-widgets .widget-top, +#available-widgets .widget-top:hover, +#available-menu-items .item-top, +#available-menu-items .item-top:hover { + border: none; + background: transparent; + box-shadow: none; +} + +#available-widgets .widget-tpl, +#available-menu-items .item-tpl { + position: relative; + padding: 15px 15px 15px 60px; + background: #fff; + border-bottom: 1px solid #ddd; + border-left: 4px solid #fff; + transition: + .15s color ease-in-out, + .15s background-color ease-in-out, + .15s border-color ease-in-out; + cursor: pointer; + display: none; +} + +#available-widgets .widget, +#available-menu-items .item { + position: static; +} + + +/* Responsive */ +.customize-controls-preview-toggle { + display: none; +} + +@media only screen and (max-width: 782px) { + .wp-customizer .theme:not(.active):hover .theme-actions, + .wp-customizer .theme:not(.active):focus .theme-actions { + display: block; + } + + .wp-customizer .theme-browser .theme.active .theme-name span { + display: inline; + } + + .customize-control-header button.random .dice { + margin-top: 0; + } + + .customize-control-radio .customize-inside-control-row, + .customize-control-checkbox .customize-inside-control-row, + .customize-control-nav_menu_auto_add .customize-inside-control-row { + margin-left: 32px; + } + + .customize-control-radio input, + .customize-control-checkbox input, + .customize-control-nav_menu_auto_add input { + margin-left: -32px; + } + + .customize-control input[type="radio"] + label + br, + .customize-control input[type="checkbox"] + label + br { + line-height: 2.5; /* For widgets checkboxes */ + } + + .customize-control .date-time-fields select { + height: 39px; + } + + .date-time-fields .date-input.month { + width: 79px; + } + + .date-time-fields .date-input.day, + .date-time-fields .date-input.hour, + .date-time-fields .date-input.minute { + width: 55px; + } + + .date-time-fields .date-input.year { + width: 80px; + } + + #customize-control-changeset_preview_link a { + bottom: 16px; + } + + .preview-link-wrapper .customize-copy-preview-link.preview-control-element.button { + bottom: 10px; + } + + .media-widget-control .media-widget-buttons .button.edit-media, + .media-widget-control .media-widget-buttons .button.change-media, + .media-widget-control .media-widget-buttons .button.select-media { + margin-top: 12px; + } + + .wp-core-ui .themes-filter-bar .feature-filter-toggle { + margin: 3px 0 3px 25px; + } +} + +@media screen and (max-width: 1200px) { + .outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main, + .adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main, + .adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main { + left: 67%; + } +} + +@media screen and (max-width: 640px) { + + /* when the sidebar is collapsed and switching to responsive view, + bring it back see ticket #35220 */ + .wp-full-overlay.collapsed #customize-controls { + margin-left: 0; + } + + .wp-full-overlay-sidebar .wp-full-overlay-sidebar-content { + bottom: 0; + } + + .customize-controls-preview-toggle { + display: block; + position: absolute; + top: 0; + left: 48px; + line-height: 3.2; + font-size: 14px; + padding: 0 12px; + margin: 0; + height: 45px; + background: #eee; + border: 0; + border-right: 1px solid #ddd; + color: #555d66; + cursor: pointer; + transition: color .1s ease-in-out, background .1s ease-in-out; + } + + #customize-footer-actions, + /*#customize-preview,*/ + .customize-controls-preview-toggle .controls, + .preview-only .wp-full-overlay-sidebar-content, + .preview-only .customize-controls-preview-toggle .preview { + display: none; + } + + .preview-only #customize-save-button-wrapper { + margin-top: -46px; + } + + .customize-controls-preview-toggle .preview:before, + .customize-controls-preview-toggle .controls:before { + font: normal 20px/1 dashicons; + content: "\f177"; + position: relative; + top: 4px; + margin-right: 6px; + } + + .customize-controls-preview-toggle .controls:before { + content: "\f540"; + } + + .preview-only #customize-controls { + height: 45px; + } + + .preview-only #customize-preview, + .preview-only .customize-controls-preview-toggle .controls { + display: block; + } + + .wp-core-ui.wp-customizer .button { + min-height: 30px; + padding: 0 14px; + line-height: 2; + font-size: 14px; + vertical-align: middle; + } + + #customize-control-changeset_status .customize-inside-control-row { + padding-top: 15px; + } + + body.adding-widget div#available-widgets, + body.adding-menu-items div#available-menu-items, + body.outer-section-open div#customize-sidebar-outer-content { + width: 100%; + } + + #available-widgets .customize-section-title, + #available-menu-items .customize-section-title { + display: block; + margin: 0; + } + + #available-widgets .customize-section-back, + #available-menu-items .customize-section-back { + height: 69px; + } + + #available-widgets .customize-section-title h3, + #available-menu-items .customize-section-title h3 { + font-size: 20px; + font-weight: 200; + padding: 9px 10px 12px 14px; + margin: 0; + line-height: 24px; + color: #555d66; + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + #available-widgets .customize-section-title .customize-action, + #available-menu-items .customize-section-title .customize-action { + font-size: 13px; + display: block; + font-weight: 400; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + + #available-widgets-filter { + position: relative; + width: 100%; + height: auto; + } + + #available-widgets-list { + top: 130px; + } + + #available-menu-items-search .clear-results, + #available-menu-items-search .search-icon { + top: 85px; /* 70 section title height + 13 container padding +1 input margin +1 input border */ + } + + .reorder, + .reordering .reorder-done { + padding: 8px; + } + + .wp-core-ui .themes-filter-bar .feature-filter-toggle { + margin: 0; + } +} + +@media screen and (max-width: 600px) { + .wp-full-overlay.expanded { + margin-left: 0; + } + + body.adding-widget div#available-widgets, + body.adding-menu-items div#available-menu-items, + body.outer-section-open div#customize-sidebar-outer-content { + top: 46px; + z-index: 10; + } + + body.wp-customizer .wp-full-overlay.expanded #customize-sidebar-outer-content { + left: -100%; + } + + body.wp-customizer.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content { + left: 0; + } +} diff --git a/wp-admin/css/customize-controls.min.css b/wp-admin/css/customize-controls.min.css new file mode 100644 index 0000000..a890739 --- /dev/null +++ b/wp-admin/css/customize-controls.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body{overflow:hidden;-webkit-text-size-adjust:100%}.customize-controls-close,.widget-control-actions a{text-decoration:none}#customize-controls h3{font-size:14px}#customize-controls img{max-width:100%}#customize-controls .submit{text-align:center}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked{background-color:rgba(0,0,0,.7);padding:25px}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .customize-changeset-locked-message{margin-left:auto;margin-right:auto;max-width:366px;min-height:64px;width:auto;padding:25px 25px 25px 109px;position:relative;background:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);line-height:1.5;overflow-y:auto;text-align:left;top:calc(50% - 100px)}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .currently-editing{margin-top:0}#customize-controls #customize-notifications-area .notice.notification-overlay.notification-changeset-locked .action-buttons{margin-bottom:0}.customize-changeset-locked-avatar{width:64px;position:absolute;left:25px;top:25px}.wp-core-ui.wp-customizer .customize-changeset-locked-message a.button{margin-right:10px;margin-top:0}#customize-controls .description{color:#555d66}#customize-save-button-wrapper{float:right;margin-top:9px}body:not(.ready) #customize-save-button-wrapper .save{visibility:hidden}#customize-save-button-wrapper .save{float:left;border-radius:3px;box-shadow:none;margin-top:0}#customize-save-button-wrapper .save:focus,#publish-settings:focus{box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db}#customize-save-button-wrapper .save.has-next-sibling{border-radius:3px 0 0 3px}#customize-sidebar-outer-content{position:absolute;top:0;bottom:0;left:0;visibility:hidden;overflow-x:hidden;overflow-y:auto;width:100%;margin:0;z-index:-1;background:#eee;transition:left .18s;border-right:1px solid #ddd;border-left:1px solid #ddd;height:100%}#customize-theme-controls .control-section-outer{display:none!important}#customize-outer-theme-controls .accordion-section-content{padding:12px}#customize-outer-theme-controls .accordion-section-content.open{display:block}.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{visibility:visible;left:100%;transition:left .18s}.customize-outer-pane-parent{margin:0}.outer-section-open .wp-full-overlay.expanded .wp-full-overlay-main{left:300px;opacity:.4}.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-menu-items .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-tablet .wp-full-overlay-main{left:64%}#customize-outer-theme-controls li.notice{padding-top:8px;padding-bottom:8px;margin-left:0;margin-bottom:10px}#publish-settings{text-indent:0;border-radius:0 3px 3px 0;padding-left:0;padding-right:0;box-shadow:none;font-size:14px;width:30px;float:left;transform:none;margin-top:0;line-height:2}body.trashing #customize-save-button-wrapper .save,body.trashing #publish-settings,body:not(.ready) #publish-settings{display:none}#customize-header-actions .spinner{margin-top:13px;margin-right:4px}.saving #customize-header-actions .spinner,.trashing #customize-header-actions .spinner{visibility:visible}#customize-header-actions{border-bottom:1px solid #ddd}#customize-controls .wp-full-overlay-sidebar-content{overflow-y:auto;overflow-x:hidden}.outer-section-open #customize-controls .wp-full-overlay-sidebar-content{background:#eee}#customize-controls .customize-info{border:none;border-bottom:1px solid #ddd;margin-bottom:15px}#customize-control-changeset_preview_link input,#customize-control-changeset_status .customize-inside-control-row{background-color:#fff;border-bottom:1px solid #ddd;box-sizing:content-box;width:100%;margin-left:-12px;padding-left:12px;padding-right:12px}#customize-control-trash_changeset{margin-top:20px}#customize-control-trash_changeset .button-link{position:relative;padding-left:24px;display:inline-block}#customize-control-trash_changeset .button-link:before{content:"\f182";font:normal 22px dashicons;text-decoration:none;position:absolute;left:0;top:-2px}#customize-controls .date-input:invalid{border-color:#dc3232}#customize-control-changeset_status .customize-inside-control-row{padding-top:10px;padding-bottom:10px;font-weight:500}#customize-control-changeset_status .customize-inside-control-row:first-of-type{border-top:1px solid #ddd}#customize-control-changeset_status .customize-control-title{margin-bottom:6px}#customize-control-changeset_status input{margin-left:0}#customize-control-changeset_preview_link{position:relative;display:block}.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button{margin:0;position:absolute;bottom:9px;right:0}.preview-link-wrapper{position:relative}.customize-copy-preview-link:after,.customize-copy-preview-link:before{content:"";height:28px;position:absolute;background:#fff;top:-1px}.customize-copy-preview-link:before{left:-10px;width:9px;opacity:.75}.customize-copy-preview-link:after{left:-5px;width:4px;opacity:.8}#customize-control-changeset_preview_link input{line-height:2.85714286;border-top:1px solid #ddd;border-left:none;border-right:none;text-indent:-999px;color:#fff;min-height:40px}#customize-control-changeset_preview_link label{position:relative;display:block}#customize-control-changeset_preview_link a{display:inline-block;position:absolute;white-space:nowrap;overflow:hidden;width:90%;bottom:14px;font-size:14px;text-decoration:none}#customize-control-changeset_preview_link a.disabled,#customize-control-changeset_preview_link a.disabled:active,#customize-control-changeset_preview_link a.disabled:focus,#customize-control-changeset_preview_link a.disabled:visited{color:#000;opacity:.4;cursor:default;outline:0;box-shadow:none}#sub-accordion-section-publish_settings .customize-section-description-container{display:none}#customize-controls .customize-info.section-meta{margin-bottom:15px}.customize-control-date_time .customize-control-description+.date-time-fields.includes-time{margin-top:10px}.customize-control.customize-control-date_time .date-time-fields .date-input.day{margin-right:0}.date-time-fields .date-input.month{width:auto;margin:0}.date-time-fields .date-input.day,.date-time-fields .date-input.hour,.date-time-fields .date-input.minute{width:46px}.date-time-fields .date-input.year{width:65px}.date-time-fields .date-input.meridian{width:auto;margin:0}.date-time-fields .time-row{margin-top:12px}#customize-control-changeset_preview_link{margin-top:6px}#customize-control-changeset_status{margin-bottom:0;padding-bottom:0}#customize-control-changeset_scheduled_date{box-sizing:content-box;width:100%;margin-left:-12px;padding:12px;background:#fff;border-bottom:1px solid #ddd;margin-bottom:0}#customize-control-changeset_scheduled_date .customize-control-description{font-style:normal}#customize-controls .customize-info.is-in-view,#customize-controls .customize-section-title.is-in-view{position:absolute;z-index:9;width:100%;box-shadow:0 1px 0 rgba(0,0,0,.1)}#customize-controls .customize-section-title.is-in-view{margin-top:0}#customize-controls .customize-info.is-in-view+.accordion-section{margin-top:15px}#customize-controls .customize-info.is-sticky,#customize-controls .customize-section-title.is-sticky{position:fixed;top:46px}#customize-controls .customize-info .accordion-section-title{background:#fff;color:#555d66;border-left:none;border-right:none;border-bottom:none;cursor:default}#customize-controls .customize-info .accordion-section-title:focus:after,#customize-controls .customize-info .accordion-section-title:hover:after,#customize-controls .customize-info.open .accordion-section-title:after{color:#32373c}#customize-controls .customize-info .accordion-section-title:after{display:none}#customize-controls .customize-info .preview-notice{font-size:13px;line-height:1.9}#customize-controls .customize-info .panel-title,#customize-controls .customize-pane-child .customize-section-title h3,#customize-controls .customize-pane-child h3.customize-section-title,#customize-outer-theme-controls .customize-pane-child .customize-section-title h3,#customize-outer-theme-controls .customize-pane-child h3.customize-section-title{font-size:20px;font-weight:200;line-height:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#customize-controls .customize-section-title span.customize-action{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#customize-controls .customize-info .customize-help-toggle{position:absolute;top:4px;right:1px;padding:20px 20px 10px 10px;width:20px;height:20px;cursor:pointer;box-shadow:none;-webkit-appearance:none;background:0 0;color:#555d66;border:none}#customize-controls .customize-info .customize-help-toggle:before{position:absolute;top:5px;left:6px}#customize-controls .customize-info .customize-help-toggle:focus,#customize-controls .customize-info .customize-help-toggle:hover,#customize-controls .customize-info.open .customize-help-toggle{color:#0073aa}#customize-controls .customize-info .customize-panel-description,#customize-controls .customize-info .customize-section-description,#customize-controls .no-widget-areas-rendered-notice,#customize-outer-theme-controls .customize-info .customize-section-description{color:#555d66;display:none;background:#fff;padding:12px 15px;border-top:1px solid #ddd}#customize-controls .customize-info .customize-panel-description.open+.no-widget-areas-rendered-notice{border-top:none}.no-widget-areas-rendered-notice{font-style:italic}.no-widget-areas-rendered-notice p:first-child{margin-top:0}.no-widget-areas-rendered-notice p:last-child{margin-bottom:0}#customize-controls .customize-info .customize-section-description{margin-bottom:15px}#customize-controls .customize-info .customize-panel-description p:first-child,#customize-controls .customize-info .customize-section-description p:first-child{margin-top:0}#customize-controls .customize-info .customize-panel-description p:last-child,#customize-controls .customize-info .customize-section-description p:last-child{margin-bottom:0}#customize-controls .current-panel .control-section>h3.accordion-section-title{padding-right:30px}#customize-outer-theme-controls .control-section,#customize-theme-controls .control-section{border:none}#customize-outer-theme-controls .accordion-section-title,#customize-theme-controls .accordion-section-title{color:#555d66;background-color:#fff;border-bottom:1px solid #ddd;border-left:4px solid #fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}#customize-controls #customize-theme-controls .customize-themes-panel .accordion-section-title{color:#555;background-color:#fff;border-left:4px solid #fff}#customize-outer-theme-controls .accordion-section-title:after,#customize-theme-controls .accordion-section-title:after{content:"\f345";color:#a0a5aa}#customize-outer-theme-controls .accordion-section-content,#customize-theme-controls .accordion-section-content{color:#555d66;background:0 0}#customize-controls .control-section .accordion-section-title:focus,#customize-controls .control-section .accordion-section-title:hover,#customize-controls .control-section.open .accordion-section-title,#customize-controls .control-section:hover>.accordion-section-title{color:#0073aa;background:#f3f3f5;border-left-color:#0073aa}#accordion-section-themes+.control-section{border-top:1px solid #ddd}.js .control-section .accordion-section-title:focus,.js .control-section .accordion-section-title:hover,.js .control-section.open .accordion-section-title,.js .control-section:hover .accordion-section-title{background:#f3f3f5}#customize-outer-theme-controls .control-section .accordion-section-title:focus:after,#customize-outer-theme-controls .control-section .accordion-section-title:hover:after,#customize-outer-theme-controls .control-section.open .accordion-section-title:after,#customize-outer-theme-controls .control-section:hover>.accordion-section-title:after,#customize-theme-controls .control-section .accordion-section-title:focus:after,#customize-theme-controls .control-section .accordion-section-title:hover:after,#customize-theme-controls .control-section.open .accordion-section-title:after,#customize-theme-controls .control-section:hover>.accordion-section-title:after{color:#0073aa}#customize-theme-controls .control-section.open{border-bottom:1px solid #eee}#customize-outer-theme-controls .control-section.open .accordion-section-title,#customize-theme-controls .control-section.open .accordion-section-title{border-bottom-color:#eee!important}#customize-theme-controls .control-section:last-of-type.open,#customize-theme-controls .control-section:last-of-type>.accordion-section-title{border-bottom-color:#ddd}#customize-theme-controls .control-panel-content:not(.control-panel-nav_menus) .control-section:nth-child(2),#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu,#customize-theme-controls .control-section-nav_menu_locations .accordion-section-title{border-top:1px solid #ddd}#customize-theme-controls .control-panel-nav_menus .control-section-nav_menu+.control-section-nav_menu{border-top:none}#customize-theme-controls>ul{margin:0}#customize-theme-controls .accordion-section-content{position:absolute;top:0;left:100%;width:100%;margin:0;padding:12px;box-sizing:border-box}#customize-info,#customize-theme-controls .customize-pane-child,#customize-theme-controls .customize-pane-parent{overflow:visible;width:100%;margin:0;padding:0;box-sizing:border-box;transition:.18s transform cubic-bezier(.645,.045,.355,1)}#customize-theme-controls .customize-pane-child.skip-transition{transition:none}#customize-info,#customize-theme-controls .customize-pane-parent{position:relative;visibility:visible;height:auto;max-height:none;overflow:auto;transform:none}#customize-theme-controls .customize-pane-child{position:absolute;top:0;left:0;visibility:hidden;height:0;max-height:none;overflow:hidden;transform:translateX(100%)}#customize-theme-controls .customize-pane-child.current-panel,#customize-theme-controls .customize-pane-child.open{transform:none}.in-sub-panel #customize-info,.in-sub-panel #customize-theme-controls .customize-pane-parent,.in-sub-panel.section-open #customize-theme-controls .customize-pane-child.current-panel,.section-open #customize-info,.section-open #customize-theme-controls .customize-pane-parent{visibility:hidden;height:0;overflow:hidden;transform:translateX(-100%)}#customize-theme-controls .customize-pane-child.busy,#customize-theme-controls .customize-pane-child.current-panel,#customize-theme-controls .customize-pane-child.open,.busy.section-open.in-sub-panel #customize-theme-controls .customize-pane-child.current-panel,.in-sub-panel #customize-info.busy,.in-sub-panel #customize-theme-controls .customize-pane-parent.busy,.section-open #customize-info.busy,.section-open #customize-theme-controls .customize-pane-parent.busy{visibility:visible;height:auto;overflow:auto}#customize-theme-controls .customize-pane-child.accordion-section-content,#customize-theme-controls .customize-pane-child.accordion-sub-container{display:block;overflow-x:hidden}#customize-theme-controls .customize-pane-child.accordion-section-content{padding:12px}#customize-theme-controls .customize-pane-child.menu li{position:static}.control-section-nav_menu .customize-section-description-container,.control-section-new_menu .customize-section-description-container,.customize-section-description-container{margin-bottom:15px}.control-section-nav_menu .customize-control,.control-section-new_menu .customize-control{margin-bottom:0}.customize-section-title{margin:-12px -12px 0 -12px;border-bottom:1px solid #ddd;background:#fff}div.customize-section-description{margin-top:22px}.customize-info div.customize-section-description{margin-top:0}div.customize-section-description p:first-child{margin-top:0}div.customize-section-description p:last-child{margin-bottom:0}#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child{border-bottom:1px solid #ddd;padding:12px 12px 12px 12px}.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child{padding:12px 12px 13px 12px}.customize-section-title h3,h3.customize-section-title{padding:10px 10px 12px 14px;margin:0;line-height:21px;color:#555d66}.accordion-sub-container.control-panel-content{display:none;position:absolute;top:0;width:100%}.accordion-sub-container.control-panel-content.busy{display:block}.current-panel .accordion-sub-container.control-panel-content{width:100%}.customize-controls-close{display:block;position:absolute;top:0;left:0;width:45px;height:41px;padding:0 2px 0 0;background:#eee;border:none;border-top:4px solid #eee;border-right:1px solid #ddd;color:#444;text-align:left;cursor:pointer;transition:color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out;box-sizing:content-box}.customize-panel-back,.customize-section-back{display:block;float:left;width:48px;height:71px;padding:0 24px 0 0;margin:0;background:#fff;border:none;border-right:1px solid #ddd;border-left:4px solid #fff;box-shadow:none;cursor:pointer;transition:color .15s ease-in-out,border-color .15s ease-in-out,background .15s ease-in-out}.customize-section-back{height:74px}.ios .customize-panel-back{display:none}.ios .expanded.in-sub-panel .customize-panel-back{display:block}#customize-controls .panel-meta.customize-info .accordion-section-title{margin-left:48px;border-left:none}#customize-controls .cannot-expand:hover .accordion-section-title,#customize-controls .panel-meta.customize-info .accordion-section-title:hover{background:#fff;color:#555d66;border-left-color:#fff}.customize-controls-close:focus,.customize-controls-close:hover,.customize-controls-preview-toggle:focus,.customize-controls-preview-toggle:hover{background:#fff;color:#0073aa;border-top-color:#0073aa;outline:0;box-shadow:none}.customize-panel-back:focus,.customize-panel-back:hover,.customize-section-back:focus,.customize-section-back:hover{color:#0073aa;background:#f3f3f5;border-left-color:#0073aa;outline:0;box-shadow:none}.customize-controls-close:before{font:normal 22px/45px dashicons;content:"\f335";position:relative;top:-3px;left:13px}.customize-panel-back:before,.customize-section-back:before{font:normal 20px/72px dashicons;content:"\f341";position:relative;left:9px}.wp-full-overlay-sidebar .wp-full-overlay-header{background-color:#eee;transition:padding ease-in-out .18s}.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header{padding-left:62px}p.customize-section-description{font-style:normal;margin-top:22px;margin-bottom:0}.customize-section-description ul{margin-left:1em}.customize-section-description ul>li{list-style:disc}.section-description-buttons{text-align:right}.section-description-buttons button.button-link{color:#0073aa;text-decoration:underline}.customize-control{width:100%;float:left;clear:both;margin-bottom:12px}.customize-control input[type=email],.customize-control input[type=number],.customize-control input[type=password],.customize-control input[type=search],.customize-control input[type=tel],.customize-control input[type=text],.customize-control input[type=url]{width:100%;margin:0}.customize-control-hidden{margin:0}.customize-control-textarea textarea{width:100%;resize:vertical}.customize-control select{width:100%}.customize-control select[multiple]{height:auto}.customize-control-title{display:block;font-size:14px;line-height:1.75;font-weight:600;margin-bottom:4px}.customize-control-description{display:block;font-style:italic;line-height:1.4;margin-top:0;margin-bottom:5px}.customize-section-description a.external-link:after{font:16px/11px dashicons;content:"\f310";top:3px;position:relative;padding-left:3px;display:inline-block;text-decoration:none}.customize-control-color .color-picker,.customize-control-upload div{line-height:28px}.customize-control .customize-inside-control-row{line-height:1.6;display:block;margin-left:24px;padding-top:6px;padding-bottom:6px}.customize-control-checkbox input,.customize-control-nav_menu_auto_add input,.customize-control-radio input{margin-right:4px;margin-left:-24px}.customize-control-radio{padding:5px 0 10px}.customize-control-radio .customize-control-title{margin-bottom:0;line-height:1.6}.customize-control-radio .customize-control-title+.customize-control-description{margin-top:7px}.customize-control-checkbox label,.customize-control-radio label{vertical-align:top}.customize-control .attachment-thumb.type-icon{float:left;margin:10px;width:auto}.customize-control .attachment-title{font-weight:600;margin:0;padding:5px 10px}.customize-control .attachment-meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0;padding:0 10px}.customize-control .attachment-meta-title{padding-top:7px}.customize-control .thumbnail-image,.customize-control .wp-media-wrapper.wp-video,.customize-control-header .current{line-height:0}.customize-control-site_icon .favicon-preview .browser-preview{vertical-align:top}.customize-control .thumbnail-image img{cursor:pointer}#customize-controls .thumbnail-audio .thumbnail{max-width:64px;max-height:64px;margin:10px;float:left}#available-menu-items .accordion-section-content .new-content-item,.customize-control-dropdown-pages .new-content-item{width:calc(100% - 30px);padding:8px 15px;position:absolute;bottom:0;z-index:10;background:#eee;display:flex}.customize-control-dropdown-pages .new-content-item{width:100%;padding:5px 0 5px 1px;position:relative}#available-menu-items .new-content-item .create-item-input,.customize-control-dropdown-pages .new-content-item .create-item-input{flex-grow:10}#available-menu-items .new-content-item .add-content,.customize-control-dropdown-pages .new-content-item .add-content{margin:2px 0 2px 6px;flex-grow:1}.customize-control-dropdown-pages .new-content-item .create-item-input.invalid{border:1px solid #dc3232}.customize-control-dropdown-pages .add-new-toggle{margin-left:1px;font-weight:600;line-height:2.2}#customize-preview iframe{width:100%;height:100%;position:absolute}#customize-preview iframe+iframe{visibility:hidden}.wp-full-overlay-sidebar{background:#eee;border-right:1px solid #ddd}#customize-controls .customize-control-notifications-container{margin:4px 0 8px 0;padding:0;cursor:default}#customize-controls .customize-control-widget_form.has-error .widget .widget-top,.customize-control-nav_menu_item.has-error .menu-item-bar .menu-item-handle{box-shadow:inset 0 0 0 2px #dc3232;transition:.15s box-shadow linear}#customize-controls .customize-control-notifications-container li.notice{list-style:none;margin:0 0 6px 0;padding:9px 14px;overflow:hidden}#customize-controls .customize-control-notifications-container .notice.is-dismissible{padding-right:38px}.customize-control-notifications-container li.notice:last-child{margin-bottom:0}#customize-controls .customize-control-nav_menu_item .customize-control-notifications-container{margin-top:0}#customize-controls .customize-control-widget_form .customize-control-notifications-container{margin-top:8px}.customize-control-text.has-error input{outline:2px solid #dc3232}#customize-controls #customize-notifications-area{position:absolute;top:46px;width:100%;border-bottom:1px solid #ddd;display:block;padding:0;margin:0}.wp-full-overlay.collapsed #customize-controls #customize-notifications-area{display:none!important}#customize-controls #customize-notifications-area:not(.has-overlay-notifications),#customize-controls .customize-section-title>.customize-control-notifications-container:not(.has-overlay-notifications),#customize-controls .panel-meta>.customize-control-notifications-container:not(.has-overlay-notifications){max-height:210px;overflow-x:hidden;overflow-y:auto}#customize-controls #customize-notifications-area .notice,#customize-controls #customize-notifications-area>ul,#customize-controls .customize-section-title>.customize-control-notifications-container,#customize-controls .customize-section-title>.customize-control-notifications-container .notice,#customize-controls .panel-meta>.customize-control-notifications-container,#customize-controls .panel-meta>.customize-control-notifications-container .notice{margin:0}#customize-controls .customize-section-title>.customize-control-notifications-container,#customize-controls .panel-meta>.customize-control-notifications-container{border-top:1px solid #ddd}#customize-controls #customize-notifications-area .notice,#customize-controls .customize-section-title>.customize-control-notifications-container .notice,#customize-controls .panel-meta>.customize-control-notifications-container .notice{padding:9px 14px}#customize-controls #customize-notifications-area .notice.is-dismissible,#customize-controls .customize-section-title>.customize-control-notifications-container .notice.is-dismissible,#customize-controls .panel-meta>.customize-control-notifications-container .notice.is-dismissible{padding-right:38px}#customize-controls #customize-notifications-area .notice+.notice,#customize-controls .customize-section-title>.customize-control-notifications-container .notice+.notice,#customize-controls .panel-meta>.customize-control-notifications-container .notice+.notice{margin-top:1px}@keyframes customize-fade-in{0%{opacity:0}100%{opacity:1}}#customize-controls #customize-notifications-area .notice.notification-overlay,#customize-controls .notice.notification-overlay{margin:0;border-left:0}#customize-controls .customize-control-notifications-container.has-overlay-notifications{animation:customize-fade-in .5s;z-index:30}#customize-controls #customize-notifications-area .notice.notification-overlay .notification-message{clear:both;color:#191e23;font-size:18px;font-style:normal;margin:0;padding:2em 0;text-align:center;width:100%;display:block;top:50%;position:relative}#customize-control-show_on_front.has-error{margin-bottom:0}#customize-control-show_on_front.has-error .customize-control-notifications-container{margin-top:12px}.accordion-section .dropdown{float:left;display:block;position:relative;cursor:pointer}.accordion-section .dropdown-content{overflow:hidden;float:left;min-width:30px;height:16px;line-height:16px;margin-right:16px;padding:4px 5px;border:2px solid #eee;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.customize-control .dropdown-arrow{position:absolute;top:0;bottom:0;right:0;width:20px;background:#eee}.customize-control .dropdown-arrow:after{content:"\f140";font:normal 20px/1 dashicons;speak:none;display:block;padding:0;text-indent:0;text-align:center;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#32373c}.customize-control .dropdown-status{color:#32373c;background:#eee;display:none;max-width:112px}.customize-control-color .dropdown{margin-right:5px;margin-bottom:5px}.customize-control-color .dropdown .dropdown-content{background-color:#555d66;border:1px solid rgba(0,0,0,.15)}.customize-control-color .dropdown:hover .dropdown-content{border-color:rgba(0,0,0,.25)}.ios .wp-full-overlay{position:relative}.ios #customize-controls .wp-full-overlay-sidebar-content{-webkit-overflow-scrolling:touch}.customize-control .actions .button{margin-top:12px}.customize-control-header .actions,.customize-control-header .uploaded{margin-bottom:18px}.customize-control-header .default button:not(.random),.customize-control-header .uploaded button:not(.random){width:100%;padding:0;margin:0;background:0 0;border:none;color:inherit;cursor:pointer}.customize-control-header button img{display:block}.customize-control .attachment-media-view .default-button,.customize-control .attachment-media-view .remove-button,.customize-control .attachment-media-view .upload-button,.customize-control-header button.new,.customize-control-header button.remove{width:auto;height:auto;white-space:normal}.customize-control .attachment-media-view .thumbnail,.customize-control-header .current .container{overflow:hidden}.customize-control .attachment-media-view .button-add-media,.customize-control .attachment-media-view .placeholder,.customize-control-header .placeholder{width:100%;position:relative;text-align:center;cursor:default;border:1px dashed #b4b9be;box-sizing:border-box;padding:9px 0;line-height:1.6}.customize-control .attachment-media-view .button-add-media{cursor:pointer;background-color:#edeff0;color:#32373c}.customize-control .attachment-media-view .button-add-media:hover{background-color:#fbfbfc}.customize-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-color:#007cba;border-style:solid;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.customize-control-header .inner{display:none;position:absolute;width:100%;color:#555d66;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.customize-control-header .inner,.customize-control-header .inner .dashicons{line-height:20px;top:8px}.customize-control-header .list .inner,.customize-control-header .list .inner .dashicons{top:9px}.customize-control-header .header-view{position:relative;width:100%;margin-bottom:12px}.customize-control-header .header-view:last-child{margin-bottom:0}.customize-control-header .header-view:after{border:0}.customize-control-header .header-view.selected .choice:focus{outline:0}.customize-control-header .header-view.selected:after{content:"";position:absolute;height:auto;top:0;left:0;bottom:0;right:0;border:4px solid #00a0d2;border-radius:2px}.customize-control-header .header-view.button.selected{border:0}.customize-control-header .uploaded .header-view .close{font-size:20px;color:#fff;background:#555d66;background:rgba(0,0,0,.5);position:absolute;top:10px;left:-999px;z-index:1;width:26px;height:26px;cursor:pointer}.customize-control-header .header-view .close:focus,.customize-control-header .header-view:hover .close{left:auto;right:10px}.customize-control-header .header-view .close:focus{outline:1px solid #5b9dd9}.customize-control-header .random.placeholder{cursor:pointer;border-radius:2px;height:40px}.customize-control-header button.random{width:100%;height:auto;min-height:40px;white-space:normal}.customize-control-header button.random .dice{margin-top:4px}.customize-control-header .header-view:hover>button.random .dice,.customize-control-header .placeholder:hover .dice{animation:dice-color-change 3s infinite}.button-see-me{animation:bounce .7s 1;transform-origin:center bottom}@keyframes bounce{20%,53%,80%,from,to{animation-timing-function:cubic-bezier(.215,.61,.355,1);transform:translate3d(0,0,0)}40%,43%{animation-timing-function:cubic-bezier(.755,.050,.855,.060);transform:translate3d(0,-12px,0)}70%{animation-timing-function:cubic-bezier(.755,.050,.855,.060);transform:translate3d(0,-6px,0)}90%{transform:translate3d(0,-1px,0)}}.customize-control-header .choice{position:relative;display:block;margin-bottom:9px}.customize-control-header .choice:focus{outline:0;box-shadow:0 0 0 1px #5b9dd9,0 0 3px 1px rgba(30,140,190,.8)}.customize-control-header .uploaded div:last-child>.choice{margin-bottom:0}.customize-control .attachment-media-view .thumbnail-image img,.customize-control-header img{max-width:100%}.customize-control .attachment-media-view .default-button,.customize-control .attachment-media-view .remove-button,.customize-control-header .remove{margin-right:8px}.customize-control-background_position .background-position-control .button-group{display:block}.customize-control-code_editor textarea{width:100%;font-family:Consolas,Monaco,monospace;font-size:12px;padding:6px 8px;-moz-tab-size:2;-o-tab-size:2;tab-size:2}.customize-control-code_editor .CodeMirror,.customize-control-code_editor textarea{height:14em}#customize-controls .customize-section-description-container.section-meta.customize-info{border-bottom:none}#sub-accordion-section-custom_css .customize-control-notifications-container{margin-bottom:15px}#customize-control-custom_css textarea{display:block;height:500px}.customize-section-description-container+#customize-control-custom_css .customize-control-title{margin-left:12px}.customize-section-description-container+#customize-control-custom_css:last-child textarea{border-right:0;border-left:0;height:calc(100vh - 185px);resize:none}.customize-section-description-container+#customize-control-custom_css:last-child{margin-left:-12px;width:299px;width:calc(100% + 24px);margin-bottom:-12px}.customize-section-description-container+#customize-control-custom_css:last-child .CodeMirror{height:calc(100vh - 185px)}.CodeMirror-hints,.CodeMirror-lint-tooltip{z-index:500000!important}.customize-section-description-container+#customize-control-custom_css:last-child .customize-control-notifications-container{margin-left:12px;margin-right:12px}.theme-browser .theme.active .theme-actions,.wp-customizer .theme-browser .theme .theme-actions{padding:9px 15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}@media screen and (max-width:640px){.customize-section-description-container+#customize-control-custom_css:last-child{margin-right:0}.customize-section-description-container+#customize-control-custom_css:last-child textarea{height:calc(100vh - 140px)}}#customize-theme-controls .control-panel-themes{border-bottom:none}#customize-theme-controls .control-panel-themes>.accordion-section-title,#customize-theme-controls .control-panel-themes>.accordion-section-title:hover{cursor:default;background:#fff;color:#555d66;border-top:1px solid #ddd;border-bottom:1px solid #ddd;border-left:none;border-right:none;margin:0 0 15px 0;padding-right:100px}#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child,#customize-theme-controls .control-section-themes .customize-themes-panel .accordion-section-title:first-child:hover{border-top:0}#customize-theme-controls .control-section-themes>.accordion-section-title,#customize-theme-controls .control-section-themes>.accordion-section-title:hover{margin:0 0 15px}#customize-controls .customize-themes-panel .accordion-section-title,#customize-controls .customize-themes-panel .accordion-section-title:hover{margin:15px -8px}#customize-controls .control-section-themes .accordion-section-title,#customize-controls .customize-themes-panel .accordion-section-title{padding-right:100px}#customize-controls .control-section-themes .accordion-section-title span.customize-action,#customize-controls .customize-section-title span.customize-action,.control-panel-themes .accordion-section-title span.customize-action{font-size:13px;display:block;font-weight:400}#customize-theme-controls .control-panel-themes .accordion-section-title .change-theme{position:absolute;right:10px;top:50%;margin-top:-14px;font-weight:400}#customize-theme-controls .control-panel-themes>.accordion-section-title:after{display:none}.control-panel-themes .customize-themes-full-container{position:fixed;top:0;left:0;transition:.18s left ease-in-out;margin:0 0 0 300px;padding:71px 0 25px;overflow-y:scroll;width:calc(100% - 300px);height:calc(100% - 96px);background:#eee;z-index:20}@media screen and (min-width:1670px){.control-panel-themes .customize-themes-full-container{width:82%;right:0;left:initial}}.modal-open .control-panel-themes .customize-themes-full-container{overflow-y:visible}#customize-header-actions .customize-controls-preview-toggle,#customize-header-actions .spinner,#customize-save-button-wrapper{transition:.18s margin ease-in-out}#customize-footer-actions,#customize-footer-actions .collapse-sidebar{bottom:0;transition:.18s bottom ease-in-out}.in-themes-panel:not(.animating) #customize-footer-actions,.in-themes-panel:not(.animating) #customize-header-actions .customize-controls-preview-toggle,.in-themes-panel:not(.animating) #customize-header-actions .spinner,.in-themes-panel:not(.animating) #customize-preview{visibility:hidden}.wp-full-overlay.in-themes-panel{background:#eee}.in-themes-panel #customize-header-actions .customize-controls-preview-toggle,.in-themes-panel #customize-header-actions .spinner,.in-themes-panel #customize-save-button-wrapper{margin-top:-46px}.in-themes-panel #customize-footer-actions,.in-themes-panel #customize-footer-actions .collapse-sidebar{bottom:-45px}.in-themes-panel.animating .control-panel-themes .filter-themes-count{display:none}.in-themes-panel.wp-full-overlay .wp-full-overlay-sidebar-content{bottom:0}.themes-filter-bar .feature-filter-toggle{float:right;margin:3px 0 3px 25px}.themes-filter-bar .feature-filter-toggle:before{content:"\f111";margin:0 5px 0 0;font:normal 16px/1 dashicons;vertical-align:text-bottom;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.themes-filter-bar .feature-filter-toggle.open{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.themes-filter-bar .feature-filter-toggle .filter-count-filters{display:none}.filter-drawer{box-sizing:border-box;width:100%;position:absolute;top:46px;left:0;padding:25px 0 25px 25px;border-top:0;margin:0;background:#eee;border-bottom:1px solid #ddd}.filter-drawer .filter-group{margin:0 25px 0 0;width:calc((100% - 75px)/ 3);min-width:200px;max-width:320px}@keyframes themes-fade-in{0%{opacity:0}50%{opacity:0}100%{opacity:1}}.control-panel-themes .customize-themes-full-container.animate{animation:.6s themes-fade-in 1}.in-themes-panel:not(.animating) .control-panel-themes .filter-themes-count{animation:.6s themes-fade-in 1}.control-panel-themes .filter-themes-count{position:relative;float:right;line-height:2.6}.control-panel-themes .filter-themes-count .themes-displayed{font-weight:600;color:#555d66}.customize-themes-notifications{margin:0}.control-panel-themes .customize-themes-notifications .notice{margin:0 0 25px 0}.customize-themes-full-container .customize-themes-section{display:none!important;overflow:hidden}.customize-themes-full-container .customize-themes-section.current-section{display:list-item!important}.control-section .customize-section-text-before{padding:0 0 8px 15px;margin:15px 0 0 0;line-height:16px;border-bottom:1px solid #ddd;color:#555d66}.control-panel-themes .customize-themes-section-title{width:100%;background:#fff;box-shadow:none;outline:0;border-top:none;border-bottom:1px solid #ddd;border-left:4px solid #fff;border-right:none;cursor:pointer;padding:10px 15px;position:relative;text-align:left;font-size:14px;font-weight:600;color:#555d66;text-shadow:none}.control-panel-themes #accordion-section-installed_themes{border-top:1px solid #ddd}.control-panel-themes .theme-section{margin:0;position:relative}.control-panel-themes .customize-themes-section-title:focus,.control-panel-themes .customize-themes-section-title:hover{border-left-color:#0073aa;color:#0073aa;background:#f5f5f5}.customize-themes-section-title:not(.selected):after{content:"";display:block;position:absolute;top:9px;right:15px;width:18px;height:18px;border-radius:100%;border:1px solid #ccc;background:#fff}.control-panel-themes .theme-section .customize-themes-section-title.selected:after{content:"\f147";font:16px/1 dashicons;box-sizing:border-box;width:20px;height:20px;padding:3px 3px 1px 1px;border-radius:100%;position:absolute;top:9px;right:15px;background:#0073aa;color:#fff}.control-panel-themes .customize-themes-section-title.selected{color:#0073aa}#customize-theme-controls .themes.accordion-section-content{position:relative;left:0;padding:0;width:100%}.loading .customize-themes-section .spinner{display:block;visibility:visible;position:relative;clear:both;width:20px;height:20px;left:calc(50% - 10px);float:none;margin-top:50px}.customize-themes-section .no-themes,.customize-themes-section .no-themes-local{display:none}.themes-section-installed_themes .theme .notice-success:not(.updated-message){display:none}.customize-control-theme .theme{width:100%;margin:0;border:1px solid #ddd;background:#fff}.customize-control-theme .theme .theme-actions,.customize-control-theme .theme .theme-name{background:#fff;border:none}.customize-control.customize-control-theme{box-sizing:border-box;width:25%;max-width:600px;margin:0 25px 25px 0;padding:0;clear:none}@media screen and (min-width:2101px){.customize-control.customize-control-theme{width:calc((100% - 125px)/ 5 - 1px)}}@media screen and (min-width:1601px) and (max-width:2100px){.customize-control.customize-control-theme{width:calc((100% - 100px)/ 4 - 1px)}}@media screen and (min-width:1201px) and (max-width:1600px){.customize-control.customize-control-theme{width:calc((100% - 75px)/ 3 - 1px)}}@media screen and (min-width:851px) and (max-width:1200px){.customize-control.customize-control-theme{width:calc((100% - 50px)/ 2 - 1px)}}@media screen and (max-width:850px){.customize-control.customize-control-theme{width:100%}}.wp-customizer .theme-browser .themes{padding:0 0 25px 25px;transition:.18s margin-top linear}.wp-customizer .theme-browser .theme .theme-actions{opacity:1}#customize-controls h3.theme-name{font-size:15px}#customize-controls .theme-overlay .theme-name{font-size:32px}.customize-preview-header.themes-filter-bar{position:fixed;top:0;left:300px;width:calc(100% - 300px);height:46px;background:#eee;z-index:10;padding:6px 25px;box-sizing:border-box;border-bottom:1px solid #ddd}@media screen and (min-width:1670px){.customize-preview-header.themes-filter-bar{width:82%;right:0;left:initial}}.themes-filter-bar .themes-filter-container{margin:0;padding:0}.themes-filter-bar .wp-filter-search{line-height:1.8;padding:6px 10px 6px 30px;max-width:100%;width:40%;min-width:300px;position:absolute;top:6px;left:25px;height:32px;margin:1px 0}@media screen and (max-height:540px),screen and (max-width:1018px){.customize-preview-header.themes-filter-bar{position:relative;left:0;width:100%;margin:0 0 25px 0}.filter-drawer{top:46px}.wp-customizer .theme-browser .themes{padding:0 0 25px 25px;overflow:hidden}.control-panel-themes .customize-themes-full-container{margin-top:0;padding:0;height:100%;width:calc(100% - 300px)}}@media screen and (max-width:1018px){.filter-drawer .filter-group{width:calc((100% - 50px)/ 2)}}@media screen and (max-width:900px){.customize-preview-header.themes-filter-bar{height:86px;padding-top:46px}.themes-filter-bar .wp-filter-search{width:calc(100% - 50px);margin:0;min-width:200px}.filter-drawer{top:86px}.control-panel-themes .filter-themes-count{float:left}}@media screen and (max-width:792px){.filter-drawer .filter-group{width:calc(100% - 25px)}}.control-panel-themes .customize-themes-mobile-back{display:none}@media screen and (max-width:600px){.filter-drawer{top:132px}.wp-full-overlay.showing-themes .control-panel-themes .filter-themes-count .filter-themes{display:block;float:right}.control-panel-themes .customize-themes-full-container{width:100%;margin:0;padding-top:46px;height:calc(100% - 46px);z-index:1;display:none}.showing-themes .control-panel-themes .customize-themes-full-container{display:block}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back{display:block;position:fixed;top:0;left:0;background:#eee;color:#444;border-radius:0;box-shadow:none;border:none;height:46px;width:100%;z-index:10;text-align:left;text-shadow:none;border-bottom:1px solid #ddd;border-left:4px solid transparent;margin:0;padding:0;font-size:0;overflow:hidden}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:before{left:0;top:0;height:46px;width:26px;display:block;line-height:2.3;padding:0 8px 0 8px;border-right:1px solid #ddd}.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:focus,.wp-customizer .showing-themes .control-panel-themes .customize-themes-mobile-back:hover{color:#0073aa;background:#f3f3f5;border-left-color:#0073aa;outline:0;box-shadow:none}.showing-themes #customize-header-actions{display:none}#customize-controls{width:100%}}.wp-customizer .theme-overlay{display:none}.wp-customizer.modal-open .theme-overlay{position:fixed;left:0;top:0;right:0;bottom:0;z-index:109}.wp-customizer.modal-open #customize-header-actions,.wp-customizer.modal-open .control-panel-themes .customize-themes-section-title.selected:after,.wp-customizer.modal-open .control-panel-themes .filter-themes-count{z-index:-1}.wp-full-overlay.in-themes-panel.themes-panel-expanded #customize-controls .wp-full-overlay-sidebar-content{overflow:visible}.wp-customizer .theme-overlay .theme-backdrop{background:rgba(238,238,238,.75);position:fixed;z-index:110}.wp-customizer .theme-overlay .star-rating{float:left;margin-right:8px}.wp-customizer .theme-rating .num-ratings{line-height:20px}.wp-customizer .theme-overlay .theme-wrap{left:90px;right:90px;top:45px;bottom:45px;z-index:120}.wp-customizer .theme-overlay .theme-actions{text-align:right;padding:10px 25px;background:#eee;border-top:1px solid #ddd}.wp-customizer .theme-overlay .theme-actions .theme-install.preview{margin-left:8px}.control-panel-themes .theme-actions .delete-theme{left:15px;right:auto;bottom:auto;position:absolute}.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content{overflow:visible}.wp-customizer .theme-header{background:#eee}.wp-customizer .theme-overlay .theme-header .close:before,.wp-customizer .theme-overlay .theme-header button{color:#444}.wp-customizer .theme-overlay .theme-header .close:focus,.wp-customizer .theme-overlay .theme-header .close:hover,.wp-customizer .theme-overlay .theme-header .left:focus,.wp-customizer .theme-overlay .theme-header .left:hover,.wp-customizer .theme-overlay .theme-header .right:focus,.wp-customizer .theme-overlay .theme-header .right:hover{background:#fff;border-bottom:4px solid #0073aa;color:#0073aa}.wp-customizer .theme-overlay .theme-header .close:focus:before,.wp-customizer .theme-overlay .theme-header .close:hover:before{color:#0073aa}.wp-customizer .theme-overlay .theme-header button.disabled,.wp-customizer .theme-overlay .theme-header button.disabled:focus,.wp-customizer .theme-overlay .theme-header button.disabled:hover{border-bottom:none;background:0 0;color:#ccc}@media (max-width:850px),(max-height:472px){.wp-customizer .theme-overlay .theme-wrap{left:0;right:0;top:0;bottom:0}.wp-customizer .theme-browser .themes{padding-right:25px}}body.cheatin{font-size:medium;height:auto;background:#fff;margin:50px auto 2em;padding:1em 2em;max-width:700px;min-width:0;box-shadow:0 1px 3px rgba(0,0,0,.13)}body.cheatin h1{border-bottom:1px solid #ddd;clear:both;color:#555d66;font-size:24px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:30px 0 0 0;padding:0;padding-bottom:7px}body.cheatin p{font-size:14px;line-height:1.5;margin:25px 0 20px}#customize-theme-controls .add-new-menu-item,#customize-theme-controls .add-new-widget{cursor:pointer;float:right;margin:0;margin-left:10px;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0}.reordering .add-new-menu-item,.reordering .add-new-widget{opacity:.2;pointer-events:none;cursor:not-allowed}#available-menu-items .new-content-item .add-content:before,.add-new-menu-item:before,.add-new-widget:before{content:"\f132";display:inline-block;position:relative;left:-2px;top:0;font:normal 20px/1 dashicons;vertical-align:middle;transition:all .2s;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reorder-toggle{float:right;padding:5px 8px;text-decoration:none;cursor:pointer;outline:0}.reorder,.reordering .reorder-done{display:block;padding:5px 8px}.reorder-done,.reordering .reorder{display:none}.menu-item-reorder-nav button,.widget-reorder-nav span{position:relative;overflow:hidden;float:left;display:block;width:33px;height:43px;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}.menu-item-reorder-nav button{width:30px;height:40px;background:0 0;border:none;box-shadow:none}.menu-item-reorder-nav button:before,.widget-reorder-nav span:before{display:inline-block;position:absolute;top:0;right:0;width:100%;height:100%;font:normal 20px/43px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.menu-item-reorder-nav button:focus,.menu-item-reorder-nav button:hover,.widget-reorder-nav span:focus,.widget-reorder-nav span:hover{color:#191e23;background:#eee}.menus-move-down:before,.move-widget-down:before{content:"\f347"}.menus-move-up:before,.move-widget-up:before{content:"\f343"}#customize-theme-controls .first-widget .move-widget-up,#customize-theme-controls .last-widget .move-widget-down,.move-down-disabled .menus-move-down,.move-left-disabled .menus-move-left,.move-right-disabled .menus-move-right,.move-up-disabled .menus-move-up{color:#d5d5d5;background-color:#fff;cursor:default;pointer-events:none}.wp-full-overlay-main{right:auto;width:100%}.add-menu-toggle.open,.add-menu-toggle.open:hover,.adding-menu-items .add-new-menu-item,.adding-menu-items .add-new-menu-item:hover,body.adding-widget .add-new-widget,body.adding-widget .add-new-widget:hover{background:#eee;border-color:#929793;color:#32373c;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}#accordion-section-add_menu .add-new-menu-item.open:before,.adding-menu-items .add-new-menu-item:before,body.adding-widget .add-new-widget:before{transform:rotate(45deg)}#available-menu-items,#available-widgets{position:absolute;top:0;bottom:0;left:-301px;visibility:hidden;overflow-x:hidden;overflow-y:auto;width:300px;margin:0;z-index:4;background:#eee;transition:left .18s;border-right:1px solid #ddd}#available-menu-items .customize-section-title,#available-widgets .customize-section-title{display:none}#available-widgets-list{top:60px;position:absolute;overflow:auto;bottom:0;width:100%;border-top:1px solid #ddd}.no-widgets-found #available-widgets-list{border-top:none}#available-widgets-filter{position:fixed;top:0;z-index:1;width:300px;background:#eee}#available-menu-items-search .accordion-section-title,#available-widgets-filter{padding:13px 15px;box-sizing:border-box}#available-menu-items-search input,#available-widgets-filter input{width:100%;min-height:32px;margin:1px 0;padding:0 30px}#available-menu-items-search input::-ms-clear,#available-widgets-filter input::-ms-clear{display:none}#available-menu-items-search .search-icon,#available-widgets-filter .search-icon{display:block;position:absolute;top:15px;left:16px;width:30px;height:30px;line-height:2.1;text-align:center;color:#72777c}#available-menu-items-search .clear-results,#available-widgets-filter .clear-results{position:absolute;top:15px;right:16px;width:30px;height:30px;padding:0;border:0;cursor:pointer;background:0 0;color:#a00;text-decoration:none;outline:0}#available-menu-items-search .clear-results,#available-menu-items-search.loading .clear-results.is-visible,#available-widgets-filter .clear-results{display:none}#available-menu-items-search .clear-results.is-visible,#available-widgets-filter .clear-results.is-visible{display:block}#available-menu-items-search .clear-results:before,#available-widgets-filter .clear-results:before{content:"\f335";font:normal 20px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#available-menu-items-search .clear-results:focus,#available-menu-items-search .clear-results:hover,#available-widgets-filter .clear-results:focus,#available-widgets-filter .clear-results:hover{color:#dc3232}#available-menu-items-search .clear-results:focus,#available-widgets-filter .clear-results:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}#available-menu-items-search .search-icon:after,#available-widgets-filter .search-icon:after,.themes-filter-bar .search-icon:after{content:"\f179";font:normal 20px/1 dashicons;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.themes-filter-bar .search-icon{position:absolute;top:7px;left:26px;z-index:1;color:#72777c;height:30px;width:30px;line-height:2;text-align:center}.no-widgets-found-message{display:none;margin:0;padding:0 15px;line-height:inherit}.no-widgets-found .no-widgets-found-message{display:block}#available-menu-items .item-top,#available-menu-items .item-top:hover,#available-widgets .widget-top,#available-widgets .widget-top:hover{border:none;background:0 0;box-shadow:none}#available-menu-items .item-tpl,#available-widgets .widget-tpl{position:relative;padding:15px 15px 15px 60px;background:#fff;border-bottom:1px solid #ddd;border-left:4px solid #fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out;cursor:pointer;display:none}#available-menu-items .item,#available-widgets .widget{position:static}.customize-controls-preview-toggle{display:none}@media only screen and (max-width:782px){.wp-customizer .theme:not(.active):focus .theme-actions,.wp-customizer .theme:not(.active):hover .theme-actions{display:block}.wp-customizer .theme-browser .theme.active .theme-name span{display:inline}.customize-control-header button.random .dice{margin-top:0}.customize-control-checkbox .customize-inside-control-row,.customize-control-nav_menu_auto_add .customize-inside-control-row,.customize-control-radio .customize-inside-control-row{margin-left:32px}.customize-control-checkbox input,.customize-control-nav_menu_auto_add input,.customize-control-radio input{margin-left:-32px}.customize-control input[type=checkbox]+label+br,.customize-control input[type=radio]+label+br{line-height:2.5}.customize-control .date-time-fields select{height:39px}.date-time-fields .date-input.month{width:79px}.date-time-fields .date-input.day,.date-time-fields .date-input.hour,.date-time-fields .date-input.minute{width:55px}.date-time-fields .date-input.year{width:80px}#customize-control-changeset_preview_link a{bottom:16px}.preview-link-wrapper .customize-copy-preview-link.preview-control-element.button{bottom:10px}.media-widget-control .media-widget-buttons .button.change-media,.media-widget-control .media-widget-buttons .button.edit-media,.media-widget-control .media-widget-buttons .button.select-media{margin-top:12px}.wp-core-ui .themes-filter-bar .feature-filter-toggle{margin:3px 0 3px 25px}}@media screen and (max-width:1200px){.adding-menu-items .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.adding-widget .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main,.outer-section-open .wp-full-overlay.expanded.preview-mobile .wp-full-overlay-main{left:67%}}@media screen and (max-width:640px){.wp-full-overlay.collapsed #customize-controls{margin-left:0}.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content{bottom:0}.customize-controls-preview-toggle{display:block;position:absolute;top:0;left:48px;line-height:3.2;font-size:14px;padding:0 12px;margin:0;height:45px;background:#eee;border:0;border-right:1px solid #ddd;color:#555d66;cursor:pointer;transition:color .1s ease-in-out,background .1s ease-in-out}#customize-footer-actions,.customize-controls-preview-toggle .controls,.preview-only .customize-controls-preview-toggle .preview,.preview-only .wp-full-overlay-sidebar-content{display:none}.preview-only #customize-save-button-wrapper{margin-top:-46px}.customize-controls-preview-toggle .controls:before,.customize-controls-preview-toggle .preview:before{font:normal 20px/1 dashicons;content:"\f177";position:relative;top:4px;margin-right:6px}.customize-controls-preview-toggle .controls:before{content:"\f540"}.preview-only #customize-controls{height:45px}.preview-only #customize-preview,.preview-only .customize-controls-preview-toggle .controls{display:block}.wp-core-ui.wp-customizer .button{min-height:30px;padding:0 14px;line-height:2;font-size:14px;vertical-align:middle}#customize-control-changeset_status .customize-inside-control-row{padding-top:15px}body.adding-menu-items div#available-menu-items,body.adding-widget div#available-widgets,body.outer-section-open div#customize-sidebar-outer-content{width:100%}#available-menu-items .customize-section-title,#available-widgets .customize-section-title{display:block;margin:0}#available-menu-items .customize-section-back,#available-widgets .customize-section-back{height:69px}#available-menu-items .customize-section-title h3,#available-widgets .customize-section-title h3{font-size:20px;font-weight:200;padding:9px 10px 12px 14px;margin:0;line-height:24px;color:#555d66;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#available-menu-items .customize-section-title .customize-action,#available-widgets .customize-section-title .customize-action{font-size:13px;display:block;font-weight:400;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}#available-widgets-filter{position:relative;width:100%;height:auto}#available-widgets-list{top:130px}#available-menu-items-search .clear-results,#available-menu-items-search .search-icon{top:85px}.reorder,.reordering .reorder-done{padding:8px}.wp-core-ui .themes-filter-bar .feature-filter-toggle{margin:0}}@media screen and (max-width:600px){.wp-full-overlay.expanded{margin-left:0}body.adding-menu-items div#available-menu-items,body.adding-widget div#available-widgets,body.outer-section-open div#customize-sidebar-outer-content{top:46px;z-index:10}body.wp-customizer .wp-full-overlay.expanded #customize-sidebar-outer-content{left:-100%}body.wp-customizer.outer-section-open .wp-full-overlay.expanded #customize-sidebar-outer-content{left:0}} \ No newline at end of file diff --git a/wp-admin/css/customize-nav-menus-rtl.css b/wp-admin/css/customize-nav-menus-rtl.css new file mode 100644 index 0000000..3ebde7f --- /dev/null +++ b/wp-admin/css/customize-nav-menus-rtl.css @@ -0,0 +1,888 @@ +/*! This file is auto-generated */ +#customize-theme-controls #accordion-section-menu_locations { + position: relative; + margin-top: 30px; +} + +#customize-theme-controls #accordion-section-menu_locations > .accordion-section-title { + border-bottom-color: #ddd; + margin-top: 15px; +} + +#customize-theme-controls .customize-section-title-nav_menus-heading, +#customize-theme-controls .customize-section-title-menu_locations-heading, +#customize-theme-controls .customize-section-title-menu_locations-description { + padding: 0 12px 0 12px; +} + +#customize-theme-controls .customize-control-description.customize-section-title-menu_locations-description { + /* Override the default italic style for control descriptions */ + font-style: normal; +} + +.menu-in-location, +.menu-in-locations { + display: block; + font-weight: 600; + font-size: 10px; +} + +#customize-controls .theme-location-set, +#customize-controls .control-section .accordion-section-title:focus .menu-in-location, +#customize-controls .control-section .accordion-section-title:hover .menu-in-location { + color: #555; +} + +/* The `edit-menu` and `create-menu` buttons also use the `button-link` class. */ +.customize-control-nav_menu_location .edit-menu, +.customize-control-nav_menu_location .create-menu { + margin-right: 6px; + vertical-align: middle; + line-height: 2.2; +} + +#customize-controls .customize-control-nav_menu_name { + margin-bottom: 12px; +} + +.customize-control-nav_menu_name p:last-of-type { + margin-bottom: 0; +} + +#customize-new-menu-submit { + float: left; + min-width: 85px; +} + +.wp-customizer .menu-item-bar .menu-item-handle, +.wp-customizer .menu-item-settings, +.wp-customizer .menu-item-settings .description-thin { + box-sizing: border-box; +} + +.wp-customizer .menu-item-bar { + margin: 0; +} + +.wp-customizer .menu-item-bar .menu-item-handle { + width: 100%; + background: #fff; +} + +.wp-customizer .menu-item-handle .item-title { + margin-left: 0; +} + +.wp-customizer .menu-item-handle .item-type { + padding: 1px 5px 0 21px; + float: left; + text-align: left; +} + +.wp-customizer .menu-item-handle:hover { + z-index: 8; +} + +.customize-control-nav_menu_item.has-notifications .menu-item-handle { + border-right: 4px solid #00a0d2; +} + +.wp-customizer .menu-item-settings { + max-width: 100%; + overflow: hidden; + z-index: 8; + padding: 10px; + background: #eee; + border: 1px solid #999; + border-top: none; +} + +.wp-customizer .menu-item-settings .description-thin { + width: 100%; + height: auto; + margin: 0 0 8px 0; +} + +.wp-customizer .menu-item-settings input[type="text"] { + width: 100%; +} + +.wp-customizer .menu-item-settings .submitbox { + margin: 0; + padding: 0; +} + +.wp-customizer .menu-item-settings .link-to-original { + padding: 5px 0; + border: none; + font-style: normal; + margin: 0; + width: 100%; +} + +.wp-customizer .menu-item .submitbox .submitdelete { + float: right; + margin: 6px 0 0; + padding: 0; + cursor: pointer; +} + + +/** + * Menu items reordering styles + */ + +.menu-item-reorder-nav { + display: none; + background-color: #fff; + position: absolute; + top: 0; + left: 0; +} + +.menus-move-left:before { + content: "\f345"; +} + +.menus-move-right:before { + content: "\f341"; +} + +.reordering .menu-item .item-controls, +.reordering .menu-item .item-type { + display: none; +} + +.reordering .menu-item-reorder-nav { + display: block; +} + +.customize-control input.menu-name-field { + width: 100%; /* Override the 98% default for customizer inputs, to align with the size of menu items. */ +} + +.wp-customizer .menu-item .item-edit { + position: absolute; + left: -19px; + top: 2px; + display: block; + width: 30px; + height: 38px; + margin-left: 0 !important; + box-shadow: none; + outline: none; + overflow: hidden; + cursor: pointer; + text-align: center; +} + +.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:before { + content: "\f142"; +} + +.wp-customizer .menu-item-settings p.description { + font-style: normal; +} + +.wp-customizer .menu-settings dl { + margin: 12px 0 0 0; + padding: 0; +} + +.wp-customizer .menu-settings .checkbox-input { + margin-top: 8px; +} + +.wp-customizer .menu-settings .menu-theme-locations { + border-top: 1px solid #ccc; +} + +.wp-customizer .menu-settings { + margin-top: 36px; + border-top: none; +} + +.wp-customizer .menu-location-settings { + margin-top: 12px; + border-top: none; +} + +.wp-customizer .control-section-nav_menu .menu-location-settings { + margin-top: 24px; + border-top: 1px solid #ddd; +} + +.wp-customizer .control-section-nav_menu .menu-location-settings, +.customize-control-nav_menu_auto_add { + padding-top: 12px; +} + +.menu-location-settings .customize-control-checkbox .theme-location-set { + line-height: 1; +} + +.customize-control-nav_menu_auto_add label { + vertical-align: top; +} + +.menu-location-settings .new-menu-locations-widget-note { + display: block; +} + +.customize-control-menu { + margin-top: 4px; +} + +#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle { + color: #555; +} + +/* Screen Options */ +.customize-screen-options-toggle { + background: none; + border: none; + color: #555; + cursor: pointer; + margin: 0; + padding: 20px; + position: absolute; + left: 0; + top: 30px; +} + +#customize-controls .customize-info .customize-help-toggle { + padding: 20px; +} + +#customize-controls .customize-info .customize-help-toggle:before { + padding: 4px; +} + +.customize-screen-options-toggle:hover, +.customize-screen-options-toggle:active, +.customize-screen-options-toggle:focus, +.active-menu-screen-options .customize-screen-options-toggle, +#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover, +#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active, +#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus { + color: #0073aa; +} + +.customize-screen-options-toggle:focus, +#customize-controls .customize-info .customize-help-toggle:focus { + outline: none; +} + +.customize-screen-options-toggle:before { + -moz-osx-font-smoothing: grayscale; + border: none; + content: "\f111"; + display: block; + font: 18px/1 dashicons; + padding: 5px; + text-align: center; + text-decoration: none !important; + text-indent: 0; + right: 6px; + position: absolute; + top: 6px; +} + +.customize-screen-options-toggle:focus:before, +#customize-controls .customize-info .customize-help-toggle:focus:before { + border-radius: 100%; +} + +.wp-customizer #screen-options-wrap { + display: none; + background: #fff; + border-top: 1px solid #ddd; + padding: 4px 15px 15px; +} + +.wp-customizer .metabox-prefs label { + display: block; + padding-left: 0; + line-height: 30px; +} + +/* rework the arrow indicator implementation for NVDA bug same as #32715 */ +.wp-customizer .toggle-indicator { + display: inline-block; + font-size: 20px; + line-height: 1; +} + +.rtl .wp-customizer .toggle-indicator { + text-indent: 1px; /* account for the dashicon alignment */ +} + +.wp-customizer .menu-item .item-edit .toggle-indicator:before, +#available-menu-items .accordion-section-title .toggle-indicator:before { + content: "\f140"; + display: block; + padding: 1px 0px 1px 2px; + speak: none; + border-radius: 50%; + color: #72777c; + font: normal 20px/1 dashicons; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +.control-section-nav_menu .field-link-target, +.control-section-nav_menu .field-title-attribute, +.control-section-nav_menu .field-css-classes, +.control-section-nav_menu .field-xfn, +.control-section-nav_menu .field-description { + display: none; +} + +.control-section-nav_menu.field-link-target-active .field-link-target, +.control-section-nav_menu.field-title-attribute-active .field-title-attribute, +.control-section-nav_menu.field-css-classes-active .field-css-classes, +.control-section-nav_menu.field-xfn-active .field-xfn, +.control-section-nav_menu.field-description-active .field-description { + display: block; +} + +/* WARNING: The 20px factor is hard-coded in JS. */ +.menu-item-depth-0 { margin-right: 0; } +.menu-item-depth-1 { margin-right: 20px; } +.menu-item-depth-2 { margin-right: 40px; } +.menu-item-depth-3 { margin-right: 60px; } +.menu-item-depth-4 { margin-right: 80px; } +.menu-item-depth-5 { margin-right: 100px; } +.menu-item-depth-6 { margin-right: 120px; } +.menu-item-depth-7 { margin-right: 140px; } +.menu-item-depth-8 { margin-right: 160px; } /* Not likely to be used or useful beyond this depth */ +.menu-item-depth-9 { margin-right: 180px; } +.menu-item-depth-10 { margin-right: 200px; } +.menu-item-depth-11 { margin-right: 220px; } + +/* @todo handle .menu-item-settings width */ +.menu-item-depth-0 > .menu-item-bar { margin-left: 0; } +.menu-item-depth-1 > .menu-item-bar { margin-left: 20px; } +.menu-item-depth-2 > .menu-item-bar { margin-left: 40px; } +.menu-item-depth-3 > .menu-item-bar { margin-left: 60px; } +.menu-item-depth-4 > .menu-item-bar { margin-left: 80px; } +.menu-item-depth-5 > .menu-item-bar { margin-left: 100px; } +.menu-item-depth-6 > .menu-item-bar { margin-left: 120px; } +.menu-item-depth-7 > .menu-item-bar { margin-left: 140px; } +.menu-item-depth-8 > .menu-item-bar { margin-left: 160px; } +.menu-item-depth-9 > .menu-item-bar { margin-left: 180px; } +.menu-item-depth-10 > .menu-item-bar { margin-left: 200px; } +.menu-item-depth-11 > .menu-item-bar { margin-left: 220px; } + +/* Submenu left margin. */ +.menu-item-depth-0 .menu-item-transport { margin-right: 0; } +.menu-item-depth-1 .menu-item-transport { margin-right: -20px; } +.menu-item-depth-3 .menu-item-transport { margin-right: -60px; } +.menu-item-depth-4 .menu-item-transport { margin-right: -80px; } +.menu-item-depth-2 .menu-item-transport { margin-right: -40px; } +.menu-item-depth-5 .menu-item-transport { margin-right: -100px; } +.menu-item-depth-6 .menu-item-transport { margin-right: -120px; } +.menu-item-depth-7 .menu-item-transport { margin-right: -140px; } +.menu-item-depth-8 .menu-item-transport { margin-right: -160px; } +.menu-item-depth-9 .menu-item-transport { margin-right: -180px; } +.menu-item-depth-10 .menu-item-transport { margin-right: -200px; } +.menu-item-depth-11 .menu-item-transport { margin-right: -220px; } + +/* WARNING: The 20px factor is hard-coded in JS. */ +.reordering .menu-item-depth-0 { margin-right: 0; } +.reordering .menu-item-depth-1 { margin-right: 15px; } +.reordering .menu-item-depth-2 { margin-right: 30px; } +.reordering .menu-item-depth-3 { margin-right: 45px; } +.reordering .menu-item-depth-4 { margin-right: 60px; } +.reordering .menu-item-depth-5 { margin-right: 75px; } +.reordering .menu-item-depth-6 { margin-right: 90px; } +.reordering .menu-item-depth-7 { margin-right: 105px; } +.reordering .menu-item-depth-8 { margin-right: 120px; } /* Not likely to be used or useful beyond this depth */ +.reordering .menu-item-depth-9 { margin-right: 135px; } +.reordering .menu-item-depth-10 { margin-right: 150px; } +.reordering .menu-item-depth-11 { margin-right: 165px; } + +.reordering .menu-item-depth-0 > .menu-item-bar { margin-left: 0; } +.reordering .menu-item-depth-1 > .menu-item-bar { margin-left: 15px; } +.reordering .menu-item-depth-2 > .menu-item-bar { margin-left: 30px; } +.reordering .menu-item-depth-3 > .menu-item-bar { margin-left: 45px; } +.reordering .menu-item-depth-4 > .menu-item-bar { margin-left: 60px; } +.reordering .menu-item-depth-5 > .menu-item-bar { margin-left: 75px; } +.reordering .menu-item-depth-6 > .menu-item-bar { margin-left: 90px; } +.reordering .menu-item-depth-7 > .menu-item-bar { margin-left: 105px; } +.reordering .menu-item-depth-8 > .menu-item-bar { margin-left: 120px; } +.reordering .menu-item-depth-9 > .menu-item-bar { margin-left: 135px; } +.reordering .menu-item-depth-10 > .menu-item-bar { margin-left: 150px; } +.reordering .menu-item-depth-11 > .menu-item-bar { margin-left: 165px; } + +.control-section-nav_menu.menu .menu-item-edit-active { + margin-right: 0; +} + +.control-section-nav_menu.menu .menu-item-edit-active .menu-item-bar { + margin-left: 0; +} + +.control-section-nav_menu.menu .sortable-placeholder { + margin-top: 0; + margin-bottom: 1px; + max-width: calc(100% - 2px); + float: right; + display: list-item; + border-color: #a0a5aa; +} + +.menu-item-transport li.customize-control { + float: none; +} + +.control-section-nav_menu.menu ul.menu-item-transport .menu-item-bar { + margin-top: 0; +} + +/** + * Add-menu-items mode + */ + +.adding-menu-items .control-section { + opacity: .4; +} + +.adding-menu-items .control-panel.control-section, +.adding-menu-items .control-section.open { + opacity: 1; +} + +.menu-item-bar .item-delete { + color: #a00; + position: absolute; + top: 2px; + left: -19px; + width: 30px; + height: 38px; + cursor: pointer; + display: none; +} + +.menu-item-bar .item-delete:before { + content: "\f335"; + position: absolute; + top: 9px; + right: 5px; + border-radius: 50%; + font: normal 20px/1 dashicons; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.ie8 .menu-item-bar .item-delete:before { + top: -10px; +} + +.menu-item-bar .item-delete:hover, +.menu-item-bar .item-delete:focus { + box-shadow: none; + outline: none; + color: #dc3232; +} + +.adding-menu-items .menu-item-bar .item-edit { + display: none; +} + +.adding-menu-items .menu-item-bar .item-delete { + display: block; +} + +/** + * Styles for menu-item addition panel + */ + +#available-menu-items.opening { + overflow-y: hidden; /* avoid scrollbar jitter with animating heights */ +} + +#available-menu-items #available-menu-items-search.open { + height: 100%; + border-bottom: none; +} + +#available-menu-items .accordion-section-title { + border-right: none; + border-left: none; + background: #fff; + transition: background-color 0.15s; + /* Reset the value inherited from the base .accordion-section-title style. Ticket #37589. */ + -webkit-user-select: auto; + -moz-user-select: auto; + -ms-user-select: auto; + user-select: auto; +} + +#available-menu-items .open .accordion-section-title, +#available-menu-items #available-menu-items-search .accordion-section-title { + background: #eee; +} + +/* rework the arrow indicator implementation for NVDA bug see #32715 */ +#available-menu-items .accordion-section-title:after { + content: none !important; +} + +#available-menu-items .accordion-section-title:hover .toggle-indicator:before, +#available-menu-items .button-link:hover .toggle-indicator:before, +#available-menu-items .button-link:focus .toggle-indicator:before { + color: #23282d; +} + +#available-menu-items .open .accordion-section-title .toggle-indicator:before { + content: "\f142"; + color: #23282d; +} + +#available-menu-items .available-menu-items-list { + overflow-y: auto; + max-height: 200px; /* This gets set in JS to fit the screen size, and based on # of sections. */ + background: transparent; +} + +#available-menu-items .accordion-section-title button { + display: block; + width: 28px; + height: 35px; + position: absolute; + top: 5px; + left: 5px; + box-shadow: none; + outline: none; + cursor: pointer; + text-align: center; +} + +#available-menu-items .accordion-section-title .no-items, +#available-menu-items .cannot-expand .accordion-section-title .spinner, +#available-menu-items .cannot-expand .accordion-section-title > button { + display: none; +} + +#available-menu-items-search.cannot-expand .accordion-section-title .spinner { + display: block; +} + +#available-menu-items .cannot-expand .accordion-section-title .no-items { + float: left; + color: #555d66; + font-weight: 400; + margin-right: 5px; +} + +#available-menu-items .accordion-section-content { + max-height: 290px; + margin: 0; + padding: 0; + position: relative; + background: transparent; +} + +#available-menu-items .accordion-section-content .available-menu-items-list { + margin: 0 0 45px 0; + padding: 1px 15px 15px 15px; +} + +#available-menu-items .accordion-section-content .available-menu-items-list:only-child { /* Types that do not support new items for the current user */ + margin-bottom: 0; +} + +#new-custom-menu-item .accordion-section-content { + padding: 0 15px 15px 15px; +} + +#available-menu-items .menu-item-tpl { + margin: 0; +} + +#custom-menu-item-name.invalid, +#custom-menu-item-url.invalid, +.edit-menu-item-url.invalid, +.menu-name-field.invalid, +.menu-name-field.invalid:focus, +#available-menu-items .new-content-item .create-item-input.invalid, +#available-menu-items .new-content-item .create-item-input.invalid:focus { + border: 1px solid #dc3232; +} + +#available-menu-items .menu-item-handle .item-type { + padding-left: 0; +} + +#available-menu-items .menu-item-handle .item-title { + padding-right: 20px; +} + +#available-menu-items .menu-item-handle { + cursor: pointer; +} + +#available-menu-items .menu-item-handle { + box-shadow: none; + margin-top: -1px; +} + +#available-menu-items .menu-item-handle:hover { + z-index: 1; +} + +#available-menu-items .item-title h4 { + padding: 0 0 5px; + font-size: 14px; +} + +#available-menu-items .item-add { + position: absolute; + top: 1px; + right: 1px; + color: #82878c; + width: 30px; + height: 38px; + box-shadow: none; + outline: none; + cursor: pointer; + text-align: center; +} + +#available-menu-items .menu-item-handle .item-add:focus { + color: #23282d; +} + +#available-menu-items .item-add:before { + content: "\f543"; + position: relative; + right: 2px; + top: 3px; + display: inline-block; + height: 20px; + border-radius: 50%; + font: normal 20px/1.05 dashicons; /* line height is to account for the dashicon's vertical alignment */ +} + +#available-menu-items .menu-item-handle.item-added .item-type, +#available-menu-items .menu-item-handle.item-added .item-title, +#available-menu-items .menu-item-handle.item-added:hover .item-add, +#available-menu-items .menu-item-handle.item-added .item-add:focus { + color: #82878c; +} + +#available-menu-items .menu-item-handle.item-added .item-add:before { + content: "\f147"; +} + +#available-menu-items .accordion-section-title.loading .spinner, +#available-menu-items-search.loading .accordion-section-title .spinner { + visibility: visible; + margin: 0 20px; +} + +#available-menu-items-search .spinner { + position: absolute; + top: 20px; /* 13 container padding +1 input margin +6 ( ( 32 input height - 20 spinner height ) / 2 ) */ + left: 21px; + margin: 0 !important; +} + +/* search results list */ +#available-menu-items #available-menu-items-search .accordion-section-content { + position: absolute; + right: 0; + top: 60px; /* below title div / search input */ + bottom: 0px; /* 100% height that still triggers lazy load */ + max-height: none; + width: 100%; + padding: 1px 15px 15px; + box-sizing: border-box; +} + +#available-menu-items-search .nothing-found { + /* Compensate the 1px top padding of the container. */ + margin-top: -1px; +} + +#available-menu-items-search .accordion-section-title:after { + display: none; +} + +#available-menu-items-search .accordion-section-content:empty { + min-height: 0; + padding: 0; +} + +#available-menu-items-search.loading .accordion-section-content div { + opacity: .5; +} + +#available-menu-items-search.loading.loading-more .accordion-section-content div { + opacity: 1; +} + +#customize-preview { + transition: all 0.2s; +} + +body.adding-menu-items #available-menu-items { + right: 0; + visibility: visible; +} + +body.adding-menu-items .wp-full-overlay-main { + right: 300px; +} + +body.adding-menu-items #customize-preview { + opacity: 0.4; +} + +body.adding-menu-items #customize-preview iframe { + pointer-events: none; +} + +.menu-item-handle .spinner { + display: none; + float: right; + margin: 0 0 0 8px; +} + +.nav-menu-inserted-item-loading .spinner { + display: block; +} + +.nav-menu-inserted-item-loading .menu-item-handle .item-type { + padding: 0 8px 0 0; +} + +.nav-menu-inserted-item-loading .menu-item-handle, +.added-menu-item .menu-item-handle.loading { + padding: 10px 8px 10px 15px; + cursor: default; + opacity: .5; + background: #fff; + color: #727773; +} + +.added-menu-item .menu-item-handle { + transition-property: opacity, background, color; + transition-duration: 1.25s; + transition-timing-function: cubic-bezier( .25, -2.5, .75, 8 ); /* Replacement for .hide().fadeIn('slow') in JS to add emphasis when it's loaded. */ +} + +/* Add/delete Menus */ + +#customize-theme-controls .control-panel-content .control-section-nav_menu:nth-last-child(2) .accordion-section-title { + border-bottom-color: #ddd; +} + +/* @todo update selector */ +#accordion-section-add_menu { + margin: 15px 12px; +} + +#accordion-section-add_menu h3 { + text-align: left; +} + +#accordion-section-add_menu h3, +#accordion-section-add_menu .customize-add-menu-button { + margin: 0; +} + +#accordion-section-add_menu .customize-add-menu-button { + font-weight: 400; +} + +#create-new-menu-submit { + float: left; + margin: 0 0 12px 0; +} + +.menu-delete-item { + float: right; + padding: 1em 0; + width: 100%; +} + +.assigned-menu-locations-title p { + margin: 0 0 8px 0; +} + +li.assigned-to-menu-location .menu-delete-item { + display: none; +} + +li.assigned-to-menu-location .add-new-menu-item { + margin-bottom: 1em; +} + +.menu-item-handle { + margin-top: -1px; +} +.ui-sortable-disabled .menu-item-handle { + cursor: default; +} + +.menu-item-handle:hover { + position: relative; + z-index: 10; + color: #0073aa; +} + +.menu-item-handle:hover .item-type, +.menu-item-handle:hover .item-edit, +#available-menu-items .menu-item-handle:hover .item-add { + color: #0073aa; +} + +.menu-item-edit-active .menu-item-handle { + border-color: #999; + border-bottom: none; +} + +.customize-control-nav_menu_item { + margin-bottom: 0; +} + +.customize-control-nav_menu .new-menu-item-invitation { + margin-top: 0; + margin-bottom: 0; +} + +.customize-control-nav_menu .customize-control-nav_menu-buttons { + margin-top: 12px; +} + +/** + * box-shadows + */ + +.wp-customizer .menu-item .submitbox .submitdelete:focus, +.customize-screen-options-toggle:focus:before, +#customize-controls .customize-info .customize-help-toggle:focus:before, +.wp-customizer button:focus .toggle-indicator:before, +.menu-delete:focus, +.menu-item-bar .item-delete:focus:before, +#available-menu-items .item-add:focus:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + + +@media screen and (max-width: 782px) { + #available-menu-items #available-menu-items-search .accordion-section-content { + top: 63px; + } +} + +@media screen and (max-width: 640px) { + #available-menu-items #available-menu-items-search .accordion-section-content { + top: 130px; + } +} diff --git a/wp-admin/css/customize-nav-menus-rtl.min.css b/wp-admin/css/customize-nav-menus-rtl.min.css new file mode 100644 index 0000000..2dea515 --- /dev/null +++ b/wp-admin/css/customize-nav-menus-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#customize-theme-controls #accordion-section-menu_locations{position:relative;margin-top:30px}#customize-theme-controls #accordion-section-menu_locations>.accordion-section-title{border-bottom-color:#ddd;margin-top:15px}#customize-theme-controls .customize-section-title-menu_locations-description,#customize-theme-controls .customize-section-title-menu_locations-heading,#customize-theme-controls .customize-section-title-nav_menus-heading{padding:0 12px 0 12px}#customize-theme-controls .customize-control-description.customize-section-title-menu_locations-description{font-style:normal}.menu-in-location,.menu-in-locations{display:block;font-weight:600;font-size:10px}#customize-controls .control-section .accordion-section-title:focus .menu-in-location,#customize-controls .control-section .accordion-section-title:hover .menu-in-location,#customize-controls .theme-location-set{color:#555}.customize-control-nav_menu_location .create-menu,.customize-control-nav_menu_location .edit-menu{margin-right:6px;vertical-align:middle;line-height:2.2}#customize-controls .customize-control-nav_menu_name{margin-bottom:12px}.customize-control-nav_menu_name p:last-of-type{margin-bottom:0}#customize-new-menu-submit{float:left;min-width:85px}.wp-customizer .menu-item-bar .menu-item-handle,.wp-customizer .menu-item-settings,.wp-customizer .menu-item-settings .description-thin{box-sizing:border-box}.wp-customizer .menu-item-bar{margin:0}.wp-customizer .menu-item-bar .menu-item-handle{width:100%;background:#fff}.wp-customizer .menu-item-handle .item-title{margin-left:0}.wp-customizer .menu-item-handle .item-type{padding:1px 5px 0 21px;float:left;text-align:left}.wp-customizer .menu-item-handle:hover{z-index:8}.customize-control-nav_menu_item.has-notifications .menu-item-handle{border-right:4px solid #00a0d2}.wp-customizer .menu-item-settings{max-width:100%;overflow:hidden;z-index:8;padding:10px;background:#eee;border:1px solid #999;border-top:none}.wp-customizer .menu-item-settings .description-thin{width:100%;height:auto;margin:0 0 8px 0}.wp-customizer .menu-item-settings input[type=text]{width:100%}.wp-customizer .menu-item-settings .submitbox{margin:0;padding:0}.wp-customizer .menu-item-settings .link-to-original{padding:5px 0;border:none;font-style:normal;margin:0;width:100%}.wp-customizer .menu-item .submitbox .submitdelete{float:right;margin:6px 0 0;padding:0;cursor:pointer}.menu-item-reorder-nav{display:none;background-color:#fff;position:absolute;top:0;left:0}.menus-move-left:before{content:"\f345"}.menus-move-right:before{content:"\f341"}.reordering .menu-item .item-controls,.reordering .menu-item .item-type{display:none}.reordering .menu-item-reorder-nav{display:block}.customize-control input.menu-name-field{width:100%}.wp-customizer .menu-item .item-edit{position:absolute;left:-19px;top:2px;display:block;width:30px;height:38px;margin-left:0!important;box-shadow:none;outline:0;overflow:hidden;cursor:pointer;text-align:center}.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:before{content:"\f142"}.wp-customizer .menu-item-settings p.description{font-style:normal}.wp-customizer .menu-settings dl{margin:12px 0 0 0;padding:0}.wp-customizer .menu-settings .checkbox-input{margin-top:8px}.wp-customizer .menu-settings .menu-theme-locations{border-top:1px solid #ccc}.wp-customizer .menu-settings{margin-top:36px;border-top:none}.wp-customizer .menu-location-settings{margin-top:12px;border-top:none}.wp-customizer .control-section-nav_menu .menu-location-settings{margin-top:24px;border-top:1px solid #ddd}.customize-control-nav_menu_auto_add,.wp-customizer .control-section-nav_menu .menu-location-settings{padding-top:12px}.menu-location-settings .customize-control-checkbox .theme-location-set{line-height:1}.customize-control-nav_menu_auto_add label{vertical-align:top}.menu-location-settings .new-menu-locations-widget-note{display:block}.customize-control-menu{margin-top:4px}#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle{color:#555}.customize-screen-options-toggle{background:0 0;border:none;color:#555;cursor:pointer;margin:0;padding:20px;position:absolute;left:0;top:30px}#customize-controls .customize-info .customize-help-toggle{padding:20px}#customize-controls .customize-info .customize-help-toggle:before{padding:4px}#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.active-menu-screen-options .customize-screen-options-toggle,.customize-screen-options-toggle:active,.customize-screen-options-toggle:focus,.customize-screen-options-toggle:hover{color:#0073aa}#customize-controls .customize-info .customize-help-toggle:focus,.customize-screen-options-toggle:focus{outline:0}.customize-screen-options-toggle:before{-moz-osx-font-smoothing:grayscale;border:none;content:"\f111";display:block;font:18px/1 dashicons;padding:5px;text-align:center;text-decoration:none!important;text-indent:0;right:6px;position:absolute;top:6px}#customize-controls .customize-info .customize-help-toggle:focus:before,.customize-screen-options-toggle:focus:before{border-radius:100%}.wp-customizer #screen-options-wrap{display:none;background:#fff;border-top:1px solid #ddd;padding:4px 15px 15px}.wp-customizer .metabox-prefs label{display:block;padding-left:0;line-height:30px}.wp-customizer .toggle-indicator{display:inline-block;font-size:20px;line-height:1}.rtl .wp-customizer .toggle-indicator{text-indent:1px}#available-menu-items .accordion-section-title .toggle-indicator:before,.wp-customizer .menu-item .item-edit .toggle-indicator:before{content:"\f140";display:block;padding:1px 0 1px 2px;speak:none;border-radius:50%;color:#72777c;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.control-section-nav_menu .field-css-classes,.control-section-nav_menu .field-description,.control-section-nav_menu .field-link-target,.control-section-nav_menu .field-title-attribute,.control-section-nav_menu .field-xfn{display:none}.control-section-nav_menu.field-css-classes-active .field-css-classes,.control-section-nav_menu.field-description-active .field-description,.control-section-nav_menu.field-link-target-active .field-link-target,.control-section-nav_menu.field-title-attribute-active .field-title-attribute,.control-section-nav_menu.field-xfn-active .field-xfn{display:block}.menu-item-depth-0{margin-right:0}.menu-item-depth-1{margin-right:20px}.menu-item-depth-2{margin-right:40px}.menu-item-depth-3{margin-right:60px}.menu-item-depth-4{margin-right:80px}.menu-item-depth-5{margin-right:100px}.menu-item-depth-6{margin-right:120px}.menu-item-depth-7{margin-right:140px}.menu-item-depth-8{margin-right:160px}.menu-item-depth-9{margin-right:180px}.menu-item-depth-10{margin-right:200px}.menu-item-depth-11{margin-right:220px}.menu-item-depth-0>.menu-item-bar{margin-left:0}.menu-item-depth-1>.menu-item-bar{margin-left:20px}.menu-item-depth-2>.menu-item-bar{margin-left:40px}.menu-item-depth-3>.menu-item-bar{margin-left:60px}.menu-item-depth-4>.menu-item-bar{margin-left:80px}.menu-item-depth-5>.menu-item-bar{margin-left:100px}.menu-item-depth-6>.menu-item-bar{margin-left:120px}.menu-item-depth-7>.menu-item-bar{margin-left:140px}.menu-item-depth-8>.menu-item-bar{margin-left:160px}.menu-item-depth-9>.menu-item-bar{margin-left:180px}.menu-item-depth-10>.menu-item-bar{margin-left:200px}.menu-item-depth-11>.menu-item-bar{margin-left:220px}.menu-item-depth-0 .menu-item-transport{margin-right:0}.menu-item-depth-1 .menu-item-transport{margin-right:-20px}.menu-item-depth-3 .menu-item-transport{margin-right:-60px}.menu-item-depth-4 .menu-item-transport{margin-right:-80px}.menu-item-depth-2 .menu-item-transport{margin-right:-40px}.menu-item-depth-5 .menu-item-transport{margin-right:-100px}.menu-item-depth-6 .menu-item-transport{margin-right:-120px}.menu-item-depth-7 .menu-item-transport{margin-right:-140px}.menu-item-depth-8 .menu-item-transport{margin-right:-160px}.menu-item-depth-9 .menu-item-transport{margin-right:-180px}.menu-item-depth-10 .menu-item-transport{margin-right:-200px}.menu-item-depth-11 .menu-item-transport{margin-right:-220px}.reordering .menu-item-depth-0{margin-right:0}.reordering .menu-item-depth-1{margin-right:15px}.reordering .menu-item-depth-2{margin-right:30px}.reordering .menu-item-depth-3{margin-right:45px}.reordering .menu-item-depth-4{margin-right:60px}.reordering .menu-item-depth-5{margin-right:75px}.reordering .menu-item-depth-6{margin-right:90px}.reordering .menu-item-depth-7{margin-right:105px}.reordering .menu-item-depth-8{margin-right:120px}.reordering .menu-item-depth-9{margin-right:135px}.reordering .menu-item-depth-10{margin-right:150px}.reordering .menu-item-depth-11{margin-right:165px}.reordering .menu-item-depth-0>.menu-item-bar{margin-left:0}.reordering .menu-item-depth-1>.menu-item-bar{margin-left:15px}.reordering .menu-item-depth-2>.menu-item-bar{margin-left:30px}.reordering .menu-item-depth-3>.menu-item-bar{margin-left:45px}.reordering .menu-item-depth-4>.menu-item-bar{margin-left:60px}.reordering .menu-item-depth-5>.menu-item-bar{margin-left:75px}.reordering .menu-item-depth-6>.menu-item-bar{margin-left:90px}.reordering .menu-item-depth-7>.menu-item-bar{margin-left:105px}.reordering .menu-item-depth-8>.menu-item-bar{margin-left:120px}.reordering .menu-item-depth-9>.menu-item-bar{margin-left:135px}.reordering .menu-item-depth-10>.menu-item-bar{margin-left:150px}.reordering .menu-item-depth-11>.menu-item-bar{margin-left:165px}.control-section-nav_menu.menu .menu-item-edit-active{margin-right:0}.control-section-nav_menu.menu .menu-item-edit-active .menu-item-bar{margin-left:0}.control-section-nav_menu.menu .sortable-placeholder{margin-top:0;margin-bottom:1px;max-width:calc(100% - 2px);float:right;display:list-item;border-color:#a0a5aa}.menu-item-transport li.customize-control{float:none}.control-section-nav_menu.menu ul.menu-item-transport .menu-item-bar{margin-top:0}.adding-menu-items .control-section{opacity:.4}.adding-menu-items .control-panel.control-section,.adding-menu-items .control-section.open{opacity:1}.menu-item-bar .item-delete{color:#a00;position:absolute;top:2px;left:-19px;width:30px;height:38px;cursor:pointer;display:none}.menu-item-bar .item-delete:before{content:"\f335";position:absolute;top:9px;right:5px;border-radius:50%;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ie8 .menu-item-bar .item-delete:before{top:-10px}.menu-item-bar .item-delete:focus,.menu-item-bar .item-delete:hover{box-shadow:none;outline:0;color:#dc3232}.adding-menu-items .menu-item-bar .item-edit{display:none}.adding-menu-items .menu-item-bar .item-delete{display:block}#available-menu-items.opening{overflow-y:hidden}#available-menu-items #available-menu-items-search.open{height:100%;border-bottom:none}#available-menu-items .accordion-section-title{border-right:none;border-left:none;background:#fff;transition:background-color .15s;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}#available-menu-items #available-menu-items-search .accordion-section-title,#available-menu-items .open .accordion-section-title{background:#eee}#available-menu-items .accordion-section-title:after{content:none!important}#available-menu-items .accordion-section-title:hover .toggle-indicator:before,#available-menu-items .button-link:focus .toggle-indicator:before,#available-menu-items .button-link:hover .toggle-indicator:before{color:#23282d}#available-menu-items .open .accordion-section-title .toggle-indicator:before{content:"\f142";color:#23282d}#available-menu-items .available-menu-items-list{overflow-y:auto;max-height:200px;background:0 0}#available-menu-items .accordion-section-title button{display:block;width:28px;height:35px;position:absolute;top:5px;left:5px;box-shadow:none;outline:0;cursor:pointer;text-align:center}#available-menu-items .accordion-section-title .no-items,#available-menu-items .cannot-expand .accordion-section-title .spinner,#available-menu-items .cannot-expand .accordion-section-title>button{display:none}#available-menu-items-search.cannot-expand .accordion-section-title .spinner{display:block}#available-menu-items .cannot-expand .accordion-section-title .no-items{float:left;color:#555d66;font-weight:400;margin-right:5px}#available-menu-items .accordion-section-content{max-height:290px;margin:0;padding:0;position:relative;background:0 0}#available-menu-items .accordion-section-content .available-menu-items-list{margin:0 0 45px 0;padding:1px 15px 15px 15px}#available-menu-items .accordion-section-content .available-menu-items-list:only-child{margin-bottom:0}#new-custom-menu-item .accordion-section-content{padding:0 15px 15px 15px}#available-menu-items .menu-item-tpl{margin:0}#available-menu-items .new-content-item .create-item-input.invalid,#available-menu-items .new-content-item .create-item-input.invalid:focus,#custom-menu-item-name.invalid,#custom-menu-item-url.invalid,.edit-menu-item-url.invalid,.menu-name-field.invalid,.menu-name-field.invalid:focus{border:1px solid #dc3232}#available-menu-items .menu-item-handle .item-type{padding-left:0}#available-menu-items .menu-item-handle .item-title{padding-right:20px}#available-menu-items .menu-item-handle{cursor:pointer}#available-menu-items .menu-item-handle{box-shadow:none;margin-top:-1px}#available-menu-items .menu-item-handle:hover{z-index:1}#available-menu-items .item-title h4{padding:0 0 5px;font-size:14px}#available-menu-items .item-add{position:absolute;top:1px;right:1px;color:#82878c;width:30px;height:38px;box-shadow:none;outline:0;cursor:pointer;text-align:center}#available-menu-items .menu-item-handle .item-add:focus{color:#23282d}#available-menu-items .item-add:before{content:"\f543";position:relative;right:2px;top:3px;display:inline-block;height:20px;border-radius:50%;font:normal 20px/1.05 dashicons}#available-menu-items .menu-item-handle.item-added .item-add:focus,#available-menu-items .menu-item-handle.item-added .item-title,#available-menu-items .menu-item-handle.item-added .item-type,#available-menu-items .menu-item-handle.item-added:hover .item-add{color:#82878c}#available-menu-items .menu-item-handle.item-added .item-add:before{content:"\f147"}#available-menu-items .accordion-section-title.loading .spinner,#available-menu-items-search.loading .accordion-section-title .spinner{visibility:visible;margin:0 20px}#available-menu-items-search .spinner{position:absolute;top:20px;left:21px;margin:0!important}#available-menu-items #available-menu-items-search .accordion-section-content{position:absolute;right:0;top:60px;bottom:0;max-height:none;width:100%;padding:1px 15px 15px;box-sizing:border-box}#available-menu-items-search .nothing-found{margin-top:-1px}#available-menu-items-search .accordion-section-title:after{display:none}#available-menu-items-search .accordion-section-content:empty{min-height:0;padding:0}#available-menu-items-search.loading .accordion-section-content div{opacity:.5}#available-menu-items-search.loading.loading-more .accordion-section-content div{opacity:1}#customize-preview{transition:all .2s}body.adding-menu-items #available-menu-items{right:0;visibility:visible}body.adding-menu-items .wp-full-overlay-main{right:300px}body.adding-menu-items #customize-preview{opacity:.4}body.adding-menu-items #customize-preview iframe{pointer-events:none}.menu-item-handle .spinner{display:none;float:right;margin:0 0 0 8px}.nav-menu-inserted-item-loading .spinner{display:block}.nav-menu-inserted-item-loading .menu-item-handle .item-type{padding:0 8px 0 0}.added-menu-item .menu-item-handle.loading,.nav-menu-inserted-item-loading .menu-item-handle{padding:10px 8px 10px 15px;cursor:default;opacity:.5;background:#fff;color:#727773}.added-menu-item .menu-item-handle{transition-property:opacity,background,color;transition-duration:1.25s;transition-timing-function:cubic-bezier(.25,-2.5,.75,8)}#customize-theme-controls .control-panel-content .control-section-nav_menu:nth-last-child(2) .accordion-section-title{border-bottom-color:#ddd}#accordion-section-add_menu{margin:15px 12px}#accordion-section-add_menu h3{text-align:left}#accordion-section-add_menu .customize-add-menu-button,#accordion-section-add_menu h3{margin:0}#accordion-section-add_menu .customize-add-menu-button{font-weight:400}#create-new-menu-submit{float:left;margin:0 0 12px 0}.menu-delete-item{float:right;padding:1em 0;width:100%}.assigned-menu-locations-title p{margin:0 0 8px 0}li.assigned-to-menu-location .menu-delete-item{display:none}li.assigned-to-menu-location .add-new-menu-item{margin-bottom:1em}.menu-item-handle{margin-top:-1px}.ui-sortable-disabled .menu-item-handle{cursor:default}.menu-item-handle:hover{position:relative;z-index:10;color:#0073aa}#available-menu-items .menu-item-handle:hover .item-add,.menu-item-handle:hover .item-edit,.menu-item-handle:hover .item-type{color:#0073aa}.menu-item-edit-active .menu-item-handle{border-color:#999;border-bottom:none}.customize-control-nav_menu_item{margin-bottom:0}.customize-control-nav_menu .new-menu-item-invitation{margin-top:0;margin-bottom:0}.customize-control-nav_menu .customize-control-nav_menu-buttons{margin-top:12px}#available-menu-items .item-add:focus:before,#customize-controls .customize-info .customize-help-toggle:focus:before,.customize-screen-options-toggle:focus:before,.menu-delete:focus,.menu-item-bar .item-delete:focus:before,.wp-customizer .menu-item .submitbox .submitdelete:focus,.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}@media screen and (max-width:782px){#available-menu-items #available-menu-items-search .accordion-section-content{top:63px}}@media screen and (max-width:640px){#available-menu-items #available-menu-items-search .accordion-section-content{top:130px}} \ No newline at end of file diff --git a/wp-admin/css/customize-nav-menus.css b/wp-admin/css/customize-nav-menus.css new file mode 100644 index 0000000..1459382 --- /dev/null +++ b/wp-admin/css/customize-nav-menus.css @@ -0,0 +1,887 @@ +#customize-theme-controls #accordion-section-menu_locations { + position: relative; + margin-top: 30px; +} + +#customize-theme-controls #accordion-section-menu_locations > .accordion-section-title { + border-bottom-color: #ddd; + margin-top: 15px; +} + +#customize-theme-controls .customize-section-title-nav_menus-heading, +#customize-theme-controls .customize-section-title-menu_locations-heading, +#customize-theme-controls .customize-section-title-menu_locations-description { + padding: 0 12px 0 12px; +} + +#customize-theme-controls .customize-control-description.customize-section-title-menu_locations-description { + /* Override the default italic style for control descriptions */ + font-style: normal; +} + +.menu-in-location, +.menu-in-locations { + display: block; + font-weight: 600; + font-size: 10px; +} + +#customize-controls .theme-location-set, +#customize-controls .control-section .accordion-section-title:focus .menu-in-location, +#customize-controls .control-section .accordion-section-title:hover .menu-in-location { + color: #555; +} + +/* The `edit-menu` and `create-menu` buttons also use the `button-link` class. */ +.customize-control-nav_menu_location .edit-menu, +.customize-control-nav_menu_location .create-menu { + margin-left: 6px; + vertical-align: middle; + line-height: 2.2; +} + +#customize-controls .customize-control-nav_menu_name { + margin-bottom: 12px; +} + +.customize-control-nav_menu_name p:last-of-type { + margin-bottom: 0; +} + +#customize-new-menu-submit { + float: right; + min-width: 85px; +} + +.wp-customizer .menu-item-bar .menu-item-handle, +.wp-customizer .menu-item-settings, +.wp-customizer .menu-item-settings .description-thin { + box-sizing: border-box; +} + +.wp-customizer .menu-item-bar { + margin: 0; +} + +.wp-customizer .menu-item-bar .menu-item-handle { + width: 100%; + background: #fff; +} + +.wp-customizer .menu-item-handle .item-title { + margin-right: 0; +} + +.wp-customizer .menu-item-handle .item-type { + padding: 1px 21px 0 5px; + float: right; + text-align: right; +} + +.wp-customizer .menu-item-handle:hover { + z-index: 8; +} + +.customize-control-nav_menu_item.has-notifications .menu-item-handle { + border-left: 4px solid #00a0d2; +} + +.wp-customizer .menu-item-settings { + max-width: 100%; + overflow: hidden; + z-index: 8; + padding: 10px; + background: #eee; + border: 1px solid #999; + border-top: none; +} + +.wp-customizer .menu-item-settings .description-thin { + width: 100%; + height: auto; + margin: 0 0 8px 0; +} + +.wp-customizer .menu-item-settings input[type="text"] { + width: 100%; +} + +.wp-customizer .menu-item-settings .submitbox { + margin: 0; + padding: 0; +} + +.wp-customizer .menu-item-settings .link-to-original { + padding: 5px 0; + border: none; + font-style: normal; + margin: 0; + width: 100%; +} + +.wp-customizer .menu-item .submitbox .submitdelete { + float: left; + margin: 6px 0 0; + padding: 0; + cursor: pointer; +} + + +/** + * Menu items reordering styles + */ + +.menu-item-reorder-nav { + display: none; + background-color: #fff; + position: absolute; + top: 0; + right: 0; +} + +.menus-move-left:before { + content: "\f341"; +} + +.menus-move-right:before { + content: "\f345"; +} + +.reordering .menu-item .item-controls, +.reordering .menu-item .item-type { + display: none; +} + +.reordering .menu-item-reorder-nav { + display: block; +} + +.customize-control input.menu-name-field { + width: 100%; /* Override the 98% default for customizer inputs, to align with the size of menu items. */ +} + +.wp-customizer .menu-item .item-edit { + position: absolute; + right: -19px; + top: 2px; + display: block; + width: 30px; + height: 38px; + margin-right: 0 !important; + box-shadow: none; + outline: none; + overflow: hidden; + cursor: pointer; + text-align: center; +} + +.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:before { + content: "\f142"; +} + +.wp-customizer .menu-item-settings p.description { + font-style: normal; +} + +.wp-customizer .menu-settings dl { + margin: 12px 0 0 0; + padding: 0; +} + +.wp-customizer .menu-settings .checkbox-input { + margin-top: 8px; +} + +.wp-customizer .menu-settings .menu-theme-locations { + border-top: 1px solid #ccc; +} + +.wp-customizer .menu-settings { + margin-top: 36px; + border-top: none; +} + +.wp-customizer .menu-location-settings { + margin-top: 12px; + border-top: none; +} + +.wp-customizer .control-section-nav_menu .menu-location-settings { + margin-top: 24px; + border-top: 1px solid #ddd; +} + +.wp-customizer .control-section-nav_menu .menu-location-settings, +.customize-control-nav_menu_auto_add { + padding-top: 12px; +} + +.menu-location-settings .customize-control-checkbox .theme-location-set { + line-height: 1; +} + +.customize-control-nav_menu_auto_add label { + vertical-align: top; +} + +.menu-location-settings .new-menu-locations-widget-note { + display: block; +} + +.customize-control-menu { + margin-top: 4px; +} + +#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle { + color: #555; +} + +/* Screen Options */ +.customize-screen-options-toggle { + background: none; + border: none; + color: #555; + cursor: pointer; + margin: 0; + padding: 20px; + position: absolute; + right: 0; + top: 30px; +} + +#customize-controls .customize-info .customize-help-toggle { + padding: 20px; +} + +#customize-controls .customize-info .customize-help-toggle:before { + padding: 4px; +} + +.customize-screen-options-toggle:hover, +.customize-screen-options-toggle:active, +.customize-screen-options-toggle:focus, +.active-menu-screen-options .customize-screen-options-toggle, +#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover, +#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active, +#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus { + color: #0073aa; +} + +.customize-screen-options-toggle:focus, +#customize-controls .customize-info .customize-help-toggle:focus { + outline: none; +} + +.customize-screen-options-toggle:before { + -moz-osx-font-smoothing: grayscale; + border: none; + content: "\f111"; + display: block; + font: 18px/1 dashicons; + padding: 5px; + text-align: center; + text-decoration: none !important; + text-indent: 0; + left: 6px; + position: absolute; + top: 6px; +} + +.customize-screen-options-toggle:focus:before, +#customize-controls .customize-info .customize-help-toggle:focus:before { + border-radius: 100%; +} + +.wp-customizer #screen-options-wrap { + display: none; + background: #fff; + border-top: 1px solid #ddd; + padding: 4px 15px 15px; +} + +.wp-customizer .metabox-prefs label { + display: block; + padding-right: 0; + line-height: 30px; +} + +/* rework the arrow indicator implementation for NVDA bug same as #32715 */ +.wp-customizer .toggle-indicator { + display: inline-block; + font-size: 20px; + line-height: 1; +} + +.rtl .wp-customizer .toggle-indicator { + text-indent: 1px; /* account for the dashicon alignment */ +} + +.wp-customizer .menu-item .item-edit .toggle-indicator:before, +#available-menu-items .accordion-section-title .toggle-indicator:before { + content: "\f140"; + display: block; + padding: 1px 2px 1px 0px; + speak: none; + border-radius: 50%; + color: #72777c; + font: normal 20px/1 dashicons; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; +} + +.control-section-nav_menu .field-link-target, +.control-section-nav_menu .field-title-attribute, +.control-section-nav_menu .field-css-classes, +.control-section-nav_menu .field-xfn, +.control-section-nav_menu .field-description { + display: none; +} + +.control-section-nav_menu.field-link-target-active .field-link-target, +.control-section-nav_menu.field-title-attribute-active .field-title-attribute, +.control-section-nav_menu.field-css-classes-active .field-css-classes, +.control-section-nav_menu.field-xfn-active .field-xfn, +.control-section-nav_menu.field-description-active .field-description { + display: block; +} + +/* WARNING: The 20px factor is hard-coded in JS. */ +.menu-item-depth-0 { margin-left: 0; } +.menu-item-depth-1 { margin-left: 20px; } +.menu-item-depth-2 { margin-left: 40px; } +.menu-item-depth-3 { margin-left: 60px; } +.menu-item-depth-4 { margin-left: 80px; } +.menu-item-depth-5 { margin-left: 100px; } +.menu-item-depth-6 { margin-left: 120px; } +.menu-item-depth-7 { margin-left: 140px; } +.menu-item-depth-8 { margin-left: 160px; } /* Not likely to be used or useful beyond this depth */ +.menu-item-depth-9 { margin-left: 180px; } +.menu-item-depth-10 { margin-left: 200px; } +.menu-item-depth-11 { margin-left: 220px; } + +/* @todo handle .menu-item-settings width */ +.menu-item-depth-0 > .menu-item-bar { margin-right: 0; } +.menu-item-depth-1 > .menu-item-bar { margin-right: 20px; } +.menu-item-depth-2 > .menu-item-bar { margin-right: 40px; } +.menu-item-depth-3 > .menu-item-bar { margin-right: 60px; } +.menu-item-depth-4 > .menu-item-bar { margin-right: 80px; } +.menu-item-depth-5 > .menu-item-bar { margin-right: 100px; } +.menu-item-depth-6 > .menu-item-bar { margin-right: 120px; } +.menu-item-depth-7 > .menu-item-bar { margin-right: 140px; } +.menu-item-depth-8 > .menu-item-bar { margin-right: 160px; } +.menu-item-depth-9 > .menu-item-bar { margin-right: 180px; } +.menu-item-depth-10 > .menu-item-bar { margin-right: 200px; } +.menu-item-depth-11 > .menu-item-bar { margin-right: 220px; } + +/* Submenu left margin. */ +.menu-item-depth-0 .menu-item-transport { margin-left: 0; } +.menu-item-depth-1 .menu-item-transport { margin-left: -20px; } +.menu-item-depth-3 .menu-item-transport { margin-left: -60px; } +.menu-item-depth-4 .menu-item-transport { margin-left: -80px; } +.menu-item-depth-2 .menu-item-transport { margin-left: -40px; } +.menu-item-depth-5 .menu-item-transport { margin-left: -100px; } +.menu-item-depth-6 .menu-item-transport { margin-left: -120px; } +.menu-item-depth-7 .menu-item-transport { margin-left: -140px; } +.menu-item-depth-8 .menu-item-transport { margin-left: -160px; } +.menu-item-depth-9 .menu-item-transport { margin-left: -180px; } +.menu-item-depth-10 .menu-item-transport { margin-left: -200px; } +.menu-item-depth-11 .menu-item-transport { margin-left: -220px; } + +/* WARNING: The 20px factor is hard-coded in JS. */ +.reordering .menu-item-depth-0 { margin-left: 0; } +.reordering .menu-item-depth-1 { margin-left: 15px; } +.reordering .menu-item-depth-2 { margin-left: 30px; } +.reordering .menu-item-depth-3 { margin-left: 45px; } +.reordering .menu-item-depth-4 { margin-left: 60px; } +.reordering .menu-item-depth-5 { margin-left: 75px; } +.reordering .menu-item-depth-6 { margin-left: 90px; } +.reordering .menu-item-depth-7 { margin-left: 105px; } +.reordering .menu-item-depth-8 { margin-left: 120px; } /* Not likely to be used or useful beyond this depth */ +.reordering .menu-item-depth-9 { margin-left: 135px; } +.reordering .menu-item-depth-10 { margin-left: 150px; } +.reordering .menu-item-depth-11 { margin-left: 165px; } + +.reordering .menu-item-depth-0 > .menu-item-bar { margin-right: 0; } +.reordering .menu-item-depth-1 > .menu-item-bar { margin-right: 15px; } +.reordering .menu-item-depth-2 > .menu-item-bar { margin-right: 30px; } +.reordering .menu-item-depth-3 > .menu-item-bar { margin-right: 45px; } +.reordering .menu-item-depth-4 > .menu-item-bar { margin-right: 60px; } +.reordering .menu-item-depth-5 > .menu-item-bar { margin-right: 75px; } +.reordering .menu-item-depth-6 > .menu-item-bar { margin-right: 90px; } +.reordering .menu-item-depth-7 > .menu-item-bar { margin-right: 105px; } +.reordering .menu-item-depth-8 > .menu-item-bar { margin-right: 120px; } +.reordering .menu-item-depth-9 > .menu-item-bar { margin-right: 135px; } +.reordering .menu-item-depth-10 > .menu-item-bar { margin-right: 150px; } +.reordering .menu-item-depth-11 > .menu-item-bar { margin-right: 165px; } + +.control-section-nav_menu.menu .menu-item-edit-active { + margin-left: 0; +} + +.control-section-nav_menu.menu .menu-item-edit-active .menu-item-bar { + margin-right: 0; +} + +.control-section-nav_menu.menu .sortable-placeholder { + margin-top: 0; + margin-bottom: 1px; + max-width: calc(100% - 2px); + float: left; + display: list-item; + border-color: #a0a5aa; +} + +.menu-item-transport li.customize-control { + float: none; +} + +.control-section-nav_menu.menu ul.menu-item-transport .menu-item-bar { + margin-top: 0; +} + +/** + * Add-menu-items mode + */ + +.adding-menu-items .control-section { + opacity: .4; +} + +.adding-menu-items .control-panel.control-section, +.adding-menu-items .control-section.open { + opacity: 1; +} + +.menu-item-bar .item-delete { + color: #a00; + position: absolute; + top: 2px; + right: -19px; + width: 30px; + height: 38px; + cursor: pointer; + display: none; +} + +.menu-item-bar .item-delete:before { + content: "\f335"; + position: absolute; + top: 9px; + left: 5px; + border-radius: 50%; + font: normal 20px/1 dashicons; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.ie8 .menu-item-bar .item-delete:before { + top: -10px; +} + +.menu-item-bar .item-delete:hover, +.menu-item-bar .item-delete:focus { + box-shadow: none; + outline: none; + color: #dc3232; +} + +.adding-menu-items .menu-item-bar .item-edit { + display: none; +} + +.adding-menu-items .menu-item-bar .item-delete { + display: block; +} + +/** + * Styles for menu-item addition panel + */ + +#available-menu-items.opening { + overflow-y: hidden; /* avoid scrollbar jitter with animating heights */ +} + +#available-menu-items #available-menu-items-search.open { + height: 100%; + border-bottom: none; +} + +#available-menu-items .accordion-section-title { + border-left: none; + border-right: none; + background: #fff; + transition: background-color 0.15s; + /* Reset the value inherited from the base .accordion-section-title style. Ticket #37589. */ + -webkit-user-select: auto; + -moz-user-select: auto; + -ms-user-select: auto; + user-select: auto; +} + +#available-menu-items .open .accordion-section-title, +#available-menu-items #available-menu-items-search .accordion-section-title { + background: #eee; +} + +/* rework the arrow indicator implementation for NVDA bug see #32715 */ +#available-menu-items .accordion-section-title:after { + content: none !important; +} + +#available-menu-items .accordion-section-title:hover .toggle-indicator:before, +#available-menu-items .button-link:hover .toggle-indicator:before, +#available-menu-items .button-link:focus .toggle-indicator:before { + color: #23282d; +} + +#available-menu-items .open .accordion-section-title .toggle-indicator:before { + content: "\f142"; + color: #23282d; +} + +#available-menu-items .available-menu-items-list { + overflow-y: auto; + max-height: 200px; /* This gets set in JS to fit the screen size, and based on # of sections. */ + background: transparent; +} + +#available-menu-items .accordion-section-title button { + display: block; + width: 28px; + height: 35px; + position: absolute; + top: 5px; + right: 5px; + box-shadow: none; + outline: none; + cursor: pointer; + text-align: center; +} + +#available-menu-items .accordion-section-title .no-items, +#available-menu-items .cannot-expand .accordion-section-title .spinner, +#available-menu-items .cannot-expand .accordion-section-title > button { + display: none; +} + +#available-menu-items-search.cannot-expand .accordion-section-title .spinner { + display: block; +} + +#available-menu-items .cannot-expand .accordion-section-title .no-items { + float: right; + color: #555d66; + font-weight: 400; + margin-left: 5px; +} + +#available-menu-items .accordion-section-content { + max-height: 290px; + margin: 0; + padding: 0; + position: relative; + background: transparent; +} + +#available-menu-items .accordion-section-content .available-menu-items-list { + margin: 0 0 45px 0; + padding: 1px 15px 15px 15px; +} + +#available-menu-items .accordion-section-content .available-menu-items-list:only-child { /* Types that do not support new items for the current user */ + margin-bottom: 0; +} + +#new-custom-menu-item .accordion-section-content { + padding: 0 15px 15px 15px; +} + +#available-menu-items .menu-item-tpl { + margin: 0; +} + +#custom-menu-item-name.invalid, +#custom-menu-item-url.invalid, +.edit-menu-item-url.invalid, +.menu-name-field.invalid, +.menu-name-field.invalid:focus, +#available-menu-items .new-content-item .create-item-input.invalid, +#available-menu-items .new-content-item .create-item-input.invalid:focus { + border: 1px solid #dc3232; +} + +#available-menu-items .menu-item-handle .item-type { + padding-right: 0; +} + +#available-menu-items .menu-item-handle .item-title { + padding-left: 20px; +} + +#available-menu-items .menu-item-handle { + cursor: pointer; +} + +#available-menu-items .menu-item-handle { + box-shadow: none; + margin-top: -1px; +} + +#available-menu-items .menu-item-handle:hover { + z-index: 1; +} + +#available-menu-items .item-title h4 { + padding: 0 0 5px; + font-size: 14px; +} + +#available-menu-items .item-add { + position: absolute; + top: 1px; + left: 1px; + color: #82878c; + width: 30px; + height: 38px; + box-shadow: none; + outline: none; + cursor: pointer; + text-align: center; +} + +#available-menu-items .menu-item-handle .item-add:focus { + color: #23282d; +} + +#available-menu-items .item-add:before { + content: "\f543"; + position: relative; + left: 2px; + top: 3px; + display: inline-block; + height: 20px; + border-radius: 50%; + font: normal 20px/1.05 dashicons; /* line height is to account for the dashicon's vertical alignment */ +} + +#available-menu-items .menu-item-handle.item-added .item-type, +#available-menu-items .menu-item-handle.item-added .item-title, +#available-menu-items .menu-item-handle.item-added:hover .item-add, +#available-menu-items .menu-item-handle.item-added .item-add:focus { + color: #82878c; +} + +#available-menu-items .menu-item-handle.item-added .item-add:before { + content: "\f147"; +} + +#available-menu-items .accordion-section-title.loading .spinner, +#available-menu-items-search.loading .accordion-section-title .spinner { + visibility: visible; + margin: 0 20px; +} + +#available-menu-items-search .spinner { + position: absolute; + top: 20px; /* 13 container padding +1 input margin +6 ( ( 32 input height - 20 spinner height ) / 2 ) */ + right: 21px; + margin: 0 !important; +} + +/* search results list */ +#available-menu-items #available-menu-items-search .accordion-section-content { + position: absolute; + left: 0; + top: 60px; /* below title div / search input */ + bottom: 0px; /* 100% height that still triggers lazy load */ + max-height: none; + width: 100%; + padding: 1px 15px 15px; + box-sizing: border-box; +} + +#available-menu-items-search .nothing-found { + /* Compensate the 1px top padding of the container. */ + margin-top: -1px; +} + +#available-menu-items-search .accordion-section-title:after { + display: none; +} + +#available-menu-items-search .accordion-section-content:empty { + min-height: 0; + padding: 0; +} + +#available-menu-items-search.loading .accordion-section-content div { + opacity: .5; +} + +#available-menu-items-search.loading.loading-more .accordion-section-content div { + opacity: 1; +} + +#customize-preview { + transition: all 0.2s; +} + +body.adding-menu-items #available-menu-items { + left: 0; + visibility: visible; +} + +body.adding-menu-items .wp-full-overlay-main { + left: 300px; +} + +body.adding-menu-items #customize-preview { + opacity: 0.4; +} + +body.adding-menu-items #customize-preview iframe { + pointer-events: none; +} + +.menu-item-handle .spinner { + display: none; + float: left; + margin: 0 8px 0 0; +} + +.nav-menu-inserted-item-loading .spinner { + display: block; +} + +.nav-menu-inserted-item-loading .menu-item-handle .item-type { + padding: 0 0 0 8px; +} + +.nav-menu-inserted-item-loading .menu-item-handle, +.added-menu-item .menu-item-handle.loading { + padding: 10px 15px 10px 8px; + cursor: default; + opacity: .5; + background: #fff; + color: #727773; +} + +.added-menu-item .menu-item-handle { + transition-property: opacity, background, color; + transition-duration: 1.25s; + transition-timing-function: cubic-bezier( .25, -2.5, .75, 8 ); /* Replacement for .hide().fadeIn('slow') in JS to add emphasis when it's loaded. */ +} + +/* Add/delete Menus */ + +#customize-theme-controls .control-panel-content .control-section-nav_menu:nth-last-child(2) .accordion-section-title { + border-bottom-color: #ddd; +} + +/* @todo update selector */ +#accordion-section-add_menu { + margin: 15px 12px; +} + +#accordion-section-add_menu h3 { + text-align: right; +} + +#accordion-section-add_menu h3, +#accordion-section-add_menu .customize-add-menu-button { + margin: 0; +} + +#accordion-section-add_menu .customize-add-menu-button { + font-weight: 400; +} + +#create-new-menu-submit { + float: right; + margin: 0 0 12px 0; +} + +.menu-delete-item { + float: left; + padding: 1em 0; + width: 100%; +} + +.assigned-menu-locations-title p { + margin: 0 0 8px 0; +} + +li.assigned-to-menu-location .menu-delete-item { + display: none; +} + +li.assigned-to-menu-location .add-new-menu-item { + margin-bottom: 1em; +} + +.menu-item-handle { + margin-top: -1px; +} +.ui-sortable-disabled .menu-item-handle { + cursor: default; +} + +.menu-item-handle:hover { + position: relative; + z-index: 10; + color: #0073aa; +} + +.menu-item-handle:hover .item-type, +.menu-item-handle:hover .item-edit, +#available-menu-items .menu-item-handle:hover .item-add { + color: #0073aa; +} + +.menu-item-edit-active .menu-item-handle { + border-color: #999; + border-bottom: none; +} + +.customize-control-nav_menu_item { + margin-bottom: 0; +} + +.customize-control-nav_menu .new-menu-item-invitation { + margin-top: 0; + margin-bottom: 0; +} + +.customize-control-nav_menu .customize-control-nav_menu-buttons { + margin-top: 12px; +} + +/** + * box-shadows + */ + +.wp-customizer .menu-item .submitbox .submitdelete:focus, +.customize-screen-options-toggle:focus:before, +#customize-controls .customize-info .customize-help-toggle:focus:before, +.wp-customizer button:focus .toggle-indicator:before, +.menu-delete:focus, +.menu-item-bar .item-delete:focus:before, +#available-menu-items .item-add:focus:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + + +@media screen and (max-width: 782px) { + #available-menu-items #available-menu-items-search .accordion-section-content { + top: 63px; + } +} + +@media screen and (max-width: 640px) { + #available-menu-items #available-menu-items-search .accordion-section-content { + top: 130px; + } +} diff --git a/wp-admin/css/customize-nav-menus.min.css b/wp-admin/css/customize-nav-menus.min.css new file mode 100644 index 0000000..07076bc --- /dev/null +++ b/wp-admin/css/customize-nav-menus.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#customize-theme-controls #accordion-section-menu_locations{position:relative;margin-top:30px}#customize-theme-controls #accordion-section-menu_locations>.accordion-section-title{border-bottom-color:#ddd;margin-top:15px}#customize-theme-controls .customize-section-title-menu_locations-description,#customize-theme-controls .customize-section-title-menu_locations-heading,#customize-theme-controls .customize-section-title-nav_menus-heading{padding:0 12px 0 12px}#customize-theme-controls .customize-control-description.customize-section-title-menu_locations-description{font-style:normal}.menu-in-location,.menu-in-locations{display:block;font-weight:600;font-size:10px}#customize-controls .control-section .accordion-section-title:focus .menu-in-location,#customize-controls .control-section .accordion-section-title:hover .menu-in-location,#customize-controls .theme-location-set{color:#555}.customize-control-nav_menu_location .create-menu,.customize-control-nav_menu_location .edit-menu{margin-left:6px;vertical-align:middle;line-height:2.2}#customize-controls .customize-control-nav_menu_name{margin-bottom:12px}.customize-control-nav_menu_name p:last-of-type{margin-bottom:0}#customize-new-menu-submit{float:right;min-width:85px}.wp-customizer .menu-item-bar .menu-item-handle,.wp-customizer .menu-item-settings,.wp-customizer .menu-item-settings .description-thin{box-sizing:border-box}.wp-customizer .menu-item-bar{margin:0}.wp-customizer .menu-item-bar .menu-item-handle{width:100%;background:#fff}.wp-customizer .menu-item-handle .item-title{margin-right:0}.wp-customizer .menu-item-handle .item-type{padding:1px 21px 0 5px;float:right;text-align:right}.wp-customizer .menu-item-handle:hover{z-index:8}.customize-control-nav_menu_item.has-notifications .menu-item-handle{border-left:4px solid #00a0d2}.wp-customizer .menu-item-settings{max-width:100%;overflow:hidden;z-index:8;padding:10px;background:#eee;border:1px solid #999;border-top:none}.wp-customizer .menu-item-settings .description-thin{width:100%;height:auto;margin:0 0 8px 0}.wp-customizer .menu-item-settings input[type=text]{width:100%}.wp-customizer .menu-item-settings .submitbox{margin:0;padding:0}.wp-customizer .menu-item-settings .link-to-original{padding:5px 0;border:none;font-style:normal;margin:0;width:100%}.wp-customizer .menu-item .submitbox .submitdelete{float:left;margin:6px 0 0;padding:0;cursor:pointer}.menu-item-reorder-nav{display:none;background-color:#fff;position:absolute;top:0;right:0}.menus-move-left:before{content:"\f341"}.menus-move-right:before{content:"\f345"}.reordering .menu-item .item-controls,.reordering .menu-item .item-type{display:none}.reordering .menu-item-reorder-nav{display:block}.customize-control input.menu-name-field{width:100%}.wp-customizer .menu-item .item-edit{position:absolute;right:-19px;top:2px;display:block;width:30px;height:38px;margin-right:0!important;box-shadow:none;outline:0;overflow:hidden;cursor:pointer;text-align:center}.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:before{content:"\f142"}.wp-customizer .menu-item-settings p.description{font-style:normal}.wp-customizer .menu-settings dl{margin:12px 0 0 0;padding:0}.wp-customizer .menu-settings .checkbox-input{margin-top:8px}.wp-customizer .menu-settings .menu-theme-locations{border-top:1px solid #ccc}.wp-customizer .menu-settings{margin-top:36px;border-top:none}.wp-customizer .menu-location-settings{margin-top:12px;border-top:none}.wp-customizer .control-section-nav_menu .menu-location-settings{margin-top:24px;border-top:1px solid #ddd}.customize-control-nav_menu_auto_add,.wp-customizer .control-section-nav_menu .menu-location-settings{padding-top:12px}.menu-location-settings .customize-control-checkbox .theme-location-set{line-height:1}.customize-control-nav_menu_auto_add label{vertical-align:top}.menu-location-settings .new-menu-locations-widget-note{display:block}.customize-control-menu{margin-top:4px}#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle{color:#555}.customize-screen-options-toggle{background:0 0;border:none;color:#555;cursor:pointer;margin:0;padding:20px;position:absolute;right:0;top:30px}#customize-controls .customize-info .customize-help-toggle{padding:20px}#customize-controls .customize-info .customize-help-toggle:before{padding:4px}#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus,#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,.active-menu-screen-options .customize-screen-options-toggle,.customize-screen-options-toggle:active,.customize-screen-options-toggle:focus,.customize-screen-options-toggle:hover{color:#0073aa}#customize-controls .customize-info .customize-help-toggle:focus,.customize-screen-options-toggle:focus{outline:0}.customize-screen-options-toggle:before{-moz-osx-font-smoothing:grayscale;border:none;content:"\f111";display:block;font:18px/1 dashicons;padding:5px;text-align:center;text-decoration:none!important;text-indent:0;left:6px;position:absolute;top:6px}#customize-controls .customize-info .customize-help-toggle:focus:before,.customize-screen-options-toggle:focus:before{border-radius:100%}.wp-customizer #screen-options-wrap{display:none;background:#fff;border-top:1px solid #ddd;padding:4px 15px 15px}.wp-customizer .metabox-prefs label{display:block;padding-right:0;line-height:30px}.wp-customizer .toggle-indicator{display:inline-block;font-size:20px;line-height:1}.rtl .wp-customizer .toggle-indicator{text-indent:1px}#available-menu-items .accordion-section-title .toggle-indicator:before,.wp-customizer .menu-item .item-edit .toggle-indicator:before{content:"\f140";display:block;padding:1px 2px 1px 0;speak:none;border-radius:50%;color:#72777c;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important}.control-section-nav_menu .field-css-classes,.control-section-nav_menu .field-description,.control-section-nav_menu .field-link-target,.control-section-nav_menu .field-title-attribute,.control-section-nav_menu .field-xfn{display:none}.control-section-nav_menu.field-css-classes-active .field-css-classes,.control-section-nav_menu.field-description-active .field-description,.control-section-nav_menu.field-link-target-active .field-link-target,.control-section-nav_menu.field-title-attribute-active .field-title-attribute,.control-section-nav_menu.field-xfn-active .field-xfn{display:block}.menu-item-depth-0{margin-left:0}.menu-item-depth-1{margin-left:20px}.menu-item-depth-2{margin-left:40px}.menu-item-depth-3{margin-left:60px}.menu-item-depth-4{margin-left:80px}.menu-item-depth-5{margin-left:100px}.menu-item-depth-6{margin-left:120px}.menu-item-depth-7{margin-left:140px}.menu-item-depth-8{margin-left:160px}.menu-item-depth-9{margin-left:180px}.menu-item-depth-10{margin-left:200px}.menu-item-depth-11{margin-left:220px}.menu-item-depth-0>.menu-item-bar{margin-right:0}.menu-item-depth-1>.menu-item-bar{margin-right:20px}.menu-item-depth-2>.menu-item-bar{margin-right:40px}.menu-item-depth-3>.menu-item-bar{margin-right:60px}.menu-item-depth-4>.menu-item-bar{margin-right:80px}.menu-item-depth-5>.menu-item-bar{margin-right:100px}.menu-item-depth-6>.menu-item-bar{margin-right:120px}.menu-item-depth-7>.menu-item-bar{margin-right:140px}.menu-item-depth-8>.menu-item-bar{margin-right:160px}.menu-item-depth-9>.menu-item-bar{margin-right:180px}.menu-item-depth-10>.menu-item-bar{margin-right:200px}.menu-item-depth-11>.menu-item-bar{margin-right:220px}.menu-item-depth-0 .menu-item-transport{margin-left:0}.menu-item-depth-1 .menu-item-transport{margin-left:-20px}.menu-item-depth-3 .menu-item-transport{margin-left:-60px}.menu-item-depth-4 .menu-item-transport{margin-left:-80px}.menu-item-depth-2 .menu-item-transport{margin-left:-40px}.menu-item-depth-5 .menu-item-transport{margin-left:-100px}.menu-item-depth-6 .menu-item-transport{margin-left:-120px}.menu-item-depth-7 .menu-item-transport{margin-left:-140px}.menu-item-depth-8 .menu-item-transport{margin-left:-160px}.menu-item-depth-9 .menu-item-transport{margin-left:-180px}.menu-item-depth-10 .menu-item-transport{margin-left:-200px}.menu-item-depth-11 .menu-item-transport{margin-left:-220px}.reordering .menu-item-depth-0{margin-left:0}.reordering .menu-item-depth-1{margin-left:15px}.reordering .menu-item-depth-2{margin-left:30px}.reordering .menu-item-depth-3{margin-left:45px}.reordering .menu-item-depth-4{margin-left:60px}.reordering .menu-item-depth-5{margin-left:75px}.reordering .menu-item-depth-6{margin-left:90px}.reordering .menu-item-depth-7{margin-left:105px}.reordering .menu-item-depth-8{margin-left:120px}.reordering .menu-item-depth-9{margin-left:135px}.reordering .menu-item-depth-10{margin-left:150px}.reordering .menu-item-depth-11{margin-left:165px}.reordering .menu-item-depth-0>.menu-item-bar{margin-right:0}.reordering .menu-item-depth-1>.menu-item-bar{margin-right:15px}.reordering .menu-item-depth-2>.menu-item-bar{margin-right:30px}.reordering .menu-item-depth-3>.menu-item-bar{margin-right:45px}.reordering .menu-item-depth-4>.menu-item-bar{margin-right:60px}.reordering .menu-item-depth-5>.menu-item-bar{margin-right:75px}.reordering .menu-item-depth-6>.menu-item-bar{margin-right:90px}.reordering .menu-item-depth-7>.menu-item-bar{margin-right:105px}.reordering .menu-item-depth-8>.menu-item-bar{margin-right:120px}.reordering .menu-item-depth-9>.menu-item-bar{margin-right:135px}.reordering .menu-item-depth-10>.menu-item-bar{margin-right:150px}.reordering .menu-item-depth-11>.menu-item-bar{margin-right:165px}.control-section-nav_menu.menu .menu-item-edit-active{margin-left:0}.control-section-nav_menu.menu .menu-item-edit-active .menu-item-bar{margin-right:0}.control-section-nav_menu.menu .sortable-placeholder{margin-top:0;margin-bottom:1px;max-width:calc(100% - 2px);float:left;display:list-item;border-color:#a0a5aa}.menu-item-transport li.customize-control{float:none}.control-section-nav_menu.menu ul.menu-item-transport .menu-item-bar{margin-top:0}.adding-menu-items .control-section{opacity:.4}.adding-menu-items .control-panel.control-section,.adding-menu-items .control-section.open{opacity:1}.menu-item-bar .item-delete{color:#a00;position:absolute;top:2px;right:-19px;width:30px;height:38px;cursor:pointer;display:none}.menu-item-bar .item-delete:before{content:"\f335";position:absolute;top:9px;left:5px;border-radius:50%;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ie8 .menu-item-bar .item-delete:before{top:-10px}.menu-item-bar .item-delete:focus,.menu-item-bar .item-delete:hover{box-shadow:none;outline:0;color:#dc3232}.adding-menu-items .menu-item-bar .item-edit{display:none}.adding-menu-items .menu-item-bar .item-delete{display:block}#available-menu-items.opening{overflow-y:hidden}#available-menu-items #available-menu-items-search.open{height:100%;border-bottom:none}#available-menu-items .accordion-section-title{border-left:none;border-right:none;background:#fff;transition:background-color .15s;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}#available-menu-items #available-menu-items-search .accordion-section-title,#available-menu-items .open .accordion-section-title{background:#eee}#available-menu-items .accordion-section-title:after{content:none!important}#available-menu-items .accordion-section-title:hover .toggle-indicator:before,#available-menu-items .button-link:focus .toggle-indicator:before,#available-menu-items .button-link:hover .toggle-indicator:before{color:#23282d}#available-menu-items .open .accordion-section-title .toggle-indicator:before{content:"\f142";color:#23282d}#available-menu-items .available-menu-items-list{overflow-y:auto;max-height:200px;background:0 0}#available-menu-items .accordion-section-title button{display:block;width:28px;height:35px;position:absolute;top:5px;right:5px;box-shadow:none;outline:0;cursor:pointer;text-align:center}#available-menu-items .accordion-section-title .no-items,#available-menu-items .cannot-expand .accordion-section-title .spinner,#available-menu-items .cannot-expand .accordion-section-title>button{display:none}#available-menu-items-search.cannot-expand .accordion-section-title .spinner{display:block}#available-menu-items .cannot-expand .accordion-section-title .no-items{float:right;color:#555d66;font-weight:400;margin-left:5px}#available-menu-items .accordion-section-content{max-height:290px;margin:0;padding:0;position:relative;background:0 0}#available-menu-items .accordion-section-content .available-menu-items-list{margin:0 0 45px 0;padding:1px 15px 15px 15px}#available-menu-items .accordion-section-content .available-menu-items-list:only-child{margin-bottom:0}#new-custom-menu-item .accordion-section-content{padding:0 15px 15px 15px}#available-menu-items .menu-item-tpl{margin:0}#available-menu-items .new-content-item .create-item-input.invalid,#available-menu-items .new-content-item .create-item-input.invalid:focus,#custom-menu-item-name.invalid,#custom-menu-item-url.invalid,.edit-menu-item-url.invalid,.menu-name-field.invalid,.menu-name-field.invalid:focus{border:1px solid #dc3232}#available-menu-items .menu-item-handle .item-type{padding-right:0}#available-menu-items .menu-item-handle .item-title{padding-left:20px}#available-menu-items .menu-item-handle{cursor:pointer}#available-menu-items .menu-item-handle{box-shadow:none;margin-top:-1px}#available-menu-items .menu-item-handle:hover{z-index:1}#available-menu-items .item-title h4{padding:0 0 5px;font-size:14px}#available-menu-items .item-add{position:absolute;top:1px;left:1px;color:#82878c;width:30px;height:38px;box-shadow:none;outline:0;cursor:pointer;text-align:center}#available-menu-items .menu-item-handle .item-add:focus{color:#23282d}#available-menu-items .item-add:before{content:"\f543";position:relative;left:2px;top:3px;display:inline-block;height:20px;border-radius:50%;font:normal 20px/1.05 dashicons}#available-menu-items .menu-item-handle.item-added .item-add:focus,#available-menu-items .menu-item-handle.item-added .item-title,#available-menu-items .menu-item-handle.item-added .item-type,#available-menu-items .menu-item-handle.item-added:hover .item-add{color:#82878c}#available-menu-items .menu-item-handle.item-added .item-add:before{content:"\f147"}#available-menu-items .accordion-section-title.loading .spinner,#available-menu-items-search.loading .accordion-section-title .spinner{visibility:visible;margin:0 20px}#available-menu-items-search .spinner{position:absolute;top:20px;right:21px;margin:0!important}#available-menu-items #available-menu-items-search .accordion-section-content{position:absolute;left:0;top:60px;bottom:0;max-height:none;width:100%;padding:1px 15px 15px;box-sizing:border-box}#available-menu-items-search .nothing-found{margin-top:-1px}#available-menu-items-search .accordion-section-title:after{display:none}#available-menu-items-search .accordion-section-content:empty{min-height:0;padding:0}#available-menu-items-search.loading .accordion-section-content div{opacity:.5}#available-menu-items-search.loading.loading-more .accordion-section-content div{opacity:1}#customize-preview{transition:all .2s}body.adding-menu-items #available-menu-items{left:0;visibility:visible}body.adding-menu-items .wp-full-overlay-main{left:300px}body.adding-menu-items #customize-preview{opacity:.4}body.adding-menu-items #customize-preview iframe{pointer-events:none}.menu-item-handle .spinner{display:none;float:left;margin:0 8px 0 0}.nav-menu-inserted-item-loading .spinner{display:block}.nav-menu-inserted-item-loading .menu-item-handle .item-type{padding:0 0 0 8px}.added-menu-item .menu-item-handle.loading,.nav-menu-inserted-item-loading .menu-item-handle{padding:10px 15px 10px 8px;cursor:default;opacity:.5;background:#fff;color:#727773}.added-menu-item .menu-item-handle{transition-property:opacity,background,color;transition-duration:1.25s;transition-timing-function:cubic-bezier(.25,-2.5,.75,8)}#customize-theme-controls .control-panel-content .control-section-nav_menu:nth-last-child(2) .accordion-section-title{border-bottom-color:#ddd}#accordion-section-add_menu{margin:15px 12px}#accordion-section-add_menu h3{text-align:right}#accordion-section-add_menu .customize-add-menu-button,#accordion-section-add_menu h3{margin:0}#accordion-section-add_menu .customize-add-menu-button{font-weight:400}#create-new-menu-submit{float:right;margin:0 0 12px 0}.menu-delete-item{float:left;padding:1em 0;width:100%}.assigned-menu-locations-title p{margin:0 0 8px 0}li.assigned-to-menu-location .menu-delete-item{display:none}li.assigned-to-menu-location .add-new-menu-item{margin-bottom:1em}.menu-item-handle{margin-top:-1px}.ui-sortable-disabled .menu-item-handle{cursor:default}.menu-item-handle:hover{position:relative;z-index:10;color:#0073aa}#available-menu-items .menu-item-handle:hover .item-add,.menu-item-handle:hover .item-edit,.menu-item-handle:hover .item-type{color:#0073aa}.menu-item-edit-active .menu-item-handle{border-color:#999;border-bottom:none}.customize-control-nav_menu_item{margin-bottom:0}.customize-control-nav_menu .new-menu-item-invitation{margin-top:0;margin-bottom:0}.customize-control-nav_menu .customize-control-nav_menu-buttons{margin-top:12px}#available-menu-items .item-add:focus:before,#customize-controls .customize-info .customize-help-toggle:focus:before,.customize-screen-options-toggle:focus:before,.menu-delete:focus,.menu-item-bar .item-delete:focus:before,.wp-customizer .menu-item .submitbox .submitdelete:focus,.wp-customizer button:focus .toggle-indicator:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}@media screen and (max-width:782px){#available-menu-items #available-menu-items-search .accordion-section-content{top:63px}}@media screen and (max-width:640px){#available-menu-items #available-menu-items-search .accordion-section-content{top:130px}} \ No newline at end of file diff --git a/wp-admin/css/customize-widgets-rtl.css b/wp-admin/css/customize-widgets-rtl.css new file mode 100644 index 0000000..58f6fb9 --- /dev/null +++ b/wp-admin/css/customize-widgets-rtl.css @@ -0,0 +1,484 @@ +/*! This file is auto-generated */ +.wp-full-overlay-sidebar { + overflow: visible; +} + +/** + * Hide all sidebar sections by default, only show them (via JS) once the + * preview loads and we know whether the sidebars are used in the template. + */ + +.control-section.control-section-sidebar, +.customize-control-sidebar_widgets label, +.customize-control-sidebar_widgets .hide-if-js { + /* The link in .customize-control-sidebar_widgets .hide-if-js will fail if it ever gets used. */ + display: none; +} + +.control-section.control-section-sidebar .accordion-section-content.ui-sortable { + overflow: visible; +} + +/* Note: widget-tops are more compact when (max-height: 700px) and (min-width: 981px). */ +.customize-control-widget_form .widget-top { + background: #fff; + transition: opacity 0.5s; +} + +.customize-control .widget-action { + color: #72777c; +} + +.customize-control .widget-top:hover .widget-action, +.customize-control .widget-action:focus { + color: #23282d; +} + +.customize-control-widget_form:not(.widget-rendered) .widget-top { + opacity: 0.5; +} + +.customize-control-widget_form .widget-control-save { + display: none; +} + +.customize-control-widget_form .spinner { + visibility: hidden; + margin-top: 0; +} + +.customize-control-widget_form.previewer-loading .spinner { + visibility: visible; +} + +.customize-control-widget_form.widget-form-disabled .widget-content { + opacity: 0.7; + pointer-events: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.customize-control-widget_form .widget { + margin-bottom: 0; +} + +.customize-control-widget_form.wide-widget-control .widget-inside { + position: fixed; + right: 299px; + top: 25%; + border: 1px solid rgb(229, 229, 229); + overflow: auto; +} +.customize-control-widget_form.wide-widget-control .widget-inside > .form { + padding: 20px; +} + +.customize-control-widget_form.wide-widget-control .widget-top { + transition: background-color 0.4s; +} +.customize-control-widget_form.wide-widget-control.expanding .widget-top, +.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top { + background-color: rgb(227, 227, 227); +} + +.widget-inside { + padding: 1px 10px 10px 10px; + border-top: none; + line-height: 1.23076923; +} + +.customize-control-widget_form.expanded .widget-action .toggle-indicator:before { + content: "\f142"; +} + +.customize-control-widget_form.wide-widget-control .widget-action .toggle-indicator:before { + content: "\f141"; +} + +.customize-control-widget_form.wide-widget-control.expanded .widget-action .toggle-indicator:before { + content: "\f139"; +} + +.widget-title-action { + cursor: pointer; +} + +.widget-top, +.customize-control-widget_form .widget .customize-control-title { + cursor: move; +} + +.control-section.accordion-section.highlighted > .accordion-section-title, +.customize-control-widget_form.highlighted { + outline: none; + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); + position: relative; + z-index: 1; +} + +#widget-customizer-control-templates { + display: none; +} + +/** + * Widget reordering styles + */ + +#customize-theme-controls .widget-reorder-nav { + display: none; + float: left; + background-color: #fafafa; +} + +.move-widget:before { + content: "\f504"; +} + +#customize-theme-controls .move-widget-area { + display: none; + background: #fff; + border: 1px solid #ddd; + border-top: none; + cursor: auto; +} + +#customize-theme-controls .reordering .move-widget-area.active { + display: block; +} + +#customize-theme-controls .move-widget-area .description { + margin: 0; + padding: 15px 20px; + font-weight: 400; +} + +#customize-theme-controls .widget-area-select { + margin: 0; + padding: 0; + list-style: none; +} + +#customize-theme-controls .widget-area-select li { + position: relative; + margin: 0; + padding: 13px 42px 15px 15px; + color: #555; + border-top: 1px solid #eee; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#customize-theme-controls .widget-area-select li:before { + display: none; + content: "\f147"; + position: absolute; + top: 12px; + right: 10px; + font: normal 20px/1 dashicons; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#customize-theme-controls .widget-area-select li:last-child { + border-bottom: 1px solid #eee; +} + +#customize-theme-controls .widget-area-select .selected { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + background: #00a0d2; +} + +#customize-theme-controls .widget-area-select .selected:before { + display: block; +} + +#customize-theme-controls .move-widget-actions { + text-align: left; + padding: 12px; +} + +#customize-theme-controls .reordering .widget-title-action { + display: none; +} + +#customize-theme-controls .reordering .widget-reorder-nav { + display: block; +} + +/* Text Widget */ +.wp-customizer div.mce-inline-toolbar-grp, +.wp-customizer div.mce-tooltip { + z-index: 500100 !important; +} +.wp-customizer .ui-autocomplete.wplink-autocomplete { + z-index: 500110; /* originally 100110, but z-index of .wp-full-overlay is 500000 */ +} +.wp-customizer #wp-link-backdrop { + z-index: 500100; /* originally 100100, but z-index of .wp-full-overlay is 500000 */ +} +.wp-customizer #wp-link-wrap { + z-index: 500105; /* originally 100105, but z-index of .wp-full-overlay is 500000 */ +} + +/** + * Styles for new widget addition panel + */ + +/* override widgets admin page rules in wp-admin/css/widgets.css */ +#widgets-left #available-widgets .widget { + float: none !important; + width: auto !important; +} + +/* Keep rule that is no longer necessary on widgets.php. */ +#available-widgets .widget-action { + display: none; +} + +.ios #available-widgets { + transition: right 0s; +} + +#available-widgets .widget-tpl:hover, +#available-widgets .widget-tpl.selected { + background: #f3f3f5; + border-bottom-color: #ccc; + color: #0073aa; + border-right: 4px solid #0073aa; +} + +#customize-controls .widget-title h3 { + font-size: 1em; +} + +#available-widgets .widget-title h3 { + padding: 0 0 5px; + font-size: 14px; +} + +#available-widgets .widget .widget-description { + padding: 0; + color: #72777c; +} + +#customize-preview { + transition: all 0.2s; +} + +body.adding-widget #available-widgets { + right: 0; + visibility: visible; +} + +body.adding-widget .wp-full-overlay-main { + right: 300px; +} + +body.adding-widget #customize-preview { + opacity: 0.4; +} + + +/** + * Widget Icon styling + * No plurals in naming. + * Ordered from lowest to highest specificity. + */ + +#available-widgets .widget-title { + position: relative; +} + +#available-widgets .widget-title:before { + content: "\f132"; + position: absolute; + top: -3px; + left: 100%; + margin-left: 20px; + width: 20px; + height: 20px; + color: #32373c; + font: normal 20px/1 dashicons; + text-align: center; + box-sizing: border-box; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* dashicons-smiley */ +#available-widgets [class*="easy"] .widget-title:before { content: "\f328"; top: -4px; } + +/* dashicons-star-filled */ +#available-widgets [class*="super"] .widget-title:before, +#available-widgets [class*="like"] .widget-title:before { content: "\f155"; top: -4px; } + +/* dashicons-wordpress */ +#available-widgets [class*="meta"] .widget-title:before { content: "\f120"; } + +/* dashicons-archive */ +#available-widgets [class*="archives"] .widget-title:before { content: "\f480"; top: -4px; } + +/* dashicons-category */ +#available-widgets [class*="categor"] .widget-title:before { content: "\f318"; top: -4px; } + +/* dashicons-admin-comments */ +#available-widgets [class*="comment"] .widget-title:before, +#available-widgets [class*="testimonial"] .widget-title:before, +#available-widgets [class*="chat"] .widget-title:before { content: "\f101"; } + +/* dashicons-admin-post */ +#available-widgets [class*="post"] .widget-title:before { content: "\f109"; } + +/* dashicons-admin-page */ +#available-widgets [class*="page"] .widget-title:before { content: "\f105"; } + +/* dashicons-text */ +#available-widgets [class*="text"] .widget-title:before { content: "\f478"; } + +/* dashicons-admin-links */ +#available-widgets [class*="link"] .widget-title:before { content: "\f103"; } + +/* dashicons-search */ +#available-widgets [class*="search"] .widget-title:before { content: "\f179"; } + +/* dashicons-menu */ +#available-widgets [class*="menu"] .widget-title:before, +#available-widgets [class*="nav"] .widget-title:before { content: "\f333"; } + +/* dashicons-tagcloud */ +#available-widgets [class*="tag"] .widget-title:before { content: "\f479"; } + +/* dashicons-rss */ +#available-widgets [class*="rss"] .widget-title:before { content: "\f303"; top: -6px; } + +/* dashicons-calendar */ +#available-widgets [class*="event"] .widget-title:before, +#available-widgets [class*="calendar"] .widget-title:before { content: "\f145"; top: -4px;} + +/* dashicons-format-image */ +#available-widgets [class*="image"] .widget-title:before, +#available-widgets [class*="photo"] .widget-title:before, +#available-widgets [class*="slide"] .widget-title:before, +#available-widgets [class*="instagram"] .widget-title:before { content: "\f128"; } + +/* dashicons-format-gallery */ +#available-widgets [class*="album"] .widget-title:before, +#available-widgets [class*="galler"] .widget-title:before { content: "\f161"; } + +/* dashicons-format-video */ +#available-widgets [class*="video"] .widget-title:before, +#available-widgets [class*="tube"] .widget-title:before { content: "\f126"; } + +/* dashicons-format-audio */ +#available-widgets [class*="music"] .widget-title:before, +#available-widgets [class*="radio"] .widget-title:before, +#available-widgets [class*="audio"] .widget-title:before { content: "\f127"; } + +/* dashicons-admin-users */ +#available-widgets [class*="login"] .widget-title:before, +#available-widgets [class*="user"] .widget-title:before, +#available-widgets [class*="member"] .widget-title:before, +#available-widgets [class*="avatar"] .widget-title:before, +#available-widgets [class*="subscriber"] .widget-title:before, +#available-widgets [class*="profile"] .widget-title:before, +#available-widgets [class*="grofile"] .widget-title:before { content: "\f110"; } + +/* dashicons-cart */ +#available-widgets [class*="commerce"] .widget-title:before, +#available-widgets [class*="shop"] .widget-title:before, +#available-widgets [class*="cart"] .widget-title:before { content: "\f174"; top: -4px; } + +/* dashicons-shield */ +#available-widgets [class*="secur"] .widget-title:before, +#available-widgets [class*="firewall"] .widget-title:before { content: "\f332"; } + +/* dashicons-chart-bar */ +#available-widgets [class*="analytic"] .widget-title:before, +#available-widgets [class*="stat"] .widget-title:before, +#available-widgets [class*="poll"] .widget-title:before { content: "\f185"; } + +/* dashicons-feedback */ +#available-widgets [class*="form"] .widget-title:before { content: "\f175"; } + +/* dashicons-email-alt */ +#available-widgets [class*="subscribe"] .widget-title:before, +#available-widgets [class*="news"] .widget-title:before, +#available-widgets [class*="contact"] .widget-title:before, +#available-widgets [class*="mail"] .widget-title:before { content: "\f466"; } + +/* dashicons-share */ +#available-widgets [class*="share"] .widget-title:before, +#available-widgets [class*="socia"] .widget-title:before { content: "\f237"; } + +/* dashicons-translation */ +#available-widgets [class*="lang"] .widget-title:before, +#available-widgets [class*="translat"] .widget-title:before { content: "\f326"; } + +/* dashicons-location-alt */ +#available-widgets [class*="locat"] .widget-title:before, +#available-widgets [class*="map"] .widget-title:before { content: "\f231"; } + +/* dashicons-download */ +#available-widgets [class*="download"] .widget-title:before { content: "\f316"; } + +/* dashicons-cloud */ +#available-widgets [class*="weather"] .widget-title:before { content: "\f176"; top: -4px;} + +/* dashicons-facebook */ +#available-widgets [class*="facebook"] .widget-title:before { content: "\f304"; } + +/* dashicons-twitter */ +#available-widgets [class*="tweet"] .widget-title:before, +#available-widgets [class*="twitter"] .widget-title:before { content: "\f301"; } + +@media screen and (max-height: 700px) and (min-width: 981px) { + /* Compact widget-tops on smaller laptops, but not tablets. See ticket #27112#comment:4 */ + .customize-control-widget_form { + margin-bottom: 0; + } + + .widget-top { + box-shadow: none; + margin-top: -1px; + } + + .widget-top:hover { + position: relative; + z-index: 1; + } + + .last-widget { + margin-bottom: 15px; + } + + .widget-title h3 { + padding: 13px 15px; + } + + .widget-top .widget-action { + padding: 8px 10px; + } + + .widget-reorder-nav span { + height: 39px; + } + + .widget-reorder-nav span:before { + line-height: 39px; + } + + /* Compact the move widget areas. */ + #customize-theme-controls .widget-area-select li { + padding: 9px 42px 11px 15px; + } + + #customize-theme-controls .widget-area-select li:before { + top: 8px; + } +} diff --git a/wp-admin/css/customize-widgets-rtl.min.css b/wp-admin/css/customize-widgets-rtl.min.css new file mode 100644 index 0000000..beb4229 --- /dev/null +++ b/wp-admin/css/customize-widgets-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-full-overlay-sidebar{overflow:visible}.control-section.control-section-sidebar,.customize-control-sidebar_widgets .hide-if-js,.customize-control-sidebar_widgets label{display:none}.control-section.control-section-sidebar .accordion-section-content.ui-sortable{overflow:visible}.customize-control-widget_form .widget-top{background:#fff;transition:opacity .5s}.customize-control .widget-action{color:#72777c}.customize-control .widget-action:focus,.customize-control .widget-top:hover .widget-action{color:#23282d}.customize-control-widget_form:not(.widget-rendered) .widget-top{opacity:.5}.customize-control-widget_form .widget-control-save{display:none}.customize-control-widget_form .spinner{visibility:hidden;margin-top:0}.customize-control-widget_form.previewer-loading .spinner{visibility:visible}.customize-control-widget_form.widget-form-disabled .widget-content{opacity:.7;pointer-events:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.customize-control-widget_form .widget{margin-bottom:0}.customize-control-widget_form.wide-widget-control .widget-inside{position:fixed;right:299px;top:25%;border:1px solid #e5e5e5;overflow:auto}.customize-control-widget_form.wide-widget-control .widget-inside>.form{padding:20px}.customize-control-widget_form.wide-widget-control .widget-top{transition:background-color .4s}.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top,.customize-control-widget_form.wide-widget-control.expanding .widget-top{background-color:#e3e3e3}.widget-inside{padding:1px 10px 10px 10px;border-top:none;line-height:1.23076923}.customize-control-widget_form.expanded .widget-action .toggle-indicator:before{content:"\f142"}.customize-control-widget_form.wide-widget-control .widget-action .toggle-indicator:before{content:"\f141"}.customize-control-widget_form.wide-widget-control.expanded .widget-action .toggle-indicator:before{content:"\f139"}.widget-title-action{cursor:pointer}.customize-control-widget_form .widget .customize-control-title,.widget-top{cursor:move}.control-section.accordion-section.highlighted>.accordion-section-title,.customize-control-widget_form.highlighted{outline:0;box-shadow:0 0 2px rgba(30,140,190,.8);position:relative;z-index:1}#widget-customizer-control-templates{display:none}#customize-theme-controls .widget-reorder-nav{display:none;float:left;background-color:#fafafa}.move-widget:before{content:"\f504"}#customize-theme-controls .move-widget-area{display:none;background:#fff;border:1px solid #ddd;border-top:none;cursor:auto}#customize-theme-controls .reordering .move-widget-area.active{display:block}#customize-theme-controls .move-widget-area .description{margin:0;padding:15px 20px;font-weight:400}#customize-theme-controls .widget-area-select{margin:0;padding:0;list-style:none}#customize-theme-controls .widget-area-select li{position:relative;margin:0;padding:13px 42px 15px 15px;color:#555;border-top:1px solid #eee;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#customize-theme-controls .widget-area-select li:before{display:none;content:"\f147";position:absolute;top:12px;right:10px;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#customize-theme-controls .widget-area-select li:last-child{border-bottom:1px solid #eee}#customize-theme-controls .widget-area-select .selected{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.4);background:#00a0d2}#customize-theme-controls .widget-area-select .selected:before{display:block}#customize-theme-controls .move-widget-actions{text-align:left;padding:12px}#customize-theme-controls .reordering .widget-title-action{display:none}#customize-theme-controls .reordering .widget-reorder-nav{display:block}.wp-customizer div.mce-inline-toolbar-grp,.wp-customizer div.mce-tooltip{z-index:500100!important}.wp-customizer .ui-autocomplete.wplink-autocomplete{z-index:500110}.wp-customizer #wp-link-backdrop{z-index:500100}.wp-customizer #wp-link-wrap{z-index:500105}#widgets-left #available-widgets .widget{float:none!important;width:auto!important}#available-widgets .widget-action{display:none}.ios #available-widgets{transition:right 0s}#available-widgets .widget-tpl.selected,#available-widgets .widget-tpl:hover{background:#f3f3f5;border-bottom-color:#ccc;color:#0073aa;border-right:4px solid #0073aa}#customize-controls .widget-title h3{font-size:1em}#available-widgets .widget-title h3{padding:0 0 5px;font-size:14px}#available-widgets .widget .widget-description{padding:0;color:#72777c}#customize-preview{transition:all .2s}body.adding-widget #available-widgets{right:0;visibility:visible}body.adding-widget .wp-full-overlay-main{right:300px}body.adding-widget #customize-preview{opacity:.4}#available-widgets .widget-title{position:relative}#available-widgets .widget-title:before{content:"\f132";position:absolute;top:-3px;left:100%;margin-left:20px;width:20px;height:20px;color:#32373c;font:normal 20px/1 dashicons;text-align:center;box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#available-widgets [class*=easy] .widget-title:before{content:"\f328";top:-4px}#available-widgets [class*=like] .widget-title:before,#available-widgets [class*=super] .widget-title:before{content:"\f155";top:-4px}#available-widgets [class*=meta] .widget-title:before{content:"\f120"}#available-widgets [class*=archives] .widget-title:before{content:"\f480";top:-4px}#available-widgets [class*=categor] .widget-title:before{content:"\f318";top:-4px}#available-widgets [class*=chat] .widget-title:before,#available-widgets [class*=comment] .widget-title:before,#available-widgets [class*=testimonial] .widget-title:before{content:"\f101"}#available-widgets [class*=post] .widget-title:before{content:"\f109"}#available-widgets [class*=page] .widget-title:before{content:"\f105"}#available-widgets [class*=text] .widget-title:before{content:"\f478"}#available-widgets [class*=link] .widget-title:before{content:"\f103"}#available-widgets [class*=search] .widget-title:before{content:"\f179"}#available-widgets [class*=menu] .widget-title:before,#available-widgets [class*=nav] .widget-title:before{content:"\f333"}#available-widgets [class*=tag] .widget-title:before{content:"\f479"}#available-widgets [class*=rss] .widget-title:before{content:"\f303";top:-6px}#available-widgets [class*=calendar] .widget-title:before,#available-widgets [class*=event] .widget-title:before{content:"\f145";top:-4px}#available-widgets [class*=image] .widget-title:before,#available-widgets [class*=instagram] .widget-title:before,#available-widgets [class*=photo] .widget-title:before,#available-widgets [class*=slide] .widget-title:before{content:"\f128"}#available-widgets [class*=album] .widget-title:before,#available-widgets [class*=galler] .widget-title:before{content:"\f161"}#available-widgets [class*=tube] .widget-title:before,#available-widgets [class*=video] .widget-title:before{content:"\f126"}#available-widgets [class*=audio] .widget-title:before,#available-widgets [class*=music] .widget-title:before,#available-widgets [class*=radio] .widget-title:before{content:"\f127"}#available-widgets [class*=avatar] .widget-title:before,#available-widgets [class*=grofile] .widget-title:before,#available-widgets [class*=login] .widget-title:before,#available-widgets [class*=member] .widget-title:before,#available-widgets [class*=profile] .widget-title:before,#available-widgets [class*=subscriber] .widget-title:before,#available-widgets [class*=user] .widget-title:before{content:"\f110"}#available-widgets [class*=cart] .widget-title:before,#available-widgets [class*=commerce] .widget-title:before,#available-widgets [class*=shop] .widget-title:before{content:"\f174";top:-4px}#available-widgets [class*=firewall] .widget-title:before,#available-widgets [class*=secur] .widget-title:before{content:"\f332"}#available-widgets [class*=analytic] .widget-title:before,#available-widgets [class*=poll] .widget-title:before,#available-widgets [class*=stat] .widget-title:before{content:"\f185"}#available-widgets [class*=form] .widget-title:before{content:"\f175"}#available-widgets [class*=contact] .widget-title:before,#available-widgets [class*=mail] .widget-title:before,#available-widgets [class*=news] .widget-title:before,#available-widgets [class*=subscribe] .widget-title:before{content:"\f466"}#available-widgets [class*=share] .widget-title:before,#available-widgets [class*=socia] .widget-title:before{content:"\f237"}#available-widgets [class*=lang] .widget-title:before,#available-widgets [class*=translat] .widget-title:before{content:"\f326"}#available-widgets [class*=locat] .widget-title:before,#available-widgets [class*=map] .widget-title:before{content:"\f231"}#available-widgets [class*=download] .widget-title:before{content:"\f316"}#available-widgets [class*=weather] .widget-title:before{content:"\f176";top:-4px}#available-widgets [class*=facebook] .widget-title:before{content:"\f304"}#available-widgets [class*=tweet] .widget-title:before,#available-widgets [class*=twitter] .widget-title:before{content:"\f301"}@media screen and (max-height:700px) and (min-width:981px){.customize-control-widget_form{margin-bottom:0}.widget-top{box-shadow:none;margin-top:-1px}.widget-top:hover{position:relative;z-index:1}.last-widget{margin-bottom:15px}.widget-title h3{padding:13px 15px}.widget-top .widget-action{padding:8px 10px}.widget-reorder-nav span{height:39px}.widget-reorder-nav span:before{line-height:39px}#customize-theme-controls .widget-area-select li{padding:9px 42px 11px 15px}#customize-theme-controls .widget-area-select li:before{top:8px}} \ No newline at end of file diff --git a/wp-admin/css/customize-widgets.css b/wp-admin/css/customize-widgets.css new file mode 100644 index 0000000..2b9c254 --- /dev/null +++ b/wp-admin/css/customize-widgets.css @@ -0,0 +1,483 @@ +.wp-full-overlay-sidebar { + overflow: visible; +} + +/** + * Hide all sidebar sections by default, only show them (via JS) once the + * preview loads and we know whether the sidebars are used in the template. + */ + +.control-section.control-section-sidebar, +.customize-control-sidebar_widgets label, +.customize-control-sidebar_widgets .hide-if-js { + /* The link in .customize-control-sidebar_widgets .hide-if-js will fail if it ever gets used. */ + display: none; +} + +.control-section.control-section-sidebar .accordion-section-content.ui-sortable { + overflow: visible; +} + +/* Note: widget-tops are more compact when (max-height: 700px) and (min-width: 981px). */ +.customize-control-widget_form .widget-top { + background: #fff; + transition: opacity 0.5s; +} + +.customize-control .widget-action { + color: #72777c; +} + +.customize-control .widget-top:hover .widget-action, +.customize-control .widget-action:focus { + color: #23282d; +} + +.customize-control-widget_form:not(.widget-rendered) .widget-top { + opacity: 0.5; +} + +.customize-control-widget_form .widget-control-save { + display: none; +} + +.customize-control-widget_form .spinner { + visibility: hidden; + margin-top: 0; +} + +.customize-control-widget_form.previewer-loading .spinner { + visibility: visible; +} + +.customize-control-widget_form.widget-form-disabled .widget-content { + opacity: 0.7; + pointer-events: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.customize-control-widget_form .widget { + margin-bottom: 0; +} + +.customize-control-widget_form.wide-widget-control .widget-inside { + position: fixed; + left: 299px; + top: 25%; + border: 1px solid rgb(229, 229, 229); + overflow: auto; +} +.customize-control-widget_form.wide-widget-control .widget-inside > .form { + padding: 20px; +} + +.customize-control-widget_form.wide-widget-control .widget-top { + transition: background-color 0.4s; +} +.customize-control-widget_form.wide-widget-control.expanding .widget-top, +.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top { + background-color: rgb(227, 227, 227); +} + +.widget-inside { + padding: 1px 10px 10px 10px; + border-top: none; + line-height: 1.23076923; +} + +.customize-control-widget_form.expanded .widget-action .toggle-indicator:before { + content: "\f142"; +} + +.customize-control-widget_form.wide-widget-control .widget-action .toggle-indicator:before { + content: "\f139"; +} + +.customize-control-widget_form.wide-widget-control.expanded .widget-action .toggle-indicator:before { + content: "\f141"; +} + +.widget-title-action { + cursor: pointer; +} + +.widget-top, +.customize-control-widget_form .widget .customize-control-title { + cursor: move; +} + +.control-section.accordion-section.highlighted > .accordion-section-title, +.customize-control-widget_form.highlighted { + outline: none; + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); + position: relative; + z-index: 1; +} + +#widget-customizer-control-templates { + display: none; +} + +/** + * Widget reordering styles + */ + +#customize-theme-controls .widget-reorder-nav { + display: none; + float: right; + background-color: #fafafa; +} + +.move-widget:before { + content: "\f504"; +} + +#customize-theme-controls .move-widget-area { + display: none; + background: #fff; + border: 1px solid #ddd; + border-top: none; + cursor: auto; +} + +#customize-theme-controls .reordering .move-widget-area.active { + display: block; +} + +#customize-theme-controls .move-widget-area .description { + margin: 0; + padding: 15px 20px; + font-weight: 400; +} + +#customize-theme-controls .widget-area-select { + margin: 0; + padding: 0; + list-style: none; +} + +#customize-theme-controls .widget-area-select li { + position: relative; + margin: 0; + padding: 13px 15px 15px 42px; + color: #555; + border-top: 1px solid #eee; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#customize-theme-controls .widget-area-select li:before { + display: none; + content: "\f147"; + position: absolute; + top: 12px; + left: 10px; + font: normal 20px/1 dashicons; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#customize-theme-controls .widget-area-select li:last-child { + border-bottom: 1px solid #eee; +} + +#customize-theme-controls .widget-area-select .selected { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + background: #00a0d2; +} + +#customize-theme-controls .widget-area-select .selected:before { + display: block; +} + +#customize-theme-controls .move-widget-actions { + text-align: right; + padding: 12px; +} + +#customize-theme-controls .reordering .widget-title-action { + display: none; +} + +#customize-theme-controls .reordering .widget-reorder-nav { + display: block; +} + +/* Text Widget */ +.wp-customizer div.mce-inline-toolbar-grp, +.wp-customizer div.mce-tooltip { + z-index: 500100 !important; +} +.wp-customizer .ui-autocomplete.wplink-autocomplete { + z-index: 500110; /* originally 100110, but z-index of .wp-full-overlay is 500000 */ +} +.wp-customizer #wp-link-backdrop { + z-index: 500100; /* originally 100100, but z-index of .wp-full-overlay is 500000 */ +} +.wp-customizer #wp-link-wrap { + z-index: 500105; /* originally 100105, but z-index of .wp-full-overlay is 500000 */ +} + +/** + * Styles for new widget addition panel + */ + +/* override widgets admin page rules in wp-admin/css/widgets.css */ +#widgets-left #available-widgets .widget { + float: none !important; + width: auto !important; +} + +/* Keep rule that is no longer necessary on widgets.php. */ +#available-widgets .widget-action { + display: none; +} + +.ios #available-widgets { + transition: left 0s; +} + +#available-widgets .widget-tpl:hover, +#available-widgets .widget-tpl.selected { + background: #f3f3f5; + border-bottom-color: #ccc; + color: #0073aa; + border-left: 4px solid #0073aa; +} + +#customize-controls .widget-title h3 { + font-size: 1em; +} + +#available-widgets .widget-title h3 { + padding: 0 0 5px; + font-size: 14px; +} + +#available-widgets .widget .widget-description { + padding: 0; + color: #72777c; +} + +#customize-preview { + transition: all 0.2s; +} + +body.adding-widget #available-widgets { + left: 0; + visibility: visible; +} + +body.adding-widget .wp-full-overlay-main { + left: 300px; +} + +body.adding-widget #customize-preview { + opacity: 0.4; +} + + +/** + * Widget Icon styling + * No plurals in naming. + * Ordered from lowest to highest specificity. + */ + +#available-widgets .widget-title { + position: relative; +} + +#available-widgets .widget-title:before { + content: "\f132"; + position: absolute; + top: -3px; + right: 100%; + margin-right: 20px; + width: 20px; + height: 20px; + color: #32373c; + font: normal 20px/1 dashicons; + text-align: center; + box-sizing: border-box; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* dashicons-smiley */ +#available-widgets [class*="easy"] .widget-title:before { content: "\f328"; top: -4px; } + +/* dashicons-star-filled */ +#available-widgets [class*="super"] .widget-title:before, +#available-widgets [class*="like"] .widget-title:before { content: "\f155"; top: -4px; } + +/* dashicons-wordpress */ +#available-widgets [class*="meta"] .widget-title:before { content: "\f120"; } + +/* dashicons-archive */ +#available-widgets [class*="archives"] .widget-title:before { content: "\f480"; top: -4px; } + +/* dashicons-category */ +#available-widgets [class*="categor"] .widget-title:before { content: "\f318"; top: -4px; } + +/* dashicons-admin-comments */ +#available-widgets [class*="comment"] .widget-title:before, +#available-widgets [class*="testimonial"] .widget-title:before, +#available-widgets [class*="chat"] .widget-title:before { content: "\f101"; } + +/* dashicons-admin-post */ +#available-widgets [class*="post"] .widget-title:before { content: "\f109"; } + +/* dashicons-admin-page */ +#available-widgets [class*="page"] .widget-title:before { content: "\f105"; } + +/* dashicons-text */ +#available-widgets [class*="text"] .widget-title:before { content: "\f478"; } + +/* dashicons-admin-links */ +#available-widgets [class*="link"] .widget-title:before { content: "\f103"; } + +/* dashicons-search */ +#available-widgets [class*="search"] .widget-title:before { content: "\f179"; } + +/* dashicons-menu */ +#available-widgets [class*="menu"] .widget-title:before, +#available-widgets [class*="nav"] .widget-title:before { content: "\f333"; } + +/* dashicons-tagcloud */ +#available-widgets [class*="tag"] .widget-title:before { content: "\f479"; } + +/* dashicons-rss */ +#available-widgets [class*="rss"] .widget-title:before { content: "\f303"; top: -6px; } + +/* dashicons-calendar */ +#available-widgets [class*="event"] .widget-title:before, +#available-widgets [class*="calendar"] .widget-title:before { content: "\f145"; top: -4px;} + +/* dashicons-format-image */ +#available-widgets [class*="image"] .widget-title:before, +#available-widgets [class*="photo"] .widget-title:before, +#available-widgets [class*="slide"] .widget-title:before, +#available-widgets [class*="instagram"] .widget-title:before { content: "\f128"; } + +/* dashicons-format-gallery */ +#available-widgets [class*="album"] .widget-title:before, +#available-widgets [class*="galler"] .widget-title:before { content: "\f161"; } + +/* dashicons-format-video */ +#available-widgets [class*="video"] .widget-title:before, +#available-widgets [class*="tube"] .widget-title:before { content: "\f126"; } + +/* dashicons-format-audio */ +#available-widgets [class*="music"] .widget-title:before, +#available-widgets [class*="radio"] .widget-title:before, +#available-widgets [class*="audio"] .widget-title:before { content: "\f127"; } + +/* dashicons-admin-users */ +#available-widgets [class*="login"] .widget-title:before, +#available-widgets [class*="user"] .widget-title:before, +#available-widgets [class*="member"] .widget-title:before, +#available-widgets [class*="avatar"] .widget-title:before, +#available-widgets [class*="subscriber"] .widget-title:before, +#available-widgets [class*="profile"] .widget-title:before, +#available-widgets [class*="grofile"] .widget-title:before { content: "\f110"; } + +/* dashicons-cart */ +#available-widgets [class*="commerce"] .widget-title:before, +#available-widgets [class*="shop"] .widget-title:before, +#available-widgets [class*="cart"] .widget-title:before { content: "\f174"; top: -4px; } + +/* dashicons-shield */ +#available-widgets [class*="secur"] .widget-title:before, +#available-widgets [class*="firewall"] .widget-title:before { content: "\f332"; } + +/* dashicons-chart-bar */ +#available-widgets [class*="analytic"] .widget-title:before, +#available-widgets [class*="stat"] .widget-title:before, +#available-widgets [class*="poll"] .widget-title:before { content: "\f185"; } + +/* dashicons-feedback */ +#available-widgets [class*="form"] .widget-title:before { content: "\f175"; } + +/* dashicons-email-alt */ +#available-widgets [class*="subscribe"] .widget-title:before, +#available-widgets [class*="news"] .widget-title:before, +#available-widgets [class*="contact"] .widget-title:before, +#available-widgets [class*="mail"] .widget-title:before { content: "\f466"; } + +/* dashicons-share */ +#available-widgets [class*="share"] .widget-title:before, +#available-widgets [class*="socia"] .widget-title:before { content: "\f237"; } + +/* dashicons-translation */ +#available-widgets [class*="lang"] .widget-title:before, +#available-widgets [class*="translat"] .widget-title:before { content: "\f326"; } + +/* dashicons-location-alt */ +#available-widgets [class*="locat"] .widget-title:before, +#available-widgets [class*="map"] .widget-title:before { content: "\f231"; } + +/* dashicons-download */ +#available-widgets [class*="download"] .widget-title:before { content: "\f316"; } + +/* dashicons-cloud */ +#available-widgets [class*="weather"] .widget-title:before { content: "\f176"; top: -4px;} + +/* dashicons-facebook */ +#available-widgets [class*="facebook"] .widget-title:before { content: "\f304"; } + +/* dashicons-twitter */ +#available-widgets [class*="tweet"] .widget-title:before, +#available-widgets [class*="twitter"] .widget-title:before { content: "\f301"; } + +@media screen and (max-height: 700px) and (min-width: 981px) { + /* Compact widget-tops on smaller laptops, but not tablets. See ticket #27112#comment:4 */ + .customize-control-widget_form { + margin-bottom: 0; + } + + .widget-top { + box-shadow: none; + margin-top: -1px; + } + + .widget-top:hover { + position: relative; + z-index: 1; + } + + .last-widget { + margin-bottom: 15px; + } + + .widget-title h3 { + padding: 13px 15px; + } + + .widget-top .widget-action { + padding: 8px 10px; + } + + .widget-reorder-nav span { + height: 39px; + } + + .widget-reorder-nav span:before { + line-height: 39px; + } + + /* Compact the move widget areas. */ + #customize-theme-controls .widget-area-select li { + padding: 9px 15px 11px 42px; + } + + #customize-theme-controls .widget-area-select li:before { + top: 8px; + } +} diff --git a/wp-admin/css/customize-widgets.min.css b/wp-admin/css/customize-widgets.min.css new file mode 100644 index 0000000..c950250 --- /dev/null +++ b/wp-admin/css/customize-widgets.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-full-overlay-sidebar{overflow:visible}.control-section.control-section-sidebar,.customize-control-sidebar_widgets .hide-if-js,.customize-control-sidebar_widgets label{display:none}.control-section.control-section-sidebar .accordion-section-content.ui-sortable{overflow:visible}.customize-control-widget_form .widget-top{background:#fff;transition:opacity .5s}.customize-control .widget-action{color:#72777c}.customize-control .widget-action:focus,.customize-control .widget-top:hover .widget-action{color:#23282d}.customize-control-widget_form:not(.widget-rendered) .widget-top{opacity:.5}.customize-control-widget_form .widget-control-save{display:none}.customize-control-widget_form .spinner{visibility:hidden;margin-top:0}.customize-control-widget_form.previewer-loading .spinner{visibility:visible}.customize-control-widget_form.widget-form-disabled .widget-content{opacity:.7;pointer-events:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.customize-control-widget_form .widget{margin-bottom:0}.customize-control-widget_form.wide-widget-control .widget-inside{position:fixed;left:299px;top:25%;border:1px solid #e5e5e5;overflow:auto}.customize-control-widget_form.wide-widget-control .widget-inside>.form{padding:20px}.customize-control-widget_form.wide-widget-control .widget-top{transition:background-color .4s}.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top,.customize-control-widget_form.wide-widget-control.expanding .widget-top{background-color:#e3e3e3}.widget-inside{padding:1px 10px 10px 10px;border-top:none;line-height:1.23076923}.customize-control-widget_form.expanded .widget-action .toggle-indicator:before{content:"\f142"}.customize-control-widget_form.wide-widget-control .widget-action .toggle-indicator:before{content:"\f139"}.customize-control-widget_form.wide-widget-control.expanded .widget-action .toggle-indicator:before{content:"\f141"}.widget-title-action{cursor:pointer}.customize-control-widget_form .widget .customize-control-title,.widget-top{cursor:move}.control-section.accordion-section.highlighted>.accordion-section-title,.customize-control-widget_form.highlighted{outline:0;box-shadow:0 0 2px rgba(30,140,190,.8);position:relative;z-index:1}#widget-customizer-control-templates{display:none}#customize-theme-controls .widget-reorder-nav{display:none;float:right;background-color:#fafafa}.move-widget:before{content:"\f504"}#customize-theme-controls .move-widget-area{display:none;background:#fff;border:1px solid #ddd;border-top:none;cursor:auto}#customize-theme-controls .reordering .move-widget-area.active{display:block}#customize-theme-controls .move-widget-area .description{margin:0;padding:15px 20px;font-weight:400}#customize-theme-controls .widget-area-select{margin:0;padding:0;list-style:none}#customize-theme-controls .widget-area-select li{position:relative;margin:0;padding:13px 15px 15px 42px;color:#555;border-top:1px solid #eee;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#customize-theme-controls .widget-area-select li:before{display:none;content:"\f147";position:absolute;top:12px;left:10px;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#customize-theme-controls .widget-area-select li:last-child{border-bottom:1px solid #eee}#customize-theme-controls .widget-area-select .selected{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.4);background:#00a0d2}#customize-theme-controls .widget-area-select .selected:before{display:block}#customize-theme-controls .move-widget-actions{text-align:right;padding:12px}#customize-theme-controls .reordering .widget-title-action{display:none}#customize-theme-controls .reordering .widget-reorder-nav{display:block}.wp-customizer div.mce-inline-toolbar-grp,.wp-customizer div.mce-tooltip{z-index:500100!important}.wp-customizer .ui-autocomplete.wplink-autocomplete{z-index:500110}.wp-customizer #wp-link-backdrop{z-index:500100}.wp-customizer #wp-link-wrap{z-index:500105}#widgets-left #available-widgets .widget{float:none!important;width:auto!important}#available-widgets .widget-action{display:none}.ios #available-widgets{transition:left 0s}#available-widgets .widget-tpl.selected,#available-widgets .widget-tpl:hover{background:#f3f3f5;border-bottom-color:#ccc;color:#0073aa;border-left:4px solid #0073aa}#customize-controls .widget-title h3{font-size:1em}#available-widgets .widget-title h3{padding:0 0 5px;font-size:14px}#available-widgets .widget .widget-description{padding:0;color:#72777c}#customize-preview{transition:all .2s}body.adding-widget #available-widgets{left:0;visibility:visible}body.adding-widget .wp-full-overlay-main{left:300px}body.adding-widget #customize-preview{opacity:.4}#available-widgets .widget-title{position:relative}#available-widgets .widget-title:before{content:"\f132";position:absolute;top:-3px;right:100%;margin-right:20px;width:20px;height:20px;color:#32373c;font:normal 20px/1 dashicons;text-align:center;box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#available-widgets [class*=easy] .widget-title:before{content:"\f328";top:-4px}#available-widgets [class*=like] .widget-title:before,#available-widgets [class*=super] .widget-title:before{content:"\f155";top:-4px}#available-widgets [class*=meta] .widget-title:before{content:"\f120"}#available-widgets [class*=archives] .widget-title:before{content:"\f480";top:-4px}#available-widgets [class*=categor] .widget-title:before{content:"\f318";top:-4px}#available-widgets [class*=chat] .widget-title:before,#available-widgets [class*=comment] .widget-title:before,#available-widgets [class*=testimonial] .widget-title:before{content:"\f101"}#available-widgets [class*=post] .widget-title:before{content:"\f109"}#available-widgets [class*=page] .widget-title:before{content:"\f105"}#available-widgets [class*=text] .widget-title:before{content:"\f478"}#available-widgets [class*=link] .widget-title:before{content:"\f103"}#available-widgets [class*=search] .widget-title:before{content:"\f179"}#available-widgets [class*=menu] .widget-title:before,#available-widgets [class*=nav] .widget-title:before{content:"\f333"}#available-widgets [class*=tag] .widget-title:before{content:"\f479"}#available-widgets [class*=rss] .widget-title:before{content:"\f303";top:-6px}#available-widgets [class*=calendar] .widget-title:before,#available-widgets [class*=event] .widget-title:before{content:"\f145";top:-4px}#available-widgets [class*=image] .widget-title:before,#available-widgets [class*=instagram] .widget-title:before,#available-widgets [class*=photo] .widget-title:before,#available-widgets [class*=slide] .widget-title:before{content:"\f128"}#available-widgets [class*=album] .widget-title:before,#available-widgets [class*=galler] .widget-title:before{content:"\f161"}#available-widgets [class*=tube] .widget-title:before,#available-widgets [class*=video] .widget-title:before{content:"\f126"}#available-widgets [class*=audio] .widget-title:before,#available-widgets [class*=music] .widget-title:before,#available-widgets [class*=radio] .widget-title:before{content:"\f127"}#available-widgets [class*=avatar] .widget-title:before,#available-widgets [class*=grofile] .widget-title:before,#available-widgets [class*=login] .widget-title:before,#available-widgets [class*=member] .widget-title:before,#available-widgets [class*=profile] .widget-title:before,#available-widgets [class*=subscriber] .widget-title:before,#available-widgets [class*=user] .widget-title:before{content:"\f110"}#available-widgets [class*=cart] .widget-title:before,#available-widgets [class*=commerce] .widget-title:before,#available-widgets [class*=shop] .widget-title:before{content:"\f174";top:-4px}#available-widgets [class*=firewall] .widget-title:before,#available-widgets [class*=secur] .widget-title:before{content:"\f332"}#available-widgets [class*=analytic] .widget-title:before,#available-widgets [class*=poll] .widget-title:before,#available-widgets [class*=stat] .widget-title:before{content:"\f185"}#available-widgets [class*=form] .widget-title:before{content:"\f175"}#available-widgets [class*=contact] .widget-title:before,#available-widgets [class*=mail] .widget-title:before,#available-widgets [class*=news] .widget-title:before,#available-widgets [class*=subscribe] .widget-title:before{content:"\f466"}#available-widgets [class*=share] .widget-title:before,#available-widgets [class*=socia] .widget-title:before{content:"\f237"}#available-widgets [class*=lang] .widget-title:before,#available-widgets [class*=translat] .widget-title:before{content:"\f326"}#available-widgets [class*=locat] .widget-title:before,#available-widgets [class*=map] .widget-title:before{content:"\f231"}#available-widgets [class*=download] .widget-title:before{content:"\f316"}#available-widgets [class*=weather] .widget-title:before{content:"\f176";top:-4px}#available-widgets [class*=facebook] .widget-title:before{content:"\f304"}#available-widgets [class*=tweet] .widget-title:before,#available-widgets [class*=twitter] .widget-title:before{content:"\f301"}@media screen and (max-height:700px) and (min-width:981px){.customize-control-widget_form{margin-bottom:0}.widget-top{box-shadow:none;margin-top:-1px}.widget-top:hover{position:relative;z-index:1}.last-widget{margin-bottom:15px}.widget-title h3{padding:13px 15px}.widget-top .widget-action{padding:8px 10px}.widget-reorder-nav span{height:39px}.widget-reorder-nav span:before{line-height:39px}#customize-theme-controls .widget-area-select li{padding:9px 15px 11px 42px}#customize-theme-controls .widget-area-select li:before{top:8px}} \ No newline at end of file diff --git a/wp-admin/css/dashboard-rtl.css b/wp-admin/css/dashboard-rtl.css new file mode 100644 index 0000000..e336a00 --- /dev/null +++ b/wp-admin/css/dashboard-rtl.css @@ -0,0 +1,1294 @@ +/*! This file is auto-generated */ +#wpbody-content #dashboard-widgets.columns-1 .postbox-container { + width: 100%; +} + +#wpbody-content #dashboard-widgets.columns-2 .postbox-container { + width: 49.5%; +} + +#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2, +#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3, +#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4 { + float: left; + width: 50.5%; +} + +#wpbody-content #dashboard-widgets.columns-3 .postbox-container { + width: 33.5%; +} + +#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1 { + width: 33%; +} + +#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3, +#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4 { + float: left; +} + +#wpbody-content #dashboard-widgets.columns-4 .postbox-container { + width: 25%; +} + +#dashboard-widgets .postbox-container { + width: 25%; +} + +#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container { + border: none !important; +} + +.ie8 #wpbody-content #dashboard-widgets .postbox-container { + width: 49.5%; +} + +.ie8 #wpbody-content #dashboard-widgets #postbox-container-2, +.ie8 #wpbody-content #dashboard-widgets #postbox-container-3, +.ie8 #wpbody-content #dashboard-widgets #postbox-container-4 { + float: left; + width: 50.5%; +} + +.ie8 #dashboard-widgets #postbox-container-3 .empty-container, +.ie8 #dashboard-widgets #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; +} + +#dashboard-widgets-wrap { + overflow: hidden; + margin: 0 -8px; +} + +#dashboard-widgets .postbox .inside { + margin-bottom: 0; +} + +#dashboard-widgets .meta-box-sortables { + margin: 0 8px; + min-height: 100px; +} + +/* @todo: this was originally in this section, but likely belongs elsewhere */ +#the-comment-list td.comment p.comment-author { + margin-top: 0; + margin-right: 0; +} + +#the-comment-list p.comment-author img { + float: right; + margin-left: 8px; +} + +#the-comment-list p.comment-author strong a { + border: none; +} + +#the-comment-list td { + vertical-align: top; +} + +#the-comment-list td.comment { + word-wrap: break-word; +} + +#the-comment-list td.comment img { + max-width: 100%; +} + +/* Welcome Panel */ +.welcome-panel { + position: relative; + overflow: auto; + margin: 16px 0; + padding: 23px 10px 0; + border: 1px solid #ccd0d4; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + background: #fff; + font-size: 13px; + line-height: 1.7; +} + +.welcome-panel h2 { + margin: 0; + font-size: 21px; + font-weight: 400; + line-height: 1.2; +} + +.welcome-panel h3 { + margin: 1.33em 0 0; + font-size: 16px; +} + +.welcome-panel li { + font-size: 14px; +} + +.welcome-panel p { + color: #72777c; +} + +.welcome-panel li a { + text-decoration: none; +} + +.welcome-panel .about-description { + font-size: 16px; + margin: 0; +} + +.welcome-panel .welcome-panel-close { + position: absolute; + top: 10px; + left: 10px; + padding: 10px 21px 10px 15px; + font-size: 13px; + line-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */ + text-decoration: none; +} + +.welcome-panel .welcome-panel-close:before { + position: absolute; + top: 8px; + right: 0; + transition: all .1s ease-in-out; +} + +.wp-core-ui .welcome-panel .button.button-hero { + margin: 15px 0 3px 13px; + padding: 12px 36px; + height: auto; + line-height: 1.4285714; + white-space: normal; +} + +.welcome-panel-content { + margin-right: 13px; + max-width: 1500px; +} + +.welcome-panel .welcome-panel-column-container { + clear: both; + position: relative; +} + +.welcome-panel .welcome-panel-column { + width: 32%; + min-width: 200px; + float: right; +} + +.ie8 .welcome-panel .welcome-panel-column { + min-width: 230px; +} + +.welcome-panel .welcome-panel-column:first-child { + width: 36%; +} + +.welcome-panel-column p.hide-if-no-customize { + margin-top: 10px; +} + +.welcome-panel-column p { + margin-top: 7px; + color: #444; +} + +.welcome-panel .welcome-widgets-menus { + line-height: 1.14285714; +} + +.welcome-panel .welcome-panel-column ul { + margin: 0.8em 0 1em 1em; +} + +.welcome-panel .welcome-panel-column li { + line-height: 1.14285714; + list-style-type: none; + padding: 0 0 8px; +} + +.welcome-panel .welcome-icon { + background: transparent !important; +} + +/* Welcome Panel and Right Now common Icons style */ + +.welcome-panel .welcome-icon:before, +#dashboard_right_now li a:before, +#dashboard_right_now li span:before { + color: #606a73; + font: normal 20px/1 dashicons; + speak: none; + display: inline-block; + padding: 0 0 0 10px; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + vertical-align: top; +} + +/* Welcome Panel specific Icons styles */ + +.welcome-panel .welcome-write-blog:before, +.welcome-panel .welcome-edit-page:before { + content: "\f119"; + top: -3px; +} + +.welcome-panel .welcome-add-page:before { + content: "\f132"; + top: -1px; +} + +.welcome-panel .welcome-setup-home:before { + content: "\f102"; + top: -1px; +} + +.welcome-panel .welcome-view-site:before { + content: "\f115"; + top: -2px; +} + +.welcome-panel .welcome-widgets-menus:before { + content: "\f116"; + top: -2px; +} + +.welcome-panel .welcome-widgets:before { + content: "\f538"; + top: -2px; +} + +.welcome-panel .welcome-menus:before { + content: "\f163"; + top: -2px; +} + +.welcome-panel .welcome-comments:before { + content: "\f117"; + top: -1px; +} + +.welcome-panel .welcome-learn-more:before { + content: "\f118"; + top: -1px; +} + +/* Right Now specific Icons styles */ + +#dashboard_right_now li a:before, +#dashboard_right_now li > span:before { /* get only the first level span to exclude screen-reader-text in mu-storage */ + content: "\f159"; /* generic icon for items added by CPTs ? */ + padding: 0 0 0 5px; +} + +#dashboard_right_now .page-count a:before, +#dashboard_right_now .page-count span:before { + content: "\f105"; +} + +#dashboard_right_now .post-count a:before, +#dashboard_right_now .post-count span:before { + content: "\f109"; +} + +#dashboard_right_now .comment-count a:before { + content: "\f101"; +} + +#dashboard_right_now .comment-mod-count a:before { + content: "\f125"; +} + +#dashboard_right_now .storage-count a:before { + content: "\f104"; +} + +#dashboard_right_now .storage-count.warning a:before { + content: "\f153"; +} + +/* Dashboard WordPress events */ + +.community-events-errors { + margin: 0; +} + +.community-events-loading { + padding: 10px 12px 8px; +} + +.community-events { + margin-bottom: 6px; + padding: 0 12px; +} + +.community-events .spinner { + float: none; + margin: 5px 2px 0; + vertical-align: top; +} + +.community-events-errors[aria-hidden="true"], +.community-events-errors [aria-hidden="true"], +.community-events-loading[aria-hidden="true"], +.community-events[aria-hidden="true"], +.community-events [aria-hidden="true"] { + display: none; +} + +.community-events .activity-block:first-child, +.community-events h2 { + padding-top: 12px; + padding-bottom: 10px; +} + +.community-events-form { + margin: 15px 0 5px; +} + +.community-events-form .regular-text { + width: 40%; + height: 29px; + margin: 0; + vertical-align: top; +} + +.community-events li.event-none { + border-right: 4px solid #00a0d2; +} + +.community-events-form label { + display: inline-block; + vertical-align: top; + line-height: 2.15384615; + height: 28px; +} + +.community-events .activity-block > p { + margin-bottom: 0; + display: inline; +} + +.community-events-toggle-location { + vertical-align: middle; +} + +#community-events-submit { + margin-right: 3px; + margin-left: 3px; +} + +/* Needs higher specificity than #dashboard-widgets .button-link */ +#dashboard-widgets .community-events-cancel.button-link { + vertical-align: top; + /* Same properties as the submit button for cross-browsers alignment. */ + line-height: 2; + height: 28px; + text-decoration: underline; +} + +.community-events ul { + background-color: #fafafa; + padding-right: 0; + padding-left: 0; + padding-bottom: 0; +} + +.community-events li { + margin: 0; + padding: 8px 12px; + color: #32373c; +} +.community-events li:first-child { + border-top: 1px solid #eee; +} + +.community-events li ~ li { + border-top: 1px solid #eee; +} + +.community-events .activity-block.last { + border-bottom: 1px solid #eee; + padding-top: 0; + margin-top: -1px; +} + +.community-events .event-info { + display: block; +} + +.event-icon { + height: 18px; + padding-left: 10px; + width: 18px; + display: none; /* Hide on smaller screens */ +} + +.event-icon:before { + color: #606a73; + font-size: 18px; +} +.event-meetup .event-icon:before { + content: "\f484"; +} +.event-wordcamp .event-icon:before { + content: "\f486"; +} + +.community-events .event-title { + font-weight: 600; + display: block; +} + +.community-events .event-date, +.community-events .event-time { + display: block; +} + +.community-events-footer { + margin-top: 0; + margin-bottom: 0; + padding: 12px; + border-top: 1px solid #eee; + color: #ddd; +} + +/* Safari 10 + VoiceOver specific: without this, the hidden text gets read out before the link. */ +.community-events-footer .screen-reader-text { + height: inherit; + white-space: nowrap; +} + +/* Dashboard WordPress news */ + +#dashboard_primary .inside { + margin: 0; + padding: 0; +} + +#dashboard_primary .widget-loading { + padding: 12px 12px 0; + margin-bottom: 1em !important; /* Needs to override `.postbox .inside > p:last-child` in common.css */ +} + +/* Notice when JS is off. */ +#dashboard_primary .inside .notice { + margin: 0; +} + +body #dashboard-widgets .postbox form .submit { + margin: 0; +} + +/* Used only for configurable widgets. */ +.dashboard-widget-control-form p { + margin-top: 0; +} + +.rssSummary { + color: #72777c; + margin-top: 4px; +} + +#dashboard_primary .rss-widget { + font-size: 13px; + padding: 0 12px 0; +} + +#dashboard_primary .rss-widget:last-child { + border-bottom: none; + padding-bottom: 8px; +} + +#dashboard_primary .rss-widget a { + font-weight: 400; +} + +#dashboard_primary .rss-widget span, +#dashboard_primary .rss-widget span.rss-date { + color: #72777c; +} + +#dashboard_primary .rss-widget span.rss-date { + margin-right: 12px; +} + +#dashboard_primary .rss-widget ul li { + padding: 4px 0; + margin: 0; +} + +/* Dashboard right now */ + +#dashboard_right_now ul { + margin: 0; + /* contain floats but don't use overflow: hidden */ + display: inline-block; + width: 100%; +} + +#dashboard_right_now li { + width: 50%; + float: right; + margin-bottom: 10px; +} + +#dashboard_right_now .inside { + padding: 0; +} + +#dashboard_right_now .main { + padding: 0 12px 11px; +} + +#dashboard_right_now .main p { + margin: 0; +} + +#dashboard_right_now #wp-version-message .button { + float: left; + position: relative; + top: -5px; + margin-right: 5px; +} + +.mu-storage { + overflow: hidden; +} + +#dashboard-widgets h3.mu-storage { + margin: 0 0 10px; + padding: 0; + font-size: 14px; + font-weight: 400; +} + +/* Dashboard right now - Colors */ + +#dashboard_right_now .sub { + color: #555d66; + background: #f5f5f5; + border-top: 1px solid #eee; + padding: 10px 12px 6px 12px; +} + +#dashboard_right_now .sub h3 { + color: #555; +} + +#dashboard_right_now .sub p { + margin: 0 0 1em; +} + +#dashboard_right_now .warning a:before, +#dashboard_right_now .warning span:before { + color: #d54e21; +} + +/* Dashboard Quick Draft */ + +#dashboard_quick_press .inside { + margin: 0; + padding: 0; +} + +#dashboard_quick_press div.updated { + margin-bottom: 10px; + border: 1px solid #eee; + border-width: 1px 0 1px 1px; +} + +#dashboard_quick_press form { + margin: 12px; +} + +#dashboard_quick_press .drafts { + padding: 10px 0 0; +} + +/* Dashboard Quick Draft - Form styling */ + +#dashboard_quick_press label { + display: inline-block; + margin-bottom: 4px; +} + +#dashboard_quick_press input, +#dashboard_quick_press textarea { + box-sizing: border-box; + margin: 0; +} + +#dashboard-widgets .postbox form .submit { + margin: -39px 0; + float: left; +} + +#description-wrap { + margin-top: 12px; +} + +#quick-press textarea#content { + min-height: 90px; + max-height: 1300px; + margin: 0 0 8px; + padding: 6px 7px; + resize: none; +} + +/* Dashboard Quick Draft - Drafts list */ + +.js #dashboard_quick_press .drafts { + border-top: 1px solid #eee; +} + +#dashboard_quick_press .drafts abbr { + border: none; +} + +#dashboard_quick_press .drafts .view-all { + float: left; + margin: 0 0 0 12px; +} + +#dashboard_primary a.rsswidget { + font-weight: 400; +} + +#dashboard_quick_press .drafts ul { + margin: 0 12px; +} + +#dashboard_quick_press .drafts li { + margin-bottom: 1em; +} +#dashboard_quick_press .drafts li time { + color: #72777c; +} + +#dashboard_quick_press .drafts p { + margin: 0; + word-wrap: break-word; +} + +#dashboard_quick_press .draft-title { + word-wrap: break-word; +} + +#dashboard_quick_press .draft-title a, +#dashboard_quick_press .draft-title time { + margin: 0 0 0 5px; +} + +/* Dashboard common styles */ + +#dashboard-widgets h4, /* Back-compat for pre-4.4 */ +#dashboard-widgets h3, +#dashboard_quick_press .drafts h2 { + margin: 0 12px 8px; + padding: 0; + font-size: 14px; + font-weight: 400; + color: #23282d; +} + +#dashboard_quick_press .drafts h2 { + line-height: inherit; +} + +#dashboard-widgets .inside h4, /* Back-compat for pre-4.4 */ +#dashboard-widgets .inside h3 { + margin-right: 0; + margin-left: 0; +} + +/* Dashboard activity widget */ + +#dashboard_activity .comment-meta span.approve:before { + content: "\f227"; + font: 20px/.5 dashicons; + margin-right: 5px; + vertical-align: middle; + position: relative; + top: -1px; + margin-left: 2px; +} + +#dashboard_activity .inside { + margin: 0; + padding-bottom: 0; +} + +#dashboard_activity .no-activity { + overflow: hidden; + padding: 0 0 12px; + text-align: center; +} + +#dashboard_activity .no-activity p { + color: #72777c; + font-size: 16px; +} + +#dashboard_activity .no-activity .smiley { + margin-top: 0; +} + +#dashboard_activity .no-activity .smiley:before { + content: "\f328"; + font: normal 120px/1 dashicons; + speak: none; + display: block; + margin: 0 0 0 5px; + padding: 0; + text-indent: 0; + text-align: center; + position: relative; + -webkit-font-smoothing: antialiased; + text-decoration: none !important; +} + +#dashboard_activity .subsubsub { + float: none; + border-top: 1px solid #eee; + margin: 0 -12px; + padding: 8px 12px 4px; +} + +#dashboard_activity .subsubsub a .count, +#dashboard_activity .subsubsub a.current .count { + color: #72777c; /* white background on the dashboard but #f1f1f1 on list tables */ +} + +#future-posts ul, +#published-posts ul { + clear: both; + margin-bottom: 0; +} + +#future-posts li, +#published-posts li { + margin-bottom: 8px; +} + +#future-posts ul span, +#published-posts ul span { + display: inline-block; + margin-left: 5px; + min-width: 150px; + color: #72777c; +} + +.activity-block { + border-bottom: 1px solid #eee; + margin: 0 -12px; + padding: 8px 12px 4px; +} + +.activity-block:last-child { + border-bottom: none; +} + +.activity-block .subsubsub li { + color: #ddd; +} + +/* Dashboard activity widget - Comments */ +/* @todo: needs serious de-duplication */ + +#activity-widget #the-comment-list tr.undo, +#activity-widget #the-comment-list div.undo { + background: none; + padding: 6px 0; + margin-right: 12px; +} + +#activity-widget #the-comment-list .comment-item { + background: #fafafa; + padding: 12px; + position: relative; +} + +#activity-widget #the-comment-list .avatar { + position: absolute; + top: 12px; +} + +#activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar { + padding-right: 63px; +} + +#activity-widget #the-comment-list .dashboard-comment-wrap blockquote { + margin: 1em 0; +} + +#activity-widget #the-comment-list .comment-item p.row-actions { + margin: 4px 0 0 0; +} + +#activity-widget #the-comment-list .comment-item:first-child { + border-top: 1px solid #eeeeee; +} + +#activity-widget #the-comment-list .unapproved { + background-color: #fef7f1; +} + +#activity-widget #the-comment-list .unapproved:before { + content: ""; + display: block; + position: absolute; + right: 0; + top: 0; + bottom: 0; + background: #d54e21; + width: 4px; +} + +#activity-widget #the-comment-list .spam-undo-inside .avatar, +#activity-widget #the-comment-list .trash-undo-inside .avatar { + position: relative; + top: 0; +} + +/* Browse happy box */ + +#dashboard-widgets #dashboard_browser_nag.postbox .inside { + margin: 10px; +} + +.postbox .button-link .edit-box { + display: none; +} + +.edit-box { + opacity: 0; +} + +.hndle:hover .edit-box, +.edit-box:focus { + opacity: 1; +} + +#dashboard-widgets form .input-text-wrap input { + width: 100%; +} + +#dashboard-widgets form .textarea-wrap textarea { + width: 100%; +} + +#dashboard-widgets .postbox form .submit { + float: none; + margin: .5em 0 0; + padding: 0; + border: none; +} + +#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish { + min-width: 0; +} + +#dashboard-widgets li a, +#dashboard-widgets .button-link, +.community-events-footer a { + text-decoration: none; +} + +#dashboard-widgets h2 a { + text-decoration: underline; +} + +#dashboard-widgets .hndle .postbox-title-action { + float: left; + line-height: 1.2; +} + +#dashboard_plugins h5 { + font-size: 14px; +} + +/* Recent Comments */ + +#latest-comments #the-comment-list { + position: relative; + margin: 0 -12px; +} + +#activity-widget #the-comment-list .comment, +#activity-widget #the-comment-list .pingback { + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.06); +} + +#activity-widget .comments #the-comment-list .alt { + background-color: transparent; +} + +#activity-widget #latest-comments #the-comment-list .comment-item { + /* the row-actions paragraph is output only for users with 'edit_comment' capabilities, + for other users this needs a min height equal to the gravatar image */ + min-height: 50px; + margin: 0; + padding: 12px; +} + +#latest-comments #the-comment-list .pingback { + padding-right: 12px !important; +} + +#latest-comments #the-comment-list .comment-item:first-child { + border-top: none; +} + +#latest-comments #the-comment-list .comment-meta { + line-height: 1.5; + margin: 0; + color: #666; +} + +#latest-comments #the-comment-list .comment-meta cite { + font-style: normal; + font-weight: 400; +} + +#latest-comments #the-comment-list .comment-item blockquote, +#latest-comments #the-comment-list .comment-item blockquote p { + margin: 0; + padding: 0; + display: inline; +} + +#latest-comments #the-comment-list .comment-item p.row-actions { + margin: 3px 0 0; + padding: 0; + font-size: 13px; +} + +/* Feeds */ +.rss-widget ul { + margin: 0; + padding: 0; + list-style: none; +} + +a.rsswidget { + font-size: 13px; + font-weight: 600; + line-height: 1.4; +} + +.rss-widget ul li { + line-height: 1.5; + margin-bottom: 12px; +} + +.rss-widget span.rss-date { + color: #72777c; + font-size: 13px; + margin-right: 3px; +} + +.rss-widget cite { + display: block; + text-align: left; + margin: 0 0 1em; + padding: 0; +} + +.rss-widget cite:before { + content: "\2014"; +} + +.dashboard-comment-wrap { + word-wrap: break-word; +} + +/* Browser Nag */ +#dashboard_browser_nag a.update-browser-link { + font-size: 1.2em; + font-weight: 600; +} + +#dashboard_browser_nag a { + text-decoration: underline; +} + +#dashboard_browser_nag p.browser-update-nag.has-browser-icon { + padding-left: 125px; +} + +#dashboard_browser_nag .browser-icon { + margin-top: -35px; +} + +#dashboard_browser_nag.postbox.browser-insecure { + background-color: #ac1b1b; + border-color: #ac1b1b; +} + +#dashboard_browser_nag.postbox { + background-color: #e29808; + background-image: none; + border-color: #edc048; + color: #fff; + box-shadow: none; +} + +#dashboard_browser_nag.postbox.browser-insecure h2 { + border-bottom-color: #cd5a5a; + color: #fff; +} + +#dashboard_browser_nag.postbox h2 { + border-bottom-color: #f6e2ac; + background: transparent none; + color: #fff; + box-shadow: none; +} + +#dashboard_browser_nag a { + color: #fff; +} + +#dashboard_browser_nag h2.hndle { + border: none; + font-weight: 600; + font-size: 20px; + padding-top: 10px; +} + +.postbox#dashboard_browser_nag p a.dismiss { + font-size: 14px; +} + +.postbox#dashboard_browser_nag p, +.postbox#dashboard_browser_nag a, +.postbox#dashboard_browser_nag p.browser-update-nag { + font-size: 16px; +} + +/* PHP Nag */ +#dashboard_php_nag .dashicons-warning { + color: #ffb900; + padding-left: 6px; +} + +#dashboard_php_nag.php-insecure .dashicons-warning { + color: #df3232; +} + +#dashboard_php_nag p { + margin: 12px 0; +} + +#dashboard_php_nag h3 { + font-weight: 600; +} + +#dashboard_php_nag .button .dashicons-external { + line-height: 25px; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/* one column on the dash */ +@media only screen and (max-width: 799px) { + #wpbody-content #dashboard-widgets .postbox-container { + width: 100%; + } +} + +/* two columns on the dash, but keep the setting if one is selected */ +@media only screen and (min-width: 800px) and (max-width: 1499px) { + #wpbody-content #dashboard-widgets .postbox-container { + width: 49.5%; + } + + #wpbody-content #dashboard-widgets #postbox-container-2, + #wpbody-content #dashboard-widgets #postbox-container-3, + #wpbody-content #dashboard-widgets #postbox-container-4 { + float: left; + width: 50.5%; + } + + #dashboard-widgets #postbox-container-3 .empty-container, + #dashboard-widgets #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; + } + + #dashboard-widgets #postbox-container-3 .empty-container:after, + #dashboard-widgets #postbox-container-4 .empty-container:after { + display: none; + } + + #wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container { + width: 100%; + } + + #wpbody #wpbody-content .metabox-holder.columns-1 .postbox-container .empty-container { + border: 0 none; + height: 0; + min-height: 0; + } + + /* show the radio buttons for column prefs only for one or two columns */ + .index-php .screen-layout, + .index-php .columns-prefs { + display: block; + } + + .columns-prefs .columns-prefs-3, + .columns-prefs .columns-prefs-4 { + display: none; + } + + .metabox-holder .postbox-container .empty-container:after { + display: block; + } +} + +/* three columns on the dash */ +@media only screen and (min-width: 1500px) and (max-width: 1800px) { + #wpbody-content #dashboard-widgets .postbox-container { + width: 33.5%; + } + + #wpbody-content #dashboard-widgets #postbox-container-1 { + width: 33%; + } + + #wpbody-content #dashboard-widgets #postbox-container-3, + #wpbody-content #dashboard-widgets #postbox-container-4 { + float: left; + } + + #dashboard-widgets #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; + } + + #dashboard-widgets #postbox-container-4 .empty-container:after { + display: none; + } + + .metabox-holder .postbox-container .empty-container:after { + display: block; + } +} + +@media screen and (max-width: 870px) { + .welcome-panel .welcome-panel-column, + .welcome-panel .welcome-panel-column:first-child { + display: block; + float: none; + width: 100%; + } + + .welcome-panel .welcome-panel-column li { + display: inline-block; + margin-left: 13px; + } + + .welcome-panel .welcome-panel-column ul { + margin: 0.4em 0 0; + } + +} + +@media screen and (max-width: 782px) { + #dashboard_recent_comments #the-comment-list .comment-item .avatar { + height: 30px; + width: 30px; + margin: 4px 0 5px 10px; + } + + .community-events-toggle-location { + height: 38px; + vertical-align: baseline; + } + + .community-events-form .regular-text { + height: 32px; + } + + #community-events-submit { + margin-bottom: 0; + /* Override .wp-core-ui .button */ + vertical-align: top; + } + + .community-events-form label, + #dashboard-widgets .community-events-cancel.button-link { + /* Same properties as the submit button for cross-browsers alignment. */ + font-size: 14px; + line-height: normal; + height: auto; + padding: 6px 0; + border: 1px solid transparent; + } + + .community-events .spinner { + margin-top: 7px; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + /* Keep the close icon from overlapping the Welcome text. */ + .welcome-panel .welcome-panel-close { + overflow: hidden; + text-indent: 40px; + white-space: nowrap; + width: 20px; + height: 20px; + padding: 5px; + top: 5px; + left: 5px; + } + + /* Make the close icon larger for tappability. */ + .welcome-panel .welcome-panel-close:before { + font-size: 20px; + top: 5px; + right: -35px; + } +} + +@media screen and (min-width: 355px) { + .community-events .event-info { + display: table-row; + float: right; + max-width: 59%; + } + + .event-icon, + .event-icon[aria-hidden="true"] { + display: table-cell; + } + + .event-info-inner { + display: table-cell; + } + + .community-events .event-date-time { + float: left; + max-width: 39%; + } + + .community-events .event-date, + .community-events .event-time { + text-align: left; + } +} diff --git a/wp-admin/css/dashboard-rtl.min.css b/wp-admin/css/dashboard-rtl.min.css new file mode 100644 index 0000000..5987e11 --- /dev/null +++ b/wp-admin/css/dashboard-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#wpbody-content #dashboard-widgets.columns-1 .postbox-container{width:100%}#wpbody-content #dashboard-widgets.columns-2 .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2,#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3,#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4{float:left;width:50.5%}#wpbody-content #dashboard-widgets.columns-3 .postbox-container{width:33.5%}#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1{width:33%}#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3,#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4{float:left}#wpbody-content #dashboard-widgets.columns-4 .postbox-container{width:25%}#dashboard-widgets .postbox-container{width:25%}#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container{border:none!important}.ie8 #wpbody-content #dashboard-widgets .postbox-container{width:49.5%}.ie8 #wpbody-content #dashboard-widgets #postbox-container-2,.ie8 #wpbody-content #dashboard-widgets #postbox-container-3,.ie8 #wpbody-content #dashboard-widgets #postbox-container-4{float:left;width:50.5%}.ie8 #dashboard-widgets #postbox-container-3 .empty-container,.ie8 #dashboard-widgets #postbox-container-4 .empty-container{border:0 none;height:0;min-height:0}#dashboard-widgets-wrap{overflow:hidden;margin:0 -8px}#dashboard-widgets .postbox .inside{margin-bottom:0}#dashboard-widgets .meta-box-sortables{margin:0 8px;min-height:100px}#the-comment-list td.comment p.comment-author{margin-top:0;margin-right:0}#the-comment-list p.comment-author img{float:right;margin-left:8px}#the-comment-list p.comment-author strong a{border:none}#the-comment-list td{vertical-align:top}#the-comment-list td.comment{word-wrap:break-word}#the-comment-list td.comment img{max-width:100%}.welcome-panel{position:relative;overflow:auto;margin:16px 0;padding:23px 10px 0;border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;font-size:13px;line-height:1.7}.welcome-panel h2{margin:0;font-size:21px;font-weight:400;line-height:1.2}.welcome-panel h3{margin:1.33em 0 0;font-size:16px}.welcome-panel li{font-size:14px}.welcome-panel p{color:#72777c}.welcome-panel li a{text-decoration:none}.welcome-panel .about-description{font-size:16px;margin:0}.welcome-panel .welcome-panel-close{position:absolute;top:10px;left:10px;padding:10px 21px 10px 15px;font-size:13px;line-height:1.23076923;text-decoration:none}.welcome-panel .welcome-panel-close:before{position:absolute;top:8px;right:0;transition:all .1s ease-in-out}.wp-core-ui .welcome-panel .button.button-hero{margin:15px 0 3px 13px;padding:12px 36px;height:auto;line-height:1.4285714;white-space:normal}.welcome-panel-content{margin-right:13px;max-width:1500px}.welcome-panel .welcome-panel-column-container{clear:both;position:relative}.welcome-panel .welcome-panel-column{width:32%;min-width:200px;float:right}.ie8 .welcome-panel .welcome-panel-column{min-width:230px}.welcome-panel .welcome-panel-column:first-child{width:36%}.welcome-panel-column p.hide-if-no-customize{margin-top:10px}.welcome-panel-column p{margin-top:7px;color:#444}.welcome-panel .welcome-widgets-menus{line-height:1.14285714}.welcome-panel .welcome-panel-column ul{margin:.8em 0 1em 1em}.welcome-panel .welcome-panel-column li{line-height:1.14285714;list-style-type:none;padding:0 0 8px}.welcome-panel .welcome-icon{background:0 0!important}#dashboard_right_now li a:before,#dashboard_right_now li span:before,.welcome-panel .welcome-icon:before{color:#606a73;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 0 0 10px;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;vertical-align:top}.welcome-panel .welcome-edit-page:before,.welcome-panel .welcome-write-blog:before{content:"\f119";top:-3px}.welcome-panel .welcome-add-page:before{content:"\f132";top:-1px}.welcome-panel .welcome-setup-home:before{content:"\f102";top:-1px}.welcome-panel .welcome-view-site:before{content:"\f115";top:-2px}.welcome-panel .welcome-widgets-menus:before{content:"\f116";top:-2px}.welcome-panel .welcome-widgets:before{content:"\f538";top:-2px}.welcome-panel .welcome-menus:before{content:"\f163";top:-2px}.welcome-panel .welcome-comments:before{content:"\f117";top:-1px}.welcome-panel .welcome-learn-more:before{content:"\f118";top:-1px}#dashboard_right_now li a:before,#dashboard_right_now li>span:before{content:"\f159";padding:0 0 0 5px}#dashboard_right_now .page-count a:before,#dashboard_right_now .page-count span:before{content:"\f105"}#dashboard_right_now .post-count a:before,#dashboard_right_now .post-count span:before{content:"\f109"}#dashboard_right_now .comment-count a:before{content:"\f101"}#dashboard_right_now .comment-mod-count a:before{content:"\f125"}#dashboard_right_now .storage-count a:before{content:"\f104"}#dashboard_right_now .storage-count.warning a:before{content:"\f153"}.community-events-errors{margin:0}.community-events-loading{padding:10px 12px 8px}.community-events{margin-bottom:6px;padding:0 12px}.community-events .spinner{float:none;margin:5px 2px 0;vertical-align:top}.community-events [aria-hidden=true],.community-events-errors [aria-hidden=true],.community-events-errors[aria-hidden=true],.community-events-loading[aria-hidden=true],.community-events[aria-hidden=true]{display:none}.community-events .activity-block:first-child,.community-events h2{padding-top:12px;padding-bottom:10px}.community-events-form{margin:15px 0 5px}.community-events-form .regular-text{width:40%;height:29px;margin:0;vertical-align:top}.community-events li.event-none{border-right:4px solid #00a0d2}.community-events-form label{display:inline-block;vertical-align:top;line-height:2.15384615;height:28px}.community-events .activity-block>p{margin-bottom:0;display:inline}.community-events-toggle-location{vertical-align:middle}#community-events-submit{margin-right:3px;margin-left:3px}#dashboard-widgets .community-events-cancel.button-link{vertical-align:top;line-height:2;height:28px;text-decoration:underline}.community-events ul{background-color:#fafafa;padding-right:0;padding-left:0;padding-bottom:0}.community-events li{margin:0;padding:8px 12px;color:#32373c}.community-events li:first-child{border-top:1px solid #eee}.community-events li~li{border-top:1px solid #eee}.community-events .activity-block.last{border-bottom:1px solid #eee;padding-top:0;margin-top:-1px}.community-events .event-info{display:block}.event-icon{height:18px;padding-left:10px;width:18px;display:none}.event-icon:before{color:#606a73;font-size:18px}.event-meetup .event-icon:before{content:"\f484"}.event-wordcamp .event-icon:before{content:"\f486"}.community-events .event-title{font-weight:600;display:block}.community-events .event-date,.community-events .event-time{display:block}.community-events-footer{margin-top:0;margin-bottom:0;padding:12px;border-top:1px solid #eee;color:#ddd}.community-events-footer .screen-reader-text{height:inherit;white-space:nowrap}#dashboard_primary .inside{margin:0;padding:0}#dashboard_primary .widget-loading{padding:12px 12px 0;margin-bottom:1em!important}#dashboard_primary .inside .notice{margin:0}body #dashboard-widgets .postbox form .submit{margin:0}.dashboard-widget-control-form p{margin-top:0}.rssSummary{color:#72777c;margin-top:4px}#dashboard_primary .rss-widget{font-size:13px;padding:0 12px 0}#dashboard_primary .rss-widget:last-child{border-bottom:none;padding-bottom:8px}#dashboard_primary .rss-widget a{font-weight:400}#dashboard_primary .rss-widget span,#dashboard_primary .rss-widget span.rss-date{color:#72777c}#dashboard_primary .rss-widget span.rss-date{margin-right:12px}#dashboard_primary .rss-widget ul li{padding:4px 0;margin:0}#dashboard_right_now ul{margin:0;display:inline-block;width:100%}#dashboard_right_now li{width:50%;float:right;margin-bottom:10px}#dashboard_right_now .inside{padding:0}#dashboard_right_now .main{padding:0 12px 11px}#dashboard_right_now .main p{margin:0}#dashboard_right_now #wp-version-message .button{float:left;position:relative;top:-5px;margin-right:5px}.mu-storage{overflow:hidden}#dashboard-widgets h3.mu-storage{margin:0 0 10px;padding:0;font-size:14px;font-weight:400}#dashboard_right_now .sub{color:#555d66;background:#f5f5f5;border-top:1px solid #eee;padding:10px 12px 6px 12px}#dashboard_right_now .sub h3{color:#555}#dashboard_right_now .sub p{margin:0 0 1em}#dashboard_right_now .warning a:before,#dashboard_right_now .warning span:before{color:#d54e21}#dashboard_quick_press .inside{margin:0;padding:0}#dashboard_quick_press div.updated{margin-bottom:10px;border:1px solid #eee;border-width:1px 0 1px 1px}#dashboard_quick_press form{margin:12px}#dashboard_quick_press .drafts{padding:10px 0 0}#dashboard_quick_press label{display:inline-block;margin-bottom:4px}#dashboard_quick_press input,#dashboard_quick_press textarea{box-sizing:border-box;margin:0}#dashboard-widgets .postbox form .submit{margin:-39px 0;float:left}#description-wrap{margin-top:12px}#quick-press textarea#content{min-height:90px;max-height:1300px;margin:0 0 8px;padding:6px 7px;resize:none}.js #dashboard_quick_press .drafts{border-top:1px solid #eee}#dashboard_quick_press .drafts abbr{border:none}#dashboard_quick_press .drafts .view-all{float:left;margin:0 0 0 12px}#dashboard_primary a.rsswidget{font-weight:400}#dashboard_quick_press .drafts ul{margin:0 12px}#dashboard_quick_press .drafts li{margin-bottom:1em}#dashboard_quick_press .drafts li time{color:#72777c}#dashboard_quick_press .drafts p{margin:0;word-wrap:break-word}#dashboard_quick_press .draft-title{word-wrap:break-word}#dashboard_quick_press .draft-title a,#dashboard_quick_press .draft-title time{margin:0 0 0 5px}#dashboard-widgets h3,#dashboard-widgets h4,#dashboard_quick_press .drafts h2{margin:0 12px 8px;padding:0;font-size:14px;font-weight:400;color:#23282d}#dashboard_quick_press .drafts h2{line-height:inherit}#dashboard-widgets .inside h3,#dashboard-widgets .inside h4{margin-right:0;margin-left:0}#dashboard_activity .comment-meta span.approve:before{content:"\f227";font:20px/.5 dashicons;margin-right:5px;vertical-align:middle;position:relative;top:-1px;margin-left:2px}#dashboard_activity .inside{margin:0;padding-bottom:0}#dashboard_activity .no-activity{overflow:hidden;padding:0 0 12px;text-align:center}#dashboard_activity .no-activity p{color:#72777c;font-size:16px}#dashboard_activity .no-activity .smiley{margin-top:0}#dashboard_activity .no-activity .smiley:before{content:"\f328";font:normal 120px/1 dashicons;speak:none;display:block;margin:0 0 0 5px;padding:0;text-indent:0;text-align:center;position:relative;-webkit-font-smoothing:antialiased;text-decoration:none!important}#dashboard_activity .subsubsub{float:none;border-top:1px solid #eee;margin:0 -12px;padding:8px 12px 4px}#dashboard_activity .subsubsub a .count,#dashboard_activity .subsubsub a.current .count{color:#72777c}#future-posts ul,#published-posts ul{clear:both;margin-bottom:0}#future-posts li,#published-posts li{margin-bottom:8px}#future-posts ul span,#published-posts ul span{display:inline-block;margin-left:5px;min-width:150px;color:#72777c}.activity-block{border-bottom:1px solid #eee;margin:0 -12px;padding:8px 12px 4px}.activity-block:last-child{border-bottom:none}.activity-block .subsubsub li{color:#ddd}#activity-widget #the-comment-list div.undo,#activity-widget #the-comment-list tr.undo{background:0 0;padding:6px 0;margin-right:12px}#activity-widget #the-comment-list .comment-item{background:#fafafa;padding:12px;position:relative}#activity-widget #the-comment-list .avatar{position:absolute;top:12px}#activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar{padding-right:63px}#activity-widget #the-comment-list .dashboard-comment-wrap blockquote{margin:1em 0}#activity-widget #the-comment-list .comment-item p.row-actions{margin:4px 0 0 0}#activity-widget #the-comment-list .comment-item:first-child{border-top:1px solid #eee}#activity-widget #the-comment-list .unapproved{background-color:#fef7f1}#activity-widget #the-comment-list .unapproved:before{content:"";display:block;position:absolute;right:0;top:0;bottom:0;background:#d54e21;width:4px}#activity-widget #the-comment-list .spam-undo-inside .avatar,#activity-widget #the-comment-list .trash-undo-inside .avatar{position:relative;top:0}#dashboard-widgets #dashboard_browser_nag.postbox .inside{margin:10px}.postbox .button-link .edit-box{display:none}.edit-box{opacity:0}.edit-box:focus,.hndle:hover .edit-box{opacity:1}#dashboard-widgets form .input-text-wrap input{width:100%}#dashboard-widgets form .textarea-wrap textarea{width:100%}#dashboard-widgets .postbox form .submit{float:none;margin:.5em 0 0;padding:0;border:none}#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish{min-width:0}#dashboard-widgets .button-link,#dashboard-widgets li a,.community-events-footer a{text-decoration:none}#dashboard-widgets h2 a{text-decoration:underline}#dashboard-widgets .hndle .postbox-title-action{float:left;line-height:1.2}#dashboard_plugins h5{font-size:14px}#latest-comments #the-comment-list{position:relative;margin:0 -12px}#activity-widget #the-comment-list .comment,#activity-widget #the-comment-list .pingback{box-shadow:inset 0 1px 0 rgba(0,0,0,.06)}#activity-widget .comments #the-comment-list .alt{background-color:transparent}#activity-widget #latest-comments #the-comment-list .comment-item{min-height:50px;margin:0;padding:12px}#latest-comments #the-comment-list .pingback{padding-right:12px!important}#latest-comments #the-comment-list .comment-item:first-child{border-top:none}#latest-comments #the-comment-list .comment-meta{line-height:1.5;margin:0;color:#666}#latest-comments #the-comment-list .comment-meta cite{font-style:normal;font-weight:400}#latest-comments #the-comment-list .comment-item blockquote,#latest-comments #the-comment-list .comment-item blockquote p{margin:0;padding:0;display:inline}#latest-comments #the-comment-list .comment-item p.row-actions{margin:3px 0 0;padding:0;font-size:13px}.rss-widget ul{margin:0;padding:0;list-style:none}a.rsswidget{font-size:13px;font-weight:600;line-height:1.4}.rss-widget ul li{line-height:1.5;margin-bottom:12px}.rss-widget span.rss-date{color:#72777c;font-size:13px;margin-right:3px}.rss-widget cite{display:block;text-align:left;margin:0 0 1em;padding:0}.rss-widget cite:before{content:"\2014"}.dashboard-comment-wrap{word-wrap:break-word}#dashboard_browser_nag a.update-browser-link{font-size:1.2em;font-weight:600}#dashboard_browser_nag a{text-decoration:underline}#dashboard_browser_nag p.browser-update-nag.has-browser-icon{padding-left:125px}#dashboard_browser_nag .browser-icon{margin-top:-35px}#dashboard_browser_nag.postbox.browser-insecure{background-color:#ac1b1b;border-color:#ac1b1b}#dashboard_browser_nag.postbox{background-color:#e29808;background-image:none;border-color:#edc048;color:#fff;box-shadow:none}#dashboard_browser_nag.postbox.browser-insecure h2{border-bottom-color:#cd5a5a;color:#fff}#dashboard_browser_nag.postbox h2{border-bottom-color:#f6e2ac;background:transparent none;color:#fff;box-shadow:none}#dashboard_browser_nag a{color:#fff}#dashboard_browser_nag h2.hndle{border:none;font-weight:600;font-size:20px;padding-top:10px}.postbox#dashboard_browser_nag p a.dismiss{font-size:14px}.postbox#dashboard_browser_nag a,.postbox#dashboard_browser_nag p,.postbox#dashboard_browser_nag p.browser-update-nag{font-size:16px}#dashboard_php_nag .dashicons-warning{color:#ffb900;padding-left:6px}#dashboard_php_nag.php-insecure .dashicons-warning{color:#df3232}#dashboard_php_nag p{margin:12px 0}#dashboard_php_nag h3{font-weight:600}#dashboard_php_nag .button .dashicons-external{line-height:25px}@media only screen and (max-width:799px){#wpbody-content #dashboard-widgets .postbox-container{width:100%}}@media only screen and (min-width:800px) and (max-width:1499px){#wpbody-content #dashboard-widgets .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets #postbox-container-2,#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:left;width:50.5%}#dashboard-widgets #postbox-container-3 .empty-container,#dashboard-widgets #postbox-container-4 .empty-container{border:0 none;height:0;min-height:0}#dashboard-widgets #postbox-container-3 .empty-container:after,#dashboard-widgets #postbox-container-4 .empty-container:after{display:none}#wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container{width:100%}#wpbody #wpbody-content .metabox-holder.columns-1 .postbox-container .empty-container{border:0 none;height:0;min-height:0}.index-php .columns-prefs,.index-php .screen-layout{display:block}.columns-prefs .columns-prefs-3,.columns-prefs .columns-prefs-4{display:none}.metabox-holder .postbox-container .empty-container:after{display:block}}@media only screen and (min-width:1500px) and (max-width:1800px){#wpbody-content #dashboard-widgets .postbox-container{width:33.5%}#wpbody-content #dashboard-widgets #postbox-container-1{width:33%}#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:left}#dashboard-widgets #postbox-container-4 .empty-container{border:0 none;height:0;min-height:0}#dashboard-widgets #postbox-container-4 .empty-container:after{display:none}.metabox-holder .postbox-container .empty-container:after{display:block}}@media screen and (max-width:870px){.welcome-panel .welcome-panel-column,.welcome-panel .welcome-panel-column:first-child{display:block;float:none;width:100%}.welcome-panel .welcome-panel-column li{display:inline-block;margin-left:13px}.welcome-panel .welcome-panel-column ul{margin:.4em 0 0}}@media screen and (max-width:782px){#dashboard_recent_comments #the-comment-list .comment-item .avatar{height:30px;width:30px;margin:4px 0 5px 10px}.community-events-toggle-location{height:38px;vertical-align:baseline}.community-events-form .regular-text{height:32px}#community-events-submit{margin-bottom:0;vertical-align:top}#dashboard-widgets .community-events-cancel.button-link,.community-events-form label{font-size:14px;line-height:normal;height:auto;padding:6px 0;border:1px solid transparent}.community-events .spinner{margin-top:7px}}@media screen and (max-width:600px){.welcome-panel .welcome-panel-close{overflow:hidden;text-indent:40px;white-space:nowrap;width:20px;height:20px;padding:5px;top:5px;left:5px}.welcome-panel .welcome-panel-close:before{font-size:20px;top:5px;right:-35px}}@media screen and (min-width:355px){.community-events .event-info{display:table-row;float:right;max-width:59%}.event-icon,.event-icon[aria-hidden=true]{display:table-cell}.event-info-inner{display:table-cell}.community-events .event-date-time{float:left;max-width:39%}.community-events .event-date,.community-events .event-time{text-align:left}} \ No newline at end of file diff --git a/wp-admin/css/dashboard.css b/wp-admin/css/dashboard.css new file mode 100644 index 0000000..c5da19d --- /dev/null +++ b/wp-admin/css/dashboard.css @@ -0,0 +1,1293 @@ +#wpbody-content #dashboard-widgets.columns-1 .postbox-container { + width: 100%; +} + +#wpbody-content #dashboard-widgets.columns-2 .postbox-container { + width: 49.5%; +} + +#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2, +#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3, +#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4 { + float: right; + width: 50.5%; +} + +#wpbody-content #dashboard-widgets.columns-3 .postbox-container { + width: 33.5%; +} + +#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1 { + width: 33%; +} + +#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3, +#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4 { + float: right; +} + +#wpbody-content #dashboard-widgets.columns-4 .postbox-container { + width: 25%; +} + +#dashboard-widgets .postbox-container { + width: 25%; +} + +#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container { + border: none !important; +} + +.ie8 #wpbody-content #dashboard-widgets .postbox-container { + width: 49.5%; +} + +.ie8 #wpbody-content #dashboard-widgets #postbox-container-2, +.ie8 #wpbody-content #dashboard-widgets #postbox-container-3, +.ie8 #wpbody-content #dashboard-widgets #postbox-container-4 { + float: right; + width: 50.5%; +} + +.ie8 #dashboard-widgets #postbox-container-3 .empty-container, +.ie8 #dashboard-widgets #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; +} + +#dashboard-widgets-wrap { + overflow: hidden; + margin: 0 -8px; +} + +#dashboard-widgets .postbox .inside { + margin-bottom: 0; +} + +#dashboard-widgets .meta-box-sortables { + margin: 0 8px; + min-height: 100px; +} + +/* @todo: this was originally in this section, but likely belongs elsewhere */ +#the-comment-list td.comment p.comment-author { + margin-top: 0; + margin-left: 0; +} + +#the-comment-list p.comment-author img { + float: left; + margin-right: 8px; +} + +#the-comment-list p.comment-author strong a { + border: none; +} + +#the-comment-list td { + vertical-align: top; +} + +#the-comment-list td.comment { + word-wrap: break-word; +} + +#the-comment-list td.comment img { + max-width: 100%; +} + +/* Welcome Panel */ +.welcome-panel { + position: relative; + overflow: auto; + margin: 16px 0; + padding: 23px 10px 0; + border: 1px solid #ccd0d4; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + background: #fff; + font-size: 13px; + line-height: 1.7; +} + +.welcome-panel h2 { + margin: 0; + font-size: 21px; + font-weight: 400; + line-height: 1.2; +} + +.welcome-panel h3 { + margin: 1.33em 0 0; + font-size: 16px; +} + +.welcome-panel li { + font-size: 14px; +} + +.welcome-panel p { + color: #72777c; +} + +.welcome-panel li a { + text-decoration: none; +} + +.welcome-panel .about-description { + font-size: 16px; + margin: 0; +} + +.welcome-panel .welcome-panel-close { + position: absolute; + top: 10px; + right: 10px; + padding: 10px 15px 10px 21px; + font-size: 13px; + line-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */ + text-decoration: none; +} + +.welcome-panel .welcome-panel-close:before { + position: absolute; + top: 8px; + left: 0; + transition: all .1s ease-in-out; +} + +.wp-core-ui .welcome-panel .button.button-hero { + margin: 15px 13px 3px 0; + padding: 12px 36px; + height: auto; + line-height: 1.4285714; + white-space: normal; +} + +.welcome-panel-content { + margin-left: 13px; + max-width: 1500px; +} + +.welcome-panel .welcome-panel-column-container { + clear: both; + position: relative; +} + +.welcome-panel .welcome-panel-column { + width: 32%; + min-width: 200px; + float: left; +} + +.ie8 .welcome-panel .welcome-panel-column { + min-width: 230px; +} + +.welcome-panel .welcome-panel-column:first-child { + width: 36%; +} + +.welcome-panel-column p.hide-if-no-customize { + margin-top: 10px; +} + +.welcome-panel-column p { + margin-top: 7px; + color: #444; +} + +.welcome-panel .welcome-widgets-menus { + line-height: 1.14285714; +} + +.welcome-panel .welcome-panel-column ul { + margin: 0.8em 1em 1em 0; +} + +.welcome-panel .welcome-panel-column li { + line-height: 1.14285714; + list-style-type: none; + padding: 0 0 8px; +} + +.welcome-panel .welcome-icon { + background: transparent !important; +} + +/* Welcome Panel and Right Now common Icons style */ + +.welcome-panel .welcome-icon:before, +#dashboard_right_now li a:before, +#dashboard_right_now li span:before { + color: #606a73; + font: normal 20px/1 dashicons; + speak: none; + display: inline-block; + padding: 0 10px 0 0; + position: relative; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + vertical-align: top; +} + +/* Welcome Panel specific Icons styles */ + +.welcome-panel .welcome-write-blog:before, +.welcome-panel .welcome-edit-page:before { + content: "\f119"; + top: -3px; +} + +.welcome-panel .welcome-add-page:before { + content: "\f132"; + top: -1px; +} + +.welcome-panel .welcome-setup-home:before { + content: "\f102"; + top: -1px; +} + +.welcome-panel .welcome-view-site:before { + content: "\f115"; + top: -2px; +} + +.welcome-panel .welcome-widgets-menus:before { + content: "\f116"; + top: -2px; +} + +.welcome-panel .welcome-widgets:before { + content: "\f538"; + top: -2px; +} + +.welcome-panel .welcome-menus:before { + content: "\f163"; + top: -2px; +} + +.welcome-panel .welcome-comments:before { + content: "\f117"; + top: -1px; +} + +.welcome-panel .welcome-learn-more:before { + content: "\f118"; + top: -1px; +} + +/* Right Now specific Icons styles */ + +#dashboard_right_now li a:before, +#dashboard_right_now li > span:before { /* get only the first level span to exclude screen-reader-text in mu-storage */ + content: "\f159"; /* generic icon for items added by CPTs ? */ + padding: 0 5px 0 0; +} + +#dashboard_right_now .page-count a:before, +#dashboard_right_now .page-count span:before { + content: "\f105"; +} + +#dashboard_right_now .post-count a:before, +#dashboard_right_now .post-count span:before { + content: "\f109"; +} + +#dashboard_right_now .comment-count a:before { + content: "\f101"; +} + +#dashboard_right_now .comment-mod-count a:before { + content: "\f125"; +} + +#dashboard_right_now .storage-count a:before { + content: "\f104"; +} + +#dashboard_right_now .storage-count.warning a:before { + content: "\f153"; +} + +/* Dashboard WordPress events */ + +.community-events-errors { + margin: 0; +} + +.community-events-loading { + padding: 10px 12px 8px; +} + +.community-events { + margin-bottom: 6px; + padding: 0 12px; +} + +.community-events .spinner { + float: none; + margin: 5px 2px 0; + vertical-align: top; +} + +.community-events-errors[aria-hidden="true"], +.community-events-errors [aria-hidden="true"], +.community-events-loading[aria-hidden="true"], +.community-events[aria-hidden="true"], +.community-events [aria-hidden="true"] { + display: none; +} + +.community-events .activity-block:first-child, +.community-events h2 { + padding-top: 12px; + padding-bottom: 10px; +} + +.community-events-form { + margin: 15px 0 5px; +} + +.community-events-form .regular-text { + width: 40%; + height: 29px; + margin: 0; + vertical-align: top; +} + +.community-events li.event-none { + border-left: 4px solid #00a0d2; +} + +.community-events-form label { + display: inline-block; + vertical-align: top; + line-height: 2.15384615; + height: 28px; +} + +.community-events .activity-block > p { + margin-bottom: 0; + display: inline; +} + +.community-events-toggle-location { + vertical-align: middle; +} + +#community-events-submit { + margin-left: 3px; + margin-right: 3px; +} + +/* Needs higher specificity than #dashboard-widgets .button-link */ +#dashboard-widgets .community-events-cancel.button-link { + vertical-align: top; + /* Same properties as the submit button for cross-browsers alignment. */ + line-height: 2; + height: 28px; + text-decoration: underline; +} + +.community-events ul { + background-color: #fafafa; + padding-left: 0; + padding-right: 0; + padding-bottom: 0; +} + +.community-events li { + margin: 0; + padding: 8px 12px; + color: #32373c; +} +.community-events li:first-child { + border-top: 1px solid #eee; +} + +.community-events li ~ li { + border-top: 1px solid #eee; +} + +.community-events .activity-block.last { + border-bottom: 1px solid #eee; + padding-top: 0; + margin-top: -1px; +} + +.community-events .event-info { + display: block; +} + +.event-icon { + height: 18px; + padding-right: 10px; + width: 18px; + display: none; /* Hide on smaller screens */ +} + +.event-icon:before { + color: #606a73; + font-size: 18px; +} +.event-meetup .event-icon:before { + content: "\f484"; +} +.event-wordcamp .event-icon:before { + content: "\f486"; +} + +.community-events .event-title { + font-weight: 600; + display: block; +} + +.community-events .event-date, +.community-events .event-time { + display: block; +} + +.community-events-footer { + margin-top: 0; + margin-bottom: 0; + padding: 12px; + border-top: 1px solid #eee; + color: #ddd; +} + +/* Safari 10 + VoiceOver specific: without this, the hidden text gets read out before the link. */ +.community-events-footer .screen-reader-text { + height: inherit; + white-space: nowrap; +} + +/* Dashboard WordPress news */ + +#dashboard_primary .inside { + margin: 0; + padding: 0; +} + +#dashboard_primary .widget-loading { + padding: 12px 12px 0; + margin-bottom: 1em !important; /* Needs to override `.postbox .inside > p:last-child` in common.css */ +} + +/* Notice when JS is off. */ +#dashboard_primary .inside .notice { + margin: 0; +} + +body #dashboard-widgets .postbox form .submit { + margin: 0; +} + +/* Used only for configurable widgets. */ +.dashboard-widget-control-form p { + margin-top: 0; +} + +.rssSummary { + color: #72777c; + margin-top: 4px; +} + +#dashboard_primary .rss-widget { + font-size: 13px; + padding: 0 12px 0; +} + +#dashboard_primary .rss-widget:last-child { + border-bottom: none; + padding-bottom: 8px; +} + +#dashboard_primary .rss-widget a { + font-weight: 400; +} + +#dashboard_primary .rss-widget span, +#dashboard_primary .rss-widget span.rss-date { + color: #72777c; +} + +#dashboard_primary .rss-widget span.rss-date { + margin-left: 12px; +} + +#dashboard_primary .rss-widget ul li { + padding: 4px 0; + margin: 0; +} + +/* Dashboard right now */ + +#dashboard_right_now ul { + margin: 0; + /* contain floats but don't use overflow: hidden */ + display: inline-block; + width: 100%; +} + +#dashboard_right_now li { + width: 50%; + float: left; + margin-bottom: 10px; +} + +#dashboard_right_now .inside { + padding: 0; +} + +#dashboard_right_now .main { + padding: 0 12px 11px; +} + +#dashboard_right_now .main p { + margin: 0; +} + +#dashboard_right_now #wp-version-message .button { + float: right; + position: relative; + top: -5px; + margin-left: 5px; +} + +.mu-storage { + overflow: hidden; +} + +#dashboard-widgets h3.mu-storage { + margin: 0 0 10px; + padding: 0; + font-size: 14px; + font-weight: 400; +} + +/* Dashboard right now - Colors */ + +#dashboard_right_now .sub { + color: #555d66; + background: #f5f5f5; + border-top: 1px solid #eee; + padding: 10px 12px 6px 12px; +} + +#dashboard_right_now .sub h3 { + color: #555; +} + +#dashboard_right_now .sub p { + margin: 0 0 1em; +} + +#dashboard_right_now .warning a:before, +#dashboard_right_now .warning span:before { + color: #d54e21; +} + +/* Dashboard Quick Draft */ + +#dashboard_quick_press .inside { + margin: 0; + padding: 0; +} + +#dashboard_quick_press div.updated { + margin-bottom: 10px; + border: 1px solid #eee; + border-width: 1px 1px 1px 0; +} + +#dashboard_quick_press form { + margin: 12px; +} + +#dashboard_quick_press .drafts { + padding: 10px 0 0; +} + +/* Dashboard Quick Draft - Form styling */ + +#dashboard_quick_press label { + display: inline-block; + margin-bottom: 4px; +} + +#dashboard_quick_press input, +#dashboard_quick_press textarea { + box-sizing: border-box; + margin: 0; +} + +#dashboard-widgets .postbox form .submit { + margin: -39px 0; + float: right; +} + +#description-wrap { + margin-top: 12px; +} + +#quick-press textarea#content { + min-height: 90px; + max-height: 1300px; + margin: 0 0 8px; + padding: 6px 7px; + resize: none; +} + +/* Dashboard Quick Draft - Drafts list */ + +.js #dashboard_quick_press .drafts { + border-top: 1px solid #eee; +} + +#dashboard_quick_press .drafts abbr { + border: none; +} + +#dashboard_quick_press .drafts .view-all { + float: right; + margin: 0 12px 0 0; +} + +#dashboard_primary a.rsswidget { + font-weight: 400; +} + +#dashboard_quick_press .drafts ul { + margin: 0 12px; +} + +#dashboard_quick_press .drafts li { + margin-bottom: 1em; +} +#dashboard_quick_press .drafts li time { + color: #72777c; +} + +#dashboard_quick_press .drafts p { + margin: 0; + word-wrap: break-word; +} + +#dashboard_quick_press .draft-title { + word-wrap: break-word; +} + +#dashboard_quick_press .draft-title a, +#dashboard_quick_press .draft-title time { + margin: 0 5px 0 0; +} + +/* Dashboard common styles */ + +#dashboard-widgets h4, /* Back-compat for pre-4.4 */ +#dashboard-widgets h3, +#dashboard_quick_press .drafts h2 { + margin: 0 12px 8px; + padding: 0; + font-size: 14px; + font-weight: 400; + color: #23282d; +} + +#dashboard_quick_press .drafts h2 { + line-height: inherit; +} + +#dashboard-widgets .inside h4, /* Back-compat for pre-4.4 */ +#dashboard-widgets .inside h3 { + margin-left: 0; + margin-right: 0; +} + +/* Dashboard activity widget */ + +#dashboard_activity .comment-meta span.approve:before { + content: "\f227"; + font: 20px/.5 dashicons; + margin-left: 5px; + vertical-align: middle; + position: relative; + top: -1px; + margin-right: 2px; +} + +#dashboard_activity .inside { + margin: 0; + padding-bottom: 0; +} + +#dashboard_activity .no-activity { + overflow: hidden; + padding: 0 0 12px; + text-align: center; +} + +#dashboard_activity .no-activity p { + color: #72777c; + font-size: 16px; +} + +#dashboard_activity .no-activity .smiley { + margin-top: 0; +} + +#dashboard_activity .no-activity .smiley:before { + content: "\f328"; + font: normal 120px/1 dashicons; + speak: none; + display: block; + margin: 0 5px 0 0; + padding: 0; + text-indent: 0; + text-align: center; + position: relative; + -webkit-font-smoothing: antialiased; + text-decoration: none !important; +} + +#dashboard_activity .subsubsub { + float: none; + border-top: 1px solid #eee; + margin: 0 -12px; + padding: 8px 12px 4px; +} + +#dashboard_activity .subsubsub a .count, +#dashboard_activity .subsubsub a.current .count { + color: #72777c; /* white background on the dashboard but #f1f1f1 on list tables */ +} + +#future-posts ul, +#published-posts ul { + clear: both; + margin-bottom: 0; +} + +#future-posts li, +#published-posts li { + margin-bottom: 8px; +} + +#future-posts ul span, +#published-posts ul span { + display: inline-block; + margin-right: 5px; + min-width: 150px; + color: #72777c; +} + +.activity-block { + border-bottom: 1px solid #eee; + margin: 0 -12px; + padding: 8px 12px 4px; +} + +.activity-block:last-child { + border-bottom: none; +} + +.activity-block .subsubsub li { + color: #ddd; +} + +/* Dashboard activity widget - Comments */ +/* @todo: needs serious de-duplication */ + +#activity-widget #the-comment-list tr.undo, +#activity-widget #the-comment-list div.undo { + background: none; + padding: 6px 0; + margin-left: 12px; +} + +#activity-widget #the-comment-list .comment-item { + background: #fafafa; + padding: 12px; + position: relative; +} + +#activity-widget #the-comment-list .avatar { + position: absolute; + top: 12px; +} + +#activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar { + padding-left: 63px; +} + +#activity-widget #the-comment-list .dashboard-comment-wrap blockquote { + margin: 1em 0; +} + +#activity-widget #the-comment-list .comment-item p.row-actions { + margin: 4px 0 0 0; +} + +#activity-widget #the-comment-list .comment-item:first-child { + border-top: 1px solid #eeeeee; +} + +#activity-widget #the-comment-list .unapproved { + background-color: #fef7f1; +} + +#activity-widget #the-comment-list .unapproved:before { + content: ""; + display: block; + position: absolute; + left: 0; + top: 0; + bottom: 0; + background: #d54e21; + width: 4px; +} + +#activity-widget #the-comment-list .spam-undo-inside .avatar, +#activity-widget #the-comment-list .trash-undo-inside .avatar { + position: relative; + top: 0; +} + +/* Browse happy box */ + +#dashboard-widgets #dashboard_browser_nag.postbox .inside { + margin: 10px; +} + +.postbox .button-link .edit-box { + display: none; +} + +.edit-box { + opacity: 0; +} + +.hndle:hover .edit-box, +.edit-box:focus { + opacity: 1; +} + +#dashboard-widgets form .input-text-wrap input { + width: 100%; +} + +#dashboard-widgets form .textarea-wrap textarea { + width: 100%; +} + +#dashboard-widgets .postbox form .submit { + float: none; + margin: .5em 0 0; + padding: 0; + border: none; +} + +#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish { + min-width: 0; +} + +#dashboard-widgets li a, +#dashboard-widgets .button-link, +.community-events-footer a { + text-decoration: none; +} + +#dashboard-widgets h2 a { + text-decoration: underline; +} + +#dashboard-widgets .hndle .postbox-title-action { + float: right; + line-height: 1.2; +} + +#dashboard_plugins h5 { + font-size: 14px; +} + +/* Recent Comments */ + +#latest-comments #the-comment-list { + position: relative; + margin: 0 -12px; +} + +#activity-widget #the-comment-list .comment, +#activity-widget #the-comment-list .pingback { + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.06); +} + +#activity-widget .comments #the-comment-list .alt { + background-color: transparent; +} + +#activity-widget #latest-comments #the-comment-list .comment-item { + /* the row-actions paragraph is output only for users with 'edit_comment' capabilities, + for other users this needs a min height equal to the gravatar image */ + min-height: 50px; + margin: 0; + padding: 12px; +} + +#latest-comments #the-comment-list .pingback { + padding-left: 12px !important; +} + +#latest-comments #the-comment-list .comment-item:first-child { + border-top: none; +} + +#latest-comments #the-comment-list .comment-meta { + line-height: 1.5; + margin: 0; + color: #666; +} + +#latest-comments #the-comment-list .comment-meta cite { + font-style: normal; + font-weight: 400; +} + +#latest-comments #the-comment-list .comment-item blockquote, +#latest-comments #the-comment-list .comment-item blockquote p { + margin: 0; + padding: 0; + display: inline; +} + +#latest-comments #the-comment-list .comment-item p.row-actions { + margin: 3px 0 0; + padding: 0; + font-size: 13px; +} + +/* Feeds */ +.rss-widget ul { + margin: 0; + padding: 0; + list-style: none; +} + +a.rsswidget { + font-size: 13px; + font-weight: 600; + line-height: 1.4; +} + +.rss-widget ul li { + line-height: 1.5; + margin-bottom: 12px; +} + +.rss-widget span.rss-date { + color: #72777c; + font-size: 13px; + margin-left: 3px; +} + +.rss-widget cite { + display: block; + text-align: right; + margin: 0 0 1em; + padding: 0; +} + +.rss-widget cite:before { + content: "\2014"; +} + +.dashboard-comment-wrap { + word-wrap: break-word; +} + +/* Browser Nag */ +#dashboard_browser_nag a.update-browser-link { + font-size: 1.2em; + font-weight: 600; +} + +#dashboard_browser_nag a { + text-decoration: underline; +} + +#dashboard_browser_nag p.browser-update-nag.has-browser-icon { + padding-right: 125px; +} + +#dashboard_browser_nag .browser-icon { + margin-top: -35px; +} + +#dashboard_browser_nag.postbox.browser-insecure { + background-color: #ac1b1b; + border-color: #ac1b1b; +} + +#dashboard_browser_nag.postbox { + background-color: #e29808; + background-image: none; + border-color: #edc048; + color: #fff; + box-shadow: none; +} + +#dashboard_browser_nag.postbox.browser-insecure h2 { + border-bottom-color: #cd5a5a; + color: #fff; +} + +#dashboard_browser_nag.postbox h2 { + border-bottom-color: #f6e2ac; + background: transparent none; + color: #fff; + box-shadow: none; +} + +#dashboard_browser_nag a { + color: #fff; +} + +#dashboard_browser_nag h2.hndle { + border: none; + font-weight: 600; + font-size: 20px; + padding-top: 10px; +} + +.postbox#dashboard_browser_nag p a.dismiss { + font-size: 14px; +} + +.postbox#dashboard_browser_nag p, +.postbox#dashboard_browser_nag a, +.postbox#dashboard_browser_nag p.browser-update-nag { + font-size: 16px; +} + +/* PHP Nag */ +#dashboard_php_nag .dashicons-warning { + color: #ffb900; + padding-right: 6px; +} + +#dashboard_php_nag.php-insecure .dashicons-warning { + color: #df3232; +} + +#dashboard_php_nag p { + margin: 12px 0; +} + +#dashboard_php_nag h3 { + font-weight: 600; +} + +#dashboard_php_nag .button .dashicons-external { + line-height: 25px; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/* one column on the dash */ +@media only screen and (max-width: 799px) { + #wpbody-content #dashboard-widgets .postbox-container { + width: 100%; + } +} + +/* two columns on the dash, but keep the setting if one is selected */ +@media only screen and (min-width: 800px) and (max-width: 1499px) { + #wpbody-content #dashboard-widgets .postbox-container { + width: 49.5%; + } + + #wpbody-content #dashboard-widgets #postbox-container-2, + #wpbody-content #dashboard-widgets #postbox-container-3, + #wpbody-content #dashboard-widgets #postbox-container-4 { + float: right; + width: 50.5%; + } + + #dashboard-widgets #postbox-container-3 .empty-container, + #dashboard-widgets #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; + } + + #dashboard-widgets #postbox-container-3 .empty-container:after, + #dashboard-widgets #postbox-container-4 .empty-container:after { + display: none; + } + + #wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container { + width: 100%; + } + + #wpbody #wpbody-content .metabox-holder.columns-1 .postbox-container .empty-container { + border: 0 none; + height: 0; + min-height: 0; + } + + /* show the radio buttons for column prefs only for one or two columns */ + .index-php .screen-layout, + .index-php .columns-prefs { + display: block; + } + + .columns-prefs .columns-prefs-3, + .columns-prefs .columns-prefs-4 { + display: none; + } + + .metabox-holder .postbox-container .empty-container:after { + display: block; + } +} + +/* three columns on the dash */ +@media only screen and (min-width: 1500px) and (max-width: 1800px) { + #wpbody-content #dashboard-widgets .postbox-container { + width: 33.5%; + } + + #wpbody-content #dashboard-widgets #postbox-container-1 { + width: 33%; + } + + #wpbody-content #dashboard-widgets #postbox-container-3, + #wpbody-content #dashboard-widgets #postbox-container-4 { + float: right; + } + + #dashboard-widgets #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; + } + + #dashboard-widgets #postbox-container-4 .empty-container:after { + display: none; + } + + .metabox-holder .postbox-container .empty-container:after { + display: block; + } +} + +@media screen and (max-width: 870px) { + .welcome-panel .welcome-panel-column, + .welcome-panel .welcome-panel-column:first-child { + display: block; + float: none; + width: 100%; + } + + .welcome-panel .welcome-panel-column li { + display: inline-block; + margin-right: 13px; + } + + .welcome-panel .welcome-panel-column ul { + margin: 0.4em 0 0; + } + +} + +@media screen and (max-width: 782px) { + #dashboard_recent_comments #the-comment-list .comment-item .avatar { + height: 30px; + width: 30px; + margin: 4px 10px 5px 0; + } + + .community-events-toggle-location { + height: 38px; + vertical-align: baseline; + } + + .community-events-form .regular-text { + height: 32px; + } + + #community-events-submit { + margin-bottom: 0; + /* Override .wp-core-ui .button */ + vertical-align: top; + } + + .community-events-form label, + #dashboard-widgets .community-events-cancel.button-link { + /* Same properties as the submit button for cross-browsers alignment. */ + font-size: 14px; + line-height: normal; + height: auto; + padding: 6px 0; + border: 1px solid transparent; + } + + .community-events .spinner { + margin-top: 7px; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + /* Keep the close icon from overlapping the Welcome text. */ + .welcome-panel .welcome-panel-close { + overflow: hidden; + text-indent: 40px; + white-space: nowrap; + width: 20px; + height: 20px; + padding: 5px; + top: 5px; + right: 5px; + } + + /* Make the close icon larger for tappability. */ + .welcome-panel .welcome-panel-close:before { + font-size: 20px; + top: 5px; + left: -35px; + } +} + +@media screen and (min-width: 355px) { + .community-events .event-info { + display: table-row; + float: left; + max-width: 59%; + } + + .event-icon, + .event-icon[aria-hidden="true"] { + display: table-cell; + } + + .event-info-inner { + display: table-cell; + } + + .community-events .event-date-time { + float: right; + max-width: 39%; + } + + .community-events .event-date, + .community-events .event-time { + text-align: right; + } +} diff --git a/wp-admin/css/dashboard.min.css b/wp-admin/css/dashboard.min.css new file mode 100644 index 0000000..d88c3e1 --- /dev/null +++ b/wp-admin/css/dashboard.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#wpbody-content #dashboard-widgets.columns-1 .postbox-container{width:100%}#wpbody-content #dashboard-widgets.columns-2 .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2,#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3,#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4{float:right;width:50.5%}#wpbody-content #dashboard-widgets.columns-3 .postbox-container{width:33.5%}#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1{width:33%}#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3,#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4{float:right}#wpbody-content #dashboard-widgets.columns-4 .postbox-container{width:25%}#dashboard-widgets .postbox-container{width:25%}#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container{border:none!important}.ie8 #wpbody-content #dashboard-widgets .postbox-container{width:49.5%}.ie8 #wpbody-content #dashboard-widgets #postbox-container-2,.ie8 #wpbody-content #dashboard-widgets #postbox-container-3,.ie8 #wpbody-content #dashboard-widgets #postbox-container-4{float:right;width:50.5%}.ie8 #dashboard-widgets #postbox-container-3 .empty-container,.ie8 #dashboard-widgets #postbox-container-4 .empty-container{border:0 none;height:0;min-height:0}#dashboard-widgets-wrap{overflow:hidden;margin:0 -8px}#dashboard-widgets .postbox .inside{margin-bottom:0}#dashboard-widgets .meta-box-sortables{margin:0 8px;min-height:100px}#the-comment-list td.comment p.comment-author{margin-top:0;margin-left:0}#the-comment-list p.comment-author img{float:left;margin-right:8px}#the-comment-list p.comment-author strong a{border:none}#the-comment-list td{vertical-align:top}#the-comment-list td.comment{word-wrap:break-word}#the-comment-list td.comment img{max-width:100%}.welcome-panel{position:relative;overflow:auto;margin:16px 0;padding:23px 10px 0;border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;font-size:13px;line-height:1.7}.welcome-panel h2{margin:0;font-size:21px;font-weight:400;line-height:1.2}.welcome-panel h3{margin:1.33em 0 0;font-size:16px}.welcome-panel li{font-size:14px}.welcome-panel p{color:#72777c}.welcome-panel li a{text-decoration:none}.welcome-panel .about-description{font-size:16px;margin:0}.welcome-panel .welcome-panel-close{position:absolute;top:10px;right:10px;padding:10px 15px 10px 21px;font-size:13px;line-height:1.23076923;text-decoration:none}.welcome-panel .welcome-panel-close:before{position:absolute;top:8px;left:0;transition:all .1s ease-in-out}.wp-core-ui .welcome-panel .button.button-hero{margin:15px 13px 3px 0;padding:12px 36px;height:auto;line-height:1.4285714;white-space:normal}.welcome-panel-content{margin-left:13px;max-width:1500px}.welcome-panel .welcome-panel-column-container{clear:both;position:relative}.welcome-panel .welcome-panel-column{width:32%;min-width:200px;float:left}.ie8 .welcome-panel .welcome-panel-column{min-width:230px}.welcome-panel .welcome-panel-column:first-child{width:36%}.welcome-panel-column p.hide-if-no-customize{margin-top:10px}.welcome-panel-column p{margin-top:7px;color:#444}.welcome-panel .welcome-widgets-menus{line-height:1.14285714}.welcome-panel .welcome-panel-column ul{margin:.8em 1em 1em 0}.welcome-panel .welcome-panel-column li{line-height:1.14285714;list-style-type:none;padding:0 0 8px}.welcome-panel .welcome-icon{background:0 0!important}#dashboard_right_now li a:before,#dashboard_right_now li span:before,.welcome-panel .welcome-icon:before{color:#606a73;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 10px 0 0;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;vertical-align:top}.welcome-panel .welcome-edit-page:before,.welcome-panel .welcome-write-blog:before{content:"\f119";top:-3px}.welcome-panel .welcome-add-page:before{content:"\f132";top:-1px}.welcome-panel .welcome-setup-home:before{content:"\f102";top:-1px}.welcome-panel .welcome-view-site:before{content:"\f115";top:-2px}.welcome-panel .welcome-widgets-menus:before{content:"\f116";top:-2px}.welcome-panel .welcome-widgets:before{content:"\f538";top:-2px}.welcome-panel .welcome-menus:before{content:"\f163";top:-2px}.welcome-panel .welcome-comments:before{content:"\f117";top:-1px}.welcome-panel .welcome-learn-more:before{content:"\f118";top:-1px}#dashboard_right_now li a:before,#dashboard_right_now li>span:before{content:"\f159";padding:0 5px 0 0}#dashboard_right_now .page-count a:before,#dashboard_right_now .page-count span:before{content:"\f105"}#dashboard_right_now .post-count a:before,#dashboard_right_now .post-count span:before{content:"\f109"}#dashboard_right_now .comment-count a:before{content:"\f101"}#dashboard_right_now .comment-mod-count a:before{content:"\f125"}#dashboard_right_now .storage-count a:before{content:"\f104"}#dashboard_right_now .storage-count.warning a:before{content:"\f153"}.community-events-errors{margin:0}.community-events-loading{padding:10px 12px 8px}.community-events{margin-bottom:6px;padding:0 12px}.community-events .spinner{float:none;margin:5px 2px 0;vertical-align:top}.community-events [aria-hidden=true],.community-events-errors [aria-hidden=true],.community-events-errors[aria-hidden=true],.community-events-loading[aria-hidden=true],.community-events[aria-hidden=true]{display:none}.community-events .activity-block:first-child,.community-events h2{padding-top:12px;padding-bottom:10px}.community-events-form{margin:15px 0 5px}.community-events-form .regular-text{width:40%;height:29px;margin:0;vertical-align:top}.community-events li.event-none{border-left:4px solid #00a0d2}.community-events-form label{display:inline-block;vertical-align:top;line-height:2.15384615;height:28px}.community-events .activity-block>p{margin-bottom:0;display:inline}.community-events-toggle-location{vertical-align:middle}#community-events-submit{margin-left:3px;margin-right:3px}#dashboard-widgets .community-events-cancel.button-link{vertical-align:top;line-height:2;height:28px;text-decoration:underline}.community-events ul{background-color:#fafafa;padding-left:0;padding-right:0;padding-bottom:0}.community-events li{margin:0;padding:8px 12px;color:#32373c}.community-events li:first-child{border-top:1px solid #eee}.community-events li~li{border-top:1px solid #eee}.community-events .activity-block.last{border-bottom:1px solid #eee;padding-top:0;margin-top:-1px}.community-events .event-info{display:block}.event-icon{height:18px;padding-right:10px;width:18px;display:none}.event-icon:before{color:#606a73;font-size:18px}.event-meetup .event-icon:before{content:"\f484"}.event-wordcamp .event-icon:before{content:"\f486"}.community-events .event-title{font-weight:600;display:block}.community-events .event-date,.community-events .event-time{display:block}.community-events-footer{margin-top:0;margin-bottom:0;padding:12px;border-top:1px solid #eee;color:#ddd}.community-events-footer .screen-reader-text{height:inherit;white-space:nowrap}#dashboard_primary .inside{margin:0;padding:0}#dashboard_primary .widget-loading{padding:12px 12px 0;margin-bottom:1em!important}#dashboard_primary .inside .notice{margin:0}body #dashboard-widgets .postbox form .submit{margin:0}.dashboard-widget-control-form p{margin-top:0}.rssSummary{color:#72777c;margin-top:4px}#dashboard_primary .rss-widget{font-size:13px;padding:0 12px 0}#dashboard_primary .rss-widget:last-child{border-bottom:none;padding-bottom:8px}#dashboard_primary .rss-widget a{font-weight:400}#dashboard_primary .rss-widget span,#dashboard_primary .rss-widget span.rss-date{color:#72777c}#dashboard_primary .rss-widget span.rss-date{margin-left:12px}#dashboard_primary .rss-widget ul li{padding:4px 0;margin:0}#dashboard_right_now ul{margin:0;display:inline-block;width:100%}#dashboard_right_now li{width:50%;float:left;margin-bottom:10px}#dashboard_right_now .inside{padding:0}#dashboard_right_now .main{padding:0 12px 11px}#dashboard_right_now .main p{margin:0}#dashboard_right_now #wp-version-message .button{float:right;position:relative;top:-5px;margin-left:5px}.mu-storage{overflow:hidden}#dashboard-widgets h3.mu-storage{margin:0 0 10px;padding:0;font-size:14px;font-weight:400}#dashboard_right_now .sub{color:#555d66;background:#f5f5f5;border-top:1px solid #eee;padding:10px 12px 6px 12px}#dashboard_right_now .sub h3{color:#555}#dashboard_right_now .sub p{margin:0 0 1em}#dashboard_right_now .warning a:before,#dashboard_right_now .warning span:before{color:#d54e21}#dashboard_quick_press .inside{margin:0;padding:0}#dashboard_quick_press div.updated{margin-bottom:10px;border:1px solid #eee;border-width:1px 1px 1px 0}#dashboard_quick_press form{margin:12px}#dashboard_quick_press .drafts{padding:10px 0 0}#dashboard_quick_press label{display:inline-block;margin-bottom:4px}#dashboard_quick_press input,#dashboard_quick_press textarea{box-sizing:border-box;margin:0}#dashboard-widgets .postbox form .submit{margin:-39px 0;float:right}#description-wrap{margin-top:12px}#quick-press textarea#content{min-height:90px;max-height:1300px;margin:0 0 8px;padding:6px 7px;resize:none}.js #dashboard_quick_press .drafts{border-top:1px solid #eee}#dashboard_quick_press .drafts abbr{border:none}#dashboard_quick_press .drafts .view-all{float:right;margin:0 12px 0 0}#dashboard_primary a.rsswidget{font-weight:400}#dashboard_quick_press .drafts ul{margin:0 12px}#dashboard_quick_press .drafts li{margin-bottom:1em}#dashboard_quick_press .drafts li time{color:#72777c}#dashboard_quick_press .drafts p{margin:0;word-wrap:break-word}#dashboard_quick_press .draft-title{word-wrap:break-word}#dashboard_quick_press .draft-title a,#dashboard_quick_press .draft-title time{margin:0 5px 0 0}#dashboard-widgets h3,#dashboard-widgets h4,#dashboard_quick_press .drafts h2{margin:0 12px 8px;padding:0;font-size:14px;font-weight:400;color:#23282d}#dashboard_quick_press .drafts h2{line-height:inherit}#dashboard-widgets .inside h3,#dashboard-widgets .inside h4{margin-left:0;margin-right:0}#dashboard_activity .comment-meta span.approve:before{content:"\f227";font:20px/.5 dashicons;margin-left:5px;vertical-align:middle;position:relative;top:-1px;margin-right:2px}#dashboard_activity .inside{margin:0;padding-bottom:0}#dashboard_activity .no-activity{overflow:hidden;padding:0 0 12px;text-align:center}#dashboard_activity .no-activity p{color:#72777c;font-size:16px}#dashboard_activity .no-activity .smiley{margin-top:0}#dashboard_activity .no-activity .smiley:before{content:"\f328";font:normal 120px/1 dashicons;speak:none;display:block;margin:0 5px 0 0;padding:0;text-indent:0;text-align:center;position:relative;-webkit-font-smoothing:antialiased;text-decoration:none!important}#dashboard_activity .subsubsub{float:none;border-top:1px solid #eee;margin:0 -12px;padding:8px 12px 4px}#dashboard_activity .subsubsub a .count,#dashboard_activity .subsubsub a.current .count{color:#72777c}#future-posts ul,#published-posts ul{clear:both;margin-bottom:0}#future-posts li,#published-posts li{margin-bottom:8px}#future-posts ul span,#published-posts ul span{display:inline-block;margin-right:5px;min-width:150px;color:#72777c}.activity-block{border-bottom:1px solid #eee;margin:0 -12px;padding:8px 12px 4px}.activity-block:last-child{border-bottom:none}.activity-block .subsubsub li{color:#ddd}#activity-widget #the-comment-list div.undo,#activity-widget #the-comment-list tr.undo{background:0 0;padding:6px 0;margin-left:12px}#activity-widget #the-comment-list .comment-item{background:#fafafa;padding:12px;position:relative}#activity-widget #the-comment-list .avatar{position:absolute;top:12px}#activity-widget #the-comment-list .dashboard-comment-wrap.has-avatar{padding-left:63px}#activity-widget #the-comment-list .dashboard-comment-wrap blockquote{margin:1em 0}#activity-widget #the-comment-list .comment-item p.row-actions{margin:4px 0 0 0}#activity-widget #the-comment-list .comment-item:first-child{border-top:1px solid #eee}#activity-widget #the-comment-list .unapproved{background-color:#fef7f1}#activity-widget #the-comment-list .unapproved:before{content:"";display:block;position:absolute;left:0;top:0;bottom:0;background:#d54e21;width:4px}#activity-widget #the-comment-list .spam-undo-inside .avatar,#activity-widget #the-comment-list .trash-undo-inside .avatar{position:relative;top:0}#dashboard-widgets #dashboard_browser_nag.postbox .inside{margin:10px}.postbox .button-link .edit-box{display:none}.edit-box{opacity:0}.edit-box:focus,.hndle:hover .edit-box{opacity:1}#dashboard-widgets form .input-text-wrap input{width:100%}#dashboard-widgets form .textarea-wrap textarea{width:100%}#dashboard-widgets .postbox form .submit{float:none;margin:.5em 0 0;padding:0;border:none}#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish{min-width:0}#dashboard-widgets .button-link,#dashboard-widgets li a,.community-events-footer a{text-decoration:none}#dashboard-widgets h2 a{text-decoration:underline}#dashboard-widgets .hndle .postbox-title-action{float:right;line-height:1.2}#dashboard_plugins h5{font-size:14px}#latest-comments #the-comment-list{position:relative;margin:0 -12px}#activity-widget #the-comment-list .comment,#activity-widget #the-comment-list .pingback{box-shadow:inset 0 1px 0 rgba(0,0,0,.06)}#activity-widget .comments #the-comment-list .alt{background-color:transparent}#activity-widget #latest-comments #the-comment-list .comment-item{min-height:50px;margin:0;padding:12px}#latest-comments #the-comment-list .pingback{padding-left:12px!important}#latest-comments #the-comment-list .comment-item:first-child{border-top:none}#latest-comments #the-comment-list .comment-meta{line-height:1.5;margin:0;color:#666}#latest-comments #the-comment-list .comment-meta cite{font-style:normal;font-weight:400}#latest-comments #the-comment-list .comment-item blockquote,#latest-comments #the-comment-list .comment-item blockquote p{margin:0;padding:0;display:inline}#latest-comments #the-comment-list .comment-item p.row-actions{margin:3px 0 0;padding:0;font-size:13px}.rss-widget ul{margin:0;padding:0;list-style:none}a.rsswidget{font-size:13px;font-weight:600;line-height:1.4}.rss-widget ul li{line-height:1.5;margin-bottom:12px}.rss-widget span.rss-date{color:#72777c;font-size:13px;margin-left:3px}.rss-widget cite{display:block;text-align:right;margin:0 0 1em;padding:0}.rss-widget cite:before{content:"\2014"}.dashboard-comment-wrap{word-wrap:break-word}#dashboard_browser_nag a.update-browser-link{font-size:1.2em;font-weight:600}#dashboard_browser_nag a{text-decoration:underline}#dashboard_browser_nag p.browser-update-nag.has-browser-icon{padding-right:125px}#dashboard_browser_nag .browser-icon{margin-top:-35px}#dashboard_browser_nag.postbox.browser-insecure{background-color:#ac1b1b;border-color:#ac1b1b}#dashboard_browser_nag.postbox{background-color:#e29808;background-image:none;border-color:#edc048;color:#fff;box-shadow:none}#dashboard_browser_nag.postbox.browser-insecure h2{border-bottom-color:#cd5a5a;color:#fff}#dashboard_browser_nag.postbox h2{border-bottom-color:#f6e2ac;background:transparent none;color:#fff;box-shadow:none}#dashboard_browser_nag a{color:#fff}#dashboard_browser_nag h2.hndle{border:none;font-weight:600;font-size:20px;padding-top:10px}.postbox#dashboard_browser_nag p a.dismiss{font-size:14px}.postbox#dashboard_browser_nag a,.postbox#dashboard_browser_nag p,.postbox#dashboard_browser_nag p.browser-update-nag{font-size:16px}#dashboard_php_nag .dashicons-warning{color:#ffb900;padding-right:6px}#dashboard_php_nag.php-insecure .dashicons-warning{color:#df3232}#dashboard_php_nag p{margin:12px 0}#dashboard_php_nag h3{font-weight:600}#dashboard_php_nag .button .dashicons-external{line-height:25px}@media only screen and (max-width:799px){#wpbody-content #dashboard-widgets .postbox-container{width:100%}}@media only screen and (min-width:800px) and (max-width:1499px){#wpbody-content #dashboard-widgets .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets #postbox-container-2,#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:right;width:50.5%}#dashboard-widgets #postbox-container-3 .empty-container,#dashboard-widgets #postbox-container-4 .empty-container{border:0 none;height:0;min-height:0}#dashboard-widgets #postbox-container-3 .empty-container:after,#dashboard-widgets #postbox-container-4 .empty-container:after{display:none}#wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container{width:100%}#wpbody #wpbody-content .metabox-holder.columns-1 .postbox-container .empty-container{border:0 none;height:0;min-height:0}.index-php .columns-prefs,.index-php .screen-layout{display:block}.columns-prefs .columns-prefs-3,.columns-prefs .columns-prefs-4{display:none}.metabox-holder .postbox-container .empty-container:after{display:block}}@media only screen and (min-width:1500px) and (max-width:1800px){#wpbody-content #dashboard-widgets .postbox-container{width:33.5%}#wpbody-content #dashboard-widgets #postbox-container-1{width:33%}#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:right}#dashboard-widgets #postbox-container-4 .empty-container{border:0 none;height:0;min-height:0}#dashboard-widgets #postbox-container-4 .empty-container:after{display:none}.metabox-holder .postbox-container .empty-container:after{display:block}}@media screen and (max-width:870px){.welcome-panel .welcome-panel-column,.welcome-panel .welcome-panel-column:first-child{display:block;float:none;width:100%}.welcome-panel .welcome-panel-column li{display:inline-block;margin-right:13px}.welcome-panel .welcome-panel-column ul{margin:.4em 0 0}}@media screen and (max-width:782px){#dashboard_recent_comments #the-comment-list .comment-item .avatar{height:30px;width:30px;margin:4px 10px 5px 0}.community-events-toggle-location{height:38px;vertical-align:baseline}.community-events-form .regular-text{height:32px}#community-events-submit{margin-bottom:0;vertical-align:top}#dashboard-widgets .community-events-cancel.button-link,.community-events-form label{font-size:14px;line-height:normal;height:auto;padding:6px 0;border:1px solid transparent}.community-events .spinner{margin-top:7px}}@media screen and (max-width:600px){.welcome-panel .welcome-panel-close{overflow:hidden;text-indent:40px;white-space:nowrap;width:20px;height:20px;padding:5px;top:5px;right:5px}.welcome-panel .welcome-panel-close:before{font-size:20px;top:5px;left:-35px}}@media screen and (min-width:355px){.community-events .event-info{display:table-row;float:left;max-width:59%}.event-icon,.event-icon[aria-hidden=true]{display:table-cell}.event-info-inner{display:table-cell}.community-events .event-date-time{float:right;max-width:39%}.community-events .event-date,.community-events .event-time{text-align:right}} \ No newline at end of file diff --git a/wp-admin/css/deprecated-media-rtl.css b/wp-admin/css/deprecated-media-rtl.css new file mode 100644 index 0000000..3089ab5 --- /dev/null +++ b/wp-admin/css/deprecated-media-rtl.css @@ -0,0 +1,430 @@ +/*! This file is auto-generated */ +/* Styles for the media library iframe (not used on the Library screen) */ + +div#media-upload-header { + margin: 0; + padding: 5px 5px 0; + font-weight: 600; + position: relative; + border-bottom: 1px solid #ddd; + background: #f9f9f9; +} + +#sidemenu { + overflow: hidden; + float: none; + position: relative; + right: 0; + bottom: -1px; + margin: 0 5px; + padding-right: 10px; + list-style: none; + font-size: 12px; + font-weight: 400; +} + +#sidemenu a { + padding: 0 7px; + display: block; + float: right; + line-height: 28px; + border-top: 1px solid #f9f9f9; + border-bottom: 1px solid #ddd; + background-color: #f9f9f9; + text-decoration: none; + transition: none; +} + +#sidemenu li { + display: inline; + line-height: 200%; + list-style: none; + text-align: center; + white-space: nowrap; + margin: 0; + padding: 0; +} + +#sidemenu a.current { + font-weight: 400; + padding-right: 6px; + padding-left: 6px; + border: 1px solid #ddd; + border-bottom-color: #f1f1f1; + background-color: #f1f1f1; + color: #000; +} + +#media-upload:after { /* clearfix */ + content: ""; + display: table; + clear: both; +} + +#media-upload .slidetoggle { + border-top-color: #ddd; +} + +#media-upload input[type="radio"] { + padding: 0; +} + +.media-upload-form label.form-help, +td.help { + color: #72777c; +} + +form { + margin: 1em; +} + +#search-filter { + text-align: left; +} + +th { + position: relative; +} + +.media-upload-form label.form-help, td.help { + font-family: sans-serif; + font-style: italic; + font-weight: 400; +} + +.media-upload-form p.help { + margin: 0; + padding: 0; +} + +.media-upload-form fieldset { + width: 100%; + border: none; + text-align: justify; + margin: 0 0 1em 0; + padding: 0; +} + +/* specific to the image upload form */ + +.image-align-none-label { + background: url(../images/align-none.png) no-repeat center left; +} + +.image-align-left-label { + background: url(../images/align-left.png) no-repeat center left; +} + +.image-align-center-label { + background: url(../images/align-center.png) no-repeat center left; +} + +.image-align-right-label { + background: url(../images/align-right.png) no-repeat center left; +} + +tr.image-size td { + width: 460px; +} + +tr.image-size div.image-size-item { + margin: 0 0 5px; +} + +#library-form .progress, +#gallery-form .progress, +.insert-gallery, +.describe.startopen, +.describe.startclosed { + display: none; +} + +.media-item .thumbnail { + max-width: 128px; + max-height: 128px; +} + +thead.media-item-info tr { + background-color: transparent; +} + +.form-table thead.media-item-info { + border: 8px solid #fff; +} + +abbr.required, +span.required { + text-decoration: none; + border: none; +} + +.describe label { + display: inline; +} + +.describe td.error { + padding: 2px 8px; +} + +.describe td.A1 { + width: 132px; +} + +.describe input[type="text"], +.describe textarea { + width: 460px; + border-width: 1px; + border-style: solid; +} + +/* Specific to Uploader */ + +#media-upload p.ml-submit { + padding: 1em 0; +} + +#media-upload p.help, +#media-upload label.help { + font-family: sans-serif; + font-style: italic; + font-weight: 400; +} + +#media-upload .ui-sortable .media-item { + cursor: move; +} + +#media-upload tr.image-size { + margin-bottom: 1em; + height: 3em; +} + +#media-upload #filter { + width: 623px; +} + +#media-upload #filter .subsubsub { + margin: 8px 0; +} + +#media-upload .tablenav-pages a, +#media-upload .tablenav-pages .current { + display: inline-block; + padding: 4px 5px 6px; + font-size: 16px; + line-height: 1; + text-align: center; + text-decoration: none; +} + +#media-upload .tablenav-pages a { + min-width: 17px; + border: 1px solid #ccc; + background: #f7f7f7; +} + +#filter .tablenav select { + border-style: solid; + border-width: 1px; + padding: 2px; + vertical-align: top; + width: auto; +} + +#media-upload .del-attachment { + display: none; + margin: 5px 0; +} + +.menu_order { + float: left; + font-size: 11px; + margin: 8px 10px 0; +} + +.menu_order_input { + border: 1px solid #ddd; + font-size: 10px; + padding: 1px; + width: 23px; +} + +.ui-sortable-helper { + background-color: #fff; + border: 1px solid #a0a5aa; + opacity: 0.6; + filter: alpha(opacity=60); +} + +#media-upload th.order-head { + width: 20%; + text-align: center; +} + +#media-upload th.actions-head { + width: 25%; + text-align: center; +} + +#media-upload a.wp-post-thumbnail { + margin: 0 20px; +} + +#media-upload .widefat { + border-style: solid solid none; +} + +.sorthelper { + height: 37px; + width: 623px; + display: block; +} + +#gallery-settings th.label { + width: 160px; +} + +#gallery-settings #basic th.label { + padding: 5px 0 5px 5px; +} + +#gallery-settings .title { + clear: both; + padding: 0 0 3px; + font-size: 1.6em; + border-bottom: 1px solid #ddd; +} + +h3.media-title { + font-size: 1.6em; +} + +h4.media-sub-title { + border-bottom: 1px solid #ddd; + font-size: 1.3em; + margin: 12px; + padding: 0 0 3px; +} + +#gallery-settings .title, +h3.media-title, +h4.media-sub-title { + font-family: Georgia,"Times New Roman",Times,serif; + font-weight: 400; + color: #5A5A5A; +} + +#gallery-settings .describe td { + vertical-align: middle; + height: 3em; +} + +#gallery-settings .describe th.label { + padding-top: .5em; + text-align: right; +} + +#gallery-settings .describe { + padding: 5px; + width: 100%; + clear: both; + cursor: default; + background: #fff; +} + +#gallery-settings .describe select { + width: 15em; +} + +#gallery-settings .describe select option, +#gallery-settings .describe td { + padding: 0; +} + +#gallery-settings label, +#gallery-settings legend { + font-size: 13px; + color: #444; + margin-left: 15px; +} + +#gallery-settings .align .field label { + margin: 0 3px 0 1em; +} + +#gallery-settings p.ml-submit { + border-top: 1px solid #ddd; +} + +#gallery-settings select#columns { + width: 6em; +} + +#sort-buttons { + font-size: 0.8em; + margin: 3px 0 -8px 25px; + text-align: left; + max-width: 625px; +} + +#sort-buttons a { + text-decoration: none; +} + +#sort-buttons #asc, +#sort-buttons #showall { + padding-right: 5px; +} + +#sort-buttons span { + margin-left: 25px; +} + +p.media-types { + margin: 0; + padding: 1em; +} + +p.media-types-required-info { + padding-top: 0; +} + +tr.not-image { + display: none; +} + +table.not-image tr.not-image { + display: table-row; +} + +table.not-image tr.image-only { + display: none; +} + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + .image-align-none-label { + background-image: url(../images/align-none-2x.png?ver=20120916); + background-size: 21px 15px; + } + + .image-align-left-label { + background-image: url(../images/align-left-2x.png?ver=20120916); + background-size: 22px 15px; + } + + .image-align-center-label { + background-image: url(../images/align-center-2x.png?ver=20120916); + background-size: 21px 15px; + } + + .image-align-right-label { + background-image: url(../images/align-right-2x.png?ver=20120916); + background-size: 22px 15px; + } +} diff --git a/wp-admin/css/deprecated-media-rtl.min.css b/wp-admin/css/deprecated-media-rtl.min.css new file mode 100644 index 0000000..affd60e --- /dev/null +++ b/wp-admin/css/deprecated-media-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +div#media-upload-header{margin:0;padding:5px 5px 0;font-weight:600;position:relative;border-bottom:1px solid #ddd;background:#f9f9f9}#sidemenu{overflow:hidden;float:none;position:relative;right:0;bottom:-1px;margin:0 5px;padding-right:10px;list-style:none;font-size:12px;font-weight:400}#sidemenu a{padding:0 7px;display:block;float:right;line-height:28px;border-top:1px solid #f9f9f9;border-bottom:1px solid #ddd;background-color:#f9f9f9;text-decoration:none;transition:none}#sidemenu li{display:inline;line-height:200%;list-style:none;text-align:center;white-space:nowrap;margin:0;padding:0}#sidemenu a.current{font-weight:400;padding-right:6px;padding-left:6px;border:1px solid #ddd;border-bottom-color:#f1f1f1;background-color:#f1f1f1;color:#000}#media-upload:after{content:"";display:table;clear:both}#media-upload .slidetoggle{border-top-color:#ddd}#media-upload input[type=radio]{padding:0}.media-upload-form label.form-help,td.help{color:#72777c}form{margin:1em}#search-filter{text-align:left}th{position:relative}.media-upload-form label.form-help,td.help{font-family:sans-serif;font-style:italic;font-weight:400}.media-upload-form p.help{margin:0;padding:0}.media-upload-form fieldset{width:100%;border:none;text-align:justify;margin:0 0 1em 0;padding:0}.image-align-none-label{background:url(../images/align-none.png) no-repeat center left}.image-align-left-label{background:url(../images/align-left.png) no-repeat center left}.image-align-center-label{background:url(../images/align-center.png) no-repeat center left}.image-align-right-label{background:url(../images/align-right.png) no-repeat center left}tr.image-size td{width:460px}tr.image-size div.image-size-item{margin:0 0 5px}#gallery-form .progress,#library-form .progress,.describe.startclosed,.describe.startopen,.insert-gallery{display:none}.media-item .thumbnail{max-width:128px;max-height:128px}thead.media-item-info tr{background-color:transparent}.form-table thead.media-item-info{border:8px solid #fff}abbr.required,span.required{text-decoration:none;border:none}.describe label{display:inline}.describe td.error{padding:2px 8px}.describe td.A1{width:132px}.describe input[type=text],.describe textarea{width:460px;border-width:1px;border-style:solid}#media-upload p.ml-submit{padding:1em 0}#media-upload label.help,#media-upload p.help{font-family:sans-serif;font-style:italic;font-weight:400}#media-upload .ui-sortable .media-item{cursor:move}#media-upload tr.image-size{margin-bottom:1em;height:3em}#media-upload #filter{width:623px}#media-upload #filter .subsubsub{margin:8px 0}#media-upload .tablenav-pages .current,#media-upload .tablenav-pages a{display:inline-block;padding:4px 5px 6px;font-size:16px;line-height:1;text-align:center;text-decoration:none}#media-upload .tablenav-pages a{min-width:17px;border:1px solid #ccc;background:#f7f7f7}#filter .tablenav select{border-style:solid;border-width:1px;padding:2px;vertical-align:top;width:auto}#media-upload .del-attachment{display:none;margin:5px 0}.menu_order{float:left;font-size:11px;margin:8px 10px 0}.menu_order_input{border:1px solid #ddd;font-size:10px;padding:1px;width:23px}.ui-sortable-helper{background-color:#fff;border:1px solid #a0a5aa;opacity:.6;filter:alpha(opacity=60)}#media-upload th.order-head{width:20%;text-align:center}#media-upload th.actions-head{width:25%;text-align:center}#media-upload a.wp-post-thumbnail{margin:0 20px}#media-upload .widefat{border-style:solid solid none}.sorthelper{height:37px;width:623px;display:block}#gallery-settings th.label{width:160px}#gallery-settings #basic th.label{padding:5px 0 5px 5px}#gallery-settings .title{clear:both;padding:0 0 3px;font-size:1.6em;border-bottom:1px solid #ddd}h3.media-title{font-size:1.6em}h4.media-sub-title{border-bottom:1px solid #ddd;font-size:1.3em;margin:12px;padding:0 0 3px}#gallery-settings .title,h3.media-title,h4.media-sub-title{font-family:Georgia,"Times New Roman",Times,serif;font-weight:400;color:#5a5a5a}#gallery-settings .describe td{vertical-align:middle;height:3em}#gallery-settings .describe th.label{padding-top:.5em;text-align:right}#gallery-settings .describe{padding:5px;width:100%;clear:both;cursor:default;background:#fff}#gallery-settings .describe select{width:15em}#gallery-settings .describe select option,#gallery-settings .describe td{padding:0}#gallery-settings label,#gallery-settings legend{font-size:13px;color:#444;margin-left:15px}#gallery-settings .align .field label{margin:0 3px 0 1em}#gallery-settings p.ml-submit{border-top:1px solid #ddd}#gallery-settings select#columns{width:6em}#sort-buttons{font-size:.8em;margin:3px 0 -8px 25px;text-align:left;max-width:625px}#sort-buttons a{text-decoration:none}#sort-buttons #asc,#sort-buttons #showall{padding-right:5px}#sort-buttons span{margin-left:25px}p.media-types{margin:0;padding:1em}p.media-types-required-info{padding-top:0}tr.not-image{display:none}table.not-image tr.not-image{display:table-row}table.not-image tr.image-only{display:none}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.image-align-none-label{background-image:url(../images/align-none-2x.png?ver=20120916);background-size:21px 15px}.image-align-left-label{background-image:url(../images/align-left-2x.png?ver=20120916);background-size:22px 15px}.image-align-center-label{background-image:url(../images/align-center-2x.png?ver=20120916);background-size:21px 15px}.image-align-right-label{background-image:url(../images/align-right-2x.png?ver=20120916);background-size:22px 15px}} \ No newline at end of file diff --git a/wp-admin/css/deprecated-media.css b/wp-admin/css/deprecated-media.css new file mode 100644 index 0000000..22d7a9f --- /dev/null +++ b/wp-admin/css/deprecated-media.css @@ -0,0 +1,429 @@ +/* Styles for the media library iframe (not used on the Library screen) */ + +div#media-upload-header { + margin: 0; + padding: 5px 5px 0; + font-weight: 600; + position: relative; + border-bottom: 1px solid #ddd; + background: #f9f9f9; +} + +#sidemenu { + overflow: hidden; + float: none; + position: relative; + left: 0; + bottom: -1px; + margin: 0 5px; + padding-left: 10px; + list-style: none; + font-size: 12px; + font-weight: 400; +} + +#sidemenu a { + padding: 0 7px; + display: block; + float: left; + line-height: 28px; + border-top: 1px solid #f9f9f9; + border-bottom: 1px solid #ddd; + background-color: #f9f9f9; + text-decoration: none; + transition: none; +} + +#sidemenu li { + display: inline; + line-height: 200%; + list-style: none; + text-align: center; + white-space: nowrap; + margin: 0; + padding: 0; +} + +#sidemenu a.current { + font-weight: 400; + padding-left: 6px; + padding-right: 6px; + border: 1px solid #ddd; + border-bottom-color: #f1f1f1; + background-color: #f1f1f1; + color: #000; +} + +#media-upload:after { /* clearfix */ + content: ""; + display: table; + clear: both; +} + +#media-upload .slidetoggle { + border-top-color: #ddd; +} + +#media-upload input[type="radio"] { + padding: 0; +} + +.media-upload-form label.form-help, +td.help { + color: #72777c; +} + +form { + margin: 1em; +} + +#search-filter { + text-align: right; +} + +th { + position: relative; +} + +.media-upload-form label.form-help, td.help { + font-family: sans-serif; + font-style: italic; + font-weight: 400; +} + +.media-upload-form p.help { + margin: 0; + padding: 0; +} + +.media-upload-form fieldset { + width: 100%; + border: none; + text-align: justify; + margin: 0 0 1em 0; + padding: 0; +} + +/* specific to the image upload form */ + +.image-align-none-label { + background: url(../images/align-none.png) no-repeat center left; +} + +.image-align-left-label { + background: url(../images/align-left.png) no-repeat center left; +} + +.image-align-center-label { + background: url(../images/align-center.png) no-repeat center left; +} + +.image-align-right-label { + background: url(../images/align-right.png) no-repeat center left; +} + +tr.image-size td { + width: 460px; +} + +tr.image-size div.image-size-item { + margin: 0 0 5px; +} + +#library-form .progress, +#gallery-form .progress, +.insert-gallery, +.describe.startopen, +.describe.startclosed { + display: none; +} + +.media-item .thumbnail { + max-width: 128px; + max-height: 128px; +} + +thead.media-item-info tr { + background-color: transparent; +} + +.form-table thead.media-item-info { + border: 8px solid #fff; +} + +abbr.required, +span.required { + text-decoration: none; + border: none; +} + +.describe label { + display: inline; +} + +.describe td.error { + padding: 2px 8px; +} + +.describe td.A1 { + width: 132px; +} + +.describe input[type="text"], +.describe textarea { + width: 460px; + border-width: 1px; + border-style: solid; +} + +/* Specific to Uploader */ + +#media-upload p.ml-submit { + padding: 1em 0; +} + +#media-upload p.help, +#media-upload label.help { + font-family: sans-serif; + font-style: italic; + font-weight: 400; +} + +#media-upload .ui-sortable .media-item { + cursor: move; +} + +#media-upload tr.image-size { + margin-bottom: 1em; + height: 3em; +} + +#media-upload #filter { + width: 623px; +} + +#media-upload #filter .subsubsub { + margin: 8px 0; +} + +#media-upload .tablenav-pages a, +#media-upload .tablenav-pages .current { + display: inline-block; + padding: 4px 5px 6px; + font-size: 16px; + line-height: 1; + text-align: center; + text-decoration: none; +} + +#media-upload .tablenav-pages a { + min-width: 17px; + border: 1px solid #ccc; + background: #f7f7f7; +} + +#filter .tablenav select { + border-style: solid; + border-width: 1px; + padding: 2px; + vertical-align: top; + width: auto; +} + +#media-upload .del-attachment { + display: none; + margin: 5px 0; +} + +.menu_order { + float: right; + font-size: 11px; + margin: 8px 10px 0; +} + +.menu_order_input { + border: 1px solid #ddd; + font-size: 10px; + padding: 1px; + width: 23px; +} + +.ui-sortable-helper { + background-color: #fff; + border: 1px solid #a0a5aa; + opacity: 0.6; + filter: alpha(opacity=60); +} + +#media-upload th.order-head { + width: 20%; + text-align: center; +} + +#media-upload th.actions-head { + width: 25%; + text-align: center; +} + +#media-upload a.wp-post-thumbnail { + margin: 0 20px; +} + +#media-upload .widefat { + border-style: solid solid none; +} + +.sorthelper { + height: 37px; + width: 623px; + display: block; +} + +#gallery-settings th.label { + width: 160px; +} + +#gallery-settings #basic th.label { + padding: 5px 5px 5px 0; +} + +#gallery-settings .title { + clear: both; + padding: 0 0 3px; + font-size: 1.6em; + border-bottom: 1px solid #ddd; +} + +h3.media-title { + font-size: 1.6em; +} + +h4.media-sub-title { + border-bottom: 1px solid #ddd; + font-size: 1.3em; + margin: 12px; + padding: 0 0 3px; +} + +#gallery-settings .title, +h3.media-title, +h4.media-sub-title { + font-family: Georgia,"Times New Roman",Times,serif; + font-weight: 400; + color: #5A5A5A; +} + +#gallery-settings .describe td { + vertical-align: middle; + height: 3em; +} + +#gallery-settings .describe th.label { + padding-top: .5em; + text-align: left; +} + +#gallery-settings .describe { + padding: 5px; + width: 100%; + clear: both; + cursor: default; + background: #fff; +} + +#gallery-settings .describe select { + width: 15em; +} + +#gallery-settings .describe select option, +#gallery-settings .describe td { + padding: 0; +} + +#gallery-settings label, +#gallery-settings legend { + font-size: 13px; + color: #444; + margin-right: 15px; +} + +#gallery-settings .align .field label { + margin: 0 1em 0 3px; +} + +#gallery-settings p.ml-submit { + border-top: 1px solid #ddd; +} + +#gallery-settings select#columns { + width: 6em; +} + +#sort-buttons { + font-size: 0.8em; + margin: 3px 25px -8px 0; + text-align: right; + max-width: 625px; +} + +#sort-buttons a { + text-decoration: none; +} + +#sort-buttons #asc, +#sort-buttons #showall { + padding-left: 5px; +} + +#sort-buttons span { + margin-right: 25px; +} + +p.media-types { + margin: 0; + padding: 1em; +} + +p.media-types-required-info { + padding-top: 0; +} + +tr.not-image { + display: none; +} + +table.not-image tr.not-image { + display: table-row; +} + +table.not-image tr.image-only { + display: none; +} + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + .image-align-none-label { + background-image: url(../images/align-none-2x.png?ver=20120916); + background-size: 21px 15px; + } + + .image-align-left-label { + background-image: url(../images/align-left-2x.png?ver=20120916); + background-size: 22px 15px; + } + + .image-align-center-label { + background-image: url(../images/align-center-2x.png?ver=20120916); + background-size: 21px 15px; + } + + .image-align-right-label { + background-image: url(../images/align-right-2x.png?ver=20120916); + background-size: 22px 15px; + } +} diff --git a/wp-admin/css/deprecated-media.min.css b/wp-admin/css/deprecated-media.min.css new file mode 100644 index 0000000..adec832 --- /dev/null +++ b/wp-admin/css/deprecated-media.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +div#media-upload-header{margin:0;padding:5px 5px 0;font-weight:600;position:relative;border-bottom:1px solid #ddd;background:#f9f9f9}#sidemenu{overflow:hidden;float:none;position:relative;left:0;bottom:-1px;margin:0 5px;padding-left:10px;list-style:none;font-size:12px;font-weight:400}#sidemenu a{padding:0 7px;display:block;float:left;line-height:28px;border-top:1px solid #f9f9f9;border-bottom:1px solid #ddd;background-color:#f9f9f9;text-decoration:none;transition:none}#sidemenu li{display:inline;line-height:200%;list-style:none;text-align:center;white-space:nowrap;margin:0;padding:0}#sidemenu a.current{font-weight:400;padding-left:6px;padding-right:6px;border:1px solid #ddd;border-bottom-color:#f1f1f1;background-color:#f1f1f1;color:#000}#media-upload:after{content:"";display:table;clear:both}#media-upload .slidetoggle{border-top-color:#ddd}#media-upload input[type=radio]{padding:0}.media-upload-form label.form-help,td.help{color:#72777c}form{margin:1em}#search-filter{text-align:right}th{position:relative}.media-upload-form label.form-help,td.help{font-family:sans-serif;font-style:italic;font-weight:400}.media-upload-form p.help{margin:0;padding:0}.media-upload-form fieldset{width:100%;border:none;text-align:justify;margin:0 0 1em 0;padding:0}.image-align-none-label{background:url(../images/align-none.png) no-repeat center left}.image-align-left-label{background:url(../images/align-left.png) no-repeat center left}.image-align-center-label{background:url(../images/align-center.png) no-repeat center left}.image-align-right-label{background:url(../images/align-right.png) no-repeat center left}tr.image-size td{width:460px}tr.image-size div.image-size-item{margin:0 0 5px}#gallery-form .progress,#library-form .progress,.describe.startclosed,.describe.startopen,.insert-gallery{display:none}.media-item .thumbnail{max-width:128px;max-height:128px}thead.media-item-info tr{background-color:transparent}.form-table thead.media-item-info{border:8px solid #fff}abbr.required,span.required{text-decoration:none;border:none}.describe label{display:inline}.describe td.error{padding:2px 8px}.describe td.A1{width:132px}.describe input[type=text],.describe textarea{width:460px;border-width:1px;border-style:solid}#media-upload p.ml-submit{padding:1em 0}#media-upload label.help,#media-upload p.help{font-family:sans-serif;font-style:italic;font-weight:400}#media-upload .ui-sortable .media-item{cursor:move}#media-upload tr.image-size{margin-bottom:1em;height:3em}#media-upload #filter{width:623px}#media-upload #filter .subsubsub{margin:8px 0}#media-upload .tablenav-pages .current,#media-upload .tablenav-pages a{display:inline-block;padding:4px 5px 6px;font-size:16px;line-height:1;text-align:center;text-decoration:none}#media-upload .tablenav-pages a{min-width:17px;border:1px solid #ccc;background:#f7f7f7}#filter .tablenav select{border-style:solid;border-width:1px;padding:2px;vertical-align:top;width:auto}#media-upload .del-attachment{display:none;margin:5px 0}.menu_order{float:right;font-size:11px;margin:8px 10px 0}.menu_order_input{border:1px solid #ddd;font-size:10px;padding:1px;width:23px}.ui-sortable-helper{background-color:#fff;border:1px solid #a0a5aa;opacity:.6;filter:alpha(opacity=60)}#media-upload th.order-head{width:20%;text-align:center}#media-upload th.actions-head{width:25%;text-align:center}#media-upload a.wp-post-thumbnail{margin:0 20px}#media-upload .widefat{border-style:solid solid none}.sorthelper{height:37px;width:623px;display:block}#gallery-settings th.label{width:160px}#gallery-settings #basic th.label{padding:5px 5px 5px 0}#gallery-settings .title{clear:both;padding:0 0 3px;font-size:1.6em;border-bottom:1px solid #ddd}h3.media-title{font-size:1.6em}h4.media-sub-title{border-bottom:1px solid #ddd;font-size:1.3em;margin:12px;padding:0 0 3px}#gallery-settings .title,h3.media-title,h4.media-sub-title{font-family:Georgia,"Times New Roman",Times,serif;font-weight:400;color:#5a5a5a}#gallery-settings .describe td{vertical-align:middle;height:3em}#gallery-settings .describe th.label{padding-top:.5em;text-align:left}#gallery-settings .describe{padding:5px;width:100%;clear:both;cursor:default;background:#fff}#gallery-settings .describe select{width:15em}#gallery-settings .describe select option,#gallery-settings .describe td{padding:0}#gallery-settings label,#gallery-settings legend{font-size:13px;color:#444;margin-right:15px}#gallery-settings .align .field label{margin:0 1em 0 3px}#gallery-settings p.ml-submit{border-top:1px solid #ddd}#gallery-settings select#columns{width:6em}#sort-buttons{font-size:.8em;margin:3px 25px -8px 0;text-align:right;max-width:625px}#sort-buttons a{text-decoration:none}#sort-buttons #asc,#sort-buttons #showall{padding-left:5px}#sort-buttons span{margin-right:25px}p.media-types{margin:0;padding:1em}p.media-types-required-info{padding-top:0}tr.not-image{display:none}table.not-image tr.not-image{display:table-row}table.not-image tr.image-only{display:none}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.image-align-none-label{background-image:url(../images/align-none-2x.png?ver=20120916);background-size:21px 15px}.image-align-left-label{background-image:url(../images/align-left-2x.png?ver=20120916);background-size:22px 15px}.image-align-center-label{background-image:url(../images/align-center-2x.png?ver=20120916);background-size:21px 15px}.image-align-right-label{background-image:url(../images/align-right-2x.png?ver=20120916);background-size:22px 15px}} \ No newline at end of file diff --git a/wp-admin/css/edit-rtl.css b/wp-admin/css/edit-rtl.css new file mode 100644 index 0000000..9158954 --- /dev/null +++ b/wp-admin/css/edit-rtl.css @@ -0,0 +1,1759 @@ +/*! This file is auto-generated */ +#poststuff { + padding-top: 10px; + min-width: 763px; +} + +#poststuff #post-body { + padding: 0; +} + +#poststuff .postbox-container { + width: 100%; +} + +#poststuff #post-body.columns-2 { + margin-left: 300px; +} + +/*------------------------------------------------------------------------------ + 11.0 - Write/Edit Post Screen +------------------------------------------------------------------------------*/ + +#show-comments { + overflow: hidden; +} + +#save-action .spinner, +#show-comments a { + float: right; +} + +#show-comments .spinner { + float: none; + margin-top: 0; +} + +#lost-connection-notice .spinner { + visibility: visible; + float: right; + margin: 0 0 0 5px; +} + +#titlediv { + position: relative; +} + +#titlediv label { + cursor: text; +} + +#titlediv div.inside { + margin: 0; +} + +#poststuff #titlewrap { + border: 0; + padding: 0; +} + +#titlediv #title { + padding: 3px 8px; + font-size: 1.7em; + line-height: 100%; + height: 1.7em; + width: 100%; + outline: none; + margin: 0 0 3px; + background-color: #fff; +} + +#titlediv #title-prompt-text { + color: #72777c; + position: absolute; + font-size: 1.7em; + padding: 10px; + pointer-events: none; +} + +input#link_description, +input#link_url { + width: 98%; +} + +#pending { + background: 100% none; + border: 0 none; + padding: 0; + font-size: 11px; + margin-top: -1px; +} + +#edit-slug-box, +#comment-link-box { + line-height: 1.84615384; + min-height: 25px; + margin-top: 5px; + padding: 0 10px; + color: #666; +} + +#edit-slug-box .cancel { + margin-left: 10px; + padding: 0; + font-size: 11px; +} + +#comment-link-box { + margin: 5px 0; + padding: 0 5px; +} + +#editable-post-name-full { + display: none; +} + +#editable-post-name { + font-weight: 600; +} + +#editable-post-name input { + font-size: 13px; + font-weight: 400; + height: 24px; + margin: 0; + width: 16em; +} + +.postarea h3 label { + float: right; +} + +body.post-new-php .submitbox .submitdelete { + display: none; +} + +.submitbox .submit a:hover { + text-decoration: underline; +} + +.submitbox .submit input { + margin-bottom: 8px; + margin-left: 4px; + padding: 6px; +} + +#post-status-select { + margin-top: 3px; +} + +/* Post Screen */ +#post-body #normal-sortables { + min-height: 50px; +} + +.postbox { + position: relative; + min-width: 255px; + border: 1px solid #ccd0d4; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + background: #fff; +} + +#trackback_url { + width: 99%; +} + +#normal-sortables .postbox .submit { + background: transparent none; + border: 0 none; + float: left; + padding: 0 12px; + margin: 0; +} + +.category-add input[type="text"], +.category-add select { + width: 100%; + max-width: 260px; + vertical-align: baseline; +} + +#side-sortables .category-add input[type="text"], +#side-sortables .category-add select { + margin: 0 0 1em; +} + +ul.category-tabs li, +#side-sortables .add-menu-item-tabs li, +.wp-tab-bar li { + display: inline; + line-height: 1.35; +} + +.no-js .category-tabs li.hide-if-no-js { + display: none; +} + +.category-tabs a, +#side-sortables .add-menu-item-tabs a, +.wp-tab-bar a { + text-decoration: none; +} + +/* @todo: do these really need to be so specific? */ +#side-sortables .category-tabs .tabs a, +#side-sortables .add-menu-item-tabs .tabs a, +.wp-tab-bar .wp-tab-active a, +#post-body ul.category-tabs li.tabs a, +#post-body ul.add-menu-item-tabs li.tabs a { + color: #32373c; +} + +.category-tabs { + margin: 8px 0 5px; +} + +/* Back-compat for pre-4.4 */ +#category-adder h4 { + margin: 0; +} + +.taxonomy-add-new { + display: inline-block; + margin: 10px 0; + font-weight: 600; +} + +#side-sortables .add-menu-item-tabs, +.wp-tab-bar { + margin-bottom: 3px; +} + +#normal-sortables .postbox #replyrow .submit { + float: none; + margin: 0; + padding: 5px 7px 10px; + overflow: hidden; +} + +#side-sortables .submitbox .submit input, +#side-sortables .submitbox .submit .preview, +#side-sortables .submitbox .submit a.preview:hover { + border: 0 none; +} + +/* @todo: make this a more generic class */ +ul.category-tabs, +ul.add-menu-item-tabs, +ul.wp-tab-bar { + margin-top: 12px; +} + +ul.category-tabs li, +ul.add-menu-item-tabs li { + border: solid 1px transparent; + position: relative; +} + +ul.category-tabs li.tabs, +ul.add-menu-item-tabs li.tabs, +.wp-tab-active { + border: 1px solid #ddd; + border-bottom-color: #fdfdfd; + background-color: #fdfdfd; +} + +ul.category-tabs li, +ul.add-menu-item-tabs li, +ul.wp-tab-bar li { + padding: 3px 5px 6px; +} + +#set-post-thumbnail { + display: inline-block; + max-width: 100%; +} + +#postimagediv .inside img { + max-width: 100%; + height: auto; + width: auto; + vertical-align: top; + background-image: linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4); + background-position: 100% 0, 10px 10px; + background-size: 20px 20px; +} + +form#tags-filter { + position: relative; +} + +/* Global classes */ +.wp-hidden-children .wp-hidden-child, +.ui-tabs-hide { + display: none; +} + +#post-body .tagsdiv #newtag { + margin-left: 5px; + width: 16em; +} + +#side-sortables input#post_password { + width: 94% +} + +#side-sortables .tagsdiv #newtag { + width: 68%; +} + +#post-status-info { + width: 100%; + border-spacing: 0; + border: 1px solid #ccd0d4; + border-top: none; + background-color: #f7f7f7; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + z-index: 999; +} + +#post-status-info td { + font-size: 12px; +} + +.autosave-info { + padding: 2px 10px; + text-align: left; +} + +#editorcontent #post-status-info { + border: none; +} + +#content-resize-handle { + background: transparent url(../images/resize.gif) no-repeat scroll left bottom; + width: 12px; + cursor: row-resize; +} + +/*rtl:ignore*/ +.rtl #content-resize-handle { + background-image: url(../images/resize-rtl.gif); + background-position: left bottom; +} + +.wp-editor-expand #content-resize-handle { + display: none; +} + +#postdivrich #content { + resize: none; +} + +#wp-word-count { + display: block; + padding: 2px 10px; +} + +#wp-content-editor-container { + position: relative; +} + +.wp-editor-expand #wp-content-editor-tools { + z-index: 1000; + border-bottom: 1px solid #ccd0d4; +} + +.wp-editor-expand #wp-content-editor-container { + box-shadow: none; + margin-top: -1px; +} + +.wp-editor-expand #wp-content-editor-container { + border-bottom: 0 none; +} + +.wp-editor-expand div.mce-statusbar { + z-index: 1; +} + +.wp-editor-expand #post-status-info { + border-top: 1px solid #ccd0d4; +} + +.wp-editor-expand div.mce-toolbar-grp { + z-index: 999; +} + +/* TinyMCE native fullscreen mode override */ +.mce-fullscreen #wp-content-wrap .mce-menubar, +.mce-fullscreen #wp-content-wrap .mce-toolbar-grp, +.mce-fullscreen #wp-content-wrap .mce-edit-area, +.mce-fullscreen #wp-content-wrap .mce-statusbar { + position: static !important; + width: auto !important; + padding: 0 !important; +} + +.mce-fullscreen #wp-content-wrap .mce-statusbar { + visibility: visible !important; +} + +.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw { + display: none; +} + +.post-php.mce-fullscreen #wpadminbar, +.mce-fullscreen #wp-content-wrap .mce-wp-dfw { + display: none; +} +/* End TinyMCE native fullscreen mode override */ + +#wp-content-editor-tools { + background-color: #f1f1f1; + padding-top: 20px; +} + +#poststuff #post-body.columns-2 #side-sortables { + width: 280px; +} + +#timestampdiv select { + vertical-align: top; + font-size: 12px; + line-height: 2.33333333; /* 28px */ +} + +#aa, #jj, #hh, #mn { + padding: 6px 1px; + font-size: 12px; + line-height: 1.16666666; /* 14px */ +} + +#jj, #hh, #mn { + width: 2em; +} + +#aa { + width: 3.4em; +} + +.curtime #timestamp { + padding: 2px 0 1px 0; + display: inline !important; + height: auto !important; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +#post-body .misc-pub-response-to:before, +#post-body .misc-pub-comment-status:before { + color: #82878c; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +#post-body .misc-pub-response-to:before, +#post-body .misc-pub-comment-status:before { + font: normal 20px/1 dashicons; + speak: none; + display: inline-block; + margin-right: -1px; + padding-left: 3px; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#post-body .misc-pub-post-status:before, +#post-body .misc-pub-comment-status:before { + content: "\f173"; +} + +#post-body #visibility:before { + content: "\f177"; +} + +.curtime #timestamp:before { + content: "\f145"; + position: relative; + top: -1px; +} + +#post-body .misc-pub-revisions:before { + content: "\f321"; +} + +#post-body .misc-pub-response-to:before { + content: "\f101"; +} + +#timestampdiv { + padding-top: 5px; + line-height: 1.76923076; +} + +#timestampdiv p { + margin: 8px 0 6px; +} + +#timestampdiv input { + text-align: center; +} + +.notification-dialog { + position: fixed; + top: 30%; + max-height: 70%; + right: 50%; + width: 450px; + margin-right: -225px; + background: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + line-height: 1.5; + z-index: 1000005; + overflow-y: auto; +} + +.notification-dialog-background { + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 1000000; +} + +#post-lock-dialog .post-locked-message, +#post-lock-dialog .post-taken-over { + margin: 25px; +} + +#post-lock-dialog .post-locked-message a.button, +#file-editor-warning .button { + margin-left: 10px; +} + +#post-lock-dialog .post-locked-avatar { + float: right; + margin: 0 0 20px 20px; +} + +#post-lock-dialog .wp-tab-first { + outline: 0; +} + +#post-lock-dialog .locked-saving img { + float: right; + margin-left: 3px; +} + +#post-lock-dialog.saving .locked-saving, +#post-lock-dialog.saved .locked-saved { + display: inline; +} + +#excerpt { + display: block; + margin: 12px 0 0; + height: 4em; + width: 100%; +} + +.tagchecklist { + margin-right: 14px; + font-size: 12px; + overflow: auto; +} + +.tagchecklist br { + display: none; +} + +.tagchecklist strong { + margin-right: -8px; + position: absolute; +} + +.tagchecklist > li { + float: right; + margin-left: 25px; + font-size: 13px; + line-height: 1.8; + cursor: default; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; +} + +.tagchecklist .ntdelbutton { + position: absolute; + width: 24px; + height: 24px; + border: none; + margin: 0 -19px 0 0; + padding: 0; + background: none; + cursor: pointer; + text-indent: 0; +} + +#poststuff h3.hndle, /* Back-compat for pre-4.4 */ +#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */ +#poststuff h2 { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +#poststuff .stuffbox h2 { + padding: 8px 10px; +} + +#poststuff .stuffbox > h2 { + border-bottom: 1px solid #eee; +} + +#poststuff .inside { + margin: 6px 0 0 0; +} + +#poststuff .stuffbox .inside { + margin: 0; +} + +#poststuff .inside #parent_id, +#poststuff .inside #page_template { + max-width: 100%; +} + +.ie8 #poststuff .inside #parent_id, +.ie8 #poststuff .inside #page_template { + width: 250px; +} + +.post-attributes-label-wrapper { + margin-bottom: 0.5em; +} + +.post-attributes-label { + vertical-align: baseline; + font-weight: 600; +} + +#post-visibility-select, +#comment-status-radio { + line-height: 1.5; + margin-top: 3px; +} + +#linksubmitdiv .inside, /* Old Link Manager back-compat. */ +#poststuff #submitdiv .inside { + margin: 0; + padding: 0; +} + +#post-body-content, +.edit-form-section { + margin-bottom: 20px; +} + +.wp_attachment_details .attachment-content-description { + margin-top: 0.5385em; + display: inline-block; + min-height: 1.6923em; +} + +/* Suggested text for privacy policy */ +.wp-privacy-policy-guide { + max-width: 1000px; +} + +.privacy-text-box { + width: calc(100% - 260px); +} + +.privacy-text-box-toc { + float: left; + width: 250px; + background-color: #fff; +} + +.privacy-text-box-toc p { + margin: 0; + padding: 0.7em 1em; + border-bottom: 1px solid #eee; +} + +.privacy-text-box-toc ol { + margin-right: 2em; +} + +.wp-privacy-policy-guide h3 { + font-size: 1.2em; + margin: 1em 0 0.5em; +} + +.privacy-text-section .privacy-text-copy { + float: left; +} + +.privacy-text-section { + position: relative; + border-top: 1px solid #e3e3e3; +} + +.privacy-text-box-head, +.privacy-text-section.text-removed { + padding-bottom: 12px; +} + +.text-removed .policy-text { + font-style: italic; + color: #666; + font-weight: 600; +} + +.privacy-text-actions { + height: 32px; + line-height: 2.46153846; + padding-bottom: 6px; +} + +.wp-privacy-policy-guide .policy-text h2 { + margin: 1.2em 0 1em; + padding: 0; +} + +.suggested-policy-content { + font-style: italic; +} + +.privacy-text-section a.return-to-top { + float: left; + margin-left: -250px; + margin-top: 6px; +} + +.hide-privacy-policy-tutorial { + background-color: #fff; +} + +.hide-privacy-policy-tutorial .wp-policy-help, /* For back-compat, see #49282 */ +.hide-privacy-policy-tutorial .privacy-policy-tutorial { + display: none; +} + +.policy-text { + margin-bottom: 1em; +} + +.policy-text > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help), +.policy-text div > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) { + background-color: #fff; + margin: 0; + padding: 1em; +} + +.policy-text > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) + *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help), +.policy-text div > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) + *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) { + padding-top: 0; +} + +.hide-privacy-policy-tutorial > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) { + margin: 1em 0; + padding: 0; +} + +.policy-text ul li, +.policy-text ol li { + margin-right: 2em; +} + +.policy-text ul { + list-style: disc; +} + +strong.wp-policy-help, /* For back-compat, see #49282 */ +strong.privacy-policy-tutorial { + display: block; + margin: 0 0 1em; +} + +.notice.wp-pp-notice { + margin: 15px 0 3px; +} + +/*------------------------------------------------------------------------------ + 11.1 - Custom Fields +------------------------------------------------------------------------------*/ + +#postcustomstuff thead th { + padding: 5px 8px 8px; + background-color: #f1f1f1; +} + +#postcustom #postcustomstuff .submit { + border: 0 none; + float: none; + padding: 0 8px 8px; +} + +#side-sortables #postcustom #postcustomstuff .submit { + margin: 0; + padding: 0; +} + +#side-sortables #postcustom #postcustomstuff #the-list textarea { + height: 85px; +} + +#side-sortables #postcustom #postcustomstuff td.left input, +#side-sortables #postcustom #postcustomstuff td.left select, +#side-sortables #postcustomstuff #newmetaleft a { + margin: 3px 3px 0; +} + +#postcustomstuff table { + margin: 0; + width: 100%; + border: 1px solid #ddd; + border-spacing: 0; + background-color: #f9f9f9; +} + +#postcustomstuff tr { + vertical-align: top; +} + +#postcustomstuff table input, +#postcustomstuff table select, +#postcustomstuff table textarea { + width: 96%; + margin: 8px; +} + +#side-sortables #postcustomstuff table input, +#side-sortables #postcustomstuff table select, +#side-sortables #postcustomstuff table textarea { + margin: 3px; +} + +#postcustomstuff th.left, +#postcustomstuff td.left { + width: 38%; +} + +#postcustomstuff .submit input { + margin: 0; + width: auto; +} + +#postcustomstuff #newmetaleft a { + display: inline-block; + margin: 0 8px 8px; + text-decoration: none; +} + +.no-js #postcustomstuff #enternew { + display: none; +} + +#post-body-content .compat-attachment-fields { + margin-bottom: 20px; +} + +.compat-attachment-fields th { + padding-top: 5px; + padding-left: 10px; +} + +/*------------------------------------------------------------------------------ + 11.3 - Featured Images +------------------------------------------------------------------------------*/ + +#select-featured-image { + padding: 4px 0; + overflow: hidden; +} + +#select-featured-image img { + max-width: 100%; + height: auto; + margin-bottom: 10px; +} + +#select-featured-image a { + float: right; + clear: both; +} + +#select-featured-image .remove { + display: none; + margin-top: 10px; +} + +.js #select-featured-image.has-featured-image .remove { + display: inline-block; +} + +.no-js #select-featured-image .choose { + display: none; +} + +/*------------------------------------------------------------------------------ + 11.4 - Post formats +------------------------------------------------------------------------------*/ + +.post-format-icon::before { + display: inline-block; + vertical-align: middle; + height: 20px; + width: 20px; + margin-top: -4px; + margin-left: 7px; + color: #ddd; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a.post-format-icon:hover:before { + color: #00a0d2; +} + +#post-formats-select { + line-height: 2; +} + +#post-formats-select .post-format-icon::before { + top: 5px; +} + +input.post-format { + margin-top: 1px; +} + +label.post-format-icon { + margin-right: 0; + padding: 2px 0; +} + +.post-format-icon.post-format-standard::before { + content: "\f109"; +} + +.post-format-icon.post-format-image::before { + content: "\f128"; +} + +.post-format-icon.post-format-gallery::before { + content: "\f161"; +} + +.post-format-icon.post-format-audio::before { + content: "\f127"; +} + +.post-format-icon.post-format-video::before { + content: "\f126"; +} + +.post-format-icon.post-format-chat::before { + content: "\f125"; +} + +.post-format-icon.post-format-status::before { + content: "\f130"; +} + +.post-format-icon.post-format-aside::before { + content: "\f123"; +} + +.post-format-icon.post-format-quote::before { + content: "\f122"; +} + +.post-format-icon.post-format-link::before { + content: "\f103"; +} + +/*------------------------------------------------------------------------------ + 12.0 - Categories +------------------------------------------------------------------------------*/ + +.category-adder { + margin-right: 120px; + padding: 4px 0; +} + +.category-adder h4 { + margin: 0 0 8px; +} + +#side-sortables .category-adder { + margin: 0; +} + +.wp-tab-panel, +.categorydiv div.tabs-panel, +.customlinkdiv div.tabs-panel, +.posttypediv div.tabs-panel, +.taxonomydiv div.tabs-panel { + min-height: 42px; + max-height: 200px; + overflow: auto; + padding: 0 0.9em; + border: solid 1px #ddd; + background-color: #fdfdfd; +} + +div.tabs-panel-active { + display: block; +} + +div.tabs-panel-inactive { + display: none; +} + +div.tabs-panel-active:focus { + box-shadow: inset 0 0 0 1px #5b9dd9, inset 0 0 2px 1px rgba(30, 140, 190, 0.8); + outline: 0 none; +} + +#front-page-warning, +#front-static-pages ul, +ul.export-filters, +.inline-editor ul.cat-checklist ul, +.categorydiv ul.categorychecklist ul, +.customlinkdiv ul.categorychecklist ul, +.posttypediv ul.categorychecklist ul, +.taxonomydiv ul.categorychecklist ul { + margin-right: 18px; +} + +ul.categorychecklist li { + margin: 0; + padding: 0; + line-height: 1.69230769; + word-wrap: break-word; +} + +.categorydiv .tabs-panel, +.customlinkdiv .tabs-panel, +.posttypediv .tabs-panel, +.taxonomydiv .tabs-panel { + border-width: 3px; + border-style: solid; +} + +.form-wrap label { + display: block; + padding: 2px 0; +} + +.form-field input[type="text"], +.form-field input[type="password"], +.form-field input[type="email"], +.form-field input[type="number"], +.form-field input[type="search"], +.form-field input[type="tel"], +.form-field input[type="url"], +.form-field textarea { + border-style: solid; + border-width: 1px; + width: 95%; +} + +.form-field select, +.form-field p { + max-width: 95%; +} + +p.description, +.form-wrap p { + margin: 2px 0 5px; + color: #666; +} + +p.help, +p.description, +span.description, +.form-wrap p { + font-size: 13px; + font-style: italic; +} + +p.description code { + font-style: normal; +} + +.form-wrap .form-field { + margin: 1em 0; + padding: 0; +} + +.col-wrap h2 { + margin: 12px 0; + font-size: 1.1em; +} + +.col-wrap p.submit { + margin-top: -10px; +} + +.edit-term-notes { + margin-top: 2em; +} + +/*------------------------------------------------------------------------------ + 13.0 - Tags +------------------------------------------------------------------------------*/ + +#poststuff .tagsdiv .ajaxtag { + margin-top: 1em; +} + +#poststuff .tagsdiv .howto { + margin: 1em 0 6px 0; +} + +.ajaxtag .newtag { + position: relative; +} + +.tagsdiv .newtag { + width: 180px; +} + +.tagsdiv .the-tags { + display: block; + height: 60px; + margin: 0 auto; + overflow: auto; + width: 260px; +} + +#post-body-content .tagsdiv .the-tags { + margin: 0 5px; +} + +p.popular-tags { + border: none; + line-height: 2em; + padding: 8px 12px 12px; + text-align: justify; +} + +p.popular-tags a { + padding: 0 3px; +} + +.tagcloud { + width: 97%; + margin: 0 0 40px; + text-align: justify; +} + +.tagcloud h2 { + margin: 2px 0 12px; +} + +#poststuff .inside .the-tagcloud { + margin: 5px 0 10px; + padding: 8px; + border: 1px solid #ddd; + line-height: 1.2; + word-spacing: 3px; +} + +.the-tagcloud ul { + margin: 0; +} + +.the-tagcloud ul li { + display: inline-block; +} + +/* Suggest.js autocomplete, no more used by core. */ +.ac_results { + display: none; + margin: -1px 0 0; + padding: 0; + list-style: none; + position: absolute; + z-index: 10000; + border: 1px solid #5b9dd9; + background-color: #fff; +} + +.wp-customizer .ac_results { + z-index: 500000; +} + +.ac_results li { + margin: 0; + padding: 5px 10px; + white-space: nowrap; + text-align: right; +} + +.ac_results .ac_over, +.ac_over .ac_match { + background-color: #0073aa; + color: #fff; + cursor: pointer; +} + +.ac_match { + text-decoration: underline; +} + +#addtag .spinner { + float: none; + vertical-align: top; +} + +#edittag { + max-width: 800px; +} + +.edit-tag-actions { + margin-top: 20px; +} + +/* Comments */ + +.comment-php .wp-editor-area { + height: 200px; +} + +.comment-ays th, +.comment-ays td { + padding: 10px 15px; +} + +.comment-ays .comment-content ul { + list-style: initial; + margin-right: 2em; +} + +.comment-ays .comment-content a[href]:after { + content: "(" attr( href ) ")"; + display: inline-block; + padding: 0 4px; + color: #72777C; + font-size: 13px; + word-break: break-all; +} + +.comment-ays .comment-content p.edit-comment { + margin-top: 10px; +} + +.comment-ays .comment-content p.edit-comment a[href]:after { + content: ""; + padding: 0; +} + +.comment-ays-submit .button-cancel { + margin-right: 1em; +} + +.trash-undo-inside, +.spam-undo-inside { + margin: 1px 0 1px 8px; + line-height: 1.23076923; +} + +.spam-undo-inside .avatar, +.trash-undo-inside .avatar { + height: 20px; + width: 20px; + margin-left: 8px; + vertical-align: middle; +} + +.stuffbox .editcomment { + clear: none; + margin-top: 0; +} + +#namediv.stuffbox .editcomment input { + width: 100%; +} + +#namediv.stuffbox .editcomment.form-table td { + padding: 10px; +} + +#comment-status-radio p { + margin: 3px 0 5px; +} + +#comment-status-radio input { + margin: 2px 0 5px 3px; + vertical-align: middle; +} + +#comment-status-radio label { + padding: 5px 0; +} + +/* links tables */ +table.links-table { + width: 100%; + border-spacing: 0; +} + +.links-table th { + font-weight: 400; + text-align: right; + vertical-align: top; + min-width: 80px; + width: 20%; + word-wrap: break-word; +} + +.links-table th, +.links-table td { + padding: 5px 0; +} + +.links-table td label { + margin-left: 8px; +} + +.links-table td input[type="text"], +.links-table td textarea { + width: 100%; +} + +.links-table #link_rel { + max-width: 280px; +} + +/* DFW 2 +-------------------------------------------------------------- */ + +#qt_content_dfw { + display: none; +} + +.wp-editor-expand #qt_content_dfw { + display: inline-block; +} + +.focus-on .wrap > h1, +.focus-on .page-title-action, +.focus-on #wpfooter, +.focus-on .postbox-container > *, +.focus-on div.updated, +.focus-on div.error, +.focus-on div.notice, +.focus-on .update-nag, +.focus-on #wp-toolbar, +.focus-on #screen-meta-links, +.focus-on #screen-meta { + opacity: 0; + transition-duration: 0.6s; + transition-property: opacity; + transition-timing-function: ease-in-out; +} + +.focus-on #wp-toolbar { + opacity: 0.3; +} + +.focus-off .wrap > h1, +.focus-off .page-title-action, +.focus-off #wpfooter, +.focus-off .postbox-container > *, +.focus-off div.updated, +.focus-off div.error, +.focus-off div.notice, +.focus-off .update-nag, +.focus-off #wp-toolbar, +.focus-off #screen-meta-links, +.focus-off #screen-meta { + opacity: 1; + transition-duration: 0.2s; + transition-property: opacity; + transition-timing-function: ease-in-out; +} + +.focus-off #wp-toolbar { + -webkit-transform: translate(0, 0); +} + +.focus-on #adminmenuback, +.focus-on #adminmenuwrap { + transition-duration: 0.6s; + transition-property: transform; + transition-timing-function: ease-in-out; +} + +.focus-on #adminmenuback, +.focus-on #adminmenuwrap { + transform: translateX( 100% ); +} + +.focus-off #adminmenuback, +.focus-off #adminmenuwrap { + transform: translateX( 0 ); + transition-duration: 0.2s; + transition-property: transform; + transition-timing-function: ease-in-out; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + #content-resize-handle, + #post-body .wp_themeSkin .mceStatusbar a.mceResize { + background: transparent url(../images/resize-2x.gif) no-repeat scroll left bottom; + background-size: 11px 11px; + } + + /*rtl:ignore*/ + .rtl #content-resize-handle, + .rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize { + background-image: url(../images/resize-rtl-2x.gif); + background-position: left bottom; + } +} + +/* one column on the attachment editor screen */ +@media only screen and (max-width: 1200px) { + .post-type-attachment #poststuff { + min-width: 0; + } + + .post-type-attachment #wpbody-content #poststuff #post-body { + margin: 0; + } + + .post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1 { + margin-left: 0; + width: 100%; + } + + .post-type-attachment #poststuff #postbox-container-1 .empty-container, + .post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty { + border: 0 none; + height: 0; + min-height: 0; + } + + .post-type-attachment #poststuff #post-body.columns-2 #side-sortables { + min-height: 0; + width: auto; + } + + /* hide the radio buttons for column prefs */ + .post-type-attachment .screen-layout, + .post-type-attachment .columns-prefs { + display: none; + } +} + +/* one column on the post write/edit screen */ +@media only screen and (max-width: 850px) { + #poststuff { + min-width: 0; + } + + #wpbody-content #poststuff #post-body { + margin: 0; + } + + #wpbody-content #post-body.columns-2 #postbox-container-1 { + margin-left: 0; + width: 100%; + } + + #poststuff #postbox-container-1 .empty-container, + #poststuff #postbox-container-1 #side-sortables:empty { + border: 0 none; + height: 0; + min-height: 0; + } + + #poststuff #post-body.columns-2 #side-sortables { + min-height: 0; + width: auto; + } + + /* hide the radio buttons for column prefs */ + .screen-layout, + .columns-prefs { + display: none; + } +} + +@media screen and (max-width: 782px) { + .wp-core-ui .edit-tag-actions .button-primary { + margin-bottom: 0; + } + + #post-body-content { + min-width: 0; + } + + #titlediv #title-prompt-text { + padding: 10px 10px; + } + + #poststuff .stuffbox .inside { + padding: 0 0 4px 2px; + } + + #poststuff h3.hndle, /* Back-compat for pre-4.4 */ + #poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */ + #poststuff h2 { + padding: 12px; + } + + #namediv.stuffbox .editcomment.form-table td { + padding: 5px 10px; + } + + .post-format-options { + padding-left: 0; + } + + .post-format-options a { + margin-left: 5px; + margin-bottom: 5px; + min-width: 52px; + } + + .post-format-options .post-format-title { + font-size: 11px; + } + + .post-format-options a div { + height: 28px; + width: 28px; + } + + .post-format-options a div:before { + font-size: 26px !important; + } + + /* Publish Metabox Options */ + #post-visibility-select { + line-height: 280%; + } + + .wp-core-ui .save-post-visibility, + .wp-core-ui .save-timestamp { + vertical-align: middle; + margin-left: 15px; + } + + .timestamp-wrap select#mm { + display: block; + width: 100%; + margin-bottom: 10px; + } + + .timestamp-wrap #jj, + .timestamp-wrap #aa, + .timestamp-wrap #hh, + .timestamp-wrap #mn { + padding: 12px 3px; + font-size: 14px; + margin-bottom: 5px; + width: auto; + text-align: center; + } + + /* Categories Metabox */ + ul.category-tabs { + margin: 30px 0 15px; + } + + ul.category-tabs li.tabs { + padding: 15px; + } + + ul.categorychecklist li { + margin-bottom: 15px; + } + + ul.categorychecklist ul { + margin-top: 15px; + } + + .category-add input[type=text], + .category-add select { + max-width: none; + margin-bottom: 15px; + } + + /* Tags Metabox */ + .tagsdiv .newtag { + width: 100%; + height: auto; + margin-bottom: 15px; + } + + .tagchecklist { + margin: 25px 10px; + } + + .tagchecklist > li { + font-size: 16px; + line-height: 1.4; + } + + /* Discussion */ + #commentstatusdiv p { + line-height: 2.8; + } + + /* TinyMCE Adjustments */ + .mceToolbar * { + white-space: normal !important; + } + + .mceToolbar tr, + .mceToolbar td { + float: right !important; + } + + .wp_themeSkin a.mceButton { + width: 30px; + height: 30px; + } + + .wp_themeSkin .mceButton .mceIcon { + margin-top: 5px; + margin-right: 5px; + } + + .wp_themeSkin .mceSplitButton { + margin-top: 1px; + } + + .wp_themeSkin .mceSplitButton td a.mceAction { + padding-top: 6px; + padding-bottom: 6px; + padding-right: 6px; + padding-left: 3px; + } + + .wp_themeSkin .mceSplitButton td a.mceOpen, + .wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen { + padding-top: 6px; + padding-bottom: 6px; + background-position: 1px 6px; + } + + .wp_themeSkin table.mceListBox { + margin: 5px; + } + + div.quicktags-toolbar input { + padding: 10px 20px; + } + + button.wp-switch-editor { + font-size: 16px; + line-height: 1; + margin: 7px 7px 0 0; + padding: 8px 12px; + } + + #wp-content-media-buttons a { + font-size: 14px; + padding: 6px 10px; + } + + .wp-media-buttons span.wp-media-buttons-icon, + .wp-media-buttons span.jetpack-contact-form-icon { + width: 22px !important; + margin-right: -2px !important; + } + + .wp-media-buttons .add_media span.wp-media-buttons-icon:before, + .wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before { + font-size: 20px !important; + } + + #content_wp_fullscreen { + display: none; + } + + .misc-pub-section { + padding: 20px 10px 20px; + } + + .misc-pub-section > a { + float: left; + font-size: 16px; + } + + #delete-action, + #publishing-action { + line-height: 3.61538461; + } + + #publishing-action .spinner { + float: none; + margin-top: -2px; /* Half of the Publish button's bottom margin. */ + } + + /* Moderate Comment */ + .comment-ays th, + .comment-ays td { + padding-bottom: 0; + } + + .comment-ays td { + padding-top: 6px; + } + + /* Links */ + .links-table #link_rel { + max-width: none; + } + + .links-table th, + .links-table td { + padding: 10px 0; + } + + .privacy-text-box { + width: auto; + } + + .privacy-text-box-toc { + float: none; + width: auto; + height: 100%; + } + + .privacy-text-section a.return-to-top { + float: none; + margin: 0; + } +} diff --git a/wp-admin/css/edit-rtl.min.css b/wp-admin/css/edit-rtl.min.css new file mode 100644 index 0000000..ee74046 --- /dev/null +++ b/wp-admin/css/edit-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#poststuff{padding-top:10px;min-width:763px}#poststuff #post-body{padding:0}#poststuff .postbox-container{width:100%}#poststuff #post-body.columns-2{margin-left:300px}#show-comments{overflow:hidden}#save-action .spinner,#show-comments a{float:right}#show-comments .spinner{float:none;margin-top:0}#lost-connection-notice .spinner{visibility:visible;float:right;margin:0 0 0 5px}#titlediv{position:relative}#titlediv label{cursor:text}#titlediv div.inside{margin:0}#poststuff #titlewrap{border:0;padding:0}#titlediv #title{padding:3px 8px;font-size:1.7em;line-height:100%;height:1.7em;width:100%;outline:0;margin:0 0 3px;background-color:#fff}#titlediv #title-prompt-text{color:#72777c;position:absolute;font-size:1.7em;padding:10px;pointer-events:none}input#link_description,input#link_url{width:98%}#pending{background:100% none;border:0 none;padding:0;font-size:11px;margin-top:-1px}#comment-link-box,#edit-slug-box{line-height:1.84615384;min-height:25px;margin-top:5px;padding:0 10px;color:#666}#edit-slug-box .cancel{margin-left:10px;padding:0;font-size:11px}#comment-link-box{margin:5px 0;padding:0 5px}#editable-post-name-full{display:none}#editable-post-name{font-weight:600}#editable-post-name input{font-size:13px;font-weight:400;height:24px;margin:0;width:16em}.postarea h3 label{float:right}body.post-new-php .submitbox .submitdelete{display:none}.submitbox .submit a:hover{text-decoration:underline}.submitbox .submit input{margin-bottom:8px;margin-left:4px;padding:6px}#post-status-select{margin-top:3px}#post-body #normal-sortables{min-height:50px}.postbox{position:relative;min-width:255px;border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff}#trackback_url{width:99%}#normal-sortables .postbox .submit{background:transparent none;border:0 none;float:left;padding:0 12px;margin:0}.category-add input[type=text],.category-add select{width:100%;max-width:260px;vertical-align:baseline}#side-sortables .category-add input[type=text],#side-sortables .category-add select{margin:0 0 1em}#side-sortables .add-menu-item-tabs li,.wp-tab-bar li,ul.category-tabs li{display:inline;line-height:1.35}.no-js .category-tabs li.hide-if-no-js{display:none}#side-sortables .add-menu-item-tabs a,.category-tabs a,.wp-tab-bar a{text-decoration:none}#post-body ul.add-menu-item-tabs li.tabs a,#post-body ul.category-tabs li.tabs a,#side-sortables .add-menu-item-tabs .tabs a,#side-sortables .category-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#32373c}.category-tabs{margin:8px 0 5px}#category-adder h4{margin:0}.taxonomy-add-new{display:inline-block;margin:10px 0;font-weight:600}#side-sortables .add-menu-item-tabs,.wp-tab-bar{margin-bottom:3px}#normal-sortables .postbox #replyrow .submit{float:none;margin:0;padding:5px 7px 10px;overflow:hidden}#side-sortables .submitbox .submit .preview,#side-sortables .submitbox .submit a.preview:hover,#side-sortables .submitbox .submit input{border:0 none}ul.add-menu-item-tabs,ul.category-tabs,ul.wp-tab-bar{margin-top:12px}ul.add-menu-item-tabs li,ul.category-tabs li{border:solid 1px transparent;position:relative}.wp-tab-active,ul.add-menu-item-tabs li.tabs,ul.category-tabs li.tabs{border:1px solid #ddd;border-bottom-color:#fdfdfd;background-color:#fdfdfd}ul.add-menu-item-tabs li,ul.category-tabs li,ul.wp-tab-bar li{padding:3px 5px 6px}#set-post-thumbnail{display:inline-block;max-width:100%}#postimagediv .inside img{max-width:100%;height:auto;width:auto;vertical-align:top;background-image:linear-gradient(-45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4),linear-gradient(-45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4);background-position:100% 0,10px 10px;background-size:20px 20px}form#tags-filter{position:relative}.ui-tabs-hide,.wp-hidden-children .wp-hidden-child{display:none}#post-body .tagsdiv #newtag{margin-left:5px;width:16em}#side-sortables input#post_password{width:94%}#side-sortables .tagsdiv #newtag{width:68%}#post-status-info{width:100%;border-spacing:0;border:1px solid #ccd0d4;border-top:none;background-color:#f7f7f7;box-shadow:0 1px 1px rgba(0,0,0,.04);z-index:999}#post-status-info td{font-size:12px}.autosave-info{padding:2px 10px;text-align:left}#editorcontent #post-status-info{border:none}#content-resize-handle{background:transparent url(../images/resize.gif) no-repeat scroll left bottom;width:12px;cursor:row-resize}.rtl #content-resize-handle{background-image:url(../images/resize-rtl.gif);background-position:left bottom}.wp-editor-expand #content-resize-handle{display:none}#postdivrich #content{resize:none}#wp-word-count{display:block;padding:2px 10px}#wp-content-editor-container{position:relative}.wp-editor-expand #wp-content-editor-tools{z-index:1000;border-bottom:1px solid #ccd0d4}.wp-editor-expand #wp-content-editor-container{box-shadow:none;margin-top:-1px}.wp-editor-expand #wp-content-editor-container{border-bottom:0 none}.wp-editor-expand div.mce-statusbar{z-index:1}.wp-editor-expand #post-status-info{border-top:1px solid #ccd0d4}.wp-editor-expand div.mce-toolbar-grp{z-index:999}.mce-fullscreen #wp-content-wrap .mce-edit-area,.mce-fullscreen #wp-content-wrap .mce-menubar,.mce-fullscreen #wp-content-wrap .mce-statusbar,.mce-fullscreen #wp-content-wrap .mce-toolbar-grp{position:static!important;width:auto!important;padding:0!important}.mce-fullscreen #wp-content-wrap .mce-statusbar{visibility:visible!important}.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw{display:none}.mce-fullscreen #wp-content-wrap .mce-wp-dfw,.post-php.mce-fullscreen #wpadminbar{display:none}#wp-content-editor-tools{background-color:#f1f1f1;padding-top:20px}#poststuff #post-body.columns-2 #side-sortables{width:280px}#timestampdiv select{vertical-align:top;font-size:12px;line-height:2.33333333}#aa,#hh,#jj,#mn{padding:6px 1px;font-size:12px;line-height:1.16666666}#hh,#jj,#mn{width:2em}#aa{width:3.4em}.curtime #timestamp{padding:2px 0 1px 0;display:inline!important;height:auto!important}#post-body #visibility:before,#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-response-to:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before{color:#82878c}#post-body #visibility:before,#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-response-to:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before{font:normal 20px/1 dashicons;speak:none;display:inline-block;margin-right:-1px;padding-left:3px;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before{content:"\f173"}#post-body #visibility:before{content:"\f177"}.curtime #timestamp:before{content:"\f145";position:relative;top:-1px}#post-body .misc-pub-revisions:before{content:"\f321"}#post-body .misc-pub-response-to:before{content:"\f101"}#timestampdiv{padding-top:5px;line-height:1.76923076}#timestampdiv p{margin:8px 0 6px}#timestampdiv input{text-align:center}.notification-dialog{position:fixed;top:30%;max-height:70%;right:50%;width:450px;margin-right:-225px;background:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);line-height:1.5;z-index:1000005;overflow-y:auto}.notification-dialog-background{position:fixed;top:0;right:0;left:0;bottom:0;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:1000000}#post-lock-dialog .post-locked-message,#post-lock-dialog .post-taken-over{margin:25px}#file-editor-warning .button,#post-lock-dialog .post-locked-message a.button{margin-left:10px}#post-lock-dialog .post-locked-avatar{float:right;margin:0 0 20px 20px}#post-lock-dialog .wp-tab-first{outline:0}#post-lock-dialog .locked-saving img{float:right;margin-left:3px}#post-lock-dialog.saved .locked-saved,#post-lock-dialog.saving .locked-saving{display:inline}#excerpt{display:block;margin:12px 0 0;height:4em;width:100%}.tagchecklist{margin-right:14px;font-size:12px;overflow:auto}.tagchecklist br{display:none}.tagchecklist strong{margin-right:-8px;position:absolute}.tagchecklist>li{float:right;margin-left:25px;font-size:13px;line-height:1.8;cursor:default;max-width:100%;overflow:hidden;text-overflow:ellipsis}.tagchecklist .ntdelbutton{position:absolute;width:24px;height:24px;border:none;margin:0 -19px 0 0;padding:0;background:0 0;cursor:pointer;text-indent:0}#poststuff .stuffbox>h3,#poststuff h2,#poststuff h3.hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}#poststuff .stuffbox h2{padding:8px 10px}#poststuff .stuffbox>h2{border-bottom:1px solid #eee}#poststuff .inside{margin:6px 0 0 0}#poststuff .stuffbox .inside{margin:0}#poststuff .inside #page_template,#poststuff .inside #parent_id{max-width:100%}.ie8 #poststuff .inside #page_template,.ie8 #poststuff .inside #parent_id{width:250px}.post-attributes-label-wrapper{margin-bottom:.5em}.post-attributes-label{vertical-align:baseline;font-weight:600}#comment-status-radio,#post-visibility-select{line-height:1.5;margin-top:3px}#linksubmitdiv .inside,#poststuff #submitdiv .inside{margin:0;padding:0}#post-body-content,.edit-form-section{margin-bottom:20px}.wp_attachment_details .attachment-content-description{margin-top:.5385em;display:inline-block;min-height:1.6923em}.wp-privacy-policy-guide{max-width:1000px}.privacy-text-box{width:calc(100% - 260px)}.privacy-text-box-toc{float:left;width:250px;background-color:#fff}.privacy-text-box-toc p{margin:0;padding:.7em 1em;border-bottom:1px solid #eee}.privacy-text-box-toc ol{margin-right:2em}.wp-privacy-policy-guide h3{font-size:1.2em;margin:1em 0 .5em}.privacy-text-section .privacy-text-copy{float:left}.privacy-text-section{position:relative;border-top:1px solid #e3e3e3}.privacy-text-box-head,.privacy-text-section.text-removed{padding-bottom:12px}.text-removed .policy-text{font-style:italic;color:#666;font-weight:600}.privacy-text-actions{height:32px;line-height:2.46153846;padding-bottom:6px}.wp-privacy-policy-guide .policy-text h2{margin:1.2em 0 1em;padding:0}.suggested-policy-content{font-style:italic}.privacy-text-section a.return-to-top{float:left;margin-left:-250px;margin-top:6px}.hide-privacy-policy-tutorial{background-color:#fff}.hide-privacy-policy-tutorial .privacy-policy-tutorial,.hide-privacy-policy-tutorial .wp-policy-help{display:none}.policy-text{margin-bottom:1em}.policy-text div>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help),.policy-text>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help){background-color:#fff;margin:0;padding:1em}.policy-text div>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help)+:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help),.policy-text>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help)+:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help){padding-top:0}.hide-privacy-policy-tutorial>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help){margin:1em 0;padding:0}.policy-text ol li,.policy-text ul li{margin-right:2em}.policy-text ul{list-style:disc}strong.privacy-policy-tutorial,strong.wp-policy-help{display:block;margin:0 0 1em}.notice.wp-pp-notice{margin:15px 0 3px}#postcustomstuff thead th{padding:5px 8px 8px;background-color:#f1f1f1}#postcustom #postcustomstuff .submit{border:0 none;float:none;padding:0 8px 8px}#side-sortables #postcustom #postcustomstuff .submit{margin:0;padding:0}#side-sortables #postcustom #postcustomstuff #the-list textarea{height:85px}#side-sortables #postcustom #postcustomstuff td.left input,#side-sortables #postcustom #postcustomstuff td.left select,#side-sortables #postcustomstuff #newmetaleft a{margin:3px 3px 0}#postcustomstuff table{margin:0;width:100%;border:1px solid #ddd;border-spacing:0;background-color:#f9f9f9}#postcustomstuff tr{vertical-align:top}#postcustomstuff table input,#postcustomstuff table select,#postcustomstuff table textarea{width:96%;margin:8px}#side-sortables #postcustomstuff table input,#side-sortables #postcustomstuff table select,#side-sortables #postcustomstuff table textarea{margin:3px}#postcustomstuff td.left,#postcustomstuff th.left{width:38%}#postcustomstuff .submit input{margin:0;width:auto}#postcustomstuff #newmetaleft a{display:inline-block;margin:0 8px 8px;text-decoration:none}.no-js #postcustomstuff #enternew{display:none}#post-body-content .compat-attachment-fields{margin-bottom:20px}.compat-attachment-fields th{padding-top:5px;padding-left:10px}#select-featured-image{padding:4px 0;overflow:hidden}#select-featured-image img{max-width:100%;height:auto;margin-bottom:10px}#select-featured-image a{float:right;clear:both}#select-featured-image .remove{display:none;margin-top:10px}.js #select-featured-image.has-featured-image .remove{display:inline-block}.no-js #select-featured-image .choose{display:none}.post-format-icon::before{display:inline-block;vertical-align:middle;height:20px;width:20px;margin-top:-4px;margin-left:7px;color:#ddd;font:normal 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a.post-format-icon:hover:before{color:#00a0d2}#post-formats-select{line-height:2}#post-formats-select .post-format-icon::before{top:5px}input.post-format{margin-top:1px}label.post-format-icon{margin-right:0;padding:2px 0}.post-format-icon.post-format-standard::before{content:"\f109"}.post-format-icon.post-format-image::before{content:"\f128"}.post-format-icon.post-format-gallery::before{content:"\f161"}.post-format-icon.post-format-audio::before{content:"\f127"}.post-format-icon.post-format-video::before{content:"\f126"}.post-format-icon.post-format-chat::before{content:"\f125"}.post-format-icon.post-format-status::before{content:"\f130"}.post-format-icon.post-format-aside::before{content:"\f123"}.post-format-icon.post-format-quote::before{content:"\f122"}.post-format-icon.post-format-link::before{content:"\f103"}.category-adder{margin-right:120px;padding:4px 0}.category-adder h4{margin:0 0 8px}#side-sortables .category-adder{margin:0}.categorydiv div.tabs-panel,.customlinkdiv div.tabs-panel,.posttypediv div.tabs-panel,.taxonomydiv div.tabs-panel,.wp-tab-panel{min-height:42px;max-height:200px;overflow:auto;padding:0 .9em;border:solid 1px #ddd;background-color:#fdfdfd}div.tabs-panel-active{display:block}div.tabs-panel-inactive{display:none}div.tabs-panel-active:focus{box-shadow:inset 0 0 0 1px #5b9dd9,inset 0 0 2px 1px rgba(30,140,190,.8);outline:0 none}#front-page-warning,#front-static-pages ul,.categorydiv ul.categorychecklist ul,.customlinkdiv ul.categorychecklist ul,.inline-editor ul.cat-checklist ul,.posttypediv ul.categorychecklist ul,.taxonomydiv ul.categorychecklist ul,ul.export-filters{margin-right:18px}ul.categorychecklist li{margin:0;padding:0;line-height:1.69230769;word-wrap:break-word}.categorydiv .tabs-panel,.customlinkdiv .tabs-panel,.posttypediv .tabs-panel,.taxonomydiv .tabs-panel{border-width:3px;border-style:solid}.form-wrap label{display:block;padding:2px 0}.form-field input[type=email],.form-field input[type=number],.form-field input[type=password],.form-field input[type=search],.form-field input[type=tel],.form-field input[type=text],.form-field input[type=url],.form-field textarea{border-style:solid;border-width:1px;width:95%}.form-field p,.form-field select{max-width:95%}.form-wrap p,p.description{margin:2px 0 5px;color:#666}.form-wrap p,p.description,p.help,span.description{font-size:13px;font-style:italic}p.description code{font-style:normal}.form-wrap .form-field{margin:1em 0;padding:0}.col-wrap h2{margin:12px 0;font-size:1.1em}.col-wrap p.submit{margin-top:-10px}.edit-term-notes{margin-top:2em}#poststuff .tagsdiv .ajaxtag{margin-top:1em}#poststuff .tagsdiv .howto{margin:1em 0 6px 0}.ajaxtag .newtag{position:relative}.tagsdiv .newtag{width:180px}.tagsdiv .the-tags{display:block;height:60px;margin:0 auto;overflow:auto;width:260px}#post-body-content .tagsdiv .the-tags{margin:0 5px}p.popular-tags{border:none;line-height:2em;padding:8px 12px 12px;text-align:justify}p.popular-tags a{padding:0 3px}.tagcloud{width:97%;margin:0 0 40px;text-align:justify}.tagcloud h2{margin:2px 0 12px}#poststuff .inside .the-tagcloud{margin:5px 0 10px;padding:8px;border:1px solid #ddd;line-height:1.2;word-spacing:3px}.the-tagcloud ul{margin:0}.the-tagcloud ul li{display:inline-block}.ac_results{display:none;margin:-1px 0 0;padding:0;list-style:none;position:absolute;z-index:10000;border:1px solid #5b9dd9;background-color:#fff}.wp-customizer .ac_results{z-index:500000}.ac_results li{margin:0;padding:5px 10px;white-space:nowrap;text-align:right}.ac_over .ac_match,.ac_results .ac_over{background-color:#0073aa;color:#fff;cursor:pointer}.ac_match{text-decoration:underline}#addtag .spinner{float:none;vertical-align:top}#edittag{max-width:800px}.edit-tag-actions{margin-top:20px}.comment-php .wp-editor-area{height:200px}.comment-ays td,.comment-ays th{padding:10px 15px}.comment-ays .comment-content ul{list-style:initial;margin-right:2em}.comment-ays .comment-content a[href]:after{content:"(" attr(href) ")";display:inline-block;padding:0 4px;color:#72777c;font-size:13px;word-break:break-all}.comment-ays .comment-content p.edit-comment{margin-top:10px}.comment-ays .comment-content p.edit-comment a[href]:after{content:"";padding:0}.comment-ays-submit .button-cancel{margin-right:1em}.spam-undo-inside,.trash-undo-inside{margin:1px 0 1px 8px;line-height:1.23076923}.spam-undo-inside .avatar,.trash-undo-inside .avatar{height:20px;width:20px;margin-left:8px;vertical-align:middle}.stuffbox .editcomment{clear:none;margin-top:0}#namediv.stuffbox .editcomment input{width:100%}#namediv.stuffbox .editcomment.form-table td{padding:10px}#comment-status-radio p{margin:3px 0 5px}#comment-status-radio input{margin:2px 0 5px 3px;vertical-align:middle}#comment-status-radio label{padding:5px 0}table.links-table{width:100%;border-spacing:0}.links-table th{font-weight:400;text-align:right;vertical-align:top;min-width:80px;width:20%;word-wrap:break-word}.links-table td,.links-table th{padding:5px 0}.links-table td label{margin-left:8px}.links-table td input[type=text],.links-table td textarea{width:100%}.links-table #link_rel{max-width:280px}#qt_content_dfw{display:none}.wp-editor-expand #qt_content_dfw{display:inline-block}.focus-on #screen-meta,.focus-on #screen-meta-links,.focus-on #wp-toolbar,.focus-on #wpfooter,.focus-on .page-title-action,.focus-on .postbox-container>*,.focus-on .update-nag,.focus-on .wrap>h1,.focus-on div.error,.focus-on div.notice,.focus-on div.updated{opacity:0;transition-duration:.6s;transition-property:opacity;transition-timing-function:ease-in-out}.focus-on #wp-toolbar{opacity:.3}.focus-off #screen-meta,.focus-off #screen-meta-links,.focus-off #wp-toolbar,.focus-off #wpfooter,.focus-off .page-title-action,.focus-off .postbox-container>*,.focus-off .update-nag,.focus-off .wrap>h1,.focus-off div.error,.focus-off div.notice,.focus-off div.updated{opacity:1;transition-duration:.2s;transition-property:opacity;transition-timing-function:ease-in-out}.focus-off #wp-toolbar{-webkit-transform:translate(0,0)}.focus-on #adminmenuback,.focus-on #adminmenuwrap{transition-duration:.6s;transition-property:transform;transition-timing-function:ease-in-out}.focus-on #adminmenuback,.focus-on #adminmenuwrap{transform:translateX(100%)}.focus-off #adminmenuback,.focus-off #adminmenuwrap{transform:translateX(0);transition-duration:.2s;transition-property:transform;transition-timing-function:ease-in-out}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){#content-resize-handle,#post-body .wp_themeSkin .mceStatusbar a.mceResize{background:transparent url(../images/resize-2x.gif) no-repeat scroll left bottom;background-size:11px 11px}.rtl #content-resize-handle,.rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize{background-image:url(../images/resize-rtl-2x.gif);background-position:left bottom}}@media only screen and (max-width:1200px){.post-type-attachment #poststuff{min-width:0}.post-type-attachment #wpbody-content #poststuff #post-body{margin:0}.post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1{margin-left:0;width:100%}.post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty,.post-type-attachment #poststuff #postbox-container-1 .empty-container{border:0 none;height:0;min-height:0}.post-type-attachment #poststuff #post-body.columns-2 #side-sortables{min-height:0;width:auto}.post-type-attachment .columns-prefs,.post-type-attachment .screen-layout{display:none}}@media only screen and (max-width:850px){#poststuff{min-width:0}#wpbody-content #poststuff #post-body{margin:0}#wpbody-content #post-body.columns-2 #postbox-container-1{margin-left:0;width:100%}#poststuff #postbox-container-1 #side-sortables:empty,#poststuff #postbox-container-1 .empty-container{border:0 none;height:0;min-height:0}#poststuff #post-body.columns-2 #side-sortables{min-height:0;width:auto}.columns-prefs,.screen-layout{display:none}}@media screen and (max-width:782px){.wp-core-ui .edit-tag-actions .button-primary{margin-bottom:0}#post-body-content{min-width:0}#titlediv #title-prompt-text{padding:10px 10px}#poststuff .stuffbox .inside{padding:0 0 4px 2px}#poststuff .stuffbox>h3,#poststuff h2,#poststuff h3.hndle{padding:12px}#namediv.stuffbox .editcomment.form-table td{padding:5px 10px}.post-format-options{padding-left:0}.post-format-options a{margin-left:5px;margin-bottom:5px;min-width:52px}.post-format-options .post-format-title{font-size:11px}.post-format-options a div{height:28px;width:28px}.post-format-options a div:before{font-size:26px!important}#post-visibility-select{line-height:280%}.wp-core-ui .save-post-visibility,.wp-core-ui .save-timestamp{vertical-align:middle;margin-left:15px}.timestamp-wrap select#mm{display:block;width:100%;margin-bottom:10px}.timestamp-wrap #aa,.timestamp-wrap #hh,.timestamp-wrap #jj,.timestamp-wrap #mn{padding:12px 3px;font-size:14px;margin-bottom:5px;width:auto;text-align:center}ul.category-tabs{margin:30px 0 15px}ul.category-tabs li.tabs{padding:15px}ul.categorychecklist li{margin-bottom:15px}ul.categorychecklist ul{margin-top:15px}.category-add input[type=text],.category-add select{max-width:none;margin-bottom:15px}.tagsdiv .newtag{width:100%;height:auto;margin-bottom:15px}.tagchecklist{margin:25px 10px}.tagchecklist>li{font-size:16px;line-height:1.4}#commentstatusdiv p{line-height:2.8}.mceToolbar *{white-space:normal!important}.mceToolbar td,.mceToolbar tr{float:right!important}.wp_themeSkin a.mceButton{width:30px;height:30px}.wp_themeSkin .mceButton .mceIcon{margin-top:5px;margin-right:5px}.wp_themeSkin .mceSplitButton{margin-top:1px}.wp_themeSkin .mceSplitButton td a.mceAction{padding-top:6px;padding-bottom:6px;padding-right:6px;padding-left:3px}.wp_themeSkin .mceSplitButton td a.mceOpen,.wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen{padding-top:6px;padding-bottom:6px;background-position:1px 6px}.wp_themeSkin table.mceListBox{margin:5px}div.quicktags-toolbar input{padding:10px 20px}button.wp-switch-editor{font-size:16px;line-height:1;margin:7px 7px 0 0;padding:8px 12px}#wp-content-media-buttons a{font-size:14px;padding:6px 10px}.wp-media-buttons span.jetpack-contact-form-icon,.wp-media-buttons span.wp-media-buttons-icon{width:22px!important;margin-right:-2px!important}.wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before,.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font-size:20px!important}#content_wp_fullscreen{display:none}.misc-pub-section{padding:20px 10px 20px}.misc-pub-section>a{float:left;font-size:16px}#delete-action,#publishing-action{line-height:3.61538461}#publishing-action .spinner{float:none;margin-top:-2px}.comment-ays td,.comment-ays th{padding-bottom:0}.comment-ays td{padding-top:6px}.links-table #link_rel{max-width:none}.links-table td,.links-table th{padding:10px 0}.privacy-text-box{width:auto}.privacy-text-box-toc{float:none;width:auto;height:100%}.privacy-text-section a.return-to-top{float:none;margin:0}} \ No newline at end of file diff --git a/wp-admin/css/edit.css b/wp-admin/css/edit.css new file mode 100644 index 0000000..38b8b96 --- /dev/null +++ b/wp-admin/css/edit.css @@ -0,0 +1,1758 @@ +#poststuff { + padding-top: 10px; + min-width: 763px; +} + +#poststuff #post-body { + padding: 0; +} + +#poststuff .postbox-container { + width: 100%; +} + +#poststuff #post-body.columns-2 { + margin-right: 300px; +} + +/*------------------------------------------------------------------------------ + 11.0 - Write/Edit Post Screen +------------------------------------------------------------------------------*/ + +#show-comments { + overflow: hidden; +} + +#save-action .spinner, +#show-comments a { + float: left; +} + +#show-comments .spinner { + float: none; + margin-top: 0; +} + +#lost-connection-notice .spinner { + visibility: visible; + float: left; + margin: 0 5px 0 0; +} + +#titlediv { + position: relative; +} + +#titlediv label { + cursor: text; +} + +#titlediv div.inside { + margin: 0; +} + +#poststuff #titlewrap { + border: 0; + padding: 0; +} + +#titlediv #title { + padding: 3px 8px; + font-size: 1.7em; + line-height: 100%; + height: 1.7em; + width: 100%; + outline: none; + margin: 0 0 3px; + background-color: #fff; +} + +#titlediv #title-prompt-text { + color: #72777c; + position: absolute; + font-size: 1.7em; + padding: 10px; + pointer-events: none; +} + +input#link_description, +input#link_url { + width: 98%; +} + +#pending { + background: 0 none; + border: 0 none; + padding: 0; + font-size: 11px; + margin-top: -1px; +} + +#edit-slug-box, +#comment-link-box { + line-height: 1.84615384; + min-height: 25px; + margin-top: 5px; + padding: 0 10px; + color: #666; +} + +#edit-slug-box .cancel { + margin-right: 10px; + padding: 0; + font-size: 11px; +} + +#comment-link-box { + margin: 5px 0; + padding: 0 5px; +} + +#editable-post-name-full { + display: none; +} + +#editable-post-name { + font-weight: 600; +} + +#editable-post-name input { + font-size: 13px; + font-weight: 400; + height: 24px; + margin: 0; + width: 16em; +} + +.postarea h3 label { + float: left; +} + +body.post-new-php .submitbox .submitdelete { + display: none; +} + +.submitbox .submit a:hover { + text-decoration: underline; +} + +.submitbox .submit input { + margin-bottom: 8px; + margin-right: 4px; + padding: 6px; +} + +#post-status-select { + margin-top: 3px; +} + +/* Post Screen */ +#post-body #normal-sortables { + min-height: 50px; +} + +.postbox { + position: relative; + min-width: 255px; + border: 1px solid #ccd0d4; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + background: #fff; +} + +#trackback_url { + width: 99%; +} + +#normal-sortables .postbox .submit { + background: transparent none; + border: 0 none; + float: right; + padding: 0 12px; + margin: 0; +} + +.category-add input[type="text"], +.category-add select { + width: 100%; + max-width: 260px; + vertical-align: baseline; +} + +#side-sortables .category-add input[type="text"], +#side-sortables .category-add select { + margin: 0 0 1em; +} + +ul.category-tabs li, +#side-sortables .add-menu-item-tabs li, +.wp-tab-bar li { + display: inline; + line-height: 1.35; +} + +.no-js .category-tabs li.hide-if-no-js { + display: none; +} + +.category-tabs a, +#side-sortables .add-menu-item-tabs a, +.wp-tab-bar a { + text-decoration: none; +} + +/* @todo: do these really need to be so specific? */ +#side-sortables .category-tabs .tabs a, +#side-sortables .add-menu-item-tabs .tabs a, +.wp-tab-bar .wp-tab-active a, +#post-body ul.category-tabs li.tabs a, +#post-body ul.add-menu-item-tabs li.tabs a { + color: #32373c; +} + +.category-tabs { + margin: 8px 0 5px; +} + +/* Back-compat for pre-4.4 */ +#category-adder h4 { + margin: 0; +} + +.taxonomy-add-new { + display: inline-block; + margin: 10px 0; + font-weight: 600; +} + +#side-sortables .add-menu-item-tabs, +.wp-tab-bar { + margin-bottom: 3px; +} + +#normal-sortables .postbox #replyrow .submit { + float: none; + margin: 0; + padding: 5px 7px 10px; + overflow: hidden; +} + +#side-sortables .submitbox .submit input, +#side-sortables .submitbox .submit .preview, +#side-sortables .submitbox .submit a.preview:hover { + border: 0 none; +} + +/* @todo: make this a more generic class */ +ul.category-tabs, +ul.add-menu-item-tabs, +ul.wp-tab-bar { + margin-top: 12px; +} + +ul.category-tabs li, +ul.add-menu-item-tabs li { + border: solid 1px transparent; + position: relative; +} + +ul.category-tabs li.tabs, +ul.add-menu-item-tabs li.tabs, +.wp-tab-active { + border: 1px solid #ddd; + border-bottom-color: #fdfdfd; + background-color: #fdfdfd; +} + +ul.category-tabs li, +ul.add-menu-item-tabs li, +ul.wp-tab-bar li { + padding: 3px 5px 6px; +} + +#set-post-thumbnail { + display: inline-block; + max-width: 100%; +} + +#postimagediv .inside img { + max-width: 100%; + height: auto; + width: auto; + vertical-align: top; + background-image: linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; +} + +form#tags-filter { + position: relative; +} + +/* Global classes */ +.wp-hidden-children .wp-hidden-child, +.ui-tabs-hide { + display: none; +} + +#post-body .tagsdiv #newtag { + margin-right: 5px; + width: 16em; +} + +#side-sortables input#post_password { + width: 94% +} + +#side-sortables .tagsdiv #newtag { + width: 68%; +} + +#post-status-info { + width: 100%; + border-spacing: 0; + border: 1px solid #ccd0d4; + border-top: none; + background-color: #f7f7f7; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + z-index: 999; +} + +#post-status-info td { + font-size: 12px; +} + +.autosave-info { + padding: 2px 10px; + text-align: right; +} + +#editorcontent #post-status-info { + border: none; +} + +#content-resize-handle { + background: transparent url(../images/resize.gif) no-repeat scroll right bottom; + width: 12px; + cursor: row-resize; +} + +/*rtl:ignore*/ +.rtl #content-resize-handle { + background-image: url(../images/resize-rtl.gif); + background-position: left bottom; +} + +.wp-editor-expand #content-resize-handle { + display: none; +} + +#postdivrich #content { + resize: none; +} + +#wp-word-count { + display: block; + padding: 2px 10px; +} + +#wp-content-editor-container { + position: relative; +} + +.wp-editor-expand #wp-content-editor-tools { + z-index: 1000; + border-bottom: 1px solid #ccd0d4; +} + +.wp-editor-expand #wp-content-editor-container { + box-shadow: none; + margin-top: -1px; +} + +.wp-editor-expand #wp-content-editor-container { + border-bottom: 0 none; +} + +.wp-editor-expand div.mce-statusbar { + z-index: 1; +} + +.wp-editor-expand #post-status-info { + border-top: 1px solid #ccd0d4; +} + +.wp-editor-expand div.mce-toolbar-grp { + z-index: 999; +} + +/* TinyMCE native fullscreen mode override */ +.mce-fullscreen #wp-content-wrap .mce-menubar, +.mce-fullscreen #wp-content-wrap .mce-toolbar-grp, +.mce-fullscreen #wp-content-wrap .mce-edit-area, +.mce-fullscreen #wp-content-wrap .mce-statusbar { + position: static !important; + width: auto !important; + padding: 0 !important; +} + +.mce-fullscreen #wp-content-wrap .mce-statusbar { + visibility: visible !important; +} + +.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw { + display: none; +} + +.post-php.mce-fullscreen #wpadminbar, +.mce-fullscreen #wp-content-wrap .mce-wp-dfw { + display: none; +} +/* End TinyMCE native fullscreen mode override */ + +#wp-content-editor-tools { + background-color: #f1f1f1; + padding-top: 20px; +} + +#poststuff #post-body.columns-2 #side-sortables { + width: 280px; +} + +#timestampdiv select { + vertical-align: top; + font-size: 12px; + line-height: 2.33333333; /* 28px */ +} + +#aa, #jj, #hh, #mn { + padding: 6px 1px; + font-size: 12px; + line-height: 1.16666666; /* 14px */ +} + +#jj, #hh, #mn { + width: 2em; +} + +#aa { + width: 3.4em; +} + +.curtime #timestamp { + padding: 2px 0 1px 0; + display: inline !important; + height: auto !important; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +#post-body .misc-pub-response-to:before, +#post-body .misc-pub-comment-status:before { + color: #82878c; +} + +#post-body .misc-pub-post-status:before, +#post-body #visibility:before, +.curtime #timestamp:before, +#post-body .misc-pub-revisions:before, +#post-body .misc-pub-response-to:before, +#post-body .misc-pub-comment-status:before { + font: normal 20px/1 dashicons; + speak: none; + display: inline-block; + margin-left: -1px; + padding-right: 3px; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#post-body .misc-pub-post-status:before, +#post-body .misc-pub-comment-status:before { + content: "\f173"; +} + +#post-body #visibility:before { + content: "\f177"; +} + +.curtime #timestamp:before { + content: "\f145"; + position: relative; + top: -1px; +} + +#post-body .misc-pub-revisions:before { + content: "\f321"; +} + +#post-body .misc-pub-response-to:before { + content: "\f101"; +} + +#timestampdiv { + padding-top: 5px; + line-height: 1.76923076; +} + +#timestampdiv p { + margin: 8px 0 6px; +} + +#timestampdiv input { + text-align: center; +} + +.notification-dialog { + position: fixed; + top: 30%; + max-height: 70%; + left: 50%; + width: 450px; + margin-left: -225px; + background: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + line-height: 1.5; + z-index: 1000005; + overflow-y: auto; +} + +.notification-dialog-background { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 1000000; +} + +#post-lock-dialog .post-locked-message, +#post-lock-dialog .post-taken-over { + margin: 25px; +} + +#post-lock-dialog .post-locked-message a.button, +#file-editor-warning .button { + margin-right: 10px; +} + +#post-lock-dialog .post-locked-avatar { + float: left; + margin: 0 20px 20px 0; +} + +#post-lock-dialog .wp-tab-first { + outline: 0; +} + +#post-lock-dialog .locked-saving img { + float: left; + margin-right: 3px; +} + +#post-lock-dialog.saving .locked-saving, +#post-lock-dialog.saved .locked-saved { + display: inline; +} + +#excerpt { + display: block; + margin: 12px 0 0; + height: 4em; + width: 100%; +} + +.tagchecklist { + margin-left: 14px; + font-size: 12px; + overflow: auto; +} + +.tagchecklist br { + display: none; +} + +.tagchecklist strong { + margin-left: -8px; + position: absolute; +} + +.tagchecklist > li { + float: left; + margin-right: 25px; + font-size: 13px; + line-height: 1.8; + cursor: default; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; +} + +.tagchecklist .ntdelbutton { + position: absolute; + width: 24px; + height: 24px; + border: none; + margin: 0 0 0 -19px; + padding: 0; + background: none; + cursor: pointer; + text-indent: 0; +} + +#poststuff h3.hndle, /* Back-compat for pre-4.4 */ +#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */ +#poststuff h2 { + font-size: 14px; + padding: 8px 12px; + margin: 0; + line-height: 1.4; +} + +#poststuff .stuffbox h2 { + padding: 8px 10px; +} + +#poststuff .stuffbox > h2 { + border-bottom: 1px solid #eee; +} + +#poststuff .inside { + margin: 6px 0 0 0; +} + +#poststuff .stuffbox .inside { + margin: 0; +} + +#poststuff .inside #parent_id, +#poststuff .inside #page_template { + max-width: 100%; +} + +.ie8 #poststuff .inside #parent_id, +.ie8 #poststuff .inside #page_template { + width: 250px; +} + +.post-attributes-label-wrapper { + margin-bottom: 0.5em; +} + +.post-attributes-label { + vertical-align: baseline; + font-weight: 600; +} + +#post-visibility-select, +#comment-status-radio { + line-height: 1.5; + margin-top: 3px; +} + +#linksubmitdiv .inside, /* Old Link Manager back-compat. */ +#poststuff #submitdiv .inside { + margin: 0; + padding: 0; +} + +#post-body-content, +.edit-form-section { + margin-bottom: 20px; +} + +.wp_attachment_details .attachment-content-description { + margin-top: 0.5385em; + display: inline-block; + min-height: 1.6923em; +} + +/* Suggested text for privacy policy */ +.wp-privacy-policy-guide { + max-width: 1000px; +} + +.privacy-text-box { + width: calc(100% - 260px); +} + +.privacy-text-box-toc { + float: right; + width: 250px; + background-color: #fff; +} + +.privacy-text-box-toc p { + margin: 0; + padding: 0.7em 1em; + border-bottom: 1px solid #eee; +} + +.privacy-text-box-toc ol { + margin-left: 2em; +} + +.wp-privacy-policy-guide h3 { + font-size: 1.2em; + margin: 1em 0 0.5em; +} + +.privacy-text-section .privacy-text-copy { + float: right; +} + +.privacy-text-section { + position: relative; + border-top: 1px solid #e3e3e3; +} + +.privacy-text-box-head, +.privacy-text-section.text-removed { + padding-bottom: 12px; +} + +.text-removed .policy-text { + font-style: italic; + color: #666; + font-weight: 600; +} + +.privacy-text-actions { + height: 32px; + line-height: 2.46153846; + padding-bottom: 6px; +} + +.wp-privacy-policy-guide .policy-text h2 { + margin: 1.2em 0 1em; + padding: 0; +} + +.suggested-policy-content { + font-style: italic; +} + +.privacy-text-section a.return-to-top { + float: right; + margin-right: -250px; + margin-top: 6px; +} + +.hide-privacy-policy-tutorial { + background-color: #fff; +} + +.hide-privacy-policy-tutorial .wp-policy-help, /* For back-compat, see #49282 */ +.hide-privacy-policy-tutorial .privacy-policy-tutorial { + display: none; +} + +.policy-text { + margin-bottom: 1em; +} + +.policy-text > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help), +.policy-text div > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) { + background-color: #fff; + margin: 0; + padding: 1em; +} + +.policy-text > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) + *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help), +.policy-text div > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) + *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) { + padding-top: 0; +} + +.hide-privacy-policy-tutorial > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help) { + margin: 1em 0; + padding: 0; +} + +.policy-text ul li, +.policy-text ol li { + margin-left: 2em; +} + +.policy-text ul { + list-style: disc; +} + +strong.wp-policy-help, /* For back-compat, see #49282 */ +strong.privacy-policy-tutorial { + display: block; + margin: 0 0 1em; +} + +.notice.wp-pp-notice { + margin: 15px 0 3px; +} + +/*------------------------------------------------------------------------------ + 11.1 - Custom Fields +------------------------------------------------------------------------------*/ + +#postcustomstuff thead th { + padding: 5px 8px 8px; + background-color: #f1f1f1; +} + +#postcustom #postcustomstuff .submit { + border: 0 none; + float: none; + padding: 0 8px 8px; +} + +#side-sortables #postcustom #postcustomstuff .submit { + margin: 0; + padding: 0; +} + +#side-sortables #postcustom #postcustomstuff #the-list textarea { + height: 85px; +} + +#side-sortables #postcustom #postcustomstuff td.left input, +#side-sortables #postcustom #postcustomstuff td.left select, +#side-sortables #postcustomstuff #newmetaleft a { + margin: 3px 3px 0; +} + +#postcustomstuff table { + margin: 0; + width: 100%; + border: 1px solid #ddd; + border-spacing: 0; + background-color: #f9f9f9; +} + +#postcustomstuff tr { + vertical-align: top; +} + +#postcustomstuff table input, +#postcustomstuff table select, +#postcustomstuff table textarea { + width: 96%; + margin: 8px; +} + +#side-sortables #postcustomstuff table input, +#side-sortables #postcustomstuff table select, +#side-sortables #postcustomstuff table textarea { + margin: 3px; +} + +#postcustomstuff th.left, +#postcustomstuff td.left { + width: 38%; +} + +#postcustomstuff .submit input { + margin: 0; + width: auto; +} + +#postcustomstuff #newmetaleft a { + display: inline-block; + margin: 0 8px 8px; + text-decoration: none; +} + +.no-js #postcustomstuff #enternew { + display: none; +} + +#post-body-content .compat-attachment-fields { + margin-bottom: 20px; +} + +.compat-attachment-fields th { + padding-top: 5px; + padding-right: 10px; +} + +/*------------------------------------------------------------------------------ + 11.3 - Featured Images +------------------------------------------------------------------------------*/ + +#select-featured-image { + padding: 4px 0; + overflow: hidden; +} + +#select-featured-image img { + max-width: 100%; + height: auto; + margin-bottom: 10px; +} + +#select-featured-image a { + float: left; + clear: both; +} + +#select-featured-image .remove { + display: none; + margin-top: 10px; +} + +.js #select-featured-image.has-featured-image .remove { + display: inline-block; +} + +.no-js #select-featured-image .choose { + display: none; +} + +/*------------------------------------------------------------------------------ + 11.4 - Post formats +------------------------------------------------------------------------------*/ + +.post-format-icon::before { + display: inline-block; + vertical-align: middle; + height: 20px; + width: 20px; + margin-top: -4px; + margin-right: 7px; + color: #ddd; + font: normal 20px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a.post-format-icon:hover:before { + color: #00a0d2; +} + +#post-formats-select { + line-height: 2; +} + +#post-formats-select .post-format-icon::before { + top: 5px; +} + +input.post-format { + margin-top: 1px; +} + +label.post-format-icon { + margin-left: 0; + padding: 2px 0; +} + +.post-format-icon.post-format-standard::before { + content: "\f109"; +} + +.post-format-icon.post-format-image::before { + content: "\f128"; +} + +.post-format-icon.post-format-gallery::before { + content: "\f161"; +} + +.post-format-icon.post-format-audio::before { + content: "\f127"; +} + +.post-format-icon.post-format-video::before { + content: "\f126"; +} + +.post-format-icon.post-format-chat::before { + content: "\f125"; +} + +.post-format-icon.post-format-status::before { + content: "\f130"; +} + +.post-format-icon.post-format-aside::before { + content: "\f123"; +} + +.post-format-icon.post-format-quote::before { + content: "\f122"; +} + +.post-format-icon.post-format-link::before { + content: "\f103"; +} + +/*------------------------------------------------------------------------------ + 12.0 - Categories +------------------------------------------------------------------------------*/ + +.category-adder { + margin-left: 120px; + padding: 4px 0; +} + +.category-adder h4 { + margin: 0 0 8px; +} + +#side-sortables .category-adder { + margin: 0; +} + +.wp-tab-panel, +.categorydiv div.tabs-panel, +.customlinkdiv div.tabs-panel, +.posttypediv div.tabs-panel, +.taxonomydiv div.tabs-panel { + min-height: 42px; + max-height: 200px; + overflow: auto; + padding: 0 0.9em; + border: solid 1px #ddd; + background-color: #fdfdfd; +} + +div.tabs-panel-active { + display: block; +} + +div.tabs-panel-inactive { + display: none; +} + +div.tabs-panel-active:focus { + box-shadow: inset 0 0 0 1px #5b9dd9, inset 0 0 2px 1px rgba(30, 140, 190, 0.8); + outline: 0 none; +} + +#front-page-warning, +#front-static-pages ul, +ul.export-filters, +.inline-editor ul.cat-checklist ul, +.categorydiv ul.categorychecklist ul, +.customlinkdiv ul.categorychecklist ul, +.posttypediv ul.categorychecklist ul, +.taxonomydiv ul.categorychecklist ul { + margin-left: 18px; +} + +ul.categorychecklist li { + margin: 0; + padding: 0; + line-height: 1.69230769; + word-wrap: break-word; +} + +.categorydiv .tabs-panel, +.customlinkdiv .tabs-panel, +.posttypediv .tabs-panel, +.taxonomydiv .tabs-panel { + border-width: 3px; + border-style: solid; +} + +.form-wrap label { + display: block; + padding: 2px 0; +} + +.form-field input[type="text"], +.form-field input[type="password"], +.form-field input[type="email"], +.form-field input[type="number"], +.form-field input[type="search"], +.form-field input[type="tel"], +.form-field input[type="url"], +.form-field textarea { + border-style: solid; + border-width: 1px; + width: 95%; +} + +.form-field select, +.form-field p { + max-width: 95%; +} + +p.description, +.form-wrap p { + margin: 2px 0 5px; + color: #666; +} + +p.help, +p.description, +span.description, +.form-wrap p { + font-size: 13px; + font-style: italic; +} + +p.description code { + font-style: normal; +} + +.form-wrap .form-field { + margin: 1em 0; + padding: 0; +} + +.col-wrap h2 { + margin: 12px 0; + font-size: 1.1em; +} + +.col-wrap p.submit { + margin-top: -10px; +} + +.edit-term-notes { + margin-top: 2em; +} + +/*------------------------------------------------------------------------------ + 13.0 - Tags +------------------------------------------------------------------------------*/ + +#poststuff .tagsdiv .ajaxtag { + margin-top: 1em; +} + +#poststuff .tagsdiv .howto { + margin: 1em 0 6px 0; +} + +.ajaxtag .newtag { + position: relative; +} + +.tagsdiv .newtag { + width: 180px; +} + +.tagsdiv .the-tags { + display: block; + height: 60px; + margin: 0 auto; + overflow: auto; + width: 260px; +} + +#post-body-content .tagsdiv .the-tags { + margin: 0 5px; +} + +p.popular-tags { + border: none; + line-height: 2em; + padding: 8px 12px 12px; + text-align: justify; +} + +p.popular-tags a { + padding: 0 3px; +} + +.tagcloud { + width: 97%; + margin: 0 0 40px; + text-align: justify; +} + +.tagcloud h2 { + margin: 2px 0 12px; +} + +#poststuff .inside .the-tagcloud { + margin: 5px 0 10px; + padding: 8px; + border: 1px solid #ddd; + line-height: 1.2; + word-spacing: 3px; +} + +.the-tagcloud ul { + margin: 0; +} + +.the-tagcloud ul li { + display: inline-block; +} + +/* Suggest.js autocomplete, no more used by core. */ +.ac_results { + display: none; + margin: -1px 0 0; + padding: 0; + list-style: none; + position: absolute; + z-index: 10000; + border: 1px solid #5b9dd9; + background-color: #fff; +} + +.wp-customizer .ac_results { + z-index: 500000; +} + +.ac_results li { + margin: 0; + padding: 5px 10px; + white-space: nowrap; + text-align: left; +} + +.ac_results .ac_over, +.ac_over .ac_match { + background-color: #0073aa; + color: #fff; + cursor: pointer; +} + +.ac_match { + text-decoration: underline; +} + +#addtag .spinner { + float: none; + vertical-align: top; +} + +#edittag { + max-width: 800px; +} + +.edit-tag-actions { + margin-top: 20px; +} + +/* Comments */ + +.comment-php .wp-editor-area { + height: 200px; +} + +.comment-ays th, +.comment-ays td { + padding: 10px 15px; +} + +.comment-ays .comment-content ul { + list-style: initial; + margin-left: 2em; +} + +.comment-ays .comment-content a[href]:after { + content: "(" attr( href ) ")"; + display: inline-block; + padding: 0 4px; + color: #72777C; + font-size: 13px; + word-break: break-all; +} + +.comment-ays .comment-content p.edit-comment { + margin-top: 10px; +} + +.comment-ays .comment-content p.edit-comment a[href]:after { + content: ""; + padding: 0; +} + +.comment-ays-submit .button-cancel { + margin-left: 1em; +} + +.trash-undo-inside, +.spam-undo-inside { + margin: 1px 8px 1px 0; + line-height: 1.23076923; +} + +.spam-undo-inside .avatar, +.trash-undo-inside .avatar { + height: 20px; + width: 20px; + margin-right: 8px; + vertical-align: middle; +} + +.stuffbox .editcomment { + clear: none; + margin-top: 0; +} + +#namediv.stuffbox .editcomment input { + width: 100%; +} + +#namediv.stuffbox .editcomment.form-table td { + padding: 10px; +} + +#comment-status-radio p { + margin: 3px 0 5px; +} + +#comment-status-radio input { + margin: 2px 3px 5px 0; + vertical-align: middle; +} + +#comment-status-radio label { + padding: 5px 0; +} + +/* links tables */ +table.links-table { + width: 100%; + border-spacing: 0; +} + +.links-table th { + font-weight: 400; + text-align: left; + vertical-align: top; + min-width: 80px; + width: 20%; + word-wrap: break-word; +} + +.links-table th, +.links-table td { + padding: 5px 0; +} + +.links-table td label { + margin-right: 8px; +} + +.links-table td input[type="text"], +.links-table td textarea { + width: 100%; +} + +.links-table #link_rel { + max-width: 280px; +} + +/* DFW 2 +-------------------------------------------------------------- */ + +#qt_content_dfw { + display: none; +} + +.wp-editor-expand #qt_content_dfw { + display: inline-block; +} + +.focus-on .wrap > h1, +.focus-on .page-title-action, +.focus-on #wpfooter, +.focus-on .postbox-container > *, +.focus-on div.updated, +.focus-on div.error, +.focus-on div.notice, +.focus-on .update-nag, +.focus-on #wp-toolbar, +.focus-on #screen-meta-links, +.focus-on #screen-meta { + opacity: 0; + transition-duration: 0.6s; + transition-property: opacity; + transition-timing-function: ease-in-out; +} + +.focus-on #wp-toolbar { + opacity: 0.3; +} + +.focus-off .wrap > h1, +.focus-off .page-title-action, +.focus-off #wpfooter, +.focus-off .postbox-container > *, +.focus-off div.updated, +.focus-off div.error, +.focus-off div.notice, +.focus-off .update-nag, +.focus-off #wp-toolbar, +.focus-off #screen-meta-links, +.focus-off #screen-meta { + opacity: 1; + transition-duration: 0.2s; + transition-property: opacity; + transition-timing-function: ease-in-out; +} + +.focus-off #wp-toolbar { + -webkit-transform: translate(0, 0); +} + +.focus-on #adminmenuback, +.focus-on #adminmenuwrap { + transition-duration: 0.6s; + transition-property: transform; + transition-timing-function: ease-in-out; +} + +.focus-on #adminmenuback, +.focus-on #adminmenuwrap { + transform: translateX( -100% ); +} + +.focus-off #adminmenuback, +.focus-off #adminmenuwrap { + transform: translateX( 0 ); + transition-duration: 0.2s; + transition-property: transform; + transition-timing-function: ease-in-out; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + #content-resize-handle, + #post-body .wp_themeSkin .mceStatusbar a.mceResize { + background: transparent url(../images/resize-2x.gif) no-repeat scroll right bottom; + background-size: 11px 11px; + } + + /*rtl:ignore*/ + .rtl #content-resize-handle, + .rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize { + background-image: url(../images/resize-rtl-2x.gif); + background-position: left bottom; + } +} + +/* one column on the attachment editor screen */ +@media only screen and (max-width: 1200px) { + .post-type-attachment #poststuff { + min-width: 0; + } + + .post-type-attachment #wpbody-content #poststuff #post-body { + margin: 0; + } + + .post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1 { + margin-right: 0; + width: 100%; + } + + .post-type-attachment #poststuff #postbox-container-1 .empty-container, + .post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty { + border: 0 none; + height: 0; + min-height: 0; + } + + .post-type-attachment #poststuff #post-body.columns-2 #side-sortables { + min-height: 0; + width: auto; + } + + /* hide the radio buttons for column prefs */ + .post-type-attachment .screen-layout, + .post-type-attachment .columns-prefs { + display: none; + } +} + +/* one column on the post write/edit screen */ +@media only screen and (max-width: 850px) { + #poststuff { + min-width: 0; + } + + #wpbody-content #poststuff #post-body { + margin: 0; + } + + #wpbody-content #post-body.columns-2 #postbox-container-1 { + margin-right: 0; + width: 100%; + } + + #poststuff #postbox-container-1 .empty-container, + #poststuff #postbox-container-1 #side-sortables:empty { + border: 0 none; + height: 0; + min-height: 0; + } + + #poststuff #post-body.columns-2 #side-sortables { + min-height: 0; + width: auto; + } + + /* hide the radio buttons for column prefs */ + .screen-layout, + .columns-prefs { + display: none; + } +} + +@media screen and (max-width: 782px) { + .wp-core-ui .edit-tag-actions .button-primary { + margin-bottom: 0; + } + + #post-body-content { + min-width: 0; + } + + #titlediv #title-prompt-text { + padding: 10px 10px; + } + + #poststuff .stuffbox .inside { + padding: 0 2px 4px 0; + } + + #poststuff h3.hndle, /* Back-compat for pre-4.4 */ + #poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */ + #poststuff h2 { + padding: 12px; + } + + #namediv.stuffbox .editcomment.form-table td { + padding: 5px 10px; + } + + .post-format-options { + padding-right: 0; + } + + .post-format-options a { + margin-right: 5px; + margin-bottom: 5px; + min-width: 52px; + } + + .post-format-options .post-format-title { + font-size: 11px; + } + + .post-format-options a div { + height: 28px; + width: 28px; + } + + .post-format-options a div:before { + font-size: 26px !important; + } + + /* Publish Metabox Options */ + #post-visibility-select { + line-height: 280%; + } + + .wp-core-ui .save-post-visibility, + .wp-core-ui .save-timestamp { + vertical-align: middle; + margin-right: 15px; + } + + .timestamp-wrap select#mm { + display: block; + width: 100%; + margin-bottom: 10px; + } + + .timestamp-wrap #jj, + .timestamp-wrap #aa, + .timestamp-wrap #hh, + .timestamp-wrap #mn { + padding: 12px 3px; + font-size: 14px; + margin-bottom: 5px; + width: auto; + text-align: center; + } + + /* Categories Metabox */ + ul.category-tabs { + margin: 30px 0 15px; + } + + ul.category-tabs li.tabs { + padding: 15px; + } + + ul.categorychecklist li { + margin-bottom: 15px; + } + + ul.categorychecklist ul { + margin-top: 15px; + } + + .category-add input[type=text], + .category-add select { + max-width: none; + margin-bottom: 15px; + } + + /* Tags Metabox */ + .tagsdiv .newtag { + width: 100%; + height: auto; + margin-bottom: 15px; + } + + .tagchecklist { + margin: 25px 10px; + } + + .tagchecklist > li { + font-size: 16px; + line-height: 1.4; + } + + /* Discussion */ + #commentstatusdiv p { + line-height: 2.8; + } + + /* TinyMCE Adjustments */ + .mceToolbar * { + white-space: normal !important; + } + + .mceToolbar tr, + .mceToolbar td { + float: left !important; + } + + .wp_themeSkin a.mceButton { + width: 30px; + height: 30px; + } + + .wp_themeSkin .mceButton .mceIcon { + margin-top: 5px; + margin-left: 5px; + } + + .wp_themeSkin .mceSplitButton { + margin-top: 1px; + } + + .wp_themeSkin .mceSplitButton td a.mceAction { + padding-top: 6px; + padding-bottom: 6px; + padding-left: 6px; + padding-right: 3px; + } + + .wp_themeSkin .mceSplitButton td a.mceOpen, + .wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen { + padding-top: 6px; + padding-bottom: 6px; + background-position: 1px 6px; + } + + .wp_themeSkin table.mceListBox { + margin: 5px; + } + + div.quicktags-toolbar input { + padding: 10px 20px; + } + + button.wp-switch-editor { + font-size: 16px; + line-height: 1; + margin: 7px 0 0 7px; + padding: 8px 12px; + } + + #wp-content-media-buttons a { + font-size: 14px; + padding: 6px 10px; + } + + .wp-media-buttons span.wp-media-buttons-icon, + .wp-media-buttons span.jetpack-contact-form-icon { + width: 22px !important; + margin-left: -2px !important; + } + + .wp-media-buttons .add_media span.wp-media-buttons-icon:before, + .wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before { + font-size: 20px !important; + } + + #content_wp_fullscreen { + display: none; + } + + .misc-pub-section { + padding: 20px 10px 20px; + } + + .misc-pub-section > a { + float: right; + font-size: 16px; + } + + #delete-action, + #publishing-action { + line-height: 3.61538461; + } + + #publishing-action .spinner { + float: none; + margin-top: -2px; /* Half of the Publish button's bottom margin. */ + } + + /* Moderate Comment */ + .comment-ays th, + .comment-ays td { + padding-bottom: 0; + } + + .comment-ays td { + padding-top: 6px; + } + + /* Links */ + .links-table #link_rel { + max-width: none; + } + + .links-table th, + .links-table td { + padding: 10px 0; + } + + .privacy-text-box { + width: auto; + } + + .privacy-text-box-toc { + float: none; + width: auto; + height: 100%; + } + + .privacy-text-section a.return-to-top { + float: none; + margin: 0; + } +} diff --git a/wp-admin/css/edit.min.css b/wp-admin/css/edit.min.css new file mode 100644 index 0000000..ad25ce6 --- /dev/null +++ b/wp-admin/css/edit.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#poststuff{padding-top:10px;min-width:763px}#poststuff #post-body{padding:0}#poststuff .postbox-container{width:100%}#poststuff #post-body.columns-2{margin-right:300px}#show-comments{overflow:hidden}#save-action .spinner,#show-comments a{float:left}#show-comments .spinner{float:none;margin-top:0}#lost-connection-notice .spinner{visibility:visible;float:left;margin:0 5px 0 0}#titlediv{position:relative}#titlediv label{cursor:text}#titlediv div.inside{margin:0}#poststuff #titlewrap{border:0;padding:0}#titlediv #title{padding:3px 8px;font-size:1.7em;line-height:100%;height:1.7em;width:100%;outline:0;margin:0 0 3px;background-color:#fff}#titlediv #title-prompt-text{color:#72777c;position:absolute;font-size:1.7em;padding:10px;pointer-events:none}input#link_description,input#link_url{width:98%}#pending{background:0 none;border:0 none;padding:0;font-size:11px;margin-top:-1px}#comment-link-box,#edit-slug-box{line-height:1.84615384;min-height:25px;margin-top:5px;padding:0 10px;color:#666}#edit-slug-box .cancel{margin-right:10px;padding:0;font-size:11px}#comment-link-box{margin:5px 0;padding:0 5px}#editable-post-name-full{display:none}#editable-post-name{font-weight:600}#editable-post-name input{font-size:13px;font-weight:400;height:24px;margin:0;width:16em}.postarea h3 label{float:left}body.post-new-php .submitbox .submitdelete{display:none}.submitbox .submit a:hover{text-decoration:underline}.submitbox .submit input{margin-bottom:8px;margin-right:4px;padding:6px}#post-status-select{margin-top:3px}#post-body #normal-sortables{min-height:50px}.postbox{position:relative;min-width:255px;border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff}#trackback_url{width:99%}#normal-sortables .postbox .submit{background:transparent none;border:0 none;float:right;padding:0 12px;margin:0}.category-add input[type=text],.category-add select{width:100%;max-width:260px;vertical-align:baseline}#side-sortables .category-add input[type=text],#side-sortables .category-add select{margin:0 0 1em}#side-sortables .add-menu-item-tabs li,.wp-tab-bar li,ul.category-tabs li{display:inline;line-height:1.35}.no-js .category-tabs li.hide-if-no-js{display:none}#side-sortables .add-menu-item-tabs a,.category-tabs a,.wp-tab-bar a{text-decoration:none}#post-body ul.add-menu-item-tabs li.tabs a,#post-body ul.category-tabs li.tabs a,#side-sortables .add-menu-item-tabs .tabs a,#side-sortables .category-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#32373c}.category-tabs{margin:8px 0 5px}#category-adder h4{margin:0}.taxonomy-add-new{display:inline-block;margin:10px 0;font-weight:600}#side-sortables .add-menu-item-tabs,.wp-tab-bar{margin-bottom:3px}#normal-sortables .postbox #replyrow .submit{float:none;margin:0;padding:5px 7px 10px;overflow:hidden}#side-sortables .submitbox .submit .preview,#side-sortables .submitbox .submit a.preview:hover,#side-sortables .submitbox .submit input{border:0 none}ul.add-menu-item-tabs,ul.category-tabs,ul.wp-tab-bar{margin-top:12px}ul.add-menu-item-tabs li,ul.category-tabs li{border:solid 1px transparent;position:relative}.wp-tab-active,ul.add-menu-item-tabs li.tabs,ul.category-tabs li.tabs{border:1px solid #ddd;border-bottom-color:#fdfdfd;background-color:#fdfdfd}ul.add-menu-item-tabs li,ul.category-tabs li,ul.wp-tab-bar li{padding:3px 5px 6px}#set-post-thumbnail{display:inline-block;max-width:100%}#postimagediv .inside img{max-width:100%;height:auto;width:auto;vertical-align:top;background-image:linear-gradient(45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4),linear-gradient(45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4);background-position:0 0,10px 10px;background-size:20px 20px}form#tags-filter{position:relative}.ui-tabs-hide,.wp-hidden-children .wp-hidden-child{display:none}#post-body .tagsdiv #newtag{margin-right:5px;width:16em}#side-sortables input#post_password{width:94%}#side-sortables .tagsdiv #newtag{width:68%}#post-status-info{width:100%;border-spacing:0;border:1px solid #ccd0d4;border-top:none;background-color:#f7f7f7;box-shadow:0 1px 1px rgba(0,0,0,.04);z-index:999}#post-status-info td{font-size:12px}.autosave-info{padding:2px 10px;text-align:right}#editorcontent #post-status-info{border:none}#content-resize-handle{background:transparent url(../images/resize.gif) no-repeat scroll right bottom;width:12px;cursor:row-resize}.rtl #content-resize-handle{background-image:url(../images/resize-rtl.gif);background-position:left bottom}.wp-editor-expand #content-resize-handle{display:none}#postdivrich #content{resize:none}#wp-word-count{display:block;padding:2px 10px}#wp-content-editor-container{position:relative}.wp-editor-expand #wp-content-editor-tools{z-index:1000;border-bottom:1px solid #ccd0d4}.wp-editor-expand #wp-content-editor-container{box-shadow:none;margin-top:-1px}.wp-editor-expand #wp-content-editor-container{border-bottom:0 none}.wp-editor-expand div.mce-statusbar{z-index:1}.wp-editor-expand #post-status-info{border-top:1px solid #ccd0d4}.wp-editor-expand div.mce-toolbar-grp{z-index:999}.mce-fullscreen #wp-content-wrap .mce-edit-area,.mce-fullscreen #wp-content-wrap .mce-menubar,.mce-fullscreen #wp-content-wrap .mce-statusbar,.mce-fullscreen #wp-content-wrap .mce-toolbar-grp{position:static!important;width:auto!important;padding:0!important}.mce-fullscreen #wp-content-wrap .mce-statusbar{visibility:visible!important}.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw{display:none}.mce-fullscreen #wp-content-wrap .mce-wp-dfw,.post-php.mce-fullscreen #wpadminbar{display:none}#wp-content-editor-tools{background-color:#f1f1f1;padding-top:20px}#poststuff #post-body.columns-2 #side-sortables{width:280px}#timestampdiv select{vertical-align:top;font-size:12px;line-height:2.33333333}#aa,#hh,#jj,#mn{padding:6px 1px;font-size:12px;line-height:1.16666666}#hh,#jj,#mn{width:2em}#aa{width:3.4em}.curtime #timestamp{padding:2px 0 1px 0;display:inline!important;height:auto!important}#post-body #visibility:before,#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-response-to:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before{color:#82878c}#post-body #visibility:before,#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before,#post-body .misc-pub-response-to:before,#post-body .misc-pub-revisions:before,.curtime #timestamp:before{font:normal 20px/1 dashicons;speak:none;display:inline-block;margin-left:-1px;padding-right:3px;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#post-body .misc-pub-comment-status:before,#post-body .misc-pub-post-status:before{content:"\f173"}#post-body #visibility:before{content:"\f177"}.curtime #timestamp:before{content:"\f145";position:relative;top:-1px}#post-body .misc-pub-revisions:before{content:"\f321"}#post-body .misc-pub-response-to:before{content:"\f101"}#timestampdiv{padding-top:5px;line-height:1.76923076}#timestampdiv p{margin:8px 0 6px}#timestampdiv input{text-align:center}.notification-dialog{position:fixed;top:30%;max-height:70%;left:50%;width:450px;margin-left:-225px;background:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);line-height:1.5;z-index:1000005;overflow-y:auto}.notification-dialog-background{position:fixed;top:0;left:0;right:0;bottom:0;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:1000000}#post-lock-dialog .post-locked-message,#post-lock-dialog .post-taken-over{margin:25px}#file-editor-warning .button,#post-lock-dialog .post-locked-message a.button{margin-right:10px}#post-lock-dialog .post-locked-avatar{float:left;margin:0 20px 20px 0}#post-lock-dialog .wp-tab-first{outline:0}#post-lock-dialog .locked-saving img{float:left;margin-right:3px}#post-lock-dialog.saved .locked-saved,#post-lock-dialog.saving .locked-saving{display:inline}#excerpt{display:block;margin:12px 0 0;height:4em;width:100%}.tagchecklist{margin-left:14px;font-size:12px;overflow:auto}.tagchecklist br{display:none}.tagchecklist strong{margin-left:-8px;position:absolute}.tagchecklist>li{float:left;margin-right:25px;font-size:13px;line-height:1.8;cursor:default;max-width:100%;overflow:hidden;text-overflow:ellipsis}.tagchecklist .ntdelbutton{position:absolute;width:24px;height:24px;border:none;margin:0 0 0 -19px;padding:0;background:0 0;cursor:pointer;text-indent:0}#poststuff .stuffbox>h3,#poststuff h2,#poststuff h3.hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4}#poststuff .stuffbox h2{padding:8px 10px}#poststuff .stuffbox>h2{border-bottom:1px solid #eee}#poststuff .inside{margin:6px 0 0 0}#poststuff .stuffbox .inside{margin:0}#poststuff .inside #page_template,#poststuff .inside #parent_id{max-width:100%}.ie8 #poststuff .inside #page_template,.ie8 #poststuff .inside #parent_id{width:250px}.post-attributes-label-wrapper{margin-bottom:.5em}.post-attributes-label{vertical-align:baseline;font-weight:600}#comment-status-radio,#post-visibility-select{line-height:1.5;margin-top:3px}#linksubmitdiv .inside,#poststuff #submitdiv .inside{margin:0;padding:0}#post-body-content,.edit-form-section{margin-bottom:20px}.wp_attachment_details .attachment-content-description{margin-top:.5385em;display:inline-block;min-height:1.6923em}.wp-privacy-policy-guide{max-width:1000px}.privacy-text-box{width:calc(100% - 260px)}.privacy-text-box-toc{float:right;width:250px;background-color:#fff}.privacy-text-box-toc p{margin:0;padding:.7em 1em;border-bottom:1px solid #eee}.privacy-text-box-toc ol{margin-left:2em}.wp-privacy-policy-guide h3{font-size:1.2em;margin:1em 0 .5em}.privacy-text-section .privacy-text-copy{float:right}.privacy-text-section{position:relative;border-top:1px solid #e3e3e3}.privacy-text-box-head,.privacy-text-section.text-removed{padding-bottom:12px}.text-removed .policy-text{font-style:italic;color:#666;font-weight:600}.privacy-text-actions{height:32px;line-height:2.46153846;padding-bottom:6px}.wp-privacy-policy-guide .policy-text h2{margin:1.2em 0 1em;padding:0}.suggested-policy-content{font-style:italic}.privacy-text-section a.return-to-top{float:right;margin-right:-250px;margin-top:6px}.hide-privacy-policy-tutorial{background-color:#fff}.hide-privacy-policy-tutorial .privacy-policy-tutorial,.hide-privacy-policy-tutorial .wp-policy-help{display:none}.policy-text{margin-bottom:1em}.policy-text div>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help),.policy-text>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help){background-color:#fff;margin:0;padding:1em}.policy-text div>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help)+:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help),.policy-text>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help)+:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help){padding-top:0}.hide-privacy-policy-tutorial>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(div):not(.privacy-policy-tutorial):not(.wp-policy-help){margin:1em 0;padding:0}.policy-text ol li,.policy-text ul li{margin-left:2em}.policy-text ul{list-style:disc}strong.privacy-policy-tutorial,strong.wp-policy-help{display:block;margin:0 0 1em}.notice.wp-pp-notice{margin:15px 0 3px}#postcustomstuff thead th{padding:5px 8px 8px;background-color:#f1f1f1}#postcustom #postcustomstuff .submit{border:0 none;float:none;padding:0 8px 8px}#side-sortables #postcustom #postcustomstuff .submit{margin:0;padding:0}#side-sortables #postcustom #postcustomstuff #the-list textarea{height:85px}#side-sortables #postcustom #postcustomstuff td.left input,#side-sortables #postcustom #postcustomstuff td.left select,#side-sortables #postcustomstuff #newmetaleft a{margin:3px 3px 0}#postcustomstuff table{margin:0;width:100%;border:1px solid #ddd;border-spacing:0;background-color:#f9f9f9}#postcustomstuff tr{vertical-align:top}#postcustomstuff table input,#postcustomstuff table select,#postcustomstuff table textarea{width:96%;margin:8px}#side-sortables #postcustomstuff table input,#side-sortables #postcustomstuff table select,#side-sortables #postcustomstuff table textarea{margin:3px}#postcustomstuff td.left,#postcustomstuff th.left{width:38%}#postcustomstuff .submit input{margin:0;width:auto}#postcustomstuff #newmetaleft a{display:inline-block;margin:0 8px 8px;text-decoration:none}.no-js #postcustomstuff #enternew{display:none}#post-body-content .compat-attachment-fields{margin-bottom:20px}.compat-attachment-fields th{padding-top:5px;padding-right:10px}#select-featured-image{padding:4px 0;overflow:hidden}#select-featured-image img{max-width:100%;height:auto;margin-bottom:10px}#select-featured-image a{float:left;clear:both}#select-featured-image .remove{display:none;margin-top:10px}.js #select-featured-image.has-featured-image .remove{display:inline-block}.no-js #select-featured-image .choose{display:none}.post-format-icon::before{display:inline-block;vertical-align:middle;height:20px;width:20px;margin-top:-4px;margin-right:7px;color:#ddd;font:normal 20px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a.post-format-icon:hover:before{color:#00a0d2}#post-formats-select{line-height:2}#post-formats-select .post-format-icon::before{top:5px}input.post-format{margin-top:1px}label.post-format-icon{margin-left:0;padding:2px 0}.post-format-icon.post-format-standard::before{content:"\f109"}.post-format-icon.post-format-image::before{content:"\f128"}.post-format-icon.post-format-gallery::before{content:"\f161"}.post-format-icon.post-format-audio::before{content:"\f127"}.post-format-icon.post-format-video::before{content:"\f126"}.post-format-icon.post-format-chat::before{content:"\f125"}.post-format-icon.post-format-status::before{content:"\f130"}.post-format-icon.post-format-aside::before{content:"\f123"}.post-format-icon.post-format-quote::before{content:"\f122"}.post-format-icon.post-format-link::before{content:"\f103"}.category-adder{margin-left:120px;padding:4px 0}.category-adder h4{margin:0 0 8px}#side-sortables .category-adder{margin:0}.categorydiv div.tabs-panel,.customlinkdiv div.tabs-panel,.posttypediv div.tabs-panel,.taxonomydiv div.tabs-panel,.wp-tab-panel{min-height:42px;max-height:200px;overflow:auto;padding:0 .9em;border:solid 1px #ddd;background-color:#fdfdfd}div.tabs-panel-active{display:block}div.tabs-panel-inactive{display:none}div.tabs-panel-active:focus{box-shadow:inset 0 0 0 1px #5b9dd9,inset 0 0 2px 1px rgba(30,140,190,.8);outline:0 none}#front-page-warning,#front-static-pages ul,.categorydiv ul.categorychecklist ul,.customlinkdiv ul.categorychecklist ul,.inline-editor ul.cat-checklist ul,.posttypediv ul.categorychecklist ul,.taxonomydiv ul.categorychecklist ul,ul.export-filters{margin-left:18px}ul.categorychecklist li{margin:0;padding:0;line-height:1.69230769;word-wrap:break-word}.categorydiv .tabs-panel,.customlinkdiv .tabs-panel,.posttypediv .tabs-panel,.taxonomydiv .tabs-panel{border-width:3px;border-style:solid}.form-wrap label{display:block;padding:2px 0}.form-field input[type=email],.form-field input[type=number],.form-field input[type=password],.form-field input[type=search],.form-field input[type=tel],.form-field input[type=text],.form-field input[type=url],.form-field textarea{border-style:solid;border-width:1px;width:95%}.form-field p,.form-field select{max-width:95%}.form-wrap p,p.description{margin:2px 0 5px;color:#666}.form-wrap p,p.description,p.help,span.description{font-size:13px;font-style:italic}p.description code{font-style:normal}.form-wrap .form-field{margin:1em 0;padding:0}.col-wrap h2{margin:12px 0;font-size:1.1em}.col-wrap p.submit{margin-top:-10px}.edit-term-notes{margin-top:2em}#poststuff .tagsdiv .ajaxtag{margin-top:1em}#poststuff .tagsdiv .howto{margin:1em 0 6px 0}.ajaxtag .newtag{position:relative}.tagsdiv .newtag{width:180px}.tagsdiv .the-tags{display:block;height:60px;margin:0 auto;overflow:auto;width:260px}#post-body-content .tagsdiv .the-tags{margin:0 5px}p.popular-tags{border:none;line-height:2em;padding:8px 12px 12px;text-align:justify}p.popular-tags a{padding:0 3px}.tagcloud{width:97%;margin:0 0 40px;text-align:justify}.tagcloud h2{margin:2px 0 12px}#poststuff .inside .the-tagcloud{margin:5px 0 10px;padding:8px;border:1px solid #ddd;line-height:1.2;word-spacing:3px}.the-tagcloud ul{margin:0}.the-tagcloud ul li{display:inline-block}.ac_results{display:none;margin:-1px 0 0;padding:0;list-style:none;position:absolute;z-index:10000;border:1px solid #5b9dd9;background-color:#fff}.wp-customizer .ac_results{z-index:500000}.ac_results li{margin:0;padding:5px 10px;white-space:nowrap;text-align:left}.ac_over .ac_match,.ac_results .ac_over{background-color:#0073aa;color:#fff;cursor:pointer}.ac_match{text-decoration:underline}#addtag .spinner{float:none;vertical-align:top}#edittag{max-width:800px}.edit-tag-actions{margin-top:20px}.comment-php .wp-editor-area{height:200px}.comment-ays td,.comment-ays th{padding:10px 15px}.comment-ays .comment-content ul{list-style:initial;margin-left:2em}.comment-ays .comment-content a[href]:after{content:"(" attr(href) ")";display:inline-block;padding:0 4px;color:#72777c;font-size:13px;word-break:break-all}.comment-ays .comment-content p.edit-comment{margin-top:10px}.comment-ays .comment-content p.edit-comment a[href]:after{content:"";padding:0}.comment-ays-submit .button-cancel{margin-left:1em}.spam-undo-inside,.trash-undo-inside{margin:1px 8px 1px 0;line-height:1.23076923}.spam-undo-inside .avatar,.trash-undo-inside .avatar{height:20px;width:20px;margin-right:8px;vertical-align:middle}.stuffbox .editcomment{clear:none;margin-top:0}#namediv.stuffbox .editcomment input{width:100%}#namediv.stuffbox .editcomment.form-table td{padding:10px}#comment-status-radio p{margin:3px 0 5px}#comment-status-radio input{margin:2px 3px 5px 0;vertical-align:middle}#comment-status-radio label{padding:5px 0}table.links-table{width:100%;border-spacing:0}.links-table th{font-weight:400;text-align:left;vertical-align:top;min-width:80px;width:20%;word-wrap:break-word}.links-table td,.links-table th{padding:5px 0}.links-table td label{margin-right:8px}.links-table td input[type=text],.links-table td textarea{width:100%}.links-table #link_rel{max-width:280px}#qt_content_dfw{display:none}.wp-editor-expand #qt_content_dfw{display:inline-block}.focus-on #screen-meta,.focus-on #screen-meta-links,.focus-on #wp-toolbar,.focus-on #wpfooter,.focus-on .page-title-action,.focus-on .postbox-container>*,.focus-on .update-nag,.focus-on .wrap>h1,.focus-on div.error,.focus-on div.notice,.focus-on div.updated{opacity:0;transition-duration:.6s;transition-property:opacity;transition-timing-function:ease-in-out}.focus-on #wp-toolbar{opacity:.3}.focus-off #screen-meta,.focus-off #screen-meta-links,.focus-off #wp-toolbar,.focus-off #wpfooter,.focus-off .page-title-action,.focus-off .postbox-container>*,.focus-off .update-nag,.focus-off .wrap>h1,.focus-off div.error,.focus-off div.notice,.focus-off div.updated{opacity:1;transition-duration:.2s;transition-property:opacity;transition-timing-function:ease-in-out}.focus-off #wp-toolbar{-webkit-transform:translate(0,0)}.focus-on #adminmenuback,.focus-on #adminmenuwrap{transition-duration:.6s;transition-property:transform;transition-timing-function:ease-in-out}.focus-on #adminmenuback,.focus-on #adminmenuwrap{transform:translateX(-100%)}.focus-off #adminmenuback,.focus-off #adminmenuwrap{transform:translateX(0);transition-duration:.2s;transition-property:transform;transition-timing-function:ease-in-out}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){#content-resize-handle,#post-body .wp_themeSkin .mceStatusbar a.mceResize{background:transparent url(../images/resize-2x.gif) no-repeat scroll right bottom;background-size:11px 11px}.rtl #content-resize-handle,.rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize{background-image:url(../images/resize-rtl-2x.gif);background-position:left bottom}}@media only screen and (max-width:1200px){.post-type-attachment #poststuff{min-width:0}.post-type-attachment #wpbody-content #poststuff #post-body{margin:0}.post-type-attachment #wpbody-content #post-body.columns-2 #postbox-container-1{margin-right:0;width:100%}.post-type-attachment #poststuff #postbox-container-1 #side-sortables:empty,.post-type-attachment #poststuff #postbox-container-1 .empty-container{border:0 none;height:0;min-height:0}.post-type-attachment #poststuff #post-body.columns-2 #side-sortables{min-height:0;width:auto}.post-type-attachment .columns-prefs,.post-type-attachment .screen-layout{display:none}}@media only screen and (max-width:850px){#poststuff{min-width:0}#wpbody-content #poststuff #post-body{margin:0}#wpbody-content #post-body.columns-2 #postbox-container-1{margin-right:0;width:100%}#poststuff #postbox-container-1 #side-sortables:empty,#poststuff #postbox-container-1 .empty-container{border:0 none;height:0;min-height:0}#poststuff #post-body.columns-2 #side-sortables{min-height:0;width:auto}.columns-prefs,.screen-layout{display:none}}@media screen and (max-width:782px){.wp-core-ui .edit-tag-actions .button-primary{margin-bottom:0}#post-body-content{min-width:0}#titlediv #title-prompt-text{padding:10px 10px}#poststuff .stuffbox .inside{padding:0 2px 4px 0}#poststuff .stuffbox>h3,#poststuff h2,#poststuff h3.hndle{padding:12px}#namediv.stuffbox .editcomment.form-table td{padding:5px 10px}.post-format-options{padding-right:0}.post-format-options a{margin-right:5px;margin-bottom:5px;min-width:52px}.post-format-options .post-format-title{font-size:11px}.post-format-options a div{height:28px;width:28px}.post-format-options a div:before{font-size:26px!important}#post-visibility-select{line-height:280%}.wp-core-ui .save-post-visibility,.wp-core-ui .save-timestamp{vertical-align:middle;margin-right:15px}.timestamp-wrap select#mm{display:block;width:100%;margin-bottom:10px}.timestamp-wrap #aa,.timestamp-wrap #hh,.timestamp-wrap #jj,.timestamp-wrap #mn{padding:12px 3px;font-size:14px;margin-bottom:5px;width:auto;text-align:center}ul.category-tabs{margin:30px 0 15px}ul.category-tabs li.tabs{padding:15px}ul.categorychecklist li{margin-bottom:15px}ul.categorychecklist ul{margin-top:15px}.category-add input[type=text],.category-add select{max-width:none;margin-bottom:15px}.tagsdiv .newtag{width:100%;height:auto;margin-bottom:15px}.tagchecklist{margin:25px 10px}.tagchecklist>li{font-size:16px;line-height:1.4}#commentstatusdiv p{line-height:2.8}.mceToolbar *{white-space:normal!important}.mceToolbar td,.mceToolbar tr{float:left!important}.wp_themeSkin a.mceButton{width:30px;height:30px}.wp_themeSkin .mceButton .mceIcon{margin-top:5px;margin-left:5px}.wp_themeSkin .mceSplitButton{margin-top:1px}.wp_themeSkin .mceSplitButton td a.mceAction{padding-top:6px;padding-bottom:6px;padding-left:6px;padding-right:3px}.wp_themeSkin .mceSplitButton td a.mceOpen,.wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen{padding-top:6px;padding-bottom:6px;background-position:1px 6px}.wp_themeSkin table.mceListBox{margin:5px}div.quicktags-toolbar input{padding:10px 20px}button.wp-switch-editor{font-size:16px;line-height:1;margin:7px 0 0 7px;padding:8px 12px}#wp-content-media-buttons a{font-size:14px;padding:6px 10px}.wp-media-buttons span.jetpack-contact-form-icon,.wp-media-buttons span.wp-media-buttons-icon{width:22px!important;margin-left:-2px!important}.wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before,.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font-size:20px!important}#content_wp_fullscreen{display:none}.misc-pub-section{padding:20px 10px 20px}.misc-pub-section>a{float:right;font-size:16px}#delete-action,#publishing-action{line-height:3.61538461}#publishing-action .spinner{float:none;margin-top:-2px}.comment-ays td,.comment-ays th{padding-bottom:0}.comment-ays td{padding-top:6px}.links-table #link_rel{max-width:none}.links-table td,.links-table th{padding:10px 0}.privacy-text-box{width:auto}.privacy-text-box-toc{float:none;width:auto;height:100%}.privacy-text-section a.return-to-top{float:none;margin:0}} \ No newline at end of file diff --git a/wp-admin/css/farbtastic-rtl.css b/wp-admin/css/farbtastic-rtl.css new file mode 100644 index 0000000..e7c1c82 --- /dev/null +++ b/wp-admin/css/farbtastic-rtl.css @@ -0,0 +1,42 @@ +/*! This file is auto-generated */ + +.farbtastic { + position: relative; +} + +.farbtastic * { + position: absolute; + cursor: crosshair; +} + +.farbtastic, +.farbtastic .wheel { + width: 195px; + height: 195px; +} + +.farbtastic .color, +.farbtastic .overlay { + top: 47px; + right: 47px; + width: 101px; + height: 101px; +} + +.farbtastic .wheel { + background: url(../images/wheel.png) no-repeat; + width: 195px; + height: 195px; +} + +.farbtastic .overlay { + background: url(../images/mask.png) no-repeat; +} + +.farbtastic .marker { + width: 17px; + height: 17px; + margin: -8px -8px 0 0; + overflow: hidden; + background: url(../images/marker.png) no-repeat; +} diff --git a/wp-admin/css/farbtastic-rtl.min.css b/wp-admin/css/farbtastic-rtl.min.css new file mode 100644 index 0000000..26cc0c4 --- /dev/null +++ b/wp-admin/css/farbtastic-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.farbtastic{position:relative}.farbtastic *{position:absolute;cursor:crosshair}.farbtastic,.farbtastic .wheel{width:195px;height:195px}.farbtastic .color,.farbtastic .overlay{top:47px;right:47px;width:101px;height:101px}.farbtastic .wheel{background:url(../images/wheel.png) no-repeat;width:195px;height:195px}.farbtastic .overlay{background:url(../images/mask.png) no-repeat}.farbtastic .marker{width:17px;height:17px;margin:-8px -8px 0 0;overflow:hidden;background:url(../images/marker.png) no-repeat} \ No newline at end of file diff --git a/wp-admin/css/farbtastic.css b/wp-admin/css/farbtastic.css new file mode 100644 index 0000000..2bb73bf --- /dev/null +++ b/wp-admin/css/farbtastic.css @@ -0,0 +1,41 @@ + +.farbtastic { + position: relative; +} + +.farbtastic * { + position: absolute; + cursor: crosshair; +} + +.farbtastic, +.farbtastic .wheel { + width: 195px; + height: 195px; +} + +.farbtastic .color, +.farbtastic .overlay { + top: 47px; + left: 47px; + width: 101px; + height: 101px; +} + +.farbtastic .wheel { + background: url(../images/wheel.png) no-repeat; + width: 195px; + height: 195px; +} + +.farbtastic .overlay { + background: url(../images/mask.png) no-repeat; +} + +.farbtastic .marker { + width: 17px; + height: 17px; + margin: -8px 0 0 -8px; + overflow: hidden; + background: url(../images/marker.png) no-repeat; +} diff --git a/wp-admin/css/farbtastic.min.css b/wp-admin/css/farbtastic.min.css new file mode 100644 index 0000000..e276808 --- /dev/null +++ b/wp-admin/css/farbtastic.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.farbtastic{position:relative}.farbtastic *{position:absolute;cursor:crosshair}.farbtastic,.farbtastic .wheel{width:195px;height:195px}.farbtastic .color,.farbtastic .overlay{top:47px;left:47px;width:101px;height:101px}.farbtastic .wheel{background:url(../images/wheel.png) no-repeat;width:195px;height:195px}.farbtastic .overlay{background:url(../images/mask.png) no-repeat}.farbtastic .marker{width:17px;height:17px;margin:-8px 0 0 -8px;overflow:hidden;background:url(../images/marker.png) no-repeat} \ No newline at end of file diff --git a/wp-admin/css/forms-rtl.css b/wp-admin/css/forms-rtl.css new file mode 100644 index 0000000..03d8e29 --- /dev/null +++ b/wp-admin/css/forms-rtl.css @@ -0,0 +1,1703 @@ +/*! This file is auto-generated */ +/* Include margin and padding in the width calculation of input and textarea. */ +input, +select, +textarea, +button { + box-sizing: border-box; + font-family: inherit; + font-size: inherit; + font-weight: inherit; +} + +textarea, +input { + font-size: 14px; +} + +textarea { + overflow: auto; + padding: 2px 6px; + /* inherits font size 14px */ + line-height: 1.42857143; /* 20px */ + resize: vertical; +} + +label { + cursor: pointer; +} + +input, +select { + margin: 0 1px; +} + +textarea.code { + padding: 4px 6px 1px 6px; +} + +input[type="text"], +input[type="password"], +input[type="color"], +input[type="date"], +input[type="datetime"], +input[type="datetime-local"], +input[type="email"], +input[type="month"], +input[type="number"], +input[type="search"], +input[type="tel"], +input[type="time"], +input[type="url"], +input[type="week"], +select, +textarea { + box-shadow: 0 0 0 transparent; + border-radius: 4px; + border: 1px solid #7e8993; + background-color: #fff; + color: #32373c; +} + +input[type="text"], +input[type="password"], +input[type="date"], +input[type="datetime"], +input[type="datetime-local"], +input[type="email"], +input[type="month"], +input[type="number"], +input[type="search"], +input[type="tel"], +input[type="time"], +input[type="url"], +input[type="week"] { + padding: 0 8px; + /* inherits font size 14px */ + line-height: 2; /* 28px */ + /* Only necessary for IE11 */ + min-height: 30px; +} + +::-webkit-datetime-edit { + /* inherits font size 14px */ + line-height: 1.85714286; /* 26px */ +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="time"]:focus, +input[type="url"]:focus, +input[type="week"]:focus, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +/* rtl:ignore */ +input[type="email"], +input[type="url"] { + direction: ltr; +} + +input[type="checkbox"], +input[type="radio"] { + border: 1px solid #7e8993; + border-radius: 4px; + background: #fff; + color: #555; + clear: none; + cursor: pointer; + display: inline-block; + line-height: 0; + height: 1rem; + margin: -0.25rem 0 0 0.25rem; + outline: 0; + padding: 0 !important; + text-align: center; + vertical-align: middle; + width: 1rem; + min-width: 1rem; + -webkit-appearance: none; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + transition: .05s border-color ease-in-out; +} + +input[type="radio"]:checked + label:before { + color: #82878c; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #00a0d2; +} + +td > input[type="checkbox"], +.wp-admin p input[type="checkbox"], +.wp-admin p input[type="radio"] { + margin-top: 0; +} + +.wp-admin p label input[type="checkbox"] { + margin-top: -4px; +} + +.wp-admin p label input[type="radio"] { + margin-top: -2px; +} + +input[type="radio"] { + border-radius: 50%; + margin-left: 0.25rem; + /* 10px not sure if still necessary, comes from the MP6 redesign in r26072 */ + line-height: 0.71428571; +} + +input[type="checkbox"]:checked::before, +input[type="radio"]:checked::before { + float: right; + display: inline-block; + vertical-align: middle; + width: 1rem; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +input[type="checkbox"]:checked::before { + /* Use the "Yes" SVG Dashicon */ + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%231e8cbe%27%2F%3E%3C%2Fsvg%3E"); + margin: -0.1875rem -0.25rem 0 0; + height: 1.3125rem; + width: 1.3125rem; +} + +input[type="radio"]:checked::before { + content: ""; + border-radius: 50%; + width: 0.5rem; /* 8px */ + height: 0.5rem; /* 8px */ + margin: 0.1875rem; /* 3px */ + background-color: #1e8cbe; + /* 16px not sure if still necessary, comes from the MP6 redesign in r26072 */ + line-height: 1.14285714; +} + +@-moz-document url-prefix() { + input[type="checkbox"], + input[type="radio"], + .form-table input.tog { + margin-bottom: -1px; + } +} + +/* Search */ +input[type="search"] { + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration { + display: none; +} + +.wp-admin input[type="file"] { + padding: 3px 0; + cursor: pointer; +} + +input.readonly, +input[readonly], +textarea.readonly, +textarea[readonly] { + background-color: #eee; +} + +::-webkit-input-placeholder { + color: #72777c; +} + +::-moz-placeholder { + color: #72777c; + opacity: 1; +} + +:-ms-input-placeholder { + color: #72777c; +} + +.form-invalid input, +.form-invalid input:focus, +.form-invalid select, +.form-invalid select:focus { + border-color: #dc3232 !important; + box-shadow: 0 0 2px rgba(204, 0, 0, 0.8); +} + +.form-table .form-required.form-invalid td:after { + content: "\f534"; + font: normal 20px/1 dashicons; + color: #dc3232; + margin-right: -25px; + vertical-align: middle; +} + +/* Adjust error indicator for password layout */ +.form-table .form-required.user-pass1-wrap.form-invalid td:after { + content: ""; +} + +.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after { + content: "\f534"; + font: normal 20px/1 dashicons; + color: #dc3232; + margin: 0 -29px 0 6px; + vertical-align: middle; +} + +.form-input-tip { + color: #666; +} + +input:disabled, +input.disabled, +select:disabled, +select.disabled, +textarea:disabled, +textarea.disabled { + background: rgba(255, 255, 255, 0.5); + border-color: rgba(222, 222, 222, 0.75); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.04); + color: rgba(51, 51, 51, 0.5); +} + +input[type="file"]:disabled, +input[type="file"].disabled, +input[type="range"]:disabled, +input[type="range"].disabled { + background: none; + box-shadow: none; + cursor: default; +} + +input[type="checkbox"]:disabled, +input[type="checkbox"].disabled, +input[type="radio"]:disabled, +input[type="radio"].disabled, +input[type="checkbox"]:disabled:checked:before, +input[type="checkbox"].disabled:checked:before, +input[type="radio"]:disabled:checked:before, +input[type="radio"].disabled:checked:before { + opacity: 0.7; +} + +/*------------------------------------------------------------------------------ + 2.0 - Forms +------------------------------------------------------------------------------*/ + +/* Select styles are based on the default button in buttons.css */ +.wp-core-ui select { + font-size: 14px; + line-height: 2; /* 28px */ + color: #32373c; + border-color: #7e8993; + box-shadow: none; + border-radius: 3px; + padding: 0 8px 0 24px; + min-height: 30px; + max-width: 25rem; + -webkit-appearance: none; + /* The SVG is arrow-down-alt2 from Dashicons. */ + background: #fff url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E') no-repeat left 5px top 55%; + background-size: 16px 16px; + cursor: pointer; + vertical-align: middle; +}e + +.wp-core-ui select:hover { + color: #007cba; +} + +.wp-core-ui select:focus { + border-color: #007cba; + color: #016087; + box-shadow: 0 0 0 1px #007cba; +} + +.wp-core-ui select:active { + border-color: #999; + box-shadow: none; +} + +.wp-core-ui select.disabled, +.wp-core-ui select:disabled { + color: #a0a5aa; + border-color: #ddd; + background-color: #f7f7f7; + /* The SVG is arrow-down-alt2 from Dashicons. */ + background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23a0a5aa%22%2F%3E%3C%2Fsvg%3E'); + box-shadow: none; + text-shadow: 0 1px 0 #fff; + cursor: default; + transform: none; +} + +/* Reset Firefox inner outline that appears on :focus. */ +/* This ruleset overrides the color change on :focus thus needs to be after select:focus. */ +.wp-core-ui select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #016087; +} + +/* Remove background focus style from IE11 while keeping focus style available on option elements. */ +.wp-core-ui select::-ms-value { + background: transparent; + color: #555; +} + +.wp-core-ui select:hover::-ms-value { + color: #007cba; +} + +.wp-core-ui select:focus::-ms-value { + color: #016087; +} + +.wp-core-ui select.disabled::-ms-value, +.wp-core-ui select:disabled::-ms-value { + color: #a0a5aa; +} + +/* Hide the native down arrow for select element on IE. */ +.wp-core-ui select::-ms-expand { + display: none; +} + +.wp-admin .button-cancel { + display: inline-block; + min-height: 28px; + padding: 0 5px; + line-height: 2; +} + +.meta-box-sortables select { + max-width: 100%; +} + +.meta-box-sortables input { + vertical-align: middle; +} + +.misc-pub-post-status select { + margin-top: 0; +} + +.wp-core-ui select[multiple] { + height: auto; + padding-left: 8px; + background: #fff; +} + +.submit { + padding: 1.5em 0; + margin: 5px 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border: none; +} + +form p.submit a.cancel:hover { + text-decoration: none; +} + +p.submit { + text-align: right; + max-width: 100%; + margin-top: 20px; + padding-top: 10px; +} + +.textright p.submit { + border: none; + text-align: left; +} + +table.form-table + p.submit, +table.form-table + input + p.submit, +table.form-table + input + input + p.submit { + border-top: none; + padding-top: 0; +} + +#minor-publishing-actions input, +#major-publishing-actions input, +#minor-publishing-actions .preview { + text-align: center; +} + +textarea.all-options, +input.all-options { + width: 250px; +} + +input.large-text, +textarea.large-text { + width: 99%; +} + +.regular-text { + width: 25em; +} + +input.small-text { + width: 50px; + padding: 0 6px; +} + +input[type="number"].small-text { + width: 65px; + padding-left: 0; +} + +input.tiny-text { + width: 35px; +} + +input[type="number"].tiny-text { + width: 45px; + padding-left: 0; +} + +#doaction, +#doaction2, +#post-query-submit { + margin: 0 0 0 8px; +} + +.tablenav .actions select { + float: right; + margin-left: 6px; + max-width: 12.5rem; +} + +#timezone_string option { + margin-right: 1em; +} + +.wp-hide-pw > .dashicons, +.wp-cancel-pw > .dashicons { + position: relative; + top: 3px; + width: 1.25rem; + height: 1.25rem; + top: 0.25rem; + font-size: 20px; +} + +.wp-cancel-pw .dashicons-no { + display: none; +} + +label, +#your-profile label + a { + vertical-align: middle; +} + +fieldset label, +#your-profile label + a { + vertical-align: middle; +} + +.options-media-php [for*="_size_"] { + min-width: 10em; + vertical-align: baseline; +} + +.options-media-php .small-text[name*="_size_"] { + margin: 0 0 1em; +} + +#misc-publishing-actions label { + vertical-align: baseline; +} + +#pass-strength-result { + background-color: #eee; + border: 1px solid #ddd; + color: #23282d; + margin: -1px 1px 5px; + padding: 3px 5px; + text-align: center; + width: 25em; + box-sizing: border-box; + opacity: 0; +} + +#pass-strength-result.short { + background-color: #f1adad; + border-color: #e35b5b; + opacity: 1; +} + +#pass-strength-result.bad { + background-color: #fbc5a9; + border-color: #f78b53; + opacity: 1; +} + +#pass-strength-result.good { + background-color: #ffe399; + border-color: #ffc733; + opacity: 1; +} + +#pass-strength-result.strong { + background-color: #c1e1b9; + border-color: #83c373; + opacity: 1; +} + +#pass1.short, #pass1-text.short { + border-color: #e35b5b; +} + +#pass1.bad, #pass1-text.bad { + border-color: #f78b53; +} + +#pass1.good, #pass1-text.good { + border-color: #ffc733; +} + +#pass1.strong, #pass1-text.strong { + border-color: #83c373; +} + +.pw-weak { + display: none; +} + +.indicator-hint { + padding-top: 8px; +} + +.wp-pwd [type="text"], +.wp-pwd [type="password"] { + margin-bottom: 0; + /* Same height as the buttons */ + min-height: 30px; +} + +/* Hide the Edge "reveal password" native button */ +.wp-pwd input::-ms-reveal { + display: none; +} + +#pass1-text, +.show-password #pass1 { + display: none; +} + +#pass1-text::-ms-clear { + display: none; +} + +.show-password #pass1-text { + display: inline-block; +} + +p.search-box { + float: left; + margin: 0; +} + +.network-admin.themes-php p.search-box { + clear: right; +} + +.search-box input[name="s"], +.tablenav .search-plugins input[name="s"], +.tagsdiv .newtag { + float: right; + margin: 0 0 0 4px; +} + +.js.plugins-php .search-box .wp-filter-search { + margin: 0; + width: 280px; +} + +input[type="text"].ui-autocomplete-loading, +input[type="email"].ui-autocomplete-loading { + background-image: url(../images/loading.gif); + background-repeat: no-repeat; + background-position: left center; + visibility: visible; +} + +input.ui-autocomplete-input.open { + border-bottom-color: transparent; +} + +ul#add-to-blog-users { + margin: 0 14px 0 0; +} + +.ui-autocomplete { + padding: 0; + margin: 0; + list-style: none; + position: absolute; + z-index: 10000; + border: 1px solid #5b9dd9; + box-shadow: 0 1px 2px rgba(30, 140, 190, 0.8); + background-color: #fff; +} + +.ui-autocomplete li { + margin-bottom: 0; + padding: 4px 10px; + white-space: nowrap; + text-align: right; + cursor: pointer; +} + +/* Colors for the wplink toolbar autocomplete. */ +.ui-autocomplete .ui-state-focus { + background-color: #ddd; +} + +/* Colors for the tags autocomplete. */ +.wp-tags-autocomplete .ui-state-focus { + background-color: #0073aa; + color: #fff; +} + +/*------------------------------------------------------------------------------ + 15.0 - Comments Screen +------------------------------------------------------------------------------*/ + +.form-table { + border-collapse: collapse; + margin-top: 0.5em; + width: 100%; + clear: both; +} + +.form-table, +.form-table td, +.form-table th, +.form-table td p { + font-size: 14px; +} + +.form-table td { + margin-bottom: 9px; + padding: 15px 10px; + line-height: 1.3; + vertical-align: middle; +} + +.form-table th, +.form-wrap label { + color: #23282d; + font-weight: 400; + text-shadow: none; + vertical-align: baseline; +} + +.form-table th { + vertical-align: top; + text-align: right; + padding: 20px 0 20px 10px; + width: 200px; + line-height: 1.3; + font-weight: 600; +} + +.form-table th.th-full, /* Not used by core. Back-compat for pre-4.8 */ +.form-table .td-full { + width: auto; + padding: 20px 0 20px 10px; + font-weight: 400; +} + +.form-table td p { + margin-top: 4px; + margin-bottom: 0; +} + +.form-table .date-time-doc { + margin-top: 1em; +} + +.form-table p.timezone-info { + margin: 1em 0; +} + +.form-table td fieldset label { + margin: 0.25em 0 0.5em !important; + display: inline-block; +} + +.form-table td fieldset label, +.form-table td fieldset p, +.form-table td fieldset li { + line-height: 1.4; +} + +.form-table input.tog, +.form-table input[type="radio"] { + margin-top: -4px; + margin-left: 4px; + float: none; +} + +.form-table .pre { + padding: 8px; + margin: 0; +} + +table.form-table td .updated { + font-size: 13px; +} + +table.form-table td .updated p { + font-size: 13px; + margin: 0.3em 0; +} + +/*------------------------------------------------------------------------------ + 18.0 - Users +------------------------------------------------------------------------------*/ + +#profile-page .form-table textarea { + width: 500px; + margin-bottom: 6px; +} + +#profile-page .form-table #rich_editing { + margin-left: 5px +} + +#your-profile legend { + font-size: 22px; +} + +#display_name { + width: 15em; +} + +#adduser .form-field input, +#createuser .form-field input { + width: 25em; +} + +.color-option { + display: inline-block; + width: 24%; + padding: 5px 15px 15px; + box-sizing: border-box; + margin-bottom: 3px; +} + +.color-option:hover, +.color-option.selected { + background: #ddd; +} + +.color-palette { + width: 100%; + border-spacing: 0; + border-collapse: collapse; +} +.color-palette td { + height: 20px; + padding: 0; + border: none; +} + +.color-option { + cursor: pointer; +} + +/*------------------------------------------------------------------------------ + 19.0 - Tools +------------------------------------------------------------------------------*/ + +.tool-box .title { + margin: 8px 0; + font-size: 18px; + font-weight: 400; + line-height: 24px; +} + +.label-responsive { + vertical-align: middle; +} + +#export-filters p { + margin: 0 0 1em; +} + +#export-filters p.submit { + margin: 7px 0 5px; +} + +/* Card styles */ + +.card { + position: relative; + margin-top: 20px; + padding: 0.7em 2em 1em; + min-width: 255px; + max-width: 520px; + border: 1px solid #ccd0d4; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + background: #fff; + box-sizing: border-box; +} + +/* Press this styles */ + +.pressthis h4 { + margin: 2em 0 1em; +} + +.pressthis textarea { + width: 100%; + font-size: 1em; +} + +#pressthis-code-wrap { + overflow: auto; +} + +.pressthis-bookmarklet-wrapper { + margin: 20px 0 8px; + vertical-align: top; + position: relative; + z-index: 1; +} + +.pressthis-bookmarklet, +.pressthis-bookmarklet:hover, +.pressthis-bookmarklet:focus, +.pressthis-bookmarklet:active { + display: inline-block; + position: relative; + cursor: move; + color: #32373c; + background: #e5e5e5; + border-radius: 5px; + border: 1px solid #b4b9be; + font-style: normal; + line-height: 16px; + font-size: 14px; + text-decoration: none; +} + +.pressthis-bookmarklet:active { + outline: none; +} + +.pressthis-bookmarklet:after { + content: ""; + width: 70%; + height: 55%; + z-index: -1; + position: absolute; + left: 10px; + bottom: 9px; + background: transparent; + transform: skew(-20deg) rotate(-6deg); + box-shadow: 0 10px 8px rgba(0, 0, 0, 0.6); +} + +.pressthis-bookmarklet:hover:after { + transform: skew(-20deg) rotate(-9deg); + box-shadow: 0 10px 8px rgba(0, 0, 0, 0.7); +} + +.pressthis-bookmarklet span { + display: inline-block; + margin: 0px 0 0; + padding: 0px 9px 8px 12px; +} + +.pressthis-bookmarklet span:before { + color: #72777c; + font: normal 20px/1 dashicons; + content: "\f157"; + position: relative; + display: inline-block; + top: 4px; + margin-left: 4px; +} + +.pressthis-js-toggle { + margin-right: 10px; + padding: 0; + height: auto; + vertical-align: top; +} + +/* to override the button class being applied */ +.pressthis-js-toggle.button.button { + margin-right: 10px; + padding: 0; + height: auto; + vertical-align: top; +} + +.pressthis-js-toggle .dashicons { + margin: 5px 7px 6px 8px; + color: #555d66; +} + +/*------------------------------------------------------------------------------ + 20.0 - Settings +------------------------------------------------------------------------------*/ + +.timezone-info code { + white-space: nowrap; +} + +.defaultavatarpicker .avatar { + margin: 2px 0; + vertical-align: middle; +} + +.options-general-php .date-time-text { + display: inline-block; + min-width: 10em; +} + +.options-general-php input.small-text { + width: 56px; + margin: -2px 0; +} + +.options-general-php .spinner { + float: none; + margin: -3px 3px 0; +} + +.settings-php .language-install-spinner, +.options-general-php .language-install-spinner { + display: inline-block; + float: none; + margin: -3px 5px 0; + vertical-align: middle; +} + +.form-table.permalink-structure .available-structure-tags li { + float: right; + margin-left: 5px; +} + +/*------------------------------------------------------------------------------ + 21.0 - Network Admin +------------------------------------------------------------------------------*/ + +.setup-php textarea { + max-width: 100%; +} + +.form-field #site-address { + max-width: 25em; +} + +.form-field #domain { + max-width: 22em; +} + +.form-field #site-title, +.form-field #admin-email, +.form-field #path, +.form-field #blog_registered, +.form-field #blog_last_updated { + max-width: 25em; +} + +.form-field #path { + margin-bottom: 5px; +} + +#search-users, +#search-sites { + max-width: 60%; +} + +/*------------------------------------------------------------------------------ + Credentials check dialog for Install and Updates +------------------------------------------------------------------------------*/ + +.request-filesystem-credentials-dialog { + display: none; + /* The customizer uses visibility: hidden on the body for full-overlays. */ + visibility: visible; +} + +.request-filesystem-credentials-dialog .notification-dialog { + top: 10%; + max-height: 85%; +} + +.request-filesystem-credentials-dialog-content { + margin: 25px; +} + +#request-filesystem-credentials-title { + font-size: 1.3em; + margin: 1em 0; +} + +.request-filesystem-credentials-form legend { + font-size: 1em; + padding: 1.33em 0; + font-weight: 600; +} + +.request-filesystem-credentials-form input[type="text"], +.request-filesystem-credentials-form input[type="password"] { + display: block; +} + +.request-filesystem-credentials-dialog input[type="text"], +.request-filesystem-credentials-dialog input[type="password"] { + width: 100%; +} + +.request-filesystem-credentials-form .field-title { + font-weight: 600; +} + +.request-filesystem-credentials-dialog label[for="hostname"], +.request-filesystem-credentials-dialog label[for="public_key"], +.request-filesystem-credentials-dialog label[for="private_key"] { + display: block; + margin-bottom: 1em; +} + +.request-filesystem-credentials-dialog .ftp-username, +.request-filesystem-credentials-dialog .ftp-password { + float: right; + width: 48%; +} + +.request-filesystem-credentials-dialog .ftp-password { + margin-right: 4%; +} + +.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons { + text-align: left; +} + +.request-filesystem-credentials-dialog label[for="ftp"] { + margin-left: 10px; +} + +.request-filesystem-credentials-dialog #auth-keys-desc { + margin-bottom: 0; +} + +#request-filesystem-credentials-dialog .button:not(:last-child) { + margin-left: 10px; +} + +#request-filesystem-credentials-form .cancel-button { + display: none; +} + +#request-filesystem-credentials-dialog .cancel-button { + display: inline; +} + +.request-filesystem-credentials-dialog .ftp-username, +.request-filesystem-credentials-dialog .ftp-password { + float: none; + width: auto; +} + +.request-filesystem-credentials-dialog .ftp-username { + margin-bottom: 1em; +} + +.request-filesystem-credentials-dialog .ftp-password { + margin: 0; +} + +.request-filesystem-credentials-dialog .ftp-password em { + color: #888; +} + +.request-filesystem-credentials-dialog label { + display: block; + line-height: 1.5; + margin-bottom: 1em; +} + +.request-filesystem-credentials-form legend { + padding-bottom: 0; +} + +.request-filesystem-credentials-form #ssh-keys legend { + font-size: 1.3em; +} + +.request-filesystem-credentials-form .notice { + margin: 0 0 20px 0; + clear: both; +} + +/*------------------------------------------------------------------------------ + Privacy Policy settings screen +------------------------------------------------------------------------------*/ +.tools-privacy-policy-page form { + margin-bottom: 1.3em; +} + +.tools-privacy-policy-page input.button, +.tools-privacy-policy-page select { + margin: 0 6px 0 1px; +} + +.tools-privacy-edit { + margin: 1.5em 0; +} + +.tools-privacy-policy-page span { + line-height: 2; +} + +.privacy_requests .column-email { + width: 40%; +} + +.privacy_requests .column-type { + text-align: center; +} + +.privacy_requests thead td:first-child, +.privacy_requests tfoot td:first-child { + border-right: 4px solid #fff; +} + +.privacy_requests tbody th { + border-right: 4px solid #fff; + background: #fff; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.privacy_requests .row-actions { + color: #72777c; +} + +.privacy_requests .row-actions.processing { + position: static; +} + +.privacy_requests tbody .has-request-results th { + box-shadow: none; +} + +.privacy_requests tbody .request-results th .notice { + margin: 0 0 5px; +} + +.privacy_requests tbody td { + background: #fff; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.privacy_requests tbody .has-request-results td { + box-shadow: none; +} + +.privacy_requests .next_steps .button { + word-wrap: break-word; + white-space: normal; +} + +.privacy_requests .status-request-confirmed th, +.privacy_requests .status-request-confirmed td { + background-color: #f7fcfe; + border-right-color: #00a0d2; +} + +.privacy_requests .status-request-failed th, +.privacy_requests .status-request-failed td { + background-color: #fef7f1; + border-right-color: #d64d21; +} + +.privacy_requests .export_personal_data_failed a { + vertical-align: baseline; +} + +.status-label { + font-weight: 600; +} + +.status-label.status-request-pending { + font-weight: 400; + font-style: italic; + color: #6c7781; +} + +.status-label.status-request-failed { + color: #aa0000; + font-weight: 600; +} + +.wp-privacy-request-form { + clear: both; +} + +.wp-privacy-request-form-field { + margin: 1.5em 0; +} + +.wp-privacy-request-form label { + font-weight: 600; + line-height: 1.5; + padding-bottom: .5em; + display: block; +} + +.wp-privacy-request-form input { + margin: 0; +} + +.email-personal-data::before { + display: inline-block; + font: normal 20px/1 dashicons; + margin: 3px -2px 0 5px; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + vertical-align: top; +} + +.email-personal-data--sending::before { + color: #f56e28; + content: "\f463"; + animation: rotation 2s infinite linear; +} + +.email-personal-data--sent::before { + color: #79ba49; + content: "\f147"; +} + + +/* =Media Queries +-------------------------------------------------------------- */ + +@media screen and (max-width: 782px) { + /* Input Elements */ + textarea { + -webkit-appearance: none; + } + + input[type="text"], + input[type="password"], + input[type="date"], + input[type="datetime"], + input[type="datetime-local"], + input[type="email"], + input[type="month"], + input[type="number"], + input[type="search"], + input[type="tel"], + input[type="time"], + input[type="url"], + input[type="week"] { + -webkit-appearance: none; + padding: 3px 10px; + /* Only necessary for IE11 */ + min-height: 40px; + } + + ::-webkit-datetime-edit { + line-height: 1.875; /* 30px */ + } + + input[type="checkbox"], + .widefat th input[type="checkbox"], + .widefat thead td input[type="checkbox"], + .widefat tfoot td input[type="checkbox"] { + -webkit-appearance: none; + } + + .widefat th input[type="checkbox"], + .widefat thead td input[type="checkbox"], + .widefat tfoot td input[type="checkbox"] { + margin-bottom: 8px; + } + + input[type="checkbox"]:checked:before, + .widefat th input[type="checkbox"]:before, + .widefat thead td input[type="checkbox"]:before, + .widefat tfoot td input[type="checkbox"]:before { + width: 1.875rem; + height: 1.875rem; + margin: -0.1875rem -0.3125rem; + } + + input[type="radio"], + input[type="checkbox"] { + height: 1.5625rem; + width: 1.5625rem; + } + + .wp-admin p input[type="checkbox"], + .wp-admin p input[type="radio"] { + margin-top: -0.1875rem; + } + + input[type="radio"]:checked:before { + vertical-align: middle; + width: 0.5625rem; + height: 0.5625rem; + margin: 0.4375rem; + line-height: 0.76190476; + } + + .wp-upload-form input[type="submit"] { + margin-top: 10px; + } + + .wp-core-ui select, + .wp-admin .form-table select { + min-height: 40px; + font-size: 16px; + line-height: 1.625; /* 26px */ + padding: 5px 8px 5px 24px; + } + + .wp-admin .button-cancel { + margin-bottom: 0; + padding: 2px 0; + font-size: 14px; + vertical-align: middle; + } + + #adduser .form-field input, + #createuser .form-field input { + width: 100%; + } + + .form-table { + box-sizing: border-box; + } + + .form-table th, + .form-table td, + .label-responsive { + display: block; + width: auto; + vertical-align: middle; + } + + .label-responsive { + margin: 0.5em 0; + } + + .export-filters li { + margin-bottom: 0; + } + + .form-table .color-palette td { + display: table-cell; + width: 15px; + } + + .form-table table.color-palette { + margin-left: 10px; + } + + textarea, + input { + font-size: 16px; + } + + .form-table td input[type="text"], + .form-table td input[type="email"], + .form-table td input[type="password"], + .form-table td select, + .form-table td textarea, + .form-table span.description, + #profile-page .form-table textarea { + width: 100%; + display: block; + max-width: none; + box-sizing: border-box; + } + + .form-table .form-required.form-invalid td:after { + float: left; + margin: -30px 0 0 3px; + } + + input[type="text"].small-text, + input[type="search"].small-text, + input[type="password"].small-text, + input[type="number"].small-text, + input[type="number"].small-text, + .form-table input[type="text"].small-text { + width: auto; + max-width: 4.375em; /* 70px, enough for 4 digits to fit comfortably */ + display: inline; + padding: 3px 6px; + margin: 0 3px; + } + + #pass-strength-result { + width: 100%; + box-sizing: border-box; + padding: 8px; + } + + p.search-box { + float: none; + position: absolute; + bottom: 0; + width: 98%; + height: 90px; + margin-bottom: 20px; + } + + p.search-box input[name="s"] { + float: none; + width: 100%; + margin-bottom: 10px; + vertical-align: middle; + } + + p.search-box input[type="submit"] { + margin-bottom: 10px; + } + + .form-table span.description { + display: inline; + padding: 4px 0 0; + line-height: 1.4; + font-size: 14px; + } + + .form-table th { + padding-top: 10px; + padding-bottom: 0; + border-bottom: 0; + } + + .form-table td { + margin-bottom: 0; + padding-bottom: 6px; + padding-top: 4px; + padding-right: 0; + } + + .form-table.permalink-structure td code { + margin-right: 32px; + display: inline-block; + } + + .form-table.permalink-structure td input[type="text"] { + margin-right: 32px; + margin-top: 4px; + width: 96%; + } + + .form-table input.regular-text { + width: 100%; + } + + .form-table label { + font-size: 14px; + } + + .background-position-control .button-group > label { + font-size: 0; + } + + .form-table fieldset label { + display: block; + } + + #utc-time, + #local-time { + display: block; + float: none; + margin-top: 0.5em; + } + + .form-field #domain { + max-width: none; + } + + /* New Password */ + .wp-pwd { + position: relative; + } + + /* Needs higher specificity than normal input type text and password. */ + #profile-page .form-table #pass1 { + padding-left: 90px; + } + + .wp-pwd button.button { + background: transparent; + border: 1px solid transparent; + box-shadow: none; + line-height: 2; + margin: 0; + padding: 5px 9px; + position: absolute; + left: 0; + top: 0; + width: 2.375rem; + height: 2.375rem; + min-width: 40px; + min-height: 40px; + } + + .wp-pwd button.wp-hide-pw { + left: 2.5rem; + } + + .wp-pwd button.button:hover, + .wp-pwd button.button:focus { + background: transparent; + } + + .wp-pwd button.button:active { + background: transparent; + box-shadow: none; + transform: none; + } + + .wp-pwd .button .text { + display: none; + } + + .wp-pwd [type="text"], + .wp-pwd [type="password"] { + line-height: 2; + padding-left: 5rem; + } + + .wp-cancel-pw .dashicons-no { + display: inline-block; + } + + .options-general-php input[type="text"].small-text { + max-width: 6.25em; + margin: 0; + } + + /* Privacy Policy settings screen */ + .tools-privacy-policy-page form.wp-create-privacy-page { + margin-bottom: 1em; + } + + .tools-privacy-policy-page input#set-page, + .tools-privacy-policy-page select { + margin: 10px 0 0; + } + + .tools-privacy-policy-page .wp-create-privacy-page span { + display: block; + margin-bottom: 1em; + } + + .tools-privacy-policy-page .wp-create-privacy-page .button { + margin-right: 0; + } + + .wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column) { + display: table-cell; + } + + .wp-list-table.privacy_requests.widefat th input, + .wp-list-table.privacy_requests.widefat thead td input { + margin-right: 5px; + } + + .wp-privacy-request-form-field input[type="text"] { + width: 100%; + margin-bottom: 10px; + vertical-align: middle; + } + + .regular-text { + max-width: 100%; + } +} + +@media only screen and (max-width: 768px) { + .form-field input[type="text"], + .form-field input[type="email"], + .form-field input[type="password"], + .form-field select, + .form-field textarea { + width: 99%; + } + + .form-wrap .form-field { + padding: 0; + } +} + +@media only screen and (max-height: 480px), screen and (max-width: 450px) { + /* Request Credentials / File Editor Warning */ + .request-filesystem-credentials-dialog .notification-dialog, + .file-editor-warning .notification-dialog { + width: 100%; + height: 100%; + max-height: 100%; + position: fixed; + top: 0; + margin: 0; + right: 0; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + /* Color Picker Options */ + .color-option { + width: 49%; + } +} + +@media only screen and (max-width: 320px) { + .options-general-php .date-time-text.date-time-custom-text { + min-width: 0; + margin-left: 0.5em; + } +} + +@keyframes rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(-359deg); + } +} diff --git a/wp-admin/css/forms-rtl.min.css b/wp-admin/css/forms-rtl.min.css new file mode 100644 index 0000000..d63c407 --- /dev/null +++ b/wp-admin/css/forms-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +button,input,select,textarea{box-sizing:border-box;font-family:inherit;font-size:inherit;font-weight:inherit}input,textarea{font-size:14px}textarea{overflow:auto;padding:2px 6px;line-height:1.42857143;resize:vertical}label{cursor:pointer}input,select{margin:0 1px}textarea.code{padding:4px 6px 1px 6px}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=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{box-shadow:0 0 0 transparent;border-radius:4px;border:1px solid #7e8993;background-color:#fff;color:#32373c}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{padding:0 8px;line-height:2;min-height:30px}::-webkit-datetime-edit{line-height:1.85714286}input[type=checkbox]:focus,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=radio]: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{border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}input[type=email],input[type=url]{direction:ltr}input[type=checkbox],input[type=radio]{border:1px solid #7e8993;border-radius:4px;background:#fff;color:#555;clear:none;cursor:pointer;display:inline-block;line-height:0;height:1rem;margin:-.25rem 0 0 .25rem;outline:0;padding:0!important;text-align:center;vertical-align:middle;width:1rem;min-width:1rem;-webkit-appearance:none;box-shadow:inset 0 1px 2px rgba(0,0,0,.1);transition:.05s border-color ease-in-out}input[type=radio]:checked+label:before{color:#82878c}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#00a0d2}.wp-admin p input[type=checkbox],.wp-admin p input[type=radio],td>input[type=checkbox]{margin-top:0}.wp-admin p label input[type=checkbox]{margin-top:-4px}.wp-admin p label input[type=radio]{margin-top:-2px}input[type=radio]{border-radius:50%;margin-left:.25rem;line-height:.71428571}input[type=checkbox]:checked::before,input[type=radio]:checked::before{float:right;display:inline-block;vertical-align:middle;width:1rem;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%231e8cbe%27%2F%3E%3C%2Fsvg%3E);margin:-.1875rem -.25rem 0 0;height:1.3125rem;width:1.3125rem}input[type=radio]:checked::before{content:"";border-radius:50%;width:.5rem;height:.5rem;margin:.1875rem;background-color:#1e8cbe;line-height:1.14285714}@-moz-document url-prefix(){.form-table input.tog,input[type=checkbox],input[type=radio]{margin-bottom:-1px}}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration{display:none}.wp-admin input[type=file]{padding:3px 0;cursor:pointer}input.readonly,input[readonly],textarea.readonly,textarea[readonly]{background-color:#eee}::-webkit-input-placeholder{color:#72777c}::-moz-placeholder{color:#72777c;opacity:1}:-ms-input-placeholder{color:#72777c}.form-invalid input,.form-invalid input:focus,.form-invalid select,.form-invalid select:focus{border-color:#dc3232!important;box-shadow:0 0 2px rgba(204,0,0,.8)}.form-table .form-required.form-invalid td:after{content:"\f534";font:normal 20px/1 dashicons;color:#dc3232;margin-right:-25px;vertical-align:middle}.form-table .form-required.user-pass1-wrap.form-invalid td:after{content:""}.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after{content:"\f534";font:normal 20px/1 dashicons;color:#dc3232;margin:0 -29px 0 6px;vertical-align:middle}.form-input-tip{color:#666}input.disabled,input:disabled,select.disabled,select:disabled,textarea.disabled,textarea:disabled{background:rgba(255,255,255,.5);border-color:rgba(222,222,222,.75);box-shadow:inset 0 1px 2px rgba(0,0,0,.04);color:rgba(51,51,51,.5)}input[type=file].disabled,input[type=file]:disabled,input[type=range].disabled,input[type=range]:disabled{background:0 0;box-shadow:none;cursor:default}input[type=checkbox].disabled,input[type=checkbox].disabled:checked:before,input[type=checkbox]:disabled,input[type=checkbox]:disabled:checked:before,input[type=radio].disabled,input[type=radio].disabled:checked:before,input[type=radio]:disabled,input[type=radio]:disabled:checked:before{opacity:.7}.wp-core-ui select{font-size:14px;line-height:2;color:#32373c;border-color:#7e8993;box-shadow:none;border-radius:3px;padding:0 8px 0 24px;min-height:30px;max-width:25rem;-webkit-appearance:none;background:#fff url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E') no-repeat left 5px top 55%;background-size:16px 16px;cursor:pointer;vertical-align:middle}e .wp-core-ui select:hover{color:#007cba}.wp-core-ui select:focus{border-color:#007cba;color:#016087;box-shadow:0 0 0 1px #007cba}.wp-core-ui select:active{border-color:#999;box-shadow:none}.wp-core-ui select.disabled,.wp-core-ui select:disabled{color:#a0a5aa;border-color:#ddd;background-color:#f7f7f7;background-image:url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23a0a5aa%22%2F%3E%3C%2Fsvg%3E');box-shadow:none;text-shadow:0 1px 0 #fff;cursor:default;transform:none}.wp-core-ui select:-moz-focusring{color:transparent;text-shadow:0 0 0 #016087}.wp-core-ui select::-ms-value{background:0 0;color:#555}.wp-core-ui select:hover::-ms-value{color:#007cba}.wp-core-ui select:focus::-ms-value{color:#016087}.wp-core-ui select.disabled::-ms-value,.wp-core-ui select:disabled::-ms-value{color:#a0a5aa}.wp-core-ui select::-ms-expand{display:none}.wp-admin .button-cancel{display:inline-block;min-height:28px;padding:0 5px;line-height:2}.meta-box-sortables select{max-width:100%}.meta-box-sortables input{vertical-align:middle}.misc-pub-post-status select{margin-top:0}.wp-core-ui select[multiple]{height:auto;padding-left:8px;background:#fff}.submit{padding:1.5em 0;margin:5px 0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:none}form p.submit a.cancel:hover{text-decoration:none}p.submit{text-align:right;max-width:100%;margin-top:20px;padding-top:10px}.textright p.submit{border:none;text-align:left}table.form-table+input+input+p.submit,table.form-table+input+p.submit,table.form-table+p.submit{border-top:none;padding-top:0}#major-publishing-actions input,#minor-publishing-actions .preview,#minor-publishing-actions input{text-align:center}input.all-options,textarea.all-options{width:250px}input.large-text,textarea.large-text{width:99%}.regular-text{width:25em}input.small-text{width:50px;padding:0 6px}input[type=number].small-text{width:65px;padding-left:0}input.tiny-text{width:35px}input[type=number].tiny-text{width:45px;padding-left:0}#doaction,#doaction2,#post-query-submit{margin:0 0 0 8px}.tablenav .actions select{float:right;margin-left:6px;max-width:12.5rem}#timezone_string option{margin-right:1em}.wp-cancel-pw>.dashicons,.wp-hide-pw>.dashicons{position:relative;top:3px;width:1.25rem;height:1.25rem;top:.25rem;font-size:20px}.wp-cancel-pw .dashicons-no{display:none}#your-profile label+a,label{vertical-align:middle}#your-profile label+a,fieldset label{vertical-align:middle}.options-media-php [for*="_size_"]{min-width:10em;vertical-align:baseline}.options-media-php .small-text[name*="_size_"]{margin:0 0 1em}#misc-publishing-actions label{vertical-align:baseline}#pass-strength-result{background-color:#eee;border:1px solid #ddd;color:#23282d;margin:-1px 1px 5px;padding:3px 5px;text-align:center;width:25em;box-sizing:border-box;opacity:0}#pass-strength-result.short{background-color:#f1adad;border-color:#e35b5b;opacity:1}#pass-strength-result.bad{background-color:#fbc5a9;border-color:#f78b53;opacity:1}#pass-strength-result.good{background-color:#ffe399;border-color:#ffc733;opacity:1}#pass-strength-result.strong{background-color:#c1e1b9;border-color:#83c373;opacity:1}#pass1-text.short,#pass1.short{border-color:#e35b5b}#pass1-text.bad,#pass1.bad{border-color:#f78b53}#pass1-text.good,#pass1.good{border-color:#ffc733}#pass1-text.strong,#pass1.strong{border-color:#83c373}.pw-weak{display:none}.indicator-hint{padding-top:8px}.wp-pwd [type=password],.wp-pwd [type=text]{margin-bottom:0;min-height:30px}.wp-pwd input::-ms-reveal{display:none}#pass1-text,.show-password #pass1{display:none}#pass1-text::-ms-clear{display:none}.show-password #pass1-text{display:inline-block}p.search-box{float:left;margin:0}.network-admin.themes-php p.search-box{clear:right}.search-box input[name="s"],.tablenav .search-plugins input[name="s"],.tagsdiv .newtag{float:right;margin:0 0 0 4px}.js.plugins-php .search-box .wp-filter-search{margin:0;width:280px}input[type=email].ui-autocomplete-loading,input[type=text].ui-autocomplete-loading{background-image:url(../images/loading.gif);background-repeat:no-repeat;background-position:left center;visibility:visible}input.ui-autocomplete-input.open{border-bottom-color:transparent}ul#add-to-blog-users{margin:0 14px 0 0}.ui-autocomplete{padding:0;margin:0;list-style:none;position:absolute;z-index:10000;border:1px solid #5b9dd9;box-shadow:0 1px 2px rgba(30,140,190,.8);background-color:#fff}.ui-autocomplete li{margin-bottom:0;padding:4px 10px;white-space:nowrap;text-align:right;cursor:pointer}.ui-autocomplete .ui-state-focus{background-color:#ddd}.wp-tags-autocomplete .ui-state-focus{background-color:#0073aa;color:#fff}.form-table{border-collapse:collapse;margin-top:.5em;width:100%;clear:both}.form-table,.form-table td,.form-table td p,.form-table th{font-size:14px}.form-table td{margin-bottom:9px;padding:15px 10px;line-height:1.3;vertical-align:middle}.form-table th,.form-wrap label{color:#23282d;font-weight:400;text-shadow:none;vertical-align:baseline}.form-table th{vertical-align:top;text-align:right;padding:20px 0 20px 10px;width:200px;line-height:1.3;font-weight:600}.form-table .td-full,.form-table th.th-full{width:auto;padding:20px 0 20px 10px;font-weight:400}.form-table td p{margin-top:4px;margin-bottom:0}.form-table .date-time-doc{margin-top:1em}.form-table p.timezone-info{margin:1em 0}.form-table td fieldset label{margin:.25em 0 .5em!important;display:inline-block}.form-table td fieldset label,.form-table td fieldset li,.form-table td fieldset p{line-height:1.4}.form-table input.tog,.form-table input[type=radio]{margin-top:-4px;margin-left:4px;float:none}.form-table .pre{padding:8px;margin:0}table.form-table td .updated{font-size:13px}table.form-table td .updated p{font-size:13px;margin:.3em 0}#profile-page .form-table textarea{width:500px;margin-bottom:6px}#profile-page .form-table #rich_editing{margin-left:5px}#your-profile legend{font-size:22px}#display_name{width:15em}#adduser .form-field input,#createuser .form-field input{width:25em}.color-option{display:inline-block;width:24%;padding:5px 15px 15px;box-sizing:border-box;margin-bottom:3px}.color-option.selected,.color-option:hover{background:#ddd}.color-palette{width:100%;border-spacing:0;border-collapse:collapse}.color-palette td{height:20px;padding:0;border:none}.color-option{cursor:pointer}.tool-box .title{margin:8px 0;font-size:18px;font-weight:400;line-height:24px}.label-responsive{vertical-align:middle}#export-filters p{margin:0 0 1em}#export-filters p.submit{margin:7px 0 5px}.card{position:relative;margin-top:20px;padding:.7em 2em 1em;min-width:255px;max-width:520px;border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;box-sizing:border-box}.pressthis h4{margin:2em 0 1em}.pressthis textarea{width:100%;font-size:1em}#pressthis-code-wrap{overflow:auto}.pressthis-bookmarklet-wrapper{margin:20px 0 8px;vertical-align:top;position:relative;z-index:1}.pressthis-bookmarklet,.pressthis-bookmarklet:active,.pressthis-bookmarklet:focus,.pressthis-bookmarklet:hover{display:inline-block;position:relative;cursor:move;color:#32373c;background:#e5e5e5;border-radius:5px;border:1px solid #b4b9be;font-style:normal;line-height:16px;font-size:14px;text-decoration:none}.pressthis-bookmarklet:active{outline:0}.pressthis-bookmarklet:after{content:"";width:70%;height:55%;z-index:-1;position:absolute;left:10px;bottom:9px;background:0 0;transform:skew(-20deg) rotate(-6deg);box-shadow:0 10px 8px rgba(0,0,0,.6)}.pressthis-bookmarklet:hover:after{transform:skew(-20deg) rotate(-9deg);box-shadow:0 10px 8px rgba(0,0,0,.7)}.pressthis-bookmarklet span{display:inline-block;margin:0 0 0;padding:0 9px 8px 12px}.pressthis-bookmarklet span:before{color:#72777c;font:normal 20px/1 dashicons;content:"\f157";position:relative;display:inline-block;top:4px;margin-left:4px}.pressthis-js-toggle{margin-right:10px;padding:0;height:auto;vertical-align:top}.pressthis-js-toggle.button.button{margin-right:10px;padding:0;height:auto;vertical-align:top}.pressthis-js-toggle .dashicons{margin:5px 7px 6px 8px;color:#555d66}.timezone-info code{white-space:nowrap}.defaultavatarpicker .avatar{margin:2px 0;vertical-align:middle}.options-general-php .date-time-text{display:inline-block;min-width:10em}.options-general-php input.small-text{width:56px;margin:-2px 0}.options-general-php .spinner{float:none;margin:-3px 3px 0}.options-general-php .language-install-spinner,.settings-php .language-install-spinner{display:inline-block;float:none;margin:-3px 5px 0;vertical-align:middle}.form-table.permalink-structure .available-structure-tags li{float:right;margin-left:5px}.setup-php textarea{max-width:100%}.form-field #site-address{max-width:25em}.form-field #domain{max-width:22em}.form-field #admin-email,.form-field #blog_last_updated,.form-field #blog_registered,.form-field #path,.form-field #site-title{max-width:25em}.form-field #path{margin-bottom:5px}#search-sites,#search-users{max-width:60%}.request-filesystem-credentials-dialog{display:none;visibility:visible}.request-filesystem-credentials-dialog .notification-dialog{top:10%;max-height:85%}.request-filesystem-credentials-dialog-content{margin:25px}#request-filesystem-credentials-title{font-size:1.3em;margin:1em 0}.request-filesystem-credentials-form legend{font-size:1em;padding:1.33em 0;font-weight:600}.request-filesystem-credentials-form input[type=password],.request-filesystem-credentials-form input[type=text]{display:block}.request-filesystem-credentials-dialog input[type=password],.request-filesystem-credentials-dialog input[type=text]{width:100%}.request-filesystem-credentials-form .field-title{font-weight:600}.request-filesystem-credentials-dialog label[for=hostname],.request-filesystem-credentials-dialog label[for=private_key],.request-filesystem-credentials-dialog label[for=public_key]{display:block;margin-bottom:1em}.request-filesystem-credentials-dialog .ftp-password,.request-filesystem-credentials-dialog .ftp-username{float:right;width:48%}.request-filesystem-credentials-dialog .ftp-password{margin-right:4%}.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons{text-align:left}.request-filesystem-credentials-dialog label[for=ftp]{margin-left:10px}.request-filesystem-credentials-dialog #auth-keys-desc{margin-bottom:0}#request-filesystem-credentials-dialog .button:not(:last-child){margin-left:10px}#request-filesystem-credentials-form .cancel-button{display:none}#request-filesystem-credentials-dialog .cancel-button{display:inline}.request-filesystem-credentials-dialog .ftp-password,.request-filesystem-credentials-dialog .ftp-username{float:none;width:auto}.request-filesystem-credentials-dialog .ftp-username{margin-bottom:1em}.request-filesystem-credentials-dialog .ftp-password{margin:0}.request-filesystem-credentials-dialog .ftp-password em{color:#888}.request-filesystem-credentials-dialog label{display:block;line-height:1.5;margin-bottom:1em}.request-filesystem-credentials-form legend{padding-bottom:0}.request-filesystem-credentials-form #ssh-keys legend{font-size:1.3em}.request-filesystem-credentials-form .notice{margin:0 0 20px 0;clear:both}.tools-privacy-policy-page form{margin-bottom:1.3em}.tools-privacy-policy-page input.button,.tools-privacy-policy-page select{margin:0 6px 0 1px}.tools-privacy-edit{margin:1.5em 0}.tools-privacy-policy-page span{line-height:2}.privacy_requests .column-email{width:40%}.privacy_requests .column-type{text-align:center}.privacy_requests tfoot td:first-child,.privacy_requests thead td:first-child{border-right:4px solid #fff}.privacy_requests tbody th{border-right:4px solid #fff;background:#fff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.privacy_requests .row-actions{color:#72777c}.privacy_requests .row-actions.processing{position:static}.privacy_requests tbody .has-request-results th{box-shadow:none}.privacy_requests tbody .request-results th .notice{margin:0 0 5px}.privacy_requests tbody td{background:#fff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.privacy_requests tbody .has-request-results td{box-shadow:none}.privacy_requests .next_steps .button{word-wrap:break-word;white-space:normal}.privacy_requests .status-request-confirmed td,.privacy_requests .status-request-confirmed th{background-color:#f7fcfe;border-right-color:#00a0d2}.privacy_requests .status-request-failed td,.privacy_requests .status-request-failed th{background-color:#fef7f1;border-right-color:#d64d21}.privacy_requests .export_personal_data_failed a{vertical-align:baseline}.status-label{font-weight:600}.status-label.status-request-pending{font-weight:400;font-style:italic;color:#6c7781}.status-label.status-request-failed{color:#a00;font-weight:600}.wp-privacy-request-form{clear:both}.wp-privacy-request-form-field{margin:1.5em 0}.wp-privacy-request-form label{font-weight:600;line-height:1.5;padding-bottom:.5em;display:block}.wp-privacy-request-form input{margin:0}.email-personal-data::before{display:inline-block;font:normal 20px/1 dashicons;margin:3px -2px 0 5px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.email-personal-data--sending::before{color:#f56e28;content:"\f463";animation:rotation 2s infinite linear}.email-personal-data--sent::before{color:#79ba49;content:"\f147"}@media screen and (max-width:782px){textarea{-webkit-appearance:none}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:3px 10px;min-height:40px}::-webkit-datetime-edit{line-height:1.875}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox],input[type=checkbox]{-webkit-appearance:none}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox]{margin-bottom:8px}.widefat tfoot td input[type=checkbox]:before,.widefat th input[type=checkbox]:before,.widefat thead td input[type=checkbox]:before,input[type=checkbox]:checked:before{width:1.875rem;height:1.875rem;margin:-.1875rem -.3125rem}input[type=checkbox],input[type=radio]{height:1.5625rem;width:1.5625rem}.wp-admin p input[type=checkbox],.wp-admin p input[type=radio]{margin-top:-.1875rem}input[type=radio]:checked:before{vertical-align:middle;width:.5625rem;height:.5625rem;margin:.4375rem;line-height:.76190476}.wp-upload-form input[type=submit]{margin-top:10px}.wp-admin .form-table select,.wp-core-ui select{min-height:40px;font-size:16px;line-height:1.625;padding:5px 8px 5px 24px}.wp-admin .button-cancel{margin-bottom:0;padding:2px 0;font-size:14px;vertical-align:middle}#adduser .form-field input,#createuser .form-field input{width:100%}.form-table{box-sizing:border-box}.form-table td,.form-table th,.label-responsive{display:block;width:auto;vertical-align:middle}.label-responsive{margin:.5em 0}.export-filters li{margin-bottom:0}.form-table .color-palette td{display:table-cell;width:15px}.form-table table.color-palette{margin-left:10px}input,textarea{font-size:16px}#profile-page .form-table textarea,.form-table span.description,.form-table td input[type=email],.form-table td input[type=password],.form-table td input[type=text],.form-table td select,.form-table td textarea{width:100%;display:block;max-width:none;box-sizing:border-box}.form-table .form-required.form-invalid td:after{float:left;margin:-30px 0 0 3px}.form-table input[type=text].small-text,input[type=number].small-text,input[type=password].small-text,input[type=search].small-text,input[type=text].small-text{width:auto;max-width:4.375em;display:inline;padding:3px 6px;margin:0 3px}#pass-strength-result{width:100%;box-sizing:border-box;padding:8px}p.search-box{float:none;position:absolute;bottom:0;width:98%;height:90px;margin-bottom:20px}p.search-box input[name="s"]{float:none;width:100%;margin-bottom:10px;vertical-align:middle}p.search-box input[type=submit]{margin-bottom:10px}.form-table span.description{display:inline;padding:4px 0 0;line-height:1.4;font-size:14px}.form-table th{padding-top:10px;padding-bottom:0;border-bottom:0}.form-table td{margin-bottom:0;padding-bottom:6px;padding-top:4px;padding-right:0}.form-table.permalink-structure td code{margin-right:32px;display:inline-block}.form-table.permalink-structure td input[type=text]{margin-right:32px;margin-top:4px;width:96%}.form-table input.regular-text{width:100%}.form-table label{font-size:14px}.background-position-control .button-group>label{font-size:0}.form-table fieldset label{display:block}#local-time,#utc-time{display:block;float:none;margin-top:.5em}.form-field #domain{max-width:none}.wp-pwd{position:relative}#profile-page .form-table #pass1{padding-left:90px}.wp-pwd button.button{background:0 0;border:1px solid transparent;box-shadow:none;line-height:2;margin:0;padding:5px 9px;position:absolute;left:0;top:0;width:2.375rem;height:2.375rem;min-width:40px;min-height:40px}.wp-pwd button.wp-hide-pw{left:2.5rem}.wp-pwd button.button:focus,.wp-pwd button.button:hover{background:0 0}.wp-pwd button.button:active{background:0 0;box-shadow:none;transform:none}.wp-pwd .button .text{display:none}.wp-pwd [type=password],.wp-pwd [type=text]{line-height:2;padding-left:5rem}.wp-cancel-pw .dashicons-no{display:inline-block}.options-general-php input[type=text].small-text{max-width:6.25em;margin:0}.tools-privacy-policy-page form.wp-create-privacy-page{margin-bottom:1em}.tools-privacy-policy-page input#set-page,.tools-privacy-policy-page select{margin:10px 0 0}.tools-privacy-policy-page .wp-create-privacy-page span{display:block;margin-bottom:1em}.tools-privacy-policy-page .wp-create-privacy-page .button{margin-right:0}.wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column){display:table-cell}.wp-list-table.privacy_requests.widefat th input,.wp-list-table.privacy_requests.widefat thead td input{margin-right:5px}.wp-privacy-request-form-field input[type=text]{width:100%;margin-bottom:10px;vertical-align:middle}.regular-text{max-width:100%}}@media only screen and (max-width:768px){.form-field input[type=email],.form-field input[type=password],.form-field input[type=text],.form-field select,.form-field textarea{width:99%}.form-wrap .form-field{padding:0}}@media only screen and (max-height:480px),screen and (max-width:450px){.file-editor-warning .notification-dialog,.request-filesystem-credentials-dialog .notification-dialog{width:100%;height:100%;max-height:100%;position:fixed;top:0;margin:0;right:0}}@media screen and (max-width:600px){.color-option{width:49%}}@media only screen and (max-width:320px){.options-general-php .date-time-text.date-time-custom-text{min-width:0;margin-left:.5em}}@keyframes rotation{0%{transform:rotate(0)}100%{transform:rotate(-359deg)}} \ No newline at end of file diff --git a/wp-admin/css/forms.css b/wp-admin/css/forms.css new file mode 100644 index 0000000..c8de291 --- /dev/null +++ b/wp-admin/css/forms.css @@ -0,0 +1,1702 @@ +/* Include margin and padding in the width calculation of input and textarea. */ +input, +select, +textarea, +button { + box-sizing: border-box; + font-family: inherit; + font-size: inherit; + font-weight: inherit; +} + +textarea, +input { + font-size: 14px; +} + +textarea { + overflow: auto; + padding: 2px 6px; + /* inherits font size 14px */ + line-height: 1.42857143; /* 20px */ + resize: vertical; +} + +label { + cursor: pointer; +} + +input, +select { + margin: 0 1px; +} + +textarea.code { + padding: 4px 6px 1px 6px; +} + +input[type="text"], +input[type="password"], +input[type="color"], +input[type="date"], +input[type="datetime"], +input[type="datetime-local"], +input[type="email"], +input[type="month"], +input[type="number"], +input[type="search"], +input[type="tel"], +input[type="time"], +input[type="url"], +input[type="week"], +select, +textarea { + box-shadow: 0 0 0 transparent; + border-radius: 4px; + border: 1px solid #7e8993; + background-color: #fff; + color: #32373c; +} + +input[type="text"], +input[type="password"], +input[type="date"], +input[type="datetime"], +input[type="datetime-local"], +input[type="email"], +input[type="month"], +input[type="number"], +input[type="search"], +input[type="tel"], +input[type="time"], +input[type="url"], +input[type="week"] { + padding: 0 8px; + /* inherits font size 14px */ + line-height: 2; /* 28px */ + /* Only necessary for IE11 */ + min-height: 30px; +} + +::-webkit-datetime-edit { + /* inherits font size 14px */ + line-height: 1.85714286; /* 26px */ +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="color"]:focus, +input[type="date"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="email"]:focus, +input[type="month"]:focus, +input[type="number"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="time"]:focus, +input[type="url"]:focus, +input[type="week"]:focus, +input[type="checkbox"]:focus, +input[type="radio"]:focus, +select:focus, +textarea:focus { + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +/* rtl:ignore */ +input[type="email"], +input[type="url"] { + direction: ltr; +} + +input[type="checkbox"], +input[type="radio"] { + border: 1px solid #7e8993; + border-radius: 4px; + background: #fff; + color: #555; + clear: none; + cursor: pointer; + display: inline-block; + line-height: 0; + height: 1rem; + margin: -0.25rem 0.25rem 0 0; + outline: 0; + padding: 0 !important; + text-align: center; + vertical-align: middle; + width: 1rem; + min-width: 1rem; + -webkit-appearance: none; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + transition: .05s border-color ease-in-out; +} + +input[type="radio"]:checked + label:before { + color: #82878c; +} + +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active { + color: #00a0d2; +} + +td > input[type="checkbox"], +.wp-admin p input[type="checkbox"], +.wp-admin p input[type="radio"] { + margin-top: 0; +} + +.wp-admin p label input[type="checkbox"] { + margin-top: -4px; +} + +.wp-admin p label input[type="radio"] { + margin-top: -2px; +} + +input[type="radio"] { + border-radius: 50%; + margin-right: 0.25rem; + /* 10px not sure if still necessary, comes from the MP6 redesign in r26072 */ + line-height: 0.71428571; +} + +input[type="checkbox"]:checked::before, +input[type="radio"]:checked::before { + float: left; + display: inline-block; + vertical-align: middle; + width: 1rem; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +input[type="checkbox"]:checked::before { + /* Use the "Yes" SVG Dashicon */ + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%231e8cbe%27%2F%3E%3C%2Fsvg%3E"); + margin: -0.1875rem 0 0 -0.25rem; + height: 1.3125rem; + width: 1.3125rem; +} + +input[type="radio"]:checked::before { + content: ""; + border-radius: 50%; + width: 0.5rem; /* 8px */ + height: 0.5rem; /* 8px */ + margin: 0.1875rem; /* 3px */ + background-color: #1e8cbe; + /* 16px not sure if still necessary, comes from the MP6 redesign in r26072 */ + line-height: 1.14285714; +} + +@-moz-document url-prefix() { + input[type="checkbox"], + input[type="radio"], + .form-table input.tog { + margin-bottom: -1px; + } +} + +/* Search */ +input[type="search"] { + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration { + display: none; +} + +.wp-admin input[type="file"] { + padding: 3px 0; + cursor: pointer; +} + +input.readonly, +input[readonly], +textarea.readonly, +textarea[readonly] { + background-color: #eee; +} + +::-webkit-input-placeholder { + color: #72777c; +} + +::-moz-placeholder { + color: #72777c; + opacity: 1; +} + +:-ms-input-placeholder { + color: #72777c; +} + +.form-invalid input, +.form-invalid input:focus, +.form-invalid select, +.form-invalid select:focus { + border-color: #dc3232 !important; + box-shadow: 0 0 2px rgba(204, 0, 0, 0.8); +} + +.form-table .form-required.form-invalid td:after { + content: "\f534"; + font: normal 20px/1 dashicons; + color: #dc3232; + margin-left: -25px; + vertical-align: middle; +} + +/* Adjust error indicator for password layout */ +.form-table .form-required.user-pass1-wrap.form-invalid td:after { + content: ""; +} + +.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after { + content: "\f534"; + font: normal 20px/1 dashicons; + color: #dc3232; + margin: 0 6px 0 -29px; + vertical-align: middle; +} + +.form-input-tip { + color: #666; +} + +input:disabled, +input.disabled, +select:disabled, +select.disabled, +textarea:disabled, +textarea.disabled { + background: rgba(255, 255, 255, 0.5); + border-color: rgba(222, 222, 222, 0.75); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.04); + color: rgba(51, 51, 51, 0.5); +} + +input[type="file"]:disabled, +input[type="file"].disabled, +input[type="range"]:disabled, +input[type="range"].disabled { + background: none; + box-shadow: none; + cursor: default; +} + +input[type="checkbox"]:disabled, +input[type="checkbox"].disabled, +input[type="radio"]:disabled, +input[type="radio"].disabled, +input[type="checkbox"]:disabled:checked:before, +input[type="checkbox"].disabled:checked:before, +input[type="radio"]:disabled:checked:before, +input[type="radio"].disabled:checked:before { + opacity: 0.7; +} + +/*------------------------------------------------------------------------------ + 2.0 - Forms +------------------------------------------------------------------------------*/ + +/* Select styles are based on the default button in buttons.css */ +.wp-core-ui select { + font-size: 14px; + line-height: 2; /* 28px */ + color: #32373c; + border-color: #7e8993; + box-shadow: none; + border-radius: 3px; + padding: 0 24px 0 8px; + min-height: 30px; + max-width: 25rem; + -webkit-appearance: none; + /* The SVG is arrow-down-alt2 from Dashicons. */ + background: #fff url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E') no-repeat right 5px top 55%; + background-size: 16px 16px; + cursor: pointer; + vertical-align: middle; +}e + +.wp-core-ui select:hover { + color: #007cba; +} + +.wp-core-ui select:focus { + border-color: #007cba; + color: #016087; + box-shadow: 0 0 0 1px #007cba; +} + +.wp-core-ui select:active { + border-color: #999; + box-shadow: none; +} + +.wp-core-ui select.disabled, +.wp-core-ui select:disabled { + color: #a0a5aa; + border-color: #ddd; + background-color: #f7f7f7; + /* The SVG is arrow-down-alt2 from Dashicons. */ + background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23a0a5aa%22%2F%3E%3C%2Fsvg%3E'); + box-shadow: none; + text-shadow: 0 1px 0 #fff; + cursor: default; + transform: none; +} + +/* Reset Firefox inner outline that appears on :focus. */ +/* This ruleset overrides the color change on :focus thus needs to be after select:focus. */ +.wp-core-ui select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #016087; +} + +/* Remove background focus style from IE11 while keeping focus style available on option elements. */ +.wp-core-ui select::-ms-value { + background: transparent; + color: #555; +} + +.wp-core-ui select:hover::-ms-value { + color: #007cba; +} + +.wp-core-ui select:focus::-ms-value { + color: #016087; +} + +.wp-core-ui select.disabled::-ms-value, +.wp-core-ui select:disabled::-ms-value { + color: #a0a5aa; +} + +/* Hide the native down arrow for select element on IE. */ +.wp-core-ui select::-ms-expand { + display: none; +} + +.wp-admin .button-cancel { + display: inline-block; + min-height: 28px; + padding: 0 5px; + line-height: 2; +} + +.meta-box-sortables select { + max-width: 100%; +} + +.meta-box-sortables input { + vertical-align: middle; +} + +.misc-pub-post-status select { + margin-top: 0; +} + +.wp-core-ui select[multiple] { + height: auto; + padding-right: 8px; + background: #fff; +} + +.submit { + padding: 1.5em 0; + margin: 5px 0; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + border: none; +} + +form p.submit a.cancel:hover { + text-decoration: none; +} + +p.submit { + text-align: left; + max-width: 100%; + margin-top: 20px; + padding-top: 10px; +} + +.textright p.submit { + border: none; + text-align: right; +} + +table.form-table + p.submit, +table.form-table + input + p.submit, +table.form-table + input + input + p.submit { + border-top: none; + padding-top: 0; +} + +#minor-publishing-actions input, +#major-publishing-actions input, +#minor-publishing-actions .preview { + text-align: center; +} + +textarea.all-options, +input.all-options { + width: 250px; +} + +input.large-text, +textarea.large-text { + width: 99%; +} + +.regular-text { + width: 25em; +} + +input.small-text { + width: 50px; + padding: 0 6px; +} + +input[type="number"].small-text { + width: 65px; + padding-right: 0; +} + +input.tiny-text { + width: 35px; +} + +input[type="number"].tiny-text { + width: 45px; + padding-right: 0; +} + +#doaction, +#doaction2, +#post-query-submit { + margin: 0 8px 0 0; +} + +.tablenav .actions select { + float: left; + margin-right: 6px; + max-width: 12.5rem; +} + +#timezone_string option { + margin-left: 1em; +} + +.wp-hide-pw > .dashicons, +.wp-cancel-pw > .dashicons { + position: relative; + top: 3px; + width: 1.25rem; + height: 1.25rem; + top: 0.25rem; + font-size: 20px; +} + +.wp-cancel-pw .dashicons-no { + display: none; +} + +label, +#your-profile label + a { + vertical-align: middle; +} + +fieldset label, +#your-profile label + a { + vertical-align: middle; +} + +.options-media-php [for*="_size_"] { + min-width: 10em; + vertical-align: baseline; +} + +.options-media-php .small-text[name*="_size_"] { + margin: 0 0 1em; +} + +#misc-publishing-actions label { + vertical-align: baseline; +} + +#pass-strength-result { + background-color: #eee; + border: 1px solid #ddd; + color: #23282d; + margin: -1px 1px 5px; + padding: 3px 5px; + text-align: center; + width: 25em; + box-sizing: border-box; + opacity: 0; +} + +#pass-strength-result.short { + background-color: #f1adad; + border-color: #e35b5b; + opacity: 1; +} + +#pass-strength-result.bad { + background-color: #fbc5a9; + border-color: #f78b53; + opacity: 1; +} + +#pass-strength-result.good { + background-color: #ffe399; + border-color: #ffc733; + opacity: 1; +} + +#pass-strength-result.strong { + background-color: #c1e1b9; + border-color: #83c373; + opacity: 1; +} + +#pass1.short, #pass1-text.short { + border-color: #e35b5b; +} + +#pass1.bad, #pass1-text.bad { + border-color: #f78b53; +} + +#pass1.good, #pass1-text.good { + border-color: #ffc733; +} + +#pass1.strong, #pass1-text.strong { + border-color: #83c373; +} + +.pw-weak { + display: none; +} + +.indicator-hint { + padding-top: 8px; +} + +.wp-pwd [type="text"], +.wp-pwd [type="password"] { + margin-bottom: 0; + /* Same height as the buttons */ + min-height: 30px; +} + +/* Hide the Edge "reveal password" native button */ +.wp-pwd input::-ms-reveal { + display: none; +} + +#pass1-text, +.show-password #pass1 { + display: none; +} + +#pass1-text::-ms-clear { + display: none; +} + +.show-password #pass1-text { + display: inline-block; +} + +p.search-box { + float: right; + margin: 0; +} + +.network-admin.themes-php p.search-box { + clear: left; +} + +.search-box input[name="s"], +.tablenav .search-plugins input[name="s"], +.tagsdiv .newtag { + float: left; + margin: 0 4px 0 0; +} + +.js.plugins-php .search-box .wp-filter-search { + margin: 0; + width: 280px; +} + +input[type="text"].ui-autocomplete-loading, +input[type="email"].ui-autocomplete-loading { + background-image: url(../images/loading.gif); + background-repeat: no-repeat; + background-position: right center; + visibility: visible; +} + +input.ui-autocomplete-input.open { + border-bottom-color: transparent; +} + +ul#add-to-blog-users { + margin: 0 0 0 14px; +} + +.ui-autocomplete { + padding: 0; + margin: 0; + list-style: none; + position: absolute; + z-index: 10000; + border: 1px solid #5b9dd9; + box-shadow: 0 1px 2px rgba(30, 140, 190, 0.8); + background-color: #fff; +} + +.ui-autocomplete li { + margin-bottom: 0; + padding: 4px 10px; + white-space: nowrap; + text-align: left; + cursor: pointer; +} + +/* Colors for the wplink toolbar autocomplete. */ +.ui-autocomplete .ui-state-focus { + background-color: #ddd; +} + +/* Colors for the tags autocomplete. */ +.wp-tags-autocomplete .ui-state-focus { + background-color: #0073aa; + color: #fff; +} + +/*------------------------------------------------------------------------------ + 15.0 - Comments Screen +------------------------------------------------------------------------------*/ + +.form-table { + border-collapse: collapse; + margin-top: 0.5em; + width: 100%; + clear: both; +} + +.form-table, +.form-table td, +.form-table th, +.form-table td p { + font-size: 14px; +} + +.form-table td { + margin-bottom: 9px; + padding: 15px 10px; + line-height: 1.3; + vertical-align: middle; +} + +.form-table th, +.form-wrap label { + color: #23282d; + font-weight: 400; + text-shadow: none; + vertical-align: baseline; +} + +.form-table th { + vertical-align: top; + text-align: left; + padding: 20px 10px 20px 0; + width: 200px; + line-height: 1.3; + font-weight: 600; +} + +.form-table th.th-full, /* Not used by core. Back-compat for pre-4.8 */ +.form-table .td-full { + width: auto; + padding: 20px 10px 20px 0; + font-weight: 400; +} + +.form-table td p { + margin-top: 4px; + margin-bottom: 0; +} + +.form-table .date-time-doc { + margin-top: 1em; +} + +.form-table p.timezone-info { + margin: 1em 0; +} + +.form-table td fieldset label { + margin: 0.25em 0 0.5em !important; + display: inline-block; +} + +.form-table td fieldset label, +.form-table td fieldset p, +.form-table td fieldset li { + line-height: 1.4; +} + +.form-table input.tog, +.form-table input[type="radio"] { + margin-top: -4px; + margin-right: 4px; + float: none; +} + +.form-table .pre { + padding: 8px; + margin: 0; +} + +table.form-table td .updated { + font-size: 13px; +} + +table.form-table td .updated p { + font-size: 13px; + margin: 0.3em 0; +} + +/*------------------------------------------------------------------------------ + 18.0 - Users +------------------------------------------------------------------------------*/ + +#profile-page .form-table textarea { + width: 500px; + margin-bottom: 6px; +} + +#profile-page .form-table #rich_editing { + margin-right: 5px +} + +#your-profile legend { + font-size: 22px; +} + +#display_name { + width: 15em; +} + +#adduser .form-field input, +#createuser .form-field input { + width: 25em; +} + +.color-option { + display: inline-block; + width: 24%; + padding: 5px 15px 15px; + box-sizing: border-box; + margin-bottom: 3px; +} + +.color-option:hover, +.color-option.selected { + background: #ddd; +} + +.color-palette { + width: 100%; + border-spacing: 0; + border-collapse: collapse; +} +.color-palette td { + height: 20px; + padding: 0; + border: none; +} + +.color-option { + cursor: pointer; +} + +/*------------------------------------------------------------------------------ + 19.0 - Tools +------------------------------------------------------------------------------*/ + +.tool-box .title { + margin: 8px 0; + font-size: 18px; + font-weight: 400; + line-height: 24px; +} + +.label-responsive { + vertical-align: middle; +} + +#export-filters p { + margin: 0 0 1em; +} + +#export-filters p.submit { + margin: 7px 0 5px; +} + +/* Card styles */ + +.card { + position: relative; + margin-top: 20px; + padding: 0.7em 2em 1em; + min-width: 255px; + max-width: 520px; + border: 1px solid #ccd0d4; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); + background: #fff; + box-sizing: border-box; +} + +/* Press this styles */ + +.pressthis h4 { + margin: 2em 0 1em; +} + +.pressthis textarea { + width: 100%; + font-size: 1em; +} + +#pressthis-code-wrap { + overflow: auto; +} + +.pressthis-bookmarklet-wrapper { + margin: 20px 0 8px; + vertical-align: top; + position: relative; + z-index: 1; +} + +.pressthis-bookmarklet, +.pressthis-bookmarklet:hover, +.pressthis-bookmarklet:focus, +.pressthis-bookmarklet:active { + display: inline-block; + position: relative; + cursor: move; + color: #32373c; + background: #e5e5e5; + border-radius: 5px; + border: 1px solid #b4b9be; + font-style: normal; + line-height: 16px; + font-size: 14px; + text-decoration: none; +} + +.pressthis-bookmarklet:active { + outline: none; +} + +.pressthis-bookmarklet:after { + content: ""; + width: 70%; + height: 55%; + z-index: -1; + position: absolute; + right: 10px; + bottom: 9px; + background: transparent; + transform: skew(20deg) rotate(6deg); + box-shadow: 0 10px 8px rgba(0, 0, 0, 0.6); +} + +.pressthis-bookmarklet:hover:after { + transform: skew(20deg) rotate(9deg); + box-shadow: 0 10px 8px rgba(0, 0, 0, 0.7); +} + +.pressthis-bookmarklet span { + display: inline-block; + margin: 0px 0 0; + padding: 0px 12px 8px 9px; +} + +.pressthis-bookmarklet span:before { + color: #72777c; + font: normal 20px/1 dashicons; + content: "\f157"; + position: relative; + display: inline-block; + top: 4px; + margin-right: 4px; +} + +.pressthis-js-toggle { + margin-left: 10px; + padding: 0; + height: auto; + vertical-align: top; +} + +/* to override the button class being applied */ +.pressthis-js-toggle.button.button { + margin-left: 10px; + padding: 0; + height: auto; + vertical-align: top; +} + +.pressthis-js-toggle .dashicons { + margin: 5px 8px 6px 7px; + color: #555d66; +} + +/*------------------------------------------------------------------------------ + 20.0 - Settings +------------------------------------------------------------------------------*/ + +.timezone-info code { + white-space: nowrap; +} + +.defaultavatarpicker .avatar { + margin: 2px 0; + vertical-align: middle; +} + +.options-general-php .date-time-text { + display: inline-block; + min-width: 10em; +} + +.options-general-php input.small-text { + width: 56px; + margin: -2px 0; +} + +.options-general-php .spinner { + float: none; + margin: -3px 3px 0; +} + +.settings-php .language-install-spinner, +.options-general-php .language-install-spinner { + display: inline-block; + float: none; + margin: -3px 5px 0; + vertical-align: middle; +} + +.form-table.permalink-structure .available-structure-tags li { + float: left; + margin-right: 5px; +} + +/*------------------------------------------------------------------------------ + 21.0 - Network Admin +------------------------------------------------------------------------------*/ + +.setup-php textarea { + max-width: 100%; +} + +.form-field #site-address { + max-width: 25em; +} + +.form-field #domain { + max-width: 22em; +} + +.form-field #site-title, +.form-field #admin-email, +.form-field #path, +.form-field #blog_registered, +.form-field #blog_last_updated { + max-width: 25em; +} + +.form-field #path { + margin-bottom: 5px; +} + +#search-users, +#search-sites { + max-width: 60%; +} + +/*------------------------------------------------------------------------------ + Credentials check dialog for Install and Updates +------------------------------------------------------------------------------*/ + +.request-filesystem-credentials-dialog { + display: none; + /* The customizer uses visibility: hidden on the body for full-overlays. */ + visibility: visible; +} + +.request-filesystem-credentials-dialog .notification-dialog { + top: 10%; + max-height: 85%; +} + +.request-filesystem-credentials-dialog-content { + margin: 25px; +} + +#request-filesystem-credentials-title { + font-size: 1.3em; + margin: 1em 0; +} + +.request-filesystem-credentials-form legend { + font-size: 1em; + padding: 1.33em 0; + font-weight: 600; +} + +.request-filesystem-credentials-form input[type="text"], +.request-filesystem-credentials-form input[type="password"] { + display: block; +} + +.request-filesystem-credentials-dialog input[type="text"], +.request-filesystem-credentials-dialog input[type="password"] { + width: 100%; +} + +.request-filesystem-credentials-form .field-title { + font-weight: 600; +} + +.request-filesystem-credentials-dialog label[for="hostname"], +.request-filesystem-credentials-dialog label[for="public_key"], +.request-filesystem-credentials-dialog label[for="private_key"] { + display: block; + margin-bottom: 1em; +} + +.request-filesystem-credentials-dialog .ftp-username, +.request-filesystem-credentials-dialog .ftp-password { + float: left; + width: 48%; +} + +.request-filesystem-credentials-dialog .ftp-password { + margin-left: 4%; +} + +.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons { + text-align: right; +} + +.request-filesystem-credentials-dialog label[for="ftp"] { + margin-right: 10px; +} + +.request-filesystem-credentials-dialog #auth-keys-desc { + margin-bottom: 0; +} + +#request-filesystem-credentials-dialog .button:not(:last-child) { + margin-right: 10px; +} + +#request-filesystem-credentials-form .cancel-button { + display: none; +} + +#request-filesystem-credentials-dialog .cancel-button { + display: inline; +} + +.request-filesystem-credentials-dialog .ftp-username, +.request-filesystem-credentials-dialog .ftp-password { + float: none; + width: auto; +} + +.request-filesystem-credentials-dialog .ftp-username { + margin-bottom: 1em; +} + +.request-filesystem-credentials-dialog .ftp-password { + margin: 0; +} + +.request-filesystem-credentials-dialog .ftp-password em { + color: #888; +} + +.request-filesystem-credentials-dialog label { + display: block; + line-height: 1.5; + margin-bottom: 1em; +} + +.request-filesystem-credentials-form legend { + padding-bottom: 0; +} + +.request-filesystem-credentials-form #ssh-keys legend { + font-size: 1.3em; +} + +.request-filesystem-credentials-form .notice { + margin: 0 0 20px 0; + clear: both; +} + +/*------------------------------------------------------------------------------ + Privacy Policy settings screen +------------------------------------------------------------------------------*/ +.tools-privacy-policy-page form { + margin-bottom: 1.3em; +} + +.tools-privacy-policy-page input.button, +.tools-privacy-policy-page select { + margin: 0 1px 0 6px; +} + +.tools-privacy-edit { + margin: 1.5em 0; +} + +.tools-privacy-policy-page span { + line-height: 2; +} + +.privacy_requests .column-email { + width: 40%; +} + +.privacy_requests .column-type { + text-align: center; +} + +.privacy_requests thead td:first-child, +.privacy_requests tfoot td:first-child { + border-left: 4px solid #fff; +} + +.privacy_requests tbody th { + border-left: 4px solid #fff; + background: #fff; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.privacy_requests .row-actions { + color: #72777c; +} + +.privacy_requests .row-actions.processing { + position: static; +} + +.privacy_requests tbody .has-request-results th { + box-shadow: none; +} + +.privacy_requests tbody .request-results th .notice { + margin: 0 0 5px; +} + +.privacy_requests tbody td { + background: #fff; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.privacy_requests tbody .has-request-results td { + box-shadow: none; +} + +.privacy_requests .next_steps .button { + word-wrap: break-word; + white-space: normal; +} + +.privacy_requests .status-request-confirmed th, +.privacy_requests .status-request-confirmed td { + background-color: #f7fcfe; + border-left-color: #00a0d2; +} + +.privacy_requests .status-request-failed th, +.privacy_requests .status-request-failed td { + background-color: #fef7f1; + border-left-color: #d64d21; +} + +.privacy_requests .export_personal_data_failed a { + vertical-align: baseline; +} + +.status-label { + font-weight: 600; +} + +.status-label.status-request-pending { + font-weight: 400; + font-style: italic; + color: #6c7781; +} + +.status-label.status-request-failed { + color: #aa0000; + font-weight: 600; +} + +.wp-privacy-request-form { + clear: both; +} + +.wp-privacy-request-form-field { + margin: 1.5em 0; +} + +.wp-privacy-request-form label { + font-weight: 600; + line-height: 1.5; + padding-bottom: .5em; + display: block; +} + +.wp-privacy-request-form input { + margin: 0; +} + +.email-personal-data::before { + display: inline-block; + font: normal 20px/1 dashicons; + margin: 3px 5px 0 -2px; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + vertical-align: top; +} + +.email-personal-data--sending::before { + color: #f56e28; + content: "\f463"; + animation: rotation 2s infinite linear; +} + +.email-personal-data--sent::before { + color: #79ba49; + content: "\f147"; +} + + +/* =Media Queries +-------------------------------------------------------------- */ + +@media screen and (max-width: 782px) { + /* Input Elements */ + textarea { + -webkit-appearance: none; + } + + input[type="text"], + input[type="password"], + input[type="date"], + input[type="datetime"], + input[type="datetime-local"], + input[type="email"], + input[type="month"], + input[type="number"], + input[type="search"], + input[type="tel"], + input[type="time"], + input[type="url"], + input[type="week"] { + -webkit-appearance: none; + padding: 3px 10px; + /* Only necessary for IE11 */ + min-height: 40px; + } + + ::-webkit-datetime-edit { + line-height: 1.875; /* 30px */ + } + + input[type="checkbox"], + .widefat th input[type="checkbox"], + .widefat thead td input[type="checkbox"], + .widefat tfoot td input[type="checkbox"] { + -webkit-appearance: none; + } + + .widefat th input[type="checkbox"], + .widefat thead td input[type="checkbox"], + .widefat tfoot td input[type="checkbox"] { + margin-bottom: 8px; + } + + input[type="checkbox"]:checked:before, + .widefat th input[type="checkbox"]:before, + .widefat thead td input[type="checkbox"]:before, + .widefat tfoot td input[type="checkbox"]:before { + width: 1.875rem; + height: 1.875rem; + margin: -0.1875rem -0.3125rem; + } + + input[type="radio"], + input[type="checkbox"] { + height: 1.5625rem; + width: 1.5625rem; + } + + .wp-admin p input[type="checkbox"], + .wp-admin p input[type="radio"] { + margin-top: -0.1875rem; + } + + input[type="radio"]:checked:before { + vertical-align: middle; + width: 0.5625rem; + height: 0.5625rem; + margin: 0.4375rem; + line-height: 0.76190476; + } + + .wp-upload-form input[type="submit"] { + margin-top: 10px; + } + + .wp-core-ui select, + .wp-admin .form-table select { + min-height: 40px; + font-size: 16px; + line-height: 1.625; /* 26px */ + padding: 5px 24px 5px 8px; + } + + .wp-admin .button-cancel { + margin-bottom: 0; + padding: 2px 0; + font-size: 14px; + vertical-align: middle; + } + + #adduser .form-field input, + #createuser .form-field input { + width: 100%; + } + + .form-table { + box-sizing: border-box; + } + + .form-table th, + .form-table td, + .label-responsive { + display: block; + width: auto; + vertical-align: middle; + } + + .label-responsive { + margin: 0.5em 0; + } + + .export-filters li { + margin-bottom: 0; + } + + .form-table .color-palette td { + display: table-cell; + width: 15px; + } + + .form-table table.color-palette { + margin-right: 10px; + } + + textarea, + input { + font-size: 16px; + } + + .form-table td input[type="text"], + .form-table td input[type="email"], + .form-table td input[type="password"], + .form-table td select, + .form-table td textarea, + .form-table span.description, + #profile-page .form-table textarea { + width: 100%; + display: block; + max-width: none; + box-sizing: border-box; + } + + .form-table .form-required.form-invalid td:after { + float: right; + margin: -30px 3px 0 0; + } + + input[type="text"].small-text, + input[type="search"].small-text, + input[type="password"].small-text, + input[type="number"].small-text, + input[type="number"].small-text, + .form-table input[type="text"].small-text { + width: auto; + max-width: 4.375em; /* 70px, enough for 4 digits to fit comfortably */ + display: inline; + padding: 3px 6px; + margin: 0 3px; + } + + #pass-strength-result { + width: 100%; + box-sizing: border-box; + padding: 8px; + } + + p.search-box { + float: none; + position: absolute; + bottom: 0; + width: 98%; + height: 90px; + margin-bottom: 20px; + } + + p.search-box input[name="s"] { + float: none; + width: 100%; + margin-bottom: 10px; + vertical-align: middle; + } + + p.search-box input[type="submit"] { + margin-bottom: 10px; + } + + .form-table span.description { + display: inline; + padding: 4px 0 0; + line-height: 1.4; + font-size: 14px; + } + + .form-table th { + padding-top: 10px; + padding-bottom: 0; + border-bottom: 0; + } + + .form-table td { + margin-bottom: 0; + padding-bottom: 6px; + padding-top: 4px; + padding-left: 0; + } + + .form-table.permalink-structure td code { + margin-left: 32px; + display: inline-block; + } + + .form-table.permalink-structure td input[type="text"] { + margin-left: 32px; + margin-top: 4px; + width: 96%; + } + + .form-table input.regular-text { + width: 100%; + } + + .form-table label { + font-size: 14px; + } + + .background-position-control .button-group > label { + font-size: 0; + } + + .form-table fieldset label { + display: block; + } + + #utc-time, + #local-time { + display: block; + float: none; + margin-top: 0.5em; + } + + .form-field #domain { + max-width: none; + } + + /* New Password */ + .wp-pwd { + position: relative; + } + + /* Needs higher specificity than normal input type text and password. */ + #profile-page .form-table #pass1 { + padding-right: 90px; + } + + .wp-pwd button.button { + background: transparent; + border: 1px solid transparent; + box-shadow: none; + line-height: 2; + margin: 0; + padding: 5px 9px; + position: absolute; + right: 0; + top: 0; + width: 2.375rem; + height: 2.375rem; + min-width: 40px; + min-height: 40px; + } + + .wp-pwd button.wp-hide-pw { + right: 2.5rem; + } + + .wp-pwd button.button:hover, + .wp-pwd button.button:focus { + background: transparent; + } + + .wp-pwd button.button:active { + background: transparent; + box-shadow: none; + transform: none; + } + + .wp-pwd .button .text { + display: none; + } + + .wp-pwd [type="text"], + .wp-pwd [type="password"] { + line-height: 2; + padding-right: 5rem; + } + + .wp-cancel-pw .dashicons-no { + display: inline-block; + } + + .options-general-php input[type="text"].small-text { + max-width: 6.25em; + margin: 0; + } + + /* Privacy Policy settings screen */ + .tools-privacy-policy-page form.wp-create-privacy-page { + margin-bottom: 1em; + } + + .tools-privacy-policy-page input#set-page, + .tools-privacy-policy-page select { + margin: 10px 0 0; + } + + .tools-privacy-policy-page .wp-create-privacy-page span { + display: block; + margin-bottom: 1em; + } + + .tools-privacy-policy-page .wp-create-privacy-page .button { + margin-left: 0; + } + + .wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column) { + display: table-cell; + } + + .wp-list-table.privacy_requests.widefat th input, + .wp-list-table.privacy_requests.widefat thead td input { + margin-left: 5px; + } + + .wp-privacy-request-form-field input[type="text"] { + width: 100%; + margin-bottom: 10px; + vertical-align: middle; + } + + .regular-text { + max-width: 100%; + } +} + +@media only screen and (max-width: 768px) { + .form-field input[type="text"], + .form-field input[type="email"], + .form-field input[type="password"], + .form-field select, + .form-field textarea { + width: 99%; + } + + .form-wrap .form-field { + padding: 0; + } +} + +@media only screen and (max-height: 480px), screen and (max-width: 450px) { + /* Request Credentials / File Editor Warning */ + .request-filesystem-credentials-dialog .notification-dialog, + .file-editor-warning .notification-dialog { + width: 100%; + height: 100%; + max-height: 100%; + position: fixed; + top: 0; + margin: 0; + left: 0; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + /* Color Picker Options */ + .color-option { + width: 49%; + } +} + +@media only screen and (max-width: 320px) { + .options-general-php .date-time-text.date-time-custom-text { + min-width: 0; + margin-right: 0.5em; + } +} + +@keyframes rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} diff --git a/wp-admin/css/forms.min.css b/wp-admin/css/forms.min.css new file mode 100644 index 0000000..7ad47e2 --- /dev/null +++ b/wp-admin/css/forms.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +button,input,select,textarea{box-sizing:border-box;font-family:inherit;font-size:inherit;font-weight:inherit}input,textarea{font-size:14px}textarea{overflow:auto;padding:2px 6px;line-height:1.42857143;resize:vertical}label{cursor:pointer}input,select{margin:0 1px}textarea.code{padding:4px 6px 1px 6px}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=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{box-shadow:0 0 0 transparent;border-radius:4px;border:1px solid #7e8993;background-color:#fff;color:#32373c}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{padding:0 8px;line-height:2;min-height:30px}::-webkit-datetime-edit{line-height:1.85714286}input[type=checkbox]:focus,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=radio]: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{border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}input[type=email],input[type=url]{direction:ltr}input[type=checkbox],input[type=radio]{border:1px solid #7e8993;border-radius:4px;background:#fff;color:#555;clear:none;cursor:pointer;display:inline-block;line-height:0;height:1rem;margin:-.25rem .25rem 0 0;outline:0;padding:0!important;text-align:center;vertical-align:middle;width:1rem;min-width:1rem;-webkit-appearance:none;box-shadow:inset 0 1px 2px rgba(0,0,0,.1);transition:.05s border-color ease-in-out}input[type=radio]:checked+label:before{color:#82878c}.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:hover{color:#00a0d2}.wp-admin p input[type=checkbox],.wp-admin p input[type=radio],td>input[type=checkbox]{margin-top:0}.wp-admin p label input[type=checkbox]{margin-top:-4px}.wp-admin p label input[type=radio]{margin-top:-2px}input[type=radio]{border-radius:50%;margin-right:.25rem;line-height:.71428571}input[type=checkbox]:checked::before,input[type=radio]:checked::before{float:left;display:inline-block;vertical-align:middle;width:1rem;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}input[type=checkbox]:checked::before{content:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%231e8cbe%27%2F%3E%3C%2Fsvg%3E);margin:-.1875rem 0 0 -.25rem;height:1.3125rem;width:1.3125rem}input[type=radio]:checked::before{content:"";border-radius:50%;width:.5rem;height:.5rem;margin:.1875rem;background-color:#1e8cbe;line-height:1.14285714}@-moz-document url-prefix(){.form-table input.tog,input[type=checkbox],input[type=radio]{margin-bottom:-1px}}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration{display:none}.wp-admin input[type=file]{padding:3px 0;cursor:pointer}input.readonly,input[readonly],textarea.readonly,textarea[readonly]{background-color:#eee}::-webkit-input-placeholder{color:#72777c}::-moz-placeholder{color:#72777c;opacity:1}:-ms-input-placeholder{color:#72777c}.form-invalid input,.form-invalid input:focus,.form-invalid select,.form-invalid select:focus{border-color:#dc3232!important;box-shadow:0 0 2px rgba(204,0,0,.8)}.form-table .form-required.form-invalid td:after{content:"\f534";font:normal 20px/1 dashicons;color:#dc3232;margin-left:-25px;vertical-align:middle}.form-table .form-required.user-pass1-wrap.form-invalid td:after{content:""}.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after{content:"\f534";font:normal 20px/1 dashicons;color:#dc3232;margin:0 6px 0 -29px;vertical-align:middle}.form-input-tip{color:#666}input.disabled,input:disabled,select.disabled,select:disabled,textarea.disabled,textarea:disabled{background:rgba(255,255,255,.5);border-color:rgba(222,222,222,.75);box-shadow:inset 0 1px 2px rgba(0,0,0,.04);color:rgba(51,51,51,.5)}input[type=file].disabled,input[type=file]:disabled,input[type=range].disabled,input[type=range]:disabled{background:0 0;box-shadow:none;cursor:default}input[type=checkbox].disabled,input[type=checkbox].disabled:checked:before,input[type=checkbox]:disabled,input[type=checkbox]:disabled:checked:before,input[type=radio].disabled,input[type=radio].disabled:checked:before,input[type=radio]:disabled,input[type=radio]:disabled:checked:before{opacity:.7}.wp-core-ui select{font-size:14px;line-height:2;color:#32373c;border-color:#7e8993;box-shadow:none;border-radius:3px;padding:0 24px 0 8px;min-height:30px;max-width:25rem;-webkit-appearance:none;background:#fff url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E') no-repeat right 5px top 55%;background-size:16px 16px;cursor:pointer;vertical-align:middle}e .wp-core-ui select:hover{color:#007cba}.wp-core-ui select:focus{border-color:#007cba;color:#016087;box-shadow:0 0 0 1px #007cba}.wp-core-ui select:active{border-color:#999;box-shadow:none}.wp-core-ui select.disabled,.wp-core-ui select:disabled{color:#a0a5aa;border-color:#ddd;background-color:#f7f7f7;background-image:url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23a0a5aa%22%2F%3E%3C%2Fsvg%3E');box-shadow:none;text-shadow:0 1px 0 #fff;cursor:default;transform:none}.wp-core-ui select:-moz-focusring{color:transparent;text-shadow:0 0 0 #016087}.wp-core-ui select::-ms-value{background:0 0;color:#555}.wp-core-ui select:hover::-ms-value{color:#007cba}.wp-core-ui select:focus::-ms-value{color:#016087}.wp-core-ui select.disabled::-ms-value,.wp-core-ui select:disabled::-ms-value{color:#a0a5aa}.wp-core-ui select::-ms-expand{display:none}.wp-admin .button-cancel{display:inline-block;min-height:28px;padding:0 5px;line-height:2}.meta-box-sortables select{max-width:100%}.meta-box-sortables input{vertical-align:middle}.misc-pub-post-status select{margin-top:0}.wp-core-ui select[multiple]{height:auto;padding-right:8px;background:#fff}.submit{padding:1.5em 0;margin:5px 0;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border:none}form p.submit a.cancel:hover{text-decoration:none}p.submit{text-align:left;max-width:100%;margin-top:20px;padding-top:10px}.textright p.submit{border:none;text-align:right}table.form-table+input+input+p.submit,table.form-table+input+p.submit,table.form-table+p.submit{border-top:none;padding-top:0}#major-publishing-actions input,#minor-publishing-actions .preview,#minor-publishing-actions input{text-align:center}input.all-options,textarea.all-options{width:250px}input.large-text,textarea.large-text{width:99%}.regular-text{width:25em}input.small-text{width:50px;padding:0 6px}input[type=number].small-text{width:65px;padding-right:0}input.tiny-text{width:35px}input[type=number].tiny-text{width:45px;padding-right:0}#doaction,#doaction2,#post-query-submit{margin:0 8px 0 0}.tablenav .actions select{float:left;margin-right:6px;max-width:12.5rem}#timezone_string option{margin-left:1em}.wp-cancel-pw>.dashicons,.wp-hide-pw>.dashicons{position:relative;top:3px;width:1.25rem;height:1.25rem;top:.25rem;font-size:20px}.wp-cancel-pw .dashicons-no{display:none}#your-profile label+a,label{vertical-align:middle}#your-profile label+a,fieldset label{vertical-align:middle}.options-media-php [for*="_size_"]{min-width:10em;vertical-align:baseline}.options-media-php .small-text[name*="_size_"]{margin:0 0 1em}#misc-publishing-actions label{vertical-align:baseline}#pass-strength-result{background-color:#eee;border:1px solid #ddd;color:#23282d;margin:-1px 1px 5px;padding:3px 5px;text-align:center;width:25em;box-sizing:border-box;opacity:0}#pass-strength-result.short{background-color:#f1adad;border-color:#e35b5b;opacity:1}#pass-strength-result.bad{background-color:#fbc5a9;border-color:#f78b53;opacity:1}#pass-strength-result.good{background-color:#ffe399;border-color:#ffc733;opacity:1}#pass-strength-result.strong{background-color:#c1e1b9;border-color:#83c373;opacity:1}#pass1-text.short,#pass1.short{border-color:#e35b5b}#pass1-text.bad,#pass1.bad{border-color:#f78b53}#pass1-text.good,#pass1.good{border-color:#ffc733}#pass1-text.strong,#pass1.strong{border-color:#83c373}.pw-weak{display:none}.indicator-hint{padding-top:8px}.wp-pwd [type=password],.wp-pwd [type=text]{margin-bottom:0;min-height:30px}.wp-pwd input::-ms-reveal{display:none}#pass1-text,.show-password #pass1{display:none}#pass1-text::-ms-clear{display:none}.show-password #pass1-text{display:inline-block}p.search-box{float:right;margin:0}.network-admin.themes-php p.search-box{clear:left}.search-box input[name="s"],.tablenav .search-plugins input[name="s"],.tagsdiv .newtag{float:left;margin:0 4px 0 0}.js.plugins-php .search-box .wp-filter-search{margin:0;width:280px}input[type=email].ui-autocomplete-loading,input[type=text].ui-autocomplete-loading{background-image:url(../images/loading.gif);background-repeat:no-repeat;background-position:right center;visibility:visible}input.ui-autocomplete-input.open{border-bottom-color:transparent}ul#add-to-blog-users{margin:0 0 0 14px}.ui-autocomplete{padding:0;margin:0;list-style:none;position:absolute;z-index:10000;border:1px solid #5b9dd9;box-shadow:0 1px 2px rgba(30,140,190,.8);background-color:#fff}.ui-autocomplete li{margin-bottom:0;padding:4px 10px;white-space:nowrap;text-align:left;cursor:pointer}.ui-autocomplete .ui-state-focus{background-color:#ddd}.wp-tags-autocomplete .ui-state-focus{background-color:#0073aa;color:#fff}.form-table{border-collapse:collapse;margin-top:.5em;width:100%;clear:both}.form-table,.form-table td,.form-table td p,.form-table th{font-size:14px}.form-table td{margin-bottom:9px;padding:15px 10px;line-height:1.3;vertical-align:middle}.form-table th,.form-wrap label{color:#23282d;font-weight:400;text-shadow:none;vertical-align:baseline}.form-table th{vertical-align:top;text-align:left;padding:20px 10px 20px 0;width:200px;line-height:1.3;font-weight:600}.form-table .td-full,.form-table th.th-full{width:auto;padding:20px 10px 20px 0;font-weight:400}.form-table td p{margin-top:4px;margin-bottom:0}.form-table .date-time-doc{margin-top:1em}.form-table p.timezone-info{margin:1em 0}.form-table td fieldset label{margin:.25em 0 .5em!important;display:inline-block}.form-table td fieldset label,.form-table td fieldset li,.form-table td fieldset p{line-height:1.4}.form-table input.tog,.form-table input[type=radio]{margin-top:-4px;margin-right:4px;float:none}.form-table .pre{padding:8px;margin:0}table.form-table td .updated{font-size:13px}table.form-table td .updated p{font-size:13px;margin:.3em 0}#profile-page .form-table textarea{width:500px;margin-bottom:6px}#profile-page .form-table #rich_editing{margin-right:5px}#your-profile legend{font-size:22px}#display_name{width:15em}#adduser .form-field input,#createuser .form-field input{width:25em}.color-option{display:inline-block;width:24%;padding:5px 15px 15px;box-sizing:border-box;margin-bottom:3px}.color-option.selected,.color-option:hover{background:#ddd}.color-palette{width:100%;border-spacing:0;border-collapse:collapse}.color-palette td{height:20px;padding:0;border:none}.color-option{cursor:pointer}.tool-box .title{margin:8px 0;font-size:18px;font-weight:400;line-height:24px}.label-responsive{vertical-align:middle}#export-filters p{margin:0 0 1em}#export-filters p.submit{margin:7px 0 5px}.card{position:relative;margin-top:20px;padding:.7em 2em 1em;min-width:255px;max-width:520px;border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04);background:#fff;box-sizing:border-box}.pressthis h4{margin:2em 0 1em}.pressthis textarea{width:100%;font-size:1em}#pressthis-code-wrap{overflow:auto}.pressthis-bookmarklet-wrapper{margin:20px 0 8px;vertical-align:top;position:relative;z-index:1}.pressthis-bookmarklet,.pressthis-bookmarklet:active,.pressthis-bookmarklet:focus,.pressthis-bookmarklet:hover{display:inline-block;position:relative;cursor:move;color:#32373c;background:#e5e5e5;border-radius:5px;border:1px solid #b4b9be;font-style:normal;line-height:16px;font-size:14px;text-decoration:none}.pressthis-bookmarklet:active{outline:0}.pressthis-bookmarklet:after{content:"";width:70%;height:55%;z-index:-1;position:absolute;right:10px;bottom:9px;background:0 0;transform:skew(20deg) rotate(6deg);box-shadow:0 10px 8px rgba(0,0,0,.6)}.pressthis-bookmarklet:hover:after{transform:skew(20deg) rotate(9deg);box-shadow:0 10px 8px rgba(0,0,0,.7)}.pressthis-bookmarklet span{display:inline-block;margin:0 0 0;padding:0 12px 8px 9px}.pressthis-bookmarklet span:before{color:#72777c;font:normal 20px/1 dashicons;content:"\f157";position:relative;display:inline-block;top:4px;margin-right:4px}.pressthis-js-toggle{margin-left:10px;padding:0;height:auto;vertical-align:top}.pressthis-js-toggle.button.button{margin-left:10px;padding:0;height:auto;vertical-align:top}.pressthis-js-toggle .dashicons{margin:5px 8px 6px 7px;color:#555d66}.timezone-info code{white-space:nowrap}.defaultavatarpicker .avatar{margin:2px 0;vertical-align:middle}.options-general-php .date-time-text{display:inline-block;min-width:10em}.options-general-php input.small-text{width:56px;margin:-2px 0}.options-general-php .spinner{float:none;margin:-3px 3px 0}.options-general-php .language-install-spinner,.settings-php .language-install-spinner{display:inline-block;float:none;margin:-3px 5px 0;vertical-align:middle}.form-table.permalink-structure .available-structure-tags li{float:left;margin-right:5px}.setup-php textarea{max-width:100%}.form-field #site-address{max-width:25em}.form-field #domain{max-width:22em}.form-field #admin-email,.form-field #blog_last_updated,.form-field #blog_registered,.form-field #path,.form-field #site-title{max-width:25em}.form-field #path{margin-bottom:5px}#search-sites,#search-users{max-width:60%}.request-filesystem-credentials-dialog{display:none;visibility:visible}.request-filesystem-credentials-dialog .notification-dialog{top:10%;max-height:85%}.request-filesystem-credentials-dialog-content{margin:25px}#request-filesystem-credentials-title{font-size:1.3em;margin:1em 0}.request-filesystem-credentials-form legend{font-size:1em;padding:1.33em 0;font-weight:600}.request-filesystem-credentials-form input[type=password],.request-filesystem-credentials-form input[type=text]{display:block}.request-filesystem-credentials-dialog input[type=password],.request-filesystem-credentials-dialog input[type=text]{width:100%}.request-filesystem-credentials-form .field-title{font-weight:600}.request-filesystem-credentials-dialog label[for=hostname],.request-filesystem-credentials-dialog label[for=private_key],.request-filesystem-credentials-dialog label[for=public_key]{display:block;margin-bottom:1em}.request-filesystem-credentials-dialog .ftp-password,.request-filesystem-credentials-dialog .ftp-username{float:left;width:48%}.request-filesystem-credentials-dialog .ftp-password{margin-left:4%}.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons{text-align:right}.request-filesystem-credentials-dialog label[for=ftp]{margin-right:10px}.request-filesystem-credentials-dialog #auth-keys-desc{margin-bottom:0}#request-filesystem-credentials-dialog .button:not(:last-child){margin-right:10px}#request-filesystem-credentials-form .cancel-button{display:none}#request-filesystem-credentials-dialog .cancel-button{display:inline}.request-filesystem-credentials-dialog .ftp-password,.request-filesystem-credentials-dialog .ftp-username{float:none;width:auto}.request-filesystem-credentials-dialog .ftp-username{margin-bottom:1em}.request-filesystem-credentials-dialog .ftp-password{margin:0}.request-filesystem-credentials-dialog .ftp-password em{color:#888}.request-filesystem-credentials-dialog label{display:block;line-height:1.5;margin-bottom:1em}.request-filesystem-credentials-form legend{padding-bottom:0}.request-filesystem-credentials-form #ssh-keys legend{font-size:1.3em}.request-filesystem-credentials-form .notice{margin:0 0 20px 0;clear:both}.tools-privacy-policy-page form{margin-bottom:1.3em}.tools-privacy-policy-page input.button,.tools-privacy-policy-page select{margin:0 1px 0 6px}.tools-privacy-edit{margin:1.5em 0}.tools-privacy-policy-page span{line-height:2}.privacy_requests .column-email{width:40%}.privacy_requests .column-type{text-align:center}.privacy_requests tfoot td:first-child,.privacy_requests thead td:first-child{border-left:4px solid #fff}.privacy_requests tbody th{border-left:4px solid #fff;background:#fff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.privacy_requests .row-actions{color:#72777c}.privacy_requests .row-actions.processing{position:static}.privacy_requests tbody .has-request-results th{box-shadow:none}.privacy_requests tbody .request-results th .notice{margin:0 0 5px}.privacy_requests tbody td{background:#fff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.privacy_requests tbody .has-request-results td{box-shadow:none}.privacy_requests .next_steps .button{word-wrap:break-word;white-space:normal}.privacy_requests .status-request-confirmed td,.privacy_requests .status-request-confirmed th{background-color:#f7fcfe;border-left-color:#00a0d2}.privacy_requests .status-request-failed td,.privacy_requests .status-request-failed th{background-color:#fef7f1;border-left-color:#d64d21}.privacy_requests .export_personal_data_failed a{vertical-align:baseline}.status-label{font-weight:600}.status-label.status-request-pending{font-weight:400;font-style:italic;color:#6c7781}.status-label.status-request-failed{color:#a00;font-weight:600}.wp-privacy-request-form{clear:both}.wp-privacy-request-form-field{margin:1.5em 0}.wp-privacy-request-form label{font-weight:600;line-height:1.5;padding-bottom:.5em;display:block}.wp-privacy-request-form input{margin:0}.email-personal-data::before{display:inline-block;font:normal 20px/1 dashicons;margin:3px 5px 0 -2px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.email-personal-data--sending::before{color:#f56e28;content:"\f463";animation:rotation 2s infinite linear}.email-personal-data--sent::before{color:#79ba49;content:"\f147"}@media screen and (max-width:782px){textarea{-webkit-appearance:none}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:3px 10px;min-height:40px}::-webkit-datetime-edit{line-height:1.875}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox],input[type=checkbox]{-webkit-appearance:none}.widefat tfoot td input[type=checkbox],.widefat th input[type=checkbox],.widefat thead td input[type=checkbox]{margin-bottom:8px}.widefat tfoot td input[type=checkbox]:before,.widefat th input[type=checkbox]:before,.widefat thead td input[type=checkbox]:before,input[type=checkbox]:checked:before{width:1.875rem;height:1.875rem;margin:-.1875rem -.3125rem}input[type=checkbox],input[type=radio]{height:1.5625rem;width:1.5625rem}.wp-admin p input[type=checkbox],.wp-admin p input[type=radio]{margin-top:-.1875rem}input[type=radio]:checked:before{vertical-align:middle;width:.5625rem;height:.5625rem;margin:.4375rem;line-height:.76190476}.wp-upload-form input[type=submit]{margin-top:10px}.wp-admin .form-table select,.wp-core-ui select{min-height:40px;font-size:16px;line-height:1.625;padding:5px 24px 5px 8px}.wp-admin .button-cancel{margin-bottom:0;padding:2px 0;font-size:14px;vertical-align:middle}#adduser .form-field input,#createuser .form-field input{width:100%}.form-table{box-sizing:border-box}.form-table td,.form-table th,.label-responsive{display:block;width:auto;vertical-align:middle}.label-responsive{margin:.5em 0}.export-filters li{margin-bottom:0}.form-table .color-palette td{display:table-cell;width:15px}.form-table table.color-palette{margin-right:10px}input,textarea{font-size:16px}#profile-page .form-table textarea,.form-table span.description,.form-table td input[type=email],.form-table td input[type=password],.form-table td input[type=text],.form-table td select,.form-table td textarea{width:100%;display:block;max-width:none;box-sizing:border-box}.form-table .form-required.form-invalid td:after{float:right;margin:-30px 3px 0 0}.form-table input[type=text].small-text,input[type=number].small-text,input[type=password].small-text,input[type=search].small-text,input[type=text].small-text{width:auto;max-width:4.375em;display:inline;padding:3px 6px;margin:0 3px}#pass-strength-result{width:100%;box-sizing:border-box;padding:8px}p.search-box{float:none;position:absolute;bottom:0;width:98%;height:90px;margin-bottom:20px}p.search-box input[name="s"]{float:none;width:100%;margin-bottom:10px;vertical-align:middle}p.search-box input[type=submit]{margin-bottom:10px}.form-table span.description{display:inline;padding:4px 0 0;line-height:1.4;font-size:14px}.form-table th{padding-top:10px;padding-bottom:0;border-bottom:0}.form-table td{margin-bottom:0;padding-bottom:6px;padding-top:4px;padding-left:0}.form-table.permalink-structure td code{margin-left:32px;display:inline-block}.form-table.permalink-structure td input[type=text]{margin-left:32px;margin-top:4px;width:96%}.form-table input.regular-text{width:100%}.form-table label{font-size:14px}.background-position-control .button-group>label{font-size:0}.form-table fieldset label{display:block}#local-time,#utc-time{display:block;float:none;margin-top:.5em}.form-field #domain{max-width:none}.wp-pwd{position:relative}#profile-page .form-table #pass1{padding-right:90px}.wp-pwd button.button{background:0 0;border:1px solid transparent;box-shadow:none;line-height:2;margin:0;padding:5px 9px;position:absolute;right:0;top:0;width:2.375rem;height:2.375rem;min-width:40px;min-height:40px}.wp-pwd button.wp-hide-pw{right:2.5rem}.wp-pwd button.button:focus,.wp-pwd button.button:hover{background:0 0}.wp-pwd button.button:active{background:0 0;box-shadow:none;transform:none}.wp-pwd .button .text{display:none}.wp-pwd [type=password],.wp-pwd [type=text]{line-height:2;padding-right:5rem}.wp-cancel-pw .dashicons-no{display:inline-block}.options-general-php input[type=text].small-text{max-width:6.25em;margin:0}.tools-privacy-policy-page form.wp-create-privacy-page{margin-bottom:1em}.tools-privacy-policy-page input#set-page,.tools-privacy-policy-page select{margin:10px 0 0}.tools-privacy-policy-page .wp-create-privacy-page span{display:block;margin-bottom:1em}.tools-privacy-policy-page .wp-create-privacy-page .button{margin-left:0}.wp-list-table.privacy_requests tr:not(.inline-edit-row):not(.no-items) td.column-primary:not(.check-column){display:table-cell}.wp-list-table.privacy_requests.widefat th input,.wp-list-table.privacy_requests.widefat thead td input{margin-left:5px}.wp-privacy-request-form-field input[type=text]{width:100%;margin-bottom:10px;vertical-align:middle}.regular-text{max-width:100%}}@media only screen and (max-width:768px){.form-field input[type=email],.form-field input[type=password],.form-field input[type=text],.form-field select,.form-field textarea{width:99%}.form-wrap .form-field{padding:0}}@media only screen and (max-height:480px),screen and (max-width:450px){.file-editor-warning .notification-dialog,.request-filesystem-credentials-dialog .notification-dialog{width:100%;height:100%;max-height:100%;position:fixed;top:0;margin:0;left:0}}@media screen and (max-width:600px){.color-option{width:49%}}@media only screen and (max-width:320px){.options-general-php .date-time-text.date-time-custom-text{min-width:0;margin-right:.5em}}@keyframes rotation{0%{transform:rotate(0)}100%{transform:rotate(359deg)}} \ No newline at end of file diff --git a/wp-admin/css/ie-rtl.css b/wp-admin/css/ie-rtl.css new file mode 100644 index 0000000..530b61e --- /dev/null +++ b/wp-admin/css/ie-rtl.css @@ -0,0 +1,765 @@ +/*! This file is auto-generated */ +/* Fixes for IE 7 bugs */ + +#dashboard-widgets form .input-text-wrap input, +#dashboard-widgets form .textarea-wrap textarea { + width: 99%; +} + +#dashboard-widgets form #title { + width: 98%; +} + +#wpbody-content #dashboard-widgets .postbox-container { + width: 49.5%; +} + +#wpbody-content #dashboard-widgets #postbox-container-2, +#wpbody-content #dashboard-widgets #postbox-container-3, +#wpbody-content #dashboard-widgets #postbox-container-4 { + float: left; + width: 50.5%; +} + +#dashboard-widgets #postbox-container-3 .empty-container, +#dashboard-widgets #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; +} + +.wp-editor-wrap .wp-editor-tools, +.wp-editor-wrap .wp-switch-editor, +.wp-editor-wrap .wp-editor-tabs, +.wp-editor-wrap .wp-editor-container { + zoom: 100%; +} + +.wp-editor-wrap .wp-editor-container textarea.wp-editor-area { + width: 97%; +} + +#post-body.columns-2 #postbox-container-1 { + padding-right: 19px; +} + +.welcome-panel .wp-badge { + position: absolute; +} + +.welcome-panel .welcome-panel-column:first-child { + width: 35%; +} + +#adminmenuback { + right: 0; + background-image: none; +} + +#adminmenuwrap { + position: static; +} + +#adminmenu { + position: relative; +} + +#adminmenu, +#adminmenu a { + cursor: pointer; +} + +#adminmenu li.wp-menu-separator, +#adminmenu li.wp-menu-separator-last { + font-size: 1px; + line-height: 1; +} + +#adminmenu a.menu-top { + border-bottom: 0 none; + border-top: 1px solid #ddd; +} + +#adminmenu .separator { + font-size: 1px; + line-height: 1px; +} + +#adminmenu .wp-submenu { + right: 110px; +} + +#adminmenu .wp-submenu ul { + margin: 0; +} + +.folded #wpcontent, +.folded #wpfooter { + margin-right: 170px; +} + +.folded #adminmenuback, +.folded #adminmenuwrap, +.folded #adminmenu, +.folded #adminmenu li.menu-top { + width: 150px; +} + +.folded #adminmenu .wp-submenu { + border-top-color: transparent; +} + +.folded #adminmenu .wp-menu-name { + display: block; +} + +.folded #adminmenu .wp-submenu.sub-open, +.folded #adminmenu .opensub .wp-submenu { + right: 110px; +} + +.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu { + top: -1px; + position: relative; +} + +.folded #adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head { + background-color: transparent; +} + +#adminmenu .wp-submenu .wp-submenu-head { + border-top-color: #ddd; +} + +.folded #adminmenu .wp-submenu ul { + margin-right: 5px; +} + +#adminmenu li.menu-top { + margin-bottom: -2px; +} + +#adminmenu .wp-menu-arrow { + display: none !important; +} + +.js.folded #adminmenu li.menu-top { + display: block; + zoom: 100%; +} + +ul#adminmenu { + z-index: 99; +} + +#adminmenu li.menu-top a.menu-top { + min-width: auto; + width: auto; +} + +#wpcontent #adminmenu li.wp-has-current-submenu a.wp-has-submenu { + font-style: normal; +} + +#wpcontent #adminmenu .wp-submenu li { + padding: 0; +} + +#adminmenu li.wp-has-current-submenu .wp-submenu { + right: -40px; +} + +#adminmenu .wp-menu-image { + display: none !important; +} + +#adminmenu a.menu-top .wp-menu-name { + padding-right: 8px; +} + +#collapse-menu { + line-height: 23px; +} + +#wpadminbar .ab-comments-icon { + padding-top: 7px; +} + + +.theme-browser .theme { + width: 30%; + margin: 0 0 4% 3%; + cursor: auto; +} + +.theme-browser .theme:hover, +.theme-browser .theme:focus { + cursor: auto; +} + +.theme-browser .theme .theme-screenshot { + height: 180px; +} + +.theme-browser .theme .theme-actions { + position: static; + background-color: #e8e8e8; +} + +.theme-browser .theme .more-details { + display: none; +} + +.plugins td, +.plugins th { + border-top: 1px solid #ddd; +} + +table.fixed th, +table.fixed td { + border-top: 1px solid #ddd; +} + +#wpbody-content input.button, +#wpbody-content input.button-primary { + overflow: visible; +} + +#dashboard-widgets h3 a { + height: 14px; + line-height: 14px; +} + +#dashboard_browser_nag { + color: #fff; +} + +#dashboard_browser_nag .browser-icon { + position: relative; +} + +.tablenav-pages .current-page { + vertical-align: middle; +} + +#wpbody-content .postbox { + border: 1px solid #ddd; +} + +#wpbody-content .postbox .hndle { + margin-bottom: -1px; +} + +.major-publishing-actions, +.wp-submenu, +.wp-submenu li, +#template, +#template div, +#editcat, +#addcat { + zoom: 100%; +} + +.wp-menu-arrow { + height: 28px; +} + +.submitbox { + margin-top: 10px; +} + +/* Inline Editor */ +#wpbody-content .quick-edit-row-post .inline-edit-col-left { + width: 39%; +} + +#wpbody-content .inline-edit-row-post .inline-edit-col-center { + width: 19%; +} + +#wpbody-content .quick-edit-row-page .inline-edit-col-left { + width: 49%; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-left { + width: 29%; +} + +.inline-edit-row .submit { + zoom: 100%; +} + +.inline-edit-row fieldset label span.title { + display: block; + float: right; + width: 5em; +} + +.inline-edit-row fieldset label span.input-text-wrap { + margin-right: 0; + zoom: 100%; +} + +#wpbody-content .inline-edit-row fieldset label span.input-text-wrap input { + line-height: 130%; +} + +#wpbody-content .inline-edit-row .input-text-wrap input { + width: 95%; +} + +#wpbody-content .inline-edit-row .input-text-wrap input.inline-edit-password-input { + width: 8em; +} +/* end Inline Editor */ + +#titlediv #title { + width: 98%; +} + +.button, +input[type="reset"], +input[type="button"], +input[type="submit"] { + padding: 0 8px; + line-height: 20px; + height: auto; +} + +.button.button-large, +input[type="reset"].button-large, +input[type="button"].button-large, +input[type="submit"].button-large { + padding: 0 10px; + line-height: 24px; + height: auto; +} + +.button.button-small, +input[type="reset"].button-small, +input[type="button"].button-small, +input[type="submit"].button-small { + padding: 0 6px; + line-height: 16px; + height: auto; +} + +a.button { + margin: 1px; + padding: 1px 9px 2px; +} + +a.button.button-large { + padding: 1px 11px 2px; +} + +a.button.button-small { + padding: 1px 7px 2px; +} + +#screen-options-wrap { + overflow: hidden; +} + +#the-comment-list .comment-item, +#post-status-info, +#wpwrap, +#wrap, +#postdivrich, +#postdiv, +#poststuff, +.metabox-holder, +#titlediv, +#post-body, +#editorcontainer, +.tablenav, +.widget-liquid-left, +.widget-liquid-right, +#widgets-left, +.widgets-sortables, +#dragHelper, +.widget .widget-top, +.widget-control-actions, +.tagchecklist, +#col-container, +#col-left, +#col-right, +.fileedit-sub { + display: block; + zoom: 100%; +} + +p.search-box { + position: static; + float: left; + margin: -3px 0 4px; +} + +#widget-list .widget { + display: inline; +} + +#editorcontainer #content { + overflow: auto; + margin: auto; + width: 98%; +} + +form#template div { + width: 100%; +} + +.wp-editor-container .quicktags-toolbar input { + overflow: visible; + padding: 0 4px; +} + +#poststuff h2 { + font-size: 1.6em; +} + +#poststuff .inside #parent_id, +#poststuff .inside #page_template, +.inline-edit-row #post_parent, +.inline-edit-row select[name="page_template"] { + width: 250px; +} + +#submitdiv input, +#submitdiv select, +#submitdiv a.button { + position: relative; +} + +#bh { + margin: 7px 0 0 10px; + float: left; +} + +/* without this dashboard widgets appear in one column for some screen widths */ +div#dashboard-widgets { + padding-left: 1px; +} + +.tagchecklist > li, .tagchecklist .ntdelbutton { + display: inline-block; + display: block; +} + +.tagchecklist .ntdelbutton:focus .remove-tag-icon:before { + outline: 1px solid #5b9dd9; +} + +.tablenav .button, +.nav .button { + padding-top: 2px; + padding-bottom: 2px; +} + +.tablenav select { + font-size: 13px; + display: inline-block; + vertical-align: top; + margin-top: 2px; +} + +.tablenav .actions select { + width: 155px; +} + +.subsubsub li { + display: inline; +} + +table.ie-fixed { + table-layout: fixed; +} + +.widefat tr, +.widefat th, +.widefat thead td, +.widefat tfoot td { + margin-bottom: 0; + border-spacing: 0; +} + +.widefat th input, +.widefat thead td input, +.widefat tfoot td input { + margin: 0 5px 0 0; +} + +.widefat thead .check-column, +.widefat tfoot .check-column { + padding-top: 6px; +} + +.widefat tbody th.check-column, +.media.widefat tbody th.check-column { + padding: 4px 0 0; +} + +.widefat { + empty-cells: show; + border-collapse: collapse; +} + +.tablenav a.button { + display: inline-block; + padding: 2px 5px; +} + +.inactive-sidebar .widgets-sortables { + padding-bottom: 8px; +} + +#available-widgets .widget-holder { + padding-bottom: 65px; +} + +#widgets-left .inactive { + padding-bottom: 10px; +} + +.widget-liquid-right .widget, +.inactive-sidebar .widget { + position: relative; +} + +.inactive-sidebar .widget { + display: block; + float: right; +} + +#wpcontent .button-primary-disabled { + color: #9FD0D5; + background: #298CBA; +} + +#the-comment-list .unapproved tr, +#the-comment-list .unapproved td { + background-color: #ffffe0; +} + +.imgedit-submit { + width: 300px; +} + +#nav-menus-frame, +#wpbody, +.menu li { + zoom: 100%; +} + +#update-nav-menu #post-body { + overflow: hidden; +} + +.menu li { + min-width: 100%; +} + +.menu li.sortable-placeholder { + min-width: 400px; +} + +.available-theme { + display: inline; +} + +.available-theme ul { + margin: 0; +} + +.available-theme .action-links li { + padding-left: 7px; + margin-left: 7px; +} + +.about-wrap .three-col.about-updates .col-2 { + width: 15%; +} + +.about-wrap .about-password-meter input { + width: 98%; +} + +.revisions-tickmarks, +.revisions-tooltip { + display: none !important; +} + +.revisions.pinned .revisions-controls { + position: relative; +} + +input[type="password"], +.login form .input { + font-family: sans-serif; +} + +/* TinyMCE icons */ +.mce-btn i.mce-i-bold, +.mce-btn i.mce-i-italic, +.mce-btn i.mce-i-bullist, +.mce-btn i.mce-i-numlist, +.mce-btn i.mce-i-blockquote, +.mce-btn i.mce-i-alignleft, +.mce-btn i.mce-i-aligncenter, +.mce-btn i.mce-i-alignright, +.mce-btn i.mce-i-link, +.mce-btn i.mce-i-unlink, +.mce-btn i.mce-i-wp_more, +.mce-btn i.mce-i-strikethrough, +.mce-btn i.mce-i-spellchecker, +.mce-btn i.mce-i-fullscreen, +.mce-btn i.mce-i-wp_fullscreen, +.mce-btn i.mce-i-wp_adv, +.mce-btn i.mce-i-underline, +.mce-btn i.mce-i-alignjustify, +.mce-btn i.mce-i-forecolor, +.mce-btn i.mce-i-pastetext, +.mce-btn i.mce-i-pasteword, +.mce-btn i.mce-i-removeformat, +.mce-btn i.mce-i-charmap, +.mce-btn i.mce-i-outdent, +.mce-btn i.mce-i-indent, +.mce-btn i.mce-i-undo, +.mce-btn i.mce-i-redo, +.mce-btn i.mce-i-help, +.mce-btn i.mce-i-wp_help, +.mce-btn i.mce-i-wp-media-library, +.mce-btn i.mce-i-ltr, +.mce-btn i.mce-i-wp_page, +.mce-btn i.mce-i-hr, +.mce-close { + font-family: tinymce, Arial; + font-style: normal; + font-weight: 400; + font-variant: normal; + font-size: 16px; + margin-right: 0; + padding-left: 0; +} + +.mce-btn i.mce-i-wp_fullscreen, +.qt-fullscreen { + -ie7-icon: "\e023"; +} + +.mce-btn i.mce-i-wp_more, +.mce-btn i.mce-i-wp_page { + -ie7-icon: "\e027"; +} + +.mce-btn i.mce-i-wp_adv { + background-color: #a0a5aa; +} + +.mce-btn i.mce-i-help, +.mce-btn i.mce-i-wp_help { + -ie7-icon: "\e016"; +} + + +/* IE6 leftovers */ +* html .row-actions { + visibility: visible; +} + +* html div.widget-liquid-left, +* html div.widget-liquid-right { + display: block; + position: relative; +} + +* html #editorcontainer { + padding: 0; +} + +* html #poststuff h2 { + margin-right: 0; +} + +* html .stuffbox, +* html .stuffbox input, +* html .stuffbox textarea { + border: 1px solid #ddd; +} + +* html div.widget-liquid-left { + width: 99%; +} + +* html .widgets-sortables { + height: 50px; +} + +* html a#content_resize { + left: -2px; +} + +* html .widget-title h4 { + width: 205px; +} + +* html #removing-widget .in-widget-title { + display: none; +} + +* html .media-item .pinkynail { + height: 32px; + width: 40px; +} + +* html .describe .field input.text, +* html .describe .field textarea { + width: 440px; +} + +* html input { + border: 1px solid #ddd; +} + +* html .edit-box { + display: inline; +} + +* html .postbox-container .meta-box-sortables { + height: 300px; +} + +* html #wpbody-content #screen-options-link-wrap { + display: inline-block; + width: 150px; + text-align: center; +} + +* html #wpbody-content #contextual-help-link-wrap { + display: inline-block; + width: 100px; + text-align: center; +} + +* html #adminmenu { + margin-right: -80px; +} + +* html .folded #adminmenu { + margin-right: -22px; +} + +* html #wpcontent #adminmenu li.menu-top { + display: inline; + padding: 0; + margin: 0; +} + +* html #wpfooter { + margin: 0; +} + +* html #adminmenu div.wp-menu-image { + height: 29px; +} diff --git a/wp-admin/css/ie-rtl.min.css b/wp-admin/css/ie-rtl.min.css new file mode 100644 index 0000000..96b34c8 --- /dev/null +++ b/wp-admin/css/ie-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#dashboard-widgets form .input-text-wrap input,#dashboard-widgets form .textarea-wrap textarea{width:99%}#dashboard-widgets form #title{width:98%}#wpbody-content #dashboard-widgets .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets #postbox-container-2,#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:left;width:50.5%}#dashboard-widgets #postbox-container-3 .empty-container,#dashboard-widgets #postbox-container-4 .empty-container{border:0 none;height:0;min-height:0}.wp-editor-wrap .wp-editor-container,.wp-editor-wrap .wp-editor-tabs,.wp-editor-wrap .wp-editor-tools,.wp-editor-wrap .wp-switch-editor{zoom:100%}.wp-editor-wrap .wp-editor-container textarea.wp-editor-area{width:97%}#post-body.columns-2 #postbox-container-1{padding-right:19px}.welcome-panel .wp-badge{position:absolute}.welcome-panel .welcome-panel-column:first-child{width:35%}#adminmenuback{right:0;background-image:none}#adminmenuwrap{position:static}#adminmenu{position:relative}#adminmenu,#adminmenu a{cursor:pointer}#adminmenu li.wp-menu-separator,#adminmenu li.wp-menu-separator-last{font-size:1px;line-height:1}#adminmenu a.menu-top{border-bottom:0 none;border-top:1px solid #ddd}#adminmenu .separator{font-size:1px;line-height:1px}#adminmenu .wp-submenu{right:110px}#adminmenu .wp-submenu ul{margin:0}.folded #wpcontent,.folded #wpfooter{margin-right:170px}.folded #adminmenu,.folded #adminmenu li.menu-top,.folded #adminmenuback,.folded #adminmenuwrap{width:150px}.folded #adminmenu .wp-submenu{border-top-color:transparent}.folded #adminmenu .wp-menu-name{display:block}.folded #adminmenu .opensub .wp-submenu,.folded #adminmenu .wp-submenu.sub-open{right:110px}.folded #adminmenu .wp-has-current-submenu .wp-submenu,.folded #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{top:-1px;position:relative}.folded #adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{background-color:transparent}#adminmenu .wp-submenu .wp-submenu-head{border-top-color:#ddd}.folded #adminmenu .wp-submenu ul{margin-right:5px}#adminmenu li.menu-top{margin-bottom:-2px}#adminmenu .wp-menu-arrow{display:none!important}.js.folded #adminmenu li.menu-top{display:block;zoom:100%}ul#adminmenu{z-index:99}#adminmenu li.menu-top a.menu-top{min-width:auto;width:auto}#wpcontent #adminmenu li.wp-has-current-submenu a.wp-has-submenu{font-style:normal}#wpcontent #adminmenu .wp-submenu li{padding:0}#adminmenu li.wp-has-current-submenu .wp-submenu{right:-40px}#adminmenu .wp-menu-image{display:none!important}#adminmenu a.menu-top .wp-menu-name{padding-right:8px}#collapse-menu{line-height:23px}#wpadminbar .ab-comments-icon{padding-top:7px}.theme-browser .theme{width:30%;margin:0 0 4% 3%;cursor:auto}.theme-browser .theme:focus,.theme-browser .theme:hover{cursor:auto}.theme-browser .theme .theme-screenshot{height:180px}.theme-browser .theme .theme-actions{position:static;background-color:#e8e8e8}.theme-browser .theme .more-details{display:none}.plugins td,.plugins th{border-top:1px solid #ddd}table.fixed td,table.fixed th{border-top:1px solid #ddd}#wpbody-content input.button,#wpbody-content input.button-primary{overflow:visible}#dashboard-widgets h3 a{height:14px;line-height:14px}#dashboard_browser_nag{color:#fff}#dashboard_browser_nag .browser-icon{position:relative}.tablenav-pages .current-page{vertical-align:middle}#wpbody-content .postbox{border:1px solid #ddd}#wpbody-content .postbox .hndle{margin-bottom:-1px}#addcat,#editcat,#template,#template div,.major-publishing-actions,.wp-submenu,.wp-submenu li{zoom:100%}.wp-menu-arrow{height:28px}.submitbox{margin-top:10px}#wpbody-content .quick-edit-row-post .inline-edit-col-left{width:39%}#wpbody-content .inline-edit-row-post .inline-edit-col-center{width:19%}#wpbody-content .quick-edit-row-page .inline-edit-col-left{width:49%}#wpbody-content .bulk-edit-row .inline-edit-col-left{width:29%}.inline-edit-row .submit{zoom:100%}.inline-edit-row fieldset label span.title{display:block;float:right;width:5em}.inline-edit-row fieldset label span.input-text-wrap{margin-right:0;zoom:100%}#wpbody-content .inline-edit-row fieldset label span.input-text-wrap input{line-height:130%}#wpbody-content .inline-edit-row .input-text-wrap input{width:95%}#wpbody-content .inline-edit-row .input-text-wrap input.inline-edit-password-input{width:8em}#titlediv #title{width:98%}.button,input[type=button],input[type=reset],input[type=submit]{padding:0 8px;line-height:20px;height:auto}.button.button-large,input[type=button].button-large,input[type=reset].button-large,input[type=submit].button-large{padding:0 10px;line-height:24px;height:auto}.button.button-small,input[type=button].button-small,input[type=reset].button-small,input[type=submit].button-small{padding:0 6px;line-height:16px;height:auto}a.button{margin:1px;padding:1px 9px 2px}a.button.button-large{padding:1px 11px 2px}a.button.button-small{padding:1px 7px 2px}#screen-options-wrap{overflow:hidden}#col-container,#col-left,#col-right,#dragHelper,#editorcontainer,#post-body,#post-status-info,#postdiv,#postdivrich,#poststuff,#the-comment-list .comment-item,#titlediv,#widgets-left,#wpwrap,#wrap,.fileedit-sub,.metabox-holder,.tablenav,.tagchecklist,.widget .widget-top,.widget-control-actions,.widget-liquid-left,.widget-liquid-right,.widgets-sortables{display:block;zoom:100%}p.search-box{position:static;float:left;margin:-3px 0 4px}#widget-list .widget{display:inline}#editorcontainer #content{overflow:auto;margin:auto;width:98%}form#template div{width:100%}.wp-editor-container .quicktags-toolbar input{overflow:visible;padding:0 4px}#poststuff h2{font-size:1.6em}#poststuff .inside #page_template,#poststuff .inside #parent_id,.inline-edit-row #post_parent,.inline-edit-row select[name=page_template]{width:250px}#submitdiv a.button,#submitdiv input,#submitdiv select{position:relative}#bh{margin:7px 0 0 10px;float:left}div#dashboard-widgets{padding-left:1px}.tagchecklist .ntdelbutton,.tagchecklist>li{display:inline-block;display:block}.tagchecklist .ntdelbutton:focus .remove-tag-icon:before{outline:1px solid #5b9dd9}.nav .button,.tablenav .button{padding-top:2px;padding-bottom:2px}.tablenav select{font-size:13px;display:inline-block;vertical-align:top;margin-top:2px}.tablenav .actions select{width:155px}.subsubsub li{display:inline}table.ie-fixed{table-layout:fixed}.widefat tfoot td,.widefat th,.widefat thead td,.widefat tr{margin-bottom:0;border-spacing:0}.widefat tfoot td input,.widefat th input,.widefat thead td input{margin:0 5px 0 0}.widefat tfoot .check-column,.widefat thead .check-column{padding-top:6px}.media.widefat tbody th.check-column,.widefat tbody th.check-column{padding:4px 0 0}.widefat{empty-cells:show;border-collapse:collapse}.tablenav a.button{display:inline-block;padding:2px 5px}.inactive-sidebar .widgets-sortables{padding-bottom:8px}#available-widgets .widget-holder{padding-bottom:65px}#widgets-left .inactive{padding-bottom:10px}.inactive-sidebar .widget,.widget-liquid-right .widget{position:relative}.inactive-sidebar .widget{display:block;float:right}#wpcontent .button-primary-disabled{color:#9fd0d5;background:#298cba}#the-comment-list .unapproved td,#the-comment-list .unapproved tr{background-color:#ffffe0}.imgedit-submit{width:300px}#nav-menus-frame,#wpbody,.menu li{zoom:100%}#update-nav-menu #post-body{overflow:hidden}.menu li{min-width:100%}.menu li.sortable-placeholder{min-width:400px}.available-theme{display:inline}.available-theme ul{margin:0}.available-theme .action-links li{padding-left:7px;margin-left:7px}.about-wrap .three-col.about-updates .col-2{width:15%}.about-wrap .about-password-meter input{width:98%}.revisions-tickmarks,.revisions-tooltip{display:none!important}.revisions.pinned .revisions-controls{position:relative}.login form .input,input[type=password]{font-family:sans-serif}.mce-btn i.mce-i-aligncenter,.mce-btn i.mce-i-alignjustify,.mce-btn i.mce-i-alignleft,.mce-btn i.mce-i-alignright,.mce-btn i.mce-i-blockquote,.mce-btn i.mce-i-bold,.mce-btn i.mce-i-bullist,.mce-btn i.mce-i-charmap,.mce-btn i.mce-i-forecolor,.mce-btn i.mce-i-fullscreen,.mce-btn i.mce-i-help,.mce-btn i.mce-i-hr,.mce-btn i.mce-i-indent,.mce-btn i.mce-i-italic,.mce-btn i.mce-i-link,.mce-btn i.mce-i-ltr,.mce-btn i.mce-i-numlist,.mce-btn i.mce-i-outdent,.mce-btn i.mce-i-pastetext,.mce-btn i.mce-i-pasteword,.mce-btn i.mce-i-redo,.mce-btn i.mce-i-removeformat,.mce-btn i.mce-i-spellchecker,.mce-btn i.mce-i-strikethrough,.mce-btn i.mce-i-underline,.mce-btn i.mce-i-undo,.mce-btn i.mce-i-unlink,.mce-btn i.mce-i-wp-media-library,.mce-btn i.mce-i-wp_adv,.mce-btn i.mce-i-wp_fullscreen,.mce-btn i.mce-i-wp_help,.mce-btn i.mce-i-wp_more,.mce-btn i.mce-i-wp_page,.mce-close{font-family:tinymce,Arial;font-style:normal;font-weight:400;font-variant:normal;font-size:16px;margin-right:0;padding-left:0}.mce-btn i.mce-i-wp_fullscreen,.qt-fullscreen{-ie7-icon:"\e023"}.mce-btn i.mce-i-wp_more,.mce-btn i.mce-i-wp_page{-ie7-icon:"\e027"}.mce-btn i.mce-i-wp_adv{background-color:#a0a5aa}.mce-btn i.mce-i-help,.mce-btn i.mce-i-wp_help{-ie7-icon:"\e016"}* html .row-actions{visibility:visible}* html div.widget-liquid-left,* html div.widget-liquid-right{display:block;position:relative}* html #editorcontainer{padding:0}* html #poststuff h2{margin-right:0}* html .stuffbox,* html .stuffbox input,* html .stuffbox textarea{border:1px solid #ddd}* html div.widget-liquid-left{width:99%}* html .widgets-sortables{height:50px}* html a#content_resize{left:-2px}* html .widget-title h4{width:205px}* html #removing-widget .in-widget-title{display:none}* html .media-item .pinkynail{height:32px;width:40px}* html .describe .field input.text,* html .describe .field textarea{width:440px}* html input{border:1px solid #ddd}* html .edit-box{display:inline}* html .postbox-container .meta-box-sortables{height:300px}* html #wpbody-content #screen-options-link-wrap{display:inline-block;width:150px;text-align:center}* html #wpbody-content #contextual-help-link-wrap{display:inline-block;width:100px;text-align:center}* html #adminmenu{margin-right:-80px}* html .folded #adminmenu{margin-right:-22px}* html #wpcontent #adminmenu li.menu-top{display:inline;padding:0;margin:0}* html #wpfooter{margin:0}* html #adminmenu div.wp-menu-image{height:29px} \ No newline at end of file diff --git a/wp-admin/css/ie.css b/wp-admin/css/ie.css new file mode 100644 index 0000000..00853ab --- /dev/null +++ b/wp-admin/css/ie.css @@ -0,0 +1,764 @@ +/* Fixes for IE 7 bugs */ + +#dashboard-widgets form .input-text-wrap input, +#dashboard-widgets form .textarea-wrap textarea { + width: 99%; +} + +#dashboard-widgets form #title { + width: 98%; +} + +#wpbody-content #dashboard-widgets .postbox-container { + width: 49.5%; +} + +#wpbody-content #dashboard-widgets #postbox-container-2, +#wpbody-content #dashboard-widgets #postbox-container-3, +#wpbody-content #dashboard-widgets #postbox-container-4 { + float: right; + width: 50.5%; +} + +#dashboard-widgets #postbox-container-3 .empty-container, +#dashboard-widgets #postbox-container-4 .empty-container { + border: 0 none; + height: 0; + min-height: 0; +} + +.wp-editor-wrap .wp-editor-tools, +.wp-editor-wrap .wp-switch-editor, +.wp-editor-wrap .wp-editor-tabs, +.wp-editor-wrap .wp-editor-container { + zoom: 100%; +} + +.wp-editor-wrap .wp-editor-container textarea.wp-editor-area { + width: 97%; +} + +#post-body.columns-2 #postbox-container-1 { + padding-left: 19px; +} + +.welcome-panel .wp-badge { + position: absolute; +} + +.welcome-panel .welcome-panel-column:first-child { + width: 35%; +} + +#adminmenuback { + left: 0; + background-image: none; +} + +#adminmenuwrap { + position: static; +} + +#adminmenu { + position: relative; +} + +#adminmenu, +#adminmenu a { + cursor: pointer; +} + +#adminmenu li.wp-menu-separator, +#adminmenu li.wp-menu-separator-last { + font-size: 1px; + line-height: 1; +} + +#adminmenu a.menu-top { + border-bottom: 0 none; + border-top: 1px solid #ddd; +} + +#adminmenu .separator { + font-size: 1px; + line-height: 1px; +} + +#adminmenu .wp-submenu { + left: 110px; +} + +#adminmenu .wp-submenu ul { + margin: 0; +} + +.folded #wpcontent, +.folded #wpfooter { + margin-left: 170px; +} + +.folded #adminmenuback, +.folded #adminmenuwrap, +.folded #adminmenu, +.folded #adminmenu li.menu-top { + width: 150px; +} + +.folded #adminmenu .wp-submenu { + border-top-color: transparent; +} + +.folded #adminmenu .wp-menu-name { + display: block; +} + +.folded #adminmenu .wp-submenu.sub-open, +.folded #adminmenu .opensub .wp-submenu { + left: 110px; +} + +.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu, +.folded #adminmenu .wp-has-current-submenu .wp-submenu { + top: -1px; + position: relative; +} + +.folded #adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head { + background-color: transparent; +} + +#adminmenu .wp-submenu .wp-submenu-head { + border-top-color: #ddd; +} + +.folded #adminmenu .wp-submenu ul { + margin-left: 5px; +} + +#adminmenu li.menu-top { + margin-bottom: -2px; +} + +#adminmenu .wp-menu-arrow { + display: none !important; +} + +.js.folded #adminmenu li.menu-top { + display: block; + zoom: 100%; +} + +ul#adminmenu { + z-index: 99; +} + +#adminmenu li.menu-top a.menu-top { + min-width: auto; + width: auto; +} + +#wpcontent #adminmenu li.wp-has-current-submenu a.wp-has-submenu { + font-style: normal; +} + +#wpcontent #adminmenu .wp-submenu li { + padding: 0; +} + +#adminmenu li.wp-has-current-submenu .wp-submenu { + left: -40px; +} + +#adminmenu .wp-menu-image { + display: none !important; +} + +#adminmenu a.menu-top .wp-menu-name { + padding-left: 8px; +} + +#collapse-menu { + line-height: 23px; +} + +#wpadminbar .ab-comments-icon { + padding-top: 7px; +} + + +.theme-browser .theme { + width: 30%; + margin: 0 3% 4% 0; + cursor: auto; +} + +.theme-browser .theme:hover, +.theme-browser .theme:focus { + cursor: auto; +} + +.theme-browser .theme .theme-screenshot { + height: 180px; +} + +.theme-browser .theme .theme-actions { + position: static; + background-color: #e8e8e8; +} + +.theme-browser .theme .more-details { + display: none; +} + +.plugins td, +.plugins th { + border-top: 1px solid #ddd; +} + +table.fixed th, +table.fixed td { + border-top: 1px solid #ddd; +} + +#wpbody-content input.button, +#wpbody-content input.button-primary { + overflow: visible; +} + +#dashboard-widgets h3 a { + height: 14px; + line-height: 14px; +} + +#dashboard_browser_nag { + color: #fff; +} + +#dashboard_browser_nag .browser-icon { + position: relative; +} + +.tablenav-pages .current-page { + vertical-align: middle; +} + +#wpbody-content .postbox { + border: 1px solid #ddd; +} + +#wpbody-content .postbox .hndle { + margin-bottom: -1px; +} + +.major-publishing-actions, +.wp-submenu, +.wp-submenu li, +#template, +#template div, +#editcat, +#addcat { + zoom: 100%; +} + +.wp-menu-arrow { + height: 28px; +} + +.submitbox { + margin-top: 10px; +} + +/* Inline Editor */ +#wpbody-content .quick-edit-row-post .inline-edit-col-left { + width: 39%; +} + +#wpbody-content .inline-edit-row-post .inline-edit-col-center { + width: 19%; +} + +#wpbody-content .quick-edit-row-page .inline-edit-col-left { + width: 49%; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-left { + width: 29%; +} + +.inline-edit-row .submit { + zoom: 100%; +} + +.inline-edit-row fieldset label span.title { + display: block; + float: left; + width: 5em; +} + +.inline-edit-row fieldset label span.input-text-wrap { + margin-left: 0; + zoom: 100%; +} + +#wpbody-content .inline-edit-row fieldset label span.input-text-wrap input { + line-height: 130%; +} + +#wpbody-content .inline-edit-row .input-text-wrap input { + width: 95%; +} + +#wpbody-content .inline-edit-row .input-text-wrap input.inline-edit-password-input { + width: 8em; +} +/* end Inline Editor */ + +#titlediv #title { + width: 98%; +} + +.button, +input[type="reset"], +input[type="button"], +input[type="submit"] { + padding: 0 8px; + line-height: 20px; + height: auto; +} + +.button.button-large, +input[type="reset"].button-large, +input[type="button"].button-large, +input[type="submit"].button-large { + padding: 0 10px; + line-height: 24px; + height: auto; +} + +.button.button-small, +input[type="reset"].button-small, +input[type="button"].button-small, +input[type="submit"].button-small { + padding: 0 6px; + line-height: 16px; + height: auto; +} + +a.button { + margin: 1px; + padding: 1px 9px 2px; +} + +a.button.button-large { + padding: 1px 11px 2px; +} + +a.button.button-small { + padding: 1px 7px 2px; +} + +#screen-options-wrap { + overflow: hidden; +} + +#the-comment-list .comment-item, +#post-status-info, +#wpwrap, +#wrap, +#postdivrich, +#postdiv, +#poststuff, +.metabox-holder, +#titlediv, +#post-body, +#editorcontainer, +.tablenav, +.widget-liquid-left, +.widget-liquid-right, +#widgets-left, +.widgets-sortables, +#dragHelper, +.widget .widget-top, +.widget-control-actions, +.tagchecklist, +#col-container, +#col-left, +#col-right, +.fileedit-sub { + display: block; + zoom: 100%; +} + +p.search-box { + position: static; + float: right; + margin: -3px 0 4px; +} + +#widget-list .widget { + display: inline; +} + +#editorcontainer #content { + overflow: auto; + margin: auto; + width: 98%; +} + +form#template div { + width: 100%; +} + +.wp-editor-container .quicktags-toolbar input { + overflow: visible; + padding: 0 4px; +} + +#poststuff h2 { + font-size: 1.6em; +} + +#poststuff .inside #parent_id, +#poststuff .inside #page_template, +.inline-edit-row #post_parent, +.inline-edit-row select[name="page_template"] { + width: 250px; +} + +#submitdiv input, +#submitdiv select, +#submitdiv a.button { + position: relative; +} + +#bh { + margin: 7px 10px 0 0; + float: right; +} + +/* without this dashboard widgets appear in one column for some screen widths */ +div#dashboard-widgets { + padding-right: 1px; +} + +.tagchecklist > li, .tagchecklist .ntdelbutton { + display: inline-block; + display: block; +} + +.tagchecklist .ntdelbutton:focus .remove-tag-icon:before { + outline: 1px solid #5b9dd9; +} + +.tablenav .button, +.nav .button { + padding-top: 2px; + padding-bottom: 2px; +} + +.tablenav select { + font-size: 13px; + display: inline-block; + vertical-align: top; + margin-top: 2px; +} + +.tablenav .actions select { + width: 155px; +} + +.subsubsub li { + display: inline; +} + +table.ie-fixed { + table-layout: fixed; +} + +.widefat tr, +.widefat th, +.widefat thead td, +.widefat tfoot td { + margin-bottom: 0; + border-spacing: 0; +} + +.widefat th input, +.widefat thead td input, +.widefat tfoot td input { + margin: 0 0 0 5px; +} + +.widefat thead .check-column, +.widefat tfoot .check-column { + padding-top: 6px; +} + +.widefat tbody th.check-column, +.media.widefat tbody th.check-column { + padding: 4px 0 0; +} + +.widefat { + empty-cells: show; + border-collapse: collapse; +} + +.tablenav a.button { + display: inline-block; + padding: 2px 5px; +} + +.inactive-sidebar .widgets-sortables { + padding-bottom: 8px; +} + +#available-widgets .widget-holder { + padding-bottom: 65px; +} + +#widgets-left .inactive { + padding-bottom: 10px; +} + +.widget-liquid-right .widget, +.inactive-sidebar .widget { + position: relative; +} + +.inactive-sidebar .widget { + display: block; + float: left; +} + +#wpcontent .button-primary-disabled { + color: #9FD0D5; + background: #298CBA; +} + +#the-comment-list .unapproved tr, +#the-comment-list .unapproved td { + background-color: #ffffe0; +} + +.imgedit-submit { + width: 300px; +} + +#nav-menus-frame, +#wpbody, +.menu li { + zoom: 100%; +} + +#update-nav-menu #post-body { + overflow: hidden; +} + +.menu li { + min-width: 100%; +} + +.menu li.sortable-placeholder { + min-width: 400px; +} + +.available-theme { + display: inline; +} + +.available-theme ul { + margin: 0; +} + +.available-theme .action-links li { + padding-right: 7px; + margin-right: 7px; +} + +.about-wrap .three-col.about-updates .col-2 { + width: 15%; +} + +.about-wrap .about-password-meter input { + width: 98%; +} + +.revisions-tickmarks, +.revisions-tooltip { + display: none !important; +} + +.revisions.pinned .revisions-controls { + position: relative; +} + +input[type="password"], +.login form .input { + font-family: sans-serif; +} + +/* TinyMCE icons */ +.mce-btn i.mce-i-bold, +.mce-btn i.mce-i-italic, +.mce-btn i.mce-i-bullist, +.mce-btn i.mce-i-numlist, +.mce-btn i.mce-i-blockquote, +.mce-btn i.mce-i-alignleft, +.mce-btn i.mce-i-aligncenter, +.mce-btn i.mce-i-alignright, +.mce-btn i.mce-i-link, +.mce-btn i.mce-i-unlink, +.mce-btn i.mce-i-wp_more, +.mce-btn i.mce-i-strikethrough, +.mce-btn i.mce-i-spellchecker, +.mce-btn i.mce-i-fullscreen, +.mce-btn i.mce-i-wp_fullscreen, +.mce-btn i.mce-i-wp_adv, +.mce-btn i.mce-i-underline, +.mce-btn i.mce-i-alignjustify, +.mce-btn i.mce-i-forecolor, +.mce-btn i.mce-i-pastetext, +.mce-btn i.mce-i-pasteword, +.mce-btn i.mce-i-removeformat, +.mce-btn i.mce-i-charmap, +.mce-btn i.mce-i-outdent, +.mce-btn i.mce-i-indent, +.mce-btn i.mce-i-undo, +.mce-btn i.mce-i-redo, +.mce-btn i.mce-i-help, +.mce-btn i.mce-i-wp_help, +.mce-btn i.mce-i-wp-media-library, +.mce-btn i.mce-i-ltr, +.mce-btn i.mce-i-wp_page, +.mce-btn i.mce-i-hr, +.mce-close { + font-family: tinymce, Arial; + font-style: normal; + font-weight: 400; + font-variant: normal; + font-size: 16px; + margin-left: 0; + padding-right: 0; +} + +.mce-btn i.mce-i-wp_fullscreen, +.qt-fullscreen { + -ie7-icon: "\e023"; +} + +.mce-btn i.mce-i-wp_more, +.mce-btn i.mce-i-wp_page { + -ie7-icon: "\e027"; +} + +.mce-btn i.mce-i-wp_adv { + background-color: #a0a5aa; +} + +.mce-btn i.mce-i-help, +.mce-btn i.mce-i-wp_help { + -ie7-icon: "\e016"; +} + + +/* IE6 leftovers */ +* html .row-actions { + visibility: visible; +} + +* html div.widget-liquid-left, +* html div.widget-liquid-right { + display: block; + position: relative; +} + +* html #editorcontainer { + padding: 0; +} + +* html #poststuff h2 { + margin-left: 0; +} + +* html .stuffbox, +* html .stuffbox input, +* html .stuffbox textarea { + border: 1px solid #ddd; +} + +* html div.widget-liquid-left { + width: 99%; +} + +* html .widgets-sortables { + height: 50px; +} + +* html a#content_resize { + right: -2px; +} + +* html .widget-title h4 { + width: 205px; +} + +* html #removing-widget .in-widget-title { + display: none; +} + +* html .media-item .pinkynail { + height: 32px; + width: 40px; +} + +* html .describe .field input.text, +* html .describe .field textarea { + width: 440px; +} + +* html input { + border: 1px solid #ddd; +} + +* html .edit-box { + display: inline; +} + +* html .postbox-container .meta-box-sortables { + height: 300px; +} + +* html #wpbody-content #screen-options-link-wrap { + display: inline-block; + width: 150px; + text-align: center; +} + +* html #wpbody-content #contextual-help-link-wrap { + display: inline-block; + width: 100px; + text-align: center; +} + +* html #adminmenu { + margin-left: -80px; +} + +* html .folded #adminmenu { + margin-left: -22px; +} + +* html #wpcontent #adminmenu li.menu-top { + display: inline; + padding: 0; + margin: 0; +} + +* html #wpfooter { + margin: 0; +} + +* html #adminmenu div.wp-menu-image { + height: 29px; +} diff --git a/wp-admin/css/ie.min.css b/wp-admin/css/ie.min.css new file mode 100644 index 0000000..47ecfda --- /dev/null +++ b/wp-admin/css/ie.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#dashboard-widgets form .input-text-wrap input,#dashboard-widgets form .textarea-wrap textarea{width:99%}#dashboard-widgets form #title{width:98%}#wpbody-content #dashboard-widgets .postbox-container{width:49.5%}#wpbody-content #dashboard-widgets #postbox-container-2,#wpbody-content #dashboard-widgets #postbox-container-3,#wpbody-content #dashboard-widgets #postbox-container-4{float:right;width:50.5%}#dashboard-widgets #postbox-container-3 .empty-container,#dashboard-widgets #postbox-container-4 .empty-container{border:0 none;height:0;min-height:0}.wp-editor-wrap .wp-editor-container,.wp-editor-wrap .wp-editor-tabs,.wp-editor-wrap .wp-editor-tools,.wp-editor-wrap .wp-switch-editor{zoom:100%}.wp-editor-wrap .wp-editor-container textarea.wp-editor-area{width:97%}#post-body.columns-2 #postbox-container-1{padding-left:19px}.welcome-panel .wp-badge{position:absolute}.welcome-panel .welcome-panel-column:first-child{width:35%}#adminmenuback{left:0;background-image:none}#adminmenuwrap{position:static}#adminmenu{position:relative}#adminmenu,#adminmenu a{cursor:pointer}#adminmenu li.wp-menu-separator,#adminmenu li.wp-menu-separator-last{font-size:1px;line-height:1}#adminmenu a.menu-top{border-bottom:0 none;border-top:1px solid #ddd}#adminmenu .separator{font-size:1px;line-height:1px}#adminmenu .wp-submenu{left:110px}#adminmenu .wp-submenu ul{margin:0}.folded #wpcontent,.folded #wpfooter{margin-left:170px}.folded #adminmenu,.folded #adminmenu li.menu-top,.folded #adminmenuback,.folded #adminmenuwrap{width:150px}.folded #adminmenu .wp-submenu{border-top-color:transparent}.folded #adminmenu .wp-menu-name{display:block}.folded #adminmenu .opensub .wp-submenu,.folded #adminmenu .wp-submenu.sub-open{left:110px}.folded #adminmenu .wp-has-current-submenu .wp-submenu,.folded #adminmenu a.wp-has-current-submenu:focus+.wp-submenu{top:-1px;position:relative}.folded #adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{background-color:transparent}#adminmenu .wp-submenu .wp-submenu-head{border-top-color:#ddd}.folded #adminmenu .wp-submenu ul{margin-left:5px}#adminmenu li.menu-top{margin-bottom:-2px}#adminmenu .wp-menu-arrow{display:none!important}.js.folded #adminmenu li.menu-top{display:block;zoom:100%}ul#adminmenu{z-index:99}#adminmenu li.menu-top a.menu-top{min-width:auto;width:auto}#wpcontent #adminmenu li.wp-has-current-submenu a.wp-has-submenu{font-style:normal}#wpcontent #adminmenu .wp-submenu li{padding:0}#adminmenu li.wp-has-current-submenu .wp-submenu{left:-40px}#adminmenu .wp-menu-image{display:none!important}#adminmenu a.menu-top .wp-menu-name{padding-left:8px}#collapse-menu{line-height:23px}#wpadminbar .ab-comments-icon{padding-top:7px}.theme-browser .theme{width:30%;margin:0 3% 4% 0;cursor:auto}.theme-browser .theme:focus,.theme-browser .theme:hover{cursor:auto}.theme-browser .theme .theme-screenshot{height:180px}.theme-browser .theme .theme-actions{position:static;background-color:#e8e8e8}.theme-browser .theme .more-details{display:none}.plugins td,.plugins th{border-top:1px solid #ddd}table.fixed td,table.fixed th{border-top:1px solid #ddd}#wpbody-content input.button,#wpbody-content input.button-primary{overflow:visible}#dashboard-widgets h3 a{height:14px;line-height:14px}#dashboard_browser_nag{color:#fff}#dashboard_browser_nag .browser-icon{position:relative}.tablenav-pages .current-page{vertical-align:middle}#wpbody-content .postbox{border:1px solid #ddd}#wpbody-content .postbox .hndle{margin-bottom:-1px}#addcat,#editcat,#template,#template div,.major-publishing-actions,.wp-submenu,.wp-submenu li{zoom:100%}.wp-menu-arrow{height:28px}.submitbox{margin-top:10px}#wpbody-content .quick-edit-row-post .inline-edit-col-left{width:39%}#wpbody-content .inline-edit-row-post .inline-edit-col-center{width:19%}#wpbody-content .quick-edit-row-page .inline-edit-col-left{width:49%}#wpbody-content .bulk-edit-row .inline-edit-col-left{width:29%}.inline-edit-row .submit{zoom:100%}.inline-edit-row fieldset label span.title{display:block;float:left;width:5em}.inline-edit-row fieldset label span.input-text-wrap{margin-left:0;zoom:100%}#wpbody-content .inline-edit-row fieldset label span.input-text-wrap input{line-height:130%}#wpbody-content .inline-edit-row .input-text-wrap input{width:95%}#wpbody-content .inline-edit-row .input-text-wrap input.inline-edit-password-input{width:8em}#titlediv #title{width:98%}.button,input[type=button],input[type=reset],input[type=submit]{padding:0 8px;line-height:20px;height:auto}.button.button-large,input[type=button].button-large,input[type=reset].button-large,input[type=submit].button-large{padding:0 10px;line-height:24px;height:auto}.button.button-small,input[type=button].button-small,input[type=reset].button-small,input[type=submit].button-small{padding:0 6px;line-height:16px;height:auto}a.button{margin:1px;padding:1px 9px 2px}a.button.button-large{padding:1px 11px 2px}a.button.button-small{padding:1px 7px 2px}#screen-options-wrap{overflow:hidden}#col-container,#col-left,#col-right,#dragHelper,#editorcontainer,#post-body,#post-status-info,#postdiv,#postdivrich,#poststuff,#the-comment-list .comment-item,#titlediv,#widgets-left,#wpwrap,#wrap,.fileedit-sub,.metabox-holder,.tablenav,.tagchecklist,.widget .widget-top,.widget-control-actions,.widget-liquid-left,.widget-liquid-right,.widgets-sortables{display:block;zoom:100%}p.search-box{position:static;float:right;margin:-3px 0 4px}#widget-list .widget{display:inline}#editorcontainer #content{overflow:auto;margin:auto;width:98%}form#template div{width:100%}.wp-editor-container .quicktags-toolbar input{overflow:visible;padding:0 4px}#poststuff h2{font-size:1.6em}#poststuff .inside #page_template,#poststuff .inside #parent_id,.inline-edit-row #post_parent,.inline-edit-row select[name=page_template]{width:250px}#submitdiv a.button,#submitdiv input,#submitdiv select{position:relative}#bh{margin:7px 10px 0 0;float:right}div#dashboard-widgets{padding-right:1px}.tagchecklist .ntdelbutton,.tagchecklist>li{display:inline-block;display:block}.tagchecklist .ntdelbutton:focus .remove-tag-icon:before{outline:1px solid #5b9dd9}.nav .button,.tablenav .button{padding-top:2px;padding-bottom:2px}.tablenav select{font-size:13px;display:inline-block;vertical-align:top;margin-top:2px}.tablenav .actions select{width:155px}.subsubsub li{display:inline}table.ie-fixed{table-layout:fixed}.widefat tfoot td,.widefat th,.widefat thead td,.widefat tr{margin-bottom:0;border-spacing:0}.widefat tfoot td input,.widefat th input,.widefat thead td input{margin:0 0 0 5px}.widefat tfoot .check-column,.widefat thead .check-column{padding-top:6px}.media.widefat tbody th.check-column,.widefat tbody th.check-column{padding:4px 0 0}.widefat{empty-cells:show;border-collapse:collapse}.tablenav a.button{display:inline-block;padding:2px 5px}.inactive-sidebar .widgets-sortables{padding-bottom:8px}#available-widgets .widget-holder{padding-bottom:65px}#widgets-left .inactive{padding-bottom:10px}.inactive-sidebar .widget,.widget-liquid-right .widget{position:relative}.inactive-sidebar .widget{display:block;float:left}#wpcontent .button-primary-disabled{color:#9fd0d5;background:#298cba}#the-comment-list .unapproved td,#the-comment-list .unapproved tr{background-color:#ffffe0}.imgedit-submit{width:300px}#nav-menus-frame,#wpbody,.menu li{zoom:100%}#update-nav-menu #post-body{overflow:hidden}.menu li{min-width:100%}.menu li.sortable-placeholder{min-width:400px}.available-theme{display:inline}.available-theme ul{margin:0}.available-theme .action-links li{padding-right:7px;margin-right:7px}.about-wrap .three-col.about-updates .col-2{width:15%}.about-wrap .about-password-meter input{width:98%}.revisions-tickmarks,.revisions-tooltip{display:none!important}.revisions.pinned .revisions-controls{position:relative}.login form .input,input[type=password]{font-family:sans-serif}.mce-btn i.mce-i-aligncenter,.mce-btn i.mce-i-alignjustify,.mce-btn i.mce-i-alignleft,.mce-btn i.mce-i-alignright,.mce-btn i.mce-i-blockquote,.mce-btn i.mce-i-bold,.mce-btn i.mce-i-bullist,.mce-btn i.mce-i-charmap,.mce-btn i.mce-i-forecolor,.mce-btn i.mce-i-fullscreen,.mce-btn i.mce-i-help,.mce-btn i.mce-i-hr,.mce-btn i.mce-i-indent,.mce-btn i.mce-i-italic,.mce-btn i.mce-i-link,.mce-btn i.mce-i-ltr,.mce-btn i.mce-i-numlist,.mce-btn i.mce-i-outdent,.mce-btn i.mce-i-pastetext,.mce-btn i.mce-i-pasteword,.mce-btn i.mce-i-redo,.mce-btn i.mce-i-removeformat,.mce-btn i.mce-i-spellchecker,.mce-btn i.mce-i-strikethrough,.mce-btn i.mce-i-underline,.mce-btn i.mce-i-undo,.mce-btn i.mce-i-unlink,.mce-btn i.mce-i-wp-media-library,.mce-btn i.mce-i-wp_adv,.mce-btn i.mce-i-wp_fullscreen,.mce-btn i.mce-i-wp_help,.mce-btn i.mce-i-wp_more,.mce-btn i.mce-i-wp_page,.mce-close{font-family:tinymce,Arial;font-style:normal;font-weight:400;font-variant:normal;font-size:16px;margin-left:0;padding-right:0}.mce-btn i.mce-i-wp_fullscreen,.qt-fullscreen{-ie7-icon:"\e023"}.mce-btn i.mce-i-wp_more,.mce-btn i.mce-i-wp_page{-ie7-icon:"\e027"}.mce-btn i.mce-i-wp_adv{background-color:#a0a5aa}.mce-btn i.mce-i-help,.mce-btn i.mce-i-wp_help{-ie7-icon:"\e016"}* html .row-actions{visibility:visible}* html div.widget-liquid-left,* html div.widget-liquid-right{display:block;position:relative}* html #editorcontainer{padding:0}* html #poststuff h2{margin-left:0}* html .stuffbox,* html .stuffbox input,* html .stuffbox textarea{border:1px solid #ddd}* html div.widget-liquid-left{width:99%}* html .widgets-sortables{height:50px}* html a#content_resize{right:-2px}* html .widget-title h4{width:205px}* html #removing-widget .in-widget-title{display:none}* html .media-item .pinkynail{height:32px;width:40px}* html .describe .field input.text,* html .describe .field textarea{width:440px}* html input{border:1px solid #ddd}* html .edit-box{display:inline}* html .postbox-container .meta-box-sortables{height:300px}* html #wpbody-content #screen-options-link-wrap{display:inline-block;width:150px;text-align:center}* html #wpbody-content #contextual-help-link-wrap{display:inline-block;width:100px;text-align:center}* html #adminmenu{margin-left:-80px}* html .folded #adminmenu{margin-left:-22px}* html #wpcontent #adminmenu li.menu-top{display:inline;padding:0;margin:0}* html #wpfooter{margin:0}* html #adminmenu div.wp-menu-image{height:29px} \ No newline at end of file diff --git a/wp-admin/css/install-rtl.css b/wp-admin/css/install-rtl.css new file mode 100644 index 0000000..288cc93 --- /dev/null +++ b/wp-admin/css/install-rtl.css @@ -0,0 +1,392 @@ +/*! This file is auto-generated */ +html { + background: #f1f1f1; + margin: 0 20px; +} + +body { + background: #fff; + color: #444; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + margin: 140px auto 25px; + padding: 20px 20px 10px 20px; + max-width: 700px; + -webkit-font-smoothing: subpixel-antialiased; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13); +} + +a { + color: #0073aa; +} + +a:hover, +a:active { + color: #00a0d2; +} + +a:focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.ie8 a:focus { + outline: #5b9dd9 solid 1px; +} + +h1, h2 { + border-bottom: 1px solid #ddd; + clear: both; + color: #666; + font-size: 24px; + padding: 0; + padding-bottom: 7px; + font-weight: 400; +} + +h3 { + font-size: 16px; +} + +p, li, dd, dt { + padding-bottom: 2px; + font-size: 14px; + line-height: 1.5; +} + +code, .code { + font-family: Consolas, Monaco, monospace; +} + +ul, ol, dl { + padding: 5px 22px 5px 5px; +} + +a img { + border: 0 +} +abbr { + border: 0; + font-variant: normal; +} + +fieldset { + border: 0; + padding: 0; + margin: 0; +} + +label { + cursor: pointer; +} + +#logo { + margin: 6px 0 14px 0; + padding: 0 0 7px 0; + border-bottom: none; + text-align: center +} +#logo a { + background-image: url(../images/w-logo-blue.png?ver=20131202); + background-image: none, url(../images/wordpress-logo.svg?ver=20131107); + background-size: 84px; + background-position: center top; + background-repeat: no-repeat; + color: #444; /* same as login.css */ + height: 84px; + font-size: 20px; + font-weight: 400; + line-height: 1.3; + margin: -130px auto 25px; + padding: 0; + text-decoration: none; + width: 84px; + text-indent: -9999px; + outline: none; + overflow: hidden; + display: block; +} + +.step { + margin: 20px 0 15px; +} +.step, th { + text-align: right; + padding: 0; +} +.language-chooser.wp-core-ui .step .button.button-large { + font-size: 14px; +} +textarea { + border: 1px solid #ddd; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + width: 100%; + box-sizing: border-box; +} + +.form-table { + border-collapse: collapse; + margin-top: 1em; + width: 100%; +} + +.form-table td { + margin-bottom: 9px; + padding: 10px 0 10px 20px; + font-size: 14px; + vertical-align: top +} + +.form-table th { + font-size: 14px; + text-align: right; + padding: 10px 0 10px 20px; + width: 140px; + vertical-align: top; +} + +.form-table code { + line-height: 1.28571428; + font-size: 14px; +} + +.form-table p { + margin: 4px 0 0 0; + font-size: 11px; +} + +.form-table input { + line-height: 1.33333333; + font-size: 15px; + padding: 3px 5px; + border: 1px solid #ddd; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07); +} + +input, +submit { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; +} + +.form-table input[type=text], +.form-table input[type=email], +.form-table input[type=url], +.form-table input[type=password], +#pass-strength-result { + width: 218px; +} + +.form-table th p { + font-weight: 400; +} + +.form-table.install-success th, +.form-table.install-success td { + vertical-align: middle; + padding: 16px 0 16px 20px; +} + +.form-table.install-success td p { + margin: 0; + font-size: 14px; +} + +.form-table.install-success td code { + margin: 0; + font-size: 18px; +} + +#error-page { + margin-top: 50px; +} + +#error-page p { + font-size: 14px; + line-height: 1.28571428; + margin: 25px 0 20px; +} + +#error-page code, .code { + font-family: Consolas, Monaco, monospace; +} + +.message { + border-right: 4px solid #dc3232; + padding: .7em .6em; + background-color: #fbeaea; +} + +/* rtl:ignore */ +#dbname, +#uname, +#pwd, +#dbhost, +#prefix, +#user_login, +#admin_email, +#pass1, +#pass2 { + direction: ltr; +} + + +/* localization */ +body.rtl, +.rtl textarea, +.rtl input, +.rtl submit { + font-family: Tahoma, sans-serif; +} + +:lang(he-il) body.rtl, +:lang(he-il) .rtl textarea, +:lang(he-il) .rtl input, +:lang(he-il) .rtl submit { + font-family: Arial, sans-serif; +} + +@media only screen and (max-width: 799px) { + body { + margin-top: 115px; + } + #logo a { + margin: -125px auto 30px; + } +} + +@media screen and (max-width: 782px) { + + .form-table { + margin-top: 0; + } + + .form-table th, + .form-table td { + display: block; + width: auto; + vertical-align: middle; + } + + .form-table th { + padding: 20px 0 0; + } + + .form-table td { + padding: 5px 0; + border: 0; + margin: 0; + } + + textarea, + input { + font-size: 16px; + } + + .form-table td input[type="text"], + .form-table td input[type="email"], + .form-table td input[type="url"], + .form-table td input[type="password"], + .form-table td select, + .form-table td textarea, + .form-table span.description { + width: 100%; + font-size: 16px; + line-height: 1.5; + padding: 7px 10px; + display: block; + max-width: none; + box-sizing: border-box; + } + + .wp-pwd #pass1 { + padding-left: 50px; + } + + .wp-pwd .button.wp-hide-pw { + left: 0; + } + + #pass-strength-result { + width: 100%; + } +} + +body.language-chooser { + max-width: 300px; +} + +.language-chooser select { + padding: 8px; + width: 100%; + display: block; + border: 1px solid #ddd; + background: #fff; + color: #32373c; + font-size: 16px; + font-family: Arial, sans-serif; + font-weight: 400; +} + +.language-chooser select:focus { + color: #32373c; +} + +.language-chooser select option:hover, +.language-chooser select option:focus { + color: #016087; +} + +.language-chooser p { + text-align: left; +} + +.screen-reader-input, +.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; + width: 1px; + word-wrap: normal !important; +} + +.spinner { + background: url(../images/spinner.gif) no-repeat; + background-size: 20px 20px; + visibility: hidden; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 2px 5px 0; +} + +.step .spinner { + display: inline-block; + vertical-align: middle; + margin-left: 15px; +} + +.button.hide-if-no-js, +.hide-if-no-js { + display: none; +} + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + .spinner { + background-image: url(../images/spinner-2x.gif); + } + +} diff --git a/wp-admin/css/install-rtl.min.css b/wp-admin/css/install-rtl.min.css new file mode 100644 index 0000000..92fd190 --- /dev/null +++ b/wp-admin/css/install-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +html{background:#f1f1f1;margin:0 20px}body{background:#fff;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:140px auto 25px;padding:20px 20px 10px 20px;max-width:700px;-webkit-font-smoothing:subpixel-antialiased;box-shadow:0 1px 3px rgba(0,0,0,.13)}a{color:#0073aa}a:active,a:hover{color:#00a0d2}a:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.ie8 a:focus{outline:#5b9dd9 solid 1px}h1,h2{border-bottom:1px solid #ddd;clear:both;color:#666;font-size:24px;padding:0;padding-bottom:7px;font-weight:400}h3{font-size:16px}dd,dt,li,p{padding-bottom:2px;font-size:14px;line-height:1.5}.code,code{font-family:Consolas,Monaco,monospace}dl,ol,ul{padding:5px 22px 5px 5px}a img{border:0}abbr{border:0;font-variant:normal}fieldset{border:0;padding:0;margin:0}label{cursor:pointer}#logo{margin:6px 0 14px 0;padding:0 0 7px 0;border-bottom:none;text-align:center}#logo a{background-image:url(../images/w-logo-blue.png?ver=20131202);background-image:none,url(../images/wordpress-logo.svg?ver=20131107);background-size:84px;background-position:center top;background-repeat:no-repeat;color:#444;height:84px;font-size:20px;font-weight:400;line-height:1.3;margin:-130px auto 25px;padding:0;text-decoration:none;width:84px;text-indent:-9999px;outline:0;overflow:hidden;display:block}.step{margin:20px 0 15px}.step,th{text-align:right;padding:0}.language-chooser.wp-core-ui .step .button.button-large{font-size:14px}textarea{border:1px solid #ddd;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;width:100%;box-sizing:border-box}.form-table{border-collapse:collapse;margin-top:1em;width:100%}.form-table td{margin-bottom:9px;padding:10px 0 10px 20px;font-size:14px;vertical-align:top}.form-table th{font-size:14px;text-align:right;padding:10px 0 10px 20px;width:140px;vertical-align:top}.form-table code{line-height:1.28571428;font-size:14px}.form-table p{margin:4px 0 0 0;font-size:11px}.form-table input{line-height:1.33333333;font-size:15px;padding:3px 5px;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07)}input,submit{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}#pass-strength-result,.form-table input[type=email],.form-table input[type=password],.form-table input[type=text],.form-table input[type=url]{width:218px}.form-table th p{font-weight:400}.form-table.install-success td,.form-table.install-success th{vertical-align:middle;padding:16px 0 16px 20px}.form-table.install-success td p{margin:0;font-size:14px}.form-table.install-success td code{margin:0;font-size:18px}#error-page{margin-top:50px}#error-page p{font-size:14px;line-height:1.28571428;margin:25px 0 20px}#error-page code,.code{font-family:Consolas,Monaco,monospace}.message{border-right:4px solid #dc3232;padding:.7em .6em;background-color:#fbeaea}#admin_email,#dbhost,#dbname,#pass1,#pass2,#prefix,#pwd,#uname,#user_login{direction:ltr}.rtl input,.rtl submit,.rtl textarea,body.rtl{font-family:Tahoma,sans-serif}:lang(he-il) .rtl input,:lang(he-il) .rtl submit,:lang(he-il) .rtl textarea,:lang(he-il) body.rtl{font-family:Arial,sans-serif}@media only screen and (max-width:799px){body{margin-top:115px}#logo a{margin:-125px auto 30px}}@media screen and (max-width:782px){.form-table{margin-top:0}.form-table td,.form-table th{display:block;width:auto;vertical-align:middle}.form-table th{padding:20px 0 0}.form-table td{padding:5px 0;border:0;margin:0}input,textarea{font-size:16px}.form-table span.description,.form-table td input[type=email],.form-table td input[type=password],.form-table td input[type=text],.form-table td input[type=url],.form-table td select,.form-table td textarea{width:100%;font-size:16px;line-height:1.5;padding:7px 10px;display:block;max-width:none;box-sizing:border-box}.wp-pwd #pass1{padding-left:50px}.wp-pwd .button.wp-hide-pw{left:0}#pass-strength-result{width:100%}}body.language-chooser{max-width:300px}.language-chooser select{padding:8px;width:100%;display:block;border:1px solid #ddd;background:#fff;color:#32373c;font-size:16px;font-family:Arial,sans-serif;font-weight:400}.language-chooser select:focus{color:#32373c}.language-chooser select option:focus,.language-chooser select option:hover{color:#016087}.language-chooser p{text-align:left}.screen-reader-input,.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;width:1px;word-wrap:normal!important}.spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;visibility:hidden;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:2px 5px 0}.step .spinner{display:inline-block;vertical-align:middle;margin-left:15px}.button.hide-if-no-js,.hide-if-no-js{display:none}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.spinner{background-image:url(../images/spinner-2x.gif)}} \ No newline at end of file diff --git a/wp-admin/css/install.css b/wp-admin/css/install.css new file mode 100644 index 0000000..a9a2cdf --- /dev/null +++ b/wp-admin/css/install.css @@ -0,0 +1,391 @@ +html { + background: #f1f1f1; + margin: 0 20px; +} + +body { + background: #fff; + color: #444; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + margin: 140px auto 25px; + padding: 20px 20px 10px 20px; + max-width: 700px; + -webkit-font-smoothing: subpixel-antialiased; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13); +} + +a { + color: #0073aa; +} + +a:hover, +a:active { + color: #00a0d2; +} + +a:focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.ie8 a:focus { + outline: #5b9dd9 solid 1px; +} + +h1, h2 { + border-bottom: 1px solid #ddd; + clear: both; + color: #666; + font-size: 24px; + padding: 0; + padding-bottom: 7px; + font-weight: 400; +} + +h3 { + font-size: 16px; +} + +p, li, dd, dt { + padding-bottom: 2px; + font-size: 14px; + line-height: 1.5; +} + +code, .code { + font-family: Consolas, Monaco, monospace; +} + +ul, ol, dl { + padding: 5px 5px 5px 22px; +} + +a img { + border: 0 +} +abbr { + border: 0; + font-variant: normal; +} + +fieldset { + border: 0; + padding: 0; + margin: 0; +} + +label { + cursor: pointer; +} + +#logo { + margin: 6px 0 14px 0; + padding: 0 0 7px 0; + border-bottom: none; + text-align: center +} +#logo a { + background-image: url(../images/w-logo-blue.png?ver=20131202); + background-image: none, url(../images/wordpress-logo.svg?ver=20131107); + background-size: 84px; + background-position: center top; + background-repeat: no-repeat; + color: #444; /* same as login.css */ + height: 84px; + font-size: 20px; + font-weight: 400; + line-height: 1.3; + margin: -130px auto 25px; + padding: 0; + text-decoration: none; + width: 84px; + text-indent: -9999px; + outline: none; + overflow: hidden; + display: block; +} + +.step { + margin: 20px 0 15px; +} +.step, th { + text-align: left; + padding: 0; +} +.language-chooser.wp-core-ui .step .button.button-large { + font-size: 14px; +} +textarea { + border: 1px solid #ddd; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + width: 100%; + box-sizing: border-box; +} + +.form-table { + border-collapse: collapse; + margin-top: 1em; + width: 100%; +} + +.form-table td { + margin-bottom: 9px; + padding: 10px 20px 10px 0; + font-size: 14px; + vertical-align: top +} + +.form-table th { + font-size: 14px; + text-align: left; + padding: 10px 20px 10px 0; + width: 140px; + vertical-align: top; +} + +.form-table code { + line-height: 1.28571428; + font-size: 14px; +} + +.form-table p { + margin: 4px 0 0 0; + font-size: 11px; +} + +.form-table input { + line-height: 1.33333333; + font-size: 15px; + padding: 3px 5px; + border: 1px solid #ddd; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07); +} + +input, +submit { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; +} + +.form-table input[type=text], +.form-table input[type=email], +.form-table input[type=url], +.form-table input[type=password], +#pass-strength-result { + width: 218px; +} + +.form-table th p { + font-weight: 400; +} + +.form-table.install-success th, +.form-table.install-success td { + vertical-align: middle; + padding: 16px 20px 16px 0; +} + +.form-table.install-success td p { + margin: 0; + font-size: 14px; +} + +.form-table.install-success td code { + margin: 0; + font-size: 18px; +} + +#error-page { + margin-top: 50px; +} + +#error-page p { + font-size: 14px; + line-height: 1.28571428; + margin: 25px 0 20px; +} + +#error-page code, .code { + font-family: Consolas, Monaco, monospace; +} + +.message { + border-left: 4px solid #dc3232; + padding: .7em .6em; + background-color: #fbeaea; +} + +/* rtl:ignore */ +#dbname, +#uname, +#pwd, +#dbhost, +#prefix, +#user_login, +#admin_email, +#pass1, +#pass2 { + direction: ltr; +} + + +/* localization */ +body.rtl, +.rtl textarea, +.rtl input, +.rtl submit { + font-family: Tahoma, sans-serif; +} + +:lang(he-il) body.rtl, +:lang(he-il) .rtl textarea, +:lang(he-il) .rtl input, +:lang(he-il) .rtl submit { + font-family: Arial, sans-serif; +} + +@media only screen and (max-width: 799px) { + body { + margin-top: 115px; + } + #logo a { + margin: -125px auto 30px; + } +} + +@media screen and (max-width: 782px) { + + .form-table { + margin-top: 0; + } + + .form-table th, + .form-table td { + display: block; + width: auto; + vertical-align: middle; + } + + .form-table th { + padding: 20px 0 0; + } + + .form-table td { + padding: 5px 0; + border: 0; + margin: 0; + } + + textarea, + input { + font-size: 16px; + } + + .form-table td input[type="text"], + .form-table td input[type="email"], + .form-table td input[type="url"], + .form-table td input[type="password"], + .form-table td select, + .form-table td textarea, + .form-table span.description { + width: 100%; + font-size: 16px; + line-height: 1.5; + padding: 7px 10px; + display: block; + max-width: none; + box-sizing: border-box; + } + + .wp-pwd #pass1 { + padding-right: 50px; + } + + .wp-pwd .button.wp-hide-pw { + right: 0; + } + + #pass-strength-result { + width: 100%; + } +} + +body.language-chooser { + max-width: 300px; +} + +.language-chooser select { + padding: 8px; + width: 100%; + display: block; + border: 1px solid #ddd; + background: #fff; + color: #32373c; + font-size: 16px; + font-family: Arial, sans-serif; + font-weight: 400; +} + +.language-chooser select:focus { + color: #32373c; +} + +.language-chooser select option:hover, +.language-chooser select option:focus { + color: #016087; +} + +.language-chooser p { + text-align: right; +} + +.screen-reader-input, +.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; + width: 1px; + word-wrap: normal !important; +} + +.spinner { + background: url(../images/spinner.gif) no-repeat; + background-size: 20px 20px; + visibility: hidden; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 2px 5px 0; +} + +.step .spinner { + display: inline-block; + vertical-align: middle; + margin-right: 15px; +} + +.button.hide-if-no-js, +.hide-if-no-js { + display: none; +} + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + .spinner { + background-image: url(../images/spinner-2x.gif); + } + +} diff --git a/wp-admin/css/install.min.css b/wp-admin/css/install.min.css new file mode 100644 index 0000000..3415f5b --- /dev/null +++ b/wp-admin/css/install.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +html{background:#f1f1f1;margin:0 20px}body{background:#fff;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:140px auto 25px;padding:20px 20px 10px 20px;max-width:700px;-webkit-font-smoothing:subpixel-antialiased;box-shadow:0 1px 3px rgba(0,0,0,.13)}a{color:#0073aa}a:active,a:hover{color:#00a0d2}a:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.ie8 a:focus{outline:#5b9dd9 solid 1px}h1,h2{border-bottom:1px solid #ddd;clear:both;color:#666;font-size:24px;padding:0;padding-bottom:7px;font-weight:400}h3{font-size:16px}dd,dt,li,p{padding-bottom:2px;font-size:14px;line-height:1.5}.code,code{font-family:Consolas,Monaco,monospace}dl,ol,ul{padding:5px 5px 5px 22px}a img{border:0}abbr{border:0;font-variant:normal}fieldset{border:0;padding:0;margin:0}label{cursor:pointer}#logo{margin:6px 0 14px 0;padding:0 0 7px 0;border-bottom:none;text-align:center}#logo a{background-image:url(../images/w-logo-blue.png?ver=20131202);background-image:none,url(../images/wordpress-logo.svg?ver=20131107);background-size:84px;background-position:center top;background-repeat:no-repeat;color:#444;height:84px;font-size:20px;font-weight:400;line-height:1.3;margin:-130px auto 25px;padding:0;text-decoration:none;width:84px;text-indent:-9999px;outline:0;overflow:hidden;display:block}.step{margin:20px 0 15px}.step,th{text-align:left;padding:0}.language-chooser.wp-core-ui .step .button.button-large{font-size:14px}textarea{border:1px solid #ddd;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;width:100%;box-sizing:border-box}.form-table{border-collapse:collapse;margin-top:1em;width:100%}.form-table td{margin-bottom:9px;padding:10px 20px 10px 0;font-size:14px;vertical-align:top}.form-table th{font-size:14px;text-align:left;padding:10px 20px 10px 0;width:140px;vertical-align:top}.form-table code{line-height:1.28571428;font-size:14px}.form-table p{margin:4px 0 0 0;font-size:11px}.form-table input{line-height:1.33333333;font-size:15px;padding:3px 5px;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07)}input,submit{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}#pass-strength-result,.form-table input[type=email],.form-table input[type=password],.form-table input[type=text],.form-table input[type=url]{width:218px}.form-table th p{font-weight:400}.form-table.install-success td,.form-table.install-success th{vertical-align:middle;padding:16px 20px 16px 0}.form-table.install-success td p{margin:0;font-size:14px}.form-table.install-success td code{margin:0;font-size:18px}#error-page{margin-top:50px}#error-page p{font-size:14px;line-height:1.28571428;margin:25px 0 20px}#error-page code,.code{font-family:Consolas,Monaco,monospace}.message{border-left:4px solid #dc3232;padding:.7em .6em;background-color:#fbeaea}#admin_email,#dbhost,#dbname,#pass1,#pass2,#prefix,#pwd,#uname,#user_login{direction:ltr}.rtl input,.rtl submit,.rtl textarea,body.rtl{font-family:Tahoma,sans-serif}:lang(he-il) .rtl input,:lang(he-il) .rtl submit,:lang(he-il) .rtl textarea,:lang(he-il) body.rtl{font-family:Arial,sans-serif}@media only screen and (max-width:799px){body{margin-top:115px}#logo a{margin:-125px auto 30px}}@media screen and (max-width:782px){.form-table{margin-top:0}.form-table td,.form-table th{display:block;width:auto;vertical-align:middle}.form-table th{padding:20px 0 0}.form-table td{padding:5px 0;border:0;margin:0}input,textarea{font-size:16px}.form-table span.description,.form-table td input[type=email],.form-table td input[type=password],.form-table td input[type=text],.form-table td input[type=url],.form-table td select,.form-table td textarea{width:100%;font-size:16px;line-height:1.5;padding:7px 10px;display:block;max-width:none;box-sizing:border-box}.wp-pwd #pass1{padding-right:50px}.wp-pwd .button.wp-hide-pw{right:0}#pass-strength-result{width:100%}}body.language-chooser{max-width:300px}.language-chooser select{padding:8px;width:100%;display:block;border:1px solid #ddd;background:#fff;color:#32373c;font-size:16px;font-family:Arial,sans-serif;font-weight:400}.language-chooser select:focus{color:#32373c}.language-chooser select option:focus,.language-chooser select option:hover{color:#016087}.language-chooser p{text-align:right}.screen-reader-input,.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;width:1px;word-wrap:normal!important}.spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;visibility:hidden;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:2px 5px 0}.step .spinner{display:inline-block;vertical-align:middle;margin-right:15px}.button.hide-if-no-js,.hide-if-no-js{display:none}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.spinner{background-image:url(../images/spinner-2x.gif)}} \ No newline at end of file diff --git a/wp-admin/css/l10n-rtl.css b/wp-admin/css/l10n-rtl.css new file mode 100644 index 0000000..eaefa4e --- /dev/null +++ b/wp-admin/css/l10n-rtl.css @@ -0,0 +1,121 @@ +/*! This file is auto-generated */ +/*------------------------------------------------------------------------------ + 27.0 - Localization +------------------------------------------------------------------------------*/ + +/* RTL except Hebrew (see below): Tahoma as the first font; */ +body.rtl, +body.rtl .press-this a.wp-switch-editor { + font-family: Tahoma, Arial, sans-serif; +} + +/* Arial is best for RTL headings. */ +.rtl h1, +.rtl h2, +.rtl h3, +.rtl h4, +.rtl h5, +.rtl h6 { + font-family: Arial, sans-serif; + font-weight: 600; +} + +/* he_IL: Remove Tahoma from the font stack. Arial is best for Hebrew. */ +body.locale-he-il, +body.locale-he-il .press-this a.wp-switch-editor { + font-family: Arial, sans-serif; +} + +/* he_IL: Have be bold rather than italic. */ +.locale-he-il em { + font-style: normal; + font-weight: 600; +} + +/* zh_CN: Remove italic properties. */ +.locale-zh-cn .howto, +.locale-zh-cn .tablenav .displaying-num, +.locale-zh-cn .js .input-with-default-title, +.locale-zh-cn .link-to-original, +.locale-zh-cn .inline-edit-row fieldset span.title, +.locale-zh-cn .inline-edit-row fieldset span.checkbox-title, +.locale-zh-cn #utc-time, +.locale-zh-cn #local-time, +.locale-zh-cn p.install-help, +.locale-zh-cn p.help, +.locale-zh-cn p.description, +.locale-zh-cn span.description, +.locale-zh-cn .form-wrap p { + font-style: normal; +} + +/* zh_CN: Enlarge dashboard widget 'Configure' link */ +.locale-zh-cn .hdnle a { font-size: 12px; } + +/* zn_CH: Enlarge font size, set font-size: normal */ +.locale-zh-cn form.upgrade .hint { font-style: normal; font-size: 100%; } + +/* zh_CN: Enlarge font-size. */ +.locale-zh-cn #sort-buttons { font-size: 1em !important; } + +/* de_DE: Text needs more space for translation */ +.locale-de-de #customize-header-actions .button, +.locale-de-de-formal #customize-header-actions .button { + padding: 0 5px 1px; /* default 0 10px 1px */ +} +.locale-de-de #customize-header-actions .spinner, +.locale-de-de-formal #customize-header-actions .spinner { + margin: 16px 3px 0; /* default 16px 4px 0 5px */ +} + +/* ru_RU: Text needs more room to breathe. */ +.locale-ru-ru #adminmenu { + width: inherit; /* back-compat for pre-3.2 */ +} +.locale-ru-ru #adminmenu, +.locale-ru-ru #wpbody { + margin-right: 0; /* back-compat for pre-3.2 */ +} +.locale-ru-ru .inline-edit-row fieldset label span.title, +.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend { + width: 8em; /* default 6em */ +} +.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap, +.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap { + margin-right: 8em; /* default 6em */ +} +.locale-ru-ru.post-php .tagsdiv .newtag, +.locale-ru-ru.post-new-php .tagsdiv .newtag { + width: 165px; /* default 180px - 15px */ +} +.locale-ru-ru.press-this .posting { + margin-left: 277px; /* default 252px + 25px */ +} +.locale-ru-ru .press-this-sidebar { + width: 265px; /* default 240px + 25px */ +} +.locale-ru-ru #customize-header-actions .button { + padding: 0 5px 1px; /* default 0 10px 1px */ +} +.locale-ru-ru #customize-header-actions .spinner { + margin: 16px 3px 0; /* default 16px 4px 0 5px */ +} + +/* lt_LT: QuickEdit */ +.locale-lt-lt .inline-edit-row fieldset label span.title, +.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend { + width: 8em; /* default 6em */ +} +.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap, +.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap { + margin-right: 8em; /* default 6em */ +} + +@media screen and (max-width: 782px) { + .locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap, + .locale-ru-ru .inline-edit-row fieldset .timestamp-wrap, + .locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap, + .locale-lt-lt .inline-edit-row fieldset .timestamp-wrap { + margin-right: 0; + } +} diff --git a/wp-admin/css/l10n-rtl.min.css b/wp-admin/css/l10n-rtl.min.css new file mode 100644 index 0000000..3ac11f8 --- /dev/null +++ b/wp-admin/css/l10n-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body.rtl,body.rtl .press-this a.wp-switch-editor{font-family:Tahoma,Arial,sans-serif}.rtl h1,.rtl h2,.rtl h3,.rtl h4,.rtl h5,.rtl h6{font-family:Arial,sans-serif;font-weight:600}body.locale-he-il,body.locale-he-il .press-this a.wp-switch-editor{font-family:Arial,sans-serif}.locale-he-il em{font-style:normal;font-weight:600}.locale-zh-cn #local-time,.locale-zh-cn #utc-time,.locale-zh-cn .form-wrap p,.locale-zh-cn .howto,.locale-zh-cn .inline-edit-row fieldset span.checkbox-title,.locale-zh-cn .inline-edit-row fieldset span.title,.locale-zh-cn .js .input-with-default-title,.locale-zh-cn .link-to-original,.locale-zh-cn .tablenav .displaying-num,.locale-zh-cn p.description,.locale-zh-cn p.help,.locale-zh-cn p.install-help,.locale-zh-cn span.description{font-style:normal}.locale-zh-cn .hdnle a{font-size:12px}.locale-zh-cn form.upgrade .hint{font-style:normal;font-size:100%}.locale-zh-cn #sort-buttons{font-size:1em!important}.locale-de-de #customize-header-actions .button,.locale-de-de-formal #customize-header-actions .button{padding:0 5px 1px}.locale-de-de #customize-header-actions .spinner,.locale-de-de-formal #customize-header-actions .spinner{margin:16px 3px 0}.locale-ru-ru #adminmenu{width:inherit}.locale-ru-ru #adminmenu,.locale-ru-ru #wpbody{margin-right:0}.locale-ru-ru .inline-edit-row fieldset label span.title,.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend{width:8em}.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap{margin-right:8em}.locale-ru-ru.post-new-php .tagsdiv .newtag,.locale-ru-ru.post-php .tagsdiv .newtag{width:165px}.locale-ru-ru.press-this .posting{margin-left:277px}.locale-ru-ru .press-this-sidebar{width:265px}.locale-ru-ru #customize-header-actions .button{padding:0 5px 1px}.locale-ru-ru #customize-header-actions .spinner{margin:16px 3px 0}.locale-lt-lt .inline-edit-row fieldset label span.title,.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend{width:8em}.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap,.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap{margin-right:8em}@media screen and (max-width:782px){.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap,.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap{margin-right:0}} \ No newline at end of file diff --git a/wp-admin/css/l10n.css b/wp-admin/css/l10n.css new file mode 100644 index 0000000..967fb4c --- /dev/null +++ b/wp-admin/css/l10n.css @@ -0,0 +1,120 @@ +/*------------------------------------------------------------------------------ + 27.0 - Localization +------------------------------------------------------------------------------*/ + +/* RTL except Hebrew (see below): Tahoma as the first font; */ +body.rtl, +body.rtl .press-this a.wp-switch-editor { + font-family: Tahoma, Arial, sans-serif; +} + +/* Arial is best for RTL headings. */ +.rtl h1, +.rtl h2, +.rtl h3, +.rtl h4, +.rtl h5, +.rtl h6 { + font-family: Arial, sans-serif; + font-weight: 600; +} + +/* he_IL: Remove Tahoma from the font stack. Arial is best for Hebrew. */ +body.locale-he-il, +body.locale-he-il .press-this a.wp-switch-editor { + font-family: Arial, sans-serif; +} + +/* he_IL: Have be bold rather than italic. */ +.locale-he-il em { + font-style: normal; + font-weight: 600; +} + +/* zh_CN: Remove italic properties. */ +.locale-zh-cn .howto, +.locale-zh-cn .tablenav .displaying-num, +.locale-zh-cn .js .input-with-default-title, +.locale-zh-cn .link-to-original, +.locale-zh-cn .inline-edit-row fieldset span.title, +.locale-zh-cn .inline-edit-row fieldset span.checkbox-title, +.locale-zh-cn #utc-time, +.locale-zh-cn #local-time, +.locale-zh-cn p.install-help, +.locale-zh-cn p.help, +.locale-zh-cn p.description, +.locale-zh-cn span.description, +.locale-zh-cn .form-wrap p { + font-style: normal; +} + +/* zh_CN: Enlarge dashboard widget 'Configure' link */ +.locale-zh-cn .hdnle a { font-size: 12px; } + +/* zn_CH: Enlarge font size, set font-size: normal */ +.locale-zh-cn form.upgrade .hint { font-style: normal; font-size: 100%; } + +/* zh_CN: Enlarge font-size. */ +.locale-zh-cn #sort-buttons { font-size: 1em !important; } + +/* de_DE: Text needs more space for translation */ +.locale-de-de #customize-header-actions .button, +.locale-de-de-formal #customize-header-actions .button { + padding: 0 5px 1px; /* default 0 10px 1px */ +} +.locale-de-de #customize-header-actions .spinner, +.locale-de-de-formal #customize-header-actions .spinner { + margin: 16px 3px 0; /* default 16px 4px 0 5px */ +} + +/* ru_RU: Text needs more room to breathe. */ +.locale-ru-ru #adminmenu { + width: inherit; /* back-compat for pre-3.2 */ +} +.locale-ru-ru #adminmenu, +.locale-ru-ru #wpbody { + margin-left: 0; /* back-compat for pre-3.2 */ +} +.locale-ru-ru .inline-edit-row fieldset label span.title, +.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend { + width: 8em; /* default 6em */ +} +.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap, +.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap { + margin-left: 8em; /* default 6em */ +} +.locale-ru-ru.post-php .tagsdiv .newtag, +.locale-ru-ru.post-new-php .tagsdiv .newtag { + width: 165px; /* default 180px - 15px */ +} +.locale-ru-ru.press-this .posting { + margin-right: 277px; /* default 252px + 25px */ +} +.locale-ru-ru .press-this-sidebar { + width: 265px; /* default 240px + 25px */ +} +.locale-ru-ru #customize-header-actions .button { + padding: 0 5px 1px; /* default 0 10px 1px */ +} +.locale-ru-ru #customize-header-actions .spinner { + margin: 16px 3px 0; /* default 16px 4px 0 5px */ +} + +/* lt_LT: QuickEdit */ +.locale-lt-lt .inline-edit-row fieldset label span.title, +.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend { + width: 8em; /* default 6em */ +} +.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap, +.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap { + margin-left: 8em; /* default 6em */ +} + +@media screen and (max-width: 782px) { + .locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap, + .locale-ru-ru .inline-edit-row fieldset .timestamp-wrap, + .locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap, + .locale-lt-lt .inline-edit-row fieldset .timestamp-wrap { + margin-left: 0; + } +} diff --git a/wp-admin/css/l10n.min.css b/wp-admin/css/l10n.min.css new file mode 100644 index 0000000..6a427f4 --- /dev/null +++ b/wp-admin/css/l10n.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body.rtl,body.rtl .press-this a.wp-switch-editor{font-family:Tahoma,Arial,sans-serif}.rtl h1,.rtl h2,.rtl h3,.rtl h4,.rtl h5,.rtl h6{font-family:Arial,sans-serif;font-weight:600}body.locale-he-il,body.locale-he-il .press-this a.wp-switch-editor{font-family:Arial,sans-serif}.locale-he-il em{font-style:normal;font-weight:600}.locale-zh-cn #local-time,.locale-zh-cn #utc-time,.locale-zh-cn .form-wrap p,.locale-zh-cn .howto,.locale-zh-cn .inline-edit-row fieldset span.checkbox-title,.locale-zh-cn .inline-edit-row fieldset span.title,.locale-zh-cn .js .input-with-default-title,.locale-zh-cn .link-to-original,.locale-zh-cn .tablenav .displaying-num,.locale-zh-cn p.description,.locale-zh-cn p.help,.locale-zh-cn p.install-help,.locale-zh-cn span.description{font-style:normal}.locale-zh-cn .hdnle a{font-size:12px}.locale-zh-cn form.upgrade .hint{font-style:normal;font-size:100%}.locale-zh-cn #sort-buttons{font-size:1em!important}.locale-de-de #customize-header-actions .button,.locale-de-de-formal #customize-header-actions .button{padding:0 5px 1px}.locale-de-de #customize-header-actions .spinner,.locale-de-de-formal #customize-header-actions .spinner{margin:16px 3px 0}.locale-ru-ru #adminmenu{width:inherit}.locale-ru-ru #adminmenu,.locale-ru-ru #wpbody{margin-left:0}.locale-ru-ru .inline-edit-row fieldset label span.title,.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend{width:8em}.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap{margin-left:8em}.locale-ru-ru.post-new-php .tagsdiv .newtag,.locale-ru-ru.post-php .tagsdiv .newtag{width:165px}.locale-ru-ru.press-this .posting{margin-right:277px}.locale-ru-ru .press-this-sidebar{width:265px}.locale-ru-ru #customize-header-actions .button{padding:0 5px 1px}.locale-ru-ru #customize-header-actions .spinner{margin:16px 3px 0}.locale-lt-lt .inline-edit-row fieldset label span.title,.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend{width:8em}.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap,.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap{margin-left:8em}@media screen and (max-width:782px){.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap,.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap{margin-left:0}} \ No newline at end of file diff --git a/wp-admin/css/list-tables-rtl.css b/wp-admin/css/list-tables-rtl.css new file mode 100644 index 0000000..b789dc1 --- /dev/null +++ b/wp-admin/css/list-tables-rtl.css @@ -0,0 +1,2169 @@ +/*! This file is auto-generated */ +.response-links { + display: block; + margin-bottom: 1em; +} + +.response-links a { + display: block; +} + +.response-links a.comments-edit-item-link { + font-weight: 600; +} + +.response-links a.comments-view-item-link { + font-size: 12px; +} + +.post-com-count-wrapper strong { + font-weight: 400; +} + +.comments-view-item-link { + display: inline-block; + clear: both; +} + +.column-response .post-com-count-wrapper, +.column-comments .post-com-count-wrapper { + white-space: nowrap; + word-wrap: normal; +} + +/* comments bubble common */ +.column-response .post-com-count, +.column-comments .post-com-count { + display: inline-block; + vertical-align: top; +} + +/* comments bubble approved */ +.column-response .post-com-count-no-comments, +.column-response .post-com-count-approved, +.column-comments .post-com-count-no-comments, +.column-comments .post-com-count-approved { + margin-top: 5px; +} + +.column-response .comment-count-no-comments, +.column-response .comment-count-approved, +.column-comments .comment-count-no-comments, +.column-comments .comment-count-approved { + box-sizing: border-box; + display: block; + padding: 0 8px; + min-width: 24px; + height: 2em; + border-radius: 5px; + background-color: #72777c; + color: #fff; + font-size: 11px; + line-height: 1.90909090; + text-align: center; +} + +.ie8 .column-response .comment-count-no-comments, +.ie8 .column-response .comment-count-approved, +.ie8 .column-comments .comment-count-no-comments, +.ie8 .column-comments .comment-count-approved { + min-width: 0; +} + +.column-response .post-com-count-no-comments:after, +.column-response .post-com-count-approved:after, +.column-comments .post-com-count-no-comments:after, +.column-comments .post-com-count-approved:after { + content: ""; + display: block; + margin-right: 8px; + width: 0; + height: 0; + border-top: 5px solid #72777c; + border-left: 5px solid transparent; +} + +.column-response .post-com-count-approved:hover .comment-count-approved, +.column-response .post-com-count-approved:focus .comment-count-approved, +.column-comments .post-com-count-approved:hover .comment-count-approved, +.column-comments .post-com-count-approved:focus .comment-count-approved { + background: #0073aa; +} + +.column-response .post-com-count-approved:hover:after, +.column-response .post-com-count-approved:focus:after, +.column-comments .post-com-count-approved:hover:after, +.column-comments .post-com-count-approved:focus:after { + border-top-color: #0073aa; +} + +/* @todo: consider to use a single rule for these counters and the admin menu counters. */ +.column-response .post-com-count-pending, +.column-comments .post-com-count-pending { + position: relative; + right: -3px; + padding: 0 5px; + min-width: 7px; + height: 17px; + border: 2px solid #fff; + border-radius: 11px; + background: #ca4a1f; + color: #fff; + font-size: 9px; + line-height: 1.88888888; + text-align: center; +} + +.column-response .post-com-count-no-pending, +.column-comments .post-com-count-no-pending { + display: none; +} + +/* comments */ + +.commentlist li { + padding: 1em 1em .2em; + margin: 0; + border-bottom: 1px solid #ccc; +} + +.commentlist li li { + border-bottom: 0; + padding: 0; +} + +.commentlist p { + padding: 0; + margin: 0 0 .8em; +} + +#submitted-on, +.submitted-on { + color: #555d66; +} + +/* reply to comments */ +#replyrow td { + padding: 2px; +} + +#replysubmit { + margin: 0; + padding: 5px 7px 10px; + overflow: hidden; +} + +#replysubmit .reply-submit-buttons { + margin-bottom: 0; +} + +#replysubmit .button { + margin-left: 5px; +} + +#replysubmit .spinner { + float: none; + margin: -4px 0 0; +} + +#replyrow.inline-edit-row fieldset.comment-reply { + font-size: inherit; + line-height: inherit; +} + +#replyrow legend { + margin: 0; + padding: .2em 5px 0; + font-size: 13px; + line-height: 1.4; + font-weight: 600; +} + +#replyrow.inline-edit-row label { + display: inline; + vertical-align: baseline; + line-height: inherit; +} + +#edithead .inside, +#commentsdiv #edithead .inside { + float: right; + padding: 3px 5px 2px 0; + margin: 0; + text-align: center; +} + +#edithead .inside input { + width: 180px; +} + +#edithead label { + padding: 2px 0; +} + +#replycontainer { + padding: 5px; +} + +#replycontent { + height: 120px; + box-shadow: none; +} + +#replyerror { + border-color: #ddd; + background-color: #f9f9f9; +} + +/* @todo: is this used? */ +.commentlist .avatar { + vertical-align: text-top; +} + +#the-comment-list tr.undo, +#the-comment-list div.undo { + background-color: #f5f5f5; +} + +#the-comment-list .unapproved th, +#the-comment-list .unapproved td { + background-color: #fef7f1; +} + +#the-comment-list .unapproved th.check-column { + border-right: 4px solid #d54e21; +} + +#the-comment-list .unapproved th.check-column input { + margin-right: 4px; +} + +#the-comment-list .approve a { + color: #006505; +} + +#the-comment-list .unapprove a { + color: #d98500; +} + +#the-comment-list th, +#the-comment-list td { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +#the-comment-list tr:last-child th, +#the-comment-list tr:last-child td { + box-shadow: none; +} + +#the-comment-list tr.unapproved + tr.approved th, +#the-comment-list tr.unapproved + tr.approved td { + border-top: 1px solid rgba(0, 0, 0, 0.03); +} + +/* table vim shortcuts */ +.vim-current, +.vim-current th, +.vim-current td { + background-color: #e4f2fd !important; +} + +th .comment-grey-bubble { + height: 16px; + width: 16px; +} + +th .comment-grey-bubble:before { + content: "\f101"; + font: normal 20px/.5 dashicons; + speak: none; + display: inline-block; + padding: 0; + top: 4px; + right: -4px; + position: relative; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #444; +} + +/*------------------------------------------------------------------------------ + 10.0 - List Posts (/Pages/etc) +------------------------------------------------------------------------------*/ + +table.fixed { + table-layout: fixed; +} + +.fixed .column-rating, +.fixed .column-visible { + width: 8%; +} + +.fixed .column-posts, +.fixed .column-date, +.fixed .column-parent, +.fixed .column-links, +.fixed .column-author, +.fixed .column-format { + width: 10%; +} + +.column-date span[title] { + -webkit-text-decoration: dotted underline; + text-decoration: dotted underline; +} + +.fixed .column-posts { + width: 74px; +} + +.fixed .column-comment .comment-author { + display: none; +} + +.fixed .column-response, +.fixed .column-categories, +.fixed .column-tags, +.fixed .column-rel, +.fixed .column-role { + width: 15%; +} + +.fixed .column-slug { + width: 25%; +} + +.fixed .column-locations { + width: 35%; +} + +.fixed .column-comments { + width: 5.5em; + padding: 8px 0; + text-align: right; +} + +.fixed .column-comments .vers { + padding-right: 3px; +} + +td.column-title strong, +td.plugin-title strong { + display: block; + margin-bottom: .2em; + font-size: 14px; +} + +td.column-title p, +td.plugin-title p { + margin: 6px 0; +} + +/* Media file column */ +table.media .column-title .media-icon { + float: right; + min-height: 60px; + margin: 0 0 0 9px; +} + +table.media .column-title .media-icon img { + max-width: 60px; + height: auto; + vertical-align: top; /* Remove descender white-space. */ +} + +table.media .column-title .has-media-icon ~ .row-actions { + margin-right: 70px; /* 60px image + margin */ +} + +table.media .column-title .filename { + margin-bottom: 0.2em; +} + +/* @todo: pick a consistent list table selector */ +.wp-list-table a { + transition: none; +} + +#the-list tr:last-child td, +#the-list tr:last-child th { + border-bottom: none !important; + box-shadow: none; +} + +#comments-form .fixed .column-author { + width: 20%; +} + +#comments-form .fixed .column-date { + width: 14%; +} + +#commentsdiv.postbox .inside { + margin: 0; + padding: 0; +} + +#commentsdiv .inside .row-actions { + line-height: 1.38461538; +} + +#commentsdiv .inside .column-author { + width: 25%; +} + +#commentsdiv .column-comment p { + margin: 0.6em 0; + padding: 0; +} + +#commentsdiv #replyrow td { + padding: 0; +} + +#commentsdiv p { + padding: 8px 10px; + margin: 0; +} + +#commentsdiv .comments-box { + border: 0 none; +} + +#commentsdiv .comments-box thead th, +#commentsdiv .comments-box thead td { + background: transparent; + padding: 0 7px 4px; +} + +#commentsdiv .comments-box tr:last-child td { + border-bottom: 0 none; +} + +#commentsdiv #edithead .inside input { + width: 160px; +} + +.sorting-indicator { + display: block; + visibility: hidden; + width: 10px; + height: 4px; + margin-top: 8px; + margin-right: 7px; +} + +.sorting-indicator:before { + content: "\f142"; + font: normal 20px/1 dashicons; + speak: none; + display: inline-block; + padding: 0; + top: -4px; + right: -8px; + color: #444; + line-height: 0.5; + position: relative; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #444; +} + +.column-comments .sorting-indicator:before { + top: 0; + right: -10px; +} + +th.sorted.asc .sorting-indicator:before, +th.desc:hover span.sorting-indicator:before, +th.desc a:focus span.sorting-indicator:before { + content: "\f142"; +} + +th.sorted.desc .sorting-indicator:before, +th.asc:hover span.sorting-indicator:before, +th.asc a:focus span.sorting-indicator:before { + content: "\f140"; +} + +.wp-list-table .toggle-row { + position: absolute; + left: 8px; + top: 10px; + display: none; + padding: 0; + width: 40px; + height: 40px; + border: none; + outline: none; + background: transparent; +} + +.wp-list-table .toggle-row:hover { + cursor: pointer; +} + +.wp-list-table .toggle-row:focus:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.ie8 .wp-list-table .toggle-row:focus:before { + outline: #5b9dd9 solid 1px; +} + +.wp-list-table .toggle-row:active { + box-shadow: none; +} + +.wp-list-table .toggle-row:before { + position: absolute; + top: -5px; + right: 10px; + border-radius: 50%; + display: block; + padding: 1px 0 1px 2px; + color: #444; /* same as table headers sort arrows */ + content: "\f140"; + font: normal 20px/1 dashicons; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + speak: none; +} + +.wp-list-table .is-expanded .toggle-row:before { + content: "\f142"; +} + +.locked-indicator { + display: none; + margin-right: 6px; + height: 20px; + width: 16px; +} + +.locked-indicator-icon:before { + color: #82878c; + content: "\f160"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.locked-info { + display: none; + margin-top: 4px; +} + +.locked-text { + vertical-align: top; +} + +.wp-locked .locked-indicator, +.wp-locked .locked-info { + display: block; +} + +tr.wp-locked .check-column label, +tr.wp-locked .check-column input[type="checkbox"], +tr.wp-locked .row-actions .inline, +tr.wp-locked .row-actions .trash { + display: none; +} + +.fixed .column-comments .sorting-indicator { + margin-top: 3px; +} + +#menu-locations-wrap .widefat { + width: 60%; +} + +.widefat th.sortable, +.widefat th.sorted { + padding: 0; +} + +th.sortable a, +th.sorted a { + display: block; + overflow: hidden; + padding: 8px; +} + +.fixed .column-comments.sortable a, +.fixed .column-comments.sorted a { + padding: 8px 0; +} + +th.sortable a span, +th.sorted a span { + float: right; + cursor: pointer; +} + +th.sorted .sorting-indicator, +th.desc:hover span.sorting-indicator, +th.desc a:focus span.sorting-indicator, +th.asc:hover span.sorting-indicator, +th.asc a:focus span.sorting-indicator { + visibility: visible; +} + +.tablenav-pages .current-page { + margin: 0 0 0 2px; + font-size: 13px; + text-align: center; +} + +.tablenav .total-pages { + margin-left: 2px; +} + +.tablenav #table-paging { + margin-right: 2px; +} + +.tablenav { + clear: both; + height: 30px; + margin: 6px 0 4px; + padding-top: 5px; + vertical-align: middle; +} + +.tablenav.themes { + max-width: 98%; +} + +.tablenav .tablenav-pages { + float: left; + margin: 0 0 9px; +} + +.tablenav .no-pages, +.tablenav .one-page .pagination-links { + display: none; +} + +.tablenav .tablenav-pages .button, +.tablenav .tablenav-pages .tablenav-pages-navspan { + display: inline-block; + vertical-align: baseline; + min-width: 30px; + min-height: 30px; + margin: 0; + padding: 0 4px; + font-size: 16px; + line-height: 1.625; /* 26px */ + text-align: center; +} + +.tablenav .displaying-num { + margin-left: 7px; +} + +.tablenav .one-page .displaying-num { + display: inline-block; + margin: 5px 0; +} + +.tablenav .actions { + padding: 0 0 0 8px; +} + +.wp-filter .actions { + display: inline-block; + vertical-align: middle; +} + +.tablenav .delete { + margin-left: 20px; +} + +/* This view-switcher is still used on multisite. */ +.tablenav .view-switch { + float: left; + margin: 0 5px; + padding-top: 3px; +} + +.wp-filter .view-switch { + display: inline-block; + vertical-align: middle; + padding: 12px 0; + margin: 0 2px 0 8px; +} + +.media-toolbar.wp-filter .view-switch { + margin: 0 2px 0 12px; +} + +.view-switch a { + float: right; + width: 28px; + height: 28px; + text-align: center; + line-height: 1.84615384; + text-decoration: none; +} + +.view-switch a:before { + color: #b4b9be; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.view-switch a:hover:before, +.view-switch a:focus:before { + color: #727272; +} + +.view-switch a.current:before { + color: #0073aa; +} + +.view-switch .view-list:before { + content: "\f163"; +} + +.view-switch .view-excerpt:before { + content: "\f164"; +} + +.view-switch .view-grid:before { + content: "\f509"; +} + +.filter { + float: right; + margin: -5px 10px 0 0; +} + +.filter .subsubsub { + margin-right: -10px; + margin-top: 13px; +} +.screen-per-page { + width: 4em; +} + +#posts-filter .wp-filter { + margin-bottom: 0; +} + +#posts-filter fieldset { + float: right; + margin: 0 0 1em 1.5ex; + padding: 0; +} + +#posts-filter fieldset legend { + padding: 0 1px .2em 0; +} + +p.pagenav { + margin: 0; + display: inline; +} + +.pagenav span { + font-weight: 600; + margin: 0 6px; +} + +.row-title { + font-size: 14px !important; + font-weight: 600; +} + +.column-comment .comment-author { + margin-bottom: 0.6em; +} + +.column-author img, +.column-username img, +.column-comment .comment-author img { + float: right; + margin-left: 10px; + margin-top: 1px; +} + +.row-actions { + color: #ddd; + font-size: 13px; + padding: 2px 0 0; + position: relative; + right: -9999em; +} + +/* ticket #34150 */ +.rtl .row-actions a { + display: inline-block; +} + +.row-actions .network_only, +.row-actions .network_active { + color: #000; +} + +.no-js .row-actions, +tr:hover .row-actions, +.mobile .row-actions, +.row-actions.visible, +.comment-item:hover .row-actions { + position: static; +} + +/* deprecated */ +.row-actions-visible { + padding: 2px 0 0; +} + + +/*------------------------------------------------------------------------------ + 10.1 - Inline Editing +------------------------------------------------------------------------------*/ + +/* +.quick-edit* is for Quick Edit +.bulk-edit* is for Bulk Edit +.inline-edit* is for everything +*/ + +/* Layout */ + +#wpbody-content .inline-edit-row fieldset { + font-size: 12px; + float: right; + margin: 0; + padding: 0; + width: 100%; +} + +tr.inline-edit-row td, +#wpbody-content .inline-edit-row fieldset .inline-edit-col { + padding: 0 0.5em; +} + +#wpbody-content .quick-edit-row-post .inline-edit-col-left { + width: 40%; +} + +#wpbody-content .quick-edit-row-post .inline-edit-col-right { + width: 39%; +} + +#wpbody-content .inline-edit-row-post .inline-edit-col-center { + width: 20%; +} + +#wpbody-content .quick-edit-row-page .inline-edit-col-left { + width: 50%; +} + +#wpbody-content .quick-edit-row-page .inline-edit-col-right, +#wpbody-content .bulk-edit-row-post .inline-edit-col-right { + width: 49%; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-left { + width: 30%; +} + +#wpbody-content .bulk-edit-row-page .inline-edit-col-right { + width: 69%; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-bottom { + float: left; + width: 69%; +} + +#wpbody-content .inline-edit-row-page .inline-edit-col-right { + margin-top: 27px; +} + +.inline-edit-row fieldset .inline-edit-group { + clear: both; + line-height: 2.5; +} + +.inline-edit-row .submit { + clear: both; + padding: 0.5em; + margin: 0.5em 0 0; +} + +.inline-edit-row .notice-error { + margin-top: 1em; +} + +.inline-edit-row .notice-error .error { + margin: 0.5em 0; + padding: 2px; +} + +/* Positioning */ + +/* Needs higher specificity for the padding */ +#the-list .inline-edit-row .inline-edit-legend { + margin: 0; + padding: 0.2em 0.5em 0; + line-height: 2.5; + font-weight: 600; +} + +#the-list #bulk-edit.inline-edit-row .inline-edit-legend { + padding: 0.2em 0.5em; +} + +.inline-edit-row fieldset span.title, +.inline-edit-row fieldset span.checkbox-title { + margin: 0; + padding: 0; +} + +.inline-edit-row fieldset label, +.inline-edit-row fieldset span.inline-edit-categories-label { + display: block; + margin: .2em 0; + line-height: 2.5; +} + +.inline-edit-row fieldset.inline-edit-date label { + display: inline-block; + margin: 0; + vertical-align: baseline; + line-height: 2; +} + +.inline-edit-row fieldset label.inline-edit-tags { + margin-top: 0; +} + +.inline-edit-row fieldset label.inline-edit-tags span.title { + margin: .2em 0; + width: auto; +} + +.inline-edit-row fieldset label span.title, +.inline-edit-row fieldset.inline-edit-date legend { + display: block; + float: right; + width: 6em; + line-height: 2.5; +} + +#posts-filter fieldset.inline-edit-date legend { + padding: 0; +} + +.inline-edit-row fieldset label span.input-text-wrap, +.inline-edit-row fieldset .timestamp-wrap { + display: block; + margin-right: 6em; +} + +.quick-edit-row-post fieldset.inline-edit-col-right label span.title { + width: auto; + padding-left: 0.5em; +} + +.inline-edit-row .inline-edit-or { + margin: .2em 0 .2em 6px; + line-height: 2.5; +} + +.inline-edit-row .input-text-wrap input[type=text] { + width: 100%; +} + +.inline-edit-row fieldset label input[type=checkbox] { + vertical-align: middle; +} + +.inline-edit-row fieldset label textarea { + width: 100%; + height: 4em; + vertical-align: top; +} + +#wpbody-content .bulk-edit-row fieldset .inline-edit-group label { + max-width: 50%; +} + +#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child { + margin-left: 0.5em +} + +.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input { + width: 6em; +} + +/* Styling */ +.inline-edit-row .inline-edit-legend { + text-transform: uppercase; +} + +/* Specific Elements */ +.inline-edit-row fieldset .inline-edit-date { + float: right; +} + +.inline-edit-row fieldset input[name=jj], +.inline-edit-row fieldset input[name=hh], +.inline-edit-row fieldset input[name=mn], +.inline-edit-row fieldset input[name=aa] { + vertical-align: middle; + text-align: center; + padding: 0 4px; +} + +.inline-edit-row fieldset label input.inline-edit-password-input { + width: 8em; +} + +ul.cat-checklist { + height: 12em; + border: solid 1px #ddd; + overflow-y: scroll; + padding: 0 5px; + margin: 0; + background-color: #fff; +} + +#bulk-titles { + display: block; + height: 12em; + border: 1px solid #ddd; + overflow-y: scroll; + padding: 0 5px; + margin: 0 0 5px; +} + +.inline-edit-row fieldset ul.cat-checklist li, +.inline-edit-row fieldset ul.cat-checklist input { + margin: 0; + position: relative; /* RTL fix, #WP27629 */ +} + +.inline-edit-row fieldset ul.cat-checklist label, +.inline-edit-row #bulk-titles div { + font-style: normal; + font-size: 11px; +} + +.inline-edit-row fieldset label input.inline-edit-menu-order-input { + width: 3em; +} + +.inline-edit-row fieldset label input.inline-edit-slug-input { + width: 75%; +} + +.inline-edit-row #post_parent, +.inline-edit-row select[name="page_template"] { + max-width: 80%; +} + +.ie8 .inline-edit-row #post_parent, +.ie8 .inline-edit-row select[name="page_template"] { + width: 250px; +} + +.quick-edit-row-post fieldset label.inline-edit-status { + float: right; +} + +#bulk-titles { + line-height: 140%; +} +#bulk-titles div { + margin: 0.2em 0.3em; +} + +#bulk-titles div a { + cursor: pointer; + display: block; + float: right; + height: 18px; + margin: 0 -2px 0 3px; + overflow: hidden; + position: relative; + width: 20px; +} + +#bulk-titles div a:before { + position: relative; + top: -3px; +} + +/*------------------------------------------------------------------------------ + 17.0 - Plugins +------------------------------------------------------------------------------*/ + +.plugins tbody th.check-column, +.plugins tbody { + padding: 8px 2px 0 0; +} + +.plugins tbody th.check-column input[type=checkbox] { + margin-top: 4px; +} + +.updates-table .plugin-title p { + margin-top: 0; +} + +.plugins thead td.check-column, +.plugins tfoot td.check-column, +.plugins .inactive th.check-column { + padding-right: 6px; +} + +.plugins, +.plugins th, +.plugins td { + color: #000; +} + +.plugins tr { + background: #fff; +} + +.plugins p { + margin: 0 4px; + padding: 0; +} + +.plugins .desc p { + margin: 0 0 8px; +} + +.plugins td.desc { + line-height: 1.5; +} + +.plugins .desc ul, +.plugins .desc ol { + margin: 0 2em 0 0; +} + +.plugins .desc ul { + list-style-type: disc; +} + +.plugins .row-actions { + font-size: 13px; + padding: 0; +} + +.plugins .inactive td, +.plugins .inactive th, +.plugins .active td, +.plugins .active th { + padding: 10px 9px; +} + +.plugins .active td, +.plugins .active th { + background-color: #f7fcfe; +} + +.plugins .update th, +.plugins .update td { + border-bottom: 0; +} + +.plugins .inactive td, +.plugins .inactive th, +.plugins .active td, +.plugins .active th, +.plugin-install #the-list td, +.upgrade .plugins td, +.upgrade .plugins th { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.plugins tr.active.plugin-update-tr + tr.inactive th, +.plugins tr.active.plugin-update-tr + tr.inactive td, +.plugins tr.active + tr.inactive th, +.plugins tr.active + tr.inactive td { + border-top: 1px solid rgba(0, 0, 0, 0.03); + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.02), inset 0 -1px 0 #e1e1e1; +} + +.plugins .update td, +.plugins .update th, +.upgrade .plugins tr:last-of-type td, +.upgrade .plugins tr:last-of-type th, +.plugins tr.active + tr.inactive.update th, +.plugins tr.active + tr.inactive.update td, +.plugins .updated td, +.plugins .updated th, +.plugins tr.active + tr.inactive.updated th, +.plugins tr.active + tr.inactive.updated td { + box-shadow: none; +} + +.plugins .active th.check-column, +.plugin-update-tr.active td { + border-right: 4px solid #00a0d2; +} + +.wp-list-table.plugins .plugin-title, +.wp-list-table.plugins .theme-title { + padding-left: 12px; + white-space: nowrap; +} + +.plugins .plugin-title img, +.plugins .plugin-title .dashicons { + float: right; + padding: 0 0 0 10px; + width: 64px; + height: 64px; +} + +.plugins .plugin-title .dashicons:before { + padding: 2px; + background-color: #eee; + box-shadow: inset 0 0 10px rgba(160, 165, 170, 0.15); + font-size: 60px; + color: #B4B9BE; +} + +#update-themes-table .plugin-title img, +#update-themes-table .plugin-title .dashicons { + width: 85px; +} + +.plugins .inactive .plugin-title strong { + font-weight: 400; +} + +.plugins .second, +.plugins .row-actions { + padding: 0 0 5px; +} + +.plugins .update .second, +.plugins .update .row-actions, +.plugins .updated .second, +.plugins .updated .row-actions { + padding-bottom: 0; +} + +.plugins-php .widefat tfoot th, +.plugins-php .widefat tfoot td { + border-top-style: solid; + border-top-width: 1px; +} + +.plugins .plugin-update-tr .plugin-update { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); + overflow: hidden; /* clearfix */ + padding: 0; +} + +.plugins .plugin-update-tr .notice, +.plugins .plugin-update-tr div[class="update-message"] { /* back-compat for pre-4.6 */ + margin: 5px 40px 15px 20px; +} + +.plugins .notice p { + margin: 0.5em 0; +} + +.plugins .plugin-description a, +.plugins .plugin-update a, +.updates-table .plugin-title a { + text-decoration: underline; +} + +.plugins tr.paused th.check-column { + border-right: 4px solid #d54e21; +} + +.plugins tr.paused th, +.plugins tr.paused td { + background-color: #fef7f1; +} + +.plugins tr.paused .plugin-title, +.plugins .paused .dashicons-warning { + color: #dc3232; +} + +.plugins .paused .error-display p, +.plugins .paused .error-display code { + font-size: 90%; + color: rgba( 0, 0, 0, 0.7 ); +} + +.plugins .resume-link { + color: #dc3232; +} + +.plugin-card .update-now:before { + color: #f56e28; + content: "\f463"; + display: inline-block; + font: normal 20px/1 dashicons; + margin: 3px -2px 0 5px; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + vertical-align: top; +} + +.plugin-card .updating-message:before { + content: "\f463"; + animation: rotation 2s infinite linear; +} + +@keyframes rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(-359deg); + } +} + +.plugin-card .updated-message:before { + color: #79ba49; + content: "\f147"; +} + +.plugin-install-php h2 { + clear: both; +} + +.plugin-install-php h3 { + margin: 2.5em 0 8px; +} + +.plugin-install-php .wp-filter { + margin-bottom: 0; +} + +/* Plugin card table view */ +.plugin-group { + overflow: hidden; /* clearfix */ + margin-top: 1.5em; +} + +.plugin-group h3 { + margin-top: 0; +} + +.plugin-card { + float: right; + margin: 0 8px 16px; + width: 48.5%; + width: calc( 50% - 8px ); + background-color: #fff; + border: 1px solid #ddd; + box-sizing: border-box; +} + +.plugin-card:nth-child(odd) { + clear: both; + margin-right: 0; +} + +.plugin-card:nth-child(even) { + margin-left: 0; +} + +@media screen and (min-width: 1600px) and ( max-width: 2299px ) { + .plugin-card { + width: 30%; + width: calc( 33.1% - 8px ); + } + + .plugin-card:nth-child(odd) { + clear: none; + margin-right: 8px; + } + + .plugin-card:nth-child(even) { + margin-left: 8px; + } + + .plugin-card:nth-child(3n+1) { + clear: both; + margin-right: 0; + } + + .plugin-card:nth-child(3n) { + margin-left: 0; + } +} + +@media screen and (min-width: 2300px) { + .plugin-card { + width: 25%; + width: calc( 25% - 12px ); + } + + .plugin-card:nth-child(odd) { + clear: none; + margin-right: 8px; + } + + .plugin-card:nth-child(even) { + margin-left: 8px; + } + + .plugin-card:nth-child(4n+1) { + clear: both; + margin-right: 0; + } + + .plugin-card:nth-child(4n) { + margin-left: 0; + } +} + +.plugin-card-top { + position: relative; + padding: 20px 20px 10px; + min-height: 135px; +} + +div.action-links, +.plugin-action-buttons { + margin: 0; /* Override existing margins */ +} + +.plugin-card h3 { + margin: 0 0 12px 12px; + font-size: 18px; + line-height: 1.3; +} + +.plugin-card .name, +.plugin-card .desc { + margin-right: 148px; /* icon + margin */ + margin-left: 120px; /* action links */ +} + +.plugin-card .action-links { + position: absolute; + top: 20px; + left: 20px; + width: 120px; +} + +.plugin-action-buttons { + clear: left; + float: left; + margin-right: 2em; + margin-bottom: 1em; + text-align: left; +} + +.plugin-action-buttons li { + margin-bottom: 10px; +} + +.plugin-card-bottom { + clear: both; + padding: 12px 20px; + background-color: #fafafa; + border-top: 1px solid #ddd; + overflow: hidden; +} + +.plugin-card-bottom .star-rating { + display: inline; +} + +.plugin-card-update-failed .update-now { + font-weight: 600; +} + +.plugin-card-update-failed .notice-error { + margin: 0; + padding-right: 16px; + box-shadow: 0 -1px 0 #ddd; +} + +.plugin-card-update-failed .plugin-card-bottom { + display: none; +} + +.plugin-card .column-rating { + line-height: 1.76923076; +} + +.plugin-card .column-rating, +.plugin-card .column-updated { + margin-bottom: 4px; +} + +.plugin-card .column-rating, +.plugin-card .column-downloaded { + float: right; + clear: right; + max-width: 180px; +} + +.plugin-card .column-updated, +.plugin-card .column-compatibility { + text-align: left; + float: left; + clear: left; + width: 65%; + width: calc( 100% - 180px ); +} + +.plugin-card .column-compatibility span:before { + font: normal 20px/.5 dashicons; + speak: none; + display: inline-block; + padding: 0; + top: 4px; + right: -2px; + position: relative; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #444; +} + +.plugin-card .column-compatibility .compatibility-incompatible:before { + content: "\f158"; + color: #c62d2d; +} + +.plugin-card .column-compatibility .compatibility-compatible:before { + content: "\f147"; + color: #31843f; +} + +.plugin-card .notice { + margin: 20px 20px 0 20px; +} + +.plugin-icon { + position: absolute; + top: 20px; + right: 20px; + width: 128px; + height: 128px; + margin: 0 0 20px 20px; +} + +.no-plugin-results { + color: #666; /* same as no themes and no media */ + font-size: 18px; + font-style: normal; + margin: 0; + padding: 100px 0 0; + text-align: center; +} + +/* ms */ +/* Background Color for Site Status */ +.wp-list-table .site-deleted, +.wp-list-table tr.site-deleted { + background: #ff8573; +} +.wp-list-table .site-spammed, +.wp-list-table tr.site-spammed { + background: #faafaa; +} +.wp-list-table .site-archived, +.wp-list-table tr.site-archived { + background: #ffebe8; +} +.wp-list-table .site-mature, +.wp-list-table tr.site-mature { + background: #fecac2; +} + +.sites.fixed .column-lastupdated, +.sites.fixed .column-registered { + width: 20%; +} + +.sites.fixed .column-users { + width: 80px; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +@media screen and (max-width: 1100px) and (min-width: 782px), (max-width: 480px) { + .plugin-card .action-links { + position: static; + margin-right: 148px; + width: auto; + } + + .plugin-action-buttons { + float: none; + margin: 1em 0 0; + text-align: right; + } + + .plugin-action-buttons li { + display: inline-block; + vertical-align: middle; + } + + .plugin-action-buttons li .button { + margin-left: 20px; + } + + .plugin-card h3 { + margin-left: 24px; + } + + .plugin-card .name, + .plugin-card .desc { + margin-left: 0; + } + + .plugin-card .desc p:first-of-type { + margin-top: 0; + } + + .fixed .column-date { + width: 14%; + } +} + +@media screen and (max-width: 782px) { + /* WP List Table Options & Filters */ + .tablenav { + height: auto; + } + + .tablenav.top { + margin: 20px 0 5px 0; + } + + .tablenav.bottom { + position: relative; + margin-top: 15px; + } + + .tablenav br { + display: none; + } + + .tablenav br.clear { + display: block; + } + + .tablenav.top .actions, + .tablenav .view-switch { + display: none; + } + + .view-switch a { + width: 36px; + height: 36px; + line-height: 2.53846153; + } + + /* Pagination */ + .tablenav.top .displaying-num { + display: none; + } + + .tablenav.bottom .displaying-num { + position: absolute; + left: 0; + top: 11px; + margin: 0; + font-size: 14px; + } + + .tablenav .tablenav-pages { + width: 100%; + text-align: center; + margin: 0 0 25px; + } + + .tablenav.bottom .tablenav-pages { + margin-top: 25px; + } + + .tablenav.top .tablenav-pages.one-page { + display: none; + } + + .tablenav.bottom .tablenav-pages.one-page { + margin: 15px 0 0 0; + height: 0; + } + + .tablenav-pages .pagination-links { + font-size: 16px; + } + + .tablenav .tablenav-pages .button, + .tablenav .tablenav-pages .tablenav-pages-navspan { + min-width: 44px; + padding: 12px 8px; + font-size: 18px; + line-height: 1; + } + + .tablenav-pages .pagination-links .current-page { + min-width: 44px; + padding: 12px 6px; + font-size: 16px; + line-height: 1.125; + } + + /* WP List Table Adjustments: General */ + .form-wrap > p { + display: none; + } + + .wp-list-table th.column-primary ~ th, + .wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) { + display: none; + } + + .wp-list-table thead th.column-primary { + width: 100%; + } + + /* Checkboxes need to show */ + .wp-list-table tr th.check-column { + display: table-cell; + } + + .wp-list-table .check-column { + width: 2.5em; + } + + .wp-list-table .column-primary .toggle-row { + display: block; + } + + .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column) { + position: relative; + clear: both; + width: auto !important; /* needs to override some columns that are more specifically targeted */ + } + + .wp-list-table td.column-primary { + padding-left: 50px; /* space for toggle button */ + } + + .wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) { + padding: 3px 35% 3px 8px; + } + + .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before { + position: absolute; + right: 10px; /* match padding of regular table cell */ + display: block; + overflow: hidden; + width: 32%; /* leave a little space for a gutter */ + content: attr(data-colname); + white-space: nowrap; + text-overflow: ellipsis; + } + + .wp-list-table .is-expanded td:not(.hidden) { + display: block !important; + overflow: hidden; /* clearfix */ + } + + /* Special cases */ + .widefat .num, + .column-posts { + text-align: right; + } + + #comments-form .fixed .column-author, + #commentsdiv .fixed .column-author { + display: none !important; + } + + .fixed .column-comment .comment-author { + display: block; + } + + /* Comment author hidden via Screen Options */ + .fixed .column-author.hidden ~ .column-comment .comment-author { + display: none; + } + + #the-comment-list .is-expanded td { + box-shadow: none; + } + + #the-comment-list .is-expanded td:last-child { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); + } + + /* Show comment bubble as text instead */ + .post-com-count .screen-reader-text { + position: static; + -webkit-clip-path: none; + clip-path: none; + width: auto; + height: auto; + margin: 0; + } + + .column-response .post-com-count-no-comments:after, + .column-response .post-com-count-approved:after, + .column-comments .post-com-count-no-comments:after, + .column-comments .post-com-count-approved:after { + content: none; + } + + .column-response .post-com-count [aria-hidden="true"], + .column-comments .post-com-count [aria-hidden="true"] { + display: none; + } + + .column-response .post-com-count-wrapper, + .column-comments .post-com-count-wrapper { + white-space: normal; + } + + .column-response .post-com-count-wrapper > a, + .column-comments .post-com-count-wrapper > a { + display: block; + } + + .column-response .post-com-count-no-comments, + .column-response .post-com-count-approved, + .column-comments .post-com-count-no-comments, + .column-comments .post-com-count-approved { + margin-top: 0; + margin-left: 0.5em; + } + + .column-response .post-com-count-pending, + .column-comments .post-com-count-pending { + position: static; + height: auto; + min-width: 0; + padding: 0; + border: none; + border-radius: 0; + background: none; + color: #bb2a2a; + font-size: inherit; + line-height: inherit; + text-align: right; + } + + .column-response .post-com-count-pending:hover, + .column-comments .post-com-count-pending:hover { + color: #dc3232; + } + + .widefat thead td.check-column, + .widefat tfoot td.check-column { + padding-top: 10px; + } + + /* Make row actions more easy to select on mobile */ + body:not(.plugins-php) .row-actions { + display: -ms-grid; + display: grid; + -ms-grid-columns: auto auto auto; + grid-template-columns: auto auto auto; + color: transparent; + } + + .row-actions span { + padding: 4px 0; + } + + .row-actions span a, + .row-actions span .button-link { + display: inline-block; + padding: 4px 0; + line-height: 1.5; + } + + .row-actions span.approve:before, + .row-actions span.unapprove:before { + content: "| "; + } + + /* Quick Edit and Bulk Edit */ + #wpbody-content .quick-edit-row-post .inline-edit-col-left, + #wpbody-content .quick-edit-row-post .inline-edit-col-right, + #wpbody-content .inline-edit-row-post .inline-edit-col-center, + #wpbody-content .quick-edit-row-page .inline-edit-col-left, + #wpbody-content .quick-edit-row-page .inline-edit-col-right, + #wpbody-content .bulk-edit-row-post .inline-edit-col-right, + #wpbody-content .bulk-edit-row .inline-edit-col-left, + #wpbody-content .bulk-edit-row-page .inline-edit-col-right, + #wpbody-content .bulk-edit-row .inline-edit-col-bottom { + float: none; + width: 100%; + } + + #wpbody-content .quick-edit-row fieldset .inline-edit-col label, + #wpbody-content .quick-edit-row fieldset .inline-edit-group label, + #wpbody-content .bulk-edit-row fieldset .inline-edit-col label, + #wpbody-content .bulk-edit-row fieldset .inline-edit-group label { + max-width: none; + float: none; + margin-bottom: 5px; + } + + #wpbody .bulk-edit-row fieldset select { + display: block; + width: 100%; + max-width: none; + box-sizing: border-box; + } + + .inline-edit-row fieldset input[name=jj], + .inline-edit-row fieldset input[name=hh], + .inline-edit-row fieldset input[name=mn], + .inline-edit-row fieldset input[name=aa] { + font-size: 16px; + line-height: 2; + padding: 3px 4px; + } + + .inline-edit-row fieldset ul.cat-checklist label, + .inline-edit-row #bulk-titles div { + font-size: 16px; + } + + .inline-edit-row fieldset label span.title, + .inline-edit-row fieldset.inline-edit-date legend { + float: none; + } + + .inline-edit-row fieldset label.inline-edit-tags { + padding: 0 0.5em; + } + + .inline-edit-row fieldset .inline-edit-col label.inline-edit-tags { + padding: 0; + } + + .inline-edit-row fieldset label span.input-text-wrap, + .inline-edit-row fieldset .timestamp-wrap { + margin-right: 0; + } + + .inline-edit-row .inline-edit-or { + margin: 0 0 0 6px; + } + + #edithead .inside, + #commentsdiv #edithead .inside { + float: none; + text-align: right; + padding: 3px 5px; + } + + #commentsdiv #edithead .inside input, + #edithead .inside input { + width: 100%; + } + + #edithead label { + display: block; + } + + #bulk-titles div { + margin: 0.8em 0.3em; + } + + #bulk-titles div a { + height: 22px; + } + + /* Updates */ + #wpbody-content .updates-table .plugin-title { + width: auto; + white-space: normal; + } + + /* Links */ + .link-manager-php #posts-filter { + margin-top: 25px; + } + + .link-manager-php .tablenav.bottom { + overflow: hidden; + } + + /* List tables that don't toggle rows */ + .comments-box .toggle-row, + .wp-list-table.plugins .toggle-row { + display: none; + } + + /* Plugin/Theme Management */ + #wpbody-content .wp-list-table.plugins td { + display: block; + width: auto; + padding: 10px 9px; /* reset from other list tables that have a label at this width */ + } + + /* Plugin description hidden via Screen Options */ + #wpbody-content .wp-list-table.plugins .desc.hidden { + display: none; + } + + #wpbody-content .wp-list-table.plugins .column-description { + padding-top: 2px; + } + + #wpbody-content .wp-list-table.plugins .plugin-title, + #wpbody-content .wp-list-table.plugins .theme-title { + padding-left: 12px; + white-space: normal; + } + + .wp-list-table.plugins .plugin-title, + .wp-list-table.plugins .theme-title { + padding-top: 13px; + padding-bottom: 4px; + } + + .plugins #the-list tr > td:not(:last-child), + .plugins #the-list .update th, + .plugins #the-list .update td, + .wp-list-table.plugins #the-list .theme-title { + box-shadow: none; + border-top: none; + } + + .plugins #the-list tr td { + border-top: none; + } + + .plugins tbody { + padding: 1px 0 0; + } + + .plugins tr.active + tr.inactive th.check-column, + .plugins tr.active + tr.inactive td.column-description, + .plugins .plugin-update-tr:before { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); + } + + .plugins tr.active + tr.inactive th.check-column, + .plugins tr.active + tr.inactive td { + border-top: none; + } + + /* mimic the checkbox th */ + .plugins .plugin-update-tr:before { + content: ""; + display: table-cell; + } + + .plugins .active.update + .plugin-update-tr:before { + border-right: 4px solid #d54e21; + background-color: #fef7f1; + } + + .plugins #the-list .plugin-update-tr .plugin-update { + border-right: none; + } + + .plugin-update-tr .update-message { + margin-right: 0; + } + + .plugins .active.update + .plugin-update-tr:before { + background-color: #f7fcfe; + border-right: 4px solid #00a0d2; + } + + .plugins .plugin-update-tr .update-message { + margin-right: 0; + } + + .wp-list-table.plugins .plugin-title strong, + .wp-list-table.plugins .theme-title strong { + font-size: 1.4em; + line-height: 1.5; + } + + /* Add New plugins page */ + table.plugin-install .column-name, + table.plugin-install .column-version, + table.plugin-install .column-rating, + table.plugin-install .column-description { + display: block; + width: auto; + } + + table.plugin-install th.column-name, + table.plugin-install th.column-version, + table.plugin-install th.column-rating, + table.plugin-install th.column-description { + display: none; + } + + table.plugin-install td.column-name strong { + font-size: 1.4em; + line-height: 1.6em; + } + + table.plugin-install #the-list td { + box-shadow: none; + } + + table.plugin-install #the-list tr { + display: block; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); + } + + .plugin-card { + margin-right: 0; + margin-left: 0; + width: 100%; + } +} + +@media screen and (max-width: 480px) { + .tablenav-pages .current-page { + margin: 0; + } + + /* Drop row actions to two columns on a small screen */ + .row-actions:not(.plugins-php) { + -ms-grid-columns: auto auto; + grid-template-columns: auto auto; + } + + .tablenav-pages .tablenav-paging-text { + float: right; + width: 100%; + padding-top: 0.5em; + } +} diff --git a/wp-admin/css/list-tables-rtl.min.css b/wp-admin/css/list-tables-rtl.min.css new file mode 100644 index 0000000..b730448 --- /dev/null +++ b/wp-admin/css/list-tables-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.response-links{display:block;margin-bottom:1em}.response-links a{display:block}.response-links a.comments-edit-item-link{font-weight:600}.response-links a.comments-view-item-link{font-size:12px}.post-com-count-wrapper strong{font-weight:400}.comments-view-item-link{display:inline-block;clear:both}.column-comments .post-com-count-wrapper,.column-response .post-com-count-wrapper{white-space:nowrap;word-wrap:normal}.column-comments .post-com-count,.column-response .post-com-count{display:inline-block;vertical-align:top}.column-comments .post-com-count-approved,.column-comments .post-com-count-no-comments,.column-response .post-com-count-approved,.column-response .post-com-count-no-comments{margin-top:5px}.column-comments .comment-count-approved,.column-comments .comment-count-no-comments,.column-response .comment-count-approved,.column-response .comment-count-no-comments{box-sizing:border-box;display:block;padding:0 8px;min-width:24px;height:2em;border-radius:5px;background-color:#72777c;color:#fff;font-size:11px;line-height:1.90909090;text-align:center}.ie8 .column-comments .comment-count-approved,.ie8 .column-comments .comment-count-no-comments,.ie8 .column-response .comment-count-approved,.ie8 .column-response .comment-count-no-comments{min-width:0}.column-comments .post-com-count-approved:after,.column-comments .post-com-count-no-comments:after,.column-response .post-com-count-approved:after,.column-response .post-com-count-no-comments:after{content:"";display:block;margin-right:8px;width:0;height:0;border-top:5px solid #72777c;border-left:5px solid transparent}.column-comments .post-com-count-approved:focus .comment-count-approved,.column-comments .post-com-count-approved:hover .comment-count-approved,.column-response .post-com-count-approved:focus .comment-count-approved,.column-response .post-com-count-approved:hover .comment-count-approved{background:#0073aa}.column-comments .post-com-count-approved:focus:after,.column-comments .post-com-count-approved:hover:after,.column-response .post-com-count-approved:focus:after,.column-response .post-com-count-approved:hover:after{border-top-color:#0073aa}.column-comments .post-com-count-pending,.column-response .post-com-count-pending{position:relative;right:-3px;padding:0 5px;min-width:7px;height:17px;border:2px solid #fff;border-radius:11px;background:#ca4a1f;color:#fff;font-size:9px;line-height:1.88888888;text-align:center}.column-comments .post-com-count-no-pending,.column-response .post-com-count-no-pending{display:none}.commentlist li{padding:1em 1em .2em;margin:0;border-bottom:1px solid #ccc}.commentlist li li{border-bottom:0;padding:0}.commentlist p{padding:0;margin:0 0 .8em}#submitted-on,.submitted-on{color:#555d66}#replyrow td{padding:2px}#replysubmit{margin:0;padding:5px 7px 10px;overflow:hidden}#replysubmit .reply-submit-buttons{margin-bottom:0}#replysubmit .button{margin-left:5px}#replysubmit .spinner{float:none;margin:-4px 0 0}#replyrow.inline-edit-row fieldset.comment-reply{font-size:inherit;line-height:inherit}#replyrow legend{margin:0;padding:.2em 5px 0;font-size:13px;line-height:1.4;font-weight:600}#replyrow.inline-edit-row label{display:inline;vertical-align:baseline;line-height:inherit}#commentsdiv #edithead .inside,#edithead .inside{float:right;padding:3px 5px 2px 0;margin:0;text-align:center}#edithead .inside input{width:180px}#edithead label{padding:2px 0}#replycontainer{padding:5px}#replycontent{height:120px;box-shadow:none}#replyerror{border-color:#ddd;background-color:#f9f9f9}.commentlist .avatar{vertical-align:text-top}#the-comment-list div.undo,#the-comment-list tr.undo{background-color:#f5f5f5}#the-comment-list .unapproved td,#the-comment-list .unapproved th{background-color:#fef7f1}#the-comment-list .unapproved th.check-column{border-right:4px solid #d54e21}#the-comment-list .unapproved th.check-column input{margin-right:4px}#the-comment-list .approve a{color:#006505}#the-comment-list .unapprove a{color:#d98500}#the-comment-list td,#the-comment-list th{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}#the-comment-list tr:last-child td,#the-comment-list tr:last-child th{box-shadow:none}#the-comment-list tr.unapproved+tr.approved td,#the-comment-list tr.unapproved+tr.approved th{border-top:1px solid rgba(0,0,0,.03)}.vim-current,.vim-current td,.vim-current th{background-color:#e4f2fd!important}th .comment-grey-bubble{height:16px;width:16px}th .comment-grey-bubble:before{content:"\f101";font:normal 20px/.5 dashicons;speak:none;display:inline-block;padding:0;top:4px;right:-4px;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#444}table.fixed{table-layout:fixed}.fixed .column-rating,.fixed .column-visible{width:8%}.fixed .column-author,.fixed .column-date,.fixed .column-format,.fixed .column-links,.fixed .column-parent,.fixed .column-posts{width:10%}.column-date span[title]{-webkit-text-decoration:dotted underline;text-decoration:dotted underline}.fixed .column-posts{width:74px}.fixed .column-comment .comment-author{display:none}.fixed .column-categories,.fixed .column-rel,.fixed .column-response,.fixed .column-role,.fixed .column-tags{width:15%}.fixed .column-slug{width:25%}.fixed .column-locations{width:35%}.fixed .column-comments{width:5.5em;padding:8px 0;text-align:right}.fixed .column-comments .vers{padding-right:3px}td.column-title strong,td.plugin-title strong{display:block;margin-bottom:.2em;font-size:14px}td.column-title p,td.plugin-title p{margin:6px 0}table.media .column-title .media-icon{float:right;min-height:60px;margin:0 0 0 9px}table.media .column-title .media-icon img{max-width:60px;height:auto;vertical-align:top}table.media .column-title .has-media-icon~.row-actions{margin-right:70px}table.media .column-title .filename{margin-bottom:.2em}.wp-list-table a{transition:none}#the-list tr:last-child td,#the-list tr:last-child th{border-bottom:none!important;box-shadow:none}#comments-form .fixed .column-author{width:20%}#comments-form .fixed .column-date{width:14%}#commentsdiv.postbox .inside{margin:0;padding:0}#commentsdiv .inside .row-actions{line-height:1.38461538}#commentsdiv .inside .column-author{width:25%}#commentsdiv .column-comment p{margin:.6em 0;padding:0}#commentsdiv #replyrow td{padding:0}#commentsdiv p{padding:8px 10px;margin:0}#commentsdiv .comments-box{border:0 none}#commentsdiv .comments-box thead td,#commentsdiv .comments-box thead th{background:0 0;padding:0 7px 4px}#commentsdiv .comments-box tr:last-child td{border-bottom:0 none}#commentsdiv #edithead .inside input{width:160px}.sorting-indicator{display:block;visibility:hidden;width:10px;height:4px;margin-top:8px;margin-right:7px}.sorting-indicator:before{content:"\f142";font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0;top:-4px;right:-8px;color:#444;line-height:.5;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#444}.column-comments .sorting-indicator:before{top:0;right:-10px}th.desc a:focus span.sorting-indicator:before,th.desc:hover span.sorting-indicator:before,th.sorted.asc .sorting-indicator:before{content:"\f142"}th.asc a:focus span.sorting-indicator:before,th.asc:hover span.sorting-indicator:before,th.sorted.desc .sorting-indicator:before{content:"\f140"}.wp-list-table .toggle-row{position:absolute;left:8px;top:10px;display:none;padding:0;width:40px;height:40px;border:none;outline:0;background:0 0}.wp-list-table .toggle-row:hover{cursor:pointer}.wp-list-table .toggle-row:focus:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.ie8 .wp-list-table .toggle-row:focus:before{outline:#5b9dd9 solid 1px}.wp-list-table .toggle-row:active{box-shadow:none}.wp-list-table .toggle-row:before{position:absolute;top:-5px;right:10px;border-radius:50%;display:block;padding:1px 0 1px 2px;color:#444;content:"\f140";font:normal 20px/1 dashicons;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;speak:none}.wp-list-table .is-expanded .toggle-row:before{content:"\f142"}.locked-indicator{display:none;margin-right:6px;height:20px;width:16px}.locked-indicator-icon:before{color:#82878c;content:"\f160";display:inline-block;font:normal 20px/1 dashicons;speak:none;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.locked-info{display:none;margin-top:4px}.locked-text{vertical-align:top}.wp-locked .locked-indicator,.wp-locked .locked-info{display:block}tr.wp-locked .check-column input[type=checkbox],tr.wp-locked .check-column label,tr.wp-locked .row-actions .inline,tr.wp-locked .row-actions .trash{display:none}.fixed .column-comments .sorting-indicator{margin-top:3px}#menu-locations-wrap .widefat{width:60%}.widefat th.sortable,.widefat th.sorted{padding:0}th.sortable a,th.sorted a{display:block;overflow:hidden;padding:8px}.fixed .column-comments.sortable a,.fixed .column-comments.sorted a{padding:8px 0}th.sortable a span,th.sorted a span{float:right;cursor:pointer}th.asc a:focus span.sorting-indicator,th.asc:hover span.sorting-indicator,th.desc a:focus span.sorting-indicator,th.desc:hover span.sorting-indicator,th.sorted .sorting-indicator{visibility:visible}.tablenav-pages .current-page{margin:0 0 0 2px;font-size:13px;text-align:center}.tablenav .total-pages{margin-left:2px}.tablenav #table-paging{margin-right:2px}.tablenav{clear:both;height:30px;margin:6px 0 4px;padding-top:5px;vertical-align:middle}.tablenav.themes{max-width:98%}.tablenav .tablenav-pages{float:left;margin:0 0 9px}.tablenav .no-pages,.tablenav .one-page .pagination-links{display:none}.tablenav .tablenav-pages .button,.tablenav .tablenav-pages .tablenav-pages-navspan{display:inline-block;vertical-align:baseline;min-width:30px;min-height:30px;margin:0;padding:0 4px;font-size:16px;line-height:1.625;text-align:center}.tablenav .displaying-num{margin-left:7px}.tablenav .one-page .displaying-num{display:inline-block;margin:5px 0}.tablenav .actions{padding:0 0 0 8px}.wp-filter .actions{display:inline-block;vertical-align:middle}.tablenav .delete{margin-left:20px}.tablenav .view-switch{float:left;margin:0 5px;padding-top:3px}.wp-filter .view-switch{display:inline-block;vertical-align:middle;padding:12px 0;margin:0 2px 0 8px}.media-toolbar.wp-filter .view-switch{margin:0 2px 0 12px}.view-switch a{float:right;width:28px;height:28px;text-align:center;line-height:1.84615384;text-decoration:none}.view-switch a:before{color:#b4b9be;display:inline-block;font:normal 20px/1 dashicons;speak:none;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.view-switch a:focus:before,.view-switch a:hover:before{color:#727272}.view-switch a.current:before{color:#0073aa}.view-switch .view-list:before{content:"\f163"}.view-switch .view-excerpt:before{content:"\f164"}.view-switch .view-grid:before{content:"\f509"}.filter{float:right;margin:-5px 10px 0 0}.filter .subsubsub{margin-right:-10px;margin-top:13px}.screen-per-page{width:4em}#posts-filter .wp-filter{margin-bottom:0}#posts-filter fieldset{float:right;margin:0 0 1em 1.5ex;padding:0}#posts-filter fieldset legend{padding:0 1px .2em 0}p.pagenav{margin:0;display:inline}.pagenav span{font-weight:600;margin:0 6px}.row-title{font-size:14px!important;font-weight:600}.column-comment .comment-author{margin-bottom:.6em}.column-author img,.column-comment .comment-author img,.column-username img{float:right;margin-left:10px;margin-top:1px}.row-actions{color:#ddd;font-size:13px;padding:2px 0 0;position:relative;right:-9999em}.rtl .row-actions a{display:inline-block}.row-actions .network_active,.row-actions .network_only{color:#000}.comment-item:hover .row-actions,.mobile .row-actions,.no-js .row-actions,.row-actions.visible,tr:hover .row-actions{position:static}.row-actions-visible{padding:2px 0 0}#wpbody-content .inline-edit-row fieldset{font-size:12px;float:right;margin:0;padding:0;width:100%}#wpbody-content .inline-edit-row fieldset .inline-edit-col,tr.inline-edit-row td{padding:0 .5em}#wpbody-content .quick-edit-row-post .inline-edit-col-left{width:40%}#wpbody-content .quick-edit-row-post .inline-edit-col-right{width:39%}#wpbody-content .inline-edit-row-post .inline-edit-col-center{width:20%}#wpbody-content .quick-edit-row-page .inline-edit-col-left{width:50%}#wpbody-content .bulk-edit-row-post .inline-edit-col-right,#wpbody-content .quick-edit-row-page .inline-edit-col-right{width:49%}#wpbody-content .bulk-edit-row .inline-edit-col-left{width:30%}#wpbody-content .bulk-edit-row-page .inline-edit-col-right{width:69%}#wpbody-content .bulk-edit-row .inline-edit-col-bottom{float:left;width:69%}#wpbody-content .inline-edit-row-page .inline-edit-col-right{margin-top:27px}.inline-edit-row fieldset .inline-edit-group{clear:both;line-height:2.5}.inline-edit-row .submit{clear:both;padding:.5em;margin:.5em 0 0}.inline-edit-row .notice-error{margin-top:1em}.inline-edit-row .notice-error .error{margin:.5em 0;padding:2px}#the-list .inline-edit-row .inline-edit-legend{margin:0;padding:.2em .5em 0;line-height:2.5;font-weight:600}#the-list #bulk-edit.inline-edit-row .inline-edit-legend{padding:.2em .5em}.inline-edit-row fieldset span.checkbox-title,.inline-edit-row fieldset span.title{margin:0;padding:0}.inline-edit-row fieldset label,.inline-edit-row fieldset span.inline-edit-categories-label{display:block;margin:.2em 0;line-height:2.5}.inline-edit-row fieldset.inline-edit-date label{display:inline-block;margin:0;vertical-align:baseline;line-height:2}.inline-edit-row fieldset label.inline-edit-tags{margin-top:0}.inline-edit-row fieldset label.inline-edit-tags span.title{margin:.2em 0;width:auto}.inline-edit-row fieldset label span.title,.inline-edit-row fieldset.inline-edit-date legend{display:block;float:right;width:6em;line-height:2.5}#posts-filter fieldset.inline-edit-date legend{padding:0}.inline-edit-row fieldset .timestamp-wrap,.inline-edit-row fieldset label span.input-text-wrap{display:block;margin-right:6em}.quick-edit-row-post fieldset.inline-edit-col-right label span.title{width:auto;padding-left:.5em}.inline-edit-row .inline-edit-or{margin:.2em 0 .2em 6px;line-height:2.5}.inline-edit-row .input-text-wrap input[type=text]{width:100%}.inline-edit-row fieldset label input[type=checkbox]{vertical-align:middle}.inline-edit-row fieldset label textarea{width:100%;height:4em;vertical-align:top}#wpbody-content .bulk-edit-row fieldset .inline-edit-group label{max-width:50%}#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child{margin-left:.5em}.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input{width:6em}.inline-edit-row .inline-edit-legend{text-transform:uppercase}.inline-edit-row fieldset .inline-edit-date{float:right}.inline-edit-row fieldset input[name=aa],.inline-edit-row fieldset input[name=hh],.inline-edit-row fieldset input[name=jj],.inline-edit-row fieldset input[name=mn]{vertical-align:middle;text-align:center;padding:0 4px}.inline-edit-row fieldset label input.inline-edit-password-input{width:8em}ul.cat-checklist{height:12em;border:solid 1px #ddd;overflow-y:scroll;padding:0 5px;margin:0;background-color:#fff}#bulk-titles{display:block;height:12em;border:1px solid #ddd;overflow-y:scroll;padding:0 5px;margin:0 0 5px}.inline-edit-row fieldset ul.cat-checklist input,.inline-edit-row fieldset ul.cat-checklist li{margin:0;position:relative}.inline-edit-row #bulk-titles div,.inline-edit-row fieldset ul.cat-checklist label{font-style:normal;font-size:11px}.inline-edit-row fieldset label input.inline-edit-menu-order-input{width:3em}.inline-edit-row fieldset label input.inline-edit-slug-input{width:75%}.inline-edit-row #post_parent,.inline-edit-row select[name=page_template]{max-width:80%}.ie8 .inline-edit-row #post_parent,.ie8 .inline-edit-row select[name=page_template]{width:250px}.quick-edit-row-post fieldset label.inline-edit-status{float:right}#bulk-titles{line-height:140%}#bulk-titles div{margin:.2em .3em}#bulk-titles div a{cursor:pointer;display:block;float:right;height:18px;margin:0 -2px 0 3px;overflow:hidden;position:relative;width:20px}#bulk-titles div a:before{position:relative;top:-3px}.plugins tbody,.plugins tbody th.check-column{padding:8px 2px 0 0}.plugins tbody th.check-column input[type=checkbox]{margin-top:4px}.updates-table .plugin-title p{margin-top:0}.plugins .inactive th.check-column,.plugins tfoot td.check-column,.plugins thead td.check-column{padding-right:6px}.plugins,.plugins td,.plugins th{color:#000}.plugins tr{background:#fff}.plugins p{margin:0 4px;padding:0}.plugins .desc p{margin:0 0 8px}.plugins td.desc{line-height:1.5}.plugins .desc ol,.plugins .desc ul{margin:0 2em 0 0}.plugins .desc ul{list-style-type:disc}.plugins .row-actions{font-size:13px;padding:0}.plugins .active td,.plugins .active th,.plugins .inactive td,.plugins .inactive th{padding:10px 9px}.plugins .active td,.plugins .active th{background-color:#f7fcfe}.plugins .update td,.plugins .update th{border-bottom:0}.plugin-install #the-list td,.plugins .active td,.plugins .active th,.plugins .inactive td,.plugins .inactive th,.upgrade .plugins td,.upgrade .plugins th{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugins tr.active+tr.inactive td,.plugins tr.active+tr.inactive th,.plugins tr.active.plugin-update-tr+tr.inactive td,.plugins tr.active.plugin-update-tr+tr.inactive th{border-top:1px solid rgba(0,0,0,.03);box-shadow:inset 0 1px 0 rgba(0,0,0,.02),inset 0 -1px 0 #e1e1e1}.plugins .update td,.plugins .update th,.plugins .updated td,.plugins .updated th,.plugins tr.active+tr.inactive.update td,.plugins tr.active+tr.inactive.update th,.plugins tr.active+tr.inactive.updated td,.plugins tr.active+tr.inactive.updated th,.upgrade .plugins tr:last-of-type td,.upgrade .plugins tr:last-of-type th{box-shadow:none}.plugin-update-tr.active td,.plugins .active th.check-column{border-right:4px solid #00a0d2}.wp-list-table.plugins .plugin-title,.wp-list-table.plugins .theme-title{padding-left:12px;white-space:nowrap}.plugins .plugin-title .dashicons,.plugins .plugin-title img{float:right;padding:0 0 0 10px;width:64px;height:64px}.plugins .plugin-title .dashicons:before{padding:2px;background-color:#eee;box-shadow:inset 0 0 10px rgba(160,165,170,.15);font-size:60px;color:#b4b9be}#update-themes-table .plugin-title .dashicons,#update-themes-table .plugin-title img{width:85px}.plugins .inactive .plugin-title strong{font-weight:400}.plugins .row-actions,.plugins .second{padding:0 0 5px}.plugins .update .row-actions,.plugins .update .second,.plugins .updated .row-actions,.plugins .updated .second{padding-bottom:0}.plugins-php .widefat tfoot td,.plugins-php .widefat tfoot th{border-top-style:solid;border-top-width:1px}.plugins .plugin-update-tr .plugin-update{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1);overflow:hidden;padding:0}.plugins .plugin-update-tr .notice,.plugins .plugin-update-tr div[class=update-message]{margin:5px 40px 15px 20px}.plugins .notice p{margin:.5em 0}.plugins .plugin-description a,.plugins .plugin-update a,.updates-table .plugin-title a{text-decoration:underline}.plugins tr.paused th.check-column{border-right:4px solid #d54e21}.plugins tr.paused td,.plugins tr.paused th{background-color:#fef7f1}.plugins .paused .dashicons-warning,.plugins tr.paused .plugin-title{color:#dc3232}.plugins .paused .error-display code,.plugins .paused .error-display p{font-size:90%;color:rgba(0,0,0,.7)}.plugins .resume-link{color:#dc3232}.plugin-card .update-now:before{color:#f56e28;content:"\f463";display:inline-block;font:normal 20px/1 dashicons;margin:3px -2px 0 5px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.plugin-card .updating-message:before{content:"\f463";animation:rotation 2s infinite linear}@keyframes rotation{0%{transform:rotate(0)}100%{transform:rotate(-359deg)}}.plugin-card .updated-message:before{color:#79ba49;content:"\f147"}.plugin-install-php h2{clear:both}.plugin-install-php h3{margin:2.5em 0 8px}.plugin-install-php .wp-filter{margin-bottom:0}.plugin-group{overflow:hidden;margin-top:1.5em}.plugin-group h3{margin-top:0}.plugin-card{float:right;margin:0 8px 16px;width:48.5%;width:calc(50% - 8px);background-color:#fff;border:1px solid #ddd;box-sizing:border-box}.plugin-card:nth-child(odd){clear:both;margin-right:0}.plugin-card:nth-child(even){margin-left:0}@media screen and (min-width:1600px) and (max-width:2299px){.plugin-card{width:30%;width:calc(33.1% - 8px)}.plugin-card:nth-child(odd){clear:none;margin-right:8px}.plugin-card:nth-child(even){margin-left:8px}.plugin-card:nth-child(3n+1){clear:both;margin-right:0}.plugin-card:nth-child(3n){margin-left:0}}@media screen and (min-width:2300px){.plugin-card{width:25%;width:calc(25% - 12px)}.plugin-card:nth-child(odd){clear:none;margin-right:8px}.plugin-card:nth-child(even){margin-left:8px}.plugin-card:nth-child(4n+1){clear:both;margin-right:0}.plugin-card:nth-child(4n){margin-left:0}}.plugin-card-top{position:relative;padding:20px 20px 10px;min-height:135px}.plugin-action-buttons,div.action-links{margin:0}.plugin-card h3{margin:0 0 12px 12px;font-size:18px;line-height:1.3}.plugin-card .desc,.plugin-card .name{margin-right:148px;margin-left:120px}.plugin-card .action-links{position:absolute;top:20px;left:20px;width:120px}.plugin-action-buttons{clear:left;float:left;margin-right:2em;margin-bottom:1em;text-align:left}.plugin-action-buttons li{margin-bottom:10px}.plugin-card-bottom{clear:both;padding:12px 20px;background-color:#fafafa;border-top:1px solid #ddd;overflow:hidden}.plugin-card-bottom .star-rating{display:inline}.plugin-card-update-failed .update-now{font-weight:600}.plugin-card-update-failed .notice-error{margin:0;padding-right:16px;box-shadow:0 -1px 0 #ddd}.plugin-card-update-failed .plugin-card-bottom{display:none}.plugin-card .column-rating{line-height:1.76923076}.plugin-card .column-rating,.plugin-card .column-updated{margin-bottom:4px}.plugin-card .column-downloaded,.plugin-card .column-rating{float:right;clear:right;max-width:180px}.plugin-card .column-compatibility,.plugin-card .column-updated{text-align:left;float:left;clear:left;width:65%;width:calc(100% - 180px)}.plugin-card .column-compatibility span:before{font:normal 20px/.5 dashicons;speak:none;display:inline-block;padding:0;top:4px;right:-2px;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#444}.plugin-card .column-compatibility .compatibility-incompatible:before{content:"\f158";color:#c62d2d}.plugin-card .column-compatibility .compatibility-compatible:before{content:"\f147";color:#31843f}.plugin-card .notice{margin:20px 20px 0 20px}.plugin-icon{position:absolute;top:20px;right:20px;width:128px;height:128px;margin:0 0 20px 20px}.no-plugin-results{color:#666;font-size:18px;font-style:normal;margin:0;padding:100px 0 0;text-align:center}.wp-list-table .site-deleted,.wp-list-table tr.site-deleted{background:#ff8573}.wp-list-table .site-spammed,.wp-list-table tr.site-spammed{background:#faafaa}.wp-list-table .site-archived,.wp-list-table tr.site-archived{background:#ffebe8}.wp-list-table .site-mature,.wp-list-table tr.site-mature{background:#fecac2}.sites.fixed .column-lastupdated,.sites.fixed .column-registered{width:20%}.sites.fixed .column-users{width:80px}@media screen and (max-width:1100px) and (min-width:782px),(max-width:480px){.plugin-card .action-links{position:static;margin-right:148px;width:auto}.plugin-action-buttons{float:none;margin:1em 0 0;text-align:right}.plugin-action-buttons li{display:inline-block;vertical-align:middle}.plugin-action-buttons li .button{margin-left:20px}.plugin-card h3{margin-left:24px}.plugin-card .desc,.plugin-card .name{margin-left:0}.plugin-card .desc p:first-of-type{margin-top:0}.fixed .column-date{width:14%}}@media screen and (max-width:782px){.tablenav{height:auto}.tablenav.top{margin:20px 0 5px 0}.tablenav.bottom{position:relative;margin-top:15px}.tablenav br{display:none}.tablenav br.clear{display:block}.tablenav .view-switch,.tablenav.top .actions{display:none}.view-switch a{width:36px;height:36px;line-height:2.53846153}.tablenav.top .displaying-num{display:none}.tablenav.bottom .displaying-num{position:absolute;left:0;top:11px;margin:0;font-size:14px}.tablenav .tablenav-pages{width:100%;text-align:center;margin:0 0 25px}.tablenav.bottom .tablenav-pages{margin-top:25px}.tablenav.top .tablenav-pages.one-page{display:none}.tablenav.bottom .tablenav-pages.one-page{margin:15px 0 0 0;height:0}.tablenav-pages .pagination-links{font-size:16px}.tablenav .tablenav-pages .button,.tablenav .tablenav-pages .tablenav-pages-navspan{min-width:44px;padding:12px 8px;font-size:18px;line-height:1}.tablenav-pages .pagination-links .current-page{min-width:44px;padding:12px 6px;font-size:16px;line-height:1.125}.form-wrap>p{display:none}.wp-list-table th.column-primary~th,.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){display:none}.wp-list-table thead th.column-primary{width:100%}.wp-list-table tr th.check-column{display:table-cell}.wp-list-table .check-column{width:2.5em}.wp-list-table .column-primary .toggle-row{display:block}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column){position:relative;clear:both;width:auto!important}.wp-list-table td.column-primary{padding-left:50px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){padding:3px 35% 3px 8px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before{position:absolute;right:10px;display:block;overflow:hidden;width:32%;content:attr(data-colname);white-space:nowrap;text-overflow:ellipsis}.wp-list-table .is-expanded td:not(.hidden){display:block!important;overflow:hidden}.column-posts,.widefat .num{text-align:right}#comments-form .fixed .column-author,#commentsdiv .fixed .column-author{display:none!important}.fixed .column-comment .comment-author{display:block}.fixed .column-author.hidden~.column-comment .comment-author{display:none}#the-comment-list .is-expanded td{box-shadow:none}#the-comment-list .is-expanded td:last-child{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.post-com-count .screen-reader-text{position:static;-webkit-clip-path:none;clip-path:none;width:auto;height:auto;margin:0}.column-comments .post-com-count-approved:after,.column-comments .post-com-count-no-comments:after,.column-response .post-com-count-approved:after,.column-response .post-com-count-no-comments:after{content:none}.column-comments .post-com-count [aria-hidden=true],.column-response .post-com-count [aria-hidden=true]{display:none}.column-comments .post-com-count-wrapper,.column-response .post-com-count-wrapper{white-space:normal}.column-comments .post-com-count-wrapper>a,.column-response .post-com-count-wrapper>a{display:block}.column-comments .post-com-count-approved,.column-comments .post-com-count-no-comments,.column-response .post-com-count-approved,.column-response .post-com-count-no-comments{margin-top:0;margin-left:.5em}.column-comments .post-com-count-pending,.column-response .post-com-count-pending{position:static;height:auto;min-width:0;padding:0;border:none;border-radius:0;background:0 0;color:#bb2a2a;font-size:inherit;line-height:inherit;text-align:right}.column-comments .post-com-count-pending:hover,.column-response .post-com-count-pending:hover{color:#dc3232}.widefat tfoot td.check-column,.widefat thead td.check-column{padding-top:10px}body:not(.plugins-php) .row-actions{display:-ms-grid;display:grid;-ms-grid-columns:auto auto auto;grid-template-columns:auto auto auto;color:transparent}.row-actions span{padding:4px 0}.row-actions span .button-link,.row-actions span a{display:inline-block;padding:4px 0;line-height:1.5}.row-actions span.approve:before,.row-actions span.unapprove:before{content:"| "}#wpbody-content .bulk-edit-row .inline-edit-col-bottom,#wpbody-content .bulk-edit-row .inline-edit-col-left,#wpbody-content .bulk-edit-row-page .inline-edit-col-right,#wpbody-content .bulk-edit-row-post .inline-edit-col-right,#wpbody-content .inline-edit-row-post .inline-edit-col-center,#wpbody-content .quick-edit-row-page .inline-edit-col-left,#wpbody-content .quick-edit-row-page .inline-edit-col-right,#wpbody-content .quick-edit-row-post .inline-edit-col-left,#wpbody-content .quick-edit-row-post .inline-edit-col-right{float:none;width:100%}#wpbody-content .bulk-edit-row fieldset .inline-edit-col label,#wpbody-content .bulk-edit-row fieldset .inline-edit-group label,#wpbody-content .quick-edit-row fieldset .inline-edit-col label,#wpbody-content .quick-edit-row fieldset .inline-edit-group label{max-width:none;float:none;margin-bottom:5px}#wpbody .bulk-edit-row fieldset select{display:block;width:100%;max-width:none;box-sizing:border-box}.inline-edit-row fieldset input[name=aa],.inline-edit-row fieldset input[name=hh],.inline-edit-row fieldset input[name=jj],.inline-edit-row fieldset input[name=mn]{font-size:16px;line-height:2;padding:3px 4px}.inline-edit-row #bulk-titles div,.inline-edit-row fieldset ul.cat-checklist label{font-size:16px}.inline-edit-row fieldset label span.title,.inline-edit-row fieldset.inline-edit-date legend{float:none}.inline-edit-row fieldset label.inline-edit-tags{padding:0 .5em}.inline-edit-row fieldset .inline-edit-col label.inline-edit-tags{padding:0}.inline-edit-row fieldset .timestamp-wrap,.inline-edit-row fieldset label span.input-text-wrap{margin-right:0}.inline-edit-row .inline-edit-or{margin:0 0 0 6px}#commentsdiv #edithead .inside,#edithead .inside{float:none;text-align:right;padding:3px 5px}#commentsdiv #edithead .inside input,#edithead .inside input{width:100%}#edithead label{display:block}#bulk-titles div{margin:.8em .3em}#bulk-titles div a{height:22px}#wpbody-content .updates-table .plugin-title{width:auto;white-space:normal}.link-manager-php #posts-filter{margin-top:25px}.link-manager-php .tablenav.bottom{overflow:hidden}.comments-box .toggle-row,.wp-list-table.plugins .toggle-row{display:none}#wpbody-content .wp-list-table.plugins td{display:block;width:auto;padding:10px 9px}#wpbody-content .wp-list-table.plugins .desc.hidden{display:none}#wpbody-content .wp-list-table.plugins .column-description{padding-top:2px}#wpbody-content .wp-list-table.plugins .plugin-title,#wpbody-content .wp-list-table.plugins .theme-title{padding-left:12px;white-space:normal}.wp-list-table.plugins .plugin-title,.wp-list-table.plugins .theme-title{padding-top:13px;padding-bottom:4px}.plugins #the-list .update td,.plugins #the-list .update th,.plugins #the-list tr>td:not(:last-child),.wp-list-table.plugins #the-list .theme-title{box-shadow:none;border-top:none}.plugins #the-list tr td{border-top:none}.plugins tbody{padding:1px 0 0}.plugins .plugin-update-tr:before,.plugins tr.active+tr.inactive td.column-description,.plugins tr.active+tr.inactive th.check-column{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugins tr.active+tr.inactive td,.plugins tr.active+tr.inactive th.check-column{border-top:none}.plugins .plugin-update-tr:before{content:"";display:table-cell}.plugins .active.update+.plugin-update-tr:before{border-right:4px solid #d54e21;background-color:#fef7f1}.plugins #the-list .plugin-update-tr .plugin-update{border-right:none}.plugin-update-tr .update-message{margin-right:0}.plugins .active.update+.plugin-update-tr:before{background-color:#f7fcfe;border-right:4px solid #00a0d2}.plugins .plugin-update-tr .update-message{margin-right:0}.wp-list-table.plugins .plugin-title strong,.wp-list-table.plugins .theme-title strong{font-size:1.4em;line-height:1.5}table.plugin-install .column-description,table.plugin-install .column-name,table.plugin-install .column-rating,table.plugin-install .column-version{display:block;width:auto}table.plugin-install th.column-description,table.plugin-install th.column-name,table.plugin-install th.column-rating,table.plugin-install th.column-version{display:none}table.plugin-install td.column-name strong{font-size:1.4em;line-height:1.6em}table.plugin-install #the-list td{box-shadow:none}table.plugin-install #the-list tr{display:block;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugin-card{margin-right:0;margin-left:0;width:100%}}@media screen and (max-width:480px){.tablenav-pages .current-page{margin:0}.row-actions:not(.plugins-php){-ms-grid-columns:auto auto;grid-template-columns:auto auto}.tablenav-pages .tablenav-paging-text{float:right;width:100%;padding-top:.5em}} \ No newline at end of file diff --git a/wp-admin/css/list-tables.css b/wp-admin/css/list-tables.css new file mode 100644 index 0000000..3e55bb2 --- /dev/null +++ b/wp-admin/css/list-tables.css @@ -0,0 +1,2168 @@ +.response-links { + display: block; + margin-bottom: 1em; +} + +.response-links a { + display: block; +} + +.response-links a.comments-edit-item-link { + font-weight: 600; +} + +.response-links a.comments-view-item-link { + font-size: 12px; +} + +.post-com-count-wrapper strong { + font-weight: 400; +} + +.comments-view-item-link { + display: inline-block; + clear: both; +} + +.column-response .post-com-count-wrapper, +.column-comments .post-com-count-wrapper { + white-space: nowrap; + word-wrap: normal; +} + +/* comments bubble common */ +.column-response .post-com-count, +.column-comments .post-com-count { + display: inline-block; + vertical-align: top; +} + +/* comments bubble approved */ +.column-response .post-com-count-no-comments, +.column-response .post-com-count-approved, +.column-comments .post-com-count-no-comments, +.column-comments .post-com-count-approved { + margin-top: 5px; +} + +.column-response .comment-count-no-comments, +.column-response .comment-count-approved, +.column-comments .comment-count-no-comments, +.column-comments .comment-count-approved { + box-sizing: border-box; + display: block; + padding: 0 8px; + min-width: 24px; + height: 2em; + border-radius: 5px; + background-color: #72777c; + color: #fff; + font-size: 11px; + line-height: 1.90909090; + text-align: center; +} + +.ie8 .column-response .comment-count-no-comments, +.ie8 .column-response .comment-count-approved, +.ie8 .column-comments .comment-count-no-comments, +.ie8 .column-comments .comment-count-approved { + min-width: 0; +} + +.column-response .post-com-count-no-comments:after, +.column-response .post-com-count-approved:after, +.column-comments .post-com-count-no-comments:after, +.column-comments .post-com-count-approved:after { + content: ""; + display: block; + margin-left: 8px; + width: 0; + height: 0; + border-top: 5px solid #72777c; + border-right: 5px solid transparent; +} + +.column-response .post-com-count-approved:hover .comment-count-approved, +.column-response .post-com-count-approved:focus .comment-count-approved, +.column-comments .post-com-count-approved:hover .comment-count-approved, +.column-comments .post-com-count-approved:focus .comment-count-approved { + background: #0073aa; +} + +.column-response .post-com-count-approved:hover:after, +.column-response .post-com-count-approved:focus:after, +.column-comments .post-com-count-approved:hover:after, +.column-comments .post-com-count-approved:focus:after { + border-top-color: #0073aa; +} + +/* @todo: consider to use a single rule for these counters and the admin menu counters. */ +.column-response .post-com-count-pending, +.column-comments .post-com-count-pending { + position: relative; + left: -3px; + padding: 0 5px; + min-width: 7px; + height: 17px; + border: 2px solid #fff; + border-radius: 11px; + background: #ca4a1f; + color: #fff; + font-size: 9px; + line-height: 1.88888888; + text-align: center; +} + +.column-response .post-com-count-no-pending, +.column-comments .post-com-count-no-pending { + display: none; +} + +/* comments */ + +.commentlist li { + padding: 1em 1em .2em; + margin: 0; + border-bottom: 1px solid #ccc; +} + +.commentlist li li { + border-bottom: 0; + padding: 0; +} + +.commentlist p { + padding: 0; + margin: 0 0 .8em; +} + +#submitted-on, +.submitted-on { + color: #555d66; +} + +/* reply to comments */ +#replyrow td { + padding: 2px; +} + +#replysubmit { + margin: 0; + padding: 5px 7px 10px; + overflow: hidden; +} + +#replysubmit .reply-submit-buttons { + margin-bottom: 0; +} + +#replysubmit .button { + margin-right: 5px; +} + +#replysubmit .spinner { + float: none; + margin: -4px 0 0; +} + +#replyrow.inline-edit-row fieldset.comment-reply { + font-size: inherit; + line-height: inherit; +} + +#replyrow legend { + margin: 0; + padding: .2em 5px 0; + font-size: 13px; + line-height: 1.4; + font-weight: 600; +} + +#replyrow.inline-edit-row label { + display: inline; + vertical-align: baseline; + line-height: inherit; +} + +#edithead .inside, +#commentsdiv #edithead .inside { + float: left; + padding: 3px 0 2px 5px; + margin: 0; + text-align: center; +} + +#edithead .inside input { + width: 180px; +} + +#edithead label { + padding: 2px 0; +} + +#replycontainer { + padding: 5px; +} + +#replycontent { + height: 120px; + box-shadow: none; +} + +#replyerror { + border-color: #ddd; + background-color: #f9f9f9; +} + +/* @todo: is this used? */ +.commentlist .avatar { + vertical-align: text-top; +} + +#the-comment-list tr.undo, +#the-comment-list div.undo { + background-color: #f5f5f5; +} + +#the-comment-list .unapproved th, +#the-comment-list .unapproved td { + background-color: #fef7f1; +} + +#the-comment-list .unapproved th.check-column { + border-left: 4px solid #d54e21; +} + +#the-comment-list .unapproved th.check-column input { + margin-left: 4px; +} + +#the-comment-list .approve a { + color: #006505; +} + +#the-comment-list .unapprove a { + color: #d98500; +} + +#the-comment-list th, +#the-comment-list td { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +#the-comment-list tr:last-child th, +#the-comment-list tr:last-child td { + box-shadow: none; +} + +#the-comment-list tr.unapproved + tr.approved th, +#the-comment-list tr.unapproved + tr.approved td { + border-top: 1px solid rgba(0, 0, 0, 0.03); +} + +/* table vim shortcuts */ +.vim-current, +.vim-current th, +.vim-current td { + background-color: #e4f2fd !important; +} + +th .comment-grey-bubble { + height: 16px; + width: 16px; +} + +th .comment-grey-bubble:before { + content: "\f101"; + font: normal 20px/.5 dashicons; + speak: none; + display: inline-block; + padding: 0; + top: 4px; + left: -4px; + position: relative; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #444; +} + +/*------------------------------------------------------------------------------ + 10.0 - List Posts (/Pages/etc) +------------------------------------------------------------------------------*/ + +table.fixed { + table-layout: fixed; +} + +.fixed .column-rating, +.fixed .column-visible { + width: 8%; +} + +.fixed .column-posts, +.fixed .column-date, +.fixed .column-parent, +.fixed .column-links, +.fixed .column-author, +.fixed .column-format { + width: 10%; +} + +.column-date span[title] { + -webkit-text-decoration: dotted underline; + text-decoration: dotted underline; +} + +.fixed .column-posts { + width: 74px; +} + +.fixed .column-comment .comment-author { + display: none; +} + +.fixed .column-response, +.fixed .column-categories, +.fixed .column-tags, +.fixed .column-rel, +.fixed .column-role { + width: 15%; +} + +.fixed .column-slug { + width: 25%; +} + +.fixed .column-locations { + width: 35%; +} + +.fixed .column-comments { + width: 5.5em; + padding: 8px 0; + text-align: left; +} + +.fixed .column-comments .vers { + padding-left: 3px; +} + +td.column-title strong, +td.plugin-title strong { + display: block; + margin-bottom: .2em; + font-size: 14px; +} + +td.column-title p, +td.plugin-title p { + margin: 6px 0; +} + +/* Media file column */ +table.media .column-title .media-icon { + float: left; + min-height: 60px; + margin: 0 9px 0 0; +} + +table.media .column-title .media-icon img { + max-width: 60px; + height: auto; + vertical-align: top; /* Remove descender white-space. */ +} + +table.media .column-title .has-media-icon ~ .row-actions { + margin-left: 70px; /* 60px image + margin */ +} + +table.media .column-title .filename { + margin-bottom: 0.2em; +} + +/* @todo: pick a consistent list table selector */ +.wp-list-table a { + transition: none; +} + +#the-list tr:last-child td, +#the-list tr:last-child th { + border-bottom: none !important; + box-shadow: none; +} + +#comments-form .fixed .column-author { + width: 20%; +} + +#comments-form .fixed .column-date { + width: 14%; +} + +#commentsdiv.postbox .inside { + margin: 0; + padding: 0; +} + +#commentsdiv .inside .row-actions { + line-height: 1.38461538; +} + +#commentsdiv .inside .column-author { + width: 25%; +} + +#commentsdiv .column-comment p { + margin: 0.6em 0; + padding: 0; +} + +#commentsdiv #replyrow td { + padding: 0; +} + +#commentsdiv p { + padding: 8px 10px; + margin: 0; +} + +#commentsdiv .comments-box { + border: 0 none; +} + +#commentsdiv .comments-box thead th, +#commentsdiv .comments-box thead td { + background: transparent; + padding: 0 7px 4px; +} + +#commentsdiv .comments-box tr:last-child td { + border-bottom: 0 none; +} + +#commentsdiv #edithead .inside input { + width: 160px; +} + +.sorting-indicator { + display: block; + visibility: hidden; + width: 10px; + height: 4px; + margin-top: 8px; + margin-left: 7px; +} + +.sorting-indicator:before { + content: "\f142"; + font: normal 20px/1 dashicons; + speak: none; + display: inline-block; + padding: 0; + top: -4px; + left: -8px; + color: #444; + line-height: 0.5; + position: relative; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #444; +} + +.column-comments .sorting-indicator:before { + top: 0; + left: -10px; +} + +th.sorted.asc .sorting-indicator:before, +th.desc:hover span.sorting-indicator:before, +th.desc a:focus span.sorting-indicator:before { + content: "\f142"; +} + +th.sorted.desc .sorting-indicator:before, +th.asc:hover span.sorting-indicator:before, +th.asc a:focus span.sorting-indicator:before { + content: "\f140"; +} + +.wp-list-table .toggle-row { + position: absolute; + right: 8px; + top: 10px; + display: none; + padding: 0; + width: 40px; + height: 40px; + border: none; + outline: none; + background: transparent; +} + +.wp-list-table .toggle-row:hover { + cursor: pointer; +} + +.wp-list-table .toggle-row:focus:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.ie8 .wp-list-table .toggle-row:focus:before { + outline: #5b9dd9 solid 1px; +} + +.wp-list-table .toggle-row:active { + box-shadow: none; +} + +.wp-list-table .toggle-row:before { + position: absolute; + top: -5px; + left: 10px; + border-radius: 50%; + display: block; + padding: 1px 2px 1px 0; + color: #444; /* same as table headers sort arrows */ + content: "\f140"; + font: normal 20px/1 dashicons; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + speak: none; +} + +.wp-list-table .is-expanded .toggle-row:before { + content: "\f142"; +} + +.locked-indicator { + display: none; + margin-left: 6px; + height: 20px; + width: 16px; +} + +.locked-indicator-icon:before { + color: #82878c; + content: "\f160"; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.locked-info { + display: none; + margin-top: 4px; +} + +.locked-text { + vertical-align: top; +} + +.wp-locked .locked-indicator, +.wp-locked .locked-info { + display: block; +} + +tr.wp-locked .check-column label, +tr.wp-locked .check-column input[type="checkbox"], +tr.wp-locked .row-actions .inline, +tr.wp-locked .row-actions .trash { + display: none; +} + +.fixed .column-comments .sorting-indicator { + margin-top: 3px; +} + +#menu-locations-wrap .widefat { + width: 60%; +} + +.widefat th.sortable, +.widefat th.sorted { + padding: 0; +} + +th.sortable a, +th.sorted a { + display: block; + overflow: hidden; + padding: 8px; +} + +.fixed .column-comments.sortable a, +.fixed .column-comments.sorted a { + padding: 8px 0; +} + +th.sortable a span, +th.sorted a span { + float: left; + cursor: pointer; +} + +th.sorted .sorting-indicator, +th.desc:hover span.sorting-indicator, +th.desc a:focus span.sorting-indicator, +th.asc:hover span.sorting-indicator, +th.asc a:focus span.sorting-indicator { + visibility: visible; +} + +.tablenav-pages .current-page { + margin: 0 2px 0 0; + font-size: 13px; + text-align: center; +} + +.tablenav .total-pages { + margin-right: 2px; +} + +.tablenav #table-paging { + margin-left: 2px; +} + +.tablenav { + clear: both; + height: 30px; + margin: 6px 0 4px; + padding-top: 5px; + vertical-align: middle; +} + +.tablenav.themes { + max-width: 98%; +} + +.tablenav .tablenav-pages { + float: right; + margin: 0 0 9px; +} + +.tablenav .no-pages, +.tablenav .one-page .pagination-links { + display: none; +} + +.tablenav .tablenav-pages .button, +.tablenav .tablenav-pages .tablenav-pages-navspan { + display: inline-block; + vertical-align: baseline; + min-width: 30px; + min-height: 30px; + margin: 0; + padding: 0 4px; + font-size: 16px; + line-height: 1.625; /* 26px */ + text-align: center; +} + +.tablenav .displaying-num { + margin-right: 7px; +} + +.tablenav .one-page .displaying-num { + display: inline-block; + margin: 5px 0; +} + +.tablenav .actions { + padding: 0 8px 0 0; +} + +.wp-filter .actions { + display: inline-block; + vertical-align: middle; +} + +.tablenav .delete { + margin-right: 20px; +} + +/* This view-switcher is still used on multisite. */ +.tablenav .view-switch { + float: right; + margin: 0 5px; + padding-top: 3px; +} + +.wp-filter .view-switch { + display: inline-block; + vertical-align: middle; + padding: 12px 0; + margin: 0 8px 0 2px; +} + +.media-toolbar.wp-filter .view-switch { + margin: 0 12px 0 2px; +} + +.view-switch a { + float: left; + width: 28px; + height: 28px; + text-align: center; + line-height: 1.84615384; + text-decoration: none; +} + +.view-switch a:before { + color: #b4b9be; + display: inline-block; + font: normal 20px/1 dashicons; + speak: none; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.view-switch a:hover:before, +.view-switch a:focus:before { + color: #727272; +} + +.view-switch a.current:before { + color: #0073aa; +} + +.view-switch .view-list:before { + content: "\f163"; +} + +.view-switch .view-excerpt:before { + content: "\f164"; +} + +.view-switch .view-grid:before { + content: "\f509"; +} + +.filter { + float: left; + margin: -5px 0 0 10px; +} + +.filter .subsubsub { + margin-left: -10px; + margin-top: 13px; +} +.screen-per-page { + width: 4em; +} + +#posts-filter .wp-filter { + margin-bottom: 0; +} + +#posts-filter fieldset { + float: left; + margin: 0 1.5ex 1em 0; + padding: 0; +} + +#posts-filter fieldset legend { + padding: 0 0 .2em 1px; +} + +p.pagenav { + margin: 0; + display: inline; +} + +.pagenav span { + font-weight: 600; + margin: 0 6px; +} + +.row-title { + font-size: 14px !important; + font-weight: 600; +} + +.column-comment .comment-author { + margin-bottom: 0.6em; +} + +.column-author img, +.column-username img, +.column-comment .comment-author img { + float: left; + margin-right: 10px; + margin-top: 1px; +} + +.row-actions { + color: #ddd; + font-size: 13px; + padding: 2px 0 0; + position: relative; + left: -9999em; +} + +/* ticket #34150 */ +.rtl .row-actions a { + display: inline-block; +} + +.row-actions .network_only, +.row-actions .network_active { + color: #000; +} + +.no-js .row-actions, +tr:hover .row-actions, +.mobile .row-actions, +.row-actions.visible, +.comment-item:hover .row-actions { + position: static; +} + +/* deprecated */ +.row-actions-visible { + padding: 2px 0 0; +} + + +/*------------------------------------------------------------------------------ + 10.1 - Inline Editing +------------------------------------------------------------------------------*/ + +/* +.quick-edit* is for Quick Edit +.bulk-edit* is for Bulk Edit +.inline-edit* is for everything +*/ + +/* Layout */ + +#wpbody-content .inline-edit-row fieldset { + font-size: 12px; + float: left; + margin: 0; + padding: 0; + width: 100%; +} + +tr.inline-edit-row td, +#wpbody-content .inline-edit-row fieldset .inline-edit-col { + padding: 0 0.5em; +} + +#wpbody-content .quick-edit-row-post .inline-edit-col-left { + width: 40%; +} + +#wpbody-content .quick-edit-row-post .inline-edit-col-right { + width: 39%; +} + +#wpbody-content .inline-edit-row-post .inline-edit-col-center { + width: 20%; +} + +#wpbody-content .quick-edit-row-page .inline-edit-col-left { + width: 50%; +} + +#wpbody-content .quick-edit-row-page .inline-edit-col-right, +#wpbody-content .bulk-edit-row-post .inline-edit-col-right { + width: 49%; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-left { + width: 30%; +} + +#wpbody-content .bulk-edit-row-page .inline-edit-col-right { + width: 69%; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-bottom { + float: right; + width: 69%; +} + +#wpbody-content .inline-edit-row-page .inline-edit-col-right { + margin-top: 27px; +} + +.inline-edit-row fieldset .inline-edit-group { + clear: both; + line-height: 2.5; +} + +.inline-edit-row .submit { + clear: both; + padding: 0.5em; + margin: 0.5em 0 0; +} + +.inline-edit-row .notice-error { + margin-top: 1em; +} + +.inline-edit-row .notice-error .error { + margin: 0.5em 0; + padding: 2px; +} + +/* Positioning */ + +/* Needs higher specificity for the padding */ +#the-list .inline-edit-row .inline-edit-legend { + margin: 0; + padding: 0.2em 0.5em 0; + line-height: 2.5; + font-weight: 600; +} + +#the-list #bulk-edit.inline-edit-row .inline-edit-legend { + padding: 0.2em 0.5em; +} + +.inline-edit-row fieldset span.title, +.inline-edit-row fieldset span.checkbox-title { + margin: 0; + padding: 0; +} + +.inline-edit-row fieldset label, +.inline-edit-row fieldset span.inline-edit-categories-label { + display: block; + margin: .2em 0; + line-height: 2.5; +} + +.inline-edit-row fieldset.inline-edit-date label { + display: inline-block; + margin: 0; + vertical-align: baseline; + line-height: 2; +} + +.inline-edit-row fieldset label.inline-edit-tags { + margin-top: 0; +} + +.inline-edit-row fieldset label.inline-edit-tags span.title { + margin: .2em 0; + width: auto; +} + +.inline-edit-row fieldset label span.title, +.inline-edit-row fieldset.inline-edit-date legend { + display: block; + float: left; + width: 6em; + line-height: 2.5; +} + +#posts-filter fieldset.inline-edit-date legend { + padding: 0; +} + +.inline-edit-row fieldset label span.input-text-wrap, +.inline-edit-row fieldset .timestamp-wrap { + display: block; + margin-left: 6em; +} + +.quick-edit-row-post fieldset.inline-edit-col-right label span.title { + width: auto; + padding-right: 0.5em; +} + +.inline-edit-row .inline-edit-or { + margin: .2em 6px .2em 0; + line-height: 2.5; +} + +.inline-edit-row .input-text-wrap input[type=text] { + width: 100%; +} + +.inline-edit-row fieldset label input[type=checkbox] { + vertical-align: middle; +} + +.inline-edit-row fieldset label textarea { + width: 100%; + height: 4em; + vertical-align: top; +} + +#wpbody-content .bulk-edit-row fieldset .inline-edit-group label { + max-width: 50%; +} + +#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child { + margin-right: 0.5em +} + +.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input { + width: 6em; +} + +/* Styling */ +.inline-edit-row .inline-edit-legend { + text-transform: uppercase; +} + +/* Specific Elements */ +.inline-edit-row fieldset .inline-edit-date { + float: left; +} + +.inline-edit-row fieldset input[name=jj], +.inline-edit-row fieldset input[name=hh], +.inline-edit-row fieldset input[name=mn], +.inline-edit-row fieldset input[name=aa] { + vertical-align: middle; + text-align: center; + padding: 0 4px; +} + +.inline-edit-row fieldset label input.inline-edit-password-input { + width: 8em; +} + +ul.cat-checklist { + height: 12em; + border: solid 1px #ddd; + overflow-y: scroll; + padding: 0 5px; + margin: 0; + background-color: #fff; +} + +#bulk-titles { + display: block; + height: 12em; + border: 1px solid #ddd; + overflow-y: scroll; + padding: 0 5px; + margin: 0 0 5px; +} + +.inline-edit-row fieldset ul.cat-checklist li, +.inline-edit-row fieldset ul.cat-checklist input { + margin: 0; + position: relative; /* RTL fix, #WP27629 */ +} + +.inline-edit-row fieldset ul.cat-checklist label, +.inline-edit-row #bulk-titles div { + font-style: normal; + font-size: 11px; +} + +.inline-edit-row fieldset label input.inline-edit-menu-order-input { + width: 3em; +} + +.inline-edit-row fieldset label input.inline-edit-slug-input { + width: 75%; +} + +.inline-edit-row #post_parent, +.inline-edit-row select[name="page_template"] { + max-width: 80%; +} + +.ie8 .inline-edit-row #post_parent, +.ie8 .inline-edit-row select[name="page_template"] { + width: 250px; +} + +.quick-edit-row-post fieldset label.inline-edit-status { + float: left; +} + +#bulk-titles { + line-height: 140%; +} +#bulk-titles div { + margin: 0.2em 0.3em; +} + +#bulk-titles div a { + cursor: pointer; + display: block; + float: left; + height: 18px; + margin: 0 3px 0 -2px; + overflow: hidden; + position: relative; + width: 20px; +} + +#bulk-titles div a:before { + position: relative; + top: -3px; +} + +/*------------------------------------------------------------------------------ + 17.0 - Plugins +------------------------------------------------------------------------------*/ + +.plugins tbody th.check-column, +.plugins tbody { + padding: 8px 0 0 2px; +} + +.plugins tbody th.check-column input[type=checkbox] { + margin-top: 4px; +} + +.updates-table .plugin-title p { + margin-top: 0; +} + +.plugins thead td.check-column, +.plugins tfoot td.check-column, +.plugins .inactive th.check-column { + padding-left: 6px; +} + +.plugins, +.plugins th, +.plugins td { + color: #000; +} + +.plugins tr { + background: #fff; +} + +.plugins p { + margin: 0 4px; + padding: 0; +} + +.plugins .desc p { + margin: 0 0 8px; +} + +.plugins td.desc { + line-height: 1.5; +} + +.plugins .desc ul, +.plugins .desc ol { + margin: 0 0 0 2em; +} + +.plugins .desc ul { + list-style-type: disc; +} + +.plugins .row-actions { + font-size: 13px; + padding: 0; +} + +.plugins .inactive td, +.plugins .inactive th, +.plugins .active td, +.plugins .active th { + padding: 10px 9px; +} + +.plugins .active td, +.plugins .active th { + background-color: #f7fcfe; +} + +.plugins .update th, +.plugins .update td { + border-bottom: 0; +} + +.plugins .inactive td, +.plugins .inactive th, +.plugins .active td, +.plugins .active th, +.plugin-install #the-list td, +.upgrade .plugins td, +.upgrade .plugins th { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.plugins tr.active.plugin-update-tr + tr.inactive th, +.plugins tr.active.plugin-update-tr + tr.inactive td, +.plugins tr.active + tr.inactive th, +.plugins tr.active + tr.inactive td { + border-top: 1px solid rgba(0, 0, 0, 0.03); + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.02), inset 0 -1px 0 #e1e1e1; +} + +.plugins .update td, +.plugins .update th, +.upgrade .plugins tr:last-of-type td, +.upgrade .plugins tr:last-of-type th, +.plugins tr.active + tr.inactive.update th, +.plugins tr.active + tr.inactive.update td, +.plugins .updated td, +.plugins .updated th, +.plugins tr.active + tr.inactive.updated th, +.plugins tr.active + tr.inactive.updated td { + box-shadow: none; +} + +.plugins .active th.check-column, +.plugin-update-tr.active td { + border-left: 4px solid #00a0d2; +} + +.wp-list-table.plugins .plugin-title, +.wp-list-table.plugins .theme-title { + padding-right: 12px; + white-space: nowrap; +} + +.plugins .plugin-title img, +.plugins .plugin-title .dashicons { + float: left; + padding: 0 10px 0 0; + width: 64px; + height: 64px; +} + +.plugins .plugin-title .dashicons:before { + padding: 2px; + background-color: #eee; + box-shadow: inset 0 0 10px rgba(160, 165, 170, 0.15); + font-size: 60px; + color: #B4B9BE; +} + +#update-themes-table .plugin-title img, +#update-themes-table .plugin-title .dashicons { + width: 85px; +} + +.plugins .inactive .plugin-title strong { + font-weight: 400; +} + +.plugins .second, +.plugins .row-actions { + padding: 0 0 5px; +} + +.plugins .update .second, +.plugins .update .row-actions, +.plugins .updated .second, +.plugins .updated .row-actions { + padding-bottom: 0; +} + +.plugins-php .widefat tfoot th, +.plugins-php .widefat tfoot td { + border-top-style: solid; + border-top-width: 1px; +} + +.plugins .plugin-update-tr .plugin-update { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); + overflow: hidden; /* clearfix */ + padding: 0; +} + +.plugins .plugin-update-tr .notice, +.plugins .plugin-update-tr div[class="update-message"] { /* back-compat for pre-4.6 */ + margin: 5px 20px 15px 40px; +} + +.plugins .notice p { + margin: 0.5em 0; +} + +.plugins .plugin-description a, +.plugins .plugin-update a, +.updates-table .plugin-title a { + text-decoration: underline; +} + +.plugins tr.paused th.check-column { + border-left: 4px solid #d54e21; +} + +.plugins tr.paused th, +.plugins tr.paused td { + background-color: #fef7f1; +} + +.plugins tr.paused .plugin-title, +.plugins .paused .dashicons-warning { + color: #dc3232; +} + +.plugins .paused .error-display p, +.plugins .paused .error-display code { + font-size: 90%; + color: rgba( 0, 0, 0, 0.7 ); +} + +.plugins .resume-link { + color: #dc3232; +} + +.plugin-card .update-now:before { + color: #f56e28; + content: "\f463"; + display: inline-block; + font: normal 20px/1 dashicons; + margin: 3px 5px 0 -2px; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + vertical-align: top; +} + +.plugin-card .updating-message:before { + content: "\f463"; + animation: rotation 2s infinite linear; +} + +@keyframes rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} + +.plugin-card .updated-message:before { + color: #79ba49; + content: "\f147"; +} + +.plugin-install-php h2 { + clear: both; +} + +.plugin-install-php h3 { + margin: 2.5em 0 8px; +} + +.plugin-install-php .wp-filter { + margin-bottom: 0; +} + +/* Plugin card table view */ +.plugin-group { + overflow: hidden; /* clearfix */ + margin-top: 1.5em; +} + +.plugin-group h3 { + margin-top: 0; +} + +.plugin-card { + float: left; + margin: 0 8px 16px; + width: 48.5%; + width: calc( 50% - 8px ); + background-color: #fff; + border: 1px solid #ddd; + box-sizing: border-box; +} + +.plugin-card:nth-child(odd) { + clear: both; + margin-left: 0; +} + +.plugin-card:nth-child(even) { + margin-right: 0; +} + +@media screen and (min-width: 1600px) and ( max-width: 2299px ) { + .plugin-card { + width: 30%; + width: calc( 33.1% - 8px ); + } + + .plugin-card:nth-child(odd) { + clear: none; + margin-left: 8px; + } + + .plugin-card:nth-child(even) { + margin-right: 8px; + } + + .plugin-card:nth-child(3n+1) { + clear: both; + margin-left: 0; + } + + .plugin-card:nth-child(3n) { + margin-right: 0; + } +} + +@media screen and (min-width: 2300px) { + .plugin-card { + width: 25%; + width: calc( 25% - 12px ); + } + + .plugin-card:nth-child(odd) { + clear: none; + margin-left: 8px; + } + + .plugin-card:nth-child(even) { + margin-right: 8px; + } + + .plugin-card:nth-child(4n+1) { + clear: both; + margin-left: 0; + } + + .plugin-card:nth-child(4n) { + margin-right: 0; + } +} + +.plugin-card-top { + position: relative; + padding: 20px 20px 10px; + min-height: 135px; +} + +div.action-links, +.plugin-action-buttons { + margin: 0; /* Override existing margins */ +} + +.plugin-card h3 { + margin: 0 12px 12px 0; + font-size: 18px; + line-height: 1.3; +} + +.plugin-card .name, +.plugin-card .desc { + margin-left: 148px; /* icon + margin */ + margin-right: 120px; /* action links */ +} + +.plugin-card .action-links { + position: absolute; + top: 20px; + right: 20px; + width: 120px; +} + +.plugin-action-buttons { + clear: right; + float: right; + margin-left: 2em; + margin-bottom: 1em; + text-align: right; +} + +.plugin-action-buttons li { + margin-bottom: 10px; +} + +.plugin-card-bottom { + clear: both; + padding: 12px 20px; + background-color: #fafafa; + border-top: 1px solid #ddd; + overflow: hidden; +} + +.plugin-card-bottom .star-rating { + display: inline; +} + +.plugin-card-update-failed .update-now { + font-weight: 600; +} + +.plugin-card-update-failed .notice-error { + margin: 0; + padding-left: 16px; + box-shadow: 0 -1px 0 #ddd; +} + +.plugin-card-update-failed .plugin-card-bottom { + display: none; +} + +.plugin-card .column-rating { + line-height: 1.76923076; +} + +.plugin-card .column-rating, +.plugin-card .column-updated { + margin-bottom: 4px; +} + +.plugin-card .column-rating, +.plugin-card .column-downloaded { + float: left; + clear: left; + max-width: 180px; +} + +.plugin-card .column-updated, +.plugin-card .column-compatibility { + text-align: right; + float: right; + clear: right; + width: 65%; + width: calc( 100% - 180px ); +} + +.plugin-card .column-compatibility span:before { + font: normal 20px/.5 dashicons; + speak: none; + display: inline-block; + padding: 0; + top: 4px; + left: -2px; + position: relative; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-decoration: none !important; + color: #444; +} + +.plugin-card .column-compatibility .compatibility-incompatible:before { + content: "\f158"; + color: #c62d2d; +} + +.plugin-card .column-compatibility .compatibility-compatible:before { + content: "\f147"; + color: #31843f; +} + +.plugin-card .notice { + margin: 20px 20px 0 20px; +} + +.plugin-icon { + position: absolute; + top: 20px; + left: 20px; + width: 128px; + height: 128px; + margin: 0 20px 20px 0; +} + +.no-plugin-results { + color: #666; /* same as no themes and no media */ + font-size: 18px; + font-style: normal; + margin: 0; + padding: 100px 0 0; + text-align: center; +} + +/* ms */ +/* Background Color for Site Status */ +.wp-list-table .site-deleted, +.wp-list-table tr.site-deleted { + background: #ff8573; +} +.wp-list-table .site-spammed, +.wp-list-table tr.site-spammed { + background: #faafaa; +} +.wp-list-table .site-archived, +.wp-list-table tr.site-archived { + background: #ffebe8; +} +.wp-list-table .site-mature, +.wp-list-table tr.site-mature { + background: #fecac2; +} + +.sites.fixed .column-lastupdated, +.sites.fixed .column-registered { + width: 20%; +} + +.sites.fixed .column-users { + width: 80px; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +@media screen and (max-width: 1100px) and (min-width: 782px), (max-width: 480px) { + .plugin-card .action-links { + position: static; + margin-left: 148px; + width: auto; + } + + .plugin-action-buttons { + float: none; + margin: 1em 0 0; + text-align: left; + } + + .plugin-action-buttons li { + display: inline-block; + vertical-align: middle; + } + + .plugin-action-buttons li .button { + margin-right: 20px; + } + + .plugin-card h3 { + margin-right: 24px; + } + + .plugin-card .name, + .plugin-card .desc { + margin-right: 0; + } + + .plugin-card .desc p:first-of-type { + margin-top: 0; + } + + .fixed .column-date { + width: 14%; + } +} + +@media screen and (max-width: 782px) { + /* WP List Table Options & Filters */ + .tablenav { + height: auto; + } + + .tablenav.top { + margin: 20px 0 5px 0; + } + + .tablenav.bottom { + position: relative; + margin-top: 15px; + } + + .tablenav br { + display: none; + } + + .tablenav br.clear { + display: block; + } + + .tablenav.top .actions, + .tablenav .view-switch { + display: none; + } + + .view-switch a { + width: 36px; + height: 36px; + line-height: 2.53846153; + } + + /* Pagination */ + .tablenav.top .displaying-num { + display: none; + } + + .tablenav.bottom .displaying-num { + position: absolute; + right: 0; + top: 11px; + margin: 0; + font-size: 14px; + } + + .tablenav .tablenav-pages { + width: 100%; + text-align: center; + margin: 0 0 25px; + } + + .tablenav.bottom .tablenav-pages { + margin-top: 25px; + } + + .tablenav.top .tablenav-pages.one-page { + display: none; + } + + .tablenav.bottom .tablenav-pages.one-page { + margin: 15px 0 0 0; + height: 0; + } + + .tablenav-pages .pagination-links { + font-size: 16px; + } + + .tablenav .tablenav-pages .button, + .tablenav .tablenav-pages .tablenav-pages-navspan { + min-width: 44px; + padding: 12px 8px; + font-size: 18px; + line-height: 1; + } + + .tablenav-pages .pagination-links .current-page { + min-width: 44px; + padding: 12px 6px; + font-size: 16px; + line-height: 1.125; + } + + /* WP List Table Adjustments: General */ + .form-wrap > p { + display: none; + } + + .wp-list-table th.column-primary ~ th, + .wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) { + display: none; + } + + .wp-list-table thead th.column-primary { + width: 100%; + } + + /* Checkboxes need to show */ + .wp-list-table tr th.check-column { + display: table-cell; + } + + .wp-list-table .check-column { + width: 2.5em; + } + + .wp-list-table .column-primary .toggle-row { + display: block; + } + + .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column) { + position: relative; + clear: both; + width: auto !important; /* needs to override some columns that are more specifically targeted */ + } + + .wp-list-table td.column-primary { + padding-right: 50px; /* space for toggle button */ + } + + .wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) { + padding: 3px 8px 3px 35%; + } + + .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before { + position: absolute; + left: 10px; /* match padding of regular table cell */ + display: block; + overflow: hidden; + width: 32%; /* leave a little space for a gutter */ + content: attr(data-colname); + white-space: nowrap; + text-overflow: ellipsis; + } + + .wp-list-table .is-expanded td:not(.hidden) { + display: block !important; + overflow: hidden; /* clearfix */ + } + + /* Special cases */ + .widefat .num, + .column-posts { + text-align: left; + } + + #comments-form .fixed .column-author, + #commentsdiv .fixed .column-author { + display: none !important; + } + + .fixed .column-comment .comment-author { + display: block; + } + + /* Comment author hidden via Screen Options */ + .fixed .column-author.hidden ~ .column-comment .comment-author { + display: none; + } + + #the-comment-list .is-expanded td { + box-shadow: none; + } + + #the-comment-list .is-expanded td:last-child { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); + } + + /* Show comment bubble as text instead */ + .post-com-count .screen-reader-text { + position: static; + -webkit-clip-path: none; + clip-path: none; + width: auto; + height: auto; + margin: 0; + } + + .column-response .post-com-count-no-comments:after, + .column-response .post-com-count-approved:after, + .column-comments .post-com-count-no-comments:after, + .column-comments .post-com-count-approved:after { + content: none; + } + + .column-response .post-com-count [aria-hidden="true"], + .column-comments .post-com-count [aria-hidden="true"] { + display: none; + } + + .column-response .post-com-count-wrapper, + .column-comments .post-com-count-wrapper { + white-space: normal; + } + + .column-response .post-com-count-wrapper > a, + .column-comments .post-com-count-wrapper > a { + display: block; + } + + .column-response .post-com-count-no-comments, + .column-response .post-com-count-approved, + .column-comments .post-com-count-no-comments, + .column-comments .post-com-count-approved { + margin-top: 0; + margin-right: 0.5em; + } + + .column-response .post-com-count-pending, + .column-comments .post-com-count-pending { + position: static; + height: auto; + min-width: 0; + padding: 0; + border: none; + border-radius: 0; + background: none; + color: #bb2a2a; + font-size: inherit; + line-height: inherit; + text-align: left; + } + + .column-response .post-com-count-pending:hover, + .column-comments .post-com-count-pending:hover { + color: #dc3232; + } + + .widefat thead td.check-column, + .widefat tfoot td.check-column { + padding-top: 10px; + } + + /* Make row actions more easy to select on mobile */ + body:not(.plugins-php) .row-actions { + display: -ms-grid; + display: grid; + -ms-grid-columns: auto auto auto; + grid-template-columns: auto auto auto; + color: transparent; + } + + .row-actions span { + padding: 4px 0; + } + + .row-actions span a, + .row-actions span .button-link { + display: inline-block; + padding: 4px 0; + line-height: 1.5; + } + + .row-actions span.approve:before, + .row-actions span.unapprove:before { + content: "| "; + } + + /* Quick Edit and Bulk Edit */ + #wpbody-content .quick-edit-row-post .inline-edit-col-left, + #wpbody-content .quick-edit-row-post .inline-edit-col-right, + #wpbody-content .inline-edit-row-post .inline-edit-col-center, + #wpbody-content .quick-edit-row-page .inline-edit-col-left, + #wpbody-content .quick-edit-row-page .inline-edit-col-right, + #wpbody-content .bulk-edit-row-post .inline-edit-col-right, + #wpbody-content .bulk-edit-row .inline-edit-col-left, + #wpbody-content .bulk-edit-row-page .inline-edit-col-right, + #wpbody-content .bulk-edit-row .inline-edit-col-bottom { + float: none; + width: 100%; + } + + #wpbody-content .quick-edit-row fieldset .inline-edit-col label, + #wpbody-content .quick-edit-row fieldset .inline-edit-group label, + #wpbody-content .bulk-edit-row fieldset .inline-edit-col label, + #wpbody-content .bulk-edit-row fieldset .inline-edit-group label { + max-width: none; + float: none; + margin-bottom: 5px; + } + + #wpbody .bulk-edit-row fieldset select { + display: block; + width: 100%; + max-width: none; + box-sizing: border-box; + } + + .inline-edit-row fieldset input[name=jj], + .inline-edit-row fieldset input[name=hh], + .inline-edit-row fieldset input[name=mn], + .inline-edit-row fieldset input[name=aa] { + font-size: 16px; + line-height: 2; + padding: 3px 4px; + } + + .inline-edit-row fieldset ul.cat-checklist label, + .inline-edit-row #bulk-titles div { + font-size: 16px; + } + + .inline-edit-row fieldset label span.title, + .inline-edit-row fieldset.inline-edit-date legend { + float: none; + } + + .inline-edit-row fieldset label.inline-edit-tags { + padding: 0 0.5em; + } + + .inline-edit-row fieldset .inline-edit-col label.inline-edit-tags { + padding: 0; + } + + .inline-edit-row fieldset label span.input-text-wrap, + .inline-edit-row fieldset .timestamp-wrap { + margin-left: 0; + } + + .inline-edit-row .inline-edit-or { + margin: 0 6px 0 0; + } + + #edithead .inside, + #commentsdiv #edithead .inside { + float: none; + text-align: left; + padding: 3px 5px; + } + + #commentsdiv #edithead .inside input, + #edithead .inside input { + width: 100%; + } + + #edithead label { + display: block; + } + + #bulk-titles div { + margin: 0.8em 0.3em; + } + + #bulk-titles div a { + height: 22px; + } + + /* Updates */ + #wpbody-content .updates-table .plugin-title { + width: auto; + white-space: normal; + } + + /* Links */ + .link-manager-php #posts-filter { + margin-top: 25px; + } + + .link-manager-php .tablenav.bottom { + overflow: hidden; + } + + /* List tables that don't toggle rows */ + .comments-box .toggle-row, + .wp-list-table.plugins .toggle-row { + display: none; + } + + /* Plugin/Theme Management */ + #wpbody-content .wp-list-table.plugins td { + display: block; + width: auto; + padding: 10px 9px; /* reset from other list tables that have a label at this width */ + } + + /* Plugin description hidden via Screen Options */ + #wpbody-content .wp-list-table.plugins .desc.hidden { + display: none; + } + + #wpbody-content .wp-list-table.plugins .column-description { + padding-top: 2px; + } + + #wpbody-content .wp-list-table.plugins .plugin-title, + #wpbody-content .wp-list-table.plugins .theme-title { + padding-right: 12px; + white-space: normal; + } + + .wp-list-table.plugins .plugin-title, + .wp-list-table.plugins .theme-title { + padding-top: 13px; + padding-bottom: 4px; + } + + .plugins #the-list tr > td:not(:last-child), + .plugins #the-list .update th, + .plugins #the-list .update td, + .wp-list-table.plugins #the-list .theme-title { + box-shadow: none; + border-top: none; + } + + .plugins #the-list tr td { + border-top: none; + } + + .plugins tbody { + padding: 1px 0 0; + } + + .plugins tr.active + tr.inactive th.check-column, + .plugins tr.active + tr.inactive td.column-description, + .plugins .plugin-update-tr:before { + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); + } + + .plugins tr.active + tr.inactive th.check-column, + .plugins tr.active + tr.inactive td { + border-top: none; + } + + /* mimic the checkbox th */ + .plugins .plugin-update-tr:before { + content: ""; + display: table-cell; + } + + .plugins .active.update + .plugin-update-tr:before { + border-left: 4px solid #d54e21; + background-color: #fef7f1; + } + + .plugins #the-list .plugin-update-tr .plugin-update { + border-left: none; + } + + .plugin-update-tr .update-message { + margin-left: 0; + } + + .plugins .active.update + .plugin-update-tr:before { + background-color: #f7fcfe; + border-left: 4px solid #00a0d2; + } + + .plugins .plugin-update-tr .update-message { + margin-left: 0; + } + + .wp-list-table.plugins .plugin-title strong, + .wp-list-table.plugins .theme-title strong { + font-size: 1.4em; + line-height: 1.5; + } + + /* Add New plugins page */ + table.plugin-install .column-name, + table.plugin-install .column-version, + table.plugin-install .column-rating, + table.plugin-install .column-description { + display: block; + width: auto; + } + + table.plugin-install th.column-name, + table.plugin-install th.column-version, + table.plugin-install th.column-rating, + table.plugin-install th.column-description { + display: none; + } + + table.plugin-install td.column-name strong { + font-size: 1.4em; + line-height: 1.6em; + } + + table.plugin-install #the-list td { + box-shadow: none; + } + + table.plugin-install #the-list tr { + display: block; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1); + } + + .plugin-card { + margin-left: 0; + margin-right: 0; + width: 100%; + } +} + +@media screen and (max-width: 480px) { + .tablenav-pages .current-page { + margin: 0; + } + + /* Drop row actions to two columns on a small screen */ + .row-actions:not(.plugins-php) { + -ms-grid-columns: auto auto; + grid-template-columns: auto auto; + } + + .tablenav-pages .tablenav-paging-text { + float: left; + width: 100%; + padding-top: 0.5em; + } +} diff --git a/wp-admin/css/list-tables.min.css b/wp-admin/css/list-tables.min.css new file mode 100644 index 0000000..f5e1821 --- /dev/null +++ b/wp-admin/css/list-tables.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.response-links{display:block;margin-bottom:1em}.response-links a{display:block}.response-links a.comments-edit-item-link{font-weight:600}.response-links a.comments-view-item-link{font-size:12px}.post-com-count-wrapper strong{font-weight:400}.comments-view-item-link{display:inline-block;clear:both}.column-comments .post-com-count-wrapper,.column-response .post-com-count-wrapper{white-space:nowrap;word-wrap:normal}.column-comments .post-com-count,.column-response .post-com-count{display:inline-block;vertical-align:top}.column-comments .post-com-count-approved,.column-comments .post-com-count-no-comments,.column-response .post-com-count-approved,.column-response .post-com-count-no-comments{margin-top:5px}.column-comments .comment-count-approved,.column-comments .comment-count-no-comments,.column-response .comment-count-approved,.column-response .comment-count-no-comments{box-sizing:border-box;display:block;padding:0 8px;min-width:24px;height:2em;border-radius:5px;background-color:#72777c;color:#fff;font-size:11px;line-height:1.90909090;text-align:center}.ie8 .column-comments .comment-count-approved,.ie8 .column-comments .comment-count-no-comments,.ie8 .column-response .comment-count-approved,.ie8 .column-response .comment-count-no-comments{min-width:0}.column-comments .post-com-count-approved:after,.column-comments .post-com-count-no-comments:after,.column-response .post-com-count-approved:after,.column-response .post-com-count-no-comments:after{content:"";display:block;margin-left:8px;width:0;height:0;border-top:5px solid #72777c;border-right:5px solid transparent}.column-comments .post-com-count-approved:focus .comment-count-approved,.column-comments .post-com-count-approved:hover .comment-count-approved,.column-response .post-com-count-approved:focus .comment-count-approved,.column-response .post-com-count-approved:hover .comment-count-approved{background:#0073aa}.column-comments .post-com-count-approved:focus:after,.column-comments .post-com-count-approved:hover:after,.column-response .post-com-count-approved:focus:after,.column-response .post-com-count-approved:hover:after{border-top-color:#0073aa}.column-comments .post-com-count-pending,.column-response .post-com-count-pending{position:relative;left:-3px;padding:0 5px;min-width:7px;height:17px;border:2px solid #fff;border-radius:11px;background:#ca4a1f;color:#fff;font-size:9px;line-height:1.88888888;text-align:center}.column-comments .post-com-count-no-pending,.column-response .post-com-count-no-pending{display:none}.commentlist li{padding:1em 1em .2em;margin:0;border-bottom:1px solid #ccc}.commentlist li li{border-bottom:0;padding:0}.commentlist p{padding:0;margin:0 0 .8em}#submitted-on,.submitted-on{color:#555d66}#replyrow td{padding:2px}#replysubmit{margin:0;padding:5px 7px 10px;overflow:hidden}#replysubmit .reply-submit-buttons{margin-bottom:0}#replysubmit .button{margin-right:5px}#replysubmit .spinner{float:none;margin:-4px 0 0}#replyrow.inline-edit-row fieldset.comment-reply{font-size:inherit;line-height:inherit}#replyrow legend{margin:0;padding:.2em 5px 0;font-size:13px;line-height:1.4;font-weight:600}#replyrow.inline-edit-row label{display:inline;vertical-align:baseline;line-height:inherit}#commentsdiv #edithead .inside,#edithead .inside{float:left;padding:3px 0 2px 5px;margin:0;text-align:center}#edithead .inside input{width:180px}#edithead label{padding:2px 0}#replycontainer{padding:5px}#replycontent{height:120px;box-shadow:none}#replyerror{border-color:#ddd;background-color:#f9f9f9}.commentlist .avatar{vertical-align:text-top}#the-comment-list div.undo,#the-comment-list tr.undo{background-color:#f5f5f5}#the-comment-list .unapproved td,#the-comment-list .unapproved th{background-color:#fef7f1}#the-comment-list .unapproved th.check-column{border-left:4px solid #d54e21}#the-comment-list .unapproved th.check-column input{margin-left:4px}#the-comment-list .approve a{color:#006505}#the-comment-list .unapprove a{color:#d98500}#the-comment-list td,#the-comment-list th{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}#the-comment-list tr:last-child td,#the-comment-list tr:last-child th{box-shadow:none}#the-comment-list tr.unapproved+tr.approved td,#the-comment-list tr.unapproved+tr.approved th{border-top:1px solid rgba(0,0,0,.03)}.vim-current,.vim-current td,.vim-current th{background-color:#e4f2fd!important}th .comment-grey-bubble{height:16px;width:16px}th .comment-grey-bubble:before{content:"\f101";font:normal 20px/.5 dashicons;speak:none;display:inline-block;padding:0;top:4px;left:-4px;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#444}table.fixed{table-layout:fixed}.fixed .column-rating,.fixed .column-visible{width:8%}.fixed .column-author,.fixed .column-date,.fixed .column-format,.fixed .column-links,.fixed .column-parent,.fixed .column-posts{width:10%}.column-date span[title]{-webkit-text-decoration:dotted underline;text-decoration:dotted underline}.fixed .column-posts{width:74px}.fixed .column-comment .comment-author{display:none}.fixed .column-categories,.fixed .column-rel,.fixed .column-response,.fixed .column-role,.fixed .column-tags{width:15%}.fixed .column-slug{width:25%}.fixed .column-locations{width:35%}.fixed .column-comments{width:5.5em;padding:8px 0;text-align:left}.fixed .column-comments .vers{padding-left:3px}td.column-title strong,td.plugin-title strong{display:block;margin-bottom:.2em;font-size:14px}td.column-title p,td.plugin-title p{margin:6px 0}table.media .column-title .media-icon{float:left;min-height:60px;margin:0 9px 0 0}table.media .column-title .media-icon img{max-width:60px;height:auto;vertical-align:top}table.media .column-title .has-media-icon~.row-actions{margin-left:70px}table.media .column-title .filename{margin-bottom:.2em}.wp-list-table a{transition:none}#the-list tr:last-child td,#the-list tr:last-child th{border-bottom:none!important;box-shadow:none}#comments-form .fixed .column-author{width:20%}#comments-form .fixed .column-date{width:14%}#commentsdiv.postbox .inside{margin:0;padding:0}#commentsdiv .inside .row-actions{line-height:1.38461538}#commentsdiv .inside .column-author{width:25%}#commentsdiv .column-comment p{margin:.6em 0;padding:0}#commentsdiv #replyrow td{padding:0}#commentsdiv p{padding:8px 10px;margin:0}#commentsdiv .comments-box{border:0 none}#commentsdiv .comments-box thead td,#commentsdiv .comments-box thead th{background:0 0;padding:0 7px 4px}#commentsdiv .comments-box tr:last-child td{border-bottom:0 none}#commentsdiv #edithead .inside input{width:160px}.sorting-indicator{display:block;visibility:hidden;width:10px;height:4px;margin-top:8px;margin-left:7px}.sorting-indicator:before{content:"\f142";font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0;top:-4px;left:-8px;color:#444;line-height:.5;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#444}.column-comments .sorting-indicator:before{top:0;left:-10px}th.desc a:focus span.sorting-indicator:before,th.desc:hover span.sorting-indicator:before,th.sorted.asc .sorting-indicator:before{content:"\f142"}th.asc a:focus span.sorting-indicator:before,th.asc:hover span.sorting-indicator:before,th.sorted.desc .sorting-indicator:before{content:"\f140"}.wp-list-table .toggle-row{position:absolute;right:8px;top:10px;display:none;padding:0;width:40px;height:40px;border:none;outline:0;background:0 0}.wp-list-table .toggle-row:hover{cursor:pointer}.wp-list-table .toggle-row:focus:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.ie8 .wp-list-table .toggle-row:focus:before{outline:#5b9dd9 solid 1px}.wp-list-table .toggle-row:active{box-shadow:none}.wp-list-table .toggle-row:before{position:absolute;top:-5px;left:10px;border-radius:50%;display:block;padding:1px 2px 1px 0;color:#444;content:"\f140";font:normal 20px/1 dashicons;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;speak:none}.wp-list-table .is-expanded .toggle-row:before{content:"\f142"}.locked-indicator{display:none;margin-left:6px;height:20px;width:16px}.locked-indicator-icon:before{color:#82878c;content:"\f160";display:inline-block;font:normal 20px/1 dashicons;speak:none;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.locked-info{display:none;margin-top:4px}.locked-text{vertical-align:top}.wp-locked .locked-indicator,.wp-locked .locked-info{display:block}tr.wp-locked .check-column input[type=checkbox],tr.wp-locked .check-column label,tr.wp-locked .row-actions .inline,tr.wp-locked .row-actions .trash{display:none}.fixed .column-comments .sorting-indicator{margin-top:3px}#menu-locations-wrap .widefat{width:60%}.widefat th.sortable,.widefat th.sorted{padding:0}th.sortable a,th.sorted a{display:block;overflow:hidden;padding:8px}.fixed .column-comments.sortable a,.fixed .column-comments.sorted a{padding:8px 0}th.sortable a span,th.sorted a span{float:left;cursor:pointer}th.asc a:focus span.sorting-indicator,th.asc:hover span.sorting-indicator,th.desc a:focus span.sorting-indicator,th.desc:hover span.sorting-indicator,th.sorted .sorting-indicator{visibility:visible}.tablenav-pages .current-page{margin:0 2px 0 0;font-size:13px;text-align:center}.tablenav .total-pages{margin-right:2px}.tablenav #table-paging{margin-left:2px}.tablenav{clear:both;height:30px;margin:6px 0 4px;padding-top:5px;vertical-align:middle}.tablenav.themes{max-width:98%}.tablenav .tablenav-pages{float:right;margin:0 0 9px}.tablenav .no-pages,.tablenav .one-page .pagination-links{display:none}.tablenav .tablenav-pages .button,.tablenav .tablenav-pages .tablenav-pages-navspan{display:inline-block;vertical-align:baseline;min-width:30px;min-height:30px;margin:0;padding:0 4px;font-size:16px;line-height:1.625;text-align:center}.tablenav .displaying-num{margin-right:7px}.tablenav .one-page .displaying-num{display:inline-block;margin:5px 0}.tablenav .actions{padding:0 8px 0 0}.wp-filter .actions{display:inline-block;vertical-align:middle}.tablenav .delete{margin-right:20px}.tablenav .view-switch{float:right;margin:0 5px;padding-top:3px}.wp-filter .view-switch{display:inline-block;vertical-align:middle;padding:12px 0;margin:0 8px 0 2px}.media-toolbar.wp-filter .view-switch{margin:0 12px 0 2px}.view-switch a{float:left;width:28px;height:28px;text-align:center;line-height:1.84615384;text-decoration:none}.view-switch a:before{color:#b4b9be;display:inline-block;font:normal 20px/1 dashicons;speak:none;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.view-switch a:focus:before,.view-switch a:hover:before{color:#727272}.view-switch a.current:before{color:#0073aa}.view-switch .view-list:before{content:"\f163"}.view-switch .view-excerpt:before{content:"\f164"}.view-switch .view-grid:before{content:"\f509"}.filter{float:left;margin:-5px 0 0 10px}.filter .subsubsub{margin-left:-10px;margin-top:13px}.screen-per-page{width:4em}#posts-filter .wp-filter{margin-bottom:0}#posts-filter fieldset{float:left;margin:0 1.5ex 1em 0;padding:0}#posts-filter fieldset legend{padding:0 0 .2em 1px}p.pagenav{margin:0;display:inline}.pagenav span{font-weight:600;margin:0 6px}.row-title{font-size:14px!important;font-weight:600}.column-comment .comment-author{margin-bottom:.6em}.column-author img,.column-comment .comment-author img,.column-username img{float:left;margin-right:10px;margin-top:1px}.row-actions{color:#ddd;font-size:13px;padding:2px 0 0;position:relative;left:-9999em}.rtl .row-actions a{display:inline-block}.row-actions .network_active,.row-actions .network_only{color:#000}.comment-item:hover .row-actions,.mobile .row-actions,.no-js .row-actions,.row-actions.visible,tr:hover .row-actions{position:static}.row-actions-visible{padding:2px 0 0}#wpbody-content .inline-edit-row fieldset{font-size:12px;float:left;margin:0;padding:0;width:100%}#wpbody-content .inline-edit-row fieldset .inline-edit-col,tr.inline-edit-row td{padding:0 .5em}#wpbody-content .quick-edit-row-post .inline-edit-col-left{width:40%}#wpbody-content .quick-edit-row-post .inline-edit-col-right{width:39%}#wpbody-content .inline-edit-row-post .inline-edit-col-center{width:20%}#wpbody-content .quick-edit-row-page .inline-edit-col-left{width:50%}#wpbody-content .bulk-edit-row-post .inline-edit-col-right,#wpbody-content .quick-edit-row-page .inline-edit-col-right{width:49%}#wpbody-content .bulk-edit-row .inline-edit-col-left{width:30%}#wpbody-content .bulk-edit-row-page .inline-edit-col-right{width:69%}#wpbody-content .bulk-edit-row .inline-edit-col-bottom{float:right;width:69%}#wpbody-content .inline-edit-row-page .inline-edit-col-right{margin-top:27px}.inline-edit-row fieldset .inline-edit-group{clear:both;line-height:2.5}.inline-edit-row .submit{clear:both;padding:.5em;margin:.5em 0 0}.inline-edit-row .notice-error{margin-top:1em}.inline-edit-row .notice-error .error{margin:.5em 0;padding:2px}#the-list .inline-edit-row .inline-edit-legend{margin:0;padding:.2em .5em 0;line-height:2.5;font-weight:600}#the-list #bulk-edit.inline-edit-row .inline-edit-legend{padding:.2em .5em}.inline-edit-row fieldset span.checkbox-title,.inline-edit-row fieldset span.title{margin:0;padding:0}.inline-edit-row fieldset label,.inline-edit-row fieldset span.inline-edit-categories-label{display:block;margin:.2em 0;line-height:2.5}.inline-edit-row fieldset.inline-edit-date label{display:inline-block;margin:0;vertical-align:baseline;line-height:2}.inline-edit-row fieldset label.inline-edit-tags{margin-top:0}.inline-edit-row fieldset label.inline-edit-tags span.title{margin:.2em 0;width:auto}.inline-edit-row fieldset label span.title,.inline-edit-row fieldset.inline-edit-date legend{display:block;float:left;width:6em;line-height:2.5}#posts-filter fieldset.inline-edit-date legend{padding:0}.inline-edit-row fieldset .timestamp-wrap,.inline-edit-row fieldset label span.input-text-wrap{display:block;margin-left:6em}.quick-edit-row-post fieldset.inline-edit-col-right label span.title{width:auto;padding-right:.5em}.inline-edit-row .inline-edit-or{margin:.2em 6px .2em 0;line-height:2.5}.inline-edit-row .input-text-wrap input[type=text]{width:100%}.inline-edit-row fieldset label input[type=checkbox]{vertical-align:middle}.inline-edit-row fieldset label textarea{width:100%;height:4em;vertical-align:top}#wpbody-content .bulk-edit-row fieldset .inline-edit-group label{max-width:50%}#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child{margin-right:.5em}.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input{width:6em}.inline-edit-row .inline-edit-legend{text-transform:uppercase}.inline-edit-row fieldset .inline-edit-date{float:left}.inline-edit-row fieldset input[name=aa],.inline-edit-row fieldset input[name=hh],.inline-edit-row fieldset input[name=jj],.inline-edit-row fieldset input[name=mn]{vertical-align:middle;text-align:center;padding:0 4px}.inline-edit-row fieldset label input.inline-edit-password-input{width:8em}ul.cat-checklist{height:12em;border:solid 1px #ddd;overflow-y:scroll;padding:0 5px;margin:0;background-color:#fff}#bulk-titles{display:block;height:12em;border:1px solid #ddd;overflow-y:scroll;padding:0 5px;margin:0 0 5px}.inline-edit-row fieldset ul.cat-checklist input,.inline-edit-row fieldset ul.cat-checklist li{margin:0;position:relative}.inline-edit-row #bulk-titles div,.inline-edit-row fieldset ul.cat-checklist label{font-style:normal;font-size:11px}.inline-edit-row fieldset label input.inline-edit-menu-order-input{width:3em}.inline-edit-row fieldset label input.inline-edit-slug-input{width:75%}.inline-edit-row #post_parent,.inline-edit-row select[name=page_template]{max-width:80%}.ie8 .inline-edit-row #post_parent,.ie8 .inline-edit-row select[name=page_template]{width:250px}.quick-edit-row-post fieldset label.inline-edit-status{float:left}#bulk-titles{line-height:140%}#bulk-titles div{margin:.2em .3em}#bulk-titles div a{cursor:pointer;display:block;float:left;height:18px;margin:0 3px 0 -2px;overflow:hidden;position:relative;width:20px}#bulk-titles div a:before{position:relative;top:-3px}.plugins tbody,.plugins tbody th.check-column{padding:8px 0 0 2px}.plugins tbody th.check-column input[type=checkbox]{margin-top:4px}.updates-table .plugin-title p{margin-top:0}.plugins .inactive th.check-column,.plugins tfoot td.check-column,.plugins thead td.check-column{padding-left:6px}.plugins,.plugins td,.plugins th{color:#000}.plugins tr{background:#fff}.plugins p{margin:0 4px;padding:0}.plugins .desc p{margin:0 0 8px}.plugins td.desc{line-height:1.5}.plugins .desc ol,.plugins .desc ul{margin:0 0 0 2em}.plugins .desc ul{list-style-type:disc}.plugins .row-actions{font-size:13px;padding:0}.plugins .active td,.plugins .active th,.plugins .inactive td,.plugins .inactive th{padding:10px 9px}.plugins .active td,.plugins .active th{background-color:#f7fcfe}.plugins .update td,.plugins .update th{border-bottom:0}.plugin-install #the-list td,.plugins .active td,.plugins .active th,.plugins .inactive td,.plugins .inactive th,.upgrade .plugins td,.upgrade .plugins th{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugins tr.active+tr.inactive td,.plugins tr.active+tr.inactive th,.plugins tr.active.plugin-update-tr+tr.inactive td,.plugins tr.active.plugin-update-tr+tr.inactive th{border-top:1px solid rgba(0,0,0,.03);box-shadow:inset 0 1px 0 rgba(0,0,0,.02),inset 0 -1px 0 #e1e1e1}.plugins .update td,.plugins .update th,.plugins .updated td,.plugins .updated th,.plugins tr.active+tr.inactive.update td,.plugins tr.active+tr.inactive.update th,.plugins tr.active+tr.inactive.updated td,.plugins tr.active+tr.inactive.updated th,.upgrade .plugins tr:last-of-type td,.upgrade .plugins tr:last-of-type th{box-shadow:none}.plugin-update-tr.active td,.plugins .active th.check-column{border-left:4px solid #00a0d2}.wp-list-table.plugins .plugin-title,.wp-list-table.plugins .theme-title{padding-right:12px;white-space:nowrap}.plugins .plugin-title .dashicons,.plugins .plugin-title img{float:left;padding:0 10px 0 0;width:64px;height:64px}.plugins .plugin-title .dashicons:before{padding:2px;background-color:#eee;box-shadow:inset 0 0 10px rgba(160,165,170,.15);font-size:60px;color:#b4b9be}#update-themes-table .plugin-title .dashicons,#update-themes-table .plugin-title img{width:85px}.plugins .inactive .plugin-title strong{font-weight:400}.plugins .row-actions,.plugins .second{padding:0 0 5px}.plugins .update .row-actions,.plugins .update .second,.plugins .updated .row-actions,.plugins .updated .second{padding-bottom:0}.plugins-php .widefat tfoot td,.plugins-php .widefat tfoot th{border-top-style:solid;border-top-width:1px}.plugins .plugin-update-tr .plugin-update{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1);overflow:hidden;padding:0}.plugins .plugin-update-tr .notice,.plugins .plugin-update-tr div[class=update-message]{margin:5px 20px 15px 40px}.plugins .notice p{margin:.5em 0}.plugins .plugin-description a,.plugins .plugin-update a,.updates-table .plugin-title a{text-decoration:underline}.plugins tr.paused th.check-column{border-left:4px solid #d54e21}.plugins tr.paused td,.plugins tr.paused th{background-color:#fef7f1}.plugins .paused .dashicons-warning,.plugins tr.paused .plugin-title{color:#dc3232}.plugins .paused .error-display code,.plugins .paused .error-display p{font-size:90%;color:rgba(0,0,0,.7)}.plugins .resume-link{color:#dc3232}.plugin-card .update-now:before{color:#f56e28;content:"\f463";display:inline-block;font:normal 20px/1 dashicons;margin:3px 5px 0 -2px;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.plugin-card .updating-message:before{content:"\f463";animation:rotation 2s infinite linear}@keyframes rotation{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.plugin-card .updated-message:before{color:#79ba49;content:"\f147"}.plugin-install-php h2{clear:both}.plugin-install-php h3{margin:2.5em 0 8px}.plugin-install-php .wp-filter{margin-bottom:0}.plugin-group{overflow:hidden;margin-top:1.5em}.plugin-group h3{margin-top:0}.plugin-card{float:left;margin:0 8px 16px;width:48.5%;width:calc(50% - 8px);background-color:#fff;border:1px solid #ddd;box-sizing:border-box}.plugin-card:nth-child(odd){clear:both;margin-left:0}.plugin-card:nth-child(even){margin-right:0}@media screen and (min-width:1600px) and (max-width:2299px){.plugin-card{width:30%;width:calc(33.1% - 8px)}.plugin-card:nth-child(odd){clear:none;margin-left:8px}.plugin-card:nth-child(even){margin-right:8px}.plugin-card:nth-child(3n+1){clear:both;margin-left:0}.plugin-card:nth-child(3n){margin-right:0}}@media screen and (min-width:2300px){.plugin-card{width:25%;width:calc(25% - 12px)}.plugin-card:nth-child(odd){clear:none;margin-left:8px}.plugin-card:nth-child(even){margin-right:8px}.plugin-card:nth-child(4n+1){clear:both;margin-left:0}.plugin-card:nth-child(4n){margin-right:0}}.plugin-card-top{position:relative;padding:20px 20px 10px;min-height:135px}.plugin-action-buttons,div.action-links{margin:0}.plugin-card h3{margin:0 12px 12px 0;font-size:18px;line-height:1.3}.plugin-card .desc,.plugin-card .name{margin-left:148px;margin-right:120px}.plugin-card .action-links{position:absolute;top:20px;right:20px;width:120px}.plugin-action-buttons{clear:right;float:right;margin-left:2em;margin-bottom:1em;text-align:right}.plugin-action-buttons li{margin-bottom:10px}.plugin-card-bottom{clear:both;padding:12px 20px;background-color:#fafafa;border-top:1px solid #ddd;overflow:hidden}.plugin-card-bottom .star-rating{display:inline}.plugin-card-update-failed .update-now{font-weight:600}.plugin-card-update-failed .notice-error{margin:0;padding-left:16px;box-shadow:0 -1px 0 #ddd}.plugin-card-update-failed .plugin-card-bottom{display:none}.plugin-card .column-rating{line-height:1.76923076}.plugin-card .column-rating,.plugin-card .column-updated{margin-bottom:4px}.plugin-card .column-downloaded,.plugin-card .column-rating{float:left;clear:left;max-width:180px}.plugin-card .column-compatibility,.plugin-card .column-updated{text-align:right;float:right;clear:right;width:65%;width:calc(100% - 180px)}.plugin-card .column-compatibility span:before{font:normal 20px/.5 dashicons;speak:none;display:inline-block;padding:0;top:4px;left:-2px;position:relative;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;color:#444}.plugin-card .column-compatibility .compatibility-incompatible:before{content:"\f158";color:#c62d2d}.plugin-card .column-compatibility .compatibility-compatible:before{content:"\f147";color:#31843f}.plugin-card .notice{margin:20px 20px 0 20px}.plugin-icon{position:absolute;top:20px;left:20px;width:128px;height:128px;margin:0 20px 20px 0}.no-plugin-results{color:#666;font-size:18px;font-style:normal;margin:0;padding:100px 0 0;text-align:center}.wp-list-table .site-deleted,.wp-list-table tr.site-deleted{background:#ff8573}.wp-list-table .site-spammed,.wp-list-table tr.site-spammed{background:#faafaa}.wp-list-table .site-archived,.wp-list-table tr.site-archived{background:#ffebe8}.wp-list-table .site-mature,.wp-list-table tr.site-mature{background:#fecac2}.sites.fixed .column-lastupdated,.sites.fixed .column-registered{width:20%}.sites.fixed .column-users{width:80px}@media screen and (max-width:1100px) and (min-width:782px),(max-width:480px){.plugin-card .action-links{position:static;margin-left:148px;width:auto}.plugin-action-buttons{float:none;margin:1em 0 0;text-align:left}.plugin-action-buttons li{display:inline-block;vertical-align:middle}.plugin-action-buttons li .button{margin-right:20px}.plugin-card h3{margin-right:24px}.plugin-card .desc,.plugin-card .name{margin-right:0}.plugin-card .desc p:first-of-type{margin-top:0}.fixed .column-date{width:14%}}@media screen and (max-width:782px){.tablenav{height:auto}.tablenav.top{margin:20px 0 5px 0}.tablenav.bottom{position:relative;margin-top:15px}.tablenav br{display:none}.tablenav br.clear{display:block}.tablenav .view-switch,.tablenav.top .actions{display:none}.view-switch a{width:36px;height:36px;line-height:2.53846153}.tablenav.top .displaying-num{display:none}.tablenav.bottom .displaying-num{position:absolute;right:0;top:11px;margin:0;font-size:14px}.tablenav .tablenav-pages{width:100%;text-align:center;margin:0 0 25px}.tablenav.bottom .tablenav-pages{margin-top:25px}.tablenav.top .tablenav-pages.one-page{display:none}.tablenav.bottom .tablenav-pages.one-page{margin:15px 0 0 0;height:0}.tablenav-pages .pagination-links{font-size:16px}.tablenav .tablenav-pages .button,.tablenav .tablenav-pages .tablenav-pages-navspan{min-width:44px;padding:12px 8px;font-size:18px;line-height:1}.tablenav-pages .pagination-links .current-page{min-width:44px;padding:12px 6px;font-size:16px;line-height:1.125}.form-wrap>p{display:none}.wp-list-table th.column-primary~th,.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){display:none}.wp-list-table thead th.column-primary{width:100%}.wp-list-table tr th.check-column{display:table-cell}.wp-list-table .check-column{width:2.5em}.wp-list-table .column-primary .toggle-row{display:block}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column){position:relative;clear:both;width:auto!important}.wp-list-table td.column-primary{padding-right:50px}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){padding:3px 8px 3px 35%}.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before{position:absolute;left:10px;display:block;overflow:hidden;width:32%;content:attr(data-colname);white-space:nowrap;text-overflow:ellipsis}.wp-list-table .is-expanded td:not(.hidden){display:block!important;overflow:hidden}.column-posts,.widefat .num{text-align:left}#comments-form .fixed .column-author,#commentsdiv .fixed .column-author{display:none!important}.fixed .column-comment .comment-author{display:block}.fixed .column-author.hidden~.column-comment .comment-author{display:none}#the-comment-list .is-expanded td{box-shadow:none}#the-comment-list .is-expanded td:last-child{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.post-com-count .screen-reader-text{position:static;-webkit-clip-path:none;clip-path:none;width:auto;height:auto;margin:0}.column-comments .post-com-count-approved:after,.column-comments .post-com-count-no-comments:after,.column-response .post-com-count-approved:after,.column-response .post-com-count-no-comments:after{content:none}.column-comments .post-com-count [aria-hidden=true],.column-response .post-com-count [aria-hidden=true]{display:none}.column-comments .post-com-count-wrapper,.column-response .post-com-count-wrapper{white-space:normal}.column-comments .post-com-count-wrapper>a,.column-response .post-com-count-wrapper>a{display:block}.column-comments .post-com-count-approved,.column-comments .post-com-count-no-comments,.column-response .post-com-count-approved,.column-response .post-com-count-no-comments{margin-top:0;margin-right:.5em}.column-comments .post-com-count-pending,.column-response .post-com-count-pending{position:static;height:auto;min-width:0;padding:0;border:none;border-radius:0;background:0 0;color:#bb2a2a;font-size:inherit;line-height:inherit;text-align:left}.column-comments .post-com-count-pending:hover,.column-response .post-com-count-pending:hover{color:#dc3232}.widefat tfoot td.check-column,.widefat thead td.check-column{padding-top:10px}body:not(.plugins-php) .row-actions{display:-ms-grid;display:grid;-ms-grid-columns:auto auto auto;grid-template-columns:auto auto auto;color:transparent}.row-actions span{padding:4px 0}.row-actions span .button-link,.row-actions span a{display:inline-block;padding:4px 0;line-height:1.5}.row-actions span.approve:before,.row-actions span.unapprove:before{content:"| "}#wpbody-content .bulk-edit-row .inline-edit-col-bottom,#wpbody-content .bulk-edit-row .inline-edit-col-left,#wpbody-content .bulk-edit-row-page .inline-edit-col-right,#wpbody-content .bulk-edit-row-post .inline-edit-col-right,#wpbody-content .inline-edit-row-post .inline-edit-col-center,#wpbody-content .quick-edit-row-page .inline-edit-col-left,#wpbody-content .quick-edit-row-page .inline-edit-col-right,#wpbody-content .quick-edit-row-post .inline-edit-col-left,#wpbody-content .quick-edit-row-post .inline-edit-col-right{float:none;width:100%}#wpbody-content .bulk-edit-row fieldset .inline-edit-col label,#wpbody-content .bulk-edit-row fieldset .inline-edit-group label,#wpbody-content .quick-edit-row fieldset .inline-edit-col label,#wpbody-content .quick-edit-row fieldset .inline-edit-group label{max-width:none;float:none;margin-bottom:5px}#wpbody .bulk-edit-row fieldset select{display:block;width:100%;max-width:none;box-sizing:border-box}.inline-edit-row fieldset input[name=aa],.inline-edit-row fieldset input[name=hh],.inline-edit-row fieldset input[name=jj],.inline-edit-row fieldset input[name=mn]{font-size:16px;line-height:2;padding:3px 4px}.inline-edit-row #bulk-titles div,.inline-edit-row fieldset ul.cat-checklist label{font-size:16px}.inline-edit-row fieldset label span.title,.inline-edit-row fieldset.inline-edit-date legend{float:none}.inline-edit-row fieldset label.inline-edit-tags{padding:0 .5em}.inline-edit-row fieldset .inline-edit-col label.inline-edit-tags{padding:0}.inline-edit-row fieldset .timestamp-wrap,.inline-edit-row fieldset label span.input-text-wrap{margin-left:0}.inline-edit-row .inline-edit-or{margin:0 6px 0 0}#commentsdiv #edithead .inside,#edithead .inside{float:none;text-align:left;padding:3px 5px}#commentsdiv #edithead .inside input,#edithead .inside input{width:100%}#edithead label{display:block}#bulk-titles div{margin:.8em .3em}#bulk-titles div a{height:22px}#wpbody-content .updates-table .plugin-title{width:auto;white-space:normal}.link-manager-php #posts-filter{margin-top:25px}.link-manager-php .tablenav.bottom{overflow:hidden}.comments-box .toggle-row,.wp-list-table.plugins .toggle-row{display:none}#wpbody-content .wp-list-table.plugins td{display:block;width:auto;padding:10px 9px}#wpbody-content .wp-list-table.plugins .desc.hidden{display:none}#wpbody-content .wp-list-table.plugins .column-description{padding-top:2px}#wpbody-content .wp-list-table.plugins .plugin-title,#wpbody-content .wp-list-table.plugins .theme-title{padding-right:12px;white-space:normal}.wp-list-table.plugins .plugin-title,.wp-list-table.plugins .theme-title{padding-top:13px;padding-bottom:4px}.plugins #the-list .update td,.plugins #the-list .update th,.plugins #the-list tr>td:not(:last-child),.wp-list-table.plugins #the-list .theme-title{box-shadow:none;border-top:none}.plugins #the-list tr td{border-top:none}.plugins tbody{padding:1px 0 0}.plugins .plugin-update-tr:before,.plugins tr.active+tr.inactive td.column-description,.plugins tr.active+tr.inactive th.check-column{box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugins tr.active+tr.inactive td,.plugins tr.active+tr.inactive th.check-column{border-top:none}.plugins .plugin-update-tr:before{content:"";display:table-cell}.plugins .active.update+.plugin-update-tr:before{border-left:4px solid #d54e21;background-color:#fef7f1}.plugins #the-list .plugin-update-tr .plugin-update{border-left:none}.plugin-update-tr .update-message{margin-left:0}.plugins .active.update+.plugin-update-tr:before{background-color:#f7fcfe;border-left:4px solid #00a0d2}.plugins .plugin-update-tr .update-message{margin-left:0}.wp-list-table.plugins .plugin-title strong,.wp-list-table.plugins .theme-title strong{font-size:1.4em;line-height:1.5}table.plugin-install .column-description,table.plugin-install .column-name,table.plugin-install .column-rating,table.plugin-install .column-version{display:block;width:auto}table.plugin-install th.column-description,table.plugin-install th.column-name,table.plugin-install th.column-rating,table.plugin-install th.column-version{display:none}table.plugin-install td.column-name strong{font-size:1.4em;line-height:1.6em}table.plugin-install #the-list td{box-shadow:none}table.plugin-install #the-list tr{display:block;box-shadow:inset 0 -1px 0 rgba(0,0,0,.1)}.plugin-card{margin-left:0;margin-right:0;width:100%}}@media screen and (max-width:480px){.tablenav-pages .current-page{margin:0}.row-actions:not(.plugins-php){-ms-grid-columns:auto auto;grid-template-columns:auto auto}.tablenav-pages .tablenav-paging-text{float:left;width:100%;padding-top:.5em}} \ No newline at end of file diff --git a/wp-admin/css/login-rtl.css b/wp-admin/css/login-rtl.css new file mode 100644 index 0000000..654e2fa --- /dev/null +++ b/wp-admin/css/login-rtl.css @@ -0,0 +1,406 @@ +/*! This file is auto-generated */ +html, +body { + height: 100%; + margin: 0; + padding: 0; +} + +body { + background: #f1f1f1; + min-width: 0; + color: #444; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + line-height: 1.4; +} + +a { + color: #0073aa; + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; +} + +a { + outline: 0; +} + +a:hover, +a:active { + color: #00a0d2; +} + +a:focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +p { + line-height: 1.5; +} + +.login .message, +.login .success, +.login #login_error { + border-right: 4px solid #00a0d2; + padding: 12px; + margin-right: 0; + margin-bottom: 20px; + background-color: #fff; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); +} + +.login .success { + border-right-color: #46b450; +} + +.login #login_error { + border-right-color: #dc3232; +} + +#loginform p.submit, +.login-action-lostpassword p.submit { + border: none; + margin: -10px 0 20px; /* May want to revisit this */ +} + +.login * { + margin: 0; + padding: 0; +} + +.login .input::-ms-clear { + display: none; +} + +.login .pw-weak { + margin-bottom: 15px; +} + +.login .button.wp-hide-pw { + background: transparent; + border: 1px solid transparent; + box-shadow: none; + font-size: 14px; + line-height: 2; + width: 2.5rem; + height: 2.5rem; + min-width: 40px; + min-height: 40px; + margin: 0; + padding: 5px 9px; + position: absolute; + left: 0; + top: 0; +} + +.login .button.wp-hide-pw:hover { + background: transparent; +} + +.login .button.wp-hide-pw:focus { + background: transparent; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.login .button.wp-hide-pw:active { + background: transparent; + box-shadow: none; + transform: none; +} + +.login .button.wp-hide-pw .dashicons { + width: 1.25rem; + height: 1.25rem; + top: 0.25rem; +} + +.login .wp-pwd { + position: relative; +} + +.no-js .hide-if-no-js { + display: none; +} + +.login form { + margin-top: 20px; + margin-right: 0; + padding: 26px 24px 46px; + font-weight: 400; + overflow: hidden; + background: #fff; + border: 1px solid #ccd0d4; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); +} + +.login form.shake { + animation: shake 0.2s cubic-bezier(.19,.49,.38,.79) both; + animation-iteration-count: 3; + transform: translateX(0); +} + +@keyframes shake { + 25% { + transform: translateX(20px); + } + 75% { + transform: translateX(-20px); + } + 100% { + transform: translateX(0); + } +} + +.login-action-confirm_admin_email #login { + width: 60vw; + margin-top: -2vh; +} + +@media screen and (max-width: 782px) { + .login-action-confirm_admin_email #login { + width: 100vw; + } +} + +.login form .forgetmenot { + font-weight: 400; + float: right; + margin-bottom: 0; +} + +.login .button-primary { + float: left; +} + +.login .admin-email-confirm-form .submit { + text-align: center; +} + +.admin-email__later { + text-align: right; +} + +.login form p.admin-email__details { + margin: 1.1em 0; +} + +.login h1.admin-email__heading { + border-bottom: 1px rgb(241, 241, 241) solid; + color: rgb(95, 95, 95); + font-weight: normal; + padding-bottom: 0.5em; + text-align: right; +} + +.admin-email__actions div { + padding-top: 1.5em; +} + +.login .admin-email__actions .button-primary { + float: none; + margin-right: 0.25em; + margin-left: 0.25em; +} + +#login form p { + margin-bottom: 0; +} + +#login form p.submit { + margin: 0; + padding: 0; +} + +.login label { + font-size: 14px; + line-height: 1.5; + display: inline-block; + margin-bottom: 3px; +} + +.login .forgetmenot label, +.login .pw-weak label { + line-height: 1.5; + vertical-align: baseline; +} + +.login h1 { + text-align: center; +} + +.login h1 a { + background-image: url(../images/w-logo-blue.png?ver=20131202); + background-image: none, url(../images/wordpress-logo.svg?ver=20131107); + background-size: 84px; + background-position: center top; + background-repeat: no-repeat; + color: #444; + height: 84px; + font-size: 20px; + font-weight: 400; + line-height: 1.3; + margin: 0 auto 25px; + padding: 0; + text-decoration: none; + width: 84px; + text-indent: -9999px; + outline: none; + overflow: hidden; + display: block; +} + +#login { + width: 320px; + padding: 8% 0 0; + margin: auto; +} + +.login #nav, +.login #backtoblog { + font-size: 13px; + padding: 0 24px 0; +} + +.login #nav { + margin: 24px 0 0 0; +} + +#backtoblog { + margin: 16px 0; +} + +.login #nav a, +.login #backtoblog a { + text-decoration: none; + color: #555d66; +} + +.login #nav a:hover, +.login #backtoblog a:hover, +.login h1 a:hover { + color: #00a0d2; +} + +.login #nav a:focus, +.login #backtoblog a:focus, +.login h1 a:focus { + color: #124964; +} + +.login .privacy-policy-page-link { + text-align: center; + width: 100%; + margin: 5em 0 2em; +} + +.login form .input, +.login input[type="text"], +.login input[type="password"] { + font-size: 24px; + line-height: 1.33333333; /* 32px */ + width: 100%; + border-width: 0.0625rem; + padding: 0.1875rem 0.3125rem; /* 3px 5px */ + margin: 0 0 16px 6px; + min-height: 40px; + max-height: none; +} + +.js.login input.password-input, +.js.login-action-rp form .input, +.js.login-action-rp input[type="text"] { + padding-left: 2.5rem; +} + +.login form .input, +.login input[type="text"], +.login form input[type="checkbox"] { + background: #fbfbfb; +} + +.js.login-action-rp input[type="text"], +.js.login-action-rp input[type="password"] { + margin-bottom: 0; +} + +.login #pass-strength-result { + font-weight: 600; + margin: -1px 0 16px 5px; + padding: 6px 5px; + text-align: center; + width: 100%; +} + +body.interim-login { + height: auto; +} + +.interim-login #login { + padding: 0; + margin: 5px auto 20px; +} + +.interim-login.login h1 a { + width: auto; +} + +.interim-login #login_error, +.interim-login.login .message { + margin: 0 0 16px; +} + +.interim-login.login form { + margin: 0; +} + +/* Hide visually but not from screen readers */ +.screen-reader-text, +.screen-reader-text span { + 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; + width: 1px; + word-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */ +} + +/* Hide the Edge "reveal password" native button */ +input::-ms-reveal { + display: none; +} + +@-ms-viewport { + width: device-width; +} + +@media screen and (max-height: 550px) { + #login { + padding: 20px 0; + } +} + + +@media screen and (max-width: 782px) { + .interim-login input[type=checkbox] { + width: 1rem; + height: 1rem; + } + + .interim-login input[type=checkbox]:checked:before { + width: 1.3125rem; + height: 1.3125rem; + margin: -0.1875rem -0.25rem 0 0; + } +} diff --git a/wp-admin/css/login-rtl.min.css b/wp-admin/css/login-rtl.min.css new file mode 100644 index 0000000..673175b --- /dev/null +++ b/wp-admin/css/login-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body,html{height:100%;margin:0;padding:0}body{background:#f1f1f1;min-width:0;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.4}a{color:#0073aa;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}a{outline:0}a:active,a:hover{color:#00a0d2}a:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}p{line-height:1.5}.login #login_error,.login .message,.login .success{border-right:4px solid #00a0d2;padding:12px;margin-right:0;margin-bottom:20px;background-color:#fff;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.login .success{border-right-color:#46b450}.login #login_error{border-right-color:#dc3232}#loginform p.submit,.login-action-lostpassword p.submit{border:none;margin:-10px 0 20px}.login *{margin:0;padding:0}.login .input::-ms-clear{display:none}.login .pw-weak{margin-bottom:15px}.login .button.wp-hide-pw{background:0 0;border:1px solid transparent;box-shadow:none;font-size:14px;line-height:2;width:2.5rem;height:2.5rem;min-width:40px;min-height:40px;margin:0;padding:5px 9px;position:absolute;left:0;top:0}.login .button.wp-hide-pw:hover{background:0 0}.login .button.wp-hide-pw:focus{background:0 0;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.login .button.wp-hide-pw:active{background:0 0;box-shadow:none;transform:none}.login .button.wp-hide-pw .dashicons{width:1.25rem;height:1.25rem;top:.25rem}.login .wp-pwd{position:relative}.no-js .hide-if-no-js{display:none}.login form{margin-top:20px;margin-right:0;padding:26px 24px 46px;font-weight:400;overflow:hidden;background:#fff;border:1px solid #ccd0d4;box-shadow:0 1px 3px rgba(0,0,0,.04)}.login form.shake{animation:shake .2s cubic-bezier(.19,.49,.38,.79) both;animation-iteration-count:3;transform:translateX(0)}@keyframes shake{25%{transform:translateX(20px)}75%{transform:translateX(-20px)}100%{transform:translateX(0)}}.login-action-confirm_admin_email #login{width:60vw;margin-top:-2vh}@media screen and (max-width:782px){.login-action-confirm_admin_email #login{width:100vw}}.login form .forgetmenot{font-weight:400;float:right;margin-bottom:0}.login .button-primary{float:left}.login .admin-email-confirm-form .submit{text-align:center}.admin-email__later{text-align:right}.login form p.admin-email__details{margin:1.1em 0}.login h1.admin-email__heading{border-bottom:1px #f1f1f1 solid;color:#5f5f5f;font-weight:400;padding-bottom:.5em;text-align:right}.admin-email__actions div{padding-top:1.5em}.login .admin-email__actions .button-primary{float:none;margin-right:.25em;margin-left:.25em}#login form p{margin-bottom:0}#login form p.submit{margin:0;padding:0}.login label{font-size:14px;line-height:1.5;display:inline-block;margin-bottom:3px}.login .forgetmenot label,.login .pw-weak label{line-height:1.5;vertical-align:baseline}.login h1{text-align:center}.login h1 a{background-image:url(../images/w-logo-blue.png?ver=20131202);background-image:none,url(../images/wordpress-logo.svg?ver=20131107);background-size:84px;background-position:center top;background-repeat:no-repeat;color:#444;height:84px;font-size:20px;font-weight:400;line-height:1.3;margin:0 auto 25px;padding:0;text-decoration:none;width:84px;text-indent:-9999px;outline:0;overflow:hidden;display:block}#login{width:320px;padding:8% 0 0;margin:auto}.login #backtoblog,.login #nav{font-size:13px;padding:0 24px 0}.login #nav{margin:24px 0 0 0}#backtoblog{margin:16px 0}.login #backtoblog a,.login #nav a{text-decoration:none;color:#555d66}.login #backtoblog a:hover,.login #nav a:hover,.login h1 a:hover{color:#00a0d2}.login #backtoblog a:focus,.login #nav a:focus,.login h1 a:focus{color:#124964}.login .privacy-policy-page-link{text-align:center;width:100%;margin:5em 0 2em}.login form .input,.login input[type=password],.login input[type=text]{font-size:24px;line-height:1.33333333;width:100%;border-width:.0625rem;padding:.1875rem .3125rem;margin:0 0 16px 6px;min-height:40px;max-height:none}.js.login input.password-input,.js.login-action-rp form .input,.js.login-action-rp input[type=text]{padding-left:2.5rem}.login form .input,.login form input[type=checkbox],.login input[type=text]{background:#fbfbfb}.js.login-action-rp input[type=password],.js.login-action-rp input[type=text]{margin-bottom:0}.login #pass-strength-result{font-weight:600;margin:-1px 0 16px 5px;padding:6px 5px;text-align:center;width:100%}body.interim-login{height:auto}.interim-login #login{padding:0;margin:5px auto 20px}.interim-login.login h1 a{width:auto}.interim-login #login_error,.interim-login.login .message{margin:0 0 16px}.interim-login.login form{margin:0}.screen-reader-text,.screen-reader-text span{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;width:1px;word-wrap:normal!important}input::-ms-reveal{display:none}@-ms-viewport{width:device-width}@media screen and (max-height:550px){#login{padding:20px 0}}@media screen and (max-width:782px){.interim-login input[type=checkbox]{width:1rem;height:1rem}.interim-login input[type=checkbox]:checked:before{width:1.3125rem;height:1.3125rem;margin:-.1875rem -.25rem 0 0}} \ No newline at end of file diff --git a/wp-admin/css/login.css b/wp-admin/css/login.css new file mode 100644 index 0000000..f0261a6 --- /dev/null +++ b/wp-admin/css/login.css @@ -0,0 +1,405 @@ +html, +body { + height: 100%; + margin: 0; + padding: 0; +} + +body { + background: #f1f1f1; + min-width: 0; + color: #444; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + line-height: 1.4; +} + +a { + color: #0073aa; + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; +} + +a { + outline: 0; +} + +a:hover, +a:active { + color: #00a0d2; +} + +a:focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +p { + line-height: 1.5; +} + +.login .message, +.login .success, +.login #login_error { + border-left: 4px solid #00a0d2; + padding: 12px; + margin-left: 0; + margin-bottom: 20px; + background-color: #fff; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); +} + +.login .success { + border-left-color: #46b450; +} + +.login #login_error { + border-left-color: #dc3232; +} + +#loginform p.submit, +.login-action-lostpassword p.submit { + border: none; + margin: -10px 0 20px; /* May want to revisit this */ +} + +.login * { + margin: 0; + padding: 0; +} + +.login .input::-ms-clear { + display: none; +} + +.login .pw-weak { + margin-bottom: 15px; +} + +.login .button.wp-hide-pw { + background: transparent; + border: 1px solid transparent; + box-shadow: none; + font-size: 14px; + line-height: 2; + width: 2.5rem; + height: 2.5rem; + min-width: 40px; + min-height: 40px; + margin: 0; + padding: 5px 9px; + position: absolute; + right: 0; + top: 0; +} + +.login .button.wp-hide-pw:hover { + background: transparent; +} + +.login .button.wp-hide-pw:focus { + background: transparent; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.login .button.wp-hide-pw:active { + background: transparent; + box-shadow: none; + transform: none; +} + +.login .button.wp-hide-pw .dashicons { + width: 1.25rem; + height: 1.25rem; + top: 0.25rem; +} + +.login .wp-pwd { + position: relative; +} + +.no-js .hide-if-no-js { + display: none; +} + +.login form { + margin-top: 20px; + margin-left: 0; + padding: 26px 24px 46px; + font-weight: 400; + overflow: hidden; + background: #fff; + border: 1px solid #ccd0d4; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); +} + +.login form.shake { + animation: shake 0.2s cubic-bezier(.19,.49,.38,.79) both; + animation-iteration-count: 3; + transform: translateX(0); +} + +@keyframes shake { + 25% { + transform: translateX(-20px); + } + 75% { + transform: translateX(20px); + } + 100% { + transform: translateX(0); + } +} + +.login-action-confirm_admin_email #login { + width: 60vw; + margin-top: -2vh; +} + +@media screen and (max-width: 782px) { + .login-action-confirm_admin_email #login { + width: 100vw; + } +} + +.login form .forgetmenot { + font-weight: 400; + float: left; + margin-bottom: 0; +} + +.login .button-primary { + float: right; +} + +.login .admin-email-confirm-form .submit { + text-align: center; +} + +.admin-email__later { + text-align: left; +} + +.login form p.admin-email__details { + margin: 1.1em 0; +} + +.login h1.admin-email__heading { + border-bottom: 1px rgb(241, 241, 241) solid; + color: rgb(95, 95, 95); + font-weight: normal; + padding-bottom: 0.5em; + text-align: left; +} + +.admin-email__actions div { + padding-top: 1.5em; +} + +.login .admin-email__actions .button-primary { + float: none; + margin-left: 0.25em; + margin-right: 0.25em; +} + +#login form p { + margin-bottom: 0; +} + +#login form p.submit { + margin: 0; + padding: 0; +} + +.login label { + font-size: 14px; + line-height: 1.5; + display: inline-block; + margin-bottom: 3px; +} + +.login .forgetmenot label, +.login .pw-weak label { + line-height: 1.5; + vertical-align: baseline; +} + +.login h1 { + text-align: center; +} + +.login h1 a { + background-image: url(../images/w-logo-blue.png?ver=20131202); + background-image: none, url(../images/wordpress-logo.svg?ver=20131107); + background-size: 84px; + background-position: center top; + background-repeat: no-repeat; + color: #444; + height: 84px; + font-size: 20px; + font-weight: 400; + line-height: 1.3; + margin: 0 auto 25px; + padding: 0; + text-decoration: none; + width: 84px; + text-indent: -9999px; + outline: none; + overflow: hidden; + display: block; +} + +#login { + width: 320px; + padding: 8% 0 0; + margin: auto; +} + +.login #nav, +.login #backtoblog { + font-size: 13px; + padding: 0 24px 0; +} + +.login #nav { + margin: 24px 0 0 0; +} + +#backtoblog { + margin: 16px 0; +} + +.login #nav a, +.login #backtoblog a { + text-decoration: none; + color: #555d66; +} + +.login #nav a:hover, +.login #backtoblog a:hover, +.login h1 a:hover { + color: #00a0d2; +} + +.login #nav a:focus, +.login #backtoblog a:focus, +.login h1 a:focus { + color: #124964; +} + +.login .privacy-policy-page-link { + text-align: center; + width: 100%; + margin: 5em 0 2em; +} + +.login form .input, +.login input[type="text"], +.login input[type="password"] { + font-size: 24px; + line-height: 1.33333333; /* 32px */ + width: 100%; + border-width: 0.0625rem; + padding: 0.1875rem 0.3125rem; /* 3px 5px */ + margin: 0 6px 16px 0; + min-height: 40px; + max-height: none; +} + +.js.login input.password-input, +.js.login-action-rp form .input, +.js.login-action-rp input[type="text"] { + padding-right: 2.5rem; +} + +.login form .input, +.login input[type="text"], +.login form input[type="checkbox"] { + background: #fbfbfb; +} + +.js.login-action-rp input[type="text"], +.js.login-action-rp input[type="password"] { + margin-bottom: 0; +} + +.login #pass-strength-result { + font-weight: 600; + margin: -1px 5px 16px 0; + padding: 6px 5px; + text-align: center; + width: 100%; +} + +body.interim-login { + height: auto; +} + +.interim-login #login { + padding: 0; + margin: 5px auto 20px; +} + +.interim-login.login h1 a { + width: auto; +} + +.interim-login #login_error, +.interim-login.login .message { + margin: 0 0 16px; +} + +.interim-login.login form { + margin: 0; +} + +/* Hide visually but not from screen readers */ +.screen-reader-text, +.screen-reader-text span { + 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; + width: 1px; + word-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */ +} + +/* Hide the Edge "reveal password" native button */ +input::-ms-reveal { + display: none; +} + +@-ms-viewport { + width: device-width; +} + +@media screen and (max-height: 550px) { + #login { + padding: 20px 0; + } +} + + +@media screen and (max-width: 782px) { + .interim-login input[type=checkbox] { + width: 1rem; + height: 1rem; + } + + .interim-login input[type=checkbox]:checked:before { + width: 1.3125rem; + height: 1.3125rem; + margin: -0.1875rem 0 0 -0.25rem; + } +} diff --git a/wp-admin/css/login.min.css b/wp-admin/css/login.min.css new file mode 100644 index 0000000..f23b45c --- /dev/null +++ b/wp-admin/css/login.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body,html{height:100%;margin:0;padding:0}body{background:#f1f1f1;min-width:0;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px;line-height:1.4}a{color:#0073aa;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}a{outline:0}a:active,a:hover{color:#00a0d2}a:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}p{line-height:1.5}.login #login_error,.login .message,.login .success{border-left:4px solid #00a0d2;padding:12px;margin-left:0;margin-bottom:20px;background-color:#fff;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.login .success{border-left-color:#46b450}.login #login_error{border-left-color:#dc3232}#loginform p.submit,.login-action-lostpassword p.submit{border:none;margin:-10px 0 20px}.login *{margin:0;padding:0}.login .input::-ms-clear{display:none}.login .pw-weak{margin-bottom:15px}.login .button.wp-hide-pw{background:0 0;border:1px solid transparent;box-shadow:none;font-size:14px;line-height:2;width:2.5rem;height:2.5rem;min-width:40px;min-height:40px;margin:0;padding:5px 9px;position:absolute;right:0;top:0}.login .button.wp-hide-pw:hover{background:0 0}.login .button.wp-hide-pw:focus{background:0 0;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.login .button.wp-hide-pw:active{background:0 0;box-shadow:none;transform:none}.login .button.wp-hide-pw .dashicons{width:1.25rem;height:1.25rem;top:.25rem}.login .wp-pwd{position:relative}.no-js .hide-if-no-js{display:none}.login form{margin-top:20px;margin-left:0;padding:26px 24px 46px;font-weight:400;overflow:hidden;background:#fff;border:1px solid #ccd0d4;box-shadow:0 1px 3px rgba(0,0,0,.04)}.login form.shake{animation:shake .2s cubic-bezier(.19,.49,.38,.79) both;animation-iteration-count:3;transform:translateX(0)}@keyframes shake{25%{transform:translateX(-20px)}75%{transform:translateX(20px)}100%{transform:translateX(0)}}.login-action-confirm_admin_email #login{width:60vw;margin-top:-2vh}@media screen and (max-width:782px){.login-action-confirm_admin_email #login{width:100vw}}.login form .forgetmenot{font-weight:400;float:left;margin-bottom:0}.login .button-primary{float:right}.login .admin-email-confirm-form .submit{text-align:center}.admin-email__later{text-align:left}.login form p.admin-email__details{margin:1.1em 0}.login h1.admin-email__heading{border-bottom:1px #f1f1f1 solid;color:#5f5f5f;font-weight:400;padding-bottom:.5em;text-align:left}.admin-email__actions div{padding-top:1.5em}.login .admin-email__actions .button-primary{float:none;margin-left:.25em;margin-right:.25em}#login form p{margin-bottom:0}#login form p.submit{margin:0;padding:0}.login label{font-size:14px;line-height:1.5;display:inline-block;margin-bottom:3px}.login .forgetmenot label,.login .pw-weak label{line-height:1.5;vertical-align:baseline}.login h1{text-align:center}.login h1 a{background-image:url(../images/w-logo-blue.png?ver=20131202);background-image:none,url(../images/wordpress-logo.svg?ver=20131107);background-size:84px;background-position:center top;background-repeat:no-repeat;color:#444;height:84px;font-size:20px;font-weight:400;line-height:1.3;margin:0 auto 25px;padding:0;text-decoration:none;width:84px;text-indent:-9999px;outline:0;overflow:hidden;display:block}#login{width:320px;padding:8% 0 0;margin:auto}.login #backtoblog,.login #nav{font-size:13px;padding:0 24px 0}.login #nav{margin:24px 0 0 0}#backtoblog{margin:16px 0}.login #backtoblog a,.login #nav a{text-decoration:none;color:#555d66}.login #backtoblog a:hover,.login #nav a:hover,.login h1 a:hover{color:#00a0d2}.login #backtoblog a:focus,.login #nav a:focus,.login h1 a:focus{color:#124964}.login .privacy-policy-page-link{text-align:center;width:100%;margin:5em 0 2em}.login form .input,.login input[type=password],.login input[type=text]{font-size:24px;line-height:1.33333333;width:100%;border-width:.0625rem;padding:.1875rem .3125rem;margin:0 6px 16px 0;min-height:40px;max-height:none}.js.login input.password-input,.js.login-action-rp form .input,.js.login-action-rp input[type=text]{padding-right:2.5rem}.login form .input,.login form input[type=checkbox],.login input[type=text]{background:#fbfbfb}.js.login-action-rp input[type=password],.js.login-action-rp input[type=text]{margin-bottom:0}.login #pass-strength-result{font-weight:600;margin:-1px 5px 16px 0;padding:6px 5px;text-align:center;width:100%}body.interim-login{height:auto}.interim-login #login{padding:0;margin:5px auto 20px}.interim-login.login h1 a{width:auto}.interim-login #login_error,.interim-login.login .message{margin:0 0 16px}.interim-login.login form{margin:0}.screen-reader-text,.screen-reader-text span{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;width:1px;word-wrap:normal!important}input::-ms-reveal{display:none}@-ms-viewport{width:device-width}@media screen and (max-height:550px){#login{padding:20px 0}}@media screen and (max-width:782px){.interim-login input[type=checkbox]{width:1rem;height:1rem}.interim-login input[type=checkbox]:checked:before{width:1.3125rem;height:1.3125rem;margin:-.1875rem 0 0 -.25rem}} \ No newline at end of file diff --git a/wp-admin/css/media-rtl.css b/wp-admin/css/media-rtl.css new file mode 100644 index 0000000..a60a294 --- /dev/null +++ b/wp-admin/css/media-rtl.css @@ -0,0 +1,1290 @@ +/*! This file is auto-generated */ +/*------------------------------------------------------------------------------ + 14.0 - Media Screen +------------------------------------------------------------------------------*/ + +.media-item .describe { + border-collapse: collapse; + width: 100%; + border-top: 1px solid #ddd; + clear: both; + cursor: default; +} + +.media-item.media-blank .describe { + border: 0; +} + +.media-item .describe th { + vertical-align: top; + text-align: right; + padding: 5px 10px 10px; + width: 140px; +} + +.media-item .describe .align th { + padding-top: 0; +} + +.media-item .media-item-info tr { + background-color: transparent; +} + +.media-item .describe td { + padding: 0 0 8px 8px; + vertical-align: top; +} + +.media-item thead.media-item-info td { + padding: 4px 10px 0; +} + +.media-item .media-item-info .A1B1 { + padding: 0 10px 0 0; +} + +.media-item td.savesend { + padding-bottom: 15px; +} + +.media-item .thumbnail { + max-height: 128px; + max-width: 128px; +} + +#wpbody-content #async-upload-wrap a { + display: none; +} + +.media-upload-form { + margin-top: 20px; +} + +.media-upload-form td label { + margin-left: 6px; + margin-right: 2px; +} + +.media-upload-form .align .field label { + display: inline; + padding: 0 23px 0 0; + margin: 0 3px 0 1em; + font-weight: 600; +} + +.media-upload-form tr.image-size label { + margin: 0 5px 0 0; + font-weight: 600; +} + +.media-upload-form th.label label { + font-weight: 600; + margin: 0.5em; + font-size: 13px; +} + +.media-upload-form th.label label span { + padding: 0 5px; +} + +.media-item .describe input[type="text"], +.media-item .describe textarea { + width: 460px; +} + +.media-item .describe p.help { + margin: 0; + padding: 0 5px 0 0; +} + +.media-item .edit-attachment, +.describe-toggle-on, +.describe-toggle-off { + display: block; + line-height: 2.76923076; + float: left; + margin-left: 10px; +} + +.media-item .describe-toggle-off, +.media-item.open .describe-toggle-on { + display: none; +} + +.media-item.open .describe-toggle-off { + display: block; +} + +.media-upload-form .media-item { + min-height: 36px; + margin-bottom: 1px; + position: relative; + width: 100%; + background: #fff; +} + +.media-upload-form .media-item, +.media-upload-form .media-item .error { + box-shadow: 0 1px 0 #ddd; +} + +#media-items:empty { + border: 0 none; +} + +.media-item .filename { + line-height: 2.76923076; + overflow: hidden; + margin-right: 6px; +} + +.media-item .pinkynail { + float: right; + margin: 2px 3px 0 10px; + max-width: 40px; + max-height: 32px; +} + +.media-item .startopen, +.media-item .startclosed { + display: none; +} + +.media-item .original { + position: relative; + height: 34px; +} + +.media-item .progress { + float: left; + height: 22px; + margin: 7px 6px; + width: 200px; + line-height: 2em; + padding: 0; + overflow: hidden; + border-radius: 22px; + background: #ddd; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.media-item .bar { + z-index: 9; + width: 0; + height: 100%; + margin-top: -22px; + border-radius: 22px; + background-color: #0073aa; + box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.3); +} + +.media-item .progress .percent { + z-index: 10; + position: relative; + width: 200px; + padding: 0; + color: #fff; + text-align: center; + line-height: 22px; + font-weight: 400; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} + +.upload-php .fixed .column-parent { + width: 15%; +} + +.js .html-uploader #plupload-upload-ui { + display: none; +} + +.js .html-uploader #html-upload-ui { + display: block; +} + +.media-upload-form .media-item.error, +.media-upload-form .media-item .error { + width: auto; + margin: 0 0 1px 0; +} + +.media-upload-form .media-item .error { + padding: 10px 14px 10px 0; +} + +.media-item .error-div button.dismiss { + float: left; + margin: 0 15px 0 10px; +} + +/*------------------------------------------------------------------------------ + 14.1 - Media Library +------------------------------------------------------------------------------*/ + +.find-box { + background-color: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + width: 600px; + overflow: hidden; + margin-right: -300px; + position: fixed; + top: 30px; + bottom: 30px; + right: 50%; + z-index: 100105; +} + +.find-box-head { + background: #fcfcfc; + border-bottom: 1px solid #ddd; + height: 36px; + font-size: 18px; + font-weight: 600; + line-height: 2; + padding: 0 16px 0 36px; + position: absolute; + top: 0; + right: 0; + left: 0; +} + +.find-box-inside { + overflow: auto; + padding: 16px; + background-color: #fff; + position: absolute; + top: 37px; + bottom: 45px; + overflow-y: scroll; + width: 100%; + box-sizing: border-box; +} + +.find-box-search { + padding-bottom: 16px; +} + +.find-box-search .spinner { + float: none; + right: 105px; + position: absolute; +} + +.find-box-search, +#find-posts-response { + position: relative; /* RTL fix, #WP28010 */ +} + +#find-posts-input, +#find-posts-search { + float: right; +} + +#find-posts-input { + width: 140px; + height: 28px; + margin: 0 0 0 4px; +} + +.widefat .found-radio { + padding-left: 0; + width: 16px; +} + +#find-posts-close { + width: 36px; + height: 36px; + border: none; + padding: 0; + position: absolute; + top: 0; + left: 0; + cursor: pointer; + text-align: center; + background: none; + color: #666; +} + +#find-posts-close:hover, +#find-posts-close:focus { + color: #00a0d2; +} + +#find-posts-close:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +#find-posts-close:before { + font: normal 20px/36px dashicons; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\f158"; +} + +.find-box-buttons { + padding: 8px 16px; + background: #fcfcfc; + border-top: 1px solid #ddd; + position: absolute; + bottom: 0; + right: 0; + left: 0; +} + +@media screen and (max-width: 782px) { + .find-box-inside { + bottom: 57px; + } +} + +@media screen and (max-width: 660px) { + + .find-box { + top: 0; + bottom: 0; + right: 0; + left: 0; + margin: 0; + width: 100%; + } + +} + +.ui-find-overlay { + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 100100; +} + +.drag-drop #drag-drop-area { + border: 4px dashed #b4b9be; + height: 200px; +} + +.drag-drop .drag-drop-inside { + margin: 60px auto 0; + width: 250px; +} + +.drag-drop-inside p { + font-size: 14px; + margin: 5px 0; + display: none; +} + +.drag-drop .drag-drop-inside p { + text-align: center; +} + +.drag-drop-inside p.drag-drop-info { + font-size: 20px; +} + +.drag-drop .drag-drop-inside p, +.drag-drop-inside p.drag-drop-buttons { + display: block; +} + +/* +#drag-drop-area:-moz-drag-over { + border-color: #83b4d8; +} +border color while dragging a file over the uploader drop area */ +.drag-drop.drag-over #drag-drop-area { + border-color: #83b4d8; +} + +#plupload-upload-ui { + position: relative; +} + +/** + * Media Library grid view + */ + +.media-frame.mode-grid, +.media-frame.mode-grid .media-frame-content, +.media-frame.mode-grid .attachments-browser .attachments, +.media-frame.mode-grid .uploader-inline-content { + position: static; +} + +/* Regions we don't use at all */ +.media-frame.mode-grid .media-frame-title, +.media-frame.mode-grid .media-frame-router, +.media-frame.mode-grid .media-frame-menu { + display: none; +} + +.media-frame.mode-grid .media-frame-content { + background-color: transparent; + border: none; +} + +.upload-php .mode-grid .media-sidebar { + position: relative; + width: auto; + margin-top: 12px; + padding: 0 16px; + border-right: 4px solid #dd3d36; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); + background-color: #fff; +} + +.upload-php .mode-grid .hide-sidebar .media-sidebar { + display: none; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status { + border-bottom: none; + padding-bottom: 0; + max-width: 100%; +} + +.upload-php .mode-grid .media-sidebar .upload-error { + margin: 12px 0; + padding: 4px 0 0; + border: none; + box-shadow: none; + background: none; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors { + top: -10px; + left: -14px; + padding: 10px; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:before { + content: "\f153"; + display: block; + font: normal 16px/1 dashicons; + color: #72777c; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:focus:before, +.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:hover:before { + color: #c00; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2 { + display: none; +} + +.media-frame.mode-grid .uploader-inline { + position: relative; + top: auto; + left: auto; + right: auto; + bottom: auto; + padding-top: 0; + margin-top: 20px; + border: 4px dashed #b4b9be; +} + +.media-frame.mode-select .attachments-browser.fixed .attachments { + position: relative; + top: 94px; /* prevent jumping up when the toolbar becomes fixed */ + padding-bottom: 94px; /* offset for above so the bottom doesn't get cut off */ +} + +.media-frame.mode-grid .attachment:focus, +.media-frame.mode-grid .selected.attachment:focus, +.media-frame.mode-grid .attachment.details:focus { + box-shadow: + inset 0 0 2px 3px #f1f1f1, + inset 0 0 0 7px #5b9dd9; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -6px; +} + +.media-frame.mode-grid .selected.attachment { + box-shadow: + inset 0 0 0 5px #f1f1f1, + inset 0 0 0 7px #ccc; +} + +.media-frame.mode-grid .attachment.details { + box-shadow: + inset 0 0 0 3px #f1f1f1, + inset 0 0 0 7px #1e8cbe; +} + +.media-frame.mode-grid.mode-select .attachment .thumbnail { + opacity: 0.65; +} + +.media-frame.mode-select .attachment.selected .thumbnail { + opacity: 1; +} + +.media-frame.mode-grid .media-toolbar { + margin-bottom: 15px; + height: auto; +} + +.media-frame.mode-grid .media-toolbar select { + margin: 0 0 0 10px; +} + +.media-frame.mode-grid.mode-edit .media-toolbar-secondary > .select-mode-toggle-button { + margin: 0 0 0 8px; + vertical-align: middle; +} + +.media-frame.mode-grid .attachments-browser .bulk-select { + display: inline-block; + margin: 0 0 0 10px; +} + +.media-frame.mode-grid .search { + margin-top: 0; +} + +.media-search-input-label { + margin: 0 0 0 .2em; + vertical-align: baseline; +} + +.media-frame.mode-grid .media-search-input-label { + position: static; + margin: 0 0 0 .5em; +} + +.attachments-browser .media-toolbar-secondary > .media-button { + margin-left: 10px; +} + +.media-frame.mode-select .attachments-browser.fixed .media-toolbar { + position: fixed; + top: 32px; + right: auto; + left: 20px; + margin-top: 0; +} + +.media-frame.mode-grid .attachments-browser { + padding: 0; +} + +.media-frame.mode-grid .attachments-browser .attachments { + padding: 2px; +} + +.media-frame.mode-grid .attachments-browser .no-media { + color: #666; /* same as no plugins and no themes */ + font-size: 18px; + font-style: normal; + margin: 0; + padding: 100px 0 0; + text-align: center; +} + +/** + * Attachment details modal + */ + +.edit-attachment-frame { + display: block; + height: 100%; + width: 100%; +} + +.edit-attachment-frame .edit-media-header { + overflow: hidden; +} + +.upload-php .media-modal-close .media-modal-icon:before { + content: "\f335"; + font-size: 22px; +} + +.upload-php .media-modal-close, +.edit-attachment-frame .edit-media-header .left, +.edit-attachment-frame .edit-media-header .right { + cursor: pointer; + color: #72777c; + background-color: transparent; + height: 50px; + width: 50px; + padding: 0; + position: absolute; + text-align: center; + border: 0; + border-right: 1px solid #ddd; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.upload-php .media-modal-close { + top: 0; + left: 0; +} + +.edit-attachment-frame .edit-media-header .left { + left: 102px; +} + +.edit-attachment-frame .edit-media-header .right { + left: 51px; +} + +.edit-attachment-frame .media-frame-title { + right: 0; + left: 150px; /* leave space for prev/next/close */ +} + +.edit-attachment-frame .edit-media-header .right:before, +.edit-attachment-frame .edit-media-header .left:before { + font: normal 20px/50px dashicons !important; + display: inline; + font-weight: 300; +} + +.upload-php .media-modal-close:hover, +.upload-php .media-modal-close:focus, +.edit-attachment-frame .edit-media-header .left:hover, +.edit-attachment-frame .edit-media-header .right:hover, +.edit-attachment-frame .edit-media-header .left:focus, +.edit-attachment-frame .edit-media-header .right:focus { + background: #ddd; + border-color: #ccc; + color: #000; + outline: none; + box-shadow: none; +} + +.upload-php .media-modal-close:focus, +.edit-attachment-frame .edit-media-header .left:focus, +.edit-attachment-frame .edit-media-header .right:focus { + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +.upload-php .media-modal-close:focus .media-modal-icon:before, +.upload-php .media-modal-close:hover .media-modal-icon:before { + color: #000; +} + +.edit-attachment-frame .edit-media-header .left:before { + content: "\f345"; +} + +.edit-attachment-frame .edit-media-header .right:before { + content: "\f341"; +} + +.edit-attachment-frame .edit-media-header [disabled], +.edit-attachment-frame .edit-media-header [disabled]:hover { + color: #ccc; + background: inherit; + cursor: default; +} + +.edit-attachment-frame .media-frame-content, +.edit-attachment-frame .media-frame-router { + right: 0; +} + +.edit-attachment-frame .media-frame-content { + border-bottom: none; + bottom: 0; + top: 50px; +} + +.edit-attachment-frame .attachment-details { + position: absolute; + overflow: auto; + top: 0; + bottom: 0; + left: 0; + right: 0; + box-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1); +} + +.edit-attachment-frame .attachment-media-view { + float: right; + width: 65%; + height: 100%; +} + +.edit-attachment-frame .attachment-media-view .thumbnail { + box-sizing: border-box; + padding: 16px; + height: 100%; +} + +.edit-attachment-frame .attachment-media-view .details-image { + display: block; + margin: 0 auto 16px; + max-width: 100%; + max-height: 90%; + max-height: calc( 100% - 42px ); /* leave space for actions underneath */ + background-image: linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4); + background-position: 100% 0, 10px 10px; + background-size: 20px 20px; +} + +.edit-attachment-frame .attachment-media-view .details-image.icon { + background: none; +} + +.edit-attachment-frame .attachment-media-view .attachment-actions { + text-align: center; +} + +.edit-attachment-frame .wp-media-wrapper { + margin-bottom: 12px; +} + +.edit-attachment-frame input, +.edit-attachment-frame textarea { + padding: 6px 8px; + line-height: 1.14285714; +} + +.edit-attachment-frame .attachment-info { + overflow: auto; + box-sizing: border-box; + margin-bottom: 0; + padding: 12px 16px 0; + width: 35%; + height: 100%; + box-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1); + border-bottom: 0; + border-right: 1px solid #ddd; + background: #f3f3f3; +} + +.edit-attachment-frame .attachment-info .details, +.edit-attachment-frame .attachment-info .settings { + position: relative; /* RTL fix, #WP29352 */ + overflow: hidden; + float: none; + margin-bottom: 15px; + padding-bottom: 15px; + border-bottom: 1px solid #ddd; +} + +.edit-attachment-frame .attachment-info .filename { + font-weight: 400; + color: #666; +} + +.edit-attachment-frame .attachment-info .thumbnail { + margin-bottom: 12px; +} + +.attachment-info .actions { + margin-bottom: 16px; +} + +.attachment-info .actions a { + display: inline; + text-decoration: none; +} + + +/*------------------------------------------------------------------------------ + 14.2 - Image Editor +------------------------------------------------------------------------------*/ +.wp_attachment_details .attachment-alt-text { + margin-bottom: 5px; +} + +.wp_attachment_details .attachment-alt-text-description { + margin-top: 5px; +} + +.wp_attachment_details label[for="content"] { + font-size: 13px; + line-height: 1.5; + margin: 1em 0; +} + +.wp_attachment_details #attachment_caption { + height: 4em; +} + +.describe .image-editor { + vertical-align: top; +} + +.imgedit-wrap { + position: relative; + padding-top: 10px; +} + +.imgedit-settings p, +.imgedit-settings fieldset { + margin: 8px 0; +} + +.imgedit-settings legend { + margin-bottom: 5px; +} + +.describe .imgedit-wrap .imgedit-settings { + padding: 0 5px; +} + +.wp_attachment_holder div.updated { + margin-top: 0; +} + +.wp_attachment_holder .imgedit-wrap > div { + height: auto; +} + +.wp_attachment_holder .imgedit-wrap .imgedit-panel-content { + float: right; + padding: 3px 0 0 16px; + min-width: 400px; + max-width: calc( 100% - 266px ); +} + +.wp_attachment_holder .imgedit-wrap .imgedit-settings { + float: left; + width: 250px; +} + +.imgedit-settings input { + margin-top: 0; + vertical-align: middle; +} + +.imgedit-wait { + position: absolute; + top: 0; + bottom: 0; + width: 100%; + background: #fff; + opacity: 0.7; + filter: alpha(opacity=70); + display: none; +} + +.imgedit-wait:before { + content: ""; + display: block; + width: 20px; + height: 20px; + position: absolute; + right: 50%; + top: 50%; + margin: -10px -10px 0 0; + background: transparent url(../images/spinner.gif) no-repeat center; + background-size: 20px 20px; + transform: translateZ(0); +} + +.no-float { + float: none; +} + +.media-disabled, +.imgedit-settings .disabled { + /* WCAG 1.4.3 Text or images of text that are part of an inactive user + interface component ... have no contrast requirement. */ + color: #a0a5aa; +} + +.A1B1 { + overflow: hidden; +} + +.wp_attachment_image .button, +.A1B1 .button { + float: right; +} + +.no-js .wp_attachment_image .button { + display: none; +} + +.wp_attachment_image .spinner, +.A1B1 .spinner { + float: right; +} + +.imgedit-menu { + margin: 0 0 12px; +} + +.imgedit-menu .note-no-rotate { + clear: both; + margin: 0; + padding: 1em 0 0; +} + +.image-editor .imgedit-menu .button { + display: inline-block; + width: auto; + min-height: 28px; + font-size: 13px; + line-height: 2; + margin: 0 0 8px 8px; + padding: 0 10px; +} + +.imgedit-menu .button:before { + font: normal 16px/1 dashicons; + margin-left: 8px; + speak: none; + vertical-align: middle; + position: relative; + top: -2px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.imgedit-menu .button.disabled { + color: #a0a5aa; + border-color: #ddd; + background: #f7f7f7; + box-shadow: none; + text-shadow: 0 1px 0 #fff; + cursor: default; + transform: none; +} + +.imgedit-crop:before { + content: "\f165"; +} + +.imgedit-rleft:before { + content: "\f166"; +} + +.imgedit-rright:before { + content: "\f167"; +} + +.imgedit-flipv:before { + content: "\f168"; +} + +.imgedit-fliph:before { + content: "\f169"; +} + +.imgedit-undo:before { + content: "\f171"; +} + +.imgedit-redo:before { + content: "\f172"; +} + +.imgedit-crop-wrap { + position: relative; +} + +.imgedit-crop-wrap img { + background-image: linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4); + background-position: 100% 0, 10px 10px; + background-size: 20px 20px; +} + +.imgedit-crop { + margin: 0 0 0 8px; +} + +.imgedit-rleft { + margin: 0 3px; +} + +.imgedit-rright { + margin: 0 3px 0 8px; +} + +.imgedit-flipv { + margin: 0 3px; +} + +.imgedit-fliph { + margin: 0 3px 0 8px; +} + +.imgedit-undo { + margin: 0 3px; +} + +.imgedit-redo { + margin: 0 3px 0 8px; +} + +.imgedit-thumbnail-preview { + margin: 10px 0 0 8px; +} + +.imgedit-thumbnail-preview-caption { + display: block; +} + +#poststuff .imgedit-group-top h2 { + display: inline-block; + margin: 0; + padding: 0; + font-size: 14px; + line-height: 1.4; +} + +#poststuff .imgedit-group-top .button-link { + text-decoration: none; + color: #23282d; +} + +.imgedit-applyto .imgedit-label { + display: block; + padding: .5em 0 0; +} + +.imgedit-help { + display: none; + padding-bottom: 8px; +} + +.imgedit-help.imgedit-restore { + padding-bottom: 0; +} + +/* higher specificity than buttons */ +.image-editor .imgedit-settings .imgedit-help-toggle, +.image-editor .imgedit-settings .imgedit-help-toggle:hover, +.image-editor .imgedit-settings .imgedit-help-toggle:active { + border: 1px solid transparent; + margin: -1px -1px 0 0; + padding: 0; + background: transparent; + color: #0074a2; + font-size: 20px; + line-height: 1; + cursor: pointer; + box-sizing: content-box; + box-shadow: none; +} + +.image-editor .imgedit-settings .imgedit-help-toggle:focus { + color: #0074a2; + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.form-table td.imgedit-response { + padding: 0; +} + +.imgedit-submit { + margin: 8px 0 0; +} + +.imgedit-submit-btn { + margin-right: 20px; +} + +.imgedit-wrap .nowrap { + white-space: nowrap; + font-size: 12px; + line-height: inherit; +} + +span.imgedit-scale-warn { + color: #dc3232; + font-size: 20px; + font-style: normal; + visibility: hidden; + vertical-align: middle; +} + +.imgedit-save-target { + margin: 8px 0; +} + +.imgedit-save-target legend { + font-weight: 600; +} + +.imgedit-group { + margin-bottom: 8px; + padding: 10px; +} + +.imgedit-settings .imgedit-original-dimensions { + display: inline-block; +} + +.imgedit-settings .imgedit-scale input[type="text"], +.imgedit-settings .imgedit-crop-ratio input[type="text"], +.imgedit-settings .imgedit-crop-sel input[type="text"] { + width: 80px; + font-size: 14px; + padding: 0 8px; +} + +.imgedit-separator { + display: inline-block; + width: 7px; + text-align: center; + font-size: 13px; + color: #444; +} + +.imgedit-settings .imgedit-scale-button-wrapper { + margin-top: 0.3077em; + display: block; +} + +.imgedit-settings .imgedit-scale .button { + margin-bottom: 0; +} + +audio, video { + display: inline-block; + max-width: 100%; +} + +.mejs-container { + width: 100%; + max-width: 100%; +} + +.mejs-container .mejs-controls { + box-sizing: border-box; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + .imgedit-wait:before { + background-image: url(../images/spinner-2x.gif); + } +} + +@media screen and (max-width: 782px) { + .wp_attachment_details label[for="content"] { + font-size: 14px; + line-height: 1.5; + } + + .media-upload-form .media-item.error, + .media-upload-form .media-item .error { + font-size: 13px; + line-height: 1.5; + } + + .media-upload-form .media-item.error { + padding: 1px 10px; + } + + .media-upload-form .media-item .error { + padding: 10px 12px 10px 0; + } + + .imgedit-settings .imgedit-scale input[type="text"], + .imgedit-settings .imgedit-crop-ratio input[type="text"], + .imgedit-settings .imgedit-crop-sel input[type="text"] { + font-size: 16px; + padding: 6px 10px; + } + + .wp_attachment_holder .imgedit-wrap .imgedit-panel-content, + .wp_attachment_holder .imgedit-wrap .imgedit-settings { + float: none; + width: auto; + max-width: none; + } +} + +/** + * Media queries for media grid. + */ + +@media only screen and (max-width: 1120px) { + /* override for media-views.css */ + #wp-media-grid .wp-filter .attachment-filters { + max-width: 100%; + } +} + +@media only screen and (max-width: 782px) { + .media-frame.mode-select .attachments-browser.fixed .media-toolbar { + top: 46px; + left: 10px; + } +} + +@media only screen and (max-width: 600px) { + .media-frame.mode-select .attachments-browser.fixed .media-toolbar { + top: 0; + } +} + +@media only screen and (max-width: 480px) { + .edit-attachment-frame .media-frame-title { + left: 110px; + } + + .upload-php .media-modal-close, + .edit-attachment-frame .edit-media-header .left, + .edit-attachment-frame .edit-media-header .right { + width: 40px; + height: 40px; + } + + .edit-attachment-frame .edit-media-header .right:before, + .edit-attachment-frame .edit-media-header .left:before { + line-height: 40px !important; + } + + .edit-attachment-frame .edit-media-header .left { + left: 82px; + } + + .edit-attachment-frame .edit-media-header .right { + left: 41px; + } + + .edit-attachment-frame .media-frame-content { + top: 40px; + } + + .edit-attachment-frame .attachment-media-view { + float: none; + height: auto; + width: 100%; + } + + .edit-attachment-frame .attachment-info { + height: auto; + width: 100%; + } +} + +@media only screen and (max-width: 640px), screen and (max-height: 400px) { + .upload-php .mode-grid .media-sidebar{ + max-width: 100%; + } +} diff --git a/wp-admin/css/media-rtl.min.css b/wp-admin/css/media-rtl.min.css new file mode 100644 index 0000000..0390a5c --- /dev/null +++ b/wp-admin/css/media-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.media-item .describe{border-collapse:collapse;width:100%;border-top:1px solid #ddd;clear:both;cursor:default}.media-item.media-blank .describe{border:0}.media-item .describe th{vertical-align:top;text-align:right;padding:5px 10px 10px;width:140px}.media-item .describe .align th{padding-top:0}.media-item .media-item-info tr{background-color:transparent}.media-item .describe td{padding:0 0 8px 8px;vertical-align:top}.media-item thead.media-item-info td{padding:4px 10px 0}.media-item .media-item-info .A1B1{padding:0 10px 0 0}.media-item td.savesend{padding-bottom:15px}.media-item .thumbnail{max-height:128px;max-width:128px}#wpbody-content #async-upload-wrap a{display:none}.media-upload-form{margin-top:20px}.media-upload-form td label{margin-left:6px;margin-right:2px}.media-upload-form .align .field label{display:inline;padding:0 23px 0 0;margin:0 3px 0 1em;font-weight:600}.media-upload-form tr.image-size label{margin:0 5px 0 0;font-weight:600}.media-upload-form th.label label{font-weight:600;margin:.5em;font-size:13px}.media-upload-form th.label label span{padding:0 5px}.media-item .describe input[type=text],.media-item .describe textarea{width:460px}.media-item .describe p.help{margin:0;padding:0 5px 0 0}.describe-toggle-off,.describe-toggle-on,.media-item .edit-attachment{display:block;line-height:2.76923076;float:left;margin-left:10px}.media-item .describe-toggle-off,.media-item.open .describe-toggle-on{display:none}.media-item.open .describe-toggle-off{display:block}.media-upload-form .media-item{min-height:36px;margin-bottom:1px;position:relative;width:100%;background:#fff}.media-upload-form .media-item,.media-upload-form .media-item .error{box-shadow:0 1px 0 #ddd}#media-items:empty{border:0 none}.media-item .filename{line-height:2.76923076;overflow:hidden;margin-right:6px}.media-item .pinkynail{float:right;margin:2px 3px 0 10px;max-width:40px;max-height:32px}.media-item .startclosed,.media-item .startopen{display:none}.media-item .original{position:relative;height:34px}.media-item .progress{float:left;height:22px;margin:7px 6px;width:200px;line-height:2em;padding:0;overflow:hidden;border-radius:22px;background:#ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.media-item .bar{z-index:9;width:0;height:100%;margin-top:-22px;border-radius:22px;background-color:#0073aa;box-shadow:inset 0 0 2px rgba(0,0,0,.3)}.media-item .progress .percent{z-index:10;position:relative;width:200px;padding:0;color:#fff;text-align:center;line-height:22px;font-weight:400;text-shadow:0 1px 2px rgba(0,0,0,.2)}.upload-php .fixed .column-parent{width:15%}.js .html-uploader #plupload-upload-ui{display:none}.js .html-uploader #html-upload-ui{display:block}.media-upload-form .media-item .error,.media-upload-form .media-item.error{width:auto;margin:0 0 1px 0}.media-upload-form .media-item .error{padding:10px 14px 10px 0}.media-item .error-div button.dismiss{float:left;margin:0 15px 0 10px}.find-box{background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:600px;overflow:hidden;margin-right:-300px;position:fixed;top:30px;bottom:30px;right:50%;z-index:100105}.find-box-head{background:#fcfcfc;border-bottom:1px solid #ddd;height:36px;font-size:18px;font-weight:600;line-height:2;padding:0 16px 0 36px;position:absolute;top:0;right:0;left:0}.find-box-inside{overflow:auto;padding:16px;background-color:#fff;position:absolute;top:37px;bottom:45px;overflow-y:scroll;width:100%;box-sizing:border-box}.find-box-search{padding-bottom:16px}.find-box-search .spinner{float:none;right:105px;position:absolute}#find-posts-response,.find-box-search{position:relative}#find-posts-input,#find-posts-search{float:right}#find-posts-input{width:140px;height:28px;margin:0 0 0 4px}.widefat .found-radio{padding-left:0;width:16px}#find-posts-close{width:36px;height:36px;border:none;padding:0;position:absolute;top:0;left:0;cursor:pointer;text-align:center;background:0 0;color:#666}#find-posts-close:focus,#find-posts-close:hover{color:#00a0d2}#find-posts-close:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:2px solid transparent;outline-offset:-2px}#find-posts-close:before{font:normal 20px/36px dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f158"}.find-box-buttons{padding:8px 16px;background:#fcfcfc;border-top:1px solid #ddd;position:absolute;bottom:0;right:0;left:0}@media screen and (max-width:782px){.find-box-inside{bottom:57px}}@media screen and (max-width:660px){.find-box{top:0;bottom:0;right:0;left:0;margin:0;width:100%}}.ui-find-overlay{position:fixed;top:0;right:0;left:0;bottom:0;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100100}.drag-drop #drag-drop-area{border:4px dashed #b4b9be;height:200px}.drag-drop .drag-drop-inside{margin:60px auto 0;width:250px}.drag-drop-inside p{font-size:14px;margin:5px 0;display:none}.drag-drop .drag-drop-inside p{text-align:center}.drag-drop-inside p.drag-drop-info{font-size:20px}.drag-drop .drag-drop-inside p,.drag-drop-inside p.drag-drop-buttons{display:block}.drag-drop.drag-over #drag-drop-area{border-color:#83b4d8}#plupload-upload-ui{position:relative}.media-frame.mode-grid,.media-frame.mode-grid .attachments-browser .attachments,.media-frame.mode-grid .media-frame-content,.media-frame.mode-grid .uploader-inline-content{position:static}.media-frame.mode-grid .media-frame-menu,.media-frame.mode-grid .media-frame-router,.media-frame.mode-grid .media-frame-title{display:none}.media-frame.mode-grid .media-frame-content{background-color:transparent;border:none}.upload-php .mode-grid .media-sidebar{position:relative;width:auto;margin-top:12px;padding:0 16px;border-right:4px solid #dd3d36;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);background-color:#fff}.upload-php .mode-grid .hide-sidebar .media-sidebar{display:none}.upload-php .mode-grid .media-sidebar .media-uploader-status{border-bottom:none;padding-bottom:0;max-width:100%}.upload-php .mode-grid .media-sidebar .upload-error{margin:12px 0;padding:4px 0 0;border:none;box-shadow:none;background:0 0}.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors{top:-10px;left:-14px;padding:10px}.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:before{content:"\f153";display:block;font:normal 16px/1 dashicons;color:#72777c}.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:focus:before,.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:hover:before{color:#c00}.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2{display:none}.media-frame.mode-grid .uploader-inline{position:relative;top:auto;left:auto;right:auto;bottom:auto;padding-top:0;margin-top:20px;border:4px dashed #b4b9be}.media-frame.mode-select .attachments-browser.fixed .attachments{position:relative;top:94px;padding-bottom:94px}.media-frame.mode-grid .attachment.details:focus,.media-frame.mode-grid .attachment:focus,.media-frame.mode-grid .selected.attachment:focus{box-shadow:inset 0 0 2px 3px #f1f1f1,inset 0 0 0 7px #5b9dd9;outline:2px solid transparent;outline-offset:-6px}.media-frame.mode-grid .selected.attachment{box-shadow:inset 0 0 0 5px #f1f1f1,inset 0 0 0 7px #ccc}.media-frame.mode-grid .attachment.details{box-shadow:inset 0 0 0 3px #f1f1f1,inset 0 0 0 7px #1e8cbe}.media-frame.mode-grid.mode-select .attachment .thumbnail{opacity:.65}.media-frame.mode-select .attachment.selected .thumbnail{opacity:1}.media-frame.mode-grid .media-toolbar{margin-bottom:15px;height:auto}.media-frame.mode-grid .media-toolbar select{margin:0 0 0 10px}.media-frame.mode-grid.mode-edit .media-toolbar-secondary>.select-mode-toggle-button{margin:0 0 0 8px;vertical-align:middle}.media-frame.mode-grid .attachments-browser .bulk-select{display:inline-block;margin:0 0 0 10px}.media-frame.mode-grid .search{margin-top:0}.media-search-input-label{margin:0 0 0 .2em;vertical-align:baseline}.media-frame.mode-grid .media-search-input-label{position:static;margin:0 0 0 .5em}.attachments-browser .media-toolbar-secondary>.media-button{margin-left:10px}.media-frame.mode-select .attachments-browser.fixed .media-toolbar{position:fixed;top:32px;right:auto;left:20px;margin-top:0}.media-frame.mode-grid .attachments-browser{padding:0}.media-frame.mode-grid .attachments-browser .attachments{padding:2px}.media-frame.mode-grid .attachments-browser .no-media{color:#666;font-size:18px;font-style:normal;margin:0;padding:100px 0 0;text-align:center}.edit-attachment-frame{display:block;height:100%;width:100%}.edit-attachment-frame .edit-media-header{overflow:hidden}.upload-php .media-modal-close .media-modal-icon:before{content:"\f335";font-size:22px}.edit-attachment-frame .edit-media-header .left,.edit-attachment-frame .edit-media-header .right,.upload-php .media-modal-close{cursor:pointer;color:#72777c;background-color:transparent;height:50px;width:50px;padding:0;position:absolute;text-align:center;border:0;border-right:1px solid #ddd;transition:color .1s ease-in-out,background .1s ease-in-out}.upload-php .media-modal-close{top:0;left:0}.edit-attachment-frame .edit-media-header .left{left:102px}.edit-attachment-frame .edit-media-header .right{left:51px}.edit-attachment-frame .media-frame-title{right:0;left:150px}.edit-attachment-frame .edit-media-header .left:before,.edit-attachment-frame .edit-media-header .right:before{font:normal 20px/50px dashicons!important;display:inline;font-weight:300}.edit-attachment-frame .edit-media-header .left:focus,.edit-attachment-frame .edit-media-header .left:hover,.edit-attachment-frame .edit-media-header .right:focus,.edit-attachment-frame .edit-media-header .right:hover,.upload-php .media-modal-close:focus,.upload-php .media-modal-close:hover{background:#ddd;border-color:#ccc;color:#000;outline:0;box-shadow:none}.edit-attachment-frame .edit-media-header .left:focus,.edit-attachment-frame .edit-media-header .right:focus,.upload-php .media-modal-close:focus{outline:2px solid transparent;outline-offset:-2px}.upload-php .media-modal-close:focus .media-modal-icon:before,.upload-php .media-modal-close:hover .media-modal-icon:before{color:#000}.edit-attachment-frame .edit-media-header .left:before{content:"\f345"}.edit-attachment-frame .edit-media-header .right:before{content:"\f341"}.edit-attachment-frame .edit-media-header [disabled],.edit-attachment-frame .edit-media-header [disabled]:hover{color:#ccc;background:inherit;cursor:default}.edit-attachment-frame .media-frame-content,.edit-attachment-frame .media-frame-router{right:0}.edit-attachment-frame .media-frame-content{border-bottom:none;bottom:0;top:50px}.edit-attachment-frame .attachment-details{position:absolute;overflow:auto;top:0;bottom:0;left:0;right:0;box-shadow:inset 0 4px 4px -4px rgba(0,0,0,.1)}.edit-attachment-frame .attachment-media-view{float:right;width:65%;height:100%}.edit-attachment-frame .attachment-media-view .thumbnail{box-sizing:border-box;padding:16px;height:100%}.edit-attachment-frame .attachment-media-view .details-image{display:block;margin:0 auto 16px;max-width:100%;max-height:90%;max-height:calc(100% - 42px);background-image:linear-gradient(-45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4),linear-gradient(-45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4);background-position:100% 0,10px 10px;background-size:20px 20px}.edit-attachment-frame .attachment-media-view .details-image.icon{background:0 0}.edit-attachment-frame .attachment-media-view .attachment-actions{text-align:center}.edit-attachment-frame .wp-media-wrapper{margin-bottom:12px}.edit-attachment-frame input,.edit-attachment-frame textarea{padding:6px 8px;line-height:1.14285714}.edit-attachment-frame .attachment-info{overflow:auto;box-sizing:border-box;margin-bottom:0;padding:12px 16px 0;width:35%;height:100%;box-shadow:inset 0 4px 4px -4px rgba(0,0,0,.1);border-bottom:0;border-right:1px solid #ddd;background:#f3f3f3}.edit-attachment-frame .attachment-info .details,.edit-attachment-frame .attachment-info .settings{position:relative;overflow:hidden;float:none;margin-bottom:15px;padding-bottom:15px;border-bottom:1px solid #ddd}.edit-attachment-frame .attachment-info .filename{font-weight:400;color:#666}.edit-attachment-frame .attachment-info .thumbnail{margin-bottom:12px}.attachment-info .actions{margin-bottom:16px}.attachment-info .actions a{display:inline;text-decoration:none}.wp_attachment_details .attachment-alt-text{margin-bottom:5px}.wp_attachment_details .attachment-alt-text-description{margin-top:5px}.wp_attachment_details label[for=content]{font-size:13px;line-height:1.5;margin:1em 0}.wp_attachment_details #attachment_caption{height:4em}.describe .image-editor{vertical-align:top}.imgedit-wrap{position:relative;padding-top:10px}.imgedit-settings fieldset,.imgedit-settings p{margin:8px 0}.imgedit-settings legend{margin-bottom:5px}.describe .imgedit-wrap .imgedit-settings{padding:0 5px}.wp_attachment_holder div.updated{margin-top:0}.wp_attachment_holder .imgedit-wrap>div{height:auto}.wp_attachment_holder .imgedit-wrap .imgedit-panel-content{float:right;padding:3px 0 0 16px;min-width:400px;max-width:calc(100% - 266px)}.wp_attachment_holder .imgedit-wrap .imgedit-settings{float:left;width:250px}.imgedit-settings input{margin-top:0;vertical-align:middle}.imgedit-wait{position:absolute;top:0;bottom:0;width:100%;background:#fff;opacity:.7;filter:alpha(opacity=70);display:none}.imgedit-wait:before{content:"";display:block;width:20px;height:20px;position:absolute;right:50%;top:50%;margin:-10px -10px 0 0;background:transparent url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}.no-float{float:none}.imgedit-settings .disabled,.media-disabled{color:#a0a5aa}.A1B1{overflow:hidden}.A1B1 .button,.wp_attachment_image .button{float:right}.no-js .wp_attachment_image .button{display:none}.A1B1 .spinner,.wp_attachment_image .spinner{float:right}.imgedit-menu{margin:0 0 12px}.imgedit-menu .note-no-rotate{clear:both;margin:0;padding:1em 0 0}.image-editor .imgedit-menu .button{display:inline-block;width:auto;min-height:28px;font-size:13px;line-height:2;margin:0 0 8px 8px;padding:0 10px}.imgedit-menu .button:before{font:normal 16px/1 dashicons;margin-left:8px;speak:none;vertical-align:middle;position:relative;top:-2px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.imgedit-menu .button.disabled{color:#a0a5aa;border-color:#ddd;background:#f7f7f7;box-shadow:none;text-shadow:0 1px 0 #fff;cursor:default;transform:none}.imgedit-crop:before{content:"\f165"}.imgedit-rleft:before{content:"\f166"}.imgedit-rright:before{content:"\f167"}.imgedit-flipv:before{content:"\f168"}.imgedit-fliph:before{content:"\f169"}.imgedit-undo:before{content:"\f171"}.imgedit-redo:before{content:"\f172"}.imgedit-crop-wrap{position:relative}.imgedit-crop-wrap img{background-image:linear-gradient(-45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4),linear-gradient(-45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4);background-position:100% 0,10px 10px;background-size:20px 20px}.imgedit-crop{margin:0 0 0 8px}.imgedit-rleft{margin:0 3px}.imgedit-rright{margin:0 3px 0 8px}.imgedit-flipv{margin:0 3px}.imgedit-fliph{margin:0 3px 0 8px}.imgedit-undo{margin:0 3px}.imgedit-redo{margin:0 3px 0 8px}.imgedit-thumbnail-preview{margin:10px 0 0 8px}.imgedit-thumbnail-preview-caption{display:block}#poststuff .imgedit-group-top h2{display:inline-block;margin:0;padding:0;font-size:14px;line-height:1.4}#poststuff .imgedit-group-top .button-link{text-decoration:none;color:#23282d}.imgedit-applyto .imgedit-label{display:block;padding:.5em 0 0}.imgedit-help{display:none;padding-bottom:8px}.imgedit-help.imgedit-restore{padding-bottom:0}.image-editor .imgedit-settings .imgedit-help-toggle,.image-editor .imgedit-settings .imgedit-help-toggle:active,.image-editor .imgedit-settings .imgedit-help-toggle:hover{border:1px solid transparent;margin:-1px -1px 0 0;padding:0;background:0 0;color:#0074a2;font-size:20px;line-height:1;cursor:pointer;box-sizing:content-box;box-shadow:none}.image-editor .imgedit-settings .imgedit-help-toggle:focus{color:#0074a2;border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8);outline:2px solid transparent}.form-table td.imgedit-response{padding:0}.imgedit-submit{margin:8px 0 0}.imgedit-submit-btn{margin-right:20px}.imgedit-wrap .nowrap{white-space:nowrap;font-size:12px;line-height:inherit}span.imgedit-scale-warn{color:#dc3232;font-size:20px;font-style:normal;visibility:hidden;vertical-align:middle}.imgedit-save-target{margin:8px 0}.imgedit-save-target legend{font-weight:600}.imgedit-group{margin-bottom:8px;padding:10px}.imgedit-settings .imgedit-original-dimensions{display:inline-block}.imgedit-settings .imgedit-crop-ratio input[type=text],.imgedit-settings .imgedit-crop-sel input[type=text],.imgedit-settings .imgedit-scale input[type=text]{width:80px;font-size:14px;padding:0 8px}.imgedit-separator{display:inline-block;width:7px;text-align:center;font-size:13px;color:#444}.imgedit-settings .imgedit-scale-button-wrapper{margin-top:.3077em;display:block}.imgedit-settings .imgedit-scale .button{margin-bottom:0}audio,video{display:inline-block;max-width:100%}.mejs-container{width:100%;max-width:100%}.mejs-container .mejs-controls{box-sizing:border-box}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.imgedit-wait:before{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){.wp_attachment_details label[for=content]{font-size:14px;line-height:1.5}.media-upload-form .media-item .error,.media-upload-form .media-item.error{font-size:13px;line-height:1.5}.media-upload-form .media-item.error{padding:1px 10px}.media-upload-form .media-item .error{padding:10px 12px 10px 0}.imgedit-settings .imgedit-crop-ratio input[type=text],.imgedit-settings .imgedit-crop-sel input[type=text],.imgedit-settings .imgedit-scale input[type=text]{font-size:16px;padding:6px 10px}.wp_attachment_holder .imgedit-wrap .imgedit-panel-content,.wp_attachment_holder .imgedit-wrap .imgedit-settings{float:none;width:auto;max-width:none}}@media only screen and (max-width:1120px){#wp-media-grid .wp-filter .attachment-filters{max-width:100%}}@media only screen and (max-width:782px){.media-frame.mode-select .attachments-browser.fixed .media-toolbar{top:46px;left:10px}}@media only screen and (max-width:600px){.media-frame.mode-select .attachments-browser.fixed .media-toolbar{top:0}}@media only screen and (max-width:480px){.edit-attachment-frame .media-frame-title{left:110px}.edit-attachment-frame .edit-media-header .left,.edit-attachment-frame .edit-media-header .right,.upload-php .media-modal-close{width:40px;height:40px}.edit-attachment-frame .edit-media-header .left:before,.edit-attachment-frame .edit-media-header .right:before{line-height:40px!important}.edit-attachment-frame .edit-media-header .left{left:82px}.edit-attachment-frame .edit-media-header .right{left:41px}.edit-attachment-frame .media-frame-content{top:40px}.edit-attachment-frame .attachment-media-view{float:none;height:auto;width:100%}.edit-attachment-frame .attachment-info{height:auto;width:100%}}@media only screen and (max-width:640px),screen and (max-height:400px){.upload-php .mode-grid .media-sidebar{max-width:100%}} \ No newline at end of file diff --git a/wp-admin/css/media.css b/wp-admin/css/media.css new file mode 100644 index 0000000..3857baa --- /dev/null +++ b/wp-admin/css/media.css @@ -0,0 +1,1289 @@ +/*------------------------------------------------------------------------------ + 14.0 - Media Screen +------------------------------------------------------------------------------*/ + +.media-item .describe { + border-collapse: collapse; + width: 100%; + border-top: 1px solid #ddd; + clear: both; + cursor: default; +} + +.media-item.media-blank .describe { + border: 0; +} + +.media-item .describe th { + vertical-align: top; + text-align: left; + padding: 5px 10px 10px; + width: 140px; +} + +.media-item .describe .align th { + padding-top: 0; +} + +.media-item .media-item-info tr { + background-color: transparent; +} + +.media-item .describe td { + padding: 0 8px 8px 0; + vertical-align: top; +} + +.media-item thead.media-item-info td { + padding: 4px 10px 0; +} + +.media-item .media-item-info .A1B1 { + padding: 0 0 0 10px; +} + +.media-item td.savesend { + padding-bottom: 15px; +} + +.media-item .thumbnail { + max-height: 128px; + max-width: 128px; +} + +#wpbody-content #async-upload-wrap a { + display: none; +} + +.media-upload-form { + margin-top: 20px; +} + +.media-upload-form td label { + margin-right: 6px; + margin-left: 2px; +} + +.media-upload-form .align .field label { + display: inline; + padding: 0 0 0 23px; + margin: 0 1em 0 3px; + font-weight: 600; +} + +.media-upload-form tr.image-size label { + margin: 0 0 0 5px; + font-weight: 600; +} + +.media-upload-form th.label label { + font-weight: 600; + margin: 0.5em; + font-size: 13px; +} + +.media-upload-form th.label label span { + padding: 0 5px; +} + +.media-item .describe input[type="text"], +.media-item .describe textarea { + width: 460px; +} + +.media-item .describe p.help { + margin: 0; + padding: 0 0 0 5px; +} + +.media-item .edit-attachment, +.describe-toggle-on, +.describe-toggle-off { + display: block; + line-height: 2.76923076; + float: right; + margin-right: 10px; +} + +.media-item .describe-toggle-off, +.media-item.open .describe-toggle-on { + display: none; +} + +.media-item.open .describe-toggle-off { + display: block; +} + +.media-upload-form .media-item { + min-height: 36px; + margin-bottom: 1px; + position: relative; + width: 100%; + background: #fff; +} + +.media-upload-form .media-item, +.media-upload-form .media-item .error { + box-shadow: 0 1px 0 #ddd; +} + +#media-items:empty { + border: 0 none; +} + +.media-item .filename { + line-height: 2.76923076; + overflow: hidden; + margin-left: 6px; +} + +.media-item .pinkynail { + float: left; + margin: 2px 10px 0 3px; + max-width: 40px; + max-height: 32px; +} + +.media-item .startopen, +.media-item .startclosed { + display: none; +} + +.media-item .original { + position: relative; + height: 34px; +} + +.media-item .progress { + float: right; + height: 22px; + margin: 7px 6px; + width: 200px; + line-height: 2em; + padding: 0; + overflow: hidden; + border-radius: 22px; + background: #ddd; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.media-item .bar { + z-index: 9; + width: 0; + height: 100%; + margin-top: -22px; + border-radius: 22px; + background-color: #0073aa; + box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.3); +} + +.media-item .progress .percent { + z-index: 10; + position: relative; + width: 200px; + padding: 0; + color: #fff; + text-align: center; + line-height: 22px; + font-weight: 400; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} + +.upload-php .fixed .column-parent { + width: 15%; +} + +.js .html-uploader #plupload-upload-ui { + display: none; +} + +.js .html-uploader #html-upload-ui { + display: block; +} + +.media-upload-form .media-item.error, +.media-upload-form .media-item .error { + width: auto; + margin: 0 0 1px 0; +} + +.media-upload-form .media-item .error { + padding: 10px 0 10px 14px; +} + +.media-item .error-div button.dismiss { + float: right; + margin: 0 10px 0 15px; +} + +/*------------------------------------------------------------------------------ + 14.1 - Media Library +------------------------------------------------------------------------------*/ + +.find-box { + background-color: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + width: 600px; + overflow: hidden; + margin-left: -300px; + position: fixed; + top: 30px; + bottom: 30px; + left: 50%; + z-index: 100105; +} + +.find-box-head { + background: #fcfcfc; + border-bottom: 1px solid #ddd; + height: 36px; + font-size: 18px; + font-weight: 600; + line-height: 2; + padding: 0 36px 0 16px; + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.find-box-inside { + overflow: auto; + padding: 16px; + background-color: #fff; + position: absolute; + top: 37px; + bottom: 45px; + overflow-y: scroll; + width: 100%; + box-sizing: border-box; +} + +.find-box-search { + padding-bottom: 16px; +} + +.find-box-search .spinner { + float: none; + left: 105px; + position: absolute; +} + +.find-box-search, +#find-posts-response { + position: relative; /* RTL fix, #WP28010 */ +} + +#find-posts-input, +#find-posts-search { + float: left; +} + +#find-posts-input { + width: 140px; + height: 28px; + margin: 0 4px 0 0; +} + +.widefat .found-radio { + padding-right: 0; + width: 16px; +} + +#find-posts-close { + width: 36px; + height: 36px; + border: none; + padding: 0; + position: absolute; + top: 0; + right: 0; + cursor: pointer; + text-align: center; + background: none; + color: #666; +} + +#find-posts-close:hover, +#find-posts-close:focus { + color: #00a0d2; +} + +#find-posts-close:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +#find-posts-close:before { + font: normal 20px/36px dashicons; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\f158"; +} + +.find-box-buttons { + padding: 8px 16px; + background: #fcfcfc; + border-top: 1px solid #ddd; + position: absolute; + bottom: 0; + left: 0; + right: 0; +} + +@media screen and (max-width: 782px) { + .find-box-inside { + bottom: 57px; + } +} + +@media screen and (max-width: 660px) { + + .find-box { + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: 0; + width: 100%; + } + +} + +.ui-find-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 100100; +} + +.drag-drop #drag-drop-area { + border: 4px dashed #b4b9be; + height: 200px; +} + +.drag-drop .drag-drop-inside { + margin: 60px auto 0; + width: 250px; +} + +.drag-drop-inside p { + font-size: 14px; + margin: 5px 0; + display: none; +} + +.drag-drop .drag-drop-inside p { + text-align: center; +} + +.drag-drop-inside p.drag-drop-info { + font-size: 20px; +} + +.drag-drop .drag-drop-inside p, +.drag-drop-inside p.drag-drop-buttons { + display: block; +} + +/* +#drag-drop-area:-moz-drag-over { + border-color: #83b4d8; +} +border color while dragging a file over the uploader drop area */ +.drag-drop.drag-over #drag-drop-area { + border-color: #83b4d8; +} + +#plupload-upload-ui { + position: relative; +} + +/** + * Media Library grid view + */ + +.media-frame.mode-grid, +.media-frame.mode-grid .media-frame-content, +.media-frame.mode-grid .attachments-browser .attachments, +.media-frame.mode-grid .uploader-inline-content { + position: static; +} + +/* Regions we don't use at all */ +.media-frame.mode-grid .media-frame-title, +.media-frame.mode-grid .media-frame-router, +.media-frame.mode-grid .media-frame-menu { + display: none; +} + +.media-frame.mode-grid .media-frame-content { + background-color: transparent; + border: none; +} + +.upload-php .mode-grid .media-sidebar { + position: relative; + width: auto; + margin-top: 12px; + padding: 0 16px; + border-left: 4px solid #dd3d36; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); + background-color: #fff; +} + +.upload-php .mode-grid .hide-sidebar .media-sidebar { + display: none; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status { + border-bottom: none; + padding-bottom: 0; + max-width: 100%; +} + +.upload-php .mode-grid .media-sidebar .upload-error { + margin: 12px 0; + padding: 4px 0 0; + border: none; + box-shadow: none; + background: none; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors { + top: -10px; + right: -14px; + padding: 10px; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:before { + content: "\f153"; + display: block; + font: normal 16px/1 dashicons; + color: #72777c; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:focus:before, +.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:hover:before { + color: #c00; +} + +.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2 { + display: none; +} + +.media-frame.mode-grid .uploader-inline { + position: relative; + top: auto; + right: auto; + left: auto; + bottom: auto; + padding-top: 0; + margin-top: 20px; + border: 4px dashed #b4b9be; +} + +.media-frame.mode-select .attachments-browser.fixed .attachments { + position: relative; + top: 94px; /* prevent jumping up when the toolbar becomes fixed */ + padding-bottom: 94px; /* offset for above so the bottom doesn't get cut off */ +} + +.media-frame.mode-grid .attachment:focus, +.media-frame.mode-grid .selected.attachment:focus, +.media-frame.mode-grid .attachment.details:focus { + box-shadow: + inset 0 0 2px 3px #f1f1f1, + inset 0 0 0 7px #5b9dd9; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -6px; +} + +.media-frame.mode-grid .selected.attachment { + box-shadow: + inset 0 0 0 5px #f1f1f1, + inset 0 0 0 7px #ccc; +} + +.media-frame.mode-grid .attachment.details { + box-shadow: + inset 0 0 0 3px #f1f1f1, + inset 0 0 0 7px #1e8cbe; +} + +.media-frame.mode-grid.mode-select .attachment .thumbnail { + opacity: 0.65; +} + +.media-frame.mode-select .attachment.selected .thumbnail { + opacity: 1; +} + +.media-frame.mode-grid .media-toolbar { + margin-bottom: 15px; + height: auto; +} + +.media-frame.mode-grid .media-toolbar select { + margin: 0 10px 0 0; +} + +.media-frame.mode-grid.mode-edit .media-toolbar-secondary > .select-mode-toggle-button { + margin: 0 8px 0 0; + vertical-align: middle; +} + +.media-frame.mode-grid .attachments-browser .bulk-select { + display: inline-block; + margin: 0 10px 0 0; +} + +.media-frame.mode-grid .search { + margin-top: 0; +} + +.media-search-input-label { + margin: 0 .2em 0 0; + vertical-align: baseline; +} + +.media-frame.mode-grid .media-search-input-label { + position: static; + margin: 0 .5em 0 0; +} + +.attachments-browser .media-toolbar-secondary > .media-button { + margin-right: 10px; +} + +.media-frame.mode-select .attachments-browser.fixed .media-toolbar { + position: fixed; + top: 32px; + left: auto; + right: 20px; + margin-top: 0; +} + +.media-frame.mode-grid .attachments-browser { + padding: 0; +} + +.media-frame.mode-grid .attachments-browser .attachments { + padding: 2px; +} + +.media-frame.mode-grid .attachments-browser .no-media { + color: #666; /* same as no plugins and no themes */ + font-size: 18px; + font-style: normal; + margin: 0; + padding: 100px 0 0; + text-align: center; +} + +/** + * Attachment details modal + */ + +.edit-attachment-frame { + display: block; + height: 100%; + width: 100%; +} + +.edit-attachment-frame .edit-media-header { + overflow: hidden; +} + +.upload-php .media-modal-close .media-modal-icon:before { + content: "\f335"; + font-size: 22px; +} + +.upload-php .media-modal-close, +.edit-attachment-frame .edit-media-header .left, +.edit-attachment-frame .edit-media-header .right { + cursor: pointer; + color: #72777c; + background-color: transparent; + height: 50px; + width: 50px; + padding: 0; + position: absolute; + text-align: center; + border: 0; + border-left: 1px solid #ddd; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.upload-php .media-modal-close { + top: 0; + right: 0; +} + +.edit-attachment-frame .edit-media-header .left { + right: 102px; +} + +.edit-attachment-frame .edit-media-header .right { + right: 51px; +} + +.edit-attachment-frame .media-frame-title { + left: 0; + right: 150px; /* leave space for prev/next/close */ +} + +.edit-attachment-frame .edit-media-header .right:before, +.edit-attachment-frame .edit-media-header .left:before { + font: normal 20px/50px dashicons !important; + display: inline; + font-weight: 300; +} + +.upload-php .media-modal-close:hover, +.upload-php .media-modal-close:focus, +.edit-attachment-frame .edit-media-header .left:hover, +.edit-attachment-frame .edit-media-header .right:hover, +.edit-attachment-frame .edit-media-header .left:focus, +.edit-attachment-frame .edit-media-header .right:focus { + background: #ddd; + border-color: #ccc; + color: #000; + outline: none; + box-shadow: none; +} + +.upload-php .media-modal-close:focus, +.edit-attachment-frame .edit-media-header .left:focus, +.edit-attachment-frame .edit-media-header .right:focus { + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +.upload-php .media-modal-close:focus .media-modal-icon:before, +.upload-php .media-modal-close:hover .media-modal-icon:before { + color: #000; +} + +.edit-attachment-frame .edit-media-header .left:before { + content: "\f341"; +} + +.edit-attachment-frame .edit-media-header .right:before { + content: "\f345"; +} + +.edit-attachment-frame .edit-media-header [disabled], +.edit-attachment-frame .edit-media-header [disabled]:hover { + color: #ccc; + background: inherit; + cursor: default; +} + +.edit-attachment-frame .media-frame-content, +.edit-attachment-frame .media-frame-router { + left: 0; +} + +.edit-attachment-frame .media-frame-content { + border-bottom: none; + bottom: 0; + top: 50px; +} + +.edit-attachment-frame .attachment-details { + position: absolute; + overflow: auto; + top: 0; + bottom: 0; + right: 0; + left: 0; + box-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1); +} + +.edit-attachment-frame .attachment-media-view { + float: left; + width: 65%; + height: 100%; +} + +.edit-attachment-frame .attachment-media-view .thumbnail { + box-sizing: border-box; + padding: 16px; + height: 100%; +} + +.edit-attachment-frame .attachment-media-view .details-image { + display: block; + margin: 0 auto 16px; + max-width: 100%; + max-height: 90%; + max-height: calc( 100% - 42px ); /* leave space for actions underneath */ + background-image: linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; +} + +.edit-attachment-frame .attachment-media-view .details-image.icon { + background: none; +} + +.edit-attachment-frame .attachment-media-view .attachment-actions { + text-align: center; +} + +.edit-attachment-frame .wp-media-wrapper { + margin-bottom: 12px; +} + +.edit-attachment-frame input, +.edit-attachment-frame textarea { + padding: 6px 8px; + line-height: 1.14285714; +} + +.edit-attachment-frame .attachment-info { + overflow: auto; + box-sizing: border-box; + margin-bottom: 0; + padding: 12px 16px 0; + width: 35%; + height: 100%; + box-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1); + border-bottom: 0; + border-left: 1px solid #ddd; + background: #f3f3f3; +} + +.edit-attachment-frame .attachment-info .details, +.edit-attachment-frame .attachment-info .settings { + position: relative; /* RTL fix, #WP29352 */ + overflow: hidden; + float: none; + margin-bottom: 15px; + padding-bottom: 15px; + border-bottom: 1px solid #ddd; +} + +.edit-attachment-frame .attachment-info .filename { + font-weight: 400; + color: #666; +} + +.edit-attachment-frame .attachment-info .thumbnail { + margin-bottom: 12px; +} + +.attachment-info .actions { + margin-bottom: 16px; +} + +.attachment-info .actions a { + display: inline; + text-decoration: none; +} + + +/*------------------------------------------------------------------------------ + 14.2 - Image Editor +------------------------------------------------------------------------------*/ +.wp_attachment_details .attachment-alt-text { + margin-bottom: 5px; +} + +.wp_attachment_details .attachment-alt-text-description { + margin-top: 5px; +} + +.wp_attachment_details label[for="content"] { + font-size: 13px; + line-height: 1.5; + margin: 1em 0; +} + +.wp_attachment_details #attachment_caption { + height: 4em; +} + +.describe .image-editor { + vertical-align: top; +} + +.imgedit-wrap { + position: relative; + padding-top: 10px; +} + +.imgedit-settings p, +.imgedit-settings fieldset { + margin: 8px 0; +} + +.imgedit-settings legend { + margin-bottom: 5px; +} + +.describe .imgedit-wrap .imgedit-settings { + padding: 0 5px; +} + +.wp_attachment_holder div.updated { + margin-top: 0; +} + +.wp_attachment_holder .imgedit-wrap > div { + height: auto; +} + +.wp_attachment_holder .imgedit-wrap .imgedit-panel-content { + float: left; + padding: 3px 16px 0 0; + min-width: 400px; + max-width: calc( 100% - 266px ); +} + +.wp_attachment_holder .imgedit-wrap .imgedit-settings { + float: right; + width: 250px; +} + +.imgedit-settings input { + margin-top: 0; + vertical-align: middle; +} + +.imgedit-wait { + position: absolute; + top: 0; + bottom: 0; + width: 100%; + background: #fff; + opacity: 0.7; + filter: alpha(opacity=70); + display: none; +} + +.imgedit-wait:before { + content: ""; + display: block; + width: 20px; + height: 20px; + position: absolute; + left: 50%; + top: 50%; + margin: -10px 0 0 -10px; + background: transparent url(../images/spinner.gif) no-repeat center; + background-size: 20px 20px; + transform: translateZ(0); +} + +.no-float { + float: none; +} + +.media-disabled, +.imgedit-settings .disabled { + /* WCAG 1.4.3 Text or images of text that are part of an inactive user + interface component ... have no contrast requirement. */ + color: #a0a5aa; +} + +.A1B1 { + overflow: hidden; +} + +.wp_attachment_image .button, +.A1B1 .button { + float: left; +} + +.no-js .wp_attachment_image .button { + display: none; +} + +.wp_attachment_image .spinner, +.A1B1 .spinner { + float: left; +} + +.imgedit-menu { + margin: 0 0 12px; +} + +.imgedit-menu .note-no-rotate { + clear: both; + margin: 0; + padding: 1em 0 0; +} + +.image-editor .imgedit-menu .button { + display: inline-block; + width: auto; + min-height: 28px; + font-size: 13px; + line-height: 2; + margin: 0 8px 8px 0; + padding: 0 10px; +} + +.imgedit-menu .button:before { + font: normal 16px/1 dashicons; + margin-right: 8px; + speak: none; + vertical-align: middle; + position: relative; + top: -2px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.imgedit-menu .button.disabled { + color: #a0a5aa; + border-color: #ddd; + background: #f7f7f7; + box-shadow: none; + text-shadow: 0 1px 0 #fff; + cursor: default; + transform: none; +} + +.imgedit-crop:before { + content: "\f165"; +} + +.imgedit-rleft:before { + content: "\f166"; +} + +.imgedit-rright:before { + content: "\f167"; +} + +.imgedit-flipv:before { + content: "\f168"; +} + +.imgedit-fliph:before { + content: "\f169"; +} + +.imgedit-undo:before { + content: "\f171"; +} + +.imgedit-redo:before { + content: "\f172"; +} + +.imgedit-crop-wrap { + position: relative; +} + +.imgedit-crop-wrap img { + background-image: linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; +} + +.imgedit-crop { + margin: 0 8px 0 0; +} + +.imgedit-rleft { + margin: 0 3px; +} + +.imgedit-rright { + margin: 0 8px 0 3px; +} + +.imgedit-flipv { + margin: 0 3px; +} + +.imgedit-fliph { + margin: 0 8px 0 3px; +} + +.imgedit-undo { + margin: 0 3px; +} + +.imgedit-redo { + margin: 0 8px 0 3px; +} + +.imgedit-thumbnail-preview { + margin: 10px 8px 0 0; +} + +.imgedit-thumbnail-preview-caption { + display: block; +} + +#poststuff .imgedit-group-top h2 { + display: inline-block; + margin: 0; + padding: 0; + font-size: 14px; + line-height: 1.4; +} + +#poststuff .imgedit-group-top .button-link { + text-decoration: none; + color: #23282d; +} + +.imgedit-applyto .imgedit-label { + display: block; + padding: .5em 0 0; +} + +.imgedit-help { + display: none; + padding-bottom: 8px; +} + +.imgedit-help.imgedit-restore { + padding-bottom: 0; +} + +/* higher specificity than buttons */ +.image-editor .imgedit-settings .imgedit-help-toggle, +.image-editor .imgedit-settings .imgedit-help-toggle:hover, +.image-editor .imgedit-settings .imgedit-help-toggle:active { + border: 1px solid transparent; + margin: -1px 0 0 -1px; + padding: 0; + background: transparent; + color: #0074a2; + font-size: 20px; + line-height: 1; + cursor: pointer; + box-sizing: content-box; + box-shadow: none; +} + +.image-editor .imgedit-settings .imgedit-help-toggle:focus { + color: #0074a2; + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.form-table td.imgedit-response { + padding: 0; +} + +.imgedit-submit { + margin: 8px 0 0; +} + +.imgedit-submit-btn { + margin-left: 20px; +} + +.imgedit-wrap .nowrap { + white-space: nowrap; + font-size: 12px; + line-height: inherit; +} + +span.imgedit-scale-warn { + color: #dc3232; + font-size: 20px; + font-style: normal; + visibility: hidden; + vertical-align: middle; +} + +.imgedit-save-target { + margin: 8px 0; +} + +.imgedit-save-target legend { + font-weight: 600; +} + +.imgedit-group { + margin-bottom: 8px; + padding: 10px; +} + +.imgedit-settings .imgedit-original-dimensions { + display: inline-block; +} + +.imgedit-settings .imgedit-scale input[type="text"], +.imgedit-settings .imgedit-crop-ratio input[type="text"], +.imgedit-settings .imgedit-crop-sel input[type="text"] { + width: 80px; + font-size: 14px; + padding: 0 8px; +} + +.imgedit-separator { + display: inline-block; + width: 7px; + text-align: center; + font-size: 13px; + color: #444; +} + +.imgedit-settings .imgedit-scale-button-wrapper { + margin-top: 0.3077em; + display: block; +} + +.imgedit-settings .imgedit-scale .button { + margin-bottom: 0; +} + +audio, video { + display: inline-block; + max-width: 100%; +} + +.mejs-container { + width: 100%; + max-width: 100%; +} + +.mejs-container .mejs-controls { + box-sizing: border-box; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + .imgedit-wait:before { + background-image: url(../images/spinner-2x.gif); + } +} + +@media screen and (max-width: 782px) { + .wp_attachment_details label[for="content"] { + font-size: 14px; + line-height: 1.5; + } + + .media-upload-form .media-item.error, + .media-upload-form .media-item .error { + font-size: 13px; + line-height: 1.5; + } + + .media-upload-form .media-item.error { + padding: 1px 10px; + } + + .media-upload-form .media-item .error { + padding: 10px 0 10px 12px; + } + + .imgedit-settings .imgedit-scale input[type="text"], + .imgedit-settings .imgedit-crop-ratio input[type="text"], + .imgedit-settings .imgedit-crop-sel input[type="text"] { + font-size: 16px; + padding: 6px 10px; + } + + .wp_attachment_holder .imgedit-wrap .imgedit-panel-content, + .wp_attachment_holder .imgedit-wrap .imgedit-settings { + float: none; + width: auto; + max-width: none; + } +} + +/** + * Media queries for media grid. + */ + +@media only screen and (max-width: 1120px) { + /* override for media-views.css */ + #wp-media-grid .wp-filter .attachment-filters { + max-width: 100%; + } +} + +@media only screen and (max-width: 782px) { + .media-frame.mode-select .attachments-browser.fixed .media-toolbar { + top: 46px; + right: 10px; + } +} + +@media only screen and (max-width: 600px) { + .media-frame.mode-select .attachments-browser.fixed .media-toolbar { + top: 0; + } +} + +@media only screen and (max-width: 480px) { + .edit-attachment-frame .media-frame-title { + right: 110px; + } + + .upload-php .media-modal-close, + .edit-attachment-frame .edit-media-header .left, + .edit-attachment-frame .edit-media-header .right { + width: 40px; + height: 40px; + } + + .edit-attachment-frame .edit-media-header .right:before, + .edit-attachment-frame .edit-media-header .left:before { + line-height: 40px !important; + } + + .edit-attachment-frame .edit-media-header .left { + right: 82px; + } + + .edit-attachment-frame .edit-media-header .right { + right: 41px; + } + + .edit-attachment-frame .media-frame-content { + top: 40px; + } + + .edit-attachment-frame .attachment-media-view { + float: none; + height: auto; + width: 100%; + } + + .edit-attachment-frame .attachment-info { + height: auto; + width: 100%; + } +} + +@media only screen and (max-width: 640px), screen and (max-height: 400px) { + .upload-php .mode-grid .media-sidebar{ + max-width: 100%; + } +} diff --git a/wp-admin/css/media.min.css b/wp-admin/css/media.min.css new file mode 100644 index 0000000..36e6dc9 --- /dev/null +++ b/wp-admin/css/media.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.media-item .describe{border-collapse:collapse;width:100%;border-top:1px solid #ddd;clear:both;cursor:default}.media-item.media-blank .describe{border:0}.media-item .describe th{vertical-align:top;text-align:left;padding:5px 10px 10px;width:140px}.media-item .describe .align th{padding-top:0}.media-item .media-item-info tr{background-color:transparent}.media-item .describe td{padding:0 8px 8px 0;vertical-align:top}.media-item thead.media-item-info td{padding:4px 10px 0}.media-item .media-item-info .A1B1{padding:0 0 0 10px}.media-item td.savesend{padding-bottom:15px}.media-item .thumbnail{max-height:128px;max-width:128px}#wpbody-content #async-upload-wrap a{display:none}.media-upload-form{margin-top:20px}.media-upload-form td label{margin-right:6px;margin-left:2px}.media-upload-form .align .field label{display:inline;padding:0 0 0 23px;margin:0 1em 0 3px;font-weight:600}.media-upload-form tr.image-size label{margin:0 0 0 5px;font-weight:600}.media-upload-form th.label label{font-weight:600;margin:.5em;font-size:13px}.media-upload-form th.label label span{padding:0 5px}.media-item .describe input[type=text],.media-item .describe textarea{width:460px}.media-item .describe p.help{margin:0;padding:0 0 0 5px}.describe-toggle-off,.describe-toggle-on,.media-item .edit-attachment{display:block;line-height:2.76923076;float:right;margin-right:10px}.media-item .describe-toggle-off,.media-item.open .describe-toggle-on{display:none}.media-item.open .describe-toggle-off{display:block}.media-upload-form .media-item{min-height:36px;margin-bottom:1px;position:relative;width:100%;background:#fff}.media-upload-form .media-item,.media-upload-form .media-item .error{box-shadow:0 1px 0 #ddd}#media-items:empty{border:0 none}.media-item .filename{line-height:2.76923076;overflow:hidden;margin-left:6px}.media-item .pinkynail{float:left;margin:2px 10px 0 3px;max-width:40px;max-height:32px}.media-item .startclosed,.media-item .startopen{display:none}.media-item .original{position:relative;height:34px}.media-item .progress{float:right;height:22px;margin:7px 6px;width:200px;line-height:2em;padding:0;overflow:hidden;border-radius:22px;background:#ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.media-item .bar{z-index:9;width:0;height:100%;margin-top:-22px;border-radius:22px;background-color:#0073aa;box-shadow:inset 0 0 2px rgba(0,0,0,.3)}.media-item .progress .percent{z-index:10;position:relative;width:200px;padding:0;color:#fff;text-align:center;line-height:22px;font-weight:400;text-shadow:0 1px 2px rgba(0,0,0,.2)}.upload-php .fixed .column-parent{width:15%}.js .html-uploader #plupload-upload-ui{display:none}.js .html-uploader #html-upload-ui{display:block}.media-upload-form .media-item .error,.media-upload-form .media-item.error{width:auto;margin:0 0 1px 0}.media-upload-form .media-item .error{padding:10px 0 10px 14px}.media-item .error-div button.dismiss{float:right;margin:0 10px 0 15px}.find-box{background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:600px;overflow:hidden;margin-left:-300px;position:fixed;top:30px;bottom:30px;left:50%;z-index:100105}.find-box-head{background:#fcfcfc;border-bottom:1px solid #ddd;height:36px;font-size:18px;font-weight:600;line-height:2;padding:0 36px 0 16px;position:absolute;top:0;left:0;right:0}.find-box-inside{overflow:auto;padding:16px;background-color:#fff;position:absolute;top:37px;bottom:45px;overflow-y:scroll;width:100%;box-sizing:border-box}.find-box-search{padding-bottom:16px}.find-box-search .spinner{float:none;left:105px;position:absolute}#find-posts-response,.find-box-search{position:relative}#find-posts-input,#find-posts-search{float:left}#find-posts-input{width:140px;height:28px;margin:0 4px 0 0}.widefat .found-radio{padding-right:0;width:16px}#find-posts-close{width:36px;height:36px;border:none;padding:0;position:absolute;top:0;right:0;cursor:pointer;text-align:center;background:0 0;color:#666}#find-posts-close:focus,#find-posts-close:hover{color:#00a0d2}#find-posts-close:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:2px solid transparent;outline-offset:-2px}#find-posts-close:before{font:normal 20px/36px dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f158"}.find-box-buttons{padding:8px 16px;background:#fcfcfc;border-top:1px solid #ddd;position:absolute;bottom:0;left:0;right:0}@media screen and (max-width:782px){.find-box-inside{bottom:57px}}@media screen and (max-width:660px){.find-box{top:0;bottom:0;left:0;right:0;margin:0;width:100%}}.ui-find-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100100}.drag-drop #drag-drop-area{border:4px dashed #b4b9be;height:200px}.drag-drop .drag-drop-inside{margin:60px auto 0;width:250px}.drag-drop-inside p{font-size:14px;margin:5px 0;display:none}.drag-drop .drag-drop-inside p{text-align:center}.drag-drop-inside p.drag-drop-info{font-size:20px}.drag-drop .drag-drop-inside p,.drag-drop-inside p.drag-drop-buttons{display:block}.drag-drop.drag-over #drag-drop-area{border-color:#83b4d8}#plupload-upload-ui{position:relative}.media-frame.mode-grid,.media-frame.mode-grid .attachments-browser .attachments,.media-frame.mode-grid .media-frame-content,.media-frame.mode-grid .uploader-inline-content{position:static}.media-frame.mode-grid .media-frame-menu,.media-frame.mode-grid .media-frame-router,.media-frame.mode-grid .media-frame-title{display:none}.media-frame.mode-grid .media-frame-content{background-color:transparent;border:none}.upload-php .mode-grid .media-sidebar{position:relative;width:auto;margin-top:12px;padding:0 16px;border-left:4px solid #dd3d36;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);background-color:#fff}.upload-php .mode-grid .hide-sidebar .media-sidebar{display:none}.upload-php .mode-grid .media-sidebar .media-uploader-status{border-bottom:none;padding-bottom:0;max-width:100%}.upload-php .mode-grid .media-sidebar .upload-error{margin:12px 0;padding:4px 0 0;border:none;box-shadow:none;background:0 0}.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors{top:-10px;right:-14px;padding:10px}.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:before{content:"\f153";display:block;font:normal 16px/1 dashicons;color:#72777c}.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:focus:before,.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:hover:before{color:#c00}.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2{display:none}.media-frame.mode-grid .uploader-inline{position:relative;top:auto;right:auto;left:auto;bottom:auto;padding-top:0;margin-top:20px;border:4px dashed #b4b9be}.media-frame.mode-select .attachments-browser.fixed .attachments{position:relative;top:94px;padding-bottom:94px}.media-frame.mode-grid .attachment.details:focus,.media-frame.mode-grid .attachment:focus,.media-frame.mode-grid .selected.attachment:focus{box-shadow:inset 0 0 2px 3px #f1f1f1,inset 0 0 0 7px #5b9dd9;outline:2px solid transparent;outline-offset:-6px}.media-frame.mode-grid .selected.attachment{box-shadow:inset 0 0 0 5px #f1f1f1,inset 0 0 0 7px #ccc}.media-frame.mode-grid .attachment.details{box-shadow:inset 0 0 0 3px #f1f1f1,inset 0 0 0 7px #1e8cbe}.media-frame.mode-grid.mode-select .attachment .thumbnail{opacity:.65}.media-frame.mode-select .attachment.selected .thumbnail{opacity:1}.media-frame.mode-grid .media-toolbar{margin-bottom:15px;height:auto}.media-frame.mode-grid .media-toolbar select{margin:0 10px 0 0}.media-frame.mode-grid.mode-edit .media-toolbar-secondary>.select-mode-toggle-button{margin:0 8px 0 0;vertical-align:middle}.media-frame.mode-grid .attachments-browser .bulk-select{display:inline-block;margin:0 10px 0 0}.media-frame.mode-grid .search{margin-top:0}.media-search-input-label{margin:0 .2em 0 0;vertical-align:baseline}.media-frame.mode-grid .media-search-input-label{position:static;margin:0 .5em 0 0}.attachments-browser .media-toolbar-secondary>.media-button{margin-right:10px}.media-frame.mode-select .attachments-browser.fixed .media-toolbar{position:fixed;top:32px;left:auto;right:20px;margin-top:0}.media-frame.mode-grid .attachments-browser{padding:0}.media-frame.mode-grid .attachments-browser .attachments{padding:2px}.media-frame.mode-grid .attachments-browser .no-media{color:#666;font-size:18px;font-style:normal;margin:0;padding:100px 0 0;text-align:center}.edit-attachment-frame{display:block;height:100%;width:100%}.edit-attachment-frame .edit-media-header{overflow:hidden}.upload-php .media-modal-close .media-modal-icon:before{content:"\f335";font-size:22px}.edit-attachment-frame .edit-media-header .left,.edit-attachment-frame .edit-media-header .right,.upload-php .media-modal-close{cursor:pointer;color:#72777c;background-color:transparent;height:50px;width:50px;padding:0;position:absolute;text-align:center;border:0;border-left:1px solid #ddd;transition:color .1s ease-in-out,background .1s ease-in-out}.upload-php .media-modal-close{top:0;right:0}.edit-attachment-frame .edit-media-header .left{right:102px}.edit-attachment-frame .edit-media-header .right{right:51px}.edit-attachment-frame .media-frame-title{left:0;right:150px}.edit-attachment-frame .edit-media-header .left:before,.edit-attachment-frame .edit-media-header .right:before{font:normal 20px/50px dashicons!important;display:inline;font-weight:300}.edit-attachment-frame .edit-media-header .left:focus,.edit-attachment-frame .edit-media-header .left:hover,.edit-attachment-frame .edit-media-header .right:focus,.edit-attachment-frame .edit-media-header .right:hover,.upload-php .media-modal-close:focus,.upload-php .media-modal-close:hover{background:#ddd;border-color:#ccc;color:#000;outline:0;box-shadow:none}.edit-attachment-frame .edit-media-header .left:focus,.edit-attachment-frame .edit-media-header .right:focus,.upload-php .media-modal-close:focus{outline:2px solid transparent;outline-offset:-2px}.upload-php .media-modal-close:focus .media-modal-icon:before,.upload-php .media-modal-close:hover .media-modal-icon:before{color:#000}.edit-attachment-frame .edit-media-header .left:before{content:"\f341"}.edit-attachment-frame .edit-media-header .right:before{content:"\f345"}.edit-attachment-frame .edit-media-header [disabled],.edit-attachment-frame .edit-media-header [disabled]:hover{color:#ccc;background:inherit;cursor:default}.edit-attachment-frame .media-frame-content,.edit-attachment-frame .media-frame-router{left:0}.edit-attachment-frame .media-frame-content{border-bottom:none;bottom:0;top:50px}.edit-attachment-frame .attachment-details{position:absolute;overflow:auto;top:0;bottom:0;right:0;left:0;box-shadow:inset 0 4px 4px -4px rgba(0,0,0,.1)}.edit-attachment-frame .attachment-media-view{float:left;width:65%;height:100%}.edit-attachment-frame .attachment-media-view .thumbnail{box-sizing:border-box;padding:16px;height:100%}.edit-attachment-frame .attachment-media-view .details-image{display:block;margin:0 auto 16px;max-width:100%;max-height:90%;max-height:calc(100% - 42px);background-image:linear-gradient(45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4),linear-gradient(45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4);background-position:0 0,10px 10px;background-size:20px 20px}.edit-attachment-frame .attachment-media-view .details-image.icon{background:0 0}.edit-attachment-frame .attachment-media-view .attachment-actions{text-align:center}.edit-attachment-frame .wp-media-wrapper{margin-bottom:12px}.edit-attachment-frame input,.edit-attachment-frame textarea{padding:6px 8px;line-height:1.14285714}.edit-attachment-frame .attachment-info{overflow:auto;box-sizing:border-box;margin-bottom:0;padding:12px 16px 0;width:35%;height:100%;box-shadow:inset 0 4px 4px -4px rgba(0,0,0,.1);border-bottom:0;border-left:1px solid #ddd;background:#f3f3f3}.edit-attachment-frame .attachment-info .details,.edit-attachment-frame .attachment-info .settings{position:relative;overflow:hidden;float:none;margin-bottom:15px;padding-bottom:15px;border-bottom:1px solid #ddd}.edit-attachment-frame .attachment-info .filename{font-weight:400;color:#666}.edit-attachment-frame .attachment-info .thumbnail{margin-bottom:12px}.attachment-info .actions{margin-bottom:16px}.attachment-info .actions a{display:inline;text-decoration:none}.wp_attachment_details .attachment-alt-text{margin-bottom:5px}.wp_attachment_details .attachment-alt-text-description{margin-top:5px}.wp_attachment_details label[for=content]{font-size:13px;line-height:1.5;margin:1em 0}.wp_attachment_details #attachment_caption{height:4em}.describe .image-editor{vertical-align:top}.imgedit-wrap{position:relative;padding-top:10px}.imgedit-settings fieldset,.imgedit-settings p{margin:8px 0}.imgedit-settings legend{margin-bottom:5px}.describe .imgedit-wrap .imgedit-settings{padding:0 5px}.wp_attachment_holder div.updated{margin-top:0}.wp_attachment_holder .imgedit-wrap>div{height:auto}.wp_attachment_holder .imgedit-wrap .imgedit-panel-content{float:left;padding:3px 16px 0 0;min-width:400px;max-width:calc(100% - 266px)}.wp_attachment_holder .imgedit-wrap .imgedit-settings{float:right;width:250px}.imgedit-settings input{margin-top:0;vertical-align:middle}.imgedit-wait{position:absolute;top:0;bottom:0;width:100%;background:#fff;opacity:.7;filter:alpha(opacity=70);display:none}.imgedit-wait:before{content:"";display:block;width:20px;height:20px;position:absolute;left:50%;top:50%;margin:-10px 0 0 -10px;background:transparent url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}.no-float{float:none}.imgedit-settings .disabled,.media-disabled{color:#a0a5aa}.A1B1{overflow:hidden}.A1B1 .button,.wp_attachment_image .button{float:left}.no-js .wp_attachment_image .button{display:none}.A1B1 .spinner,.wp_attachment_image .spinner{float:left}.imgedit-menu{margin:0 0 12px}.imgedit-menu .note-no-rotate{clear:both;margin:0;padding:1em 0 0}.image-editor .imgedit-menu .button{display:inline-block;width:auto;min-height:28px;font-size:13px;line-height:2;margin:0 8px 8px 0;padding:0 10px}.imgedit-menu .button:before{font:normal 16px/1 dashicons;margin-right:8px;speak:none;vertical-align:middle;position:relative;top:-2px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.imgedit-menu .button.disabled{color:#a0a5aa;border-color:#ddd;background:#f7f7f7;box-shadow:none;text-shadow:0 1px 0 #fff;cursor:default;transform:none}.imgedit-crop:before{content:"\f165"}.imgedit-rleft:before{content:"\f166"}.imgedit-rright:before{content:"\f167"}.imgedit-flipv:before{content:"\f168"}.imgedit-fliph:before{content:"\f169"}.imgedit-undo:before{content:"\f171"}.imgedit-redo:before{content:"\f172"}.imgedit-crop-wrap{position:relative}.imgedit-crop-wrap img{background-image:linear-gradient(45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4),linear-gradient(45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4);background-position:0 0,10px 10px;background-size:20px 20px}.imgedit-crop{margin:0 8px 0 0}.imgedit-rleft{margin:0 3px}.imgedit-rright{margin:0 8px 0 3px}.imgedit-flipv{margin:0 3px}.imgedit-fliph{margin:0 8px 0 3px}.imgedit-undo{margin:0 3px}.imgedit-redo{margin:0 8px 0 3px}.imgedit-thumbnail-preview{margin:10px 8px 0 0}.imgedit-thumbnail-preview-caption{display:block}#poststuff .imgedit-group-top h2{display:inline-block;margin:0;padding:0;font-size:14px;line-height:1.4}#poststuff .imgedit-group-top .button-link{text-decoration:none;color:#23282d}.imgedit-applyto .imgedit-label{display:block;padding:.5em 0 0}.imgedit-help{display:none;padding-bottom:8px}.imgedit-help.imgedit-restore{padding-bottom:0}.image-editor .imgedit-settings .imgedit-help-toggle,.image-editor .imgedit-settings .imgedit-help-toggle:active,.image-editor .imgedit-settings .imgedit-help-toggle:hover{border:1px solid transparent;margin:-1px 0 0 -1px;padding:0;background:0 0;color:#0074a2;font-size:20px;line-height:1;cursor:pointer;box-sizing:content-box;box-shadow:none}.image-editor .imgedit-settings .imgedit-help-toggle:focus{color:#0074a2;border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8);outline:2px solid transparent}.form-table td.imgedit-response{padding:0}.imgedit-submit{margin:8px 0 0}.imgedit-submit-btn{margin-left:20px}.imgedit-wrap .nowrap{white-space:nowrap;font-size:12px;line-height:inherit}span.imgedit-scale-warn{color:#dc3232;font-size:20px;font-style:normal;visibility:hidden;vertical-align:middle}.imgedit-save-target{margin:8px 0}.imgedit-save-target legend{font-weight:600}.imgedit-group{margin-bottom:8px;padding:10px}.imgedit-settings .imgedit-original-dimensions{display:inline-block}.imgedit-settings .imgedit-crop-ratio input[type=text],.imgedit-settings .imgedit-crop-sel input[type=text],.imgedit-settings .imgedit-scale input[type=text]{width:80px;font-size:14px;padding:0 8px}.imgedit-separator{display:inline-block;width:7px;text-align:center;font-size:13px;color:#444}.imgedit-settings .imgedit-scale-button-wrapper{margin-top:.3077em;display:block}.imgedit-settings .imgedit-scale .button{margin-bottom:0}audio,video{display:inline-block;max-width:100%}.mejs-container{width:100%;max-width:100%}.mejs-container .mejs-controls{box-sizing:border-box}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.imgedit-wait:before{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){.wp_attachment_details label[for=content]{font-size:14px;line-height:1.5}.media-upload-form .media-item .error,.media-upload-form .media-item.error{font-size:13px;line-height:1.5}.media-upload-form .media-item.error{padding:1px 10px}.media-upload-form .media-item .error{padding:10px 0 10px 12px}.imgedit-settings .imgedit-crop-ratio input[type=text],.imgedit-settings .imgedit-crop-sel input[type=text],.imgedit-settings .imgedit-scale input[type=text]{font-size:16px;padding:6px 10px}.wp_attachment_holder .imgedit-wrap .imgedit-panel-content,.wp_attachment_holder .imgedit-wrap .imgedit-settings{float:none;width:auto;max-width:none}}@media only screen and (max-width:1120px){#wp-media-grid .wp-filter .attachment-filters{max-width:100%}}@media only screen and (max-width:782px){.media-frame.mode-select .attachments-browser.fixed .media-toolbar{top:46px;right:10px}}@media only screen and (max-width:600px){.media-frame.mode-select .attachments-browser.fixed .media-toolbar{top:0}}@media only screen and (max-width:480px){.edit-attachment-frame .media-frame-title{right:110px}.edit-attachment-frame .edit-media-header .left,.edit-attachment-frame .edit-media-header .right,.upload-php .media-modal-close{width:40px;height:40px}.edit-attachment-frame .edit-media-header .left:before,.edit-attachment-frame .edit-media-header .right:before{line-height:40px!important}.edit-attachment-frame .edit-media-header .left{right:82px}.edit-attachment-frame .edit-media-header .right{right:41px}.edit-attachment-frame .media-frame-content{top:40px}.edit-attachment-frame .attachment-media-view{float:none;height:auto;width:100%}.edit-attachment-frame .attachment-info{height:auto;width:100%}}@media only screen and (max-width:640px),screen and (max-height:400px){.upload-php .mode-grid .media-sidebar{max-width:100%}} \ No newline at end of file diff --git a/wp-admin/css/nav-menus-rtl.css b/wp-admin/css/nav-menus-rtl.css new file mode 100644 index 0000000..40ddfc3 --- /dev/null +++ b/wp-admin/css/nav-menus-rtl.css @@ -0,0 +1,910 @@ +/*! This file is auto-generated */ +/* nav-menu */ + +/* @todo: determine if this is truly for nav menus only */ +.no-js #message { + display: block; +} + +ul.add-menu-item-tabs li { + padding: 3px 8px 4px 5px; +} + +.accordion-section ul.category-tabs, +.accordion-section ul.add-menu-item-tabs, +.accordion-section ul.wp-tab-bar { + margin: 0; +} + +.accordion-section .categorychecklist { + margin: 13px 0; +} + +#nav-menu-meta .accordion-section-content { + padding: 18px 13px; +} + +#nav-menu-meta .button-controls { + margin-bottom: 0; +} + +.has-no-menu-item .button-controls { + display: none; +} + +#nav-menus-frame { + margin-right: 300px; + margin-top: 23px; +} + +#wpbody-content #menu-settings-column { + display: inline; + width: 281px; + margin-right: -300px; + clear: both; + float: right; + padding-top: 0; +} + +#menu-settings-column .inside { + clear: both; + margin: 10px 0 0; +} + +.metabox-holder-disabled .postbox, +.metabox-holder-disabled .accordion-section-content, +.metabox-holder-disabled .accordion-section-title { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.metabox-holder-disabled .button-controls .select-all { + display: none; +} + +#wpbody { + position: relative; +} + +.blank-slate .menu-settings { + border: none; + margin-top: 0; + padding-top: 0; + overflow: hidden; +} + +.is-submenu { + color: #555d66; /* #fafafa background */ + font-style: italic; + font-weight: 400; + margin-right: 4px; +} + +.manage-menus { + margin-top: 23px; + padding: 10px; + overflow: hidden; + background: #fbfbfb; +} + +.manage-menus .selected-menu, +.manage-menus select, +.manage-menus .submit-btn, +.nav-menus-php .add-new-menu-action { + display: inline-block; + margin-left: 3px; + vertical-align: middle; +} + +.manage-menus select, +.menu-location-menus select { + max-width: 100%; +} + +.menu-edit #post-body-content h3 { + margin: 1em 0 10px; +} + +.menu-settings { + border-top: 1px solid #eee; + margin-top: 2em; +} + +.menu-settings-group { + margin: 0 0 10px; + overflow: hidden; + padding-right: 20%; +} + +.menu-settings-group:last-of-type { + margin-bottom: 0; +} + +.menu-settings-input { + float: right; + margin: 0; + width: 100%; +} + +.menu-settings-group-name { + float: right; + clear: both; + width: 25%; + padding: 3px 0 0; + margin-right: -25%; /* 20 container left padding x ( 100 container % width / 80 this % width ) */ +} + +.menu-settings label { + vertical-align: baseline; +} + +.menu-edit .checkbox-input { + margin-top: 4px; +} + +.theme-location-set { + color: #72777c; + font-size: 11px; +} + +/* Menu Container */ + +/* @todo: responsive view. */ +#menu-management-liquid { + float: right; + min-width: 100%; + margin-top: 3px; +} + +/* @todo: responsive view. */ +#menu-management { + position: relative; + margin-left: 20px; + margin-top: -3px; + width: 100%; +} + +#menu-management .menu-edit { + margin-bottom: 20px; +} + +.nav-menus-php #post-body { + padding: 0 10px; + border-top: 1px solid #fff; + border-bottom: 1px solid #ddd; + background: #fff; +} + +#nav-menu-header, +#nav-menu-footer { + padding: 0 10px; + background: #f5f5f5; +} + +#nav-menu-header { + border-bottom: 1px solid #ddd; + margin-bottom: 0; +} + +#nav-menu-header .menu-name-label { + display: inline-block; + vertical-align: middle; + margin-left: 7px; + font-style: italic; +} + +.nav-menus-php #post-body div.updated, +.nav-menus-php #post-body div.error { + margin: 0; +} + +.nav-menus-php #post-body-content { + position: relative; + float: none; +} + +.nav-menus-php #post-body-content .post-body-plain { + margin-bottom: 0; +} + +#menu-management .menu-add-new abbr { + font-weight: 600; +} + +#select-nav-menu-container { + text-align: left; + padding: 0 10px 3px 10px; + margin-bottom: 5px; +} + +#select-nav-menu { + width: 100px; + display: inline; +} + +#menu-name-label { + margin-top: -2px; +} + +.widefat .menu-locations .menu-location-title { + padding: 13px 10px 0; +} + +.menu-location-title label { + font-weight: 600; +} + +.menu-location-menus select { + float: right; +} + +#locations-nav-menu-wrapper { + padding: 5px 0; +} + +.locations-nav-menu-select select { + float: right; + width: 160px; + margin-left: 5px; +} + +.locations-row-links { + float: right; + margin: 6px 6px 0 0; +} + +.locations-edit-menu-link, +.locations-add-menu-link { + margin: 0 3px; +} + +.locations-edit-menu-link { + padding-left: 3px; + border-left: 1px solid #ccc; +} + +#menu-management .inside { + padding: 0 10px; +} + +/* Add Menu Item Boxes */ +.postbox .howto input, +.customlinkdiv .menu-item-textbox { + width: 180px; + float: left; +} + +.accordion-container .outer-border { + margin: 0; +} + +.customlinkdiv p { + margin-top: 0 +} + +#nav-menu-theme-locations .howto select { + width: 100%; +} + +#nav-menu-theme-locations .button-controls { + text-align: left; +} + +.add-menu-item-view-all { + height: 400px; +} + +/* Button Primary Actions */ +#menu-container .submit { + margin: 0 0 10px; + padding: 0; +} + +/* @todo: is this actually used? */ +#cancel-save { + text-decoration: underline; + font-size: 12px; + margin-right: 20px; + margin-top: 5px; +} + +.button.right, .button-secondary.right, .button-primary.right { + float: left; +} + +/* Button Secondary Actions */ +.list-controls { + float: right; + margin-top: 5px; +} + +.add-to-menu { + float: left; +} + +.button-controls { + clear: both; + margin: 10px 0; +} + +.show-all, +.hide-all { + cursor: pointer; +} + +.hide-all { + display: none; +} + +/* Create Menu */ +#menu-name { + width: 270px; + vertical-align: middle; +} + +#manage-menu .inside { + padding: 0px 0px; +} + +/* Custom Links */ +#available-links dt { + display: block; +} + +#add-custom-link .howto { + font-size: 12px; +} + +#add-custom-link label span { + display: block; + float: right; + margin-top: 5px; + padding-left: 5px; +} + +.menu-item-textbox { + width: 180px; +} + +.customlinkdiv label, +.nav-menus-php .howto span { + float: right; + margin-top: 6px; +} + +/* Menu item types */ +.quick-search { + width: 190px; +} + +.quick-search-wrap .spinner { + float: none; + margin: -3px 0 0 -10px; +} + +.nav-menus-php .list-wrap { + display: none; + clear: both; + margin-bottom: 10px; +} + +.nav-menus-php .postbox p.submit { + margin-bottom: 0; +} + +/* Listings */ +.nav-menus-php .list li { + display: none; + margin: 0; + margin-bottom: 5px; +} + +.nav-menus-php .list li .menu-item-title { + cursor: pointer; + display: block; +} + +.nav-menus-php .list li .menu-item-title input { + margin-left: 3px; + margin-top: -3px; +} + +.menu-item-title input[type=checkbox] { + display: inline-block; + margin-top: -4px; +} + +.menu-item-title .post-state { + font-weight: 600; +} + +/* Nav Menu */ +#menu-container .inside { + padding-bottom: 10px; +} + +.menu { + padding-top: 1em; +} + +#menu-to-edit { + margin: 0; + padding: 0.1em 0; +} + +.menu ul { + width: 100%; +} + +.menu li { + margin-bottom: 0; + position: relative; +} + +.menu-item-bar { + clear: both; + line-height: 1.5; + position: relative; + margin: 9px 0 0; +} + +.menu-item-bar .menu-item-handle { + border: 1px solid #ddd; + position: relative; + padding: 10px 15px; + height: auto; + min-height: 20px; + width: 382px; + line-height: 2.30769230; + overflow: hidden; + word-wrap: break-word; +} + +.menu-item-bar .menu-item-handle:hover { + border-color: #999; +} + +#menu-to-edit .menu-item-invalid .menu-item-handle { + background: #f6c9cc; + border-color: #f1acb1; +} + +.no-js .menu-item-edit-active .item-edit { + display: none; +} + +.js .menu-item-handle { + cursor: move; +} + +.menu li.deleting .menu-item-handle { + background-image: none; + background-color: #f66; +} + +.menu-item-handle .item-title { + font-size: 13px; + font-weight: 600; + line-height: 1.53846153; + display: block; + /* @todo: responsive view. */ + margin-left: 13em; +} + +.menu-item-handle .menu-item-title.no-title { + color: #72777c; +} + +/* Sortables */ +li.menu-item.ui-sortable-helper .menu-item-bar { + margin-top: 0; +} + +li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar { + margin-top: 9px; /* Must use the same value used by the dragged item .menu-item-bar */ +} + +.menu .sortable-placeholder { + height: 35px; + width: 410px; + margin-top: 9px; /* Must use the same value used by the dragged item .menu-item-bar */ +} + +/* Hide the transport list when it's empty */ +.menu-item .menu-item-transport:empty { + display: none; +} + +/* WARNING: The factor of 30px is hardcoded into the nav-menus JavaScript. */ +.menu-item-depth-0 { margin-right: 0px; } +.menu-item-depth-1 { margin-right: 30px; } +.menu-item-depth-2 { margin-right: 60px; } +.menu-item-depth-3 { margin-right: 90px; } +.menu-item-depth-4 { margin-right: 120px; } +.menu-item-depth-5 { margin-right: 150px; } +.menu-item-depth-6 { margin-right: 180px; } +.menu-item-depth-7 { margin-right: 210px; } +.menu-item-depth-8 { margin-right: 240px; } +.menu-item-depth-9 { margin-right: 270px; } +.menu-item-depth-10 { margin-right: 300px; } +.menu-item-depth-11 { margin-right: 330px; } + +.menu-item-depth-0 .menu-item-transport { margin-right: 0px; } +.menu-item-depth-1 .menu-item-transport { margin-right: -30px; } +.menu-item-depth-2 .menu-item-transport { margin-right: -60px; } +.menu-item-depth-3 .menu-item-transport { margin-right: -90px; } +.menu-item-depth-4 .menu-item-transport { margin-right: -120px; } +.menu-item-depth-5 .menu-item-transport { margin-right: -150px; } +.menu-item-depth-6 .menu-item-transport { margin-right: -180px; } +.menu-item-depth-7 .menu-item-transport { margin-right: -210px; } +.menu-item-depth-8 .menu-item-transport { margin-right: -240px; } +.menu-item-depth-9 .menu-item-transport { margin-right: -270px; } +.menu-item-depth-10 .menu-item-transport { margin-right: -300px; } +.menu-item-depth-11 .menu-item-transport { margin-right: -330px; } + +body.menu-max-depth-0 { min-width: 950px !important; } +body.menu-max-depth-1 { min-width: 980px !important; } +body.menu-max-depth-2 { min-width: 1010px !important; } +body.menu-max-depth-3 { min-width: 1040px !important; } +body.menu-max-depth-4 { min-width: 1070px !important; } +body.menu-max-depth-5 { min-width: 1100px !important; } +body.menu-max-depth-6 { min-width: 1130px !important; } +body.menu-max-depth-7 { min-width: 1160px !important; } +body.menu-max-depth-8 { min-width: 1190px !important; } +body.menu-max-depth-9 { min-width: 1220px !important; } +body.menu-max-depth-10 { min-width: 1250px !important; } +body.menu-max-depth-11 { min-width: 1280px !important; } + +/* Menu item controls */ +.item-type { + display: inline-block; + padding: 12px 16px; + color: #666; + font-size: 12px; + line-height: 1.5; +} + +.item-controls { + font-size: 12px; + position: absolute; + left: 20px; + top: -1px; +} + +.item-controls a { + text-decoration: none; +} + +.item-controls a:hover { + cursor: pointer; +} + +.item-controls .item-order { + padding-left: 10px; +} + +.nav-menus-php .item-edit { + position: absolute; + left: -20px; + top: 0; + display: block; + width: 30px; + height: 40px; + outline: none; +} + +.no-js.nav-menus-php .item-edit { + position: static; + float: left; + width: auto; + height: auto; + margin: 12px 0 12px -10px; + padding: 0; + color: #0073aa; + text-decoration: underline; + font-size: 12px; + line-height: 1.5; +} + +.no-js.nav-menus-php .item-edit .screen-reader-text { + position: static; + -webkit-clip-path: none; + clip-path: none; + width: auto; + height: auto; + margin: 0; +} + +.nav-menus-php .item-edit:before { + margin-top: 10px; + margin-right: 4px; + width: 20px; + border-radius: 50%; + text-indent: -1px; /* account for the dashicon alignment */ +} + +.no-js.nav-menus-php .item-edit:before { + display: none; +} + +.rtl .nav-menus-php .item-edit:before { + text-indent: 1px; /* account for the dashicon alignment */ +} + +.js.nav-menus-php .item-edit:focus { + box-shadow: none; +} + +.nav-menus-php .item-edit:focus:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +/* Menu editing */ +.menu-instructions-inactive { + display: none; +} + +.menu-item-settings { + display: block; + width: 402px; + padding: 10px 10px 10px 0; + position: relative; + z-index: 10; /* Keep .item-title's shadow from appearing on top of .menu-item-settings */ + border: 1px solid #ccd0d4; + border-top: none; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); +} + +.menu-item-settings .field-move { + margin: 3px 0 5px; + line-height: 1.5; +} + +.field-move-visual-label { + float: right; + margin-left: 4px; + font-style: italic; +} + +.menu-item-settings .field-move .button-link { + display: none; + margin: 0 2px; + font-style: italic; +} + +.menu-item-edit-active .menu-item-settings { + display: block; +} + +.menu-item-edit-inactive .menu-item-settings { + display: none; +} + +.add-menu-item-pagelinks { + margin: .5em -10px; + text-align: center; +} + +.add-menu-item-pagelinks .page-numbers { + display: inline-block; + min-width: 20px; +} + +.add-menu-item-pagelinks .page-numbers.dots { + min-width: 0; +} + +.link-to-original { + display: block; + margin: 0 0 15px; + padding: 3px 5px 5px; + border: 1px solid #ddd; + color: #72777c; + font-size: 12px; + font-style: italic; +} + +.link-to-original a { + padding-right: 4px; + font-style: normal; +} + +.hidden-field { + display: none; +} + +.menu-item-settings .description-thin, +.menu-item-settings .description-wide { + margin-left: 10px; + float: right; +} + +.description-thin { + width: 190px; +} + +.description-wide { + width: 390px; +} + +.menu-item-actions { + padding-top: 15px; + padding-bottom: 7px; +} + +#cancel-save { + cursor: pointer; +} + +/* Major/minor publishing actions (classes) */ +.nav-menus-php .major-publishing-actions { + clear: both; + padding: 10px 0; + line-height: 2.15384615; +} + +.nav-menus-php .major-publishing-actions .publishing-action { + text-align: left; + float: left; +} + +.nav-menus-php .blank-slate .menu-settings { + display: none; +} + +/* Same as the Publish Meta Box #delete-action */ +.nav-menus-php .delete-action { + float: right; + line-height: 2.1; +} + +.nav-menus-php .major-publishing-actions .form-invalid { + padding-right: 4px; + margin-right: -4px; +} + +#nav-menus-frame, +.button-controls, +#menu-item-url-wrap, +#menu-item-name-wrap { + display: block; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +@media only screen and (min-width: 769px) and (max-width: 1000px){ + body.menu-max-depth-0 { + min-width: 0 !important; + } + + #menu-management-liquid{ + width: 100%; + } + + .nav-menus-php #post-body-content{ + min-width: 0; + } + + .menu-item-bar .menu-item-handle{ + width: 90%; + } +} + +@media screen and (max-width: 782px) { + body.nav-menus-php, + body.wp-customizer { + min-width: 0 !important; + } + + #nav-menus-frame { + margin-right: 0; + float: none; + width: 100%; + } + + #wpbody-content #menu-settings-column { + display: block; + width: 100%; + float: none; + margin-right: 0; + } + + #side-sortables .add-menu-item-tabs { + margin: 15px 0 14px; + } + + ul.add-menu-item-tabs li.tabs { + padding: 13px 15px 14px; + } + + .nav-menus-php .customlinkdiv .howto input { + width: 65%; + } + + .nav-menus-php .quick-search { + width: 85%; + } + + #menu-management-liquid { + margin-top: 25px; + } + + .nav-menus-php .menu-name-label.howto span { + margin-top: 13px + } + + #menu-name { + width: 100%; + } + + .nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action { + padding-top: 1em; + } + + .nav-menus-php .delete-action { + font-size: 14px; + line-height: 2.14285714; + } + + .menu-item-bar .menu-item-handle, + .menu-item-settings, + .description-wide { + width: auto; + } + + .menu-item-settings { + padding: 10px; + } + + .menu-item-settings .description-thin, + .menu-item-settings .description-wide { + width: 100%; + } + + .menu-item-settings input { + width: 100%; + } + + .menu-item-settings input[type="checkbox"], + .menu-item-settings input[type="radio"] { + width: 25px; + } + + .menu-settings-group { + padding-right: 0; + } + + .menu-settings-group-name { + float: none; + width: auto; + margin-right: 0; + margin-bottom: 15px; + } + + .menu-settings-input { + float: none; + margin-bottom: 15px; + } + + .menu-edit .checkbox-input { + margin-top: 0; + } + + .manage-menus select { + margin: 0.5em 0; + } + + .widefat .menu-locations .menu-location-title { + padding-top: 16px; + } +} + +@media only screen and (max-width: 768px) { + /* menu locations */ + #menu-locations-wrap .widefat { + width: 100%; + } +} diff --git a/wp-admin/css/nav-menus-rtl.min.css b/wp-admin/css/nav-menus-rtl.min.css new file mode 100644 index 0000000..72af050 --- /dev/null +++ b/wp-admin/css/nav-menus-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.no-js #message{display:block}ul.add-menu-item-tabs li{padding:3px 8px 4px 5px}.accordion-section ul.add-menu-item-tabs,.accordion-section ul.category-tabs,.accordion-section ul.wp-tab-bar{margin:0}.accordion-section .categorychecklist{margin:13px 0}#nav-menu-meta .accordion-section-content{padding:18px 13px}#nav-menu-meta .button-controls{margin-bottom:0}.has-no-menu-item .button-controls{display:none}#nav-menus-frame{margin-right:300px;margin-top:23px}#wpbody-content #menu-settings-column{display:inline;width:281px;margin-right:-300px;clear:both;float:right;padding-top:0}#menu-settings-column .inside{clear:both;margin:10px 0 0}.metabox-holder-disabled .accordion-section-content,.metabox-holder-disabled .accordion-section-title,.metabox-holder-disabled .postbox{opacity:.5;filter:alpha(opacity=50)}.metabox-holder-disabled .button-controls .select-all{display:none}#wpbody{position:relative}.blank-slate .menu-settings{border:none;margin-top:0;padding-top:0;overflow:hidden}.is-submenu{color:#555d66;font-style:italic;font-weight:400;margin-right:4px}.manage-menus{margin-top:23px;padding:10px;overflow:hidden;background:#fbfbfb}.manage-menus .selected-menu,.manage-menus .submit-btn,.manage-menus select,.nav-menus-php .add-new-menu-action{display:inline-block;margin-left:3px;vertical-align:middle}.manage-menus select,.menu-location-menus select{max-width:100%}.menu-edit #post-body-content h3{margin:1em 0 10px}.menu-settings{border-top:1px solid #eee;margin-top:2em}.menu-settings-group{margin:0 0 10px;overflow:hidden;padding-right:20%}.menu-settings-group:last-of-type{margin-bottom:0}.menu-settings-input{float:right;margin:0;width:100%}.menu-settings-group-name{float:right;clear:both;width:25%;padding:3px 0 0;margin-right:-25%}.menu-settings label{vertical-align:baseline}.menu-edit .checkbox-input{margin-top:4px}.theme-location-set{color:#72777c;font-size:11px}#menu-management-liquid{float:right;min-width:100%;margin-top:3px}#menu-management{position:relative;margin-left:20px;margin-top:-3px;width:100%}#menu-management .menu-edit{margin-bottom:20px}.nav-menus-php #post-body{padding:0 10px;border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#fff}#nav-menu-footer,#nav-menu-header{padding:0 10px;background:#f5f5f5}#nav-menu-header{border-bottom:1px solid #ddd;margin-bottom:0}#nav-menu-header .menu-name-label{display:inline-block;vertical-align:middle;margin-left:7px;font-style:italic}.nav-menus-php #post-body div.error,.nav-menus-php #post-body div.updated{margin:0}.nav-menus-php #post-body-content{position:relative;float:none}.nav-menus-php #post-body-content .post-body-plain{margin-bottom:0}#menu-management .menu-add-new abbr{font-weight:600}#select-nav-menu-container{text-align:left;padding:0 10px 3px 10px;margin-bottom:5px}#select-nav-menu{width:100px;display:inline}#menu-name-label{margin-top:-2px}.widefat .menu-locations .menu-location-title{padding:13px 10px 0}.menu-location-title label{font-weight:600}.menu-location-menus select{float:right}#locations-nav-menu-wrapper{padding:5px 0}.locations-nav-menu-select select{float:right;width:160px;margin-left:5px}.locations-row-links{float:right;margin:6px 6px 0 0}.locations-add-menu-link,.locations-edit-menu-link{margin:0 3px}.locations-edit-menu-link{padding-left:3px;border-left:1px solid #ccc}#menu-management .inside{padding:0 10px}.customlinkdiv .menu-item-textbox,.postbox .howto input{width:180px;float:left}.accordion-container .outer-border{margin:0}.customlinkdiv p{margin-top:0}#nav-menu-theme-locations .howto select{width:100%}#nav-menu-theme-locations .button-controls{text-align:left}.add-menu-item-view-all{height:400px}#menu-container .submit{margin:0 0 10px;padding:0}#cancel-save{text-decoration:underline;font-size:12px;margin-right:20px;margin-top:5px}.button-primary.right,.button-secondary.right,.button.right{float:left}.list-controls{float:right;margin-top:5px}.add-to-menu{float:left}.button-controls{clear:both;margin:10px 0}.hide-all,.show-all{cursor:pointer}.hide-all{display:none}#menu-name{width:270px;vertical-align:middle}#manage-menu .inside{padding:0 0}#available-links dt{display:block}#add-custom-link .howto{font-size:12px}#add-custom-link label span{display:block;float:right;margin-top:5px;padding-left:5px}.menu-item-textbox{width:180px}.customlinkdiv label,.nav-menus-php .howto span{float:right;margin-top:6px}.quick-search{width:190px}.quick-search-wrap .spinner{float:none;margin:-3px 0 0 -10px}.nav-menus-php .list-wrap{display:none;clear:both;margin-bottom:10px}.nav-menus-php .postbox p.submit{margin-bottom:0}.nav-menus-php .list li{display:none;margin:0;margin-bottom:5px}.nav-menus-php .list li .menu-item-title{cursor:pointer;display:block}.nav-menus-php .list li .menu-item-title input{margin-left:3px;margin-top:-3px}.menu-item-title input[type=checkbox]{display:inline-block;margin-top:-4px}.menu-item-title .post-state{font-weight:600}#menu-container .inside{padding-bottom:10px}.menu{padding-top:1em}#menu-to-edit{margin:0;padding:.1em 0}.menu ul{width:100%}.menu li{margin-bottom:0;position:relative}.menu-item-bar{clear:both;line-height:1.5;position:relative;margin:9px 0 0}.menu-item-bar .menu-item-handle{border:1px solid #ddd;position:relative;padding:10px 15px;height:auto;min-height:20px;width:382px;line-height:2.30769230;overflow:hidden;word-wrap:break-word}.menu-item-bar .menu-item-handle:hover{border-color:#999}#menu-to-edit .menu-item-invalid .menu-item-handle{background:#f6c9cc;border-color:#f1acb1}.no-js .menu-item-edit-active .item-edit{display:none}.js .menu-item-handle{cursor:move}.menu li.deleting .menu-item-handle{background-image:none;background-color:#f66}.menu-item-handle .item-title{font-size:13px;font-weight:600;line-height:1.53846153;display:block;margin-left:13em}.menu-item-handle .menu-item-title.no-title{color:#72777c}li.menu-item.ui-sortable-helper .menu-item-bar{margin-top:0}li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar{margin-top:9px}.menu .sortable-placeholder{height:35px;width:410px;margin-top:9px}.menu-item .menu-item-transport:empty{display:none}.menu-item-depth-0{margin-right:0}.menu-item-depth-1{margin-right:30px}.menu-item-depth-2{margin-right:60px}.menu-item-depth-3{margin-right:90px}.menu-item-depth-4{margin-right:120px}.menu-item-depth-5{margin-right:150px}.menu-item-depth-6{margin-right:180px}.menu-item-depth-7{margin-right:210px}.menu-item-depth-8{margin-right:240px}.menu-item-depth-9{margin-right:270px}.menu-item-depth-10{margin-right:300px}.menu-item-depth-11{margin-right:330px}.menu-item-depth-0 .menu-item-transport{margin-right:0}.menu-item-depth-1 .menu-item-transport{margin-right:-30px}.menu-item-depth-2 .menu-item-transport{margin-right:-60px}.menu-item-depth-3 .menu-item-transport{margin-right:-90px}.menu-item-depth-4 .menu-item-transport{margin-right:-120px}.menu-item-depth-5 .menu-item-transport{margin-right:-150px}.menu-item-depth-6 .menu-item-transport{margin-right:-180px}.menu-item-depth-7 .menu-item-transport{margin-right:-210px}.menu-item-depth-8 .menu-item-transport{margin-right:-240px}.menu-item-depth-9 .menu-item-transport{margin-right:-270px}.menu-item-depth-10 .menu-item-transport{margin-right:-300px}.menu-item-depth-11 .menu-item-transport{margin-right:-330px}body.menu-max-depth-0{min-width:950px!important}body.menu-max-depth-1{min-width:980px!important}body.menu-max-depth-2{min-width:1010px!important}body.menu-max-depth-3{min-width:1040px!important}body.menu-max-depth-4{min-width:1070px!important}body.menu-max-depth-5{min-width:1100px!important}body.menu-max-depth-6{min-width:1130px!important}body.menu-max-depth-7{min-width:1160px!important}body.menu-max-depth-8{min-width:1190px!important}body.menu-max-depth-9{min-width:1220px!important}body.menu-max-depth-10{min-width:1250px!important}body.menu-max-depth-11{min-width:1280px!important}.item-type{display:inline-block;padding:12px 16px;color:#666;font-size:12px;line-height:1.5}.item-controls{font-size:12px;position:absolute;left:20px;top:-1px}.item-controls a{text-decoration:none}.item-controls a:hover{cursor:pointer}.item-controls .item-order{padding-left:10px}.nav-menus-php .item-edit{position:absolute;left:-20px;top:0;display:block;width:30px;height:40px;outline:0}.no-js.nav-menus-php .item-edit{position:static;float:left;width:auto;height:auto;margin:12px 0 12px -10px;padding:0;color:#0073aa;text-decoration:underline;font-size:12px;line-height:1.5}.no-js.nav-menus-php .item-edit .screen-reader-text{position:static;-webkit-clip-path:none;clip-path:none;width:auto;height:auto;margin:0}.nav-menus-php .item-edit:before{margin-top:10px;margin-right:4px;width:20px;border-radius:50%;text-indent:-1px}.no-js.nav-menus-php .item-edit:before{display:none}.rtl .nav-menus-php .item-edit:before{text-indent:1px}.js.nav-menus-php .item-edit:focus{box-shadow:none}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.menu-instructions-inactive{display:none}.menu-item-settings{display:block;width:402px;padding:10px 10px 10px 0;position:relative;z-index:10;border:1px solid #ccd0d4;border-top:none;box-shadow:0 1px 1px rgba(0,0,0,.04)}.menu-item-settings .field-move{margin:3px 0 5px;line-height:1.5}.field-move-visual-label{float:right;margin-left:4px;font-style:italic}.menu-item-settings .field-move .button-link{display:none;margin:0 2px;font-style:italic}.menu-item-edit-active .menu-item-settings{display:block}.menu-item-edit-inactive .menu-item-settings{display:none}.add-menu-item-pagelinks{margin:.5em -10px;text-align:center}.add-menu-item-pagelinks .page-numbers{display:inline-block;min-width:20px}.add-menu-item-pagelinks .page-numbers.dots{min-width:0}.link-to-original{display:block;margin:0 0 15px;padding:3px 5px 5px;border:1px solid #ddd;color:#72777c;font-size:12px;font-style:italic}.link-to-original a{padding-right:4px;font-style:normal}.hidden-field{display:none}.menu-item-settings .description-thin,.menu-item-settings .description-wide{margin-left:10px;float:right}.description-thin{width:190px}.description-wide{width:390px}.menu-item-actions{padding-top:15px;padding-bottom:7px}#cancel-save{cursor:pointer}.nav-menus-php .major-publishing-actions{clear:both;padding:10px 0;line-height:2.15384615}.nav-menus-php .major-publishing-actions .publishing-action{text-align:left;float:left}.nav-menus-php .blank-slate .menu-settings{display:none}.nav-menus-php .delete-action{float:right;line-height:2.1}.nav-menus-php .major-publishing-actions .form-invalid{padding-right:4px;margin-right:-4px}#menu-item-name-wrap,#menu-item-url-wrap,#nav-menus-frame,.button-controls{display:block}@media only screen and (min-width:769px) and (max-width:1000px){body.menu-max-depth-0{min-width:0!important}#menu-management-liquid{width:100%}.nav-menus-php #post-body-content{min-width:0}.menu-item-bar .menu-item-handle{width:90%}}@media screen and (max-width:782px){body.nav-menus-php,body.wp-customizer{min-width:0!important}#nav-menus-frame{margin-right:0;float:none;width:100%}#wpbody-content #menu-settings-column{display:block;width:100%;float:none;margin-right:0}#side-sortables .add-menu-item-tabs{margin:15px 0 14px}ul.add-menu-item-tabs li.tabs{padding:13px 15px 14px}.nav-menus-php .customlinkdiv .howto input{width:65%}.nav-menus-php .quick-search{width:85%}#menu-management-liquid{margin-top:25px}.nav-menus-php .menu-name-label.howto span{margin-top:13px}#menu-name{width:100%}.nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action{padding-top:1em}.nav-menus-php .delete-action{font-size:14px;line-height:2.14285714}.description-wide,.menu-item-bar .menu-item-handle,.menu-item-settings{width:auto}.menu-item-settings{padding:10px}.menu-item-settings .description-thin,.menu-item-settings .description-wide{width:100%}.menu-item-settings input{width:100%}.menu-item-settings input[type=checkbox],.menu-item-settings input[type=radio]{width:25px}.menu-settings-group{padding-right:0}.menu-settings-group-name{float:none;width:auto;margin-right:0;margin-bottom:15px}.menu-settings-input{float:none;margin-bottom:15px}.menu-edit .checkbox-input{margin-top:0}.manage-menus select{margin:.5em 0}.widefat .menu-locations .menu-location-title{padding-top:16px}}@media only screen and (max-width:768px){#menu-locations-wrap .widefat{width:100%}} \ No newline at end of file diff --git a/wp-admin/css/nav-menus.css b/wp-admin/css/nav-menus.css new file mode 100644 index 0000000..8b68ac5 --- /dev/null +++ b/wp-admin/css/nav-menus.css @@ -0,0 +1,909 @@ +/* nav-menu */ + +/* @todo: determine if this is truly for nav menus only */ +.no-js #message { + display: block; +} + +ul.add-menu-item-tabs li { + padding: 3px 5px 4px 8px; +} + +.accordion-section ul.category-tabs, +.accordion-section ul.add-menu-item-tabs, +.accordion-section ul.wp-tab-bar { + margin: 0; +} + +.accordion-section .categorychecklist { + margin: 13px 0; +} + +#nav-menu-meta .accordion-section-content { + padding: 18px 13px; +} + +#nav-menu-meta .button-controls { + margin-bottom: 0; +} + +.has-no-menu-item .button-controls { + display: none; +} + +#nav-menus-frame { + margin-left: 300px; + margin-top: 23px; +} + +#wpbody-content #menu-settings-column { + display: inline; + width: 281px; + margin-left: -300px; + clear: both; + float: left; + padding-top: 0; +} + +#menu-settings-column .inside { + clear: both; + margin: 10px 0 0; +} + +.metabox-holder-disabled .postbox, +.metabox-holder-disabled .accordion-section-content, +.metabox-holder-disabled .accordion-section-title { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.metabox-holder-disabled .button-controls .select-all { + display: none; +} + +#wpbody { + position: relative; +} + +.blank-slate .menu-settings { + border: none; + margin-top: 0; + padding-top: 0; + overflow: hidden; +} + +.is-submenu { + color: #555d66; /* #fafafa background */ + font-style: italic; + font-weight: 400; + margin-left: 4px; +} + +.manage-menus { + margin-top: 23px; + padding: 10px; + overflow: hidden; + background: #fbfbfb; +} + +.manage-menus .selected-menu, +.manage-menus select, +.manage-menus .submit-btn, +.nav-menus-php .add-new-menu-action { + display: inline-block; + margin-right: 3px; + vertical-align: middle; +} + +.manage-menus select, +.menu-location-menus select { + max-width: 100%; +} + +.menu-edit #post-body-content h3 { + margin: 1em 0 10px; +} + +.menu-settings { + border-top: 1px solid #eee; + margin-top: 2em; +} + +.menu-settings-group { + margin: 0 0 10px; + overflow: hidden; + padding-left: 20%; +} + +.menu-settings-group:last-of-type { + margin-bottom: 0; +} + +.menu-settings-input { + float: left; + margin: 0; + width: 100%; +} + +.menu-settings-group-name { + float: left; + clear: both; + width: 25%; + padding: 3px 0 0; + margin-left: -25%; /* 20 container left padding x ( 100 container % width / 80 this % width ) */ +} + +.menu-settings label { + vertical-align: baseline; +} + +.menu-edit .checkbox-input { + margin-top: 4px; +} + +.theme-location-set { + color: #72777c; + font-size: 11px; +} + +/* Menu Container */ + +/* @todo: responsive view. */ +#menu-management-liquid { + float: left; + min-width: 100%; + margin-top: 3px; +} + +/* @todo: responsive view. */ +#menu-management { + position: relative; + margin-right: 20px; + margin-top: -3px; + width: 100%; +} + +#menu-management .menu-edit { + margin-bottom: 20px; +} + +.nav-menus-php #post-body { + padding: 0 10px; + border-top: 1px solid #fff; + border-bottom: 1px solid #ddd; + background: #fff; +} + +#nav-menu-header, +#nav-menu-footer { + padding: 0 10px; + background: #f5f5f5; +} + +#nav-menu-header { + border-bottom: 1px solid #ddd; + margin-bottom: 0; +} + +#nav-menu-header .menu-name-label { + display: inline-block; + vertical-align: middle; + margin-right: 7px; + font-style: italic; +} + +.nav-menus-php #post-body div.updated, +.nav-menus-php #post-body div.error { + margin: 0; +} + +.nav-menus-php #post-body-content { + position: relative; + float: none; +} + +.nav-menus-php #post-body-content .post-body-plain { + margin-bottom: 0; +} + +#menu-management .menu-add-new abbr { + font-weight: 600; +} + +#select-nav-menu-container { + text-align: right; + padding: 0 10px 3px 10px; + margin-bottom: 5px; +} + +#select-nav-menu { + width: 100px; + display: inline; +} + +#menu-name-label { + margin-top: -2px; +} + +.widefat .menu-locations .menu-location-title { + padding: 13px 10px 0; +} + +.menu-location-title label { + font-weight: 600; +} + +.menu-location-menus select { + float: left; +} + +#locations-nav-menu-wrapper { + padding: 5px 0; +} + +.locations-nav-menu-select select { + float: left; + width: 160px; + margin-right: 5px; +} + +.locations-row-links { + float: left; + margin: 6px 0 0 6px; +} + +.locations-edit-menu-link, +.locations-add-menu-link { + margin: 0 3px; +} + +.locations-edit-menu-link { + padding-right: 3px; + border-right: 1px solid #ccc; +} + +#menu-management .inside { + padding: 0 10px; +} + +/* Add Menu Item Boxes */ +.postbox .howto input, +.customlinkdiv .menu-item-textbox { + width: 180px; + float: right; +} + +.accordion-container .outer-border { + margin: 0; +} + +.customlinkdiv p { + margin-top: 0 +} + +#nav-menu-theme-locations .howto select { + width: 100%; +} + +#nav-menu-theme-locations .button-controls { + text-align: right; +} + +.add-menu-item-view-all { + height: 400px; +} + +/* Button Primary Actions */ +#menu-container .submit { + margin: 0 0 10px; + padding: 0; +} + +/* @todo: is this actually used? */ +#cancel-save { + text-decoration: underline; + font-size: 12px; + margin-left: 20px; + margin-top: 5px; +} + +.button.right, .button-secondary.right, .button-primary.right { + float: right; +} + +/* Button Secondary Actions */ +.list-controls { + float: left; + margin-top: 5px; +} + +.add-to-menu { + float: right; +} + +.button-controls { + clear: both; + margin: 10px 0; +} + +.show-all, +.hide-all { + cursor: pointer; +} + +.hide-all { + display: none; +} + +/* Create Menu */ +#menu-name { + width: 270px; + vertical-align: middle; +} + +#manage-menu .inside { + padding: 0px 0px; +} + +/* Custom Links */ +#available-links dt { + display: block; +} + +#add-custom-link .howto { + font-size: 12px; +} + +#add-custom-link label span { + display: block; + float: left; + margin-top: 5px; + padding-right: 5px; +} + +.menu-item-textbox { + width: 180px; +} + +.customlinkdiv label, +.nav-menus-php .howto span { + float: left; + margin-top: 6px; +} + +/* Menu item types */ +.quick-search { + width: 190px; +} + +.quick-search-wrap .spinner { + float: none; + margin: -3px -10px 0 0; +} + +.nav-menus-php .list-wrap { + display: none; + clear: both; + margin-bottom: 10px; +} + +.nav-menus-php .postbox p.submit { + margin-bottom: 0; +} + +/* Listings */ +.nav-menus-php .list li { + display: none; + margin: 0; + margin-bottom: 5px; +} + +.nav-menus-php .list li .menu-item-title { + cursor: pointer; + display: block; +} + +.nav-menus-php .list li .menu-item-title input { + margin-right: 3px; + margin-top: -3px; +} + +.menu-item-title input[type=checkbox] { + display: inline-block; + margin-top: -4px; +} + +.menu-item-title .post-state { + font-weight: 600; +} + +/* Nav Menu */ +#menu-container .inside { + padding-bottom: 10px; +} + +.menu { + padding-top: 1em; +} + +#menu-to-edit { + margin: 0; + padding: 0.1em 0; +} + +.menu ul { + width: 100%; +} + +.menu li { + margin-bottom: 0; + position: relative; +} + +.menu-item-bar { + clear: both; + line-height: 1.5; + position: relative; + margin: 9px 0 0; +} + +.menu-item-bar .menu-item-handle { + border: 1px solid #ddd; + position: relative; + padding: 10px 15px; + height: auto; + min-height: 20px; + width: 382px; + line-height: 2.30769230; + overflow: hidden; + word-wrap: break-word; +} + +.menu-item-bar .menu-item-handle:hover { + border-color: #999; +} + +#menu-to-edit .menu-item-invalid .menu-item-handle { + background: #f6c9cc; + border-color: #f1acb1; +} + +.no-js .menu-item-edit-active .item-edit { + display: none; +} + +.js .menu-item-handle { + cursor: move; +} + +.menu li.deleting .menu-item-handle { + background-image: none; + background-color: #f66; +} + +.menu-item-handle .item-title { + font-size: 13px; + font-weight: 600; + line-height: 1.53846153; + display: block; + /* @todo: responsive view. */ + margin-right: 13em; +} + +.menu-item-handle .menu-item-title.no-title { + color: #72777c; +} + +/* Sortables */ +li.menu-item.ui-sortable-helper .menu-item-bar { + margin-top: 0; +} + +li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar { + margin-top: 9px; /* Must use the same value used by the dragged item .menu-item-bar */ +} + +.menu .sortable-placeholder { + height: 35px; + width: 410px; + margin-top: 9px; /* Must use the same value used by the dragged item .menu-item-bar */ +} + +/* Hide the transport list when it's empty */ +.menu-item .menu-item-transport:empty { + display: none; +} + +/* WARNING: The factor of 30px is hardcoded into the nav-menus JavaScript. */ +.menu-item-depth-0 { margin-left: 0px; } +.menu-item-depth-1 { margin-left: 30px; } +.menu-item-depth-2 { margin-left: 60px; } +.menu-item-depth-3 { margin-left: 90px; } +.menu-item-depth-4 { margin-left: 120px; } +.menu-item-depth-5 { margin-left: 150px; } +.menu-item-depth-6 { margin-left: 180px; } +.menu-item-depth-7 { margin-left: 210px; } +.menu-item-depth-8 { margin-left: 240px; } +.menu-item-depth-9 { margin-left: 270px; } +.menu-item-depth-10 { margin-left: 300px; } +.menu-item-depth-11 { margin-left: 330px; } + +.menu-item-depth-0 .menu-item-transport { margin-left: 0px; } +.menu-item-depth-1 .menu-item-transport { margin-left: -30px; } +.menu-item-depth-2 .menu-item-transport { margin-left: -60px; } +.menu-item-depth-3 .menu-item-transport { margin-left: -90px; } +.menu-item-depth-4 .menu-item-transport { margin-left: -120px; } +.menu-item-depth-5 .menu-item-transport { margin-left: -150px; } +.menu-item-depth-6 .menu-item-transport { margin-left: -180px; } +.menu-item-depth-7 .menu-item-transport { margin-left: -210px; } +.menu-item-depth-8 .menu-item-transport { margin-left: -240px; } +.menu-item-depth-9 .menu-item-transport { margin-left: -270px; } +.menu-item-depth-10 .menu-item-transport { margin-left: -300px; } +.menu-item-depth-11 .menu-item-transport { margin-left: -330px; } + +body.menu-max-depth-0 { min-width: 950px !important; } +body.menu-max-depth-1 { min-width: 980px !important; } +body.menu-max-depth-2 { min-width: 1010px !important; } +body.menu-max-depth-3 { min-width: 1040px !important; } +body.menu-max-depth-4 { min-width: 1070px !important; } +body.menu-max-depth-5 { min-width: 1100px !important; } +body.menu-max-depth-6 { min-width: 1130px !important; } +body.menu-max-depth-7 { min-width: 1160px !important; } +body.menu-max-depth-8 { min-width: 1190px !important; } +body.menu-max-depth-9 { min-width: 1220px !important; } +body.menu-max-depth-10 { min-width: 1250px !important; } +body.menu-max-depth-11 { min-width: 1280px !important; } + +/* Menu item controls */ +.item-type { + display: inline-block; + padding: 12px 16px; + color: #666; + font-size: 12px; + line-height: 1.5; +} + +.item-controls { + font-size: 12px; + position: absolute; + right: 20px; + top: -1px; +} + +.item-controls a { + text-decoration: none; +} + +.item-controls a:hover { + cursor: pointer; +} + +.item-controls .item-order { + padding-right: 10px; +} + +.nav-menus-php .item-edit { + position: absolute; + right: -20px; + top: 0; + display: block; + width: 30px; + height: 40px; + outline: none; +} + +.no-js.nav-menus-php .item-edit { + position: static; + float: right; + width: auto; + height: auto; + margin: 12px -10px 12px 0; + padding: 0; + color: #0073aa; + text-decoration: underline; + font-size: 12px; + line-height: 1.5; +} + +.no-js.nav-menus-php .item-edit .screen-reader-text { + position: static; + -webkit-clip-path: none; + clip-path: none; + width: auto; + height: auto; + margin: 0; +} + +.nav-menus-php .item-edit:before { + margin-top: 10px; + margin-left: 4px; + width: 20px; + border-radius: 50%; + text-indent: -1px; /* account for the dashicon alignment */ +} + +.no-js.nav-menus-php .item-edit:before { + display: none; +} + +.rtl .nav-menus-php .item-edit:before { + text-indent: 1px; /* account for the dashicon alignment */ +} + +.js.nav-menus-php .item-edit:focus { + box-shadow: none; +} + +.nav-menus-php .item-edit:focus:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +/* Menu editing */ +.menu-instructions-inactive { + display: none; +} + +.menu-item-settings { + display: block; + width: 402px; + padding: 10px 0 10px 10px; + position: relative; + z-index: 10; /* Keep .item-title's shadow from appearing on top of .menu-item-settings */ + border: 1px solid #ccd0d4; + border-top: none; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); +} + +.menu-item-settings .field-move { + margin: 3px 0 5px; + line-height: 1.5; +} + +.field-move-visual-label { + float: left; + margin-right: 4px; + font-style: italic; +} + +.menu-item-settings .field-move .button-link { + display: none; + margin: 0 2px; + font-style: italic; +} + +.menu-item-edit-active .menu-item-settings { + display: block; +} + +.menu-item-edit-inactive .menu-item-settings { + display: none; +} + +.add-menu-item-pagelinks { + margin: .5em -10px; + text-align: center; +} + +.add-menu-item-pagelinks .page-numbers { + display: inline-block; + min-width: 20px; +} + +.add-menu-item-pagelinks .page-numbers.dots { + min-width: 0; +} + +.link-to-original { + display: block; + margin: 0 0 15px; + padding: 3px 5px 5px; + border: 1px solid #ddd; + color: #72777c; + font-size: 12px; + font-style: italic; +} + +.link-to-original a { + padding-left: 4px; + font-style: normal; +} + +.hidden-field { + display: none; +} + +.menu-item-settings .description-thin, +.menu-item-settings .description-wide { + margin-right: 10px; + float: left; +} + +.description-thin { + width: 190px; +} + +.description-wide { + width: 390px; +} + +.menu-item-actions { + padding-top: 15px; + padding-bottom: 7px; +} + +#cancel-save { + cursor: pointer; +} + +/* Major/minor publishing actions (classes) */ +.nav-menus-php .major-publishing-actions { + clear: both; + padding: 10px 0; + line-height: 2.15384615; +} + +.nav-menus-php .major-publishing-actions .publishing-action { + text-align: right; + float: right; +} + +.nav-menus-php .blank-slate .menu-settings { + display: none; +} + +/* Same as the Publish Meta Box #delete-action */ +.nav-menus-php .delete-action { + float: left; + line-height: 2.1; +} + +.nav-menus-php .major-publishing-actions .form-invalid { + padding-left: 4px; + margin-left: -4px; +} + +#nav-menus-frame, +.button-controls, +#menu-item-url-wrap, +#menu-item-name-wrap { + display: block; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +@media only screen and (min-width: 769px) and (max-width: 1000px){ + body.menu-max-depth-0 { + min-width: 0 !important; + } + + #menu-management-liquid{ + width: 100%; + } + + .nav-menus-php #post-body-content{ + min-width: 0; + } + + .menu-item-bar .menu-item-handle{ + width: 90%; + } +} + +@media screen and (max-width: 782px) { + body.nav-menus-php, + body.wp-customizer { + min-width: 0 !important; + } + + #nav-menus-frame { + margin-left: 0; + float: none; + width: 100%; + } + + #wpbody-content #menu-settings-column { + display: block; + width: 100%; + float: none; + margin-left: 0; + } + + #side-sortables .add-menu-item-tabs { + margin: 15px 0 14px; + } + + ul.add-menu-item-tabs li.tabs { + padding: 13px 15px 14px; + } + + .nav-menus-php .customlinkdiv .howto input { + width: 65%; + } + + .nav-menus-php .quick-search { + width: 85%; + } + + #menu-management-liquid { + margin-top: 25px; + } + + .nav-menus-php .menu-name-label.howto span { + margin-top: 13px + } + + #menu-name { + width: 100%; + } + + .nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action { + padding-top: 1em; + } + + .nav-menus-php .delete-action { + font-size: 14px; + line-height: 2.14285714; + } + + .menu-item-bar .menu-item-handle, + .menu-item-settings, + .description-wide { + width: auto; + } + + .menu-item-settings { + padding: 10px; + } + + .menu-item-settings .description-thin, + .menu-item-settings .description-wide { + width: 100%; + } + + .menu-item-settings input { + width: 100%; + } + + .menu-item-settings input[type="checkbox"], + .menu-item-settings input[type="radio"] { + width: 25px; + } + + .menu-settings-group { + padding-left: 0; + } + + .menu-settings-group-name { + float: none; + width: auto; + margin-left: 0; + margin-bottom: 15px; + } + + .menu-settings-input { + float: none; + margin-bottom: 15px; + } + + .menu-edit .checkbox-input { + margin-top: 0; + } + + .manage-menus select { + margin: 0.5em 0; + } + + .widefat .menu-locations .menu-location-title { + padding-top: 16px; + } +} + +@media only screen and (max-width: 768px) { + /* menu locations */ + #menu-locations-wrap .widefat { + width: 100%; + } +} diff --git a/wp-admin/css/nav-menus.min.css b/wp-admin/css/nav-menus.min.css new file mode 100644 index 0000000..4c3a541 --- /dev/null +++ b/wp-admin/css/nav-menus.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.no-js #message{display:block}ul.add-menu-item-tabs li{padding:3px 5px 4px 8px}.accordion-section ul.add-menu-item-tabs,.accordion-section ul.category-tabs,.accordion-section ul.wp-tab-bar{margin:0}.accordion-section .categorychecklist{margin:13px 0}#nav-menu-meta .accordion-section-content{padding:18px 13px}#nav-menu-meta .button-controls{margin-bottom:0}.has-no-menu-item .button-controls{display:none}#nav-menus-frame{margin-left:300px;margin-top:23px}#wpbody-content #menu-settings-column{display:inline;width:281px;margin-left:-300px;clear:both;float:left;padding-top:0}#menu-settings-column .inside{clear:both;margin:10px 0 0}.metabox-holder-disabled .accordion-section-content,.metabox-holder-disabled .accordion-section-title,.metabox-holder-disabled .postbox{opacity:.5;filter:alpha(opacity=50)}.metabox-holder-disabled .button-controls .select-all{display:none}#wpbody{position:relative}.blank-slate .menu-settings{border:none;margin-top:0;padding-top:0;overflow:hidden}.is-submenu{color:#555d66;font-style:italic;font-weight:400;margin-left:4px}.manage-menus{margin-top:23px;padding:10px;overflow:hidden;background:#fbfbfb}.manage-menus .selected-menu,.manage-menus .submit-btn,.manage-menus select,.nav-menus-php .add-new-menu-action{display:inline-block;margin-right:3px;vertical-align:middle}.manage-menus select,.menu-location-menus select{max-width:100%}.menu-edit #post-body-content h3{margin:1em 0 10px}.menu-settings{border-top:1px solid #eee;margin-top:2em}.menu-settings-group{margin:0 0 10px;overflow:hidden;padding-left:20%}.menu-settings-group:last-of-type{margin-bottom:0}.menu-settings-input{float:left;margin:0;width:100%}.menu-settings-group-name{float:left;clear:both;width:25%;padding:3px 0 0;margin-left:-25%}.menu-settings label{vertical-align:baseline}.menu-edit .checkbox-input{margin-top:4px}.theme-location-set{color:#72777c;font-size:11px}#menu-management-liquid{float:left;min-width:100%;margin-top:3px}#menu-management{position:relative;margin-right:20px;margin-top:-3px;width:100%}#menu-management .menu-edit{margin-bottom:20px}.nav-menus-php #post-body{padding:0 10px;border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#fff}#nav-menu-footer,#nav-menu-header{padding:0 10px;background:#f5f5f5}#nav-menu-header{border-bottom:1px solid #ddd;margin-bottom:0}#nav-menu-header .menu-name-label{display:inline-block;vertical-align:middle;margin-right:7px;font-style:italic}.nav-menus-php #post-body div.error,.nav-menus-php #post-body div.updated{margin:0}.nav-menus-php #post-body-content{position:relative;float:none}.nav-menus-php #post-body-content .post-body-plain{margin-bottom:0}#menu-management .menu-add-new abbr{font-weight:600}#select-nav-menu-container{text-align:right;padding:0 10px 3px 10px;margin-bottom:5px}#select-nav-menu{width:100px;display:inline}#menu-name-label{margin-top:-2px}.widefat .menu-locations .menu-location-title{padding:13px 10px 0}.menu-location-title label{font-weight:600}.menu-location-menus select{float:left}#locations-nav-menu-wrapper{padding:5px 0}.locations-nav-menu-select select{float:left;width:160px;margin-right:5px}.locations-row-links{float:left;margin:6px 0 0 6px}.locations-add-menu-link,.locations-edit-menu-link{margin:0 3px}.locations-edit-menu-link{padding-right:3px;border-right:1px solid #ccc}#menu-management .inside{padding:0 10px}.customlinkdiv .menu-item-textbox,.postbox .howto input{width:180px;float:right}.accordion-container .outer-border{margin:0}.customlinkdiv p{margin-top:0}#nav-menu-theme-locations .howto select{width:100%}#nav-menu-theme-locations .button-controls{text-align:right}.add-menu-item-view-all{height:400px}#menu-container .submit{margin:0 0 10px;padding:0}#cancel-save{text-decoration:underline;font-size:12px;margin-left:20px;margin-top:5px}.button-primary.right,.button-secondary.right,.button.right{float:right}.list-controls{float:left;margin-top:5px}.add-to-menu{float:right}.button-controls{clear:both;margin:10px 0}.hide-all,.show-all{cursor:pointer}.hide-all{display:none}#menu-name{width:270px;vertical-align:middle}#manage-menu .inside{padding:0 0}#available-links dt{display:block}#add-custom-link .howto{font-size:12px}#add-custom-link label span{display:block;float:left;margin-top:5px;padding-right:5px}.menu-item-textbox{width:180px}.customlinkdiv label,.nav-menus-php .howto span{float:left;margin-top:6px}.quick-search{width:190px}.quick-search-wrap .spinner{float:none;margin:-3px -10px 0 0}.nav-menus-php .list-wrap{display:none;clear:both;margin-bottom:10px}.nav-menus-php .postbox p.submit{margin-bottom:0}.nav-menus-php .list li{display:none;margin:0;margin-bottom:5px}.nav-menus-php .list li .menu-item-title{cursor:pointer;display:block}.nav-menus-php .list li .menu-item-title input{margin-right:3px;margin-top:-3px}.menu-item-title input[type=checkbox]{display:inline-block;margin-top:-4px}.menu-item-title .post-state{font-weight:600}#menu-container .inside{padding-bottom:10px}.menu{padding-top:1em}#menu-to-edit{margin:0;padding:.1em 0}.menu ul{width:100%}.menu li{margin-bottom:0;position:relative}.menu-item-bar{clear:both;line-height:1.5;position:relative;margin:9px 0 0}.menu-item-bar .menu-item-handle{border:1px solid #ddd;position:relative;padding:10px 15px;height:auto;min-height:20px;width:382px;line-height:2.30769230;overflow:hidden;word-wrap:break-word}.menu-item-bar .menu-item-handle:hover{border-color:#999}#menu-to-edit .menu-item-invalid .menu-item-handle{background:#f6c9cc;border-color:#f1acb1}.no-js .menu-item-edit-active .item-edit{display:none}.js .menu-item-handle{cursor:move}.menu li.deleting .menu-item-handle{background-image:none;background-color:#f66}.menu-item-handle .item-title{font-size:13px;font-weight:600;line-height:1.53846153;display:block;margin-right:13em}.menu-item-handle .menu-item-title.no-title{color:#72777c}li.menu-item.ui-sortable-helper .menu-item-bar{margin-top:0}li.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar{margin-top:9px}.menu .sortable-placeholder{height:35px;width:410px;margin-top:9px}.menu-item .menu-item-transport:empty{display:none}.menu-item-depth-0{margin-left:0}.menu-item-depth-1{margin-left:30px}.menu-item-depth-2{margin-left:60px}.menu-item-depth-3{margin-left:90px}.menu-item-depth-4{margin-left:120px}.menu-item-depth-5{margin-left:150px}.menu-item-depth-6{margin-left:180px}.menu-item-depth-7{margin-left:210px}.menu-item-depth-8{margin-left:240px}.menu-item-depth-9{margin-left:270px}.menu-item-depth-10{margin-left:300px}.menu-item-depth-11{margin-left:330px}.menu-item-depth-0 .menu-item-transport{margin-left:0}.menu-item-depth-1 .menu-item-transport{margin-left:-30px}.menu-item-depth-2 .menu-item-transport{margin-left:-60px}.menu-item-depth-3 .menu-item-transport{margin-left:-90px}.menu-item-depth-4 .menu-item-transport{margin-left:-120px}.menu-item-depth-5 .menu-item-transport{margin-left:-150px}.menu-item-depth-6 .menu-item-transport{margin-left:-180px}.menu-item-depth-7 .menu-item-transport{margin-left:-210px}.menu-item-depth-8 .menu-item-transport{margin-left:-240px}.menu-item-depth-9 .menu-item-transport{margin-left:-270px}.menu-item-depth-10 .menu-item-transport{margin-left:-300px}.menu-item-depth-11 .menu-item-transport{margin-left:-330px}body.menu-max-depth-0{min-width:950px!important}body.menu-max-depth-1{min-width:980px!important}body.menu-max-depth-2{min-width:1010px!important}body.menu-max-depth-3{min-width:1040px!important}body.menu-max-depth-4{min-width:1070px!important}body.menu-max-depth-5{min-width:1100px!important}body.menu-max-depth-6{min-width:1130px!important}body.menu-max-depth-7{min-width:1160px!important}body.menu-max-depth-8{min-width:1190px!important}body.menu-max-depth-9{min-width:1220px!important}body.menu-max-depth-10{min-width:1250px!important}body.menu-max-depth-11{min-width:1280px!important}.item-type{display:inline-block;padding:12px 16px;color:#666;font-size:12px;line-height:1.5}.item-controls{font-size:12px;position:absolute;right:20px;top:-1px}.item-controls a{text-decoration:none}.item-controls a:hover{cursor:pointer}.item-controls .item-order{padding-right:10px}.nav-menus-php .item-edit{position:absolute;right:-20px;top:0;display:block;width:30px;height:40px;outline:0}.no-js.nav-menus-php .item-edit{position:static;float:right;width:auto;height:auto;margin:12px -10px 12px 0;padding:0;color:#0073aa;text-decoration:underline;font-size:12px;line-height:1.5}.no-js.nav-menus-php .item-edit .screen-reader-text{position:static;-webkit-clip-path:none;clip-path:none;width:auto;height:auto;margin:0}.nav-menus-php .item-edit:before{margin-top:10px;margin-left:4px;width:20px;border-radius:50%;text-indent:-1px}.no-js.nav-menus-php .item-edit:before{display:none}.rtl .nav-menus-php .item-edit:before{text-indent:1px}.js.nav-menus-php .item-edit:focus{box-shadow:none}.nav-menus-php .item-edit:focus:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.menu-instructions-inactive{display:none}.menu-item-settings{display:block;width:402px;padding:10px 0 10px 10px;position:relative;z-index:10;border:1px solid #ccd0d4;border-top:none;box-shadow:0 1px 1px rgba(0,0,0,.04)}.menu-item-settings .field-move{margin:3px 0 5px;line-height:1.5}.field-move-visual-label{float:left;margin-right:4px;font-style:italic}.menu-item-settings .field-move .button-link{display:none;margin:0 2px;font-style:italic}.menu-item-edit-active .menu-item-settings{display:block}.menu-item-edit-inactive .menu-item-settings{display:none}.add-menu-item-pagelinks{margin:.5em -10px;text-align:center}.add-menu-item-pagelinks .page-numbers{display:inline-block;min-width:20px}.add-menu-item-pagelinks .page-numbers.dots{min-width:0}.link-to-original{display:block;margin:0 0 15px;padding:3px 5px 5px;border:1px solid #ddd;color:#72777c;font-size:12px;font-style:italic}.link-to-original a{padding-left:4px;font-style:normal}.hidden-field{display:none}.menu-item-settings .description-thin,.menu-item-settings .description-wide{margin-right:10px;float:left}.description-thin{width:190px}.description-wide{width:390px}.menu-item-actions{padding-top:15px;padding-bottom:7px}#cancel-save{cursor:pointer}.nav-menus-php .major-publishing-actions{clear:both;padding:10px 0;line-height:2.15384615}.nav-menus-php .major-publishing-actions .publishing-action{text-align:right;float:right}.nav-menus-php .blank-slate .menu-settings{display:none}.nav-menus-php .delete-action{float:left;line-height:2.1}.nav-menus-php .major-publishing-actions .form-invalid{padding-left:4px;margin-left:-4px}#menu-item-name-wrap,#menu-item-url-wrap,#nav-menus-frame,.button-controls{display:block}@media only screen and (min-width:769px) and (max-width:1000px){body.menu-max-depth-0{min-width:0!important}#menu-management-liquid{width:100%}.nav-menus-php #post-body-content{min-width:0}.menu-item-bar .menu-item-handle{width:90%}}@media screen and (max-width:782px){body.nav-menus-php,body.wp-customizer{min-width:0!important}#nav-menus-frame{margin-left:0;float:none;width:100%}#wpbody-content #menu-settings-column{display:block;width:100%;float:none;margin-left:0}#side-sortables .add-menu-item-tabs{margin:15px 0 14px}ul.add-menu-item-tabs li.tabs{padding:13px 15px 14px}.nav-menus-php .customlinkdiv .howto input{width:65%}.nav-menus-php .quick-search{width:85%}#menu-management-liquid{margin-top:25px}.nav-menus-php .menu-name-label.howto span{margin-top:13px}#menu-name{width:100%}.nav-menus-php #nav-menu-header .major-publishing-actions .publishing-action{padding-top:1em}.nav-menus-php .delete-action{font-size:14px;line-height:2.14285714}.description-wide,.menu-item-bar .menu-item-handle,.menu-item-settings{width:auto}.menu-item-settings{padding:10px}.menu-item-settings .description-thin,.menu-item-settings .description-wide{width:100%}.menu-item-settings input{width:100%}.menu-item-settings input[type=checkbox],.menu-item-settings input[type=radio]{width:25px}.menu-settings-group{padding-left:0}.menu-settings-group-name{float:none;width:auto;margin-left:0;margin-bottom:15px}.menu-settings-input{float:none;margin-bottom:15px}.menu-edit .checkbox-input{margin-top:0}.manage-menus select{margin:.5em 0}.widefat .menu-locations .menu-location-title{padding-top:16px}}@media only screen and (max-width:768px){#menu-locations-wrap .widefat{width:100%}} \ No newline at end of file diff --git a/wp-admin/css/revisions-rtl.css b/wp-admin/css/revisions-rtl.css new file mode 100644 index 0000000..52b5e7b --- /dev/null +++ b/wp-admin/css/revisions-rtl.css @@ -0,0 +1,620 @@ +/*! This file is auto-generated */ +/*------------------------------------------------------------------------------ + 11.2 - Post Revisions +------------------------------------------------------------------------------*/ +.revisions-control-frame, +.revisions-diff-frame { + position: relative; +} + +.revisions-diff-frame { + top: 10px; +} + +.revisions-controls { + padding-top: 40px; + z-index: 1; +} + +.revisions-controls input[type="checkbox"] { + position: relative; + top: -1px; + vertical-align: text-bottom; +} + +.revisions.pinned .revisions-controls { + position: fixed; + top: 0; + height: 82px; + background: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.revisions-tickmarks { + position: relative; + margin: 0 auto; + height: 0.7em; + top: 7px; + max-width: 70%; + box-sizing: border-box; + background-color: #fff; +} + +.revisions-tickmarks > div { + position: absolute; + height: 100%; + border-right: 1px solid #a0a5aa; + box-sizing: border-box; +} + +.revisions-tickmarks > div:first-child { + border-width: 0; +} + +.comparing-two-revisions .revisions-controls { + height: 140px; +} + +.comparing-two-revisions.pinned .revisions-controls { + height: 124px; +} + +.revisions .diff-error { + position: absolute; + text-align: center; + margin: 0 auto; + width: 100%; + display: none; +} + +.revisions.diff-error .diff-error { + display: block; +} + +.revisions .loading-indicator { + position: absolute; + vertical-align: middle; + opacity: 0; + width: 100%; + width: calc( 100% - 30px ); + top: 50%; + top: calc( 50% - 10px ); + transition: opacity 0.5s; + filter: alpha(opacity=0); /* ie8 and earlier */ +} + +body.folded .revisions .loading-indicator { + margin-right: -32px; +} + +.revisions .loading-indicator span.spinner { + display: block; + margin: 0 auto; + float: none; +} + +.revisions.loading .loading-indicator { + opacity: 1; + filter: alpha(opacity=100); /* ie8 and earlier */ +} + +.revisions .diff { + transition: opacity 0.5s; +} + +.revisions.loading .diff { + opacity: 0.5; + filter: alpha(opacity=50); /* ie8 and earlier */ +} + +.revisions.diff-error .diff { + visibility: hidden; +} + +.revisions-meta { + margin-top: 20px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.revisions.pinned .revisions-meta { + box-shadow: none; +} + +.revision-toggle-compare-mode { + position: absolute; + top: 0; + left: 0; +} + +.comparing-two-revisions .revisions-previous, +.comparing-two-revisions .revisions-next, +.revisions-meta .diff-meta-to strong { + display: none; +} + +.revisions-controls .author-card .date { + color: #72777c; +} + +.revisions-controls .author-card.autosave { + color: #d54e21; +} + +.revisions-controls .author-card .author-name { + font-weight: 600; +} + +.comparing-two-revisions .diff-meta-to strong { + display: block; +} + +.revisions.pinned .revisions-buttons { + padding: 0 11px; +} + +.revisions-previous, +.revisions-next { + position: relative; + z-index: 1; +} + +.revisions-previous { + float: right; +} + +.revisions-next { + float: left; +} + +.revisions-controls .wp-slider { + max-width: 70%; + margin: 0 auto; + top: -3px; +} + +.revisions-diff { + padding: 15px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.revisions-diff h3:first-child { + margin-top: 0; +} + +/* Revision meta box */ +.post-revisions li img, +#revisions-meta-restored img { + vertical-align: middle; +} + +table.diff tbody tr td:nth-child(2) { + width: 4%; +} + +table.diff { + table-layout: fixed; + width: 100%; + white-space: pre-wrap; +} + +table.diff col.content { + width: auto; +} + +table.diff col.content.diffsplit { + width: 48%; +} + +table.diff col.diffsplit.middle { + width: auto; +} + +table.diff col.ltype { + width: 30px; +} + +table.diff tr { + background-color: transparent; +} + +table.diff td, +table.diff th { + font-family: Consolas, Monaco, monospace; + font-size: 14px; + line-height: 1.57142857; + padding: 0.5em 2em 0.5em 0.5em; + vertical-align: top; + word-wrap: break-word; +} + +table.diff td h1, +table.diff td h2, +table.diff td h3, +table.diff td h4, +table.diff td h5, +table.diff td h6 { + margin: 0; +} + +table.diff .diff-deletedline del, +table.diff .diff-addedline ins { + text-decoration: none; +} + +table.diff .diff-deletedline { + position: relative; + background-color: #ffe9e9; +} + +table.diff .diff-deletedline del { + background-color: #faa; +} + +table.diff .diff-addedline { + position: relative; + background-color: #e9ffe9; +} + +table.diff .diff-deletedline .dashicons, +table.diff .diff-addedline .dashicons { + position: absolute; + top: 0.85714286em; + right: 0.5em; + width: 1em; + height: 1em; + font-size: 1em; + line-height: 1; +} + +table.diff .diff-addedline .dashicons { + /* Compensate the vertically non-centered plus glyph. */ + top: 0.92857143em; +} + +table.diff .diff-addedline ins { + background-color: #afa; +} + +.diff-meta { + padding: 5px; + clear: both; + min-height: 32px; +} + +.diff-title strong { + line-height: 2.46153846; + min-width: 60px; + text-align: left; + float: right; + margin-left: 5px; +} + +.revisions-controls .author-card .author-info { + font-size: 12px; + line-height: 1.33333333; +} + +.revisions-controls .author-card .avatar, +.revisions-controls .author-card .author-info { + float: right; + margin-right: 6px; + margin-left: 6px; +} + +.revisions-controls .author-card .byline { + display: block; + font-size: 12px; +} + +.revisions-controls .author-card .avatar { + vertical-align: middle; +} + +.diff-meta input.restore-revision { + float: left; + margin-right: 6px; + margin-left: 6px; + margin-top: 2px; +} + +.diff-meta-from { + display: none; +} + +.comparing-two-revisions .diff-meta-from { + display: block; +} + +.revisions-tooltip { + position: absolute; + bottom: 105px; + margin-left: 0; + margin-right: -69px; + z-index: 0; + max-width: 350px; + min-width: 130px; + padding: 8px 4px; + display: none; + opacity: 0; +} + +.revisions-tooltip.flipped { + margin-right: 0; + margin-left: -70px; +} + +.revisions.pinned .revisions-tooltip { + display: none !important; +} + +.comparing-two-revisions .revisions-tooltip { + bottom: 145px; +} + +.revisions-tooltip-arrow { + width: 70px; + height: 15px; + overflow: hidden; + position: absolute; + right: 0; + margin-right: 35px; + bottom: -15px; +} + +.revisions-tooltip.flipped .revisions-tooltip-arrow { + margin-right: 0; + margin-left: 35px; + right: auto; + left: 0; +} + +.revisions-tooltip-arrow > span { + content: ""; + position: absolute; + right: 20px; + top: -20px; + width: 25px; + height: 25px; + transform: rotate(-45deg); +} + +.revisions-tooltip.flipped .revisions-tooltip-arrow > span { + right: auto; + left: 20px; +} + +.ie8 .revisions-tooltip-arrow > span { + right: 15px; + top: -25px; + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476)"; +} + +.ie8 .revisions-tooltip.flipped .revisions-tooltip-arrow > span { + left: 25px; +} + +.revisions-tooltip, +.revisions-tooltip-arrow > span { + border: 1px solid #ddd; + background-color: #fff; +} + +.revisions-tooltip { + display: none; +} + +.arrow { + width: 70px; + height: 16px; + overflow: hidden; + position: absolute; + right: 0; + margin-right: -35px; + bottom: 90px; + z-index: 10000; +} + +.arrow:after { + z-index: 9999; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.arrow.top { + top: -16px; + bottom: auto; +} + +.arrow.left { + right: 20%; +} + +.arrow:after { + content: ""; + position: absolute; + right: 20px; + top: -20px; + width: 25px; + height: 25px; + transform: rotate(-45deg); +} + +.revisions-tooltip, +.revisions-tooltip-arrow:after { + border-width: 1px; + border-style: solid; +} + +div.revisions-controls > .wp-slider > .ui-slider-handle { + margin-right: -10px; +} + +.rtl div.revisions-controls > .wp-slider > .ui-slider-handle { + margin-left: -10px; +} + +/* jQuery UI Slider */ +.wp-slider.ui-slider { + position: relative; + border: 1px solid #ddd; + text-align: right; + cursor: pointer; +} + +.wp-slider .ui-slider-handle { + border-radius: 50%; + height: 18px; + margin-top: -5px; + outline: none; + padding: 2px; + position: absolute; + width: 18px; + z-index: 2; + touch-action: none; +} + +.wp-slider .ui-slider-handle, +.wp-slider .ui-slider-handle.focus { + background: #f7f7f7; + border: 1px solid #ccc; + box-shadow: 0 1px 0 #cccccc; +} + +.wp-slider .ui-slider-handle:hover, +.wp-slider .ui-slider-handle.ui-state-hover { + background: #fafafa; + border-color: #999; +} + +.wp-slider .ui-slider-handle:active, +.wp-slider .ui-slider-handle.ui-state-active { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); + transform: translateY(1px); +} + +.wp-slider .ui-slider-handle:before { + background: none; + position: absolute; + top: 2px; + right: 2px; + color: #555; + content: "\f229"; + font: normal 18px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-slider .ui-slider-handle:hover:before, +.wp-slider .ui-slider-handle.ui-state-hover:before { + color: #23282d; +} + +.wp-slider .ui-slider-handle.from-handle:before, +.wp-slider .ui-slider-handle.to-handle:before { + font-size: 20px !important; + margin: -1px -1px 0 0; +} + +.wp-slider .ui-slider-handle.from-handle:before { + content: "\f141"; +} + +.wp-slider .ui-slider-handle.to-handle:before { + content: "\f139"; +} + +.rtl .wp-slider .ui-slider-handle.from-handle:before { + content: "\f139"; +} + +.rtl .wp-slider .ui-slider-handle.to-handle:before { + content: "\f141"; + left: -1px; +} + +.wp-slider .ui-slider-range { + position: absolute; + font-size: 0.7em; + display: block; + border: 0; + background-color: transparent; + background-image: none; +} + +.wp-slider.ui-slider-horizontal { + height: 0.7em; +} + +.wp-slider.ui-slider-horizontal .ui-slider-handle { + top: -.25em; + margin-right: -.6em; +} + +.wp-slider.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} + +.wp-slider.ui-slider-horizontal .ui-slider-range-min { + right: 0; +} + +.wp-slider.ui-slider-horizontal .ui-slider-range-max { + left: 0; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + .revision-tick.completed-false { + background-image: url(../images/spinner-2x.gif); + } +} + +@media screen and (max-width: 782px) { + #diff-next-revision, + #diff-previous-revision { + margin-top: -1em; + } + + .revisions-buttons { + overflow: hidden; + margin-bottom: 15px; + } + + .revisions-controls, + .comparing-two-revisions .revisions-controls { + height: 170px; + } + + .revisions-tooltip { + bottom: 130px; + z-index: 2; + } + + .diff-meta { + overflow: hidden; + } + + table.diff { + -ms-word-break: break-all; + word-break: break-all; + word-wrap: break-word; + } + + .diff-meta input.restore-revision { + margin-top: 0; + } +} diff --git a/wp-admin/css/revisions-rtl.min.css b/wp-admin/css/revisions-rtl.min.css new file mode 100644 index 0000000..fa07c4d --- /dev/null +++ b/wp-admin/css/revisions-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.revisions-control-frame,.revisions-diff-frame{position:relative}.revisions-diff-frame{top:10px}.revisions-controls{padding-top:40px;z-index:1}.revisions-controls input[type=checkbox]{position:relative;top:-1px;vertical-align:text-bottom}.revisions.pinned .revisions-controls{position:fixed;top:0;height:82px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.revisions-tickmarks{position:relative;margin:0 auto;height:.7em;top:7px;max-width:70%;box-sizing:border-box;background-color:#fff}.revisions-tickmarks>div{position:absolute;height:100%;border-right:1px solid #a0a5aa;box-sizing:border-box}.revisions-tickmarks>div:first-child{border-width:0}.comparing-two-revisions .revisions-controls{height:140px}.comparing-two-revisions.pinned .revisions-controls{height:124px}.revisions .diff-error{position:absolute;text-align:center;margin:0 auto;width:100%;display:none}.revisions.diff-error .diff-error{display:block}.revisions .loading-indicator{position:absolute;vertical-align:middle;opacity:0;width:100%;width:calc(100% - 30px);top:50%;top:calc(50% - 10px);transition:opacity .5s;filter:alpha(opacity=0)}body.folded .revisions .loading-indicator{margin-right:-32px}.revisions .loading-indicator span.spinner{display:block;margin:0 auto;float:none}.revisions.loading .loading-indicator{opacity:1;filter:alpha(opacity=100)}.revisions .diff{transition:opacity .5s}.revisions.loading .diff{opacity:.5;filter:alpha(opacity=50)}.revisions.diff-error .diff{visibility:hidden}.revisions-meta{margin-top:20px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1);overflow:hidden}.revisions.pinned .revisions-meta{box-shadow:none}.revision-toggle-compare-mode{position:absolute;top:0;left:0}.comparing-two-revisions .revisions-next,.comparing-two-revisions .revisions-previous,.revisions-meta .diff-meta-to strong{display:none}.revisions-controls .author-card .date{color:#72777c}.revisions-controls .author-card.autosave{color:#d54e21}.revisions-controls .author-card .author-name{font-weight:600}.comparing-two-revisions .diff-meta-to strong{display:block}.revisions.pinned .revisions-buttons{padding:0 11px}.revisions-next,.revisions-previous{position:relative;z-index:1}.revisions-previous{float:right}.revisions-next{float:left}.revisions-controls .wp-slider{max-width:70%;margin:0 auto;top:-3px}.revisions-diff{padding:15px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.revisions-diff h3:first-child{margin-top:0}#revisions-meta-restored img,.post-revisions li img{vertical-align:middle}table.diff tbody tr td:nth-child(2){width:4%}table.diff{table-layout:fixed;width:100%;white-space:pre-wrap}table.diff col.content{width:auto}table.diff col.content.diffsplit{width:48%}table.diff col.diffsplit.middle{width:auto}table.diff col.ltype{width:30px}table.diff tr{background-color:transparent}table.diff td,table.diff th{font-family:Consolas,Monaco,monospace;font-size:14px;line-height:1.57142857;padding:.5em 2em .5em .5em;vertical-align:top;word-wrap:break-word}table.diff td h1,table.diff td h2,table.diff td h3,table.diff td h4,table.diff td h5,table.diff td h6{margin:0}table.diff .diff-addedline ins,table.diff .diff-deletedline del{text-decoration:none}table.diff .diff-deletedline{position:relative;background-color:#ffe9e9}table.diff .diff-deletedline del{background-color:#faa}table.diff .diff-addedline{position:relative;background-color:#e9ffe9}table.diff .diff-addedline .dashicons,table.diff .diff-deletedline .dashicons{position:absolute;top:.85714286em;right:.5em;width:1em;height:1em;font-size:1em;line-height:1}table.diff .diff-addedline .dashicons{top:.92857143em}table.diff .diff-addedline ins{background-color:#afa}.diff-meta{padding:5px;clear:both;min-height:32px}.diff-title strong{line-height:2.46153846;min-width:60px;text-align:left;float:right;margin-left:5px}.revisions-controls .author-card .author-info{font-size:12px;line-height:1.33333333}.revisions-controls .author-card .author-info,.revisions-controls .author-card .avatar{float:right;margin-right:6px;margin-left:6px}.revisions-controls .author-card .byline{display:block;font-size:12px}.revisions-controls .author-card .avatar{vertical-align:middle}.diff-meta input.restore-revision{float:left;margin-right:6px;margin-left:6px;margin-top:2px}.diff-meta-from{display:none}.comparing-two-revisions .diff-meta-from{display:block}.revisions-tooltip{position:absolute;bottom:105px;margin-left:0;margin-right:-69px;z-index:0;max-width:350px;min-width:130px;padding:8px 4px;display:none;opacity:0}.revisions-tooltip.flipped{margin-right:0;margin-left:-70px}.revisions.pinned .revisions-tooltip{display:none!important}.comparing-two-revisions .revisions-tooltip{bottom:145px}.revisions-tooltip-arrow{width:70px;height:15px;overflow:hidden;position:absolute;right:0;margin-right:35px;bottom:-15px}.revisions-tooltip.flipped .revisions-tooltip-arrow{margin-right:0;margin-left:35px;right:auto;left:0}.revisions-tooltip-arrow>span{content:"";position:absolute;right:20px;top:-20px;width:25px;height:25px;transform:rotate(-45deg)}.revisions-tooltip.flipped .revisions-tooltip-arrow>span{right:auto;left:20px}.ie8 .revisions-tooltip-arrow>span{right:15px;top:-25px;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476)"}.ie8 .revisions-tooltip.flipped .revisions-tooltip-arrow>span{left:25px}.revisions-tooltip,.revisions-tooltip-arrow>span{border:1px solid #ddd;background-color:#fff}.revisions-tooltip{display:none}.arrow{width:70px;height:16px;overflow:hidden;position:absolute;right:0;margin-right:-35px;bottom:90px;z-index:10000}.arrow:after{z-index:9999;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.arrow.top{top:-16px;bottom:auto}.arrow.left{right:20%}.arrow:after{content:"";position:absolute;right:20px;top:-20px;width:25px;height:25px;transform:rotate(-45deg)}.revisions-tooltip,.revisions-tooltip-arrow:after{border-width:1px;border-style:solid}div.revisions-controls>.wp-slider>.ui-slider-handle{margin-right:-10px}.rtl div.revisions-controls>.wp-slider>.ui-slider-handle{margin-left:-10px}.wp-slider.ui-slider{position:relative;border:1px solid #ddd;text-align:right;cursor:pointer}.wp-slider .ui-slider-handle{border-radius:50%;height:18px;margin-top:-5px;outline:0;padding:2px;position:absolute;width:18px;z-index:2;touch-action:none}.wp-slider .ui-slider-handle,.wp-slider .ui-slider-handle.focus{background:#f7f7f7;border:1px solid #ccc;box-shadow:0 1px 0 #ccc}.wp-slider .ui-slider-handle.ui-state-hover,.wp-slider .ui-slider-handle:hover{background:#fafafa;border-color:#999}.wp-slider .ui-slider-handle.ui-state-active,.wp-slider .ui-slider-handle:active{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);transform:translateY(1px)}.wp-slider .ui-slider-handle:before{background:0 0;position:absolute;top:2px;right:2px;color:#555;content:"\f229";font:normal 18px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-slider .ui-slider-handle.ui-state-hover:before,.wp-slider .ui-slider-handle:hover:before{color:#23282d}.wp-slider .ui-slider-handle.from-handle:before,.wp-slider .ui-slider-handle.to-handle:before{font-size:20px!important;margin:-1px -1px 0 0}.wp-slider .ui-slider-handle.from-handle:before{content:"\f141"}.wp-slider .ui-slider-handle.to-handle:before{content:"\f139"}.rtl .wp-slider .ui-slider-handle.from-handle:before{content:"\f139"}.rtl .wp-slider .ui-slider-handle.to-handle:before{content:"\f141";left:-1px}.wp-slider .ui-slider-range{position:absolute;font-size:.7em;display:block;border:0;background-color:transparent;background-image:none}.wp-slider.ui-slider-horizontal{height:.7em}.wp-slider.ui-slider-horizontal .ui-slider-handle{top:-.25em;margin-right:-.6em}.wp-slider.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.wp-slider.ui-slider-horizontal .ui-slider-range-min{right:0}.wp-slider.ui-slider-horizontal .ui-slider-range-max{left:0}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.revision-tick.completed-false{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){#diff-next-revision,#diff-previous-revision{margin-top:-1em}.revisions-buttons{overflow:hidden;margin-bottom:15px}.comparing-two-revisions .revisions-controls,.revisions-controls{height:170px}.revisions-tooltip{bottom:130px;z-index:2}.diff-meta{overflow:hidden}table.diff{-ms-word-break:break-all;word-break:break-all;word-wrap:break-word}.diff-meta input.restore-revision{margin-top:0}} \ No newline at end of file diff --git a/wp-admin/css/revisions.css b/wp-admin/css/revisions.css new file mode 100644 index 0000000..16b8278 --- /dev/null +++ b/wp-admin/css/revisions.css @@ -0,0 +1,619 @@ +/*------------------------------------------------------------------------------ + 11.2 - Post Revisions +------------------------------------------------------------------------------*/ +.revisions-control-frame, +.revisions-diff-frame { + position: relative; +} + +.revisions-diff-frame { + top: 10px; +} + +.revisions-controls { + padding-top: 40px; + z-index: 1; +} + +.revisions-controls input[type="checkbox"] { + position: relative; + top: -1px; + vertical-align: text-bottom; +} + +.revisions.pinned .revisions-controls { + position: fixed; + top: 0; + height: 82px; + background: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.revisions-tickmarks { + position: relative; + margin: 0 auto; + height: 0.7em; + top: 7px; + max-width: 70%; + box-sizing: border-box; + background-color: #fff; +} + +.revisions-tickmarks > div { + position: absolute; + height: 100%; + border-left: 1px solid #a0a5aa; + box-sizing: border-box; +} + +.revisions-tickmarks > div:first-child { + border-width: 0; +} + +.comparing-two-revisions .revisions-controls { + height: 140px; +} + +.comparing-two-revisions.pinned .revisions-controls { + height: 124px; +} + +.revisions .diff-error { + position: absolute; + text-align: center; + margin: 0 auto; + width: 100%; + display: none; +} + +.revisions.diff-error .diff-error { + display: block; +} + +.revisions .loading-indicator { + position: absolute; + vertical-align: middle; + opacity: 0; + width: 100%; + width: calc( 100% - 30px ); + top: 50%; + top: calc( 50% - 10px ); + transition: opacity 0.5s; + filter: alpha(opacity=0); /* ie8 and earlier */ +} + +body.folded .revisions .loading-indicator { + margin-left: -32px; +} + +.revisions .loading-indicator span.spinner { + display: block; + margin: 0 auto; + float: none; +} + +.revisions.loading .loading-indicator { + opacity: 1; + filter: alpha(opacity=100); /* ie8 and earlier */ +} + +.revisions .diff { + transition: opacity 0.5s; +} + +.revisions.loading .diff { + opacity: 0.5; + filter: alpha(opacity=50); /* ie8 and earlier */ +} + +.revisions.diff-error .diff { + visibility: hidden; +} + +.revisions-meta { + margin-top: 20px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.revisions.pinned .revisions-meta { + box-shadow: none; +} + +.revision-toggle-compare-mode { + position: absolute; + top: 0; + right: 0; +} + +.comparing-two-revisions .revisions-previous, +.comparing-two-revisions .revisions-next, +.revisions-meta .diff-meta-to strong { + display: none; +} + +.revisions-controls .author-card .date { + color: #72777c; +} + +.revisions-controls .author-card.autosave { + color: #d54e21; +} + +.revisions-controls .author-card .author-name { + font-weight: 600; +} + +.comparing-two-revisions .diff-meta-to strong { + display: block; +} + +.revisions.pinned .revisions-buttons { + padding: 0 11px; +} + +.revisions-previous, +.revisions-next { + position: relative; + z-index: 1; +} + +.revisions-previous { + float: left; +} + +.revisions-next { + float: right; +} + +.revisions-controls .wp-slider { + max-width: 70%; + margin: 0 auto; + top: -3px; +} + +.revisions-diff { + padding: 15px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.revisions-diff h3:first-child { + margin-top: 0; +} + +/* Revision meta box */ +.post-revisions li img, +#revisions-meta-restored img { + vertical-align: middle; +} + +table.diff tbody tr td:nth-child(2) { + width: 4%; +} + +table.diff { + table-layout: fixed; + width: 100%; + white-space: pre-wrap; +} + +table.diff col.content { + width: auto; +} + +table.diff col.content.diffsplit { + width: 48%; +} + +table.diff col.diffsplit.middle { + width: auto; +} + +table.diff col.ltype { + width: 30px; +} + +table.diff tr { + background-color: transparent; +} + +table.diff td, +table.diff th { + font-family: Consolas, Monaco, monospace; + font-size: 14px; + line-height: 1.57142857; + padding: 0.5em 0.5em 0.5em 2em; + vertical-align: top; + word-wrap: break-word; +} + +table.diff td h1, +table.diff td h2, +table.diff td h3, +table.diff td h4, +table.diff td h5, +table.diff td h6 { + margin: 0; +} + +table.diff .diff-deletedline del, +table.diff .diff-addedline ins { + text-decoration: none; +} + +table.diff .diff-deletedline { + position: relative; + background-color: #ffe9e9; +} + +table.diff .diff-deletedline del { + background-color: #faa; +} + +table.diff .diff-addedline { + position: relative; + background-color: #e9ffe9; +} + +table.diff .diff-deletedline .dashicons, +table.diff .diff-addedline .dashicons { + position: absolute; + top: 0.85714286em; + left: 0.5em; + width: 1em; + height: 1em; + font-size: 1em; + line-height: 1; +} + +table.diff .diff-addedline .dashicons { + /* Compensate the vertically non-centered plus glyph. */ + top: 0.92857143em; +} + +table.diff .diff-addedline ins { + background-color: #afa; +} + +.diff-meta { + padding: 5px; + clear: both; + min-height: 32px; +} + +.diff-title strong { + line-height: 2.46153846; + min-width: 60px; + text-align: right; + float: left; + margin-right: 5px; +} + +.revisions-controls .author-card .author-info { + font-size: 12px; + line-height: 1.33333333; +} + +.revisions-controls .author-card .avatar, +.revisions-controls .author-card .author-info { + float: left; + margin-left: 6px; + margin-right: 6px; +} + +.revisions-controls .author-card .byline { + display: block; + font-size: 12px; +} + +.revisions-controls .author-card .avatar { + vertical-align: middle; +} + +.diff-meta input.restore-revision { + float: right; + margin-left: 6px; + margin-right: 6px; + margin-top: 2px; +} + +.diff-meta-from { + display: none; +} + +.comparing-two-revisions .diff-meta-from { + display: block; +} + +.revisions-tooltip { + position: absolute; + bottom: 105px; + margin-right: 0; + margin-left: -69px; + z-index: 0; + max-width: 350px; + min-width: 130px; + padding: 8px 4px; + display: none; + opacity: 0; +} + +.revisions-tooltip.flipped { + margin-left: 0; + margin-right: -70px; +} + +.revisions.pinned .revisions-tooltip { + display: none !important; +} + +.comparing-two-revisions .revisions-tooltip { + bottom: 145px; +} + +.revisions-tooltip-arrow { + width: 70px; + height: 15px; + overflow: hidden; + position: absolute; + left: 0; + margin-left: 35px; + bottom: -15px; +} + +.revisions-tooltip.flipped .revisions-tooltip-arrow { + margin-left: 0; + margin-right: 35px; + left: auto; + right: 0; +} + +.revisions-tooltip-arrow > span { + content: ""; + position: absolute; + left: 20px; + top: -20px; + width: 25px; + height: 25px; + transform: rotate(45deg); +} + +.revisions-tooltip.flipped .revisions-tooltip-arrow > span { + left: auto; + right: 20px; +} + +.ie8 .revisions-tooltip-arrow > span { + left: 15px; + top: -25px; + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476)"; +} + +.ie8 .revisions-tooltip.flipped .revisions-tooltip-arrow > span { + right: 25px; +} + +.revisions-tooltip, +.revisions-tooltip-arrow > span { + border: 1px solid #ddd; + background-color: #fff; +} + +.revisions-tooltip { + display: none; +} + +.arrow { + width: 70px; + height: 16px; + overflow: hidden; + position: absolute; + left: 0; + margin-left: -35px; + bottom: 90px; + z-index: 10000; +} + +.arrow:after { + z-index: 9999; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.arrow.top { + top: -16px; + bottom: auto; +} + +.arrow.left { + left: 20%; +} + +.arrow:after { + content: ""; + position: absolute; + left: 20px; + top: -20px; + width: 25px; + height: 25px; + transform: rotate(45deg); +} + +.revisions-tooltip, +.revisions-tooltip-arrow:after { + border-width: 1px; + border-style: solid; +} + +div.revisions-controls > .wp-slider > .ui-slider-handle { + margin-left: -10px; +} + +.rtl div.revisions-controls > .wp-slider > .ui-slider-handle { + margin-right: -10px; +} + +/* jQuery UI Slider */ +.wp-slider.ui-slider { + position: relative; + border: 1px solid #ddd; + text-align: left; + cursor: pointer; +} + +.wp-slider .ui-slider-handle { + border-radius: 50%; + height: 18px; + margin-top: -5px; + outline: none; + padding: 2px; + position: absolute; + width: 18px; + z-index: 2; + touch-action: none; +} + +.wp-slider .ui-slider-handle, +.wp-slider .ui-slider-handle.focus { + background: #f7f7f7; + border: 1px solid #ccc; + box-shadow: 0 1px 0 #cccccc; +} + +.wp-slider .ui-slider-handle:hover, +.wp-slider .ui-slider-handle.ui-state-hover { + background: #fafafa; + border-color: #999; +} + +.wp-slider .ui-slider-handle:active, +.wp-slider .ui-slider-handle.ui-state-active { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); + transform: translateY(1px); +} + +.wp-slider .ui-slider-handle:before { + background: none; + position: absolute; + top: 2px; + left: 2px; + color: #555; + content: "\f229"; + font: normal 18px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-slider .ui-slider-handle:hover:before, +.wp-slider .ui-slider-handle.ui-state-hover:before { + color: #23282d; +} + +.wp-slider .ui-slider-handle.from-handle:before, +.wp-slider .ui-slider-handle.to-handle:before { + font-size: 20px !important; + margin: -1px 0 0 -1px; +} + +.wp-slider .ui-slider-handle.from-handle:before { + content: "\f139"; +} + +.wp-slider .ui-slider-handle.to-handle:before { + content: "\f141"; +} + +.rtl .wp-slider .ui-slider-handle.from-handle:before { + content: "\f141"; +} + +.rtl .wp-slider .ui-slider-handle.to-handle:before { + content: "\f139"; + right: -1px; +} + +.wp-slider .ui-slider-range { + position: absolute; + font-size: 0.7em; + display: block; + border: 0; + background-color: transparent; + background-image: none; +} + +.wp-slider.ui-slider-horizontal { + height: 0.7em; +} + +.wp-slider.ui-slider-horizontal .ui-slider-handle { + top: -.25em; + margin-left: -.6em; +} + +.wp-slider.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} + +.wp-slider.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} + +.wp-slider.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + .revision-tick.completed-false { + background-image: url(../images/spinner-2x.gif); + } +} + +@media screen and (max-width: 782px) { + #diff-next-revision, + #diff-previous-revision { + margin-top: -1em; + } + + .revisions-buttons { + overflow: hidden; + margin-bottom: 15px; + } + + .revisions-controls, + .comparing-two-revisions .revisions-controls { + height: 170px; + } + + .revisions-tooltip { + bottom: 130px; + z-index: 2; + } + + .diff-meta { + overflow: hidden; + } + + table.diff { + -ms-word-break: break-all; + word-break: break-all; + word-wrap: break-word; + } + + .diff-meta input.restore-revision { + margin-top: 0; + } +} diff --git a/wp-admin/css/revisions.min.css b/wp-admin/css/revisions.min.css new file mode 100644 index 0000000..81e02de --- /dev/null +++ b/wp-admin/css/revisions.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.revisions-control-frame,.revisions-diff-frame{position:relative}.revisions-diff-frame{top:10px}.revisions-controls{padding-top:40px;z-index:1}.revisions-controls input[type=checkbox]{position:relative;top:-1px;vertical-align:text-bottom}.revisions.pinned .revisions-controls{position:fixed;top:0;height:82px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.revisions-tickmarks{position:relative;margin:0 auto;height:.7em;top:7px;max-width:70%;box-sizing:border-box;background-color:#fff}.revisions-tickmarks>div{position:absolute;height:100%;border-left:1px solid #a0a5aa;box-sizing:border-box}.revisions-tickmarks>div:first-child{border-width:0}.comparing-two-revisions .revisions-controls{height:140px}.comparing-two-revisions.pinned .revisions-controls{height:124px}.revisions .diff-error{position:absolute;text-align:center;margin:0 auto;width:100%;display:none}.revisions.diff-error .diff-error{display:block}.revisions .loading-indicator{position:absolute;vertical-align:middle;opacity:0;width:100%;width:calc(100% - 30px);top:50%;top:calc(50% - 10px);transition:opacity .5s;filter:alpha(opacity=0)}body.folded .revisions .loading-indicator{margin-left:-32px}.revisions .loading-indicator span.spinner{display:block;margin:0 auto;float:none}.revisions.loading .loading-indicator{opacity:1;filter:alpha(opacity=100)}.revisions .diff{transition:opacity .5s}.revisions.loading .diff{opacity:.5;filter:alpha(opacity=50)}.revisions.diff-error .diff{visibility:hidden}.revisions-meta{margin-top:20px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1);overflow:hidden}.revisions.pinned .revisions-meta{box-shadow:none}.revision-toggle-compare-mode{position:absolute;top:0;right:0}.comparing-two-revisions .revisions-next,.comparing-two-revisions .revisions-previous,.revisions-meta .diff-meta-to strong{display:none}.revisions-controls .author-card .date{color:#72777c}.revisions-controls .author-card.autosave{color:#d54e21}.revisions-controls .author-card .author-name{font-weight:600}.comparing-two-revisions .diff-meta-to strong{display:block}.revisions.pinned .revisions-buttons{padding:0 11px}.revisions-next,.revisions-previous{position:relative;z-index:1}.revisions-previous{float:left}.revisions-next{float:right}.revisions-controls .wp-slider{max-width:70%;margin:0 auto;top:-3px}.revisions-diff{padding:15px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.revisions-diff h3:first-child{margin-top:0}#revisions-meta-restored img,.post-revisions li img{vertical-align:middle}table.diff tbody tr td:nth-child(2){width:4%}table.diff{table-layout:fixed;width:100%;white-space:pre-wrap}table.diff col.content{width:auto}table.diff col.content.diffsplit{width:48%}table.diff col.diffsplit.middle{width:auto}table.diff col.ltype{width:30px}table.diff tr{background-color:transparent}table.diff td,table.diff th{font-family:Consolas,Monaco,monospace;font-size:14px;line-height:1.57142857;padding:.5em .5em .5em 2em;vertical-align:top;word-wrap:break-word}table.diff td h1,table.diff td h2,table.diff td h3,table.diff td h4,table.diff td h5,table.diff td h6{margin:0}table.diff .diff-addedline ins,table.diff .diff-deletedline del{text-decoration:none}table.diff .diff-deletedline{position:relative;background-color:#ffe9e9}table.diff .diff-deletedline del{background-color:#faa}table.diff .diff-addedline{position:relative;background-color:#e9ffe9}table.diff .diff-addedline .dashicons,table.diff .diff-deletedline .dashicons{position:absolute;top:.85714286em;left:.5em;width:1em;height:1em;font-size:1em;line-height:1}table.diff .diff-addedline .dashicons{top:.92857143em}table.diff .diff-addedline ins{background-color:#afa}.diff-meta{padding:5px;clear:both;min-height:32px}.diff-title strong{line-height:2.46153846;min-width:60px;text-align:right;float:left;margin-right:5px}.revisions-controls .author-card .author-info{font-size:12px;line-height:1.33333333}.revisions-controls .author-card .author-info,.revisions-controls .author-card .avatar{float:left;margin-left:6px;margin-right:6px}.revisions-controls .author-card .byline{display:block;font-size:12px}.revisions-controls .author-card .avatar{vertical-align:middle}.diff-meta input.restore-revision{float:right;margin-left:6px;margin-right:6px;margin-top:2px}.diff-meta-from{display:none}.comparing-two-revisions .diff-meta-from{display:block}.revisions-tooltip{position:absolute;bottom:105px;margin-right:0;margin-left:-69px;z-index:0;max-width:350px;min-width:130px;padding:8px 4px;display:none;opacity:0}.revisions-tooltip.flipped{margin-left:0;margin-right:-70px}.revisions.pinned .revisions-tooltip{display:none!important}.comparing-two-revisions .revisions-tooltip{bottom:145px}.revisions-tooltip-arrow{width:70px;height:15px;overflow:hidden;position:absolute;left:0;margin-left:35px;bottom:-15px}.revisions-tooltip.flipped .revisions-tooltip-arrow{margin-left:0;margin-right:35px;left:auto;right:0}.revisions-tooltip-arrow>span{content:"";position:absolute;left:20px;top:-20px;width:25px;height:25px;transform:rotate(45deg)}.revisions-tooltip.flipped .revisions-tooltip-arrow>span{left:auto;right:20px}.ie8 .revisions-tooltip-arrow>span{left:15px;top:-25px;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476)"}.ie8 .revisions-tooltip.flipped .revisions-tooltip-arrow>span{right:25px}.revisions-tooltip,.revisions-tooltip-arrow>span{border:1px solid #ddd;background-color:#fff}.revisions-tooltip{display:none}.arrow{width:70px;height:16px;overflow:hidden;position:absolute;left:0;margin-left:-35px;bottom:90px;z-index:10000}.arrow:after{z-index:9999;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.1)}.arrow.top{top:-16px;bottom:auto}.arrow.left{left:20%}.arrow:after{content:"";position:absolute;left:20px;top:-20px;width:25px;height:25px;transform:rotate(45deg)}.revisions-tooltip,.revisions-tooltip-arrow:after{border-width:1px;border-style:solid}div.revisions-controls>.wp-slider>.ui-slider-handle{margin-left:-10px}.rtl div.revisions-controls>.wp-slider>.ui-slider-handle{margin-right:-10px}.wp-slider.ui-slider{position:relative;border:1px solid #ddd;text-align:left;cursor:pointer}.wp-slider .ui-slider-handle{border-radius:50%;height:18px;margin-top:-5px;outline:0;padding:2px;position:absolute;width:18px;z-index:2;touch-action:none}.wp-slider .ui-slider-handle,.wp-slider .ui-slider-handle.focus{background:#f7f7f7;border:1px solid #ccc;box-shadow:0 1px 0 #ccc}.wp-slider .ui-slider-handle.ui-state-hover,.wp-slider .ui-slider-handle:hover{background:#fafafa;border-color:#999}.wp-slider .ui-slider-handle.ui-state-active,.wp-slider .ui-slider-handle:active{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);transform:translateY(1px)}.wp-slider .ui-slider-handle:before{background:0 0;position:absolute;top:2px;left:2px;color:#555;content:"\f229";font:normal 18px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-slider .ui-slider-handle.ui-state-hover:before,.wp-slider .ui-slider-handle:hover:before{color:#23282d}.wp-slider .ui-slider-handle.from-handle:before,.wp-slider .ui-slider-handle.to-handle:before{font-size:20px!important;margin:-1px 0 0 -1px}.wp-slider .ui-slider-handle.from-handle:before{content:"\f139"}.wp-slider .ui-slider-handle.to-handle:before{content:"\f141"}.rtl .wp-slider .ui-slider-handle.from-handle:before{content:"\f141"}.rtl .wp-slider .ui-slider-handle.to-handle:before{content:"\f139";right:-1px}.wp-slider .ui-slider-range{position:absolute;font-size:.7em;display:block;border:0;background-color:transparent;background-image:none}.wp-slider.ui-slider-horizontal{height:.7em}.wp-slider.ui-slider-horizontal .ui-slider-handle{top:-.25em;margin-left:-.6em}.wp-slider.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.wp-slider.ui-slider-horizontal .ui-slider-range-min{left:0}.wp-slider.ui-slider-horizontal .ui-slider-range-max{right:0}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.revision-tick.completed-false{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){#diff-next-revision,#diff-previous-revision{margin-top:-1em}.revisions-buttons{overflow:hidden;margin-bottom:15px}.comparing-two-revisions .revisions-controls,.revisions-controls{height:170px}.revisions-tooltip{bottom:130px;z-index:2}.diff-meta{overflow:hidden}table.diff{-ms-word-break:break-all;word-break:break-all;word-wrap:break-word}.diff-meta input.restore-revision{margin-top:0}} \ No newline at end of file diff --git a/wp-admin/css/site-health-rtl.css b/wp-admin/css/site-health-rtl.css new file mode 100644 index 0000000..5f2c8f4 --- /dev/null +++ b/wp-admin/css/site-health-rtl.css @@ -0,0 +1,464 @@ +/*! This file is auto-generated */ +.site-health #wpcontent, +.site-health.auto-fold #wpcontent { + padding-right: 0; +} + +/* Emulates .wrap h1 styling */ +.health-check-header h1 { + display: inline-block; + font-weight: 600; + margin: 0 0.8rem 1rem; + font-size: 23px; + padding: 9px 0 4px 0; + line-height: 1.3; +} + +.health-check-body h2 { + padding: 1rem 0; + line-height: 1.4; +} + +.health-check-body h3 { + padding: 0; + font-weight: 400; +} + +.health-check-header { + text-align: center; + margin: 0 0 1rem; + background: #fff; + border-bottom: 1px solid #e2e4e7; +} + +.health-check-title-section { + display: flex; + align-items: center; + justify-content: center; + clear: both; +} + +.site-health-progress-wrapper { + margin-bottom: 1rem; +} + +.site-health-progress { + display: inline-block; + height: 20px; + width: 20px; + margin: 0; + border-radius: 100%; + position: relative; + font-weight: 600; + font-size: 0.4rem; +} + +.site-health-progress-count { + position: absolute; + display: block; + height: 80px; + width: 80px; + right: 50%; + top: 50%; + margin-top: -40px; + margin-right: -40px; + border-radius: 100%; + line-height: 6.3; + font-size: 2em; +} + +.loading .site-health-progress svg #bar { + stroke-dashoffset: 0; + stroke: #adc5d2; + animation: loadingPulse 3s infinite ease-in-out; +} + +.site-health-progress svg circle { + stroke-dashoffset: 0; + transition: stroke-dashoffset 1s linear; + stroke: #ccc; + stroke-width: 2em; +} + +.site-health-progress svg #bar { + stroke-dashoffset: 565; + stroke: #dc3232; +} + +.green .site-health-progress #bar { + stroke: #46b450; +} +.green .site-health-progress .site-health-progress-label { + color: #46b450; +} + +.orange .site-health-progress #bar { + stroke: #ffb900; +} +.orange .site-health-progress .site-health-progress-label { + color: #ffb900; +} + +.site-health-progress-label { + font-weight: 600; + line-height: 20px; + margin-right: 0.3rem; +} + +@keyframes loadingPulse { + 0% { + stroke: #adc5d2; + } + 50% { + stroke: #00a0d2; + } + 100% { + stroke: #adc5d2; + } +} + +.health-check-tabs-wrapper { + /* IE 11 */ + display: -ms-inline-grid; + -ms-grid-columns: 1fr 1fr; + vertical-align: top; + /* modern browsers */ + display: inline-grid; + grid-template-columns: 1fr 1fr; +} + +.health-check-tab { + display: block; /* IE 11 */ + text-decoration: none; + color: inherit; + padding: 0.5rem 1rem 1rem; + margin: 0 1rem; + transition: box-shadow 0.5s ease-in-out; +} + +.health-check-tab:nth-child(1) { + -ms-grid-column: 1; /* IE 11 */ +} + +.health-check-tab:nth-child(2) { + -ms-grid-column: 2; /* IE 11 */ +} + +.health-check-tab:focus { + color: #191e23; + outline: 1px solid #6c7781; + box-shadow: none; +} + +.health-check-tab.active { + box-shadow: inset 0 -3px #007cba; + font-weight: 600; +} + +.health-check-body { + max-width: 800px; + margin: 0 auto; +} + +.health-check-table td:first-child { + width: 30%; +} + +.health-check-table td { + width: 70%; +} + +.health-check-table ul, +.health-check-table ol { + margin: 0; +} + +.health-check-body li { + line-height: 1.5; +} + +.health-check-body .pass::before, +.health-check-body .good::before { + content: "\f147"; + color: #46b450; +} + +.health-check-body .warning::before { + content: "\f460"; + color: #ffb900; +} + +.health-check-body .info::before { + content: "\f348"; + color: #00a0d2; +} + +.health-check-body .fail::before, +.health-check-body .error::before { + content: "\f335"; + color: #dc3232; +} + +.site-health-copy-buttons { + margin: 1rem 0; +} + +.site-health-copy-buttons .copy-button-wrapper { + margin: 0.5rem 0 1rem; +} + +.site-health-copy-buttons .success { + display: none; + color: #40860a; + line-height: 1.8; + margin-right: 0.5rem; +} + +.site-health-copy-buttons .success.visible { + display: inline-block; + height: 30px; + line-height: 2.30769231; +} + +.site-status-has-issues.hide { + display: none; +} + +.site-health-view-more { + text-align: center; +} + +.site-health-issues-wrapper:first-of-type { + margin-top: 3rem; +} + +.site-health-issues-wrapper { + margin-bottom: 3rem; + margin-top: 2rem; +} + +.site-status-all-clear { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + height: 100%; + width: 100%; + margin-top: 0; +} + +@media all and (min-width: 784px) { + .site-status-all-clear { + margin: 5rem 0; + } +} + +.site-status-all-clear.hide { + display: none; +} + +.site-status-all-clear .dashicons { + font-size: 150px; + height: 130px; + width: 150px; +} + +.site-status-all-clear .encouragement { + font-size: 1.5rem; + font-weight: 600; +} + +.site-status-all-clear p { + margin: 0; +} + +.health-check-accordion { + border: 1px solid #ccd0d4; +} + +.health-check-accordion-heading { + margin: 0; + border-top: 1px solid #ccd0d4; + font-size: inherit; + line-height: inherit; + font-weight: 600; + color: inherit; +} + +.health-check-accordion-heading:first-child { + border-top: none; +} + +.health-check-accordion-trigger { + background: #fff; + border: 0; + color: #32373c; + cursor: pointer; + display: flex; + font-weight: 400; + margin: 0; + padding: 1em 1.5em 1em 3.5em; + min-height: 46px; + position: relative; + text-align: right; + width: 100%; + align-items: center; + justify-content: space-between; +} + +.wp-core-ui .button.site-health-view-passed { + position: relative; + padding-left: 40px; + padding-right: 20px; +} + +.health-check-accordion-trigger:hover, +.health-check-accordion-trigger:active { + background: #f8f9f9; +} + +.health-check-accordion-trigger:focus { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -1px; + outline: 2px solid #0071a1; + background-color: #f8f9f9; +} + +.health-check-accordion-trigger .title { + pointer-events: none; + font-weight: 600; + flex-grow: 1; +} + +.health-check-accordion-trigger .icon, +.site-health-view-passed .icon { + border: solid #555d66; + border-width: 0 0 2px 2px; + height: 0.5rem; + pointer-events: none; + position: absolute; + left: 1.5em; + top: 50%; + transform: translateY(-70%) rotate(-45deg); + width: 0.5rem; +} + +.health-check-accordion-trigger .badge { + padding: 0.1rem 0.5rem 0.15rem; + color: #32373c; + font-weight: 600; + margin-right: 0.5rem; +} + +.health-check-accordion-trigger .badge.blue { + border: 1px solid #bfe7f3; +} + +.health-check-accordion-trigger .badge.orange { + border: 1px solid #ffb900; +} + +.health-check-accordion-trigger .badge.red { + border: 1px solid #dc3232; +} + +.health-check-accordion-trigger .badge.green { + border: 1px solid #46b450; +} + +.health-check-accordion-trigger .badge.purple { + border: 1px solid #826eb4; +} + +.health-check-accordion-trigger .badge.gray { + border: 1px solid #ccd0d4; +} + +.health-check-accordion-trigger[aria-expanded="true"] .icon, +.site-health-view-passed[aria-expanded="true"] .icon { + transform: translateY(-30%) rotate(135deg) +} + +.health-check-accordion-panel { + margin: 0; + padding: 1em 1.5em; + background: #fff; +} + +.health-check-accordion-panel[hidden] { + display: none; +} + +.health-check-accordion-panel a .dashicons { + text-decoration: none; +} + +/* Better position for the WordPress admin notices and update nag. */ +.site-health .notice { + margin: 5px 22px 15px 20px; +} + +.site-health .update-nag { + margin-bottom: 20px; + margin-right: 22px; +} + +.health-check-wp-paths-sizes.spinner { + visibility: visible; + float: none; + margin: 0 4px; + flex-shrink: 0; +} + +@media screen and (max-width: 782px) { + .health-check-body { + margin: 0 12px; + width: auto; + } + + .site-health .notice { + margin: 5px 10px 15px; + } + + .site-health .update-nag { + margin-left: 10px; + margin-right: 10px; + } + + .site-health-issues-wrapper .health-check-accordion-trigger { + flex-direction: column; + align-items: flex-start; + } + + .health-check-accordion-trigger .badge { + margin: 1em 0 0; + } + + .health-check-table { + table-layout: fixed; + } + + .health-check-table td { + box-sizing: border-box; + display: block; + width: 100%; + word-wrap: break-word; + } + + .health-check-table td:first-child { + width: 100%; + padding-bottom: 0; + font-weight: 600; + } +} + +/* The breakpoint is usually at 960px, the additional space is to allow for the margin. */ +@media only screen and (max-width: 1004px) { + .health-check-body { + margin: 0 22px; + width: auto; + } +} diff --git a/wp-admin/css/site-health-rtl.min.css b/wp-admin/css/site-health-rtl.min.css new file mode 100644 index 0000000..528d518 --- /dev/null +++ b/wp-admin/css/site-health-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.site-health #wpcontent,.site-health.auto-fold #wpcontent{padding-right:0}.health-check-header h1{display:inline-block;font-weight:600;margin:0 .8rem 1rem;font-size:23px;padding:9px 0 4px 0;line-height:1.3}.health-check-body h2{padding:1rem 0;line-height:1.4}.health-check-body h3{padding:0;font-weight:400}.health-check-header{text-align:center;margin:0 0 1rem;background:#fff;border-bottom:1px solid #e2e4e7}.health-check-title-section{display:flex;align-items:center;justify-content:center;clear:both}.site-health-progress-wrapper{margin-bottom:1rem}.site-health-progress{display:inline-block;height:20px;width:20px;margin:0;border-radius:100%;position:relative;font-weight:600;font-size:.4rem}.site-health-progress-count{position:absolute;display:block;height:80px;width:80px;right:50%;top:50%;margin-top:-40px;margin-right:-40px;border-radius:100%;line-height:6.3;font-size:2em}.loading .site-health-progress svg #bar{stroke-dashoffset:0;stroke:#adc5d2;animation:loadingPulse 3s infinite ease-in-out}.site-health-progress svg circle{stroke-dashoffset:0;transition:stroke-dashoffset 1s linear;stroke:#ccc;stroke-width:2em}.site-health-progress svg #bar{stroke-dashoffset:565;stroke:#dc3232}.green .site-health-progress #bar{stroke:#46b450}.green .site-health-progress .site-health-progress-label{color:#46b450}.orange .site-health-progress #bar{stroke:#ffb900}.orange .site-health-progress .site-health-progress-label{color:#ffb900}.site-health-progress-label{font-weight:600;line-height:20px;margin-right:.3rem}@keyframes loadingPulse{0%{stroke:#adc5d2}50%{stroke:#00a0d2}100%{stroke:#adc5d2}}.health-check-tabs-wrapper{display:-ms-inline-grid;-ms-grid-columns:1fr 1fr;vertical-align:top;display:inline-grid;grid-template-columns:1fr 1fr}.health-check-tab{display:block;text-decoration:none;color:inherit;padding:.5rem 1rem 1rem;margin:0 1rem;transition:box-shadow .5s ease-in-out}.health-check-tab:nth-child(1){-ms-grid-column:1}.health-check-tab:nth-child(2){-ms-grid-column:2}.health-check-tab:focus{color:#191e23;outline:1px solid #6c7781;box-shadow:none}.health-check-tab.active{box-shadow:inset 0 -3px #007cba;font-weight:600}.health-check-body{max-width:800px;margin:0 auto}.health-check-table td:first-child{width:30%}.health-check-table td{width:70%}.health-check-table ol,.health-check-table ul{margin:0}.health-check-body li{line-height:1.5}.health-check-body .good::before,.health-check-body .pass::before{content:"\f147";color:#46b450}.health-check-body .warning::before{content:"\f460";color:#ffb900}.health-check-body .info::before{content:"\f348";color:#00a0d2}.health-check-body .error::before,.health-check-body .fail::before{content:"\f335";color:#dc3232}.site-health-copy-buttons{margin:1rem 0}.site-health-copy-buttons .copy-button-wrapper{margin:.5rem 0 1rem}.site-health-copy-buttons .success{display:none;color:#40860a;line-height:1.8;margin-right:.5rem}.site-health-copy-buttons .success.visible{display:inline-block;height:30px;line-height:2.30769231}.site-status-has-issues.hide{display:none}.site-health-view-more{text-align:center}.site-health-issues-wrapper:first-of-type{margin-top:3rem}.site-health-issues-wrapper{margin-bottom:3rem;margin-top:2rem}.site-status-all-clear{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:100%;width:100%;margin-top:0}@media all and (min-width:784px){.site-status-all-clear{margin:5rem 0}}.site-status-all-clear.hide{display:none}.site-status-all-clear .dashicons{font-size:150px;height:130px;width:150px}.site-status-all-clear .encouragement{font-size:1.5rem;font-weight:600}.site-status-all-clear p{margin:0}.health-check-accordion{border:1px solid #ccd0d4}.health-check-accordion-heading{margin:0;border-top:1px solid #ccd0d4;font-size:inherit;line-height:inherit;font-weight:600;color:inherit}.health-check-accordion-heading:first-child{border-top:none}.health-check-accordion-trigger{background:#fff;border:0;color:#32373c;cursor:pointer;display:flex;font-weight:400;margin:0;padding:1em 1.5em 1em 3.5em;min-height:46px;position:relative;text-align:right;width:100%;align-items:center;justify-content:space-between}.wp-core-ui .button.site-health-view-passed{position:relative;padding-left:40px;padding-right:20px}.health-check-accordion-trigger:active,.health-check-accordion-trigger:hover{background:#f8f9f9}.health-check-accordion-trigger:focus{color:#191e23;border:none;box-shadow:none;outline-offset:-1px;outline:2px solid #0071a1;background-color:#f8f9f9}.health-check-accordion-trigger .title{pointer-events:none;font-weight:600;flex-grow:1}.health-check-accordion-trigger .icon,.site-health-view-passed .icon{border:solid #555d66;border-width:0 0 2px 2px;height:.5rem;pointer-events:none;position:absolute;left:1.5em;top:50%;transform:translateY(-70%) rotate(-45deg);width:.5rem}.health-check-accordion-trigger .badge{padding:.1rem .5rem .15rem;color:#32373c;font-weight:600;margin-right:.5rem}.health-check-accordion-trigger .badge.blue{border:1px solid #bfe7f3}.health-check-accordion-trigger .badge.orange{border:1px solid #ffb900}.health-check-accordion-trigger .badge.red{border:1px solid #dc3232}.health-check-accordion-trigger .badge.green{border:1px solid #46b450}.health-check-accordion-trigger .badge.purple{border:1px solid #826eb4}.health-check-accordion-trigger .badge.gray{border:1px solid #ccd0d4}.health-check-accordion-trigger[aria-expanded=true] .icon,.site-health-view-passed[aria-expanded=true] .icon{transform:translateY(-30%) rotate(135deg)}.health-check-accordion-panel{margin:0;padding:1em 1.5em;background:#fff}.health-check-accordion-panel[hidden]{display:none}.health-check-accordion-panel a .dashicons{text-decoration:none}.site-health .notice{margin:5px 22px 15px 20px}.site-health .update-nag{margin-bottom:20px;margin-right:22px}.health-check-wp-paths-sizes.spinner{visibility:visible;float:none;margin:0 4px;flex-shrink:0}@media screen and (max-width:782px){.health-check-body{margin:0 12px;width:auto}.site-health .notice{margin:5px 10px 15px}.site-health .update-nag{margin-left:10px;margin-right:10px}.site-health-issues-wrapper .health-check-accordion-trigger{flex-direction:column;align-items:flex-start}.health-check-accordion-trigger .badge{margin:1em 0 0}.health-check-table{table-layout:fixed}.health-check-table td{box-sizing:border-box;display:block;width:100%;word-wrap:break-word}.health-check-table td:first-child{width:100%;padding-bottom:0;font-weight:600}}@media only screen and (max-width:1004px){.health-check-body{margin:0 22px;width:auto}} \ No newline at end of file diff --git a/wp-admin/css/site-health.css b/wp-admin/css/site-health.css new file mode 100644 index 0000000..6efc630 --- /dev/null +++ b/wp-admin/css/site-health.css @@ -0,0 +1,463 @@ +.site-health #wpcontent, +.site-health.auto-fold #wpcontent { + padding-left: 0; +} + +/* Emulates .wrap h1 styling */ +.health-check-header h1 { + display: inline-block; + font-weight: 600; + margin: 0 0.8rem 1rem; + font-size: 23px; + padding: 9px 0 4px 0; + line-height: 1.3; +} + +.health-check-body h2 { + padding: 1rem 0; + line-height: 1.4; +} + +.health-check-body h3 { + padding: 0; + font-weight: 400; +} + +.health-check-header { + text-align: center; + margin: 0 0 1rem; + background: #fff; + border-bottom: 1px solid #e2e4e7; +} + +.health-check-title-section { + display: flex; + align-items: center; + justify-content: center; + clear: both; +} + +.site-health-progress-wrapper { + margin-bottom: 1rem; +} + +.site-health-progress { + display: inline-block; + height: 20px; + width: 20px; + margin: 0; + border-radius: 100%; + position: relative; + font-weight: 600; + font-size: 0.4rem; +} + +.site-health-progress-count { + position: absolute; + display: block; + height: 80px; + width: 80px; + left: 50%; + top: 50%; + margin-top: -40px; + margin-left: -40px; + border-radius: 100%; + line-height: 6.3; + font-size: 2em; +} + +.loading .site-health-progress svg #bar { + stroke-dashoffset: 0; + stroke: #adc5d2; + animation: loadingPulse 3s infinite ease-in-out; +} + +.site-health-progress svg circle { + stroke-dashoffset: 0; + transition: stroke-dashoffset 1s linear; + stroke: #ccc; + stroke-width: 2em; +} + +.site-health-progress svg #bar { + stroke-dashoffset: 565; + stroke: #dc3232; +} + +.green .site-health-progress #bar { + stroke: #46b450; +} +.green .site-health-progress .site-health-progress-label { + color: #46b450; +} + +.orange .site-health-progress #bar { + stroke: #ffb900; +} +.orange .site-health-progress .site-health-progress-label { + color: #ffb900; +} + +.site-health-progress-label { + font-weight: 600; + line-height: 20px; + margin-left: 0.3rem; +} + +@keyframes loadingPulse { + 0% { + stroke: #adc5d2; + } + 50% { + stroke: #00a0d2; + } + 100% { + stroke: #adc5d2; + } +} + +.health-check-tabs-wrapper { + /* IE 11 */ + display: -ms-inline-grid; + -ms-grid-columns: 1fr 1fr; + vertical-align: top; + /* modern browsers */ + display: inline-grid; + grid-template-columns: 1fr 1fr; +} + +.health-check-tab { + display: block; /* IE 11 */ + text-decoration: none; + color: inherit; + padding: 0.5rem 1rem 1rem; + margin: 0 1rem; + transition: box-shadow 0.5s ease-in-out; +} + +.health-check-tab:nth-child(1) { + -ms-grid-column: 1; /* IE 11 */ +} + +.health-check-tab:nth-child(2) { + -ms-grid-column: 2; /* IE 11 */ +} + +.health-check-tab:focus { + color: #191e23; + outline: 1px solid #6c7781; + box-shadow: none; +} + +.health-check-tab.active { + box-shadow: inset 0 -3px #007cba; + font-weight: 600; +} + +.health-check-body { + max-width: 800px; + margin: 0 auto; +} + +.health-check-table td:first-child { + width: 30%; +} + +.health-check-table td { + width: 70%; +} + +.health-check-table ul, +.health-check-table ol { + margin: 0; +} + +.health-check-body li { + line-height: 1.5; +} + +.health-check-body .pass::before, +.health-check-body .good::before { + content: "\f147"; + color: #46b450; +} + +.health-check-body .warning::before { + content: "\f460"; + color: #ffb900; +} + +.health-check-body .info::before { + content: "\f348"; + color: #00a0d2; +} + +.health-check-body .fail::before, +.health-check-body .error::before { + content: "\f335"; + color: #dc3232; +} + +.site-health-copy-buttons { + margin: 1rem 0; +} + +.site-health-copy-buttons .copy-button-wrapper { + margin: 0.5rem 0 1rem; +} + +.site-health-copy-buttons .success { + display: none; + color: #40860a; + line-height: 1.8; + margin-left: 0.5rem; +} + +.site-health-copy-buttons .success.visible { + display: inline-block; + height: 30px; + line-height: 2.30769231; +} + +.site-status-has-issues.hide { + display: none; +} + +.site-health-view-more { + text-align: center; +} + +.site-health-issues-wrapper:first-of-type { + margin-top: 3rem; +} + +.site-health-issues-wrapper { + margin-bottom: 3rem; + margin-top: 2rem; +} + +.site-status-all-clear { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + height: 100%; + width: 100%; + margin-top: 0; +} + +@media all and (min-width: 784px) { + .site-status-all-clear { + margin: 5rem 0; + } +} + +.site-status-all-clear.hide { + display: none; +} + +.site-status-all-clear .dashicons { + font-size: 150px; + height: 130px; + width: 150px; +} + +.site-status-all-clear .encouragement { + font-size: 1.5rem; + font-weight: 600; +} + +.site-status-all-clear p { + margin: 0; +} + +.health-check-accordion { + border: 1px solid #ccd0d4; +} + +.health-check-accordion-heading { + margin: 0; + border-top: 1px solid #ccd0d4; + font-size: inherit; + line-height: inherit; + font-weight: 600; + color: inherit; +} + +.health-check-accordion-heading:first-child { + border-top: none; +} + +.health-check-accordion-trigger { + background: #fff; + border: 0; + color: #32373c; + cursor: pointer; + display: flex; + font-weight: 400; + margin: 0; + padding: 1em 3.5em 1em 1.5em; + min-height: 46px; + position: relative; + text-align: left; + width: 100%; + align-items: center; + justify-content: space-between; +} + +.wp-core-ui .button.site-health-view-passed { + position: relative; + padding-right: 40px; + padding-left: 20px; +} + +.health-check-accordion-trigger:hover, +.health-check-accordion-trigger:active { + background: #f8f9f9; +} + +.health-check-accordion-trigger:focus { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -1px; + outline: 2px solid #0071a1; + background-color: #f8f9f9; +} + +.health-check-accordion-trigger .title { + pointer-events: none; + font-weight: 600; + flex-grow: 1; +} + +.health-check-accordion-trigger .icon, +.site-health-view-passed .icon { + border: solid #555d66; + border-width: 0 2px 2px 0; + height: 0.5rem; + pointer-events: none; + position: absolute; + right: 1.5em; + top: 50%; + transform: translateY(-70%) rotate(45deg); + width: 0.5rem; +} + +.health-check-accordion-trigger .badge { + padding: 0.1rem 0.5rem 0.15rem; + color: #32373c; + font-weight: 600; + margin-left: 0.5rem; +} + +.health-check-accordion-trigger .badge.blue { + border: 1px solid #bfe7f3; +} + +.health-check-accordion-trigger .badge.orange { + border: 1px solid #ffb900; +} + +.health-check-accordion-trigger .badge.red { + border: 1px solid #dc3232; +} + +.health-check-accordion-trigger .badge.green { + border: 1px solid #46b450; +} + +.health-check-accordion-trigger .badge.purple { + border: 1px solid #826eb4; +} + +.health-check-accordion-trigger .badge.gray { + border: 1px solid #ccd0d4; +} + +.health-check-accordion-trigger[aria-expanded="true"] .icon, +.site-health-view-passed[aria-expanded="true"] .icon { + transform: translateY(-30%) rotate(-135deg) +} + +.health-check-accordion-panel { + margin: 0; + padding: 1em 1.5em; + background: #fff; +} + +.health-check-accordion-panel[hidden] { + display: none; +} + +.health-check-accordion-panel a .dashicons { + text-decoration: none; +} + +/* Better position for the WordPress admin notices and update nag. */ +.site-health .notice { + margin: 5px 20px 15px 22px; +} + +.site-health .update-nag { + margin-bottom: 20px; + margin-left: 22px; +} + +.health-check-wp-paths-sizes.spinner { + visibility: visible; + float: none; + margin: 0 4px; + flex-shrink: 0; +} + +@media screen and (max-width: 782px) { + .health-check-body { + margin: 0 12px; + width: auto; + } + + .site-health .notice { + margin: 5px 10px 15px; + } + + .site-health .update-nag { + margin-right: 10px; + margin-left: 10px; + } + + .site-health-issues-wrapper .health-check-accordion-trigger { + flex-direction: column; + align-items: flex-start; + } + + .health-check-accordion-trigger .badge { + margin: 1em 0 0; + } + + .health-check-table { + table-layout: fixed; + } + + .health-check-table td { + box-sizing: border-box; + display: block; + width: 100%; + word-wrap: break-word; + } + + .health-check-table td:first-child { + width: 100%; + padding-bottom: 0; + font-weight: 600; + } +} + +/* The breakpoint is usually at 960px, the additional space is to allow for the margin. */ +@media only screen and (max-width: 1004px) { + .health-check-body { + margin: 0 22px; + width: auto; + } +} diff --git a/wp-admin/css/site-health.min.css b/wp-admin/css/site-health.min.css new file mode 100644 index 0000000..462c720 --- /dev/null +++ b/wp-admin/css/site-health.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.site-health #wpcontent,.site-health.auto-fold #wpcontent{padding-left:0}.health-check-header h1{display:inline-block;font-weight:600;margin:0 .8rem 1rem;font-size:23px;padding:9px 0 4px 0;line-height:1.3}.health-check-body h2{padding:1rem 0;line-height:1.4}.health-check-body h3{padding:0;font-weight:400}.health-check-header{text-align:center;margin:0 0 1rem;background:#fff;border-bottom:1px solid #e2e4e7}.health-check-title-section{display:flex;align-items:center;justify-content:center;clear:both}.site-health-progress-wrapper{margin-bottom:1rem}.site-health-progress{display:inline-block;height:20px;width:20px;margin:0;border-radius:100%;position:relative;font-weight:600;font-size:.4rem}.site-health-progress-count{position:absolute;display:block;height:80px;width:80px;left:50%;top:50%;margin-top:-40px;margin-left:-40px;border-radius:100%;line-height:6.3;font-size:2em}.loading .site-health-progress svg #bar{stroke-dashoffset:0;stroke:#adc5d2;animation:loadingPulse 3s infinite ease-in-out}.site-health-progress svg circle{stroke-dashoffset:0;transition:stroke-dashoffset 1s linear;stroke:#ccc;stroke-width:2em}.site-health-progress svg #bar{stroke-dashoffset:565;stroke:#dc3232}.green .site-health-progress #bar{stroke:#46b450}.green .site-health-progress .site-health-progress-label{color:#46b450}.orange .site-health-progress #bar{stroke:#ffb900}.orange .site-health-progress .site-health-progress-label{color:#ffb900}.site-health-progress-label{font-weight:600;line-height:20px;margin-left:.3rem}@keyframes loadingPulse{0%{stroke:#adc5d2}50%{stroke:#00a0d2}100%{stroke:#adc5d2}}.health-check-tabs-wrapper{display:-ms-inline-grid;-ms-grid-columns:1fr 1fr;vertical-align:top;display:inline-grid;grid-template-columns:1fr 1fr}.health-check-tab{display:block;text-decoration:none;color:inherit;padding:.5rem 1rem 1rem;margin:0 1rem;transition:box-shadow .5s ease-in-out}.health-check-tab:nth-child(1){-ms-grid-column:1}.health-check-tab:nth-child(2){-ms-grid-column:2}.health-check-tab:focus{color:#191e23;outline:1px solid #6c7781;box-shadow:none}.health-check-tab.active{box-shadow:inset 0 -3px #007cba;font-weight:600}.health-check-body{max-width:800px;margin:0 auto}.health-check-table td:first-child{width:30%}.health-check-table td{width:70%}.health-check-table ol,.health-check-table ul{margin:0}.health-check-body li{line-height:1.5}.health-check-body .good::before,.health-check-body .pass::before{content:"\f147";color:#46b450}.health-check-body .warning::before{content:"\f460";color:#ffb900}.health-check-body .info::before{content:"\f348";color:#00a0d2}.health-check-body .error::before,.health-check-body .fail::before{content:"\f335";color:#dc3232}.site-health-copy-buttons{margin:1rem 0}.site-health-copy-buttons .copy-button-wrapper{margin:.5rem 0 1rem}.site-health-copy-buttons .success{display:none;color:#40860a;line-height:1.8;margin-left:.5rem}.site-health-copy-buttons .success.visible{display:inline-block;height:30px;line-height:2.30769231}.site-status-has-issues.hide{display:none}.site-health-view-more{text-align:center}.site-health-issues-wrapper:first-of-type{margin-top:3rem}.site-health-issues-wrapper{margin-bottom:3rem;margin-top:2rem}.site-status-all-clear{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:100%;width:100%;margin-top:0}@media all and (min-width:784px){.site-status-all-clear{margin:5rem 0}}.site-status-all-clear.hide{display:none}.site-status-all-clear .dashicons{font-size:150px;height:130px;width:150px}.site-status-all-clear .encouragement{font-size:1.5rem;font-weight:600}.site-status-all-clear p{margin:0}.health-check-accordion{border:1px solid #ccd0d4}.health-check-accordion-heading{margin:0;border-top:1px solid #ccd0d4;font-size:inherit;line-height:inherit;font-weight:600;color:inherit}.health-check-accordion-heading:first-child{border-top:none}.health-check-accordion-trigger{background:#fff;border:0;color:#32373c;cursor:pointer;display:flex;font-weight:400;margin:0;padding:1em 3.5em 1em 1.5em;min-height:46px;position:relative;text-align:left;width:100%;align-items:center;justify-content:space-between}.wp-core-ui .button.site-health-view-passed{position:relative;padding-right:40px;padding-left:20px}.health-check-accordion-trigger:active,.health-check-accordion-trigger:hover{background:#f8f9f9}.health-check-accordion-trigger:focus{color:#191e23;border:none;box-shadow:none;outline-offset:-1px;outline:2px solid #0071a1;background-color:#f8f9f9}.health-check-accordion-trigger .title{pointer-events:none;font-weight:600;flex-grow:1}.health-check-accordion-trigger .icon,.site-health-view-passed .icon{border:solid #555d66;border-width:0 2px 2px 0;height:.5rem;pointer-events:none;position:absolute;right:1.5em;top:50%;transform:translateY(-70%) rotate(45deg);width:.5rem}.health-check-accordion-trigger .badge{padding:.1rem .5rem .15rem;color:#32373c;font-weight:600;margin-left:.5rem}.health-check-accordion-trigger .badge.blue{border:1px solid #bfe7f3}.health-check-accordion-trigger .badge.orange{border:1px solid #ffb900}.health-check-accordion-trigger .badge.red{border:1px solid #dc3232}.health-check-accordion-trigger .badge.green{border:1px solid #46b450}.health-check-accordion-trigger .badge.purple{border:1px solid #826eb4}.health-check-accordion-trigger .badge.gray{border:1px solid #ccd0d4}.health-check-accordion-trigger[aria-expanded=true] .icon,.site-health-view-passed[aria-expanded=true] .icon{transform:translateY(-30%) rotate(-135deg)}.health-check-accordion-panel{margin:0;padding:1em 1.5em;background:#fff}.health-check-accordion-panel[hidden]{display:none}.health-check-accordion-panel a .dashicons{text-decoration:none}.site-health .notice{margin:5px 20px 15px 22px}.site-health .update-nag{margin-bottom:20px;margin-left:22px}.health-check-wp-paths-sizes.spinner{visibility:visible;float:none;margin:0 4px;flex-shrink:0}@media screen and (max-width:782px){.health-check-body{margin:0 12px;width:auto}.site-health .notice{margin:5px 10px 15px}.site-health .update-nag{margin-right:10px;margin-left:10px}.site-health-issues-wrapper .health-check-accordion-trigger{flex-direction:column;align-items:flex-start}.health-check-accordion-trigger .badge{margin:1em 0 0}.health-check-table{table-layout:fixed}.health-check-table td{box-sizing:border-box;display:block;width:100%;word-wrap:break-word}.health-check-table td:first-child{width:100%;padding-bottom:0;font-weight:600}}@media only screen and (max-width:1004px){.health-check-body{margin:0 22px;width:auto}} \ No newline at end of file diff --git a/wp-admin/css/site-icon-rtl.css b/wp-admin/css/site-icon-rtl.css new file mode 100644 index 0000000..06293b9 --- /dev/null +++ b/wp-admin/css/site-icon-rtl.css @@ -0,0 +1,55 @@ +/*! This file is auto-generated */ +/*------------------------------------------------------------------------------ + 28.0 - Site Icon +------------------------------------------------------------------------------*/ + +.site-icon-preview .favicon-preview { + margin: 5px 0 20px; + overflow: hidden; + position: relative; + max-width: 180px; +} + +.site-icon-preview .favicon, +.site-icon-preview .browser-title { + height: 16px; + right: 88px; + overflow: hidden; + position: absolute; + top: 16px; +} + +.site-icon-preview .favicon { + width: 16px; +} + +.site-icon-preview .browser-title { + right: 109px; + width: 72px; + white-space: nowrap; +} + +.site-icon-preview .app-icon-preview { + background-color: #000; + border-radius: 16px; + height: 64px; + overflow: hidden; + width: 64px; + margin-top: 5px; +} + +/* rtl:ignore */ +.site-icon-preview .favicon, +.site-icon-preview .app-icon-preview { + direction: ltr; +} + +.customize-control-site_icon .favicon-preview { + float: right; + margin-left: 12px; + margin-bottom: 0; +} + +.customize-control-site_icon .app-icon-preview { + margin-top: 9px; +} diff --git a/wp-admin/css/site-icon-rtl.min.css b/wp-admin/css/site-icon-rtl.min.css new file mode 100644 index 0000000..901a1eb --- /dev/null +++ b/wp-admin/css/site-icon-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.site-icon-preview .favicon-preview{margin:5px 0 20px;overflow:hidden;position:relative;max-width:180px}.site-icon-preview .browser-title,.site-icon-preview .favicon{height:16px;right:88px;overflow:hidden;position:absolute;top:16px}.site-icon-preview .favicon{width:16px}.site-icon-preview .browser-title{right:109px;width:72px;white-space:nowrap}.site-icon-preview .app-icon-preview{background-color:#000;border-radius:16px;height:64px;overflow:hidden;width:64px;margin-top:5px}.site-icon-preview .app-icon-preview,.site-icon-preview .favicon{direction:ltr}.customize-control-site_icon .favicon-preview{float:right;margin-left:12px;margin-bottom:0}.customize-control-site_icon .app-icon-preview{margin-top:9px} \ No newline at end of file diff --git a/wp-admin/css/site-icon.css b/wp-admin/css/site-icon.css new file mode 100644 index 0000000..eae9a57 --- /dev/null +++ b/wp-admin/css/site-icon.css @@ -0,0 +1,54 @@ +/*------------------------------------------------------------------------------ + 28.0 - Site Icon +------------------------------------------------------------------------------*/ + +.site-icon-preview .favicon-preview { + margin: 5px 0 20px; + overflow: hidden; + position: relative; + max-width: 180px; +} + +.site-icon-preview .favicon, +.site-icon-preview .browser-title { + height: 16px; + left: 88px; + overflow: hidden; + position: absolute; + top: 16px; +} + +.site-icon-preview .favicon { + width: 16px; +} + +.site-icon-preview .browser-title { + left: 109px; + width: 72px; + white-space: nowrap; +} + +.site-icon-preview .app-icon-preview { + background-color: #000; + border-radius: 16px; + height: 64px; + overflow: hidden; + width: 64px; + margin-top: 5px; +} + +/* rtl:ignore */ +.site-icon-preview .favicon, +.site-icon-preview .app-icon-preview { + direction: ltr; +} + +.customize-control-site_icon .favicon-preview { + float: left; + margin-right: 12px; + margin-bottom: 0; +} + +.customize-control-site_icon .app-icon-preview { + margin-top: 9px; +} diff --git a/wp-admin/css/site-icon.min.css b/wp-admin/css/site-icon.min.css new file mode 100644 index 0000000..5287d07 --- /dev/null +++ b/wp-admin/css/site-icon.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.site-icon-preview .favicon-preview{margin:5px 0 20px;overflow:hidden;position:relative;max-width:180px}.site-icon-preview .browser-title,.site-icon-preview .favicon{height:16px;left:88px;overflow:hidden;position:absolute;top:16px}.site-icon-preview .favicon{width:16px}.site-icon-preview .browser-title{left:109px;width:72px;white-space:nowrap}.site-icon-preview .app-icon-preview{background-color:#000;border-radius:16px;height:64px;overflow:hidden;width:64px;margin-top:5px}.site-icon-preview .app-icon-preview,.site-icon-preview .favicon{direction:ltr}.customize-control-site_icon .favicon-preview{float:left;margin-right:12px;margin-bottom:0}.customize-control-site_icon .app-icon-preview{margin-top:9px} \ No newline at end of file diff --git a/wp-admin/css/themes-rtl.css b/wp-admin/css/themes-rtl.css new file mode 100644 index 0000000..35cf883 --- /dev/null +++ b/wp-admin/css/themes-rtl.css @@ -0,0 +1,1926 @@ +/*! This file is auto-generated */ +/*------------------------------------------------------------------------------ + 16.0 - Themes +------------------------------------------------------------------------------*/ + + +/*------------------------------------------------------------------------------ + 16.1 - Manage Themes +------------------------------------------------------------------------------*/ + +body.js .theme-browser.search-loading { + display: none; +} + +.theme-browser .themes { + clear: both; +} + +.themes-php:not(.network-admin) .wrap h1 { + margin-bottom: 15px; +} + +.themes-php .wrap h1 .button { + margin-right: 20px; +} + +/* Search form */ +.themes-php .search-form { + display: inline; +} + +.themes-php .wp-filter-search { + position: relative; + top: -2px; + right: 20px; + margin: 0; + width: 280px; +} + +/* Position admin messages */ +.theme .notice, +.theme .notice.is-dismissible { + right: 0; + margin: 0; + position: absolute; + left: 0; + top: 0; +} + +/** + * Main theme element + * (has flexible margins) + */ +.theme-browser .theme { + cursor: pointer; + float: right; + margin: 0 0 4% 4%; + position: relative; + width: 30.6%; + border: 1px solid #ddd; + box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1); + box-sizing: border-box; +} + +.ie8 .theme-browser .theme { + width: 30%; + margin: 0 0 4% 3%; +} + +.theme-browser .theme:nth-child(3n) { + margin-left: 0; +} + +.theme-browser .theme:hover, +.theme-browser .theme:focus { + cursor: pointer; +} + +.theme-browser .theme .theme-name { + font-size: 15px; + font-weight: 600; + height: 18px; + margin: 0; + padding: 15px; + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + background: #fff; + background: rgba(255, 255, 255, 0.65); +} + +/* Activate and Customize buttons, shown on hover and focus */ +.theme-browser .theme .theme-actions { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + opacity: 0; + transition: opacity 0.1s ease-in-out; + height: auto; + background: rgba(244, 244, 244, 0.7); + border-right: 1px solid rgba(0, 0, 0, 0.05); +} + +.theme-browser .theme:hover .theme-actions, +.theme-browser .theme.focus .theme-actions, +.theme-browser .theme:focus .theme-actions { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + opacity: 1; +} + +.theme-browser .theme .theme-actions .button-primary { + margin-left: 3px; +} + +.theme-browser .theme .theme-actions .button { + float: none; + margin-right: 3px; +} + +/** + * Theme Screenshot + * + * Has a fixed aspect ratio of 1.5 to 1 regardless of screenshot size + * It is also responsive. + */ +.theme-browser .theme .theme-screenshot { + display: block; + overflow: hidden; + position: relative; + -webkit-backface-visibility: hidden; /* Prevents flicker of the screenshot on hover. */ + transition: opacity 0.2s ease-in-out; +} + +.theme-browser .theme .theme-screenshot:after { + content: ""; + display: block; + padding-top: 66.66666%; /* using a 3/2 aspect ratio */ +} + +.theme-browser .theme .theme-screenshot img { + height: auto; + position: absolute; + right: 0; + top: 0; + width: 100%; + transition: opacity 0.2s ease-in-out; +} + +.theme-browser .theme:hover .theme-screenshot, +.theme-browser .theme:focus .theme-screenshot { + background: #fff; +} + +.theme-browser.rendered .theme:hover .theme-screenshot img, +.theme-browser.rendered .theme:focus .theme-screenshot img { + opacity: 0.4; +} + +.theme-browser .theme .more-details { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + opacity: 0; + position: absolute; + top: 35%; + left: 20%; + right: 20%; + background: #23282d; + background: rgba(0, 0, 0, 0.7); + color: #fff; + font-size: 15px; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6); + -webkit-font-smoothing: antialiased; + font-weight: 600; + padding: 15px 12px; + text-align: center; + border-radius: 3px; + transition: opacity 0.1s ease-in-out; +} + +.theme-browser .theme:focus { + border-color: #5b9dd9; + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); +} + +.theme-browser .theme:focus .more-details { + opacity: 1; +} + +/* Current theme needs to have its action always on view */ +.theme-browser .theme.active:focus .theme-actions { + display: block; +} + +.theme-browser.rendered .theme:hover .more-details, +.theme-browser.rendered .theme:focus .more-details { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + opacity: 1; +} + +/** + * The currently active theme + */ +.theme-browser .theme.active .theme-name { + background: #23282d; + color: #fff; + padding-left: 110px; + font-weight: 300; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5); +} + +.theme-browser .customize-control .theme.active .theme-name { + padding-left: 15px; +} + +.theme-browser .theme.active .theme-name span { + font-weight: 600; +} + +.theme-browser .theme.active .theme-actions { + background: rgba(49, 49, 49, 0.7); + border-right: none; + opacity: 1; +} + +.theme-id-container { + position: relative; +} + +.theme-browser .theme.active .theme-actions, +.theme-browser .theme .theme-actions { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 0; + padding: 9px 15px; + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); +} + +.theme-browser .theme.active .theme-actions .button-primary { + margin-left: 0; +} + +.theme-browser .theme .theme-author { + background: #23282d; + color: #eee; + display: none; + font-size: 14px; + margin: 0 10px; + padding: 5px 10px; + position: absolute; + bottom: 56px; +} + +.theme-browser .theme.display-author .theme-author { + display: block; +} + +.theme-browser .theme.display-author .theme-author a { + color: inherit; + text-decoration: none; +} + +/** + * Add new theme + */ +.theme-browser .theme.add-new-theme { + border: none; + box-shadow: none; +} + +.theme-browser .theme.add-new-theme a { + text-decoration: none; + display: block; + position: relative; + z-index: 1; +} + +.theme-browser .theme.add-new-theme a:after { + display: block; + content: ""; + background: transparent; + background: rgba(0, 0, 0, 0); + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + padding: 0; + text-shadow: none; + border: 5px dashed #d5d2ca; + border: 5px dashed rgba(0, 0, 0, 0.1); + box-sizing: border-box; +} + +.theme-browser .theme.add-new-theme span:after { + background: #e5e5e5; + background: rgba(153, 153, 153, 0.1); + border-radius: 50%; + display: inline-block; + content: "\f132"; + -webkit-font-smoothing: antialiased; + font: normal 74px/115px dashicons; + width: 100px; + height: 100px; + vertical-align: middle; + text-align: center; + color: rgb(153, 153, 153); + position: absolute; + top: 30%; + right: 50%; + margin-right: -50px; + text-indent: -4px; + padding: 0; + text-shadow: none; + z-index: 4; +} + +.rtl .theme-browser .theme.add-new-theme span:after { + text-indent: 4px; +} + +.theme-browser .theme.add-new-theme a:hover .theme-screenshot, +.theme-browser .theme.add-new-theme a:focus .theme-screenshot { + background: none; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + background: #fff; + color: #0073aa; +} + +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + border-color: transparent; + color: #fff; + background: #0073aa; + content: ""; +} + +.theme-browser .theme.add-new-theme .theme-name { + background: none; + text-align: center; + box-shadow: none; + font-weight: 400; + position: relative; + top: 0; + margin-top: -18px; + padding-top: 0; + padding-bottom: 48px; +} + +.theme-browser .theme.add-new-theme a:hover .theme-name, +.theme-browser .theme.add-new-theme a:focus .theme-name { + color: #fff; + z-index: 2; +} + +/** + * Theme Overlay + * Shown when clicking a theme + */ +.theme-overlay .theme-backdrop { + position: absolute; + right: -20px; + left: 0; + top: 0; + bottom: 0; + background: #f1f1f1; + background: rgba(238, 238, 238, 0.9); + z-index: 10000; /* Over WP Pointers. */ +} + +.theme-overlay .theme-header { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 48px; + border-bottom: 1px solid #ddd; +} + +.theme-overlay .theme-header button { + padding: 0; +} + +.theme-overlay .theme-header .close { + cursor: pointer; + height: 48px; + width: 50px; + text-align: center; + float: left; + border: 0; + border-right: 1px solid #ddd; + background-color: transparent; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.theme-overlay .theme-header .close:before { + font: normal 22px/50px dashicons !important; + color: #72777c; + display: inline-block; + content: "\f335"; + font-weight: 300; +} + +/* Left and right navigation */ +.theme-overlay .theme-header .right, +.theme-overlay .theme-header .left { + cursor: pointer; + color: #72777c; + background-color: transparent; + height: 48px; + width: 54px; + float: right; + text-align: center; + border: 0; + border-left: 1px solid #ddd; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.theme-overlay .theme-header .close:focus, +.theme-overlay .theme-header .close:hover, +.theme-overlay .theme-header .right:focus, +.theme-overlay .theme-header .right:hover, +.theme-overlay .theme-header .left:focus, +.theme-overlay .theme-header .left:hover { + background: #ddd; + border-color: #ccc; + color: #000; +} + +.theme-overlay .theme-header .close:focus:before, +.theme-overlay .theme-header .close:hover:before { + color: #000; +} + +.theme-overlay .theme-header .close:focus, +.theme-overlay .theme-header .right:focus, +.theme-overlay .theme-header .left:focus { + box-shadow: none; + outline: none; +} + +.theme-overlay .theme-header .left.disabled, +.theme-overlay .theme-header .right.disabled, +.theme-overlay .theme-header .left.disabled:hover, +.theme-overlay .theme-header .right.disabled:hover { + color: #ccc; + background: inherit; + cursor: inherit; +} + +.theme-overlay .theme-header .right:before, +.theme-overlay .theme-header .left:before { + font: normal 20px/50px dashicons !important; + display: inline; + font-weight: 300; +} + +.theme-overlay .theme-header .left:before { + content: "\f345"; +} + +.theme-overlay .theme-header .right:before { + content: "\f341"; +} + +.theme-overlay .theme-wrap { + clear: both; + position: fixed; + top: 9%; + right: 190px; + left: 30px; + bottom: 3%; + background: #fff; + box-shadow: 0 1px 20px 5px rgba(0, 0, 0, 0.1); + z-index: 10000; /* Over WP Pointers. */ + box-sizing: border-box; + -webkit-overflow-scrolling: touch; +} + +body.folded .theme-browser ~ .theme-overlay .theme-wrap { + right: 70px; +} + +.theme-overlay .theme-about { + position: absolute; + top: 49px; + bottom: 57px; + right: 0; + left: 0; + overflow: auto; + padding: 2% 4%; +} + +.theme-overlay .theme-actions { + position: absolute; + text-align: center; + bottom: 0; + right: 0; + left: 0; + padding: 10px 25px 5px; + background: #f3f3f3; + z-index: 30; + box-sizing: border-box; + border-top: 1px solid #eee; +} + +.ie8 .theme-overlay .theme-actions { + border: 1px solid #eee; +} + +.theme-overlay .theme-actions a { + margin-left: 5px; + margin-bottom: 5px; +} + +/* Hide-if-customize for items we can't add classes to */ +.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-header"], +.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-background"] { + display: none; +} + +.broken-themes a.delete-theme, +.theme-overlay .theme-actions .delete-theme { + color: #a00; + text-decoration: none; + border-color: transparent; + box-shadow: none; + background: transparent; +} + +.theme-overlay .theme-actions .delete-theme { + position: absolute; + left: 10px; + bottom: 5px; +} + +.broken-themes a.delete-theme:hover, +.broken-themes a.delete-theme:focus, +.theme-overlay .theme-actions .delete-theme:hover, +.theme-overlay .theme-actions .delete-theme:focus { + background: #d54e21; + color: #fff; + border-color: #d54e21; +} + +.theme-overlay .theme-actions .active-theme, +.theme-overlay.active .theme-actions .inactive-theme { + display: none; +} + +.theme-overlay .theme-actions .inactive-theme, +.theme-overlay.active .theme-actions .active-theme { + display: block; +} + +/** + * Theme Screenshots gallery + */ +.theme-overlay .theme-screenshots { + float: right; + margin: 0 0 0 30px; + width: 55%; + max-width: 1200px; /* Recommended theme screenshot width, set here to avoid stretching */ + text-align: center; +} + +/* First screenshot, shown big */ +.theme-overlay .screenshot { + border: 1px solid #fff; + box-sizing: border-box; + overflow: hidden; + position: relative; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); +} + +.theme-overlay .screenshot:after { + content: ""; + display: block; + padding-top: 75%; /* using a 4/3 aspect ratio */ +} + +.theme-overlay .screenshot img { + height: auto; + position: absolute; + right: 0; + top: 0; + width: 100%; +} +/* Handles old 300px screenshots */ +.theme-overlay.small-screenshot .theme-screenshots { + position: absolute; + width: 302px; +} +.theme-overlay.small-screenshot .theme-info { + margin-right: 350px; + width: auto; +} + +/* Other screenshots, shown small and square */ +.theme-overlay .screenshot.thumb { + background: #ccc; + border: 1px solid #eee; + float: none; + display: inline-block; + margin: 10px 5px 0; + width: 140px; + height: 80px; + cursor: pointer; +} + +.theme-overlay .screenshot.thumb:after { + content: ""; + display: block; + padding-top: 100%; /* using a 1/1 aspect ratio */ +} + +.theme-overlay .screenshot.thumb img { + cursor: pointer; + height: auto; + position: absolute; + right: 0; + top: 0; + width: 100%; + height: auto; +} + +.theme-overlay .screenshot.selected { + background: transparent; + border: 2px solid #00a0d2; +} + +.theme-overlay .screenshot.selected img { + opacity: 0.8; +} + +/* No screenshot placeholder */ +.theme-browser .theme .theme-screenshot.blank, +.theme-overlay .screenshot.blank { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=); +} + +/** + * Theme heading information + */ +.theme-overlay .theme-info { + width: 40%; + float: right; +} + +.theme-overlay .current-label { + background: #32373c; + color: #fff; + font-size: 11px; + display: inline-block; + padding: 2px 8px; + border-radius: 2px; + margin: 0 0 -10px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.theme-overlay .theme-name { + color: #23282d; + font-size: 32px; + font-weight: 100; + margin: 10px 0 0; + line-height: 1.3; + word-wrap: break-word; + overflow-wrap: break-word; +} + +.theme-overlay .theme-version { + color: #72777c; + font-size: 13px; + font-weight: 400; + float: none; + display: inline-block; + margin-right: 10px; +} + +.theme-overlay .theme-author { + margin: 15px 0 25px; + color: #72777c; + font-size: 16px; + font-weight: 400; + line-height: inherit; +} + +.theme-overlay .theme-author a { + text-decoration: none; +} + +.theme-overlay .theme-description { + color: #555; + font-size: 15px; + font-weight: 400; + line-height: 1.5; + margin: 30px 0 0 0; +} + +.theme-overlay .theme-tags { + border-top: 3px solid #eee; + color: #82878c; + font-size: 13px; + font-weight: 400; + margin: 30px 0 0 0; + padding-top: 20px; +} + +.theme-overlay .theme-tags span { + color: #444; + font-weight: 600; + margin-left: 5px; +} + +.theme-overlay .parent-theme { + background: #f7fcfe; + border: 1px solid #eee; + border-right: 4px solid #00a0d2; + font-size: 14px; + font-weight: 400; + margin-top: 30px; + padding: 10px 20px 10px 10px; +} + +.theme-overlay .parent-theme strong { + font-weight: 600; +} + +/** + * Single Theme Mode + * Displays detailed view inline when a user has no switch capabilities + */ +.single-theme .theme-overlay .theme-backdrop, +.single-theme .theme-overlay .theme-header, +.single-theme .theme { + display: none; +} + +.single-theme .theme-overlay .theme-wrap { + clear: both; + min-height: 330px; + position: relative; + right: auto; + left: auto; + top: auto; + bottom: auto; + z-index: 10; +} + +.single-theme .theme-overlay .theme-about { + padding: 30px 30px 70px; + position: static; +} + +.single-theme .theme-overlay .theme-actions { + position: absolute; +} + +/** + * Basic Responsive structure... + * + * Shuffles theme columns around based on screen width + */ + +@media only screen and (min-width: 2000px) { + #wpwrap .theme-browser .theme { + width: 17.6%; + margin: 0 0 3% 3%; + } + + #wpwrap .theme-browser .theme:nth-child(3n), + #wpwrap .theme-browser .theme:nth-child(4n) { + margin-left: 3%; + } + + #wpwrap .theme-browser .theme:nth-child(5n) { + margin-left: 0; + } +} + +@media only screen and (min-width: 1680px) { + .theme-overlay .theme-wrap { + width: 1450px; + margin: 0 auto; + } +} + +/* Maximum screenshot width reaches 440px */ +@media only screen and (min-width: 1640px) { + .theme-browser .theme { + width: 22.7%; + margin: 0 0 3% 3%; + } + .theme-browser .theme .theme-screenshot:after { + padding-top: 75%; /* using a 4/3 aspect ratio */ + } + + .theme-browser .theme:nth-child(3n) { + margin-left: 3%; + } + + .theme-browser .theme:nth-child(4n) { + margin-left: 0; + } +} +/* Maximum screenshot width reaches 440px */ +@media only screen and (max-width: 1120px) { + .theme-browser .theme { + width: 47.5%; + margin-left: 0; + } + + .theme-browser .theme:nth-child(even) { + margin-left: 0; + } + + .theme-browser .theme:nth-child(odd) { + margin-left: 5%; + } +} + +/* Admin menu is folded */ +@media only screen and (max-width: 960px) { + .theme-overlay .theme-wrap { + right: 65px; + } +} + +@media only screen and (max-width: 780px) { + body.folded .theme-overlay .theme-wrap, + .theme-overlay .theme-wrap { + top: 0; /* The adminmenu isn't fixed on mobile, so this can use the full viewport height */ + left: 0; + bottom: 0; + right: 0; + padding: 70px 20px 20px; + border: none; + z-index: 100000; /* should overlap #wpadminbar. */ + position: fixed; + } + + .theme-browser .theme.active .theme-name span { + /* Hide the "Active: " label on smaller screens. */ + display: none; + } + + .theme-overlay .theme-screenshots { + width: 40%; + } + + .theme-overlay .theme-info { + width: 50%; + } + .single-theme .theme-wrap { + padding: 10px; + } + + .theme-browser .theme .theme-actions { + padding: 5px 10px 4px 10px; + } + + .theme-overlay.small-screenshot .theme-screenshots { + position: static; + float: none; + max-width: 302px; + } + + .theme-overlay.small-screenshot .theme-info { + margin-right: 0; + width: auto; + } + + .theme:not(.active):hover .theme-actions, + .theme:not(.active):focus .theme-actions, + .theme:hover .more-details, + .theme:focus .more-details { + display: none; + } + + .theme-browser.rendered .theme:hover .theme-screenshot img, + .theme-browser.rendered .theme:focus .theme-screenshot img { + opacity: 1.0; + } +} + +@media only screen and (max-width: 480px) { + .theme-browser .theme { + width: 100%; + margin-left: 0; + } + + .theme-browser .theme:nth-child(2n), + .theme-browser .theme:nth-child(3n) { + margin-left: 0; + } +} + +@media only screen and (max-width: 650px) { + .theme-overlay .theme-description { + margin-right: 0; + } + + .theme-overlay .theme-actions .delete-theme { + position: relative; + left: auto; + bottom: auto; + } + + .theme-overlay .theme-actions .inactive-theme { + display: inline; + } + + .theme-overlay .theme-screenshots { + width: 100%; + float: none; + } + + .theme-overlay .theme-info { + width: 100%; + } + + .theme-overlay .theme-author { + margin: 5px 0 15px 0; + } + + .theme-overlay .current-label { + margin-top: 10px; + font-size: 13px; + } + + .themes-php .wp-filter-search { + float: none; + clear: both; + right: 0; + left: 0; + margin: -5px 0 20px 0; + width: 100%; + max-width: 280px; + } + + .theme-browser .theme.add-new-theme span:after { + font: normal 60px/90px dashicons; + width: 80px; + height: 80px; + top: 30%; + right: 50%; + text-indent: 0; + margin-right: -40px; + } + + .single-theme .theme-wrap { + margin: 0 -10px 0 -12px; + padding: 10px; + } + .single-theme .theme-overlay .theme-about { + padding: 10px; + overflow: visible; + } + .single-theme .current-label { + display: none; + } + .single-theme .theme-overlay .theme-actions { + position: static; + } +} + +.broken-themes { + clear: both; +} + +.broken-themes table { + text-align: right; + width: 50%; + border-spacing: 3px; + padding: 3px; +} + + +/*------------------------------------------------------------------------------ + 16.2 - Install Themes +------------------------------------------------------------------------------*/ + +/* Already installed theme */ +.theme-browser .theme .theme-installed { + background: #0073aa; +} +.theme-browser .theme .notice-success p:before { + color: #79ba49; + content: "\f147"; + display: inline-block; + font: normal 20px/1 'dashicons'; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + vertical-align: top; +} + +.theme-install.updated-message:before { + content: ""; +} + +.theme-install-php .wp-filter { + padding-right: 20px; +} + +.theme-install-php a.upload, +.theme-install-php a.browse-themes { + cursor: pointer; +} + +.upload-view-toggle .browse, +.plugin-install-tab-upload .upload-view-toggle .upload { + display: none; +} + +.plugin-install-tab-upload .upload-view-toggle .browse { + display: inline; +} + +.upload-theme, +.upload-plugin { + box-sizing: border-box; + display: none; + margin: 0; + padding: 50px 0; + width: 100%; + overflow: hidden; + position: relative; + top: 10px; +} + +.upload-plugin-wrap { + display: none; +} + +.show-upload-view .upload-theme, +.show-upload-view .upload-plugin, +.show-upload-view .upload-plugin-wrap, +.plugin-install-tab-upload .upload-plugin { + display: block; +} + +.upload-theme .wp-upload-form, +.upload-plugin .wp-upload-form { + background: #fafafa; + border: 1px solid #ccd0d4; + padding: 30px; + margin: 30px auto; + max-width: 380px; + display: flex; +} + +.upload-theme .wp-upload-form > input[type="file"], +.upload-plugin .wp-upload-form > input[type="file"] { + padding: 5px 0 0 1em; +} + +.upload-theme .install-help, +.upload-plugin .install-help { + color: #555d66; /* #f1f1f1 background */ + font-size: 18px; + font-style: normal; + margin: 0; + padding: 0; + text-align: center; +} + +p.no-themes, +p.no-themes-local { + clear: both; + color: #666; + font-size: 18px; + font-style: normal; + margin: 0; + padding: 100px 0; + text-align: center; + display: none; +} + +.no-results p.no-themes { + display: block; +} + +.theme-install-php .add-new-theme { + display: none !important; +} + +@media only screen and (max-width: 1120px) { + .upload-theme .wp-upload-form { + margin: 20px 0; + max-width: 100%; + } + .upload-theme .install-help { + font-size: 15px; + padding: 20px 0 0; + text-align: right; + } +} + +.theme-details .theme-rating { + line-height: 1.9; +} + +.theme-details .star-rating { + display: inline; +} + +.theme-details .num-ratings, +.theme-details .no-rating { + font-size: 11px; + color: #72777c; +} + +.theme-details .no-rating { + display: block; + line-height: 1.9; +} + +/*------------------------------------------------------------------------------ + 16.3 - Custom Header Screen +------------------------------------------------------------------------------*/ + +.appearance_page_custom-header #headimg { + border: 1px solid #ddd; + overflow: hidden; + width: 100%; +} + +.appearance_page_custom-header #upload-form p label { + font-size: 12px; +} + +.appearance_page_custom-header .available-headers .default-header { + float: right; + margin: 0 0 20px 20px; +} + +.appearance_page_custom-header .random-header { + clear: both; + margin: 0 0 20px 20px; + vertical-align: middle; +} + +.appearance_page_custom-header .available-headers label input, +.appearance_page_custom-header .random-header label input { + margin-left: 10px; +} + +.appearance_page_custom-header .available-headers label img { + vertical-align: middle; +} + + +/*------------------------------------------------------------------------------ + 16.4 - Custom Background Screen +------------------------------------------------------------------------------*/ + +div#custom-background-image { + min-height: 100px; + border: 1px solid #ddd; +} + +div#custom-background-image img { + max-width: 400px; + max-height: 300px; +} + +.background-position-control input[type="radio"]:checked ~ .button { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); + z-index: 1; +} + +.background-position-control input[type="radio"]:focus ~ .button { + border-color: #5b9dd9; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5), 0 0 3px rgba(0, 115, 170, 0.8); + color: #23282d; +} + +.background-position-control .background-position-center-icon, +.background-position-control .background-position-center-icon:before { + display: inline-block; + line-height: 1; + text-align: center; + transition: background-color .1s ease-in; +} + +.background-position-control .background-position-center-icon { + height: 20px; + margin-top: 13px; + vertical-align: top; + width: 20px; +} + +.background-position-control .background-position-center-icon:before { + background-color: #555; + border-radius: 50%; + content: ""; + height: 12px; + width: 12px; +} + +.background-position-control .button:hover .background-position-center-icon:before, +.background-position-control input[type="radio"]:focus ~ .button .background-position-center-icon:before { + background-color: #23282d; +} + +.background-position-control .button-group { + display: block; +} + +.background-position-control .button-group .button { + border-radius: 0; + box-shadow: none; + /* Following properties are overridden by buttons responsive styles (see: wp-includes/css/buttons.css). */ + height: 40px !important; + line-height: 2.9 !important; + margin: 0 0 0 -1px !important; + padding: 0 10px 1px !important; + position: relative; +} + +.background-position-control .button-group .button:active, +.background-position-control .button-group .button:hover, +.background-position-control .button-group .button:focus { + z-index: 1; +} + +.background-position-control .button-group:last-child .button { + box-shadow: 0 1px 0 #ccc; +} + +.background-position-control .button-group > label { + margin: 0 !important; +} + +.background-position-control .button-group:first-child > label:first-child .button { + border-radius: 0 3px 0 0; +} + +.background-position-control .button-group:first-child > label:first-child .dashicons { + transform: rotate( -45deg ); +} + +.background-position-control .button-group:first-child > label:last-child .button { + border-radius: 3px 0 0 0; +} + +.background-position-control .button-group:first-child > label:last-child .dashicons { + transform: rotate( 45deg ); +} + +.background-position-control .button-group:last-child > label:first-child .button { + border-radius: 0 0 3px 0; +} + +.background-position-control .button-group:last-child > label:first-child .dashicons { + transform: rotate( 45deg ); +} + +.background-position-control .button-group:last-child > label:last-child .button { + border-radius: 0 0 0 3px; +} + +.background-position-control .button-group:last-child > label:last-child .dashicons { + transform: rotate( -45deg ); +} + +.background-position-control .button-group .dashicons { + margin-top: 9px; +} + +.background-position-control .button-group + .button-group { + margin-top: -1px; +} + +/*------------------------------------------------------------------------------ + 23.0 - Full Overlay w/ Sidebar +------------------------------------------------------------------------------*/ + +body.full-overlay-active { + overflow: hidden; + /* Hide all the content, the Customizer overlay is then made visible to be the only available content. */ + visibility: hidden; +} + +.wp-full-overlay { + background: transparent; + z-index: 500000; + position: fixed; + overflow: visible; + top: 0; + bottom: 0; + right: 0; + left: 0; + height: 100%; + min-width: 0; +} + +.wp-full-overlay-sidebar { + box-sizing: border-box; + position: fixed; + min-width: 300px; + max-width: 600px; + width: 18%; + height: 100%; + top: 0; + bottom: 0; + right: 0; + padding: 0; + margin: 0; + z-index: 10; + background: #eee; + border-left: none; +} + +.wp-full-overlay.collapsed .wp-full-overlay-sidebar { + overflow: visible; +} + +.wp-full-overlay.collapsed, +.wp-full-overlay.expanded .wp-full-overlay-sidebar { + margin-right: 0 !important; +} + +.wp-full-overlay.expanded { + margin-right: 300px; +} + +.wp-full-overlay.collapsed .wp-full-overlay-sidebar { + margin-right: -300px; +} + +@media screen and (min-width: 1667px) { + .wp-full-overlay.expanded { + margin-right: 18%; + } + + .wp-full-overlay.collapsed .wp-full-overlay-sidebar { + margin-right: -18%; + } +} + +@media screen and (min-width: 3333px) { + .wp-full-overlay.expanded { + margin-right: 600px; + } + + .wp-full-overlay.collapsed .wp-full-overlay-sidebar { + margin-right: -600px; + } +} + +.wp-full-overlay-sidebar:after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 3px; + z-index: 1000; +} + +.wp-full-overlay-main { + position: absolute; + right: 0; + left: 0; + top: 0; + bottom: 0; + height: 100%; +} + +.wp-full-overlay-sidebar .wp-full-overlay-header { + position: absolute; + right: 0; + left: 0; + height: 45px; + padding: 0 15px; + line-height: 3.2; + z-index: 10; + margin: 0; + border-top: none; + box-shadow: none; +} + +.wp-full-overlay-sidebar .wp-full-overlay-header a.back { + margin-top: 9px; +} + +.wp-full-overlay-sidebar .wp-full-overlay-footer { + bottom: 0; + border-bottom: none; + border-top: none; + box-shadow: none; +} + +.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content { + position: absolute; + top: 45px; + bottom: 45px; + right: 0; + left: 0; + overflow: auto; +} + +/* Close & Navigation Links */ +.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header { + padding: 0; +} + +.theme-install-overlay .close-full-overlay, +.theme-install-overlay .previous-theme, +.theme-install-overlay .next-theme { + display: block; + position: relative; + float: right; + width: 45px; + height: 45px; + background: #eee; + border-left: 1px solid #ddd; + color: #444; + cursor: pointer; + text-decoration: none; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.theme-install-overlay .close-full-overlay:hover, +.theme-install-overlay .close-full-overlay:focus, +.theme-install-overlay .previous-theme:hover, +.theme-install-overlay .previous-theme:focus, +.theme-install-overlay .next-theme:hover, +.theme-install-overlay .next-theme:focus { + background: #ddd; + border-color: #ccc; + color: #000; + outline: none; + box-shadow: none; +} + +.theme-install-overlay .close-full-overlay:before { + font: normal 22px/1 dashicons; + content: "\f335"; + position: relative; + top: 7px; + right: 13px; +} + +.theme-install-overlay .previous-theme:before { + font: normal 20px/1 dashicons; + content: "\f345"; + position: relative; + top: 6px; + right: 14px; +} + +.theme-install-overlay .next-theme:before { + font: normal 20px/1 dashicons; + content: "\f341"; + position: relative; + top: 6px; + right: 13px; +} + +.theme-install-overlay .previous-theme.disabled, +.theme-install-overlay .next-theme.disabled, +.theme-install-overlay .previous-theme.disabled:hover, +.theme-install-overlay .previous-theme.disabled:focus, +.theme-install-overlay .next-theme.disabled:hover, +.theme-install-overlay .next-theme.disabled:focus { + color: #b4b9be; + background: #eee; + cursor: default; + pointer-events: none; +} + +.theme-install-overlay .close-full-overlay, +.theme-install-overlay .previous-theme, +.theme-install-overlay .next-theme { + border-right: 0; + border-top: 0; + border-bottom: 0; +} + +.theme-install-overlay .close-full-overlay:before, +.theme-install-overlay .previous-theme:before, +.theme-install-overlay .next-theme:before { + top: 2px; + right: 0; +} + +/* Collapse Button */ +.wp-core-ui .wp-full-overlay .collapse-sidebar { + position: fixed; + bottom: 0; + right: 0; + padding: 9px 10px 9px 0; + height: 45px; + color: #656a6f; + outline: 0; + line-height: 1; + background-color: transparent !important; + border: none !important; + box-shadow: none !important; + border-radius: 0 !important; +} + +.wp-core-ui .wp-full-overlay .collapse-sidebar:hover, +.wp-core-ui .wp-full-overlay .collapse-sidebar:focus { + color: #0073aa; +} + +.wp-full-overlay .collapse-sidebar-arrow, +.wp-full-overlay .collapse-sidebar-label { + display: inline-block; + vertical-align: middle; + line-height: 1.6; +} + +.wp-full-overlay .collapse-sidebar-arrow { + width: 20px; + height: 20px; + margin: 0 2px; /* avoid the focus box-shadow to be cut-off */ + border-radius: 50%; + overflow: hidden; +} + +.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow, +.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.wp-full-overlay .collapse-sidebar-label { + margin-right: 3px; +} + +.wp-full-overlay.collapsed .collapse-sidebar-label { + display: none; +} + +.wp-full-overlay .collapse-sidebar-arrow:before { + display: block; + content: "\f148"; + background: #eee; + font: normal 20px/1 dashicons; + speak: none; + padding: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar { + padding: 9px 10px; +} + +/* rtl:ignore */ +.wp-full-overlay.collapsed .collapse-sidebar-arrow:before, +.rtl .wp-full-overlay .collapse-sidebar-arrow:before { + transform: rotate(180.001deg); /* Firefox: promoting to its own layer to trigger anti-aliasing */ +} + +.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before { + transform: none; +} + +/* Animations */ +.wp-full-overlay, +.wp-full-overlay-sidebar, +.wp-full-overlay .collapse-sidebar, +.wp-full-overlay-main { + transition-property: right, left, top, bottom, width, margin; + transition-duration: 0.2s; +} + +/* Device/preview size toggles */ + +.wp-full-overlay { + background: #191e23; +} + +.wp-full-overlay-main { + background-color: #f1f1f1; +} + +.expanded .wp-full-overlay-footer { + position: fixed; + bottom: 0; + right: 0; + min-width: 299px; + max-width: 599px; + width: 18%; + width: calc( 18% - 1px ); + height: 45px; + border-top: 1px solid #ddd; + background: #eee; +} + +.wp-full-overlay-footer .devices-wrapper { + float: left; +} + +.wp-full-overlay-footer .devices { + position: relative; + background: #eee; + box-shadow: 20px 0 10px -5px #eee; +} + +.wp-full-overlay-footer .devices button { + cursor: pointer; + background: transparent; + border: none; + height: 45px; + padding: 0 3px; + margin: 0 -4px 0 0; + box-shadow: none; + border-top: 1px solid transparent; + border-bottom: 4px solid transparent; + transition: + .15s color ease-in-out, + .15s background-color ease-in-out, + .15s border-color ease-in-out; +} + +.wp-full-overlay-footer .devices button:focus { + box-shadow: none; + outline: none; +} + +.wp-full-overlay-footer .devices button:before { + display: inline-block; + -webkit-font-smoothing: antialiased; + font: normal 20px/30px "dashicons"; + vertical-align: top; + margin: 3px 0; + padding: 4px 8px; + color: #656a6f; +} + +.wp-full-overlay-footer .devices button.active { + border-bottom-color: #191e23; +} + +.wp-full-overlay-footer .devices button:hover, +.wp-full-overlay-footer .devices button:focus { + background-color: #fff; +} + +.wp-full-overlay-footer .devices button:focus, +.wp-full-overlay-footer .devices button.active:hover { + border-bottom-color: #0073aa; +} + +.wp-full-overlay-footer .devices button.active:before { + color: #191e23; +} + +.wp-full-overlay-footer .devices button:hover:before, +.wp-full-overlay-footer .devices button:focus:before { + color: #0073aa; +} + +.wp-full-overlay-footer .devices .preview-desktop:before { + content: "\f472"; +} + +.wp-full-overlay-footer .devices .preview-tablet:before { + content: "\f471"; +} + +.wp-full-overlay-footer .devices .preview-mobile:before { + content: "\f470"; +} + +@media screen and (max-width: 1024px) { + .wp-full-overlay-footer .devices { + display: none; + } +} + +.collapsed .wp-full-overlay-footer .devices button:before { + display: none; +} + +.preview-mobile .wp-full-overlay-main { + margin: auto -160px auto 0; + width: 320px; + height: 480px; + max-height: 100%; + max-width: 100%; + right: 50%; +} + +.preview-tablet .wp-full-overlay-main { + margin: auto -360px auto 0; + width: 720px; /* Size is loosely based on a typical "tablet" device size. Intentionally ambiguous - this does not represent any particular device precisely. */ + height: 1080px; + max-height: 100%; + max-width: 100%; + right: 50%; +} + + +/*------------------------------------------------------------------------------ + 24.0 - Customize Loader +------------------------------------------------------------------------------*/ + +.no-customize-support .hide-if-no-customize, +.customize-support .hide-if-customize, +.no-customize-support.wp-core-ui .hide-if-no-customize, +.no-customize-support .wp-core-ui .hide-if-no-customize, +.customize-support.wp-core-ui .hide-if-customize, +.customize-support .wp-core-ui .hide-if-customize { + display: none; +} + +#customize-container, +#customize-controls .notice.notification-overlay { + background: #eee; + z-index: 500000; + position: fixed; + overflow: visible; + top: 0; + bottom: 0; + right: 0; + left: 0; + height: 100%; +} +#customize-container { + display: none; +} + +/* Make the Customizer and Theme installer overlays the only available content. */ +#customize-container, +.theme-install-overlay { + visibility: visible; +} + +.customize-loading #customize-container iframe { + opacity: 0; +} + +#customize-container iframe, +.theme-install-overlay iframe { + height: 100%; + width: 100%; + z-index: 20; + transition: opacity 0.3s; +} + +#customize-controls { + margin-top: 0; +} + +.theme-install-overlay { + display: none; +} + +.theme-install-overlay.single-theme { + display: block; +} + +.install-theme-info { + display: none; + padding: 10px 20px 60px; +} + +.single-theme .install-theme-info { + padding-top: 15px; +} + +.theme-install-overlay .install-theme-info { + display: block; +} + +.install-theme-info .theme-install { + float: left; + margin-top: 18px; +} + +.install-theme-info .theme-name { + font-size: 16px; + line-height: 1.5; + margin-bottom: 0; + margin-top: 0; +} + +.install-theme-info .theme-screenshot { + margin: 15px 0; + width: 258px; + border: 1px solid #ccc; +} + +.install-theme-info .theme-details { + overflow: hidden; +} + +.theme-details .theme-version { + margin: 15px 0; +} + +.theme-details .theme-description { + float: right; + color: #72777c; + line-height: 1.6; + max-width: 100%; +} + +.theme-install-overlay .wp-full-overlay-header .button { + float: left; + margin: 8px 0 0 10px; + /* For when .theme-install is a span rather than a.button-primary (already installed theme) */ + line-height: 2; +} + +.theme-install-overlay .wp-full-overlay-sidebar { + background: #eee; + border-left: 1px solid #ddd; +} + +.theme-install-overlay .wp-full-overlay-sidebar-content { + background: #fff; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +.theme-install-overlay .wp-full-overlay-main { + position: absolute; + z-index: 0; + background-color: #f1f1f1; +} + +.customize-loading #customize-container { + background-color: #f1f1f1; +} + +#customize-preview.wp-full-overlay-main:before, +.customize-loading #customize-container:before, +#customize-controls .notice.notification-overlay.notification-loading:before, +.theme-install-overlay .wp-full-overlay-main:before { + content: ""; + display: block; + width: 20px; + height: 20px; + position: absolute; + right: 50%; + top: 50%; + z-index: -1; + margin: -10px -10px 0 0; + transform: translateZ(0); + background: transparent url(../images/spinner.gif) no-repeat center center; + background-size: 20px 20px; +} + +#customize-preview.wp-full-overlay-main.iframe-ready:before, +.theme-install-overlay.iframe-ready .wp-full-overlay-main:before { + background-image: none; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + .wp-full-overlay .collapse-sidebar-arrow { + background-image: url(../images/arrows-2x.png); + background-size: 15px 123px; + } + + #customize-preview.wp-full-overlay-main:before, + .customize-loading #customize-container:before, + #customize-controls .notice.notification-overlay.notification-loading:before, + .theme-install-overlay .wp-full-overlay-main:before { + background-image: url(../images/spinner-2x.gif); + } +} + +@media screen and (max-width: 782px) { + .available-theme .action-links .delete-theme { + float: none; + margin: 0; + padding: 0; + clear: both; + } + + .available-theme .action-links .delete-theme a { + padding: 0; + } + + .broken-themes table { + width: 100%; + } + + .theme-install-overlay .wp-full-overlay-header .theme-install { + margin-top: 6px; + line-height: normal; + } + + .theme-browser .theme .theme-actions .button { + margin-bottom: 0; + } + + .theme-browser .theme.active .theme-actions, + .theme-browser .theme .theme-actions { + padding-top: 4px; + padding-bottom: 4px; + } +} + +@media aural { + .theme .notice:before, + .theme-info .updating-message:before, + .theme-info .updated-message:before, + .theme-install.updating-message:before { + speak: none; + } +} diff --git a/wp-admin/css/themes-rtl.min.css b/wp-admin/css/themes-rtl.min.css new file mode 100644 index 0000000..cc62d0c --- /dev/null +++ b/wp-admin/css/themes-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body.js .theme-browser.search-loading{display:none}.theme-browser .themes{clear:both}.themes-php:not(.network-admin) .wrap h1{margin-bottom:15px}.themes-php .wrap h1 .button{margin-right:20px}.themes-php .search-form{display:inline}.themes-php .wp-filter-search{position:relative;top:-2px;right:20px;margin:0;width:280px}.theme .notice,.theme .notice.is-dismissible{right:0;margin:0;position:absolute;left:0;top:0}.theme-browser .theme{cursor:pointer;float:right;margin:0 0 4% 4%;position:relative;width:30.6%;border:1px solid #ddd;box-shadow:0 1px 1px -1px rgba(0,0,0,.1);box-sizing:border-box}.ie8 .theme-browser .theme{width:30%;margin:0 0 4% 3%}.theme-browser .theme:nth-child(3n){margin-left:0}.theme-browser .theme:focus,.theme-browser .theme:hover{cursor:pointer}.theme-browser .theme .theme-name{font-size:15px;font-weight:600;height:18px;margin:0;padding:15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;background:#fff;background:rgba(255,255,255,.65)}.theme-browser .theme .theme-actions{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;transition:opacity .1s ease-in-out;height:auto;background:rgba(244,244,244,.7);border-right:1px solid rgba(0,0,0,.05)}.theme-browser .theme.focus .theme-actions,.theme-browser .theme:focus .theme-actions,.theme-browser .theme:hover .theme-actions{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1}.theme-browser .theme .theme-actions .button-primary{margin-left:3px}.theme-browser .theme .theme-actions .button{float:none;margin-right:3px}.theme-browser .theme .theme-screenshot{display:block;overflow:hidden;position:relative;-webkit-backface-visibility:hidden;transition:opacity .2s ease-in-out}.theme-browser .theme .theme-screenshot:after{content:"";display:block;padding-top:66.66666%}.theme-browser .theme .theme-screenshot img{height:auto;position:absolute;right:0;top:0;width:100%;transition:opacity .2s ease-in-out}.theme-browser .theme:focus .theme-screenshot,.theme-browser .theme:hover .theme-screenshot{background:#fff}.theme-browser.rendered .theme:focus .theme-screenshot img,.theme-browser.rendered .theme:hover .theme-screenshot img{opacity:.4}.theme-browser .theme .more-details{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;position:absolute;top:35%;left:20%;right:20%;background:#23282d;background:rgba(0,0,0,.7);color:#fff;font-size:15px;text-shadow:0 1px 0 rgba(0,0,0,.6);-webkit-font-smoothing:antialiased;font-weight:600;padding:15px 12px;text-align:center;border-radius:3px;transition:opacity .1s ease-in-out}.theme-browser .theme:focus{border-color:#5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8)}.theme-browser .theme:focus .more-details{opacity:1}.theme-browser .theme.active:focus .theme-actions{display:block}.theme-browser.rendered .theme:focus .more-details,.theme-browser.rendered .theme:hover .more-details{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1}.theme-browser .theme.active .theme-name{background:#23282d;color:#fff;padding-left:110px;font-weight:300;box-shadow:inset 0 1px 1px rgba(0,0,0,.5)}.theme-browser .customize-control .theme.active .theme-name{padding-left:15px}.theme-browser .theme.active .theme-name span{font-weight:600}.theme-browser .theme.active .theme-actions{background:rgba(49,49,49,.7);border-right:none;opacity:1}.theme-id-container{position:relative}.theme-browser .theme .theme-actions,.theme-browser .theme.active .theme-actions{position:absolute;top:50%;transform:translateY(-50%);left:0;padding:9px 15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}.theme-browser .theme.active .theme-actions .button-primary{margin-left:0}.theme-browser .theme .theme-author{background:#23282d;color:#eee;display:none;font-size:14px;margin:0 10px;padding:5px 10px;position:absolute;bottom:56px}.theme-browser .theme.display-author .theme-author{display:block}.theme-browser .theme.display-author .theme-author a{color:inherit;text-decoration:none}.theme-browser .theme.add-new-theme{border:none;box-shadow:none}.theme-browser .theme.add-new-theme a{text-decoration:none;display:block;position:relative;z-index:1}.theme-browser .theme.add-new-theme a:after{display:block;content:"";background:0 0;background:rgba(0,0,0,0);position:absolute;top:0;right:0;left:0;bottom:0;padding:0;text-shadow:none;border:5px dashed #d5d2ca;border:5px dashed rgba(0,0,0,.1);box-sizing:border-box}.theme-browser .theme.add-new-theme span:after{background:#e5e5e5;background:rgba(153,153,153,.1);border-radius:50%;display:inline-block;content:"\f132";-webkit-font-smoothing:antialiased;font:normal 74px/115px dashicons;width:100px;height:100px;vertical-align:middle;text-align:center;color:#999;position:absolute;top:30%;right:50%;margin-right:-50px;text-indent:-4px;padding:0;text-shadow:none;z-index:4}.rtl .theme-browser .theme.add-new-theme span:after{text-indent:4px}.theme-browser .theme.add-new-theme a:focus .theme-screenshot,.theme-browser .theme.add-new-theme a:hover .theme-screenshot{background:0 0}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{background:#fff;color:#0073aa}.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{border-color:transparent;color:#fff;background:#0073aa;content:""}.theme-browser .theme.add-new-theme .theme-name{background:0 0;text-align:center;box-shadow:none;font-weight:400;position:relative;top:0;margin-top:-18px;padding-top:0;padding-bottom:48px}.theme-browser .theme.add-new-theme a:focus .theme-name,.theme-browser .theme.add-new-theme a:hover .theme-name{color:#fff;z-index:2}.theme-overlay .theme-backdrop{position:absolute;right:-20px;left:0;top:0;bottom:0;background:#f1f1f1;background:rgba(238,238,238,.9);z-index:10000}.theme-overlay .theme-header{position:absolute;top:0;right:0;left:0;height:48px;border-bottom:1px solid #ddd}.theme-overlay .theme-header button{padding:0}.theme-overlay .theme-header .close{cursor:pointer;height:48px;width:50px;text-align:center;float:left;border:0;border-right:1px solid #ddd;background-color:transparent;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-overlay .theme-header .close:before{font:normal 22px/50px dashicons!important;color:#72777c;display:inline-block;content:"\f335";font-weight:300}.theme-overlay .theme-header .left,.theme-overlay .theme-header .right{cursor:pointer;color:#72777c;background-color:transparent;height:48px;width:54px;float:right;text-align:center;border:0;border-left:1px solid #ddd;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-overlay .theme-header .close:focus,.theme-overlay .theme-header .close:hover,.theme-overlay .theme-header .left:focus,.theme-overlay .theme-header .left:hover,.theme-overlay .theme-header .right:focus,.theme-overlay .theme-header .right:hover{background:#ddd;border-color:#ccc;color:#000}.theme-overlay .theme-header .close:focus:before,.theme-overlay .theme-header .close:hover:before{color:#000}.theme-overlay .theme-header .close:focus,.theme-overlay .theme-header .left:focus,.theme-overlay .theme-header .right:focus{box-shadow:none;outline:0}.theme-overlay .theme-header .left.disabled,.theme-overlay .theme-header .left.disabled:hover,.theme-overlay .theme-header .right.disabled,.theme-overlay .theme-header .right.disabled:hover{color:#ccc;background:inherit;cursor:inherit}.theme-overlay .theme-header .left:before,.theme-overlay .theme-header .right:before{font:normal 20px/50px dashicons!important;display:inline;font-weight:300}.theme-overlay .theme-header .left:before{content:"\f345"}.theme-overlay .theme-header .right:before{content:"\f341"}.theme-overlay .theme-wrap{clear:both;position:fixed;top:9%;right:190px;left:30px;bottom:3%;background:#fff;box-shadow:0 1px 20px 5px rgba(0,0,0,.1);z-index:10000;box-sizing:border-box;-webkit-overflow-scrolling:touch}body.folded .theme-browser~.theme-overlay .theme-wrap{right:70px}.theme-overlay .theme-about{position:absolute;top:49px;bottom:57px;right:0;left:0;overflow:auto;padding:2% 4%}.theme-overlay .theme-actions{position:absolute;text-align:center;bottom:0;right:0;left:0;padding:10px 25px 5px;background:#f3f3f3;z-index:30;box-sizing:border-box;border-top:1px solid #eee}.ie8 .theme-overlay .theme-actions{border:1px solid #eee}.theme-overlay .theme-actions a{margin-left:5px;margin-bottom:5px}.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-background"],.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-header"]{display:none}.broken-themes a.delete-theme,.theme-overlay .theme-actions .delete-theme{color:#a00;text-decoration:none;border-color:transparent;box-shadow:none;background:0 0}.theme-overlay .theme-actions .delete-theme{position:absolute;left:10px;bottom:5px}.broken-themes a.delete-theme:focus,.broken-themes a.delete-theme:hover,.theme-overlay .theme-actions .delete-theme:focus,.theme-overlay .theme-actions .delete-theme:hover{background:#d54e21;color:#fff;border-color:#d54e21}.theme-overlay .theme-actions .active-theme,.theme-overlay.active .theme-actions .inactive-theme{display:none}.theme-overlay .theme-actions .inactive-theme,.theme-overlay.active .theme-actions .active-theme{display:block}.theme-overlay .theme-screenshots{float:right;margin:0 0 0 30px;width:55%;max-width:1200px;text-align:center}.theme-overlay .screenshot{border:1px solid #fff;box-sizing:border-box;overflow:hidden;position:relative;box-shadow:0 0 0 1px rgba(0,0,0,.2)}.theme-overlay .screenshot:after{content:"";display:block;padding-top:75%}.theme-overlay .screenshot img{height:auto;position:absolute;right:0;top:0;width:100%}.theme-overlay.small-screenshot .theme-screenshots{position:absolute;width:302px}.theme-overlay.small-screenshot .theme-info{margin-right:350px;width:auto}.theme-overlay .screenshot.thumb{background:#ccc;border:1px solid #eee;float:none;display:inline-block;margin:10px 5px 0;width:140px;height:80px;cursor:pointer}.theme-overlay .screenshot.thumb:after{content:"";display:block;padding-top:100%}.theme-overlay .screenshot.thumb img{cursor:pointer;height:auto;position:absolute;right:0;top:0;width:100%;height:auto}.theme-overlay .screenshot.selected{background:0 0;border:2px solid #00a0d2}.theme-overlay .screenshot.selected img{opacity:.8}.theme-browser .theme .theme-screenshot.blank,.theme-overlay .screenshot.blank{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=)}.theme-overlay .theme-info{width:40%;float:right}.theme-overlay .current-label{background:#32373c;color:#fff;font-size:11px;display:inline-block;padding:2px 8px;border-radius:2px;margin:0 0 -10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.theme-overlay .theme-name{color:#23282d;font-size:32px;font-weight:100;margin:10px 0 0;line-height:1.3;word-wrap:break-word;overflow-wrap:break-word}.theme-overlay .theme-version{color:#72777c;font-size:13px;font-weight:400;float:none;display:inline-block;margin-right:10px}.theme-overlay .theme-author{margin:15px 0 25px;color:#72777c;font-size:16px;font-weight:400;line-height:inherit}.theme-overlay .theme-author a{text-decoration:none}.theme-overlay .theme-description{color:#555;font-size:15px;font-weight:400;line-height:1.5;margin:30px 0 0 0}.theme-overlay .theme-tags{border-top:3px solid #eee;color:#82878c;font-size:13px;font-weight:400;margin:30px 0 0 0;padding-top:20px}.theme-overlay .theme-tags span{color:#444;font-weight:600;margin-left:5px}.theme-overlay .parent-theme{background:#f7fcfe;border:1px solid #eee;border-right:4px solid #00a0d2;font-size:14px;font-weight:400;margin-top:30px;padding:10px 20px 10px 10px}.theme-overlay .parent-theme strong{font-weight:600}.single-theme .theme,.single-theme .theme-overlay .theme-backdrop,.single-theme .theme-overlay .theme-header{display:none}.single-theme .theme-overlay .theme-wrap{clear:both;min-height:330px;position:relative;right:auto;left:auto;top:auto;bottom:auto;z-index:10}.single-theme .theme-overlay .theme-about{padding:30px 30px 70px;position:static}.single-theme .theme-overlay .theme-actions{position:absolute}@media only screen and (min-width:2000px){#wpwrap .theme-browser .theme{width:17.6%;margin:0 0 3% 3%}#wpwrap .theme-browser .theme:nth-child(3n),#wpwrap .theme-browser .theme:nth-child(4n){margin-left:3%}#wpwrap .theme-browser .theme:nth-child(5n){margin-left:0}}@media only screen and (min-width:1680px){.theme-overlay .theme-wrap{width:1450px;margin:0 auto}}@media only screen and (min-width:1640px){.theme-browser .theme{width:22.7%;margin:0 0 3% 3%}.theme-browser .theme .theme-screenshot:after{padding-top:75%}.theme-browser .theme:nth-child(3n){margin-left:3%}.theme-browser .theme:nth-child(4n){margin-left:0}}@media only screen and (max-width:1120px){.theme-browser .theme{width:47.5%;margin-left:0}.theme-browser .theme:nth-child(even){margin-left:0}.theme-browser .theme:nth-child(odd){margin-left:5%}}@media only screen and (max-width:960px){.theme-overlay .theme-wrap{right:65px}}@media only screen and (max-width:780px){.theme-overlay .theme-wrap,body.folded .theme-overlay .theme-wrap{top:0;left:0;bottom:0;right:0;padding:70px 20px 20px;border:none;z-index:100000;position:fixed}.theme-browser .theme.active .theme-name span{display:none}.theme-overlay .theme-screenshots{width:40%}.theme-overlay .theme-info{width:50%}.single-theme .theme-wrap{padding:10px}.theme-browser .theme .theme-actions{padding:5px 10px 4px 10px}.theme-overlay.small-screenshot .theme-screenshots{position:static;float:none;max-width:302px}.theme-overlay.small-screenshot .theme-info{margin-right:0;width:auto}.theme:focus .more-details,.theme:hover .more-details,.theme:not(.active):focus .theme-actions,.theme:not(.active):hover .theme-actions{display:none}.theme-browser.rendered .theme:focus .theme-screenshot img,.theme-browser.rendered .theme:hover .theme-screenshot img{opacity:1}}@media only screen and (max-width:480px){.theme-browser .theme{width:100%;margin-left:0}.theme-browser .theme:nth-child(2n),.theme-browser .theme:nth-child(3n){margin-left:0}}@media only screen and (max-width:650px){.theme-overlay .theme-description{margin-right:0}.theme-overlay .theme-actions .delete-theme{position:relative;left:auto;bottom:auto}.theme-overlay .theme-actions .inactive-theme{display:inline}.theme-overlay .theme-screenshots{width:100%;float:none}.theme-overlay .theme-info{width:100%}.theme-overlay .theme-author{margin:5px 0 15px 0}.theme-overlay .current-label{margin-top:10px;font-size:13px}.themes-php .wp-filter-search{float:none;clear:both;right:0;left:0;margin:-5px 0 20px 0;width:100%;max-width:280px}.theme-browser .theme.add-new-theme span:after{font:normal 60px/90px dashicons;width:80px;height:80px;top:30%;right:50%;text-indent:0;margin-right:-40px}.single-theme .theme-wrap{margin:0 -10px 0 -12px;padding:10px}.single-theme .theme-overlay .theme-about{padding:10px;overflow:visible}.single-theme .current-label{display:none}.single-theme .theme-overlay .theme-actions{position:static}}.broken-themes{clear:both}.broken-themes table{text-align:right;width:50%;border-spacing:3px;padding:3px}.theme-browser .theme .theme-installed{background:#0073aa}.theme-browser .theme .notice-success p:before{color:#79ba49;content:"\f147";display:inline-block;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.theme-install.updated-message:before{content:""}.theme-install-php .wp-filter{padding-right:20px}.theme-install-php a.browse-themes,.theme-install-php a.upload{cursor:pointer}.plugin-install-tab-upload .upload-view-toggle .upload,.upload-view-toggle .browse{display:none}.plugin-install-tab-upload .upload-view-toggle .browse{display:inline}.upload-plugin,.upload-theme{box-sizing:border-box;display:none;margin:0;padding:50px 0;width:100%;overflow:hidden;position:relative;top:10px}.upload-plugin-wrap{display:none}.plugin-install-tab-upload .upload-plugin,.show-upload-view .upload-plugin,.show-upload-view .upload-plugin-wrap,.show-upload-view .upload-theme{display:block}.upload-plugin .wp-upload-form,.upload-theme .wp-upload-form{background:#fafafa;border:1px solid #ccd0d4;padding:30px;margin:30px auto;max-width:380px;display:flex}.upload-plugin .wp-upload-form>input[type=file],.upload-theme .wp-upload-form>input[type=file]{padding:5px 0 0 1em}.upload-plugin .install-help,.upload-theme .install-help{color:#555d66;font-size:18px;font-style:normal;margin:0;padding:0;text-align:center}p.no-themes,p.no-themes-local{clear:both;color:#666;font-size:18px;font-style:normal;margin:0;padding:100px 0;text-align:center;display:none}.no-results p.no-themes{display:block}.theme-install-php .add-new-theme{display:none!important}@media only screen and (max-width:1120px){.upload-theme .wp-upload-form{margin:20px 0;max-width:100%}.upload-theme .install-help{font-size:15px;padding:20px 0 0;text-align:right}}.theme-details .theme-rating{line-height:1.9}.theme-details .star-rating{display:inline}.theme-details .no-rating,.theme-details .num-ratings{font-size:11px;color:#72777c}.theme-details .no-rating{display:block;line-height:1.9}.appearance_page_custom-header #headimg{border:1px solid #ddd;overflow:hidden;width:100%}.appearance_page_custom-header #upload-form p label{font-size:12px}.appearance_page_custom-header .available-headers .default-header{float:right;margin:0 0 20px 20px}.appearance_page_custom-header .random-header{clear:both;margin:0 0 20px 20px;vertical-align:middle}.appearance_page_custom-header .available-headers label input,.appearance_page_custom-header .random-header label input{margin-left:10px}.appearance_page_custom-header .available-headers label img{vertical-align:middle}div#custom-background-image{min-height:100px;border:1px solid #ddd}div#custom-background-image img{max-width:400px;max-height:300px}.background-position-control input[type=radio]:checked~.button{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);z-index:1}.background-position-control input[type=radio]:focus~.button{border-color:#5b9dd9;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 3px rgba(0,115,170,.8);color:#23282d}.background-position-control .background-position-center-icon,.background-position-control .background-position-center-icon:before{display:inline-block;line-height:1;text-align:center;transition:background-color .1s ease-in}.background-position-control .background-position-center-icon{height:20px;margin-top:13px;vertical-align:top;width:20px}.background-position-control .background-position-center-icon:before{background-color:#555;border-radius:50%;content:"";height:12px;width:12px}.background-position-control .button:hover .background-position-center-icon:before,.background-position-control input[type=radio]:focus~.button .background-position-center-icon:before{background-color:#23282d}.background-position-control .button-group{display:block}.background-position-control .button-group .button{border-radius:0;box-shadow:none;height:40px!important;line-height:2.9!important;margin:0 0 0 -1px!important;padding:0 10px 1px!important;position:relative}.background-position-control .button-group .button:active,.background-position-control .button-group .button:focus,.background-position-control .button-group .button:hover{z-index:1}.background-position-control .button-group:last-child .button{box-shadow:0 1px 0 #ccc}.background-position-control .button-group>label{margin:0!important}.background-position-control .button-group:first-child>label:first-child .button{border-radius:0 3px 0 0}.background-position-control .button-group:first-child>label:first-child .dashicons{transform:rotate(-45deg)}.background-position-control .button-group:first-child>label:last-child .button{border-radius:3px 0 0 0}.background-position-control .button-group:first-child>label:last-child .dashicons{transform:rotate(45deg)}.background-position-control .button-group:last-child>label:first-child .button{border-radius:0 0 3px 0}.background-position-control .button-group:last-child>label:first-child .dashicons{transform:rotate(45deg)}.background-position-control .button-group:last-child>label:last-child .button{border-radius:0 0 0 3px}.background-position-control .button-group:last-child>label:last-child .dashicons{transform:rotate(-45deg)}.background-position-control .button-group .dashicons{margin-top:9px}.background-position-control .button-group+.button-group{margin-top:-1px}body.full-overlay-active{overflow:hidden;visibility:hidden}.wp-full-overlay{background:0 0;z-index:500000;position:fixed;overflow:visible;top:0;bottom:0;right:0;left:0;height:100%;min-width:0}.wp-full-overlay-sidebar{box-sizing:border-box;position:fixed;min-width:300px;max-width:600px;width:18%;height:100%;top:0;bottom:0;right:0;padding:0;margin:0;z-index:10;background:#eee;border-left:none}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{overflow:visible}.wp-full-overlay.collapsed,.wp-full-overlay.expanded .wp-full-overlay-sidebar{margin-right:0!important}.wp-full-overlay.expanded{margin-right:300px}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-right:-300px}@media screen and (min-width:1667px){.wp-full-overlay.expanded{margin-right:18%}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-right:-18%}}@media screen and (min-width:3333px){.wp-full-overlay.expanded{margin-right:600px}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-right:-600px}}.wp-full-overlay-sidebar:after{content:"";display:block;position:absolute;top:0;bottom:0;left:0;width:3px;z-index:1000}.wp-full-overlay-main{position:absolute;right:0;left:0;top:0;bottom:0;height:100%}.wp-full-overlay-sidebar .wp-full-overlay-header{position:absolute;right:0;left:0;height:45px;padding:0 15px;line-height:3.2;z-index:10;margin:0;border-top:none;box-shadow:none}.wp-full-overlay-sidebar .wp-full-overlay-header a.back{margin-top:9px}.wp-full-overlay-sidebar .wp-full-overlay-footer{bottom:0;border-bottom:none;border-top:none;box-shadow:none}.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content{position:absolute;top:45px;bottom:45px;right:0;left:0;overflow:auto}.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header{padding:0}.theme-install-overlay .close-full-overlay,.theme-install-overlay .next-theme,.theme-install-overlay .previous-theme{display:block;position:relative;float:right;width:45px;height:45px;background:#eee;border-left:1px solid #ddd;color:#444;cursor:pointer;text-decoration:none;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-install-overlay .close-full-overlay:focus,.theme-install-overlay .close-full-overlay:hover,.theme-install-overlay .next-theme:focus,.theme-install-overlay .next-theme:hover,.theme-install-overlay .previous-theme:focus,.theme-install-overlay .previous-theme:hover{background:#ddd;border-color:#ccc;color:#000;outline:0;box-shadow:none}.theme-install-overlay .close-full-overlay:before{font:normal 22px/1 dashicons;content:"\f335";position:relative;top:7px;right:13px}.theme-install-overlay .previous-theme:before{font:normal 20px/1 dashicons;content:"\f345";position:relative;top:6px;right:14px}.theme-install-overlay .next-theme:before{font:normal 20px/1 dashicons;content:"\f341";position:relative;top:6px;right:13px}.theme-install-overlay .next-theme.disabled,.theme-install-overlay .next-theme.disabled:focus,.theme-install-overlay .next-theme.disabled:hover,.theme-install-overlay .previous-theme.disabled,.theme-install-overlay .previous-theme.disabled:focus,.theme-install-overlay .previous-theme.disabled:hover{color:#b4b9be;background:#eee;cursor:default;pointer-events:none}.theme-install-overlay .close-full-overlay,.theme-install-overlay .next-theme,.theme-install-overlay .previous-theme{border-right:0;border-top:0;border-bottom:0}.theme-install-overlay .close-full-overlay:before,.theme-install-overlay .next-theme:before,.theme-install-overlay .previous-theme:before{top:2px;right:0}.wp-core-ui .wp-full-overlay .collapse-sidebar{position:fixed;bottom:0;right:0;padding:9px 10px 9px 0;height:45px;color:#656a6f;outline:0;line-height:1;background-color:transparent!important;border:none!important;box-shadow:none!important;border-radius:0!important}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#0073aa}.wp-full-overlay .collapse-sidebar-arrow,.wp-full-overlay .collapse-sidebar-label{display:inline-block;vertical-align:middle;line-height:1.6}.wp-full-overlay .collapse-sidebar-arrow{width:20px;height:20px;margin:0 2px;border-radius:50%;overflow:hidden}.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.wp-full-overlay .collapse-sidebar-label{margin-right:3px}.wp-full-overlay.collapsed .collapse-sidebar-label{display:none}.wp-full-overlay .collapse-sidebar-arrow:before{display:block;content:"\f148";background:#eee;font:normal 20px/1 dashicons;speak:none;padding:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar{padding:9px 10px}.rtl .wp-full-overlay .collapse-sidebar-arrow:before,.wp-full-overlay.collapsed .collapse-sidebar-arrow:before{transform:rotate(180.001deg)}.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before{transform:none}.wp-full-overlay,.wp-full-overlay .collapse-sidebar,.wp-full-overlay-main,.wp-full-overlay-sidebar{transition-property:right,left,top,bottom,width,margin;transition-duration:.2s}.wp-full-overlay{background:#191e23}.wp-full-overlay-main{background-color:#f1f1f1}.expanded .wp-full-overlay-footer{position:fixed;bottom:0;right:0;min-width:299px;max-width:599px;width:18%;width:calc(18% - 1px);height:45px;border-top:1px solid #ddd;background:#eee}.wp-full-overlay-footer .devices-wrapper{float:left}.wp-full-overlay-footer .devices{position:relative;background:#eee;box-shadow:20px 0 10px -5px #eee}.wp-full-overlay-footer .devices button{cursor:pointer;background:0 0;border:none;height:45px;padding:0 3px;margin:0 -4px 0 0;box-shadow:none;border-top:1px solid transparent;border-bottom:4px solid transparent;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.wp-full-overlay-footer .devices button:focus{box-shadow:none;outline:0}.wp-full-overlay-footer .devices button:before{display:inline-block;-webkit-font-smoothing:antialiased;font:normal 20px/30px dashicons;vertical-align:top;margin:3px 0;padding:4px 8px;color:#656a6f}.wp-full-overlay-footer .devices button.active{border-bottom-color:#191e23}.wp-full-overlay-footer .devices button:focus,.wp-full-overlay-footer .devices button:hover{background-color:#fff}.wp-full-overlay-footer .devices button.active:hover,.wp-full-overlay-footer .devices button:focus{border-bottom-color:#0073aa}.wp-full-overlay-footer .devices button.active:before{color:#191e23}.wp-full-overlay-footer .devices button:focus:before,.wp-full-overlay-footer .devices button:hover:before{color:#0073aa}.wp-full-overlay-footer .devices .preview-desktop:before{content:"\f472"}.wp-full-overlay-footer .devices .preview-tablet:before{content:"\f471"}.wp-full-overlay-footer .devices .preview-mobile:before{content:"\f470"}@media screen and (max-width:1024px){.wp-full-overlay-footer .devices{display:none}}.collapsed .wp-full-overlay-footer .devices button:before{display:none}.preview-mobile .wp-full-overlay-main{margin:auto -160px auto 0;width:320px;height:480px;max-height:100%;max-width:100%;right:50%}.preview-tablet .wp-full-overlay-main{margin:auto -360px auto 0;width:720px;height:1080px;max-height:100%;max-width:100%;right:50%}.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#customize-container,#customize-controls .notice.notification-overlay{background:#eee;z-index:500000;position:fixed;overflow:visible;top:0;bottom:0;right:0;left:0;height:100%}#customize-container{display:none}#customize-container,.theme-install-overlay{visibility:visible}.customize-loading #customize-container iframe{opacity:0}#customize-container iframe,.theme-install-overlay iframe{height:100%;width:100%;z-index:20;transition:opacity .3s}#customize-controls{margin-top:0}.theme-install-overlay{display:none}.theme-install-overlay.single-theme{display:block}.install-theme-info{display:none;padding:10px 20px 60px}.single-theme .install-theme-info{padding-top:15px}.theme-install-overlay .install-theme-info{display:block}.install-theme-info .theme-install{float:left;margin-top:18px}.install-theme-info .theme-name{font-size:16px;line-height:1.5;margin-bottom:0;margin-top:0}.install-theme-info .theme-screenshot{margin:15px 0;width:258px;border:1px solid #ccc}.install-theme-info .theme-details{overflow:hidden}.theme-details .theme-version{margin:15px 0}.theme-details .theme-description{float:right;color:#72777c;line-height:1.6;max-width:100%}.theme-install-overlay .wp-full-overlay-header .button{float:left;margin:8px 0 0 10px;line-height:2}.theme-install-overlay .wp-full-overlay-sidebar{background:#eee;border-left:1px solid #ddd}.theme-install-overlay .wp-full-overlay-sidebar-content{background:#fff;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.theme-install-overlay .wp-full-overlay-main{position:absolute;z-index:0;background-color:#f1f1f1}.customize-loading #customize-container{background-color:#f1f1f1}#customize-controls .notice.notification-overlay.notification-loading:before,#customize-preview.wp-full-overlay-main:before,.customize-loading #customize-container:before,.theme-install-overlay .wp-full-overlay-main:before{content:"";display:block;width:20px;height:20px;position:absolute;right:50%;top:50%;z-index:-1;margin:-10px -10px 0 0;transform:translateZ(0);background:transparent url(../images/spinner.gif) no-repeat center center;background-size:20px 20px}#customize-preview.wp-full-overlay-main.iframe-ready:before,.theme-install-overlay.iframe-ready .wp-full-overlay-main:before{background-image:none}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-full-overlay .collapse-sidebar-arrow{background-image:url(../images/arrows-2x.png);background-size:15px 123px}#customize-controls .notice.notification-overlay.notification-loading:before,#customize-preview.wp-full-overlay-main:before,.customize-loading #customize-container:before,.theme-install-overlay .wp-full-overlay-main:before{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){.available-theme .action-links .delete-theme{float:none;margin:0;padding:0;clear:both}.available-theme .action-links .delete-theme a{padding:0}.broken-themes table{width:100%}.theme-install-overlay .wp-full-overlay-header .theme-install{margin-top:6px;line-height:normal}.theme-browser .theme .theme-actions .button{margin-bottom:0}.theme-browser .theme .theme-actions,.theme-browser .theme.active .theme-actions{padding-top:4px;padding-bottom:4px}}@media aural{.theme .notice:before,.theme-info .updated-message:before,.theme-info .updating-message:before,.theme-install.updating-message:before{speak:none}} \ No newline at end of file diff --git a/wp-admin/css/themes.css b/wp-admin/css/themes.css new file mode 100644 index 0000000..4b793a0 --- /dev/null +++ b/wp-admin/css/themes.css @@ -0,0 +1,1925 @@ +/*------------------------------------------------------------------------------ + 16.0 - Themes +------------------------------------------------------------------------------*/ + + +/*------------------------------------------------------------------------------ + 16.1 - Manage Themes +------------------------------------------------------------------------------*/ + +body.js .theme-browser.search-loading { + display: none; +} + +.theme-browser .themes { + clear: both; +} + +.themes-php:not(.network-admin) .wrap h1 { + margin-bottom: 15px; +} + +.themes-php .wrap h1 .button { + margin-left: 20px; +} + +/* Search form */ +.themes-php .search-form { + display: inline; +} + +.themes-php .wp-filter-search { + position: relative; + top: -2px; + left: 20px; + margin: 0; + width: 280px; +} + +/* Position admin messages */ +.theme .notice, +.theme .notice.is-dismissible { + left: 0; + margin: 0; + position: absolute; + right: 0; + top: 0; +} + +/** + * Main theme element + * (has flexible margins) + */ +.theme-browser .theme { + cursor: pointer; + float: left; + margin: 0 4% 4% 0; + position: relative; + width: 30.6%; + border: 1px solid #ddd; + box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.1); + box-sizing: border-box; +} + +.ie8 .theme-browser .theme { + width: 30%; + margin: 0 3% 4% 0; +} + +.theme-browser .theme:nth-child(3n) { + margin-right: 0; +} + +.theme-browser .theme:hover, +.theme-browser .theme:focus { + cursor: pointer; +} + +.theme-browser .theme .theme-name { + font-size: 15px; + font-weight: 600; + height: 18px; + margin: 0; + padding: 15px; + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + background: #fff; + background: rgba(255, 255, 255, 0.65); +} + +/* Activate and Customize buttons, shown on hover and focus */ +.theme-browser .theme .theme-actions { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + opacity: 0; + transition: opacity 0.1s ease-in-out; + height: auto; + background: rgba(244, 244, 244, 0.7); + border-left: 1px solid rgba(0, 0, 0, 0.05); +} + +.theme-browser .theme:hover .theme-actions, +.theme-browser .theme.focus .theme-actions, +.theme-browser .theme:focus .theme-actions { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + opacity: 1; +} + +.theme-browser .theme .theme-actions .button-primary { + margin-right: 3px; +} + +.theme-browser .theme .theme-actions .button { + float: none; + margin-left: 3px; +} + +/** + * Theme Screenshot + * + * Has a fixed aspect ratio of 1.5 to 1 regardless of screenshot size + * It is also responsive. + */ +.theme-browser .theme .theme-screenshot { + display: block; + overflow: hidden; + position: relative; + -webkit-backface-visibility: hidden; /* Prevents flicker of the screenshot on hover. */ + transition: opacity 0.2s ease-in-out; +} + +.theme-browser .theme .theme-screenshot:after { + content: ""; + display: block; + padding-top: 66.66666%; /* using a 3/2 aspect ratio */ +} + +.theme-browser .theme .theme-screenshot img { + height: auto; + position: absolute; + left: 0; + top: 0; + width: 100%; + transition: opacity 0.2s ease-in-out; +} + +.theme-browser .theme:hover .theme-screenshot, +.theme-browser .theme:focus .theme-screenshot { + background: #fff; +} + +.theme-browser.rendered .theme:hover .theme-screenshot img, +.theme-browser.rendered .theme:focus .theme-screenshot img { + opacity: 0.4; +} + +.theme-browser .theme .more-details { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + opacity: 0; + position: absolute; + top: 35%; + right: 20%; + left: 20%; + background: #23282d; + background: rgba(0, 0, 0, 0.7); + color: #fff; + font-size: 15px; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.6); + -webkit-font-smoothing: antialiased; + font-weight: 600; + padding: 15px 12px; + text-align: center; + border-radius: 3px; + transition: opacity 0.1s ease-in-out; +} + +.theme-browser .theme:focus { + border-color: #5b9dd9; + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); +} + +.theme-browser .theme:focus .more-details { + opacity: 1; +} + +/* Current theme needs to have its action always on view */ +.theme-browser .theme.active:focus .theme-actions { + display: block; +} + +.theme-browser.rendered .theme:hover .more-details, +.theme-browser.rendered .theme:focus .more-details { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + opacity: 1; +} + +/** + * The currently active theme + */ +.theme-browser .theme.active .theme-name { + background: #23282d; + color: #fff; + padding-right: 110px; + font-weight: 300; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.5); +} + +.theme-browser .customize-control .theme.active .theme-name { + padding-right: 15px; +} + +.theme-browser .theme.active .theme-name span { + font-weight: 600; +} + +.theme-browser .theme.active .theme-actions { + background: rgba(49, 49, 49, 0.7); + border-left: none; + opacity: 1; +} + +.theme-id-container { + position: relative; +} + +.theme-browser .theme.active .theme-actions, +.theme-browser .theme .theme-actions { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 0; + padding: 9px 15px; + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1); +} + +.theme-browser .theme.active .theme-actions .button-primary { + margin-right: 0; +} + +.theme-browser .theme .theme-author { + background: #23282d; + color: #eee; + display: none; + font-size: 14px; + margin: 0 10px; + padding: 5px 10px; + position: absolute; + bottom: 56px; +} + +.theme-browser .theme.display-author .theme-author { + display: block; +} + +.theme-browser .theme.display-author .theme-author a { + color: inherit; + text-decoration: none; +} + +/** + * Add new theme + */ +.theme-browser .theme.add-new-theme { + border: none; + box-shadow: none; +} + +.theme-browser .theme.add-new-theme a { + text-decoration: none; + display: block; + position: relative; + z-index: 1; +} + +.theme-browser .theme.add-new-theme a:after { + display: block; + content: ""; + background: transparent; + background: rgba(0, 0, 0, 0); + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 0; + text-shadow: none; + border: 5px dashed #d5d2ca; + border: 5px dashed rgba(0, 0, 0, 0.1); + box-sizing: border-box; +} + +.theme-browser .theme.add-new-theme span:after { + background: #e5e5e5; + background: rgba(153, 153, 153, 0.1); + border-radius: 50%; + display: inline-block; + content: "\f132"; + -webkit-font-smoothing: antialiased; + font: normal 74px/115px dashicons; + width: 100px; + height: 100px; + vertical-align: middle; + text-align: center; + color: rgb(153, 153, 153); + position: absolute; + top: 30%; + left: 50%; + margin-left: -50px; + text-indent: -4px; + padding: 0; + text-shadow: none; + z-index: 4; +} + +.rtl .theme-browser .theme.add-new-theme span:after { + text-indent: 4px; +} + +.theme-browser .theme.add-new-theme a:hover .theme-screenshot, +.theme-browser .theme.add-new-theme a:focus .theme-screenshot { + background: none; +} + +.theme-browser .theme.add-new-theme a:hover span:after, +.theme-browser .theme.add-new-theme a:focus span:after { + background: #fff; + color: #0073aa; +} + +.theme-browser .theme.add-new-theme a:hover:after, +.theme-browser .theme.add-new-theme a:focus:after { + border-color: transparent; + color: #fff; + background: #0073aa; + content: ""; +} + +.theme-browser .theme.add-new-theme .theme-name { + background: none; + text-align: center; + box-shadow: none; + font-weight: 400; + position: relative; + top: 0; + margin-top: -18px; + padding-top: 0; + padding-bottom: 48px; +} + +.theme-browser .theme.add-new-theme a:hover .theme-name, +.theme-browser .theme.add-new-theme a:focus .theme-name { + color: #fff; + z-index: 2; +} + +/** + * Theme Overlay + * Shown when clicking a theme + */ +.theme-overlay .theme-backdrop { + position: absolute; + left: -20px; + right: 0; + top: 0; + bottom: 0; + background: #f1f1f1; + background: rgba(238, 238, 238, 0.9); + z-index: 10000; /* Over WP Pointers. */ +} + +.theme-overlay .theme-header { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 48px; + border-bottom: 1px solid #ddd; +} + +.theme-overlay .theme-header button { + padding: 0; +} + +.theme-overlay .theme-header .close { + cursor: pointer; + height: 48px; + width: 50px; + text-align: center; + float: right; + border: 0; + border-left: 1px solid #ddd; + background-color: transparent; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.theme-overlay .theme-header .close:before { + font: normal 22px/50px dashicons !important; + color: #72777c; + display: inline-block; + content: "\f335"; + font-weight: 300; +} + +/* Left and right navigation */ +.theme-overlay .theme-header .right, +.theme-overlay .theme-header .left { + cursor: pointer; + color: #72777c; + background-color: transparent; + height: 48px; + width: 54px; + float: left; + text-align: center; + border: 0; + border-right: 1px solid #ddd; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.theme-overlay .theme-header .close:focus, +.theme-overlay .theme-header .close:hover, +.theme-overlay .theme-header .right:focus, +.theme-overlay .theme-header .right:hover, +.theme-overlay .theme-header .left:focus, +.theme-overlay .theme-header .left:hover { + background: #ddd; + border-color: #ccc; + color: #000; +} + +.theme-overlay .theme-header .close:focus:before, +.theme-overlay .theme-header .close:hover:before { + color: #000; +} + +.theme-overlay .theme-header .close:focus, +.theme-overlay .theme-header .right:focus, +.theme-overlay .theme-header .left:focus { + box-shadow: none; + outline: none; +} + +.theme-overlay .theme-header .left.disabled, +.theme-overlay .theme-header .right.disabled, +.theme-overlay .theme-header .left.disabled:hover, +.theme-overlay .theme-header .right.disabled:hover { + color: #ccc; + background: inherit; + cursor: inherit; +} + +.theme-overlay .theme-header .right:before, +.theme-overlay .theme-header .left:before { + font: normal 20px/50px dashicons !important; + display: inline; + font-weight: 300; +} + +.theme-overlay .theme-header .left:before { + content: "\f341"; +} + +.theme-overlay .theme-header .right:before { + content: "\f345"; +} + +.theme-overlay .theme-wrap { + clear: both; + position: fixed; + top: 9%; + left: 190px; + right: 30px; + bottom: 3%; + background: #fff; + box-shadow: 0 1px 20px 5px rgba(0, 0, 0, 0.1); + z-index: 10000; /* Over WP Pointers. */ + box-sizing: border-box; + -webkit-overflow-scrolling: touch; +} + +body.folded .theme-browser ~ .theme-overlay .theme-wrap { + left: 70px; +} + +.theme-overlay .theme-about { + position: absolute; + top: 49px; + bottom: 57px; + left: 0; + right: 0; + overflow: auto; + padding: 2% 4%; +} + +.theme-overlay .theme-actions { + position: absolute; + text-align: center; + bottom: 0; + left: 0; + right: 0; + padding: 10px 25px 5px; + background: #f3f3f3; + z-index: 30; + box-sizing: border-box; + border-top: 1px solid #eee; +} + +.ie8 .theme-overlay .theme-actions { + border: 1px solid #eee; +} + +.theme-overlay .theme-actions a { + margin-right: 5px; + margin-bottom: 5px; +} + +/* Hide-if-customize for items we can't add classes to */ +.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-header"], +.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-background"] { + display: none; +} + +.broken-themes a.delete-theme, +.theme-overlay .theme-actions .delete-theme { + color: #a00; + text-decoration: none; + border-color: transparent; + box-shadow: none; + background: transparent; +} + +.theme-overlay .theme-actions .delete-theme { + position: absolute; + right: 10px; + bottom: 5px; +} + +.broken-themes a.delete-theme:hover, +.broken-themes a.delete-theme:focus, +.theme-overlay .theme-actions .delete-theme:hover, +.theme-overlay .theme-actions .delete-theme:focus { + background: #d54e21; + color: #fff; + border-color: #d54e21; +} + +.theme-overlay .theme-actions .active-theme, +.theme-overlay.active .theme-actions .inactive-theme { + display: none; +} + +.theme-overlay .theme-actions .inactive-theme, +.theme-overlay.active .theme-actions .active-theme { + display: block; +} + +/** + * Theme Screenshots gallery + */ +.theme-overlay .theme-screenshots { + float: left; + margin: 0 30px 0 0; + width: 55%; + max-width: 1200px; /* Recommended theme screenshot width, set here to avoid stretching */ + text-align: center; +} + +/* First screenshot, shown big */ +.theme-overlay .screenshot { + border: 1px solid #fff; + box-sizing: border-box; + overflow: hidden; + position: relative; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); +} + +.theme-overlay .screenshot:after { + content: ""; + display: block; + padding-top: 75%; /* using a 4/3 aspect ratio */ +} + +.theme-overlay .screenshot img { + height: auto; + position: absolute; + left: 0; + top: 0; + width: 100%; +} +/* Handles old 300px screenshots */ +.theme-overlay.small-screenshot .theme-screenshots { + position: absolute; + width: 302px; +} +.theme-overlay.small-screenshot .theme-info { + margin-left: 350px; + width: auto; +} + +/* Other screenshots, shown small and square */ +.theme-overlay .screenshot.thumb { + background: #ccc; + border: 1px solid #eee; + float: none; + display: inline-block; + margin: 10px 5px 0; + width: 140px; + height: 80px; + cursor: pointer; +} + +.theme-overlay .screenshot.thumb:after { + content: ""; + display: block; + padding-top: 100%; /* using a 1/1 aspect ratio */ +} + +.theme-overlay .screenshot.thumb img { + cursor: pointer; + height: auto; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: auto; +} + +.theme-overlay .screenshot.selected { + background: transparent; + border: 2px solid #00a0d2; +} + +.theme-overlay .screenshot.selected img { + opacity: 0.8; +} + +/* No screenshot placeholder */ +.theme-browser .theme .theme-screenshot.blank, +.theme-overlay .screenshot.blank { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=); +} + +/** + * Theme heading information + */ +.theme-overlay .theme-info { + width: 40%; + float: left; +} + +.theme-overlay .current-label { + background: #32373c; + color: #fff; + font-size: 11px; + display: inline-block; + padding: 2px 8px; + border-radius: 2px; + margin: 0 0 -10px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.theme-overlay .theme-name { + color: #23282d; + font-size: 32px; + font-weight: 100; + margin: 10px 0 0; + line-height: 1.3; + word-wrap: break-word; + overflow-wrap: break-word; +} + +.theme-overlay .theme-version { + color: #72777c; + font-size: 13px; + font-weight: 400; + float: none; + display: inline-block; + margin-left: 10px; +} + +.theme-overlay .theme-author { + margin: 15px 0 25px; + color: #72777c; + font-size: 16px; + font-weight: 400; + line-height: inherit; +} + +.theme-overlay .theme-author a { + text-decoration: none; +} + +.theme-overlay .theme-description { + color: #555; + font-size: 15px; + font-weight: 400; + line-height: 1.5; + margin: 30px 0 0 0; +} + +.theme-overlay .theme-tags { + border-top: 3px solid #eee; + color: #82878c; + font-size: 13px; + font-weight: 400; + margin: 30px 0 0 0; + padding-top: 20px; +} + +.theme-overlay .theme-tags span { + color: #444; + font-weight: 600; + margin-right: 5px; +} + +.theme-overlay .parent-theme { + background: #f7fcfe; + border: 1px solid #eee; + border-left: 4px solid #00a0d2; + font-size: 14px; + font-weight: 400; + margin-top: 30px; + padding: 10px 10px 10px 20px; +} + +.theme-overlay .parent-theme strong { + font-weight: 600; +} + +/** + * Single Theme Mode + * Displays detailed view inline when a user has no switch capabilities + */ +.single-theme .theme-overlay .theme-backdrop, +.single-theme .theme-overlay .theme-header, +.single-theme .theme { + display: none; +} + +.single-theme .theme-overlay .theme-wrap { + clear: both; + min-height: 330px; + position: relative; + left: auto; + right: auto; + top: auto; + bottom: auto; + z-index: 10; +} + +.single-theme .theme-overlay .theme-about { + padding: 30px 30px 70px; + position: static; +} + +.single-theme .theme-overlay .theme-actions { + position: absolute; +} + +/** + * Basic Responsive structure... + * + * Shuffles theme columns around based on screen width + */ + +@media only screen and (min-width: 2000px) { + #wpwrap .theme-browser .theme { + width: 17.6%; + margin: 0 3% 3% 0; + } + + #wpwrap .theme-browser .theme:nth-child(3n), + #wpwrap .theme-browser .theme:nth-child(4n) { + margin-right: 3%; + } + + #wpwrap .theme-browser .theme:nth-child(5n) { + margin-right: 0; + } +} + +@media only screen and (min-width: 1680px) { + .theme-overlay .theme-wrap { + width: 1450px; + margin: 0 auto; + } +} + +/* Maximum screenshot width reaches 440px */ +@media only screen and (min-width: 1640px) { + .theme-browser .theme { + width: 22.7%; + margin: 0 3% 3% 0; + } + .theme-browser .theme .theme-screenshot:after { + padding-top: 75%; /* using a 4/3 aspect ratio */ + } + + .theme-browser .theme:nth-child(3n) { + margin-right: 3%; + } + + .theme-browser .theme:nth-child(4n) { + margin-right: 0; + } +} +/* Maximum screenshot width reaches 440px */ +@media only screen and (max-width: 1120px) { + .theme-browser .theme { + width: 47.5%; + margin-right: 0; + } + + .theme-browser .theme:nth-child(even) { + margin-right: 0; + } + + .theme-browser .theme:nth-child(odd) { + margin-right: 5%; + } +} + +/* Admin menu is folded */ +@media only screen and (max-width: 960px) { + .theme-overlay .theme-wrap { + left: 65px; + } +} + +@media only screen and (max-width: 780px) { + body.folded .theme-overlay .theme-wrap, + .theme-overlay .theme-wrap { + top: 0; /* The adminmenu isn't fixed on mobile, so this can use the full viewport height */ + right: 0; + bottom: 0; + left: 0; + padding: 70px 20px 20px; + border: none; + z-index: 100000; /* should overlap #wpadminbar. */ + position: fixed; + } + + .theme-browser .theme.active .theme-name span { + /* Hide the "Active: " label on smaller screens. */ + display: none; + } + + .theme-overlay .theme-screenshots { + width: 40%; + } + + .theme-overlay .theme-info { + width: 50%; + } + .single-theme .theme-wrap { + padding: 10px; + } + + .theme-browser .theme .theme-actions { + padding: 5px 10px 4px 10px; + } + + .theme-overlay.small-screenshot .theme-screenshots { + position: static; + float: none; + max-width: 302px; + } + + .theme-overlay.small-screenshot .theme-info { + margin-left: 0; + width: auto; + } + + .theme:not(.active):hover .theme-actions, + .theme:not(.active):focus .theme-actions, + .theme:hover .more-details, + .theme:focus .more-details { + display: none; + } + + .theme-browser.rendered .theme:hover .theme-screenshot img, + .theme-browser.rendered .theme:focus .theme-screenshot img { + opacity: 1.0; + } +} + +@media only screen and (max-width: 480px) { + .theme-browser .theme { + width: 100%; + margin-right: 0; + } + + .theme-browser .theme:nth-child(2n), + .theme-browser .theme:nth-child(3n) { + margin-right: 0; + } +} + +@media only screen and (max-width: 650px) { + .theme-overlay .theme-description { + margin-left: 0; + } + + .theme-overlay .theme-actions .delete-theme { + position: relative; + right: auto; + bottom: auto; + } + + .theme-overlay .theme-actions .inactive-theme { + display: inline; + } + + .theme-overlay .theme-screenshots { + width: 100%; + float: none; + } + + .theme-overlay .theme-info { + width: 100%; + } + + .theme-overlay .theme-author { + margin: 5px 0 15px 0; + } + + .theme-overlay .current-label { + margin-top: 10px; + font-size: 13px; + } + + .themes-php .wp-filter-search { + float: none; + clear: both; + left: 0; + right: 0; + margin: -5px 0 20px 0; + width: 100%; + max-width: 280px; + } + + .theme-browser .theme.add-new-theme span:after { + font: normal 60px/90px dashicons; + width: 80px; + height: 80px; + top: 30%; + left: 50%; + text-indent: 0; + margin-left: -40px; + } + + .single-theme .theme-wrap { + margin: 0 -12px 0 -10px; + padding: 10px; + } + .single-theme .theme-overlay .theme-about { + padding: 10px; + overflow: visible; + } + .single-theme .current-label { + display: none; + } + .single-theme .theme-overlay .theme-actions { + position: static; + } +} + +.broken-themes { + clear: both; +} + +.broken-themes table { + text-align: left; + width: 50%; + border-spacing: 3px; + padding: 3px; +} + + +/*------------------------------------------------------------------------------ + 16.2 - Install Themes +------------------------------------------------------------------------------*/ + +/* Already installed theme */ +.theme-browser .theme .theme-installed { + background: #0073aa; +} +.theme-browser .theme .notice-success p:before { + color: #79ba49; + content: "\f147"; + display: inline-block; + font: normal 20px/1 'dashicons'; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + vertical-align: top; +} + +.theme-install.updated-message:before { + content: ""; +} + +.theme-install-php .wp-filter { + padding-left: 20px; +} + +.theme-install-php a.upload, +.theme-install-php a.browse-themes { + cursor: pointer; +} + +.upload-view-toggle .browse, +.plugin-install-tab-upload .upload-view-toggle .upload { + display: none; +} + +.plugin-install-tab-upload .upload-view-toggle .browse { + display: inline; +} + +.upload-theme, +.upload-plugin { + box-sizing: border-box; + display: none; + margin: 0; + padding: 50px 0; + width: 100%; + overflow: hidden; + position: relative; + top: 10px; +} + +.upload-plugin-wrap { + display: none; +} + +.show-upload-view .upload-theme, +.show-upload-view .upload-plugin, +.show-upload-view .upload-plugin-wrap, +.plugin-install-tab-upload .upload-plugin { + display: block; +} + +.upload-theme .wp-upload-form, +.upload-plugin .wp-upload-form { + background: #fafafa; + border: 1px solid #ccd0d4; + padding: 30px; + margin: 30px auto; + max-width: 380px; + display: flex; +} + +.upload-theme .wp-upload-form > input[type="file"], +.upload-plugin .wp-upload-form > input[type="file"] { + padding: 5px 1em 0 0; +} + +.upload-theme .install-help, +.upload-plugin .install-help { + color: #555d66; /* #f1f1f1 background */ + font-size: 18px; + font-style: normal; + margin: 0; + padding: 0; + text-align: center; +} + +p.no-themes, +p.no-themes-local { + clear: both; + color: #666; + font-size: 18px; + font-style: normal; + margin: 0; + padding: 100px 0; + text-align: center; + display: none; +} + +.no-results p.no-themes { + display: block; +} + +.theme-install-php .add-new-theme { + display: none !important; +} + +@media only screen and (max-width: 1120px) { + .upload-theme .wp-upload-form { + margin: 20px 0; + max-width: 100%; + } + .upload-theme .install-help { + font-size: 15px; + padding: 20px 0 0; + text-align: left; + } +} + +.theme-details .theme-rating { + line-height: 1.9; +} + +.theme-details .star-rating { + display: inline; +} + +.theme-details .num-ratings, +.theme-details .no-rating { + font-size: 11px; + color: #72777c; +} + +.theme-details .no-rating { + display: block; + line-height: 1.9; +} + +/*------------------------------------------------------------------------------ + 16.3 - Custom Header Screen +------------------------------------------------------------------------------*/ + +.appearance_page_custom-header #headimg { + border: 1px solid #ddd; + overflow: hidden; + width: 100%; +} + +.appearance_page_custom-header #upload-form p label { + font-size: 12px; +} + +.appearance_page_custom-header .available-headers .default-header { + float: left; + margin: 0 20px 20px 0; +} + +.appearance_page_custom-header .random-header { + clear: both; + margin: 0 20px 20px 0; + vertical-align: middle; +} + +.appearance_page_custom-header .available-headers label input, +.appearance_page_custom-header .random-header label input { + margin-right: 10px; +} + +.appearance_page_custom-header .available-headers label img { + vertical-align: middle; +} + + +/*------------------------------------------------------------------------------ + 16.4 - Custom Background Screen +------------------------------------------------------------------------------*/ + +div#custom-background-image { + min-height: 100px; + border: 1px solid #ddd; +} + +div#custom-background-image img { + max-width: 400px; + max-height: 300px; +} + +.background-position-control input[type="radio"]:checked ~ .button { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); + z-index: 1; +} + +.background-position-control input[type="radio"]:focus ~ .button { + border-color: #5b9dd9; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5), 0 0 3px rgba(0, 115, 170, 0.8); + color: #23282d; +} + +.background-position-control .background-position-center-icon, +.background-position-control .background-position-center-icon:before { + display: inline-block; + line-height: 1; + text-align: center; + transition: background-color .1s ease-in; +} + +.background-position-control .background-position-center-icon { + height: 20px; + margin-top: 13px; + vertical-align: top; + width: 20px; +} + +.background-position-control .background-position-center-icon:before { + background-color: #555; + border-radius: 50%; + content: ""; + height: 12px; + width: 12px; +} + +.background-position-control .button:hover .background-position-center-icon:before, +.background-position-control input[type="radio"]:focus ~ .button .background-position-center-icon:before { + background-color: #23282d; +} + +.background-position-control .button-group { + display: block; +} + +.background-position-control .button-group .button { + border-radius: 0; + box-shadow: none; + /* Following properties are overridden by buttons responsive styles (see: wp-includes/css/buttons.css). */ + height: 40px !important; + line-height: 2.9 !important; + margin: 0 -1px 0 0 !important; + padding: 0 10px 1px !important; + position: relative; +} + +.background-position-control .button-group .button:active, +.background-position-control .button-group .button:hover, +.background-position-control .button-group .button:focus { + z-index: 1; +} + +.background-position-control .button-group:last-child .button { + box-shadow: 0 1px 0 #ccc; +} + +.background-position-control .button-group > label { + margin: 0 !important; +} + +.background-position-control .button-group:first-child > label:first-child .button { + border-radius: 3px 0 0; +} + +.background-position-control .button-group:first-child > label:first-child .dashicons { + transform: rotate( 45deg ); +} + +.background-position-control .button-group:first-child > label:last-child .button { + border-radius: 0 3px 0 0; +} + +.background-position-control .button-group:first-child > label:last-child .dashicons { + transform: rotate( -45deg ); +} + +.background-position-control .button-group:last-child > label:first-child .button { + border-radius: 0 0 0 3px; +} + +.background-position-control .button-group:last-child > label:first-child .dashicons { + transform: rotate( -45deg ); +} + +.background-position-control .button-group:last-child > label:last-child .button { + border-radius: 0 0 3px 0; +} + +.background-position-control .button-group:last-child > label:last-child .dashicons { + transform: rotate( 45deg ); +} + +.background-position-control .button-group .dashicons { + margin-top: 9px; +} + +.background-position-control .button-group + .button-group { + margin-top: -1px; +} + +/*------------------------------------------------------------------------------ + 23.0 - Full Overlay w/ Sidebar +------------------------------------------------------------------------------*/ + +body.full-overlay-active { + overflow: hidden; + /* Hide all the content, the Customizer overlay is then made visible to be the only available content. */ + visibility: hidden; +} + +.wp-full-overlay { + background: transparent; + z-index: 500000; + position: fixed; + overflow: visible; + top: 0; + bottom: 0; + left: 0; + right: 0; + height: 100%; + min-width: 0; +} + +.wp-full-overlay-sidebar { + box-sizing: border-box; + position: fixed; + min-width: 300px; + max-width: 600px; + width: 18%; + height: 100%; + top: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + z-index: 10; + background: #eee; + border-right: none; +} + +.wp-full-overlay.collapsed .wp-full-overlay-sidebar { + overflow: visible; +} + +.wp-full-overlay.collapsed, +.wp-full-overlay.expanded .wp-full-overlay-sidebar { + margin-left: 0 !important; +} + +.wp-full-overlay.expanded { + margin-left: 300px; +} + +.wp-full-overlay.collapsed .wp-full-overlay-sidebar { + margin-left: -300px; +} + +@media screen and (min-width: 1667px) { + .wp-full-overlay.expanded { + margin-left: 18%; + } + + .wp-full-overlay.collapsed .wp-full-overlay-sidebar { + margin-left: -18%; + } +} + +@media screen and (min-width: 3333px) { + .wp-full-overlay.expanded { + margin-left: 600px; + } + + .wp-full-overlay.collapsed .wp-full-overlay-sidebar { + margin-left: -600px; + } +} + +.wp-full-overlay-sidebar:after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + right: 0; + width: 3px; + z-index: 1000; +} + +.wp-full-overlay-main { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + height: 100%; +} + +.wp-full-overlay-sidebar .wp-full-overlay-header { + position: absolute; + left: 0; + right: 0; + height: 45px; + padding: 0 15px; + line-height: 3.2; + z-index: 10; + margin: 0; + border-top: none; + box-shadow: none; +} + +.wp-full-overlay-sidebar .wp-full-overlay-header a.back { + margin-top: 9px; +} + +.wp-full-overlay-sidebar .wp-full-overlay-footer { + bottom: 0; + border-bottom: none; + border-top: none; + box-shadow: none; +} + +.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content { + position: absolute; + top: 45px; + bottom: 45px; + left: 0; + right: 0; + overflow: auto; +} + +/* Close & Navigation Links */ +.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header { + padding: 0; +} + +.theme-install-overlay .close-full-overlay, +.theme-install-overlay .previous-theme, +.theme-install-overlay .next-theme { + display: block; + position: relative; + float: left; + width: 45px; + height: 45px; + background: #eee; + border-right: 1px solid #ddd; + color: #444; + cursor: pointer; + text-decoration: none; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.theme-install-overlay .close-full-overlay:hover, +.theme-install-overlay .close-full-overlay:focus, +.theme-install-overlay .previous-theme:hover, +.theme-install-overlay .previous-theme:focus, +.theme-install-overlay .next-theme:hover, +.theme-install-overlay .next-theme:focus { + background: #ddd; + border-color: #ccc; + color: #000; + outline: none; + box-shadow: none; +} + +.theme-install-overlay .close-full-overlay:before { + font: normal 22px/1 dashicons; + content: "\f335"; + position: relative; + top: 7px; + left: 13px; +} + +.theme-install-overlay .previous-theme:before { + font: normal 20px/1 dashicons; + content: "\f341"; + position: relative; + top: 6px; + left: 14px; +} + +.theme-install-overlay .next-theme:before { + font: normal 20px/1 dashicons; + content: "\f345"; + position: relative; + top: 6px; + left: 13px; +} + +.theme-install-overlay .previous-theme.disabled, +.theme-install-overlay .next-theme.disabled, +.theme-install-overlay .previous-theme.disabled:hover, +.theme-install-overlay .previous-theme.disabled:focus, +.theme-install-overlay .next-theme.disabled:hover, +.theme-install-overlay .next-theme.disabled:focus { + color: #b4b9be; + background: #eee; + cursor: default; + pointer-events: none; +} + +.theme-install-overlay .close-full-overlay, +.theme-install-overlay .previous-theme, +.theme-install-overlay .next-theme { + border-left: 0; + border-top: 0; + border-bottom: 0; +} + +.theme-install-overlay .close-full-overlay:before, +.theme-install-overlay .previous-theme:before, +.theme-install-overlay .next-theme:before { + top: 2px; + left: 0; +} + +/* Collapse Button */ +.wp-core-ui .wp-full-overlay .collapse-sidebar { + position: fixed; + bottom: 0; + left: 0; + padding: 9px 0 9px 10px; + height: 45px; + color: #656a6f; + outline: 0; + line-height: 1; + background-color: transparent !important; + border: none !important; + box-shadow: none !important; + border-radius: 0 !important; +} + +.wp-core-ui .wp-full-overlay .collapse-sidebar:hover, +.wp-core-ui .wp-full-overlay .collapse-sidebar:focus { + color: #0073aa; +} + +.wp-full-overlay .collapse-sidebar-arrow, +.wp-full-overlay .collapse-sidebar-label { + display: inline-block; + vertical-align: middle; + line-height: 1.6; +} + +.wp-full-overlay .collapse-sidebar-arrow { + width: 20px; + height: 20px; + margin: 0 2px; /* avoid the focus box-shadow to be cut-off */ + border-radius: 50%; + overflow: hidden; +} + +.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow, +.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.wp-full-overlay .collapse-sidebar-label { + margin-left: 3px; +} + +.wp-full-overlay.collapsed .collapse-sidebar-label { + display: none; +} + +.wp-full-overlay .collapse-sidebar-arrow:before { + display: block; + content: "\f148"; + background: #eee; + font: normal 20px/1 dashicons; + speak: none; + padding: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar { + padding: 9px 10px; +} + +/* rtl:ignore */ +.wp-full-overlay.collapsed .collapse-sidebar-arrow:before, +.rtl .wp-full-overlay .collapse-sidebar-arrow:before { + transform: rotate(180.001deg); /* Firefox: promoting to its own layer to trigger anti-aliasing */ +} + +.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before { + transform: none; +} + +/* Animations */ +.wp-full-overlay, +.wp-full-overlay-sidebar, +.wp-full-overlay .collapse-sidebar, +.wp-full-overlay-main { + transition-property: left, right, top, bottom, width, margin; + transition-duration: 0.2s; +} + +/* Device/preview size toggles */ + +.wp-full-overlay { + background: #191e23; +} + +.wp-full-overlay-main { + background-color: #f1f1f1; +} + +.expanded .wp-full-overlay-footer { + position: fixed; + bottom: 0; + left: 0; + min-width: 299px; + max-width: 599px; + width: 18%; + width: calc( 18% - 1px ); + height: 45px; + border-top: 1px solid #ddd; + background: #eee; +} + +.wp-full-overlay-footer .devices-wrapper { + float: right; +} + +.wp-full-overlay-footer .devices { + position: relative; + background: #eee; + box-shadow: -20px 0 10px -5px #eee; +} + +.wp-full-overlay-footer .devices button { + cursor: pointer; + background: transparent; + border: none; + height: 45px; + padding: 0 3px; + margin: 0 0 0 -4px; + box-shadow: none; + border-top: 1px solid transparent; + border-bottom: 4px solid transparent; + transition: + .15s color ease-in-out, + .15s background-color ease-in-out, + .15s border-color ease-in-out; +} + +.wp-full-overlay-footer .devices button:focus { + box-shadow: none; + outline: none; +} + +.wp-full-overlay-footer .devices button:before { + display: inline-block; + -webkit-font-smoothing: antialiased; + font: normal 20px/30px "dashicons"; + vertical-align: top; + margin: 3px 0; + padding: 4px 8px; + color: #656a6f; +} + +.wp-full-overlay-footer .devices button.active { + border-bottom-color: #191e23; +} + +.wp-full-overlay-footer .devices button:hover, +.wp-full-overlay-footer .devices button:focus { + background-color: #fff; +} + +.wp-full-overlay-footer .devices button:focus, +.wp-full-overlay-footer .devices button.active:hover { + border-bottom-color: #0073aa; +} + +.wp-full-overlay-footer .devices button.active:before { + color: #191e23; +} + +.wp-full-overlay-footer .devices button:hover:before, +.wp-full-overlay-footer .devices button:focus:before { + color: #0073aa; +} + +.wp-full-overlay-footer .devices .preview-desktop:before { + content: "\f472"; +} + +.wp-full-overlay-footer .devices .preview-tablet:before { + content: "\f471"; +} + +.wp-full-overlay-footer .devices .preview-mobile:before { + content: "\f470"; +} + +@media screen and (max-width: 1024px) { + .wp-full-overlay-footer .devices { + display: none; + } +} + +.collapsed .wp-full-overlay-footer .devices button:before { + display: none; +} + +.preview-mobile .wp-full-overlay-main { + margin: auto 0 auto -160px; + width: 320px; + height: 480px; + max-height: 100%; + max-width: 100%; + left: 50%; +} + +.preview-tablet .wp-full-overlay-main { + margin: auto 0 auto -360px; + width: 720px; /* Size is loosely based on a typical "tablet" device size. Intentionally ambiguous - this does not represent any particular device precisely. */ + height: 1080px; + max-height: 100%; + max-width: 100%; + left: 50%; +} + + +/*------------------------------------------------------------------------------ + 24.0 - Customize Loader +------------------------------------------------------------------------------*/ + +.no-customize-support .hide-if-no-customize, +.customize-support .hide-if-customize, +.no-customize-support.wp-core-ui .hide-if-no-customize, +.no-customize-support .wp-core-ui .hide-if-no-customize, +.customize-support.wp-core-ui .hide-if-customize, +.customize-support .wp-core-ui .hide-if-customize { + display: none; +} + +#customize-container, +#customize-controls .notice.notification-overlay { + background: #eee; + z-index: 500000; + position: fixed; + overflow: visible; + top: 0; + bottom: 0; + left: 0; + right: 0; + height: 100%; +} +#customize-container { + display: none; +} + +/* Make the Customizer and Theme installer overlays the only available content. */ +#customize-container, +.theme-install-overlay { + visibility: visible; +} + +.customize-loading #customize-container iframe { + opacity: 0; +} + +#customize-container iframe, +.theme-install-overlay iframe { + height: 100%; + width: 100%; + z-index: 20; + transition: opacity 0.3s; +} + +#customize-controls { + margin-top: 0; +} + +.theme-install-overlay { + display: none; +} + +.theme-install-overlay.single-theme { + display: block; +} + +.install-theme-info { + display: none; + padding: 10px 20px 60px; +} + +.single-theme .install-theme-info { + padding-top: 15px; +} + +.theme-install-overlay .install-theme-info { + display: block; +} + +.install-theme-info .theme-install { + float: right; + margin-top: 18px; +} + +.install-theme-info .theme-name { + font-size: 16px; + line-height: 1.5; + margin-bottom: 0; + margin-top: 0; +} + +.install-theme-info .theme-screenshot { + margin: 15px 0; + width: 258px; + border: 1px solid #ccc; +} + +.install-theme-info .theme-details { + overflow: hidden; +} + +.theme-details .theme-version { + margin: 15px 0; +} + +.theme-details .theme-description { + float: left; + color: #72777c; + line-height: 1.6; + max-width: 100%; +} + +.theme-install-overlay .wp-full-overlay-header .button { + float: right; + margin: 8px 10px 0 0; + /* For when .theme-install is a span rather than a.button-primary (already installed theme) */ + line-height: 2; +} + +.theme-install-overlay .wp-full-overlay-sidebar { + background: #eee; + border-right: 1px solid #ddd; +} + +.theme-install-overlay .wp-full-overlay-sidebar-content { + background: #fff; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +.theme-install-overlay .wp-full-overlay-main { + position: absolute; + z-index: 0; + background-color: #f1f1f1; +} + +.customize-loading #customize-container { + background-color: #f1f1f1; +} + +#customize-preview.wp-full-overlay-main:before, +.customize-loading #customize-container:before, +#customize-controls .notice.notification-overlay.notification-loading:before, +.theme-install-overlay .wp-full-overlay-main:before { + content: ""; + display: block; + width: 20px; + height: 20px; + position: absolute; + left: 50%; + top: 50%; + z-index: -1; + margin: -10px 0 0 -10px; + transform: translateZ(0); + background: transparent url(../images/spinner.gif) no-repeat center center; + background-size: 20px 20px; +} + +#customize-preview.wp-full-overlay-main.iframe-ready:before, +.theme-install-overlay.iframe-ready .wp-full-overlay-main:before { + background-image: none; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + .wp-full-overlay .collapse-sidebar-arrow { + background-image: url(../images/arrows-2x.png); + background-size: 15px 123px; + } + + #customize-preview.wp-full-overlay-main:before, + .customize-loading #customize-container:before, + #customize-controls .notice.notification-overlay.notification-loading:before, + .theme-install-overlay .wp-full-overlay-main:before { + background-image: url(../images/spinner-2x.gif); + } +} + +@media screen and (max-width: 782px) { + .available-theme .action-links .delete-theme { + float: none; + margin: 0; + padding: 0; + clear: both; + } + + .available-theme .action-links .delete-theme a { + padding: 0; + } + + .broken-themes table { + width: 100%; + } + + .theme-install-overlay .wp-full-overlay-header .theme-install { + margin-top: 6px; + line-height: normal; + } + + .theme-browser .theme .theme-actions .button { + margin-bottom: 0; + } + + .theme-browser .theme.active .theme-actions, + .theme-browser .theme .theme-actions { + padding-top: 4px; + padding-bottom: 4px; + } +} + +@media aural { + .theme .notice:before, + .theme-info .updating-message:before, + .theme-info .updated-message:before, + .theme-install.updating-message:before { + speak: none; + } +} diff --git a/wp-admin/css/themes.min.css b/wp-admin/css/themes.min.css new file mode 100644 index 0000000..6b58e60 --- /dev/null +++ b/wp-admin/css/themes.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body.js .theme-browser.search-loading{display:none}.theme-browser .themes{clear:both}.themes-php:not(.network-admin) .wrap h1{margin-bottom:15px}.themes-php .wrap h1 .button{margin-left:20px}.themes-php .search-form{display:inline}.themes-php .wp-filter-search{position:relative;top:-2px;left:20px;margin:0;width:280px}.theme .notice,.theme .notice.is-dismissible{left:0;margin:0;position:absolute;right:0;top:0}.theme-browser .theme{cursor:pointer;float:left;margin:0 4% 4% 0;position:relative;width:30.6%;border:1px solid #ddd;box-shadow:0 1px 1px -1px rgba(0,0,0,.1);box-sizing:border-box}.ie8 .theme-browser .theme{width:30%;margin:0 3% 4% 0}.theme-browser .theme:nth-child(3n){margin-right:0}.theme-browser .theme:focus,.theme-browser .theme:hover{cursor:pointer}.theme-browser .theme .theme-name{font-size:15px;font-weight:600;height:18px;margin:0;padding:15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;background:#fff;background:rgba(255,255,255,.65)}.theme-browser .theme .theme-actions{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;transition:opacity .1s ease-in-out;height:auto;background:rgba(244,244,244,.7);border-left:1px solid rgba(0,0,0,.05)}.theme-browser .theme.focus .theme-actions,.theme-browser .theme:focus .theme-actions,.theme-browser .theme:hover .theme-actions{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1}.theme-browser .theme .theme-actions .button-primary{margin-right:3px}.theme-browser .theme .theme-actions .button{float:none;margin-left:3px}.theme-browser .theme .theme-screenshot{display:block;overflow:hidden;position:relative;-webkit-backface-visibility:hidden;transition:opacity .2s ease-in-out}.theme-browser .theme .theme-screenshot:after{content:"";display:block;padding-top:66.66666%}.theme-browser .theme .theme-screenshot img{height:auto;position:absolute;left:0;top:0;width:100%;transition:opacity .2s ease-in-out}.theme-browser .theme:focus .theme-screenshot,.theme-browser .theme:hover .theme-screenshot{background:#fff}.theme-browser.rendered .theme:focus .theme-screenshot img,.theme-browser.rendered .theme:hover .theme-screenshot img{opacity:.4}.theme-browser .theme .more-details{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;position:absolute;top:35%;right:20%;left:20%;background:#23282d;background:rgba(0,0,0,.7);color:#fff;font-size:15px;text-shadow:0 1px 0 rgba(0,0,0,.6);-webkit-font-smoothing:antialiased;font-weight:600;padding:15px 12px;text-align:center;border-radius:3px;transition:opacity .1s ease-in-out}.theme-browser .theme:focus{border-color:#5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8)}.theme-browser .theme:focus .more-details{opacity:1}.theme-browser .theme.active:focus .theme-actions{display:block}.theme-browser.rendered .theme:focus .more-details,.theme-browser.rendered .theme:hover .more-details{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1}.theme-browser .theme.active .theme-name{background:#23282d;color:#fff;padding-right:110px;font-weight:300;box-shadow:inset 0 1px 1px rgba(0,0,0,.5)}.theme-browser .customize-control .theme.active .theme-name{padding-right:15px}.theme-browser .theme.active .theme-name span{font-weight:600}.theme-browser .theme.active .theme-actions{background:rgba(49,49,49,.7);border-left:none;opacity:1}.theme-id-container{position:relative}.theme-browser .theme .theme-actions,.theme-browser .theme.active .theme-actions{position:absolute;top:50%;transform:translateY(-50%);right:0;padding:9px 15px;box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}.theme-browser .theme.active .theme-actions .button-primary{margin-right:0}.theme-browser .theme .theme-author{background:#23282d;color:#eee;display:none;font-size:14px;margin:0 10px;padding:5px 10px;position:absolute;bottom:56px}.theme-browser .theme.display-author .theme-author{display:block}.theme-browser .theme.display-author .theme-author a{color:inherit;text-decoration:none}.theme-browser .theme.add-new-theme{border:none;box-shadow:none}.theme-browser .theme.add-new-theme a{text-decoration:none;display:block;position:relative;z-index:1}.theme-browser .theme.add-new-theme a:after{display:block;content:"";background:0 0;background:rgba(0,0,0,0);position:absolute;top:0;left:0;right:0;bottom:0;padding:0;text-shadow:none;border:5px dashed #d5d2ca;border:5px dashed rgba(0,0,0,.1);box-sizing:border-box}.theme-browser .theme.add-new-theme span:after{background:#e5e5e5;background:rgba(153,153,153,.1);border-radius:50%;display:inline-block;content:"\f132";-webkit-font-smoothing:antialiased;font:normal 74px/115px dashicons;width:100px;height:100px;vertical-align:middle;text-align:center;color:#999;position:absolute;top:30%;left:50%;margin-left:-50px;text-indent:-4px;padding:0;text-shadow:none;z-index:4}.rtl .theme-browser .theme.add-new-theme span:after{text-indent:4px}.theme-browser .theme.add-new-theme a:focus .theme-screenshot,.theme-browser .theme.add-new-theme a:hover .theme-screenshot{background:0 0}.theme-browser .theme.add-new-theme a:focus span:after,.theme-browser .theme.add-new-theme a:hover span:after{background:#fff;color:#0073aa}.theme-browser .theme.add-new-theme a:focus:after,.theme-browser .theme.add-new-theme a:hover:after{border-color:transparent;color:#fff;background:#0073aa;content:""}.theme-browser .theme.add-new-theme .theme-name{background:0 0;text-align:center;box-shadow:none;font-weight:400;position:relative;top:0;margin-top:-18px;padding-top:0;padding-bottom:48px}.theme-browser .theme.add-new-theme a:focus .theme-name,.theme-browser .theme.add-new-theme a:hover .theme-name{color:#fff;z-index:2}.theme-overlay .theme-backdrop{position:absolute;left:-20px;right:0;top:0;bottom:0;background:#f1f1f1;background:rgba(238,238,238,.9);z-index:10000}.theme-overlay .theme-header{position:absolute;top:0;left:0;right:0;height:48px;border-bottom:1px solid #ddd}.theme-overlay .theme-header button{padding:0}.theme-overlay .theme-header .close{cursor:pointer;height:48px;width:50px;text-align:center;float:right;border:0;border-left:1px solid #ddd;background-color:transparent;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-overlay .theme-header .close:before{font:normal 22px/50px dashicons!important;color:#72777c;display:inline-block;content:"\f335";font-weight:300}.theme-overlay .theme-header .left,.theme-overlay .theme-header .right{cursor:pointer;color:#72777c;background-color:transparent;height:48px;width:54px;float:left;text-align:center;border:0;border-right:1px solid #ddd;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-overlay .theme-header .close:focus,.theme-overlay .theme-header .close:hover,.theme-overlay .theme-header .left:focus,.theme-overlay .theme-header .left:hover,.theme-overlay .theme-header .right:focus,.theme-overlay .theme-header .right:hover{background:#ddd;border-color:#ccc;color:#000}.theme-overlay .theme-header .close:focus:before,.theme-overlay .theme-header .close:hover:before{color:#000}.theme-overlay .theme-header .close:focus,.theme-overlay .theme-header .left:focus,.theme-overlay .theme-header .right:focus{box-shadow:none;outline:0}.theme-overlay .theme-header .left.disabled,.theme-overlay .theme-header .left.disabled:hover,.theme-overlay .theme-header .right.disabled,.theme-overlay .theme-header .right.disabled:hover{color:#ccc;background:inherit;cursor:inherit}.theme-overlay .theme-header .left:before,.theme-overlay .theme-header .right:before{font:normal 20px/50px dashicons!important;display:inline;font-weight:300}.theme-overlay .theme-header .left:before{content:"\f341"}.theme-overlay .theme-header .right:before{content:"\f345"}.theme-overlay .theme-wrap{clear:both;position:fixed;top:9%;left:190px;right:30px;bottom:3%;background:#fff;box-shadow:0 1px 20px 5px rgba(0,0,0,.1);z-index:10000;box-sizing:border-box;-webkit-overflow-scrolling:touch}body.folded .theme-browser~.theme-overlay .theme-wrap{left:70px}.theme-overlay .theme-about{position:absolute;top:49px;bottom:57px;left:0;right:0;overflow:auto;padding:2% 4%}.theme-overlay .theme-actions{position:absolute;text-align:center;bottom:0;left:0;right:0;padding:10px 25px 5px;background:#f3f3f3;z-index:30;box-sizing:border-box;border-top:1px solid #eee}.ie8 .theme-overlay .theme-actions{border:1px solid #eee}.theme-overlay .theme-actions a{margin-right:5px;margin-bottom:5px}.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-background"],.customize-support .theme-overlay .theme-actions a[href="themes.php?page=custom-header"]{display:none}.broken-themes a.delete-theme,.theme-overlay .theme-actions .delete-theme{color:#a00;text-decoration:none;border-color:transparent;box-shadow:none;background:0 0}.theme-overlay .theme-actions .delete-theme{position:absolute;right:10px;bottom:5px}.broken-themes a.delete-theme:focus,.broken-themes a.delete-theme:hover,.theme-overlay .theme-actions .delete-theme:focus,.theme-overlay .theme-actions .delete-theme:hover{background:#d54e21;color:#fff;border-color:#d54e21}.theme-overlay .theme-actions .active-theme,.theme-overlay.active .theme-actions .inactive-theme{display:none}.theme-overlay .theme-actions .inactive-theme,.theme-overlay.active .theme-actions .active-theme{display:block}.theme-overlay .theme-screenshots{float:left;margin:0 30px 0 0;width:55%;max-width:1200px;text-align:center}.theme-overlay .screenshot{border:1px solid #fff;box-sizing:border-box;overflow:hidden;position:relative;box-shadow:0 0 0 1px rgba(0,0,0,.2)}.theme-overlay .screenshot:after{content:"";display:block;padding-top:75%}.theme-overlay .screenshot img{height:auto;position:absolute;left:0;top:0;width:100%}.theme-overlay.small-screenshot .theme-screenshots{position:absolute;width:302px}.theme-overlay.small-screenshot .theme-info{margin-left:350px;width:auto}.theme-overlay .screenshot.thumb{background:#ccc;border:1px solid #eee;float:none;display:inline-block;margin:10px 5px 0;width:140px;height:80px;cursor:pointer}.theme-overlay .screenshot.thumb:after{content:"";display:block;padding-top:100%}.theme-overlay .screenshot.thumb img{cursor:pointer;height:auto;position:absolute;left:0;top:0;width:100%;height:auto}.theme-overlay .screenshot.selected{background:0 0;border:2px solid #00a0d2}.theme-overlay .screenshot.selected img{opacity:.8}.theme-browser .theme .theme-screenshot.blank,.theme-overlay .screenshot.blank{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=)}.theme-overlay .theme-info{width:40%;float:left}.theme-overlay .current-label{background:#32373c;color:#fff;font-size:11px;display:inline-block;padding:2px 8px;border-radius:2px;margin:0 0 -10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.theme-overlay .theme-name{color:#23282d;font-size:32px;font-weight:100;margin:10px 0 0;line-height:1.3;word-wrap:break-word;overflow-wrap:break-word}.theme-overlay .theme-version{color:#72777c;font-size:13px;font-weight:400;float:none;display:inline-block;margin-left:10px}.theme-overlay .theme-author{margin:15px 0 25px;color:#72777c;font-size:16px;font-weight:400;line-height:inherit}.theme-overlay .theme-author a{text-decoration:none}.theme-overlay .theme-description{color:#555;font-size:15px;font-weight:400;line-height:1.5;margin:30px 0 0 0}.theme-overlay .theme-tags{border-top:3px solid #eee;color:#82878c;font-size:13px;font-weight:400;margin:30px 0 0 0;padding-top:20px}.theme-overlay .theme-tags span{color:#444;font-weight:600;margin-right:5px}.theme-overlay .parent-theme{background:#f7fcfe;border:1px solid #eee;border-left:4px solid #00a0d2;font-size:14px;font-weight:400;margin-top:30px;padding:10px 10px 10px 20px}.theme-overlay .parent-theme strong{font-weight:600}.single-theme .theme,.single-theme .theme-overlay .theme-backdrop,.single-theme .theme-overlay .theme-header{display:none}.single-theme .theme-overlay .theme-wrap{clear:both;min-height:330px;position:relative;left:auto;right:auto;top:auto;bottom:auto;z-index:10}.single-theme .theme-overlay .theme-about{padding:30px 30px 70px;position:static}.single-theme .theme-overlay .theme-actions{position:absolute}@media only screen and (min-width:2000px){#wpwrap .theme-browser .theme{width:17.6%;margin:0 3% 3% 0}#wpwrap .theme-browser .theme:nth-child(3n),#wpwrap .theme-browser .theme:nth-child(4n){margin-right:3%}#wpwrap .theme-browser .theme:nth-child(5n){margin-right:0}}@media only screen and (min-width:1680px){.theme-overlay .theme-wrap{width:1450px;margin:0 auto}}@media only screen and (min-width:1640px){.theme-browser .theme{width:22.7%;margin:0 3% 3% 0}.theme-browser .theme .theme-screenshot:after{padding-top:75%}.theme-browser .theme:nth-child(3n){margin-right:3%}.theme-browser .theme:nth-child(4n){margin-right:0}}@media only screen and (max-width:1120px){.theme-browser .theme{width:47.5%;margin-right:0}.theme-browser .theme:nth-child(even){margin-right:0}.theme-browser .theme:nth-child(odd){margin-right:5%}}@media only screen and (max-width:960px){.theme-overlay .theme-wrap{left:65px}}@media only screen and (max-width:780px){.theme-overlay .theme-wrap,body.folded .theme-overlay .theme-wrap{top:0;right:0;bottom:0;left:0;padding:70px 20px 20px;border:none;z-index:100000;position:fixed}.theme-browser .theme.active .theme-name span{display:none}.theme-overlay .theme-screenshots{width:40%}.theme-overlay .theme-info{width:50%}.single-theme .theme-wrap{padding:10px}.theme-browser .theme .theme-actions{padding:5px 10px 4px 10px}.theme-overlay.small-screenshot .theme-screenshots{position:static;float:none;max-width:302px}.theme-overlay.small-screenshot .theme-info{margin-left:0;width:auto}.theme:focus .more-details,.theme:hover .more-details,.theme:not(.active):focus .theme-actions,.theme:not(.active):hover .theme-actions{display:none}.theme-browser.rendered .theme:focus .theme-screenshot img,.theme-browser.rendered .theme:hover .theme-screenshot img{opacity:1}}@media only screen and (max-width:480px){.theme-browser .theme{width:100%;margin-right:0}.theme-browser .theme:nth-child(2n),.theme-browser .theme:nth-child(3n){margin-right:0}}@media only screen and (max-width:650px){.theme-overlay .theme-description{margin-left:0}.theme-overlay .theme-actions .delete-theme{position:relative;right:auto;bottom:auto}.theme-overlay .theme-actions .inactive-theme{display:inline}.theme-overlay .theme-screenshots{width:100%;float:none}.theme-overlay .theme-info{width:100%}.theme-overlay .theme-author{margin:5px 0 15px 0}.theme-overlay .current-label{margin-top:10px;font-size:13px}.themes-php .wp-filter-search{float:none;clear:both;left:0;right:0;margin:-5px 0 20px 0;width:100%;max-width:280px}.theme-browser .theme.add-new-theme span:after{font:normal 60px/90px dashicons;width:80px;height:80px;top:30%;left:50%;text-indent:0;margin-left:-40px}.single-theme .theme-wrap{margin:0 -12px 0 -10px;padding:10px}.single-theme .theme-overlay .theme-about{padding:10px;overflow:visible}.single-theme .current-label{display:none}.single-theme .theme-overlay .theme-actions{position:static}}.broken-themes{clear:both}.broken-themes table{text-align:left;width:50%;border-spacing:3px;padding:3px}.theme-browser .theme .theme-installed{background:#0073aa}.theme-browser .theme .notice-success p:before{color:#79ba49;content:"\f147";display:inline-block;font:normal 20px/1 dashicons;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top}.theme-install.updated-message:before{content:""}.theme-install-php .wp-filter{padding-left:20px}.theme-install-php a.browse-themes,.theme-install-php a.upload{cursor:pointer}.plugin-install-tab-upload .upload-view-toggle .upload,.upload-view-toggle .browse{display:none}.plugin-install-tab-upload .upload-view-toggle .browse{display:inline}.upload-plugin,.upload-theme{box-sizing:border-box;display:none;margin:0;padding:50px 0;width:100%;overflow:hidden;position:relative;top:10px}.upload-plugin-wrap{display:none}.plugin-install-tab-upload .upload-plugin,.show-upload-view .upload-plugin,.show-upload-view .upload-plugin-wrap,.show-upload-view .upload-theme{display:block}.upload-plugin .wp-upload-form,.upload-theme .wp-upload-form{background:#fafafa;border:1px solid #ccd0d4;padding:30px;margin:30px auto;max-width:380px;display:flex}.upload-plugin .wp-upload-form>input[type=file],.upload-theme .wp-upload-form>input[type=file]{padding:5px 1em 0 0}.upload-plugin .install-help,.upload-theme .install-help{color:#555d66;font-size:18px;font-style:normal;margin:0;padding:0;text-align:center}p.no-themes,p.no-themes-local{clear:both;color:#666;font-size:18px;font-style:normal;margin:0;padding:100px 0;text-align:center;display:none}.no-results p.no-themes{display:block}.theme-install-php .add-new-theme{display:none!important}@media only screen and (max-width:1120px){.upload-theme .wp-upload-form{margin:20px 0;max-width:100%}.upload-theme .install-help{font-size:15px;padding:20px 0 0;text-align:left}}.theme-details .theme-rating{line-height:1.9}.theme-details .star-rating{display:inline}.theme-details .no-rating,.theme-details .num-ratings{font-size:11px;color:#72777c}.theme-details .no-rating{display:block;line-height:1.9}.appearance_page_custom-header #headimg{border:1px solid #ddd;overflow:hidden;width:100%}.appearance_page_custom-header #upload-form p label{font-size:12px}.appearance_page_custom-header .available-headers .default-header{float:left;margin:0 20px 20px 0}.appearance_page_custom-header .random-header{clear:both;margin:0 20px 20px 0;vertical-align:middle}.appearance_page_custom-header .available-headers label input,.appearance_page_custom-header .random-header label input{margin-right:10px}.appearance_page_custom-header .available-headers label img{vertical-align:middle}div#custom-background-image{min-height:100px;border:1px solid #ddd}div#custom-background-image img{max-width:400px;max-height:300px}.background-position-control input[type=radio]:checked~.button{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);z-index:1}.background-position-control input[type=radio]:focus~.button{border-color:#5b9dd9;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 3px rgba(0,115,170,.8);color:#23282d}.background-position-control .background-position-center-icon,.background-position-control .background-position-center-icon:before{display:inline-block;line-height:1;text-align:center;transition:background-color .1s ease-in}.background-position-control .background-position-center-icon{height:20px;margin-top:13px;vertical-align:top;width:20px}.background-position-control .background-position-center-icon:before{background-color:#555;border-radius:50%;content:"";height:12px;width:12px}.background-position-control .button:hover .background-position-center-icon:before,.background-position-control input[type=radio]:focus~.button .background-position-center-icon:before{background-color:#23282d}.background-position-control .button-group{display:block}.background-position-control .button-group .button{border-radius:0;box-shadow:none;height:40px!important;line-height:2.9!important;margin:0 -1px 0 0!important;padding:0 10px 1px!important;position:relative}.background-position-control .button-group .button:active,.background-position-control .button-group .button:focus,.background-position-control .button-group .button:hover{z-index:1}.background-position-control .button-group:last-child .button{box-shadow:0 1px 0 #ccc}.background-position-control .button-group>label{margin:0!important}.background-position-control .button-group:first-child>label:first-child .button{border-radius:3px 0 0}.background-position-control .button-group:first-child>label:first-child .dashicons{transform:rotate(45deg)}.background-position-control .button-group:first-child>label:last-child .button{border-radius:0 3px 0 0}.background-position-control .button-group:first-child>label:last-child .dashicons{transform:rotate(-45deg)}.background-position-control .button-group:last-child>label:first-child .button{border-radius:0 0 0 3px}.background-position-control .button-group:last-child>label:first-child .dashicons{transform:rotate(-45deg)}.background-position-control .button-group:last-child>label:last-child .button{border-radius:0 0 3px 0}.background-position-control .button-group:last-child>label:last-child .dashicons{transform:rotate(45deg)}.background-position-control .button-group .dashicons{margin-top:9px}.background-position-control .button-group+.button-group{margin-top:-1px}body.full-overlay-active{overflow:hidden;visibility:hidden}.wp-full-overlay{background:0 0;z-index:500000;position:fixed;overflow:visible;top:0;bottom:0;left:0;right:0;height:100%;min-width:0}.wp-full-overlay-sidebar{box-sizing:border-box;position:fixed;min-width:300px;max-width:600px;width:18%;height:100%;top:0;bottom:0;left:0;padding:0;margin:0;z-index:10;background:#eee;border-right:none}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{overflow:visible}.wp-full-overlay.collapsed,.wp-full-overlay.expanded .wp-full-overlay-sidebar{margin-left:0!important}.wp-full-overlay.expanded{margin-left:300px}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-left:-300px}@media screen and (min-width:1667px){.wp-full-overlay.expanded{margin-left:18%}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-left:-18%}}@media screen and (min-width:3333px){.wp-full-overlay.expanded{margin-left:600px}.wp-full-overlay.collapsed .wp-full-overlay-sidebar{margin-left:-600px}}.wp-full-overlay-sidebar:after{content:"";display:block;position:absolute;top:0;bottom:0;right:0;width:3px;z-index:1000}.wp-full-overlay-main{position:absolute;left:0;right:0;top:0;bottom:0;height:100%}.wp-full-overlay-sidebar .wp-full-overlay-header{position:absolute;left:0;right:0;height:45px;padding:0 15px;line-height:3.2;z-index:10;margin:0;border-top:none;box-shadow:none}.wp-full-overlay-sidebar .wp-full-overlay-header a.back{margin-top:9px}.wp-full-overlay-sidebar .wp-full-overlay-footer{bottom:0;border-bottom:none;border-top:none;box-shadow:none}.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content{position:absolute;top:45px;bottom:45px;left:0;right:0;overflow:auto}.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header{padding:0}.theme-install-overlay .close-full-overlay,.theme-install-overlay .next-theme,.theme-install-overlay .previous-theme{display:block;position:relative;float:left;width:45px;height:45px;background:#eee;border-right:1px solid #ddd;color:#444;cursor:pointer;text-decoration:none;transition:color .1s ease-in-out,background .1s ease-in-out}.theme-install-overlay .close-full-overlay:focus,.theme-install-overlay .close-full-overlay:hover,.theme-install-overlay .next-theme:focus,.theme-install-overlay .next-theme:hover,.theme-install-overlay .previous-theme:focus,.theme-install-overlay .previous-theme:hover{background:#ddd;border-color:#ccc;color:#000;outline:0;box-shadow:none}.theme-install-overlay .close-full-overlay:before{font:normal 22px/1 dashicons;content:"\f335";position:relative;top:7px;left:13px}.theme-install-overlay .previous-theme:before{font:normal 20px/1 dashicons;content:"\f341";position:relative;top:6px;left:14px}.theme-install-overlay .next-theme:before{font:normal 20px/1 dashicons;content:"\f345";position:relative;top:6px;left:13px}.theme-install-overlay .next-theme.disabled,.theme-install-overlay .next-theme.disabled:focus,.theme-install-overlay .next-theme.disabled:hover,.theme-install-overlay .previous-theme.disabled,.theme-install-overlay .previous-theme.disabled:focus,.theme-install-overlay .previous-theme.disabled:hover{color:#b4b9be;background:#eee;cursor:default;pointer-events:none}.theme-install-overlay .close-full-overlay,.theme-install-overlay .next-theme,.theme-install-overlay .previous-theme{border-left:0;border-top:0;border-bottom:0}.theme-install-overlay .close-full-overlay:before,.theme-install-overlay .next-theme:before,.theme-install-overlay .previous-theme:before{top:2px;left:0}.wp-core-ui .wp-full-overlay .collapse-sidebar{position:fixed;bottom:0;left:0;padding:9px 0 9px 10px;height:45px;color:#656a6f;outline:0;line-height:1;background-color:transparent!important;border:none!important;box-shadow:none!important;border-radius:0!important}.wp-core-ui .wp-full-overlay .collapse-sidebar:focus,.wp-core-ui .wp-full-overlay .collapse-sidebar:hover{color:#0073aa}.wp-full-overlay .collapse-sidebar-arrow,.wp-full-overlay .collapse-sidebar-label{display:inline-block;vertical-align:middle;line-height:1.6}.wp-full-overlay .collapse-sidebar-arrow{width:20px;height:20px;margin:0 2px;border-radius:50%;overflow:hidden}.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow,.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.wp-full-overlay .collapse-sidebar-label{margin-left:3px}.wp-full-overlay.collapsed .collapse-sidebar-label{display:none}.wp-full-overlay .collapse-sidebar-arrow:before{display:block;content:"\f148";background:#eee;font:normal 20px/1 dashicons;speak:none;padding:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-core-ui .wp-full-overlay.collapsed .collapse-sidebar{padding:9px 10px}.rtl .wp-full-overlay .collapse-sidebar-arrow:before,.wp-full-overlay.collapsed .collapse-sidebar-arrow:before{transform:rotate(180.001deg)}.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before{transform:none}.wp-full-overlay,.wp-full-overlay .collapse-sidebar,.wp-full-overlay-main,.wp-full-overlay-sidebar{transition-property:left,right,top,bottom,width,margin;transition-duration:.2s}.wp-full-overlay{background:#191e23}.wp-full-overlay-main{background-color:#f1f1f1}.expanded .wp-full-overlay-footer{position:fixed;bottom:0;left:0;min-width:299px;max-width:599px;width:18%;width:calc(18% - 1px);height:45px;border-top:1px solid #ddd;background:#eee}.wp-full-overlay-footer .devices-wrapper{float:right}.wp-full-overlay-footer .devices{position:relative;background:#eee;box-shadow:-20px 0 10px -5px #eee}.wp-full-overlay-footer .devices button{cursor:pointer;background:0 0;border:none;height:45px;padding:0 3px;margin:0 0 0 -4px;box-shadow:none;border-top:1px solid transparent;border-bottom:4px solid transparent;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.wp-full-overlay-footer .devices button:focus{box-shadow:none;outline:0}.wp-full-overlay-footer .devices button:before{display:inline-block;-webkit-font-smoothing:antialiased;font:normal 20px/30px dashicons;vertical-align:top;margin:3px 0;padding:4px 8px;color:#656a6f}.wp-full-overlay-footer .devices button.active{border-bottom-color:#191e23}.wp-full-overlay-footer .devices button:focus,.wp-full-overlay-footer .devices button:hover{background-color:#fff}.wp-full-overlay-footer .devices button.active:hover,.wp-full-overlay-footer .devices button:focus{border-bottom-color:#0073aa}.wp-full-overlay-footer .devices button.active:before{color:#191e23}.wp-full-overlay-footer .devices button:focus:before,.wp-full-overlay-footer .devices button:hover:before{color:#0073aa}.wp-full-overlay-footer .devices .preview-desktop:before{content:"\f472"}.wp-full-overlay-footer .devices .preview-tablet:before{content:"\f471"}.wp-full-overlay-footer .devices .preview-mobile:before{content:"\f470"}@media screen and (max-width:1024px){.wp-full-overlay-footer .devices{display:none}}.collapsed .wp-full-overlay-footer .devices button:before{display:none}.preview-mobile .wp-full-overlay-main{margin:auto 0 auto -160px;width:320px;height:480px;max-height:100%;max-width:100%;left:50%}.preview-tablet .wp-full-overlay-main{margin:auto 0 auto -360px;width:720px;height:1080px;max-height:100%;max-width:100%;left:50%}.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#customize-container,#customize-controls .notice.notification-overlay{background:#eee;z-index:500000;position:fixed;overflow:visible;top:0;bottom:0;left:0;right:0;height:100%}#customize-container{display:none}#customize-container,.theme-install-overlay{visibility:visible}.customize-loading #customize-container iframe{opacity:0}#customize-container iframe,.theme-install-overlay iframe{height:100%;width:100%;z-index:20;transition:opacity .3s}#customize-controls{margin-top:0}.theme-install-overlay{display:none}.theme-install-overlay.single-theme{display:block}.install-theme-info{display:none;padding:10px 20px 60px}.single-theme .install-theme-info{padding-top:15px}.theme-install-overlay .install-theme-info{display:block}.install-theme-info .theme-install{float:right;margin-top:18px}.install-theme-info .theme-name{font-size:16px;line-height:1.5;margin-bottom:0;margin-top:0}.install-theme-info .theme-screenshot{margin:15px 0;width:258px;border:1px solid #ccc}.install-theme-info .theme-details{overflow:hidden}.theme-details .theme-version{margin:15px 0}.theme-details .theme-description{float:left;color:#72777c;line-height:1.6;max-width:100%}.theme-install-overlay .wp-full-overlay-header .button{float:right;margin:8px 10px 0 0;line-height:2}.theme-install-overlay .wp-full-overlay-sidebar{background:#eee;border-right:1px solid #ddd}.theme-install-overlay .wp-full-overlay-sidebar-content{background:#fff;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.theme-install-overlay .wp-full-overlay-main{position:absolute;z-index:0;background-color:#f1f1f1}.customize-loading #customize-container{background-color:#f1f1f1}#customize-controls .notice.notification-overlay.notification-loading:before,#customize-preview.wp-full-overlay-main:before,.customize-loading #customize-container:before,.theme-install-overlay .wp-full-overlay-main:before{content:"";display:block;width:20px;height:20px;position:absolute;left:50%;top:50%;z-index:-1;margin:-10px 0 0 -10px;transform:translateZ(0);background:transparent url(../images/spinner.gif) no-repeat center center;background-size:20px 20px}#customize-preview.wp-full-overlay-main.iframe-ready:before,.theme-install-overlay.iframe-ready .wp-full-overlay-main:before{background-image:none}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-full-overlay .collapse-sidebar-arrow{background-image:url(../images/arrows-2x.png);background-size:15px 123px}#customize-controls .notice.notification-overlay.notification-loading:before,#customize-preview.wp-full-overlay-main:before,.customize-loading #customize-container:before,.theme-install-overlay .wp-full-overlay-main:before{background-image:url(../images/spinner-2x.gif)}}@media screen and (max-width:782px){.available-theme .action-links .delete-theme{float:none;margin:0;padding:0;clear:both}.available-theme .action-links .delete-theme a{padding:0}.broken-themes table{width:100%}.theme-install-overlay .wp-full-overlay-header .theme-install{margin-top:6px;line-height:normal}.theme-browser .theme .theme-actions .button{margin-bottom:0}.theme-browser .theme .theme-actions,.theme-browser .theme.active .theme-actions{padding-top:4px;padding-bottom:4px}}@media aural{.theme .notice:before,.theme-info .updated-message:before,.theme-info .updating-message:before,.theme-install.updating-message:before{speak:none}} \ No newline at end of file diff --git a/wp-admin/css/widgets-rtl.css b/wp-admin/css/widgets-rtl.css new file mode 100644 index 0000000..1ab8630 --- /dev/null +++ b/wp-admin/css/widgets-rtl.css @@ -0,0 +1,866 @@ +/*! This file is auto-generated */ +/* General Widgets Styles */ + +.widget { + margin: 0 auto 10px; + position: relative; + box-sizing: border-box; +} + +.widget.open { + z-index: 99; +} +.widget.open:focus-within { + z-index: 100; +} + +.widget-top { + font-size: 13px; + font-weight: 600; + background: #f7f7f7; +} + +.widget-top .widget-action { + border: 0; + margin: 0; + padding: 10px; + background: none; + cursor: pointer; + outline: none; +} + +.widget-title h3, +.widget-title h4 { + margin: 0; + padding: 15px; + font-size: 1em; + line-height: 1; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.widgets-holder-wrap .widget-inside { + border-top: none; + padding: 1px 15px 15px 15px; + line-height: 1.23076923; +} + +.widget.widget-dirty .widget-control-close-wrapper { + display: none; +} + +.in-widget-title, +#widgets-right a.widget-control-edit, +#available-widgets .widget-description { + color: #666; +} + +.deleting .widget-title, +.deleting .widget-top .widget-action .toggle-indicator:before { + color: #a0a5aa; +} + +/* Media Widgets */ +.wp-core-ui .media-widget-control.selected .placeholder, +.wp-core-ui .media-widget-control.selected .not-selected, +.wp-core-ui .media-widget-control .selected { + display: none; +} + +.media-widget-control.selected .selected { + display: inline-block; +} + +.media-widget-buttons { + text-align: right; + margin-top: 0; +} + +.media-widget-control .media-widget-buttons .button { + width: auto; + height: auto; + margin-top: 12px; + white-space: normal; +} + +.media-widget-buttons .button:first-child { + margin-left: 8px; +} + +.media-widget-control .attachment-media-view .button-add-media, +.media-widget-control .placeholder { + border: 1px dashed #b4b9be; + box-sizing: border-box; + cursor: pointer; + line-height: 1.6; + padding: 9px 0; + position: relative; + text-align: center; + width: 100%; +} + +.media-widget-control .attachment-media-view .button-add-media { + cursor: pointer; + background-color: #edeff0; + color: #32373c; +} + +.media-widget-control .attachment-media-view .button-add-media:hover { + background-color: #fbfbfc; +} + +.media-widget-control .attachment-media-view .button-add-media:focus { + background-color: #fbfbfc; + border-style: solid; + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +.media-widget-control .media-widget-preview { + background: transparent; + text-align: center; +} +.media-widget-control .media-widget-preview .notice { + text-align: initial; +} +.media-frame .media-widget-embed-notice p code, +.media-widget-control .notice p code { + padding: 0 0 0 3px; +} +.media-frame .media-widget-embed-notice { + margin-top: 16px; +} +.media-widget-control .media-widget-preview img { + max-width: 100%; + vertical-align: middle; + background-image: linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4); + background-position: 100% 0, 10px 10px; + background-size: 20px 20px; +} +.media-widget-control .media-widget-preview .wp-video-shortcode { + background: #000; +} + +.media-frame.media-widget .media-toolbar-secondary { + min-width: 300px; +} + +.media-frame.media-widget .image-details .embed-media-settings .setting.align, +.media-frame.media-widget .attachment-display-settings .setting.align, +.media-frame.media-widget .embed-media-settings .setting.align, +.media-frame.media-widget .embed-media-settings .legend-inline, +.media-frame.media-widget .embed-link-settings .setting.link-text, +.media-frame.media-widget .replace-attachment, +.media-frame.media-widget .checkbox-setting.autoplay { + display: none; +} + +.media-widget-video-preview { + width: 100%; +} + +.media-widget-video-link { + display: inline-block; + min-height: 132px; + width: 100%; + background: black; +} + +.media-widget-video-link .dashicons { + font: normal 60px/1 'dashicons'; + position: relative; + width: 100%; + top: -90px; + color: white; + text-decoration: none; +} + +.media-widget-video-link.no-poster .dashicons { + top: 30px; +} + +.media-frame #embed-url-field.invalid, +.media-widget-image-link > .link:invalid { + border: 1px solid #dc3232; +} + +.media-widget-image-link { + margin: 1em 0; +} + +.media-widget-gallery-preview { + display: flex; + justify-content: flex-start; + flex-wrap: wrap; + margin: -1.79104477%; +} + +.media-widget-preview.media_gallery, +.media-widget-preview.media_image { + cursor: pointer; +} + +.media-widget-preview .placeholder { + background: #f1f1f1; +} + +.media-widget-gallery-preview .gallery-item { + box-sizing: border-box; + width: 50%; + margin: 0; + background: transparent; +} + +.media-widget-gallery-preview .gallery-item .gallery-icon { + margin: 4.5%; +} + +/* + * Use targeted nth-last-child selectors to control the size of each image + * based on how many gallery items are present in the grid. + * See: https://alistapart.com/article/quantity-queries-for-css + */ +.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child, +.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child ~ .gallery-item, +.media-widget-gallery-preview .gallery-item:nth-last-child(n+5), +.media-widget-gallery-preview .gallery-item:nth-last-child(n+5) ~ .gallery-item, +.media-widget-gallery-preview .gallery-item:nth-last-child(n+6), +.media-widget-gallery-preview .gallery-item:nth-last-child(n+6) ~ .gallery-item { + max-width: 33.33%; +} + +.media-widget-gallery-preview .gallery-item img { + height: auto; + vertical-align: bottom; +} + +.media-widget-gallery-preview .gallery-icon { + position: relative; +} + +.media-widget-gallery-preview .gallery-icon-placeholder { + position: absolute; + top: 0; + bottom: 0; + width: 100%; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + background-color: rgba(0, 0, 0, 0.5); +} + +.media-widget-gallery-preview .gallery-icon-placeholder-text { + font-weight: 600; + font-size: 2em; + color: white; +} + + +/* Widget Dragging Helpers */ +.widget.ui-draggable-dragging { + min-width: 100%; +} + +.widget.ui-sortable-helper { + opacity: 0.8; +} + +.widget-placeholder { + border: 1px dashed #b4b9be; + margin: 0 auto 10px; + height: 45px; + width: 100%; + box-sizing: border-box; +} + +#widgets-right .widget-placeholder { + margin-top: 0; +} + +#widgets-right .closed .widget-placeholder { + height: 0; + border: 0; + margin-top: -10px; +} + +/* Widget Sidebars */ +.sidebar-name { + position: relative; + box-sizing: border-box; +} + +.js .sidebar-name { + cursor: pointer; +} + +.sidebar-name .handlediv { + float: left; + width: 38px; + height: 38px; + border: 0; + margin: 0; + padding: 8px; + background: none; + cursor: pointer; + outline: none; +} + +#widgets-right .sidebar-name .handlediv { + margin: 5px 0 0 3px; +} + +.sidebar-name .handlediv:focus { + box-shadow: none; + outline: none; +} + +#widgets-left .sidebar-name .toggle-indicator { + display: none; +} + +#widgets-left .widgets-holder-wrap.closed .sidebar-name .toggle-indicator, +#widgets-left .sidebar-name:hover .toggle-indicator, +#widgets-left .sidebar-name .handlediv:focus .toggle-indicator { + display: block; +} + +.sidebar-name .toggle-indicator:before { + padding: 1px 0 1px 2px; + border-radius: 50%; +} + +.sidebar-name .handlediv:focus .toggle-indicator:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.sidebar-name h2, +.sidebar-name h3 { + margin: 0; + padding: 8px 10px; + overflow: hidden; + white-space: nowrap; +} + +.widgets-holder-wrap .description { + padding: 0 0 15px; + margin: 0; + font-style: normal; + color: #72777c; +} + +.widget-holder .description, +.inactive-sidebar .description { + color: #555d66; +} + +#widgets-right .widgets-holder-wrap .description { + padding-right: 7px; + padding-left: 7px; +} + +/* Widgets 2-col Layout */ +div.widget-liquid-left { + margin: 0; + width: 38%; + float: right; +} + +div.widget-liquid-right { + float: left; + width: 58%; +} + +/* Widgets Left - Available Widgets */ + +div#widgets-left { + padding-top: 12px; +} + +div#widgets-left .closed .sidebar-name, +div#widgets-left .inactive-sidebar.closed .sidebar-name { + margin-bottom: 10px; +} + +div#widgets-left .sidebar-name h2, +div#widgets-left .sidebar-name h3 { + padding: 10px 0; + margin: 0 0 0 10px; +} + +#widgets-left .widgets-holder-wrap, +div#widgets-left .widget-holder { + background: transparent; + border: none; +} + +#widgets-left .widgets-holder-wrap { + border: none; + box-shadow: none; +} + +#available-widgets .widget { + margin: 0; +} + +#available-widgets .widget:nth-child(odd) { + clear: both; +} + +#available-widgets .widget .widget-description { + display: block; + padding: 10px 15px; + font-size: 12px; + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-word; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +#available-widgets #widget-list { + position: relative; +} + +/* Inactive Sidebars */ +#widgets-left .inactive-sidebar { + clear: both; + width: 100%; + background: transparent; + padding: 0; + margin: 0 0 20px 0; + border: none; + box-shadow: none; +} + +#widgets-left .inactive-sidebar.first { + margin-top: 40px; +} + +/* Not sure what this is for... */ +div#widgets-left .inactive-sidebar .widget.expanded { + right: auto; +} + +.widget-title-action { + float: left; + position: relative; +} + +div#widgets-left .inactive-sidebar .widgets-sortables { + min-height: 42px; + padding: 0; + background: transparent; + margin: 0; + position: relative; +} + +/* Widgets Right */ + +div#widgets-right .sidebars-column-1, +div#widgets-right .sidebars-column-2 { + max-width: 450px; +} + +div#widgets-right .widgets-holder-wrap { + margin: 10px 0 0 0; +} + +div#widgets-right .sidebar-description { + min-height: 20px; + margin-top: -5px; +} + +div#widgets-right .sidebar-name h2, +div#widgets-right .sidebar-name h3 { + padding: 15px 7px; +} + +div#widgets-right .widget-top { + padding: 0; +} + +div#widgets-right .widgets-sortables { + padding: 0 8px; + margin-bottom: 9px; + position: relative; + min-height: 123px; +} + +div#widgets-right .closed .widgets-sortables { + min-height: 0; + margin-bottom: 0; +} + +.sidebar-name .spinner, +.remove-inactive-widgets .spinner { + float: none; + position: relative; + top: -2px; + margin: -5px 5px; +} + +/* Dragging a widget over a closed sidebar */ +#widgets-right .widgets-holder-wrap.widget-hover { + border-color: #72777c; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); +} + +/* Accessibility Mode */ +.widget-access-link { + float: left; + margin: -5px 10px 10px 0; +} + +.widgets_access #widgets-left .widget .widget-top { + cursor: auto; +} + +.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description, +.widgets_access #wpwrap .widgets-holder-wrap.closed .widget, +.widgets_access #wpwrap .widget-control-edit { + display: block; +} + +.widgets_access #widgets-left .widget .widget-top:hover, +.widgets_access #widgets-right .widget .widget-top:hover { + border-color: #ddd; +} + +#available-widgets .widget-control-edit .edit, +#available-widgets .widget-action .edit, +#widgets-left .inactive-sidebar .widget-control-edit .add, +#widgets-left .inactive-sidebar .widget-action .add, +#widgets-right .widget-control-edit .add, +#widgets-right .widget-action .add { + display: none; +} + +.widget-control-edit { + display: block; + color: #666; + background: #EEE; + padding: 0 15px; + line-height: 3.30769230; + border-right: 1px solid #DDD; +} + +#widgets-left .widget-control-edit:hover, +#widgets-right .widget-control-edit:hover { + color: #fff; + background: #444; + border-right: 0; + outline: 1px solid #444; +} + +.widgets-holder-wrap .sidebar-name, +.widgets-holder-wrap .sidebar-description { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.editwidget { + margin: 0 auto; +} + +.editwidget .widget-inside { + display: block; + padding: 0 15px; +} + +.editwidget .widget-control-actions { + margin-top: 20px; +} + +.js .widgets-holder-wrap.closed .widget, +.js .widgets-holder-wrap.closed .sidebar-description, +.js .widgets-holder-wrap.closed .remove-inactive-widgets, +.js .widgets-holder-wrap.closed .description, +.js .closed br.clear { + display: none; +} + +.js .widgets-holder-wrap.closed .widget.ui-sortable-helper { + display: block; +} + +/* Hide Widget Settings by Default */ +.widget-inside, +.widget-description { + display: none; +} + +.widget-inside { + background: #fff; +} + +.widget-inside select { + max-width: 100%; +} + +/* Dragging widgets over the available widget area show's a "Deactivate" message */ +#removing-widget { + display: none; + font-weight: 400; + padding-right: 15px; + font-size: 12px; + line-height: 1; + color: black; +} + +.js #removing-widget { + color: #00a0d2; +} + +.widget-control-noform, +#access-off, +.widgets_access .widget-action, +.widgets_access .handlediv, +.widgets_access #access-on, +.widgets_access .widget-holder .description, +.no-js .widget-holder .description { + display: none; +} + +.widgets_access .widget-holder, +.widgets_access #widget-list { + padding-top: 10px; +} + +.widgets_access #access-off { + display: inline; +} + +.widgets_access .sidebar-name, +.widgets_access .widget .widget-top { + cursor: default; +} + + +/* Widgets Area Chooser */ +.widget-liquid-left #widgets-left.chooser #available-widgets .widget, +.widget-liquid-left #widgets-left.chooser .inactive-sidebar { + transition: opacity 0.1s linear; +} + +.widget-liquid-left #widgets-left.chooser #available-widgets .widget, +.widget-liquid-left #widgets-left.chooser .inactive-sidebar { + /* -webkit-filter: blur(1px); */ + opacity: 0.2; + pointer-events: none; +} + +.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question { + /* -webkit-filter: none; */ + opacity: 1; + pointer-events: auto; +} + +.widgets-chooser ul, +#widgets-left .widget-in-question .widget-top, +#available-widgets .widget-top:hover, +div#widgets-right .widget-top:hover, +#widgets-left .widget-top:hover { + border-color: #999; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.widgets-chooser ul.widgets-chooser-sidebars { + margin: 0; + list-style-type: none; + max-height: 300px; + overflow: auto; +} + +.widgets-chooser { + display: none; +} + +.widgets-chooser ul { + border: 1px solid #ccc; +} + +.widgets-chooser li { + border-bottom: 1px solid #ccc; + background: #fff; + margin: 0; + position: relative; +} + +.widgets-chooser .widgets-chooser-button { + width: 100%; + padding: 10px 35px 10px 15px; + background: transparent; + border: 0; + box-sizing: border-box; + text-align: right; + cursor: pointer; + transition: background 0.2s ease-in-out; +} + +/* @todo looks like these hover/focus states are overridden by .widgets-chooser-selected */ +.widgets-chooser .widgets-chooser-button:hover, +.widgets-chooser .widgets-chooser-button:focus { + outline: none; + text-decoration: underline; +} + +.widgets-chooser li:last-child { + border: none; +} + +.widgets-chooser .widgets-chooser-selected .widgets-chooser-button { + background: #0073aa; + color: #fff; +} + +.widgets-chooser .widgets-chooser-selected:before { + content: "\f147"; + display: block; + -webkit-font-smoothing: antialiased; + font: normal 26px/1 dashicons; + color: #fff; + position: absolute; + top: 7px; + right: 5px; +} + +.widgets-chooser .widgets-chooser-actions { + padding: 10px 0 12px 0; + text-align: center; +} + +#available-widgets .widget .widget-top { + cursor: pointer; +} + +#available-widgets .widget.ui-draggable-dragging .widget-top { + cursor: move; +} + +/* =Specific widget styling +-------------------------------------------------------------- */ +.text-widget-fields { + position: relative; +} +.text-widget-fields [hidden] { + display: none; +} +.text-widget-fields .wp-pointer.wp-pointer-top { + position: absolute; + z-index: 3; + top: 100px; + left: 10px; + right: 10px; +} +.text-widget-fields .wp-pointer .wp-pointer-arrow { + right: auto; + left: 15px; +} +.text-widget-fields .wp-pointer .wp-pointer-buttons { + line-height: 1.4; +} + +.custom-html-widget-fields > p > .CodeMirror { + border: 1px solid #e5e5e5; +} +.custom-html-widget-fields code { + padding-top: 1px; + padding-bottom: 1px; +} +ul.CodeMirror-hints { + z-index: 101; /* Due to z-index 100 set on .widget.open */ +} +.widget-control-actions .custom-html-widget-save-button.button.validation-blocked { + cursor: not-allowed; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +@media screen and (max-width: 480px) { + div.widget-liquid-left { + width: 100%; + float: none; + border-left: none; + padding-left: 0; + } + + #widgets-left .sidebar-name { + margin-left: 0; + } + + #widgets-left #available-widgets .widget-top { + margin-left: 0; + } + + #widgets-left .inactive-sidebar .widgets-sortables { + margin-left: 0; + } + + div.widget-liquid-right { + width: 100%; + float: none; + } + + div.widget { + max-width: 480px; + } + + .widget-access-link { + float: none; + margin: 15px 0 0 0; + } +} + +@media screen and (max-width: 320px) { + div.widget { + max-width: 320px; + } +} + +@media only screen and (min-width: 1250px) { + #widgets-left #available-widgets .widget { + width: 49%; + float: right; + } + + .widget.ui-draggable-dragging { + min-width: 49%; + } + + #widgets-left #available-widgets .widget:nth-child(even) { + float: left; + } + + #widgets-right .sidebars-column-1, + #widgets-right .sidebars-column-2 { + float: right; + width: 49%; + } + + #widgets-right .sidebars-column-1 { + margin-left: 2%; + } + + #widgets-right.single-sidebar .sidebars-column-1, + #widgets-right.single-sidebar .sidebars-column-2 { + float: none; + width: 100%; + margin: 0; + } +} diff --git a/wp-admin/css/widgets-rtl.min.css b/wp-admin/css/widgets-rtl.min.css new file mode 100644 index 0000000..2fafd35 --- /dev/null +++ b/wp-admin/css/widgets-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.widget{margin:0 auto 10px;position:relative;box-sizing:border-box}.widget.open{z-index:99}.widget.open:focus-within{z-index:100}.widget-top{font-size:13px;font-weight:600;background:#f7f7f7}.widget-top .widget-action{border:0;margin:0;padding:10px;background:0 0;cursor:pointer;outline:0}.widget-title h3,.widget-title h4{margin:0;padding:15px;font-size:1em;line-height:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.widgets-holder-wrap .widget-inside{border-top:none;padding:1px 15px 15px 15px;line-height:1.23076923}.widget.widget-dirty .widget-control-close-wrapper{display:none}#available-widgets .widget-description,#widgets-right a.widget-control-edit,.in-widget-title{color:#666}.deleting .widget-title,.deleting .widget-top .widget-action .toggle-indicator:before{color:#a0a5aa}.wp-core-ui .media-widget-control .selected,.wp-core-ui .media-widget-control.selected .not-selected,.wp-core-ui .media-widget-control.selected .placeholder{display:none}.media-widget-control.selected .selected{display:inline-block}.media-widget-buttons{text-align:right;margin-top:0}.media-widget-control .media-widget-buttons .button{width:auto;height:auto;margin-top:12px;white-space:normal}.media-widget-buttons .button:first-child{margin-left:8px}.media-widget-control .attachment-media-view .button-add-media,.media-widget-control .placeholder{border:1px dashed #b4b9be;box-sizing:border-box;cursor:pointer;line-height:1.6;padding:9px 0;position:relative;text-align:center;width:100%}.media-widget-control .attachment-media-view .button-add-media{cursor:pointer;background-color:#edeff0;color:#32373c}.media-widget-control .attachment-media-view .button-add-media:hover{background-color:#fbfbfc}.media-widget-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-style:solid;border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8);outline:2px solid transparent;outline-offset:-2px}.media-widget-control .media-widget-preview{background:0 0;text-align:center}.media-widget-control .media-widget-preview .notice{text-align:initial}.media-frame .media-widget-embed-notice p code,.media-widget-control .notice p code{padding:0 0 0 3px}.media-frame .media-widget-embed-notice{margin-top:16px}.media-widget-control .media-widget-preview img{max-width:100%;vertical-align:middle;background-image:linear-gradient(-45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4),linear-gradient(-45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4);background-position:100% 0,10px 10px;background-size:20px 20px}.media-widget-control .media-widget-preview .wp-video-shortcode{background:#000}.media-frame.media-widget .media-toolbar-secondary{min-width:300px}.media-frame.media-widget .attachment-display-settings .setting.align,.media-frame.media-widget .checkbox-setting.autoplay,.media-frame.media-widget .embed-link-settings .setting.link-text,.media-frame.media-widget .embed-media-settings .legend-inline,.media-frame.media-widget .embed-media-settings .setting.align,.media-frame.media-widget .image-details .embed-media-settings .setting.align,.media-frame.media-widget .replace-attachment{display:none}.media-widget-video-preview{width:100%}.media-widget-video-link{display:inline-block;min-height:132px;width:100%;background:#000}.media-widget-video-link .dashicons{font:normal 60px/1 dashicons;position:relative;width:100%;top:-90px;color:#fff;text-decoration:none}.media-widget-video-link.no-poster .dashicons{top:30px}.media-frame #embed-url-field.invalid,.media-widget-image-link>.link:invalid{border:1px solid #dc3232}.media-widget-image-link{margin:1em 0}.media-widget-gallery-preview{display:flex;justify-content:flex-start;flex-wrap:wrap;margin:-1.79104477%}.media-widget-preview.media_gallery,.media-widget-preview.media_image{cursor:pointer}.media-widget-preview .placeholder{background:#f1f1f1}.media-widget-gallery-preview .gallery-item{box-sizing:border-box;width:50%;margin:0;background:0 0}.media-widget-gallery-preview .gallery-item .gallery-icon{margin:4.5%}.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child,.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child~.gallery-item,.media-widget-gallery-preview .gallery-item:nth-last-child(n+5),.media-widget-gallery-preview .gallery-item:nth-last-child(n+5)~.gallery-item,.media-widget-gallery-preview .gallery-item:nth-last-child(n+6),.media-widget-gallery-preview .gallery-item:nth-last-child(n+6)~.gallery-item{max-width:33.33%}.media-widget-gallery-preview .gallery-item img{height:auto;vertical-align:bottom}.media-widget-gallery-preview .gallery-icon{position:relative}.media-widget-gallery-preview .gallery-icon-placeholder{position:absolute;top:0;bottom:0;width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:center;background-color:rgba(0,0,0,.5)}.media-widget-gallery-preview .gallery-icon-placeholder-text{font-weight:600;font-size:2em;color:#fff}.widget.ui-draggable-dragging{min-width:100%}.widget.ui-sortable-helper{opacity:.8}.widget-placeholder{border:1px dashed #b4b9be;margin:0 auto 10px;height:45px;width:100%;box-sizing:border-box}#widgets-right .widget-placeholder{margin-top:0}#widgets-right .closed .widget-placeholder{height:0;border:0;margin-top:-10px}.sidebar-name{position:relative;box-sizing:border-box}.js .sidebar-name{cursor:pointer}.sidebar-name .handlediv{float:left;width:38px;height:38px;border:0;margin:0;padding:8px;background:0 0;cursor:pointer;outline:0}#widgets-right .sidebar-name .handlediv{margin:5px 0 0 3px}.sidebar-name .handlediv:focus{box-shadow:none;outline:0}#widgets-left .sidebar-name .toggle-indicator{display:none}#widgets-left .sidebar-name .handlediv:focus .toggle-indicator,#widgets-left .sidebar-name:hover .toggle-indicator,#widgets-left .widgets-holder-wrap.closed .sidebar-name .toggle-indicator{display:block}.sidebar-name .toggle-indicator:before{padding:1px 0 1px 2px;border-radius:50%}.sidebar-name .handlediv:focus .toggle-indicator:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.sidebar-name h2,.sidebar-name h3{margin:0;padding:8px 10px;overflow:hidden;white-space:nowrap}.widgets-holder-wrap .description{padding:0 0 15px;margin:0;font-style:normal;color:#72777c}.inactive-sidebar .description,.widget-holder .description{color:#555d66}#widgets-right .widgets-holder-wrap .description{padding-right:7px;padding-left:7px}div.widget-liquid-left{margin:0;width:38%;float:right}div.widget-liquid-right{float:left;width:58%}div#widgets-left{padding-top:12px}div#widgets-left .closed .sidebar-name,div#widgets-left .inactive-sidebar.closed .sidebar-name{margin-bottom:10px}div#widgets-left .sidebar-name h2,div#widgets-left .sidebar-name h3{padding:10px 0;margin:0 0 0 10px}#widgets-left .widgets-holder-wrap,div#widgets-left .widget-holder{background:0 0;border:none}#widgets-left .widgets-holder-wrap{border:none;box-shadow:none}#available-widgets .widget{margin:0}#available-widgets .widget:nth-child(odd){clear:both}#available-widgets .widget .widget-description{display:block;padding:10px 15px;font-size:12px;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}#available-widgets #widget-list{position:relative}#widgets-left .inactive-sidebar{clear:both;width:100%;background:0 0;padding:0;margin:0 0 20px 0;border:none;box-shadow:none}#widgets-left .inactive-sidebar.first{margin-top:40px}div#widgets-left .inactive-sidebar .widget.expanded{right:auto}.widget-title-action{float:left;position:relative}div#widgets-left .inactive-sidebar .widgets-sortables{min-height:42px;padding:0;background:0 0;margin:0;position:relative}div#widgets-right .sidebars-column-1,div#widgets-right .sidebars-column-2{max-width:450px}div#widgets-right .widgets-holder-wrap{margin:10px 0 0 0}div#widgets-right .sidebar-description{min-height:20px;margin-top:-5px}div#widgets-right .sidebar-name h2,div#widgets-right .sidebar-name h3{padding:15px 7px}div#widgets-right .widget-top{padding:0}div#widgets-right .widgets-sortables{padding:0 8px;margin-bottom:9px;position:relative;min-height:123px}div#widgets-right .closed .widgets-sortables{min-height:0;margin-bottom:0}.remove-inactive-widgets .spinner,.sidebar-name .spinner{float:none;position:relative;top:-2px;margin:-5px 5px}#widgets-right .widgets-holder-wrap.widget-hover{border-color:#72777c;box-shadow:0 1px 2px rgba(0,0,0,.3)}.widget-access-link{float:left;margin:-5px 10px 10px 0}.widgets_access #widgets-left .widget .widget-top{cursor:auto}.widgets_access #wpwrap .widget-control-edit,.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description,.widgets_access #wpwrap .widgets-holder-wrap.closed .widget{display:block}.widgets_access #widgets-left .widget .widget-top:hover,.widgets_access #widgets-right .widget .widget-top:hover{border-color:#ddd}#available-widgets .widget-action .edit,#available-widgets .widget-control-edit .edit,#widgets-left .inactive-sidebar .widget-action .add,#widgets-left .inactive-sidebar .widget-control-edit .add,#widgets-right .widget-action .add,#widgets-right .widget-control-edit .add{display:none}.widget-control-edit{display:block;color:#666;background:#eee;padding:0 15px;line-height:3.30769230;border-right:1px solid #ddd}#widgets-left .widget-control-edit:hover,#widgets-right .widget-control-edit:hover{color:#fff;background:#444;border-right:0;outline:1px solid #444}.widgets-holder-wrap .sidebar-description,.widgets-holder-wrap .sidebar-name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.editwidget{margin:0 auto}.editwidget .widget-inside{display:block;padding:0 15px}.editwidget .widget-control-actions{margin-top:20px}.js .closed br.clear,.js .widgets-holder-wrap.closed .description,.js .widgets-holder-wrap.closed .remove-inactive-widgets,.js .widgets-holder-wrap.closed .sidebar-description,.js .widgets-holder-wrap.closed .widget{display:none}.js .widgets-holder-wrap.closed .widget.ui-sortable-helper{display:block}.widget-description,.widget-inside{display:none}.widget-inside{background:#fff}.widget-inside select{max-width:100%}#removing-widget{display:none;font-weight:400;padding-right:15px;font-size:12px;line-height:1;color:#000}.js #removing-widget{color:#00a0d2}#access-off,.no-js .widget-holder .description,.widget-control-noform,.widgets_access #access-on,.widgets_access .handlediv,.widgets_access .widget-action,.widgets_access .widget-holder .description{display:none}.widgets_access #widget-list,.widgets_access .widget-holder{padding-top:10px}.widgets_access #access-off{display:inline}.widgets_access .sidebar-name,.widgets_access .widget .widget-top{cursor:default}.widget-liquid-left #widgets-left.chooser #available-widgets .widget,.widget-liquid-left #widgets-left.chooser .inactive-sidebar{transition:opacity .1s linear}.widget-liquid-left #widgets-left.chooser #available-widgets .widget,.widget-liquid-left #widgets-left.chooser .inactive-sidebar{opacity:.2;pointer-events:none}.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question{opacity:1;pointer-events:auto}#available-widgets .widget-top:hover,#widgets-left .widget-in-question .widget-top,#widgets-left .widget-top:hover,.widgets-chooser ul,div#widgets-right .widget-top:hover{border-color:#999;box-shadow:0 1px 2px rgba(0,0,0,.1)}.widgets-chooser ul.widgets-chooser-sidebars{margin:0;list-style-type:none;max-height:300px;overflow:auto}.widgets-chooser{display:none}.widgets-chooser ul{border:1px solid #ccc}.widgets-chooser li{border-bottom:1px solid #ccc;background:#fff;margin:0;position:relative}.widgets-chooser .widgets-chooser-button{width:100%;padding:10px 35px 10px 15px;background:0 0;border:0;box-sizing:border-box;text-align:right;cursor:pointer;transition:background .2s ease-in-out}.widgets-chooser .widgets-chooser-button:focus,.widgets-chooser .widgets-chooser-button:hover{outline:0;text-decoration:underline}.widgets-chooser li:last-child{border:none}.widgets-chooser .widgets-chooser-selected .widgets-chooser-button{background:#0073aa;color:#fff}.widgets-chooser .widgets-chooser-selected:before{content:"\f147";display:block;-webkit-font-smoothing:antialiased;font:normal 26px/1 dashicons;color:#fff;position:absolute;top:7px;right:5px}.widgets-chooser .widgets-chooser-actions{padding:10px 0 12px 0;text-align:center}#available-widgets .widget .widget-top{cursor:pointer}#available-widgets .widget.ui-draggable-dragging .widget-top{cursor:move}.text-widget-fields{position:relative}.text-widget-fields [hidden]{display:none}.text-widget-fields .wp-pointer.wp-pointer-top{position:absolute;z-index:3;top:100px;left:10px;right:10px}.text-widget-fields .wp-pointer .wp-pointer-arrow{right:auto;left:15px}.text-widget-fields .wp-pointer .wp-pointer-buttons{line-height:1.4}.custom-html-widget-fields>p>.CodeMirror{border:1px solid #e5e5e5}.custom-html-widget-fields code{padding-top:1px;padding-bottom:1px}ul.CodeMirror-hints{z-index:101}.widget-control-actions .custom-html-widget-save-button.button.validation-blocked{cursor:not-allowed}@media screen and (max-width:480px){div.widget-liquid-left{width:100%;float:none;border-left:none;padding-left:0}#widgets-left .sidebar-name{margin-left:0}#widgets-left #available-widgets .widget-top{margin-left:0}#widgets-left .inactive-sidebar .widgets-sortables{margin-left:0}div.widget-liquid-right{width:100%;float:none}div.widget{max-width:480px}.widget-access-link{float:none;margin:15px 0 0 0}}@media screen and (max-width:320px){div.widget{max-width:320px}}@media only screen and (min-width:1250px){#widgets-left #available-widgets .widget{width:49%;float:right}.widget.ui-draggable-dragging{min-width:49%}#widgets-left #available-widgets .widget:nth-child(even){float:left}#widgets-right .sidebars-column-1,#widgets-right .sidebars-column-2{float:right;width:49%}#widgets-right .sidebars-column-1{margin-left:2%}#widgets-right.single-sidebar .sidebars-column-1,#widgets-right.single-sidebar .sidebars-column-2{float:none;width:100%;margin:0}} \ No newline at end of file diff --git a/wp-admin/css/widgets.css b/wp-admin/css/widgets.css new file mode 100644 index 0000000..e92ddd8 --- /dev/null +++ b/wp-admin/css/widgets.css @@ -0,0 +1,865 @@ +/* General Widgets Styles */ + +.widget { + margin: 0 auto 10px; + position: relative; + box-sizing: border-box; +} + +.widget.open { + z-index: 99; +} +.widget.open:focus-within { + z-index: 100; +} + +.widget-top { + font-size: 13px; + font-weight: 600; + background: #f7f7f7; +} + +.widget-top .widget-action { + border: 0; + margin: 0; + padding: 10px; + background: none; + cursor: pointer; + outline: none; +} + +.widget-title h3, +.widget-title h4 { + margin: 0; + padding: 15px; + font-size: 1em; + line-height: 1; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.widgets-holder-wrap .widget-inside { + border-top: none; + padding: 1px 15px 15px 15px; + line-height: 1.23076923; +} + +.widget.widget-dirty .widget-control-close-wrapper { + display: none; +} + +.in-widget-title, +#widgets-right a.widget-control-edit, +#available-widgets .widget-description { + color: #666; +} + +.deleting .widget-title, +.deleting .widget-top .widget-action .toggle-indicator:before { + color: #a0a5aa; +} + +/* Media Widgets */ +.wp-core-ui .media-widget-control.selected .placeholder, +.wp-core-ui .media-widget-control.selected .not-selected, +.wp-core-ui .media-widget-control .selected { + display: none; +} + +.media-widget-control.selected .selected { + display: inline-block; +} + +.media-widget-buttons { + text-align: left; + margin-top: 0; +} + +.media-widget-control .media-widget-buttons .button { + width: auto; + height: auto; + margin-top: 12px; + white-space: normal; +} + +.media-widget-buttons .button:first-child { + margin-right: 8px; +} + +.media-widget-control .attachment-media-view .button-add-media, +.media-widget-control .placeholder { + border: 1px dashed #b4b9be; + box-sizing: border-box; + cursor: pointer; + line-height: 1.6; + padding: 9px 0; + position: relative; + text-align: center; + width: 100%; +} + +.media-widget-control .attachment-media-view .button-add-media { + cursor: pointer; + background-color: #edeff0; + color: #32373c; +} + +.media-widget-control .attachment-media-view .button-add-media:hover { + background-color: #fbfbfc; +} + +.media-widget-control .attachment-media-view .button-add-media:focus { + background-color: #fbfbfc; + border-style: solid; + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +.media-widget-control .media-widget-preview { + background: transparent; + text-align: center; +} +.media-widget-control .media-widget-preview .notice { + text-align: initial; +} +.media-frame .media-widget-embed-notice p code, +.media-widget-control .notice p code { + padding: 0 3px 0 0; +} +.media-frame .media-widget-embed-notice { + margin-top: 16px; +} +.media-widget-control .media-widget-preview img { + max-width: 100%; + vertical-align: middle; + background-image: linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4); + background-position: 0 0, 10px 10px; + background-size: 20px 20px; +} +.media-widget-control .media-widget-preview .wp-video-shortcode { + background: #000; +} + +.media-frame.media-widget .media-toolbar-secondary { + min-width: 300px; +} + +.media-frame.media-widget .image-details .embed-media-settings .setting.align, +.media-frame.media-widget .attachment-display-settings .setting.align, +.media-frame.media-widget .embed-media-settings .setting.align, +.media-frame.media-widget .embed-media-settings .legend-inline, +.media-frame.media-widget .embed-link-settings .setting.link-text, +.media-frame.media-widget .replace-attachment, +.media-frame.media-widget .checkbox-setting.autoplay { + display: none; +} + +.media-widget-video-preview { + width: 100%; +} + +.media-widget-video-link { + display: inline-block; + min-height: 132px; + width: 100%; + background: black; +} + +.media-widget-video-link .dashicons { + font: normal 60px/1 'dashicons'; + position: relative; + width: 100%; + top: -90px; + color: white; + text-decoration: none; +} + +.media-widget-video-link.no-poster .dashicons { + top: 30px; +} + +.media-frame #embed-url-field.invalid, +.media-widget-image-link > .link:invalid { + border: 1px solid #dc3232; +} + +.media-widget-image-link { + margin: 1em 0; +} + +.media-widget-gallery-preview { + display: flex; + justify-content: flex-start; + flex-wrap: wrap; + margin: -1.79104477%; +} + +.media-widget-preview.media_gallery, +.media-widget-preview.media_image { + cursor: pointer; +} + +.media-widget-preview .placeholder { + background: #f1f1f1; +} + +.media-widget-gallery-preview .gallery-item { + box-sizing: border-box; + width: 50%; + margin: 0; + background: transparent; +} + +.media-widget-gallery-preview .gallery-item .gallery-icon { + margin: 4.5%; +} + +/* + * Use targeted nth-last-child selectors to control the size of each image + * based on how many gallery items are present in the grid. + * See: https://alistapart.com/article/quantity-queries-for-css + */ +.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child, +.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child ~ .gallery-item, +.media-widget-gallery-preview .gallery-item:nth-last-child(n+5), +.media-widget-gallery-preview .gallery-item:nth-last-child(n+5) ~ .gallery-item, +.media-widget-gallery-preview .gallery-item:nth-last-child(n+6), +.media-widget-gallery-preview .gallery-item:nth-last-child(n+6) ~ .gallery-item { + max-width: 33.33%; +} + +.media-widget-gallery-preview .gallery-item img { + height: auto; + vertical-align: bottom; +} + +.media-widget-gallery-preview .gallery-icon { + position: relative; +} + +.media-widget-gallery-preview .gallery-icon-placeholder { + position: absolute; + top: 0; + bottom: 0; + width: 100%; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + background-color: rgba(0, 0, 0, 0.5); +} + +.media-widget-gallery-preview .gallery-icon-placeholder-text { + font-weight: 600; + font-size: 2em; + color: white; +} + + +/* Widget Dragging Helpers */ +.widget.ui-draggable-dragging { + min-width: 100%; +} + +.widget.ui-sortable-helper { + opacity: 0.8; +} + +.widget-placeholder { + border: 1px dashed #b4b9be; + margin: 0 auto 10px; + height: 45px; + width: 100%; + box-sizing: border-box; +} + +#widgets-right .widget-placeholder { + margin-top: 0; +} + +#widgets-right .closed .widget-placeholder { + height: 0; + border: 0; + margin-top: -10px; +} + +/* Widget Sidebars */ +.sidebar-name { + position: relative; + box-sizing: border-box; +} + +.js .sidebar-name { + cursor: pointer; +} + +.sidebar-name .handlediv { + float: right; + width: 38px; + height: 38px; + border: 0; + margin: 0; + padding: 8px; + background: none; + cursor: pointer; + outline: none; +} + +#widgets-right .sidebar-name .handlediv { + margin: 5px 3px 0 0; +} + +.sidebar-name .handlediv:focus { + box-shadow: none; + outline: none; +} + +#widgets-left .sidebar-name .toggle-indicator { + display: none; +} + +#widgets-left .widgets-holder-wrap.closed .sidebar-name .toggle-indicator, +#widgets-left .sidebar-name:hover .toggle-indicator, +#widgets-left .sidebar-name .handlediv:focus .toggle-indicator { + display: block; +} + +.sidebar-name .toggle-indicator:before { + padding: 1px 2px 1px 0; + border-radius: 50%; +} + +.sidebar-name .handlediv:focus .toggle-indicator:before { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.sidebar-name h2, +.sidebar-name h3 { + margin: 0; + padding: 8px 10px; + overflow: hidden; + white-space: nowrap; +} + +.widgets-holder-wrap .description { + padding: 0 0 15px; + margin: 0; + font-style: normal; + color: #72777c; +} + +.widget-holder .description, +.inactive-sidebar .description { + color: #555d66; +} + +#widgets-right .widgets-holder-wrap .description { + padding-left: 7px; + padding-right: 7px; +} + +/* Widgets 2-col Layout */ +div.widget-liquid-left { + margin: 0; + width: 38%; + float: left; +} + +div.widget-liquid-right { + float: right; + width: 58%; +} + +/* Widgets Left - Available Widgets */ + +div#widgets-left { + padding-top: 12px; +} + +div#widgets-left .closed .sidebar-name, +div#widgets-left .inactive-sidebar.closed .sidebar-name { + margin-bottom: 10px; +} + +div#widgets-left .sidebar-name h2, +div#widgets-left .sidebar-name h3 { + padding: 10px 0; + margin: 0 10px 0 0; +} + +#widgets-left .widgets-holder-wrap, +div#widgets-left .widget-holder { + background: transparent; + border: none; +} + +#widgets-left .widgets-holder-wrap { + border: none; + box-shadow: none; +} + +#available-widgets .widget { + margin: 0; +} + +#available-widgets .widget:nth-child(odd) { + clear: both; +} + +#available-widgets .widget .widget-description { + display: block; + padding: 10px 15px; + font-size: 12px; + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-word; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +#available-widgets #widget-list { + position: relative; +} + +/* Inactive Sidebars */ +#widgets-left .inactive-sidebar { + clear: both; + width: 100%; + background: transparent; + padding: 0; + margin: 0 0 20px 0; + border: none; + box-shadow: none; +} + +#widgets-left .inactive-sidebar.first { + margin-top: 40px; +} + +/* Not sure what this is for... */ +div#widgets-left .inactive-sidebar .widget.expanded { + left: auto; +} + +.widget-title-action { + float: right; + position: relative; +} + +div#widgets-left .inactive-sidebar .widgets-sortables { + min-height: 42px; + padding: 0; + background: transparent; + margin: 0; + position: relative; +} + +/* Widgets Right */ + +div#widgets-right .sidebars-column-1, +div#widgets-right .sidebars-column-2 { + max-width: 450px; +} + +div#widgets-right .widgets-holder-wrap { + margin: 10px 0 0 0; +} + +div#widgets-right .sidebar-description { + min-height: 20px; + margin-top: -5px; +} + +div#widgets-right .sidebar-name h2, +div#widgets-right .sidebar-name h3 { + padding: 15px 7px; +} + +div#widgets-right .widget-top { + padding: 0; +} + +div#widgets-right .widgets-sortables { + padding: 0 8px; + margin-bottom: 9px; + position: relative; + min-height: 123px; +} + +div#widgets-right .closed .widgets-sortables { + min-height: 0; + margin-bottom: 0; +} + +.sidebar-name .spinner, +.remove-inactive-widgets .spinner { + float: none; + position: relative; + top: -2px; + margin: -5px 5px; +} + +/* Dragging a widget over a closed sidebar */ +#widgets-right .widgets-holder-wrap.widget-hover { + border-color: #72777c; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); +} + +/* Accessibility Mode */ +.widget-access-link { + float: right; + margin: -5px 0 10px 10px; +} + +.widgets_access #widgets-left .widget .widget-top { + cursor: auto; +} + +.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description, +.widgets_access #wpwrap .widgets-holder-wrap.closed .widget, +.widgets_access #wpwrap .widget-control-edit { + display: block; +} + +.widgets_access #widgets-left .widget .widget-top:hover, +.widgets_access #widgets-right .widget .widget-top:hover { + border-color: #ddd; +} + +#available-widgets .widget-control-edit .edit, +#available-widgets .widget-action .edit, +#widgets-left .inactive-sidebar .widget-control-edit .add, +#widgets-left .inactive-sidebar .widget-action .add, +#widgets-right .widget-control-edit .add, +#widgets-right .widget-action .add { + display: none; +} + +.widget-control-edit { + display: block; + color: #666; + background: #EEE; + padding: 0 15px; + line-height: 3.30769230; + border-left: 1px solid #DDD; +} + +#widgets-left .widget-control-edit:hover, +#widgets-right .widget-control-edit:hover { + color: #fff; + background: #444; + border-left: 0; + outline: 1px solid #444; +} + +.widgets-holder-wrap .sidebar-name, +.widgets-holder-wrap .sidebar-description { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.editwidget { + margin: 0 auto; +} + +.editwidget .widget-inside { + display: block; + padding: 0 15px; +} + +.editwidget .widget-control-actions { + margin-top: 20px; +} + +.js .widgets-holder-wrap.closed .widget, +.js .widgets-holder-wrap.closed .sidebar-description, +.js .widgets-holder-wrap.closed .remove-inactive-widgets, +.js .widgets-holder-wrap.closed .description, +.js .closed br.clear { + display: none; +} + +.js .widgets-holder-wrap.closed .widget.ui-sortable-helper { + display: block; +} + +/* Hide Widget Settings by Default */ +.widget-inside, +.widget-description { + display: none; +} + +.widget-inside { + background: #fff; +} + +.widget-inside select { + max-width: 100%; +} + +/* Dragging widgets over the available widget area show's a "Deactivate" message */ +#removing-widget { + display: none; + font-weight: 400; + padding-left: 15px; + font-size: 12px; + line-height: 1; + color: black; +} + +.js #removing-widget { + color: #00a0d2; +} + +.widget-control-noform, +#access-off, +.widgets_access .widget-action, +.widgets_access .handlediv, +.widgets_access #access-on, +.widgets_access .widget-holder .description, +.no-js .widget-holder .description { + display: none; +} + +.widgets_access .widget-holder, +.widgets_access #widget-list { + padding-top: 10px; +} + +.widgets_access #access-off { + display: inline; +} + +.widgets_access .sidebar-name, +.widgets_access .widget .widget-top { + cursor: default; +} + + +/* Widgets Area Chooser */ +.widget-liquid-left #widgets-left.chooser #available-widgets .widget, +.widget-liquid-left #widgets-left.chooser .inactive-sidebar { + transition: opacity 0.1s linear; +} + +.widget-liquid-left #widgets-left.chooser #available-widgets .widget, +.widget-liquid-left #widgets-left.chooser .inactive-sidebar { + /* -webkit-filter: blur(1px); */ + opacity: 0.2; + pointer-events: none; +} + +.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question { + /* -webkit-filter: none; */ + opacity: 1; + pointer-events: auto; +} + +.widgets-chooser ul, +#widgets-left .widget-in-question .widget-top, +#available-widgets .widget-top:hover, +div#widgets-right .widget-top:hover, +#widgets-left .widget-top:hover { + border-color: #999; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.widgets-chooser ul.widgets-chooser-sidebars { + margin: 0; + list-style-type: none; + max-height: 300px; + overflow: auto; +} + +.widgets-chooser { + display: none; +} + +.widgets-chooser ul { + border: 1px solid #ccc; +} + +.widgets-chooser li { + border-bottom: 1px solid #ccc; + background: #fff; + margin: 0; + position: relative; +} + +.widgets-chooser .widgets-chooser-button { + width: 100%; + padding: 10px 15px 10px 35px; + background: transparent; + border: 0; + box-sizing: border-box; + text-align: left; + cursor: pointer; + transition: background 0.2s ease-in-out; +} + +/* @todo looks like these hover/focus states are overridden by .widgets-chooser-selected */ +.widgets-chooser .widgets-chooser-button:hover, +.widgets-chooser .widgets-chooser-button:focus { + outline: none; + text-decoration: underline; +} + +.widgets-chooser li:last-child { + border: none; +} + +.widgets-chooser .widgets-chooser-selected .widgets-chooser-button { + background: #0073aa; + color: #fff; +} + +.widgets-chooser .widgets-chooser-selected:before { + content: "\f147"; + display: block; + -webkit-font-smoothing: antialiased; + font: normal 26px/1 dashicons; + color: #fff; + position: absolute; + top: 7px; + left: 5px; +} + +.widgets-chooser .widgets-chooser-actions { + padding: 10px 0 12px 0; + text-align: center; +} + +#available-widgets .widget .widget-top { + cursor: pointer; +} + +#available-widgets .widget.ui-draggable-dragging .widget-top { + cursor: move; +} + +/* =Specific widget styling +-------------------------------------------------------------- */ +.text-widget-fields { + position: relative; +} +.text-widget-fields [hidden] { + display: none; +} +.text-widget-fields .wp-pointer.wp-pointer-top { + position: absolute; + z-index: 3; + top: 100px; + right: 10px; + left: 10px; +} +.text-widget-fields .wp-pointer .wp-pointer-arrow { + left: auto; + right: 15px; +} +.text-widget-fields .wp-pointer .wp-pointer-buttons { + line-height: 1.4; +} + +.custom-html-widget-fields > p > .CodeMirror { + border: 1px solid #e5e5e5; +} +.custom-html-widget-fields code { + padding-top: 1px; + padding-bottom: 1px; +} +ul.CodeMirror-hints { + z-index: 101; /* Due to z-index 100 set on .widget.open */ +} +.widget-control-actions .custom-html-widget-save-button.button.validation-blocked { + cursor: not-allowed; +} + +/* =Media Queries +-------------------------------------------------------------- */ + +@media screen and (max-width: 480px) { + div.widget-liquid-left { + width: 100%; + float: none; + border-right: none; + padding-right: 0; + } + + #widgets-left .sidebar-name { + margin-right: 0; + } + + #widgets-left #available-widgets .widget-top { + margin-right: 0; + } + + #widgets-left .inactive-sidebar .widgets-sortables { + margin-right: 0; + } + + div.widget-liquid-right { + width: 100%; + float: none; + } + + div.widget { + max-width: 480px; + } + + .widget-access-link { + float: none; + margin: 15px 0 0 0; + } +} + +@media screen and (max-width: 320px) { + div.widget { + max-width: 320px; + } +} + +@media only screen and (min-width: 1250px) { + #widgets-left #available-widgets .widget { + width: 49%; + float: left; + } + + .widget.ui-draggable-dragging { + min-width: 49%; + } + + #widgets-left #available-widgets .widget:nth-child(even) { + float: right; + } + + #widgets-right .sidebars-column-1, + #widgets-right .sidebars-column-2 { + float: left; + width: 49%; + } + + #widgets-right .sidebars-column-1 { + margin-right: 2%; + } + + #widgets-right.single-sidebar .sidebars-column-1, + #widgets-right.single-sidebar .sidebars-column-2 { + float: none; + width: 100%; + margin: 0; + } +} diff --git a/wp-admin/css/widgets.min.css b/wp-admin/css/widgets.min.css new file mode 100644 index 0000000..d896dbe --- /dev/null +++ b/wp-admin/css/widgets.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.widget{margin:0 auto 10px;position:relative;box-sizing:border-box}.widget.open{z-index:99}.widget.open:focus-within{z-index:100}.widget-top{font-size:13px;font-weight:600;background:#f7f7f7}.widget-top .widget-action{border:0;margin:0;padding:10px;background:0 0;cursor:pointer;outline:0}.widget-title h3,.widget-title h4{margin:0;padding:15px;font-size:1em;line-height:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.widgets-holder-wrap .widget-inside{border-top:none;padding:1px 15px 15px 15px;line-height:1.23076923}.widget.widget-dirty .widget-control-close-wrapper{display:none}#available-widgets .widget-description,#widgets-right a.widget-control-edit,.in-widget-title{color:#666}.deleting .widget-title,.deleting .widget-top .widget-action .toggle-indicator:before{color:#a0a5aa}.wp-core-ui .media-widget-control .selected,.wp-core-ui .media-widget-control.selected .not-selected,.wp-core-ui .media-widget-control.selected .placeholder{display:none}.media-widget-control.selected .selected{display:inline-block}.media-widget-buttons{text-align:left;margin-top:0}.media-widget-control .media-widget-buttons .button{width:auto;height:auto;margin-top:12px;white-space:normal}.media-widget-buttons .button:first-child{margin-right:8px}.media-widget-control .attachment-media-view .button-add-media,.media-widget-control .placeholder{border:1px dashed #b4b9be;box-sizing:border-box;cursor:pointer;line-height:1.6;padding:9px 0;position:relative;text-align:center;width:100%}.media-widget-control .attachment-media-view .button-add-media{cursor:pointer;background-color:#edeff0;color:#32373c}.media-widget-control .attachment-media-view .button-add-media:hover{background-color:#fbfbfc}.media-widget-control .attachment-media-view .button-add-media:focus{background-color:#fbfbfc;border-style:solid;border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8);outline:2px solid transparent;outline-offset:-2px}.media-widget-control .media-widget-preview{background:0 0;text-align:center}.media-widget-control .media-widget-preview .notice{text-align:initial}.media-frame .media-widget-embed-notice p code,.media-widget-control .notice p code{padding:0 3px 0 0}.media-frame .media-widget-embed-notice{margin-top:16px}.media-widget-control .media-widget-preview img{max-width:100%;vertical-align:middle;background-image:linear-gradient(45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4),linear-gradient(45deg,#c4c4c4 25%,transparent 25%,transparent 75%,#c4c4c4 75%,#c4c4c4);background-position:0 0,10px 10px;background-size:20px 20px}.media-widget-control .media-widget-preview .wp-video-shortcode{background:#000}.media-frame.media-widget .media-toolbar-secondary{min-width:300px}.media-frame.media-widget .attachment-display-settings .setting.align,.media-frame.media-widget .checkbox-setting.autoplay,.media-frame.media-widget .embed-link-settings .setting.link-text,.media-frame.media-widget .embed-media-settings .legend-inline,.media-frame.media-widget .embed-media-settings .setting.align,.media-frame.media-widget .image-details .embed-media-settings .setting.align,.media-frame.media-widget .replace-attachment{display:none}.media-widget-video-preview{width:100%}.media-widget-video-link{display:inline-block;min-height:132px;width:100%;background:#000}.media-widget-video-link .dashicons{font:normal 60px/1 dashicons;position:relative;width:100%;top:-90px;color:#fff;text-decoration:none}.media-widget-video-link.no-poster .dashicons{top:30px}.media-frame #embed-url-field.invalid,.media-widget-image-link>.link:invalid{border:1px solid #dc3232}.media-widget-image-link{margin:1em 0}.media-widget-gallery-preview{display:flex;justify-content:flex-start;flex-wrap:wrap;margin:-1.79104477%}.media-widget-preview.media_gallery,.media-widget-preview.media_image{cursor:pointer}.media-widget-preview .placeholder{background:#f1f1f1}.media-widget-gallery-preview .gallery-item{box-sizing:border-box;width:50%;margin:0;background:0 0}.media-widget-gallery-preview .gallery-item .gallery-icon{margin:4.5%}.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child,.media-widget-gallery-preview .gallery-item:nth-last-child(3):first-child~.gallery-item,.media-widget-gallery-preview .gallery-item:nth-last-child(n+5),.media-widget-gallery-preview .gallery-item:nth-last-child(n+5)~.gallery-item,.media-widget-gallery-preview .gallery-item:nth-last-child(n+6),.media-widget-gallery-preview .gallery-item:nth-last-child(n+6)~.gallery-item{max-width:33.33%}.media-widget-gallery-preview .gallery-item img{height:auto;vertical-align:bottom}.media-widget-gallery-preview .gallery-icon{position:relative}.media-widget-gallery-preview .gallery-icon-placeholder{position:absolute;top:0;bottom:0;width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:center;background-color:rgba(0,0,0,.5)}.media-widget-gallery-preview .gallery-icon-placeholder-text{font-weight:600;font-size:2em;color:#fff}.widget.ui-draggable-dragging{min-width:100%}.widget.ui-sortable-helper{opacity:.8}.widget-placeholder{border:1px dashed #b4b9be;margin:0 auto 10px;height:45px;width:100%;box-sizing:border-box}#widgets-right .widget-placeholder{margin-top:0}#widgets-right .closed .widget-placeholder{height:0;border:0;margin-top:-10px}.sidebar-name{position:relative;box-sizing:border-box}.js .sidebar-name{cursor:pointer}.sidebar-name .handlediv{float:right;width:38px;height:38px;border:0;margin:0;padding:8px;background:0 0;cursor:pointer;outline:0}#widgets-right .sidebar-name .handlediv{margin:5px 3px 0 0}.sidebar-name .handlediv:focus{box-shadow:none;outline:0}#widgets-left .sidebar-name .toggle-indicator{display:none}#widgets-left .sidebar-name .handlediv:focus .toggle-indicator,#widgets-left .sidebar-name:hover .toggle-indicator,#widgets-left .widgets-holder-wrap.closed .sidebar-name .toggle-indicator{display:block}.sidebar-name .toggle-indicator:before{padding:1px 2px 1px 0;border-radius:50%}.sidebar-name .handlediv:focus .toggle-indicator:before{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.sidebar-name h2,.sidebar-name h3{margin:0;padding:8px 10px;overflow:hidden;white-space:nowrap}.widgets-holder-wrap .description{padding:0 0 15px;margin:0;font-style:normal;color:#72777c}.inactive-sidebar .description,.widget-holder .description{color:#555d66}#widgets-right .widgets-holder-wrap .description{padding-left:7px;padding-right:7px}div.widget-liquid-left{margin:0;width:38%;float:left}div.widget-liquid-right{float:right;width:58%}div#widgets-left{padding-top:12px}div#widgets-left .closed .sidebar-name,div#widgets-left .inactive-sidebar.closed .sidebar-name{margin-bottom:10px}div#widgets-left .sidebar-name h2,div#widgets-left .sidebar-name h3{padding:10px 0;margin:0 10px 0 0}#widgets-left .widgets-holder-wrap,div#widgets-left .widget-holder{background:0 0;border:none}#widgets-left .widgets-holder-wrap{border:none;box-shadow:none}#available-widgets .widget{margin:0}#available-widgets .widget:nth-child(odd){clear:both}#available-widgets .widget .widget-description{display:block;padding:10px 15px;font-size:12px;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}#available-widgets #widget-list{position:relative}#widgets-left .inactive-sidebar{clear:both;width:100%;background:0 0;padding:0;margin:0 0 20px 0;border:none;box-shadow:none}#widgets-left .inactive-sidebar.first{margin-top:40px}div#widgets-left .inactive-sidebar .widget.expanded{left:auto}.widget-title-action{float:right;position:relative}div#widgets-left .inactive-sidebar .widgets-sortables{min-height:42px;padding:0;background:0 0;margin:0;position:relative}div#widgets-right .sidebars-column-1,div#widgets-right .sidebars-column-2{max-width:450px}div#widgets-right .widgets-holder-wrap{margin:10px 0 0 0}div#widgets-right .sidebar-description{min-height:20px;margin-top:-5px}div#widgets-right .sidebar-name h2,div#widgets-right .sidebar-name h3{padding:15px 7px}div#widgets-right .widget-top{padding:0}div#widgets-right .widgets-sortables{padding:0 8px;margin-bottom:9px;position:relative;min-height:123px}div#widgets-right .closed .widgets-sortables{min-height:0;margin-bottom:0}.remove-inactive-widgets .spinner,.sidebar-name .spinner{float:none;position:relative;top:-2px;margin:-5px 5px}#widgets-right .widgets-holder-wrap.widget-hover{border-color:#72777c;box-shadow:0 1px 2px rgba(0,0,0,.3)}.widget-access-link{float:right;margin:-5px 0 10px 10px}.widgets_access #widgets-left .widget .widget-top{cursor:auto}.widgets_access #wpwrap .widget-control-edit,.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description,.widgets_access #wpwrap .widgets-holder-wrap.closed .widget{display:block}.widgets_access #widgets-left .widget .widget-top:hover,.widgets_access #widgets-right .widget .widget-top:hover{border-color:#ddd}#available-widgets .widget-action .edit,#available-widgets .widget-control-edit .edit,#widgets-left .inactive-sidebar .widget-action .add,#widgets-left .inactive-sidebar .widget-control-edit .add,#widgets-right .widget-action .add,#widgets-right .widget-control-edit .add{display:none}.widget-control-edit{display:block;color:#666;background:#eee;padding:0 15px;line-height:3.30769230;border-left:1px solid #ddd}#widgets-left .widget-control-edit:hover,#widgets-right .widget-control-edit:hover{color:#fff;background:#444;border-left:0;outline:1px solid #444}.widgets-holder-wrap .sidebar-description,.widgets-holder-wrap .sidebar-name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.editwidget{margin:0 auto}.editwidget .widget-inside{display:block;padding:0 15px}.editwidget .widget-control-actions{margin-top:20px}.js .closed br.clear,.js .widgets-holder-wrap.closed .description,.js .widgets-holder-wrap.closed .remove-inactive-widgets,.js .widgets-holder-wrap.closed .sidebar-description,.js .widgets-holder-wrap.closed .widget{display:none}.js .widgets-holder-wrap.closed .widget.ui-sortable-helper{display:block}.widget-description,.widget-inside{display:none}.widget-inside{background:#fff}.widget-inside select{max-width:100%}#removing-widget{display:none;font-weight:400;padding-left:15px;font-size:12px;line-height:1;color:#000}.js #removing-widget{color:#00a0d2}#access-off,.no-js .widget-holder .description,.widget-control-noform,.widgets_access #access-on,.widgets_access .handlediv,.widgets_access .widget-action,.widgets_access .widget-holder .description{display:none}.widgets_access #widget-list,.widgets_access .widget-holder{padding-top:10px}.widgets_access #access-off{display:inline}.widgets_access .sidebar-name,.widgets_access .widget .widget-top{cursor:default}.widget-liquid-left #widgets-left.chooser #available-widgets .widget,.widget-liquid-left #widgets-left.chooser .inactive-sidebar{transition:opacity .1s linear}.widget-liquid-left #widgets-left.chooser #available-widgets .widget,.widget-liquid-left #widgets-left.chooser .inactive-sidebar{opacity:.2;pointer-events:none}.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question{opacity:1;pointer-events:auto}#available-widgets .widget-top:hover,#widgets-left .widget-in-question .widget-top,#widgets-left .widget-top:hover,.widgets-chooser ul,div#widgets-right .widget-top:hover{border-color:#999;box-shadow:0 1px 2px rgba(0,0,0,.1)}.widgets-chooser ul.widgets-chooser-sidebars{margin:0;list-style-type:none;max-height:300px;overflow:auto}.widgets-chooser{display:none}.widgets-chooser ul{border:1px solid #ccc}.widgets-chooser li{border-bottom:1px solid #ccc;background:#fff;margin:0;position:relative}.widgets-chooser .widgets-chooser-button{width:100%;padding:10px 15px 10px 35px;background:0 0;border:0;box-sizing:border-box;text-align:left;cursor:pointer;transition:background .2s ease-in-out}.widgets-chooser .widgets-chooser-button:focus,.widgets-chooser .widgets-chooser-button:hover{outline:0;text-decoration:underline}.widgets-chooser li:last-child{border:none}.widgets-chooser .widgets-chooser-selected .widgets-chooser-button{background:#0073aa;color:#fff}.widgets-chooser .widgets-chooser-selected:before{content:"\f147";display:block;-webkit-font-smoothing:antialiased;font:normal 26px/1 dashicons;color:#fff;position:absolute;top:7px;left:5px}.widgets-chooser .widgets-chooser-actions{padding:10px 0 12px 0;text-align:center}#available-widgets .widget .widget-top{cursor:pointer}#available-widgets .widget.ui-draggable-dragging .widget-top{cursor:move}.text-widget-fields{position:relative}.text-widget-fields [hidden]{display:none}.text-widget-fields .wp-pointer.wp-pointer-top{position:absolute;z-index:3;top:100px;right:10px;left:10px}.text-widget-fields .wp-pointer .wp-pointer-arrow{left:auto;right:15px}.text-widget-fields .wp-pointer .wp-pointer-buttons{line-height:1.4}.custom-html-widget-fields>p>.CodeMirror{border:1px solid #e5e5e5}.custom-html-widget-fields code{padding-top:1px;padding-bottom:1px}ul.CodeMirror-hints{z-index:101}.widget-control-actions .custom-html-widget-save-button.button.validation-blocked{cursor:not-allowed}@media screen and (max-width:480px){div.widget-liquid-left{width:100%;float:none;border-right:none;padding-right:0}#widgets-left .sidebar-name{margin-right:0}#widgets-left #available-widgets .widget-top{margin-right:0}#widgets-left .inactive-sidebar .widgets-sortables{margin-right:0}div.widget-liquid-right{width:100%;float:none}div.widget{max-width:480px}.widget-access-link{float:none;margin:15px 0 0 0}}@media screen and (max-width:320px){div.widget{max-width:320px}}@media only screen and (min-width:1250px){#widgets-left #available-widgets .widget{width:49%;float:left}.widget.ui-draggable-dragging{min-width:49%}#widgets-left #available-widgets .widget:nth-child(even){float:right}#widgets-right .sidebars-column-1,#widgets-right .sidebars-column-2{float:left;width:49%}#widgets-right .sidebars-column-1{margin-right:2%}#widgets-right.single-sidebar .sidebars-column-1,#widgets-right.single-sidebar .sidebars-column-2{float:none;width:100%;margin:0}} \ No newline at end of file diff --git a/wp-admin/css/wp-admin-rtl.css b/wp-admin/css/wp-admin-rtl.css new file mode 100644 index 0000000..81d66f6 --- /dev/null +++ b/wp-admin/css/wp-admin-rtl.css @@ -0,0 +1,16 @@ +/*! This file is auto-generated */ +@import url(common-rtl.css); +@import url(forms-rtl.css); +@import url(admin-menu-rtl.css); +@import url(dashboard-rtl.css); +@import url(list-tables-rtl.css); +@import url(edit-rtl.css); +@import url(revisions-rtl.css); +@import url(media-rtl.css); +@import url(themes-rtl.css); +@import url(about-rtl.css); +@import url(nav-menus-rtl.css); +@import url(widgets-rtl.css); +@import url(site-icon-rtl.css); +@import url(l10n-rtl.css); +@import url(site-health-rtl.css); diff --git a/wp-admin/css/wp-admin-rtl.min.css b/wp-admin/css/wp-admin-rtl.min.css new file mode 100644 index 0000000..110850b --- /dev/null +++ b/wp-admin/css/wp-admin-rtl.min.css @@ -0,0 +1,16 @@ +/*! This file is auto-generated */ +@import url(common-rtl.min.css); +@import url(forms-rtl.min.css); +@import url(admin-menu-rtl.min.css); +@import url(dashboard-rtl.min.css); +@import url(list-tables-rtl.min.css); +@import url(edit-rtl.min.css); +@import url(revisions-rtl.min.css); +@import url(media-rtl.min.css); +@import url(themes-rtl.min.css); +@import url(about-rtl.min.css); +@import url(nav-menus-rtl.min.css); +@import url(widgets-rtl.min.css); +@import url(site-icon-rtl.min.css); +@import url(l10n-rtl.min.css); +@import url(site-health-rtl.min.css); diff --git a/wp-admin/css/wp-admin.css b/wp-admin/css/wp-admin.css new file mode 100644 index 0000000..b475cf0 --- /dev/null +++ b/wp-admin/css/wp-admin.css @@ -0,0 +1,15 @@ +@import url(common.css); +@import url(forms.css); +@import url(admin-menu.css); +@import url(dashboard.css); +@import url(list-tables.css); +@import url(edit.css); +@import url(revisions.css); +@import url(media.css); +@import url(themes.css); +@import url(about.css); +@import url(nav-menus.css); +@import url(widgets.css); +@import url(site-icon.css); +@import url(l10n.css); +@import url(site-health.css); diff --git a/wp-admin/css/wp-admin.min.css b/wp-admin/css/wp-admin.min.css new file mode 100644 index 0000000..2fdbba5 --- /dev/null +++ b/wp-admin/css/wp-admin.min.css @@ -0,0 +1,16 @@ +/*! This file is auto-generated */ +@import url(common.min.css); +@import url(forms.min.css); +@import url(admin-menu.min.css); +@import url(dashboard.min.css); +@import url(list-tables.min.css); +@import url(edit.min.css); +@import url(revisions.min.css); +@import url(media.min.css); +@import url(themes.min.css); +@import url(about.min.css); +@import url(nav-menus.min.css); +@import url(widgets.min.css); +@import url(site-icon.min.css); +@import url(l10n.min.css); +@import url(site-health.min.css); diff --git a/wp-admin/custom-background.php b/wp-admin/custom-background.php new file mode 100644 index 0000000..37b8c3d --- /dev/null +++ b/wp-admin/custom-background.php @@ -0,0 +1,15 @@ +' . __( 'You need a higher level of permission.' ) . '' . + '

      ' . __( 'Sorry, you are not allowed to customize this site.' ) . '

      ', + 403 + ); +} + +/** + * @global WP_Scripts $wp_scripts + * @global WP_Customize_Manager $wp_customize + */ +global $wp_scripts, $wp_customize; + +if ( $wp_customize->changeset_post_id() ) { + $changeset_post = get_post( $wp_customize->changeset_post_id() ); + + if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post->ID ) ) { + wp_die( + '

      ' . __( 'You need a higher level of permission.' ) . '

      ' . + '

      ' . __( 'Sorry, you are not allowed to edit this changeset.' ) . '

      ', + 403 + ); + } + + $missed_schedule = ( + 'future' === $changeset_post->post_status && + get_post_time( 'G', true, $changeset_post ) < time() + ); + if ( $missed_schedule ) { + /* + * Note that an Ajax request spawns here instead of just calling `wp_publish_post( $changeset_post->ID )`. + * + * Because WP_Customize_Manager is not instantiated for customize.php with the `settings_previewed=false` + * argument, settings cannot be reliably saved. Some logic short-circuits if the current value is the + * same as the value being saved. This is particularly true for options via `update_option()`. + * + * By opening an Ajax request, this is avoided and the changeset is published. See #39221. + */ + $nonces = $wp_customize->get_nonces(); + $request_args = array( + 'nonce' => $nonces['save'], + 'customize_changeset_uuid' => $wp_customize->changeset_uuid(), + 'wp_customize' => 'on', + 'customize_changeset_status' => 'publish', + ); + ob_start(); + ?> + + + ' . __( 'Your scheduled changes just published' ) . '' . + '

      ' . __( 'Customize New Changes' ) . '

      ' . $script, + 200 + ); + } + + if ( in_array( get_post_status( $changeset_post->ID ), array( 'publish', 'trash' ), true ) ) { + wp_die( + '

      ' . __( 'Something went wrong.' ) . '

      ' . + '

      ' . __( 'This changeset cannot be further modified.' ) . '

      ' . + '

      ' . __( 'Customize New Changes' ) . '

      ', + 403 + ); + } +} + + +wp_reset_vars( array( 'url', 'return', 'autofocus' ) ); +if ( ! empty( $url ) ) { + $wp_customize->set_preview_url( wp_unslash( $url ) ); +} +if ( ! empty( $return ) ) { + $wp_customize->set_return_url( wp_unslash( $return ) ); +} +if ( ! empty( $autofocus ) && is_array( $autofocus ) ) { + $wp_customize->set_autofocus( wp_unslash( $autofocus ) ); +} + +$registered = $wp_scripts->registered; +$wp_scripts = new WP_Scripts; +$wp_scripts->registered = $registered; + +add_action( 'customize_controls_print_scripts', 'print_head_scripts', 20 ); +add_action( 'customize_controls_print_footer_scripts', '_wp_footer_scripts' ); +add_action( 'customize_controls_print_styles', 'print_admin_styles', 20 ); + +/** + * Fires when Customizer controls are initialized, before scripts are enqueued. + * + * @since 3.4.0 + */ +do_action( 'customize_controls_init' ); + +wp_enqueue_script( 'heartbeat' ); +wp_enqueue_script( 'customize-controls' ); +wp_enqueue_style( 'customize-controls' ); + +/** + * Enqueue Customizer control scripts. + * + * @since 3.4.0 + */ +do_action( 'customize_controls_enqueue_scripts' ); + +// Let's roll. +header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) ); + +wp_user_settings(); +_wp_admin_html_begin(); + +$body_class = 'wp-core-ui wp-customizer js'; + +if ( wp_is_mobile() ) : + $body_class .= ' mobile'; + + ?> + + is_ios() ) { + $body_class .= ' ios'; +} + +if ( is_rtl() ) { + $body_class .= ' rtl'; +} +$body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) ); + +$admin_title = sprintf( $wp_customize->get_document_title_template(), __( 'Loading…' ) ); + +?> +<?php echo $admin_title; ?> + + + + + + +
      +
      +
      + is_theme_active() ? __( 'Publish' ) : __( 'Activate & Publish' ); ?> +
      + + +
      + + + + + +
      + +
      +
      +
      +
      +
      + +
      +
      +
        +
        +
        +
        +
        + + ' . get_bloginfo( 'name', 'display' ) . '' ); + ?> + + +
        +
        + +
        +
        + +
        +
        +
        +
        +
        + + +
        +
        + +
        + + diff --git a/wp-admin/edit-comments.php b/wp-admin/edit-comments.php new file mode 100644 index 0000000..d74fd62 --- /dev/null +++ b/wp-admin/edit-comments.php @@ -0,0 +1,354 @@ +' . __( 'You need a higher level of permission.' ) . '' . + '

        ' . __( 'Sorry, you are not allowed to edit comments.' ) . '

        ', + 403 + ); +} + +$wp_list_table = _get_list_table( 'WP_Comments_List_Table' ); +$pagenum = $wp_list_table->get_pagenum(); + +$doaction = $wp_list_table->current_action(); + +if ( $doaction ) { + check_admin_referer( 'bulk-comments' ); + + if ( 'delete_all' == $doaction && ! empty( $_REQUEST['pagegen_timestamp'] ) ) { + $comment_status = wp_unslash( $_REQUEST['comment_status'] ); + $delete_time = wp_unslash( $_REQUEST['pagegen_timestamp'] ); + $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_approved = %s AND %s > comment_date_gmt", $comment_status, $delete_time ) ); + $doaction = 'delete'; + } elseif ( isset( $_REQUEST['delete_comments'] ) ) { + $comment_ids = $_REQUEST['delete_comments']; + $doaction = ( -1 != $_REQUEST['action'] ) ? $_REQUEST['action'] : $_REQUEST['action2']; + } elseif ( isset( $_REQUEST['ids'] ) ) { + $comment_ids = array_map( 'absint', explode( ',', $_REQUEST['ids'] ) ); + } elseif ( wp_get_referer() ) { + wp_safe_redirect( wp_get_referer() ); + exit; + } + + $approved = 0; + $unapproved = 0; + $spammed = 0; + $unspammed = 0; + $trashed = 0; + $untrashed = 0; + $deleted = 0; + + $redirect_to = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'spammed', 'unspammed', 'approved', 'unapproved', 'ids' ), wp_get_referer() ); + $redirect_to = add_query_arg( 'paged', $pagenum, $redirect_to ); + + wp_defer_comment_counting( true ); + + foreach ( $comment_ids as $comment_id ) { // Check the permissions on each. + if ( ! current_user_can( 'edit_comment', $comment_id ) ) { + continue; + } + + switch ( $doaction ) { + case 'approve': + wp_set_comment_status( $comment_id, 'approve' ); + $approved++; + break; + case 'unapprove': + wp_set_comment_status( $comment_id, 'hold' ); + $unapproved++; + break; + case 'spam': + wp_spam_comment( $comment_id ); + $spammed++; + break; + case 'unspam': + wp_unspam_comment( $comment_id ); + $unspammed++; + break; + case 'trash': + wp_trash_comment( $comment_id ); + $trashed++; + break; + case 'untrash': + wp_untrash_comment( $comment_id ); + $untrashed++; + break; + case 'delete': + wp_delete_comment( $comment_id ); + $deleted++; + break; + } + } + + if ( ! in_array( $doaction, array( 'approve', 'unapprove', 'spam', 'unspam', 'trash', 'delete' ), true ) ) { + $screen = get_current_screen()->id; + + /** This action is documented in wp-admin/edit.php */ + $redirect_to = apply_filters( "handle_bulk_actions-{$screen}", $redirect_to, $doaction, $comment_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } + + wp_defer_comment_counting( false ); + + if ( $approved ) { + $redirect_to = add_query_arg( 'approved', $approved, $redirect_to ); + } + if ( $unapproved ) { + $redirect_to = add_query_arg( 'unapproved', $unapproved, $redirect_to ); + } + if ( $spammed ) { + $redirect_to = add_query_arg( 'spammed', $spammed, $redirect_to ); + } + if ( $unspammed ) { + $redirect_to = add_query_arg( 'unspammed', $unspammed, $redirect_to ); + } + if ( $trashed ) { + $redirect_to = add_query_arg( 'trashed', $trashed, $redirect_to ); + } + if ( $untrashed ) { + $redirect_to = add_query_arg( 'untrashed', $untrashed, $redirect_to ); + } + if ( $deleted ) { + $redirect_to = add_query_arg( 'deleted', $deleted, $redirect_to ); + } + if ( $trashed || $spammed ) { + $redirect_to = add_query_arg( 'ids', join( ',', $comment_ids ), $redirect_to ); + } + + wp_safe_redirect( $redirect_to ); + exit; +} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) { + wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); + exit; +} + +$wp_list_table->prepare_items(); + +wp_enqueue_script( 'admin-comments' ); +enqueue_comment_hotkeys_js(); + +if ( $post_id ) { + $comments_count = wp_count_comments( $post_id ); + $draft_or_post_title = wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '…' ); + if ( $comments_count->moderated > 0 ) { + $title = sprintf( + /* translators: 1: Comments count, 2: Post title. */ + __( 'Comments (%1$s) on “%2$s”' ), + number_format_i18n( $comments_count->moderated ), + $draft_or_post_title + ); + } else { + $title = sprintf( + /* translators: %s: Post title. */ + __( 'Comments on “%s”' ), + $draft_or_post_title + ); + } +} else { + $comments_count = wp_count_comments(); + if ( $comments_count->moderated > 0 ) { + $title = sprintf( + /* translators: %s: Comments count. */ + __( 'Comments (%s)' ), + number_format_i18n( $comments_count->moderated ) + ); + } else { + $title = __( 'Comments' ); + } +} + +add_screen_option( 'per_page' ); + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

        ' . __( 'You can manage comments made on your site similar to the way you manage posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the Bulk Actions.' ) . '

        ', + ) +); +get_current_screen()->add_help_tab( + array( + 'id' => 'moderating-comments', + 'title' => __( 'Moderating Comments' ), + 'content' => + '

        ' . __( 'A red bar on the left means the comment is waiting for you to moderate it.' ) . '

        ' . + '

        ' . __( 'In the Author column, in addition to the author’s name, email address, and blog URL, the commenter’s IP address is shown. Clicking on this link will show you all the comments made from this IP address.' ) . '

        ' . + '

        ' . __( 'In the Comment column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment.' ) . '

        ' . + '

        ' . __( 'In the In Response To column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post.' ) . '

        ' . + '

        ' . __( 'In the Submitted On column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site.' ) . '

        ' . + '

        ' . __( 'Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more.' ) . '

        ', + ) +); + +get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Comments' ) . '

        ' . + '

        ' . __( 'Documentation on Comment Spam' ) . '

        ' . + '

        ' . __( 'Documentation on Keyboard Shortcuts' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' +); + +get_current_screen()->set_screen_reader_content( + array( + 'heading_views' => __( 'Filter comments list' ), + 'heading_pagination' => __( 'Comments list navigation' ), + 'heading_list' => __( 'Comments list' ), + ) +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
        +

        +%2$s', + get_edit_post_link( $post_id ), + wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '…' ) + ) + ); +} else { + _e( 'Comments' ); +} +?> +

        + +'; + printf( + /* translators: %s: Search query. */ + __( 'Search results for “%s”' ), + wp_html_excerpt( esc_html( wp_unslash( $_REQUEST['s'] ) ), 50, '…' ) + ); + echo ''; +} +?> + +
        + +

        ' . $error_msg . '

        '; + } +} + +if ( isset( $_REQUEST['approved'] ) || isset( $_REQUEST['deleted'] ) || isset( $_REQUEST['trashed'] ) || isset( $_REQUEST['untrashed'] ) || isset( $_REQUEST['spammed'] ) || isset( $_REQUEST['unspammed'] ) || isset( $_REQUEST['same'] ) ) { + $approved = isset( $_REQUEST['approved'] ) ? (int) $_REQUEST['approved'] : 0; + $deleted = isset( $_REQUEST['deleted'] ) ? (int) $_REQUEST['deleted'] : 0; + $trashed = isset( $_REQUEST['trashed'] ) ? (int) $_REQUEST['trashed'] : 0; + $untrashed = isset( $_REQUEST['untrashed'] ) ? (int) $_REQUEST['untrashed'] : 0; + $spammed = isset( $_REQUEST['spammed'] ) ? (int) $_REQUEST['spammed'] : 0; + $unspammed = isset( $_REQUEST['unspammed'] ) ? (int) $_REQUEST['unspammed'] : 0; + $same = isset( $_REQUEST['same'] ) ? (int) $_REQUEST['same'] : 0; + + if ( $approved > 0 || $deleted > 0 || $trashed > 0 || $untrashed > 0 || $spammed > 0 || $unspammed > 0 || $same > 0 ) { + if ( $approved > 0 ) { + /* translators: %s: Number of comments. */ + $messages[] = sprintf( _n( '%s comment approved.', '%s comments approved.', $approved ), $approved ); + } + + if ( $spammed > 0 ) { + $ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0; + /* translators: %s: Number of comments. */ + $messages[] = sprintf( _n( '%s comment marked as spam.', '%s comments marked as spam.', $spammed ), $spammed ) . ' ' . __( 'Undo' ) . '
        '; + } + + if ( $unspammed > 0 ) { + /* translators: %s: Number of comments. */ + $messages[] = sprintf( _n( '%s comment restored from the spam.', '%s comments restored from the spam.', $unspammed ), $unspammed ); + } + + if ( $trashed > 0 ) { + $ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0; + /* translators: %s: Number of comments. */ + $messages[] = sprintf( _n( '%s comment moved to the Trash.', '%s comments moved to the Trash.', $trashed ), $trashed ) . ' ' . __( 'Undo' ) . '
        '; + } + + if ( $untrashed > 0 ) { + /* translators: %s: Number of comments. */ + $messages[] = sprintf( _n( '%s comment restored from the Trash.', '%s comments restored from the Trash.', $untrashed ), $untrashed ); + } + + if ( $deleted > 0 ) { + /* translators: %s: Number of comments. */ + $messages[] = sprintf( _n( '%s comment permanently deleted.', '%s comments permanently deleted.', $deleted ), $deleted ); + } + + if ( $same > 0 ) { + $comment = get_comment( $same ); + if ( $comment ) { + switch ( $comment->comment_approved ) { + case '1': + $messages[] = __( 'This comment is already approved.' ) . ' ' . __( 'Edit comment' ) . ''; + break; + case 'trash': + $messages[] = __( 'This comment is already in the Trash.' ) . ' ' . __( 'View Trash' ) . ''; + break; + case 'spam': + $messages[] = __( 'This comment is already marked as spam.' ) . ' ' . __( 'Edit comment' ) . ''; + break; + } + } + } + + echo '

        ' . implode( "
        \n", $messages ) . '

        '; + } +} +?> + +views(); ?> + +
        + +search_box( __( 'Search Comments' ), 'comment' ); ?> + + + + + + + + + + + + + + + +display(); ?> +
        +
        + +
        + + diff --git a/wp-admin/edit-form-advanced.php b/wp-admin/edit-form-advanced.php new file mode 100644 index 0000000..1489943 --- /dev/null +++ b/wp-admin/edit-form-advanced.php @@ -0,0 +1,731 @@ +is_block_editor( false ); + +if ( is_multisite() ) { + add_action( 'admin_footer', '_admin_notice_post_locked' ); +} else { + $check_users = get_users( + array( + 'fields' => 'ID', + 'number' => 2, + ) + ); + + if ( count( $check_users ) > 1 ) { + add_action( 'admin_footer', '_admin_notice_post_locked' ); + } + + unset( $check_users ); +} + +wp_enqueue_script( 'post' ); + +$_wp_editor_expand = false; +$_content_editor_dfw = false; + +/** + * Filters whether to enable the 'expand' functionality in the post editor. + * + * @since 4.0.0 + * @since 4.1.0 Added the `$post_type` parameter. + * + * @param bool $expand Whether to enable the 'expand' functionality. Default true. + * @param string $post_type Post type. + */ +if ( post_type_supports( $post_type, 'editor' ) && ! wp_is_mobile() && + ! ( $is_IE && preg_match( '/MSIE [5678]/', $_SERVER['HTTP_USER_AGENT'] ) ) && + apply_filters( 'wp_editor_expand', true, $post_type ) ) { + + wp_enqueue_script( 'editor-expand' ); + $_content_editor_dfw = true; + $_wp_editor_expand = ( get_user_setting( 'editor_expand', 'on' ) === 'on' ); +} + +if ( wp_is_mobile() ) { + wp_enqueue_script( 'jquery-touch-punch' ); +} + +/** + * Post ID global + * + * @name $post_ID + * @var int + */ +$post_ID = isset( $post_ID ) ? (int) $post_ID : 0; +$user_ID = isset( $user_ID ) ? (int) $user_ID : 0; +$action = isset( $action ) ? $action : ''; + +if ( get_option( 'page_for_posts' ) == $post_ID && empty( $post->post_content ) ) { + add_action( 'edit_form_after_title', '_wp_posts_page_notice' ); + remove_post_type_support( $post_type, 'editor' ); +} + +$thumbnail_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' ); +if ( ! $thumbnail_support && 'attachment' === $post_type && $post->post_mime_type ) { + if ( wp_attachment_is( 'audio', $post ) ) { + $thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' ); + } elseif ( wp_attachment_is( 'video', $post ) ) { + $thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' ); + } +} + +if ( $thumbnail_support ) { + add_thickbox(); + wp_enqueue_media( array( 'post' => $post_ID ) ); +} + +// Add the local autosave notice HTML. +add_action( 'admin_footer', '_local_storage_notice' ); + +/* + * @todo Document the $messages array(s). + */ +$permalink = get_permalink( $post_ID ); +if ( ! $permalink ) { + $permalink = ''; +} + +$messages = array(); + +$preview_post_link_html = ''; +$scheduled_post_link_html = ''; +$view_post_link_html = ''; + +$preview_page_link_html = ''; +$scheduled_page_link_html = ''; +$view_page_link_html = ''; + +$preview_url = get_preview_post_link( $post ); + +$viewable = is_post_type_viewable( $post_type_object ); + +if ( $viewable ) { + + // Preview post link. + $preview_post_link_html = sprintf( + ' %2$s', + esc_url( $preview_url ), + __( 'Preview post' ) + ); + + // Scheduled post preview link. + $scheduled_post_link_html = sprintf( + ' %2$s', + esc_url( $permalink ), + __( 'Preview post' ) + ); + + // View post link. + $view_post_link_html = sprintf( + ' %2$s', + esc_url( $permalink ), + __( 'View post' ) + ); + + // Preview page link. + $preview_page_link_html = sprintf( + ' %2$s', + esc_url( $preview_url ), + __( 'Preview page' ) + ); + + // Scheduled page preview link. + $scheduled_page_link_html = sprintf( + ' %2$s', + esc_url( $permalink ), + __( 'Preview page' ) + ); + + // View page link. + $view_page_link_html = sprintf( + ' %2$s', + esc_url( $permalink ), + __( 'View page' ) + ); + +} + +$scheduled_date = sprintf( + /* translators: Publish box date string. 1: Date, 2: Time. */ + __( '%1$s at %2$s' ), + /* translators: Publish box date format, see https://www.php.net/date */ + date_i18n( _x( 'M j, Y', 'publish box date format' ), strtotime( $post->post_date ) ), + /* translators: Publish box time format, see https://www.php.net/date */ + date_i18n( _x( 'H:i', 'publish box time format' ), strtotime( $post->post_date ) ) +); + +$messages['post'] = array( + 0 => '', // Unused. Messages start at index 1. + 1 => __( 'Post updated.' ) . $view_post_link_html, + 2 => __( 'Custom field updated.' ), + 3 => __( 'Custom field deleted.' ), + 4 => __( 'Post updated.' ), + /* translators: %s: Date and time of the revision. */ + 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Post restored to revision from %s.' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, + 6 => __( 'Post published.' ) . $view_post_link_html, + 7 => __( 'Post saved.' ), + 8 => __( 'Post submitted.' ) . $preview_post_link_html, + /* translators: %s: Scheduled date for the post. */ + 9 => sprintf( __( 'Post scheduled for: %s.' ), '' . $scheduled_date . '' ) . $scheduled_post_link_html, + 10 => __( 'Post draft updated.' ) . $preview_post_link_html, +); +$messages['page'] = array( + 0 => '', // Unused. Messages start at index 1. + 1 => __( 'Page updated.' ) . $view_page_link_html, + 2 => __( 'Custom field updated.' ), + 3 => __( 'Custom field deleted.' ), + 4 => __( 'Page updated.' ), + /* translators: %s: Date and time of the revision. */ + 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Page restored to revision from %s.' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, + 6 => __( 'Page published.' ) . $view_page_link_html, + 7 => __( 'Page saved.' ), + 8 => __( 'Page submitted.' ) . $preview_page_link_html, + /* translators: %s: Scheduled date for the page. */ + 9 => sprintf( __( 'Page scheduled for: %s.' ), '' . $scheduled_date . '' ) . $scheduled_page_link_html, + 10 => __( 'Page draft updated.' ) . $preview_page_link_html, +); +$messages['attachment'] = array_fill( 1, 10, __( 'Media file updated.' ) ); // Hack, for now. + +/** + * Filters the post updated messages. + * + * @since 3.0.0 + * + * @param array[] $messages Post updated messages. For defaults see `$messages` declarations above. + */ +$messages = apply_filters( 'post_updated_messages', $messages ); + +$message = false; +if ( isset( $_GET['message'] ) ) { + $_GET['message'] = absint( $_GET['message'] ); + if ( isset( $messages[ $post_type ][ $_GET['message'] ] ) ) { + $message = $messages[ $post_type ][ $_GET['message'] ]; + } elseif ( ! isset( $messages[ $post_type ] ) && isset( $messages['post'][ $_GET['message'] ] ) ) { + $message = $messages['post'][ $_GET['message'] ]; + } +} + +$notice = false; +$form_extra = ''; +if ( 'auto-draft' == $post->post_status ) { + if ( 'edit' == $action ) { + $post->post_title = ''; + } + $autosave = false; + $form_extra .= ""; +} else { + $autosave = wp_get_post_autosave( $post_ID ); +} + +$form_action = 'editpost'; +$nonce_action = 'update-post_' . $post_ID; +$form_extra .= ""; + +// Detect if there exists an autosave newer than the post and if that autosave is different than the post. +if ( $autosave && mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) { + foreach ( _wp_post_revision_fields( $post ) as $autosave_field => $_autosave_field ) { + if ( normalize_whitespace( $autosave->$autosave_field ) !== normalize_whitespace( $post->$autosave_field ) ) { + $notice = sprintf( + /* translators: %s: URL to view the autosave. */ + __( 'There is an autosave of this post that is more recent than the version below. View the autosave' ), + get_edit_post_link( $autosave->ID ) + ); + break; + } + } + // If this autosave isn't different from the current post, begone. + if ( ! $notice ) { + wp_delete_post_revision( $autosave->ID ); + } + unset( $autosave_field, $_autosave_field ); +} + +$post_type_object = get_post_type_object( $post_type ); + +// All meta boxes should be defined and added before the first do_meta_boxes() call (or potentially during the do_meta_boxes action). +require_once ABSPATH . 'wp-admin/includes/meta-boxes.php'; + +register_and_do_post_meta_boxes( $post ); + +add_screen_option( + 'layout_columns', + array( + 'max' => 2, + 'default' => 2, + ) +); + +if ( 'post' == $post_type ) { + $customize_display = '

        ' . __( 'The title field and the big Post Editing Area are fixed in place, but you can reposition all the other boxes using drag and drop. You can also minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen.' ) . '

        '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'customize-display', + 'title' => __( 'Customizing This Display' ), + 'content' => $customize_display, + ) + ); + + $title_and_editor = '

        ' . __( 'Title — Enter a title for your post. After you enter a title, you’ll see the permalink below, which you can edit.' ) . '

        '; + $title_and_editor .= '

        ' . __( 'Post editor — Enter the text for your post. There are two modes of editing: Visual and Text. Choose the mode by clicking on the appropriate tab.' ) . '

        '; + $title_and_editor .= '

        ' . __( 'Visual mode gives you an editor that is similar to a word processor. Click the Toolbar Toggle button to get a second row of controls.' ) . '

        '; + $title_and_editor .= '

        ' . __( 'The Text mode allows you to enter HTML along with your post text. Note that <p> and <br> tags are converted to line breaks when switching to the Text editor to make it less cluttered. When you type, a single line break can be used instead of typing <br>, and two line breaks instead of paragraph tags. The line breaks are converted back to tags automatically.' ) . '

        '; + $title_and_editor .= '

        ' . __( 'You can insert media files by clicking the button above the post editor and following the directions. You can align or edit images using the inline formatting toolbar available in Visual mode.' ) . '

        '; + $title_and_editor .= '

        ' . __( 'You can enable distraction-free writing mode using the icon to the right. This feature is not available for old browsers or devices with small screens, and requires that the full-height editor be enabled in Screen Options.' ) . '

        '; + $title_and_editor .= '

        ' . __( 'Keyboard users: When you’re working in the visual editor, you can use Alt + F10 to access the toolbar.' ) . '

        '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'title-post-editor', + 'title' => __( 'Title and Post Editor' ), + 'content' => $title_and_editor, + ) + ); + + get_current_screen()->set_help_sidebar( + '

        ' . sprintf( + /* translators: %s: URL to Press This bookmarklet. */ + __( 'You can also create posts with the Press This bookmarklet.' ), + 'tools.php' + ) . '

        ' . + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Writing and Editing Posts' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' + ); +} elseif ( 'page' == $post_type ) { + $about_pages = '

        ' . __( 'Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the “Parent” of the other, creating a group of pages.' ) . '

        ' . + '

        ' . __( 'Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Text modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box.' ) . '

        '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'about-pages', + 'title' => __( 'About Pages' ), + 'content' => $about_pages, + ) + ); + + get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Adding New Pages' ) . '

        ' . + '

        ' . __( 'Documentation on Editing Pages' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' + ); +} elseif ( 'attachment' == $post_type ) { + get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

        ' . __( 'This screen allows you to edit fields for metadata in a file within the media library.' ) . '

        ' . + '

        ' . __( 'For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information.' ) . '

        ' . + '

        ' . __( 'Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping.' ) . '

        ' . + '

        ' . __( 'Remember to click Update Media to save metadata entered or changed.' ) . '

        ', + ) + ); + + get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Edit Media' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' + ); +} + +if ( 'post' == $post_type || 'page' == $post_type ) { + $inserting_media = '

        ' . __( 'You can upload and insert media (images, audio, documents, etc.) by clicking the Add Media button. You can select from the images and files already uploaded to the Media Library, or upload new media to add to your page or post. To create an image gallery, select the images to add and click the “Create a new gallery” button.' ) . '

        '; + $inserting_media .= '

        ' . __( 'You can also embed media from many popular websites including Twitter, YouTube, Flickr and others by pasting the media URL on its own line into the content of your post/page. Learn more about embeds.' ) . '

        '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'inserting-media', + 'title' => __( 'Inserting Media' ), + 'content' => $inserting_media, + ) + ); +} + +if ( 'post' == $post_type ) { + $publish_box = '

        ' . __( 'Several boxes on this screen contain settings for how your content will be published, including:' ) . '

        '; + $publish_box .= '
        • ' . + __( 'Publish — You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). The Password protected option allows you to set an arbitrary password for each post. The Private option hides the post from everyone except editors and administrators. Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post.' ) . + '
        • '; + + if ( current_theme_supports( 'post-formats' ) && post_type_supports( 'post', 'post-formats' ) ) { + $publish_box .= '
        • ' . __( 'Format — Post Formats designate how your theme will display a specific post. For example, you could have a standard blog post with a title and paragraphs, or a short aside that omits the title and contains a short text blurb. Your theme could enable all or some of 10 possible formats. Learn more about each post format.' ) . '
        • '; + } + + if ( current_theme_supports( 'post-thumbnails' ) && post_type_supports( 'post', 'thumbnail' ) ) { + $publish_box .= '
        • ' . sprintf( + /* translators: %s: Featured image. */ + __( '%s — This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the image as a post thumbnail on the home page, a custom header, etc.' ), + esc_html( $post_type_object->labels->featured_image ) + ) . '
        • '; + } + + $publish_box .= '
        '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'publish-box', + 'title' => __( 'Publish Settings' ), + 'content' => $publish_box, + ) + ); + + $discussion_settings = '

        ' . __( 'Send Trackbacks — Trackbacks are a way to notify legacy blog systems that you’ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they’ll be notified automatically using pingbacks, and this field is unnecessary.' ) . '

        '; + $discussion_settings .= '

        ' . __( 'Discussion — You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them.' ) . '

        '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'discussion-settings', + 'title' => __( 'Discussion Settings' ), + 'content' => $discussion_settings, + ) + ); +} elseif ( 'page' == $post_type ) { + $page_attributes = '

        ' . __( 'Parent — You can arrange your pages in hierarchies. For example, you could have an “About” page that has “Life Story” and “My Dog” pages under it. There are no limits to how many levels you can nest pages.' ) . '

        ' . + '

        ' . __( 'Template — Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you’ll see them in this dropdown menu.' ) . '

        ' . + '

        ' . __( 'Order — Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field.' ) . '

        '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'page-attributes', + 'title' => __( 'Page Attributes' ), + 'content' => $page_attributes, + ) + ); +} + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
        +

        + +

        + +cap->create_posts ) ) { + echo ' ' . esc_html( $post_type_object->labels->add_new ) . ''; +} +?> + +
        + + +

        + + +

        + + +
        +> + + + + + + + + + + + + + + +
        +
        +
        + + +
        +
        + + + +
        + +
        + public ? get_sample_permalink_html( $post->ID ) : ''; + + // As of 4.4, the Get Shortlink button is hidden by default. + if ( has_filter( 'pre_get_shortlink' ) || has_filter( 'get_shortlink' ) ) { + $shortlink = wp_get_shortlink( $post->ID, 'post' ); + + if ( ! empty( $shortlink ) && $shortlink !== $permalink && home_url( '?page_id=' . $post->ID ) !== $permalink ) { + $sample_permalink_html .= ''; + } + } + + if ( $post_type_object->public && ! ( 'pending' == get_post_status( $post ) && ! current_user_can( $post_type_object->cap->publish_posts ) ) ) { + $has_sample_permalink = $sample_permalink_html && 'auto-draft' != $post->post_status; + ?> +
        + +
        + +
        + +
        + +
        + + post_content, + 'content', + array( + '_content_editor_dfw' => $_content_editor_dfw, + 'drag_drop_upload' => true, + 'tabfocus_elements' => 'content-html,save-post', + 'editor_height' => 300, + 'tinymce' => array( + 'resize' => false, + 'wp_autoresize_on' => $_wp_editor_expand, + 'add_unload_trigger' => false, + 'wp_keep_scroll_position' => ! $is_IE, + ), + ) + ); + ?> + + + + +
        + 0' + ); + ?> + +   + post_status ) { + echo ''; + $last_user = get_userdata( get_post_meta( $post_ID, '_edit_last', true ) ); + if ( $last_user ) { + /* translators: 1: Name of most recent post author, 2: Post edited date, 3: Post edited time. */ + printf( __( 'Last edited by %1$s on %2$s at %3$s' ), esc_html( $last_user->display_name ), mysql2date( __( 'F j, Y' ), $post->post_modified ), mysql2date( __( 'g:i a' ), $post->post_modified ) ); + } else { + /* translators: 1: Post edited date, 2: Post edited time. */ + printf( __( 'Last edited on %1$s at %2$s' ), mysql2date( __( 'F j, Y' ), $post->post_modified ), mysql2date( __( 'g:i a' ), $post->post_modified ) ); + } + echo ''; + } + ?> +
        + +
        + +
        + +
        + +
        +
        + +
        + +
        +
        +
        +
        +
        + + + +post_title ) : ?> + + diff --git a/wp-admin/edit-form-blocks.php b/wp-admin/edit-form-blocks.php new file mode 100644 index 0000000..0d690ef --- /dev/null +++ b/wp-admin/edit-form-blocks.php @@ -0,0 +1,456 @@ +is_block_editor( true ); + +/* + * Emoji replacement is disabled for now, until it plays nicely with React. + */ +remove_action( 'admin_print_scripts', 'print_emoji_detection_script' ); + +wp_enqueue_script( 'heartbeat' ); +wp_enqueue_script( 'wp-edit-post' ); +wp_enqueue_script( 'wp-format-library' ); + +$rest_base = ! empty( $post_type_object->rest_base ) ? $post_type_object->rest_base : $post_type_object->name; + +// Preload common data. +$preload_paths = array( + '/', + '/wp/v2/types?context=edit', + '/wp/v2/taxonomies?per_page=-1&context=edit', + '/wp/v2/themes?status=active', + sprintf( '/wp/v2/%s/%s?context=edit', $rest_base, $post->ID ), + sprintf( '/wp/v2/types/%s?context=edit', $post_type ), + sprintf( '/wp/v2/users/me?post_type=%s&context=edit', $post_type ), + array( '/wp/v2/media', 'OPTIONS' ), + array( '/wp/v2/blocks', 'OPTIONS' ), + sprintf( '/wp/v2/%s/%d/autosaves?context=edit', $rest_base, $post->ID ), +); + +/** + * Preload common data by specifying an array of REST API paths that will be preloaded. + * + * Filters the array of paths that will be preloaded. + * + * @since 5.0.0 + * + * @param string[] $preload_paths Array of paths to preload. + * @param WP_Post $post Post being edited. + */ +$preload_paths = apply_filters( 'block_editor_preload_paths', $preload_paths, $post ); + +/* + * Ensure the global $post remains the same after API data is preloaded. + * Because API preloading can call the_content and other filters, plugins + * can unexpectedly modify $post. + */ +$backup_global_post = $post; + +$preload_data = array_reduce( + $preload_paths, + 'rest_preload_api_request', + array() +); + +// Restore the global $post as it was before API preloading. +$post = $backup_global_post; + +wp_add_inline_script( + 'wp-api-fetch', + sprintf( 'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );', wp_json_encode( $preload_data ) ), + 'after' +); + +wp_add_inline_script( + 'wp-blocks', + sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $post ) ) ), + 'after' +); + +/* + * Assign initial edits, if applicable. These are not initially assigned to the persisted post, + * but should be included in its save payload. + */ +$initial_edits = null; +$is_new_post = false; +if ( 'auto-draft' === $post->post_status ) { + $is_new_post = true; + // Override "(Auto Draft)" new post default title with empty string, or filtered value. + $initial_edits = array( + 'title' => $post->post_title, + 'content' => $post->post_content, + 'excerpt' => $post->post_excerpt, + ); +} + +// Preload server-registered block schemas. +wp_add_inline_script( + 'wp-blocks', + 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');' +); + +// Get admin url for handling meta boxes. +$meta_box_url = admin_url( 'post.php' ); +$meta_box_url = add_query_arg( + array( + 'post' => $post->ID, + 'action' => 'edit', + 'meta-box-loader' => true, + 'meta-box-loader-nonce' => wp_create_nonce( 'meta-box-loader' ), + ), + $meta_box_url +); +wp_localize_script( 'wp-editor', '_wpMetaBoxUrl', $meta_box_url ); + + +/* + * Initialize the editor. + */ + +$align_wide = get_theme_support( 'align-wide' ); +$color_palette = current( (array) get_theme_support( 'editor-color-palette' ) ); +$font_sizes = current( (array) get_theme_support( 'editor-font-sizes' ) ); +$gradient_presets = current( (array) get_theme_support( 'editor-gradient-presets' ) ); + +/** + * Filters the allowed block types for the editor, defaulting to true (all + * block types supported). + * + * @since 5.0.0 + * + * @param bool|array $allowed_block_types Array of block type slugs, or + * boolean to enable/disable all. + * @param WP_Post $post The post resource data. + */ +$allowed_block_types = apply_filters( 'allowed_block_types', true, $post ); + +/* + * Get all available templates for the post/page attributes meta-box. + * The "Default template" array element should only be added if the array is + * not empty so we do not trigger the template select element without any options + * besides the default value. + */ +$available_templates = wp_get_theme()->get_page_templates( get_post( $post->ID ) ); +$available_templates = ! empty( $available_templates ) ? array_merge( + array( + /** This filter is documented in wp-admin/includes/meta-boxes.php */ + '' => apply_filters( 'default_page_template_title', __( 'Default template' ), 'rest-api' ), + ), + $available_templates +) : $available_templates; + +// Media settings. +$max_upload_size = wp_max_upload_size(); +if ( ! $max_upload_size ) { + $max_upload_size = 0; +} + +// Editor Styles. +$styles = array( + array( + 'css' => file_get_contents( + ABSPATH . WPINC . '/css/dist/editor/editor-styles.css' + ), + ), +); + +/* translators: Use this to specify the CSS font family for the default font. */ +$locale_font_family = esc_html_x( 'Noto Serif', 'CSS Font Family for Editor Font' ); +$styles[] = array( + 'css' => "body { font-family: '$locale_font_family' }", +); + +if ( $editor_styles && current_theme_supports( 'editor-styles' ) ) { + foreach ( $editor_styles as $style ) { + if ( preg_match( '~^(https?:)?//~', $style ) ) { + $response = wp_remote_get( $style ); + if ( ! is_wp_error( $response ) ) { + $styles[] = array( + 'css' => wp_remote_retrieve_body( $response ), + ); + } + } else { + $file = get_theme_file_path( $style ); + if ( is_file( $file ) ) { + $styles[] = array( + 'css' => file_get_contents( $file ), + 'baseURL' => get_theme_file_uri( $style ), + ); + } + } + } +} + +// Image sizes. + +/** This filter is documented in wp-admin/includes/media.php */ +$image_size_names = apply_filters( + 'image_size_names_choose', + array( + 'thumbnail' => __( 'Thumbnail' ), + 'medium' => __( 'Medium' ), + 'large' => __( 'Large' ), + 'full' => __( 'Full Size' ), + ) +); + +$available_image_sizes = array(); +foreach ( $image_size_names as $image_size_slug => $image_size_name ) { + $available_image_sizes[] = array( + 'slug' => $image_size_slug, + 'name' => $image_size_name, + ); +} + +$image_dimensions = array(); +$all_sizes = wp_get_registered_image_subsizes(); +foreach ( $available_image_sizes as $size ) { + $key = $size['slug']; + if ( isset( $all_sizes[ $key ] ) ) { + $image_dimensions[ $key ] = $all_sizes[ $key ]; + } +} + +// Lock settings. +$user_id = wp_check_post_lock( $post->ID ); +if ( $user_id ) { + $locked = false; + + /** This filter is documented in wp-admin/includes/post.php */ + if ( apply_filters( 'show_post_locked_dialog', true, $post, $user_id ) ) { + $locked = true; + } + + $user_details = null; + if ( $locked ) { + $user = get_userdata( $user_id ); + $user_details = array( + 'name' => $user->display_name, + ); + $avatar = get_avatar_url( $user_id, array( 'size' => 64 ) ); + } + + $lock_details = array( + 'isLocked' => $locked, + 'user' => $user_details, + ); +} else { + // Lock the post. + $active_post_lock = wp_set_post_lock( $post->ID ); + if ( $active_post_lock ) { + $active_post_lock = esc_attr( implode( ':', $active_post_lock ) ); + } + + $lock_details = array( + 'isLocked' => false, + 'activePostLock' => $active_post_lock, + ); +} + +/** + * Filters the body placeholder text. + * + * @since 5.0.0 + * + * @param string $text Placeholder text. Default 'Start writing or type / to choose a block'. + * @param WP_Post $post Post object. + */ +$body_placeholder = apply_filters( 'write_your_story', __( 'Start writing or type / to choose a block' ), $post ); + +$editor_settings = array( + 'alignWide' => $align_wide, + 'availableTemplates' => $available_templates, + 'allowedBlockTypes' => $allowed_block_types, + 'disableCustomColors' => get_theme_support( 'disable-custom-colors' ), + 'disableCustomFontSizes' => get_theme_support( 'disable-custom-font-sizes' ), + 'disableCustomGradients' => get_theme_support( 'disable-custom-gradients' ), + 'disablePostFormats' => ! current_theme_supports( 'post-formats' ), + /** This filter is documented in wp-admin/edit-form-advanced.php */ + 'titlePlaceholder' => apply_filters( 'enter_title_here', __( 'Add title' ), $post ), + 'bodyPlaceholder' => $body_placeholder, + 'isRTL' => is_rtl(), + 'autosaveInterval' => AUTOSAVE_INTERVAL, + 'maxUploadFileSize' => $max_upload_size, + 'allowedMimeTypes' => get_allowed_mime_types(), + 'styles' => $styles, + 'imageSizes' => $available_image_sizes, + 'imageDimensions' => $image_dimensions, + 'richEditingEnabled' => user_can_richedit(), + 'postLock' => $lock_details, + 'postLockUtils' => array( + 'nonce' => wp_create_nonce( 'lock-post_' . $post->ID ), + 'unlockNonce' => wp_create_nonce( 'update-post_' . $post->ID ), + 'ajaxUrl' => admin_url( 'admin-ajax.php' ), + ), + + // Whether or not to load the 'postcustom' meta box is stored as a user meta + // field so that we're not always loading its assets. + 'enableCustomFields' => (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true ), +); + +$autosave = wp_get_post_autosave( $post_ID ); +if ( $autosave ) { + if ( mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) { + $editor_settings['autosave'] = array( + 'editLink' => get_edit_post_link( $autosave->ID ), + ); + } else { + wp_delete_post_revision( $autosave->ID ); + } +} + +if ( false !== $color_palette ) { + $editor_settings['colors'] = $color_palette; +} + +if ( false !== $font_sizes ) { + $editor_settings['fontSizes'] = $font_sizes; +} + +if ( false !== $gradient_presets ) { + $editor_settings['gradients'] = $gradient_presets; +} + +if ( ! empty( $post_type_object->template ) ) { + $editor_settings['template'] = $post_type_object->template; + $editor_settings['templateLock'] = ! empty( $post_type_object->template_lock ) ? $post_type_object->template_lock : false; +} + +// If there's no template set on a new post, use the post format, instead. +if ( $is_new_post && ! isset( $editor_settings['template'] ) && 'post' === $post->post_type ) { + $post_format = get_post_format( $post ); + if ( in_array( $post_format, array( 'audio', 'gallery', 'image', 'quote', 'video' ), true ) ) { + $editor_settings['template'] = array( array( "core/$post_format" ) ); + } +} + +/** + * Scripts + */ +wp_enqueue_media( + array( + 'post' => $post->ID, + ) +); +wp_tinymce_inline_scripts(); +wp_enqueue_editor(); + +/** + * Styles + */ +wp_enqueue_style( 'wp-edit-post' ); +wp_enqueue_style( 'wp-format-library' ); + +/** + * Fires after block assets have been enqueued for the editing interface. + * + * Call `add_action` on any hook before 'admin_enqueue_scripts'. + * + * In the function call you supply, simply use `wp_enqueue_script` and + * `wp_enqueue_style` to add your functionality to the block editor. + * + * @since 5.0.0 + */ +do_action( 'enqueue_block_editor_assets' ); + +// In order to duplicate classic meta box behaviour, we need to run the classic meta box actions. +require_once ABSPATH . 'wp-admin/includes/meta-boxes.php'; +register_and_do_post_meta_boxes( $post ); + +// Check if the Custom Fields meta box has been removed at some point. +$core_meta_boxes = $wp_meta_boxes[ $current_screen->id ]['normal']['core']; +if ( ! isset( $core_meta_boxes['postcustom'] ) || ! $core_meta_boxes['postcustom'] ) { + unset( $editor_settings['enableCustomFields'] ); +} + +/** + * Filters the settings to pass to the block editor. + * + * @since 5.0.0 + * + * @param array $editor_settings Default editor settings. + * @param WP_Post $post Post being edited. + */ +$editor_settings = apply_filters( 'block_editor_settings', $editor_settings, $post ); + +$init_script = <<post_type, + $post->ID, + wp_json_encode( $editor_settings ), + wp_json_encode( $initial_edits ) +); +wp_add_inline_script( 'wp-edit-post', $script ); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
        +

        +
        + + + +
        +

        +
        +

        + Classic Editor plugin.' ), + esc_url( wp_nonce_url( self_admin_url( 'plugin-install.php?tab=favorites&user=wordpressdotorg&save=0' ), 'save_wporg_username_' . get_current_user_id() ) ) + ); + + /** + * Filters the message displayed in the block editor interface when JavaScript is + * not enabled in the browser. + * + * @since 5.0.3 + * + * @param string $message The message being displayed. + * @param WP_Post $post The post being edited. + */ + echo apply_filters( 'block_editor_no_javascript_message', $message, $post ); + ?> +

        +
        +
        +
        diff --git a/wp-admin/edit-form-comment.php b/wp-admin/edit-form-comment.php new file mode 100644 index 0000000..8047a48 --- /dev/null +++ b/wp-admin/edit-form-comment.php @@ -0,0 +1,253 @@ + +
        +comment_ID ); ?> +
        +

        + +
        + + + + +
        +
        +comment_post_ID > 0 ) : + $comment_link = get_comment_link( $comment ); + ?> +
        + +
        + +
        +
        +

        +
        + + + + + + + + + + + + + + + + + +
        +
        +
        + +
        +' . __( 'Comment' ) . ''; + $quicktags_settings = array( 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close' ); + wp_editor( + $comment->comment_content, + 'content', + array( + 'media_buttons' => false, + 'tinymce' => false, + 'quicktags' => $quicktags_settings, + ) + ); + wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); + ?> +
        +
        + +
        +
        +

        +
        +
        +
        + +
        + +
        + +comment_approved ) { + case '1': + _e( 'Approved' ); + break; + case '0': + _e( 'Pending' ); + break; + case 'spam': + _e( 'Spam' ); + break; +} +?> + + +
        + +
        +
        + +
        +
        + +
        +comment_date ) ), + /* translators: Publish box time format, see https://www.php.net/date */ + date_i18n( _x( 'H:i', 'publish box time format' ), strtotime( $comment->comment_date ) ) +); +?> + +' . $submitted . '' ); +?> + + +
        + + +
        +
        + +comment_post_ID; +if ( current_user_can( 'edit_post', $post_id ) ) { + $post_link = ""; + $post_link .= esc_html( get_the_title( $post_id ) ) . ''; +} else { + $post_link = esc_html( get_the_title( $post_id ) ); +} +?> + +
        + ' . $post_link . '' + ); + ?> +
        + +comment_parent ) : + $parent = get_comment( $comment->comment_parent ); + if ( $parent ) : + $parent_link = esc_url( get_comment_link( $parent ) ); + $name = get_comment_author( $parent ); + ?> +
        + ' . $name . '' + ); + ?> +
        + + + + +
        +
        +
        + +
        +
        +comment_ID&_wp_original_http_referer=" . urlencode( wp_get_referer() ), 'delete-comment_' . $comment->comment_ID ) . "'>" . ( ! EMPTY_TRASH_DAYS ? __( 'Delete Permanently' ) : __( 'Move to Trash' ) ) . "\n"; ?> +
        +
        + +
        +
        +
        +
        +
        +
        +
        + +
        + +
        + + + + + + + +
        +
        +
        +
        + + + + Links / Edit Link' ), 'link-manager.php' ); + $submit_text = __( 'Update Link' ); + $form_name = 'editlink'; + $nonce_action = 'update-bookmark_' . $link_id; +} else { + /* translators: %s: URL to Links screen. */ + $heading = sprintf( __( 'Links / Add New Link' ), 'link-manager.php' ); + $submit_text = __( 'Add Link' ); + $form_name = 'addlink'; + $nonce_action = 'add-bookmark'; +} + +require_once ABSPATH . 'wp-admin/includes/meta-boxes.php'; + +add_meta_box( 'linksubmitdiv', __( 'Save' ), 'link_submit_meta_box', null, 'side', 'core' ); +add_meta_box( 'linkcategorydiv', __( 'Categories' ), 'link_categories_meta_box', null, 'normal', 'core' ); +add_meta_box( 'linktargetdiv', __( 'Target' ), 'link_target_meta_box', null, 'normal', 'core' ); +add_meta_box( 'linkxfndiv', __( 'Link Relationship (XFN)' ), 'link_xfn_meta_box', null, 'normal', 'core' ); +add_meta_box( 'linkadvanceddiv', __( 'Advanced' ), 'link_advanced_meta_box', null, 'normal', 'core' ); + +/** This action is documented in wp-admin/includes/meta-boxes.php */ +do_action( 'add_meta_boxes', 'link', $link ); + +/** + * Fires when link-specific meta boxes are added. + * + * @since 3.0.0 + * + * @param object $link Link object. + */ +do_action( 'add_meta_boxes_link', $link ); + +/** This action is documented in wp-admin/includes/meta-boxes.php */ +do_action( 'do_meta_boxes', 'link', 'normal', $link ); +/** This action is documented in wp-admin/includes/meta-boxes.php */ +do_action( 'do_meta_boxes', 'link', 'advanced', $link ); +/** This action is documented in wp-admin/includes/meta-boxes.php */ +do_action( 'do_meta_boxes', 'link', 'side', $link ); + +add_screen_option( + 'layout_columns', + array( + 'max' => 2, + 'default' => 2, + ) +); + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

        ' . __( 'You can add or edit links on this screen by entering information in each of the boxes. Only the link’s web address and name (the text you want to display on your site as the link) are required fields.' ) . '

        ' . + '

        ' . __( 'The boxes for link name, web address, and description have fixed positions, while the others may be repositioned using drag and drop. You can also hide boxes you don’t use in the Screen Options tab, or minimize boxes by clicking on the title bar of the box.' ) . '

        ' . + '

        ' . __( 'XFN stands for XHTML Friends Network, which is optional. WordPress allows the generation of XFN attributes to show how you are related to the authors/owners of the site to which you are linking.' ) . '

        ', + ) +); + +get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Creating Links' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
        +

        + +

        + + + +
        + + +

        + + +
        + + +
        + +
        +
        +
        +

        +
        + +

        +
        +
        + +
        +

        +
        + +

        http://wordpress.org/ — don’t forget the http://' ); ?>

        +
        +
        + +
        +

        +
        + +

        +
        +
        +
        + +
        + +
        +
        + +
        + + + + + + + + +
        +
        + +
        +
        diff --git a/wp-admin/edit-tag-form.php b/wp-admin/edit-tag-form.php new file mode 100644 index 0000000..f50595e --- /dev/null +++ b/wp-admin/edit-tag-form.php @@ -0,0 +1,292 @@ + + +
        +

        labels->edit_item; ?>

        + + + + + +
        + +
        +> + + + +name ) ) { + $tag_name_value = esc_attr( $tag->name ); +} +?> + + + + + + + + + slug ) ? apply_filters( 'editable_slug', $tag->slug, $tag ) : ''; + ?> + + + + + + + + + + + + + + + + + +
        + + + + term_id ) ) : ?> + + term_id", 'delete-tag_' . $tag->term_id ) ); ?>"> + + + +
        + +
        +
        + + + + name, get_taxonomies( array( 'show_ui' => true ) ) ) ) { + wp_die( __( 'Sorry, you are not allowed to edit terms in this taxonomy.' ) ); +} + +if ( ! current_user_can( $tax->cap->manage_terms ) ) { + wp_die( + '

        ' . __( 'You need a higher level of permission.' ) . '

        ' . + '

        ' . __( 'Sorry, you are not allowed to manage terms in this taxonomy.' ) . '

        ', + 403 + ); +} + +/** + * $post_type is set when the WP_Terms_List_Table instance is created + * + * @global string $post_type + */ +global $post_type; + +$wp_list_table = _get_list_table( 'WP_Terms_List_Table' ); +$pagenum = $wp_list_table->get_pagenum(); + +$title = $tax->labels->name; + +if ( 'post' !== $post_type ) { + $parent_file = ( 'attachment' === $post_type ) ? 'upload.php' : "edit.php?post_type=$post_type"; + $submenu_file = "edit-tags.php?taxonomy=$taxonomy&post_type=$post_type"; +} elseif ( 'link_category' === $tax->name ) { + $parent_file = 'link-manager.php'; + $submenu_file = 'edit-tags.php?taxonomy=link_category'; +} else { + $parent_file = 'edit.php'; + $submenu_file = "edit-tags.php?taxonomy=$taxonomy"; +} + +add_screen_option( + 'per_page', + array( + 'default' => 20, + 'option' => 'edit_' . $tax->name . '_per_page', + ) +); + +get_current_screen()->set_screen_reader_content( + array( + 'heading_pagination' => $tax->labels->items_list_navigation, + 'heading_list' => $tax->labels->items_list, + ) +); + +$location = false; +$referer = wp_get_referer(); +if ( ! $referer ) { // For POST requests. + $referer = wp_unslash( $_SERVER['REQUEST_URI'] ); +} +$referer = remove_query_arg( array( '_wp_http_referer', '_wpnonce', 'error', 'message', 'paged' ), $referer ); +switch ( $wp_list_table->current_action() ) { + + case 'add-tag': + check_admin_referer( 'add-tag', '_wpnonce_add-tag' ); + + if ( ! current_user_can( $tax->cap->edit_terms ) ) { + wp_die( + '

        ' . __( 'You need a higher level of permission.' ) . '

        ' . + '

        ' . __( 'Sorry, you are not allowed to create terms in this taxonomy.' ) . '

        ', + 403 + ); + } + + $ret = wp_insert_term( $_POST['tag-name'], $taxonomy, $_POST ); + if ( $ret && ! is_wp_error( $ret ) ) { + $location = add_query_arg( 'message', 1, $referer ); + } else { + $location = add_query_arg( + array( + 'error' => true, + 'message' => 4, + ), + $referer + ); + } + + break; + + case 'delete': + if ( ! isset( $_REQUEST['tag_ID'] ) ) { + break; + } + + $tag_ID = (int) $_REQUEST['tag_ID']; + check_admin_referer( 'delete-tag_' . $tag_ID ); + + if ( ! current_user_can( 'delete_term', $tag_ID ) ) { + wp_die( + '

        ' . __( 'You need a higher level of permission.' ) . '

        ' . + '

        ' . __( 'Sorry, you are not allowed to delete this item.' ) . '

        ', + 403 + ); + } + + wp_delete_term( $tag_ID, $taxonomy ); + + $location = add_query_arg( 'message', 2, $referer ); + + // When deleting a term, prevent the action from redirecting back to a term that no longer exists. + $location = remove_query_arg( array( 'tag_ID', 'action' ), $location ); + + break; + + case 'bulk-delete': + check_admin_referer( 'bulk-tags' ); + + if ( ! current_user_can( $tax->cap->delete_terms ) ) { + wp_die( + '

        ' . __( 'You need a higher level of permission.' ) . '

        ' . + '

        ' . __( 'Sorry, you are not allowed to delete these items.' ) . '

        ', + 403 + ); + } + + $tags = (array) $_REQUEST['delete_tags']; + foreach ( $tags as $tag_ID ) { + wp_delete_term( $tag_ID, $taxonomy ); + } + + $location = add_query_arg( 'message', 6, $referer ); + + break; + + case 'edit': + if ( ! isset( $_REQUEST['tag_ID'] ) ) { + break; + } + + $term_id = (int) $_REQUEST['tag_ID']; + $term = get_term( $term_id ); + + if ( ! $term instanceof WP_Term ) { + wp_die( __( 'You attempted to edit an item that doesn’t exist. Perhaps it was deleted?' ) ); + } + + wp_redirect( esc_url_raw( get_edit_term_link( $term_id, $taxonomy, $post_type ) ) ); + exit; + + case 'editedtag': + $tag_ID = (int) $_POST['tag_ID']; + check_admin_referer( 'update-tag_' . $tag_ID ); + + if ( ! current_user_can( 'edit_term', $tag_ID ) ) { + wp_die( + '

        ' . __( 'You need a higher level of permission.' ) . '

        ' . + '

        ' . __( 'Sorry, you are not allowed to edit this item.' ) . '

        ', + 403 + ); + } + + $tag = get_term( $tag_ID, $taxonomy ); + if ( ! $tag ) { + wp_die( __( 'You attempted to edit an item that doesn’t exist. Perhaps it was deleted?' ) ); + } + + $ret = wp_update_term( $tag_ID, $taxonomy, $_POST ); + + if ( $ret && ! is_wp_error( $ret ) ) { + $location = add_query_arg( 'message', 3, $referer ); + } else { + $location = add_query_arg( + array( + 'error' => true, + 'message' => 5, + ), + $referer + ); + } + break; + default: + if ( ! $wp_list_table->current_action() || ! isset( $_REQUEST['delete_tags'] ) ) { + break; + } + check_admin_referer( 'bulk-tags' ); + + $screen = get_current_screen()->id; + $tags = (array) $_REQUEST['delete_tags']; + + /** This action is documented in wp-admin/edit.php */ + $location = apply_filters( "handle_bulk_actions-{$screen}", $location, $wp_list_table->current_action(), $tags ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + break; +} + +if ( ! $location && ! empty( $_REQUEST['_wp_http_referer'] ) ) { + $location = remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ); +} + +if ( $location ) { + if ( $pagenum > 1 ) { + $location = add_query_arg( 'paged', $pagenum, $location ); // $pagenum takes care of $total_pages. + } + + /** + * Filters the taxonomy redirect destination URL. + * + * @since 4.6.0 + * + * @param string $location The destination URL. + * @param WP_Taxonomy $tax The taxonomy object. + */ + wp_redirect( apply_filters( 'redirect_term_location', $location, $tax ) ); + exit; +} + +$wp_list_table->prepare_items(); +$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' ); + +if ( $pagenum > $total_pages && $total_pages > 0 ) { + wp_redirect( add_query_arg( 'paged', $total_pages ) ); + exit; +} + +wp_enqueue_script( 'admin-tags' ); +if ( current_user_can( $tax->cap->edit_terms ) ) { + wp_enqueue_script( 'inline-edit-tax' ); +} + +if ( 'category' === $taxonomy || 'link_category' === $taxonomy || 'post_tag' === $taxonomy ) { + $help = ''; + if ( 'category' === $taxonomy ) { + $help = '

        ' . sprintf( + /* translators: %s: URL to Writing Settings screen. */ + __( 'You can use categories to define sections of your site and group related posts. The default category is “Uncategorized” until you change it in your writing settings.' ), + 'options-writing.php' + ) . '

        '; + } elseif ( 'link_category' === $taxonomy ) { + $help = '

        ' . __( 'You can create groups of links by using Link Categories. Link Category names must be unique and Link Categories are separate from the categories you use for posts.' ) . '

        '; + } else { + $help = '

        ' . __( 'You can assign keywords to your posts using tags. Unlike categories, tags have no hierarchy, meaning there’s no relationship from one tag to another.' ) . '

        '; + } + + if ( 'link_category' === $taxonomy ) { + $help .= '

        ' . __( 'You can delete Link Categories in the Bulk Action pull-down, but that action does not delete the links within the category. Instead, it moves them to the default Link Category.' ) . '

        '; + } else { + $help .= '

        ' . __( 'What’s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index.' ) . '

        '; + } + + get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => $help, + ) + ); + + if ( 'category' === $taxonomy || 'post_tag' === $taxonomy ) { + if ( 'category' === $taxonomy ) { + $help = '

        ' . __( 'When adding a new category on this screen, you’ll fill in the following fields:' ) . '

        '; + } else { + $help = '

        ' . __( 'When adding a new tag on this screen, you’ll fill in the following fields:' ) . '

        '; + } + + $help .= '
          ' . + '
        • ' . __( 'Name — The name is how it appears on your site.' ) . '
        • '; + + if ( ! global_terms_enabled() ) { + $help .= '
        • ' . __( 'Slug — The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.' ) . '
        • '; + } + + if ( 'category' === $taxonomy ) { + $help .= '
        • ' . __( 'Parent — Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have child categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown.' ) . '
        • '; + } + + $help .= '
        • ' . __( 'Description — The description is not prominent by default; however, some themes may display it.' ) . '
        • ' . + '
        ' . + '

        ' . __( 'You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table.' ) . '

        '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'adding-terms', + 'title' => 'category' === $taxonomy ? __( 'Adding Categories' ) : __( 'Adding Tags' ), + 'content' => $help, + ) + ); + } + + $help = '

        ' . __( 'For more information:' ) . '

        '; + + if ( 'category' === $taxonomy ) { + $help .= '

        ' . __( 'Documentation on Categories' ) . '

        '; + } elseif ( 'link_category' === $taxonomy ) { + $help .= '

        ' . __( 'Documentation on Link Categories' ) . '

        '; + } else { + $help .= '

        ' . __( 'Documentation on Tags' ) . '

        '; + } + + $help .= '

        ' . __( 'Support' ) . '

        '; + + get_current_screen()->set_help_sidebar( $help ); + + unset( $help ); +} + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +/** Also used by the Edit Tag form */ +require_once ABSPATH . 'wp-admin/includes/edit-tag-messages.php'; + +$class = ( isset( $_REQUEST['error'] ) ) ? 'error' : 'updated'; + +if ( is_plugin_active( 'wpcat2tag-importer/wpcat2tag-importer.php' ) ) { + $import_link = admin_url( 'admin.php?import=wpcat2tag' ); +} else { + $import_link = admin_url( 'import.php' ); +} + +?> + +
        +

        + +' . __( 'Search results for “%s”' ) . '', esc_html( wp_unslash( $_REQUEST['s'] ) ) ); +} +?> + +
        + + +

        + +
        + +
        + + + +search_box( $tax->labels->search_items, 'tag' ); ?> + +
        + +cap->edit_terms ); + +if ( $can_edit_terms ) { + ?> +
        + +
        +
        + + 0 ) ), '3.0.0', '{$taxonomy}_pre_add_form' ); + } elseif ( 'link_category' === $taxonomy ) { + /** + * Fires before the link category form. + * + * @since 2.3.0 + * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_add_form'} instead. + * + * @param object $arg Optional arguments cast to an object. + */ + do_action_deprecated( 'add_link_category_form_pre', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_pre_add_form' ); + } else { + /** + * Fires before the Add Tag form. + * + * @since 2.5.0 + * @deprecated 3.0.0 Use {@see '{$taxonomy}_pre_add_form'} instead. + * + * @param string $taxonomy The taxonomy slug. + */ + do_action_deprecated( 'add_tag_form_pre', array( $taxonomy ), '3.0.0', '{$taxonomy}_pre_add_form' ); + } + + /** + * Fires before the Add Term form for all taxonomies. + * + * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. + * + * @since 3.0.0 + * + * @param string $taxonomy The taxonomy slug. + */ + do_action( "{$taxonomy}_pre_add_form", $taxonomy ); + ?> + +
        +

        labels->add_new_item; ?>

        +
        +> + + + + + + +
        + + +

        +
        + +
        + + +

        +
        + + +
        + + 0, + 'hide_if_empty' => false, + 'taxonomy' => $taxonomy, + 'name' => 'parent', + 'orderby' => 'name', + 'hierarchical' => true, + 'show_option_none' => __( 'None' ), + ); + + /** + * Filters the taxonomy parent drop-down on the Edit Term page. + * + * @since 3.7.0 + * @since 4.2.0 Added `$context` parameter. + * + * @param array $dropdown_args { + * An array of taxonomy parent drop-down arguments. + * + * @type int|bool $hide_empty Whether to hide terms not attached to any posts. Default 0|false. + * @type bool $hide_if_empty Whether to hide the drop-down if no terms exist. Default false. + * @type string $taxonomy The taxonomy slug. + * @type string $name Value of the name attribute to use for the drop-down select element. + * Default 'parent'. + * @type string $orderby The field to order by. Default 'name'. + * @type bool $hierarchical Whether the taxonomy is hierarchical. Default true. + * @type string $show_option_none Label to display if there are no terms. Default 'None'. + * } + * @param string $taxonomy The taxonomy slug. + * @param string $context Filter context. Accepts 'new' or 'edit'. + */ + $dropdown_args = apply_filters( 'taxonomy_parent_dropdown_args', $dropdown_args, $taxonomy, 'new' ); + + wp_dropdown_categories( $dropdown_args ); + ?> + +

        + +

        + +
        + +
        + + +

        +
        + + +

        + labels->add_new_item, 'primary', 'submit', false ); ?> + +

        + 0 ) ), '3.0.0', '{$taxonomy}_add_form' ); + } elseif ( 'link_category' === $taxonomy ) { + /** + * Fires at the end of the Edit Link form. + * + * @since 2.3.0 + * @deprecated 3.0.0 Use {@see '{$taxonomy}_add_form'} instead. + * + * @param object $arg Optional arguments cast to an object. + */ + do_action_deprecated( 'edit_link_category_form', array( (object) array( 'parent' => 0 ) ), '3.0.0', '{$taxonomy}_add_form' ); + } else { + /** + * Fires at the end of the Add Tag form. + * + * @since 2.7.0 + * @deprecated 3.0.0 Use {@see '{$taxonomy}_add_form'} instead. + * + * @param string $taxonomy The taxonomy slug. + */ + do_action_deprecated( 'add_tag_form', array( $taxonomy ), '3.0.0', '{$taxonomy}_add_form' ); + } + + /** + * Fires at the end of the Add Term form for all taxonomies. + * + * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. + * + * @since 3.0.0 + * + * @param string $taxonomy The taxonomy slug. + */ + do_action( "{$taxonomy}_add_form", $taxonomy ); + ?> +
        +
        +
        + +
        +
        + + +views(); ?> + +
        + + + +display(); ?> + +
        + + +
        +

        + ' . apply_filters( 'the_category', get_cat_name( get_option( 'default_category' ) ), '', '' ) . '' + ); + ?> +

        + +

        + category to tag converter.' ), + esc_url( $import_link ) + ); + ?> +

        + +
        + +
        +

        + tag to category converter.' ), + esc_url( $import_link ) + ); + ?> +

        +
        + +
        +
        + +
        + + +
        + + + + inline_edit(); + +require_once ABSPATH . 'wp-admin/admin-footer.php'; diff --git a/wp-admin/edit.php b/wp-admin/edit.php new file mode 100644 index 0000000..1fb89e1 --- /dev/null +++ b/wp-admin/edit.php @@ -0,0 +1,464 @@ + true ) ) ) ) { + wp_die( __( 'Sorry, you are not allowed to edit posts in this post type.' ) ); +} + +if ( 'attachment' === $typenow ) { + if ( wp_redirect( admin_url( 'upload.php' ) ) ) { + exit; + } +} + +/** + * @global string $post_type + * @global WP_Post_Type $post_type_object + */ +global $post_type, $post_type_object; + +$post_type = $typenow; +$post_type_object = get_post_type_object( $post_type ); + +if ( ! $post_type_object ) { + wp_die( __( 'Invalid post type.' ) ); +} + +if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) { + wp_die( + '

        ' . __( 'You need a higher level of permission.' ) . '

        ' . + '

        ' . __( 'Sorry, you are not allowed to edit posts in this post type.' ) . '

        ', + 403 + ); +} + +$wp_list_table = _get_list_table( 'WP_Posts_List_Table' ); +$pagenum = $wp_list_table->get_pagenum(); + +// Back-compat for viewing comments of an entry. +foreach ( array( 'p', 'attachment_id', 'page_id' ) as $_redirect ) { + if ( ! empty( $_REQUEST[ $_redirect ] ) ) { + wp_redirect( admin_url( 'edit-comments.php?p=' . absint( $_REQUEST[ $_redirect ] ) ) ); + exit; + } +} +unset( $_redirect ); + +if ( 'post' !== $post_type ) { + $parent_file = "edit.php?post_type=$post_type"; + $submenu_file = "edit.php?post_type=$post_type"; + $post_new_file = "post-new.php?post_type=$post_type"; +} else { + $parent_file = 'edit.php'; + $submenu_file = 'edit.php'; + $post_new_file = 'post-new.php'; +} + +$doaction = $wp_list_table->current_action(); + +if ( $doaction ) { + check_admin_referer( 'bulk-posts' ); + + $sendback = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'locked', 'ids' ), wp_get_referer() ); + if ( ! $sendback ) { + $sendback = admin_url( $parent_file ); + } + $sendback = add_query_arg( 'paged', $pagenum, $sendback ); + if ( strpos( $sendback, 'post.php' ) !== false ) { + $sendback = admin_url( $post_new_file ); + } + + if ( 'delete_all' === $doaction ) { + // Prepare for deletion of all posts with a specified post status (i.e. Empty Trash). + $post_status = preg_replace( '/[^a-z0-9_-]+/i', '', $_REQUEST['post_status'] ); + // Validate the post status exists. + if ( get_post_status_object( $post_status ) ) { + $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type=%s AND post_status = %s", $post_type, $post_status ) ); + } + $doaction = 'delete'; + } elseif ( isset( $_REQUEST['media'] ) ) { + $post_ids = $_REQUEST['media']; + } elseif ( isset( $_REQUEST['ids'] ) ) { + $post_ids = explode( ',', $_REQUEST['ids'] ); + } elseif ( ! empty( $_REQUEST['post'] ) ) { + $post_ids = array_map( 'intval', $_REQUEST['post'] ); + } + + if ( ! isset( $post_ids ) ) { + wp_redirect( $sendback ); + exit; + } + + switch ( $doaction ) { + case 'trash': + $trashed = 0; + $locked = 0; + + foreach ( (array) $post_ids as $post_id ) { + if ( ! current_user_can( 'delete_post', $post_id ) ) { + wp_die( __( 'Sorry, you are not allowed to move this item to the Trash.' ) ); + } + + if ( wp_check_post_lock( $post_id ) ) { + $locked++; + continue; + } + + if ( ! wp_trash_post( $post_id ) ) { + wp_die( __( 'Error in moving to Trash.' ) ); + } + + $trashed++; + } + + $sendback = add_query_arg( + array( + 'trashed' => $trashed, + 'ids' => join( ',', $post_ids ), + 'locked' => $locked, + ), + $sendback + ); + break; + case 'untrash': + $untrashed = 0; + foreach ( (array) $post_ids as $post_id ) { + if ( ! current_user_can( 'delete_post', $post_id ) ) { + wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) ); + } + + if ( ! wp_untrash_post( $post_id ) ) { + wp_die( __( 'Error in restoring from Trash.' ) ); + } + + $untrashed++; + } + $sendback = add_query_arg( 'untrashed', $untrashed, $sendback ); + break; + case 'delete': + $deleted = 0; + foreach ( (array) $post_ids as $post_id ) { + $post_del = get_post( $post_id ); + + if ( ! current_user_can( 'delete_post', $post_id ) ) { + wp_die( __( 'Sorry, you are not allowed to delete this item.' ) ); + } + + if ( 'attachment' === $post_del->post_type ) { + if ( ! wp_delete_attachment( $post_id ) ) { + wp_die( __( 'Error in deleting.' ) ); + } + } else { + if ( ! wp_delete_post( $post_id ) ) { + wp_die( __( 'Error in deleting.' ) ); + } + } + $deleted++; + } + $sendback = add_query_arg( 'deleted', $deleted, $sendback ); + break; + case 'edit': + if ( isset( $_REQUEST['bulk_edit'] ) ) { + $done = bulk_edit_posts( $_REQUEST ); + + if ( is_array( $done ) ) { + $done['updated'] = count( $done['updated'] ); + $done['skipped'] = count( $done['skipped'] ); + $done['locked'] = count( $done['locked'] ); + $sendback = add_query_arg( $done, $sendback ); + } + } + break; + default: + $screen = get_current_screen()->id; + + /** + * Fires when a custom bulk action should be handled. + * + * The redirect link should be modified with success or failure feedback + * from the action to be used to display feedback to the user. + * + * The dynamic portion of the hook name, `$screen`, refers to the current screen ID. + * + * @since 4.7.0 + * + * @param string $sendback The redirect URL. + * @param string $doaction The action being taken. + * @param array $items The items to take the action on. Accepts an array of IDs of posts, + * comments, terms, links, plugins, attachments, or users. + */ + $sendback = apply_filters( "handle_bulk_actions-{$screen}", $sendback, $doaction, $post_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + break; + } + + $sendback = remove_query_arg( array( 'action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status', 'post', 'bulk_edit', 'post_view' ), $sendback ); + + wp_redirect( $sendback ); + exit(); +} elseif ( ! empty( $_REQUEST['_wp_http_referer'] ) ) { + wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); + exit; +} + +$wp_list_table->prepare_items(); + +wp_enqueue_script( 'inline-edit-post' ); +wp_enqueue_script( 'heartbeat' ); + +if ( 'wp_block' === $post_type ) { + wp_enqueue_script( 'wp-list-reusable-blocks' ); + wp_enqueue_style( 'wp-list-reusable-blocks' ); +} + +$title = $post_type_object->labels->name; + +if ( 'post' === $post_type ) { + get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

        ' . __( 'This screen provides access to all of your posts. You can customize the display of this screen to suit your workflow.' ) . '

        ', + ) + ); + get_current_screen()->add_help_tab( + array( + 'id' => 'screen-content', + 'title' => __( 'Screen Content' ), + 'content' => + '

        ' . __( 'You can customize the display of this screen’s contents in a number of ways:' ) . '

        ' . + '
          ' . + '
        • ' . __( 'You can hide/display columns based on your needs and decide how many posts to list per screen using the Screen Options tab.' ) . '
        • ' . + '
        • ' . __( 'You can filter the list of posts by post status using the text links above the posts list to only show posts with that status. The default view is to show all posts.' ) . '
        • ' . + '
        • ' . __( 'You can view posts in a simple title list or with an excerpt using the Screen Options tab.' ) . '
        • ' . + '
        • ' . __( 'You can refine the list to show only posts in a specific category or from a specific month by using the dropdown menus above the posts list. Click the Filter button after making your selection. You also can refine the list by clicking on the post author, category or tag in the posts list.' ) . '
        • ' . + '
        ', + ) + ); + get_current_screen()->add_help_tab( + array( + 'id' => 'action-links', + 'title' => __( 'Available Actions' ), + 'content' => + '

        ' . __( 'Hovering over a row in the posts list will display action links that allow you to manage your post. You can perform the following actions:' ) . '

        ' . + '
          ' . + '
        • ' . __( 'Edit takes you to the editing screen for that post. You can also reach that screen by clicking on the post title.' ) . '
        • ' . + '
        • ' . __( 'Quick Edit provides inline access to the metadata of your post, allowing you to update post details without leaving this screen.' ) . '
        • ' . + '
        • ' . __( 'Trash removes your post from this list and places it in the Trash, from which you can permanently delete it.' ) . '
        • ' . + '
        • ' . __( 'Preview will show you what your draft post will look like if you publish it. View will take you to your live site to view the post. Which link is available depends on your post’s status.' ) . '
        • ' . + '
        ', + ) + ); + get_current_screen()->add_help_tab( + array( + 'id' => 'bulk-actions', + 'title' => __( 'Bulk Actions' ), + 'content' => + '

        ' . __( 'You can also edit or move multiple posts to the Trash at once. Select the posts you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply.' ) . '

        ' . + '

        ' . __( 'When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected posts at once. To remove a post from the grouping, just click the x next to its name in the Bulk Edit area that appears.' ) . '

        ', + ) + ); + + get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Managing Posts' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' + ); + +} elseif ( 'page' === $post_type ) { + get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

        ' . __( 'Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the “Parent” of the other, creating a group of pages.' ) . '

        ', + ) + ); + get_current_screen()->add_help_tab( + array( + 'id' => 'managing-pages', + 'title' => __( 'Managing Pages' ), + 'content' => + '

        ' . __( 'Managing pages is very similar to managing posts, and the screens can be customized in the same way.' ) . '

        ' . + '

        ' . __( 'You can also perform the same types of actions, including narrowing the list by using the filters, acting on a page using the action links that appear when you hover over a row, or using the Bulk Actions menu to edit the metadata for multiple pages at once.' ) . '

        ', + ) + ); + + get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Managing Pages' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' + ); + +} + +get_current_screen()->set_screen_reader_content( + array( + 'heading_views' => $post_type_object->labels->filter_items_list, + 'heading_pagination' => $post_type_object->labels->items_list_navigation, + 'heading_list' => $post_type_object->labels->items_list, + ) +); + +add_screen_option( + 'per_page', + array( + 'default' => 20, + 'option' => 'edit_' . $post_type . '_per_page', + ) +); + +$bulk_counts = array( + 'updated' => isset( $_REQUEST['updated'] ) ? absint( $_REQUEST['updated'] ) : 0, + 'locked' => isset( $_REQUEST['locked'] ) ? absint( $_REQUEST['locked'] ) : 0, + 'deleted' => isset( $_REQUEST['deleted'] ) ? absint( $_REQUEST['deleted'] ) : 0, + 'trashed' => isset( $_REQUEST['trashed'] ) ? absint( $_REQUEST['trashed'] ) : 0, + 'untrashed' => isset( $_REQUEST['untrashed'] ) ? absint( $_REQUEST['untrashed'] ) : 0, +); + +$bulk_messages = array(); +$bulk_messages['post'] = array( + /* translators: %s: Number of posts. */ + 'updated' => _n( '%s post updated.', '%s posts updated.', $bulk_counts['updated'] ), + 'locked' => ( 1 == $bulk_counts['locked'] ) ? __( '1 post not updated, somebody is editing it.' ) : + /* translators: %s: Number of posts. */ + _n( '%s post not updated, somebody is editing it.', '%s posts not updated, somebody is editing them.', $bulk_counts['locked'] ), + /* translators: %s: Number of posts. */ + 'deleted' => _n( '%s post permanently deleted.', '%s posts permanently deleted.', $bulk_counts['deleted'] ), + /* translators: %s: Number of posts. */ + 'trashed' => _n( '%s post moved to the Trash.', '%s posts moved to the Trash.', $bulk_counts['trashed'] ), + /* translators: %s: Number of posts. */ + 'untrashed' => _n( '%s post restored from the Trash.', '%s posts restored from the Trash.', $bulk_counts['untrashed'] ), +); +$bulk_messages['page'] = array( + /* translators: %s: Number of pages. */ + 'updated' => _n( '%s page updated.', '%s pages updated.', $bulk_counts['updated'] ), + 'locked' => ( 1 == $bulk_counts['locked'] ) ? __( '1 page not updated, somebody is editing it.' ) : + /* translators: %s: Number of pages. */ + _n( '%s page not updated, somebody is editing it.', '%s pages not updated, somebody is editing them.', $bulk_counts['locked'] ), + /* translators: %s: Number of pages. */ + 'deleted' => _n( '%s page permanently deleted.', '%s pages permanently deleted.', $bulk_counts['deleted'] ), + /* translators: %s: Number of pages. */ + 'trashed' => _n( '%s page moved to the Trash.', '%s pages moved to the Trash.', $bulk_counts['trashed'] ), + /* translators: %s: Number of pages. */ + 'untrashed' => _n( '%s page restored from the Trash.', '%s pages restored from the Trash.', $bulk_counts['untrashed'] ), +); +$bulk_messages['wp_block'] = array( + /* translators: %s: Number of blocks. */ + 'updated' => _n( '%s block updated.', '%s blocks updated.', $bulk_counts['updated'] ), + 'locked' => ( 1 == $bulk_counts['locked'] ) ? __( '1 block not updated, somebody is editing it.' ) : + /* translators: %s: Number of blocks. */ + _n( '%s block not updated, somebody is editing it.', '%s blocks not updated, somebody is editing them.', $bulk_counts['locked'] ), + /* translators: %s: Number of blocks. */ + 'deleted' => _n( '%s block permanently deleted.', '%s blocks permanently deleted.', $bulk_counts['deleted'] ), + /* translators: %s: Number of blocks. */ + 'trashed' => _n( '%s block moved to the Trash.', '%s blocks moved to the Trash.', $bulk_counts['trashed'] ), + /* translators: %s: Number of blocks. */ + 'untrashed' => _n( '%s block restored from the Trash.', '%s blocks restored from the Trash.', $bulk_counts['untrashed'] ), +); + +/** + * Filters the bulk action updated messages. + * + * By default, custom post types use the messages for the 'post' post type. + * + * @since 3.7.0 + * + * @param array[] $bulk_messages Arrays of messages, each keyed by the corresponding post type. Messages are + * keyed with 'updated', 'locked', 'deleted', 'trashed', and 'untrashed'. + * @param int[] $bulk_counts Array of item counts for each message, used to build internationalized strings. + */ +$bulk_messages = apply_filters( 'bulk_post_updated_messages', $bulk_messages, $bulk_counts ); +$bulk_counts = array_filter( $bulk_counts ); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> +
        +

        +labels->name ); +?> +

        + +cap->create_posts ) ) { + echo ' ' . esc_html( $post_type_object->labels->add_new ) . ''; +} + +if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) { + /* translators: %s: Search query. */ + printf( ' ' . __( 'Search results for “%s”' ) . '', get_search_query() ); +} +?> + +
        + + $count ) { + if ( isset( $bulk_messages[ $post_type ][ $message ] ) ) { + $messages[] = sprintf( $bulk_messages[ $post_type ][ $message ], number_format_i18n( $count ) ); + } elseif ( isset( $bulk_messages['post'][ $message ] ) ) { + $messages[] = sprintf( $bulk_messages['post'][ $message ], number_format_i18n( $count ) ); + } + + if ( 'trashed' === $message && isset( $_REQUEST['ids'] ) ) { + $ids = preg_replace( '/[^0-9,]/', '', $_REQUEST['ids'] ); + $messages[] = '' . __( 'Undo' ) . ''; + } +} + +if ( $messages ) { + echo '

        ' . join( ' ', $messages ) . '

        '; +} +unset( $messages ); + +$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'locked', 'skipped', 'updated', 'deleted', 'trashed', 'untrashed' ), $_SERVER['REQUEST_URI'] ); +?> + +views(); ?> + +
        + +search_box( $post_type_object->labels->search_items, 'post' ); ?> + + + + + + + + + + + + +display(); ?> + +
        + +has_items() ) { + $wp_list_table->inline_edit(); +} +?> + +
        +
        +
        + + 20, + 'option' => 'remove_personal_data_requests_per_page', + ) +); + +$_list_table_args = array( + 'plural' => 'privacy_requests', + 'singular' => 'privacy_request', +); + +$requests_table = _get_list_table( 'WP_Privacy_Data_Removal_Requests_List_Table', $_list_table_args ); + +$requests_table->screen->set_screen_reader_content( + array( + 'heading_views' => __( 'Filter erase personal data list' ), + 'heading_pagination' => __( 'Erase personal data list navigation' ), + 'heading_list' => __( 'Erase personal data list' ), + ) +); + +$requests_table->process_bulk_action(); +$requests_table->prepare_items(); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
        +

        +
        + + + +
        +

        +

        + +
        + + + +
        + + + +
        +
        + + views(); ?> + +
        + search_box( __( 'Search Requests' ), 'requests' ); ?> + + + +
        + +
        + display(); + $requests_table->embed_scripts(); + ?> +
        +
        + + 20, + 'option' => 'export_personal_data_requests_per_page', + ) +); + +$_list_table_args = array( + 'plural' => 'privacy_requests', + 'singular' => 'privacy_request', +); + +$requests_table = _get_list_table( 'WP_Privacy_Data_Export_Requests_List_Table', $_list_table_args ); + +$requests_table->screen->set_screen_reader_content( + array( + 'heading_views' => __( 'Filter export personal data list' ), + 'heading_pagination' => __( 'Export personal data list navigation' ), + 'heading_list' => __( 'Export personal data list' ), + ) +); + +$requests_table->process_bulk_action(); +$requests_table->prepare_items(); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
        +

        +
        + + + +
        +

        +

        + +
        + + + +
        + + + +
        +
        + + views(); ?> + +
        + search_box( __( 'Search Requests' ), 'requests' ); ?> + + + +
        + +
        + display(); + $requests_table->embed_scripts(); + ?> +
        +
        + + + + add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => '

        ' . __( 'You can export a file of your site’s content in order to import it into another installation or platform. The export file will be an XML file format called WXR. Posts, pages, comments, custom fields, categories, and tags can be included. You can choose for the WXR file to include only certain posts or pages by setting the dropdown filters to limit the export by category, author, date range by month, or publishing status.' ) . '

        ' . + '

        ' . __( 'Once generated, your WXR file can be imported by another WordPress site or by another blogging platform able to access this format.' ) . '

        ', + ) +); + +get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Export' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' +); + +// If the 'download' URL parameter is set, a WXR export file is baked and returned. +if ( isset( $_GET['download'] ) ) { + $args = array(); + + if ( ! isset( $_GET['content'] ) || 'all' == $_GET['content'] ) { + $args['content'] = 'all'; + } elseif ( 'posts' == $_GET['content'] ) { + $args['content'] = 'post'; + + if ( $_GET['cat'] ) { + $args['category'] = (int) $_GET['cat']; + } + + if ( $_GET['post_author'] ) { + $args['author'] = (int) $_GET['post_author']; + } + + if ( $_GET['post_start_date'] || $_GET['post_end_date'] ) { + $args['start_date'] = $_GET['post_start_date']; + $args['end_date'] = $_GET['post_end_date']; + } + + if ( $_GET['post_status'] ) { + $args['status'] = $_GET['post_status']; + } + } elseif ( 'pages' == $_GET['content'] ) { + $args['content'] = 'page'; + + if ( $_GET['page_author'] ) { + $args['author'] = (int) $_GET['page_author']; + } + + if ( $_GET['page_start_date'] || $_GET['page_end_date'] ) { + $args['start_date'] = $_GET['page_start_date']; + $args['end_date'] = $_GET['page_end_date']; + } + + if ( $_GET['page_status'] ) { + $args['status'] = $_GET['page_status']; + } + } elseif ( 'attachment' == $_GET['content'] ) { + $args['content'] = 'attachment'; + + if ( $_GET['attachment_start_date'] || $_GET['attachment_end_date'] ) { + $args['start_date'] = $_GET['attachment_start_date']; + $args['end_date'] = $_GET['attachment_end_date']; + } + } else { + $args['content'] = $_GET['content']; + } + + /** + * Filters the export args. + * + * @since 3.5.0 + * + * @param array $args The arguments to send to the exporter. + */ + $args = apply_filters( 'export_args', $args ); + + export_wp( $args ); + die(); +} + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +/** + * Create the date options fields for exporting a given post type. + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global WP_Locale $wp_locale WordPress date and time locale object. + * + * @since 3.1.0 + * + * @param string $post_type The post type. Default 'post'. + */ +function export_date_options( $post_type = 'post' ) { + global $wpdb, $wp_locale; + + $months = $wpdb->get_results( + $wpdb->prepare( + " + SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month + FROM $wpdb->posts + WHERE post_type = %s AND post_status != 'auto-draft' + ORDER BY post_date DESC + ", + $post_type + ) + ); + + $month_count = count( $months ); + if ( ! $month_count || ( 1 == $month_count && 0 == $months[0]->month ) ) { + return; + } + + foreach ( $months as $date ) { + if ( 0 == $date->year ) { + continue; + } + + $month = zeroise( $date->month, 2 ); + echo ''; + } +} +?> + +
        +

        + +

        +

        +

        + +

        +
        +
        + + +

        +

        + +

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

        +
          +
        • + +
        • +
        • +
          + + + + + +
          +
        • +
        • + + +
        • +
        + + false, + 'can_export' => true, + ), + 'objects' +) as $post_type ) : + ?> +

        + + +

        +
          +
        • +
          + + + + + +
          +
        • +
        + +
        + + + +
        +
        + + diff --git a/wp-admin/freedoms.php b/wp-admin/freedoms.php new file mode 100644 index 0000000..b9c1a83 --- /dev/null +++ b/wp-admin/freedoms.php @@ -0,0 +1,120 @@ + +
        + +
        +
        +

        + + +

        +
        + +
        +

        + +

        +
        + + +
        + +
        +

        + +

        + license, the GPL.' ), + __( 'https://wordpress.org/about/license/' ) + ); + ?> +

        +
        + +
        + +
        +
        +
        +

        +

        +
        +
        +
        +

        +

        +
        +
        +
        +

        +

        +
        +
        +
        +

        +

        +
        +
        + +
        + +
        +
        +

        + check out our trademark guidelines first.' ), + 'https://wordpressfoundation.org/trademark-policy/' + ); + ?> +

        + +

        + plugins and themes there. If you get a plugin or theme from another source, make sure to ask them if it’s GPL first. If they don’t respect the WordPress license, we don’t recommend them.' ), + $plugins_url, + $themes_url, + __( 'https://wordpress.org/about/license/' ) + ); + ?> +

        + +

        Free Software Foundation.' ); ?>

        +
        +
        + +
        + diff --git a/wp-admin/images/align-center-2x.png b/wp-admin/images/align-center-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0b6273445a830ebbb45b3715a3e078c062858deb GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^T0ktv#0(_W-BOBy6i@6G)=pOmiPwxqnfsMLB2}5Uv-TJ0u-6unai1( zy4H^x&L+EeX6KxH?!A*C;uk~|Ge)t%SH?F8I3>jJ#2kw|N(7GlxFHe(>j@BNh>v3u zc)(Pz>vxvX*~uN4Mt5uOla=e1jI&p{ULoJMR*5d9ejKOo3`k$y3qK4z|4ZPzgD4nm z8ApZ1ektFv7W#$x&t;=$KI*@Q%A$Yv-S_=441*x>JWuf%Q_*dLRU$p~it`_~vrcKP zQ(0>l^G)cltrqw&BKc!tQ4li0Ni~i5w{GeAX<_czLd{vneA3-qKipY? zg|@jtbfwz{O!#Qoz&j@z*BWo^dh*GFrRl+> zN&X3az;#`fUqw(sRrPvZ%cID~4D2cV;xopgD4Na>t^edt4gRd3XgC~_Dy&+qHk(bz z+qS(s1Nzr*{xv@ZW{tz6qeg`5#^U8)zopr0G znB+j+s;;hc>fC#aY7aEp8cZcdWi(>vJvOS!+J5%h>mgcv4{*+nk$qGCc>jiN%~ZK0 zm)cb>N`3x^x@0nW{o%WJf<+{V*kcd?CJ*TO%(B73R+OA1ai%NZ$~xtU#jlvmRayQl z?w-}jX<~d=D`kz5;6zabJ6IsjW;2<3I*EIkB<=5ekzFgxI#$zD$LSLtcdu@)n34$# zLzGiZl!cpN1a^+cBcdcOU8JnDa+)zQw|?5TZGLUFc0Ob0DWWeQKg&GVTq%l;F^~Xr zu~#|Dt8yxlAkajQog+kuli5qG0FP7;_KpT{ZaNIYvtD#xviDIcdh@*w09@oJ?#m2&A8LZ V(nc#<;|$O&22WQ%mvv4FO#t<{EOP(= literal 0 HcmV?d00001 diff --git a/wp-admin/images/align-none.png b/wp-admin/images/align-none.png new file mode 100644 index 0000000000000000000000000000000000000000..b72df647167196e48c02f9990c9443373639b01b GIT binary patch literal 417 zcmV;S0bc%zP)7?rZd=6fc?m_9K4Qk0WdRFb$0+zq)P?m$O*$hWiYc+O3pc@6l07rmXNz_$6q;&WBEDlHq$h2W5yX& zHRmiMoaO&ue%xJ9g>6hGKDc{I>Et{|=*vq58VCZrvIQG}7~^B}x5ZVLPaofKuMSQ- zLfVWKdGOCNv#;;3x?I0|hBay6_X4{V_tcZ$-7oc5%NJd~ES^JC(1t*~{Xx~i%pTWQ z)z#uvm+R$g+HXZL5Z2>&oB^2or>b)oR?C-NK7V-2p~A7Yy~9-E0Uq+te*QPVn+mie zG?d%0QEYJc5W?mEA_CT>VkY1sv;&l!Ds^!8ob#nPfNPhAC4r4sXBx07W!I6-tyxKACGf=g>wDkHa1qQA~8xsAT(wna| nFj&owdR4g5Igw#%FVOULmxHx0skwgv8pPn~>gTe~DWM4fggY*F literal 0 HcmV?d00001 diff --git a/wp-admin/images/align-right.png b/wp-admin/images/align-right.png new file mode 100644 index 0000000000000000000000000000000000000000..86a1b2e8764dea8899e847ebdcbd6cdf7570a909 GIT binary patch literal 509 zcmVC-K#*?T{5;D(ppyi8V`KD;~^W=&B>g zRRJoL9(%~;a;a1*lgVVWS;S~f_S^OThGnc+2^9~i?k(P!;d6bu7!6kvTVVKU!Epci zJ|WP%dnp(jkWf1amv+`IW4Rm)UGHlReYR|Dl6-LOgb}C)GYf$VNI-xao(R!E&`>xp z?j&3Wy!5?(-@=SOc_PhbGdPz&U@feR!8fp+Q-u>$9FGUPlT0Sl=``Df`fj(&y%bI+ zs0b{`=;UF6nA4FLI5T4aPVndRc}QT70RJIq=k7(T)uQq6`K1Tn4%Yrl#bo$D`@Vvh zn~wIvUF0#qns+^L4fy!7-|zpZ_!oSGSq{=KU=>uh9B;4*00000NkvXXu0mjfV=U$^ literal 0 HcmV?d00001 diff --git a/wp-admin/images/arrows-2x.png b/wp-admin/images/arrows-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0c53d1a6b1988f8a8a079cf58c3fdb4fc3596f GIT binary patch literal 863 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

        hc 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 literal 0 HcmV?d00001 diff --git a/wp-admin/images/bubble_bg-2x.gif b/wp-admin/images/bubble_bg-2x.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e34e01dcd4ea0b9f9c5df54811e8ddf0e499690 GIT binary patch literal 424 zcmV;Z0ayM+v( z$>oxE^US~4S}>@!!2kdMA^8La000jFEC2ui03-m&06+x)@X1N5y*TU5yZ>N#HDqZ5 z;#i_->%MR-w?b{-iHy&D@BhFcra&wjbFrgv$!t0Y(5Q4kh)t``tQKbKmKIzuYt|TV z&uGwXZ8N~w0^}^7uG{a%d{F_@7vwU3cY}lvQ-@G6h*UgKScQ<0l6GE|VU;9cmtC4N zoIjb9qNAjx8gOiHs5Ne?Y^^#susp1$wzs&srG9#SyhMDydclE4#5};d%FE2Ui&Bp* z&jSH6h}Dfz*gn+F-rwNi;^Q2cU7MH;=w90{=IWl6?du0VUGwn`^*|)}Jp1GV3LHqV zAi-5PT&)_Q5RShP3+FhbwZ?&uH4k6dun43^#uyw`4T>B|vZTqAC_DTzBJ3A}mU;|) z^x$%aADPJVyzF5Fr;j2#e-!WuBxuT`NRujE%57Sr7fuHNN->SV%nr|{x| rpEX_WVyVCtX6fJ(#%K=K3lAO^En-tyx=7|ZTWv7gl4vPUM+R#EPQs=l literal 0 HcmV?d00001 diff --git a/wp-admin/images/comment-grey-bubble-2x.png b/wp-admin/images/comment-grey-bubble-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0eec4a6df0c365e51d6de1a9c218d5c6621f6d83 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;6Yw0G|-o|NsB**s-IyxVWgOsIahb z=gytxagVXBZ3qj*GX`KKt?1;%yNd7fqhBwvRu7tMO!(wW()Ro~u@)+M|ANpZPfg z!FH$j-gMTOp=wwi`PA}+T=6b8PNQn)wOjj-nFOun6ck#~Vf5-uMHYXuwEz5HZt9bh zE3Ujfu*mjBoPJjP*Zk*^`Rd_&zxvk}Ts^)xu8z^KOy}xf<%w&7E@kj^^>bP0l+XkK DT*hQ1 literal 0 HcmV?d00001 diff --git a/wp-admin/images/comment-grey-bubble.png b/wp-admin/images/comment-grey-bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..558ee8f32dce370bca7686ce2604099cc3eb7ccf GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=-3?y@QpIZW?*aCb)T;1H literal 0 HcmV?d00001 diff --git a/wp-admin/images/date-button-2x.gif b/wp-admin/images/date-button-2x.gif new file mode 100644 index 0000000000000000000000000000000000000000..281a6654fa4a38e8a4876b1060af65e5c1adbf21 GIT binary patch literal 996 zcmZ?wbhEHbRAf+K_?E~}R#vun@#5Uv+*`M9MMXvZ`}gnS#fvXrzWnp&PjPYa-@kt+ zPMla+SorJLud`>*{{H>@^XJcbd3n#DKmYmj=lAd5-@kwV^y$-&A3sJ%N4K@LrKYB4 zWn~>ceE8Y3XA>q&c=P7X+qZAOe*OCG+qW-YzUszp3!ILLX zwr$(i(9jSO5s{df`03N9(9qCXvu54Cef#0Vhwt9K%g)YradEkF<;ssAKX&Zc@#xW` z>({Rr6cl{;@F6)lIX*rePV)2aX*(78n>96cjXf?%da} zU*EiWbM4x-_wV12iHUjf;spaOf#OdVRtAPd1|5(kpg3`0|KE_<)ZEO|*3yyK#?#rs zBg4qZtz%$jpd&YN)}$%ZW=xdnY4P<`RN`P}TD6LqLuAG3H5^Kcik`k5_MYBqiYqs+ z()QecfZJ2Z)4qfA3@48&Z#b_i&)Ku*FJ8WSwnNa9^})kOkDomB6zmA_WPii1?75m* zSpJQ;C-<7qZ#)A!Bs|%exMVywEI6PdA;o*E;Xr2-FPEfM%L)UZCasBnDK8heGEEbn zZIt)shhflEmW~w~oF_M_daH&AT=lrL;2<-r=Olr|r4J6CofBJeEoZ_KHYEj5t&oNf z3h8^;#b-P_qMpDIvedIdp=hE@J0GX*oK0SzlDzrngs`hf7CLwciFf>8rZRDpGwZoI z6~#^`PJd^bq!Ro`P{L=&hKGmSgu{9qm>4-rdL^veVkS;#Q!$#95l~_I`B@jIOvkee zOos$GbS*mK-ZpH>yt2x5v5LqO4;6liq%$3fD#0Fic2)ki6JinM*Pa-(;KTtLSFUNN zW~LX&o#g7zvy92gpV_==fx4$ahx>vB4sooHPtTX1|Acc9ucyX?3Wg-stE;%wF2oBe z%wv)f37Ej*+AQKI#v;68!-3khEfXFzF`O_u#I3Iq$f7j8_5&k_sDP+Hvq^zQLX<+* z3P~k9mBfQxvU`Njv#^(3Xtd2dc%zZk^T&ozp|~>+%^b`E!bcetL>QhhSaTXIapV$t zz#*>aqjHc{NL)a;+aPRR5>KCx!Y5ZD^E(@wIfb?y?qg9q;jnBbdxPQ;p&*rytV%2& TQlHPQ5DK_CuZByAgTWdA6C0^+ literal 0 HcmV?d00001 diff --git a/wp-admin/images/date-button.gif b/wp-admin/images/date-button.gif new file mode 100644 index 0000000000000000000000000000000000000000..326a7b71cae9607a4b49303e16241c19c26f9acc GIT binary patch literal 400 zcmV;B0dM|CNk%w1VGsZi0QEZn+1c4_Y;0RwTYi3ifPjFIkdSk8bGW#;aBy(-_4R*$ ze~gTbZEbC!prF^+*Yfi6;Nal&^z?aodF}1(V`F1{e0-FYlxb;c=;-KPUS4)~cKG=C zC@BG_xJbP+uP62&-V8Ahlht?U|`zX+Un}+*4Ebl z|Nrjp?#|B6@$vE4*x1I##?8&m=jZ3#+}w3_b;82J-rnBJ%gc_AjsO4v0000000000 z00000A^8La0027xEC2ui01yBW06+$)p%BqB1pvDon(|SZs2@igN4=ox(7cCAGP&6@&1sE+CLLM!b zn34}J8m2#P%Fn! uA}s+zA1y2n0Vpap)F>k@A3`ZDGbIo>4kO|a04*s(83OL_@a`EqK>#}%Xt+TD literal 0 HcmV?d00001 diff --git a/wp-admin/images/generic.png b/wp-admin/images/generic.png new file mode 100644 index 0000000000000000000000000000000000000000..00575a078f994dea08c3c3cd0a46d1c22366fca0 GIT binary patch literal 719 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 n0000000000000000RO-{)1@R(K735+00000NkvXXu0mjfxlSSx literal 0 HcmV?d00001 diff --git a/wp-admin/images/icons32-vs-2x.png b/wp-admin/images/icons32-vs-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..54e2fb2f5fbb483b6d396fae843568c41f110dee GIT binary patch literal 21396 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�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 P28p!Q^`BQivy1p2jwOXc literal 0 HcmV?d00001 diff --git a/wp-admin/images/icons32-vs.png b/wp-admin/images/icons32-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..e46d6bebb78eb85988ad28bd4c9e3f6e98bc6118 GIT binary patch literal 8007 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 C-$~~H literal 0 HcmV?d00001 diff --git a/wp-admin/images/icons32.png b/wp-admin/images/icons32.png new file mode 100644 index 0000000000000000000000000000000000000000..e491b1a8d28b3b3a0b8594166455b931281a0414 GIT binary patch literal 8023 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 BHO~M5 literal 0 HcmV?d00001 diff --git a/wp-admin/images/imgedit-icons-2x.png b/wp-admin/images/imgedit-icons-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..98dd4124047bff2b12a5d491281e09c009b2f3b3 GIT binary patch literal 7664 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 G2=+hKXu@Lv literal 0 HcmV?d00001 diff --git a/wp-admin/images/imgedit-icons.png b/wp-admin/images/imgedit-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..0d544ee9b83b478c4fe73f6a9c7b02db3fadfd3e GIT binary patch literal 4055 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 Z-hU36-n|G37`gxe002ovPDHLkV1ka^55oWe literal 0 HcmV?d00001 diff --git a/wp-admin/images/list.png b/wp-admin/images/list.png new file mode 100644 index 0000000000000000000000000000000000000000..85d1295e8131f8f0f3a4c9bc53fa2b3f3d770abc GIT binary patch literal 1003 zcmVjg5`Awzjvox2~?PudlC^l$5Zrur@X}j*gBqGc!Oy zKte)7U|?WjVPRxsWMyS#Yinz4Y;0|9ZEkLEadB~Sa&mQbb#``kczAeud3k(%e0_a= zetv#{fPjRAgocKOhlhuVh=_}ei;azqj*gCykdTp)k&=>kjqokyyrKP2(r>Ci@sj8}~tE;Q5tgNlAt*)-FudlDMv9YqUva_?ZxVX5vxw*Q! zy1To(yu7@>zrVo1z{0}9!^6YG#KgtL#m2_Q%F4>i%gfHr&d<-!(9qD)(b3b>)6~?| z)z#J3*4Ee8*Vx$D+1c6J+S=RO+uhyW-rnBd-{0Wi;Njun;^N}tFMg~>g((4?Ck9A?d|UF?(p#N^Yioc^z`=j_V@Sq`T6<#`}_U<{r~^}ug4=r0000H zbW%=J06#xXPE%FM$?56q>+J09?PoCh2><{BAxT6*R5;6Zl+SAuK@`W|yqO(}iYM_B z5Va+^iC#pcwMSdf98@ZJ_D}O45X6HB^&lwPgOoxkTl+%~dQuPZU`=*5JImn!^eQy*_PuEM7=^M{{*?r1wU|C3K_PFi} zI74;Sxq!>#a!u0#NWq1Y3~zH?=~%^Ow0DMId}Xff#bY0CqXI)k;!n2Gt$d_dJIxT6 z+I`o@DHWPK&^W>>1)0@>VeKn~cqxo4tTB2RY``o@aNo@1|Yeinxp zNN1{FbKN~k5*TLQuoqXDG<+DpHVK_;x$t9hm%PZEp$LpymM>?zM=vNI5W_^vqBl1b z3VP~RV#*us?FI$8gPpHez-R&!SEpGtZ;u{pJS%JhQDw}QmlOcE;t60Wa{K# zxvVDDWMYMs87jSH;LqW5Y3iyXrW9s+YYgN1hB4!M%4DXqT>~TAH)UB>wH2t8*4f?| Z{sDKP&y0=cFCPE^002ovPDHLkV1i3i7!m*g literal 0 HcmV?d00001 diff --git a/wp-admin/images/loading.gif b/wp-admin/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdc589f80979337f9c866cfc416e88826fd311f8 GIT binary patch literal 1372 zcmb`H`%hD67{}jp?ddsC4_Ir*khQfHbhUIuGm545a!Lz$DX5GQvlXaPB!;>&h8IFl zyAq|KRU1Q;73{`_8lx^Vm;ebm3vxA;G@!vB6quWvyLaziZ*T9=(9p$;7stoPA3uIPJw1K(>eah<@6ON9I~n>79?AV3nW9!EXLH)xyidjq zp4MOHjQn~NiLI!#Auxs)0n~}10uuEdU0L50BDR`OQdPV$NP`O9^snHXrTPVe$XkA`yoTos4Wr&EU=pq`0QVbSITC`ptl9k z3o677Uq$&%)|>M!Xc9Z$sx6InaZaQ<1+G_$j*sAdd&c_LyNDf#FkC1)~^An zzOu8WCGF{-QEu1yicMetJXR%jnDx772P8JLbP>qMIgS$JfE0)1GWJB$ea^PlQaTds z+$GIAEbL;FtT9a*i#X)RpE7iN!nK_~u-UP%DP#{>80nAKrVsJ?k|VXJQen$W8UIDn z0N}O5V>4ucQ<>MR3rCMn!5Ovo z+w&m9o8ht$2aKdukfF#Z!T6P^0>BCd3G;a(LP1b`!f)&>KS+U|bH*aeORK~I%JoX( z3T=qX+DH%apqyZWM<>ptdOd@!z~HPH{Ty>3kP>B4Z}p5zh}Km4NFmd8Q+CF>_lv+y z$*jEB_-sI&#R$N-@o;M37S3WT0}jU+_{Mf2?t|UdK7pt>A$=Wv1Cz3qEYSq9##oPl z&yz7k14t2hq9c;`d<^A=Oqk5qa!^vb$-V7))+Im*aqK0FZ1k-s`E2OqmStoDnV8Kl z%+dMx>AqJBPuRn_m-aOfk>w4k(a4v!F5G*^7X!-E9yA)HY2jgT-e6azQsN!*ow53!ID5xT&f~ zd^2?^%BIlrEp6W#ZD~Z(Do|HZL5J7JUGhCH)I8!tttu5>;8&F1}8_y|@DcV+Dh z=WOjxTsSRQCVnV{Cr$l(QrfA~8^We!+9UQ|5!1{-_Xq6Mik^QoeEwHJ+(Qv?Tg!{f z@b9GIf>R$IDR-b(te0hldyU1D`}btByTwm`aOqNp6R##U!~Cie>+hnq9?5l~^i%9L KNS_RW4SxeY3X=5z literal 0 HcmV?d00001 diff --git a/wp-admin/images/marker.png b/wp-admin/images/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..30313b871ddb76755ddbec31df04e2c55f0f5647 GIT binary patch literal 360 zcmV-u0hj)XP)gDlmm+ghLI1)k}bhc1c_^uB6J z0hP7Z9B06gl7}eHE_H{pRcUq{*Qq=tFe#MQci|3PkMgjDS;flAQl)_it{Zt6<0DV= zg*x@cQZj~XPabS;9HIo$YLd^=WavH*4)gM{$a{eaQ+=Qr^=LrJ(ETPD^4RiG!#2(n zX+~)$LX12Z?ikb;8d;%;q0HfoA^pTK8LlYt#1V1o^>?4M`P)VWqP@`o0000rIT>_nGyL#U7biEZvI|%Tu{Yuh0$6T>SyOO&;c5wX+h-1=j zhh&lFwFY3T!m)E!*6!+a$+gFUM4tiRBxoneJ)+lL0@`8apTiTQ=ga7GC-|=dLeyqY z6<1^cv$2v)ss&}0wPb$;b12}BjZA}_*NVnRjaNvyLZGYHsEoJ3fL2Cf3$L?XqE|LW zcG2%9cuf}ptQ;))&dTsOuurg}w=sP?LSx1g>;So@kb;f{3QBgaSpnG&7+;wbBZOtZ zRDo9s%Cya79GgBWQI_eG**uyMx>|%x%$u3t7Qdr$%@iq>qx_S=y~5ll<^1-qHCcR@ zqLv6fzxm&3+gDFn?O4&Z*o%zK7|KbRx1=yf4Gd9NgBbNSqS&xRq&P;_ij?PLhY=`P zB}+-VM$Ykd!xmkO+Oqnj=6D2zsJmJw1hAG{QE(=Y2iHz`L+YBcc^n0Rx~)kiCh|&! zNF$08s~A~y_QjUVswY4MdQ~NQl7y`B?E0(5Ns$ue304>-q_G=0g{%l5pO8AsCmxVr z0p2p<%Yvin0qq8vD!e5_fhR1vA|ndFFXv&yml0=KR%pw#vt;fnEZ>ki^PUV@>i@$; zpM3~H0XVBj1{j6}BZ;Vb{&J4Y<}oUX?c!^;$OU)F1ktdJB_#`fR2ZBfgeeL8_==Lj{dwdrH79h;x ze$^v7z09MMm??oRQB_qEI1{>7L6oZ_x#>GqJ-JYhdNMRI#5$3*)j8$O z;|NZUm784b{rjEp5Gu3^L9>wOqV>B%^dnIjG56lp;^5?Qh$q96C$D)SCsCv@UkEkA zQl6FUoXa0|cS9yilNFgUiT z6JZumPnOdx*%T=#TE?!#%#@ay61M9Y#S3x+!ZFL62(Gf22i1~8KcDI*5{;1n!kWG# z<(;S$&}BCbhr<&cz-7AA|p?~)&uQ%(r%V*Q@g(grtkGnHR z??@2V33gWA5qS!uXmnJP1p&nRD3Es7ZDlZb9^Wo_;^UOk8B%Z&DOUBA?0sqb`)Rum z^!aWWhLorZQ!Nw3F?%NvcM!ll7qETq>ur(7IN-l=Y(J(LIPTh9);g!TlisUh)2pHg>&f_(IZ}R3)(~6Fb%fQCO(+Di0_6<{7wM z+Ye7c!IC@2R)Oz)(-4aKsj^K=;_N~I|4yxrm!v7bQ?o{@K9u=9{ zYh#w^)fhgA9FtKBFER%kQrl!+c}hj7-#q3O*lc{d{o-9 z^Y6mmXdwCSeoWsHkrL$(X2C(0p&-^^<){L8=Qt{ST`ADX`K)2=xIo{r+NZqY$8Io& jJ3hkz{D;5KOMU(U$~kl8WzRKR00000NkvXXu0mjfeC@PD literal 0 HcmV?d00001 diff --git a/wp-admin/images/media-button-2x.png b/wp-admin/images/media-button-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f8ed4df8c50d7e5085d3b7532958c1602a62a3 GIT binary patch literal 850 zcmV-Y1FigtP)UcXxMqczAnzdwhI+eSLj^fPjL6f`^BPh=_=ZiHVDgi;Rqnjg5_ylara5nV+AZ zp`oFpqob>U3S z$H&OX$jQmc%F4>j%*@Tr&Cbrw&(F`$(9qG*(bCe=)6>(`)YR40)z;S5*VotB*x1_I z+S}XP+}zyV-QC~c-{9cj;o;%p;^O1ugww2>+9_7?CtIC z?(XjI@9*&N@bU5S^78WZ^z`-h_4fAm_xJbs`1twx`TF|$`}_O+{QUj>{r>*`|Ns9e zjNhFA000qmQchC<8z(A1NT{o>2q322n7Ds5&&T7Hvq_E z0sM5a6Sl4M6AW6;tJ7#UTgVeGz^~h5=ecTE4ASt_#2$cZPnLOm)2ex@BQHSrhJJm~ zvTa*gn3`Hp=&1TYMb|Ei`KD>6qL>gIO_`>J+^@RMLHV+Do>Lmy?yR0kr!#tNU%NxF za8-V2Kn||+S>@=!DaLRvK0hDN;klxQph|lO%658dbK^xGBgcv5<-`#glT`#I+KUMC zdpkROXJnKCdP%DJ!L({z&k3|mLDS}g6ujA8U2HYuto_L9t=wZN}0tiJ`v)R>1h)uvI2#K#5?&}K&-N}B> cVBqiG0De`Lwb`RaBme*a07*qoM6N<$f{hp1UjP6A literal 0 HcmV?d00001 diff --git a/wp-admin/images/media-button-image.gif b/wp-admin/images/media-button-image.gif new file mode 100644 index 0000000000000000000000000000000000000000..69efa7b48428fd97cc582f737a5e85641cf8a202 GIT binary patch literal 200 zcmZ?wbh9u|t5)sXx9`}oW81cE+puB7zkmPUy?giP&!6n^0ZTwev{w>APv# gOx;Hv^(G%}a!NUyx1O8rK*NR=w>g;`6j>Oo0rZDj^8f$< literal 0 HcmV?d00001 diff --git a/wp-admin/images/media-button-music.gif b/wp-admin/images/media-button-music.gif new file mode 100644 index 0000000000000000000000000000000000000000..3bcda105c6f50faf92589809799ef7610628b7b9 GIT binary patch literal 206 zcmV;<05ShZNk%w1VGIBa0Q4UKnVFgD>gt!5m#?p{v9YoH`}_3t^w-zdd3kxXw6ueR zgUZUvfq{Xir>C>Cv(nPiSy@@XzrU)gs)>n-`T6UQl>h($A^8La0018VEC2ui01N;O06+yx;3s|sc65mZYysg7iYRD?mW|(* zZJPo#8{Ebb=~OH^Ax^ZJTsW88=YfDAG(w)1r!1Wk!O`Y`p@@~A){8N#c|=amB15%e Im!A*-JB>MNqyPW_ literal 0 HcmV?d00001 diff --git a/wp-admin/images/media-button-other.gif b/wp-admin/images/media-button-other.gif new file mode 100644 index 0000000000000000000000000000000000000000..cfe16a83dfd79b58d30e4baadb003e23a8180dbc GIT binary patch literal 248 zcmV`?j{W z@$vEJ=jY+!;Q#;tA^8La0018VEC2ui01W^Q06+zG;3tY2F^+;mXhY#@UE(BPz-UF~ zRYewIpF_h#Fkp@bf(KCeP&NUG#p8f%HWbmrumE_y8G+>_X>1}JOyqPDL)ag|1@Z83 yJdewT_UT9#9f5%Z4g((w7Yhd*jEn;l7YZL7ViOsc8V&|cBM1l#9-bE?Apkpik95)i literal 0 HcmV?d00001 diff --git a/wp-admin/images/media-button-video.gif b/wp-admin/images/media-button-video.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b4a7963ea486edf7abb7414ee302e126a2e8641 GIT binary patch literal 133 zcmV;00DAvNNk%v~VGRHb0P_w2fPjFVot<%UarO1}>+9=xcX!p*)qH$>;NalT&(D5- zers!Mr>Cd?|No((p#T5?EC2ui01W^P06+vf5XebqY0Y7saRFF}F$^Y&A!!0+>yp4C n&-4tUjoO^J&ZEAAVn{414gyR-$!rJ)1cV_$r5X@~K?DFh5`#E~ literal 0 HcmV?d00001 diff --git a/wp-admin/images/media-button.png b/wp-admin/images/media-button.png new file mode 100644 index 0000000000000000000000000000000000000000..752ee452321a701ffd061a1a1c4c527a5f0f7667 GIT binary patch literal 323 zcmV-J0lfZ+P)kRD1&!vGO@CAXsUWLQ5?~Y?LdkEK*PQAL5XO^|*zP ze;nr99nc~oCI|vL!1pUyzVBE6B;+ZW)#O9k_noS$LYk0^jql$s&IF1il z(B!V`AagcNLrId5=XprEhy}}fSG-|$k#QiO9OK&f&tE8B0kfKn75-MaD6WbR#V0_G zp5r*Ot|k+iQNqo2-EV+FL+@Nx1CMbW37|Ihp2^EF3e*kJz?-zeu VdC9Lf9jyQW002ovPDHLkV1n4Ni%tLl literal 0 HcmV?d00001 diff --git a/wp-admin/images/menu-2x.png b/wp-admin/images/menu-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7131763a5932500d0d8ff100554cdaca45809c42 GIT binary patch literal 12672 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 literal 0 HcmV?d00001 diff --git a/wp-admin/images/menu-vs-2x.png b/wp-admin/images/menu-vs-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..99b382369ff8f15046cdb9c025f8c8f75c6a60c5 GIT binary patch literal 12453 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 literal 0 HcmV?d00001 diff --git a/wp-admin/images/menu-vs.png b/wp-admin/images/menu-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..fe281087de4f54d09286042dc6476d58ecb1ea61 GIT binary patch literal 5086 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 AHUIzs literal 0 HcmV?d00001 diff --git a/wp-admin/images/menu.png b/wp-admin/images/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d15af82be524a392fa4a0104693f87315d859d GIT binary patch literal 5039 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 Ga{dF?bQEj= literal 0 HcmV?d00001 diff --git a/wp-admin/images/post-formats-vs.png b/wp-admin/images/post-formats-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..d77f91c06464aa2c880cd4f3a25e89385b6d1802 GIT binary patch literal 2450 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 literal 0 HcmV?d00001 diff --git a/wp-admin/images/post-formats32-vs.png b/wp-admin/images/post-formats32-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..f5653407321f2b8a3aca0d260e1aa7470d56a54f GIT binary patch literal 5111 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 literal 0 HcmV?d00001 diff --git a/wp-admin/images/resize-2x.gif b/wp-admin/images/resize-2x.gif new file mode 100644 index 0000000000000000000000000000000000000000..e57f9bcd69dc260f6c464aef2ef791329e48b5da GIT binary patch literal 151 zcmV;I0BHY5Nk%w1VHN-u0P+U_*x1w6wI@+1da9{{R30A^8La000L7 zEC2ui02Tli06+s=c)Hvz#5q_@IMlFwIVRO5jbBK51!#RY*?IG>_M>cIp_1t=I+Eix!{NZ!;S{mwy-W{JfC> F06Wt#L%je1 literal 0 HcmV?d00001 diff --git a/wp-admin/images/resize-rtl-2x.gif b/wp-admin/images/resize-rtl-2x.gif new file mode 100644 index 0000000000000000000000000000000000000000..483c23dcbe5abd73e157056a2e00a6d779118578 GIT binary patch literal 150 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 literal 0 HcmV?d00001 diff --git a/wp-admin/images/stars-2x.png b/wp-admin/images/stars-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..15aa9debfdf568eda42fcbb0e2c70c680b4b020e GIT binary patch literal 1257 zcmV=P)7t~6(Y2Y=kfwmVZ$Q7I`Q?|9n*`!t0J*88 zenlnkG2|`)p~KjCUGv%WCz|)~M0SECKLUalApRwg{VS+HQOWxivgd)D2f)yKF{)O5 ziDv&SAoK~ay8kwbZ$P7bMIWMt@OI>;9mtFWEBh)D*Ck&!wcD(%XyKNXKuz)ik~vFK zZv%nONO+$9{~iq0RJ265&Rg`ui%h+|N8XU5dv6#T^&{rg8CC! z)t{s3Uxx_bhPgQc`#}8&dbL|j=`$VzSb9Y{lurz3zv@$`y@(6~*IsNG$`v?UQ=XDP zTL=k(4}q(u`boG!d7jqR(S*l==y$;Ub9F;Gf;}x3{mG8lDBydhZYW34)mqW`NiUYW zflE8;Cp-kobG1%1J!wGf1Tbf8jQQQ5ym0G8<7eJM^haR!sm2j`$v;f35skWC2o3@> zPu|HwC+M@=%%Sc&j3=)K_c${RXvCfo$Da+GsQ?Nbv5ZABw)JHjJ?|5MPbz)hI%)fs*M z9x+J(iyxHoq8^L3qTyjLf%0p;U&gsT#7a5;q;{f-^9I}+&Ja!QdMLl2$Y>`TIaM)& z%4Lrk5&Pw}_K#$3(f_?@WNh<;q%GPO)mn7h!ysxRK$!I|>LO64Q?H^%0y2KntEiJe zcIgNbQ!lXWF1?8wcqEJK8Az+&vgoMZMC}B!iv!q*VnIkU&+0{V3riLAF>vIToh&+} z7tuZfnFSl}h;>Oms@os5Xa~!zXP0nyWUqh5q7JP@jl}zP&_f`7`7o+Qv5;g@a84a` zG$M*dD5PdkD>94y+^!Ki8WE+DI(T0S$$xOakXFC1r!SVYG%}(Vmd*JGp>@#IVM(Ww z#bjeyDLA5?KUrTlnh9y;Yq_LN^(T{jznPiufs&w|m0Yr4%SWhLww-HcG>0^O z*7K;wFFXw;L5q<^uWK#Z%R42dK{v^=MlD6paZOdBcJ^u|x|M)H?BJCK-6V^i(@M09 z3;(@hJ?E!C5~@b!F=eY3qAo)0gsKZ>=E2WxK8@B2x>;`5rMBoM7AUTTD@G`DwXf>F zGBNeMC`nbfeY_D-Thv4#aq*>Ek3z;ybd=k>_u9oPd z1ft{HxMSuJ(dda)NZ~HLYKiV8AY*{%l|r82J+2Ic8lo&~=MGh37ct5UN{Q&d=ZrL2 TL7I?T00000NkvXXu0mjfn-y0e literal 0 HcmV?d00001 diff --git a/wp-admin/images/stars.png b/wp-admin/images/stars.png new file mode 100644 index 0000000000000000000000000000000000000000..c01ada13ee9a58afc51489ea80a53dca6dbe7eaa GIT binary patch literal 924 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 literal 0 HcmV?d00001 diff --git a/wp-admin/images/w-logo-white.png b/wp-admin/images/w-logo-white.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5efcdc000195ceb5f2860e7c211972468e251b GIT binary patch literal 5395 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 Xx8)O1RUP(k;sL0sXhFV%t-}8Y-l_Fu literal 0 HcmV?d00001 diff --git a/wp-admin/images/wheel.png b/wp-admin/images/wheel.png new file mode 100644 index 0000000000000000000000000000000000000000..9b9fdf4a37ade27ecdc9d7536f40e2b292855a5f GIT binary patch literal 6047 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 X)9&Ogyvk+9EhAuTXilurC&m6he)eAo literal 0 HcmV?d00001 diff --git a/wp-admin/images/wordpress-logo-white.svg b/wp-admin/images/wordpress-logo-white.svg new file mode 100644 index 0000000..682e80b --- /dev/null +++ b/wp-admin/images/wordpress-logo-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wp-admin/images/wordpress-logo.png b/wp-admin/images/wordpress-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..63b0379613dce1dd59a81a30cf98fc23275751dc GIT binary patch literal 2480 zcma)8X)qg#7EWr7q7kY{v77|-b; z)4(om@w88aP`vK%l`btiE4O=$q92H-T3y!D-Yse|h$D9paF9%Vd&$l&t7Tz+F74&n zQ;meJU_h;OuNGC)KOt2`N@y%^osXAju=|Uu1@2^}&x;eecnjg?e5VsNKP>M$ z`%*I=^fE=?_?i?-cLTF}k=Ehoer9MsTfnO|4OJ!!1J%a#Yu^evnJ4!* z+Y39iPAFSVqcm^OCFM#s>dGj!?-$q`V+AuHTgIvQ7?Z*o;bjK*LmpMzfakb70Uv6Q z8uXz11c0(;5N|!U$Y(yB%m4_(*J6SN62C>w@@KoGFt0@s^r*|My~4kYsJu8f2#8@I`#F{xX5=X6%If0xnH@>qa&&VXJS4xtr`PEB)u}^aTOk0qIuJElq=NN zhQyMez8!n{csV6@(9fek%{#0>DkCm#!yH(y1L#*mf5TMpFJdC=s=C)KYqIvDr<`}z z1dyuOidPl4#W7#(nf0Vy+e}A&3&T=>r%}qS<5fxG8RQ&4Vp>205v2(PIp^n1N|Zz% z<9f8;nl$3i|CMz{C=_jxBQ|N2nu_aEv3?Epuk5}wabYPqHW!keh-*InPW7nVSTo8@ zqUh1sxe*@yH!%qqm7^T_A-wTV-*pax+V^8OA^P$)zz<+(7%8gt1zZ!$7ot6S8Y^DD zlypzNm{P-b^USuW)+Z>i-L}QbO=4TTb6w{y^6iF+r!dJp#wX}mkxq7CB>QIgcBe^D zZU1&t9^~@is%T6|$49ESBQu-*b?J^A=)Rl@B&{`mc||=}h!BtD6ffUkGe~U4xH64G zG7J9D8}E>8IA;yVcJd)Qpn<^I-4S8vaV1m6tcM+#=6X8GM$YH-(!=bv99ewxDk-k* zNPd@IL1L;UJe}LmK(q0ZvP$UgEkX9WOF>3e%Uu)r=NBQLIb;K8P`ke0ho z`5FpMp}-kYx@;_dD_>f#bd%Eigjp;;^aw*(v*`dnOQ)Eq9WxKoEzfB2<{64)tNig z!`0~fZ=IZelU%i4_3!ajj`I~lPa%1UD6(YCM%{YcANDr8&8!z#B`3@1>89K_f>`#t zx|}J{!o*3$$Q{N)4fH<}>ul8Ik1FYjuuLOgm96M=^@m43mahI#fz;M{AwaG1aKQ72 z556CjnG#@PtVd%o{<02p1AMCnCH-_77rYX_;p6!2Qpu)|qn;Oh&3;rKaz!Cc^4Z|Y zWh%ISH`9*+S1)4@3x-bK@wuqxSNI-!2j2tZ@C#Y7CWE128iuORg%O^{x6y5i-nJ84|U4qQq5IevTdk2g&8IGWCrVd)0p>yleFMd zOrMhetgH?^lqZrivtQmQcwcse7w5Gf7=+ICQQ^<0A8T1siO~0~$pV`9%NnCFRcPn0 zr9{DGYei<2^OG5kOA!`nd3D=q<*@p)4POEG{m~bI=t2i_uSkFlOC7*0EI}=SKEfKr6jE6ZE0Zm<9O$xK))eU zQf86pxVW?w@XEMira~g95=3`*lgSs8Y8P?(XL|5a(Z>U# z2g;1iqE`oS!MFLKmG;nPCk>P \ No newline at end of file diff --git a/wp-admin/images/wpspin_light-2x.gif b/wp-admin/images/wpspin_light-2x.gif new file mode 100644 index 0000000000000000000000000000000000000000..08e47e8211c4d35bc7dc5d1e26d1f58d81e0037b GIT binary patch literal 8875 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 yN$IV4$)fzIM%uKZ`7`#>jfqwJwR8SH z?|Yu-eV+5~&&|%|QH+1%Xpx?Jn)>!DC+U|=8^3Qf$__gA6=zv@r(=lH zB=H%pqChN2+iJKa(?;HzK6kVF(^D_J`MY`RBrsi~Y#)EpqW8>erYqAjU^mv6n+*A} zJ>uO8x^oVRS%dL?IW@zNHIPxqu(3SCaim-*8#E|mG(bU+0O2D{E$Tc60Z6J5#v~Ah zb^^Q7&T08^hk<17w9{vBm7&!@{Y=1QpUg9_>I}elq|BiQD5?Uy?v0r94jCg6(pXyG zUYDUAb)A|iQ8K0<3RU9byW&W7iK?v zS~)pJ6LVq}{6QC4!|@u?u!udW%Sh{YV@RT?<+DmS1e053o;@uYcu5epL_w8`F#@Cy z=nM5=5C;JS85$l@1^L7q<^hLnK+&rPC`kv1Rw6;VgBYCeNBA*UYBeT^*%5-G;3}l} zCh-VQeX_Djg4!Yz`RR%|p}f$pXfWm%expJ0L(zZ$1n|lQWTVYjtgB2nT^qJ8*XgA5 zU0*zH%NQz-rWdzE%HCPM$A+W24(sGK?b1;AlC84h?_ccQ*Yx4T#H1FPAdJllX_oX- zraV5rM=}w~6qQG#Dx4SjK?*`rLQ&0?S4Kz4ECx24L*%jTL27rBxN4(=z*b@Eokog9 ztL4H2?4!E$v>{mYRE3-Fr=FckuLsg`*{aj&&l5HBdlhz29GlVc98I;FWxHKg(=_tkWpZ*FEL&Kf5?n>pB>7RN$Q`{^^Dymp1J*+cfwgxEv~h86>Z(~KPx zaTTf>#m9W2i9<(%jJh7vF{5n#|0L0B^DQUstw4$4QkbcwFV}#%!=}LULED#YFM414 zE(Lt}uP<6rB)RZU!QoJZRd6D1gjmfZ)XVXuupMBMq^5~-Fx0yYznMqg}_H2WEt_1 zKfiN1L6FCP4=yj%)Ic4%;8TArW?XoSde|qzYYW*Aro@8pmp6gebBvTgKDZBVKMz6K ztxM;ZaW{RI=}b*xJl>b~YxQUSNs0gdf0`ZdlCMwS8(n^u!&BawgGy`wR(&qbNXE?1 z_XR8yoy^haE5+TA0@Eqp=Q=uUPab#ZIq`mP`EP}-%$N}*QPqR#JsQ2K3&GF%J$fJr z2-5@I9+|wNla$!-L>qxwIFaJ%F%85pQf!L@28h!$48uk_(r`e{&d#wy%whZF#GF96 z{xu(EPhdNFI;Y)YrA`*RE;jzWY?r?4LCnoRCF35OwkdPa%g-K~`K+IQGvCtJl>Xyx z`^F3GuLJIuybLR-|tOIst(gQ-rDWg<(rR&5W@u#|_66 zaM#BOH*SiW)U+gqkt*)oec$#J@c#=EjkgCcXc>SJKi$aI^|MlwXzlsl7u zYZgILc4_^=kQPO{bqYm!RZt{*z~ z*PHQaaWpymmp|;nJ@~c8*D`IrM#(d5HkQqB1D-CBEN)zk2oR<;#~}SFSvF?%eNNx6YqG|Lf+>ud7!5 z|MTbXyLaEdefuA&yZ{c-T%n>TOn+`04P(4mJ9 zAKtrn@8|jRKTn^2{rdHT2M>N6J$mTSp`WKt9XWF3*s)_@7A^WTWy-f5JN~|Xd+pk_ zZ`-$jo-yO|ym=>1ocQ|n>yHyBu3x|Y|Nno6p$rs%vam8RI56mdJOPRm2loFB4oyv5 zYW$*tf};FtT+RK>d@4L5rlul1Dtr?J4CWayF;8${W}k1sF2}f0P*lxhx&%2s;)8@4Y8F`z9=IJ?bFfC`|aL}74)Figr&ViF-r|vd#ibx6^(Z9PHBbxx?GQ$+E;kbW;?MVaSE5ey2m2xhn`0li?8-tGbcRhDz}r( zv>M(jwc=U25(0VeI2w`ywufp4vMgBmFy?SO^P5SRSe50pd%hkjO*zVtvZcMd+|}Zz z?qav3HC81~%OmDSaIAXfSvMtr8hhIUk?FH6F9o|ESe^VeWG5H%gj9o|6gPFPR@0o- zNj2|yRM>Vpa=ExHc%|9I;XW~<qr1Vql;IFtYp6(31B1PW H0E0CEy3Ryd literal 0 HcmV?d00001 diff --git a/wp-admin/images/xit.gif b/wp-admin/images/xit.gif new file mode 100644 index 0000000000000000000000000000000000000000..b11c5d43e9bcea7ee7c4c384871b0e552a5cd937 GIT binary patch literal 181 zcmZ?wbhEHb6k*_E_{__2;>3y1^X7fqzWv9E6F)Cs{&nNV|NsAAzI^%Y*|P@^9$dS2 z?a-k^pC(UcfC0syEUXL+ybL-Z0gxFEEJ+)-E@lXDKc(a(&^k>gWu^!7;&sl<6FL$V zR0LME_^dd%@r=RYM*#^EWj!*B7epKpIN$0t!RA?6)3FsUR;EGPp{sxP_^ocycK%Rw fDuY|v@AzlNyN4eY?wb;zBO%2rBc~uF$Y2csaRyJW literal 0 HcmV?d00001 diff --git a/wp-admin/images/yes.png b/wp-admin/images/yes.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb39836bbdf6c9931e9f846776d28c6c0157a87 GIT binary patch literal 539 zcmV+$0_6RPP)rrT_844hyuh_-TydG@=!*>!j8|8=)k{x|K{|0ceg z-9~AvFq>Sf_{CL^mj2JWknrF9q{e^!4NCu6eVFgCc`$Im1Cc$5bxGQm*ngE5^Zzft zKllIq`!oJ)G%J5mtyOrm;OWf&CATyGd)~18Z+pn_KU+BSU5+$}%_yadd_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => '

        ' . __( 'This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform.' ) . '

        ' . + '

        ' . __( 'In previous versions of WordPress, all importers were built-in. They have been turned into plugins since most people only use them once or infrequently.' ) . '

        ', + ) +); + +get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Import' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' +); + +if ( current_user_can( 'install_plugins' ) ) { + // List of popular importer plugins from the WordPress.org API. + $popular_importers = wp_get_popular_importers(); +} else { + $popular_importers = array(); +} + +// Detect and redirect invalid importers like 'movabletype', which is registered as 'mt'. +if ( ! empty( $_GET['invalid'] ) && isset( $popular_importers[ $_GET['invalid'] ] ) ) { + $importer_id = $popular_importers[ $_GET['invalid'] ]['importer-id']; + if ( $importer_id != $_GET['invalid'] ) { // Prevent redirect loops. + wp_redirect( admin_url( 'admin.php?import=' . $importer_id ) ); + exit; + } + unset( $importer_id ); +} + +add_thickbox(); +wp_enqueue_script( 'plugin-install' ); +wp_enqueue_script( 'updates' ); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +$parent_file = 'tools.php'; +?> + +
        +

        + +
        +

        + ' . esc_html( $_GET['invalid'] ) . '' ); + ?> +

        +
        + +

        + + $pop_data ) { + if ( isset( $importers[ $pop_importer ] ) ) { + continue; + } + if ( isset( $importers[ $pop_data['importer-id'] ] ) ) { + continue; + } + + // Fill the array of registered (already installed) importers with data of the popular importers from the WordPress.org API. + $importers[ $pop_data['importer-id'] ] = array( + $pop_data['name'], + $pop_data['description'], + 'install' => $pop_data['plugin-slug'], + ); +} + +if ( empty( $importers ) ) { + echo '

        ' . __( 'No importers are available.' ) . '

        '; // TODO: Make more helpful. +} else { + uasort( $importers, '_usort_by_first_member' ); + ?> + + + $data ) { + $plugin_slug = ''; + $action = ''; + $is_plugin_installed = false; + + if ( isset( $data['install'] ) ) { + $plugin_slug = $data['install']; + + if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_slug ) ) { + // Looks like an importer is installed, but not active. + $plugins = get_plugins( '/' . $plugin_slug ); + if ( ! empty( $plugins ) ) { + $keys = array_keys( $plugins ); + $plugin_file = $plugin_slug . '/' . $keys[0]; + $url = wp_nonce_url( + add_query_arg( + array( + 'action' => 'activate', + 'plugin' => $plugin_file, + 'from' => 'import', + ), + admin_url( 'plugins.php' ) + ), + 'activate-plugin_' . $plugin_file + ); + $action = sprintf( + '%s', + esc_url( $url ), + /* translators: %s: Importer name. */ + esc_attr( sprintf( __( 'Run %s' ), $data[0] ) ), + __( 'Run Importer' ) + ); + + $is_plugin_installed = true; + } + } + + if ( empty( $action ) ) { + if ( is_main_site() ) { + $url = wp_nonce_url( + add_query_arg( + array( + 'action' => 'install-plugin', + 'plugin' => $plugin_slug, + 'from' => 'import', + ), + self_admin_url( 'update.php' ) + ), + 'install-plugin_' . $plugin_slug + ); + $action = sprintf( + '%5$s', + esc_url( $url ), + esc_attr( $plugin_slug ), + esc_attr( $data[0] ), + /* translators: %s: Importer name. */ + esc_attr( sprintf( __( 'Install %s now' ), $data[0] ) ), + __( 'Install Now' ) + ); + } else { + $action = sprintf( + /* translators: %s: URL to Import screen on the main site. */ + __( 'This importer is not installed. Please install importers from the main site.' ), + get_admin_url( get_current_network_id(), 'import.php' ) + ); + } + } + } else { + $url = add_query_arg( + array( + 'import' => $importer_id, + ), + self_admin_url( 'admin.php' ) + ); + $action = sprintf( + '%3$s', + esc_url( $url ), + /* translators: %s: Importer name. */ + esc_attr( sprintf( __( 'Run %s' ), $data[0] ) ), + __( 'Run Importer' ) + ); + + $is_plugin_installed = true; + } + + if ( ! $is_plugin_installed && is_main_site() ) { + $url = add_query_arg( + array( + 'tab' => 'plugin-information', + 'plugin' => $plugin_slug, + 'from' => 'import', + 'TB_iframe' => 'true', + 'width' => 600, + 'height' => 550, + ), + network_admin_url( 'plugin-install.php' ) + ); + $action .= sprintf( + ' | %3$s', + esc_url( $url ), + /* translators: %s: Importer name. */ + esc_attr( sprintf( __( 'More information about %s' ), $data[0] ) ), + __( 'Details' ) + ); + } + + echo " + + + + "; + } + ?> +
        + {$data[0]} + {$action} + + {$data[1]} +
        + ' . sprintf( + /* translators: %s: URL to Add Plugins screen. */ + __( 'If the importer you need is not listed, search the plugin directory to see if an importer is available.' ), + esc_url( network_admin_url( 'plugin-install.php?tab=search&type=tag&s=importer' ) ) + ) . '

        '; +} +?> + +
        + +id and the JS global 'pagenow'. + if ( ! empty( $_POST['screen_id'] ) ) { + $screen_id = sanitize_key( $_POST['screen_id'] ); + } else { + $screen_id = 'front'; + } + + if ( ! empty( $_POST['data'] ) ) { + $data = wp_unslash( (array) $_POST['data'] ); + + /** + * Filters Heartbeat Ajax response in no-privilege environments. + * + * @since 3.6.0 + * + * @param array $response The no-priv Heartbeat response. + * @param array $data The $_POST data sent. + * @param string $screen_id The screen id. + */ + $response = apply_filters( 'heartbeat_nopriv_received', $response, $data, $screen_id ); + } + + /** + * Filters Heartbeat Ajax response in no-privilege environments when no data is passed. + * + * @since 3.6.0 + * + * @param array $response The no-priv Heartbeat response. + * @param string $screen_id The screen id. + */ + $response = apply_filters( 'heartbeat_nopriv_send', $response, $screen_id ); + + /** + * Fires when Heartbeat ticks in no-privilege environments. + * + * Allows the transport to be easily replaced with long-polling. + * + * @since 3.6.0 + * + * @param array $response The no-priv Heartbeat response. + * @param string $screen_id The screen id. + */ + do_action( 'heartbeat_nopriv_tick', $response, $screen_id ); + + // Send the current time according to the server. + $response['server_time'] = time(); + + wp_send_json( $response ); +} + +// +// GET-based Ajax handlers. +// + +/** + * Ajax handler for fetching a list table. + * + * @since 3.1.0 + */ +function wp_ajax_fetch_list() { + $list_class = $_GET['list_args']['class']; + check_ajax_referer( "fetch-list-$list_class", '_ajax_fetch_list_nonce' ); + + $wp_list_table = _get_list_table( $list_class, array( 'screen' => $_GET['list_args']['screen']['id'] ) ); + if ( ! $wp_list_table ) { + wp_die( 0 ); + } + + if ( ! $wp_list_table->ajax_user_can() ) { + wp_die( -1 ); + } + + $wp_list_table->ajax_response(); + + wp_die( 0 ); +} + +/** + * Ajax handler for tag search. + * + * @since 3.1.0 + */ +function wp_ajax_ajax_tag_search() { + if ( ! isset( $_GET['tax'] ) ) { + wp_die( 0 ); + } + + $taxonomy = sanitize_key( $_GET['tax'] ); + $tax = get_taxonomy( $taxonomy ); + + if ( ! $tax ) { + wp_die( 0 ); + } + + if ( ! current_user_can( $tax->cap->assign_terms ) ) { + wp_die( -1 ); + } + + $s = wp_unslash( $_GET['q'] ); + + $comma = _x( ',', 'tag delimiter' ); + if ( ',' !== $comma ) { + $s = str_replace( $comma, ',', $s ); + } + + if ( false !== strpos( $s, ',' ) ) { + $s = explode( ',', $s ); + $s = $s[ count( $s ) - 1 ]; + } + + $s = trim( $s ); + + /** + * Filters the minimum number of characters required to fire a tag search via Ajax. + * + * @since 4.0.0 + * + * @param int $characters The minimum number of characters required. Default 2. + * @param WP_Taxonomy $tax The taxonomy object. + * @param string $s The search term. + */ + $term_search_min_chars = (int) apply_filters( 'term_search_min_chars', 2, $tax, $s ); + + /* + * Require $term_search_min_chars chars for matching (default: 2) + * ensure it's a non-negative, non-zero integer. + */ + if ( ( 0 == $term_search_min_chars ) || ( strlen( $s ) < $term_search_min_chars ) ) { + wp_die(); + } + + $results = get_terms( + array( + 'taxonomy' => $taxonomy, + 'name__like' => $s, + 'fields' => 'names', + 'hide_empty' => false, + ) + ); + + echo join( "\n", $results ); + wp_die(); +} + +/** + * Ajax handler for compression testing. + * + * @since 3.1.0 + */ +function wp_ajax_wp_compression_test() { + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( -1 ); + } + + if ( ini_get( 'zlib.output_compression' ) || 'ob_gzhandler' == ini_get( 'output_handler' ) ) { + update_site_option( 'can_compress_scripts', 0 ); + wp_die( 0 ); + } + + if ( isset( $_GET['test'] ) ) { + header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' ); + header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); + header( 'Cache-Control: no-cache, must-revalidate, max-age=0' ); + header( 'Content-Type: application/javascript; charset=UTF-8' ); + $force_gzip = ( defined( 'ENFORCE_GZIP' ) && ENFORCE_GZIP ); + $test_str = '"wpCompressionTest Lorem ipsum dolor sit amet consectetuer mollis sapien urna ut a. Eu nonummy condimentum fringilla tempor pretium platea vel nibh netus Maecenas. Hac molestie amet justo quis pellentesque est ultrices interdum nibh Morbi. Cras mattis pretium Phasellus ante ipsum ipsum ut sociis Suspendisse Lorem. Ante et non molestie. Porta urna Vestibulum egestas id congue nibh eu risus gravida sit. Ac augue auctor Ut et non a elit massa id sodales. Elit eu Nulla at nibh adipiscing mattis lacus mauris at tempus. Netus nibh quis suscipit nec feugiat eget sed lorem et urna. Pellentesque lacus at ut massa consectetuer ligula ut auctor semper Pellentesque. Ut metus massa nibh quam Curabitur molestie nec mauris congue. Volutpat molestie elit justo facilisis neque ac risus Ut nascetur tristique. Vitae sit lorem tellus et quis Phasellus lacus tincidunt nunc Fusce. Pharetra wisi Suspendisse mus sagittis libero lacinia Integer consequat ac Phasellus. Et urna ac cursus tortor aliquam Aliquam amet tellus volutpat Vestibulum. Justo interdum condimentum In augue congue tellus sollicitudin Quisque quis nibh."'; + + if ( 1 == $_GET['test'] ) { + echo $test_str; + wp_die(); + } elseif ( 2 == $_GET['test'] ) { + if ( ! isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) { + wp_die( -1 ); + } + + if ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate' ) && function_exists( 'gzdeflate' ) && ! $force_gzip ) { + header( 'Content-Encoding: deflate' ); + $out = gzdeflate( $test_str, 1 ); + } elseif ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) && function_exists( 'gzencode' ) ) { + header( 'Content-Encoding: gzip' ); + $out = gzencode( $test_str, 1 ); + } else { + wp_die( -1 ); + } + + echo $out; + wp_die(); + } elseif ( 'no' == $_GET['test'] ) { + check_ajax_referer( 'update_can_compress_scripts' ); + update_site_option( 'can_compress_scripts', 0 ); + } elseif ( 'yes' == $_GET['test'] ) { + check_ajax_referer( 'update_can_compress_scripts' ); + update_site_option( 'can_compress_scripts', 1 ); + } + } + + wp_die( 0 ); +} + +/** + * Ajax handler for image editor previews. + * + * @since 3.1.0 + */ +function wp_ajax_imgedit_preview() { + $post_id = intval( $_GET['postid'] ); + if ( empty( $post_id ) || ! current_user_can( 'edit_post', $post_id ) ) { + wp_die( -1 ); + } + + check_ajax_referer( "image_editor-$post_id" ); + + include_once ABSPATH . 'wp-admin/includes/image-edit.php'; + + if ( ! stream_preview_image( $post_id ) ) { + wp_die( -1 ); + } + + wp_die(); +} + +/** + * Ajax handler for oEmbed caching. + * + * @since 3.1.0 + * + * @global WP_Embed $wp_embed + */ +function wp_ajax_oembed_cache() { + $GLOBALS['wp_embed']->cache_oembed( $_GET['post'] ); + wp_die( 0 ); +} + +/** + * Ajax handler for user autocomplete. + * + * @since 3.4.0 + */ +function wp_ajax_autocomplete_user() { + if ( ! is_multisite() || ! current_user_can( 'promote_users' ) || wp_is_large_network( 'users' ) ) { + wp_die( -1 ); + } + + /** This filter is documented in wp-admin/user-new.php */ + if ( ! current_user_can( 'manage_network_users' ) && ! apply_filters( 'autocomplete_users_for_site_admins', false ) ) { + wp_die( -1 ); + } + + $return = array(); + + // Check the type of request. + // Current allowed values are `add` and `search`. + if ( isset( $_REQUEST['autocomplete_type'] ) && 'search' === $_REQUEST['autocomplete_type'] ) { + $type = $_REQUEST['autocomplete_type']; + } else { + $type = 'add'; + } + + // Check the desired field for value. + // Current allowed values are `user_email` and `user_login`. + if ( isset( $_REQUEST['autocomplete_field'] ) && 'user_email' === $_REQUEST['autocomplete_field'] ) { + $field = $_REQUEST['autocomplete_field']; + } else { + $field = 'user_login'; + } + + // Exclude current users of this blog. + if ( isset( $_REQUEST['site_id'] ) ) { + $id = absint( $_REQUEST['site_id'] ); + } else { + $id = get_current_blog_id(); + } + + $include_blog_users = ( 'search' === $type ? get_users( + array( + 'blog_id' => $id, + 'fields' => 'ID', + ) + ) : array() ); + + $exclude_blog_users = ( 'add' === $type ? get_users( + array( + 'blog_id' => $id, + 'fields' => 'ID', + ) + ) : array() ); + + $users = get_users( + array( + 'blog_id' => false, + 'search' => '*' . $_REQUEST['term'] . '*', + 'include' => $include_blog_users, + 'exclude' => $exclude_blog_users, + 'search_columns' => array( 'user_login', 'user_nicename', 'user_email' ), + ) + ); + + foreach ( $users as $user ) { + $return[] = array( + /* translators: 1: User login, 2: User email address. */ + 'label' => sprintf( _x( '%1$s (%2$s)', 'user autocomplete result' ), $user->user_login, $user->user_email ), + 'value' => $user->$field, + ); + } + + wp_die( wp_json_encode( $return ) ); +} + +/** + * Handles AJAX requests for community events + * + * @since 4.8.0 + */ +function wp_ajax_get_community_events() { + require_once ABSPATH . 'wp-admin/includes/class-wp-community-events.php'; + + check_ajax_referer( 'community_events' ); + + $search = isset( $_POST['location'] ) ? wp_unslash( $_POST['location'] ) : ''; + $timezone = isset( $_POST['timezone'] ) ? wp_unslash( $_POST['timezone'] ) : ''; + $user_id = get_current_user_id(); + $saved_location = get_user_option( 'community-events-location', $user_id ); + $events_client = new WP_Community_Events( $user_id, $saved_location ); + $events = $events_client->get_events( $search, $timezone ); + $ip_changed = false; + + if ( is_wp_error( $events ) ) { + wp_send_json_error( + array( + 'error' => $events->get_error_message(), + ) + ); + } else { + if ( empty( $saved_location['ip'] ) && ! empty( $events['location']['ip'] ) ) { + $ip_changed = true; + } elseif ( isset( $saved_location['ip'] ) && ! empty( $events['location']['ip'] ) && $saved_location['ip'] !== $events['location']['ip'] ) { + $ip_changed = true; + } + + /* + * The location should only be updated when it changes. The API doesn't always return + * a full location; sometimes it's missing the description or country. The location + * that was saved during the initial request is known to be good and complete, though. + * It should be left intact until the user explicitly changes it (either by manually + * searching for a new location, or by changing their IP address). + * + * If the location was updated with an incomplete response from the API, then it could + * break assumptions that the UI makes (e.g., that there will always be a description + * that corresponds to a latitude/longitude location). + * + * The location is stored network-wide, so that the user doesn't have to set it on each site. + */ + if ( $ip_changed || $search ) { + update_user_option( $user_id, 'community-events-location', $events['location'], true ); + } + + wp_send_json_success( $events ); + } +} + +/** + * Ajax handler for dashboard widgets. + * + * @since 3.4.0 + */ +function wp_ajax_dashboard_widgets() { + require_once ABSPATH . 'wp-admin/includes/dashboard.php'; + + $pagenow = $_GET['pagenow']; + if ( 'dashboard-user' === $pagenow || 'dashboard-network' === $pagenow || 'dashboard' === $pagenow ) { + set_current_screen( $pagenow ); + } + + switch ( $_GET['widget'] ) { + case 'dashboard_primary': + wp_dashboard_primary(); + break; + } + wp_die(); +} + +/** + * Ajax handler for Customizer preview logged-in status. + * + * @since 3.4.0 + */ +function wp_ajax_logged_in() { + wp_die( 1 ); +} + +// +// Ajax helpers. +// + +/** + * Sends back current comment total and new page links if they need to be updated. + * + * Contrary to normal success Ajax response ("1"), die with time() on success. + * + * @access private + * @since 2.7.0 + * + * @param int $comment_id + * @param int $delta + */ +function _wp_ajax_delete_comment_response( $comment_id, $delta = -1 ) { + $total = isset( $_POST['_total'] ) ? (int) $_POST['_total'] : 0; + $per_page = isset( $_POST['_per_page'] ) ? (int) $_POST['_per_page'] : 0; + $page = isset( $_POST['_page'] ) ? (int) $_POST['_page'] : 0; + $url = isset( $_POST['_url'] ) ? esc_url_raw( $_POST['_url'] ) : ''; + + // JS didn't send us everything we need to know. Just die with success message. + if ( ! $total || ! $per_page || ! $page || ! $url ) { + $time = time(); + $comment = get_comment( $comment_id ); + $comment_status = ''; + $comment_link = ''; + + if ( $comment ) { + $comment_status = $comment->comment_approved; + } + + if ( 1 === (int) $comment_status ) { + $comment_link = get_comment_link( $comment ); + } + + $counts = wp_count_comments(); + + $x = new WP_Ajax_Response( + array( + 'what' => 'comment', + // Here for completeness - not used. + 'id' => $comment_id, + 'supplemental' => array( + 'status' => $comment_status, + 'postId' => $comment ? $comment->comment_post_ID : '', + 'time' => $time, + 'in_moderation' => $counts->moderated, + 'i18n_comments_text' => sprintf( + /* translators: %s: Number of comments. */ + _n( '%s Comment', '%s Comments', $counts->approved ), + number_format_i18n( $counts->approved ) + ), + 'i18n_moderation_text' => sprintf( + /* translators: %s: Number of comments. */ + _n( '%s Comment in moderation', '%s Comments in moderation', $counts->moderated ), + number_format_i18n( $counts->moderated ) + ), + 'comment_link' => $comment_link, + ), + ) + ); + $x->send(); + } + + $total += $delta; + if ( $total < 0 ) { + $total = 0; + } + + // Only do the expensive stuff on a page-break, and about 1 other time per page. + if ( 0 == $total % $per_page || 1 == mt_rand( 1, $per_page ) ) { + $post_id = 0; + // What type of comment count are we looking for? + $status = 'all'; + $parsed = parse_url( $url ); + + if ( isset( $parsed['query'] ) ) { + parse_str( $parsed['query'], $query_vars ); + + if ( ! empty( $query_vars['comment_status'] ) ) { + $status = $query_vars['comment_status']; + } + + if ( ! empty( $query_vars['p'] ) ) { + $post_id = (int) $query_vars['p']; + } + + if ( ! empty( $query_vars['comment_type'] ) ) { + $type = $query_vars['comment_type']; + } + } + + if ( empty( $type ) ) { + // Only use the comment count if not filtering by a comment_type. + $comment_count = wp_count_comments( $post_id ); + + // We're looking for a known type of comment count. + if ( isset( $comment_count->$status ) ) { + $total = $comment_count->$status; + } + } + // Else use the decremented value from above. + } + + // The time since the last comment count. + $time = time(); + $comment = get_comment( $comment_id ); + $counts = wp_count_comments(); + + $x = new WP_Ajax_Response( + array( + 'what' => 'comment', + 'id' => $comment_id, + 'supplemental' => array( + 'status' => $comment ? $comment->comment_approved : '', + 'postId' => $comment ? $comment->comment_post_ID : '', + /* translators: %s: Number of comments. */ + 'total_items_i18n' => sprintf( _n( '%s item', '%s items', $total ), number_format_i18n( $total ) ), + 'total_pages' => ceil( $total / $per_page ), + 'total_pages_i18n' => number_format_i18n( ceil( $total / $per_page ) ), + 'total' => $total, + 'time' => $time, + 'in_moderation' => $counts->moderated, + 'i18n_moderation_text' => sprintf( + /* translators: %s: Number of comments. */ + _n( '%s Comment in moderation', '%s Comments in moderation', $counts->moderated ), + number_format_i18n( $counts->moderated ) + ), + ), + ) + ); + $x->send(); +} + +// +// POST-based Ajax handlers. +// + +/** + * Ajax handler for adding a hierarchical term. + * + * @access private + * @since 3.1.0 + */ +function _wp_ajax_add_hierarchical_term() { + $action = $_POST['action']; + $taxonomy = get_taxonomy( substr( $action, 4 ) ); + check_ajax_referer( $action, '_ajax_nonce-add-' . $taxonomy->name ); + + if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) { + wp_die( -1 ); + } + + $names = explode( ',', $_POST[ 'new' . $taxonomy->name ] ); + $parent = isset( $_POST[ 'new' . $taxonomy->name . '_parent' ] ) ? (int) $_POST[ 'new' . $taxonomy->name . '_parent' ] : 0; + + if ( 0 > $parent ) { + $parent = 0; + } + + if ( 'category' === $taxonomy->name ) { + $post_category = isset( $_POST['post_category'] ) ? (array) $_POST['post_category'] : array(); + } else { + $post_category = ( isset( $_POST['tax_input'] ) && isset( $_POST['tax_input'][ $taxonomy->name ] ) ) ? (array) $_POST['tax_input'][ $taxonomy->name ] : array(); + } + + $checked_categories = array_map( 'absint', (array) $post_category ); + $popular_ids = wp_popular_terms_checklist( $taxonomy->name, 0, 10, false ); + + foreach ( $names as $cat_name ) { + $cat_name = trim( $cat_name ); + $category_nicename = sanitize_title( $cat_name ); + + if ( '' === $category_nicename ) { + continue; + } + + $cat_id = wp_insert_term( $cat_name, $taxonomy->name, array( 'parent' => $parent ) ); + + if ( ! $cat_id || is_wp_error( $cat_id ) ) { + continue; + } else { + $cat_id = $cat_id['term_id']; + } + + $checked_categories[] = $cat_id; + + if ( $parent ) { // Do these all at once in a second. + continue; + } + + ob_start(); + + wp_terms_checklist( + 0, + array( + 'taxonomy' => $taxonomy->name, + 'descendants_and_self' => $cat_id, + 'selected_cats' => $checked_categories, + 'popular_cats' => $popular_ids, + ) + ); + + $data = ob_get_clean(); + + $add = array( + 'what' => $taxonomy->name, + 'id' => $cat_id, + 'data' => str_replace( array( "\n", "\t" ), '', $data ), + 'position' => -1, + ); + } + + if ( $parent ) { // Foncy - replace the parent and all its children. + $parent = get_term( $parent, $taxonomy->name ); + $term_id = $parent->term_id; + + while ( $parent->parent ) { // Get the top parent. + $parent = get_term( $parent->parent, $taxonomy->name ); + if ( is_wp_error( $parent ) ) { + break; + } + $term_id = $parent->term_id; + } + + ob_start(); + + wp_terms_checklist( + 0, + array( + 'taxonomy' => $taxonomy->name, + 'descendants_and_self' => $term_id, + 'selected_cats' => $checked_categories, + 'popular_cats' => $popular_ids, + ) + ); + + $data = ob_get_clean(); + + $add = array( + 'what' => $taxonomy->name, + 'id' => $term_id, + 'data' => str_replace( array( "\n", "\t" ), '', $data ), + 'position' => -1, + ); + } + + ob_start(); + + wp_dropdown_categories( + array( + 'taxonomy' => $taxonomy->name, + 'hide_empty' => 0, + 'name' => 'new' . $taxonomy->name . '_parent', + 'orderby' => 'name', + 'hierarchical' => 1, + 'show_option_none' => '— ' . $taxonomy->labels->parent_item . ' —', + ) + ); + + $sup = ob_get_clean(); + + $add['supplemental'] = array( 'newcat_parent' => $sup ); + + $x = new WP_Ajax_Response( $add ); + $x->send(); +} + +/** + * Ajax handler for deleting a comment. + * + * @since 3.1.0 + */ +function wp_ajax_delete_comment() { + $id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0; + + $comment = get_comment( $id ); + + if ( ! $comment ) { + wp_die( time() ); + } + + if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) { + wp_die( -1 ); + } + + check_ajax_referer( "delete-comment_$id" ); + $status = wp_get_comment_status( $comment ); + $delta = -1; + + if ( isset( $_POST['trash'] ) && 1 == $_POST['trash'] ) { + if ( 'trash' == $status ) { + wp_die( time() ); + } + + $r = wp_trash_comment( $comment ); + } elseif ( isset( $_POST['untrash'] ) && 1 == $_POST['untrash'] ) { + if ( 'trash' != $status ) { + wp_die( time() ); + } + + $r = wp_untrash_comment( $comment ); + + // Undo trash, not in Trash. + if ( ! isset( $_POST['comment_status'] ) || 'trash' !== $_POST['comment_status'] ) { + $delta = 1; + } + } elseif ( isset( $_POST['spam'] ) && 1 == $_POST['spam'] ) { + if ( 'spam' == $status ) { + wp_die( time() ); + } + + $r = wp_spam_comment( $comment ); + } elseif ( isset( $_POST['unspam'] ) && 1 == $_POST['unspam'] ) { + if ( 'spam' != $status ) { + wp_die( time() ); + } + + $r = wp_unspam_comment( $comment ); + + // Undo spam, not in spam. + if ( ! isset( $_POST['comment_status'] ) || 'spam' !== $_POST['comment_status'] ) { + $delta = 1; + } + } elseif ( isset( $_POST['delete'] ) && 1 == $_POST['delete'] ) { + $r = wp_delete_comment( $comment ); + } else { + wp_die( -1 ); + } + + if ( $r ) { + // Decide if we need to send back '1' or a more complicated response including page links and comment counts. + _wp_ajax_delete_comment_response( $comment->comment_ID, $delta ); + } + + wp_die( 0 ); +} + +/** + * Ajax handler for deleting a tag. + * + * @since 3.1.0 + */ +function wp_ajax_delete_tag() { + $tag_id = (int) $_POST['tag_ID']; + check_ajax_referer( "delete-tag_$tag_id" ); + + if ( ! current_user_can( 'delete_term', $tag_id ) ) { + wp_die( -1 ); + } + + $taxonomy = ! empty( $_POST['taxonomy'] ) ? $_POST['taxonomy'] : 'post_tag'; + $tag = get_term( $tag_id, $taxonomy ); + + if ( ! $tag || is_wp_error( $tag ) ) { + wp_die( 1 ); + } + + if ( wp_delete_term( $tag_id, $taxonomy ) ) { + wp_die( 1 ); + } else { + wp_die( 0 ); + } +} + +/** + * Ajax handler for deleting a link. + * + * @since 3.1.0 + */ +function wp_ajax_delete_link() { + $id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0; + + check_ajax_referer( "delete-bookmark_$id" ); + + if ( ! current_user_can( 'manage_links' ) ) { + wp_die( -1 ); + } + + $link = get_bookmark( $id ); + if ( ! $link || is_wp_error( $link ) ) { + wp_die( 1 ); + } + + if ( wp_delete_link( $id ) ) { + wp_die( 1 ); + } else { + wp_die( 0 ); + } +} + +/** + * Ajax handler for deleting meta. + * + * @since 3.1.0 + */ +function wp_ajax_delete_meta() { + $id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0; + + check_ajax_referer( "delete-meta_$id" ); + $meta = get_metadata_by_mid( 'post', $id ); + + if ( ! $meta ) { + wp_die( 1 ); + } + + if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $meta->post_id, $meta->meta_key ) ) { + wp_die( -1 ); + } + + if ( delete_meta( $meta->meta_id ) ) { + wp_die( 1 ); + } + + wp_die( 0 ); +} + +/** + * Ajax handler for deleting a post. + * + * @since 3.1.0 + * + * @param string $action Action to perform. + */ +function wp_ajax_delete_post( $action ) { + if ( empty( $action ) ) { + $action = 'delete-post'; + } + + $id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0; + check_ajax_referer( "{$action}_$id" ); + + if ( ! current_user_can( 'delete_post', $id ) ) { + wp_die( -1 ); + } + + if ( ! get_post( $id ) ) { + wp_die( 1 ); + } + + if ( wp_delete_post( $id ) ) { + wp_die( 1 ); + } else { + wp_die( 0 ); + } +} + +/** + * Ajax handler for sending a post to the Trash. + * + * @since 3.1.0 + * + * @param string $action Action to perform. + */ +function wp_ajax_trash_post( $action ) { + if ( empty( $action ) ) { + $action = 'trash-post'; + } + + $id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0; + check_ajax_referer( "{$action}_$id" ); + + if ( ! current_user_can( 'delete_post', $id ) ) { + wp_die( -1 ); + } + + if ( ! get_post( $id ) ) { + wp_die( 1 ); + } + + if ( 'trash-post' == $action ) { + $done = wp_trash_post( $id ); + } else { + $done = wp_untrash_post( $id ); + } + + if ( $done ) { + wp_die( 1 ); + } + + wp_die( 0 ); +} + +/** + * Ajax handler to restore a post from the Trash. + * + * @since 3.1.0 + * + * @param string $action Action to perform. + */ +function wp_ajax_untrash_post( $action ) { + if ( empty( $action ) ) { + $action = 'untrash-post'; + } + + wp_ajax_trash_post( $action ); +} + +/** + * Ajax handler to delete a page. + * + * @since 3.1.0 + * + * @param string $action Action to perform. + */ +function wp_ajax_delete_page( $action ) { + if ( empty( $action ) ) { + $action = 'delete-page'; + } + + $id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0; + check_ajax_referer( "{$action}_$id" ); + + if ( ! current_user_can( 'delete_page', $id ) ) { + wp_die( -1 ); + } + + if ( ! get_post( $id ) ) { + wp_die( 1 ); + } + + if ( wp_delete_post( $id ) ) { + wp_die( 1 ); + } else { + wp_die( 0 ); + } +} + +/** + * Ajax handler to dim a comment. + * + * @since 3.1.0 + */ +function wp_ajax_dim_comment() { + $id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0; + $comment = get_comment( $id ); + + if ( ! $comment ) { + $x = new WP_Ajax_Response( + array( + 'what' => 'comment', + 'id' => new WP_Error( + 'invalid_comment', + /* translators: %d: Comment ID. */ + sprintf( __( 'Comment %d does not exist' ), $id ) + ), + ) + ); + $x->send(); + } + + if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) && ! current_user_can( 'moderate_comments' ) ) { + wp_die( -1 ); + } + + $current = wp_get_comment_status( $comment ); + + if ( isset( $_POST['new'] ) && $_POST['new'] == $current ) { + wp_die( time() ); + } + + check_ajax_referer( "approve-comment_$id" ); + + if ( in_array( $current, array( 'unapproved', 'spam' ) ) ) { + $result = wp_set_comment_status( $comment, 'approve', true ); + } else { + $result = wp_set_comment_status( $comment, 'hold', true ); + } + + if ( is_wp_error( $result ) ) { + $x = new WP_Ajax_Response( + array( + 'what' => 'comment', + 'id' => $result, + ) + ); + $x->send(); + } + + // Decide if we need to send back '1' or a more complicated response including page links and comment counts. + _wp_ajax_delete_comment_response( $comment->comment_ID ); + wp_die( 0 ); +} + +/** + * Ajax handler for adding a link category. + * + * @since 3.1.0 + * + * @param string $action Action to perform. + */ +function wp_ajax_add_link_category( $action ) { + if ( empty( $action ) ) { + $action = 'add-link-category'; + } + + check_ajax_referer( $action ); + $tax = get_taxonomy( 'link_category' ); + + if ( ! current_user_can( $tax->cap->manage_terms ) ) { + wp_die( -1 ); + } + + $names = explode( ',', wp_unslash( $_POST['newcat'] ) ); + $x = new WP_Ajax_Response(); + + foreach ( $names as $cat_name ) { + $cat_name = trim( $cat_name ); + $slug = sanitize_title( $cat_name ); + + if ( '' === $slug ) { + continue; + } + + $cat_id = wp_insert_term( $cat_name, 'link_category' ); + + if ( ! $cat_id || is_wp_error( $cat_id ) ) { + continue; + } else { + $cat_id = $cat_id['term_id']; + } + + $cat_name = esc_html( $cat_name ); + + $x->add( + array( + 'what' => 'link-category', + 'id' => $cat_id, + 'data' => "", + 'position' => -1, + ) + ); + } + $x->send(); +} + +/** + * Ajax handler to add a tag. + * + * @since 3.1.0 + */ +function wp_ajax_add_tag() { + check_ajax_referer( 'add-tag', '_wpnonce_add-tag' ); + $taxonomy = ! empty( $_POST['taxonomy'] ) ? $_POST['taxonomy'] : 'post_tag'; + $tax = get_taxonomy( $taxonomy ); + + if ( ! current_user_can( $tax->cap->edit_terms ) ) { + wp_die( -1 ); + } + + $x = new WP_Ajax_Response(); + + $tag = wp_insert_term( $_POST['tag-name'], $taxonomy, $_POST ); + + if ( $tag && ! is_wp_error( $tag ) ) { + $tag = get_term( $tag['term_id'], $taxonomy ); + } + + if ( ! $tag || is_wp_error( $tag ) ) { + $message = __( 'An error has occurred. Please reload the page and try again.' ); + + if ( is_wp_error( $tag ) && $tag->get_error_message() ) { + $message = $tag->get_error_message(); + } + + $x->add( + array( + 'what' => 'taxonomy', + 'data' => new WP_Error( 'error', $message ), + ) + ); + $x->send(); + } + + $wp_list_table = _get_list_table( 'WP_Terms_List_Table', array( 'screen' => $_POST['screen'] ) ); + + $level = 0; + $noparents = ''; + + if ( is_taxonomy_hierarchical( $taxonomy ) ) { + $level = count( get_ancestors( $tag->term_id, $taxonomy, 'taxonomy' ) ); + ob_start(); + $wp_list_table->single_row( $tag, $level ); + $noparents = ob_get_clean(); + } + + ob_start(); + $wp_list_table->single_row( $tag ); + $parents = ob_get_clean(); + + $x->add( + array( + 'what' => 'taxonomy', + 'supplemental' => compact( 'parents', 'noparents' ), + ) + ); + + $x->add( + array( + 'what' => 'term', + 'position' => $level, + 'supplemental' => (array) $tag, + ) + ); + + $x->send(); +} + +/** + * Ajax handler for getting a tagcloud. + * + * @since 3.1.0 + */ +function wp_ajax_get_tagcloud() { + if ( ! isset( $_POST['tax'] ) ) { + wp_die( 0 ); + } + + $taxonomy = sanitize_key( $_POST['tax'] ); + $tax = get_taxonomy( $taxonomy ); + + if ( ! $tax ) { + wp_die( 0 ); + } + + if ( ! current_user_can( $tax->cap->assign_terms ) ) { + wp_die( -1 ); + } + + $tags = get_terms( + array( + 'taxonomy' => $taxonomy, + 'number' => 45, + 'orderby' => 'count', + 'order' => 'DESC', + ) + ); + + if ( empty( $tags ) ) { + wp_die( $tax->labels->not_found ); + } + + if ( is_wp_error( $tags ) ) { + wp_die( $tags->get_error_message() ); + } + + foreach ( $tags as $key => $tag ) { + $tags[ $key ]->link = '#'; + $tags[ $key ]->id = $tag->term_id; + } + + // We need raw tag names here, so don't filter the output. + $return = wp_generate_tag_cloud( + $tags, + array( + 'filter' => 0, + 'format' => 'list', + ) + ); + + if ( empty( $return ) ) { + wp_die( 0 ); + } + + echo $return; + wp_die(); +} + +/** + * Ajax handler for getting comments. + * + * @since 3.1.0 + * + * @global int $post_id + * + * @param string $action Action to perform. + */ +function wp_ajax_get_comments( $action ) { + global $post_id; + + if ( empty( $action ) ) { + $action = 'get-comments'; + } + + check_ajax_referer( $action ); + + if ( empty( $post_id ) && ! empty( $_REQUEST['p'] ) ) { + $id = absint( $_REQUEST['p'] ); + if ( ! empty( $id ) ) { + $post_id = $id; + } + } + + if ( empty( $post_id ) ) { + wp_die( -1 ); + } + + $wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) ); + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + wp_die( -1 ); + } + + $wp_list_table->prepare_items(); + + if ( ! $wp_list_table->has_items() ) { + wp_die( 1 ); + } + + $x = new WP_Ajax_Response(); + + ob_start(); + foreach ( $wp_list_table->items as $comment ) { + if ( ! current_user_can( 'edit_comment', $comment->comment_ID ) && 0 === $comment->comment_approved ) { + continue; + } + get_comment( $comment ); + $wp_list_table->single_row( $comment ); + } + $comment_list_item = ob_get_clean(); + + $x->add( + array( + 'what' => 'comments', + 'data' => $comment_list_item, + ) + ); + + $x->send(); +} + +/** + * Ajax handler for replying to a comment. + * + * @since 3.1.0 + * + * @param string $action Action to perform. + */ +function wp_ajax_replyto_comment( $action ) { + if ( empty( $action ) ) { + $action = 'replyto-comment'; + } + + check_ajax_referer( $action, '_ajax_nonce-replyto-comment' ); + + $comment_post_ID = (int) $_POST['comment_post_ID']; + $post = get_post( $comment_post_ID ); + + if ( ! $post ) { + wp_die( -1 ); + } + + if ( ! current_user_can( 'edit_post', $comment_post_ID ) ) { + wp_die( -1 ); + } + + if ( empty( $post->post_status ) ) { + wp_die( 1 ); + } elseif ( in_array( $post->post_status, array( 'draft', 'pending', 'trash' ) ) ) { + wp_die( __( 'Error: You are replying to a comment on a draft post.' ) ); + } + + $user = wp_get_current_user(); + + if ( $user->exists() ) { + $user_ID = $user->ID; + $comment_author = wp_slash( $user->display_name ); + $comment_author_email = wp_slash( $user->user_email ); + $comment_author_url = wp_slash( $user->user_url ); + $comment_content = trim( $_POST['content'] ); + $comment_type = isset( $_POST['comment_type'] ) ? trim( $_POST['comment_type'] ) : ''; + + if ( current_user_can( 'unfiltered_html' ) ) { + if ( ! isset( $_POST['_wp_unfiltered_html_comment'] ) ) { + $_POST['_wp_unfiltered_html_comment'] = ''; + } + + if ( wp_create_nonce( 'unfiltered-html-comment' ) != $_POST['_wp_unfiltered_html_comment'] ) { + kses_remove_filters(); // Start with a clean slate. + kses_init_filters(); // Set up the filters. + remove_filter( 'pre_comment_content', 'wp_filter_post_kses' ); + add_filter( 'pre_comment_content', 'wp_filter_kses' ); + } + } + } else { + wp_die( __( 'Sorry, you must be logged in to reply to a comment.' ) ); + } + + if ( '' == $comment_content ) { + wp_die( __( 'Error: Please type a comment.' ) ); + } + + $comment_parent = 0; + + if ( isset( $_POST['comment_ID'] ) ) { + $comment_parent = absint( $_POST['comment_ID'] ); + } + + $comment_auto_approved = false; + $commentdata = compact( 'comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID' ); + + // Automatically approve parent comment. + if ( ! empty( $_POST['approve_parent'] ) ) { + $parent = get_comment( $comment_parent ); + + if ( $parent && '0' === $parent->comment_approved && $parent->comment_post_ID == $comment_post_ID ) { + if ( ! current_user_can( 'edit_comment', $parent->comment_ID ) ) { + wp_die( -1 ); + } + + if ( wp_set_comment_status( $parent, 'approve' ) ) { + $comment_auto_approved = true; + } + } + } + + $comment_id = wp_new_comment( $commentdata ); + + if ( is_wp_error( $comment_id ) ) { + wp_die( $comment_id->get_error_message() ); + } + + $comment = get_comment( $comment_id ); + + if ( ! $comment ) { + wp_die( 1 ); + } + + $position = ( isset( $_POST['position'] ) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1'; + + ob_start(); + if ( isset( $_REQUEST['mode'] ) && 'dashboard' == $_REQUEST['mode'] ) { + require_once ABSPATH . 'wp-admin/includes/dashboard.php'; + _wp_dashboard_recent_comments_row( $comment ); + } else { + if ( isset( $_REQUEST['mode'] ) && 'single' == $_REQUEST['mode'] ) { + $wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) ); + } else { + $wp_list_table = _get_list_table( 'WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) ); + } + $wp_list_table->single_row( $comment ); + } + $comment_list_item = ob_get_clean(); + + $response = array( + 'what' => 'comment', + 'id' => $comment->comment_ID, + 'data' => $comment_list_item, + 'position' => $position, + ); + + $counts = wp_count_comments(); + $response['supplemental'] = array( + 'in_moderation' => $counts->moderated, + 'i18n_comments_text' => sprintf( + /* translators: %s: Number of comments. */ + _n( '%s Comment', '%s Comments', $counts->approved ), + number_format_i18n( $counts->approved ) + ), + 'i18n_moderation_text' => sprintf( + /* translators: %s: Number of comments. */ + _n( '%s Comment in moderation', '%s Comments in moderation', $counts->moderated ), + number_format_i18n( $counts->moderated ) + ), + ); + + if ( $comment_auto_approved ) { + $response['supplemental']['parent_approved'] = $parent->comment_ID; + $response['supplemental']['parent_post_id'] = $parent->comment_post_ID; + } + + $x = new WP_Ajax_Response(); + $x->add( $response ); + $x->send(); +} + +/** + * Ajax handler for editing a comment. + * + * @since 3.1.0 + */ +function wp_ajax_edit_comment() { + check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ); + + $comment_id = (int) $_POST['comment_ID']; + + if ( ! current_user_can( 'edit_comment', $comment_id ) ) { + wp_die( -1 ); + } + + if ( '' == $_POST['content'] ) { + wp_die( __( 'Error: Please type a comment.' ) ); + } + + if ( isset( $_POST['status'] ) ) { + $_POST['comment_status'] = $_POST['status']; + } + edit_comment(); + + $position = ( isset( $_POST['position'] ) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1'; + $checkbox = ( isset( $_POST['checkbox'] ) && true == $_POST['checkbox'] ) ? 1 : 0; + $wp_list_table = _get_list_table( $checkbox ? 'WP_Comments_List_Table' : 'WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) ); + + $comment = get_comment( $comment_id ); + + if ( empty( $comment->comment_ID ) ) { + wp_die( -1 ); + } + + ob_start(); + $wp_list_table->single_row( $comment ); + $comment_list_item = ob_get_clean(); + + $x = new WP_Ajax_Response(); + + $x->add( + array( + 'what' => 'edit_comment', + 'id' => $comment->comment_ID, + 'data' => $comment_list_item, + 'position' => $position, + ) + ); + + $x->send(); +} + +/** + * Ajax handler for adding a menu item. + * + * @since 3.1.0 + */ +function wp_ajax_add_menu_item() { + check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; + + // For performance reasons, we omit some object properties from the checklist. + // The following is a hacky way to restore them when adding non-custom items. + $menu_items_data = array(); + + foreach ( (array) $_POST['menu-item'] as $menu_item_data ) { + if ( + ! empty( $menu_item_data['menu-item-type'] ) && + 'custom' != $menu_item_data['menu-item-type'] && + ! empty( $menu_item_data['menu-item-object-id'] ) + ) { + switch ( $menu_item_data['menu-item-type'] ) { + case 'post_type': + $_object = get_post( $menu_item_data['menu-item-object-id'] ); + break; + + case 'post_type_archive': + $_object = get_post_type_object( $menu_item_data['menu-item-object'] ); + break; + + case 'taxonomy': + $_object = get_term( $menu_item_data['menu-item-object-id'], $menu_item_data['menu-item-object'] ); + break; + } + + $_menu_items = array_map( 'wp_setup_nav_menu_item', array( $_object ) ); + $_menu_item = reset( $_menu_items ); + + // Restore the missing menu item properties. + $menu_item_data['menu-item-description'] = $_menu_item->description; + } + + $menu_items_data[] = $menu_item_data; + } + + $item_ids = wp_save_nav_menu_items( 0, $menu_items_data ); + if ( is_wp_error( $item_ids ) ) { + wp_die( 0 ); + } + + $menu_items = array(); + + foreach ( (array) $item_ids as $menu_item_id ) { + $menu_obj = get_post( $menu_item_id ); + + if ( ! empty( $menu_obj->ID ) ) { + $menu_obj = wp_setup_nav_menu_item( $menu_obj ); + $menu_obj->title = empty( $menu_obj->title ) ? __( 'Menu Item' ) : $menu_obj->title; + $menu_obj->label = $menu_obj->title; // Don't show "(pending)" in ajax-added items. + $menu_items[] = $menu_obj; + } + } + + /** This filter is documented in wp-admin/includes/nav-menu.php */ + $walker_class_name = apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $_POST['menu'] ); + + if ( ! class_exists( $walker_class_name ) ) { + wp_die( 0 ); + } + + if ( ! empty( $menu_items ) ) { + $args = array( + 'after' => '', + 'before' => '', + 'link_after' => '', + 'link_before' => '', + 'walker' => new $walker_class_name, + ); + + echo walk_nav_menu_tree( $menu_items, 0, (object) $args ); + } + + wp_die(); +} + +/** + * Ajax handler for adding meta. + * + * @since 3.1.0 + */ +function wp_ajax_add_meta() { + check_ajax_referer( 'add-meta', '_ajax_nonce-add-meta' ); + $c = 0; + $pid = (int) $_POST['post_id']; + $post = get_post( $pid ); + + if ( isset( $_POST['metakeyselect'] ) || isset( $_POST['metakeyinput'] ) ) { + if ( ! current_user_can( 'edit_post', $pid ) ) { + wp_die( -1 ); + } + + if ( isset( $_POST['metakeyselect'] ) && '#NONE#' == $_POST['metakeyselect'] && empty( $_POST['metakeyinput'] ) ) { + wp_die( 1 ); + } + + // If the post is an autodraft, save the post as a draft and then attempt to save the meta. + if ( 'auto-draft' === $post->post_status ) { + $post_data = array(); + $post_data['action'] = 'draft'; // Warning fix. + $post_data['post_ID'] = $pid; + $post_data['post_type'] = $post->post_type; + $post_data['post_status'] = 'draft'; + $now = time(); + /* translators: 1: Post creation date, 2: Post creation time. */ + $post_data['post_title'] = sprintf( __( 'Draft created on %1$s at %2$s' ), gmdate( __( 'F j, Y' ), $now ), gmdate( __( 'g:i a' ), $now ) ); + + $pid = edit_post( $post_data ); + + if ( $pid ) { + if ( is_wp_error( $pid ) ) { + $x = new WP_Ajax_Response( + array( + 'what' => 'meta', + 'data' => $pid, + ) + ); + $x->send(); + } + + $mid = add_meta( $pid ); + if ( ! $mid ) { + wp_die( __( 'Please provide a custom field value.' ) ); + } + } else { + wp_die( 0 ); + } + } else { + $mid = add_meta( $pid ); + if ( ! $mid ) { + wp_die( __( 'Please provide a custom field value.' ) ); + } + } + + $meta = get_metadata_by_mid( 'post', $mid ); + $pid = (int) $meta->post_id; + $meta = get_object_vars( $meta ); + + $x = new WP_Ajax_Response( + array( + 'what' => 'meta', + 'id' => $mid, + 'data' => _list_meta_row( $meta, $c ), + 'position' => 1, + 'supplemental' => array( 'postid' => $pid ), + ) + ); + } else { // Update? + $mid = (int) key( $_POST['meta'] ); + $key = wp_unslash( $_POST['meta'][ $mid ]['key'] ); + $value = wp_unslash( $_POST['meta'][ $mid ]['value'] ); + + if ( '' == trim( $key ) ) { + wp_die( __( 'Please provide a custom field name.' ) ); + } + + $meta = get_metadata_by_mid( 'post', $mid ); + + if ( ! $meta ) { + wp_die( 0 ); // If meta doesn't exist. + } + + if ( + is_protected_meta( $meta->meta_key, 'post' ) || is_protected_meta( $key, 'post' ) || + ! current_user_can( 'edit_post_meta', $meta->post_id, $meta->meta_key ) || + ! current_user_can( 'edit_post_meta', $meta->post_id, $key ) + ) { + wp_die( -1 ); + } + + if ( $meta->meta_value != $value || $meta->meta_key != $key ) { + $u = update_metadata_by_mid( 'post', $mid, $value, $key ); + if ( ! $u ) { + wp_die( 0 ); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems). + } + } + + $x = new WP_Ajax_Response( + array( + 'what' => 'meta', + 'id' => $mid, + 'old_id' => $mid, + 'data' => _list_meta_row( + array( + 'meta_key' => $key, + 'meta_value' => $value, + 'meta_id' => $mid, + ), + $c + ), + 'position' => 0, + 'supplemental' => array( 'postid' => $meta->post_id ), + ) + ); + } + $x->send(); +} + +/** + * Ajax handler for adding a user. + * + * @since 3.1.0 + * + * @param string $action Action to perform. + */ +function wp_ajax_add_user( $action ) { + if ( empty( $action ) ) { + $action = 'add-user'; + } + + check_ajax_referer( $action ); + + if ( ! current_user_can( 'create_users' ) ) { + wp_die( -1 ); + } + + $user_id = edit_user(); + + if ( ! $user_id ) { + wp_die( 0 ); + } elseif ( is_wp_error( $user_id ) ) { + $x = new WP_Ajax_Response( + array( + 'what' => 'user', + 'id' => $user_id, + ) + ); + $x->send(); + } + + $user_object = get_userdata( $user_id ); + $wp_list_table = _get_list_table( 'WP_Users_List_Table' ); + + $role = current( $user_object->roles ); + + $x = new WP_Ajax_Response( + array( + 'what' => 'user', + 'id' => $user_id, + 'data' => $wp_list_table->single_row( $user_object, '', $role ), + 'supplemental' => array( + 'show-link' => sprintf( + /* translators: %s: The new user. */ + __( 'User %s added' ), + '' . $user_object->user_login . '' + ), + 'role' => $role, + ), + ) + ); + $x->send(); +} + +/** + * Ajax handler for closed post boxes. + * + * @since 3.1.0 + */ +function wp_ajax_closed_postboxes() { + check_ajax_referer( 'closedpostboxes', 'closedpostboxesnonce' ); + $closed = isset( $_POST['closed'] ) ? explode( ',', $_POST['closed'] ) : array(); + $closed = array_filter( $closed ); + + $hidden = isset( $_POST['hidden'] ) ? explode( ',', $_POST['hidden'] ) : array(); + $hidden = array_filter( $hidden ); + + $page = isset( $_POST['page'] ) ? $_POST['page'] : ''; + + if ( sanitize_key( $page ) != $page ) { + wp_die( 0 ); + } + + $user = wp_get_current_user(); + if ( ! $user ) { + wp_die( -1 ); + } + + if ( is_array( $closed ) ) { + update_user_option( $user->ID, "closedpostboxes_$page", $closed, true ); + } + + if ( is_array( $hidden ) ) { + // Postboxes that are always shown. + $hidden = array_diff( $hidden, array( 'submitdiv', 'linksubmitdiv', 'manage-menu', 'create-menu' ) ); + update_user_option( $user->ID, "metaboxhidden_$page", $hidden, true ); + } + + wp_die( 1 ); +} + +/** + * Ajax handler for hidden columns. + * + * @since 3.1.0 + */ +function wp_ajax_hidden_columns() { + check_ajax_referer( 'screen-options-nonce', 'screenoptionnonce' ); + $page = isset( $_POST['page'] ) ? $_POST['page'] : ''; + + if ( sanitize_key( $page ) != $page ) { + wp_die( 0 ); + } + + $user = wp_get_current_user(); + if ( ! $user ) { + wp_die( -1 ); + } + + $hidden = ! empty( $_POST['hidden'] ) ? explode( ',', $_POST['hidden'] ) : array(); + update_user_option( $user->ID, "manage{$page}columnshidden", $hidden, true ); + + wp_die( 1 ); +} + +/** + * Ajax handler for updating whether to display the welcome panel. + * + * @since 3.1.0 + */ +function wp_ajax_update_welcome_panel() { + check_ajax_referer( 'welcome-panel-nonce', 'welcomepanelnonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + update_user_meta( get_current_user_id(), 'show_welcome_panel', empty( $_POST['visible'] ) ? 0 : 1 ); + + wp_die( 1 ); +} + +/** + * Ajax handler for retrieving menu meta boxes. + * + * @since 3.1.0 + */ +function wp_ajax_menu_get_metabox() { + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; + + if ( isset( $_POST['item-type'] ) && 'post_type' == $_POST['item-type'] ) { + $type = 'posttype'; + $callback = 'wp_nav_menu_item_post_type_meta_box'; + $items = (array) get_post_types( array( 'show_in_nav_menus' => true ), 'object' ); + } elseif ( isset( $_POST['item-type'] ) && 'taxonomy' == $_POST['item-type'] ) { + $type = 'taxonomy'; + $callback = 'wp_nav_menu_item_taxonomy_meta_box'; + $items = (array) get_taxonomies( array( 'show_ui' => true ), 'object' ); + } + + if ( ! empty( $_POST['item-object'] ) && isset( $items[ $_POST['item-object'] ] ) ) { + $menus_meta_box_object = $items[ $_POST['item-object'] ]; + + /** This filter is documented in wp-admin/includes/nav-menu.php */ + $item = apply_filters( 'nav_menu_meta_box_object', $menus_meta_box_object ); + + $box_args = array( + 'id' => 'add-' . $item->name, + 'title' => $item->labels->name, + 'callback' => $callback, + 'args' => $item, + ); + + ob_start(); + $callback( null, $box_args ); + + $markup = ob_get_clean(); + + echo wp_json_encode( + array( + 'replace-id' => $type . '-' . $item->name, + 'markup' => $markup, + ) + ); + } + + wp_die(); +} + +/** + * Ajax handler for internal linking. + * + * @since 3.1.0 + */ +function wp_ajax_wp_link_ajax() { + check_ajax_referer( 'internal-linking', '_ajax_linking_nonce' ); + + $args = array(); + + if ( isset( $_POST['search'] ) ) { + $args['s'] = wp_unslash( $_POST['search'] ); + } + + if ( isset( $_POST['term'] ) ) { + $args['s'] = wp_unslash( $_POST['term'] ); + } + + $args['pagenum'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1; + + if ( ! class_exists( '_WP_Editors', false ) ) { + require ABSPATH . WPINC . '/class-wp-editor.php'; + } + + $results = _WP_Editors::wp_link_query( $args ); + + if ( ! isset( $results ) ) { + wp_die( 0 ); + } + + echo wp_json_encode( $results ); + echo "\n"; + + wp_die(); +} + +/** + * Ajax handler for menu locations save. + * + * @since 3.1.0 + */ +function wp_ajax_menu_locations_save() { + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' ); + + if ( ! isset( $_POST['menu-locations'] ) ) { + wp_die( 0 ); + } + + set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_POST['menu-locations'] ) ); + wp_die( 1 ); +} + +/** + * Ajax handler for saving the meta box order. + * + * @since 3.1.0 + */ +function wp_ajax_meta_box_order() { + check_ajax_referer( 'meta-box-order' ); + $order = isset( $_POST['order'] ) ? (array) $_POST['order'] : false; + $page_columns = isset( $_POST['page_columns'] ) ? $_POST['page_columns'] : 'auto'; + + if ( 'auto' !== $page_columns ) { + $page_columns = (int) $page_columns; + } + + $page = isset( $_POST['page'] ) ? $_POST['page'] : ''; + + if ( sanitize_key( $page ) != $page ) { + wp_die( 0 ); + } + + $user = wp_get_current_user(); + if ( ! $user ) { + wp_die( -1 ); + } + + if ( $order ) { + update_user_option( $user->ID, "meta-box-order_$page", $order, true ); + } + + if ( $page_columns ) { + update_user_option( $user->ID, "screen_layout_$page", $page_columns, true ); + } + + wp_die( 1 ); +} + +/** + * Ajax handler for menu quick searching. + * + * @since 3.1.0 + */ +function wp_ajax_menu_quick_search() { + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; + + _wp_ajax_menu_quick_search( $_POST ); + + wp_die(); +} + +/** + * Ajax handler to retrieve a permalink. + * + * @since 3.1.0 + */ +function wp_ajax_get_permalink() { + check_ajax_referer( 'getpermalink', 'getpermalinknonce' ); + $post_id = isset( $_POST['post_id'] ) ? intval( $_POST['post_id'] ) : 0; + wp_die( get_preview_post_link( $post_id ) ); +} + +/** + * Ajax handler to retrieve a sample permalink. + * + * @since 3.1.0 + */ +function wp_ajax_sample_permalink() { + check_ajax_referer( 'samplepermalink', 'samplepermalinknonce' ); + $post_id = isset( $_POST['post_id'] ) ? intval( $_POST['post_id'] ) : 0; + $title = isset( $_POST['new_title'] ) ? $_POST['new_title'] : ''; + $slug = isset( $_POST['new_slug'] ) ? $_POST['new_slug'] : null; + wp_die( get_sample_permalink_html( $post_id, $title, $slug ) ); +} + +/** + * Ajax handler for Quick Edit saving a post from a list table. + * + * @since 3.1.0 + * + * @global string $mode List table view mode. + */ +function wp_ajax_inline_save() { + global $mode; + + check_ajax_referer( 'inlineeditnonce', '_inline_edit' ); + + if ( ! isset( $_POST['post_ID'] ) || ! (int) $_POST['post_ID'] ) { + wp_die(); + } + + $post_ID = (int) $_POST['post_ID']; + + if ( 'page' == $_POST['post_type'] ) { + if ( ! current_user_can( 'edit_page', $post_ID ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this page.' ) ); + } + } else { + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this post.' ) ); + } + } + + $last = wp_check_post_lock( $post_ID ); + if ( $last ) { + $last_user = get_userdata( $last ); + $last_user_name = $last_user ? $last_user->display_name : __( 'Someone' ); + + /* translators: %s: User's display name. */ + $msg_template = __( 'Saving is disabled: %s is currently editing this post.' ); + + if ( 'page' === $_POST['post_type'] ) { + /* translators: %s: User's display name. */ + $msg_template = __( 'Saving is disabled: %s is currently editing this page.' ); + } + + printf( $msg_template, esc_html( $last_user_name ) ); + wp_die(); + } + + $data = &$_POST; + + $post = get_post( $post_ID, ARRAY_A ); + + // Since it's coming from the database. + $post = wp_slash( $post ); + + $data['content'] = $post['post_content']; + $data['excerpt'] = $post['post_excerpt']; + + // Rename. + $data['user_ID'] = get_current_user_id(); + + if ( isset( $data['post_parent'] ) ) { + $data['parent_id'] = $data['post_parent']; + } + + // Status. + if ( isset( $data['keep_private'] ) && 'private' == $data['keep_private'] ) { + $data['visibility'] = 'private'; + $data['post_status'] = 'private'; + } else { + $data['post_status'] = $data['_status']; + } + + if ( empty( $data['comment_status'] ) ) { + $data['comment_status'] = 'closed'; + } + + if ( empty( $data['ping_status'] ) ) { + $data['ping_status'] = 'closed'; + } + + // Exclude terms from taxonomies that are not supposed to appear in Quick Edit. + if ( ! empty( $data['tax_input'] ) ) { + foreach ( $data['tax_input'] as $taxonomy => $terms ) { + $tax_object = get_taxonomy( $taxonomy ); + /** This filter is documented in wp-admin/includes/class-wp-posts-list-table.php */ + if ( ! apply_filters( 'quick_edit_show_taxonomy', $tax_object->show_in_quick_edit, $taxonomy, $post['post_type'] ) ) { + unset( $data['tax_input'][ $taxonomy ] ); + } + } + } + + // Hack: wp_unique_post_slug() doesn't work for drafts, so we will fake that our post is published. + if ( ! empty( $data['post_name'] ) && in_array( $post['post_status'], array( 'draft', 'pending' ) ) ) { + $post['post_status'] = 'publish'; + $data['post_name'] = wp_unique_post_slug( $data['post_name'], $post['ID'], $post['post_status'], $post['post_type'], $post['post_parent'] ); + } + + // Update the post. + edit_post(); + + $wp_list_table = _get_list_table( 'WP_Posts_List_Table', array( 'screen' => $_POST['screen'] ) ); + + $mode = 'excerpt' === $_POST['post_view'] ? 'excerpt' : 'list'; + + $level = 0; + if ( is_post_type_hierarchical( $wp_list_table->screen->post_type ) ) { + $request_post = array( get_post( $_POST['post_ID'] ) ); + $parent = $request_post[0]->post_parent; + + while ( $parent > 0 ) { + $parent_post = get_post( $parent ); + $parent = $parent_post->post_parent; + $level++; + } + } + + $wp_list_table->display_rows( array( get_post( $_POST['post_ID'] ) ), $level ); + + wp_die(); +} + +/** + * Ajax handler for quick edit saving for a term. + * + * @since 3.1.0 + */ +function wp_ajax_inline_save_tax() { + check_ajax_referer( 'taxinlineeditnonce', '_inline_edit' ); + + $taxonomy = sanitize_key( $_POST['taxonomy'] ); + $tax = get_taxonomy( $taxonomy ); + + if ( ! $tax ) { + wp_die( 0 ); + } + + if ( ! isset( $_POST['tax_ID'] ) || ! (int) $_POST['tax_ID'] ) { + wp_die( -1 ); + } + + $id = (int) $_POST['tax_ID']; + + if ( ! current_user_can( 'edit_term', $id ) ) { + wp_die( -1 ); + } + + $wp_list_table = _get_list_table( 'WP_Terms_List_Table', array( 'screen' => 'edit-' . $taxonomy ) ); + + $tag = get_term( $id, $taxonomy ); + $_POST['description'] = $tag->description; + + $updated = wp_update_term( $id, $taxonomy, $_POST ); + + if ( $updated && ! is_wp_error( $updated ) ) { + $tag = get_term( $updated['term_id'], $taxonomy ); + if ( ! $tag || is_wp_error( $tag ) ) { + if ( is_wp_error( $tag ) && $tag->get_error_message() ) { + wp_die( $tag->get_error_message() ); + } + wp_die( __( 'Item not updated.' ) ); + } + } else { + if ( is_wp_error( $updated ) && $updated->get_error_message() ) { + wp_die( $updated->get_error_message() ); + } + wp_die( __( 'Item not updated.' ) ); + } + + $level = 0; + $parent = $tag->parent; + + while ( $parent > 0 ) { + $parent_tag = get_term( $parent, $taxonomy ); + $parent = $parent_tag->parent; + $level++; + } + + $wp_list_table->single_row( $tag, $level ); + wp_die(); +} + +/** + * Ajax handler for querying posts for the Find Posts modal. + * + * @see window.findPosts + * + * @since 3.1.0 + */ +function wp_ajax_find_posts() { + check_ajax_referer( 'find-posts' ); + + $post_types = get_post_types( array( 'public' => true ), 'objects' ); + unset( $post_types['attachment'] ); + + $s = wp_unslash( $_POST['ps'] ); + $args = array( + 'post_type' => array_keys( $post_types ), + 'post_status' => 'any', + 'posts_per_page' => 50, + ); + + if ( '' !== $s ) { + $args['s'] = $s; + } + + $posts = get_posts( $args ); + + if ( ! $posts ) { + wp_send_json_error( __( 'No items found.' ) ); + } + + $html = ''; + $alt = ''; + foreach ( $posts as $post ) { + $title = trim( $post->post_title ) ? $post->post_title : __( '(no title)' ); + $alt = ( 'alternate' == $alt ) ? '' : 'alternate'; + + switch ( $post->post_status ) { + case 'publish': + case 'private': + $stat = __( 'Published' ); + break; + case 'future': + $stat = __( 'Scheduled' ); + break; + case 'pending': + $stat = __( 'Pending Review' ); + break; + case 'draft': + $stat = __( 'Draft' ); + break; + } + + if ( '0000-00-00 00:00:00' == $post->post_date ) { + $time = ''; + } else { + /* translators: Date format in table columns, see https://www.php.net/date */ + $time = mysql2date( __( 'Y/m/d' ), $post->post_date ); + } + + $html .= ''; + $html .= '' . "\n\n"; + } + + $html .= '

        ' . __( 'Title' ) . '' . __( 'Type' ) . '' . __( 'Date' ) . '' . __( 'Status' ) . '
        ' . esc_html( $post_types[ $post->post_type ]->labels->singular_name ) . '' . esc_html( $time ) . '' . esc_html( $stat ) . '
        '; + + wp_send_json_success( $html ); +} + +/** + * Ajax handler for saving the widgets order. + * + * @since 3.1.0 + */ +function wp_ajax_widgets_order() { + check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + unset( $_POST['savewidgets'], $_POST['action'] ); + + // Save widgets order for all sidebars. + if ( is_array( $_POST['sidebars'] ) ) { + $sidebars = array(); + + foreach ( wp_unslash( $_POST['sidebars'] ) as $key => $val ) { + $sb = array(); + + if ( ! empty( $val ) ) { + $val = explode( ',', $val ); + + foreach ( $val as $k => $v ) { + if ( strpos( $v, 'widget-' ) === false ) { + continue; + } + + $sb[ $k ] = substr( $v, strpos( $v, '_' ) + 1 ); + } + } + $sidebars[ $key ] = $sb; + } + + wp_set_sidebars_widgets( $sidebars ); + wp_die( 1 ); + } + + wp_die( -1 ); +} + +/** + * Ajax handler for saving a widget. + * + * @since 3.1.0 + * + * @global array $wp_registered_widgets + * @global array $wp_registered_widget_controls + * @global array $wp_registered_widget_updates + */ +function wp_ajax_save_widget() { + global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates; + + check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' ); + + if ( ! current_user_can( 'edit_theme_options' ) || ! isset( $_POST['id_base'] ) ) { + wp_die( -1 ); + } + + unset( $_POST['savewidgets'], $_POST['action'] ); + + /** + * Fires early when editing the widgets displayed in sidebars. + * + * @since 2.8.0 + */ + do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /** + * Fires early when editing the widgets displayed in sidebars. + * + * @since 2.8.0 + */ + do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /** This action is documented in wp-admin/widgets.php */ + do_action( 'sidebar_admin_setup' ); + + $id_base = wp_unslash( $_POST['id_base'] ); + $widget_id = wp_unslash( $_POST['widget-id'] ); + $sidebar_id = $_POST['sidebar']; + $multi_number = ! empty( $_POST['multi_number'] ) ? (int) $_POST['multi_number'] : 0; + $settings = isset( $_POST[ 'widget-' . $id_base ] ) && is_array( $_POST[ 'widget-' . $id_base ] ) ? $_POST[ 'widget-' . $id_base ] : false; + $error = '

        ' . __( 'An error has occurred. Please reload the page and try again.' ) . '

        '; + + $sidebars = wp_get_sidebars_widgets(); + $sidebar = isset( $sidebars[ $sidebar_id ] ) ? $sidebars[ $sidebar_id ] : array(); + + // Delete. + if ( isset( $_POST['delete_widget'] ) && $_POST['delete_widget'] ) { + + if ( ! isset( $wp_registered_widgets[ $widget_id ] ) ) { + wp_die( $error ); + } + + $sidebar = array_diff( $sidebar, array( $widget_id ) ); + $_POST = array( + 'sidebar' => $sidebar_id, + 'widget-' . $id_base => array(), + 'the-widget-id' => $widget_id, + 'delete_widget' => '1', + ); + + /** This action is documented in wp-admin/widgets.php */ + do_action( 'delete_widget', $widget_id, $sidebar_id, $id_base ); + + } elseif ( $settings && preg_match( '/__i__|%i%/', key( $settings ) ) ) { + if ( ! $multi_number ) { + wp_die( $error ); + } + + $_POST[ 'widget-' . $id_base ] = array( $multi_number => reset( $settings ) ); + $widget_id = $id_base . '-' . $multi_number; + $sidebar[] = $widget_id; + } + $_POST['widget-id'] = $sidebar; + + foreach ( (array) $wp_registered_widget_updates as $name => $control ) { + + if ( $name == $id_base ) { + if ( ! is_callable( $control['callback'] ) ) { + continue; + } + + ob_start(); + call_user_func_array( $control['callback'], $control['params'] ); + ob_end_clean(); + break; + } + } + + if ( isset( $_POST['delete_widget'] ) && $_POST['delete_widget'] ) { + $sidebars[ $sidebar_id ] = $sidebar; + wp_set_sidebars_widgets( $sidebars ); + echo "deleted:$widget_id"; + wp_die(); + } + + if ( ! empty( $_POST['add_new'] ) ) { + wp_die(); + } + + $form = $wp_registered_widget_controls[ $widget_id ]; + if ( $form ) { + call_user_func_array( $form['callback'], $form['params'] ); + } + + wp_die(); +} + +/** + * Ajax handler for saving a widget. + * + * @since 3.9.0 + * + * @global WP_Customize_Manager $wp_customize + */ +function wp_ajax_update_widget() { + global $wp_customize; + $wp_customize->widgets->wp_ajax_update_widget(); +} + +/** + * Ajax handler for removing inactive widgets. + * + * @since 4.4.0 + */ +function wp_ajax_delete_inactive_widgets() { + check_ajax_referer( 'remove-inactive-widgets', 'removeinactivewidgets' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + unset( $_POST['removeinactivewidgets'], $_POST['action'] ); + /** This action is documented in wp-admin/includes/ajax-actions.php */ + do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + /** This action is documented in wp-admin/includes/ajax-actions.php */ + do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + /** This action is documented in wp-admin/widgets.php */ + do_action( 'sidebar_admin_setup' ); + + $sidebars_widgets = wp_get_sidebars_widgets(); + + foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) { + $pieces = explode( '-', $widget_id ); + $multi_number = array_pop( $pieces ); + $id_base = implode( '-', $pieces ); + $widget = get_option( 'widget_' . $id_base ); + unset( $widget[ $multi_number ] ); + update_option( 'widget_' . $id_base, $widget ); + unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] ); + } + + wp_set_sidebars_widgets( $sidebars_widgets ); + + wp_die(); +} + +/** + * Ajax handler for creating missing image sub-sizes for just uploaded images. + * + * @since 5.3.0 + */ +function wp_ajax_media_create_image_subsizes() { + check_ajax_referer( 'media-form' ); + + if ( ! current_user_can( 'upload_files' ) ) { + wp_send_json_error( array( 'message' => __( 'Sorry, you are not allowed to upload files.' ) ) ); + } + + if ( empty( $_POST['attachment_id'] ) ) { + wp_send_json_error( array( 'message' => __( 'Upload failed. Please reload and try again.' ) ) ); + } + + $attachment_id = (int) $_POST['attachment_id']; + + if ( ! empty( $_POST['_wp_upload_failed_cleanup'] ) ) { + // Upload failed. Cleanup. + if ( wp_attachment_is_image( $attachment_id ) && current_user_can( 'delete_post', $attachment_id ) ) { + $attachment = get_post( $attachment_id ); + + // Created at most 10 min ago. + if ( $attachment && ( time() - strtotime( $attachment->post_date_gmt ) < 600 ) ) { + wp_delete_attachment( $attachment_id, true ); + wp_send_json_success(); + } + } + } + + // Set a custom header with the attachment_id. + // Used by the browser/client to resume creating image sub-sizes after a PHP fatal error. + if ( ! headers_sent() ) { + header( 'X-WP-Upload-Attachment-ID: ' . $attachment_id ); + } + + // This can still be pretty slow and cause timeout or out of memory errors. + // The js that handles the response would need to also handle HTTP 500 errors. + wp_update_image_subsizes( $attachment_id ); + + if ( ! empty( $_POST['_legacy_support'] ) ) { + // The old (inline) uploader. Only needs the attachment_id. + $response = array( 'id' => $attachment_id ); + } else { + // Media modal and Media Library grid view. + $response = wp_prepare_attachment_for_js( $attachment_id ); + + if ( ! $response ) { + wp_send_json_error( array( 'message' => __( 'Upload failed.' ) ) ); + } + } + + // At this point the image has been uploaded successfully. + wp_send_json_success( $response ); +} + +/** + * Ajax handler for uploading attachments + * + * @since 3.3.0 + */ +function wp_ajax_upload_attachment() { + check_ajax_referer( 'media-form' ); + /* + * This function does not use wp_send_json_success() / wp_send_json_error() + * as the html4 Plupload handler requires a text/html content-type for older IE. + * See https://core.trac.wordpress.org/ticket/31037 + */ + + if ( ! current_user_can( 'upload_files' ) ) { + echo wp_json_encode( + array( + 'success' => false, + 'data' => array( + 'message' => __( 'Sorry, you are not allowed to upload files.' ), + 'filename' => esc_html( $_FILES['async-upload']['name'] ), + ), + ) + ); + + wp_die(); + } + + if ( isset( $_REQUEST['post_id'] ) ) { + $post_id = $_REQUEST['post_id']; + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + echo wp_json_encode( + array( + 'success' => false, + 'data' => array( + 'message' => __( 'Sorry, you are not allowed to attach files to this post.' ), + 'filename' => esc_html( $_FILES['async-upload']['name'] ), + ), + ) + ); + + wp_die(); + } + } else { + $post_id = null; + } + + $post_data = ! empty( $_REQUEST['post_data'] ) ? _wp_get_allowed_postdata( _wp_translate_postdata( false, (array) $_REQUEST['post_data'] ) ) : array(); + + if ( is_wp_error( $post_data ) ) { + wp_die( $post_data->get_error_message() ); + } + + // If the context is custom header or background, make sure the uploaded file is an image. + if ( isset( $post_data['context'] ) && in_array( $post_data['context'], array( 'custom-header', 'custom-background' ) ) ) { + $wp_filetype = wp_check_filetype_and_ext( $_FILES['async-upload']['tmp_name'], $_FILES['async-upload']['name'] ); + + if ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) ) { + echo wp_json_encode( + array( + 'success' => false, + 'data' => array( + 'message' => __( 'The uploaded file is not a valid image. Please try again.' ), + 'filename' => esc_html( $_FILES['async-upload']['name'] ), + ), + ) + ); + + wp_die(); + } + } + + $attachment_id = media_handle_upload( 'async-upload', $post_id, $post_data ); + + if ( is_wp_error( $attachment_id ) ) { + echo wp_json_encode( + array( + 'success' => false, + 'data' => array( + 'message' => $attachment_id->get_error_message(), + 'filename' => esc_html( $_FILES['async-upload']['name'] ), + ), + ) + ); + + wp_die(); + } + + if ( isset( $post_data['context'] ) && isset( $post_data['theme'] ) ) { + if ( 'custom-background' === $post_data['context'] ) { + update_post_meta( $attachment_id, '_wp_attachment_is_custom_background', $post_data['theme'] ); + } + + if ( 'custom-header' === $post_data['context'] ) { + update_post_meta( $attachment_id, '_wp_attachment_is_custom_header', $post_data['theme'] ); + } + } + + $attachment = wp_prepare_attachment_for_js( $attachment_id ); + if ( ! $attachment ) { + wp_die(); + } + + echo wp_json_encode( + array( + 'success' => true, + 'data' => $attachment, + ) + ); + + wp_die(); +} + +/** + * Ajax handler for image editing. + * + * @since 3.1.0 + */ +function wp_ajax_image_editor() { + $attachment_id = intval( $_POST['postid'] ); + + if ( empty( $attachment_id ) || ! current_user_can( 'edit_post', $attachment_id ) ) { + wp_die( -1 ); + } + + check_ajax_referer( "image_editor-$attachment_id" ); + include_once ABSPATH . 'wp-admin/includes/image-edit.php'; + + $msg = false; + switch ( $_POST['do'] ) { + case 'save': + $msg = wp_save_image( $attachment_id ); + $msg = wp_json_encode( $msg ); + wp_die( $msg ); + break; + case 'scale': + $msg = wp_save_image( $attachment_id ); + break; + case 'restore': + $msg = wp_restore_image( $attachment_id ); + break; + } + + wp_image_editor( $attachment_id, $msg ); + wp_die(); +} + +/** + * Ajax handler for setting the featured image. + * + * @since 3.1.0 + */ +function wp_ajax_set_post_thumbnail() { + $json = ! empty( $_REQUEST['json'] ); // New-style request. + + $post_ID = intval( $_POST['post_id'] ); + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + wp_die( -1 ); + } + + $thumbnail_id = intval( $_POST['thumbnail_id'] ); + + if ( $json ) { + check_ajax_referer( "update-post_$post_ID" ); + } else { + check_ajax_referer( "set_post_thumbnail-$post_ID" ); + } + + if ( '-1' == $thumbnail_id ) { + if ( delete_post_thumbnail( $post_ID ) ) { + $return = _wp_post_thumbnail_html( null, $post_ID ); + $json ? wp_send_json_success( $return ) : wp_die( $return ); + } else { + wp_die( 0 ); + } + } + + if ( set_post_thumbnail( $post_ID, $thumbnail_id ) ) { + $return = _wp_post_thumbnail_html( $thumbnail_id, $post_ID ); + $json ? wp_send_json_success( $return ) : wp_die( $return ); + } + + wp_die( 0 ); +} + +/** + * Ajax handler for retrieving HTML for the featured image. + * + * @since 4.6.0 + */ +function wp_ajax_get_post_thumbnail_html() { + $post_ID = intval( $_POST['post_id'] ); + + check_ajax_referer( "update-post_$post_ID" ); + + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + wp_die( -1 ); + } + + $thumbnail_id = intval( $_POST['thumbnail_id'] ); + + // For backward compatibility, -1 refers to no featured image. + if ( -1 === $thumbnail_id ) { + $thumbnail_id = null; + } + + $return = _wp_post_thumbnail_html( $thumbnail_id, $post_ID ); + wp_send_json_success( $return ); +} + +/** + * Ajax handler for setting the featured image for an attachment. + * + * @since 4.0.0 + * + * @see set_post_thumbnail() + */ +function wp_ajax_set_attachment_thumbnail() { + if ( empty( $_POST['urls'] ) || ! is_array( $_POST['urls'] ) ) { + wp_send_json_error(); + } + + $thumbnail_id = (int) $_POST['thumbnail_id']; + if ( empty( $thumbnail_id ) ) { + wp_send_json_error(); + } + + $post_ids = array(); + // For each URL, try to find its corresponding post ID. + foreach ( $_POST['urls'] as $url ) { + $post_id = attachment_url_to_postid( $url ); + if ( ! empty( $post_id ) ) { + $post_ids[] = $post_id; + } + } + + if ( empty( $post_ids ) ) { + wp_send_json_error(); + } + + $success = 0; + // For each found attachment, set its thumbnail. + foreach ( $post_ids as $post_id ) { + if ( ! current_user_can( 'edit_post', $post_id ) ) { + continue; + } + + if ( set_post_thumbnail( $post_id, $thumbnail_id ) ) { + $success++; + } + } + + if ( 0 === $success ) { + wp_send_json_error(); + } else { + wp_send_json_success(); + } + + wp_send_json_error(); +} + +/** + * Ajax handler for date formatting. + * + * @since 3.1.0 + */ +function wp_ajax_date_format() { + wp_die( date_i18n( sanitize_option( 'date_format', wp_unslash( $_POST['date'] ) ) ) ); +} + +/** + * Ajax handler for time formatting. + * + * @since 3.1.0 + */ +function wp_ajax_time_format() { + wp_die( date_i18n( sanitize_option( 'time_format', wp_unslash( $_POST['date'] ) ) ) ); +} + +/** + * Ajax handler for saving posts from the fullscreen editor. + * + * @since 3.1.0 + * @deprecated 4.3.0 + */ +function wp_ajax_wp_fullscreen_save_post() { + $post_id = isset( $_POST['post_ID'] ) ? (int) $_POST['post_ID'] : 0; + + $post = null; + + if ( $post_id ) { + $post = get_post( $post_id ); + } + + check_ajax_referer( 'update-post_' . $post_id, '_wpnonce' ); + + $post_id = edit_post(); + + if ( is_wp_error( $post_id ) ) { + wp_send_json_error(); + } + + if ( $post ) { + $last_date = mysql2date( __( 'F j, Y' ), $post->post_modified ); + $last_time = mysql2date( __( 'g:i a' ), $post->post_modified ); + } else { + $last_date = date_i18n( __( 'F j, Y' ) ); + $last_time = date_i18n( __( 'g:i a' ) ); + } + + $last_id = get_post_meta( $post_id, '_edit_last', true ); + if ( $last_id ) { + $last_user = get_userdata( $last_id ); + /* translators: 1: User's display name, 2: Date of last edit, 3: Time of last edit. */ + $last_edited = sprintf( __( 'Last edited by %1$s on %2$s at %3$s' ), esc_html( $last_user->display_name ), $last_date, $last_time ); + } else { + /* translators: 1: Date of last edit, 2: Time of last edit. */ + $last_edited = sprintf( __( 'Last edited on %1$s at %2$s' ), $last_date, $last_time ); + } + + wp_send_json_success( array( 'last_edited' => $last_edited ) ); +} + +/** + * Ajax handler for removing a post lock. + * + * @since 3.1.0 + */ +function wp_ajax_wp_remove_post_lock() { + if ( empty( $_POST['post_ID'] ) || empty( $_POST['active_post_lock'] ) ) { + wp_die( 0 ); + } + + $post_id = (int) $_POST['post_ID']; + $post = get_post( $post_id ); + + if ( ! $post ) { + wp_die( 0 ); + } + + check_ajax_referer( 'update-post_' . $post_id ); + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + wp_die( -1 ); + } + + $active_lock = array_map( 'absint', explode( ':', $_POST['active_post_lock'] ) ); + + if ( get_current_user_id() != $active_lock[1] ) { + wp_die( 0 ); + } + + /** + * Filters the post lock window duration. + * + * @since 3.3.0 + * + * @param int $interval The interval in seconds the post lock duration + * should last, plus 5 seconds. Default 150. + */ + $new_lock = ( time() - apply_filters( 'wp_check_post_lock_window', 150 ) + 5 ) . ':' . $active_lock[1]; + update_post_meta( $post_id, '_edit_lock', $new_lock, implode( ':', $active_lock ) ); + wp_die( 1 ); +} + +/** + * Ajax handler for dismissing a WordPress pointer. + * + * @since 3.1.0 + */ +function wp_ajax_dismiss_wp_pointer() { + $pointer = $_POST['pointer']; + + if ( sanitize_key( $pointer ) != $pointer ) { + wp_die( 0 ); + } + + // check_ajax_referer( 'dismiss-pointer_' . $pointer ); + + $dismissed = array_filter( explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) ) ); + + if ( in_array( $pointer, $dismissed ) ) { + wp_die( 0 ); + } + + $dismissed[] = $pointer; + $dismissed = implode( ',', $dismissed ); + + update_user_meta( get_current_user_id(), 'dismissed_wp_pointers', $dismissed ); + wp_die( 1 ); +} + +/** + * Ajax handler for getting an attachment. + * + * @since 3.5.0 + */ +function wp_ajax_get_attachment() { + if ( ! isset( $_REQUEST['id'] ) ) { + wp_send_json_error(); + } + + $id = absint( $_REQUEST['id'] ); + if ( ! $id ) { + wp_send_json_error(); + } + + $post = get_post( $id ); + if ( ! $post ) { + wp_send_json_error(); + } + + if ( 'attachment' != $post->post_type ) { + wp_send_json_error(); + } + + if ( ! current_user_can( 'upload_files' ) ) { + wp_send_json_error(); + } + + $attachment = wp_prepare_attachment_for_js( $id ); + if ( ! $attachment ) { + wp_send_json_error(); + } + + wp_send_json_success( $attachment ); +} + +/** + * Ajax handler for querying attachments. + * + * @since 3.5.0 + */ +function wp_ajax_query_attachments() { + if ( ! current_user_can( 'upload_files' ) ) { + wp_send_json_error(); + } + + $query = isset( $_REQUEST['query'] ) ? (array) $_REQUEST['query'] : array(); + $keys = array( + 's', + 'order', + 'orderby', + 'posts_per_page', + 'paged', + 'post_mime_type', + 'post_parent', + 'author', + 'post__in', + 'post__not_in', + 'year', + 'monthnum', + ); + + foreach ( get_taxonomies_for_attachments( 'objects' ) as $t ) { + if ( $t->query_var && isset( $query[ $t->query_var ] ) ) { + $keys[] = $t->query_var; + } + } + + $query = array_intersect_key( $query, array_flip( $keys ) ); + $query['post_type'] = 'attachment'; + + if ( + MEDIA_TRASH && + ! empty( $_REQUEST['query']['post_status'] ) && + 'trash' === $_REQUEST['query']['post_status'] + ) { + $query['post_status'] = 'trash'; + } else { + $query['post_status'] = 'inherit'; + } + + if ( current_user_can( get_post_type_object( 'attachment' )->cap->read_private_posts ) ) { + $query['post_status'] .= ',private'; + } + + // Filter query clauses to include filenames. + if ( isset( $query['s'] ) ) { + add_filter( 'posts_clauses', '_filter_query_attachment_filenames' ); + } + + /** + * Filters the arguments passed to WP_Query during an Ajax + * call for querying attachments. + * + * @since 3.7.0 + * + * @see WP_Query::parse_query() + * + * @param array $query An array of query variables. + */ + $query = apply_filters( 'ajax_query_attachments_args', $query ); + $query = new WP_Query( $query ); + + $posts = array_map( 'wp_prepare_attachment_for_js', $query->posts ); + $posts = array_filter( $posts ); + + wp_send_json_success( $posts ); +} + +/** + * Ajax handler for updating attachment attributes. + * + * @since 3.5.0 + */ +function wp_ajax_save_attachment() { + if ( ! isset( $_REQUEST['id'] ) || ! isset( $_REQUEST['changes'] ) ) { + wp_send_json_error(); + } + + $id = absint( $_REQUEST['id'] ); + if ( ! $id ) { + wp_send_json_error(); + } + + check_ajax_referer( 'update-post_' . $id, 'nonce' ); + + if ( ! current_user_can( 'edit_post', $id ) ) { + wp_send_json_error(); + } + + $changes = $_REQUEST['changes']; + $post = get_post( $id, ARRAY_A ); + + if ( 'attachment' != $post['post_type'] ) { + wp_send_json_error(); + } + + if ( isset( $changes['parent'] ) ) { + $post['post_parent'] = $changes['parent']; + } + + if ( isset( $changes['title'] ) ) { + $post['post_title'] = $changes['title']; + } + + if ( isset( $changes['caption'] ) ) { + $post['post_excerpt'] = $changes['caption']; + } + + if ( isset( $changes['description'] ) ) { + $post['post_content'] = $changes['description']; + } + + if ( MEDIA_TRASH && isset( $changes['status'] ) ) { + $post['post_status'] = $changes['status']; + } + + if ( isset( $changes['alt'] ) ) { + $alt = wp_unslash( $changes['alt'] ); + if ( get_post_meta( $id, '_wp_attachment_image_alt', true ) !== $alt ) { + $alt = wp_strip_all_tags( $alt, true ); + update_post_meta( $id, '_wp_attachment_image_alt', wp_slash( $alt ) ); + } + } + + if ( wp_attachment_is( 'audio', $post['ID'] ) ) { + $changed = false; + $id3data = wp_get_attachment_metadata( $post['ID'] ); + + if ( ! is_array( $id3data ) ) { + $changed = true; + $id3data = array(); + } + + foreach ( wp_get_attachment_id3_keys( (object) $post, 'edit' ) as $key => $label ) { + if ( isset( $changes[ $key ] ) ) { + $changed = true; + $id3data[ $key ] = sanitize_text_field( wp_unslash( $changes[ $key ] ) ); + } + } + + if ( $changed ) { + wp_update_attachment_metadata( $id, $id3data ); + } + } + + if ( MEDIA_TRASH && isset( $changes['status'] ) && 'trash' === $changes['status'] ) { + wp_delete_post( $id ); + } else { + wp_update_post( $post ); + } + + wp_send_json_success(); +} + +/** + * Ajax handler for saving backward compatible attachment attributes. + * + * @since 3.5.0 + */ +function wp_ajax_save_attachment_compat() { + if ( ! isset( $_REQUEST['id'] ) ) { + wp_send_json_error(); + } + + $id = absint( $_REQUEST['id'] ); + if ( ! $id ) { + wp_send_json_error(); + } + + if ( empty( $_REQUEST['attachments'] ) || empty( $_REQUEST['attachments'][ $id ] ) ) { + wp_send_json_error(); + } + + $attachment_data = $_REQUEST['attachments'][ $id ]; + + check_ajax_referer( 'update-post_' . $id, 'nonce' ); + + if ( ! current_user_can( 'edit_post', $id ) ) { + wp_send_json_error(); + } + + $post = get_post( $id, ARRAY_A ); + + if ( 'attachment' != $post['post_type'] ) { + wp_send_json_error(); + } + + /** This filter is documented in wp-admin/includes/media.php */ + $post = apply_filters( 'attachment_fields_to_save', $post, $attachment_data ); + + if ( isset( $post['errors'] ) ) { + $errors = $post['errors']; // @todo return me and display me! + unset( $post['errors'] ); + } + + wp_update_post( $post ); + + foreach ( get_attachment_taxonomies( $post ) as $taxonomy ) { + if ( isset( $attachment_data[ $taxonomy ] ) ) { + wp_set_object_terms( $id, array_map( 'trim', preg_split( '/,+/', $attachment_data[ $taxonomy ] ) ), $taxonomy, false ); + } + } + + $attachment = wp_prepare_attachment_for_js( $id ); + + if ( ! $attachment ) { + wp_send_json_error(); + } + + wp_send_json_success( $attachment ); +} + +/** + * Ajax handler for saving the attachment order. + * + * @since 3.5.0 + */ +function wp_ajax_save_attachment_order() { + if ( ! isset( $_REQUEST['post_id'] ) ) { + wp_send_json_error(); + } + + $post_id = absint( $_REQUEST['post_id'] ); + if ( ! $post_id ) { + wp_send_json_error(); + } + + if ( empty( $_REQUEST['attachments'] ) ) { + wp_send_json_error(); + } + + check_ajax_referer( 'update-post_' . $post_id, 'nonce' ); + + $attachments = $_REQUEST['attachments']; + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + wp_send_json_error(); + } + + foreach ( $attachments as $attachment_id => $menu_order ) { + if ( ! current_user_can( 'edit_post', $attachment_id ) ) { + continue; + } + + $attachment = get_post( $attachment_id ); + + if ( ! $attachment ) { + continue; + } + + if ( 'attachment' != $attachment->post_type ) { + continue; + } + + wp_update_post( + array( + 'ID' => $attachment_id, + 'menu_order' => $menu_order, + ) + ); + } + + wp_send_json_success(); +} + +/** + * Ajax handler for sending an attachment to the editor. + * + * Generates the HTML to send an attachment to the editor. + * Backward compatible with the {@see 'media_send_to_editor'} filter + * and the chain of filters that follow. + * + * @since 3.5.0 + */ +function wp_ajax_send_attachment_to_editor() { + check_ajax_referer( 'media-send-to-editor', 'nonce' ); + + $attachment = wp_unslash( $_POST['attachment'] ); + + $id = intval( $attachment['id'] ); + + $post = get_post( $id ); + if ( ! $post ) { + wp_send_json_error(); + } + + if ( 'attachment' != $post->post_type ) { + wp_send_json_error(); + } + + if ( current_user_can( 'edit_post', $id ) ) { + // If this attachment is unattached, attach it. Primarily a back compat thing. + $insert_into_post_id = intval( $_POST['post_id'] ); + + if ( 0 == $post->post_parent && $insert_into_post_id ) { + wp_update_post( + array( + 'ID' => $id, + 'post_parent' => $insert_into_post_id, + ) + ); + } + } + + $url = empty( $attachment['url'] ) ? '' : $attachment['url']; + $rel = ( strpos( $url, 'attachment_id' ) || get_attachment_link( $id ) == $url ); + + remove_filter( 'media_send_to_editor', 'image_media_send_to_editor' ); + + if ( 'image' === substr( $post->post_mime_type, 0, 5 ) ) { + $align = isset( $attachment['align'] ) ? $attachment['align'] : 'none'; + $size = isset( $attachment['image-size'] ) ? $attachment['image-size'] : 'medium'; + $alt = isset( $attachment['image_alt'] ) ? $attachment['image_alt'] : ''; + + // No whitespace-only captions. + $caption = isset( $attachment['post_excerpt'] ) ? $attachment['post_excerpt'] : ''; + if ( '' === trim( $caption ) ) { + $caption = ''; + } + + $title = ''; // We no longer insert title tags into tags, as they are redundant. + $html = get_image_send_to_editor( $id, $caption, $title, $align, $url, $rel, $size, $alt ); + } elseif ( wp_attachment_is( 'video', $post ) || wp_attachment_is( 'audio', $post ) ) { + $html = stripslashes_deep( $_POST['html'] ); + } else { + $html = isset( $attachment['post_title'] ) ? $attachment['post_title'] : ''; + $rel = $rel ? ' rel="attachment wp-att-' . $id . '"' : ''; // Hard-coded string, $id is already sanitized. + + if ( ! empty( $url ) ) { + $html = '' . $html . ''; + } + } + + /** This filter is documented in wp-admin/includes/media.php */ + $html = apply_filters( 'media_send_to_editor', $html, $id, $attachment ); + + wp_send_json_success( $html ); +} + +/** + * Ajax handler for sending a link to the editor. + * + * Generates the HTML to send a non-image embed link to the editor. + * + * Backward compatible with the following filters: + * - file_send_to_editor_url + * - audio_send_to_editor_url + * - video_send_to_editor_url + * + * @since 3.5.0 + * + * @global WP_Post $post Global post object. + * @global WP_Embed $wp_embed + */ +function wp_ajax_send_link_to_editor() { + global $post, $wp_embed; + + check_ajax_referer( 'media-send-to-editor', 'nonce' ); + + $src = wp_unslash( $_POST['src'] ); + if ( ! $src ) { + wp_send_json_error(); + } + + if ( ! strpos( $src, '://' ) ) { + $src = 'http://' . $src; + } + + $src = esc_url_raw( $src ); + if ( ! $src ) { + wp_send_json_error(); + } + + $link_text = trim( wp_unslash( $_POST['link_text'] ) ); + if ( ! $link_text ) { + $link_text = wp_basename( $src ); + } + + $post = get_post( isset( $_POST['post_id'] ) ? $_POST['post_id'] : 0 ); + + // Ping WordPress for an embed. + $check_embed = $wp_embed->run_shortcode( '[embed]' . $src . '[/embed]' ); + + // Fallback that WordPress creates when no oEmbed was found. + $fallback = $wp_embed->maybe_make_link( $src ); + + if ( $check_embed !== $fallback ) { + // TinyMCE view for [embed] will parse this. + $html = '[embed]' . $src . '[/embed]'; + } elseif ( $link_text ) { + $html = '' . $link_text . ''; + } else { + $html = ''; + } + + // Figure out what filter to run: + $type = 'file'; + $ext = preg_replace( '/^.+?\.([^.]+)$/', '$1', $src ); + if ( $ext ) { + $ext_type = wp_ext2type( $ext ); + if ( 'audio' == $ext_type || 'video' == $ext_type ) { + $type = $ext_type; + } + } + + /** This filter is documented in wp-admin/includes/media.php */ + $html = apply_filters( "{$type}_send_to_editor_url", $html, $src, $link_text ); + + wp_send_json_success( $html ); +} + +/** + * Ajax handler for the Heartbeat API. + * + * Runs when the user is logged in. + * + * @since 3.6.0 + */ +function wp_ajax_heartbeat() { + if ( empty( $_POST['_nonce'] ) ) { + wp_send_json_error(); + } + + $response = array(); + $data = array(); + $nonce_state = wp_verify_nonce( $_POST['_nonce'], 'heartbeat-nonce' ); + + // 'screen_id' is the same as $current_screen->id and the JS global 'pagenow'. + if ( ! empty( $_POST['screen_id'] ) ) { + $screen_id = sanitize_key( $_POST['screen_id'] ); + } else { + $screen_id = 'front'; + } + + if ( ! empty( $_POST['data'] ) ) { + $data = wp_unslash( (array) $_POST['data'] ); + } + + if ( 1 !== $nonce_state ) { + /** + * Filters the nonces to send to the New/Edit Post screen. + * + * @since 4.3.0 + * + * @param array $response The Heartbeat response. + * @param array $data The $_POST data sent. + * @param string $screen_id The screen id. + */ + $response = apply_filters( 'wp_refresh_nonces', $response, $data, $screen_id ); + + if ( false === $nonce_state ) { + // User is logged in but nonces have expired. + $response['nonces_expired'] = true; + wp_send_json( $response ); + } + } + + if ( ! empty( $data ) ) { + /** + * Filters the Heartbeat response received. + * + * @since 3.6.0 + * + * @param array $response The Heartbeat response. + * @param array $data The $_POST data sent. + * @param string $screen_id The screen id. + */ + $response = apply_filters( 'heartbeat_received', $response, $data, $screen_id ); + } + + /** + * Filters the Heartbeat response sent. + * + * @since 3.6.0 + * + * @param array $response The Heartbeat response. + * @param string $screen_id The screen id. + */ + $response = apply_filters( 'heartbeat_send', $response, $screen_id ); + + /** + * Fires when Heartbeat ticks in logged-in environments. + * + * Allows the transport to be easily replaced with long-polling. + * + * @since 3.6.0 + * + * @param array $response The Heartbeat response. + * @param string $screen_id The screen id. + */ + do_action( 'heartbeat_tick', $response, $screen_id ); + + // Send the current time according to the server. + $response['server_time'] = time(); + + wp_send_json( $response ); +} + +/** + * Ajax handler for getting revision diffs. + * + * @since 3.6.0 + */ +function wp_ajax_get_revision_diffs() { + require ABSPATH . 'wp-admin/includes/revision.php'; + + $post = get_post( (int) $_REQUEST['post_id'] ); + if ( ! $post ) { + wp_send_json_error(); + } + + if ( ! current_user_can( 'edit_post', $post->ID ) ) { + wp_send_json_error(); + } + + // Really just pre-loading the cache here. + $revisions = wp_get_post_revisions( $post->ID, array( 'check_enabled' => false ) ); + if ( ! $revisions ) { + wp_send_json_error(); + } + + $return = array(); + set_time_limit( 0 ); + + foreach ( $_REQUEST['compare'] as $compare_key ) { + list( $compare_from, $compare_to ) = explode( ':', $compare_key ); // from:to + + $return[] = array( + 'id' => $compare_key, + 'fields' => wp_get_revision_ui_diff( $post, $compare_from, $compare_to ), + ); + } + wp_send_json_success( $return ); +} + +/** + * Ajax handler for auto-saving the selected color scheme for + * a user's own profile. + * + * @since 3.8.0 + * + * @global array $_wp_admin_css_colors + */ +function wp_ajax_save_user_color_scheme() { + global $_wp_admin_css_colors; + + check_ajax_referer( 'save-color-scheme', 'nonce' ); + + $color_scheme = sanitize_key( $_POST['color_scheme'] ); + + if ( ! isset( $_wp_admin_css_colors[ $color_scheme ] ) ) { + wp_send_json_error(); + } + + $previous_color_scheme = get_user_meta( get_current_user_id(), 'admin_color', true ); + update_user_meta( get_current_user_id(), 'admin_color', $color_scheme ); + + wp_send_json_success( + array( + 'previousScheme' => 'admin-color-' . $previous_color_scheme, + 'currentScheme' => 'admin-color-' . $color_scheme, + ) + ); +} + +/** + * Ajax handler for getting themes from themes_api(). + * + * @since 3.9.0 + * + * @global array $themes_allowedtags + * @global array $theme_field_defaults + */ +function wp_ajax_query_themes() { + global $themes_allowedtags, $theme_field_defaults; + + if ( ! current_user_can( 'install_themes' ) ) { + wp_send_json_error(); + } + + $args = wp_parse_args( + wp_unslash( $_REQUEST['request'] ), + array( + 'per_page' => 20, + 'fields' => array_merge( + (array) $theme_field_defaults, + array( + 'reviews_url' => true, // Explicitly request the reviews URL to be linked from the Add Themes screen. + ) + ), + ) + ); + + if ( isset( $args['browse'] ) && 'favorites' === $args['browse'] && ! isset( $args['user'] ) ) { + $user = get_user_option( 'wporg_favorites' ); + if ( $user ) { + $args['user'] = $user; + } + } + + $old_filter = isset( $args['browse'] ) ? $args['browse'] : 'search'; + + /** This filter is documented in wp-admin/includes/class-wp-theme-install-list-table.php */ + $args = apply_filters( 'install_themes_table_api_args_' . $old_filter, $args ); + + $api = themes_api( 'query_themes', $args ); + + if ( is_wp_error( $api ) ) { + wp_send_json_error(); + } + + $update_php = network_admin_url( 'update.php?action=install-theme' ); + + foreach ( $api->themes as &$theme ) { + $theme->install_url = add_query_arg( + array( + 'theme' => $theme->slug, + '_wpnonce' => wp_create_nonce( 'install-theme_' . $theme->slug ), + ), + $update_php + ); + + if ( current_user_can( 'switch_themes' ) ) { + if ( is_multisite() ) { + $theme->activate_url = add_query_arg( + array( + 'action' => 'enable', + '_wpnonce' => wp_create_nonce( 'enable-theme_' . $theme->slug ), + 'theme' => $theme->slug, + ), + network_admin_url( 'themes.php' ) + ); + } else { + $theme->activate_url = add_query_arg( + array( + 'action' => 'activate', + '_wpnonce' => wp_create_nonce( 'switch-theme_' . $theme->slug ), + 'stylesheet' => $theme->slug, + ), + admin_url( 'themes.php' ) + ); + } + } + + if ( ! is_multisite() && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { + $theme->customize_url = add_query_arg( + array( + 'return' => urlencode( network_admin_url( 'theme-install.php', 'relative' ) ), + ), + wp_customize_url( $theme->slug ) + ); + } + + $theme->name = wp_kses( $theme->name, $themes_allowedtags ); + $theme->author = wp_kses( $theme->author['display_name'], $themes_allowedtags ); + $theme->version = wp_kses( $theme->version, $themes_allowedtags ); + $theme->description = wp_kses( $theme->description, $themes_allowedtags ); + + $theme->stars = wp_star_rating( + array( + 'rating' => $theme->rating, + 'type' => 'percent', + 'number' => $theme->num_ratings, + 'echo' => false, + ) + ); + + $theme->num_ratings = number_format_i18n( $theme->num_ratings ); + $theme->preview_url = set_url_scheme( $theme->preview_url ); + } + + wp_send_json_success( $api ); +} + +/** + * Apply [embed] Ajax handlers to a string. + * + * @since 4.0.0 + * + * @global WP_Post $post Global post object. + * @global WP_Embed $wp_embed Embed API instance. + * @global WP_Scripts $wp_scripts + * @global int $content_width + */ +function wp_ajax_parse_embed() { + global $post, $wp_embed, $content_width; + + if ( empty( $_POST['shortcode'] ) ) { + wp_send_json_error(); + } + + $post_id = isset( $_POST['post_ID'] ) ? intval( $_POST['post_ID'] ) : 0; + + if ( $post_id > 0 ) { + $post = get_post( $post_id ); + + if ( ! $post || ! current_user_can( 'edit_post', $post->ID ) ) { + wp_send_json_error(); + } + setup_postdata( $post ); + } elseif ( ! current_user_can( 'edit_posts' ) ) { // See WP_oEmbed_Controller::get_proxy_item_permissions_check(). + wp_send_json_error(); + } + + $shortcode = wp_unslash( $_POST['shortcode'] ); + + preg_match( '/' . get_shortcode_regex() . '/s', $shortcode, $matches ); + $atts = shortcode_parse_atts( $matches[3] ); + + if ( ! empty( $matches[5] ) ) { + $url = $matches[5]; + } elseif ( ! empty( $atts['src'] ) ) { + $url = $atts['src']; + } else { + $url = ''; + } + + $parsed = false; + $wp_embed->return_false_on_fail = true; + + if ( 0 === $post_id ) { + /* + * Refresh oEmbeds cached outside of posts that are past their TTL. + * Posts are excluded because they have separate logic for refreshing + * their post meta caches. See WP_Embed::cache_oembed(). + */ + $wp_embed->usecache = false; + } + + if ( is_ssl() && 0 === strpos( $url, 'http://' ) ) { + // Admin is ssl and the user pasted non-ssl URL. + // Check if the provider supports ssl embeds and use that for the preview. + $ssl_shortcode = preg_replace( '%^(\\[embed[^\\]]*\\])http://%i', '$1https://', $shortcode ); + $parsed = $wp_embed->run_shortcode( $ssl_shortcode ); + + if ( ! $parsed ) { + $no_ssl_support = true; + } + } + + // Set $content_width so any embeds fit in the destination iframe. + if ( isset( $_POST['maxwidth'] ) && is_numeric( $_POST['maxwidth'] ) && $_POST['maxwidth'] > 0 ) { + if ( ! isset( $content_width ) ) { + $content_width = intval( $_POST['maxwidth'] ); + } else { + $content_width = min( $content_width, intval( $_POST['maxwidth'] ) ); + } + } + + if ( $url && ! $parsed ) { + $parsed = $wp_embed->run_shortcode( $shortcode ); + } + + if ( ! $parsed ) { + wp_send_json_error( + array( + 'type' => 'not-embeddable', + /* translators: %s: URL that could not be embedded. */ + 'message' => sprintf( __( '%s failed to embed.' ), '' . esc_html( $url ) . '' ), + ) + ); + } + + if ( has_shortcode( $parsed, 'audio' ) || has_shortcode( $parsed, 'video' ) ) { + $styles = ''; + $mce_styles = wpview_media_sandbox_styles(); + + foreach ( $mce_styles as $style ) { + $styles .= sprintf( '', $style ); + } + + $html = do_shortcode( $parsed ); + + global $wp_scripts; + + if ( ! empty( $wp_scripts ) ) { + $wp_scripts->done = array(); + } + + ob_start(); + wp_print_scripts( array( 'mediaelement-vimeo', 'wp-mediaelement' ) ); + $scripts = ob_get_clean(); + + $parsed = $styles . $html . $scripts; + } + + if ( ! empty( $no_ssl_support ) || ( is_ssl() && ( preg_match( '%<(iframe|script|embed) [^>]*src="http://%', $parsed ) || + preg_match( '%]*href="http://%', $parsed ) ) ) ) { + // Admin is ssl and the embed is not. Iframes, scripts, and other "active content" will be blocked. + wp_send_json_error( + array( + 'type' => 'not-ssl', + 'message' => __( 'This preview is unavailable in the editor.' ), + ) + ); + } + + $return = array( + 'body' => $parsed, + 'attr' => $wp_embed->last_attr, + ); + + if ( strpos( $parsed, 'class="wp-embedded-content' ) ) { + if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) { + $script_src = includes_url( 'js/wp-embed.js' ); + } else { + $script_src = includes_url( 'js/wp-embed.min.js' ); + } + + $return['head'] = ''; + $return['sandbox'] = true; + } + + wp_send_json_success( $return ); +} + +/** + * @since 4.0.0 + * + * @global WP_Post $post Global post object. + * @global WP_Scripts $wp_scripts + */ +function wp_ajax_parse_media_shortcode() { + global $post, $wp_scripts; + + if ( empty( $_POST['shortcode'] ) ) { + wp_send_json_error(); + } + + $shortcode = wp_unslash( $_POST['shortcode'] ); + + if ( ! empty( $_POST['post_ID'] ) ) { + $post = get_post( (int) $_POST['post_ID'] ); + } + + // The embed shortcode requires a post. + if ( ! $post || ! current_user_can( 'edit_post', $post->ID ) ) { + if ( 'embed' === $shortcode ) { + wp_send_json_error(); + } + } else { + setup_postdata( $post ); + } + + $parsed = do_shortcode( $shortcode ); + + if ( empty( $parsed ) ) { + wp_send_json_error( + array( + 'type' => 'no-items', + 'message' => __( 'No items found.' ), + ) + ); + } + + $head = ''; + $styles = wpview_media_sandbox_styles(); + + foreach ( $styles as $style ) { + $head .= ''; + } + + if ( ! empty( $wp_scripts ) ) { + $wp_scripts->done = array(); + } + + ob_start(); + + echo $parsed; + + if ( 'playlist' === $_REQUEST['type'] ) { + wp_underscore_playlist_templates(); + + wp_print_scripts( 'wp-playlist' ); + } else { + wp_print_scripts( array( 'mediaelement-vimeo', 'wp-mediaelement' ) ); + } + + wp_send_json_success( + array( + 'head' => $head, + 'body' => ob_get_clean(), + ) + ); +} + +/** + * Ajax handler for destroying multiple open sessions for a user. + * + * @since 4.1.0 + */ +function wp_ajax_destroy_sessions() { + $user = get_userdata( (int) $_POST['user_id'] ); + + if ( $user ) { + if ( ! current_user_can( 'edit_user', $user->ID ) ) { + $user = false; + } elseif ( ! wp_verify_nonce( $_POST['nonce'], 'update-user_' . $user->ID ) ) { + $user = false; + } + } + + if ( ! $user ) { + wp_send_json_error( + array( + 'message' => __( 'Could not log out user sessions. Please try again.' ), + ) + ); + } + + $sessions = WP_Session_Tokens::get_instance( $user->ID ); + + if ( get_current_user_id() === $user->ID ) { + $sessions->destroy_others( wp_get_session_token() ); + $message = __( 'You are now logged out everywhere else.' ); + } else { + $sessions->destroy_all(); + /* translators: %s: User's display name. */ + $message = sprintf( __( '%s has been logged out.' ), $user->display_name ); + } + + wp_send_json_success( array( 'message' => $message ) ); +} + +/** + * Ajax handler for cropping an image. + * + * @since 4.3.0 + */ +function wp_ajax_crop_image() { + $attachment_id = absint( $_POST['id'] ); + + check_ajax_referer( 'image_editor-' . $attachment_id, 'nonce' ); + + if ( empty( $attachment_id ) || ! current_user_can( 'edit_post', $attachment_id ) ) { + wp_send_json_error(); + } + + $context = str_replace( '_', '-', $_POST['context'] ); + $data = array_map( 'absint', $_POST['cropDetails'] ); + $cropped = wp_crop_image( $attachment_id, $data['x1'], $data['y1'], $data['width'], $data['height'], $data['dst_width'], $data['dst_height'] ); + + if ( ! $cropped || is_wp_error( $cropped ) ) { + wp_send_json_error( array( 'message' => __( 'Image could not be processed.' ) ) ); + } + + switch ( $context ) { + case 'site-icon': + require_once ABSPATH . 'wp-admin/includes/class-wp-site-icon.php'; + $wp_site_icon = new WP_Site_Icon(); + + // Skip creating a new attachment if the attachment is a Site Icon. + if ( get_post_meta( $attachment_id, '_wp_attachment_context', true ) == $context ) { + + // Delete the temporary cropped file, we don't need it. + wp_delete_file( $cropped ); + + // Additional sizes in wp_prepare_attachment_for_js(). + add_filter( 'image_size_names_choose', array( $wp_site_icon, 'additional_sizes' ) ); + break; + } + + /** This filter is documented in wp-admin/includes/class-custom-image-header.php */ + $cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication. + $object = $wp_site_icon->create_attachment_object( $cropped, $attachment_id ); + unset( $object['ID'] ); + + // Update the attachment. + add_filter( 'intermediate_image_sizes_advanced', array( $wp_site_icon, 'additional_sizes' ) ); + $attachment_id = $wp_site_icon->insert_attachment( $object, $cropped ); + remove_filter( 'intermediate_image_sizes_advanced', array( $wp_site_icon, 'additional_sizes' ) ); + + // Additional sizes in wp_prepare_attachment_for_js(). + add_filter( 'image_size_names_choose', array( $wp_site_icon, 'additional_sizes' ) ); + break; + + default: + /** + * Fires before a cropped image is saved. + * + * Allows to add filters to modify the way a cropped image is saved. + * + * @since 4.3.0 + * + * @param string $context The Customizer control requesting the cropped image. + * @param int $attachment_id The attachment ID of the original image. + * @param string $cropped Path to the cropped image file. + */ + do_action( 'wp_ajax_crop_image_pre_save', $context, $attachment_id, $cropped ); + + /** This filter is documented in wp-admin/includes/class-custom-image-header.php */ + $cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication. + + $parent_url = wp_get_attachment_url( $attachment_id ); + $url = str_replace( wp_basename( $parent_url ), wp_basename( $cropped ), $parent_url ); + + $size = @getimagesize( $cropped ); + $image_type = ( $size ) ? $size['mime'] : 'image/jpeg'; + + $object = array( + 'post_title' => wp_basename( $cropped ), + 'post_content' => $url, + 'post_mime_type' => $image_type, + 'guid' => $url, + 'context' => $context, + ); + + $attachment_id = wp_insert_attachment( $object, $cropped ); + $metadata = wp_generate_attachment_metadata( $attachment_id, $cropped ); + + /** + * Filters the cropped image attachment metadata. + * + * @since 4.3.0 + * + * @see wp_generate_attachment_metadata() + * + * @param array $metadata Attachment metadata. + */ + $metadata = apply_filters( 'wp_ajax_cropped_attachment_metadata', $metadata ); + wp_update_attachment_metadata( $attachment_id, $metadata ); + + /** + * Filters the attachment ID for a cropped image. + * + * @since 4.3.0 + * + * @param int $attachment_id The attachment ID of the cropped image. + * @param string $context The Customizer control requesting the cropped image. + */ + $attachment_id = apply_filters( 'wp_ajax_cropped_attachment_id', $attachment_id, $context ); + } + + wp_send_json_success( wp_prepare_attachment_for_js( $attachment_id ) ); +} + +/** + * Ajax handler for generating a password. + * + * @since 4.4.0 + */ +function wp_ajax_generate_password() { + wp_send_json_success( wp_generate_password( 24 ) ); +} + +/** + * Ajax handler for saving the user's WordPress.org username. + * + * @since 4.4.0 + */ +function wp_ajax_save_wporg_username() { + if ( ! current_user_can( 'install_themes' ) && ! current_user_can( 'install_plugins' ) ) { + wp_send_json_error(); + } + + check_ajax_referer( 'save_wporg_username_' . get_current_user_id() ); + + $username = isset( $_REQUEST['username'] ) ? wp_unslash( $_REQUEST['username'] ) : false; + + if ( ! $username ) { + wp_send_json_error(); + } + + wp_send_json_success( update_user_meta( get_current_user_id(), 'wporg_favorites', $username ) ); +} + +/** + * Ajax handler for installing a theme. + * + * @since 4.6.0 + * + * @see Theme_Upgrader + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + */ +function wp_ajax_install_theme() { + check_ajax_referer( 'updates' ); + + if ( empty( $_POST['slug'] ) ) { + wp_send_json_error( + array( + 'slug' => '', + 'errorCode' => 'no_theme_specified', + 'errorMessage' => __( 'No theme specified.' ), + ) + ); + } + + $slug = sanitize_key( wp_unslash( $_POST['slug'] ) ); + + $status = array( + 'install' => 'theme', + 'slug' => $slug, + ); + + if ( ! current_user_can( 'install_themes' ) ) { + $status['errorMessage'] = __( 'Sorry, you are not allowed to install themes on this site.' ); + wp_send_json_error( $status ); + } + + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + include_once ABSPATH . 'wp-admin/includes/theme.php'; + + $api = themes_api( + 'theme_information', + array( + 'slug' => $slug, + 'fields' => array( 'sections' => false ), + ) + ); + + if ( is_wp_error( $api ) ) { + $status['errorMessage'] = $api->get_error_message(); + wp_send_json_error( $status ); + } + + $skin = new WP_Ajax_Upgrader_Skin(); + $upgrader = new Theme_Upgrader( $skin ); + $result = $upgrader->install( $api->download_link ); + + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + $status['debug'] = $skin->get_upgrade_messages(); + } + + if ( is_wp_error( $result ) ) { + $status['errorCode'] = $result->get_error_code(); + $status['errorMessage'] = $result->get_error_message(); + wp_send_json_error( $status ); + } elseif ( is_wp_error( $skin->result ) ) { + $status['errorCode'] = $skin->result->get_error_code(); + $status['errorMessage'] = $skin->result->get_error_message(); + wp_send_json_error( $status ); + } elseif ( $skin->get_errors()->has_errors() ) { + $status['errorMessage'] = $skin->get_error_messages(); + wp_send_json_error( $status ); + } elseif ( is_null( $result ) ) { + global $wp_filesystem; + + $status['errorCode'] = 'unable_to_connect_to_filesystem'; + $status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' ); + + // Pass through the error from WP_Filesystem if one was raised. + if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) { + $status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() ); + } + + wp_send_json_error( $status ); + } + + $status['themeName'] = wp_get_theme( $slug )->get( 'Name' ); + + if ( current_user_can( 'switch_themes' ) ) { + if ( is_multisite() ) { + $status['activateUrl'] = add_query_arg( + array( + 'action' => 'enable', + '_wpnonce' => wp_create_nonce( 'enable-theme_' . $slug ), + 'theme' => $slug, + ), + network_admin_url( 'themes.php' ) + ); + } else { + $status['activateUrl'] = add_query_arg( + array( + 'action' => 'activate', + '_wpnonce' => wp_create_nonce( 'switch-theme_' . $slug ), + 'stylesheet' => $slug, + ), + admin_url( 'themes.php' ) + ); + } + } + + if ( ! is_multisite() && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { + $status['customizeUrl'] = add_query_arg( + array( + 'return' => urlencode( network_admin_url( 'theme-install.php', 'relative' ) ), + ), + wp_customize_url( $slug ) + ); + } + + /* + * See WP_Theme_Install_List_Table::_get_theme_status() if we wanted to check + * on post-installation status. + */ + wp_send_json_success( $status ); +} + +/** + * Ajax handler for updating a theme. + * + * @since 4.6.0 + * + * @see Theme_Upgrader + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + */ +function wp_ajax_update_theme() { + check_ajax_referer( 'updates' ); + + if ( empty( $_POST['slug'] ) ) { + wp_send_json_error( + array( + 'slug' => '', + 'errorCode' => 'no_theme_specified', + 'errorMessage' => __( 'No theme specified.' ), + ) + ); + } + + $stylesheet = preg_replace( '/[^A-z0-9_\-]/', '', wp_unslash( $_POST['slug'] ) ); + $status = array( + 'update' => 'theme', + 'slug' => $stylesheet, + 'oldVersion' => '', + 'newVersion' => '', + ); + + if ( ! current_user_can( 'update_themes' ) ) { + $status['errorMessage'] = __( 'Sorry, you are not allowed to update themes for this site.' ); + wp_send_json_error( $status ); + } + + $theme = wp_get_theme( $stylesheet ); + if ( $theme->exists() ) { + $status['oldVersion'] = $theme->get( 'Version' ); + } + + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + + $current = get_site_transient( 'update_themes' ); + if ( empty( $current ) ) { + wp_update_themes(); + } + + $skin = new WP_Ajax_Upgrader_Skin(); + $upgrader = new Theme_Upgrader( $skin ); + $result = $upgrader->bulk_upgrade( array( $stylesheet ) ); + + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + $status['debug'] = $skin->get_upgrade_messages(); + } + + if ( is_wp_error( $skin->result ) ) { + $status['errorCode'] = $skin->result->get_error_code(); + $status['errorMessage'] = $skin->result->get_error_message(); + wp_send_json_error( $status ); + } elseif ( $skin->get_errors()->has_errors() ) { + $status['errorMessage'] = $skin->get_error_messages(); + wp_send_json_error( $status ); + } elseif ( is_array( $result ) && ! empty( $result[ $stylesheet ] ) ) { + + // Theme is already at the latest version. + if ( true === $result[ $stylesheet ] ) { + $status['errorMessage'] = $upgrader->strings['up_to_date']; + wp_send_json_error( $status ); + } + + $theme = wp_get_theme( $stylesheet ); + if ( $theme->exists() ) { + $status['newVersion'] = $theme->get( 'Version' ); + } + + wp_send_json_success( $status ); + } elseif ( false === $result ) { + global $wp_filesystem; + + $status['errorCode'] = 'unable_to_connect_to_filesystem'; + $status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' ); + + // Pass through the error from WP_Filesystem if one was raised. + if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) { + $status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() ); + } + + wp_send_json_error( $status ); + } + + // An unhandled error occurred. + $status['errorMessage'] = __( 'Update failed.' ); + wp_send_json_error( $status ); +} + +/** + * Ajax handler for deleting a theme. + * + * @since 4.6.0 + * + * @see delete_theme() + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + */ +function wp_ajax_delete_theme() { + check_ajax_referer( 'updates' ); + + if ( empty( $_POST['slug'] ) ) { + wp_send_json_error( + array( + 'slug' => '', + 'errorCode' => 'no_theme_specified', + 'errorMessage' => __( 'No theme specified.' ), + ) + ); + } + + $stylesheet = preg_replace( '/[^A-z0-9_\-]/', '', wp_unslash( $_POST['slug'] ) ); + $status = array( + 'delete' => 'theme', + 'slug' => $stylesheet, + ); + + if ( ! current_user_can( 'delete_themes' ) ) { + $status['errorMessage'] = __( 'Sorry, you are not allowed to delete themes on this site.' ); + wp_send_json_error( $status ); + } + + if ( ! wp_get_theme( $stylesheet )->exists() ) { + $status['errorMessage'] = __( 'The requested theme does not exist.' ); + wp_send_json_error( $status ); + } + + // Check filesystem credentials. `delete_theme()` will bail otherwise. + $url = wp_nonce_url( 'themes.php?action=delete&stylesheet=' . urlencode( $stylesheet ), 'delete-theme_' . $stylesheet ); + + ob_start(); + $credentials = request_filesystem_credentials( $url ); + ob_end_clean(); + + if ( false === $credentials || ! WP_Filesystem( $credentials ) ) { + global $wp_filesystem; + + $status['errorCode'] = 'unable_to_connect_to_filesystem'; + $status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' ); + + // Pass through the error from WP_Filesystem if one was raised. + if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) { + $status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() ); + } + + wp_send_json_error( $status ); + } + + include_once ABSPATH . 'wp-admin/includes/theme.php'; + + $result = delete_theme( $stylesheet ); + + if ( is_wp_error( $result ) ) { + $status['errorMessage'] = $result->get_error_message(); + wp_send_json_error( $status ); + } elseif ( false === $result ) { + $status['errorMessage'] = __( 'Theme could not be deleted.' ); + wp_send_json_error( $status ); + } + + wp_send_json_success( $status ); +} + +/** + * Ajax handler for installing a plugin. + * + * @since 4.6.0 + * + * @see Plugin_Upgrader + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + */ +function wp_ajax_install_plugin() { + check_ajax_referer( 'updates' ); + + if ( empty( $_POST['slug'] ) ) { + wp_send_json_error( + array( + 'slug' => '', + 'errorCode' => 'no_plugin_specified', + 'errorMessage' => __( 'No plugin specified.' ), + ) + ); + } + + $status = array( + 'install' => 'plugin', + 'slug' => sanitize_key( wp_unslash( $_POST['slug'] ) ), + ); + + if ( ! current_user_can( 'install_plugins' ) ) { + $status['errorMessage'] = __( 'Sorry, you are not allowed to install plugins on this site.' ); + wp_send_json_error( $status ); + } + + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + + $api = plugins_api( + 'plugin_information', + array( + 'slug' => sanitize_key( wp_unslash( $_POST['slug'] ) ), + 'fields' => array( + 'sections' => false, + ), + ) + ); + + if ( is_wp_error( $api ) ) { + $status['errorMessage'] = $api->get_error_message(); + wp_send_json_error( $status ); + } + + $status['pluginName'] = $api->name; + + $skin = new WP_Ajax_Upgrader_Skin(); + $upgrader = new Plugin_Upgrader( $skin ); + $result = $upgrader->install( $api->download_link ); + + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + $status['debug'] = $skin->get_upgrade_messages(); + } + + if ( is_wp_error( $result ) ) { + $status['errorCode'] = $result->get_error_code(); + $status['errorMessage'] = $result->get_error_message(); + wp_send_json_error( $status ); + } elseif ( is_wp_error( $skin->result ) ) { + $status['errorCode'] = $skin->result->get_error_code(); + $status['errorMessage'] = $skin->result->get_error_message(); + wp_send_json_error( $status ); + } elseif ( $skin->get_errors()->has_errors() ) { + $status['errorMessage'] = $skin->get_error_messages(); + wp_send_json_error( $status ); + } elseif ( is_null( $result ) ) { + global $wp_filesystem; + + $status['errorCode'] = 'unable_to_connect_to_filesystem'; + $status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' ); + + // Pass through the error from WP_Filesystem if one was raised. + if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) { + $status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() ); + } + + wp_send_json_error( $status ); + } + + $install_status = install_plugin_install_status( $api ); + $pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : ''; + + // If installation request is coming from import page, do not return network activation link. + $plugins_url = ( 'import' === $pagenow ) ? admin_url( 'plugins.php' ) : network_admin_url( 'plugins.php' ); + + if ( current_user_can( 'activate_plugin', $install_status['file'] ) && is_plugin_inactive( $install_status['file'] ) ) { + $status['activateUrl'] = add_query_arg( + array( + '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $install_status['file'] ), + 'action' => 'activate', + 'plugin' => $install_status['file'], + ), + $plugins_url + ); + } + + if ( is_multisite() && current_user_can( 'manage_network_plugins' ) && 'import' !== $pagenow ) { + $status['activateUrl'] = add_query_arg( array( 'networkwide' => 1 ), $status['activateUrl'] ); + } + + wp_send_json_success( $status ); +} + +/** + * Ajax handler for updating a plugin. + * + * @since 4.2.0 + * + * @see Plugin_Upgrader + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + */ +function wp_ajax_update_plugin() { + check_ajax_referer( 'updates' ); + + if ( empty( $_POST['plugin'] ) || empty( $_POST['slug'] ) ) { + wp_send_json_error( + array( + 'slug' => '', + 'errorCode' => 'no_plugin_specified', + 'errorMessage' => __( 'No plugin specified.' ), + ) + ); + } + + $plugin = plugin_basename( sanitize_text_field( wp_unslash( $_POST['plugin'] ) ) ); + + $status = array( + 'update' => 'plugin', + 'slug' => sanitize_key( wp_unslash( $_POST['slug'] ) ), + 'oldVersion' => '', + 'newVersion' => '', + ); + + if ( ! current_user_can( 'update_plugins' ) || 0 !== validate_file( $plugin ) ) { + $status['errorMessage'] = __( 'Sorry, you are not allowed to update plugins for this site.' ); + wp_send_json_error( $status ); + } + + $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + $status['plugin'] = $plugin; + $status['pluginName'] = $plugin_data['Name']; + + if ( $plugin_data['Version'] ) { + /* translators: %s: Plugin version. */ + $status['oldVersion'] = sprintf( __( 'Version %s' ), $plugin_data['Version'] ); + } + + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + + wp_update_plugins(); + + $skin = new WP_Ajax_Upgrader_Skin(); + $upgrader = new Plugin_Upgrader( $skin ); + $result = $upgrader->bulk_upgrade( array( $plugin ) ); + + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + $status['debug'] = $skin->get_upgrade_messages(); + } + + if ( is_wp_error( $skin->result ) ) { + $status['errorCode'] = $skin->result->get_error_code(); + $status['errorMessage'] = $skin->result->get_error_message(); + wp_send_json_error( $status ); + } elseif ( $skin->get_errors()->has_errors() ) { + $status['errorMessage'] = $skin->get_error_messages(); + wp_send_json_error( $status ); + } elseif ( is_array( $result ) && ! empty( $result[ $plugin ] ) ) { + $plugin_update_data = current( $result ); + + /* + * If the `update_plugins` site transient is empty (e.g. when you update + * two plugins in quick succession before the transient repopulates), + * this may be the return. + * + * Preferably something can be done to ensure `update_plugins` isn't empty. + * For now, surface some sort of error here. + */ + if ( true === $plugin_update_data ) { + $status['errorMessage'] = __( 'Plugin update failed.' ); + wp_send_json_error( $status ); + } + + $plugin_data = get_plugins( '/' . $result[ $plugin ]['destination_name'] ); + $plugin_data = reset( $plugin_data ); + + if ( $plugin_data['Version'] ) { + /* translators: %s: Plugin version. */ + $status['newVersion'] = sprintf( __( 'Version %s' ), $plugin_data['Version'] ); + } + wp_send_json_success( $status ); + } elseif ( false === $result ) { + global $wp_filesystem; + + $status['errorCode'] = 'unable_to_connect_to_filesystem'; + $status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' ); + + // Pass through the error from WP_Filesystem if one was raised. + if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) { + $status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() ); + } + + wp_send_json_error( $status ); + } + + // An unhandled error occurred. + $status['errorMessage'] = __( 'Plugin update failed.' ); + wp_send_json_error( $status ); +} + +/** + * Ajax handler for deleting a plugin. + * + * @since 4.6.0 + * + * @see delete_plugins() + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + */ +function wp_ajax_delete_plugin() { + check_ajax_referer( 'updates' ); + + if ( empty( $_POST['slug'] ) || empty( $_POST['plugin'] ) ) { + wp_send_json_error( + array( + 'slug' => '', + 'errorCode' => 'no_plugin_specified', + 'errorMessage' => __( 'No plugin specified.' ), + ) + ); + } + + $plugin = plugin_basename( sanitize_text_field( wp_unslash( $_POST['plugin'] ) ) ); + + $status = array( + 'delete' => 'plugin', + 'slug' => sanitize_key( wp_unslash( $_POST['slug'] ) ), + ); + + if ( ! current_user_can( 'delete_plugins' ) || 0 !== validate_file( $plugin ) ) { + $status['errorMessage'] = __( 'Sorry, you are not allowed to delete plugins for this site.' ); + wp_send_json_error( $status ); + } + + $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + $status['plugin'] = $plugin; + $status['pluginName'] = $plugin_data['Name']; + + if ( is_plugin_active( $plugin ) ) { + $status['errorMessage'] = __( 'You cannot delete a plugin while it is active on the main site.' ); + wp_send_json_error( $status ); + } + + // Check filesystem credentials. `delete_plugins()` will bail otherwise. + $url = wp_nonce_url( 'plugins.php?action=delete-selected&verify-delete=1&checked[]=' . $plugin, 'bulk-plugins' ); + + ob_start(); + $credentials = request_filesystem_credentials( $url ); + ob_end_clean(); + + if ( false === $credentials || ! WP_Filesystem( $credentials ) ) { + global $wp_filesystem; + + $status['errorCode'] = 'unable_to_connect_to_filesystem'; + $status['errorMessage'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' ); + + // Pass through the error from WP_Filesystem if one was raised. + if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) { + $status['errorMessage'] = esc_html( $wp_filesystem->errors->get_error_message() ); + } + + wp_send_json_error( $status ); + } + + $result = delete_plugins( array( $plugin ) ); + + if ( is_wp_error( $result ) ) { + $status['errorMessage'] = $result->get_error_message(); + wp_send_json_error( $status ); + } elseif ( false === $result ) { + $status['errorMessage'] = __( 'Plugin could not be deleted.' ); + wp_send_json_error( $status ); + } + + wp_send_json_success( $status ); +} + +/** + * Ajax handler for searching plugins. + * + * @since 4.6.0 + * + * @global string $s Search term. + */ +function wp_ajax_search_plugins() { + check_ajax_referer( 'updates' ); + + $pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : ''; + if ( 'plugins-network' === $pagenow || 'plugins' === $pagenow ) { + set_current_screen( $pagenow ); + } + + /** @var WP_Plugins_List_Table $wp_list_table */ + $wp_list_table = _get_list_table( + 'WP_Plugins_List_Table', + array( + 'screen' => get_current_screen(), + ) + ); + + $status = array(); + + if ( ! $wp_list_table->ajax_user_can() ) { + $status['errorMessage'] = __( 'Sorry, you are not allowed to manage plugins for this site.' ); + wp_send_json_error( $status ); + } + + // Set the correct requester, so pagination works. + $_SERVER['REQUEST_URI'] = add_query_arg( + array_diff_key( + $_POST, + array( + '_ajax_nonce' => null, + 'action' => null, + ) + ), + network_admin_url( 'plugins.php', 'relative' ) + ); + + $GLOBALS['s'] = wp_unslash( $_POST['s'] ); + + $wp_list_table->prepare_items(); + + ob_start(); + $wp_list_table->display(); + $status['count'] = count( $wp_list_table->items ); + $status['items'] = ob_get_clean(); + + wp_send_json_success( $status ); +} + +/** + * Ajax handler for searching plugins to install. + * + * @since 4.6.0 + */ +function wp_ajax_search_install_plugins() { + check_ajax_referer( 'updates' ); + + $pagenow = isset( $_POST['pagenow'] ) ? sanitize_key( $_POST['pagenow'] ) : ''; + if ( 'plugin-install-network' === $pagenow || 'plugin-install' === $pagenow ) { + set_current_screen( $pagenow ); + } + + /** @var WP_Plugin_Install_List_Table $wp_list_table */ + $wp_list_table = _get_list_table( + 'WP_Plugin_Install_List_Table', + array( + 'screen' => get_current_screen(), + ) + ); + + $status = array(); + + if ( ! $wp_list_table->ajax_user_can() ) { + $status['errorMessage'] = __( 'Sorry, you are not allowed to manage plugins for this site.' ); + wp_send_json_error( $status ); + } + + // Set the correct requester, so pagination works. + $_SERVER['REQUEST_URI'] = add_query_arg( + array_diff_key( + $_POST, + array( + '_ajax_nonce' => null, + 'action' => null, + ) + ), + network_admin_url( 'plugin-install.php', 'relative' ) + ); + + $wp_list_table->prepare_items(); + + ob_start(); + $wp_list_table->display(); + $status['count'] = (int) $wp_list_table->get_pagination_arg( 'total_items' ); + $status['items'] = ob_get_clean(); + + wp_send_json_success( $status ); +} + +/** + * Ajax handler for editing a theme or plugin file. + * + * @since 4.9.0 + * @see wp_edit_theme_plugin_file() + */ +function wp_ajax_edit_theme_plugin_file() { + $r = wp_edit_theme_plugin_file( wp_unslash( $_POST ) ); // Validation of args is done in wp_edit_theme_plugin_file(). + + if ( is_wp_error( $r ) ) { + wp_send_json_error( + array_merge( + array( + 'code' => $r->get_error_code(), + 'message' => $r->get_error_message(), + ), + (array) $r->get_error_data() + ) + ); + } else { + wp_send_json_success( + array( + 'message' => __( 'File edited successfully.' ), + ) + ); + } +} + +/** + * Ajax handler for exporting a user's personal data. + * + * @since 4.9.6 + */ +function wp_ajax_wp_privacy_export_personal_data() { + + if ( empty( $_POST['id'] ) ) { + wp_send_json_error( __( 'Missing request ID.' ) ); + } + + $request_id = (int) $_POST['id']; + + if ( $request_id < 1 ) { + wp_send_json_error( __( 'Invalid request ID.' ) ); + } + + if ( ! current_user_can( 'export_others_personal_data' ) ) { + wp_send_json_error( __( 'Sorry, you are not allowed to perform this action.' ) ); + } + + check_ajax_referer( 'wp-privacy-export-personal-data-' . $request_id, 'security' ); + + // Get the request. + $request = wp_get_user_request( $request_id ); + + if ( ! $request || 'export_personal_data' !== $request->action_name ) { + wp_send_json_error( __( 'Invalid request type.' ) ); + } + + $email_address = $request->email; + if ( ! is_email( $email_address ) ) { + wp_send_json_error( __( 'A valid email address must be given.' ) ); + } + + if ( ! isset( $_POST['exporter'] ) ) { + wp_send_json_error( __( 'Missing exporter index.' ) ); + } + + $exporter_index = (int) $_POST['exporter']; + + if ( ! isset( $_POST['page'] ) ) { + wp_send_json_error( __( 'Missing page index.' ) ); + } + + $page = (int) $_POST['page']; + + $send_as_email = isset( $_POST['sendAsEmail'] ) ? ( 'true' === $_POST['sendAsEmail'] ) : false; + + /** + * Filters the array of exporter callbacks. + * + * @since 4.9.6 + * + * @param array $args { + * An array of callable exporters of personal data. Default empty array. + * + * @type array { + * Array of personal data exporters. + * + * @type string $callback Callable exporter function that accepts an + * email address and a page and returns an array + * of name => value pairs of personal data. + * @type string $exporter_friendly_name Translated user facing friendly name for the + * exporter. + * } + * } + */ + $exporters = apply_filters( 'wp_privacy_personal_data_exporters', array() ); + + if ( ! is_array( $exporters ) ) { + wp_send_json_error( __( 'An exporter has improperly used the registration filter.' ) ); + } + + // Do we have any registered exporters? + if ( 0 < count( $exporters ) ) { + if ( $exporter_index < 1 ) { + wp_send_json_error( __( 'Exporter index cannot be negative.' ) ); + } + + if ( $exporter_index > count( $exporters ) ) { + wp_send_json_error( __( 'Exporter index is out of range.' ) ); + } + + if ( $page < 1 ) { + wp_send_json_error( __( 'Page index cannot be less than one.' ) ); + } + + $exporter_keys = array_keys( $exporters ); + $exporter_key = $exporter_keys[ $exporter_index - 1 ]; + $exporter = $exporters[ $exporter_key ]; + + if ( ! is_array( $exporter ) ) { + wp_send_json_error( + /* translators: %s: Exporter array index. */ + sprintf( __( 'Expected an array describing the exporter at index %s.' ), $exporter_key ) + ); + } + + if ( ! array_key_exists( 'exporter_friendly_name', $exporter ) ) { + wp_send_json_error( + /* translators: %s: Exporter array index. */ + sprintf( __( 'Exporter array at index %s does not include a friendly name.' ), $exporter_key ) + ); + } + + $exporter_friendly_name = $exporter['exporter_friendly_name']; + + if ( ! array_key_exists( 'callback', $exporter ) ) { + wp_send_json_error( + /* translators: %s: Exporter friendly name. */ + sprintf( __( 'Exporter does not include a callback: %s.' ), esc_html( $exporter_friendly_name ) ) + ); + } + + if ( ! is_callable( $exporter['callback'] ) ) { + wp_send_json_error( + /* translators: %s: Exporter friendly name. */ + sprintf( __( 'Exporter callback is not a valid callback: %s.' ), esc_html( $exporter_friendly_name ) ) + ); + } + + $callback = $exporter['callback']; + $response = call_user_func( $callback, $email_address, $page ); + + if ( is_wp_error( $response ) ) { + wp_send_json_error( $response ); + } + + if ( ! is_array( $response ) ) { + wp_send_json_error( + /* translators: %s: Exporter friendly name. */ + sprintf( __( 'Expected response as an array from exporter: %s.' ), esc_html( $exporter_friendly_name ) ) + ); + } + + if ( ! array_key_exists( 'data', $response ) ) { + wp_send_json_error( + /* translators: %s: Exporter friendly name. */ + sprintf( __( 'Expected data in response array from exporter: %s.' ), esc_html( $exporter_friendly_name ) ) + ); + } + + if ( ! is_array( $response['data'] ) ) { + wp_send_json_error( + /* translators: %s: Exporter friendly name. */ + sprintf( __( 'Expected data array in response array from exporter: %s.' ), esc_html( $exporter_friendly_name ) ) + ); + } + + if ( ! array_key_exists( 'done', $response ) ) { + wp_send_json_error( + /* translators: %s: Exporter friendly name. */ + sprintf( __( 'Expected done (boolean) in response array from exporter: %s.' ), esc_html( $exporter_friendly_name ) ) + ); + } + } else { + // No exporters, so we're done. + $exporter_key = ''; + + $response = array( + 'data' => array(), + 'done' => true, + ); + } + + /** + * Filters a page of personal data exporter data. Used to build the export report. + * + * Allows the export response to be consumed by destinations in addition to Ajax. + * + * @since 4.9.6 + * + * @param array $response The personal data for the given exporter and page. + * @param int $exporter_index The index of the exporter that provided this data. + * @param string $email_address The email address associated with this personal data. + * @param int $page The page for this response. + * @param int $request_id The privacy request post ID associated with this request. + * @param bool $send_as_email Whether the final results of the export should be emailed to the user. + * @param string $exporter_key The key (slug) of the exporter that provided this data. + */ + $response = apply_filters( 'wp_privacy_personal_data_export_page', $response, $exporter_index, $email_address, $page, $request_id, $send_as_email, $exporter_key ); + + if ( is_wp_error( $response ) ) { + wp_send_json_error( $response ); + } + + wp_send_json_success( $response ); +} + +/** + * Ajax handler for erasing personal data. + * + * @since 4.9.6 + */ +function wp_ajax_wp_privacy_erase_personal_data() { + + if ( empty( $_POST['id'] ) ) { + wp_send_json_error( __( 'Missing request ID.' ) ); + } + + $request_id = (int) $_POST['id']; + + if ( $request_id < 1 ) { + wp_send_json_error( __( 'Invalid request ID.' ) ); + } + + // Both capabilities are required to avoid confusion, see `_wp_personal_data_removal_page()`. + if ( ! current_user_can( 'erase_others_personal_data' ) || ! current_user_can( 'delete_users' ) ) { + wp_send_json_error( __( 'Sorry, you are not allowed to perform this action.' ) ); + } + + check_ajax_referer( 'wp-privacy-erase-personal-data-' . $request_id, 'security' ); + + // Get the request. + $request = wp_get_user_request( $request_id ); + + if ( ! $request || 'remove_personal_data' !== $request->action_name ) { + wp_send_json_error( __( 'Invalid request type.' ) ); + } + + $email_address = $request->email; + + if ( ! is_email( $email_address ) ) { + wp_send_json_error( __( 'Invalid email address in request.' ) ); + } + + if ( ! isset( $_POST['eraser'] ) ) { + wp_send_json_error( __( 'Missing eraser index.' ) ); + } + + $eraser_index = (int) $_POST['eraser']; + + if ( ! isset( $_POST['page'] ) ) { + wp_send_json_error( __( 'Missing page index.' ) ); + } + + $page = (int) $_POST['page']; + + /** + * Filters the array of personal data eraser callbacks. + * + * @since 4.9.6 + * + * @param array $args { + * An array of callable erasers of personal data. Default empty array. + * + * @type array { + * Array of personal data exporters. + * + * @type string $callback Callable eraser that accepts an email address and + * a page and returns an array with boolean values for + * whether items were removed or retained and any messages + * from the eraser, as well as if additional pages are + * available. + * @type string $exporter_friendly_name Translated user facing friendly name for the eraser. + * } + * } + */ + $erasers = apply_filters( 'wp_privacy_personal_data_erasers', array() ); + + // Do we have any registered erasers? + if ( 0 < count( $erasers ) ) { + + if ( $eraser_index < 1 ) { + wp_send_json_error( __( 'Eraser index cannot be less than one.' ) ); + } + + if ( $eraser_index > count( $erasers ) ) { + wp_send_json_error( __( 'Eraser index is out of range.' ) ); + } + + if ( $page < 1 ) { + wp_send_json_error( __( 'Page index cannot be less than one.' ) ); + } + + $eraser_keys = array_keys( $erasers ); + $eraser_key = $eraser_keys[ $eraser_index - 1 ]; + $eraser = $erasers[ $eraser_key ]; + + if ( ! is_array( $eraser ) ) { + /* translators: %d: Eraser array index. */ + wp_send_json_error( sprintf( __( 'Expected an array describing the eraser at index %d.' ), $eraser_index ) ); + } + + if ( ! array_key_exists( 'eraser_friendly_name', $eraser ) ) { + /* translators: %d: Eraser array index. */ + wp_send_json_error( sprintf( __( 'Eraser array at index %d does not include a friendly name.' ), $eraser_index ) ); + } + + $eraser_friendly_name = $eraser['eraser_friendly_name']; + + if ( ! array_key_exists( 'callback', $eraser ) ) { + wp_send_json_error( + sprintf( + /* translators: %s: Eraser friendly name. */ + __( 'Eraser does not include a callback: %s.' ), + esc_html( $eraser_friendly_name ) + ) + ); + } + + if ( ! is_callable( $eraser['callback'] ) ) { + wp_send_json_error( + sprintf( + /* translators: %s: Eraser friendly name. */ + __( 'Eraser callback is not valid: %s.' ), + esc_html( $eraser_friendly_name ) + ) + ); + } + + $callback = $eraser['callback']; + $response = call_user_func( $callback, $email_address, $page ); + + if ( is_wp_error( $response ) ) { + wp_send_json_error( $response ); + } + + if ( ! is_array( $response ) ) { + wp_send_json_error( + sprintf( + /* translators: 1: Eraser friendly name, 2: Eraser array index. */ + __( 'Did not receive array from %1$s eraser (index %2$d).' ), + esc_html( $eraser_friendly_name ), + $eraser_index + ) + ); + } + + if ( ! array_key_exists( 'items_removed', $response ) ) { + wp_send_json_error( + sprintf( + /* translators: 1: Eraser friendly name, 2: Eraser array index. */ + __( 'Expected items_removed key in response array from %1$s eraser (index %2$d).' ), + esc_html( $eraser_friendly_name ), + $eraser_index + ) + ); + } + + if ( ! array_key_exists( 'items_retained', $response ) ) { + wp_send_json_error( + sprintf( + /* translators: 1: Eraser friendly name, 2: Eraser array index. */ + __( 'Expected items_retained key in response array from %1$s eraser (index %2$d).' ), + esc_html( $eraser_friendly_name ), + $eraser_index + ) + ); + } + + if ( ! array_key_exists( 'messages', $response ) ) { + wp_send_json_error( + sprintf( + /* translators: 1: Eraser friendly name, 2: Eraser array index. */ + __( 'Expected messages key in response array from %1$s eraser (index %2$d).' ), + esc_html( $eraser_friendly_name ), + $eraser_index + ) + ); + } + + if ( ! is_array( $response['messages'] ) ) { + wp_send_json_error( + sprintf( + /* translators: 1: Eraser friendly name, 2: Eraser array index. */ + __( 'Expected messages key to reference an array in response array from %1$s eraser (index %2$d).' ), + esc_html( $eraser_friendly_name ), + $eraser_index + ) + ); + } + + if ( ! array_key_exists( 'done', $response ) ) { + wp_send_json_error( + sprintf( + /* translators: 1: Eraser friendly name, 2: Eraser array index. */ + __( 'Expected done flag in response array from %1$s eraser (index %2$d).' ), + esc_html( $eraser_friendly_name ), + $eraser_index + ) + ); + } + } else { + // No erasers, so we're done. + $eraser_key = ''; + + $response = array( + 'items_removed' => false, + 'items_retained' => false, + 'messages' => array(), + 'done' => true, + ); + } + + /** + * Filters a page of personal data eraser data. + * + * Allows the erasure response to be consumed by destinations in addition to Ajax. + * + * @since 4.9.6 + * + * @param array $response The personal data for the given exporter and page. + * @param int $eraser_index The index of the eraser that provided this data. + * @param string $email_address The email address associated with this personal data. + * @param int $page The page for this response. + * @param int $request_id The privacy request post ID associated with this request. + * @param string $eraser_key The key (slug) of the eraser that provided this data. + */ + $response = apply_filters( 'wp_privacy_personal_data_erasure_page', $response, $eraser_index, $email_address, $page, $request_id, $eraser_key ); + + if ( is_wp_error( $response ) ) { + wp_send_json_error( $response ); + } + + wp_send_json_success( $response ); +} + +/** + * Ajax handler for site health checks on server communication. + * + * @since 5.2.0 + */ +function wp_ajax_health_check_dotorg_communication() { + check_ajax_referer( 'health-check-site-status' ); + + if ( ! current_user_can( 'view_site_health_checks' ) ) { + wp_send_json_error(); + } + + if ( ! class_exists( 'WP_Site_Health' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php'; + } + + $site_health = WP_Site_Health::get_instance(); + wp_send_json_success( $site_health->get_test_dotorg_communication() ); +} + +/** + * Ajax handler for site health checks on debug mode. + * + * @since 5.2.0 + */ +function wp_ajax_health_check_is_in_debug_mode() { + wp_verify_nonce( 'health-check-site-status' ); + + if ( ! current_user_can( 'view_site_health_checks' ) ) { + wp_send_json_error(); + } + + if ( ! class_exists( 'WP_Site_Health' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php'; + } + + $site_health = WP_Site_Health::get_instance(); + wp_send_json_success( $site_health->get_test_is_in_debug_mode() ); +} + +/** + * Ajax handler for site health checks on background updates. + * + * @since 5.2.0 + */ +function wp_ajax_health_check_background_updates() { + check_ajax_referer( 'health-check-site-status' ); + + if ( ! current_user_can( 'view_site_health_checks' ) ) { + wp_send_json_error(); + } + + if ( ! class_exists( 'WP_Site_Health' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php'; + } + + $site_health = WP_Site_Health::get_instance(); + wp_send_json_success( $site_health->get_test_background_updates() ); +} + + +/** + * Ajax handler for site health checks on loopback requests. + * + * @since 5.2.0 + */ +function wp_ajax_health_check_loopback_requests() { + check_ajax_referer( 'health-check-site-status' ); + + if ( ! current_user_can( 'view_site_health_checks' ) ) { + wp_send_json_error(); + } + + if ( ! class_exists( 'WP_Site_Health' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php'; + } + + $site_health = WP_Site_Health::get_instance(); + wp_send_json_success( $site_health->get_test_loopback_requests() ); +} + +/** + * Ajax handler for site health check to update the result status. + * + * @since 5.2.0 + */ +function wp_ajax_health_check_site_status_result() { + check_ajax_referer( 'health-check-site-status-result' ); + + if ( ! current_user_can( 'view_site_health_checks' ) ) { + wp_send_json_error(); + } + + set_transient( 'health-check-site-status-result', wp_json_encode( $_POST['counts'] ) ); + + wp_send_json_success(); +} + +/** + * Ajax handler for site health check to get directories and database sizes. + * + * @since 5.2.0 + */ +function wp_ajax_health_check_get_sizes() { + check_ajax_referer( 'health-check-site-status-result' ); + + if ( ! current_user_can( 'view_site_health_checks' ) || is_multisite() ) { + wp_send_json_error(); + } + + if ( ! class_exists( 'WP_Debug_Data' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-debug-data.php'; + } + + $sizes_data = WP_Debug_Data::get_sizes(); + $all_sizes = array( 'raw' => 0 ); + + foreach ( $sizes_data as $name => $value ) { + $name = sanitize_text_field( $name ); + $data = array(); + + if ( isset( $value['size'] ) ) { + if ( is_string( $value['size'] ) ) { + $data['size'] = sanitize_text_field( $value['size'] ); + } else { + $data['size'] = (int) $value['size']; + } + } + + if ( isset( $value['debug'] ) ) { + if ( is_string( $value['debug'] ) ) { + $data['debug'] = sanitize_text_field( $value['debug'] ); + } else { + $data['debug'] = (int) $value['debug']; + } + } + + if ( ! empty( $value['raw'] ) ) { + $data['raw'] = (int) $value['raw']; + } + + $all_sizes[ $name ] = $data; + } + + if ( isset( $all_sizes['total_size']['debug'] ) && 'not available' === $all_sizes['total_size']['debug'] ) { + wp_send_json_error( $all_sizes ); + } + + wp_send_json_success( $all_sizes ); +} + +/** + * Ajax handler to renew the REST API nonce. + * + * @since 5.3.0 + */ +function wp_ajax_rest_nonce() { + exit( wp_create_nonce( 'wp_rest' ) ); +} diff --git a/wp-admin/includes/bookmark.php b/wp-admin/includes/bookmark.php new file mode 100644 index 0000000..ededc33 --- /dev/null +++ b/wp-admin/includes/bookmark.php @@ -0,0 +1,327 @@ +' . __( 'You need a higher level of permission.' ) . '' . + '

        ' . __( 'Sorry, you are not allowed to edit the links for this site.' ) . '

        ', + 403 + ); + } + + $_POST['link_url'] = esc_html( $_POST['link_url'] ); + $_POST['link_url'] = esc_url( $_POST['link_url'] ); + $_POST['link_name'] = esc_html( $_POST['link_name'] ); + $_POST['link_image'] = esc_html( $_POST['link_image'] ); + $_POST['link_rss'] = esc_url( $_POST['link_rss'] ); + if ( ! isset( $_POST['link_visible'] ) || 'N' != $_POST['link_visible'] ) { + $_POST['link_visible'] = 'Y'; + } + + if ( ! empty( $link_id ) ) { + $_POST['link_id'] = $link_id; + return wp_update_link( $_POST ); + } else { + return wp_insert_link( $_POST ); + } +} + +/** + * Retrieves the default link for editing. + * + * @since 2.0.0 + * + * @return stdClass Default link object. + */ +function get_default_link_to_edit() { + $link = new stdClass; + if ( isset( $_GET['linkurl'] ) ) { + $link->link_url = esc_url( wp_unslash( $_GET['linkurl'] ) ); + } else { + $link->link_url = ''; + } + + if ( isset( $_GET['name'] ) ) { + $link->link_name = esc_attr( wp_unslash( $_GET['name'] ) ); + } else { + $link->link_name = ''; + } + + $link->link_visible = 'Y'; + + return $link; +} + +/** + * Deletes a specified link from the database. + * + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $link_id ID of the link to delete + * @return true Always true. + */ +function wp_delete_link( $link_id ) { + global $wpdb; + /** + * Fires before a link is deleted. + * + * @since 2.0.0 + * + * @param int $link_id ID of the link to delete. + */ + do_action( 'delete_link', $link_id ); + + wp_delete_object_term_relationships( $link_id, 'link_category' ); + + $wpdb->delete( $wpdb->links, array( 'link_id' => $link_id ) ); + + /** + * Fires after a link has been deleted. + * + * @since 2.2.0 + * + * @param int $link_id ID of the deleted link. + */ + do_action( 'deleted_link', $link_id ); + + clean_bookmark_cache( $link_id ); + + return true; +} + +/** + * Retrieves the link category IDs associated with the link specified. + * + * @since 2.1.0 + * + * @param int $link_id Link ID to look up. + * @return int[] The IDs of the requested link's categories. + */ +function wp_get_link_cats( $link_id = 0 ) { + $cats = wp_get_object_terms( $link_id, 'link_category', array( 'fields' => 'ids' ) ); + return array_unique( $cats ); +} + +/** + * Retrieves link data based on its ID. + * + * @since 2.0.0 + * + * @param int|stdClass $link Link ID or object to retrieve. + * @return object Link object for editing. + */ +function get_link_to_edit( $link ) { + return get_bookmark( $link, OBJECT, 'edit' ); +} + +/** + * Inserts/updates links into/in the database. + * + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $linkdata Elements that make up the link to insert. + * @param bool $wp_error Optional. Whether to return a WP_Error object on failure. Default false. + * @return int|WP_Error Value 0 or WP_Error on failure. The link ID on success. + */ +function wp_insert_link( $linkdata, $wp_error = false ) { + global $wpdb; + + $defaults = array( + 'link_id' => 0, + 'link_name' => '', + 'link_url' => '', + 'link_rating' => 0, + ); + + $parsed_args = wp_parse_args( $linkdata, $defaults ); + $parsed_args = wp_unslash( sanitize_bookmark( $parsed_args, 'db' ) ); + + $link_id = $parsed_args['link_id']; + $link_name = $parsed_args['link_name']; + $link_url = $parsed_args['link_url']; + + $update = false; + if ( ! empty( $link_id ) ) { + $update = true; + } + + if ( trim( $link_name ) == '' ) { + if ( trim( $link_url ) != '' ) { + $link_name = $link_url; + } else { + return 0; + } + } + + if ( trim( $link_url ) == '' ) { + return 0; + } + + $link_rating = ( ! empty( $parsed_args['link_rating'] ) ) ? $parsed_args['link_rating'] : 0; + $link_image = ( ! empty( $parsed_args['link_image'] ) ) ? $parsed_args['link_image'] : ''; + $link_target = ( ! empty( $parsed_args['link_target'] ) ) ? $parsed_args['link_target'] : ''; + $link_visible = ( ! empty( $parsed_args['link_visible'] ) ) ? $parsed_args['link_visible'] : 'Y'; + $link_owner = ( ! empty( $parsed_args['link_owner'] ) ) ? $parsed_args['link_owner'] : get_current_user_id(); + $link_notes = ( ! empty( $parsed_args['link_notes'] ) ) ? $parsed_args['link_notes'] : ''; + $link_description = ( ! empty( $parsed_args['link_description'] ) ) ? $parsed_args['link_description'] : ''; + $link_rss = ( ! empty( $parsed_args['link_rss'] ) ) ? $parsed_args['link_rss'] : ''; + $link_rel = ( ! empty( $parsed_args['link_rel'] ) ) ? $parsed_args['link_rel'] : ''; + $link_category = ( ! empty( $parsed_args['link_category'] ) ) ? $parsed_args['link_category'] : array(); + + // Make sure we set a valid category. + if ( ! is_array( $link_category ) || 0 == count( $link_category ) ) { + $link_category = array( get_option( 'default_link_category' ) ); + } + + if ( $update ) { + if ( false === $wpdb->update( $wpdb->links, compact( 'link_url', 'link_name', 'link_image', 'link_target', 'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_rel', 'link_notes', 'link_rss' ), compact( 'link_id' ) ) ) { + if ( $wp_error ) { + return new WP_Error( 'db_update_error', __( 'Could not update link in the database' ), $wpdb->last_error ); + } else { + return 0; + } + } + } else { + if ( false === $wpdb->insert( $wpdb->links, compact( 'link_url', 'link_name', 'link_image', 'link_target', 'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_rel', 'link_notes', 'link_rss' ) ) ) { + if ( $wp_error ) { + return new WP_Error( 'db_insert_error', __( 'Could not insert link into the database' ), $wpdb->last_error ); + } else { + return 0; + } + } + $link_id = (int) $wpdb->insert_id; + } + + wp_set_link_cats( $link_id, $link_category ); + + if ( $update ) { + /** + * Fires after a link was updated in the database. + * + * @since 2.0.0 + * + * @param int $link_id ID of the link that was updated. + */ + do_action( 'edit_link', $link_id ); + } else { + /** + * Fires after a link was added to the database. + * + * @since 2.0.0 + * + * @param int $link_id ID of the link that was added. + */ + do_action( 'add_link', $link_id ); + } + clean_bookmark_cache( $link_id ); + + return $link_id; +} + +/** + * Update link with the specified link categories. + * + * @since 2.1.0 + * + * @param int $link_id ID of the link to update. + * @param int[] $link_categories Array of link category IDs to add the link to. + */ +function wp_set_link_cats( $link_id = 0, $link_categories = array() ) { + // If $link_categories isn't already an array, make it one: + if ( ! is_array( $link_categories ) || 0 == count( $link_categories ) ) { + $link_categories = array( get_option( 'default_link_category' ) ); + } + + $link_categories = array_map( 'intval', $link_categories ); + $link_categories = array_unique( $link_categories ); + + wp_set_object_terms( $link_id, $link_categories, 'link_category' ); + + clean_bookmark_cache( $link_id ); +} + +/** + * Updates a link in the database. + * + * @since 2.0.0 + * + * @param array $linkdata Link data to update. + * @return int|WP_Error Value 0 or WP_Error on failure. The updated link ID on success. + */ +function wp_update_link( $linkdata ) { + $link_id = (int) $linkdata['link_id']; + + $link = get_bookmark( $link_id, ARRAY_A ); + + // Escape data pulled from DB. + $link = wp_slash( $link ); + + // Passed link category list overwrites existing category list if not empty. + if ( isset( $linkdata['link_category'] ) && is_array( $linkdata['link_category'] ) && 0 != count( $linkdata['link_category'] ) ) { + $link_cats = $linkdata['link_category']; + } else { + $link_cats = $link['link_category']; + } + + // Merge old and new fields with new fields overwriting old ones. + $linkdata = array_merge( $link, $linkdata ); + $linkdata['link_category'] = $link_cats; + + return wp_insert_link( $linkdata ); +} + +/** + * Outputs the 'disabled' message for the WordPress Link Manager. + * + * @since 3.5.0 + * @access private + * + * @global string $pagenow + */ +function wp_link_manager_disabled_message() { + global $pagenow; + if ( 'link-manager.php' != $pagenow && 'link-add.php' != $pagenow && 'link.php' != $pagenow ) { + return; + } + + add_filter( 'pre_option_link_manager_enabled', '__return_true', 100 ); + $really_can_manage_links = current_user_can( 'manage_links' ); + remove_filter( 'pre_option_link_manager_enabled', '__return_true', 100 ); + + if ( $really_can_manage_links && current_user_can( 'install_plugins' ) ) { + $link = network_admin_url( 'plugin-install.php?tab=search&s=Link+Manager' ); + /* translators: %s: URL to install the Link Manager plugin. */ + wp_die( sprintf( __( 'If you are looking to use the link manager, please install the Link Manager plugin.' ), $link ) ); + } + + wp_die( __( 'Sorry, you are not allowed to edit the links for this site.' ) ); +} diff --git a/wp-admin/includes/class-automatic-upgrader-skin.php b/wp-admin/includes/class-automatic-upgrader-skin.php new file mode 100644 index 0000000..9875c6d --- /dev/null +++ b/wp-admin/includes/class-automatic-upgrader-skin.php @@ -0,0 +1,119 @@ +options['context'] = $context; + } + /* + * TODO: Fix up request_filesystem_credentials(), or split it, to allow us to request a no-output version. + * This will output a credentials form in event of failure. We don't want that, so just hide with a buffer. + */ + ob_start(); + $result = parent::request_filesystem_credentials( $error, $context, $allow_relaxed_file_ownership ); + ob_end_clean(); + return $result; + } + + /** + * @return array + */ + public function get_upgrade_messages() { + return $this->messages; + } + + /** + * @param string|array|WP_Error $data + * @param mixed ...$args Optional text replacements. + */ + public function feedback( $data, ...$args ) { + if ( is_wp_error( $data ) ) { + $string = $data->get_error_message(); + } elseif ( is_array( $data ) ) { + return; + } else { + $string = $data; + } + if ( ! empty( $this->upgrader->strings[ $string ] ) ) { + $string = $this->upgrader->strings[ $string ]; + } + + if ( strpos( $string, '%' ) !== false ) { + if ( ! empty( $args ) ) { + $string = vsprintf( $string, $args ); + } + } + + $string = trim( $string ); + + // Only allow basic HTML in the messages, as it'll be used in emails/logs rather than direct browser output. + $string = wp_kses( + $string, + array( + 'a' => array( + 'href' => true, + ), + 'br' => true, + 'em' => true, + 'strong' => true, + ) + ); + + if ( empty( $string ) ) { + return; + } + + $this->messages[] = $string; + } + + /** + */ + public function header() { + ob_start(); + } + + /** + */ + public function footer() { + $output = ob_get_clean(); + if ( ! empty( $output ) ) { + $this->feedback( $output ); + } + } +} diff --git a/wp-admin/includes/class-bulk-plugin-upgrader-skin.php b/wp-admin/includes/class-bulk-plugin-upgrader-skin.php new file mode 100644 index 0000000..308cacf --- /dev/null +++ b/wp-admin/includes/class-bulk-plugin-upgrader-skin.php @@ -0,0 +1,78 @@ +upgrader->strings['skin_before_update_header'] = __( 'Updating Plugin %1$s (%2$d/%3$d)' ); + } + + /** + * @param string $title + */ + public function before( $title = '' ) { + parent::before( $this->plugin_info['Title'] ); + } + + /** + * @param string $title + */ + public function after( $title = '' ) { + parent::after( $this->plugin_info['Title'] ); + $this->decrement_update_count( 'plugin' ); + } + + /** + */ + public function bulk_footer() { + parent::bulk_footer(); + + $update_actions = array( + 'plugins_page' => sprintf( + '%s', + self_admin_url( 'plugins.php' ), + __( 'Return to Plugins page' ) + ), + 'updates_page' => sprintf( + '%s', + self_admin_url( 'update-core.php' ), + __( 'Return to WordPress Updates page' ) + ), + ); + + if ( ! current_user_can( 'activate_plugins' ) ) { + unset( $update_actions['plugins_page'] ); + } + + /** + * Filters the list of action links available following bulk plugin updates. + * + * @since 3.0.0 + * + * @param string[] $update_actions Array of plugin action links. + * @param array $plugin_info Array of information for the last-updated plugin. + */ + $update_actions = apply_filters( 'update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info ); + + if ( ! empty( $update_actions ) ) { + $this->feedback( implode( ' | ', (array) $update_actions ) ); + } + } +} diff --git a/wp-admin/includes/class-bulk-theme-upgrader-skin.php b/wp-admin/includes/class-bulk-theme-upgrader-skin.php new file mode 100644 index 0000000..d3f0c91 --- /dev/null +++ b/wp-admin/includes/class-bulk-theme-upgrader-skin.php @@ -0,0 +1,78 @@ +upgrader->strings['skin_before_update_header'] = __( 'Updating Theme %1$s (%2$d/%3$d)' ); + } + + /** + * @param string $title + */ + public function before( $title = '' ) { + parent::before( $this->theme_info->display( 'Name' ) ); + } + + /** + * @param string $title + */ + public function after( $title = '' ) { + parent::after( $this->theme_info->display( 'Name' ) ); + $this->decrement_update_count( 'theme' ); + } + + /** + */ + public function bulk_footer() { + parent::bulk_footer(); + + $update_actions = array( + 'themes_page' => sprintf( + '%s', + self_admin_url( 'themes.php' ), + __( 'Return to Themes page' ) + ), + 'updates_page' => sprintf( + '%s', + self_admin_url( 'update-core.php' ), + __( 'Return to WordPress Updates page' ) + ), + ); + + if ( ! current_user_can( 'switch_themes' ) && ! current_user_can( 'edit_theme_options' ) ) { + unset( $update_actions['themes_page'] ); + } + + /** + * Filters the list of action links available following bulk theme updates. + * + * @since 3.0.0 + * + * @param string[] $update_actions Array of theme action links. + * @param WP_Theme $theme_info Theme object for the last-updated theme. + */ + $update_actions = apply_filters( 'update_bulk_theme_complete_actions', $update_actions, $this->theme_info ); + + if ( ! empty( $update_actions ) ) { + $this->feedback( implode( ' | ', (array) $update_actions ) ); + } + } +} diff --git a/wp-admin/includes/class-bulk-upgrader-skin.php b/wp-admin/includes/class-bulk-upgrader-skin.php new file mode 100644 index 0000000..c5cbcd4 --- /dev/null +++ b/wp-admin/includes/class-bulk-upgrader-skin.php @@ -0,0 +1,177 @@ + '', + 'nonce' => '', + ); + $args = wp_parse_args( $args, $defaults ); + + parent::__construct( $args ); + } + + /** + */ + public function add_strings() { + $this->upgrader->strings['skin_upgrade_start'] = __( 'The update process is starting. This process may take a while on some hosts, so please be patient.' ); + /* translators: 1: Title of an update, 2: Error message. */ + $this->upgrader->strings['skin_update_failed_error'] = __( 'An error occurred while updating %1$s: %2$s' ); + /* translators: %s: Title of an update. */ + $this->upgrader->strings['skin_update_failed'] = __( 'The update of %s failed.' ); + /* translators: %s: Title of an update. */ + $this->upgrader->strings['skin_update_successful'] = __( '%s updated successfully.' ); + $this->upgrader->strings['skin_upgrade_end'] = __( 'All updates have been completed.' ); + } + + /** + * @param string $string + * @param mixed ...$args Optional text replacements. + */ + public function feedback( $string, ...$args ) { + if ( isset( $this->upgrader->strings[ $string ] ) ) { + $string = $this->upgrader->strings[ $string ]; + } + + if ( strpos( $string, '%' ) !== false ) { + if ( $args ) { + $args = array_map( 'strip_tags', $args ); + $args = array_map( 'esc_html', $args ); + $string = vsprintf( $string, $args ); + } + } + if ( empty( $string ) ) { + return; + } + if ( $this->in_loop ) { + echo "$string
        \n"; + } else { + echo "

        $string

        \n"; + } + } + + /** + */ + public function header() { + // Nothing, This will be displayed within a iframe. + } + + /** + */ + public function footer() { + // Nothing, This will be displayed within a iframe. + } + + /** + * @param string|WP_Error $error + */ + public function error( $error ) { + if ( is_string( $error ) && isset( $this->upgrader->strings[ $error ] ) ) { + $this->error = $this->upgrader->strings[ $error ]; + } + + if ( is_wp_error( $error ) ) { + $messages = array(); + foreach ( $error->get_error_messages() as $emessage ) { + if ( $error->get_error_data() && is_string( $error->get_error_data() ) ) { + $messages[] = $emessage . ' ' . esc_html( strip_tags( $error->get_error_data() ) ); + } else { + $messages[] = $emessage; + } + } + $this->error = implode( ', ', $messages ); + } + echo ''; + } + + /** + */ + public function bulk_header() { + $this->feedback( 'skin_upgrade_start' ); + } + + /** + */ + public function bulk_footer() { + $this->feedback( 'skin_upgrade_end' ); + } + + /** + * @param string $title + */ + public function before( $title = '' ) { + $this->in_loop = true; + printf( '

        ' . $this->upgrader->strings['skin_before_update_header'] . '

        ', $title, $this->upgrader->update_current, $this->upgrader->update_count ); + echo ''; + // This progress messages div gets moved via JavaScript when clicking on "Show details.". + echo '

        '; + $this->flush_output(); + } + + /** + * @param string $title + */ + public function after( $title = '' ) { + echo '

        '; + if ( $this->error || ! $this->result ) { + if ( $this->error ) { + echo '

        ' . sprintf( $this->upgrader->strings['skin_update_failed_error'], $title, '' . $this->error . '' ) . '

        '; + } else { + echo '

        ' . sprintf( $this->upgrader->strings['skin_update_failed'], $title ) . '

        '; + } + + echo ''; + } + if ( $this->result && ! is_wp_error( $this->result ) ) { + if ( ! $this->error ) { + echo '
        ' . + '

        ' . sprintf( $this->upgrader->strings['skin_update_successful'], $title ) . + ' ' . + '

        '; + } + + echo ''; + } + + $this->reset(); + $this->flush_output(); + } + + /** + */ + public function reset() { + $this->in_loop = false; + $this->error = false; + } + + /** + */ + public function flush_output() { + wp_ob_end_flush_all(); + flush(); + } +} diff --git a/wp-admin/includes/class-core-upgrader.php b/wp-admin/includes/class-core-upgrader.php new file mode 100644 index 0000000..7c78260 --- /dev/null +++ b/wp-admin/includes/class-core-upgrader.php @@ -0,0 +1,415 @@ +strings['up_to_date'] = __( 'WordPress is at the latest version.' ); + $this->strings['locked'] = __( 'Another update is currently in progress.' ); + $this->strings['no_package'] = __( 'Update package not available.' ); + /* translators: %s: Package URL. */ + $this->strings['downloading_package'] = sprintf( __( 'Downloading update from %s…' ), '%s' ); + $this->strings['unpack_package'] = __( 'Unpacking the update…' ); + $this->strings['copy_failed'] = __( 'Could not copy files.' ); + $this->strings['copy_failed_space'] = __( 'Could not copy files. You may have run out of disk space.' ); + $this->strings['start_rollback'] = __( 'Attempting to roll back to previous version.' ); + $this->strings['rollback_was_required'] = __( 'Due to an error during updating, WordPress has rolled back to your previous version.' ); + } + + /** + * Upgrade WordPress core. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * @global callable $_wp_filesystem_direct_method + * + * @param object $current Response object for whether WordPress is current. + * @param array $args { + * Optional. Arguments for upgrading WordPress core. Default empty array. + * + * @type bool $pre_check_md5 Whether to check the file checksums before + * attempting the upgrade. Default true. + * @type bool $attempt_rollback Whether to attempt to rollback the chances if + * there is a problem. Default false. + * @type bool $do_rollback Whether to perform this "upgrade" as a rollback. + * Default false. + * } + * @return string|false|WP_Error New WordPress version on success, false or WP_Error on failure. + */ + public function upgrade( $current, $args = array() ) { + global $wp_filesystem; + + require ABSPATH . WPINC . '/version.php'; // $wp_version; + + $start_time = time(); + + $defaults = array( + 'pre_check_md5' => true, + 'attempt_rollback' => false, + 'do_rollback' => false, + 'allow_relaxed_file_ownership' => false, + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $this->init(); + $this->upgrade_strings(); + + // Is an update available? + if ( ! isset( $current->response ) || 'latest' === $current->response ) { + return new WP_Error( 'up_to_date', $this->strings['up_to_date'] ); + } + + $res = $this->fs_connect( array( ABSPATH, WP_CONTENT_DIR ), $parsed_args['allow_relaxed_file_ownership'] ); + if ( ! $res || is_wp_error( $res ) ) { + return $res; + } + + $wp_dir = trailingslashit( $wp_filesystem->abspath() ); + + $partial = true; + if ( $parsed_args['do_rollback'] ) { + $partial = false; + } elseif ( $parsed_args['pre_check_md5'] && ! $this->check_files() ) { + $partial = false; + } + + /* + * If partial update is returned from the API, use that, unless we're doing + * a reinstallation. If we cross the new_bundled version number, then use + * the new_bundled zip. Don't though if the constant is set to skip bundled items. + * If the API returns a no_content zip, go with it. Finally, default to the full zip. + */ + if ( $parsed_args['do_rollback'] && $current->packages->rollback ) { + $to_download = 'rollback'; + } elseif ( $current->packages->partial && 'reinstall' != $current->response && $wp_version == $current->partial_version && $partial ) { + $to_download = 'partial'; + } elseif ( $current->packages->new_bundled && version_compare( $wp_version, $current->new_bundled, '<' ) + && ( ! defined( 'CORE_UPGRADE_SKIP_NEW_BUNDLED' ) || ! CORE_UPGRADE_SKIP_NEW_BUNDLED ) ) { + $to_download = 'new_bundled'; + } elseif ( $current->packages->no_content ) { + $to_download = 'no_content'; + } else { + $to_download = 'full'; + } + + // Lock to prevent multiple Core Updates occurring. + $lock = WP_Upgrader::create_lock( 'core_updater', 15 * MINUTE_IN_SECONDS ); + if ( ! $lock ) { + return new WP_Error( 'locked', $this->strings['locked'] ); + } + + $download = $this->download_package( $current->packages->$to_download, true ); + + // Allow for signature soft-fail. + // WARNING: This may be removed in the future. + if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) { + // Outout the failure error as a normal feedback, and not as an error: + /** This filter is documented in wp-admin/includes/update-core.php */ + apply_filters( 'update_feedback', $download->get_error_message() ); + + // Report this failure back to WordPress.org for debugging purposes. + wp_version_check( + array( + 'signature_failure_code' => $download->get_error_code(), + 'signature_failure_data' => $download->get_error_data(), + ) + ); + + // Pretend this error didn't happen. + $download = $download->get_error_data( 'softfail-filename' ); + } + + if ( is_wp_error( $download ) ) { + WP_Upgrader::release_lock( 'core_updater' ); + return $download; + } + + $working_dir = $this->unpack_package( $download ); + if ( is_wp_error( $working_dir ) ) { + WP_Upgrader::release_lock( 'core_updater' ); + return $working_dir; + } + + // Copy update-core.php from the new version into place. + if ( ! $wp_filesystem->copy( $working_dir . '/wordpress/wp-admin/includes/update-core.php', $wp_dir . 'wp-admin/includes/update-core.php', true ) ) { + $wp_filesystem->delete( $working_dir, true ); + WP_Upgrader::release_lock( 'core_updater' ); + return new WP_Error( 'copy_failed_for_update_core_file', __( 'The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions.' ), 'wp-admin/includes/update-core.php' ); + } + $wp_filesystem->chmod( $wp_dir . 'wp-admin/includes/update-core.php', FS_CHMOD_FILE ); + + require_once ABSPATH . 'wp-admin/includes/update-core.php'; + + if ( ! function_exists( 'update_core' ) ) { + WP_Upgrader::release_lock( 'core_updater' ); + return new WP_Error( 'copy_failed_space', $this->strings['copy_failed_space'] ); + } + + $result = update_core( $working_dir, $wp_dir ); + + // In the event of an issue, we may be able to roll back. + if ( $parsed_args['attempt_rollback'] && $current->packages->rollback && ! $parsed_args['do_rollback'] ) { + $try_rollback = false; + if ( is_wp_error( $result ) ) { + $error_code = $result->get_error_code(); + /* + * Not all errors are equal. These codes are critical: copy_failed__copy_dir, + * mkdir_failed__copy_dir, copy_failed__copy_dir_retry, and disk_full. + * do_rollback allows for update_core() to trigger a rollback if needed. + */ + if ( false !== strpos( $error_code, 'do_rollback' ) ) { + $try_rollback = true; + } elseif ( false !== strpos( $error_code, '__copy_dir' ) ) { + $try_rollback = true; + } elseif ( 'disk_full' === $error_code ) { + $try_rollback = true; + } + } + + if ( $try_rollback ) { + /** This filter is documented in wp-admin/includes/update-core.php */ + apply_filters( 'update_feedback', $result ); + + /** This filter is documented in wp-admin/includes/update-core.php */ + apply_filters( 'update_feedback', $this->strings['start_rollback'] ); + + $rollback_result = $this->upgrade( $current, array_merge( $parsed_args, array( 'do_rollback' => true ) ) ); + + $original_result = $result; + $result = new WP_Error( + 'rollback_was_required', + $this->strings['rollback_was_required'], + (object) array( + 'update' => $original_result, + 'rollback' => $rollback_result, + ) + ); + } + } + + /** This action is documented in wp-admin/includes/class-wp-upgrader.php */ + do_action( + 'upgrader_process_complete', + $this, + array( + 'action' => 'update', + 'type' => 'core', + ) + ); + + // Clear the current updates. + delete_site_transient( 'update_core' ); + + if ( ! $parsed_args['do_rollback'] ) { + $stats = array( + 'update_type' => $current->response, + 'success' => true, + 'fs_method' => $wp_filesystem->method, + 'fs_method_forced' => defined( 'FS_METHOD' ) || has_filter( 'filesystem_method' ), + 'fs_method_direct' => ! empty( $GLOBALS['_wp_filesystem_direct_method'] ) ? $GLOBALS['_wp_filesystem_direct_method'] : '', + 'time_taken' => time() - $start_time, + 'reported' => $wp_version, + 'attempted' => $current->version, + ); + + if ( is_wp_error( $result ) ) { + $stats['success'] = false; + // Did a rollback occur? + if ( ! empty( $try_rollback ) ) { + $stats['error_code'] = $original_result->get_error_code(); + $stats['error_data'] = $original_result->get_error_data(); + // Was the rollback successful? If not, collect its error too. + $stats['rollback'] = ! is_wp_error( $rollback_result ); + if ( is_wp_error( $rollback_result ) ) { + $stats['rollback_code'] = $rollback_result->get_error_code(); + $stats['rollback_data'] = $rollback_result->get_error_data(); + } + } else { + $stats['error_code'] = $result->get_error_code(); + $stats['error_data'] = $result->get_error_data(); + } + } + + wp_version_check( $stats ); + } + + WP_Upgrader::release_lock( 'core_updater' ); + + return $result; + } + + /** + * Determines if this WordPress Core version should update to an offered version or not. + * + * @since 3.7.0 + * + * @param string $offered_ver The offered version, of the format x.y.z. + * @return bool True if we should update to the offered version, otherwise false. + */ + public static function should_update_to_version( $offered_ver ) { + require ABSPATH . WPINC . '/version.php'; // $wp_version; // x.y.z + + $current_branch = implode( '.', array_slice( preg_split( '/[.-]/', $wp_version ), 0, 2 ) ); // x.y + $new_branch = implode( '.', array_slice( preg_split( '/[.-]/', $offered_ver ), 0, 2 ) ); // x.y + + $current_is_development_version = (bool) strpos( $wp_version, '-' ); + + // Defaults: + $upgrade_dev = true; + $upgrade_minor = true; + $upgrade_major = false; + + // WP_AUTO_UPDATE_CORE = true (all), 'minor', false. + if ( defined( 'WP_AUTO_UPDATE_CORE' ) ) { + if ( false === WP_AUTO_UPDATE_CORE ) { + // Defaults to turned off, unless a filter allows it. + $upgrade_dev = false; + $upgrade_minor = false; + $upgrade_major = false; + } elseif ( true === WP_AUTO_UPDATE_CORE ) { + // ALL updates for core. + $upgrade_dev = true; + $upgrade_minor = true; + $upgrade_major = true; + } elseif ( 'minor' === WP_AUTO_UPDATE_CORE ) { + // Only minor updates for core. + $upgrade_dev = false; + $upgrade_minor = true; + $upgrade_major = false; + } + } + + // 1: If we're already on that version, not much point in updating? + if ( $offered_ver == $wp_version ) { + return false; + } + + // 2: If we're running a newer version, that's a nope. + if ( version_compare( $wp_version, $offered_ver, '>' ) ) { + return false; + } + + $failure_data = get_site_option( 'auto_core_update_failed' ); + if ( $failure_data ) { + // If this was a critical update failure, cannot update. + if ( ! empty( $failure_data['critical'] ) ) { + return false; + } + + // Don't claim we can update on update-core.php if we have a non-critical failure logged. + if ( $wp_version == $failure_data['current'] && false !== strpos( $offered_ver, '.1.next.minor' ) ) { + return false; + } + + /* + * Cannot update if we're retrying the same A to B update that caused a non-critical failure. + * Some non-critical failures do allow retries, like download_failed. + * 3.7.1 => 3.7.2 resulted in files_not_writable, if we are still on 3.7.1 and still trying to update to 3.7.2. + */ + if ( empty( $failure_data['retry'] ) && $wp_version == $failure_data['current'] && $offered_ver == $failure_data['attempted'] ) { + return false; + } + } + + // 3: 3.7-alpha-25000 -> 3.7-alpha-25678 -> 3.7-beta1 -> 3.7-beta2. + if ( $current_is_development_version ) { + + /** + * Filters whether to enable automatic core updates for development versions. + * + * @since 3.7.0 + * + * @param bool $upgrade_dev Whether to enable automatic updates for + * development versions. + */ + if ( ! apply_filters( 'allow_dev_auto_core_updates', $upgrade_dev ) ) { + return false; + } + // Else fall through to minor + major branches below. + } + + // 4: Minor in-branch updates (3.7.0 -> 3.7.1 -> 3.7.2 -> 3.7.4). + if ( $current_branch == $new_branch ) { + + /** + * Filters whether to enable minor automatic core updates. + * + * @since 3.7.0 + * + * @param bool $upgrade_minor Whether to enable minor automatic core updates. + */ + return apply_filters( 'allow_minor_auto_core_updates', $upgrade_minor ); + } + + // 5: Major version updates (3.7.0 -> 3.8.0 -> 3.9.1). + if ( version_compare( $new_branch, $current_branch, '>' ) ) { + + /** + * Filters whether to enable major automatic core updates. + * + * @since 3.7.0 + * + * @param bool $upgrade_major Whether to enable major automatic core updates. + */ + return apply_filters( 'allow_major_auto_core_updates', $upgrade_major ); + } + + // If we're not sure, we don't want it. + return false; + } + + /** + * Compare the disk file checksums against the expected checksums. + * + * @since 3.7.0 + * + * @global string $wp_version The WordPress version string. + * @global string $wp_local_package Locale code of the package. + * + * @return bool True if the checksums match, otherwise false. + */ + public function check_files() { + global $wp_version, $wp_local_package; + + $checksums = get_core_checksums( $wp_version, isset( $wp_local_package ) ? $wp_local_package : 'en_US' ); + + if ( ! is_array( $checksums ) ) { + return false; + } + + foreach ( $checksums as $file => $checksum ) { + // Skip files which get updated. + if ( 'wp-content' == substr( $file, 0, 10 ) ) { + continue; + } + if ( ! file_exists( ABSPATH . $file ) || md5_file( ABSPATH . $file ) !== $checksum ) { + return false; + } + } + + return true; + } +} diff --git a/wp-admin/includes/class-custom-background.php b/wp-admin/includes/class-custom-background.php new file mode 100644 index 0000000..30a05bf --- /dev/null +++ b/wp-admin/includes/class-custom-background.php @@ -0,0 +1,616 @@ +admin_header_callback = $admin_header_callback; + $this->admin_image_div_callback = $admin_image_div_callback; + + add_action( 'admin_menu', array( $this, 'init' ) ); + + add_action( 'wp_ajax_custom-background-add', array( $this, 'ajax_background_add' ) ); + + // Unused since 3.5.0. + add_action( 'wp_ajax_set-background-image', array( $this, 'wp_set_background_image' ) ); + } + + /** + * Set up the hooks for the Custom Background admin page. + * + * @since 3.0.0 + */ + public function init() { + $page = add_theme_page( __( 'Background' ), __( 'Background' ), 'edit_theme_options', 'custom-background', array( $this, 'admin_page' ) ); + if ( ! $page ) { + return; + } + + add_action( "load-{$page}", array( $this, 'admin_load' ) ); + add_action( "load-{$page}", array( $this, 'take_action' ), 49 ); + add_action( "load-{$page}", array( $this, 'handle_upload' ), 49 ); + + if ( $this->admin_header_callback ) { + add_action( "admin_head-{$page}", $this->admin_header_callback, 51 ); + } + } + + /** + * Set up the enqueue for the CSS & JavaScript files. + * + * @since 3.0.0 + */ + public function admin_load() { + get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

        ' . __( 'You can customize the look of your site without touching any of your theme’s code by using a custom background. Your background can be an image or a color.' ) . '

        ' . + '

        ' . __( 'To use a background image, simply upload it or choose an image that has already been uploaded to your Media Library by clicking the “Choose Image” button. You can display a single instance of your image, or tile it to fill the screen. You can have your background fixed in place, so your site content moves on top of it, or you can have it scroll with your site.' ) . '

        ' . + '

        ' . __( 'You can also choose a background color by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a color using the color picker.' ) . '

        ' . + '

        ' . __( 'Don’t forget to click on the Save Changes button when you are finished.' ) . '

        ', + ) + ); + + get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Custom Background' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' + ); + + wp_enqueue_media(); + wp_enqueue_script( 'custom-background' ); + wp_enqueue_style( 'wp-color-picker' ); + } + + /** + * Execute custom background modification. + * + * @since 3.0.0 + */ + public function take_action() { + if ( empty( $_POST ) ) { + return; + } + + if ( isset( $_POST['reset-background'] ) ) { + check_admin_referer( 'custom-background-reset', '_wpnonce-custom-background-reset' ); + remove_theme_mod( 'background_image' ); + remove_theme_mod( 'background_image_thumb' ); + $this->updated = true; + return; + } + + if ( isset( $_POST['remove-background'] ) ) { + // @todo Uploaded files are not removed here. + check_admin_referer( 'custom-background-remove', '_wpnonce-custom-background-remove' ); + set_theme_mod( 'background_image', '' ); + set_theme_mod( 'background_image_thumb', '' ); + $this->updated = true; + wp_safe_redirect( $_POST['_wp_http_referer'] ); + return; + } + + if ( isset( $_POST['background-preset'] ) ) { + check_admin_referer( 'custom-background' ); + + if ( in_array( $_POST['background-preset'], array( 'default', 'fill', 'fit', 'repeat', 'custom' ), true ) ) { + $preset = $_POST['background-preset']; + } else { + $preset = 'default'; + } + + set_theme_mod( 'background_preset', $preset ); + } + + if ( isset( $_POST['background-position'] ) ) { + check_admin_referer( 'custom-background' ); + + $position = explode( ' ', $_POST['background-position'] ); + + if ( in_array( $position[0], array( 'left', 'center', 'right' ), true ) ) { + $position_x = $position[0]; + } else { + $position_x = 'left'; + } + + if ( in_array( $position[1], array( 'top', 'center', 'bottom' ), true ) ) { + $position_y = $position[1]; + } else { + $position_y = 'top'; + } + + set_theme_mod( 'background_position_x', $position_x ); + set_theme_mod( 'background_position_y', $position_y ); + } + + if ( isset( $_POST['background-size'] ) ) { + check_admin_referer( 'custom-background' ); + + if ( in_array( $_POST['background-size'], array( 'auto', 'contain', 'cover' ), true ) ) { + $size = $_POST['background-size']; + } else { + $size = 'auto'; + } + + set_theme_mod( 'background_size', $size ); + } + + if ( isset( $_POST['background-repeat'] ) ) { + check_admin_referer( 'custom-background' ); + + $repeat = $_POST['background-repeat']; + + if ( 'no-repeat' !== $repeat ) { + $repeat = 'repeat'; + } + + set_theme_mod( 'background_repeat', $repeat ); + } + + if ( isset( $_POST['background-attachment'] ) ) { + check_admin_referer( 'custom-background' ); + + $attachment = $_POST['background-attachment']; + + if ( 'fixed' !== $attachment ) { + $attachment = 'scroll'; + } + + set_theme_mod( 'background_attachment', $attachment ); + } + + if ( isset( $_POST['background-color'] ) ) { + check_admin_referer( 'custom-background' ); + $color = preg_replace( '/[^0-9a-fA-F]/', '', $_POST['background-color'] ); + if ( strlen( $color ) == 6 || strlen( $color ) == 3 ) { + set_theme_mod( 'background_color', $color ); + } else { + set_theme_mod( 'background_color', '' ); + } + } + + $this->updated = true; + } + + /** + * Display the custom background page. + * + * @since 3.0.0 + */ + public function admin_page() { + ?> +
        +

        + + +
        +

        + Customizer.' ), + admin_url( 'customize.php?autofocus[control]=background_image' ) + ); + ?> +

        +
        + + + updated ) ) { ?> +
        +

        + Visit your site to see how it looks.' ), home_url( '/' ) ); + ?> +

        +
        + + +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +
        + + + + + + array( + 'label' => __( 'Top Left' ), + 'icon' => 'dashicons dashicons-arrow-left-alt', + ), + 'center top' => array( + 'label' => __( 'Top' ), + 'icon' => 'dashicons dashicons-arrow-up-alt', + ), + 'right top' => array( + 'label' => __( 'Top Right' ), + 'icon' => 'dashicons dashicons-arrow-right-alt', + ), + ), + array( + 'left center' => array( + 'label' => __( 'Left' ), + 'icon' => 'dashicons dashicons-arrow-left-alt', + ), + 'center center' => array( + 'label' => __( 'Center' ), + 'icon' => 'background-position-center-icon', + ), + 'right center' => array( + 'label' => __( 'Right' ), + 'icon' => 'dashicons dashicons-arrow-right-alt', + ), + ), + array( + 'left bottom' => array( + 'label' => __( 'Bottom Left' ), + 'icon' => 'dashicons dashicons-arrow-left-alt', + ), + 'center bottom' => array( + 'label' => __( 'Bottom' ), + 'icon' => 'dashicons dashicons-arrow-down-alt', + ), + 'right bottom' => array( + 'label' => __( 'Bottom Right' ), + 'icon' => 'dashicons dashicons-arrow-right-alt', + ), + ), + ); + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + +
        + false ); + + $uploaded_file = $_FILES['import']; + $wp_filetype = wp_check_filetype_and_ext( $uploaded_file['tmp_name'], $uploaded_file['name'] ); + if ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) ) { + wp_die( __( 'The uploaded file is not a valid image. Please try again.' ) ); + } + + $file = wp_handle_upload( $uploaded_file, $overrides ); + + if ( isset( $file['error'] ) ) { + wp_die( $file['error'] ); + } + + $url = $file['url']; + $type = $file['type']; + $file = $file['file']; + $filename = wp_basename( $file ); + + // Construct the object array. + $object = array( + 'post_title' => $filename, + 'post_content' => $url, + 'post_mime_type' => $type, + 'guid' => $url, + 'context' => 'custom-background', + ); + + // Save the data. + $id = wp_insert_attachment( $object, $file ); + + // Add the metadata. + wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) ); + update_post_meta( $id, '_wp_attachment_is_custom_background', get_option( 'stylesheet' ) ); + + set_theme_mod( 'background_image', esc_url_raw( $url ) ); + + $thumbnail = wp_get_attachment_image_src( $id, 'thumbnail' ); + set_theme_mod( 'background_image_thumb', esc_url_raw( $thumbnail[0] ) ); + + /** This action is documented in wp-admin/includes/class-custom-image-header.php */ + do_action( 'wp_create_file_in_uploads', $file, $id ); // For replication. + $this->updated = true; + } + + /** + * Ajax handler for adding custom background context to an attachment. + * + * Triggers when the user adds a new background image from the + * Media Manager. + * + * @since 4.1.0 + */ + public function ajax_background_add() { + check_ajax_referer( 'background-add', 'nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_send_json_error(); + } + + $attachment_id = absint( $_POST['attachment_id'] ); + if ( $attachment_id < 1 ) { + wp_send_json_error(); + } + + update_post_meta( $attachment_id, '_wp_attachment_is_custom_background', get_stylesheet() ); + + wp_send_json_success(); + } + + /** + * @since 3.4.0 + * @deprecated 3.5.0 + * + * @param array $form_fields + * @return array $form_fields + */ + public function attachment_fields_to_edit( $form_fields ) { + return $form_fields; + } + + /** + * @since 3.4.0 + * @deprecated 3.5.0 + * + * @param array $tabs + * @return array $tabs + */ + public function filter_upload_tabs( $tabs ) { + return $tabs; + } + + /** + * @since 3.4.0 + * @deprecated 3.5.0 + */ + public function wp_set_background_image() { + if ( ! current_user_can( 'edit_theme_options' ) || ! isset( $_POST['attachment_id'] ) ) { + exit; + } + + $attachment_id = absint( $_POST['attachment_id'] ); + + $sizes = array_keys( + /** This filter is documented in wp-admin/includes/media.php */ + apply_filters( + 'image_size_names_choose', + array( + 'thumbnail' => __( 'Thumbnail' ), + 'medium' => __( 'Medium' ), + 'large' => __( 'Large' ), + 'full' => __( 'Full Size' ), + ) + ) + ); + + $size = 'thumbnail'; + if ( in_array( $_POST['size'], $sizes ) ) { + $size = esc_attr( $_POST['size'] ); + } + + update_post_meta( $attachment_id, '_wp_attachment_is_custom_background', get_option( 'stylesheet' ) ); + + $url = wp_get_attachment_image_src( $attachment_id, $size ); + $thumbnail = wp_get_attachment_image_src( $attachment_id, 'thumbnail' ); + set_theme_mod( 'background_image', esc_url_raw( $url[0] ) ); + set_theme_mod( 'background_image_thumb', esc_url_raw( $thumbnail[0] ) ); + exit; + } +} diff --git a/wp-admin/includes/class-custom-image-header.php b/wp-admin/includes/class-custom-image-header.php new file mode 100644 index 0000000..8f005b1 --- /dev/null +++ b/wp-admin/includes/class-custom-image-header.php @@ -0,0 +1,1515 @@ +admin_header_callback = $admin_header_callback; + $this->admin_image_div_callback = $admin_image_div_callback; + + add_action( 'admin_menu', array( $this, 'init' ) ); + + add_action( 'customize_save_after', array( $this, 'customize_set_last_used' ) ); + add_action( 'wp_ajax_custom-header-crop', array( $this, 'ajax_header_crop' ) ); + add_action( 'wp_ajax_custom-header-add', array( $this, 'ajax_header_add' ) ); + add_action( 'wp_ajax_custom-header-remove', array( $this, 'ajax_header_remove' ) ); + } + + /** + * Set up the hooks for the Custom Header admin page. + * + * @since 2.1.0 + */ + public function init() { + $page = add_theme_page( __( 'Header' ), __( 'Header' ), 'edit_theme_options', 'custom-header', array( $this, 'admin_page' ) ); + if ( ! $page ) { + return; + } + + add_action( "admin_print_scripts-{$page}", array( $this, 'js_includes' ) ); + add_action( "admin_print_styles-{$page}", array( $this, 'css_includes' ) ); + add_action( "admin_head-{$page}", array( $this, 'help' ) ); + add_action( "admin_head-{$page}", array( $this, 'take_action' ), 50 ); + add_action( "admin_head-{$page}", array( $this, 'js' ), 50 ); + if ( $this->admin_header_callback ) { + add_action( "admin_head-{$page}", $this->admin_header_callback, 51 ); + } + } + + /** + * Adds contextual help. + * + * @since 3.0.0 + */ + public function help() { + get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

        ' . __( 'This screen is used to customize the header section of your theme.' ) . '

        ' . + '

        ' . __( 'You can choose from the theme’s default header images, or use one of your own. You can also customize how your Site Title and Tagline are displayed.' ) . '

        ', + ) + ); + + get_current_screen()->add_help_tab( + array( + 'id' => 'set-header-image', + 'title' => __( 'Header Image' ), + 'content' => + '

        ' . __( 'You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately. Alternatively, you can use an image that has already been uploaded to your Media Library by clicking the “Choose Image” button.' ) . '

        ' . + '

        ' . __( 'Some themes come with additional header images bundled. If you see multiple images displayed, select the one you’d like and click the “Save Changes” button.' ) . '

        ' . + '

        ' . __( 'If your theme has more than one default header image, or you have uploaded more than one custom header image, you have the option of having WordPress display a randomly different image on each page of your site. Click the “Random” radio button next to the Uploaded Images or Default Images section to enable this feature.' ) . '

        ' . + '

        ' . __( 'If you don’t want a header image to be displayed on your site at all, click the “Remove Header Image” button at the bottom of the Header Image section of this page. If you want to re-enable the header image later, you just have to select one of the other image options and click “Save Changes”.' ) . '

        ', + ) + ); + + get_current_screen()->add_help_tab( + array( + 'id' => 'set-header-text', + 'title' => __( 'Header Text' ), + 'content' => + '

        ' . sprintf( + /* translators: %s: URL to General Settings screen. */ + __( 'For most themes, the header text is your Site Title and Tagline, as defined in the General Settings section.' ), + admin_url( 'options-general.php' ) + ) . + '

        ' . + '

        ' . __( 'In the Header Text section of this page, you can choose whether to display this text or hide it. You can also choose a color for the text by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a color using the color picker.' ) . '

        ' . + '

        ' . __( 'Don’t forget to click “Save Changes” when you’re done!' ) . '

        ', + ) + ); + + get_current_screen()->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Custom Header' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' + ); + } + + /** + * Get the current step. + * + * @since 2.6.0 + * + * @return int Current step + */ + public function step() { + if ( ! isset( $_GET['step'] ) ) { + return 1; + } + + $step = (int) $_GET['step']; + if ( $step < 1 || 3 < $step || + ( 2 == $step && ! wp_verify_nonce( $_REQUEST['_wpnonce-custom-header-upload'], 'custom-header-upload' ) ) || + ( 3 == $step && ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'custom-header-crop-image' ) ) + ) { + return 1; + } + + return $step; + } + + /** + * Set up the enqueue for the JavaScript files. + * + * @since 2.1.0 + */ + public function js_includes() { + $step = $this->step(); + + if ( ( 1 == $step || 3 == $step ) ) { + wp_enqueue_media(); + wp_enqueue_script( 'custom-header' ); + if ( current_theme_supports( 'custom-header', 'header-text' ) ) { + wp_enqueue_script( 'wp-color-picker' ); + } + } elseif ( 2 == $step ) { + wp_enqueue_script( 'imgareaselect' ); + } + } + + /** + * Set up the enqueue for the CSS files + * + * @since 2.7.0 + */ + public function css_includes() { + $step = $this->step(); + + if ( ( 1 == $step || 3 == $step ) && current_theme_supports( 'custom-header', 'header-text' ) ) { + wp_enqueue_style( 'wp-color-picker' ); + } elseif ( 2 == $step ) { + wp_enqueue_style( 'imgareaselect' ); + } + } + + /** + * Execute custom header modification. + * + * @since 2.6.0 + */ + public function take_action() { + if ( ! current_user_can( 'edit_theme_options' ) ) { + return; + } + + if ( empty( $_POST ) ) { + return; + } + + $this->updated = true; + + if ( isset( $_POST['resetheader'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + $this->reset_header_image(); + return; + } + + if ( isset( $_POST['removeheader'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + $this->remove_header_image(); + return; + } + + if ( isset( $_POST['text-color'] ) && ! isset( $_POST['display-header-text'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + set_theme_mod( 'header_textcolor', 'blank' ); + } elseif ( isset( $_POST['text-color'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + $_POST['text-color'] = str_replace( '#', '', $_POST['text-color'] ); + $color = preg_replace( '/[^0-9a-fA-F]/', '', $_POST['text-color'] ); + if ( strlen( $color ) == 6 || strlen( $color ) == 3 ) { + set_theme_mod( 'header_textcolor', $color ); + } elseif ( ! $color ) { + set_theme_mod( 'header_textcolor', 'blank' ); + } + } + + if ( isset( $_POST['default-header'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + $this->set_header_image( $_POST['default-header'] ); + return; + } + } + + /** + * Process the default headers + * + * @since 3.0.0 + * + * @global array $_wp_default_headers + */ + public function process_default_headers() { + global $_wp_default_headers; + + if ( ! isset( $_wp_default_headers ) ) { + return; + } + + if ( ! empty( $this->default_headers ) ) { + return; + } + + $this->default_headers = $_wp_default_headers; + $template_directory_uri = get_template_directory_uri(); + $stylesheet_directory_uri = get_stylesheet_directory_uri(); + foreach ( array_keys( $this->default_headers ) as $header ) { + $this->default_headers[ $header ]['url'] = sprintf( $this->default_headers[ $header ]['url'], $template_directory_uri, $stylesheet_directory_uri ); + $this->default_headers[ $header ]['thumbnail_url'] = sprintf( $this->default_headers[ $header ]['thumbnail_url'], $template_directory_uri, $stylesheet_directory_uri ); + } + } + + /** + * Display UI for selecting one of several default headers. + * + * Show the random image option if this theme has multiple header images. + * Random image option is on by default if no header has been set. + * + * @since 3.0.0 + * + * @param string $type The header type. One of 'default' (for the Uploaded Images control) + * or 'uploaded' (for the Uploaded Images control). + */ + public function show_header_selector( $type = 'default' ) { + if ( 'default' == $type ) { + $headers = $this->default_headers; + } else { + $headers = get_uploaded_header_images(); + $type = 'uploaded'; + } + + if ( 1 < count( $headers ) ) { + echo '
        '; + echo ''; + echo '
        '; + } + + echo '
        '; + foreach ( $headers as $header_key => $header ) { + $header_thumbnail = $header['thumbnail_url']; + $header_url = $header['url']; + $header_alt_text = empty( $header['alt_text'] ) ? '' : $header['alt_text']; + echo '
        '; + echo ''; + echo '
        '; + } + echo '
        '; + } + + /** + * Execute JavaScript depending on step. + * + * @since 2.1.0 + */ + public function js() { + $step = $this->step(); + if ( ( 1 == $step || 3 == $step ) && current_theme_supports( 'custom-header', 'header-text' ) ) { + $this->js_1(); + } elseif ( 2 == $step ) { + $this->js_2(); + } + } + + /** + * Display JavaScript based on Step 1 and 3. + * + * @since 2.6.0 + */ + public function js_1() { + $default_color = ''; + if ( current_theme_supports( 'custom-header', 'default-text-color' ) ) { + $default_color = get_theme_support( 'custom-header', 'default-text-color' ); + if ( $default_color && false === strpos( $default_color, '#' ) ) { + $default_color = '#' . $default_color; + } + } + ?> + + + + process_default_headers(); + ?> + +
        +

        + + +
        +

        + Customizer.' ), + admin_url( 'customize.php?autofocus[control]=header_image' ) + ); + ?> +

        +
        + + + updated ) ) { ?> +
        +

        + Visit your site to see how it looks.' ), home_url( '/' ) ); + ?> +

        +
        + + +

        + + + + + + + + + + + + + + + + + + + + +
        + + + + + + + + + default_headers ) ) : + ?> + + + + + + + + + + + + + + + + + + + + +

        + + + + + + + + + + + + + + + + + +
        +
        + + ' . __( 'Something went wrong.' ) . '' . + '

        ' . __( 'The current theme does not support uploading a custom header image.' ) . '

        ', + 403 + ); + } + + if ( empty( $_POST ) && isset( $_GET['file'] ) ) { + $attachment_id = absint( $_GET['file'] ); + $file = get_attached_file( $attachment_id, true ); + $url = wp_get_attachment_image_src( $attachment_id, 'full' ); + $url = $url[0]; + } elseif ( isset( $_POST ) ) { + $data = $this->step_2_manage_upload(); + $attachment_id = $data['attachment_id']; + $file = $data['file']; + $url = $data['url']; + } + + if ( file_exists( $file ) ) { + list( $width, $height, $type, $attr ) = @getimagesize( $file ); + } else { + $data = wp_get_attachment_metadata( $attachment_id ); + $height = isset( $data['height'] ) ? $data['height'] : 0; + $width = isset( $data['width'] ) ? $data['width'] : 0; + unset( $data ); + } + + $max_width = 0; + // For flex, limit size of image displayed to 1500px unless theme says otherwise. + if ( current_theme_supports( 'custom-header', 'flex-width' ) ) { + $max_width = 1500; + } + + if ( current_theme_supports( 'custom-header', 'max-width' ) ) { + $max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) ); + } + $max_width = max( $max_width, get_theme_support( 'custom-header', 'width' ) ); + + // If flexible height isn't supported and the image is the exact right size. + if ( ! current_theme_supports( 'custom-header', 'flex-height' ) && ! current_theme_supports( 'custom-header', 'flex-width' ) + && get_theme_support( 'custom-header', 'width' ) == $width && get_theme_support( 'custom-header', 'height' ) == $height ) { + // Add the metadata. + if ( file_exists( $file ) ) { + wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) ); + } + + $this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) ); + + /** + * Fires after the header image is set or an error is returned. + * + * @since 2.1.0 + * + * @param string $file Path to the file. + * @param int $attachment_id Attachment ID. + */ + do_action( 'wp_create_file_in_uploads', $file, $attachment_id ); // For replication. + + return $this->finished(); + } elseif ( $width > $max_width ) { + $oitar = $width / $max_width; + $image = wp_crop_image( $attachment_id, 0, 0, $width, $height, $max_width, $height / $oitar, false, str_replace( wp_basename( $file ), 'midsize-' . wp_basename( $file ), $file ) ); + if ( ! $image || is_wp_error( $image ) ) { + wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); + } + + /** This filter is documented in wp-admin/includes/class-custom-image-header.php */ + $image = apply_filters( 'wp_create_file_in_uploads', $image, $attachment_id ); // For replication. + + $url = str_replace( wp_basename( $url ), wp_basename( $image ), $url ); + $width = $width / $oitar; + $height = $height / $oitar; + } else { + $oitar = 1; + } + ?> + +
        +

        + +
        +

        +

        + +
        + +
        + + + + + + + + + + + + +

        + + +

        +
        +
        + false ); + + $uploaded_file = $_FILES['import']; + $wp_filetype = wp_check_filetype_and_ext( $uploaded_file['tmp_name'], $uploaded_file['name'] ); + if ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) ) { + wp_die( __( 'The uploaded file is not a valid image. Please try again.' ) ); + } + + $file = wp_handle_upload( $uploaded_file, $overrides ); + + if ( isset( $file['error'] ) ) { + wp_die( $file['error'], __( 'Image Upload Error' ) ); + } + + $url = $file['url']; + $type = $file['type']; + $file = $file['file']; + $filename = wp_basename( $file ); + + // Construct the object array. + $object = array( + 'post_title' => $filename, + 'post_content' => $url, + 'post_mime_type' => $type, + 'guid' => $url, + 'context' => 'custom-header', + ); + + // Save the data. + $attachment_id = wp_insert_attachment( $object, $file ); + return compact( 'attachment_id', 'file', 'filename', 'url', 'type' ); + } + + /** + * Display third step of custom header image page. + * + * @since 2.1.0 + * @since 4.4.0 Switched to using wp_get_attachment_url() instead of the guid + * for retrieving the header image URL. + */ + public function step_3() { + check_admin_referer( 'custom-header-crop-image' ); + + if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) { + wp_die( + '

        ' . __( 'Something went wrong.' ) . '

        ' . + '

        ' . __( 'The current theme does not support uploading a custom header image.' ) . '

        ', + 403 + ); + } + + if ( ! empty( $_POST['skip-cropping'] ) && ! ( current_theme_supports( 'custom-header', 'flex-height' ) || current_theme_supports( 'custom-header', 'flex-width' ) ) ) { + wp_die( + '

        ' . __( 'Something went wrong.' ) . '

        ' . + '

        ' . __( 'The current theme does not support a flexible sized header image.' ) . '

        ', + 403 + ); + } + + if ( $_POST['oitar'] > 1 ) { + $_POST['x1'] = $_POST['x1'] * $_POST['oitar']; + $_POST['y1'] = $_POST['y1'] * $_POST['oitar']; + $_POST['width'] = $_POST['width'] * $_POST['oitar']; + $_POST['height'] = $_POST['height'] * $_POST['oitar']; + } + + $attachment_id = absint( $_POST['attachment_id'] ); + $original = get_attached_file( $attachment_id ); + + $dimensions = $this->get_header_dimensions( + array( + 'height' => $_POST['height'], + 'width' => $_POST['width'], + ) + ); + $height = $dimensions['dst_height']; + $width = $dimensions['dst_width']; + + if ( empty( $_POST['skip-cropping'] ) ) { + $cropped = wp_crop_image( $attachment_id, (int) $_POST['x1'], (int) $_POST['y1'], (int) $_POST['width'], (int) $_POST['height'], $width, $height ); + } elseif ( ! empty( $_POST['create-new-attachment'] ) ) { + $cropped = _copy_image_file( $attachment_id ); + } else { + $cropped = get_attached_file( $attachment_id ); + } + + if ( ! $cropped || is_wp_error( $cropped ) ) { + wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); + } + + /** This filter is documented in wp-admin/includes/class-custom-image-header.php */ + $cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication. + + $object = $this->create_attachment_object( $cropped, $attachment_id ); + + if ( ! empty( $_POST['create-new-attachment'] ) ) { + unset( $object['ID'] ); + } + + // Update the attachment. + $attachment_id = $this->insert_attachment( $object, $cropped ); + + $url = wp_get_attachment_url( $attachment_id ); + $this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) ); + + // Cleanup. + $medium = str_replace( wp_basename( $original ), 'midsize-' . wp_basename( $original ), $original ); + if ( file_exists( $medium ) ) { + wp_delete_file( $medium ); + } + + if ( empty( $_POST['create-new-attachment'] ) && empty( $_POST['skip-cropping'] ) ) { + wp_delete_file( $original ); + } + + return $this->finished(); + } + + /** + * Display last step of custom header image page. + * + * @since 2.1.0 + */ + public function finished() { + $this->updated = true; + $this->step_1(); + } + + /** + * Display the page based on the current step. + * + * @since 2.1.0 + */ + public function admin_page() { + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( __( 'Sorry, you are not allowed to customize headers.' ) ); + } + $step = $this->step(); + if ( 2 == $step ) { + $this->step_2(); + } elseif ( 3 == $step ) { + $this->step_3(); + } else { + $this->step_1(); + } + } + + /** + * Unused since 3.5.0. + * + * @since 3.4.0 + * + * @param array $form_fields + * @return array $form_fields + */ + public function attachment_fields_to_edit( $form_fields ) { + return $form_fields; + } + + /** + * Unused since 3.5.0. + * + * @since 3.4.0 + * + * @param array $tabs + * @return array $tabs + */ + public function filter_upload_tabs( $tabs ) { + return $tabs; + } + + /** + * Choose a header image, selected from existing uploaded and default headers, + * or provide an array of uploaded header data (either new, or from media library). + * + * @since 3.4.0 + * + * @param mixed $choice Which header image to select. Allows for values of 'random-default-image', + * for randomly cycling among the default images; 'random-uploaded-image', for randomly cycling + * among the uploaded images; the key of a default image registered for that theme; and + * the key of an image uploaded for that theme (the attachment ID of the image). + * Or an array of arguments: attachment_id, url, width, height. All are required. + */ + final public function set_header_image( $choice ) { + if ( is_array( $choice ) || is_object( $choice ) ) { + $choice = (array) $choice; + if ( ! isset( $choice['attachment_id'] ) || ! isset( $choice['url'] ) ) { + return; + } + + $choice['url'] = esc_url_raw( $choice['url'] ); + + $header_image_data = (object) array( + 'attachment_id' => $choice['attachment_id'], + 'url' => $choice['url'], + 'thumbnail_url' => $choice['url'], + 'height' => $choice['height'], + 'width' => $choice['width'], + ); + + update_post_meta( $choice['attachment_id'], '_wp_attachment_is_custom_header', get_stylesheet() ); + set_theme_mod( 'header_image', $choice['url'] ); + set_theme_mod( 'header_image_data', $header_image_data ); + return; + } + + if ( in_array( $choice, array( 'remove-header', 'random-default-image', 'random-uploaded-image' ) ) ) { + set_theme_mod( 'header_image', $choice ); + remove_theme_mod( 'header_image_data' ); + return; + } + + $uploaded = get_uploaded_header_images(); + if ( $uploaded && isset( $uploaded[ $choice ] ) ) { + $header_image_data = $uploaded[ $choice ]; + + } else { + $this->process_default_headers(); + if ( isset( $this->default_headers[ $choice ] ) ) { + $header_image_data = $this->default_headers[ $choice ]; + } else { + return; + } + } + + set_theme_mod( 'header_image', esc_url_raw( $header_image_data['url'] ) ); + set_theme_mod( 'header_image_data', $header_image_data ); + } + + /** + * Remove a header image. + * + * @since 3.4.0 + */ + final public function remove_header_image() { + $this->set_header_image( 'remove-header' ); + } + + /** + * Reset a header image to the default image for the theme. + * + * This method does not do anything if the theme does not have a default header image. + * + * @since 3.4.0 + */ + final public function reset_header_image() { + $this->process_default_headers(); + $default = get_theme_support( 'custom-header', 'default-image' ); + + if ( ! $default ) { + $this->remove_header_image(); + return; + } + $default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() ); + + $default_data = array(); + foreach ( $this->default_headers as $header => $details ) { + if ( $details['url'] == $default ) { + $default_data = $details; + break; + } + } + + set_theme_mod( 'header_image', $default ); + set_theme_mod( 'header_image_data', (object) $default_data ); + } + + /** + * Calculate width and height based on what the currently selected theme supports. + * + * @since 3.9.0 + * + * @param array $dimensions + * @return array dst_height and dst_width of header image. + */ + final public function get_header_dimensions( $dimensions ) { + $max_width = 0; + $width = absint( $dimensions['width'] ); + $height = absint( $dimensions['height'] ); + $theme_height = get_theme_support( 'custom-header', 'height' ); + $theme_width = get_theme_support( 'custom-header', 'width' ); + $has_flex_width = current_theme_supports( 'custom-header', 'flex-width' ); + $has_flex_height = current_theme_supports( 'custom-header', 'flex-height' ); + $has_max_width = current_theme_supports( 'custom-header', 'max-width' ); + $dst = array( + 'dst_height' => null, + 'dst_width' => null, + ); + + // For flex, limit size of image displayed to 1500px unless theme says otherwise. + if ( $has_flex_width ) { + $max_width = 1500; + } + + if ( $has_max_width ) { + $max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) ); + } + $max_width = max( $max_width, $theme_width ); + + if ( $has_flex_height && ( ! $has_flex_width || $width > $max_width ) ) { + $dst['dst_height'] = absint( $height * ( $max_width / $width ) ); + } elseif ( $has_flex_height && $has_flex_width ) { + $dst['dst_height'] = $height; + } else { + $dst['dst_height'] = $theme_height; + } + + if ( $has_flex_width && ( ! $has_flex_height || $width > $max_width ) ) { + $dst['dst_width'] = absint( $width * ( $max_width / $width ) ); + } elseif ( $has_flex_width && $has_flex_height ) { + $dst['dst_width'] = $width; + } else { + $dst['dst_width'] = $theme_width; + } + + return $dst; + } + + /** + * Create an attachment 'object'. + * + * @since 3.9.0 + * + * @param string $cropped Cropped image URL. + * @param int $parent_attachment_id Attachment ID of parent image. + * @return array Attachment object. + */ + final public function create_attachment_object( $cropped, $parent_attachment_id ) { + $parent = get_post( $parent_attachment_id ); + $parent_url = wp_get_attachment_url( $parent->ID ); + $url = str_replace( wp_basename( $parent_url ), wp_basename( $cropped ), $parent_url ); + + $size = @getimagesize( $cropped ); + $image_type = ( $size ) ? $size['mime'] : 'image/jpeg'; + + $object = array( + 'ID' => $parent_attachment_id, + 'post_title' => wp_basename( $cropped ), + 'post_mime_type' => $image_type, + 'guid' => $url, + 'context' => 'custom-header', + 'post_parent' => $parent_attachment_id, + ); + + return $object; + } + + /** + * Insert an attachment and its metadata. + * + * @since 3.9.0 + * + * @param array $object Attachment object. + * @param string $cropped Cropped image URL. + * @return int Attachment ID. + */ + final public function insert_attachment( $object, $cropped ) { + $parent_id = isset( $object['post_parent'] ) ? $object['post_parent'] : null; + unset( $object['post_parent'] ); + + $attachment_id = wp_insert_attachment( $object, $cropped ); + $metadata = wp_generate_attachment_metadata( $attachment_id, $cropped ); + + // If this is a crop, save the original attachment ID as metadata. + if ( $parent_id ) { + $metadata['attachment_parent'] = $parent_id; + } + + /** + * Filters the header image attachment metadata. + * + * @since 3.9.0 + * + * @see wp_generate_attachment_metadata() + * + * @param array $metadata Attachment metadata. + */ + $metadata = apply_filters( 'wp_header_image_attachment_metadata', $metadata ); + + wp_update_attachment_metadata( $attachment_id, $metadata ); + + return $attachment_id; + } + + /** + * Gets attachment uploaded by Media Manager, crops it, then saves it as a + * new object. Returns JSON-encoded object details. + * + * @since 3.9.0 + */ + public function ajax_header_crop() { + check_ajax_referer( 'image_editor-' . $_POST['id'], 'nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_send_json_error(); + } + + if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) { + wp_send_json_error(); + } + + $crop_details = $_POST['cropDetails']; + + $dimensions = $this->get_header_dimensions( + array( + 'height' => $crop_details['height'], + 'width' => $crop_details['width'], + ) + ); + + $attachment_id = absint( $_POST['id'] ); + + $cropped = wp_crop_image( + $attachment_id, + (int) $crop_details['x1'], + (int) $crop_details['y1'], + (int) $crop_details['width'], + (int) $crop_details['height'], + (int) $dimensions['dst_width'], + (int) $dimensions['dst_height'] + ); + + if ( ! $cropped || is_wp_error( $cropped ) ) { + wp_send_json_error( array( 'message' => __( 'Image could not be processed. Please go back and try again.' ) ) ); + } + + /** This filter is documented in wp-admin/includes/class-custom-image-header.php */ + $cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication. + + $object = $this->create_attachment_object( $cropped, $attachment_id ); + + $previous = $this->get_previous_crop( $object ); + + if ( $previous ) { + $object['ID'] = $previous; + } else { + unset( $object['ID'] ); + } + + $new_attachment_id = $this->insert_attachment( $object, $cropped ); + + $object['attachment_id'] = $new_attachment_id; + $object['url'] = wp_get_attachment_url( $new_attachment_id ); + + $object['width'] = $dimensions['dst_width']; + $object['height'] = $dimensions['dst_height']; + + wp_send_json_success( $object ); + } + + /** + * Given an attachment ID for a header image, updates its "last used" + * timestamp to now. + * + * Triggered when the user tries adds a new header image from the + * Media Manager, even if s/he doesn't save that change. + * + * @since 3.9.0 + */ + public function ajax_header_add() { + check_ajax_referer( 'header-add', 'nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_send_json_error(); + } + + $attachment_id = absint( $_POST['attachment_id'] ); + if ( $attachment_id < 1 ) { + wp_send_json_error(); + } + + $key = '_wp_attachment_custom_header_last_used_' . get_stylesheet(); + update_post_meta( $attachment_id, $key, time() ); + update_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() ); + + wp_send_json_success(); + } + + /** + * Given an attachment ID for a header image, unsets it as a user-uploaded + * header image for the current theme. + * + * Triggered when the user clicks the overlay "X" button next to each image + * choice in the Customizer's Header tool. + * + * @since 3.9.0 + */ + public function ajax_header_remove() { + check_ajax_referer( 'header-remove', 'nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_send_json_error(); + } + + $attachment_id = absint( $_POST['attachment_id'] ); + if ( $attachment_id < 1 ) { + wp_send_json_error(); + } + + $key = '_wp_attachment_custom_header_last_used_' . get_stylesheet(); + delete_post_meta( $attachment_id, $key ); + delete_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() ); + + wp_send_json_success(); + } + + /** + * Updates the last-used postmeta on a header image attachment after saving a new header image via the Customizer. + * + * @since 3.9.0 + * + * @param WP_Customize_Manager $wp_customize Customize manager. + */ + public function customize_set_last_used( $wp_customize ) { + + $header_image_data_setting = $wp_customize->get_setting( 'header_image_data' ); + if ( ! $header_image_data_setting ) { + return; + } + $data = $header_image_data_setting->post_value(); + + if ( ! isset( $data['attachment_id'] ) ) { + return; + } + + $attachment_id = $data['attachment_id']; + $key = '_wp_attachment_custom_header_last_used_' . get_stylesheet(); + update_post_meta( $attachment_id, $key, time() ); + } + + /** + * Gets the details of default header images if defined. + * + * @since 3.9.0 + * + * @return array Default header images. + */ + public function get_default_header_images() { + $this->process_default_headers(); + + // Get the default image if there is one. + $default = get_theme_support( 'custom-header', 'default-image' ); + + if ( ! $default ) { // If not, easy peasy. + return $this->default_headers; + } + + $default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() ); + $already_has_default = false; + + foreach ( $this->default_headers as $k => $h ) { + if ( $h['url'] === $default ) { + $already_has_default = true; + break; + } + } + + if ( $already_has_default ) { + return $this->default_headers; + } + + // If the one true image isn't included in the default set, prepend it. + $header_images = array(); + $header_images['default'] = array( + 'url' => $default, + 'thumbnail_url' => $default, + 'description' => 'Default', + ); + + // The rest of the set comes after. + return array_merge( $header_images, $this->default_headers ); + } + + /** + * Gets the previously uploaded header images. + * + * @since 3.9.0 + * + * @return array Uploaded header images. + */ + public function get_uploaded_header_images() { + $header_images = get_uploaded_header_images(); + $timestamp_key = '_wp_attachment_custom_header_last_used_' . get_stylesheet(); + $alt_text_key = '_wp_attachment_image_alt'; + + foreach ( $header_images as &$header_image ) { + $header_meta = get_post_meta( $header_image['attachment_id'] ); + $header_image['timestamp'] = isset( $header_meta[ $timestamp_key ] ) ? $header_meta[ $timestamp_key ] : ''; + $header_image['alt_text'] = isset( $header_meta[ $alt_text_key ] ) ? $header_meta[ $alt_text_key ] : ''; + } + + return $header_images; + } + + /** + * Get the ID of a previous crop from the same base image. + * + * @since 4.9.0 + * + * @param array $object A crop attachment object. + * @return int|false An attachment ID if one exists. False if none. + */ + public function get_previous_crop( $object ) { + $header_images = $this->get_uploaded_header_images(); + + // Bail early if there are no header images. + if ( empty( $header_images ) ) { + return false; + } + + $previous = false; + + foreach ( $header_images as $image ) { + if ( $image['attachment_parent'] === $object['post_parent'] ) { + $previous = $image['attachment_id']; + break; + } + } + + return $previous; + } +} diff --git a/wp-admin/includes/class-file-upload-upgrader.php b/wp-admin/includes/class-file-upload-upgrader.php new file mode 100644 index 0000000..3bdae33 --- /dev/null +++ b/wp-admin/includes/class-file-upload-upgrader.php @@ -0,0 +1,133 @@ + false, + 'test_type' => false, + ); + $file = wp_handle_upload( $_FILES[ $form ], $overrides ); + + if ( isset( $file['error'] ) ) { + wp_die( $file['error'] ); + } + + $this->filename = $_FILES[ $form ]['name']; + $this->package = $file['file']; + + // Construct the object array. + $object = array( + 'post_title' => $this->filename, + 'post_content' => $file['url'], + 'post_mime_type' => $file['type'], + 'guid' => $file['url'], + 'context' => 'upgrader', + 'post_status' => 'private', + ); + + // Save the data. + $this->id = wp_insert_attachment( $object, $file['file'] ); + + // Schedule a cleanup for 2 hours from now in case of failed installation. + wp_schedule_single_event( time() + 2 * HOUR_IN_SECONDS, 'upgrader_scheduled_cleanup', array( $this->id ) ); + + } elseif ( is_numeric( $_GET[ $urlholder ] ) ) { + // Numeric Package = previously uploaded file, see above. + $this->id = (int) $_GET[ $urlholder ]; + $attachment = get_post( $this->id ); + if ( empty( $attachment ) ) { + wp_die( __( 'Please select a file' ) ); + } + + $this->filename = $attachment->post_title; + $this->package = get_attached_file( $attachment->ID ); + } else { + // Else, It's set to something, Back compat for plugins using the old (pre-3.3) File_Uploader handler. + $uploads = wp_upload_dir(); + if ( ! ( $uploads && false === $uploads['error'] ) ) { + wp_die( $uploads['error'] ); + } + + $this->filename = sanitize_file_name( $_GET[ $urlholder ] ); + $this->package = $uploads['basedir'] . '/' . $this->filename; + + if ( 0 !== strpos( realpath( $this->package ), realpath( $uploads['basedir'] ) ) ) { + wp_die( __( 'Please select a file' ) ); + } + } + } + + /** + * Delete the attachment/uploaded file. + * + * @since 3.2.2 + * + * @return bool Whether the cleanup was successful. + */ + public function cleanup() { + if ( $this->id ) { + wp_delete_attachment( $this->id ); + + } elseif ( file_exists( $this->package ) ) { + return @unlink( $this->package ); + } + + return true; + } +} diff --git a/wp-admin/includes/class-ftp-pure.php b/wp-admin/includes/class-ftp-pure.php new file mode 100644 index 0000000..4c51876 --- /dev/null +++ b/wp-admin/includes/class-ftp-pure.php @@ -0,0 +1,186 @@ + +// +// + + function _settimeout($sock) { + if(!@stream_set_timeout($sock, $this->_timeout)) { + $this->PushError('_settimeout','socket set send timeout'); + $this->_quit(); + return FALSE; + } + return TRUE; + } + + function _connect($host, $port) { + $this->SendMSG("Creating socket"); + $sock = @fsockopen($host, $port, $errno, $errstr, $this->_timeout); + if (!$sock) { + $this->PushError('_connect','socket connect failed', $errstr." (".$errno.")"); + return FALSE; + } + $this->_connected=true; + return $sock; + } + + function _readmsg($fnction="_readmsg"){ + if(!$this->_connected) { + $this->PushError($fnction, 'Connect first'); + return FALSE; + } + $result=true; + $this->_message=""; + $this->_code=0; + $go=true; + do { + $tmp=@fgets($this->_ftp_control_sock, 512); + if($tmp===false) { + $go=$result=false; + $this->PushError($fnction,'Read failed'); + } else { + $this->_message.=$tmp; + if(preg_match("/^([0-9]{3})(-(.*[".CRLF."]{1,2})+\\1)? [^".CRLF."]+[".CRLF."]{1,2}$/", $this->_message, $regs)) $go=false; + } + } while($go); + if($this->LocalEcho) echo "GET < ".rtrim($this->_message, CRLF).CRLF; + $this->_code=(int)$regs[1]; + return $result; + } + + function _exec($cmd, $fnction="_exec") { + if(!$this->_ready) { + $this->PushError($fnction,'Connect first'); + return FALSE; + } + if($this->LocalEcho) echo "PUT > ",$cmd,CRLF; + $status=@fputs($this->_ftp_control_sock, $cmd.CRLF); + if($status===false) { + $this->PushError($fnction,'socket write failed'); + return FALSE; + } + $this->_lastaction=time(); + if(!$this->_readmsg($fnction)) return FALSE; + return TRUE; + } + + function _data_prepare($mode=FTP_ASCII) { + if(!$this->_settype($mode)) return FALSE; + if($this->_passive) { + if(!$this->_exec("PASV", "pasv")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $ip_port = explode(",", preg_replace("/^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*$/s", "\\1", $this->_message)); + $this->_datahost=$ip_port[0].".".$ip_port[1].".".$ip_port[2].".".$ip_port[3]; + $this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]); + $this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport); + $this->_ftp_data_sock=@fsockopen($this->_datahost, $this->_dataport, $errno, $errstr, $this->_timeout); + if(!$this->_ftp_data_sock) { + $this->PushError("_data_prepare","fsockopen fails", $errstr." (".$errno.")"); + $this->_data_close(); + return FALSE; + } + else $this->_ftp_data_sock; + } else { + $this->SendMSG("Only passive connections available!"); + return FALSE; + } + return TRUE; + } + + function _data_read($mode=FTP_ASCII, $fp=NULL) { + if(is_resource($fp)) $out=0; + else $out=""; + if(!$this->_passive) { + $this->SendMSG("Only passive connections available!"); + return FALSE; + } + while (!feof($this->_ftp_data_sock)) { + $block=fread($this->_ftp_data_sock, $this->_ftp_buff_size); + if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block); + if(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block)); + else $out.=$block; + } + return $out; + } + + function _data_write($mode=FTP_ASCII, $fp=NULL) { + if(is_resource($fp)) $out=0; + else $out=""; + if(!$this->_passive) { + $this->SendMSG("Only passive connections available!"); + return FALSE; + } + if(is_resource($fp)) { + while(!feof($fp)) { + $block=fread($fp, $this->_ftp_buff_size); + if(!$this->_data_write_block($mode, $block)) return false; + } + } elseif(!$this->_data_write_block($mode, $fp)) return false; + return TRUE; + } + + function _data_write_block($mode, $block) { + if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_remote], $block); + do { + if(($t=@fwrite($this->_ftp_data_sock, $block))===FALSE) { + $this->PushError("_data_write","Can't write to socket"); + return FALSE; + } + $block=substr($block, $t); + } while(!empty($block)); + return true; + } + + function _data_close() { + @fclose($this->_ftp_data_sock); + $this->SendMSG("Disconnected data from remote host"); + return TRUE; + } + + function _quit($force=FALSE) { + if($this->_connected or $force) { + @fclose($this->_ftp_control_sock); + $this->_connected=false; + $this->SendMSG("Socket closed"); + } + } +} + +?> diff --git a/wp-admin/includes/class-ftp-sockets.php b/wp-admin/includes/class-ftp-sockets.php new file mode 100644 index 0000000..6d802f5 --- /dev/null +++ b/wp-admin/includes/class-ftp-sockets.php @@ -0,0 +1,246 @@ + +// +// + + function _settimeout($sock) { + if(!@socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$this->_timeout, "usec"=>0))) { + $this->PushError('_connect','socket set receive timeout',socket_strerror(socket_last_error($sock))); + @socket_close($sock); + return FALSE; + } + if(!@socket_set_option($sock, SOL_SOCKET , SO_SNDTIMEO, array("sec"=>$this->_timeout, "usec"=>0))) { + $this->PushError('_connect','socket set send timeout',socket_strerror(socket_last_error($sock))); + @socket_close($sock); + return FALSE; + } + return true; + } + + function _connect($host, $port) { + $this->SendMSG("Creating socket"); + if(!($sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) { + $this->PushError('_connect','socket create failed',socket_strerror(socket_last_error($sock))); + return FALSE; + } + if(!$this->_settimeout($sock)) return FALSE; + $this->SendMSG("Connecting to \"".$host.":".$port."\""); + if (!($res = @socket_connect($sock, $host, $port))) { + $this->PushError('_connect','socket connect failed',socket_strerror(socket_last_error($sock))); + @socket_close($sock); + return FALSE; + } + $this->_connected=true; + return $sock; + } + + function _readmsg($fnction="_readmsg"){ + if(!$this->_connected) { + $this->PushError($fnction,'Connect first'); + return FALSE; + } + $result=true; + $this->_message=""; + $this->_code=0; + $go=true; + do { + $tmp=@socket_read($this->_ftp_control_sock, 4096, PHP_BINARY_READ); + if($tmp===false) { + $go=$result=false; + $this->PushError($fnction,'Read failed', socket_strerror(socket_last_error($this->_ftp_control_sock))); + } else { + $this->_message.=$tmp; + $go = !preg_match("/^([0-9]{3})(-.+\\1)? [^".CRLF."]+".CRLF."$/Us", $this->_message, $regs); + } + } while($go); + if($this->LocalEcho) echo "GET < ".rtrim($this->_message, CRLF).CRLF; + $this->_code=(int)$regs[1]; + return $result; + } + + function _exec($cmd, $fnction="_exec") { + if(!$this->_ready) { + $this->PushError($fnction,'Connect first'); + return FALSE; + } + if($this->LocalEcho) echo "PUT > ",$cmd,CRLF; + $status=@socket_write($this->_ftp_control_sock, $cmd.CRLF); + if($status===false) { + $this->PushError($fnction,'socket write failed', socket_strerror(socket_last_error($this->stream))); + return FALSE; + } + $this->_lastaction=time(); + if(!$this->_readmsg($fnction)) return FALSE; + return TRUE; + } + + function _data_prepare($mode=FTP_ASCII) { + if(!$this->_settype($mode)) return FALSE; + $this->SendMSG("Creating data socket"); + $this->_ftp_data_sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + if ($this->_ftp_data_sock < 0) { + $this->PushError('_data_prepare','socket create failed',socket_strerror(socket_last_error($this->_ftp_data_sock))); + return FALSE; + } + if(!$this->_settimeout($this->_ftp_data_sock)) { + $this->_data_close(); + return FALSE; + } + if($this->_passive) { + if(!$this->_exec("PASV", "pasv")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $ip_port = explode(",", preg_replace("/^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*$/s", "\\1", $this->_message)); + $this->_datahost=$ip_port[0].".".$ip_port[1].".".$ip_port[2].".".$ip_port[3]; + $this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]); + $this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport); + if(!@socket_connect($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) { + $this->PushError("_data_prepare","socket_connect", socket_strerror(socket_last_error($this->_ftp_data_sock))); + $this->_data_close(); + return FALSE; + } + else $this->_ftp_temp_sock=$this->_ftp_data_sock; + } else { + if(!@socket_getsockname($this->_ftp_control_sock, $addr, $port)) { + $this->PushError("_data_prepare","can't get control socket information", socket_strerror(socket_last_error($this->_ftp_control_sock))); + $this->_data_close(); + return FALSE; + } + if(!@socket_bind($this->_ftp_data_sock,$addr)){ + $this->PushError("_data_prepare","can't bind data socket", socket_strerror(socket_last_error($this->_ftp_data_sock))); + $this->_data_close(); + return FALSE; + } + if(!@socket_listen($this->_ftp_data_sock)) { + $this->PushError("_data_prepare","can't listen data socket", socket_strerror(socket_last_error($this->_ftp_data_sock))); + $this->_data_close(); + return FALSE; + } + if(!@socket_getsockname($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) { + $this->PushError("_data_prepare","can't get data socket information", socket_strerror(socket_last_error($this->_ftp_data_sock))); + $this->_data_close(); + return FALSE; + } + if(!$this->_exec('PORT '.str_replace('.',',',$this->_datahost.'.'.($this->_dataport>>8).'.'.($this->_dataport&0x00FF)), "_port")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + } + return TRUE; + } + + function _data_read($mode=FTP_ASCII, $fp=NULL) { + $NewLine=$this->_eol_code[$this->OS_local]; + if(is_resource($fp)) $out=0; + else $out=""; + if(!$this->_passive) { + $this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport); + $this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock); + if($this->_ftp_temp_sock===FALSE) { + $this->PushError("_data_read","socket_accept", socket_strerror(socket_last_error($this->_ftp_temp_sock))); + $this->_data_close(); + return FALSE; + } + } + + while(($block=@socket_read($this->_ftp_temp_sock, $this->_ftp_buff_size, PHP_BINARY_READ))!==false) { + if($block==="") break; + if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block); + if(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block)); + else $out.=$block; + } + return $out; + } + + function _data_write($mode=FTP_ASCII, $fp=NULL) { + $NewLine=$this->_eol_code[$this->OS_local]; + if(is_resource($fp)) $out=0; + else $out=""; + if(!$this->_passive) { + $this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport); + $this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock); + if($this->_ftp_temp_sock===FALSE) { + $this->PushError("_data_write","socket_accept", socket_strerror(socket_last_error($this->_ftp_temp_sock))); + $this->_data_close(); + return false; + } + } + if(is_resource($fp)) { + while(!feof($fp)) { + $block=fread($fp, $this->_ftp_buff_size); + if(!$this->_data_write_block($mode, $block)) return false; + } + } elseif(!$this->_data_write_block($mode, $fp)) return false; + return true; + } + + function _data_write_block($mode, $block) { + if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_remote], $block); + do { + if(($t=@socket_write($this->_ftp_temp_sock, $block))===FALSE) { + $this->PushError("_data_write","socket_write", socket_strerror(socket_last_error($this->_ftp_temp_sock))); + $this->_data_close(); + return FALSE; + } + $block=substr($block, $t); + } while(!empty($block)); + return true; + } + + function _data_close() { + @socket_close($this->_ftp_temp_sock); + @socket_close($this->_ftp_data_sock); + $this->SendMSG("Disconnected data from remote host"); + return TRUE; + } + + function _quit() { + if($this->_connected) { + @socket_close($this->_ftp_control_sock); + $this->_connected=false; + $this->SendMSG("Socket closed"); + } + } +} +?> diff --git a/wp-admin/includes/class-ftp.php b/wp-admin/includes/class-ftp.php new file mode 100644 index 0000000..8e2624c --- /dev/null +++ b/wp-admin/includes/class-ftp.php @@ -0,0 +1,912 @@ +LocalEcho=$le; + $this->Verbose=$verb; + $this->_lastaction=NULL; + $this->_error_array=array(); + $this->_eol_code=array(FTP_OS_Unix=>"\n", FTP_OS_Mac=>"\r", FTP_OS_Windows=>"\r\n"); + $this->AuthorizedTransferMode=array(FTP_AUTOASCII, FTP_ASCII, FTP_BINARY); + $this->OS_FullName=array(FTP_OS_Unix => 'UNIX', FTP_OS_Windows => 'WINDOWS', FTP_OS_Mac => 'MACOS'); + $this->AutoAsciiExt=array("ASP","BAT","C","CPP","CSS","CSV","JS","H","HTM","HTML","SHTML","INI","LOG","PHP3","PHTML","PL","PERL","SH","SQL","TXT"); + $this->_port_available=($port_mode==TRUE); + $this->SendMSG("Staring FTP client class".($this->_port_available?"":" without PORT mode support")); + $this->_connected=FALSE; + $this->_ready=FALSE; + $this->_can_restore=FALSE; + $this->_code=0; + $this->_message=""; + $this->_ftp_buff_size=4096; + $this->_curtype=NULL; + $this->SetUmask(0022); + $this->SetType(FTP_AUTOASCII); + $this->SetTimeout(30); + $this->Passive(!$this->_port_available); + $this->_login="anonymous"; + $this->_password="anon@ftp.com"; + $this->_features=array(); + $this->OS_local=FTP_OS_Unix; + $this->OS_remote=FTP_OS_Unix; + $this->features=array(); + if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $this->OS_local=FTP_OS_Windows; + elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'MAC') $this->OS_local=FTP_OS_Mac; + } + + function ftp_base($port_mode=FALSE) { + $this->__construct($port_mode); + } + +// +// +// + + function parselisting($line) { + $is_windows = ($this->OS_remote == FTP_OS_Windows); + if ($is_windows && preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|) +(.+)/",$line,$lucifer)) { + $b = array(); + if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix + $b['isdir'] = ($lucifer[7]==""); + if ( $b['isdir'] ) + $b['type'] = 'd'; + else + $b['type'] = 'f'; + $b['size'] = $lucifer[7]; + $b['month'] = $lucifer[1]; + $b['day'] = $lucifer[2]; + $b['year'] = $lucifer[3]; + $b['hour'] = $lucifer[4]; + $b['minute'] = $lucifer[5]; + $b['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]); + $b['am/pm'] = $lucifer[6]; + $b['name'] = $lucifer[8]; + } else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) { + //echo $line."\n"; + $lcount=count($lucifer); + if ($lcount<8) return ''; + $b = array(); + $b['isdir'] = $lucifer[0][0] === "d"; + $b['islink'] = $lucifer[0][0] === "l"; + if ( $b['isdir'] ) + $b['type'] = 'd'; + elseif ( $b['islink'] ) + $b['type'] = 'l'; + else + $b['type'] = 'f'; + $b['perms'] = $lucifer[0]; + $b['number'] = $lucifer[1]; + $b['owner'] = $lucifer[2]; + $b['group'] = $lucifer[3]; + $b['size'] = $lucifer[4]; + if ($lcount==8) { + sscanf($lucifer[5],"%d-%d-%d",$b['year'],$b['month'],$b['day']); + sscanf($lucifer[6],"%d:%d",$b['hour'],$b['minute']); + $b['time'] = @mktime($b['hour'],$b['minute'],0,$b['month'],$b['day'],$b['year']); + $b['name'] = $lucifer[7]; + } else { + $b['month'] = $lucifer[5]; + $b['day'] = $lucifer[6]; + if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) { + $b['year'] = gmdate("Y"); + $b['hour'] = $l2[1]; + $b['minute'] = $l2[2]; + } else { + $b['year'] = $lucifer[7]; + $b['hour'] = 0; + $b['minute'] = 0; + } + $b['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute'])); + $b['name'] = $lucifer[8]; + } + } + + return $b; + } + + function SendMSG($message = "", $crlf=true) { + if ($this->Verbose) { + echo $message.($crlf?CRLF:""); + flush(); + } + return TRUE; + } + + function SetType($mode=FTP_AUTOASCII) { + if(!in_array($mode, $this->AuthorizedTransferMode)) { + $this->SendMSG("Wrong type"); + return FALSE; + } + $this->_type=$mode; + $this->SendMSG("Transfer type: ".($this->_type==FTP_BINARY?"binary":($this->_type==FTP_ASCII?"ASCII":"auto ASCII") ) ); + return TRUE; + } + + function _settype($mode=FTP_ASCII) { + if($this->_ready) { + if($mode==FTP_BINARY) { + if($this->_curtype!=FTP_BINARY) { + if(!$this->_exec("TYPE I", "SetType")) return FALSE; + $this->_curtype=FTP_BINARY; + } + } elseif($this->_curtype!=FTP_ASCII) { + if(!$this->_exec("TYPE A", "SetType")) return FALSE; + $this->_curtype=FTP_ASCII; + } + } else return FALSE; + return TRUE; + } + + function Passive($pasv=NULL) { + if(is_null($pasv)) $this->_passive=!$this->_passive; + else $this->_passive=$pasv; + if(!$this->_port_available and !$this->_passive) { + $this->SendMSG("Only passive connections available!"); + $this->_passive=TRUE; + return FALSE; + } + $this->SendMSG("Passive mode ".($this->_passive?"on":"off")); + return TRUE; + } + + function SetServer($host, $port=21, $reconnect=true) { + if(!is_long($port)) { + $this->verbose=true; + $this->SendMSG("Incorrect port syntax"); + return FALSE; + } else { + $ip=@gethostbyname($host); + $dns=@gethostbyaddr($host); + if(!$ip) $ip=$host; + if(!$dns) $dns=$host; + // Validate the IPAddress PHP4 returns -1 for invalid, PHP5 false + // -1 === "255.255.255.255" which is the broadcast address which is also going to be invalid + $ipaslong = ip2long($ip); + if ( ($ipaslong == false) || ($ipaslong === -1) ) { + $this->SendMSG("Wrong host name/address \"".$host."\""); + return FALSE; + } + $this->_host=$ip; + $this->_fullhost=$dns; + $this->_port=$port; + $this->_dataport=$port-1; + } + $this->SendMSG("Host \"".$this->_fullhost."(".$this->_host."):".$this->_port."\""); + if($reconnect){ + if($this->_connected) { + $this->SendMSG("Reconnecting"); + if(!$this->quit(FTP_FORCE)) return FALSE; + if(!$this->connect()) return FALSE; + } + } + return TRUE; + } + + function SetUmask($umask=0022) { + $this->_umask=$umask; + umask($this->_umask); + $this->SendMSG("UMASK 0".decoct($this->_umask)); + return TRUE; + } + + function SetTimeout($timeout=30) { + $this->_timeout=$timeout; + $this->SendMSG("Timeout ".$this->_timeout); + if($this->_connected) + if(!$this->_settimeout($this->_ftp_control_sock)) return FALSE; + return TRUE; + } + + function connect($server=NULL) { + if(!empty($server)) { + if(!$this->SetServer($server)) return false; + } + if($this->_ready) return true; + $this->SendMsg('Local OS : '.$this->OS_FullName[$this->OS_local]); + if(!($this->_ftp_control_sock = $this->_connect($this->_host, $this->_port))) { + $this->SendMSG("Error : Cannot connect to remote host \"".$this->_fullhost." :".$this->_port."\""); + return FALSE; + } + $this->SendMSG("Connected to remote host \"".$this->_fullhost.":".$this->_port."\". Waiting for greeting."); + do { + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + $this->_lastaction=time(); + } while($this->_code<200); + $this->_ready=true; + $syst=$this->systype(); + if(!$syst) $this->SendMSG("Can't detect remote OS"); + else { + if(preg_match("/win|dos|novell/i", $syst[0])) $this->OS_remote=FTP_OS_Windows; + elseif(preg_match("/os/i", $syst[0])) $this->OS_remote=FTP_OS_Mac; + elseif(preg_match("/(li|u)nix/i", $syst[0])) $this->OS_remote=FTP_OS_Unix; + else $this->OS_remote=FTP_OS_Mac; + $this->SendMSG("Remote OS: ".$this->OS_FullName[$this->OS_remote]); + } + if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled"); + else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features))); + return TRUE; + } + + function quit($force=false) { + if($this->_ready) { + if(!$this->_exec("QUIT") and !$force) return FALSE; + if(!$this->_checkCode() and !$force) return FALSE; + $this->_ready=false; + $this->SendMSG("Session finished"); + } + $this->_quit(); + return TRUE; + } + + function login($user=NULL, $pass=NULL) { + if(!is_null($user)) $this->_login=$user; + else $this->_login="anonymous"; + if(!is_null($pass)) $this->_password=$pass; + else $this->_password="anon@anon.com"; + if(!$this->_exec("USER ".$this->_login, "login")) return FALSE; + if(!$this->_checkCode()) return FALSE; + if($this->_code!=230) { + if(!$this->_exec((($this->_code==331)?"PASS ":"ACCT ").$this->_password, "login")) return FALSE; + if(!$this->_checkCode()) return FALSE; + } + $this->SendMSG("Authentication succeeded"); + if(empty($this->_features)) { + if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled"); + else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features))); + } + return TRUE; + } + + function pwd() { + if(!$this->_exec("PWD", "pwd")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return preg_replace("/^[0-9]{3} \"(.+)\".*$/s", "\\1", $this->_message); + } + + function cdup() { + if(!$this->_exec("CDUP", "cdup")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return true; + } + + function chdir($pathname) { + if(!$this->_exec("CWD ".$pathname, "chdir")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function rmdir($pathname) { + if(!$this->_exec("RMD ".$pathname, "rmdir")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function mkdir($pathname) { + if(!$this->_exec("MKD ".$pathname, "mkdir")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function rename($from, $to) { + if(!$this->_exec("RNFR ".$from, "rename")) return FALSE; + if(!$this->_checkCode()) return FALSE; + if($this->_code==350) { + if(!$this->_exec("RNTO ".$to, "rename")) return FALSE; + if(!$this->_checkCode()) return FALSE; + } else return FALSE; + return TRUE; + } + + function filesize($pathname) { + if(!isset($this->_features["SIZE"])) { + $this->PushError("filesize", "not supported by server"); + return FALSE; + } + if(!$this->_exec("SIZE ".$pathname, "filesize")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return preg_replace("/^[0-9]{3} ([0-9]+).*$/s", "\\1", $this->_message); + } + + function abort() { + if(!$this->_exec("ABOR", "abort")) return FALSE; + if(!$this->_checkCode()) { + if($this->_code!=426) return FALSE; + if(!$this->_readmsg("abort")) return FALSE; + if(!$this->_checkCode()) return FALSE; + } + return true; + } + + function mdtm($pathname) { + if(!isset($this->_features["MDTM"])) { + $this->PushError("mdtm", "not supported by server"); + return FALSE; + } + if(!$this->_exec("MDTM ".$pathname, "mdtm")) return FALSE; + if(!$this->_checkCode()) return FALSE; + $mdtm = preg_replace("/^[0-9]{3} ([0-9]+).*$/s", "\\1", $this->_message); + $date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d"); + $timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]); + return $timestamp; + } + + function systype() { + if(!$this->_exec("SYST", "systype")) return FALSE; + if(!$this->_checkCode()) return FALSE; + $DATA = explode(" ", $this->_message); + return array($DATA[1], $DATA[3]); + } + + function delete($pathname) { + if(!$this->_exec("DELE ".$pathname, "delete")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function site($command, $fnction="site") { + if(!$this->_exec("SITE ".$command, $fnction)) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function chmod($pathname, $mode) { + if(!$this->site( sprintf('CHMOD %o %s', $mode, $pathname), "chmod")) return FALSE; + return TRUE; + } + + function restore($from) { + if(!isset($this->_features["REST"])) { + $this->PushError("restore", "not supported by server"); + return FALSE; + } + if($this->_curtype!=FTP_BINARY) { + $this->PushError("restore", "can't restore in ASCII mode"); + return FALSE; + } + if(!$this->_exec("REST ".$from, "resore")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function features() { + if(!$this->_exec("FEAT", "features")) return FALSE; + if(!$this->_checkCode()) return FALSE; + $f=preg_split("/[".CRLF."]+/", preg_replace("/[0-9]{3}[ -].*[".CRLF."]+/", "", $this->_message), -1, PREG_SPLIT_NO_EMPTY); + $this->_features=array(); + foreach($f as $k=>$v) { + $v=explode(" ", trim($v)); + $this->_features[array_shift($v)]=$v; + } + return true; + } + + function rawlist($pathname="", $arg="") { + return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "LIST", "rawlist"); + } + + function nlist($pathname="", $arg="") { + return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "NLST", "nlist"); + } + + function is_exists($pathname) { + return $this->file_exists($pathname); + } + + function file_exists($pathname) { + $exists=true; + if(!$this->_exec("RNFR ".$pathname, "rename")) $exists=FALSE; + else { + if(!$this->_checkCode()) $exists=FALSE; + $this->abort(); + } + if($exists) $this->SendMSG("Remote file ".$pathname." exists"); + else $this->SendMSG("Remote file ".$pathname." does not exist"); + return $exists; + } + + function fget($fp, $remotefile, $rest=0) { + if($this->_can_restore and $rest!=0) fseek($fp, $rest); + $pi=pathinfo($remotefile); + if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII; + else $mode=FTP_BINARY; + if(!$this->_data_prepare($mode)) { + return FALSE; + } + if($this->_can_restore and $rest!=0) $this->restore($rest); + if(!$this->_exec("RETR ".$remotefile, "get")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $out=$this->_data_read($mode, $fp); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + return $out; + } + + function get($remotefile, $localfile=NULL, $rest=0) { + if(is_null($localfile)) $localfile=$remotefile; + if (@file_exists($localfile)) $this->SendMSG("Warning : local file will be overwritten"); + $fp = @fopen($localfile, "w"); + if (!$fp) { + $this->PushError("get","can't open local file", "Cannot create \"".$localfile."\""); + return FALSE; + } + if($this->_can_restore and $rest!=0) fseek($fp, $rest); + $pi=pathinfo($remotefile); + if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII; + else $mode=FTP_BINARY; + if(!$this->_data_prepare($mode)) { + fclose($fp); + return FALSE; + } + if($this->_can_restore and $rest!=0) $this->restore($rest); + if(!$this->_exec("RETR ".$remotefile, "get")) { + $this->_data_close(); + fclose($fp); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + fclose($fp); + return FALSE; + } + $out=$this->_data_read($mode, $fp); + fclose($fp); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + return $out; + } + + function fput($remotefile, $fp, $rest=0) { + if($this->_can_restore and $rest!=0) fseek($fp, $rest); + $pi=pathinfo($remotefile); + if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII; + else $mode=FTP_BINARY; + if(!$this->_data_prepare($mode)) { + return FALSE; + } + if($this->_can_restore and $rest!=0) $this->restore($rest); + if(!$this->_exec("STOR ".$remotefile, "put")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $ret=$this->_data_write($mode, $fp); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + return $ret; + } + + function put($localfile, $remotefile=NULL, $rest=0) { + if(is_null($remotefile)) $remotefile=$localfile; + if (!file_exists($localfile)) { + $this->PushError("put","can't open local file", "No such file or directory \"".$localfile."\""); + return FALSE; + } + $fp = @fopen($localfile, "r"); + + if (!$fp) { + $this->PushError("put","can't open local file", "Cannot read file \"".$localfile."\""); + return FALSE; + } + if($this->_can_restore and $rest!=0) fseek($fp, $rest); + $pi=pathinfo($localfile); + if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII; + else $mode=FTP_BINARY; + if(!$this->_data_prepare($mode)) { + fclose($fp); + return FALSE; + } + if($this->_can_restore and $rest!=0) $this->restore($rest); + if(!$this->_exec("STOR ".$remotefile, "put")) { + $this->_data_close(); + fclose($fp); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + fclose($fp); + return FALSE; + } + $ret=$this->_data_write($mode, $fp); + fclose($fp); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + return $ret; + } + + function mput($local=".", $remote=NULL, $continious=false) { + $local=realpath($local); + if(!@file_exists($local)) { + $this->PushError("mput","can't open local folder", "Cannot stat folder \"".$local."\""); + return FALSE; + } + if(!is_dir($local)) return $this->put($local, $remote); + if(empty($remote)) $remote="."; + elseif(!$this->file_exists($remote) and !$this->mkdir($remote)) return FALSE; + if($handle = opendir($local)) { + $list=array(); + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != "..") $list[]=$file; + } + closedir($handle); + } else { + $this->PushError("mput","can't open local folder", "Cannot read folder \"".$local."\""); + return FALSE; + } + if(empty($list)) return TRUE; + $ret=true; + foreach($list as $el) { + if(is_dir($local."/".$el)) $t=$this->mput($local."/".$el, $remote."/".$el); + else $t=$this->put($local."/".$el, $remote."/".$el); + if(!$t) { + $ret=FALSE; + if(!$continious) break; + } + } + return $ret; + + } + + function mget($remote, $local=".", $continious=false) { + $list=$this->rawlist($remote, "-lA"); + if($list===false) { + $this->PushError("mget","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents"); + return FALSE; + } + if(empty($list)) return true; + if(!@file_exists($local)) { + if(!@mkdir($local)) { + $this->PushError("mget","can't create local folder", "Cannot create folder \"".$local."\""); + return FALSE; + } + } + foreach($list as $k=>$v) { + $list[$k]=$this->parselisting($v); + if( ! $list[$k] or $list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]); + } + $ret=true; + foreach($list as $el) { + if($el["type"]=="d") { + if(!$this->mget($remote."/".$el["name"], $local."/".$el["name"], $continious)) { + $this->PushError("mget", "can't copy folder", "Can't copy remote folder \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\""); + $ret=false; + if(!$continious) break; + } + } else { + if(!$this->get($remote."/".$el["name"], $local."/".$el["name"])) { + $this->PushError("mget", "can't copy file", "Can't copy remote file \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\""); + $ret=false; + if(!$continious) break; + } + } + @chmod($local."/".$el["name"], $el["perms"]); + $t=strtotime($el["date"]); + if($t!==-1 and $t!==false) @touch($local."/".$el["name"], $t); + } + return $ret; + } + + function mdel($remote, $continious=false) { + $list=$this->rawlist($remote, "-la"); + if($list===false) { + $this->PushError("mdel","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents"); + return false; + } + + foreach($list as $k=>$v) { + $list[$k]=$this->parselisting($v); + if( ! $list[$k] or $list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]); + } + $ret=true; + + foreach($list as $el) { + if ( empty($el) ) + continue; + + if($el["type"]=="d") { + if(!$this->mdel($remote."/".$el["name"], $continious)) { + $ret=false; + if(!$continious) break; + } + } else { + if (!$this->delete($remote."/".$el["name"])) { + $this->PushError("mdel", "can't delete file", "Can't delete remote file \"".$remote."/".$el["name"]."\""); + $ret=false; + if(!$continious) break; + } + } + } + + if(!$this->rmdir($remote)) { + $this->PushError("mdel", "can't delete folder", "Can't delete remote folder \"".$remote."/".$el["name"]."\""); + $ret=false; + } + return $ret; + } + + function mmkdir($dir, $mode = 0777) { + if(empty($dir)) return FALSE; + if($this->is_exists($dir) or $dir == "/" ) return TRUE; + if(!$this->mmkdir(dirname($dir), $mode)) return false; + $r=$this->mkdir($dir, $mode); + $this->chmod($dir,$mode); + return $r; + } + + function glob($pattern, $handle=NULL) { + $path=$output=null; + if(PHP_OS=='WIN32') $slash='\\'; + else $slash='/'; + $lastpos=strrpos($pattern,$slash); + if(!($lastpos===false)) { + $path=substr($pattern,0,-$lastpos-1); + $pattern=substr($pattern,$lastpos); + } else $path=getcwd(); + if(is_array($handle) and !empty($handle)) { + foreach($handle as $dir) { + if($this->glob_pattern_match($pattern,$dir)) + $output[]=$dir; + } + } else { + $handle=@opendir($path); + if($handle===false) return false; + while($dir=readdir($handle)) { + if($this->glob_pattern_match($pattern,$dir)) + $output[]=$dir; + } + closedir($handle); + } + if(is_array($output)) return $output; + return false; + } + + function glob_pattern_match($pattern,$string) { + $out=null; + $chunks=explode(';',$pattern); + foreach($chunks as $pattern) { + $escape=array('$','^','.','{','}','(',')','[',']','|'); + while(strpos($pattern,'**')!==false) + $pattern=str_replace('**','*',$pattern); + foreach($escape as $probe) + $pattern=str_replace($probe,"\\$probe",$pattern); + $pattern=str_replace('?*','*', + str_replace('*?','*', + str_replace('*',".*", + str_replace('?','.{1,1}',$pattern)))); + $out[]=$pattern; + } + if(count($out)==1) return($this->glob_regexp("^$out[0]$",$string)); + else { + foreach($out as $tester) + if($this->my_regexp("^$tester$",$string)) return true; + } + return false; + } + + function glob_regexp($pattern,$probe) { + $sensitive=(PHP_OS!='WIN32'); + return ($sensitive? + preg_match( '/' . preg_quote( $pattern, '/' ) . '/', $probe ) : + preg_match( '/' . preg_quote( $pattern, '/' ) . '/i', $probe ) + ); + } + + function dirlist($remote) { + $list=$this->rawlist($remote, "-la"); + if($list===false) { + $this->PushError("dirlist","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents"); + return false; + } + + $dirlist = array(); + foreach($list as $k=>$v) { + $entry=$this->parselisting($v); + if ( empty($entry) ) + continue; + + if($entry["name"]=="." or $entry["name"]=="..") + continue; + + $dirlist[$entry['name']] = $entry; + } + + return $dirlist; + } +// +// +// + function _checkCode() { + return ($this->_code<400 and $this->_code>0); + } + + function _list($arg="", $cmd="LIST", $fnction="_list") { + if(!$this->_data_prepare()) return false; + if(!$this->_exec($cmd.$arg, $fnction)) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $out=""; + if($this->_code<200) { + $out=$this->_data_read(); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + if($out === FALSE ) return FALSE; + $out=preg_split("/[".CRLF."]+/", $out, -1, PREG_SPLIT_NO_EMPTY); +// $this->SendMSG(implode($this->_eol_code[$this->OS_local], $out)); + } + return $out; + } + +// +// +// +// Gnre une erreur pour traitement externe la classe + function PushError($fctname,$msg,$desc=false){ + $error=array(); + $error['time']=time(); + $error['fctname']=$fctname; + $error['msg']=$msg; + $error['desc']=$desc; + if($desc) $tmp=' ('.$desc.')'; else $tmp=''; + $this->SendMSG($fctname.': '.$msg.$tmp); + return(array_push($this->_error_array,$error)); + } + +// Rcupre une erreur externe + function PopError(){ + if(count($this->_error_array)) return(array_pop($this->_error_array)); + else return(false); + } +} + +$mod_sockets = extension_loaded( 'sockets' ); +if ( ! $mod_sockets && function_exists( 'dl' ) && is_callable( 'dl' ) ) { + $prefix = ( PHP_SHLIB_SUFFIX == 'dll' ) ? 'php_' : ''; + @dl( $prefix . 'sockets.' . PHP_SHLIB_SUFFIX ); + $mod_sockets = extension_loaded( 'sockets' ); +} + +require_once __DIR__ . "/class-ftp-" . ( $mod_sockets ? "sockets" : "pure" ) . ".php"; + +if ( $mod_sockets ) { + class ftp extends ftp_sockets {} +} else { + class ftp extends ftp_pure {} +} diff --git a/wp-admin/includes/class-language-pack-upgrader-skin.php b/wp-admin/includes/class-language-pack-upgrader-skin.php new file mode 100644 index 0000000..cbbc834 --- /dev/null +++ b/wp-admin/includes/class-language-pack-upgrader-skin.php @@ -0,0 +1,95 @@ + '', + 'nonce' => '', + 'title' => __( 'Update Translations' ), + 'skip_header_footer' => false, + ); + $args = wp_parse_args( $args, $defaults ); + if ( $args['skip_header_footer'] ) { + $this->done_header = true; + $this->done_footer = true; + $this->display_footer_actions = false; + } + parent::__construct( $args ); + } + + /** + */ + public function before() { + $name = $this->upgrader->get_name_for_update( $this->language_update ); + + echo '
        '; + + /* translators: 1: Project name (plugin, theme, or WordPress), 2: Language. */ + printf( '

        ' . __( 'Updating translations for %1$s (%2$s)…' ) . '

        ', $name, $this->language_update->language ); + } + + /** + * @param string|WP_Error $error + */ + public function error( $error ) { + echo '
        '; + parent::error( $error ); + echo '
        '; + } + + /** + */ + public function after() { + echo '
        '; + } + + /** + */ + public function bulk_footer() { + $this->decrement_update_count( 'translation' ); + + $update_actions = array( + 'updates_page' => sprintf( + '%s', + self_admin_url( 'update-core.php' ), + __( 'Return to WordPress Updates page' ) + ), + ); + + /** + * Filters the list of action links available following a translations update. + * + * @since 3.7.0 + * + * @param string[] $update_actions Array of translations update links. + */ + $update_actions = apply_filters( 'update_translations_complete_actions', $update_actions ); + + if ( $update_actions && $this->display_footer_actions ) { + $this->feedback( implode( ' | ', $update_actions ) ); + } + } +} diff --git a/wp-admin/includes/class-language-pack-upgrader.php b/wp-admin/includes/class-language-pack-upgrader.php new file mode 100644 index 0000000..0ae18d9 --- /dev/null +++ b/wp-admin/includes/class-language-pack-upgrader.php @@ -0,0 +1,473 @@ +is_vcs_checkout( WP_CONTENT_DIR ) ) { + return; + } + + foreach ( $language_updates as $key => $language_update ) { + $update = ! empty( $language_update->autoupdate ); + + /** + * Filters whether to asynchronously update translation for core, a plugin, or a theme. + * + * @since 4.0.0 + * + * @param bool $update Whether to update. + * @param object $language_update The update offer. + */ + $update = apply_filters( 'async_update_translation', $update, $language_update ); + + if ( ! $update ) { + unset( $language_updates[ $key ] ); + } + } + + if ( empty( $language_updates ) ) { + return; + } + + // Re-use the automatic upgrader skin if the parent upgrader is using it. + if ( $upgrader && $upgrader->skin instanceof Automatic_Upgrader_Skin ) { + $skin = $upgrader->skin; + } else { + $skin = new Language_Pack_Upgrader_Skin( + array( + 'skip_header_footer' => true, + ) + ); + } + + $lp_upgrader = new Language_Pack_Upgrader( $skin ); + $lp_upgrader->bulk_upgrade( $language_updates ); + } + + /** + * Initialize the upgrade strings. + * + * @since 3.7.0 + */ + public function upgrade_strings() { + $this->strings['starting_upgrade'] = __( 'Some of your translations need updating. Sit tight for a few more seconds while we update them as well.' ); + $this->strings['up_to_date'] = __( 'Your translations are all up to date.' ); + $this->strings['no_package'] = __( 'Update package not available.' ); + /* translators: %s: Package URL. */ + $this->strings['downloading_package'] = sprintf( __( 'Downloading translation from %s…' ), '%s' ); + $this->strings['unpack_package'] = __( 'Unpacking the update…' ); + $this->strings['process_failed'] = __( 'Translation update failed.' ); + $this->strings['process_success'] = __( 'Translation updated successfully.' ); + $this->strings['remove_old'] = __( 'Removing the old version of the translation…' ); + $this->strings['remove_old_failed'] = __( 'Could not remove the old translation.' ); + } + + /** + * Upgrade a language pack. + * + * @since 3.7.0 + * + * @param string|false $update Optional. Whether an update offer is available. Default false. + * @param array $args Optional. Other optional arguments, see + * Language_Pack_Upgrader::bulk_upgrade(). Default empty array. + * @return array|bool|WP_Error The result of the upgrade, or a WP_Error object instead. + */ + public function upgrade( $update = false, $args = array() ) { + if ( $update ) { + $update = array( $update ); + } + + $results = $this->bulk_upgrade( $update, $args ); + + if ( ! is_array( $results ) ) { + return $results; + } + + return $results[0]; + } + + /** + * Bulk upgrade language packs. + * + * @since 3.7.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param object[] $language_updates Optional. Array of language packs to update. @see wp_get_translation_updates(). + * Default empty array. + * @param array $args { + * Other arguments for upgrading multiple language packs. Default empty array. + * + * @type bool $clear_update_cache Whether to clear the update cache when done. + * Default true. + * } + * @return array|bool|WP_Error Will return an array of results, or true if there are no updates, + * false or WP_Error for initial errors. + */ + public function bulk_upgrade( $language_updates = array(), $args = array() ) { + global $wp_filesystem; + + $defaults = array( + 'clear_update_cache' => true, + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $this->init(); + $this->upgrade_strings(); + + if ( ! $language_updates ) { + $language_updates = wp_get_translation_updates(); + } + + if ( empty( $language_updates ) ) { + $this->skin->header(); + $this->skin->set_result( true ); + $this->skin->feedback( 'up_to_date' ); + $this->skin->bulk_footer(); + $this->skin->footer(); + return true; + } + + if ( 'upgrader_process_complete' == current_filter() ) { + $this->skin->feedback( 'starting_upgrade' ); + } + + // Remove any existing upgrade filters from the plugin/theme upgraders #WP29425 & #WP29230. + remove_all_filters( 'upgrader_pre_install' ); + remove_all_filters( 'upgrader_clear_destination' ); + remove_all_filters( 'upgrader_post_install' ); + remove_all_filters( 'upgrader_source_selection' ); + + add_filter( 'upgrader_source_selection', array( $this, 'check_package' ), 10, 2 ); + + $this->skin->header(); + + // Connect to the filesystem first. + $res = $this->fs_connect( array( WP_CONTENT_DIR, WP_LANG_DIR ) ); + if ( ! $res ) { + $this->skin->footer(); + return false; + } + + $results = array(); + + $this->update_count = count( $language_updates ); + $this->update_current = 0; + + /* + * The filesystem's mkdir() is not recursive. Make sure WP_LANG_DIR exists, + * as we then may need to create a /plugins or /themes directory inside of it. + */ + $remote_destination = $wp_filesystem->find_folder( WP_LANG_DIR ); + if ( ! $wp_filesystem->exists( $remote_destination ) ) { + if ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) ) { + return new WP_Error( 'mkdir_failed_lang_dir', $this->strings['mkdir_failed'], $remote_destination ); + } + } + + $language_updates_results = array(); + + foreach ( $language_updates as $language_update ) { + + $this->skin->language_update = $language_update; + + $destination = WP_LANG_DIR; + if ( 'plugin' == $language_update->type ) { + $destination .= '/plugins'; + } elseif ( 'theme' == $language_update->type ) { + $destination .= '/themes'; + } + + $this->update_current++; + + $options = array( + 'package' => $language_update->package, + 'destination' => $destination, + 'clear_destination' => true, + 'abort_if_destination_exists' => false, // We expect the destination to exist. + 'clear_working' => true, + 'is_multi' => true, + 'hook_extra' => array( + 'language_update_type' => $language_update->type, + 'language_update' => $language_update, + ), + ); + + $result = $this->run( $options ); + + $results[] = $this->result; + + // Prevent credentials auth screen from displaying multiple times. + if ( false === $result ) { + break; + } + + $language_updates_results[] = array( + 'language' => $language_update->language, + 'type' => $language_update->type, + 'slug' => isset( $language_update->slug ) ? $language_update->slug : 'default', + 'version' => $language_update->version, + ); + } + + // Remove upgrade hooks which are not required for translation updates. + remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 ); + remove_action( 'upgrader_process_complete', 'wp_version_check' ); + remove_action( 'upgrader_process_complete', 'wp_update_plugins' ); + remove_action( 'upgrader_process_complete', 'wp_update_themes' ); + + /** This action is documented in wp-admin/includes/class-wp-upgrader.php */ + do_action( + 'upgrader_process_complete', + $this, + array( + 'action' => 'update', + 'type' => 'translation', + 'bulk' => true, + 'translations' => $language_updates_results, + ) + ); + + // Re-add upgrade hooks. + add_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 ); + add_action( 'upgrader_process_complete', 'wp_version_check', 10, 0 ); + add_action( 'upgrader_process_complete', 'wp_update_plugins', 10, 0 ); + add_action( 'upgrader_process_complete', 'wp_update_themes', 10, 0 ); + + $this->skin->bulk_footer(); + + $this->skin->footer(); + + // Clean up our hooks, in case something else does an upgrade on this connection. + remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) ); + + if ( $parsed_args['clear_update_cache'] ) { + wp_clean_update_cache(); + } + + return $results; + } + + /** + * Check the package source to make sure there are .mo and .po files. + * + * Hooked to the {@see 'upgrader_source_selection'} filter by + * Language_Pack_Upgrader::bulk_upgrade(). + * + * @since 3.7.0 + * + * @global WP_Filesystem_Base $wp_filesystem Subclass + * + * @param string|WP_Error $source + * @param string $remote_source + */ + public function check_package( $source, $remote_source ) { + global $wp_filesystem; + + if ( is_wp_error( $source ) ) { + return $source; + } + + // Check that the folder contains a valid language. + $files = $wp_filesystem->dirlist( $remote_source ); + + // Check to see if a .po and .mo exist in the folder. + $po = false; + $mo = false; + foreach ( (array) $files as $file => $filedata ) { + if ( '.po' == substr( $file, -3 ) ) { + $po = true; + } elseif ( '.mo' == substr( $file, -3 ) ) { + $mo = true; + } + } + + if ( ! $mo || ! $po ) { + return new WP_Error( + 'incompatible_archive_pomo', + $this->strings['incompatible_archive'], + sprintf( + /* translators: 1: .po, 2: .mo */ + __( 'The language pack is missing either the %1$s or %2$s files.' ), + '.po', + '.mo' + ) + ); + } + + return $source; + } + + /** + * Get the name of an item being updated. + * + * @since 3.7.0 + * + * @param object $update The data for an update. + * @return string The name of the item being updated. + */ + public function get_name_for_update( $update ) { + switch ( $update->type ) { + case 'core': + return 'WordPress'; // Not translated. + + case 'theme': + $theme = wp_get_theme( $update->slug ); + if ( $theme->exists() ) { + return $theme->Get( 'Name' ); + } + break; + case 'plugin': + $plugin_data = get_plugins( '/' . $update->slug ); + $plugin_data = reset( $plugin_data ); + if ( $plugin_data ) { + return $plugin_data['Name']; + } + break; + } + return ''; + } + + /** + * Clears existing translations where this item is going to be installed into. + * + * @since 5.1.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $remote_destination The location on the remote filesystem to be cleared. + * @return bool|WP_Error True upon success, WP_Error on failure. + */ + public function clear_destination( $remote_destination ) { + global $wp_filesystem; + + $language_update = $this->skin->language_update; + $language_directory = WP_LANG_DIR . '/'; // Local path for use with glob(). + + if ( 'core' === $language_update->type ) { + $files = array( + $remote_destination . $language_update->language . '.po', + $remote_destination . $language_update->language . '.mo', + $remote_destination . 'admin-' . $language_update->language . '.po', + $remote_destination . 'admin-' . $language_update->language . '.mo', + $remote_destination . 'admin-network-' . $language_update->language . '.po', + $remote_destination . 'admin-network-' . $language_update->language . '.mo', + $remote_destination . 'continents-cities-' . $language_update->language . '.po', + $remote_destination . 'continents-cities-' . $language_update->language . '.mo', + ); + + $json_translation_files = glob( $language_directory . $language_update->language . '-*.json' ); + if ( $json_translation_files ) { + foreach ( $json_translation_files as $json_translation_file ) { + $files[] = str_replace( $language_directory, $remote_destination, $json_translation_file ); + } + } + } else { + $files = array( + $remote_destination . $language_update->slug . '-' . $language_update->language . '.po', + $remote_destination . $language_update->slug . '-' . $language_update->language . '.mo', + ); + + $language_directory = $language_directory . $language_update->type . 's/'; + $json_translation_files = glob( $language_directory . $language_update->slug . '-' . $language_update->language . '-*.json' ); + if ( $json_translation_files ) { + foreach ( $json_translation_files as $json_translation_file ) { + $files[] = str_replace( $language_directory, $remote_destination, $json_translation_file ); + } + } + } + + $files = array_filter( $files, array( $wp_filesystem, 'exists' ) ); + + // No files to delete. + if ( ! $files ) { + return true; + } + + // Check all files are writable before attempting to clear the destination. + $unwritable_files = array(); + + // Check writability. + foreach ( $files as $file ) { + if ( ! $wp_filesystem->is_writable( $file ) ) { + // Attempt to alter permissions to allow writes and try again. + $wp_filesystem->chmod( $file, FS_CHMOD_FILE ); + if ( ! $wp_filesystem->is_writable( $file ) ) { + $unwritable_files[] = $file; + } + } + } + + if ( ! empty( $unwritable_files ) ) { + return new WP_Error( 'files_not_writable', $this->strings['files_not_writable'], implode( ', ', $unwritable_files ) ); + } + + foreach ( $files as $file ) { + if ( ! $wp_filesystem->delete( $file ) ) { + return new WP_Error( 'remove_old_failed', $this->strings['remove_old_failed'] ); + } + } + + return true; + } +} diff --git a/wp-admin/includes/class-pclzip.php b/wp-admin/includes/class-pclzip.php new file mode 100644 index 0000000..47f2a34 --- /dev/null +++ b/wp-admin/includes/class-pclzip.php @@ -0,0 +1,5702 @@ +zipname = $p_zipname; + $this->zip_fd = 0; + $this->magic_quotes_status = -1; + + // ----- Return + return; + } + + public function PclZip($p_zipname) { + self::__construct($p_zipname); + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See below the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function create($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove from the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid number / type of arguments"); + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + if ($v_string != '') { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + else { + } + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function add($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exist and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + function listContent() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) + { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH options + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function extract() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Trace + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, + $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extractByIndex($p_index, options...) + function extractByIndex($p_index) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + } + else { + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Trace + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, + array (PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // This method removes files from the archive. + // If no parameters are given, then all the archive is emptied. + // Parameters : + // None or optional arguments. + // Options : + // PCLZIP_OPT_BY_INDEX : + // PCLZIP_OPT_BY_NAME : + // PCLZIP_OPT_BY_EREG : + // PCLZIP_OPT_BY_PREG : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function delete() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { + $this->privSwapBackMagicQuotes(); + unset($v_list); + return(0); + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be preferred. + // -------------------------------------------------------------------------------- + function deleteByIndex($p_index) + { + + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + function properties() + { + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + $this->privSwapBackMagicQuotes(); + return(0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) + { + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return 0; + } + + // ----- Read the central directory information + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + function duplicate($p_archive) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) + { + + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } + + // ----- Look if the $p_archive is a string (so a filename) + else if (is_string($p_archive)) + { + + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } + else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + function merge($p_archive_to_add) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) + { + + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } + + // ----- Look if the $p_archive_to_add is a string (so a filename) + else if (is_string($p_archive_to_add)) + { + + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorCode() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorCode()); + } + else { + return($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorName($p_with_code=false) + { + $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' + ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' + ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' + ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } + else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->error_code.')'); + } + else { + return($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorInfo($p_full=false) + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorString()); + } + else { + if ($p_full) { + return($this->errorName(true)." : ".$this->error_string); + } + else { + return($this->error_string." [code ".$this->error_code."]"); + } + } + } + // -------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + function privCheckFormat($p_level=0) + { + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); + return(false); + } + + // ----- Check that the file is readable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); + return(false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) + { + $v_result=1; + + // ----- Read the options + $i=0; + while ($i<$p_size) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH : + case PCLZIP_OPT_REMOVE_PATH : + case PCLZIP_OPT_ADD_PATH : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_THRESHOLD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + // ----- Check the value + $v_value = $p_options_list[$i+1]; + if ((!is_integer($v_value)) || ($v_value<0)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Get the value (and convert it in bytes) + $v_result_list[$p_options_list[$i]] = $v_value*1048576; + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_ON : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_TEMP_FILE_OFF : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); + return PclZip::errorCode(); + } + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if ( is_string($p_options_list[$i+1]) + && ($p_options_list[$i+1] != '')) { + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + } + else { + } + break; + + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG : + // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG + // to PCLZIP_OPT_BY_PREG + $p_options_list[$i] = PCLZIP_OPT_BY_PREG; + case PCLZIP_OPT_BY_PREG : + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT : + case PCLZIP_OPT_ADD_COMMENT : + case PCLZIP_OPT_PREPEND_COMMENT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } + else if (is_integer($p_options_list[$i+1])) { + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_work_list = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag=false; + $v_sort_value=0; + for ($j=0; $j= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT : + case PCLZIP_CB_POST_EXTRACT : + case PCLZIP_CB_PRE_ADD : + case PCLZIP_CB_POST_ADD : + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" + .$p_options_list[$i]."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + } + + // ----- Look for default values + if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOptionDefaultThreshold() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privOptionDefaultThreshold(&$p_options) + { + $v_result=1; + + if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { + return $v_result; + } + + // ----- Get 'memory_limit' configuration value + $v_memory_limit = ini_get('memory_limit'); + $v_memory_limit = trim($v_memory_limit); + $v_memory_limit_int = (int) $v_memory_limit; + $last = strtolower(substr($v_memory_limit, -1)); + + if($last == 'g') + //$v_memory_limit_int = $v_memory_limit_int*1024*1024*1024; + $v_memory_limit_int = $v_memory_limit_int*1073741824; + if($last == 'm') + //$v_memory_limit_int = $v_memory_limit_int*1024*1024; + $v_memory_limit_int = $v_memory_limit_int*1048576; + if($last == 'k') + $v_memory_limit_int = $v_memory_limit_int*1024; + + $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit_int*PCLZIP_TEMPORARY_FILE_RATIO); + + + // ----- Sanity check : No threshold if value lower than 1M + if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { + unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrParseAtt() + // Description : + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) + { + $v_result=1; + + // ----- For each file in the list check the attributes + foreach ($p_file_list as $v_key => $v_value) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$v_key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for attribute + switch ($v_key) { + case PCLZIP_ATT_FILE_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['filename'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + break; + + case PCLZIP_ATT_FILE_NEW_SHORT_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_short_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + case PCLZIP_ATT_FILE_NEW_FULL_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_full_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + // ----- Look for options that takes a string + case PCLZIP_ATT_FILE_COMMENT : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['comment'] = $v_value; + break; + + case PCLZIP_ATT_FILE_MTIME : + if (!is_integer($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['mtime'] = $v_value; + break; + + case PCLZIP_ATT_FILE_CONTENT : + $p_filedescr['content'] = $v_value; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '".$v_key."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($p_file_list[$key])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + return PclZip::errorCode(); + } + } + } + } + + // end foreach + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrExpand() + // Description : + // This method look for each item of the list to see if its a file, a folder + // or a string to be added as file. For any other type of files (link, other) + // just ignore the item. + // Then prepare the information that will be stored for that file. + // When its a folder, expand the folder with all the files that are in that + // folder (recursively). + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrExpand(&$p_filedescr_list, &$p_options) + { + $v_result=1; + + // ----- Create a result list + $v_result_list = array(); + + // ----- Look each entry + for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); + + // ----- Add the descriptor in result list + $v_result_list[sizeof($v_result_list)] = $v_descr; + + // ----- Look for folder + if ($v_descr['type'] == 'folder') { + // ----- List of items in folder + $v_dirlist_descr = array(); + $v_dirlist_nb = 0; + if ($v_folder_handler = @opendir($v_descr['filename'])) { + while (($v_item_handler = @readdir($v_folder_handler)) !== false) { + + // ----- Skip '.' and '..' + if (($v_item_handler == '.') || ($v_item_handler == '..')) { + continue; + } + + // ----- Compose the full filename + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; + + // ----- Look for different stored filename + // Because the name of the folder was changed, the name of the + // files/sub-folders also change + if (($v_descr['stored_filename'] != $v_descr['filename']) + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { + if ($v_descr['stored_filename'] != '') { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; + } + else { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; + } + } + + $v_dirlist_nb++; + } + + @closedir($v_folder_handler); + } + else { + // TBC : unable to open folder in read mode + } + + // ----- Expand each element of the list + if ($v_dirlist_nb != 0) { + // ----- Expand + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { + return $v_result; + } + + // ----- Concat the resulting list + $v_result_list = array_merge($v_result_list, $v_dirlist_descr); + } + else { + } + + // ----- Free local array + unset($v_dirlist_descr); + } + } + + // ----- Get the result list + $p_filedescr_list = $v_result_list; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCreate($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAdd($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) + { + + // ----- Do a create + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); + + // ----- Return + return $v_result; + } + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory information + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Creates a temporary file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privOpenFd($p_mode) + { + $v_result=1; + + // ----- Look if already open + if ($this->zip_fd != 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privCloseFd() + { + $v_result=1; + + if ($this->zip_fd != 0) + @fclose($this->zip_fd); + $this->zip_fd = 0; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is useful if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- +// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + function privAddList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // Parameters : + // $p_filedescr_list : An array containing the file description + // or directory names to add in the zip + // $p_result_list : list of added files with their properties (specially the status field) + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + + // ----- Loop on the files + for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, + $p_options); + if ($v_result != 1) { + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=1; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + // TBC : Already done in the fileAtt check ... ? + if ($p_filename == "") { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for a stored different filename + /* TBC : Removed + if (isset($p_filedescr['stored_filename'])) { + $v_stored_filename = $p_filedescr['stored_filename']; + } + else { + $v_stored_filename = $p_filedescr['stored_filename']; + } + */ + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; +// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; + $p_header['stored_filename'] = $p_filedescr['stored_filename']; + $p_header['extra'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for regular file + if ($p_filedescr['type']=='file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for regular folder + else if ($p_filedescr['type']=='folder') { + $p_header['external'] = 0x00000010; + $p_header['mtime'] = filemtime($p_filename); + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for virtual file + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = strlen($p_filedescr['content']); + } + + + // ----- Look for filetime + if (isset($p_filedescr['mtime'])) { + $p_header['mtime'] = $p_filedescr['mtime']; + } + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['mtime'] = time(); + } + else { + $p_header['mtime'] = filemtime($p_filename); + } + + // ------ Look for file comment + if (isset($p_filedescr['comment'])) { + $p_header['comment_len'] = strlen($p_filedescr['comment']); + $p_header['comment'] = $p_filedescr['comment']; + } + else { + $p_header['comment_len'] = 0; + $p_header['comment'] = ''; + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the information + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + + // ----- Look for a file + if ($p_filedescr['type'] == 'file') { + // ----- Look for using temporary file to zip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { + $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Use "in memory" zip algo + else { + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Close the file + @fclose($v_file); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + + } + + } + + // ----- Look for a virtual file (a file from string) + else if ($p_filedescr['type'] == 'virtual_file') { + + $v_content = $p_filedescr['content']; + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } + + // ----- Look for a directory + else if ($p_filedescr['type'] == 'folder') { + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) + { + return $v_result; + } + } + } + + // ----- Look for post-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the information + // Nothing can be modified + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=PCLZIP_ERR_NO_ERROR; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Creates a compressed temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = filesize($p_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @gzputs($v_file_compressed, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file); + @gzclose($v_file_compressed); + + // ----- Check the minimum file size + if (filesize($v_gzip_temp_name) < 18) { + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); + return PclZip::errorCode(); + } + + // ----- Extract the compressed attributes + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the gzip file header + $v_binary_data = @fread($v_file_compressed, 10); + $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); + + // ----- Check some parameters + $v_data_header['os'] = bin2hex($v_data_header['os']); + + // ----- Read the gzip file footer + @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); + $v_binary_data = @fread($v_file_compressed, 8); + $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); + + // ----- Set the attributes + $p_header['compression'] = ord($v_data_header['cm']); + //$p_header['mtime'] = $v_data_header['mtime']; + $p_header['crc'] = $v_data_footer['crc']; + $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + + // ----- Add the compressed data + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) + { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + fseek($v_file_compressed, 10); + $v_size = $p_header['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file_compressed, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Unlink the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCalculateStoredFilename() + // Description : + // Based on file descriptor properties and global options, this method + // calculate the filename that will be stored in the archive. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCalculateStoredFilename(&$p_filedescr, &$p_options) + { + $v_result=1; + + // ----- Working variables + $p_filename = $p_filedescr['filename']; + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; + } + else { + $p_add_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; + } + else { + $p_remove_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + else { + $p_remove_all_dir = 0; + } + + + // ----- Look for full name change + if (isset($p_filedescr['new_full_name'])) { + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); + } + + // ----- Look for path and/or short name change + else { + + // ----- Look for short name change + // Its when we change just the filename but not the path + if (isset($p_filedescr['new_short_name'])) { + $v_path_info = pathinfo($p_filename); + $v_dir = ''; + if ($v_path_info['dirname'] != '') { + $v_dir = $v_path_info['dirname'].'/'; + } + $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; + } + else { + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + } + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } + // ----- Look for partial path remove + else if ($p_remove_dir != "") { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= "/"; + + if ( (substr($p_filename, 0, 2) == "./") + || (substr($p_remove_dir, 0, 2) == "./")) { + + if ( (substr($p_filename, 0, 2) == "./") + && (substr($p_remove_dir, 0, 2) != "./")) { + $p_remove_dir = "./".$p_remove_dir; + } + if ( (substr($p_filename, 0, 2) != "./") + && (substr($p_remove_dir, 0, 2) == "./")) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, + $v_stored_filename); + if ($v_compare > 0) { + if ($v_compare == 2) { + $v_stored_filename = ""; + } + else { + $v_stored_filename = substr($v_stored_filename, + strlen($p_remove_dir)); + } + } + } + + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); + + // ----- Look for path to add + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + } + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + $p_filedescr['stored_filename'] = $v_stored_filename; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteFileHeader(&$p_header) + { + $v_result=1; + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, + $p_header['version_extracted'], $p_header['flag'], + $p_header['compression'], $v_mtime, $v_mdate, + $p_header['crc'], $p_header['compressed_size'], + $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralFileHeader(&$p_header) + { + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, + $p_header['version'], $p_header['version_extracted'], + $p_header['flag'], $p_header['compression'], + $v_mtime, $v_mdate, $p_header['crc'], + $p_header['compressed_size'], $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len'], $p_header['comment_len'], + $p_header['disk'], $p_header['internal'], + $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) + { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) + { + $v_result=1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, + $p_nb_entries, $p_size, + $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) + { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privList(&$p_list) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the central directory information + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) + { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file information from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // $p_info['crc'] = CRC of the file content. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privConvertHeader2FileInfo($p_header, &$p_info) + { + $v_result=1; + + // ----- Get the interesting attributes + $v_temp_path = PclZipUtilPathReduction($p_header['filename']); + $p_info['filename'] = $v_temp_path; + $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); + $p_info['stored_filename'] = $v_temp_path; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + $p_info['crc'] = $p_header['crc']; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check the path + if ( ($p_path == "") + || ( (substr($p_path, 0, 1) != "/") + && (substr($p_path, 0, 3) != "../") + && (substr($p_path,1,2)!=":/"))) + $p_path = "./".$p_path; + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + $p_path = substr($p_path, 0, strlen($p_path)-1); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Read the central directory information + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read next Central dir entry + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_extract = true; + } + } + // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + + // ----- Look for no rule, which means extract all the archive + else { + $v_extract = true; + } + + // ----- Check compression method + if ( ($v_extract) + && ( ($v_header['compression'] != 8) + && ($v_header['compression'] != 0))) { + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, + "Filename '".$v_header['stored_filename']."' is " + ."compressed by an unsupported compression " + ."method (".$v_header['compression'].") "); + + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + $v_header['status'] = 'unsupported_encryption'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + "Unsupported encryption for " + ." filename '".$v_header['stored_filename'] + ."'"); + + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + $v_result = $this->privConvertHeader2FileInfo($v_header, + $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) + { + + // ----- Go to the file position + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header['offset'])) + { + // ----- Close the zip file + $this->privCloseFd(); + + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + + $v_string = ''; + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for extraction in standard output + elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for normal extraction + else { + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, + $p_path, $p_remove_path, + $p_remove_all_path, + $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Look for folder entry that not need to be extracted + if (($p_entry['external']&0x00000010)==0x00000010) { + + $p_entry['status'] = "filtered"; + + return $v_result; + } + + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } + + // ----- Look for path to remove + else if ($p_remove_path != "") + { + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) + { + + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) + { + + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + + } + } + + // ----- Add the path + if ($p_path != '') { + $p_entry['filename'] = $p_path."/".$p_entry['filename']; + } + + // ----- Check a base_dir_restriction + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { + $v_inclusion + = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], + $p_entry['filename']); + if ($v_inclusion == 0) { + + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, + "Filename '".$p_entry['filename']."' is " + ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); + + return PclZip::errorCode(); + } + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the information + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) + { + + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, + "Filename '".$p_entry['filename']."' is " + ."already used by an existing directory"); + + return PclZip::errorCode(); + } + } + // ----- Look if file is write protected + else if (!is_writeable($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Filename '".$p_entry['filename']."' exists " + ."and is write protected"); + + return PclZip::errorCode(); + } + } + + // ----- Look if the extracted file is older + else if (filemtime($p_entry['filename']) > $p_entry['mtime']) + { + // ----- Change the file status + if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) + && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { + } + else { + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Newer version of '".$p_entry['filename']."' exists " + ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + + return PclZip::errorCode(); + } + } + } + else { + } + } + + // ----- Check the directory availability and create it if necessary + else { + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) + $v_dir_to_check = $p_entry['filename']; + else if (!strstr($p_entry['filename'], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($p_entry['filename']); + + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { + + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) + { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) + { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + return $v_result; + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + /* Try to speed up the code + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + */ + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Closing the destination file + fclose($v_dest_file); + + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); + + + } + else { + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); + return PclZip::errorCode(); + } + + + // ----- Look for using temporary file to unzip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { + $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Look for extract in memory + else { + + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === FALSE) { + + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; + + return $v_result; + } + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + return $v_result; + } + + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); + + // ----- Closing the destination file + @fclose($v_dest_file); + + } + + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } + + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { + + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileUsingTempFile(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Creates a temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + + // ----- Write gz file format header + $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); + @fwrite($v_dest_file, $v_binary_data, 10); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Write gz file format footer + $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); + @fwrite($v_dest_file, $v_binary_data, 8); + + // ----- Close the temporary file + @fclose($v_dest_file); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + $p_entry['status'] = "write_error"; + return $v_result; + } + + // ----- Open the temporary gz file + if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($v_src_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + @fclose($v_dest_file); + @gzclose($v_src_file); + + // ----- Delete the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileInOutput(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the information + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Trace + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } + else { + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) + { + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the information + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + // if ($p_entry['compressed_size'] == $p_entry['size']) + if ($p_entry['compression'] == 0) { + + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === FALSE) { + // TBC + } + } + + // ----- Trace + } + else { + // TBC : error : can not extract a folder in a string + } + + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Swap the content to header + $v_local_header['content'] = $p_string; + $p_string = ''; + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Swap back the content to header + $p_string = $v_local_header['content']; + unset($v_local_header['content']); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); + + // ----- Get filename + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + + // ----- Get extra_fields + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } + else { + $p_header['extra'] = ''; + } + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + $p_header['compression'] = $v_data['compression']; + $p_header['size'] = $v_data['size']; + $p_header['compressed_size'] = $v_data['compressed_size']; + $p_header['crc'] = $v_data['crc']; + $p_header['flag'] = $v_data['flag']; + $p_header['filename_len'] = $v_data['filename_len']; + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadCentralFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); + + // ----- Get filename + if ($p_header['filename_len'] != 0) + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + else + $p_header['filename'] = ''; + + // ----- Get extra + if ($p_header['extra_len'] != 0) + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + else + $p_header['extra'] = ''; + + // ----- Get comment + if ($p_header['comment_len'] != 0) + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + else + $p_header['comment'] = ''; + + // ----- Extract properties + + // ----- Recuperate date in UNIX format + //if ($p_header['mdate'] && $p_header['mtime']) + // TBC : bug : this was ignoring time with 0/0/0 + if (1) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + } + + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + function privCheckFileHeaders(&$p_local_header, &$p_central_header) + { + $v_result=1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + $p_local_header['size'] = $p_central_header['size']; + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + $p_local_header['crc'] = $p_central_header['crc']; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadEndCentralDir(&$p_central_dir) + { + $v_result=1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + @fseek($this->zip_fd, $v_size); + if (@ftell($this->zip_fd) != $v_size) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + @fseek($this->zip_fd, $v_size-22); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = @unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) + $v_maximum_size = $v_size; + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) + { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + //$v_bytes = ($v_bytes << 8) | Ord($v_byte); + // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number + // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. + $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) + { + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { + + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'The central dir is not at the end of the archive.' + .' Some trailing bytes exists after the archive.'); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) { + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + } + else + $p_central_dir['comment'] = ''; + + $p_central_dir['entries'] = $v_data['entries']; + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + $p_central_dir['offset'] = $v_data['offset']; + $p_central_dir['size'] = $v_data['size']; + $p_central_dir['disk'] = $v_data['disk']; + $p_central_dir['disk_start'] = $v_data['disk_start']; + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + //} + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDeleteByRule(&$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory information + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + return $v_result; + } + + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ + && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + } + // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + else { + $v_found = true; + } + + // ----- Look for deletion + if ($v_found) + { + unset($v_header_list[$v_nb_extracted]); + } + else + { + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + + // ----- Creates a temporary file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $izip_fd); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, + $v_header_list[$i]) != 1) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + + // ----- Re-Create the Central Dir files header + for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } + + // ----- Remove every files : reset the file + else if ($v_central_dir['entries'] != 0) { + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + return $v_result; + } + + $this->privCloseFd(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function privDirCheck($p_dir, $p_is_dir=false) + { + $v_result = 1; + + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1)=='/')) + { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) + { + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + + // ----- Just a check + if ($p_parent_dir != $p_dir) + { + // ----- Look for parent directory + if ($p_parent_dir != "") + { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) + { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privMerge(&$p_archive_to_add) + { + $v_result=1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) + { + + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) + { + + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory information + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Open the archive_to_add file + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) + { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory information + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->zip_fd); + + // ----- Creates a temporary file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDuplicate($p_archive_filename) + { + $v_result=1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) + { + + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) + { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorLog($p_error_code=0, $p_error_string='') + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } + else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorReset() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } + else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDisableMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDisableMagicQuotes() + { + $v_result=1; + + // EDIT for WordPress 5.3.0 + // magic_quote functions are deprecated in PHP 7.4, now assuming it's always off. + /* + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if already done + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Get and memorize the magic_quote value + $this->magic_quotes_status = @get_magic_quotes_runtime(); + + // ----- Disable magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime(0); + } + */ + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privSwapBackMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privSwapBackMagicQuotes() + { + $v_result=1; + + // EDIT for WordPress 5.3.0 + // magic_quote functions are deprecated in PHP 7.4, now assuming it's always off. + /* + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if something to do + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Swap back magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime($this->magic_quotes_status); + } + + */ + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + } + // End of class + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathReduction() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilPathReduction($p_dir) + { + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + $v_skip = 0; + for ($i=sizeof($v_list)-1; $i>=0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } + else if ($v_list[$i] == "..") { + $v_skip++; + } + else if ($v_list[$i] == "") { + // ----- First '/' i.e. root slash + if ($i == 0) { + $v_result = "/".$v_result; + if ($v_skip > 0) { + // ----- It is an invalid path, so the path is not modified + // TBC + $v_result = $p_dir; + $v_skip = 0; + } + } + // ----- Last '/' i.e. indicates a directory + else if ($i == (sizeof($v_list)-1)) { + $v_result = $v_list[$i]; + } + // ----- Double '/' inside the path + else { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + } + else { + // ----- Look for item to skip + if ($v_skip > 0) { + $v_skip--; + } + else { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Look for skip + if ($v_skip > 0) { + while ($v_skip > 0) { + $v_result = '../'.$v_result; + $v_skip--; + } + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathInclusion() + // Description : + // This function indicates if the path $p_path is under the $p_dir tree. Or, + // said in an other way, if the file or sub-dir $p_path is inside the dir + // $p_dir. + // The function indicates also if the path is exactly the same as the dir. + // This function supports path with duplicated '/' like '//', but does not + // support '.' or '..' statements. + // Parameters : + // Return Values : + // 0 if $p_path is not inside directory $p_dir + // 1 if $p_path is inside directory $p_dir + // 2 if $p_path is exactly the same as $p_dir + // -------------------------------------------------------------------------------- + function PclZipUtilPathInclusion($p_dir, $p_path) + { + $v_result = 1; + + // ----- Look for path beginning by ./ + if ( ($p_dir == '.') + || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { + $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); + } + if ( ($p_path == '.') + || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { + $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); + } + + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } + + // ----- Look if everything seems to be the same + if ($v_result) { + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } + else if ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilCopyBlock() + // Description : + // Parameters : + // $p_mode : read/write compression mode + // 0 : src & dest normal + // 1 : src gzip, dest normal + // 2 : src normal, dest gzip + // 3 : src & dest gzip + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) + { + $v_result = 1; + + if ($p_mode==0) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==1) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==2) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==3) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilRename() + // Description : + // This function tries to do a simple rename() function. If it fails, it + // tries to copy the $p_src file in a new $p_dest file and then unlink the + // first one. + // Parameters : + // $p_src : Old filename + // $p_dest : New filename + // Return Values : + // 1 on success, 0 on failure. + // -------------------------------------------------------------------------------- + function PclZipUtilRename($p_src, $p_dest) + { + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + $v_result = 0; + } + else if (!@unlink($p_src)) { + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilOptionText() + // Description : + // Translate option value in text. Mainly for debug purpose. + // Parameters : + // $p_option : the option value. + // Return Values : + // The option text value. + // -------------------------------------------------------------------------------- + function PclZipUtilOptionText($p_option) + { + + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if (( ($v_prefix == 'PCLZIP_OPT') + || ($v_prefix == 'PCLZIP_CB_') + || ($v_prefix == 'PCLZIP_ATT')) + && ($v_list[$v_key] == $p_option)) { + return $v_key; + } + } + + $v_result = 'Unknown'; + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilTranslateWinPath() + // Description : + // Translate windows path by replacing '\' by '/' and optionally removing + // drive letter. + // Parameters : + // $p_path : path to translate. + // $p_remove_disk_letter : true | false + // Return Values : + // The path translated. + // -------------------------------------------------------------------------------- + function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) + { + if (stristr(php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } + return $p_path; + } + // -------------------------------------------------------------------------------- + + +?> diff --git a/wp-admin/includes/class-plugin-installer-skin.php b/wp-admin/includes/class-plugin-installer-skin.php new file mode 100644 index 0000000..9ee23be --- /dev/null +++ b/wp-admin/includes/class-plugin-installer-skin.php @@ -0,0 +1,141 @@ + 'web', + 'url' => '', + 'plugin' => '', + 'nonce' => '', + 'title' => '', + ); + $args = wp_parse_args( $args, $defaults ); + + $this->type = $args['type']; + $this->api = isset( $args['api'] ) ? $args['api'] : array(); + + parent::__construct( $args ); + } + + /** + */ + public function before() { + if ( ! empty( $this->api ) ) { + $this->upgrader->strings['process_success'] = sprintf( + /* translators: 1: Plugin name, 2: Plugin version. */ + __( 'Successfully installed the plugin %1$s %2$s.' ), + $this->api->name, + $this->api->version + ); + } + } + + /** + */ + public function after() { + $plugin_file = $this->upgrader->plugin_info(); + + $install_actions = array(); + + $from = isset( $_GET['from'] ) ? wp_unslash( $_GET['from'] ) : 'plugins'; + + if ( 'import' == $from ) { + $install_actions['activate_plugin'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=activate&from=import&plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ), + __( 'Activate Plugin & Run Importer' ) + ); + } elseif ( 'press-this' == $from ) { + $install_actions['activate_plugin'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=activate&from=press-this&plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ), + __( 'Activate Plugin & Return to Press This' ) + ); + } else { + $install_actions['activate_plugin'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=activate&plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ), + __( 'Activate Plugin' ) + ); + } + + if ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) { + $install_actions['network_activate'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=activate&networkwide=1&plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ), + __( 'Network Activate' ) + ); + unset( $install_actions['activate_plugin'] ); + } + + if ( 'import' === $from ) { + $install_actions['importers_page'] = sprintf( + '%s', + admin_url( 'import.php' ), + __( 'Return to Importers' ) + ); + } elseif ( 'web' === $this->type ) { + $install_actions['plugins_page'] = sprintf( + '%s', + self_admin_url( 'plugin-install.php' ), + __( 'Return to Plugin Installer' ) + ); + } elseif ( 'upload' === $this->type && 'plugins' === $from ) { + $install_actions['plugins_page'] = sprintf( + '%s', + self_admin_url( 'plugin-install.php' ), + __( 'Return to Plugin Installer' ) + ); + } else { + $install_actions['plugins_page'] = sprintf( + '%s', + self_admin_url( 'plugins.php' ), + __( 'Return to Plugins page' ) + ); + } + + if ( ! $this->result || is_wp_error( $this->result ) ) { + unset( $install_actions['activate_plugin'], $install_actions['network_activate'] ); + } elseif ( ! current_user_can( 'activate_plugin', $plugin_file ) ) { + unset( $install_actions['activate_plugin'] ); + } + + /** + * Filters the list of action links available following a single plugin installation. + * + * @since 2.7.0 + * + * @param string[] $install_actions Array of plugin action links. + * @param object $api Object containing WordPress.org API plugin data. Empty + * for non-API installs, such as when a plugin is installed + * via upload. + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + */ + $install_actions = apply_filters( 'install_plugin_complete_actions', $install_actions, $this->api, $plugin_file ); + + if ( ! empty( $install_actions ) ) { + $this->feedback( implode( ' ', (array) $install_actions ) ); + } + } +} diff --git a/wp-admin/includes/class-plugin-upgrader-skin.php b/wp-admin/includes/class-plugin-upgrader-skin.php new file mode 100644 index 0000000..f4a119b --- /dev/null +++ b/wp-admin/includes/class-plugin-upgrader-skin.php @@ -0,0 +1,89 @@ + '', + 'plugin' => '', + 'nonce' => '', + 'title' => __( 'Update Plugin' ), + ); + $args = wp_parse_args( $args, $defaults ); + + $this->plugin = $args['plugin']; + + $this->plugin_active = is_plugin_active( $this->plugin ); + $this->plugin_network_active = is_plugin_active_for_network( $this->plugin ); + + parent::__construct( $args ); + } + + /** + */ + public function after() { + $this->plugin = $this->upgrader->plugin_info(); + if ( ! empty( $this->plugin ) && ! is_wp_error( $this->result ) && $this->plugin_active ) { + // Currently used only when JS is off for a single plugin update? + printf( + '', + esc_attr__( 'Update progress' ), + wp_nonce_url( 'update.php?action=activate-plugin&networkwide=' . $this->plugin_network_active . '&plugin=' . urlencode( $this->plugin ), 'activate-plugin_' . $this->plugin ) + ); + } + + $this->decrement_update_count( 'plugin' ); + + $update_actions = array( + 'activate_plugin' => sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=activate&plugin=' . urlencode( $this->plugin ), 'activate-plugin_' . $this->plugin ), + __( 'Activate Plugin' ) + ), + 'plugins_page' => sprintf( + '%s', + self_admin_url( 'plugins.php' ), + __( 'Return to Plugins page' ) + ), + ); + + if ( $this->plugin_active || ! $this->result || is_wp_error( $this->result ) || ! current_user_can( 'activate_plugin', $this->plugin ) ) { + unset( $update_actions['activate_plugin'] ); + } + + /** + * Filters the list of action links available following a single plugin update. + * + * @since 2.7.0 + * + * @param string[] $update_actions Array of plugin action links. + * @param string $plugin Path to the plugin file relative to the plugins directory. + */ + $update_actions = apply_filters( 'update_plugin_complete_actions', $update_actions, $this->plugin ); + + if ( ! empty( $update_actions ) ) { + $this->feedback( implode( ' | ', (array) $update_actions ) ); + } + } +} diff --git a/wp-admin/includes/class-plugin-upgrader.php b/wp-admin/includes/class-plugin-upgrader.php new file mode 100644 index 0000000..214f371 --- /dev/null +++ b/wp-admin/includes/class-plugin-upgrader.php @@ -0,0 +1,568 @@ +strings['up_to_date'] = __( 'The plugin is at the latest version.' ); + $this->strings['no_package'] = __( 'Update package not available.' ); + /* translators: %s: Package URL. */ + $this->strings['downloading_package'] = sprintf( __( 'Downloading update from %s…' ), '%s' ); + $this->strings['unpack_package'] = __( 'Unpacking the update…' ); + $this->strings['remove_old'] = __( 'Removing the old version of the plugin…' ); + $this->strings['remove_old_failed'] = __( 'Could not remove the old plugin.' ); + $this->strings['process_failed'] = __( 'Plugin update failed.' ); + $this->strings['process_success'] = __( 'Plugin updated successfully.' ); + $this->strings['process_bulk_success'] = __( 'Plugins updated successfully.' ); + } + + /** + * Initialize the installation strings. + * + * @since 2.8.0 + */ + public function install_strings() { + $this->strings['no_package'] = __( 'Installation package not available.' ); + /* translators: %s: Package URL. */ + $this->strings['downloading_package'] = sprintf( __( 'Downloading installation package from %s…' ), '%s' ); + $this->strings['unpack_package'] = __( 'Unpacking the package…' ); + $this->strings['installing_package'] = __( 'Installing the plugin…' ); + $this->strings['no_files'] = __( 'The plugin contains no files.' ); + $this->strings['process_failed'] = __( 'Plugin installation failed.' ); + $this->strings['process_success'] = __( 'Plugin installed successfully.' ); + } + + /** + * Install a plugin package. + * + * @since 2.8.0 + * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional. + * + * @param string $package The full local path or URI of the package. + * @param array $args { + * Optional. Other arguments for installing a plugin package. Default empty array. + * + * @type bool $clear_update_cache Whether to clear the plugin updates cache if successful. + * Default true. + * } + * @return bool|WP_Error True if the installation was successful, false or a WP_Error otherwise. + */ + public function install( $package, $args = array() ) { + + $defaults = array( + 'clear_update_cache' => true, + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $this->init(); + $this->install_strings(); + + add_filter( 'upgrader_source_selection', array( $this, 'check_package' ) ); + if ( $parsed_args['clear_update_cache'] ) { + // Clear cache so wp_update_plugins() knows about the new plugin. + add_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9, 0 ); + } + + $this->run( + array( + 'package' => $package, + 'destination' => WP_PLUGIN_DIR, + 'clear_destination' => false, // Do not overwrite files. + 'clear_working' => true, + 'hook_extra' => array( + 'type' => 'plugin', + 'action' => 'install', + ), + ) + ); + + remove_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9 ); + remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) ); + + if ( ! $this->result || is_wp_error( $this->result ) ) { + return $this->result; + } + + // Force refresh of plugin update information. + wp_clean_plugins_cache( $parsed_args['clear_update_cache'] ); + + return true; + } + + /** + * Upgrade a plugin. + * + * @since 2.8.0 + * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional. + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @param array $args { + * Optional. Other arguments for upgrading a plugin package. Default empty array. + * + * @type bool $clear_update_cache Whether to clear the plugin updates cache if successful. + * Default true. + * } + * @return bool|WP_Error True if the upgrade was successful, false or a WP_Error object otherwise. + */ + public function upgrade( $plugin, $args = array() ) { + + $defaults = array( + 'clear_update_cache' => true, + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $this->init(); + $this->upgrade_strings(); + + $current = get_site_transient( 'update_plugins' ); + if ( ! isset( $current->response[ $plugin ] ) ) { + $this->skin->before(); + $this->skin->set_result( false ); + $this->skin->error( 'up_to_date' ); + $this->skin->after(); + return false; + } + + // Get the URL to the zip file. + $r = $current->response[ $plugin ]; + + add_filter( 'upgrader_pre_install', array( $this, 'deactivate_plugin_before_upgrade' ), 10, 2 ); + add_filter( 'upgrader_pre_install', array( $this, 'active_before' ), 10, 2 ); + add_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ), 10, 4 ); + add_filter( 'upgrader_post_install', array( $this, 'active_after' ), 10, 2 ); + // There's a Trac ticket to move up the directory for zips which are made a bit differently, useful for non-.org plugins. + // 'source_selection' => array( $this, 'source_selection' ), + if ( $parsed_args['clear_update_cache'] ) { + // Clear cache so wp_update_plugins() knows about the new plugin. + add_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9, 0 ); + } + + $this->run( + array( + 'package' => $r->package, + 'destination' => WP_PLUGIN_DIR, + 'clear_destination' => true, + 'clear_working' => true, + 'hook_extra' => array( + 'plugin' => $plugin, + 'type' => 'plugin', + 'action' => 'update', + ), + ) + ); + + // Cleanup our hooks, in case something else does a upgrade on this connection. + remove_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9 ); + remove_filter( 'upgrader_pre_install', array( $this, 'deactivate_plugin_before_upgrade' ) ); + remove_filter( 'upgrader_pre_install', array( $this, 'active_before' ) ); + remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ) ); + remove_filter( 'upgrader_post_install', array( $this, 'active_after' ) ); + + if ( ! $this->result || is_wp_error( $this->result ) ) { + return $this->result; + } + + // Force refresh of plugin update information. + wp_clean_plugins_cache( $parsed_args['clear_update_cache'] ); + + return true; + } + + /** + * Bulk upgrade several plugins at once. + * + * @since 2.8.0 + * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional. + * + * @param string[] $plugins Array of paths to plugin files relative to the plugins directory. + * @param array $args { + * Optional. Other arguments for upgrading several plugins at once. + * + * @type bool $clear_update_cache Whether to clear the plugin updates cache if successful. Default true. + * } + * @return array|false An array of results indexed by plugin file, or false if unable to connect to the filesystem. + */ + public function bulk_upgrade( $plugins, $args = array() ) { + + $defaults = array( + 'clear_update_cache' => true, + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $this->init(); + $this->bulk = true; + $this->upgrade_strings(); + + $current = get_site_transient( 'update_plugins' ); + + 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 ) ); + 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++; + $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' => $r->package, + 'destination' => WP_PLUGIN_DIR, + 'clear_destination' => true, + '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 ); + + // Force refresh of plugin update information. + wp_clean_plugins_cache( $parsed_args['clear_update_cache'] ); + + /** This action is documented in wp-admin/includes/class-wp-upgrader.php */ + do_action( + 'upgrader_process_complete', + $this, + array( + 'action' => 'update', + '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. + remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_plugin' ) ); + + return $results; + } + + /** + * Check a source package to be sure it contains a plugin. + * + * This function is added to the {@see 'upgrader_source_selection'} filter by + * Plugin_Upgrader::install(). + * + * @since 3.3.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $source The path to the downloaded package source. + * @return string|WP_Error The source as passed, or a WP_Error object + * if no plugins were found. + */ + public function check_package( $source ) { + global $wp_filesystem; + + if ( is_wp_error( $source ) ) { + return $source; + } + + $working_directory = str_replace( $wp_filesystem->wp_content_dir(), trailingslashit( WP_CONTENT_DIR ), $source ); + if ( ! is_dir( $working_directory ) ) { // Sanity check, if the above fails, let's not prevent installation. + return $source; + } + + // Check that the folder contains at least 1 valid plugin. + $plugins_found = false; + $files = glob( $working_directory . '*.php' ); + if ( $files ) { + foreach ( $files as $file ) { + $info = get_plugin_data( $file, false, false ); + if ( ! empty( $info['Name'] ) ) { + $plugins_found = true; + break; + } + } + } + + if ( ! $plugins_found ) { + return new WP_Error( 'incompatible_archive_no_plugins', $this->strings['incompatible_archive'], __( 'No valid plugins were found.' ) ); + } + + return $source; + } + + /** + * Retrieve the path to the file that contains the plugin info. + * + * This isn't used internally in the class, but is called by the skins. + * + * @since 2.8.0 + * + * @return string|false The full path to the main plugin file, or false. + */ + public function plugin_info() { + if ( ! is_array( $this->result ) ) { + return false; + } + if ( empty( $this->result['destination_name'] ) ) { + return false; + } + + // Ensure to pass with leading slash. + $plugin = get_plugins( '/' . $this->result['destination_name'] ); + if ( empty( $plugin ) ) { + return false; + } + + // Assume the requested plugin is the first in the list. + $pluginfiles = array_keys( $plugin ); + + return $this->result['destination_name'] . '/' . $pluginfiles[0]; + } + + /** + * Deactivates a plugin before it is upgraded. + * + * Hooked to the {@see 'upgrader_pre_install'} filter by Plugin_Upgrader::upgrade(). + * + * @since 2.8.0 + * @since 4.1.0 Added a return value. + * + * @param bool|WP_Error $return Upgrade offer return. + * @param array $plugin Plugin package arguments. + * @return bool|WP_Error The passed in $return param or WP_Error. + */ + public function deactivate_plugin_before_upgrade( $return, $plugin ) { + + if ( is_wp_error( $return ) ) { // Bypass. + return $return; + } + + // When in cron (background updates) don't deactivate the plugin, as we require a browser to reactivate it. + if ( wp_doing_cron() ) { + return $return; + } + + $plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : ''; + if ( empty( $plugin ) ) { + return new WP_Error( 'bad_request', $this->strings['bad_request'] ); + } + + if ( is_plugin_active( $plugin ) ) { + // Deactivate the plugin silently, Prevent deactivation hooks from running. + deactivate_plugins( $plugin, true ); + } + + return $return; + } + + /** + * Turns on maintenance mode before attempting to background update an active plugin. + * + * Hooked to the {@see 'upgrader_pre_install'} filter by Plugin_Upgrader::upgrade(). + * + * @since 5.4.0 + * + * @param bool|WP_Error $return Upgrade offer return. + * @param array $plugin Plugin package arguments. + * @return bool|WP_Error The passed in $return param or WP_Error. + */ + public function active_before( $return, $plugin ) { + if ( is_wp_error( $return ) ) { + return $return; + } + + // Only enable maintenance mode when in cron (background update). + if ( ! wp_doing_cron() ) { + return $return; + } + + $plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : ''; + + // Only run if plugin is active. + if ( ! is_plugin_active( $plugin ) ) { + return $return; + } + + // Change to maintenance mode. Bulk edit handles this separately. + if ( ! $this->bulk ) { + $this->maintenance_mode( true ); + } + + return $return; + } + + /** + * Turns off maintenance mode after upgrading an active plugin. + * + * Hooked to the {@see 'upgrader_post_install'} filter by Plugin_Upgrader::upgrade(). + * + * @since 5.4.0 + * + * @param bool|WP_Error $return Upgrade offer return. + * @param array $plugin Plugin package arguments. + * @return bool|WP_Error The passed in $return param or WP_Error. + */ + public function active_after( $return, $plugin ) { + if ( is_wp_error( $return ) ) { + return $return; + } + + // Only disable maintenance mode when in cron (background update). + if ( ! wp_doing_cron() ) { + return $return; + } + + $plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : ''; + + // Only run if plugin is active + if ( ! is_plugin_active( $plugin ) ) { + return $return; + } + + // Time to remove maintenance mode. Bulk edit handles this separately. + if ( ! $this->bulk ) { + $this->maintenance_mode( false ); + } + + return $return; + } + + /** + * Deletes the old plugin during an upgrade. + * + * Hooked to the {@see 'upgrader_clear_destination'} filter by + * Plugin_Upgrader::upgrade() and Plugin_Upgrader::bulk_upgrade(). + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param bool|WP_Error $removed Whether the destination was cleared. + * True on success, WP_Error on failure. + * @param string $local_destination The local package destination. + * @param string $remote_destination The remote package destination. + * @param array $plugin Extra arguments passed to hooked filters. + * @return bool|WP_Error + */ + public function delete_old_plugin( $removed, $local_destination, $remote_destination, $plugin ) { + global $wp_filesystem; + + if ( is_wp_error( $removed ) ) { + return $removed; // Pass errors through. + } + + $plugin = isset( $plugin['plugin'] ) ? $plugin['plugin'] : ''; + if ( empty( $plugin ) ) { + return new WP_Error( 'bad_request', $this->strings['bad_request'] ); + } + + $plugins_dir = $wp_filesystem->wp_plugins_dir(); + $this_plugin_dir = trailingslashit( dirname( $plugins_dir . $plugin ) ); + + if ( ! $wp_filesystem->exists( $this_plugin_dir ) ) { // If it's already vanished. + return $removed; + } + + // If plugin is in its own directory, recursively delete the directory. + // Base check on if plugin includes directory separator AND that it's not the root plugin folder. + if ( strpos( $plugin, '/' ) && $this_plugin_dir != $plugins_dir ) { + $deleted = $wp_filesystem->delete( $this_plugin_dir, true ); + } else { + $deleted = $wp_filesystem->delete( $plugins_dir . $plugin ); + } + + if ( ! $deleted ) { + return new WP_Error( 'remove_old_failed', $this->strings['remove_old_failed'] ); + } + + return true; + } +} diff --git a/wp-admin/includes/class-theme-installer-skin.php b/wp-admin/includes/class-theme-installer-skin.php new file mode 100644 index 0000000..f568766 --- /dev/null +++ b/wp-admin/includes/class-theme-installer-skin.php @@ -0,0 +1,150 @@ + 'web', + 'url' => '', + 'theme' => '', + 'nonce' => '', + 'title' => '', + ); + $args = wp_parse_args( $args, $defaults ); + + $this->type = $args['type']; + $this->api = isset( $args['api'] ) ? $args['api'] : array(); + + parent::__construct( $args ); + } + + /** + */ + public function before() { + if ( ! empty( $this->api ) ) { + $this->upgrader->strings['process_success'] = sprintf( + $this->upgrader->strings['process_success_specific'], + $this->api->name, + $this->api->version + ); + } + } + + /** + */ + public function after() { + if ( empty( $this->upgrader->result['destination_name'] ) ) { + return; + } + + $theme_info = $this->upgrader->theme_info(); + if ( empty( $theme_info ) ) { + return; + } + + $name = $theme_info->display( 'Name' ); + $stylesheet = $this->upgrader->result['destination_name']; + $template = $theme_info->get_template(); + + $activate_link = add_query_arg( + array( + 'action' => 'activate', + 'template' => urlencode( $template ), + 'stylesheet' => urlencode( $stylesheet ), + ), + admin_url( 'themes.php' ) + ); + $activate_link = wp_nonce_url( $activate_link, 'switch-theme_' . $stylesheet ); + + $install_actions = array(); + + if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { + $customize_url = add_query_arg( + array( + 'theme' => urlencode( $stylesheet ), + 'return' => urlencode( admin_url( 'web' === $this->type ? 'theme-install.php' : 'themes.php' ) ), + ), + admin_url( 'customize.php' ) + ); + + $install_actions['preview'] = sprintf( + '' . + '%s', + esc_url( $customize_url ), + __( 'Live Preview' ), + /* translators: %s: Theme name. */ + sprintf( __( 'Live Preview “%s”' ), $name ) + ); + } + + $install_actions['activate'] = sprintf( + '' . + '%s', + esc_url( $activate_link ), + __( 'Activate' ), + /* translators: %s: Theme name. */ + sprintf( __( 'Activate “%s”' ), $name ) + ); + + if ( is_network_admin() && current_user_can( 'manage_network_themes' ) ) { + $install_actions['network_enable'] = sprintf( + '%s', + esc_url( wp_nonce_url( 'themes.php?action=enable&theme=' . urlencode( $stylesheet ), 'enable-theme_' . $stylesheet ) ), + __( 'Network Enable' ) + ); + } + + if ( 'web' === $this->type ) { + $install_actions['themes_page'] = sprintf( + '%s', + self_admin_url( 'theme-install.php' ), + __( 'Return to Theme Installer' ) + ); + } elseif ( current_user_can( 'switch_themes' ) || current_user_can( 'edit_theme_options' ) ) { + $install_actions['themes_page'] = sprintf( + '%s', + self_admin_url( 'themes.php' ), + __( 'Return to Themes page' ) + ); + } + + if ( ! $this->result || is_wp_error( $this->result ) || is_network_admin() || ! current_user_can( 'switch_themes' ) ) { + unset( $install_actions['activate'], $install_actions['preview'] ); + } + + /** + * Filters the list of action links available following a single theme installation. + * + * @since 2.8.0 + * + * @param string[] $install_actions Array of theme action links. + * @param object $api Object containing WordPress.org API theme data. + * @param string $stylesheet Theme directory name. + * @param WP_Theme $theme_info Theme object. + */ + $install_actions = apply_filters( 'install_theme_complete_actions', $install_actions, $this->api, $stylesheet, $theme_info ); + if ( ! empty( $install_actions ) ) { + $this->feedback( implode( ' | ', (array) $install_actions ) ); + } + } +} diff --git a/wp-admin/includes/class-theme-upgrader-skin.php b/wp-admin/includes/class-theme-upgrader-skin.php new file mode 100644 index 0000000..31e540b --- /dev/null +++ b/wp-admin/includes/class-theme-upgrader-skin.php @@ -0,0 +1,126 @@ + '', + 'theme' => '', + 'nonce' => '', + 'title' => __( 'Update Theme' ), + ); + $args = wp_parse_args( $args, $defaults ); + + $this->theme = $args['theme']; + + parent::__construct( $args ); + } + + /** + */ + public function after() { + $this->decrement_update_count( 'theme' ); + + $update_actions = array(); + $theme_info = $this->upgrader->theme_info(); + if ( $theme_info ) { + $name = $theme_info->display( 'Name' ); + $stylesheet = $this->upgrader->result['destination_name']; + $template = $theme_info->get_template(); + + $activate_link = add_query_arg( + array( + 'action' => 'activate', + 'template' => urlencode( $template ), + 'stylesheet' => urlencode( $stylesheet ), + ), + admin_url( 'themes.php' ) + ); + $activate_link = wp_nonce_url( $activate_link, 'switch-theme_' . $stylesheet ); + + $customize_url = add_query_arg( + array( + 'theme' => urlencode( $stylesheet ), + 'return' => urlencode( admin_url( 'themes.php' ) ), + ), + admin_url( 'customize.php' ) + ); + + if ( get_stylesheet() == $stylesheet ) { + if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { + $update_actions['preview'] = sprintf( + '' . + '%s', + esc_url( $customize_url ), + __( 'Customize' ), + /* translators: %s: Theme name. */ + sprintf( __( 'Customize “%s”' ), $name ) + ); + } + } elseif ( current_user_can( 'switch_themes' ) ) { + if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { + $update_actions['preview'] = sprintf( + '' . + '%s', + esc_url( $customize_url ), + __( 'Live Preview' ), + /* translators: %s: Theme name. */ + sprintf( __( 'Live Preview “%s”' ), $name ) + ); + } + + $update_actions['activate'] = sprintf( + '' . + '%s', + esc_url( $activate_link ), + __( 'Activate' ), + /* translators: %s: Theme name. */ + sprintf( __( 'Activate “%s”' ), $name ) + ); + } + + if ( ! $this->result || is_wp_error( $this->result ) || is_network_admin() ) { + unset( $update_actions['preview'], $update_actions['activate'] ); + } + } + + $update_actions['themes_page'] = sprintf( + '%s', + self_admin_url( 'themes.php' ), + __( 'Return to Themes page' ) + ); + + /** + * Filters the list of action links available following a single theme update. + * + * @since 2.8.0 + * + * @param string[] $update_actions Array of theme action links. + * @param string $theme Theme directory name. + */ + $update_actions = apply_filters( 'update_theme_complete_actions', $update_actions, $this->theme ); + + if ( ! empty( $update_actions ) ) { + $this->feedback( implode( ' | ', (array) $update_actions ) ); + } + } +} diff --git a/wp-admin/includes/class-theme-upgrader.php b/wp-admin/includes/class-theme-upgrader.php new file mode 100644 index 0000000..9d561c0 --- /dev/null +++ b/wp-admin/includes/class-theme-upgrader.php @@ -0,0 +1,654 @@ +strings['up_to_date'] = __( 'The theme is at the latest version.' ); + $this->strings['no_package'] = __( 'Update package not available.' ); + /* translators: %s: Package URL. */ + $this->strings['downloading_package'] = sprintf( __( 'Downloading update from %s…' ), '%s' ); + $this->strings['unpack_package'] = __( 'Unpacking the update…' ); + $this->strings['remove_old'] = __( 'Removing the old version of the theme…' ); + $this->strings['remove_old_failed'] = __( 'Could not remove the old theme.' ); + $this->strings['process_failed'] = __( 'Theme update failed.' ); + $this->strings['process_success'] = __( 'Theme updated successfully.' ); + } + + /** + * Initialize the installation strings. + * + * @since 2.8.0 + */ + public function install_strings() { + $this->strings['no_package'] = __( 'Installation package not available.' ); + /* translators: %s: Package URL. */ + $this->strings['downloading_package'] = sprintf( __( 'Downloading installation package from %s…' ), '%s' ); + $this->strings['unpack_package'] = __( 'Unpacking the package…' ); + $this->strings['installing_package'] = __( 'Installing the theme…' ); + $this->strings['no_files'] = __( 'The theme contains no files.' ); + $this->strings['process_failed'] = __( 'Theme installation failed.' ); + $this->strings['process_success'] = __( 'Theme installed successfully.' ); + /* translators: 1: Theme name, 2: Theme version. */ + $this->strings['process_success_specific'] = __( 'Successfully installed the theme %1$s %2$s.' ); + $this->strings['parent_theme_search'] = __( 'This theme requires a parent theme. Checking if it is installed…' ); + /* translators: 1: Theme name, 2: Theme version. */ + $this->strings['parent_theme_prepare_install'] = __( 'Preparing to install %1$s %2$s…' ); + /* translators: 1: Theme name, 2: Theme version. */ + $this->strings['parent_theme_currently_installed'] = __( 'The parent theme, %1$s %2$s, is currently installed.' ); + /* translators: 1: Theme name, 2: Theme version. */ + $this->strings['parent_theme_install_success'] = __( 'Successfully installed the parent theme, %1$s %2$s.' ); + /* translators: %s: Theme name. */ + $this->strings['parent_theme_not_found'] = sprintf( __( 'The parent theme could not be found. You will need to install the parent theme, %s, before you can use this child theme.' ), '%s' ); + } + + /** + * Check if a child theme is being installed and we need to install its parent. + * + * Hooked to the {@see 'upgrader_post_install'} filter by Theme_Upgrader::install(). + * + * @since 3.4.0 + * + * @param bool $install_result + * @param array $hook_extra + * @param array $child_result + * @return bool + */ + public function check_parent_theme_filter( $install_result, $hook_extra, $child_result ) { + // Check to see if we need to install a parent theme. + $theme_info = $this->theme_info(); + + if ( ! $theme_info->parent() ) { + return $install_result; + } + + $this->skin->feedback( 'parent_theme_search' ); + + if ( ! $theme_info->parent()->errors() ) { + $this->skin->feedback( 'parent_theme_currently_installed', $theme_info->parent()->display( 'Name' ), $theme_info->parent()->display( 'Version' ) ); + // We already have the theme, fall through. + return $install_result; + } + + // We don't have the parent theme, let's install it. + $api = themes_api( + 'theme_information', + array( + 'slug' => $theme_info->get( 'Template' ), + 'fields' => array( + 'sections' => false, + 'tags' => false, + ), + ) + ); // Save on a bit of bandwidth. + + if ( ! $api || is_wp_error( $api ) ) { + $this->skin->feedback( 'parent_theme_not_found', $theme_info->get( 'Template' ) ); + // Don't show activate or preview actions after installation. + add_filter( 'install_theme_complete_actions', array( $this, 'hide_activate_preview_actions' ) ); + return $install_result; + } + + // Backup required data we're going to override: + $child_api = $this->skin->api; + $child_success_message = $this->strings['process_success']; + + // Override them. + $this->skin->api = $api; + + $this->strings['process_success_specific'] = $this->strings['parent_theme_install_success']; //, $api->name, $api->version ); + + $this->skin->feedback( 'parent_theme_prepare_install', $api->name, $api->version ); + + add_filter( 'install_theme_complete_actions', '__return_false', 999 ); // Don't show any actions after installing the theme. + + // Install the parent theme. + $parent_result = $this->run( + array( + 'package' => $api->download_link, + 'destination' => get_theme_root(), + 'clear_destination' => false, // Do not overwrite files. + 'clear_working' => true, + ) + ); + + if ( is_wp_error( $parent_result ) ) { + add_filter( 'install_theme_complete_actions', array( $this, 'hide_activate_preview_actions' ) ); + } + + // Start cleaning up after the parent's installation. + remove_filter( 'install_theme_complete_actions', '__return_false', 999 ); + + // Reset child's result and data. + $this->result = $child_result; + $this->skin->api = $child_api; + $this->strings['process_success'] = $child_success_message; + + return $install_result; + } + + /** + * Don't display the activate and preview actions to the user. + * + * Hooked to the {@see 'install_theme_complete_actions'} filter by + * Theme_Upgrader::check_parent_theme_filter() when installing + * a child theme and installing the parent theme fails. + * + * @since 3.4.0 + * + * @param array $actions Preview actions. + * @return array + */ + public function hide_activate_preview_actions( $actions ) { + unset( $actions['activate'], $actions['preview'] ); + return $actions; + } + + /** + * Install a theme package. + * + * @since 2.8.0 + * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional. + * + * @param string $package The full local path or URI of the package. + * @param array $args { + * Optional. Other arguments for installing a theme package. Default empty array. + * + * @type bool $clear_update_cache Whether to clear the updates cache if successful. + * Default true. + * } + * + * @return bool|WP_Error True if the installation was successful, false or a WP_Error object otherwise. + */ + public function install( $package, $args = array() ) { + + $defaults = array( + 'clear_update_cache' => true, + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $this->init(); + $this->install_strings(); + + add_filter( 'upgrader_source_selection', array( $this, 'check_package' ) ); + add_filter( 'upgrader_post_install', array( $this, 'check_parent_theme_filter' ), 10, 3 ); + if ( $parsed_args['clear_update_cache'] ) { + // Clear cache so wp_update_themes() knows about the new theme. + add_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9, 0 ); + } + + $this->run( + array( + 'package' => $package, + 'destination' => get_theme_root(), + 'clear_destination' => false, // Do not overwrite files. + 'clear_working' => true, + 'hook_extra' => array( + 'type' => 'theme', + 'action' => 'install', + ), + ) + ); + + remove_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9 ); + remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) ); + remove_filter( 'upgrader_post_install', array( $this, 'check_parent_theme_filter' ) ); + + if ( ! $this->result || is_wp_error( $this->result ) ) { + return $this->result; + } + + // Refresh the Theme Update information. + wp_clean_themes_cache( $parsed_args['clear_update_cache'] ); + + return true; + } + + /** + * Upgrade a theme. + * + * @since 2.8.0 + * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional. + * + * @param string $theme The theme slug. + * @param array $args { + * Optional. Other arguments for upgrading a theme. Default empty array. + * + * @type bool $clear_update_cache Whether to clear the update cache if successful. + * Default true. + * } + * @return bool|WP_Error True if the upgrade was successful, false or a WP_Error object otherwise. + */ + public function upgrade( $theme, $args = array() ) { + + $defaults = array( + 'clear_update_cache' => true, + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $this->init(); + $this->upgrade_strings(); + + // Is an update available? + $current = get_site_transient( 'update_themes' ); + if ( ! isset( $current->response[ $theme ] ) ) { + $this->skin->before(); + $this->skin->set_result( false ); + $this->skin->error( 'up_to_date' ); + $this->skin->after(); + return false; + } + + $r = $current->response[ $theme ]; + + add_filter( 'upgrader_pre_install', array( $this, 'current_before' ), 10, 2 ); + add_filter( 'upgrader_post_install', array( $this, 'current_after' ), 10, 2 ); + add_filter( 'upgrader_clear_destination', array( $this, 'delete_old_theme' ), 10, 4 ); + if ( $parsed_args['clear_update_cache'] ) { + // Clear cache so wp_update_themes() knows about the new theme. + add_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9, 0 ); + } + + $this->run( + array( + 'package' => $r['package'], + 'destination' => get_theme_root( $theme ), + 'clear_destination' => true, + 'clear_working' => true, + 'hook_extra' => array( + 'theme' => $theme, + 'type' => 'theme', + 'action' => 'update', + ), + ) + ); + + remove_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9 ); + remove_filter( 'upgrader_pre_install', array( $this, 'current_before' ) ); + remove_filter( 'upgrader_post_install', array( $this, 'current_after' ) ); + remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_theme' ) ); + + if ( ! $this->result || is_wp_error( $this->result ) ) { + return $this->result; + } + + wp_clean_themes_cache( $parsed_args['clear_update_cache'] ); + + return true; + } + + /** + * Upgrade several themes at once. + * + * @since 3.0.0 + * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional. + * + * @param string[] $themes Array of the theme slugs. + * @param array $args { + * Optional. Other arguments for upgrading several themes at once. Default empty array. + * + * @type bool $clear_update_cache Whether to clear the update cache if successful. + * Default true. + * } + * @return array[]|false An array of results, or false if unable to connect to the filesystem. + */ + public function bulk_upgrade( $themes, $args = array() ) { + + $defaults = array( + 'clear_update_cache' => true, + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $this->init(); + $this->bulk = true; + $this->upgrade_strings(); + + $current = get_site_transient( 'update_themes' ); + + add_filter( 'upgrader_pre_install', array( $this, 'current_before' ), 10, 2 ); + add_filter( 'upgrader_post_install', array( $this, 'current_after' ), 10, 2 ); + add_filter( 'upgrader_clear_destination', array( $this, 'delete_old_theme' ), 10, 4 ); + + $this->skin->header(); + + // Connect to the filesystem first. + $res = $this->fs_connect( array( WP_CONTENT_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 themes specified, OR + * - a theme with an update available is currently in use. + * @todo For multisite, maintenance mode should only kick in for individual sites if at all possible. + */ + $maintenance = ( is_multisite() && ! empty( $themes ) ); + foreach ( $themes as $theme ) { + $maintenance = $maintenance || get_stylesheet() === $theme || get_template() === $theme; + } + if ( $maintenance ) { + $this->maintenance_mode( true ); + } + + $results = array(); + + $this->update_count = count( $themes ); + $this->update_current = 0; + foreach ( $themes as $theme ) { + $this->update_current++; + + $this->skin->theme_info = $this->theme_info( $theme ); + + if ( ! isset( $current->response[ $theme ] ) ) { + $this->skin->set_result( true ); + $this->skin->before(); + $this->skin->feedback( 'up_to_date' ); + $this->skin->after(); + $results[ $theme ] = true; + continue; + } + + // Get the URL to the zip file. + $r = $current->response[ $theme ]; + + $result = $this->run( + array( + 'package' => $r['package'], + 'destination' => get_theme_root( $theme ), + 'clear_destination' => true, + 'clear_working' => true, + 'is_multi' => true, + 'hook_extra' => array( + 'theme' => $theme, + ), + ) + ); + + $results[ $theme ] = $this->result; + + // Prevent credentials auth screen from displaying multiple times. + if ( false === $result ) { + break; + } + } // End foreach $themes. + + $this->maintenance_mode( false ); + + // Refresh the Theme Update information. + wp_clean_themes_cache( $parsed_args['clear_update_cache'] ); + + /** This action is documented in wp-admin/includes/class-wp-upgrader.php */ + do_action( + 'upgrader_process_complete', + $this, + array( + 'action' => 'update', + 'type' => 'theme', + 'bulk' => true, + 'themes' => $themes, + ) + ); + + $this->skin->bulk_footer(); + + $this->skin->footer(); + + // Cleanup our hooks, in case something else does a upgrade on this connection. + remove_filter( 'upgrader_pre_install', array( $this, 'current_before' ) ); + remove_filter( 'upgrader_post_install', array( $this, 'current_after' ) ); + remove_filter( 'upgrader_clear_destination', array( $this, 'delete_old_theme' ) ); + + return $results; + } + + /** + * Check that the package source contains a valid theme. + * + * Hooked to the {@see 'upgrader_source_selection'} filter by Theme_Upgrader::install(). + * It will return an error if the theme doesn't have style.css or index.php + * files. + * + * @since 3.3.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $source The full path to the package source. + * @return string|WP_Error The source or a WP_Error. + */ + public function check_package( $source ) { + global $wp_filesystem; + + if ( is_wp_error( $source ) ) { + return $source; + } + + // Check that the folder contains a valid theme. + $working_directory = str_replace( $wp_filesystem->wp_content_dir(), trailingslashit( WP_CONTENT_DIR ), $source ); + if ( ! is_dir( $working_directory ) ) { // Sanity check, if the above fails, let's not prevent installation. + return $source; + } + + // A proper archive should have a style.css file in the single subdirectory. + if ( ! file_exists( $working_directory . 'style.css' ) ) { + return new WP_Error( + 'incompatible_archive_theme_no_style', + $this->strings['incompatible_archive'], + sprintf( + /* translators: %s: style.css */ + __( 'The theme is missing the %s stylesheet.' ), + 'style.css' + ) + ); + } + + $info = get_file_data( + $working_directory . 'style.css', + array( + 'Name' => 'Theme Name', + 'Template' => 'Template', + ) + ); + + if ( empty( $info['Name'] ) ) { + return new WP_Error( + 'incompatible_archive_theme_no_name', + $this->strings['incompatible_archive'], + sprintf( + /* translators: %s: style.css */ + __( 'The %s stylesheet doesn’t contain a valid theme header.' ), + 'style.css' + ) + ); + } + + // If it's not a child theme, it must have at least an index.php to be legit. + if ( empty( $info['Template'] ) && ! file_exists( $working_directory . 'index.php' ) ) { + return new WP_Error( + 'incompatible_archive_theme_no_index', + $this->strings['incompatible_archive'], + sprintf( + /* translators: %s: index.php */ + __( 'The theme is missing the %s file.' ), + 'index.php' + ) + ); + } + + return $source; + } + + /** + * Turn on maintenance mode before attempting to upgrade the current theme. + * + * Hooked to the {@see 'upgrader_pre_install'} filter by Theme_Upgrader::upgrade() and + * Theme_Upgrader::bulk_upgrade(). + * + * @since 2.8.0 + * + * @param bool|WP_Error $return Upgrade offer return. + * @param array $theme Theme arguments. + * @return bool|WP_Error The passed in $return param or WP_Error. + */ + public function current_before( $return, $theme ) { + if ( is_wp_error( $return ) ) { + return $return; + } + + $theme = isset( $theme['theme'] ) ? $theme['theme'] : ''; + + // Only run if current theme + if ( get_stylesheet() !== $theme ) { + return $return; + } + + // Change to maintenance mode. Bulk edit handles this separately. + if ( ! $this->bulk ) { + $this->maintenance_mode( true ); + } + + return $return; + } + + /** + * Turn off maintenance mode after upgrading the current theme. + * + * Hooked to the {@see 'upgrader_post_install'} filter by Theme_Upgrader::upgrade() + * and Theme_Upgrader::bulk_upgrade(). + * + * @since 2.8.0 + * + * @param bool|WP_Error $return Upgrade offer return. + * @param array $theme Theme arguments. + * @return bool|WP_Error The passed in $return param or WP_Error. + */ + public function current_after( $return, $theme ) { + if ( is_wp_error( $return ) ) { + return $return; + } + + $theme = isset( $theme['theme'] ) ? $theme['theme'] : ''; + + // Only run if current theme. + if ( get_stylesheet() !== $theme ) { + return $return; + } + + // Ensure stylesheet name hasn't changed after the upgrade: + if ( get_stylesheet() === $theme && $theme != $this->result['destination_name'] ) { + wp_clean_themes_cache(); + $stylesheet = $this->result['destination_name']; + switch_theme( $stylesheet ); + } + + // Time to remove maintenance mode. Bulk edit handles this separately. + if ( ! $this->bulk ) { + $this->maintenance_mode( false ); + } + return $return; + } + + /** + * Delete the old theme during an upgrade. + * + * Hooked to the {@see 'upgrader_clear_destination'} filter by Theme_Upgrader::upgrade() + * and Theme_Upgrader::bulk_upgrade(). + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem Subclass + * + * @param bool $removed + * @param string $local_destination + * @param string $remote_destination + * @param array $theme + * @return bool + */ + public function delete_old_theme( $removed, $local_destination, $remote_destination, $theme ) { + global $wp_filesystem; + + if ( is_wp_error( $removed ) ) { + return $removed; // Pass errors through. + } + + if ( ! isset( $theme['theme'] ) ) { + return $removed; + } + + $theme = $theme['theme']; + $themes_dir = trailingslashit( $wp_filesystem->wp_themes_dir( $theme ) ); + if ( $wp_filesystem->exists( $themes_dir . $theme ) ) { + if ( ! $wp_filesystem->delete( $themes_dir . $theme, true ) ) { + return false; + } + } + + return true; + } + + /** + * Get the WP_Theme object for a theme. + * + * @since 2.8.0 + * @since 3.0.0 The `$theme` argument was added. + * + * @param string $theme The directory name of the theme. This is optional, and if not supplied, + * the directory name from the last result will be used. + * @return WP_Theme|false The theme's info object, or false `$theme` is not supplied + * and the last result isn't set. + */ + public function theme_info( $theme = null ) { + + if ( empty( $theme ) ) { + if ( ! empty( $this->result['destination_name'] ) ) { + $theme = $this->result['destination_name']; + } else { + return false; + } + } + return wp_get_theme( $theme ); + } + +} diff --git a/wp-admin/includes/class-walker-category-checklist.php b/wp-admin/includes/class-walker-category-checklist.php new file mode 100644 index 0000000..488d34d --- /dev/null +++ b/wp-admin/includes/class-walker-category-checklist.php @@ -0,0 +1,128 @@ + 'parent', + 'id' => 'term_id', + ); // TODO: Decouple this. + + /** + * Starts the list before the elements are added. + * + * @see Walker:start_lvl() + * + * @since 2.5.1 + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of category. Used for tab indentation. + * @param array $args An array of arguments. @see wp_terms_checklist() + */ + public function start_lvl( &$output, $depth = 0, $args = array() ) { + $indent = str_repeat( "\t", $depth ); + $output .= "$indent
          \n"; + } + + /** + * Ends the list of after the elements are added. + * + * @see Walker::end_lvl() + * + * @since 2.5.1 + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of category. Used for tab indentation. + * @param array $args An array of arguments. @see wp_terms_checklist() + */ + public function end_lvl( &$output, $depth = 0, $args = array() ) { + $indent = str_repeat( "\t", $depth ); + $output .= "$indent
        \n"; + } + + /** + * Start the element output. + * + * @see Walker::start_el() + * + * @since 2.5.1 + * + * @param string $output Used to append additional content (passed by reference). + * @param object $category The current term object. + * @param int $depth Depth of the term in reference to parents. Default 0. + * @param array $args An array of arguments. @see wp_terms_checklist() + * @param int $id ID of the current term. + */ + public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { + if ( empty( $args['taxonomy'] ) ) { + $taxonomy = 'category'; + } else { + $taxonomy = $args['taxonomy']; + } + + if ( 'category' === $taxonomy ) { + $name = 'post_category'; + } else { + $name = 'tax_input[' . $taxonomy . ']'; + } + + $args['popular_cats'] = empty( $args['popular_cats'] ) ? array() : $args['popular_cats']; + $class = in_array( $category->term_id, $args['popular_cats'] ) ? ' class="popular-category"' : ''; + + $args['selected_cats'] = empty( $args['selected_cats'] ) ? array() : $args['selected_cats']; + + if ( ! empty( $args['list_only'] ) ) { + $aria_checked = 'false'; + $inner_class = 'category'; + + if ( in_array( $category->term_id, $args['selected_cats'] ) ) { + $inner_class .= ' selected'; + $aria_checked = 'true'; + } + + $output .= "\n" . '' . + ''; + } else { + $output .= "\n
      • " . + ''; + } + } + + /** + * Ends the element output, if needed. + * + * @see Walker::end_el() + * + * @since 2.5.1 + * + * @param string $output Used to append additional content (passed by reference). + * @param object $category The current term object. + * @param int $depth Depth of the term in reference to parents. Default 0. + * @param array $args An array of arguments. @see wp_terms_checklist() + */ + public function end_el( &$output, $category, $depth = 0, $args = array() ) { + $output .= "
      • \n"; + } +} diff --git a/wp-admin/includes/class-walker-nav-menu-checklist.php b/wp-admin/includes/class-walker-nav-menu-checklist.php new file mode 100644 index 0000000..f166a88 --- /dev/null +++ b/wp-admin/includes/class-walker-nav-menu-checklist.php @@ -0,0 +1,122 @@ +db_fields = $fields; + } + } + + /** + * Starts the list before the elements are added. + * + * @see Walker_Nav_Menu::start_lvl() + * + * @since 3.0.0 + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of page. Used for padding. + * @param stdClass $args Not used. + */ + public function start_lvl( &$output, $depth = 0, $args = null ) { + $indent = str_repeat( "\t", $depth ); + $output .= "\n$indent
          \n"; + } + + /** + * Ends the list of after the elements are added. + * + * @see Walker_Nav_Menu::end_lvl() + * + * @since 3.0.0 + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of page. Used for padding. + * @param stdClass $args Not used. + */ + public function end_lvl( &$output, $depth = 0, $args = null ) { + $indent = str_repeat( "\t", $depth ); + $output .= "\n$indent
        "; + } + + /** + * Start the element output. + * + * @see Walker_Nav_Menu::start_el() + * + * @since 3.0.0 + * + * @global int $_nav_menu_placeholder + * @global int|string $nav_menu_selected_id + * + * @param string $output Used to append additional content (passed by reference). + * @param WP_Post $item Menu item data object. + * @param int $depth Depth of menu item. Used for padding. + * @param stdClass $args Not used. + * @param int $id Not used. + */ + public function start_el( &$output, $item, $depth = 0, $args = null, $id = 0 ) { + global $_nav_menu_placeholder, $nav_menu_selected_id; + + $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval( $_nav_menu_placeholder ) - 1 : -1; + $possible_object_id = isset( $item->post_type ) && 'nav_menu_item' == $item->post_type ? $item->object_id : $_nav_menu_placeholder; + $possible_db_id = ( ! empty( $item->ID ) ) && ( 0 < $possible_object_id ) ? (int) $item->ID : 0; + + $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; + + $output .= $indent . '
      • '; + $output .= ''; + + // Menu item hidden fields. + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + } + +} diff --git a/wp-admin/includes/class-walker-nav-menu-edit.php b/wp-admin/includes/class-walker-nav-menu-edit.php new file mode 100644 index 0000000..183077aa --- /dev/null +++ b/wp-admin/includes/class-walker-nav-menu-edit.php @@ -0,0 +1,313 @@ + $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth; + + ob_start(); + $item_id = esc_attr( $item->ID ); + $removed_args = array( + 'action', + 'customlink-tab', + 'edit-menu-item', + 'menu-item', + 'page-tab', + '_wpnonce', + ); + + $original_title = false; + + if ( 'taxonomy' == $item->type ) { + $original_object = get_term( (int) $item->object_id, $item->object ); + if ( $original_object && ! is_wp_error( $original_title ) ) { + $original_title = $original_object->name; + } + } elseif ( 'post_type' == $item->type ) { + $original_object = get_post( $item->object_id ); + if ( $original_object ) { + $original_title = get_the_title( $original_object->ID ); + } + } elseif ( 'post_type_archive' == $item->type ) { + $original_object = get_post_type_object( $item->object ); + if ( $original_object ) { + $original_title = $original_object->labels->archives; + } + } + + $classes = array( + 'menu-item menu-item-depth-' . $depth, + 'menu-item-' . esc_attr( $item->object ), + 'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive' ), + ); + + $title = $item->title; + + if ( ! empty( $item->_invalid ) ) { + $classes[] = 'menu-item-invalid'; + /* translators: %s: Title of an invalid menu item. */ + $title = sprintf( __( '%s (Invalid)' ), $item->title ); + } elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) { + $classes[] = 'pending'; + /* translators: %s: Title of a menu item in draft status. */ + $title = sprintf( __( '%s (Pending)' ), $item->title ); + } + + $title = ( ! isset( $item->label ) || '' == $item->label ) ? $title : $item->label; + + $submenu_text = ''; + if ( 0 == $depth ) { + $submenu_text = 'style="display: none;"'; + } + + ?> +
      • '; + + if ( $comment->comment_parent ) { + $parent = get_comment( $comment->comment_parent ); + if ( $parent ) { + $parent_link = esc_url( get_comment_link( $parent ) ); + $name = get_comment_author( $parent ); + printf( + /* translators: %s: Comment link. */ + __( 'In reply to %s.' ), + '' . $name . '' + ); + } + } + + comment_text( $comment ); + + if ( $this->user_can ) { + /** This filter is documented in wp-admin/includes/comment.php */ + $comment_content = apply_filters( 'comment_edit_pre', $comment->comment_content ); + ?> + + 50 ) { + $author_url_display = wp_html_excerpt( $author_url_display, 49, '…' ); + } + + echo ''; + comment_author( $comment ); + echo '
        '; + if ( ! empty( $author_url_display ) ) { + printf( '%s
        ', esc_url( $author_url ), esc_html( $author_url_display ) ); + } + + if ( $this->user_can ) { + if ( ! empty( $comment->comment_author_email ) ) { + /** This filter is documented in wp-includes/comment-template.php */ + $email = apply_filters( 'comment_email', $comment->comment_author_email, $comment ); + + if ( ! empty( $email ) && '@' !== $email ) { + printf( '%2$s
        ', esc_url( 'mailto:' . $email ), esc_html( $email ) ); + } + } + + $author_ip = get_comment_author_IP( $comment ); + if ( $author_ip ) { + $author_ip_url = add_query_arg( + array( + 's' => $author_ip, + 'mode' => 'detail', + ), + admin_url( 'edit-comments.php' ) + ); + if ( 'spam' === $comment_status ) { + $author_ip_url = add_query_arg( 'comment_status', 'spam', $author_ip_url ); + } + printf( '%2$s', esc_url( $author_ip_url ), esc_html( $author_ip ) ); + } + } + } + + /** + * @param WP_Comment $comment The comment object. + */ + public function column_date( $comment ) { + $submitted = sprintf( + /* translators: 1: Comment date, 2: Comment time. */ + __( '%1$s at %2$s' ), + /* translators: Comment date format. See https://www.php.net/date */ + get_comment_date( __( 'Y/m/d' ), $comment ), + /* translators: Comment time format. See https://www.php.net/date */ + get_comment_date( __( 'g:i a' ), $comment ) + ); + + echo ''; + } + + /** + * @param WP_Comment $comment The comment object. + */ + public function column_response( $comment ) { + $post = get_post(); + + if ( ! $post ) { + return; + } + + if ( isset( $this->pending_count[ $post->ID ] ) ) { + $pending_comments = $this->pending_count[ $post->ID ]; + } else { + $_pending_count_temp = get_pending_comments_num( array( $post->ID ) ); + $pending_comments = $_pending_count_temp[ $post->ID ]; + $this->pending_count[ $post->ID ] = $pending_comments; + } + + if ( current_user_can( 'edit_post', $post->ID ) ) { + $post_link = ""; + $post_link .= esc_html( get_the_title( $post->ID ) ) . ''; + } else { + $post_link = esc_html( get_the_title( $post->ID ) ); + } + + echo ''; + } + + /** + * @param WP_Comment $comment The comment object. + * @param string $column_name The custom column's name. + */ + public function column_default( $comment, $column_name ) { + /** + * Fires when the default column output is displayed for a single row. + * + * @since 2.8.0 + * + * @param string $column_name The custom column's name. + * @param int $comment->comment_ID The custom column's unique ID number. + */ + do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID ); + } +} diff --git a/wp-admin/includes/class-wp-community-events.php b/wp-admin/includes/class-wp-community-events.php new file mode 100644 index 0000000..443968f --- /dev/null +++ b/wp-admin/includes/class-wp-community-events.php @@ -0,0 +1,504 @@ +user_id = absint( $user_id ); + $this->user_location = $user_location; + } + + /** + * Gets data about events near a particular location. + * + * Cached events will be immediately returned if the `user_location` property + * is set for the current user, and cached events exist for that location. + * + * Otherwise, this method sends a request to the w.org Events API with location + * data. The API will send back a recognized location based on the data, along + * with nearby events. + * + * The browser's request for events is proxied with this method, rather + * than having the browser make the request directly to api.wordpress.org, + * because it allows results to be cached server-side and shared with other + * users and sites in the network. This makes the process more efficient, + * since increasing the number of visits that get cached data means users + * don't have to wait as often; if the user's browser made the request + * directly, it would also need to make a second request to WP in order to + * pass the data for caching. Having WP make the request also introduces + * the opportunity to anonymize the IP before sending it to w.org, which + * mitigates possible privacy concerns. + * + * @since 4.8.0 + * + * @param string $location_search Optional. City name to help determine the location. + * e.g., "Seattle". Default empty string. + * @param string $timezone Optional. Timezone to help determine the location. + * Default empty string. + * @return array|WP_Error A WP_Error on failure; an array with location and events on + * success. + */ + public function get_events( $location_search = '', $timezone = '' ) { + $cached_events = $this->get_cached_events(); + + if ( ! $location_search && $cached_events ) { + return $cached_events; + } + + // Include an unmodified $wp_version. + require ABSPATH . WPINC . '/version.php'; + + $api_url = 'http://api.wordpress.org/events/1.0/'; + $request_args = $this->get_request_args( $location_search, $timezone ); + $request_args['user-agent'] = 'WordPress/' . $wp_version . '; ' . home_url( '/' ); + + if ( wp_http_supports( array( 'ssl' ) ) ) { + $api_url = set_url_scheme( $api_url, 'https' ); + } + + $response = wp_remote_get( $api_url, $request_args ); + $response_code = wp_remote_retrieve_response_code( $response ); + $response_body = json_decode( wp_remote_retrieve_body( $response ), true ); + $response_error = null; + + if ( is_wp_error( $response ) ) { + $response_error = $response; + } elseif ( 200 !== $response_code ) { + $response_error = new WP_Error( + 'api-error', + /* translators: %d: Numeric HTTP status code, e.g. 400, 403, 500, 504, etc. */ + sprintf( __( 'Invalid API response code (%d).' ), $response_code ) + ); + } elseif ( ! isset( $response_body['location'], $response_body['events'] ) ) { + $response_error = new WP_Error( + 'api-invalid-response', + isset( $response_body['error'] ) ? $response_body['error'] : __( 'Unknown API error.' ) + ); + } + + if ( is_wp_error( $response_error ) ) { + return $response_error; + } else { + $expiration = false; + + if ( isset( $response_body['ttl'] ) ) { + $expiration = $response_body['ttl']; + unset( $response_body['ttl'] ); + } + + /* + * The IP in the response is usually the same as the one that was sent + * in the request, but in some cases it is different. In those cases, + * it's important to reset it back to the IP from the request. + * + * For example, if the IP sent in the request is private (e.g., 192.168.1.100), + * then the API will ignore that and use the corresponding public IP instead, + * and the public IP will get returned. If the public IP were saved, though, + * then get_cached_events() would always return `false`, because the transient + * would be generated based on the public IP when saving the cache, but generated + * based on the private IP when retrieving the cache. + */ + if ( ! empty( $response_body['location']['ip'] ) ) { + $response_body['location']['ip'] = $request_args['body']['ip']; + } + + /* + * The API doesn't return a description for latitude/longitude requests, + * but the description is already saved in the user location, so that + * one can be used instead. + */ + if ( $this->coordinates_match( $request_args['body'], $response_body['location'] ) && empty( $response_body['location']['description'] ) ) { + $response_body['location']['description'] = $this->user_location['description']; + } + + $this->cache_events( $response_body, $expiration ); + + $response_body = $this->trim_events( $response_body ); + $response_body = $this->format_event_data_time( $response_body ); + + return $response_body; + } + } + + /** + * Builds an array of args to use in an HTTP request to the w.org Events API. + * + * @since 4.8.0 + * + * @param string $search Optional. City search string. Default empty string. + * @param string $timezone Optional. Timezone string. Default empty string. + * @return array The request args. + */ + protected function get_request_args( $search = '', $timezone = '' ) { + $args = array( + 'number' => 5, // Get more than three in case some get trimmed out. + 'ip' => self::get_unsafe_client_ip(), + ); + + /* + * Include the minimal set of necessary arguments, in order to increase the + * chances of a cache-hit on the API side. + */ + if ( empty( $search ) && isset( $this->user_location['latitude'], $this->user_location['longitude'] ) ) { + $args['latitude'] = $this->user_location['latitude']; + $args['longitude'] = $this->user_location['longitude']; + } else { + $args['locale'] = get_user_locale( $this->user_id ); + + if ( $timezone ) { + $args['timezone'] = $timezone; + } + + if ( $search ) { + $args['location'] = $search; + } + } + + // Wrap the args in an array compatible with the second parameter of `wp_remote_get()`. + return array( + 'body' => $args, + ); + } + + /** + * Determines the user's actual IP address and attempts to partially + * anonymize an IP address by converting it to a network ID. + * + * Geolocating the network ID usually returns a similar location as the + * actual IP, but provides some privacy for the user. + * + * $_SERVER['REMOTE_ADDR'] cannot be used in all cases, such as when the user + * is making their request through a proxy, or when the web server is behind + * a proxy. In those cases, $_SERVER['REMOTE_ADDR'] is set to the proxy address rather + * than the user's actual address. + * + * Modified from https://stackoverflow.com/a/2031935/450127, MIT license. + * Modified from https://github.com/geertw/php-ip-anonymizer, MIT license. + * + * SECURITY WARNING: This function is _NOT_ intended to be used in + * circumstances where the authenticity of the IP address matters. This does + * _NOT_ guarantee that the returned address is valid or accurate, and it can + * be easily spoofed. + * + * @since 4.8.0 + * + * @return string|false The anonymized address on success; the given address + * or false on failure. + */ + public static function get_unsafe_client_ip() { + $client_ip = false; + + // In order of preference, with the best ones for this purpose first. + $address_headers = array( + 'HTTP_CLIENT_IP', + 'HTTP_X_FORWARDED_FOR', + 'HTTP_X_FORWARDED', + 'HTTP_X_CLUSTER_CLIENT_IP', + 'HTTP_FORWARDED_FOR', + 'HTTP_FORWARDED', + 'REMOTE_ADDR', + ); + + foreach ( $address_headers as $header ) { + if ( array_key_exists( $header, $_SERVER ) ) { + /* + * HTTP_X_FORWARDED_FOR can contain a chain of comma-separated + * addresses. The first one is the original client. It can't be + * trusted for authenticity, but we don't need to for this purpose. + */ + $address_chain = explode( ',', $_SERVER[ $header ] ); + $client_ip = trim( $address_chain[0] ); + + break; + } + } + + if ( ! $client_ip ) { + return false; + } + + $anon_ip = wp_privacy_anonymize_ip( $client_ip, true ); + + if ( '0.0.0.0' === $anon_ip || '::' === $anon_ip ) { + return false; + } + + return $anon_ip; + } + + /** + * Test if two pairs of latitude/longitude coordinates match each other. + * + * @since 4.8.0 + * + * @param array $a The first pair, with indexes 'latitude' and 'longitude'. + * @param array $b The second pair, with indexes 'latitude' and 'longitude'. + * @return bool True if they match, false if they don't. + */ + protected function coordinates_match( $a, $b ) { + if ( ! isset( $a['latitude'], $a['longitude'], $b['latitude'], $b['longitude'] ) ) { + return false; + } + + return $a['latitude'] === $b['latitude'] && $a['longitude'] === $b['longitude']; + } + + /** + * Generates a transient key based on user location. + * + * This could be reduced to a one-liner in the calling functions, but it's + * intentionally a separate function because it's called from multiple + * functions, and having it abstracted keeps the logic consistent and DRY, + * which is less prone to errors. + * + * @since 4.8.0 + * + * @param array $location Should contain 'latitude' and 'longitude' indexes. + * @return bool|string false on failure, or a string on success. + */ + protected function get_events_transient_key( $location ) { + $key = false; + + if ( isset( $location['ip'] ) ) { + $key = 'community-events-' . md5( $location['ip'] ); + } elseif ( isset( $location['latitude'], $location['longitude'] ) ) { + $key = 'community-events-' . md5( $location['latitude'] . $location['longitude'] ); + } + + return $key; + } + + /** + * Caches an array of events data from the Events API. + * + * @since 4.8.0 + * + * @param array $events Response body from the API request. + * @param int|bool $expiration Optional. Amount of time to cache the events. Defaults to false. + * @return bool true if events were cached; false if not. + */ + protected function cache_events( $events, $expiration = false ) { + $set = false; + $transient_key = $this->get_events_transient_key( $events['location'] ); + $cache_expiration = $expiration ? absint( $expiration ) : HOUR_IN_SECONDS * 12; + + if ( $transient_key ) { + $set = set_site_transient( $transient_key, $events, $cache_expiration ); + } + + return $set; + } + + /** + * Gets cached events. + * + * @since 4.8.0 + * + * @return array|false An array containing `location` and `events` items + * on success, false on failure. + */ + public function get_cached_events() { + $cached_response = get_site_transient( $this->get_events_transient_key( $this->user_location ) ); + $cached_response = $this->trim_events( $cached_response ); + + return $this->format_event_data_time( $cached_response ); + } + + /** + * Adds formatted date and time items for each event in an API response. + * + * This has to be called after the data is pulled from the cache, because + * the cached events are shared by all users. If it was called before storing + * the cache, then all users would see the events in the localized data/time + * of the user who triggered the cache refresh, rather than their own. + * + * @since 4.8.0 + * + * @param array $response_body The response which contains the events. + * @return array The response with dates and times formatted. + */ + protected function format_event_data_time( $response_body ) { + if ( isset( $response_body['events'] ) ) { + foreach ( $response_body['events'] as $key => $event ) { + $timestamp = strtotime( $event['date'] ); + + /* + * The `date_format` option is not used because it's important + * in this context to keep the day of the week in the formatted date, + * so that users can tell at a glance if the event is on a day they + * are available, without having to open the link. + */ + /* translators: Date format for upcoming events on the dashboard. Include the day of the week. See https://www.php.net/date */ + $formatted_date = date_i18n( __( 'l, M j, Y' ), $timestamp ); + $formatted_time = date_i18n( get_option( 'time_format' ), $timestamp ); + + if ( isset( $event['end_date'] ) ) { + $end_timestamp = strtotime( $event['end_date'] ); + $formatted_end_date = date_i18n( __( 'l, M j, Y' ), $end_timestamp ); + + if ( 'meetup' !== $event['type'] && $formatted_end_date !== $formatted_date ) { + /* translators: Upcoming events month format. See https://www.php.net/date */ + $start_month = date_i18n( _x( 'F', 'upcoming events month format' ), $timestamp ); + $end_month = date_i18n( _x( 'F', 'upcoming events month format' ), $end_timestamp ); + + if ( $start_month === $end_month ) { + $formatted_date = sprintf( + /* translators: Date string for upcoming events. 1: Month, 2: Starting day, 3: Ending day, 4: Year. */ + __( '%1$s %2$d–%3$d, %4$d' ), + $start_month, + /* translators: Upcoming events day format. See https://www.php.net/date */ + date_i18n( _x( 'j', 'upcoming events day format' ), $timestamp ), + date_i18n( _x( 'j', 'upcoming events day format' ), $end_timestamp ), + /* translators: Upcoming events year format. See https://www.php.net/date */ + date_i18n( _x( 'Y', 'upcoming events year format' ), $timestamp ) + ); + } else { + $formatted_date = sprintf( + /* translators: Date string for upcoming events. 1: Starting month, 2: Starting day, 3: Ending month, 4: Ending day, 5: Year. */ + __( '%1$s %2$d – %3$s %4$d, %5$d' ), + $start_month, + date_i18n( _x( 'j', 'upcoming events day format' ), $timestamp ), + $end_month, + date_i18n( _x( 'j', 'upcoming events day format' ), $end_timestamp ), + date_i18n( _x( 'Y', 'upcoming events year format' ), $timestamp ) + ); + } + + $formatted_date = wp_maybe_decline_date( $formatted_date, 'F j, Y' ); + } + } + + $response_body['events'][ $key ]['formatted_date'] = $formatted_date; + $response_body['events'][ $key ]['formatted_time'] = $formatted_time; + } + } + + return $response_body; + } + + /** + * Prepares the event list for presentation. + * + * Discards expired events, and makes WordCamps "sticky." Attendees need more + * advanced notice about WordCamps than they do for meetups, so camps should + * appear in the list sooner. If a WordCamp is coming up, the API will "stick" + * it in the response, even if it wouldn't otherwise appear. When that happens, + * the event will be at the end of the list, and will need to be moved into a + * higher position, so that it doesn't get trimmed off. + * + * @since 4.8.0 + * @since 4.9.7 Stick a WordCamp to the final list. + * + * @param array $response_body The response body which contains the events. + * @return array The response body with events trimmed. + */ + protected function trim_events( $response_body ) { + if ( isset( $response_body['events'] ) ) { + $wordcamps = array(); + $today = current_time( 'Y-m-d' ); + + foreach ( $response_body['events'] as $key => $event ) { + /* + * Skip WordCamps, because they might be multi-day events. + * Save a copy so they can be pinned later. + */ + if ( 'wordcamp' === $event['type'] ) { + $wordcamps[] = $event; + continue; + } + + // We don't get accurate time with timezone from API, so we only take the date part (Y-m-d). + $event_date = substr( $event['date'], 0, 10 ); + + if ( $today > $event_date ) { + unset( $response_body['events'][ $key ] ); + } + } + + $response_body['events'] = array_slice( $response_body['events'], 0, 3 ); + $trimmed_event_types = wp_list_pluck( $response_body['events'], 'type' ); + + // Make sure the soonest upcoming WordCamp is pinned in the list. + if ( ! in_array( 'wordcamp', $trimmed_event_types ) && $wordcamps ) { + array_pop( $response_body['events'] ); + array_push( $response_body['events'], $wordcamps[0] ); + } + } + + return $response_body; + } + + /** + * Logs responses to Events API requests. + * + * @since 4.8.0 + * @deprecated 4.9.0 Use a plugin instead. See #41217 for an example. + * + * @param string $message A description of what occurred. + * @param array $details Details that provide more context for the + * log entry. + */ + protected function maybe_log_events_response( $message, $details ) { + _deprecated_function( __METHOD__, '4.9.0' ); + + if ( ! WP_DEBUG_LOG ) { + return; + } + + error_log( + sprintf( + '%s: %s. Details: %s', + __METHOD__, + trim( $message, '.' ), + wp_json_encode( $details ) + ) + ); + } +} diff --git a/wp-admin/includes/class-wp-debug-data.php b/wp-admin/includes/class-wp-debug-data.php new file mode 100644 index 0000000..d93f201 --- /dev/null +++ b/wp-admin/includes/class-wp-debug-data.php @@ -0,0 +1,1338 @@ + $update ) { + if ( 'upgrade' === $update->response ) { + /* translators: %s: Latest WordPress version number. */ + $core_update_needed = ' ' . sprintf( __( '(Latest version: %s)' ), $update->version ); + } else { + $core_update_needed = ''; + } + } + + // Set up the array that holds all debug information. + $info = array(); + + $info['wp-core'] = array( + 'label' => __( 'WordPress' ), + 'fields' => array( + 'version' => array( + 'label' => __( 'Version' ), + 'value' => $core_version . $core_update_needed, + 'debug' => $core_version, + ), + 'site_language' => array( + 'label' => __( 'Site Language' ), + 'value' => get_locale(), + ), + 'user_language' => array( + 'label' => __( 'User Language' ), + 'value' => get_user_locale(), + ), + 'timezone' => array( + 'label' => __( 'Timezone' ), + 'value' => wp_timezone_string(), + ), + 'home_url' => array( + 'label' => __( 'Home URL' ), + 'value' => get_bloginfo( 'url' ), + 'private' => true, + ), + 'site_url' => array( + 'label' => __( 'Site URL' ), + 'value' => get_bloginfo( 'wpurl' ), + 'private' => true, + ), + 'permalink' => array( + 'label' => __( 'Permalink structure' ), + 'value' => $permalink_structure ? $permalink_structure : __( 'No permalink structure set' ), + 'debug' => $permalink_structure, + ), + 'https_status' => array( + 'label' => __( 'Is this site using HTTPS?' ), + 'value' => $is_ssl ? __( 'Yes' ) : __( 'No' ), + 'debug' => $is_ssl, + ), + 'user_registration' => array( + 'label' => __( 'Can anyone register on this site?' ), + 'value' => $users_can_register ? __( 'Yes' ) : __( 'No' ), + 'debug' => $users_can_register, + ), + 'default_comment_status' => array( + 'label' => __( 'Default comment status' ), + 'value' => 'open' === $default_comment_status ? _x( 'Open', 'comment status' ) : _x( 'Closed', 'comment status' ), + 'debug' => $default_comment_status, + ), + 'multisite' => array( + 'label' => __( 'Is this a multisite?' ), + 'value' => $is_multisite ? __( 'Yes' ) : __( 'No' ), + 'debug' => $is_multisite, + ), + ), + ); + + if ( ! $is_multisite ) { + $info['wp-paths-sizes'] = array( + 'label' => __( 'Directories and Sizes' ), + 'fields' => array(), + ); + } + + $info['wp-dropins'] = array( + 'label' => __( 'Drop-ins' ), + 'show_count' => true, + 'description' => sprintf( + /* translators: %s: wp-content directory name. */ + __( 'Drop-ins are single files, found in the %s directory, that replace or enhance WordPress features in ways that are not possible for traditional plugins.' ), + '' . str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '' + ), + 'fields' => array(), + ); + + $info['wp-active-theme'] = array( + 'label' => __( 'Active Theme' ), + 'fields' => array(), + ); + + $info['wp-parent-theme'] = array( + 'label' => __( 'Parent Theme' ), + 'fields' => array(), + ); + + $info['wp-themes-inactive'] = array( + 'label' => __( 'Inactive Themes' ), + 'show_count' => true, + 'fields' => array(), + ); + + $info['wp-mu-plugins'] = array( + 'label' => __( 'Must Use Plugins' ), + 'show_count' => true, + 'fields' => array(), + ); + + $info['wp-plugins-active'] = array( + 'label' => __( 'Active Plugins' ), + 'show_count' => true, + 'fields' => array(), + ); + + $info['wp-plugins-inactive'] = array( + 'label' => __( 'Inactive Plugins' ), + 'show_count' => true, + 'fields' => array(), + ); + + $info['wp-media'] = array( + 'label' => __( 'Media Handling' ), + 'fields' => array(), + ); + + $info['wp-server'] = array( + 'label' => __( 'Server' ), + 'description' => __( 'The options shown below relate to your server setup. If changes are required, you may need your web host’s assistance.' ), + 'fields' => array(), + ); + + $info['wp-database'] = array( + 'label' => __( 'Database' ), + 'fields' => array(), + ); + + // Check if WP_DEBUG_LOG is set. + $wp_debug_log_value = __( 'Disabled' ); + + if ( is_string( WP_DEBUG_LOG ) ) { + $wp_debug_log_value = WP_DEBUG_LOG; + } elseif ( WP_DEBUG_LOG ) { + $wp_debug_log_value = __( 'Enabled' ); + } + + // Check CONCATENATE_SCRIPTS. + if ( defined( 'CONCATENATE_SCRIPTS' ) ) { + $concatenate_scripts = CONCATENATE_SCRIPTS ? __( 'Enabled' ) : __( 'Disabled' ); + $concatenate_scripts_debug = CONCATENATE_SCRIPTS ? 'true' : 'false'; + } else { + $concatenate_scripts = __( 'Undefined' ); + $concatenate_scripts_debug = 'undefined'; + } + + // Check COMPRESS_SCRIPTS. + if ( defined( 'COMPRESS_SCRIPTS' ) ) { + $compress_scripts = COMPRESS_SCRIPTS ? __( 'Enabled' ) : __( 'Disabled' ); + $compress_scripts_debug = COMPRESS_SCRIPTS ? 'true' : 'false'; + } else { + $compress_scripts = __( 'Undefined' ); + $compress_scripts_debug = 'undefined'; + } + + // Check COMPRESS_CSS. + if ( defined( 'COMPRESS_CSS' ) ) { + $compress_css = COMPRESS_CSS ? __( 'Enabled' ) : __( 'Disabled' ); + $compress_css_debug = COMPRESS_CSS ? 'true' : 'false'; + } else { + $compress_css = __( 'Undefined' ); + $compress_css_debug = 'undefined'; + } + + // Check WP_LOCAL_DEV. + if ( defined( 'WP_LOCAL_DEV' ) ) { + $wp_local_dev = WP_LOCAL_DEV ? __( 'Enabled' ) : __( 'Disabled' ); + $wp_local_dev_debug = WP_LOCAL_DEV ? 'true' : 'false'; + } else { + $wp_local_dev = __( 'Undefined' ); + $wp_local_dev_debug = 'undefined'; + } + + $info['wp-constants'] = array( + 'label' => __( 'WordPress Constants' ), + 'description' => __( 'These settings alter where and how parts of WordPress are loaded.' ), + 'fields' => array( + 'ABSPATH' => array( + 'label' => 'ABSPATH', + 'value' => ABSPATH, + 'private' => true, + ), + 'WP_HOME' => array( + 'label' => 'WP_HOME', + 'value' => ( defined( 'WP_HOME' ) ? WP_HOME : __( 'Undefined' ) ), + 'debug' => ( defined( 'WP_HOME' ) ? WP_HOME : 'undefined' ), + ), + 'WP_SITEURL' => array( + 'label' => 'WP_SITEURL', + 'value' => ( defined( 'WP_SITEURL' ) ? WP_SITEURL : __( 'Undefined' ) ), + 'debug' => ( defined( 'WP_SITEURL' ) ? WP_SITEURL : 'undefined' ), + ), + 'WP_CONTENT_DIR' => array( + 'label' => 'WP_CONTENT_DIR', + 'value' => WP_CONTENT_DIR, + ), + 'WP_PLUGIN_DIR' => array( + 'label' => 'WP_PLUGIN_DIR', + 'value' => WP_PLUGIN_DIR, + ), + 'WP_MAX_MEMORY_LIMIT' => array( + 'label' => 'WP_MAX_MEMORY_LIMIT', + 'value' => WP_MAX_MEMORY_LIMIT, + ), + 'WP_DEBUG' => array( + 'label' => 'WP_DEBUG', + 'value' => WP_DEBUG ? __( 'Enabled' ) : __( 'Disabled' ), + 'debug' => WP_DEBUG, + ), + 'WP_DEBUG_DISPLAY' => array( + 'label' => 'WP_DEBUG_DISPLAY', + 'value' => WP_DEBUG_DISPLAY ? __( 'Enabled' ) : __( 'Disabled' ), + 'debug' => WP_DEBUG_DISPLAY, + ), + 'WP_DEBUG_LOG' => array( + 'label' => 'WP_DEBUG_LOG', + 'value' => $wp_debug_log_value, + 'debug' => WP_DEBUG_LOG, + ), + 'SCRIPT_DEBUG' => array( + 'label' => 'SCRIPT_DEBUG', + 'value' => SCRIPT_DEBUG ? __( 'Enabled' ) : __( 'Disabled' ), + 'debug' => SCRIPT_DEBUG, + ), + 'WP_CACHE' => array( + 'label' => 'WP_CACHE', + 'value' => WP_CACHE ? __( 'Enabled' ) : __( 'Disabled' ), + 'debug' => WP_CACHE, + ), + 'CONCATENATE_SCRIPTS' => array( + 'label' => 'CONCATENATE_SCRIPTS', + 'value' => $concatenate_scripts, + 'debug' => $concatenate_scripts_debug, + ), + 'COMPRESS_SCRIPTS' => array( + 'label' => 'COMPRESS_SCRIPTS', + 'value' => $compress_scripts, + 'debug' => $compress_scripts_debug, + ), + 'COMPRESS_CSS' => array( + 'label' => 'COMPRESS_CSS', + 'value' => $compress_css, + 'debug' => $compress_css_debug, + ), + 'WP_LOCAL_DEV' => array( + 'label' => 'WP_LOCAL_DEV', + 'value' => $wp_local_dev, + 'debug' => $wp_local_dev_debug, + ), + 'DB_CHARSET' => array( + 'label' => 'DB_CHARSET', + 'value' => ( defined( 'DB_CHARSET' ) ? DB_CHARSET : __( 'Undefined' ) ), + 'debug' => ( defined( 'DB_CHARSET' ) ? DB_CHARSET : 'undefined' ), + ), + 'DB_COLLATE' => array( + 'label' => 'DB_COLLATE', + 'value' => ( defined( 'DB_COLLATE' ) ? DB_COLLATE : __( 'Undefined' ) ), + 'debug' => ( defined( 'DB_COLLATE' ) ? DB_COLLATE : 'undefined' ), + ), + ), + ); + + $is_writable_abspath = wp_is_writable( ABSPATH ); + $is_writable_wp_content_dir = wp_is_writable( WP_CONTENT_DIR ); + $is_writable_upload_dir = wp_is_writable( $upload_dir['basedir'] ); + $is_writable_wp_plugin_dir = wp_is_writable( WP_PLUGIN_DIR ); + $is_writable_template_directory = wp_is_writable( get_template_directory() . '/..' ); + + $info['wp-filesystem'] = array( + 'label' => __( 'Filesystem Permissions' ), + 'description' => __( 'Shows whether WordPress is able to write to the directories it needs access to.' ), + 'fields' => array( + 'wordpress' => array( + 'label' => __( 'The main WordPress directory' ), + 'value' => ( $is_writable_abspath ? __( 'Writable' ) : __( 'Not writable' ) ), + 'debug' => ( $is_writable_abspath ? 'writable' : 'not writable' ), + ), + 'wp-content' => array( + 'label' => __( 'The wp-content directory' ), + 'value' => ( $is_writable_wp_content_dir ? __( 'Writable' ) : __( 'Not writable' ) ), + 'debug' => ( $is_writable_wp_content_dir ? 'writable' : 'not writable' ), + ), + 'uploads' => array( + 'label' => __( 'The uploads directory' ), + 'value' => ( $is_writable_upload_dir ? __( 'Writable' ) : __( 'Not writable' ) ), + 'debug' => ( $is_writable_upload_dir ? 'writable' : 'not writable' ), + ), + 'plugins' => array( + 'label' => __( 'The plugins directory' ), + 'value' => ( $is_writable_wp_plugin_dir ? __( 'Writable' ) : __( 'Not writable' ) ), + 'debug' => ( $is_writable_wp_plugin_dir ? 'writable' : 'not writable' ), + ), + 'themes' => array( + 'label' => __( 'The themes directory' ), + 'value' => ( $is_writable_template_directory ? __( 'Writable' ) : __( 'Not writable' ) ), + 'debug' => ( $is_writable_template_directory ? 'writable' : 'not writable' ), + ), + ), + ); + + // Conditionally add debug information for multisite setups. + if ( is_multisite() ) { + $network_query = new WP_Network_Query(); + $network_ids = $network_query->query( + array( + 'fields' => 'ids', + 'number' => 100, + 'no_found_rows' => false, + ) + ); + + $site_count = 0; + foreach ( $network_ids as $network_id ) { + $site_count += get_blog_count( $network_id ); + } + + $info['wp-core']['fields']['user_count'] = array( + 'label' => __( 'User count' ), + 'value' => get_user_count(), + ); + + $info['wp-core']['fields']['site_count'] = array( + 'label' => __( 'Site count' ), + 'value' => $site_count, + ); + + $info['wp-core']['fields']['network_count'] = array( + 'label' => __( 'Network count' ), + 'value' => $network_query->found_networks, + ); + } else { + $user_count = count_users(); + + $info['wp-core']['fields']['user_count'] = array( + 'label' => __( 'User count' ), + 'value' => $user_count['total_users'], + ); + } + + // WordPress features requiring processing. + $wp_dotorg = wp_remote_get( 'https://wordpress.org', array( 'timeout' => 10 ) ); + + if ( ! is_wp_error( $wp_dotorg ) ) { + $info['wp-core']['fields']['dotorg_communication'] = array( + 'label' => __( 'Communication with WordPress.org' ), + 'value' => __( 'WordPress.org is reachable' ), + 'debug' => 'true', + ); + } else { + $info['wp-core']['fields']['dotorg_communication'] = array( + 'label' => __( 'Communication with WordPress.org' ), + 'value' => sprintf( + /* translators: 1: The IP address WordPress.org resolves to. 2: The error returned by the lookup. */ + __( 'Unable to reach WordPress.org at %1$s: %2$s' ), + gethostbyname( 'wordpress.org' ), + $wp_dotorg->get_error_message() + ), + 'debug' => $wp_dotorg->get_error_message(), + ); + } + + // Remove accordion for Directories and Sizes if in Multisite. + if ( ! $is_multisite ) { + $loading = __( 'Loading…' ); + + $info['wp-paths-sizes']['fields'] = array( + 'wordpress_path' => array( + 'label' => __( 'WordPress directory location' ), + 'value' => untrailingslashit( ABSPATH ), + ), + 'wordpress_size' => array( + 'label' => __( 'WordPress directory size' ), + 'value' => $loading, + 'debug' => 'loading...', + ), + 'uploads_path' => array( + 'label' => __( 'Uploads directory location' ), + 'value' => $upload_dir['basedir'], + ), + 'uploads_size' => array( + 'label' => __( 'Uploads directory size' ), + 'value' => $loading, + 'debug' => 'loading...', + ), + 'themes_path' => array( + 'label' => __( 'Themes directory location' ), + 'value' => get_theme_root(), + ), + 'themes_size' => array( + 'label' => __( 'Themes directory size' ), + 'value' => $loading, + 'debug' => 'loading...', + ), + 'plugins_path' => array( + 'label' => __( 'Plugins directory location' ), + 'value' => WP_PLUGIN_DIR, + ), + 'plugins_size' => array( + 'label' => __( 'Plugins directory size' ), + 'value' => $loading, + 'debug' => 'loading...', + ), + 'database_size' => array( + 'label' => __( 'Database size' ), + 'value' => $loading, + 'debug' => 'loading...', + ), + 'total_size' => array( + 'label' => __( 'Total installation size' ), + 'value' => $loading, + 'debug' => 'loading...', + ), + ); + } + + // Get a list of all drop-in replacements. + $dropins = get_dropins(); + + // Get dropins descriptions. + $dropin_descriptions = _get_dropins(); + + // Spare few function calls. + $not_available = __( 'Not available' ); + + foreach ( $dropins as $dropin_key => $dropin ) { + $info['wp-dropins']['fields'][ sanitize_text_field( $dropin_key ) ] = array( + 'label' => $dropin_key, + 'value' => $dropin_descriptions[ $dropin_key ][0], + 'debug' => 'true', + ); + } + + // Populate the media fields. + $info['wp-media']['fields']['image_editor'] = array( + 'label' => __( 'Active editor' ), + 'value' => _wp_image_editor_choose(), + ); + + // Get ImageMagic information, if available. + if ( class_exists( 'Imagick' ) ) { + // Save the Imagick instance for later use. + $imagick = new Imagick(); + $imagick_version = $imagick->getVersion(); + } else { + $imagick_version = __( 'Not available' ); + } + + $info['wp-media']['fields']['imagick_module_version'] = array( + 'label' => __( 'ImageMagick version number' ), + 'value' => ( is_array( $imagick_version ) ? $imagick_version['versionNumber'] : $imagick_version ), + ); + + $info['wp-media']['fields']['imagemagick_version'] = array( + 'label' => __( 'ImageMagick version string' ), + 'value' => ( is_array( $imagick_version ) ? $imagick_version['versionString'] : $imagick_version ), + ); + + // If Imagick is used as our editor, provide some more information about its limitations. + if ( 'WP_Image_Editor_Imagick' === _wp_image_editor_choose() && isset( $imagick ) && $imagick instanceof Imagick ) { + $limits = array( + 'area' => ( defined( 'imagick::RESOURCETYPE_AREA' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_AREA ) ) : $not_available ), + 'disk' => ( defined( 'imagick::RESOURCETYPE_DISK' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_DISK ) : $not_available ), + 'file' => ( defined( 'imagick::RESOURCETYPE_FILE' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_FILE ) : $not_available ), + 'map' => ( defined( 'imagick::RESOURCETYPE_MAP' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MAP ) ) : $not_available ), + 'memory' => ( defined( 'imagick::RESOURCETYPE_MEMORY' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MEMORY ) ) : $not_available ), + 'thread' => ( defined( 'imagick::RESOURCETYPE_THREAD' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_THREAD ) : $not_available ), + ); + + $limits_debug = array( + 'imagick::RESOURCETYPE_AREA' => ( defined( 'imagick::RESOURCETYPE_AREA' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_AREA ) ) : 'not available' ), + 'imagick::RESOURCETYPE_DISK' => ( defined( 'imagick::RESOURCETYPE_DISK' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_DISK ) : 'not available' ), + 'imagick::RESOURCETYPE_FILE' => ( defined( 'imagick::RESOURCETYPE_FILE' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_FILE ) : 'not available' ), + 'imagick::RESOURCETYPE_MAP' => ( defined( 'imagick::RESOURCETYPE_MAP' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MAP ) ) : 'not available' ), + 'imagick::RESOURCETYPE_MEMORY' => ( defined( 'imagick::RESOURCETYPE_MEMORY' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MEMORY ) ) : 'not available' ), + 'imagick::RESOURCETYPE_THREAD' => ( defined( 'imagick::RESOURCETYPE_THREAD' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_THREAD ) : 'not available' ), + ); + + $info['wp-media']['fields']['imagick_limits'] = array( + 'label' => __( 'Imagick Resource Limits' ), + 'value' => $limits, + 'debug' => $limits_debug, + ); + } + + // Get GD information, if available. + if ( function_exists( 'gd_info' ) ) { + $gd = gd_info(); + } else { + $gd = false; + } + + $info['wp-media']['fields']['gd_version'] = array( + 'label' => __( 'GD version' ), + 'value' => ( is_array( $gd ) ? $gd['GD Version'] : $not_available ), + 'debug' => ( is_array( $gd ) ? $gd['GD Version'] : 'not available' ), + ); + + // Get Ghostscript information, if available. + if ( function_exists( 'exec' ) ) { + $gs = exec( 'gs --version' ); + + if ( empty( $gs ) ) { + $gs = $not_available; + $gs_debug = 'not available'; + } else { + $gs_debug = $gs; + } + } else { + $gs = __( 'Unable to determine if Ghostscript is installed' ); + $gs_debug = 'unknown'; + } + + $info['wp-media']['fields']['ghostscript_version'] = array( + 'label' => __( 'Ghostscript version' ), + 'value' => $gs, + 'debug' => $gs_debug, + ); + + // Populate the server debug fields. + if ( function_exists( 'php_uname' ) ) { + $server_architecture = sprintf( '%s %s %s', php_uname( 's' ), php_uname( 'r' ), php_uname( 'm' ) ); + } else { + $server_architecture = 'unknown'; + } + + if ( function_exists( 'phpversion' ) ) { + $php_version_debug = phpversion(); + // Whether PHP supports 64-bit. + $php64bit = ( PHP_INT_SIZE * 8 === 64 ); + + $php_version = sprintf( + '%s %s', + $php_version_debug, + ( $php64bit ? __( '(Supports 64bit values)' ) : __( '(Does not support 64bit values)' ) ) + ); + + if ( $php64bit ) { + $php_version_debug .= ' 64bit'; + } + } else { + $php_version = __( 'Unable to determine PHP version' ); + $php_version_debug = 'unknown'; + } + + if ( function_exists( 'php_sapi_name' ) ) { + $php_sapi = php_sapi_name(); + } else { + $php_sapi = 'unknown'; + } + + $info['wp-server']['fields']['server_architecture'] = array( + 'label' => __( 'Server architecture' ), + 'value' => ( 'unknown' !== $server_architecture ? $server_architecture : __( 'Unable to determine server architecture' ) ), + 'debug' => $server_architecture, + ); + $info['wp-server']['fields']['httpd_software'] = array( + 'label' => __( 'Web server' ), + 'value' => ( isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : __( 'Unable to determine what web server software is used' ) ), + 'debug' => ( isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : 'unknown' ), + ); + $info['wp-server']['fields']['php_version'] = array( + 'label' => __( 'PHP version' ), + 'value' => $php_version, + 'debug' => $php_version_debug, + ); + $info['wp-server']['fields']['php_sapi'] = array( + 'label' => __( 'PHP SAPI' ), + 'value' => ( 'unknown' !== $php_sapi ? $php_sapi : __( 'Unable to determine PHP SAPI' ) ), + 'debug' => $php_sapi, + ); + + // Some servers disable `ini_set()` and `ini_get()`, we check this before trying to get configuration values. + if ( ! function_exists( 'ini_get' ) ) { + $info['wp-server']['fields']['ini_get'] = array( + 'label' => __( 'Server settings' ), + 'value' => sprintf( + /* translators: %s: ini_get() */ + __( 'Unable to determine some settings, as the %s function has been disabled.' ), + 'ini_get()' + ), + 'debug' => 'ini_get() is disabled', + ); + } else { + $info['wp-server']['fields']['max_input_variables'] = array( + 'label' => __( 'PHP max input variables' ), + 'value' => ini_get( 'max_input_vars' ), + ); + $info['wp-server']['fields']['time_limit'] = array( + 'label' => __( 'PHP time limit' ), + 'value' => ini_get( 'max_execution_time' ), + ); + $info['wp-server']['fields']['memory_limit'] = array( + 'label' => __( 'PHP memory limit' ), + 'value' => ini_get( 'memory_limit' ), + ); + $info['wp-server']['fields']['max_input_time'] = array( + 'label' => __( 'Max input time' ), + 'value' => ini_get( 'max_input_time' ), + ); + $info['wp-server']['fields']['upload_max_size'] = array( + 'label' => __( 'Upload max filesize' ), + 'value' => ini_get( 'upload_max_filesize' ), + ); + $info['wp-server']['fields']['php_post_max_size'] = array( + 'label' => __( 'PHP post max size' ), + 'value' => ini_get( 'post_max_size' ), + ); + } + + if ( function_exists( 'curl_version' ) ) { + $curl = curl_version(); + + $info['wp-server']['fields']['curl_version'] = array( + 'label' => __( 'cURL version' ), + 'value' => sprintf( '%s %s', $curl['version'], $curl['ssl_version'] ), + ); + } else { + $info['wp-server']['fields']['curl_version'] = array( + 'label' => __( 'cURL version' ), + 'value' => $not_available, + 'debug' => 'not available', + ); + } + + // SUHOSIN. + $suhosin_loaded = ( extension_loaded( 'suhosin' ) || ( defined( 'SUHOSIN_PATCH' ) && constant( 'SUHOSIN_PATCH' ) ) ); + + $info['wp-server']['fields']['suhosin'] = array( + 'label' => __( 'Is SUHOSIN installed?' ), + 'value' => ( $suhosin_loaded ? __( 'Yes' ) : __( 'No' ) ), + 'debug' => $suhosin_loaded, + ); + + // Imagick. + $imagick_loaded = extension_loaded( 'imagick' ); + + $info['wp-server']['fields']['imagick_availability'] = array( + 'label' => __( 'Is the Imagick library available?' ), + 'value' => ( $imagick_loaded ? __( 'Yes' ) : __( 'No' ) ), + 'debug' => $imagick_loaded, + ); + + // Check if a .htaccess file exists. + if ( is_file( ABSPATH . '.htaccess' ) ) { + // If the file exists, grab the content of it. + $htaccess_content = file_get_contents( ABSPATH . '.htaccess' ); + + // Filter away the core WordPress rules. + $filtered_htaccess_content = trim( preg_replace( '/\# BEGIN WordPress[\s\S]+?# END WordPress/si', '', $htaccess_content ) ); + $filtered_htaccess_content = ! empty( $filtered_htaccess_content ); + + if ( $filtered_htaccess_content ) { + /* translators: %s: .htaccess */ + $htaccess_rules_string = sprintf( __( 'Custom rules have been added to your %s file.' ), '.htaccess' ); + } else { + /* translators: %s: .htaccess */ + $htaccess_rules_string = sprintf( __( 'Your %s file contains only core WordPress features.' ), '.htaccess' ); + } + + $info['wp-server']['fields']['htaccess_extra_rules'] = array( + 'label' => __( '.htaccess rules' ), + 'value' => $htaccess_rules_string, + 'debug' => $filtered_htaccess_content, + ); + } + + // Populate the database debug fields. + if ( is_resource( $wpdb->dbh ) ) { + // Old mysql extension. + $extension = 'mysql'; + } elseif ( is_object( $wpdb->dbh ) ) { + // mysqli or PDO. + $extension = get_class( $wpdb->dbh ); + } else { + // Unknown sql extension. + $extension = null; + } + + $server = $wpdb->get_var( 'SELECT VERSION()' ); + + if ( isset( $wpdb->use_mysqli ) && $wpdb->use_mysqli ) { + $client_version = $wpdb->dbh->client_info; + } else { + // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_client_info,PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved + if ( preg_match( '|[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}|', mysql_get_client_info(), $matches ) ) { + $client_version = $matches[0]; + } else { + $client_version = null; + } + } + + $info['wp-database']['fields']['extension'] = array( + 'label' => __( 'Extension' ), + 'value' => $extension, + ); + + $info['wp-database']['fields']['server_version'] = array( + 'label' => __( 'Server version' ), + 'value' => $server, + ); + + $info['wp-database']['fields']['client_version'] = array( + 'label' => __( 'Client version' ), + 'value' => $client_version, + ); + + $info['wp-database']['fields']['database_user'] = array( + 'label' => __( 'Database username' ), + 'value' => $wpdb->dbuser, + 'private' => true, + ); + + $info['wp-database']['fields']['database_host'] = array( + 'label' => __( 'Database host' ), + 'value' => $wpdb->dbhost, + 'private' => true, + ); + + $info['wp-database']['fields']['database_name'] = array( + 'label' => __( 'Database name' ), + 'value' => $wpdb->dbname, + 'private' => true, + ); + + $info['wp-database']['fields']['database_prefix'] = array( + 'label' => __( 'Table prefix' ), + 'value' => $wpdb->prefix, + 'private' => true, + ); + + $info['wp-database']['fields']['database_charset'] = array( + 'label' => __( 'Database charset' ), + 'value' => $wpdb->charset, + 'private' => true, + ); + + $info['wp-database']['fields']['database_collate'] = array( + 'label' => __( 'Database collation' ), + 'value' => $wpdb->collate, + 'private' => true, + ); + + // List must use plugins if there are any. + $mu_plugins = get_mu_plugins(); + + foreach ( $mu_plugins as $plugin_path => $plugin ) { + $plugin_version = $plugin['Version']; + $plugin_author = $plugin['Author']; + + $plugin_version_string = __( 'No version or author information is available.' ); + $plugin_version_string_debug = 'author: (undefined), version: (undefined)'; + + if ( ! empty( $plugin_version ) && ! empty( $plugin_author ) ) { + /* translators: 1: Plugin version number. 2: Plugin author name. */ + $plugin_version_string = sprintf( __( 'Version %1$s by %2$s' ), $plugin_version, $plugin_author ); + $plugin_version_string_debug = sprintf( 'version: %s, author: %s', $plugin_version, $plugin_author ); + } else { + if ( ! empty( $plugin_author ) ) { + /* translators: %s: Plugin author name. */ + $plugin_version_string = sprintf( __( 'By %s' ), $plugin_author ); + $plugin_version_string_debug = sprintf( 'author: %s, version: (undefined)', $plugin_author ); + } + + if ( ! empty( $plugin_version ) ) { + /* translators: %s: Plugin version number. */ + $plugin_version_string = sprintf( __( 'Version %s' ), $plugin_version ); + $plugin_version_string_debug = sprintf( 'author: (undefined), version: %s', $plugin_version ); + } + } + + $info['wp-mu-plugins']['fields'][ sanitize_text_field( $plugin['Name'] ) ] = array( + 'label' => $plugin['Name'], + 'value' => $plugin_version_string, + 'debug' => $plugin_version_string_debug, + ); + } + + // List all available plugins. + $plugins = get_plugins(); + $plugin_updates = get_plugin_updates(); + + foreach ( $plugins as $plugin_path => $plugin ) { + $plugin_part = ( is_plugin_active( $plugin_path ) ) ? 'wp-plugins-active' : 'wp-plugins-inactive'; + + $plugin_version = $plugin['Version']; + $plugin_author = $plugin['Author']; + + $plugin_version_string = __( 'No version or author information is available.' ); + $plugin_version_string_debug = 'author: (undefined), version: (undefined)'; + + if ( ! empty( $plugin_version ) && ! empty( $plugin_author ) ) { + /* translators: 1: Plugin version number. 2: Plugin author name. */ + $plugin_version_string = sprintf( __( 'Version %1$s by %2$s' ), $plugin_version, $plugin_author ); + $plugin_version_string_debug = sprintf( 'version: %s, author: %s', $plugin_version, $plugin_author ); + } else { + if ( ! empty( $plugin_author ) ) { + /* translators: %s: Plugin author name. */ + $plugin_version_string = sprintf( __( 'By %s' ), $plugin_author ); + $plugin_version_string_debug = sprintf( 'author: %s, version: (undefined)', $plugin_author ); + } + + if ( ! empty( $plugin_version ) ) { + /* translators: %s: Plugin version number. */ + $plugin_version_string = sprintf( __( 'Version %s' ), $plugin_version ); + $plugin_version_string_debug = sprintf( 'author: (undefined), version: %s', $plugin_version ); + } + } + + if ( array_key_exists( $plugin_path, $plugin_updates ) ) { + /* translators: %s: Latest plugin version number. */ + $plugin_version_string .= ' ' . sprintf( __( '(Latest version: %s)' ), $plugin_updates[ $plugin_path ]->update->new_version ); + $plugin_version_string_debug .= sprintf( ' (latest version: %s)', $plugin_updates[ $plugin_path ]->update->new_version ); + } + + $info[ $plugin_part ]['fields'][ sanitize_text_field( $plugin['Name'] ) ] = array( + 'label' => $plugin['Name'], + 'value' => $plugin_version_string, + 'debug' => $plugin_version_string_debug, + ); + } + + // Populate the section for the currently active theme. + global $_wp_theme_features; + $theme_features = array(); + + if ( ! empty( $_wp_theme_features ) ) { + foreach ( $_wp_theme_features as $feature => $options ) { + $theme_features[] = $feature; + } + } + + $active_theme = wp_get_theme(); + $theme_updates = get_theme_updates(); + + $active_theme_version = $active_theme->version; + $active_theme_version_debug = $active_theme_version; + + if ( array_key_exists( $active_theme->stylesheet, $theme_updates ) ) { + $theme_update_new_version = $theme_updates[ $active_theme->stylesheet ]->update['new_version']; + + /* translators: %s: Latest theme version number. */ + $active_theme_version .= ' ' . sprintf( __( '(Latest version: %s)' ), $theme_update_new_version ); + $active_theme_version_debug .= sprintf( ' (latest version: %s)', $theme_update_new_version ); + } + + $active_theme_author_uri = $active_theme->display( 'AuthorURI' ); + + if ( $active_theme->parent_theme ) { + $active_theme_parent_theme = sprintf( + /* translators: 1: Theme name. 2: Theme slug. */ + __( '%1$s (%2$s)' ), + $active_theme->parent_theme, + $active_theme->template + ); + $active_theme_parent_theme_debug = sprintf( + '%s (%s)', + $active_theme->parent_theme, + $active_theme->template + ); + } else { + $active_theme_parent_theme = __( 'None' ); + $active_theme_parent_theme_debug = 'none'; + } + + $info['wp-active-theme']['fields'] = array( + 'name' => array( + 'label' => __( 'Name' ), + 'value' => sprintf( + /* translators: 1: Theme name. 2: Theme slug. */ + __( '%1$s (%2$s)' ), + $active_theme->name, + $active_theme->stylesheet + ), + ), + 'version' => array( + 'label' => __( 'Version' ), + 'value' => $active_theme_version, + 'debug' => $active_theme_version_debug, + ), + 'author' => array( + 'label' => __( 'Author' ), + 'value' => wp_kses( $active_theme->author, array() ), + ), + 'author_website' => array( + 'label' => __( 'Author website' ), + 'value' => ( $active_theme_author_uri ? $active_theme_author_uri : __( 'Undefined' ) ), + 'debug' => ( $active_theme_author_uri ? $active_theme_author_uri : '(undefined)' ), + ), + 'parent_theme' => array( + 'label' => __( 'Parent theme' ), + 'value' => $active_theme_parent_theme, + 'debug' => $active_theme_parent_theme_debug, + ), + 'theme_features' => array( + 'label' => __( 'Theme features' ), + 'value' => implode( ', ', $theme_features ), + ), + 'theme_path' => array( + 'label' => __( 'Theme directory location' ), + 'value' => get_stylesheet_directory(), + ), + ); + + $parent_theme = $active_theme->parent(); + + if ( $parent_theme ) { + $parent_theme_version = $parent_theme->version; + $parent_theme_version_debug = $parent_theme_version; + + if ( array_key_exists( $parent_theme->stylesheet, $theme_updates ) ) { + $parent_theme_update_new_version = $theme_updates[ $parent_theme->stylesheet ]->update['new_version']; + + /* translators: %s: Latest theme version number. */ + $parent_theme_version .= ' ' . sprintf( __( '(Latest version: %s)' ), $parent_theme_update_new_version ); + $parent_theme_version_debug .= sprintf( ' (latest version: %s)', $parent_theme_update_new_version ); + } + + $parent_theme_author_uri = $parent_theme->display( 'AuthorURI' ); + + $info['wp-parent-theme']['fields'] = array( + 'name' => array( + 'label' => __( 'Name' ), + 'value' => sprintf( + /* translators: 1: Theme name. 2: Theme slug. */ + __( '%1$s (%2$s)' ), + $parent_theme->name, + $parent_theme->stylesheet + ), + ), + 'version' => array( + 'label' => __( 'Version' ), + 'value' => $parent_theme_version, + 'debug' => $parent_theme_version_debug, + ), + 'author' => array( + 'label' => __( 'Author' ), + 'value' => wp_kses( $parent_theme->author, array() ), + ), + 'author_website' => array( + 'label' => __( 'Author website' ), + 'value' => ( $parent_theme_author_uri ? $parent_theme_author_uri : __( 'Undefined' ) ), + 'debug' => ( $parent_theme_author_uri ? $parent_theme_author_uri : '(undefined)' ), + ), + 'theme_path' => array( + 'label' => __( 'Theme directory location' ), + 'value' => get_template_directory(), + ), + ); + } + + // Populate a list of all themes available in the install. + $all_themes = wp_get_themes(); + + foreach ( $all_themes as $theme_slug => $theme ) { + // Exclude the currently active theme from the list of all themes. + if ( $active_theme->stylesheet === $theme_slug ) { + continue; + } + + // Exclude the currently active parent theme from the list of all themes. + if ( ! empty( $parent_theme ) && $parent_theme->stylesheet === $theme_slug ) { + continue; + } + + $theme_version = $theme->version; + $theme_author = $theme->author; + + // Sanitize. + $theme_author = wp_kses( $theme_author, array() ); + + $theme_version_string = __( 'No version or author information is available.' ); + $theme_version_string_debug = 'undefined'; + + if ( ! empty( $theme_version ) && ! empty( $theme_author ) ) { + /* translators: 1: Theme version number. 2: Theme author name. */ + $theme_version_string = sprintf( __( 'Version %1$s by %2$s' ), $theme_version, $theme_author ); + $theme_version_string_debug = sprintf( 'version: %s, author: %s', $theme_version, $theme_author ); + } else { + if ( ! empty( $theme_author ) ) { + /* translators: %s: Theme author name. */ + $theme_version_string = sprintf( __( 'By %s' ), $theme_author ); + $theme_version_string_debug = sprintf( 'author: %s, version: (undefined)', $theme_author ); + } + + if ( ! empty( $theme_version ) ) { + /* translators: %s: Theme version number. */ + $theme_version_string = sprintf( __( 'Version %s' ), $theme_version ); + $theme_version_string_debug = sprintf( 'author: (undefined), version: %s', $theme_version ); + } + } + + if ( array_key_exists( $theme_slug, $theme_updates ) ) { + /* translators: %s: Latest theme version number. */ + $theme_version_string .= ' ' . sprintf( __( '(Latest version: %s)' ), $theme_updates[ $theme_slug ]->update['new_version'] ); + $theme_version_string_debug .= sprintf( ' (latest version: %s)', $theme_updates[ $theme_slug ]->update['new_version'] ); + } + + $info['wp-themes-inactive']['fields'][ sanitize_text_field( $theme->name ) ] = array( + 'label' => sprintf( + /* translators: 1: Theme name. 2: Theme slug. */ + __( '%1$s (%2$s)' ), + $theme->name, + $theme_slug + ), + 'value' => $theme_version_string, + 'debug' => $theme_version_string_debug, + ); + } + + // Add more filesystem checks. + if ( defined( 'WPMU_PLUGIN_DIR' ) && is_dir( WPMU_PLUGIN_DIR ) ) { + $is_writable_wpmu_plugin_dir = wp_is_writable( WPMU_PLUGIN_DIR ); + + $info['wp-filesystem']['fields']['mu-plugins'] = array( + 'label' => __( 'The must use plugins directory' ), + 'value' => ( $is_writable_wpmu_plugin_dir ? __( 'Writable' ) : __( 'Not writable' ) ), + 'debug' => ( $is_writable_wpmu_plugin_dir ? 'writable' : 'not writable' ), + ); + } + + /** + * Add or modify the debug information. + * + * Plugin or themes may wish to introduce their own debug information without creating additional admin pages + * they can utilize this filter to introduce their own sections or add more data to existing sections. + * + * Array keys for sections added by core are all prefixed with `wp-`, plugins and themes should use their own slug as + * a prefix, both for consistency as well as avoiding key collisions. Note that the array keys are used as labels + * for the copied data. + * + * All strings are expected to be plain text except $description that can contain inline HTML tags (see below). + * + * @since 5.2.0 + * + * @param array $args { + * The debug information to be added to the core information page. + * + * This is an associative multi-dimensional array, up to three levels deep. The topmost array holds the sections. + * Each section has a `$fields` associative array (see below), and each `$value` in `$fields` can be + * another associative array of name/value pairs when there is more structured data to display. + * + * @type string $label The title for this section of the debug output. + * @type string $description Optional. A description for your information section which may contain basic HTML + * markup, inline tags only as it is outputted in a paragraph. + * @type boolean $show_count Optional. If set to `true` the amount of fields will be included in the title for + * this section. + * @type boolean $private Optional. If set to `true` the section and all associated fields will be excluded + * from the copied data. + * @type array $fields { + * An associative array containing the data to be displayed. + * + * @type string $label The label for this piece of information. + * @type string $value The output that is displayed for this field. Text should be translated. Can be + * an associative array that is displayed as name/value pairs. + * @type string $debug Optional. The output that is used for this field when the user copies the data. + * It should be more concise and not translated. If not set, the content of `$value` is used. + * Note that the array keys are used as labels for the copied data. + * @type boolean $private Optional. If set to `true` the field will not be included in the copied data + * allowing you to show, for example, API keys here. + * } + * } + */ + $info = apply_filters( 'debug_information', $info ); + + return $info; + } + + /** + * Format the information gathered for debugging, in a manner suitable for copying to a forum or support ticket. + * + * @since 5.2.0 + * + * @param array $info_array Information gathered from the `WP_Debug_Data::debug_data` function. + * @param string $type The data type to return, either 'info' or 'debug'. + * @return string The formatted data. + */ + public static function format( $info_array, $type ) { + $return = "`\n"; + + foreach ( $info_array as $section => $details ) { + // Skip this section if there are no fields, or the section has been declared as private. + if ( empty( $details['fields'] ) || ( isset( $details['private'] ) && $details['private'] ) ) { + continue; + } + + $section_label = 'debug' === $type ? $section : $details['label']; + + $return .= sprintf( + "### %s%s ###\n\n", + $section_label, + ( isset( $details['show_count'] ) && $details['show_count'] ? sprintf( ' (%d)', count( $details['fields'] ) ) : '' ) + ); + + foreach ( $details['fields'] as $field_name => $field ) { + if ( isset( $field['private'] ) && true === $field['private'] ) { + continue; + } + + if ( 'debug' === $type && isset( $field['debug'] ) ) { + $debug_data = $field['debug']; + } else { + $debug_data = $field['value']; + } + + // Can be array, one level deep only. + if ( is_array( $debug_data ) ) { + $value = ''; + + foreach ( $debug_data as $sub_field_name => $sub_field_value ) { + $value .= sprintf( "\n\t%s: %s", $sub_field_name, $sub_field_value ); + } + } elseif ( is_bool( $debug_data ) ) { + $value = $debug_data ? 'true' : 'false'; + } elseif ( empty( $debug_data ) && '0' !== $debug_data ) { + $value = 'undefined'; + } else { + $value = $debug_data; + } + + if ( 'debug' === $type ) { + $label = $field_name; + } else { + $label = $field['label']; + } + + $return .= sprintf( "%s: %s\n", $label, $value ); + } + + $return .= "\n"; + } + + $return .= '`'; + + return $return; + } + + /** + * Fetch the total size of all the database tables for the active database user. + * + * @since 5.2.0 + * + * @return int The size of the database, in bytes. + */ + public static function get_database_size() { + global $wpdb; + $size = 0; + $rows = $wpdb->get_results( 'SHOW TABLE STATUS', ARRAY_A ); + + if ( $wpdb->num_rows > 0 ) { + foreach ( $rows as $row ) { + $size += $row['Data_length'] + $row['Index_length']; + } + } + + return (int) $size; + } + + /** + * Fetch the sizes of the WordPress directories: `wordpress` (ABSPATH), `plugins`, `themes`, and `uploads`. + * Intended to supplement the array returned by `WP_Debug_Data::debug_data()`. + * + * @since 5.2.0 + * + * @return array The sizes of the directories, also the database size and total installation size. + */ + public static function get_sizes() { + $size_db = self::get_database_size(); + $upload_dir = wp_get_upload_dir(); + + /* + * We will be using the PHP max execution time to prevent the size calculations + * from causing a timeout. The default value is 30 seconds, and some + * hosts do not allow you to read configuration values. + */ + if ( function_exists( 'ini_get' ) ) { + $max_execution_time = ini_get( 'max_execution_time' ); + } + + // The max_execution_time defaults to 0 when PHP runs from cli. + // We still want to limit it below. + if ( empty( $max_execution_time ) ) { + $max_execution_time = 30; + } + + if ( $max_execution_time > 20 ) { + // If the max_execution_time is set to lower than 20 seconds, reduce it a bit to prevent + // edge-case timeouts that may happen after the size loop has finished running. + $max_execution_time -= 2; + } + + // Go through the various installation directories and calculate their sizes. + // No trailing slashes. + $paths = array( + 'wordpress_size' => untrailingslashit( ABSPATH ), + 'themes_size' => get_theme_root(), + 'plugins_size' => WP_PLUGIN_DIR, + 'uploads_size' => $upload_dir['basedir'], + ); + + $exclude = $paths; + unset( $exclude['wordpress_size'] ); + $exclude = array_values( $exclude ); + + $size_total = 0; + $all_sizes = array(); + + // Loop over all the directories we want to gather the sizes for. + foreach ( $paths as $name => $path ) { + $dir_size = null; // Default to timeout. + $results = array( + 'path' => $path, + 'raw' => 0, + ); + + if ( microtime( true ) - WP_START_TIMESTAMP < $max_execution_time ) { + if ( 'wordpress_size' === $name ) { + $dir_size = recurse_dirsize( $path, $exclude, $max_execution_time ); + } else { + $dir_size = recurse_dirsize( $path, null, $max_execution_time ); + } + } + + if ( false === $dir_size ) { + // Error reading. + $results['size'] = __( 'The size cannot be calculated. The directory is not accessible. Usually caused by invalid permissions.' ); + $results['debug'] = 'not accessible'; + + // Stop total size calculation. + $size_total = null; + } elseif ( null === $dir_size ) { + // Timeout. + $results['size'] = __( 'The directory size calculation has timed out. Usually caused by a very large number of sub-directories and files.' ); + $results['debug'] = 'timeout while calculating size'; + + // Stop total size calculation. + $size_total = null; + } else { + if ( null !== $size_total ) { + $size_total += $dir_size; + } + + $results['raw'] = $dir_size; + $results['size'] = size_format( $dir_size, 2 ); + $results['debug'] = $results['size'] . " ({$dir_size} bytes)"; + } + + $all_sizes[ $name ] = $results; + } + + if ( $size_db > 0 ) { + $database_size = size_format( $size_db, 2 ); + + $all_sizes['database_size'] = array( + 'raw' => $size_db, + 'size' => $database_size, + 'debug' => $database_size . " ({$size_db} bytes)", + ); + } else { + $all_sizes['database_size'] = array( + 'size' => __( 'Not available' ), + 'debug' => 'not available', + ); + } + + if ( null !== $size_total && $size_db > 0 ) { + $total_size = $size_total + $size_db; + $total_size_mb = size_format( $total_size, 2 ); + + $all_sizes['total_size'] = array( + 'raw' => $total_size, + 'size' => $total_size_mb, + 'debug' => $total_size_mb . " ({$total_size} bytes)", + ); + } else { + $all_sizes['total_size'] = array( + 'size' => __( 'Total size is not available. Some errors were encountered when determining the size of your installation.' ), + 'debug' => 'not available', + ); + } + + return $all_sizes; + } +} diff --git a/wp-admin/includes/class-wp-filesystem-base.php b/wp-admin/includes/class-wp-filesystem-base.php new file mode 100644 index 0000000..d9459b3 --- /dev/null +++ b/wp-admin/includes/class-wp-filesystem-base.php @@ -0,0 +1,831 @@ +find_folder( ABSPATH ); + // Perhaps the FTP folder is rooted at the WordPress install. + // Check for wp-includes folder in root. Could have some false positives, but rare. + if ( ! $folder && $this->is_dir( '/' . WPINC ) ) { + $folder = '/'; + } + return $folder; + } + + /** + * Returns the path on the remote filesystem of WP_CONTENT_DIR. + * + * @since 2.7.0 + * + * @return string The location of the remote path. + */ + public function wp_content_dir() { + return $this->find_folder( WP_CONTENT_DIR ); + } + + /** + * Returns the path on the remote filesystem of WP_PLUGIN_DIR. + * + * @since 2.7.0 + * + * @return string The location of the remote path. + */ + public function wp_plugins_dir() { + return $this->find_folder( WP_PLUGIN_DIR ); + } + + /** + * Returns the path on the remote filesystem of the Themes Directory. + * + * @since 2.7.0 + * + * @param string|false $theme Optional. The theme stylesheet or template for the directory. + * Default false. + * @return string The location of the remote path. + */ + public function wp_themes_dir( $theme = false ) { + $theme_root = get_theme_root( $theme ); + + // Account for relative theme roots. + if ( '/themes' == $theme_root || ! is_dir( $theme_root ) ) { + $theme_root = WP_CONTENT_DIR . $theme_root; + } + + return $this->find_folder( $theme_root ); + } + + /** + * Returns the path on the remote filesystem of WP_LANG_DIR. + * + * @since 3.2.0 + * + * @return string The location of the remote path. + */ + public function wp_lang_dir() { + return $this->find_folder( WP_LANG_DIR ); + } + + /** + * Locates a folder on the remote filesystem. + * + * @since 2.5.0 + * @deprecated 2.7.0 use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() instead. + * @see WP_Filesystem::abspath() + * @see WP_Filesystem::wp_content_dir() + * @see WP_Filesystem::wp_plugins_dir() + * @see WP_Filesystem::wp_themes_dir() + * @see WP_Filesystem::wp_lang_dir() + * + * @param string $base The folder to start searching from. + * @param bool $echo True to display debug information. + * Default false. + * @return string The location of the remote path. + */ + public function find_base_dir( $base = '.', $echo = false ) { + _deprecated_function( __FUNCTION__, '2.7.0', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' ); + $this->verbose = $echo; + return $this->abspath(); + } + + /** + * Locates a folder on the remote filesystem. + * + * @since 2.5.0 + * @deprecated 2.7.0 use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() methods instead. + * @see WP_Filesystem::abspath() + * @see WP_Filesystem::wp_content_dir() + * @see WP_Filesystem::wp_plugins_dir() + * @see WP_Filesystem::wp_themes_dir() + * @see WP_Filesystem::wp_lang_dir() + * + * @param string $base The folder to start searching from. + * @param bool $echo True to display debug information. + * @return string The location of the remote path. + */ + public function get_base_dir( $base = '.', $echo = false ) { + _deprecated_function( __FUNCTION__, '2.7.0', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' ); + $this->verbose = $echo; + return $this->abspath(); + } + + /** + * Locates a folder on the remote filesystem. + * + * Assumes that on Windows systems, Stripping off the Drive + * letter is OK Sanitizes \\ to / in Windows filepaths. + * + * @since 2.7.0 + * + * @param string $folder the folder to locate. + * @return string|false The location of the remote path, false on failure. + */ + public function find_folder( $folder ) { + if ( isset( $this->cache[ $folder ] ) ) { + return $this->cache[ $folder ]; + } + + if ( stripos( $this->method, 'ftp' ) !== false ) { + $constant_overrides = array( + 'FTP_BASE' => ABSPATH, + 'FTP_CONTENT_DIR' => WP_CONTENT_DIR, + 'FTP_PLUGIN_DIR' => WP_PLUGIN_DIR, + 'FTP_LANG_DIR' => WP_LANG_DIR, + ); + + // Direct matches ( folder = CONSTANT/ ). + foreach ( $constant_overrides as $constant => $dir ) { + if ( ! defined( $constant ) ) { + continue; + } + if ( $folder === $dir ) { + return trailingslashit( constant( $constant ) ); + } + } + + // Prefix matches ( folder = CONSTANT/subdir ), + foreach ( $constant_overrides as $constant => $dir ) { + if ( ! defined( $constant ) ) { + continue; + } + if ( 0 === stripos( $folder, $dir ) ) { // $folder starts with $dir. + $potential_folder = preg_replace( '#^' . preg_quote( $dir, '#' ) . '/#i', trailingslashit( constant( $constant ) ), $folder ); + $potential_folder = trailingslashit( $potential_folder ); + + if ( $this->is_dir( $potential_folder ) ) { + $this->cache[ $folder ] = $potential_folder; + return $potential_folder; + } + } + } + } elseif ( 'direct' == $this->method ) { + $folder = str_replace( '\\', '/', $folder ); // Windows path sanitisation. + return trailingslashit( $folder ); + } + + $folder = preg_replace( '|^([a-z]{1}):|i', '', $folder ); // Strip out Windows drive letter if it's there. + $folder = str_replace( '\\', '/', $folder ); // Windows path sanitisation. + + if ( isset( $this->cache[ $folder ] ) ) { + return $this->cache[ $folder ]; + } + + if ( $this->exists( $folder ) ) { // Folder exists at that absolute path. + $folder = trailingslashit( $folder ); + $this->cache[ $folder ] = $folder; + return $folder; + } + $return = $this->search_for_folder( $folder ); + if ( $return ) { + $this->cache[ $folder ] = $return; + } + return $return; + } + + /** + * Locates a folder on the remote filesystem. + * + * Expects Windows sanitized path. + * + * @since 2.7.0 + * + * @param string $folder The folder to locate. + * @param string $base The folder to start searching from. + * @param bool $loop If the function has recursed. Internal use only. + * @return string|false The location of the remote path, false to cease looping. + */ + public function search_for_folder( $folder, $base = '.', $loop = false ) { + if ( empty( $base ) || '.' == $base ) { + $base = trailingslashit( $this->cwd() ); + } + + $folder = untrailingslashit( $folder ); + + if ( $this->verbose ) { + /* translators: 1: Folder to locate, 2: Folder to start searching from. */ + printf( "\n" . __( 'Looking for %1$s in %2$s' ) . "
        \n", $folder, $base ); + } + + $folder_parts = explode( '/', $folder ); + $folder_part_keys = array_keys( $folder_parts ); + $last_index = array_pop( $folder_part_keys ); + $last_path = $folder_parts[ $last_index ]; + + $files = $this->dirlist( $base ); + + foreach ( $folder_parts as $index => $key ) { + if ( $index == $last_index ) { + continue; // We want this to be caught by the next code block. + } + + /* + * Working from /home/ to /user/ to /wordpress/ see if that file exists within + * the current folder, If it's found, change into it and follow through looking + * for it. If it can't find WordPress down that route, it'll continue onto the next + * folder level, and see if that matches, and so on. If it reaches the end, and still + * can't find it, it'll return false for the entire function. + */ + if ( isset( $files[ $key ] ) ) { + + // Let's try that folder: + $newdir = trailingslashit( path_join( $base, $key ) ); + if ( $this->verbose ) { + /* translators: %s: Directory name. */ + printf( "\n" . __( 'Changing to %s' ) . "
        \n", $newdir ); + } + + // Only search for the remaining path tokens in the directory, not the full path again. + $newfolder = implode( '/', array_slice( $folder_parts, $index + 1 ) ); + $ret = $this->search_for_folder( $newfolder, $newdir, $loop ); + if ( $ret ) { + return $ret; + } + } + } + + // Only check this as a last resort, to prevent locating the incorrect install. + // All above procedures will fail quickly if this is the right branch to take. + if ( isset( $files[ $last_path ] ) ) { + if ( $this->verbose ) { + /* translators: %s: Directory name. */ + printf( "\n" . __( 'Found %s' ) . "
        \n", $base . $last_path ); + } + return trailingslashit( $base . $last_path ); + } + + // Prevent this function from looping again. + // No need to proceed if we've just searched in `/`. + if ( $loop || '/' == $base ) { + return false; + } + + // As an extra last resort, Change back to / if the folder wasn't found. + // This comes into effect when the CWD is /home/user/ but WP is at /var/www/.... + return $this->search_for_folder( $folder, '/', true ); + + } + + /** + * Returns the *nix-style file permissions for a file. + * + * From the PHP documentation page for fileperms(). + * + * @link https://www.php.net/manual/en/function.fileperms.php + * + * @since 2.5.0 + * + * @param string $file String filename. + * @return string The *nix-style representation of permissions. + */ + public function gethchmod( $file ) { + $perms = intval( $this->getchmod( $file ), 8 ); + if ( ( $perms & 0xC000 ) == 0xC000 ) { // Socket. + $info = 's'; + } elseif ( ( $perms & 0xA000 ) == 0xA000 ) { // Symbolic Link. + $info = 'l'; + } elseif ( ( $perms & 0x8000 ) == 0x8000 ) { // Regular. + $info = '-'; + } elseif ( ( $perms & 0x6000 ) == 0x6000 ) { // Block special. + $info = 'b'; + } elseif ( ( $perms & 0x4000 ) == 0x4000 ) { // Directory. + $info = 'd'; + } elseif ( ( $perms & 0x2000 ) == 0x2000 ) { // Character special. + $info = 'c'; + } elseif ( ( $perms & 0x1000 ) == 0x1000 ) { // FIFO pipe. + $info = 'p'; + } else { // Unknown. + $info = 'u'; + } + + // Owner. + $info .= ( ( $perms & 0x0100 ) ? 'r' : '-' ); + $info .= ( ( $perms & 0x0080 ) ? 'w' : '-' ); + $info .= ( ( $perms & 0x0040 ) ? + ( ( $perms & 0x0800 ) ? 's' : 'x' ) : + ( ( $perms & 0x0800 ) ? 'S' : '-' ) ); + + // Group. + $info .= ( ( $perms & 0x0020 ) ? 'r' : '-' ); + $info .= ( ( $perms & 0x0010 ) ? 'w' : '-' ); + $info .= ( ( $perms & 0x0008 ) ? + ( ( $perms & 0x0400 ) ? 's' : 'x' ) : + ( ( $perms & 0x0400 ) ? 'S' : '-' ) ); + + // World. + $info .= ( ( $perms & 0x0004 ) ? 'r' : '-' ); + $info .= ( ( $perms & 0x0002 ) ? 'w' : '-' ); + $info .= ( ( $perms & 0x0001 ) ? + ( ( $perms & 0x0200 ) ? 't' : 'x' ) : + ( ( $perms & 0x0200 ) ? 'T' : '-' ) ); + return $info; + } + + /** + * Gets the permissions of the specified file or filepath in their octal format. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string Mode of the file (the last 3 digits). + */ + public function getchmod( $file ) { + return '777'; + } + + /** + * Converts *nix-style file permissions to a octal number. + * + * Converts '-rw-r--r--' to 0644 + * From "info at rvgate dot nl"'s comment on the PHP documentation for chmod() + * + * @link https://www.php.net/manual/en/function.chmod.php#49614 + * + * @since 2.5.0 + * + * @param string $mode string The *nix-style file permission. + * @return int octal representation + */ + public function getnumchmodfromh( $mode ) { + $realmode = ''; + $legal = array( '', 'w', 'r', 'x', '-' ); + $attarray = preg_split( '//', $mode ); + + for ( $i = 0, $c = count( $attarray ); $i < $c; $i++ ) { + $key = array_search( $attarray[ $i ], $legal ); + if ( $key ) { + $realmode .= $legal[ $key ]; + } + } + + $mode = str_pad( $realmode, 10, '-', STR_PAD_LEFT ); + $trans = array( + '-' => '0', + 'r' => '4', + 'w' => '2', + 'x' => '1', + ); + $mode = strtr( $mode, $trans ); + + $newmode = $mode[0]; + $newmode .= $mode[1] + $mode[2] + $mode[3]; + $newmode .= $mode[4] + $mode[5] + $mode[6]; + $newmode .= $mode[7] + $mode[8] + $mode[9]; + return $newmode; + } + + /** + * Determines if the string provided contains binary characters. + * + * @since 2.7.0 + * + * @param string $text String to test against. + * @return bool True if string is binary, false otherwise. + */ + public function is_binary( $text ) { + return (bool) preg_match( '|[^\x20-\x7E]|', $text ); // chr(32)..chr(127) + } + + /** + * Changes the owner of a file or directory. + * + * Default behavior is to do nothing, override this in your subclass, if desired. + * + * @since 2.5.0 + * + * @param string $file Path to the file or directory. + * @param string|int $owner A user name or number. + * @param bool $recursive Optional. If set to true, changes file owner recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chown( $file, $owner, $recursive = false ) { + return false; + } + + /** + * Connects filesystem. + * + * @since 2.5.0 + * @abstract + * + * @return bool True on success, false on failure (always true for WP_Filesystem_Direct). + */ + public function connect() { + return true; + } + + /** + * Reads entire file into a string. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Name of the file to read. + * @return string|false Read data on success, false on failure. + */ + public function get_contents( $file ) { + return false; + } + + /** + * Reads entire file into an array. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to the file. + * @return array|false File contents in an array on success, false on failure. + */ + public function get_contents_array( $file ) { + return false; + } + + /** + * Writes a string to a file. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Remote path to the file where to write the data. + * @param string $contents The data to write. + * @param int|false $mode Optional. The file permissions as octal number, usually 0644. + * Default false. + * @return bool True on success, false on failure. + */ + public function put_contents( $file, $contents, $mode = false ) { + return false; + } + + /** + * Gets the current working directory. + * + * @since 2.5.0 + * @abstract + * + * @return string|false The current working directory on success, false on failure. + */ + public function cwd() { + return false; + } + + /** + * Changes current directory. + * + * @since 2.5.0 + * @abstract + * + * @param string $dir The new current directory. + * @return bool True on success, false on failure. + */ + public function chdir( $dir ) { + return false; + } + + /** + * Changes the file group. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to the file. + * @param string|int $group A group name or number. + * @param bool $recursive Optional. If set to true, changes file group recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chgrp( $file, $group, $recursive = false ) { + return false; + } + + /** + * Changes filesystem permissions. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to the file. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for directories. Default false. + * @param bool $recursive Optional. If set to true, changes file permissions recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chmod( $file, $mode = false, $recursive = false ) { + return false; + } + + /** + * Gets the file owner. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to the file. + * @return string|false Username of the owner on success, false on failure. + */ + public function owner( $file ) { + return false; + } + + /** + * Gets the file's group. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to the file. + * @return string|false The group on success, false on failure. + */ + public function group( $file ) { + return false; + } + + /** + * Copies a file. + * + * @since 2.5.0 + * @abstract + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for dirs. Default false. + * @return bool True on success, false on failure. + */ + public function copy( $source, $destination, $overwrite = false, $mode = false ) { + return false; + } + + /** + * Moves a file. + * + * @since 2.5.0 + * @abstract + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @return bool True on success, false on failure. + */ + public function move( $source, $destination, $overwrite = false ) { + return false; + } + + /** + * Deletes a file or directory. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to the file or directory. + * @param bool $recursive Optional. If set to true, deletes files and folders recursively. + * Default false. + * @param string|false $type Type of resource. 'f' for file, 'd' for directory. + * Default false. + * @return bool True on success, false on failure. + */ + public function delete( $file, $recursive = false, $type = false ) { + return false; + } + + /** + * Checks if a file or directory exists. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to file or directory. + * @return bool Whether $file exists or not. + */ + public function exists( $file ) { + return false; + } + + /** + * Checks if resource is a file. + * + * @since 2.5.0 + * @abstract + * + * @param string $file File path. + * @return bool Whether $file is a file. + */ + public function is_file( $file ) { + return false; + } + + /** + * Checks if resource is a directory. + * + * @since 2.5.0 + * @abstract + * + * @param string $path Directory path. + * @return bool Whether $path is a directory. + */ + public function is_dir( $path ) { + return false; + } + + /** + * Checks if a file is readable. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to file. + * @return bool Whether $file is readable. + */ + public function is_readable( $file ) { + return false; + } + + /** + * Checks if a file or directory is writable. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to file or directory. + * @return bool Whether $file is writable. + */ + public function is_writable( $file ) { + return false; + } + + /** + * Gets the file's last access time. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing last access time, false on failure. + */ + public function atime( $file ) { + return false; + } + + /** + * Gets the file modification time. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing modification time, false on failure. + */ + public function mtime( $file ) { + return false; + } + + /** + * Gets the file size (in bytes). + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to file. + * @return int|false Size of the file in bytes on success, false on failure. + */ + public function size( $file ) { + return false; + } + + /** + * Sets the access and modification times of a file. + * + * Note: If $file doesn't exist, it will be created. + * + * @since 2.5.0 + * @abstract + * + * @param string $file Path to file. + * @param int $time Optional. Modified time to set for file. + * Default 0. + * @param int $atime Optional. Access time to set for file. + * Default 0. + * @return bool True on success, false on failure. + */ + public function touch( $file, $time = 0, $atime = 0 ) { + return false; + } + + /** + * Creates a directory. + * + * @since 2.5.0 + * @abstract + * + * @param string $path Path for new directory. + * @param int|false $chmod Optional. The permissions as octal number (or false to skip chmod). + * Default false. + * @param string|int $chown Optional. A user name or number (or false to skip chown). + * Default false. + * @param string|int $chgrp Optional. A group name or number (or false to skip chgrp). + * Default false. + * @return bool True on success, false on failure. + */ + public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) { + return false; + } + + /** + * Deletes a directory. + * + * @since 2.5.0 + * @abstract + * + * @param string $path Path to directory. + * @param bool $recursive Optional. Whether to recursively remove files/directories. + * Default false. + * @return bool True on success, false on failure. + */ + public function rmdir( $path, $recursive = false ) { + return false; + } + + /** + * Gets details for files in a directory or a specific file. + * + * @since 2.5.0 + * @abstract + * + * @param string $path Path to directory or file. + * @param bool $include_hidden Optional. Whether to include details of hidden ("." prefixed) files. + * Default true. + * @param bool $recursive Optional. Whether to recursively include file details in nested directories. + * Default false. + * @return array|false { + * Array of files. False if unable to list directory contents. + * + * @type string $name Name of the file or directory. + * @type string $perms *nix representation of permissions. + * @type int $permsn Octal representation of permissions. + * @type string $owner Owner name or ID. + * @type int $size Size of file in bytes. + * @type int $lastmodunix Last modified unix timestamp. + * @type mixed $lastmod Last modified month (3 letter) and day (without leading 0). + * @type int $time Last modified time. + * @type string $type Type of resource. 'f' for file, 'd' for directory. + * @type mixed $files If a directory and $recursive is true, contains another array of files. + * } + */ + public function dirlist( $path, $include_hidden = true, $recursive = false ) { + return false; + } + +} diff --git a/wp-admin/includes/class-wp-filesystem-direct.php b/wp-admin/includes/class-wp-filesystem-direct.php new file mode 100644 index 0000000..1676a55 --- /dev/null +++ b/wp-admin/includes/class-wp-filesystem-direct.php @@ -0,0 +1,620 @@ +method = 'direct'; + $this->errors = new WP_Error(); + } + + /** + * Reads entire file into a string. + * + * @since 2.5.0 + * + * @param string $file Name of the file to read. + * @return string|false Read data on success, false on failure. + */ + public function get_contents( $file ) { + return @file_get_contents( $file ); + } + + /** + * Reads entire file into an array. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return array|false File contents in an array on success, false on failure. + */ + public function get_contents_array( $file ) { + return @file( $file ); + } + + /** + * Writes a string to a file. + * + * @since 2.5.0 + * + * @param string $file Remote path to the file where to write the data. + * @param string $contents The data to write. + * @param int|false $mode Optional. The file permissions as octal number, usually 0644. + * Default false. + * @return bool True on success, false on failure. + */ + public function put_contents( $file, $contents, $mode = false ) { + $fp = @fopen( $file, 'wb' ); + if ( ! $fp ) { + return false; + } + + mbstring_binary_safe_encoding(); + + $data_length = strlen( $contents ); + + $bytes_written = fwrite( $fp, $contents ); + + reset_mbstring_encoding(); + + fclose( $fp ); + + if ( $data_length !== $bytes_written ) { + return false; + } + + $this->chmod( $file, $mode ); + + return true; + } + + /** + * Gets the current working directory. + * + * @since 2.5.0 + * + * @return string|false The current working directory on success, false on failure. + */ + public function cwd() { + return getcwd(); + } + + /** + * Changes current directory. + * + * @since 2.5.0 + * + * @param string $dir The new current directory. + * @return bool True on success, false on failure. + */ + public function chdir( $dir ) { + return @chdir( $dir ); + } + + /** + * Changes the file group. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @param string|int $group A group name or number. + * @param bool $recursive Optional. If set to true, changes file group recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chgrp( $file, $group, $recursive = false ) { + if ( ! $this->exists( $file ) ) { + return false; + } + if ( ! $recursive ) { + return chgrp( $file, $group ); + } + if ( ! $this->is_dir( $file ) ) { + return chgrp( $file, $group ); + } + // Is a directory, and we want recursive. + $file = trailingslashit( $file ); + $filelist = $this->dirlist( $file ); + foreach ( $filelist as $filename ) { + $this->chgrp( $file . $filename, $group, $recursive ); + } + + return true; + } + + /** + * Changes filesystem permissions. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for directories. Default false. + * @param bool $recursive Optional. If set to true, changes file permissions recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chmod( $file, $mode = false, $recursive = false ) { + if ( ! $mode ) { + if ( $this->is_file( $file ) ) { + $mode = FS_CHMOD_FILE; + } elseif ( $this->is_dir( $file ) ) { + $mode = FS_CHMOD_DIR; + } else { + return false; + } + } + + if ( ! $recursive || ! $this->is_dir( $file ) ) { + return chmod( $file, $mode ); + } + // Is a directory, and we want recursive. + $file = trailingslashit( $file ); + $filelist = $this->dirlist( $file ); + foreach ( (array) $filelist as $filename => $filemeta ) { + $this->chmod( $file . $filename, $mode, $recursive ); + } + + return true; + } + + /** + * Changes the owner of a file or directory. + * + * @since 2.5.0 + * + * @param string $file Path to the file or directory. + * @param string|int $owner A user name or number. + * @param bool $recursive Optional. If set to true, changes file owner recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chown( $file, $owner, $recursive = false ) { + if ( ! $this->exists( $file ) ) { + return false; + } + if ( ! $recursive ) { + return chown( $file, $owner ); + } + if ( ! $this->is_dir( $file ) ) { + return chown( $file, $owner ); + } + // Is a directory, and we want recursive. + $filelist = $this->dirlist( $file ); + foreach ( $filelist as $filename ) { + $this->chown( $file . '/' . $filename, $owner, $recursive ); + } + return true; + } + + /** + * Gets the file owner. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string|false Username of the owner on success, false on failure. + */ + public function owner( $file ) { + $owneruid = @fileowner( $file ); + if ( ! $owneruid ) { + return false; + } + if ( ! function_exists( 'posix_getpwuid' ) ) { + return $owneruid; + } + $ownerarray = posix_getpwuid( $owneruid ); + return $ownerarray['name']; + } + + /** + * Gets the permissions of the specified file or filepath in their octal format. + * + * FIXME does not handle errors in fileperms() + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string Mode of the file (the last 3 digits). + */ + public function getchmod( $file ) { + return substr( decoct( @fileperms( $file ) ), -3 ); + } + + /** + * Gets the file's group. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string|false The group on success, false on failure. + */ + public function group( $file ) { + $gid = @filegroup( $file ); + if ( ! $gid ) { + return false; + } + if ( ! function_exists( 'posix_getgrgid' ) ) { + return $gid; + } + $grouparray = posix_getgrgid( $gid ); + return $grouparray['name']; + } + + /** + * Copies a file. + * + * @since 2.5.0 + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for dirs. Default false. + * @return bool True on success, false on failure. + */ + public function copy( $source, $destination, $overwrite = false, $mode = false ) { + if ( ! $overwrite && $this->exists( $destination ) ) { + return false; + } + + $rtval = copy( $source, $destination ); + if ( $mode ) { + $this->chmod( $destination, $mode ); + } + return $rtval; + } + + /** + * Moves a file. + * + * @since 2.5.0 + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @return bool True on success, false on failure. + */ + public function move( $source, $destination, $overwrite = false ) { + if ( ! $overwrite && $this->exists( $destination ) ) { + return false; + } + + // Try using rename first. if that fails (for example, source is read only) try copy. + if ( @rename( $source, $destination ) ) { + return true; + } + + if ( $this->copy( $source, $destination, $overwrite ) && $this->exists( $destination ) ) { + $this->delete( $source ); + return true; + } else { + return false; + } + } + + /** + * Deletes a file or directory. + * + * @since 2.5.0 + * + * @param string $file Path to the file or directory. + * @param bool $recursive Optional. If set to true, deletes files and folders recursively. + * Default false. + * @param string|false $type Type of resource. 'f' for file, 'd' for directory. + * Default false. + * @return bool True on success, false on failure. + */ + public function delete( $file, $recursive = false, $type = false ) { + if ( empty( $file ) ) { + // Some filesystems report this as /, which can cause non-expected recursive deletion of all files in the filesystem. + return false; + } + $file = str_replace( '\\', '/', $file ); // For Win32, occasional problems deleting files otherwise. + + if ( 'f' == $type || $this->is_file( $file ) ) { + return @unlink( $file ); + } + if ( ! $recursive && $this->is_dir( $file ) ) { + return @rmdir( $file ); + } + + // At this point it's a folder, and we're in recursive mode. + $file = trailingslashit( $file ); + $filelist = $this->dirlist( $file, true ); + + $retval = true; + if ( is_array( $filelist ) ) { + foreach ( $filelist as $filename => $fileinfo ) { + if ( ! $this->delete( $file . $filename, $recursive, $fileinfo['type'] ) ) { + $retval = false; + } + } + } + + if ( file_exists( $file ) && ! @rmdir( $file ) ) { + $retval = false; + } + + return $retval; + } + + /** + * Checks if a file or directory exists. + * + * @since 2.5.0 + * + * @param string $file Path to file or directory. + * @return bool Whether $file exists or not. + */ + public function exists( $file ) { + return @file_exists( $file ); + } + + /** + * Checks if resource is a file. + * + * @since 2.5.0 + * + * @param string $file File path. + * @return bool Whether $file is a file. + */ + public function is_file( $file ) { + return @is_file( $file ); + } + + /** + * Checks if resource is a directory. + * + * @since 2.5.0 + * + * @param string $path Directory path. + * @return bool Whether $path is a directory. + */ + public function is_dir( $path ) { + return @is_dir( $path ); + } + + /** + * Checks if a file is readable. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return bool Whether $file is readable. + */ + public function is_readable( $file ) { + return @is_readable( $file ); + } + + /** + * Checks if a file or directory is writable. + * + * @since 2.5.0 + * + * @param string $file Path to file or directory. + * @return bool Whether $file is writable. + */ + public function is_writable( $file ) { + return @is_writable( $file ); + } + + /** + * Gets the file's last access time. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing last access time, false on failure. + */ + public function atime( $file ) { + return @fileatime( $file ); + } + + /** + * Gets the file modification time. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing modification time, false on failure. + */ + public function mtime( $file ) { + return @filemtime( $file ); + } + + /** + * Gets the file size (in bytes). + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return int|false Size of the file in bytes on success, false on failure. + */ + public function size( $file ) { + return @filesize( $file ); + } + + /** + * Sets the access and modification times of a file. + * + * Note: If $file doesn't exist, it will be created. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @param int $time Optional. Modified time to set for file. + * Default 0. + * @param int $atime Optional. Access time to set for file. + * Default 0. + * @return bool True on success, false on failure. + */ + public function touch( $file, $time = 0, $atime = 0 ) { + if ( 0 == $time ) { + $time = time(); + } + if ( 0 == $atime ) { + $atime = time(); + } + return touch( $file, $time, $atime ); + } + + /** + * Creates a directory. + * + * @since 2.5.0 + * + * @param string $path Path for new directory. + * @param int|false $chmod Optional. The permissions as octal number (or false to skip chmod). + * Default false. + * @param string|int $chown Optional. A user name or number (or false to skip chown). + * Default false. + * @param string|int $chgrp Optional. A group name or number (or false to skip chgrp). + * Default false. + * @return bool True on success, false on failure. + */ + public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) { + // Safe mode fails with a trailing slash under certain PHP versions. + $path = untrailingslashit( $path ); + if ( empty( $path ) ) { + return false; + } + + if ( ! $chmod ) { + $chmod = FS_CHMOD_DIR; + } + + if ( ! @mkdir( $path ) ) { + return false; + } + $this->chmod( $path, $chmod ); + if ( $chown ) { + $this->chown( $path, $chown ); + } + if ( $chgrp ) { + $this->chgrp( $path, $chgrp ); + } + return true; + } + + /** + * Deletes a directory. + * + * @since 2.5.0 + * + * @param string $path Path to directory. + * @param bool $recursive Optional. Whether to recursively remove files/directories. + * Default false. + * @return bool True on success, false on failure. + */ + public function rmdir( $path, $recursive = false ) { + return $this->delete( $path, $recursive ); + } + + /** + * Gets details for files in a directory or a specific file. + * + * @since 2.5.0 + * + * @param string $path Path to directory or file. + * @param bool $include_hidden Optional. Whether to include details of hidden ("." prefixed) files. + * Default true. + * @param bool $recursive Optional. Whether to recursively include file details in nested directories. + * Default false. + * @return array|false { + * Array of files. False if unable to list directory contents. + * + * @type string $name Name of the file or directory. + * @type string $perms *nix representation of permissions. + * @type int $permsn Octal representation of permissions. + * @type string $owner Owner name or ID. + * @type int $size Size of file in bytes. + * @type int $lastmodunix Last modified unix timestamp. + * @type mixed $lastmod Last modified month (3 letter) and day (without leading 0). + * @type int $time Last modified time. + * @type string $type Type of resource. 'f' for file, 'd' for directory. + * @type mixed $files If a directory and $recursive is true, contains another array of files. + * } + */ + public function dirlist( $path, $include_hidden = true, $recursive = false ) { + if ( $this->is_file( $path ) ) { + $limit_file = basename( $path ); + $path = dirname( $path ); + } else { + $limit_file = false; + } + + if ( ! $this->is_dir( $path ) || ! $this->is_readable( $path ) ) { + return false; + } + + $dir = dir( $path ); + if ( ! $dir ) { + return false; + } + + $ret = array(); + + while ( false !== ( $entry = $dir->read() ) ) { + $struc = array(); + $struc['name'] = $entry; + + if ( '.' == $struc['name'] || '..' == $struc['name'] ) { + continue; + } + + if ( ! $include_hidden && '.' == $struc['name'][0] ) { + continue; + } + + if ( $limit_file && $struc['name'] != $limit_file ) { + continue; + } + + $struc['perms'] = $this->gethchmod( $path . '/' . $entry ); + $struc['permsn'] = $this->getnumchmodfromh( $struc['perms'] ); + $struc['number'] = false; + $struc['owner'] = $this->owner( $path . '/' . $entry ); + $struc['group'] = $this->group( $path . '/' . $entry ); + $struc['size'] = $this->size( $path . '/' . $entry ); + $struc['lastmodunix'] = $this->mtime( $path . '/' . $entry ); + $struc['lastmod'] = gmdate( 'M j', $struc['lastmodunix'] ); + $struc['time'] = gmdate( 'h:i:s', $struc['lastmodunix'] ); + $struc['type'] = $this->is_dir( $path . '/' . $entry ) ? 'd' : 'f'; + + if ( 'd' == $struc['type'] ) { + if ( $recursive ) { + $struc['files'] = $this->dirlist( $path . '/' . $struc['name'], $include_hidden, $recursive ); + } else { + $struc['files'] = array(); + } + } + + $ret[ $struc['name'] ] = $struc; + } + $dir->close(); + unset( $dir ); + return $ret; + } +} diff --git a/wp-admin/includes/class-wp-filesystem-ftpext.php b/wp-admin/includes/class-wp-filesystem-ftpext.php new file mode 100644 index 0000000..241621e --- /dev/null +++ b/wp-admin/includes/class-wp-filesystem-ftpext.php @@ -0,0 +1,738 @@ +method = 'ftpext'; + $this->errors = new WP_Error(); + + // Check if possible to use ftp functions. + if ( ! extension_loaded( 'ftp' ) ) { + $this->errors->add( 'no_ftp_ext', __( 'The ftp PHP extension is not available' ) ); + return; + } + + // This class uses the timeout on a per-connection basis, others use it on a per-action basis. + if ( ! defined( 'FS_TIMEOUT' ) ) { + define( 'FS_TIMEOUT', 240 ); + } + + if ( empty( $opt['port'] ) ) { + $this->options['port'] = 21; + } else { + $this->options['port'] = $opt['port']; + } + + if ( empty( $opt['hostname'] ) ) { + $this->errors->add( 'empty_hostname', __( 'FTP hostname is required' ) ); + } else { + $this->options['hostname'] = $opt['hostname']; + } + + // Check if the options provided are OK. + if ( empty( $opt['username'] ) ) { + $this->errors->add( 'empty_username', __( 'FTP username is required' ) ); + } else { + $this->options['username'] = $opt['username']; + } + + if ( empty( $opt['password'] ) ) { + $this->errors->add( 'empty_password', __( 'FTP password is required' ) ); + } else { + $this->options['password'] = $opt['password']; + } + + $this->options['ssl'] = false; + if ( isset( $opt['connection_type'] ) && 'ftps' == $opt['connection_type'] ) { + $this->options['ssl'] = true; + } + } + + /** + * Connects filesystem. + * + * @since 2.5.0 + * + * @return bool True on success, false on failure. + */ + public function connect() { + if ( isset( $this->options['ssl'] ) && $this->options['ssl'] && function_exists( 'ftp_ssl_connect' ) ) { + $this->link = @ftp_ssl_connect( $this->options['hostname'], $this->options['port'], FS_CONNECT_TIMEOUT ); + } else { + $this->link = @ftp_connect( $this->options['hostname'], $this->options['port'], FS_CONNECT_TIMEOUT ); + } + + if ( ! $this->link ) { + $this->errors->add( + 'connect', + sprintf( + /* translators: %s: hostname:port */ + __( 'Failed to connect to FTP Server %s' ), + $this->options['hostname'] . ':' . $this->options['port'] + ) + ); + return false; + } + + if ( ! @ftp_login( $this->link, $this->options['username'], $this->options['password'] ) ) { + $this->errors->add( + 'auth', + sprintf( + /* translators: %s: Username. */ + __( 'Username/Password incorrect for %s' ), + $this->options['username'] + ) + ); + return false; + } + + // Set the connection to use Passive FTP. + ftp_pasv( $this->link, true ); + if ( @ftp_get_option( $this->link, FTP_TIMEOUT_SEC ) < FS_TIMEOUT ) { + @ftp_set_option( $this->link, FTP_TIMEOUT_SEC, FS_TIMEOUT ); + } + + return true; + } + + /** + * Reads entire file into a string. + * + * @since 2.5.0 + * + * @param string $file Name of the file to read. + * @return string|false Read data on success, false if no temporary file could be opened, + * or if the file couldn't be retrieved. + */ + public function get_contents( $file ) { + $tempfile = wp_tempnam( $file ); + $temp = fopen( $tempfile, 'w+' ); + + if ( ! $temp ) { + unlink( $tempfile ); + return false; + } + + if ( ! ftp_fget( $this->link, $temp, $file, FTP_BINARY ) ) { + fclose( $temp ); + unlink( $tempfile ); + return false; + } + + fseek( $temp, 0 ); // Skip back to the start of the file being written to. + $contents = ''; + + while ( ! feof( $temp ) ) { + $contents .= fread( $temp, 8 * KB_IN_BYTES ); + } + + fclose( $temp ); + unlink( $tempfile ); + return $contents; + } + + /** + * Reads entire file into an array. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return array|false File contents in an array on success, false on failure. + */ + public function get_contents_array( $file ) { + return explode( "\n", $this->get_contents( $file ) ); + } + + /** + * Writes a string to a file. + * + * @since 2.5.0 + * + * @param string $file Remote path to the file where to write the data. + * @param string $contents The data to write. + * @param int|false $mode Optional. The file permissions as octal number, usually 0644. + * Default false. + * @return bool True on success, false on failure. + */ + public function put_contents( $file, $contents, $mode = false ) { + $tempfile = wp_tempnam( $file ); + $temp = fopen( $tempfile, 'wb+' ); + + if ( ! $temp ) { + unlink( $tempfile ); + return false; + } + + mbstring_binary_safe_encoding(); + + $data_length = strlen( $contents ); + $bytes_written = fwrite( $temp, $contents ); + + reset_mbstring_encoding(); + + if ( $data_length !== $bytes_written ) { + fclose( $temp ); + unlink( $tempfile ); + return false; + } + + fseek( $temp, 0 ); // Skip back to the start of the file being written to. + + $ret = ftp_fput( $this->link, $file, $temp, FTP_BINARY ); + + fclose( $temp ); + unlink( $tempfile ); + + $this->chmod( $file, $mode ); + + return $ret; + } + + /** + * Gets the current working directory. + * + * @since 2.5.0 + * + * @return string|false The current working directory on success, false on failure. + */ + public function cwd() { + $cwd = ftp_pwd( $this->link ); + if ( $cwd ) { + $cwd = trailingslashit( $cwd ); + } + return $cwd; + } + + /** + * Changes current directory. + * + * @since 2.5.0 + * + * @param string $dir The new current directory. + * @return bool True on success, false on failure. + */ + public function chdir( $dir ) { + return @ftp_chdir( $this->link, $dir ); + } + + /** + * Changes filesystem permissions. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for directories. Default false. + * @param bool $recursive Optional. If set to true, changes file permissions recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chmod( $file, $mode = false, $recursive = false ) { + if ( ! $mode ) { + if ( $this->is_file( $file ) ) { + $mode = FS_CHMOD_FILE; + } elseif ( $this->is_dir( $file ) ) { + $mode = FS_CHMOD_DIR; + } else { + return false; + } + } + + // chmod any sub-objects if recursive. + if ( $recursive && $this->is_dir( $file ) ) { + $filelist = $this->dirlist( $file ); + foreach ( (array) $filelist as $filename => $filemeta ) { + $this->chmod( $file . '/' . $filename, $mode, $recursive ); + } + } + + // chmod the file or directory. + if ( ! function_exists( 'ftp_chmod' ) ) { + return (bool) ftp_site( $this->link, sprintf( 'CHMOD %o %s', $mode, $file ) ); + } + return (bool) ftp_chmod( $this->link, $mode, $file ); + } + + /** + * Gets the file owner. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string|false Username of the owner on success, false on failure. + */ + public function owner( $file ) { + $dir = $this->dirlist( $file ); + return $dir[ $file ]['owner']; + } + + /** + * Gets the permissions of the specified file or filepath in their octal format. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string Mode of the file (the last 3 digits). + */ + public function getchmod( $file ) { + $dir = $this->dirlist( $file ); + return $dir[ $file ]['permsn']; + } + + /** + * Gets the file's group. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string|false The group on success, false on failure. + */ + public function group( $file ) { + $dir = $this->dirlist( $file ); + return $dir[ $file ]['group']; + } + + /** + * Copies a file. + * + * @since 2.5.0 + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for dirs. Default false. + * @return bool True on success, false on failure. + */ + public function copy( $source, $destination, $overwrite = false, $mode = false ) { + if ( ! $overwrite && $this->exists( $destination ) ) { + return false; + } + $content = $this->get_contents( $source ); + if ( false === $content ) { + return false; + } + return $this->put_contents( $destination, $content, $mode ); + } + + /** + * Moves a file. + * + * @since 2.5.0 + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @return bool True on success, false on failure. + */ + public function move( $source, $destination, $overwrite = false ) { + return ftp_rename( $this->link, $source, $destination ); + } + + /** + * Deletes a file or directory. + * + * @since 2.5.0 + * + * @param string $file Path to the file or directory. + * @param bool $recursive Optional. If set to true, deletes files and folders recursively. + * Default false. + * @param string|false $type Type of resource. 'f' for file, 'd' for directory. + * Default false. + * @return bool True on success, false on failure. + */ + public function delete( $file, $recursive = false, $type = false ) { + if ( empty( $file ) ) { + return false; + } + if ( 'f' == $type || $this->is_file( $file ) ) { + return ftp_delete( $this->link, $file ); + } + if ( ! $recursive ) { + return ftp_rmdir( $this->link, $file ); + } + + $filelist = $this->dirlist( trailingslashit( $file ) ); + if ( ! empty( $filelist ) ) { + foreach ( $filelist as $delete_file ) { + $this->delete( trailingslashit( $file ) . $delete_file['name'], $recursive, $delete_file['type'] ); + } + } + return ftp_rmdir( $this->link, $file ); + } + + /** + * Checks if a file or directory exists. + * + * @since 2.5.0 + * + * @param string $file Path to file or directory. + * @return bool Whether $file exists or not. + */ + public function exists( $file ) { + $list = ftp_nlist( $this->link, $file ); + + if ( empty( $list ) && $this->is_dir( $file ) ) { + return true; // File is an empty directory. + } + + return ! empty( $list ); // Empty list = no file, so invert. + } + + /** + * Checks if resource is a file. + * + * @since 2.5.0 + * + * @param string $file File path. + * @return bool Whether $file is a file. + */ + public function is_file( $file ) { + return $this->exists( $file ) && ! $this->is_dir( $file ); + } + + /** + * Checks if resource is a directory. + * + * @since 2.5.0 + * + * @param string $path Directory path. + * @return bool Whether $path is a directory. + */ + public function is_dir( $path ) { + $cwd = $this->cwd(); + $result = @ftp_chdir( $this->link, trailingslashit( $path ) ); + if ( $result && $path == $this->cwd() || $this->cwd() != $cwd ) { + @ftp_chdir( $this->link, $cwd ); + return true; + } + return false; + } + + /** + * Checks if a file is readable. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return bool Whether $file is readable. + */ + public function is_readable( $file ) { + return true; + } + + /** + * Checks if a file or directory is writable. + * + * @since 2.5.0 + * + * @param string $file Path to file or directory. + * @return bool Whether $file is writable. + */ + public function is_writable( $file ) { + return true; + } + + /** + * Gets the file's last access time. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing last access time, false on failure. + */ + public function atime( $file ) { + return false; + } + + /** + * Gets the file modification time. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing modification time, false on failure. + */ + public function mtime( $file ) { + return ftp_mdtm( $this->link, $file ); + } + + /** + * Gets the file size (in bytes). + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return int|false Size of the file in bytes on success, false on failure. + */ + public function size( $file ) { + return ftp_size( $this->link, $file ); + } + + /** + * Sets the access and modification times of a file. + * + * Note: If $file doesn't exist, it will be created. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @param int $time Optional. Modified time to set for file. + * Default 0. + * @param int $atime Optional. Access time to set for file. + * Default 0. + * @return bool True on success, false on failure. + */ + public function touch( $file, $time = 0, $atime = 0 ) { + return false; + } + + /** + * Creates a directory. + * + * @since 2.5.0 + * + * @param string $path Path for new directory. + * @param int|false $chmod Optional. The permissions as octal number (or false to skip chmod). + * Default false. + * @param string|int $chown Optional. A user name or number (or false to skip chown). + * Default false. + * @param string|int $chgrp Optional. A group name or number (or false to skip chgrp). + * Default false. + * @return bool True on success, false on failure. + */ + public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) { + $path = untrailingslashit( $path ); + if ( empty( $path ) ) { + return false; + } + + if ( ! ftp_mkdir( $this->link, $path ) ) { + return false; + } + $this->chmod( $path, $chmod ); + return true; + } + + /** + * Deletes a directory. + * + * @since 2.5.0 + * + * @param string $path Path to directory. + * @param bool $recursive Optional. Whether to recursively remove files/directories. + * Default false. + * @return bool True on success, false on failure. + */ + public function rmdir( $path, $recursive = false ) { + return $this->delete( $path, $recursive ); + } + + /** + * @staticvar bool $is_windows + * @param string $line + * @return array + */ + public function parselisting( $line ) { + static $is_windows = null; + if ( is_null( $is_windows ) ) { + $is_windows = stripos( ftp_systype( $this->link ), 'win' ) !== false; + } + + if ( $is_windows && preg_match( '/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|) +(.+)/', $line, $lucifer ) ) { + $b = array(); + if ( $lucifer[3] < 70 ) { + $lucifer[3] += 2000; + } else { + $lucifer[3] += 1900; // 4-digit year fix. + } + $b['isdir'] = ( '' === $lucifer[7] ); + if ( $b['isdir'] ) { + $b['type'] = 'd'; + } else { + $b['type'] = 'f'; + } + $b['size'] = $lucifer[7]; + $b['month'] = $lucifer[1]; + $b['day'] = $lucifer[2]; + $b['year'] = $lucifer[3]; + $b['hour'] = $lucifer[4]; + $b['minute'] = $lucifer[5]; + $b['time'] = mktime( $lucifer[4] + ( strcasecmp( $lucifer[6], 'PM' ) == 0 ? 12 : 0 ), $lucifer[5], 0, $lucifer[1], $lucifer[2], $lucifer[3] ); + $b['am/pm'] = $lucifer[6]; + $b['name'] = $lucifer[8]; + } elseif ( ! $is_windows ) { + $lucifer = preg_split( '/[ ]/', $line, 9, PREG_SPLIT_NO_EMPTY ); + if ( $lucifer ) { + // echo $line."\n"; + $lcount = count( $lucifer ); + if ( $lcount < 8 ) { + return ''; + } + $b = array(); + $b['isdir'] = 'd' === $lucifer[0][0]; + $b['islink'] = 'l' === $lucifer[0][0]; + if ( $b['isdir'] ) { + $b['type'] = 'd'; + } elseif ( $b['islink'] ) { + $b['type'] = 'l'; + } else { + $b['type'] = 'f'; + } + $b['perms'] = $lucifer[0]; + $b['permsn'] = $this->getnumchmodfromh( $b['perms'] ); + $b['number'] = $lucifer[1]; + $b['owner'] = $lucifer[2]; + $b['group'] = $lucifer[3]; + $b['size'] = $lucifer[4]; + if ( 8 == $lcount ) { + sscanf( $lucifer[5], '%d-%d-%d', $b['year'], $b['month'], $b['day'] ); + sscanf( $lucifer[6], '%d:%d', $b['hour'], $b['minute'] ); + $b['time'] = mktime( $b['hour'], $b['minute'], 0, $b['month'], $b['day'], $b['year'] ); + $b['name'] = $lucifer[7]; + } else { + $b['month'] = $lucifer[5]; + $b['day'] = $lucifer[6]; + if ( preg_match( '/([0-9]{2}):([0-9]{2})/', $lucifer[7], $l2 ) ) { + $b['year'] = gmdate( 'Y' ); + $b['hour'] = $l2[1]; + $b['minute'] = $l2[2]; + } else { + $b['year'] = $lucifer[7]; + $b['hour'] = 0; + $b['minute'] = 0; + } + $b['time'] = strtotime( sprintf( '%d %s %d %02d:%02d', $b['day'], $b['month'], $b['year'], $b['hour'], $b['minute'] ) ); + $b['name'] = $lucifer[8]; + } + } + } + + // Replace symlinks formatted as "source -> target" with just the source name. + if ( isset( $b['islink'] ) && $b['islink'] ) { + $b['name'] = preg_replace( '/(\s*->\s*.*)$/', '', $b['name'] ); + } + + return $b; + } + + /** + * Gets details for files in a directory or a specific file. + * + * @since 2.5.0 + * + * @param string $path Path to directory or file. + * @param bool $include_hidden Optional. Whether to include details of hidden ("." prefixed) files. + * Default true. + * @param bool $recursive Optional. Whether to recursively include file details in nested directories. + * Default false. + * @return array|false { + * Array of files. False if unable to list directory contents. + * + * @type string $name Name of the file or directory. + * @type string $perms *nix representation of permissions. + * @type int $permsn Octal representation of permissions. + * @type string $owner Owner name or ID. + * @type int $size Size of file in bytes. + * @type int $lastmodunix Last modified unix timestamp. + * @type mixed $lastmod Last modified month (3 letter) and day (without leading 0). + * @type int $time Last modified time. + * @type string $type Type of resource. 'f' for file, 'd' for directory. + * @type mixed $files If a directory and $recursive is true, contains another array of files. + * } + */ + public function dirlist( $path = '.', $include_hidden = true, $recursive = false ) { + if ( $this->is_file( $path ) ) { + $limit_file = basename( $path ); + $path = dirname( $path ) . '/'; + } else { + $limit_file = false; + } + + $pwd = ftp_pwd( $this->link ); + if ( ! @ftp_chdir( $this->link, $path ) ) { // Can't change to folder = folder doesn't exist. + return false; + } + $list = ftp_rawlist( $this->link, '-a', false ); + @ftp_chdir( $this->link, $pwd ); + + if ( empty( $list ) ) { // Empty array = non-existent folder (real folder will show . at least). + return false; + } + + $dirlist = array(); + foreach ( $list as $k => $v ) { + $entry = $this->parselisting( $v ); + if ( empty( $entry ) ) { + continue; + } + + if ( '.' == $entry['name'] || '..' == $entry['name'] ) { + continue; + } + + if ( ! $include_hidden && '.' == $entry['name'][0] ) { + continue; + } + + if ( $limit_file && $entry['name'] != $limit_file ) { + continue; + } + + $dirlist[ $entry['name'] ] = $entry; + } + + $ret = array(); + foreach ( (array) $dirlist as $struc ) { + if ( 'd' == $struc['type'] ) { + if ( $recursive ) { + $struc['files'] = $this->dirlist( $path . '/' . $struc['name'], $include_hidden, $recursive ); + } else { + $struc['files'] = array(); + } + } + + $ret[ $struc['name'] ] = $struc; + } + return $ret; + } + + /** + * Destructor. + * + * @since 2.5.0 + */ + public function __destruct() { + if ( $this->link ) { + ftp_close( $this->link ); + } + } +} diff --git a/wp-admin/includes/class-wp-filesystem-ftpsockets.php b/wp-admin/includes/class-wp-filesystem-ftpsockets.php new file mode 100644 index 0000000..26ee71c --- /dev/null +++ b/wp-admin/includes/class-wp-filesystem-ftpsockets.php @@ -0,0 +1,662 @@ +method = 'ftpsockets'; + $this->errors = new WP_Error(); + + // Check if possible to use ftp functions. + if ( ! include_once ABSPATH . 'wp-admin/includes/class-ftp.php' ) { + return; + } + $this->ftp = new ftp(); + + if ( empty( $opt['port'] ) ) { + $this->options['port'] = 21; + } else { + $this->options['port'] = (int) $opt['port']; + } + + if ( empty( $opt['hostname'] ) ) { + $this->errors->add( 'empty_hostname', __( 'FTP hostname is required' ) ); + } else { + $this->options['hostname'] = $opt['hostname']; + } + + // Check if the options provided are OK. + if ( empty( $opt['username'] ) ) { + $this->errors->add( 'empty_username', __( 'FTP username is required' ) ); + } else { + $this->options['username'] = $opt['username']; + } + + if ( empty( $opt['password'] ) ) { + $this->errors->add( 'empty_password', __( 'FTP password is required' ) ); + } else { + $this->options['password'] = $opt['password']; + } + } + + /** + * Connects filesystem. + * + * @since 2.5.0 + * + * @return bool True on success, false on failure. + */ + public function connect() { + if ( ! $this->ftp ) { + return false; + } + + $this->ftp->setTimeout( FS_CONNECT_TIMEOUT ); + + if ( ! $this->ftp->SetServer( $this->options['hostname'], $this->options['port'] ) ) { + $this->errors->add( + 'connect', + sprintf( + /* translators: %s: hostname:port */ + __( 'Failed to connect to FTP Server %s' ), + $this->options['hostname'] . ':' . $this->options['port'] + ) + ); + return false; + } + + if ( ! $this->ftp->connect() ) { + $this->errors->add( + 'connect', + sprintf( + /* translators: %s: hostname:port */ + __( 'Failed to connect to FTP Server %s' ), + $this->options['hostname'] . ':' . $this->options['port'] + ) + ); + return false; + } + + if ( ! $this->ftp->login( $this->options['username'], $this->options['password'] ) ) { + $this->errors->add( + 'auth', + sprintf( + /* translators: %s: Username. */ + __( 'Username/Password incorrect for %s' ), + $this->options['username'] + ) + ); + return false; + } + + $this->ftp->SetType( FTP_BINARY ); + $this->ftp->Passive( true ); + $this->ftp->setTimeout( FS_TIMEOUT ); + return true; + } + + /** + * Reads entire file into a string. + * + * @since 2.5.0 + * + * @param string $file Name of the file to read. + * @return string|false Read data on success, false if no temporary file could be opened, + * or if the file couldn't be retrieved. + */ + public function get_contents( $file ) { + if ( ! $this->exists( $file ) ) { + return false; + } + + $temp = wp_tempnam( $file ); + + $temphandle = fopen( $temp, 'w+' ); + if ( ! $temphandle ) { + unlink( $temp ); + return false; + } + + mbstring_binary_safe_encoding(); + + if ( ! $this->ftp->fget( $temphandle, $file ) ) { + fclose( $temphandle ); + unlink( $temp ); + + reset_mbstring_encoding(); + + return ''; // Blank document. File does exist, it's just blank. + } + + reset_mbstring_encoding(); + + fseek( $temphandle, 0 ); // Skip back to the start of the file being written to. + $contents = ''; + + while ( ! feof( $temphandle ) ) { + $contents .= fread( $temphandle, 8 * KB_IN_BYTES ); + } + + fclose( $temphandle ); + unlink( $temp ); + return $contents; + } + + /** + * Reads entire file into an array. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return array|false File contents in an array on success, false on failure. + */ + public function get_contents_array( $file ) { + return explode( "\n", $this->get_contents( $file ) ); + } + + /** + * Writes a string to a file. + * + * @since 2.5.0 + * + * @param string $file Remote path to the file where to write the data. + * @param string $contents The data to write. + * @param int|false $mode Optional. The file permissions as octal number, usually 0644. + * Default false. + * @return bool True on success, false on failure. + */ + public function put_contents( $file, $contents, $mode = false ) { + $temp = wp_tempnam( $file ); + $temphandle = @fopen( $temp, 'w+' ); + if ( ! $temphandle ) { + unlink( $temp ); + return false; + } + + // The FTP class uses string functions internally during file download/upload. + mbstring_binary_safe_encoding(); + + $bytes_written = fwrite( $temphandle, $contents ); + if ( false === $bytes_written || strlen( $contents ) != $bytes_written ) { + fclose( $temphandle ); + unlink( $temp ); + + reset_mbstring_encoding(); + + return false; + } + + fseek( $temphandle, 0 ); // Skip back to the start of the file being written to. + + $ret = $this->ftp->fput( $file, $temphandle ); + + reset_mbstring_encoding(); + + fclose( $temphandle ); + unlink( $temp ); + + $this->chmod( $file, $mode ); + + return $ret; + } + + /** + * Gets the current working directory. + * + * @since 2.5.0 + * + * @return string|false The current working directory on success, false on failure. + */ + public function cwd() { + $cwd = $this->ftp->pwd(); + if ( $cwd ) { + $cwd = trailingslashit( $cwd ); + } + return $cwd; + } + + /** + * Changes current directory. + * + * @since 2.5.0 + * + * @param string $dir The new current directory. + * @return bool True on success, false on failure. + */ + public function chdir( $dir ) { + return $this->ftp->chdir( $dir ); + } + + /** + * Changes filesystem permissions. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for directories. Default false. + * @param bool $recursive Optional. If set to true, changes file permissions recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chmod( $file, $mode = false, $recursive = false ) { + if ( ! $mode ) { + if ( $this->is_file( $file ) ) { + $mode = FS_CHMOD_FILE; + } elseif ( $this->is_dir( $file ) ) { + $mode = FS_CHMOD_DIR; + } else { + return false; + } + } + + // chmod any sub-objects if recursive. + if ( $recursive && $this->is_dir( $file ) ) { + $filelist = $this->dirlist( $file ); + foreach ( (array) $filelist as $filename => $filemeta ) { + $this->chmod( $file . '/' . $filename, $mode, $recursive ); + } + } + + // chmod the file or directory. + return $this->ftp->chmod( $file, $mode ); + } + + /** + * Gets the file owner. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string|false Username of the owner on success, false on failure. + */ + public function owner( $file ) { + $dir = $this->dirlist( $file ); + return $dir[ $file ]['owner']; + } + + /** + * Gets the permissions of the specified file or filepath in their octal format. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string Mode of the file (the last 3 digits). + */ + public function getchmod( $file ) { + $dir = $this->dirlist( $file ); + return $dir[ $file ]['permsn']; + } + + /** + * Gets the file's group. + * + * @since 2.5.0 + * + * @param string $file Path to the file. + * @return string|false The group on success, false on failure. + */ + public function group( $file ) { + $dir = $this->dirlist( $file ); + return $dir[ $file ]['group']; + } + + /** + * Copies a file. + * + * @since 2.5.0 + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for dirs. Default false. + * @return bool True on success, false on failure. + */ + public function copy( $source, $destination, $overwrite = false, $mode = false ) { + if ( ! $overwrite && $this->exists( $destination ) ) { + return false; + } + + $content = $this->get_contents( $source ); + if ( false === $content ) { + return false; + } + + return $this->put_contents( $destination, $content, $mode ); + } + + /** + * Moves a file. + * + * @since 2.5.0 + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @return bool True on success, false on failure. + */ + public function move( $source, $destination, $overwrite = false ) { + return $this->ftp->rename( $source, $destination ); + } + + /** + * Deletes a file or directory. + * + * @since 2.5.0 + * + * @param string $file Path to the file or directory. + * @param bool $recursive Optional. If set to true, deletes files and folders recursively. + * Default false. + * @param string|false $type Type of resource. 'f' for file, 'd' for directory. + * Default false. + * @return bool True on success, false on failure. + */ + public function delete( $file, $recursive = false, $type = false ) { + if ( empty( $file ) ) { + return false; + } + if ( 'f' == $type || $this->is_file( $file ) ) { + return $this->ftp->delete( $file ); + } + if ( ! $recursive ) { + return $this->ftp->rmdir( $file ); + } + + return $this->ftp->mdel( $file ); + } + + /** + * Checks if a file or directory exists. + * + * @since 2.5.0 + * + * @param string $file Path to file or directory. + * @return bool Whether $file exists or not. + */ + public function exists( $file ) { + $list = $this->ftp->nlist( $file ); + + if ( empty( $list ) && $this->is_dir( $file ) ) { + return true; // File is an empty directory. + } + + return ! empty( $list ); // Empty list = no file, so invert. + // Return $this->ftp->is_exists($file); has issues with ABOR+426 responses on the ncFTPd server. + } + + /** + * Checks if resource is a file. + * + * @since 2.5.0 + * + * @param string $file File path. + * @return bool Whether $file is a file. + */ + public function is_file( $file ) { + if ( $this->is_dir( $file ) ) { + return false; + } + if ( $this->exists( $file ) ) { + return true; + } + return false; + } + + /** + * Checks if resource is a directory. + * + * @since 2.5.0 + * + * @param string $path Directory path. + * @return bool Whether $path is a directory. + */ + public function is_dir( $path ) { + $cwd = $this->cwd(); + if ( $this->chdir( $path ) ) { + $this->chdir( $cwd ); + return true; + } + return false; + } + + /** + * Checks if a file is readable. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return bool Whether $file is readable. + */ + public function is_readable( $file ) { + return true; + } + + /** + * Checks if a file or directory is writable. + * + * @since 2.5.0 + * + * @param string $file Path to file or directory. + * @return bool Whether $file is writable. + */ + public function is_writable( $file ) { + return true; + } + + /** + * Gets the file's last access time. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing last access time, false on failure. + */ + public function atime( $file ) { + return false; + } + + /** + * Gets the file modification time. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing modification time, false on failure. + */ + public function mtime( $file ) { + return $this->ftp->mdtm( $file ); + } + + /** + * Gets the file size (in bytes). + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @return int|false Size of the file in bytes on success, false on failure. + */ + public function size( $file ) { + return $this->ftp->filesize( $file ); + } + + /** + * Sets the access and modification times of a file. + * + * Note: If $file doesn't exist, it will be created. + * + * @since 2.5.0 + * + * @param string $file Path to file. + * @param int $time Optional. Modified time to set for file. + * Default 0. + * @param int $atime Optional. Access time to set for file. + * Default 0. + * @return bool True on success, false on failure. + */ + public function touch( $file, $time = 0, $atime = 0 ) { + return false; + } + + /** + * Creates a directory. + * + * @since 2.5.0 + * + * @param string $path Path for new directory. + * @param int|false $chmod Optional. The permissions as octal number (or false to skip chmod). + * Default false. + * @param string|int $chown Optional. A user name or number (or false to skip chown). + * Default false. + * @param string|int $chgrp Optional. A group name or number (or false to skip chgrp). + * Default false. + * @return bool True on success, false on failure. + */ + public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) { + $path = untrailingslashit( $path ); + if ( empty( $path ) ) { + return false; + } + + if ( ! $this->ftp->mkdir( $path ) ) { + return false; + } + if ( ! $chmod ) { + $chmod = FS_CHMOD_DIR; + } + $this->chmod( $path, $chmod ); + return true; + } + + /** + * Deletes a directory. + * + * @since 2.5.0 + * + * @param string $path Path to directory. + * @param bool $recursive Optional. Whether to recursively remove files/directories. + * Default false. + * @return bool True on success, false on failure. + */ + public function rmdir( $path, $recursive = false ) { + return $this->delete( $path, $recursive ); + } + + /** + * Gets details for files in a directory or a specific file. + * + * @since 2.5.0 + * + * @param string $path Path to directory or file. + * @param bool $include_hidden Optional. Whether to include details of hidden ("." prefixed) files. + * Default true. + * @param bool $recursive Optional. Whether to recursively include file details in nested directories. + * Default false. + * @return array|false { + * Array of files. False if unable to list directory contents. + * + * @type string $name Name of the file or directory. + * @type string $perms *nix representation of permissions. + * @type int $permsn Octal representation of permissions. + * @type string $owner Owner name or ID. + * @type int $size Size of file in bytes. + * @type int $lastmodunix Last modified unix timestamp. + * @type mixed $lastmod Last modified month (3 letter) and day (without leading 0). + * @type int $time Last modified time. + * @type string $type Type of resource. 'f' for file, 'd' for directory. + * @type mixed $files If a directory and $recursive is true, contains another array of files. + * } + */ + public function dirlist( $path = '.', $include_hidden = true, $recursive = false ) { + if ( $this->is_file( $path ) ) { + $limit_file = basename( $path ); + $path = dirname( $path ) . '/'; + } else { + $limit_file = false; + } + + mbstring_binary_safe_encoding(); + + $list = $this->ftp->dirlist( $path ); + if ( empty( $list ) && ! $this->exists( $path ) ) { + + reset_mbstring_encoding(); + + return false; + } + + $ret = array(); + foreach ( $list as $struc ) { + + if ( '.' == $struc['name'] || '..' == $struc['name'] ) { + continue; + } + + if ( ! $include_hidden && '.' == $struc['name'][0] ) { + continue; + } + + if ( $limit_file && $struc['name'] != $limit_file ) { + continue; + } + + if ( 'd' == $struc['type'] ) { + if ( $recursive ) { + $struc['files'] = $this->dirlist( $path . '/' . $struc['name'], $include_hidden, $recursive ); + } else { + $struc['files'] = array(); + } + } + + // Replace symlinks formatted as "source -> target" with just the source name. + if ( $struc['islink'] ) { + $struc['name'] = preg_replace( '/(\s*->\s*.*)$/', '', $struc['name'] ); + } + + // Add the octal representation of the file permissions. + $struc['permsn'] = $this->getnumchmodfromh( $struc['perms'] ); + + $ret[ $struc['name'] ] = $struc; + } + + reset_mbstring_encoding(); + + return $ret; + } + + /** + * Destructor. + * + * @since 2.5.0 + */ + public function __destruct() { + $this->ftp->quit(); + } +} diff --git a/wp-admin/includes/class-wp-filesystem-ssh2.php b/wp-admin/includes/class-wp-filesystem-ssh2.php new file mode 100644 index 0000000..4164244 --- /dev/null +++ b/wp-admin/includes/class-wp-filesystem-ssh2.php @@ -0,0 +1,776 @@ +method = 'ssh2'; + $this->errors = new WP_Error(); + + // Check if possible to use ssh2 functions. + if ( ! extension_loaded( 'ssh2' ) ) { + $this->errors->add( 'no_ssh2_ext', __( 'The ssh2 PHP extension is not available' ) ); + return; + } + if ( ! function_exists( 'stream_get_contents' ) ) { + $this->errors->add( + 'ssh2_php_requirement', + sprintf( + /* translators: %s: stream_get_contents() */ + __( 'The ssh2 PHP extension is available, however, we require the PHP5 function %s' ), + 'stream_get_contents()' + ) + ); + return; + } + + // Set defaults: + if ( empty( $opt['port'] ) ) { + $this->options['port'] = 22; + } else { + $this->options['port'] = $opt['port']; + } + + if ( empty( $opt['hostname'] ) ) { + $this->errors->add( 'empty_hostname', __( 'SSH2 hostname is required' ) ); + } else { + $this->options['hostname'] = $opt['hostname']; + } + + // Check if the options provided are OK. + if ( ! empty( $opt['public_key'] ) && ! empty( $opt['private_key'] ) ) { + $this->options['public_key'] = $opt['public_key']; + $this->options['private_key'] = $opt['private_key']; + + $this->options['hostkey'] = array( 'hostkey' => 'ssh-rsa' ); + + $this->keys = true; + } elseif ( empty( $opt['username'] ) ) { + $this->errors->add( 'empty_username', __( 'SSH2 username is required' ) ); + } + + if ( ! empty( $opt['username'] ) ) { + $this->options['username'] = $opt['username']; + } + + if ( empty( $opt['password'] ) ) { + // Password can be blank if we are using keys. + if ( ! $this->keys ) { + $this->errors->add( 'empty_password', __( 'SSH2 password is required' ) ); + } + } else { + $this->options['password'] = $opt['password']; + } + } + + /** + * Connects filesystem. + * + * @since 2.7.0 + * + * @return bool True on success, false on failure. + */ + public function connect() { + if ( ! $this->keys ) { + $this->link = @ssh2_connect( $this->options['hostname'], $this->options['port'] ); + } else { + $this->link = @ssh2_connect( $this->options['hostname'], $this->options['port'], $this->options['hostkey'] ); + } + + if ( ! $this->link ) { + $this->errors->add( + 'connect', + sprintf( + /* translators: %s: hostname:port */ + __( 'Failed to connect to SSH2 Server %s' ), + $this->options['hostname'] . ':' . $this->options['port'] + ) + ); + return false; + } + + if ( ! $this->keys ) { + if ( ! @ssh2_auth_password( $this->link, $this->options['username'], $this->options['password'] ) ) { + $this->errors->add( + 'auth', + sprintf( + /* translators: %s: Username. */ + __( 'Username/Password incorrect for %s' ), + $this->options['username'] + ) + ); + return false; + } + } else { + if ( ! @ssh2_auth_pubkey_file( $this->link, $this->options['username'], $this->options['public_key'], $this->options['private_key'], $this->options['password'] ) ) { + $this->errors->add( + 'auth', + sprintf( + /* translators: %s: Username. */ + __( 'Public and Private keys incorrect for %s' ), + $this->options['username'] + ) + ); + return false; + } + } + + $this->sftp_link = ssh2_sftp( $this->link ); + if ( ! $this->sftp_link ) { + $this->errors->add( + 'connect', + sprintf( + /* translators: %s: hostname:port */ + __( 'Failed to initialize a SFTP subsystem session with the SSH2 Server %s' ), + $this->options['hostname'] . ':' . $this->options['port'] + ) + ); + return false; + } + + return true; + } + + /** + * Gets the ssh2.sftp PHP stream wrapper path to open for the given file. + * + * This method also works around a PHP bug where the root directory (/) cannot + * be opened by PHP functions, causing a false failure. In order to work around + * this, the path is converted to /./ which is semantically the same as / + * See https://bugs.php.net/bug.php?id=64169 for more details. + * + * @since 4.4.0 + * + * @param string $path The File/Directory path on the remote server to return + * @return string The ssh2.sftp:// wrapped path to use. + */ + public function sftp_path( $path ) { + if ( '/' === $path ) { + $path = '/./'; + } + return 'ssh2.sftp://' . $this->sftp_link . '/' . ltrim( $path, '/' ); + } + + /** + * @since 2.7.0 + * + * @param string $command + * @param bool $returnbool + * @return bool|string True on success, false on failure. String if the command was executed, `$returnbool` + * is false (default), and data from the resulting stream was retrieved. + */ + public function run_command( $command, $returnbool = false ) { + if ( ! $this->link ) { + return false; + } + + $stream = ssh2_exec( $this->link, $command ); + if ( ! $stream ) { + $this->errors->add( + 'command', + sprintf( + /* translators: %s: Command. */ + __( 'Unable to perform command: %s' ), + $command + ) + ); + } else { + stream_set_blocking( $stream, true ); + stream_set_timeout( $stream, FS_TIMEOUT ); + $data = stream_get_contents( $stream ); + fclose( $stream ); + + if ( $returnbool ) { + return ( false === $data ) ? false : '' != trim( $data ); + } else { + return $data; + } + } + return false; + } + + /** + * Reads entire file into a string. + * + * @since 2.7.0 + * + * @param string $file Name of the file to read. + * @return string|false Read data on success, false if no temporary file could be opened, + * or if the file couldn't be retrieved. + */ + public function get_contents( $file ) { + return file_get_contents( $this->sftp_path( $file ) ); + } + + /** + * Reads entire file into an array. + * + * @since 2.7.0 + * + * @param string $file Path to the file. + * @return array|false File contents in an array on success, false on failure. + */ + public function get_contents_array( $file ) { + return file( $this->sftp_path( $file ) ); + } + + /** + * Writes a string to a file. + * + * @since 2.7.0 + * + * @param string $file Remote path to the file where to write the data. + * @param string $contents The data to write. + * @param int|false $mode Optional. The file permissions as octal number, usually 0644. + * Default false. + * @return bool True on success, false on failure. + */ + public function put_contents( $file, $contents, $mode = false ) { + $ret = file_put_contents( $this->sftp_path( $file ), $contents ); + + if ( strlen( $contents ) !== $ret ) { + return false; + } + + $this->chmod( $file, $mode ); + + return true; + } + + /** + * Gets the current working directory. + * + * @since 2.7.0 + * + * @return string|false The current working directory on success, false on failure. + */ + public function cwd() { + $cwd = ssh2_sftp_realpath( $this->sftp_link, '.' ); + if ( $cwd ) { + $cwd = trailingslashit( trim( $cwd ) ); + } + return $cwd; + } + + /** + * Changes current directory. + * + * @since 2.7.0 + * + * @param string $dir The new current directory. + * @return bool True on success, false on failure. + */ + public function chdir( $dir ) { + return $this->run_command( 'cd ' . $dir, true ); + } + + /** + * Changes the file group. + * + * @since 2.7.0 + * + * @param string $file Path to the file. + * @param string|int $group A group name or number. + * @param bool $recursive Optional. If set to true, changes file group recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chgrp( $file, $group, $recursive = false ) { + if ( ! $this->exists( $file ) ) { + return false; + } + if ( ! $recursive || ! $this->is_dir( $file ) ) { + return $this->run_command( sprintf( 'chgrp %s %s', escapeshellarg( $group ), escapeshellarg( $file ) ), true ); + } + return $this->run_command( sprintf( 'chgrp -R %s %s', escapeshellarg( $group ), escapeshellarg( $file ) ), true ); + } + + /** + * Changes filesystem permissions. + * + * @since 2.7.0 + * + * @param string $file Path to the file. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for directories. Default false. + * @param bool $recursive Optional. If set to true, changes file permissions recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chmod( $file, $mode = false, $recursive = false ) { + if ( ! $this->exists( $file ) ) { + return false; + } + + if ( ! $mode ) { + if ( $this->is_file( $file ) ) { + $mode = FS_CHMOD_FILE; + } elseif ( $this->is_dir( $file ) ) { + $mode = FS_CHMOD_DIR; + } else { + return false; + } + } + + if ( ! $recursive || ! $this->is_dir( $file ) ) { + return $this->run_command( sprintf( 'chmod %o %s', $mode, escapeshellarg( $file ) ), true ); + } + return $this->run_command( sprintf( 'chmod -R %o %s', $mode, escapeshellarg( $file ) ), true ); + } + + /** + * Changes the owner of a file or directory. + * + * @since 2.7.0 + * + * @param string $file Path to the file or directory. + * @param string|int $owner A user name or number. + * @param bool $recursive Optional. If set to true, changes file owner recursively. + * Default false. + * @return bool True on success, false on failure. + */ + public function chown( $file, $owner, $recursive = false ) { + if ( ! $this->exists( $file ) ) { + return false; + } + if ( ! $recursive || ! $this->is_dir( $file ) ) { + return $this->run_command( sprintf( 'chown %s %s', escapeshellarg( $owner ), escapeshellarg( $file ) ), true ); + } + return $this->run_command( sprintf( 'chown -R %s %s', escapeshellarg( $owner ), escapeshellarg( $file ) ), true ); + } + + /** + * Gets the file owner. + * + * @since 2.7.0 + * + * @param string $file Path to the file. + * @return string|false Username of the owner on success, false on failure. + */ + public function owner( $file ) { + $owneruid = @fileowner( $this->sftp_path( $file ) ); + if ( ! $owneruid ) { + return false; + } + if ( ! function_exists( 'posix_getpwuid' ) ) { + return $owneruid; + } + $ownerarray = posix_getpwuid( $owneruid ); + return $ownerarray['name']; + } + + /** + * Gets the permissions of the specified file or filepath in their octal format. + * + * @since 2.7.0 + * + * @param string $file Path to the file. + * @return string Mode of the file (the last 3 digits). + */ + public function getchmod( $file ) { + return substr( decoct( @fileperms( $this->sftp_path( $file ) ) ), -3 ); + } + + /** + * Gets the file's group. + * + * @since 2.7.0 + * + * @param string $file Path to the file. + * @return string|false The group on success, false on failure. + */ + public function group( $file ) { + $gid = @filegroup( $this->sftp_path( $file ) ); + if ( ! $gid ) { + return false; + } + if ( ! function_exists( 'posix_getgrgid' ) ) { + return $gid; + } + $grouparray = posix_getgrgid( $gid ); + return $grouparray['name']; + } + + /** + * Copies a file. + * + * @since 2.7.0 + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files, + * 0755 for dirs. Default false. + * @return bool True on success, false on failure. + */ + public function copy( $source, $destination, $overwrite = false, $mode = false ) { + if ( ! $overwrite && $this->exists( $destination ) ) { + return false; + } + $content = $this->get_contents( $source ); + if ( false === $content ) { + return false; + } + return $this->put_contents( $destination, $content, $mode ); + } + + /** + * Moves a file. + * + * @since 2.7.0 + * + * @param string $source Path to the source file. + * @param string $destination Path to the destination file. + * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists. + * Default false. + * @return bool True on success, false on failure. + */ + public function move( $source, $destination, $overwrite = false ) { + if ( $this->exists( $destination ) ) { + if ( $overwrite ) { + // We need to remove the destination file before we can rename the source. + $this->delete( $destination, false, 'f' ); + } else { + // If we're not overwriting, the rename will fail, so return early. + return false; + } + } + + return ssh2_sftp_rename( $this->sftp_link, $source, $destination ); + } + + /** + * Deletes a file or directory. + * + * @since 2.7.0 + * + * @param string $file Path to the file or directory. + * @param bool $recursive Optional. If set to true, deletes files and folders recursively. + * Default false. + * @param string|false $type Type of resource. 'f' for file, 'd' for directory. + * Default false. + * @return bool True on success, false on failure. + */ + public function delete( $file, $recursive = false, $type = false ) { + if ( 'f' == $type || $this->is_file( $file ) ) { + return ssh2_sftp_unlink( $this->sftp_link, $file ); + } + if ( ! $recursive ) { + return ssh2_sftp_rmdir( $this->sftp_link, $file ); + } + $filelist = $this->dirlist( $file ); + if ( is_array( $filelist ) ) { + foreach ( $filelist as $filename => $fileinfo ) { + $this->delete( $file . '/' . $filename, $recursive, $fileinfo['type'] ); + } + } + return ssh2_sftp_rmdir( $this->sftp_link, $file ); + } + + /** + * Checks if a file or directory exists. + * + * @since 2.7.0 + * + * @param string $file Path to file or directory. + * @return bool Whether $file exists or not. + */ + public function exists( $file ) { + return file_exists( $this->sftp_path( $file ) ); + } + + /** + * Checks if resource is a file. + * + * @since 2.7.0 + * + * @param string $file File path. + * @return bool Whether $file is a file. + */ + public function is_file( $file ) { + return is_file( $this->sftp_path( $file ) ); + } + + /** + * Checks if resource is a directory. + * + * @since 2.7.0 + * + * @param string $path Directory path. + * @return bool Whether $path is a directory. + */ + public function is_dir( $path ) { + return is_dir( $this->sftp_path( $path ) ); + } + + /** + * Checks if a file is readable. + * + * @since 2.7.0 + * + * @param string $file Path to file. + * @return bool Whether $file is readable. + */ + public function is_readable( $file ) { + return is_readable( $this->sftp_path( $file ) ); + } + + /** + * Checks if a file or directory is writable. + * + * @since 2.7.0 + * + * @param string $file Path to file or directory. + * @return bool Whether $file is writable. + */ + public function is_writable( $file ) { + // PHP will base its writable checks on system_user === file_owner, not ssh_user === file_owner. + return true; + } + + /** + * Gets the file's last access time. + * + * @since 2.7.0 + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing last access time, false on failure. + */ + public function atime( $file ) { + return fileatime( $this->sftp_path( $file ) ); + } + + /** + * Gets the file modification time. + * + * @since 2.7.0 + * + * @param string $file Path to file. + * @return int|false Unix timestamp representing modification time, false on failure. + */ + public function mtime( $file ) { + return filemtime( $this->sftp_path( $file ) ); + } + + /** + * Gets the file size (in bytes). + * + * @since 2.7.0 + * + * @param string $file Path to file. + * @return int|false Size of the file in bytes on success, false on failure. + */ + public function size( $file ) { + return filesize( $this->sftp_path( $file ) ); + } + + /** + * Sets the access and modification times of a file. + * + * Note: Not implemented. + * + * @since 2.7.0 + * + * @param string $file Path to file. + * @param int $time Optional. Modified time to set for file. + * Default 0. + * @param int $atime Optional. Access time to set for file. + * Default 0. + */ + public function touch( $file, $time = 0, $atime = 0 ) { + // Not implemented. + } + + /** + * Creates a directory. + * + * @since 2.7.0 + * + * @param string $path Path for new directory. + * @param int|false $chmod Optional. The permissions as octal number (or false to skip chmod). + * Default false. + * @param string|int $chown Optional. A user name or number (or false to skip chown). + * Default false. + * @param string|int $chgrp Optional. A group name or number (or false to skip chgrp). + * Default false. + * @return bool True on success, false on failure. + */ + public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) { + $path = untrailingslashit( $path ); + if ( empty( $path ) ) { + return false; + } + + if ( ! $chmod ) { + $chmod = FS_CHMOD_DIR; + } + if ( ! ssh2_sftp_mkdir( $this->sftp_link, $path, $chmod, true ) ) { + return false; + } + if ( $chown ) { + $this->chown( $path, $chown ); + } + if ( $chgrp ) { + $this->chgrp( $path, $chgrp ); + } + return true; + } + + /** + * Deletes a directory. + * + * @since 2.7.0 + * + * @param string $path Path to directory. + * @param bool $recursive Optional. Whether to recursively remove files/directories. + * Default false. + * @return bool True on success, false on failure. + */ + public function rmdir( $path, $recursive = false ) { + return $this->delete( $path, $recursive ); + } + + /** + * Gets details for files in a directory or a specific file. + * + * @since 2.7.0 + * + * @param string $path Path to directory or file. + * @param bool $include_hidden Optional. Whether to include details of hidden ("." prefixed) files. + * Default true. + * @param bool $recursive Optional. Whether to recursively include file details in nested directories. + * Default false. + * @return array|false { + * Array of files. False if unable to list directory contents. + * + * @type string $name Name of the file or directory. + * @type string $perms *nix representation of permissions. + * @type int $permsn Octal representation of permissions. + * @type string $owner Owner name or ID. + * @type int $size Size of file in bytes. + * @type int $lastmodunix Last modified unix timestamp. + * @type mixed $lastmod Last modified month (3 letter) and day (without leading 0). + * @type int $time Last modified time. + * @type string $type Type of resource. 'f' for file, 'd' for directory. + * @type mixed $files If a directory and $recursive is true, contains another array of files. + * } + */ + public function dirlist( $path, $include_hidden = true, $recursive = false ) { + if ( $this->is_file( $path ) ) { + $limit_file = basename( $path ); + $path = dirname( $path ); + } else { + $limit_file = false; + } + + if ( ! $this->is_dir( $path ) || ! $this->is_readable( $path ) ) { + return false; + } + + $ret = array(); + $dir = dir( $this->sftp_path( $path ) ); + + if ( ! $dir ) { + return false; + } + + while ( false !== ( $entry = $dir->read() ) ) { + $struc = array(); + $struc['name'] = $entry; + + if ( '.' == $struc['name'] || '..' == $struc['name'] ) { + continue; // Do not care about these folders. + } + + if ( ! $include_hidden && '.' == $struc['name'][0] ) { + continue; + } + + if ( $limit_file && $struc['name'] != $limit_file ) { + continue; + } + + $struc['perms'] = $this->gethchmod( $path . '/' . $entry ); + $struc['permsn'] = $this->getnumchmodfromh( $struc['perms'] ); + $struc['number'] = false; + $struc['owner'] = $this->owner( $path . '/' . $entry ); + $struc['group'] = $this->group( $path . '/' . $entry ); + $struc['size'] = $this->size( $path . '/' . $entry ); + $struc['lastmodunix'] = $this->mtime( $path . '/' . $entry ); + $struc['lastmod'] = gmdate( 'M j', $struc['lastmodunix'] ); + $struc['time'] = gmdate( 'h:i:s', $struc['lastmodunix'] ); + $struc['type'] = $this->is_dir( $path . '/' . $entry ) ? 'd' : 'f'; + + if ( 'd' == $struc['type'] ) { + if ( $recursive ) { + $struc['files'] = $this->dirlist( $path . '/' . $struc['name'], $include_hidden, $recursive ); + } else { + $struc['files'] = array(); + } + } + + $ret[ $struc['name'] ] = $struc; + } + $dir->close(); + unset( $dir ); + return $ret; + } +} diff --git a/wp-admin/includes/class-wp-importer.php b/wp-admin/includes/class-wp-importer.php new file mode 100644 index 0000000..d2b85c7 --- /dev/null +++ b/wp-admin/includes/class-wp-importer.php @@ -0,0 +1,334 @@ +prepare( "SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = %s LIMIT %d,%d", $meta_key, $offset, $limit ); + $results = $wpdb->get_results( $sql ); + + // Increment offset. + $offset = ( $limit + $offset ); + + if ( ! empty( $results ) ) { + foreach ( $results as $r ) { + // Set permalinks into array. + $hashtable[ $r->meta_value ] = intval( $r->post_id ); + } + } + } while ( count( $results ) == $limit ); + + // Unset to save memory. + unset( $results, $r ); + + return $hashtable; + } + + /** + * Return count of imported permalinks from WordPress database + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $importer_name + * @param string $bid + * @return int + */ + public function count_imported_posts( $importer_name, $bid ) { + global $wpdb; + + $count = 0; + + // Get count of permalinks. + $meta_key = $importer_name . '_' . $bid . '_permalink'; + $sql = $wpdb->prepare( "SELECT COUNT( post_id ) AS cnt FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key ); + + $result = $wpdb->get_results( $sql ); + + if ( ! empty( $result ) ) { + $count = intval( $result[0]->cnt ); + } + + // Unset to save memory. + unset( $results ); + + return $count; + } + + /** + * Set array with imported comments from WordPress database + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $bid + * @return array + */ + public function get_imported_comments( $bid ) { + global $wpdb; + + $hashtable = array(); + + $limit = 100; + $offset = 0; + + // Grab all comments in chunks. + do { + $sql = $wpdb->prepare( "SELECT comment_ID, comment_agent FROM $wpdb->comments LIMIT %d,%d", $offset, $limit ); + $results = $wpdb->get_results( $sql ); + + // Increment offset. + $offset = ( $limit + $offset ); + + if ( ! empty( $results ) ) { + foreach ( $results as $r ) { + // Explode comment_agent key. + list ( $ca_bid, $source_comment_id ) = explode( '-', $r->comment_agent ); + $source_comment_id = intval( $source_comment_id ); + + // Check if this comment came from this blog. + if ( $bid == $ca_bid ) { + $hashtable[ $source_comment_id ] = intval( $r->comment_ID ); + } + } + } + } while ( count( $results ) == $limit ); + + // Unset to save memory. + unset( $results, $r ); + + return $hashtable; + } + + /** + * @param int $blog_id + * @return int|void + */ + public function set_blog( $blog_id ) { + if ( is_numeric( $blog_id ) ) { + $blog_id = (int) $blog_id; + } else { + $blog = 'http://' . preg_replace( '#^https?://#', '', $blog_id ); + $parsed = parse_url( $blog ); + if ( ! $parsed || empty( $parsed['host'] ) ) { + fwrite( STDERR, "Error: can not determine blog_id from $blog_id\n" ); + exit(); + } + if ( empty( $parsed['path'] ) ) { + $parsed['path'] = '/'; + } + $blogs = get_sites( + array( + 'domain' => $parsed['host'], + 'number' => 1, + 'path' => $parsed['path'], + ) + ); + if ( ! $blogs ) { + fwrite( STDERR, "Error: Could not find blog\n" ); + exit(); + } + $blog = array_shift( $blogs ); + $blog_id = (int) $blog->blog_id; + } + + if ( function_exists( 'is_multisite' ) ) { + if ( is_multisite() ) { + switch_to_blog( $blog_id ); + } + } + + return $blog_id; + } + + /** + * @param int $user_id + * @return int|void + */ + public function set_user( $user_id ) { + if ( is_numeric( $user_id ) ) { + $user_id = (int) $user_id; + } else { + $user_id = (int) username_exists( $user_id ); + } + + if ( ! $user_id || ! wp_set_current_user( $user_id ) ) { + fwrite( STDERR, "Error: can not find user\n" ); + exit(); + } + + return $user_id; + } + + /** + * Sort by strlen, longest string first + * + * @param string $a + * @param string $b + * @return int + */ + public function cmpr_strlen( $a, $b ) { + return strlen( $b ) - strlen( $a ); + } + + /** + * GET URL + * + * @param string $url + * @param string $username + * @param string $password + * @param bool $head + * @return array + */ + public function get_page( $url, $username = '', $password = '', $head = false ) { + // Increase the timeout. + add_filter( 'http_request_timeout', array( $this, 'bump_request_timeout' ) ); + + $headers = array(); + $args = array(); + if ( true === $head ) { + $args['method'] = 'HEAD'; + } + if ( ! empty( $username ) && ! empty( $password ) ) { + $headers['Authorization'] = 'Basic ' . base64_encode( "$username:$password" ); + } + + $args['headers'] = $headers; + + return wp_safe_remote_request( $url, $args ); + } + + /** + * Bump up the request timeout for http requests + * + * @param int $val + * @return int + */ + public function bump_request_timeout( $val ) { + return 60; + } + + /** + * Check if user has exceeded disk quota + * + * @return bool + */ + public function is_user_over_quota() { + if ( function_exists( 'upload_is_user_over_quota' ) ) { + if ( upload_is_user_over_quota() ) { + return true; + } + } + + return false; + } + + /** + * Replace newlines, tabs, and multiple spaces with a single space + * + * @param string $string + * @return string + */ + public function min_whitespace( $string ) { + return preg_replace( '|[\r\n\t ]+|', ' ', $string ); + } + + /** + * Resets global variables that grow out of control during imports. + * + * @since 3.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global array $wp_actions + */ + public function stop_the_insanity() { + global $wpdb, $wp_actions; + // Or define( 'WP_IMPORTING', true ); + $wpdb->queries = array(); + // Reset $wp_actions to keep it from growing out of control. + $wp_actions = array(); + } +} + +/** + * Returns value of command line params. + * Exits when a required param is not set. + * + * @param string $param + * @param bool $required + * @return mixed + */ +function get_cli_args( $param, $required = false ) { + $args = $_SERVER['argv']; + if ( ! is_array( $args ) ) { + $args = array(); + } + + $out = array(); + + $last_arg = null; + $return = null; + + $il = sizeof( $args ); + + for ( $i = 1, $il; $i < $il; $i++ ) { + if ( (bool) preg_match( '/^--(.+)/', $args[ $i ], $match ) ) { + $parts = explode( '=', $match[1] ); + $key = preg_replace( '/[^a-z0-9]+/', '', $parts[0] ); + + if ( isset( $parts[1] ) ) { + $out[ $key ] = $parts[1]; + } else { + $out[ $key ] = true; + } + + $last_arg = $key; + } elseif ( (bool) preg_match( '/^-([a-zA-Z0-9]+)/', $args[ $i ], $match ) ) { + for ( $j = 0, $jl = strlen( $match[1] ); $j < $jl; $j++ ) { + $key = $match[1][ $j ]; + $out[ $key ] = true; + } + + $last_arg = $key; + } elseif ( null !== $last_arg ) { + $out[ $last_arg ] = $args[ $i ]; + } + } + + // Check array for specified param. + if ( isset( $out[ $param ] ) ) { + // Set return value. + $return = $out[ $param ]; + } + + // Check for missing required param. + if ( ! isset( $out[ $param ] ) && $required ) { + // Display message and exit. + echo "\"$param\" parameter is required but was not specified\n"; + exit(); + } + + return $return; +} diff --git a/wp-admin/includes/class-wp-internal-pointers.php b/wp-admin/includes/class-wp-internal-pointers.php new file mode 100644 index 0000000..a17caf5 --- /dev/null +++ b/wp-admin/includes/class-wp-internal-pointers.php @@ -0,0 +1,172 @@ + pointer callback + * ) + * + * Example: + * array( + * 'themes.php' => 'wp390_widgets' + * ) + */ + $registered_pointers = array( + // None currently. + ); + + // Check if screen related pointer is registered. + if ( empty( $registered_pointers[ $hook_suffix ] ) ) { + return; + } + + $pointers = (array) $registered_pointers[ $hook_suffix ]; + + /* + * Specify required capabilities for feature pointers + * + * Format: + * array( + * pointer callback => Array of required capabilities + * ) + * + * Example: + * array( + * 'wp390_widgets' => array( 'edit_theme_options' ) + * ) + */ + $caps_required = array( + // None currently. + ); + + // Get dismissed pointers. + $dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) ); + + $got_pointers = false; + foreach ( array_diff( $pointers, $dismissed ) as $pointer ) { + if ( isset( $caps_required[ $pointer ] ) ) { + foreach ( $caps_required[ $pointer ] as $cap ) { + if ( ! current_user_can( $cap ) ) { + continue 2; + } + } + } + + // Bind pointer print function. + add_action( 'admin_print_footer_scripts', array( 'WP_Internal_Pointers', 'pointer_' . $pointer ) ); + $got_pointers = true; + } + + if ( ! $got_pointers ) { + return; + } + + // Add pointers script and style to queue. + wp_enqueue_style( 'wp-pointer' ); + wp_enqueue_script( 'wp-pointer' ); + } + + /** + * Print the pointer JavaScript data. + * + * @since 3.3.0 + * + * @param string $pointer_id The pointer ID. + * @param string $selector The HTML elements, on which the pointer should be attached. + * @param array $args Arguments to be passed to the pointer JS (see wp-pointer.js). + */ + private static function print_js( $pointer_id, $selector, $args ) { + if ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) ) { + return; + } + + ?> + + 'bookmarks', + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ) + ); + } + + /** + * @return bool + */ + public function ajax_user_can() { + return current_user_can( 'manage_links' ); + } + + /** + * @global int $cat_id + * @global string $s + * @global string $orderby + * @global string $order + */ + public function prepare_items() { + global $cat_id, $s, $orderby, $order; + + wp_reset_vars( array( 'action', 'cat_id', 'link_id', 'orderby', 'order', 's' ) ); + + $args = array( + 'hide_invisible' => 0, + 'hide_empty' => 0, + ); + + if ( 'all' !== $cat_id ) { + $args['category'] = $cat_id; + } + if ( ! empty( $s ) ) { + $args['search'] = $s; + } + if ( ! empty( $orderby ) ) { + $args['orderby'] = $orderby; + } + if ( ! empty( $order ) ) { + $args['order'] = $order; + } + + $this->items = get_bookmarks( $args ); + } + + /** + */ + public function no_items() { + _e( 'No links found.' ); + } + + /** + * @return array + */ + protected function get_bulk_actions() { + $actions = array(); + $actions['delete'] = __( 'Delete' ); + + return $actions; + } + + /** + * @global int $cat_id + * @param string $which + */ + protected function extra_tablenav( $which ) { + global $cat_id; + + if ( 'top' !== $which ) { + return; + } + ?> +
        + $cat_id, + 'name' => 'cat_id', + 'taxonomy' => 'link_category', + 'show_option_all' => get_taxonomy( 'link_category' )->labels->all_items, + 'hide_empty' => true, + 'hierarchical' => 1, + 'show_count' => 0, + 'orderby' => 'name', + ); + + echo ''; + wp_dropdown_categories( $dropdown_options ); + submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) ); + ?> +
        + '', + 'name' => _x( 'Name', 'link name' ), + 'url' => __( 'URL' ), + 'categories' => __( 'Categories' ), + 'rel' => __( 'Relationship' ), + 'visible' => __( 'Visible' ), + 'rating' => __( 'Rating' ), + ); + } + + /** + * @return array + */ + protected function get_sortable_columns() { + return array( + 'name' => 'name', + 'url' => 'url', + 'visible' => 'visible', + 'rating' => 'rating', + ); + } + + /** + * Get the name of the default primary column. + * + * @since 4.3.0 + * + * @return string Name of the default primary column, in this case, 'name'. + */ + protected function get_default_primary_column_name() { + return 'name'; + } + + /** + * Handles the checkbox column output. + * + * @since 4.3.0 + * + * @param object $link The current link object. + */ + public function column_cb( $link ) { + ?> + + + %s', + $edit_link, + /* translators: %s: Link name. */ + esc_attr( sprintf( __( 'Edit “%s”' ), $link->link_name ) ), + $link->link_name + ); + } + + /** + * Handles the link URL column output. + * + * @since 4.3.0 + * + * @param object $link The current link object. + */ + public function column_url( $link ) { + $short_url = url_shorten( $link->link_url ); + echo "$short_url"; + } + + /** + * Handles the link categories column output. + * + * @since 4.3.0 + * + * @global int $cat_id + * + * @param object $link The current link object. + */ + public function column_categories( $link ) { + global $cat_id; + + $cat_names = array(); + foreach ( $link->link_category as $category ) { + $cat = get_term( $category, 'link_category', OBJECT, 'display' ); + if ( is_wp_error( $cat ) ) { + echo $cat->get_error_message(); + } + $cat_name = $cat->name; + if ( (int) $cat_id !== $category ) { + $cat_name = "$cat_name"; + } + $cat_names[] = $cat_name; + } + echo implode( ', ', $cat_names ); + } + + /** + * Handles the link relation column output. + * + * @since 4.3.0 + * + * @param object $link The current link object. + */ + public function column_rel( $link ) { + echo empty( $link->link_rel ) ? '
        ' : $link->link_rel; + } + + /** + * Handles the link visibility column output. + * + * @since 4.3.0 + * + * @param object $link The current link object. + */ + public function column_visible( $link ) { + if ( 'Y' === $link->link_visible ) { + _e( 'Yes' ); + } else { + _e( 'No' ); + } + } + + /** + * Handles the link rating column output. + * + * @since 4.3.0 + * + * @param object $link The current link object. + */ + public function column_rating( $link ) { + echo $link->link_rating; + } + + /** + * Handles the default column output. + * + * @since 4.3.0 + * + * @param object $link Link object. + * @param string $column_name Current column name. + */ + public function column_default( $link, $column_name ) { + /** + * Fires for each registered custom link column. + * + * @since 2.1.0 + * + * @param string $column_name Name of the custom column. + * @param int $link_id Link ID. + */ + do_action( 'manage_link_custom_column', $column_name, $link->link_id ); + } + + public function display_rows() { + foreach ( $this->items as $link ) { + $link = sanitize_bookmark( $link ); + $link->link_name = esc_attr( $link->link_name ); + $link->link_category = wp_get_link_cats( $link->link_id ); + ?> + + single_row_columns( $link ); ?> + + ' . __( 'Edit' ) . ''; + $actions['delete'] = sprintf( + '%s', + wp_nonce_url( "link.php?action=delete&link_id=$link->link_id", 'delete-bookmark_' . $link->link_id ), + /* translators: %s: Link name. */ + esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ), + __( 'Delete' ) + ); + + return $this->row_actions( $actions ); + } +} diff --git a/wp-admin/includes/class-wp-list-table-compat.php b/wp-admin/includes/class-wp-list-table-compat.php new file mode 100644 index 0000000..eb9ea2c --- /dev/null +++ b/wp-admin/includes/class-wp-list-table-compat.php @@ -0,0 +1,50 @@ +_screen = $screen; + + if ( ! empty( $columns ) ) { + $this->_columns = $columns; + add_filter( 'manage_' . $screen->id . '_columns', array( $this, 'get_columns' ), 0 ); + } + } + + /** + * @return array + */ + protected function get_column_info() { + $columns = get_column_headers( $this->_screen ); + $hidden = get_hidden_columns( $this->_screen ); + $sortable = array(); + $primary = $this->get_default_primary_column_name(); + + return array( $columns, $hidden, $sortable, $primary ); + } + + /** + * @return array + */ + public function get_columns() { + return $this->_columns; + } +} diff --git a/wp-admin/includes/class-wp-list-table.php b/wp-admin/includes/class-wp-list-table.php new file mode 100644 index 0000000..c423eeb --- /dev/null +++ b/wp-admin/includes/class-wp-list-table.php @@ -0,0 +1,1431 @@ +get_column_info(). + * + * @since 4.1.0 + * @var array + */ + protected $_column_headers; + + /** + * {@internal Missing Summary} + * + * @var array + */ + protected $compat_fields = array( '_args', '_pagination_args', 'screen', '_actions', '_pagination' ); + + /** + * {@internal Missing Summary} + * + * @var array + */ + protected $compat_methods = array( + 'set_pagination_args', + 'get_views', + 'get_bulk_actions', + 'bulk_actions', + 'row_actions', + 'months_dropdown', + 'view_switcher', + 'comments_bubble', + 'get_items_per_page', + 'pagination', + 'get_sortable_columns', + 'get_column_info', + 'get_table_classes', + 'display_tablenav', + 'extra_tablenav', + 'single_row_columns', + ); + + /** + * Constructor. + * + * The child class should call this constructor from its own constructor to override + * the default $args. + * + * @since 3.1.0 + * + * @param array|string $args { + * Array or string of arguments. + * + * @type string $plural Plural value used for labels and the objects being listed. + * This affects things such as CSS class-names and nonces used + * in the list table, e.g. 'posts'. Default empty. + * @type string $singular Singular label for an object being listed, e.g. 'post'. + * Default empty + * @type bool $ajax Whether the list table supports Ajax. This includes loading + * and sorting data, for example. If true, the class will call + * the _js_vars() method in the footer to provide variables + * to any scripts handling Ajax events. Default false. + * @type string $screen String containing the hook name used to determine the current + * screen. If left null, the current screen will be automatically set. + * Default null. + * } + */ + public function __construct( $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'plural' => '', + 'singular' => '', + 'ajax' => false, + 'screen' => null, + ) + ); + + $this->screen = convert_to_screen( $args['screen'] ); + + add_filter( "manage_{$this->screen->id}_columns", array( $this, 'get_columns' ), 0 ); + + if ( ! $args['plural'] ) { + $args['plural'] = $this->screen->base; + } + + $args['plural'] = sanitize_key( $args['plural'] ); + $args['singular'] = sanitize_key( $args['singular'] ); + + $this->_args = $args; + + if ( $args['ajax'] ) { + // wp_enqueue_script( 'list-table' ); + add_action( 'admin_footer', array( $this, '_js_vars' ) ); + } + + if ( empty( $this->modes ) ) { + $this->modes = array( + 'list' => __( 'List View' ), + 'excerpt' => __( 'Excerpt View' ), + ); + } + } + + /** + * Make private properties readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to get. + * @return mixed Property. + */ + public function __get( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + return $this->$name; + } + } + + /** + * Make private properties settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @param mixed $value Property value. + * @return mixed Newly-set property. + */ + public function __set( $name, $value ) { + if ( in_array( $name, $this->compat_fields ) ) { + return $this->$name = $value; + } + } + + /** + * Make private properties checkable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @return bool Whether the property is set. + */ + public function __isset( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + return isset( $this->$name ); + } + } + + /** + * Make private properties un-settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to unset. + */ + public function __unset( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + unset( $this->$name ); + } + } + + /** + * Make private/protected methods readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Method to call. + * @param array $arguments Arguments to pass when calling. + * @return mixed|bool Return value of the callback, false otherwise. + */ + public function __call( $name, $arguments ) { + if ( in_array( $name, $this->compat_methods ) ) { + return $this->$name( ...$arguments ); + } + return false; + } + + /** + * Checks the current user's permissions + * + * @since 3.1.0 + * @abstract + */ + public function ajax_user_can() { + die( 'function WP_List_Table::ajax_user_can() must be overridden in a subclass.' ); + } + + /** + * Prepares the list of items for displaying. + * + * @uses WP_List_Table::set_pagination_args() + * + * @since 3.1.0 + * @abstract + */ + public function prepare_items() { + die( 'function WP_List_Table::prepare_items() must be overridden in a subclass.' ); + } + + /** + * An internal method that sets all the necessary pagination arguments + * + * @since 3.1.0 + * + * @param array|string $args Array or string of arguments with information about the pagination. + */ + protected function set_pagination_args( $args ) { + $args = wp_parse_args( + $args, + array( + 'total_items' => 0, + 'total_pages' => 0, + 'per_page' => 0, + ) + ); + + if ( ! $args['total_pages'] && $args['per_page'] > 0 ) { + $args['total_pages'] = ceil( $args['total_items'] / $args['per_page'] ); + } + + // Redirect if page number is invalid and headers are not already sent. + if ( ! headers_sent() && ! wp_doing_ajax() && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages'] ) { + wp_redirect( add_query_arg( 'paged', $args['total_pages'] ) ); + exit; + } + + $this->_pagination_args = $args; + } + + /** + * Access the pagination args. + * + * @since 3.1.0 + * + * @param string $key Pagination argument to retrieve. Common values include 'total_items', + * 'total_pages', 'per_page', or 'infinite_scroll'. + * @return int Number of items that correspond to the given pagination argument. + */ + public function get_pagination_arg( $key ) { + if ( 'page' === $key ) { + return $this->get_pagenum(); + } + + if ( isset( $this->_pagination_args[ $key ] ) ) { + return $this->_pagination_args[ $key ]; + } + } + + /** + * Whether the table has items to display or not + * + * @since 3.1.0 + * + * @return bool + */ + public function has_items() { + return ! empty( $this->items ); + } + + /** + * Message to be displayed when there are no items + * + * @since 3.1.0 + */ + public function no_items() { + _e( 'No items found.' ); + } + + /** + * Displays the search box. + * + * @since 3.1.0 + * + * @param string $text The 'submit' button label. + * @param string $input_id ID attribute value for the search input field. + */ + public function search_box( $text, $input_id ) { + if ( empty( $_REQUEST['s'] ) && ! $this->has_items() ) { + return; + } + + $input_id = $input_id . '-search-input'; + + if ( ! empty( $_REQUEST['orderby'] ) ) { + echo ''; + } + if ( ! empty( $_REQUEST['order'] ) ) { + echo ''; + } + if ( ! empty( $_REQUEST['post_mime_type'] ) ) { + echo ''; + } + if ( ! empty( $_REQUEST['detached'] ) ) { + echo ''; + } + ?> + + link ) with the list + * of views available on this table. + * + * @since 3.1.0 + * + * @return array + */ + protected function get_views() { + return array(); + } + + /** + * Display the list of views available on this table. + * + * @since 3.1.0 + */ + public function views() { + $views = $this->get_views(); + /** + * Filters the list of available list table views. + * + * The dynamic portion of the hook name, `$this->screen->id`, refers + * to the ID of the current screen, usually a string. + * + * @since 3.5.0 + * + * @param string[] $views An array of available list table views. + */ + $views = apply_filters( "views_{$this->screen->id}", $views ); + + if ( empty( $views ) ) { + return; + } + + $this->screen->render_screen_reader_content( 'heading_views' ); + + echo "
          \n"; + foreach ( $views as $class => $view ) { + $views[ $class ] = "\t
        • $view"; + } + echo implode( " |
        • \n", $views ) . "\n"; + echo '
        '; + } + + /** + * Get an associative array ( option_name => option_title ) with the list + * of bulk actions available on this table. + * + * @since 3.1.0 + * + * @return array + */ + protected function get_bulk_actions() { + return array(); + } + + /** + * Display the bulk actions dropdown. + * + * @since 3.1.0 + * + * @param string $which The location of the bulk actions: 'top' or 'bottom'. + * This is designated as optional for backward compatibility. + */ + protected function bulk_actions( $which = '' ) { + if ( is_null( $this->_actions ) ) { + $this->_actions = $this->get_bulk_actions(); + /** + * Filters the list table Bulk Actions drop-down. + * + * The dynamic portion of the hook name, `$this->screen->id`, refers + * to the ID of the current screen, usually a string. + * + * This filter can currently only be used to remove bulk actions. + * + * @since 3.5.0 + * + * @param string[] $actions An array of the available bulk actions. + */ + $this->_actions = apply_filters( "bulk_actions-{$this->screen->id}", $this->_actions ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + $two = ''; + } else { + $two = '2'; + } + + if ( empty( $this->_actions ) ) { + return; + } + + echo ''; + echo '\n"; + + submit_button( __( 'Apply' ), 'action', '', false, array( 'id' => "doaction$two" ) ); + echo "\n"; + } + + /** + * Get the current action selected from the bulk actions dropdown. + * + * @since 3.1.0 + * + * @return string|false The action name or False if no action was selected + */ + public function current_action() { + if ( isset( $_REQUEST['filter_action'] ) && ! empty( $_REQUEST['filter_action'] ) ) { + return false; + } + + if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] ) { + return $_REQUEST['action']; + } + + if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] ) { + return $_REQUEST['action2']; + } + + return false; + } + + /** + * Generates the required HTML for a list of row action links. + * + * @since 3.1.0 + * + * @param string[] $actions An array of action links. + * @param bool $always_visible Whether the actions should be always visible. + * @return string The HTML for the row actions. + */ + protected function row_actions( $actions, $always_visible = false ) { + $action_count = count( $actions ); + $i = 0; + + if ( ! $action_count ) { + return ''; + } + + $out = '
        '; + foreach ( $actions as $action => $link ) { + ++$i; + ( $i == $action_count ) ? $sep = '' : $sep = ' | '; + $out .= "$link$sep"; + } + $out .= '
        '; + + $out .= ''; + + return $out; + } + + /** + * Displays a dropdown for filtering items in the list table by month. + * + * @since 3.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global WP_Locale $wp_locale WordPress date and time locale object. + * + * @param string $post_type The post type. + */ + protected function months_dropdown( $post_type ) { + global $wpdb, $wp_locale; + + /** + * Filters whether to remove the 'Months' drop-down from the post list table. + * + * @since 4.2.0 + * + * @param bool $disable Whether to disable the drop-down. Default false. + * @param string $post_type The post type. + */ + if ( apply_filters( 'disable_months_dropdown', false, $post_type ) ) { + return; + } + + $extra_checks = "AND post_status != 'auto-draft'"; + if ( ! isset( $_GET['post_status'] ) || 'trash' !== $_GET['post_status'] ) { + $extra_checks .= " AND post_status != 'trash'"; + } elseif ( isset( $_GET['post_status'] ) ) { + $extra_checks = $wpdb->prepare( ' AND post_status = %s', $_GET['post_status'] ); + } + + $months = $wpdb->get_results( + $wpdb->prepare( + " + SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month + FROM $wpdb->posts + WHERE post_type = %s + $extra_checks + ORDER BY post_date DESC + ", + $post_type + ) + ); + + /** + * Filters the 'Months' drop-down results. + * + * @since 3.7.0 + * + * @param object[] $months Array of the months drop-down query results. + * @param string $post_type The post type. + */ + $months = apply_filters( 'months_dropdown_results', $months, $post_type ); + + $month_count = count( $months ); + + if ( ! $month_count || ( 1 == $month_count && 0 == $months[0]->month ) ) { + return; + } + + $m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0; + ?> + + + + +
        + modes as $mode => $title ) { + $classes = array( 'view-' . $mode ); + $aria_current = ''; + + if ( $current_mode === $mode ) { + $classes[] = 'current'; + $aria_current = ' aria-current="page"'; + } + printf( + "%s\n", + esc_url( add_query_arg( 'mode', $mode ) ), + implode( ' ', $classes ), + $title + ); + } + ?> +
        + —%s', + __( 'No comments' ) + ); + // Approved comments have different display depending on some conditions. + } elseif ( $approved_comments ) { + printf( + '%s', + esc_url( + add_query_arg( + array( + 'p' => $post_id, + 'comment_status' => 'approved', + ), + admin_url( 'edit-comments.php' ) + ) + ), + $approved_comments_number, + $pending_comments ? $approved_phrase : $approved_only_phrase + ); + } else { + printf( + '%s', + $approved_comments_number, + $pending_comments ? __( 'No approved comments' ) : __( 'No comments' ) + ); + } + + if ( $pending_comments ) { + printf( + '%s', + esc_url( + add_query_arg( + array( + 'p' => $post_id, + 'comment_status' => 'moderated', + ), + admin_url( 'edit-comments.php' ) + ) + ), + $pending_comments_number, + $pending_phrase + ); + } else { + printf( + '%s', + $pending_comments_number, + $approved_comments ? __( 'No pending comments' ) : __( 'No comments' ) + ); + } + } + + /** + * Get the current page number + * + * @since 3.1.0 + * + * @return int + */ + public function get_pagenum() { + $pagenum = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 0; + + if ( isset( $this->_pagination_args['total_pages'] ) && $pagenum > $this->_pagination_args['total_pages'] ) { + $pagenum = $this->_pagination_args['total_pages']; + } + + return max( 1, $pagenum ); + } + + /** + * Get number of items to display on a single page + * + * @since 3.1.0 + * + * @param string $option + * @param int $default + * @return int + */ + protected function get_items_per_page( $option, $default = 20 ) { + $per_page = (int) get_user_option( $option ); + if ( empty( $per_page ) || $per_page < 1 ) { + $per_page = $default; + } + + /** + * Filters the number of items to be displayed on each page of the list table. + * + * The dynamic hook name, $option, refers to the `per_page` option depending + * on the type of list table in use. Possible values include: 'edit_comments_per_page', + * 'sites_network_per_page', 'site_themes_network_per_page', 'themes_network_per_page', + * 'users_network_per_page', 'edit_post_per_page', 'edit_page_per_page', + * 'edit_{$post_type}_per_page', etc. + * + * @since 2.9.0 + * + * @param int $per_page Number of items to be displayed. Default 20. + */ + return (int) apply_filters( "{$option}", $per_page ); + } + + /** + * Display the pagination. + * + * @since 3.1.0 + * + * @param string $which + */ + protected function pagination( $which ) { + if ( empty( $this->_pagination_args ) ) { + return; + } + + $total_items = $this->_pagination_args['total_items']; + $total_pages = $this->_pagination_args['total_pages']; + $infinite_scroll = false; + if ( isset( $this->_pagination_args['infinite_scroll'] ) ) { + $infinite_scroll = $this->_pagination_args['infinite_scroll']; + } + + if ( 'top' === $which && $total_pages > 1 ) { + $this->screen->render_screen_reader_content( 'heading_pagination' ); + } + + $output = '' . sprintf( + /* translators: %s: Number of items. */ + _n( '%s item', '%s items', $total_items ), + number_format_i18n( $total_items ) + ) . ''; + + $current = $this->get_pagenum(); + $removable_query_args = wp_removable_query_args(); + + $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); + + $current_url = remove_query_arg( $removable_query_args, $current_url ); + + $page_links = array(); + + $total_pages_before = ''; + $total_pages_after = ''; + + $disable_first = false; + $disable_last = false; + $disable_prev = false; + $disable_next = false; + + if ( 1 == $current ) { + $disable_first = true; + $disable_prev = true; + } + if ( 2 == $current ) { + $disable_first = true; + } + if ( $total_pages == $current ) { + $disable_last = true; + $disable_next = true; + } + if ( $total_pages - 1 == $current ) { + $disable_last = true; + } + + if ( $disable_first ) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url( remove_query_arg( 'paged', $current_url ) ), + __( 'First page' ), + '«' + ); + } + + if ( $disable_prev ) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url( add_query_arg( 'paged', max( 1, $current - 1 ), $current_url ) ), + __( 'Previous page' ), + '‹' + ); + } + + if ( 'bottom' === $which ) { + $html_current_page = $current; + $total_pages_before = '' . __( 'Current Page' ) . ''; + } else { + $html_current_page = sprintf( + "%s", + '', + $current, + strlen( $total_pages ) + ); + } + $html_total_pages = sprintf( "%s", number_format_i18n( $total_pages ) ); + $page_links[] = $total_pages_before . sprintf( + /* translators: 1: Current page, 2: Total pages. */ + _x( '%1$s of %2$s', 'paging' ), + $html_current_page, + $html_total_pages + ) . $total_pages_after; + + if ( $disable_next ) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url( add_query_arg( 'paged', min( $total_pages, $current + 1 ), $current_url ) ), + __( 'Next page' ), + '›' + ); + } + + if ( $disable_last ) { + $page_links[] = ''; + } else { + $page_links[] = sprintf( + "%s", + esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ), + __( 'Last page' ), + '»' + ); + } + + $pagination_links_class = 'pagination-links'; + if ( ! empty( $infinite_scroll ) ) { + $pagination_links_class .= ' hide-if-js'; + } + $output .= "\n" . join( "\n", $page_links ) . ''; + + if ( $total_pages ) { + $page_class = $total_pages < 2 ? ' one-page' : ''; + } else { + $page_class = ' no-pages'; + } + $this->_pagination = "
        $output
        "; + + echo $this->_pagination; + } + + /** + * Get a list of columns. The format is: + * 'internal-name' => 'Title' + * + * @since 3.1.0 + * @abstract + * + * @return array + */ + public function get_columns() { + die( 'function WP_List_Table::get_columns() must be overridden in a subclass.' ); + } + + /** + * Get a list of sortable columns. The format is: + * 'internal-name' => 'orderby' + * or + * 'internal-name' => array( 'orderby', true ) + * + * The second format will make the initial sorting order be descending + * + * @since 3.1.0 + * + * @return array + */ + protected function get_sortable_columns() { + return array(); + } + + /** + * Gets the name of the default primary column. + * + * @since 4.3.0 + * + * @return string Name of the default primary column, in this case, an empty string. + */ + protected function get_default_primary_column_name() { + $columns = $this->get_columns(); + $column = ''; + + if ( empty( $columns ) ) { + return $column; + } + + // We need a primary defined so responsive views show something, + // so let's fall back to the first non-checkbox column. + foreach ( $columns as $col => $column_name ) { + if ( 'cb' === $col ) { + continue; + } + + $column = $col; + break; + } + + return $column; + } + + /** + * Public wrapper for WP_List_Table::get_default_primary_column_name(). + * + * @since 4.4.0 + * + * @return string Name of the default primary column. + */ + public function get_primary_column() { + return $this->get_primary_column_name(); + } + + /** + * Gets the name of the primary column. + * + * @since 4.3.0 + * + * @return string The name of the primary column. + */ + protected function get_primary_column_name() { + $columns = get_column_headers( $this->screen ); + $default = $this->get_default_primary_column_name(); + + // If the primary column doesn't exist, + // fall back to the first non-checkbox column. + if ( ! isset( $columns[ $default ] ) ) { + $default = WP_List_Table::get_default_primary_column_name(); + } + + /** + * Filters the name of the primary column for the current list table. + * + * @since 4.3.0 + * + * @param string $default Column name default for the specific list table, e.g. 'name'. + * @param string $context Screen ID for specific list table, e.g. 'plugins'. + */ + $column = apply_filters( 'list_table_primary_column', $default, $this->screen->id ); + + if ( empty( $column ) || ! isset( $columns[ $column ] ) ) { + $column = $default; + } + + return $column; + } + + /** + * Get a list of all, hidden and sortable columns, with filter applied + * + * @since 3.1.0 + * + * @return array + */ + protected function get_column_info() { + // $_column_headers is already set / cached. + if ( isset( $this->_column_headers ) && is_array( $this->_column_headers ) ) { + // Back-compat for list tables that have been manually setting $_column_headers for horse reasons. + // In 4.3, we added a fourth argument for primary column. + $column_headers = array( array(), array(), array(), $this->get_primary_column_name() ); + foreach ( $this->_column_headers as $key => $value ) { + $column_headers[ $key ] = $value; + } + + return $column_headers; + } + + $columns = get_column_headers( $this->screen ); + $hidden = get_hidden_columns( $this->screen ); + + $sortable_columns = $this->get_sortable_columns(); + /** + * Filters the list table sortable columns for a specific screen. + * + * The dynamic portion of the hook name, `$this->screen->id`, refers + * to the ID of the current screen, usually a string. + * + * @since 3.5.0 + * + * @param array $sortable_columns An array of sortable columns. + */ + $_sortable = apply_filters( "manage_{$this->screen->id}_sortable_columns", $sortable_columns ); + + $sortable = array(); + foreach ( $_sortable as $id => $data ) { + if ( empty( $data ) ) { + continue; + } + + $data = (array) $data; + if ( ! isset( $data[1] ) ) { + $data[1] = false; + } + + $sortable[ $id ] = $data; + } + + $primary = $this->get_primary_column_name(); + $this->_column_headers = array( $columns, $hidden, $sortable, $primary ); + + return $this->_column_headers; + } + + /** + * Return number of visible columns + * + * @since 3.1.0 + * + * @return int + */ + public function get_column_count() { + list ( $columns, $hidden ) = $this->get_column_info(); + $hidden = array_intersect( array_keys( $columns ), array_filter( $hidden ) ); + return count( $columns ) - count( $hidden ); + } + + /** + * Print column headers, accounting for hidden and sortable columns. + * + * @since 3.1.0 + * + * @staticvar int $cb_counter + * + * @param bool $with_id Whether to set the id attribute or not + */ + public function print_column_headers( $with_id = true ) { + list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); + + $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); + $current_url = remove_query_arg( 'paged', $current_url ); + + if ( isset( $_GET['orderby'] ) ) { + $current_orderby = $_GET['orderby']; + } else { + $current_orderby = ''; + } + + if ( isset( $_GET['order'] ) && 'desc' === $_GET['order'] ) { + $current_order = 'desc'; + } else { + $current_order = 'asc'; + } + + if ( ! empty( $columns['cb'] ) ) { + static $cb_counter = 1; + $columns['cb'] = '' + . ''; + $cb_counter++; + } + + foreach ( $columns as $column_key => $column_display_name ) { + $class = array( 'manage-column', "column-$column_key" ); + + if ( in_array( $column_key, $hidden ) ) { + $class[] = 'hidden'; + } + + if ( 'cb' === $column_key ) { + $class[] = 'check-column'; + } elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) ) { + $class[] = 'num'; + } + + if ( $column_key === $primary ) { + $class[] = 'column-primary'; + } + + if ( isset( $sortable[ $column_key ] ) ) { + list( $orderby, $desc_first ) = $sortable[ $column_key ]; + + if ( $current_orderby === $orderby ) { + $order = 'asc' === $current_order ? 'desc' : 'asc'; + $class[] = 'sorted'; + $class[] = $current_order; + } else { + $order = $desc_first ? 'desc' : 'asc'; + $class[] = 'sortable'; + $class[] = $desc_first ? 'asc' : 'desc'; + } + + $column_display_name = '' . $column_display_name . ''; + } + + $tag = ( 'cb' === $column_key ) ? 'td' : 'th'; + $scope = ( 'th' === $tag ) ? 'scope="col"' : ''; + $id = $with_id ? "id='$column_key'" : ''; + + if ( ! empty( $class ) ) { + $class = "class='" . join( ' ', $class ) . "'"; + } + + echo "<$tag $scope $id $class>$column_display_name"; + } + } + + /** + * Displays the table. + * + * @since 3.1.0 + */ + public function display() { + $singular = $this->_args['singular']; + + $this->display_tablenav( 'top' ); + + $this->screen->render_screen_reader_content( 'heading_list' ); + ?> + + + + print_column_headers(); ?> + + + + + > + display_rows_or_placeholder(); ?> + + + + + print_column_headers( false ); ?> + + + +
        + display_tablenav( 'bottom' ); + } + + /** + * Get a list of CSS classes for the WP_List_Table table tag. + * + * @since 3.1.0 + * + * @return string[] Array of CSS classes for the table tag. + */ + protected function get_table_classes() { + return array( 'widefat', 'fixed', 'striped', $this->_args['plural'] ); + } + + /** + * Generate the table navigation above or below the table + * + * @since 3.1.0 + * @param string $which + */ + protected function display_tablenav( $which ) { + if ( 'top' === $which ) { + wp_nonce_field( 'bulk-' . $this->_args['plural'] ); + } + ?> +
        + + has_items() ) : ?> +
        + bulk_actions( $which ); ?> +
        + extra_tablenav( $which ); + $this->pagination( $which ); + ?> + +
        +
        + has_items() ) { + $this->display_rows(); + } else { + echo ''; + $this->no_items(); + echo ''; + } + } + + /** + * Generate the table rows + * + * @since 3.1.0 + */ + public function display_rows() { + foreach ( $this->items as $item ) { + $this->single_row( $item ); + } + } + + /** + * Generates content for a single row of the table + * + * @since 3.1.0 + * + * @param object $item The current item + */ + public function single_row( $item ) { + echo ''; + $this->single_row_columns( $item ); + echo ''; + } + + /** + * @param object $item + * @param string $column_name + */ + protected function column_default( $item, $column_name ) {} + + /** + * @param object $item + */ + protected function column_cb( $item ) {} + + /** + * Generates the columns for a single row of the table + * + * @since 3.1.0 + * + * @param object $item The current item + */ + protected function single_row_columns( $item ) { + list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $classes = "$column_name column-$column_name"; + if ( $primary === $column_name ) { + $classes .= ' has-row-actions column-primary'; + } + + if ( in_array( $column_name, $hidden ) ) { + $classes .= ' hidden'; + } + + // Comments column uses HTML in the display name with screen reader text. + // Instead of using esc_attr(), we strip tags to get closer to a user-friendly string. + $data = 'data-colname="' . wp_strip_all_tags( $column_display_name ) . '"'; + + $attributes = "class='$classes' $data"; + + if ( 'cb' === $column_name ) { + echo ''; + echo $this->column_cb( $item ); + echo ''; + } elseif ( method_exists( $this, '_column_' . $column_name ) ) { + echo call_user_func( + array( $this, '_column_' . $column_name ), + $item, + $classes, + $data, + $primary + ); + } elseif ( method_exists( $this, 'column_' . $column_name ) ) { + echo ""; + echo call_user_func( array( $this, 'column_' . $column_name ), $item ); + echo $this->handle_row_actions( $item, $column_name, $primary ); + echo ''; + } else { + echo ""; + echo $this->column_default( $item, $column_name ); + echo $this->handle_row_actions( $item, $column_name, $primary ); + echo ''; + } + } + } + + /** + * Generates and display row actions links for the list table. + * + * @since 4.3.0 + * + * @param object $item The item being acted upon. + * @param string $column_name Current column name. + * @param string $primary Primary column name. + * @return string The row actions HTML, or an empty string + * if the current column is not the primary column. + */ + protected function handle_row_actions( $item, $column_name, $primary ) { + return $column_name === $primary ? '' : ''; + } + + /** + * Handle an incoming ajax request (called from admin-ajax.php) + * + * @since 3.1.0 + */ + public function ajax_response() { + $this->prepare_items(); + + ob_start(); + if ( ! empty( $_REQUEST['no_placeholder'] ) ) { + $this->display_rows(); + } else { + $this->display_rows_or_placeholder(); + } + + $rows = ob_get_clean(); + + $response = array( 'rows' => $rows ); + + if ( isset( $this->_pagination_args['total_items'] ) ) { + $response['total_items_i18n'] = sprintf( + /* translators: Number of items. */ + _n( '%s item', '%s items', $this->_pagination_args['total_items'] ), + number_format_i18n( $this->_pagination_args['total_items'] ) + ); + } + if ( isset( $this->_pagination_args['total_pages'] ) ) { + $response['total_pages'] = $this->_pagination_args['total_pages']; + $response['total_pages_i18n'] = number_format_i18n( $this->_pagination_args['total_pages'] ); + } + + die( wp_json_encode( $response ) ); + } + + /** + * Send required variables to JavaScript land + */ + public function _js_vars() { + $args = array( + 'class' => get_class( $this ), + 'screen' => array( + 'id' => $this->screen->id, + 'base' => $this->screen->base, + ), + ); + + printf( "\n", wp_json_encode( $args ) ); + } +} diff --git a/wp-admin/includes/class-wp-media-list-table.php b/wp-admin/includes/class-wp-media-list-table.php new file mode 100644 index 0000000..cc8940a --- /dev/null +++ b/wp-admin/includes/class-wp-media-list-table.php @@ -0,0 +1,800 @@ +detached = ( isset( $_REQUEST['attachment-filter'] ) && 'detached' === $_REQUEST['attachment-filter'] ); + + $this->modes = array( + 'list' => __( 'List View' ), + 'grid' => __( 'Grid View' ), + ); + + parent::__construct( + array( + 'plural' => 'media', + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ) + ); + } + + /** + * @return bool + */ + public function ajax_user_can() { + return current_user_can( 'upload_files' ); + } + + /** + * @global WP_Query $wp_query WordPress Query object. + * @global array $post_mime_types + * @global array $avail_post_mime_types + * @global string $mode + */ + public function prepare_items() { + global $wp_query, $post_mime_types, $avail_post_mime_types, $mode; + + list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $_REQUEST ); + + $this->is_trash = isset( $_REQUEST['attachment-filter'] ) && 'trash' === $_REQUEST['attachment-filter']; + + $mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode']; + + $this->set_pagination_args( + array( + 'total_items' => $wp_query->found_posts, + 'total_pages' => $wp_query->max_num_pages, + 'per_page' => $wp_query->query_vars['posts_per_page'], + ) + ); + } + + /** + * @global array $post_mime_types + * @global array $avail_post_mime_types + * @return array + */ + protected function get_views() { + global $post_mime_types, $avail_post_mime_types; + + $type_links = array(); + + $filter = empty( $_GET['attachment-filter'] ) ? '' : $_GET['attachment-filter']; + + $type_links['all'] = sprintf( + '', + selected( $filter, true, false ), + __( 'All media items' ) + ); + + foreach ( $post_mime_types as $mime_type => $label ) { + if ( ! wp_match_mime_types( $mime_type, $avail_post_mime_types ) ) { + continue; + } + + $selected = selected( + $filter && 0 === strpos( $filter, 'post_mime_type:' ) && + wp_match_mime_types( $mime_type, str_replace( 'post_mime_type:', '', $filter ) ), + true, + false + ); + + $type_links[ $mime_type ] = sprintf( + '', + esc_attr( $mime_type ), + $selected, + $label[0] + ); + } + + $type_links['detached'] = ''; + + $type_links['mine'] = sprintf( + '', + selected( 'mine' === $filter, true, false ), + _x( 'Mine', 'media items' ) + ); + + if ( $this->is_trash || ( defined( 'MEDIA_TRASH' ) && MEDIA_TRASH ) ) { + $type_links['trash'] = sprintf( + '', + selected( 'trash' === $filter, true, false ), + _x( 'Trash', 'attachment filter' ) + ); + } + + return $type_links; + } + + /** + * @return array + */ + protected function get_bulk_actions() { + $actions = array(); + if ( MEDIA_TRASH ) { + if ( $this->is_trash ) { + $actions['untrash'] = __( 'Restore' ); + $actions['delete'] = __( 'Delete Permanently' ); + } else { + $actions['trash'] = __( 'Move to Trash' ); + } + } else { + $actions['delete'] = __( 'Delete Permanently' ); + } + + if ( $this->detached ) { + $actions['attach'] = __( 'Attach' ); + } + + return $actions; + } + + /** + * @param string $which + */ + protected function extra_tablenav( $which ) { + if ( 'bar' !== $which ) { + return; + } + ?> +
        + is_trash ) { + $this->months_dropdown( 'attachment' ); + } + + /** This action is documented in wp-admin/includes/class-wp-posts-list-table.php */ + do_action( 'restrict_manage_posts', $this->screen->post_type, $which ); + + submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) ); + } + + if ( $this->is_trash && current_user_can( 'edit_others_posts' ) && $this->has_items() ) { + submit_button( __( 'Empty Trash' ), 'apply', 'delete_all', false ); + } + ?> +
        + is_trash ) { + _e( 'No media files found in Trash.' ); + } else { + _e( 'No media files found.' ); + } + } + + /** + * Override parent views so we can use the filter bar display. + * + * @global string $mode List table view mode. + */ + public function views() { + global $mode; + + $views = $this->get_views(); + + $this->screen->render_screen_reader_content( 'heading_views' ); + ?> +
        +
        + view_switcher( $mode ); ?> + + + + + extra_tablenav( 'bar' ); + + /** This filter is documented in wp-admin/inclues/class-wp-list-table.php */ + $views = apply_filters( "views_{$this->screen->id}", array() ); + + // Back compat for pre-4.0 view links. + if ( ! empty( $views ) ) { + echo ''; + } + ?> +
        + +
        + +
        +
        + '; + /* translators: Column name. */ + $posts_columns['title'] = _x( 'File', 'column name' ); + $posts_columns['author'] = __( 'Author' ); + + $taxonomies = get_taxonomies_for_attachments( 'objects' ); + $taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' ); + + /** + * Filters the taxonomy columns for attachments in the Media list table. + * + * @since 3.5.0 + * + * @param string[] $taxonomies An array of registered taxonomy names to show for attachments. + * @param string $post_type The post type. Default 'attachment'. + */ + $taxonomies = apply_filters( 'manage_taxonomies_for_attachment_columns', $taxonomies, 'attachment' ); + $taxonomies = array_filter( $taxonomies, 'taxonomy_exists' ); + + foreach ( $taxonomies as $taxonomy ) { + if ( 'category' === $taxonomy ) { + $column_key = 'categories'; + } elseif ( 'post_tag' === $taxonomy ) { + $column_key = 'tags'; + } else { + $column_key = 'taxonomy-' . $taxonomy; + } + $posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name; + } + + /* translators: Column name. */ + if ( ! $this->detached ) { + $posts_columns['parent'] = _x( 'Uploaded to', 'column name' ); + if ( post_type_supports( 'attachment', 'comments' ) ) { + $posts_columns['comments'] = '' . __( 'Comments' ) . ''; + } + } + /* translators: Column name. */ + $posts_columns['date'] = _x( 'Date', 'column name' ); + /** + * Filters the Media list table columns. + * + * @since 2.5.0 + * + * @param string[] $posts_columns An array of columns displayed in the Media list table. + * @param bool $detached Whether the list table contains media not attached + * to any posts. Default true. + */ + return apply_filters( 'manage_media_columns', $posts_columns, $this->detached ); + } + + /** + * @return array + */ + protected function get_sortable_columns() { + return array( + 'title' => 'title', + 'author' => 'author', + 'parent' => 'parent', + 'comments' => 'comment_count', + 'date' => array( 'date', true ), + ); + } + + /** + * Handles the checkbox column output. + * + * @since 4.3.0 + * + * @param WP_Post $post The current WP_Post object. + */ + public function column_cb( $post ) { + if ( current_user_can( 'edit_post', $post->ID ) ) { + ?> + + + post_mime_type ); + + $title = _draft_or_post_title(); + $thumb = wp_get_attachment_image( $post->ID, array( 60, 60 ), true, array( 'alt' => '' ) ); + $link_start = ''; + $link_end = ''; + + if ( current_user_can( 'edit_post', $post->ID ) && ! $this->is_trash ) { + $link_start = sprintf( + '', + get_edit_post_link( $post->ID ), + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( '“%s” (Edit)' ), $title ) ) + ); + $link_end = ''; + } + + $class = $thumb ? ' class="has-media-icon"' : ''; + ?> + > + + + + +

        + + ID ); + echo esc_html( wp_basename( $file ) ); + ?> +

        + %s', + esc_url( add_query_arg( array( 'author' => get_the_author_meta( 'ID' ) ), 'upload.php' ) ), + get_the_author() + ); + } + + /** + * Handles the description column output. + * + * @since 4.3.0 + * + * @param WP_Post $post The current WP_Post object. + */ + public function column_desc( $post ) { + echo has_excerpt() ? $post->post_excerpt : ''; + } + + /** + * Handles the date column output. + * + * @since 4.3.0 + * + * @param WP_Post $post The current WP_Post object. + */ + public function column_date( $post ) { + if ( '0000-00-00 00:00:00' === $post->post_date ) { + $h_time = __( 'Unpublished' ); + } else { + $time = get_post_timestamp( $post ); + $time_diff = time() - $time; + + if ( $time && $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) { + /* translators: %s: Human-readable time difference. */ + $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) ); + } else { + $h_time = get_the_time( __( 'Y/m/d' ), $post ); + } + } + + echo $h_time; + } + + /** + * Handles the parent column output. + * + * @since 4.3.0 + * + * @param WP_Post $post The current WP_Post object. + */ + public function column_parent( $post ) { + $user_can_edit = current_user_can( 'edit_post', $post->ID ); + + if ( $post->post_parent > 0 ) { + $parent = get_post( $post->post_parent ); + } else { + $parent = false; + } + + if ( $parent ) { + $title = _draft_or_post_title( $post->post_parent ); + $parent_type = get_post_type_object( $parent->post_type ); + + if ( $parent_type && $parent_type->show_ui && current_user_can( 'edit_post', $post->post_parent ) ) { + ?> + + + post_parent ) ) { + ?> + + $post->post_parent, + 'media[]' => $post->ID, + '_wpnonce' => wp_create_nonce( 'bulk-' . $this->_args['plural'] ), + ), + 'upload.php' + ); + printf( + '
        %s', + $detach_url, + /* translators: %s: Title of the post the attachment is attached to. */ + esc_attr( sprintf( __( 'Detach from “%s”' ), $title ) ), + __( 'Detach' ) + ); + endif; + } else { + _e( '(Unattached)' ); + ?> + post_parent ); + printf( + '
        %s', + $post->ID, + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'Attach “%s” to existing content' ), $title ) ), + __( 'Attach' ) + ); + } + } + } + + /** + * Handles the comments column output. + * + * @since 4.3.0 + * + * @param WP_Post $post The current WP_Post object. + */ + public function column_comments( $post ) { + echo '
        '; + + if ( isset( $this->comment_pending_count[ $post->ID ] ) ) { + $pending_comments = $this->comment_pending_count[ $post->ID ]; + } else { + $pending_comments = get_pending_comments_num( $post->ID ); + } + + $this->comments_bubble( $post->ID, $pending_comments ); + + echo '
        '; + } + + /** + * Handles output for the default column. + * + * @since 4.3.0 + * + * @param WP_Post $post The current WP_Post object. + * @param string $column_name Current column name. + */ + public function column_default( $post, $column_name ) { + if ( 'categories' === $column_name ) { + $taxonomy = 'category'; + } elseif ( 'tags' === $column_name ) { + $taxonomy = 'post_tag'; + } elseif ( 0 === strpos( $column_name, 'taxonomy-' ) ) { + $taxonomy = substr( $column_name, 9 ); + } else { + $taxonomy = false; + } + + if ( $taxonomy ) { + $terms = get_the_terms( $post->ID, $taxonomy ); + if ( is_array( $terms ) ) { + $out = array(); + foreach ( $terms as $t ) { + $posts_in_term_qv = array(); + $posts_in_term_qv['taxonomy'] = $taxonomy; + $posts_in_term_qv['term'] = $t->slug; + + $out[] = sprintf( + '%s', + esc_url( add_query_arg( $posts_in_term_qv, 'upload.php' ) ), + esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) ) + ); + } + /* translators: Used between list items, there is a space after the comma. */ + echo join( __( ', ' ), $out ); + } else { + echo '' . get_taxonomy( $taxonomy )->labels->no_terms . ''; + } + + return; + } + + /** + * Fires for each custom column in the Media list table. + * + * Custom columns are registered using the {@see 'manage_media_columns'} filter. + * + * @since 2.5.0 + * + * @param string $column_name Name of the custom column. + * @param int $post_id Attachment ID. + */ + do_action( 'manage_media_custom_column', $column_name, $post->ID ); + } + + /** + * @global WP_Post $post Global post object. + */ + public function display_rows() { + global $post, $wp_query; + + $post_ids = wp_list_pluck( $wp_query->posts, 'ID' ); + reset( $wp_query->posts ); + + $this->comment_pending_count = get_pending_comments_num( $post_ids ); + + add_filter( 'the_title', 'esc_html' ); + + while ( have_posts() ) : + the_post(); + if ( + ( $this->is_trash && 'trash' !== $post->post_status ) + || ( ! $this->is_trash && 'trash' === $post->post_status ) + ) { + continue; + } + $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other'; + ?> + + single_row_columns( $post ); ?> + + detached ) { + if ( current_user_can( 'edit_post', $post->ID ) ) { + $actions['edit'] = sprintf( + '%s', + get_edit_post_link( $post->ID ), + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ), + __( 'Edit' ) + ); + } + if ( current_user_can( 'delete_post', $post->ID ) ) { + if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) { + $actions['trash'] = sprintf( + '%s', + wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-post_' . $post->ID ), + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'Move “%s” to the Trash' ), $att_title ) ), + _x( 'Trash', 'verb' ) + ); + } else { + $delete_ays = ! MEDIA_TRASH ? " onclick='return showNotice.warn();'" : ''; + $actions['delete'] = sprintf( + '%s', + wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-post_' . $post->ID ), + $delete_ays, + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'Delete “%s” permanently' ), $att_title ) ), + __( 'Delete Permanently' ) + ); + } + } + $actions['view'] = sprintf( + '%s', + get_permalink( $post->ID ), + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ), + __( 'View' ) + ); + + if ( current_user_can( 'edit_post', $post->ID ) ) { + $actions['attach'] = sprintf( + '%s', + $post->ID, + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'Attach “%s” to existing content' ), $att_title ) ), + __( 'Attach' ) + ); + } + } else { + if ( current_user_can( 'edit_post', $post->ID ) && ! $this->is_trash ) { + $actions['edit'] = sprintf( + '%s', + get_edit_post_link( $post->ID ), + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'Edit “%s”' ), $att_title ) ), + __( 'Edit' ) + ); + } + if ( current_user_can( 'delete_post', $post->ID ) ) { + if ( $this->is_trash ) { + $actions['untrash'] = sprintf( + '%s', + wp_nonce_url( "post.php?action=untrash&post=$post->ID", 'untrash-post_' . $post->ID ), + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'Restore “%s” from the Trash' ), $att_title ) ), + __( 'Restore' ) + ); + } elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) { + $actions['trash'] = sprintf( + '%s', + wp_nonce_url( "post.php?action=trash&post=$post->ID", 'trash-post_' . $post->ID ), + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'Move “%s” to the Trash' ), $att_title ) ), + _x( 'Trash', 'verb' ) + ); + } + if ( $this->is_trash || ! EMPTY_TRASH_DAYS || ! MEDIA_TRASH ) { + $delete_ays = ( ! $this->is_trash && ! MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : ''; + $actions['delete'] = sprintf( + '%s', + wp_nonce_url( "post.php?action=delete&post=$post->ID", 'delete-post_' . $post->ID ), + $delete_ays, + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'Delete “%s” permanently' ), $att_title ) ), + __( 'Delete Permanently' ) + ); + } + } + if ( ! $this->is_trash ) { + $actions['view'] = sprintf( + '%s', + get_permalink( $post->ID ), + /* translators: %s: Attachment title. */ + esc_attr( sprintf( __( 'View “%s”' ), $att_title ) ), + __( 'View' ) + ); + } + } + + /** + * Filters the action links for each attachment in the Media list table. + * + * @since 2.8.0 + * + * @param string[] $actions An array of action links for each attachment. + * Default 'Edit', 'Delete Permanently', 'View'. + * @param WP_Post $post WP_Post object for the current attachment. + * @param bool $detached Whether the list table contains media not attached + * to any posts. Default true. + */ + return apply_filters( 'media_row_actions', $actions, $post, $this->detached ); + } + + /** + * Generates and displays row action links. + * + * @since 4.3.0 + * + * @param object $post Attachment being acted upon. + * @param string $column_name Current column name. + * @param string $primary Primary column name. + * @return string Row actions output for media attachments, or an empty string + * if the current column is not the primary column. + */ + protected function handle_row_actions( $post, $column_name, $primary ) { + if ( $primary !== $column_name ) { + return ''; + } + + $att_title = _draft_or_post_title(); + + return $this->row_actions( $this->_get_row_actions( $post, $att_title ) ); + } +} diff --git a/wp-admin/includes/class-wp-ms-sites-list-table.php b/wp-admin/includes/class-wp-ms-sites-list-table.php new file mode 100644 index 0000000..995a733 --- /dev/null +++ b/wp-admin/includes/class-wp-ms-sites-list-table.php @@ -0,0 +1,740 @@ +status_list = array( + 'archived' => array( 'site-archived', __( 'Archived' ) ), + 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ), + 'deleted' => array( 'site-deleted', __( 'Deleted' ) ), + 'mature' => array( 'site-mature', __( 'Mature' ) ), + ); + + parent::__construct( + array( + 'plural' => 'sites', + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ) + ); + } + + /** + * @return bool + */ + public function ajax_user_can() { + return current_user_can( 'manage_sites' ); + } + + /** + * Prepares the list of sites for display. + * + * @since 3.1.0 + * + * @global string $s + * @global string $mode + * @global wpdb $wpdb WordPress database abstraction object. + */ + public function prepare_items() { + global $s, $mode, $wpdb; + + if ( ! empty( $_REQUEST['mode'] ) ) { + $mode = 'excerpt' === $_REQUEST['mode'] ? 'excerpt' : 'list'; + set_user_setting( 'sites_list_mode', $mode ); + } else { + $mode = get_user_setting( 'sites_list_mode', 'list' ); + } + + $per_page = $this->get_items_per_page( 'sites_network_per_page' ); + + $pagenum = $this->get_pagenum(); + + $s = isset( $_REQUEST['s'] ) ? wp_unslash( trim( $_REQUEST['s'] ) ) : ''; + $wild = ''; + if ( false !== strpos( $s, '*' ) ) { + $wild = '*'; + $s = trim( $s, '*' ); + } + + /* + * If the network is large and a search is not being performed, show only + * the latest sites with no paging in order to avoid expensive count queries. + */ + if ( ! $s && wp_is_large_network() ) { + if ( ! isset( $_REQUEST['orderby'] ) ) { + $_GET['orderby'] = ''; + $_REQUEST['orderby'] = ''; + } + if ( ! isset( $_REQUEST['order'] ) ) { + $_GET['order'] = 'DESC'; + $_REQUEST['order'] = 'DESC'; + } + } + + $args = array( + 'number' => intval( $per_page ), + 'offset' => intval( ( $pagenum - 1 ) * $per_page ), + 'network_id' => get_current_network_id(), + ); + + if ( empty( $s ) ) { + // Nothing to do. + } elseif ( preg_match( '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $s ) || + preg_match( '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.?$/', $s ) || + preg_match( '/^[0-9]{1,3}\.[0-9]{1,3}\.?$/', $s ) || + preg_match( '/^[0-9]{1,3}\.$/', $s ) ) { + // IPv4 address. + $sql = $wpdb->prepare( "SELECT blog_id FROM {$wpdb->registration_log} WHERE {$wpdb->registration_log}.IP LIKE %s", $wpdb->esc_like( $s ) . ( ! empty( $wild ) ? '%' : '' ) ); + $reg_blog_ids = $wpdb->get_col( $sql ); + + if ( $reg_blog_ids ) { + $args['site__in'] = $reg_blog_ids; + } + } elseif ( is_numeric( $s ) && empty( $wild ) ) { + $args['ID'] = $s; + } else { + $args['search'] = $s; + + if ( ! is_subdomain_install() ) { + $args['search_columns'] = array( 'path' ); + } + } + + $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : ''; + if ( 'registered' === $order_by ) { + // 'registered' is a valid field name. + } elseif ( 'lastupdated' === $order_by ) { + $order_by = 'last_updated'; + } elseif ( 'blogname' === $order_by ) { + if ( is_subdomain_install() ) { + $order_by = 'domain'; + } else { + $order_by = 'path'; + } + } elseif ( 'blog_id' === $order_by ) { + $order_by = 'id'; + } elseif ( ! $order_by ) { + $order_by = false; + } + + $args['orderby'] = $order_by; + + if ( $order_by ) { + $args['order'] = ( isset( $_REQUEST['order'] ) && 'DESC' === strtoupper( $_REQUEST['order'] ) ) ? 'DESC' : 'ASC'; + } + + if ( wp_is_large_network() ) { + $args['no_found_rows'] = true; + } else { + $args['no_found_rows'] = false; + } + + // Take into account the role the user has selected. + $status = isset( $_REQUEST['status'] ) ? wp_unslash( trim( $_REQUEST['status'] ) ) : ''; + if ( in_array( $status, array( 'public', 'archived', 'mature', 'spam', 'deleted' ), true ) ) { + $args[ $status ] = 1; + } + + /** + * Filters the arguments for the site query in the sites list table. + * + * @since 4.6.0 + * + * @param array $args An array of get_sites() arguments. + */ + $args = apply_filters( 'ms_sites_list_table_query_args', $args ); + + $_sites = get_sites( $args ); + if ( is_array( $_sites ) ) { + update_site_cache( $_sites ); + + $this->items = array_slice( $_sites, 0, $per_page ); + } + + $total_sites = get_sites( + array_merge( + $args, + array( + 'count' => true, + 'offset' => 0, + 'number' => 0, + ) + ) + ); + + $this->set_pagination_args( + array( + 'total_items' => $total_sites, + 'per_page' => $per_page, + ) + ); + } + + /** + */ + public function no_items() { + _e( 'No sites found.' ); + } + + /** + * Gets links to filter sites by status. + * + * @since 5.3.0 + * + * @return array + * + */ + protected function get_views() { + $counts = wp_count_sites(); + + $statuses = array( + /* translators: %s: Number of sites. */ + 'all' => _nx_noop( + 'All (%s)', + 'All (%s)', + 'sites' + ), + + /* translators: %s: Number of sites. */ + 'public' => _n_noop( + 'Public (%s)', + 'Public (%s)' + ), + + /* translators: %s: Number of sites. */ + 'archived' => _n_noop( + 'Archived (%s)', + 'Archived (%s)' + ), + + /* translators: %s: Number of sites. */ + 'mature' => _n_noop( + 'Mature (%s)', + 'Mature (%s)' + ), + + /* translators: %s: Number of sites. */ + 'spam' => _nx_noop( + 'Spam (%s)', + 'Spam (%s)', + 'sites' + ), + + /* translators: %s: Number of sites. */ + 'deleted' => _n_noop( + 'Deleted (%s)', + 'Deleted (%s)' + ), + ); + + $view_links = array(); + $requested_status = isset( $_REQUEST['status'] ) ? wp_unslash( trim( $_REQUEST['status'] ) ) : ''; + $url = 'sites.php'; + + foreach ( $statuses as $status => $label_count ) { + $current_link_attributes = $requested_status === $status || ( '' === $requested_status && 'all' === $status ) + ? ' class="current" aria-current="page"' + : ''; + if ( (int) $counts[ $status ] > 0 ) { + $label = sprintf( translate_nooped_plural( $label_count, $counts[ $status ] ), number_format_i18n( $counts[ $status ] ) ); + $full_url = 'all' === $status ? $url : add_query_arg( 'status', $status, $url ); + + $view_links[ $status ] = sprintf( + '%3$s', + esc_url( $full_url ), + $current_link_attributes, + $label + ); + } + } + + return $view_links; + } + + /** + * @return array + */ + protected function get_bulk_actions() { + $actions = array(); + if ( current_user_can( 'delete_sites' ) ) { + $actions['delete'] = __( 'Delete' ); + } + $actions['spam'] = _x( 'Mark as Spam', 'site' ); + $actions['notspam'] = _x( 'Not Spam', 'site' ); + + return $actions; + } + + /** + * @global string $mode List table view mode. + * + * @param string $which The location of the pagination nav markup: 'top' or 'bottom'. + */ + protected function pagination( $which ) { + global $mode; + + parent::pagination( $which ); + + if ( 'top' === $which ) { + $this->view_switcher( $mode ); + } + } + + /** + * Extra controls to be displayed between bulk actions and pagination. + * + * @since 5.3.0 + * + * @param string $which The location of the extra table nav markup: 'top' or 'bottom'. + */ + protected function extra_tablenav( $which ) { + ?> +
        + 'site-query-submit' ) ); + } + } + ?> +
        + '', + 'blogname' => __( 'URL' ), + 'lastupdated' => __( 'Last Updated' ), + 'registered' => _x( 'Registered', 'site' ), + 'users' => __( 'Users' ), + ); + + if ( has_filter( 'wpmublogsaction' ) ) { + $sites_columns['plugins'] = __( 'Actions' ); + } + + /** + * Filters the displayed site columns in Sites list table. + * + * @since MU (3.0.0) + * + * @param string[] $sites_columns An array of displayed site columns. Default 'cb', + * 'blogname', 'lastupdated', 'registered', 'users'. + */ + return apply_filters( 'wpmu_blogs_columns', $sites_columns ); + } + + /** + * @return array + */ + protected function get_sortable_columns() { + return array( + 'blogname' => 'blogname', + 'lastupdated' => 'lastupdated', + 'registered' => 'blog_id', + ); + } + + /** + * Handles the checkbox column output. + * + * @since 4.3.0 + * + * @param array $blog Current site. + */ + public function column_cb( $blog ) { + if ( ! is_main_site( $blog['blog_id'] ) ) : + $blogname = untrailingslashit( $blog['domain'] . $blog['path'] ); + ?> + + + + + + site_states( $blog ); ?> + + '; + printf( + /* translators: 1: Site title, 2: Site tagline. */ + __( '%1$s – %2$s' ), + get_option( 'blogname' ), + '' . get_option( 'blogdescription' ) . '' + ); + echo '

        '; + restore_current_blog(); + } + } + + /** + * Handles the lastupdated column output. + * + * @since 4.3.0 + * + * @global string $mode List table view mode. + * + * @param array $blog Current site. + */ + public function column_lastupdated( $blog ) { + global $mode; + + if ( 'list' === $mode ) { + $date = __( 'Y/m/d' ); + } else { + $date = __( 'Y/m/d g:i:s a' ); + } + + echo ( '0000-00-00 00:00:00' === $blog['last_updated'] ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); + } + + /** + * Handles the registered column output. + * + * @since 4.3.0 + * + * @global string $mode List table view mode. + * + * @param array $blog Current site. + */ + public function column_registered( $blog ) { + global $mode; + + if ( 'list' === $mode ) { + $date = __( 'Y/m/d' ); + } else { + $date = __( 'Y/m/d g:i:s a' ); + } + + if ( '0000-00-00 00:00:00' === $blog['registered'] ) { + echo '—'; + } else { + echo mysql2date( $date, $blog['registered'] ); + } + } + + /** + * Handles the users column output. + * + * @since 4.3.0 + * + * @param array $blog Current site. + */ + public function column_users( $blog ) { + $user_count = wp_cache_get( $blog['blog_id'] . '_user_count', 'blog-details' ); + if ( ! $user_count ) { + $blog_users = new WP_User_Query( + array( + 'blog_id' => $blog['blog_id'], + 'fields' => 'ID', + 'number' => 1, + 'count_total' => true, + ) + ); + $user_count = $blog_users->get_total(); + wp_cache_set( $blog['blog_id'] . '_user_count', $user_count, 'blog-details', 12 * HOUR_IN_SECONDS ); + } + + printf( + '%s', + esc_url( network_admin_url( 'site-users.php?id=' . $blog['blog_id'] ) ), + number_format_i18n( $user_count ) + ); + } + + /** + * Handles the plugins column output. + * + * @since 4.3.0 + * + * @param array $blog Current site. + */ + public function column_plugins( $blog ) { + if ( has_filter( 'wpmublogsaction' ) ) { + /** + * Fires inside the auxiliary 'Actions' column of the Sites list table. + * + * By default this column is hidden unless something is hooked to the action. + * + * @since MU (3.0.0) + * + * @param int $blog_id The site ID. + */ + do_action( 'wpmublogsaction', $blog['blog_id'] ); + } + } + + /** + * Handles output for the default column. + * + * @since 4.3.0 + * + * @param array $blog Current site. + * @param string $column_name Current column name. + */ + public function column_default( $blog, $column_name ) { + /** + * Fires for each registered custom column in the Sites list table. + * + * @since 3.1.0 + * + * @param string $column_name The name of the column to display. + * @param int $blog_id The site ID. + */ + do_action( 'manage_sites_custom_column', $column_name, $blog['blog_id'] ); + } + + /** + * @global string $mode + */ + public function display_rows() { + foreach ( $this->items as $blog ) { + $blog = $blog->to_array(); + $class = ''; + reset( $this->status_list ); + + foreach ( $this->status_list as $status => $col ) { + if ( 1 == $blog[ $status ] ) { + $class = " class='{$col[0]}'"; + } + } + + echo ""; + + $this->single_row_columns( $blog ); + + echo ''; + } + } + + /** + * Maybe output comma-separated site states. + * + * @since 5.3.0 + * + * @param array $site + */ + protected function site_states( $site ) { + $site_states = array(); + + // $site is still an array, so get the object. + $_site = WP_Site::get_instance( $site['blog_id'] ); + + if ( is_main_site( $_site->id ) ) { + $site_states['main'] = __( 'Main' ); + } + + reset( $this->status_list ); + + $site_status = isset( $_REQUEST['status'] ) ? wp_unslash( trim( $_REQUEST['status'] ) ) : ''; + foreach ( $this->status_list as $status => $col ) { + if ( ( 1 === intval( $_site->{$status} ) ) && ( $site_status !== $status ) ) { + $site_states[ $col[0] ] = $col[1]; + } + } + + /** + * Filter the default site display states for items in the Sites list table. + * + * @since 5.3.0 + * + * @param array $site_states An array of site states. Default 'Main', + * 'Archived', 'Mature', 'Spam', 'Deleted'. + * @param WP_Site $site The current site object. + */ + $site_states = apply_filters( 'display_site_states', $site_states, $_site ); + + if ( ! empty( $site_states ) ) { + $state_count = count( $site_states ); + $i = 0; + echo ' — '; + foreach ( $site_states as $state ) { + ++$i; + ( $i == $state_count ) ? $sep = '' : $sep = ', '; + echo "{$state}{$sep}"; + } + } + } + + /** + * Gets the name of the default primary column. + * + * @since 4.3.0 + * + * @return string Name of the default primary column, in this case, 'blogname'. + */ + protected function get_default_primary_column_name() { + return 'blogname'; + } + + /** + * Generates and displays row action links. + * + * @since 4.3.0 + * + * @param object $blog Site being acted upon. + * @param string $column_name Current column name. + * @param string $primary Primary column name. + * @return string Row actions output for sites in Multisite, or an empty string + * if the current column is not the primary column. + */ + protected function handle_row_actions( $blog, $column_name, $primary ) { + if ( $primary !== $column_name ) { + return ''; + } + + $blogname = untrailingslashit( $blog['domain'] . $blog['path'] ); + + // Preordered. + $actions = array( + 'edit' => '', + 'backend' => '', + 'activate' => '', + 'deactivate' => '', + 'archive' => '', + 'unarchive' => '', + 'spam' => '', + 'unspam' => '', + 'delete' => '', + 'visit' => '', + ); + + $actions['edit'] = '' . __( 'Edit' ) . ''; + $actions['backend'] = "" . __( 'Dashboard' ) . ''; + if ( get_network()->site_id != $blog['blog_id'] ) { + if ( '1' == $blog['deleted'] ) { + $actions['activate'] = '' . __( 'Activate' ) . ''; + } else { + $actions['deactivate'] = '' . __( 'Deactivate' ) . ''; + } + + if ( '1' == $blog['archived'] ) { + $actions['unarchive'] = '' . __( 'Unarchive' ) . ''; + } else { + $actions['archive'] = '' . _x( 'Archive', 'verb; site' ) . ''; + } + + if ( '1' == $blog['spam'] ) { + $actions['unspam'] = '' . _x( 'Not Spam', 'site' ) . ''; + } else { + $actions['spam'] = '' . _x( 'Spam', 'site' ) . ''; + } + + if ( current_user_can( 'delete_site', $blog['blog_id'] ) ) { + $actions['delete'] = '' . __( 'Delete' ) . ''; + } + } + + $actions['visit'] = "" . __( 'Visit' ) . ''; + + /** + * Filters the action links displayed for each site in the Sites list table. + * + * The 'Edit', 'Dashboard', 'Delete', and 'Visit' links are displayed by + * default for each site. The site's status determines whether to show the + * 'Activate' or 'Deactivate' link, 'Unarchive' or 'Archive' links, and + * 'Not Spam' or 'Spam' link for each site. + * + * @since 3.1.0 + * + * @param string[] $actions An array of action links to be displayed. + * @param int $blog_id The site ID. + * @param string $blogname Site path, formatted depending on whether it is a sub-domain + * or subdirectory multisite installation. + */ + $actions = apply_filters( 'manage_sites_action_links', array_filter( $actions ), $blog['blog_id'], $blogname ); + + return $this->row_actions( $actions ); + } +} diff --git a/wp-admin/includes/class-wp-ms-themes-list-table.php b/wp-admin/includes/class-wp-ms-themes-list-table.php new file mode 100644 index 0000000..6cce714 --- /dev/null +++ b/wp-admin/includes/class-wp-ms-themes-list-table.php @@ -0,0 +1,797 @@ + 'themes', + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ) + ); + + $status = isset( $_REQUEST['theme_status'] ) ? $_REQUEST['theme_status'] : 'all'; + if ( ! in_array( $status, array( 'all', 'enabled', 'disabled', 'upgrade', 'search', 'broken' ) ) ) { + $status = 'all'; + } + + $page = $this->get_pagenum(); + + $this->is_site_themes = ( 'site-themes-network' === $this->screen->id ) ? true : false; + + if ( $this->is_site_themes ) { + $this->site_id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; + } + } + + /** + * @return array + */ + protected function get_table_classes() { + // @todo Remove and add CSS for .themes. + return array( 'widefat', 'plugins' ); + } + + /** + * @return bool + */ + public function ajax_user_can() { + if ( $this->is_site_themes ) { + return current_user_can( 'manage_sites' ); + } else { + return current_user_can( 'manage_network_themes' ); + } + } + + /** + * @global string $status + * @global array $totals + * @global int $page + * @global string $orderby + * @global string $order + * @global string $s + */ + public function prepare_items() { + global $status, $totals, $page, $orderby, $order, $s; + + wp_reset_vars( array( 'orderby', 'order', 's' ) ); + + $themes = array( + /** + * Filters the full array of WP_Theme objects to list in the Multisite + * themes list table. + * + * @since 3.1.0 + * + * @param WP_Theme[] $all Array of WP_Theme objects to display in the list table. + */ + 'all' => apply_filters( 'all_themes', wp_get_themes() ), + 'search' => array(), + 'enabled' => array(), + 'disabled' => array(), + 'upgrade' => array(), + 'broken' => $this->is_site_themes ? array() : wp_get_themes( array( 'errors' => true ) ), + ); + + if ( $this->is_site_themes ) { + $themes_per_page = $this->get_items_per_page( 'site_themes_network_per_page' ); + $allowed_where = 'site'; + } else { + $themes_per_page = $this->get_items_per_page( 'themes_network_per_page' ); + $allowed_where = 'network'; + } + + $current = get_site_transient( 'update_themes' ); + $maybe_update = current_user_can( 'update_themes' ) && ! $this->is_site_themes && $current; + + foreach ( (array) $themes['all'] as $key => $theme ) { + if ( $this->is_site_themes && $theme->is_allowed( 'network' ) ) { + unset( $themes['all'][ $key ] ); + continue; + } + + if ( $maybe_update && isset( $current->response[ $key ] ) ) { + $themes['all'][ $key ]->update = true; + $themes['upgrade'][ $key ] = $themes['all'][ $key ]; + } + + $filter = $theme->is_allowed( $allowed_where, $this->site_id ) ? 'enabled' : 'disabled'; + $themes[ $filter ][ $key ] = $themes['all'][ $key ]; + } + + if ( $s ) { + $status = 'search'; + $themes['search'] = array_filter( array_merge( $themes['all'], $themes['broken'] ), array( $this, '_search_callback' ) ); + } + + $totals = array(); + foreach ( $themes as $type => $list ) { + $totals[ $type ] = count( $list ); + } + + if ( empty( $themes[ $status ] ) && ! in_array( $status, array( 'all', 'search' ) ) ) { + $status = 'all'; + } + + $this->items = $themes[ $status ]; + WP_Theme::sort_by_name( $this->items ); + + $this->has_items = ! empty( $themes['all'] ); + $total_this_page = $totals[ $status ]; + + wp_localize_script( + 'updates', + '_wpUpdatesItemCounts', + array( + 'themes' => $totals, + 'totals' => wp_get_update_data(), + ) + ); + + if ( $orderby ) { + $orderby = ucfirst( $orderby ); + $order = strtoupper( $order ); + + if ( 'Name' === $orderby ) { + if ( 'ASC' === $order ) { + $this->items = array_reverse( $this->items ); + } + } else { + uasort( $this->items, array( $this, '_order_callback' ) ); + } + } + + $start = ( $page - 1 ) * $themes_per_page; + + if ( $total_this_page > $themes_per_page ) { + $this->items = array_slice( $this->items, $start, $themes_per_page, true ); + } + + $this->set_pagination_args( + array( + 'total_items' => $total_this_page, + 'per_page' => $themes_per_page, + ) + ); + } + + /** + * @staticvar string $term + * @param WP_Theme $theme + * @return bool + */ + public function _search_callback( $theme ) { + static $term = null; + if ( is_null( $term ) ) { + $term = wp_unslash( $_REQUEST['s'] ); + } + + foreach ( array( 'Name', 'Description', 'Author', 'Author', 'AuthorURI' ) as $field ) { + // Don't mark up; Do translate. + if ( false !== stripos( $theme->display( $field, false, true ), $term ) ) { + return true; + } + } + + if ( false !== stripos( $theme->get_stylesheet(), $term ) ) { + return true; + } + + if ( false !== stripos( $theme->get_template(), $term ) ) { + return true; + } + + return false; + } + + // Not used by any core columns. + /** + * @global string $orderby + * @global string $order + * @param array $theme_a + * @param array $theme_b + * @return int + */ + public function _order_callback( $theme_a, $theme_b ) { + global $orderby, $order; + + $a = $theme_a[ $orderby ]; + $b = $theme_b[ $orderby ]; + + if ( $a == $b ) { + return 0; + } + + if ( 'DESC' === $order ) { + return ( $a < $b ) ? 1 : -1; + } else { + return ( $a < $b ) ? -1 : 1; + } + } + + /** + */ + public function no_items() { + if ( $this->has_items ) { + _e( 'No themes found.' ); + } else { + _e( 'You do not appear to have any themes available at this time.' ); + } + } + + /** + * @return array + */ + public function get_columns() { + return array( + 'cb' => '', + 'name' => __( 'Theme' ), + 'description' => __( 'Description' ), + ); + } + + /** + * @return array + */ + protected function get_sortable_columns() { + return array( + 'name' => 'name', + ); + } + + /** + * Gets the name of the primary column. + * + * @since 4.3.0 + * + * @return string Unalterable name of the primary column name, in this case, 'name'. + */ + protected function get_primary_column_name() { + return 'name'; + } + + /** + * @global array $totals + * @global string $status + * @return array + */ + protected function get_views() { + global $totals, $status; + + $status_links = array(); + foreach ( $totals as $type => $count ) { + if ( ! $count ) { + continue; + } + + switch ( $type ) { + case 'all': + /* translators: %s: Number of themes. */ + $text = _nx( + 'All (%s)', + 'All (%s)', + $count, + 'themes' + ); + break; + case 'enabled': + /* translators: %s: Number of themes. */ + $text = _nx( + 'Enabled (%s)', + 'Enabled (%s)', + $count, + 'themes' + ); + break; + case 'disabled': + /* translators: %s: Number of themes. */ + $text = _nx( + 'Disabled (%s)', + 'Disabled (%s)', + $count, + 'themes' + ); + break; + case 'upgrade': + /* translators: %s: Number of themes. */ + $text = _nx( + 'Update Available (%s)', + 'Update Available (%s)', + $count, + 'themes' + ); + break; + case 'broken': + /* translators: %s: Number of themes. */ + $text = _nx( + 'Broken (%s)', + 'Broken (%s)', + $count, + 'themes' + ); + break; + } + + if ( $this->is_site_themes ) { + $url = 'site-themes.php?id=' . $this->site_id; + } else { + $url = 'themes.php'; + } + + if ( 'search' != $type ) { + $status_links[ $type ] = sprintf( + "%s", + esc_url( add_query_arg( 'theme_status', $type, $url ) ), + ( $type === $status ) ? ' class="current" aria-current="page"' : '', + sprintf( $text, number_format_i18n( $count ) ) + ); + } + } + + return $status_links; + } + + /** + * @global string $status + * + * @return array + */ + protected function get_bulk_actions() { + global $status; + + $actions = array(); + if ( 'enabled' != $status ) { + $actions['enable-selected'] = $this->is_site_themes ? __( 'Enable' ) : __( 'Network Enable' ); + } + if ( 'disabled' != $status ) { + $actions['disable-selected'] = $this->is_site_themes ? __( 'Disable' ) : __( 'Network Disable' ); + } + if ( ! $this->is_site_themes ) { + if ( current_user_can( 'update_themes' ) ) { + $actions['update-selected'] = __( 'Update' ); + } + if ( current_user_can( 'delete_themes' ) ) { + $actions['delete-selected'] = __( 'Delete' ); + } + } + return $actions; + } + + /** + */ + public function display_rows() { + foreach ( $this->items as $theme ) { + $this->single_row( $theme ); + } + } + + /** + * Handles the checkbox column output. + * + * @since 4.3.0 + * + * @param WP_Theme $theme The current WP_Theme object. + */ + public function column_cb( $theme ) { + $checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) ); + ?> + + + is_site_themes ) { + $url = "site-themes.php?id={$this->site_id}&"; + $allowed = $theme->is_allowed( 'site', $this->site_id ); + } else { + $url = 'themes.php?'; + $allowed = $theme->is_allowed( 'network' ); + } + + // Pre-order. + $actions = array( + 'enable' => '', + 'disable' => '', + 'delete' => '', + ); + + $stylesheet = $theme->get_stylesheet(); + $theme_key = urlencode( $stylesheet ); + + if ( ! $allowed ) { + if ( ! $theme->errors() ) { + $url = add_query_arg( + array( + 'action' => 'enable', + 'theme' => $theme_key, + 'paged' => $page, + 's' => $s, + ), + $url + ); + + if ( $this->is_site_themes ) { + /* translators: %s: Theme name. */ + $aria_label = sprintf( __( 'Enable %s' ), $theme->display( 'Name' ) ); + } else { + /* translators: %s: Theme name. */ + $aria_label = sprintf( __( 'Network Enable %s' ), $theme->display( 'Name' ) ); + } + + $actions['enable'] = sprintf( + '%s', + esc_url( wp_nonce_url( $url, 'enable-theme_' . $stylesheet ) ), + esc_attr( $aria_label ), + ( $this->is_site_themes ? __( 'Enable' ) : __( 'Network Enable' ) ) + ); + } + } else { + $url = add_query_arg( + array( + 'action' => 'disable', + 'theme' => $theme_key, + 'paged' => $page, + 's' => $s, + ), + $url + ); + + if ( $this->is_site_themes ) { + /* translators: %s: Theme name. */ + $aria_label = sprintf( __( 'Disable %s' ), $theme->display( 'Name' ) ); + } else { + /* translators: %s: Theme name. */ + $aria_label = sprintf( __( 'Network Disable %s' ), $theme->display( 'Name' ) ); + } + + $actions['disable'] = sprintf( + '%s', + esc_url( wp_nonce_url( $url, 'disable-theme_' . $stylesheet ) ), + esc_attr( $aria_label ), + ( $this->is_site_themes ? __( 'Disable' ) : __( 'Network Disable' ) ) + ); + } + + if ( ! $allowed && current_user_can( 'delete_themes' ) && ! $this->is_site_themes && get_option( 'stylesheet' ) !== $stylesheet && get_option( 'template' ) !== $stylesheet ) { + $url = add_query_arg( + array( + 'action' => 'delete-selected', + 'checked[]' => $theme_key, + 'theme_status' => $context, + 'paged' => $page, + 's' => $s, + ), + 'themes.php' + ); + + /* translators: %s: Theme name. */ + $aria_label = sprintf( _x( 'Delete %s', 'theme' ), $theme->display( 'Name' ) ); + + $actions['delete'] = sprintf( + '%s', + esc_url( wp_nonce_url( $url, 'bulk-themes' ) ), + esc_attr( $aria_label ), + __( 'Delete' ) + ); + } + /** + * Filters the action links displayed for each theme in the Multisite + * themes list table. + * + * The action links displayed are determined by the theme's status, and + * which Multisite themes list table is being displayed - the Network + * themes list table (themes.php), which displays all installed themes, + * or the Site themes list table (site-themes.php), which displays the + * non-network enabled themes when editing a site in the Network admin. + * + * The default action links for the Network themes list table include + * 'Network Enable', 'Network Disable', and 'Delete'. + * + * The default action links for the Site themes list table include + * 'Enable', and 'Disable'. + * + * @since 2.8.0 + * + * @param string[] $actions An array of action links. + * @param WP_Theme $theme The current WP_Theme object. + * @param string $context Status of the theme, one of 'all', 'enabled', or 'disabled'. + */ + $actions = apply_filters( 'theme_action_links', array_filter( $actions ), $theme, $context ); + + /** + * Filters the action links of a specific theme in the Multisite themes + * list table. + * + * The dynamic portion of the hook name, `$stylesheet`, refers to the + * directory name of the theme, which in most cases is synonymous + * with the template name. + * + * @since 3.1.0 + * + * @param string[] $actions An array of action links. + * @param WP_Theme $theme The current WP_Theme object. + * @param string $context Status of the theme, one of 'all', 'enabled', or 'disabled'. + */ + $actions = apply_filters( "theme_action_links_{$stylesheet}", $actions, $theme, $context ); + + echo $this->row_actions( $actions, true ); + } + + /** + * Handles the description column output. + * + * @since 4.3.0 + * + * @global string $status + * @global array $totals + * + * @param WP_Theme $theme The current WP_Theme object. + */ + public function column_description( $theme ) { + global $status, $totals; + if ( $theme->errors() ) { + $pre = 'broken' === $status ? __( 'Broken Theme:' ) . ' ' : ''; + echo '

        ' . $pre . $theme->errors()->get_error_message() . '

        '; + } + + if ( $this->is_site_themes ) { + $allowed = $theme->is_allowed( 'site', $this->site_id ); + } else { + $allowed = $theme->is_allowed( 'network' ); + } + + $class = ! $allowed ? 'inactive' : 'active'; + if ( ! empty( $totals['upgrade'] ) && ! empty( $theme->update ) ) { + $class .= ' update'; + } + + echo "

        " . $theme->display( 'Description' ) . "

        +
        "; + + $stylesheet = $theme->get_stylesheet(); + $theme_meta = array(); + + if ( $theme->get( 'Version' ) ) { + /* translators: %s: Theme version. */ + $theme_meta[] = sprintf( __( 'Version %s' ), $theme->display( 'Version' ) ); + } + + /* translators: %s: Theme author. */ + $theme_meta[] = sprintf( __( 'By %s' ), $theme->display( 'Author' ) ); + + if ( $theme->get( 'ThemeURI' ) ) { + /* translators: %s: Theme name. */ + $aria_label = sprintf( __( 'Visit %s homepage' ), $theme->display( 'Name' ) ); + + $theme_meta[] = sprintf( + '%s', + $theme->display( 'ThemeURI' ), + esc_attr( $aria_label ), + __( 'Visit Theme Site' ) + ); + } + /** + * Filters the array of row meta for each theme in the Multisite themes + * list table. + * + * @since 3.1.0 + * + * @param string[] $theme_meta An array of the theme's metadata, + * including the version, author, and + * theme URI. + * @param string $stylesheet Directory name of the theme. + * @param WP_Theme $theme WP_Theme object. + * @param string $status Status of the theme. + */ + $theme_meta = apply_filters( 'theme_row_meta', $theme_meta, $stylesheet, $theme, $status ); + echo implode( ' | ', $theme_meta ); + + echo '
        '; + } + + /** + * Handles default column output. + * + * @since 4.3.0 + * + * @param WP_Theme $theme The current WP_Theme object. + * @param string $column_name The current column name. + */ + public function column_default( $theme, $column_name ) { + $stylesheet = $theme->get_stylesheet(); + + /** + * Fires inside each custom column of the Multisite themes list table. + * + * @since 3.1.0 + * + * @param string $column_name Name of the column. + * @param string $stylesheet Directory name of the theme. + * @param WP_Theme $theme Current WP_Theme object. + */ + do_action( 'manage_themes_custom_column', $column_name, $stylesheet, $theme ); + } + + /** + * Handles the output for a single table row. + * + * @since 4.3.0 + * + * @param WP_Theme $item The current WP_Theme object. + */ + public function single_row_columns( $item ) { + list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $extra_classes = ''; + if ( in_array( $column_name, $hidden ) ) { + $extra_classes .= ' hidden'; + } + + switch ( $column_name ) { + case 'cb': + echo ''; + + $this->column_cb( $item ); + + echo ''; + break; + + case 'name': + $active_theme_label = ''; + + /* The presence of the site_id property means that this is a subsite view and a label for the active theme needs to be added */ + if ( ! empty( $this->site_id ) ) { + $stylesheet = get_blog_option( $this->site_id, 'stylesheet' ); + $template = get_blog_option( $this->site_id, 'template' ); + + /* Add a label for the active template */ + if ( $item->get_template() === $template ) { + $active_theme_label = ' — ' . __( 'Active Theme' ); + } + + /* In case this is a child theme, label it properly */ + if ( $stylesheet !== $template && $item->get_stylesheet() === $stylesheet ) { + $active_theme_label = ' — ' . __( 'Active Child Theme' ); + } + } + + echo "" . $item->display( 'Name' ) . $active_theme_label . ''; + + $this->column_name( $item ); + + echo ''; + break; + + case 'description': + echo ""; + + $this->column_description( $item ); + + echo ''; + break; + + default: + echo ""; + + $this->column_default( $item, $column_name ); + + echo ''; + break; + } + } + } + + /** + * @global string $status + * @global array $totals + * + * @param WP_Theme $theme + */ + public function single_row( $theme ) { + global $status, $totals; + + if ( $this->is_site_themes ) { + $allowed = $theme->is_allowed( 'site', $this->site_id ); + } else { + $allowed = $theme->is_allowed( 'network' ); + } + + $stylesheet = $theme->get_stylesheet(); + + $class = ! $allowed ? 'inactive' : 'active'; + if ( ! empty( $totals['upgrade'] ) && ! empty( $theme->update ) ) { + $class .= ' update'; + } + + printf( + '', + esc_attr( $class ), + esc_attr( $stylesheet ) + ); + + $this->single_row_columns( $theme ); + + echo ''; + + if ( $this->is_site_themes ) { + remove_action( "after_theme_row_$stylesheet", 'wp_theme_update_row' ); + } + + /** + * Fires after each row in the Multisite themes list table. + * + * @since 3.1.0 + * + * @param string $stylesheet Directory name of the theme. + * @param WP_Theme $theme Current WP_Theme object. + * @param string $status Status of the theme. + */ + do_action( 'after_theme_row', $stylesheet, $theme, $status ); + + /** + * Fires after each specific row in the Multisite themes list table. + * + * The dynamic portion of the hook name, `$stylesheet`, refers to the + * directory name of the theme, most often synonymous with the template + * name of the theme. + * + * @since 3.5.0 + * + * @param string $stylesheet Directory name of the theme. + * @param WP_Theme $theme Current WP_Theme object. + * @param string $status Status of the theme. + */ + do_action( "after_theme_row_{$stylesheet}", $stylesheet, $theme, $status ); + } +} diff --git a/wp-admin/includes/class-wp-ms-users-list-table.php b/wp-admin/includes/class-wp-ms-users-list-table.php new file mode 100644 index 0000000..1a66738 --- /dev/null +++ b/wp-admin/includes/class-wp-ms-users-list-table.php @@ -0,0 +1,524 @@ +get_items_per_page( 'users_network_per_page' ); + + $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : ''; + + $paged = $this->get_pagenum(); + + $args = array( + 'number' => $users_per_page, + 'offset' => ( $paged - 1 ) * $users_per_page, + 'search' => $usersearch, + 'blog_id' => 0, + 'fields' => 'all_with_meta', + ); + + if ( wp_is_large_network( 'users' ) ) { + $args['search'] = ltrim( $args['search'], '*' ); + } elseif ( '' !== $args['search'] ) { + $args['search'] = trim( $args['search'], '*' ); + $args['search'] = '*' . $args['search'] . '*'; + } + + if ( 'super' === $role ) { + $args['login__in'] = get_super_admins(); + } + + /* + * If the network is large and a search is not being performed, + * show only the latest users with no paging in order to avoid + * expensive count queries. + */ + if ( ! $usersearch && wp_is_large_network( 'users' ) ) { + if ( ! isset( $_REQUEST['orderby'] ) ) { + $_GET['orderby'] = 'id'; + $_REQUEST['orderby'] = 'id'; + } + if ( ! isset( $_REQUEST['order'] ) ) { + $_GET['order'] = 'DESC'; + $_REQUEST['order'] = 'DESC'; + } + $args['count_total'] = false; + } + + if ( isset( $_REQUEST['orderby'] ) ) { + $args['orderby'] = $_REQUEST['orderby']; + } + + if ( isset( $_REQUEST['order'] ) ) { + $args['order'] = $_REQUEST['order']; + } + + if ( ! empty( $_REQUEST['mode'] ) ) { + $mode = 'excerpt' === $_REQUEST['mode'] ? 'excerpt' : 'list'; + set_user_setting( 'network_users_list_mode', $mode ); + } else { + $mode = get_user_setting( 'network_users_list_mode', 'list' ); + } + + /** This filter is documented in wp-admin/includes/class-wp-users-list-table.php */ + $args = apply_filters( 'users_list_table_query_args', $args ); + + // Query the user IDs for this page. + $wp_user_search = new WP_User_Query( $args ); + + $this->items = $wp_user_search->get_results(); + + $this->set_pagination_args( + array( + 'total_items' => $wp_user_search->get_total(), + 'per_page' => $users_per_page, + ) + ); + } + + /** + * @return array + */ + protected function get_bulk_actions() { + $actions = array(); + if ( current_user_can( 'delete_users' ) ) { + $actions['delete'] = __( 'Delete' ); + } + $actions['spam'] = _x( 'Mark as Spam', 'user' ); + $actions['notspam'] = _x( 'Not Spam', 'user' ); + + return $actions; + } + + /** + */ + public function no_items() { + _e( 'No users found.' ); + } + + /** + * @global string $role + * @return array + */ + protected function get_views() { + global $role; + + $total_users = get_user_count(); + $super_admins = get_super_admins(); + $total_admins = count( $super_admins ); + + $current_link_attributes = 'super' !== $role ? ' class="current" aria-current="page"' : ''; + $role_links = array(); + $role_links['all'] = sprintf( + '%s', + network_admin_url( 'users.php' ), + $current_link_attributes, + sprintf( + /* translators: Number of users. */ + _nx( + 'All (%s)', + 'All (%s)', + $total_users, + 'users' + ), + number_format_i18n( $total_users ) + ) + ); + $current_link_attributes = 'super' === $role ? ' class="current" aria-current="page"' : ''; + $role_links['super'] = sprintf( + '%s', + network_admin_url( 'users.php?role=super' ), + $current_link_attributes, + sprintf( + /* translators: Number of users. */ + _n( + 'Super Admin (%s)', + 'Super Admins (%s)', + $total_admins + ), + number_format_i18n( $total_admins ) + ) + ); + + return $role_links; + } + + /** + * @global string $mode List table view mode. + * + * @param string $which + */ + protected function pagination( $which ) { + global $mode; + + parent::pagination( $which ); + + if ( 'top' === $which ) { + $this->view_switcher( $mode ); + } + } + + /** + * @return array + */ + public function get_columns() { + $users_columns = array( + 'cb' => '', + 'username' => __( 'Username' ), + 'name' => __( 'Name' ), + 'email' => __( 'Email' ), + 'registered' => _x( 'Registered', 'user' ), + 'blogs' => __( 'Sites' ), + ); + /** + * Filters the columns displayed in the Network Admin Users list table. + * + * @since MU (3.0.0) + * + * @param string[] $users_columns An array of user columns. Default 'cb', 'username', + * 'name', 'email', 'registered', 'blogs'. + */ + return apply_filters( 'wpmu_users_columns', $users_columns ); + } + + /** + * @return array + */ + protected function get_sortable_columns() { + return array( + 'username' => 'login', + 'name' => 'name', + 'email' => 'email', + 'registered' => 'id', + ); + } + + /** + * Handles the checkbox column output. + * + * @since 4.3.0 + * + * @param WP_User $user The current WP_User object. + */ + public function column_cb( $user ) { + if ( is_super_admin( $user->ID ) ) { + return; + } + ?> + + + ID; + } + + /** + * Handles the username column output. + * + * @since 4.3.0 + * + * @param WP_User $user The current WP_User object. + */ + public function column_username( $user ) { + $super_admins = get_super_admins(); + $avatar = get_avatar( $user->user_email, 32 ); + + echo $avatar; + + if ( current_user_can( 'edit_user', $user->ID ) ) { + $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user->ID ) ) ); + $edit = "{$user->user_login}"; + } else { + $edit = $user->user_login; + } + + ?> + + user_login, $super_admins ) ) { + echo ' — ' . __( 'Super Admin' ); + } + ?> + + first_name && $user->last_name ) { + echo "$user->first_name $user->last_name"; + } elseif ( $user->first_name ) { + echo $user->first_name; + } elseif ( $user->last_name ) { + echo $user->last_name; + } else { + echo '' . _x( 'Unknown', 'name' ) . ''; + } + } + + /** + * Handles the email column output. + * + * @since 4.3.0 + * + * @param WP_User $user The current WP_User object. + */ + public function column_email( $user ) { + echo "$user->user_email"; + } + + /** + * Handles the registered date column output. + * + * @since 4.3.0 + * + * @global string $mode List table view mode. + * + * @param WP_User $user The current WP_User object. + */ + public function column_registered( $user ) { + global $mode; + if ( 'list' === $mode ) { + $date = __( 'Y/m/d' ); + } else { + $date = __( 'Y/m/d g:i:s a' ); + } + echo mysql2date( $date, $user->user_registered ); + } + + /** + * @since 4.3.0 + * + * @param WP_User $user + * @param string $classes + * @param string $data + * @param string $primary + */ + protected function _column_blogs( $user, $classes, $data, $primary ) { + echo ''; + echo $this->column_blogs( $user ); + echo $this->handle_row_actions( $user, 'blogs', $primary ); + echo ''; + } + + /** + * Handles the sites column output. + * + * @since 4.3.0 + * + * @param WP_User $user The current WP_User object. + */ + public function column_blogs( $user ) { + $blogs = get_blogs_of_user( $user->ID, true ); + if ( ! is_array( $blogs ) ) { + return; + } + + foreach ( $blogs as $val ) { + if ( ! can_edit_network( $val->site_id ) ) { + continue; + } + + $path = ( '/' === $val->path ) ? '' : $val->path; + $site_classes = array( 'site-' . $val->site_id ); + /** + * Filters the span class for a site listing on the mulisite user list table. + * + * @since 5.2.0 + * + * @param string[] $site_classes Array of class names used within the span tag. Default "site-#" with the site's network ID. + * @param int $site_id Site ID. + * @param int $network_id Network ID. + * @param WP_User $user WP_User object. + */ + $site_classes = apply_filters( 'ms_user_list_site_class', $site_classes, $val->userblog_id, $val->site_id, $user ); + if ( is_array( $site_classes ) && ! empty( $site_classes ) ) { + $site_classes = array_map( 'sanitize_html_class', array_unique( $site_classes ) ); + echo ''; + } else { + echo ''; + } + echo '' . str_replace( '.' . get_network()->domain, '', $val->domain . $path ) . ''; + echo ' '; + $actions = array(); + $actions['edit'] = '' . __( 'Edit' ) . ''; + + $class = ''; + if ( 1 == $val->spam ) { + $class .= 'site-spammed '; + } + if ( 1 == $val->mature ) { + $class .= 'site-mature '; + } + if ( 1 == $val->deleted ) { + $class .= 'site-deleted '; + } + if ( 1 == $val->archived ) { + $class .= 'site-archived '; + } + + $actions['view'] = '' . __( 'View' ) . ''; + + /** + * Filters the action links displayed next the sites a user belongs to + * in the Network Admin Users list table. + * + * @since 3.1.0 + * + * @param string[] $actions An array of action links to be displayed. Default 'Edit', 'View'. + * @param int $userblog_id The site ID. + */ + $actions = apply_filters( 'ms_user_list_site_actions', $actions, $val->userblog_id ); + + $i = 0; + $action_count = count( $actions ); + foreach ( $actions as $action => $link ) { + ++$i; + $sep = ( $i == $action_count ) ? '' : ' | '; + echo "$link$sep"; + } + echo '
        '; + } + } + + /** + * Handles the default column output. + * + * @since 4.3.0 + * + * @param WP_User $user The current WP_User object. + * @param string $column_name The current column name. + */ + public function column_default( $user, $column_name ) { + /** This filter is documented in wp-admin/includes/class-wp-users-list-table.php */ + echo apply_filters( 'manage_users_custom_column', '', $column_name, $user->ID ); + } + + public function display_rows() { + foreach ( $this->items as $user ) { + $class = ''; + + $status_list = array( + 'spam' => 'site-spammed', + 'deleted' => 'site-deleted', + ); + + foreach ( $status_list as $status => $col ) { + if ( $user->$status ) { + $class .= " $col"; + } + } + + ?> + + single_row_columns( $user ); ?> + + ID ) ) { + $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user->ID ) ) ); + $actions['edit'] = '' . __( 'Edit' ) . ''; + } + + if ( current_user_can( 'delete_user', $user->ID ) && ! in_array( $user->user_login, $super_admins ) ) { + $actions['delete'] = '' . __( 'Delete' ) . ''; + } + + /** + * Filters the action links displayed under each user in the Network Admin Users list table. + * + * @since 3.2.0 + * + * @param string[] $actions An array of action links to be displayed. Default 'Edit', 'Delete'. + * @param WP_User $user WP_User object. + */ + $actions = apply_filters( 'ms_user_row_actions', $actions, $user ); + + return $this->row_actions( $actions ); + } +} diff --git a/wp-admin/includes/class-wp-plugin-install-list-table.php b/wp-admin/includes/class-wp-plugin-install-list-table.php new file mode 100644 index 0000000..e2f3b1a --- /dev/null +++ b/wp-admin/includes/class-wp-plugin-install-list-table.php @@ -0,0 +1,776 @@ +no_update ) ) { + foreach ( $plugin_info->no_update as $plugin ) { + $plugin->upgrade = false; + $plugins[ $plugin->slug ] = $plugin; + } + } + + if ( isset( $plugin_info->response ) ) { + foreach ( $plugin_info->response as $plugin ) { + $plugin->upgrade = true; + $plugins[ $plugin->slug ] = $plugin; + } + } + + return $plugins; + } + + /** + * Return a list of slugs of installed plugins, if known. + * + * Uses the transient data from the updates API to determine the slugs of + * known installed plugins. This might be better elsewhere, perhaps even + * within get_plugins(). + * + * @since 4.0.0 + * + * @return array + */ + protected function get_installed_plugin_slugs() { + return array_keys( $this->get_installed_plugins() ); + } + + /** + * @global array $tabs + * @global string $tab + * @global int $paged + * @global string $type + * @global string $term + */ + public function prepare_items() { + include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + + global $tabs, $tab, $paged, $type, $term; + + wp_reset_vars( array( 'tab' ) ); + + $paged = $this->get_pagenum(); + + $per_page = 36; + + // These are the tabs which are shown on the page. + $tabs = array(); + + if ( 'search' === $tab ) { + $tabs['search'] = __( 'Search Results' ); + } + if ( 'beta' === $tab || false !== strpos( get_bloginfo( 'version' ), '-' ) ) { + $tabs['beta'] = _x( 'Beta Testing', 'Plugin Installer' ); + } + $tabs['featured'] = _x( 'Featured', 'Plugin Installer' ); + $tabs['popular'] = _x( 'Popular', 'Plugin Installer' ); + $tabs['recommended'] = _x( 'Recommended', 'Plugin Installer' ); + $tabs['favorites'] = _x( 'Favorites', 'Plugin Installer' ); + if ( current_user_can( 'upload_plugins' ) ) { + // No longer a real tab. Here for filter compatibility. + // Gets skipped in get_views(). + $tabs['upload'] = __( 'Upload Plugin' ); + } + + $nonmenu_tabs = array( 'plugin-information' ); // Valid actions to perform which do not have a Menu item. + + /** + * Filters the tabs shown on the Plugin Install screen. + * + * @since 2.7.0 + * + * @param string[] $tabs The tabs shown on the Plugin Install screen. Defaults include 'featured', 'popular', + * 'recommended', 'favorites', and 'upload'. + */ + $tabs = apply_filters( 'install_plugins_tabs', $tabs ); + + /** + * Filters tabs not associated with a menu item on the Plugin Install screen. + * + * @since 2.7.0 + * + * @param string[] $nonmenu_tabs The tabs that don't have a menu item on the Plugin Install screen. + */ + $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs ); + + // If a non-valid menu tab has been selected, And it's not a non-menu action. + if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) ) { + $tab = key( $tabs ); + } + + $installed_plugins = $this->get_installed_plugins(); + + $args = array( + 'page' => $paged, + 'per_page' => $per_page, + // Send the locale to the API so it can provide context-sensitive results. + 'locale' => get_user_locale(), + ); + + switch ( $tab ) { + case 'search': + $type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term'; + $term = isset( $_REQUEST['s'] ) ? wp_unslash( $_REQUEST['s'] ) : ''; + + switch ( $type ) { + case 'tag': + $args['tag'] = sanitize_title_with_dashes( $term ); + break; + case 'term': + $args['search'] = $term; + break; + case 'author': + $args['author'] = $term; + break; + } + + break; + + case 'featured': + case 'popular': + case 'new': + case 'beta': + $args['browse'] = $tab; + break; + case 'recommended': + $args['browse'] = $tab; + // Include the list of installed plugins so we can get relevant results. + $args['installed_plugins'] = array_keys( $installed_plugins ); + break; + + case 'favorites': + $action = 'save_wporg_username_' . get_current_user_id(); + if ( isset( $_GET['_wpnonce'] ) && wp_verify_nonce( wp_unslash( $_GET['_wpnonce'] ), $action ) ) { + $user = isset( $_GET['user'] ) ? wp_unslash( $_GET['user'] ) : get_user_option( 'wporg_favorites' ); + + // If the save url parameter is passed with a falsey value, don't save the favorite user. + if ( ! isset( $_GET['save'] ) || $_GET['save'] ) { + update_user_meta( get_current_user_id(), 'wporg_favorites', $user ); + } + } else { + $user = get_user_option( 'wporg_favorites' ); + } + if ( $user ) { + $args['user'] = $user; + } else { + $args = false; + } + + add_action( 'install_plugins_favorites', 'install_plugins_favorites_form', 9, 0 ); + break; + + default: + $args = false; + break; + } + + /** + * Filters API request arguments for each Plugin Install screen tab. + * + * The dynamic portion of the hook name, `$tab`, refers to the plugin install tabs. + * Default tabs include 'featured', 'popular', 'recommended', 'favorites', and 'upload'. + * + * @since 3.7.0 + * + * @param array|bool $args Plugin Install API arguments. + */ + $args = apply_filters( "install_plugins_table_api_args_{$tab}", $args ); + + if ( ! $args ) { + return; + } + + $api = plugins_api( 'query_plugins', $args ); + + if ( is_wp_error( $api ) ) { + $this->error = $api; + return; + } + + $this->items = $api->plugins; + + if ( $this->orderby ) { + uasort( $this->items, array( $this, 'order_callback' ) ); + } + + $this->set_pagination_args( + array( + 'total_items' => $api->info['results'], + 'per_page' => $args['per_page'], + ) + ); + + if ( isset( $api->info['groups'] ) ) { + $this->groups = $api->info['groups']; + } + + if ( $installed_plugins ) { + $js_plugins = array_fill_keys( + array( 'all', 'search', 'active', 'inactive', 'recently_activated', 'mustuse', 'dropins' ), + array() + ); + + $js_plugins['all'] = array_values( wp_list_pluck( $installed_plugins, 'plugin' ) ); + $upgrade_plugins = wp_filter_object_list( $installed_plugins, array( 'upgrade' => true ), 'and', 'plugin' ); + + if ( $upgrade_plugins ) { + $js_plugins['upgrade'] = array_values( $upgrade_plugins ); + } + + wp_localize_script( + 'updates', + '_wpUpdatesItemCounts', + array( + 'plugins' => $js_plugins, + 'totals' => wp_get_update_data(), + ) + ); + } + } + + /** + */ + public function no_items() { + if ( isset( $this->error ) ) { ?> +

        error->get_error_message(); ?>

        +

        +
        + +
        + $text ) { + $current_link_attributes = ( $action === $tab ) ? ' class="current" aria-current="page"' : ''; + $href = self_admin_url( 'plugin-install.php?tab=' . $action ); + $display_tabs[ 'plugin-install-' . $action ] = "$text"; + } + // No longer a real tab. + unset( $display_tabs['plugin-install-upload'] ); + + return $display_tabs; + } + + /** + * Override parent views so we can use the filter bar display. + */ + public function views() { + $views = $this->get_views(); + + /** This filter is documented in wp-admin/inclues/class-wp-list-table.php */ + $views = apply_filters( "views_{$this->screen->id}", $views ); + + $this->screen->render_screen_reader_content( 'heading_views' ); + ?> +
        + + + +
        + _args['singular']; + + $data_attr = ''; + + if ( $singular ) { + $data_attr = " data-wp-lists='list:$singular'"; + } + + $this->display_tablenav( 'top' ); + + ?> +
        + screen->render_screen_reader_content( 'heading_list' ); + ?> +
        > + display_rows_or_placeholder(); ?> +
        +
        + display_tablenav( 'bottom' ); + } + + /** + * @global string $tab + * + * @param string $which + */ + protected function display_tablenav( $which ) { + if ( 'featured' === $GLOBALS['tab'] ) { + return; + } + + if ( 'top' === $which ) { + wp_referer_field(); + ?> +
        +
        + +
        + pagination( $which ); ?> +
        +
        + +
        + pagination( $which ); ?> +
        +
        + _args['plural'] ); + } + + /** + * @return array + */ + public function get_columns() { + return array(); + } + + /** + * @param object $plugin_a + * @param object $plugin_b + * @return int + */ + private function order_callback( $plugin_a, $plugin_b ) { + $orderby = $this->orderby; + if ( ! isset( $plugin_a->$orderby, $plugin_b->$orderby ) ) { + return 0; + } + + $a = $plugin_a->$orderby; + $b = $plugin_b->$orderby; + + if ( $a == $b ) { + return 0; + } + + if ( 'DESC' === $this->order ) { + return ( $a < $b ) ? 1 : -1; + } else { + return ( $a < $b ) ? -1 : 1; + } + } + + public function display_rows() { + $plugins_allowedtags = array( + 'a' => array( + 'href' => array(), + 'title' => array(), + 'target' => array(), + ), + 'abbr' => array( 'title' => array() ), + 'acronym' => array( 'title' => array() ), + 'code' => array(), + 'pre' => array(), + 'em' => array(), + 'strong' => array(), + 'ul' => array(), + 'ol' => array(), + 'li' => array(), + 'p' => array(), + 'br' => array(), + ); + + $plugins_group_titles = array( + 'Performance' => _x( 'Performance', 'Plugin installer group title' ), + 'Social' => _x( 'Social', 'Plugin installer group title' ), + 'Tools' => _x( 'Tools', 'Plugin installer group title' ), + ); + + $group = null; + + foreach ( (array) $this->items as $plugin ) { + if ( is_object( $plugin ) ) { + $plugin = (array) $plugin; + } + + // Display the group heading if there is one. + if ( isset( $plugin['group'] ) && $plugin['group'] != $group ) { + if ( isset( $this->groups[ $plugin['group'] ] ) ) { + $group_name = $this->groups[ $plugin['group'] ]; + if ( isset( $plugins_group_titles[ $group_name ] ) ) { + $group_name = $plugins_group_titles[ $group_name ]; + } + } else { + $group_name = $plugin['group']; + } + + // Starting a new group, close off the divs of the last one. + if ( ! empty( $group ) ) { + echo '
        '; + } + + echo '

        ' . esc_html( $group_name ) . '

        '; + // Needs an extra wrapping div for nth-child selectors to work. + echo '
        '; + + $group = $plugin['group']; + } + $title = wp_kses( $plugin['name'], $plugins_allowedtags ); + + // Remove any HTML from the description. + $description = strip_tags( $plugin['short_description'] ); + $version = wp_kses( $plugin['version'], $plugins_allowedtags ); + + $name = strip_tags( $title . ' ' . $version ); + + $author = wp_kses( $plugin['author'], $plugins_allowedtags ); + if ( ! empty( $author ) ) { + /* translators: %s: Plugin author. */ + $author = ' ' . sprintf( __( 'By %s' ), $author ) . ''; + } + + $requires_php = isset( $plugin['requires_php'] ) ? $plugin['requires_php'] : null; + $requires_wp = isset( $plugin['requires'] ) ? $plugin['requires'] : null; + + $compatible_php = is_php_version_compatible( $requires_php ); + $compatible_wp = is_wp_version_compatible( $requires_wp ); + $tested_wp = ( empty( $plugin['tested'] ) || version_compare( get_bloginfo( 'version' ), $plugin['tested'], '<=' ) ); + + $action_links = array(); + + if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) { + $status = install_plugin_install_status( $plugin ); + + switch ( $status['status'] ) { + case 'install': + if ( $status['url'] ) { + if ( $compatible_php && $compatible_wp ) { + $action_links[] = sprintf( + '%s', + esc_attr( $plugin['slug'] ), + esc_url( $status['url'] ), + /* translators: %s: Plugin name and version. */ + esc_attr( sprintf( __( 'Install %s now' ), $name ) ), + esc_attr( $name ), + __( 'Install Now' ) + ); + } else { + $action_links[] = sprintf( + '', + _x( 'Cannot Install', 'plugin' ) + ); + } + } + break; + + case 'update_available': + if ( $status['url'] ) { + if ( $compatible_php && $compatible_wp ) { + $action_links[] = sprintf( + '%s', + esc_attr( $status['file'] ), + esc_attr( $plugin['slug'] ), + esc_url( $status['url'] ), + /* translators: %s: Plugin name and version. */ + esc_attr( sprintf( __( 'Update %s now' ), $name ) ), + esc_attr( $name ), + __( 'Update Now' ) + ); + } else { + $action_links[] = sprintf( + '', + _x( 'Cannot Update', 'plugin' ) + ); + } + } + break; + + case 'latest_installed': + case 'newer_installed': + if ( is_plugin_active( $status['file'] ) ) { + $action_links[] = sprintf( + '', + _x( 'Active', 'plugin' ) + ); + } elseif ( current_user_can( 'activate_plugin', $status['file'] ) ) { + $button_text = __( 'Activate' ); + /* translators: %s: Plugin name. */ + $button_label = _x( 'Activate %s', 'plugin' ); + $activate_url = add_query_arg( + array( + '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $status['file'] ), + 'action' => 'activate', + 'plugin' => $status['file'], + ), + network_admin_url( 'plugins.php' ) + ); + + if ( is_network_admin() ) { + $button_text = __( 'Network Activate' ); + /* translators: %s: Plugin name. */ + $button_label = _x( 'Network Activate %s', 'plugin' ); + $activate_url = add_query_arg( array( 'networkwide' => 1 ), $activate_url ); + } + + $action_links[] = sprintf( + '%3$s', + esc_url( $activate_url ), + esc_attr( sprintf( $button_label, $plugin['name'] ) ), + $button_text + ); + } else { + $action_links[] = sprintf( + '', + _x( 'Installed', 'plugin' ) + ); + } + break; + } + } + + $details_link = self_admin_url( + 'plugin-install.php?tab=plugin-information&plugin=' . $plugin['slug'] . + '&TB_iframe=true&width=600&height=550' + ); + + $action_links[] = sprintf( + '%s', + esc_url( $details_link ), + /* translators: %s: Plugin name and version. */ + esc_attr( sprintf( __( 'More information about %s' ), $name ) ), + esc_attr( $name ), + __( 'More Details' ) + ); + + if ( ! empty( $plugin['icons']['svg'] ) ) { + $plugin_icon_url = $plugin['icons']['svg']; + } elseif ( ! empty( $plugin['icons']['2x'] ) ) { + $plugin_icon_url = $plugin['icons']['2x']; + } elseif ( ! empty( $plugin['icons']['1x'] ) ) { + $plugin_icon_url = $plugin['icons']['1x']; + } else { + $plugin_icon_url = $plugin['icons']['default']; + } + + /** + * Filters the install action links for a plugin. + * + * @since 2.7.0 + * + * @param string[] $action_links An array of plugin action links. Defaults are links to Details and Install Now. + * @param array $plugin The plugin currently being listed. + */ + $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin ); + + $last_updated_timestamp = strtotime( $plugin['last_updated'] ); + ?> +
        +

        '; + if ( ! $compatible_php && ! $compatible_wp ) { + _e( 'This plugin doesn’t work with your versions of WordPress and PHP.' ); + if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) { + printf( + /* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */ + ' ' . __( 'Please update WordPress, and then learn more about updating PHP.' ), + self_admin_url( 'update-core.php' ), + esc_url( wp_get_update_php_url() ) + ); + wp_update_php_annotation( '

        ', '' ); + } elseif ( current_user_can( 'update_core' ) ) { + printf( + /* translators: %s: URL to WordPress Updates screen. */ + ' ' . __( 'Please update WordPress.' ), + self_admin_url( 'update-core.php' ) + ); + } elseif ( current_user_can( 'update_php' ) ) { + printf( + /* translators: %s: URL to Update PHP page. */ + ' ' . __( 'Learn more about updating PHP.' ), + esc_url( wp_get_update_php_url() ) + ); + wp_update_php_annotation( '

        ', '' ); + } + } elseif ( ! $compatible_wp ) { + _e( 'This plugin doesn’t work with your version of WordPress.' ); + if ( current_user_can( 'update_core' ) ) { + printf( + /* translators: %s: URL to WordPress Updates screen. */ + ' ' . __( 'Please update WordPress.' ), + self_admin_url( 'update-core.php' ) + ); + } + } elseif ( ! $compatible_php ) { + _e( 'This plugin doesn’t work with your version of PHP.' ); + if ( current_user_can( 'update_php' ) ) { + printf( + /* translators: %s: URL to Update PHP page. */ + ' ' . __( 'Learn more about updating PHP.' ), + esc_url( wp_get_update_php_url() ) + ); + wp_update_php_annotation( '

        ', '' ); + } + } + echo '

        '; + } + ?> +
        +
        +

        + + + + +

        +
        + +
        +

        +

        +
        +
        +
        +
        + $plugin['rating'], + 'type' => 'percent', + 'number' => $plugin['num_ratings'], + ) + ); + ?> + +
        +
        + + +
        +
        + = 1000000 ) { + $active_installs_millions = floor( $plugin['active_installs'] / 1000000 ); + $active_installs_text = sprintf( + /* translators: %s: Number of millions. */ + _nx( '%s+ Million', '%s+ Million', $active_installs_millions, 'Active plugin installations' ), + number_format_i18n( $active_installs_millions ) + ); + } elseif ( 0 == $plugin['active_installs'] ) { + $active_installs_text = _x( 'Less Than 10', 'Active plugin installations' ); + } else { + $active_installs_text = number_format_i18n( $plugin['active_installs'] ) . '+'; + } + /* translators: %s: Number of installations. */ + printf( __( '%s Active Installations' ), $active_installs_text ); + ?> +
        +
        + ' . __( 'Untested with your version of WordPress' ) . ''; + } elseif ( ! $compatible_wp ) { + echo '' . __( 'Incompatible with your version of WordPress' ) . ''; + } else { + echo '' . __( 'Compatible with your version of WordPress' ) . ''; + } + ?> +
        +
        +
        +
        '; + } + } +} diff --git a/wp-admin/includes/class-wp-plugins-list-table.php b/wp-admin/includes/class-wp-plugins-list-table.php new file mode 100644 index 0000000..3ec88eb --- /dev/null +++ b/wp-admin/includes/class-wp-plugins-list-table.php @@ -0,0 +1,1025 @@ + 'plugins', + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ) + ); + + $status = 'all'; + if ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'active', 'inactive', 'recently_activated', 'upgrade', 'mustuse', 'dropins', 'search', 'paused' ) ) ) { + $status = $_REQUEST['plugin_status']; + } + + if ( isset( $_REQUEST['s'] ) ) { + $_SERVER['REQUEST_URI'] = add_query_arg( 's', wp_unslash( $_REQUEST['s'] ) ); + } + + $page = $this->get_pagenum(); + } + + /** + * @return array + */ + protected function get_table_classes() { + return array( 'widefat', $this->_args['plural'] ); + } + + /** + * @return bool + */ + public function ajax_user_can() { + return current_user_can( 'activate_plugins' ); + } + + /** + * @global string $status + * @global array $plugins + * @global array $totals + * @global int $page + * @global string $orderby + * @global string $order + * @global string $s + */ + public function prepare_items() { + global $status, $plugins, $totals, $page, $orderby, $order, $s; + + wp_reset_vars( array( 'orderby', 'order' ) ); + + /** + * Filters the full array of plugins to list in the Plugins list table. + * + * @since 3.0.0 + * + * @see get_plugins() + * + * @param array $all_plugins An array of plugins to display in the list table. + */ + $all_plugins = apply_filters( 'all_plugins', get_plugins() ); + + $plugins = array( + 'all' => $all_plugins, + 'search' => array(), + 'active' => array(), + 'inactive' => array(), + 'recently_activated' => array(), + 'upgrade' => array(), + 'mustuse' => array(), + 'dropins' => array(), + 'paused' => array(), + ); + + $screen = $this->screen; + + if ( ! is_multisite() || ( $screen->in_admin( 'network' ) && current_user_can( 'manage_network_plugins' ) ) ) { + + /** + * Filters whether to display the advanced plugins list table. + * + * There are two types of advanced plugins - must-use and drop-ins - + * which can be used in a single site or Multisite network. + * + * The $type parameter allows you to differentiate between the type of advanced + * plugins to filter the display of. Contexts include 'mustuse' and 'dropins'. + * + * @since 3.0.0 + * + * @param bool $show Whether to show the advanced plugins for the specified + * plugin type. Default true. + * @param string $type The plugin type. Accepts 'mustuse', 'dropins'. + */ + if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) ) { + $plugins['mustuse'] = get_mu_plugins(); + } + + /** This action is documented in wp-admin/includes/class-wp-plugins-list-table.php */ + if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) ) { + $plugins['dropins'] = get_dropins(); + } + + if ( current_user_can( 'update_plugins' ) ) { + $current = get_site_transient( 'update_plugins' ); + foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) { + if ( isset( $current->response[ $plugin_file ] ) ) { + $plugins['all'][ $plugin_file ]['update'] = true; + $plugins['upgrade'][ $plugin_file ] = $plugins['all'][ $plugin_file ]; + } + } + } + } + + if ( ! $screen->in_admin( 'network' ) ) { + $show = current_user_can( 'manage_network_plugins' ); + /** + * Filters whether to display network-active plugins alongside plugins active for the current site. + * + * This also controls the display of inactive network-only plugins (plugins with + * "Network: true" in the plugin header). + * + * Plugins cannot be network-activated or network-deactivated from this screen. + * + * @since 4.4.0 + * + * @param bool $show Whether to show network-active plugins. Default is whether the current + * user can manage network plugins (ie. a Super Admin). + */ + $show_network_active = apply_filters( 'show_network_active_plugins', $show ); + } + + if ( $screen->in_admin( 'network' ) ) { + $recently_activated = get_site_option( 'recently_activated', array() ); + } else { + $recently_activated = get_option( 'recently_activated', array() ); + } + + foreach ( $recently_activated as $key => $time ) { + if ( $time + WEEK_IN_SECONDS < time() ) { + unset( $recently_activated[ $key ] ); + } + } + + if ( $screen->in_admin( 'network' ) ) { + update_site_option( 'recently_activated', $recently_activated ); + } else { + update_option( 'recently_activated', $recently_activated ); + } + + $plugin_info = get_site_transient( 'update_plugins' ); + + foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) { + // Extra info if known. array_merge() ensures $plugin_data has precedence if keys collide. + if ( isset( $plugin_info->response[ $plugin_file ] ) ) { + $plugin_data = array_merge( (array) $plugin_info->response[ $plugin_file ], $plugin_data ); + $plugins['all'][ $plugin_file ] = $plugin_data; + // Make sure that $plugins['upgrade'] also receives the extra info since it is used on ?plugin_status=upgrade. + if ( isset( $plugins['upgrade'][ $plugin_file ] ) ) { + $plugins['upgrade'][ $plugin_file ] = $plugin_data; + } + } elseif ( isset( $plugin_info->no_update[ $plugin_file ] ) ) { + $plugin_data = array_merge( (array) $plugin_info->no_update[ $plugin_file ], $plugin_data ); + $plugins['all'][ $plugin_file ] = $plugin_data; + // Make sure that $plugins['upgrade'] also receives the extra info since it is used on ?plugin_status=upgrade. + if ( isset( $plugins['upgrade'][ $plugin_file ] ) ) { + $plugins['upgrade'][ $plugin_file ] = $plugin_data; + } + } + + // Filter into individual sections. + if ( is_multisite() && ! $screen->in_admin( 'network' ) && is_network_only_plugin( $plugin_file ) && ! is_plugin_active( $plugin_file ) ) { + if ( $show_network_active ) { + // On the non-network screen, show inactive network-only plugins if allowed. + $plugins['inactive'][ $plugin_file ] = $plugin_data; + } else { + // On the non-network screen, filter out network-only plugins as long as they're not individually active. + unset( $plugins['all'][ $plugin_file ] ); + } + } elseif ( ! $screen->in_admin( 'network' ) && is_plugin_active_for_network( $plugin_file ) ) { + if ( $show_network_active ) { + // On the non-network screen, show network-active plugins if allowed. + $plugins['active'][ $plugin_file ] = $plugin_data; + } else { + // On the non-network screen, filter out network-active plugins. + unset( $plugins['all'][ $plugin_file ] ); + } + } elseif ( ( ! $screen->in_admin( 'network' ) && is_plugin_active( $plugin_file ) ) + || ( $screen->in_admin( 'network' ) && is_plugin_active_for_network( $plugin_file ) ) ) { + // On the non-network screen, populate the active list with plugins that are individually activated. + // On the network admin screen, populate the active list with plugins that are network-activated. + $plugins['active'][ $plugin_file ] = $plugin_data; + + if ( ! $screen->in_admin( 'network' ) && is_plugin_paused( $plugin_file ) ) { + $plugins['paused'][ $plugin_file ] = $plugin_data; + } + } else { + if ( isset( $recently_activated[ $plugin_file ] ) ) { + // Populate the recently activated list with plugins that have been recently activated. + $plugins['recently_activated'][ $plugin_file ] = $plugin_data; + } + // Populate the inactive list with plugins that aren't activated. + $plugins['inactive'][ $plugin_file ] = $plugin_data; + } + } + + if ( strlen( $s ) ) { + $status = 'search'; + $plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) ); + } + + $totals = array(); + foreach ( $plugins as $type => $list ) { + $totals[ $type ] = count( $list ); + } + + if ( empty( $plugins[ $status ] ) && ! in_array( $status, array( 'all', 'search' ) ) ) { + $status = 'all'; + } + + $this->items = array(); + foreach ( $plugins[ $status ] as $plugin_file => $plugin_data ) { + // Translate, don't apply markup, sanitize HTML. + $this->items[ $plugin_file ] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true ); + } + + $total_this_page = $totals[ $status ]; + + $js_plugins = array(); + foreach ( $plugins as $key => $list ) { + $js_plugins[ $key ] = array_keys( (array) $list ); + } + + wp_localize_script( + 'updates', + '_wpUpdatesItemCounts', + array( + 'plugins' => $js_plugins, + 'totals' => wp_get_update_data(), + ) + ); + + if ( ! $orderby ) { + $orderby = 'Name'; + } else { + $orderby = ucfirst( $orderby ); + } + + $order = strtoupper( $order ); + + uasort( $this->items, array( $this, '_order_callback' ) ); + + $plugins_per_page = $this->get_items_per_page( str_replace( '-', '_', $screen->id . '_per_page' ), 999 ); + + $start = ( $page - 1 ) * $plugins_per_page; + + if ( $total_this_page > $plugins_per_page ) { + $this->items = array_slice( $this->items, $start, $plugins_per_page ); + } + + $this->set_pagination_args( + array( + 'total_items' => $total_this_page, + 'per_page' => $plugins_per_page, + ) + ); + } + + /** + * @global string $s URL encoded search term. + * + * @param array $plugin + * @return bool + */ + public function _search_callback( $plugin ) { + global $s; + + foreach ( $plugin as $value ) { + if ( is_string( $value ) && false !== stripos( strip_tags( $value ), urldecode( $s ) ) ) { + return true; + } + } + + return false; + } + + /** + * @global string $orderby + * @global string $order + * @param array $plugin_a + * @param array $plugin_b + * @return int + */ + public function _order_callback( $plugin_a, $plugin_b ) { + global $orderby, $order; + + $a = $plugin_a[ $orderby ]; + $b = $plugin_b[ $orderby ]; + + if ( $a == $b ) { + return 0; + } + + if ( 'DESC' === $order ) { + return strcasecmp( $b, $a ); + } else { + return strcasecmp( $a, $b ); + } + } + + /** + * @global array $plugins + */ + public function no_items() { + global $plugins; + + if ( ! empty( $_REQUEST['s'] ) ) { + $s = esc_html( wp_unslash( $_REQUEST['s'] ) ); + + /* translators: %s: Plugin search term. */ + printf( __( 'No plugins found for “%s”.' ), $s ); + + // We assume that somebody who can install plugins in multisite is experienced enough to not need this helper link. + if ( ! is_multisite() && current_user_can( 'install_plugins' ) ) { + echo ' ' . __( 'Search for plugins in the WordPress Plugin Directory.' ) . ''; + } + } elseif ( ! empty( $plugins['all'] ) ) { + _e( 'No plugins found.' ); + } else { + _e( 'You do not appear to have any plugins available at this time.' ); + } + } + + /** + * Displays the search box. + * + * @since 4.6.0 + * + * @param string $text The 'submit' button label. + * @param string $input_id ID attribute value for the search input field. + */ + public function search_box( $text, $input_id ) { + if ( empty( $_REQUEST['s'] ) && ! $this->has_items() ) { + return; + } + + $input_id = $input_id . '-search-input'; + + if ( ! empty( $_REQUEST['orderby'] ) ) { + echo ''; + } + if ( ! empty( $_REQUEST['order'] ) ) { + echo ''; + } + ?> + + ! in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : '', + 'name' => __( 'Plugin' ), + 'description' => __( 'Description' ), + ); + } + + /** + * @return array + */ + protected function get_sortable_columns() { + return array(); + } + + /** + * @global array $totals + * @global string $status + * @return array + */ + protected function get_views() { + global $totals, $status; + + $status_links = array(); + foreach ( $totals as $type => $count ) { + if ( ! $count ) { + continue; + } + + switch ( $type ) { + case 'all': + /* translators: %s: Number of plugins. */ + $text = _nx( + 'All (%s)', + 'All (%s)', + $count, + 'plugins' + ); + break; + case 'active': + /* translators: %s: Number of plugins. */ + $text = _n( + 'Active (%s)', + 'Active (%s)', + $count + ); + break; + case 'recently_activated': + /* translators: %s: Number of plugins. */ + $text = _n( + 'Recently Active (%s)', + 'Recently Active (%s)', + $count + ); + break; + case 'inactive': + /* translators: %s: Number of plugins. */ + $text = _n( + 'Inactive (%s)', + 'Inactive (%s)', + $count + ); + break; + case 'mustuse': + /* translators: %s: Number of plugins. */ + $text = _n( + 'Must-Use (%s)', + 'Must-Use (%s)', + $count + ); + break; + case 'dropins': + /* translators: %s: Number of plugins. */ + $text = _n( + 'Drop-in (%s)', + 'Drop-ins (%s)', + $count + ); + break; + case 'paused': + /* translators: %s: Number of plugins. */ + $text = _n( + 'Paused (%s)', + 'Paused (%s)', + $count + ); + break; + case 'upgrade': + /* translators: %s: Number of plugins. */ + $text = _n( + 'Update Available (%s)', + 'Update Available (%s)', + $count + ); + break; + } + + if ( 'search' !== $type ) { + $status_links[ $type ] = sprintf( + "%s", + add_query_arg( 'plugin_status', $type, 'plugins.php' ), + ( $type === $status ) ? ' class="current" aria-current="page"' : '', + sprintf( $text, number_format_i18n( $count ) ) + ); + } + } + + return $status_links; + } + + /** + * @global string $status + * @return array + */ + protected function get_bulk_actions() { + global $status; + + $actions = array(); + + if ( 'active' != $status ) { + $actions['activate-selected'] = $this->screen->in_admin( 'network' ) ? __( 'Network Activate' ) : __( 'Activate' ); + } + + if ( 'inactive' != $status && 'recent' != $status ) { + $actions['deactivate-selected'] = $this->screen->in_admin( 'network' ) ? __( 'Network Deactivate' ) : __( 'Deactivate' ); + } + + if ( ! is_multisite() || $this->screen->in_admin( 'network' ) ) { + if ( current_user_can( 'update_plugins' ) ) { + $actions['update-selected'] = __( 'Update' ); + } + if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) ) { + $actions['delete-selected'] = __( 'Delete' ); + } + } + + return $actions; + } + + /** + * @global string $status + * @param string $which + */ + public function bulk_actions( $which = '' ) { + global $status; + + if ( in_array( $status, array( 'mustuse', 'dropins' ) ) ) { + return; + } + + parent::bulk_actions( $which ); + } + + /** + * @global string $status + * @param string $which + */ + protected function extra_tablenav( $which ) { + global $status; + + if ( ! in_array( $status, array( 'recently_activated', 'mustuse', 'dropins' ) ) ) { + return; + } + + echo '
        '; + + if ( 'recently_activated' == $status ) { + submit_button( __( 'Clear List' ), '', 'clear-recent-list', false ); + } elseif ( 'top' === $which && 'mustuse' === $status ) { + echo '

        ' . sprintf( + /* translators: %s: mu-plugins directory name. */ + __( 'Files in the %s directory are executed automatically.' ), + '' . str_replace( ABSPATH, '/', WPMU_PLUGIN_DIR ) . '' + ) . '

        '; + } elseif ( 'top' === $which && 'dropins' === $status ) { + echo '

        ' . sprintf( + /* translators: %s: wp-content directory name. */ + __( 'Drop-ins are single files, found in the %s directory, that replace or enhance WordPress features in ways that are not possible for traditional plugins.' ), + '' . str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '' + ) . '

        '; + } + echo '
        '; + } + + /** + * @return string + */ + public function current_action() { + if ( isset( $_POST['clear-recent-list'] ) ) { + return 'clear-recent-list'; + } + + return parent::current_action(); + } + + /** + * @global string $status + */ + public function display_rows() { + global $status; + + if ( is_multisite() && ! $this->screen->in_admin( 'network' ) && in_array( $status, array( 'mustuse', 'dropins' ) ) ) { + return; + } + + foreach ( $this->items as $plugin_file => $plugin_data ) { + $this->single_row( array( $plugin_file, $plugin_data ) ); + } + } + + /** + * @global string $status + * @global int $page + * @global string $s + * @global array $totals + * + * @param array $item + */ + public function single_row( $item ) { + global $status, $page, $s, $totals; + + list( $plugin_file, $plugin_data ) = $item; + $context = $status; + $screen = $this->screen; + + // Pre-order. + $actions = array( + 'deactivate' => '', + 'activate' => '', + 'details' => '', + 'delete' => '', + ); + + // Do not restrict by default. + $restrict_network_active = false; + $restrict_network_only = false; + + if ( 'mustuse' === $context ) { + $is_active = true; + } elseif ( 'dropins' === $context ) { + $dropins = _get_dropins(); + $plugin_name = $plugin_file; + if ( $plugin_file != $plugin_data['Name'] ) { + $plugin_name .= '
        ' . $plugin_data['Name']; + } + if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant. + $is_active = true; + $description = '

        ' . $dropins[ $plugin_file ][0] . '

        '; + } elseif ( defined( $dropins[ $plugin_file ][1] ) && constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true. + $is_active = true; + $description = '

        ' . $dropins[ $plugin_file ][0] . '

        '; + } else { + $is_active = false; + $description = '

        ' . $dropins[ $plugin_file ][0] . ' ' . __( 'Inactive:' ) . ' ' . + sprintf( + /* translators: 1: Drop-in constant name, 2: wp-config.php */ + __( 'Requires %1$s in %2$s file.' ), + "define('" . $dropins[ $plugin_file ][1] . "', true);", + 'wp-config.php' + ) . '

        '; + } + if ( $plugin_data['Description'] ) { + $description .= '

        ' . $plugin_data['Description'] . '

        '; + } + } else { + if ( $screen->in_admin( 'network' ) ) { + $is_active = is_plugin_active_for_network( $plugin_file ); + } else { + $is_active = is_plugin_active( $plugin_file ); + $restrict_network_active = ( is_multisite() && is_plugin_active_for_network( $plugin_file ) ); + $restrict_network_only = ( is_multisite() && is_network_only_plugin( $plugin_file ) && ! $is_active ); + } + + if ( $screen->in_admin( 'network' ) ) { + if ( $is_active ) { + if ( current_user_can( 'manage_network_plugins' ) ) { + $actions['deactivate'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . urlencode( $plugin_file ) . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file ), + /* translators: %s: Plugin name. */ + esc_attr( sprintf( _x( 'Network Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ), + __( 'Network Deactivate' ) + ); + } + } else { + if ( current_user_can( 'manage_network_plugins' ) ) { + $actions['activate'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=activate&plugin=' . urlencode( $plugin_file ) . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file ), + /* translators: %s: Plugin name. */ + esc_attr( sprintf( _x( 'Network Activate %s', 'plugin' ), $plugin_data['Name'] ) ), + __( 'Network Activate' ) + ); + } + if ( current_user_can( 'delete_plugins' ) && ! is_plugin_active( $plugin_file ) ) { + $actions['delete'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=delete-selected&checked[]=' . urlencode( $plugin_file ) . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins' ), + /* translators: %s: Plugin name. */ + esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ), + __( 'Delete' ) + ); + } + } + } else { + if ( $restrict_network_active ) { + $actions = array( + 'network_active' => __( 'Network Active' ), + ); + } elseif ( $restrict_network_only ) { + $actions = array( + 'network_only' => __( 'Network Only' ), + ); + } elseif ( $is_active ) { + if ( current_user_can( 'deactivate_plugin', $plugin_file ) ) { + $actions['deactivate'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . urlencode( $plugin_file ) . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'deactivate-plugin_' . $plugin_file ), + /* translators: %s: Plugin name. */ + esc_attr( sprintf( _x( 'Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ), + __( 'Deactivate' ) + ); + } + if ( current_user_can( 'resume_plugin', $plugin_file ) && is_plugin_paused( $plugin_file ) ) { + $actions['resume'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=resume&plugin=' . urlencode( $plugin_file ) . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'resume-plugin_' . $plugin_file ), + /* translators: %s: Plugin name. */ + esc_attr( sprintf( _x( 'Resume %s', 'plugin' ), $plugin_data['Name'] ) ), + __( 'Resume' ) + ); + } + } else { + if ( current_user_can( 'activate_plugin', $plugin_file ) ) { + $actions['activate'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=activate&plugin=' . urlencode( $plugin_file ) . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'activate-plugin_' . $plugin_file ), + /* translators: %s: Plugin name. */ + esc_attr( sprintf( _x( 'Activate %s', 'plugin' ), $plugin_data['Name'] ) ), + __( 'Activate' ) + ); + } + + if ( ! is_multisite() && current_user_can( 'delete_plugins' ) ) { + $actions['delete'] = sprintf( + '%s', + wp_nonce_url( 'plugins.php?action=delete-selected&checked[]=' . urlencode( $plugin_file ) . '&plugin_status=' . $context . '&paged=' . $page . '&s=' . $s, 'bulk-plugins' ), + /* translators: %s: Plugin name. */ + esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ), + __( 'Delete' ) + ); + } + } // End if $is_active. + } // End if $screen->in_admin( 'network' ). + } // End if $context. + + $actions = array_filter( $actions ); + + if ( $screen->in_admin( 'network' ) ) { + + /** + * Filters the action links displayed for each plugin in the Network Admin Plugins list table. + * + * @since 3.1.0 + * + * @param string[] $actions An array of plugin action links. By default this can include 'activate', + * 'deactivate', and 'delete'. + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @param array $plugin_data An array of plugin data. See `get_plugin_data()`. + * @param string $context The plugin context. By default this can include 'all', 'active', 'inactive', + * 'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'. + */ + $actions = apply_filters( 'network_admin_plugin_action_links', $actions, $plugin_file, $plugin_data, $context ); + + /** + * Filters the list of action links displayed for a specific plugin in the Network Admin Plugins list table. + * + * The dynamic portion of the hook name, `$plugin_file`, refers to the path + * to the plugin file, relative to the plugins directory. + * + * @since 3.1.0 + * + * @param string[] $actions An array of plugin action links. By default this can include 'activate', + * 'deactivate', and 'delete'. + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @param array $plugin_data An array of plugin data. See `get_plugin_data()`. + * @param string $context The plugin context. By default this can include 'all', 'active', 'inactive', + * 'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'. + */ + $actions = apply_filters( "network_admin_plugin_action_links_{$plugin_file}", $actions, $plugin_file, $plugin_data, $context ); + + } else { + + /** + * Filters the action links displayed for each plugin in the Plugins list table. + * + * @since 2.5.0 + * @since 2.6.0 The `$context` parameter was added. + * @since 4.9.0 The 'Edit' link was removed from the list of action links. + * + * @param string[] $actions An array of plugin action links. By default this can include 'activate', + * 'deactivate', and 'delete'. With Multisite active this can also include + * 'network_active' and 'network_only' items. + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @param array $plugin_data An array of plugin data. See `get_plugin_data()`. + * @param string $context The plugin context. By default this can include 'all', 'active', 'inactive', + * 'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'. + */ + $actions = apply_filters( 'plugin_action_links', $actions, $plugin_file, $plugin_data, $context ); + + /** + * Filters the list of action links displayed for a specific plugin in the Plugins list table. + * + * The dynamic portion of the hook name, `$plugin_file`, refers to the path + * to the plugin file, relative to the plugins directory. + * + * @since 2.7.0 + * @since 4.9.0 The 'Edit' link was removed from the list of action links. + * + * @param string[] $actions An array of plugin action links. By default this can include 'activate', + * 'deactivate', and 'delete'. With Multisite active this can also include + * 'network_active' and 'network_only' items. + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @param array $plugin_data An array of plugin data. See `get_plugin_data()`. + * @param string $context The plugin context. By default this can include 'all', 'active', 'inactive', + * 'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'. + */ + $actions = apply_filters( "plugin_action_links_{$plugin_file}", $actions, $plugin_file, $plugin_data, $context ); + + } + + $requires_php = isset( $plugin_data['requires_php'] ) ? $plugin_data['requires_php'] : null; + $compatible_php = is_php_version_compatible( $requires_php ); + $class = $is_active ? 'active' : 'inactive'; + $checkbox_id = 'checkbox_' . md5( $plugin_data['Name'] ); + if ( $restrict_network_active || $restrict_network_only || in_array( $status, array( 'mustuse', 'dropins' ) ) || ! $compatible_php ) { + $checkbox = ''; + } else { + $checkbox = sprintf( + '' . + '', + $checkbox_id, + /* translators: %s: Plugin name. */ + sprintf( __( 'Select %s' ), $plugin_data['Name'] ), + esc_attr( $plugin_file ) + ); + } + if ( 'dropins' != $context ) { + $description = '

        ' . ( $plugin_data['Description'] ? $plugin_data['Description'] : ' ' ) . '

        '; + $plugin_name = $plugin_data['Name']; + } + + if ( ! empty( $totals['upgrade'] ) && ! empty( $plugin_data['update'] ) ) { + $class .= ' update'; + } + + $paused = ! $screen->in_admin( 'network' ) && is_plugin_paused( $plugin_file ); + + if ( $paused ) { + $class .= ' paused'; + } + + $plugin_slug = isset( $plugin_data['slug'] ) ? $plugin_data['slug'] : sanitize_title( $plugin_name ); + printf( + '', + esc_attr( $class ), + esc_attr( $plugin_slug ), + esc_attr( $plugin_file ) + ); + + list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $extra_classes = ''; + if ( in_array( $column_name, $hidden ) ) { + $extra_classes = ' hidden'; + } + + switch ( $column_name ) { + case 'cb': + echo "$checkbox"; + break; + case 'name': + echo "$plugin_name"; + echo $this->row_actions( $actions, true ); + echo ''; + break; + case 'description': + $classes = 'column-description desc'; + + echo " +
        $description
        +
        "; + + $plugin_meta = array(); + if ( ! empty( $plugin_data['Version'] ) ) { + /* translators: %s: Plugin version number. */ + $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] ); + } + if ( ! empty( $plugin_data['Author'] ) ) { + $author = $plugin_data['Author']; + if ( ! empty( $plugin_data['AuthorURI'] ) ) { + $author = '' . $plugin_data['Author'] . ''; + } + /* translators: %s: Plugin author name. */ + $plugin_meta[] = sprintf( __( 'By %s' ), $author ); + } + + // Details link using API info, if available. + if ( isset( $plugin_data['slug'] ) && current_user_can( 'install_plugins' ) ) { + $plugin_meta[] = sprintf( + '%s', + esc_url( + network_admin_url( + 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data['slug'] . + '&TB_iframe=true&width=600&height=550' + ) + ), + /* translators: %s: Plugin name. */ + esc_attr( sprintf( __( 'More information about %s' ), $plugin_name ) ), + esc_attr( $plugin_name ), + __( 'View details' ) + ); + } elseif ( ! empty( $plugin_data['PluginURI'] ) ) { + $plugin_meta[] = sprintf( + '%s', + esc_url( $plugin_data['PluginURI'] ), + __( 'Visit plugin site' ) + ); + } + + /** + * Filters the array of row meta for each plugin in the Plugins list table. + * + * @since 2.8.0 + * + * @param string[] $plugin_meta An array of the plugin's metadata, + * including the version, author, + * author URI, and plugin URI. + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @param array $plugin_data An array of plugin data. + * @param string $status Status of the plugin. Defaults are 'All', 'Active', + * 'Inactive', 'Recently Activated', 'Upgrade', 'Must-Use', + * 'Drop-ins', 'Search', 'Paused'. + */ + $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status ); + echo implode( ' | ', $plugin_meta ); + + echo '
        '; + + if ( $paused ) { + $notice_text = __( 'This plugin failed to load properly and is paused during recovery mode.' ); + + printf( '

        %s

        ', $notice_text ); + + $error = wp_get_plugin_error( $plugin_file ); + + if ( false !== $error ) { + printf( '

        %s

        ', wp_get_extension_error_description( $error ) ); + } + } + + echo ''; + break; + default: + $classes = "$column_name column-$column_name $class"; + + echo ""; + + /** + * Fires inside each custom column of the Plugins list table. + * + * @since 3.1.0 + * + * @param string $column_name Name of the column. + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @param array $plugin_data An array of plugin data. + */ + do_action( 'manage_plugins_custom_column', $column_name, $plugin_file, $plugin_data ); + + echo ''; + } + } + + echo ''; + + /** + * Fires after each row in the Plugins list table. + * + * @since 2.3.0 + * + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @param array $plugin_data An array of plugin data. + * @param string $status Status of the plugin. Defaults are 'All', 'Active', + * 'Inactive', 'Recently Activated', 'Upgrade', 'Must-Use', + * 'Drop-ins', 'Search', 'Paused'. + */ + do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status ); + + /** + * Fires after each specific row in the Plugins list table. + * + * The dynamic portion of the hook name, `$plugin_file`, refers to the path + * to the plugin file, relative to the plugins directory. + * + * @since 2.7.0 + * + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @param array $plugin_data An array of plugin data. + * @param string $status Status of the plugin. Defaults are 'All', 'Active', + * 'Inactive', 'Recently Activated', 'Upgrade', 'Must-Use', + * 'Drop-ins', 'Search', 'Paused'. + */ + do_action( "after_plugin_row_{$plugin_file}", $plugin_file, $plugin_data, $status ); + } + + /** + * Gets the name of the primary column for this specific list table. + * + * @since 4.3.0 + * + * @return string Unalterable name for the primary column, in this case, 'name'. + */ + protected function get_primary_column_name() { + return 'name'; + } +} diff --git a/wp-admin/includes/class-wp-post-comments-list-table.php b/wp-admin/includes/class-wp-post-comments-list-table.php new file mode 100644 index 0000000..29dc286 --- /dev/null +++ b/wp-admin/includes/class-wp-post-comments-list-table.php @@ -0,0 +1,78 @@ + __( 'Author' ), + 'comment' => _x( 'Comment', 'column name' ), + ), + array(), + array(), + 'comment', + ); + } + + /** + * @return array + */ + protected function get_table_classes() { + $classes = parent::get_table_classes(); + $classes[] = 'wp-list-table'; + $classes[] = 'comments-box'; + return $classes; + } + + /** + * @param bool $output_empty + */ + public function display( $output_empty = false ) { + $singular = $this->_args['singular']; + + wp_nonce_field( 'fetch-list-' . get_class( $this ), '_ajax_fetch_list_nonce' ); + ?> + + + > + display_rows_or_placeholder(); + } + ?> + + + 'posts', + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ) + ); + + $post_type = $this->screen->post_type; + $post_type_object = get_post_type_object( $post_type ); + + $exclude_states = get_post_stati( + array( + 'show_in_admin_all_list' => false, + ) + ); + $this->user_posts_count = intval( + $wpdb->get_var( + $wpdb->prepare( + " + SELECT COUNT( 1 ) + FROM $wpdb->posts + WHERE post_type = %s + AND post_status NOT IN ( '" . implode( "','", $exclude_states ) . "' ) + AND post_author = %d + ", + $post_type, + get_current_user_id() + ) + ) + ); + + if ( $this->user_posts_count && ! current_user_can( $post_type_object->cap->edit_others_posts ) && empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['all_posts'] ) && empty( $_REQUEST['author'] ) && empty( $_REQUEST['show_sticky'] ) ) { + $_GET['author'] = get_current_user_id(); + } + + $sticky_posts = get_option( 'sticky_posts' ); + if ( 'post' === $post_type && $sticky_posts ) { + $sticky_posts = implode( ', ', array_map( 'absint', (array) $sticky_posts ) ); + $this->sticky_posts_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT( 1 ) FROM $wpdb->posts WHERE post_type = %s AND post_status NOT IN ('trash', 'auto-draft') AND ID IN ($sticky_posts)", $post_type ) ); + } + } + + /** + * Sets whether the table layout should be hierarchical or not. + * + * @since 4.2.0 + * + * @param bool $display Whether the table layout should be hierarchical. + */ + public function set_hierarchical_display( $display ) { + $this->hierarchical_display = $display; + } + + /** + * @return bool + */ + public function ajax_user_can() { + return current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_posts ); + } + + /** + * @global array $avail_post_stati + * @global WP_Query $wp_query WordPress Query object. + * @global int $per_page + * @global string $mode + */ + public function prepare_items() { + global $avail_post_stati, $wp_query, $per_page, $mode; + + // Is going to call wp(). + $avail_post_stati = wp_edit_posts_query(); + + $this->set_hierarchical_display( is_post_type_hierarchical( $this->screen->post_type ) && 'menu_order title' === $wp_query->query['orderby'] ); + + $post_type = $this->screen->post_type; + $per_page = $this->get_items_per_page( 'edit_' . $post_type . '_per_page' ); + + /** This filter is documented in wp-admin/includes/post.php */ + $per_page = apply_filters( 'edit_posts_per_page', $per_page, $post_type ); + + if ( $this->hierarchical_display ) { + $total_items = $wp_query->post_count; + } elseif ( $wp_query->found_posts || $this->get_pagenum() === 1 ) { + $total_items = $wp_query->found_posts; + } else { + $post_counts = (array) wp_count_posts( $post_type, 'readable' ); + + if ( isset( $_REQUEST['post_status'] ) && in_array( $_REQUEST['post_status'], $avail_post_stati ) ) { + $total_items = $post_counts[ $_REQUEST['post_status'] ]; + } elseif ( isset( $_REQUEST['show_sticky'] ) && $_REQUEST['show_sticky'] ) { + $total_items = $this->sticky_posts_count; + } elseif ( isset( $_GET['author'] ) && get_current_user_id() == $_GET['author'] ) { + $total_items = $this->user_posts_count; + } else { + $total_items = array_sum( $post_counts ); + + // Subtract post types that are not included in the admin all list. + foreach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) { + $total_items -= $post_counts[ $state ]; + } + } + } + + if ( ! empty( $_REQUEST['mode'] ) ) { + $mode = 'excerpt' === $_REQUEST['mode'] ? 'excerpt' : 'list'; + set_user_setting( 'posts_list_mode', $mode ); + } else { + $mode = get_user_setting( 'posts_list_mode', 'list' ); + } + + $this->is_trash = isset( $_REQUEST['post_status'] ) && 'trash' === $_REQUEST['post_status']; + + $this->set_pagination_args( + array( + 'total_items' => $total_items, + 'per_page' => $per_page, + ) + ); + } + + /** + * @return bool + */ + public function has_items() { + return have_posts(); + } + + /** + */ + public function no_items() { + if ( isset( $_REQUEST['post_status'] ) && 'trash' === $_REQUEST['post_status'] ) { + echo get_post_type_object( $this->screen->post_type )->labels->not_found_in_trash; + } else { + echo get_post_type_object( $this->screen->post_type )->labels->not_found; + } + } + + /** + * Determine if the current view is the "All" view. + * + * @since 4.2.0 + * + * @return bool Whether the current view is the "All" view. + */ + protected function is_base_request() { + $vars = $_GET; + unset( $vars['paged'] ); + + if ( empty( $vars ) ) { + return true; + } elseif ( 1 === count( $vars ) && ! empty( $vars['post_type'] ) ) { + return $this->screen->post_type === $vars['post_type']; + } + + return 1 === count( $vars ) && ! empty( $vars['mode'] ); + } + + /** + * Helper to create links to edit.php with params. + * + * @since 4.4.0 + * + * @param string[] $args Associative array of URL parameters for the link. + * @param string $label Link text. + * @param string $class Optional. Class attribute. Default empty string. + * @return string The formatted link string. + */ + protected function get_edit_link( $args, $label, $class = '' ) { + $url = add_query_arg( $args, 'edit.php' ); + + $class_html = ''; + $aria_current = ''; + if ( ! empty( $class ) ) { + $class_html = sprintf( + ' class="%s"', + esc_attr( $class ) + ); + + if ( 'current' === $class ) { + $aria_current = ' aria-current="page"'; + } + } + + return sprintf( + '%s', + esc_url( $url ), + $class_html, + $aria_current, + $label + ); + } + + /** + * @global array $locked_post_status This seems to be deprecated. + * @global array $avail_post_stati + * @return array + */ + protected function get_views() { + global $locked_post_status, $avail_post_stati; + + $post_type = $this->screen->post_type; + + if ( ! empty( $locked_post_status ) ) { + return array(); + } + + $status_links = array(); + $num_posts = wp_count_posts( $post_type, 'readable' ); + $total_posts = array_sum( (array) $num_posts ); + $class = ''; + + $current_user_id = get_current_user_id(); + $all_args = array( 'post_type' => $post_type ); + $mine = ''; + + // Subtract post types that are not included in the admin all list. + foreach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) { + $total_posts -= $num_posts->$state; + } + + if ( $this->user_posts_count && $this->user_posts_count !== $total_posts ) { + if ( isset( $_GET['author'] ) && ( $_GET['author'] == $current_user_id ) ) { + $class = 'current'; + } + + $mine_args = array( + 'post_type' => $post_type, + 'author' => $current_user_id, + ); + + $mine_inner_html = sprintf( + /* translators: %s: Number of posts. */ + _nx( + 'Mine (%s)', + 'Mine (%s)', + $this->user_posts_count, + 'posts' + ), + number_format_i18n( $this->user_posts_count ) + ); + + $mine = $this->get_edit_link( $mine_args, $mine_inner_html, $class ); + + $all_args['all_posts'] = 1; + $class = ''; + } + + if ( empty( $class ) && ( $this->is_base_request() || isset( $_REQUEST['all_posts'] ) ) ) { + $class = 'current'; + } + + $all_inner_html = sprintf( + /* translators: %s: Number of posts. */ + _nx( + 'All (%s)', + 'All (%s)', + $total_posts, + 'posts' + ), + number_format_i18n( $total_posts ) + ); + + $status_links['all'] = $this->get_edit_link( $all_args, $all_inner_html, $class ); + if ( $mine ) { + $status_links['mine'] = $mine; + } + + foreach ( get_post_stati( array( 'show_in_admin_status_list' => true ), 'objects' ) as $status ) { + $class = ''; + + $status_name = $status->name; + + if ( ! in_array( $status_name, $avail_post_stati ) || empty( $num_posts->$status_name ) ) { + continue; + } + + if ( isset( $_REQUEST['post_status'] ) && $status_name === $_REQUEST['post_status'] ) { + $class = 'current'; + } + + $status_args = array( + 'post_status' => $status_name, + 'post_type' => $post_type, + ); + + $status_label = sprintf( + translate_nooped_plural( $status->label_count, $num_posts->$status_name ), + number_format_i18n( $num_posts->$status_name ) + ); + + $status_links[ $status_name ] = $this->get_edit_link( $status_args, $status_label, $class ); + } + + if ( ! empty( $this->sticky_posts_count ) ) { + $class = ! empty( $_REQUEST['show_sticky'] ) ? 'current' : ''; + + $sticky_args = array( + 'post_type' => $post_type, + 'show_sticky' => 1, + ); + + $sticky_inner_html = sprintf( + /* translators: %s: Number of posts. */ + _nx( + 'Sticky (%s)', + 'Sticky (%s)', + $this->sticky_posts_count, + 'posts' + ), + number_format_i18n( $this->sticky_posts_count ) + ); + + $sticky_link = array( + 'sticky' => $this->get_edit_link( $sticky_args, $sticky_inner_html, $class ), + ); + + // Sticky comes after Publish, or if not listed, after All. + $split = 1 + array_search( ( isset( $status_links['publish'] ) ? 'publish' : 'all' ), array_keys( $status_links ) ); + $status_links = array_merge( array_slice( $status_links, 0, $split ), $sticky_link, array_slice( $status_links, $split ) ); + } + + return $status_links; + } + + /** + * @return array + */ + protected function get_bulk_actions() { + $actions = array(); + $post_type_obj = get_post_type_object( $this->screen->post_type ); + + if ( current_user_can( $post_type_obj->cap->edit_posts ) ) { + if ( $this->is_trash ) { + $actions['untrash'] = __( 'Restore' ); + } else { + $actions['edit'] = __( 'Edit' ); + } + } + + if ( current_user_can( $post_type_obj->cap->delete_posts ) ) { + if ( $this->is_trash || ! EMPTY_TRASH_DAYS ) { + $actions['delete'] = __( 'Delete Permanently' ); + } else { + $actions['trash'] = __( 'Move to Trash' ); + } + } + + return $actions; + } + + /** + * Displays a categories drop-down for filtering on the Posts list table. + * + * @since 4.6.0 + * + * @global int $cat Currently selected category. + * + * @param string $post_type Post type slug. + */ + protected function categories_dropdown( $post_type ) { + global $cat; + + /** + * Filters whether to remove the 'Categories' drop-down from the post list table. + * + * @since 4.6.0 + * + * @param bool $disable Whether to disable the categories drop-down. Default false. + * @param string $post_type Post type slug. + */ + if ( false !== apply_filters( 'disable_categories_dropdown', false, $post_type ) ) { + return; + } + + if ( is_object_in_taxonomy( $post_type, 'category' ) ) { + $dropdown_options = array( + 'show_option_all' => get_taxonomy( 'category' )->labels->all_items, + 'hide_empty' => 0, + 'hierarchical' => 1, + 'show_count' => 0, + 'orderby' => 'name', + 'selected' => $cat, + ); + + echo ''; + wp_dropdown_categories( $dropdown_options ); + } + } + + /** + * Displays a formats drop-down for filtering items. + * + * @since 5.2.0 + * @access protected + * + * @param string $post_type Post type key. + */ + protected function formats_dropdown( $post_type ) { + /** + * Filters whether to remove the 'Formats' drop-down from the post list table. + * + * @since 5.2.0 + * + * @param bool $disable Whether to disable the drop-down. Default false. + */ + if ( apply_filters( 'disable_formats_dropdown', false ) ) { + return; + } + + // Make sure the dropdown shows only formats with a post count greater than 0. + $used_post_formats = get_terms( + array( + 'taxonomy' => 'post_format', + 'hide_empty' => true, + ) + ); + + /* + * Return if the post type doesn't have post formats, or there are no posts using formats, + * or if we're in the Trash. + */ + if ( ! is_object_in_taxonomy( $post_type, 'post_format' ) || ! $used_post_formats || $this->is_trash ) { + return; + } + + $displayed_post_format = isset( $_GET['post_format'] ) ? $_GET['post_format'] : ''; + ?> + + + +
        + months_dropdown( $this->screen->post_type ); + $this->categories_dropdown( $this->screen->post_type ); + $this->formats_dropdown( $this->screen->post_type ); + + /** + * Fires before the Filter button on the Posts and Pages list tables. + * + * The Filter button allows sorting by date and/or category on the + * Posts list table, and sorting by date on the Pages list table. + * + * @since 2.1.0 + * @since 4.4.0 The `$post_type` parameter was added. + * @since 4.6.0 The `$which` parameter was added. + * + * @param string $post_type The post type slug. + * @param string $which The location of the extra table nav markup: + * 'top' or 'bottom' for WP_Posts_List_Table, + * 'bar' for WP_Media_List_Table. + */ + do_action( 'restrict_manage_posts', $this->screen->post_type, $which ); + + $output = ob_get_clean(); + + if ( ! empty( $output ) ) { + echo $output; + submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) ); + } + } + + if ( $this->is_trash && current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_others_posts ) && $this->has_items() ) { + submit_button( __( 'Empty Trash' ), 'apply', 'delete_all', false ); + } + ?> +
        + screen->post_type ) ? 'pages' : 'posts' ); + } + + /** + * @return array + */ + public function get_columns() { + $post_type = $this->screen->post_type; + + $posts_columns = array(); + + $posts_columns['cb'] = ''; + + /* translators: Posts screen column name. */ + $posts_columns['title'] = _x( 'Title', 'column name' ); + + if ( post_type_supports( $post_type, 'author' ) ) { + $posts_columns['author'] = __( 'Author' ); + } + + $taxonomies = get_object_taxonomies( $post_type, 'objects' ); + $taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' ); + + /** + * Filters the taxonomy columns in the Posts list table. + * + * The dynamic portion of the hook name, `$post_type`, refers to the post + * type slug. + * + * @since 3.5.0 + * + * @param string[] $taxonomies Array of taxonomy names to show columns for. + * @param string $post_type The post type. + */ + $taxonomies = apply_filters( "manage_taxonomies_for_{$post_type}_columns", $taxonomies, $post_type ); + $taxonomies = array_filter( $taxonomies, 'taxonomy_exists' ); + + foreach ( $taxonomies as $taxonomy ) { + if ( 'category' === $taxonomy ) { + $column_key = 'categories'; + } elseif ( 'post_tag' === $taxonomy ) { + $column_key = 'tags'; + } else { + $column_key = 'taxonomy-' . $taxonomy; + } + + $posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name; + } + + $post_status = ! empty( $_REQUEST['post_status'] ) ? $_REQUEST['post_status'] : 'all'; + if ( post_type_supports( $post_type, 'comments' ) && ! in_array( $post_status, array( 'pending', 'draft', 'future' ) ) ) { + $posts_columns['comments'] = '' . __( 'Comments' ) . ''; + } + + $posts_columns['date'] = __( 'Date' ); + + if ( 'page' === $post_type ) { + + /** + * Filters the columns displayed in the Pages list table. + * + * @since 2.5.0 + * + * @param string[] $post_columns An associative array of column headings. + */ + $posts_columns = apply_filters( 'manage_pages_columns', $posts_columns ); + } else { + + /** + * Filters the columns displayed in the Posts list table. + * + * @since 1.5.0 + * + * @param string[] $post_columns An associative array of column headings. + * @param string $post_type The post type slug. + */ + $posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type ); + } + + /** + * Filters the columns displayed in the Posts list table for a specific post type. + * + * The dynamic portion of the hook name, `$post_type`, refers to the post type slug. + * + * @since 3.0.0 + * + * @param string[] $post_columns An associative array of column headings. + */ + return apply_filters( "manage_{$post_type}_posts_columns", $posts_columns ); + } + + /** + * @return array + */ + protected function get_sortable_columns() { + return array( + 'title' => 'title', + 'parent' => 'parent', + 'comments' => 'comment_count', + 'date' => array( 'date', true ), + ); + } + + /** + * @global WP_Query $wp_query WordPress Query object. + * @global int $per_page + * @param array $posts + * @param int $level + */ + public function display_rows( $posts = array(), $level = 0 ) { + global $wp_query, $per_page; + + if ( empty( $posts ) ) { + $posts = $wp_query->posts; + } + + add_filter( 'the_title', 'esc_html' ); + + if ( $this->hierarchical_display ) { + $this->_display_rows_hierarchical( $posts, $this->get_pagenum(), $per_page ); + } else { + $this->_display_rows( $posts, $level ); + } + } + + /** + * @param array $posts + * @param int $level + */ + private function _display_rows( $posts, $level = 0 ) { + $post_type = $this->screen->post_type; + + // Create array of post IDs. + $post_ids = array(); + + foreach ( $posts as $a_post ) { + $post_ids[] = $a_post->ID; + } + + if ( post_type_supports( $post_type, 'comments' ) ) { + $this->comment_pending_count = get_pending_comments_num( $post_ids ); + } + + foreach ( $posts as $post ) { + $this->single_row( $post, $level ); + } + } + + /** + * @global wpdb $wpdb WordPress database abstraction object. + * @global WP_Post $post Global post object. + * @param array $pages + * @param int $pagenum + * @param int $per_page + */ + private function _display_rows_hierarchical( $pages, $pagenum = 1, $per_page = 20 ) { + global $wpdb; + + $level = 0; + + if ( ! $pages ) { + $pages = get_pages( array( 'sort_column' => 'menu_order' ) ); + + if ( ! $pages ) { + return; + } + } + + /* + * Arrange pages into two parts: top level pages and children_pages + * children_pages is two dimensional array, eg. + * children_pages[10][] contains all sub-pages whose parent is 10. + * It only takes O( N ) to arrange this and it takes O( 1 ) for subsequent lookup operations + * If searching, ignore hierarchy and treat everything as top level + */ + if ( empty( $_REQUEST['s'] ) ) { + + $top_level_pages = array(); + $children_pages = array(); + + foreach ( $pages as $page ) { + + // Catch and repair bad pages. + if ( $page->post_parent == $page->ID ) { + $page->post_parent = 0; + $wpdb->update( $wpdb->posts, array( 'post_parent' => 0 ), array( 'ID' => $page->ID ) ); + clean_post_cache( $page ); + } + + if ( 0 == $page->post_parent ) { + $top_level_pages[] = $page; + } else { + $children_pages[ $page->post_parent ][] = $page; + } + } + + $pages = &$top_level_pages; + } + + $count = 0; + $start = ( $pagenum - 1 ) * $per_page; + $end = $start + $per_page; + $to_display = array(); + + foreach ( $pages as $page ) { + if ( $count >= $end ) { + break; + } + + if ( $count >= $start ) { + $to_display[ $page->ID ] = $level; + } + + $count++; + + if ( isset( $children_pages ) ) { + $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display ); + } + } + + // If it is the last pagenum and there are orphaned pages, display them with paging as well. + if ( isset( $children_pages ) && $count < $end ) { + foreach ( $children_pages as $orphans ) { + foreach ( $orphans as $op ) { + if ( $count >= $end ) { + break; + } + + if ( $count >= $start ) { + $to_display[ $op->ID ] = 0; + } + + $count++; + } + } + } + + $ids = array_keys( $to_display ); + _prime_post_caches( $ids ); + + if ( ! isset( $GLOBALS['post'] ) ) { + $GLOBALS['post'] = reset( $ids ); + } + + foreach ( $to_display as $page_id => $level ) { + echo "\t"; + $this->single_row( $page_id, $level ); + } + } + + /** + * Given a top level page ID, display the nested hierarchy of sub-pages + * together with paging support + * + * @since 3.1.0 (Standalone function exists since 2.6.0) + * @since 4.2.0 Added the `$to_display` parameter. + * + * @param array $children_pages + * @param int $count + * @param int $parent + * @param int $level + * @param int $pagenum + * @param int $per_page + * @param array $to_display List of pages to be displayed. Passed by reference. + */ + private function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page, &$to_display ) { + if ( ! isset( $children_pages[ $parent ] ) ) { + return; + } + + $start = ( $pagenum - 1 ) * $per_page; + $end = $start + $per_page; + + foreach ( $children_pages[ $parent ] as $page ) { + if ( $count >= $end ) { + break; + } + + // If the page starts in a subtree, print the parents. + if ( $count == $start && $page->post_parent > 0 ) { + $my_parents = array(); + $my_parent = $page->post_parent; + while ( $my_parent ) { + // Get the ID from the list or the attribute if my_parent is an object. + $parent_id = $my_parent; + if ( is_object( $my_parent ) ) { + $parent_id = $my_parent->ID; + } + + $my_parent = get_post( $parent_id ); + $my_parents[] = $my_parent; + if ( ! $my_parent->post_parent ) { + break; + } + $my_parent = $my_parent->post_parent; + } + $num_parents = count( $my_parents ); + while ( $my_parent = array_pop( $my_parents ) ) { + $to_display[ $my_parent->ID ] = $level - $num_parents; + $num_parents--; + } + } + + if ( $count >= $start ) { + $to_display[ $page->ID ] = $level; + } + + $count++; + + $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display ); + } + + unset( $children_pages[ $parent ] ); // Required in order to keep track of orphans. + } + + /** + * Handles the checkbox column output. + * + * @since 4.3.0 + * + * @param WP_Post $post The current WP_Post object. + */ + public function column_cb( $post ) { + if ( current_user_can( 'edit_post', $post->ID ) ) : + ?> + + +
        + + + + +
        + '; + echo $this->column_title( $post ); + echo $this->handle_row_actions( $post, 'title', $primary ); + echo ''; + } + + /** + * Handles the title column output. + * + * @since 4.3.0 + * + * @global string $mode List table view mode. + * + * @param WP_Post $post The current WP_Post object. + */ + public function column_title( $post ) { + global $mode; + + if ( $this->hierarchical_display ) { + if ( 0 === $this->current_level && (int) $post->post_parent > 0 ) { + // Sent level 0 by accident, by default, or because we don't know the actual level. + $find_main_page = (int) $post->post_parent; + while ( $find_main_page > 0 ) { + $parent = get_post( $find_main_page ); + + if ( is_null( $parent ) ) { + break; + } + + $this->current_level++; + $find_main_page = (int) $parent->post_parent; + + if ( ! isset( $parent_name ) ) { + /** This filter is documented in wp-includes/post-template.php */ + $parent_name = apply_filters( 'the_title', $parent->post_title, $parent->ID ); + } + } + } + } + + $can_edit_post = current_user_can( 'edit_post', $post->ID ); + + if ( $can_edit_post && 'trash' !== $post->post_status ) { + $lock_holder = wp_check_post_lock( $post->ID ); + + if ( $lock_holder ) { + $lock_holder = get_userdata( $lock_holder ); + $locked_avatar = get_avatar( $lock_holder->ID, 18 ); + /* translators: %s: User's display name. */ + $locked_text = esc_html( sprintf( __( '%s is currently editing' ), $lock_holder->display_name ) ); + } else { + $locked_avatar = ''; + $locked_text = ''; + } + + echo '
        ' . $locked_avatar . ' ' . $locked_text . "
        \n"; + } + + $pad = str_repeat( '— ', $this->current_level ); + echo ''; + + $title = _draft_or_post_title(); + + if ( $can_edit_post && 'trash' !== $post->post_status ) { + printf( + '%s%s', + get_edit_post_link( $post->ID ), + /* translators: %s: Post title. */ + esc_attr( sprintf( __( '“%s” (Edit)' ), $title ) ), + $pad, + $title + ); + } else { + printf( + '%s%s', + $pad, + $title + ); + } + _post_states( $post ); + + if ( isset( $parent_name ) ) { + $post_type_object = get_post_type_object( $post->post_type ); + echo ' | ' . $post_type_object->labels->parent_item_colon . ' ' . esc_html( $parent_name ); + } + echo "\n"; + + if ( ! is_post_type_hierarchical( $this->screen->post_type ) && 'excerpt' === $mode && current_user_can( 'read_post', $post->ID ) ) { + if ( post_password_required( $post ) ) { + echo '' . esc_html( get_the_excerpt() ) . ''; + } else { + echo esc_html( get_the_excerpt() ); + } + } + + get_inline_data( $post ); + } + + /** + * Handles the post date column output. + * + * @since 4.3.0 + * + * @global string $mode List table view mode. + * + * @param WP_Post $post The current WP_Post object. + */ + public function column_date( $post ) { + global $mode; + + if ( '0000-00-00 00:00:00' === $post->post_date ) { + $t_time = __( 'Unpublished' ); + $h_time = $t_time; + $time_diff = 0; + } else { + $t_time = get_the_time( __( 'Y/m/d g:i:s a' ), $post ); + $time = get_post_timestamp( $post ); + $time_diff = time() - $time; + + if ( $time && $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) { + /* translators: %s: Human-readable time difference. */ + $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) ); + } else { + $h_time = get_the_time( __( 'Y/m/d' ), $post ); + } + } + + if ( 'publish' === $post->post_status ) { + $status = __( 'Published' ); + } elseif ( 'future' === $post->post_status ) { + if ( $time_diff > 0 ) { + $status = '' . __( 'Missed schedule' ) . ''; + } else { + $status = __( 'Scheduled' ); + } + } else { + $status = __( 'Last Modified' ); + } + + /** + * Filters the status text of the post. + * + * @since 4.8.0 + * + * @param string $status The status text. + * @param WP_Post $post Post object. + * @param string $column_name The column name. + * @param string $mode The list display mode ('excerpt' or 'list'). + */ + $status = apply_filters( 'post_date_column_status', $status, $post, 'date', $mode ); + + if ( $status ) { + echo $status . '
        '; + } + + if ( 'excerpt' === $mode ) { + /** + * Filters the published time of the post. + * + * If `$mode` equals 'excerpt', the published time and date are both displayed. + * If `$mode` equals 'list' (default), the publish date is displayed, with the + * time and date together available as an abbreviation definition. + * + * @since 2.5.1 + * + * @param string $t_time The published time. + * @param WP_Post $post Post object. + * @param string $column_name The column name. + * @param string $mode The list display mode ('excerpt' or 'list'). + */ + echo apply_filters( 'post_date_column_time', $t_time, $post, 'date', $mode ); + } else { + + /** This filter is documented in wp-admin/includes/class-wp-posts-list-table.php */ + echo '' . apply_filters( 'post_date_column_time', $h_time, $post, 'date', $mode ) . ''; + } + } + + /** + * Handles the comments column output. + * + * @since 4.3.0 + * + * @param WP_Post $post The current WP_Post object. + */ + public function column_comments( $post ) { + ?> +
        + comment_pending_count[ $post->ID ] ) ? $this->comment_pending_count[ $post->ID ] : 0; + + $this->comments_bubble( $post->ID, $pending_comments ); + ?> +
        + $post->post_type, + 'author' => get_the_author_meta( 'ID' ), + ); + echo $this->get_edit_link( $args, get_the_author() ); + } + + /** + * Handles the default column output. + * + * @since 4.3.0 + * + * @param WP_Post $post The current WP_Post object. + * @param string $column_name The current column name. + */ + public function column_default( $post, $column_name ) { + if ( 'categories' === $column_name ) { + $taxonomy = 'category'; + } elseif ( 'tags' === $column_name ) { + $taxonomy = 'post_tag'; + } elseif ( 0 === strpos( $column_name, 'taxonomy-' ) ) { + $taxonomy = substr( $column_name, 9 ); + } else { + $taxonomy = false; + } + if ( $taxonomy ) { + $taxonomy_object = get_taxonomy( $taxonomy ); + $terms = get_the_terms( $post->ID, $taxonomy ); + if ( is_array( $terms ) ) { + $term_links = array(); + foreach ( $terms as $t ) { + $posts_in_term_qv = array(); + if ( 'post' != $post->post_type ) { + $posts_in_term_qv['post_type'] = $post->post_type; + } + if ( $taxonomy_object->query_var ) { + $posts_in_term_qv[ $taxonomy_object->query_var ] = $t->slug; + } else { + $posts_in_term_qv['taxonomy'] = $taxonomy; + $posts_in_term_qv['term'] = $t->slug; + } + + $label = esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) ); + + $term_links[] = $this->get_edit_link( $posts_in_term_qv, $label ); + } + + /** + * Filters the links in `$taxonomy` column of edit.php. + * + * @since 5.2.0 + * + * @param string[] $term_links Array of term editing links. + * @param string $taxonomy Taxonomy name. + * @param WP_Term[] $terms Array of term objects appearing in the post row. + */ + $term_links = apply_filters( 'post_column_taxonomy_links', $term_links, $taxonomy, $terms ); + + /* translators: Used between list items, there is a space after the comma. */ + echo join( __( ', ' ), $term_links ); + } else { + echo '' . $taxonomy_object->labels->no_terms . ''; + } + return; + } + + if ( is_post_type_hierarchical( $post->post_type ) ) { + + /** + * Fires in each custom column on the Posts list table. + * + * This hook only fires if the current post type is hierarchical, + * such as pages. + * + * @since 2.5.0 + * + * @param string $column_name The name of the column to display. + * @param int $post_id The current post ID. + */ + do_action( 'manage_pages_custom_column', $column_name, $post->ID ); + } else { + + /** + * Fires in each custom column in the Posts list table. + * + * This hook only fires if the current post type is non-hierarchical, + * such as posts. + * + * @since 1.5.0 + * + * @param string $column_name The name of the column to display. + * @param int $post_id The current post ID. + */ + do_action( 'manage_posts_custom_column', $column_name, $post->ID ); + } + + /** + * Fires for each custom column of a specific post type in the Posts list table. + * + * The dynamic portion of the hook name, `$post->post_type`, refers to the post type. + * + * @since 3.1.0 + * + * @param string $column_name The name of the column to display. + * @param int $post_id The current post ID. + */ + do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID ); + } + + /** + * @global WP_Post $post Global post object. + * + * @param int|WP_Post $post + * @param int $level + */ + public function single_row( $post, $level = 0 ) { + $global_post = get_post(); + + $post = get_post( $post ); + $this->current_level = $level; + + $GLOBALS['post'] = $post; + setup_postdata( $post ); + + $classes = 'iedit author-' . ( get_current_user_id() == $post->post_author ? 'self' : 'other' ); + + $lock_holder = wp_check_post_lock( $post->ID ); + if ( $lock_holder ) { + $classes .= ' wp-locked'; + } + + if ( $post->post_parent ) { + $count = count( get_post_ancestors( $post->ID ) ); + $classes .= ' level-' . $count; + } else { + $classes .= ' level-0'; + } + ?> + + single_row_columns( $post ); ?> + + post_type ); + $can_edit_post = current_user_can( 'edit_post', $post->ID ); + $actions = array(); + $title = _draft_or_post_title(); + + if ( $can_edit_post && 'trash' != $post->post_status ) { + $actions['edit'] = sprintf( + '%s', + get_edit_post_link( $post->ID ), + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'Edit “%s”' ), $title ) ), + __( 'Edit' ) + ); + + if ( 'wp_block' !== $post->post_type ) { + $actions['inline hide-if-no-js'] = sprintf( + '', + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'Quick edit “%s” inline' ), $title ) ), + __( 'Quick Edit' ) + ); + } + } + + if ( current_user_can( 'delete_post', $post->ID ) ) { + if ( 'trash' === $post->post_status ) { + $actions['untrash'] = sprintf( + '%s', + wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&action=untrash', $post->ID ) ), 'untrash-post_' . $post->ID ), + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'Restore “%s” from the Trash' ), $title ) ), + __( 'Restore' ) + ); + } elseif ( EMPTY_TRASH_DAYS ) { + $actions['trash'] = sprintf( + '%s', + get_delete_post_link( $post->ID ), + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'Move “%s” to the Trash' ), $title ) ), + _x( 'Trash', 'verb' ) + ); + } + if ( 'trash' === $post->post_status || ! EMPTY_TRASH_DAYS ) { + $actions['delete'] = sprintf( + '%s', + get_delete_post_link( $post->ID, '', true ), + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'Delete “%s” permanently' ), $title ) ), + __( 'Delete Permanently' ) + ); + } + } + + if ( is_post_type_viewable( $post_type_object ) ) { + if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ) ) ) { + if ( $can_edit_post ) { + $preview_link = get_preview_post_link( $post ); + $actions['view'] = sprintf( + '%s', + esc_url( $preview_link ), + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'Preview “%s”' ), $title ) ), + __( 'Preview' ) + ); + } + } elseif ( 'trash' != $post->post_status ) { + $actions['view'] = sprintf( + '%s', + get_permalink( $post->ID ), + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'View “%s”' ), $title ) ), + __( 'View' ) + ); + } + } + + if ( 'wp_block' === $post->post_type ) { + $actions['export'] = sprintf( + '', + $post->ID, + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'Export “%s” as JSON' ), $title ) ), + __( 'Export as JSON' ) + ); + } + + if ( is_post_type_hierarchical( $post->post_type ) ) { + + /** + * Filters the array of row action links on the Pages list table. + * + * The filter is evaluated only for hierarchical post types. + * + * @since 2.8.0 + * + * @param string[] $actions An array of row action links. Defaults are + * 'Edit', 'Quick Edit', 'Restore', 'Trash', + * 'Delete Permanently', 'Preview', and 'View'. + * @param WP_Post $post The post object. + */ + $actions = apply_filters( 'page_row_actions', $actions, $post ); + } else { + + /** + * Filters the array of row action links on the Posts list table. + * + * The filter is evaluated only for non-hierarchical post types. + * + * @since 2.8.0 + * + * @param string[] $actions An array of row action links. Defaults are + * 'Edit', 'Quick Edit', 'Restore', 'Trash', + * 'Delete Permanently', 'Preview', and 'View'. + * @param WP_Post $post The post object. + */ + $actions = apply_filters( 'post_row_actions', $actions, $post ); + } + + return $this->row_actions( $actions ); + } + + /** + * Outputs the hidden row displayed when inline editing + * + * @since 3.1.0 + * + * @global string $mode List table view mode. + */ + public function inline_edit() { + global $mode; + + $screen = $this->screen; + + $post = get_default_post_to_edit( $screen->post_type ); + $post_type_object = get_post_type_object( $screen->post_type ); + + $taxonomy_names = get_object_taxonomies( $screen->post_type ); + $hierarchical_taxonomies = array(); + $flat_taxonomies = array(); + + foreach ( $taxonomy_names as $taxonomy_name ) { + + $taxonomy = get_taxonomy( $taxonomy_name ); + + $show_in_quick_edit = $taxonomy->show_in_quick_edit; + + /** + * Filters whether the current taxonomy should be shown in the Quick Edit panel. + * + * @since 4.2.0 + * + * @param bool $show_in_quick_edit Whether to show the current taxonomy in Quick Edit. + * @param string $taxonomy_name Taxonomy name. + * @param string $post_type Post type of current Quick Edit post. + */ + if ( ! apply_filters( 'quick_edit_show_taxonomy', $show_in_quick_edit, $taxonomy_name, $screen->post_type ) ) { + continue; + } + + if ( $taxonomy->hierarchical ) { + $hierarchical_taxonomies[] = $taxonomy; + } else { + $flat_taxonomies[] = $taxonomy; + } + } + + $m = ( isset( $mode ) && 'excerpt' === $mode ) ? 'excerpt' : 'list'; + $can_publish = current_user_can( $post_type_object->cap->publish_posts ); + $core_columns = array( + 'cb' => true, + 'date' => true, + 'title' => true, + 'categories' => true, + 'tags' => true, + 'comments' => true, + 'author' => true, + ); + + ?> + +
        + + post_type}"; + $quick_edit_classes = "quick-edit-row quick-edit-row-$hclass inline-edit-{$screen->post_type}"; + + $bulk = 0; + while ( $bulk < 2 ) : + $classes = $inline_edit_classes . ' '; + $classes .= $bulk ? $bulk_edit_classes : $quick_edit_classes; + ?> + + + + +
        +
        + ID; + $nonce = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id ); + + $download_data_markup = '
        '; + + $download_data_markup .= '' . + '' . + '' . + ''; + + $download_data_markup .= '
        '; + + $row_actions = array( + 'download-data' => $download_data_markup, + ); + + return sprintf( '%2$s %3$s', esc_url( 'mailto:' . $item->email ), $item->email, $this->row_actions( $row_actions ) ); + } + + /** + * Displays the next steps column. + * + * @since 4.9.6 + * + * @param WP_User_Request $item Item being shown. + */ + public function column_next_steps( $item ) { + $status = $item->status; + + switch ( $status ) { + case 'request-pending': + esc_html_e( 'Waiting for confirmation' ); + break; + case 'request-confirmed': + /** This filter is documented in wp-admin/includes/ajax-actions.php */ + $exporters = apply_filters( 'wp_privacy_personal_data_exporters', array() ); + $exporters_count = count( $exporters ); + $request_id = $item->ID; + $nonce = wp_create_nonce( 'wp-privacy-export-personal-data-' . $request_id ); + + echo '
        '; + + ?> + + + + + '; + break; + case 'request-failed': + echo ''; + break; + case 'request-completed': + echo '' . esc_html__( 'Remove request' ) . ''; + break; + } + } +} diff --git a/wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php b/wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php new file mode 100644 index 0000000..f02ca85 --- /dev/null +++ b/wp-admin/includes/class-wp-privacy-data-removal-requests-list-table.php @@ -0,0 +1,137 @@ +status; + if ( 'request-confirmed' !== $status ) { + /** This filter is documented in wp-admin/includes/ajax-actions.php */ + $erasers = apply_filters( 'wp_privacy_personal_data_erasers', array() ); + $erasers_count = count( $erasers ); + $request_id = $item->ID; + $nonce = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id ); + + $remove_data_markup = '
        '; + + $remove_data_markup .= '' . + '' . + '' . + ''; + + $remove_data_markup .= '
        '; + + $row_actions = array( + 'remove-data' => $remove_data_markup, + ); + } + + return sprintf( '%2$s %3$s', esc_url( 'mailto:' . $item->email ), $item->email, $this->row_actions( $row_actions ) ); + } + + /** + * Next steps column. + * + * @since 4.9.6 + * + * @param WP_User_Request $item Item being shown. + */ + public function column_next_steps( $item ) { + $status = $item->status; + + switch ( $status ) { + case 'request-pending': + esc_html_e( 'Waiting for confirmation' ); + break; + case 'request-confirmed': + /** This filter is documented in wp-admin/includes/ajax-actions.php */ + $erasers = apply_filters( 'wp_privacy_personal_data_erasers', array() ); + $erasers_count = count( $erasers ); + $request_id = $item->ID; + $nonce = wp_create_nonce( 'wp-privacy-erase-personal-data-' . $request_id ); + + echo '
        '; + + ?> + + + + + '; + + break; + case 'request-failed': + echo ''; + break; + case 'request-completed': + echo '' . esc_html__( 'Remove request' ) . ''; + break; + } + } + +} diff --git a/wp-admin/includes/class-wp-privacy-policy-content.php b/wp-admin/includes/class-wp-privacy-policy-content.php new file mode 100644 index 0000000..c252bde --- /dev/null +++ b/wp-admin/includes/class-wp-privacy-policy-content.php @@ -0,0 +1,726 @@ + $plugin_name, + 'policy_text' => $policy_text, + ); + + if ( ! in_array( $data, self::$policy_content, true ) ) { + self::$policy_content[] = $data; + } + } + + /** + * Quick check if any privacy info has changed. + * + * @since 4.9.6 + */ + public static function text_change_check() { + + $policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' ); + + // The site doesn't have a privacy policy. + if ( empty( $policy_page_id ) ) { + return false; + } + + if ( ! current_user_can( 'edit_post', $policy_page_id ) ) { + return false; + } + + $old = (array) get_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content' ); + + // Updates are not relevant if the user has not reviewed any suggestions yet. + if ( empty( $old ) ) { + return false; + } + + $cached = get_option( '_wp_suggested_policy_text_has_changed' ); + + /* + * When this function is called before `admin_init`, `self::$policy_content` + * has not been populated yet, so use the cached result from the last + * execution instead. + */ + if ( ! did_action( 'admin_init' ) ) { + return 'changed' === $cached; + } + + $new = self::$policy_content; + + // Remove the extra values added to the meta. + foreach ( $old as $key => $data ) { + if ( ! empty( $data['removed'] ) ) { + unset( $old[ $key ] ); + continue; + } + + $old[ $key ] = array( + 'plugin_name' => $data['plugin_name'], + 'policy_text' => $data['policy_text'], + ); + } + + // Normalize the order of texts, to facilitate comparison. + sort( $old ); + sort( $new ); + + // The == operator (equal, not identical) was used intentionally. + // See http://php.net/manual/en/language.operators.array.php + if ( $new != $old ) { + // A plugin was activated or deactivated, or some policy text has changed. + // Show a notice on the relevant screens to inform the admin. + add_action( 'admin_notices', array( 'WP_Privacy_Policy_Content', 'policy_text_changed_notice' ) ); + $state = 'changed'; + } else { + $state = 'not-changed'; + } + + // Cache the result for use before `admin_init` (see above). + if ( $cached !== $state ) { + update_option( '_wp_suggested_policy_text_has_changed', $state ); + } + + return 'changed' === $state; + } + + /** + * Output a warning when some privacy info has changed. + * + * @since 4.9.6 + */ + public static function policy_text_changed_notice() { + global $post; + + $screen = get_current_screen()->id; + + if ( 'privacy' !== $screen ) { + return; + } + + ?> +
        +

        + review the guide and update your privacy policy.' ), + esc_url( admin_url( 'privacy-policy-guide.php' ) ) + ); + ?> +

        +
        + $old_data ) { + if ( ! empty( $old_data['removed'] ) ) { + // Remove the old policy text. + $update_cache = true; + continue; + } + + if ( ! empty( $old_data['updated'] ) ) { + // 'updated' is now 'added'. + $done[] = array( + 'plugin_name' => $old_data['plugin_name'], + 'policy_text' => $old_data['policy_text'], + 'added' => $old_data['updated'], + ); + $update_cache = true; + } else { + $done[] = $old_data; + } + } + + if ( $update_cache ) { + delete_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content' ); + // Update the cache. + foreach ( $done as $data ) { + add_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content', $data ); + } + } + } + + /** + * Check for updated, added or removed privacy policy information from plugins. + * + * Caches the current info in post_meta of the policy page. + * + * @since 4.9.6 + * + * @return array The privacy policy text/information added by core and plugins. + */ + public static function get_suggested_policy_text() { + $policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' ); + $checked = array(); + $time = time(); + $update_cache = false; + $new = self::$policy_content; + $old = array(); + + if ( $policy_page_id ) { + $old = (array) get_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content' ); + } + + // Check for no-changes and updates. + foreach ( $new as $new_key => $new_data ) { + foreach ( $old as $old_key => $old_data ) { + $found = false; + + if ( $new_data['policy_text'] === $old_data['policy_text'] ) { + // Use the new plugin name in case it was changed, translated, etc. + if ( $old_data['plugin_name'] !== $new_data['plugin_name'] ) { + $old_data['plugin_name'] = $new_data['plugin_name']; + $update_cache = true; + } + + // A plugin was re-activated. + if ( ! empty( $old_data['removed'] ) ) { + unset( $old_data['removed'] ); + $old_data['added'] = $time; + $update_cache = true; + } + + $checked[] = $old_data; + $found = true; + } elseif ( $new_data['plugin_name'] === $old_data['plugin_name'] ) { + // The info for the policy was updated. + $checked[] = array( + 'plugin_name' => $new_data['plugin_name'], + 'policy_text' => $new_data['policy_text'], + 'updated' => $time, + ); + $found = true; + $update_cache = true; + } + + if ( $found ) { + unset( $new[ $new_key ], $old[ $old_key ] ); + continue 2; + } + } + } + + if ( ! empty( $new ) ) { + // A plugin was activated. + foreach ( $new as $new_data ) { + if ( ! empty( $new_data['plugin_name'] ) && ! empty( $new_data['policy_text'] ) ) { + $new_data['added'] = $time; + $checked[] = $new_data; + } + } + $update_cache = true; + } + + if ( ! empty( $old ) ) { + // A plugin was deactivated. + foreach ( $old as $old_data ) { + if ( ! empty( $old_data['plugin_name'] ) && ! empty( $old_data['policy_text'] ) ) { + $data = array( + 'plugin_name' => $old_data['plugin_name'], + 'policy_text' => $old_data['policy_text'], + 'removed' => $time, + ); + + $checked[] = $data; + } + } + $update_cache = true; + } + + if ( $update_cache && $policy_page_id ) { + delete_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content' ); + // Update the cache. + foreach ( $checked as $data ) { + add_post_meta( $policy_page_id, '_wp_suggested_privacy_policy_content', $data ); + } + } + + return $checked; + } + + /** + * Add a notice with a link to the guide when editing the privacy policy page. + * + * @since 4.9.6 + * @since 5.0.0 The `$post` parameter was made optional. + * + * @param WP_Post|null $post The currently edited post. Default null. + */ + public static function notice( $post = null ) { + if ( is_null( $post ) ) { + global $post; + } else { + $post = get_post( $post ); + } + + if ( ! ( $post instanceof WP_Post ) ) { + return; + } + + if ( ! current_user_can( 'manage_privacy_options' ) ) { + return; + } + + $current_screen = get_current_screen(); + $policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' ); + + if ( 'post' !== $current_screen->base || $policy_page_id !== $post->ID ) { + return; + } + + $message = __( 'Need help putting together your new Privacy Policy page? Check out our guide for recommendations on what content to include, along with policies suggested by your plugins and theme.' ); + $url = esc_url( admin_url( 'privacy-policy-guide.php' ) ); + $label = __( 'View Privacy Policy Guide.' ); + + if ( get_current_screen()->is_block_editor() ) { + wp_enqueue_script( 'wp-notices' ); + $action = array( + 'url' => $url, + 'label' => $label, + ); + wp_add_inline_script( + 'wp-notices', + sprintf( + 'wp.data.dispatch( "core/notices" ).createWarningNotice( "%s", { actions: [ %s ], isDismissible: false } )', + $message, + wp_json_encode( $action ) + ), + 'after' + ); + } else { + ?> +
        +

        + %s %s', + $url, + $label, + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ); + ?> +

        +
        + ' . __( 'Introduction' ) . '' ); + $date_format = __( 'F j, Y' ); + $copy = __( 'Copy this section to clipboard' ); + $return_to_top = '' . __( '↑ Return to Top' ) . ''; + + foreach ( $content_array as $section ) { + $class = ''; + $meta = ''; + $removed = ''; + + if ( ! empty( $section['removed'] ) ) { + $class = ' text-removed'; + $date = date_i18n( $date_format, $section['removed'] ); + /* translators: %s: Date of plugin deactivation. */ + $meta = sprintf( __( 'Removed %s.' ), $date ); + + /* translators: %s: Date of plugin deactivation. */ + $removed = __( 'You deactivated this plugin on %s and may no longer need this policy.' ); + $removed = '

        ' . sprintf( $removed, $date ) . '

        '; + } elseif ( ! empty( $section['updated'] ) ) { + $class = ' text-updated'; + $date = date_i18n( $date_format, $section['updated'] ); + /* translators: %s: Date of privacy policy text update. */ + $meta = sprintf( __( 'Updated %s.' ), $date ); + } + + if ( $meta ) { + $meta = '
        ' . $meta . ''; + } + + $plugin_name = esc_html( $section['plugin_name'] ); + $toc_id = 'wp-privacy-policy-guide-' . sanitize_title( $plugin_name ); + $toc[] = sprintf( '
      • %2$s' . $meta . '
      • ', $toc_id, $plugin_name ); + + $content .= '
        '; + $content .= ' '; + /* translators: %s: Plugin name. */ + $content .= '

        ' . sprintf( __( 'Source: %s' ), $plugin_name ) . '

        '; + $content .= $removed; + + $content .= '
        ' . $section['policy_text'] . '
        '; + $content .= $return_to_top; + + if ( empty( $section['removed'] ) ) { + $content .= '
        '; + $content .= ''; + $content .= '
        '; + } + + $content .= "
        \n"; // End of .privacy-text-section. + } + + if ( count( $toc ) > 2 ) { + ?> +
        +

        +
          + +
        +
        + +
        +
        +   +

        +

        +

        +

        +

        +

        +
        + +
        + +
        +
        + ' . __( 'Suggested text:' ) . ' ' : ''; + $content = ''; + $strings = array(); + + // Start of the suggested privacy policy text. + if ( $description ) { + $strings[] = '
        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Who we are' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this section you should note your site URL, as well as the name of the company, organization, or individual behind it, and some accurate contact information.' ) . '

        '; + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'The amount of information you may be required to show will vary depending on your local or national business regulations. You may, for example, be required to display a physical address, a registered address, or your company registration number.' ) . '

        '; + } + + /* translators: Default privacy policy text. %s: Site URL. */ + $strings[] = '

        ' . $suggested_text . sprintf( __( 'Our website address is: %s.' ), get_bloginfo( 'url', 'display' ) ) . '

        '; + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'What personal data we collect and why we collect it' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this section you should note what personal data you collect from users and site visitors. This may include personal data, such as name, email address, personal account preferences; transactional data, such as purchase information; and technical data, such as information about cookies.' ) . '

        '; + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'You should also note any collection and retention of sensitive personal data, such as data concerning health.' ) . '

        '; + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In addition to listing what personal data you collect, you need to note why you collect it. These explanations must note either the legal basis for your data collection and retention or the active consent the user has given.' ) . '

        '; + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'Personal data is not just created by a user’s interactions with your site. Personal data is also generated from technical processes such as contact forms, comments, cookies, analytics, and third party embeds.' ) . '

        '; + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'By default WordPress does not collect any personal data about visitors, and only collects the data shown on the User Profile screen from registered users. However some of your plugins may collect personal data. You should add the relevant information below.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Comments' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this subsection you should note what information is captured through comments. We have noted the data which WordPress collects by default.' ) . '

        '; + } + + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . $suggested_text . __( 'When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.' ) . '

        '; + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . __( 'An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment.' ) . '

        '; + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Media' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this subsection you should note what information may be disclosed by users who can upload media files. All uploaded files are usually publicly accessible.' ) . '

        '; + } + + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . $suggested_text . __( 'If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website.' ) . '

        '; + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Contact forms' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'By default, WordPress does not include a contact form. If you use a contact form plugin, use this subsection to note what personal data is captured when someone submits a contact form, and how long you keep it. For example, you may note that you keep contact form submissions for a certain period for customer service purposes, but you do not use the information submitted through them for marketing purposes.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Cookies' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this subsection you should list the cookies your web site uses, including those set by your plugins, social media, and analytics. We have provided the cookies which WordPress installs by default.' ) . '

        '; + } + + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . $suggested_text . __( 'If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year.' ) . '

        '; + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . __( 'If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser.' ) . '

        '; + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . __( 'When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed.' ) . '

        '; + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . __( 'If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day.' ) . '

        '; + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Embedded content from other websites' ) . '

        '; + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . $suggested_text . __( 'Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website.' ) . '

        '; + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . __( 'These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website.' ) . '

        '; + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Analytics' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this subsection you should note what analytics package you use, how users can opt out of analytics tracking, and a link to your analytics provider’s privacy policy, if any.' ) . '

        '; + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'By default WordPress does not collect any analytics data. However, many web hosting accounts collect some anonymous analytics data. You may also have installed a WordPress plugin that provides analytics services. In that case, add information from that plugin here.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Who we share your data with' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this section you should name and list all third party providers with whom you share site data, including partners, cloud-based services, payment processors, and third party service providers, and note what data you share with them and why. Link to their own privacy policies if possible.' ) . '

        '; + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'By default WordPress does not share any personal data with anyone.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'How long we retain your data' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this section you should explain how long you retain personal data collected or processed by the web site. While it is your responsibility to come up with the schedule of how long you keep each dataset for and why you keep it, that information does need to be listed here. For example, you may want to say that you keep contact form entries for six months, analytics records for a year, and customer purchase records for ten years.' ) . '

        '; + } + + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . $suggested_text . __( 'If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue.' ) . '

        '; + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . __( 'For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information.' ) . '

        '; + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'What rights you have over your data' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this section you should explain what rights your users have over their data and how they can invoke those rights.' ) . '

        '; + } + + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . $suggested_text . __( 'If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes.' ) . '

        '; + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Where we send your data' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this section you should list all transfers of your site data outside the European Union and describe the means by which that data is safeguarded to European data protection standards. This could include your web hosting, cloud storage, or other third party services.' ) . '

        '; + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'European data protection law requires data about European residents which is transferred outside the European Union to be safeguarded to the same standards as if the data was in Europe. So in addition to listing where data goes, you should describe how you ensure that these standards are met either by yourself or by your third party providers, whether that is through an agreement such as Privacy Shield, model clauses in your contracts, or binding corporate rules.' ) . '

        '; + } + + /* translators: Default privacy policy text. */ + $strings[] = '

        ' . $suggested_text . __( 'Visitor comments may be checked through an automated spam detection service.' ) . '

        '; + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Your contact information' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this section you should provide a contact method for privacy-specific concerns. If you are required to have a Data Protection Officer, list their name and full contact details here as well.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Additional information' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'If you use your site for commercial purposes and you engage in more complex collection or processing of personal data, you should note the following information in your privacy policy in addition to the information we have already discussed.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'How we protect your data' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this section you should explain what measures you have taken to protect your users’ data. This could include technical measures such as encryption; security measures such as two factor authentication; and measures such as staff training in data protection. If you have carried out a Privacy Impact Assessment, you can mention it here too.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'What data breach procedures we have in place' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'In this section you should explain what procedures you have in place to deal with data breaches, either potential or real, such as internal reporting systems, contact mechanisms, or bug bounties.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'What third parties we receive data from' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'If your web site receives data about users from third parties, including advertisers, this information must be included within the section of your privacy policy dealing with third party data.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'What automated decision making and/or profiling we do with user data' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'If your web site provides a service which includes automated decision making - for example, allowing customers to apply for credit, or aggregating their data into an advertising profile - you must note that this is taking place, and include information about how that information is used, what decisions are made with that aggregated data, and what rights users have over decisions made without human intervention.' ) . '

        '; + } + + /* translators: Default privacy policy heading. */ + $strings[] = '

        ' . __( 'Industry regulatory disclosure requirements' ) . '

        '; + + if ( $description ) { + /* translators: Privacy policy tutorial. */ + $strings[] = '

        ' . __( 'If you are a member of a regulated industry, or if you are subject to additional privacy laws, you may be required to disclose that information here.' ) . '

        '; + $strings[] = '
        '; + } + + if ( $blocks ) { + foreach ( $strings as $key => $string ) { + if ( 0 === strpos( $string, '

        ' ) ) { + $strings[ $key ] = '' . $string . ''; + } + + if ( 0 === strpos( $string, '

        ' ) ) { + $strings[ $key ] = '' . $string . ''; + } + + if ( 0 === strpos( $string, '

        ' ) ) { + $strings[ $key ] = '' . $string . ''; + } + } + } + + $content = implode( '', $strings ); + // End of the suggested privacy policy text. + + /** + * Filters the default content suggested for inclusion in a privacy policy. + * + * @since 4.9.6 + * @since 5.0.0 Added the `$strings`, `$description`, and `$blocks` parameters. + * + * @param string $content The default policy content. + * @param string[] $strings An array of privacy policy content strings. + * @param bool $description Whether policy descriptions should be included. + * @param bool $blocks Whether the content should be formatted for the block editor. + */ + return apply_filters( 'wp_get_default_privacy_policy_content', $content, $strings, $description, $blocks ); + } + + /** + * Add the suggested privacy policy text to the policy postbox. + * + * @since 4.9.6 + */ + public static function add_suggested_content() { + $content = self::get_default_content( true, false ); + wp_add_privacy_policy_content( __( 'WordPress' ), $content ); + } +} diff --git a/wp-admin/includes/class-wp-privacy-requests-table.php b/wp-admin/includes/class-wp-privacy-requests-table.php new file mode 100644 index 0000000..23c31b1 --- /dev/null +++ b/wp-admin/includes/class-wp-privacy-requests-table.php @@ -0,0 +1,451 @@ + '', + 'email' => __( 'Requester' ), + 'status' => __( 'Status' ), + 'created_timestamp' => __( 'Requested' ), + 'next_steps' => __( 'Next Steps' ), + ); + return $columns; + } + + /** + * Normalize the admin URL to the current page (by request_type). + * + * @since 5.3.0 + * + * @return string URL to the current admin page. + */ + protected function get_admin_url() { + $pagenow = str_replace( '_', '-', $this->request_type ); + + if ( 'remove-personal-data' === $pagenow ) { + $pagenow = 'erase-personal-data'; + } + + return admin_url( $pagenow . '.php' ); + } + + /** + * Get a list of sortable columns. + * + * @since 4.9.6 + * + * @return array Default sortable columns. + */ + protected function get_sortable_columns() { + /* + * The initial sorting is by 'Requested' (post_date) and descending. + * With initial sorting, the first click on 'Requested' should be ascending. + * With 'Requester' sorting active, the next click on 'Requested' should be descending. + */ + $desc_first = isset( $_GET['orderby'] ); + + return array( + 'email' => 'requester', + 'created_timestamp' => array( 'requested', $desc_first ), + ); + } + + /** + * Default primary column. + * + * @since 4.9.6 + * + * @return string Default primary column name. + */ + protected function get_default_primary_column_name() { + return 'email'; + } + + /** + * Count number of requests for each status. + * + * @since 4.9.6 + * + * @return object Number of posts for each status. + */ + protected function get_request_counts() { + global $wpdb; + + $cache_key = $this->post_type . '-' . $this->request_type; + $counts = wp_cache_get( $cache_key, 'counts' ); + + if ( false !== $counts ) { + return $counts; + } + + $query = " + SELECT post_status, COUNT( * ) AS num_posts + FROM {$wpdb->posts} + WHERE post_type = %s + AND post_name = %s + GROUP BY post_status"; + + $results = (array) $wpdb->get_results( $wpdb->prepare( $query, $this->post_type, $this->request_type ), ARRAY_A ); + $counts = array_fill_keys( get_post_stati(), 0 ); + + foreach ( $results as $row ) { + $counts[ $row['post_status'] ] = $row['num_posts']; + } + + $counts = (object) $counts; + wp_cache_set( $cache_key, $counts, 'counts' ); + + return $counts; + } + + /** + * Get an associative array ( id => link ) with the list of views available on this table. + * + * @since 4.9.6 + * + * @return string[] An array of HTML links keyed by their view. + */ + protected function get_views() { + $current_status = isset( $_REQUEST['filter-status'] ) ? sanitize_text_field( $_REQUEST['filter-status'] ) : ''; + $statuses = _wp_privacy_statuses(); + $views = array(); + $counts = $this->get_request_counts(); + $total_requests = absint( array_sum( (array) $counts ) ); + + // Normalized admin URL. + $admin_url = $this->get_admin_url(); + + $current_link_attributes = empty( $current_status ) ? ' class="current" aria-current="page"' : ''; + $status_label = sprintf( + /* translators: %s: Number of requests. */ + _nx( + 'All (%s)', + 'All (%s)', + $total_requests, + 'requests' + ), + number_format_i18n( $total_requests ) + ); + + $views['all'] = sprintf( + '%s', + esc_url( $admin_url ), + $current_link_attributes, + $status_label + ); + + foreach ( $statuses as $status => $label ) { + $post_status = get_post_status_object( $status ); + if ( ! $post_status ) { + continue; + } + + $current_link_attributes = $status === $current_status ? ' class="current" aria-current="page"' : ''; + $total_status_requests = absint( $counts->{$status} ); + + $status_label = sprintf( + translate_nooped_plural( $post_status->label_count, $total_status_requests ), + number_format_i18n( $total_status_requests ) + ); + + $status_link = add_query_arg( 'filter-status', $status, $admin_url ); + + $views[ $status ] = sprintf( + '%s', + esc_url( $status_link ), + $current_link_attributes, + $status_label + ); + } + + return $views; + } + + /** + * Get bulk actions. + * + * @since 4.9.6 + * + * @return string[] Array of bulk action labels keyed by their action. + */ + protected function get_bulk_actions() { + return array( + 'delete' => __( 'Delete Requests' ), + 'resend' => __( 'Resend Confirmation Requests' ), + ); + } + + /** + * Process bulk actions. + * + * @since 4.9.6 + */ + public function process_bulk_action() { + $action = $this->current_action(); + $request_ids = isset( $_REQUEST['request_id'] ) ? wp_parse_id_list( wp_unslash( $_REQUEST['request_id'] ) ) : array(); + + $count = 0; + + if ( $request_ids ) { + check_admin_referer( 'bulk-privacy_requests' ); + } + + switch ( $action ) { + case 'delete': + foreach ( $request_ids as $request_id ) { + if ( wp_delete_post( $request_id, true ) ) { + $count ++; + } + } + + add_settings_error( + 'bulk_action', + 'bulk_action', + /* translators: %d: Number of requests. */ + sprintf( _n( 'Deleted %d request', 'Deleted %d requests', $count ), $count ), + 'success' + ); + break; + case 'resend': + foreach ( $request_ids as $request_id ) { + $resend = _wp_privacy_resend_request( $request_id ); + + if ( $resend && ! is_wp_error( $resend ) ) { + $count++; + } + } + + add_settings_error( + 'bulk_action', + 'bulk_action', + /* translators: %d: Number of requests. */ + sprintf( _n( 'Re-sent %d request', 'Re-sent %d requests', $count ), $count ), + 'success' + ); + break; + } + } + + /** + * Prepare items to output. + * + * @since 4.9.6 + * @since 5.1.0 Added support for column sorting. + */ + public function prepare_items() { + $this->items = array(); + $posts_per_page = $this->get_items_per_page( $this->request_type . '_requests_per_page' ); + $args = array( + 'post_type' => $this->post_type, + 'post_name__in' => array( $this->request_type ), + 'posts_per_page' => $posts_per_page, + 'offset' => isset( $_REQUEST['paged'] ) ? max( 0, absint( $_REQUEST['paged'] ) - 1 ) * $posts_per_page : 0, + 'post_status' => 'any', + 's' => isset( $_REQUEST['s'] ) ? sanitize_text_field( $_REQUEST['s'] ) : '', + ); + + $orderby_mapping = array( + 'requester' => 'post_title', + 'requested' => 'post_date', + ); + + if ( isset( $_REQUEST['orderby'] ) && isset( $orderby_mapping[ $_REQUEST['orderby'] ] ) ) { + $args['orderby'] = $orderby_mapping[ $_REQUEST['orderby'] ]; + } + + if ( isset( $_REQUEST['order'] ) && in_array( strtoupper( $_REQUEST['order'] ), array( 'ASC', 'DESC' ), true ) ) { + $args['order'] = strtoupper( $_REQUEST['order'] ); + } + + if ( ! empty( $_REQUEST['filter-status'] ) ) { + $filter_status = isset( $_REQUEST['filter-status'] ) ? sanitize_text_field( $_REQUEST['filter-status'] ) : ''; + $args['post_status'] = $filter_status; + } + + $requests_query = new WP_Query( $args ); + $requests = $requests_query->posts; + + foreach ( $requests as $request ) { + $this->items[] = wp_get_user_request( $request->ID ); + } + + $this->items = array_filter( $this->items ); + + $this->set_pagination_args( + array( + 'total_items' => $requests_query->found_posts, + 'per_page' => $posts_per_page, + ) + ); + } + + /** + * Checkbox column. + * + * @since 4.9.6 + * + * @param WP_User_Request $item Item being shown. + * @return string Checkbox column markup. + */ + public function column_cb( $item ) { + return sprintf( '', esc_attr( $item->ID ) ); + } + + /** + * Status column. + * + * @since 4.9.6 + * + * @param WP_User_Request $item Item being shown. + * @return string Status column markup. + */ + public function column_status( $item ) { + $status = get_post_status( $item->ID ); + $status_object = get_post_status_object( $status ); + + if ( ! $status_object || empty( $status_object->label ) ) { + return '-'; + } + + $timestamp = false; + + switch ( $status ) { + case 'request-confirmed': + $timestamp = $item->confirmed_timestamp; + break; + case 'request-completed': + $timestamp = $item->completed_timestamp; + break; + } + + echo ''; + echo esc_html( $status_object->label ); + + if ( $timestamp ) { + echo ' (' . $this->get_timestamp_as_date( $timestamp ) . ')'; + } + + echo ''; + } + + /** + * Convert timestamp for display. + * + * @since 4.9.6 + * + * @param int $timestamp Event timestamp. + * @return string Human readable date. + */ + protected function get_timestamp_as_date( $timestamp ) { + if ( empty( $timestamp ) ) { + return ''; + } + + $time_diff = time() - $timestamp; + + if ( $time_diff >= 0 && $time_diff < DAY_IN_SECONDS ) { + /* translators: %s: Human-readable time difference. */ + return sprintf( __( '%s ago' ), human_time_diff( $timestamp ) ); + } + + return date_i18n( get_option( 'date_format' ), $timestamp ); + } + + /** + * Default column handler. + * + * @since 4.9.6 + * + * @param WP_User_Request $item Item being shown. + * @param string $column_name Name of column being shown. + * @return string Default column output. + */ + public function column_default( $item, $column_name ) { + $cell_value = $item->$column_name; + + if ( in_array( $column_name, array( 'created_timestamp' ), true ) ) { + return $this->get_timestamp_as_date( $cell_value ); + } + + return $cell_value; + } + + /** + * Actions column. Overridden by children. + * + * @since 4.9.6 + * + * @param WP_User_Request $item Item being shown. + * @return string Email column markup. + */ + public function column_email( $item ) { + return sprintf( '%2$s %3$s', esc_url( 'mailto:' . $item->email ), $item->email, $this->row_actions( array() ) ); + } + + /** + * Next steps column. Overridden by children. + * + * @since 4.9.6 + * + * @param WP_User_Request $item Item being shown. + */ + public function column_next_steps( $item ) {} + + /** + * Generates content for a single row of the table, + * + * @since 4.9.6 + * + * @param WP_User_Request $item The current item. + */ + public function single_row( $item ) { + $status = $item->status; + + echo ''; + $this->single_row_columns( $item ); + echo ''; + } + + /** + * Embed scripts used to perform actions. Overridden by children. + * + * @since 4.9.6 + */ + public function embed_scripts() {} +} diff --git a/wp-admin/includes/class-wp-screen.php b/wp-admin/includes/class-wp-screen.php new file mode 100644 index 0000000..3a06e3a --- /dev/null +++ b/wp-admin/includes/class-wp-screen.php @@ -0,0 +1,1351 @@ +post_type; + + /** This filter is documented in wp-admin/post.php */ + $replace_editor = apply_filters( 'replace_editor', false, $post ); + + if ( ! $replace_editor ) { + $is_block_editor = use_block_editor_for_post( $post ); + } + } + } + break; + case 'edit-tags': + case 'term': + if ( null === $post_type && is_object_in_taxonomy( 'post', $taxonomy ? $taxonomy : 'post_tag' ) ) { + $post_type = 'post'; + } + break; + case 'upload': + $post_type = 'attachment'; + break; + } + } + + switch ( $base ) { + case 'post': + if ( null === $post_type ) { + $post_type = 'post'; + } + + // When creating a new post, use the default block editor support value for the post type. + if ( empty( $post_id ) ) { + $is_block_editor = use_block_editor_for_post_type( $post_type ); + } + + $id = $post_type; + break; + case 'edit': + if ( null === $post_type ) { + $post_type = 'post'; + } + $id .= '-' . $post_type; + break; + case 'edit-tags': + case 'term': + if ( null === $taxonomy ) { + $taxonomy = 'post_tag'; + } + // The edit-tags ID does not contain the post type. Look for it in the request. + if ( null === $post_type ) { + $post_type = 'post'; + if ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) ) { + $post_type = $_REQUEST['post_type']; + } + } + + $id = 'edit-' . $taxonomy; + break; + } + + if ( 'network' == $in_admin ) { + $id .= '-network'; + $base .= '-network'; + } elseif ( 'user' == $in_admin ) { + $id .= '-user'; + $base .= '-user'; + } + + if ( isset( self::$_registry[ $id ] ) ) { + $screen = self::$_registry[ $id ]; + if ( get_current_screen() === $screen ) { + return $screen; + } + } else { + $screen = new WP_Screen(); + $screen->id = $id; + } + + $screen->base = $base; + $screen->action = $action; + $screen->post_type = (string) $post_type; + $screen->taxonomy = (string) $taxonomy; + $screen->is_user = ( 'user' == $in_admin ); + $screen->is_network = ( 'network' == $in_admin ); + $screen->in_admin = $in_admin; + $screen->is_block_editor = $is_block_editor; + + self::$_registry[ $id ] = $screen; + + return $screen; + } + + /** + * Makes the screen object the current screen. + * + * @see set_current_screen() + * @since 3.3.0 + * + * @global WP_Screen $current_screen WordPress current screen object. + * @global string $taxnow + * @global string $typenow + */ + public function set_current_screen() { + global $current_screen, $taxnow, $typenow; + $current_screen = $this; + $taxnow = $this->taxonomy; + $typenow = $this->post_type; + + /** + * Fires after the current screen has been set. + * + * @since 3.0.0 + * + * @param WP_Screen $current_screen Current WP_Screen object. + */ + do_action( 'current_screen', $current_screen ); + } + + /** + * Constructor + * + * @since 3.3.0 + */ + private function __construct() {} + + /** + * Indicates whether the screen is in a particular admin + * + * @since 3.5.0 + * + * @param string $admin The admin to check against (network | user | site). + * If empty any of the three admins will result in true. + * @return bool True if the screen is in the indicated admin, false otherwise. + */ + public function in_admin( $admin = null ) { + if ( empty( $admin ) ) { + return (bool) $this->in_admin; + } + + return ( $admin == $this->in_admin ); + } + + /** + * Sets or returns whether the block editor is loading on the current screen. + * + * @since 5.0.0 + * + * @param bool $set Optional. Sets whether the block editor is loading on the current screen or not. + * @return bool True if the block editor is being loaded, false otherwise. + */ + public function is_block_editor( $set = null ) { + if ( null !== $set ) { + $this->is_block_editor = (bool) $set; + } + + return $this->is_block_editor; + } + + /** + * Sets the old string-based contextual help for the screen for backward compatibility. + * + * @since 3.3.0 + * + * @param WP_Screen $screen A screen object. + * @param string $help Help text. + */ + public static function add_old_compat_help( $screen, $help ) { + self::$_old_compat_help[ $screen->id ] = $help; + } + + /** + * Set the parent information for the screen. + * + * This is called in admin-header.php after the menu parent for the screen has been determined. + * + * @since 3.3.0 + * + * @param string $parent_file The parent file of the screen. Typically the $parent_file global. + */ + public function set_parentage( $parent_file ) { + $this->parent_file = $parent_file; + list( $this->parent_base ) = explode( '?', $parent_file ); + $this->parent_base = str_replace( '.php', '', $this->parent_base ); + } + + /** + * Adds an option for the screen. + * + * Call this in template files after admin.php is loaded and before admin-header.php is loaded + * to add screen options. + * + * @since 3.3.0 + * + * @param string $option Option ID + * @param mixed $args Option-dependent arguments. + */ + public function add_option( $option, $args = array() ) { + $this->_options[ $option ] = $args; + } + + /** + * Remove an option from the screen. + * + * @since 3.8.0 + * + * @param string $option Option ID. + */ + public function remove_option( $option ) { + unset( $this->_options[ $option ] ); + } + + /** + * Remove all options from the screen. + * + * @since 3.8.0 + */ + public function remove_options() { + $this->_options = array(); + } + + /** + * Get the options registered for the screen. + * + * @since 3.8.0 + * + * @return array Options with arguments. + */ + public function get_options() { + return $this->_options; + } + + /** + * Gets the arguments for an option for the screen. + * + * @since 3.3.0 + * + * @param string $option Option name. + * @param string $key Optional. Specific array key for when the option is an array. + * Default false. + * @return string The option value if set, null otherwise. + */ + public function get_option( $option, $key = false ) { + if ( ! isset( $this->_options[ $option ] ) ) { + return null; + } + if ( $key ) { + if ( isset( $this->_options[ $option ][ $key ] ) ) { + return $this->_options[ $option ][ $key ]; + } + return null; + } + return $this->_options[ $option ]; + } + + /** + * Gets the help tabs registered for the screen. + * + * @since 3.4.0 + * @since 4.4.0 Help tabs are ordered by their priority. + * + * @return array Help tabs with arguments. + */ + public function get_help_tabs() { + $help_tabs = $this->_help_tabs; + + $priorities = array(); + foreach ( $help_tabs as $help_tab ) { + if ( isset( $priorities[ $help_tab['priority'] ] ) ) { + $priorities[ $help_tab['priority'] ][] = $help_tab; + } else { + $priorities[ $help_tab['priority'] ] = array( $help_tab ); + } + } + + ksort( $priorities ); + + $sorted = array(); + foreach ( $priorities as $list ) { + foreach ( $list as $tab ) { + $sorted[ $tab['id'] ] = $tab; + } + } + + return $sorted; + } + + /** + * Gets the arguments for a help tab. + * + * @since 3.4.0 + * + * @param string $id Help Tab ID. + * @return array Help tab arguments. + */ + public function get_help_tab( $id ) { + if ( ! isset( $this->_help_tabs[ $id ] ) ) { + return null; + } + return $this->_help_tabs[ $id ]; + } + + /** + * Add a help tab to the contextual help for the screen. + * + * Call this on the `load-$pagenow` hook for the relevant screen, + * or fetch the `$current_screen` object, or use get_current_screen() + * and then call the method from the object. + * + * You may need to filter `$current_screen` using an if or switch statement + * to prevent new help tabs from being added to ALL admin screens. + * + * @since 3.3.0 + * @since 4.4.0 The `$priority` argument was added. + * + * @param array $args { + * Array of arguments used to display the help tab. + * + * @type string $title Title for the tab. Default false. + * @type string $id Tab ID. Must be HTML-safe and should be unique for this menu. + * It is NOT allowed to contain any empty spaces. Default false. + * @type string $content Optional. Help tab content in plain text or HTML. Default empty string. + * @type string $callback Optional. A callback to generate the tab content. Default false. + * @type int $priority Optional. The priority of the tab, used for ordering. Default 10. + * } + */ + public function add_help_tab( $args ) { + $defaults = array( + 'title' => false, + 'id' => false, + 'content' => '', + 'callback' => false, + 'priority' => 10, + ); + $args = wp_parse_args( $args, $defaults ); + + $args['id'] = sanitize_html_class( $args['id'] ); + + // Ensure we have an ID and title. + if ( ! $args['id'] || ! $args['title'] ) { + return; + } + + // Allows for overriding an existing tab with that ID. + $this->_help_tabs[ $args['id'] ] = $args; + } + + /** + * Removes a help tab from the contextual help for the screen. + * + * @since 3.3.0 + * + * @param string $id The help tab ID. + */ + public function remove_help_tab( $id ) { + unset( $this->_help_tabs[ $id ] ); + } + + /** + * Removes all help tabs from the contextual help for the screen. + * + * @since 3.3.0 + */ + public function remove_help_tabs() { + $this->_help_tabs = array(); + } + + /** + * Gets the content from a contextual help sidebar. + * + * @since 3.4.0 + * + * @return string Contents of the help sidebar. + */ + public function get_help_sidebar() { + return $this->_help_sidebar; + } + + /** + * Add a sidebar to the contextual help for the screen. + * + * Call this in template files after admin.php is loaded and before admin-header.php is loaded + * to add a sidebar to the contextual help. + * + * @since 3.3.0 + * + * @param string $content Sidebar content in plain text or HTML. + */ + public function set_help_sidebar( $content ) { + $this->_help_sidebar = $content; + } + + /** + * Gets the number of layout columns the user has selected. + * + * The layout_columns option controls the max number and default number of + * columns. This method returns the number of columns within that range selected + * by the user via Screen Options. If no selection has been made, the default + * provisioned in layout_columns is returned. If the screen does not support + * selecting the number of layout columns, 0 is returned. + * + * @since 3.4.0 + * + * @return int Number of columns to display. + */ + public function get_columns() { + return $this->columns; + } + + /** + * Get the accessible hidden headings and text used in the screen. + * + * @since 4.4.0 + * + * @see set_screen_reader_content() For more information on the array format. + * + * @return array An associative array of screen reader text strings. + */ + public function get_screen_reader_content() { + return $this->_screen_reader_content; + } + + /** + * Get a screen reader text string. + * + * @since 4.4.0 + * + * @param string $key Screen reader text array named key. + * @return string Screen reader text string. + */ + public function get_screen_reader_text( $key ) { + if ( ! isset( $this->_screen_reader_content[ $key ] ) ) { + return null; + } + return $this->_screen_reader_content[ $key ]; + } + + /** + * Add accessible hidden headings and text for the screen. + * + * @since 4.4.0 + * + * @param array $content { + * An associative array of screen reader text strings. + * + * @type string $heading_views Screen reader text for the filter links heading. + * Default 'Filter items list'. + * @type string $heading_pagination Screen reader text for the pagination heading. + * Default 'Items list navigation'. + * @type string $heading_list Screen reader text for the items list heading. + * Default 'Items list'. + * } + */ + public function set_screen_reader_content( $content = array() ) { + $defaults = array( + 'heading_views' => __( 'Filter items list' ), + 'heading_pagination' => __( 'Items list navigation' ), + 'heading_list' => __( 'Items list' ), + ); + $content = wp_parse_args( $content, $defaults ); + + $this->_screen_reader_content = $content; + } + + /** + * Remove all the accessible hidden headings and text for the screen. + * + * @since 4.4.0 + */ + public function remove_screen_reader_content() { + $this->_screen_reader_content = array(); + } + + /** + * Render the screen's help section. + * + * This will trigger the deprecated filters for backward compatibility. + * + * @since 3.3.0 + * + * @global string $screen_layout_columns + */ + public function render_screen_meta() { + + /** + * Filters the legacy contextual help list. + * + * @since 2.7.0 + * @deprecated 3.3.0 Use {@see get_current_screen()->add_help_tab()} or + * {@see get_current_screen()->remove_help_tab()} instead. + * + * @param array $old_compat_help Old contextual help. + * @param WP_Screen $this Current WP_Screen instance. + */ + self::$_old_compat_help = apply_filters_deprecated( + 'contextual_help_list', + array( self::$_old_compat_help, $this ), + '3.3.0', + 'get_current_screen()->add_help_tab(), get_current_screen()->remove_help_tab()' + ); + + $old_help = isset( self::$_old_compat_help[ $this->id ] ) ? self::$_old_compat_help[ $this->id ] : ''; + + /** + * Filters the legacy contextual help text. + * + * @since 2.7.0 + * @deprecated 3.3.0 Use {@see get_current_screen()->add_help_tab()} or + * {@see get_current_screen()->remove_help_tab()} instead. + * + * @param string $old_help Help text that appears on the screen. + * @param string $screen_id Screen ID. + * @param WP_Screen $this Current WP_Screen instance. + */ + $old_help = apply_filters_deprecated( + 'contextual_help', + array( $old_help, $this->id, $this ), + '3.3.0', + 'get_current_screen()->add_help_tab(), get_current_screen()->remove_help_tab()' + ); + + // Default help only if there is no old-style block of text and no new-style help tabs. + if ( empty( $old_help ) && ! $this->get_help_tabs() ) { + + /** + * Filters the default legacy contextual help text. + * + * @since 2.8.0 + * @deprecated 3.3.0 Use {@see get_current_screen()->add_help_tab()} or + * {@see get_current_screen()->remove_help_tab()} instead. + * + * @param string $old_help_default Default contextual help text. + */ + $default_help = apply_filters_deprecated( + 'default_contextual_help', + array( '' ), + '3.3.0', + 'get_current_screen()->add_help_tab(), get_current_screen()->remove_help_tab()' + ); + if ( $default_help ) { + $old_help = '

        ' . $default_help . '

        '; + } + } + + if ( $old_help ) { + $this->add_help_tab( + array( + 'id' => 'old-contextual-help', + 'title' => __( 'Overview' ), + 'content' => $old_help, + ) + ); + } + + $help_sidebar = $this->get_help_sidebar(); + + $help_class = 'hidden'; + if ( ! $help_sidebar ) { + $help_class .= ' no-sidebar'; + } + + // Time to render! + ?> +
        + +
        +
        +
        +
        +
          + get_help_tabs() as $tab ) : + $link_id = "tab-link-{$tab['id']}"; + $panel_id = "tab-panel-{$tab['id']}"; + ?> + + + +
        +
        + + +
        + +
        + + +
        + get_help_tabs() as $tab ) : + $panel_id = "tab-panel-{$tab['id']}"; + ?> + +
        + +
        + +
        +
        +
        + id, $this ); + + if ( ! empty( $columns ) && isset( $columns[ $this->id ] ) ) { + $this->add_option( 'layout_columns', array( 'max' => $columns[ $this->id ] ) ); + } + + if ( $this->get_option( 'layout_columns' ) ) { + $this->columns = (int) get_user_option( "screen_layout_$this->id" ); + + if ( ! $this->columns && $this->get_option( 'layout_columns', 'default' ) ) { + $this->columns = $this->get_option( 'layout_columns', 'default' ); + } + } + $GLOBALS['screen_layout_columns'] = $this->columns; // Set the global for back-compat. + + // Add screen options. + if ( $this->show_screen_options() ) { + $this->render_screen_options(); + } + ?> +
        + get_help_tabs() && ! $this->show_screen_options() ) { + return; + } + ?> + + _show_screen_options ) ) { + return $this->_show_screen_options; + } + + $columns = get_column_headers( $this ); + + $show_screen = ! empty( $wp_meta_boxes[ $this->id ] ) || $columns || $this->get_option( 'per_page' ); + + $this->_screen_settings = ''; + + if ( 'post' === $this->base ) { + $expand = ''; + $this->_screen_settings = $expand; + } + + /** + * Filters the screen settings text displayed in the Screen Options tab. + * + * This filter is currently only used on the Widgets screen to enable + * accessibility mode. + * + * @since 3.0.0 + * + * @param string $screen_settings Screen settings. + * @param WP_Screen $this WP_Screen object. + */ + $this->_screen_settings = apply_filters( 'screen_settings', $this->_screen_settings, $this ); + + if ( $this->_screen_settings || $this->_options ) { + $show_screen = true; + } + + /** + * Filters whether to show the Screen Options tab. + * + * @since 3.2.0 + * + * @param bool $show_screen Whether to show Screen Options tab. + * Default true. + * @param WP_Screen $this Current WP_Screen instance. + */ + $this->_show_screen_options = apply_filters( 'screen_options_show_screen', $show_screen, $this ); + return $this->_show_screen_options; + } + + /** + * Render the screen options tab. + * + * @since 3.3.0 + * + * @param array $options { + * @type bool $wrap Whether the screen-options-wrap div will be included. Defaults to true. + * } + */ + public function render_screen_options( $options = array() ) { + $options = wp_parse_args( + $options, + array( + 'wrap' => true, + ) + ); + + $wrapper_start = ''; + $wrapper_end = ''; + $form_start = ''; + $form_end = ''; + + // Output optional wrapper. + if ( $options['wrap'] ) { + $wrapper_start = ''; + } + + // Don't output the form and nonce for the widgets accessibility mode links. + if ( 'widgets' !== $this->base ) { + $form_start = "\n
        \n"; + $form_end = "\n" . wp_nonce_field( 'screen-options-nonce', 'screenoptionnonce', false, false ) . "\n
        \n"; + } + + echo $wrapper_start . $form_start; + + $this->render_meta_boxes_preferences(); + $this->render_list_table_columns_preferences(); + $this->render_screen_layout(); + $this->render_per_page_options(); + $this->render_view_mode(); + echo $this->_screen_settings; + + /** + * Filters whether to show the Screen Options submit button. + * + * @since 4.4.0 + * + * @param bool $show_button Whether to show Screen Options submit button. + * Default false. + * @param WP_Screen $this Current WP_Screen instance. + */ + $show_button = apply_filters( 'screen_options_show_submit', false, $this ); + + if ( $show_button ) { + submit_button( __( 'Apply' ), 'primary', 'screen-options-apply', true ); + } + + echo $form_end . $wrapper_end; + } + + /** + * Render the meta boxes preferences. + * + * @since 4.4.0 + * + * @global array $wp_meta_boxes + */ + public function render_meta_boxes_preferences() { + global $wp_meta_boxes; + + if ( ! isset( $wp_meta_boxes[ $this->id ] ) ) { + return; + } + ?> +
        + + id && has_action( 'welcome_panel' ) && current_user_can( 'edit_theme_options' ) ) { + if ( isset( $_GET['welcome'] ) ) { + $welcome_checked = empty( $_GET['welcome'] ) ? 0 : 1; + update_user_meta( get_current_user_id(), 'show_welcome_panel', $welcome_checked ); + } else { + $welcome_checked = get_user_meta( get_current_user_id(), 'show_welcome_panel', true ); + if ( 2 == $welcome_checked && wp_get_current_user()->user_email != get_option( 'admin_email' ) ) { + $welcome_checked = false; + } + } + echo '\n"; + } + ?> +
        + +
        + + $title ) { + // Can't hide these for they are special. + if ( in_array( $column, $special ) ) { + continue; + } + + if ( empty( $title ) ) { + continue; + } + + /* + * The Comments column uses HTML in the display name with some screen + * reader text. Make sure to strip tags from the Comments column + * title and any other custom column title plugins might add. + */ + $title = wp_strip_all_tags( $title ); + + $id = "$column-hide"; + echo '\n"; + } + ?> +
        + get_option( 'layout_columns' ) ) { + return; + } + + $screen_layout_columns = $this->get_columns(); + $num = $this->get_option( 'layout_columns', 'max' ); + + ?> +
        + + + + +
        + get_option( 'per_page' ) ) { + return; + } + + $per_page_label = $this->get_option( 'per_page', 'label' ); + if ( null === $per_page_label ) { + $per_page_label = __( 'Number of items per page:' ); + } + + $option = $this->get_option( 'per_page', 'option' ); + if ( ! $option ) { + $option = str_replace( '-', '_', "{$this->id}_per_page" ); + } + + $per_page = (int) get_user_option( $option ); + if ( empty( $per_page ) || $per_page < 1 ) { + $per_page = $this->get_option( 'per_page', 'default' ); + if ( ! $per_page ) { + $per_page = 20; + } + } + + if ( 'edit_comments_per_page' == $option ) { + $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all'; + + /** This filter is documented in wp-admin/includes/class-wp-comments-list-table.php */ + $per_page = apply_filters( 'comments_per_page', $per_page, $comment_status ); + } elseif ( 'categories_per_page' == $option ) { + /** This filter is documented in wp-admin/includes/class-wp-terms-list-table.php */ + $per_page = apply_filters( 'edit_categories_per_page', $per_page ); + } else { + /** This filter is documented in wp-admin/includes/class-wp-list-table.php */ + $per_page = apply_filters( "{$option}", $per_page ); + } + + // Back compat. + if ( isset( $this->post_type ) ) { + /** This filter is documented in wp-admin/includes/post.php */ + $per_page = apply_filters( 'edit_posts_per_page', $per_page, $this->post_type ); + } + + // This needs a submit button. + add_filter( 'screen_options_show_submit', '__return_true' ); + + ?> +
        + + + + + + +
        + base ) { + return; + } + + $view_mode_post_types = get_post_types( + array( + 'hierarchical' => false, + 'show_ui' => true, + ) + ); + + /** + * Filters the post types that have different view mode options. + * + * @since 4.4.0 + * + * @param string[] $view_mode_post_types Array of post types that can change view modes. + * Default non-hierarchical post types with show_ui on. + */ + $view_mode_post_types = apply_filters( 'view_mode_post_types', $view_mode_post_types ); + + if ( ! in_array( $this->post_type, $view_mode_post_types ) ) { + return; + } + + global $mode; + + // This needs a submit button. + add_filter( 'screen_options_show_submit', '__return_true' ); + ?> +
        + + + +
        + _screen_reader_content[ $key ] ) ) { + return; + } + echo "<$tag class='screen-reader-text'>" . $this->_screen_reader_content[ $key ] . ""; + } +} diff --git a/wp-admin/includes/class-wp-site-health-auto-updates.php b/wp-admin/includes/class-wp-site-health-auto-updates.php new file mode 100644 index 0000000..f69f954 --- /dev/null +++ b/wp-admin/includes/class-wp-site-health-auto-updates.php @@ -0,0 +1,478 @@ +test_constants( 'WP_AUTO_UPDATE_CORE', true ), + $this->test_wp_version_check_attached(), + $this->test_filters_automatic_updater_disabled(), + $this->test_wp_automatic_updates_disabled(), + $this->test_if_failed_update(), + $this->test_vcs_abspath(), + $this->test_check_wp_filesystem_method(), + $this->test_all_files_writable(), + $this->test_accepts_dev_updates(), + $this->test_accepts_minor_updates(), + ); + + $tests = array_filter( $tests ); + $tests = array_map( + function( $test ) { + $test = (object) $test; + + if ( empty( $test->severity ) ) { + $test->severity = 'warning'; + } + + return $test; + }, + $tests + ); + + return $tests; + } + + /** + * Test if auto-updates related constants are set correctly. + * + * @since 5.2.0 + * + * @param string $constant The name of the constant to check. + * @param bool $value The value that the constant should be, if set. + * @return array The test results. + */ + public function test_constants( $constant, $value ) { + if ( defined( $constant ) && constant( $constant ) != $value ) { + return array( + 'description' => sprintf( + /* translators: %s: Name of the constant used. */ + __( 'The %s constant is defined and enabled.' ), + "$constant" + ), + 'severity' => 'fail', + ); + } + } + + /** + * Check if updates are intercepted by a filter. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function test_wp_version_check_attached() { + if ( ! is_main_site() ) { + return; + } + + $cookies = wp_unslash( $_COOKIE ); + $timeout = 10; + $headers = array( + 'Cache-Control' => 'no-cache', + ); + /** This filter is documented in wp-includes/class-wp-http-streams.php */ + $sslverify = apply_filters( 'https_local_ssl_verify', false ); + + // Include Basic auth in loopback requests. + if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) { + $headers['Authorization'] = 'Basic ' . base64_encode( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) . ':' . wp_unslash( $_SERVER['PHP_AUTH_PW'] ) ); + } + + $url = add_query_arg( + array( + 'health-check-test-wp_version_check' => true, + ), + admin_url( 'site-health.php' ) + ); + + $test = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout', 'sslverify' ) ); + + if ( is_wp_error( $test ) ) { + return array( + 'description' => sprintf( + /* translators: %s: Name of the filter used. */ + __( 'Could not confirm that the %s filter is available.' ), + 'wp_version_check()' + ), + 'severity' => 'warning', + ); + } + + $response = wp_remote_retrieve_body( $test ); + + if ( 'yes' !== $response ) { + return array( + 'description' => sprintf( + /* translators: %s: Name of the filter used. */ + __( 'A plugin has prevented updates by disabling %s.' ), + 'wp_version_check()' + ), + 'severity' => 'fail', + ); + } + } + + /** + * Check if automatic updates are disabled by a filter. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function test_filters_automatic_updater_disabled() { + /** This filter is documented in wp-admin/includes/class-wp-automatic-updater.php */ + if ( apply_filters( 'automatic_updater_disabled', false ) ) { + return array( + 'description' => sprintf( + /* translators: %s: Name of the filter used. */ + __( 'The %s filter is enabled.' ), + 'automatic_updater_disabled' + ), + 'severity' => 'fail', + ); + } + } + + /** + * Check if automatic updates are disabled. + * + * @since 5.3.0 + * + * @return array|bool The test results. False if auto updates are enabled. + */ + public function test_wp_automatic_updates_disabled() { + if ( ! class_exists( 'WP_Automatic_Updater' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-automatic-updates.php'; + } + + $auto_updates = new WP_Automatic_Updater(); + + if ( ! $auto_updates->is_disabled() ) { + return false; + } + + return array( + 'description' => __( 'All automatic updates are disabled.' ), + 'severity' => 'fail', + ); + } + + /** + * Check if automatic updates have tried to run, but failed, previously. + * + * @since 5.2.0 + * + * @return array|bool The test results. False if the auto updates failed. + */ + function test_if_failed_update() { + $failed = get_site_option( 'auto_core_update_failed' ); + + if ( ! $failed ) { + return false; + } + + if ( ! empty( $failed['critical'] ) ) { + $description = __( 'A previous automatic background update ended with a critical failure, so updates are now disabled.' ); + $description .= ' ' . __( 'You would have received an email because of this.' ); + $description .= ' ' . __( "When you've been able to update using the \"Update Now\" button on Dashboard > Updates, we'll clear this error for future update attempts." ); + $description .= ' ' . sprintf( + /* translators: %s: Code of error shown. */ + __( 'The error code was %s.' ), + '' . $failed['error_code'] . '' + ); + return array( + 'description' => $description, + 'severity' => 'warning', + ); + } + + $description = __( 'A previous automatic background update could not occur.' ); + if ( empty( $failed['retry'] ) ) { + $description .= ' ' . __( 'You would have received an email because of this.' ); + } + + $description .= ' ' . __( "We'll try again with the next release." ); + $description .= ' ' . sprintf( + /* translators: %s: Code of error shown. */ + __( 'The error code was %s.' ), + '' . $failed['error_code'] . '' + ); + return array( + 'description' => $description, + 'severity' => 'warning', + ); + } + + /** + * Check if WordPress is controlled by a VCS (Git, Subversion etc). + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function test_vcs_abspath() { + $context_dirs = array( ABSPATH ); + $vcs_dirs = array( '.svn', '.git', '.hg', '.bzr' ); + $check_dirs = array(); + + foreach ( $context_dirs as $context_dir ) { + // Walk up from $context_dir to the root. + do { + $check_dirs[] = $context_dir; + + // Once we've hit '/' or 'C:\', we need to stop. dirname will keep returning the input here. + if ( dirname( $context_dir ) == $context_dir ) { + break; + } + + // Continue one level at a time. + } while ( $context_dir = dirname( $context_dir ) ); + } + + $check_dirs = array_unique( $check_dirs ); + + // Search all directories we've found for evidence of version control. + foreach ( $vcs_dirs as $vcs_dir ) { + foreach ( $check_dirs as $check_dir ) { + // phpcs:ignore + if ( $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" ) ) { + break 2; + } + } + } + + /** This filter is documented in wp-admin/includes/class-wp-automatic-updater.php */ + if ( $checkout && ! apply_filters( 'automatic_updates_is_vcs_checkout', true, ABSPATH ) ) { + return array( + 'description' => sprintf( + /* translators: 1: Folder name. 2: Version control directory. 3: Filter name. */ + __( 'The folder %1$s was detected as being under version control (%2$s), but the %3$s filter is allowing updates.' ), + '' . $check_dir . '', + "$vcs_dir", + 'automatic_updates_is_vcs_checkout' + ), + 'severity' => 'info', + ); + } + + if ( $checkout ) { + return array( + 'description' => sprintf( + /* translators: 1: Folder name. 2: Version control directory. */ + __( 'The folder %1$s was detected as being under version control (%2$s).' ), + '' . $check_dir . '', + "$vcs_dir" + ), + 'severity' => 'warning', + ); + } + + return array( + 'description' => __( 'No version control systems were detected.' ), + 'severity' => 'pass', + ); + } + + /** + * Check if we can access files without providing credentials. + * + * @since 5.2.0 + * + * @return array The test results. + */ + function test_check_wp_filesystem_method() { + $skin = new Automatic_Upgrader_Skin; + $success = $skin->request_filesystem_credentials( false, ABSPATH ); + + if ( ! $success ) { + $description = __( 'Your installation of WordPress prompts for FTP credentials to perform updates.' ); + $description .= ' ' . __( '(Your site is performing updates over FTP due to file ownership. Talk to your hosting company.)' ); + + return array( + 'description' => $description, + 'severity' => 'fail', + ); + } + + return array( + 'description' => __( "Your installation of WordPress doesn't require FTP credentials to perform updates." ), + 'severity' => 'pass', + ); + } + + /** + * Check if core files are writable by the web user/group. + * + * @since 5.2.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @return array|bool The test results. False if they're not writeable. + */ + function test_all_files_writable() { + global $wp_filesystem; + + require ABSPATH . WPINC . '/version.php'; // $wp_version; // x.y.z + + $skin = new Automatic_Upgrader_Skin; + $success = $skin->request_filesystem_credentials( false, ABSPATH ); + + if ( ! $success ) { + return false; + } + + WP_Filesystem(); + + if ( 'direct' != $wp_filesystem->method ) { + return false; + } + + $checksums = get_core_checksums( $wp_version, 'en_US' ); + $dev = ( false !== strpos( $wp_version, '-' ) ); + // Get the last stable version's files and test against that. + if ( ! $checksums && $dev ) { + $checksums = get_core_checksums( (float) $wp_version - 0.1, 'en_US' ); + } + + // There aren't always checksums for development releases, so just skip the test if we still can't find any. + if ( ! $checksums && $dev ) { + return false; + } + + if ( ! $checksums ) { + $description = sprintf( + /* translators: %s: WordPress version. */ + __( "Couldn't retrieve a list of the checksums for WordPress %s." ), + $wp_version + ); + $description .= ' ' . __( 'This could mean that connections are failing to WordPress.org.' ); + return array( + 'description' => $description, + 'severity' => 'warning', + ); + } + + $unwritable_files = array(); + foreach ( array_keys( $checksums ) as $file ) { + if ( 'wp-content' == substr( $file, 0, 10 ) ) { + continue; + } + if ( ! file_exists( ABSPATH . $file ) ) { + continue; + } + if ( ! is_writable( ABSPATH . $file ) ) { + $unwritable_files[] = $file; + } + } + + if ( $unwritable_files ) { + if ( count( $unwritable_files ) > 20 ) { + $unwritable_files = array_slice( $unwritable_files, 0, 20 ); + $unwritable_files[] = '...'; + } + return array( + 'description' => __( 'Some files are not writable by WordPress:' ) . '
        • ' . implode( '
        • ', $unwritable_files ) . '
        ', + 'severity' => 'fail', + ); + } else { + return array( + 'description' => __( 'All of your WordPress files are writable.' ), + 'severity' => 'pass', + ); + } + } + + /** + * Check if the install is using a development branch and can use nightly packages. + * + * @since 5.2.0 + * + * @return array|bool The test results. False if it isn't a development version. + */ + function test_accepts_dev_updates() { + require ABSPATH . WPINC . '/version.php'; // $wp_version; // x.y.z + // Only for dev versions. + if ( false === strpos( $wp_version, '-' ) ) { + return false; + } + + if ( defined( 'WP_AUTO_UPDATE_CORE' ) && ( 'minor' === WP_AUTO_UPDATE_CORE || false === WP_AUTO_UPDATE_CORE ) ) { + return array( + 'description' => sprintf( + /* translators: %s: Name of the constant used. */ + __( 'WordPress development updates are blocked by the %s constant.' ), + 'WP_AUTO_UPDATE_CORE' + ), + 'severity' => 'fail', + ); + } + + /** This filter is documented in wp-admin/includes/class-core-upgrader.php */ + if ( ! apply_filters( 'allow_dev_auto_core_updates', $wp_version ) ) { + return array( + 'description' => sprintf( + /* translators: %s: Name of the filter used. */ + __( 'WordPress development updates are blocked by the %s filter.' ), + 'allow_dev_auto_core_updates' + ), + 'severity' => 'fail', + ); + } + } + + /** + * Check if the site supports automatic minor updates. + * + * @since 5.2.0 + * + * @return array The test results. + */ + function test_accepts_minor_updates() { + if ( defined( 'WP_AUTO_UPDATE_CORE' ) && false === WP_AUTO_UPDATE_CORE ) { + return array( + 'description' => sprintf( + /* translators: %s: Name of the constant used. */ + __( 'WordPress security and maintenance releases are blocked by %s.' ), + "define( 'WP_AUTO_UPDATE_CORE', false );" + ), + 'severity' => 'fail', + ); + } + + /** This filter is documented in wp-admin/includes/class-core-upgrader.php */ + if ( ! apply_filters( 'allow_minor_auto_core_updates', true ) ) { + return array( + 'description' => sprintf( + /* translators: %s: Name of the filter used. */ + __( 'WordPress security and maintenance releases are blocked by the %s filter.' ), + 'allow_minor_auto_core_updates' + ), + 'severity' => 'fail', + ); + } + } +} diff --git a/wp-admin/includes/class-wp-site-health.php b/wp-admin/includes/class-wp-site-health.php new file mode 100644 index 0000000..17ec9fa --- /dev/null +++ b/wp-admin/includes/class-wp-site-health.php @@ -0,0 +1,2320 @@ +maybe_create_scheduled_event(); + + $this->timeout_late_cron = 0; + $this->timeout_missed_cron = - 5 * MINUTE_IN_SECONDS; + + if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) { + $this->timeout_late_cron = - 15 * MINUTE_IN_SECONDS; + $this->timeout_missed_cron = - 1 * HOUR_IN_SECONDS; + } + + add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) ); + + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); + add_action( 'wp_site_health_scheduled_check', array( $this, 'wp_cron_scheduled_check' ) ); + } + + /** + * Return an instance of the WP_Site_Health class, or create one if none exist yet. + * + * @since 5.4.0 + * + * @return WP_Site_Health|null + */ + public static function get_instance() { + if ( null === self::$instance ) { + self::$instance = new WP_Site_Health(); + } + + return self::$instance; + } + + /** + * Enqueues the site health scripts. + * + * @since 5.2.0 + */ + public function enqueue_scripts() { + $screen = get_current_screen(); + if ( 'site-health' !== $screen->id && 'dashboard' !== $screen->id ) { + return; + } + + $health_check_js_variables = array( + 'screen' => $screen->id, + 'nonce' => array( + 'site_status' => wp_create_nonce( 'health-check-site-status' ), + 'site_status_result' => wp_create_nonce( 'health-check-site-status-result' ), + ), + 'site_status' => array( + 'direct' => array(), + 'async' => array(), + 'issues' => array( + 'good' => 0, + 'recommended' => 0, + 'critical' => 0, + ), + ), + ); + + $issue_counts = get_transient( 'health-check-site-status-result' ); + + if ( false !== $issue_counts ) { + $issue_counts = json_decode( $issue_counts ); + + $health_check_js_variables['site_status']['issues'] = $issue_counts; + } + + if ( 'site-health' === $screen->id && ! isset( $_GET['tab'] ) ) { + $tests = WP_Site_Health::get_tests(); + + // Don't run https test on localhost. + if ( 'localhost' === preg_replace( '|https?://|', '', get_site_url() ) ) { + unset( $tests['direct']['https_status'] ); + } + + foreach ( $tests['direct'] as $test ) { + if ( is_string( $test['test'] ) ) { + $test_function = sprintf( + 'get_test_%s', + $test['test'] + ); + + if ( method_exists( $this, $test_function ) && is_callable( array( $this, $test_function ) ) ) { + $health_check_js_variables['site_status']['direct'][] = $this->perform_test( array( $this, $test_function ) ); + continue; + } + } + + if ( is_callable( $test['test'] ) ) { + $health_check_js_variables['site_status']['direct'][] = $this->perform_test( $test['test'] ); + } + } + + foreach ( $tests['async'] as $test ) { + if ( is_string( $test['test'] ) ) { + $health_check_js_variables['site_status']['async'][] = array( + 'test' => $test['test'], + 'completed' => false, + ); + } + } + } + + wp_localize_script( 'site-health', 'SiteHealth', $health_check_js_variables ); + } + + /** + * Run a Site Health test directly. + * + * @since 5.4.0 + * + * @param $callback + * + * @return mixed|void + */ + private function perform_test( $callback ) { + /** + * Filter the output of a finished Site Health test. + * + * @since 5.3.0 + * + * @param array $test_result { + * An associated array of test result data. + * + * @param string $label A label describing the test, and is used as a header in the output. + * @param string $status The status of the test, which can be a value of `good`, `recommended` or `critical`. + * @param array $badge { + * Tests are put into categories which have an associated badge shown, these can be modified and assigned here. + * + * @param string $label The test label, for example `Performance`. + * @param string $color Default `blue`. A string representing a color to use for the label. + * } + * @param string $description A more descriptive explanation of what the test looks for, and why it is important for the end user. + * @param string $actions An action to direct the user to where they can resolve the issue, if one exists. + * @param string $test The name of the test being ran, used as a reference point. + * } + */ + return apply_filters( 'site_status_test_result', call_user_func( $callback ) ); + } + + /** + * Run the SQL version checks. + * + * These values are used in later tests, but the part of preparing them is more easily managed early + * in the class for ease of access and discovery. + * + * @since 5.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ + private function prepare_sql_data() { + global $wpdb; + + if ( $wpdb->use_mysqli ) { + // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysqli_get_server_info + $mysql_server_type = mysqli_get_server_info( $wpdb->dbh ); + } else { + // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_server_info,PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved + $mysql_server_type = mysql_get_server_info( $wpdb->dbh ); + } + + $this->mysql_server_version = $wpdb->get_var( 'SELECT VERSION()' ); + + $this->health_check_mysql_rec_version = '5.6'; + + if ( stristr( $mysql_server_type, 'mariadb' ) ) { + $this->is_mariadb = true; + $this->health_check_mysql_rec_version = '10.0'; + } + + $this->mysql_min_version_check = version_compare( '5.5', $this->mysql_server_version, '<=' ); + $this->mysql_rec_version_check = version_compare( $this->health_check_mysql_rec_version, $this->mysql_server_version, '<=' ); + } + + /** + * Test if `wp_version_check` is blocked. + * + * It's possible to block updates with the `wp_version_check` filter, but this can't be checked during an + * AJAX call, as the filter is never introduced then. + * + * This filter overrides a normal page request if it's made by an admin through the AJAX call with the + * right query argument to check for this. + * + * @since 5.2.0 + */ + public function check_wp_version_check_exists() { + if ( ! is_admin() || ! is_user_logged_in() || ! current_user_can( 'update_core' ) || ! isset( $_GET['health-check-test-wp_version_check'] ) ) { + return; + } + + echo ( has_filter( 'wp_version_check', 'wp_version_check' ) ? 'yes' : 'no' ); + + die(); + } + + /** + * Tests for WordPress version and outputs it. + * + * Gives various results depending on what kind of updates are available, if any, to encourage the + * user to install security updates as a priority. + * + * @since 5.2.0 + * + * @return array The test result. + */ + public function get_test_wordpress_version() { + $result = array( + 'label' => '', + 'status' => '', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => '', + 'actions' => '', + 'test' => 'wordpress_version', + ); + + $core_current_version = get_bloginfo( 'version' ); + $core_updates = get_core_updates(); + + if ( ! is_array( $core_updates ) ) { + $result['status'] = 'recommended'; + + $result['label'] = sprintf( + /* translators: %s: Your current version of WordPress. */ + __( 'WordPress version %s' ), + $core_current_version + ); + + $result['description'] = sprintf( + '

        %s

        ', + __( 'We were unable to check if any new versions of WordPress are available.' ) + ); + + $result['actions'] = sprintf( + '%s', + esc_url( admin_url( 'update-core.php?force-check=1' ) ), + __( 'Check for updates manually' ) + ); + } else { + foreach ( $core_updates as $core => $update ) { + if ( 'upgrade' === $update->response ) { + $current_version = explode( '.', $core_current_version ); + $new_version = explode( '.', $update->version ); + + $current_major = $current_version[0] . '.' . $current_version[1]; + $new_major = $new_version[0] . '.' . $new_version[1]; + + $result['label'] = sprintf( + /* translators: %s: The latest version of WordPress available. */ + __( 'WordPress update available (%s)' ), + $update->version + ); + + $result['actions'] = sprintf( + '%s', + esc_url( admin_url( 'update-core.php' ) ), + __( 'Install the latest version of WordPress' ) + ); + + if ( $current_major !== $new_major ) { + // This is a major version mismatch. + $result['status'] = 'recommended'; + $result['description'] = sprintf( + '

        %s

        ', + __( 'A new version of WordPress is available.' ) + ); + } else { + // This is a minor version, sometimes considered more critical. + $result['status'] = 'critical'; + $result['badge']['label'] = __( 'Security' ); + $result['description'] = sprintf( + '

        %s

        ', + __( 'A new minor update is available for your site. Because minor updates often address security, it’s important to install them.' ) + ); + } + } else { + $result['status'] = 'good'; + $result['label'] = sprintf( + /* translators: %s: The current version of WordPress installed on this site. */ + __( 'Your version of WordPress (%s) is up to date' ), + $core_current_version + ); + + $result['description'] = sprintf( + '

        %s

        ', + __( 'You are currently running the latest version of WordPress available, keep it up!' ) + ); + } + } + } + + return $result; + } + + /** + * Test if plugins are outdated, or unnecessary. + * + * The tests checks if your plugins are up to date, and encourages you to remove any that are not in use. + * + * @since 5.2.0 + * + * @return array The test result. + */ + public function get_test_plugin_version() { + $result = array( + 'label' => __( 'Your plugins are all up to date' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Security' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'Plugins extend your site’s functionality with things like contact forms, ecommerce and much more. That means they have deep access to your site, so it’s vital to keep them up to date.' ) + ), + 'actions' => sprintf( + '

        %s

        ', + esc_url( admin_url( 'plugins.php' ) ), + __( 'Manage your plugins' ) + ), + 'test' => 'plugin_version', + ); + + $plugins = get_plugins(); + $plugin_updates = get_plugin_updates(); + + $plugins_have_updates = false; + $plugins_active = 0; + $plugins_total = 0; + $plugins_need_update = 0; + + // Loop over the available plugins and check their versions and active state. + foreach ( $plugins as $plugin_path => $plugin ) { + $plugins_total++; + + if ( is_plugin_active( $plugin_path ) ) { + $plugins_active++; + } + + $plugin_version = $plugin['Version']; + + if ( array_key_exists( $plugin_path, $plugin_updates ) ) { + $plugins_need_update++; + $plugins_have_updates = true; + } + } + + // Add a notice if there are outdated plugins. + if ( $plugins_need_update > 0 ) { + $result['status'] = 'critical'; + + $result['label'] = __( 'You have plugins waiting to be updated' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: %d: The number of outdated plugins. */ + _n( + 'Your site has %d plugin waiting to be updated.', + 'Your site has %d plugins waiting to be updated.', + $plugins_need_update + ), + $plugins_need_update + ) + ); + + $result['actions'] .= sprintf( + '

        %s

        ', + esc_url( network_admin_url( 'plugins.php?plugin_status=upgrade' ) ), + __( 'Update your plugins' ) + ); + } else { + if ( 1 === $plugins_active ) { + $result['description'] .= sprintf( + '

        %s

        ', + __( 'Your site has 1 active plugin, and it is up to date.' ) + ); + } else { + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: %d: The number of active plugins. */ + _n( + 'Your site has %d active plugin, and it is up to date.', + 'Your site has %d active plugins, and they are all up to date.', + $plugins_active + ), + $plugins_active + ) + ); + } + } + + // Check if there are inactive plugins. + if ( $plugins_total > $plugins_active && ! is_multisite() ) { + $unused_plugins = $plugins_total - $plugins_active; + + $result['status'] = 'recommended'; + + $result['label'] = __( 'You should remove inactive plugins' ); + + $result['description'] .= sprintf( + '

        %s %s

        ', + sprintf( + /* translators: %d: The number of inactive plugins. */ + _n( + 'Your site has %d inactive plugin.', + 'Your site has %d inactive plugins.', + $unused_plugins + ), + $unused_plugins + ), + __( 'Inactive plugins are tempting targets for attackers. If you’re not going to use a plugin, we recommend you remove it.' ) + ); + + $result['actions'] .= sprintf( + '

        %s

        ', + esc_url( admin_url( 'plugins.php?plugin_status=inactive' ) ), + __( 'Manage inactive plugins' ) + ); + } + + return $result; + } + + /** + * Test if themes are outdated, or unnecessary. + * + * The tests checks if your site has a default theme (to fall back on if there is a need), if your themes + * are up to date and, finally, encourages you to remove any themes that are not needed. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_theme_version() { + $result = array( + 'label' => __( 'Your themes are all up to date' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Security' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'Themes add your site’s look and feel. It’s important to keep them up to date, to stay consistent with your brand and keep your site secure.' ) + ), + 'actions' => sprintf( + '

        %s

        ', + esc_url( admin_url( 'themes.php' ) ), + __( 'Manage your themes' ) + ), + 'test' => 'theme_version', + ); + + $theme_updates = get_theme_updates(); + + $themes_total = 0; + $themes_need_updates = 0; + $themes_inactive = 0; + + // This value is changed during processing to determine how many themes are considered a reasonable amount. + $allowed_theme_count = 1; + + $has_default_theme = false; + $has_unused_themes = false; + $show_unused_themes = true; + $using_default_theme = false; + + // Populate a list of all themes available in the install. + $all_themes = wp_get_themes(); + $active_theme = wp_get_theme(); + + // If WP_DEFAULT_THEME doesn't exist, fall back to the latest core default theme. + $default_theme = wp_get_theme( WP_DEFAULT_THEME ); + if ( ! $default_theme->exists() ) { + $default_theme = WP_Theme::get_core_default_theme(); + } + + if ( $default_theme ) { + $has_default_theme = true; + + if ( + $active_theme->get_stylesheet() === $default_theme->get_stylesheet() + || + is_child_theme() && $active_theme->get_template() === $default_theme->get_template() + ) { + $using_default_theme = true; + } + } + + foreach ( $all_themes as $theme_slug => $theme ) { + $themes_total++; + + if ( array_key_exists( $theme_slug, $theme_updates ) ) { + $themes_need_updates++; + } + } + + // If this is a child theme, increase the allowed theme count by one, to account for the parent. + if ( is_child_theme() ) { + $allowed_theme_count++; + } + + // If there's a default theme installed and not in use, we count that as allowed as well. + if ( $has_default_theme && ! $using_default_theme ) { + $allowed_theme_count++; + } + + if ( $themes_total > $allowed_theme_count ) { + $has_unused_themes = true; + $themes_inactive = ( $themes_total - $allowed_theme_count ); + } + + // Check if any themes need to be updated. + if ( $themes_need_updates > 0 ) { + $result['status'] = 'critical'; + + $result['label'] = __( 'You have themes waiting to be updated' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: %d: The number of outdated themes. */ + _n( + 'Your site has %d theme waiting to be updated.', + 'Your site has %d themes waiting to be updated.', + $themes_need_updates + ), + $themes_need_updates + ) + ); + } else { + // Give positive feedback about the site being good about keeping things up to date. + if ( 1 === $themes_total ) { + $result['description'] .= sprintf( + '

        %s

        ', + __( 'Your site has 1 installed theme, and it is up to date.' ) + ); + } else { + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: %d: The number of themes. */ + _n( + 'Your site has %d installed theme, and it is up to date.', + 'Your site has %d installed themes, and they are all up to date.', + $themes_total + ), + $themes_total + ) + ); + } + } + + if ( $has_unused_themes && $show_unused_themes && ! is_multisite() ) { + + // This is a child theme, so we want to be a bit more explicit in our messages. + if ( is_child_theme() ) { + // Recommend removing inactive themes, except a default theme, your current one, and the parent theme. + $result['status'] = 'recommended'; + + $result['label'] = __( 'You should remove inactive themes' ); + + if ( $using_default_theme ) { + $result['description'] .= sprintf( + '

        %s %s

        ', + sprintf( + /* translators: %d: The number of inactive themes. */ + _n( + 'Your site has %d inactive theme.', + 'Your site has %d inactive themes.', + $themes_inactive + ), + $themes_inactive + ), + sprintf( + /* translators: 1: The currently active theme. 2: The active theme's parent theme. */ + __( 'To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep your current theme, %1$s, and %2$s, its parent theme.' ), + $active_theme->name, + $active_theme->parent()->name + ) + ); + } else { + $result['description'] .= sprintf( + '

        %s %s

        ', + sprintf( + /* translators: %d: The number of inactive themes. */ + _n( + 'Your site has %d inactive theme.', + 'Your site has %d inactive themes.', + $themes_inactive + ), + $themes_inactive + ), + sprintf( + /* translators: 1: The default theme for WordPress. 2: The currently active theme. 3: The active theme's parent theme. */ + __( 'To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep %1$s, the default WordPress theme, %2$s, your current theme, and %3$s, its parent theme.' ), + $default_theme ? $default_theme->name : WP_DEFAULT_THEME, + $active_theme->name, + $active_theme->parent()->name + ) + ); + } + } else { + // Recommend removing all inactive themes. + $result['status'] = 'recommended'; + + $result['label'] = __( 'You should remove inactive themes' ); + + if ( $using_default_theme ) { + $result['description'] .= sprintf( + '

        %s %s

        ', + sprintf( + /* translators: 1: The amount of inactive themes. 2: The currently active theme. */ + _n( + 'Your site has %1$d inactive theme, other than %2$s, your active theme.', + 'Your site has %1$d inactive themes, other than %2$s, your active theme.', + $themes_inactive + ), + $themes_inactive, + $active_theme->name + ), + __( 'We recommend removing any unused themes to enhance your site’s security.' ) + ); + } else { + $result['description'] .= sprintf( + '

        %s %s

        ', + sprintf( + /* translators: 1: The amount of inactive themes. 2: The default theme for WordPress. 3: The currently active theme. */ + _n( + 'Your site has %1$d inactive theme, other than %2$s, the default WordPress theme, and %3$s, your active theme.', + 'Your site has %1$d inactive themes, other than %2$s, the default WordPress theme, and %3$s, your active theme.', + $themes_inactive + ), + $themes_inactive, + $default_theme ? $default_theme->name : WP_DEFAULT_THEME, + $active_theme->name + ), + __( 'We recommend removing any unused themes to enhance your site’s security.' ) + ); + } + } + } + + // If no default Twenty* theme exists. + if ( ! $has_default_theme ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'Have a default theme available' ); + + $result['description'] .= sprintf( + '

        %s

        ', + __( 'Your site does not have any default theme. Default themes are used by WordPress automatically if anything is wrong with your normal theme.' ) + ); + } + + return $result; + } + + /** + * Test if the supplied PHP version is supported. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_php_version() { + $response = wp_check_php_version(); + + $result = array( + 'label' => sprintf( + /* translators: %s: The current PHP version. */ + __( 'Your site is running the current version of PHP (%s)' ), + PHP_VERSION + ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: The minimum recommended PHP version. */ + __( 'PHP is the programming language used to build and maintain WordPress. Newer versions of PHP are faster and more secure, so staying up to date will help your site’s overall performance and security. The minimum recommended version of PHP is %s.' ), + $response ? $response['recommended_version'] : '' + ) + ), + 'actions' => sprintf( + '

        %s %s

        ', + esc_url( wp_get_update_php_url() ), + __( 'Learn more about updating PHP' ), + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ), + 'test' => 'php_version', + ); + + // PHP is up to date. + if ( ! $response || version_compare( PHP_VERSION, $response['recommended_version'], '>=' ) ) { + return $result; + } + + // The PHP version is older than the recommended version, but still receiving active support. + if ( $response['is_supported'] ) { + $result['label'] = sprintf( + /* translators: %s: The server PHP version. */ + __( 'Your site is running an older version of PHP (%s)' ), + PHP_VERSION + ); + $result['status'] = 'recommended'; + + return $result; + } + + // The PHP version is only receiving security fixes. + if ( $response['is_secure'] ) { + $result['label'] = sprintf( + /* translators: %s: The server PHP version. */ + __( 'Your site is running an older version of PHP (%s), which should be updated' ), + PHP_VERSION + ); + $result['status'] = 'recommended'; + + return $result; + } + + // Anything no longer secure must be updated. + $result['label'] = sprintf( + /* translators: %s: The server PHP version. */ + __( 'Your site is running an outdated version of PHP (%s), which requires an update' ), + PHP_VERSION + ); + $result['status'] = 'critical'; + $result['badge']['label'] = __( 'Security' ); + + return $result; + } + + /** + * Check if the passed extension or function are available. + * + * Make the check for available PHP modules into a simple boolean operator for a cleaner test runner. + * + * @since 5.2.0 + * @since 5.3.0 The `$constant` and `$class` parameters were added. + * + * @param string $extension Optional. The extension name to test. Default null. + * @param string $function Optional. The function name to test. Default null. + * @param string $constant Optional. The constant name to test for. Default null. + * @param string $class Optional. The class name to test for. Default null. + * + * @return bool Whether or not the extension and function are available. + */ + private function test_php_extension_availability( $extension = null, $function = null, $constant = null, $class = null ) { + // If no extension or function is passed, claim to fail testing, as we have nothing to test against. + if ( ! $extension && ! $function && ! $constant && ! $class ) { + return false; + } + + if ( $extension && ! extension_loaded( $extension ) ) { + return false; + } + if ( $function && ! function_exists( $function ) ) { + return false; + } + if ( $constant && ! defined( $constant ) ) { + return false; + } + if ( $class && ! class_exists( $class ) ) { + return false; + } + + return true; + } + + /** + * Test if required PHP modules are installed on the host. + * + * This test builds on the recommendations made by the WordPress Hosting Team + * as seen at https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions + * + * @since 5.2.0 + * + * @return array + */ + public function get_test_php_extensions() { + $result = array( + 'label' => __( 'Required and recommended modules are installed' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        %s

        ', + __( 'PHP modules perform most of the tasks on the server that make your site run. Any changes to these must be made by your server administrator.' ), + sprintf( + /* translators: 1: Link to the hosting group page about recommended PHP modules. 2: Additional link attributes. 3: Accessibility text. */ + __( 'The WordPress Hosting Team maintains a list of those modules, both recommended and required, in the team handbook%3$s.' ), + /* translators: Localized team handbook, if one exists. */ + esc_url( __( 'https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions' ) ), + 'target="_blank" rel="noopener noreferrer"', + sprintf( + ' %s', + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ) + ) + ), + 'actions' => '', + 'test' => 'php_extensions', + ); + + $modules = array( + 'curl' => array( + 'function' => 'curl_version', + 'required' => false, + ), + 'dom' => array( + 'class' => 'DOMNode', + 'required' => false, + ), + 'exif' => array( + 'function' => 'exif_read_data', + 'required' => false, + ), + 'fileinfo' => array( + 'function' => 'finfo_file', + 'required' => false, + ), + 'hash' => array( + 'function' => 'hash', + 'required' => false, + ), + 'json' => array( + 'function' => 'json_last_error', + 'required' => true, + ), + 'mbstring' => array( + 'function' => 'mb_check_encoding', + 'required' => false, + ), + 'mysqli' => array( + 'function' => 'mysqli_connect', + 'required' => false, + ), + 'libsodium' => array( + 'constant' => 'SODIUM_LIBRARY_VERSION', + 'required' => false, + 'php_bundled_version' => '7.2.0', + ), + 'openssl' => array( + 'function' => 'openssl_encrypt', + 'required' => false, + ), + 'pcre' => array( + 'function' => 'preg_match', + 'required' => false, + ), + 'imagick' => array( + 'extension' => 'imagick', + 'required' => false, + ), + 'mod_xml' => array( + 'extension' => 'libxml', + 'required' => false, + ), + 'zip' => array( + 'class' => 'ZipArchive', + 'required' => false, + ), + 'filter' => array( + 'function' => 'filter_list', + 'required' => false, + ), + 'gd' => array( + 'extension' => 'gd', + 'required' => false, + 'fallback_for' => 'imagick', + ), + 'iconv' => array( + 'function' => 'iconv', + 'required' => false, + ), + 'mcrypt' => array( + 'extension' => 'mcrypt', + 'required' => false, + 'fallback_for' => 'libsodium', + ), + 'simplexml' => array( + 'extension' => 'simplexml', + 'required' => false, + 'fallback_for' => 'mod_xml', + ), + 'xmlreader' => array( + 'extension' => 'xmlreader', + 'required' => false, + 'fallback_for' => 'mod_xml', + ), + 'zlib' => array( + 'extension' => 'zlib', + 'required' => false, + 'fallback_for' => 'zip', + ), + ); + + /** + * An array representing all the modules we wish to test for. + * + * @since 5.2.0 + * @since 5.3.0 The `$constant` and `$class` parameters were added. + * + * @param array $modules { + * An associated array of modules to test for. + * + * array $module { + * An associated array of module properties used during testing. + * One of either `$function` or `$extension` must be provided, or they will fail by default. + * + * string $function Optional. A function name to test for the existence of. + * string $extension Optional. An extension to check if is loaded in PHP. + * string $constant Optional. A constant name to check for to verify an extension exists. + * string $class Optional. A class name to check for to verify an extension exists. + * bool $required Is this a required feature or not. + * string $fallback_for Optional. The module this module replaces as a fallback. + * } + * } + */ + $modules = apply_filters( 'site_status_test_php_modules', $modules ); + + $failures = array(); + + foreach ( $modules as $library => $module ) { + $extension = ( isset( $module['extension'] ) ? $module['extension'] : null ); + $function = ( isset( $module['function'] ) ? $module['function'] : null ); + $constant = ( isset( $module['constant'] ) ? $module['constant'] : null ); + $class_name = ( isset( $module['class'] ) ? $module['class'] : null ); + + // If this module is a fallback for another function, check if that other function passed. + if ( isset( $module['fallback_for'] ) ) { + /* + * If that other function has a failure, mark this module as required for normal operations. + * If that other function hasn't failed, skip this test as it's only a fallback. + */ + if ( isset( $failures[ $module['fallback_for'] ] ) ) { + $module['required'] = true; + } else { + continue; + } + } + + if ( ! $this->test_php_extension_availability( $extension, $function, $constant, $class_name ) && ( ! isset( $module['php_bundled_version'] ) || version_compare( PHP_VERSION, $module['php_bundled_version'], '<' ) ) ) { + if ( $module['required'] ) { + $result['status'] = 'critical'; + + $class = 'error'; + $screen_reader = __( 'Error' ); + $message = sprintf( + /* translators: %s: The module name. */ + __( 'The required module, %s, is not installed, or has been disabled.' ), + $library + ); + } else { + $class = 'warning'; + $screen_reader = __( 'Warning' ); + $message = sprintf( + /* translators: %s: The module name. */ + __( 'The optional module, %s, is not installed, or has been disabled.' ), + $library + ); + } + + if ( ! $module['required'] && 'good' === $result['status'] ) { + $result['status'] = 'recommended'; + } + + $failures[ $library ] = "$screen_reader $message"; + } + } + + if ( ! empty( $failures ) ) { + $output = '
          '; + + foreach ( $failures as $failure ) { + $output .= sprintf( + '
        • %s
        • ', + $failure + ); + } + + $output .= '
        '; + } + + if ( 'good' !== $result['status'] ) { + if ( 'recommended' === $result['status'] ) { + $result['label'] = __( 'One or more recommended modules are missing' ); + } + if ( 'critical' === $result['status'] ) { + $result['label'] = __( 'One or more required modules are missing' ); + } + + $result['description'] .= sprintf( + '

        %s

        ', + $output + ); + } + + return $result; + } + + /** + * Test if the PHP default timezone is set to UTC. + * + * @since 5.3.1 + * + * @return array The test results. + */ + public function get_test_php_default_timezone() { + $result = array( + 'label' => __( 'PHP default timezone is valid' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'PHP default timezone was configured by WordPress on loading. This is necessary for correct calculations of dates and times.' ) + ), + 'test' => 'php_default_timezone', + ); + + if ( 'UTC' !== date_default_timezone_get() ) { + $result['status'] = 'critical'; + + $result['label'] = __( 'PHP default timezone is invalid' ); + + $result['description'] = sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: date_default_timezone_set() */ + __( 'PHP default timezone was changed after WordPress loading by a %s function call. This interferes with correct calculations of dates and times.' ), + 'date_default_timezone_set()' + ) + ); + } + + return $result; + } + + /** + * Test if the SQL server is up to date. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_sql_server() { + if ( ! $this->mysql_server_version ) { + $this->prepare_sql_data(); + } + + $result = array( + 'label' => __( 'SQL server is up to date' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'The SQL server is a required piece of software for the database WordPress uses to store all your site’s content and settings.' ) + ), + 'actions' => sprintf( + '

        %s %s

        ', + /* translators: Localized version of WordPress requirements if one exists. */ + esc_url( __( 'https://wordpress.org/about/requirements/' ) ), + __( 'Learn more about what WordPress requires to run.' ), + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ), + 'test' => 'sql_server', + ); + + $db_dropin = file_exists( WP_CONTENT_DIR . '/db.php' ); + + if ( ! $this->mysql_rec_version_check ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'Outdated SQL server' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: 1: The database engine in use (MySQL or MariaDB). 2: Database server recommended version number. */ + __( 'For optimal performance and security reasons, we recommend running %1$s version %2$s or higher. Contact your web hosting company to correct this.' ), + ( $this->is_mariadb ? 'MariaDB' : 'MySQL' ), + $this->health_check_mysql_rec_version + ) + ); + } + + if ( ! $this->mysql_min_version_check ) { + $result['status'] = 'critical'; + + $result['label'] = __( 'Severely outdated SQL server' ); + $result['badge']['label'] = __( 'Security' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: 1: The database engine in use (MySQL or MariaDB). 2: Database server minimum version number. */ + __( 'WordPress requires %1$s version %2$s or higher. Contact your web hosting company to correct this.' ), + ( $this->is_mariadb ? 'MariaDB' : 'MySQL' ), + $this->health_check_mysql_required_version + ) + ); + } + + if ( $db_dropin ) { + $result['description'] .= sprintf( + '

        %s

        ', + wp_kses( + sprintf( + /* translators: 1: The name of the drop-in. 2: The name of the database engine. */ + __( 'You are using a %1$s drop-in which might mean that a %2$s database is not being used.' ), + 'wp-content/db.php', + ( $this->is_mariadb ? 'MariaDB' : 'MySQL' ) + ), + array( + 'code' => true, + ) + ) + ); + } + + return $result; + } + + /** + * Test if the database server is capable of using utf8mb4. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_utf8mb4_support() { + global $wpdb; + + if ( ! $this->mysql_server_version ) { + $this->prepare_sql_data(); + } + + $result = array( + 'label' => __( 'UTF8MB4 is supported' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'UTF8MB4 is the character set WordPress prefers for database storage because it safely supports the widest set of characters and encodings, including Emoji, enabling better support for non-English languages.' ) + ), + 'actions' => '', + 'test' => 'utf8mb4_support', + ); + + if ( ! $this->is_mariadb ) { + if ( version_compare( $this->mysql_server_version, '5.5.3', '<' ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'utf8mb4 requires a MySQL update' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: Version number. */ + __( 'WordPress’ utf8mb4 support requires MySQL version %s or greater. Please contact your server administrator.' ), + '5.5.3' + ) + ); + } else { + $result['description'] .= sprintf( + '

        %s

        ', + __( 'Your MySQL version supports utf8mb4.' ) + ); + } + } else { // MariaDB introduced utf8mb4 support in 5.5.0. + if ( version_compare( $this->mysql_server_version, '5.5.0', '<' ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'utf8mb4 requires a MariaDB update' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: Version number. */ + __( 'WordPress’ utf8mb4 support requires MariaDB version %s or greater. Please contact your server administrator.' ), + '5.5.0' + ) + ); + } else { + $result['description'] .= sprintf( + '

        %s

        ', + __( 'Your MariaDB version supports utf8mb4.' ) + ); + } + } + + if ( $wpdb->use_mysqli ) { + // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysqli_get_client_info + $mysql_client_version = mysqli_get_client_info(); + } else { + // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_client_info,PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved + $mysql_client_version = mysql_get_client_info(); + } + + /* + * libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server. + * mysqlnd has supported utf8mb4 since 5.0.9. + */ + if ( false !== strpos( $mysql_client_version, 'mysqlnd' ) ) { + $mysql_client_version = preg_replace( '/^\D+([\d.]+).*/', '$1', $mysql_client_version ); + if ( version_compare( $mysql_client_version, '5.0.9', '<' ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'utf8mb4 requires a newer client library' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: 1: Name of the library, 2: Number of version. */ + __( 'WordPress’ utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator.' ), + 'mysqlnd', + '5.0.9' + ) + ); + } + } else { + if ( version_compare( $mysql_client_version, '5.5.3', '<' ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'utf8mb4 requires a newer client library' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: 1: Name of the library, 2: Number of version. */ + __( 'WordPress’ utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator.' ), + 'libmysql', + '5.5.3' + ) + ); + } + } + + return $result; + } + + /** + * Test if the site can communicate with WordPress.org. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_dotorg_communication() { + $result = array( + 'label' => __( 'Can communicate with WordPress.org' ), + 'status' => '', + 'badge' => array( + 'label' => __( 'Security' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'Communicating with the WordPress servers is used to check for new versions, and to both install and update WordPress core, themes or plugins.' ) + ), + 'actions' => '', + 'test' => 'dotorg_communication', + ); + + $wp_dotorg = wp_remote_get( + 'https://api.wordpress.org', + array( + 'timeout' => 10, + ) + ); + if ( ! is_wp_error( $wp_dotorg ) ) { + $result['status'] = 'good'; + } else { + $result['status'] = 'critical'; + + $result['label'] = __( 'Could not reach WordPress.org' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + '%s %s', + __( 'Error' ), + sprintf( + /* translators: 1: The IP address WordPress.org resolves to. 2: The error returned by the lookup. */ + __( 'Your site is unable to reach WordPress.org at %1$s, and returned the error: %2$s' ), + gethostbyname( 'api.wordpress.org' ), + $wp_dotorg->get_error_message() + ) + ) + ); + + $result['actions'] = sprintf( + '

        %s %s

        ', + /* translators: Localized Support reference. */ + esc_url( __( 'https://wordpress.org/support' ) ), + __( 'Get help resolving this issue.' ), + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ); + } + + return $result; + } + + /** + * Test if debug information is enabled. + * + * When WP_DEBUG is enabled, errors and information may be disclosed to site visitors, or it may be + * logged to a publicly accessible file. + * + * Debugging is also frequently left enabled after looking for errors on a site, as site owners do + * not understand the implications of this. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_is_in_debug_mode() { + $result = array( + 'label' => __( 'Your site is not set to output debug information' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Security' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'Debug mode is often enabled to gather more details about an error or site failure, but may contain sensitive information which should not be available on a publicly available website.' ) + ), + 'actions' => sprintf( + '

        %s %s

        ', + /* translators: Documentation explaining debugging in WordPress. */ + esc_url( __( 'https://wordpress.org/support/article/debugging-in-wordpress/' ) ), + __( 'Learn more about debugging in WordPress.' ), + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ), + 'test' => 'is_in_debug_mode', + ); + + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) { + $result['label'] = __( 'Your site is set to log errors to a potentially public file.' ); + + $result['status'] = ( 0 === strpos( ini_get( 'error_log' ), ABSPATH ) ) ? 'critical' : 'recommended'; + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: WP_DEBUG_LOG */ + __( 'The value, %s, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to normal users.' ), + 'WP_DEBUG_LOG' + ) + ); + } + + if ( defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY ) { + $result['label'] = __( 'Your site is set to display errors to site visitors' ); + + $result['status'] = 'critical'; + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: 1: WP_DEBUG_DISPLAY, 2: WP_DEBUG */ + __( 'The value, %1$s, has either been enabled by %2$s or added to your configuration file. This will make errors display on the front end of your site.' ), + 'WP_DEBUG_DISPLAY', + 'WP_DEBUG' + ) + ); + } + } + + return $result; + } + + /** + * Test if your site is serving content over HTTPS. + * + * Many sites have varying degrees of HTTPS support, the most common of which is sites that have it + * enabled, but only if you visit the right site address. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_https_status() { + $result = array( + 'label' => __( 'Your website is using an active HTTPS connection.' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Security' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'An HTTPS connection is a more secure way of browsing the web. Many services now have HTTPS as a requirement. HTTPS allows you to take advantage of new features that can increase site speed, improve search rankings, and gain the trust of your visitors by helping to protect their online privacy.' ) + ), + 'actions' => sprintf( + '

        %s %s

        ', + /* translators: Documentation explaining HTTPS and why it should be used. */ + esc_url( __( 'https://wordpress.org/support/article/why-should-i-use-https/' ) ), + __( 'Learn more about why you should use HTTPS' ), + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ), + 'test' => 'https_status', + ); + + if ( is_ssl() ) { + $wp_url = get_bloginfo( 'wpurl' ); + $site_url = get_bloginfo( 'url' ); + + if ( 'https' !== substr( $wp_url, 0, 5 ) || 'https' !== substr( $site_url, 0, 5 ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'Only parts of your site are using HTTPS' ); + + $result['description'] = sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: URL to General Settings screen. */ + __( 'You are accessing this website using HTTPS, but your WordPress Address is not set up to use HTTPS by default.' ), + esc_url( admin_url( 'options-general.php' ) ) + ) + ); + + $result['actions'] .= sprintf( + '

        %s

        ', + esc_url( admin_url( 'options-general.php' ) ), + __( 'Update your site addresses' ) + ); + } + } else { + $result['status'] = 'recommended'; + + $result['label'] = __( 'Your site does not use HTTPS' ); + } + + return $result; + } + + /** + * Check if the HTTP API can handle SSL/TLS requests. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_ssl_support() { + $result = array( + 'label' => '', + 'status' => '', + 'badge' => array( + 'label' => __( 'Security' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'Securely communicating between servers are needed for transactions such as fetching files, conducting sales on store sites, and much more.' ) + ), + 'actions' => '', + 'test' => 'ssl_support', + ); + + $supports_https = wp_http_supports( array( 'ssl' ) ); + + if ( $supports_https ) { + $result['status'] = 'good'; + + $result['label'] = __( 'Your site can communicate securely with other services' ); + } else { + $result['status'] = 'critical'; + + $result['label'] = __( 'Your site is unable to communicate securely with other services' ); + + $result['description'] .= sprintf( + '

        %s

        ', + __( 'Talk to your web host about OpenSSL support for PHP.' ) + ); + } + + return $result; + } + + /** + * Test if scheduled events run as intended. + * + * If scheduled events are not running, this may indicate something with WP_Cron is not working as intended, + * or that there are orphaned events hanging around from older code. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_scheduled_events() { + $result = array( + 'label' => __( 'Scheduled events are running' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'Scheduled events are what periodically looks for updates to plugins, themes and WordPress itself. It is also what makes sure scheduled posts are published on time. It may also be used by various plugins to make sure that planned actions are executed.' ) + ), + 'actions' => '', + 'test' => 'scheduled_events', + ); + + $this->wp_schedule_test_init(); + + if ( is_wp_error( $this->has_missed_cron() ) ) { + $result['status'] = 'critical'; + + $result['label'] = __( 'It was not possible to check your scheduled events' ); + + $result['description'] = sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: The error message returned while from the cron scheduler. */ + __( 'While trying to test your site’s scheduled events, the following error was returned: %s' ), + $this->has_missed_cron()->get_error_message() + ) + ); + } elseif ( $this->has_missed_cron() ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'A scheduled event has failed' ); + + $result['description'] = sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: The name of the failed cron event. */ + __( 'The scheduled event, %s, failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended.' ), + $this->last_missed_cron + ) + ); + } elseif ( $this->has_late_cron() ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'A scheduled event is late' ); + + $result['description'] = sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: The name of the late cron event. */ + __( 'The scheduled event, %s, is late to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended.' ), + $this->last_late_cron + ) + ); + } + + return $result; + } + + /** + * Test if WordPress can run automated background updates. + * + * Background updates in WordPress are primarily used for minor releases and security updates. It's important + * to either have these working, or be aware that they are intentionally disabled for whatever reason. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_background_updates() { + $result = array( + 'label' => __( 'Background updates are working' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Security' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'Background updates ensure that WordPress can auto-update if a security update is released for the version you are currently using.' ) + ), + 'actions' => '', + 'test' => 'background_updates', + ); + + if ( ! class_exists( 'WP_Site_Health_Auto_Updates' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-site-health-auto-updates.php'; + } + + // Run the auto-update tests in a separate class, + // as there are many considerations to be made. + $automatic_updates = new WP_Site_Health_Auto_Updates(); + $tests = $automatic_updates->run_tests(); + + $output = '
          '; + + foreach ( $tests as $test ) { + $severity_string = __( 'Passed' ); + + if ( 'fail' === $test->severity ) { + $result['label'] = __( 'Background updates are not working as expected' ); + + $result['status'] = 'critical'; + + $severity_string = __( 'Error' ); + } + + if ( 'warning' === $test->severity && 'good' === $result['status'] ) { + $result['label'] = __( 'Background updates may not be working properly' ); + + $result['status'] = 'recommended'; + + $severity_string = __( 'Warning' ); + } + + $output .= sprintf( + '
        • %s %s
        • ', + esc_attr( $test->severity ), + $severity_string, + $test->description + ); + } + + $output .= '
        '; + + if ( 'good' !== $result['status'] ) { + $result['description'] .= sprintf( + '

        %s

        ', + $output + ); + } + + return $result; + } + + /** + * Test if loopbacks work as expected. + * + * A loopback is when WordPress queries itself, for example to start a new WP_Cron instance, or when editing a + * plugin or theme. This has shown itself to be a recurring issue as code can very easily break this interaction. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_loopback_requests() { + $result = array( + 'label' => __( 'Your site can perform loopback requests' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'Loopback requests are used to run scheduled events, and are also used by the built-in editors for themes and plugins to verify code stability.' ) + ), + 'actions' => '', + 'test' => 'loopback_requests', + ); + + $check_loopback = $this->can_perform_loopback(); + + $result['status'] = $check_loopback->status; + + if ( 'good' !== $check_loopback->status ) { + $result['label'] = __( 'Your site could not complete a loopback request' ); + + $result['description'] .= sprintf( + '

        %s

        ', + $check_loopback->message + ); + } + + return $result; + } + + /** + * Test if HTTP requests are blocked. + * + * It's possible to block all outgoing communication (with the possibility of whitelisting hosts) via the + * HTTP API. This may create problems for users as many features are running as services these days. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_http_requests() { + $result = array( + 'label' => __( 'HTTP requests seem to be working as expected' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'It is possible for site maintainers to block all, or some, communication to other sites and services. If set up incorrectly, this may prevent plugins and themes from working as intended.' ) + ), + 'actions' => '', + 'test' => 'http_requests', + ); + + $blocked = false; + $hosts = array(); + + if ( defined( 'WP_HTTP_BLOCK_EXTERNAL' ) && WP_HTTP_BLOCK_EXTERNAL ) { + $blocked = true; + } + + if ( defined( 'WP_ACCESSIBLE_HOSTS' ) ) { + $hosts = explode( ',', WP_ACCESSIBLE_HOSTS ); + } + + if ( $blocked && 0 === sizeof( $hosts ) ) { + $result['status'] = 'critical'; + + $result['label'] = __( 'HTTP requests are blocked' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: Name of the constant used. */ + __( 'HTTP requests have been blocked by the %s constant, with no allowed hosts.' ), + 'WP_HTTP_BLOCK_EXTERNAL' + ) + ); + } + + if ( $blocked && 0 < sizeof( $hosts ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'HTTP requests are partially blocked' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: 1: Name of the constant used. 2: List of hostnames whitelisted. */ + __( 'HTTP requests have been blocked by the %1$s constant, with some hosts whitelisted: %2$s.' ), + 'WP_HTTP_BLOCK_EXTERNAL', + implode( ',', $hosts ) + ) + ); + } + + return $result; + } + + /** + * Test if the REST API is accessible. + * + * Various security measures may block the REST API from working, or it may have been disabled in general. + * This is required for the new block editor to work, so we explicitly test for this. + * + * @since 5.2.0 + * + * @return array The test results. + */ + public function get_test_rest_availability() { + $result = array( + 'label' => __( 'The REST API is available' ), + 'status' => 'good', + 'badge' => array( + 'label' => __( 'Performance' ), + 'color' => 'blue', + ), + 'description' => sprintf( + '

        %s

        ', + __( 'The REST API is one way WordPress, and other applications, communicate with the server. One example is the block editor screen, which relies on this to display, and save, your posts and pages.' ) + ), + 'actions' => '', + 'test' => 'rest_availability', + ); + + $cookies = wp_unslash( $_COOKIE ); + $timeout = 10; + $headers = array( + 'Cache-Control' => 'no-cache', + 'X-WP-Nonce' => wp_create_nonce( 'wp_rest' ), + ); + /** This filter is documented in wp-includes/class-wp-http-streams.php */ + $sslverify = apply_filters( 'https_local_ssl_verify', false ); + + // Include Basic auth in loopback requests. + if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) { + $headers['Authorization'] = 'Basic ' . base64_encode( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) . ':' . wp_unslash( $_SERVER['PHP_AUTH_PW'] ) ); + } + + $url = rest_url( 'wp/v2/types/post' ); + + // The context for this is editing with the new block editor. + $url = add_query_arg( + array( + 'context' => 'edit', + ), + $url + ); + + $r = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout', 'sslverify' ) ); + + if ( is_wp_error( $r ) ) { + $result['status'] = 'critical'; + + $result['label'] = __( 'The REST API encountered an error' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + '%s
        %s', + __( 'The REST API request failed due to an error.' ), + sprintf( + /* translators: 1: The WordPress error message. 2: The WordPress error code. */ + __( 'Error: %1$s (%2$s)' ), + $r->get_error_message(), + $r->get_error_code() + ) + ) + ); + } elseif ( 200 !== wp_remote_retrieve_response_code( $r ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'The REST API encountered an unexpected result' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: 1: The HTTP error code. 2: The HTTP error message. */ + __( 'The REST API call gave the following unexpected result: (%1$d) %2$s.' ), + wp_remote_retrieve_response_code( $r ), + wp_remote_retrieve_body( $r ) + ) + ); + } else { + $json = json_decode( wp_remote_retrieve_body( $r ), true ); + + if ( false !== $json && ! isset( $json['capabilities'] ) ) { + $result['status'] = 'recommended'; + + $result['label'] = __( 'The REST API did not behave correctly' ); + + $result['description'] .= sprintf( + '

        %s

        ', + sprintf( + /* translators: %s: The name of the query parameter being tested. */ + __( 'The REST API did not process the %s query parameter correctly.' ), + 'context' + ) + ); + } + } + + return $result; + } + + /** + * Return a set of tests that belong to the site status page. + * + * Each site status test is defined here, they may be `direct` tests, that run on page load, or `async` tests + * which will run later down the line via JavaScript calls to improve page performance and hopefully also user + * experiences. + * + * @since 5.2.0 + * + * @return array The list of tests to run. + */ + public static function get_tests() { + $tests = array( + 'direct' => array( + 'wordpress_version' => array( + 'label' => __( 'WordPress Version' ), + 'test' => 'wordpress_version', + ), + 'plugin_version' => array( + 'label' => __( 'Plugin Versions' ), + 'test' => 'plugin_version', + ), + 'theme_version' => array( + 'label' => __( 'Theme Versions' ), + 'test' => 'theme_version', + ), + 'php_version' => array( + 'label' => __( 'PHP Version' ), + 'test' => 'php_version', + ), + 'php_extensions' => array( + 'label' => __( 'PHP Extensions' ), + 'test' => 'php_extensions', + ), + 'php_default_timezone' => array( + 'label' => __( 'PHP Default Timezone' ), + 'test' => 'php_default_timezone', + ), + 'sql_server' => array( + 'label' => __( 'Database Server version' ), + 'test' => 'sql_server', + ), + 'utf8mb4_support' => array( + 'label' => __( 'MySQL utf8mb4 support' ), + 'test' => 'utf8mb4_support', + ), + 'https_status' => array( + 'label' => __( 'HTTPS status' ), + 'test' => 'https_status', + ), + 'ssl_support' => array( + 'label' => __( 'Secure communication' ), + 'test' => 'ssl_support', + ), + 'scheduled_events' => array( + 'label' => __( 'Scheduled events' ), + 'test' => 'scheduled_events', + ), + 'http_requests' => array( + 'label' => __( 'HTTP Requests' ), + 'test' => 'http_requests', + ), + 'debug_enabled' => array( + 'label' => __( 'Debugging enabled' ), + 'test' => 'is_in_debug_mode', + ), + ), + 'async' => array( + 'dotorg_communication' => array( + 'label' => __( 'Communication with WordPress.org' ), + 'test' => 'dotorg_communication', + ), + 'background_updates' => array( + 'label' => __( 'Background updates' ), + 'test' => 'background_updates', + ), + 'loopback_requests' => array( + 'label' => __( 'Loopback request' ), + 'test' => 'loopback_requests', + ), + ), + ); + + // Conditionally include REST rules if the function for it exists. + if ( function_exists( 'rest_url' ) ) { + $tests['direct']['rest_availability'] = array( + 'label' => __( 'REST API availability' ), + 'test' => 'rest_availability', + ); + } + + /** + * Add or modify which site status tests are run on a site. + * + * The site health is determined by a set of tests based on best practices from + * both the WordPress Hosting Team, but also web standards in general. + * + * Some sites may not have the same requirements, for example the automatic update + * checks may be handled by a host, and are therefore disabled in core. + * Or maybe you want to introduce a new test, is caching enabled/disabled/stale for example. + * + * Tests may be added either as direct, or asynchronous ones. Any test that may require some time + * to complete should run asynchronously, to avoid extended loading periods within wp-admin. + * + * @since 5.2.0 + * + * @param array $test_type { + * An associative array, where the `$test_type` is either `direct` or + * `async`, to declare if the test should run via AJAX calls after page load. + * + * @type array $identifier { + * `$identifier` should be a unique identifier for the test that should run. + * Plugins and themes are encouraged to prefix test identifiers with their slug + * to avoid any collisions between tests. + * + * @type string $label A friendly label for your test to identify it by. + * @type mixed $test A callable to perform a direct test, or a string AJAX action to be called + * to perform an async test. + * } + * } + */ + $tests = apply_filters( 'site_status_tests', $tests ); + + return $tests; + } + + /** + * Add a class to the body HTML tag. + * + * Filters the body class string for admin pages and adds our own class for easier styling. + * + * @since 5.2.0 + * + * @param string $body_class The body class string. + * @return string The modified body class string. + */ + public function admin_body_class( $body_class ) { + $screen = get_current_screen(); + if ( 'site-health' !== $screen->id ) { + return $body_class; + } + + $body_class .= ' site-health'; + + return $body_class; + } + + /** + * Initiate the WP_Cron schedule test cases. + * + * @since 5.2.0 + */ + private function wp_schedule_test_init() { + $this->schedules = wp_get_schedules(); + $this->get_cron_tasks(); + } + + /** + * Populate our list of cron events and store them to a class-wide variable. + * + * @since 5.2.0 + */ + private function get_cron_tasks() { + $cron_tasks = _get_cron_array(); + + if ( empty( $cron_tasks ) ) { + $this->crons = new WP_Error( 'no_tasks', __( 'No scheduled events exist on this site.' ) ); + return; + } + + $this->crons = array(); + + foreach ( $cron_tasks as $time => $cron ) { + foreach ( $cron as $hook => $dings ) { + foreach ( $dings as $sig => $data ) { + + $this->crons[ "$hook-$sig-$time" ] = (object) array( + 'hook' => $hook, + 'time' => $time, + 'sig' => $sig, + 'args' => $data['args'], + 'schedule' => $data['schedule'], + 'interval' => isset( $data['interval'] ) ? $data['interval'] : null, + ); + + } + } + } + } + + /** + * Check if any scheduled tasks have been missed. + * + * Returns a boolean value of `true` if a scheduled task has been missed and ends processing. If the list of + * crons is an instance of WP_Error, return the instance instead of a boolean value. + * + * @since 5.2.0 + * + * @return bool|WP_Error True if a cron was missed, false if not. WP_Error if the cron is set to that. + */ + public function has_missed_cron() { + if ( is_wp_error( $this->crons ) ) { + return $this->crons; + } + + foreach ( $this->crons as $id => $cron ) { + if ( ( $cron->time - time() ) < $this->timeout_missed_cron ) { + $this->last_missed_cron = $cron->hook; + return true; + } + } + + return false; + } + + /** + * Check if any scheduled tasks are late. + * + * Returns a boolean value of `true` if a scheduled task is late and ends processing. If the list of + * crons is an instance of WP_Error, return the instance instead of a boolean value. + * + * @since 5.3.0 + * + * @return bool|WP_Error True if a cron is late, false if not. WP_Error if the cron is set to that. + */ + public function has_late_cron() { + if ( is_wp_error( $this->crons ) ) { + return $this->crons; + } + + foreach ( $this->crons as $id => $cron ) { + $cron_offset = $cron->time - time(); + if ( + $cron_offset >= $this->timeout_missed_cron && + $cron_offset < $this->timeout_late_cron + ) { + $this->last_late_cron = $cron->hook; + return true; + } + } + + return false; + } + + /** + * Run a loopback test on our site. + * + * Loopbacks are what WordPress uses to communicate with itself to start up WP_Cron, scheduled posts, + * make sure plugin or theme edits don't cause site failures and similar. + * + * @since 5.2.0 + * + * @return object The test results. + */ + function can_perform_loopback() { + $cookies = wp_unslash( $_COOKIE ); + $timeout = 10; + $headers = array( + 'Cache-Control' => 'no-cache', + ); + /** This filter is documented in wp-includes/class-wp-http-streams.php */ + $sslverify = apply_filters( 'https_local_ssl_verify', false ); + + // Include Basic auth in loopback requests. + if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) { + $headers['Authorization'] = 'Basic ' . base64_encode( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) . ':' . wp_unslash( $_SERVER['PHP_AUTH_PW'] ) ); + } + + $url = admin_url(); + + $r = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout', 'sslverify' ) ); + + if ( is_wp_error( $r ) ) { + return (object) array( + 'status' => 'critical', + 'message' => sprintf( + '%s
        %s', + __( 'The loopback request to your site failed, this means features relying on them are not currently working as expected.' ), + sprintf( + /* translators: 1: The WordPress error message. 2: The WordPress error code. */ + __( 'Error: %1$s (%2$s)' ), + $r->get_error_message(), + $r->get_error_code() + ) + ), + ); + } + + if ( 200 !== wp_remote_retrieve_response_code( $r ) ) { + return (object) array( + 'status' => 'recommended', + 'message' => sprintf( + /* translators: %d: The HTTP response code returned. */ + __( 'The loopback request returned an unexpected http status code, %d, it was not possible to determine if this will prevent features from working as expected.' ), + wp_remote_retrieve_response_code( $r ) + ), + ); + } + + return (object) array( + 'status' => 'good', + 'message' => __( 'The loopback request to your site completed successfully.' ), + ); + } + + /** + * Create a weekly cron event, if one does not already exist. + * + * @since 5.4.0 + */ + public function maybe_create_scheduled_event() { + if ( ! wp_next_scheduled( 'wp_site_health_scheduled_check' ) && ! wp_installing() ) { + wp_schedule_event( time() + DAY_IN_SECONDS, 'weekly', 'wp_site_health_scheduled_check' ); + } + } + + /** + * Run our scheduled event to check and update the latest site health status for the website. + * + * @since 5.4.0 + */ + public function wp_cron_scheduled_check() { + // Bootstrap wp-admin, as WP_Cron doesn't do this for us. + require_once trailingslashit( ABSPATH ) . 'wp-admin/includes/admin.php'; + + $tests = WP_Site_Health::get_tests(); + + $results = array(); + + $site_status = array( + 'good' => 0, + 'recommended' => 0, + 'critical' => 0, + ); + + // Don't run https test on localhost. + if ( 'localhost' === preg_replace( '|https?://|', '', get_site_url() ) ) { + unset( $tests['direct']['https_status'] ); + } + + foreach ( $tests['direct'] as $test ) { + + if ( is_string( $test['test'] ) ) { + $test_function = sprintf( + 'get_test_%s', + $test['test'] + ); + + if ( method_exists( $this, $test_function ) && is_callable( array( $this, $test_function ) ) ) { + $results[] = $this->perform_test( array( $this, $test_function ) ); + continue; + } + } + + if ( is_callable( $test['test'] ) ) { + $results[] = $this->perform_test( $test['test'] ); + } + } + + foreach ( $tests['async'] as $test ) { + if ( is_string( $test['test'] ) ) { + if ( isset( $test['has_rest'] ) && $test['has_rest'] ) { + $result_fetch = wp_remote_post( + rest_url( $test['test'] ), + array( + 'body' => array( + '_wpnonce' => wp_create_nonce( 'wp_rest' ), + ), + ) + ); + } else { + $result_fetch = wp_remote_post( + admin_url( 'admin-ajax.php' ), + array( + 'body' => array( + 'action' => $test['test'], + '_wpnonce' => wp_create_nonce( 'health-check-site-status' ), + ), + ) + ); + } + + if ( ! is_wp_error( $result_fetch ) ) { + $result = json_decode( wp_remote_retrieve_body( $result_fetch ), true ); + } else { + $result = false; + } + + if ( is_array( $result ) ) { + $results[] = $result; + } else { + $results[] = array( + 'status' => 'recommended', + 'label' => __( 'A test is unavailable' ), + ); + } + } + } + + foreach ( $results as $result ) { + if ( 'critical' === $result['status'] ) { + $site_status['critical']++; + } elseif ( 'recommended' === $result['status'] ) { + $site_status['recommended']++; + } else { + $site_status['good']++; + } + } + + set_transient( 'health-check-site-status-result', wp_json_encode( $site_status ) ); + } +} diff --git a/wp-admin/includes/class-wp-site-icon.php b/wp-admin/includes/class-wp-site-icon.php new file mode 100644 index 0000000..8d991e4 --- /dev/null +++ b/wp-admin/includes/class-wp-site-icon.php @@ -0,0 +1,233 @@ +ID ); + $url = str_replace( wp_basename( $parent_url ), wp_basename( $cropped ), $parent_url ); + + $size = @getimagesize( $cropped ); + $image_type = ( $size ) ? $size['mime'] : 'image/jpeg'; + + $object = array( + 'ID' => $parent_attachment_id, + 'post_title' => wp_basename( $cropped ), + 'post_content' => $url, + 'post_mime_type' => $image_type, + 'guid' => $url, + 'context' => 'site-icon', + ); + + return $object; + } + + /** + * Inserts an attachment. + * + * @since 4.3.0 + * + * @param array $object Attachment object. + * @param string $file File path of the attached image. + * @return int Attachment ID + */ + public function insert_attachment( $object, $file ) { + $attachment_id = wp_insert_attachment( $object, $file ); + $metadata = wp_generate_attachment_metadata( $attachment_id, $file ); + + /** + * Filters the site icon attachment metadata. + * + * @since 4.3.0 + * + * @see wp_generate_attachment_metadata() + * + * @param array $metadata Attachment metadata. + */ + $metadata = apply_filters( 'site_icon_attachment_metadata', $metadata ); + wp_update_attachment_metadata( $attachment_id, $metadata ); + + return $attachment_id; + } + + /** + * Adds additional sizes to be made when creating the site icon images. + * + * @since 4.3.0 + * + * @param array[] $sizes Array of arrays containing information for additional sizes. + * @return array[] Array of arrays containing additional image sizes. + */ + public function additional_sizes( $sizes = array() ) { + $only_crop_sizes = array(); + + /** + * Filters the different dimensions that a site icon is saved in. + * + * @since 4.3.0 + * + * @param int[] $site_icon_sizes Array of sizes available for the Site Icon. + */ + $this->site_icon_sizes = apply_filters( 'site_icon_image_sizes', $this->site_icon_sizes ); + + // Use a natural sort of numbers. + natsort( $this->site_icon_sizes ); + $this->site_icon_sizes = array_reverse( $this->site_icon_sizes ); + + // Ensure that we only resize the image into sizes that allow cropping. + foreach ( $sizes as $name => $size_array ) { + if ( isset( $size_array['crop'] ) ) { + $only_crop_sizes[ $name ] = $size_array; + } + } + + foreach ( $this->site_icon_sizes as $size ) { + if ( $size < $this->min_size ) { + $only_crop_sizes[ 'site_icon-' . $size ] = array( + 'width ' => $size, + 'height' => $size, + 'crop' => true, + ); + } + } + + return $only_crop_sizes; + } + + /** + * Adds Site Icon sizes to the array of image sizes on demand. + * + * @since 4.3.0 + * + * @param string[] $sizes Array of image size names. + * @return string[] Array of image size names. + */ + public function intermediate_image_sizes( $sizes = array() ) { + /** This filter is documented in wp-admin/includes/class-wp-site-icon.php */ + $this->site_icon_sizes = apply_filters( 'site_icon_image_sizes', $this->site_icon_sizes ); + foreach ( $this->site_icon_sizes as $size ) { + $sizes[] = 'site_icon-' . $size; + } + + return $sizes; + } + + /** + * Deletes the Site Icon when the image file is deleted. + * + * @since 4.3.0 + * + * @param int $post_id Attachment ID. + */ + public function delete_attachment_data( $post_id ) { + $site_icon_id = get_option( 'site_icon' ); + + if ( $site_icon_id && $post_id == $site_icon_id ) { + delete_option( 'site_icon' ); + } + } + + /** + * Adds custom image sizes when meta data for an image is requested, that happens to be used as Site Icon. + * + * @since 4.3.0 + * + * @param null|array|string $value The value get_metadata() should return a single metadata value, or an + * array of values. + * @param int $post_id Post ID. + * @param string $meta_key Meta key. + * @param string|array $single Meta value, or an array of values. + * @return array|null|string The attachment metadata value, array of values, or null. + */ + public function get_post_metadata( $value, $post_id, $meta_key, $single ) { + if ( $single && '_wp_attachment_backup_sizes' === $meta_key ) { + $site_icon_id = get_option( 'site_icon' ); + + if ( $post_id == $site_icon_id ) { + add_filter( 'intermediate_image_sizes', array( $this, 'intermediate_image_sizes' ) ); + } + } + + return $value; + } +} diff --git a/wp-admin/includes/class-wp-terms-list-table.php b/wp-admin/includes/class-wp-terms-list-table.php new file mode 100644 index 0000000..651c4d1 --- /dev/null +++ b/wp-admin/includes/class-wp-terms-list-table.php @@ -0,0 +1,701 @@ + 'tags', + 'singular' => 'tag', + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ) + ); + + $action = $this->screen->action; + $post_type = $this->screen->post_type; + $taxonomy = $this->screen->taxonomy; + + if ( empty( $taxonomy ) ) { + $taxonomy = 'post_tag'; + } + + if ( ! taxonomy_exists( $taxonomy ) ) { + wp_die( __( 'Invalid taxonomy.' ) ); + } + + $tax = get_taxonomy( $taxonomy ); + + // @todo Still needed? Maybe just the show_ui part. + if ( empty( $post_type ) || ! in_array( $post_type, get_post_types( array( 'show_ui' => true ) ) ) ) { + $post_type = 'post'; + } + + } + + /** + * @return bool + */ + public function ajax_user_can() { + return current_user_can( get_taxonomy( $this->screen->taxonomy )->cap->manage_terms ); + } + + /** + */ + public function prepare_items() { + $tags_per_page = $this->get_items_per_page( 'edit_' . $this->screen->taxonomy . '_per_page' ); + + if ( 'post_tag' === $this->screen->taxonomy ) { + /** + * Filters the number of terms displayed per page for the Tags list table. + * + * @since 2.8.0 + * + * @param int $tags_per_page Number of tags to be displayed. Default 20. + */ + $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page ); + + /** + * Filters the number of terms displayed per page for the Tags list table. + * + * @since 2.7.0 + * @deprecated 2.8.0 Use {@see 'edit_tags_per_page'} instead. + * + * @param int $tags_per_page Number of tags to be displayed. Default 20. + */ + $tags_per_page = apply_filters_deprecated( 'tagsperpage', array( $tags_per_page ), '2.8.0', 'edit_tags_per_page' ); + } elseif ( 'category' === $this->screen->taxonomy ) { + /** + * Filters the number of terms displayed per page for the Categories list table. + * + * @since 2.8.0 + * + * @param int $tags_per_page Number of categories to be displayed. Default 20. + */ + $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); + } + + $search = ! empty( $_REQUEST['s'] ) ? trim( wp_unslash( $_REQUEST['s'] ) ) : ''; + + $args = array( + 'search' => $search, + 'page' => $this->get_pagenum(), + 'number' => $tags_per_page, + ); + + if ( ! empty( $_REQUEST['orderby'] ) ) { + $args['orderby'] = trim( wp_unslash( $_REQUEST['orderby'] ) ); + } + + if ( ! empty( $_REQUEST['order'] ) ) { + $args['order'] = trim( wp_unslash( $_REQUEST['order'] ) ); + } + + $this->callback_args = $args; + + $this->set_pagination_args( + array( + 'total_items' => wp_count_terms( $this->screen->taxonomy, compact( 'search' ) ), + 'per_page' => $tags_per_page, + ) + ); + } + + /** + * @return bool + */ + public function has_items() { + // @todo Populate $this->items in prepare_items(). + return true; + } + + /** + */ + public function no_items() { + echo get_taxonomy( $this->screen->taxonomy )->labels->not_found; + } + + /** + * @return array + */ + protected function get_bulk_actions() { + $actions = array(); + + if ( current_user_can( get_taxonomy( $this->screen->taxonomy )->cap->delete_terms ) ) { + $actions['delete'] = __( 'Delete' ); + } + + return $actions; + } + + /** + * @return string + */ + public function current_action() { + if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' === $_REQUEST['action'] || 'delete' === $_REQUEST['action2'] ) ) { + return 'bulk-delete'; + } + + return parent::current_action(); + } + + /** + * @return array + */ + public function get_columns() { + $columns = array( + 'cb' => '', + 'name' => _x( 'Name', 'term name' ), + 'description' => __( 'Description' ), + 'slug' => __( 'Slug' ), + ); + + if ( 'link_category' === $this->screen->taxonomy ) { + $columns['links'] = __( 'Links' ); + } else { + $columns['posts'] = _x( 'Count', 'Number/count of items' ); + } + + return $columns; + } + + /** + * @return array + */ + protected function get_sortable_columns() { + return array( + 'name' => 'name', + 'description' => 'description', + 'slug' => 'slug', + 'posts' => 'count', + 'links' => 'count', + ); + } + + /** + */ + public function display_rows_or_placeholder() { + $taxonomy = $this->screen->taxonomy; + + $args = wp_parse_args( + $this->callback_args, + array( + 'taxonomy' => $taxonomy, + 'page' => 1, + 'number' => 20, + 'search' => '', + 'hide_empty' => 0, + ) + ); + + $page = $args['page']; + + // Set variable because $args['number'] can be subsequently overridden. + $number = $args['number']; + + $offset = ( $page - 1 ) * $number; + $args['offset'] = $offset; + + // Convert it to table rows. + $count = 0; + + if ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $args['orderby'] ) ) { + // We'll need the full set of terms then. + $args['number'] = 0; + $args['offset'] = $args['number']; + } + + $terms = get_terms( $args ); + + if ( empty( $terms ) || ! is_array( $terms ) ) { + echo ''; + $this->no_items(); + echo ''; + return; + } + + if ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $args['orderby'] ) ) { + if ( ! empty( $args['search'] ) ) {// Ignore children on searches. + $children = array(); + } else { + $children = _get_term_hierarchy( $taxonomy ); + } + + /* + * Some funky recursion to get the job done (paging & parents mainly) is contained within. + * Skip it for non-hierarchical taxonomies for performance sake. + */ + $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count ); + } else { + foreach ( $terms as $term ) { + $this->single_row( $term ); + } + } + } + + /** + * @param string $taxonomy + * @param array $terms + * @param array $children + * @param int $start + * @param int $per_page + * @param int $count + * @param int $parent + * @param int $level + */ + private function _rows( $taxonomy, $terms, &$children, $start, $per_page, &$count, $parent = 0, $level = 0 ) { + + $end = $start + $per_page; + + foreach ( $terms as $key => $term ) { + + if ( $count >= $end ) { + break; + } + + if ( $term->parent != $parent && empty( $_REQUEST['s'] ) ) { + continue; + } + + // If the page starts in a subtree, print the parents. + if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) { + $my_parents = array(); + $parent_ids = array(); + $p = $term->parent; + while ( $p ) { + $my_parent = get_term( $p, $taxonomy ); + $my_parents[] = $my_parent; + $p = $my_parent->parent; + if ( in_array( $p, $parent_ids ) ) { // Prevent parent loops. + break; + } + $parent_ids[] = $p; + } + unset( $parent_ids ); + + $num_parents = count( $my_parents ); + while ( $my_parent = array_pop( $my_parents ) ) { + echo "\t"; + $this->single_row( $my_parent, $level - $num_parents ); + $num_parents--; + } + } + + if ( $count >= $start ) { + echo "\t"; + $this->single_row( $term, $level ); + } + + ++$count; + + unset( $terms[ $key ] ); + + if ( isset( $children[ $term->term_id ] ) && empty( $_REQUEST['s'] ) ) { + $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 ); + } + } + } + + /** + * @global string $taxonomy + * @param WP_Term $tag Term object. + * @param int $level + */ + public function single_row( $tag, $level = 0 ) { + global $taxonomy; + $tag = sanitize_term( $tag, $taxonomy ); + + $this->level = $level; + + if ( $tag->parent ) { + $count = count( get_ancestors( $tag->term_id, $taxonomy, 'taxonomy' ) ); + $level = 'level-' . $count; + } else { + $level = 'level-0'; + } + + echo ''; + $this->single_row_columns( $tag ); + echo ''; + } + + /** + * @param WP_Term $tag Term object. + * @return string + */ + public function column_cb( $tag ) { + if ( current_user_can( 'delete_term', $tag->term_id ) ) { + return sprintf( + '' . + '', + $tag->term_id, + /* translators: %s: Taxonomy term name. */ + sprintf( __( 'Select %s' ), $tag->name ) + ); + } + + return ' '; + } + + /** + * @param WP_Term $tag Term object. + * @return string + */ + public function column_name( $tag ) { + $taxonomy = $this->screen->taxonomy; + + $pad = str_repeat( '— ', max( 0, $this->level ) ); + + /** + * Filters display of the term name in the terms list table. + * + * The default output may include padding due to the term's + * current level in the term hierarchy. + * + * @since 2.5.0 + * + * @see WP_Terms_List_Table::column_name() + * + * @param string $pad_tag_name The term name, padded if not top-level. + * @param WP_Term $tag Term object. + */ + $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag ); + + $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' ); + + $uri = wp_doing_ajax() ? wp_get_referer() : $_SERVER['REQUEST_URI']; + + $edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $this->screen->post_type ); + + if ( $edit_link ) { + $edit_link = add_query_arg( + 'wp_http_referer', + urlencode( wp_unslash( $uri ) ), + $edit_link + ); + $name = sprintf( + '%s', + esc_url( $edit_link ), + /* translators: %s: Taxonomy term name. */ + esc_attr( sprintf( __( '“%s” (Edit)' ), $tag->name ) ), + $name + ); + } + + $out = sprintf( + '%s
        ', + $name + ); + + $out .= ''; + + return $out; + } + + /** + * Gets the name of the default primary column. + * + * @since 4.3.0 + * + * @return string Name of the default primary column, in this case, 'name'. + */ + protected function get_default_primary_column_name() { + return 'name'; + } + + /** + * Generates and displays row action links. + * + * @since 4.3.0 + * + * @param WP_Term $tag Tag being acted upon. + * @param string $column_name Current column name. + * @param string $primary Primary column name. + * @return string Row actions output for terms, or an empty string + * if the current column is not the primary column. + */ + protected function handle_row_actions( $tag, $column_name, $primary ) { + if ( $primary !== $column_name ) { + return ''; + } + + $taxonomy = $this->screen->taxonomy; + $tax = get_taxonomy( $taxonomy ); + $uri = wp_doing_ajax() ? wp_get_referer() : $_SERVER['REQUEST_URI']; + + $edit_link = add_query_arg( + 'wp_http_referer', + urlencode( wp_unslash( $uri ) ), + get_edit_term_link( $tag->term_id, $taxonomy, $this->screen->post_type ) + ); + + $actions = array(); + if ( current_user_can( 'edit_term', $tag->term_id ) ) { + $actions['edit'] = sprintf( + '%s', + esc_url( $edit_link ), + /* translators: %s: Taxonomy term name. */ + esc_attr( sprintf( __( 'Edit “%s”' ), $tag->name ) ), + __( 'Edit' ) + ); + $actions['inline hide-if-no-js'] = sprintf( + '', + /* translators: %s: Taxonomy term name. */ + esc_attr( sprintf( __( 'Quick edit “%s” inline' ), $tag->name ) ), + __( 'Quick Edit' ) + ); + } + if ( current_user_can( 'delete_term', $tag->term_id ) ) { + $actions['delete'] = sprintf( + '%s', + wp_nonce_url( "edit-tags.php?action=delete&taxonomy=$taxonomy&tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ), + /* translators: %s: Taxonomy term name. */ + esc_attr( sprintf( __( 'Delete “%s”' ), $tag->name ) ), + __( 'Delete' ) + ); + } + if ( is_taxonomy_viewable( $tax ) ) { + $actions['view'] = sprintf( + '%s', + get_term_link( $tag ), + /* translators: %s: Taxonomy term name. */ + esc_attr( sprintf( __( 'View “%s” archive' ), $tag->name ) ), + __( 'View' ) + ); + } + + /** + * Filters the action links displayed for each term in the Tags list table. + * + * @since 2.8.0 + * @since 3.0.0 Deprecated in favor of {@see '{$taxonomy}_row_actions'} filter. + * @since 5.4.2 Restored (un-deprecated). + * + * @param string[] $actions An array of action links to be displayed. Default + * 'Edit', 'Quick Edit', 'Delete', and 'View'. + * @param WP_Term $tag Term object. + */ + $actions = apply_filters( 'tag_row_actions', $actions, $tag ); + + /** + * Filters the action links displayed for each term in the terms list table. + * + * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug. + * + * @since 3.0.0 + * + * @param string[] $actions An array of action links to be displayed. Default + * 'Edit', 'Quick Edit', 'Delete', and 'View'. + * @param WP_Term $tag Term object. + */ + $actions = apply_filters( "{$taxonomy}_row_actions", $actions, $tag ); + + return $this->row_actions( $actions ); + } + + /** + * @param WP_Term $tag Term object. + * @return string + */ + public function column_description( $tag ) { + if ( $tag->description ) { + return $tag->description; + } else { + return '' . __( 'No description' ) . ''; + } + } + + /** + * @param WP_Term $tag Term object. + * @return string + */ + public function column_slug( $tag ) { + /** This filter is documented in wp-admin/edit-tag-form.php */ + return apply_filters( 'editable_slug', $tag->slug, $tag ); + } + + /** + * @param WP_Term $tag Term object. + * @return string + */ + public function column_posts( $tag ) { + $count = number_format_i18n( $tag->count ); + + $tax = get_taxonomy( $this->screen->taxonomy ); + + $ptype_object = get_post_type_object( $this->screen->post_type ); + if ( ! $ptype_object->show_ui ) { + return $count; + } + + if ( $tax->query_var ) { + $args = array( $tax->query_var => $tag->slug ); + } else { + $args = array( + 'taxonomy' => $tax->name, + 'term' => $tag->slug, + ); + } + + if ( 'post' != $this->screen->post_type ) { + $args['post_type'] = $this->screen->post_type; + } + + if ( 'attachment' === $this->screen->post_type ) { + return "$count"; + } + + return "$count"; + } + + /** + * @param WP_Term $tag Term object. + * @return string + */ + public function column_links( $tag ) { + $count = number_format_i18n( $tag->count ); + if ( $count ) { + $count = "$count"; + } + return $count; + } + + /** + * @param WP_Term $tag Term object. + * @param string $column_name + * @return string + */ + public function column_default( $tag, $column_name ) { + /** + * Filters the displayed columns in the terms list table. + * + * The dynamic portion of the hook name, `$this->screen->taxonomy`, + * refers to the slug of the current taxonomy. + * + * @since 2.8.0 + * + * @param string $string Blank string. + * @param string $column_name Name of the column. + * @param int $term_id Term ID. + */ + return apply_filters( "manage_{$this->screen->taxonomy}_custom_column", '', $column_name, $tag->term_id ); + } + + /** + * Outputs the hidden row displayed when inline editing + * + * @since 3.1.0 + */ + public function inline_edit() { + $tax = get_taxonomy( $this->screen->taxonomy ); + + if ( ! current_user_can( $tax->cap->edit_terms ) ) { + return; + } + ?> + +
        + + + + + +
        +
        + features = $_REQUEST['features']; + } + + $paged = $this->get_pagenum(); + + $per_page = 36; + + // These are the tabs which are shown on the page, + $tabs = array(); + $tabs['dashboard'] = __( 'Search' ); + if ( 'search' === $tab ) { + $tabs['search'] = __( 'Search Results' ); + } + $tabs['upload'] = __( 'Upload' ); + $tabs['featured'] = _x( 'Featured', 'themes' ); + //$tabs['popular'] = _x( 'Popular', 'themes' ); + $tabs['new'] = _x( 'Latest', 'themes' ); + $tabs['updated'] = _x( 'Recently Updated', 'themes' ); + + $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item. + + /** This filter is documented in wp-admin/theme-install.php */ + $tabs = apply_filters( 'install_themes_tabs', $tabs ); + + /** + * Filters tabs not associated with a menu item on the Install Themes screen. + * + * @since 2.8.0 + * + * @param string[] $nonmenu_tabs The tabs that don't have a menu item on + * the Install Themes screen. + */ + $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs ); + + // If a non-valid menu tab has been selected, And it's not a non-menu action. + if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) ) { + $tab = key( $tabs ); + } + + $args = array( + 'page' => $paged, + 'per_page' => $per_page, + 'fields' => $theme_field_defaults, + ); + + switch ( $tab ) { + case 'search': + $type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term'; + switch ( $type ) { + case 'tag': + $args['tag'] = array_map( 'sanitize_key', $search_terms ); + break; + case 'term': + $args['search'] = $search_string; + break; + case 'author': + $args['author'] = $search_string; + break; + } + + if ( ! empty( $this->features ) ) { + $args['tag'] = $this->features; + $_REQUEST['s'] = implode( ',', $this->features ); + $_REQUEST['type'] = 'tag'; + } + + add_action( 'install_themes_table_header', 'install_theme_search_form', 10, 0 ); + break; + + case 'featured': + // case 'popular': + case 'new': + case 'updated': + $args['browse'] = $tab; + break; + + default: + $args = false; + break; + } + + /** + * Filters API request arguments for each Install Themes screen tab. + * + * The dynamic portion of the hook name, `$tab`, refers to the theme install + * tabs. Default tabs are 'dashboard', 'search', 'upload', 'featured', + * 'new', and 'updated'. + * + * @since 3.7.0 + * + * @param array $args An array of themes API arguments. + */ + $args = apply_filters( "install_themes_table_api_args_{$tab}", $args ); + + if ( ! $args ) { + return; + } + + $api = themes_api( 'query_themes', $args ); + + if ( is_wp_error( $api ) ) { + wp_die( $api->get_error_message() . '

        ' . __( 'Try Again' ) . '' ); + } + + $this->items = $api->themes; + + $this->set_pagination_args( + array( + 'total_items' => $api->info['results'], + 'per_page' => $args['per_page'], + 'infinite_scroll' => true, + ) + ); + } + + /** + */ + public function no_items() { + _e( 'No themes match your request.' ); + } + + /** + * @global array $tabs + * @global string $tab + * @return array + */ + protected function get_views() { + global $tabs, $tab; + + $display_tabs = array(); + foreach ( (array) $tabs as $action => $text ) { + $current_link_attributes = ( $action === $tab ) ? ' class="current" aria-current="page"' : ''; + $href = self_admin_url( 'theme-install.php?tab=' . $action ); + $display_tabs[ 'theme-install-' . $action ] = "$text"; + } + + return $display_tabs; + } + + /** + * Displays the theme install table. + * + * Overrides the parent display() method to provide a different container. + * + * @since 3.1.0 + */ + public function display() { + wp_nonce_field( 'fetch-list-' . get_class( $this ), '_ajax_fetch_list_nonce' ); + ?> +

        +
        + +
        + pagination( 'top' ); ?> +
        +
        + +
        + display_rows_or_placeholder(); ?> +
        + + tablenav( 'bottom' ); + } + + /** + */ + public function display_rows() { + $themes = $this->items; + foreach ( $themes as $theme ) { + ?> +
        + single_row( $theme ); + ?> +
        + theme_installer(); + } + + /** + * Prints a theme from the WordPress.org API. + * + * @since 3.1.0 + * + * @global array $themes_allowedtags + * + * @param object $theme { + * An object that contains theme data returned by the WordPress.org API. + * + * @type string $name Theme name, e.g. 'Twenty Twenty'. + * @type string $slug Theme slug, e.g. 'twentytwenty'. + * @type string $version Theme version, e.g. '1.1'. + * @type string $author Theme author username, e.g. 'melchoyce'. + * @type string $preview_url Preview URL, e.g. 'http://2020.wordpress.net/'. + * @type string $screenshot_url Screenshot URL, e.g. 'https://wordpress.org/themes/twentytwenty/'. + * @type float $rating Rating score. + * @type int $num_ratings The number of ratings. + * @type string $homepage Theme homepage, e.g. 'https://wordpress.org/themes/twentytwenty/'. + * @type string $description Theme description. + * @type string $download_link Theme ZIP download URL. + * } + */ + public function single_row( $theme ) { + global $themes_allowedtags; + + if ( empty( $theme ) ) { + return; + } + + $name = wp_kses( $theme->name, $themes_allowedtags ); + $author = wp_kses( $theme->author, $themes_allowedtags ); + + /* translators: %s: Theme name. */ + $preview_title = sprintf( __( 'Preview “%s”' ), $name ); + $preview_url = add_query_arg( + array( + 'tab' => 'theme-information', + 'theme' => $theme->slug, + ), + self_admin_url( 'theme-install.php' ) + ); + + $actions = array(); + + $install_url = add_query_arg( + array( + 'action' => 'install-theme', + 'theme' => $theme->slug, + ), + self_admin_url( 'update.php' ) + ); + + $update_url = add_query_arg( + array( + 'action' => 'upgrade-theme', + 'theme' => $theme->slug, + ), + self_admin_url( 'update.php' ) + ); + + $status = $this->_get_theme_status( $theme ); + + switch ( $status ) { + case 'update_available': + $actions[] = sprintf( + '%s', + esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ), + /* translators: %s: Theme version. */ + esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ), + __( 'Update' ) + ); + break; + case 'newer_installed': + case 'latest_installed': + $actions[] = sprintf( + '%s', + esc_attr__( 'This theme is already installed and is up to date' ), + _x( 'Installed', 'theme' ) + ); + break; + case 'install': + default: + $actions[] = sprintf( + '%s', + esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ), + /* translators: %s: Theme name. */ + esc_attr( sprintf( __( 'Install %s' ), $name ) ), + __( 'Install Now' ) + ); + break; + } + + $actions[] = sprintf( + '%s', + esc_url( $preview_url ), + /* translators: %s: Theme name. */ + esc_attr( sprintf( __( 'Preview %s' ), $name ) ), + __( 'Preview' ) + ); + + /** + * Filters the install action links for a theme in the Install Themes list table. + * + * @since 3.4.0 + * + * @param string[] $actions An array of theme action links. Defaults are + * links to Install Now, Preview, and Details. + * @param WP_Theme $theme Theme object. + */ + $actions = apply_filters( 'theme_install_actions', $actions, $theme ); + + ?> + + + + +

        +
        + +
        + + + + install_theme_info( $theme ); + } + + /** + * Prints the wrapper for the theme installer. + */ + public function theme_installer() { + ?> +
        +
        +
        + + +
        +
        +
        +
        + +
        +
        +
        + +
        +
        + install_theme_info( $theme ); ?> +
        +
        + +
        +
        + name, $themes_allowedtags ); + $author = wp_kses( $theme->author, $themes_allowedtags ); + + $install_url = add_query_arg( + array( + 'action' => 'install-theme', + 'theme' => $theme->slug, + ), + self_admin_url( 'update.php' ) + ); + + $update_url = add_query_arg( + array( + 'action' => 'upgrade-theme', + 'theme' => $theme->slug, + ), + self_admin_url( 'update.php' ) + ); + + $status = $this->_get_theme_status( $theme ); + + ?> +
        + %s', + esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ), + /* translators: %s: Theme version. */ + esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ), + __( 'Update' ) + ); + break; + case 'newer_installed': + case 'latest_installed': + printf( + '%s', + esc_attr__( 'This theme is already installed and is up to date' ), + _x( 'Installed', 'theme' ) + ); + break; + case 'install': + default: + printf( + '%s', + esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ), + __( 'Install' ) + ); + break; + } + ?> +

        + + + + screenshot_url ) ) : ?> + + +
        + $theme->rating, + 'type' => 'percent', + 'number' => $theme->num_ratings, + ) + ); + ?> +
        + + version, $themes_allowedtags ); ?> +
        +
        + description, $themes_allowedtags ); ?> +
        +
        + +
        + Install screen + * @global string $type Type of search. + * + * @param array $extra_args Unused. + */ + public function _js_vars( $extra_args = array() ) { + global $tab, $type; + parent::_js_vars( compact( 'tab', 'type' ) ); + } + + /** + * Check to see if the theme is already installed. + * + * @since 3.4.0 + * + * @param object $theme - A WordPress.org Theme API object. + * @return string Theme status. + */ + private function _get_theme_status( $theme ) { + $status = 'install'; + + $installed_theme = wp_get_theme( $theme->slug ); + if ( $installed_theme->exists() ) { + if ( version_compare( $installed_theme->get( 'Version' ), $theme->version, '=' ) ) { + $status = 'latest_installed'; + } elseif ( version_compare( $installed_theme->get( 'Version' ), $theme->version, '>' ) ) { + $status = 'newer_installed'; + } else { + $status = 'update_available'; + } + } + + return $status; + } +} diff --git a/wp-admin/includes/class-wp-themes-list-table.php b/wp-admin/includes/class-wp-themes-list-table.php new file mode 100644 index 0000000..73143f3 --- /dev/null +++ b/wp-admin/includes/class-wp-themes-list-table.php @@ -0,0 +1,361 @@ + true, + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ) + ); + } + + /** + * @return bool + */ + public function ajax_user_can() { + // Do not check edit_theme_options here. Ajax calls for available themes require switch_themes. + return current_user_can( 'switch_themes' ); + } + + /** + */ + public function prepare_items() { + $themes = wp_get_themes( array( 'allowed' => true ) ); + + if ( ! empty( $_REQUEST['s'] ) ) { + $this->search_terms = array_unique( array_filter( array_map( 'trim', explode( ',', strtolower( wp_unslash( $_REQUEST['s'] ) ) ) ) ) ); + } + + if ( ! empty( $_REQUEST['features'] ) ) { + $this->features = $_REQUEST['features']; + } + + if ( $this->search_terms || $this->features ) { + foreach ( $themes as $key => $theme ) { + if ( ! $this->search_theme( $theme ) ) { + unset( $themes[ $key ] ); + } + } + } + + unset( $themes[ get_option( 'stylesheet' ) ] ); + WP_Theme::sort_by_name( $themes ); + + $per_page = 36; + $page = $this->get_pagenum(); + + $start = ( $page - 1 ) * $per_page; + + $this->items = array_slice( $themes, $start, $per_page, true ); + + $this->set_pagination_args( + array( + 'total_items' => count( $themes ), + 'per_page' => $per_page, + 'infinite_scroll' => true, + ) + ); + } + + /** + */ + public function no_items() { + if ( $this->search_terms || $this->features ) { + _e( 'No items found.' ); + return; + } + + $blog_id = get_current_blog_id(); + if ( is_multisite() ) { + if ( current_user_can( 'install_themes' ) && current_user_can( 'manage_network_themes' ) ) { + printf( + /* translators: 1: URL to Themes tab on Edit Site screen, 2: URL to Add Themes screen. */ + __( 'You only have one theme enabled for this site right now. Visit the Network Admin to enable or install more themes.' ), + network_admin_url( 'site-themes.php?id=' . $blog_id ), + network_admin_url( 'theme-install.php' ) + ); + + return; + } elseif ( current_user_can( 'manage_network_themes' ) ) { + printf( + /* translators: %s: URL to Themes tab on Edit Site screen. */ + __( 'You only have one theme enabled for this site right now. Visit the Network Admin to enable more themes.' ), + network_admin_url( 'site-themes.php?id=' . $blog_id ) + ); + + return; + } + // Else, fallthrough. install_themes doesn't help if you can't enable it. + } else { + if ( current_user_can( 'install_themes' ) ) { + printf( + /* translators: %s: URL to Add Themes screen. */ + __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress Theme Directory at any time: just click on the Install Themes tab above.' ), + admin_url( 'theme-install.php' ) + ); + + return; + } + } + // Fallthrough. + printf( + /* translators: %s: Network title. */ + __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), + get_site_option( 'site_name' ) + ); + } + + /** + * @param string $which + */ + public function tablenav( $which = 'top' ) { + if ( $this->get_pagination_arg( 'total_pages' ) <= 1 ) { + return; + } + ?> +
        + pagination( $which ); ?> + +
        +
        + + tablenav( 'top' ); ?> + +
        + display_rows_or_placeholder(); ?> +
        + + tablenav( 'bottom' ); ?> + has_items() ) { + $this->display_rows(); + } else { + echo '
        '; + $this->no_items(); + echo '
        '; + } + } + + /** + */ + public function display_rows() { + $themes = $this->items; + + foreach ( $themes as $theme ) : + ?> +
        + get_template(); + $stylesheet = $theme->get_stylesheet(); + $title = $theme->display( 'Name' ); + $version = $theme->display( 'Version' ); + $author = $theme->display( 'Author' ); + + $activate_link = wp_nonce_url( 'themes.php?action=activate&template=' . urlencode( $template ) . '&stylesheet=' . urlencode( $stylesheet ), 'switch-theme_' . $stylesheet ); + + $actions = array(); + $actions['activate'] = sprintf( + '%s', + $activate_link, + /* translators: %s: Theme name. */ + esc_attr( sprintf( __( 'Activate “%s”' ), $title ) ), + __( 'Activate' ) + ); + + if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { + $actions['preview'] .= sprintf( + '%s', + wp_customize_url( $stylesheet ), + __( 'Live Preview' ) + ); + } + + if ( ! is_multisite() && current_user_can( 'delete_themes' ) ) { + $actions['delete'] = sprintf( + '%s', + wp_nonce_url( 'themes.php?action=delete&stylesheet=' . urlencode( $stylesheet ), 'delete-theme_' . $stylesheet ), + /* translators: %s: Theme name. */ + esc_js( sprintf( __( "You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete." ), $title ) ), + __( 'Delete' ) + ); + } + + /** This filter is documented in wp-admin/includes/class-wp-ms-themes-list-table.php */ + $actions = apply_filters( 'theme_action_links', $actions, $theme, 'all' ); + + /** This filter is documented in wp-admin/includes/class-wp-ms-themes-list-table.php */ + $actions = apply_filters( "theme_action_links_{$stylesheet}", $actions, $theme, 'all' ); + $delete_action = isset( $actions['delete'] ) ? '
        ' . $actions['delete'] . '
        ' : ''; + unset( $actions['delete'] ); + + $screenshot = $theme->get_screenshot(); + ?> + + + + + + + + + + + + +

        +
        + +
        + + +
        +

        +

        display( 'Description' ); ?>

        + parent() ) { + printf( + /* translators: 1: Link to documentation on child themes, 2: Name of parent theme. */ + '

        ' . __( 'This child theme requires its parent theme, %2$s.' ) . '

        ', + __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ), + $theme->parent()->display( 'Name' ) + ); + } + ?> +
        + +
        + features as $word ) { + if ( ! in_array( $word, $theme->get( 'Tags' ) ) ) { + return false; + } + } + + // Match all phrases. + foreach ( $this->search_terms as $word ) { + if ( in_array( $word, $theme->get( 'Tags' ) ) ) { + continue; + } + + foreach ( array( 'Name', 'Description', 'Author', 'AuthorURI' ) as $header ) { + // Don't mark up; Do translate. + if ( false !== stripos( strip_tags( $theme->display( $header, false, true ) ), $word ) ) { + continue 2; + } + } + + if ( false !== stripos( $theme->get_stylesheet(), $word ) ) { + continue; + } + + if ( false !== stripos( $theme->get_template(), $word ) ) { + continue; + } + + return false; + } + + return true; + } + + /** + * Send required variables to JavaScript land + * + * @since 3.4.0 + * + * @param array $extra_args + */ + public function _js_vars( $extra_args = array() ) { + $search_string = isset( $_REQUEST['s'] ) ? esc_attr( wp_unslash( $_REQUEST['s'] ) ) : ''; + + $args = array( + 'search' => $search_string, + 'features' => $this->features, + 'paged' => $this->get_pagenum(), + 'total_pages' => ! empty( $this->_pagination_args['total_pages'] ) ? $this->_pagination_args['total_pages'] : 1, + ); + + if ( is_array( $extra_args ) ) { + $args = array_merge( $args, $extra_args ); + } + + printf( "\n", wp_json_encode( $args ) ); + parent::_js_vars(); + } +} diff --git a/wp-admin/includes/class-wp-upgrader-skin.php b/wp-admin/includes/class-wp-upgrader-skin.php new file mode 100644 index 0000000..e776076 --- /dev/null +++ b/wp-admin/includes/class-wp-upgrader-skin.php @@ -0,0 +1,208 @@ + '', + 'nonce' => '', + 'title' => '', + 'context' => false, + ); + $this->options = wp_parse_args( $args, $defaults ); + } + + /** + * @param WP_Upgrader $upgrader + */ + public function set_upgrader( &$upgrader ) { + if ( is_object( $upgrader ) ) { + $this->upgrader =& $upgrader; + } + $this->add_strings(); + } + + /** + */ + public function add_strings() { + } + + /** + * Sets the result of an upgrade. + * + * @since 2.8.0 + * + * @param string|bool|WP_Error $result The result of an upgrade. + */ + public function set_result( $result ) { + $this->result = $result; + } + + /** + * Displays a form to the user to request for their FTP/SSH details in order + * to connect to the filesystem. + * + * @since 2.8.0 + * @since 4.6.0 The `$context` parameter default changed from `false` to an empty string. + * + * @see request_filesystem_credentials() + * + * @param bool|WP_Error $error Optional. Whether the current request has failed to connect, + * or an error object. Default false. + * @param string $context Optional. Full path to the directory that is tested + * for being writable. Default empty. + * @param bool $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable. Default false. + * @return bool True on success, false on failure. + */ + public function request_filesystem_credentials( $error = false, $context = '', $allow_relaxed_file_ownership = false ) { + $url = $this->options['url']; + if ( ! $context ) { + $context = $this->options['context']; + } + if ( ! empty( $this->options['nonce'] ) ) { + $url = wp_nonce_url( $url, $this->options['nonce'] ); + } + + $extra_fields = array(); + + return request_filesystem_credentials( $url, '', $error, $context, $extra_fields, $allow_relaxed_file_ownership ); + } + + /** + */ + public function header() { + if ( $this->done_header ) { + return; + } + $this->done_header = true; + echo '
        '; + echo '

        ' . $this->options['title'] . '

        '; + } + + /** + */ + public function footer() { + if ( $this->done_footer ) { + return; + } + $this->done_footer = true; + echo '
        '; + } + + /** + * @param string|WP_Error $errors + */ + public function error( $errors ) { + if ( ! $this->done_header ) { + $this->header(); + } + if ( is_string( $errors ) ) { + $this->feedback( $errors ); + } elseif ( is_wp_error( $errors ) && $errors->has_errors() ) { + foreach ( $errors->get_error_messages() as $message ) { + if ( $errors->get_error_data() && is_string( $errors->get_error_data() ) ) { + $this->feedback( $message . ' ' . esc_html( strip_tags( $errors->get_error_data() ) ) ); + } else { + $this->feedback( $message ); + } + } + } + } + + /** + * @param string $string + * @param mixed ...$args Optional text replacements. + */ + public function feedback( $string, ...$args ) { + if ( isset( $this->upgrader->strings[ $string ] ) ) { + $string = $this->upgrader->strings[ $string ]; + } + + if ( strpos( $string, '%' ) !== false ) { + if ( $args ) { + $args = array_map( 'strip_tags', $args ); + $args = array_map( 'esc_html', $args ); + $string = vsprintf( $string, $args ); + } + } + if ( empty( $string ) ) { + return; + } + show_message( $string ); + } + + /** + */ + public function before() {} + + /** + */ + public function after() {} + + /** + * Output JavaScript that calls function to decrement the update counts. + * + * @since 3.9.0 + * + * @param string $type Type of update count to decrement. Likely values include 'plugin', + * 'theme', 'translation', etc. + */ + protected function decrement_update_count( $type ) { + if ( ! $this->result || is_wp_error( $this->result ) || 'up_to_date' === $this->result ) { + return; + } + + if ( defined( 'IFRAME_REQUEST' ) ) { + echo ''; + } else { + echo ''; + } + } + + /** + */ + public function bulk_header() {} + + /** + */ + public function bulk_footer() {} +} diff --git a/wp-admin/includes/class-wp-upgrader-skins.php b/wp-admin/includes/class-wp-upgrader-skins.php new file mode 100644 index 0000000..636ce18 --- /dev/null +++ b/wp-admin/includes/class-wp-upgrader-skins.php @@ -0,0 +1,44 @@ +skin = new WP_Upgrader_Skin(); + } else { + $this->skin = $skin; + } + } + + /** + * Initialize the upgrader. + * + * This will set the relationship between the skin being used and this upgrader, + * and also add the generic strings to `WP_Upgrader::$strings`. + * + * @since 2.8.0 + */ + public function init() { + $this->skin->set_upgrader( $this ); + $this->generic_strings(); + } + + /** + * Add the generic strings to WP_Upgrader::$strings. + * + * @since 2.8.0 + */ + public function generic_strings() { + $this->strings['bad_request'] = __( 'Invalid data provided.' ); + $this->strings['fs_unavailable'] = __( 'Could not access filesystem.' ); + $this->strings['fs_error'] = __( 'Filesystem error.' ); + $this->strings['fs_no_root_dir'] = __( 'Unable to locate WordPress root directory.' ); + $this->strings['fs_no_content_dir'] = __( 'Unable to locate WordPress content directory (wp-content).' ); + $this->strings['fs_no_plugins_dir'] = __( 'Unable to locate WordPress plugin directory.' ); + $this->strings['fs_no_themes_dir'] = __( 'Unable to locate WordPress theme directory.' ); + /* translators: %s: Directory name. */ + $this->strings['fs_no_folder'] = __( 'Unable to locate needed folder (%s).' ); + + $this->strings['download_failed'] = __( 'Download failed.' ); + $this->strings['installing_package'] = __( 'Installing the latest version…' ); + $this->strings['no_files'] = __( 'The package contains no files.' ); + $this->strings['folder_exists'] = __( 'Destination folder already exists.' ); + $this->strings['mkdir_failed'] = __( 'Could not create directory.' ); + $this->strings['incompatible_archive'] = __( 'The package could not be installed.' ); + $this->strings['files_not_writable'] = __( 'The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions.' ); + + $this->strings['maintenance_start'] = __( 'Enabling Maintenance mode…' ); + $this->strings['maintenance_end'] = __( 'Disabling Maintenance mode…' ); + } + + /** + * Connect to the filesystem. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string[] $directories Optional. Array of directories. If any of these do + * not exist, a WP_Error object will be returned. + * Default empty array. + * @param bool $allow_relaxed_file_ownership Whether to allow relaxed file ownership. + * Default false. + * @return bool|WP_Error True if able to connect, false or a WP_Error otherwise. + */ + public function fs_connect( $directories = array(), $allow_relaxed_file_ownership = false ) { + global $wp_filesystem; + + $credentials = $this->skin->request_filesystem_credentials( false, $directories[0], $allow_relaxed_file_ownership ); + if ( false === $credentials ) { + return false; + } + + if ( ! WP_Filesystem( $credentials, $directories[0], $allow_relaxed_file_ownership ) ) { + $error = true; + if ( is_object( $wp_filesystem ) && $wp_filesystem->errors->has_errors() ) { + $error = $wp_filesystem->errors; + } + // Failed to connect. Error and request again. + $this->skin->request_filesystem_credentials( $error, $directories[0], $allow_relaxed_file_ownership ); + return false; + } + + if ( ! is_object( $wp_filesystem ) ) { + return new WP_Error( 'fs_unavailable', $this->strings['fs_unavailable'] ); + } + + if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) { + return new WP_Error( 'fs_error', $this->strings['fs_error'], $wp_filesystem->errors ); + } + + foreach ( (array) $directories as $dir ) { + switch ( $dir ) { + case ABSPATH: + if ( ! $wp_filesystem->abspath() ) { + return new WP_Error( 'fs_no_root_dir', $this->strings['fs_no_root_dir'] ); + } + break; + case WP_CONTENT_DIR: + if ( ! $wp_filesystem->wp_content_dir() ) { + return new WP_Error( 'fs_no_content_dir', $this->strings['fs_no_content_dir'] ); + } + break; + case WP_PLUGIN_DIR: + if ( ! $wp_filesystem->wp_plugins_dir() ) { + return new WP_Error( 'fs_no_plugins_dir', $this->strings['fs_no_plugins_dir'] ); + } + break; + case get_theme_root(): + if ( ! $wp_filesystem->wp_themes_dir() ) { + return new WP_Error( 'fs_no_themes_dir', $this->strings['fs_no_themes_dir'] ); + } + break; + default: + if ( ! $wp_filesystem->find_folder( $dir ) ) { + return new WP_Error( 'fs_no_folder', sprintf( $this->strings['fs_no_folder'], esc_html( basename( $dir ) ) ) ); + } + break; + } + } + return true; + } + + /** + * Download a package. + * + * @since 2.8.0 + * + * @param string $package The URI of the package. If this is the full path to an + * existing local file, it will be returned untouched. + * @param bool $check_signatures Whether to validate file signatures. Default false. + * @return string|WP_Error The full path to the downloaded package file, or a WP_Error object. + */ + public function download_package( $package, $check_signatures = false ) { + + /** + * Filters whether to return the package. + * + * @since 3.7.0 + * + * @param bool $reply Whether to bail without returning the package. + * Default false. + * @param string $package The package file name. + * @param WP_Upgrader $this The WP_Upgrader instance. + */ + $reply = apply_filters( 'upgrader_pre_download', false, $package, $this ); + if ( false !== $reply ) { + return $reply; + } + + if ( ! preg_match( '!^(http|https|ftp)://!i', $package ) && file_exists( $package ) ) { // Local file or remote? + return $package; // Must be a local file. + } + + if ( empty( $package ) ) { + return new WP_Error( 'no_package', $this->strings['no_package'] ); + } + + $this->skin->feedback( 'downloading_package', $package ); + + $download_file = download_url( $package, 300, $check_signatures ); + + if ( is_wp_error( $download_file ) && ! $download_file->get_error_data( 'softfail-filename' ) ) { + return new WP_Error( 'download_failed', $this->strings['download_failed'], $download_file->get_error_message() ); + } + + return $download_file; + } + + /** + * Unpack a compressed package file. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $package Full path to the package file. + * @param bool $delete_package Optional. Whether to delete the package file after attempting + * to unpack it. Default true. + * @return string|WP_Error The path to the unpacked contents, or a WP_Error on failure. + */ + public function unpack_package( $package, $delete_package = true ) { + global $wp_filesystem; + + $this->skin->feedback( 'unpack_package' ); + + $upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/'; + + // Clean up contents of upgrade directory beforehand. + $upgrade_files = $wp_filesystem->dirlist( $upgrade_folder ); + if ( ! empty( $upgrade_files ) ) { + foreach ( $upgrade_files as $file ) { + $wp_filesystem->delete( $upgrade_folder . $file['name'], true ); + } + } + + // We need a working directory - strip off any .tmp or .zip suffixes. + $working_dir = $upgrade_folder . basename( basename( $package, '.tmp' ), '.zip' ); + + // Clean up working directory. + if ( $wp_filesystem->is_dir( $working_dir ) ) { + $wp_filesystem->delete( $working_dir, true ); + } + + // Unzip package to working directory. + $result = unzip_file( $package, $working_dir ); + + // Once extracted, delete the package if required. + if ( $delete_package ) { + unlink( $package ); + } + + if ( is_wp_error( $result ) ) { + $wp_filesystem->delete( $working_dir, true ); + if ( 'incompatible_archive' == $result->get_error_code() ) { + return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], $result->get_error_data() ); + } + return $result; + } + + return $working_dir; + } + + /** + * Flatten the results of WP_Filesystem::dirlist() for iterating over. + * + * @since 4.9.0 + * @access protected + * + * @param array $nested_files Array of files as returned by WP_Filesystem::dirlist() + * @param string $path Relative path to prepend to child nodes. Optional. + * @return array A flattened array of the $nested_files specified. + */ + protected function flatten_dirlist( $nested_files, $path = '' ) { + $files = array(); + + foreach ( $nested_files as $name => $details ) { + $files[ $path . $name ] = $details; + + // Append children recursively. + if ( ! empty( $details['files'] ) ) { + $children = $this->flatten_dirlist( $details['files'], $path . $name . '/' ); + + // Merge keeping possible numeric keys, which array_merge() will reindex from 0..n. + $files = $files + $children; + } + } + + return $files; + } + + /** + * Clears the directory where this item is going to be installed into. + * + * @since 4.3.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $remote_destination The location on the remote filesystem to be cleared + * @return bool|WP_Error True upon success, WP_Error on failure. + */ + public function clear_destination( $remote_destination ) { + global $wp_filesystem; + + $files = $wp_filesystem->dirlist( $remote_destination, true, true ); + + // False indicates that the $remote_destination doesn't exist. + if ( false === $files ) { + return true; + } + + // Flatten the file list to iterate over. + $files = $this->flatten_dirlist( $files ); + + // Check all files are writable before attempting to clear the destination. + $unwritable_files = array(); + + // Check writability. + foreach ( $files as $filename => $file_details ) { + if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) { + // Attempt to alter permissions to allow writes and try again. + $wp_filesystem->chmod( $remote_destination . $filename, ( 'd' == $file_details['type'] ? FS_CHMOD_DIR : FS_CHMOD_FILE ) ); + if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) { + $unwritable_files[] = $filename; + } + } + } + + if ( ! empty( $unwritable_files ) ) { + return new WP_Error( 'files_not_writable', $this->strings['files_not_writable'], implode( ', ', $unwritable_files ) ); + } + + if ( ! $wp_filesystem->delete( $remote_destination, true ) ) { + return new WP_Error( 'remove_old_failed', $this->strings['remove_old_failed'] ); + } + + return true; + } + + /** + * Install a package. + * + * Copies the contents of a package form a source directory, and installs them in + * a destination directory. Optionally removes the source. It can also optionally + * clear out the destination folder if it already exists. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * @global array $wp_theme_directories + * + * @param array|string $args { + * Optional. Array or string of arguments for installing a package. Default empty array. + * + * @type string $source Required path to the package source. Default empty. + * @type string $destination Required path to a folder to install the package in. + * Default empty. + * @type bool $clear_destination Whether to delete any files already in the destination + * folder. Default false. + * @type bool $clear_working Whether to delete the files form the working directory + * after copying to the destination. Default false. + * @type bool $abort_if_destination_exists Whether to abort the installation if + * the destination folder already exists. Default true. + * @type array $hook_extra Extra arguments to pass to the filter hooks called by + * WP_Upgrader::install_package(). Default empty array. + * } + * + * @return array|WP_Error The result (also stored in `WP_Upgrader::$result`), or a WP_Error on failure. + */ + public function install_package( $args = array() ) { + global $wp_filesystem, $wp_theme_directories; + + $defaults = array( + 'source' => '', // Please always pass this. + 'destination' => '', // ...and this. + 'clear_destination' => false, + 'clear_working' => false, + 'abort_if_destination_exists' => true, + 'hook_extra' => array(), + ); + + $args = wp_parse_args( $args, $defaults ); + + // These were previously extract()'d. + $source = $args['source']; + $destination = $args['destination']; + $clear_destination = $args['clear_destination']; + + set_time_limit( 300 ); + + if ( empty( $source ) || empty( $destination ) ) { + return new WP_Error( 'bad_request', $this->strings['bad_request'] ); + } + $this->skin->feedback( 'installing_package' ); + + /** + * Filters the install response before the installation has started. + * + * Returning a truthy value, or one that could be evaluated as a WP_Error + * will effectively short-circuit the installation, returning that value + * instead. + * + * @since 2.8.0 + * + * @param bool|WP_Error $response Response. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $res = apply_filters( 'upgrader_pre_install', true, $args['hook_extra'] ); + + if ( is_wp_error( $res ) ) { + return $res; + } + + // Retain the original source and destinations. + $remote_source = $args['source']; + $local_destination = $destination; + + $source_files = array_keys( $wp_filesystem->dirlist( $remote_source ) ); + $remote_destination = $wp_filesystem->find_folder( $local_destination ); + + // Locate which directory to copy to the new folder. This is based on the actual folder holding the files. + if ( 1 == count( $source_files ) && $wp_filesystem->is_dir( trailingslashit( $args['source'] ) . $source_files[0] . '/' ) ) { + // Only one folder? Then we want its contents. + $source = trailingslashit( $args['source'] ) . trailingslashit( $source_files[0] ); + } elseif ( count( $source_files ) == 0 ) { + // There are no files? + return new WP_Error( 'incompatible_archive_empty', $this->strings['incompatible_archive'], $this->strings['no_files'] ); + } else { + // It's only a single file, the upgrader will use the folder name of this file as the destination folder. + // Folder name is based on zip filename. + $source = trailingslashit( $args['source'] ); + } + + /** + * Filters the source file location for the upgrade package. + * + * @since 2.8.0 + * @since 4.4.0 The $hook_extra parameter became available. + * + * @param string $source File source location. + * @param string $remote_source Remote file source location. + * @param WP_Upgrader $this WP_Upgrader instance. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $source = apply_filters( 'upgrader_source_selection', $source, $remote_source, $this, $args['hook_extra'] ); + + if ( is_wp_error( $source ) ) { + return $source; + } + + // Has the source location changed? If so, we need a new source_files list. + if ( $source !== $remote_source ) { + $source_files = array_keys( $wp_filesystem->dirlist( $source ) ); + } + + /* + * Protection against deleting files in any important base directories. + * Theme_Upgrader & Plugin_Upgrader also trigger this, as they pass the + * destination directory (WP_PLUGIN_DIR / wp-content/themes) intending + * to copy the directory into the directory, whilst they pass the source + * as the actual files to copy. + */ + $protected_directories = array( ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes' ); + + if ( is_array( $wp_theme_directories ) ) { + $protected_directories = array_merge( $protected_directories, $wp_theme_directories ); + } + + if ( in_array( $destination, $protected_directories ) ) { + $remote_destination = trailingslashit( $remote_destination ) . trailingslashit( basename( $source ) ); + $destination = trailingslashit( $destination ) . trailingslashit( basename( $source ) ); + } + + if ( $clear_destination ) { + // We're going to clear the destination if there's something there. + $this->skin->feedback( 'remove_old' ); + + $removed = $this->clear_destination( $remote_destination ); + + /** + * Filters whether the upgrader cleared the destination. + * + * @since 2.8.0 + * + * @param true|WP_Error $removed Whether the destination was cleared. true upon success, WP_Error on failure. + * @param string $local_destination The local package destination. + * @param string $remote_destination The remote package destination. + * @param array $hook_extra Extra arguments passed to hooked filters. + */ + $removed = apply_filters( 'upgrader_clear_destination', $removed, $local_destination, $remote_destination, $args['hook_extra'] ); + + if ( is_wp_error( $removed ) ) { + return $removed; + } + } elseif ( $args['abort_if_destination_exists'] && $wp_filesystem->exists( $remote_destination ) ) { + // If we're not clearing the destination folder and something exists there already, bail. + // But first check to see if there are actually any files in the folder. + $_files = $wp_filesystem->dirlist( $remote_destination ); + if ( ! empty( $_files ) ) { + $wp_filesystem->delete( $remote_source, true ); // Clear out the source files. + return new WP_Error( 'folder_exists', $this->strings['folder_exists'], $remote_destination ); + } + } + + // Create destination if needed. + if ( ! $wp_filesystem->exists( $remote_destination ) ) { + if ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) ) { + return new WP_Error( 'mkdir_failed_destination', $this->strings['mkdir_failed'], $remote_destination ); + } + } + + // Copy new version of item into place. + $result = copy_dir( $source, $remote_destination ); + if ( is_wp_error( $result ) ) { + if ( $args['clear_working'] ) { + $wp_filesystem->delete( $remote_source, true ); + } + return $result; + } + + // Clear the working folder? + if ( $args['clear_working'] ) { + $wp_filesystem->delete( $remote_source, true ); + } + + $destination_name = basename( str_replace( $local_destination, '', $destination ) ); + if ( '.' == $destination_name ) { + $destination_name = ''; + } + + $this->result = compact( 'source', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination' ); + + /** + * Filters the installation response after the installation has finished. + * + * @since 2.8.0 + * + * @param bool $response Installation response. + * @param array $hook_extra Extra arguments passed to hooked filters. + * @param array $result Installation result data. + */ + $res = apply_filters( 'upgrader_post_install', true, $args['hook_extra'], $this->result ); + + if ( is_wp_error( $res ) ) { + $this->result = $res; + return $res; + } + + // Bombard the calling function will all the info which we've just used. + return $this->result; + } + + /** + * Run an upgrade/installation. + * + * Attempts to download the package (if it is not a local file), unpack it, and + * install it in the destination folder. + * + * @since 2.8.0 + * + * @param array $options { + * Array or string of arguments for upgrading/installing a package. + * + * @type string $package The full path or URI of the package to install. + * Default empty. + * @type string $destination The full path to the destination folder. + * Default empty. + * @type bool $clear_destination Whether to delete any files already in the + * destination folder. Default false. + * @type bool $clear_working Whether to delete the files form the working + * directory after copying to the destination. + * Default false. + * @type bool $abort_if_destination_exists Whether to abort the installation if the destination + * folder already exists. When true, `$clear_destination` + * should be false. Default true. + * @type bool $is_multi Whether this run is one of multiple upgrade/installation + * actions being performed in bulk. When true, the skin + * WP_Upgrader::header() and WP_Upgrader::footer() + * aren't called. Default false. + * @type array $hook_extra Extra arguments to pass to the filter hooks called by + * WP_Upgrader::run(). + * } + * @return array|false|WP_error The result from self::install_package() on success, otherwise a WP_Error, + * or false if unable to connect to the filesystem. + */ + public function run( $options ) { + + $defaults = array( + 'package' => '', // Please always pass this. + 'destination' => '', // ...and this. + 'clear_destination' => false, + 'abort_if_destination_exists' => true, // Abort if the destination directory exists. Pass clear_destination as false please. + 'clear_working' => true, + 'is_multi' => false, + 'hook_extra' => array(), // Pass any extra $hook_extra args here, this will be passed to any hooked filters. + ); + + $options = wp_parse_args( $options, $defaults ); + + /** + * Filters the package options before running an update. + * + * See also {@see 'upgrader_process_complete'}. + * + * @since 4.3.0 + * + * @param array $options { + * Options used by the upgrader. + * + * @type string $package Package for update. + * @type string $destination Update location. + * @type bool $clear_destination Clear the destination resource. + * @type bool $clear_working Clear the working resource. + * @type bool $abort_if_destination_exists Abort if the Destination directory exists. + * @type bool $is_multi Whether the upgrader is running multiple times. + * @type array $hook_extra { + * Extra hook arguments. + * + * @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 string $plugin Path to the plugin file relative to the plugins directory. + * @type string $theme The stylesheet or template name of the theme. + * @type string $language_update_type The language pack update type. Accepts 'plugin', 'theme', + * or 'core'. + * @type object $language_update The language pack update offer. + * } + * } + */ + $options = apply_filters( 'upgrader_package_options', $options ); + + if ( ! $options['is_multi'] ) { // Call $this->header separately if running multiple times. + $this->skin->header(); + } + + // Connect to the filesystem first. + $res = $this->fs_connect( array( WP_CONTENT_DIR, $options['destination'] ) ); + // Mainly for non-connected filesystem. + if ( ! $res ) { + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return false; + } + + $this->skin->before(); + + if ( is_wp_error( $res ) ) { + $this->skin->error( $res ); + $this->skin->after(); + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return $res; + } + + /* + * Download the package (Note, This just returns the filename + * of the file if the package is a local file) + */ + $download = $this->download_package( $options['package'], true ); + + // Allow for signature soft-fail. + // WARNING: This may be removed in the future. + if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) { + + // Don't output the 'no signature could be found' failure message for now. + if ( 'signature_verification_no_signature' != $download->get_error_code() || WP_DEBUG ) { + // Output the failure error as a normal feedback, and not as an error. + $this->skin->feedback( $download->get_error_message() ); + + // Report this failure back to WordPress.org for debugging purposes. + wp_version_check( + array( + 'signature_failure_code' => $download->get_error_code(), + 'signature_failure_data' => $download->get_error_data(), + ) + ); + } + + // Pretend this error didn't happen. + $download = $download->get_error_data( 'softfail-filename' ); + } + + if ( is_wp_error( $download ) ) { + $this->skin->error( $download ); + $this->skin->after(); + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return $download; + } + + $delete_package = ( $download != $options['package'] ); // Do not delete a "local" file. + + // Unzips the file into a temporary directory. + $working_dir = $this->unpack_package( $download, $delete_package ); + if ( is_wp_error( $working_dir ) ) { + $this->skin->error( $working_dir ); + $this->skin->after(); + if ( ! $options['is_multi'] ) { + $this->skin->footer(); + } + return $working_dir; + } + + // With the given options, this installs it to the destination directory. + $result = $this->install_package( + array( + 'source' => $working_dir, + 'destination' => $options['destination'], + 'clear_destination' => $options['clear_destination'], + 'abort_if_destination_exists' => $options['abort_if_destination_exists'], + 'clear_working' => $options['clear_working'], + 'hook_extra' => $options['hook_extra'], + ) + ); + + $this->skin->set_result( $result ); + if ( is_wp_error( $result ) ) { + $this->skin->error( $result ); + $this->skin->feedback( 'process_failed' ); + } else { + // Installation succeeded. + $this->skin->feedback( 'process_success' ); + } + + $this->skin->after(); + + if ( ! $options['is_multi'] ) { + + /** + * Fires when the upgrader process is complete. + * + * See also {@see 'upgrader_package_options'}. + * + * @since 3.6.0 + * @since 3.7.0 Added to WP_Upgrader::run(). + * @since 4.6.0 `$translations` was added as a possible argument to `$hook_extra`. + * + * @param WP_Upgrader $this WP_Upgrader instance. In other contexts, $this, might be a + * Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader instance. + * @param array $hook_extra { + * Array of bulk item update data. + * + * @type string $action Type of action. Default 'update'. + * @type string $type Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'. + * @type bool $bulk Whether the update process is a bulk update. Default true. + * @type array $plugins Array of the basename paths of the plugins' main files. + * @type array $themes The theme slugs. + * @type array $translations { + * Array of translations update data. + * + * @type string $language The locale the translation is for. + * @type string $type Type of translation. Accepts 'plugin', 'theme', or 'core'. + * @type string $slug Text domain the translation is for. The slug of a theme/plugin or + * 'default' for core translations. + * @type string $version The version of a theme, plugin, or core. + * } + * } + */ + do_action( 'upgrader_process_complete', $this, $options['hook_extra'] ); + + $this->skin->footer(); + } + + return $result; + } + + /** + * Toggle maintenance mode for the site. + * + * Creates/deletes the maintenance file to enable/disable maintenance mode. + * + * @since 2.8.0 + * + * @global WP_Filesystem_Base $wp_filesystem Subclass + * + * @param bool $enable True to enable maintenance mode, false to disable. + */ + public function maintenance_mode( $enable = false ) { + global $wp_filesystem; + $file = $wp_filesystem->abspath() . '.maintenance'; + if ( $enable ) { + $this->skin->feedback( 'maintenance_start' ); + // Create maintenance file to signal that we are upgrading. + $maintenance_string = ''; + $wp_filesystem->delete( $file ); + $wp_filesystem->put_contents( $file, $maintenance_string, FS_CHMOD_FILE ); + } elseif ( ! $enable && $wp_filesystem->exists( $file ) ) { + $this->skin->feedback( 'maintenance_end' ); + $wp_filesystem->delete( $file ); + } + } + + /** + * Creates a lock using WordPress options. + * + * @since 4.5.0 + * + * @param string $lock_name The name of this unique lock. + * @param int $release_timeout Optional. The duration in seconds to respect an existing lock. + * Default: 1 hour. + * @return bool False if a lock couldn't be created or if the lock is still valid. True otherwise. + */ + public static function create_lock( $lock_name, $release_timeout = null ) { + global $wpdb; + if ( ! $release_timeout ) { + $release_timeout = HOUR_IN_SECONDS; + } + $lock_option = $lock_name . '.lock'; + + // Try to lock. + $lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() ) ); + + if ( ! $lock_result ) { + $lock_result = get_option( $lock_option ); + + // If a lock couldn't be created, and there isn't a lock, bail. + if ( ! $lock_result ) { + return false; + } + + // Check to see if the lock is still valid. If it is, bail. + if ( $lock_result > ( time() - $release_timeout ) ) { + return false; + } + + // There must exist an expired lock, clear it and re-gain it. + WP_Upgrader::release_lock( $lock_name ); + + return WP_Upgrader::create_lock( $lock_name, $release_timeout ); + } + + // Update the lock, as by this point we've definitely got a lock, just need to fire the actions. + update_option( $lock_option, time() ); + + return true; + } + + /** + * Releases an upgrader lock. + * + * @since 4.5.0 + * + * @see WP_Upgrader::create_lock() + * + * @param string $lock_name The name of this unique lock. + * @return bool True if the lock was successfully released. False on failure. + */ + public static function release_lock( $lock_name ) { + return delete_option( $lock_name . '.lock' ); + } + +} + +/** Plugin_Upgrader class */ +require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php'; + +/** Theme_Upgrader class */ +require_once ABSPATH . 'wp-admin/includes/class-theme-upgrader.php'; + +/** Language_Pack_Upgrader class */ +require_once ABSPATH . 'wp-admin/includes/class-language-pack-upgrader.php'; + +/** Core_Upgrader class */ +require_once ABSPATH . 'wp-admin/includes/class-core-upgrader.php'; + +/** File_Upload_Upgrader class */ +require_once ABSPATH . 'wp-admin/includes/class-file-upload-upgrader.php'; + +/** WP_Automatic_Updater class */ +require_once ABSPATH . 'wp-admin/includes/class-wp-automatic-updater.php'; diff --git a/wp-admin/includes/class-wp-users-list-table.php b/wp-admin/includes/class-wp-users-list-table.php new file mode 100644 index 0000000..505aa9a --- /dev/null +++ b/wp-admin/includes/class-wp-users-list-table.php @@ -0,0 +1,641 @@ + 'user', + 'plural' => 'users', + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ) + ); + + $this->is_site_users = 'site-users-network' === $this->screen->id; + + if ( $this->is_site_users ) { + $this->site_id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; + } + } + + /** + * Check the current user's permissions. + * + * @since 3.1.0 + * + * @return bool + */ + public function ajax_user_can() { + if ( $this->is_site_users ) { + return current_user_can( 'manage_sites' ); + } else { + return current_user_can( 'list_users' ); + } + } + + /** + * Prepare the users list for display. + * + * @since 3.1.0 + * + * @global string $role + * @global string $usersearch + */ + public function prepare_items() { + global $role, $usersearch; + + $usersearch = isset( $_REQUEST['s'] ) ? wp_unslash( trim( $_REQUEST['s'] ) ) : ''; + + $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : ''; + + $per_page = ( $this->is_site_users ) ? 'site_users_network_per_page' : 'users_per_page'; + $users_per_page = $this->get_items_per_page( $per_page ); + + $paged = $this->get_pagenum(); + + if ( 'none' === $role ) { + $args = array( + 'number' => $users_per_page, + 'offset' => ( $paged - 1 ) * $users_per_page, + 'include' => wp_get_users_with_no_role( $this->site_id ), + 'search' => $usersearch, + 'fields' => 'all_with_meta', + ); + } else { + $args = array( + 'number' => $users_per_page, + 'offset' => ( $paged - 1 ) * $users_per_page, + 'role' => $role, + 'search' => $usersearch, + 'fields' => 'all_with_meta', + ); + } + + if ( '' !== $args['search'] ) { + $args['search'] = '*' . $args['search'] . '*'; + } + + if ( $this->is_site_users ) { + $args['blog_id'] = $this->site_id; + } + + if ( isset( $_REQUEST['orderby'] ) ) { + $args['orderby'] = $_REQUEST['orderby']; + } + + if ( isset( $_REQUEST['order'] ) ) { + $args['order'] = $_REQUEST['order']; + } + + /** + * Filters the query arguments used to retrieve users for the current users list table. + * + * @since 4.4.0 + * + * @param array $args Arguments passed to WP_User_Query to retrieve items for the current + * users list table. + */ + $args = apply_filters( 'users_list_table_query_args', $args ); + + // Query the user IDs for this page. + $wp_user_search = new WP_User_Query( $args ); + + $this->items = $wp_user_search->get_results(); + + $this->set_pagination_args( + array( + 'total_items' => $wp_user_search->get_total(), + 'per_page' => $users_per_page, + ) + ); + } + + /** + * Output 'no users' message. + * + * @since 3.1.0 + */ + public function no_items() { + _e( 'No users found.' ); + } + + /** + * Return an associative array listing all the views that can be used + * with this table. + * + * Provides a list of roles and user count for that role for easy + * Filtersing of the user table. + * + * @since 3.1.0 + * + * @global string $role + * + * @return string[] An array of HTML links keyed by their view. + */ + protected function get_views() { + global $role; + + $wp_roles = wp_roles(); + + if ( $this->is_site_users ) { + $url = 'site-users.php?id=' . $this->site_id; + switch_to_blog( $this->site_id ); + $users_of_blog = count_users( 'time', $this->site_id ); + restore_current_blog(); + } else { + $url = 'users.php'; + $users_of_blog = count_users(); + } + + $total_users = $users_of_blog['total_users']; + $avail_roles =& $users_of_blog['avail_roles']; + unset( $users_of_blog ); + + $current_link_attributes = empty( $role ) ? ' class="current" aria-current="page"' : ''; + + $role_links = array(); + $role_links['all'] = sprintf( + '%s', + $url, + $current_link_attributes, + sprintf( + /* translators: %s: Number of users. */ + _nx( + 'All (%s)', + 'All (%s)', + $total_users, + 'users' + ), + number_format_i18n( $total_users ) + ) + ); + + foreach ( $wp_roles->get_names() as $this_role => $name ) { + if ( ! isset( $avail_roles[ $this_role ] ) ) { + continue; + } + + $current_link_attributes = ''; + + if ( $this_role === $role ) { + $current_link_attributes = ' class="current" aria-current="page"'; + } + + $name = translate_user_role( $name ); + $name = sprintf( + /* translators: 1: User role name, 2: Number of users. */ + __( '%1$s (%2$s)' ), + $name, + number_format_i18n( $avail_roles[ $this_role ] ) + ); + + $role_links[ $this_role ] = "$name"; + } + + if ( ! empty( $avail_roles['none'] ) ) { + + $current_link_attributes = ''; + + if ( 'none' === $role ) { + $current_link_attributes = ' class="current" aria-current="page"'; + } + + $name = __( 'No role' ); + $name = sprintf( + /* translators: 1: User role name, 2: Number of users. */ + __( '%1$s (%2$s)' ), + $name, + number_format_i18n( $avail_roles['none'] ) + ); + + $role_links['none'] = "$name"; + } + + return $role_links; + } + + /** + * Retrieve an associative array of bulk actions available on this table. + * + * @since 3.1.0 + * + * @return string[] Array of bulk action labels keyed by their action. + */ + protected function get_bulk_actions() { + $actions = array(); + + if ( is_multisite() ) { + if ( current_user_can( 'remove_users' ) ) { + $actions['remove'] = __( 'Remove' ); + } + } else { + if ( current_user_can( 'delete_users' ) ) { + $actions['delete'] = __( 'Delete' ); + } + } + + return $actions; + } + + /** + * Output the controls to allow user roles to be changed in bulk. + * + * @since 3.1.0 + * + * @param string $which Whether this is being invoked above ("top") + * or below the table ("bottom"). + */ + protected function extra_tablenav( $which ) { + $id = 'bottom' === $which ? 'new_role2' : 'new_role'; + $button_id = 'bottom' === $which ? 'changeit2' : 'changeit'; + ?> +
        + has_items() ) : ?> + + + +
        + '', + 'username' => __( 'Username' ), + 'name' => __( 'Name' ), + 'email' => __( 'Email' ), + 'role' => __( 'Role' ), + 'posts' => __( 'Posts' ), + ); + + if ( $this->is_site_users ) { + unset( $c['posts'] ); + } + + return $c; + } + + /** + * Get a list of sortable columns for the list table. + * + * @since 3.1.0 + * + * @return array Array of sortable columns. + */ + protected function get_sortable_columns() { + $c = array( + 'username' => 'login', + 'email' => 'email', + ); + + return $c; + } + + /** + * Generate the list table rows. + * + * @since 3.1.0 + */ + public function display_rows() { + // Query the post counts for this page. + if ( ! $this->is_site_users ) { + $post_counts = count_many_users_posts( array_keys( $this->items ) ); + } + + foreach ( $this->items as $userid => $user_object ) { + echo "\n\t" . $this->single_row( $user_object, '', '', isset( $post_counts ) ? $post_counts[ $userid ] : 0 ); + } + } + + /** + * Generate HTML for a single row on the users.php admin panel. + * + * @since 3.1.0 + * @since 4.2.0 The `$style` parameter was deprecated. + * @since 4.4.0 The `$role` parameter was deprecated. + * + * @param WP_User $user_object The current user object. + * @param string $style Deprecated. Not used. + * @param string $role Deprecated. Not used. + * @param int $numposts Optional. Post count to display for this user. Defaults + * to zero, as in, a new user has made zero posts. + * @return string Output for a single row. + */ + public function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) { + if ( ! ( $user_object instanceof WP_User ) ) { + $user_object = get_userdata( (int) $user_object ); + } + $user_object->filter = 'display'; + $email = $user_object->user_email; + + if ( $this->is_site_users ) { + $url = "site-users.php?id={$this->site_id}&"; + } else { + $url = 'users.php?'; + } + + $user_roles = $this->get_role_list( $user_object ); + + // Set up the hover actions for this user. + $actions = array(); + $checkbox = ''; + $super_admin = ''; + + if ( is_multisite() && current_user_can( 'manage_network_users' ) ) { + if ( in_array( $user_object->user_login, get_super_admins(), true ) ) { + $super_admin = ' — ' . __( 'Super Admin' ); + } + } + + // Check if the user for this row is editable. + if ( current_user_can( 'list_users' ) ) { + // Set up the user editing link. + $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user_object->ID ) ) ); + + if ( current_user_can( 'edit_user', $user_object->ID ) ) { + $edit = "{$user_object->user_login}{$super_admin}
        "; + $actions['edit'] = '' . __( 'Edit' ) . ''; + } else { + $edit = "{$user_object->user_login}{$super_admin}
        "; + } + + if ( ! is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) ) { + $actions['delete'] = "" . __( 'Delete' ) . ''; + } + if ( is_multisite() && current_user_can( 'remove_user', $user_object->ID ) ) { + $actions['remove'] = "" . __( 'Remove' ) . ''; + } + + // Add a link to the user's author archive, if not empty. + $author_posts_url = get_author_posts_url( $user_object->ID ); + if ( $author_posts_url ) { + $actions['view'] = sprintf( + '%s', + esc_url( $author_posts_url ), + /* translators: %s: Author's display name. */ + esc_attr( sprintf( __( 'View posts by %s' ), $user_object->display_name ) ), + __( 'View' ) + ); + } + + /** + * Filters the action links displayed under each user in the Users list table. + * + * @since 2.8.0 + * + * @param string[] $actions An array of action links to be displayed. + * Default 'Edit', 'Delete' for single site, and + * 'Edit', 'Remove' for Multisite. + * @param WP_User $user_object WP_User object for the currently listed user. + */ + $actions = apply_filters( 'user_row_actions', $actions, $user_object ); + + // Role classes. + $role_classes = esc_attr( implode( ' ', array_keys( $user_roles ) ) ); + + // Set up the checkbox (because the user is editable, otherwise it's empty). + $checkbox = sprintf( + '' . + '', + $user_object->ID, + /* translators: %s: User login. */ + sprintf( __( 'Select %s' ), $user_object->user_login ), + $role_classes + ); + + } else { + $edit = "{$user_object->user_login}{$super_admin}"; + } + + $avatar = get_avatar( $user_object->ID, 32 ); + + // Comma-separated list of user roles. + $roles_list = implode( ', ', $user_roles ); + + $r = ""; + + list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $classes = "$column_name column-$column_name"; + if ( $primary === $column_name ) { + $classes .= ' has-row-actions column-primary'; + } + if ( 'posts' === $column_name ) { + $classes .= ' num'; // Special case for that column. + } + + if ( in_array( $column_name, $hidden ) ) { + $classes .= ' hidden'; + } + + $data = 'data-colname="' . wp_strip_all_tags( $column_display_name ) . '"'; + + $attributes = "class='$classes' $data"; + + if ( 'cb' === $column_name ) { + $r .= "$checkbox"; + } else { + $r .= ""; + switch ( $column_name ) { + case 'username': + $r .= "$avatar $edit"; + break; + case 'name': + if ( $user_object->first_name && $user_object->last_name ) { + $r .= "$user_object->first_name $user_object->last_name"; + } elseif ( $user_object->first_name ) { + $r .= $user_object->first_name; + } elseif ( $user_object->last_name ) { + $r .= $user_object->last_name; + } else { + $r .= sprintf( + '%s', + _x( 'Unknown', 'name' ) + ); + } + break; + case 'email': + $r .= "$email"; + break; + case 'role': + $r .= esc_html( $roles_list ); + break; + case 'posts': + if ( $numposts > 0 ) { + $r .= sprintf( + '%s', + "edit.php?author={$user_object->ID}", + $numposts, + sprintf( + /* translators: %s: Number of posts. */ + _n( '%s post by this author', '%s posts by this author', $numposts ), + number_format_i18n( $numposts ) + ) + ); + } else { + $r .= 0; + } + break; + default: + /** + * Filters the display output of custom columns in the Users list table. + * + * @since 2.8.0 + * + * @param string $output Custom column output. Default empty. + * @param string $column_name Column name. + * @param int $user_id ID of the currently-listed user. + */ + $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID ); + } + + if ( $primary === $column_name ) { + $r .= $this->row_actions( $actions ); + } + $r .= ''; + } + } + $r .= ''; + + return $r; + } + + /** + * Gets the name of the default primary column. + * + * @since 4.3.0 + * + * @return string Name of the default primary column, in this case, 'username'. + */ + protected function get_default_primary_column_name() { + return 'username'; + } + + /** + * Returns an array of user roles for a given user object. + * + * @since 4.4.0 + * + * @param WP_User $user_object The WP_User object. + * @return string[] An array of user roles. + */ + protected function get_role_list( $user_object ) { + $wp_roles = wp_roles(); + + $role_list = array(); + + foreach ( $user_object->roles as $role ) { + if ( isset( $wp_roles->role_names[ $role ] ) ) { + $role_list[ $role ] = translate_user_role( $wp_roles->role_names[ $role ] ); + } + } + + if ( empty( $role_list ) ) { + $role_list['none'] = _x( 'None', 'no user roles' ); + } + + /** + * Filters the returned array of roles for a user. + * + * @since 4.4.0 + * + * @param string[] $role_list An array of user roles. + * @param WP_User $user_object A WP_User object. + */ + return apply_filters( 'get_role_list', $role_list, $user_object ); + } + +} diff --git a/wp-admin/includes/comment.php b/wp-admin/includes/comment.php new file mode 100644 index 0000000..4000fe7 --- /dev/null +++ b/wp-admin/includes/comment.php @@ -0,0 +1,214 @@ +get_var( + $wpdb->prepare( + "SELECT comment_post_ID FROM $wpdb->comments + WHERE comment_author = %s AND $date_field = %s", + stripslashes( $comment_author ), + stripslashes( $comment_date ) + ) + ); +} + +/** + * Update a comment with values provided in $_POST. + * + * @since 2.0.0 + */ +function edit_comment() { + if ( ! current_user_can( 'edit_comment', (int) $_POST['comment_ID'] ) ) { + wp_die( __( 'Sorry, you are not allowed to edit comments on this post.' ) ); + } + + if ( isset( $_POST['newcomment_author'] ) ) { + $_POST['comment_author'] = $_POST['newcomment_author']; + } + if ( isset( $_POST['newcomment_author_email'] ) ) { + $_POST['comment_author_email'] = $_POST['newcomment_author_email']; + } + if ( isset( $_POST['newcomment_author_url'] ) ) { + $_POST['comment_author_url'] = $_POST['newcomment_author_url']; + } + if ( isset( $_POST['comment_status'] ) ) { + $_POST['comment_approved'] = $_POST['comment_status']; + } + if ( isset( $_POST['content'] ) ) { + $_POST['comment_content'] = $_POST['content']; + } + if ( isset( $_POST['comment_ID'] ) ) { + $_POST['comment_ID'] = (int) $_POST['comment_ID']; + } + + foreach ( array( 'aa', 'mm', 'jj', 'hh', 'mn' ) as $timeunit ) { + if ( ! empty( $_POST[ 'hidden_' . $timeunit ] ) && $_POST[ 'hidden_' . $timeunit ] != $_POST[ $timeunit ] ) { + $_POST['edit_date'] = '1'; + break; + } + } + + if ( ! empty( $_POST['edit_date'] ) ) { + $aa = $_POST['aa']; + $mm = $_POST['mm']; + $jj = $_POST['jj']; + $hh = $_POST['hh']; + $mn = $_POST['mn']; + $ss = $_POST['ss']; + $jj = ( $jj > 31 ) ? 31 : $jj; + $hh = ( $hh > 23 ) ? $hh - 24 : $hh; + $mn = ( $mn > 59 ) ? $mn - 60 : $mn; + $ss = ( $ss > 59 ) ? $ss - 60 : $ss; + + $_POST['comment_date'] = "$aa-$mm-$jj $hh:$mn:$ss"; + } + + wp_update_comment( $_POST ); +} + +/** + * Returns a WP_Comment object based on comment ID. + * + * @since 2.0.0 + * + * @param int $id ID of comment to retrieve. + * @return WP_Comment|false Comment if found. False on failure. + */ +function get_comment_to_edit( $id ) { + $comment = get_comment( $id ); + if ( ! $comment ) { + return false; + } + + $comment->comment_ID = (int) $comment->comment_ID; + $comment->comment_post_ID = (int) $comment->comment_post_ID; + + $comment->comment_content = format_to_edit( $comment->comment_content ); + /** + * Filters the comment content before editing. + * + * @since 2.0.0 + * + * @param string $comment->comment_content Comment content. + */ + $comment->comment_content = apply_filters( 'comment_edit_pre', $comment->comment_content ); + + $comment->comment_author = format_to_edit( $comment->comment_author ); + $comment->comment_author_email = format_to_edit( $comment->comment_author_email ); + $comment->comment_author_url = format_to_edit( $comment->comment_author_url ); + $comment->comment_author_url = esc_url( $comment->comment_author_url ); + + return $comment; +} + +/** + * Get the number of pending comments on a post or posts + * + * @since 2.3.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int|array $post_id Either a single Post ID or an array of Post IDs + * @return int|array Either a single Posts pending comments as an int or an array of ints keyed on the Post IDs + */ +function get_pending_comments_num( $post_id ) { + global $wpdb; + + $single = false; + if ( ! is_array( $post_id ) ) { + $post_id_array = (array) $post_id; + $single = true; + } else { + $post_id_array = $post_id; + } + $post_id_array = array_map( 'intval', $post_id_array ); + $post_id_in = "'" . implode( "', '", $post_id_array ) . "'"; + + $pending = $wpdb->get_results( "SELECT comment_post_ID, COUNT(comment_ID) as num_comments FROM $wpdb->comments WHERE comment_post_ID IN ( $post_id_in ) AND comment_approved = '0' GROUP BY comment_post_ID", ARRAY_A ); + + if ( $single ) { + if ( empty( $pending ) ) { + return 0; + } else { + return absint( $pending[0]['num_comments'] ); + } + } + + $pending_keyed = array(); + + // Default to zero pending for all posts in request. + foreach ( $post_id_array as $id ) { + $pending_keyed[ $id ] = 0; + } + + if ( ! empty( $pending ) ) { + foreach ( $pending as $pend ) { + $pending_keyed[ $pend['comment_post_ID'] ] = absint( $pend['num_comments'] ); + } + } + + return $pending_keyed; +} + +/** + * Add avatars to relevant places in admin, or try to. + * + * @since 2.5.0 + * + * @param string $name User name. + * @return string Avatar with Admin name. + */ +function floated_admin_avatar( $name ) { + $avatar = get_avatar( get_comment(), 32, 'mystery' ); + return "$avatar $name"; +} + +/** + * @since 2.7.0 + */ +function enqueue_comment_hotkeys_js() { + if ( 'true' == get_user_option( 'comment_shortcuts' ) ) { + wp_enqueue_script( 'jquery-table-hotkeys' ); + } +} + +/** + * Display error message at bottom of comments. + * + * @param string $msg Error Message. Assumed to contain HTML and be sanitized. + */ +function comment_footer_die( $msg ) { + echo "

        $msg

        "; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + die; +} diff --git a/wp-admin/includes/continents-cities.php b/wp-admin/includes/continents-cities.php new file mode 100644 index 0000000..7ddfe74 --- /dev/null +++ b/wp-admin/includes/continents-cities.php @@ -0,0 +1,554 @@ + 'WordPress/' . $wp_version . '; ' . home_url( '/' ) ); + + if ( wp_http_supports( array( 'ssl' ) ) ) { + $url = set_url_scheme( $url, 'https' ); + } + + $response = wp_remote_get( $url, $options ); + + if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) { + return false; + } + + $results = json_decode( wp_remote_retrieve_body( $response ), true ); + + if ( ! is_array( $results ) ) { + return false; + } + + set_site_transient( 'wordpress_credits_' . $locale, $results, DAY_IN_SECONDS ); + } + + return $results; +} + +/** + * Retrieve the link to a contributor's WordPress.org profile page. + * + * @access private + * @since 3.2.0 + * + * @param string $display_name The contributor's display name (passed by reference). + * @param string $username The contributor's username. + * @param string $profiles URL to the contributor's WordPress.org profile page. + */ +function _wp_credits_add_profile_link( &$display_name, $username, $profiles ) { + $display_name = '' . esc_html( $display_name ) . ''; +} + +/** + * Retrieve the link to an external library used in WordPress. + * + * @access private + * @since 3.2.0 + * + * @param string $data External library data (passed by reference). + */ +function _wp_credits_build_object_link( &$data ) { + $data = '' . esc_html( $data[0] ) . ''; +} + +/** + * Displays the title for a given group of contributors. + * + * @since 5.3.0 + * + * @param array $group_data The current contributor group. + */ +function wp_credits_section_title( $group_data = array() ) { + if ( ! count( $group_data ) ) { + return; + } + + if ( $group_data['name'] ) { + if ( 'Translators' === $group_data['name'] ) { + // Considered a special slug in the API response. (Also, will never be returned for en_US.) + $title = _x( 'Translators', 'Translate this to be the equivalent of English Translators in your language for the credits page Translators section' ); + } elseif ( isset( $group_data['placeholders'] ) ) { + // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText + $title = vsprintf( translate( $group_data['name'] ), $group_data['placeholders'] ); + } else { + // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText + $title = translate( $group_data['name'] ); + } + + echo '

        ' . esc_html( $title ) . "

        \n"; + } +} + +/** + * Displays a list of contributors for a given group. + * + * @since 5.3.0 + * + * @param array $credits The credits groups returned from the API. + * @param string $slug The current group to display. + */ +function wp_credits_section_list( $credits = array(), $slug = '' ) { + $group_data = isset( $credits['groups'][ $slug ] ) ? $credits['groups'][ $slug ] : array(); + $credits_data = $credits['data']; + if ( ! count( $group_data ) ) { + return; + } + + if ( ! empty( $group_data['shuffle'] ) ) { + shuffle( $group_data['data'] ); // We were going to sort by ability to pronounce "hierarchical," but that wouldn't be fair to Matt. + } + + switch ( $group_data['type'] ) { + case 'list': + array_walk( $group_data['data'], '_wp_credits_add_profile_link', $credits_data['profiles'] ); + echo '

        ' . wp_sprintf( '%l.', $group_data['data'] ) . "

        \n\n"; + break; + case 'libraries': + array_walk( $group_data['data'], '_wp_credits_build_object_link' ); + echo '

        ' . wp_sprintf( '%l.', $group_data['data'] ) . "

        \n\n"; + break; + default: + $compact = 'compact' === $group_data['type']; + $classes = 'wp-people-group ' . ( $compact ? 'compact' : '' ); + echo '\n"; + break; + } +} diff --git a/wp-admin/includes/dashboard.php b/wp-admin/includes/dashboard.php new file mode 100644 index 0000000..ef2e833 --- /dev/null +++ b/wp-admin/includes/dashboard.php @@ -0,0 +1,1928 @@ +cap->create_posts ) ) { + $quick_draft_title = sprintf( '%1$s %2$s', __( 'Quick Draft' ), __( 'Your Recent Drafts' ) ); + wp_add_dashboard_widget( 'dashboard_quick_press', $quick_draft_title, 'wp_dashboard_quick_press' ); + } + + // WordPress Events and News. + wp_add_dashboard_widget( 'dashboard_primary', __( 'WordPress Events and News' ), 'wp_dashboard_events_news' ); + + if ( is_network_admin() ) { + + /** + * Fires after core widgets for the Network Admin dashboard have been registered. + * + * @since 3.1.0 + */ + do_action( 'wp_network_dashboard_setup' ); + + /** + * Filters the list of widgets to load for the Network Admin dashboard. + * + * @since 3.1.0 + * + * @param string[] $dashboard_widgets An array of dashboard widget IDs. + */ + $dashboard_widgets = apply_filters( 'wp_network_dashboard_widgets', array() ); + } elseif ( is_user_admin() ) { + + /** + * Fires after core widgets for the User Admin dashboard have been registered. + * + * @since 3.1.0 + */ + do_action( 'wp_user_dashboard_setup' ); + + /** + * Filters the list of widgets to load for the User Admin dashboard. + * + * @since 3.1.0 + * + * @param string[] $dashboard_widgets An array of dashboard widget IDs. + */ + $dashboard_widgets = apply_filters( 'wp_user_dashboard_widgets', array() ); + } else { + + /** + * Fires after core widgets for the admin dashboard have been registered. + * + * @since 2.5.0 + */ + do_action( 'wp_dashboard_setup' ); + + /** + * Filters the list of widgets to load for the admin dashboard. + * + * @since 2.5.0 + * + * @param string[] $dashboard_widgets An array of dashboard widget IDs. + */ + $dashboard_widgets = apply_filters( 'wp_dashboard_widgets', array() ); + } + + foreach ( $dashboard_widgets as $widget_id ) { + $name = empty( $wp_registered_widgets[ $widget_id ]['all_link'] ) ? $wp_registered_widgets[ $widget_id ]['name'] : $wp_registered_widgets[ $widget_id ]['name'] . " " . __( 'View all' ) . ''; + wp_add_dashboard_widget( $widget_id, $name, $wp_registered_widgets[ $widget_id ]['callback'], $wp_registered_widget_controls[ $widget_id ]['callback'] ); + } + + if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset( $_POST['widget_id'] ) ) { + check_admin_referer( 'edit-dashboard-widget_' . $_POST['widget_id'], 'dashboard-widget-nonce' ); + ob_start(); // Hack - but the same hack wp-admin/widgets.php uses. + wp_dashboard_trigger_widget_control( $_POST['widget_id'] ); + ob_end_clean(); + wp_redirect( remove_query_arg( 'edit' ) ); + exit; + } + + /** This action is documented in wp-admin/includes/meta-boxes.php */ + do_action( 'do_meta_boxes', $screen->id, 'normal', '' ); + + /** This action is documented in wp-admin/includes/meta-boxes.php */ + do_action( 'do_meta_boxes', $screen->id, 'side', '' ); +} + +/** + * Adds a new dashboard widget. + * + * @since 2.7.0 + * + * @global array $wp_dashboard_control_callbacks + * + * @param string $widget_id Widget ID (used in the 'id' attribute for the widget). + * @param string $widget_name Title of the widget. + * @param callable $callback Function that fills the widget with the desired content. + * The function should echo its output. + * @param callable $control_callback Optional. Function that outputs controls for the widget. Default null. + * @param array $callback_args Optional. Data that should be set as the $args property of the widget array + * (which is the second parameter passed to your callback). Default null. + */ +function wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback = null, $callback_args = null ) { + $screen = get_current_screen(); + global $wp_dashboard_control_callbacks; + + $private_callback_args = array( '__widget_basename' => $widget_name ); + + if ( is_null( $callback_args ) ) { + $callback_args = $private_callback_args; + } elseif ( is_array( $callback_args ) ) { + $callback_args = array_merge( $callback_args, $private_callback_args ); + } + + if ( $control_callback && current_user_can( 'edit_dashboard' ) && is_callable( $control_callback ) ) { + $wp_dashboard_control_callbacks[ $widget_id ] = $control_callback; + if ( isset( $_GET['edit'] ) && $widget_id == $_GET['edit'] ) { + list($url) = explode( '#', add_query_arg( 'edit', false ), 2 ); + $widget_name .= ' ' . __( 'Cancel' ) . ''; + $callback = '_wp_dashboard_control_callback'; + } else { + list($url) = explode( '#', add_query_arg( 'edit', $widget_id ), 2 ); + $widget_name .= ' ' . __( 'Configure' ) . ''; + } + } + + $side_widgets = array( 'dashboard_quick_press', 'dashboard_primary' ); + + $location = 'normal'; + if ( in_array( $widget_id, $side_widgets ) ) { + $location = 'side'; + } + + $high_priority_widgets = array( 'dashboard_browser_nag', 'dashboard_php_nag' ); + + $priority = 'core'; + if ( in_array( $widget_id, $high_priority_widgets, true ) ) { + $priority = 'high'; + } + + add_meta_box( $widget_id, $widget_name, $callback, $screen, $location, $priority, $callback_args ); +} + +/** + * Outputs controls for the current dashboard widget. + * + * @access private + * @since 2.7.0 + * + * @param mixed $dashboard + * @param array $meta_box + */ +function _wp_dashboard_control_callback( $dashboard, $meta_box ) { + echo '
        '; + wp_dashboard_trigger_widget_control( $meta_box['id'] ); + wp_nonce_field( 'edit-dashboard-widget_' . $meta_box['id'], 'dashboard-widget-nonce' ); + echo ''; + submit_button( __( 'Submit' ) ); + echo '
        '; +} + +/** + * Displays the dashboard. + * + * @since 2.5.0 + */ +function wp_dashboard() { + $screen = get_current_screen(); + $columns = absint( $screen->get_columns() ); + $columns_css = ''; + if ( $columns ) { + $columns_css = " columns-$columns"; + } + + ?> +
        +
        + id, 'normal', '' ); ?> +
        +
        + id, 'side', '' ); ?> +
        +
        + id, 'column3', '' ); ?> +
        +
        + id, 'column4', '' ); ?> +
        +
        + + +
        +
          + publish ) { + if ( 'post' == $post_type ) { + /* translators: %s: Number of posts. */ + $text = _n( '%s Post', '%s Posts', $num_posts->publish ); + } else { + /* translators: %s: Number of pages. */ + $text = _n( '%s Page', '%s Pages', $num_posts->publish ); + } + $text = sprintf( $text, number_format_i18n( $num_posts->publish ) ); + $post_type_object = get_post_type_object( $post_type ); + if ( $post_type_object && current_user_can( $post_type_object->cap->edit_posts ) ) { + printf( '
        • %2$s
        • ', $post_type, $text ); + } else { + printf( '
        • %2$s
        • ', $post_type, $text ); + } + } + } + // Comments. + $num_comm = wp_count_comments(); + if ( $num_comm && ( $num_comm->approved || $num_comm->moderated ) ) { + /* translators: %s: Number of comments. */ + $text = sprintf( _n( '%s Comment', '%s Comments', $num_comm->approved ), number_format_i18n( $num_comm->approved ) ); + ?> +
        • + moderated ); + /* translators: %s: Number of comments. */ + $text = sprintf( _n( '%s Comment in moderation', '%s Comments in moderation', $num_comm->moderated ), $moderated_comments_count_i18n ); + ?> +
        • + ' . implode( "\n
        • ", $elements ) . "
        • \n"; + } + + ?> +
        + $content

        "; + } + ?> +
        + +
        + +
        + ' . __( 'Create a New Site' ) . ''; + } + if ( current_user_can( 'create_users' ) ) { + $actions['create-user'] = '' . __( 'Create a New User' ) . ''; + } + + $c_users = get_user_count(); + $c_blogs = get_blog_count(); + + /* translators: %s: Number of users on the network. */ + $user_text = sprintf( _n( '%s user', '%s users', $c_users ), number_format_i18n( $c_users ) ); + /* translators: %s: Number of sites on the network. */ + $blog_text = sprintf( _n( '%s site', '%s sites', $c_blogs ), number_format_i18n( $c_blogs ) ); + + /* translators: 1: Text indicating the number of sites on the network, 2: Text indicating the number of users on the network. */ + $sentence = sprintf( __( 'You have %1$s and %2$s.' ), $blog_text, $user_text ); + + if ( $actions ) { + echo '
          '; + foreach ( $actions as $class => $action ) { + $actions[ $class ] = "\t
        • $action"; + } + echo implode( " |
        • \n", $actions ) . "\n"; + echo '
        '; + } + ?> +
        + +

        + + + + +
        +

        + + + 'submit_users' ) ); ?> +

        +
        + +
        +

        + + + 'submit_sites' ) ); ?> +

        +
        + post_status ) { // auto-draft doesn't exist anymore. + $post = get_default_post_to_edit( 'post', true ); + update_user_option( get_current_user_id(), 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID. + } else { + $post->post_title = ''; // Remove the auto draft title. + } + } else { + $post = get_default_post_to_edit( 'post', true ); + $user_id = get_current_user_id(); + // Don't create an option if this is a super admin who does not belong to this site. + if ( in_array( get_current_blog_id(), array_keys( get_blogs_of_user( $user_id ) ) ) ) { + update_user_option( $user_id, 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID. + } + } + + $post_ID = (int) $post->ID; + ?> + +
        + + +
        + + +
        + + +
        + +
        + + +
        + +

        + + + + + 'save-post' ) ); ?> +
        +

        + +
        + 'post', + 'post_status' => 'draft', + 'author' => get_current_user_id(), + 'posts_per_page' => 4, + 'orderby' => 'modified', + 'order' => 'DESC', + ); + + /** + * Filters the post query arguments for the 'Recent Drafts' dashboard widget. + * + * @since 4.4.0 + * + * @param array $query_args The query arguments for the 'Recent Drafts' dashboard widget. + */ + $query_args = apply_filters( 'dashboard_recent_drafts_query_args', $query_args ); + + $drafts = get_posts( $query_args ); + if ( ! $drafts ) { + return; + } + } + + echo '
        '; + if ( count( $drafts ) > 3 ) { + printf( + '

        %s

        ' . "\n", + esc_url( admin_url( 'edit.php?post_status=draft' ) ), + __( 'View all drafts' ) + ); + } + echo '

        ' . __( 'Your Recent Drafts' ) . "

        \n
          "; + + /* translators: Maximum number of words used in a preview of a draft on the dashboard. */ + $draft_length = intval( _x( '10', 'draft_length' ) ); + + $drafts = array_slice( $drafts, 0, 3 ); + foreach ( $drafts as $draft ) { + $url = get_edit_post_link( $draft->ID ); + $title = _draft_or_post_title( $draft->ID ); + echo "
        • \n"; + printf( + '
          %s
          ', + esc_url( $url ), + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'Edit “%s”' ), $title ) ), + esc_html( $title ), + get_the_time( 'c', $draft ), + get_the_time( __( 'F j, Y' ), $draft ) + ); + $the_content = wp_trim_words( $draft->post_content, $draft_length ); + if ( $the_content ) { + echo '

          ' . $the_content . '

          '; + } + echo "
        • \n"; + } + echo "
        \n
        "; +} + +/** + * Outputs a row for the Recent Comments widget. + * + * @access private + * @since 2.7.0 + * + * @global WP_Comment $comment Global comment object. + * + * @param WP_Comment $comment The current comment. + * @param bool $show_date Optional. Whether to display the date. + */ +function _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) { + $GLOBALS['comment'] = clone $comment; + + if ( $comment->comment_post_ID > 0 ) { + + $comment_post_title = _draft_or_post_title( $comment->comment_post_ID ); + $comment_post_url = get_the_permalink( $comment->comment_post_ID ); + $comment_post_link = "$comment_post_title"; + } else { + $comment_post_link = ''; + } + + $actions_string = ''; + if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) { + // Pre-order it: Approve | Reply | Edit | Spam | Trash. + $actions = array( + 'approve' => '', + 'unapprove' => '', + 'reply' => '', + 'edit' => '', + 'spam' => '', + 'trash' => '', + 'delete' => '', + 'view' => '', + ); + + $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); + $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); + + $approve_url = esc_url( "comment.php?action=approvecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); + $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); + $spam_url = esc_url( "comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); + $trash_url = esc_url( "comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); + $delete_url = esc_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); + + $actions['approve'] = sprintf( + '%s', + $approve_url, + "dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=approved", + esc_attr__( 'Approve this comment' ), + __( 'Approve' ) + ); + + $actions['unapprove'] = sprintf( + '%s', + $unapprove_url, + "dim:the-comment-list:comment-{$comment->comment_ID}:unapproved:e7e7d3:e7e7d3:new=unapproved", + esc_attr__( 'Unapprove this comment' ), + __( 'Unapprove' ) + ); + + $actions['edit'] = sprintf( + '%s', + "comment.php?action=editcomment&c={$comment->comment_ID}", + esc_attr__( 'Edit this comment' ), + __( 'Edit' ) + ); + + $actions['reply'] = sprintf( + '', + $comment->comment_ID, + $comment->comment_post_ID, + esc_attr__( 'Reply to this comment' ), + __( 'Reply' ) + ); + + $actions['spam'] = sprintf( + '%s', + $spam_url, + "delete:the-comment-list:comment-{$comment->comment_ID}::spam=1", + esc_attr__( 'Mark this comment as spam' ), + /* translators: "Mark as spam" link. */ + _x( 'Spam', 'verb' ) + ); + + if ( ! EMPTY_TRASH_DAYS ) { + $actions['delete'] = sprintf( + '%s', + $delete_url, + "delete:the-comment-list:comment-{$comment->comment_ID}::trash=1", + esc_attr__( 'Delete this comment permanently' ), + __( 'Delete Permanently' ) + ); + } else { + $actions['trash'] = sprintf( + '%s', + $trash_url, + "delete:the-comment-list:comment-{$comment->comment_ID}::trash=1", + esc_attr__( 'Move this comment to the Trash' ), + _x( 'Trash', 'verb' ) + ); + } + + $actions['view'] = sprintf( + '%s', + esc_url( get_comment_link( $comment ) ), + esc_attr__( 'View this comment' ), + __( 'View' ) + ); + + /** + * Filters the action links displayed for each comment in the 'Recent Comments' + * dashboard widget. + * + * @since 2.6.0 + * + * @param string[] $actions An array of comment actions. Default actions include: + * 'Approve', 'Unapprove', 'Edit', 'Reply', 'Spam', + * 'Delete', and 'Trash'. + * @param WP_Comment $comment The comment object. + */ + $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment ); + + $i = 0; + foreach ( $actions as $action => $link ) { + ++$i; + ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; + + // Reply and quickedit need a hide-if-no-js span. + if ( 'reply' == $action || 'quickedit' == $action ) { + $action .= ' hide-if-no-js'; + } + + if ( 'view' === $action && '1' !== $comment->comment_approved ) { + $action .= ' hidden'; + } + $actions_string .= "$sep$link"; + } + } + ?> + +
      • > + + + + comment_type || 'comment' == $comment->comment_type ) : ?> + +
        +

        + ' . get_comment_author_link( $comment ) . '', + $comment_post_link, + '' . __( '[Pending]' ) . '' + ); + } else { + printf( + /* translators: 1: Comment author, 2: Notification if the comment is pending. */ + __( 'From %1$s %2$s' ), + '' . get_comment_author_link( $comment ) . '', + '' . __( '[Pending]' ) . '' + ); + } + ?> +

        + + comment_type ) { + case 'pingback': + $type = __( 'Pingback' ); + break; + case 'trackback': + $type = __( 'Trackback' ); + break; + default: + $type = ucwords( $comment->comment_type ); + } + $type = esc_html( $type ); + ?> +
        +

        + $type", + $comment_post_link, + '' . __( '[Pending]' ) . '' + ); + } else { + printf( + /* translators: 1: Type of comment, 2: Notification if the comment is pending. */ + _x( '%1$s %2$s', 'dashboard' ), + "$type", + '' . __( '[Pending]' ) . '' + ); + } + ?> +

        +

        + + +

        + +

        + +
        +
      • + '; + + $future_posts = wp_dashboard_recent_posts( + array( + 'max' => 5, + 'status' => 'future', + 'order' => 'ASC', + 'title' => __( 'Publishing Soon' ), + 'id' => 'future-posts', + ) + ); + $recent_posts = wp_dashboard_recent_posts( + array( + 'max' => 5, + 'status' => 'publish', + 'order' => 'DESC', + 'title' => __( 'Recently Published' ), + 'id' => 'published-posts', + ) + ); + + $recent_comments = wp_dashboard_recent_comments(); + + if ( ! $future_posts && ! $recent_posts && ! $recent_comments ) { + echo '
        '; + echo ''; + echo '

        ' . __( 'No activity yet!' ) . '

        '; + echo '
        '; + } + + echo '
        '; +} + +/** + * Generates Publishing Soon and Recently Published sections. + * + * @since 3.8.0 + * + * @param array $args { + * An array of query and display arguments. + * + * @type int $max Number of posts to display. + * @type string $status Post status. + * @type string $order Designates ascending ('ASC') or descending ('DESC') order. + * @type string $title Section title. + * @type string $id The container id. + * } + * @return bool False if no posts were found. True otherwise. + */ +function wp_dashboard_recent_posts( $args ) { + $query_args = array( + 'post_type' => 'post', + 'post_status' => $args['status'], + 'orderby' => 'date', + 'order' => $args['order'], + 'posts_per_page' => intval( $args['max'] ), + 'no_found_rows' => true, + 'cache_results' => false, + 'perm' => ( 'future' === $args['status'] ) ? 'editable' : 'readable', + ); + + /** + * Filters the query arguments used for the Recent Posts widget. + * + * @since 4.2.0 + * + * @param array $query_args The arguments passed to WP_Query to produce the list of posts. + */ + $query_args = apply_filters( 'dashboard_recent_posts_query_args', $query_args ); + $posts = new WP_Query( $query_args ); + + if ( $posts->have_posts() ) { + + echo '
        '; + + echo '

        ' . $args['title'] . '

        '; + + echo '
          '; + + $today = current_time( 'Y-m-d' ); + $tomorrow = current_datetime()->modify( '+1 day' )->format( 'Y-m-d' ); + $year = current_time( 'Y' ); + + while ( $posts->have_posts() ) { + $posts->the_post(); + + $time = get_the_time( 'U' ); + if ( gmdate( 'Y-m-d', $time ) == $today ) { + $relative = __( 'Today' ); + } elseif ( gmdate( 'Y-m-d', $time ) == $tomorrow ) { + $relative = __( 'Tomorrow' ); + } elseif ( gmdate( 'Y', $time ) !== $year ) { + /* translators: Date and time format for recent posts on the dashboard, from a different calendar year, see https://www.php.net/date */ + $relative = date_i18n( __( 'M jS Y' ), $time ); + } else { + /* translators: Date and time format for recent posts on the dashboard, see https://www.php.net/date */ + $relative = date_i18n( __( 'M jS' ), $time ); + } + + // Use the post edit link for those who can edit, the permalink otherwise. + $recent_post_link = current_user_can( 'edit_post', get_the_ID() ) ? get_edit_post_link() : get_permalink(); + + $draft_or_post_title = _draft_or_post_title(); + printf( + '
        • %1$s %4$s
        • ', + /* translators: 1: Relative date, 2: Time. */ + sprintf( _x( '%1$s, %2$s', 'dashboard' ), $relative, get_the_time() ), + $recent_post_link, + /* translators: %s: Post title. */ + esc_attr( sprintf( __( 'Edit “%s”' ), $draft_or_post_title ) ), + $draft_or_post_title + ); + } + + echo '
        '; + echo '
        '; + + } else { + return false; + } + + wp_reset_postdata(); + + return true; +} + +/** + * Show Comments section. + * + * @since 3.8.0 + * + * @param int $total_items Optional. Number of comments to query. Default 5. + * @return bool False if no comments were found. True otherwise. + */ +function wp_dashboard_recent_comments( $total_items = 5 ) { + // Select all comment types and filter out spam later for better query performance. + $comments = array(); + + $comments_query = array( + 'number' => $total_items * 5, + 'offset' => 0, + ); + if ( ! current_user_can( 'edit_posts' ) ) { + $comments_query['status'] = 'approve'; + } + + while ( count( $comments ) < $total_items && $possible = get_comments( $comments_query ) ) { + if ( ! is_array( $possible ) ) { + break; + } + foreach ( $possible as $comment ) { + if ( ! current_user_can( 'read_post', $comment->comment_post_ID ) ) { + continue; + } + $comments[] = $comment; + if ( count( $comments ) == $total_items ) { + break 2; + } + } + $comments_query['offset'] += $comments_query['number']; + $comments_query['number'] = $total_items * 10; + } + + if ( $comments ) { + echo '
        '; + echo '

        ' . __( 'Recent Comments' ) . '

        '; + + echo '
          '; + foreach ( $comments as $comment ) { + _wp_dashboard_recent_comments_row( $comment ); + } + echo '
        '; + + if ( current_user_can( 'edit_posts' ) ) { + echo '

        ' . __( 'View more comments' ) . '

        '; + _get_list_table( 'WP_Comments_List_Table' )->views(); + } + + wp_comment_reply( -1, false, 'dashboard', false ); + wp_comment_trashnotice(); + + echo '
        '; + } else { + return false; + } + return true; +} + +/** + * Display generic dashboard RSS widget feed. + * + * @since 2.5.0 + * + * @param string $widget_id + */ +function wp_dashboard_rss_output( $widget_id ) { + $widgets = get_option( 'dashboard_widget_options' ); + echo '
        '; + wp_widget_rss_output( $widgets[ $widget_id ] ); + echo '
        '; +} + +/** + * Checks to see if all of the feed url in $check_urls are cached. + * + * If $check_urls is empty, look for the rss feed url found in the dashboard + * widget options of $widget_id. If cached, call $callback, a function that + * echoes out output for this widget. If not cache, echo a "Loading..." stub + * which is later replaced by Ajax call (see top of /wp-admin/index.php) + * + * @since 2.5.0 + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @param string $widget_id The widget ID. + * @param callable $callback The callback function used to display each feed. + * @param array $check_urls RSS feeds. + * @param mixed ...$args Optional additional parameters to pass to the callback function. + * @return bool True on success, false on failure. + */ +function wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array(), ...$args ) { + $loading = '

        ' . __( 'Loading…' ) . '

        ' . __( 'This widget requires JavaScript.' ) . '

        '; + $doing_ajax = wp_doing_ajax(); + + if ( empty( $check_urls ) ) { + $widgets = get_option( 'dashboard_widget_options' ); + if ( empty( $widgets[ $widget_id ]['url'] ) && ! $doing_ajax ) { + echo $loading; + return false; + } + $check_urls = array( $widgets[ $widget_id ]['url'] ); + } + + $locale = get_user_locale(); + $cache_key = 'dash_v2_' . md5( $widget_id . '_' . $locale ); + $output = get_transient( $cache_key ); + if ( false !== $output ) { + echo $output; + return true; + } + + if ( ! $doing_ajax ) { + echo $loading; + return false; + } + + if ( $callback && is_callable( $callback ) ) { + array_unshift( $args, $widget_id, $check_urls ); + ob_start(); + call_user_func_array( $callback, $args ); + // Default lifetime in cache of 12 hours (same as the feeds). + set_transient( $cache_key, ob_get_flush(), 12 * HOUR_IN_SECONDS ); + } + + return true; +} + +// +// Dashboard Widgets Controls. +// + +/** + * Calls widget control callback. + * + * @since 2.5.0 + * + * @global array $wp_dashboard_control_callbacks + * + * @param int $widget_control_id Registered Widget ID. + */ +function wp_dashboard_trigger_widget_control( $widget_control_id = false ) { + global $wp_dashboard_control_callbacks; + + if ( is_scalar( $widget_control_id ) && $widget_control_id && isset( $wp_dashboard_control_callbacks[ $widget_control_id ] ) && is_callable( $wp_dashboard_control_callbacks[ $widget_control_id ] ) ) { + call_user_func( + $wp_dashboard_control_callbacks[ $widget_control_id ], + '', + array( + 'id' => $widget_control_id, + 'callback' => $wp_dashboard_control_callbacks[ $widget_control_id ], + ) + ); + } +} + +/** + * The RSS dashboard widget control. + * + * Sets up $args to be used as input to wp_widget_rss_form(). Handles POST data + * from RSS-type widgets. + * + * @since 2.5.0 + * + * @param string $widget_id + * @param array $form_inputs + */ +function wp_dashboard_rss_control( $widget_id, $form_inputs = array() ) { + $widget_options = get_option( 'dashboard_widget_options' ); + if ( ! $widget_options ) { + $widget_options = array(); + } + + if ( ! isset( $widget_options[ $widget_id ] ) ) { + $widget_options[ $widget_id ] = array(); + } + + $number = 1; // Hack to use wp_widget_rss_form(). + + $widget_options[ $widget_id ]['number'] = $number; + + if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset( $_POST['widget-rss'][ $number ] ) ) { + $_POST['widget-rss'][ $number ] = wp_unslash( $_POST['widget-rss'][ $number ] ); + $widget_options[ $widget_id ] = wp_widget_rss_process( $_POST['widget-rss'][ $number ] ); + $widget_options[ $widget_id ]['number'] = $number; + + // Title is optional. If black, fill it if possible. + if ( ! $widget_options[ $widget_id ]['title'] && isset( $_POST['widget-rss'][ $number ]['title'] ) ) { + $rss = fetch_feed( $widget_options[ $widget_id ]['url'] ); + if ( is_wp_error( $rss ) ) { + $widget_options[ $widget_id ]['title'] = htmlentities( __( 'Unknown Feed' ) ); + } else { + $widget_options[ $widget_id ]['title'] = htmlentities( strip_tags( $rss->get_title() ) ); + $rss->__destruct(); + unset( $rss ); + } + } + update_option( 'dashboard_widget_options', $widget_options ); + $locale = get_user_locale(); + $cache_key = 'dash_v2_' . md5( $widget_id . '_' . $locale ); + delete_transient( $cache_key ); + } + + wp_widget_rss_form( $widget_options[ $widget_id ], $form_inputs ); +} + + +/** + * Renders the Events and News dashboard widget. + * + * @since 4.8.0 + */ +function wp_dashboard_events_news() { + wp_print_community_events_markup(); + + ?> + +
        + +
        + + + + + +
        +

        + +

        + + + + +
        + +
        + +
        + + + + + + + + + + + + + + array( + + /** + * Filters the primary link URL for the 'WordPress Events and News' dashboard widget. + * + * @since 2.5.0 + * + * @param string $link The widget's primary link URL. + */ + 'link' => apply_filters( 'dashboard_primary_link', __( 'https://wordpress.org/news/' ) ), + + /** + * Filters the primary feed URL for the 'WordPress Events and News' dashboard widget. + * + * @since 2.3.0 + * + * @param string $url The widget's primary feed URL. + */ + 'url' => apply_filters( 'dashboard_primary_feed', __( 'https://wordpress.org/news/feed/' ) ), + + /** + * Filters the primary link title for the 'WordPress Events and News' dashboard widget. + * + * @since 2.3.0 + * + * @param string $title Title attribute for the widget's primary link. + */ + 'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Blog' ) ), + 'items' => 1, + 'show_summary' => 0, + 'show_author' => 0, + 'show_date' => 0, + ), + 'planet' => array( + + /** + * Filters the secondary link URL for the 'WordPress Events and News' dashboard widget. + * + * @since 2.3.0 + * + * @param string $link The widget's secondary link URL. + */ + 'link' => apply_filters( 'dashboard_secondary_link', __( 'https://planet.wordpress.org/' ) ), + + /** + * Filters the secondary feed URL for the 'WordPress Events and News' dashboard widget. + * + * @since 2.3.0 + * + * @param string $url The widget's secondary feed URL. + */ + 'url' => apply_filters( 'dashboard_secondary_feed', __( 'https://planet.wordpress.org/feed/' ) ), + + /** + * Filters the secondary link title for the 'WordPress Events and News' dashboard widget. + * + * @since 2.3.0 + * + * @param string $title Title attribute for the widget's secondary link. + */ + 'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ), + + /** + * Filters the number of secondary link items for the 'WordPress Events and News' dashboard widget. + * + * @since 4.4.0 + * + * @param string $items How many items to show in the secondary feed. + */ + 'items' => apply_filters( 'dashboard_secondary_items', 3 ), + 'show_summary' => 0, + 'show_author' => 0, + 'show_date' => 0, + ), + ); + + wp_dashboard_cached_rss_widget( 'dashboard_primary', 'wp_dashboard_primary_output', $feeds ); +} + +/** + * Displays the WordPress events and news feeds. + * + * @since 3.8.0 + * @since 4.8.0 Removed popular plugins feed. + * + * @param string $widget_id Widget ID. + * @param array $feeds Array of RSS feeds. + */ +function wp_dashboard_primary_output( $widget_id, $feeds ) { + foreach ( $feeds as $type => $args ) { + $args['type'] = $type; + echo '
        '; + wp_widget_rss_output( $args['url'], $args ); + echo '
        '; + } +} + +/** + * Displays file upload quota on dashboard. + * + * Runs on the {@see 'activity_box_end'} hook in wp_dashboard_right_now(). + * + * @since 3.0.0 + * + * @return bool|null True if not multisite, user can't upload files, or the space check option is disabled. + */ +function wp_dashboard_quota() { + if ( ! is_multisite() || ! current_user_can( 'upload_files' ) || get_site_option( 'upload_space_check_disabled' ) ) { + return true; + } + + $quota = get_space_allowed(); + $used = get_space_used(); + + if ( $used > $quota ) { + $percentused = '100'; + } else { + $percentused = ( $used / $quota ) * 100; + } + $used_class = ( $percentused >= 70 ) ? ' warning' : ''; + $used = round( $used, 2 ); + $percentused = number_format( $percentused ); + + ?> +

        +
        +
          +
        • + %2$s (%3$s)', + esc_url( admin_url( 'upload.php' ) ), + $text, + __( 'Manage Uploads' ) + ); + ?> +
        • + %2$s (%3$s)', + esc_url( admin_url( 'upload.php' ) ), + $text, + __( 'Manage Uploads' ) + ); + ?> +
        • +
        +
        + %s', esc_url( $response['update_url'] ), esc_html( $response['name'] ) ) + ); + } else { + $msg = sprintf( + /* translators: %s: Browser name and link. */ + __( "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." ), + sprintf( '%s', esc_url( $response['update_url'] ), esc_html( $response['name'] ) ) + ); + } + + $browser_nag_class = ''; + if ( ! empty( $response['img_src'] ) ) { + $img_src = ( is_ssl() && ! empty( $response['img_src_ssl'] ) ) ? $response['img_src_ssl'] : $response['img_src']; + + $notice .= '
        '; + $browser_nag_class = ' has-browser-icon'; + } + $notice .= "

        {$msg}

        "; + + $browsehappy = 'https://browsehappy.com/'; + $locale = get_user_locale(); + if ( 'en_US' !== $locale ) { + $browsehappy = add_query_arg( 'locale', $locale, $browsehappy ); + } + + $notice .= '

        ' . sprintf( + /* translators: 1: Browser update URL, 2: Browser name, 3: Browse Happy URL. */ + __( 'Update %2$s or learn how to browse happy' ), + esc_attr( $response['update_url'] ), + esc_html( $response['name'] ), + esc_url( $browsehappy ) + ) . '

        '; + $notice .= '

        ' . __( 'Dismiss' ) . '

        '; + $notice .= '
        '; + } + + /** + * Filters the notice output for the 'Browse Happy' nag meta box. + * + * @since 3.2.0 + * + * @param string $notice The notice content. + * @param array $response An array containing web browser information. See `wp_check_browser_version()`. + */ + echo apply_filters( 'browse-happy-notice', $notice, $response ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores +} + +/** + * Adds an additional class to the browser nag if the current version is insecure. + * + * @since 3.2.0 + * + * @param string[] $classes Array of meta box classes. + * @return string[] Modified array of meta box classes. + */ +function dashboard_browser_nag_class( $classes ) { + $response = wp_check_browser_version(); + + if ( $response && $response['insecure'] ) { + $classes[] = 'browser-insecure'; + } + + return $classes; +} + +/** + * Checks if the user needs a browser update. + * + * @since 3.2.0 + * + * @return array|bool Array of browser data on success, false on failure. + */ +function wp_check_browser_version() { + if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) { + return false; + } + + $key = md5( $_SERVER['HTTP_USER_AGENT'] ); + + $response = get_site_transient( 'browser_' . $key ); + if ( false === $response ) { + // Include an unmodified $wp_version. + require ABSPATH . WPINC . '/version.php'; + + $url = 'http://api.wordpress.org/core/browse-happy/1.1/'; + $options = array( + 'body' => array( 'useragent' => $_SERVER['HTTP_USER_AGENT'] ), + 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), + ); + + if ( wp_http_supports( array( 'ssl' ) ) ) { + $url = set_url_scheme( $url, 'https' ); + } + + $response = wp_remote_post( $url, $options ); + + if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) { + return false; + } + + /** + * Response should be an array with: + * 'platform' - string - A user-friendly platform name, if it can be determined + * 'name' - string - A user-friendly browser name + * 'version' - string - The version of the browser the user is using + * 'current_version' - string - The most recent version of the browser + * 'upgrade' - boolean - Whether the browser needs an upgrade + * 'insecure' - boolean - Whether the browser is deemed insecure + * 'update_url' - string - The url to visit to upgrade + * 'img_src' - string - An image representing the browser + * 'img_src_ssl' - string - An image (over SSL) representing the browser + */ + $response = json_decode( wp_remote_retrieve_body( $response ), true ); + + if ( ! is_array( $response ) ) { + return false; + } + + set_site_transient( 'browser_' . $key, $response, WEEK_IN_SECONDS ); + } + + return $response; +} + +/** + * Displays the PHP update nag. + * + * @since 5.1.0 + */ +function wp_dashboard_php_nag() { + $response = wp_check_php_version(); + + if ( ! $response ) { + return; + } + + if ( isset( $response['is_secure'] ) && ! $response['is_secure'] ) { + $msg = __( 'WordPress has detected that your site is running on an insecure version of PHP.' ); + } else { + $msg = __( 'WordPress has detected that your site is running on an outdated version of PHP.' ); + } + + ?> +

        + +

        +

        + +

        + %2$s %3$s', + esc_url( wp_get_update_php_url() ), + __( 'Learn more about updating PHP' ), + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ); + ?> +

        + 0, + 'recommended' => 0, + 'critical' => 0, + ); + } + + $issues_total = $issue_counts['recommended'] + $issue_counts['critical']; + ?> +
        +
        + +
        +
        + + + + + +
        +
        + + +

        + visit the Site Health screen to gather information about your site now.' ), + esc_url( admin_url( 'site-health.php' ) ) + ); + ?> +

        + +

        + 0 ) : ?> + + + + + + +

        + + + 0 && false !== $get_issues ) : ?> +

        + %1$d item on the Site Health screen.', + 'Take a look at the %1$d items on the Site Health screen.', + $issues_total + ), + $issues_total, + esc_url( admin_url( 'site-health.php' ) ) + ); + ?> +

        + + + +
        +

        +

        +
        +
        + +

        + + + + true ) ) ) > 1 ) ) : ?> + +

        + change your theme completely' ), $themes_link ); + ?> +

        + +
        +
        +

        +
          + +
        • ' . __( 'Edit your front page' ) . '', get_edit_post_link( get_option( 'page_on_front' ) ) ); ?>
        • +
        • ' . __( 'Add additional pages' ) . '', admin_url( 'post-new.php?post_type=page' ) ); ?>
        • + +
        • ' . __( 'Edit your front page' ) . '', get_edit_post_link( get_option( 'page_on_front' ) ) ); ?>
        • +
        • ' . __( 'Add additional pages' ) . '', admin_url( 'post-new.php?post_type=page' ) ); ?>
        • +
        • ' . __( 'Add a blog post' ) . '', admin_url( 'post-new.php' ) ); ?>
        • + +
        • ' . __( 'Write your first blog post' ) . '', admin_url( 'post-new.php' ) ); ?>
        • +
        • ' . __( 'Add an About page' ) . '', admin_url( 'post-new.php?post_type=page' ) ); ?>
        • +
        • ' . __( 'Set up your homepage' ) . '', current_user_can( 'customize' ) ? add_query_arg( 'autofocus[section]', 'static_front_page', admin_url( 'customize.php' ) ) : admin_url( 'options-reading.php' ) ); ?>
        • + +
        • ' . __( 'View your site' ) . '', home_url( '/' ) ); ?>
        • +
        +
        +
        +

        +
          + +
        • ' . __( 'Manage widgets' ) . '', admin_url( 'widgets.php' ) ); ?>
        • + + +
        • ' . __( 'Manage menus' ) . '', admin_url( 'nav-menus.php' ) ); ?>
        • + + +
        • ' . __( 'Turn comments on or off' ) . '', admin_url( 'options-discussion.php' ) ); ?>
        • + +
        • ' . __( 'Learn more about getting started' ) . '', __( 'https://wordpress.org/support/article/first-steps-with-wordpress-b/' ) ); ?>
        • +
        +
        +
        +
        + 0) ); + + if ( $categories ) { + foreach ( $categories as $category ) { + if ( $currentcat != $category->term_id && $parent == $category->parent) { + $pad = str_repeat( '– ', $level ); + $category->name = esc_html( $category->name ); + echo "\n\t"; + wp_dropdown_cats( $currentcat, $currentparent, $category->term_id, $level +1, $categories ); + } + } + } else { + return false; + } +} + +/** + * Register a setting and its sanitization callback + * + * @since 2.7.0 + * @deprecated 3.0.0 Use register_setting() + * @see register_setting() + * + * @param string $option_group A settings group name. Should correspond to a whitelisted option key name. + * Default whitelisted option key names include 'general', 'discussion', 'media', + * 'reading', 'writing', 'misc', 'options', and 'privacy'. + * @param string $option_name The name of an option to sanitize and save. + * @param callable $sanitize_callback A callback function that sanitizes the option's value. + */ +function add_option_update_handler( $option_group, $option_name, $sanitize_callback = '' ) { + _deprecated_function( __FUNCTION__, '3.0.0', 'register_setting()' ); + register_setting( $option_group, $option_name, $sanitize_callback ); +} + +/** + * Unregister a setting + * + * @since 2.7.0 + * @deprecated 3.0.0 Use unregister_setting() + * @see unregister_setting() + * + * @param string $option_group + * @param string $option_name + * @param callable $sanitize_callback + */ +function remove_option_update_handler( $option_group, $option_name, $sanitize_callback = '' ) { + _deprecated_function( __FUNCTION__, '3.0.0', 'unregister_setting()' ); + unregister_setting( $option_group, $option_name, $sanitize_callback ); +} + +/** + * Determines the language to use for CodePress syntax highlighting. + * + * @since 2.8.0 + * @deprecated 3.0.0 + * + * @param string $filename +**/ +function codepress_get_lang( $filename ) { + _deprecated_function( __FUNCTION__, '3.0.0' ); +} + +/** + * Adds JavaScript required to make CodePress work on the theme/plugin editors. + * + * @since 2.8.0 + * @deprecated 3.0.0 +**/ +function codepress_footer_js() { + _deprecated_function( __FUNCTION__, '3.0.0' ); +} + +/** + * Determine whether to use CodePress. + * + * @since 2.8.0 + * @deprecated 3.0.0 +**/ +function use_codepress() { + _deprecated_function( __FUNCTION__, '3.0.0' ); +} + +/** + * Get all user IDs. + * + * @deprecated 3.1.0 Use get_users() + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return array List of user IDs. + */ +function get_author_user_ids() { + _deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' ); + + global $wpdb; + if ( !is_multisite() ) + $level_key = $wpdb->get_blog_prefix() . 'user_level'; + else + $level_key = $wpdb->get_blog_prefix() . 'capabilities'; // WPMU site admins don't have user_levels. + + return $wpdb->get_col( $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value != '0'", $level_key) ); +} + +/** + * Gets author users who can edit posts. + * + * @deprecated 3.1.0 Use get_users() + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $user_id User ID. + * @return array|bool List of editable authors. False if no editable users. + */ +function get_editable_authors( $user_id ) { + _deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' ); + + global $wpdb; + + $editable = get_editable_user_ids( $user_id ); + + if ( !$editable ) { + return false; + } else { + $editable = join(',', $editable); + $authors = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($editable) ORDER BY display_name" ); + } + + return apply_filters('get_editable_authors', $authors); +} + +/** + * Gets the IDs of any users who can edit posts. + * + * @deprecated 3.1.0 Use get_users() + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $user_id User ID. + * @param bool $exclude_zeros Optional. Whether to exclude zeroes. Default true. + * @return array Array of editable user IDs, empty array otherwise. + */ +function get_editable_user_ids( $user_id, $exclude_zeros = true, $post_type = 'post' ) { + _deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' ); + + global $wpdb; + + if ( ! $user = get_userdata( $user_id ) ) + return array(); + $post_type_obj = get_post_type_object($post_type); + + if ( ! $user->has_cap($post_type_obj->cap->edit_others_posts) ) { + if ( $user->has_cap($post_type_obj->cap->edit_posts) || ! $exclude_zeros ) + return array($user->ID); + else + return array(); + } + + if ( !is_multisite() ) + $level_key = $wpdb->get_blog_prefix() . 'user_level'; + else + $level_key = $wpdb->get_blog_prefix() . 'capabilities'; // WPMU site admins don't have user_levels. + + $query = $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s", $level_key); + if ( $exclude_zeros ) + $query .= " AND meta_value != '0'"; + + return $wpdb->get_col( $query ); +} + +/** + * Gets all users who are not authors. + * + * @deprecated 3.1.0 Use get_users() + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function get_nonauthor_user_ids() { + _deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' ); + + global $wpdb; + + if ( !is_multisite() ) + $level_key = $wpdb->get_blog_prefix() . 'user_level'; + else + $level_key = $wpdb->get_blog_prefix() . 'capabilities'; // WPMU site admins don't have user_levels. + + return $wpdb->get_col( $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value = '0'", $level_key) ); +} + +if ( ! class_exists( 'WP_User_Search', false ) ) : +/** + * WordPress User Search class. + * + * @since 2.1.0 + * @deprecated 3.1.0 Use WP_User_Query + */ +class WP_User_Search { + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var mixed + */ + var $results; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var string + */ + var $search_term; + + /** + * Page number. + * + * @since 2.1.0 + * @access private + * @var int + */ + var $page; + + /** + * Role name that users have. + * + * @since 2.5.0 + * @access private + * @var string + */ + var $role; + + /** + * Raw page number. + * + * @since 2.1.0 + * @access private + * @var int|bool + */ + var $raw_page; + + /** + * Amount of users to display per page. + * + * @since 2.1.0 + * @access public + * @var int + */ + var $users_per_page = 50; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var int + */ + var $first_user; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var int + */ + var $last_user; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var string + */ + var $query_limit; + + /** + * {@internal Missing Description}} + * + * @since 3.0.0 + * @access private + * @var string + */ + var $query_orderby; + + /** + * {@internal Missing Description}} + * + * @since 3.0.0 + * @access private + * @var string + */ + var $query_from; + + /** + * {@internal Missing Description}} + * + * @since 3.0.0 + * @access private + * @var string + */ + var $query_where; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var int + */ + var $total_users_for_query = 0; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var bool + */ + var $too_many_total_users = false; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var WP_Error + */ + var $search_errors; + + /** + * {@internal Missing Description}} + * + * @since 2.7.0 + * @access private + * @var string + */ + var $paging_text; + + /** + * PHP5 Constructor - Sets up the object properties. + * + * @since 2.1.0 + * + * @param string $search_term Search terms string. + * @param int $page Optional. Page ID. + * @param string $role Role name. + * @return WP_User_Search + */ + function __construct( $search_term = '', $page = '', $role = '' ) { + _deprecated_function( __FUNCTION__, '3.1.0', 'WP_User_Query' ); + + $this->search_term = wp_unslash( $search_term ); + $this->raw_page = ( '' == $page ) ? false : (int) $page; + $this->page = (int) ( '' == $page ) ? 1 : $page; + $this->role = $role; + + $this->prepare_query(); + $this->query(); + $this->do_paging(); + } + + /** + * PHP4 Constructor - Sets up the object properties. + * + * @since 2.1.0 + * + * @param string $search_term Search terms string. + * @param int $page Optional. Page ID. + * @param string $role Role name. + * @return WP_User_Search + */ + public function WP_User_Search( $search_term = '', $page = '', $role = '' ) { + self::__construct( $search_term, $page, $role ); + } + + /** + * Prepares the user search query (legacy). + * + * @since 2.1.0 + * @access public + */ + public function prepare_query() { + global $wpdb; + $this->first_user = ($this->page - 1) * $this->users_per_page; + + $this->query_limit = $wpdb->prepare(" LIMIT %d, %d", $this->first_user, $this->users_per_page); + $this->query_orderby = ' ORDER BY user_login'; + + $search_sql = ''; + if ( $this->search_term ) { + $searches = array(); + $search_sql = 'AND ('; + foreach ( array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') as $col ) + $searches[] = $wpdb->prepare( $col . ' LIKE %s', '%' . like_escape($this->search_term) . '%' ); + $search_sql .= implode(' OR ', $searches); + $search_sql .= ')'; + } + + $this->query_from = " FROM $wpdb->users"; + $this->query_where = " WHERE 1=1 $search_sql"; + + if ( $this->role ) { + $this->query_from .= " INNER JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id"; + $this->query_where .= $wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%'); + } elseif ( is_multisite() ) { + $level_key = $wpdb->prefix . 'capabilities'; // WPMU site admins don't have user_levels. + $this->query_from .= ", $wpdb->usermeta"; + $this->query_where .= " AND $wpdb->users.ID = $wpdb->usermeta.user_id AND meta_key = '{$level_key}'"; + } + + do_action_ref_array( 'pre_user_search', array( &$this ) ); + } + + /** + * Executes the user search query. + * + * @since 2.1.0 + * @access public + */ + public function query() { + global $wpdb; + + $this->results = $wpdb->get_col("SELECT DISTINCT($wpdb->users.ID)" . $this->query_from . $this->query_where . $this->query_orderby . $this->query_limit); + + if ( $this->results ) + $this->total_users_for_query = $wpdb->get_var("SELECT COUNT(DISTINCT($wpdb->users.ID))" . $this->query_from . $this->query_where); // No limit. + else + $this->search_errors = new WP_Error('no_matching_users_found', __('No users found.')); + } + + /** + * Prepares variables for use in templates. + * + * @since 2.1.0 + * @access public + */ + function prepare_vars_for_template_usage() {} + + /** + * Handles paging for the user search query. + * + * @since 2.1.0 + * @access public + */ + public function do_paging() { + if ( $this->total_users_for_query > $this->users_per_page ) { // Have to page the results. + $args = array(); + if ( ! empty($this->search_term) ) + $args['usersearch'] = urlencode($this->search_term); + if ( ! empty($this->role) ) + $args['role'] = urlencode($this->role); + + $this->paging_text = paginate_links( array( + 'total' => ceil($this->total_users_for_query / $this->users_per_page), + 'current' => $this->page, + 'base' => 'users.php?%_%', + 'format' => 'userspage=%#%', + 'add_args' => $args + ) ); + if ( $this->paging_text ) { + $this->paging_text = sprintf( + /* translators: 1: Starting number of users on the current page, 2: Ending number of users, 3: Total number of users. */ + '' . __( 'Displaying %1$s–%2$s of %3$s' ) . '%s', + number_format_i18n( ( $this->page - 1 ) * $this->users_per_page + 1 ), + number_format_i18n( min( $this->page * $this->users_per_page, $this->total_users_for_query ) ), + number_format_i18n( $this->total_users_for_query ), + $this->paging_text + ); + } + } + } + + /** + * Retrieves the user search query results. + * + * @since 2.1.0 + * @access public + * + * @return array + */ + public function get_results() { + return (array) $this->results; + } + + /** + * Displaying paging text. + * + * @see do_paging() Builds paging text. + * + * @since 2.1.0 + * @access public + */ + function page_links() { + echo $this->paging_text; + } + + /** + * Whether paging is enabled. + * + * @see do_paging() Builds paging text. + * + * @since 2.1.0 + * @access public + * + * @return bool + */ + function results_are_paged() { + if ( $this->paging_text ) + return true; + return false; + } + + /** + * Whether there are search terms. + * + * @since 2.1.0 + * @access public + * + * @return bool + */ + function is_search() { + if ( $this->search_term ) + return true; + return false; + } +} +endif; + +/** + * Retrieves editable posts from other users. + * + * @since 2.3.0 + * @deprecated 3.1.0 Use get_posts() + * @see get_posts() + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $user_id User ID to not retrieve posts from. + * @param string $type Optional. Post type to retrieve. Accepts 'draft', 'pending' or 'any' (all). + * Default 'any'. + * @return array List of posts from others. + */ +function get_others_unpublished_posts( $user_id, $type = 'any' ) { + _deprecated_function( __FUNCTION__, '3.1.0' ); + + global $wpdb; + + $editable = get_editable_user_ids( $user_id ); + + if ( in_array($type, array('draft', 'pending')) ) + $type_sql = " post_status = '$type' "; + else + $type_sql = " ( post_status = 'draft' OR post_status = 'pending' ) "; + + $dir = ( 'pending' == $type ) ? 'ASC' : 'DESC'; + + if ( !$editable ) { + $other_unpubs = ''; + } else { + $editable = join(',', $editable); + $other_unpubs = $wpdb->get_results( $wpdb->prepare("SELECT ID, post_title, post_author FROM $wpdb->posts WHERE post_type = 'post' AND $type_sql AND post_author IN ($editable) AND post_author != %d ORDER BY post_modified $dir", $user_id) ); + } + + return apply_filters('get_others_drafts', $other_unpubs); +} + +/** + * Retrieve drafts from other users. + * + * @deprecated 3.1.0 Use get_posts() + * @see get_posts() + * + * @param int $user_id User ID. + * @return array List of drafts from other users. + */ +function get_others_drafts($user_id) { + _deprecated_function( __FUNCTION__, '3.1.0' ); + + return get_others_unpublished_posts($user_id, 'draft'); +} + +/** + * Retrieve pending review posts from other users. + * + * @deprecated 3.1.0 Use get_posts() + * @see get_posts() + * + * @param int $user_id User ID. + * @return array List of posts with pending review post type from other users. + */ +function get_others_pending($user_id) { + _deprecated_function( __FUNCTION__, '3.1.0' ); + + return get_others_unpublished_posts($user_id, 'pending'); +} + +/** + * Output the QuickPress dashboard widget. + * + * @since 3.0.0 + * @deprecated 3.2.0 Use wp_dashboard_quick_press() + * @see wp_dashboard_quick_press() + */ +function wp_dashboard_quick_press_output() { + _deprecated_function( __FUNCTION__, '3.2.0', 'wp_dashboard_quick_press()' ); + wp_dashboard_quick_press(); +} + +/** + * Outputs the TinyMCE editor. + * + * @since 2.7.0 + * @deprecated 3.3.0 Use wp_editor() + * @see wp_editor() + * + * @staticvar int $num + */ +function wp_tiny_mce( $teeny = false, $settings = false ) { + _deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' ); + + static $num = 1; + + if ( ! class_exists( '_WP_Editors', false ) ) + require_once ABSPATH . WPINC . '/class-wp-editor.php'; + + $editor_id = 'content' . $num++; + + $set = array( + 'teeny' => $teeny, + 'tinymce' => $settings ? $settings : true, + 'quicktags' => false + ); + + $set = _WP_Editors::parse_settings($editor_id, $set); + _WP_Editors::editor_settings($editor_id, $set); +} + +/** + * Preloads TinyMCE dialogs. + * + * @deprecated 3.3.0 Use wp_editor() + * @see wp_editor() + */ +function wp_preload_dialogs() { + _deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' ); +} + +/** + * Prints TinyMCE editor JS. + * + * @deprecated 3.3.0 Use wp_editor() + * @see wp_editor() + */ +function wp_print_editor_js() { + _deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' ); +} + +/** + * Handles quicktags. + * + * @deprecated 3.3.0 Use wp_editor() + * @see wp_editor() + */ +function wp_quicktags() { + _deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' ); +} + +/** + * Returns the screen layout options. + * + * @since 2.8.0 + * @deprecated 3.3.0 WP_Screen::render_screen_layout() + * @see WP_Screen::render_screen_layout() + */ +function screen_layout( $screen ) { + _deprecated_function( __FUNCTION__, '3.3.0', '$current_screen->render_screen_layout()' ); + + $current_screen = get_current_screen(); + + if ( ! $current_screen ) + return ''; + + ob_start(); + $current_screen->render_screen_layout(); + return ob_get_clean(); +} + +/** + * Returns the screen's per-page options. + * + * @since 2.8.0 + * @deprecated 3.3.0 Use WP_Screen::render_per_page_options() + * @see WP_Screen::render_per_page_options() + */ +function screen_options( $screen ) { + _deprecated_function( __FUNCTION__, '3.3.0', '$current_screen->render_per_page_options()' ); + + $current_screen = get_current_screen(); + + if ( ! $current_screen ) + return ''; + + ob_start(); + $current_screen->render_per_page_options(); + return ob_get_clean(); +} + +/** + * Renders the screen's help. + * + * @since 2.7.0 + * @deprecated 3.3.0 Use WP_Screen::render_screen_meta() + * @see WP_Screen::render_screen_meta() + */ +function screen_meta( $screen ) { + $current_screen = get_current_screen(); + $current_screen->render_screen_meta(); +} + +/** + * Favorite actions were deprecated in version 3.2. Use the admin bar instead. + * + * @since 2.7.0 + * @deprecated 3.2.0 Use WP_Admin_Bar + * @see WP_Admin_Bar + */ +function favorite_actions() { + _deprecated_function( __FUNCTION__, '3.2.0', 'WP_Admin_Bar' ); +} + +/** + * Handles uploading an image. + * + * @deprecated 3.3.0 Use wp_media_upload_handler() + * @see wp_media_upload_handler() + * + * @return null|string + */ +function media_upload_image() { + _deprecated_function( __FUNCTION__, '3.3.0', 'wp_media_upload_handler()' ); + return wp_media_upload_handler(); +} + +/** + * Handles uploading an audio file. + * + * @deprecated 3.3.0 Use wp_media_upload_handler() + * @see wp_media_upload_handler() + * + * @return null|string + */ +function media_upload_audio() { + _deprecated_function( __FUNCTION__, '3.3.0', 'wp_media_upload_handler()' ); + return wp_media_upload_handler(); +} + +/** + * Handles uploading a video file. + * + * @deprecated 3.3.0 Use wp_media_upload_handler() + * @see wp_media_upload_handler() + * + * @return null|string + */ +function media_upload_video() { + _deprecated_function( __FUNCTION__, '3.3.0', 'wp_media_upload_handler()' ); + return wp_media_upload_handler(); +} + +/** + * Handles uploading a generic file. + * + * @deprecated 3.3.0 Use wp_media_upload_handler() + * @see wp_media_upload_handler() + * + * @return null|string + */ +function media_upload_file() { + _deprecated_function( __FUNCTION__, '3.3.0', 'wp_media_upload_handler()' ); + return wp_media_upload_handler(); +} + +/** + * Handles retrieving the insert-from-URL form for an image. + * + * @deprecated 3.3.0 Use wp_media_insert_url_form() + * @see wp_media_insert_url_form() + * + * @return string + */ +function type_url_form_image() { + _deprecated_function( __FUNCTION__, '3.3.0', "wp_media_insert_url_form('image')" ); + return wp_media_insert_url_form( 'image' ); +} + +/** + * Handles retrieving the insert-from-URL form for an audio file. + * + * @deprecated 3.3.0 Use wp_media_insert_url_form() + * @see wp_media_insert_url_form() + * + * @return string + */ +function type_url_form_audio() { + _deprecated_function( __FUNCTION__, '3.3.0', "wp_media_insert_url_form('audio')" ); + return wp_media_insert_url_form( 'audio' ); +} + +/** + * Handles retrieving the insert-from-URL form for a video file. + * + * @deprecated 3.3.0 Use wp_media_insert_url_form() + * @see wp_media_insert_url_form() + * + * @return string + */ +function type_url_form_video() { + _deprecated_function( __FUNCTION__, '3.3.0', "wp_media_insert_url_form('video')" ); + return wp_media_insert_url_form( 'video' ); +} + +/** + * Handles retrieving the insert-from-URL form for a generic file. + * + * @deprecated 3.3.0 Use wp_media_insert_url_form() + * @see wp_media_insert_url_form() + * + * @return string + */ +function type_url_form_file() { + _deprecated_function( __FUNCTION__, '3.3.0', "wp_media_insert_url_form('file')" ); + return wp_media_insert_url_form( 'file' ); +} + +/** + * Add contextual help text for a page. + * + * Creates an 'Overview' help tab. + * + * @since 2.7.0 + * @deprecated 3.3.0 Use WP_Screen::add_help_tab() + * @see WP_Screen::add_help_tab() + * + * @param string $screen The handle for the screen to add help to. This is usually the hook name returned by the add_*_page() functions. + * @param string $help The content of an 'Overview' help tab. + */ +function add_contextual_help( $screen, $help ) { + _deprecated_function( __FUNCTION__, '3.3.0', 'get_current_screen()->add_help_tab()' ); + + if ( is_string( $screen ) ) + $screen = convert_to_screen( $screen ); + + WP_Screen::add_old_compat_help( $screen, $help ); +} + +/** + * Get the allowed themes for the current site. + * + * @since 3.0.0 + * @deprecated 3.4.0 Use wp_get_themes() + * @see wp_get_themes() + * + * @return WP_Theme[] Array of WP_Theme objects keyed by their name. + */ +function get_allowed_themes() { + _deprecated_function( __FUNCTION__, '3.4.0', "wp_get_themes( array( 'allowed' => true ) )" ); + + $themes = wp_get_themes( array( 'allowed' => true ) ); + + $wp_themes = array(); + foreach ( $themes as $theme ) { + $wp_themes[ $theme->get('Name') ] = $theme; + } + + return $wp_themes; +} + +/** + * Retrieves a list of broken themes. + * + * @since 1.5.0 + * @deprecated 3.4.0 Use wp_get_themes() + * @see wp_get_themes() + * + * @return array + */ +function get_broken_themes() { + _deprecated_function( __FUNCTION__, '3.4.0', "wp_get_themes( array( 'errors' => true )" ); + + $themes = wp_get_themes( array( 'errors' => true ) ); + $broken = array(); + foreach ( $themes as $theme ) { + $name = $theme->get('Name'); + $broken[ $name ] = array( + 'Name' => $name, + 'Title' => $name, + 'Description' => $theme->errors()->get_error_message(), + ); + } + return $broken; +} + +/** + * Retrieves information on the current active theme. + * + * @since 2.0.0 + * @deprecated 3.4.0 Use wp_get_theme() + * @see wp_get_theme() + * + * @return WP_Theme + */ +function current_theme_info() { + _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' ); + + return wp_get_theme(); +} + +/** + * This was once used to display an 'Insert into Post' button. + * + * Now it is deprecated and stubbed. + * + * @deprecated 3.5.0 + */ +function _insert_into_post_button( $type ) { + _deprecated_function( __FUNCTION__, '3.5.0' ); +} + +/** + * This was once used to display a media button. + * + * Now it is deprecated and stubbed. + * + * @deprecated 3.5.0 + */ +function _media_button($title, $icon, $type, $id) { + _deprecated_function( __FUNCTION__, '3.5.0' ); +} + +/** + * Gets an existing post and format it for editing. + * + * @since 2.0.0 + * @deprecated 3.5.0 Use get_post() + * @see get_post() + * + * @param int $id + * @return object + */ +function get_post_to_edit( $id ) { + _deprecated_function( __FUNCTION__, '3.5.0', 'get_post()' ); + + return get_post( $id, OBJECT, 'edit' ); +} + +/** + * Gets the default page information to use. + * + * @since 2.5.0 + * @deprecated 3.5.0 Use get_default_post_to_edit() + * @see get_default_post_to_edit() + * + * @return WP_Post Post object containing all the default post data as attributes + */ +function get_default_page_to_edit() { + _deprecated_function( __FUNCTION__, '3.5.0', "get_default_post_to_edit( 'page' )" ); + + $page = get_default_post_to_edit(); + $page->post_type = 'page'; + return $page; +} + +/** + * This was once used to create a thumbnail from an Image given a maximum side size. + * + * @since 1.2.0 + * @deprecated 3.5.0 Use image_resize() + * @see image_resize() + * + * @param mixed $file Filename of the original image, Or attachment id. + * @param int $max_side Maximum length of a single side for the thumbnail. + * @param mixed $deprecated Never used. + * @return string Thumbnail path on success, Error string on failure. + */ +function wp_create_thumbnail( $file, $max_side, $deprecated = '' ) { + _deprecated_function( __FUNCTION__, '3.5.0', 'image_resize()' ); + return apply_filters( 'wp_create_thumbnail', image_resize( $file, $max_side, $max_side ) ); +} + +/** + * This was once used to display a meta box for the nav menu theme locations. + * + * Deprecated in favor of a 'Manage Locations' tab added to nav menus management screen. + * + * @since 3.0.0 + * @deprecated 3.6.0 + */ +function wp_nav_menu_locations_meta_box() { + _deprecated_function( __FUNCTION__, '3.6.0' ); +} + +/** + * This was once used to kick-off the Core Updater. + * + * Deprecated in favor of instantating a Core_Upgrader instance directly, + * and calling the 'upgrade' method. + * + * @since 2.7.0 + * @deprecated 3.7.0 Use Core_Upgrader + * @see Core_Upgrader + */ +function wp_update_core($current, $feedback = '') { + _deprecated_function( __FUNCTION__, '3.7.0', 'new Core_Upgrader();' ); + + if ( !empty($feedback) ) + add_filter('update_feedback', $feedback); + + require ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $upgrader = new Core_Upgrader(); + return $upgrader->upgrade($current); + +} + +/** + * This was once used to kick-off the Plugin Updater. + * + * Deprecated in favor of instantating a Plugin_Upgrader instance directly, + * and calling the 'upgrade' method. + * Unused since 2.8.0. + * + * @since 2.5.0 + * @deprecated 3.7.0 Use Plugin_Upgrader + * @see Plugin_Upgrader + */ +function wp_update_plugin($plugin, $feedback = '') { + _deprecated_function( __FUNCTION__, '3.7.0', 'new Plugin_Upgrader();' ); + + if ( !empty($feedback) ) + add_filter('update_feedback', $feedback); + + require ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $upgrader = new Plugin_Upgrader(); + return $upgrader->upgrade($plugin); +} + +/** + * This was once used to kick-off the Theme Updater. + * + * Deprecated in favor of instantiating a Theme_Upgrader instance directly, + * and calling the 'upgrade' method. + * Unused since 2.8.0. + * + * @since 2.7.0 + * @deprecated 3.7.0 Use Theme_Upgrader + * @see Theme_Upgrader + */ +function wp_update_theme($theme, $feedback = '') { + _deprecated_function( __FUNCTION__, '3.7.0', 'new Theme_Upgrader();' ); + + if ( !empty($feedback) ) + add_filter('update_feedback', $feedback); + + require ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $upgrader = new Theme_Upgrader(); + return $upgrader->upgrade($theme); +} + +/** + * This was once used to display attachment links. Now it is deprecated and stubbed. + * + * @since 2.0.0 + * @deprecated 3.7.0 + * + * @param int|bool $id + */ +function the_attachment_links( $id = false ) { + _deprecated_function( __FUNCTION__, '3.7.0' ); +} + +/** + * Displays a screen icon. + * + * @since 2.7.0 + * @deprecated 3.8.0 + */ +function screen_icon() { + _deprecated_function( __FUNCTION__, '3.8.0' ); + echo get_screen_icon(); +} + +/** + * Retrieves the screen icon (no longer used in 3.8+). + * + * @since 3.2.0 + * @deprecated 3.8.0 + * + * @return string An HTML comment explaining that icons are no longer used. + */ +function get_screen_icon() { + _deprecated_function( __FUNCTION__, '3.8.0' ); + return ''; +} + +/** + * Deprecated dashboard widget controls. + * + * @since 2.5.0 + * @deprecated 3.8.0 + */ +function wp_dashboard_incoming_links_output() {} + +/** + * Deprecated dashboard secondary output. + * + * @deprecated 3.8.0 + */ +function wp_dashboard_secondary_output() {} + +/** + * Deprecated dashboard widget controls. + * + * @since 2.7.0 + * @deprecated 3.8.0 + */ +function wp_dashboard_incoming_links() {} + +/** + * Deprecated dashboard incoming links control. + * + * @deprecated 3.8.0 + */ +function wp_dashboard_incoming_links_control() {} + +/** + * Deprecated dashboard plugins control. + * + * @deprecated 3.8.0 + */ +function wp_dashboard_plugins() {} + +/** + * Deprecated dashboard primary control. + * + * @deprecated 3.8.0 + */ +function wp_dashboard_primary_control() {} + +/** + * Deprecated dashboard recent comments control. + * + * @deprecated 3.8.0 + */ +function wp_dashboard_recent_comments_control() {} + +/** + * Deprecated dashboard secondary section. + * + * @deprecated 3.8.0 + */ +function wp_dashboard_secondary() {} + +/** + * Deprecated dashboard secondary control. + * + * @deprecated 3.8.0 + */ +function wp_dashboard_secondary_control() {} + +/** + * Display plugins text for the WordPress news widget. + * + * @since 2.5.0 + * @deprecated 4.8.0 + * + * @param string $rss The RSS feed URL. + * @param array $args Array of arguments for this RSS feed. + */ +function wp_dashboard_plugins_output( $rss, $args = array() ) { + _deprecated_function( __FUNCTION__, '4.8.0' ); + + // Plugin feeds plus link to install them. + $popular = fetch_feed( $args['url']['popular'] ); + + if ( false === $plugin_slugs = get_transient( 'plugin_slugs' ) ) { + $plugin_slugs = array_keys( get_plugins() ); + set_transient( 'plugin_slugs', $plugin_slugs, DAY_IN_SECONDS ); + } + + echo '
          '; + + foreach ( array( $popular ) as $feed ) { + if ( is_wp_error( $feed ) || ! $feed->get_item_quantity() ) + continue; + + $items = $feed->get_items(0, 5); + + // Pick a random, non-installed plugin. + while ( true ) { + // Abort this foreach loop iteration if there's no plugins left of this type. + if ( 0 == count($items) ) + continue 2; + + $item_key = array_rand($items); + $item = $items[$item_key]; + + list($link, $frag) = explode( '#', $item->get_link() ); + + $link = esc_url($link); + if ( preg_match( '|/([^/]+?)/?$|', $link, $matches ) ) + $slug = $matches[1]; + else { + unset( $items[$item_key] ); + continue; + } + + // Is this random plugin's slug already installed? If so, try again. + reset( $plugin_slugs ); + foreach ( $plugin_slugs as $plugin_slug ) { + if ( $slug == substr( $plugin_slug, 0, strlen( $slug ) ) ) { + unset( $items[$item_key] ); + continue 2; + } + } + + // If we get to this point, then the random plugin isn't installed and we can stop the while(). + break; + } + + // Eliminate some common badly formed plugin descriptions. + while ( ( null !== $item_key = array_rand($items) ) && false !== strpos( $items[$item_key]->get_description(), 'Plugin Name:' ) ) + unset($items[$item_key]); + + if ( !isset($items[$item_key]) ) + continue; + + $raw_title = $item->get_title(); + + $ilink = wp_nonce_url('plugin-install.php?tab=plugin-information&plugin=' . $slug, 'install-plugin_' . $slug) . '&TB_iframe=true&width=600&height=800'; + echo '
        • ' . __( 'Popular Plugin' ) . ': ' . esc_html( $raw_title ) . + ' (' . __( 'Install' ) . ')
        • '; + + $feed->__destruct(); + unset( $feed ); + } + + echo '
        '; +} + +/** + * This was once used to move child posts to a new parent. + * + * @since 2.3.0 + * @deprecated 3.9.0 + * @access private + * + * @param int $old_ID + * @param int $new_ID + */ +function _relocate_children( $old_ID, $new_ID ) { + _deprecated_function( __FUNCTION__, '3.9.0' ); +} + +/** + * Add a top-level menu page in the 'objects' section. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.7.0 + * + * @deprecated 4.5.0 Use add_menu_page() + * @see add_menu_page() + * @global int $_wp_last_object_menu + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param string $icon_url The url to the icon to be used for this menu. + * @return string The resulting page's hook_suffix. + */ +function add_object_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '') { + _deprecated_function( __FUNCTION__, '4.5.0', 'add_menu_page()' ); + + global $_wp_last_object_menu; + + $_wp_last_object_menu++; + + return add_menu_page($page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $_wp_last_object_menu); +} + +/** + * Add a top-level menu page in the 'utility' section. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.7.0 + * + * @deprecated 4.5.0 Use add_menu_page() + * @see add_menu_page() + * @global int $_wp_last_utility_menu + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param string $icon_url The url to the icon to be used for this menu. + * @return string The resulting page's hook_suffix. + */ +function add_utility_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '') { + _deprecated_function( __FUNCTION__, '4.5.0', 'add_menu_page()' ); + + global $_wp_last_utility_menu; + + $_wp_last_utility_menu++; + + return add_menu_page($page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $_wp_last_utility_menu); +} + +/** + * Disables autocomplete on the 'post' form (Add/Edit Post screens) for WebKit browsers, + * as they disregard the autocomplete setting on the editor textarea. That can break the editor + * when the user navigates to it with the browser's Back button. See #28037 + * + * Replaced with wp_page_reload_on_back_button_js() that also fixes this problem. + * + * @since 4.0.0 + * @deprecated 4.6.0 + * + * @link https://core.trac.wordpress.org/ticket/35852 + * + * @global bool $is_safari + * @global bool $is_chrome + */ +function post_form_autocomplete_off() { + global $is_safari, $is_chrome; + + _deprecated_function( __FUNCTION__, '4.6.0' ); + + if ( $is_safari || $is_chrome ) { + echo ' autocomplete="off"'; + } +} + +/** + * Display JavaScript on the page. + * + * @since 3.5.0 + * @deprecated 4.9.0 + */ +function options_permalink_add_js() { + ?> + + '', + 1 => __( 'Item added.' ), + 2 => __( 'Item deleted.' ), + 3 => __( 'Item updated.' ), + 4 => __( 'Item not added.' ), + 5 => __( 'Item not updated.' ), + 6 => __( 'Items deleted.' ), +); + +$messages['category'] = array( + 0 => '', + 1 => __( 'Category added.' ), + 2 => __( 'Category deleted.' ), + 3 => __( 'Category updated.' ), + 4 => __( 'Category not added.' ), + 5 => __( 'Category not updated.' ), + 6 => __( 'Categories deleted.' ), +); + +$messages['post_tag'] = array( + 0 => '', + 1 => __( 'Tag added.' ), + 2 => __( 'Tag deleted.' ), + 3 => __( 'Tag updated.' ), + 4 => __( 'Tag not added.' ), + 5 => __( 'Tag not updated.' ), + 6 => __( 'Tags deleted.' ), +); + +/** + * Filters the messages displayed when a tag is updated. + * + * @since 3.7.0 + * + * @param array $messages The messages to be displayed. + */ +$messages = apply_filters( 'term_updated_messages', $messages ); + +$message = false; +if ( isset( $_REQUEST['message'] ) && (int) $_REQUEST['message'] ) { + $msg = (int) $_REQUEST['message']; + if ( isset( $messages[ $taxonomy ][ $msg ] ) ) { + $message = $messages[ $taxonomy ][ $msg ]; + } elseif ( ! isset( $messages[ $taxonomy ] ) && isset( $messages['_item'][ $msg ] ) ) { + $message = $messages['_item'][ $msg ]; + } +} diff --git a/wp-admin/includes/export.php b/wp-admin/includes/export.php new file mode 100644 index 0000000..057e59f --- /dev/null +++ b/wp-admin/includes/export.php @@ -0,0 +1,670 @@ + 'all', + 'author' => false, + 'category' => false, + 'start_date' => false, + 'end_date' => false, + 'status' => false, + ); + $args = wp_parse_args( $args, $defaults ); + + /** + * Fires at the beginning of an export, before any headers are sent. + * + * @since 2.3.0 + * + * @param array $args An array of export arguments. + */ + do_action( 'export_wp', $args ); + + $sitename = sanitize_key( get_bloginfo( 'name' ) ); + if ( ! empty( $sitename ) ) { + $sitename .= '.'; + } + $date = gmdate( 'Y-m-d' ); + $wp_filename = $sitename . 'WordPress.' . $date . '.xml'; + /** + * Filters the export filename. + * + * @since 4.4.0 + * + * @param string $wp_filename The name of the file for download. + * @param string $sitename The site name. + * @param string $date Today's date, formatted. + */ + $filename = apply_filters( 'export_wp_filename', $wp_filename, $sitename, $date ); + + header( 'Content-Description: File Transfer' ); + header( 'Content-Disposition: attachment; filename=' . $filename ); + header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true ); + + if ( 'all' != $args['content'] && post_type_exists( $args['content'] ) ) { + $ptype = get_post_type_object( $args['content'] ); + if ( ! $ptype->can_export ) { + $args['content'] = 'post'; + } + + $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] ); + } else { + $post_types = get_post_types( array( 'can_export' => true ) ); + $esses = array_fill( 0, count( $post_types ), '%s' ); + + // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare + $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types ); + } + + if ( $args['status'] && ( 'post' == $args['content'] || 'page' == $args['content'] ) ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] ); + } else { + $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'"; + } + + $join = ''; + if ( $args['category'] && 'post' == $args['content'] ) { + $term = term_exists( $args['category'], 'category' ); + if ( $term ) { + $join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)"; + $where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] ); + } + } + + if ( 'post' == $args['content'] || 'page' == $args['content'] || 'attachment' == $args['content'] ) { + if ( $args['author'] ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] ); + } + + if ( $args['start_date'] ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", gmdate( 'Y-m-d', strtotime( $args['start_date'] ) ) ); + } + + if ( $args['end_date'] ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", gmdate( 'Y-m-d', strtotime( '+1 month', strtotime( $args['end_date'] ) ) ) ); + } + } + + // Grab a snapshot of post IDs, just in case it changes during the export. + $post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" ); + + /* + * Get the requested terms ready, empty unless posts filtered by category + * or all content. + */ + $cats = array(); + $tags = array(); + $terms = array(); + if ( isset( $term ) && $term ) { + $cat = get_term( $term['term_id'], 'category' ); + $cats = array( $cat->term_id => $cat ); + unset( $term, $cat ); + } elseif ( 'all' == $args['content'] ) { + $categories = (array) get_categories( array( 'get' => 'all' ) ); + $tags = (array) get_tags( array( 'get' => 'all' ) ); + + $custom_taxonomies = get_taxonomies( array( '_builtin' => false ) ); + $custom_terms = (array) get_terms( + array( + 'taxonomy' => $custom_taxonomies, + 'get' => 'all', + ) + ); + + // Put categories in order with no child going before its parent. + while ( $cat = array_shift( $categories ) ) { + if ( 0 == $cat->parent || isset( $cats[ $cat->parent ] ) ) { + $cats[ $cat->term_id ] = $cat; + } else { + $categories[] = $cat; + } + } + + // Put terms in order with no child going before its parent. + while ( $t = array_shift( $custom_terms ) ) { + if ( 0 == $t->parent || isset( $terms[ $t->parent ] ) ) { + $terms[ $t->term_id ] = $t; + } else { + $custom_terms[] = $t; + } + } + + unset( $categories, $custom_taxonomies, $custom_terms ); + } + + /** + * Wrap given string in XML CDATA tag. + * + * @since 2.1.0 + * + * @param string $str String to wrap in XML CDATA tag. + * @return string + */ + function wxr_cdata( $str ) { + if ( ! seems_utf8( $str ) ) { + $str = utf8_encode( $str ); + } + // $str = ent2ncr(esc_html($str)); + $str = '', ']]]]>', $str ) . ']]>'; + + return $str; + } + + /** + * Return the URL of the site + * + * @since 2.5.0 + * + * @return string Site URL. + */ + function wxr_site_url() { + if ( is_multisite() ) { + // Multisite: the base URL. + return network_home_url(); + } else { + // WordPress (single site): the blog URL. + return get_bloginfo_rss( 'url' ); + } + } + + /** + * Output a cat_name XML tag from a given category object + * + * @since 2.1.0 + * + * @param object $category Category Object + */ + function wxr_cat_name( $category ) { + if ( empty( $category->name ) ) { + return; + } + + echo '' . wxr_cdata( $category->name ) . "\n"; + } + + /** + * Output a category_description XML tag from a given category object + * + * @since 2.1.0 + * + * @param object $category Category Object + */ + function wxr_category_description( $category ) { + if ( empty( $category->description ) ) { + return; + } + + echo '' . wxr_cdata( $category->description ) . "\n"; + } + + /** + * Output a tag_name XML tag from a given tag object + * + * @since 2.3.0 + * + * @param object $tag Tag Object + */ + function wxr_tag_name( $tag ) { + if ( empty( $tag->name ) ) { + return; + } + + echo '' . wxr_cdata( $tag->name ) . "\n"; + } + + /** + * Output a tag_description XML tag from a given tag object + * + * @since 2.3.0 + * + * @param object $tag Tag Object + */ + function wxr_tag_description( $tag ) { + if ( empty( $tag->description ) ) { + return; + } + + echo '' . wxr_cdata( $tag->description ) . "\n"; + } + + /** + * Output a term_name XML tag from a given term object + * + * @since 2.9.0 + * + * @param object $term Term Object + */ + function wxr_term_name( $term ) { + if ( empty( $term->name ) ) { + return; + } + + echo '' . wxr_cdata( $term->name ) . "\n"; + } + + /** + * Output a term_description XML tag from a given term object + * + * @since 2.9.0 + * + * @param object $term Term Object + */ + function wxr_term_description( $term ) { + if ( empty( $term->description ) ) { + return; + } + + echo "\t\t" . wxr_cdata( $term->description ) . "\n"; + } + + /** + * Output term meta XML tags for a given term object. + * + * @since 4.6.0 + * + * @param WP_Term $term Term object. + */ + function wxr_term_meta( $term ) { + global $wpdb; + + $termmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id ) ); + + foreach ( $termmeta as $meta ) { + /** + * Filters whether to selectively skip term meta used for WXR exports. + * + * Returning a truthy value to the filter will skip the current meta + * object from being exported. + * + * @since 4.6.0 + * + * @param bool $skip Whether to skip the current piece of term meta. Default false. + * @param string $meta_key Current meta key. + * @param object $meta Current meta object. + */ + if ( ! apply_filters( 'wxr_export_skip_termmeta', false, $meta->meta_key, $meta ) ) { + printf( "\t\t\n\t\t\t%s\n\t\t\t%s\n\t\t\n", wxr_cdata( $meta->meta_key ), wxr_cdata( $meta->meta_value ) ); + } + } + } + + /** + * Output list of authors with posts + * + * @since 3.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int[] $post_ids Optional. Array of post IDs to filter the query by. + */ + function wxr_authors_list( array $post_ids = null ) { + global $wpdb; + + if ( ! empty( $post_ids ) ) { + $post_ids = array_map( 'absint', $post_ids ); + $and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')'; + } else { + $and = ''; + } + + $authors = array(); + $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and" ); + foreach ( (array) $results as $result ) { + $authors[] = get_userdata( $result->post_author ); + } + + $authors = array_filter( $authors ); + + foreach ( $authors as $author ) { + echo "\t"; + echo '' . intval( $author->ID ) . ''; + echo '' . wxr_cdata( $author->user_login ) . ''; + echo '' . wxr_cdata( $author->user_email ) . ''; + echo '' . wxr_cdata( $author->display_name ) . ''; + echo '' . wxr_cdata( $author->first_name ) . ''; + echo '' . wxr_cdata( $author->last_name ) . ''; + echo "\n"; + } + } + + /** + * Output all navigation menu terms + * + * @since 3.1.0 + */ + function wxr_nav_menu_terms() { + $nav_menus = wp_get_nav_menus(); + if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) { + return; + } + + foreach ( $nav_menus as $menu ) { + echo "\t"; + echo '' . intval( $menu->term_id ) . ''; + echo 'nav_menu'; + echo '' . wxr_cdata( $menu->slug ) . ''; + wxr_term_name( $menu ); + echo "\n"; + } + } + + /** + * Output list of taxonomy terms, in XML tag format, associated with a post + * + * @since 2.3.0 + */ + function wxr_post_taxonomy() { + $post = get_post(); + + $taxonomies = get_object_taxonomies( $post->post_type ); + if ( empty( $taxonomies ) ) { + return; + } + $terms = wp_get_object_terms( $post->ID, $taxonomies ); + + foreach ( (array) $terms as $term ) { + echo "\t\ttaxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "\n"; + } + } + + /** + * @param bool $return_me + * @param string $meta_key + * @return bool + */ + function wxr_filter_postmeta( $return_me, $meta_key ) { + if ( '_edit_lock' == $meta_key ) { + $return_me = true; + } + return $return_me; + } + add_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 ); + + echo '\n"; + + ?> + + + + + + + + + + + + + + + + + + + + + + <?php bloginfo_rss( 'name' ); ?> + + + + + + + + + + + + + term_id ); ?> + slug ); ?> + parent ? $cats[ $c->parent ]->slug : '' ); ?> + + + + + + term_id ); ?> + slug ); ?> + + + + + + term_id ); ?> + taxonomy ); ?> + slug ); ?> + parent ? $terms[ $t->parent ]->slug : '' ); ?> + + + + + + + + in_the_loop = true; + + // Fetch 20 posts at a time rather than loading the entire table into memory. + while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) { + $where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')'; + $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" ); + + // Begin Loop. + foreach ( $posts as $post ) { + setup_postdata( $post ); + + /** This filter is documented in wp-includes/feed.php */ + $title = apply_filters( 'the_title_rss', $post->post_title ); + + /** + * Filters the post content used for WXR exports. + * + * @since 2.5.0 + * + * @param string $post_content Content of the current post. + */ + $content = wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) ); + + /** + * Filters the post excerpt used for WXR exports. + * + * @since 2.6.0 + * + * @param string $post_excerpt Excerpt for the current post. + */ + $excerpt = wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) ); + + $is_sticky = is_sticky( $post->ID ) ? 1 : 0; + ?> + + <?php echo $title; ?> + + + + + + + + ID ); ?> + post_date ); ?> + post_date_gmt ); ?> + comment_status ); ?> + ping_status ); ?> + post_name ); ?> + post_status ); ?> + post_parent ); ?> + menu_order ); ?> + post_type ); ?> + post_password ); ?> + + post_type ) : ?> + ID ) ); ?> + + + get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) ); + foreach ( $postmeta as $meta ) : + /** + * Filters whether to selectively skip post meta used for WXR exports. + * + * Returning a truthy value to the filter will skip the current meta + * object from being exported. + * + * @since 3.3.0 + * + * @param bool $skip Whether to skip the current post meta. Default false. + * @param string $meta_key Current meta key. + * @param object $meta Current meta object. + */ + if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) { + continue; + } + ?> + + meta_key ); ?> + meta_value ); ?> + + get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) ); + $comments = array_map( 'get_comment', $_comments ); + foreach ( $comments as $c ) : + ?> + + comment_ID ); ?> + comment_author ); ?> + comment_author_email ); ?> + comment_author_url ); ?> + comment_author_IP ); ?> + comment_date ); ?> + comment_date_gmt ); ?> + comment_content ); ?> + comment_approved ); ?> + comment_type ); ?> + comment_parent ); ?> + user_id ); ?> + get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) ); + foreach ( $c_meta as $meta ) : + /** + * Filters whether to selectively skip comment meta used for WXR exports. + * + * Returning a truthy value to the filter will skip the current meta + * object from being exported. + * + * @since 4.0.0 + * + * @param bool $skip Whether to skip the current comment meta. Default false. + * @param string $meta_key Current meta key. + * @param object $meta Current meta object. + */ + if ( apply_filters( 'wxr_export_skip_commentmeta', false, $meta->meta_key, $meta ) ) { + continue; + } + ?> + + meta_key ); ?> + meta_value ); ?> + + + + + + + + + __( 'Theme Functions' ), + 'header.php' => __( 'Theme Header' ), + 'footer.php' => __( 'Theme Footer' ), + 'sidebar.php' => __( 'Sidebar' ), + 'comments.php' => __( 'Comments' ), + 'searchform.php' => __( 'Search Form' ), + '404.php' => __( '404 Template' ), + 'link.php' => __( 'Links Template' ), + // Archives. + 'index.php' => __( 'Main Index Template' ), + 'archive.php' => __( 'Archives' ), + 'author.php' => __( 'Author Template' ), + 'taxonomy.php' => __( 'Taxonomy Template' ), + 'category.php' => __( 'Category Template' ), + 'tag.php' => __( 'Tag Template' ), + 'home.php' => __( 'Posts Page' ), + 'search.php' => __( 'Search Results' ), + 'date.php' => __( 'Date Template' ), + // Content. + 'singular.php' => __( 'Singular Template' ), + 'single.php' => __( 'Single Post' ), + 'page.php' => __( 'Single Page' ), + 'front-page.php' => __( 'Homepage' ), + 'privacy-policy.php' => __( 'Privacy Policy Page' ), + // Attachments. + 'attachment.php' => __( 'Attachment Template' ), + 'image.php' => __( 'Image Attachment Template' ), + 'video.php' => __( 'Video Attachment Template' ), + 'audio.php' => __( 'Audio Attachment Template' ), + 'application.php' => __( 'Application Attachment Template' ), + // Embeds. + 'embed.php' => __( 'Embed Template' ), + 'embed-404.php' => __( 'Embed 404 Template' ), + 'embed-content.php' => __( 'Embed Content Template' ), + 'header-embed.php' => __( 'Embed Header Template' ), + 'footer-embed.php' => __( 'Embed Footer Template' ), + // Stylesheets. + 'style.css' => __( 'Stylesheet' ), + 'editor-style.css' => __( 'Visual Editor Stylesheet' ), + 'editor-style-rtl.css' => __( 'Visual Editor RTL Stylesheet' ), + 'rtl.css' => __( 'RTL Stylesheet' ), + // Other. + 'my-hacks.php' => __( 'my-hacks.php (legacy hacks support)' ), + '.htaccess' => __( '.htaccess (for rewrite rules )' ), + // Deprecated files. + 'wp-layout.css' => __( 'Stylesheet' ), + 'wp-comments.php' => __( 'Comments Template' ), + 'wp-comments-popup.php' => __( 'Popup Comments Template' ), + 'comments-popup.php' => __( 'Popup Comments' ), +); + +/** + * Get the description for standard WordPress theme files and other various standard + * WordPress files + * + * @since 1.5.0 + * + * @global array $wp_file_descriptions Theme file descriptions. + * @global array $allowed_files List of allowed files. + * @param string $file Filesystem path or filename + * @return string Description of file from $wp_file_descriptions or basename of $file if description doesn't exist. + * Appends 'Page Template' to basename of $file if the file is a page template + */ +function get_file_description( $file ) { + global $wp_file_descriptions, $allowed_files; + + $dirname = pathinfo( $file, PATHINFO_DIRNAME ); + + $file_path = $allowed_files[ $file ]; + if ( isset( $wp_file_descriptions[ basename( $file ) ] ) && '.' === $dirname ) { + return $wp_file_descriptions[ basename( $file ) ]; + } elseif ( file_exists( $file_path ) && is_file( $file_path ) ) { + $template_data = implode( '', file( $file_path ) ); + if ( preg_match( '|Template Name:(.*)$|mi', $template_data, $name ) ) { + /* translators: %s: Template name. */ + return sprintf( __( '%s Page Template' ), _cleanup_header_comment( $name[1] ) ); + } + } + + return trim( basename( $file ) ); +} + +/** + * Get the absolute filesystem path to the root of the WordPress installation + * + * @since 1.5.0 + * + * @return string Full filesystem path to the root of the WordPress installation + */ +function get_home_path() { + $home = set_url_scheme( get_option( 'home' ), 'http' ); + $siteurl = set_url_scheme( get_option( 'siteurl' ), 'http' ); + if ( ! empty( $home ) && 0 !== strcasecmp( $home, $siteurl ) ) { + $wp_path_rel_to_home = str_ireplace( $home, '', $siteurl ); /* $siteurl - $home */ + $pos = strripos( str_replace( '\\', '/', $_SERVER['SCRIPT_FILENAME'] ), trailingslashit( $wp_path_rel_to_home ) ); + $home_path = substr( $_SERVER['SCRIPT_FILENAME'], 0, $pos ); + $home_path = trailingslashit( $home_path ); + } else { + $home_path = ABSPATH; + } + + return str_replace( '\\', '/', $home_path ); +} + +/** + * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep. + * The depth of the recursiveness can be controlled by the $levels param. + * + * @since 2.6.0 + * @since 4.9.0 Added the `$exclusions` parameter. + * + * @param string $folder Optional. Full path to folder. Default empty. + * @param int $levels Optional. Levels of folders to follow, Default 100 (PHP Loop limit). + * @param string[] $exclusions Optional. List of folders and files to skip. + * @return bool|string[] False on failure, else array of files. + */ +function list_files( $folder = '', $levels = 100, $exclusions = array() ) { + if ( empty( $folder ) ) { + return false; + } + + $folder = trailingslashit( $folder ); + + if ( ! $levels ) { + return false; + } + + $files = array(); + + $dir = @opendir( $folder ); + if ( $dir ) { + while ( ( $file = readdir( $dir ) ) !== false ) { + // Skip current and parent folder links. + if ( in_array( $file, array( '.', '..' ), true ) ) { + continue; + } + + // Skip hidden and excluded files. + if ( '.' === $file[0] || in_array( $file, $exclusions, true ) ) { + continue; + } + + if ( is_dir( $folder . $file ) ) { + $files2 = list_files( $folder . $file, $levels - 1 ); + if ( $files2 ) { + $files = array_merge( $files, $files2 ); + } else { + $files[] = $folder . $file . '/'; + } + } else { + $files[] = $folder . $file; + } + } + + closedir( $dir ); + } + + return $files; +} + +/** + * Get list of file extensions that are editable in plugins. + * + * @since 4.9.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return string[] Array of editable file extensions. + */ +function wp_get_plugin_file_editable_extensions( $plugin ) { + + $editable_extensions = array( + 'bash', + 'conf', + 'css', + 'diff', + 'htm', + 'html', + 'http', + 'inc', + 'include', + 'js', + 'json', + 'jsx', + 'less', + 'md', + 'patch', + 'php', + 'php3', + 'php4', + 'php5', + 'php7', + 'phps', + 'phtml', + 'sass', + 'scss', + 'sh', + 'sql', + 'svg', + 'text', + 'txt', + 'xml', + 'yaml', + 'yml', + ); + + /** + * Filters file type extensions editable in the plugin editor. + * + * @since 2.8.0 + * @since 4.9.0 Added the `$plugin` parameter. + * + * @param string[] $editable_extensions An array of editable plugin file extensions. + * @param string $plugin Path to the plugin file relative to the plugins directory. + */ + $editable_extensions = (array) apply_filters( 'editable_extensions', $editable_extensions, $plugin ); + + return $editable_extensions; +} + +/** + * Get list of file extensions that are editable for a given theme. + * + * @param WP_Theme $theme Theme object. + * @return string[] Array of editable file extensions. + */ +function wp_get_theme_file_editable_extensions( $theme ) { + + $default_types = array( + 'bash', + 'conf', + 'css', + 'diff', + 'htm', + 'html', + 'http', + 'inc', + 'include', + 'js', + 'json', + 'jsx', + 'less', + 'md', + 'patch', + 'php', + 'php3', + 'php4', + 'php5', + 'php7', + 'phps', + 'phtml', + 'sass', + 'scss', + 'sh', + 'sql', + 'svg', + 'text', + 'txt', + 'xml', + 'yaml', + 'yml', + ); + + /** + * Filters the list of file types allowed for editing in the Theme editor. + * + * @since 4.4.0 + * + * @param string[] $default_types List of allowed file types. + * @param WP_Theme $theme The current Theme object. + */ + $file_types = apply_filters( 'wp_theme_editor_filetypes', $default_types, $theme ); + + // Ensure that default types are still there. + return array_unique( array_merge( $file_types, $default_types ) ); +} + +/** + * Print file editor templates (for plugins and themes). + * + * @since 4.9.0 + */ +function wp_print_file_editor_templates() { + ?> + + exists() ) { + return new WP_Error( 'non_existent_theme', __( 'The requested theme does not exist.' ) ); + } + + if ( ! wp_verify_nonce( $args['nonce'], 'edit-theme_' . $stylesheet . '_' . $file ) ) { + return new WP_Error( 'nonce_failure' ); + } + + if ( $theme->errors() && 'theme_no_stylesheet' === $theme->errors()->get_error_code() ) { + return new WP_Error( + 'theme_no_stylesheet', + __( 'The requested theme does not exist.' ) . ' ' . $theme->errors()->get_error_message() + ); + } + + $editable_extensions = wp_get_theme_file_editable_extensions( $theme ); + + $allowed_files = array(); + foreach ( $editable_extensions as $type ) { + switch ( $type ) { + case 'php': + $allowed_files = array_merge( $allowed_files, $theme->get_files( 'php', -1 ) ); + break; + case 'css': + $style_files = $theme->get_files( 'css', -1 ); + $allowed_files['style.css'] = $style_files['style.css']; + $allowed_files = array_merge( $allowed_files, $style_files ); + break; + default: + $allowed_files = array_merge( $allowed_files, $theme->get_files( $type, -1 ) ); + break; + } + } + + // Compare based on relative paths. + if ( 0 !== validate_file( $file, array_keys( $allowed_files ) ) ) { + return new WP_Error( 'disallowed_theme_file', __( 'Sorry, that file cannot be edited.' ) ); + } + + $real_file = $theme->get_stylesheet_directory() . '/' . $file; + + $is_active = ( get_stylesheet() === $stylesheet || get_template() === $stylesheet ); + + } else { + return new WP_Error( 'missing_theme_or_plugin' ); + } + + // Ensure file is real. + if ( ! is_file( $real_file ) ) { + return new WP_Error( 'file_does_not_exist', __( 'File does not exist! Please double check the name and try again.' ) ); + } + + // Ensure file extension is allowed. + $extension = null; + if ( preg_match( '/\.([^.]+)$/', $real_file, $matches ) ) { + $extension = strtolower( $matches[1] ); + if ( ! in_array( $extension, $editable_extensions, true ) ) { + return new WP_Error( 'illegal_file_type', __( 'Files of this type are not editable.' ) ); + } + } + + $previous_content = file_get_contents( $real_file ); + + if ( ! is_writeable( $real_file ) ) { + return new WP_Error( 'file_not_writable' ); + } + + $f = fopen( $real_file, 'w+' ); + if ( false === $f ) { + return new WP_Error( 'file_not_writable' ); + } + + $written = fwrite( $f, $content ); + fclose( $f ); + if ( false === $written ) { + return new WP_Error( 'unable_to_write', __( 'Unable to write to file.' ) ); + } + if ( 'php' === $extension && function_exists( 'opcache_invalidate' ) ) { + opcache_invalidate( $real_file, true ); + } + + if ( $is_active && 'php' === $extension ) { + + $scrape_key = md5( rand() ); + $transient = 'scrape_key_' . $scrape_key; + $scrape_nonce = strval( rand() ); + // It shouldn't take more than 60 seconds to make the two loopback requests. + set_transient( $transient, $scrape_nonce, 60 ); + + $cookies = wp_unslash( $_COOKIE ); + $scrape_params = array( + 'wp_scrape_key' => $scrape_key, + 'wp_scrape_nonce' => $scrape_nonce, + ); + $headers = array( + 'Cache-Control' => 'no-cache', + ); + + /** This filter is documented in wp-includes/class-wp-http-streams.php */ + $sslverify = apply_filters( 'https_local_ssl_verify', false ); + + // Include Basic auth in loopback requests. + if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) { + $headers['Authorization'] = 'Basic ' . base64_encode( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) . ':' . wp_unslash( $_SERVER['PHP_AUTH_PW'] ) ); + } + + // Make sure PHP process doesn't die before loopback requests complete. + set_time_limit( 300 ); + + // Time to wait for loopback requests to finish. + $timeout = 100; + + $needle_start = "###### wp_scraping_result_start:$scrape_key ######"; + $needle_end = "###### wp_scraping_result_end:$scrape_key ######"; + + // Attempt loopback request to editor to see if user just whitescreened themselves. + if ( $plugin ) { + $url = add_query_arg( compact( 'plugin', 'file' ), admin_url( 'plugin-editor.php' ) ); + } elseif ( isset( $stylesheet ) ) { + $url = add_query_arg( + array( + 'theme' => $stylesheet, + 'file' => $file, + ), + admin_url( 'theme-editor.php' ) + ); + } else { + $url = admin_url(); + } + $url = add_query_arg( $scrape_params, $url ); + $r = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout', 'sslverify' ) ); + $body = wp_remote_retrieve_body( $r ); + $scrape_result_position = strpos( $body, $needle_start ); + + $loopback_request_failure = array( + 'code' => 'loopback_request_failed', + 'message' => __( 'Unable to communicate back with site to check for fatal errors, so the PHP change was reverted. You will need to upload your PHP file change by some other means, such as by using SFTP.' ), + ); + $json_parse_failure = array( + 'code' => 'json_parse_error', + ); + + $result = null; + if ( false === $scrape_result_position ) { + $result = $loopback_request_failure; + } else { + $error_output = substr( $body, $scrape_result_position + strlen( $needle_start ) ); + $error_output = substr( $error_output, 0, strpos( $error_output, $needle_end ) ); + $result = json_decode( trim( $error_output ), true ); + if ( empty( $result ) ) { + $result = $json_parse_failure; + } + } + + // Try making request to homepage as well to see if visitors have been whitescreened. + if ( true === $result ) { + $url = home_url( '/' ); + $url = add_query_arg( $scrape_params, $url ); + $r = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout' ) ); + $body = wp_remote_retrieve_body( $r ); + $scrape_result_position = strpos( $body, $needle_start ); + + if ( false === $scrape_result_position ) { + $result = $loopback_request_failure; + } else { + $error_output = substr( $body, $scrape_result_position + strlen( $needle_start ) ); + $error_output = substr( $error_output, 0, strpos( $error_output, $needle_end ) ); + $result = json_decode( trim( $error_output ), true ); + if ( empty( $result ) ) { + $result = $json_parse_failure; + } + } + } + + delete_transient( $transient ); + + if ( true !== $result ) { + + // Roll-back file change. + file_put_contents( $real_file, $previous_content ); + if ( function_exists( 'opcache_invalidate' ) ) { + opcache_invalidate( $real_file, true ); + } + + if ( ! isset( $result['message'] ) ) { + $message = __( 'Something went wrong.' ); + } else { + $message = $result['message']; + unset( $result['message'] ); + } + return new WP_Error( 'php_error', $message, $result ); + } + } + + if ( $theme instanceof WP_Theme ) { + $theme->cache_delete(); + } + + return true; +} + + +/** + * Returns a filename of a Temporary unique file. + * Please note that the calling function must unlink() this itself. + * + * The filename is based off the passed parameter or defaults to the current unix timestamp, + * while the directory can either be passed as well, or by leaving it blank, default to a writable temporary directory. + * + * @since 2.6.0 + * + * @param string $filename Optional. Filename to base the Unique file off. Default empty. + * @param string $dir Optional. Directory to store the file in. Default empty. + * @return string a writable filename + */ +function wp_tempnam( $filename = '', $dir = '' ) { + if ( empty( $dir ) ) { + $dir = get_temp_dir(); + } + + if ( empty( $filename ) || '.' == $filename || '/' == $filename || '\\' == $filename ) { + $filename = uniqid(); + } + + // Use the basename of the given file without the extension as the name for the temporary directory. + $temp_filename = basename( $filename ); + $temp_filename = preg_replace( '|\.[^.]*$|', '', $temp_filename ); + + // If the folder is falsey, use its parent directory name instead. + if ( ! $temp_filename ) { + return wp_tempnam( dirname( $filename ), $dir ); + } + + // Suffix some random data to avoid filename conflicts. + $temp_filename .= '-' . wp_generate_password( 6, false ); + $temp_filename .= '.tmp'; + $temp_filename = $dir . wp_unique_filename( $dir, $temp_filename ); + + $fp = @fopen( $temp_filename, 'x' ); + if ( ! $fp && is_writable( $dir ) && file_exists( $temp_filename ) ) { + return wp_tempnam( $filename, $dir ); + } + if ( $fp ) { + fclose( $fp ); + } + + return $temp_filename; +} + +/** + * Makes sure that the file that was requested to be edited is allowed to be edited. + * + * Function will die if you are not allowed to edit the file. + * + * @since 1.5.0 + * + * @param string $file File the user is attempting to edit. + * @param string[] $allowed_files Optional. Array of allowed files to edit. `$file` must match an entry exactly. + * @return string|void Returns the file name on success, dies on failure. + */ +function validate_file_to_edit( $file, $allowed_files = array() ) { + $code = validate_file( $file, $allowed_files ); + + if ( ! $code ) { + return $file; + } + + switch ( $code ) { + case 1: + wp_die( __( 'Sorry, that file cannot be edited.' ) ); + + // case 2 : + // wp_die( __('Sorry, can’t call files with their real path.' )); + + case 3: + wp_die( __( 'Sorry, that file cannot be edited.' ) ); + } +} + +/** + * Handle PHP uploads in WordPress, sanitizing file names, checking extensions for mime type, + * and moving the file to the appropriate directory within the uploads directory. + * + * @access private + * @since 4.0.0 + * + * @see wp_handle_upload_error + * + * @param string[] $file Reference to a single element of `$_FILES`. Call the function once for each uploaded file. + * @param string[]|false $overrides An associative array of names => values to override default variables. Default false. + * @param string $time Time formatted in 'yyyy/mm'. + * @param string $action Expected value for `$_POST['action']`. + * @return string[] On success, returns an associative array of file attributes. On failure, returns + * `$overrides['upload_error_handler']( &$file, $message )` or `array( 'error' => $message )`. + */ +function _wp_handle_upload( &$file, $overrides, $time, $action ) { + // The default error handler. + if ( ! function_exists( 'wp_handle_upload_error' ) ) { + function wp_handle_upload_error( &$file, $message ) { + return array( 'error' => $message ); + } + } + + /** + * Filters the data for a file before it is uploaded to WordPress. + * + * The dynamic portion of the hook name, `$action`, refers to the post action. + * + * @since 2.9.0 as 'wp_handle_upload_prefilter'. + * @since 4.0.0 Converted to a dynamic hook with `$action`. + * + * @param string[] $file An array of data for a single file. + */ + $file = apply_filters( "{$action}_prefilter", $file ); + + // You may define your own function and pass the name in $overrides['upload_error_handler']. + $upload_error_handler = 'wp_handle_upload_error'; + if ( isset( $overrides['upload_error_handler'] ) ) { + $upload_error_handler = $overrides['upload_error_handler']; + } + + // You may have had one or more 'wp_handle_upload_prefilter' functions error out the file. Handle that gracefully. + if ( isset( $file['error'] ) && ! is_numeric( $file['error'] ) && $file['error'] ) { + return call_user_func_array( $upload_error_handler, array( &$file, $file['error'] ) ); + } + + // Install user overrides. Did we mention that this voids your warranty? + + // You may define your own function and pass the name in $overrides['unique_filename_callback']. + $unique_filename_callback = null; + if ( isset( $overrides['unique_filename_callback'] ) ) { + $unique_filename_callback = $overrides['unique_filename_callback']; + } + + /* + * This may not have originally been intended to be overridable, + * but historically has been. + */ + if ( isset( $overrides['upload_error_strings'] ) ) { + $upload_error_strings = $overrides['upload_error_strings']; + } else { + // Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error']. + $upload_error_strings = array( + false, + sprintf( + /* translators: 1: upload_max_filesize, 2: php.ini */ + __( 'The uploaded file exceeds the %1$s directive in %2$s.' ), + 'upload_max_filesize', + 'php.ini' + ), + sprintf( + /* translators: %s: MAX_FILE_SIZE */ + __( 'The uploaded file exceeds the %s directive that was specified in the HTML form.' ), + 'MAX_FILE_SIZE' + ), + __( 'The uploaded file was only partially uploaded.' ), + __( 'No file was uploaded.' ), + '', + __( 'Missing a temporary folder.' ), + __( 'Failed to write file to disk.' ), + __( 'File upload stopped by extension.' ), + ); + } + + // All tests are on by default. Most can be turned off by $overrides[{test_name}] = false; + $test_form = isset( $overrides['test_form'] ) ? $overrides['test_form'] : true; + $test_size = isset( $overrides['test_size'] ) ? $overrides['test_size'] : true; + + // If you override this, you must provide $ext and $type!! + $test_type = isset( $overrides['test_type'] ) ? $overrides['test_type'] : true; + $mimes = isset( $overrides['mimes'] ) ? $overrides['mimes'] : false; + + // A correct form post will pass this test. + if ( $test_form && ( ! isset( $_POST['action'] ) || ( $_POST['action'] != $action ) ) ) { + return call_user_func_array( $upload_error_handler, array( &$file, __( 'Invalid form submission.' ) ) ); + } + // A successful upload will pass this test. It makes no sense to override this one. + if ( isset( $file['error'] ) && $file['error'] > 0 ) { + return call_user_func_array( $upload_error_handler, array( &$file, $upload_error_strings[ $file['error'] ] ) ); + } + + // A properly uploaded file will pass this test. There should be no reason to override this one. + $test_uploaded_file = 'wp_handle_upload' === $action ? is_uploaded_file( $file['tmp_name'] ) : @is_readable( $file['tmp_name'] ); + if ( ! $test_uploaded_file ) { + return call_user_func_array( $upload_error_handler, array( &$file, __( 'Specified file failed upload test.' ) ) ); + } + + $test_file_size = 'wp_handle_upload' === $action ? $file['size'] : filesize( $file['tmp_name'] ); + // A non-empty file will pass this test. + if ( $test_size && ! ( $test_file_size > 0 ) ) { + if ( is_multisite() ) { + $error_msg = __( 'File is empty. Please upload something more substantial.' ); + } else { + $error_msg = sprintf( + /* translators: 1: php.ini, 2: post_max_size, 3: upload_max_filesize */ + __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your %1$s file or by %2$s being defined as smaller than %3$s in %1$s.' ), + 'php.ini', + 'post_max_size', + 'upload_max_filesize' + ); + } + return call_user_func_array( $upload_error_handler, array( &$file, $error_msg ) ); + } + + // A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter. + if ( $test_type ) { + $wp_filetype = wp_check_filetype_and_ext( $file['tmp_name'], $file['name'], $mimes ); + $ext = empty( $wp_filetype['ext'] ) ? '' : $wp_filetype['ext']; + $type = empty( $wp_filetype['type'] ) ? '' : $wp_filetype['type']; + $proper_filename = empty( $wp_filetype['proper_filename'] ) ? '' : $wp_filetype['proper_filename']; + + // Check to see if wp_check_filetype_and_ext() determined the filename was incorrect. + if ( $proper_filename ) { + $file['name'] = $proper_filename; + } + if ( ( ! $type || ! $ext ) && ! current_user_can( 'unfiltered_upload' ) ) { + return call_user_func_array( $upload_error_handler, array( &$file, __( 'Sorry, this file type is not permitted for security reasons.' ) ) ); + } + if ( ! $type ) { + $type = $file['type']; + } + } else { + $type = ''; + } + + /* + * A writable uploads dir will pass this test. Again, there's no point + * overriding this one. + */ + $uploads = wp_upload_dir( $time ); + if ( ! ( $uploads && false === $uploads['error'] ) ) { + return call_user_func_array( $upload_error_handler, array( &$file, $uploads['error'] ) ); + } + + $filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback ); + + // Move the file to the uploads dir. + $new_file = $uploads['path'] . "/$filename"; + + /** + * Filters whether to short-circuit moving the uploaded file after passing all checks. + * + * If a non-null value is passed to the filter, moving the file and any related error + * reporting will be completely skipped. + * + * @since 4.9.0 + * + * @param mixed $move_new_file If null (default) move the file after the upload. + * @param string[] $file An array of data for a single file. + * @param string $new_file Filename of the newly-uploaded file. + * @param string $type File type. + */ + $move_new_file = apply_filters( 'pre_move_uploaded_file', null, $file, $new_file, $type ); + + if ( null === $move_new_file ) { + if ( 'wp_handle_upload' === $action ) { + $move_new_file = @move_uploaded_file( $file['tmp_name'], $new_file ); + } else { + // Use copy and unlink because rename breaks streams. + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + $move_new_file = @copy( $file['tmp_name'], $new_file ); + unlink( $file['tmp_name'] ); + } + + if ( false === $move_new_file ) { + if ( 0 === strpos( $uploads['basedir'], ABSPATH ) ) { + $error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . $uploads['subdir']; + } else { + $error_path = basename( $uploads['basedir'] ) . $uploads['subdir']; + } + return $upload_error_handler( + $file, + sprintf( + /* translators: %s: Destination file path. */ + __( 'The uploaded file could not be moved to %s.' ), + $error_path + ) + ); + } + } + + // Set correct file permissions. + $stat = stat( dirname( $new_file ) ); + $perms = $stat['mode'] & 0000666; + chmod( $new_file, $perms ); + + // Compute the URL. + $url = $uploads['url'] . "/$filename"; + + if ( is_multisite() ) { + delete_transient( 'dirsize_cache' ); + } + + /** + * Filters the data array for the uploaded file. + * + * @since 2.1.0 + * + * @param array $upload { + * Array of upload data. + * + * @type string $file Filename of the newly-uploaded file. + * @type string $url URL of the uploaded file. + * @type string $type File type. + * } + * @param string $context The type of upload action. Values include 'upload' or 'sideload'. + */ + return apply_filters( + 'wp_handle_upload', + array( + 'file' => $new_file, + 'url' => $url, + 'type' => $type, + ), + 'wp_handle_sideload' === $action ? 'sideload' : 'upload' + ); +} + +/** + * Wrapper for _wp_handle_upload(). + * + * Passes the {@see 'wp_handle_upload'} action. + * + * @since 2.0.0 + * + * @see _wp_handle_upload() + * + * @param array $file Reference to a single element of `$_FILES`. Call the function once for + * each uploaded file. + * @param array|bool $overrides Optional. An associative array of names=>values to override default + * variables. Default false. + * @param string $time Optional. Time formatted in 'yyyy/mm'. Default null. + * @return array On success, returns an associative array of file attributes. On failure, returns + * $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ). + */ +function wp_handle_upload( &$file, $overrides = false, $time = null ) { + /* + * $_POST['action'] must be set and its value must equal $overrides['action'] + * or this: + */ + $action = 'wp_handle_upload'; + if ( isset( $overrides['action'] ) ) { + $action = $overrides['action']; + } + + return _wp_handle_upload( $file, $overrides, $time, $action ); +} + +/** + * Wrapper for _wp_handle_upload(). + * + * Passes the {@see 'wp_handle_sideload'} action. + * + * @since 2.6.0 + * + * @see _wp_handle_upload() + * + * @param array $file An array similar to that of a PHP `$_FILES` POST array + * @param array|bool $overrides Optional. An associative array of names=>values to override default + * variables. Default false. + * @param string $time Optional. Time formatted in 'yyyy/mm'. Default null. + * @return array On success, returns an associative array of file attributes. On failure, returns + * $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ). + */ +function wp_handle_sideload( &$file, $overrides = false, $time = null ) { + /* + * $_POST['action'] must be set and its value must equal $overrides['action'] + * or this: + */ + $action = 'wp_handle_sideload'; + if ( isset( $overrides['action'] ) ) { + $action = $overrides['action']; + } + return _wp_handle_upload( $file, $overrides, $time, $action ); +} + +/** + * Downloads a URL to a local temporary file using the WordPress HTTP API. + * + * Please note that the calling function must unlink() the file. + * + * @since 2.5.0 + * @since 5.2.0 Signature Verification with SoftFail was added. + * + * @param string $url The URL of the file to download. + * @param int $timeout The timeout for the request to download the file. Default 300 seconds. + * @param bool $signature_verification Whether to perform Signature Verification. Default false. + * @return string|WP_Error Filename on success, WP_Error on failure. + */ +function download_url( $url, $timeout = 300, $signature_verification = false ) { + // WARNING: The file is not automatically deleted, the script must unlink() the file. + if ( ! $url ) { + return new WP_Error( 'http_no_url', __( 'Invalid URL Provided.' ) ); + } + + $url_filename = basename( parse_url( $url, PHP_URL_PATH ) ); + + $tmpfname = wp_tempnam( $url_filename ); + if ( ! $tmpfname ) { + return new WP_Error( 'http_no_file', __( 'Could not create Temporary file.' ) ); + } + + $response = wp_safe_remote_get( + $url, + array( + 'timeout' => $timeout, + 'stream' => true, + 'filename' => $tmpfname, + ) + ); + + if ( is_wp_error( $response ) ) { + unlink( $tmpfname ); + return $response; + } + + $response_code = wp_remote_retrieve_response_code( $response ); + + if ( 200 != $response_code ) { + $data = array( + 'code' => $response_code, + ); + + // Retrieve a sample of the response body for debugging purposes. + $tmpf = fopen( $tmpfname, 'rb' ); + if ( $tmpf ) { + /** + * Filters the maximum error response body size in `download_url()`. + * + * @since 5.1.0 + * + * @see download_url() + * + * @param int $size The maximum error response body size. Default 1 KB. + */ + $response_size = apply_filters( 'download_url_error_max_body_size', KB_IN_BYTES ); + $data['body'] = fread( $tmpf, $response_size ); + fclose( $tmpf ); + } + + unlink( $tmpfname ); + return new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ), $data ); + } + + $content_md5 = wp_remote_retrieve_header( $response, 'content-md5' ); + if ( $content_md5 ) { + $md5_check = verify_file_md5( $tmpfname, $content_md5 ); + if ( is_wp_error( $md5_check ) ) { + unlink( $tmpfname ); + return $md5_check; + } + } + + // If the caller expects signature verification to occur, check to see if this URL supports it. + if ( $signature_verification ) { + /** + * Filters the list of hosts which should have Signature Verification attempted on. + * + * @since 5.2.0 + * + * @param string[] $hostnames List of hostnames. + */ + $signed_hostnames = apply_filters( 'wp_signature_hosts', array( 'wordpress.org', 'downloads.wordpress.org', 's.w.org' ) ); + $signature_verification = in_array( parse_url( $url, PHP_URL_HOST ), $signed_hostnames, true ); + } + + // Perform signature valiation if supported. + if ( $signature_verification ) { + $signature = wp_remote_retrieve_header( $response, 'x-content-signature' ); + if ( ! $signature ) { + // Retrieve signatures from a file if the header wasn't included. + // WordPress.org stores signatures at $package_url.sig. + + $signature_url = false; + $url_path = parse_url( $url, PHP_URL_PATH ); + if ( substr( $url_path, -4 ) == '.zip' || substr( $url_path, -7 ) == '.tar.gz' ) { + $signature_url = str_replace( $url_path, $url_path . '.sig', $url ); + } + + /** + * Filter the URL where the signature for a file is located. + * + * @since 5.2.0 + * + * @param false|string $signature_url The URL where signatures can be found for a file, or false if none are known. + * @param string $url The URL being verified. + */ + $signature_url = apply_filters( 'wp_signature_url', $signature_url, $url ); + + if ( $signature_url ) { + $signature_request = wp_safe_remote_get( + $signature_url, + array( + 'limit_response_size' => 10 * KB_IN_BYTES, // 10KB should be large enough for quite a few signatures. + ) + ); + + if ( ! is_wp_error( $signature_request ) && 200 === wp_remote_retrieve_response_code( $signature_request ) ) { + $signature = explode( "\n", wp_remote_retrieve_body( $signature_request ) ); + } + } + } + + // Perform the checks. + $signature_verification = verify_file_signature( $tmpfname, $signature, basename( parse_url( $url, PHP_URL_PATH ) ) ); + } + + if ( is_wp_error( $signature_verification ) ) { + if ( + /** + * Filters whether Signature Verification failures should be allowed to soft fail. + * + * WARNING: This may be removed from a future release. + * + * @since 5.2.0 + * + * @param bool $signature_softfail If a softfail is allowed. + * @param string $url The url being accessed. + */ + apply_filters( 'wp_signature_softfail', true, $url ) + ) { + $signature_verification->add_data( $tmpfname, 'softfail-filename' ); + } else { + // Hard-fail. + unlink( $tmpfname ); + } + + return $signature_verification; + } + + return $tmpfname; +} + +/** + * Calculates and compares the MD5 of a file to its expected value. + * + * @since 3.7.0 + * + * @param string $filename The filename to check the MD5 of. + * @param string $expected_md5 The expected MD5 of the file, either a base64-encoded raw md5, + * or a hex-encoded md5. + * @return bool|WP_Error True on success, false when the MD5 format is unknown/unexpected, + * WP_Error on failure. + */ +function verify_file_md5( $filename, $expected_md5 ) { + if ( 32 == strlen( $expected_md5 ) ) { + $expected_raw_md5 = pack( 'H*', $expected_md5 ); + } elseif ( 24 == strlen( $expected_md5 ) ) { + $expected_raw_md5 = base64_decode( $expected_md5 ); + } else { + return false; // Unknown format. + } + + $file_md5 = md5_file( $filename, true ); + + if ( $file_md5 === $expected_raw_md5 ) { + return true; + } + + return new WP_Error( + 'md5_mismatch', + sprintf( + /* translators: 1: File checksum, 2: Expected checksum value. */ + __( 'The checksum of the file (%1$s) does not match the expected checksum value (%2$s).' ), + bin2hex( $file_md5 ), + bin2hex( $expected_raw_md5 ) + ) + ); +} + +/** + * Verifies the contents of a file against its ED25519 signature. + * + * @since 5.2.0 + * + * @param string $filename The file to validate. + * @param string|array $signatures A Signature provided for the file. + * @param string $filename_for_errors A friendly filename for errors. Optional. + * @return bool|WP_Error True on success, false if verification not attempted, + * or WP_Error describing an error condition. + */ +function verify_file_signature( $filename, $signatures, $filename_for_errors = false ) { + if ( ! $filename_for_errors ) { + $filename_for_errors = wp_basename( $filename ); + } + + // Check we can process signatures. + if ( ! function_exists( 'sodium_crypto_sign_verify_detached' ) || ! in_array( 'sha384', array_map( 'strtolower', hash_algos() ) ) ) { + return new WP_Error( + 'signature_verification_unsupported', + sprintf( + /* translators: %s: The filename of the package. */ + __( 'The authenticity of %s could not be verified as signature verification is unavailable on this system.' ), + '' . esc_html( $filename_for_errors ) . '' + ), + ( ! function_exists( 'sodium_crypto_sign_verify_detached' ) ? 'sodium_crypto_sign_verify_detached' : 'sha384' ) + ); + } + + // Check for a edge-case affecting PHP Maths abilities. + if ( + ! extension_loaded( 'sodium' ) && + in_array( PHP_VERSION_ID, array( 70200, 70201, 70202 ), true ) && + extension_loaded( 'opcache' ) + ) { + // Sodium_Compat isn't compatible with PHP 7.2.0~7.2.2 due to a bug in the PHP Opcache extension, bail early as it'll fail. + // https://bugs.php.net/bug.php?id=75938 + + return new WP_Error( + 'signature_verification_unsupported', + sprintf( + /* translators: %s: The filename of the package. */ + __( 'The authenticity of %s could not be verified as signature verification is unavailable on this system.' ), + '' . esc_html( $filename_for_errors ) . '' + ), + array( + 'php' => phpversion(), + // phpcs:ignore PHPCompatibility.Constants.NewConstants.sodium_library_versionFound + 'sodium' => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ), + ) + ); + + } + + // Verify runtime speed of Sodium_Compat is acceptable. + if ( ! extension_loaded( 'sodium' ) && ! ParagonIE_Sodium_Compat::polyfill_is_fast() ) { + $sodium_compat_is_fast = false; + + // Allow for an old version of Sodium_Compat being loaded before the bundled WordPress one. + if ( method_exists( 'ParagonIE_Sodium_Compat', 'runtime_speed_test' ) ) { + // Run `ParagonIE_Sodium_Compat::runtime_speed_test()` in optimized integer mode, as that's what WordPress utilises during signing verifications. + // phpcs:disable WordPress.NamingConventions.ValidVariableName + $old_fastMult = ParagonIE_Sodium_Compat::$fastMult; + ParagonIE_Sodium_Compat::$fastMult = true; + $sodium_compat_is_fast = ParagonIE_Sodium_Compat::runtime_speed_test( 100, 10 ); + ParagonIE_Sodium_Compat::$fastMult = $old_fastMult; + // phpcs:enable + } + + // This cannot be performed in a reasonable amount of time. + // https://github.com/paragonie/sodium_compat#help-sodium_compat-is-slow-how-can-i-make-it-fast + if ( ! $sodium_compat_is_fast ) { + return new WP_Error( + 'signature_verification_unsupported', + sprintf( + /* translators: %s: The filename of the package. */ + __( 'The authenticity of %s could not be verified as signature verification is unavailable on this system.' ), + '' . esc_html( $filename_for_errors ) . '' + ), + array( + 'php' => phpversion(), + // phpcs:ignore PHPCompatibility.Constants.NewConstants.sodium_library_versionFound + 'sodium' => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ), + 'polyfill_is_fast' => false, + 'max_execution_time' => ini_get( 'max_execution_time' ), + ) + ); + } + } + + if ( ! $signatures ) { + return new WP_Error( + 'signature_verification_no_signature', + sprintf( + /* translators: %s: The filename of the package. */ + __( 'The authenticity of %s could not be verified as no signature was found.' ), + '' . esc_html( $filename_for_errors ) . '' + ), + array( + 'filename' => $filename_for_errors, + ) + ); + } + + $trusted_keys = wp_trusted_keys(); + $file_hash = hash_file( 'sha384', $filename, true ); + + mbstring_binary_safe_encoding(); + + $skipped_key = 0; + $skipped_signature = 0; + + foreach ( (array) $signatures as $signature ) { + $signature_raw = base64_decode( $signature ); + + // Ensure only valid-length signatures are considered. + if ( SODIUM_CRYPTO_SIGN_BYTES !== strlen( $signature_raw ) ) { + $skipped_signature++; + continue; + } + + foreach ( (array) $trusted_keys as $key ) { + $key_raw = base64_decode( $key ); + + // Only pass valid public keys through. + if ( SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES !== strlen( $key_raw ) ) { + $skipped_key++; + continue; + } + + if ( sodium_crypto_sign_verify_detached( $signature_raw, $file_hash, $key_raw ) ) { + reset_mbstring_encoding(); + return true; + } + } + } + + reset_mbstring_encoding(); + + return new WP_Error( + 'signature_verification_failed', + sprintf( + /* translators: %s: The filename of the package. */ + __( 'The authenticity of %s could not be verified.' ), + '' . esc_html( $filename_for_errors ) . '' + ), + // Error data helpful for debugging: + array( + 'filename' => $filename_for_errors, + 'keys' => $trusted_keys, + 'signatures' => $signatures, + 'hash' => bin2hex( $file_hash ), + 'skipped_key' => $skipped_key, + 'skipped_sig' => $skipped_signature, + 'php' => phpversion(), + // phpcs:ignore PHPCompatibility.Constants.NewConstants.sodium_library_versionFound + 'sodium' => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ), + ) + ); +} + +/** + * Retrieve the list of signing keys trusted by WordPress. + * + * @since 5.2.0 + * + * @return string[] Array of base64-encoded signing keys. + */ +function wp_trusted_keys() { + $trusted_keys = array(); + + if ( time() < 1617235200 ) { + // WordPress.org Key #1 - This key is only valid before April 1st, 2021. + $trusted_keys[] = 'fRPyrxb/MvVLbdsYi+OOEv4xc+Eqpsj+kkAS6gNOkI0='; + } + + // TODO: Add key #2 with longer expiration. + + /** + * Filter the valid signing keys used to verify the contents of files. + * + * @since 5.2.0 + * + * @param string[] $trusted_keys The trusted keys that may sign packages. + */ + return apply_filters( 'wp_trusted_keys', $trusted_keys ); +} + +/** + * Unzips a specified ZIP file to a location on the filesystem via the WordPress + * Filesystem Abstraction. + * + * Assumes that WP_Filesystem() has already been called and set up. Does not extract + * a root-level __MACOSX directory, if present. + * + * Attempts to increase the PHP memory limit to 256M before uncompressing. However, + * the most memory required shouldn't be much larger than the archive itself. + * + * @since 2.5.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $file Full path and filename of ZIP archive. + * @param string $to Full path on the filesystem to extract archive to. + * @return true|WP_Error True on success, WP_Error on failure. + */ +function unzip_file( $file, $to ) { + global $wp_filesystem; + + if ( ! $wp_filesystem || ! is_object( $wp_filesystem ) ) { + return new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) ); + } + + // Unzip can use a lot of memory, but not this much hopefully. + wp_raise_memory_limit( 'admin' ); + + $needed_dirs = array(); + $to = trailingslashit( $to ); + + // Determine any parent directories needed (of the upgrade directory). + if ( ! $wp_filesystem->is_dir( $to ) ) { // Only do parents if no children exist. + $path = preg_split( '![/\\\]!', untrailingslashit( $to ) ); + for ( $i = count( $path ); $i >= 0; $i-- ) { + if ( empty( $path[ $i ] ) ) { + continue; + } + + $dir = implode( '/', array_slice( $path, 0, $i + 1 ) ); + if ( preg_match( '!^[a-z]:$!i', $dir ) ) { // Skip it if it looks like a Windows Drive letter. + continue; + } + + if ( ! $wp_filesystem->is_dir( $dir ) ) { + $needed_dirs[] = $dir; + } else { + break; // A folder exists, therefore we don't need to check the levels below this. + } + } + } + + /** + * Filters whether to use ZipArchive to unzip archives. + * + * @since 3.0.0 + * + * @param bool $ziparchive Whether to use ZipArchive. Default true. + */ + if ( class_exists( 'ZipArchive', false ) && apply_filters( 'unzip_file_use_ziparchive', true ) ) { + $result = _unzip_file_ziparchive( $file, $to, $needed_dirs ); + if ( true === $result ) { + return $result; + } elseif ( is_wp_error( $result ) ) { + if ( 'incompatible_archive' != $result->get_error_code() ) { + return $result; + } + } + } + // Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file. + return _unzip_file_pclzip( $file, $to, $needed_dirs ); +} + +/** + * Attempts to unzip an archive using the ZipArchive class. + * + * This function should not be called directly, use `unzip_file()` instead. + * + * Assumes that WP_Filesystem() has already been called and set up. + * + * @since 3.0.0 + * @see unzip_file() + * @access private + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $file Full path and filename of ZIP archive. + * @param string $to Full path on the filesystem to extract archive to. + * @param string[] $needed_dirs A partial list of required folders needed to be created. + * @return true|WP_Error True on success, WP_Error on failure. + */ +function _unzip_file_ziparchive( $file, $to, $needed_dirs = array() ) { + global $wp_filesystem; + + $z = new ZipArchive(); + + $zopen = $z->open( $file, ZIPARCHIVE::CHECKCONS ); + if ( true !== $zopen ) { + return new WP_Error( 'incompatible_archive', __( 'Incompatible Archive.' ), array( 'ziparchive_error' => $zopen ) ); + } + + $uncompressed_size = 0; + + for ( $i = 0; $i < $z->numFiles; $i++ ) { + $info = $z->statIndex( $i ); + if ( ! $info ) { + return new WP_Error( 'stat_failed_ziparchive', __( 'Could not retrieve file from archive.' ) ); + } + + if ( '__MACOSX/' === substr( $info['name'], 0, 9 ) ) { // Skip the OS X-created __MACOSX directory. + continue; + } + + // Don't extract invalid files: + if ( 0 !== validate_file( $info['name'] ) ) { + continue; + } + + $uncompressed_size += $info['size']; + + $dirname = dirname( $info['name'] ); + + if ( '/' === substr( $info['name'], -1 ) ) { + // Directory. + $needed_dirs[] = $to . untrailingslashit( $info['name'] ); + } elseif ( '.' !== $dirname ) { + // Path to a file. + $needed_dirs[] = $to . untrailingslashit( $dirname ); + } + } + + /* + * disk_free_space() could return false. Assume that any falsey value is an error. + * A disk that has zero free bytes has bigger problems. + * Require we have enough space to unzip the file and copy its contents, with a 10% buffer. + */ + if ( wp_doing_cron() ) { + $available_space = @disk_free_space( WP_CONTENT_DIR ); + if ( $available_space && ( $uncompressed_size * 2.1 ) > $available_space ) { + return new WP_Error( 'disk_full_unzip_file', __( 'Could not copy files. You may have run out of disk space.' ), compact( 'uncompressed_size', 'available_space' ) ); + } + } + + $needed_dirs = array_unique( $needed_dirs ); + foreach ( $needed_dirs as $dir ) { + // Check the parent folders of the folders all exist within the creation array. + if ( untrailingslashit( $to ) == $dir ) { // Skip over the working directory, we know this exists (or will exist). + continue; + } + if ( strpos( $dir, $to ) === false ) { // If the directory is not within the working directory, skip it. + continue; + } + + $parent_folder = dirname( $dir ); + while ( ! empty( $parent_folder ) && untrailingslashit( $to ) != $parent_folder && ! in_array( $parent_folder, $needed_dirs ) ) { + $needed_dirs[] = $parent_folder; + $parent_folder = dirname( $parent_folder ); + } + } + asort( $needed_dirs ); + + // Create those directories if need be: + foreach ( $needed_dirs as $_dir ) { + // Only check to see if the Dir exists upon creation failure. Less I/O this way. + if ( ! $wp_filesystem->mkdir( $_dir, FS_CHMOD_DIR ) && ! $wp_filesystem->is_dir( $_dir ) ) { + return new WP_Error( 'mkdir_failed_ziparchive', __( 'Could not create directory.' ), substr( $_dir, strlen( $to ) ) ); + } + } + unset( $needed_dirs ); + + for ( $i = 0; $i < $z->numFiles; $i++ ) { + $info = $z->statIndex( $i ); + if ( ! $info ) { + return new WP_Error( 'stat_failed_ziparchive', __( 'Could not retrieve file from archive.' ) ); + } + + if ( '/' == substr( $info['name'], -1 ) ) { // Directory. + continue; + } + + if ( '__MACOSX/' === substr( $info['name'], 0, 9 ) ) { // Don't extract the OS X-created __MACOSX directory files. + continue; + } + + // Don't extract invalid files: + if ( 0 !== validate_file( $info['name'] ) ) { + continue; + } + + $contents = $z->getFromIndex( $i ); + if ( false === $contents ) { + return new WP_Error( 'extract_failed_ziparchive', __( 'Could not extract file from archive.' ), $info['name'] ); + } + + if ( ! $wp_filesystem->put_contents( $to . $info['name'], $contents, FS_CHMOD_FILE ) ) { + return new WP_Error( 'copy_failed_ziparchive', __( 'Could not copy file.' ), $info['name'] ); + } + } + + $z->close(); + + return true; +} + +/** + * Attempts to unzip an archive using the PclZip library. + * + * This function should not be called directly, use `unzip_file()` instead. + * + * Assumes that WP_Filesystem() has already been called and set up. + * + * @since 3.0.0 + * @see unzip_file() + * @access private + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $file Full path and filename of ZIP archive. + * @param string $to Full path on the filesystem to extract archive to. + * @param string[] $needed_dirs A partial list of required folders needed to be created. + * @return true|WP_Error True on success, WP_Error on failure. + */ +function _unzip_file_pclzip( $file, $to, $needed_dirs = array() ) { + global $wp_filesystem; + + mbstring_binary_safe_encoding(); + + require_once ABSPATH . 'wp-admin/includes/class-pclzip.php'; + + $archive = new PclZip( $file ); + + $archive_files = $archive->extract( PCLZIP_OPT_EXTRACT_AS_STRING ); + + reset_mbstring_encoding(); + + // Is the archive valid? + if ( ! is_array( $archive_files ) ) { + return new WP_Error( 'incompatible_archive', __( 'Incompatible Archive.' ), $archive->errorInfo( true ) ); + } + + if ( 0 == count( $archive_files ) ) { + return new WP_Error( 'empty_archive_pclzip', __( 'Empty archive.' ) ); + } + + $uncompressed_size = 0; + + // Determine any children directories needed (From within the archive). + foreach ( $archive_files as $file ) { + if ( '__MACOSX/' === substr( $file['filename'], 0, 9 ) ) { // Skip the OS X-created __MACOSX directory. + continue; + } + + $uncompressed_size += $file['size']; + + $needed_dirs[] = $to . untrailingslashit( $file['folder'] ? $file['filename'] : dirname( $file['filename'] ) ); + } + + /* + * disk_free_space() could return false. Assume that any falsey value is an error. + * A disk that has zero free bytes has bigger problems. + * Require we have enough space to unzip the file and copy its contents, with a 10% buffer. + */ + if ( wp_doing_cron() ) { + $available_space = @disk_free_space( WP_CONTENT_DIR ); + if ( $available_space && ( $uncompressed_size * 2.1 ) > $available_space ) { + return new WP_Error( 'disk_full_unzip_file', __( 'Could not copy files. You may have run out of disk space.' ), compact( 'uncompressed_size', 'available_space' ) ); + } + } + + $needed_dirs = array_unique( $needed_dirs ); + foreach ( $needed_dirs as $dir ) { + // Check the parent folders of the folders all exist within the creation array. + if ( untrailingslashit( $to ) == $dir ) { // Skip over the working directory, we know this exists (or will exist). + continue; + } + if ( strpos( $dir, $to ) === false ) { // If the directory is not within the working directory, skip it. + continue; + } + + $parent_folder = dirname( $dir ); + while ( ! empty( $parent_folder ) && untrailingslashit( $to ) != $parent_folder && ! in_array( $parent_folder, $needed_dirs ) ) { + $needed_dirs[] = $parent_folder; + $parent_folder = dirname( $parent_folder ); + } + } + asort( $needed_dirs ); + + // Create those directories if need be: + foreach ( $needed_dirs as $_dir ) { + // Only check to see if the dir exists upon creation failure. Less I/O this way. + if ( ! $wp_filesystem->mkdir( $_dir, FS_CHMOD_DIR ) && ! $wp_filesystem->is_dir( $_dir ) ) { + return new WP_Error( 'mkdir_failed_pclzip', __( 'Could not create directory.' ), substr( $_dir, strlen( $to ) ) ); + } + } + unset( $needed_dirs ); + + // Extract the files from the zip. + foreach ( $archive_files as $file ) { + if ( $file['folder'] ) { + continue; + } + + if ( '__MACOSX/' === substr( $file['filename'], 0, 9 ) ) { // Don't extract the OS X-created __MACOSX directory files. + continue; + } + + // Don't extract invalid files: + if ( 0 !== validate_file( $file['filename'] ) ) { + continue; + } + + if ( ! $wp_filesystem->put_contents( $to . $file['filename'], $file['content'], FS_CHMOD_FILE ) ) { + return new WP_Error( 'copy_failed_pclzip', __( 'Could not copy file.' ), $file['filename'] ); + } + } + return true; +} + +/** + * Copies a directory from one location to another via the WordPress Filesystem + * Abstraction. + * + * Assumes that WP_Filesystem() has already been called and setup. + * + * @since 2.5.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string $from Source directory. + * @param string $to Destination directory. + * @param string[] $skip_list An array of files/folders to skip copying. + * @return true|WP_Error True on success, WP_Error on failure. + */ +function copy_dir( $from, $to, $skip_list = array() ) { + global $wp_filesystem; + + $dirlist = $wp_filesystem->dirlist( $from ); + + $from = trailingslashit( $from ); + $to = trailingslashit( $to ); + + foreach ( (array) $dirlist as $filename => $fileinfo ) { + if ( in_array( $filename, $skip_list, true ) ) { + continue; + } + + if ( 'f' == $fileinfo['type'] ) { + if ( ! $wp_filesystem->copy( $from . $filename, $to . $filename, true, FS_CHMOD_FILE ) ) { + // If copy failed, chmod file to 0644 and try again. + $wp_filesystem->chmod( $to . $filename, FS_CHMOD_FILE ); + if ( ! $wp_filesystem->copy( $from . $filename, $to . $filename, true, FS_CHMOD_FILE ) ) { + return new WP_Error( 'copy_failed_copy_dir', __( 'Could not copy file.' ), $to . $filename ); + } + } + } elseif ( 'd' == $fileinfo['type'] ) { + if ( ! $wp_filesystem->is_dir( $to . $filename ) ) { + if ( ! $wp_filesystem->mkdir( $to . $filename, FS_CHMOD_DIR ) ) { + return new WP_Error( 'mkdir_failed_copy_dir', __( 'Could not create directory.' ), $to . $filename ); + } + } + + // Generate the $sub_skip_list for the subdirectory as a sub-set of the existing $skip_list. + $sub_skip_list = array(); + foreach ( $skip_list as $skip_item ) { + if ( 0 === strpos( $skip_item, $filename . '/' ) ) { + $sub_skip_list[] = preg_replace( '!^' . preg_quote( $filename, '!' ) . '/!i', '', $skip_item ); + } + } + + $result = copy_dir( $from . $filename, $to . $filename, $sub_skip_list ); + if ( is_wp_error( $result ) ) { + return $result; + } + } + } + return true; +} + +/** + * Initializes and connects the WordPress Filesystem Abstraction classes. + * + * This function will include the chosen transport and attempt connecting. + * + * Plugins may add extra transports, And force WordPress to use them by returning + * the filename via the {@see 'filesystem_method_file'} filter. + * + * @since 2.5.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param array|false $args Optional. Connection args, These are passed directly to + * the `WP_Filesystem_*()` classes. Default false. + * @param string|false $context Optional. Context for get_filesystem_method(). Default false. + * @param bool $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable. Default false. + * @return bool|null True on success, false on failure, null if the filesystem method class file does not exist. + */ +function WP_Filesystem( $args = false, $context = false, $allow_relaxed_file_ownership = false ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + global $wp_filesystem; + + require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php'; + + $method = get_filesystem_method( $args, $context, $allow_relaxed_file_ownership ); + + if ( ! $method ) { + return false; + } + + if ( ! class_exists( "WP_Filesystem_$method" ) ) { + + /** + * Filters the path for a specific filesystem method class file. + * + * @since 2.6.0 + * + * @see get_filesystem_method() + * + * @param string $path Path to the specific filesystem method class file. + * @param string $method The filesystem method to use. + */ + $abstraction_file = apply_filters( 'filesystem_method_file', ABSPATH . 'wp-admin/includes/class-wp-filesystem-' . $method . '.php', $method ); + + if ( ! file_exists( $abstraction_file ) ) { + return; + } + + require_once $abstraction_file; + } + $method = "WP_Filesystem_$method"; + + $wp_filesystem = new $method( $args ); + + /* + * Define the timeouts for the connections. Only available after the constructor is called + * to allow for per-transport overriding of the default. + */ + if ( ! defined( 'FS_CONNECT_TIMEOUT' ) ) { + define( 'FS_CONNECT_TIMEOUT', 30 ); + } + if ( ! defined( 'FS_TIMEOUT' ) ) { + define( 'FS_TIMEOUT', 30 ); + } + + if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) { + return false; + } + + if ( ! $wp_filesystem->connect() ) { + return false; // There was an error connecting to the server. + } + + // Set the permission constants if not already set. + if ( ! defined( 'FS_CHMOD_DIR' ) ) { + define( 'FS_CHMOD_DIR', ( fileperms( ABSPATH ) & 0777 | 0755 ) ); + } + if ( ! defined( 'FS_CHMOD_FILE' ) ) { + define( 'FS_CHMOD_FILE', ( fileperms( ABSPATH . 'index.php' ) & 0777 | 0644 ) ); + } + + return true; +} + +/** + * Determines which method to use for reading, writing, modifying, or deleting + * files on the filesystem. + * + * The priority of the transports are: Direct, SSH2, FTP PHP Extension, FTP Sockets + * (Via Sockets class, or `fsockopen()`). Valid values for these are: 'direct', 'ssh2', + * 'ftpext' or 'ftpsockets'. + * + * The return value can be overridden by defining the `FS_METHOD` constant in `wp-config.php`, + * or filtering via {@see 'filesystem_method'}. + * + * @link https://wordpress.org/support/article/editing-wp-config-php/#wordpress-upgrade-constants + * + * Plugins may define a custom transport handler, See WP_Filesystem(). + * + * @since 2.5.0 + * + * @global callable $_wp_filesystem_direct_method + * + * @param array $args Optional. Connection details. Default empty array. + * @param string $context Optional. Full path to the directory that is tested + * for being writable. Default empty. + * @param bool $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable. + * Default false. + * @return string The transport to use, see description for valid return values. + */ +function get_filesystem_method( $args = array(), $context = '', $allow_relaxed_file_ownership = false ) { + // Please ensure that this is either 'direct', 'ssh2', 'ftpext', or 'ftpsockets'. + $method = defined( 'FS_METHOD' ) ? FS_METHOD : false; + + if ( ! $context ) { + $context = WP_CONTENT_DIR; + } + + // If the directory doesn't exist (wp-content/languages) then use the parent directory as we'll create it. + if ( WP_LANG_DIR == $context && ! is_dir( $context ) ) { + $context = dirname( $context ); + } + + $context = trailingslashit( $context ); + + if ( ! $method ) { + + $temp_file_name = $context . 'temp-write-test-' . str_replace( '.', '-', uniqid( '', true ) ); + $temp_handle = @fopen( $temp_file_name, 'w' ); + if ( $temp_handle ) { + + // Attempt to determine the file owner of the WordPress files, and that of newly created files. + $wp_file_owner = false; + $temp_file_owner = false; + if ( function_exists( 'fileowner' ) ) { + $wp_file_owner = @fileowner( __FILE__ ); + $temp_file_owner = @fileowner( $temp_file_name ); + } + + if ( false !== $wp_file_owner && $wp_file_owner === $temp_file_owner ) { + /* + * WordPress is creating files as the same owner as the WordPress files, + * this means it's safe to modify & create new files via PHP. + */ + $method = 'direct'; + $GLOBALS['_wp_filesystem_direct_method'] = 'file_owner'; + } elseif ( $allow_relaxed_file_ownership ) { + /* + * The $context directory is writable, and $allow_relaxed_file_ownership is set, + * this means we can modify files safely in this directory. + * This mode doesn't create new files, only alter existing ones. + */ + $method = 'direct'; + $GLOBALS['_wp_filesystem_direct_method'] = 'relaxed_ownership'; + } + + fclose( $temp_handle ); + @unlink( $temp_file_name ); + } + } + + if ( ! $method && isset( $args['connection_type'] ) && 'ssh' == $args['connection_type'] && extension_loaded( 'ssh2' ) && function_exists( 'stream_get_contents' ) ) { + $method = 'ssh2'; + } + if ( ! $method && extension_loaded( 'ftp' ) ) { + $method = 'ftpext'; + } + if ( ! $method && ( extension_loaded( 'sockets' ) || function_exists( 'fsockopen' ) ) ) { + $method = 'ftpsockets'; // Sockets: Socket extension; PHP Mode: FSockopen / fwrite / fread. + } + + /** + * Filters the filesystem method to use. + * + * @since 2.6.0 + * + * @param string $method Filesystem method to return. + * @param array $args An array of connection details for the method. + * @param string $context Full path to the directory that is tested for being writable. + * @param bool $allow_relaxed_file_ownership Whether to allow Group/World writable. + */ + return apply_filters( 'filesystem_method', $method, $args, $context, $allow_relaxed_file_ownership ); +} + +/** + * Displays a form to the user to request for their FTP/SSH details in order + * to connect to the filesystem. + * + * All chosen/entered details are saved, excluding the password. + * + * Hostnames may be in the form of hostname:portnumber (eg: wordpress.org:2467) + * to specify an alternate FTP/SSH port. + * + * Plugins may override this form by returning true|false via the {@see 'request_filesystem_credentials'} filter. + * + * @since 2.5.0 + * @since 4.6.0 The `$context` parameter default changed from `false` to an empty string. + * + * @global string $pagenow + * + * @param string $form_post The URL to post the form to. + * @param string $type Optional. Chosen type of filesystem. Default empty. + * @param bool|WP_Error $error Optional. Whether the current request has failed to connect, + * or an error object. Default false. + * @param string $context Optional. Full path to the directory that is tested for being + * writable. Default empty. + * @param array $extra_fields Optional. Extra `POST` fields to be checked for inclusion in + * the post. Default null. + * @param bool $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable. Default false. + * + * @return bool|array True if no filesystem credentials are required, false if they are required but have not been + * provided, array of credentials if they are required and have been provided. + */ +function request_filesystem_credentials( $form_post, $type = '', $error = false, $context = '', $extra_fields = null, $allow_relaxed_file_ownership = false ) { + global $pagenow; + + /** + * Filters the filesystem credentials. + * + * Returning anything other than an empty string will effectively short-circuit + * output of the filesystem credentials form, returning that value instead. + * + * A filter should return true if no filesystem credentials are required, false if they are required but have not been + * provided, or an array of credentials if they are required and have been provided. + * + * @since 2.5.0 + * @since 4.6.0 The `$context` parameter default changed from `false` to an empty string. + * + * @param mixed $credentials Credentials to return instead. Default empty string. + * @param string $form_post The URL to post the form to. + * @param string $type Chosen type of filesystem. + * @param bool|WP_Error $error Whether the current request has failed to connect, + * or an error object. + * @param string $context Full path to the directory that is tested for + * being writable. + * @param array $extra_fields Extra POST fields. + * @param bool $allow_relaxed_file_ownership Whether to allow Group/World writable. + */ + $req_cred = apply_filters( 'request_filesystem_credentials', '', $form_post, $type, $error, $context, $extra_fields, $allow_relaxed_file_ownership ); + if ( '' !== $req_cred ) { + return $req_cred; + } + + if ( empty( $type ) ) { + $type = get_filesystem_method( array(), $context, $allow_relaxed_file_ownership ); + } + + if ( 'direct' == $type ) { + return true; + } + + if ( is_null( $extra_fields ) ) { + $extra_fields = array( 'version', 'locale' ); + } + + $credentials = get_option( + 'ftp_credentials', + array( + 'hostname' => '', + 'username' => '', + ) + ); + + $submitted_form = wp_unslash( $_POST ); + + // Verify nonce, or unset submitted form field values on failure. + if ( ! isset( $_POST['_fs_nonce'] ) || ! wp_verify_nonce( $_POST['_fs_nonce'], 'filesystem-credentials' ) ) { + unset( + $submitted_form['hostname'], + $submitted_form['username'], + $submitted_form['password'], + $submitted_form['public_key'], + $submitted_form['private_key'], + $submitted_form['connection_type'] + ); + } + + // If defined, set it to that. Else, if POST'd, set it to that. If not, set it to whatever it previously was (saved details in option). + $credentials['hostname'] = defined( 'FTP_HOST' ) ? FTP_HOST : ( ! empty( $submitted_form['hostname'] ) ? $submitted_form['hostname'] : $credentials['hostname'] ); + $credentials['username'] = defined( 'FTP_USER' ) ? FTP_USER : ( ! empty( $submitted_form['username'] ) ? $submitted_form['username'] : $credentials['username'] ); + $credentials['password'] = defined( 'FTP_PASS' ) ? FTP_PASS : ( ! empty( $submitted_form['password'] ) ? $submitted_form['password'] : '' ); + + // Check to see if we are setting the public/private keys for ssh. + $credentials['public_key'] = defined( 'FTP_PUBKEY' ) ? FTP_PUBKEY : ( ! empty( $submitted_form['public_key'] ) ? $submitted_form['public_key'] : '' ); + $credentials['private_key'] = defined( 'FTP_PRIKEY' ) ? FTP_PRIKEY : ( ! empty( $submitted_form['private_key'] ) ? $submitted_form['private_key'] : '' ); + + // Sanitize the hostname, some people might pass in odd data. + $credentials['hostname'] = preg_replace( '|\w+://|', '', $credentials['hostname'] ); // Strip any schemes off. + + if ( strpos( $credentials['hostname'], ':' ) ) { + list( $credentials['hostname'], $credentials['port'] ) = explode( ':', $credentials['hostname'], 2 ); + if ( ! is_numeric( $credentials['port'] ) ) { + unset( $credentials['port'] ); + } + } else { + unset( $credentials['port'] ); + } + + if ( ( defined( 'FTP_SSH' ) && FTP_SSH ) || ( defined( 'FS_METHOD' ) && 'ssh2' == FS_METHOD ) ) { + $credentials['connection_type'] = 'ssh'; + } elseif ( ( defined( 'FTP_SSL' ) && FTP_SSL ) && 'ftpext' == $type ) { // Only the FTP Extension understands SSL. + $credentials['connection_type'] = 'ftps'; + } elseif ( ! empty( $submitted_form['connection_type'] ) ) { + $credentials['connection_type'] = $submitted_form['connection_type']; + } elseif ( ! isset( $credentials['connection_type'] ) ) { // All else fails (and it's not defaulted to something else saved), default to FTP. + $credentials['connection_type'] = 'ftp'; + } + if ( ! $error && + ( + ( ! empty( $credentials['password'] ) && ! empty( $credentials['username'] ) && ! empty( $credentials['hostname'] ) ) || + ( 'ssh' == $credentials['connection_type'] && ! empty( $credentials['public_key'] ) && ! empty( $credentials['private_key'] ) ) + ) ) { + $stored_credentials = $credentials; + if ( ! empty( $stored_credentials['port'] ) ) { // Save port as part of hostname to simplify above code. + $stored_credentials['hostname'] .= ':' . $stored_credentials['port']; + } + + unset( $stored_credentials['password'], $stored_credentials['port'], $stored_credentials['private_key'], $stored_credentials['public_key'] ); + if ( ! wp_installing() ) { + update_option( 'ftp_credentials', $stored_credentials ); + } + return $credentials; + } + $hostname = isset( $credentials['hostname'] ) ? $credentials['hostname'] : ''; + $username = isset( $credentials['username'] ) ? $credentials['username'] : ''; + $public_key = isset( $credentials['public_key'] ) ? $credentials['public_key'] : ''; + $private_key = isset( $credentials['private_key'] ) ? $credentials['private_key'] : ''; + $port = isset( $credentials['port'] ) ? $credentials['port'] : ''; + $connection_type = isset( $credentials['connection_type'] ) ? $credentials['connection_type'] : ''; + + if ( $error ) { + $error_string = __( 'Error: There was an error connecting to the server, Please verify the settings are correct.' ); + if ( is_wp_error( $error ) ) { + $error_string = esc_html( $error->get_error_message() ); + } + echo '

        ' . $error_string . '

        '; + } + + $types = array(); + if ( extension_loaded( 'ftp' ) || extension_loaded( 'sockets' ) || function_exists( 'fsockopen' ) ) { + $types['ftp'] = __( 'FTP' ); + } + if ( extension_loaded( 'ftp' ) ) { // Only this supports FTPS. + $types['ftps'] = __( 'FTPS (SSL)' ); + } + if ( extension_loaded( 'ssh2' ) && function_exists( 'stream_get_contents' ) ) { + $types['ssh'] = __( 'SSH2' ); + } + + /** + * Filters the connection types to output to the filesystem credentials form. + * + * @since 2.9.0 + * @since 4.6.0 The `$context` parameter default changed from `false` to an empty string. + * + * @param string[] $types Types of connections. + * @param array $credentials Credentials to connect with. + * @param string $type Chosen filesystem method. + * @param bool|WP_Error $error Whether the current request has failed to connect, + * or an error object. + * @param string $context Full path to the directory that is tested for being writable. + */ + $types = apply_filters( 'fs_ftp_connection_types', $types, $credentials, $type, $error, $context ); + + ?> +
        +
        + " . __( 'Connection Information' ) . ""; + ?> +

        + +

        + +
        + +
        +
        + +
        +
        + + $text ) : + ?> + + +
        + +
        > + + + +

        +
        + '; + } + } + ?> +

        + + + +

        +
        +
        + +
        +
        + +
        + 400 ? 400 / $big : 1; + + $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true ); + $can_restore = false; + if ( ! empty( $backup_sizes ) && isset( $backup_sizes['full-orig'], $meta['file'] ) ) { + $can_restore = wp_basename( $meta['file'] ) !== $backup_sizes['full-orig']['file']; + } + + if ( $msg ) { + if ( isset( $msg->error ) ) { + $note = "

        $msg->error

        "; + } elseif ( isset( $msg->msg ) ) { + $note = "

        $msg->msg

        "; + } + } + + ?> +
        +
        + +
        +
        +
        +

        + +
        +

        +
        + +

        + ' . $meta['width'] . ' × ' . $meta['height'] . '' + ); + ?> +

        + +
        + +
        + +
        + + + + + + ! +
        , 'scale')" class="button button-primary" value="" />
        +
        +
        + +
        +
        +
        + + + +
        +
        +

        +
        +

        + +

        +
        + , 'restore')" class="button button-primary" value="" /> +
        +
        +
        +
        + + + +
        +
        +

        + + +
        +

        + +


        +

        + +


        +

        +
        +
        + +
        + +
        + + + + + +
        +
        + +
        + +
        + + + + + +
        +
        + +
        + + + +
        +
        +

        + +
        +

        +
        +
        + +
        + +
        +
        + +
        +
        + + + + + + + + + + + + + + + + +
        +
        +
        + + + +
        + +
        + +
        + + get_post_mime_type( $post_id ), + 'methods' => array( 'rotate' ), + ) + ) ) { + $note_no_rotate = ''; + ?> + + + ' . __( 'Image rotation is not supported by your web host.' ) . '

        '; + ?> + + + + + + + +
        + + + +
        + + + + + + + + +
        + +
        + +
        + + )" disabled="disabled" class="button button-primary imgedit-submit-btn" value="" /> +
        +
        + +
        +
        + +
        + stream( $mime_type ) ) ) { + return false; + } + + return true; + } else { + /* translators: 1: $image, 2: WP_Image_Editor */ + _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( '%1$s needs to be a %2$s object.' ), '$image', 'WP_Image_Editor' ) ); + + /** + * Filters the GD image resource to be streamed to the browser. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use {@see 'image_editor_save_pre'} instead. + * + * @param resource $image Image resource to be streamed. + * @param int $attachment_id The attachment post ID. + */ + $image = apply_filters_deprecated( 'image_save_pre', array( $image, $attachment_id ), '3.5.0', 'image_editor_save_pre' ); + + switch ( $mime_type ) { + case 'image/jpeg': + header( 'Content-Type: image/jpeg' ); + return imagejpeg( $image, null, 90 ); + case 'image/png': + header( 'Content-Type: image/png' ); + return imagepng( $image ); + case 'image/gif': + header( 'Content-Type: image/gif' ); + return imagegif( $image ); + default: + return false; + } + } +} + +/** + * Saves image to file. + * + * @since 2.9.0 + * + * @param string $filename Name of the file to be saved. + * @param WP_Image_Editor $image The image editor instance. + * @param string $mime_type The mime type of the image. + * @param int $post_id Attachment post ID. + * @return bool True on success, false on failure. + */ +function wp_save_image_file( $filename, $image, $mime_type, $post_id ) { + if ( $image instanceof WP_Image_Editor ) { + + /** This filter is documented in wp-admin/includes/image-edit.php */ + $image = apply_filters( 'image_editor_save_pre', $image, $post_id ); + + /** + * Filters whether to skip saving the image file. + * + * Returning a non-null value will short-circuit the save method, + * returning that value instead. + * + * @since 3.5.0 + * + * @param bool|null $override Value to return instead of saving. Default null. + * @param string $filename Name of the file to be saved. + * @param WP_Image_Editor $image The image editor instance. + * @param string $mime_type The mime type of the image. + * @param int $post_id Attachment post ID. + */ + $saved = apply_filters( 'wp_save_image_editor_file', null, $filename, $image, $mime_type, $post_id ); + + if ( null !== $saved ) { + return $saved; + } + + return $image->save( $filename, $mime_type ); + } else { + /* translators: 1: $image, 2: WP_Image_Editor */ + _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( '%1$s needs to be a %2$s object.' ), '$image', 'WP_Image_Editor' ) ); + + /** This filter is documented in wp-admin/includes/image-edit.php */ + $image = apply_filters_deprecated( 'image_save_pre', array( $image, $post_id ), '3.5.0', 'image_editor_save_pre' ); + + /** + * Filters whether to skip saving the image file. + * + * Returning a non-null value will short-circuit the save method, + * returning that value instead. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use {@see 'wp_save_image_editor_file'} instead. + * + * @param mixed $override Value to return instead of saving. Default null. + * @param string $filename Name of the file to be saved. + * @param WP_Image_Editor $image The image editor instance. + * @param string $mime_type The mime type of the image. + * @param int $post_id Attachment post ID. + */ + $saved = apply_filters_deprecated( 'wp_save_image_file', array( null, $filename, $image, $mime_type, $post_id ), '3.5.0', 'wp_save_image_editor_file' ); + + if ( null !== $saved ) { + return $saved; + } + + switch ( $mime_type ) { + case 'image/jpeg': + /** This filter is documented in wp-includes/class-wp-image-editor.php */ + return imagejpeg( $image, $filename, apply_filters( 'jpeg_quality', 90, 'edit_image' ) ); + case 'image/png': + return imagepng( $image, $filename ); + case 'image/gif': + return imagegif( $image, $filename ); + default: + return false; + } + } +} + +/** + * Image preview ratio. Internal use only. + * + * @since 2.9.0 + * + * @ignore + * @param int $w Image width in pixels. + * @param int $h Image height in pixels. + * @return float|int Image preview ratio. + */ +function _image_get_preview_ratio( $w, $h ) { + $max = max( $w, $h ); + return $max > 400 ? ( 400 / $max ) : 1; +} + +/** + * Returns an image resource. Internal use only. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use WP_Image_Editor::rotate() + * @see WP_Image_Editor::rotate() + * + * @ignore + * @param resource $img Image resource. + * @param float|int $angle Image rotation angle, in degrees. + * @return resource|false GD image resource, false otherwise. + */ +function _rotate_image_resource( $img, $angle ) { + _deprecated_function( __FUNCTION__, '3.5.0', 'WP_Image_Editor::rotate()' ); + if ( function_exists( 'imagerotate' ) ) { + $rotated = imagerotate( $img, $angle, 0 ); + if ( is_resource( $rotated ) ) { + imagedestroy( $img ); + $img = $rotated; + } + } + return $img; +} + +/** + * Flips an image resource. Internal use only. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use WP_Image_Editor::flip() + * @see WP_Image_Editor::flip() + * + * @ignore + * @param resource $img Image resource. + * @param bool $horz Whether to flip horizontally. + * @param bool $vert Whether to flip vertically. + * @return resource (maybe) flipped image resource. + */ +function _flip_image_resource( $img, $horz, $vert ) { + _deprecated_function( __FUNCTION__, '3.5.0', 'WP_Image_Editor::flip()' ); + $w = imagesx( $img ); + $h = imagesy( $img ); + $dst = wp_imagecreatetruecolor( $w, $h ); + if ( is_resource( $dst ) ) { + $sx = $vert ? ( $w - 1 ) : 0; + $sy = $horz ? ( $h - 1 ) : 0; + $sw = $vert ? -$w : $w; + $sh = $horz ? -$h : $h; + + if ( imagecopyresampled( $dst, $img, 0, 0, $sx, $sy, $w, $h, $sw, $sh ) ) { + imagedestroy( $img ); + $img = $dst; + } + } + return $img; +} + +/** + * Crops an image resource. Internal use only. + * + * @since 2.9.0 + * + * @ignore + * @param resource $img Image resource. + * @param float $x Source point x-coordinate. + * @param float $y Source point y-coordinate. + * @param float $w Source width. + * @param float $h Source height. + * @return resource (maybe) cropped image resource. + */ +function _crop_image_resource( $img, $x, $y, $w, $h ) { + $dst = wp_imagecreatetruecolor( $w, $h ); + if ( is_resource( $dst ) ) { + if ( imagecopy( $dst, $img, 0, 0, $x, $y, $w, $h ) ) { + imagedestroy( $img ); + $img = $dst; + } + } + return $img; +} + +/** + * Performs group of changes on Editor specified. + * + * @since 2.9.0 + * + * @param WP_Image_Editor $image WP_Image_Editor instance. + * @param array $changes Array of change operations. + * @return WP_Image_Editor WP_Image_Editor instance with changes applied. + */ +function image_edit_apply_changes( $image, $changes ) { + if ( is_resource( $image ) ) { + /* translators: 1: $image, 2: WP_Image_Editor */ + _deprecated_argument( __FUNCTION__, '3.5.0', sprintf( __( '%1$s needs to be a %2$s object.' ), '$image', 'WP_Image_Editor' ) ); + } + + if ( ! is_array( $changes ) ) { + return $image; + } + + // Expand change operations. + foreach ( $changes as $key => $obj ) { + if ( isset( $obj->r ) ) { + $obj->type = 'rotate'; + $obj->angle = $obj->r; + unset( $obj->r ); + } elseif ( isset( $obj->f ) ) { + $obj->type = 'flip'; + $obj->axis = $obj->f; + unset( $obj->f ); + } elseif ( isset( $obj->c ) ) { + $obj->type = 'crop'; + $obj->sel = $obj->c; + unset( $obj->c ); + } + $changes[ $key ] = $obj; + } + + // Combine operations. + if ( count( $changes ) > 1 ) { + $filtered = array( $changes[0] ); + for ( $i = 0, $j = 1, $c = count( $changes ); $j < $c; $j++ ) { + $combined = false; + if ( $filtered[ $i ]->type == $changes[ $j ]->type ) { + switch ( $filtered[ $i ]->type ) { + case 'rotate': + $filtered[ $i ]->angle += $changes[ $j ]->angle; + $combined = true; + break; + case 'flip': + $filtered[ $i ]->axis ^= $changes[ $j ]->axis; + $combined = true; + break; + } + } + if ( ! $combined ) { + $filtered[ ++$i ] = $changes[ $j ]; + } + } + $changes = $filtered; + unset( $filtered ); + } + + // Image resource before applying the changes. + if ( $image instanceof WP_Image_Editor ) { + + /** + * Filters the WP_Image_Editor instance before applying changes to the image. + * + * @since 3.5.0 + * + * @param WP_Image_Editor $image WP_Image_Editor instance. + * @param array $changes Array of change operations. + */ + $image = apply_filters( 'wp_image_editor_before_change', $image, $changes ); + } elseif ( is_resource( $image ) ) { + + /** + * Filters the GD image resource before applying changes to the image. + * + * @since 2.9.0 + * @deprecated 3.5.0 Use {@see 'wp_image_editor_before_change'} instead. + * + * @param resource $image GD image resource. + * @param array $changes Array of change operations. + */ + $image = apply_filters_deprecated( 'image_edit_before_change', array( $image, $changes ), '3.5.0', 'wp_image_editor_before_change' ); + } + + foreach ( $changes as $operation ) { + switch ( $operation->type ) { + case 'rotate': + if ( 0 != $operation->angle ) { + if ( $image instanceof WP_Image_Editor ) { + $image->rotate( $operation->angle ); + } else { + $image = _rotate_image_resource( $image, $operation->angle ); + } + } + break; + case 'flip': + if ( 0 != $operation->axis ) { + if ( $image instanceof WP_Image_Editor ) { + $image->flip( ( $operation->axis & 1 ) != 0, ( $operation->axis & 2 ) != 0 ); + } else { + $image = _flip_image_resource( $image, ( $operation->axis & 1 ) != 0, ( $operation->axis & 2 ) != 0 ); + } + } + break; + case 'crop': + $sel = $operation->sel; + + if ( $image instanceof WP_Image_Editor ) { + $size = $image->get_size(); + $w = $size['width']; + $h = $size['height']; + + $scale = 1 / _image_get_preview_ratio( $w, $h ); // Discard preview scaling. + $image->crop( $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale ); + } else { + $scale = 1 / _image_get_preview_ratio( imagesx( $image ), imagesy( $image ) ); // Discard preview scaling. + $image = _crop_image_resource( $image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale ); + } + break; + } + } + + return $image; +} + + +/** + * Streams image in post to browser, along with enqueued changes + * in `$_REQUEST['history']`. + * + * @since 2.9.0 + * + * @param int $post_id Attachment post ID. + * @return bool True on success, false on failure. + */ +function stream_preview_image( $post_id ) { + $post = get_post( $post_id ); + + wp_raise_memory_limit( 'admin' ); + + $img = wp_get_image_editor( _load_image_to_edit_path( $post_id ) ); + + if ( is_wp_error( $img ) ) { + return false; + } + + $changes = ! empty( $_REQUEST['history'] ) ? json_decode( wp_unslash( $_REQUEST['history'] ) ) : null; + if ( $changes ) { + $img = image_edit_apply_changes( $img, $changes ); + } + + // Scale the image. + $size = $img->get_size(); + $w = $size['width']; + $h = $size['height']; + + $ratio = _image_get_preview_ratio( $w, $h ); + $w2 = max( 1, $w * $ratio ); + $h2 = max( 1, $h * $ratio ); + + if ( is_wp_error( $img->resize( $w2, $h2 ) ) ) { + return false; + } + + return wp_stream_image( $img, $post->post_mime_type, $post_id ); +} + +/** + * Restores the metadata for a given attachment. + * + * @since 2.9.0 + * + * @param int $post_id Attachment post ID. + * @return stdClass Image restoration message object. + */ +function wp_restore_image( $post_id ) { + $meta = wp_get_attachment_metadata( $post_id ); + $file = get_attached_file( $post_id ); + $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true ); + $old_backup_sizes = $backup_sizes; + $restored = false; + $msg = new stdClass; + + if ( ! is_array( $backup_sizes ) ) { + $msg->error = __( 'Cannot load image metadata.' ); + return $msg; + } + + $parts = pathinfo( $file ); + $suffix = time() . rand( 100, 999 ); + $default_sizes = get_intermediate_image_sizes(); + + if ( isset( $backup_sizes['full-orig'] ) && is_array( $backup_sizes['full-orig'] ) ) { + $data = $backup_sizes['full-orig']; + + if ( $parts['basename'] != $data['file'] ) { + if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE ) { + + // Delete only if it's an edited image. + if ( preg_match( '/-e[0-9]{13}\./', $parts['basename'] ) ) { + wp_delete_file( $file ); + } + } elseif ( isset( $meta['width'], $meta['height'] ) ) { + $backup_sizes[ "full-$suffix" ] = array( + 'width' => $meta['width'], + 'height' => $meta['height'], + 'file' => $parts['basename'], + ); + } + } + + $restored_file = path_join( $parts['dirname'], $data['file'] ); + $restored = update_attached_file( $post_id, $restored_file ); + + $meta['file'] = _wp_relative_upload_path( $restored_file ); + $meta['width'] = $data['width']; + $meta['height'] = $data['height']; + } + + foreach ( $default_sizes as $default_size ) { + if ( isset( $backup_sizes[ "$default_size-orig" ] ) ) { + $data = $backup_sizes[ "$default_size-orig" ]; + if ( isset( $meta['sizes'][ $default_size ] ) && $meta['sizes'][ $default_size ]['file'] != $data['file'] ) { + if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE ) { + + // Delete only if it's an edited image. + if ( preg_match( '/-e[0-9]{13}-/', $meta['sizes'][ $default_size ]['file'] ) ) { + $delete_file = path_join( $parts['dirname'], $meta['sizes'][ $default_size ]['file'] ); + wp_delete_file( $delete_file ); + } + } else { + $backup_sizes[ "$default_size-{$suffix}" ] = $meta['sizes'][ $default_size ]; + } + } + + $meta['sizes'][ $default_size ] = $data; + } else { + unset( $meta['sizes'][ $default_size ] ); + } + } + + if ( ! wp_update_attachment_metadata( $post_id, $meta ) || + ( $old_backup_sizes !== $backup_sizes && ! update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes ) ) ) { + + $msg->error = __( 'Cannot save image metadata.' ); + return $msg; + } + + if ( ! $restored ) { + $msg->error = __( 'Image metadata is inconsistent.' ); + } else { + $msg->msg = __( 'Image restored successfully.' ); + } + + return $msg; +} + +/** + * Saves image to post, along with enqueued changes + * in `$_REQUEST['history']`. + * + * @since 2.9.0 + * + * @param int $post_id Attachment post ID. + * @return stdClass + */ +function wp_save_image( $post_id ) { + $_wp_additional_image_sizes = wp_get_additional_image_sizes(); + + $return = new stdClass; + $success = false; + $delete = false; + $scaled = false; + $nocrop = false; + $post = get_post( $post_id ); + + $img = wp_get_image_editor( _load_image_to_edit_path( $post_id, 'full' ) ); + if ( is_wp_error( $img ) ) { + $return->error = esc_js( __( 'Unable to create new image.' ) ); + return $return; + } + + $fwidth = ! empty( $_REQUEST['fwidth'] ) ? intval( $_REQUEST['fwidth'] ) : 0; + $fheight = ! empty( $_REQUEST['fheight'] ) ? intval( $_REQUEST['fheight'] ) : 0; + $target = ! empty( $_REQUEST['target'] ) ? preg_replace( '/[^a-z0-9_-]+/i', '', $_REQUEST['target'] ) : ''; + $scale = ! empty( $_REQUEST['do'] ) && 'scale' == $_REQUEST['do']; + + if ( $scale && $fwidth > 0 && $fheight > 0 ) { + $size = $img->get_size(); + $sX = $size['width']; + $sY = $size['height']; + + // Check if it has roughly the same w / h ratio. + $diff = round( $sX / $sY, 2 ) - round( $fwidth / $fheight, 2 ); + if ( -0.1 < $diff && $diff < 0.1 ) { + // Scale the full size image. + if ( $img->resize( $fwidth, $fheight ) ) { + $scaled = true; + } + } + + if ( ! $scaled ) { + $return->error = esc_js( __( 'Error while saving the scaled image. Please reload the page and try again.' ) ); + return $return; + } + } elseif ( ! empty( $_REQUEST['history'] ) ) { + $changes = json_decode( wp_unslash( $_REQUEST['history'] ) ); + if ( $changes ) { + $img = image_edit_apply_changes( $img, $changes ); + } + } else { + $return->error = esc_js( __( 'Nothing to save, the image has not changed.' ) ); + return $return; + } + + $meta = wp_get_attachment_metadata( $post_id ); + $backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true ); + + if ( ! is_array( $meta ) ) { + $return->error = esc_js( __( 'Image data does not exist. Please re-upload the image.' ) ); + return $return; + } + + if ( ! is_array( $backup_sizes ) ) { + $backup_sizes = array(); + } + + // Generate new filename. + $path = get_attached_file( $post_id ); + + $basename = pathinfo( $path, PATHINFO_BASENAME ); + $dirname = pathinfo( $path, PATHINFO_DIRNAME ); + $ext = pathinfo( $path, PATHINFO_EXTENSION ); + $filename = pathinfo( $path, PATHINFO_FILENAME ); + $suffix = time() . rand( 100, 999 ); + + if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE && + isset( $backup_sizes['full-orig'] ) && $backup_sizes['full-orig']['file'] != $basename ) { + + if ( 'thumbnail' == $target ) { + $new_path = "{$dirname}/{$filename}-temp.{$ext}"; + } else { + $new_path = $path; + } + } else { + while ( true ) { + $filename = preg_replace( '/-e([0-9]+)$/', '', $filename ); + $filename .= "-e{$suffix}"; + $new_filename = "{$filename}.{$ext}"; + $new_path = "{$dirname}/$new_filename"; + if ( file_exists( $new_path ) ) { + $suffix++; + } else { + break; + } + } + } + + // Save the full-size file, also needed to create sub-sizes. + if ( ! wp_save_image_file( $new_path, $img, $post->post_mime_type, $post_id ) ) { + $return->error = esc_js( __( 'Unable to save the image.' ) ); + return $return; + } + + if ( 'nothumb' === $target || 'all' === $target || 'full' === $target || $scaled ) { + $tag = false; + if ( isset( $backup_sizes['full-orig'] ) ) { + if ( ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE ) && $backup_sizes['full-orig']['file'] !== $basename ) { + $tag = "full-$suffix"; + } + } else { + $tag = 'full-orig'; + } + + if ( $tag ) { + $backup_sizes[ $tag ] = array( + 'width' => $meta['width'], + 'height' => $meta['height'], + 'file' => $basename, + ); + } + $success = ( $path === $new_path ) || update_attached_file( $post_id, $new_path ); + + $meta['file'] = _wp_relative_upload_path( $new_path ); + + $size = $img->get_size(); + $meta['width'] = $size['width']; + $meta['height'] = $size['height']; + + if ( $success && ( 'nothumb' == $target || 'all' == $target ) ) { + $sizes = get_intermediate_image_sizes(); + if ( 'nothumb' == $target ) { + $sizes = array_diff( $sizes, array( 'thumbnail' ) ); + } + } + + $return->fw = $meta['width']; + $return->fh = $meta['height']; + } elseif ( 'thumbnail' == $target ) { + $sizes = array( 'thumbnail' ); + $success = true; + $delete = true; + $nocrop = true; + } + + /* + * We need to remove any existing resized image files because + * a new crop or rotate could generate different sizes (and hence, filenames), + * keeping the new resized images from overwriting the existing image files. + * https://core.trac.wordpress.org/ticket/32171 + */ + if ( defined( 'IMAGE_EDIT_OVERWRITE' ) && IMAGE_EDIT_OVERWRITE && ! empty( $meta['sizes'] ) ) { + foreach ( $meta['sizes'] as $size ) { + if ( ! empty( $size['file'] ) && preg_match( '/-e[0-9]{13}-/', $size['file'] ) ) { + $delete_file = path_join( $dirname, $size['file'] ); + wp_delete_file( $delete_file ); + } + } + } + + if ( isset( $sizes ) ) { + $_sizes = array(); + + foreach ( $sizes as $size ) { + $tag = false; + if ( isset( $meta['sizes'][ $size ] ) ) { + if ( isset( $backup_sizes[ "$size-orig" ] ) ) { + if ( ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE ) && $backup_sizes[ "$size-orig" ]['file'] != $meta['sizes'][ $size ]['file'] ) { + $tag = "$size-$suffix"; + } + } else { + $tag = "$size-orig"; + } + + if ( $tag ) { + $backup_sizes[ $tag ] = $meta['sizes'][ $size ]; + } + } + + if ( isset( $_wp_additional_image_sizes[ $size ] ) ) { + $width = intval( $_wp_additional_image_sizes[ $size ]['width'] ); + $height = intval( $_wp_additional_image_sizes[ $size ]['height'] ); + $crop = ( $nocrop ) ? false : $_wp_additional_image_sizes[ $size ]['crop']; + } else { + $height = get_option( "{$size}_size_h" ); + $width = get_option( "{$size}_size_w" ); + $crop = ( $nocrop ) ? false : get_option( "{$size}_crop" ); + } + + $_sizes[ $size ] = array( + 'width' => $width, + 'height' => $height, + 'crop' => $crop, + ); + } + + $meta['sizes'] = array_merge( $meta['sizes'], $img->multi_resize( $_sizes ) ); + } + + unset( $img ); + + if ( $success ) { + wp_update_attachment_metadata( $post_id, $meta ); + update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes ); + + if ( 'thumbnail' === $target || 'all' === $target || 'full' === $target ) { + // Check if it's an image edit from attachment edit screen. + if ( ! empty( $_REQUEST['context'] ) && 'edit-attachment' == $_REQUEST['context'] ) { + $thumb_url = wp_get_attachment_image_src( $post_id, array( 900, 600 ), true ); + $return->thumbnail = $thumb_url[0]; + } else { + $file_url = wp_get_attachment_url( $post_id ); + if ( ! empty( $meta['sizes']['thumbnail'] ) ) { + $thumb = $meta['sizes']['thumbnail']; + $return->thumbnail = path_join( dirname( $file_url ), $thumb['file'] ); + } else { + $return->thumbnail = "$file_url?w=128&h=128"; + } + } + } + } else { + $delete = true; + } + + if ( $delete ) { + wp_delete_file( $new_path ); + } + + $return->msg = esc_js( __( 'Image saved' ) ); + return $return; +} diff --git a/wp-admin/includes/image.php b/wp-admin/includes/image.php new file mode 100644 index 0000000..f910809 --- /dev/null +++ b/wp-admin/includes/image.php @@ -0,0 +1,1057 @@ +crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs ); + if ( is_wp_error( $src ) ) { + return $src; + } + + if ( ! $dst_file ) { + $dst_file = str_replace( wp_basename( $src_file ), 'cropped-' . wp_basename( $src_file ), $src_file ); + } + + /* + * The directory containing the original file may no longer exist when + * using a replication plugin. + */ + wp_mkdir_p( dirname( $dst_file ) ); + + $dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), wp_basename( $dst_file ) ); + + $result = $editor->save( $dst_file ); + if ( is_wp_error( $result ) ) { + return $result; + } + + return $dst_file; +} + +/** + * Compare the existing image sub-sizes (as saved in the attachment meta) + * to the currently registered image sub-sizes, and return the difference. + * + * Registered sub-sizes that are larger than the image are skipped. + * + * @since 5.3.0 + * + * @param int $attachment_id The image attachment post ID. + * @return array An array of the image sub-sizes that are currently defined but don't exist for this image. + */ +function wp_get_missing_image_subsizes( $attachment_id ) { + if ( ! wp_attachment_is_image( $attachment_id ) ) { + return array(); + } + + $registered_sizes = wp_get_registered_image_subsizes(); + $image_meta = wp_get_attachment_metadata( $attachment_id ); + + // Meta error? + if ( empty( $image_meta ) ) { + return $registered_sizes; + } + + // Use the originally uploaded image dimensions as full_width and full_height. + if ( ! empty( $image_meta['original_image'] ) ) { + $image_file = wp_get_original_image_path( $attachment_id ); + $imagesize = @getimagesize( $image_file ); + } + + if ( ! empty( $imagesize ) ) { + $full_width = $imagesize[0]; + $full_height = $imagesize[1]; + } else { + $full_width = (int) $image_meta['width']; + $full_height = (int) $image_meta['height']; + } + + $possible_sizes = array(); + + // Skip registered sizes that are too large for the uploaded image. + foreach ( $registered_sizes as $size_name => $size_data ) { + if ( image_resize_dimensions( $full_width, $full_height, $size_data['width'], $size_data['height'], $size_data['crop'] ) ) { + $possible_sizes[ $size_name ] = $size_data; + } + } + + if ( empty( $image_meta['sizes'] ) ) { + $image_meta['sizes'] = array(); + } + + /* + * Remove sizes that already exist. Only checks for matching "size names". + * It is possible that the dimensions for a particular size name have changed. + * For example the user has changed the values on the Settings -> Media screen. + * However we keep the old sub-sizes with the previous dimensions + * as the image may have been used in an older post. + */ + $missing_sizes = array_diff_key( $possible_sizes, $image_meta['sizes'] ); + + /** + * Filters the array of missing image sub-sizes for an uploaded image. + * + * @since 5.3.0 + * + * @param array $missing_sizes Array with the missing image sub-sizes. + * @param array $image_meta The image meta data. + * @param int $attachment_id The image attachment post ID. + */ + return apply_filters( 'wp_get_missing_image_subsizes', $missing_sizes, $image_meta, $attachment_id ); +} + +/** + * If any of the currently registered image sub-sizes are missing, + * create them and update the image meta data. + * + * @since 5.3.0 + * + * @param int $attachment_id The image attachment post ID. + * @return array|WP_Error The updated image meta data array or WP_Error object + * if both the image meta and the attached file are missing. + */ +function wp_update_image_subsizes( $attachment_id ) { + $image_meta = wp_get_attachment_metadata( $attachment_id ); + $image_file = wp_get_original_image_path( $attachment_id ); + + if ( empty( $image_meta ) || ! is_array( $image_meta ) ) { + // Previously failed upload? + // If there is an uploaded file, make all sub-sizes and generate all of the attachment meta. + if ( ! empty( $image_file ) ) { + $image_meta = wp_create_image_subsizes( $image_file, $attachment_id ); + } else { + return new WP_Error( 'invalid_attachment', __( 'The attached file cannot be found.' ) ); + } + } else { + $missing_sizes = wp_get_missing_image_subsizes( $attachment_id ); + + if ( empty( $missing_sizes ) ) { + return $image_meta; + } + + // This also updates the image meta. + $image_meta = _wp_make_subsizes( $missing_sizes, $image_file, $image_meta, $attachment_id ); + } + + /** This filter is documented in wp-admin/includes/image.php */ + $image_meta = apply_filters( 'wp_generate_attachment_metadata', $image_meta, $attachment_id, 'update' ); + + // Save the updated metadata. + wp_update_attachment_metadata( $attachment_id, $image_meta ); + + return $image_meta; +} + +/** + * Updates the attached file and image meta data when the original image was edited. + * + * @since 5.3.0 + * @access private + * + * @param array $saved_data The data returned from WP_Image_Editor after successfully saving an image. + * @param string $original_file Path to the original file. + * @param array $image_meta The image meta data. + * @param int $attachment_id The attachment post ID. + * @return array The updated image meta data. + */ +function _wp_image_meta_replace_original( $saved_data, $original_file, $image_meta, $attachment_id ) { + $new_file = $saved_data['path']; + + // Update the attached file meta. + update_attached_file( $attachment_id, $new_file ); + + // Width and height of the new image. + $image_meta['width'] = $saved_data['width']; + $image_meta['height'] = $saved_data['height']; + + // Make the file path relative to the upload dir. + $image_meta['file'] = _wp_relative_upload_path( $new_file ); + + // Store the original image file name in image_meta. + $image_meta['original_image'] = wp_basename( $original_file ); + + return $image_meta; +} + +/** + * Creates image sub-sizes, adds the new data to the image meta `sizes` array, and updates the image metadata. + * + * Intended for use after an image is uploaded. Saves/updates the image metadata after each + * sub-size is created. If there was an error, it is added to the returned image metadata array. + * + * @since 5.3.0 + * + * @param string $file Full path to the image file. + * @param int $attachment_id Attachment Id to process. + * @return array The image attachment meta data. + */ +function wp_create_image_subsizes( $file, $attachment_id ) { + $imagesize = @getimagesize( $file ); + + if ( empty( $imagesize ) ) { + // File is not an image. + return array(); + } + + // Default image meta. + $image_meta = array( + 'width' => $imagesize[0], + 'height' => $imagesize[1], + 'file' => _wp_relative_upload_path( $file ), + 'sizes' => array(), + ); + + // Fetch additional metadata from EXIF/IPTC. + $exif_meta = wp_read_image_metadata( $file ); + + if ( $exif_meta ) { + $image_meta['image_meta'] = $exif_meta; + } + + // Do not scale (large) PNG images. May result in sub-sizes that have greater file size than the original. See #48736. + if ( 'image/png' !== $imagesize['mime'] ) { + + /** + * Filters the "BIG image" threshold value. + * + * If the original image width or height is above the threshold, it will be scaled down. The threshold is + * used as max width and max height. The scaled down image will be used as the largest available size, including + * the `_wp_attached_file` post meta value. + * + * Returning `false` from the filter callback will disable the scaling. + * + * @since 5.3.0 + * + * @param int $threshold The threshold value in pixels. Default 2560. + * @param array $imagesize { + * Indexed array of the image width and height in pixels. + * + * @type int $0 The image width. + * @type int $1 The image height. + * } + * @param string $file Full path to the uploaded image file. + * @param int $attachment_id Attachment post ID. + */ + $threshold = (int) apply_filters( 'big_image_size_threshold', 2560, $imagesize, $file, $attachment_id ); + + // If the original image's dimensions are over the threshold, + // scale the image and use it as the "full" size. + if ( $threshold && ( $image_meta['width'] > $threshold || $image_meta['height'] > $threshold ) ) { + $editor = wp_get_image_editor( $file ); + + if ( is_wp_error( $editor ) ) { + // This image cannot be edited. + return $image_meta; + } + + // Resize the image. + $resized = $editor->resize( $threshold, $threshold ); + $rotated = null; + + // If there is EXIF data, rotate according to EXIF Orientation. + if ( ! is_wp_error( $resized ) && is_array( $exif_meta ) ) { + $resized = $editor->maybe_exif_rotate(); + $rotated = $resized; + } + + if ( ! is_wp_error( $resized ) ) { + // Append "-scaled" to the image file name. It will look like "my_image-scaled.jpg". + // This doesn't affect the sub-sizes names as they are generated from the original image (for best quality). + $saved = $editor->save( $editor->generate_filename( 'scaled' ) ); + + if ( ! is_wp_error( $saved ) ) { + $image_meta = _wp_image_meta_replace_original( $saved, $file, $image_meta, $attachment_id ); + + // If the image was rotated update the stored EXIF data. + if ( true === $rotated && ! empty( $image_meta['image_meta']['orientation'] ) ) { + $image_meta['image_meta']['orientation'] = 1; + } + } else { + // TODO: Log errors. + } + } else { + // TODO: Log errors. + } + } elseif ( ! empty( $exif_meta['orientation'] ) && 1 !== (int) $exif_meta['orientation'] ) { + // Rotate the whole original image if there is EXIF data and "orientation" is not 1. + + $editor = wp_get_image_editor( $file ); + + if ( is_wp_error( $editor ) ) { + // This image cannot be edited. + return $image_meta; + } + + // Rotate the image. + $rotated = $editor->maybe_exif_rotate(); + + if ( true === $rotated ) { + // Append `-rotated` to the image file name. + $saved = $editor->save( $editor->generate_filename( 'rotated' ) ); + + if ( ! is_wp_error( $saved ) ) { + $image_meta = _wp_image_meta_replace_original( $saved, $file, $image_meta, $attachment_id ); + + // Update the stored EXIF data. + if ( ! empty( $image_meta['image_meta']['orientation'] ) ) { + $image_meta['image_meta']['orientation'] = 1; + } + } else { + // TODO: Log errors. + } + } + } + } + + /* + * Initial save of the new metadata. + * At this point the file was uploaded and moved to the uploads directory + * but the image sub-sizes haven't been created yet and the `sizes` array is empty. + */ + wp_update_attachment_metadata( $attachment_id, $image_meta ); + + $new_sizes = wp_get_registered_image_subsizes(); + + /** + * Filters the image sizes automatically generated when uploading an image. + * + * @since 2.9.0 + * @since 4.4.0 Added the `$image_meta` argument. + * @since 5.3.0 Added the `$attachment_id` argument. + * + * @param array $new_sizes Associative array of image sizes to be created. + * @param array $image_meta The image meta data: width, height, file, sizes, etc. + * @param int $attachment_id The attachment post ID for the image. + */ + $new_sizes = apply_filters( 'intermediate_image_sizes_advanced', $new_sizes, $image_meta, $attachment_id ); + + return _wp_make_subsizes( $new_sizes, $file, $image_meta, $attachment_id ); +} + +/** + * Low-level function to create image sub-sizes. + * + * Updates the image meta after each sub-size is created. + * Errors are stored in the returned image metadata array. + * + * @since 5.3.0 + * @access private + * + * @param array $new_sizes Array defining what sizes to create. + * @param string $file Full path to the image file. + * @param array $image_meta The attachment meta data array. + * @param int $attachment_id Attachment Id to process. + * @return array The attachment meta data with updated `sizes` array. Includes an array of errors encountered while resizing. + */ +function _wp_make_subsizes( $new_sizes, $file, $image_meta, $attachment_id ) { + if ( empty( $image_meta ) || ! is_array( $image_meta ) ) { + // Not an image attachment. + return array(); + } + + // Check if any of the new sizes already exist. + if ( isset( $image_meta['sizes'] ) && is_array( $image_meta['sizes'] ) ) { + foreach ( $image_meta['sizes'] as $size_name => $size_meta ) { + /* + * Only checks "size name" so we don't override existing images even if the dimensions + * don't match the currently defined size with the same name. + * To change the behavior, unset changed/mismatched sizes in the `sizes` array in image meta. + */ + if ( array_key_exists( $size_name, $new_sizes ) ) { + unset( $new_sizes[ $size_name ] ); + } + } + } else { + $image_meta['sizes'] = array(); + } + + if ( empty( $new_sizes ) ) { + // Nothing to do... + return $image_meta; + } + + /* + * Sort the image sub-sizes in order of priority when creating them. + * This ensures there is an appropriate sub-size the user can access immediately + * even when there was an error and not all sub-sizes were created. + */ + $priority = array( + 'medium' => null, + 'large' => null, + 'thumbnail' => null, + 'medium_large' => null, + ); + + $new_sizes = array_filter( array_merge( $priority, $new_sizes ) ); + + $editor = wp_get_image_editor( $file ); + + if ( is_wp_error( $editor ) ) { + // The image cannot be edited. + return $image_meta; + } + + // If stored EXIF data exists, rotate the source image before creating sub-sizes. + if ( ! empty( $image_meta['image_meta'] ) ) { + $rotated = $editor->maybe_exif_rotate(); + + if ( is_wp_error( $rotated ) ) { + // TODO: Log errors. + } + } + + if ( method_exists( $editor, 'make_subsize' ) ) { + foreach ( $new_sizes as $new_size_name => $new_size_data ) { + $new_size_meta = $editor->make_subsize( $new_size_data ); + + if ( is_wp_error( $new_size_meta ) ) { + // TODO: Log errors. + } else { + // Save the size meta value. + $image_meta['sizes'][ $new_size_name ] = $new_size_meta; + wp_update_attachment_metadata( $attachment_id, $image_meta ); + } + } + } else { + // Fall back to `$editor->multi_resize()`. + $created_sizes = $editor->multi_resize( $new_sizes ); + + if ( ! empty( $created_sizes ) ) { + $image_meta['sizes'] = array_merge( $image_meta['sizes'], $created_sizes ); + wp_update_attachment_metadata( $attachment_id, $image_meta ); + } + } + + return $image_meta; +} + +/** + * Generate attachment meta data and create image sub-sizes for images. + * + * @since 2.1.0 + * + * @param int $attachment_id Attachment Id to process. + * @param string $file Filepath of the Attached image. + * @return mixed Metadata for attachment. + */ +function wp_generate_attachment_metadata( $attachment_id, $file ) { + $attachment = get_post( $attachment_id ); + + $metadata = array(); + $support = false; + $mime_type = get_post_mime_type( $attachment ); + + if ( preg_match( '!^image/!', $mime_type ) && file_is_displayable_image( $file ) ) { + // Make thumbnails and other intermediate sizes. + $metadata = wp_create_image_subsizes( $file, $attachment_id ); + } elseif ( wp_attachment_is( 'video', $attachment ) ) { + $metadata = wp_read_video_metadata( $file ); + $support = current_theme_supports( 'post-thumbnails', 'attachment:video' ) || post_type_supports( 'attachment:video', 'thumbnail' ); + } elseif ( wp_attachment_is( 'audio', $attachment ) ) { + $metadata = wp_read_audio_metadata( $file ); + $support = current_theme_supports( 'post-thumbnails', 'attachment:audio' ) || post_type_supports( 'attachment:audio', 'thumbnail' ); + } + + if ( $support && ! empty( $metadata['image']['data'] ) ) { + // Check for existing cover. + $hash = md5( $metadata['image']['data'] ); + $posts = get_posts( + array( + 'fields' => 'ids', + 'post_type' => 'attachment', + 'post_mime_type' => $metadata['image']['mime'], + 'post_status' => 'inherit', + 'posts_per_page' => 1, + 'meta_key' => '_cover_hash', + 'meta_value' => $hash, + ) + ); + $exists = reset( $posts ); + + if ( ! empty( $exists ) ) { + update_post_meta( $attachment_id, '_thumbnail_id', $exists ); + } else { + $ext = '.jpg'; + switch ( $metadata['image']['mime'] ) { + case 'image/gif': + $ext = '.gif'; + break; + case 'image/png': + $ext = '.png'; + break; + } + $basename = str_replace( '.', '-', wp_basename( $file ) ) . '-image' . $ext; + $uploaded = wp_upload_bits( $basename, '', $metadata['image']['data'] ); + if ( false === $uploaded['error'] ) { + $image_attachment = array( + 'post_mime_type' => $metadata['image']['mime'], + 'post_type' => 'attachment', + 'post_content' => '', + ); + /** + * Filters the parameters for the attachment thumbnail creation. + * + * @since 3.9.0 + * + * @param array $image_attachment An array of parameters to create the thumbnail. + * @param array $metadata Current attachment metadata. + * @param array $uploaded An array containing the thumbnail path and url. + */ + $image_attachment = apply_filters( 'attachment_thumbnail_args', $image_attachment, $metadata, $uploaded ); + + $sub_attachment_id = wp_insert_attachment( $image_attachment, $uploaded['file'] ); + add_post_meta( $sub_attachment_id, '_cover_hash', $hash ); + $attach_data = wp_generate_attachment_metadata( $sub_attachment_id, $uploaded['file'] ); + wp_update_attachment_metadata( $sub_attachment_id, $attach_data ); + update_post_meta( $attachment_id, '_thumbnail_id', $sub_attachment_id ); + } + } + } elseif ( 'application/pdf' === $mime_type ) { + // Try to create image thumbnails for PDFs. + + $fallback_sizes = array( + 'thumbnail', + 'medium', + 'large', + ); + + /** + * Filters the image sizes generated for non-image mime types. + * + * @since 4.7.0 + * + * @param string[] $fallback_sizes An array of image size names. + * @param array $metadata Current attachment metadata. + */ + $fallback_sizes = apply_filters( 'fallback_intermediate_image_sizes', $fallback_sizes, $metadata ); + + $registered_sizes = wp_get_registered_image_subsizes(); + $merged_sizes = array_intersect_key( $registered_sizes, array_flip( $fallback_sizes ) ); + + // Force thumbnails to be soft crops. + if ( isset( $merged_sizes['thumbnail'] ) && is_array( $merged_sizes['thumbnail'] ) ) { + $merged_sizes['thumbnail']['crop'] = false; + } + + // Only load PDFs in an image editor if we're processing sizes. + if ( ! empty( $merged_sizes ) ) { + $editor = wp_get_image_editor( $file ); + + if ( ! is_wp_error( $editor ) ) { // No support for this type of file. + /* + * PDFs may have the same file filename as JPEGs. + * Ensure the PDF preview image does not overwrite any JPEG images that already exist. + */ + $dirname = dirname( $file ) . '/'; + $ext = '.' . pathinfo( $file, PATHINFO_EXTENSION ); + $preview_file = $dirname . wp_unique_filename( $dirname, wp_basename( $file, $ext ) . '-pdf.jpg' ); + + $uploaded = $editor->save( $preview_file, 'image/jpeg' ); + unset( $editor ); + + // Resize based on the full size image, rather than the source. + if ( ! is_wp_error( $uploaded ) ) { + $image_file = $uploaded['path']; + unset( $uploaded['path'] ); + + $metadata['sizes'] = array( + 'full' => $uploaded, + ); + + // Save the meta data before any image post-processing errors could happen. + wp_update_attachment_metadata( $attachment_id, $metadata ); + + // Create sub-sizes saving the image meta after each. + $metadata = _wp_make_subsizes( $merged_sizes, $image_file, $metadata, $attachment_id ); + } + } + } + } + + // Remove the blob of binary data from the array. + if ( $metadata ) { + unset( $metadata['image']['data'] ); + } + + /** + * Filters the generated attachment meta data. + * + * @since 2.1.0 + * @since 5.3.0 The `$context` parameter was added. + * + * @param array $metadata An array of attachment meta data. + * @param int $attachment_id Current attachment ID. + * @param string $context Additional context. Can be 'create' when metadata was initially created for new attachment + * or 'update' when the metadata was updated. + */ + return apply_filters( 'wp_generate_attachment_metadata', $metadata, $attachment_id, 'create' ); +} + +/** + * Convert a fraction string to a decimal. + * + * @since 2.5.0 + * + * @param string $str + * @return int|float + */ +function wp_exif_frac2dec( $str ) { + if ( false === strpos( $str, '/' ) ) { + return $str; + } + + list( $numerator, $denominator ) = explode( '/', $str ); + if ( ! empty( $denominator ) ) { + return $numerator / $denominator; + } + return $str; +} + +/** + * Convert the exif date format to a unix timestamp. + * + * @since 2.5.0 + * + * @param string $str + * @return int + */ +function wp_exif_date2ts( $str ) { + list( $date, $time ) = explode( ' ', trim( $str ) ); + list( $y, $m, $d ) = explode( ':', $date ); + + return strtotime( "{$y}-{$m}-{$d} {$time}" ); +} + +/** + * Get extended image metadata, exif or iptc as available. + * + * Retrieves the EXIF metadata aperture, credit, camera, caption, copyright, iso + * created_timestamp, focal_length, shutter_speed, and title. + * + * The IPTC metadata that is retrieved is APP13, credit, byline, created date + * and time, caption, copyright, and title. Also includes FNumber, Model, + * DateTimeDigitized, FocalLength, ISOSpeedRatings, and ExposureTime. + * + * @todo Try other exif libraries if available. + * @since 2.5.0 + * + * @param string $file + * @return bool|array False on failure. Image metadata array on success. + */ +function wp_read_image_metadata( $file ) { + if ( ! file_exists( $file ) ) { + return false; + } + + list( , , $image_type ) = @getimagesize( $file ); + + /* + * EXIF contains a bunch of data we'll probably never need formatted in ways + * that are difficult to use. We'll normalize it and just extract the fields + * that are likely to be useful. Fractions and numbers are converted to + * floats, dates to unix timestamps, and everything else to strings. + */ + $meta = array( + 'aperture' => 0, + 'credit' => '', + 'camera' => '', + 'caption' => '', + 'created_timestamp' => 0, + 'copyright' => '', + 'focal_length' => 0, + 'iso' => 0, + 'shutter_speed' => 0, + 'title' => '', + 'orientation' => 0, + 'keywords' => array(), + ); + + $iptc = array(); + /* + * Read IPTC first, since it might contain data not available in exif such + * as caption, description etc. + */ + if ( is_callable( 'iptcparse' ) ) { + @getimagesize( $file, $info ); + + if ( ! empty( $info['APP13'] ) ) { + $iptc = @iptcparse( $info['APP13'] ); + + // Headline, "A brief synopsis of the caption". + if ( ! empty( $iptc['2#105'][0] ) ) { + $meta['title'] = trim( $iptc['2#105'][0] ); + /* + * Title, "Many use the Title field to store the filename of the image, + * though the field may be used in many ways". + */ + } elseif ( ! empty( $iptc['2#005'][0] ) ) { + $meta['title'] = trim( $iptc['2#005'][0] ); + } + + if ( ! empty( $iptc['2#120'][0] ) ) { // Description / legacy caption. + $caption = trim( $iptc['2#120'][0] ); + + mbstring_binary_safe_encoding(); + $caption_length = strlen( $caption ); + reset_mbstring_encoding(); + + if ( empty( $meta['title'] ) && $caption_length < 80 ) { + // Assume the title is stored in 2:120 if it's short. + $meta['title'] = $caption; + } + + $meta['caption'] = $caption; + } + + if ( ! empty( $iptc['2#110'][0] ) ) { // Credit. + $meta['credit'] = trim( $iptc['2#110'][0] ); + } elseif ( ! empty( $iptc['2#080'][0] ) ) { // Creator / legacy byline. + $meta['credit'] = trim( $iptc['2#080'][0] ); + } + + if ( ! empty( $iptc['2#055'][0] ) && ! empty( $iptc['2#060'][0] ) ) { // Created date and time. + $meta['created_timestamp'] = strtotime( $iptc['2#055'][0] . ' ' . $iptc['2#060'][0] ); + } + + if ( ! empty( $iptc['2#116'][0] ) ) { // Copyright. + $meta['copyright'] = trim( $iptc['2#116'][0] ); + } + + if ( ! empty( $iptc['2#025'][0] ) ) { // Keywords array. + $meta['keywords'] = array_values( $iptc['2#025'] ); + } + } + } + + $exif = array(); + + /** + * Filters the image types to check for exif data. + * + * @since 2.5.0 + * + * @param array $image_types Image types to check for exif data. + */ + $exif_image_types = apply_filters( 'wp_read_image_metadata_types', array( IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM ) ); + + if ( is_callable( 'exif_read_data' ) && in_array( $image_type, $exif_image_types, true ) ) { + $exif = @exif_read_data( $file ); + + if ( ! empty( $exif['ImageDescription'] ) ) { + mbstring_binary_safe_encoding(); + $description_length = strlen( $exif['ImageDescription'] ); + reset_mbstring_encoding(); + + if ( empty( $meta['title'] ) && $description_length < 80 ) { + // Assume the title is stored in ImageDescription. + $meta['title'] = trim( $exif['ImageDescription'] ); + } + + if ( empty( $meta['caption'] ) && ! empty( $exif['COMPUTED']['UserComment'] ) ) { + $meta['caption'] = trim( $exif['COMPUTED']['UserComment'] ); + } + + if ( empty( $meta['caption'] ) ) { + $meta['caption'] = trim( $exif['ImageDescription'] ); + } + } elseif ( empty( $meta['caption'] ) && ! empty( $exif['Comments'] ) ) { + $meta['caption'] = trim( $exif['Comments'] ); + } + + if ( empty( $meta['credit'] ) ) { + if ( ! empty( $exif['Artist'] ) ) { + $meta['credit'] = trim( $exif['Artist'] ); + } elseif ( ! empty( $exif['Author'] ) ) { + $meta['credit'] = trim( $exif['Author'] ); + } + } + + if ( empty( $meta['copyright'] ) && ! empty( $exif['Copyright'] ) ) { + $meta['copyright'] = trim( $exif['Copyright'] ); + } + if ( ! empty( $exif['FNumber'] ) ) { + $meta['aperture'] = round( wp_exif_frac2dec( $exif['FNumber'] ), 2 ); + } + if ( ! empty( $exif['Model'] ) ) { + $meta['camera'] = trim( $exif['Model'] ); + } + if ( empty( $meta['created_timestamp'] ) && ! empty( $exif['DateTimeDigitized'] ) ) { + $meta['created_timestamp'] = wp_exif_date2ts( $exif['DateTimeDigitized'] ); + } + if ( ! empty( $exif['FocalLength'] ) ) { + $meta['focal_length'] = (string) wp_exif_frac2dec( $exif['FocalLength'] ); + } + if ( ! empty( $exif['ISOSpeedRatings'] ) ) { + $meta['iso'] = is_array( $exif['ISOSpeedRatings'] ) ? reset( $exif['ISOSpeedRatings'] ) : $exif['ISOSpeedRatings']; + $meta['iso'] = trim( $meta['iso'] ); + } + if ( ! empty( $exif['ExposureTime'] ) ) { + $meta['shutter_speed'] = (string) wp_exif_frac2dec( $exif['ExposureTime'] ); + } + if ( ! empty( $exif['Orientation'] ) ) { + $meta['orientation'] = $exif['Orientation']; + } + } + + foreach ( array( 'title', 'caption', 'credit', 'copyright', 'camera', 'iso' ) as $key ) { + if ( $meta[ $key ] && ! seems_utf8( $meta[ $key ] ) ) { + $meta[ $key ] = utf8_encode( $meta[ $key ] ); + } + } + + foreach ( $meta['keywords'] as $key => $keyword ) { + if ( ! seems_utf8( $keyword ) ) { + $meta['keywords'][ $key ] = utf8_encode( $keyword ); + } + } + + $meta = wp_kses_post_deep( $meta ); + + /** + * Filters the array of meta data read from an image's exif data. + * + * @since 2.5.0 + * @since 4.4.0 The `$iptc` parameter was added. + * @since 5.0.0 The `$exif` parameter was added. + * + * @param array $meta Image meta data. + * @param string $file Path to image file. + * @param int $image_type Type of image, one of the `IMAGETYPE_XXX` constants. + * @param array $iptc IPTC data. + * @param array $exif EXIF data. + */ + return apply_filters( 'wp_read_image_metadata', $meta, $file, $image_type, $iptc, $exif ); + +} + +/** + * Validate that file is an image. + * + * @since 2.5.0 + * + * @param string $path File path to test if valid image. + * @return bool True if valid image, false if not valid image. + */ +function file_is_valid_image( $path ) { + $size = @getimagesize( $path ); + return ! empty( $size ); +} + +/** + * Validate that file is suitable for displaying within a web page. + * + * @since 2.5.0 + * + * @param string $path File path to test. + * @return bool True if suitable, false if not suitable. + */ +function file_is_displayable_image( $path ) { + $displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP, IMAGETYPE_ICO ); + + $info = @getimagesize( $path ); + if ( empty( $info ) ) { + $result = false; + } elseif ( ! in_array( $info[2], $displayable_image_types, true ) ) { + $result = false; + } else { + $result = true; + } + + /** + * Filters whether the current image is displayable in the browser. + * + * @since 2.5.0 + * + * @param bool $result Whether the image can be displayed. Default true. + * @param string $path Path to the image. + */ + return apply_filters( 'file_is_displayable_image', $result, $path ); +} + +/** + * Load an image resource for editing. + * + * @since 2.9.0 + * + * @param string $attachment_id Attachment ID. + * @param string $mime_type Image mime type. + * @param string $size Optional. Image size, defaults to 'full'. + * @return resource|false The resulting image resource on success, false on failure. + */ +function load_image_to_edit( $attachment_id, $mime_type, $size = 'full' ) { + $filepath = _load_image_to_edit_path( $attachment_id, $size ); + if ( empty( $filepath ) ) { + return false; + } + + switch ( $mime_type ) { + case 'image/jpeg': + $image = imagecreatefromjpeg( $filepath ); + break; + case 'image/png': + $image = imagecreatefrompng( $filepath ); + break; + case 'image/gif': + $image = imagecreatefromgif( $filepath ); + break; + default: + $image = false; + break; + } + if ( is_resource( $image ) ) { + /** + * Filters the current image being loaded for editing. + * + * @since 2.9.0 + * + * @param resource $image Current image. + * @param string $attachment_id Attachment ID. + * @param string $size Image size. + */ + $image = apply_filters( 'load_image_to_edit', $image, $attachment_id, $size ); + if ( function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) { + imagealphablending( $image, false ); + imagesavealpha( $image, true ); + } + } + return $image; +} + +/** + * Retrieve the path or url of an attachment's attached file. + * + * If the attached file is not present on the local filesystem (usually due to replication plugins), + * then the url of the file is returned if url fopen is supported. + * + * @since 3.4.0 + * @access private + * + * @param string $attachment_id Attachment ID. + * @param string $size Optional. Image size, defaults to 'full'. + * @return string|false File path or url on success, false on failure. + */ +function _load_image_to_edit_path( $attachment_id, $size = 'full' ) { + $filepath = get_attached_file( $attachment_id ); + + if ( $filepath && file_exists( $filepath ) ) { + if ( 'full' !== $size ) { + $data = image_get_intermediate_size( $attachment_id, $size ); + + if ( $data ) { + $filepath = path_join( dirname( $filepath ), $data['file'] ); + + /** + * Filters the path to the current image. + * + * The filter is evaluated for all image sizes except 'full'. + * + * @since 3.1.0 + * + * @param string $path Path to the current image. + * @param string $attachment_id Attachment ID. + * @param string $size Size of the image. + */ + $filepath = apply_filters( 'load_image_to_edit_filesystempath', $filepath, $attachment_id, $size ); + } + } + } elseif ( function_exists( 'fopen' ) && ini_get( 'allow_url_fopen' ) ) { + /** + * Filters the image URL if not in the local filesystem. + * + * The filter is only evaluated if fopen is enabled on the server. + * + * @since 3.1.0 + * + * @param string $image_url Current image URL. + * @param string $attachment_id Attachment ID. + * @param string $size Size of the image. + */ + $filepath = apply_filters( 'load_image_to_edit_attachmenturl', wp_get_attachment_url( $attachment_id ), $attachment_id, $size ); + } + + /** + * Filters the returned path or URL of the current image. + * + * @since 2.9.0 + * + * @param string|bool $filepath File path or URL to current image, or false. + * @param string $attachment_id Attachment ID. + * @param string $size Size of the image. + */ + return apply_filters( 'load_image_to_edit_path', $filepath, $attachment_id, $size ); +} + +/** + * Copy an existing image file. + * + * @since 3.4.0 + * @access private + * + * @param string $attachment_id Attachment ID. + * @return string|false New file path on success, false on failure. + */ +function _copy_image_file( $attachment_id ) { + $dst_file = get_attached_file( $attachment_id ); + $src_file = $dst_file; + + if ( ! file_exists( $src_file ) ) { + $src_file = _load_image_to_edit_path( $attachment_id ); + } + + if ( $src_file ) { + $dst_file = str_replace( wp_basename( $dst_file ), 'copy-' . wp_basename( $dst_file ), $dst_file ); + $dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), wp_basename( $dst_file ) ); + + /* + * The directory containing the original file may no longer + * exist when using a replication plugin. + */ + wp_mkdir_p( dirname( $dst_file ) ); + + if ( ! copy( $src_file, $dst_file ) ) { + $dst_file = false; + } + } else { + $dst_file = false; + } + + return $dst_file; +} diff --git a/wp-admin/includes/import.php b/wp-admin/includes/import.php new file mode 100644 index 0000000..b210043 --- /dev/null +++ b/wp-admin/includes/import.php @@ -0,0 +1,232 @@ + sprintf( + /* translators: 1: php.ini, 2: post_max_size, 3: upload_max_filesize */ + __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your %1$s file or by %2$s being defined as smaller than %3$s in %1$s.' ), + 'php.ini', + 'post_max_size', + 'upload_max_filesize' + ), + ); + } + + $overrides = array( + 'test_form' => false, + 'test_type' => false, + ); + $_FILES['import']['name'] .= '.txt'; + $upload = wp_handle_upload( $_FILES['import'], $overrides ); + + if ( isset( $upload['error'] ) ) { + return $upload; + } + + // Construct the object array. + $object = array( + 'post_title' => wp_basename( $upload['file'] ), + 'post_content' => $upload['url'], + 'post_mime_type' => $upload['type'], + 'guid' => $upload['url'], + 'context' => 'import', + 'post_status' => 'private', + ); + + // Save the data. + $id = wp_insert_attachment( $object, $upload['file'] ); + + /* + * Schedule a cleanup for one day from now in case of failed + * import or missing wp_import_cleanup() call. + */ + wp_schedule_single_event( time() + DAY_IN_SECONDS, 'importer_scheduled_cleanup', array( $id ) ); + + return array( + 'file' => $upload['file'], + 'id' => $id, + ); +} + +/** + * Returns a list from WordPress.org of popular importer plugins. + * + * @since 3.5.0 + * + * @return array Importers with metadata for each. + */ +function wp_get_popular_importers() { + // Include an unmodified $wp_version. + require ABSPATH . WPINC . '/version.php'; + + $locale = get_user_locale(); + $cache_key = 'popular_importers_' . md5( $locale . $wp_version ); + $popular_importers = get_site_transient( $cache_key ); + + if ( ! $popular_importers ) { + $url = add_query_arg( + array( + 'locale' => $locale, + 'version' => $wp_version, + ), + 'http://api.wordpress.org/core/importers/1.1/' + ); + $options = array( 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ) ); + + if ( wp_http_supports( array( 'ssl' ) ) ) { + $url = set_url_scheme( $url, 'https' ); + } + + $response = wp_remote_get( $url, $options ); + $popular_importers = json_decode( wp_remote_retrieve_body( $response ), true ); + + if ( is_array( $popular_importers ) ) { + set_site_transient( $cache_key, $popular_importers, 2 * DAY_IN_SECONDS ); + } else { + $popular_importers = false; + } + } + + if ( is_array( $popular_importers ) ) { + // If the data was received as translated, return it as-is. + if ( $popular_importers['translated'] ) { + return $popular_importers['importers']; + } + + foreach ( $popular_importers['importers'] as &$importer ) { + // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText + $importer['description'] = translate( $importer['description'] ); + if ( 'WordPress' !== $importer['name'] ) { + // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText + $importer['name'] = translate( $importer['name'] ); + } + } + return $popular_importers['importers']; + } + + return array( + // slug => name, description, plugin slug, and register_importer() slug. + 'blogger' => array( + 'name' => __( 'Blogger' ), + 'description' => __( 'Import posts, comments, and users from a Blogger blog.' ), + 'plugin-slug' => 'blogger-importer', + 'importer-id' => 'blogger', + ), + 'wpcat2tag' => array( + 'name' => __( 'Categories and Tags Converter' ), + 'description' => __( 'Convert existing categories to tags or tags to categories, selectively.' ), + 'plugin-slug' => 'wpcat2tag-importer', + 'importer-id' => 'wp-cat2tag', + ), + 'livejournal' => array( + 'name' => __( 'LiveJournal' ), + 'description' => __( 'Import posts from LiveJournal using their API.' ), + 'plugin-slug' => 'livejournal-importer', + 'importer-id' => 'livejournal', + ), + 'movabletype' => array( + 'name' => __( 'Movable Type and TypePad' ), + 'description' => __( 'Import posts and comments from a Movable Type or TypePad blog.' ), + 'plugin-slug' => 'movabletype-importer', + 'importer-id' => 'mt', + ), + 'rss' => array( + 'name' => __( 'RSS' ), + 'description' => __( 'Import posts from an RSS feed.' ), + 'plugin-slug' => 'rss-importer', + 'importer-id' => 'rss', + ), + 'tumblr' => array( + 'name' => __( 'Tumblr' ), + 'description' => __( 'Import posts & media from Tumblr using their API.' ), + 'plugin-slug' => 'tumblr-importer', + 'importer-id' => 'tumblr', + ), + 'wordpress' => array( + 'name' => 'WordPress', + 'description' => __( 'Import posts, pages, comments, custom fields, categories, and tags from a WordPress export file.' ), + 'plugin-slug' => 'wordpress-importer', + 'importer-id' => 'wordpress', + ), + ); +} diff --git a/wp-admin/includes/list-table.php b/wp-admin/includes/list-table.php new file mode 100644 index 0000000..dce5eef --- /dev/null +++ b/wp-admin/includes/list-table.php @@ -0,0 +1,93 @@ + 'posts', + 'WP_Media_List_Table' => 'media', + 'WP_Terms_List_Table' => 'terms', + 'WP_Users_List_Table' => 'users', + 'WP_Comments_List_Table' => 'comments', + 'WP_Post_Comments_List_Table' => array( 'comments', 'post-comments' ), + 'WP_Links_List_Table' => 'links', + 'WP_Plugin_Install_List_Table' => 'plugin-install', + 'WP_Themes_List_Table' => 'themes', + 'WP_Theme_Install_List_Table' => array( 'themes', 'theme-install' ), + 'WP_Plugins_List_Table' => 'plugins', + + // Network Admin. + 'WP_MS_Sites_List_Table' => 'ms-sites', + 'WP_MS_Users_List_Table' => 'ms-users', + 'WP_MS_Themes_List_Table' => 'ms-themes', + + // Privacy requests tables. + 'WP_Privacy_Data_Export_Requests_List_Table' => 'privacy-data-export-requests', + 'WP_Privacy_Data_Removal_Requests_List_Table' => 'privacy-data-removal-requests', + ); + + if ( isset( $core_classes[ $class ] ) ) { + foreach ( (array) $core_classes[ $class ] as $required ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-' . $required . '-list-table.php'; + } + + if ( isset( $args['screen'] ) ) { + $args['screen'] = convert_to_screen( $args['screen'] ); + } elseif ( isset( $GLOBALS['hook_suffix'] ) ) { + $args['screen'] = get_current_screen(); + } else { + $args['screen'] = null; + } + + return new $class( $args ); + } + + return false; +} + +/** + * Register column headers for a particular screen. + * + * @see get_column_headers(), print_column_headers(), get_hidden_columns() + * + * @since 2.7.0 + * + * @param string $screen The handle for the screen to add help to. This is usually the hook name returned by the + * add_*_page() functions. + * @param string[] $columns An array of columns with column IDs as the keys and translated column names as the values. + */ +function register_column_headers( $screen, $columns ) { + new _WP_List_Table_Compat( $screen, $columns ); +} + +/** + * Prints column headers for a particular screen. + * + * @since 2.7.0 + * + * @param string|WP_Screen $screen The screen hook name or screen object. + * @param bool $with_id Whether to set the id attribute or not. + */ +function print_column_headers( $screen, $with_id = true ) { + $wp_list_table = new _WP_List_Table_Compat( $screen ); + + $wp_list_table->print_column_headers( $with_id ); +} diff --git a/wp-admin/includes/media.php b/wp-admin/includes/media.php new file mode 100644 index 0000000..f6a785e --- /dev/null +++ b/wp-admin/includes/media.php @@ -0,0 +1,3747 @@ + __( 'From Computer' ), // Handler action suffix => tab text. + 'type_url' => __( 'From URL' ), + 'gallery' => __( 'Gallery' ), + 'library' => __( 'Media Library' ), + ); + + /** + * Filters the available tabs in the legacy (pre-3.5.0) media popup. + * + * @since 2.5.0 + * + * @param string[] $_default_tabs An array of media tabs. + */ + return apply_filters( 'media_upload_tabs', $_default_tabs ); +} + +/** + * Adds the gallery tab back to the tabs array if post has image attachments + * + * @since 2.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $tabs + * @return array $tabs with gallery if post has image attachment + */ +function update_gallery_tab( $tabs ) { + global $wpdb; + + if ( ! isset( $_REQUEST['post_id'] ) ) { + unset( $tabs['gallery'] ); + return $tabs; + } + + $post_id = intval( $_REQUEST['post_id'] ); + + if ( $post_id ) { + $attachments = intval( $wpdb->get_var( $wpdb->prepare( "SELECT count(*) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent = %d", $post_id ) ) ); + } + + if ( empty( $attachments ) ) { + unset( $tabs['gallery'] ); + return $tabs; + } + + /* translators: %s: Number of attachments. */ + $tabs['gallery'] = sprintf( __( 'Gallery (%s)' ), "$attachments" ); + + return $tabs; +} + +/** + * Outputs the legacy media upload tabs UI. + * + * @since 2.5.0 + * + * @global string $redir_tab + */ +function the_media_upload_tabs() { + global $redir_tab; + $tabs = media_upload_tabs(); + $default = 'type'; + + if ( ! empty( $tabs ) ) { + echo "
          \n"; + + if ( isset( $redir_tab ) && array_key_exists( $redir_tab, $tabs ) ) { + $current = $redir_tab; + } elseif ( isset( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $tabs ) ) { + $current = $_GET['tab']; + } else { + /** This filter is documented in wp-admin/media-upload.php */ + $current = apply_filters( 'media_upload_default_tab', $default ); + } + + foreach ( $tabs as $callback => $text ) { + $class = ''; + + if ( $current == $callback ) { + $class = " class='current'"; + } + + $href = add_query_arg( + array( + 'tab' => $callback, + 's' => false, + 'paged' => false, + 'post_mime_type' => false, + 'm' => false, + ) + ); + $link = "$text"; + echo "\t
        • $link
        • \n"; + } + + echo "
        \n"; + } +} + +/** + * Retrieves the image HTML to send to the editor. + * + * @since 2.5.0 + * + * @param int $id Image attachment id. + * @param string $caption Image caption. + * @param string $title Image title attribute. + * @param string $align Image CSS alignment property. + * @param string $url Optional. Image src URL. Default empty. + * @param bool|string $rel Optional. Value for rel attribute or whether to add a default value. Default false. + * @param string|array $size Optional. Image size. Accepts any valid image size, or an array of width + * and height values in pixels (in that order). Default 'medium'. + * @param string $alt Optional. Image alt attribute. Default empty. + * @return string The HTML output to insert into the editor. + */ +function get_image_send_to_editor( $id, $caption, $title, $align, $url = '', $rel = false, $size = 'medium', $alt = '' ) { + + $html = get_image_tag( $id, $alt, '', $align, $size ); + + if ( $rel ) { + if ( is_string( $rel ) ) { + $rel = ' rel="' . esc_attr( $rel ) . '"'; + } else { + $rel = ' rel="attachment wp-att-' . intval( $id ) . '"'; + } + } else { + $rel = ''; + } + + if ( $url ) { + $html = '' . $html . ''; + } + + /** + * Filters the image HTML markup to send to the editor when inserting an image. + * + * @since 2.5.0 + * + * @param string $html The image HTML markup to send. + * @param int $id The attachment id. + * @param string $caption The image caption. + * @param string $title The image title. + * @param string $align The image alignment. + * @param string $url The image source URL. + * @param string|array $size Size of image. Image size or array of width and height values + * (in that order). Default 'medium'. + * @param string $alt The image alternative, or alt, text. + */ + $html = apply_filters( 'image_send_to_editor', $html, $id, $caption, $title, $align, $url, $size, $alt ); + + return $html; +} + +/** + * Adds image shortcode with caption to editor + * + * @since 2.6.0 + * + * @param string $html The image HTML markup to send. + * @param integer $id Image attachment ID. + * @param string $caption Image caption. + * @param string $title Image title attribute (not used). + * @param string $align Image CSS alignment property. + * @param string $url Image source URL (not used). + * @param string $size Image size (`thumbnail`, `medium`, `large`, `full`, or added with `add_image_size()`) (not used). + * @param string $alt Image `alt` attribute (not used). + * @return string The image HTML markup with caption shortcode. + */ +function image_add_caption( $html, $id, $caption, $title, $align, $url, $size, $alt = '' ) { + + /** + * Filters the caption text. + * + * Note: If the caption text is empty, the caption shortcode will not be appended + * to the image HTML when inserted into the editor. + * + * Passing an empty value also prevents the {@see 'image_add_caption_shortcode'} + * Filters from being evaluated at the end of image_add_caption(). + * + * @since 4.1.0 + * + * @param string $caption The original caption text. + * @param int $id The attachment ID. + */ + $caption = apply_filters( 'image_add_caption_text', $caption, $id ); + + /** + * Filters whether to disable captions. + * + * Prevents image captions from being appended to image HTML when inserted into the editor. + * + * @since 2.6.0 + * + * @param bool $bool Whether to disable appending captions. Returning true to the filter + * will disable captions. Default empty string. + */ + if ( empty( $caption ) || apply_filters( 'disable_captions', '' ) ) { + return $html; + } + + $id = ( 0 < (int) $id ) ? 'attachment_' . $id : ''; + + if ( ! preg_match( '/width=["\']([0-9]+)/', $html, $matches ) ) { + return $html; + } + + $width = $matches[1]; + + $caption = str_replace( array( "\r\n", "\r" ), "\n", $caption ); + $caption = preg_replace_callback( '/<[a-zA-Z0-9]+(?: [^<>]+>)*/', '_cleanup_image_add_caption', $caption ); + + // Convert any remaining line breaks to
        . + $caption = preg_replace( '/[ \n\t]*\n[ \t]*/', '
        ', $caption ); + + $html = preg_replace( '/(class=["\'][^\'"]*)align(none|left|right|center)\s?/', '$1', $html ); + if ( empty( $align ) ) { + $align = 'none'; + } + + $shcode = '[caption id="' . $id . '" align="align' . $align . '" width="' . $width . '"]' . $html . ' ' . $caption . '[/caption]'; + + /** + * Filters the image HTML markup including the caption shortcode. + * + * @since 2.6.0 + * + * @param string $shcode The image HTML markup with caption shortcode. + * @param string $html The image HTML markup. + */ + return apply_filters( 'image_add_caption_shortcode', $shcode, $html ); +} + +/** + * Private preg_replace callback used in image_add_caption() + * + * @access private + * @since 3.4.0 + */ +function _cleanup_image_add_caption( $matches ) { + // Remove any line breaks from inside the tags. + return preg_replace( '/[\r\n\t]+/', ' ', $matches[0] ); +} + +/** + * Adds image html to editor + * + * @since 2.5.0 + * + * @param string $html + */ +function media_send_to_editor( $html ) { + ?> + + false ) ) { + $time = current_time( 'mysql' ); + $post = get_post( $post_id ); + + if ( $post ) { + // The post date doesn't usually matter for pages, so don't backdate this upload. + if ( 'page' !== $post->post_type && substr( $post->post_date, 0, 4 ) > 0 ) { + $time = $post->post_date; + } + } + + $file = wp_handle_upload( $_FILES[ $file_id ], $overrides, $time ); + + if ( isset( $file['error'] ) ) { + return new WP_Error( 'upload_error', $file['error'] ); + } + + $name = $_FILES[ $file_id ]['name']; + $ext = pathinfo( $name, PATHINFO_EXTENSION ); + $name = wp_basename( $name, ".$ext" ); + + $url = $file['url']; + $type = $file['type']; + $file = $file['file']; + $title = sanitize_text_field( $name ); + $content = ''; + $excerpt = ''; + + if ( preg_match( '#^audio#', $type ) ) { + $meta = wp_read_audio_metadata( $file ); + + if ( ! empty( $meta['title'] ) ) { + $title = $meta['title']; + } + + if ( ! empty( $title ) ) { + + if ( ! empty( $meta['album'] ) && ! empty( $meta['artist'] ) ) { + /* translators: 1: Audio track title, 2: Album title, 3: Artist name. */ + $content .= sprintf( __( '"%1$s" from %2$s by %3$s.' ), $title, $meta['album'], $meta['artist'] ); + } elseif ( ! empty( $meta['album'] ) ) { + /* translators: 1: Audio track title, 2: Album title. */ + $content .= sprintf( __( '"%1$s" from %2$s.' ), $title, $meta['album'] ); + } elseif ( ! empty( $meta['artist'] ) ) { + /* translators: 1: Audio track title, 2: Artist name. */ + $content .= sprintf( __( '"%1$s" by %2$s.' ), $title, $meta['artist'] ); + } else { + /* translators: %s: Audio track title. */ + $content .= sprintf( __( '"%s".' ), $title ); + } + } elseif ( ! empty( $meta['album'] ) ) { + + if ( ! empty( $meta['artist'] ) ) { + /* translators: 1: Audio album title, 2: Artist name. */ + $content .= sprintf( __( '%1$s by %2$s.' ), $meta['album'], $meta['artist'] ); + } else { + $content .= $meta['album'] . '.'; + } + } elseif ( ! empty( $meta['artist'] ) ) { + + $content .= $meta['artist'] . '.'; + + } + + if ( ! empty( $meta['year'] ) ) { + /* translators: Audio file track information. %d: Year of audio track release. */ + $content .= ' ' . sprintf( __( 'Released: %d.' ), $meta['year'] ); + } + + if ( ! empty( $meta['track_number'] ) ) { + $track_number = explode( '/', $meta['track_number'] ); + + if ( isset( $track_number[1] ) ) { + /* translators: Audio file track information. 1: Audio track number, 2: Total audio tracks. */ + $content .= ' ' . sprintf( __( 'Track %1$s of %2$s.' ), number_format_i18n( $track_number[0] ), number_format_i18n( $track_number[1] ) ); + } else { + /* translators: Audio file track information. %s: Audio track number. */ + $content .= ' ' . sprintf( __( 'Track %s.' ), number_format_i18n( $track_number[0] ) ); + } + } + + if ( ! empty( $meta['genre'] ) ) { + /* translators: Audio file genre information. %s: Audio genre name. */ + $content .= ' ' . sprintf( __( 'Genre: %s.' ), $meta['genre'] ); + } + + // Use image exif/iptc data for title and caption defaults if possible. + } elseif ( 0 === strpos( $type, 'image/' ) ) { + $image_meta = wp_read_image_metadata( $file ); + + if ( $image_meta ) { + if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) { + $title = $image_meta['title']; + } + + if ( trim( $image_meta['caption'] ) ) { + $excerpt = $image_meta['caption']; + } + } + } + + // Construct the attachment array. + $attachment = array_merge( + array( + 'post_mime_type' => $type, + 'guid' => $url, + 'post_parent' => $post_id, + 'post_title' => $title, + 'post_content' => $content, + 'post_excerpt' => $excerpt, + ), + $post_data + ); + + // This should never be set as it would then overwrite an existing attachment. + unset( $attachment['ID'] ); + + // Save the data. + $attachment_id = wp_insert_attachment( $attachment, $file, $post_id, true ); + + if ( ! is_wp_error( $attachment_id ) ) { + // Set a custom header with the attachment_id. + // Used by the browser/client to resume creating image sub-sizes after a PHP fatal error. + if ( ! headers_sent() ) { + header( 'X-WP-Upload-Attachment-ID: ' . $attachment_id ); + } + + // The image sub-sizes are created during wp_generate_attachment_metadata(). + // This is generally slow and may cause timeouts or out of memory errors. + wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) ); + } + + return $attachment_id; +} + +/** + * Handles a side-loaded file in the same way as an uploaded file is handled by media_handle_upload(). + * + * @since 2.6.0 + * @since 5.3.0 The `$post_id` parameter was made optional. + * + * @param array $file_array Array similar to a `$_FILES` upload array. + * @param int $post_id Optional. The post ID the media is associated with. + * @param string $desc Optional. Description of the side-loaded file. Default null. + * @param array $post_data Optional. Post data to override. Default empty array. + * @return int|WP_Error The ID of the attachment or a WP_Error on failure. + */ +function media_handle_sideload( $file_array, $post_id = 0, $desc = null, $post_data = array() ) { + $overrides = array( 'test_form' => false ); + + $time = current_time( 'mysql' ); + $post = get_post( $post_id ); + + if ( $post ) { + if ( substr( $post->post_date, 0, 4 ) > 0 ) { + $time = $post->post_date; + } + } + + $file = wp_handle_sideload( $file_array, $overrides, $time ); + + if ( isset( $file['error'] ) ) { + return new WP_Error( 'upload_error', $file['error'] ); + } + + $url = $file['url']; + $type = $file['type']; + $file = $file['file']; + $title = preg_replace( '/\.[^.]+$/', '', wp_basename( $file ) ); + $content = ''; + + // Use image exif/iptc data for title and caption defaults if possible. + $image_meta = wp_read_image_metadata( $file ); + + if ( $image_meta ) { + if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) { + $title = $image_meta['title']; + } + + if ( trim( $image_meta['caption'] ) ) { + $content = $image_meta['caption']; + } + } + + if ( isset( $desc ) ) { + $title = $desc; + } + + // Construct the attachment array. + $attachment = array_merge( + array( + 'post_mime_type' => $type, + 'guid' => $url, + 'post_parent' => $post_id, + 'post_title' => $title, + 'post_content' => $content, + ), + $post_data + ); + + // This should never be set as it would then overwrite an existing attachment. + unset( $attachment['ID'] ); + + // Save the attachment metadata. + $attachment_id = wp_insert_attachment( $attachment, $file, $post_id, true ); + + if ( ! is_wp_error( $attachment_id ) ) { + wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) ); + } + + return $attachment_id; +} + +/** + * Outputs the iframe to display the media upload page. + * + * @since 2.5.0 + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @global int $body_id + * + * @param callable $content_func Function that outputs the content. + * @param mixed ...$args Optional additional parameters to pass to the callback function when it's called. + */ +function wp_iframe( $content_func, ...$args ) { + _wp_admin_html_begin(); + ?> + <?php bloginfo( 'name' ); ?> › <?php _e( 'Uploads' ); ?> — <?php _e( 'WordPress' ); ?> + + + + + class="wp-core-ui no-js"> + + + + + + $post ) ); + + $img = ' '; + + $id_attribute = 1 === $instance ? ' id="insert-media-button"' : ''; + + printf( + '', + $id_attribute, + esc_attr( $editor_id ), + $img . __( 'Add Media' ) + ); + + /** + * Filters the legacy (pre-3.5.0) media buttons. + * + * Use {@see 'media_buttons'} action instead. + * + * @since 2.5.0 + * @deprecated 3.5.0 Use {@see 'media_buttons'} action instead. + * + * @param string $string Media buttons context. Default empty. + */ + $legacy_filter = apply_filters_deprecated( 'media_buttons_context', array( '' ), '3.5.0', 'media_buttons' ); + + if ( $legacy_filter ) { + // #WP22559. Close if a plugin started by closing to open their own tag. + if ( 0 === stripos( trim( $legacy_filter ), '' ) ) { + $legacy_filter .= ''; + } + echo $legacy_filter; + } +} + +/** + * @global int $post_ID + * @param string $type + * @param int $post_id + * @param string $tab + * @return string + */ +function get_upload_iframe_src( $type = null, $post_id = null, $tab = null ) { + global $post_ID; + + if ( empty( $post_id ) ) { + $post_id = $post_ID; + } + + $upload_iframe_src = add_query_arg( 'post_id', (int) $post_id, admin_url( 'media-upload.php' ) ); + + if ( $type && 'media' != $type ) { + $upload_iframe_src = add_query_arg( 'type', $type, $upload_iframe_src ); + } + + if ( ! empty( $tab ) ) { + $upload_iframe_src = add_query_arg( 'tab', $tab, $upload_iframe_src ); + } + + /** + * Filters the upload iframe source URL for a specific media type. + * + * The dynamic portion of the hook name, `$type`, refers to the type + * of media uploaded. + * + * @since 3.0.0 + * + * @param string $upload_iframe_src The upload iframe source URL by type. + */ + $upload_iframe_src = apply_filters( "{$type}_upload_iframe_src", $upload_iframe_src ); + + return add_query_arg( 'TB_iframe', true, $upload_iframe_src ); +} + +/** + * Handles form submissions for the legacy media uploader. + * + * @since 2.5.0 + * + * @return mixed void|object WP_Error on failure + */ +function media_upload_form_handler() { + check_admin_referer( 'media-form' ); + + $errors = null; + + if ( isset( $_POST['send'] ) ) { + $keys = array_keys( $_POST['send'] ); + $send_id = (int) reset( $keys ); + } + + if ( ! empty( $_POST['attachments'] ) ) { + foreach ( $_POST['attachments'] as $attachment_id => $attachment ) { + $post = get_post( $attachment_id, ARRAY_A ); + $_post = $post; + + if ( ! current_user_can( 'edit_post', $attachment_id ) ) { + continue; + } + + if ( isset( $attachment['post_content'] ) ) { + $post['post_content'] = $attachment['post_content']; + } + + if ( isset( $attachment['post_title'] ) ) { + $post['post_title'] = $attachment['post_title']; + } + + if ( isset( $attachment['post_excerpt'] ) ) { + $post['post_excerpt'] = $attachment['post_excerpt']; + } + + if ( isset( $attachment['menu_order'] ) ) { + $post['menu_order'] = $attachment['menu_order']; + } + + if ( isset( $send_id ) && $attachment_id == $send_id ) { + if ( isset( $attachment['post_parent'] ) ) { + $post['post_parent'] = $attachment['post_parent']; + } + } + + /** + * Filters the attachment fields to be saved. + * + * @since 2.5.0 + * + * @see wp_get_attachment_metadata() + * + * @param array $post An array of post data. + * @param array $attachment An array of attachment metadata. + */ + $post = apply_filters( 'attachment_fields_to_save', $post, $attachment ); + + if ( isset( $attachment['image_alt'] ) ) { + $image_alt = wp_unslash( $attachment['image_alt'] ); + + if ( get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ) !== $image_alt ) { + $image_alt = wp_strip_all_tags( $image_alt, true ); + + // update_post_meta() expects slashed. + update_post_meta( $attachment_id, '_wp_attachment_image_alt', wp_slash( $image_alt ) ); + } + } + + if ( isset( $post['errors'] ) ) { + $errors[ $attachment_id ] = $post['errors']; + unset( $post['errors'] ); + } + + if ( $post != $_post ) { + wp_update_post( $post ); + } + + foreach ( get_attachment_taxonomies( $post ) as $t ) { + if ( isset( $attachment[ $t ] ) ) { + wp_set_object_terms( $attachment_id, array_map( 'trim', preg_split( '/,+/', $attachment[ $t ] ) ), $t, false ); + } + } + } + } + + if ( isset( $_POST['insert-gallery'] ) || isset( $_POST['update-gallery'] ) ) { + ?> + + $html"; + } + + /** + * Filters the HTML markup for a media item sent to the editor. + * + * @since 2.5.0 + * + * @see wp_get_attachment_metadata() + * + * @param string $html HTML markup for a media item sent to the editor. + * @param int $send_id The first key from the $_POST['send'] data. + * @param array $attachment Array of attachment metadata. + */ + $html = apply_filters( 'media_send_to_editor', $html, $send_id, $attachment ); + + return media_send_to_editor( $html ); + } + + return $errors; +} + +/** + * Handles the process of uploading media. + * + * @since 2.5.0 + * + * @return null|string + */ +function wp_media_upload_handler() { + $errors = array(); + $id = 0; + + if ( isset( $_POST['html-upload'] ) && ! empty( $_FILES ) ) { + check_admin_referer( 'media-form' ); + // Upload File button was clicked. + $id = media_handle_upload( 'async-upload', $_REQUEST['post_id'] ); + unset( $_FILES ); + + if ( is_wp_error( $id ) ) { + $errors['upload_error'] = $id; + $id = false; + } + } + + if ( ! empty( $_POST['insertonlybutton'] ) ) { + $src = $_POST['src']; + + if ( ! empty( $src ) && ! strpos( $src, '://' ) ) { + $src = "http://$src"; + } + + if ( isset( $_POST['media_type'] ) && 'image' != $_POST['media_type'] ) { + $title = esc_html( wp_unslash( $_POST['title'] ) ); + if ( empty( $title ) ) { + $title = esc_html( wp_basename( $src ) ); + } + + if ( $title && $src ) { + $html = "$title"; + } + + $type = 'file'; + $ext = preg_replace( '/^.+?\.([^.]+)$/', '$1', $src ); + + if ( $ext ) { + $ext_type = wp_ext2type( $ext ); + if ( 'audio' == $ext_type || 'video' == $ext_type ) { + $type = $ext_type; + } + } + + /** + * Filters the URL sent to the editor for a specific media type. + * + * The dynamic portion of the hook name, `$type`, refers to the type + * of media being sent. + * + * @since 3.3.0 + * + * @param string $html HTML markup sent to the editor. + * @param string $src Media source URL. + * @param string $title Media title. + */ + $html = apply_filters( "{$type}_send_to_editor_url", $html, esc_url_raw( $src ), $title ); + } else { + $align = ''; + $alt = esc_attr( wp_unslash( $_POST['alt'] ) ); + + if ( isset( $_POST['align'] ) ) { + $align = esc_attr( wp_unslash( $_POST['align'] ) ); + $class = " class='align$align'"; + } + + if ( ! empty( $src ) ) { + $html = "$alt"; + } + + /** + * Filters the image URL sent to the editor. + * + * @since 2.8.0 + * + * @param string $html HTML markup sent to the editor for an image. + * @param string $src Image source URL. + * @param string $alt Image alternate, or alt, text. + * @param string $align The image alignment. Default 'alignnone'. Possible values include + * 'alignleft', 'aligncenter', 'alignright', 'alignnone'. + */ + $html = apply_filters( 'image_send_to_editor_url', $html, esc_url_raw( $src ), $alt, $align ); + } + + return media_send_to_editor( $html ); + } + + if ( isset( $_POST['save'] ) ) { + $errors['upload_notice'] = __( 'Saved.' ); + wp_enqueue_script( 'admin-gallery' ); + + return wp_iframe( 'media_upload_gallery_form', $errors ); + + } elseif ( ! empty( $_POST ) ) { + $return = media_upload_form_handler(); + + if ( is_string( $return ) ) { + return $return; + } + + if ( is_array( $return ) ) { + $errors = $return; + } + } + + if ( isset( $_GET['tab'] ) && 'type_url' === $_GET['tab'] ) { + $type = 'image'; + + if ( isset( $_GET['type'] ) && in_array( $_GET['type'], array( 'video', 'audio', 'file' ) ) ) { + $type = $_GET['type']; + } + + return wp_iframe( 'media_upload_type_url_form', $type, $errors, $id ); + } + + return wp_iframe( 'media_upload_type_form', 'image', $errors, $id ); +} + +/** + * Downloads an image from the specified URL and attaches it to a post. + * + * @since 2.6.0 + * @since 4.2.0 Introduced the `$return` parameter. + * @since 4.8.0 Introduced the 'id' option within the `$return` parameter. + * @since 5.3.0 The `$post_id` parameter was made optional. + * @since 5.4.0 The original URL of the attachment is stored in the `_source_url` + * post meta value. + * + * @param string $file The URL of the image to download. + * @param int $post_id Optional. The post ID the media is to be associated with. + * @param string $desc Optional. Description of the image. + * @param string $return Optional. Accepts 'html' (image tag html) or 'src' (URL), + * or 'id' (attachment ID). Default 'html'. + * @return string|WP_Error Populated HTML img tag on success, WP_Error object otherwise. + */ +function media_sideload_image( $file, $post_id = 0, $desc = null, $return = 'html' ) { + if ( ! empty( $file ) ) { + + // Set variables for storage, fix file filename for query strings. + preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches ); + + if ( ! $matches ) { + return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL.' ) ); + } + + $file_array = array(); + $file_array['name'] = wp_basename( $matches[0] ); + + // Download file to temp location. + $file_array['tmp_name'] = download_url( $file ); + + // If error storing temporarily, return the error. + if ( is_wp_error( $file_array['tmp_name'] ) ) { + return $file_array['tmp_name']; + } + + // Do the validation and storage stuff. + $id = media_handle_sideload( $file_array, $post_id, $desc ); + + // If error storing permanently, unlink. + if ( is_wp_error( $id ) ) { + @unlink( $file_array['tmp_name'] ); + return $id; + } + + // Store the original attachment source in meta. + add_post_meta( $id, '_source_url', $file ); + + // If attachment id was requested, return it. + if ( 'id' === $return ) { + return $id; + } + + $src = wp_get_attachment_url( $id ); + } + + // Finally, check to make sure the file has been saved, then return the HTML. + if ( ! empty( $src ) ) { + if ( 'src' === $return ) { + return $src; + } + + $alt = isset( $desc ) ? esc_attr( $desc ) : ''; + $html = "$alt"; + + return $html; + } else { + return new WP_Error( 'image_sideload_failed' ); + } +} + +/** + * Retrieves the legacy media uploader form in an iframe. + * + * @since 2.5.0 + * + * @return string|null + */ +function media_upload_gallery() { + $errors = array(); + + if ( ! empty( $_POST ) ) { + $return = media_upload_form_handler(); + + if ( is_string( $return ) ) { + return $return; + } + + if ( is_array( $return ) ) { + $errors = $return; + } + } + + wp_enqueue_script( 'admin-gallery' ); + return wp_iframe( 'media_upload_gallery_form', $errors ); +} + +/** + * Retrieves the legacy media library form in an iframe. + * + * @since 2.5.0 + * + * @return string|null + */ +function media_upload_library() { + $errors = array(); + + if ( ! empty( $_POST ) ) { + $return = media_upload_form_handler(); + + if ( is_string( $return ) ) { + return $return; + } + if ( is_array( $return ) ) { + $errors = $return; + } + } + + return wp_iframe( 'media_upload_library_form', $errors ); +} + +/** + * Retrieve HTML for the image alignment radio buttons with the specified one checked. + * + * @since 2.7.0 + * + * @param WP_Post $post + * @param string $checked + * @return string + */ +function image_align_input_fields( $post, $checked = '' ) { + + if ( empty( $checked ) ) { + $checked = get_user_setting( 'align', 'none' ); + } + + $alignments = array( + 'none' => __( 'None' ), + 'left' => __( 'Left' ), + 'center' => __( 'Center' ), + 'right' => __( 'Right' ), + ); + + if ( ! array_key_exists( (string) $checked, $alignments ) ) { + $checked = 'none'; + } + + $out = array(); + + foreach ( $alignments as $name => $label ) { + $name = esc_attr( $name ); + $out[] = ""; + } + + return join( "\n", $out ); +} + +/** + * Retrieve HTML for the size radio buttons with the specified one checked. + * + * @since 2.7.0 + * + * @param WP_Post $post + * @param bool|string $check + * @return array + */ +function image_size_input_fields( $post, $check = '' ) { + /** + * Filters the names and labels of the default image sizes. + * + * @since 3.3.0 + * + * @param string[] $size_names Array of image size labels keyed by their name. Default values + * include 'Thumbnail', 'Medium', 'Large', and 'Full Size'. + */ + $size_names = apply_filters( + 'image_size_names_choose', + array( + 'thumbnail' => __( 'Thumbnail' ), + 'medium' => __( 'Medium' ), + 'large' => __( 'Large' ), + 'full' => __( 'Full Size' ), + ) + ); + + if ( empty( $check ) ) { + $check = get_user_setting( 'imgsize', 'medium' ); + } + + $out = array(); + + foreach ( $size_names as $size => $label ) { + $downsize = image_downsize( $post->ID, $size ); + $checked = ''; + + // Is this size selectable? + $enabled = ( $downsize[3] || 'full' == $size ); + $css_id = "image-size-{$size}-{$post->ID}"; + + // If this size is the default but that's not available, don't select it. + if ( $size == $check ) { + if ( $enabled ) { + $checked = " checked='checked'"; + } else { + $check = ''; + } + } elseif ( ! $check && $enabled && 'thumbnail' != $size ) { + /* + * If $check is not enabled, default to the first available size + * that's bigger than a thumbnail. + */ + $check = $size; + $checked = " checked='checked'"; + } + + $html = "
        "; + + $html .= ""; + + // Only show the dimensions if that choice is available. + if ( $enabled ) { + $html .= " '; + } + $html .= '
        '; + + $out[] = $html; + } + + return array( + 'label' => __( 'Size' ), + 'input' => 'html', + 'html' => join( "\n", $out ), + ); +} + +/** + * Retrieve HTML for the Link URL buttons with the default link type as specified. + * + * @since 2.7.0 + * + * @param WP_Post $post + * @param string $url_type + * @return string + */ +function image_link_input_fields( $post, $url_type = '' ) { + + $file = wp_get_attachment_url( $post->ID ); + $link = get_attachment_link( $post->ID ); + + if ( empty( $url_type ) ) { + $url_type = get_user_setting( 'urlbutton', 'post' ); + } + + $url = ''; + + if ( 'file' === $url_type ) { + $url = $file; + } elseif ( 'post' === $url_type ) { + $url = $link; + } + + return " +
        + + + +'; +} + +/** + * Output a textarea element for inputting an attachment caption. + * + * @since 3.4.0 + * + * @param WP_Post $edit_post Attachment WP_Post object. + * @return string HTML markup for the textarea element. + */ +function wp_caption_input_textarea( $edit_post ) { + // Post data is already escaped. + $name = "attachments[{$edit_post->ID}][post_excerpt]"; + + return ''; +} + +/** + * Retrieves the image attachment fields to edit form fields. + * + * @since 2.5.0 + * + * @param array $form_fields + * @param object $post + * @return array + */ +function image_attachment_fields_to_edit( $form_fields, $post ) { + return $form_fields; +} + +/** + * Retrieves the single non-image attachment fields to edit form fields. + * + * @since 2.5.0 + * + * @param array $form_fields An array of attachment form fields. + * @param WP_Post $post The WP_Post attachment object. + * @return array Filtered attachment form fields. + */ +function media_single_attachment_fields_to_edit( $form_fields, $post ) { + unset( $form_fields['url'], $form_fields['align'], $form_fields['image-size'] ); + return $form_fields; +} + +/** + * Retrieves the post non-image attachment fields to edit form fields. + * + * @since 2.8.0 + * + * @param array $form_fields An array of attachment form fields. + * @param WP_Post $post The WP_Post attachment object. + * @return array Filtered attachment form fields. + */ +function media_post_single_attachment_fields_to_edit( $form_fields, $post ) { + unset( $form_fields['image_url'] ); + return $form_fields; +} + +/** + * Filters input from media_upload_form_handler() and assigns a default + * post_title from the file name if none supplied. + * + * Illustrates the use of the {@see 'attachment_fields_to_save'} filter + * which can be used to add default values to any field before saving to DB. + * + * @since 2.5.0 + * + * @param array $post The WP_Post attachment object converted to an array. + * @param array $attachment An array of attachment metadata. + * @return array Filtered attachment post object. + */ +function image_attachment_fields_to_save( $post, $attachment ) { + if ( substr( $post['post_mime_type'], 0, 5 ) == 'image' ) { + if ( strlen( trim( $post['post_title'] ) ) == 0 ) { + $attachment_url = ( isset( $post['attachment_url'] ) ) ? $post['attachment_url'] : $post['guid']; + $post['post_title'] = preg_replace( '/\.\w+$/', '', wp_basename( $attachment_url ) ); + $post['errors']['post_title']['errors'][] = __( 'Empty Title filled from filename.' ); + } + } + + return $post; +} + +/** + * Retrieves the media element HTML to send to the editor. + * + * @since 2.5.0 + * + * @param string $html + * @param integer $attachment_id + * @param array $attachment + * @return string + */ +function image_media_send_to_editor( $html, $attachment_id, $attachment ) { + $post = get_post( $attachment_id ); + + if ( substr( $post->post_mime_type, 0, 5 ) == 'image' ) { + $url = $attachment['url']; + $align = ! empty( $attachment['align'] ) ? $attachment['align'] : 'none'; + $size = ! empty( $attachment['image-size'] ) ? $attachment['image-size'] : 'medium'; + $alt = ! empty( $attachment['image_alt'] ) ? $attachment['image_alt'] : ''; + $rel = ( strpos( $url, 'attachment_id' ) || get_attachment_link( $attachment_id ) === $url ); + + return get_image_send_to_editor( $attachment_id, $attachment['post_excerpt'], $attachment['post_title'], $align, $url, $rel, $size, $alt ); + } + + return $html; +} + +/** + * Retrieves the attachment fields to edit form fields. + * + * @since 2.5.0 + * + * @param WP_Post $post + * @param array $errors + * @return array + */ +function get_attachment_fields_to_edit( $post, $errors = null ) { + if ( is_int( $post ) ) { + $post = get_post( $post ); + } + + if ( is_array( $post ) ) { + $post = new WP_Post( (object) $post ); + } + + $image_url = wp_get_attachment_url( $post->ID ); + + $edit_post = sanitize_post( $post, 'edit' ); + + $form_fields = array( + 'post_title' => array( + 'label' => __( 'Title' ), + 'value' => $edit_post->post_title, + ), + 'image_alt' => array(), + 'post_excerpt' => array( + 'label' => __( 'Caption' ), + 'input' => 'html', + 'html' => wp_caption_input_textarea( $edit_post ), + ), + 'post_content' => array( + 'label' => __( 'Description' ), + 'value' => $edit_post->post_content, + 'input' => 'textarea', + ), + 'url' => array( + 'label' => __( 'Link URL' ), + 'input' => 'html', + 'html' => image_link_input_fields( $post, get_option( 'image_default_link_type' ) ), + 'helps' => __( 'Enter a link URL or click above for presets.' ), + ), + 'menu_order' => array( + 'label' => __( 'Order' ), + 'value' => $edit_post->menu_order, + ), + 'image_url' => array( + 'label' => __( 'File URL' ), + 'input' => 'html', + 'html' => "
        ", + 'value' => wp_get_attachment_url( $post->ID ), + 'helps' => __( 'Location of the uploaded file.' ), + ), + ); + + foreach ( get_attachment_taxonomies( $post ) as $taxonomy ) { + $t = (array) get_taxonomy( $taxonomy ); + + if ( ! $t['public'] || ! $t['show_ui'] ) { + continue; + } + + if ( empty( $t['label'] ) ) { + $t['label'] = $taxonomy; + } + + if ( empty( $t['args'] ) ) { + $t['args'] = array(); + } + + $terms = get_object_term_cache( $post->ID, $taxonomy ); + + if ( false === $terms ) { + $terms = wp_get_object_terms( $post->ID, $taxonomy, $t['args'] ); + } + + $values = array(); + + foreach ( $terms as $term ) { + $values[] = $term->slug; + } + + $t['value'] = join( ', ', $values ); + + $form_fields[ $taxonomy ] = $t; + } + + /* + * Merge default fields with their errors, so any key passed with the error + * (e.g. 'error', 'helps', 'value') will replace the default. + * The recursive merge is easily traversed with array casting: + * foreach ( (array) $things as $thing ) + */ + $form_fields = array_merge_recursive( $form_fields, (array) $errors ); + + // This was formerly in image_attachment_fields_to_edit(). + if ( substr( $post->post_mime_type, 0, 5 ) == 'image' ) { + $alt = get_post_meta( $post->ID, '_wp_attachment_image_alt', true ); + + if ( empty( $alt ) ) { + $alt = ''; + } + + $form_fields['post_title']['required'] = true; + + $form_fields['image_alt'] = array( + 'value' => $alt, + 'label' => __( 'Alternative Text' ), + 'helps' => __( 'Alt text for the image, e.g. “The Mona Lisa”' ), + ); + + $form_fields['align'] = array( + 'label' => __( 'Alignment' ), + 'input' => 'html', + 'html' => image_align_input_fields( $post, get_option( 'image_default_align' ) ), + ); + + $form_fields['image-size'] = image_size_input_fields( $post, get_option( 'image_default_size', 'medium' ) ); + + } else { + unset( $form_fields['image_alt'] ); + } + + /** + * Filters the attachment fields to edit. + * + * @since 2.5.0 + * + * @param array $form_fields An array of attachment form fields. + * @param WP_Post $post The WP_Post attachment object. + */ + $form_fields = apply_filters( 'attachment_fields_to_edit', $form_fields, $post ); + + return $form_fields; +} + +/** + * Retrieve HTML for media items of post gallery. + * + * The HTML markup retrieved will be created for the progress of SWF Upload + * component. Will also create link for showing and hiding the form to modify + * the image attachment. + * + * @since 2.5.0 + * + * @global WP_Query $wp_the_query WordPress Query object. + * + * @param int $post_id Optional. Post ID. + * @param array $errors Errors for attachment, if any. + * @return string + */ +function get_media_items( $post_id, $errors ) { + $attachments = array(); + + if ( $post_id ) { + $post = get_post( $post_id ); + + if ( $post && 'attachment' === $post->post_type ) { + $attachments = array( $post->ID => $post ); + } else { + $attachments = get_children( + array( + 'post_parent' => $post_id, + 'post_type' => 'attachment', + 'orderby' => 'menu_order ASC, ID', + 'order' => 'DESC', + ) + ); + } + } else { + if ( is_array( $GLOBALS['wp_the_query']->posts ) ) { + foreach ( $GLOBALS['wp_the_query']->posts as $attachment ) { + $attachments[ $attachment->ID ] = $attachment; + } + } + } + + $output = ''; + foreach ( (array) $attachments as $id => $attachment ) { + if ( 'trash' === $attachment->post_status ) { + continue; + } + + $item = get_media_item( $id, array( 'errors' => isset( $errors[ $id ] ) ? $errors[ $id ] : null ) ); + + if ( $item ) { + $output .= "\n
        $item\n
        "; + } + } + + return $output; +} + +/** + * Retrieve HTML form for modifying the image attachment. + * + * @since 2.5.0 + * + * @global string $redir_tab + * + * @param int $attachment_id Attachment ID for modification. + * @param string|array $args Optional. Override defaults. + * @return string HTML form for attachment. + */ +function get_media_item( $attachment_id, $args = null ) { + global $redir_tab; + + $thumb_url = false; + $attachment_id = intval( $attachment_id ); + + if ( $attachment_id ) { + $thumb_url = wp_get_attachment_image_src( $attachment_id, 'thumbnail', true ); + + if ( $thumb_url ) { + $thumb_url = $thumb_url[0]; + } + } + + $post = get_post( $attachment_id ); + $current_post_id = ! empty( $_GET['post_id'] ) ? (int) $_GET['post_id'] : 0; + + $default_args = array( + 'errors' => null, + 'send' => $current_post_id ? post_type_supports( get_post_type( $current_post_id ), 'editor' ) : true, + 'delete' => true, + 'toggle' => true, + 'show_title' => true, + ); + + $parsed_args = wp_parse_args( $args, $default_args ); + + /** + * Filters the arguments used to retrieve an image for the edit image form. + * + * @since 3.1.0 + * + * @see get_media_item + * + * @param array $parsed_args An array of arguments. + */ + $parsed_args = apply_filters( 'get_media_item_args', $parsed_args ); + + $toggle_on = __( 'Show' ); + $toggle_off = __( 'Hide' ); + + $file = get_attached_file( $post->ID ); + $filename = esc_html( wp_basename( $file ) ); + $title = esc_attr( $post->post_title ); + + $post_mime_types = get_post_mime_types(); + $keys = array_keys( wp_match_mime_types( array_keys( $post_mime_types ), $post->post_mime_type ) ); + $type = reset( $keys ); + $type_html = ""; + + $form_fields = get_attachment_fields_to_edit( $post, $parsed_args['errors'] ); + + if ( $parsed_args['toggle'] ) { + $class = empty( $parsed_args['errors'] ) ? 'startclosed' : 'startopen'; + $toggle_links = " + $toggle_on + $toggle_off"; + } else { + $class = ''; + $toggle_links = ''; + } + + $display_title = ( ! empty( $title ) ) ? $title : $filename; // $title shouldn't ever be empty, but just in case. + $display_title = $parsed_args['show_title'] ? "
        " . wp_html_excerpt( $display_title, 60, '…' ) . '
        ' : ''; + + $gallery = ( ( isset( $_REQUEST['tab'] ) && 'gallery' == $_REQUEST['tab'] ) || ( isset( $redir_tab ) && 'gallery' == $redir_tab ) ); + $order = ''; + + foreach ( $form_fields as $key => $val ) { + if ( 'menu_order' == $key ) { + if ( $gallery ) { + $order = ""; + } else { + $order = ""; + } + + unset( $form_fields['menu_order'] ); + break; + } + } + + $media_dims = ''; + $meta = wp_get_attachment_metadata( $post->ID ); + + if ( isset( $meta['width'], $meta['height'] ) ) { + $media_dims .= "{$meta['width']} × {$meta['height']} "; + } + + /** + * Filters the media metadata. + * + * @since 2.5.0 + * + * @param string $media_dims The HTML markup containing the media dimensions. + * @param WP_Post $post The WP_Post attachment object. + */ + $media_dims = apply_filters( 'media_meta', $media_dims, $post ); + + $image_edit_button = ''; + + if ( wp_attachment_is_image( $post->ID ) && wp_image_editor_supports( array( 'mime_type' => $post->post_mime_type ) ) ) { + $nonce = wp_create_nonce( "image_editor-$post->ID" ); + $image_edit_button = " "; + } + + $attachment_url = get_permalink( $attachment_id ); + + $item = " + $type_html + $toggle_links + $order + $display_title + + + + + \n"; + + $item .= " + + + \n + \n + \n"; + + $defaults = array( + 'input' => 'text', + 'required' => false, + 'value' => '', + 'extra_rows' => array(), + ); + + if ( $parsed_args['send'] ) { + $parsed_args['send'] = get_submit_button( __( 'Insert into Post' ), '', "send[$attachment_id]", false ); + } + + $delete = empty( $parsed_args['delete'] ) ? '' : $parsed_args['delete']; + if ( $delete && current_user_can( 'delete_post', $attachment_id ) ) { + if ( ! EMPTY_TRASH_DAYS ) { + $delete = "" . __( 'Delete Permanently' ) . ''; + } elseif ( ! MEDIA_TRASH ) { + $delete = "" . __( 'Delete' ) . " + '; + } else { + $delete = "" . __( 'Move to Trash' ) . " + '; + } + } else { + $delete = ''; + } + + $thumbnail = ''; + $calling_post_id = 0; + + if ( isset( $_GET['post_id'] ) ) { + $calling_post_id = absint( $_GET['post_id'] ); + } elseif ( isset( $_POST ) && count( $_POST ) ) {// Like for async-upload where $_GET['post_id'] isn't set. + $calling_post_id = $post->post_parent; + } + + if ( 'image' == $type && $calling_post_id && current_theme_supports( 'post-thumbnails', get_post_type( $calling_post_id ) ) + && post_type_supports( get_post_type( $calling_post_id ), 'thumbnail' ) && get_post_thumbnail_id( $calling_post_id ) != $attachment_id ) { + + $calling_post = get_post( $calling_post_id ); + $calling_post_type_object = get_post_type_object( $calling_post->post_type ); + + $ajax_nonce = wp_create_nonce( "set_post_thumbnail-$calling_post_id" ); + $thumbnail = "" . esc_html( $calling_post_type_object->labels->use_featured_image ) . ''; + } + + if ( ( $parsed_args['send'] || $thumbnail || $delete ) && ! isset( $form_fields['buttons'] ) ) { + $form_fields['buttons'] = array( 'tr' => "\t\t\n" ); + } + + $hidden_fields = array(); + + foreach ( $form_fields as $id => $field ) { + if ( '_' === $id[0] ) { + continue; + } + + if ( ! empty( $field['tr'] ) ) { + $item .= $field['tr']; + continue; + } + + $field = array_merge( $defaults, $field ); + $name = "attachments[$attachment_id][$id]"; + + if ( 'hidden' === $field['input'] ) { + $hidden_fields[ $name ] = $field['value']; + continue; + } + + $required = $field['required'] ? '*' : ''; + $required_attr = $field['required'] ? ' required' : ''; + $class = $id; + $class .= $field['required'] ? ' form-required' : ''; + + $item .= "\t\t\n\t\t\t\n\t\t\t\n\t\t\n"; + + $extra_rows = array(); + + if ( ! empty( $field['errors'] ) ) { + foreach ( array_unique( (array) $field['errors'] ) as $error ) { + $extra_rows['error'][] = $error; + } + } + + if ( ! empty( $field['extra_rows'] ) ) { + foreach ( $field['extra_rows'] as $class => $rows ) { + foreach ( (array) $rows as $html ) { + $extra_rows[ $class ][] = $html; + } + } + } + + foreach ( $extra_rows as $class => $rows ) { + foreach ( $rows as $html ) { + $item .= "\t\t\n"; + } + } + } + + if ( ! empty( $form_fields['_final'] ) ) { + $item .= "\t\t\n"; + } + + $item .= "\t\n"; + $item .= "\t
        +

        +

        $image_edit_button

        +
        +

        " . __( 'File name:' ) . " $filename

        +

        " . __( 'File type:' ) . " $post->post_mime_type

        +

        " . __( 'Upload date:' ) . ' ' . mysql2date( __( 'F j, Y' ), $post->post_date ) . '

        '; + + if ( ! empty( $media_dims ) ) { + $item .= '

        ' . __( 'Dimensions:' ) . " $media_dims

        \n"; + } + + $item .= "

        " . + /* translators: %s: Asterisk symbol (*). */ + sprintf( __( 'Required fields are marked %s' ), '*' ) . + "

        " . $parsed_args['send'] . " $thumbnail $delete
        "; + + if ( ! empty( $field[ $field['input'] ] ) ) { + $item .= $field[ $field['input'] ]; + } elseif ( 'textarea' === $field['input'] ) { + if ( 'post_content' == $id && user_can_richedit() ) { + // Sanitize_post() skips the post_content when user_can_richedit. + $field['value'] = htmlspecialchars( $field['value'], ENT_QUOTES ); + } + // Post_excerpt is already escaped by sanitize_post() in get_attachment_fields_to_edit(). + $item .= "'; + } else { + $item .= ""; + } + + if ( ! empty( $field['helps'] ) ) { + $item .= "

        " . join( "

        \n

        ", array_unique( (array) $field['helps'] ) ) . '

        '; + } + $item .= "
        $html
        {$form_fields['_final']}
        \n"; + + foreach ( $hidden_fields as $name => $value ) { + $item .= "\t\n"; + } + + if ( $post->post_parent < 1 && isset( $_REQUEST['post_id'] ) ) { + $parent = (int) $_REQUEST['post_id']; + $parent_name = "attachments[$attachment_id][post_parent]"; + $item .= "\t\n"; + } + + return $item; +} + +/** + * @since 3.5.0 + * + * @param int $attachment_id + * @param array $args + * @return array + */ +function get_compat_media_markup( $attachment_id, $args = null ) { + $post = get_post( $attachment_id ); + + $default_args = array( + 'errors' => null, + 'in_modal' => false, + ); + + $user_can_edit = current_user_can( 'edit_post', $attachment_id ); + + $args = wp_parse_args( $args, $default_args ); + + /** This filter is documented in wp-admin/includes/media.php */ + $args = apply_filters( 'get_media_item_args', $args ); + + $form_fields = array(); + + if ( $args['in_modal'] ) { + foreach ( get_attachment_taxonomies( $post ) as $taxonomy ) { + $t = (array) get_taxonomy( $taxonomy ); + + if ( ! $t['public'] || ! $t['show_ui'] ) { + continue; + } + + if ( empty( $t['label'] ) ) { + $t['label'] = $taxonomy; + } + + if ( empty( $t['args'] ) ) { + $t['args'] = array(); + } + + $terms = get_object_term_cache( $post->ID, $taxonomy ); + + if ( false === $terms ) { + $terms = wp_get_object_terms( $post->ID, $taxonomy, $t['args'] ); + } + + $values = array(); + + foreach ( $terms as $term ) { + $values[] = $term->slug; + } + + $t['value'] = join( ', ', $values ); + $t['taxonomy'] = true; + + $form_fields[ $taxonomy ] = $t; + } + } + + /* + * Merge default fields with their errors, so any key passed with the error + * (e.g. 'error', 'helps', 'value') will replace the default. + * The recursive merge is easily traversed with array casting: + * foreach ( (array) $things as $thing ) + */ + $form_fields = array_merge_recursive( $form_fields, (array) $args['errors'] ); + + /** This filter is documented in wp-admin/includes/media.php */ + $form_fields = apply_filters( 'attachment_fields_to_edit', $form_fields, $post ); + + unset( + $form_fields['image-size'], + $form_fields['align'], + $form_fields['image_alt'], + $form_fields['post_title'], + $form_fields['post_excerpt'], + $form_fields['post_content'], + $form_fields['url'], + $form_fields['menu_order'], + $form_fields['image_url'] + ); + + /** This filter is documented in wp-admin/includes/media.php */ + $media_meta = apply_filters( 'media_meta', '', $post ); + + $defaults = array( + 'input' => 'text', + 'required' => false, + 'value' => '', + 'extra_rows' => array(), + 'show_in_edit' => true, + 'show_in_modal' => true, + ); + + $hidden_fields = array(); + + $item = ''; + + foreach ( $form_fields as $id => $field ) { + if ( '_' === $id[0] ) { + continue; + } + + $name = "attachments[$attachment_id][$id]"; + $id_attr = "attachments-$attachment_id-$id"; + + if ( ! empty( $field['tr'] ) ) { + $item .= $field['tr']; + continue; + } + + $field = array_merge( $defaults, $field ); + + if ( ( ! $field['show_in_edit'] && ! $args['in_modal'] ) || ( ! $field['show_in_modal'] && $args['in_modal'] ) ) { + continue; + } + + if ( 'hidden' === $field['input'] ) { + $hidden_fields[ $name ] = $field['value']; + continue; + } + + $readonly = ! $user_can_edit && ! empty( $field['taxonomy'] ) ? " readonly='readonly' " : ''; + $required = $field['required'] ? '*' : ''; + $required_attr = $field['required'] ? ' required' : ''; + $class = 'compat-field-' . $id; + $class .= $field['required'] ? ' form-required' : ''; + + $item .= "\t\t"; + $item .= "\t\t\t"; + $item .= "\n\t\t\t"; + + if ( ! empty( $field[ $field['input'] ] ) ) { + $item .= $field[ $field['input'] ]; + } elseif ( 'textarea' === $field['input'] ) { + if ( 'post_content' == $id && user_can_richedit() ) { + // sanitize_post() skips the post_content when user_can_richedit. + $field['value'] = htmlspecialchars( $field['value'], ENT_QUOTES ); + } + $item .= "'; + } else { + $item .= ""; + } + + if ( ! empty( $field['helps'] ) ) { + $item .= "

        " . join( "

        \n

        ", array_unique( (array) $field['helps'] ) ) . '

        '; + } + + $item .= "\n\t\t\n"; + + $extra_rows = array(); + + if ( ! empty( $field['errors'] ) ) { + foreach ( array_unique( (array) $field['errors'] ) as $error ) { + $extra_rows['error'][] = $error; + } + } + + if ( ! empty( $field['extra_rows'] ) ) { + foreach ( $field['extra_rows'] as $class => $rows ) { + foreach ( (array) $rows as $html ) { + $extra_rows[ $class ][] = $html; + } + } + } + + foreach ( $extra_rows as $class => $rows ) { + foreach ( $rows as $html ) { + $item .= "\t\t$html\n"; + } + } + } + + if ( ! empty( $form_fields['_final'] ) ) { + $item .= "\t\t{$form_fields['_final']}\n"; + } + + if ( $item ) { + $item = '

        ' . + /* translators: %s: Asterisk symbol (*). */ + sprintf( __( 'Required fields are marked %s' ), '*' ) . + '

        ' . + '' . $item . '
        '; + } + + foreach ( $hidden_fields as $hidden_field => $value ) { + $item .= '' . "\n"; + } + + if ( $item ) { + $item = '' . $item; + } + + return array( + 'item' => $item, + 'meta' => $media_meta, + ); +} + +/** + * Outputs the legacy media upload header. + * + * @since 2.5.0 + */ +function media_upload_header() { + $post_id = isset( $_REQUEST['post_id'] ) ? intval( $_REQUEST['post_id'] ) : 0; + + echo ''; + + if ( empty( $_GET['chromeless'] ) ) { + echo '
        '; + the_media_upload_tabs(); + echo '
        '; + } +} + +/** + * Outputs the legacy media upload form. + * + * @since 2.5.0 + * + * @global string $type + * @global string $tab + * @global bool $is_IE + * @global bool $is_opera + * + * @param array $errors + */ +function media_upload_form( $errors = null ) { + global $type, $tab, $is_IE, $is_opera; + + if ( ! _device_can_upload() ) { + echo '

        ' . sprintf( + /* translators: %s: https://apps.wordpress.org/ */ + __( 'The web browser on your device cannot be used to upload files. You may be able to use the native app for your device instead.' ), + 'https://apps.wordpress.org/' + ) . '

        '; + return; + } + + $upload_action_url = admin_url( 'async-upload.php' ); + $post_id = isset( $_REQUEST['post_id'] ) ? intval( $_REQUEST['post_id'] ) : 0; + $_type = isset( $type ) ? $type : ''; + $_tab = isset( $tab ) ? $tab : ''; + + $max_upload_size = wp_max_upload_size(); + if ( ! $max_upload_size ) { + $max_upload_size = 0; + } + + ?> +
        + +
        +
        + get_error_message(); + } + + ?> +
        + $post_id, + '_wpnonce' => wp_create_nonce( 'media-form' ), + 'type' => $_type, + 'tab' => $_tab, + 'short' => '1', + ); + + /** + * Filters the media upload post parameters. + * + * @since 3.1.0 As 'swfupload_post_params' + * @since 3.3.0 + * + * @param array $post_params An array of media upload parameters used by Plupload. + */ + $post_params = apply_filters( 'upload_post_params', $post_params ); + + /* + * Since 4.9 the `runtimes` setting is hardcoded in our version of Plupload to `html5,html4`, + * and the `flash_swf_url` and `silverlight_xap_url` are not used. + */ + $plupload_init = array( + 'browse_button' => 'plupload-browse-button', + 'container' => 'plupload-upload-ui', + 'drop_element' => 'drag-drop-area', + 'file_data_name' => 'async-upload', + 'url' => $upload_action_url, + 'filters' => array( 'max_file_size' => $max_upload_size . 'b' ), + 'multipart_params' => $post_params, + ); + + /* + * Currently only iOS Safari supports multiple files uploading, + * but iOS 7.x has a bug that prevents uploading of videos when enabled. + * See #29602. + */ + if ( + wp_is_mobile() && + strpos( $_SERVER['HTTP_USER_AGENT'], 'OS 7_' ) !== false && + strpos( $_SERVER['HTTP_USER_AGENT'], 'like Mac OS X' ) !== false + ) { + $plupload_init['multi_selection'] = false; + } + + /** + * Filters the default Plupload settings. + * + * @since 3.3.0 + * + * @param array $plupload_init An array of default settings used by Plupload. + */ + $plupload_init = apply_filters( 'plupload_init', $plupload_init ); + + ?> + + +
        + +
        +
        +

        +

        +

        +
        +
        + +
        + +
        + +

        + + + + +

        +
        + +
        + +

        + +

        + +
        + + + + +

        + + + + +
        + ' . esc_html( $id->get_error_message() ) . '
        '; + exit; + } + } + + ?> + + +

        + +

        + + +
        + + + +

        + + + +
        +
        + +
        +
        +
        + + +
        + + + + + + + | + | + +
        + + +
        + + + + + + + + +
          + $reals ) { + foreach ( $reals as $real ) { + if ( isset( $num_posts[ $_type ] ) ) { + $num_posts[ $_type ] += $_num_posts[ $real ]; + } else { + $num_posts[ $_type ] = $_num_posts[ $real ]; + } + } + } + // If available type specified by media button clicked, filter by that type. + if ( empty( $_GET['post_mime_type'] ) && ! empty( $num_posts[ $type ] ) ) { + $_GET['post_mime_type'] = $type; + list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query(); + } + if ( empty( $_GET['post_mime_type'] ) || 'all' === $_GET['post_mime_type'] ) { + $class = ' class="current"'; + } else { + $class = ''; + } + $type_links[] = '
        • ' . __( 'All Types' ) . ''; + foreach ( $post_mime_types as $mime_type => $label ) { + $class = ''; + + if ( ! wp_match_mime_types( $mime_type, $avail_post_mime_types ) ) { + continue; + } + + if ( isset( $_GET['post_mime_type'] ) && wp_match_mime_types( $mime_type, $_GET['post_mime_type'] ) ) { + $class = ' class="current"'; + } + + $type_links[] = '
        • ' . sprintf( translate_nooped_plural( $label[2], $num_posts[ $mime_type ] ), '' . number_format_i18n( $num_posts[ $mime_type ] ) . '' ) . ''; + } + /** + * Filters the media upload mime type list items. + * + * Returned values should begin with an `
        • ` tag. + * + * @since 3.1.0 + * + * @param string[] $type_links An array of list items containing mime type link HTML. + */ + echo implode( ' |
        • ', apply_filters( 'media_upload_mime_type_links', $type_links ) ) . ''; + unset( $type_links ); + ?> +
        + +
        + + add_query_arg( 'paged', '%#%' ), + 'format' => '', + 'prev_text' => __( '«' ), + 'next_text' => __( '»' ), + 'total' => ceil( $wp_query->found_posts / 10 ), + 'current' => $q['paged'], + ) + ); + + if ( $page_links ) { + echo "
        $page_links
        "; + } + ?> + +
        + posts WHERE post_type = 'attachment' ORDER BY post_date DESC"; + + $arc_result = $wpdb->get_results( $arc_query ); + + $month_count = count( $arc_result ); + $selected_month = isset( $_GET['m'] ) ? $_GET['m'] : 0; + + if ( $month_count && ! ( 1 == $month_count && 0 == $arc_result[0]->mmonth ) ) { + ?> + + + + + +
        + +
        +
        +
        + +
        + + + + + +
        + + +
        +

        + + +

        +
        + + + + + + '; + } else { + $caption = ''; + } + + $default_align = get_option( 'image_default_align' ); + + if ( empty( $default_align ) ) { + $default_align = 'none'; + } + + if ( 'image' == $default_view ) { + $view = 'image-only'; + $table_class = ''; + } else { + $view = 'not-image'; + $table_class = $view; + } + + return ' +

           

        +

        ' . + /* translators: %s: Asterisk symbol (*). */ + sprintf( __( 'Required fields are marked %s' ), '*' ) . + '

        + + + + + + + + + + + + + + + + + + ' . $caption . ' + + + + + + + + + + + + + + + + + +
        + + +
        + +

        ' . __( 'Link text, e.g. “Ransom Demands (PDF)”' ) . '

        + + +

        ' . __( 'Alt text for the image, e.g. “The Mona Lisa”' ) . '

        + + + + + + + + +
        + +
        + + + +

        ' . __( 'Enter a link URL or click above for presets.' ) . '

        + +
        + ' . get_submit_button( __( 'Insert into Post' ), '', 'insertonlybutton', false ) . ' +
        '; +} + +/** + * Displays the multi-file uploader message. + * + * @since 2.6.0 + * + * @global int $post_ID + */ +function media_upload_flash_bypass() { + $browser_uploader = admin_url( 'media-new.php?browser-uploader' ); + + $post = get_post(); + if ( $post ) { + $browser_uploader .= '&post_id=' . intval( $post->ID ); + } elseif ( ! empty( $GLOBALS['post_ID'] ) ) { + $browser_uploader .= '&post_id=' . intval( $GLOBALS['post_ID'] ); + } + + ?> +

        + browser uploader instead.' ), + $browser_uploader, + 'target="_blank"' + ); + ?> +

        + +

        + Switch to the multi-file uploader.' ); ?> +

        + '; + $end = ''; + } + + ?> +

        + ' . sprintf( + /* translators: %s: Allowed space allocation. */ + __( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ), + size_format( get_space_allowed() * MB_IN_BYTES ) + ) . '

        '; +} + +/** + * Displays the image and editor in the post editor + * + * @since 3.5.0 + * + * @param WP_Post $post A post object. + */ +function edit_form_image_editor( $post ) { + $open = isset( $_GET['image-editor'] ); + + if ( $open ) { + require_once ABSPATH . 'wp-admin/includes/image-edit.php'; + } + + $thumb_url = false; + $attachment_id = intval( $post->ID ); + + if ( $attachment_id ) { + $thumb_url = wp_get_attachment_image_src( $attachment_id, array( 900, 450 ), true ); + } + + $alt_text = get_post_meta( $post->ID, '_wp_attachment_image_alt', true ); + + $att_url = wp_get_attachment_url( $post->ID ); + ?> +
        + ID ) ) : + $image_edit_button = ''; + if ( wp_image_editor_supports( array( 'mime_type' => $post->post_mime_type ) ) ) { + $nonce = wp_create_nonce( "image_editor-$post->ID" ); + $image_edit_button = " "; + } + + $open_style = ''; + $not_open_style = ''; + + if ( $open ) { + $open_style = ' style="display:none"'; + } else { + $not_open_style = ' style="display:none"'; + } + + ?> +
        + + class="wp_attachment_image wp-clearfix" id="media-head-"> +

        +

        +
        + class="image-editor" id="image-editor-"> + + + $att_url ) ); + + elseif ( $attachment_id && wp_attachment_is( 'video', $post ) ) : + + wp_maybe_generate_attachment_metadata( $post ); + + $meta = wp_get_attachment_metadata( $attachment_id ); + $w = ! empty( $meta['width'] ) ? min( $meta['width'], 640 ) : 0; + $h = ! empty( $meta['height'] ) ? $meta['height'] : 0; + + if ( $h && $w < $meta['width'] ) { + $h = round( ( $meta['height'] * $w ) / $meta['width'] ); + } + + $attr = array( 'src' => $att_url ); + + if ( ! empty( $w ) && ! empty( $h ) ) { + $attr['width'] = $w; + $attr['height'] = $h; + } + + $thumb_id = get_post_thumbnail_id( $attachment_id ); + + if ( ! empty( $thumb_id ) ) { + $attr['poster'] = wp_get_attachment_url( $thumb_id ); + } + + echo wp_video_shortcode( $attr ); + + elseif ( isset( $thumb_url[0] ) ) : + ?> +
        +

        + +

        +
        + + +
        + post_mime_type, 0, 5 ) ) : ?> +

        +
        + +

        +

        + Describe the purpose of the image%3$s. Leave empty if the image is purely decorative.' ), + esc_url( 'https://www.w3.org/WAI/tutorials/images/decision-tree' ), + 'target="_blank" rel="noopener noreferrer"', + sprintf( + ' %s', + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ) + ); + + ?> +

        + + +

        +
        + +

        + + 'strong,em,link,block,del,ins,img,ul,ol,li,code,close' ); + $editor_args = array( + 'textarea_name' => 'content', + 'textarea_rows' => 5, + 'media_buttons' => false, + 'tinymce' => false, + 'quicktags' => $quicktags_settings, + ); + + ?> + + + post_content ), 'attachment_content', $editor_args ); ?> + +
        + ID ); + echo $extras['item']; + echo '' . "\n"; +} + +/** + * Displays non-editable attachment metadata in the publish meta box. + * + * @since 3.5.0 + */ +function attachment_submitbox_metadata() { + $post = get_post(); + $attachment_id = $post->ID; + + $file = get_attached_file( $attachment_id ); + $filename = esc_html( wp_basename( $file ) ); + + $media_dims = ''; + $meta = wp_get_attachment_metadata( $attachment_id ); + + if ( isset( $meta['width'], $meta['height'] ) ) { + $media_dims .= "{$meta['width']} × {$meta['height']} "; + } + /** This filter is documented in wp-admin/includes/media.php */ + $media_dims = apply_filters( 'media_meta', $media_dims, $post ); + + $att_url = wp_get_attachment_url( $attachment_id ); + + ?> +
        + + +
        +
        + +
        +
        + + + ID ), $matches ) ) { + echo esc_html( strtoupper( $matches[1] ) ); + list( $mime_type ) = explode( '/', $post->post_mime_type ); + if ( 'image' !== $mime_type && ! empty( $meta['mime_type'] ) ) { + if ( "$mime_type/" . strtolower( $matches[1] ) !== $meta['mime_type'] ) { + echo ' (' . $meta['mime_type'] . ')'; + } + } + } else { + echo strtoupper( str_replace( 'image/', '', $post->post_mime_type ) ); + } + + ?> + +
        + + +
        + +
        + post_mime_type ) ) { + $fields = array( + 'length_formatted' => __( 'Length:' ), + 'bitrate' => __( 'Bitrate:' ), + ); + + /** + * Filters the audio and video metadata fields to be shown in the publish meta box. + * + * The key for each item in the array should correspond to an attachment + * metadata key, and the value should be the desired label. + * + * @since 3.7.0 + * @since 4.9.0 Added the `$post` parameter. + * + * @param array $fields An array of the attachment metadata keys and labels. + * @param WP_Post $post WP_Post object for the current attachment. + */ + $fields = apply_filters( 'media_submitbox_misc_sections', $fields, $post ); + + foreach ( $fields as $key => $label ) { + if ( empty( $meta[ $key ] ) ) { + continue; + } + + ?> +
        + + + + +
        + __( 'Audio Format:' ), + 'codec' => __( 'Audio Codec:' ), + ); + + /** + * Filters the audio attachment metadata fields to be shown in the publish meta box. + * + * The key for each item in the array should correspond to an attachment + * metadata key, and the value should be the desired label. + * + * @since 3.7.0 + * @since 4.9.0 Added the `$post` parameter. + * + * @param array $fields An array of the attachment metadata keys and labels. + * @param WP_Post $post WP_Post object for the current attachment. + */ + $audio_fields = apply_filters( 'audio_submitbox_misc_sections', $fields, $post ); + + foreach ( $audio_fields as $key => $label ) { + if ( empty( $meta['audio'][ $key ] ) ) { + continue; + } + + ?> +
        + +
        + +
        + +
        + +
        + + + + +
        + $list ) { + if ( 'length' !== $key && ! empty( $list ) ) { + $metadata[ $key ] = wp_kses_post( reset( $list ) ); + // Fix bug in byte stream analysis. + if ( 'terms_of_use' === $key && 0 === strpos( $metadata[ $key ], 'yright notice.' ) ) { + $metadata[ $key ] = 'Cop' . $metadata[ $key ]; + } + } + } + break; + } + } + + if ( ! empty( $data['id3v2']['APIC'] ) ) { + $image = reset( $data['id3v2']['APIC'] ); + if ( ! empty( $image['data'] ) ) { + $metadata['image'] = array( + 'data' => $image['data'], + 'mime' => $image['image_mime'], + 'width' => $image['image_width'], + 'height' => $image['image_height'], + ); + } + } elseif ( ! empty( $data['comments']['picture'] ) ) { + $image = reset( $data['comments']['picture'] ); + if ( ! empty( $image['data'] ) ) { + $metadata['image'] = array( + 'data' => $image['data'], + 'mime' => $image['image_mime'], + ); + } + } +} + +/** + * Retrieve metadata from a video file's ID3 tags + * + * @since 3.6.0 + * + * @param string $file Path to file. + * @return array|bool Returns array of metadata, if found. + */ +function wp_read_video_metadata( $file ) { + if ( ! file_exists( $file ) ) { + return false; + } + + $metadata = array(); + + if ( ! defined( 'GETID3_TEMP_DIR' ) ) { + define( 'GETID3_TEMP_DIR', get_temp_dir() ); + } + + if ( ! class_exists( 'getID3', false ) ) { + require ABSPATH . WPINC . '/ID3/getid3.php'; + } + + $id3 = new getID3(); + $data = $id3->analyze( $file ); + + if ( isset( $data['video']['lossless'] ) ) { + $metadata['lossless'] = $data['video']['lossless']; + } + + if ( ! empty( $data['video']['bitrate'] ) ) { + $metadata['bitrate'] = (int) $data['video']['bitrate']; + } + + if ( ! empty( $data['video']['bitrate_mode'] ) ) { + $metadata['bitrate_mode'] = $data['video']['bitrate_mode']; + } + + if ( ! empty( $data['filesize'] ) ) { + $metadata['filesize'] = (int) $data['filesize']; + } + + if ( ! empty( $data['mime_type'] ) ) { + $metadata['mime_type'] = $data['mime_type']; + } + + if ( ! empty( $data['playtime_seconds'] ) ) { + $metadata['length'] = (int) round( $data['playtime_seconds'] ); + } + + if ( ! empty( $data['playtime_string'] ) ) { + $metadata['length_formatted'] = $data['playtime_string']; + } + + if ( ! empty( $data['video']['resolution_x'] ) ) { + $metadata['width'] = (int) $data['video']['resolution_x']; + } + + if ( ! empty( $data['video']['resolution_y'] ) ) { + $metadata['height'] = (int) $data['video']['resolution_y']; + } + + if ( ! empty( $data['fileformat'] ) ) { + $metadata['fileformat'] = $data['fileformat']; + } + + if ( ! empty( $data['video']['dataformat'] ) ) { + $metadata['dataformat'] = $data['video']['dataformat']; + } + + if ( ! empty( $data['video']['encoder'] ) ) { + $metadata['encoder'] = $data['video']['encoder']; + } + + if ( ! empty( $data['video']['codec'] ) ) { + $metadata['codec'] = $data['video']['codec']; + } + + if ( ! empty( $data['audio'] ) ) { + unset( $data['audio']['streams'] ); + $metadata['audio'] = $data['audio']; + } + + if ( empty( $metadata['created_timestamp'] ) ) { + $created_timestamp = wp_get_media_creation_timestamp( $data ); + + if ( false !== $created_timestamp ) { + $metadata['created_timestamp'] = $created_timestamp; + } + } + + wp_add_id3_tag_data( $metadata, $data ); + + $file_format = isset( $metadata['fileformat'] ) ? $metadata['fileformat'] : null; + + /** + * Filters the array of metadata retrieved from a video. + * + * In core, usually this selection is what is stored. + * More complete data can be parsed from the `$data` parameter. + * + * @since 4.9.0 + * + * @param array $metadata Filtered Video metadata. + * @param string $file Path to video file. + * @param string $file_format File format of video, as analyzed by getID3. + * @param string $data Raw metadata from getID3. + */ + return apply_filters( 'wp_read_video_metadata', $metadata, $file, $file_format, $data ); +} + +/** + * Retrieve metadata from an audio file's ID3 tags. + * + * @since 3.6.0 + * + * @param string $file Path to file. + * @return array|bool Returns array of metadata, if found. + */ +function wp_read_audio_metadata( $file ) { + if ( ! file_exists( $file ) ) { + return false; + } + + $metadata = array(); + + if ( ! defined( 'GETID3_TEMP_DIR' ) ) { + define( 'GETID3_TEMP_DIR', get_temp_dir() ); + } + + if ( ! class_exists( 'getID3', false ) ) { + require ABSPATH . WPINC . '/ID3/getid3.php'; + } + + $id3 = new getID3(); + $data = $id3->analyze( $file ); + + if ( ! empty( $data['audio'] ) ) { + unset( $data['audio']['streams'] ); + $metadata = $data['audio']; + } + + if ( ! empty( $data['fileformat'] ) ) { + $metadata['fileformat'] = $data['fileformat']; + } + + if ( ! empty( $data['filesize'] ) ) { + $metadata['filesize'] = (int) $data['filesize']; + } + + if ( ! empty( $data['mime_type'] ) ) { + $metadata['mime_type'] = $data['mime_type']; + } + + if ( ! empty( $data['playtime_seconds'] ) ) { + $metadata['length'] = (int) round( $data['playtime_seconds'] ); + } + + if ( ! empty( $data['playtime_string'] ) ) { + $metadata['length_formatted'] = $data['playtime_string']; + } + + if ( empty( $metadata['created_timestamp'] ) ) { + $created_timestamp = wp_get_media_creation_timestamp( $data ); + + if ( false !== $created_timestamp ) { + $metadata['created_timestamp'] = $created_timestamp; + } + } + + wp_add_id3_tag_data( $metadata, $data ); + + return $metadata; +} + +/** + * Parse creation date from media metadata. + * + * The getID3 library doesn't have a standard method for getting creation dates, + * so the location of this data can vary based on the MIME type. + * + * @since 4.9.0 + * + * @link https://github.com/JamesHeinrich/getID3/blob/master/structure.txt + * + * @param array $metadata The metadata returned by getID3::analyze(). + * @return int|bool A UNIX timestamp for the media's creation date if available + * or a boolean FALSE if a timestamp could not be determined. + */ +function wp_get_media_creation_timestamp( $metadata ) { + $creation_date = false; + + if ( empty( $metadata['fileformat'] ) ) { + return $creation_date; + } + + switch ( $metadata['fileformat'] ) { + case 'asf': + if ( isset( $metadata['asf']['file_properties_object']['creation_date_unix'] ) ) { + $creation_date = (int) $metadata['asf']['file_properties_object']['creation_date_unix']; + } + break; + + case 'matroska': + case 'webm': + if ( isset( $metadata['matroska']['comments']['creation_time']['0'] ) ) { + $creation_date = strtotime( $metadata['matroska']['comments']['creation_time']['0'] ); + } elseif ( isset( $metadata['matroska']['info']['0']['DateUTC_unix'] ) ) { + $creation_date = (int) $metadata['matroska']['info']['0']['DateUTC_unix']; + } + break; + + case 'quicktime': + case 'mp4': + if ( isset( $metadata['quicktime']['moov']['subatoms']['0']['creation_time_unix'] ) ) { + $creation_date = (int) $metadata['quicktime']['moov']['subatoms']['0']['creation_time_unix']; + } + break; + } + + return $creation_date; +} + +/** + * Encapsulate logic for Attach/Detach actions + * + * @since 4.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $parent_id Attachment parent ID. + * @param string $action Optional. Attach/detach action. Accepts 'attach' or 'detach'. + * Default 'attach'. + */ +function wp_media_attach_action( $parent_id, $action = 'attach' ) { + global $wpdb; + + if ( ! $parent_id ) { + return; + } + + if ( ! current_user_can( 'edit_post', $parent_id ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + $ids = array(); + + foreach ( (array) $_REQUEST['media'] as $att_id ) { + $att_id = (int) $att_id; + + if ( ! current_user_can( 'edit_post', $att_id ) ) { + continue; + } + + $ids[] = $att_id; + } + + if ( ! empty( $ids ) ) { + $ids_string = implode( ',', $ids ); + + if ( 'attach' === $action ) { + $result = $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent = %d WHERE post_type = 'attachment' AND ID IN ( $ids_string )", $parent_id ) ); + } else { + $result = $wpdb->query( "UPDATE $wpdb->posts SET post_parent = 0 WHERE post_type = 'attachment' AND ID IN ( $ids_string )" ); + } + + foreach ( $ids as $att_id ) { + clean_attachment_cache( $att_id ); + } + } + + if ( isset( $result ) ) { + $location = 'upload.php'; + $referer = wp_get_referer(); + + if ( $referer ) { + if ( false !== strpos( $referer, 'upload.php' ) ) { + $location = remove_query_arg( array( 'attached', 'detach' ), $referer ); + } + } + + $key = 'attach' === $action ? 'attached' : 'detach'; + $location = add_query_arg( array( $key => $result ), $location ); + + wp_redirect( $location ); + exit; + } +} diff --git a/wp-admin/includes/menu.php b/wp-admin/includes/menu.php new file mode 100644 index 0000000..4fe351b --- /dev/null +++ b/wp-admin/includes/menu.php @@ -0,0 +1,353 @@ + $sub ) { + foreach ( $sub as $index => $data ) { + if ( ! current_user_can( $data[1] ) ) { + unset( $submenu[ $parent ][ $index ] ); + $_wp_submenu_nopriv[ $parent ][ $data[2] ] = true; + } + } + unset( $index, $data ); + + if ( empty( $submenu[ $parent ] ) ) { + unset( $submenu[ $parent ] ); + } +} +unset( $sub, $parent ); + +/* + * Loop over the top-level menu. + * Menus for which the original parent is not accessible due to lack of privileges + * will have the next submenu in line be assigned as the new menu parent. + */ +foreach ( $menu as $id => $data ) { + if ( empty( $submenu[ $data[2] ] ) ) { + continue; + } + $subs = $submenu[ $data[2] ]; + $first_sub = reset( $subs ); + $old_parent = $data[2]; + $new_parent = $first_sub[2]; + /* + * If the first submenu is not the same as the assigned parent, + * make the first submenu the new parent. + */ + if ( $new_parent != $old_parent ) { + $_wp_real_parent_file[ $old_parent ] = $new_parent; + $menu[ $id ][2] = $new_parent; + + foreach ( $submenu[ $old_parent ] as $index => $data ) { + $submenu[ $new_parent ][ $index ] = $submenu[ $old_parent ][ $index ]; + unset( $submenu[ $old_parent ][ $index ] ); + } + unset( $submenu[ $old_parent ], $index ); + + if ( isset( $_wp_submenu_nopriv[ $old_parent ] ) ) { + $_wp_submenu_nopriv[ $new_parent ] = $_wp_submenu_nopriv[ $old_parent ]; + } + } +} +unset( $id, $data, $subs, $first_sub, $old_parent, $new_parent ); + +if ( is_network_admin() ) { + + /** + * Fires before the administration menu loads in the Network Admin. + * + * @since 3.1.0 + * + * @param string $context Empty context. + */ + do_action( 'network_admin_menu', '' ); +} elseif ( is_user_admin() ) { + + /** + * Fires before the administration menu loads in the User Admin. + * + * @since 3.1.0 + * + * @param string $context Empty context. + */ + do_action( 'user_admin_menu', '' ); +} else { + + /** + * Fires before the administration menu loads in the admin. + * + * @since 1.5.0 + * + * @param string $context Empty context. + */ + do_action( 'admin_menu', '' ); +} + +/* + * Remove menus that have no accessible submenus and require privileges + * that the user does not have. Run re-parent loop again. + */ +foreach ( $menu as $id => $data ) { + if ( ! current_user_can( $data[1] ) ) { + $_wp_menu_nopriv[ $data[2] ] = true; + } + + /* + * If there is only one submenu and it is has same destination as the parent, + * remove the submenu. + */ + if ( ! empty( $submenu[ $data[2] ] ) && 1 == count( $submenu[ $data[2] ] ) ) { + $subs = $submenu[ $data[2] ]; + $first_sub = reset( $subs ); + if ( $data[2] == $first_sub[2] ) { + unset( $submenu[ $data[2] ] ); + } + } + + // If submenu is empty... + if ( empty( $submenu[ $data[2] ] ) ) { + // And user doesn't have privs, remove menu. + if ( isset( $_wp_menu_nopriv[ $data[2] ] ) ) { + unset( $menu[ $id ] ); + } + } +} +unset( $id, $data, $subs, $first_sub ); + +/** + * @param string $add + * @param string $class + * @return string + */ +function add_cssclass( $add, $class ) { + $class = empty( $class ) ? $add : $class .= ' ' . $add; + return $class; +} + +/** + * @param array $menu + * @return array + */ +function add_menu_classes( $menu ) { + $first = false; + $lastorder = false; + $i = 0; + $mc = count( $menu ); + foreach ( $menu as $order => $top ) { + $i++; + + if ( 0 == $order ) { // Dashboard is always shown/single. + $menu[0][4] = add_cssclass( 'menu-top-first', $top[4] ); + $lastorder = 0; + continue; + } + + if ( 0 === strpos( $top[2], 'separator' ) && false !== $lastorder ) { // If separator. + $first = true; + $c = $menu[ $lastorder ][4]; + $menu[ $lastorder ][4] = add_cssclass( 'menu-top-last', $c ); + continue; + } + + if ( $first ) { + $c = $menu[ $order ][4]; + $menu[ $order ][4] = add_cssclass( 'menu-top-first', $c ); + $first = false; + } + + if ( $mc == $i ) { // Last item. + $c = $menu[ $order ][4]; + $menu[ $order ][4] = add_cssclass( 'menu-top-last', $c ); + } + + $lastorder = $order; + } + + /** + * Filters administration menus array with classes added for top-level items. + * + * @since 2.7.0 + * + * @param array $menu Associative array of administration menu items. + */ + return apply_filters( 'add_menu_classes', $menu ); +} + +uksort( $menu, 'strnatcasecmp' ); // Make it all pretty. + +/** + * Filters whether to enable custom ordering of the administration menu. + * + * See the {@see 'menu_order'} filter for reordering menu items. + * + * @since 2.8.0 + * + * @param bool $custom Whether custom ordering is enabled. Default false. + */ +if ( apply_filters( 'custom_menu_order', false ) ) { + $menu_order = array(); + foreach ( $menu as $menu_item ) { + $menu_order[] = $menu_item[2]; + } + unset( $menu_item ); + $default_menu_order = $menu_order; + + /** + * Filters the order of administration menu items. + * + * A truthy value must first be passed to the {@see 'custom_menu_order'} filter + * for this filter to work. Use the following to enable custom menu ordering: + * + * add_filter( 'custom_menu_order', '__return_true' ); + * + * @since 2.8.0 + * + * @param array $menu_order An ordered array of menu items. + */ + $menu_order = apply_filters( 'menu_order', $menu_order ); + $menu_order = array_flip( $menu_order ); + $default_menu_order = array_flip( $default_menu_order ); + + /** + * @global array $menu_order + * @global array $default_menu_order + * + * @param array $a + * @param array $b + * @return int + */ + function sort_menu( $a, $b ) { + global $menu_order, $default_menu_order; + $a = $a[2]; + $b = $b[2]; + if ( isset( $menu_order[ $a ] ) && ! isset( $menu_order[ $b ] ) ) { + return -1; + } elseif ( ! isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) { + return 1; + } elseif ( isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) { + if ( $menu_order[ $a ] == $menu_order[ $b ] ) { + return 0; + } + return ( $menu_order[ $a ] < $menu_order[ $b ] ) ? -1 : 1; + } else { + return ( $default_menu_order[ $a ] <= $default_menu_order[ $b ] ) ? -1 : 1; + } + } + + usort( $menu, 'sort_menu' ); + unset( $menu_order, $default_menu_order ); +} + +// Prevent adjacent separators. +$prev_menu_was_separator = false; +foreach ( $menu as $id => $data ) { + if ( false === stristr( $data[4], 'wp-menu-separator' ) ) { + + // This item is not a separator, so falsey the toggler and do nothing. + $prev_menu_was_separator = false; + } else { + + // The previous item was a separator, so unset this one. + if ( true === $prev_menu_was_separator ) { + unset( $menu[ $id ] ); + } + + // This item is a separator, so truthy the toggler and move on. + $prev_menu_was_separator = true; + } +} +unset( $id, $data, $prev_menu_was_separator ); + +// Remove the last menu item if it is a separator. +$last_menu_key = array_keys( $menu ); +$last_menu_key = array_pop( $last_menu_key ); +if ( ! empty( $menu ) && 'wp-menu-separator' == $menu[ $last_menu_key ][4] ) { + unset( $menu[ $last_menu_key ] ); +} +unset( $last_menu_key ); + +if ( ! user_can_access_admin_page() ) { + + /** + * Fires when access to an admin page is denied. + * + * @since 2.5.0 + */ + do_action( 'admin_page_access_denied' ); + + wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 ); +} + +$menu = add_menu_classes( $menu ); diff --git a/wp-admin/includes/meta-boxes.php b/wp-admin/includes/meta-boxes.php new file mode 100644 index 0000000..8e3ec6f --- /dev/null +++ b/wp-admin/includes/meta-boxes.php @@ -0,0 +1,1593 @@ +post_type; + $post_type_object = get_post_type_object( $post_type ); + $can_publish = current_user_can( $post_type_object->cap->publish_posts ); + ?> +
        + +
        + + +
        + +
        + +
        +
        + post_status && 'future' != $post->post_status && 'pending' != $post->post_status ) { + $private_style = ''; + if ( 'private' == $post->post_status ) { + $private_style = 'style="display:none"'; + } + ?> + type="submit" name="save" id="save-post" value="" class="button" /> + +post_status && $can_publish ) { ?> + + + +
        + +
        + post_status ) { + $preview_button_text = __( 'Preview Changes' ); + } else { + $preview_button_text = __( 'Preview' ); + } + + $preview_button = sprintf( + '%1$s %2$s', + $preview_button_text, + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ); + ?> + + +
        + + +
        +
        + +
        + +
        + + post_status ) { + case 'private': + _e( 'Privately Published' ); + break; + case 'publish': + _e( 'Published' ); + break; + case 'future': + _e( 'Scheduled' ); + break; + case 'pending': + _e( 'Pending Review' ); + break; + case 'draft': + case 'auto-draft': + _e( 'Draft' ); + break; + } + ?> + + post_status || 'private' == $post->post_status || $can_publish ) { + $private_style = ''; + if ( 'private' == $post->post_status ) { + $private_style = 'style="display:none"'; + } + ?> + class="edit-post-status hide-if-no-js" role="button"> + +
        + + + + + +
        + + +
        + +
        + + post_status ) { + $post->post_password = ''; + $visibility = 'private'; + $visibility_trans = __( 'Private' ); + } elseif ( ! empty( $post->post_password ) ) { + $visibility = 'password'; + $visibility_trans = __( 'Password protected' ); + } elseif ( 'post' === $post_type && is_sticky( $post->ID ) ) { + $visibility = 'public'; + $visibility_trans = __( 'Public, Sticky' ); + } else { + $visibility = 'public'; + $visibility_trans = __( 'Public' ); + } + + echo esc_html( $visibility_trans ); + ?> + + + + +
        + + +ID ) ); ?> /> + + + />
        + +ID ) ); ?> />
        + + />
        +
        + />
        + +

        + + +

        +
        + + +
        + + ID ) { + if ( 'future' == $post->post_status ) { // Scheduled for publishing at a future date. + /* translators: Post date information. %s: Date on which the post is currently scheduled to be published. */ + $stamp = __( 'Scheduled for: %s' ); + } elseif ( 'publish' == $post->post_status || 'private' == $post->post_status ) { // Already published. + /* translators: Post date information. %s: Date on which the post was published. */ + $stamp = __( 'Published on: %s' ); + } elseif ( '0000-00-00 00:00:00' == $post->post_date_gmt ) { // Draft, 1 or more saves, no date specified. + $stamp = __( 'Publish immediately' ); + } elseif ( time() < strtotime( $post->post_date_gmt . ' +0000' ) ) { // Draft, 1 or more saves, future date specified. + /* translators: Post date information. %s: Date on which the post is to be published. */ + $stamp = __( 'Schedule for: %s' ); + } else { // Draft, 1 or more saves, date specified. + /* translators: Post date information. %s: Date on which the post is to be published. */ + $stamp = __( 'Publish on: %s' ); + } + $date = sprintf( + $date_string, + date_i18n( $date_format, strtotime( $post->post_date ) ), + date_i18n( $time_format, strtotime( $post->post_date ) ) + ); + } else { // Draft (no saves, and thus no date specified). + $stamp = __( 'Publish immediately' ); + $date = sprintf( + $date_string, + date_i18n( $date_format, strtotime( current_time( 'mysql' ) ) ), + date_i18n( $time_format, strtotime( current_time( 'mysql' ) ) ) + ); + } + + if ( ! empty( $args['args']['revisions_count'] ) ) : + ?> +
        + ' . number_format_i18n( $args['args']['revisions_count'] ) . '' ); + ?> + +
        + +
        + + ' . $date . '' ); ?> + + + + + +
        + + +
        +
        + + + post_status && get_post_meta( $post->ID, '_customize_changeset_uuid', true ) ) : ?> +
        +

        + unpublished customization changes. You can edit, but there’s no need to publish now. It will be published automatically with those changes.' ), + esc_url( + add_query_arg( + 'changeset_uuid', + rawurlencode( get_post_meta( $post->ID, '_customize_changeset_uuid', true ) ), + admin_url( 'customize.php' ) + ) + ) + ); + ?> +

        +
        + + + +
        +
        +
        + +
        + +
        + ID ) ) { + if ( ! EMPTY_TRASH_DAYS ) { + $delete_text = __( 'Delete Permanently' ); + } else { + $delete_text = __( 'Move to Trash' ); + } + ?> + + +
        + +
        + + post_status, array( 'publish', 'future', 'private' ) ) || 0 == $post->ID ) { + if ( $can_publish ) : + if ( ! empty( $post->post_date_gmt ) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) : + ?> + + + + + + + + + + + + +
        +
        +
        +
        + + +
        + +
        + + +
        + +
        + + +
        +
        + + post_date ) ), + /* translators: Publish box time format, see https://www.php.net/date */ + date_i18n( _x( 'H:i', 'publish box time format' ), strtotime( $post->post_date ) ) + ); + /* translators: Attachment information. %s: Date the attachment was uploaded. */ + printf( __( 'Uploaded on: %s' ), '' . $uploaded_on . '' ); + ?> + +
        + + +
        +
        +
        + +
        +
        + ID ) ) { + if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) { + echo "" . __( 'Move to Trash' ) . ''; + } else { + $delete_ays = ! MEDIA_TRASH ? " onclick='return showNotice.warn();'" : ''; + echo "" . __( 'Delete Permanently' ) . ''; + } + } + ?> +
        + +
        + + + +
        +
        +
        + +
        + + post_type, 'post-formats' ) ) : + $post_formats = get_theme_support( 'post-formats' ); + + if ( is_array( $post_formats[0] ) ) : + $post_format = get_post_format( $post->ID ); + if ( ! $post_format ) { + $post_format = '0'; + } + // Add in the current one if it isn't there yet, in case the current theme doesn't support it. + if ( $post_format && ! in_array( $post_format, $post_formats[0] ) ) { + $post_formats[0][] = $post_format; + } + ?> +
        +
        + + /> + +
        /> + +
        +
        + 'post_tag' ); + if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) { + $args = array(); + } else { + $args = $box['args']; + } + $parsed_args = wp_parse_args( $args, $defaults ); + $tax_name = esc_attr( $parsed_args['taxonomy'] ); + $taxonomy = get_taxonomy( $parsed_args['taxonomy'] ); + $user_can_assign_terms = current_user_can( $taxonomy->cap->assign_terms ); + $comma = _x( ',', 'tag delimiter' ); + $terms_to_edit = get_terms_to_edit( $post->ID, $tax_name ); + if ( ! is_string( $terms_to_edit ) ) { + $terms_to_edit = ''; + } + ?> +
        +
        +
        + +

        +
        + +
        + + + +
        +

        labels->separate_items_with_commas; ?>

        + +

        labels->no_terms; ?>

        + +
        +
          +
          + +

          + + 'category' ); + if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) { + $args = array(); + } else { + $args = $box['args']; + } + $parsed_args = wp_parse_args( $args, $defaults ); + $tax_name = esc_attr( $parsed_args['taxonomy'] ); + $taxonomy = get_taxonomy( $parsed_args['taxonomy'] ); + ?> +
          + + + + +
          + "; + ?> +
            + ID, + array( + 'taxonomy' => $tax_name, + 'popular_cats' => $popular_ids, + ) + ); + ?> +
          +
          + cap->edit_terms ) ) : ?> +
          + + labels->add_new_item ); + ?> + +

          + + + + $tax_name, + 'hide_empty' => 0, + 'name' => 'new' . $tax_name . '_parent', + 'orderby' => 'name', + 'hierarchical' => 1, + 'show_option_none' => '— ' . $taxonomy->labels->parent_item . ' —', + ); + + /** + * Filters the arguments for the taxonomy parent dropdown on the Post Edit page. + * + * @since 4.4.0 + * + * @param array $parent_dropdown_args { + * Optional. Array of arguments to generate parent dropdown. + * + * @type string $taxonomy Name of the taxonomy to retrieve. + * @type bool $hide_if_empty True to skip generating markup if no + * categories are found. Default 0. + * @type string $name Value for the 'name' attribute + * of the select element. + * Default "new{$tax_name}_parent". + * @type string $orderby Which column to use for ordering + * terms. Default 'name'. + * @type bool|int $hierarchical Whether to traverse the taxonomy + * hierarchy. Default 1. + * @type string $show_option_none Text to display for the "none" option. + * Default "— {$parent} —", + * where `$parent` is 'parent_item' + * taxonomy label. + * } + */ + $parent_dropdown_args = apply_filters( 'post_edit_category_parent_dropdown_args', $parent_dropdown_args ); + + wp_dropdown_categories( $parent_dropdown_args ); + ?> + + + +

          +
          + +
          + + +

          + Learn more about manual excerpts.' ), + __( 'https://wordpress.org/support/article/excerpt/' ) + ); + ?> +

          + to_ping ) ) . '" aria-describedby="trackback-url-desc" />'; + if ( '' != $post->pinged ) { + $pings = '

          ' . __( 'Already pinged:' ) . '

            '; + $already_pinged = explode( "\n", trim( $post->pinged ) ); + foreach ( $already_pinged as $pinged_url ) { + $pings .= "\n\t
          • " . esc_html( $pinged_url ) . '
          • '; + } + $pings .= '
          '; + } + + ?> +

          + + +

          +

          +

          + pingbacks, no other action necessary.' ), + __( 'https://wordpress.org/support/article/introduction-to-blogging/#comments' ) + ); + ?> +

          + +
          +
          + ID ); + foreach ( $metadata as $key => $value ) { + if ( is_protected_meta( $metadata[ $key ]['meta_key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post->ID, $metadata[ $key ]['meta_key'] ) ) { + unset( $metadata[ $key ] ); + } + } + list_meta( $metadata ); + meta_form( $post ); + ?> +
          +

          + use in your theme.' ), + __( 'https://wordpress.org/support/article/custom-fields/' ) + ); + ?> +

          + + +

          +
          + + +

          + +

          + $post->ID, + 'number' => 1, + 'count' => true, + ) + ); + $wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table' ); + $wp_list_table->display( true ); + + if ( 1 > $total ) { + echo '

          ' . __( 'No comments yet.' ) . '

          '; + } else { + $hidden = get_hidden_meta_boxes( get_current_screen() ); + if ( ! in_array( 'commentsdiv', $hidden ) ) { + ?> + + +

          + post_name, $post ); + ?> + + + + 'authors', + 'name' => 'post_author_override', + 'selected' => empty( $post->ID ) ? $user_ID : $post->post_author, + 'include_selected' => true, + 'show' => 'display_name_with_login', + ) + ); +} + +/** + * Display list of revisions. + * + * @since 2.6.0 + * + * @param object $post + */ +function post_revisions_meta_box( $post ) { + wp_list_post_revisions( $post ); +} + +// +// Page-related Meta Boxes. +// + +/** + * Display page attributes form fields. + * + * @since 2.7.0 + * + * @param object $post + */ +function page_attributes_meta_box( $post ) { + if ( is_post_type_hierarchical( $post->post_type ) ) : + $dropdown_args = array( + 'post_type' => $post->post_type, + 'exclude_tree' => $post->ID, + 'selected' => $post->post_parent, + 'name' => 'parent_id', + 'show_option_none' => __( '(no parent)' ), + 'sort_column' => 'menu_order, post_title', + 'echo' => 0, + ); + + /** + * Filters the arguments used to generate a Pages drop-down element. + * + * @since 3.3.0 + * + * @see wp_dropdown_pages() + * + * @param array $dropdown_args Array of arguments used to generate the pages drop-down. + * @param WP_Post $post The current post. + */ + $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post ); + $pages = wp_dropdown_pages( $dropdown_args ); + if ( ! empty( $pages ) ) : + ?> +

          + + 0 && get_option( 'page_for_posts' ) != $post->ID ) : + $template = ! empty( $post->page_template ) ? $post->page_template : false; + ?> +

          + +

          + + + post_type, 'page-attributes' ) ) : ?> +

          + + + post_type && get_current_screen()->get_help_tabs() ) : ?> +

          + + + +
          +
            +
          • +
          • +
          + +
          +
            + link_id ) ) { + wp_link_category_checklist( $link->link_id ); + } else { + wp_link_category_checklist(); + } + ?> +
          +
          + + + +
          + + +
          +
          + +
          +

          +

          +

          +
          +

          + link_rel ) ? $link->link_rel : ''; // In PHP 5.3: $link_rel = $link->link_rel ?: ''; + $rels = preg_split( '/\s+/', $link_rel ); + + if ( '' != $value && in_array( $value, $rels ) ) { + echo ' checked="checked"'; + } + + if ( '' == $value ) { + if ( 'family' == $class && strpos( $link_rel, 'child' ) === false && strpos( $link_rel, 'parent' ) === false && strpos( $link_rel, 'sibling' ) === false && strpos( $link_rel, 'spouse' ) === false && strpos( $link_rel, 'kin' ) === false ) { + echo ' checked="checked"'; + } + if ( 'friendship' == $class && strpos( $link_rel, 'friend' ) === false && strpos( $link_rel, 'acquaintance' ) === false && strpos( $link_rel, 'contact' ) === false ) { + echo ' checked="checked"'; + } + if ( 'geographical' == $class && strpos( $link_rel, 'co-resident' ) === false && strpos( $link_rel, 'neighbor' ) === false ) { + echo ' checked="checked"'; + } + if ( 'identity' == $class && in_array( 'me', $rels ) ) { + echo ' checked="checked"'; + } + } +} + +/** + * Display xfn form fields. + * + * @since 2.6.0 + * + * @param object $link + */ +function link_xfn_meta_box( $link ) { + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          XFN.' ); ?>

          + + + + + + + + + + + + + + + + + + + + ID, '_thumbnail_id', true ); + echo _wp_post_thumbnail_html( $thumbnail_id, $post->ID ); +} + +/** + * Display fields for ID3 data + * + * @since 3.9.0 + * + * @param WP_Post $post A post object. + */ +function attachment_id3_data_meta_box( $post ) { + $meta = array(); + if ( ! empty( $post->ID ) ) { + $meta = wp_get_attachment_metadata( $post->ID ); + } + + foreach ( wp_get_attachment_id3_keys( $post, 'edit' ) as $key => $label ) : + $value = ''; + if ( ! empty( $meta[ $key ] ) ) { + $value = $meta[ $key ]; + } + ?> +

          +
          + +

          + post_type; + $post_type_object = get_post_type_object( $post_type ); + + $thumbnail_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' ); + if ( ! $thumbnail_support && 'attachment' === $post_type && $post->post_mime_type ) { + if ( wp_attachment_is( 'audio', $post ) ) { + $thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' ); + } elseif ( wp_attachment_is( 'video', $post ) ) { + $thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' ); + } + } + + $publish_callback_args = array( '__back_compat_meta_box' => true ); + if ( post_type_supports( $post_type, 'revisions' ) && 'auto-draft' != $post->post_status ) { + $revisions = wp_get_post_revisions( $post->ID ); + + // We should aim to show the revisions meta box only when there are revisions. + if ( count( $revisions ) > 1 ) { + reset( $revisions ); // Reset pointer for key(). + $publish_callback_args = array( + 'revisions_count' => count( $revisions ), + 'revision_id' => key( $revisions ), + '__back_compat_meta_box' => true, + ); + add_meta_box( 'revisionsdiv', __( 'Revisions' ), 'post_revisions_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) ); + } + } + + if ( 'attachment' == $post_type ) { + wp_enqueue_script( 'image-edit' ); + wp_enqueue_style( 'imgareaselect' ); + add_meta_box( 'submitdiv', __( 'Save' ), 'attachment_submit_meta_box', null, 'side', 'core', array( '__back_compat_meta_box' => true ) ); + add_action( 'edit_form_after_title', 'edit_form_image_editor' ); + + if ( wp_attachment_is( 'audio', $post ) ) { + add_meta_box( 'attachment-id3', __( 'Metadata' ), 'attachment_id3_data_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) ); + } + } else { + add_meta_box( 'submitdiv', __( 'Publish' ), 'post_submit_meta_box', null, 'side', 'core', $publish_callback_args ); + } + + if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post_type, 'post-formats' ) ) { + add_meta_box( 'formatdiv', _x( 'Format', 'post format' ), 'post_format_meta_box', null, 'side', 'core', array( '__back_compat_meta_box' => true ) ); + } + + // All taxonomies. + foreach ( get_object_taxonomies( $post ) as $tax_name ) { + $taxonomy = get_taxonomy( $tax_name ); + if ( ! $taxonomy->show_ui || false === $taxonomy->meta_box_cb ) { + continue; + } + + $label = $taxonomy->labels->name; + + if ( ! is_taxonomy_hierarchical( $tax_name ) ) { + $tax_meta_box_id = 'tagsdiv-' . $tax_name; + } else { + $tax_meta_box_id = $tax_name . 'div'; + } + + add_meta_box( + $tax_meta_box_id, + $label, + $taxonomy->meta_box_cb, + null, + 'side', + 'core', + array( + 'taxonomy' => $tax_name, + '__back_compat_meta_box' => true, + ) + ); + } + + if ( post_type_supports( $post_type, 'page-attributes' ) || count( get_page_templates( $post ) ) > 0 ) { + add_meta_box( 'pageparentdiv', $post_type_object->labels->attributes, 'page_attributes_meta_box', null, 'side', 'core', array( '__back_compat_meta_box' => true ) ); + } + + if ( $thumbnail_support && current_user_can( 'upload_files' ) ) { + add_meta_box( 'postimagediv', esc_html( $post_type_object->labels->featured_image ), 'post_thumbnail_meta_box', null, 'side', 'low', array( '__back_compat_meta_box' => true ) ); + } + + if ( post_type_supports( $post_type, 'excerpt' ) ) { + add_meta_box( 'postexcerpt', __( 'Excerpt' ), 'post_excerpt_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) ); + } + + if ( post_type_supports( $post_type, 'trackbacks' ) ) { + add_meta_box( 'trackbacksdiv', __( 'Send Trackbacks' ), 'post_trackback_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) ); + } + + if ( post_type_supports( $post_type, 'custom-fields' ) ) { + add_meta_box( + 'postcustom', + __( 'Custom Fields' ), + 'post_custom_meta_box', + null, + 'normal', + 'core', + array( + '__back_compat_meta_box' => ! (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true ), + '__block_editor_compatible_meta_box' => true, + ) + ); + } + + /** + * Fires in the middle of built-in meta box registration. + * + * @since 2.1.0 + * @deprecated 3.7.0 Use {@see 'add_meta_boxes'} instead. + * + * @param WP_Post $post Post object. + */ + do_action_deprecated( 'dbx_post_advanced', array( $post ), '3.7.0', 'add_meta_boxes' ); + + // Allow the Discussion meta box to show up if the post type supports comments, + // or if comments or pings are open. + if ( comments_open( $post ) || pings_open( $post ) || post_type_supports( $post_type, 'comments' ) ) { + add_meta_box( 'commentstatusdiv', __( 'Discussion' ), 'post_comment_status_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) ); + } + + $stati = get_post_stati( array( 'public' => true ) ); + if ( empty( $stati ) ) { + $stati = array( 'publish' ); + } + $stati[] = 'private'; + + if ( in_array( get_post_status( $post ), $stati ) ) { + // If the post type support comments, or the post has comments, + // allow the Comments meta box. + if ( comments_open( $post ) || pings_open( $post ) || $post->comment_count > 0 || post_type_supports( $post_type, 'comments' ) ) { + add_meta_box( 'commentsdiv', __( 'Comments' ), 'post_comment_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) ); + } + } + + if ( ! ( 'pending' == get_post_status( $post ) && ! current_user_can( $post_type_object->cap->publish_posts ) ) ) { + add_meta_box( 'slugdiv', __( 'Slug' ), 'post_slug_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) ); + } + + if ( post_type_supports( $post_type, 'author' ) && current_user_can( $post_type_object->cap->edit_others_posts ) ) { + add_meta_box( 'authordiv', __( 'Author' ), 'post_author_meta_box', null, 'normal', 'core', array( '__back_compat_meta_box' => true ) ); + } + + /** + * Fires after all built-in meta boxes have been added. + * + * @since 3.0.0 + * + * @param string $post_type Post type. + * @param WP_Post $post Post object. + */ + do_action( 'add_meta_boxes', $post_type, $post ); + + /** + * Fires after all built-in meta boxes have been added, contextually for the given post type. + * + * The dynamic portion of the hook, `$post_type`, refers to the post type of the post. + * + * @since 3.0.0 + * + * @param WP_Post $post Post object. + */ + do_action( "add_meta_boxes_{$post_type}", $post ); + + /** + * Fires after meta boxes have been added. + * + * Fires once for each of the default meta box contexts: normal, advanced, and side. + * + * @since 3.0.0 + * + * @param string $post_type Post type of the post on Edit Post screen, 'link' on Edit Link screen, + * 'dashboard' on Dashboard screen. + * @param string $context Meta box context. Possible values include 'normal', 'advanced', 'side'. + * @param WP_Post|object|string $post Post object on Edit Post screen, link object on Edit Link screen, + * an empty string on Dashboard screen. + */ + do_action( 'do_meta_boxes', $post_type, 'normal', $post ); + /** This action is documented in wp-admin/includes/meta-boxes.php */ + do_action( 'do_meta_boxes', $post_type, 'advanced', $post ); + /** This action is documented in wp-admin/includes/meta-boxes.php */ + do_action( 'do_meta_boxes', $post_type, 'side', $post ); +} diff --git a/wp-admin/includes/misc.php b/wp-admin/includes/misc.php new file mode 100644 index 0000000..a21aaca --- /dev/null +++ b/wp-admin/includes/misc.php @@ -0,0 +1,1475 @@ + $text ) { + $instructions[ $line ] = '# ' . $text; + } + + /** + * Filters the inline instructions inserted before the dynamically generated content. + * + * @since 5.3.0 + * + * @param string[] $instructions Array of lines with inline instructions. + * @param string $marker The marker being inserted. + */ + $instructions = apply_filters( 'insert_with_markers_inline_instructions', $instructions, $marker ); + + if ( $switched_locale ) { + restore_previous_locale(); + } + + $insertion = array_merge( $instructions, $insertion ); + + $start_marker = "# BEGIN {$marker}"; + $end_marker = "# END {$marker}"; + + $fp = fopen( $filename, 'r+' ); + if ( ! $fp ) { + return false; + } + + // Attempt to get a lock. If the filesystem supports locking, this will block until the lock is acquired. + flock( $fp, LOCK_EX ); + + $lines = array(); + while ( ! feof( $fp ) ) { + $lines[] = rtrim( fgets( $fp ), "\r\n" ); + } + + // Split out the existing file into the preceding lines, and those that appear after the marker. + $pre_lines = array(); + $post_lines = array(); + $existing_lines = array(); + $found_marker = false; + $found_end_marker = false; + foreach ( $lines as $line ) { + if ( ! $found_marker && false !== strpos( $line, $start_marker ) ) { + $found_marker = true; + continue; + } elseif ( ! $found_end_marker && false !== strpos( $line, $end_marker ) ) { + $found_end_marker = true; + continue; + } + if ( ! $found_marker ) { + $pre_lines[] = $line; + } elseif ( $found_marker && $found_end_marker ) { + $post_lines[] = $line; + } else { + $existing_lines[] = $line; + } + } + + // Check to see if there was a change. + if ( $existing_lines === $insertion ) { + flock( $fp, LOCK_UN ); + fclose( $fp ); + + return true; + } + + // Generate the new file data. + $new_file_data = implode( + "\n", + array_merge( + $pre_lines, + array( $start_marker ), + $insertion, + array( $end_marker ), + $post_lines + ) + ); + + // Write to the start of the file, and truncate it to that length. + fseek( $fp, 0 ); + $bytes = fwrite( $fp, $new_file_data ); + if ( $bytes ) { + ftruncate( $fp, ftell( $fp ) ); + } + fflush( $fp ); + flock( $fp, LOCK_UN ); + fclose( $fp ); + + return (bool) $bytes; +} + +/** + * Updates the htaccess file with the current rules if it is writable. + * + * Always writes to the file if it exists and is writable to ensure that we + * blank out old rules. + * + * @since 1.5.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * + * @return bool|null True on write success, false on failure. Null in multisite. + */ +function save_mod_rewrite_rules() { + if ( is_multisite() ) { + return; + } + + global $wp_rewrite; + + // Ensure get_home_path() is declared. + require_once ABSPATH . 'wp-admin/includes/file.php'; + + $home_path = get_home_path(); + $htaccess_file = $home_path . '.htaccess'; + + /* + * If the file doesn't already exist check for write access to the directory + * and whether we have some rules. Else check for write access to the file. + */ + if ( ( ! file_exists( $htaccess_file ) && is_writable( $home_path ) && $wp_rewrite->using_mod_rewrite_permalinks() ) || is_writable( $htaccess_file ) ) { + if ( got_mod_rewrite() ) { + $rules = explode( "\n", $wp_rewrite->mod_rewrite_rules() ); + return insert_with_markers( $htaccess_file, 'WordPress', $rules ); + } + } + + return false; +} + +/** + * Updates the IIS web.config file with the current rules if it is writable. + * If the permalinks do not require rewrite rules then the rules are deleted from the web.config file. + * + * @since 2.8.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * + * @return bool|null True on write success, false on failure. Null in multisite. + */ +function iis7_save_url_rewrite_rules() { + if ( is_multisite() ) { + return; + } + + global $wp_rewrite; + + // Ensure get_home_path() is declared. + require_once ABSPATH . 'wp-admin/includes/file.php'; + + $home_path = get_home_path(); + $web_config_file = $home_path . 'web.config'; + + // Using win_is_writable() instead of is_writable() because of a bug in Windows PHP. + if ( iis7_supports_permalinks() && ( ( ! file_exists( $web_config_file ) && win_is_writable( $home_path ) && $wp_rewrite->using_mod_rewrite_permalinks() ) || win_is_writable( $web_config_file ) ) ) { + $rule = $wp_rewrite->iis7_url_rewrite_rules( false ); + if ( ! empty( $rule ) ) { + return iis7_add_rewrite_rule( $web_config_file, $rule ); + } else { + return iis7_delete_rewrite_rule( $web_config_file ); + } + } + return false; +} + +/** + * Update the "recently-edited" file for the plugin or theme editor. + * + * @since 1.5.0 + * + * @param string $file + */ +function update_recently_edited( $file ) { + $oldfiles = (array) get_option( 'recently_edited' ); + if ( $oldfiles ) { + $oldfiles = array_reverse( $oldfiles ); + $oldfiles[] = $file; + $oldfiles = array_reverse( $oldfiles ); + $oldfiles = array_unique( $oldfiles ); + if ( 5 < count( $oldfiles ) ) { + array_pop( $oldfiles ); + } + } else { + $oldfiles[] = $file; + } + update_option( 'recently_edited', $oldfiles ); +} + +/** + * Makes a tree structure for the theme editor's file list. + * + * @since 4.9.0 + * @access private + * + * @param array $allowed_files List of theme file paths. + * @return array Tree structure for listing theme files. + */ +function wp_make_theme_file_tree( $allowed_files ) { + $tree_list = array(); + foreach ( $allowed_files as $file_name => $absolute_filename ) { + $list = explode( '/', $file_name ); + $last_dir = &$tree_list; + foreach ( $list as $dir ) { + $last_dir =& $last_dir[ $dir ]; + } + $last_dir = $file_name; + } + return $tree_list; +} + +/** + * Outputs the formatted file list for the theme editor. + * + * @since 4.9.0 + * @access private + * + * @global string $relative_file Name of the file being edited relative to the + * theme directory. + * @global string $stylesheet The stylesheet name of the theme being edited. + * + * @param array|string $tree List of file/folder paths, or filename. + * @param int $level The aria-level for the current iteration. + * @param int $size The aria-setsize for the current iteration. + * @param int $index The aria-posinset for the current iteration. + */ +function wp_print_theme_file_tree( $tree, $level = 2, $size = 1, $index = 1 ) { + global $relative_file, $stylesheet; + + if ( is_array( $tree ) ) { + $index = 0; + $size = count( $tree ); + foreach ( $tree as $label => $theme_file ) : + $index++; + if ( ! is_array( $theme_file ) ) { + wp_print_theme_file_tree( $theme_file, $level, $index, $size ); + continue; + } + ?> +
        • + +
          +
        • + rawurlencode( $tree ), + 'theme' => rawurlencode( $stylesheet ), + ), + self_admin_url( 'theme-editor.php' ) + ); + ?> +
        • + + (' . esc_html( $filename ) . ')'; + } + + if ( $relative_file === $filename ) { + echo '' . $file_description . ''; + } else { + echo $file_description; + } + ?> + +
        • + $plugin_file ) : + $index++; + if ( ! is_array( $plugin_file ) ) { + wp_print_plugin_file_tree( $plugin_file, $label, $level, $index, $size ); + continue; + } + ?> +
        • + +
          +
        • + rawurlencode( $tree ), + 'plugin' => rawurlencode( $plugin ), + ), + self_admin_url( 'plugin-editor.php' ) + ); + ?> +
        • + + ' . esc_html( $label ) . ''; + } else { + echo esc_html( $label ); + } + ?> + +
        • + get_error_data() && is_string( $message->get_error_data() ) ) { + $message = $message->get_error_message() . ': ' . $message->get_error_data(); + } else { + $message = $message->get_error_message(); + } + } + echo "

          $message

          \n"; + wp_ob_end_flush_all(); + flush(); +} + +/** + * @since 2.8.0 + * + * @param string $content + * @return array + */ +function wp_doc_link_parse( $content ) { + if ( ! is_string( $content ) || empty( $content ) ) { + return array(); + } + + if ( ! function_exists( 'token_get_all' ) ) { + return array(); + } + + $tokens = token_get_all( $content ); + $count = count( $tokens ); + $functions = array(); + $ignore_functions = array(); + for ( $t = 0; $t < $count - 2; $t++ ) { + if ( ! is_array( $tokens[ $t ] ) ) { + continue; + } + + if ( T_STRING == $tokens[ $t ][0] && ( '(' == $tokens[ $t + 1 ] || '(' == $tokens[ $t + 2 ] ) ) { + // If it's a function or class defined locally, there's not going to be any docs available. + if ( ( isset( $tokens[ $t - 2 ][1] ) && in_array( $tokens[ $t - 2 ][1], array( 'function', 'class' ) ) ) || ( isset( $tokens[ $t - 2 ][0] ) && T_OBJECT_OPERATOR == $tokens[ $t - 1 ][0] ) ) { + $ignore_functions[] = $tokens[ $t ][1]; + } + // Add this to our stack of unique references. + $functions[] = $tokens[ $t ][1]; + } + } + + $functions = array_unique( $functions ); + sort( $functions ); + + /** + * Filters the list of functions and classes to be ignored from the documentation lookup. + * + * @since 2.8.0 + * + * @param string[] $ignore_functions Array of names of functions and classes to be ignored. + */ + $ignore_functions = apply_filters( 'documentation_ignore_functions', $ignore_functions ); + + $ignore_functions = array_unique( $ignore_functions ); + + $out = array(); + foreach ( $functions as $function ) { + if ( in_array( $function, $ignore_functions ) ) { + continue; + } + $out[] = $function; + } + + return $out; +} + +/** + * Saves option for number of rows when listing posts, pages, comments, etc. + * + * @since 2.8.0 + */ +function set_screen_options() { + + if ( isset( $_POST['wp_screen_options'] ) && is_array( $_POST['wp_screen_options'] ) ) { + check_admin_referer( 'screen-options-nonce', 'screenoptionnonce' ); + + $user = wp_get_current_user(); + if ( ! $user ) { + return; + } + $option = $_POST['wp_screen_options']['option']; + $value = $_POST['wp_screen_options']['value']; + + if ( sanitize_key( $option ) != $option ) { + return; + } + + $map_option = $option; + $type = str_replace( 'edit_', '', $map_option ); + $type = str_replace( '_per_page', '', $type ); + if ( in_array( $type, get_taxonomies() ) ) { + $map_option = 'edit_tags_per_page'; + } elseif ( in_array( $type, get_post_types() ) ) { + $map_option = 'edit_per_page'; + } else { + $option = str_replace( '-', '_', $option ); + } + + switch ( $map_option ) { + case 'edit_per_page': + case 'users_per_page': + case 'edit_comments_per_page': + case 'upload_per_page': + case 'edit_tags_per_page': + case 'plugins_per_page': + case 'export_personal_data_requests_per_page': + case 'remove_personal_data_requests_per_page': + // Network admin. + case 'sites_network_per_page': + case 'users_network_per_page': + case 'site_users_network_per_page': + case 'plugins_network_per_page': + case 'themes_network_per_page': + case 'site_themes_network_per_page': + $value = (int) $value; + if ( $value < 1 || $value > 999 ) { + return; + } + break; + default: + if ( '_page' === substr( $option, -5 ) || 'layout_columns' === $option ) { + /** + * Filters a screen option value before it is set. + * + * The filter can also be used to modify non-standard [items]_per_page + * settings. See the parent function for a full list of standard options. + * + * Returning false to the filter will skip saving the current option. + * + * @since 2.8.0 + * @since 5.4.2 Only applied to options ending with '_page', + * or the 'layout_columns' option. + * + * @see set_screen_options() + * + * @param bool $keep Whether to save or skip saving the screen option value. + * Default false. + * @param string $option The option name. + * @param int $value The number of rows to use. + */ + $value = apply_filters( 'set-screen-option', false, $option, $value ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } + + /** + * Filters a screen option value before it is set. + * + * The dynamic portion of the hook, `$option`, refers to the option name. + * + * Returning false to the filter will skip saving the current option. + * + * @since 5.4.2 + * + * @see set_screen_options() + * + * @param bool $keep Whether to save or skip saving the screen option value. + * Default false. + * @param string $option The option name. + * @param int $value The number of rows to use. + */ + $value = apply_filters( "set_screen_option_{$option}", false, $option, $value ); + + if ( false === $value ) { + return; + } + break; + } + + update_user_meta( $user->ID, $option, $value ); + + $url = remove_query_arg( array( 'pagenum', 'apage', 'paged' ), wp_get_referer() ); + if ( isset( $_POST['mode'] ) ) { + $url = add_query_arg( array( 'mode' => $_POST['mode'] ), $url ); + } + + wp_safe_redirect( $url ); + exit; + } +} + +/** + * Check if rewrite rule for WordPress already exists in the IIS 7+ configuration file + * + * @since 2.8.0 + * + * @return bool + * @param string $filename The file path to the configuration file + */ +function iis7_rewrite_rule_exists( $filename ) { + if ( ! file_exists( $filename ) ) { + return false; + } + if ( ! class_exists( 'DOMDocument', false ) ) { + return false; + } + + $doc = new DOMDocument(); + if ( $doc->load( $filename ) === false ) { + return false; + } + $xpath = new DOMXPath( $doc ); + $rules = $xpath->query( '/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')] | /configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'WordPress\')]' ); + if ( 0 == $rules->length ) { + return false; + } else { + return true; + } +} + +/** + * Delete WordPress rewrite rule from web.config file if it exists there + * + * @since 2.8.0 + * + * @param string $filename Name of the configuration file + * @return bool + */ +function iis7_delete_rewrite_rule( $filename ) { + // If configuration file does not exist then rules also do not exist, so there is nothing to delete. + if ( ! file_exists( $filename ) ) { + return true; + } + + if ( ! class_exists( 'DOMDocument', false ) ) { + return false; + } + + $doc = new DOMDocument(); + $doc->preserveWhiteSpace = false; + + if ( $doc->load( $filename ) === false ) { + return false; + } + $xpath = new DOMXPath( $doc ); + $rules = $xpath->query( '/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')] | /configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'WordPress\')]' ); + if ( $rules->length > 0 ) { + $child = $rules->item( 0 ); + $parent = $child->parentNode; + $parent->removeChild( $child ); + $doc->formatOutput = true; + saveDomDocument( $doc, $filename ); + } + return true; +} + +/** + * Add WordPress rewrite rule to the IIS 7+ configuration file. + * + * @since 2.8.0 + * + * @param string $filename The file path to the configuration file + * @param string $rewrite_rule The XML fragment with URL Rewrite rule + * @return bool + */ +function iis7_add_rewrite_rule( $filename, $rewrite_rule ) { + if ( ! class_exists( 'DOMDocument', false ) ) { + return false; + } + + // If configuration file does not exist then we create one. + if ( ! file_exists( $filename ) ) { + $fp = fopen( $filename, 'w' ); + fwrite( $fp, '' ); + fclose( $fp ); + } + + $doc = new DOMDocument(); + $doc->preserveWhiteSpace = false; + + if ( $doc->load( $filename ) === false ) { + return false; + } + + $xpath = new DOMXPath( $doc ); + + // First check if the rule already exists as in that case there is no need to re-add it. + $wordpress_rules = $xpath->query( '/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')] | /configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'WordPress\')]' ); + if ( $wordpress_rules->length > 0 ) { + return true; + } + + // Check the XPath to the rewrite rule and create XML nodes if they do not exist. + $xmlnodes = $xpath->query( '/configuration/system.webServer/rewrite/rules' ); + if ( $xmlnodes->length > 0 ) { + $rules_node = $xmlnodes->item( 0 ); + } else { + $rules_node = $doc->createElement( 'rules' ); + + $xmlnodes = $xpath->query( '/configuration/system.webServer/rewrite' ); + if ( $xmlnodes->length > 0 ) { + $rewrite_node = $xmlnodes->item( 0 ); + $rewrite_node->appendChild( $rules_node ); + } else { + $rewrite_node = $doc->createElement( 'rewrite' ); + $rewrite_node->appendChild( $rules_node ); + + $xmlnodes = $xpath->query( '/configuration/system.webServer' ); + if ( $xmlnodes->length > 0 ) { + $system_webServer_node = $xmlnodes->item( 0 ); + $system_webServer_node->appendChild( $rewrite_node ); + } else { + $system_webServer_node = $doc->createElement( 'system.webServer' ); + $system_webServer_node->appendChild( $rewrite_node ); + + $xmlnodes = $xpath->query( '/configuration' ); + if ( $xmlnodes->length > 0 ) { + $config_node = $xmlnodes->item( 0 ); + $config_node->appendChild( $system_webServer_node ); + } else { + $config_node = $doc->createElement( 'configuration' ); + $doc->appendChild( $config_node ); + $config_node->appendChild( $system_webServer_node ); + } + } + } + } + + $rule_fragment = $doc->createDocumentFragment(); + $rule_fragment->appendXML( $rewrite_rule ); + $rules_node->appendChild( $rule_fragment ); + + $doc->encoding = 'UTF-8'; + $doc->formatOutput = true; + saveDomDocument( $doc, $filename ); + + return true; +} + +/** + * Saves the XML document into a file + * + * @since 2.8.0 + * + * @param DOMDocument $doc + * @param string $filename + */ +function saveDomDocument( $doc, $filename ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + $config = $doc->saveXML(); + $config = preg_replace( "/([^\r])\n/", "$1\r\n", $config ); + $fp = fopen( $filename, 'w' ); + fwrite( $fp, $config ); + fclose( $fp ); +} + +/** + * Display the default admin color scheme picker (Used in user-edit.php) + * + * @since 3.0.0 + * + * @global array $_wp_admin_css_colors + * + * @param int $user_id User ID. + */ +function admin_color_scheme_picker( $user_id ) { + global $_wp_admin_css_colors; + + ksort( $_wp_admin_css_colors ); + + if ( isset( $_wp_admin_css_colors['fresh'] ) ) { + // Set Default ('fresh') and Light should go first. + $_wp_admin_css_colors = array_filter( + array_merge( + array( + 'fresh' => '', + 'light' => '', + ), + $_wp_admin_css_colors + ) + ); + } + + $current_color = get_user_option( 'admin_color', $user_id ); + + if ( empty( $current_color ) || ! isset( $_wp_admin_css_colors[ $current_color ] ) ) { + $current_color = 'fresh'; + } + + ?> +
          + + $color_info ) : + + ?> +
          + /> + + + + + + colors as $html_color ) { + ?> + + + +
           
          +
          + +
          + icon_colors ) ) { + $icon_colors = $_wp_admin_css_colors[ $color_scheme ]->icon_colors; + } elseif ( ! empty( $_wp_admin_css_colors['fresh']->icon_colors ) ) { + $icon_colors = $_wp_admin_css_colors['fresh']->icon_colors; + } else { + // Fall back to the default set of icon colors if the default scheme is missing. + $icon_colors = array( + 'base' => '#a0a5aa', + 'focus' => '#00a0d2', + 'current' => '#fff', + ); + } + + echo '\n"; +} + +/** + * @since 3.3.0 + */ +function _ipad_meta() { + if ( wp_is_mobile() ) { + ?> + + sprintf( __( '%s is currently editing' ), $user->display_name ), + ); + + $avatar = get_avatar( $user->ID, 18 ); + if ( $avatar && preg_match( "|src='([^']+)'|", $avatar, $matches ) ) { + $send['avatar_src'] = $matches[1]; + } + + $checked[ $key ] = $send; + } + } + } + } + + if ( ! empty( $checked ) ) { + $response['wp-check-locked-posts'] = $checked; + } + + return $response; +} + +/** + * Check lock status on the New/Edit Post screen and refresh the lock + * + * @since 3.6.0 + * + * @param array $response The Heartbeat response. + * @param array $data The $_POST data sent. + * @param string $screen_id The screen id. + * @return array The Heartbeat response. + */ +function wp_refresh_post_lock( $response, $data, $screen_id ) { + if ( array_key_exists( 'wp-refresh-post-lock', $data ) ) { + $received = $data['wp-refresh-post-lock']; + $send = array(); + + $post_id = absint( $received['post_id'] ); + if ( ! $post_id ) { + return $response; + } + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + return $response; + } + + $user_id = wp_check_post_lock( $post_id ); + $user = get_userdata( $user_id ); + if ( $user ) { + $error = array( + /* translators: %s: User's display name. */ + 'text' => sprintf( __( '%s has taken over and is currently editing.' ), $user->display_name ), + ); + + $avatar = get_avatar( $user->ID, 64 ); + if ( $avatar ) { + if ( preg_match( "|src='([^']+)'|", $avatar, $matches ) ) { + $error['avatar_src'] = $matches[1]; + } + } + + $send['lock_error'] = $error; + } else { + $new_lock = wp_set_post_lock( $post_id ); + if ( $new_lock ) { + $send['new_lock'] = implode( ':', $new_lock ); + } + } + + $response['wp-refresh-post-lock'] = $send; + } + + return $response; +} + +/** + * Check nonce expiration on the New/Edit Post screen and refresh if needed + * + * @since 3.6.0 + * + * @param array $response The Heartbeat response. + * @param array $data The $_POST data sent. + * @param string $screen_id The screen id. + * @return array The Heartbeat response. + */ +function wp_refresh_post_nonces( $response, $data, $screen_id ) { + if ( array_key_exists( 'wp-refresh-post-nonces', $data ) ) { + $received = $data['wp-refresh-post-nonces']; + $response['wp-refresh-post-nonces'] = array( 'check' => 1 ); + + $post_id = absint( $received['post_id'] ); + if ( ! $post_id ) { + return $response; + } + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + return $response; + } + + $response['wp-refresh-post-nonces'] = array( + 'replace' => array( + 'getpermalinknonce' => wp_create_nonce( 'getpermalink' ), + 'samplepermalinknonce' => wp_create_nonce( 'samplepermalink' ), + 'closedpostboxesnonce' => wp_create_nonce( 'closedpostboxes' ), + '_ajax_linking_nonce' => wp_create_nonce( 'internal-linking' ), + '_wpnonce' => wp_create_nonce( 'update-post_' . $post_id ), + ), + ); + } + + return $response; +} + +/** + * Add the latest Heartbeat and REST-API nonce to the Heartbeat response. + * + * @since 5.0.0 + * + * @param array $response The Heartbeat response. + * @return array The Heartbeat response. + */ +function wp_refresh_heartbeat_nonces( $response ) { + // Refresh the Rest API nonce. + $response['rest_nonce'] = wp_create_nonce( 'wp_rest' ); + + // Refresh the Heartbeat nonce. + $response['heartbeat_nonce'] = wp_create_nonce( 'heartbeat-nonce' ); + return $response; +} + +/** + * Disable suspension of Heartbeat on the Add/Edit Post screens. + * + * @since 3.8.0 + * + * @global string $pagenow + * + * @param array $settings An array of Heartbeat settings. + * @return array Filtered Heartbeat settings. + */ +function wp_heartbeat_set_suspension( $settings ) { + global $pagenow; + + if ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) { + $settings['suspension'] = 'disable'; + } + + return $settings; +} + +/** + * Autosave with heartbeat + * + * @since 3.9.0 + * + * @param array $response The Heartbeat response. + * @param array $data The $_POST data sent. + * @return array The Heartbeat response. + */ +function heartbeat_autosave( $response, $data ) { + if ( ! empty( $data['wp_autosave'] ) ) { + $saved = wp_autosave( $data['wp_autosave'] ); + + if ( is_wp_error( $saved ) ) { + $response['wp_autosave'] = array( + 'success' => false, + 'message' => $saved->get_error_message(), + ); + } elseif ( empty( $saved ) ) { + $response['wp_autosave'] = array( + 'success' => false, + 'message' => __( 'Error while saving.' ), + ); + } else { + /* translators: Draft saved date format, see https://www.php.net/date */ + $draft_saved_date_format = __( 'g:i:s a' ); + $response['wp_autosave'] = array( + 'success' => true, + /* translators: %s: Date and time. */ + 'message' => sprintf( __( 'Draft saved at %s.' ), date_i18n( $draft_saved_date_format ) ), + ); + } + } + + return $response; +} + +/** + * Remove single-use URL parameters and create canonical link based on new URL. + * + * Remove specific query string parameters from a URL, create the canonical link, + * put it in the admin header, and change the current URL to match. + * + * @since 4.2.0 + */ +function wp_admin_canonical_url() { + $removable_query_args = wp_removable_query_args(); + + if ( empty( $removable_query_args ) ) { + return; + } + + // Ensure we're using an absolute URL. + $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); + $filtered_url = remove_query_arg( $removable_query_args, $current_url ); + ?> + + + + + $hash, + 'newemail' => $value, + ); + update_option( 'adminhash', $new_admin_email ); + + $switched_locale = switch_to_locale( get_user_locale() ); + + /* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */ + $email_text = __( + 'Howdy ###USERNAME###, + +You recently requested to have the administration email address on +your site changed. + +If this is correct, please click on the following link to change it: +###ADMIN_URL### + +You can safely ignore and delete this email if you do not want to +take this action. + +This email has been sent to ###EMAIL### + +Regards, +All at ###SITENAME### +###SITEURL###' + ); + + /** + * Filters the text of the email sent when a change of site admin email address is attempted. + * + * The following strings have a special meaning and will get replaced dynamically: + * ###USERNAME### The current user's username. + * ###ADMIN_URL### The link to click on to confirm the email change. + * ###EMAIL### The proposed new site admin email address. + * ###SITENAME### The name of the site. + * ###SITEURL### The URL to the site. + * + * @since MU (3.0.0) + * @since 4.9.0 This filter is no longer Multisite specific. + * + * @param string $email_text Text in the email. + * @param array $new_admin_email { + * Data relating to the new site admin email address. + * + * @type string $hash The secure hash used in the confirmation link URL. + * @type string $newemail The proposed new site admin email address. + * } + */ + $content = apply_filters( 'new_admin_email_content', $email_text, $new_admin_email ); + + $current_user = wp_get_current_user(); + $content = str_replace( '###USERNAME###', $current_user->user_login, $content ); + $content = str_replace( '###ADMIN_URL###', esc_url( self_admin_url( 'options.php?adminhash=' . $hash ) ), $content ); + $content = str_replace( '###EMAIL###', $value, $content ); + $content = str_replace( '###SITENAME###', wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), $content ); + $content = str_replace( '###SITEURL###', home_url(), $content ); + + wp_mail( + $value, + sprintf( + /* translators: New admin email address notification email subject. %s: Site title. */ + __( '[%s] New Admin Email Address' ), + wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) + ), + $content + ); + + if ( $switched_locale ) { + restore_previous_locale(); + } +} + +/** + * Appends '(Draft)' to draft page titles in the privacy page dropdown + * so that unpublished content is obvious. + * + * @since 4.9.8 + * @access private + * + * @param string $title Page title. + * @param WP_Post $page Page data object. + * + * @return string Page title. + */ +function _wp_privacy_settings_filter_draft_page_titles( $title, $page ) { + if ( 'draft' === $page->post_status && 'privacy' === get_current_screen()->id ) { + /* translators: %s: Page title. */ + $title = sprintf( __( '%s (Draft)' ), $title ); + } + + return $title; +} + +/** + * Checks if the user needs to update PHP. + * + * @since 5.1.0 + * @since 5.1.1 Added the {@see 'wp_is_php_version_acceptable'} filter. + * + * @return array|false $response Array of PHP version data. False on failure. + */ +function wp_check_php_version() { + $version = phpversion(); + $key = md5( $version ); + + $response = get_site_transient( 'php_check_' . $key ); + if ( false === $response ) { + $url = 'http://api.wordpress.org/core/serve-happy/1.0/'; + if ( wp_http_supports( array( 'ssl' ) ) ) { + $url = set_url_scheme( $url, 'https' ); + } + + $url = add_query_arg( 'php_version', $version, $url ); + + $response = wp_remote_get( $url ); + + if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) { + return false; + } + + /** + * Response should be an array with: + * 'recommended_version' - string - The PHP version recommended by WordPress. + * 'is_supported' - boolean - Whether the PHP version is actively supported. + * 'is_secure' - boolean - Whether the PHP version receives security updates. + * 'is_acceptable' - boolean - Whether the PHP version is still acceptable for WordPress. + */ + $response = json_decode( wp_remote_retrieve_body( $response ), true ); + + if ( ! is_array( $response ) ) { + return false; + } + + set_site_transient( 'php_check_' . $key, $response, WEEK_IN_SECONDS ); + } + + if ( isset( $response['is_acceptable'] ) && $response['is_acceptable'] ) { + /** + * Filters whether the active PHP version is considered acceptable by WordPress. + * + * Returning false will trigger a PHP version warning to show up in the admin dashboard to administrators. + * + * This filter is only run if the wordpress.org Serve Happy API considers the PHP version acceptable, ensuring + * that this filter can only make this check stricter, but not loosen it. + * + * @since 5.1.1 + * + * @param bool $is_acceptable Whether the PHP version is considered acceptable. Default true. + * @param string $version PHP version checked. + */ + $response['is_acceptable'] = (bool) apply_filters( 'wp_is_php_version_acceptable', true, $version ); + } + + return $response; +} diff --git a/wp-admin/includes/ms-admin-filters.php b/wp-admin/includes/ms-admin-filters.php new file mode 100644 index 0000000..9e5fcaf --- /dev/null +++ b/wp-admin/includes/ms-admin-filters.php @@ -0,0 +1,44 @@ + ( KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 ) ) ) { + /* translators: %s: Maximum allowed file size in kilobytes. */ + $file['error'] = sprintf( __( 'This file is too big. Files must be less than %s KB in size.' ), get_site_option( 'fileupload_maxk', 1500 ) ); + } + + if ( upload_is_user_over_quota( false ) ) { + $file['error'] = __( 'You have used your space quota. Please delete files before uploading.' ); + } + + if ( '0' != $file['error'] && ! isset( $_POST['html-upload'] ) && ! wp_doing_ajax() ) { + wp_die( $file['error'] . ' ' . __( 'Back' ) . '' ); + } + + return $file; +} + +/** + * Delete a site. + * + * @since 3.0.0 + * @since 5.1.0 Use wp_delete_site() internally to delete the site row from the database. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $blog_id Site ID. + * @param bool $drop True if site's database tables should be dropped. Default is false. + */ +function wpmu_delete_blog( $blog_id, $drop = false ) { + global $wpdb; + + $switch = false; + if ( get_current_blog_id() != $blog_id ) { + $switch = true; + switch_to_blog( $blog_id ); + } + + $blog = get_site( $blog_id ); + + $current_network = get_network(); + + // If a full blog object is not available, do not destroy anything. + if ( $drop && ! $blog ) { + $drop = false; + } + + // Don't destroy the initial, main, or root blog. + if ( $drop && ( 1 == $blog_id || is_main_site( $blog_id ) || ( $blog->path == $current_network->path && $blog->domain == $current_network->domain ) ) ) { + $drop = false; + } + + $upload_path = trim( get_option( 'upload_path' ) ); + + // If ms_files_rewriting is enabled and upload_path is empty, wp_upload_dir is not reliable. + if ( $drop && get_site_option( 'ms_files_rewriting' ) && empty( $upload_path ) ) { + $drop = false; + } + + if ( $drop ) { + wp_delete_site( $blog_id ); + } else { + /** This action is documented in wp-includes/ms-blogs.php */ + do_action_deprecated( 'delete_blog', array( $blog_id, false ), '5.1.0' ); + + $users = get_users( + array( + 'blog_id' => $blog_id, + 'fields' => 'ids', + ) + ); + + // Remove users from this blog. + if ( ! empty( $users ) ) { + foreach ( $users as $user_id ) { + remove_user_from_blog( $user_id, $blog_id ); + } + } + + update_blog_status( $blog_id, 'deleted', 1 ); + + /** This action is documented in wp-includes/ms-blogs.php */ + do_action_deprecated( 'deleted_blog', array( $blog_id, false ), '5.1.0' ); + } + + if ( $switch ) { + restore_current_blog(); + } +} + +/** + * Delete a user from the network and remove from all sites. + * + * @since 3.0.0 + * + * @todo Merge with wp_delete_user()? + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $id The user ID. + * @return bool True if the user was deleted, otherwise false. + */ +function wpmu_delete_user( $id ) { + global $wpdb; + + if ( ! is_numeric( $id ) ) { + return false; + } + + $id = (int) $id; + $user = new WP_User( $id ); + + if ( ! $user->exists() ) { + return false; + } + + // Global super-administrators are protected, and cannot be deleted. + $_super_admins = get_super_admins(); + if ( in_array( $user->user_login, $_super_admins, true ) ) { + return false; + } + + /** + * Fires before a user is deleted from the network. + * + * @since MU (3.0.0) + * + * @param int $id ID of the user about to be deleted from the network. + */ + do_action( 'wpmu_delete_user', $id ); + + $blogs = get_blogs_of_user( $id ); + + if ( ! empty( $blogs ) ) { + foreach ( $blogs as $blog ) { + switch_to_blog( $blog->userblog_id ); + remove_user_from_blog( $id, $blog->userblog_id ); + + $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id ) ); + foreach ( (array) $post_ids as $post_id ) { + wp_delete_post( $post_id ); + } + + // Clean links. + $link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) ); + + if ( $link_ids ) { + foreach ( $link_ids as $link_id ) { + wp_delete_link( $link_id ); + } + } + + restore_current_blog(); + } + } + + $meta = $wpdb->get_col( $wpdb->prepare( "SELECT umeta_id FROM $wpdb->usermeta WHERE user_id = %d", $id ) ); + foreach ( $meta as $mid ) { + delete_metadata_by_mid( 'user', $mid ); + } + + $wpdb->delete( $wpdb->users, array( 'ID' => $id ) ); + + clean_user_cache( $user ); + + /** This action is documented in wp-admin/includes/user.php */ + do_action( 'deleted_user', $id, null ); + + return true; +} + +/** + * Check whether a site has used its allotted upload space. + * + * @since MU (3.0.0) + * + * @param bool $echo Optional. If $echo is set and the quota is exceeded, a warning message is echoed. Default is true. + * @return bool True if user is over upload space quota, otherwise false. + */ +function upload_is_user_over_quota( $echo = true ) { + if ( get_site_option( 'upload_space_check_disabled' ) ) { + return false; + } + + $space_allowed = get_space_allowed(); + if ( ! is_numeric( $space_allowed ) ) { + $space_allowed = 10; // Default space allowed is 10 MB. + } + $space_used = get_space_used(); + + if ( ( $space_allowed - $space_used ) < 0 ) { + if ( $echo ) { + printf( + /* translators: %s: Allowed space allocation. */ + __( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ), + size_format( $space_allowed * MB_IN_BYTES ) + ); + } + return true; + } else { + return false; + } +} + +/** + * Displays the amount of disk space used by the current site. Not used in core. + * + * @since MU (3.0.0) + */ +function display_space_usage() { + $space_allowed = get_space_allowed(); + $space_used = get_space_used(); + + $percent_used = ( $space_used / $space_allowed ) * 100; + + $space = size_format( $space_allowed * MB_IN_BYTES ); + ?> + + + + + + + + + + + + 'Afar', + 'ab' => 'Abkhazian', + 'af' => 'Afrikaans', + 'ak' => 'Akan', + 'sq' => 'Albanian', + 'am' => 'Amharic', + 'ar' => 'Arabic', + 'an' => 'Aragonese', + 'hy' => 'Armenian', + 'as' => 'Assamese', + 'av' => 'Avaric', + 'ae' => 'Avestan', + 'ay' => 'Aymara', + 'az' => 'Azerbaijani', + 'ba' => 'Bashkir', + 'bm' => 'Bambara', + 'eu' => 'Basque', + 'be' => 'Belarusian', + 'bn' => 'Bengali', + 'bh' => 'Bihari', + 'bi' => 'Bislama', + 'bs' => 'Bosnian', + 'br' => 'Breton', + 'bg' => 'Bulgarian', + 'my' => 'Burmese', + 'ca' => 'Catalan; Valencian', + 'ch' => 'Chamorro', + 'ce' => 'Chechen', + 'zh' => 'Chinese', + 'cu' => 'Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic', + 'cv' => 'Chuvash', + 'kw' => 'Cornish', + 'co' => 'Corsican', + 'cr' => 'Cree', + 'cs' => 'Czech', + 'da' => 'Danish', + 'dv' => 'Divehi; Dhivehi; Maldivian', + 'nl' => 'Dutch; Flemish', + 'dz' => 'Dzongkha', + 'en' => 'English', + 'eo' => 'Esperanto', + 'et' => 'Estonian', + 'ee' => 'Ewe', + 'fo' => 'Faroese', + 'fj' => 'Fijjian', + 'fi' => 'Finnish', + 'fr' => 'French', + 'fy' => 'Western Frisian', + 'ff' => 'Fulah', + 'ka' => 'Georgian', + 'de' => 'German', + 'gd' => 'Gaelic; Scottish Gaelic', + 'ga' => 'Irish', + 'gl' => 'Galician', + 'gv' => 'Manx', + 'el' => 'Greek, Modern', + 'gn' => 'Guarani', + 'gu' => 'Gujarati', + 'ht' => 'Haitian; Haitian Creole', + 'ha' => 'Hausa', + 'he' => 'Hebrew', + 'hz' => 'Herero', + 'hi' => 'Hindi', + 'ho' => 'Hiri Motu', + 'hu' => 'Hungarian', + 'ig' => 'Igbo', + 'is' => 'Icelandic', + 'io' => 'Ido', + 'ii' => 'Sichuan Yi', + 'iu' => 'Inuktitut', + 'ie' => 'Interlingue', + 'ia' => 'Interlingua (International Auxiliary Language Association)', + 'id' => 'Indonesian', + 'ik' => 'Inupiaq', + 'it' => 'Italian', + 'jv' => 'Javanese', + 'ja' => 'Japanese', + 'kl' => 'Kalaallisut; Greenlandic', + 'kn' => 'Kannada', + 'ks' => 'Kashmiri', + 'kr' => 'Kanuri', + 'kk' => 'Kazakh', + 'km' => 'Central Khmer', + 'ki' => 'Kikuyu; Gikuyu', + 'rw' => 'Kinyarwanda', + 'ky' => 'Kirghiz; Kyrgyz', + 'kv' => 'Komi', + 'kg' => 'Kongo', + 'ko' => 'Korean', + 'kj' => 'Kuanyama; Kwanyama', + 'ku' => 'Kurdish', + 'lo' => 'Lao', + 'la' => 'Latin', + 'lv' => 'Latvian', + 'li' => 'Limburgan; Limburger; Limburgish', + 'ln' => 'Lingala', + 'lt' => 'Lithuanian', + 'lb' => 'Luxembourgish; Letzeburgesch', + 'lu' => 'Luba-Katanga', + 'lg' => 'Ganda', + 'mk' => 'Macedonian', + 'mh' => 'Marshallese', + 'ml' => 'Malayalam', + 'mi' => 'Maori', + 'mr' => 'Marathi', + 'ms' => 'Malay', + 'mg' => 'Malagasy', + 'mt' => 'Maltese', + 'mo' => 'Moldavian', + 'mn' => 'Mongolian', + 'na' => 'Nauru', + 'nv' => 'Navajo; Navaho', + 'nr' => 'Ndebele, South; South Ndebele', + 'nd' => 'Ndebele, North; North Ndebele', + 'ng' => 'Ndonga', + 'ne' => 'Nepali', + 'nn' => 'Norwegian Nynorsk; Nynorsk, Norwegian', + 'nb' => 'Bokmål, Norwegian, Norwegian Bokmål', + 'no' => 'Norwegian', + 'ny' => 'Chichewa; Chewa; Nyanja', + 'oc' => 'Occitan, Provençal', + 'oj' => 'Ojibwa', + 'or' => 'Oriya', + 'om' => 'Oromo', + 'os' => 'Ossetian; Ossetic', + 'pa' => 'Panjabi; Punjabi', + 'fa' => 'Persian', + 'pi' => 'Pali', + 'pl' => 'Polish', + 'pt' => 'Portuguese', + 'ps' => 'Pushto', + 'qu' => 'Quechua', + 'rm' => 'Romansh', + 'ro' => 'Romanian', + 'rn' => 'Rundi', + 'ru' => 'Russian', + 'sg' => 'Sango', + 'sa' => 'Sanskrit', + 'sr' => 'Serbian', + 'hr' => 'Croatian', + 'si' => 'Sinhala; Sinhalese', + 'sk' => 'Slovak', + 'sl' => 'Slovenian', + 'se' => 'Northern Sami', + 'sm' => 'Samoan', + 'sn' => 'Shona', + 'sd' => 'Sindhi', + 'so' => 'Somali', + 'st' => 'Sotho, Southern', + 'es' => 'Spanish; Castilian', + 'sc' => 'Sardinian', + 'ss' => 'Swati', + 'su' => 'Sundanese', + 'sw' => 'Swahili', + 'sv' => 'Swedish', + 'ty' => 'Tahitian', + 'ta' => 'Tamil', + 'tt' => 'Tatar', + 'te' => 'Telugu', + 'tg' => 'Tajik', + 'tl' => 'Tagalog', + 'th' => 'Thai', + 'bo' => 'Tibetan', + 'ti' => 'Tigrinya', + 'to' => 'Tonga (Tonga Islands)', + 'tn' => 'Tswana', + 'ts' => 'Tsonga', + 'tk' => 'Turkmen', + 'tr' => 'Turkish', + 'tw' => 'Twi', + 'ug' => 'Uighur; Uyghur', + 'uk' => 'Ukrainian', + 'ur' => 'Urdu', + 'uz' => 'Uzbek', + 've' => 'Venda', + 'vi' => 'Vietnamese', + 'vo' => 'Volapük', + 'cy' => 'Welsh', + 'wa' => 'Walloon', + 'wo' => 'Wolof', + 'xh' => 'Xhosa', + 'yi' => 'Yiddish', + 'yo' => 'Yoruba', + 'za' => 'Zhuang; Chuang', + 'zu' => 'Zulu', + ); + + /** + * Filters the language codes. + * + * @since MU (3.0.0) + * + * @param string[] $lang_codes Array of key/value pairs of language codes where key is the short version. + * @param string $code A two-letter designation of the language. + */ + $lang_codes = apply_filters( 'lang_codes', $lang_codes, $code ); + return strtr( $code, $lang_codes ); +} + +/** + * Synchronizes category and post tag slugs when global terms are enabled. + * + * @since 3.0.0 + * + * @param WP_Term|array $term The term. + * @param string $taxonomy The taxonomy for `$term`. Should be 'category' or 'post_tag', as these are + * the only taxonomies which are processed by this function; anything else + * will be returned untouched. + * @return WP_Term|array Returns `$term`, after filtering the 'slug' field with `sanitize_title()` + * if `$taxonomy` is 'category' or 'post_tag'. + */ +function sync_category_tag_slugs( $term, $taxonomy ) { + if ( global_terms_enabled() && ( 'category' === $taxonomy || 'post_tag' === $taxonomy ) ) { + if ( is_object( $term ) ) { + $term->slug = sanitize_title( $term->name ); + } else { + $term['slug'] = sanitize_title( $term['name'] ); + } + } + return $term; +} + +/** + * Displays an access denied message when a user tries to view a site's dashboard they + * do not have access to. + * + * @since 3.2.0 + * @access private + */ +function _access_denied_splash() { + if ( ! is_user_logged_in() || is_network_admin() ) { + return; + } + + $blogs = get_blogs_of_user( get_current_user_id() ); + + if ( wp_list_filter( $blogs, array( 'userblog_id' => get_current_blog_id() ) ) ) { + return; + } + + $blog_name = get_bloginfo( 'name' ); + + if ( empty( $blogs ) ) { + wp_die( + sprintf( + /* translators: 1: Site title. */ + __( 'You attempted to access the "%1$s" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the "%1$s" dashboard, please contact your network administrator.' ), + $blog_name + ), + 403 + ); + } + + $output = '

          ' . sprintf( + /* translators: 1: Site title. */ + __( 'You attempted to access the "%1$s" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the "%1$s" dashboard, please contact your network administrator.' ), + $blog_name + ) . '

          '; + $output .= '

          ' . __( 'If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way.' ) . '

          '; + + $output .= '

          ' . __( 'Your Sites' ) . '

          '; + $output .= ''; + + foreach ( $blogs as $blog ) { + $output .= ''; + $output .= ""; + $output .= ''; + $output .= ''; + } + + $output .= '
          {$blog->blogname}' . __( 'Visit Dashboard' ) . ' | ' . + '' . __( 'View Site' ) . '
          '; + + wp_die( $output, 403 ); +} + +/** + * Checks if the current user has permissions to import new users. + * + * @since 3.0.0 + * + * @param string $permission A permission to be checked. Currently not used. + * @return bool True if the user has proper permissions, false if they do not. + */ +function check_import_new_users( $permission ) { + if ( ! current_user_can( 'manage_network_users' ) ) { + return false; + } + + return true; +} +// See "import_allow_fetch_attachments" and "import_attachment_size_limit" filters too. + +/** + * Generates and displays a drop-down of available languages. + * + * @since 3.0.0 + * + * @param string[] $lang_files Optional. An array of the language files. Default empty array. + * @param string $current Optional. The current language code. Default empty. + */ +function mu_dropdown_languages( $lang_files = array(), $current = '' ) { + $flag = false; + $output = array(); + + foreach ( (array) $lang_files as $val ) { + $code_lang = basename( $val, '.mo' ); + + if ( 'en_US' === $code_lang ) { // American English. + $flag = true; + $ae = __( 'American English' ); + $output[ $ae ] = ''; + } elseif ( 'en_GB' === $code_lang ) { // British English. + $flag = true; + $be = __( 'British English' ); + $output[ $be ] = ''; + } else { + $translated = format_code_lang( $code_lang ); + $output[ $translated ] = ''; + } + } + + if ( false === $flag ) { // WordPress English. + $output[] = ''; + } + + // Order by name. + uksort( $output, 'strnatcasecmp' ); + + /** + * Filters the languages available in the dropdown. + * + * @since MU (3.0.0) + * + * @param string[] $output Array of HTML output for the dropdown. + * @param string[] $lang_files Array of available language files. + * @param string $current The current language code. + */ + $output = apply_filters( 'mu_dropdown_languages', $output, $lang_files, $current ); + + echo implode( "\n\t", $output ); +} + +/** + * Displays an admin notice to upgrade all sites after a core upgrade. + * + * @since 3.0.0 + * + * @global int $wp_db_version WordPress database version. + * @global string $pagenow + * + * @return false False if the current user is not a super admin. + */ +function site_admin_notice() { + global $wp_db_version, $pagenow; + + if ( ! current_user_can( 'upgrade_network' ) ) { + return false; + } + + if ( 'upgrade.php' == $pagenow ) { + return; + } + + if ( get_site_option( 'wpmu_upgrade_site' ) != $wp_db_version ) { + echo "
          " . sprintf( + /* translators: %s: URL to Upgrade Network screen. */ + __( 'Thank you for Updating! Please visit the Upgrade Network page to update all your sites.' ), + esc_url( network_admin_url( 'upgrade.php' ) ) + ) . '
          '; + } +} + +/** + * Avoids a collision between a site slug and a permalink slug. + * + * In a subdirectory installation this will make sure that a site and a post do not use the + * same subdirectory by checking for a site with the same name as a new post. + * + * @since 3.0.0 + * + * @param array $data An array of post data. + * @param array $postarr An array of posts. Not currently used. + * @return array The new array of post data after checking for collisions. + */ +function avoid_blog_page_permalink_collision( $data, $postarr ) { + if ( is_subdomain_install() ) { + return $data; + } + if ( 'page' !== $data['post_type'] ) { + return $data; + } + if ( ! isset( $data['post_name'] ) || '' === $data['post_name'] ) { + return $data; + } + if ( ! is_main_site() ) { + return $data; + } + + $post_name = $data['post_name']; + $c = 0; + while ( $c < 10 && get_id_from_blogname( $post_name ) ) { + $post_name .= mt_rand( 1, 10 ); + $c ++; + } + if ( $post_name != $data['post_name'] ) { + $data['post_name'] = $post_name; + } + return $data; +} + +/** + * Handles the display of choosing a user's primary site. + * + * This displays the user's primary site and allows the user to choose + * which site is primary. + * + * @since 3.0.0 + */ +function choose_primary_blog() { + ?> + + + + + + + + + + +

          + + +

          + +

          + + +
          + + ID ) . '">' . $current_user->user_login . ''; + ?> + + ID ) ) { + wp_die( + sprintf( + /* translators: %s: User login. */ + __( 'Warning! User %s cannot be deleted.' ), + $delete_user->user_login + ) + ); + } + + if ( in_array( $delete_user->user_login, $site_admins ) ) { + wp_die( + sprintf( + /* translators: %s: User login. */ + __( 'Warning! User cannot be deleted. The user %s is a network administrator.' ), + '' . $delete_user->user_login . '' + ) + ); + } + ?> + + + + '; + } else { + ?> + + + + + + +

          + +

          + +
          + + + array( + 'label' => __( 'Info' ), + 'url' => 'site-info.php', + 'cap' => 'manage_sites', + ), + 'site-users' => array( + 'label' => __( 'Users' ), + 'url' => 'site-users.php', + 'cap' => 'manage_sites', + ), + 'site-themes' => array( + 'label' => __( 'Themes' ), + 'url' => 'site-themes.php', + 'cap' => 'manage_sites', + ), + 'site-settings' => array( + 'label' => __( 'Settings' ), + 'url' => 'site-settings.php', + 'cap' => 'manage_sites', + ), + ) + ); + + // Parse arguments. + $parsed_args = wp_parse_args( + $args, + array( + 'blog_id' => isset( $_GET['blog_id'] ) ? (int) $_GET['blog_id'] : 0, + 'links' => $links, + 'selected' => 'site-info', + ) + ); + + // Setup the links array. + $screen_links = array(); + + // Loop through tabs. + foreach ( $parsed_args['links'] as $link_id => $link ) { + + // Skip link if user can't access. + if ( ! current_user_can( $link['cap'], $parsed_args['blog_id'] ) ) { + continue; + } + + // Link classes. + $classes = array( 'nav-tab' ); + + // Aria-current attribute. + $aria_current = ''; + + // Selected is set by the parent OR assumed by the $pagenow global. + if ( $parsed_args['selected'] === $link_id || $link['url'] === $GLOBALS['pagenow'] ) { + $classes[] = 'nav-tab-active'; + $aria_current = ' aria-current="page"'; + } + + // Escape each class. + $esc_classes = implode( ' ', $classes ); + + // Get the URL for this link. + $url = add_query_arg( array( 'id' => $parsed_args['blog_id'] ), network_admin_url( $link['url'] ) ); + + // Add link to nav links. + $screen_links[ $link_id ] = '' . esc_html( $link['label'] ) . ''; + } + + // All done! + echo ''; +} + +/** + * Returns the arguments for the help tab on the Edit Site screens. + * + * @since 4.9.0 + * + * @return array Help tab arguments. + */ +function get_site_screen_help_tab_args() { + return array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.' ) . '

          ' . + '

          ' . __( 'Info — The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.' ) . '

          ' . + '

          ' . __( 'Users — This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.' ) . '

          ' . + '

          ' . sprintf( + /* translators: %s: URL to Network Themes screen. */ + __( 'Themes — This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen.' ), + network_admin_url( 'themes.php' ) + ) . '

          ' . + '

          ' . __( 'Settings — This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.' ) . '

          ', + ); +} + +/** + * Returns the content for the help sidebar on the Edit Site screens. + * + * @since 4.9.0 + * + * @return string Help sidebar content. + */ +function get_site_screen_help_sidebar_content() { + return '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Site Management' ) . '

          ' . + '

          ' . __( 'Support Forums' ) . '

          '; +} diff --git a/wp-admin/includes/nav-menu.php b/wp-admin/includes/nav-menu.php new file mode 100644 index 0000000..be068c2 --- /dev/null +++ b/wp-admin/includes/nav-menu.php @@ -0,0 +1,1279 @@ + $object_id, + 'post_title' => get_the_title( $object_id ), + 'post_type' => get_post_type( $object_id ), + ) + ); + echo "\n"; + } + } + } elseif ( taxonomy_exists( $object_type ) ) { + if ( isset( $request['ID'] ) ) { + $object_id = (int) $request['ID']; + if ( 'markup' == $response_format ) { + echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', array( get_term( $object_id, $object_type ) ) ), 0, (object) $args ); + } elseif ( 'json' == $response_format ) { + $post_obj = get_term( $object_id, $object_type ); + echo wp_json_encode( + array( + 'ID' => $object_id, + 'post_title' => $post_obj->name, + 'post_type' => $object_type, + ) + ); + echo "\n"; + } + } + } + } elseif ( preg_match( '/quick-search-(posttype|taxonomy)-([a-zA-Z_-]*\b)/', $type, $matches ) ) { + if ( 'posttype' == $matches[1] && get_post_type_object( $matches[2] ) ) { + $post_type_obj = _wp_nav_menu_meta_box_object( get_post_type_object( $matches[2] ) ); + $args = array_merge( + $args, + array( + 'no_found_rows' => true, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'posts_per_page' => 10, + 'post_type' => $matches[2], + 's' => $query, + ) + ); + if ( isset( $post_type_obj->_default_query ) ) { + $args = array_merge( $args, (array) $post_type_obj->_default_query ); + } + $search_results_query = new WP_Query( $args ); + if ( ! $search_results_query->have_posts() ) { + return; + } + while ( $search_results_query->have_posts() ) { + $post = $search_results_query->next_post(); + if ( 'markup' == $response_format ) { + $var_by_ref = $post->ID; + echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', array( get_post( $var_by_ref ) ) ), 0, (object) $args ); + } elseif ( 'json' == $response_format ) { + echo wp_json_encode( + array( + 'ID' => $post->ID, + 'post_title' => get_the_title( $post->ID ), + 'post_type' => $matches[2], + ) + ); + echo "\n"; + } + } + } elseif ( 'taxonomy' == $matches[1] ) { + $terms = get_terms( + array( + 'taxonomy' => $matches[2], + 'name__like' => $query, + 'number' => 10, + ) + ); + if ( empty( $terms ) || is_wp_error( $terms ) ) { + return; + } + foreach ( (array) $terms as $term ) { + if ( 'markup' == $response_format ) { + echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', array( $term ) ), 0, (object) $args ); + } elseif ( 'json' == $response_format ) { + echo wp_json_encode( + array( + 'ID' => $term->term_id, + 'post_title' => $term->name, + 'post_type' => $matches[2], + ) + ); + echo "\n"; + } + } + } + } +} + +/** + * Register nav menu meta boxes and advanced menu items. + * + * @since 3.0.0 + */ +function wp_nav_menu_setup() { + // Register meta boxes. + wp_nav_menu_post_type_meta_boxes(); + add_meta_box( 'add-custom-links', __( 'Custom Links' ), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' ); + wp_nav_menu_taxonomy_meta_boxes(); + + // Register advanced menu items (columns). + add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns' ); + + // If first time editing, disable advanced items by default. + if ( false === get_user_option( 'managenav-menuscolumnshidden' ) ) { + $user = wp_get_current_user(); + update_user_option( + $user->ID, + 'managenav-menuscolumnshidden', + array( + 0 => 'link-target', + 1 => 'css-classes', + 2 => 'xfn', + 3 => 'description', + 4 => 'title-attribute', + ), + true + ); + } +} + +/** + * Limit the amount of meta boxes to pages, posts, links, and categories for first time users. + * + * @since 3.0.0 + * + * @global array $wp_meta_boxes + */ +function wp_initial_nav_menu_meta_boxes() { + global $wp_meta_boxes; + + if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array( $wp_meta_boxes ) ) { + return; + } + + $initial_meta_boxes = array( 'add-post-type-page', 'add-post-type-post', 'add-custom-links', 'add-category' ); + $hidden_meta_boxes = array(); + + foreach ( array_keys( $wp_meta_boxes['nav-menus'] ) as $context ) { + foreach ( array_keys( $wp_meta_boxes['nav-menus'][ $context ] ) as $priority ) { + foreach ( $wp_meta_boxes['nav-menus'][ $context ][ $priority ] as $box ) { + if ( in_array( $box['id'], $initial_meta_boxes ) ) { + unset( $box['id'] ); + } else { + $hidden_meta_boxes[] = $box['id']; + } + } + } + } + + $user = wp_get_current_user(); + update_user_option( $user->ID, 'metaboxhidden_nav-menus', $hidden_meta_boxes, true ); +} + +/** + * Creates meta boxes for any post type menu item.. + * + * @since 3.0.0 + */ +function wp_nav_menu_post_type_meta_boxes() { + $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'object' ); + + if ( ! $post_types ) { + return; + } + + foreach ( $post_types as $post_type ) { + /** + * Filters whether a menu items meta box will be added for the current + * object type. + * + * If a falsey value is returned instead of an object, the menu items + * meta box for the current meta box object will not be added. + * + * @since 3.0.0 + * + * @param WP_Post_Type|false $post_type The current object to add a menu items + * meta box for. + */ + $post_type = apply_filters( 'nav_menu_meta_box_object', $post_type ); + if ( $post_type ) { + $id = $post_type->name; + // Give pages a higher priority. + $priority = ( 'page' == $post_type->name ? 'core' : 'default' ); + add_meta_box( "add-post-type-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', $priority, $post_type ); + } + } +} + +/** + * Creates meta boxes for any taxonomy menu item. + * + * @since 3.0.0 + */ +function wp_nav_menu_taxonomy_meta_boxes() { + $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'object' ); + + if ( ! $taxonomies ) { + return; + } + + foreach ( $taxonomies as $tax ) { + /** This filter is documented in wp-admin/includes/nav-menu.php */ + $tax = apply_filters( 'nav_menu_meta_box_object', $tax ); + if ( $tax ) { + $id = $tax->name; + add_meta_box( "add-{$id}", $tax->labels->name, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax ); + } + } +} + +/** + * Check whether to disable the Menu Locations meta box submit button and inputs. + * + * @since 3.6.0 + * @since 5.3.1 The `$echo` parameter was added. + * + * @global bool $one_theme_location_no_menus to determine if no menus exist + * + * @param int|string $nav_menu_selected_id ID, name, or slug of the currently selected menu. + * @param bool $echo Whether to echo or just return the string. + * @return string|false Disabled attribute if at least one menu exists, false if not. + */ +function wp_nav_menu_disabled_check( $nav_menu_selected_id, $echo = true ) { + global $one_theme_location_no_menus; + + if ( $one_theme_location_no_menus ) { + return false; + } + + return disabled( $nav_menu_selected_id, 0, $echo ); +} + +/** + * Displays a meta box for the custom links menu item. + * + * @since 3.0.0 + * + * @global int $_nav_menu_placeholder + * @global int|string $nav_menu_selected_id + */ +function wp_nav_menu_item_link_meta_box() { + global $_nav_menu_placeholder, $nav_menu_selected_id; + + $_nav_menu_placeholder = 0 > $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1; + + ?> +
          + + + + + +

          + + class="button submit-add-to-menu right" value="" name="add-custom-menu-item" id="submit-customlinkdiv" /> + + +

          + +
          + name; + $post_type = get_post_type_object( $post_type_name ); + + // Paginate browsing for large numbers of post objects. + $per_page = 50; + $pagenum = isset( $_REQUEST[ $post_type_name . '-tab' ] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1; + $offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0; + + $args = array( + 'offset' => $offset, + 'order' => 'ASC', + 'orderby' => 'title', + 'posts_per_page' => $per_page, + 'post_type' => $post_type_name, + 'suppress_filters' => true, + 'update_post_term_cache' => false, + 'update_post_meta_cache' => false, + ); + + if ( isset( $box['args']->_default_query ) ) { + $args = array_merge( $args, (array) $box['args']->_default_query ); + } + + /* + * If we're dealing with pages, let's prioritize the Front Page, + * Posts Page and Privacy Policy Page at the top of the list. + */ + $important_pages = array(); + if ( 'page' == $post_type_name ) { + $suppress_page_ids = array(); + + // Insert Front Page or custom Home link. + $front_page = 'page' == get_option( 'show_on_front' ) ? (int) get_option( 'page_on_front' ) : 0; + + $front_page_obj = null; + if ( ! empty( $front_page ) ) { + $front_page_obj = get_post( $front_page ); + $front_page_obj->front_or_home = true; + + $important_pages[] = $front_page_obj; + $suppress_page_ids[] = $front_page_obj->ID; + } else { + $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval( $_nav_menu_placeholder ) - 1 : -1; + $front_page_obj = (object) array( + 'front_or_home' => true, + 'ID' => 0, + 'object_id' => $_nav_menu_placeholder, + 'post_content' => '', + 'post_excerpt' => '', + 'post_parent' => '', + 'post_title' => _x( 'Home', 'nav menu home label' ), + 'post_type' => 'nav_menu_item', + 'type' => 'custom', + 'url' => home_url( '/' ), + ); + + $important_pages[] = $front_page_obj; + } + + // Insert Posts Page. + $posts_page = 'page' == get_option( 'show_on_front' ) ? (int) get_option( 'page_for_posts' ) : 0; + + if ( ! empty( $posts_page ) ) { + $posts_page_obj = get_post( $posts_page ); + $posts_page_obj->posts_page = true; + + $important_pages[] = $posts_page_obj; + $suppress_page_ids[] = $posts_page_obj->ID; + } + + // Insert Privacy Policy Page. + $privacy_policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' ); + + if ( ! empty( $privacy_policy_page_id ) ) { + $privacy_policy_page = get_post( $privacy_policy_page_id ); + if ( $privacy_policy_page instanceof WP_Post && 'publish' === $privacy_policy_page->post_status ) { + $privacy_policy_page->privacy_policy_page = true; + + $important_pages[] = $privacy_policy_page; + $suppress_page_ids[] = $privacy_policy_page->ID; + } + } + + // Add suppression array to arguments for WP_Query. + if ( ! empty( $suppress_page_ids ) ) { + $args['post__not_in'] = $suppress_page_ids; + } + } + + // @todo Transient caching of these results with proper invalidation on updating of a post of this type. + $get_posts = new WP_Query; + $posts = $get_posts->query( $args ); + + // Only suppress and insert when more than just suppression pages available. + if ( ! $get_posts->post_count ) { + if ( ! empty( $suppress_page_ids ) ) { + unset( $args['post__not_in'] ); + $get_posts = new WP_Query; + $posts = $get_posts->query( $args ); + } else { + echo '

          ' . __( 'No items.' ) . '

          '; + return; + } + } elseif ( ! empty( $important_pages ) ) { + $posts = array_merge( $important_pages, $posts ); + } + + $num_pages = $get_posts->max_num_pages; + + $page_links = paginate_links( + array( + 'base' => add_query_arg( + array( + $post_type_name . '-tab' => 'all', + 'paged' => '%#%', + 'item-type' => 'post_type', + 'item-object' => $post_type_name, + ) + ), + 'format' => '', + 'prev_text' => '' . __( '«' ) . '', + 'next_text' => '' . __( '»' ) . '', + 'before_page_number' => '' . __( 'Page' ) . ' ', + 'total' => $num_pages, + 'current' => $pagenum, + ) + ); + + $db_fields = false; + if ( is_post_type_hierarchical( $post_type_name ) ) { + $db_fields = array( + 'parent' => 'post_parent', + 'id' => 'ID', + ); + } + + $walker = new Walker_Nav_Menu_Checklist( $db_fields ); + + $current_tab = 'most-recent'; + if ( isset( $_REQUEST[ $post_type_name . '-tab' ] ) && in_array( $_REQUEST[ $post_type_name . '-tab' ], array( 'all', 'search' ) ) ) { + $current_tab = $_REQUEST[ $post_type_name . '-tab' ]; + } + + if ( ! empty( $_REQUEST[ 'quick-search-posttype-' . $post_type_name ] ) ) { + $current_tab = 'search'; + } + + $removed_args = array( + 'action', + 'customlink-tab', + 'edit-menu-item', + 'menu-item', + 'page-tab', + '_wpnonce', + ); + + $most_recent_url = ''; + $view_all_url = ''; + $search_url = ''; + if ( $nav_menu_selected_id ) { + $most_recent_url = esc_url( add_query_arg( $post_type_name . '-tab', 'most-recent', remove_query_arg( $removed_args ) ) ); + $view_all_url = esc_url( add_query_arg( $post_type_name . '-tab', 'all', remove_query_arg( $removed_args ) ) ); + $search_url = esc_url( add_query_arg( $post_type_name . '-tab', 'search', remove_query_arg( $removed_args ) ) ); + } + ?> +
          + + +
          +
            + 'post_date', + 'order' => 'DESC', + 'posts_per_page' => 15, + ) + ); + $most_recent = $get_posts->query( $recent_args ); + $args['walker'] = $walker; + + /** + * Filters the posts displayed in the 'Most Recent' tab of the current + * post type's menu items meta box. + * + * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name. + * + * @since 4.3.0 + * @since 4.9.0 Added the `$recent_args` parameter. + * + * @param WP_Post[] $most_recent An array of post objects being listed. + * @param array $args An array of `WP_Query` arguments for the meta box. + * @param array $box Arguments passed to `wp_nav_menu_item_post_type_meta_box()`. + * @param array $recent_args An array of `WP_Query` arguments for 'Most Recent' tab. + */ + $most_recent = apply_filters( "nav_menu_items_{$post_type_name}_recent", $most_recent, $args, $box, $recent_args ); + + echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $most_recent ), 0, (object) $args ); + ?> +
          +
          + + + +
          + + + +
            + has_archive ) { + $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval( $_nav_menu_placeholder ) - 1 : -1; + array_unshift( + $posts, + (object) array( + 'ID' => 0, + 'object_id' => $_nav_menu_placeholder, + 'object' => $post_type_name, + 'post_content' => '', + 'post_excerpt' => '', + 'post_title' => $post_type->labels->archives, + 'post_type' => 'nav_menu_item', + 'type' => 'post_type_archive', + 'url' => get_post_type_archive_link( $post_type_name ), + ) + ); + } + + /** + * Filters the posts displayed in the 'View All' tab of the current + * post type's menu items meta box. + * + * The dynamic portion of the hook name, `$post_type_name`, refers + * to the slug of the current post type. + * + * @since 3.2.0 + * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object. + * + * @see WP_Query::query() + * + * @param object[] $posts The posts for the current post type. Mostly `WP_Post` objects, but + * can also contain "fake" post objects to represent other menu items. + * @param array $args An array of `WP_Query` arguments. + * @param WP_Post_Type $post_type The current post type object for this menu item meta box. + */ + $posts = apply_filters( "nav_menu_items_{$post_type_name}", $posts, $args, $post_type ); + + $checkbox_items = walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $posts ), 0, (object) $args ); + + echo $checkbox_items; + ?> +
          + + + +
          + +

          + + id="" class="select-all" /> + + + + + class="button submit-add-to-menu right" value="" name="add-post-type-menu-item" id="" /> + + +

          + +
          + name; + $taxonomy = get_taxonomy( $taxonomy_name ); + + // Paginate browsing for large numbers of objects. + $per_page = 50; + $pagenum = isset( $_REQUEST[ $taxonomy_name . '-tab' ] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1; + $offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0; + + $args = array( + 'taxonomy' => $taxonomy_name, + 'child_of' => 0, + 'exclude' => '', + 'hide_empty' => false, + 'hierarchical' => 1, + 'include' => '', + 'number' => $per_page, + 'offset' => $offset, + 'order' => 'ASC', + 'orderby' => 'name', + 'pad_counts' => false, + ); + + $terms = get_terms( $args ); + + if ( ! $terms || is_wp_error( $terms ) ) { + echo '

          ' . __( 'No items.' ) . '

          '; + return; + } + + $num_pages = ceil( + wp_count_terms( + $taxonomy_name, + array_merge( + $args, + array( + 'number' => '', + 'offset' => '', + ) + ) + ) / $per_page + ); + + $page_links = paginate_links( + array( + 'base' => add_query_arg( + array( + $taxonomy_name . '-tab' => 'all', + 'paged' => '%#%', + 'item-type' => 'taxonomy', + 'item-object' => $taxonomy_name, + ) + ), + 'format' => '', + 'prev_text' => '' . __( '«' ) . '', + 'next_text' => '' . __( '»' ) . '', + 'before_page_number' => '' . __( 'Page' ) . ' ', + 'total' => $num_pages, + 'current' => $pagenum, + ) + ); + + $db_fields = false; + if ( is_taxonomy_hierarchical( $taxonomy_name ) ) { + $db_fields = array( + 'parent' => 'parent', + 'id' => 'term_id', + ); + } + + $walker = new Walker_Nav_Menu_Checklist( $db_fields ); + + $current_tab = 'most-used'; + if ( isset( $_REQUEST[ $taxonomy_name . '-tab' ] ) && in_array( $_REQUEST[ $taxonomy_name . '-tab' ], array( 'all', 'most-used', 'search' ) ) ) { + $current_tab = $_REQUEST[ $taxonomy_name . '-tab' ]; + } + + if ( ! empty( $_REQUEST[ 'quick-search-taxonomy-' . $taxonomy_name ] ) ) { + $current_tab = 'search'; + } + + $removed_args = array( + 'action', + 'customlink-tab', + 'edit-menu-item', + 'menu-item', + 'page-tab', + '_wpnonce', + ); + + $most_used_url = ''; + $view_all_url = ''; + $search_url = ''; + if ( $nav_menu_selected_id ) { + $most_used_url = esc_url( add_query_arg( $taxonomy_name . '-tab', 'most-used', remove_query_arg( $removed_args ) ) ); + $view_all_url = esc_url( add_query_arg( $taxonomy_name . '-tab', 'all', remove_query_arg( $removed_args ) ) ); + $search_url = esc_url( add_query_arg( $taxonomy_name . '-tab', 'search', remove_query_arg( $removed_args ) ) ); + } + ?> +
          + + +
          +
            + $taxonomy_name, + 'orderby' => 'count', + 'order' => 'DESC', + 'number' => 10, + 'hierarchical' => false, + ) + ); + $args['walker'] = $walker; + echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $popular_terms ), 0, (object) $args ); + ?> +
          +
          + +
          + + + +
            + +
          + + + +
          + +
          + $taxonomy_name, + 'name__like' => $searched, + 'fields' => 'all', + 'orderby' => 'count', + 'order' => 'DESC', + 'hierarchical' => false, + ) + ); + } else { + $searched = ''; + $search_results = array(); + } + ?> +

          + + + + 'submit-quick-search-taxonomy-' . $taxonomy_name ) ); ?> +

          + +
            + + + +
          • get_error_message(); ?>
          • + +
          • + +
          +
          + +

          + + id="" class="select-all" /> + + + + + class="button submit-add-to-menu right" value="" name="add-taxonomy-menu-item" id="" /> + + +

          + +
          + $_item_object_data ) { + if ( + // Checkbox is not checked. + empty( $_item_object_data['menu-item-object-id'] ) && + ( + // And item type either isn't set. + ! isset( $_item_object_data['menu-item-type'] ) || + // Or URL is the default. + in_array( $_item_object_data['menu-item-url'], array( 'https://', 'http://', '' ) ) || + // Or it's not a custom menu item (but not the custom home page). + ! ( 'custom' == $_item_object_data['menu-item-type'] && ! isset( $_item_object_data['menu-item-db-id'] ) ) || + // Or it *is* a custom menu item that already exists. + ! empty( $_item_object_data['menu-item-db-id'] ) + ) + ) { + // Then this potential menu item is not getting added to this menu. + continue; + } + + // If this possible menu item doesn't actually have a menu database ID yet. + if ( + empty( $_item_object_data['menu-item-db-id'] ) || + ( 0 > $_possible_db_id ) || + $_possible_db_id != $_item_object_data['menu-item-db-id'] + ) { + $_actual_db_id = 0; + } else { + $_actual_db_id = (int) $_item_object_data['menu-item-db-id']; + } + + $args = array( + 'menu-item-db-id' => ( isset( $_item_object_data['menu-item-db-id'] ) ? $_item_object_data['menu-item-db-id'] : '' ), + 'menu-item-object-id' => ( isset( $_item_object_data['menu-item-object-id'] ) ? $_item_object_data['menu-item-object-id'] : '' ), + 'menu-item-object' => ( isset( $_item_object_data['menu-item-object'] ) ? $_item_object_data['menu-item-object'] : '' ), + 'menu-item-parent-id' => ( isset( $_item_object_data['menu-item-parent-id'] ) ? $_item_object_data['menu-item-parent-id'] : '' ), + 'menu-item-position' => ( isset( $_item_object_data['menu-item-position'] ) ? $_item_object_data['menu-item-position'] : '' ), + 'menu-item-type' => ( isset( $_item_object_data['menu-item-type'] ) ? $_item_object_data['menu-item-type'] : '' ), + 'menu-item-title' => ( isset( $_item_object_data['menu-item-title'] ) ? $_item_object_data['menu-item-title'] : '' ), + 'menu-item-url' => ( isset( $_item_object_data['menu-item-url'] ) ? $_item_object_data['menu-item-url'] : '' ), + 'menu-item-description' => ( isset( $_item_object_data['menu-item-description'] ) ? $_item_object_data['menu-item-description'] : '' ), + 'menu-item-attr-title' => ( isset( $_item_object_data['menu-item-attr-title'] ) ? $_item_object_data['menu-item-attr-title'] : '' ), + 'menu-item-target' => ( isset( $_item_object_data['menu-item-target'] ) ? $_item_object_data['menu-item-target'] : '' ), + 'menu-item-classes' => ( isset( $_item_object_data['menu-item-classes'] ) ? $_item_object_data['menu-item-classes'] : '' ), + 'menu-item-xfn' => ( isset( $_item_object_data['menu-item-xfn'] ) ? $_item_object_data['menu-item-xfn'] : '' ), + ); + + $items_saved[] = wp_update_nav_menu_item( $menu_id, $_actual_db_id, $args ); + + } + } + return $items_saved; +} + +/** + * Adds custom arguments to some of the meta box object types. + * + * @since 3.0.0 + * + * @access private + * + * @param object $object The post type or taxonomy meta-object. + * @return object The post type or taxonomy object. + */ +function _wp_nav_menu_meta_box_object( $object = null ) { + if ( isset( $object->name ) ) { + + if ( 'page' == $object->name ) { + $object->_default_query = array( + 'orderby' => 'menu_order title', + 'post_status' => 'publish', + ); + + // Posts should show only published items. + } elseif ( 'post' == $object->name ) { + $object->_default_query = array( + 'post_status' => 'publish', + ); + + // Categories should be in reverse chronological order. + } elseif ( 'category' == $object->name ) { + $object->_default_query = array( + 'orderby' => 'id', + 'order' => 'DESC', + ); + + // Custom post types should show only published items. + } else { + $object->_default_query = array( + 'post_status' => 'publish', + ); + } + } + + return $object; +} + +/** + * Returns the menu formatted to edit. + * + * @since 3.0.0 + * + * @param int $menu_id Optional. The ID of the menu to format. Default 0. + * @return string|WP_Error $output The menu formatted to edit or error object on failure. + */ +function wp_get_nav_menu_to_edit( $menu_id = 0 ) { + $menu = wp_get_nav_menu_object( $menu_id ); + + // If the menu exists, get its items. + if ( is_nav_menu( $menu ) ) { + $menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'post_status' => 'any' ) ); + $result = '
          ' : '">'; + $result .= '

          ' . __( 'Add menu items from the column on the left.' ) . '

          '; + $result .= '
          '; + + if ( empty( $menu_items ) ) { + return $result . ' '; + } + + /** + * Filters the Walker class used when adding nav menu items. + * + * @since 3.0.0 + * + * @param string $class The walker class to use. Default 'Walker_Nav_Menu_Edit'. + * @param int $menu_id ID of the menu being rendered. + */ + $walker_class_name = apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $menu_id ); + + if ( class_exists( $walker_class_name ) ) { + $walker = new $walker_class_name; + } else { + return new WP_Error( + 'menu_walker_not_exist', + sprintf( + /* translators: %s: Walker class name. */ + __( 'The Walker class named %s does not exist.' ), + '' . $walker_class_name . '' + ) + ); + } + + $some_pending_menu_items = false; + $some_invalid_menu_items = false; + foreach ( (array) $menu_items as $menu_item ) { + if ( isset( $menu_item->post_status ) && 'draft' == $menu_item->post_status ) { + $some_pending_menu_items = true; + } + if ( ! empty( $menu_item->_invalid ) ) { + $some_invalid_menu_items = true; + } + } + + if ( $some_pending_menu_items ) { + $result .= '

          ' . __( 'Click Save Menu to make pending menu items public.' ) . '

          '; + } + + if ( $some_invalid_menu_items ) { + $result .= '

          ' . __( 'There are some invalid menu items. Please check or delete them.' ) . '

          '; + } + + $result .= ' '; + return $result; + } elseif ( is_wp_error( $menu ) ) { + return $menu; + } + +} + +/** + * Returns the columns for the nav menus page. + * + * @since 3.0.0 + * + * @return string[] Array of column titles keyed by their column name. + */ +function wp_nav_menu_manage_columns() { + return array( + '_title' => __( 'Show advanced menu properties' ), + 'cb' => '', + 'link-target' => __( 'Link Target' ), + 'title-attribute' => __( 'Title Attribute' ), + 'css-classes' => __( 'CSS Classes' ), + 'xfn' => __( 'Link Relationship (XFN)' ), + 'description' => __( 'Description' ), + ); +} + +/** + * Deletes orphaned draft menu items + * + * @access private + * @since 3.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function _wp_delete_orphaned_draft_menu_items() { + global $wpdb; + $delete_timestamp = time() - ( DAY_IN_SECONDS * EMPTY_TRASH_DAYS ); + + // Delete orphaned draft menu items. + $menu_items_to_delete = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts AS p LEFT JOIN $wpdb->postmeta AS m ON p.ID = m.post_id WHERE post_type = 'nav_menu_item' AND post_status = 'draft' AND meta_key = '_menu_item_orphaned' AND meta_value < %d", $delete_timestamp ) ); + + foreach ( (array) $menu_items_to_delete as $menu_item_id ) { + wp_delete_post( $menu_item_id, true ); + } +} + +/** + * Saves nav menu items + * + * @since 3.6.0 + * + * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu + * @param string $nav_menu_selected_title Title of the currently-selected menu + * @return array The menu updated message + */ +function wp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title ) { + $unsorted_menu_items = wp_get_nav_menu_items( + $nav_menu_selected_id, + array( + 'orderby' => 'ID', + 'output' => ARRAY_A, + 'output_key' => 'ID', + 'post_status' => 'draft,publish', + ) + ); + $messages = array(); + $menu_items = array(); + // Index menu items by DB ID. + foreach ( $unsorted_menu_items as $_item ) { + $menu_items[ $_item->db_id ] = $_item; + } + + $post_fields = array( + 'menu-item-db-id', + 'menu-item-object-id', + 'menu-item-object', + 'menu-item-parent-id', + 'menu-item-position', + 'menu-item-type', + 'menu-item-title', + 'menu-item-url', + 'menu-item-description', + 'menu-item-attr-title', + 'menu-item-target', + 'menu-item-classes', + 'menu-item-xfn', + ); + + wp_defer_term_counting( true ); + // Loop through all the menu items' POST variables. + if ( ! empty( $_POST['menu-item-db-id'] ) ) { + foreach ( (array) $_POST['menu-item-db-id'] as $_key => $k ) { + + // Menu item title can't be blank. + if ( ! isset( $_POST['menu-item-title'][ $_key ] ) || '' == $_POST['menu-item-title'][ $_key ] ) { + continue; + } + + $args = array(); + foreach ( $post_fields as $field ) { + $args[ $field ] = isset( $_POST[ $field ][ $_key ] ) ? $_POST[ $field ][ $_key ] : ''; + } + + $menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, ( $_POST['menu-item-db-id'][ $_key ] != $_key ? 0 : $_key ), $args ); + + if ( is_wp_error( $menu_item_db_id ) ) { + $messages[] = '

          ' . $menu_item_db_id->get_error_message() . '

          '; + } else { + unset( $menu_items[ $menu_item_db_id ] ); + } + } + } + + // Remove menu items from the menu that weren't in $_POST. + if ( ! empty( $menu_items ) ) { + foreach ( array_keys( $menu_items ) as $menu_item_id ) { + if ( is_nav_menu_item( $menu_item_id ) ) { + wp_delete_post( $menu_item_id ); + } + } + } + + // Store 'auto-add' pages. + $auto_add = ! empty( $_POST['auto-add-pages'] ); + $nav_menu_option = (array) get_option( 'nav_menu_options' ); + if ( ! isset( $nav_menu_option['auto_add'] ) ) { + $nav_menu_option['auto_add'] = array(); + } + if ( $auto_add ) { + if ( ! in_array( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) ) { + $nav_menu_option['auto_add'][] = $nav_menu_selected_id; + } + } else { + $key = array_search( $nav_menu_selected_id, $nav_menu_option['auto_add'] ); + if ( false !== $key ) { + unset( $nav_menu_option['auto_add'][ $key ] ); + } + } + // Remove non-existent/deleted menus. + $nav_menu_option['auto_add'] = array_intersect( $nav_menu_option['auto_add'], wp_get_nav_menus( array( 'fields' => 'ids' ) ) ); + update_option( 'nav_menu_options', $nav_menu_option ); + + wp_defer_term_counting( false ); + + /** This action is documented in wp-includes/nav-menu.php */ + do_action( 'wp_update_nav_menu', $nav_menu_selected_id ); + + $messages[] = '

          ' . + sprintf( + /* translators: %s: Nav menu title. */ + __( '%s has been updated.' ), + '' . $nav_menu_selected_title . '' + ) . '

          '; + + unset( $menu_items, $unsorted_menu_items ); + + return $messages; +} + +/** + * If a JSON blob of navigation menu data is in POST data, expand it and inject + * it into `$_POST` to avoid PHP `max_input_vars` limitations. See #14134. + * + * @ignore + * @since 4.5.3 + * @access private + */ +function _wp_expand_nav_menu_post_data() { + if ( ! isset( $_POST['nav-menu-data'] ) ) { + return; + } + + $data = json_decode( stripslashes( $_POST['nav-menu-data'] ) ); + + if ( ! is_null( $data ) && $data ) { + foreach ( $data as $post_input_data ) { + // For input names that are arrays (e.g. `menu-item-db-id[3][4][5]`), + // derive the array path keys via regex and set the value in $_POST. + preg_match( '#([^\[]*)(\[(.+)\])?#', $post_input_data->name, $matches ); + + $array_bits = array( $matches[1] ); + + if ( isset( $matches[3] ) ) { + $array_bits = array_merge( $array_bits, explode( '][', $matches[3] ) ); + } + + $new_post_data = array(); + + // Build the new array value from leaf to trunk. + for ( $i = count( $array_bits ) - 1; $i >= 0; $i-- ) { + if ( count( $array_bits ) - 1 == $i ) { + $new_post_data[ $array_bits[ $i ] ] = wp_slash( $post_input_data->value ); + } else { + $new_post_data = array( $array_bits[ $i ] => $new_post_data ); + } + } + + $_POST = array_replace_recursive( $_POST, $new_post_data ); + } + } +} diff --git a/wp-admin/includes/network.php b/wp-admin/includes/network.php new file mode 100644 index 0000000..f2a5134 --- /dev/null +++ b/wp-admin/includes/network.php @@ -0,0 +1,668 @@ +prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $wpdb->site ) ); + if ( $wpdb->get_var( $sql ) ) { + return $wpdb->get_var( "SELECT domain FROM $wpdb->site ORDER BY id ASC LIMIT 1" ); + } + return false; +} + +/** + * Allow subdomain installation + * + * @since 3.0.0 + * @return bool Whether subdomain installation is allowed + */ +function allow_subdomain_install() { + $domain = preg_replace( '|https?://([^/]+)|', '$1', get_option( 'home' ) ); + if ( parse_url( get_option( 'home' ), PHP_URL_PATH ) || 'localhost' === $domain || preg_match( '|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$|', $domain ) ) { + return false; + } + + return true; +} + +/** + * Allow subdirectory installation. + * + * @since 3.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return bool Whether subdirectory installation is allowed + */ +function allow_subdirectory_install() { + global $wpdb; + /** + * Filters whether to enable the subdirectory installation feature in Multisite. + * + * @since 3.0.0 + * + * @param bool $allow Whether to enable the subdirectory installation feature in Multisite. Default is false. + */ + if ( apply_filters( 'allow_subdirectory_install', false ) ) { + return true; + } + + if ( defined( 'ALLOW_SUBDIRECTORY_INSTALL' ) && ALLOW_SUBDIRECTORY_INSTALL ) { + return true; + } + + $post = $wpdb->get_row( "SELECT ID FROM $wpdb->posts WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish'" ); + if ( empty( $post ) ) { + return true; + } + + return false; +} + +/** + * Get base domain of network. + * + * @since 3.0.0 + * @return string Base domain. + */ +function get_clean_basedomain() { + $existing_domain = network_domain_check(); + if ( $existing_domain ) { + return $existing_domain; + } + $domain = preg_replace( '|https?://|', '', get_option( 'siteurl' ) ); + $slash = strpos( $domain, '/' ); + if ( $slash ) { + $domain = substr( $domain, 0, $slash ); + } + return $domain; +} + +/** + * Prints step 1 for Network installation process. + * + * @todo Realistically, step 1 should be a welcome screen explaining what a Network is and such. Navigating to Tools > Network + * should not be a sudden "Welcome to a new install process! Fill this out and click here." See also contextual help todo. + * + * @since 3.0.0 + * + * @global bool $is_apache + * + * @param WP_Error $errors + */ +function network_step1( $errors = false ) { + global $is_apache; + + if ( defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) { + echo '

          ' . __( 'Error:' ) . ' ' . sprintf( + /* translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES */ + __( 'The constant %s cannot be defined when creating a network.' ), + 'DO_NOT_UPGRADE_GLOBAL_TABLES' + ) . '

          '; + echo ''; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + die(); + } + + $active_plugins = get_option( 'active_plugins' ); + if ( ! empty( $active_plugins ) ) { + echo '

          ' . __( 'Warning:' ) . ' ' . sprintf( + /* translators: %s: URL to Plugins screen. */ + __( 'Please deactivate your plugins before enabling the Network feature.' ), + admin_url( 'plugins.php?plugin_status=active' ) + ) . '

          '; + echo '

          ' . __( 'Once the network is created, you may reactivate your plugins.' ) . '

          '; + echo ''; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + die(); + } + + $hostname = get_clean_basedomain(); + $has_ports = strstr( $hostname, ':' ); + if ( ( false !== $has_ports && ! in_array( $has_ports, array( ':80', ':443' ) ) ) ) { + echo '

          ' . __( 'Error:' ) . ' ' . __( 'You cannot install a network of sites with your server address.' ) . '

          '; + echo '

          ' . sprintf( + /* translators: %s: Port number. */ + __( 'You cannot use port numbers such as %s.' ), + '' . $has_ports . '' + ) . '

          '; + echo '' . __( 'Return to Dashboard' ) . ''; + echo ''; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + die(); + } + + echo '
          '; + + wp_nonce_field( 'install-network-1' ); + + $error_codes = array(); + if ( is_wp_error( $errors ) ) { + echo '

          ' . __( 'Error: The network could not be created.' ) . '

          '; + foreach ( $errors->get_error_messages() as $error ) { + echo "

          $error

          "; + } + echo '
          '; + $error_codes = $errors->get_error_codes(); + } + + if ( ! empty( $_POST['sitename'] ) && ! in_array( 'empty_sitename', $error_codes ) ) { + $site_name = $_POST['sitename']; + } else { + /* translators: %s: Default network title. */ + $site_name = sprintf( __( '%s Sites' ), get_option( 'blogname' ) ); + } + + if ( ! empty( $_POST['email'] ) && ! in_array( 'invalid_email', $error_codes ) ) { + $admin_email = $_POST['email']; + } else { + $admin_email = get_option( 'admin_email' ); + } + ?> +

          +

          +

          ' . __( 'Note:' ) . ' '; + printf( + /* translators: %s: mod_rewrite */ + __( 'Please make sure the Apache %s module is installed as it will be used at the end of this installation.' ), + 'mod_rewrite' + ); + echo '

          '; + } elseif ( $is_apache ) { + echo '

          ' . __( 'Warning:' ) . ' '; + printf( + /* translators: %s: mod_rewrite */ + __( 'It looks like the Apache %s module is not installed.' ), + 'mod_rewrite' + ); + echo '

          '; + } + + if ( $got_mod_rewrite || $is_apache ) { // Protect against mod_rewrite mimicry (but ! Apache). + echo '

          '; + printf( + /* translators: 1: mod_rewrite, 2: mod_rewrite documentation URL, 3: Google search for mod_rewrite. */ + __( 'If %1$s is disabled, ask your administrator to enable that module, or look at the Apache documentation or elsewhere for help setting it up.' ), + 'mod_rewrite', + 'https://httpd.apache.org/docs/mod/mod_rewrite.html', + 'https://www.google.com/search?q=apache+mod_rewrite' + ); + echo '

          '; + } + } + + if ( allow_subdomain_install() && allow_subdirectory_install() ) : + ?> +

          +

          +

          +

          + + + + + + + + + + + + +

          ' . __( 'Warning:' ) . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '

          '; + } + + $is_www = ( 0 === strpos( $hostname, 'www.' ) ); + if ( $is_www ) : + ?> +

          +

          + ' . substr( $hostname, 4 ) . '', + '' . $hostname . '', + 'www' + ); + ?> +

          + + + + + + + + +

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + ' . $errors->get_error_message() . ''; + } + + if ( $_POST ) { + if ( allow_subdomain_install() ) { + $subdomain_install = allow_subdirectory_install() ? ! empty( $_POST['subdomain_install'] ) : true; + } else { + $subdomain_install = false; + } + } else { + if ( is_multisite() ) { + $subdomain_install = is_subdomain_install(); + ?> +

          + get_var( "SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = 1 AND meta_key = 'subdomain_install'" ); + ?> +

          +

          + +

          +

          +

          + ' . __( 'Caution:' ) . ' '; + printf( + /* translators: 1: wp-config.php, 2: .htaccess */ + __( 'We recommend you back up your existing %1$s and %2$s files.' ), + 'wp-config.php', + '.htaccess' + ); + } elseif ( file_exists( $home_path . 'web.config' ) ) { + echo '' . __( 'Caution:' ) . ' '; + printf( + /* translators: 1: wp-config.php, 2: web.config */ + __( 'We recommend you back up your existing %1$s and %2$s files.' ), + 'wp-config.php', + 'web.config' + ); + } else { + echo '' . __( 'Caution:' ) . ' '; + printf( + /* translators: %s: wp-config.php */ + __( 'We recommend you back up your existing %s file.' ), + 'wp-config.php' + ); + } + ?> +

          + +
            +
          1. + above the line reading %3$s:' ), + 'wp-config.php', + '' . $location_of_wp_config . '', + /* + * translators: This string should only be translated if wp-config-sample.php is localized. + * You can check the localized release package or + * https://i18n.svn.wordpress.org//branches//dist/wp-config-sample.php + */ + '/* ' . __( 'That’s all, stop editing! Happy publishing.' ) . ' */' + ); + ?> +

            + + '', + 'SECURE_AUTH_KEY' => '', + 'LOGGED_IN_KEY' => '', + 'NONCE_KEY' => '', + 'AUTH_SALT' => '', + 'SECURE_AUTH_SALT' => '', + 'LOGGED_IN_SALT' => '', + 'NONCE_SALT' => '', + ); + foreach ( $keys_salts as $c => $v ) { + if ( defined( $c ) ) { + unset( $keys_salts[ $c ] ); + } + } + + if ( ! empty( $keys_salts ) ) { + $keys_salts_str = ''; + $from_api = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' ); + if ( is_wp_error( $from_api ) ) { + foreach ( $keys_salts as $c => $v ) { + $keys_salts_str .= "\ndefine( '$c', '" . wp_generate_password( 64, true, true ) . "' );"; + } + } else { + $from_api = explode( "\n", wp_remote_retrieve_body( $from_api ) ); + foreach ( $keys_salts as $c => $v ) { + $keys_salts_str .= "\ndefine( '$c', '" . substr( array_shift( $from_api ), 28, 64 ) . "' );"; + } + } + $num_keys_salts = count( $keys_salts ); + ?> +

            + wp-config.php' + ); + } else { + printf( + /* translators: %s: wp-config.php */ + __( 'These unique authentication keys are also missing from your %s file.' ), + 'wp-config.php' + ); + } + ?> + +

            + + +
          2. + + + + + + + + + '; + if ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) { + $web_config_file .= ' + + + + '; + } + $web_config_file .= ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'; + + echo '
          3. '; + printf( + /* translators: 1: File name (.htaccess or web.config), 2: File path. */ + __( 'Add the following to your %1$s file in %2$s, replacing other WordPress rules:' ), + 'web.config', + '' . $home_path . '' + ); + echo '

            '; + if ( ! $subdomain_install && WP_CONTENT_DIR !== ABSPATH . 'wp-content' ) { + echo '

            ' . __( 'Warning:' ) . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '

            '; + } + ?> + +
          4. +
          + +

          '; + printf( + /* translators: 1: File name (.htaccess or web.config), 2: File path. */ + __( 'Add the following to your %1$s file in %2$s, replacing other WordPress rules:' ), + '.htaccess', + '' . $home_path . '' + ); + echo '

          '; + if ( ! $subdomain_install && WP_CONTENT_DIR !== ABSPATH . 'wp-content' ) { + echo '

          ' . __( 'Warning:' ) . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '

          '; + } + ?> + + +
        + + +

        + + + + + + + '; + echo '

        ' . __( 'The character encoding of your site (UTF-8 is recommended)' ) . '

        '; +} diff --git a/wp-admin/includes/plugin-install.php b/wp-admin/includes/plugin-install.php new file mode 100644 index 0000000..9f90f84 --- /dev/null +++ b/wp-admin/includes/plugin-install.php @@ -0,0 +1,892 @@ +per_page ) ) { + $args->per_page = 24; + } + } + + if ( ! isset( $args->locale ) ) { + $args->locale = get_user_locale(); + } + + if ( ! isset( $args->wp_version ) ) { + $args->wp_version = substr( $wp_version, 0, 3 ); // x.y + } + + /** + * Filters the WordPress.org Plugin Installation API arguments. + * + * Important: An object MUST be returned to this filter. + * + * @since 2.7.0 + * + * @param object $args Plugin API arguments. + * @param string $action The type of information being requested from the Plugin Installation API. + */ + $args = apply_filters( 'plugins_api_args', $args, $action ); + + /** + * Filters the response for the current WordPress.org Plugin Installation API request. + * + * Passing a non-false value will effectively short-circuit the WordPress.org API request. + * + * If `$action` is 'query_plugins' or 'plugin_information', an object MUST be passed. + * If `$action` is 'hot_tags' or 'hot_categories', an array should be passed. + * + * @since 2.7.0 + * + * @param false|object|array $result The result object or array. Default false. + * @param string $action The type of information being requested from the Plugin Installation API. + * @param object $args Plugin API arguments. + */ + $res = apply_filters( 'plugins_api', false, $action, $args ); + + if ( false === $res ) { + + $url = 'http://api.wordpress.org/plugins/info/1.2/'; + $url = add_query_arg( + array( + 'action' => $action, + 'request' => $args, + ), + $url + ); + + $http_url = $url; + $ssl = wp_http_supports( array( 'ssl' ) ); + if ( $ssl ) { + $url = set_url_scheme( $url, 'https' ); + } + + $http_args = array( + 'timeout' => 15, + 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), + ); + $request = wp_remote_get( $url, $http_args ); + + if ( $ssl && is_wp_error( $request ) ) { + trigger_error( + sprintf( + /* translators: %s: Support forums URL. */ + __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), + __( 'https://wordpress.org/support/forums/' ) + ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), + headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE + ); + $request = wp_remote_get( $http_url, $http_args ); + } + + if ( is_wp_error( $request ) ) { + $res = new WP_Error( + 'plugins_api_failed', + sprintf( + /* translators: %s: Support forums URL. */ + __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), + __( 'https://wordpress.org/support/forums/' ) + ), + $request->get_error_message() + ); + } else { + $res = json_decode( wp_remote_retrieve_body( $request ), true ); + if ( is_array( $res ) ) { + // Object casting is required in order to match the info/1.0 format. + $res = (object) $res; + } elseif ( null === $res ) { + $res = new WP_Error( + 'plugins_api_failed', + sprintf( + /* translators: %s: Support forums URL. */ + __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), + __( 'https://wordpress.org/support/forums/' ) + ), + wp_remote_retrieve_body( $request ) + ); + } + + if ( isset( $res->error ) ) { + $res = new WP_Error( 'plugins_api_failed', $res->error ); + } + } + } elseif ( ! is_wp_error( $res ) ) { + $res->external = true; + } + + /** + * Filters the Plugin Installation API response results. + * + * @since 2.7.0 + * + * @param object|WP_Error $res Response object or WP_Error. + * @param string $action The type of information being requested from the Plugin Installation API. + * @param object $args Plugin API arguments. + */ + return apply_filters( 'plugins_api_result', $res, $action, $args ); +} + +/** + * Retrieve popular WordPress plugin tags. + * + * @since 2.7.0 + * + * @param array $args + * @return array + */ +function install_popular_tags( $args = array() ) { + $key = md5( serialize( $args ) ); + $tags = get_site_transient( 'poptags_' . $key ); + if ( false !== $tags ) { + return $tags; + } + + $tags = plugins_api( 'hot_tags', $args ); + + if ( is_wp_error( $tags ) ) { + return $tags; + } + + set_site_transient( 'poptags_' . $key, $tags, 3 * HOUR_IN_SECONDS ); + + return $tags; +} + +/** + * @since 2.7.0 + */ +function install_dashboard() { + ?> +

        + WordPress Plugin Directory or upload a plugin in .zip format by clicking the button at the top of this page.' ), + __( 'https://wordpress.org/plugins/' ) + ); + ?> +

        + + + + '; +} + +/** + * Displays a search form for searching plugins. + * + * @since 2.7.0 + * @since 4.6.0 The `$type_selector` parameter was deprecated. + * + * @param bool $deprecated Not used. + */ +function install_search_form( $deprecated = true ) { + $type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term'; + $term = isset( $_REQUEST['s'] ) ? wp_unslash( $_REQUEST['s'] ) : ''; + ?> +
        + + + + + 'search-submit' ) ); ?> +
        + +
        +

        +
        + + + + +
        +
        + +

        +
        + +

        + + + + +

        +
        + ' . __( 'These suggestions are based on the plugins you and other users have installed.' ) . '

        '; + break; + case 'install_plugins_beta': + printf( + /* translators: %s: URL to "Features as Plugins" page. */ + '

        ' . __( 'You are using a development version of WordPress. These feature plugins are also under development. Learn more.' ) . '

        ', + 'https://make.wordpress.org/core/handbook/about/release-cycle/features-as-plugins/' + ); + break; + } + + ?> +
        + display(); ?> +
        + response ) ) { + foreach ( (array) $update_plugins->response as $file => $plugin ) { + if ( $plugin->slug === $api->slug ) { + $status = 'update_available'; + $update_file = $file; + $version = $plugin->new_version; + if ( current_user_can( 'update_plugins' ) ) { + $url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . $update_file ), 'upgrade-plugin_' . $update_file ); + } + break; + } + } + } + + if ( 'install' == $status ) { + if ( is_dir( WP_PLUGIN_DIR . '/' . $api->slug ) ) { + $installed_plugin = get_plugins( '/' . $api->slug ); + if ( empty( $installed_plugin ) ) { + if ( current_user_can( 'install_plugins' ) ) { + $url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $api->slug ), 'install-plugin_' . $api->slug ); + } + } else { + $key = array_keys( $installed_plugin ); + // Use the first plugin regardless of the name. + // Could have issues for multiple plugins in one directory if they share different version numbers. + $key = reset( $key ); + + $update_file = $api->slug . '/' . $key; + if ( version_compare( $api->version, $installed_plugin[ $key ]['Version'], '=' ) ) { + $status = 'latest_installed'; + } elseif ( version_compare( $api->version, $installed_plugin[ $key ]['Version'], '<' ) ) { + $status = 'newer_installed'; + $version = $installed_plugin[ $key ]['Version']; + } else { + // If the above update check failed, then that probably means that the update checker has out-of-date information, force a refresh. + if ( ! $loop ) { + delete_site_transient( 'update_plugins' ); + wp_update_plugins(); + return install_plugin_install_status( $api, true ); + } + } + } + } else { + // "install" & no directory with that slug. + if ( current_user_can( 'install_plugins' ) ) { + $url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $api->slug ), 'install-plugin_' . $api->slug ); + } + } + } + if ( isset( $_GET['from'] ) ) { + $url .= '&from=' . urlencode( wp_unslash( $_GET['from'] ) ); + } + + $file = $update_file; + return compact( 'status', 'url', 'version', 'file' ); +} + +/** + * Display plugin information in dialog box form. + * + * @since 2.7.0 + * + * @global string $tab + */ +function install_plugin_information() { + global $tab; + + if ( empty( $_REQUEST['plugin'] ) ) { + return; + } + + $api = plugins_api( + 'plugin_information', + array( + 'slug' => wp_unslash( $_REQUEST['plugin'] ), + ) + ); + + if ( is_wp_error( $api ) ) { + wp_die( $api ); + } + + $plugins_allowedtags = array( + 'a' => array( + 'href' => array(), + 'title' => array(), + 'target' => array(), + ), + 'abbr' => array( 'title' => array() ), + 'acronym' => array( 'title' => array() ), + 'code' => array(), + 'pre' => array(), + 'em' => array(), + 'strong' => array(), + 'div' => array( 'class' => array() ), + 'span' => array( 'class' => array() ), + 'p' => array(), + 'br' => array(), + 'ul' => array(), + 'ol' => array(), + 'li' => array(), + 'h1' => array(), + 'h2' => array(), + 'h3' => array(), + 'h4' => array(), + 'h5' => array(), + 'h6' => array(), + 'img' => array( + 'src' => array(), + 'class' => array(), + 'alt' => array(), + ), + 'blockquote' => array( 'cite' => true ), + ); + + $plugins_section_titles = array( + 'description' => _x( 'Description', 'Plugin installer section title' ), + 'installation' => _x( 'Installation', 'Plugin installer section title' ), + 'faq' => _x( 'FAQ', 'Plugin installer section title' ), + 'screenshots' => _x( 'Screenshots', 'Plugin installer section title' ), + 'changelog' => _x( 'Changelog', 'Plugin installer section title' ), + 'reviews' => _x( 'Reviews', 'Plugin installer section title' ), + 'other_notes' => _x( 'Other Notes', 'Plugin installer section title' ), + ); + + // Sanitize HTML. + foreach ( (array) $api->sections as $section_name => $content ) { + $api->sections[ $section_name ] = wp_kses( $content, $plugins_allowedtags ); + } + + foreach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) { + if ( isset( $api->$key ) ) { + $api->$key = wp_kses( $api->$key, $plugins_allowedtags ); + } + } + + $_tab = esc_attr( $tab ); + + // Default to the Description tab, Do not translate, API returns English. + $section = isset( $_REQUEST['section'] ) ? wp_unslash( $_REQUEST['section'] ) : 'description'; + if ( empty( $section ) || ! isset( $api->sections[ $section ] ) ) { + $section_titles = array_keys( (array) $api->sections ); + $section = reset( $section_titles ); + } + + iframe_header( __( 'Plugin Installation' ) ); + + $_with_banner = ''; + + if ( ! empty( $api->banners ) && ( ! empty( $api->banners['low'] ) || ! empty( $api->banners['high'] ) ) ) { + $_with_banner = 'with-banner'; + $low = empty( $api->banners['low'] ) ? $api->banners['high'] : $api->banners['low']; + $high = empty( $api->banners['high'] ) ? $api->banners['low'] : $api->banners['high']; + ?> + + '; + echo "

        {$api->name}

        "; + echo "
        \n"; + + foreach ( (array) $api->sections as $section_name => $content ) { + if ( 'reviews' === $section_name && ( empty( $api->ratings ) || 0 === array_sum( (array) $api->ratings ) ) ) { + continue; + } + + if ( isset( $plugins_section_titles[ $section_name ] ) ) { + $title = $plugins_section_titles[ $section_name ]; + } else { + $title = ucwords( str_replace( '_', ' ', $section_name ) ); + } + + $class = ( $section_name === $section ) ? ' class="current"' : ''; + $href = add_query_arg( + array( + 'tab' => $tab, + 'section' => $section_name, + ) + ); + $href = esc_url( $href ); + $san_section = esc_attr( $section_name ); + echo "\t$title\n"; + } + + echo "
        \n"; + + ?> +
        +
        +
          + version ) ) { ?> +
        • version; ?>
        • + author ) ) { ?> +
        • author, '_blank' ); ?>
        • + last_updated ) ) { ?> +
        • + last_updated ) ) ); + ?> +
        • + requires ) ) { ?> +
        • + + requires ); + ?> +
        • + tested ) ) { ?> +
        • tested; ?>
        • + requires_php ) ) { ?> +
        • + + requires_php ); + ?> +
        • + active_installs ) ) { ?> +
        • + active_installs >= 1000000 ) { + $active_installs_millions = floor( $api->active_installs / 1000000 ); + printf( + /* translators: %s: Number of millions. */ + _nx( '%s+ Million', '%s+ Million', $active_installs_millions, 'Active plugin installations' ), + number_format_i18n( $active_installs_millions ) + ); + } elseif ( 0 == $api->active_installs ) { + _ex( 'Less Than 10', 'Active plugin installations' ); + } else { + echo number_format_i18n( $api->active_installs ) . '+'; + } + ?> +
        • + slug ) && empty( $api->external ) ) { ?> +
        • + homepage ) ) { ?> +
        • + donate_link ) && empty( $api->contributors ) ) { ?> +
        • + +
        + rating ) ) { ?> +

        + $api->rating, + 'type' => 'percent', + 'number' => $api->num_ratings, + ) + ); + ?> + + ratings ) && array_sum( (array) $api->ratings ) > 0 ) { + ?> +

        +

        + ratings as $key => $ratecount ) { + // Avoid div-by-zero. + $_rating = $api->num_ratings ? ( $ratecount / $api->num_ratings ) : 0; + $aria_label = esc_attr( + sprintf( + /* translators: 1: Number of stars (used to determine singular/plural), 2: Number of reviews. */ + _n( + 'Reviews with %1$d star: %2$s. Opens in a new tab.', + 'Reviews with %1$d stars: %2$s. Opens in a new tab.', + $key + ), + $key, + number_format_i18n( $ratecount ) + ) + ); + ?> +
        + + %s', + "https://wordpress.org/support/plugin/{$api->slug}/reviews/?filter={$key}", + $aria_label, + /* translators: %s: Number of stars. */ + sprintf( _n( '%d star', '%d stars', $key ), $key ) + ); + ?> + + + + + +
        + contributors ) ) { + ?> +

        +
          + contributors as $contrib_username => $contrib_details ) { + $contrib_name = $contrib_details['display_name']; + if ( ! $contrib_name ) { + $contrib_name = $contrib_username; + } + $contrib_name = esc_html( $contrib_name ); + + $contrib_profile = esc_url( $contrib_details['profile'] ); + $contrib_avatar = esc_url( add_query_arg( 's', '36', $contrib_details['avatar'] ) ); + + echo "
        • {$contrib_name}
        • "; + } + ?> +
        + donate_link ) ) { ?> + + + +
        +
        + requires_php ) ? $api->requires_php : null; + $requires_wp = isset( $api->requires ) ? $api->requires : null; + + $compatible_php = is_php_version_compatible( $requires_php ); + $compatible_wp = is_wp_version_compatible( $requires_wp ); + $tested_wp = ( empty( $api->tested ) || version_compare( get_bloginfo( 'version' ), $api->tested, '<=' ) ); + + if ( ! $compatible_php ) { + echo '

        '; + _e( 'Error: This plugin requires a newer version of PHP.' ); + if ( current_user_can( 'update_php' ) ) { + printf( + /* translators: %s: URL to Update PHP page. */ + ' ' . __( 'Click here to learn more about updating PHP.' ), + esc_url( wp_get_update_php_url() ) + ); + + wp_update_php_annotation( '

        ', '' ); + } else { + echo '

        '; + } + echo '
        '; + } + + if ( ! $tested_wp ) { + echo '

        '; + _e( 'Warning: This plugin has not been tested with your current version of WordPress.' ); + echo '

        '; + } elseif ( ! $compatible_wp ) { + echo '

        '; + _e( 'Error: This plugin requires a newer version of WordPress.' ); + if ( current_user_can( 'update_core' ) ) { + printf( + /* translators: %s: URL to WordPress Updates screen. */ + ' ' . __( 'Click here to update WordPress.' ), + self_admin_url( 'update-core.php' ) + ); + } + echo '

        '; + } + + foreach ( (array) $api->sections as $section_name => $content ) { + $content = links_add_base_url( $content, 'https://wordpress.org/plugins/' . $api->slug . '/' ); + $content = links_add_target( $content, '_blank' ); + + $san_section = esc_attr( $section_name ); + + $display = ( $section_name === $section ) ? 'block' : 'none'; + + echo "\t
        \n"; + echo $content; + echo "\t
        \n"; + } + echo "
        \n"; + echo "
        \n"; + echo "\n"; // #plugin-information-scrollable + echo "\n"; + + iframe_footer(); + exit; +} diff --git a/wp-admin/includes/plugin.php b/wp-admin/includes/plugin.php new file mode 100644 index 0000000..2de370c --- /dev/null +++ b/wp-admin/includes/plugin.php @@ -0,0 +1,2442 @@ + 'Plugin Name', + 'PluginURI' => 'Plugin URI', + 'Version' => 'Version', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + 'Network' => 'Network', + 'RequiresWP' => 'Requires at least', + 'RequiresPHP' => 'Requires PHP', + // Site Wide Only is deprecated in favor of Network. + '_sitewide' => 'Site Wide Only', + ); + + $plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' ); + + // Site Wide Only is the old header for Network. + if ( ! $plugin_data['Network'] && $plugin_data['_sitewide'] ) { + /* translators: 1: Site Wide Only: true, 2: Network: true */ + _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( __( 'The %1$s plugin header is deprecated. Use %2$s instead.' ), 'Site Wide Only: true', 'Network: true' ) ); + $plugin_data['Network'] = $plugin_data['_sitewide']; + } + $plugin_data['Network'] = ( 'true' == strtolower( $plugin_data['Network'] ) ); + unset( $plugin_data['_sitewide'] ); + + // If no text domain is defined fall back to the plugin slug. + if ( ! $plugin_data['TextDomain'] ) { + $plugin_slug = dirname( plugin_basename( $plugin_file ) ); + if ( '.' !== $plugin_slug && false === strpos( $plugin_slug, '/' ) ) { + $plugin_data['TextDomain'] = $plugin_slug; + } + } + + if ( $markup || $translate ) { + $plugin_data = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate ); + } else { + $plugin_data['Title'] = $plugin_data['Name']; + $plugin_data['AuthorName'] = $plugin_data['Author']; + } + + return $plugin_data; +} + +/** + * Sanitizes plugin data, optionally adds markup, optionally translates. + * + * @since 2.7.0 + * + * @see get_plugin_data() + * + * @access private + * + * @param string $plugin_file Path to the main plugin file. + * @param array $plugin_data An array of plugin data. See `get_plugin_data()`. + * @param bool $markup Optional. If the returned data should have HTML markup applied. + * Default true. + * @param bool $translate Optional. If the returned data should be translated. Default true. + * @return array { + * Plugin data. Values will be empty if not supplied by the plugin. + * + * @type string $Name Name of the plugin. Should be unique. + * @type string $Title Title of the plugin and link to the plugin's site (if set). + * @type string $Description Plugin description. + * @type string $Author Author's name. + * @type string $AuthorURI Author's website address (if set). + * @type string $Version Plugin version. + * @type string $TextDomain Plugin textdomain. + * @type string $DomainPath Plugins relative directory path to .mo files. + * @type bool $Network Whether the plugin can only be activated network-wide. + * } + */ +function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) { + + // Sanitize the plugin filename to a WP_PLUGIN_DIR relative path. + $plugin_file = plugin_basename( $plugin_file ); + + // Translate fields. + if ( $translate ) { + $textdomain = $plugin_data['TextDomain']; + if ( $textdomain ) { + if ( ! is_textdomain_loaded( $textdomain ) ) { + if ( $plugin_data['DomainPath'] ) { + load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] ); + } else { + load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) ); + } + } + } elseif ( 'hello.php' == basename( $plugin_file ) ) { + $textdomain = 'default'; + } + if ( $textdomain ) { + foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field ) { + // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain + $plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain ); + } + } + } + + // Sanitize fields. + $allowed_tags_in_links = array( + 'abbr' => array( 'title' => true ), + 'acronym' => array( 'title' => true ), + 'code' => true, + 'em' => true, + 'strong' => true, + ); + + $allowed_tags = $allowed_tags_in_links; + $allowed_tags['a'] = array( + 'href' => true, + 'title' => true, + ); + + // Name is marked up inside tags. Don't allow these. + // Author is too, but some plugins have used here (omitting Author URI). + $plugin_data['Name'] = wp_kses( $plugin_data['Name'], $allowed_tags_in_links ); + $plugin_data['Author'] = wp_kses( $plugin_data['Author'], $allowed_tags ); + + $plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags ); + $plugin_data['Version'] = wp_kses( $plugin_data['Version'], $allowed_tags ); + + $plugin_data['PluginURI'] = esc_url( $plugin_data['PluginURI'] ); + $plugin_data['AuthorURI'] = esc_url( $plugin_data['AuthorURI'] ); + + $plugin_data['Title'] = $plugin_data['Name']; + $plugin_data['AuthorName'] = $plugin_data['Author']; + + // Apply markup. + if ( $markup ) { + if ( $plugin_data['PluginURI'] && $plugin_data['Name'] ) { + $plugin_data['Title'] = '' . $plugin_data['Name'] . ''; + } + + if ( $plugin_data['AuthorURI'] && $plugin_data['Author'] ) { + $plugin_data['Author'] = '' . $plugin_data['Author'] . ''; + } + + $plugin_data['Description'] = wptexturize( $plugin_data['Description'] ); + + if ( $plugin_data['Author'] ) { + $plugin_data['Description'] .= sprintf( + /* translators: %s: Plugin author. */ + ' ' . __( 'By %s.' ) . '', + $plugin_data['Author'] + ); + } + } + + return $plugin_data; +} + +/** + * Get a list of a plugin's files. + * + * @since 2.8.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return string[] Array of file names relative to the plugin root. + */ +function get_plugin_files( $plugin ) { + $plugin_file = WP_PLUGIN_DIR . '/' . $plugin; + $dir = dirname( $plugin_file ); + + $plugin_files = array( plugin_basename( $plugin_file ) ); + + if ( is_dir( $dir ) && WP_PLUGIN_DIR !== $dir ) { + + /** + * Filters the array of excluded directories and files while scanning the folder. + * + * @since 4.9.0 + * + * @param string[] $exclusions Array of excluded directories and files. + */ + $exclusions = (array) apply_filters( 'plugin_files_exclusions', array( 'CVS', 'node_modules', 'vendor', 'bower_components' ) ); + + $list_files = list_files( $dir, 100, $exclusions ); + $list_files = array_map( 'plugin_basename', $list_files ); + + $plugin_files = array_merge( $plugin_files, $list_files ); + $plugin_files = array_values( array_unique( $plugin_files ) ); + } + + return $plugin_files; +} + +/** + * Check the plugins directory and retrieve all plugin files with plugin data. + * + * WordPress only supports plugin files in the base plugins directory + * (wp-content/plugins) and in one directory above the plugins directory + * (wp-content/plugins/my-plugin). The file it looks for has the plugin data + * and must be found in those two locations. It is recommended to keep your + * plugin files in their own directories. + * + * The file with the plugin data is the file that will be included and therefore + * needs to have the main execution for the plugin. This does not mean + * everything must be contained in the file and it is recommended that the file + * be split for maintainability. Keep everything in one file for extreme + * optimization purposes. + * + * @since 1.5.0 + * + * @param string $plugin_folder Optional. Relative path to single plugin folder. + * @return array[] Array of arrays of plugin data, keyed by plugin file name. See `get_plugin_data()`. + */ +function get_plugins( $plugin_folder = '' ) { + + $cache_plugins = wp_cache_get( 'plugins', 'plugins' ); + if ( ! $cache_plugins ) { + $cache_plugins = array(); + } + + if ( isset( $cache_plugins[ $plugin_folder ] ) ) { + return $cache_plugins[ $plugin_folder ]; + } + + $wp_plugins = array(); + $plugin_root = WP_PLUGIN_DIR; + if ( ! empty( $plugin_folder ) ) { + $plugin_root .= $plugin_folder; + } + + // Files in wp-content/plugins directory. + $plugins_dir = @ opendir( $plugin_root ); + $plugin_files = array(); + if ( $plugins_dir ) { + while ( ( $file = readdir( $plugins_dir ) ) !== false ) { + if ( substr( $file, 0, 1 ) == '.' ) { + continue; + } + if ( is_dir( $plugin_root . '/' . $file ) ) { + $plugins_subdir = @ opendir( $plugin_root . '/' . $file ); + if ( $plugins_subdir ) { + while ( ( $subfile = readdir( $plugins_subdir ) ) !== false ) { + if ( substr( $subfile, 0, 1 ) == '.' ) { + continue; + } + if ( substr( $subfile, -4 ) == '.php' ) { + $plugin_files[] = "$file/$subfile"; + } + } + closedir( $plugins_subdir ); + } + } else { + if ( substr( $file, -4 ) == '.php' ) { + $plugin_files[] = $file; + } + } + } + closedir( $plugins_dir ); + } + + if ( empty( $plugin_files ) ) { + return $wp_plugins; + } + + foreach ( $plugin_files as $plugin_file ) { + if ( ! is_readable( "$plugin_root/$plugin_file" ) ) { + continue; + } + + // Do not apply markup/translate as it will be cached. + $plugin_data = get_plugin_data( "$plugin_root/$plugin_file", false, false ); + + if ( empty( $plugin_data['Name'] ) ) { + continue; + } + + $wp_plugins[ plugin_basename( $plugin_file ) ] = $plugin_data; + } + + uasort( $wp_plugins, '_sort_uname_callback' ); + + $cache_plugins[ $plugin_folder ] = $wp_plugins; + wp_cache_set( 'plugins', $cache_plugins, 'plugins' ); + + return $wp_plugins; +} + +/** + * Check the mu-plugins directory and retrieve all mu-plugin files with any plugin data. + * + * WordPress only includes mu-plugin files in the base mu-plugins directory (wp-content/mu-plugins). + * + * @since 3.0.0 + * @return array[] Array of arrays of mu-plugin data, keyed by plugin file name. See `get_plugin_data()`. + */ +function get_mu_plugins() { + $wp_plugins = array(); + $plugin_files = array(); + + if ( ! is_dir( WPMU_PLUGIN_DIR ) ) { + return $wp_plugins; + } + + // Files in wp-content/mu-plugins directory. + $plugins_dir = @opendir( WPMU_PLUGIN_DIR ); + if ( $plugins_dir ) { + while ( ( $file = readdir( $plugins_dir ) ) !== false ) { + if ( substr( $file, -4 ) == '.php' ) { + $plugin_files[] = $file; + } + } + } else { + return $wp_plugins; + } + + closedir( $plugins_dir ); + + if ( empty( $plugin_files ) ) { + return $wp_plugins; + } + + foreach ( $plugin_files as $plugin_file ) { + if ( ! is_readable( WPMU_PLUGIN_DIR . "/$plugin_file" ) ) { + continue; + } + + // Do not apply markup/translate as it will be cached. + $plugin_data = get_plugin_data( WPMU_PLUGIN_DIR . "/$plugin_file", false, false ); + + if ( empty( $plugin_data['Name'] ) ) { + $plugin_data['Name'] = $plugin_file; + } + + $wp_plugins[ $plugin_file ] = $plugin_data; + } + + if ( isset( $wp_plugins['index.php'] ) && filesize( WPMU_PLUGIN_DIR . '/index.php' ) <= 30 ) { + // Silence is golden. + unset( $wp_plugins['index.php'] ); + } + + uasort( $wp_plugins, '_sort_uname_callback' ); + + return $wp_plugins; +} + +/** + * Callback to sort array by a 'Name' key. + * + * @since 3.1.0 + * + * @access private + * + * @param array $a array with 'Name' key. + * @param array $b array with 'Name' key. + * @return int Return 0 or 1 based on two string comparison. + */ +function _sort_uname_callback( $a, $b ) { + return strnatcasecmp( $a['Name'], $b['Name'] ); +} + +/** + * Check the wp-content directory and retrieve all drop-ins with any plugin data. + * + * @since 3.0.0 + * @return array[] Array of arrays of dropin plugin data, keyed by plugin file name. See `get_plugin_data()`. + */ +function get_dropins() { + $dropins = array(); + $plugin_files = array(); + + $_dropins = _get_dropins(); + + // Files in wp-content directory. + $plugins_dir = @opendir( WP_CONTENT_DIR ); + if ( $plugins_dir ) { + while ( ( $file = readdir( $plugins_dir ) ) !== false ) { + if ( isset( $_dropins[ $file ] ) ) { + $plugin_files[] = $file; + } + } + } else { + return $dropins; + } + + closedir( $plugins_dir ); + + if ( empty( $plugin_files ) ) { + return $dropins; + } + + foreach ( $plugin_files as $plugin_file ) { + if ( ! is_readable( WP_CONTENT_DIR . "/$plugin_file" ) ) { + continue; + } + + // Do not apply markup/translate as it will be cached. + $plugin_data = get_plugin_data( WP_CONTENT_DIR . "/$plugin_file", false, false ); + + if ( empty( $plugin_data['Name'] ) ) { + $plugin_data['Name'] = $plugin_file; + } + + $dropins[ $plugin_file ] = $plugin_data; + } + + uksort( $dropins, 'strnatcasecmp' ); + + return $dropins; +} + +/** + * Returns drop-ins that WordPress uses. + * + * Includes Multisite drop-ins only when is_multisite() + * + * @since 3.0.0 + * @return array[] Key is file name. The value is an array, with the first value the + * purpose of the drop-in and the second value the name of the constant that must be + * true for the drop-in to be used, or true if no constant is required. + */ +function _get_dropins() { + $dropins = array( + 'advanced-cache.php' => array( __( 'Advanced caching plugin.' ), 'WP_CACHE' ), // WP_CACHE + 'db.php' => array( __( 'Custom database class.' ), true ), // Auto on load. + 'db-error.php' => array( __( 'Custom database error message.' ), true ), // Auto on error. + 'install.php' => array( __( 'Custom installation script.' ), true ), // Auto on installation. + 'maintenance.php' => array( __( 'Custom maintenance message.' ), true ), // Auto on maintenance. + 'object-cache.php' => array( __( 'External object cache.' ), true ), // Auto on load. + 'php-error.php' => array( __( 'Custom PHP error message.' ), true ), // Auto on error. + 'fatal-error-handler.php' => array( __( 'Custom PHP fatal error handler.' ), true ), // Auto on error. + ); + + if ( is_multisite() ) { + $dropins['sunrise.php'] = array( __( 'Executed before Multisite is loaded.' ), 'SUNRISE' ); // SUNRISE + $dropins['blog-deleted.php'] = array( __( 'Custom site deleted message.' ), true ); // Auto on deleted blog. + $dropins['blog-inactive.php'] = array( __( 'Custom site inactive message.' ), true ); // Auto on inactive blog. + $dropins['blog-suspended.php'] = array( __( 'Custom site suspended message.' ), true ); // Auto on archived or spammed blog. + } + + return $dropins; +} + +/** + * Determines whether a plugin is active. + * + * Only plugins installed in the plugins/ folder can be active. + * + * Plugins in the mu-plugins/ folder can't be "activated," so this function will + * return false for those plugins. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 2.5.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True, if in the active plugins list. False, not in the list. + */ +function is_plugin_active( $plugin ) { + return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin ); +} + +/** + * Determines whether the plugin is inactive. + * + * Reverse of is_plugin_active(). Used as a callback. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 3.1.0 + * @see is_plugin_active() + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True if inactive. False if active. + */ +function is_plugin_inactive( $plugin ) { + return ! is_plugin_active( $plugin ); +} + +/** + * Determines whether the plugin is active for the entire network. + * + * Only plugins installed in the plugins/ folder can be active. + * + * Plugins in the mu-plugins/ folder can't be "activated," so this function will + * return false for those plugins. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 3.0.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True if active for the network, otherwise false. + */ +function is_plugin_active_for_network( $plugin ) { + if ( ! is_multisite() ) { + return false; + } + + $plugins = get_site_option( 'active_sitewide_plugins' ); + if ( isset( $plugins[ $plugin ] ) ) { + return true; + } + + return false; +} + +/** + * Checks for "Network: true" in the plugin header to see if this should + * be activated only as a network wide plugin. The plugin would also work + * when Multisite is not enabled. + * + * Checks for "Site Wide Only: true" for backward compatibility. + * + * @since 3.0.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True if plugin is network only, false otherwise. + */ +function is_network_only_plugin( $plugin ) { + $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + if ( $plugin_data ) { + return $plugin_data['Network']; + } + return false; +} + +/** + * Attempts activation of plugin in a "sandbox" and redirects on success. + * + * A plugin that is already activated will not attempt to be activated again. + * + * The way it works is by setting the redirection to the error before trying to + * include the plugin file. If the plugin fails, then the redirection will not + * be overwritten with the success message. Also, the options will not be + * updated and the activation hook will not be called on plugin error. + * + * It should be noted that in no way the below code will actually prevent errors + * within the file. The code should not be used elsewhere to replicate the + * "sandbox", which uses redirection to work. + * {@source 13 1} + * + * If any errors are found or text is outputted, then it will be captured to + * ensure that the success redirection will update the error redirection. + * + * @since 2.5.0 + * @since 5.2.0 Test for WordPress version and PHP version compatibility. + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @param string $redirect Optional. URL to redirect to. + * @param bool $network_wide Optional. Whether to enable the plugin for all sites in the network + * or just the current site. Multisite only. Default false. + * @param bool $silent Optional. Whether to prevent calling activation hooks. Default false. + * @return null|WP_Error Null on success, WP_Error on invalid file. + */ +function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) { + $plugin = plugin_basename( trim( $plugin ) ); + + if ( is_multisite() && ( $network_wide || is_network_only_plugin( $plugin ) ) ) { + $network_wide = true; + $current = get_site_option( 'active_sitewide_plugins', array() ); + $_GET['networkwide'] = 1; // Back compat for plugins looking for this value. + } else { + $current = get_option( 'active_plugins', array() ); + } + + $valid = validate_plugin( $plugin ); + if ( is_wp_error( $valid ) ) { + return $valid; + } + + $requirements = validate_plugin_requirements( $plugin ); + if ( is_wp_error( $requirements ) ) { + return $requirements; + } + + if ( ( $network_wide && ! isset( $current[ $plugin ] ) ) || ( ! $network_wide && ! in_array( $plugin, $current ) ) ) { + if ( ! empty( $redirect ) ) { + // We'll override this later if the plugin can be included without fatal error. + wp_redirect( add_query_arg( '_error_nonce', wp_create_nonce( 'plugin-activation-error_' . $plugin ), $redirect ) ); + } + + ob_start(); + wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin ); + $_wp_plugin_file = $plugin; + if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) { + define( 'WP_SANDBOX_SCRAPING', true ); + } + include_once WP_PLUGIN_DIR . '/' . $plugin; + $plugin = $_wp_plugin_file; // Avoid stomping of the $plugin variable in a plugin. + + if ( ! $silent ) { + /** + * Fires before a plugin is activated. + * + * If a plugin is silently activated (such as during an update), + * this hook does not fire. + * + * @since 2.9.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @param bool $network_wide Whether to enable the plugin for all sites in the network + * or just the current site. Multisite only. Default is false. + */ + do_action( 'activate_plugin', $plugin, $network_wide ); + + /** + * Fires as a specific plugin is being activated. + * + * This hook is the "activation" hook used internally by register_activation_hook(). + * The dynamic portion of the hook name, `$plugin`, refers to the plugin basename. + * + * If a plugin is silently activated (such as during an update), this hook does not fire. + * + * @since 2.0.0 + * + * @param bool $network_wide Whether to enable the plugin for all sites in the network + * or just the current site. Multisite only. Default is false. + */ + do_action( "activate_{$plugin}", $network_wide ); + } + + if ( $network_wide ) { + $current = get_site_option( 'active_sitewide_plugins', array() ); + $current[ $plugin ] = time(); + update_site_option( 'active_sitewide_plugins', $current ); + } else { + $current = get_option( 'active_plugins', array() ); + $current[] = $plugin; + sort( $current ); + update_option( 'active_plugins', $current ); + } + + if ( ! $silent ) { + /** + * Fires after a plugin has been activated. + * + * If a plugin is silently activated (such as during an update), + * this hook does not fire. + * + * @since 2.9.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @param bool $network_wide Whether to enable the plugin for all sites in the network + * or just the current site. Multisite only. Default is false. + */ + do_action( 'activated_plugin', $plugin, $network_wide ); + } + + if ( ob_get_length() > 0 ) { + $output = ob_get_clean(); + return new WP_Error( 'unexpected_output', __( 'The plugin generated unexpected output.' ), $output ); + } + ob_end_clean(); + } + + return null; +} + +/** + * Deactivate a single plugin or multiple plugins. + * + * The deactivation hook is disabled by the plugin upgrader by using the $silent + * parameter. + * + * @since 2.5.0 + * + * @param string|string[] $plugins Single plugin or list of plugins to deactivate. + * @param bool $silent Prevent calling deactivation hooks. Default false. + * @param bool|null $network_wide Whether to deactivate the plugin for all sites in the network. + * A value of null will deactivate plugins for both the network + * and the current site. Multisite only. Default null. + */ +function deactivate_plugins( $plugins, $silent = false, $network_wide = null ) { + if ( is_multisite() ) { + $network_current = get_site_option( 'active_sitewide_plugins', array() ); + } + $current = get_option( 'active_plugins', array() ); + $do_blog = false; + $do_network = false; + + foreach ( (array) $plugins as $plugin ) { + $plugin = plugin_basename( trim( $plugin ) ); + if ( ! is_plugin_active( $plugin ) ) { + continue; + } + + $network_deactivating = false !== $network_wide && is_plugin_active_for_network( $plugin ); + + if ( ! $silent ) { + /** + * Fires before a plugin is deactivated. + * + * If a plugin is silently deactivated (such as during an update), + * this hook does not fire. + * + * @since 2.9.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @param bool $network_deactivating Whether the plugin is deactivated for all sites in the network + * or just the current site. Multisite only. Default false. + */ + do_action( 'deactivate_plugin', $plugin, $network_deactivating ); + } + + if ( false !== $network_wide ) { + if ( is_plugin_active_for_network( $plugin ) ) { + $do_network = true; + unset( $network_current[ $plugin ] ); + } elseif ( $network_wide ) { + continue; + } + } + + if ( true !== $network_wide ) { + $key = array_search( $plugin, $current ); + if ( false !== $key ) { + $do_blog = true; + unset( $current[ $key ] ); + } + } + + if ( $do_blog && wp_is_recovery_mode() ) { + list( $extension ) = explode( '/', $plugin ); + wp_paused_plugins()->delete( $extension ); + } + + if ( ! $silent ) { + /** + * Fires as a specific plugin is being deactivated. + * + * This hook is the "deactivation" hook used internally by register_deactivation_hook(). + * The dynamic portion of the hook name, `$plugin`, refers to the plugin basename. + * + * If a plugin is silently deactivated (such as during an update), this hook does not fire. + * + * @since 2.0.0 + * + * @param bool $network_deactivating Whether the plugin is deactivated for all sites in the network + * or just the current site. Multisite only. Default false. + */ + do_action( "deactivate_{$plugin}", $network_deactivating ); + + /** + * Fires after a plugin is deactivated. + * + * If a plugin is silently deactivated (such as during an update), + * this hook does not fire. + * + * @since 2.9.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @param bool $network_deactivating Whether the plugin is deactivated for all sites in the network + * or just the current site. Multisite only. Default false. + */ + do_action( 'deactivated_plugin', $plugin, $network_deactivating ); + } + } + + if ( $do_blog ) { + update_option( 'active_plugins', $current ); + } + if ( $do_network ) { + update_site_option( 'active_sitewide_plugins', $network_current ); + } +} + +/** + * Activate multiple plugins. + * + * When WP_Error is returned, it does not mean that one of the plugins had + * errors. It means that one or more of the plugin file paths were invalid. + * + * The execution will be halted as soon as one of the plugins has an error. + * + * @since 2.6.0 + * + * @param string|string[] $plugins Single plugin or list of plugins to activate. + * @param string $redirect Redirect to page after successful activation. + * @param bool $network_wide Whether to enable the plugin for all sites in the network. + * Default false. + * @param bool $silent Prevent calling activation hooks. Default false. + * @return bool|WP_Error True when finished or WP_Error if there were errors during a plugin activation. + */ +function activate_plugins( $plugins, $redirect = '', $network_wide = false, $silent = false ) { + if ( ! is_array( $plugins ) ) { + $plugins = array( $plugins ); + } + + $errors = array(); + foreach ( $plugins as $plugin ) { + if ( ! empty( $redirect ) ) { + $redirect = add_query_arg( 'plugin', $plugin, $redirect ); + } + $result = activate_plugin( $plugin, $redirect, $network_wide, $silent ); + if ( is_wp_error( $result ) ) { + $errors[ $plugin ] = $result; + } + } + + if ( ! empty( $errors ) ) { + return new WP_Error( 'plugins_invalid', __( 'One of the plugins is invalid.' ), $errors ); + } + + return true; +} + +/** + * Remove directory and files of a plugin for a list of plugins. + * + * @since 2.6.0 + * + * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. + * + * @param string[] $plugins List of plugin paths to delete, relative to the plugins directory. + * @param string $deprecated Not used. + * @return bool|null|WP_Error True on success, false if `$plugins` is empty, `WP_Error` on failure. + * `null` if filesystem credentials are required to proceed. + */ +function delete_plugins( $plugins, $deprecated = '' ) { + global $wp_filesystem; + + if ( empty( $plugins ) ) { + return false; + } + + $checked = array(); + foreach ( $plugins as $plugin ) { + $checked[] = 'checked[]=' . $plugin; + } + + $url = wp_nonce_url( 'plugins.php?action=delete-selected&verify-delete=1&' . implode( '&', $checked ), 'bulk-plugins' ); + + ob_start(); + $credentials = request_filesystem_credentials( $url ); + $data = ob_get_clean(); + + if ( false === $credentials ) { + if ( ! empty( $data ) ) { + require_once ABSPATH . 'wp-admin/admin-header.php'; + echo $data; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + exit; + } + return; + } + + if ( ! WP_Filesystem( $credentials ) ) { + ob_start(); + // Failed to connect. Error and request again. + request_filesystem_credentials( $url, '', true ); + $data = ob_get_clean(); + + if ( ! empty( $data ) ) { + require_once ABSPATH . 'wp-admin/admin-header.php'; + echo $data; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + exit; + } + return; + } + + if ( ! is_object( $wp_filesystem ) ) { + return new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) ); + } + + if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->has_errors() ) { + return new WP_Error( 'fs_error', __( 'Filesystem error.' ), $wp_filesystem->errors ); + } + + // Get the base plugin folder. + $plugins_dir = $wp_filesystem->wp_plugins_dir(); + if ( empty( $plugins_dir ) ) { + return new WP_Error( 'fs_no_plugins_dir', __( 'Unable to locate WordPress plugin directory.' ) ); + } + + $plugins_dir = trailingslashit( $plugins_dir ); + + $plugin_translations = wp_get_installed_translations( 'plugins' ); + + $errors = array(); + + foreach ( $plugins as $plugin_file ) { + // Run Uninstall hook. + if ( is_uninstallable_plugin( $plugin_file ) ) { + uninstall_plugin( $plugin_file ); + } + + /** + * Fires immediately before a plugin deletion attempt. + * + * @since 4.4.0 + * + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + */ + do_action( 'delete_plugin', $plugin_file ); + + $this_plugin_dir = trailingslashit( dirname( $plugins_dir . $plugin_file ) ); + + // If plugin is in its own directory, recursively delete the directory. + // Base check on if plugin includes directory separator AND that it's not the root plugin folder. + if ( strpos( $plugin_file, '/' ) && $this_plugin_dir != $plugins_dir ) { + $deleted = $wp_filesystem->delete( $this_plugin_dir, true ); + } else { + $deleted = $wp_filesystem->delete( $plugins_dir . $plugin_file ); + } + + /** + * Fires immediately after a plugin deletion attempt. + * + * @since 4.4.0 + * + * @param string $plugin_file Path to the plugin file relative to the plugins directory. + * @param bool $deleted Whether the plugin deletion was successful. + */ + do_action( 'deleted_plugin', $plugin_file, $deleted ); + + if ( ! $deleted ) { + $errors[] = $plugin_file; + continue; + } + + // Remove language files, silently. + $plugin_slug = dirname( $plugin_file ); + if ( '.' !== $plugin_slug && ! empty( $plugin_translations[ $plugin_slug ] ) ) { + $translations = $plugin_translations[ $plugin_slug ]; + + foreach ( $translations as $translation => $data ) { + $wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.po' ); + $wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.mo' ); + + $json_translation_files = glob( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '-*.json' ); + if ( $json_translation_files ) { + array_map( array( $wp_filesystem, 'delete' ), $json_translation_files ); + } + } + } + } + + // Remove deleted plugins from the plugin updates list. + $current = get_site_transient( 'update_plugins' ); + if ( $current ) { + // Don't remove the plugins that weren't deleted. + $deleted = array_diff( $plugins, $errors ); + + foreach ( $deleted as $plugin_file ) { + unset( $current->response[ $plugin_file ] ); + } + + set_site_transient( 'update_plugins', $current ); + } + + if ( ! empty( $errors ) ) { + if ( 1 === count( $errors ) ) { + /* translators: %s: Plugin filename. */ + $message = __( 'Could not fully remove the plugin %s.' ); + } else { + /* translators: %s: Comma-separated list of plugin filenames. */ + $message = __( 'Could not fully remove the plugins %s.' ); + } + + return new WP_Error( 'could_not_remove_plugin', sprintf( $message, implode( ', ', $errors ) ) ); + } + + return true; +} + +/** + * Validate active plugins + * + * Validate all active plugins, deactivates invalid and + * returns an array of deactivated ones. + * + * @since 2.5.0 + * @return WP_Error[] Array of plugin errors keyed by plugin file name. + */ +function validate_active_plugins() { + $plugins = get_option( 'active_plugins', array() ); + // Validate vartype: array. + if ( ! is_array( $plugins ) ) { + update_option( 'active_plugins', array() ); + $plugins = array(); + } + + if ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) { + $network_plugins = (array) get_site_option( 'active_sitewide_plugins', array() ); + $plugins = array_merge( $plugins, array_keys( $network_plugins ) ); + } + + if ( empty( $plugins ) ) { + return array(); + } + + $invalid = array(); + + // Invalid plugins get deactivated. + foreach ( $plugins as $plugin ) { + $result = validate_plugin( $plugin ); + if ( is_wp_error( $result ) ) { + $invalid[ $plugin ] = $result; + deactivate_plugins( $plugin, true ); + } + } + return $invalid; +} + +/** + * Validate the plugin path. + * + * Checks that the main plugin file exists and is a valid plugin. See validate_file(). + * + * @since 2.5.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return int|WP_Error 0 on success, WP_Error on failure. + */ +function validate_plugin( $plugin ) { + if ( validate_file( $plugin ) ) { + return new WP_Error( 'plugin_invalid', __( 'Invalid plugin path.' ) ); + } + if ( ! file_exists( WP_PLUGIN_DIR . '/' . $plugin ) ) { + return new WP_Error( 'plugin_not_found', __( 'Plugin file does not exist.' ) ); + } + + $installed_plugins = get_plugins(); + if ( ! isset( $installed_plugins[ $plugin ] ) ) { + return new WP_Error( 'no_plugin_header', __( 'The plugin does not have a valid header.' ) ); + } + return 0; +} + +/** + * Validate the plugin requirements for WP version and PHP version. + * + * @since 5.2.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return true|WP_Error True if requirements are met, WP_Error on failure. + */ +function validate_plugin_requirements( $plugin ) { + $readme_file = WP_PLUGIN_DIR . '/' . dirname( $plugin ) . '/readme.txt'; + $plugin_data = array( + 'requires' => '', + 'requires_php' => '', + ); + + if ( file_exists( $readme_file ) ) { + $plugin_data = get_file_data( + $readme_file, + array( + 'requires' => 'Requires at least', + 'requires_php' => 'Requires PHP', + ), + 'plugin' + ); + } + + $plugin_data = array_merge( $plugin_data, get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ) ); + + // Check for headers in the plugin's PHP file, give precedence to the plugin headers. + $plugin_data['requires'] = ! empty( $plugin_data['RequiresWP'] ) ? $plugin_data['RequiresWP'] : $plugin_data['requires']; + $plugin_data['requires_php'] = ! empty( $plugin_data['RequiresPHP'] ) ? $plugin_data['RequiresPHP'] : $plugin_data['requires_php']; + + $plugin_data['wp_compatible'] = is_wp_version_compatible( $plugin_data['requires'] ); + $plugin_data['php_compatible'] = is_php_version_compatible( $plugin_data['requires_php'] ); + + if ( ! $plugin_data['wp_compatible'] && ! $plugin_data['php_compatible'] ) { + return new WP_Error( + 'plugin_wp_php_incompatible', + sprintf( + /* translators: %s: Plugin name. */ + __( 'Error: Current WordPress and PHP versions do not meet minimum requirements for %s.' ), + $plugin_data['Name'] + ) + ); + } elseif ( ! $plugin_data['php_compatible'] ) { + return new WP_Error( + 'plugin_php_incompatible', + sprintf( + /* translators: %s: Plugin name. */ + __( 'Error: Current PHP version does not meet minimum requirements for %s.' ), + $plugin_data['Name'] + ) + ); + } elseif ( ! $plugin_data['wp_compatible'] ) { + return new WP_Error( + 'plugin_wp_incompatible', + sprintf( + /* translators: %s: Plugin name. */ + __( 'Error: Current WordPress version does not meet minimum requirements for %s.' ), + $plugin_data['Name'] + ) + ); + } + + return true; +} + +/** + * Whether the plugin can be uninstalled. + * + * @since 2.7.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool Whether plugin can be uninstalled. + */ +function is_uninstallable_plugin( $plugin ) { + $file = plugin_basename( $plugin ); + + $uninstallable_plugins = (array) get_option( 'uninstall_plugins' ); + if ( isset( $uninstallable_plugins[ $file ] ) || file_exists( WP_PLUGIN_DIR . '/' . dirname( $file ) . '/uninstall.php' ) ) { + return true; + } + + return false; +} + +/** + * Uninstall a single plugin. + * + * Calls the uninstall hook, if it is available. + * + * @since 2.7.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return true True if a plugin's uninstall.php file has been found and included. + */ +function uninstall_plugin( $plugin ) { + $file = plugin_basename( $plugin ); + + $uninstallable_plugins = (array) get_option( 'uninstall_plugins' ); + + /** + * Fires in uninstall_plugin() immediately before the plugin is uninstalled. + * + * @since 4.5.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @param array $uninstallable_plugins Uninstallable plugins. + */ + do_action( 'pre_uninstall_plugin', $plugin, $uninstallable_plugins ); + + if ( file_exists( WP_PLUGIN_DIR . '/' . dirname( $file ) . '/uninstall.php' ) ) { + if ( isset( $uninstallable_plugins[ $file ] ) ) { + unset( $uninstallable_plugins[ $file ] ); + update_option( 'uninstall_plugins', $uninstallable_plugins ); + } + unset( $uninstallable_plugins ); + + define( 'WP_UNINSTALL_PLUGIN', $file ); + wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $file ); + include WP_PLUGIN_DIR . '/' . dirname( $file ) . '/uninstall.php'; + + return true; + } + + if ( isset( $uninstallable_plugins[ $file ] ) ) { + $callable = $uninstallable_plugins[ $file ]; + unset( $uninstallable_plugins[ $file ] ); + update_option( 'uninstall_plugins', $uninstallable_plugins ); + unset( $uninstallable_plugins ); + + wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $file ); + include WP_PLUGIN_DIR . '/' . $file; + + add_action( "uninstall_{$file}", $callable ); + + /** + * Fires in uninstall_plugin() once the plugin has been uninstalled. + * + * The action concatenates the 'uninstall_' prefix with the basename of the + * plugin passed to uninstall_plugin() to create a dynamically-named action. + * + * @since 2.7.0 + */ + do_action( "uninstall_{$file}" ); + } +} + +// +// Menu. +// + +/** + * Add a top-level menu page. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 1.5.0 + * + * @global array $menu + * @global array $admin_page_hooks + * @global array $_registered_pages + * @global array $_parent_pages + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by. Should be unique for this menu page and only + * include lowercase alphanumeric, dashes, and underscores characters to be compatible + * with sanitize_key(). + * @param callable $function The function to be called to output the content for this page. + * @param string $icon_url The URL to the icon to be used for this menu. + * * Pass a base64-encoded SVG using a data URI, which will be colored to match + * the color scheme. This should begin with 'data:image/svg+xml;base64,'. + * * Pass the name of a Dashicons helper class to use a font icon, + * e.g. 'dashicons-chart-pie'. + * * Pass 'none' to leave div.wp-menu-image empty so an icon can be added via CSS. + * @param int $position The position in the menu order this item should appear. + * @return string The resulting page's hook_suffix. + */ +function add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '', $position = null ) { + global $menu, $admin_page_hooks, $_registered_pages, $_parent_pages; + + $menu_slug = plugin_basename( $menu_slug ); + + $admin_page_hooks[ $menu_slug ] = sanitize_title( $menu_title ); + + $hookname = get_plugin_page_hookname( $menu_slug, '' ); + + if ( ! empty( $function ) && ! empty( $hookname ) && current_user_can( $capability ) ) { + add_action( $hookname, $function ); + } + + if ( empty( $icon_url ) ) { + $icon_url = 'dashicons-admin-generic'; + $icon_class = 'menu-icon-generic '; + } else { + $icon_url = set_url_scheme( $icon_url ); + $icon_class = ''; + } + + $new_menu = array( $menu_title, $capability, $menu_slug, $page_title, 'menu-top ' . $icon_class . $hookname, $hookname, $icon_url ); + + if ( null === $position ) { + $menu[] = $new_menu; + } elseif ( isset( $menu[ "$position" ] ) ) { + $position = $position + substr( base_convert( md5( $menu_slug . $menu_title ), 16, 10 ), -5 ) * 0.00001; + $menu[ "$position" ] = $new_menu; + } else { + $menu[ $position ] = $new_menu; + } + + $_registered_pages[ $hookname ] = true; + + // No parent as top level. + $_parent_pages[ $menu_slug ] = false; + + return $hookname; +} + +/** + * Add a submenu page. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 1.5.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @global array $submenu + * @global array $menu + * @global array $_wp_real_parent_file + * @global bool $_wp_submenu_nopriv + * @global array $_registered_pages + * @global array $_parent_pages + * + * @param string $parent_slug The slug name for the parent menu (or the file name of a standard + * WordPress admin page). + * @param string $page_title The text to be displayed in the title tags of the page when the menu + * is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by. Should be unique for this menu + * and only include lowercase alphanumeric, dashes, and underscores characters + * to be compatible with sanitize_key(). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + global $submenu, $menu, $_wp_real_parent_file, $_wp_submenu_nopriv, + $_registered_pages, $_parent_pages; + + $menu_slug = plugin_basename( $menu_slug ); + $parent_slug = plugin_basename( $parent_slug ); + + if ( isset( $_wp_real_parent_file[ $parent_slug ] ) ) { + $parent_slug = $_wp_real_parent_file[ $parent_slug ]; + } + + if ( ! current_user_can( $capability ) ) { + $_wp_submenu_nopriv[ $parent_slug ][ $menu_slug ] = true; + return false; + } + + /* + * If the parent doesn't already have a submenu, add a link to the parent + * as the first item in the submenu. If the submenu file is the same as the + * parent file someone is trying to link back to the parent manually. In + * this case, don't automatically add a link back to avoid duplication. + */ + if ( ! isset( $submenu[ $parent_slug ] ) && $menu_slug != $parent_slug ) { + foreach ( (array) $menu as $parent_menu ) { + if ( $parent_menu[2] == $parent_slug && current_user_can( $parent_menu[1] ) ) { + $submenu[ $parent_slug ][] = array_slice( $parent_menu, 0, 4 ); + } + } + } + + $new_sub_menu = array( $menu_title, $capability, $menu_slug, $page_title ); + if ( ! is_int( $position ) ) { + if ( null !== $position ) { + _doing_it_wrong( + __FUNCTION__, + sprintf( + /* translators: %s: add_submenu_page() */ + __( 'The seventh parameter passed to %s should be an integer representing menu position.' ), + 'add_submenu_page()' + ), + '5.3.0' + ); + } + + $submenu[ $parent_slug ][] = $new_sub_menu; + } else { + // Append the submenu if the parent item is not present in the submenu, + // or if position is equal or higher than the number of items in the array. + if ( ! isset( $submenu[ $parent_slug ] ) || $position >= count( $submenu[ $parent_slug ] ) ) { + $submenu[ $parent_slug ][] = $new_sub_menu; + } else { + // Test for a negative position. + $position = max( $position, 0 ); + if ( 0 === $position ) { + // For negative or `0` positions, prepend the submenu. + array_unshift( $submenu[ $parent_slug ], $new_sub_menu ); + } else { + // Grab all of the items before the insertion point. + $before_items = array_slice( $submenu[ $parent_slug ], 0, $position, true ); + // Grab all of the items after the insertion point. + $after_items = array_slice( $submenu[ $parent_slug ], $position, null, true ); + // Add the new item. + $before_items[] = $new_sub_menu; + // Merge the items. + $submenu[ $parent_slug ] = array_merge( $before_items, $after_items ); + } + } + } + // Sort the parent array. + ksort( $submenu[ $parent_slug ] ); + + $hookname = get_plugin_page_hookname( $menu_slug, $parent_slug ); + if ( ! empty( $function ) && ! empty( $hookname ) ) { + add_action( $hookname, $function ); + } + + $_registered_pages[ $hookname ] = true; + + /* + * Backward-compatibility for plugins using add_management_page(). + * See wp-admin/admin.php for redirect from edit.php to tools.php. + */ + if ( 'tools.php' == $parent_slug ) { + $_registered_pages[ get_plugin_page_hookname( $menu_slug, 'edit.php' ) ] = true; + } + + // No parent as top level. + $_parent_pages[ $menu_slug ] = $parent_slug; + + return $hookname; +} + +/** + * Add submenu page to the Tools main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 1.5.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'tools.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Settings main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 1.5.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'options-general.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Appearance main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.0.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'themes.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Plugins main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 3.0.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'plugins.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Users/Profile main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.1.3 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_users_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + if ( current_user_can( 'edit_users' ) ) { + $parent = 'users.php'; + } else { + $parent = 'profile.php'; + } + return add_submenu_page( $parent, $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Dashboard main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.7.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'index.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Posts main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.7.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'edit.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Media main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.7.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_media_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'upload.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Links main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.7.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_links_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'link-manager.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Pages main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.7.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'edit.php?post_type=page', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Add submenu page to the Comments main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @since 2.7.0 + * @since 5.3.0 Added the `$position` parameter. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable $function The function to be called to output the content for this page. + * @param int $position The position in the menu order this item should appear. + * @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { + return add_submenu_page( 'edit-comments.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); +} + +/** + * Remove a top-level admin menu. + * + * @since 3.1.0 + * + * @global array $menu + * + * @param string $menu_slug The slug of the menu. + * @return array|bool The removed menu on success, false if not found. + */ +function remove_menu_page( $menu_slug ) { + global $menu; + + foreach ( $menu as $i => $item ) { + if ( $menu_slug == $item[2] ) { + unset( $menu[ $i ] ); + return $item; + } + } + + return false; +} + +/** + * Remove an admin submenu. + * + * @since 3.1.0 + * + * @global array $submenu + * + * @param string $menu_slug The slug for the parent menu. + * @param string $submenu_slug The slug of the submenu. + * @return array|bool The removed submenu on success, false if not found. + */ +function remove_submenu_page( $menu_slug, $submenu_slug ) { + global $submenu; + + if ( ! isset( $submenu[ $menu_slug ] ) ) { + return false; + } + + foreach ( $submenu[ $menu_slug ] as $i => $item ) { + if ( $submenu_slug == $item[2] ) { + unset( $submenu[ $menu_slug ][ $i ] ); + return $item; + } + } + + return false; +} + +/** + * Get the URL to access a particular menu page based on the slug it was registered with. + * + * If the slug hasn't been registered properly, no URL will be returned. + * + * @since 3.0.0 + * + * @global array $_parent_pages + * + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param bool $echo Whether or not to echo the URL. Default true. + * @return string The menu page URL. + */ +function menu_page_url( $menu_slug, $echo = true ) { + global $_parent_pages; + + if ( isset( $_parent_pages[ $menu_slug ] ) ) { + $parent_slug = $_parent_pages[ $menu_slug ]; + if ( $parent_slug && ! isset( $_parent_pages[ $parent_slug ] ) ) { + $url = admin_url( add_query_arg( 'page', $menu_slug, $parent_slug ) ); + } else { + $url = admin_url( 'admin.php?page=' . $menu_slug ); + } + } else { + $url = ''; + } + + $url = esc_url( $url ); + + if ( $echo ) { + echo $url; + } + + return $url; +} + +// +// Pluggable Menu Support -- Private. +// +/** + * Gets the parent file of the current admin page. + * + * @since 1.5.0 + * + * @global string $parent_file + * @global array $menu + * @global array $submenu + * @global string $pagenow + * @global string $typenow + * @global string $plugin_page + * @global array $_wp_real_parent_file + * @global array $_wp_menu_nopriv + * @global array $_wp_submenu_nopriv + * + * @return string The parent file of the current admin page. + */ +function get_admin_page_parent( $parent = '' ) { + global $parent_file, $menu, $submenu, $pagenow, $typenow, + $plugin_page, $_wp_real_parent_file, $_wp_menu_nopriv, $_wp_submenu_nopriv; + + if ( ! empty( $parent ) && 'admin.php' != $parent ) { + if ( isset( $_wp_real_parent_file[ $parent ] ) ) { + $parent = $_wp_real_parent_file[ $parent ]; + } + return $parent; + } + + if ( 'admin.php' === $pagenow && isset( $plugin_page ) ) { + foreach ( (array) $menu as $parent_menu ) { + if ( $parent_menu[2] == $plugin_page ) { + $parent_file = $plugin_page; + if ( isset( $_wp_real_parent_file[ $parent_file ] ) ) { + $parent_file = $_wp_real_parent_file[ $parent_file ]; + } + return $parent_file; + } + } + if ( isset( $_wp_menu_nopriv[ $plugin_page ] ) ) { + $parent_file = $plugin_page; + if ( isset( $_wp_real_parent_file[ $parent_file ] ) ) { + $parent_file = $_wp_real_parent_file[ $parent_file ]; + } + return $parent_file; + } + } + + if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $pagenow ][ $plugin_page ] ) ) { + $parent_file = $pagenow; + if ( isset( $_wp_real_parent_file[ $parent_file ] ) ) { + $parent_file = $_wp_real_parent_file[ $parent_file ]; + } + return $parent_file; + } + + foreach ( array_keys( (array) $submenu ) as $parent ) { + foreach ( $submenu[ $parent ] as $submenu_array ) { + if ( isset( $_wp_real_parent_file[ $parent ] ) ) { + $parent = $_wp_real_parent_file[ $parent ]; + } + if ( ! empty( $typenow ) && ( "$pagenow?post_type=$typenow" === $submenu_array[2] ) ) { + $parent_file = $parent; + return $parent; + } elseif ( $submenu_array[2] == $pagenow && empty( $typenow ) && ( empty( $parent_file ) || false === strpos( $parent_file, '?' ) ) ) { + $parent_file = $parent; + return $parent; + } elseif ( isset( $plugin_page ) && ( $plugin_page == $submenu_array[2] ) ) { + $parent_file = $parent; + return $parent; + } + } + } + + if ( empty( $parent_file ) ) { + $parent_file = ''; + } + return ''; +} + +/** + * Gets the title of the current admin page. + * + * @since 1.5.0 + * + * @global string $title + * @global array $menu + * @global array $submenu + * @global string $pagenow + * @global string $plugin_page + * @global string $typenow + * + * @return string The title of the current admin page. + */ +function get_admin_page_title() { + global $title, $menu, $submenu, $pagenow, $plugin_page, $typenow; + + if ( ! empty( $title ) ) { + return $title; + } + + $hook = get_plugin_page_hook( $plugin_page, $pagenow ); + + $parent = get_admin_page_parent(); + $parent1 = $parent; + + if ( empty( $parent ) ) { + foreach ( (array) $menu as $menu_array ) { + if ( isset( $menu_array[3] ) ) { + if ( $menu_array[2] == $pagenow ) { + $title = $menu_array[3]; + return $menu_array[3]; + } elseif ( isset( $plugin_page ) && ( $plugin_page == $menu_array[2] ) && ( $hook == $menu_array[3] ) ) { + $title = $menu_array[3]; + return $menu_array[3]; + } + } else { + $title = $menu_array[0]; + return $title; + } + } + } else { + foreach ( array_keys( $submenu ) as $parent ) { + foreach ( $submenu[ $parent ] as $submenu_array ) { + if ( isset( $plugin_page ) && + ( $plugin_page == $submenu_array[2] ) && + ( + ( $parent == $pagenow ) || + ( $parent == $plugin_page ) || + ( $plugin_page == $hook ) || + ( 'admin.php' === $pagenow && $parent1 != $submenu_array[2] ) || + ( ! empty( $typenow ) && $parent == $pagenow . '?post_type=' . $typenow ) + ) + ) { + $title = $submenu_array[3]; + return $submenu_array[3]; + } + + if ( $submenu_array[2] != $pagenow || isset( $_GET['page'] ) ) { // Not the current page. + continue; + } + + if ( isset( $submenu_array[3] ) ) { + $title = $submenu_array[3]; + return $submenu_array[3]; + } else { + $title = $submenu_array[0]; + return $title; + } + } + } + if ( empty( $title ) ) { + foreach ( $menu as $menu_array ) { + if ( isset( $plugin_page ) && + ( $plugin_page == $menu_array[2] ) && + ( 'admin.php' === $pagenow ) && + ( $parent1 == $menu_array[2] ) ) { + $title = $menu_array[3]; + return $menu_array[3]; + } + } + } + } + + return $title; +} + +/** + * Gets the hook attached to the administrative page of a plugin. + * + * @since 1.5.0 + * + * @param string $plugin_page The slug name of the plugin page. + * @param string $parent_page The slug name for the parent menu (or the file name of a standard + * WordPress admin page). + * @return string|null Hook attached to the plugin page, null otherwise. + */ +function get_plugin_page_hook( $plugin_page, $parent_page ) { + $hook = get_plugin_page_hookname( $plugin_page, $parent_page ); + if ( has_action( $hook ) ) { + return $hook; + } else { + return null; + } +} + +/** + * Gets the hook name for the administrative page of a plugin. + * + * @since 1.5.0 + * + * @global array $admin_page_hooks + * + * @param string $plugin_page The slug name of the plugin page. + * @param string $parent_page The slug name for the parent menu (or the file name of a standard + * WordPress admin page). + * @return string Hook name for the plugin page. + */ +function get_plugin_page_hookname( $plugin_page, $parent_page ) { + global $admin_page_hooks; + + $parent = get_admin_page_parent( $parent_page ); + + $page_type = 'admin'; + if ( empty( $parent_page ) || 'admin.php' == $parent_page || isset( $admin_page_hooks[ $plugin_page ] ) ) { + if ( isset( $admin_page_hooks[ $plugin_page ] ) ) { + $page_type = 'toplevel'; + } elseif ( isset( $admin_page_hooks[ $parent ] ) ) { + $page_type = $admin_page_hooks[ $parent ]; + } + } elseif ( isset( $admin_page_hooks[ $parent ] ) ) { + $page_type = $admin_page_hooks[ $parent ]; + } + + $plugin_name = preg_replace( '!\.php!', '', $plugin_page ); + + return $page_type . '_page_' . $plugin_name; +} + +/** + * Determines whether the current user can access the current admin page. + * + * @since 1.5.0 + * + * @global string $pagenow + * @global array $menu + * @global array $submenu + * @global array $_wp_menu_nopriv + * @global array $_wp_submenu_nopriv + * @global string $plugin_page + * @global array $_registered_pages + * + * @return bool True if the current user can access the admin page, false otherwise. + */ +function user_can_access_admin_page() { + global $pagenow, $menu, $submenu, $_wp_menu_nopriv, $_wp_submenu_nopriv, + $plugin_page, $_registered_pages; + + $parent = get_admin_page_parent(); + + if ( ! isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $parent ][ $pagenow ] ) ) { + return false; + } + + if ( isset( $plugin_page ) ) { + if ( isset( $_wp_submenu_nopriv[ $parent ][ $plugin_page ] ) ) { + return false; + } + + $hookname = get_plugin_page_hookname( $plugin_page, $parent ); + + if ( ! isset( $_registered_pages[ $hookname ] ) ) { + return false; + } + } + + if ( empty( $parent ) ) { + if ( isset( $_wp_menu_nopriv[ $pagenow ] ) ) { + return false; + } + if ( isset( $_wp_submenu_nopriv[ $pagenow ][ $pagenow ] ) ) { + return false; + } + if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $pagenow ][ $plugin_page ] ) ) { + return false; + } + if ( isset( $plugin_page ) && isset( $_wp_menu_nopriv[ $plugin_page ] ) ) { + return false; + } + foreach ( array_keys( $_wp_submenu_nopriv ) as $key ) { + if ( isset( $_wp_submenu_nopriv[ $key ][ $pagenow ] ) ) { + return false; + } + if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $key ][ $plugin_page ] ) ) { + return false; + } + } + return true; + } + + if ( isset( $plugin_page ) && ( $plugin_page == $parent ) && isset( $_wp_menu_nopriv[ $plugin_page ] ) ) { + return false; + } + + if ( isset( $submenu[ $parent ] ) ) { + foreach ( $submenu[ $parent ] as $submenu_array ) { + if ( isset( $plugin_page ) && ( $submenu_array[2] == $plugin_page ) ) { + if ( current_user_can( $submenu_array[1] ) ) { + return true; + } else { + return false; + } + } elseif ( $submenu_array[2] == $pagenow ) { + if ( current_user_can( $submenu_array[1] ) ) { + return true; + } else { + return false; + } + } + } + } + + foreach ( $menu as $menu_array ) { + if ( $menu_array[2] == $parent ) { + if ( current_user_can( $menu_array[1] ) ) { + return true; + } else { + return false; + } + } + } + + return true; +} + +/* Whitelist functions */ + +/** + * Refreshes the value of the options whitelist available via the 'whitelist_options' hook. + * + * See the {@see 'whitelist_options'} filter. + * + * @since 2.7.0 + * + * @global array $new_whitelist_options + * + * @param array $options + * @return array + */ +function option_update_filter( $options ) { + global $new_whitelist_options; + + if ( is_array( $new_whitelist_options ) ) { + $options = add_option_whitelist( $new_whitelist_options, $options ); + } + + return $options; +} + +/** + * Adds an array of options to the options whitelist. + * + * @since 2.7.0 + * + * @global array $whitelist_options + * + * @param array $new_options + * @param string|array $options + * @return array + */ +function add_option_whitelist( $new_options, $options = '' ) { + if ( '' == $options ) { + global $whitelist_options; + } else { + $whitelist_options = $options; + } + + foreach ( $new_options as $page => $keys ) { + foreach ( $keys as $key ) { + if ( ! isset( $whitelist_options[ $page ] ) || ! is_array( $whitelist_options[ $page ] ) ) { + $whitelist_options[ $page ] = array(); + $whitelist_options[ $page ][] = $key; + } else { + $pos = array_search( $key, $whitelist_options[ $page ] ); + if ( false === $pos ) { + $whitelist_options[ $page ][] = $key; + } + } + } + } + + return $whitelist_options; +} + +/** + * Removes a list of options from the options whitelist. + * + * @since 2.7.0 + * + * @global array $whitelist_options + * + * @param array $del_options + * @param string|array $options + * @return array + */ +function remove_option_whitelist( $del_options, $options = '' ) { + if ( '' == $options ) { + global $whitelist_options; + } else { + $whitelist_options = $options; + } + + foreach ( $del_options as $page => $keys ) { + foreach ( $keys as $key ) { + if ( isset( $whitelist_options[ $page ] ) && is_array( $whitelist_options[ $page ] ) ) { + $pos = array_search( $key, $whitelist_options[ $page ] ); + if ( false !== $pos ) { + unset( $whitelist_options[ $page ][ $pos ] ); + } + } + } + } + + return $whitelist_options; +} + +/** + * Output nonce, action, and option_page fields for a settings page. + * + * @since 2.7.0 + * + * @param string $option_group A settings group name. This should match the group name + * used in register_setting(). + */ +function settings_fields( $option_group ) { + echo ""; + echo ''; + wp_nonce_field( "$option_group-options" ); +} + +/** + * Clears the plugins cache used by get_plugins() and by default, the plugin updates cache. + * + * @since 3.7.0 + * + * @param bool $clear_update_cache Whether to clear the plugin updates cache. Default true. + */ +function wp_clean_plugins_cache( $clear_update_cache = true ) { + if ( $clear_update_cache ) { + delete_site_transient( 'update_plugins' ); + } + wp_cache_delete( 'plugins', 'plugins' ); +} + +/** + * Load a given plugin attempt to generate errors. + * + * @since 3.0.0 + * @since 4.4.0 Function was moved into the `wp-admin/includes/plugin.php` file. + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + */ +function plugin_sandbox_scrape( $plugin ) { + if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) { + define( 'WP_SANDBOX_SCRAPING', true ); + } + wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin ); + include WP_PLUGIN_DIR . '/' . $plugin; +} + +/** + * Helper function for adding content to the Privacy Policy Guide. + * + * Plugins and themes should suggest text for inclusion in the site's privacy policy. + * The suggested text should contain information about any functionality that affects user privacy, + * and will be shown on the Privacy Policy Guide screen. + * + * A plugin or theme can use this function multiple times as long as it will help to better present + * the suggested policy content. For example modular plugins such as WooCommerse or Jetpack + * can add or remove suggested content depending on the modules/extensions that are enabled. + * For more information see the Plugin Handbook: + * https://developer.wordpress.org/plugins/privacy/suggesting-text-for-the-site-privacy-policy/. + * + * The HTML contents of the `$policy_text` supports use of a specialized `.privacy-policy-tutorial` + * CSS class which can be used to provide supplemental information. Any content contained within + * HTML elements that have the `.privacy-policy-tutorial` CSS class applied will be omitted + * from the clipboard when the section content is copied. + * + * Intended for use with the `'admin_init'` action. + * + * @since 4.9.6 + * + * @param string $plugin_name The name of the plugin or theme that is suggesting content + * for the site's privacy policy. + * @param string $policy_text The suggested content for inclusion in the policy. + */ +function wp_add_privacy_policy_content( $plugin_name, $policy_text ) { + if ( ! is_admin() ) { + _doing_it_wrong( + __FUNCTION__, + sprintf( + /* translators: %s: admin_init */ + __( 'The suggested privacy policy content should be added only in wp-admin by using the %s (or later) action.' ), + 'admin_init' + ), + '4.9.7' + ); + return; + } elseif ( ! doing_action( 'admin_init' ) && ! did_action( 'admin_init' ) ) { + _doing_it_wrong( + __FUNCTION__, + sprintf( + /* translators: %s: admin_init */ + __( 'The suggested privacy policy content should be added by using the %s (or later) action. Please see the inline documentation.' ), + 'admin_init' + ), + '4.9.7' + ); + return; + } + + if ( ! class_exists( 'WP_Privacy_Policy_Content' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-policy-content.php'; + } + + WP_Privacy_Policy_Content::add( $plugin_name, $policy_text ); +} + +/** + * Determines whether a plugin is technically active but was paused while + * loading. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 5.2.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return bool True, if in the list of paused plugins. False, if not in the list. + */ +function is_plugin_paused( $plugin ) { + if ( ! isset( $GLOBALS['_paused_plugins'] ) ) { + return false; + } + + if ( ! is_plugin_active( $plugin ) ) { + return false; + } + + list( $plugin ) = explode( '/', $plugin ); + + return array_key_exists( $plugin, $GLOBALS['_paused_plugins'] ); +} + +/** + * Gets the error that was recorded for a paused plugin. + * + * @since 5.2.0 + * + * @param string $plugin Path to the plugin file relative to the plugins directory. + * @return array|false Array of error information as returned by `error_get_last()`, + * or false if none was recorded. + */ +function wp_get_plugin_error( $plugin ) { + if ( ! isset( $GLOBALS['_paused_plugins'] ) ) { + return false; + } + + list( $plugin ) = explode( '/', $plugin ); + + if ( ! array_key_exists( $plugin, $GLOBALS['_paused_plugins'] ) ) { + return false; + } + + return $GLOBALS['_paused_plugins'][ $plugin ]; +} + +/** + * Tries to resume a single plugin. + * + * If a redirect was provided, we first ensure the plugin does not throw fatal + * errors anymore. + * + * The way it works is by setting the redirection to the error before trying to + * include the plugin file. If the plugin fails, then the redirection will not + * be overwritten with the success message and the plugin will not be resumed. + * + * @since 5.2.0 + * + * @param string $plugin Single plugin to resume. + * @param string $redirect Optional. URL to redirect to. Default empty string. + * @return bool|WP_Error True on success, false if `$plugin` was not paused, + * `WP_Error` on failure. + */ +function resume_plugin( $plugin, $redirect = '' ) { + /* + * We'll override this later if the plugin could be resumed without + * creating a fatal error. + */ + if ( ! empty( $redirect ) ) { + wp_redirect( + add_query_arg( + '_error_nonce', + wp_create_nonce( 'plugin-resume-error_' . $plugin ), + $redirect + ) + ); + + // Load the plugin to test whether it throws a fatal error. + ob_start(); + plugin_sandbox_scrape( $plugin ); + ob_clean(); + } + + list( $extension ) = explode( '/', $plugin ); + + $result = wp_paused_plugins()->delete( $extension ); + + if ( ! $result ) { + return new WP_Error( + 'could_not_resume_plugin', + __( 'Could not resume the plugin.' ) + ); + } + + return true; +} + +/** + * Renders an admin notice in case some plugins have been paused due to errors. + * + * @since 5.2.0 + */ +function paused_plugins_notice() { + if ( 'plugins.php' === $GLOBALS['pagenow'] ) { + return; + } + + if ( ! current_user_can( 'resume_plugins' ) ) { + return; + } + + if ( ! isset( $GLOBALS['_paused_plugins'] ) || empty( $GLOBALS['_paused_plugins'] ) ) { + return; + } + + printf( + '

        %s
        %s

        %s

        ', + __( 'One or more plugins failed to load properly.' ), + __( 'You can find more details and make changes on the Plugins screen.' ), + esc_url( admin_url( 'plugins.php?plugin_status=paused' ) ), + __( 'Go to the Plugins screen' ) + ); +} diff --git a/wp-admin/includes/post.php b/wp-admin/includes/post.php new file mode 100644 index 0000000..774bd1e --- /dev/null +++ b/wp-admin/includes/post.php @@ -0,0 +1,2444 @@ +cap->create_posts ) ) { + if ( 'page' == $post_data['post_type'] ) { + return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to create pages as this user.' ) ); + } else { + return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to create posts as this user.' ) ); + } + } + + if ( isset( $post_data['content'] ) ) { + $post_data['post_content'] = $post_data['content']; + } + + if ( isset( $post_data['excerpt'] ) ) { + $post_data['post_excerpt'] = $post_data['excerpt']; + } + + if ( isset( $post_data['parent_id'] ) ) { + $post_data['post_parent'] = (int) $post_data['parent_id']; + } + + if ( isset( $post_data['trackback_url'] ) ) { + $post_data['to_ping'] = $post_data['trackback_url']; + } + + $post_data['user_ID'] = get_current_user_id(); + + if ( ! empty( $post_data['post_author_override'] ) ) { + $post_data['post_author'] = (int) $post_data['post_author_override']; + } else { + if ( ! empty( $post_data['post_author'] ) ) { + $post_data['post_author'] = (int) $post_data['post_author']; + } else { + $post_data['post_author'] = (int) $post_data['user_ID']; + } + } + + if ( isset( $post_data['user_ID'] ) && ( $post_data['post_author'] != $post_data['user_ID'] ) + && ! current_user_can( $ptype->cap->edit_others_posts ) ) { + + if ( $update ) { + if ( 'page' == $post_data['post_type'] ) { + return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to edit pages as this user.' ) ); + } else { + return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to edit posts as this user.' ) ); + } + } else { + if ( 'page' == $post_data['post_type'] ) { + return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to create pages as this user.' ) ); + } else { + return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to create posts as this user.' ) ); + } + } + } + + if ( ! empty( $post_data['post_status'] ) ) { + $post_data['post_status'] = sanitize_key( $post_data['post_status'] ); + + // No longer an auto-draft. + if ( 'auto-draft' === $post_data['post_status'] ) { + $post_data['post_status'] = 'draft'; + } + + if ( ! get_post_status_object( $post_data['post_status'] ) ) { + unset( $post_data['post_status'] ); + } + } + + // What to do based on which button they pressed. + if ( isset( $post_data['saveasdraft'] ) && '' != $post_data['saveasdraft'] ) { + $post_data['post_status'] = 'draft'; + } + if ( isset( $post_data['saveasprivate'] ) && '' != $post_data['saveasprivate'] ) { + $post_data['post_status'] = 'private'; + } + if ( isset( $post_data['publish'] ) && ( '' != $post_data['publish'] ) && ( ! isset( $post_data['post_status'] ) || 'private' !== $post_data['post_status'] ) ) { + $post_data['post_status'] = 'publish'; + } + if ( isset( $post_data['advanced'] ) && '' != $post_data['advanced'] ) { + $post_data['post_status'] = 'draft'; + } + if ( isset( $post_data['pending'] ) && '' != $post_data['pending'] ) { + $post_data['post_status'] = 'pending'; + } + + if ( isset( $post_data['ID'] ) ) { + $post_id = $post_data['ID']; + } else { + $post_id = false; + } + $previous_status = $post_id ? get_post_field( 'post_status', $post_id ) : false; + + if ( isset( $post_data['post_status'] ) && 'private' == $post_data['post_status'] && ! current_user_can( $ptype->cap->publish_posts ) ) { + $post_data['post_status'] = $previous_status ? $previous_status : 'pending'; + } + + $published_statuses = array( 'publish', 'future' ); + + // Posts 'submitted for approval' are submitted to $_POST the same as if they were being published. + // Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts. + if ( isset( $post_data['post_status'] ) && ( in_array( $post_data['post_status'], $published_statuses ) && ! current_user_can( $ptype->cap->publish_posts ) ) ) { + if ( ! in_array( $previous_status, $published_statuses ) || ! current_user_can( 'edit_post', $post_id ) ) { + $post_data['post_status'] = 'pending'; + } + } + + if ( ! isset( $post_data['post_status'] ) ) { + $post_data['post_status'] = 'auto-draft' === $previous_status ? 'draft' : $previous_status; + } + + if ( isset( $post_data['post_password'] ) && ! current_user_can( $ptype->cap->publish_posts ) ) { + unset( $post_data['post_password'] ); + } + + if ( ! isset( $post_data['comment_status'] ) ) { + $post_data['comment_status'] = 'closed'; + } + + if ( ! isset( $post_data['ping_status'] ) ) { + $post_data['ping_status'] = 'closed'; + } + + foreach ( array( 'aa', 'mm', 'jj', 'hh', 'mn' ) as $timeunit ) { + if ( ! empty( $post_data[ 'hidden_' . $timeunit ] ) && $post_data[ 'hidden_' . $timeunit ] != $post_data[ $timeunit ] ) { + $post_data['edit_date'] = '1'; + break; + } + } + + if ( ! empty( $post_data['edit_date'] ) ) { + $aa = $post_data['aa']; + $mm = $post_data['mm']; + $jj = $post_data['jj']; + $hh = $post_data['hh']; + $mn = $post_data['mn']; + $ss = $post_data['ss']; + $aa = ( $aa <= 0 ) ? gmdate( 'Y' ) : $aa; + $mm = ( $mm <= 0 ) ? gmdate( 'n' ) : $mm; + $jj = ( $jj > 31 ) ? 31 : $jj; + $jj = ( $jj <= 0 ) ? gmdate( 'j' ) : $jj; + $hh = ( $hh > 23 ) ? $hh - 24 : $hh; + $mn = ( $mn > 59 ) ? $mn - 60 : $mn; + $ss = ( $ss > 59 ) ? $ss - 60 : $ss; + $post_data['post_date'] = sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $aa, $mm, $jj, $hh, $mn, $ss ); + $valid_date = wp_checkdate( $mm, $jj, $aa, $post_data['post_date'] ); + if ( ! $valid_date ) { + return new WP_Error( 'invalid_date', __( 'Invalid date.' ) ); + } + $post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] ); + } + + if ( isset( $post_data['post_category'] ) ) { + $category_object = get_taxonomy( 'category' ); + if ( ! current_user_can( $category_object->cap->assign_terms ) ) { + unset( $post_data['post_category'] ); + } + } + + return $post_data; +} + +/** + * Returns only allowed post data fields + * + * @since 5.0.1 + * + * @param array $post_data Array of post data. Defaults to the contents of $_POST. + * @return array|WP_Error Array of post data on success, WP_Error on failure. + */ +function _wp_get_allowed_postdata( $post_data = null ) { + if ( empty( $post_data ) ) { + $post_data = $_POST; + } + + // Pass through errors. + if ( is_wp_error( $post_data ) ) { + return $post_data; + } + + return array_diff_key( $post_data, array_flip( array( 'meta_input', 'file', 'guid' ) ) ); +} + +/** + * Update an existing post with values provided in $_POST. + * + * @since 1.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $post_data Optional. + * @return int Post ID. + */ +function edit_post( $post_data = null ) { + global $wpdb; + + if ( empty( $post_data ) ) { + $post_data = &$_POST; + } + + // Clear out any data in internal vars. + unset( $post_data['filter'] ); + + $post_ID = (int) $post_data['post_ID']; + $post = get_post( $post_ID ); + $post_data['post_type'] = $post->post_type; + $post_data['post_mime_type'] = $post->post_mime_type; + + if ( ! empty( $post_data['post_status'] ) ) { + $post_data['post_status'] = sanitize_key( $post_data['post_status'] ); + + if ( 'inherit' == $post_data['post_status'] ) { + unset( $post_data['post_status'] ); + } + } + + $ptype = get_post_type_object( $post_data['post_type'] ); + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + if ( 'page' == $post_data['post_type'] ) { + wp_die( __( 'Sorry, you are not allowed to edit this page.' ) ); + } else { + wp_die( __( 'Sorry, you are not allowed to edit this post.' ) ); + } + } + + if ( post_type_supports( $ptype->name, 'revisions' ) ) { + $revisions = wp_get_post_revisions( + $post_ID, + array( + 'order' => 'ASC', + 'posts_per_page' => 1, + ) + ); + $revision = current( $revisions ); + + // Check if the revisions have been upgraded. + if ( $revisions && _wp_get_post_revision_version( $revision ) < 1 ) { + _wp_upgrade_revisions_of_post( $post, wp_get_post_revisions( $post_ID ) ); + } + } + + if ( isset( $post_data['visibility'] ) ) { + switch ( $post_data['visibility'] ) { + case 'public': + $post_data['post_password'] = ''; + break; + case 'password': + unset( $post_data['sticky'] ); + break; + case 'private': + $post_data['post_status'] = 'private'; + $post_data['post_password'] = ''; + unset( $post_data['sticky'] ); + break; + } + } + + $post_data = _wp_translate_postdata( true, $post_data ); + if ( is_wp_error( $post_data ) ) { + wp_die( $post_data->get_error_message() ); + } + $translated = _wp_get_allowed_postdata( $post_data ); + + // Post formats. + if ( isset( $post_data['post_format'] ) ) { + set_post_format( $post_ID, $post_data['post_format'] ); + } + + $format_meta_urls = array( 'url', 'link_url', 'quote_source_url' ); + foreach ( $format_meta_urls as $format_meta_url ) { + $keyed = '_format_' . $format_meta_url; + if ( isset( $post_data[ $keyed ] ) ) { + update_post_meta( $post_ID, $keyed, wp_slash( esc_url_raw( wp_unslash( $post_data[ $keyed ] ) ) ) ); + } + } + + $format_keys = array( 'quote', 'quote_source_name', 'image', 'gallery', 'audio_embed', 'video_embed' ); + + foreach ( $format_keys as $key ) { + $keyed = '_format_' . $key; + if ( isset( $post_data[ $keyed ] ) ) { + if ( current_user_can( 'unfiltered_html' ) ) { + update_post_meta( $post_ID, $keyed, $post_data[ $keyed ] ); + } else { + update_post_meta( $post_ID, $keyed, wp_filter_post_kses( $post_data[ $keyed ] ) ); + } + } + } + + if ( 'attachment' === $post_data['post_type'] && preg_match( '#^(audio|video)/#', $post_data['post_mime_type'] ) ) { + $id3data = wp_get_attachment_metadata( $post_ID ); + if ( ! is_array( $id3data ) ) { + $id3data = array(); + } + + foreach ( wp_get_attachment_id3_keys( $post, 'edit' ) as $key => $label ) { + if ( isset( $post_data[ 'id3_' . $key ] ) ) { + $id3data[ $key ] = sanitize_text_field( wp_unslash( $post_data[ 'id3_' . $key ] ) ); + } + } + wp_update_attachment_metadata( $post_ID, $id3data ); + } + + // Meta stuff. + if ( isset( $post_data['meta'] ) && $post_data['meta'] ) { + foreach ( $post_data['meta'] as $key => $value ) { + $meta = get_post_meta_by_id( $key ); + if ( ! $meta ) { + continue; + } + if ( $meta->post_id != $post_ID ) { + continue; + } + if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $meta->meta_key ) ) { + continue; + } + if ( is_protected_meta( $value['key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $value['key'] ) ) { + continue; + } + update_meta( $key, $value['key'], $value['value'] ); + } + } + + if ( isset( $post_data['deletemeta'] ) && $post_data['deletemeta'] ) { + foreach ( $post_data['deletemeta'] as $key => $value ) { + $meta = get_post_meta_by_id( $key ); + if ( ! $meta ) { + continue; + } + if ( $meta->post_id != $post_ID ) { + continue; + } + if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $post_ID, $meta->meta_key ) ) { + continue; + } + delete_meta( $key ); + } + } + + // Attachment stuff. + if ( 'attachment' == $post_data['post_type'] ) { + if ( isset( $post_data['_wp_attachment_image_alt'] ) ) { + $image_alt = wp_unslash( $post_data['_wp_attachment_image_alt'] ); + + if ( get_post_meta( $post_ID, '_wp_attachment_image_alt', true ) !== $image_alt ) { + $image_alt = wp_strip_all_tags( $image_alt, true ); + + // update_post_meta() expects slashed. + update_post_meta( $post_ID, '_wp_attachment_image_alt', wp_slash( $image_alt ) ); + } + } + + $attachment_data = isset( $post_data['attachments'][ $post_ID ] ) ? $post_data['attachments'][ $post_ID ] : array(); + + /** This filter is documented in wp-admin/includes/media.php */ + $translated = apply_filters( 'attachment_fields_to_save', $translated, $attachment_data ); + } + + // Convert taxonomy input to term IDs, to avoid ambiguity. + if ( isset( $post_data['tax_input'] ) ) { + foreach ( (array) $post_data['tax_input'] as $taxonomy => $terms ) { + $tax_object = get_taxonomy( $taxonomy ); + + if ( $tax_object && isset( $tax_object->meta_box_sanitize_cb ) ) { + $translated['tax_input'][ $taxonomy ] = call_user_func_array( $tax_object->meta_box_sanitize_cb, array( $taxonomy, $terms ) ); + } + } + } + + add_meta( $post_ID ); + + update_post_meta( $post_ID, '_edit_last', get_current_user_id() ); + + $success = wp_update_post( $translated ); + + // If the save failed, see if we can sanity check the main fields and try again. + if ( ! $success && is_callable( array( $wpdb, 'strip_invalid_text_for_column' ) ) ) { + $fields = array( 'post_title', 'post_content', 'post_excerpt' ); + + foreach ( $fields as $field ) { + if ( isset( $translated[ $field ] ) ) { + $translated[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->posts, $field, $translated[ $field ] ); + } + } + + wp_update_post( $translated ); + } + + // Now that we have an ID we can fix any attachment anchor hrefs. + _fix_attachment_links( $post_ID ); + + wp_set_post_lock( $post_ID ); + + if ( current_user_can( $ptype->cap->edit_others_posts ) && current_user_can( $ptype->cap->publish_posts ) ) { + if ( ! empty( $post_data['sticky'] ) ) { + stick_post( $post_ID ); + } else { + unstick_post( $post_ID ); + } + } + + return $post_ID; +} + +/** + * Process the post data for the bulk editing of posts. + * + * Updates all bulk edited posts/pages, adding (but not removing) tags and + * categories. Skips pages when they would be their own parent or child. + * + * @since 2.7.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $post_data Optional, the array of post data to process if not provided will use $_POST superglobal. + * @return array + */ +function bulk_edit_posts( $post_data = null ) { + global $wpdb; + + if ( empty( $post_data ) ) { + $post_data = &$_POST; + } + + if ( isset( $post_data['post_type'] ) ) { + $ptype = get_post_type_object( $post_data['post_type'] ); + } else { + $ptype = get_post_type_object( 'post' ); + } + + if ( ! current_user_can( $ptype->cap->edit_posts ) ) { + if ( 'page' == $ptype->name ) { + wp_die( __( 'Sorry, you are not allowed to edit pages.' ) ); + } else { + wp_die( __( 'Sorry, you are not allowed to edit posts.' ) ); + } + } + + if ( -1 == $post_data['_status'] ) { + $post_data['post_status'] = null; + unset( $post_data['post_status'] ); + } else { + $post_data['post_status'] = $post_data['_status']; + } + unset( $post_data['_status'] ); + + if ( ! empty( $post_data['post_status'] ) ) { + $post_data['post_status'] = sanitize_key( $post_data['post_status'] ); + + if ( 'inherit' == $post_data['post_status'] ) { + unset( $post_data['post_status'] ); + } + } + + $post_IDs = array_map( 'intval', (array) $post_data['post'] ); + + $reset = array( + 'post_author', + 'post_status', + 'post_password', + 'post_parent', + 'page_template', + 'comment_status', + 'ping_status', + 'keep_private', + 'tax_input', + 'post_category', + 'sticky', + 'post_format', + ); + + foreach ( $reset as $field ) { + if ( isset( $post_data[ $field ] ) && ( '' == $post_data[ $field ] || -1 == $post_data[ $field ] ) ) { + unset( $post_data[ $field ] ); + } + } + + if ( isset( $post_data['post_category'] ) ) { + if ( is_array( $post_data['post_category'] ) && ! empty( $post_data['post_category'] ) ) { + $new_cats = array_map( 'absint', $post_data['post_category'] ); + } else { + unset( $post_data['post_category'] ); + } + } + + $tax_input = array(); + if ( isset( $post_data['tax_input'] ) ) { + foreach ( $post_data['tax_input'] as $tax_name => $terms ) { + if ( empty( $terms ) ) { + continue; + } + if ( is_taxonomy_hierarchical( $tax_name ) ) { + $tax_input[ $tax_name ] = array_map( 'absint', $terms ); + } else { + $comma = _x( ',', 'tag delimiter' ); + if ( ',' !== $comma ) { + $terms = str_replace( $comma, ',', $terms ); + } + $tax_input[ $tax_name ] = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) ); + } + } + } + + if ( isset( $post_data['post_parent'] ) && (int) $post_data['post_parent'] ) { + $parent = (int) $post_data['post_parent']; + $pages = $wpdb->get_results( "SELECT ID, post_parent FROM $wpdb->posts WHERE post_type = 'page'" ); + $children = array(); + + for ( $i = 0; $i < 50 && $parent > 0; $i++ ) { + $children[] = $parent; + + foreach ( $pages as $page ) { + if ( $page->ID == $parent ) { + $parent = $page->post_parent; + break; + } + } + } + } + + $updated = array(); + $skipped = array(); + $locked = array(); + $shared_post_data = $post_data; + + foreach ( $post_IDs as $post_ID ) { + // Start with fresh post data with each iteration. + $post_data = $shared_post_data; + + $post_type_object = get_post_type_object( get_post_type( $post_ID ) ); + + if ( ! isset( $post_type_object ) || ( isset( $children ) && in_array( $post_ID, $children ) ) || ! current_user_can( 'edit_post', $post_ID ) ) { + $skipped[] = $post_ID; + continue; + } + + if ( wp_check_post_lock( $post_ID ) ) { + $locked[] = $post_ID; + continue; + } + + $post = get_post( $post_ID ); + $tax_names = get_object_taxonomies( $post ); + foreach ( $tax_names as $tax_name ) { + $taxonomy_obj = get_taxonomy( $tax_name ); + if ( isset( $tax_input[ $tax_name ] ) && current_user_can( $taxonomy_obj->cap->assign_terms ) ) { + $new_terms = $tax_input[ $tax_name ]; + } else { + $new_terms = array(); + } + + if ( $taxonomy_obj->hierarchical ) { + $current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array( 'fields' => 'ids' ) ); + } else { + $current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array( 'fields' => 'names' ) ); + } + + $post_data['tax_input'][ $tax_name ] = array_merge( $current_terms, $new_terms ); + } + + if ( isset( $new_cats ) && in_array( 'category', $tax_names ) ) { + $cats = (array) wp_get_post_categories( $post_ID ); + $post_data['post_category'] = array_unique( array_merge( $cats, $new_cats ) ); + unset( $post_data['tax_input']['category'] ); + } + + $post_data['post_ID'] = $post_ID; + $post_data['post_type'] = $post->post_type; + $post_data['post_mime_type'] = $post->post_mime_type; + + foreach ( array( 'comment_status', 'ping_status', 'post_author' ) as $field ) { + if ( ! isset( $post_data[ $field ] ) ) { + $post_data[ $field ] = $post->$field; + } + } + + $post_data = _wp_translate_postdata( true, $post_data ); + if ( is_wp_error( $post_data ) ) { + $skipped[] = $post_ID; + continue; + } + $post_data = _wp_get_allowed_postdata( $post_data ); + + if ( isset( $shared_post_data['post_format'] ) ) { + set_post_format( $post_ID, $shared_post_data['post_format'] ); + } + + // Prevent wp_insert_post() from overwriting post format with the old data. + unset( $post_data['tax_input']['post_format'] ); + + $updated[] = wp_update_post( $post_data ); + + if ( isset( $post_data['sticky'] ) && current_user_can( $ptype->cap->edit_others_posts ) ) { + if ( 'sticky' == $post_data['sticky'] ) { + stick_post( $post_ID ); + } else { + unstick_post( $post_ID ); + } + } + } + + return array( + 'updated' => $updated, + 'skipped' => $skipped, + 'locked' => $locked, + ); +} + +/** + * Default post information to use when populating the "Write Post" form. + * + * @since 2.0.0 + * + * @param string $post_type Optional. A post type string. Default 'post'. + * @param bool $create_in_db Optional. Whether to insert the post into database. Default false. + * @return WP_Post Post object containing all the default post data as attributes + */ +function get_default_post_to_edit( $post_type = 'post', $create_in_db = false ) { + $post_title = ''; + if ( ! empty( $_REQUEST['post_title'] ) ) { + $post_title = esc_html( wp_unslash( $_REQUEST['post_title'] ) ); + } + + $post_content = ''; + if ( ! empty( $_REQUEST['content'] ) ) { + $post_content = esc_html( wp_unslash( $_REQUEST['content'] ) ); + } + + $post_excerpt = ''; + if ( ! empty( $_REQUEST['excerpt'] ) ) { + $post_excerpt = esc_html( wp_unslash( $_REQUEST['excerpt'] ) ); + } + + if ( $create_in_db ) { + $post_id = wp_insert_post( + array( + 'post_title' => __( 'Auto Draft' ), + 'post_type' => $post_type, + 'post_status' => 'auto-draft', + ) + ); + $post = get_post( $post_id ); + if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) ) { + set_post_format( $post, get_option( 'default_post_format' ) ); + } + + // Schedule auto-draft cleanup. + if ( ! wp_next_scheduled( 'wp_scheduled_auto_draft_delete' ) ) { + wp_schedule_event( time(), 'daily', 'wp_scheduled_auto_draft_delete' ); + } + } else { + $post = new stdClass; + $post->ID = 0; + $post->post_author = ''; + $post->post_date = ''; + $post->post_date_gmt = ''; + $post->post_password = ''; + $post->post_name = ''; + $post->post_type = $post_type; + $post->post_status = 'draft'; + $post->to_ping = ''; + $post->pinged = ''; + $post->comment_status = get_default_comment_status( $post_type ); + $post->ping_status = get_default_comment_status( $post_type, 'pingback' ); + $post->post_pingback = get_option( 'default_pingback_flag' ); + $post->post_category = get_option( 'default_category' ); + $post->page_template = 'default'; + $post->post_parent = 0; + $post->menu_order = 0; + $post = new WP_Post( $post ); + } + + /** + * Filters the default post content initially used in the "Write Post" form. + * + * @since 1.5.0 + * + * @param string $post_content Default post content. + * @param WP_Post $post Post object. + */ + $post->post_content = (string) apply_filters( 'default_content', $post_content, $post ); + + /** + * Filters the default post title initially used in the "Write Post" form. + * + * @since 1.5.0 + * + * @param string $post_title Default post title. + * @param WP_Post $post Post object. + */ + $post->post_title = (string) apply_filters( 'default_title', $post_title, $post ); + + /** + * Filters the default post excerpt initially used in the "Write Post" form. + * + * @since 1.5.0 + * + * @param string $post_excerpt Default post excerpt. + * @param WP_Post $post Post object. + */ + $post->post_excerpt = (string) apply_filters( 'default_excerpt', $post_excerpt, $post ); + + return $post; +} + +/** + * Determines if a post exists based on title, content, date and type. + * + * @since 2.0.0 + * @since 5.2.0 Added the `$type` parameter. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $title Post title. + * @param string $content Optional post content. + * @param string $date Optional post date. + * @param string $type Optional post type. + * @return int Post ID if post exists, 0 otherwise. + */ +function post_exists( $title, $content = '', $date = '', $type = '' ) { + global $wpdb; + + $post_title = wp_unslash( sanitize_post_field( 'post_title', $title, 0, 'db' ) ); + $post_content = wp_unslash( sanitize_post_field( 'post_content', $content, 0, 'db' ) ); + $post_date = wp_unslash( sanitize_post_field( 'post_date', $date, 0, 'db' ) ); + $post_type = wp_unslash( sanitize_post_field( 'post_type', $type, 0, 'db' ) ); + + $query = "SELECT ID FROM $wpdb->posts WHERE 1=1"; + $args = array(); + + if ( ! empty( $date ) ) { + $query .= ' AND post_date = %s'; + $args[] = $post_date; + } + + if ( ! empty( $title ) ) { + $query .= ' AND post_title = %s'; + $args[] = $post_title; + } + + if ( ! empty( $content ) ) { + $query .= ' AND post_content = %s'; + $args[] = $post_content; + } + + if ( ! empty( $type ) ) { + $query .= ' AND post_type = %s'; + $args[] = $post_type; + } + + if ( ! empty( $args ) ) { + return (int) $wpdb->get_var( $wpdb->prepare( $query, $args ) ); + } + + return 0; +} + +/** + * Creates a new post from the "Write Post" form using $_POST information. + * + * @since 2.1.0 + * + * @global WP_User $current_user + * + * @return int|WP_Error + */ +function wp_write_post() { + if ( isset( $_POST['post_type'] ) ) { + $ptype = get_post_type_object( $_POST['post_type'] ); + } else { + $ptype = get_post_type_object( 'post' ); + } + + if ( ! current_user_can( $ptype->cap->edit_posts ) ) { + if ( 'page' == $ptype->name ) { + return new WP_Error( 'edit_pages', __( 'Sorry, you are not allowed to create pages on this site.' ) ); + } else { + return new WP_Error( 'edit_posts', __( 'Sorry, you are not allowed to create posts or drafts on this site.' ) ); + } + } + + $_POST['post_mime_type'] = ''; + + // Clear out any data in internal vars. + unset( $_POST['filter'] ); + + // Edit, don't write, if we have a post ID. + if ( isset( $_POST['post_ID'] ) ) { + return edit_post(); + } + + if ( isset( $_POST['visibility'] ) ) { + switch ( $_POST['visibility'] ) { + case 'public': + $_POST['post_password'] = ''; + break; + case 'password': + unset( $_POST['sticky'] ); + break; + case 'private': + $_POST['post_status'] = 'private'; + $_POST['post_password'] = ''; + unset( $_POST['sticky'] ); + break; + } + } + + $translated = _wp_translate_postdata( false ); + if ( is_wp_error( $translated ) ) { + return $translated; + } + $translated = _wp_get_allowed_postdata( $translated ); + + // Create the post. + $post_ID = wp_insert_post( $translated ); + if ( is_wp_error( $post_ID ) ) { + return $post_ID; + } + + if ( empty( $post_ID ) ) { + return 0; + } + + add_meta( $post_ID ); + + add_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID ); + + // Now that we have an ID we can fix any attachment anchor hrefs. + _fix_attachment_links( $post_ID ); + + wp_set_post_lock( $post_ID ); + + return $post_ID; +} + +/** + * Calls wp_write_post() and handles the errors. + * + * @since 2.0.0 + * + * @return int|null + */ +function write_post() { + $result = wp_write_post(); + if ( is_wp_error( $result ) ) { + wp_die( $result->get_error_message() ); + } else { + return $result; + } +} + +// +// Post Meta. +// + +/** + * Add post meta data defined in $_POST superglobal for post with given ID. + * + * @since 1.2.0 + * + * @param int $post_ID + * @return int|bool + */ +function add_meta( $post_ID ) { + $post_ID = (int) $post_ID; + + $metakeyselect = isset( $_POST['metakeyselect'] ) ? wp_unslash( trim( $_POST['metakeyselect'] ) ) : ''; + $metakeyinput = isset( $_POST['metakeyinput'] ) ? wp_unslash( trim( $_POST['metakeyinput'] ) ) : ''; + $metavalue = isset( $_POST['metavalue'] ) ? $_POST['metavalue'] : ''; + if ( is_string( $metavalue ) ) { + $metavalue = trim( $metavalue ); + } + + if ( ( ( '#NONE#' != $metakeyselect ) && ! empty( $metakeyselect ) ) || ! empty( $metakeyinput ) ) { + /* + * We have a key/value pair. If both the select and the input + * for the key have data, the input takes precedence. + */ + if ( '#NONE#' != $metakeyselect ) { + $metakey = $metakeyselect; + } + + if ( $metakeyinput ) { + $metakey = $metakeyinput; // Default. + } + + if ( is_protected_meta( $metakey, 'post' ) || ! current_user_can( 'add_post_meta', $post_ID, $metakey ) ) { + return false; + } + + $metakey = wp_slash( $metakey ); + + return add_post_meta( $post_ID, $metakey, $metavalue ); + } + + return false; +} + +/** + * Delete post meta data by meta ID. + * + * @since 1.2.0 + * + * @param int $mid + * @return bool + */ +function delete_meta( $mid ) { + return delete_metadata_by_mid( 'post', $mid ); +} + +/** + * Get a list of previously defined keys. + * + * @since 1.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return mixed + */ +function get_meta_keys() { + global $wpdb; + + $keys = $wpdb->get_col( + " + SELECT meta_key + FROM $wpdb->postmeta + GROUP BY meta_key + ORDER BY meta_key" + ); + + return $keys; +} + +/** + * Get post meta data by meta ID. + * + * @since 2.1.0 + * + * @param int $mid + * @return object|bool + */ +function get_post_meta_by_id( $mid ) { + return get_metadata_by_mid( 'post', $mid ); +} + +/** + * Get meta data for the given post ID. + * + * @since 1.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $postid + * @return mixed + */ +function has_meta( $postid ) { + global $wpdb; + + return $wpdb->get_results( + $wpdb->prepare( + "SELECT meta_key, meta_value, meta_id, post_id + FROM $wpdb->postmeta WHERE post_id = %d + ORDER BY meta_key,meta_id", + $postid + ), + ARRAY_A + ); +} + +/** + * Update post meta data by meta ID. + * + * @since 1.2.0 + * + * @param int $meta_id + * @param string $meta_key Expect Slashed + * @param string $meta_value Expect Slashed + * @return bool + */ +function update_meta( $meta_id, $meta_key, $meta_value ) { + $meta_key = wp_unslash( $meta_key ); + $meta_value = wp_unslash( $meta_value ); + + return update_metadata_by_mid( 'post', $meta_id, $meta_value, $meta_key ); +} + +// +// Private. +// + +/** + * Replace hrefs of attachment anchors with up-to-date permalinks. + * + * @since 2.3.0 + * @access private + * + * @param int|object $post Post ID or post object. + * @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success. + */ +function _fix_attachment_links( $post ) { + $post = get_post( $post, ARRAY_A ); + $content = $post['post_content']; + + // Don't run if no pretty permalinks or post is not published, scheduled, or privately published. + if ( ! get_option( 'permalink_structure' ) || ! in_array( $post['post_status'], array( 'publish', 'future', 'private' ) ) ) { + return; + } + + // Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero). + if ( ! strpos( $content, '?attachment_id=' ) || ! preg_match_all( '/]+)>[\s\S]+?<\/a>/', $content, $link_matches ) ) { + return; + } + + $site_url = get_bloginfo( 'url' ); + $site_url = substr( $site_url, (int) strpos( $site_url, '://' ) ); // Remove the http(s). + $replace = ''; + + foreach ( $link_matches[1] as $key => $value ) { + if ( ! strpos( $value, '?attachment_id=' ) || ! strpos( $value, 'wp-att-' ) + || ! preg_match( '/href=(["\'])[^"\']*\?attachment_id=(\d+)[^"\']*\\1/', $value, $url_match ) + || ! preg_match( '/rel=["\'][^"\']*wp-att-(\d+)/', $value, $rel_match ) ) { + continue; + } + + $quote = $url_match[1]; // The quote (single or double). + $url_id = (int) $url_match[2]; + $rel_id = (int) $rel_match[1]; + + if ( ! $url_id || ! $rel_id || $url_id != $rel_id || strpos( $url_match[0], $site_url ) === false ) { + continue; + } + + $link = $link_matches[0][ $key ]; + $replace = str_replace( $url_match[0], 'href=' . $quote . get_attachment_link( $url_id ) . $quote, $link ); + + $content = str_replace( $link, $replace, $content ); + } + + if ( $replace ) { + $post['post_content'] = $content; + // Escape data pulled from DB. + $post = add_magic_quotes( $post ); + + return wp_update_post( $post ); + } +} + +/** + * Get all the possible statuses for a post_type + * + * @since 2.5.0 + * + * @param string $type The post_type you want the statuses for. Default 'post'. + * @return string[] An array of all the statuses for the supplied post type. + */ +function get_available_post_statuses( $type = 'post' ) { + $stati = wp_count_posts( $type ); + + return array_keys( get_object_vars( $stati ) ); +} + +/** + * Run the wp query to fetch the posts for listing on the edit posts page + * + * @since 2.5.0 + * + * @param array|bool $q Array of query variables to use to build the query or false to use $_GET superglobal. + * @return array + */ +function wp_edit_posts_query( $q = false ) { + if ( false === $q ) { + $q = $_GET; + } + $q['m'] = isset( $q['m'] ) ? (int) $q['m'] : 0; + $q['cat'] = isset( $q['cat'] ) ? (int) $q['cat'] : 0; + $post_stati = get_post_stati(); + + if ( isset( $q['post_type'] ) && in_array( $q['post_type'], get_post_types() ) ) { + $post_type = $q['post_type']; + } else { + $post_type = 'post'; + } + + $avail_post_stati = get_available_post_statuses( $post_type ); + $post_status = ''; + $perm = ''; + + if ( isset( $q['post_status'] ) && in_array( $q['post_status'], $post_stati ) ) { + $post_status = $q['post_status']; + $perm = 'readable'; + } + + $orderby = ''; + + if ( isset( $q['orderby'] ) ) { + $orderby = $q['orderby']; + } elseif ( isset( $q['post_status'] ) && in_array( $q['post_status'], array( 'pending', 'draft' ) ) ) { + $orderby = 'modified'; + } + + $order = ''; + + if ( isset( $q['order'] ) ) { + $order = $q['order']; + } elseif ( isset( $q['post_status'] ) && 'pending' == $q['post_status'] ) { + $order = 'ASC'; + } + + $per_page = "edit_{$post_type}_per_page"; + $posts_per_page = (int) get_user_option( $per_page ); + if ( empty( $posts_per_page ) || $posts_per_page < 1 ) { + $posts_per_page = 20; + } + + /** + * Filters the number of items per page to show for a specific 'per_page' type. + * + * The dynamic portion of the hook name, `$post_type`, refers to the post type. + * + * Some examples of filter hooks generated here include: 'edit_attachment_per_page', + * 'edit_post_per_page', 'edit_page_per_page', etc. + * + * @since 3.0.0 + * + * @param int $posts_per_page Number of posts to display per page for the given post + * type. Default 20. + */ + $posts_per_page = apply_filters( "edit_{$post_type}_per_page", $posts_per_page ); + + /** + * Filters the number of posts displayed per page when specifically listing "posts". + * + * @since 2.8.0 + * + * @param int $posts_per_page Number of posts to be displayed. Default 20. + * @param string $post_type The post type. + */ + $posts_per_page = apply_filters( 'edit_posts_per_page', $posts_per_page, $post_type ); + + $query = compact( 'post_type', 'post_status', 'perm', 'order', 'orderby', 'posts_per_page' ); + + // Hierarchical types require special args. + if ( is_post_type_hierarchical( $post_type ) && empty( $orderby ) ) { + $query['orderby'] = 'menu_order title'; + $query['order'] = 'asc'; + $query['posts_per_page'] = -1; + $query['posts_per_archive_page'] = -1; + $query['fields'] = 'id=>parent'; + } + + if ( ! empty( $q['show_sticky'] ) ) { + $query['post__in'] = (array) get_option( 'sticky_posts' ); + } + + wp( $query ); + + return $avail_post_stati; +} + +/** + * Get the query variables for the current attachments request. + * + * @since 4.2.0 + * + * @param array|false $q Optional. Array of query variables to use to build the query or false + * to use $_GET superglobal. Default false. + * @return array The parsed query vars. + */ +function wp_edit_attachments_query_vars( $q = false ) { + if ( false === $q ) { + $q = $_GET; + } + $q['m'] = isset( $q['m'] ) ? (int) $q['m'] : 0; + $q['cat'] = isset( $q['cat'] ) ? (int) $q['cat'] : 0; + $q['post_type'] = 'attachment'; + $post_type = get_post_type_object( 'attachment' ); + $states = 'inherit'; + if ( current_user_can( $post_type->cap->read_private_posts ) ) { + $states .= ',private'; + } + + $q['post_status'] = isset( $q['status'] ) && 'trash' == $q['status'] ? 'trash' : $states; + $q['post_status'] = isset( $q['attachment-filter'] ) && 'trash' == $q['attachment-filter'] ? 'trash' : $states; + + $media_per_page = (int) get_user_option( 'upload_per_page' ); + if ( empty( $media_per_page ) || $media_per_page < 1 ) { + $media_per_page = 20; + } + + /** + * Filters the number of items to list per page when listing media items. + * + * @since 2.9.0 + * + * @param int $media_per_page Number of media to list. Default 20. + */ + $q['posts_per_page'] = apply_filters( 'upload_per_page', $media_per_page ); + + $post_mime_types = get_post_mime_types(); + if ( isset( $q['post_mime_type'] ) && ! array_intersect( (array) $q['post_mime_type'], array_keys( $post_mime_types ) ) ) { + unset( $q['post_mime_type'] ); + } + + foreach ( array_keys( $post_mime_types ) as $type ) { + if ( isset( $q['attachment-filter'] ) && "post_mime_type:$type" == $q['attachment-filter'] ) { + $q['post_mime_type'] = $type; + break; + } + } + + if ( isset( $q['detached'] ) || ( isset( $q['attachment-filter'] ) && 'detached' == $q['attachment-filter'] ) ) { + $q['post_parent'] = 0; + } + + if ( isset( $q['mine'] ) || ( isset( $q['attachment-filter'] ) && 'mine' == $q['attachment-filter'] ) ) { + $q['author'] = get_current_user_id(); + } + + // Filter query clauses to include filenames. + if ( isset( $q['s'] ) ) { + add_filter( 'posts_clauses', '_filter_query_attachment_filenames' ); + } + + return $q; +} + +/** + * Executes a query for attachments. An array of WP_Query arguments + * can be passed in, which will override the arguments set by this function. + * + * @since 2.5.0 + * + * @param array|false $q Array of query variables to use to build the query or false to use $_GET superglobal. + * @return array + */ +function wp_edit_attachments_query( $q = false ) { + wp( wp_edit_attachments_query_vars( $q ) ); + + $post_mime_types = get_post_mime_types(); + $avail_post_mime_types = get_available_post_mime_types( 'attachment' ); + + return array( $post_mime_types, $avail_post_mime_types ); +} + +/** + * Returns the list of classes to be used by a meta box. + * + * @since 2.5.0 + * + * @param string $box_id Meta box ID (used in the 'id' attribute for the meta box). + * @param string $screen_id The screen on which the meta box is shown. + * @return string Space-separated string of class names. + */ +function postbox_classes( $box_id, $screen_id ) { + if ( isset( $_GET['edit'] ) && $_GET['edit'] == $box_id ) { + $classes = array( '' ); + } elseif ( get_user_option( 'closedpostboxes_' . $screen_id ) ) { + $closed = get_user_option( 'closedpostboxes_' . $screen_id ); + if ( ! is_array( $closed ) ) { + $classes = array( '' ); + } else { + $classes = in_array( $box_id, $closed ) ? array( 'closed' ) : array( '' ); + } + } else { + $classes = array( '' ); + } + + /** + * Filters the postbox classes for a specific screen and box ID combo. + * + * The dynamic portions of the hook name, `$screen_id` and `$box_id`, refer to + * the screen ID and meta box ID, respectively. + * + * @since 3.2.0 + * + * @param string[] $classes An array of postbox classes. + */ + $classes = apply_filters( "postbox_classes_{$screen_id}_{$box_id}", $classes ); + return implode( ' ', $classes ); +} + +/** + * Get a sample permalink based off of the post name. + * + * @since 2.5.0 + * + * @param int $id Post ID or post object. + * @param string $title Optional. Title to override the post's current title when generating the post name. Default null. + * @param string $name Optional. Name to override the post name. Default null. + * @return array { + * Array containing the sample permalink with placeholder for the post name, and the post name. + * + * @type string $0 The permalink with placeholder for the post name. + * @type string $1 The post name. + * } + */ +function get_sample_permalink( $id, $title = null, $name = null ) { + $post = get_post( $id ); + if ( ! $post ) { + return array( '', '' ); + } + + $ptype = get_post_type_object( $post->post_type ); + + $original_status = $post->post_status; + $original_date = $post->post_date; + $original_name = $post->post_name; + + // Hack: get_permalink() would return ugly permalink for drafts, so we will fake that our post is published. + if ( in_array( $post->post_status, array( 'draft', 'pending', 'future' ) ) ) { + $post->post_status = 'publish'; + $post->post_name = sanitize_title( $post->post_name ? $post->post_name : $post->post_title, $post->ID ); + } + + // If the user wants to set a new name -- override the current one. + // Note: if empty name is supplied -- use the title instead, see #6072. + if ( ! is_null( $name ) ) { + $post->post_name = sanitize_title( $name ? $name : $title, $post->ID ); + } + + $post->post_name = wp_unique_post_slug( $post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent ); + + $post->filter = 'sample'; + + $permalink = get_permalink( $post, true ); + + // Replace custom post_type token with generic pagename token for ease of use. + $permalink = str_replace( "%$post->post_type%", '%pagename%', $permalink ); + + // Handle page hierarchy. + if ( $ptype->hierarchical ) { + $uri = get_page_uri( $post ); + if ( $uri ) { + $uri = untrailingslashit( $uri ); + $uri = strrev( stristr( strrev( $uri ), '/' ) ); + $uri = untrailingslashit( $uri ); + } + + /** This filter is documented in wp-admin/edit-tag-form.php */ + $uri = apply_filters( 'editable_slug', $uri, $post ); + if ( ! empty( $uri ) ) { + $uri .= '/'; + } + $permalink = str_replace( '%pagename%', "{$uri}%pagename%", $permalink ); + } + + /** This filter is documented in wp-admin/edit-tag-form.php */ + $permalink = array( $permalink, apply_filters( 'editable_slug', $post->post_name, $post ) ); + $post->post_status = $original_status; + $post->post_date = $original_date; + $post->post_name = $original_name; + unset( $post->filter ); + + /** + * Filters the sample permalink. + * + * @since 4.4.0 + * + * @param array $permalink { + * Array containing the sample permalink with placeholder for the post name, and the post name. + * + * @type string $0 The permalink with placeholder for the post name. + * @type string $1 The post name. + * } + * @param int $post_id Post ID. + * @param string $title Post title. + * @param string $name Post name (slug). + * @param WP_Post $post Post object. + */ + return apply_filters( 'get_sample_permalink', $permalink, $post->ID, $title, $name, $post ); +} + +/** + * Returns the HTML of the sample permalink slug editor. + * + * @since 2.5.0 + * + * @param int $id Post ID or post object. + * @param string $new_title Optional. New title. Default null. + * @param string $new_slug Optional. New slug. Default null. + * @return string The HTML of the sample permalink slug editor. + */ +function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) { + $post = get_post( $id ); + if ( ! $post ) { + return ''; + } + + list($permalink, $post_name) = get_sample_permalink( $post->ID, $new_title, $new_slug ); + + $view_link = false; + $preview_target = ''; + + if ( current_user_can( 'read_post', $post->ID ) ) { + if ( 'draft' === $post->post_status || empty( $post->post_name ) ) { + $view_link = get_preview_post_link( $post ); + $preview_target = " target='wp-preview-{$post->ID}'"; + } else { + if ( 'publish' === $post->post_status || 'attachment' === $post->post_type ) { + $view_link = get_permalink( $post ); + } else { + // Allow non-published (private, future) to be viewed at a pretty permalink, in case $post->post_name is set. + $view_link = str_replace( array( '%pagename%', '%postname%' ), $post->post_name, $permalink ); + } + } + } + + // Permalinks without a post/page name placeholder don't have anything to edit. + if ( false === strpos( $permalink, '%postname%' ) && false === strpos( $permalink, '%pagename%' ) ) { + $return = '' . __( 'Permalink:' ) . "\n"; + + if ( false !== $view_link ) { + $display_link = urldecode( $view_link ); + $return .= '' . esc_html( $display_link ) . "\n"; + } else { + $return .= '' . $permalink . "\n"; + } + + // Encourage a pretty permalink setting. + if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && ! ( 'page' == get_option( 'show_on_front' ) && get_option( 'page_on_front' ) == $id ) ) { + $return .= '' . __( 'Change Permalinks' ) . "\n"; + } + } else { + if ( mb_strlen( $post_name ) > 34 ) { + $post_name_abridged = mb_substr( $post_name, 0, 16 ) . '…' . mb_substr( $post_name, -16 ); + } else { + $post_name_abridged = $post_name; + } + + $post_name_html = '' . esc_html( $post_name_abridged ) . ''; + $display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, esc_html( urldecode( $permalink ) ) ); + + $return = '' . __( 'Permalink:' ) . "\n"; + $return .= '' . $display_link . "\n"; + $return .= '‎'; // Fix bi-directional text display defect in RTL languages. + $return .= '\n"; + $return .= '' . esc_html( $post_name ) . "\n"; + } + + /** + * Filters the sample permalink HTML markup. + * + * @since 2.9.0 + * @since 4.4.0 Added `$post` parameter. + * + * @param string $return Sample permalink HTML markup. + * @param int $post_id Post ID. + * @param string $new_title New sample permalink title. + * @param string $new_slug New sample permalink slug. + * @param WP_Post $post Post object. + */ + $return = apply_filters( 'get_sample_permalink_html', $return, $post->ID, $new_title, $new_slug, $post ); + + return $return; +} + +/** + * Output HTML for the post thumbnail meta-box. + * + * @since 2.9.0 + * + * @param int $thumbnail_id ID of the attachment used for thumbnail + * @param int|WP_Post $post Optional. The post ID or object associated with the thumbnail, defaults to global $post. + * @return string html + */ +function _wp_post_thumbnail_html( $thumbnail_id = null, $post = null ) { + $_wp_additional_image_sizes = wp_get_additional_image_sizes(); + + $post = get_post( $post ); + $post_type_object = get_post_type_object( $post->post_type ); + $set_thumbnail_link = '

        %s

        '; + $upload_iframe_src = get_upload_iframe_src( 'image', $post->ID ); + + $content = sprintf( + $set_thumbnail_link, + esc_url( $upload_iframe_src ), + '', // Empty when there's no featured image set, `aria-describedby` attribute otherwise. + esc_html( $post_type_object->labels->set_featured_image ) + ); + + if ( $thumbnail_id && get_post( $thumbnail_id ) ) { + $size = isset( $_wp_additional_image_sizes['post-thumbnail'] ) ? 'post-thumbnail' : array( 266, 266 ); + + /** + * Filters the size used to display the post thumbnail image in the 'Featured image' meta box. + * + * Note: When a theme adds 'post-thumbnail' support, a special 'post-thumbnail' + * image size is registered, which differs from the 'thumbnail' image size + * managed via the Settings > Media screen. See the `$size` parameter description + * for more information on default values. + * + * @since 4.4.0 + * + * @param string|array $size Post thumbnail image size to display in the meta box. Accepts any valid + * image size, or an array of width and height values in pixels (in that order). + * If the 'post-thumbnail' size is set, default is 'post-thumbnail'. Otherwise, + * default is an array with 266 as both the height and width values. + * @param int $thumbnail_id Post thumbnail attachment ID. + * @param WP_Post $post The post object associated with the thumbnail. + */ + $size = apply_filters( 'admin_post_thumbnail_size', $size, $thumbnail_id, $post ); + + $thumbnail_html = wp_get_attachment_image( $thumbnail_id, $size ); + + if ( ! empty( $thumbnail_html ) ) { + $content = sprintf( + $set_thumbnail_link, + esc_url( $upload_iframe_src ), + ' aria-describedby="set-post-thumbnail-desc"', + $thumbnail_html + ); + $content .= '

        ' . __( 'Click the image to edit or update' ) . '

        '; + $content .= '

        ' . esc_html( $post_type_object->labels->remove_featured_image ) . '

        '; + } + } + + $content .= ''; + + /** + * Filters the admin post thumbnail HTML markup to return. + * + * @since 2.9.0 + * @since 3.5.0 Added the `$post_id` parameter. + * @since 4.6.0 Added the `$thumbnail_id` parameter. + * + * @param string $content Admin post thumbnail HTML markup. + * @param int $post_id Post ID. + * @param int|null $thumbnail_id Thumbnail attachment ID, or null if there isn't one. + */ + return apply_filters( 'admin_post_thumbnail_html', $content, $post->ID, $thumbnail_id ); +} + +/** + * Check to see if the post is currently being edited by another user. + * + * @since 2.5.0 + * + * @param int $post_id ID of the post to check for editing. + * @return int|false ID of the user with lock. False if the post does not exist, post is not locked, + * the user with lock does not exist, or the post is locked by current user. + */ +function wp_check_post_lock( $post_id ) { + $post = get_post( $post_id ); + if ( ! $post ) { + return false; + } + + $lock = get_post_meta( $post->ID, '_edit_lock', true ); + if ( ! $lock ) { + return false; + } + + $lock = explode( ':', $lock ); + $time = $lock[0]; + $user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true ); + + if ( ! get_userdata( $user ) ) { + return false; + } + + /** This filter is documented in wp-admin/includes/ajax-actions.php */ + $time_window = apply_filters( 'wp_check_post_lock_window', 150 ); + + if ( $time && $time > time() - $time_window && get_current_user_id() != $user ) { + return $user; + } + + return false; +} + +/** + * Mark the post as currently being edited by the current user + * + * @since 2.5.0 + * + * @param int $post_id ID of the post being edited. + * @return array|false Array of the lock time and user ID. False if the post does not exist, or + * there is no current user. + */ +function wp_set_post_lock( $post_id ) { + $post = get_post( $post_id ); + if ( ! $post ) { + return false; + } + + $user_id = get_current_user_id(); + if ( 0 == $user_id ) { + return false; + } + + $now = time(); + $lock = "$now:$user_id"; + + update_post_meta( $post->ID, '_edit_lock', $lock ); + + return array( $now, $user_id ); +} + +/** + * Outputs the HTML for the notice to say that someone else is editing or has taken over editing of this post. + * + * @since 2.8.5 + */ +function _admin_notice_post_locked() { + $post = get_post(); + if ( ! $post ) { + return; + } + + $user = null; + $user_id = wp_check_post_lock( $post->ID ); + if ( $user_id ) { + $user = get_userdata( $user_id ); + } + + if ( $user ) { + /** + * Filters whether to show the post locked dialog. + * + * Returning false from the filter will prevent the dialog from being displayed. + * + * @since 3.6.0 + * + * @param bool $display Whether to display the dialog. Default true. + * @param WP_Post $post Post object. + * @param WP_User $user The user with the lock for the post. + */ + if ( ! apply_filters( 'show_post_locked_dialog', true, $post, $user ) ) { + return; + } + + $locked = true; + } else { + $locked = false; + } + + $sendback = wp_get_referer(); + if ( $locked && $sendback && false === strpos( $sendback, 'post.php' ) && false === strpos( $sendback, 'post-new.php' ) ) { + + $sendback_text = __( 'Go back' ); + } else { + $sendback = admin_url( 'edit.php' ); + + if ( 'post' != $post->post_type ) { + $sendback = add_query_arg( 'post_type', $post->post_type, $sendback ); + } + + $sendback_text = get_post_type_object( $post->post_type )->labels->all_items; + } + + $hidden = $locked ? '' : ' hidden'; + + ?> +
        +
        +
        + post_type )->public ) { + if ( 'publish' == $post->post_status || $user->ID != $post->post_author ) { + // Latest content is in autosave. + $nonce = wp_create_nonce( 'post_preview_' . $post->ID ); + $query_args['preview_id'] = $post->ID; + $query_args['preview_nonce'] = $nonce; + } + } + + $preview_link = get_preview_post_link( $post->ID, $query_args ); + + /** + * Filters whether to allow the post lock to be overridden. + * + * Returning false from the filter will disable the ability + * to override the post lock. + * + * @since 3.6.0 + * + * @param bool $override Whether to allow the post lock to be overridden. Default true. + * @param WP_Post $post Post object. + * @param WP_User $user The user with the lock for the post. + */ + $override = apply_filters( 'override_post_lock', true, $post, $user ); + $tab_last = $override ? '' : ' wp-tab-last'; + + ?> +
        +
        ID, 64 ); ?>
        +

        + display_name ) ); + } else { + /* translators: %s: User's display name. */ + printf( __( '%s is already editing this post.' ), esc_html( $user->display_name ) ); + } + ?> +

        + +

        + + + + + + +

        +
        + +
        +
        +

        +
        + + +

        + +

        +
        + +
        +
        + ID; + $new_autosave['post_author'] = $post_author; + + $post = get_post( $post_id ); + + // If the new autosave has the same content as the post, delete the autosave. + $autosave_is_different = false; + foreach ( array_intersect( array_keys( $new_autosave ), array_keys( _wp_post_revision_fields( $post ) ) ) as $field ) { + if ( normalize_whitespace( $new_autosave[ $field ] ) !== normalize_whitespace( $post->$field ) ) { + $autosave_is_different = true; + break; + } + } + + if ( ! $autosave_is_different ) { + wp_delete_post_revision( $old_autosave->ID ); + return 0; + } + + /** + * Fires before an autosave is stored. + * + * @since 4.1.0 + * + * @param array $new_autosave Post array - the autosave that is about to be saved. + */ + do_action( 'wp_creating_autosave', $new_autosave ); + + return wp_update_post( $new_autosave ); + } + + // _wp_put_post_revision() expects unescaped. + $post_data = wp_unslash( $post_data ); + + // Otherwise create the new autosave as a special post revision. + return _wp_put_post_revision( $post_data, true ); +} + +/** + * Saves a draft or manually autosaves for the purpose of showing a post preview. + * + * @since 2.7.0 + * + * @return string URL to redirect to show the preview. + */ +function post_preview() { + + $post_ID = (int) $_POST['post_ID']; + $_POST['ID'] = $post_ID; + + $post = get_post( $post_ID ); + if ( ! $post ) { + wp_die( __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post->ID ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + $is_autosave = false; + + if ( ! wp_check_post_lock( $post->ID ) && get_current_user_id() == $post->post_author && ( 'draft' == $post->post_status || 'auto-draft' == $post->post_status ) ) { + $saved_post_id = edit_post(); + } else { + $is_autosave = true; + + if ( isset( $_POST['post_status'] ) && 'auto-draft' == $_POST['post_status'] ) { + $_POST['post_status'] = 'draft'; + } + + $saved_post_id = wp_create_post_autosave( $post->ID ); + } + + if ( is_wp_error( $saved_post_id ) ) { + wp_die( $saved_post_id->get_error_message() ); + } + + $query_args = array(); + + if ( $is_autosave && $saved_post_id ) { + $query_args['preview_id'] = $post->ID; + $query_args['preview_nonce'] = wp_create_nonce( 'post_preview_' . $post->ID ); + + if ( isset( $_POST['post_format'] ) ) { + $query_args['post_format'] = empty( $_POST['post_format'] ) ? 'standard' : sanitize_key( $_POST['post_format'] ); + } + + if ( isset( $_POST['_thumbnail_id'] ) ) { + $query_args['_thumbnail_id'] = ( intval( $_POST['_thumbnail_id'] ) <= 0 ) ? '-1' : intval( $_POST['_thumbnail_id'] ); + } + } + + return get_preview_post_link( $post, $query_args ); +} + +/** + * Save a post submitted with XHR + * + * Intended for use with heartbeat and autosave.js + * + * @since 3.9.0 + * + * @param array $post_data Associative array of the submitted post data. + * @return mixed The value 0 or WP_Error on failure. The saved post ID on success. + * The ID can be the draft post_id or the autosave revision post_id. + */ +function wp_autosave( $post_data ) { + // Back-compat. + if ( ! defined( 'DOING_AUTOSAVE' ) ) { + define( 'DOING_AUTOSAVE', true ); + } + + $post_id = (int) $post_data['post_id']; + $post_data['ID'] = $post_id; + $post_data['post_ID'] = $post_id; + + if ( false === wp_verify_nonce( $post_data['_wpnonce'], 'update-post_' . $post_id ) ) { + return new WP_Error( 'invalid_nonce', __( 'Error while saving.' ) ); + } + + $post = get_post( $post_id ); + + if ( ! current_user_can( 'edit_post', $post->ID ) ) { + return new WP_Error( 'edit_posts', __( 'Sorry, you are not allowed to edit this item.' ) ); + } + + if ( 'auto-draft' == $post->post_status ) { + $post_data['post_status'] = 'draft'; + } + + if ( 'page' !== $post_data['post_type'] && ! empty( $post_data['catslist'] ) ) { + $post_data['post_category'] = explode( ',', $post_data['catslist'] ); + } + + if ( ! wp_check_post_lock( $post->ID ) && get_current_user_id() == $post->post_author && ( 'auto-draft' == $post->post_status || 'draft' == $post->post_status ) ) { + // Drafts and auto-drafts are just overwritten by autosave for the same user if the post is not locked. + return edit_post( wp_slash( $post_data ) ); + } else { + // Non-drafts or other users' drafts are not overwritten. + // The autosave is stored in a special post revision for each user. + return wp_create_post_autosave( wp_slash( $post_data ) ); + } +} + +/** + * Redirect to previous page. + * + * @since 2.7.0 + * + * @param int $post_id Optional. Post ID. + */ +function redirect_post( $post_id = '' ) { + if ( isset( $_POST['save'] ) || isset( $_POST['publish'] ) ) { + $status = get_post_status( $post_id ); + + if ( isset( $_POST['publish'] ) ) { + switch ( $status ) { + case 'pending': + $message = 8; + break; + case 'future': + $message = 9; + break; + default: + $message = 6; + } + } else { + $message = 'draft' == $status ? 10 : 1; + } + + $location = add_query_arg( 'message', $message, get_edit_post_link( $post_id, 'url' ) ); + } elseif ( isset( $_POST['addmeta'] ) && $_POST['addmeta'] ) { + $location = add_query_arg( 'message', 2, wp_get_referer() ); + $location = explode( '#', $location ); + $location = $location[0] . '#postcustom'; + } elseif ( isset( $_POST['deletemeta'] ) && $_POST['deletemeta'] ) { + $location = add_query_arg( 'message', 3, wp_get_referer() ); + $location = explode( '#', $location ); + $location = $location[0] . '#postcustom'; + } else { + $location = add_query_arg( 'message', 4, get_edit_post_link( $post_id, 'url' ) ); + } + + /** + * Filters the post redirect destination URL. + * + * @since 2.9.0 + * + * @param string $location The destination URL. + * @param int $post_id The post ID. + */ + wp_redirect( apply_filters( 'redirect_post_location', $location, $post_id ) ); + exit; +} + +/** + * Sanitizes POST values from a checkbox taxonomy metabox. + * + * @since 5.1.0 + * + * @param string $taxonomy The taxonomy name. + * @param array $terms Raw term data from the 'tax_input' field. + * @return int[] Array of sanitized term IDs. + */ +function taxonomy_meta_box_sanitize_cb_checkboxes( $taxonomy, $terms ) { + return array_map( 'intval', $terms ); +} + +/** + * Sanitizes POST values from an input taxonomy metabox. + * + * @since 5.1.0 + * + * @param string $taxonomy The taxonomy name. + * @param array|string $terms Raw term data from the 'tax_input' field. + * @return array + */ +function taxonomy_meta_box_sanitize_cb_input( $taxonomy, $terms ) { + /* + * Assume that a 'tax_input' string is a comma-separated list of term names. + * Some languages may use a character other than a comma as a delimiter, so we standardize on + * commas before parsing the list. + */ + if ( ! is_array( $terms ) ) { + $comma = _x( ',', 'tag delimiter' ); + if ( ',' !== $comma ) { + $terms = str_replace( $comma, ',', $terms ); + } + $terms = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) ); + } + + $clean_terms = array(); + foreach ( $terms as $term ) { + // Empty terms are invalid input. + if ( empty( $term ) ) { + continue; + } + + $_term = get_terms( + array( + 'taxonomy' => $taxonomy, + 'name' => $term, + 'fields' => 'ids', + 'hide_empty' => false, + ) + ); + + if ( ! empty( $_term ) ) { + $clean_terms[] = intval( $_term[0] ); + } else { + // No existing term was found, so pass the string. A new term will be created. + $clean_terms[] = $term; + } + } + + return $clean_terms; +} + +/** + * Return whether the post can be edited in the block editor. + * + * @since 5.0.0 + * + * @param int|WP_Post $post Post ID or WP_Post object. + * @return bool Whether the post can be edited in the block editor. + */ +function use_block_editor_for_post( $post ) { + $post = get_post( $post ); + + if ( ! $post ) { + return false; + } + + // We're in the meta box loader, so don't use the block editor. + if ( isset( $_GET['meta-box-loader'] ) ) { + check_admin_referer( 'meta-box-loader', 'meta-box-loader-nonce' ); + return false; + } + + // The posts page can't be edited in the block editor. + if ( absint( get_option( 'page_for_posts' ) ) === $post->ID && empty( $post->post_content ) ) { + return false; + } + + $use_block_editor = use_block_editor_for_post_type( $post->post_type ); + + /** + * Filter whether a post is able to be edited in the block editor. + * + * @since 5.0.0 + * + * @param bool $use_block_editor Whether the post can be edited or not. + * @param WP_Post $post The post being checked. + */ + return apply_filters( 'use_block_editor_for_post', $use_block_editor, $post ); +} + +/** + * Return whether a post type is compatible with the block editor. + * + * The block editor depends on the REST API, and if the post type is not shown in the + * REST API, then it won't work with the block editor. + * + * @since 5.0.0 + * + * @param string $post_type The post type. + * @return bool Whether the post type can be edited with the block editor. + */ +function use_block_editor_for_post_type( $post_type ) { + if ( ! post_type_exists( $post_type ) ) { + return false; + } + + if ( ! post_type_supports( $post_type, 'editor' ) ) { + return false; + } + + $post_type_object = get_post_type_object( $post_type ); + if ( $post_type_object && ! $post_type_object->show_in_rest ) { + return false; + } + + /** + * Filter whether a post is able to be edited in the block editor. + * + * @since 5.0.0 + * + * @param bool $use_block_editor Whether the post type can be edited or not. Default true. + * @param string $post_type The post type being checked. + */ + return apply_filters( 'use_block_editor_for_post_type', true, $post_type ); +} + +/** + * Returns all the block categories that will be shown in the block editor. + * + * @since 5.0.0 + * + * @param WP_Post $post Post object. + * @return array[] Array of block categories. + */ +function get_block_categories( $post ) { + $default_categories = array( + array( + 'slug' => 'common', + 'title' => __( 'Common Blocks' ), + 'icon' => null, + ), + array( + 'slug' => 'formatting', + 'title' => __( 'Formatting' ), + 'icon' => null, + ), + array( + 'slug' => 'layout', + 'title' => __( 'Layout Elements' ), + 'icon' => null, + ), + array( + 'slug' => 'widgets', + 'title' => __( 'Widgets' ), + 'icon' => null, + ), + array( + 'slug' => 'embed', + 'title' => __( 'Embeds' ), + 'icon' => null, + ), + array( + 'slug' => 'reusable', + 'title' => __( 'Reusable Blocks' ), + 'icon' => null, + ), + ); + + /** + * Filter the default array of block categories. + * + * @since 5.0.0 + * + * @param array[] $default_categories Array of block categories. + * @param WP_Post $post Post being loaded. + */ + return apply_filters( 'block_categories', $default_categories, $post ); +} + +/** + * Prepares server-registered blocks for the block editor. + * + * Returns an associative array of registered block data keyed by block name. Data includes properties + * of a block relevant for client registration. + * + * @since 5.0.0 + * + * @return array An associative array of registered block data. + */ +function get_block_editor_server_block_settings() { + $block_registry = WP_Block_Type_Registry::get_instance(); + $blocks = array(); + $keys_to_pick = array( 'title', 'description', 'icon', 'category', 'keywords', 'parent', 'supports', 'attributes', 'styles' ); + + foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) { + foreach ( $keys_to_pick as $key ) { + if ( ! isset( $block_type->{ $key } ) ) { + continue; + } + + if ( ! isset( $blocks[ $block_name ] ) ) { + $blocks[ $block_name ] = array(); + } + + $blocks[ $block_name ][ $key ] = $block_type->{ $key }; + } + } + + return $blocks; +} + +/** + * Renders the meta boxes forms. + * + * @since 5.0.0 + */ +function the_block_editor_meta_boxes() { + global $post, $current_screen, $wp_meta_boxes; + + // Handle meta box state. + $_original_meta_boxes = $wp_meta_boxes; + + /** + * Fires right before the meta boxes are rendered. + * + * This allows for the filtering of meta box data, that should already be + * present by this point. Do not use as a means of adding meta box data. + * + * @since 5.0.0 + * + * @param array $wp_meta_boxes Global meta box state. + */ + $wp_meta_boxes = apply_filters( 'filter_block_editor_meta_boxes', $wp_meta_boxes ); + $locations = array( 'side', 'normal', 'advanced' ); + $priorities = array( 'high', 'sorted', 'core', 'default', 'low' ); + + // Render meta boxes. + ?> +
        + +
        +
        + + +
        + +
        + +
        + + id ][ $location ] ) ) { + continue; + } + + foreach ( $priorities as $priority ) { + if ( ! isset( $wp_meta_boxes[ $current_screen->id ][ $location ][ $priority ] ) ) { + continue; + } + + $meta_boxes = (array) $wp_meta_boxes[ $current_screen->id ][ $location ][ $priority ]; + foreach ( $meta_boxes as $meta_box ) { + if ( false == $meta_box || ! $meta_box['title'] ) { + continue; + } + + // If a meta box is just here for back compat, don't show it in the block editor. + if ( isset( $meta_box['args']['__back_compat_meta_box'] ) && $meta_box['args']['__back_compat_meta_box'] ) { + continue; + } + + $meta_boxes_per_location[ $location ][] = array( + 'id' => $meta_box['id'], + 'title' => $meta_box['title'], + ); + } + } + } + + /** + * Sadly we probably can not add this data directly into editor settings. + * + * Some meta boxes need admin_head to fire for meta box registry. + * admin_head fires after admin_enqueue_scripts, which is where we create our + * editor instance. + */ + $script = 'window._wpLoadBlockEditor.then( function() { + wp.data.dispatch( \'core/edit-post\' ).setAvailableMetaBoxesPerLocation( ' . wp_json_encode( $meta_boxes_per_location ) . ' ); + } );'; + + wp_add_inline_script( 'wp-edit-post', $script ); + + /** + * When `wp-edit-post` is output in the ``, the inline script needs to be manually printed. Otherwise, + * meta boxes will not display because inline scripts for `wp-edit-post` will not be printed again after this point. + */ + if ( wp_script_is( 'wp-edit-post', 'done' ) ) { + printf( "\n", trim( $script ) ); + } + + /** + * If the 'postcustom' meta box is enabled, then we need to perform some + * extra initialization on it. + */ + $enable_custom_fields = (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true ); + if ( $enable_custom_fields ) { + $script = "( function( $ ) { + if ( $('#postcustom').length ) { + $( '#the-list' ).wpList( { + addBefore: function( s ) { + s.data += '&post_id=$post->ID'; + return s; + }, + addAfter: function() { + $('table#list-table').show(); + } + }); + } + } )( jQuery );"; + wp_enqueue_script( 'wp-lists' ); + wp_add_inline_script( 'wp-lists', $script ); + } + + // Reset meta box data. + $wp_meta_boxes = $_original_meta_boxes; +} + +/** + * Renders the hidden form required for the meta boxes form. + * + * @since 5.0.0 + * + * @param WP_Post $post Current post object. + */ +function the_block_editor_meta_box_post_form_hidden_fields( $post ) { + $form_extra = ''; + if ( 'auto-draft' === $post->post_status ) { + $form_extra .= ""; + } + $form_action = 'editpost'; + $nonce_action = 'update-post_' . $post->ID; + $form_extra .= ""; + $referer = wp_get_referer(); + $current_user = wp_get_current_user(); + $user_id = $current_user->ID; + wp_nonce_field( $nonce_action ); + + /* + * Some meta boxes hook into these actions to add hidden input fields in the classic post form. For backwards + * compatibility, we can capture the output from these actions, and extract the hidden input fields. + */ + ob_start(); + /** This filter is documented in wp-admin/edit-form-advanced.php */ + do_action( 'edit_form_after_title', $post ); + /** This filter is documented in wp-admin/edit-form-advanced.php */ + do_action( 'edit_form_advanced', $post ); + $classic_output = ob_get_clean(); + + $classic_elements = wp_html_split( $classic_output ); + $hidden_inputs = ''; + foreach ( $classic_elements as $element ) { + if ( 0 !== strpos( $element, ' + + + + + + + + ` fields, which will be POSTed back to + * the server when meta boxes are saved. + * + * @since 5.0.0 + * + * @param WP_Post $post The post that is being edited. + */ + do_action( 'block_editor_meta_box_hidden_fields', $post ); +} diff --git a/wp-admin/includes/privacy-tools.php b/wp-admin/includes/privacy-tools.php new file mode 100644 index 0000000..2d35984 --- /dev/null +++ b/wp-admin/includes/privacy-tools.php @@ -0,0 +1,908 @@ +post_type ) { + return new WP_Error( 'privacy_request_error', __( 'Invalid request.' ) ); + } + + $result = wp_send_user_request( $request_id ); + + if ( is_wp_error( $result ) ) { + return $result; + } elseif ( ! $result ) { + return new WP_Error( 'privacy_request_error', __( 'Unable to initiate confirmation request.' ) ); + } + + return true; +} + +/** + * Marks a request as completed by the admin and logs the current timestamp. + * + * @since 4.9.6 + * @access private + * + * @param int $request_id Request ID. + * @return int|WP_Error $result Request ID on success or WP_Error. + */ +function _wp_privacy_completed_request( $request_id ) { + // Get the request. + $request_id = absint( $request_id ); + $request = wp_get_user_request( $request_id ); + + if ( ! $request ) { + return new WP_Error( 'privacy_request_error', __( 'Invalid request.' ) ); + } + + update_post_meta( $request_id, '_wp_user_request_completed_timestamp', time() ); + + $result = wp_update_post( + array( + 'ID' => $request_id, + 'post_status' => 'request-completed', + ) + ); + + return $result; +} + +/** + * Handle list table actions. + * + * @since 4.9.6 + * @access private + */ +function _wp_personal_data_handle_actions() { + if ( isset( $_POST['privacy_action_email_retry'] ) ) { + check_admin_referer( 'bulk-privacy_requests' ); + + $request_id = absint( current( array_keys( (array) wp_unslash( $_POST['privacy_action_email_retry'] ) ) ) ); + $result = _wp_privacy_resend_request( $request_id ); + + if ( is_wp_error( $result ) ) { + add_settings_error( + 'privacy_action_email_retry', + 'privacy_action_email_retry', + $result->get_error_message(), + 'error' + ); + } else { + add_settings_error( + 'privacy_action_email_retry', + 'privacy_action_email_retry', + __( 'Confirmation request sent again successfully.' ), + 'success' + ); + } + } elseif ( isset( $_POST['action'] ) ) { + $action = ! empty( $_POST['action'] ) ? sanitize_key( wp_unslash( $_POST['action'] ) ) : ''; + + switch ( $action ) { + case 'add_export_personal_data_request': + case 'add_remove_personal_data_request': + check_admin_referer( 'personal-data-request' ); + + if ( ! isset( $_POST['type_of_action'], $_POST['username_or_email_for_privacy_request'] ) ) { + add_settings_error( + 'action_type', + 'action_type', + __( 'Invalid action.' ), + 'error' + ); + } + $action_type = sanitize_text_field( wp_unslash( $_POST['type_of_action'] ) ); + $username_or_email_address = sanitize_text_field( wp_unslash( $_POST['username_or_email_for_privacy_request'] ) ); + $email_address = ''; + + if ( ! in_array( $action_type, _wp_privacy_action_request_types(), true ) ) { + add_settings_error( + 'action_type', + 'action_type', + __( 'Invalid action.' ), + 'error' + ); + } + + if ( ! is_email( $username_or_email_address ) ) { + $user = get_user_by( 'login', $username_or_email_address ); + if ( ! $user instanceof WP_User ) { + add_settings_error( + 'username_or_email_for_privacy_request', + 'username_or_email_for_privacy_request', + __( 'Unable to add this request. A valid email address or username must be supplied.' ), + 'error' + ); + } else { + $email_address = $user->user_email; + } + } else { + $email_address = $username_or_email_address; + } + + if ( empty( $email_address ) ) { + break; + } + + $request_id = wp_create_user_request( $email_address, $action_type ); + + if ( is_wp_error( $request_id ) ) { + add_settings_error( + 'username_or_email_for_privacy_request', + 'username_or_email_for_privacy_request', + $request_id->get_error_message(), + 'error' + ); + break; + } elseif ( ! $request_id ) { + add_settings_error( + 'username_or_email_for_privacy_request', + 'username_or_email_for_privacy_request', + __( 'Unable to initiate confirmation request.' ), + 'error' + ); + break; + } + + wp_send_user_request( $request_id ); + + add_settings_error( + 'username_or_email_for_privacy_request', + 'username_or_email_for_privacy_request', + __( 'Confirmation request initiated successfully.' ), + 'success' + ); + break; + } + } +} + +/** + * Cleans up failed and expired requests before displaying the list table. + * + * @since 4.9.6 + * @access private + */ +function _wp_personal_data_cleanup_requests() { + /** This filter is documented in wp-includes/user.php */ + $expires = (int) apply_filters( 'user_request_key_expiration', DAY_IN_SECONDS ); + + $requests_query = new WP_Query( + array( + 'post_type' => 'user_request', + 'posts_per_page' => -1, + 'post_status' => 'request-pending', + 'fields' => 'ids', + 'date_query' => array( + array( + 'column' => 'post_modified_gmt', + 'before' => $expires . ' seconds ago', + ), + ), + ) + ); + + $request_ids = $requests_query->posts; + + foreach ( $request_ids as $request_id ) { + wp_update_post( + array( + 'ID' => $request_id, + 'post_status' => 'request-failed', + 'post_password' => '', + ) + ); + } +} + +/** + * Generate a single group for the personal data export report. + * + * @since 4.9.6 + * @since 5.4.0 Added the `$group_id` and `$groups_count` parameters. + * + * @param array $group_data { + * The group data to render. + * + * @type string $group_label The user-facing heading for the group, e.g. 'Comments'. + * @type array $items { + * An array of group items. + * + * @type array $group_item_data { + * An array of name-value pairs for the item. + * + * @type string $name The user-facing name of an item name-value pair, e.g. 'IP Address'. + * @type string $value The user-facing value of an item data pair, e.g. '50.60.70.0'. + * } + * } + * } + * @param string $group_id The group identifier. + * @param int $groups_count The number of all groups + * @return string $group_html The HTML for this group and its items. + */ +function wp_privacy_generate_personal_data_export_group_html( $group_data, $group_id = '', $groups_count = 1 ) { + $group_id_attr = sanitize_title_with_dashes( $group_data['group_label'] . '-' . $group_id ); + + $group_html = '

        '; + $group_html .= esc_html( $group_data['group_label'] ); + + $items_count = count( (array) $group_data['items'] ); + if ( $items_count > 1 ) { + $group_html .= sprintf( ' (%d)', $items_count ); + } + + $group_html .= '

        '; + + if ( ! empty( $group_data['group_description'] ) ) { + $group_html .= '

        ' . esc_html( $group_data['group_description'] ) . '

        '; + } + + $group_html .= '
        '; + + foreach ( (array) $group_data['items'] as $group_item_id => $group_item_data ) { + $group_html .= ''; + $group_html .= ''; + + foreach ( (array) $group_item_data as $group_item_datum ) { + $value = $group_item_datum['value']; + // If it looks like a link, make it a link. + if ( false === strpos( $value, ' ' ) && ( 0 === strpos( $value, 'http://' ) || 0 === strpos( $value, 'https://' ) ) ) { + $value = '' . esc_html( $value ) . ''; + } + + $group_html .= ''; + $group_html .= ''; + $group_html .= ''; + $group_html .= ''; + } + + $group_html .= ''; + $group_html .= '
        ' . esc_html( $group_item_datum['name'] ) . '' . wp_kses( $value, 'personal_data_export' ) . '
        '; + } + + if ( 1 < $groups_count ) { + $group_html .= '
        '; + $group_html .= '' . esc_html__( '↑ Return to top' ) . ''; + $group_html .= '
        '; + } + + $group_html .= '
        '; + + return $group_html; +} + +/** + * Generate the personal data export file. + * + * @since 4.9.6 + * + * @param int $request_id The export request ID. + */ +function wp_privacy_generate_personal_data_export_file( $request_id ) { + if ( ! class_exists( 'ZipArchive' ) ) { + wp_send_json_error( __( 'Unable to generate export file. ZipArchive not available.' ) ); + } + + // Get the request. + $request = wp_get_user_request( $request_id ); + + if ( ! $request || 'export_personal_data' !== $request->action_name ) { + wp_send_json_error( __( 'Invalid request ID when generating export file.' ) ); + } + + $email_address = $request->email; + + if ( ! is_email( $email_address ) ) { + wp_send_json_error( __( 'Invalid email address when generating export file.' ) ); + } + + // Create the exports folder if needed. + $exports_dir = wp_privacy_exports_dir(); + $exports_url = wp_privacy_exports_url(); + + if ( ! wp_mkdir_p( $exports_dir ) ) { + wp_send_json_error( __( 'Unable to create export folder.' ) ); + } + + // Protect export folder from browsing. + $index_pathname = $exports_dir . 'index.html'; + if ( ! file_exists( $index_pathname ) ) { + $file = fopen( $index_pathname, 'w' ); + if ( false === $file ) { + wp_send_json_error( __( 'Unable to protect export folder from browsing.' ) ); + } + fwrite( $file, '' ); + fclose( $file ); + } + + $obscura = wp_generate_password( 32, false, false ); + $file_basename = 'wp-personal-data-file-' . $obscura; + $html_report_filename = wp_unique_filename( $exports_dir, $file_basename . '.html' ); + $html_report_pathname = wp_normalize_path( $exports_dir . $html_report_filename ); + $json_report_filename = $file_basename . '.json'; + $json_report_pathname = wp_normalize_path( $exports_dir . $json_report_filename ); + + /* + * Gather general data needed. + */ + + // Title. + $title = sprintf( + /* translators: %s: User's email address. */ + __( 'Personal Data Export for %s' ), + $email_address + ); + + // And now, all the Groups. + $groups = get_post_meta( $request_id, '_export_data_grouped', true ); + + // First, build an "About" group on the fly for this report. + $about_group = array( + /* translators: Header for the About section in a personal data export. */ + 'group_label' => _x( 'About', 'personal data group label' ), + /* translators: Description for the About section in a personal data export. */ + 'group_description' => _x( 'Overview of export report.', 'personal data group description' ), + 'items' => array( + 'about-1' => array( + array( + 'name' => _x( 'Report generated for', 'email address' ), + 'value' => $email_address, + ), + array( + 'name' => _x( 'For site', 'website name' ), + 'value' => get_bloginfo( 'name' ), + ), + array( + 'name' => _x( 'At URL', 'website URL' ), + 'value' => get_bloginfo( 'url' ), + ), + array( + 'name' => _x( 'On', 'date/time' ), + 'value' => current_time( 'mysql' ), + ), + ), + ), + ); + + // Merge in the special about group. + $groups = array_merge( array( 'about' => $about_group ), $groups ); + + $groups_count = count( $groups ); + + // Convert the groups to JSON format. + $groups_json = wp_json_encode( $groups ); + + /* + * Handle the JSON export. + */ + $file = fopen( $json_report_pathname, 'w' ); + + if ( false === $file ) { + wp_send_json_error( __( 'Unable to open export file (JSON report) for writing.' ) ); + } + + fwrite( $file, '{' ); + fwrite( $file, '"' . $title . '":' ); + fwrite( $file, $groups_json ); + fwrite( $file, '}' ); + fclose( $file ); + + /* + * Handle the HTML export. + */ + $file = fopen( $html_report_pathname, 'w' ); + + if ( false === $file ) { + wp_send_json_error( __( 'Unable to open export file (HTML report) for writing.' ) ); + } + + fwrite( $file, "\n" ); + fwrite( $file, "\n" ); + fwrite( $file, "\n" ); + fwrite( $file, "\n" ); + fwrite( $file, "' ); + fwrite( $file, '' ); + fwrite( $file, esc_html( $title ) ); + fwrite( $file, '' ); + fwrite( $file, "\n" ); + fwrite( $file, "\n" ); + fwrite( $file, '

        ' . esc_html__( 'Personal Data Export' ) . '

        ' ); + + // Create TOC. + if ( 1 < $groups_count ) { + fwrite( $file, '
        ' ); + fwrite( $file, '

        ' . esc_html__( 'Table of Contents' ) . '

        ' ); + fwrite( $file, '
          ' ); + foreach ( (array) $groups as $group_id => $group_data ) { + $group_label = esc_html( $group_data['group_label'] ); + $group_id_attr = sanitize_title_with_dashes( $group_data['group_label'] . '-' . $group_id ); + $group_items_count = count( (array) $group_data['items'] ); + if ( $group_items_count > 1 ) { + $group_label .= sprintf( ' (%d)', $group_items_count ); + } + fwrite( $file, '
        • ' ); + fwrite( $file, '' . $group_label . '' ); + fwrite( $file, '
        • ' ); + } + fwrite( $file, '
        ' ); + fwrite( $file, '
        ' ); + } + + // Now, iterate over every group in $groups and have the formatter render it in HTML. + foreach ( (array) $groups as $group_id => $group_data ) { + fwrite( $file, wp_privacy_generate_personal_data_export_group_html( $group_data, $group_id, $groups_count ) ); + } + + fwrite( $file, "\n" ); + fwrite( $file, "\n" ); + fclose( $file ); + + /* + * Now, generate the ZIP. + * + * If an archive has already been generated, then remove it and reuse the + * filename, to avoid breaking any URLs that may have been previously sent + * via email. + */ + $error = false; + $archive_url = get_post_meta( $request_id, '_export_file_url', true ); + $archive_pathname = get_post_meta( $request_id, '_export_file_path', true ); + + if ( empty( $archive_pathname ) || empty( $archive_url ) ) { + $archive_filename = $file_basename . '.zip'; + $archive_pathname = $exports_dir . $archive_filename; + $archive_url = $exports_url . $archive_filename; + + update_post_meta( $request_id, '_export_file_url', $archive_url ); + update_post_meta( $request_id, '_export_file_path', wp_normalize_path( $archive_pathname ) ); + } + + if ( ! empty( $archive_pathname ) && file_exists( $archive_pathname ) ) { + wp_delete_file( $archive_pathname ); + } + + $zip = new ZipArchive; + if ( true === $zip->open( $archive_pathname, ZipArchive::CREATE ) ) { + if ( ! $zip->addFile( $json_report_pathname, 'export.json' ) ) { + $error = __( 'Unable to add data to JSON file.' ); + } + + if ( ! $zip->addFile( $html_report_pathname, 'index.html' ) ) { + $error = __( 'Unable to add data to HTML file.' ); + } + + $zip->close(); + + if ( ! $error ) { + /** + * Fires right after all personal data has been written to the export file. + * + * @since 4.9.6 + * @since 5.4.0 Added the `$json_report_pathname` parameter. + * + * @param string $archive_pathname The full path to the export file on the filesystem. + * @param string $archive_url The URL of the archive file. + * @param string $html_report_pathname The full path to the HTML personal data report on the filesystem. + * @param int $request_id The export request ID. + * @param string $json_report_pathname The full path to the JSON personal data report on the filesystem. + */ + do_action( 'wp_privacy_personal_data_export_file_created', $archive_pathname, $archive_url, $html_report_pathname, $request_id, $json_report_pathname ); + } + } else { + $error = __( 'Unable to open export file (archive) for writing.' ); + } + + // Remove the JSON file. + unlink( $json_report_pathname ); + + // Remove the HTML file. + unlink( $html_report_pathname ); + + if ( $error ) { + wp_send_json_error( $error ); + } +} + +/** + * Send an email to the user with a link to the personal data export file + * + * @since 4.9.6 + * + * @param int $request_id The request ID for this personal data export. + * @return true|WP_Error True on success or `WP_Error` on failure. + */ +function wp_privacy_send_personal_data_export_email( $request_id ) { + // Get the request. + $request = wp_get_user_request( $request_id ); + + if ( ! $request || 'export_personal_data' !== $request->action_name ) { + return new WP_Error( 'invalid_request', __( 'Invalid request ID when sending personal data export email.' ) ); + } + + // Localize message content for user; fallback to site default for visitors. + if ( ! empty( $request->user_id ) ) { + $locale = get_user_locale( $request->user_id ); + } else { + $locale = get_locale(); + } + + $switched_locale = switch_to_locale( $locale ); + + /** This filter is documented in wp-includes/functions.php */ + $expiration = apply_filters( 'wp_privacy_export_expiration', 3 * DAY_IN_SECONDS ); + $expiration_date = date_i18n( get_option( 'date_format' ), time() + $expiration ); + + $export_file_url = get_post_meta( $request_id, '_export_file_url', true ); + $site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); + $site_url = home_url(); + + /** + * Filters the recipient of the personal data export email notification. + * Should be used with great caution to avoid sending the data export link to wrong emails. + * + * @since 5.3.0 + * + * @param string $request_email The email address of the notification recipient. + * @param WP_User_Request $request The request that is initiating the notification. + */ + $request_email = apply_filters( 'wp_privacy_personal_data_email_to', $request->email, $request ); + + $email_data = array( + 'request' => $request, + 'expiration' => $expiration, + 'expiration_date' => $expiration_date, + 'message_recipient' => $request_email, + 'export_file_url' => $export_file_url, + 'sitename' => $site_name, + 'siteurl' => $site_url, + ); + + /* translators: Personal data export notification email subject. %s: Site title. */ + $subject = sprintf( __( '[%s] Personal Data Export' ), $site_name ); + + /** + * Filters the subject of the email sent when an export request is completed. + * + * @since 5.3.0 + * + * @param string $subject The email subject. + * @param string $sitename The name of the site. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type int $expiration The time in seconds until the export file expires. + * @type string $expiration_date The localized date and time when the export file expires. + * @type string $message_recipient The address that the email will be sent to. Defaults + * to the value of `$request->email`, but can be changed + * by the `wp_privacy_personal_data_email_to` filter. + * @type string $export_file_url The export file URL. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * } + */ + $subject = apply_filters( 'wp_privacy_personal_data_email_subject', $subject, $site_name, $email_data ); + + /* translators: Do not translate EXPIRATION, LINK, SITENAME, SITEURL: those are placeholders. */ + $email_text = __( + 'Howdy, + +Your request for an export of personal data has been completed. You may +download your personal data by clicking on the link below. For privacy +and security, we will automatically delete the file on ###EXPIRATION###, +so please download it before then. + +###LINK### + +Regards, +All at ###SITENAME### +###SITEURL###' + ); + + /** + * Filters the text of the email sent with a personal data export file. + * + * The following strings have a special meaning and will get replaced dynamically: + * ###EXPIRATION### The date when the URL will be automatically deleted. + * ###LINK### URL of the personal data export file for the user. + * ###SITENAME### The name of the site. + * ###SITEURL### The URL to the site. + * + * @since 4.9.6 + * @since 5.3.0 Introduced the `$email_data` array. + * + * @param string $email_text Text in the email. + * @param int $request_id The request ID for this personal data export. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type int $expiration The time in seconds until the export file expires. + * @type string $expiration_date The localized date and time when the export file expires. + * @type string $message_recipient The address that the email will be sent to. Defaults + * to the value of `$request->email`, but can be changed + * by the `wp_privacy_personal_data_email_to` filter. + * @type string $export_file_url The export file URL. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + */ + $content = apply_filters( 'wp_privacy_personal_data_email_content', $email_text, $request_id, $email_data ); + + $content = str_replace( '###EXPIRATION###', $expiration_date, $content ); + $content = str_replace( '###LINK###', esc_url_raw( $export_file_url ), $content ); + $content = str_replace( '###EMAIL###', $request_email, $content ); + $content = str_replace( '###SITENAME###', $site_name, $content ); + $content = str_replace( '###SITEURL###', esc_url_raw( $site_url ), $content ); + + $headers = ''; + + /** + * Filters the headers of the email sent with a personal data export file. + * + * @since 5.4.0 + * + * @param string|array $headers The email headers. + * @param string $subject The email subject. + * @param string $content The email content. + * @param int $request_id The request ID. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type int $expiration The time in seconds until the export file expires. + * @type string $expiration_date The localized date and time when the export file expires. + * @type string $message_recipient The address that the email will be sent to. Defaults + * to the value of `$request->email`, but can be changed + * by the `wp_privacy_personal_data_email_to` filter. + * @type string $export_file_url The export file URL. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * } + */ + $headers = apply_filters( 'wp_privacy_personal_data_email_headers', $headers, $subject, $content, $request_id, $email_data ); + + $mail_success = wp_mail( $request_email, $subject, $content, $headers ); + + if ( $switched_locale ) { + restore_previous_locale(); + } + + if ( ! $mail_success ) { + return new WP_Error( 'privacy_email_error', __( 'Unable to send personal data export email.' ) ); + } + + return true; +} + +/** + * Intercept personal data exporter page Ajax responses in order to assemble the personal data export file. + * @see wp_privacy_personal_data_export_page + * @since 4.9.6 + * + * @param array $response The response from the personal data exporter for the given page. + * @param int $exporter_index The index of the personal data exporter. Begins at 1. + * @param string $email_address The email address of the user whose personal data this is. + * @param int $page The page of personal data for this exporter. Begins at 1. + * @param int $request_id The request ID for this personal data export. + * @param bool $send_as_email Whether the final results of the export should be emailed to the user. + * @param string $exporter_key The slug (key) of the exporter. + * @return array The filtered response. + */ +function wp_privacy_process_personal_data_export_page( $response, $exporter_index, $email_address, $page, $request_id, $send_as_email, $exporter_key ) { + /* Do some simple checks on the shape of the response from the exporter. + * If the exporter response is malformed, don't attempt to consume it - let it + * pass through to generate a warning to the user by default Ajax processing. + */ + if ( ! is_array( $response ) ) { + return $response; + } + + if ( ! array_key_exists( 'done', $response ) ) { + return $response; + } + + if ( ! array_key_exists( 'data', $response ) ) { + return $response; + } + + if ( ! is_array( $response['data'] ) ) { + return $response; + } + + // Get the request. + $request = wp_get_user_request( $request_id ); + + if ( ! $request || 'export_personal_data' !== $request->action_name ) { + wp_send_json_error( __( 'Invalid request ID when merging exporter data.' ) ); + } + + $export_data = array(); + + // First exporter, first page? Reset the report data accumulation array. + if ( 1 === $exporter_index && 1 === $page ) { + update_post_meta( $request_id, '_export_data_raw', $export_data ); + } else { + $export_data = get_post_meta( $request_id, '_export_data_raw', true ); + } + + // Now, merge the data from the exporter response into the data we have accumulated already. + $export_data = array_merge( $export_data, $response['data'] ); + update_post_meta( $request_id, '_export_data_raw', $export_data ); + + // If we are not yet on the last page of the last exporter, return now. + /** This filter is documented in wp-admin/includes/ajax-actions.php */ + $exporters = apply_filters( 'wp_privacy_personal_data_exporters', array() ); + $is_last_exporter = count( $exporters ) === $exporter_index; + $exporter_done = $response['done']; + if ( ! $is_last_exporter || ! $exporter_done ) { + return $response; + } + + // Last exporter, last page - let's prepare the export file. + + // First we need to re-organize the raw data hierarchically in groups and items. + $groups = array(); + foreach ( (array) $export_data as $export_datum ) { + $group_id = $export_datum['group_id']; + $group_label = $export_datum['group_label']; + + $group_description = ''; + if ( ! empty( $export_datum['group_description'] ) ) { + $group_description = $export_datum['group_description']; + } + + if ( ! array_key_exists( $group_id, $groups ) ) { + $groups[ $group_id ] = array( + 'group_label' => $group_label, + 'group_description' => $group_description, + 'items' => array(), + ); + } + + $item_id = $export_datum['item_id']; + if ( ! array_key_exists( $item_id, $groups[ $group_id ]['items'] ) ) { + $groups[ $group_id ]['items'][ $item_id ] = array(); + } + + $old_item_data = $groups[ $group_id ]['items'][ $item_id ]; + $merged_item_data = array_merge( $export_datum['data'], $old_item_data ); + $groups[ $group_id ]['items'][ $item_id ] = $merged_item_data; + } + + // Then save the grouped data into the request. + delete_post_meta( $request_id, '_export_data_raw' ); + update_post_meta( $request_id, '_export_data_grouped', $groups ); + + /** + * Generate the export file from the collected, grouped personal data. + * + * @since 4.9.6 + * + * @param int $request_id The export request ID. + */ + do_action( 'wp_privacy_personal_data_export_file', $request_id ); + + // Clear the grouped data now that it is no longer needed. + delete_post_meta( $request_id, '_export_data_grouped' ); + + // If the destination is email, send it now. + if ( $send_as_email ) { + $mail_success = wp_privacy_send_personal_data_export_email( $request_id ); + if ( is_wp_error( $mail_success ) ) { + wp_send_json_error( $mail_success->get_error_message() ); + } + + // Update the request to completed state when the export email is sent. + _wp_privacy_completed_request( $request_id ); + } else { + // Modify the response to include the URL of the export file so the browser can fetch it. + $export_file_url = get_post_meta( $request_id, '_export_file_url', true ); + if ( ! empty( $export_file_url ) ) { + $response['url'] = $export_file_url; + } + } + + return $response; +} + +/** + * Mark erasure requests as completed after processing is finished. + * + * This intercepts the Ajax responses to personal data eraser page requests, and + * monitors the status of a request. Once all of the processing has finished, the + * request is marked as completed. + * + * @since 4.9.6 + * + * @see wp_privacy_personal_data_erasure_page + * + * @param array $response The response from the personal data eraser for + * the given page. + * @param int $eraser_index The index of the personal data eraser. Begins + * at 1. + * @param string $email_address The email address of the user whose personal + * data this is. + * @param int $page The page of personal data for this eraser. + * Begins at 1. + * @param int $request_id The request ID for this personal data erasure. + * @return array The filtered response. + */ +function wp_privacy_process_personal_data_erasure_page( $response, $eraser_index, $email_address, $page, $request_id ) { + /* + * If the eraser response is malformed, don't attempt to consume it; let it + * pass through, so that the default Ajax processing will generate a warning + * to the user. + */ + if ( ! is_array( $response ) ) { + return $response; + } + + if ( ! array_key_exists( 'done', $response ) ) { + return $response; + } + + if ( ! array_key_exists( 'items_removed', $response ) ) { + return $response; + } + + if ( ! array_key_exists( 'items_retained', $response ) ) { + return $response; + } + + if ( ! array_key_exists( 'messages', $response ) ) { + return $response; + } + + // Get the request. + $request = wp_get_user_request( $request_id ); + + if ( ! $request || 'remove_personal_data' !== $request->action_name ) { + wp_send_json_error( __( 'Invalid request ID when processing eraser data.' ) ); + } + + /** This filter is documented in wp-admin/includes/ajax-actions.php */ + $erasers = apply_filters( 'wp_privacy_personal_data_erasers', array() ); + $is_last_eraser = count( $erasers ) === $eraser_index; + $eraser_done = $response['done']; + + if ( ! $is_last_eraser || ! $eraser_done ) { + return $response; + } + + _wp_privacy_completed_request( $request_id ); + + /** + * Fires immediately after a personal data erasure request has been marked completed. + * + * @since 4.9.6 + * + * @param int $request_id The privacy request post ID associated with this request. + */ + do_action( 'wp_privacy_personal_data_erased', $request_id ); + + return $response; +} diff --git a/wp-admin/includes/revision.php b/wp-admin/includes/revision.php new file mode 100644 index 0000000..cbf4eae --- /dev/null +++ b/wp-admin/includes/revision.php @@ -0,0 +1,464 @@ +post_parent !== $post->ID && $compare_from->ID !== $post->ID ) { + return false; + } + if ( $compare_to->post_parent !== $post->ID && $compare_to->ID !== $post->ID ) { + return false; + } + + if ( $compare_from && strtotime( $compare_from->post_date_gmt ) > strtotime( $compare_to->post_date_gmt ) ) { + $temp = $compare_from; + $compare_from = $compare_to; + $compare_to = $temp; + } + + // Add default title if title field is empty. + if ( $compare_from && empty( $compare_from->post_title ) ) { + $compare_from->post_title = __( '(no title)' ); + } + if ( empty( $compare_to->post_title ) ) { + $compare_to->post_title = __( '(no title)' ); + } + + $return = array(); + + foreach ( _wp_post_revision_fields( $post ) as $field => $name ) { + /** + * Contextually filter a post revision field. + * + * The dynamic portion of the hook name, `$field`, corresponds to each of the post + * fields of the revision object being iterated over in a foreach statement. + * + * @since 3.6.0 + * + * @param string $revision_field The current revision field to compare to or from. + * @param string $field The current revision field. + * @param WP_Post $compare_from The revision post object to compare to or from. + * @param string $context The context of whether the current revision is the old + * or the new one. Values are 'to' or 'from'. + */ + $content_from = $compare_from ? apply_filters( "_wp_post_revision_field_{$field}", $compare_from->$field, $field, $compare_from, 'from' ) : ''; + + /** This filter is documented in wp-admin/includes/revision.php */ + $content_to = apply_filters( "_wp_post_revision_field_{$field}", $compare_to->$field, $field, $compare_to, 'to' ); + + $args = array( + 'show_split_view' => true, + ); + + /** + * Filters revisions text diff options. + * + * Filters the options passed to wp_text_diff() when viewing a post revision. + * + * @since 4.1.0 + * + * @param array $args { + * Associative array of options to pass to wp_text_diff(). + * + * @type bool $show_split_view True for split view (two columns), false for + * un-split view (single column). Default true. + * } + * @param string $field The current revision field. + * @param WP_Post $compare_from The revision post to compare from. + * @param WP_Post $compare_to The revision post to compare to. + */ + $args = apply_filters( 'revision_text_diff_options', $args, $field, $compare_from, $compare_to ); + + $diff = wp_text_diff( $content_from, $content_to, $args ); + + if ( ! $diff && 'post_title' === $field ) { + // It's a better user experience to still show the Title, even if it didn't change. + // No, you didn't see this. + $diff = ''; + + // In split screen mode, show the title before/after side by side. + if ( true === $args['show_split_view'] ) { + $diff .= ''; + } else { + $diff .= ''; + + // In single column mode, only show the title once if unchanged. + if ( $compare_from->post_title !== $compare_to->post_title ) { + $diff .= ''; + } + } + + $diff .= ''; + $diff .= '
        ' . esc_html( $compare_from->post_title ) . '' . esc_html( $compare_to->post_title ) . '' . esc_html( $compare_from->post_title ) . '
        ' . esc_html( $compare_to->post_title ) . '
        '; + } + + if ( $diff ) { + $return[] = array( + 'id' => $field, + 'name' => $name, + 'diff' => $diff, + ); + } + } + + /** + * Filters the fields displayed in the post revision diff UI. + * + * @since 4.1.0 + * + * @param array[] $return Array of revision UI fields. Each item is an array of id, name, and diff. + * @param WP_Post $compare_from The revision post to compare from. + * @param WP_Post $compare_to The revision post to compare to. + */ + return apply_filters( 'wp_get_revision_ui_diff', $return, $compare_from, $compare_to ); + +} + +/** + * Prepare revisions for JavaScript. + * + * @since 3.6.0 + * + * @param WP_Post|int $post The post object or post ID. + * @param int $selected_revision_id The selected revision ID. + * @param int $from Optional. The revision ID to compare from. + * + * @return array An associative array of revision data and related settings. + */ +function wp_prepare_revisions_for_js( $post, $selected_revision_id, $from = null ) { + $post = get_post( $post ); + $authors = array(); + $now_gmt = time(); + + $revisions = wp_get_post_revisions( + $post->ID, + array( + 'order' => 'ASC', + 'check_enabled' => false, + ) + ); + // If revisions are disabled, we only want autosaves and the current post. + if ( ! wp_revisions_enabled( $post ) ) { + foreach ( $revisions as $revision_id => $revision ) { + if ( ! wp_is_post_autosave( $revision ) ) { + unset( $revisions[ $revision_id ] ); + } + } + $revisions = array( $post->ID => $post ) + $revisions; + } + + $show_avatars = get_option( 'show_avatars' ); + + cache_users( wp_list_pluck( $revisions, 'post_author' ) ); + + $can_restore = current_user_can( 'edit_post', $post->ID ); + $current_id = false; + + foreach ( $revisions as $revision ) { + $modified = strtotime( $revision->post_modified ); + $modified_gmt = strtotime( $revision->post_modified_gmt . ' +0000' ); + if ( $can_restore ) { + $restore_link = str_replace( + '&', + '&', + wp_nonce_url( + add_query_arg( + array( + 'revision' => $revision->ID, + 'action' => 'restore', + ), + admin_url( 'revision.php' ) + ), + "restore-post_{$revision->ID}" + ) + ); + } + + if ( ! isset( $authors[ $revision->post_author ] ) ) { + $authors[ $revision->post_author ] = array( + 'id' => (int) $revision->post_author, + 'avatar' => $show_avatars ? get_avatar( $revision->post_author, 32 ) : '', + 'name' => get_the_author_meta( 'display_name', $revision->post_author ), + ); + } + + $autosave = (bool) wp_is_post_autosave( $revision ); + $current = ! $autosave && $revision->post_modified_gmt === $post->post_modified_gmt; + if ( $current && ! empty( $current_id ) ) { + // If multiple revisions have the same post_modified_gmt, highest ID is current. + if ( $current_id < $revision->ID ) { + $revisions[ $current_id ]['current'] = false; + $current_id = $revision->ID; + } else { + $current = false; + } + } elseif ( $current ) { + $current_id = $revision->ID; + } + + $revisions_data = array( + 'id' => $revision->ID, + 'title' => get_the_title( $post->ID ), + 'author' => $authors[ $revision->post_author ], + 'date' => date_i18n( __( 'M j, Y @ H:i' ), $modified ), + 'dateShort' => date_i18n( _x( 'j M @ H:i', 'revision date short format' ), $modified ), + /* translators: %s: Human-readable time difference. */ + 'timeAgo' => sprintf( __( '%s ago' ), human_time_diff( $modified_gmt, $now_gmt ) ), + 'autosave' => $autosave, + 'current' => $current, + 'restoreUrl' => $can_restore ? $restore_link : false, + ); + + /** + * Filters the array of revisions used on the revisions screen. + * + * @since 4.4.0 + * + * @param array $revisions_data { + * The bootstrapped data for the revisions screen. + * + * @type int $id Revision ID. + * @type string $title Title for the revision's parent WP_Post object. + * @type int $author Revision post author ID. + * @type string $date Date the revision was modified. + * @type string $dateShort Short-form version of the date the revision was modified. + * @type string $timeAgo GMT-aware amount of time ago the revision was modified. + * @type bool $autosave Whether the revision is an autosave. + * @type bool $current Whether the revision is both not an autosave and the post + * modified date matches the revision modified date (GMT-aware). + * @type bool|false $restoreUrl URL if the revision can be restored, false otherwise. + * } + * @param WP_Post $revision The revision's WP_Post object. + * @param WP_Post $post The revision's parent WP_Post object. + */ + $revisions[ $revision->ID ] = apply_filters( 'wp_prepare_revision_for_js', $revisions_data, $revision, $post ); + } + + /** + * If we only have one revision, the initial revision is missing; This happens + * when we have an autsosave and the user has clicked 'View the Autosave' + */ + if ( 1 === sizeof( $revisions ) ) { + $revisions[ $post->ID ] = array( + 'id' => $post->ID, + 'title' => get_the_title( $post->ID ), + 'author' => $authors[ $post->post_author ], + 'date' => date_i18n( __( 'M j, Y @ H:i' ), strtotime( $post->post_modified ) ), + 'dateShort' => date_i18n( _x( 'j M @ H:i', 'revision date short format' ), strtotime( $post->post_modified ) ), + /* translators: %s: Human-readable time difference. */ + 'timeAgo' => sprintf( __( '%s ago' ), human_time_diff( strtotime( $post->post_modified_gmt ), $now_gmt ) ), + 'autosave' => false, + 'current' => true, + 'restoreUrl' => false, + ); + $current_id = $post->ID; + } + + /* + * If a post has been saved since the last revision (no revisioned fields + * were changed), we may not have a "current" revision. Mark the latest + * revision as "current". + */ + if ( empty( $current_id ) ) { + if ( $revisions[ $revision->ID ]['autosave'] ) { + $revision = end( $revisions ); + while ( $revision['autosave'] ) { + $revision = prev( $revisions ); + } + $current_id = $revision['id']; + } else { + $current_id = $revision->ID; + } + $revisions[ $current_id ]['current'] = true; + } + + // Now, grab the initial diff. + $compare_two_mode = is_numeric( $from ); + if ( ! $compare_two_mode ) { + $found = array_search( $selected_revision_id, array_keys( $revisions ) ); + if ( $found ) { + $from = array_keys( array_slice( $revisions, $found - 1, 1, true ) ); + $from = reset( $from ); + } else { + $from = 0; + } + } + + $from = absint( $from ); + + $diffs = array( + array( + 'id' => $from . ':' . $selected_revision_id, + 'fields' => wp_get_revision_ui_diff( $post->ID, $from, $selected_revision_id ), + ), + ); + + return array( + 'postId' => $post->ID, + 'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ), + 'revisionData' => array_values( $revisions ), + 'to' => $selected_revision_id, + 'from' => $from, + 'diffData' => $diffs, + 'baseUrl' => parse_url( admin_url( 'revision.php' ), PHP_URL_PATH ), + 'compareTwoMode' => absint( $compare_two_mode ), // Apparently booleans are not allowed. + 'revisionIds' => array_keys( $revisions ), + ); +} + +/** + * Print JavaScript templates required for the revisions experience. + * + * @since 4.1.0 + * + * @global WP_Post $post Global post object. + */ +function wp_print_revision_templates() { + global $post; + ?> + + + + + + + + + get_charset_collate(); + +/** + * Retrieve the SQL for creating database tables. + * + * @since 3.3.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $scope Optional. The tables for which to retrieve SQL. Can be all, global, ms_global, or blog tables. Defaults to all. + * @param int $blog_id Optional. The site ID for which to retrieve SQL. Default is the current site ID. + * @return string The SQL needed to create the requested tables. + */ +function wp_get_db_schema( $scope = 'all', $blog_id = null ) { + global $wpdb; + + $charset_collate = $wpdb->get_charset_collate(); + + if ( $blog_id && $blog_id != $wpdb->blogid ) { + $old_blog_id = $wpdb->set_blog_id( $blog_id ); + } + + // Engage multisite if in the middle of turning it on from network.php. + $is_multisite = is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ); + + /* + * Indexes have a maximum size of 767 bytes. Historically, we haven't need to be concerned about that. + * As of 4.2, however, we moved to utf8mb4, which uses 4 bytes per character. This means that an index which + * used to have room for floor(767/3) = 255 characters, now only has room for floor(767/4) = 191 characters. + */ + $max_index_length = 191; + + // Blog-specific tables. + $blog_tables = "CREATE TABLE $wpdb->termmeta ( + meta_id bigint(20) unsigned NOT NULL auto_increment, + term_id bigint(20) unsigned NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY term_id (term_id), + KEY meta_key (meta_key($max_index_length)) +) $charset_collate; +CREATE TABLE $wpdb->terms ( + term_id bigint(20) unsigned NOT NULL auto_increment, + name varchar(200) NOT NULL default '', + slug varchar(200) NOT NULL default '', + term_group bigint(10) NOT NULL default 0, + PRIMARY KEY (term_id), + KEY slug (slug($max_index_length)), + KEY name (name($max_index_length)) +) $charset_collate; +CREATE TABLE $wpdb->term_taxonomy ( + term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment, + term_id bigint(20) unsigned NOT NULL default 0, + taxonomy varchar(32) NOT NULL default '', + description longtext NOT NULL, + parent bigint(20) unsigned NOT NULL default 0, + count bigint(20) NOT NULL default 0, + PRIMARY KEY (term_taxonomy_id), + UNIQUE KEY term_id_taxonomy (term_id,taxonomy), + KEY taxonomy (taxonomy) +) $charset_collate; +CREATE TABLE $wpdb->term_relationships ( + object_id bigint(20) unsigned NOT NULL default 0, + term_taxonomy_id bigint(20) unsigned NOT NULL default 0, + term_order int(11) NOT NULL default 0, + PRIMARY KEY (object_id,term_taxonomy_id), + KEY term_taxonomy_id (term_taxonomy_id) +) $charset_collate; +CREATE TABLE $wpdb->commentmeta ( + meta_id bigint(20) unsigned NOT NULL auto_increment, + comment_id bigint(20) unsigned NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY comment_id (comment_id), + KEY meta_key (meta_key($max_index_length)) +) $charset_collate; +CREATE TABLE $wpdb->comments ( + comment_ID bigint(20) unsigned NOT NULL auto_increment, + comment_post_ID bigint(20) unsigned NOT NULL default '0', + comment_author tinytext NOT NULL, + comment_author_email varchar(100) NOT NULL default '', + comment_author_url varchar(200) NOT NULL default '', + comment_author_IP varchar(100) NOT NULL default '', + comment_date datetime NOT NULL default '0000-00-00 00:00:00', + comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00', + comment_content text NOT NULL, + comment_karma int(11) NOT NULL default '0', + comment_approved varchar(20) NOT NULL default '1', + comment_agent varchar(255) NOT NULL default '', + comment_type varchar(20) NOT NULL default '', + comment_parent bigint(20) unsigned NOT NULL default '0', + user_id bigint(20) unsigned NOT NULL default '0', + PRIMARY KEY (comment_ID), + KEY comment_post_ID (comment_post_ID), + KEY comment_approved_date_gmt (comment_approved,comment_date_gmt), + KEY comment_date_gmt (comment_date_gmt), + KEY comment_parent (comment_parent), + KEY comment_author_email (comment_author_email(10)) +) $charset_collate; +CREATE TABLE $wpdb->links ( + link_id bigint(20) unsigned NOT NULL auto_increment, + link_url varchar(255) NOT NULL default '', + link_name varchar(255) NOT NULL default '', + link_image varchar(255) NOT NULL default '', + link_target varchar(25) NOT NULL default '', + link_description varchar(255) NOT NULL default '', + link_visible varchar(20) NOT NULL default 'Y', + link_owner bigint(20) unsigned NOT NULL default '1', + link_rating int(11) NOT NULL default '0', + link_updated datetime NOT NULL default '0000-00-00 00:00:00', + link_rel varchar(255) NOT NULL default '', + link_notes mediumtext NOT NULL, + link_rss varchar(255) NOT NULL default '', + PRIMARY KEY (link_id), + KEY link_visible (link_visible) +) $charset_collate; +CREATE TABLE $wpdb->options ( + option_id bigint(20) unsigned NOT NULL auto_increment, + option_name varchar(191) NOT NULL default '', + option_value longtext NOT NULL, + autoload varchar(20) NOT NULL default 'yes', + PRIMARY KEY (option_id), + UNIQUE KEY option_name (option_name), + KEY autoload (autoload) +) $charset_collate; +CREATE TABLE $wpdb->postmeta ( + meta_id bigint(20) unsigned NOT NULL auto_increment, + post_id bigint(20) unsigned NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY post_id (post_id), + KEY meta_key (meta_key($max_index_length)) +) $charset_collate; +CREATE TABLE $wpdb->posts ( + ID bigint(20) unsigned NOT NULL auto_increment, + post_author bigint(20) unsigned NOT NULL default '0', + post_date datetime NOT NULL default '0000-00-00 00:00:00', + post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00', + post_content longtext NOT NULL, + post_title text NOT NULL, + post_excerpt text NOT NULL, + post_status varchar(20) NOT NULL default 'publish', + comment_status varchar(20) NOT NULL default 'open', + ping_status varchar(20) NOT NULL default 'open', + post_password varchar(255) NOT NULL default '', + post_name varchar(200) NOT NULL default '', + to_ping text NOT NULL, + pinged text NOT NULL, + post_modified datetime NOT NULL default '0000-00-00 00:00:00', + post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00', + post_content_filtered longtext NOT NULL, + post_parent bigint(20) unsigned NOT NULL default '0', + guid varchar(255) NOT NULL default '', + menu_order int(11) NOT NULL default '0', + post_type varchar(20) NOT NULL default 'post', + post_mime_type varchar(100) NOT NULL default '', + comment_count bigint(20) NOT NULL default '0', + PRIMARY KEY (ID), + KEY post_name (post_name($max_index_length)), + KEY type_status_date (post_type,post_status,post_date,ID), + KEY post_parent (post_parent), + KEY post_author (post_author) +) $charset_collate;\n"; + + // Single site users table. The multisite flavor of the users table is handled below. + $users_single_table = "CREATE TABLE $wpdb->users ( + ID bigint(20) unsigned NOT NULL auto_increment, + user_login varchar(60) NOT NULL default '', + user_pass varchar(255) NOT NULL default '', + user_nicename varchar(50) NOT NULL default '', + user_email varchar(100) NOT NULL default '', + user_url varchar(100) NOT NULL default '', + user_registered datetime NOT NULL default '0000-00-00 00:00:00', + user_activation_key varchar(255) NOT NULL default '', + user_status int(11) NOT NULL default '0', + display_name varchar(250) NOT NULL default '', + PRIMARY KEY (ID), + KEY user_login_key (user_login), + KEY user_nicename (user_nicename), + KEY user_email (user_email) +) $charset_collate;\n"; + + // Multisite users table. + $users_multi_table = "CREATE TABLE $wpdb->users ( + ID bigint(20) unsigned NOT NULL auto_increment, + user_login varchar(60) NOT NULL default '', + user_pass varchar(255) NOT NULL default '', + user_nicename varchar(50) NOT NULL default '', + user_email varchar(100) NOT NULL default '', + user_url varchar(100) NOT NULL default '', + user_registered datetime NOT NULL default '0000-00-00 00:00:00', + user_activation_key varchar(255) NOT NULL default '', + user_status int(11) NOT NULL default '0', + display_name varchar(250) NOT NULL default '', + spam tinyint(2) NOT NULL default '0', + deleted tinyint(2) NOT NULL default '0', + PRIMARY KEY (ID), + KEY user_login_key (user_login), + KEY user_nicename (user_nicename), + KEY user_email (user_email) +) $charset_collate;\n"; + + // Usermeta. + $usermeta_table = "CREATE TABLE $wpdb->usermeta ( + umeta_id bigint(20) unsigned NOT NULL auto_increment, + user_id bigint(20) unsigned NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (umeta_id), + KEY user_id (user_id), + KEY meta_key (meta_key($max_index_length)) +) $charset_collate;\n"; + + // Global tables. + if ( $is_multisite ) { + $global_tables = $users_multi_table . $usermeta_table; + } else { + $global_tables = $users_single_table . $usermeta_table; + } + + // Multisite global tables. + $ms_global_tables = "CREATE TABLE $wpdb->blogs ( + blog_id bigint(20) NOT NULL auto_increment, + site_id bigint(20) NOT NULL default '0', + domain varchar(200) NOT NULL default '', + path varchar(100) NOT NULL default '', + registered datetime NOT NULL default '0000-00-00 00:00:00', + last_updated datetime NOT NULL default '0000-00-00 00:00:00', + public tinyint(2) NOT NULL default '1', + archived tinyint(2) NOT NULL default '0', + mature tinyint(2) NOT NULL default '0', + spam tinyint(2) NOT NULL default '0', + deleted tinyint(2) NOT NULL default '0', + lang_id int(11) NOT NULL default '0', + PRIMARY KEY (blog_id), + KEY domain (domain(50),path(5)), + KEY lang_id (lang_id) +) $charset_collate; +CREATE TABLE $wpdb->blogmeta ( + meta_id bigint(20) unsigned NOT NULL auto_increment, + blog_id bigint(20) NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY meta_key (meta_key($max_index_length)), + KEY blog_id (blog_id) +) $charset_collate; +CREATE TABLE $wpdb->registration_log ( + ID bigint(20) NOT NULL auto_increment, + email varchar(255) NOT NULL default '', + IP varchar(30) NOT NULL default '', + blog_id bigint(20) NOT NULL default '0', + date_registered datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (ID), + KEY IP (IP) +) $charset_collate; +CREATE TABLE $wpdb->site ( + id bigint(20) NOT NULL auto_increment, + domain varchar(200) NOT NULL default '', + path varchar(100) NOT NULL default '', + PRIMARY KEY (id), + KEY domain (domain(140),path(51)) +) $charset_collate; +CREATE TABLE $wpdb->sitemeta ( + meta_id bigint(20) NOT NULL auto_increment, + site_id bigint(20) NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY meta_key (meta_key($max_index_length)), + KEY site_id (site_id) +) $charset_collate; +CREATE TABLE $wpdb->signups ( + signup_id bigint(20) NOT NULL auto_increment, + domain varchar(200) NOT NULL default '', + path varchar(100) NOT NULL default '', + title longtext NOT NULL, + user_login varchar(60) NOT NULL default '', + user_email varchar(100) NOT NULL default '', + registered datetime NOT NULL default '0000-00-00 00:00:00', + activated datetime NOT NULL default '0000-00-00 00:00:00', + active tinyint(1) NOT NULL default '0', + activation_key varchar(50) NOT NULL default '', + meta longtext, + PRIMARY KEY (signup_id), + KEY activation_key (activation_key), + KEY user_email (user_email), + KEY user_login_email (user_login,user_email), + KEY domain_path (domain(140),path(51)) +) $charset_collate;"; + + switch ( $scope ) { + case 'blog': + $queries = $blog_tables; + break; + case 'global': + $queries = $global_tables; + if ( $is_multisite ) { + $queries .= $ms_global_tables; + } + break; + case 'ms_global': + $queries = $ms_global_tables; + break; + case 'all': + default: + $queries = $global_tables . $blog_tables; + if ( $is_multisite ) { + $queries .= $ms_global_tables; + } + break; + } + + if ( isset( $old_blog_id ) ) { + $wpdb->set_blog_id( $old_blog_id ); + } + + return $queries; +} + +// Populate for back compat. +$wp_queries = wp_get_db_schema( 'all' ); + +/** + * Create WordPress options and set the default values. + * + * @since 1.5.0 + * @since 5.1.0 The $options parameter has been added. + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global int $wp_db_version WordPress database version. + * @global int $wp_current_db_version The old (current) database version. + * + * @param array $options Optional. Custom option $key => $value pairs to use. Default empty array. + */ +function populate_options( array $options = array() ) { + global $wpdb, $wp_db_version, $wp_current_db_version; + + $guessurl = wp_guess_url(); + /** + * Fires before creating WordPress options and populating their default values. + * + * @since 2.6.0 + */ + do_action( 'populate_options' ); + + if ( ini_get( 'safe_mode' ) ) { + // Safe mode can break mkdir() so use a flat structure by default. + $uploads_use_yearmonth_folders = 0; + } else { + $uploads_use_yearmonth_folders = 1; + } + + // If WP_DEFAULT_THEME doesn't exist, fall back to the latest core default theme. + $stylesheet = WP_DEFAULT_THEME; + $template = WP_DEFAULT_THEME; + $theme = wp_get_theme( WP_DEFAULT_THEME ); + if ( ! $theme->exists() ) { + $theme = WP_Theme::get_core_default_theme(); + } + + // If we can't find a core default theme, WP_DEFAULT_THEME is the best we can do. + if ( $theme ) { + $stylesheet = $theme->get_stylesheet(); + $template = $theme->get_template(); + } + + $timezone_string = ''; + $gmt_offset = 0; + /* + * translators: default GMT offset or timezone string. Must be either a valid offset (-12 to 14) + * or a valid timezone string (America/New_York). See https://www.php.net/manual/en/timezones.php + * for all timezone strings supported by PHP. + */ + $offset_or_tz = _x( '0', 'default GMT offset or timezone string' ); // phpcs:ignore WordPress.WP.I18n.NoEmptyStrings + if ( is_numeric( $offset_or_tz ) ) { + $gmt_offset = $offset_or_tz; + } elseif ( $offset_or_tz && in_array( $offset_or_tz, timezone_identifiers_list() ) ) { + $timezone_string = $offset_or_tz; + } + + $defaults = array( + 'siteurl' => $guessurl, + 'home' => $guessurl, + 'blogname' => __( 'My Site' ), + /* translators: Site tagline. */ + 'blogdescription' => __( 'Just another WordPress site' ), + 'users_can_register' => 0, + 'admin_email' => 'you@example.com', + /* translators: Default start of the week. 0 = Sunday, 1 = Monday. */ + 'start_of_week' => _x( '1', 'start of week' ), + 'use_balanceTags' => 0, + 'use_smilies' => 1, + 'require_name_email' => 1, + 'comments_notify' => 1, + 'posts_per_rss' => 10, + 'rss_use_excerpt' => 0, + 'mailserver_url' => 'mail.example.com', + 'mailserver_login' => 'login@example.com', + 'mailserver_pass' => 'password', + 'mailserver_port' => 110, + 'default_category' => 1, + 'default_comment_status' => 'open', + 'default_ping_status' => 'open', + 'default_pingback_flag' => 1, + 'posts_per_page' => 10, + /* translators: Default date format, see https://www.php.net/date */ + 'date_format' => __( 'F j, Y' ), + /* translators: Default time format, see https://www.php.net/date */ + 'time_format' => __( 'g:i a' ), + /* translators: Links last updated date format, see https://www.php.net/date */ + 'links_updated_date_format' => __( 'F j, Y g:i a' ), + 'comment_moderation' => 0, + 'moderation_notify' => 1, + 'permalink_structure' => '', + 'rewrite_rules' => '', + 'hack_file' => 0, + 'blog_charset' => 'UTF-8', + 'moderation_keys' => '', + 'active_plugins' => array(), + 'category_base' => '', + 'ping_sites' => 'http://rpc.pingomatic.com/', + 'comment_max_links' => 2, + 'gmt_offset' => $gmt_offset, + + // 1.5 + 'default_email_category' => 1, + 'recently_edited' => '', + 'template' => $template, + 'stylesheet' => $stylesheet, + 'comment_whitelist' => 1, + 'blacklist_keys' => '', + 'comment_registration' => 0, + 'html_type' => 'text/html', + + // 1.5.1 + 'use_trackback' => 0, + + // 2.0 + 'default_role' => 'subscriber', + 'db_version' => $wp_db_version, + + // 2.0.1 + 'uploads_use_yearmonth_folders' => $uploads_use_yearmonth_folders, + 'upload_path' => '', + + // 2.1 + 'blog_public' => '1', + 'default_link_category' => 2, + 'show_on_front' => 'posts', + + // 2.2 + 'tag_base' => '', + + // 2.5 + 'show_avatars' => '1', + 'avatar_rating' => 'G', + 'upload_url_path' => '', + 'thumbnail_size_w' => 150, + 'thumbnail_size_h' => 150, + 'thumbnail_crop' => 1, + 'medium_size_w' => 300, + 'medium_size_h' => 300, + + // 2.6 + 'avatar_default' => 'mystery', + + // 2.7 + 'large_size_w' => 1024, + 'large_size_h' => 1024, + 'image_default_link_type' => 'none', + 'image_default_size' => '', + 'image_default_align' => '', + 'close_comments_for_old_posts' => 0, + 'close_comments_days_old' => 14, + 'thread_comments' => 1, + 'thread_comments_depth' => 5, + 'page_comments' => 0, + 'comments_per_page' => 50, + 'default_comments_page' => 'newest', + 'comment_order' => 'asc', + 'sticky_posts' => array(), + 'widget_categories' => array(), + 'widget_text' => array(), + 'widget_rss' => array(), + 'uninstall_plugins' => array(), + + // 2.8 + 'timezone_string' => $timezone_string, + + // 3.0 + 'page_for_posts' => 0, + 'page_on_front' => 0, + + // 3.1 + 'default_post_format' => 0, + + // 3.5 + 'link_manager_enabled' => 0, + + // 4.3.0 + 'finished_splitting_shared_terms' => 1, + 'site_icon' => 0, + + // 4.4.0 + 'medium_large_size_w' => 768, + 'medium_large_size_h' => 0, + + // 4.9.6 + 'wp_page_for_privacy_policy' => 0, + + // 4.9.8 + 'show_comments_cookies_opt_in' => 1, + + // 5.3.0 + 'admin_email_lifespan' => ( time() + 6 * MONTH_IN_SECONDS ), + ); + + // 3.3 + if ( ! is_multisite() ) { + $defaults['initial_db_version'] = ! empty( $wp_current_db_version ) && $wp_current_db_version < $wp_db_version + ? $wp_current_db_version : $wp_db_version; + } + + // 3.0 multisite. + if ( is_multisite() ) { + /* translators: %s: Network title. */ + $defaults['blogdescription'] = sprintf( __( 'Just another %s site' ), get_network()->site_name ); + $defaults['permalink_structure'] = '/%year%/%monthnum%/%day%/%postname%/'; + } + + $options = wp_parse_args( $options, $defaults ); + + // Set autoload to no for these options. + $fat_options = array( 'moderation_keys', 'recently_edited', 'blacklist_keys', 'uninstall_plugins' ); + + $keys = "'" . implode( "', '", array_keys( $options ) ) . "'"; + $existing_options = $wpdb->get_col( "SELECT option_name FROM $wpdb->options WHERE option_name in ( $keys )" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + + $insert = ''; + foreach ( $options as $option => $value ) { + if ( in_array( $option, $existing_options ) ) { + continue; + } + if ( in_array( $option, $fat_options ) ) { + $autoload = 'no'; + } else { + $autoload = 'yes'; + } + + if ( is_array( $value ) ) { + $value = serialize( $value ); + } + if ( ! empty( $insert ) ) { + $insert .= ', '; + } + $insert .= $wpdb->prepare( '(%s, %s, %s)', $option, $value, $autoload ); + } + + if ( ! empty( $insert ) ) { + $wpdb->query( "INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + } + + // In case it is set, but blank, update "home". + if ( ! __get_option( 'home' ) ) { + update_option( 'home', $guessurl ); + } + + // Delete unused options. + $unusedoptions = array( + 'blodotgsping_url', + 'bodyterminator', + 'emailtestonly', + 'phoneemail_separator', + 'smilies_directory', + 'subjectprefix', + 'use_bbcode', + 'use_blodotgsping', + 'use_phoneemail', + 'use_quicktags', + 'use_weblogsping', + 'weblogs_cache_file', + 'use_preview', + 'use_htmltrans', + 'smilies_directory', + 'fileupload_allowedusers', + 'use_phoneemail', + 'default_post_status', + 'default_post_category', + 'archive_mode', + 'time_difference', + 'links_minadminlevel', + 'links_use_adminlevels', + 'links_rating_type', + 'links_rating_char', + 'links_rating_ignore_zero', + 'links_rating_single_image', + 'links_rating_image0', + 'links_rating_image1', + 'links_rating_image2', + 'links_rating_image3', + 'links_rating_image4', + 'links_rating_image5', + 'links_rating_image6', + 'links_rating_image7', + 'links_rating_image8', + 'links_rating_image9', + 'links_recently_updated_time', + 'links_recently_updated_prepend', + 'links_recently_updated_append', + 'weblogs_cacheminutes', + 'comment_allowed_tags', + 'search_engine_friendly_urls', + 'default_geourl_lat', + 'default_geourl_lon', + 'use_default_geourl', + 'weblogs_xml_url', + 'new_users_can_blog', + '_wpnonce', + '_wp_http_referer', + 'Update', + 'action', + 'rich_editing', + 'autosave_interval', + 'deactivated_plugins', + 'can_compress_scripts', + 'page_uris', + 'update_core', + 'update_plugins', + 'update_themes', + 'doing_cron', + 'random_seed', + 'rss_excerpt_length', + 'secret', + 'use_linksupdate', + 'default_comment_status_page', + 'wporg_popular_tags', + 'what_to_show', + 'rss_language', + 'language', + 'enable_xmlrpc', + 'enable_app', + 'embed_autourls', + 'default_post_edit_rows', + 'gzipcompression', + 'advanced_edit', + ); + foreach ( $unusedoptions as $option ) { + delete_option( $option ); + } + + // Delete obsolete magpie stuff. + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'" ); + + // Clear expired transients. + delete_expired_transients( true ); +} + +/** + * Execute WordPress role creation for the various WordPress versions. + * + * @since 2.0.0 + */ +function populate_roles() { + populate_roles_160(); + populate_roles_210(); + populate_roles_230(); + populate_roles_250(); + populate_roles_260(); + populate_roles_270(); + populate_roles_280(); + populate_roles_300(); +} + +/** + * Create the roles for WordPress 2.0 + * + * @since 2.0.0 + */ +function populate_roles_160() { + // Add roles. + add_role( 'administrator', 'Administrator' ); + add_role( 'editor', 'Editor' ); + add_role( 'author', 'Author' ); + add_role( 'contributor', 'Contributor' ); + add_role( 'subscriber', 'Subscriber' ); + + // Add caps for Administrator role. + $role = get_role( 'administrator' ); + $role->add_cap( 'switch_themes' ); + $role->add_cap( 'edit_themes' ); + $role->add_cap( 'activate_plugins' ); + $role->add_cap( 'edit_plugins' ); + $role->add_cap( 'edit_users' ); + $role->add_cap( 'edit_files' ); + $role->add_cap( 'manage_options' ); + $role->add_cap( 'moderate_comments' ); + $role->add_cap( 'manage_categories' ); + $role->add_cap( 'manage_links' ); + $role->add_cap( 'upload_files' ); + $role->add_cap( 'import' ); + $role->add_cap( 'unfiltered_html' ); + $role->add_cap( 'edit_posts' ); + $role->add_cap( 'edit_others_posts' ); + $role->add_cap( 'edit_published_posts' ); + $role->add_cap( 'publish_posts' ); + $role->add_cap( 'edit_pages' ); + $role->add_cap( 'read' ); + $role->add_cap( 'level_10' ); + $role->add_cap( 'level_9' ); + $role->add_cap( 'level_8' ); + $role->add_cap( 'level_7' ); + $role->add_cap( 'level_6' ); + $role->add_cap( 'level_5' ); + $role->add_cap( 'level_4' ); + $role->add_cap( 'level_3' ); + $role->add_cap( 'level_2' ); + $role->add_cap( 'level_1' ); + $role->add_cap( 'level_0' ); + + // Add caps for Editor role. + $role = get_role( 'editor' ); + $role->add_cap( 'moderate_comments' ); + $role->add_cap( 'manage_categories' ); + $role->add_cap( 'manage_links' ); + $role->add_cap( 'upload_files' ); + $role->add_cap( 'unfiltered_html' ); + $role->add_cap( 'edit_posts' ); + $role->add_cap( 'edit_others_posts' ); + $role->add_cap( 'edit_published_posts' ); + $role->add_cap( 'publish_posts' ); + $role->add_cap( 'edit_pages' ); + $role->add_cap( 'read' ); + $role->add_cap( 'level_7' ); + $role->add_cap( 'level_6' ); + $role->add_cap( 'level_5' ); + $role->add_cap( 'level_4' ); + $role->add_cap( 'level_3' ); + $role->add_cap( 'level_2' ); + $role->add_cap( 'level_1' ); + $role->add_cap( 'level_0' ); + + // Add caps for Author role. + $role = get_role( 'author' ); + $role->add_cap( 'upload_files' ); + $role->add_cap( 'edit_posts' ); + $role->add_cap( 'edit_published_posts' ); + $role->add_cap( 'publish_posts' ); + $role->add_cap( 'read' ); + $role->add_cap( 'level_2' ); + $role->add_cap( 'level_1' ); + $role->add_cap( 'level_0' ); + + // Add caps for Contributor role. + $role = get_role( 'contributor' ); + $role->add_cap( 'edit_posts' ); + $role->add_cap( 'read' ); + $role->add_cap( 'level_1' ); + $role->add_cap( 'level_0' ); + + // Add caps for Subscriber role. + $role = get_role( 'subscriber' ); + $role->add_cap( 'read' ); + $role->add_cap( 'level_0' ); +} + +/** + * Create and modify WordPress roles for WordPress 2.1. + * + * @since 2.1.0 + */ +function populate_roles_210() { + $roles = array( 'administrator', 'editor' ); + foreach ( $roles as $role ) { + $role = get_role( $role ); + if ( empty( $role ) ) { + continue; + } + + $role->add_cap( 'edit_others_pages' ); + $role->add_cap( 'edit_published_pages' ); + $role->add_cap( 'publish_pages' ); + $role->add_cap( 'delete_pages' ); + $role->add_cap( 'delete_others_pages' ); + $role->add_cap( 'delete_published_pages' ); + $role->add_cap( 'delete_posts' ); + $role->add_cap( 'delete_others_posts' ); + $role->add_cap( 'delete_published_posts' ); + $role->add_cap( 'delete_private_posts' ); + $role->add_cap( 'edit_private_posts' ); + $role->add_cap( 'read_private_posts' ); + $role->add_cap( 'delete_private_pages' ); + $role->add_cap( 'edit_private_pages' ); + $role->add_cap( 'read_private_pages' ); + } + + $role = get_role( 'administrator' ); + if ( ! empty( $role ) ) { + $role->add_cap( 'delete_users' ); + $role->add_cap( 'create_users' ); + } + + $role = get_role( 'author' ); + if ( ! empty( $role ) ) { + $role->add_cap( 'delete_posts' ); + $role->add_cap( 'delete_published_posts' ); + } + + $role = get_role( 'contributor' ); + if ( ! empty( $role ) ) { + $role->add_cap( 'delete_posts' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.3. + * + * @since 2.3.0 + */ +function populate_roles_230() { + $role = get_role( 'administrator' ); + + if ( ! empty( $role ) ) { + $role->add_cap( 'unfiltered_upload' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.5. + * + * @since 2.5.0 + */ +function populate_roles_250() { + $role = get_role( 'administrator' ); + + if ( ! empty( $role ) ) { + $role->add_cap( 'edit_dashboard' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.6. + * + * @since 2.6.0 + */ +function populate_roles_260() { + $role = get_role( 'administrator' ); + + if ( ! empty( $role ) ) { + $role->add_cap( 'update_plugins' ); + $role->add_cap( 'delete_plugins' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.7. + * + * @since 2.7.0 + */ +function populate_roles_270() { + $role = get_role( 'administrator' ); + + if ( ! empty( $role ) ) { + $role->add_cap( 'install_plugins' ); + $role->add_cap( 'update_themes' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.8. + * + * @since 2.8.0 + */ +function populate_roles_280() { + $role = get_role( 'administrator' ); + + if ( ! empty( $role ) ) { + $role->add_cap( 'install_themes' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 3.0. + * + * @since 3.0.0 + */ +function populate_roles_300() { + $role = get_role( 'administrator' ); + + if ( ! empty( $role ) ) { + $role->add_cap( 'update_core' ); + $role->add_cap( 'list_users' ); + $role->add_cap( 'remove_users' ); + $role->add_cap( 'promote_users' ); + $role->add_cap( 'edit_theme_options' ); + $role->add_cap( 'delete_themes' ); + $role->add_cap( 'export' ); + } +} + +if ( ! function_exists( 'install_network' ) ) : + /** + * Install Network. + * + * @since 3.0.0 + */ + function install_network() { + if ( ! defined( 'WP_INSTALLING_NETWORK' ) ) { + define( 'WP_INSTALLING_NETWORK', true ); + } + + dbDelta( wp_get_db_schema( 'global' ) ); + } +endif; + +/** + * Populate network settings. + * + * @since 3.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global object $current_site + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * + * @param int $network_id ID of network to populate. + * @param string $domain The domain name for the network (eg. "example.com"). + * @param string $email Email address for the network administrator. + * @param string $site_name The name of the network. + * @param string $path Optional. The path to append to the network's domain name. Default '/'. + * @param bool $subdomain_install Optional. Whether the network is a subdomain installation or a subdirectory installation. + * Default false, meaning the network is a subdirectory installation. + * @return bool|WP_Error True on success, or WP_Error on warning (with the installation otherwise successful, + * so the error code must be checked) or failure. + */ +function populate_network( $network_id = 1, $domain = '', $email = '', $site_name = '', $path = '/', $subdomain_install = false ) { + global $wpdb, $current_site, $wp_rewrite; + + $errors = new WP_Error(); + if ( '' == $domain ) { + $errors->add( 'empty_domain', __( 'You must provide a domain name.' ) ); + } + if ( '' == $site_name ) { + $errors->add( 'empty_sitename', __( 'You must provide a name for your network of sites.' ) ); + } + + // Check for network collision. + $network_exists = false; + if ( is_multisite() ) { + if ( get_network( (int) $network_id ) ) { + $errors->add( 'siteid_exists', __( 'The network already exists.' ) ); + } + } else { + if ( $network_id == $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $wpdb->site WHERE id = %d", $network_id ) ) ) { + $errors->add( 'siteid_exists', __( 'The network already exists.' ) ); + } + } + + if ( ! is_email( $email ) ) { + $errors->add( 'invalid_email', __( 'You must provide a valid email address.' ) ); + } + + if ( $errors->has_errors() ) { + return $errors; + } + + if ( 1 == $network_id ) { + $wpdb->insert( + $wpdb->site, + array( + 'domain' => $domain, + 'path' => $path, + ) + ); + $network_id = $wpdb->insert_id; + } else { + $wpdb->insert( + $wpdb->site, + array( + 'domain' => $domain, + 'path' => $path, + 'id' => $network_id, + ) + ); + } + + populate_network_meta( + $network_id, + array( + 'admin_email' => $email, + 'site_name' => $site_name, + 'subdomain_install' => $subdomain_install, + ) + ); + + $site_user = get_userdata( (int) $wpdb->get_var( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", 'admin_user_id', $network_id ) ) ); + + /* + * When upgrading from single to multisite, assume the current site will + * become the main site of the network. When using populate_network() + * to create another network in an existing multisite environment, skip + * these steps since the main site of the new network has not yet been + * created. + */ + if ( ! is_multisite() ) { + $current_site = new stdClass; + $current_site->domain = $domain; + $current_site->path = $path; + $current_site->site_name = ucfirst( $domain ); + $wpdb->insert( + $wpdb->blogs, + array( + 'site_id' => $network_id, + 'blog_id' => 1, + 'domain' => $domain, + 'path' => $path, + 'registered' => current_time( 'mysql' ), + ) + ); + $current_site->blog_id = $wpdb->insert_id; + update_user_meta( $site_user->ID, 'source_domain', $domain ); + update_user_meta( $site_user->ID, 'primary_blog', $current_site->blog_id ); + + if ( $subdomain_install ) { + $wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%day%/%postname%/' ); + } else { + $wp_rewrite->set_permalink_structure( '/blog/%year%/%monthnum%/%day%/%postname%/' ); + } + + flush_rewrite_rules(); + + if ( ! $subdomain_install ) { + return true; + } + + $vhost_ok = false; + $errstr = ''; + $hostname = substr( md5( time() ), 0, 6 ) . '.' . $domain; // Very random hostname! + $page = wp_remote_get( + 'http://' . $hostname, + array( + 'timeout' => 5, + 'httpversion' => '1.1', + ) + ); + if ( is_wp_error( $page ) ) { + $errstr = $page->get_error_message(); + } elseif ( 200 == wp_remote_retrieve_response_code( $page ) ) { + $vhost_ok = true; + } + + if ( ! $vhost_ok ) { + $msg = '

        ' . __( 'Warning! Wildcard DNS may not be configured correctly!' ) . '

        '; + + $msg .= '

        ' . sprintf( + /* translators: %s: Host name. */ + __( 'The installer attempted to contact a random hostname (%s) on your domain.' ), + '' . $hostname . '' + ); + if ( ! empty( $errstr ) ) { + /* translators: %s: Error message. */ + $msg .= ' ' . sprintf( __( 'This resulted in an error message: %s' ), '' . $errstr . '' ); + } + $msg .= '

        '; + + $msg .= '

        ' . sprintf( + /* translators: %s: Asterisk symbol (*). */ + __( 'To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a %s hostname record pointing at your web server in your DNS configuration tool.' ), + '*' + ) . '

        '; + + $msg .= '

        ' . __( 'You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message.' ) . '

        '; + + return new WP_Error( 'no_wildcard_dns', $msg ); + } + } + + return true; +} + +/** + * Creates WordPress network meta and sets the default values. + * + * @since 5.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global int $wp_db_version WordPress database version. + * + * @param int $network_id Network ID to populate meta for. + * @param array $meta Optional. Custom meta $key => $value pairs to use. Default empty array. + */ +function populate_network_meta( $network_id, array $meta = array() ) { + global $wpdb, $wp_db_version; + + $network_id = (int) $network_id; + + $email = ! empty( $meta['admin_email'] ) ? $meta['admin_email'] : ''; + $subdomain_install = isset( $meta['subdomain_install'] ) ? (int) $meta['subdomain_install'] : 0; + + // If a user with the provided email does not exist, default to the current user as the new network admin. + $site_user = ! empty( $email ) ? get_user_by( 'email', $email ) : false; + if ( false === $site_user ) { + $site_user = wp_get_current_user(); + } + + if ( empty( $email ) ) { + $email = $site_user->user_email; + } + + $template = get_option( 'template' ); + $stylesheet = get_option( 'stylesheet' ); + $allowed_themes = array( $stylesheet => true ); + + if ( $template != $stylesheet ) { + $allowed_themes[ $template ] = true; + } + + if ( WP_DEFAULT_THEME != $stylesheet && WP_DEFAULT_THEME != $template ) { + $allowed_themes[ WP_DEFAULT_THEME ] = true; + } + + // If WP_DEFAULT_THEME doesn't exist, also whitelist the latest core default theme. + if ( ! wp_get_theme( WP_DEFAULT_THEME )->exists() ) { + $core_default = WP_Theme::get_core_default_theme(); + if ( $core_default ) { + $allowed_themes[ $core_default->get_stylesheet() ] = true; + } + } + + if ( function_exists( 'clean_network_cache' ) ) { + clean_network_cache( $network_id ); + } else { + wp_cache_delete( $network_id, 'networks' ); + } + + wp_cache_delete( 'networks_have_paths', 'site-options' ); + + if ( ! is_multisite() ) { + $site_admins = array( $site_user->user_login ); + $users = get_users( + array( + 'fields' => array( 'user_login' ), + 'role' => 'administrator', + ) + ); + if ( $users ) { + foreach ( $users as $user ) { + $site_admins[] = $user->user_login; + } + + $site_admins = array_unique( $site_admins ); + } + } else { + $site_admins = get_site_option( 'site_admins' ); + } + + /* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */ + $welcome_email = __( + 'Howdy USERNAME, + +Your new SITE_NAME site has been successfully set up at: +BLOG_URL + +You can log in to the administrator account with the following information: + +Username: USERNAME +Password: PASSWORD +Log in here: BLOG_URLwp-login.php + +We hope you enjoy your new site. Thanks! + +--The Team @ SITE_NAME' + ); + + $misc_exts = array( + // Images. + 'jpg', + 'jpeg', + 'png', + 'gif', + // Video. + 'mov', + 'avi', + 'mpg', + '3gp', + '3g2', + // "audio". + 'midi', + 'mid', + // Miscellaneous. + 'pdf', + 'doc', + 'ppt', + 'odt', + 'pptx', + 'docx', + 'pps', + 'ppsx', + 'xls', + 'xlsx', + 'key', + ); + $audio_exts = wp_get_audio_extensions(); + $video_exts = wp_get_video_extensions(); + $upload_filetypes = array_unique( array_merge( $misc_exts, $audio_exts, $video_exts ) ); + + $sitemeta = array( + 'site_name' => __( 'My Network' ), + 'admin_email' => $email, + 'admin_user_id' => $site_user->ID, + 'registration' => 'none', + 'upload_filetypes' => implode( ' ', $upload_filetypes ), + 'blog_upload_space' => 100, + 'fileupload_maxk' => 1500, + 'site_admins' => $site_admins, + 'allowedthemes' => $allowed_themes, + 'illegal_names' => array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator', 'files' ), + 'wpmu_upgrade_site' => $wp_db_version, + 'welcome_email' => $welcome_email, + /* translators: %s: Site link. */ + 'first_post' => __( 'Welcome to %s. This is your first post. Edit or delete it, then start writing!' ), + // @todo - Network admins should have a method of editing the network siteurl (used for cookie hash). + 'siteurl' => get_option( 'siteurl' ) . '/', + 'add_new_users' => '0', + 'upload_space_check_disabled' => is_multisite() ? get_site_option( 'upload_space_check_disabled' ) : '1', + 'subdomain_install' => $subdomain_install, + 'global_terms_enabled' => global_terms_enabled() ? '1' : '0', + 'ms_files_rewriting' => is_multisite() ? get_site_option( 'ms_files_rewriting' ) : '0', + 'initial_db_version' => get_option( 'initial_db_version' ), + 'active_sitewide_plugins' => array(), + 'WPLANG' => get_locale(), + ); + if ( ! $subdomain_install ) { + $sitemeta['illegal_names'][] = 'blog'; + } + + $sitemeta = wp_parse_args( $meta, $sitemeta ); + + /** + * Filters meta for a network on creation. + * + * @since 3.7.0 + * + * @param array $sitemeta Associative array of network meta keys and values to be inserted. + * @param int $network_id ID of network to populate. + */ + $sitemeta = apply_filters( 'populate_network_meta', $sitemeta, $network_id ); + + $insert = ''; + foreach ( $sitemeta as $meta_key => $meta_value ) { + if ( is_array( $meta_value ) ) { + $meta_value = serialize( $meta_value ); + } + if ( ! empty( $insert ) ) { + $insert .= ', '; + } + $insert .= $wpdb->prepare( '( %d, %s, %s)', $network_id, $meta_key, $meta_value ); + } + $wpdb->query( "INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES " . $insert ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared +} + +/** + * Creates WordPress site meta and sets the default values. + * + * @since 5.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $site_id Site ID to populate meta for. + * @param array $meta Optional. Custom meta $key => $value pairs to use. Default empty array. + */ +function populate_site_meta( $site_id, array $meta = array() ) { + global $wpdb; + + $site_id = (int) $site_id; + + if ( ! is_site_meta_supported() ) { + return; + } + + if ( empty( $meta ) ) { + return; + } + + /** + * Filters meta for a site on creation. + * + * @since 5.2.0 + * + * @param array $meta Associative array of site meta keys and values to be inserted. + * @param int $site_id ID of site to populate. + */ + $site_meta = apply_filters( 'populate_site_meta', $meta, $site_id ); + + $insert = ''; + foreach ( $site_meta as $meta_key => $meta_value ) { + if ( is_array( $meta_value ) ) { + $meta_value = serialize( $meta_value ); + } + if ( ! empty( $insert ) ) { + $insert .= ', '; + } + $insert .= $wpdb->prepare( '( %d, %s, %s)', $site_id, $meta_key, $meta_value ); + } + + $wpdb->query( "INSERT INTO $wpdb->blogmeta ( blog_id, meta_key, meta_value ) VALUES " . $insert ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + + wp_cache_delete( $site_id, 'blog_meta' ); + wp_cache_set_sites_last_changed(); +} diff --git a/wp-admin/includes/screen.php b/wp-admin/includes/screen.php new file mode 100644 index 0000000..42a19ec --- /dev/null +++ b/wp-admin/includes/screen.php @@ -0,0 +1,241 @@ +id ] ) ) { + /** + * Filters the column headers for a list table on a specific screen. + * + * The dynamic portion of the hook name, `$screen->id`, refers to the + * ID of a specific screen. For example, the screen ID for the Posts + * list table is edit-post, so the filter for that screen would be + * manage_edit-post_columns. + * + * @since 3.0.0 + * + * @param string[] $columns The column header labels keyed by column ID. + */ + $column_headers[ $screen->id ] = apply_filters( "manage_{$screen->id}_columns", array() ); + } + + return $column_headers[ $screen->id ]; +} + +/** + * Get a list of hidden columns. + * + * @since 2.7.0 + * + * @param string|WP_Screen $screen The screen you want the hidden columns for + * @return string[] Array of IDs of hidden columns. + */ +function get_hidden_columns( $screen ) { + if ( is_string( $screen ) ) { + $screen = convert_to_screen( $screen ); + } + + $hidden = get_user_option( 'manage' . $screen->id . 'columnshidden' ); + + $use_defaults = ! is_array( $hidden ); + + if ( $use_defaults ) { + $hidden = array(); + + /** + * Filters the default list of hidden columns. + * + * @since 4.4.0 + * + * @param string[] $hidden Array of IDs of columns hidden by default. + * @param WP_Screen $screen WP_Screen object of the current screen. + */ + $hidden = apply_filters( 'default_hidden_columns', $hidden, $screen ); + } + + /** + * Filters the list of hidden columns. + * + * @since 4.4.0 + * @since 4.4.1 Added the `use_defaults` parameter. + * + * @param string[] $hidden Array of IDs of hidden columns. + * @param WP_Screen $screen WP_Screen object of the current screen. + * @param bool $use_defaults Whether to show the default columns. + */ + return apply_filters( 'hidden_columns', $hidden, $screen, $use_defaults ); +} + +/** + * Prints the meta box preferences for screen meta. + * + * @since 2.7.0 + * + * @global array $wp_meta_boxes + * + * @param WP_Screen $screen + */ +function meta_box_prefs( $screen ) { + global $wp_meta_boxes; + + if ( is_string( $screen ) ) { + $screen = convert_to_screen( $screen ); + } + + if ( empty( $wp_meta_boxes[ $screen->id ] ) ) { + return; + } + + $hidden = get_hidden_meta_boxes( $screen ); + + foreach ( array_keys( $wp_meta_boxes[ $screen->id ] ) as $context ) { + foreach ( array( 'high', 'core', 'default', 'low' ) as $priority ) { + if ( ! isset( $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] ) ) { + continue; + } + foreach ( $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] as $box ) { + if ( false == $box || ! $box['title'] ) { + continue; + } + // Submit box cannot be hidden. + if ( 'submitdiv' == $box['id'] || 'linksubmitdiv' == $box['id'] ) { + continue; + } + + $widget_title = $box['title']; + + if ( is_array( $box['args'] ) && isset( $box['args']['__widget_basename'] ) ) { + $widget_title = $box['args']['__widget_basename']; + } + + printf( + '', + esc_attr( $box['id'] ), + checked( in_array( $box['id'], $hidden ), false, false ), + $widget_title + ); + } + } + } +} + +/** + * Gets an array of IDs of hidden meta boxes. + * + * @since 2.7.0 + * + * @param string|WP_Screen $screen Screen identifier + * @return string[] IDs of hidden meta boxes. + */ +function get_hidden_meta_boxes( $screen ) { + if ( is_string( $screen ) ) { + $screen = convert_to_screen( $screen ); + } + + $hidden = get_user_option( "metaboxhidden_{$screen->id}" ); + + $use_defaults = ! is_array( $hidden ); + + // Hide slug boxes by default. + if ( $use_defaults ) { + $hidden = array(); + if ( 'post' == $screen->base ) { + if ( 'post' == $screen->post_type || 'page' == $screen->post_type || 'attachment' == $screen->post_type ) { + $hidden = array( 'slugdiv', 'trackbacksdiv', 'postcustom', 'postexcerpt', 'commentstatusdiv', 'commentsdiv', 'authordiv', 'revisionsdiv' ); + } else { + $hidden = array( 'slugdiv' ); + } + } + + /** + * Filters the default list of hidden meta boxes. + * + * @since 3.1.0 + * + * @param string[] $hidden An array of IDs of meta boxes hidden by default. + * @param WP_Screen $screen WP_Screen object of the current screen. + */ + $hidden = apply_filters( 'default_hidden_meta_boxes', $hidden, $screen ); + } + + /** + * Filters the list of hidden meta boxes. + * + * @since 3.3.0 + * + * @param string[] $hidden An array of IDs of hidden meta boxes. + * @param WP_Screen $screen WP_Screen object of the current screen. + * @param bool $use_defaults Whether to show the default meta boxes. + * Default true. + */ + return apply_filters( 'hidden_meta_boxes', $hidden, $screen, $use_defaults ); +} + +/** + * Register and configure an admin screen option + * + * @since 3.1.0 + * + * @param string $option An option name. + * @param mixed $args Option-dependent arguments. + */ +function add_screen_option( $option, $args = array() ) { + $current_screen = get_current_screen(); + + if ( ! $current_screen ) { + return; + } + + $current_screen->add_option( $option, $args ); +} + +/** + * Get the current screen object + * + * @since 3.1.0 + * + * @global WP_Screen $current_screen WordPress current screen object. + * + * @return WP_Screen|null Current screen object or null when screen not defined. + */ +function get_current_screen() { + global $current_screen; + + if ( ! isset( $current_screen ) ) { + return null; + } + + return $current_screen; +} + +/** + * Set the current screen object + * + * @since 3.0.0 + * + * @param string|WP_Screen $hook_name Optional. The hook name (also known as the hook suffix) used to determine the screen, + * or an existing screen object. + */ +function set_current_screen( $hook_name = '' ) { + WP_Screen::get( $hook_name )->set_current_screen(); +} diff --git a/wp-admin/includes/taxonomy.php b/wp-admin/includes/taxonomy.php new file mode 100644 index 0000000..e2877ca --- /dev/null +++ b/wp-admin/includes/taxonomy.php @@ -0,0 +1,314 @@ + $cat_name, + 'category_parent' => $parent, + ) + ); +} + +/** + * Create categories for the given post. + * + * @since 2.0.0 + * + * @param string[] $categories Array of category names to create. + * @param int $post_id Optional. The post ID. Default empty. + * @return int[] Array of IDs of categories assigned to the given post. + */ +function wp_create_categories( $categories, $post_id = '' ) { + $cat_ids = array(); + foreach ( $categories as $category ) { + $id = category_exists( $category ); + if ( $id ) { + $cat_ids[] = $id; + } else { + $id = wp_create_category( $category ); + if ( $id ) { + $cat_ids[] = $id; + } + } + } + + if ( $post_id ) { + wp_set_post_categories( $post_id, $cat_ids ); + } + + return $cat_ids; +} + +/** + * Updates an existing Category or creates a new Category. + * + * @since 2.0.0 + * @since 2.5.0 $wp_error parameter was added. + * @since 3.0.0 The 'taxonomy' argument was added. + * + * @param array $catarr { + * Array of arguments for inserting a new category. + * + * @type int $cat_ID Category ID. A non-zero value updates an existing category. + * Default 0. + * @type string $taxonomy Taxonomy slug. Default 'category'. + * @type string $cat_name Category name. Default empty. + * @type string $category_description Category description. Default empty. + * @type string $category_nicename Category nice (display) name. Default empty. + * @type int|string $category_parent Category parent ID. Default empty. + * } + * @param bool $wp_error Optional. Default false. + * @return int|object The ID number of the new or updated Category on success. Zero or a WP_Error on failure, + * depending on param $wp_error. + */ +function wp_insert_category( $catarr, $wp_error = false ) { + $cat_defaults = array( + 'cat_ID' => 0, + 'taxonomy' => 'category', + 'cat_name' => '', + 'category_description' => '', + 'category_nicename' => '', + 'category_parent' => '', + ); + $catarr = wp_parse_args( $catarr, $cat_defaults ); + + if ( trim( $catarr['cat_name'] ) == '' ) { + if ( ! $wp_error ) { + return 0; + } else { + return new WP_Error( 'cat_name', __( 'You did not enter a category name.' ) ); + } + } + + $catarr['cat_ID'] = (int) $catarr['cat_ID']; + + // Are we updating or creating? + $update = ! empty( $catarr['cat_ID'] ); + + $name = $catarr['cat_name']; + $description = $catarr['category_description']; + $slug = $catarr['category_nicename']; + $parent = (int) $catarr['category_parent']; + if ( $parent < 0 ) { + $parent = 0; + } + + if ( empty( $parent ) + || ! term_exists( $parent, $catarr['taxonomy'] ) + || ( $catarr['cat_ID'] && term_is_ancestor_of( $catarr['cat_ID'], $parent, $catarr['taxonomy'] ) ) ) { + $parent = 0; + } + + $args = compact( 'name', 'slug', 'parent', 'description' ); + + if ( $update ) { + $catarr['cat_ID'] = wp_update_term( $catarr['cat_ID'], $catarr['taxonomy'], $args ); + } else { + $catarr['cat_ID'] = wp_insert_term( $catarr['cat_name'], $catarr['taxonomy'], $args ); + } + + if ( is_wp_error( $catarr['cat_ID'] ) ) { + if ( $wp_error ) { + return $catarr['cat_ID']; + } else { + return 0; + } + } + return $catarr['cat_ID']['term_id']; +} + +/** + * Aliases wp_insert_category() with minimal args. + * + * If you want to update only some fields of an existing category, call this + * function with only the new values set inside $catarr. + * + * @since 2.0.0 + * + * @param array $catarr The 'cat_ID' value is required. All other keys are optional. + * @return int|bool The ID number of the new or updated Category on success. Zero or FALSE on failure. + */ +function wp_update_category( $catarr ) { + $cat_ID = (int) $catarr['cat_ID']; + + if ( isset( $catarr['category_parent'] ) && ( $cat_ID == $catarr['category_parent'] ) ) { + return false; + } + + // First, get all of the original fields. + $category = get_term( $cat_ID, 'category', ARRAY_A ); + _make_cat_compat( $category ); + + // Escape data pulled from DB. + $category = wp_slash( $category ); + + // Merge old and new fields with new fields overwriting old ones. + $catarr = array_merge( $category, $catarr ); + + return wp_insert_category( $catarr ); +} + +// +// Tags. +// + +/** + * Check whether a post tag with a given name exists. + * + * @since 2.3.0 + * + * @param int|string $tag_name + * @return mixed + */ +function tag_exists( $tag_name ) { + return term_exists( $tag_name, 'post_tag' ); +} + +/** + * Add a new tag to the database if it does not already exist. + * + * @since 2.3.0 + * + * @param int|string $tag_name + * @return array|WP_Error + */ +function wp_create_tag( $tag_name ) { + return wp_create_term( $tag_name, 'post_tag' ); +} + +/** + * Get comma-separated list of tags available to edit. + * + * @since 2.3.0 + * + * @param int $post_id + * @param string $taxonomy Optional. The taxonomy for which to retrieve terms. Default 'post_tag'. + * @return string|bool|WP_Error + */ +function get_tags_to_edit( $post_id, $taxonomy = 'post_tag' ) { + return get_terms_to_edit( $post_id, $taxonomy ); +} + +/** + * Get comma-separated list of terms available to edit for the given post ID. + * + * @since 2.8.0 + * + * @param int $post_id + * @param string $taxonomy Optional. The taxonomy for which to retrieve terms. Default 'post_tag'. + * @return string|bool|WP_Error + */ +function get_terms_to_edit( $post_id, $taxonomy = 'post_tag' ) { + $post_id = (int) $post_id; + if ( ! $post_id ) { + return false; + } + + $terms = get_object_term_cache( $post_id, $taxonomy ); + if ( false === $terms ) { + $terms = wp_get_object_terms( $post_id, $taxonomy ); + wp_cache_add( $post_id, wp_list_pluck( $terms, 'term_id' ), $taxonomy . '_relationships' ); + } + + if ( ! $terms ) { + return false; + } + if ( is_wp_error( $terms ) ) { + return $terms; + } + $term_names = array(); + foreach ( $terms as $term ) { + $term_names[] = $term->name; + } + + $terms_to_edit = esc_attr( join( ',', $term_names ) ); + + /** + * Filters the comma-separated list of terms available to edit. + * + * @since 2.8.0 + * + * @see get_terms_to_edit() + * + * @param string $terms_to_edit A comma-separated list of term names. + * @param string $taxonomy The taxonomy name for which to retrieve terms. + */ + $terms_to_edit = apply_filters( 'terms_to_edit', $terms_to_edit, $taxonomy ); + + return $terms_to_edit; +} + +/** + * Add a new term to the database if it does not already exist. + * + * @since 2.8.0 + * + * @param int|string $tag_name + * @param string $taxonomy Optional. The taxonomy for which to retrieve terms. Default 'post_tag'. + * @return array|WP_Error + */ +function wp_create_term( $tag_name, $taxonomy = 'post_tag' ) { + $id = term_exists( $tag_name, $taxonomy ); + if ( $id ) { + return $id; + } + + return wp_insert_term( $tag_name, $taxonomy ); +} diff --git a/wp-admin/includes/template.php b/wp-admin/includes/template.php new file mode 100644 index 0000000..a6f7472 --- /dev/null +++ b/wp-admin/includes/template.php @@ -0,0 +1,2582 @@ + 'category', + 'descendants_and_self' => $descendants_and_self, + 'selected_cats' => $selected_cats, + 'popular_cats' => $popular_cats, + 'walker' => $walker, + 'checked_ontop' => $checked_ontop, + ) + ); +} + +/** + * Output an unordered list of checkbox input elements labelled with term names. + * + * Taxonomy-independent version of wp_category_checklist(). + * + * @since 3.0.0 + * @since 4.4.0 Introduced the `$echo` argument. + * + * @param int $post_id Optional. Post ID. Default 0. + * @param array|string $args { + * Optional. Array or string of arguments for generating a terms checklist. Default empty array. + * + * @type int $descendants_and_self ID of the category to output along with its descendants. + * Default 0. + * @type int[] $selected_cats Array of category IDs to mark as checked. Default false. + * @type int[] $popular_cats Array of category IDs to receive the "popular-category" class. + * Default false. + * @type Walker $walker Walker object to use to build the output. + * Default is a Walker_Category_Checklist instance. + * @type string $taxonomy Taxonomy to generate the checklist for. Default 'category'. + * @type bool $checked_ontop Whether to move checked items out of the hierarchy and to + * the top of the list. Default true. + * @type bool $echo Whether to echo the generated markup. False to return the markup instead + * of echoing it. Default true. + * } + * @return string HTML list of input elements. + */ +function wp_terms_checklist( $post_id = 0, $args = array() ) { + $defaults = array( + 'descendants_and_self' => 0, + 'selected_cats' => false, + 'popular_cats' => false, + 'walker' => null, + 'taxonomy' => 'category', + 'checked_ontop' => true, + 'echo' => true, + ); + + /** + * Filters the taxonomy terms checklist arguments. + * + * @since 3.4.0 + * + * @see wp_terms_checklist() + * + * @param array $args An array of arguments. + * @param int $post_id The post ID. + */ + $params = apply_filters( 'wp_terms_checklist_args', $args, $post_id ); + + $parsed_args = wp_parse_args( $params, $defaults ); + + if ( empty( $parsed_args['walker'] ) || ! ( $parsed_args['walker'] instanceof Walker ) ) { + $walker = new Walker_Category_Checklist; + } else { + $walker = $parsed_args['walker']; + } + + $taxonomy = $parsed_args['taxonomy']; + $descendants_and_self = (int) $parsed_args['descendants_and_self']; + + $args = array( 'taxonomy' => $taxonomy ); + + $tax = get_taxonomy( $taxonomy ); + $args['disabled'] = ! current_user_can( $tax->cap->assign_terms ); + + $args['list_only'] = ! empty( $parsed_args['list_only'] ); + + if ( is_array( $parsed_args['selected_cats'] ) ) { + $args['selected_cats'] = $parsed_args['selected_cats']; + } elseif ( $post_id ) { + $args['selected_cats'] = wp_get_object_terms( $post_id, $taxonomy, array_merge( $args, array( 'fields' => 'ids' ) ) ); + } else { + $args['selected_cats'] = array(); + } + + if ( is_array( $parsed_args['popular_cats'] ) ) { + $args['popular_cats'] = $parsed_args['popular_cats']; + } else { + $args['popular_cats'] = get_terms( + array( + 'taxonomy' => $taxonomy, + 'fields' => 'ids', + 'orderby' => 'count', + 'order' => 'DESC', + 'number' => 10, + 'hierarchical' => false, + ) + ); + } + + if ( $descendants_and_self ) { + $categories = (array) get_terms( + array( + 'taxonomy' => $taxonomy, + 'child_of' => $descendants_and_self, + 'hierarchical' => 0, + 'hide_empty' => 0, + ) + ); + $self = get_term( $descendants_and_self, $taxonomy ); + array_unshift( $categories, $self ); + } else { + $categories = (array) get_terms( + array( + 'taxonomy' => $taxonomy, + 'get' => 'all', + ) + ); + } + + $output = ''; + + if ( $parsed_args['checked_ontop'] ) { + // Post-process $categories rather than adding an exclude to the get_terms() query + // to keep the query the same across all posts (for any query cache). + $checked_categories = array(); + $keys = array_keys( $categories ); + + foreach ( $keys as $k ) { + if ( in_array( $categories[ $k ]->term_id, $args['selected_cats'] ) ) { + $checked_categories[] = $categories[ $k ]; + unset( $categories[ $k ] ); + } + } + + // Put checked categories on top. + $output .= $walker->walk( $checked_categories, 0, $args ); + } + // Then the rest of them. + $output .= $walker->walk( $categories, 0, $args ); + + if ( $parsed_args['echo'] ) { + echo $output; + } + + return $output; +} + +/** + * Retrieve a list of the most popular terms from the specified taxonomy. + * + * If the $echo argument is true then the elements for a list of checkbox + * `` elements labelled with the names of the selected terms is output. + * If the $post_ID global isn't empty then the terms associated with that + * post will be marked as checked. + * + * @since 2.5.0 + * + * @param string $taxonomy Taxonomy to retrieve terms from. + * @param int $default Not used. + * @param int $number Number of terms to retrieve. Defaults to 10. + * @param bool $echo Optionally output the list as well. Defaults to true. + * @return int[] Array of popular term IDs. + */ +function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $echo = true ) { + $post = get_post(); + + if ( $post && $post->ID ) { + $checked_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) ); + } else { + $checked_terms = array(); + } + + $terms = get_terms( + array( + 'taxonomy' => $taxonomy, + 'orderby' => 'count', + 'order' => 'DESC', + 'number' => $number, + 'hierarchical' => false, + ) + ); + + $tax = get_taxonomy( $taxonomy ); + + $popular_ids = array(); + foreach ( (array) $terms as $term ) { + $popular_ids[] = $term->term_id; + if ( ! $echo ) { // Hack for Ajax use. + continue; + } + $id = "popular-$taxonomy-$term->term_id"; + $checked = in_array( $term->term_id, $checked_terms ) ? 'checked="checked"' : ''; + ?> + + + + 'link_category', + 'orderby' => 'name', + 'hide_empty' => 0, + ) + ); + + if ( empty( $categories ) ) { + return; + } + + foreach ( $categories as $category ) { + $cat_id = $category->term_id; + + /** This filter is documented in wp-includes/category-template.php */ + $name = esc_html( apply_filters( 'the_category', $category->name, '', '' ) ); + $checked = in_array( $cat_id, $checked_categories ) ? ' checked="checked"' : ''; + echo ''; + } +} + +/** + * Adds hidden fields with the data for use in the inline editor for posts and pages. + * + * @since 2.7.0 + * + * @param WP_Post $post Post object. + */ +function get_inline_data( $post ) { + $post_type_object = get_post_type_object( $post->post_type ); + if ( ! current_user_can( 'edit_post', $post->ID ) ) { + return; + } + + $title = esc_textarea( trim( $post->post_title ) ); + + echo ' +'; +} + +/** + * Outputs the in-line comment reply-to form in the Comments list table. + * + * @since 2.7.0 + * + * @global WP_List_Table $wp_list_table + * + * @param int $position + * @param bool $checkbox + * @param string $mode + * @param bool $table_row + */ +function wp_comment_reply( $position = 1, $checkbox = false, $mode = 'single', $table_row = true ) { + global $wp_list_table; + /** + * Filters the in-line comment reply-to form output in the Comments + * list table. + * + * Returning a non-empty value here will short-circuit display + * of the in-line comment-reply form in the Comments list table, + * echoing the returned value instead. + * + * @since 2.7.0 + * + * @see wp_comment_reply() + * + * @param string $content The reply-to form content. + * @param array $args An array of default args. + */ + $content = apply_filters( + 'wp_comment_reply', + '', + array( + 'position' => $position, + 'checkbox' => $checkbox, + 'mode' => $mode, + ) + ); + + if ( ! empty( $content ) ) { + echo $content; + return; + } + + if ( ! $wp_list_table ) { + if ( 'single' === $mode ) { + $wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table' ); + } else { + $wp_list_table = _get_list_table( 'WP_Comments_List_Table' ); + } + } + + ?> +
        + +
        + + + +
        + + + + + + + ' . _x( 'Name', 'meta name' ) . ' + ' . __( 'Value' ) . ' + + + + + +'; // TBODY needed for list-manipulation JS. + return; + } + $count = 0; + ?> + + + + + + + + + + +
        + . + $entry['meta_id'] = (int) $entry['meta_id']; + + $delete_nonce = wp_create_nonce( 'delete-meta_' . $entry['meta_id'] ); + + $r .= "\n\t"; + $r .= "\n\t\t"; + + $r .= "\n\t\t
        "; + $r .= get_submit_button( __( 'Delete' ), 'deletemeta small', "deletemeta[{$entry['meta_id']}]", false, array( 'data-wp-lists' => "delete:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$delete_nonce" ) ); + $r .= "\n\t\t"; + $r .= get_submit_button( __( 'Update' ), 'updatemeta small', "meta-{$entry['meta_id']}-submit", false, array( 'data-wp-lists' => "add:the-list:meta-{$entry['meta_id']}::_ajax_nonce-add-meta=$update_nonce" ) ); + $r .= '
        '; + $r .= wp_nonce_field( 'change-meta', '_ajax_nonce', false, false ); + $r .= ''; + + $r .= "\n\t\t\n\t"; + return $r; +} + +/** + * Prints the form in the Custom Fields meta box. + * + * @since 1.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param WP_Post $post Optional. The post being edited. + */ +function meta_form( $post = null ) { + global $wpdb; + $post = get_post( $post ); + + /** + * Filters values for the meta key dropdown in the Custom Fields meta box. + * + * Returning a non-null value will effectively short-circuit and avoid a + * potentially expensive query against postmeta. + * + * @since 4.4.0 + * + * @param array|null $keys Pre-defined meta keys to be used in place of a postmeta query. Default null. + * @param WP_Post $post The current post object. + */ + $keys = apply_filters( 'postmeta_form_keys', null, $post ); + + if ( null === $keys ) { + /** + * Filters the number of custom fields to retrieve for the drop-down + * in the Custom Fields meta box. + * + * @since 2.1.0 + * + * @param int $limit Number of custom fields to retrieve. Default 30. + */ + $limit = apply_filters( 'postmeta_form_limit', 30 ); + $sql = "SELECT DISTINCT meta_key + FROM $wpdb->postmeta + WHERE meta_key NOT BETWEEN '_' AND '_z' + HAVING meta_key NOT LIKE %s + ORDER BY meta_key + LIMIT %d"; + $keys = $wpdb->get_col( $wpdb->prepare( $sql, $wpdb->esc_like( '_' ) . '%', $limit ) ); + } + + if ( $keys ) { + natcasesort( $keys ); + $meta_key_input_id = 'metakeyselect'; + } else { + $meta_key_input_id = 'metakeyinput'; + } + ?> +

        + + + + + + + + + + + + + + + + +
        + + + + + + + + + +
        +
        + 'newmeta-submit', + 'data-wp-lists' => 'add:the-list:newmeta', + ) + ); + ?> +
        + +
        + post_status, array( 'draft', 'pending' ) ) && ( ! $post->post_date_gmt || '0000-00-00 00:00:00' == $post->post_date_gmt ) ); + } + + $tab_index_attribute = ''; + if ( (int) $tab_index > 0 ) { + $tab_index_attribute = " tabindex=\"$tab_index\""; + } + + // @todo Remove this? + // echo '
        '; + + $post_date = ( $for_post ) ? $post->post_date : get_comment()->comment_date; + $jj = ( $edit ) ? mysql2date( 'd', $post_date, false ) : current_time( 'd' ); + $mm = ( $edit ) ? mysql2date( 'm', $post_date, false ) : current_time( 'm' ); + $aa = ( $edit ) ? mysql2date( 'Y', $post_date, false ) : current_time( 'Y' ); + $hh = ( $edit ) ? mysql2date( 'H', $post_date, false ) : current_time( 'H' ); + $mn = ( $edit ) ? mysql2date( 'i', $post_date, false ) : current_time( 'i' ); + $ss = ( $edit ) ? mysql2date( 's', $post_date, false ) : current_time( 's' ); + + $cur_jj = current_time( 'd' ); + $cur_mm = current_time( 'm' ); + $cur_aa = current_time( 'Y' ); + $cur_hh = current_time( 'H' ); + $cur_mn = current_time( 'i' ); + + $month = ''; + + $day = ''; + $year = ''; + $hour = ''; + $minute = ''; + + echo '
        '; + /* translators: 1: Month, 2: Day, 3: Year, 4: Hour, 5: Minute. */ + printf( __( '%1$s %2$s, %3$s at %4$s:%5$s' ), $month, $day, $year, $hour, $minute ); + + echo '
        '; + + if ( $multi ) { + return; + } + + echo "\n\n"; + $map = array( + 'mm' => array( $mm, $cur_mm ), + 'jj' => array( $jj, $cur_jj ), + 'aa' => array( $aa, $cur_aa ), + 'hh' => array( $hh, $cur_hh ), + 'mn' => array( $mn, $cur_mn ), + ); + foreach ( $map as $timeunit => $value ) { + list( $unit, $curr ) = $value; + + echo '' . "\n"; + $cur_timeunit = 'cur_' . $timeunit; + echo '' . "\n"; + } + ?> + +

        + + +

        + " . esc_html( $template ) . ''; + } +} + +/** + * Print out option HTML elements for the page parents drop-down. + * + * @since 1.5.0 + * @since 4.4.0 `$post` argument was added. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $default Optional. The default page ID to be pre-selected. Default 0. + * @param int $parent Optional. The parent page ID. Default 0. + * @param int $level Optional. Page depth level. Default 0. + * @param int|WP_Post $post Post ID or WP_Post object. + * @return void|false Void on success, false if the page has no children. + */ +function parent_dropdown( $default = 0, $parent = 0, $level = 0, $post = null ) { + global $wpdb; + $post = get_post( $post ); + $items = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_parent, post_title FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'page' ORDER BY menu_order", $parent ) ); + + if ( $items ) { + foreach ( $items as $item ) { + // A page cannot be its own parent. + if ( $post && $post->ID && $item->ID == $post->ID ) { + continue; + } + + $pad = str_repeat( ' ', $level * 3 ); + $selected = selected( $default, $item->ID, false ); + + echo "\n\t'; + parent_dropdown( $default, $item->ID, $level + 1 ); + } + } else { + return false; + } +} + +/** + * Print out option html elements for role selectors. + * + * @since 2.1.0 + * + * @param string $selected Slug for the role that should be already selected. + */ +function wp_dropdown_roles( $selected = '' ) { + $r = ''; + + $editable_roles = array_reverse( get_editable_roles() ); + + foreach ( $editable_roles as $role => $details ) { + $name = translate_user_role( $details['name'] ); + // Preselect specified role. + if ( $selected == $role ) { + $r .= "\n\t"; + } else { + $r .= "\n\t"; + } + } + + echo $r; +} + +/** + * Outputs the form used by the importers to accept the data to be imported + * + * @since 2.0.0 + * + * @param string $action The action attribute for the form. + */ +function wp_import_upload_form( $action ) { + + /** + * Filters the maximum allowed upload size for import files. + * + * @since 2.3.0 + * + * @see wp_max_upload_size() + * + * @param int $max_upload_size Allowed upload size. Default 1 MB. + */ + $bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() ); + $size = size_format( $bytes ); + $upload_dir = wp_upload_dir(); + if ( ! empty( $upload_dir['error'] ) ) : + ?> +

        +

        + +
        +

        + %s (%s)', + __( 'Choose a file from your computer:' ), + /* translators: %s: Maximum allowed file size. */ + sprintf( __( 'Maximum size: %s' ), $size ) + ); + ?> + + + +

        + +
        + id ) ) { + return; + } + + $page = $screen->id; + + if ( ! isset( $wp_meta_boxes ) ) { + $wp_meta_boxes = array(); + } + if ( ! isset( $wp_meta_boxes[ $page ] ) ) { + $wp_meta_boxes[ $page ] = array(); + } + if ( ! isset( $wp_meta_boxes[ $page ][ $context ] ) ) { + $wp_meta_boxes[ $page ][ $context ] = array(); + } + + foreach ( array_keys( $wp_meta_boxes[ $page ] ) as $a_context ) { + foreach ( array( 'high', 'core', 'default', 'low' ) as $a_priority ) { + if ( ! isset( $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ] ) ) { + continue; + } + + // If a core box was previously added or removed by a plugin, don't add. + if ( 'core' == $priority ) { + // If core box previously deleted, don't add. + if ( false === $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ] ) { + return; + } + + /* + * If box was added with default priority, give it core priority to + * maintain sort order. + */ + if ( 'default' == $a_priority ) { + $wp_meta_boxes[ $page ][ $a_context ]['core'][ $id ] = $wp_meta_boxes[ $page ][ $a_context ]['default'][ $id ]; + unset( $wp_meta_boxes[ $page ][ $a_context ]['default'][ $id ] ); + } + return; + } + // If no priority given and ID already present, use existing priority. + if ( empty( $priority ) ) { + $priority = $a_priority; + /* + * Else, if we're adding to the sorted priority, we don't know the title + * or callback. Grab them from the previously added context/priority. + */ + } elseif ( 'sorted' == $priority ) { + $title = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]['title']; + $callback = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]['callback']; + $callback_args = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]['args']; + } + // An ID can be in only one priority and one context. + if ( $priority != $a_priority || $context != $a_context ) { + unset( $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ] ); + } + } + } + + if ( empty( $priority ) ) { + $priority = 'low'; + } + + if ( ! isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) { + $wp_meta_boxes[ $page ][ $context ][ $priority ] = array(); + } + + $wp_meta_boxes[ $page ][ $context ][ $priority ][ $id ] = array( + 'id' => $id, + 'title' => $title, + 'callback' => $callback, + 'args' => $callback_args, + ); +} + + +/** + * Function that renders a "fake" meta box with an information message, + * shown on the block editor, when an incompatible meta box is found. + * + * @since 5.0.0 + * + * @param mixed $object The data object being rendered on this screen. + * @param array $box { + * Custom formats meta box arguments. + * + * @type string $id Meta box 'id' attribute. + * @type string $title Meta box title. + * @type callable $old_callback The original callback for this meta box. + * @type array $args Extra meta box arguments. + * } + */ +function do_block_editor_incompatible_meta_box( $object, $box ) { + $plugin = _get_plugin_from_callback( $box['old_callback'] ); + $plugins = get_plugins(); + echo '

        '; + if ( $plugin ) { + /* translators: %s: The name of the plugin that generated this meta box. */ + printf( __( "This meta box, from the %s plugin, isn't compatible with the block editor." ), "{$plugin['Name']}" ); + } else { + _e( "This meta box isn't compatible with the block editor." ); + } + echo '

        '; + + if ( empty( $plugins['classic-editor/classic-editor.php'] ) ) { + if ( current_user_can( 'install_plugins' ) ) { + echo '

        '; + printf( + /* translators: %s: A link to install the Classic Editor plugin. */ + __( 'Please install the Classic Editor plugin to use this meta box.' ), + esc_url( wp_nonce_url( self_admin_url( 'plugin-install.php?tab=favorites&user=wordpressdotorg&save=0' ), 'save_wporg_username_' . get_current_user_id() ) ) + ); + echo '

        '; + } + } elseif ( is_plugin_inactive( 'classic-editor/classic-editor.php' ) ) { + if ( current_user_can( 'activate_plugins' ) ) { + $activate_url = wp_nonce_url( self_admin_url( 'plugins.php?action=activate&plugin=classic-editor/classic-editor.php' ), 'activate-plugin_classic-editor/classic-editor.php' ); + echo '

        '; + /* translators: %s: A link to activate the Classic Editor plugin. */ + printf( __( 'Please activate the Classic Editor plugin to use this meta box.' ), esc_url( $activate_url ) ); + echo '

        '; + } + } elseif ( $object instanceof WP_Post ) { + $edit_url = add_query_arg( + array( + 'classic-editor' => '', + 'classic-editor__forget' => '', + ), + get_edit_post_link( $object ) + ); + echo '

        '; + /* translators: %s: A link to use the Classic Editor plugin. */ + printf( __( 'Please open the classic editor to use this meta box.' ), esc_url( $edit_url ) ); + echo '

        '; + } +} + +/** + * Internal helper function to find the plugin from a meta box callback. + * + * @since 5.0.0 + * + * @access private + * + * @param callable $callback The callback function to check. + * @return array|null The plugin that the callback belongs to, or null if it doesn't belong to a plugin. + */ +function _get_plugin_from_callback( $callback ) { + try { + if ( is_array( $callback ) ) { + $reflection = new ReflectionMethod( $callback[0], $callback[1] ); + } elseif ( is_string( $callback ) && false !== strpos( $callback, '::' ) ) { + $reflection = new ReflectionMethod( $callback ); + } else { + $reflection = new ReflectionFunction( $callback ); + } + } catch ( ReflectionException $exception ) { + // We could not properly reflect on the callable, so we abort here. + return null; + } + + // Don't show an error if it's an internal PHP function. + if ( ! $reflection->isInternal() ) { + + // Only show errors if the meta box was registered by a plugin. + $filename = wp_normalize_path( $reflection->getFileName() ); + $plugin_dir = wp_normalize_path( WP_PLUGIN_DIR ); + if ( strpos( $filename, $plugin_dir ) === 0 ) { + $filename = str_replace( $plugin_dir, '', $filename ); + $filename = preg_replace( '|^/([^/]*/).*$|', '\\1', $filename ); + + $plugins = get_plugins(); + foreach ( $plugins as $name => $plugin ) { + if ( strpos( $name, $filename ) === 0 ) { + return $plugin; + } + } + } + } + + return null; +} + +/** + * Meta-Box template function. + * + * @since 2.5.0 + * + * @global array $wp_meta_boxes + * + * @staticvar bool $already_sorted + * + * @param string|WP_Screen $screen Screen identifier. If you have used add_menu_page() or + * add_submenu_page() to create a new screen (and hence screen_id) + * make sure your menu slug conforms to the limits of sanitize_key() + * otherwise the 'screen' menu may not correctly render on your page. + * @param string $context The screen context for which to display meta boxes. + * @param mixed $object Gets passed to the first parameter of the meta box callback function. + * Often this is the object that's the focus of the current screen, for + * example a `WP_Post` or `WP_Comment` object. + * @return int number of meta_boxes + */ +function do_meta_boxes( $screen, $context, $object ) { + global $wp_meta_boxes; + static $already_sorted = false; + + if ( empty( $screen ) ) { + $screen = get_current_screen(); + } elseif ( is_string( $screen ) ) { + $screen = convert_to_screen( $screen ); + } + + $page = $screen->id; + + $hidden = get_hidden_meta_boxes( $screen ); + + printf( '
        ', esc_attr( $context ) ); + + // Grab the ones the user has manually sorted. + // Pull them out of their previous context/priority and into the one the user chose. + $sorted = get_user_option( "meta-box-order_$page" ); + if ( ! $already_sorted && $sorted ) { + foreach ( $sorted as $box_context => $ids ) { + foreach ( explode( ',', $ids ) as $id ) { + if ( $id && 'dashboard_browser_nag' !== $id ) { + add_meta_box( $id, null, null, $screen, $box_context, 'sorted' ); + } + } + } + } + + $already_sorted = true; + + $i = 0; + + if ( isset( $wp_meta_boxes[ $page ][ $context ] ) ) { + foreach ( array( 'high', 'sorted', 'core', 'default', 'low' ) as $priority ) { + if ( isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) { + foreach ( (array) $wp_meta_boxes[ $page ][ $context ][ $priority ] as $box ) { + if ( false == $box || ! $box['title'] ) { + continue; + } + + $block_compatible = true; + if ( is_array( $box['args'] ) ) { + // If a meta box is just here for back compat, don't show it in the block editor. + if ( $screen->is_block_editor() && isset( $box['args']['__back_compat_meta_box'] ) && $box['args']['__back_compat_meta_box'] ) { + continue; + } + + if ( isset( $box['args']['__block_editor_compatible_meta_box'] ) ) { + $block_compatible = (bool) $box['args']['__block_editor_compatible_meta_box']; + unset( $box['args']['__block_editor_compatible_meta_box'] ); + } + + // If the meta box is declared as incompatible with the block editor, override the callback function. + if ( ! $block_compatible && $screen->is_block_editor() ) { + $box['old_callback'] = $box['callback']; + $box['callback'] = 'do_block_editor_incompatible_meta_box'; + } + + if ( isset( $box['args']['__back_compat_meta_box'] ) ) { + $block_compatible = $block_compatible || (bool) $box['args']['__back_compat_meta_box']; + unset( $box['args']['__back_compat_meta_box'] ); + } + } + + $i++; + // get_hidden_meta_boxes() doesn't apply in the block editor. + $hidden_class = ( ! $screen->is_block_editor() && in_array( $box['id'], $hidden ) ) ? ' hide-if-js' : ''; + echo '
        ' . "\n"; + if ( 'dashboard_browser_nag' != $box['id'] ) { + $widget_title = $box['title']; + + if ( is_array( $box['args'] ) && isset( $box['args']['__widget_basename'] ) ) { + $widget_title = $box['args']['__widget_basename']; + // Do not pass this parameter to the user callback function. + unset( $box['args']['__widget_basename'] ); + } + + echo ''; + } + echo '

        '; + if ( 'dashboard_php_nag' === $box['id'] ) { + echo ''; + echo '' . __( 'Warning:' ) . ' '; + } + echo "{$box['title']}"; + echo "

        \n"; + echo '
        ' . "\n"; + + if ( WP_DEBUG && ! $block_compatible && 'edit' === $screen->parent_base && ! $screen->is_block_editor() && ! isset( $_GET['meta-box-loader'] ) ) { + $plugin = _get_plugin_from_callback( $box['callback'] ); + if ( $plugin ) { + ?> +
        +

        + {$plugin['Name']}" ); + ?> +

        +
        + \n"; + echo "
        \n"; + } + } + } + } + + echo '
        '; + + return $i; + +} + +/** + * Removes a meta box from one or more screens. + * + * @since 2.6.0 + * @since 4.4.0 The `$screen` parameter now accepts an array of screen IDs. + * + * @global array $wp_meta_boxes + * + * @param string $id Meta box ID (used in the 'id' attribute for the meta box). + * @param string|array|WP_Screen $screen The screen or screens on which the meta box is shown (such as a + * post type, 'link', or 'comment'). Accepts a single screen ID, + * WP_Screen object, or array of screen IDs. + * @param string $context The context within the screen where the box is set to display. + * Contexts vary from screen to screen. Post edit screen contexts + * include 'normal', 'side', and 'advanced'. Comments screen contexts + * include 'normal' and 'side'. Menus meta boxes (accordion sections) + * all use the 'side' context. + */ +function remove_meta_box( $id, $screen, $context ) { + global $wp_meta_boxes; + + if ( empty( $screen ) ) { + $screen = get_current_screen(); + } elseif ( is_string( $screen ) ) { + $screen = convert_to_screen( $screen ); + } elseif ( is_array( $screen ) ) { + foreach ( $screen as $single_screen ) { + remove_meta_box( $id, $single_screen, $context ); + } + } + + if ( ! isset( $screen->id ) ) { + return; + } + + $page = $screen->id; + + if ( ! isset( $wp_meta_boxes ) ) { + $wp_meta_boxes = array(); + } + if ( ! isset( $wp_meta_boxes[ $page ] ) ) { + $wp_meta_boxes[ $page ] = array(); + } + if ( ! isset( $wp_meta_boxes[ $page ][ $context ] ) ) { + $wp_meta_boxes[ $page ][ $context ] = array(); + } + + foreach ( array( 'high', 'core', 'default', 'low' ) as $priority ) { + $wp_meta_boxes[ $page ][ $context ][ $priority ][ $id ] = false; + } +} + +/** + * Meta Box Accordion Template Function. + * + * Largely made up of abstracted code from do_meta_boxes(), this + * function serves to build meta boxes as list items for display as + * a collapsible accordion. + * + * @since 3.6.0 + * + * @uses global $wp_meta_boxes Used to retrieve registered meta boxes. + * + * @param string|object $screen The screen identifier. + * @param string $context The meta box context. + * @param mixed $object gets passed to the section callback function as first parameter. + * @return int number of meta boxes as accordion sections. + */ +function do_accordion_sections( $screen, $context, $object ) { + global $wp_meta_boxes; + + wp_enqueue_script( 'accordion' ); + + if ( empty( $screen ) ) { + $screen = get_current_screen(); + } elseif ( is_string( $screen ) ) { + $screen = convert_to_screen( $screen ); + } + + $page = $screen->id; + + $hidden = get_hidden_meta_boxes( $screen ); + ?> +
        +
          + +
        • +

          + + +

          +
          +
          + +
          +
          +
        • + +
        +
        + $id, + 'title' => $title, + 'callback' => $callback, + ); +} + +/** + * Add a new field to a section of a settings page. + * + * Part of the Settings API. Use this to define a settings field that will show + * as part of a settings section inside a settings page. The fields are shown using + * do_settings_fields() in do_settings-sections() + * + * The $callback argument should be the name of a function that echoes out the + * html input tags for this setting field. Use get_option() to retrieve existing + * values to show. + * + * @since 2.7.0 + * @since 4.2.0 The `$class` argument was added. + * + * @global $wp_settings_fields Storage array of settings fields and info about their pages/sections. + * + * @param string $id Slug-name to identify the field. Used in the 'id' attribute of tags. + * @param string $title Formatted title of the field. Shown as the label for the field + * during output. + * @param callable $callback Function that fills the field with the desired form inputs. The + * function should echo its output. + * @param string $page The slug-name of the settings page on which to show the section + * (general, reading, writing, ...). + * @param string $section Optional. The slug-name of the section of the settings page + * in which to show the box. Default 'default'. + * @param array $args { + * Optional. Extra arguments used when outputting the field. + * + * @type string $label_for When supplied, the setting title will be wrapped + * in a `
        '; + ?> + + find_folder( trailingslashit( dirname( $file ) ) ); + if ( empty( $gen_dir ) ) { + continue; + } + + // The path when the file is accessed via WP_Filesystem may differ in the case of FTP. + $remote_file = $gen_dir . basename( $file ); + + if ( ! $wp_filesystem->exists( $remote_file ) ) { + continue; + } + + if ( ! $wp_filesystem->delete( $remote_file, false, 'f' ) ) { + $wp_filesystem->put_contents( $remote_file, '' ); + } + } +} + +/** + * Recursively find Genericons example files in a given folder. + * + * @ignore + * @since 4.2.2 + * + * @param string $directory Directory path. Expects trailingslashed. + * @return array + */ +function _upgrade_422_find_genericons_files_in_folder( $directory ) { + $directory = trailingslashit( $directory ); + $files = array(); + + if ( file_exists( "{$directory}example.html" ) && false !== strpos( file_get_contents( "{$directory}example.html" ), 'Genericons' ) ) { + $files[] = "{$directory}example.html"; + } + + $dirs = glob( $directory . '*', GLOB_ONLYDIR ); + if ( $dirs ) { + foreach ( $dirs as $dir ) { + $files = array_merge( $files, _upgrade_422_find_genericons_files_in_folder( $dir ) ); + } + } + + return $files; +} + +/** + * @ignore + * @since 4.4.0 + */ +function _upgrade_440_force_deactivate_incompatible_plugins() { + if ( defined( 'REST_API_VERSION' ) && version_compare( REST_API_VERSION, '2.0-beta4', '<=' ) ) { + deactivate_plugins( array( 'rest-api/plugin.php' ), true ); + } +} diff --git a/wp-admin/includes/update.php b/wp-admin/includes/update.php new file mode 100644 index 0000000..464ae93 --- /dev/null +++ b/wp-admin/includes/update.php @@ -0,0 +1,935 @@ + 'latest' ); + } + return $updates[0]; +} + +/** + * Gets available core updates. + * + * @since 2.7.0 + * + * @param array $options Set $options['dismissed'] to true to show dismissed upgrades too, + * set $options['available'] to false to skip not-dismissed updates. + * @return array|false Array of the update objects on success, false on failure. + */ +function get_core_updates( $options = array() ) { + $options = array_merge( + array( + 'available' => true, + 'dismissed' => false, + ), + $options + ); + $dismissed = get_site_option( 'dismissed_update_core' ); + + if ( ! is_array( $dismissed ) ) { + $dismissed = array(); + } + + $from_api = get_site_transient( 'update_core' ); + + if ( ! isset( $from_api->updates ) || ! is_array( $from_api->updates ) ) { + return false; + } + + $updates = $from_api->updates; + $result = array(); + foreach ( $updates as $update ) { + if ( 'autoupdate' === $update->response ) { + continue; + } + + if ( array_key_exists( $update->current . '|' . $update->locale, $dismissed ) ) { + if ( $options['dismissed'] ) { + $update->dismissed = true; + $result[] = $update; + } + } else { + if ( $options['available'] ) { + $update->dismissed = false; + $result[] = $update; + } + } + } + return $result; +} + +/** + * Gets the best available (and enabled) Auto-Update for WordPress core. + * + * If there's 1.2.3 and 1.3 on offer, it'll choose 1.3 if the installation allows it, else, 1.2.3. + * + * @since 3.7.0 + * + * @return object|false The core update offering on success, false on failure. + */ +function find_core_auto_update() { + $updates = get_site_transient( 'update_core' ); + if ( ! $updates || empty( $updates->updates ) ) { + return false; + } + + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + + $auto_update = false; + $upgrader = new WP_Automatic_Updater; + foreach ( $updates->updates as $update ) { + if ( 'autoupdate' != $update->response ) { + continue; + } + + if ( ! $upgrader->should_update( 'core', $update, ABSPATH ) ) { + continue; + } + + if ( ! $auto_update || version_compare( $update->current, $auto_update->current, '>' ) ) { + $auto_update = $update; + } + } + return $auto_update; +} + +/** + * Gets and caches the checksums for the given version of WordPress. + * + * @since 3.7.0 + * + * @param string $version Version string to query. + * @param string $locale Locale to query. + * @return array|false An array of checksums on success, false on failure. + */ +function get_core_checksums( $version, $locale ) { + $http_url = 'http://api.wordpress.org/core/checksums/1.0/?' . http_build_query( compact( 'version', 'locale' ), null, '&' ); + $url = $http_url; + + $ssl = wp_http_supports( array( 'ssl' ) ); + if ( $ssl ) { + $url = set_url_scheme( $url, 'https' ); + } + + $options = array( + 'timeout' => wp_doing_cron() ? 30 : 3, + ); + + $response = wp_remote_get( $url, $options ); + if ( $ssl && is_wp_error( $response ) ) { + trigger_error( + sprintf( + /* translators: %s: Support forums URL. */ + __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), + __( 'https://wordpress.org/support/forums/' ) + ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), + headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE + ); + $response = wp_remote_get( $http_url, $options ); + } + + if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) { + return false; + } + + $body = trim( wp_remote_retrieve_body( $response ) ); + $body = json_decode( $body, true ); + + if ( ! is_array( $body ) || ! isset( $body['checksums'] ) || ! is_array( $body['checksums'] ) ) { + return false; + } + + return $body['checksums']; +} + +/** + * Dismisses core update. + * + * @since 2.7.0 + * + * @param object $update + * @return bool + */ +function dismiss_core_update( $update ) { + $dismissed = get_site_option( 'dismissed_update_core' ); + $dismissed[ $update->current . '|' . $update->locale ] = true; + return update_site_option( 'dismissed_update_core', $dismissed ); +} + +/** + * Undismisses core update. + * + * @since 2.7.0 + * + * @param string $version + * @param string $locale + * @return bool + */ +function undismiss_core_update( $version, $locale ) { + $dismissed = get_site_option( 'dismissed_update_core' ); + $key = $version . '|' . $locale; + + if ( ! isset( $dismissed[ $key ] ) ) { + return false; + } + + unset( $dismissed[ $key ] ); + return update_site_option( 'dismissed_update_core', $dismissed ); +} + +/** + * Finds the available update for WordPress core. + * + * @since 2.7.0 + * + * @param string $version Version string to find the update for. + * @param string $locale Locale to find the update for. + * @return object|false The core update offering on success, false on failure. + */ +function find_core_update( $version, $locale ) { + $from_api = get_site_transient( 'update_core' ); + + if ( ! isset( $from_api->updates ) || ! is_array( $from_api->updates ) ) { + return false; + } + + $updates = $from_api->updates; + foreach ( $updates as $update ) { + if ( $update->current == $version && $update->locale == $locale ) { + return $update; + } + } + return false; +} + +/** + * @since 2.3.0 + * + * @param string $msg + * @return string + */ +function core_update_footer( $msg = '' ) { + if ( ! current_user_can( 'update_core' ) ) { + /* translators: %s: WordPress version. */ + return sprintf( __( 'Version %s' ), get_bloginfo( 'version', 'display' ) ); + } + + $cur = get_preferred_from_update_core(); + if ( ! is_object( $cur ) ) { + $cur = new stdClass; + } + + if ( ! isset( $cur->current ) ) { + $cur->current = ''; + } + + if ( ! isset( $cur->url ) ) { + $cur->url = ''; + } + + if ( ! isset( $cur->response ) ) { + $cur->response = ''; + } + + switch ( $cur->response ) { + case 'development': + return sprintf( + /* translators: 1: WordPress version number, 2: URL to WordPress Updates screen. */ + __( 'You are using a development version (%1$s). Cool! Please stay updated.' ), + get_bloginfo( 'version', 'display' ), + network_admin_url( 'update-core.php' ) + ); + + case 'upgrade': + return sprintf( + '%s', + network_admin_url( 'update-core.php' ), + /* translators: %s: WordPress version. */ + sprintf( __( 'Get Version %s' ), $cur->current ) + ); + + case 'latest': + default: + /* translators: %s: WordPress version. */ + return sprintf( __( 'Version %s' ), get_bloginfo( 'version', 'display' ) ); + } +} + +/** + * @since 2.3.0 + * + * @global string $pagenow + * @return void|false + */ +function update_nag() { + if ( is_multisite() && ! current_user_can( 'update_core' ) ) { + return false; + } + + global $pagenow; + + if ( 'update-core.php' == $pagenow ) { + return; + } + + $cur = get_preferred_from_update_core(); + + if ( ! isset( $cur->response ) || 'upgrade' !== $cur->response ) { + return false; + } + + $version_url = sprintf( + /* translators: %s: WordPress version. */ + esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ), + sanitize_title( $cur->current ) + ); + + if ( current_user_can( 'update_core' ) ) { + $msg = sprintf( + /* translators: 1: URL to WordPress release notes, 2: New WordPress version, 3: URL to network admin, 4: Accessibility text. */ + __( 'WordPress %2$s is available! Please update now.' ), + $version_url, + $cur->current, + network_admin_url( 'update-core.php' ), + esc_attr__( 'Please update WordPress now' ) + ); + } else { + $msg = sprintf( + /* translators: 1: URL to WordPress release notes, 2: New WordPress version. */ + __( 'WordPress %2$s is available! Please notify the site administrator.' ), + $version_url, + $cur->current + ); + } + echo "
        $msg
        "; +} + +/** + * Displays WordPress version and active theme in the 'At a Glance' dashboard widget. + * + * @since 2.5.0 + */ +function update_right_now_message() { + $theme_name = wp_get_theme(); + if ( current_user_can( 'switch_themes' ) ) { + $theme_name = sprintf( '%1$s', $theme_name ); + } + + $msg = ''; + + if ( current_user_can( 'update_core' ) ) { + $cur = get_preferred_from_update_core(); + + if ( isset( $cur->response ) && 'upgrade' === $cur->response ) { + $msg .= sprintf( + '%s ', + network_admin_url( 'update-core.php' ), + /* translators: %s: WordPress version number, or 'Latest' string. */ + sprintf( __( 'Update to %s' ), $cur->current ? $cur->current : __( 'Latest' ) ) + ); + } + } + + /* translators: 1: Version number, 2: Theme name. */ + $content = __( 'WordPress %1$s running %2$s theme.' ); + + /** + * Filters the text displayed in the 'At a Glance' dashboard widget. + * + * Prior to 3.8.0, the widget was named 'Right Now'. + * + * @since 4.4.0 + * + * @param string $content Default text. + */ + $content = apply_filters( 'update_right_now_text', $content ); + + $msg .= sprintf( '' . $content . '', get_bloginfo( 'version', 'display' ), $theme_name ); + + echo "

        $msg

        "; +} + +/** + * @since 2.9.0 + * + * @return array + */ +function get_plugin_updates() { + $all_plugins = get_plugins(); + $upgrade_plugins = array(); + $current = get_site_transient( 'update_plugins' ); + foreach ( (array) $all_plugins as $plugin_file => $plugin_data ) { + if ( isset( $current->response[ $plugin_file ] ) ) { + $upgrade_plugins[ $plugin_file ] = (object) $plugin_data; + $upgrade_plugins[ $plugin_file ]->update = $current->response[ $plugin_file ]; + } + } + + return $upgrade_plugins; +} + +/** + * @since 2.9.0 + */ +function wp_plugin_update_rows() { + if ( ! current_user_can( 'update_plugins' ) ) { + return; + } + + $plugins = get_site_transient( 'update_plugins' ); + if ( isset( $plugins->response ) && is_array( $plugins->response ) ) { + $plugins = array_keys( $plugins->response ); + foreach ( $plugins as $plugin_file ) { + add_action( "after_plugin_row_{$plugin_file}", 'wp_plugin_update_row', 10, 2 ); + } + } +} + +/** + * Displays update information for a plugin. + * + * @since 2.3.0 + * + * @param string $file Plugin basename. + * @param array $plugin_data Plugin information. + * @return void|false + */ +function wp_plugin_update_row( $file, $plugin_data ) { + $current = get_site_transient( 'update_plugins' ); + if ( ! isset( $current->response[ $file ] ) ) { + return false; + } + + $response = $current->response[ $file ]; + + $plugins_allowedtags = array( + 'a' => array( + 'href' => array(), + 'title' => array(), + ), + 'abbr' => array( 'title' => array() ), + 'acronym' => array( 'title' => array() ), + 'code' => array(), + 'em' => array(), + 'strong' => array(), + ); + + $plugin_name = wp_kses( $plugin_data['Name'], $plugins_allowedtags ); + $details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $response->slug . '§ion=changelog&TB_iframe=true&width=600&height=800' ); + + /** @var WP_Plugins_List_Table $wp_list_table */ + $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' ); + + if ( is_network_admin() || ! is_multisite() ) { + if ( is_network_admin() ) { + $active_class = is_plugin_active_for_network( $file ) ? ' active' : ''; + } else { + $active_class = is_plugin_active( $file ) ? ' active' : ''; + } + + $requires_php = isset( $response->requires_php ) ? $response->requires_php : null; + $compatible_php = is_php_version_compatible( $requires_php ); + $notice_type = $compatible_php ? 'notice-warning' : 'notice-error'; + + printf( + '' . + '' . + '

        ', + $active_class, + esc_attr( $response->slug . '-update' ), + esc_attr( $response->slug ), + esc_attr( $file ), + esc_attr( $wp_list_table->get_column_count() ), + $notice_type + ); + + if ( ! current_user_can( 'update_plugins' ) ) { + printf( + /* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number. */ + __( 'There is a new version of %1$s available. View version %4$s details.' ), + $plugin_name, + esc_url( $details_url ), + sprintf( + 'class="thickbox open-plugin-details-modal" aria-label="%s"', + /* translators: 1: Plugin name, 2: Version number. */ + esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) ) + ), + esc_attr( $response->new_version ) + ); + } elseif ( empty( $response->package ) ) { + printf( + /* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number. */ + __( 'There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this plugin.' ), + $plugin_name, + esc_url( $details_url ), + sprintf( + 'class="thickbox open-plugin-details-modal" aria-label="%s"', + /* translators: 1: Plugin name, 2: Version number. */ + esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) ) + ), + esc_attr( $response->new_version ) + ); + } else { + if ( $compatible_php ) { + printf( + /* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number, 5: Update URL, 6: Additional link attributes. */ + __( 'There is a new version of %1$s available. View version %4$s details or update now.' ), + $plugin_name, + esc_url( $details_url ), + sprintf( + 'class="thickbox open-plugin-details-modal" aria-label="%s"', + /* translators: 1: Plugin name, 2: Version number. */ + esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) ) + ), + esc_attr( $response->new_version ), + wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $file, 'upgrade-plugin_' . $file ), + sprintf( + 'class="update-link" aria-label="%s"', + /* translators: %s: Plugin name. */ + esc_attr( sprintf( __( 'Update %s now' ), $plugin_name ) ) + ) + ); + } else { + printf( + /* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number 5: URL to Update PHP page. */ + __( 'There is a new version of %1$s available, but it doesn’t work with your version of PHP. View version %4$s details or learn more about updating PHP.' ), + $plugin_name, + esc_url( $details_url ), + sprintf( + 'class="thickbox open-plugin-details-modal" aria-label="%s"', + /* translators: 1: Plugin name, 2: Version number. */ + esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_name, $response->new_version ) ) + ), + esc_attr( $response->new_version ), + esc_url( wp_get_update_php_url() ) + ); + wp_update_php_annotation( '
        ', '' ); + } + } + + /** + * Fires at the end of the update message container in each + * row of the plugins list table. + * + * The dynamic portion of the hook name, `$file`, refers to the path + * of the plugin's primary file relative to the plugins directory. + * + * @since 2.8.0 + * + * @param array $plugin_data { + * An array of plugin metadata. + * + * @type string $name The human-readable name of the plugin. + * @type string $plugin_uri Plugin URI. + * @type string $version Plugin version. + * @type string $description Plugin description. + * @type string $author Plugin author. + * @type string $author_uri Plugin author URI. + * @type string $text_domain Plugin text domain. + * @type string $domain_path Relative path to the plugin's .mo file(s). + * @type bool $network Whether the plugin can only be activated network wide. + * @type string $title The human-readable title of the plugin. + * @type string $author_name Plugin author's name. + * @type bool $update Whether there's an available update. Default null. + * } + * @param array $response { + * An array of metadata about the available plugin update. + * + * @type int $id Plugin ID. + * @type string $slug Plugin slug. + * @type string $new_version New plugin version. + * @type string $url Plugin URL. + * @type string $package Plugin update package URL. + * } + */ + do_action( "in_plugin_update_message-{$file}", $plugin_data, $response ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + echo '

        '; + } +} + +/** + * @since 2.9.0 + * + * @return array + */ +function get_theme_updates() { + $current = get_site_transient( 'update_themes' ); + + if ( ! isset( $current->response ) ) { + return array(); + } + + $update_themes = array(); + foreach ( $current->response as $stylesheet => $data ) { + $update_themes[ $stylesheet ] = wp_get_theme( $stylesheet ); + $update_themes[ $stylesheet ]->update = $data; + } + + return $update_themes; +} + +/** + * @since 3.1.0 + */ +function wp_theme_update_rows() { + if ( ! current_user_can( 'update_themes' ) ) { + return; + } + + $themes = get_site_transient( 'update_themes' ); + if ( isset( $themes->response ) && is_array( $themes->response ) ) { + $themes = array_keys( $themes->response ); + + foreach ( $themes as $theme ) { + add_action( "after_theme_row_{$theme}", 'wp_theme_update_row', 10, 2 ); + } + } +} + +/** + * Displays update information for a theme. + * + * @since 3.1.0 + * + * @param string $theme_key Theme stylesheet. + * @param WP_Theme $theme Theme object. + * @return void|false + */ +function wp_theme_update_row( $theme_key, $theme ) { + $current = get_site_transient( 'update_themes' ); + + if ( ! isset( $current->response[ $theme_key ] ) ) { + return false; + } + + $response = $current->response[ $theme_key ]; + + $details_url = add_query_arg( + array( + 'TB_iframe' => 'true', + 'width' => 1024, + 'height' => 800, + ), + $current->response[ $theme_key ]['url'] + ); + + /** @var WP_MS_Themes_List_Table $wp_list_table */ + $wp_list_table = _get_list_table( 'WP_MS_Themes_List_Table' ); + + $active = $theme->is_allowed( 'network' ) ? ' active' : ''; + + printf( + '' . + '' . + '

        ', + $active, + esc_attr( $theme->get_stylesheet() . '-update' ), + esc_attr( $theme->get_stylesheet() ), + $wp_list_table->get_column_count() + ); + + if ( ! current_user_can( 'update_themes' ) ) { + printf( + /* translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, 4: Version number. */ + __( 'There is a new version of %1$s available. View version %4$s details.' ), + $theme['Name'], + esc_url( $details_url ), + sprintf( + 'class="thickbox open-plugin-details-modal" aria-label="%s"', + /* translators: 1: Theme name, 2: Version number. */ + esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme['Name'], $response['new_version'] ) ) + ), + $response['new_version'] + ); + } elseif ( empty( $response['package'] ) ) { + printf( + /* translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, 4: Version number. */ + __( 'There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this theme.' ), + $theme['Name'], + esc_url( $details_url ), + sprintf( + 'class="thickbox open-plugin-details-modal" aria-label="%s"', + /* translators: 1: Theme name, 2: Version number. */ + esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme['Name'], $response['new_version'] ) ) + ), + $response['new_version'] + ); + } else { + printf( + /* translators: 1: Theme name, 2: Details URL, 3: Additional link attributes, 4: Version number, 5: Update URL, 6: Additional link attributes. */ + __( 'There is a new version of %1$s available. View version %4$s details or update now.' ), + $theme['Name'], + esc_url( $details_url ), + sprintf( + 'class="thickbox open-plugin-details-modal" aria-label="%s"', + /* translators: 1: Theme name, 2: Version number. */ + esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $theme['Name'], $response['new_version'] ) ) + ), + $response['new_version'], + wp_nonce_url( self_admin_url( 'update.php?action=upgrade-theme&theme=' ) . $theme_key, 'upgrade-theme_' . $theme_key ), + sprintf( + 'class="update-link" aria-label="%s"', + /* translators: %s: Theme name. */ + esc_attr( sprintf( __( 'Update %s now' ), $theme['Name'] ) ) + ) + ); + } + + /** + * Fires at the end of the update message container in each + * row of the themes list table. + * + * The dynamic portion of the hook name, `$theme_key`, refers to + * the theme slug as found in the WordPress.org themes repository. + * + * @since 3.1.0 + * + * @param WP_Theme $theme The WP_Theme object. + * @param array $response { + * An array of metadata about the available theme update. + * + * @type string $new_version New theme version. + * @type string $url Theme URL. + * @type string $package Theme update package URL. + * } + */ + do_action( "in_theme_update_message-{$theme_key}", $theme, $response ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + echo '

        '; +} + +/** + * @since 2.7.0 + * + * @global int $upgrading + * @return void|false + */ +function maintenance_nag() { + // Include an unmodified $wp_version. + require ABSPATH . WPINC . '/version.php'; + global $upgrading; + $nag = isset( $upgrading ); + if ( ! $nag ) { + $failed = get_site_option( 'auto_core_update_failed' ); + /* + * If an update failed critically, we may have copied over version.php but not other files. + * In that case, if the installation claims we're running the version we attempted, nag. + * This is serious enough to err on the side of nagging. + * + * If we simply failed to update before we tried to copy any files, then assume things are + * OK if they are now running the latest. + * + * This flag is cleared whenever a successful update occurs using Core_Upgrader. + */ + $comparison = ! empty( $failed['critical'] ) ? '>=' : '>'; + if ( isset( $failed['attempted'] ) && version_compare( $failed['attempted'], $wp_version, $comparison ) ) { + $nag = true; + } + } + + if ( ! $nag ) { + return false; + } + + if ( current_user_can( 'update_core' ) ) { + $msg = sprintf( + /* translators: %s: URL to WordPress Updates screen. */ + __( 'An automated WordPress update has failed to complete - please attempt the update again now.' ), + 'update-core.php' + ); + } else { + $msg = __( 'An automated WordPress update has failed to complete! Please notify the site administrator.' ); + } + + echo "
        $msg
        "; +} + +/** + * Prints the JavaScript templates for update admin notices. + * + * Template takes one argument with four values: + * + * param {object} data { + * Arguments for admin notice. + * + * @type string id ID of the notice. + * @type string className Class names for the notice. + * @type string message The notice's message. + * @type string type The type of update the notice is for. Either 'plugin' or 'theme'. + * } + * + * @since 4.6.0 + */ +function wp_print_admin_notice_templates() { + ?> + + + + + + +
        +

        + Exit Recovery Mode' ), + esc_url( $url ) + ); + ?> +

        +
        + Note that password carefully! It is a random password that was generated just for you.' ); + $user_id = wp_create_user( $user_name, $user_password, $user_email ); + update_user_option( $user_id, 'default_password_nag', true, true ); + $email_password = true; + $user_created = true; + } elseif ( ! $user_id ) { + // Password has been provided. + $message = '' . __( 'Your chosen password.' ) . ''; + $user_id = wp_create_user( $user_name, $user_password, $user_email ); + $user_created = true; + } else { + $message = __( 'User already exists. Password inherited.' ); + } + + $user = new WP_User( $user_id ); + $user->set_role( 'administrator' ); + + if ( $user_created ) { + $user->user_url = $guessurl; + wp_update_user( $user ); + } + + wp_install_defaults( $user_id ); + + wp_install_maybe_enable_pretty_permalinks(); + + flush_rewrite_rules(); + + wp_new_blog_notification( $blog_title, $guessurl, $user_id, ( $email_password ? $user_password : __( 'The password you chose during installation.' ) ) ); + + wp_cache_flush(); + + /** + * Fires after a site is fully installed. + * + * @since 3.9.0 + * + * @param WP_User $user The site owner. + */ + do_action( 'wp_install', $user ); + + return array( + 'url' => $guessurl, + 'user_id' => $user_id, + 'password' => $user_password, + 'password_message' => $message, + ); + } +endif; + +if ( ! function_exists( 'wp_install_defaults' ) ) : + /** + * Creates the initial content for a newly-installed site. + * + * Adds the default "Uncategorized" category, the first post (with comment), + * first page, and default widgets for default theme for the current version. + * + * @since 2.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * @global string $table_prefix + * + * @param int $user_id User ID. + */ + function wp_install_defaults( $user_id ) { + global $wpdb, $wp_rewrite, $table_prefix; + + // Default category. + $cat_name = __( 'Uncategorized' ); + /* translators: Default category slug. */ + $cat_slug = sanitize_title( _x( 'Uncategorized', 'Default category slug' ) ); + + if ( global_terms_enabled() ) { + $cat_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM {$wpdb->sitecategories} WHERE category_nicename = %s", $cat_slug ) ); + if ( null == $cat_id ) { + $wpdb->insert( + $wpdb->sitecategories, + array( + 'cat_ID' => 0, + 'cat_name' => $cat_name, + 'category_nicename' => $cat_slug, + 'last_updated' => current_time( 'mysql', true ), + ) + ); + $cat_id = $wpdb->insert_id; + } + update_option( 'default_category', $cat_id ); + } else { + $cat_id = 1; + } + + $wpdb->insert( + $wpdb->terms, + array( + 'term_id' => $cat_id, + 'name' => $cat_name, + 'slug' => $cat_slug, + 'term_group' => 0, + ) + ); + $wpdb->insert( + $wpdb->term_taxonomy, + array( + 'term_id' => $cat_id, + 'taxonomy' => 'category', + 'description' => '', + 'parent' => 0, + 'count' => 1, + ) + ); + $cat_tt_id = $wpdb->insert_id; + + // First post. + $now = current_time( 'mysql' ); + $now_gmt = current_time( 'mysql', 1 ); + $first_post_guid = get_option( 'home' ) . '/?p=1'; + + if ( is_multisite() ) { + $first_post = get_site_option( 'first_post' ); + + if ( ! $first_post ) { + $first_post = "\n

        " . + /* translators: First post content. %s: Site link. */ + __( 'Welcome to %s. This is your first post. Edit or delete it, then start writing!' ) . + "

        \n"; + } + + $first_post = sprintf( + $first_post, + sprintf( '%s', esc_url( network_home_url() ), get_network()->site_name ) + ); + + // Back-compat for pre-4.4. + $first_post = str_replace( 'SITE_URL', esc_url( network_home_url() ), $first_post ); + $first_post = str_replace( 'SITE_NAME', get_network()->site_name, $first_post ); + } else { + $first_post = "\n

        " . + /* translators: First post content. %s: Site link. */ + __( 'Welcome to WordPress. This is your first post. Edit or delete it, then start writing!' ) . + "

        \n"; + } + + $wpdb->insert( + $wpdb->posts, + array( + 'post_author' => $user_id, + 'post_date' => $now, + 'post_date_gmt' => $now_gmt, + 'post_content' => $first_post, + 'post_excerpt' => '', + 'post_title' => __( 'Hello world!' ), + /* translators: Default post slug. */ + 'post_name' => sanitize_title( _x( 'hello-world', 'Default post slug' ) ), + 'post_modified' => $now, + 'post_modified_gmt' => $now_gmt, + 'guid' => $first_post_guid, + 'comment_count' => 1, + 'to_ping' => '', + 'pinged' => '', + 'post_content_filtered' => '', + ) + ); + $wpdb->insert( + $wpdb->term_relationships, + array( + 'term_taxonomy_id' => $cat_tt_id, + 'object_id' => 1, + ) + ); + + // Default comment. + if ( is_multisite() ) { + $first_comment_author = get_site_option( 'first_comment_author' ); + $first_comment_email = get_site_option( 'first_comment_email' ); + $first_comment_url = get_site_option( 'first_comment_url', network_home_url() ); + $first_comment = get_site_option( 'first_comment' ); + } + + $first_comment_author = ! empty( $first_comment_author ) ? $first_comment_author : __( 'A WordPress Commenter' ); + $first_comment_email = ! empty( $first_comment_email ) ? $first_comment_email : 'wapuu@wordpress.example'; + $first_comment_url = ! empty( $first_comment_url ) ? $first_comment_url : 'https://wordpress.org/'; + $first_comment = ! empty( $first_comment ) ? $first_comment : __( + 'Hi, this is a comment. +To get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard. +Commenter avatars come from Gravatar.' + ); + $wpdb->insert( + $wpdb->comments, + array( + 'comment_post_ID' => 1, + 'comment_author' => $first_comment_author, + 'comment_author_email' => $first_comment_email, + 'comment_author_url' => $first_comment_url, + 'comment_date' => $now, + 'comment_date_gmt' => $now_gmt, + 'comment_content' => $first_comment, + ) + ); + + // First page. + if ( is_multisite() ) { + $first_page = get_site_option( 'first_page' ); + } + + if ( empty( $first_page ) ) { + $first_page = "\n

        "; + /* translators: First page content. */ + $first_page .= __( "This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:" ); + $first_page .= "

        \n\n\n"; + + $first_page .= "\n

        "; + /* translators: First page content. */ + $first_page .= __( "Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)" ); + $first_page .= "

        \n\n\n"; + + $first_page .= "\n

        "; + /* translators: First page content. */ + $first_page .= __( '...or something like this:' ); + $first_page .= "

        \n\n\n"; + + $first_page .= "\n

        "; + /* translators: First page content. */ + $first_page .= __( 'The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.' ); + $first_page .= "

        \n\n\n"; + + $first_page .= "\n

        "; + $first_page .= sprintf( + /* translators: First page content. %s: Site admin URL. */ + __( 'As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!' ), + admin_url() + ); + $first_page .= "

        \n"; + } + + $first_post_guid = get_option( 'home' ) . '/?page_id=2'; + $wpdb->insert( + $wpdb->posts, + array( + 'post_author' => $user_id, + 'post_date' => $now, + 'post_date_gmt' => $now_gmt, + 'post_content' => $first_page, + 'post_excerpt' => '', + 'comment_status' => 'closed', + 'post_title' => __( 'Sample Page' ), + /* translators: Default page slug. */ + 'post_name' => __( 'sample-page' ), + 'post_modified' => $now, + 'post_modified_gmt' => $now_gmt, + 'guid' => $first_post_guid, + 'post_type' => 'page', + 'to_ping' => '', + 'pinged' => '', + 'post_content_filtered' => '', + ) + ); + $wpdb->insert( + $wpdb->postmeta, + array( + 'post_id' => 2, + 'meta_key' => '_wp_page_template', + 'meta_value' => 'default', + ) + ); + + // Privacy Policy page. + if ( is_multisite() ) { + // Disable by default unless the suggested content is provided. + $privacy_policy_content = get_site_option( 'default_privacy_policy_content' ); + } else { + if ( ! class_exists( 'WP_Privacy_Policy_Content' ) ) { + include_once ABSPATH . 'wp-admin/includes/class-wp-privacy-policy-content.php'; + } + + $privacy_policy_content = WP_Privacy_Policy_Content::get_default_content(); + } + + if ( ! empty( $privacy_policy_content ) ) { + $privacy_policy_guid = get_option( 'home' ) . '/?page_id=3'; + + $wpdb->insert( + $wpdb->posts, + array( + 'post_author' => $user_id, + 'post_date' => $now, + 'post_date_gmt' => $now_gmt, + 'post_content' => $privacy_policy_content, + 'post_excerpt' => '', + 'comment_status' => 'closed', + 'post_title' => __( 'Privacy Policy' ), + /* translators: Privacy Policy page slug. */ + 'post_name' => __( 'privacy-policy' ), + 'post_modified' => $now, + 'post_modified_gmt' => $now_gmt, + 'guid' => $privacy_policy_guid, + 'post_type' => 'page', + 'post_status' => 'draft', + 'to_ping' => '', + 'pinged' => '', + 'post_content_filtered' => '', + ) + ); + $wpdb->insert( + $wpdb->postmeta, + array( + 'post_id' => 3, + 'meta_key' => '_wp_page_template', + 'meta_value' => 'default', + ) + ); + update_option( 'wp_page_for_privacy_policy', 3 ); + } + + // Set up default widgets for default theme. + update_option( + 'widget_search', + array( + 2 => array( 'title' => '' ), + '_multiwidget' => 1, + ) + ); + update_option( + 'widget_recent-posts', + array( + 2 => array( + 'title' => '', + 'number' => 5, + ), + '_multiwidget' => 1, + ) + ); + update_option( + 'widget_recent-comments', + array( + 2 => array( + 'title' => '', + 'number' => 5, + ), + '_multiwidget' => 1, + ) + ); + update_option( + 'widget_archives', + array( + 2 => array( + 'title' => '', + 'count' => 0, + 'dropdown' => 0, + ), + '_multiwidget' => 1, + ) + ); + update_option( + 'widget_categories', + array( + 2 => array( + 'title' => '', + 'count' => 0, + 'hierarchical' => 0, + 'dropdown' => 0, + ), + '_multiwidget' => 1, + ) + ); + update_option( + 'widget_meta', + array( + 2 => array( 'title' => '' ), + '_multiwidget' => 1, + ) + ); + update_option( + 'sidebars_widgets', + array( + 'wp_inactive_widgets' => array(), + 'sidebar-1' => array( + 0 => 'search-2', + 1 => 'recent-posts-2', + 2 => 'recent-comments-2', + ), + 'sidebar-2' => array( + 0 => 'archives-2', + 1 => 'categories-2', + 2 => 'meta-2', + ), + 'array_version' => 3, + ) + ); + if ( ! is_multisite() ) { + update_user_meta( $user_id, 'show_welcome_panel', 1 ); + } elseif ( ! is_super_admin( $user_id ) && ! metadata_exists( 'user', $user_id, 'show_welcome_panel' ) ) { + update_user_meta( $user_id, 'show_welcome_panel', 2 ); + } + + if ( is_multisite() ) { + // Flush rules to pick up the new page. + $wp_rewrite->init(); + $wp_rewrite->flush_rules(); + + $user = new WP_User( $user_id ); + $wpdb->update( $wpdb->options, array( 'option_value' => $user->user_email ), array( 'option_name' => 'admin_email' ) ); + + // Remove all perms except for the login user. + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix . 'user_level' ) ); + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix . 'capabilities' ) ); + + // Delete any caps that snuck into the previously active blog. (Hardcoded to blog 1 for now.) + // TODO: Get previous_blog_id. + if ( ! is_super_admin( $user_id ) && 1 != $user_id ) { + $wpdb->delete( + $wpdb->usermeta, + array( + 'user_id' => $user_id, + 'meta_key' => $wpdb->base_prefix . '1_capabilities', + ) + ); + } + } + } +endif; + +/** + * Maybe enable pretty permalinks on installation. + * + * If after enabling pretty permalinks don't work, fallback to query-string permalinks. + * + * @since 4.2.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * + * @return bool Whether pretty permalinks are enabled. False otherwise. + */ +function wp_install_maybe_enable_pretty_permalinks() { + global $wp_rewrite; + + // Bail if a permalink structure is already enabled. + if ( get_option( 'permalink_structure' ) ) { + return true; + } + + /* + * The Permalink structures to attempt. + * + * The first is designed for mod_rewrite or nginx rewriting. + * + * The second is PATHINFO-based permalinks for web server configurations + * without a true rewrite module enabled. + */ + $permalink_structures = array( + '/%year%/%monthnum%/%day%/%postname%/', + '/index.php/%year%/%monthnum%/%day%/%postname%/', + ); + + foreach ( (array) $permalink_structures as $permalink_structure ) { + $wp_rewrite->set_permalink_structure( $permalink_structure ); + + /* + * Flush rules with the hard option to force refresh of the web-server's + * rewrite config file (e.g. .htaccess or web.config). + */ + $wp_rewrite->flush_rules( true ); + + $test_url = ''; + + // Test against a real WordPress post. + $first_post = get_page_by_path( sanitize_title( _x( 'hello-world', 'Default post slug' ) ), OBJECT, 'post' ); + if ( $first_post ) { + $test_url = get_permalink( $first_post->ID ); + } + + /* + * Send a request to the site, and check whether + * the 'x-pingback' header is returned as expected. + * + * Uses wp_remote_get() instead of wp_remote_head() because web servers + * can block head requests. + */ + $response = wp_remote_get( $test_url, array( 'timeout' => 5 ) ); + $x_pingback_header = wp_remote_retrieve_header( $response, 'x-pingback' ); + $pretty_permalinks = $x_pingback_header && get_bloginfo( 'pingback_url' ) === $x_pingback_header; + + if ( $pretty_permalinks ) { + return true; + } + } + + /* + * If it makes it this far, pretty permalinks failed. + * Fallback to query-string permalinks. + */ + $wp_rewrite->set_permalink_structure( '' ); + $wp_rewrite->flush_rules( true ); + + return false; +} + +if ( ! function_exists( 'wp_new_blog_notification' ) ) : + /** + * Notifies the site admin that the setup is complete. + * + * Sends an email with wp_mail to the new administrator that the site setup is complete, + * and provides them with a record of their login credentials. + * + * @since 2.1.0 + * + * @param string $blog_title Site title. + * @param string $blog_url Site url. + * @param int $user_id User ID. + * @param string $password User's Password. + */ + function wp_new_blog_notification( $blog_title, $blog_url, $user_id, $password ) { + $user = new WP_User( $user_id ); + $email = $user->user_email; + $name = $user->user_login; + $login_url = wp_login_url(); + + $message = sprintf( + /* translators: New site notification email. 1: New site URL, 2: User login, 3: User password or password reset link, 4: Login URL. */ + __( + 'Your new WordPress site has been successfully set up at: + +%1$s + +You can log in to the administrator account with the following information: + +Username: %2$s +Password: %3$s +Log in here: %4$s + +We hope you enjoy your new site. Thanks! + +--The WordPress Team +https://wordpress.org/ +' + ), + $blog_url, + $name, + $password, + $login_url + ); + + wp_mail( $email, __( 'New WordPress Site' ), $message ); + } +endif; + +if ( ! function_exists( 'wp_upgrade' ) ) : + /** + * Runs WordPress Upgrade functions. + * + * Upgrades the database if needed during a site update. + * + * @since 2.1.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global int $wp_db_version The new database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ + function wp_upgrade() { + global $wp_current_db_version, $wp_db_version, $wpdb; + + $wp_current_db_version = __get_option( 'db_version' ); + + // We are up to date. Nothing to do. + if ( $wp_db_version == $wp_current_db_version ) { + return; + } + + if ( ! is_blog_installed() ) { + return; + } + + wp_check_mysql_version(); + wp_cache_flush(); + pre_schema_upgrade(); + make_db_current_silent(); + upgrade_all(); + if ( is_multisite() && is_main_site() ) { + upgrade_network(); + } + wp_cache_flush(); + + if ( is_multisite() ) { + update_site_meta( get_current_blog_id(), 'db_version', $wp_db_version ); + update_site_meta( get_current_blog_id(), 'db_last_updated', microtime() ); + } + + /** + * Fires after a site is fully upgraded. + * + * @since 3.9.0 + * + * @param int $wp_db_version The new $wp_db_version. + * @param int $wp_current_db_version The old (current) $wp_db_version. + */ + do_action( 'wp_upgrade', $wp_db_version, $wp_current_db_version ); + } +endif; + +/** + * Functions to be called in installation and upgrade scripts. + * + * Contains conditional checks to determine which upgrade scripts to run, + * based on database version and WP version being updated-to. + * + * @ignore + * @since 1.0.1 + * + * @global int $wp_current_db_version The old (current) database version. + * @global int $wp_db_version The new database version. + */ +function upgrade_all() { + global $wp_current_db_version, $wp_db_version; + $wp_current_db_version = __get_option( 'db_version' ); + + // We are up to date. Nothing to do. + if ( $wp_db_version == $wp_current_db_version ) { + return; + } + + // If the version is not set in the DB, try to guess the version. + if ( empty( $wp_current_db_version ) ) { + $wp_current_db_version = 0; + + // If the template option exists, we have 1.5. + $template = __get_option( 'template' ); + if ( ! empty( $template ) ) { + $wp_current_db_version = 2541; + } + } + + if ( $wp_current_db_version < 6039 ) { + upgrade_230_options_table(); + } + + populate_options(); + + if ( $wp_current_db_version < 2541 ) { + upgrade_100(); + upgrade_101(); + upgrade_110(); + upgrade_130(); + } + + if ( $wp_current_db_version < 3308 ) { + upgrade_160(); + } + + if ( $wp_current_db_version < 4772 ) { + upgrade_210(); + } + + if ( $wp_current_db_version < 4351 ) { + upgrade_old_slugs(); + } + + if ( $wp_current_db_version < 5539 ) { + upgrade_230(); + } + + if ( $wp_current_db_version < 6124 ) { + upgrade_230_old_tables(); + } + + if ( $wp_current_db_version < 7499 ) { + upgrade_250(); + } + + if ( $wp_current_db_version < 7935 ) { + upgrade_252(); + } + + if ( $wp_current_db_version < 8201 ) { + upgrade_260(); + } + + if ( $wp_current_db_version < 8989 ) { + upgrade_270(); + } + + if ( $wp_current_db_version < 10360 ) { + upgrade_280(); + } + + if ( $wp_current_db_version < 11958 ) { + upgrade_290(); + } + + if ( $wp_current_db_version < 15260 ) { + upgrade_300(); + } + + if ( $wp_current_db_version < 19389 ) { + upgrade_330(); + } + + if ( $wp_current_db_version < 20080 ) { + upgrade_340(); + } + + if ( $wp_current_db_version < 22422 ) { + upgrade_350(); + } + + if ( $wp_current_db_version < 25824 ) { + upgrade_370(); + } + + if ( $wp_current_db_version < 26148 ) { + upgrade_372(); + } + + if ( $wp_current_db_version < 26691 ) { + upgrade_380(); + } + + if ( $wp_current_db_version < 29630 ) { + upgrade_400(); + } + + if ( $wp_current_db_version < 33055 ) { + upgrade_430(); + } + + if ( $wp_current_db_version < 33056 ) { + upgrade_431(); + } + + if ( $wp_current_db_version < 35700 ) { + upgrade_440(); + } + + if ( $wp_current_db_version < 36686 ) { + upgrade_450(); + } + + if ( $wp_current_db_version < 37965 ) { + upgrade_460(); + } + + if ( $wp_current_db_version < 44719 ) { + upgrade_510(); + } + + if ( $wp_current_db_version < 45744 ) { + upgrade_530(); + } + + maybe_disable_link_manager(); + + maybe_disable_automattic_widgets(); + + update_option( 'db_version', $wp_db_version ); + update_option( 'db_upgraded', true ); +} + +/** + * Execute changes made in WordPress 1.0. + * + * @ignore + * @since 1.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_100() { + global $wpdb; + + // Get the title and ID of every post, post_name to check if it already has a value. + $posts = $wpdb->get_results( "SELECT ID, post_title, post_name FROM $wpdb->posts WHERE post_name = ''" ); + if ( $posts ) { + foreach ( $posts as $post ) { + if ( '' == $post->post_name ) { + $newtitle = sanitize_title( $post->post_title ); + $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_name = %s WHERE ID = %d", $newtitle, $post->ID ) ); + } + } + } + + $categories = $wpdb->get_results( "SELECT cat_ID, cat_name, category_nicename FROM $wpdb->categories" ); + foreach ( $categories as $category ) { + if ( '' == $category->category_nicename ) { + $newtitle = sanitize_title( $category->cat_name ); + $wpdb->update( $wpdb->categories, array( 'category_nicename' => $newtitle ), array( 'cat_ID' => $category->cat_ID ) ); + } + } + + $sql = "UPDATE $wpdb->options + SET option_value = REPLACE(option_value, 'wp-links/links-images/', 'wp-images/links/') + WHERE option_name LIKE %s + AND option_value LIKE %s"; + $wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( 'links_rating_image' ) . '%', $wpdb->esc_like( 'wp-links/links-images/' ) . '%' ) ); + + $done_ids = $wpdb->get_results( "SELECT DISTINCT post_id FROM $wpdb->post2cat" ); + if ( $done_ids ) : + $done_posts = array(); + foreach ( $done_ids as $done_id ) : + $done_posts[] = $done_id->post_id; + endforeach; + $catwhere = ' AND ID NOT IN (' . implode( ',', $done_posts ) . ')'; + else : + $catwhere = ''; + endif; + + $allposts = $wpdb->get_results( "SELECT ID, post_category FROM $wpdb->posts WHERE post_category != '0' $catwhere" ); + if ( $allposts ) : + foreach ( $allposts as $post ) { + // Check to see if it's already been imported. + $cat = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->post2cat WHERE post_id = %d AND category_id = %d", $post->ID, $post->post_category ) ); + if ( ! $cat && 0 != $post->post_category ) { // If there's no result. + $wpdb->insert( + $wpdb->post2cat, + array( + 'post_id' => $post->ID, + 'category_id' => $post->post_category, + ) + ); + } + } + endif; +} + +/** + * Execute changes made in WordPress 1.0.1. + * + * @ignore + * @since 1.0.1 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_101() { + global $wpdb; + + // Clean up indices, add a few. + add_clean_index( $wpdb->posts, 'post_name' ); + add_clean_index( $wpdb->posts, 'post_status' ); + add_clean_index( $wpdb->categories, 'category_nicename' ); + add_clean_index( $wpdb->comments, 'comment_approved' ); + add_clean_index( $wpdb->comments, 'comment_post_ID' ); + add_clean_index( $wpdb->links, 'link_category' ); + add_clean_index( $wpdb->links, 'link_visible' ); +} + +/** + * Execute changes made in WordPress 1.2. + * + * @ignore + * @since 1.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_110() { + global $wpdb; + + // Set user_nicename. + $users = $wpdb->get_results( "SELECT ID, user_nickname, user_nicename FROM $wpdb->users" ); + foreach ( $users as $user ) { + if ( '' == $user->user_nicename ) { + $newname = sanitize_title( $user->user_nickname ); + $wpdb->update( $wpdb->users, array( 'user_nicename' => $newname ), array( 'ID' => $user->ID ) ); + } + } + + $users = $wpdb->get_results( "SELECT ID, user_pass from $wpdb->users" ); + foreach ( $users as $row ) { + if ( ! preg_match( '/^[A-Fa-f0-9]{32}$/', $row->user_pass ) ) { + $wpdb->update( $wpdb->users, array( 'user_pass' => md5( $row->user_pass ) ), array( 'ID' => $row->ID ) ); + } + } + + // Get the GMT offset, we'll use that later on. + $all_options = get_alloptions_110(); + + $time_difference = $all_options->time_difference; + + $server_time = time() + gmdate( 'Z' ); + $weblogger_time = $server_time + $time_difference * HOUR_IN_SECONDS; + $gmt_time = time(); + + $diff_gmt_server = ( $gmt_time - $server_time ) / HOUR_IN_SECONDS; + $diff_weblogger_server = ( $weblogger_time - $server_time ) / HOUR_IN_SECONDS; + $diff_gmt_weblogger = $diff_gmt_server - $diff_weblogger_server; + $gmt_offset = -$diff_gmt_weblogger; + + // Add a gmt_offset option, with value $gmt_offset. + add_option( 'gmt_offset', $gmt_offset ); + + /* + * Check if we already set the GMT fields. If we did, then + * MAX(post_date_gmt) can't be '0000-00-00 00:00:00'. + * I just slapped myself silly for not thinking about it earlier. + */ + $got_gmt_fields = ! ( $wpdb->get_var( "SELECT MAX(post_date_gmt) FROM $wpdb->posts" ) == '0000-00-00 00:00:00' ); + + if ( ! $got_gmt_fields ) { + + // Add or subtract time to all dates, to get GMT dates. + $add_hours = intval( $diff_gmt_weblogger ); + $add_minutes = intval( 60 * ( $diff_gmt_weblogger - $add_hours ) ); + $wpdb->query( "UPDATE $wpdb->posts SET post_date_gmt = DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)" ); + $wpdb->query( "UPDATE $wpdb->posts SET post_modified = post_date" ); + $wpdb->query( "UPDATE $wpdb->posts SET post_modified_gmt = DATE_ADD(post_modified, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE) WHERE post_modified != '0000-00-00 00:00:00'" ); + $wpdb->query( "UPDATE $wpdb->comments SET comment_date_gmt = DATE_ADD(comment_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)" ); + $wpdb->query( "UPDATE $wpdb->users SET user_registered = DATE_ADD(user_registered, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)" ); + } + +} + +/** + * Execute changes made in WordPress 1.5. + * + * @ignore + * @since 1.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_130() { + global $wpdb; + + // Remove extraneous backslashes. + $posts = $wpdb->get_results( "SELECT ID, post_title, post_content, post_excerpt, guid, post_date, post_name, post_status, post_author FROM $wpdb->posts" ); + if ( $posts ) { + foreach ( $posts as $post ) { + $post_content = addslashes( deslash( $post->post_content ) ); + $post_title = addslashes( deslash( $post->post_title ) ); + $post_excerpt = addslashes( deslash( $post->post_excerpt ) ); + if ( empty( $post->guid ) ) { + $guid = get_permalink( $post->ID ); + } else { + $guid = $post->guid; + } + + $wpdb->update( $wpdb->posts, compact( 'post_title', 'post_content', 'post_excerpt', 'guid' ), array( 'ID' => $post->ID ) ); + + } + } + + // Remove extraneous backslashes. + $comments = $wpdb->get_results( "SELECT comment_ID, comment_author, comment_content FROM $wpdb->comments" ); + if ( $comments ) { + foreach ( $comments as $comment ) { + $comment_content = deslash( $comment->comment_content ); + $comment_author = deslash( $comment->comment_author ); + + $wpdb->update( $wpdb->comments, compact( 'comment_content', 'comment_author' ), array( 'comment_ID' => $comment->comment_ID ) ); + } + } + + // Remove extraneous backslashes. + $links = $wpdb->get_results( "SELECT link_id, link_name, link_description FROM $wpdb->links" ); + if ( $links ) { + foreach ( $links as $link ) { + $link_name = deslash( $link->link_name ); + $link_description = deslash( $link->link_description ); + + $wpdb->update( $wpdb->links, compact( 'link_name', 'link_description' ), array( 'link_id' => $link->link_id ) ); + } + } + + $active_plugins = __get_option( 'active_plugins' ); + + /* + * If plugins are not stored in an array, they're stored in the old + * newline separated format. Convert to new format. + */ + if ( ! is_array( $active_plugins ) ) { + $active_plugins = explode( "\n", trim( $active_plugins ) ); + update_option( 'active_plugins', $active_plugins ); + } + + // Obsolete tables. + $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optionvalues' ); + $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiontypes' ); + $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroups' ); + $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroup_options' ); + + // Update comments table to use comment_type. + $wpdb->query( "UPDATE $wpdb->comments SET comment_type='trackback', comment_content = REPLACE(comment_content, '', '') WHERE comment_content LIKE '%'" ); + $wpdb->query( "UPDATE $wpdb->comments SET comment_type='pingback', comment_content = REPLACE(comment_content, '', '') WHERE comment_content LIKE '%'" ); + + // Some versions have multiple duplicate option_name rows with the same values. + $options = $wpdb->get_results( "SELECT option_name, COUNT(option_name) AS dupes FROM `$wpdb->options` GROUP BY option_name" ); + foreach ( $options as $option ) { + if ( 1 != $option->dupes ) { // Could this be done in the query? + $limit = $option->dupes - 1; + $dupe_ids = $wpdb->get_col( $wpdb->prepare( "SELECT option_id FROM $wpdb->options WHERE option_name = %s LIMIT %d", $option->option_name, $limit ) ); + if ( $dupe_ids ) { + $dupe_ids = join( ',', $dupe_ids ); + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)" ); + } + } + } + + make_site_theme(); +} + +/** + * Execute changes made in WordPress 2.0. + * + * @ignore + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global int $wp_current_db_version The old (current) database version. + */ +function upgrade_160() { + global $wpdb, $wp_current_db_version; + + populate_roles_160(); + + $users = $wpdb->get_results( "SELECT * FROM $wpdb->users" ); + foreach ( $users as $user ) : + if ( ! empty( $user->user_firstname ) ) { + update_user_meta( $user->ID, 'first_name', wp_slash( $user->user_firstname ) ); + } + if ( ! empty( $user->user_lastname ) ) { + update_user_meta( $user->ID, 'last_name', wp_slash( $user->user_lastname ) ); + } + if ( ! empty( $user->user_nickname ) ) { + update_user_meta( $user->ID, 'nickname', wp_slash( $user->user_nickname ) ); + } + if ( ! empty( $user->user_level ) ) { + update_user_meta( $user->ID, $wpdb->prefix . 'user_level', $user->user_level ); + } + if ( ! empty( $user->user_icq ) ) { + update_user_meta( $user->ID, 'icq', wp_slash( $user->user_icq ) ); + } + if ( ! empty( $user->user_aim ) ) { + update_user_meta( $user->ID, 'aim', wp_slash( $user->user_aim ) ); + } + if ( ! empty( $user->user_msn ) ) { + update_user_meta( $user->ID, 'msn', wp_slash( $user->user_msn ) ); + } + if ( ! empty( $user->user_yim ) ) { + update_user_meta( $user->ID, 'yim', wp_slash( $user->user_icq ) ); + } + if ( ! empty( $user->user_description ) ) { + update_user_meta( $user->ID, 'description', wp_slash( $user->user_description ) ); + } + + if ( isset( $user->user_idmode ) ) : + $idmode = $user->user_idmode; + if ( 'nickname' === $idmode ) { + $id = $user->user_nickname; + } + if ( 'login' === $idmode ) { + $id = $user->user_login; + } + if ( 'firstname' === $idmode ) { + $id = $user->user_firstname; + } + if ( 'lastname' === $idmode ) { + $id = $user->user_lastname; + } + if ( 'namefl' === $idmode ) { + $id = $user->user_firstname . ' ' . $user->user_lastname; + } + if ( 'namelf' === $idmode ) { + $id = $user->user_lastname . ' ' . $user->user_firstname; + } + if ( ! $idmode ) { + $id = $user->user_nickname; + } + $wpdb->update( $wpdb->users, array( 'display_name' => $id ), array( 'ID' => $user->ID ) ); + endif; + + // FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set. + $caps = get_user_meta( $user->ID, $wpdb->prefix . 'capabilities' ); + if ( empty( $caps ) || defined( 'RESET_CAPS' ) ) { + $level = get_user_meta( $user->ID, $wpdb->prefix . 'user_level', true ); + $role = translate_level_to_role( $level ); + update_user_meta( $user->ID, $wpdb->prefix . 'capabilities', array( $role => true ) ); + } + + endforeach; + $old_user_fields = array( 'user_firstname', 'user_lastname', 'user_icq', 'user_aim', 'user_msn', 'user_yim', 'user_idmode', 'user_ip', 'user_domain', 'user_browser', 'user_description', 'user_nickname', 'user_level' ); + $wpdb->hide_errors(); + foreach ( $old_user_fields as $old ) { + $wpdb->query( "ALTER TABLE $wpdb->users DROP $old" ); + } + $wpdb->show_errors(); + + // Populate comment_count field of posts table. + $comments = $wpdb->get_results( "SELECT comment_post_ID, COUNT(*) as c FROM $wpdb->comments WHERE comment_approved = '1' GROUP BY comment_post_ID" ); + if ( is_array( $comments ) ) { + foreach ( $comments as $comment ) { + $wpdb->update( $wpdb->posts, array( 'comment_count' => $comment->c ), array( 'ID' => $comment->comment_post_ID ) ); + } + } + + /* + * Some alpha versions used a post status of object instead of attachment + * and put the mime type in post_type instead of post_mime_type. + */ + if ( $wp_current_db_version > 2541 && $wp_current_db_version <= 3091 ) { + $objects = $wpdb->get_results( "SELECT ID, post_type FROM $wpdb->posts WHERE post_status = 'object'" ); + foreach ( $objects as $object ) { + $wpdb->update( + $wpdb->posts, + array( + 'post_status' => 'attachment', + 'post_mime_type' => $object->post_type, + 'post_type' => '', + ), + array( 'ID' => $object->ID ) + ); + + $meta = get_post_meta( $object->ID, 'imagedata', true ); + if ( ! empty( $meta['file'] ) ) { + update_attached_file( $object->ID, $meta['file'] ); + } + } + } +} + +/** + * Execute changes made in WordPress 2.1. + * + * @ignore + * @since 2.1.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_210() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 3506 ) { + // Update status and type. + $posts = $wpdb->get_results( "SELECT ID, post_status FROM $wpdb->posts" ); + + if ( ! empty( $posts ) ) { + foreach ( $posts as $post ) { + $status = $post->post_status; + $type = 'post'; + + if ( 'static' == $status ) { + $status = 'publish'; + $type = 'page'; + } elseif ( 'attachment' == $status ) { + $status = 'inherit'; + $type = 'attachment'; + } + + $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_status = %s, post_type = %s WHERE ID = %d", $status, $type, $post->ID ) ); + } + } + } + + if ( $wp_current_db_version < 3845 ) { + populate_roles_210(); + } + + if ( $wp_current_db_version < 3531 ) { + // Give future posts a post_status of future. + $now = gmdate( 'Y-m-d H:i:59' ); + $wpdb->query( "UPDATE $wpdb->posts SET post_status = 'future' WHERE post_status = 'publish' AND post_date_gmt > '$now'" ); + + $posts = $wpdb->get_results( "SELECT ID, post_date FROM $wpdb->posts WHERE post_status ='future'" ); + if ( ! empty( $posts ) ) { + foreach ( $posts as $post ) { + wp_schedule_single_event( mysql2date( 'U', $post->post_date, false ), 'publish_future_post', array( $post->ID ) ); + } + } + } +} + +/** + * Execute changes made in WordPress 2.3. + * + * @ignore + * @since 2.3.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_230() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 5200 ) { + populate_roles_230(); + } + + // Convert categories to terms. + $tt_ids = array(); + $have_tags = false; + $categories = $wpdb->get_results( "SELECT * FROM $wpdb->categories ORDER BY cat_ID" ); + foreach ( $categories as $category ) { + $term_id = (int) $category->cat_ID; + $name = $category->cat_name; + $description = $category->category_description; + $slug = $category->category_nicename; + $parent = $category->category_parent; + $term_group = 0; + + // Associate terms with the same slug in a term group and make slugs unique. + $exists = $wpdb->get_results( $wpdb->prepare( "SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug ) ); + if ( $exists ) { + $term_group = $exists[0]->term_group; + $id = $exists[0]->term_id; + $num = 2; + do { + $alt_slug = $slug . "-$num"; + $num++; + $slug_check = $wpdb->get_var( $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug ) ); + } while ( $slug_check ); + + $slug = $alt_slug; + + if ( empty( $term_group ) ) { + $term_group = $wpdb->get_var( "SELECT MAX(term_group) FROM $wpdb->terms GROUP BY term_group" ) + 1; + $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->terms SET term_group = %d WHERE term_id = %d", $term_group, $id ) ); + } + } + + $wpdb->query( + $wpdb->prepare( + "INSERT INTO $wpdb->terms (term_id, name, slug, term_group) VALUES + (%d, %s, %s, %d)", + $term_id, + $name, + $slug, + $term_group + ) + ); + + $count = 0; + if ( ! empty( $category->category_count ) ) { + $count = (int) $category->category_count; + $taxonomy = 'category'; + $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count ) ); + $tt_ids[ $term_id ][ $taxonomy ] = (int) $wpdb->insert_id; + } + + if ( ! empty( $category->link_count ) ) { + $count = (int) $category->link_count; + $taxonomy = 'link_category'; + $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count ) ); + $tt_ids[ $term_id ][ $taxonomy ] = (int) $wpdb->insert_id; + } + + if ( ! empty( $category->tag_count ) ) { + $have_tags = true; + $count = (int) $category->tag_count; + $taxonomy = 'post_tag'; + $wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent', 'count' ) ); + $tt_ids[ $term_id ][ $taxonomy ] = (int) $wpdb->insert_id; + } + + if ( empty( $count ) ) { + $count = 0; + $taxonomy = 'category'; + $wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent', 'count' ) ); + $tt_ids[ $term_id ][ $taxonomy ] = (int) $wpdb->insert_id; + } + } + + $select = 'post_id, category_id'; + if ( $have_tags ) { + $select .= ', rel_type'; + } + + $posts = $wpdb->get_results( "SELECT $select FROM $wpdb->post2cat GROUP BY post_id, category_id" ); + foreach ( $posts as $post ) { + $post_id = (int) $post->post_id; + $term_id = (int) $post->category_id; + $taxonomy = 'category'; + if ( ! empty( $post->rel_type ) && 'tag' == $post->rel_type ) { + $taxonomy = 'tag'; + } + $tt_id = $tt_ids[ $term_id ][ $taxonomy ]; + if ( empty( $tt_id ) ) { + continue; + } + + $wpdb->insert( + $wpdb->term_relationships, + array( + 'object_id' => $post_id, + 'term_taxonomy_id' => $tt_id, + ) + ); + } + + // < 3570 we used linkcategories. >= 3570 we used categories and link2cat. + if ( $wp_current_db_version < 3570 ) { + /* + * Create link_category terms for link categories. Create a map of link + * category IDs to link_category terms. + */ + $link_cat_id_map = array(); + $default_link_cat = 0; + $tt_ids = array(); + $link_cats = $wpdb->get_results( 'SELECT cat_id, cat_name FROM ' . $wpdb->prefix . 'linkcategories' ); + foreach ( $link_cats as $category ) { + $cat_id = (int) $category->cat_id; + $term_id = 0; + $name = wp_slash( $category->cat_name ); + $slug = sanitize_title( $name ); + $term_group = 0; + + // Associate terms with the same slug in a term group and make slugs unique. + $exists = $wpdb->get_results( $wpdb->prepare( "SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug ) ); + if ( $exists ) { + $term_group = $exists[0]->term_group; + $term_id = $exists[0]->term_id; + } + + if ( empty( $term_id ) ) { + $wpdb->insert( $wpdb->terms, compact( 'name', 'slug', 'term_group' ) ); + $term_id = (int) $wpdb->insert_id; + } + + $link_cat_id_map[ $cat_id ] = $term_id; + $default_link_cat = $term_id; + + $wpdb->insert( + $wpdb->term_taxonomy, + array( + 'term_id' => $term_id, + 'taxonomy' => 'link_category', + 'description' => '', + 'parent' => 0, + 'count' => 0, + ) + ); + $tt_ids[ $term_id ] = (int) $wpdb->insert_id; + } + + // Associate links to categories. + $links = $wpdb->get_results( "SELECT link_id, link_category FROM $wpdb->links" ); + if ( ! empty( $links ) ) { + foreach ( $links as $link ) { + if ( 0 == $link->link_category ) { + continue; + } + if ( ! isset( $link_cat_id_map[ $link->link_category ] ) ) { + continue; + } + $term_id = $link_cat_id_map[ $link->link_category ]; + $tt_id = $tt_ids[ $term_id ]; + if ( empty( $tt_id ) ) { + continue; + } + + $wpdb->insert( + $wpdb->term_relationships, + array( + 'object_id' => $link->link_id, + 'term_taxonomy_id' => $tt_id, + ) + ); + } + } + + // Set default to the last category we grabbed during the upgrade loop. + update_option( 'default_link_category', $default_link_cat ); + } else { + $links = $wpdb->get_results( "SELECT link_id, category_id FROM $wpdb->link2cat GROUP BY link_id, category_id" ); + foreach ( $links as $link ) { + $link_id = (int) $link->link_id; + $term_id = (int) $link->category_id; + $taxonomy = 'link_category'; + $tt_id = $tt_ids[ $term_id ][ $taxonomy ]; + if ( empty( $tt_id ) ) { + continue; + } + $wpdb->insert( + $wpdb->term_relationships, + array( + 'object_id' => $link_id, + 'term_taxonomy_id' => $tt_id, + ) + ); + } + } + + if ( $wp_current_db_version < 4772 ) { + // Obsolete linkcategories table. + $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'linkcategories' ); + } + + // Recalculate all counts. + $terms = $wpdb->get_results( "SELECT term_taxonomy_id, taxonomy FROM $wpdb->term_taxonomy" ); + foreach ( (array) $terms as $term ) { + if ( ( 'post_tag' == $term->taxonomy ) || ( 'category' == $term->taxonomy ) ) { + $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d", $term->term_taxonomy_id ) ); + } else { + $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term->term_taxonomy_id ) ); + } + $wpdb->update( $wpdb->term_taxonomy, array( 'count' => $count ), array( 'term_taxonomy_id' => $term->term_taxonomy_id ) ); + } +} + +/** + * Remove old options from the database. + * + * @ignore + * @since 2.3.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_230_options_table() { + global $wpdb; + $old_options_fields = array( 'option_can_override', 'option_type', 'option_width', 'option_height', 'option_description', 'option_admin_level' ); + $wpdb->hide_errors(); + foreach ( $old_options_fields as $old ) { + $wpdb->query( "ALTER TABLE $wpdb->options DROP $old" ); + } + $wpdb->show_errors(); +} + +/** + * Remove old categories, link2cat, and post2cat database tables. + * + * @ignore + * @since 2.3.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_230_old_tables() { + global $wpdb; + $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'categories' ); + $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'link2cat' ); + $wpdb->query( 'DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post2cat' ); +} + +/** + * Upgrade old slugs made in version 2.2. + * + * @ignore + * @since 2.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_old_slugs() { + // Upgrade people who were using the Redirect Old Slugs plugin. + global $wpdb; + $wpdb->query( "UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'" ); +} + +/** + * Execute changes made in WordPress 2.5.0. + * + * @ignore + * @since 2.5.0 + * + * @global int $wp_current_db_version The old (current) database version. + */ +function upgrade_250() { + global $wp_current_db_version; + + if ( $wp_current_db_version < 6689 ) { + populate_roles_250(); + } + +} + +/** + * Execute changes made in WordPress 2.5.2. + * + * @ignore + * @since 2.5.2 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_252() { + global $wpdb; + + $wpdb->query( "UPDATE $wpdb->users SET user_activation_key = ''" ); +} + +/** + * Execute changes made in WordPress 2.6. + * + * @ignore + * @since 2.6.0 + * + * @global int $wp_current_db_version The old (current) database version. + */ +function upgrade_260() { + global $wp_current_db_version; + + if ( $wp_current_db_version < 8000 ) { + populate_roles_260(); + } +} + +/** + * Execute changes made in WordPress 2.7. + * + * @ignore + * @since 2.7.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_270() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 8980 ) { + populate_roles_270(); + } + + // Update post_date for unpublished posts with empty timestamp. + if ( $wp_current_db_version < 8921 ) { + $wpdb->query( "UPDATE $wpdb->posts SET post_date = post_modified WHERE post_date = '0000-00-00 00:00:00'" ); + } +} + +/** + * Execute changes made in WordPress 2.8. + * + * @ignore + * @since 2.8.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_280() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 10360 ) { + populate_roles_280(); + } + if ( is_multisite() ) { + $start = 0; + while ( $rows = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options ORDER BY option_id LIMIT $start, 20" ) ) { + foreach ( $rows as $row ) { + $value = $row->option_value; + if ( ! @unserialize( $value ) ) { + $value = stripslashes( $value ); + } + if ( $value !== $row->option_value ) { + update_option( $row->option_name, $value ); + } + } + $start += 20; + } + clean_blog_cache( get_current_blog_id() ); + } +} + +/** + * Execute changes made in WordPress 2.9. + * + * @ignore + * @since 2.9.0 + * + * @global int $wp_current_db_version The old (current) database version. + */ +function upgrade_290() { + global $wp_current_db_version; + + if ( $wp_current_db_version < 11958 ) { + // Previously, setting depth to 1 would redundantly disable threading, + // but now 2 is the minimum depth to avoid confusion. + if ( get_option( 'thread_comments_depth' ) == '1' ) { + update_option( 'thread_comments_depth', 2 ); + update_option( 'thread_comments', 0 ); + } + } +} + +/** + * Execute changes made in WordPress 3.0. + * + * @ignore + * @since 3.0.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_300() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 15093 ) { + populate_roles_300(); + } + + if ( $wp_current_db_version < 14139 && is_multisite() && is_main_site() && ! defined( 'MULTISITE' ) && get_site_option( 'siteurl' ) === false ) { + add_site_option( 'siteurl', '' ); + } + + // 3.0 screen options key name changes. + if ( wp_should_upgrade_global_tables() ) { + $sql = "DELETE FROM $wpdb->usermeta + WHERE meta_key LIKE %s + OR meta_key LIKE %s + OR meta_key LIKE %s + OR meta_key LIKE %s + OR meta_key LIKE %s + OR meta_key LIKE %s + OR meta_key = 'manageedittagscolumnshidden' + OR meta_key = 'managecategoriescolumnshidden' + OR meta_key = 'manageedit-tagscolumnshidden' + OR meta_key = 'manageeditcolumnshidden' + OR meta_key = 'categories_per_page' + OR meta_key = 'edit_tags_per_page'"; + $prefix = $wpdb->esc_like( $wpdb->base_prefix ); + $wpdb->query( + $wpdb->prepare( + $sql, + $prefix . '%' . $wpdb->esc_like( 'meta-box-hidden' ) . '%', + $prefix . '%' . $wpdb->esc_like( 'closedpostboxes' ) . '%', + $prefix . '%' . $wpdb->esc_like( 'manage-' ) . '%' . $wpdb->esc_like( '-columns-hidden' ) . '%', + $prefix . '%' . $wpdb->esc_like( 'meta-box-order' ) . '%', + $prefix . '%' . $wpdb->esc_like( 'metaboxorder' ) . '%', + $prefix . '%' . $wpdb->esc_like( 'screen_layout' ) . '%' + ) + ); + } + +} + +/** + * Execute changes made in WordPress 3.3. + * + * @ignore + * @since 3.3.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + * @global array $wp_registered_widgets + * @global array $sidebars_widgets + */ +function upgrade_330() { + global $wp_current_db_version, $wpdb, $wp_registered_widgets, $sidebars_widgets; + + if ( $wp_current_db_version < 19061 && wp_should_upgrade_global_tables() ) { + $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key IN ('show_admin_bar_admin', 'plugins_last_view')" ); + } + + if ( $wp_current_db_version >= 11548 ) { + return; + } + + $sidebars_widgets = get_option( 'sidebars_widgets', array() ); + $_sidebars_widgets = array(); + + if ( isset( $sidebars_widgets['wp_inactive_widgets'] ) || empty( $sidebars_widgets ) ) { + $sidebars_widgets['array_version'] = 3; + } elseif ( ! isset( $sidebars_widgets['array_version'] ) ) { + $sidebars_widgets['array_version'] = 1; + } + + switch ( $sidebars_widgets['array_version'] ) { + case 1: + foreach ( (array) $sidebars_widgets as $index => $sidebar ) { + if ( is_array( $sidebar ) ) { + foreach ( (array) $sidebar as $i => $name ) { + $id = strtolower( $name ); + if ( isset( $wp_registered_widgets[ $id ] ) ) { + $_sidebars_widgets[ $index ][ $i ] = $id; + continue; + } + $id = sanitize_title( $name ); + if ( isset( $wp_registered_widgets[ $id ] ) ) { + $_sidebars_widgets[ $index ][ $i ] = $id; + continue; + } + + $found = false; + + foreach ( $wp_registered_widgets as $widget_id => $widget ) { + if ( strtolower( $widget['name'] ) == strtolower( $name ) ) { + $_sidebars_widgets[ $index ][ $i ] = $widget['id']; + $found = true; + break; + } elseif ( sanitize_title( $widget['name'] ) == sanitize_title( $name ) ) { + $_sidebars_widgets[ $index ][ $i ] = $widget['id']; + $found = true; + break; + } + } + + if ( $found ) { + continue; + } + + unset( $_sidebars_widgets[ $index ][ $i ] ); + } + } + } + $_sidebars_widgets['array_version'] = 2; + $sidebars_widgets = $_sidebars_widgets; + unset( $_sidebars_widgets ); + + // Intentional fall-through to upgrade to the next version. + case 2: + $sidebars_widgets = retrieve_widgets(); + $sidebars_widgets['array_version'] = 3; + update_option( 'sidebars_widgets', $sidebars_widgets ); + } +} + +/** + * Execute changes made in WordPress 3.4. + * + * @ignore + * @since 3.4.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_340() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 19798 ) { + $wpdb->hide_errors(); + $wpdb->query( "ALTER TABLE $wpdb->options DROP COLUMN blog_id" ); + $wpdb->show_errors(); + } + + if ( $wp_current_db_version < 19799 ) { + $wpdb->hide_errors(); + $wpdb->query( "ALTER TABLE $wpdb->comments DROP INDEX comment_approved" ); + $wpdb->show_errors(); + } + + if ( $wp_current_db_version < 20022 && wp_should_upgrade_global_tables() ) { + $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key = 'themes_last_view'" ); + } + + if ( $wp_current_db_version < 20080 ) { + if ( 'yes' == $wpdb->get_var( "SELECT autoload FROM $wpdb->options WHERE option_name = 'uninstall_plugins'" ) ) { + $uninstall_plugins = get_option( 'uninstall_plugins' ); + delete_option( 'uninstall_plugins' ); + add_option( 'uninstall_plugins', $uninstall_plugins, null, 'no' ); + } + } +} + +/** + * Execute changes made in WordPress 3.5. + * + * @ignore + * @since 3.5.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_350() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 22006 && $wpdb->get_var( "SELECT link_id FROM $wpdb->links LIMIT 1" ) ) { + update_option( 'link_manager_enabled', 1 ); // Previously set to 0 by populate_options(). + } + + if ( $wp_current_db_version < 21811 && wp_should_upgrade_global_tables() ) { + $meta_keys = array(); + foreach ( array_merge( get_post_types(), get_taxonomies() ) as $name ) { + if ( false !== strpos( $name, '-' ) ) { + $meta_keys[] = 'edit_' . str_replace( '-', '_', $name ) . '_per_page'; + } + } + if ( $meta_keys ) { + $meta_keys = implode( "', '", $meta_keys ); + $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key IN ('$meta_keys')" ); + } + } + + if ( $wp_current_db_version < 22422 ) { + $term = get_term_by( 'slug', 'post-format-standard', 'post_format' ); + if ( $term ) { + wp_delete_term( $term->term_id, 'post_format' ); + } + } +} + +/** + * Execute changes made in WordPress 3.7. + * + * @ignore + * @since 3.7.0 + * + * @global int $wp_current_db_version The old (current) database version. + */ +function upgrade_370() { + global $wp_current_db_version; + if ( $wp_current_db_version < 25824 ) { + wp_clear_scheduled_hook( 'wp_auto_updates_maybe_update' ); + } +} + +/** + * Execute changes made in WordPress 3.7.2. + * + * @ignore + * @since 3.7.2 + * @since 3.8.0 + * + * @global int $wp_current_db_version The old (current) database version. + */ +function upgrade_372() { + global $wp_current_db_version; + if ( $wp_current_db_version < 26148 ) { + wp_clear_scheduled_hook( 'wp_maybe_auto_update' ); + } +} + +/** + * Execute changes made in WordPress 3.8.0. + * + * @ignore + * @since 3.8.0 + * + * @global int $wp_current_db_version The old (current) database version. + */ +function upgrade_380() { + global $wp_current_db_version; + if ( $wp_current_db_version < 26691 ) { + deactivate_plugins( array( 'mp6/mp6.php' ), true ); + } +} + +/** + * Execute changes made in WordPress 4.0.0. + * + * @ignore + * @since 4.0.0 + * + * @global int $wp_current_db_version The old (current) database version. + */ +function upgrade_400() { + global $wp_current_db_version; + if ( $wp_current_db_version < 29630 ) { + if ( ! is_multisite() && false === get_option( 'WPLANG' ) ) { + if ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && in_array( WPLANG, get_available_languages() ) ) { + update_option( 'WPLANG', WPLANG ); + } else { + update_option( 'WPLANG', '' ); + } + } + } +} + +/** + * Execute changes made in WordPress 4.2.0. + * + * @ignore + * @since 4.2.0 + */ +function upgrade_420() {} + +/** + * Executes changes made in WordPress 4.3.0. + * + * @ignore + * @since 4.3.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_430() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 32364 ) { + upgrade_430_fix_comments(); + } + + // Shared terms are split in a separate process. + if ( $wp_current_db_version < 32814 ) { + update_option( 'finished_splitting_shared_terms', 0 ); + wp_schedule_single_event( time() + ( 1 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' ); + } + + if ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) { + if ( is_multisite() ) { + $tables = $wpdb->tables( 'blog' ); + } else { + $tables = $wpdb->tables( 'all' ); + if ( ! wp_should_upgrade_global_tables() ) { + $global_tables = $wpdb->tables( 'global' ); + $tables = array_diff_assoc( $tables, $global_tables ); + } + } + + foreach ( $tables as $table ) { + maybe_convert_table_to_utf8mb4( $table ); + } + } +} + +/** + * Executes comments changes made in WordPress 4.3.0. + * + * @ignore + * @since 4.3.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_430_fix_comments() { + global $wpdb; + + $content_length = $wpdb->get_col_length( $wpdb->comments, 'comment_content' ); + + if ( is_wp_error( $content_length ) ) { + return; + } + + if ( false === $content_length ) { + $content_length = array( + 'type' => 'byte', + 'length' => 65535, + ); + } elseif ( ! is_array( $content_length ) ) { + $length = (int) $content_length > 0 ? (int) $content_length : 65535; + $content_length = array( + 'type' => 'byte', + 'length' => $length, + ); + } + + if ( 'byte' !== $content_length['type'] || 0 === $content_length['length'] ) { + // Sites with malformed DB schemas are on their own. + return; + } + + $allowed_length = intval( $content_length['length'] ) - 10; + + $comments = $wpdb->get_results( + "SELECT `comment_ID` FROM `{$wpdb->comments}` + WHERE `comment_date_gmt` > '2015-04-26' + AND LENGTH( `comment_content` ) >= {$allowed_length} + AND ( `comment_content` LIKE '%<%' OR `comment_content` LIKE '%>%' )" + ); + + foreach ( $comments as $comment ) { + wp_delete_comment( $comment->comment_ID, true ); + } +} + +/** + * Executes changes made in WordPress 4.3.1. + * + * @ignore + * @since 4.3.1 + */ +function upgrade_431() { + // Fix incorrect cron entries for term splitting. + $cron_array = _get_cron_array(); + if ( isset( $cron_array['wp_batch_split_terms'] ) ) { + unset( $cron_array['wp_batch_split_terms'] ); + _set_cron_array( $cron_array ); + } +} + +/** + * Executes changes made in WordPress 4.4.0. + * + * @ignore + * @since 4.4.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_440() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 34030 ) { + $wpdb->query( "ALTER TABLE {$wpdb->options} MODIFY option_name VARCHAR(191)" ); + } + + // Remove the unused 'add_users' role. + $roles = wp_roles(); + foreach ( $roles->role_objects as $role ) { + if ( $role->has_cap( 'add_users' ) ) { + $role->remove_cap( 'add_users' ); + } + } +} + +/** + * Executes changes made in WordPress 4.5.0. + * + * @ignore + * @since 4.5.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_450() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 36180 ) { + wp_clear_scheduled_hook( 'wp_maybe_auto_update' ); + } + + // Remove unused email confirmation options, moved to usermeta. + if ( $wp_current_db_version < 36679 && is_multisite() ) { + $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name REGEXP '^[0-9]+_new_email$'" ); + } + + // Remove unused user setting for wpLink. + delete_user_setting( 'wplink' ); +} + +/** + * Executes changes made in WordPress 4.6.0. + * + * @ignore + * @since 4.6.0 + * + * @global int $wp_current_db_version The old (current) database version. + */ +function upgrade_460() { + global $wp_current_db_version; + + // Remove unused post meta. + if ( $wp_current_db_version < 37854 ) { + delete_post_meta_by_key( '_post_restored_from' ); + } + + // Remove plugins with callback as an array object/method as the uninstall hook, see #13786. + if ( $wp_current_db_version < 37965 ) { + $uninstall_plugins = get_option( 'uninstall_plugins', array() ); + + if ( ! empty( $uninstall_plugins ) ) { + foreach ( $uninstall_plugins as $basename => $callback ) { + if ( is_array( $callback ) && is_object( $callback[0] ) ) { + unset( $uninstall_plugins[ $basename ] ); + } + } + + update_option( 'uninstall_plugins', $uninstall_plugins ); + } + } +} + +/** + * Executes changes made in WordPress 5.0.0. + * + * @ignore + * @since 5.0.0 + * @deprecated 5.1.0 + */ +function upgrade_500() { +} + +/** + * Executes changes made in WordPress 5.1.0. + * + * @ignore + * @since 5.1.0 + */ +function upgrade_510() { + delete_site_option( 'upgrade_500_was_gutenberg_active' ); +} + +/** + * Executes changes made in WordPress 5.3.0. + * + * @ignore + * @since 5.3.0 + */ +function upgrade_530() { + /* + * The `admin_email_lifespan` option may have been set by an admin that just logged in, + * saw the verification screen, clicked on a button there, and is now upgrading the db, + * or by populate_options() that is called earlier in upgrade_all(). + * In the second case `admin_email_lifespan` should be reset so the verification screen + * is shown next time an admin logs in. + */ + if ( function_exists( 'current_user_can' ) && ! current_user_can( 'manage_options' ) ) { + update_option( 'admin_email_lifespan', 0 ); + } +} + +/** + * Executes network-level upgrade routines. + * + * @since 3.0.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function upgrade_network() { + global $wp_current_db_version, $wpdb; + + // Always clear expired transients. + delete_expired_transients( true ); + + // 2.8 + if ( $wp_current_db_version < 11549 ) { + $wpmu_sitewide_plugins = get_site_option( 'wpmu_sitewide_plugins' ); + $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' ); + if ( $wpmu_sitewide_plugins ) { + if ( ! $active_sitewide_plugins ) { + $sitewide_plugins = (array) $wpmu_sitewide_plugins; + } else { + $sitewide_plugins = array_merge( (array) $active_sitewide_plugins, (array) $wpmu_sitewide_plugins ); + } + + update_site_option( 'active_sitewide_plugins', $sitewide_plugins ); + } + delete_site_option( 'wpmu_sitewide_plugins' ); + delete_site_option( 'deactivated_sitewide_plugins' ); + + $start = 0; + while ( $rows = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} ORDER BY meta_id LIMIT $start, 20" ) ) { + foreach ( $rows as $row ) { + $value = $row->meta_value; + if ( ! @unserialize( $value ) ) { + $value = stripslashes( $value ); + } + if ( $value !== $row->meta_value ) { + update_site_option( $row->meta_key, $value ); + } + } + $start += 20; + } + } + + // 3.0 + if ( $wp_current_db_version < 13576 ) { + update_site_option( 'global_terms_enabled', '1' ); + } + + // 3.3 + if ( $wp_current_db_version < 19390 ) { + update_site_option( 'initial_db_version', $wp_current_db_version ); + } + + if ( $wp_current_db_version < 19470 ) { + if ( false === get_site_option( 'active_sitewide_plugins' ) ) { + update_site_option( 'active_sitewide_plugins', array() ); + } + } + + // 3.4 + if ( $wp_current_db_version < 20148 ) { + // 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name. + $allowedthemes = get_site_option( 'allowedthemes' ); + $allowed_themes = get_site_option( 'allowed_themes' ); + if ( false === $allowedthemes && is_array( $allowed_themes ) && $allowed_themes ) { + $converted = array(); + $themes = wp_get_themes(); + foreach ( $themes as $stylesheet => $theme_data ) { + if ( isset( $allowed_themes[ $theme_data->get( 'Name' ) ] ) ) { + $converted[ $stylesheet ] = true; + } + } + update_site_option( 'allowedthemes', $converted ); + delete_site_option( 'allowed_themes' ); + } + } + + // 3.5 + if ( $wp_current_db_version < 21823 ) { + update_site_option( 'ms_files_rewriting', '1' ); + } + + // 3.5.2 + if ( $wp_current_db_version < 24448 ) { + $illegal_names = get_site_option( 'illegal_names' ); + if ( is_array( $illegal_names ) && count( $illegal_names ) === 1 ) { + $illegal_name = reset( $illegal_names ); + $illegal_names = explode( ' ', $illegal_name ); + update_site_option( 'illegal_names', $illegal_names ); + } + } + + // 4.2 + if ( $wp_current_db_version < 31351 && 'utf8mb4' === $wpdb->charset ) { + if ( wp_should_upgrade_global_tables() ) { + $wpdb->query( "ALTER TABLE $wpdb->usermeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" ); + $wpdb->query( "ALTER TABLE $wpdb->site DROP INDEX domain, ADD INDEX domain(domain(140),path(51))" ); + $wpdb->query( "ALTER TABLE $wpdb->sitemeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" ); + $wpdb->query( "ALTER TABLE $wpdb->signups DROP INDEX domain_path, ADD INDEX domain_path(domain(140),path(51))" ); + + $tables = $wpdb->tables( 'global' ); + + // sitecategories may not exist. + if ( ! $wpdb->get_var( "SHOW TABLES LIKE '{$tables['sitecategories']}'" ) ) { + unset( $tables['sitecategories'] ); + } + + foreach ( $tables as $table ) { + maybe_convert_table_to_utf8mb4( $table ); + } + } + } + + // 4.3 + if ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) { + if ( wp_should_upgrade_global_tables() ) { + $upgrade = false; + $indexes = $wpdb->get_results( "SHOW INDEXES FROM $wpdb->signups" ); + foreach ( $indexes as $index ) { + if ( 'domain_path' == $index->Key_name && 'domain' == $index->Column_name && 140 != $index->Sub_part ) { + $upgrade = true; + break; + } + } + + if ( $upgrade ) { + $wpdb->query( "ALTER TABLE $wpdb->signups DROP INDEX domain_path, ADD INDEX domain_path(domain(140),path(51))" ); + } + + $tables = $wpdb->tables( 'global' ); + + // sitecategories may not exist. + if ( ! $wpdb->get_var( "SHOW TABLES LIKE '{$tables['sitecategories']}'" ) ) { + unset( $tables['sitecategories'] ); + } + + foreach ( $tables as $table ) { + maybe_convert_table_to_utf8mb4( $table ); + } + } + } + + // 5.1 + if ( $wp_current_db_version < 44467 ) { + $network_id = get_main_network_id(); + delete_network_option( $network_id, 'site_meta_supported' ); + is_site_meta_supported(); + } +} + +// +// General functions we use to actually do stuff. +// + +/** + * Creates a table in the database if it doesn't already exist. + * + * This method checks for an existing database and creates a new one if it's not + * already present. It doesn't rely on MySQL's "IF NOT EXISTS" statement, but chooses + * to query all tables first and then run the SQL statement creating the table. + * + * @since 1.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $table_name Database table name to create. + * @param string $create_ddl SQL statement to create table. + * @return bool If table already exists or was created by function. + */ +function maybe_create_table( $table_name, $create_ddl ) { + global $wpdb; + + $query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $table_name ) ); + + if ( $wpdb->get_var( $query ) == $table_name ) { + return true; + } + + // Didn't find it, so try to create it. + $wpdb->query( $create_ddl ); + + // We cannot directly tell that whether this succeeded! + if ( $wpdb->get_var( $query ) == $table_name ) { + return true; + } + return false; +} + +/** + * Drops a specified index from a table. + * + * @since 1.0.1 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $table Database table name. + * @param string $index Index name to drop. + * @return true True, when finished. + */ +function drop_index( $table, $index ) { + global $wpdb; + $wpdb->hide_errors(); + $wpdb->query( "ALTER TABLE `$table` DROP INDEX `$index`" ); + // Now we need to take out all the extra ones we may have created. + for ( $i = 0; $i < 25; $i++ ) { + $wpdb->query( "ALTER TABLE `$table` DROP INDEX `{$index}_$i`" ); + } + $wpdb->show_errors(); + return true; +} + +/** + * Adds an index to a specified table. + * + * @since 1.0.1 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $table Database table name. + * @param string $index Database table index column. + * @return true True, when done with execution. + */ +function add_clean_index( $table, $index ) { + global $wpdb; + drop_index( $table, $index ); + $wpdb->query( "ALTER TABLE `$table` ADD INDEX ( `$index` )" ); + return true; +} + +/** + * Adds column to a database table if it doesn't already exist. + * + * @since 1.3.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $table_name The table name to modify. + * @param string $column_name The column name to add to the table. + * @param string $create_ddl The SQL statement used to add the column. + * @return bool True if already exists or on successful completion, false on error. + */ +function maybe_add_column( $table_name, $column_name, $create_ddl ) { + global $wpdb; + foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) { + if ( $column == $column_name ) { + return true; + } + } + + // Didn't find it, so try to create it. + $wpdb->query( $create_ddl ); + + // We cannot directly tell that whether this succeeded! + foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) { + if ( $column == $column_name ) { + return true; + } + } + return false; +} + +/** + * If a table only contains utf8 or utf8mb4 columns, convert it to utf8mb4. + * + * @since 4.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $table The table to convert. + * @return bool true if the table was converted, false if it wasn't. + */ +function maybe_convert_table_to_utf8mb4( $table ) { + global $wpdb; + + $results = $wpdb->get_results( "SHOW FULL COLUMNS FROM `$table`" ); + if ( ! $results ) { + return false; + } + + foreach ( $results as $column ) { + if ( $column->Collation ) { + list( $charset ) = explode( '_', $column->Collation ); + $charset = strtolower( $charset ); + if ( 'utf8' !== $charset && 'utf8mb4' !== $charset ) { + // Don't upgrade tables that have non-utf8 columns. + return false; + } + } + } + + $table_details = $wpdb->get_row( "SHOW TABLE STATUS LIKE '$table'" ); + if ( ! $table_details ) { + return false; + } + + list( $table_charset ) = explode( '_', $table_details->Collation ); + $table_charset = strtolower( $table_charset ); + if ( 'utf8mb4' === $table_charset ) { + return true; + } + + return $wpdb->query( "ALTER TABLE $table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" ); +} + +/** + * Retrieve all options as it was for 1.2. + * + * @since 1.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return stdClass List of options. + */ +function get_alloptions_110() { + global $wpdb; + $all_options = new stdClass; + $options = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" ); + if ( $options ) { + foreach ( $options as $option ) { + if ( 'siteurl' == $option->option_name || 'home' == $option->option_name || 'category_base' == $option->option_name ) { + $option->option_value = untrailingslashit( $option->option_value ); + } + $all_options->{$option->option_name} = stripslashes( $option->option_value ); + } + } + return $all_options; +} + +/** + * Utility version of get_option that is private to installation/upgrade. + * + * @ignore + * @since 1.5.1 + * @access private + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $setting Option name. + * @return mixed + */ +function __get_option( $setting ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore + global $wpdb; + + if ( 'home' === $setting && defined( 'WP_HOME' ) ) { + return untrailingslashit( WP_HOME ); + } + + if ( 'siteurl' === $setting && defined( 'WP_SITEURL' ) ) { + return untrailingslashit( WP_SITEURL ); + } + + $option = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s", $setting ) ); + + if ( 'home' === $setting && '' == $option ) { + return __get_option( 'siteurl' ); + } + + if ( 'siteurl' === $setting || 'home' === $setting || 'category_base' === $setting || 'tag_base' === $setting ) { + $option = untrailingslashit( $option ); + } + + return maybe_unserialize( $option ); +} + +/** + * Filters for content to remove unnecessary slashes. + * + * @since 1.5.0 + * + * @param string $content The content to modify. + * @return string The de-slashed content. + */ +function deslash( $content ) { + // Note: \\\ inside a regex denotes a single backslash. + + /* + * Replace one or more backslashes followed by a single quote with + * a single quote. + */ + $content = preg_replace( "/\\\+'/", "'", $content ); + + /* + * Replace one or more backslashes followed by a double quote with + * a double quote. + */ + $content = preg_replace( '/\\\+"/', '"', $content ); + + // Replace one or more backslashes with one backslash. + $content = preg_replace( '/\\\+/', '\\', $content ); + + return $content; +} + +/** + * Modifies the database based on specified SQL statements. + * + * Useful for creating new tables and updating existing tables to a new structure. + * + * @since 1.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string[]|string $queries Optional. The query to run. Can be multiple queries + * in an array, or a string of queries separated by + * semicolons. Default empty string. + * @param bool $execute Optional. Whether or not to execute the query right away. + * Default true. + * @return array Strings containing the results of the various update queries. + */ +function dbDelta( $queries = '', $execute = true ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + global $wpdb; + + if ( in_array( $queries, array( '', 'all', 'blog', 'global', 'ms_global' ), true ) ) { + $queries = wp_get_db_schema( $queries ); + } + + // Separate individual queries into an array. + if ( ! is_array( $queries ) ) { + $queries = explode( ';', $queries ); + $queries = array_filter( $queries ); + } + + /** + * Filters the dbDelta SQL queries. + * + * @since 3.3.0 + * + * @param string[] $queries An array of dbDelta SQL queries. + */ + $queries = apply_filters( 'dbdelta_queries', $queries ); + + $cqueries = array(); // Creation queries. + $iqueries = array(); // Insertion queries. + $for_update = array(); + + // Create a tablename index for an array ($cqueries) of queries. + foreach ( $queries as $qry ) { + if ( preg_match( '|CREATE TABLE ([^ ]*)|', $qry, $matches ) ) { + $cqueries[ trim( $matches[1], '`' ) ] = $qry; + $for_update[ $matches[1] ] = 'Created table ' . $matches[1]; + } elseif ( preg_match( '|CREATE DATABASE ([^ ]*)|', $qry, $matches ) ) { + array_unshift( $cqueries, $qry ); + } elseif ( preg_match( '|INSERT INTO ([^ ]*)|', $qry, $matches ) ) { + $iqueries[] = $qry; + } elseif ( preg_match( '|UPDATE ([^ ]*)|', $qry, $matches ) ) { + $iqueries[] = $qry; + } else { + // Unrecognized query type. + } + } + + /** + * Filters the dbDelta SQL queries for creating tables and/or databases. + * + * Queries filterable via this hook contain "CREATE TABLE" or "CREATE DATABASE". + * + * @since 3.3.0 + * + * @param string[] $cqueries An array of dbDelta create SQL queries. + */ + $cqueries = apply_filters( 'dbdelta_create_queries', $cqueries ); + + /** + * Filters the dbDelta SQL queries for inserting or updating. + * + * Queries filterable via this hook contain "INSERT INTO" or "UPDATE". + * + * @since 3.3.0 + * + * @param string[] $iqueries An array of dbDelta insert or update SQL queries. + */ + $iqueries = apply_filters( 'dbdelta_insert_queries', $iqueries ); + + $text_fields = array( 'tinytext', 'text', 'mediumtext', 'longtext' ); + $blob_fields = array( 'tinyblob', 'blob', 'mediumblob', 'longblob' ); + + $global_tables = $wpdb->tables( 'global' ); + foreach ( $cqueries as $table => $qry ) { + // Upgrade global tables only for the main site. Don't upgrade at all if conditions are not optimal. + if ( in_array( $table, $global_tables ) && ! wp_should_upgrade_global_tables() ) { + unset( $cqueries[ $table ], $for_update[ $table ] ); + continue; + } + + // Fetch the table column structure from the database. + $suppress = $wpdb->suppress_errors(); + $tablefields = $wpdb->get_results( "DESCRIBE {$table};" ); + $wpdb->suppress_errors( $suppress ); + + if ( ! $tablefields ) { + continue; + } + + // Clear the field and index arrays. + $cfields = array(); + $indices = array(); + $indices_without_subparts = array(); + + // Get all of the field names in the query from between the parentheses. + preg_match( '|\((.*)\)|ms', $qry, $match2 ); + $qryline = trim( $match2[1] ); + + // Separate field lines into an array. + $flds = explode( "\n", $qryline ); + + // For every field line specified in the query. + foreach ( $flds as $fld ) { + $fld = trim( $fld, " \t\n\r\0\x0B," ); // Default trim characters, plus ','. + + // Extract the field name. + preg_match( '|^([^ ]*)|', $fld, $fvals ); + $fieldname = trim( $fvals[1], '`' ); + $fieldname_lowercased = strtolower( $fieldname ); + + // Verify the found field name. + $validfield = true; + switch ( $fieldname_lowercased ) { + case '': + case 'primary': + case 'index': + case 'fulltext': + case 'unique': + case 'key': + case 'spatial': + $validfield = false; + + /* + * Normalize the index definition. + * + * This is done so the definition can be compared against the result of a + * `SHOW INDEX FROM $table_name` query which returns the current table + * index information. + */ + + // Extract type, name and columns from the definition. + // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation + preg_match( + '/^' + . '(?P' // 1) Type of the index. + . 'PRIMARY\s+KEY|(?:UNIQUE|FULLTEXT|SPATIAL)\s+(?:KEY|INDEX)|KEY|INDEX' + . ')' + . '\s+' // Followed by at least one white space character. + . '(?:' // Name of the index. Optional if type is PRIMARY KEY. + . '`?' // Name can be escaped with a backtick. + . '(?P' // 2) Name of the index. + . '(?:[0-9a-zA-Z$_-]|[\xC2-\xDF][\x80-\xBF])+' + . ')' + . '`?' // Name can be escaped with a backtick. + . '\s+' // Followed by at least one white space character. + . ')*' + . '\(' // Opening bracket for the columns. + . '(?P' + . '.+?' // 3) Column names, index prefixes, and orders. + . ')' + . '\)' // Closing bracket for the columns. + . '$/im', + $fld, + $index_matches + ); + // phpcs:enable + + // Uppercase the index type and normalize space characters. + $index_type = strtoupper( preg_replace( '/\s+/', ' ', trim( $index_matches['index_type'] ) ) ); + + // 'INDEX' is a synonym for 'KEY', standardize on 'KEY'. + $index_type = str_replace( 'INDEX', 'KEY', $index_type ); + + // Escape the index name with backticks. An index for a primary key has no name. + $index_name = ( 'PRIMARY KEY' === $index_type ) ? '' : '`' . strtolower( $index_matches['index_name'] ) . '`'; + + // Parse the columns. Multiple columns are separated by a comma. + $index_columns = array_map( 'trim', explode( ',', $index_matches['index_columns'] ) ); + $index_columns_without_subparts = $index_columns; + + // Normalize columns. + foreach ( $index_columns as $id => &$index_column ) { + // Extract column name and number of indexed characters (sub_part). + preg_match( + '/' + . '`?' // Name can be escaped with a backtick. + . '(?P' // 1) Name of the column. + . '(?:[0-9a-zA-Z$_-]|[\xC2-\xDF][\x80-\xBF])+' + . ')' + . '`?' // Name can be escaped with a backtick. + . '(?:' // Optional sub part. + . '\s*' // Optional white space character between name and opening bracket. + . '\(' // Opening bracket for the sub part. + . '\s*' // Optional white space character after opening bracket. + . '(?P' + . '\d+' // 2) Number of indexed characters. + . ')' + . '\s*' // Optional white space character before closing bracket. + . '\)' // Closing bracket for the sub part. + . ')?' + . '/', + $index_column, + $index_column_matches + ); + + // Escape the column name with backticks. + $index_column = '`' . $index_column_matches['column_name'] . '`'; + + // We don't need to add the subpart to $index_columns_without_subparts + $index_columns_without_subparts[ $id ] = $index_column; + + // Append the optional sup part with the number of indexed characters. + if ( isset( $index_column_matches['sub_part'] ) ) { + $index_column .= '(' . $index_column_matches['sub_part'] . ')'; + } + } + + // Build the normalized index definition and add it to the list of indices. + $indices[] = "{$index_type} {$index_name} (" . implode( ',', $index_columns ) . ')'; + $indices_without_subparts[] = "{$index_type} {$index_name} (" . implode( ',', $index_columns_without_subparts ) . ')'; + + // Destroy no longer needed variables. + unset( $index_column, $index_column_matches, $index_matches, $index_type, $index_name, $index_columns, $index_columns_without_subparts ); + + break; + } + + // If it's a valid field, add it to the field array. + if ( $validfield ) { + $cfields[ $fieldname_lowercased ] = $fld; + } + } + + // For every field in the table. + foreach ( $tablefields as $tablefield ) { + $tablefield_field_lowercased = strtolower( $tablefield->Field ); + $tablefield_type_lowercased = strtolower( $tablefield->Type ); + + // If the table field exists in the field array... + if ( array_key_exists( $tablefield_field_lowercased, $cfields ) ) { + + // Get the field type from the query. + preg_match( '|`?' . $tablefield->Field . '`? ([^ ]*( unsigned)?)|i', $cfields[ $tablefield_field_lowercased ], $matches ); + $fieldtype = $matches[1]; + $fieldtype_lowercased = strtolower( $fieldtype ); + + // Is actual field type different from the field type in query? + if ( $tablefield->Type != $fieldtype ) { + $do_change = true; + if ( in_array( $fieldtype_lowercased, $text_fields ) && in_array( $tablefield_type_lowercased, $text_fields ) ) { + if ( array_search( $fieldtype_lowercased, $text_fields ) < array_search( $tablefield_type_lowercased, $text_fields ) ) { + $do_change = false; + } + } + + if ( in_array( $fieldtype_lowercased, $blob_fields ) && in_array( $tablefield_type_lowercased, $blob_fields ) ) { + if ( array_search( $fieldtype_lowercased, $blob_fields ) < array_search( $tablefield_type_lowercased, $blob_fields ) ) { + $do_change = false; + } + } + + if ( $do_change ) { + // Add a query to change the column type. + $cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN `{$tablefield->Field}` " . $cfields[ $tablefield_field_lowercased ]; + + $for_update[ $table . '.' . $tablefield->Field ] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}"; + } + } + + // Get the default value from the array. + if ( preg_match( "| DEFAULT '(.*?)'|i", $cfields[ $tablefield_field_lowercased ], $matches ) ) { + $default_value = $matches[1]; + if ( $tablefield->Default != $default_value ) { + // Add a query to change the column's default value + $cqueries[] = "ALTER TABLE {$table} ALTER COLUMN `{$tablefield->Field}` SET DEFAULT '{$default_value}'"; + + $for_update[ $table . '.' . $tablefield->Field ] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}"; + } + } + + // Remove the field from the array (so it's not added). + unset( $cfields[ $tablefield_field_lowercased ] ); + } else { + // This field exists in the table, but not in the creation queries? + } + } + + // For every remaining field specified for the table. + foreach ( $cfields as $fieldname => $fielddef ) { + // Push a query line into $cqueries that adds the field to that table. + $cqueries[] = "ALTER TABLE {$table} ADD COLUMN $fielddef"; + + $for_update[ $table . '.' . $fieldname ] = 'Added column ' . $table . '.' . $fieldname; + } + + // Index stuff goes here. Fetch the table index structure from the database. + $tableindices = $wpdb->get_results( "SHOW INDEX FROM {$table};" ); + + if ( $tableindices ) { + // Clear the index array. + $index_ary = array(); + + // For every index in the table. + foreach ( $tableindices as $tableindex ) { + $keyname = strtolower( $tableindex->Key_name ); + + // Add the index to the index data array. + $index_ary[ $keyname ]['columns'][] = array( + 'fieldname' => $tableindex->Column_name, + 'subpart' => $tableindex->Sub_part, + ); + $index_ary[ $keyname ]['unique'] = ( 0 == $tableindex->Non_unique ) ? true : false; + $index_ary[ $keyname ]['index_type'] = $tableindex->Index_type; + } + + // For each actual index in the index array. + foreach ( $index_ary as $index_name => $index_data ) { + + // Build a create string to compare to the query. + $index_string = ''; + if ( 'primary' === $index_name ) { + $index_string .= 'PRIMARY '; + } elseif ( $index_data['unique'] ) { + $index_string .= 'UNIQUE '; + } + if ( 'FULLTEXT' === strtoupper( $index_data['index_type'] ) ) { + $index_string .= 'FULLTEXT '; + } + if ( 'SPATIAL' === strtoupper( $index_data['index_type'] ) ) { + $index_string .= 'SPATIAL '; + } + $index_string .= 'KEY '; + if ( 'primary' !== $index_name ) { + $index_string .= '`' . $index_name . '`'; + } + $index_columns = ''; + + // For each column in the index. + foreach ( $index_data['columns'] as $column_data ) { + if ( '' != $index_columns ) { + $index_columns .= ','; + } + + // Add the field to the column list string. + $index_columns .= '`' . $column_data['fieldname'] . '`'; + } + + // Add the column list to the index create string. + $index_string .= " ($index_columns)"; + + // Check if the index definition exists, ignoring subparts. + $aindex = array_search( $index_string, $indices_without_subparts ); + if ( false !== $aindex ) { + // If the index already exists (even with different subparts), we don't need to create it. + unset( $indices_without_subparts[ $aindex ] ); + unset( $indices[ $aindex ] ); + } + } + } + + // For every remaining index specified for the table. + foreach ( (array) $indices as $index ) { + // Push a query line into $cqueries that adds the index to that table. + $cqueries[] = "ALTER TABLE {$table} ADD $index"; + + $for_update[] = 'Added index ' . $table . ' ' . $index; + } + + // Remove the original table creation query from processing. + unset( $cqueries[ $table ], $for_update[ $table ] ); + } + + $allqueries = array_merge( $cqueries, $iqueries ); + if ( $execute ) { + foreach ( $allqueries as $query ) { + $wpdb->query( $query ); + } + } + + return $for_update; +} + +/** + * Updates the database tables to a new schema. + * + * By default, updates all the tables to use the latest defined schema, but can also + * be used to update a specific set of tables in wp_get_db_schema(). + * + * @since 1.5.0 + * + * @uses dbDelta + * + * @param string $tables Optional. Which set of tables to update. Default is 'all'. + */ +function make_db_current( $tables = 'all' ) { + $alterations = dbDelta( $tables ); + echo "
          \n"; + foreach ( $alterations as $alteration ) { + echo "
        1. $alteration
        2. \n"; + } + echo "
        \n"; +} + +/** + * Updates the database tables to a new schema, but without displaying results. + * + * By default, updates all the tables to use the latest defined schema, but can + * also be used to update a specific set of tables in wp_get_db_schema(). + * + * @since 1.5.0 + * + * @see make_db_current() + * + * @param string $tables Optional. Which set of tables to update. Default is 'all'. + */ +function make_db_current_silent( $tables = 'all' ) { + dbDelta( $tables ); +} + +/** + * Creates a site theme from an existing theme. + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + * + * @param string $theme_name The name of the theme. + * @param string $template The directory name of the theme. + * @return bool + */ +function make_site_theme_from_oldschool( $theme_name, $template ) { + $home_path = get_home_path(); + $site_dir = WP_CONTENT_DIR . "/themes/$template"; + + if ( ! file_exists( "$home_path/index.php" ) ) { + return false; + } + + /* + * Copy files from the old locations to the site theme. + * TODO: This does not copy arbitrary include dependencies. Only the standard WP files are copied. + */ + $files = array( + 'index.php' => 'index.php', + 'wp-layout.css' => 'style.css', + 'wp-comments.php' => 'comments.php', + 'wp-comments-popup.php' => 'comments-popup.php', + ); + + foreach ( $files as $oldfile => $newfile ) { + if ( 'index.php' === $oldfile ) { + $oldpath = $home_path; + } else { + $oldpath = ABSPATH; + } + + // Check to make sure it's not a new index. + if ( 'index.php' === $oldfile ) { + $index = implode( '', file( "$oldpath/$oldfile" ) ); + if ( strpos( $index, 'WP_USE_THEMES' ) !== false ) { + if ( ! copy( WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME . '/index.php', "$site_dir/$newfile" ) ) { + return false; + } + + // Don't copy anything. + continue; + } + } + + if ( ! copy( "$oldpath/$oldfile", "$site_dir/$newfile" ) ) { + return false; + } + + chmod( "$site_dir/$newfile", 0777 ); + + // Update the blog header include in each file. + $lines = explode( "\n", implode( '', file( "$site_dir/$newfile" ) ) ); + if ( $lines ) { + $f = fopen( "$site_dir/$newfile", 'w' ); + + foreach ( $lines as $line ) { + if ( preg_match( '/require.*wp-blog-header/', $line ) ) { + $line = '//' . $line; + } + + // Update stylesheet references. + $line = str_replace( "/wp-layout.css", "", $line ); + + // Update comments template inclusion. + $line = str_replace( "", '', $line ); + + fwrite( $f, "{$line}\n" ); + } + fclose( $f ); + } + } + + // Add a theme header. + $header = "/*\nTheme Name: $theme_name\nTheme URI: " . __get_option( 'siteurl' ) . "\nDescription: A theme automatically created by the update.\nVersion: 1.0\nAuthor: Moi\n*/\n"; + + $stylelines = file_get_contents( "$site_dir/style.css" ); + if ( $stylelines ) { + $f = fopen( "$site_dir/style.css", 'w' ); + + fwrite( $f, $header ); + fwrite( $f, $stylelines ); + fclose( $f ); + } + + return true; +} + +/** + * Creates a site theme from the default theme. + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + * + * @param string $theme_name The name of the theme. + * @param string $template The directory name of the theme. + * @return void|false + */ +function make_site_theme_from_default( $theme_name, $template ) { + $site_dir = WP_CONTENT_DIR . "/themes/$template"; + $default_dir = WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME; + + // Copy files from the default theme to the site theme. + // $files = array( 'index.php', 'comments.php', 'comments-popup.php', 'footer.php', 'header.php', 'sidebar.php', 'style.css' ); + + $theme_dir = @opendir( $default_dir ); + if ( $theme_dir ) { + while ( ( $theme_file = readdir( $theme_dir ) ) !== false ) { + if ( is_dir( "$default_dir/$theme_file" ) ) { + continue; + } + if ( ! copy( "$default_dir/$theme_file", "$site_dir/$theme_file" ) ) { + return; + } + chmod( "$site_dir/$theme_file", 0777 ); + } + + closedir( $theme_dir ); + } + + // Rewrite the theme header. + $stylelines = explode( "\n", implode( '', file( "$site_dir/style.css" ) ) ); + if ( $stylelines ) { + $f = fopen( "$site_dir/style.css", 'w' ); + + foreach ( $stylelines as $line ) { + if ( strpos( $line, 'Theme Name:' ) !== false ) { + $line = 'Theme Name: ' . $theme_name; + } elseif ( strpos( $line, 'Theme URI:' ) !== false ) { + $line = 'Theme URI: ' . __get_option( 'url' ); + } elseif ( strpos( $line, 'Description:' ) !== false ) { + $line = 'Description: Your theme.'; + } elseif ( strpos( $line, 'Version:' ) !== false ) { + $line = 'Version: 1'; + } elseif ( strpos( $line, 'Author:' ) !== false ) { + $line = 'Author: You'; + } + fwrite( $f, $line . "\n" ); + } + fclose( $f ); + } + + // Copy the images. + umask( 0 ); + if ( ! mkdir( "$site_dir/images", 0777 ) ) { + return false; + } + + $images_dir = @opendir( "$default_dir/images" ); + if ( $images_dir ) { + while ( ( $image = readdir( $images_dir ) ) !== false ) { + if ( is_dir( "$default_dir/images/$image" ) ) { + continue; + } + if ( ! copy( "$default_dir/images/$image", "$site_dir/images/$image" ) ) { + return; + } + chmod( "$site_dir/images/$image", 0777 ); + } + + closedir( $images_dir ); + } +} + +/** + * Creates a site theme. + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + * + * @return string|false + */ +function make_site_theme() { + // Name the theme after the blog. + $theme_name = __get_option( 'blogname' ); + $template = sanitize_title( $theme_name ); + $site_dir = WP_CONTENT_DIR . "/themes/$template"; + + // If the theme already exists, nothing to do. + if ( is_dir( $site_dir ) ) { + return false; + } + + // We must be able to write to the themes dir. + if ( ! is_writable( WP_CONTENT_DIR . '/themes' ) ) { + return false; + } + + umask( 0 ); + if ( ! mkdir( $site_dir, 0777 ) ) { + return false; + } + + if ( file_exists( ABSPATH . 'wp-layout.css' ) ) { + if ( ! make_site_theme_from_oldschool( $theme_name, $template ) ) { + // TODO: rm -rf the site theme directory. + return false; + } + } else { + if ( ! make_site_theme_from_default( $theme_name, $template ) ) { + // TODO: rm -rf the site theme directory. + return false; + } + } + + // Make the new site theme active. + $current_template = __get_option( 'template' ); + if ( WP_DEFAULT_THEME == $current_template ) { + update_option( 'template', $template ); + update_option( 'stylesheet', $template ); + } + return $template; +} + +/** + * Translate user level to user role name. + * + * @since 2.0.0 + * + * @param int $level User level. + * @return string User role name. + */ +function translate_level_to_role( $level ) { + switch ( $level ) { + case 10: + case 9: + case 8: + return 'administrator'; + case 7: + case 6: + case 5: + return 'editor'; + case 4: + case 3: + case 2: + return 'author'; + case 1: + return 'contributor'; + case 0: + default: + return 'subscriber'; + } +} + +/** + * Checks the version of the installed MySQL binary. + * + * @since 2.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function wp_check_mysql_version() { + global $wpdb; + $result = $wpdb->check_database_version(); + if ( is_wp_error( $result ) ) { + wp_die( $result ); + } +} + +/** + * Disables the Automattic widgets plugin, which was merged into core. + * + * @since 2.2.0 + */ +function maybe_disable_automattic_widgets() { + $plugins = __get_option( 'active_plugins' ); + + foreach ( (array) $plugins as $plugin ) { + if ( basename( $plugin ) == 'widgets.php' ) { + array_splice( $plugins, array_search( $plugin, $plugins ), 1 ); + update_option( 'active_plugins', $plugins ); + break; + } + } +} + +/** + * Disables the Link Manager on upgrade if, at the time of upgrade, no links exist in the DB. + * + * @since 3.5.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function maybe_disable_link_manager() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version >= 22006 && get_option( 'link_manager_enabled' ) && ! $wpdb->get_var( "SELECT link_id FROM $wpdb->links LIMIT 1" ) ) { + update_option( 'link_manager_enabled', 0 ); + } +} + +/** + * Runs before the schema is upgraded. + * + * @since 2.9.0 + * + * @global int $wp_current_db_version The old (current) database version. + * @global wpdb $wpdb WordPress database abstraction object. + */ +function pre_schema_upgrade() { + global $wp_current_db_version, $wpdb; + + // Upgrade versions prior to 2.9. + if ( $wp_current_db_version < 11557 ) { + // Delete duplicate options. Keep the option with the highest option_id. + $wpdb->query( "DELETE o1 FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 USING (`option_name`) WHERE o2.option_id > o1.option_id" ); + + // Drop the old primary key and add the new. + $wpdb->query( "ALTER TABLE $wpdb->options DROP PRIMARY KEY, ADD PRIMARY KEY(option_id)" ); + + // Drop the old option_name index. dbDelta() doesn't do the drop. + $wpdb->query( "ALTER TABLE $wpdb->options DROP INDEX option_name" ); + } + + // Multisite schema upgrades. + if ( $wp_current_db_version < 25448 && is_multisite() && wp_should_upgrade_global_tables() ) { + + // Upgrade versions prior to 3.7. + if ( $wp_current_db_version < 25179 ) { + // New primary key for signups. + $wpdb->query( "ALTER TABLE $wpdb->signups ADD signup_id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST" ); + $wpdb->query( "ALTER TABLE $wpdb->signups DROP INDEX domain" ); + } + + if ( $wp_current_db_version < 25448 ) { + // Convert archived from enum to tinyint. + $wpdb->query( "ALTER TABLE $wpdb->blogs CHANGE COLUMN archived archived varchar(1) NOT NULL default '0'" ); + $wpdb->query( "ALTER TABLE $wpdb->blogs CHANGE COLUMN archived archived tinyint(2) NOT NULL default 0" ); + } + } + + // Upgrade versions prior to 4.2. + if ( $wp_current_db_version < 31351 ) { + if ( ! is_multisite() && wp_should_upgrade_global_tables() ) { + $wpdb->query( "ALTER TABLE $wpdb->usermeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" ); + } + $wpdb->query( "ALTER TABLE $wpdb->terms DROP INDEX slug, ADD INDEX slug(slug(191))" ); + $wpdb->query( "ALTER TABLE $wpdb->terms DROP INDEX name, ADD INDEX name(name(191))" ); + $wpdb->query( "ALTER TABLE $wpdb->commentmeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" ); + $wpdb->query( "ALTER TABLE $wpdb->postmeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" ); + $wpdb->query( "ALTER TABLE $wpdb->posts DROP INDEX post_name, ADD INDEX post_name(post_name(191))" ); + } + + // Upgrade versions prior to 4.4. + if ( $wp_current_db_version < 34978 ) { + // If compatible termmeta table is found, use it, but enforce a proper index and update collation. + if ( $wpdb->get_var( "SHOW TABLES LIKE '{$wpdb->termmeta}'" ) && $wpdb->get_results( "SHOW INDEX FROM {$wpdb->termmeta} WHERE Column_name = 'meta_key'" ) ) { + $wpdb->query( "ALTER TABLE $wpdb->termmeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))" ); + maybe_convert_table_to_utf8mb4( $wpdb->termmeta ); + } + } +} + +if ( ! function_exists( 'install_global_terms' ) ) : + /** + * Install global terms. + * + * @since 3.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global string $charset_collate + */ + function install_global_terms() { + global $wpdb, $charset_collate; + $ms_queries = " +CREATE TABLE $wpdb->sitecategories ( + cat_ID bigint(20) NOT NULL auto_increment, + cat_name varchar(55) NOT NULL default '', + category_nicename varchar(200) NOT NULL default '', + last_updated timestamp NOT NULL, + PRIMARY KEY (cat_ID), + KEY category_nicename (category_nicename), + KEY last_updated (last_updated) +) $charset_collate; +"; + // Now create tables. + dbDelta( $ms_queries ); + } +endif; + +/** + * Determine if global tables should be upgraded. + * + * This function performs a series of checks to ensure the environment allows + * for the safe upgrading of global WordPress database tables. It is necessary + * because global tables will commonly grow to millions of rows on large + * installations, and the ability to control their upgrade routines can be + * critical to the operation of large networks. + * + * In a future iteration, this function may use `wp_is_large_network()` to more- + * intelligently prevent global table upgrades. Until then, we make sure + * WordPress is on the main site of the main network, to avoid running queries + * more than once in multi-site or multi-network environments. + * + * @since 4.3.0 + * + * @return bool Whether to run the upgrade routines on global tables. + */ +function wp_should_upgrade_global_tables() { + + // Return false early if explicitly not upgrading. + if ( defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) { + return false; + } + + // Assume global tables should be upgraded. + $should_upgrade = true; + + // Set to false if not on main network (does not matter if not multi-network). + if ( ! is_main_network() ) { + $should_upgrade = false; + } + + // Set to false if not on main site of current network (does not matter if not multi-site). + if ( ! is_main_site() ) { + $should_upgrade = false; + } + + /** + * Filters if upgrade routines should be run on global tables. + * + * @param bool $should_upgrade Whether to run the upgrade routines on global tables. + */ + return apply_filters( 'wp_should_upgrade_global_tables', $should_upgrade ); +} diff --git a/wp-admin/includes/user.php b/wp-admin/includes/user.php new file mode 100644 index 0000000..4411880 --- /dev/null +++ b/wp-admin/includes/user.php @@ -0,0 +1,591 @@ +ID = $user_id; + $userdata = get_userdata( $user_id ); + $user->user_login = wp_slash( $userdata->user_login ); + } else { + $update = false; + } + + if ( ! $update && isset( $_POST['user_login'] ) ) { + $user->user_login = sanitize_user( wp_unslash( $_POST['user_login'] ), true ); + } + + $pass1 = ''; + $pass2 = ''; + if ( isset( $_POST['pass1'] ) ) { + $pass1 = $_POST['pass1']; + } + if ( isset( $_POST['pass2'] ) ) { + $pass2 = $_POST['pass2']; + } + + if ( isset( $_POST['role'] ) && current_user_can( 'promote_users' ) && ( ! $user_id || current_user_can( 'promote_user', $user_id ) ) ) { + $new_role = sanitize_text_field( $_POST['role'] ); + + // If the new role isn't editable by the logged-in user die with error. + $editable_roles = get_editable_roles(); + if ( ! empty( $new_role ) && empty( $editable_roles[ $new_role ] ) ) { + wp_die( __( 'Sorry, you are not allowed to give users that role.' ), 403 ); + } + + $potential_role = isset( $wp_roles->role_objects[ $new_role ] ) ? $wp_roles->role_objects[ $new_role ] : false; + + /* + * Don't let anyone with 'promote_users' edit their own role to something without it. + * Multisite super admins can freely edit their roles, they possess all caps. + */ + if ( + ( is_multisite() && current_user_can( 'manage_network_users' ) ) || + get_current_user_id() !== $user_id || + ( $potential_role && $potential_role->has_cap( 'promote_users' ) ) + ) { + $user->role = $new_role; + } + } + + if ( isset( $_POST['email'] ) ) { + $user->user_email = sanitize_text_field( wp_unslash( $_POST['email'] ) ); + } + if ( isset( $_POST['url'] ) ) { + if ( empty( $_POST['url'] ) || 'http://' === $_POST['url'] ) { + $user->user_url = ''; + } else { + $user->user_url = esc_url_raw( $_POST['url'] ); + $protocols = implode( '|', array_map( 'preg_quote', wp_allowed_protocols() ) ); + $user->user_url = preg_match( '/^(' . $protocols . '):/is', $user->user_url ) ? $user->user_url : 'http://' . $user->user_url; + } + } + if ( isset( $_POST['first_name'] ) ) { + $user->first_name = sanitize_text_field( $_POST['first_name'] ); + } + if ( isset( $_POST['last_name'] ) ) { + $user->last_name = sanitize_text_field( $_POST['last_name'] ); + } + if ( isset( $_POST['nickname'] ) ) { + $user->nickname = sanitize_text_field( $_POST['nickname'] ); + } + if ( isset( $_POST['display_name'] ) ) { + $user->display_name = sanitize_text_field( $_POST['display_name'] ); + } + + if ( isset( $_POST['description'] ) ) { + $user->description = trim( $_POST['description'] ); + } + + foreach ( wp_get_user_contact_methods( $user ) as $method => $name ) { + if ( isset( $_POST[ $method ] ) ) { + $user->$method = sanitize_text_field( $_POST[ $method ] ); + } + } + + if ( $update ) { + $user->rich_editing = isset( $_POST['rich_editing'] ) && 'false' === $_POST['rich_editing'] ? 'false' : 'true'; + $user->syntax_highlighting = isset( $_POST['syntax_highlighting'] ) && 'false' === $_POST['syntax_highlighting'] ? 'false' : 'true'; + $user->admin_color = isset( $_POST['admin_color'] ) ? sanitize_text_field( $_POST['admin_color'] ) : 'fresh'; + $user->show_admin_bar_front = isset( $_POST['admin_bar_front'] ) ? 'true' : 'false'; + $user->locale = ''; + + if ( isset( $_POST['locale'] ) ) { + $locale = sanitize_text_field( $_POST['locale'] ); + if ( 'site-default' === $locale ) { + $locale = ''; + } elseif ( '' === $locale ) { + $locale = 'en_US'; + } elseif ( ! in_array( $locale, get_available_languages(), true ) ) { + $locale = ''; + } + + $user->locale = $locale; + } + } + + $user->comment_shortcuts = isset( $_POST['comment_shortcuts'] ) && 'true' == $_POST['comment_shortcuts'] ? 'true' : ''; + + $user->use_ssl = 0; + if ( ! empty( $_POST['use_ssl'] ) ) { + $user->use_ssl = 1; + } + + $errors = new WP_Error(); + + /* checking that username has been typed */ + if ( '' == $user->user_login ) { + $errors->add( 'user_login', __( 'Error: Please enter a username.' ) ); + } + + /* checking that nickname has been typed */ + if ( $update && empty( $user->nickname ) ) { + $errors->add( 'nickname', __( 'Error: Please enter a nickname.' ) ); + } + + /** + * Fires before the password and confirm password fields are checked for congruity. + * + * @since 1.5.1 + * + * @param string $user_login The username. + * @param string $pass1 The password (passed by reference). + * @param string $pass2 The confirmed password (passed by reference). + */ + do_action_ref_array( 'check_passwords', array( $user->user_login, &$pass1, &$pass2 ) ); + + // Check for blank password when adding a user. + if ( ! $update && empty( $pass1 ) ) { + $errors->add( 'pass', __( 'Error: Please enter a password.' ), array( 'form-field' => 'pass1' ) ); + } + + // Check for "\" in password. + if ( false !== strpos( wp_unslash( $pass1 ), '\\' ) ) { + $errors->add( 'pass', __( 'Error: Passwords may not contain the character "\\".' ), array( 'form-field' => 'pass1' ) ); + } + + // Checking the password has been typed twice the same. + if ( ( $update || ! empty( $pass1 ) ) && $pass1 != $pass2 ) { + $errors->add( 'pass', __( 'Error: Please enter the same password in both password fields.' ), array( 'form-field' => 'pass1' ) ); + } + + if ( ! empty( $pass1 ) ) { + $user->user_pass = $pass1; + } + + if ( ! $update && isset( $_POST['user_login'] ) && ! validate_username( $_POST['user_login'] ) ) { + $errors->add( 'user_login', __( 'Error: This username is invalid because it uses illegal characters. Please enter a valid username.' ) ); + } + + if ( ! $update && username_exists( $user->user_login ) ) { + $errors->add( 'user_login', __( 'Error: This username is already registered. Please choose another one.' ) ); + } + + /** This filter is documented in wp-includes/user.php */ + $illegal_logins = (array) apply_filters( 'illegal_user_logins', array() ); + + if ( in_array( strtolower( $user->user_login ), array_map( 'strtolower', $illegal_logins ), true ) ) { + $errors->add( 'invalid_username', __( 'Error: Sorry, that username is not allowed.' ) ); + } + + /* checking email address */ + if ( empty( $user->user_email ) ) { + $errors->add( 'empty_email', __( 'Error: Please enter an email address.' ), array( 'form-field' => 'email' ) ); + } elseif ( ! is_email( $user->user_email ) ) { + $errors->add( 'invalid_email', __( 'Error: The email address isn’t correct.' ), array( 'form-field' => 'email' ) ); + } else { + $owner_id = email_exists( $user->user_email ); + if ( $owner_id && ( ! $update || ( $owner_id != $user->ID ) ) ) { + $errors->add( 'email_exists', __( 'Error: This email is already registered, please choose another one.' ), array( 'form-field' => 'email' ) ); + } + } + + /** + * Fires before user profile update errors are returned. + * + * @since 2.8.0 + * + * @param WP_Error $errors WP_Error object (passed by reference). + * @param bool $update Whether this is a user update. + * @param stdClass $user User object (passed by reference). + */ + do_action_ref_array( 'user_profile_update_errors', array( &$errors, $update, &$user ) ); + + if ( $errors->has_errors() ) { + return $errors; + } + + if ( $update ) { + $user_id = wp_update_user( $user ); + } else { + $user_id = wp_insert_user( $user ); + $notify = isset( $_POST['send_user_notification'] ) ? 'both' : 'admin'; + + /** + * Fires after a new user has been created. + * + * @since 4.4.0 + * + * @param int $user_id ID of the newly created user. + * @param string $notify Type of notification that should happen. See wp_send_new_user_notifications() + * for more information on possible values. + */ + do_action( 'edit_user_created_user', $user_id, $notify ); + } + return $user_id; +} + +/** + * Fetch a filtered list of user roles that the current user is + * allowed to edit. + * + * Simple function whose main purpose is to allow filtering of the + * list of roles in the $wp_roles object so that plugins can remove + * inappropriate ones depending on the situation or user making edits. + * Specifically because without filtering anyone with the edit_users + * capability can edit others to be administrators, even if they are + * only editors or authors. This filter allows admins to delegate + * user management. + * + * @since 2.8.0 + * + * @return array[] Array of arrays containing role information. + */ +function get_editable_roles() { + $all_roles = wp_roles()->roles; + + /** + * Filters the list of editable roles. + * + * @since 2.8.0 + * + * @param array[] $all_roles Array of arrays containing role information. + */ + $editable_roles = apply_filters( 'editable_roles', $all_roles ); + + return $editable_roles; +} + +/** + * Retrieve user data and filter it. + * + * @since 2.0.5 + * + * @param int $user_id User ID. + * @return WP_User|bool WP_User object on success, false on failure. + */ +function get_user_to_edit( $user_id ) { + $user = get_userdata( $user_id ); + + if ( $user ) { + $user->filter = 'edit'; + } + + return $user; +} + +/** + * Retrieve the user's drafts. + * + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $user_id User ID. + * @return array + */ +function get_users_drafts( $user_id ) { + global $wpdb; + $query = $wpdb->prepare( "SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'draft' AND post_author = %d ORDER BY post_modified DESC", $user_id ); + + /** + * Filters the user's drafts query string. + * + * @since 2.0.0 + * + * @param string $query The user's drafts query string. + */ + $query = apply_filters( 'get_users_drafts', $query ); + return $wpdb->get_results( $query ); +} + +/** + * Remove user and optionally reassign posts and links to another user. + * + * If the $reassign parameter is not assigned to a User ID, then all posts will + * be deleted of that user. The action {@see 'delete_user'} that is passed the User ID + * being deleted will be run after the posts are either reassigned or deleted. + * The user meta will also be deleted that are for that User ID. + * + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $id User ID. + * @param int $reassign Optional. Reassign posts and links to new User ID. + * @return bool True when finished. + */ +function wp_delete_user( $id, $reassign = null ) { + global $wpdb; + + if ( ! is_numeric( $id ) ) { + return false; + } + + $id = (int) $id; + $user = new WP_User( $id ); + + if ( ! $user->exists() ) { + return false; + } + + // Normalize $reassign to null or a user ID. 'novalue' was an older default. + if ( 'novalue' === $reassign ) { + $reassign = null; + } elseif ( null !== $reassign ) { + $reassign = (int) $reassign; + } + + /** + * Fires immediately before a user is deleted from the database. + * + * @since 2.0.0 + * + * @param int $id ID of the user to delete. + * @param int|null $reassign ID of the user to reassign posts and links to. + * Default null, for no reassignment. + */ + do_action( 'delete_user', $id, $reassign ); + + if ( null === $reassign ) { + $post_types_to_delete = array(); + foreach ( get_post_types( array(), 'objects' ) as $post_type ) { + if ( $post_type->delete_with_user ) { + $post_types_to_delete[] = $post_type->name; + } elseif ( null === $post_type->delete_with_user && post_type_supports( $post_type->name, 'author' ) ) { + $post_types_to_delete[] = $post_type->name; + } + } + + /** + * Filters the list of post types to delete with a user. + * + * @since 3.4.0 + * + * @param string[] $post_types_to_delete Array of post types to delete. + * @param int $id User ID. + */ + $post_types_to_delete = apply_filters( 'post_types_to_delete_with_user', $post_types_to_delete, $id ); + $post_types_to_delete = implode( "', '", $post_types_to_delete ); + $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d AND post_type IN ('$post_types_to_delete')", $id ) ); + if ( $post_ids ) { + foreach ( $post_ids as $post_id ) { + wp_delete_post( $post_id ); + } + } + + // Clean links. + $link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) ); + + if ( $link_ids ) { + foreach ( $link_ids as $link_id ) { + wp_delete_link( $link_id ); + } + } + } else { + $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id ) ); + $wpdb->update( $wpdb->posts, array( 'post_author' => $reassign ), array( 'post_author' => $id ) ); + if ( ! empty( $post_ids ) ) { + foreach ( $post_ids as $post_id ) { + clean_post_cache( $post_id ); + } + } + $link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) ); + $wpdb->update( $wpdb->links, array( 'link_owner' => $reassign ), array( 'link_owner' => $id ) ); + if ( ! empty( $link_ids ) ) { + foreach ( $link_ids as $link_id ) { + clean_bookmark_cache( $link_id ); + } + } + } + + // FINALLY, delete user. + if ( is_multisite() ) { + remove_user_from_blog( $id, get_current_blog_id() ); + } else { + $meta = $wpdb->get_col( $wpdb->prepare( "SELECT umeta_id FROM $wpdb->usermeta WHERE user_id = %d", $id ) ); + foreach ( $meta as $mid ) { + delete_metadata_by_mid( 'user', $mid ); + } + + $wpdb->delete( $wpdb->users, array( 'ID' => $id ) ); + } + + clean_user_cache( $user ); + + /** + * Fires immediately after a user is deleted from the database. + * + * @since 2.9.0 + * + * @param int $id ID of the deleted user. + * @param int|null $reassign ID of the user to reassign posts and links to. + * Default null, for no reassignment. + */ + do_action( 'deleted_user', $id, $reassign ); + + return true; +} + +/** + * Remove all capabilities from user. + * + * @since 2.1.0 + * + * @param int $id User ID. + */ +function wp_revoke_user( $id ) { + $id = (int) $id; + + $user = new WP_User( $id ); + $user->remove_all_caps(); +} + +/** + * @since 2.8.0 + * + * @global int $user_ID + * + * @param false $errors Deprecated. + */ +function default_password_nag_handler( $errors = false ) { + global $user_ID; + // Short-circuit it. + if ( ! get_user_option( 'default_password_nag' ) ) { + return; + } + + // get_user_setting() = JS-saved UI setting. Else no-js-fallback code. + if ( 'hide' == get_user_setting( 'default_password_nag' ) || isset( $_GET['default_password_nag'] ) && '0' == $_GET['default_password_nag'] ) { + delete_user_setting( 'default_password_nag' ); + update_user_option( $user_ID, 'default_password_nag', false, true ); + } +} + +/** + * @since 2.8.0 + * + * @param int $user_ID + * @param object $old_data + */ +function default_password_nag_edit_user( $user_ID, $old_data ) { + // Short-circuit it. + if ( ! get_user_option( 'default_password_nag', $user_ID ) ) { + return; + } + + $new_data = get_userdata( $user_ID ); + + // Remove the nag if the password has been changed. + if ( $new_data->user_pass != $old_data->user_pass ) { + delete_user_setting( 'default_password_nag' ); + update_user_option( $user_ID, 'default_password_nag', false, true ); + } +} + +/** + * @since 2.8.0 + * + * @global string $pagenow + */ +function default_password_nag() { + global $pagenow; + // Short-circuit it. + if ( 'profile.php' == $pagenow || ! get_user_option( 'default_password_nag' ) ) { + return; + } + + echo '
        '; + echo '

        '; + echo '' . __( 'Notice:' ) . ' '; + _e( 'You’re using the auto-generated password for your account. Would you like to change it?' ); + echo '

        '; + printf( '' . __( 'Yes, take me to my profile page' ) . ' | ', get_edit_profile_url() . '#password' ); + printf( '' . __( 'No thanks, do not remind me again' ) . '', '?default_password_nag=0' ); + echo '

        '; +} + +/** + * @since 3.5.0 + * @access private + */ +function delete_users_add_js() { + ?> + + + + + + + $widget['id'], + 'widget_name' => $widget['name'], + '_display' => 'template', + ); + + if ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) ) { + $id_base = $wp_registered_widget_controls[ $widget['id'] ]['id_base']; + $args['_temp_id'] = "$id_base-__i__"; + $args['_multi_num'] = next_widget_id_number( $id_base ); + $args['_add'] = 'multi'; + } else { + $args['_add'] = 'single'; + if ( $sidebar ) { + $args['_hide'] = '1'; + } + } + + $control_args = array( + 0 => $args, + 1 => $widget['params'][0], + ); + $sidebar_args = wp_list_widget_controls_dynamic_sidebar( $control_args ); + + wp_widget_control( ...$sidebar_args ); + } +} + +/** + * Callback to sort array by a 'name' key. + * + * @since 3.1.0 + * @access private + * + * @return int + */ +function _sort_name_callback( $a, $b ) { + return strnatcasecmp( $a['name'], $b['name'] ); +} + +/** + * Show the widgets and their settings for a sidebar. + * Used in the admin widget config screen. + * + * @since 2.5.0 + * + * @param string $sidebar Sidebar ID. + * @param string $sidebar_name Optional. Sidebar name. Default empty. + */ +function wp_list_widget_controls( $sidebar, $sidebar_name = '' ) { + add_filter( 'dynamic_sidebar_params', 'wp_list_widget_controls_dynamic_sidebar' ); + + $description = wp_sidebar_description( $sidebar ); + + echo '
        '; + + if ( $sidebar_name ) { + $add_to = sprintf( + /* translators: %s: Widgets sidebar name. */ + __( 'Add to: %s' ), + $sidebar_name + ); + ?> + + + + '; +} + +/** + * Retrieves the widget control arguments. + * + * @since 2.5.0 + * + * @global array $wp_registered_widgets + * + * @staticvar int $i + * + * @param array $params + * @return array + */ +function wp_list_widget_controls_dynamic_sidebar( $params ) { + global $wp_registered_widgets; + static $i = 0; + $i++; + + $widget_id = $params[0]['widget_id']; + $id = isset( $params[0]['_temp_id'] ) ? $params[0]['_temp_id'] : $widget_id; + $hidden = isset( $params[0]['_hide'] ) ? ' style="display:none;"' : ''; + + $params[0]['before_widget'] = "
        "; + $params[0]['after_widget'] = '
        '; + $params[0]['before_title'] = '%BEG_OF_TITLE%'; // Deprecated. + $params[0]['after_title'] = '%END_OF_TITLE%'; // Deprecated. + + if ( is_callable( $wp_registered_widgets[ $widget_id ]['callback'] ) ) { + $wp_registered_widgets[ $widget_id ]['_callback'] = $wp_registered_widgets[ $widget_id ]['callback']; + $wp_registered_widgets[ $widget_id ]['callback'] = 'wp_widget_control'; + } + + return $params; +} + +/** + * @global array $wp_registered_widgets + * + * @param string $id_base + * @return int + */ +function next_widget_id_number( $id_base ) { + global $wp_registered_widgets; + $number = 1; + + foreach ( $wp_registered_widgets as $widget_id => $widget ) { + if ( preg_match( '/' . $id_base . '-([0-9]+)$/', $widget_id, $matches ) ) { + $number = max( $number, $matches[1] ); + } + } + $number++; + + return $number; +} + +/** + * Meta widget used to display the control form for a widget. + * + * Called from dynamic_sidebar(). + * + * @since 2.5.0 + * + * @global array $wp_registered_widgets + * @global array $wp_registered_widget_controls + * @global array $sidebars_widgets + * + * @param array $sidebar_args + * @return array + */ +function wp_widget_control( $sidebar_args ) { + global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets; + + $widget_id = $sidebar_args['widget_id']; + $sidebar_id = isset( $sidebar_args['id'] ) ? $sidebar_args['id'] : false; + $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[ $sidebar_id ] ) : '-1'; // Position of widget in sidebar. + $control = isset( $wp_registered_widget_controls[ $widget_id ] ) ? $wp_registered_widget_controls[ $widget_id ] : array(); + $widget = $wp_registered_widgets[ $widget_id ]; + + $id_format = $widget['id']; + $widget_number = isset( $control['params'][0]['number'] ) ? $control['params'][0]['number'] : ''; + $id_base = isset( $control['id_base'] ) ? $control['id_base'] : $widget_id; + $width = isset( $control['width'] ) ? $control['width'] : ''; + $height = isset( $control['height'] ) ? $control['height'] : ''; + $multi_number = isset( $sidebar_args['_multi_num'] ) ? $sidebar_args['_multi_num'] : ''; + $add_new = isset( $sidebar_args['_add'] ) ? $sidebar_args['_add'] : ''; + + $before_form = isset( $sidebar_args['before_form'] ) ? $sidebar_args['before_form'] : '
        '; + $after_form = isset( $sidebar_args['after_form'] ) ? $sidebar_args['after_form'] : '
        '; + $before_widget_content = isset( $sidebar_args['before_widget_content'] ) ? $sidebar_args['before_widget_content'] : '
        '; + $after_widget_content = isset( $sidebar_args['after_widget_content'] ) ? $sidebar_args['after_widget_content'] : '
        '; + + $query_arg = array( 'editwidget' => $widget['id'] ); + if ( $add_new ) { + $query_arg['addnew'] = 1; + if ( $multi_number ) { + $query_arg['num'] = $multi_number; + $query_arg['base'] = $id_base; + } + } else { + $query_arg['sidebar'] = $sidebar_id; + $query_arg['key'] = $key; + } + + /* + * We aren't showing a widget control, we're outputting a template + * for a multi-widget control. + */ + if ( isset( $sidebar_args['_display'] ) && 'template' == $sidebar_args['_display'] && $widget_number ) { + // number == -1 implies a template where id numbers are replaced by a generic '__i__'. + $control['params'][0]['number'] = -1; + // With id_base widget id's are constructed like {$id_base}-{$id_number}. + if ( isset( $control['id_base'] ) ) { + $id_format = $control['id_base'] . '-__i__'; + } + } + + $wp_registered_widgets[ $widget_id ]['callback'] = $wp_registered_widgets[ $widget_id ]['_callback']; + unset( $wp_registered_widgets[ $widget_id ]['_callback'] ); + + $widget_title = esc_html( strip_tags( $sidebar_args['widget_name'] ) ); + $has_form = 'noform'; + + echo $sidebar_args['before_widget']; + ?> +
        +
        + + + + + + +
        +

        +
        + +
        + + + " . __( 'There are no options for this widget.' ) . "

        \n"; + } + + $noform_class = ''; + if ( 'noform' === $has_form ) { + $noform_class = ' widget-control-noform'; + } + ?> + + + + + + + + + +
        +
        + + + | + + +
        +
        + 'widget-' . esc_attr( $id_format ) . '-savewidget' ) ); ?> + +
        +
        +
        + +
        + +
        + +
        + ' . __( 'Welcome to your WordPress Dashboard! This is the screen you will see when you log in to your site, and gives you access to all the site management features of WordPress. You can get help for any screen by clicking the Help tab above the screen title.' ) . '

        '; + +$screen = get_current_screen(); + +$screen->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => $help, + ) +); + +// Help tabs. + +$help = '

        ' . __( 'The left-hand navigation menu provides links to all of the WordPress administration screens, with submenu items displayed on hover. You can minimize this menu to a narrow icon strip by clicking on the Collapse Menu arrow at the bottom.' ) . '

        '; +$help .= '

        ' . __( 'Links in the Toolbar at the top of the screen connect your dashboard and the front end of your site, and provide access to your profile and helpful WordPress information.' ) . '

        '; + +$screen->add_help_tab( + array( + 'id' => 'help-navigation', + 'title' => __( 'Navigation' ), + 'content' => $help, + ) +); + +$help = '

        ' . __( 'You can use the following controls to arrange your Dashboard screen to suit your workflow. This is true on most other administration screens as well.' ) . '

        '; +$help .= '

        ' . __( 'Screen Options — Use the Screen Options tab to choose which Dashboard boxes to show.' ) . '

        '; +$help .= '

        ' . __( 'Drag and Drop — To rearrange the boxes, drag and drop by clicking on the title bar of the selected box and releasing when you see a gray dotted-line rectangle appear in the location you want to place the box.' ) . '

        '; +$help .= '

        ' . __( 'Box Controls — Click the title bar of the box to expand or collapse it. Some boxes added by plugins may have configurable content, and will show a “Configure” link in the title bar if you hover over it.' ) . '

        '; + +$screen->add_help_tab( + array( + 'id' => 'help-layout', + 'title' => __( 'Layout' ), + 'content' => $help, + ) +); + +$help = '

        ' . __( 'The boxes on your Dashboard screen are:' ) . '

        '; + +if ( current_user_can( 'edit_posts' ) ) { + $help .= '

        ' . __( 'At A Glance — Displays a summary of the content on your site and identifies which theme and version of WordPress you are using.' ) . '

        '; +} + +$help .= '

        ' . __( 'Activity — Shows the upcoming scheduled posts, recently published posts, and the most recent comments on your posts and allows you to moderate them.' ) . '

        '; + +if ( is_blog_admin() && current_user_can( 'edit_posts' ) ) { + $help .= '

        ' . __( "Quick Draft — Allows you to create a new post and save it as a draft. Also displays links to the 3 most recent draft posts you've started." ) . '

        '; +} + +$help .= '

        ' . sprintf( + /* translators: %s: WordPress Planet URL. */ + __( 'WordPress Events and News — Upcoming events near you as well as the latest news from the official WordPress project and the WordPress Planet.' ), + __( 'https://planet.wordpress.org/' ) +) . '

        '; + +if ( current_user_can( 'edit_theme_options' ) ) { + $help .= '

        ' . __( 'Welcome — Shows links for some of the most common tasks when setting up a new site.' ) . '

        '; +} + +$screen->add_help_tab( + array( + 'id' => 'help-content', + 'title' => __( 'Content' ), + 'content' => $help, + ) +); + +unset( $help ); + +$screen->set_help_sidebar( + '

        ' . __( 'For more information:' ) . '

        ' . + '

        ' . __( 'Documentation on Dashboard' ) . '

        ' . + '

        ' . __( 'Support' ) . '

        ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
        +

        + +user_email != get_option( 'admin_email' ) ); + if ( $hide ) { + $classes .= ' hidden'; + } + ?> + +
        + + + +
        + + +
        + +
        + +
        + +comments, 'comment_author', 'tinytext' ) ) { + * echo "ok\n"; + * } + * + * $error_count = 0; + * $tablename = $wpdb->links; + * // Check the column. + * if ( ! check_column( $wpdb->links, 'link_description', 'varchar( 255 )' ) ) { + * $ddl = "ALTER TABLE $wpdb->links MODIFY COLUMN link_description varchar(255) NOT NULL DEFAULT '' "; + * $q = $wpdb->query( $ddl ); + * } + * + * if ( check_column( $wpdb->links, 'link_description', 'varchar( 255 )' ) ) { + * $res .= $tablename . ' - ok
        '; + * } else { + * $res .= 'There was a problem with ' . $tablename . '
        '; + * ++$error_count; + * } + * + * @package WordPress + * @subpackage Plugin + */ + +/** Load WordPress Bootstrap */ +require_once dirname( __DIR__ ) . '/wp-load.php'; + +if ( ! function_exists( 'maybe_create_table' ) ) : + /** + * Create database table, if it doesn't already exist. + * + * @since 1.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $table_name Database table name. + * @param string $create_ddl Create database table SQL. + * @return bool False on error, true if already exists or success. + */ + function maybe_create_table( $table_name, $create_ddl ) { + global $wpdb; + foreach ( $wpdb->get_col( 'SHOW TABLES', 0 ) as $table ) { + if ( $table == $table_name ) { + return true; + } + } + // Didn't find it, so try to create it. + $wpdb->query( $create_ddl ); + + // We cannot directly tell that whether this succeeded! + foreach ( $wpdb->get_col( 'SHOW TABLES', 0 ) as $table ) { + if ( $table == $table_name ) { + return true; + } + } + return false; + } +endif; + +if ( ! function_exists( 'maybe_add_column' ) ) : + /** + * Add column to database table, if column doesn't already exist in table. + * + * @since 1.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $table_name Database table name + * @param string $column_name Table column name + * @param string $create_ddl SQL to add column to table. + * @return bool False on failure. True, if already exists or was successful. + */ + function maybe_add_column( $table_name, $column_name, $create_ddl ) { + global $wpdb; + foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) { + + if ( $column == $column_name ) { + return true; + } + } + + // Didn't find it, so try to create it. + $wpdb->query( $create_ddl ); + + // We cannot directly tell that whether this succeeded! + foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) { + if ( $column == $column_name ) { + return true; + } + } + return false; + } +endif; + +/** + * Drop column from database table, if it exists. + * + * @since 1.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $table_name Table name + * @param string $column_name Column name + * @param string $drop_ddl SQL statement to drop column. + * @return bool True on success or if the column doesn't exist, false on failure. + */ +function maybe_drop_column( $table_name, $column_name, $drop_ddl ) { + global $wpdb; + foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) { + if ( $column == $column_name ) { + + // Found it, so try to drop it. + $wpdb->query( $drop_ddl ); + + // We cannot directly tell that whether this succeeded! + foreach ( $wpdb->get_col( "DESC $table_name", 0 ) as $column ) { + if ( $column == $column_name ) { + return false; + } + } + } + } + // Else didn't find it. + return true; +} + +/** + * Check column matches criteria. + * + * Uses the SQL DESC for retrieving the table info for the column. It will help + * understand the parameters, if you do more research on what column information + * is returned by the SQL statement. Pass in null to skip checking that + * criteria. + * + * Column names returned from DESC table are case sensitive and are listed: + * Field + * Type + * Null + * Key + * Default + * Extra + * + * @since 1.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $table_name Table name + * @param string $col_name Column name + * @param string $col_type Column type + * @param bool $is_null Optional. Check is null. + * @param mixed $key Optional. Key info. + * @param mixed $default Optional. Default value. + * @param mixed $extra Optional. Extra value. + * @return bool True, if matches. False, if not matching. + */ +function check_column( $table_name, $col_name, $col_type, $is_null = null, $key = null, $default = null, $extra = null ) { + global $wpdb; + $diffs = 0; + $results = $wpdb->get_results( "DESC $table_name" ); + + foreach ( $results as $row ) { + + if ( $row->Field == $col_name ) { + + // Got our column, check the params. + if ( ( null != $col_type ) && ( $row->Type != $col_type ) ) { + ++$diffs; + } + if ( ( null != $is_null ) && ( $row->Null != $is_null ) ) { + ++$diffs; + } + if ( ( null != $key ) && ( $row->Key != $key ) ) { + ++$diffs; + } + if ( ( null != $default ) && ( $row->Default != $default ) ) { + ++$diffs; + } + if ( ( null != $extra ) && ( $row->Extra != $extra ) ) { + ++$diffs; + } + if ( $diffs > 0 ) { + return false; + } + return true; + } // End if found our column. + } + return false; +} diff --git a/wp-admin/install.php b/wp-admin/install.php new file mode 100644 index 0000000..2168c03 --- /dev/null +++ b/wp-admin/install.php @@ -0,0 +1,437 @@ + + + + + + Error: PHP is not running + + + +

        Error: PHP is not running

        +

        WordPress requires that your web server is running PHP. Your server does not have PHP installed, or PHP is turned off.

        + + + + +> + + + + + <?php _e( 'WordPress › Installation' ); ?> + + + + + + prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $wpdb->users ) ); + $user_table = ( $wpdb->get_var( $sql ) != null ); + + // Ensure that sites appear in search engines by default. + $blog_public = 1; + if ( isset( $_POST['weblog_title'] ) ) { + $blog_public = isset( $_POST['blog_public'] ); + } + + $weblog_title = isset( $_POST['weblog_title'] ) ? trim( wp_unslash( $_POST['weblog_title'] ) ) : ''; + $user_name = isset( $_POST['user_name'] ) ? trim( wp_unslash( $_POST['user_name'] ) ) : ''; + $admin_email = isset( $_POST['admin_email'] ) ? trim( wp_unslash( $_POST['admin_email'] ) ) : ''; + + if ( ! is_null( $error ) ) { + ?> +

        +

        + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        'submit' ) ); ?>

        + +
        + ' . __( 'Already Installed' ) . '' . + '

        ' . __( 'You appear to have already installed WordPress. To reinstall please clear your old database tables first.' ) . '

        ' . + '

        ' . __( 'Log In' ) . '

        ' . + '' + ); +} + +/** + * @global string $wp_version The WordPress version string. + * @global string $required_php_version The required PHP version string. + * @global string $required_mysql_version The required MySQL version string. + */ +global $wp_version, $required_php_version, $required_mysql_version; + +$php_version = phpversion(); +$mysql_version = $wpdb->db_version(); +$php_compat = version_compare( $php_version, $required_php_version, '>=' ); +$mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' ) || file_exists( WP_CONTENT_DIR . '/db.php' ); + +$version_url = sprintf( + /* translators: %s: WordPress version. */ + esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ), + sanitize_title( $wp_version ) +); + +/* translators: %s: URL to Update PHP page. */ +$php_update_message = '

        ' . sprintf( __( 'Learn more about updating PHP.' ), esc_url( wp_get_update_php_url() ) ); + +$annotation = wp_get_update_php_annotation(); +if ( $annotation ) { + $php_update_message .= '

        ' . $annotation . ''; +} + +if ( ! $mysql_compat && ! $php_compat ) { + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Minimum required MySQL version number, 5: Current PHP version number, 6: Current MySQL version number. */ + $compat = sprintf( __( 'You cannot install because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s.' ), $version_url, $wp_version, $required_php_version, $required_mysql_version, $php_version, $mysql_version ) . $php_update_message; +} elseif ( ! $php_compat ) { + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Current PHP version number. */ + $compat = sprintf( __( 'You cannot install because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s.' ), $version_url, $wp_version, $required_php_version, $php_version ) . $php_update_message; +} elseif ( ! $mysql_compat ) { + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required MySQL version number, 4: Current MySQL version number. */ + $compat = sprintf( __( 'You cannot install because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s.' ), $version_url, $wp_version, $required_mysql_version, $mysql_version ); +} + +if ( ! $mysql_compat || ! $php_compat ) { + display_header(); + die( '

        ' . __( 'Requirements Not Met' ) . '

        ' . $compat . '

        ' ); +} + +if ( ! is_string( $wpdb->base_prefix ) || '' === $wpdb->base_prefix ) { + display_header(); + die( + '

        ' . __( 'Configuration Error' ) . '

        ' . + '

        ' . sprintf( + /* translators: %s: wp-config.php */ + __( 'Your %s file has an empty database table prefix, which is not supported.' ), + 'wp-config.php' + ) . '

        ' + ); +} + +// Set error message if DO_NOT_UPGRADE_GLOBAL_TABLES isn't set as it will break install. +if ( defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) { + display_header(); + die( + '

        ' . __( 'Configuration Error' ) . '

        ' . + '

        ' . sprintf( + /* translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES */ + __( 'The constant %s cannot be defined when installing WordPress.' ), + 'DO_NOT_UPGRADE_GLOBAL_TABLES' + ) . '

        ' + ); +} + +/** + * @global string $wp_local_package Locale code of the package. + * @global WP_Locale $wp_locale WordPress date and time locale object. + */ +$language = ''; +if ( ! empty( $_REQUEST['language'] ) ) { + $language = preg_replace( '/[^a-zA-Z0-9_]/', '', $_REQUEST['language'] ); +} elseif ( isset( $GLOBALS['wp_local_package'] ) ) { + $language = $GLOBALS['wp_local_package']; +} + +$scripts_to_print = array( 'jquery' ); + +switch ( $step ) { + case 0: // Step 0. + if ( wp_can_install_language_pack() && empty( $language ) ) { + $languages = wp_get_available_translations(); + if ( $languages ) { + $scripts_to_print[] = 'language-chooser'; + display_header( 'language-chooser' ); + echo '
        '; + wp_install_language_form( $languages ); + echo '
        '; + break; + } + } + + // Deliberately fall through if we can't reach the translations API. + + case 1: // Step 1, direct link or from language chooser. + if ( ! empty( $language ) ) { + $loaded_language = wp_download_language_pack( $language ); + if ( $loaded_language ) { + load_default_textdomain( $loaded_language ); + $GLOBALS['wp_locale'] = new WP_Locale(); + } + } + + $scripts_to_print[] = 'user-profile'; + + display_header(); + ?> +

        +

        + +

        +

        + + error ) ) { + wp_die( $wpdb->error->get_error_message() ); + } + + $scripts_to_print[] = 'user-profile'; + + display_header(); + // Fill in the data we gathered. + $weblog_title = isset( $_POST['weblog_title'] ) ? trim( wp_unslash( $_POST['weblog_title'] ) ) : ''; + $user_name = isset( $_POST['user_name'] ) ? trim( wp_unslash( $_POST['user_name'] ) ) : ''; + $admin_password = isset( $_POST['admin_password'] ) ? wp_unslash( $_POST['admin_password'] ) : ''; + $admin_password_check = isset( $_POST['admin_password2'] ) ? wp_unslash( $_POST['admin_password2'] ) : ''; + $admin_email = isset( $_POST['admin_email'] ) ? trim( wp_unslash( $_POST['admin_email'] ) ) : ''; + $public = isset( $_POST['blog_public'] ) ? (int) $_POST['blog_public'] : 1; + + // Check email address. + $error = false; + if ( empty( $user_name ) ) { + // TODO: Poka-yoke. + display_setup_form( __( 'Please provide a valid username.' ) ); + $error = true; + } elseif ( sanitize_user( $user_name, true ) != $user_name ) { + display_setup_form( __( 'The username you provided has invalid characters.' ) ); + $error = true; + } elseif ( $admin_password != $admin_password_check ) { + // TODO: Poka-yoke. + display_setup_form( __( 'Your passwords do not match. Please try again.' ) ); + $error = true; + } elseif ( empty( $admin_email ) ) { + // TODO: Poka-yoke. + display_setup_form( __( 'You must provide an email address.' ) ); + $error = true; + } elseif ( ! is_email( $admin_email ) ) { + // TODO: Poka-yoke. + display_setup_form( __( 'Sorry, that isn’t a valid email address. Email addresses look like username@example.com.' ) ); + $error = true; + } + + if ( false === $error ) { + $wpdb->show_errors(); + $result = wp_install( $weblog_title, $user_name, $admin_email, $public, '', wp_slash( $admin_password ), $loaded_language ); + ?> + +

        + +

        + + + + + + + + + + +
        + +
        + +

        +
        + +

        + + + + + + + diff --git a/wp-admin/js/accordion.js b/wp-admin/js/accordion.js new file mode 100644 index 0000000..7eacbec --- /dev/null +++ b/wp-admin/js/accordion.js @@ -0,0 +1,94 @@ +/** + * Accordion-folding functionality. + * + * Markup with the appropriate classes will be automatically hidden, + * with one section opening at a time when its title is clicked. + * Use the following markup structure for accordion behavior: + * + *
        + *
        + *

        + *
        + *
        + *
        + *
        + *

        + *
        + *
        + *
        + *
        + *

        + *
        + *
        + *
        + *
        + * + * Note that any appropriate tags may be used, as long as the above classes are present. + * + * @since 3.6.0 + * @output wp-admin/js/accordion.js + */ + +( function( $ ){ + + $( document ).ready( function () { + + // Expand/Collapse accordion sections on click. + $( '.accordion-container' ).on( 'click keydown', '.accordion-section-title', function( e ) { + if ( e.type === 'keydown' && 13 !== e.which ) { // "Return" key. + return; + } + + e.preventDefault(); // Keep this AFTER the key filter above. + + accordionSwitch( $( this ) ); + }); + + }); + + /** + * Close the current accordion section and open a new one. + * + * @param {Object} el Title element of the accordion section to toggle. + * @since 3.6.0 + */ + function accordionSwitch ( el ) { + var section = el.closest( '.accordion-section' ), + sectionToggleControl = section.find( '[aria-expanded]' ).first(), + container = section.closest( '.accordion-container' ), + siblings = container.find( '.open' ), + siblingsToggleControl = siblings.find( '[aria-expanded]' ).first(), + content = section.find( '.accordion-section-content' ); + + // This section has no content and cannot be expanded. + if ( section.hasClass( 'cannot-expand' ) ) { + return; + } + + // Add a class to the container to let us know something is happening inside. + // This helps in cases such as hiding a scrollbar while animations are executing. + container.addClass( 'opening' ); + + if ( section.hasClass( 'open' ) ) { + section.toggleClass( 'open' ); + content.toggle( true ).slideToggle( 150 ); + } else { + siblingsToggleControl.attr( 'aria-expanded', 'false' ); + siblings.removeClass( 'open' ); + siblings.find( '.accordion-section-content' ).show().slideUp( 150 ); + content.toggle( false ).slideToggle( 150 ); + section.toggleClass( 'open' ); + } + + // We have to wait for the animations to finish. + setTimeout(function(){ + container.removeClass( 'opening' ); + }, 150); + + // If there's an element with an aria-expanded attribute, assume it's a toggle control and toggle the aria-expanded value. + if ( sectionToggleControl ) { + sectionToggleControl.attr( 'aria-expanded', String( sectionToggleControl.attr( 'aria-expanded' ) === 'false' ) ); + } + } + +})(jQuery); diff --git a/wp-admin/js/accordion.min.js b/wp-admin/js/accordion.min.js new file mode 100644 index 0000000..c7bddb7 --- /dev/null +++ b/wp-admin/js/accordion.min.js @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +!function(e){e(document).ready(function(){e(".accordion-container").on("click keydown",".accordion-section-title",function(n){"keydown"===n.type&&13!==n.which||(n.preventDefault(),function(n){var e=n.closest(".accordion-section"),o=e.find("[aria-expanded]").first(),a=e.closest(".accordion-container"),i=a.find(".open"),t=i.find("[aria-expanded]").first(),s=e.find(".accordion-section-content");if(e.hasClass("cannot-expand"))return;a.addClass("opening"),e.hasClass("open")?(e.toggleClass("open"),s.toggle(!0).slideToggle(150)):(t.attr("aria-expanded","false"),i.removeClass("open"),i.find(".accordion-section-content").show().slideUp(150),s.toggle(!1).slideToggle(150),e.toggleClass("open"));setTimeout(function(){a.removeClass("opening")},150),o&&o.attr("aria-expanded",String("false"===o.attr("aria-expanded")))}(e(this)))})})}(jQuery); \ No newline at end of file diff --git a/wp-admin/js/code-editor.js b/wp-admin/js/code-editor.js new file mode 100644 index 0000000..dd0feca --- /dev/null +++ b/wp-admin/js/code-editor.js @@ -0,0 +1,346 @@ +/** + * @output wp-admin/js/code-editor.js + */ + +if ( 'undefined' === typeof window.wp ) { + /** + * @namespace wp + */ + window.wp = {}; +} +if ( 'undefined' === typeof window.wp.codeEditor ) { + /** + * @namespace wp.codeEditor + */ + window.wp.codeEditor = {}; +} + +( function( $, wp ) { + 'use strict'; + + /** + * Default settings for code editor. + * + * @since 4.9.0 + * @type {object} + */ + wp.codeEditor.defaultSettings = { + codemirror: {}, + csslint: {}, + htmlhint: {}, + jshint: {}, + onTabNext: function() {}, + onTabPrevious: function() {}, + onChangeLintingErrors: function() {}, + onUpdateErrorNotice: function() {} + }; + + /** + * Configure linting. + * + * @param {CodeMirror} editor - Editor. + * @param {object} settings - Code editor settings. + * @param {object} settings.codeMirror - Settings for CodeMirror. + * @param {Function} settings.onChangeLintingErrors - Callback for when there are changes to linting errors. + * @param {Function} settings.onUpdateErrorNotice - Callback to update error notice. + * + * @return {void} + */ + function configureLinting( editor, settings ) { // eslint-disable-line complexity + var currentErrorAnnotations = [], previouslyShownErrorAnnotations = []; + + /** + * Call the onUpdateErrorNotice if there are new errors to show. + * + * @return {void} + */ + function updateErrorNotice() { + if ( settings.onUpdateErrorNotice && ! _.isEqual( currentErrorAnnotations, previouslyShownErrorAnnotations ) ) { + settings.onUpdateErrorNotice( currentErrorAnnotations, editor ); + previouslyShownErrorAnnotations = currentErrorAnnotations; + } + } + + /** + * Get lint options. + * + * @return {object} Lint options. + */ + function getLintOptions() { // eslint-disable-line complexity + var options = editor.getOption( 'lint' ); + + if ( ! options ) { + return false; + } + + if ( true === options ) { + options = {}; + } else if ( _.isObject( options ) ) { + options = $.extend( {}, options ); + } + + /* + * Note that rules must be sent in the "deprecated" lint.options property + * to prevent linter from complaining about unrecognized options. + * See . + */ + if ( ! options.options ) { + options.options = {}; + } + + // Configure JSHint. + if ( 'javascript' === settings.codemirror.mode && settings.jshint ) { + $.extend( options.options, settings.jshint ); + } + + // Configure CSSLint. + if ( 'css' === settings.codemirror.mode && settings.csslint ) { + $.extend( options.options, settings.csslint ); + } + + // Configure HTMLHint. + if ( 'htmlmixed' === settings.codemirror.mode && settings.htmlhint ) { + options.options.rules = $.extend( {}, settings.htmlhint ); + + if ( settings.jshint ) { + options.options.rules.jshint = settings.jshint; + } + if ( settings.csslint ) { + options.options.rules.csslint = settings.csslint; + } + } + + // Wrap the onUpdateLinting CodeMirror event to route to onChangeLintingErrors and onUpdateErrorNotice. + options.onUpdateLinting = (function( onUpdateLintingOverridden ) { + return function( annotations, annotationsSorted, cm ) { + var errorAnnotations = _.filter( annotations, function( annotation ) { + return 'error' === annotation.severity; + } ); + + if ( onUpdateLintingOverridden ) { + onUpdateLintingOverridden.apply( annotations, annotationsSorted, cm ); + } + + // Skip if there are no changes to the errors. + if ( _.isEqual( errorAnnotations, currentErrorAnnotations ) ) { + return; + } + + currentErrorAnnotations = errorAnnotations; + + if ( settings.onChangeLintingErrors ) { + settings.onChangeLintingErrors( errorAnnotations, annotations, annotationsSorted, cm ); + } + + /* + * Update notifications when the editor is not focused to prevent error message + * from overwhelming the user during input, unless there are now no errors or there + * were previously errors shown. In these cases, update immediately so they can know + * that they fixed the errors. + */ + if ( ! editor.state.focused || 0 === currentErrorAnnotations.length || previouslyShownErrorAnnotations.length > 0 ) { + updateErrorNotice(); + } + }; + })( options.onUpdateLinting ); + + return options; + } + + editor.setOption( 'lint', getLintOptions() ); + + // Keep lint options populated. + editor.on( 'optionChange', function( cm, option ) { + var options, gutters, gutterName = 'CodeMirror-lint-markers'; + if ( 'lint' !== option ) { + return; + } + gutters = editor.getOption( 'gutters' ) || []; + options = editor.getOption( 'lint' ); + if ( true === options ) { + if ( ! _.contains( gutters, gutterName ) ) { + editor.setOption( 'gutters', [ gutterName ].concat( gutters ) ); + } + editor.setOption( 'lint', getLintOptions() ); // Expand to include linting options. + } else if ( ! options ) { + editor.setOption( 'gutters', _.without( gutters, gutterName ) ); + } + + // Force update on error notice to show or hide. + if ( editor.getOption( 'lint' ) ) { + editor.performLint(); + } else { + currentErrorAnnotations = []; + updateErrorNotice(); + } + } ); + + // Update error notice when leaving the editor. + editor.on( 'blur', updateErrorNotice ); + + // Work around hint selection with mouse causing focus to leave editor. + editor.on( 'startCompletion', function() { + editor.off( 'blur', updateErrorNotice ); + } ); + editor.on( 'endCompletion', function() { + var editorRefocusWait = 500; + editor.on( 'blur', updateErrorNotice ); + + // Wait for editor to possibly get re-focused after selection. + _.delay( function() { + if ( ! editor.state.focused ) { + updateErrorNotice(); + } + }, editorRefocusWait ); + }); + + /* + * Make sure setting validities are set if the user tries to click Publish + * while an autocomplete dropdown is still open. The Customizer will block + * saving when a setting has an error notifications on it. This is only + * necessary for mouse interactions because keyboards will have already + * blurred the field and cause onUpdateErrorNotice to have already been + * called. + */ + $( document.body ).on( 'mousedown', function( event ) { + if ( editor.state.focused && ! $.contains( editor.display.wrapper, event.target ) && ! $( event.target ).hasClass( 'CodeMirror-hint' ) ) { + updateErrorNotice(); + } + }); + } + + /** + * Configure tabbing. + * + * @param {CodeMirror} codemirror - Editor. + * @param {object} settings - Code editor settings. + * @param {object} settings.codeMirror - Settings for CodeMirror. + * @param {Function} settings.onTabNext - Callback to handle tabbing to the next tabbable element. + * @param {Function} settings.onTabPrevious - Callback to handle tabbing to the previous tabbable element. + * + * @return {void} + */ + function configureTabbing( codemirror, settings ) { + var $textarea = $( codemirror.getTextArea() ); + + codemirror.on( 'blur', function() { + $textarea.data( 'next-tab-blurs', false ); + }); + codemirror.on( 'keydown', function onKeydown( editor, event ) { + var tabKeyCode = 9, escKeyCode = 27; + + // Take note of the ESC keypress so that the next TAB can focus outside the editor. + if ( escKeyCode === event.keyCode ) { + $textarea.data( 'next-tab-blurs', true ); + return; + } + + // Short-circuit if tab key is not being pressed or the tab key press should move focus. + if ( tabKeyCode !== event.keyCode || ! $textarea.data( 'next-tab-blurs' ) ) { + return; + } + + // Focus on previous or next focusable item. + if ( event.shiftKey ) { + settings.onTabPrevious( codemirror, event ); + } else { + settings.onTabNext( codemirror, event ); + } + + // Reset tab state. + $textarea.data( 'next-tab-blurs', false ); + + // Prevent tab character from being added. + event.preventDefault(); + }); + } + + /** + * @typedef {object} wp.codeEditor~CodeEditorInstance + * @property {object} settings - The code editor settings. + * @property {CodeMirror} codemirror - The CodeMirror instance. + */ + + /** + * Initialize Code Editor (CodeMirror) for an existing textarea. + * + * @since 4.9.0 + * + * @param {string|jQuery|Element} textarea - The HTML id, jQuery object, or DOM Element for the textarea that is used for the editor. + * @param {object} [settings] - Settings to override defaults. + * @param {Function} [settings.onChangeLintingErrors] - Callback for when the linting errors have changed. + * @param {Function} [settings.onUpdateErrorNotice] - Callback for when error notice should be displayed. + * @param {Function} [settings.onTabPrevious] - Callback to handle tabbing to the previous tabbable element. + * @param {Function} [settings.onTabNext] - Callback to handle tabbing to the next tabbable element. + * @param {object} [settings.codemirror] - Options for CodeMirror. + * @param {object} [settings.csslint] - Rules for CSSLint. + * @param {object} [settings.htmlhint] - Rules for HTMLHint. + * @param {object} [settings.jshint] - Rules for JSHint. + * + * @return {CodeEditorInstance} Instance. + */ + wp.codeEditor.initialize = function initialize( textarea, settings ) { + var $textarea, codemirror, instanceSettings, instance; + if ( 'string' === typeof textarea ) { + $textarea = $( '#' + textarea ); + } else { + $textarea = $( textarea ); + } + + instanceSettings = $.extend( {}, wp.codeEditor.defaultSettings, settings ); + instanceSettings.codemirror = $.extend( {}, instanceSettings.codemirror ); + + codemirror = wp.CodeMirror.fromTextArea( $textarea[0], instanceSettings.codemirror ); + + configureLinting( codemirror, instanceSettings ); + + instance = { + settings: instanceSettings, + codemirror: codemirror + }; + + if ( codemirror.showHint ) { + codemirror.on( 'keyup', function( editor, event ) { // eslint-disable-line complexity + var shouldAutocomplete, isAlphaKey = /^[a-zA-Z]$/.test( event.key ), lineBeforeCursor, innerMode, token; + if ( codemirror.state.completionActive && isAlphaKey ) { + return; + } + + // Prevent autocompletion in string literals or comments. + token = codemirror.getTokenAt( codemirror.getCursor() ); + if ( 'string' === token.type || 'comment' === token.type ) { + return; + } + + innerMode = wp.CodeMirror.innerMode( codemirror.getMode(), token.state ).mode.name; + lineBeforeCursor = codemirror.doc.getLine( codemirror.doc.getCursor().line ).substr( 0, codemirror.doc.getCursor().ch ); + if ( 'html' === innerMode || 'xml' === innerMode ) { + shouldAutocomplete = + '<' === event.key || + '/' === event.key && 'tag' === token.type || + isAlphaKey && 'tag' === token.type || + isAlphaKey && 'attribute' === token.type || + '=' === token.string && token.state.htmlState && token.state.htmlState.tagName; + } else if ( 'css' === innerMode ) { + shouldAutocomplete = + isAlphaKey || + ':' === event.key || + ' ' === event.key && /:\s+$/.test( lineBeforeCursor ); + } else if ( 'javascript' === innerMode ) { + shouldAutocomplete = isAlphaKey || '.' === event.key; + } else if ( 'clike' === innerMode && 'php' === codemirror.options.mode ) { + shouldAutocomplete = 'keyword' === token.type || 'variable' === token.type; + } + if ( shouldAutocomplete ) { + codemirror.showHint( { completeSingle: false } ); + } + }); + } + + // Facilitate tabbing out of the editor. + configureTabbing( codemirror, settings ); + + return instance; + }; + +})( window.jQuery, window.wp ); diff --git a/wp-admin/js/code-editor.min.js b/wp-admin/js/code-editor.min.js new file mode 100644 index 0000000..1baa787 --- /dev/null +++ b/wp-admin/js/code-editor.min.js @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +void 0===window.wp&&(window.wp={}),void 0===window.wp.codeEditor&&(window.wp.codeEditor={}),function(l,d){"use strict";d.codeEditor.defaultSettings={codemirror:{},csslint:{},htmlhint:{},jshint:{},onTabNext:function(){},onTabPrevious:function(){},onChangeLintingErrors:function(){},onUpdateErrorNotice:function(){}},d.codeEditor.initialize=function(t,n){var e,a,o,i;return e=l("string"==typeof t?"#"+t:t),(o=l.extend({},d.codeEditor.defaultSettings,n)).codemirror=l.extend({},o.codemirror),function(r,s){var a=[],d=[];function c(){s.onUpdateErrorNotice&&!_.isEqual(a,d)&&(s.onUpdateErrorNotice(a,r),d=a)}function u(){var i,t=r.getOption("lint");return!!t&&(!0===t?t={}:_.isObject(t)&&(t=l.extend({},t)),t.options||(t.options={}),"javascript"===s.codemirror.mode&&s.jshint&&l.extend(t.options,s.jshint),"css"===s.codemirror.mode&&s.csslint&&l.extend(t.options,s.csslint),"htmlmixed"===s.codemirror.mode&&s.htmlhint&&(t.options.rules=l.extend({},s.htmlhint),s.jshint&&(t.options.rules.jshint=s.jshint),s.csslint&&(t.options.rules.csslint=s.csslint)),t.onUpdateLinting=(i=t.onUpdateLinting,function(t,n,e){var o=_.filter(t,function(t){return"error"===t.severity});i&&i.apply(t,n,e),_.isEqual(o,a)||(a=o,s.onChangeLintingErrors&&s.onChangeLintingErrors(o,t,n,e),(!r.state.focused||0===a.length||0' ) + .after( self.button ); + + /* + * The input wrapper now contains the label+input+Clear/Default button. + * Store a reference to the input wrapper: we'll use this to toggle + * the controls visibility. + */ + self.inputWrapper = el.closest( '.wp-picker-input-wrap' ); + + el.iris( { + target: self.pickerContainer, + hide: self.options.hide, + width: self.options.width, + mode: self.options.mode, + palettes: self.options.palettes, + /** + * Handles the onChange event if one has been defined in the options and additionally + * sets the background color for the toggler element. + * + * @since 3.5.0 + * + * @ignore + * + * @param {Event} event The event that's being called. + * @param {HTMLElement} ui The HTMLElement containing the color picker. + * + * @return {void} + */ + change: function( event, ui ) { + self.toggler.css( { backgroundColor: ui.color.toString() } ); + + if ( $.isFunction( self.options.change ) ) { + self.options.change.call( this, event, ui ); + } + } + } ); + + el.val( self.initialValue ); + self._addListeners(); + + // Force the color picker to always be closed on initial load. + if ( ! self.options.hide ) { + self.toggler.click(); + } + }, + /** + * Binds event listeners to the color picker. + * + * @since 3.5.0 + * @access private + * + * @return {void} + */ + _addListeners: function() { + var self = this; + + /** + * Prevent any clicks inside this widget from leaking to the top and closing it. + * + * @since 3.5.0 + * + * @param {Event} event The event that's being called. + * + * @return {void} + */ + self.wrap.on( 'click.wpcolorpicker', function( event ) { + event.stopPropagation(); + }); + + /** + * Open or close the color picker depending on the class. + * + * @since 3.5.0 + */ + self.toggler.click( function(){ + if ( self.toggler.hasClass( 'wp-picker-open' ) ) { + self.close(); + } else { + self.open(); + } + }); + + /** + * Checks if value is empty when changing the color in the color picker. + * If so, the background color is cleared. + * + * @since 3.5.0 + * + * @param {Event} event The event that's being called. + * + * @return {void} + */ + self.element.change( function( event ) { + var me = $( this ), + val = me.val(); + + if ( val === '' || val === '#' ) { + self.toggler.css( 'backgroundColor', '' ); + // Fire clear callback if we have one. + if ( $.isFunction( self.options.clear ) ) { + self.options.clear.call( this, event ); + } + } + }); + + /** + * Enables the user to either clear the color in the color picker or revert back to the default color. + * + * @since 3.5.0 + * + * @param {Event} event The event that's being called. + * + * @return {void} + */ + self.button.click( function( event ) { + var me = $( this ); + if ( me.hasClass( 'wp-picker-clear' ) ) { + self.element.val( '' ); + self.toggler.css( 'backgroundColor', '' ); + if ( $.isFunction( self.options.clear ) ) { + self.options.clear.call( this, event ); + } + } else if ( me.hasClass( 'wp-picker-default' ) ) { + self.element.val( self.options.defaultColor ).change(); + } + }); + }, + /** + * Opens the color picker dialog. + * + * @since 3.5.0 + * + * @return {void} + */ + open: function() { + this.element.iris( 'toggle' ); + this.inputWrapper.removeClass( 'hidden' ); + this.wrap.addClass( 'wp-picker-active' ); + this.toggler + .addClass( 'wp-picker-open' ) + .attr( 'aria-expanded', 'true' ); + $( 'body' ).trigger( 'click.wpcolorpicker' ).on( 'click.wpcolorpicker', this.close ); + }, + /** + * Closes the color picker dialog. + * + * @since 3.5.0 + * + * @return {void} + */ + close: function() { + this.element.iris( 'toggle' ); + this.inputWrapper.addClass( 'hidden' ); + this.wrap.removeClass( 'wp-picker-active' ); + this.toggler + .removeClass( 'wp-picker-open' ) + .attr( 'aria-expanded', 'false' ); + $( 'body' ).off( 'click.wpcolorpicker', this.close ); + }, + /** + * Returns the iris object if no new color is provided. If a new color is provided, it sets the new color. + * + * @param newColor {string|*} The new color to use. Can be undefined. + * + * @since 3.5.0 + * + * @return {string} The element's color. + */ + color: function( newColor ) { + if ( newColor === undef ) { + return this.element.iris( 'option', 'color' ); + } + this.element.iris( 'option', 'color', newColor ); + }, + /** + * Returns the iris object if no new default color is provided. + * If a new default color is provided, it sets the new default color. + * + * @param newDefaultColor {string|*} The new default color to use. Can be undefined. + * + * @since 3.5.0 + * + * @return {boolean|string} The element's color. + */ + defaultColor: function( newDefaultColor ) { + if ( newDefaultColor === undef ) { + return this.options.defaultColor; + } + + this.options.defaultColor = newDefaultColor; + } + }; + + // Register the color picker as a widget. + $.widget( 'wp.wpColorPicker', ColorPicker ); +}( jQuery ) ); diff --git a/wp-admin/js/color-picker.min.js b/wp-admin/js/color-picker.min.js new file mode 100644 index 0000000..3f690c6 --- /dev/null +++ b/wp-admin/js/color-picker.min.js @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +!function(i,t){var e;e={options:{defaultColor:!1,change:!1,clear:!1,hide:!0,palettes:!0,width:255,mode:"hsv",type:"full",slider:"horizontal"},_createHueOnly:function(){var e,o=this,t=o.element;t.hide(),e="hsl("+t.val()+", 100, 50)",t.iris({mode:"hsl",type:"hue",hide:!1,color:e,change:function(e,t){i.isFunction(o.options.change)&&o.options.change.call(this,e,t)},width:o.options.width,slider:o.options.slider})},_create:function(){if(i.support.iris){var o=this,e=o.element;if(i.extend(o.options,e.data()),"hue"===o.options.type)return o._createHueOnly();o.close=i.proxy(o.close,o),o.initialValue=e.val(),e.addClass("wp-color-picker"),e.parent("label").length||(e.wrap(""),o.wrappingLabelText=i('').insertBefore(e).text(wpColorPickerL10n.defaultLabel)),o.wrappingLabel=e.parent(),o.wrappingLabel.wrap('
        '),o.wrap=o.wrappingLabel.parent(),o.toggler=i('').insertBefore(o.wrappingLabel).css({backgroundColor:o.initialValue}),o.toggler.find(".wp-color-result-text").text(wpColorPickerL10n.pick),o.pickerContainer=i('
        ').insertAfter(o.wrappingLabel),o.button=i(''),o.options.defaultColor?o.button.addClass("wp-picker-default").val(wpColorPickerL10n.defaultString).attr("aria-label",wpColorPickerL10n.defaultAriaLabel):o.button.addClass("wp-picker-clear").val(wpColorPickerL10n.clear).attr("aria-label",wpColorPickerL10n.clearAriaLabel),o.wrappingLabel.wrap('
        ').insertAfter("#wpcontent").hide().on("click.wp-responsive",function(){C.find(".menupop.hover").removeClass("hover"),V(this).hide()})),x.on("click.wp-responsive",function(){k.show()})},disableOverlay:function(){x.off("click.wp-responsive"),k.hide()},disableSortables:function(){if(y.length)try{y.sortable("disable"),y.find(".ui-sortable-handle").addClass("is-non-sortable")}catch(e){}},enableSortables:function(){if(y.length)try{y.sortable("enable"),y.find(".ui-sortable-handle").removeClass("is-non-sortable")}catch(e){}}},V(document).ajaxComplete(function(){L()}),B.on("wp-window-resized.set-menu-state",Q),B.on("wp-menu-state-set wp-collapse-menu",function(e,t){var n=V("#collapse-button"),i="true",o=commonL10n.collapseMenu;"folded"===t.state&&(i="false",o=commonL10n.expandMenu),n.attr({"aria-expanded":i,"aria-label":o})}),q.wpResponsive.init(),W(),Q(),O(),K(),L(),B.on("wp-pin-menu wp-window-resized.pin-menu postboxes-columnchange.pin-menu postbox-toggled.pin-menu wp-collapse-menu.pin-menu wp-scroll-start.pin-menu",W),V(".wp-initial-focus").focus(),G.on("click",".js-update-details-toggle",function(){var e=V(this).closest(".js-update-details"),t=V("#"+e.data("update-details"));t.hasClass("update-details-moved")||t.insertAfter(e).addClass("update-details-moved"),t.toggle(),V(this).attr("aria-expanded",t.is(":visible"))})}),H.on("resize.wp-fire-once",function(){q.clearTimeout(e),e=q.setTimeout(i,200)}),function(){if("-ms-user-select"in document.documentElement.style&&navigator.userAgent.match(/IEMobile\/10\.0/)){var e=document.createElement("style");e.appendChild(document.createTextNode("@-ms-viewport{width:auto!important}")),document.getElementsByTagName("head")[0].appendChild(e)}}()}(jQuery,window); \ No newline at end of file diff --git a/wp-admin/js/custom-background.js b/wp-admin/js/custom-background.js new file mode 100644 index 0000000..346ae9c --- /dev/null +++ b/wp-admin/js/custom-background.js @@ -0,0 +1,145 @@ +/** + * @output wp-admin/js/custom-background.js + */ + +/* global ajaxurl */ + +/** + * Registers all events for customizing the background. + * + * @since 3.0.0 + * + * @requires jQuery + */ +(function($) { + $(document).ready(function() { + var frame, + bgImage = $( '#custom-background-image' ); + + /** + * Instantiates the WordPress color picker and binds the change and clear events. + * + * @since 3.5.0 + * + * @return {void} + */ + $('#background-color').wpColorPicker({ + change: function( event, ui ) { + bgImage.css('background-color', ui.color.toString()); + }, + clear: function() { + bgImage.css('background-color', ''); + } + }); + + /** + * Alters the background size CSS property whenever the background size input has changed. + * + * @since 4.7.0 + * + * @return {void} + */ + $( 'select[name="background-size"]' ).change( function() { + bgImage.css( 'background-size', $( this ).val() ); + }); + + /** + * Alters the background position CSS property whenever the background position input has changed. + * + * @since 4.7.0 + * + * @return {void} + */ + $( 'input[name="background-position"]' ).change( function() { + bgImage.css( 'background-position', $( this ).val() ); + }); + + /** + * Alters the background repeat CSS property whenever the background repeat input has changed. + * + * @since 3.0.0 + * + * @return {void} + */ + $( 'input[name="background-repeat"]' ).change( function() { + bgImage.css( 'background-repeat', $( this ).is( ':checked' ) ? 'repeat' : 'no-repeat' ); + }); + + /** + * Alters the background attachment CSS property whenever the background attachment input has changed. + * + * @since 4.7.0 + * + * @return {void} + */ + $( 'input[name="background-attachment"]' ).change( function() { + bgImage.css( 'background-attachment', $( this ).is( ':checked' ) ? 'scroll' : 'fixed' ); + }); + + /** + * Binds the event for opening the WP Media dialog. + * + * @since 3.5.0 + * + * @return {void} + */ + $('#choose-from-library-link').click( function( event ) { + var $el = $(this); + + event.preventDefault(); + + // If the media frame already exists, reopen it. + if ( frame ) { + frame.open(); + return; + } + + // Create the media frame. + frame = wp.media.frames.customBackground = wp.media({ + // Set the title of the modal. + title: $el.data('choose'), + + // Tell the modal to show only images. + library: { + type: 'image' + }, + + // Customize the submit button. + button: { + // Set the text of the button. + text: $el.data('update'), + /* + * Tell the button not to close the modal, since we're + * going to refresh the page when the image is selected. + */ + close: false + } + }); + + /** + * When an image is selected, run a callback. + * + * @since 3.5.0 + * + * @return {void} + */ + frame.on( 'select', function() { + // Grab the selected attachment. + var attachment = frame.state().get('selection').first(); + + // Run an AJAX request to set the background image. + $.post( ajaxurl, { + action: 'set-background-image', + attachment_id: attachment.id, + size: 'full' + }).done( function() { + // When the request completes, reload the window. + window.location.reload(); + }); + }); + + // Finally, open the modal. + frame.open(); + }); + }); +})(jQuery); diff --git a/wp-admin/js/custom-background.min.js b/wp-admin/js/custom-background.min.js new file mode 100644 index 0000000..467e682 --- /dev/null +++ b/wp-admin/js/custom-background.min.js @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +!function(e){e(document).ready(function(){var o,t=e("#custom-background-image");e("#background-color").wpColorPicker({change:function(n,c){t.css("background-color",c.color.toString())},clear:function(){t.css("background-color","")}}),e('select[name="background-size"]').change(function(){t.css("background-size",e(this).val())}),e('input[name="background-position"]').change(function(){t.css("background-position",e(this).val())}),e('input[name="background-repeat"]').change(function(){t.css("background-repeat",e(this).is(":checked")?"repeat":"no-repeat")}),e('input[name="background-attachment"]').change(function(){t.css("background-attachment",e(this).is(":checked")?"scroll":"fixed")}),e("#choose-from-library-link").click(function(n){var c=e(this);n.preventDefault(),o||(o=wp.media.frames.customBackground=wp.media({title:c.data("choose"),library:{type:"image"},button:{text:c.data("update"),close:!1}})).on("select",function(){var n=o.state().get("selection").first();e.post(ajaxurl,{action:"set-background-image",attachment_id:n.id,size:"full"}).done(function(){window.location.reload()})}),o.open()})})}(jQuery); \ No newline at end of file diff --git a/wp-admin/js/custom-header.js b/wp-admin/js/custom-header.js new file mode 100644 index 0000000..b1414a4 --- /dev/null +++ b/wp-admin/js/custom-header.js @@ -0,0 +1,88 @@ +/** + * @output wp-admin/js/custom-header.js + */ + +/* global isRtl */ + +/** + * Initializes the custom header selection page. + * + * @since 3.5.0 + * + * @deprecated 4.1.0 The page this is used on is never linked to from the UI. + * Setting a custom header is completely handled by the Customizer. + */ +(function($) { + var frame; + + $( function() { + // Fetch available headers. + var $headers = $('.available-headers'); + + // Apply jQuery.masonry once the images have loaded. + $headers.imagesLoaded( function() { + $headers.masonry({ + itemSelector: '.default-header', + isRTL: !! ( 'undefined' != typeof isRtl && isRtl ) + }); + }); + + /** + * Opens the 'choose from library' frame and creates it if it doesn't exist. + * + * @since 3.5.0 + * @deprecated 4.1.0 + * + * @return {void} + */ + $('#choose-from-library-link').click( function( event ) { + var $el = $(this); + event.preventDefault(); + + // If the media frame already exists, reopen it. + if ( frame ) { + frame.open(); + return; + } + + // Create the media frame. + frame = wp.media.frames.customHeader = wp.media({ + // Set the title of the modal. + title: $el.data('choose'), + + // Tell the modal to show only images. + library: { + type: 'image' + }, + + // Customize the submit button. + button: { + // Set the text of the button. + text: $el.data('update'), + // Tell the button not to close the modal, since we're + // going to refresh the page when the image is selected. + close: false + } + }); + + /** + * Updates the window location to include the selected attachment. + * + * @since 3.5.0 + * @deprecated 4.1.0 + * + * @return {void} + */ + frame.on( 'select', function() { + // Grab the selected attachment. + var attachment = frame.state().get('selection').first(), + link = $el.data('updateLink'); + + // Tell the browser to navigate to the crop step. + window.location = link + '&file=' + attachment.id; + }); + + frame.open(); + }); + }); +}(jQuery)); diff --git a/wp-admin/js/customize-controls.js b/wp-admin/js/customize-controls.js new file mode 100644 index 0000000..8b8c1fd --- /dev/null +++ b/wp-admin/js/customize-controls.js @@ -0,0 +1,9292 @@ +/** + * @output wp-admin/js/customize-controls.js + */ + +/* global _wpCustomizeHeader, _wpCustomizeBackground, _wpMediaViewsL10n, MediaElementPlayer, console, confirm */ +(function( exports, $ ){ + var Container, focus, normalizedTransitionendEventName, api = wp.customize; + + api.OverlayNotification = api.Notification.extend(/** @lends wp.customize.OverlayNotification.prototype */{ + + /** + * Whether the notification should show a loading spinner. + * + * @since 4.9.0 + * @var {boolean} + */ + loading: false, + + /** + * A notification that is displayed in a full-screen overlay. + * + * @constructs wp.customize.OverlayNotification + * @augments wp.customize.Notification + * + * @since 4.9.0 + * + * @param {string} code - Code. + * @param {object} params - Params. + */ + initialize: function( code, params ) { + var notification = this; + api.Notification.prototype.initialize.call( notification, code, params ); + notification.containerClasses += ' notification-overlay'; + if ( notification.loading ) { + notification.containerClasses += ' notification-loading'; + } + }, + + /** + * Render notification. + * + * @since 4.9.0 + * + * @return {jQuery} Notification container. + */ + render: function() { + var li = api.Notification.prototype.render.call( this ); + li.on( 'keydown', _.bind( this.handleEscape, this ) ); + return li; + }, + + /** + * Stop propagation on escape key presses, but also dismiss notification if it is dismissible. + * + * @since 4.9.0 + * + * @param {jQuery.Event} event - Event. + * @return {void} + */ + handleEscape: function( event ) { + var notification = this; + if ( 27 === event.which ) { + event.stopPropagation(); + if ( notification.dismissible && notification.parent ) { + notification.parent.remove( notification.code ); + } + } + } + }); + + api.Notifications = api.Values.extend(/** @lends wp.customize.Notifications.prototype */{ + + /** + * Whether the alternative style should be used. + * + * @since 4.9.0 + * @type {boolean} + */ + alt: false, + + /** + * The default constructor for items of the collection. + * + * @since 4.9.0 + * @type {object} + */ + defaultConstructor: api.Notification, + + /** + * A collection of observable notifications. + * + * @since 4.9.0 + * + * @constructs wp.customize.Notifications + * @augments wp.customize.Values + * + * @param {object} options - Options. + * @param {jQuery} [options.container] - Container element for notifications. This can be injected later. + * @param {boolean} [options.alt] - Whether alternative style should be used when rendering notifications. + * + * @return {void} + */ + initialize: function( options ) { + var collection = this; + + api.Values.prototype.initialize.call( collection, options ); + + _.bindAll( collection, 'constrainFocus' ); + + // Keep track of the order in which the notifications were added for sorting purposes. + collection._addedIncrement = 0; + collection._addedOrder = {}; + + // Trigger change event when notification is added or removed. + collection.bind( 'add', function( notification ) { + collection.trigger( 'change', notification ); + }); + collection.bind( 'removed', function( notification ) { + collection.trigger( 'change', notification ); + }); + }, + + /** + * Get the number of notifications added. + * + * @since 4.9.0 + * @return {number} Count of notifications. + */ + count: function() { + return _.size( this._value ); + }, + + /** + * Add notification to the collection. + * + * @since 4.9.0 + * + * @param {string|wp.customize.Notification} notification - Notification object to add. Alternatively code may be supplied, and in that case the second notificationObject argument must be supplied. + * @param {wp.customize.Notification} [notificationObject] - Notification to add when first argument is the code string. + * @return {wp.customize.Notification} Added notification (or existing instance if it was already added). + */ + add: function( notification, notificationObject ) { + var collection = this, code, instance; + if ( 'string' === typeof notification ) { + code = notification; + instance = notificationObject; + } else { + code = notification.code; + instance = notification; + } + if ( ! collection.has( code ) ) { + collection._addedIncrement += 1; + collection._addedOrder[ code ] = collection._addedIncrement; + } + return api.Values.prototype.add.call( collection, code, instance ); + }, + + /** + * Add notification to the collection. + * + * @since 4.9.0 + * @param {string} code - Notification code to remove. + * @return {api.Notification} Added instance (or existing instance if it was already added). + */ + remove: function( code ) { + var collection = this; + delete collection._addedOrder[ code ]; + return api.Values.prototype.remove.call( this, code ); + }, + + /** + * Get list of notifications. + * + * Notifications may be sorted by type followed by added time. + * + * @since 4.9.0 + * @param {object} args - Args. + * @param {boolean} [args.sort=false] - Whether to return the notifications sorted. + * @return {Array.} Notifications. + */ + get: function( args ) { + var collection = this, notifications, errorTypePriorities, params; + notifications = _.values( collection._value ); + + params = _.extend( + { sort: false }, + args + ); + + if ( params.sort ) { + errorTypePriorities = { error: 4, warning: 3, success: 2, info: 1 }; + notifications.sort( function( a, b ) { + var aPriority = 0, bPriority = 0; + if ( ! _.isUndefined( errorTypePriorities[ a.type ] ) ) { + aPriority = errorTypePriorities[ a.type ]; + } + if ( ! _.isUndefined( errorTypePriorities[ b.type ] ) ) { + bPriority = errorTypePriorities[ b.type ]; + } + if ( aPriority !== bPriority ) { + return bPriority - aPriority; // Show errors first. + } + return collection._addedOrder[ b.code ] - collection._addedOrder[ a.code ]; // Show newer notifications higher. + }); + } + + return notifications; + }, + + /** + * Render notifications area. + * + * @since 4.9.0 + * @return {void} + */ + render: function() { + var collection = this, + notifications, hadOverlayNotification = false, hasOverlayNotification, overlayNotifications = [], + previousNotificationsByCode = {}, + listElement, focusableElements; + + // Short-circuit if there are no container to render into. + if ( ! collection.container || ! collection.container.length ) { + return; + } + + notifications = collection.get( { sort: true } ); + collection.container.toggle( 0 !== notifications.length ); + + // Short-circuit if there are no changes to the notifications. + if ( collection.container.is( collection.previousContainer ) && _.isEqual( notifications, collection.previousNotifications ) ) { + return; + } + + // Make sure list is part of the container. + listElement = collection.container.children( 'ul' ).first(); + if ( ! listElement.length ) { + listElement = $( '
          ' ); + collection.container.append( listElement ); + } + + // Remove all notifications prior to re-rendering. + listElement.find( '> [data-code]' ).remove(); + + _.each( collection.previousNotifications, function( notification ) { + previousNotificationsByCode[ notification.code ] = notification; + }); + + // Add all notifications in the sorted order. + _.each( notifications, function( notification ) { + var notificationContainer; + if ( wp.a11y && ( ! previousNotificationsByCode[ notification.code ] || ! _.isEqual( notification.message, previousNotificationsByCode[ notification.code ].message ) ) ) { + wp.a11y.speak( notification.message, 'assertive' ); + } + notificationContainer = $( notification.render() ); + notification.container = notificationContainer; + listElement.append( notificationContainer ); // @todo Consider slideDown() as enhancement. + + if ( notification.extended( api.OverlayNotification ) ) { + overlayNotifications.push( notification ); + } + }); + hasOverlayNotification = Boolean( overlayNotifications.length ); + + if ( collection.previousNotifications ) { + hadOverlayNotification = Boolean( _.find( collection.previousNotifications, function( notification ) { + return notification.extended( api.OverlayNotification ); + } ) ); + } + + if ( hasOverlayNotification !== hadOverlayNotification ) { + $( document.body ).toggleClass( 'customize-loading', hasOverlayNotification ); + collection.container.toggleClass( 'has-overlay-notifications', hasOverlayNotification ); + if ( hasOverlayNotification ) { + collection.previousActiveElement = document.activeElement; + $( document ).on( 'keydown', collection.constrainFocus ); + } else { + $( document ).off( 'keydown', collection.constrainFocus ); + } + } + + if ( hasOverlayNotification ) { + collection.focusContainer = overlayNotifications[ overlayNotifications.length - 1 ].container; + collection.focusContainer.prop( 'tabIndex', -1 ); + focusableElements = collection.focusContainer.find( ':focusable' ); + if ( focusableElements.length ) { + focusableElements.first().focus(); + } else { + collection.focusContainer.focus(); + } + } else if ( collection.previousActiveElement ) { + $( collection.previousActiveElement ).focus(); + collection.previousActiveElement = null; + } + + collection.previousNotifications = notifications; + collection.previousContainer = collection.container; + collection.trigger( 'rendered' ); + }, + + /** + * Constrain focus on focus container. + * + * @since 4.9.0 + * + * @param {jQuery.Event} event - Event. + * @return {void} + */ + constrainFocus: function constrainFocus( event ) { + var collection = this, focusableElements; + + // Prevent keys from escaping. + event.stopPropagation(); + + if ( 9 !== event.which ) { // Tab key. + return; + } + + focusableElements = collection.focusContainer.find( ':focusable' ); + if ( 0 === focusableElements.length ) { + focusableElements = collection.focusContainer; + } + + if ( ! $.contains( collection.focusContainer[0], event.target ) || ! $.contains( collection.focusContainer[0], document.activeElement ) ) { + event.preventDefault(); + focusableElements.first().focus(); + } else if ( focusableElements.last().is( event.target ) && ! event.shiftKey ) { + event.preventDefault(); + focusableElements.first().focus(); + } else if ( focusableElements.first().is( event.target ) && event.shiftKey ) { + event.preventDefault(); + focusableElements.last().focus(); + } + } + }); + + api.Setting = api.Value.extend(/** @lends wp.customize.Setting.prototype */{ + + /** + * Default params. + * + * @since 4.9.0 + * @var {object} + */ + defaults: { + transport: 'refresh', + dirty: false + }, + + /** + * A Customizer Setting. + * + * A setting is WordPress data (theme mod, option, menu, etc.) that the user can + * draft changes to in the Customizer. + * + * @see PHP class WP_Customize_Setting. + * + * @constructs wp.customize.Setting + * @augments wp.customize.Value + * + * @since 3.4.0 + * + * @param {string} id - The setting ID. + * @param {*} value - The initial value of the setting. + * @param {object} [options={}] - Options. + * @param {string} [options.transport=refresh] - The transport to use for previewing. Supports 'refresh' and 'postMessage'. + * @param {boolean} [options.dirty=false] - Whether the setting should be considered initially dirty. + * @param {object} [options.previewer] - The Previewer instance to sync with. Defaults to wp.customize.previewer. + */ + initialize: function( id, value, options ) { + var setting = this, params; + params = _.extend( + { previewer: api.previewer }, + setting.defaults, + options || {} + ); + + api.Value.prototype.initialize.call( setting, value, params ); + + setting.id = id; + setting._dirty = params.dirty; // The _dirty property is what the Customizer reads from. + setting.notifications = new api.Notifications(); + + // Whenever the setting's value changes, refresh the preview. + setting.bind( setting.preview ); + }, + + /** + * Refresh the preview, respective of the setting's refresh policy. + * + * If the preview hasn't sent a keep-alive message and is likely + * disconnected by having navigated to a non-allowed URL, then the + * refresh transport will be forced when postMessage is the transport. + * Note that postMessage does not throw an error when the recipient window + * fails to match the origin window, so using try/catch around the + * previewer.send() call to then fallback to refresh will not work. + * + * @since 3.4.0 + * @access public + * + * @return {void} + */ + preview: function() { + var setting = this, transport; + transport = setting.transport; + + if ( 'postMessage' === transport && ! api.state( 'previewerAlive' ).get() ) { + transport = 'refresh'; + } + + if ( 'postMessage' === transport ) { + setting.previewer.send( 'setting', [ setting.id, setting() ] ); + } else if ( 'refresh' === transport ) { + setting.previewer.refresh(); + } + }, + + /** + * Find controls associated with this setting. + * + * @since 4.6.0 + * @return {wp.customize.Control[]} Controls associated with setting. + */ + findControls: function() { + var setting = this, controls = []; + api.control.each( function( control ) { + _.each( control.settings, function( controlSetting ) { + if ( controlSetting.id === setting.id ) { + controls.push( control ); + } + } ); + } ); + return controls; + } + }); + + /** + * Current change count. + * + * @alias wp.customize._latestRevision + * + * @since 4.7.0 + * @type {number} + * @protected + */ + api._latestRevision = 0; + + /** + * Last revision that was saved. + * + * @alias wp.customize._lastSavedRevision + * + * @since 4.7.0 + * @type {number} + * @protected + */ + api._lastSavedRevision = 0; + + /** + * Latest revisions associated with the updated setting. + * + * @alias wp.customize._latestSettingRevisions + * + * @since 4.7.0 + * @type {object} + * @protected + */ + api._latestSettingRevisions = {}; + + /* + * Keep track of the revision associated with each updated setting so that + * requestChangesetUpdate knows which dirty settings to include. Also, once + * ready is triggered and all initial settings have been added, increment + * revision for each newly-created initially-dirty setting so that it will + * also be included in changeset update requests. + */ + api.bind( 'change', function incrementChangedSettingRevision( setting ) { + api._latestRevision += 1; + api._latestSettingRevisions[ setting.id ] = api._latestRevision; + } ); + api.bind( 'ready', function() { + api.bind( 'add', function incrementCreatedSettingRevision( setting ) { + if ( setting._dirty ) { + api._latestRevision += 1; + api._latestSettingRevisions[ setting.id ] = api._latestRevision; + } + } ); + } ); + + /** + * Get the dirty setting values. + * + * @alias wp.customize.dirtyValues + * + * @since 4.7.0 + * @access public + * + * @param {object} [options] Options. + * @param {boolean} [options.unsaved=false] Whether only values not saved yet into a changeset will be returned (differential changes). + * @return {object} Dirty setting values. + */ + api.dirtyValues = function dirtyValues( options ) { + var values = {}; + api.each( function( setting ) { + var settingRevision; + + if ( ! setting._dirty ) { + return; + } + + settingRevision = api._latestSettingRevisions[ setting.id ]; + + // Skip including settings that have already been included in the changeset, if only requesting unsaved. + if ( api.state( 'changesetStatus' ).get() && ( options && options.unsaved ) && ( _.isUndefined( settingRevision ) || settingRevision <= api._lastSavedRevision ) ) { + return; + } + + values[ setting.id ] = setting.get(); + } ); + return values; + }; + + /** + * Request updates to the changeset. + * + * @alias wp.customize.requestChangesetUpdate + * + * @since 4.7.0 + * @access public + * + * @param {object} [changes] - Mapping of setting IDs to setting params each normally including a value property, or mapping to null. + * If not provided, then the changes will still be obtained from unsaved dirty settings. + * @param {object} [args] - Additional options for the save request. + * @param {boolean} [args.autosave=false] - Whether changes will be stored in autosave revision if the changeset has been promoted from an auto-draft. + * @param {boolean} [args.force=false] - Send request to update even when there are no changes to submit. This can be used to request the latest status of the changeset on the server. + * @param {string} [args.title] - Title to update in the changeset. Optional. + * @param {string} [args.date] - Date to update in the changeset. Optional. + * @return {jQuery.Promise} Promise resolving with the response data. + */ + api.requestChangesetUpdate = function requestChangesetUpdate( changes, args ) { + var deferred, request, submittedChanges = {}, data, submittedArgs; + deferred = new $.Deferred(); + + // Prevent attempting changeset update while request is being made. + if ( 0 !== api.state( 'processing' ).get() ) { + deferred.reject( 'already_processing' ); + return deferred.promise(); + } + + submittedArgs = _.extend( { + title: null, + date: null, + autosave: false, + force: false + }, args ); + + if ( changes ) { + _.extend( submittedChanges, changes ); + } + + // Ensure all revised settings (changes pending save) are also included, but not if marked for deletion in changes. + _.each( api.dirtyValues( { unsaved: true } ), function( dirtyValue, settingId ) { + if ( ! changes || null !== changes[ settingId ] ) { + submittedChanges[ settingId ] = _.extend( + {}, + submittedChanges[ settingId ] || {}, + { value: dirtyValue } + ); + } + } ); + + // Allow plugins to attach additional params to the settings. + api.trigger( 'changeset-save', submittedChanges, submittedArgs ); + + // Short-circuit when there are no pending changes. + if ( ! submittedArgs.force && _.isEmpty( submittedChanges ) && null === submittedArgs.title && null === submittedArgs.date ) { + deferred.resolve( {} ); + return deferred.promise(); + } + + // A status would cause a revision to be made, and for this wp.customize.previewer.save() should be used. + // Status is also disallowed for revisions regardless. + if ( submittedArgs.status ) { + return deferred.reject( { code: 'illegal_status_in_changeset_update' } ).promise(); + } + + // Dates not beung allowed for revisions are is a technical limitation of post revisions. + if ( submittedArgs.date && submittedArgs.autosave ) { + return deferred.reject( { code: 'illegal_autosave_with_date_gmt' } ).promise(); + } + + // Make sure that publishing a changeset waits for all changeset update requests to complete. + api.state( 'processing' ).set( api.state( 'processing' ).get() + 1 ); + deferred.always( function() { + api.state( 'processing' ).set( api.state( 'processing' ).get() - 1 ); + } ); + + // Ensure that if any plugins add data to save requests by extending query() that they get included here. + data = api.previewer.query( { excludeCustomizedSaved: true } ); + delete data.customized; // Being sent in customize_changeset_data instead. + _.extend( data, { + nonce: api.settings.nonce.save, + customize_theme: api.settings.theme.stylesheet, + customize_changeset_data: JSON.stringify( submittedChanges ) + } ); + if ( null !== submittedArgs.title ) { + data.customize_changeset_title = submittedArgs.title; + } + if ( null !== submittedArgs.date ) { + data.customize_changeset_date = submittedArgs.date; + } + if ( false !== submittedArgs.autosave ) { + data.customize_changeset_autosave = 'true'; + } + + // Allow plugins to modify the params included with the save request. + api.trigger( 'save-request-params', data ); + + request = wp.ajax.post( 'customize_save', data ); + + request.done( function requestChangesetUpdateDone( data ) { + var savedChangesetValues = {}; + + // Ensure that all settings updated subsequently will be included in the next changeset update request. + api._lastSavedRevision = Math.max( api._latestRevision, api._lastSavedRevision ); + + api.state( 'changesetStatus' ).set( data.changeset_status ); + + if ( data.changeset_date ) { + api.state( 'changesetDate' ).set( data.changeset_date ); + } + + deferred.resolve( data ); + api.trigger( 'changeset-saved', data ); + + if ( data.setting_validities ) { + _.each( data.setting_validities, function( validity, settingId ) { + if ( true === validity && _.isObject( submittedChanges[ settingId ] ) && ! _.isUndefined( submittedChanges[ settingId ].value ) ) { + savedChangesetValues[ settingId ] = submittedChanges[ settingId ].value; + } + } ); + } + + api.previewer.send( 'changeset-saved', _.extend( {}, data, { saved_changeset_values: savedChangesetValues } ) ); + } ); + request.fail( function requestChangesetUpdateFail( data ) { + deferred.reject( data ); + api.trigger( 'changeset-error', data ); + } ); + request.always( function( data ) { + if ( data.setting_validities ) { + api._handleSettingValidities( { + settingValidities: data.setting_validities + } ); + } + } ); + + return deferred.promise(); + }; + + /** + * Watch all changes to Value properties, and bubble changes to parent Values instance + * + * @alias wp.customize.utils.bubbleChildValueChanges + * + * @since 4.1.0 + * + * @param {wp.customize.Class} instance + * @param {Array} properties The names of the Value instances to watch. + */ + api.utils.bubbleChildValueChanges = function ( instance, properties ) { + $.each( properties, function ( i, key ) { + instance[ key ].bind( function ( to, from ) { + if ( instance.parent && to !== from ) { + instance.parent.trigger( 'change', instance ); + } + } ); + } ); + }; + + /** + * Expand a panel, section, or control and focus on the first focusable element. + * + * @alias wp.customize~focus + * + * @since 4.1.0 + * + * @param {Object} [params] + * @param {Function} [params.completeCallback] + */ + focus = function ( params ) { + var construct, completeCallback, focus, focusElement; + construct = this; + params = params || {}; + focus = function () { + var focusContainer; + if ( ( construct.extended( api.Panel ) || construct.extended( api.Section ) ) && construct.expanded && construct.expanded() ) { + focusContainer = construct.contentContainer; + } else { + focusContainer = construct.container; + } + + focusElement = focusContainer.find( '.control-focus:first' ); + if ( 0 === focusElement.length ) { + // Note that we can't use :focusable due to a jQuery UI issue. See: https://github.com/jquery/jquery-ui/pull/1583 + focusElement = focusContainer.find( 'input, select, textarea, button, object, a[href], [tabindex]' ).filter( ':visible' ).first(); + } + focusElement.focus(); + }; + if ( params.completeCallback ) { + completeCallback = params.completeCallback; + params.completeCallback = function () { + focus(); + completeCallback(); + }; + } else { + params.completeCallback = focus; + } + + api.state( 'paneVisible' ).set( true ); + if ( construct.expand ) { + construct.expand( params ); + } else { + params.completeCallback(); + } + }; + + /** + * Stable sort for Panels, Sections, and Controls. + * + * If a.priority() === b.priority(), then sort by their respective params.instanceNumber. + * + * @alias wp.customize.utils.prioritySort + * + * @since 4.1.0 + * + * @param {(wp.customize.Panel|wp.customize.Section|wp.customize.Control)} a + * @param {(wp.customize.Panel|wp.customize.Section|wp.customize.Control)} b + * @return {Number} + */ + api.utils.prioritySort = function ( a, b ) { + if ( a.priority() === b.priority() && typeof a.params.instanceNumber === 'number' && typeof b.params.instanceNumber === 'number' ) { + return a.params.instanceNumber - b.params.instanceNumber; + } else { + return a.priority() - b.priority(); + } + }; + + /** + * Return whether the supplied Event object is for a keydown event but not the Enter key. + * + * @alias wp.customize.utils.isKeydownButNotEnterEvent + * + * @since 4.1.0 + * + * @param {jQuery.Event} event + * @return {boolean} + */ + api.utils.isKeydownButNotEnterEvent = function ( event ) { + return ( 'keydown' === event.type && 13 !== event.which ); + }; + + /** + * Return whether the two lists of elements are the same and are in the same order. + * + * @alias wp.customize.utils.areElementListsEqual + * + * @since 4.1.0 + * + * @param {Array|jQuery} listA + * @param {Array|jQuery} listB + * @return {boolean} + */ + api.utils.areElementListsEqual = function ( listA, listB ) { + var equal = ( + listA.length === listB.length && // If lists are different lengths, then naturally they are not equal. + -1 === _.indexOf( _.map( // Are there any false values in the list returned by map? + _.zip( listA, listB ), // Pair up each element between the two lists. + function ( pair ) { + return $( pair[0] ).is( pair[1] ); // Compare to see if each pair is equal. + } + ), false ) // Check for presence of false in map's return value. + ); + return equal; + }; + + /** + * Highlight the existence of a button. + * + * This function reminds the user of a button represented by the specified + * UI element, after an optional delay. If the user focuses the element + * before the delay passes, the reminder is canceled. + * + * @alias wp.customize.utils.highlightButton + * + * @since 4.9.0 + * + * @param {jQuery} button - The element to highlight. + * @param {object} [options] - Options. + * @param {number} [options.delay=0] - Delay in milliseconds. + * @param {jQuery} [options.focusTarget] - A target for user focus that defaults to the highlighted element. + * If the user focuses the target before the delay passes, the reminder + * is canceled. This option exists to accommodate compound buttons + * containing auxiliary UI, such as the Publish button augmented with a + * Settings button. + * @return {Function} An idempotent function that cancels the reminder. + */ + api.utils.highlightButton = function highlightButton( button, options ) { + var animationClass = 'button-see-me', + canceled = false, + params; + + params = _.extend( + { + delay: 0, + focusTarget: button + }, + options + ); + + function cancelReminder() { + canceled = true; + } + + params.focusTarget.on( 'focusin', cancelReminder ); + setTimeout( function() { + params.focusTarget.off( 'focusin', cancelReminder ); + + if ( ! canceled ) { + button.addClass( animationClass ); + button.one( 'animationend', function() { + /* + * Remove animation class to avoid situations in Customizer where + * DOM nodes are moved (re-inserted) and the animation repeats. + */ + button.removeClass( animationClass ); + } ); + } + }, params.delay ); + + return cancelReminder; + }; + + /** + * Get current timestamp adjusted for server clock time. + * + * Same functionality as the `current_time( 'mysql', false )` function in PHP. + * + * @alias wp.customize.utils.getCurrentTimestamp + * + * @since 4.9.0 + * + * @return {int} Current timestamp. + */ + api.utils.getCurrentTimestamp = function getCurrentTimestamp() { + var currentDate, currentClientTimestamp, timestampDifferential; + currentClientTimestamp = _.now(); + currentDate = new Date( api.settings.initialServerDate.replace( /-/g, '/' ) ); + timestampDifferential = currentClientTimestamp - api.settings.initialClientTimestamp; + timestampDifferential += api.settings.initialClientTimestamp - api.settings.initialServerTimestamp; + currentDate.setTime( currentDate.getTime() + timestampDifferential ); + return currentDate.getTime(); + }; + + /** + * Get remaining time of when the date is set. + * + * @alias wp.customize.utils.getRemainingTime + * + * @since 4.9.0 + * + * @param {string|int|Date} datetime - Date time or timestamp of the future date. + * @return {int} remainingTime - Remaining time in milliseconds. + */ + api.utils.getRemainingTime = function getRemainingTime( datetime ) { + var millisecondsDivider = 1000, remainingTime, timestamp; + if ( datetime instanceof Date ) { + timestamp = datetime.getTime(); + } else if ( 'string' === typeof datetime ) { + timestamp = ( new Date( datetime.replace( /-/g, '/' ) ) ).getTime(); + } else { + timestamp = datetime; + } + + remainingTime = timestamp - api.utils.getCurrentTimestamp(); + remainingTime = Math.ceil( remainingTime / millisecondsDivider ); + return remainingTime; + }; + + /** + * Return browser supported `transitionend` event name. + * + * @since 4.7.0 + * + * @ignore + * + * @return {string|null} Normalized `transitionend` event name or null if CSS transitions are not supported. + */ + normalizedTransitionendEventName = (function () { + var el, transitions, prop; + el = document.createElement( 'div' ); + transitions = { + 'transition' : 'transitionend', + 'OTransition' : 'oTransitionEnd', + 'MozTransition' : 'transitionend', + 'WebkitTransition': 'webkitTransitionEnd' + }; + prop = _.find( _.keys( transitions ), function( prop ) { + return ! _.isUndefined( el.style[ prop ] ); + } ); + if ( prop ) { + return transitions[ prop ]; + } else { + return null; + } + })(); + + Container = api.Class.extend(/** @lends wp.customize~Container.prototype */{ + defaultActiveArguments: { duration: 'fast', completeCallback: $.noop }, + defaultExpandedArguments: { duration: 'fast', completeCallback: $.noop }, + containerType: 'container', + defaults: { + title: '', + description: '', + priority: 100, + type: 'default', + content: null, + active: true, + instanceNumber: null + }, + + /** + * Base class for Panel and Section. + * + * @constructs wp.customize~Container + * @augments wp.customize.Class + * + * @since 4.1.0 + * + * @borrows wp.customize~focus as focus + * + * @param {string} id - The ID for the container. + * @param {object} options - Object containing one property: params. + * @param {string} options.title - Title shown when panel is collapsed and expanded. + * @param {string} [options.description] - Description shown at the top of the panel. + * @param {number} [options.priority=100] - The sort priority for the panel. + * @param {string} [options.templateId] - Template selector for container. + * @param {string} [options.type=default] - The type of the panel. See wp.customize.panelConstructor. + * @param {string} [options.content] - The markup to be used for the panel container. If empty, a JS template is used. + * @param {boolean} [options.active=true] - Whether the panel is active or not. + * @param {object} [options.params] - Deprecated wrapper for the above properties. + */ + initialize: function ( id, options ) { + var container = this; + container.id = id; + + if ( ! Container.instanceCounter ) { + Container.instanceCounter = 0; + } + Container.instanceCounter++; + + $.extend( container, { + params: _.defaults( + options.params || options, // Passing the params is deprecated. + container.defaults + ) + } ); + if ( ! container.params.instanceNumber ) { + container.params.instanceNumber = Container.instanceCounter; + } + container.notifications = new api.Notifications(); + container.templateSelector = container.params.templateId || 'customize-' + container.containerType + '-' + container.params.type; + container.container = $( container.params.content ); + if ( 0 === container.container.length ) { + container.container = $( container.getContainer() ); + } + container.headContainer = container.container; + container.contentContainer = container.getContent(); + container.container = container.container.add( container.contentContainer ); + + container.deferred = { + embedded: new $.Deferred() + }; + container.priority = new api.Value(); + container.active = new api.Value(); + container.activeArgumentsQueue = []; + container.expanded = new api.Value(); + container.expandedArgumentsQueue = []; + + container.active.bind( function ( active ) { + var args = container.activeArgumentsQueue.shift(); + args = $.extend( {}, container.defaultActiveArguments, args ); + active = ( active && container.isContextuallyActive() ); + container.onChangeActive( active, args ); + }); + container.expanded.bind( function ( expanded ) { + var args = container.expandedArgumentsQueue.shift(); + args = $.extend( {}, container.defaultExpandedArguments, args ); + container.onChangeExpanded( expanded, args ); + }); + + container.deferred.embedded.done( function () { + container.setupNotifications(); + container.attachEvents(); + }); + + api.utils.bubbleChildValueChanges( container, [ 'priority', 'active' ] ); + + container.priority.set( container.params.priority ); + container.active.set( container.params.active ); + container.expanded.set( false ); + }, + + /** + * Get the element that will contain the notifications. + * + * @since 4.9.0 + * @return {jQuery} Notification container element. + */ + getNotificationsContainerElement: function() { + var container = this; + return container.contentContainer.find( '.customize-control-notifications-container:first' ); + }, + + /** + * Set up notifications. + * + * @since 4.9.0 + * @return {void} + */ + setupNotifications: function() { + var container = this, renderNotifications; + container.notifications.container = container.getNotificationsContainerElement(); + + // Render notifications when they change and when the construct is expanded. + renderNotifications = function() { + if ( container.expanded.get() ) { + container.notifications.render(); + } + }; + container.expanded.bind( renderNotifications ); + renderNotifications(); + container.notifications.bind( 'change', _.debounce( renderNotifications ) ); + }, + + /** + * @since 4.1.0 + * + * @abstract + */ + ready: function() {}, + + /** + * Get the child models associated with this parent, sorting them by their priority Value. + * + * @since 4.1.0 + * + * @param {String} parentType + * @param {String} childType + * @return {Array} + */ + _children: function ( parentType, childType ) { + var parent = this, + children = []; + api[ childType ].each( function ( child ) { + if ( child[ parentType ].get() === parent.id ) { + children.push( child ); + } + } ); + children.sort( api.utils.prioritySort ); + return children; + }, + + /** + * To override by subclass, to return whether the container has active children. + * + * @since 4.1.0 + * + * @abstract + */ + isContextuallyActive: function () { + throw new Error( 'Container.isContextuallyActive() must be overridden in a subclass.' ); + }, + + /** + * Active state change handler. + * + * Shows the container if it is active, hides it if not. + * + * To override by subclass, update the container's UI to reflect the provided active state. + * + * @since 4.1.0 + * + * @param {boolean} active - The active state to transiution to. + * @param {Object} [args] - Args. + * @param {Object} [args.duration] - The duration for the slideUp/slideDown animation. + * @param {boolean} [args.unchanged] - Whether the state is already known to not be changed, and so short-circuit with calling completeCallback early. + * @param {Function} [args.completeCallback] - Function to call when the slideUp/slideDown has completed. + */ + onChangeActive: function( active, args ) { + var construct = this, + headContainer = construct.headContainer, + duration, expandedOtherPanel; + + if ( args.unchanged ) { + if ( args.completeCallback ) { + args.completeCallback(); + } + return; + } + + duration = ( 'resolved' === api.previewer.deferred.active.state() ? args.duration : 0 ); + + if ( construct.extended( api.Panel ) ) { + // If this is a panel is not currently expanded but another panel is expanded, do not animate. + api.panel.each(function ( panel ) { + if ( panel !== construct && panel.expanded() ) { + expandedOtherPanel = panel; + duration = 0; + } + }); + + // Collapse any expanded sections inside of this panel first before deactivating. + if ( ! active ) { + _.each( construct.sections(), function( section ) { + section.collapse( { duration: 0 } ); + } ); + } + } + + if ( ! $.contains( document, headContainer.get( 0 ) ) ) { + // If the element is not in the DOM, then jQuery.fn.slideUp() does nothing. + // In this case, a hard toggle is required instead. + headContainer.toggle( active ); + if ( args.completeCallback ) { + args.completeCallback(); + } + } else if ( active ) { + headContainer.slideDown( duration, args.completeCallback ); + } else { + if ( construct.expanded() ) { + construct.collapse({ + duration: duration, + completeCallback: function() { + headContainer.slideUp( duration, args.completeCallback ); + } + }); + } else { + headContainer.slideUp( duration, args.completeCallback ); + } + } + }, + + /** + * @since 4.1.0 + * + * @param {Boolean} active + * @param {Object} [params] + * @return {Boolean} False if state already applied. + */ + _toggleActive: function ( active, params ) { + var self = this; + params = params || {}; + if ( ( active && this.active.get() ) || ( ! active && ! this.active.get() ) ) { + params.unchanged = true; + self.onChangeActive( self.active.get(), params ); + return false; + } else { + params.unchanged = false; + this.activeArgumentsQueue.push( params ); + this.active.set( active ); + return true; + } + }, + + /** + * @param {Object} [params] + * @return {Boolean} False if already active. + */ + activate: function ( params ) { + return this._toggleActive( true, params ); + }, + + /** + * @param {Object} [params] + * @return {Boolean} False if already inactive. + */ + deactivate: function ( params ) { + return this._toggleActive( false, params ); + }, + + /** + * To override by subclass, update the container's UI to reflect the provided active state. + * @abstract + */ + onChangeExpanded: function () { + throw new Error( 'Must override with subclass.' ); + }, + + /** + * Handle the toggle logic for expand/collapse. + * + * @param {Boolean} expanded - The new state to apply. + * @param {Object} [params] - Object containing options for expand/collapse. + * @param {Function} [params.completeCallback] - Function to call when expansion/collapse is complete. + * @return {Boolean} False if state already applied or active state is false. + */ + _toggleExpanded: function( expanded, params ) { + var instance = this, previousCompleteCallback; + params = params || {}; + previousCompleteCallback = params.completeCallback; + + // Short-circuit expand() if the instance is not active. + if ( expanded && ! instance.active() ) { + return false; + } + + api.state( 'paneVisible' ).set( true ); + params.completeCallback = function() { + if ( previousCompleteCallback ) { + previousCompleteCallback.apply( instance, arguments ); + } + if ( expanded ) { + instance.container.trigger( 'expanded' ); + } else { + instance.container.trigger( 'collapsed' ); + } + }; + if ( ( expanded && instance.expanded.get() ) || ( ! expanded && ! instance.expanded.get() ) ) { + params.unchanged = true; + instance.onChangeExpanded( instance.expanded.get(), params ); + return false; + } else { + params.unchanged = false; + instance.expandedArgumentsQueue.push( params ); + instance.expanded.set( expanded ); + return true; + } + }, + + /** + * @param {Object} [params] + * @return {Boolean} False if already expanded or if inactive. + */ + expand: function ( params ) { + return this._toggleExpanded( true, params ); + }, + + /** + * @param {Object} [params] + * @return {Boolean} False if already collapsed. + */ + collapse: function ( params ) { + return this._toggleExpanded( false, params ); + }, + + /** + * Animate container state change if transitions are supported by the browser. + * + * @since 4.7.0 + * @private + * + * @param {function} completeCallback Function to be called after transition is completed. + * @return {void} + */ + _animateChangeExpanded: function( completeCallback ) { + // Return if CSS transitions are not supported. + if ( ! normalizedTransitionendEventName ) { + if ( completeCallback ) { + completeCallback(); + } + return; + } + + var construct = this, + content = construct.contentContainer, + overlay = content.closest( '.wp-full-overlay' ), + elements, transitionEndCallback, transitionParentPane; + + // Determine set of elements that are affected by the animation. + elements = overlay.add( content ); + + if ( ! construct.panel || '' === construct.panel() ) { + transitionParentPane = true; + } else if ( api.panel( construct.panel() ).contentContainer.hasClass( 'skip-transition' ) ) { + transitionParentPane = true; + } else { + transitionParentPane = false; + } + if ( transitionParentPane ) { + elements = elements.add( '#customize-info, .customize-pane-parent' ); + } + + // Handle `transitionEnd` event. + transitionEndCallback = function( e ) { + if ( 2 !== e.eventPhase || ! $( e.target ).is( content ) ) { + return; + } + content.off( normalizedTransitionendEventName, transitionEndCallback ); + elements.removeClass( 'busy' ); + if ( completeCallback ) { + completeCallback(); + } + }; + content.on( normalizedTransitionendEventName, transitionEndCallback ); + elements.addClass( 'busy' ); + + // Prevent screen flicker when pane has been scrolled before expanding. + _.defer( function() { + var container = content.closest( '.wp-full-overlay-sidebar-content' ), + currentScrollTop = container.scrollTop(), + previousScrollTop = content.data( 'previous-scrollTop' ) || 0, + expanded = construct.expanded(); + + if ( expanded && 0 < currentScrollTop ) { + content.css( 'top', currentScrollTop + 'px' ); + content.data( 'previous-scrollTop', currentScrollTop ); + } else if ( ! expanded && 0 < currentScrollTop + previousScrollTop ) { + content.css( 'top', previousScrollTop - currentScrollTop + 'px' ); + container.scrollTop( previousScrollTop ); + } + } ); + }, + + /* + * is documented using @borrows in the constructor. + */ + focus: focus, + + /** + * Return the container html, generated from its JS template, if it exists. + * + * @since 4.3.0 + */ + getContainer: function () { + var template, + container = this; + + if ( 0 !== $( '#tmpl-' + container.templateSelector ).length ) { + template = wp.template( container.templateSelector ); + } else { + template = wp.template( 'customize-' + container.containerType + '-default' ); + } + if ( template && container.container ) { + return $.trim( template( _.extend( + { id: container.id }, + container.params + ) ) ); + } + + return '
        • '; + }, + + /** + * Find content element which is displayed when the section is expanded. + * + * After a construct is initialized, the return value will be available via the `contentContainer` property. + * By default the element will be related it to the parent container with `aria-owns` and detached. + * Custom panels and sections (such as the `NewMenuSection`) that do not have a sliding pane should + * just return the content element without needing to add the `aria-owns` element or detach it from + * the container. Such non-sliding pane custom sections also need to override the `onChangeExpanded` + * method to handle animating the panel/section into and out of view. + * + * @since 4.7.0 + * @access public + * + * @return {jQuery} Detached content element. + */ + getContent: function() { + var construct = this, + container = construct.container, + content = container.find( '.accordion-section-content, .control-panel-content' ).first(), + contentId = 'sub-' + container.attr( 'id' ), + ownedElements = contentId, + alreadyOwnedElements = container.attr( 'aria-owns' ); + + if ( alreadyOwnedElements ) { + ownedElements = ownedElements + ' ' + alreadyOwnedElements; + } + container.attr( 'aria-owns', ownedElements ); + + return content.detach().attr( { + 'id': contentId, + 'class': 'customize-pane-child ' + content.attr( 'class' ) + ' ' + container.attr( 'class' ) + } ); + } + }); + + api.Section = Container.extend(/** @lends wp.customize.Section.prototype */{ + containerType: 'section', + containerParent: '#customize-theme-controls', + containerPaneParent: '.customize-pane-parent', + defaults: { + title: '', + description: '', + priority: 100, + type: 'default', + content: null, + active: true, + instanceNumber: null, + panel: null, + customizeAction: '' + }, + + /** + * @constructs wp.customize.Section + * @augments wp.customize~Container + * + * @since 4.1.0 + * + * @param {string} id - The ID for the section. + * @param {object} options - Options. + * @param {string} options.title - Title shown when section is collapsed and expanded. + * @param {string} [options.description] - Description shown at the top of the section. + * @param {number} [options.priority=100] - The sort priority for the section. + * @param {string} [options.type=default] - The type of the section. See wp.customize.sectionConstructor. + * @param {string} [options.content] - The markup to be used for the section container. If empty, a JS template is used. + * @param {boolean} [options.active=true] - Whether the section is active or not. + * @param {string} options.panel - The ID for the panel this section is associated with. + * @param {string} [options.customizeAction] - Additional context information shown before the section title when expanded. + * @param {object} [options.params] - Deprecated wrapper for the above properties. + */ + initialize: function ( id, options ) { + var section = this, params; + params = options.params || options; + + // Look up the type if one was not supplied. + if ( ! params.type ) { + _.find( api.sectionConstructor, function( Constructor, type ) { + if ( Constructor === section.constructor ) { + params.type = type; + return true; + } + return false; + } ); + } + + Container.prototype.initialize.call( section, id, params ); + + section.id = id; + section.panel = new api.Value(); + section.panel.bind( function ( id ) { + $( section.headContainer ).toggleClass( 'control-subsection', !! id ); + }); + section.panel.set( section.params.panel || '' ); + api.utils.bubbleChildValueChanges( section, [ 'panel' ] ); + + section.embed(); + section.deferred.embedded.done( function () { + section.ready(); + }); + }, + + /** + * Embed the container in the DOM when any parent panel is ready. + * + * @since 4.1.0 + */ + embed: function () { + var inject, + section = this; + + section.containerParent = api.ensure( section.containerParent ); + + // Watch for changes to the panel state. + inject = function ( panelId ) { + var parentContainer; + if ( panelId ) { + // The panel has been supplied, so wait until the panel object is registered. + api.panel( panelId, function ( panel ) { + // The panel has been registered, wait for it to become ready/initialized. + panel.deferred.embedded.done( function () { + parentContainer = panel.contentContainer; + if ( ! section.headContainer.parent().is( parentContainer ) ) { + parentContainer.append( section.headContainer ); + } + if ( ! section.contentContainer.parent().is( section.headContainer ) ) { + section.containerParent.append( section.contentContainer ); + } + section.deferred.embedded.resolve(); + }); + } ); + } else { + // There is no panel, so embed the section in the root of the customizer. + parentContainer = api.ensure( section.containerPaneParent ); + if ( ! section.headContainer.parent().is( parentContainer ) ) { + parentContainer.append( section.headContainer ); + } + if ( ! section.contentContainer.parent().is( section.headContainer ) ) { + section.containerParent.append( section.contentContainer ); + } + section.deferred.embedded.resolve(); + } + }; + section.panel.bind( inject ); + inject( section.panel.get() ); // Since a section may never get a panel, assume that it won't ever get one. + }, + + /** + * Add behaviors for the accordion section. + * + * @since 4.1.0 + */ + attachEvents: function () { + var meta, content, section = this; + + if ( section.container.hasClass( 'cannot-expand' ) ) { + return; + } + + // Expand/Collapse accordion sections on click. + section.container.find( '.accordion-section-title, .customize-section-back' ).on( 'click keydown', function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + event.preventDefault(); // Keep this AFTER the key filter above. + + if ( section.expanded() ) { + section.collapse(); + } else { + section.expand(); + } + }); + + // This is very similar to what is found for api.Panel.attachEvents(). + section.container.find( '.customize-section-title .customize-help-toggle' ).on( 'click', function() { + + meta = section.container.find( '.section-meta' ); + if ( meta.hasClass( 'cannot-expand' ) ) { + return; + } + content = meta.find( '.customize-section-description:first' ); + content.toggleClass( 'open' ); + content.slideToggle( section.defaultExpandedArguments.duration, function() { + content.trigger( 'toggled' ); + } ); + $( this ).attr( 'aria-expanded', function( i, attr ) { + return 'true' === attr ? 'false' : 'true'; + }); + }); + }, + + /** + * Return whether this section has any active controls. + * + * @since 4.1.0 + * + * @return {Boolean} + */ + isContextuallyActive: function () { + var section = this, + controls = section.controls(), + activeCount = 0; + _( controls ).each( function ( control ) { + if ( control.active() ) { + activeCount += 1; + } + } ); + return ( activeCount !== 0 ); + }, + + /** + * Get the controls that are associated with this section, sorted by their priority Value. + * + * @since 4.1.0 + * + * @return {Array} + */ + controls: function () { + return this._children( 'section', 'control' ); + }, + + /** + * Update UI to reflect expanded state. + * + * @since 4.1.0 + * + * @param {Boolean} expanded + * @param {Object} args + */ + onChangeExpanded: function ( expanded, args ) { + var section = this, + container = section.headContainer.closest( '.wp-full-overlay-sidebar-content' ), + content = section.contentContainer, + overlay = section.headContainer.closest( '.wp-full-overlay' ), + backBtn = content.find( '.customize-section-back' ), + sectionTitle = section.headContainer.find( '.accordion-section-title' ).first(), + expand, panel; + + if ( expanded && ! content.hasClass( 'open' ) ) { + + if ( args.unchanged ) { + expand = args.completeCallback; + } else { + expand = $.proxy( function() { + section._animateChangeExpanded( function() { + sectionTitle.attr( 'tabindex', '-1' ); + backBtn.attr( 'tabindex', '0' ); + + backBtn.focus(); + content.css( 'top', '' ); + container.scrollTop( 0 ); + + if ( args.completeCallback ) { + args.completeCallback(); + } + } ); + + content.addClass( 'open' ); + overlay.addClass( 'section-open' ); + api.state( 'expandedSection' ).set( section ); + }, this ); + } + + if ( ! args.allowMultiple ) { + api.section.each( function ( otherSection ) { + if ( otherSection !== section ) { + otherSection.collapse( { duration: args.duration } ); + } + }); + } + + if ( section.panel() ) { + api.panel( section.panel() ).expand({ + duration: args.duration, + completeCallback: expand + }); + } else { + if ( ! args.allowMultiple ) { + api.panel.each( function( panel ) { + panel.collapse(); + }); + } + expand(); + } + + } else if ( ! expanded && content.hasClass( 'open' ) ) { + if ( section.panel() ) { + panel = api.panel( section.panel() ); + if ( panel.contentContainer.hasClass( 'skip-transition' ) ) { + panel.collapse(); + } + } + section._animateChangeExpanded( function() { + backBtn.attr( 'tabindex', '-1' ); + sectionTitle.attr( 'tabindex', '0' ); + + sectionTitle.focus(); + content.css( 'top', '' ); + + if ( args.completeCallback ) { + args.completeCallback(); + } + } ); + + content.removeClass( 'open' ); + overlay.removeClass( 'section-open' ); + if ( section === api.state( 'expandedSection' ).get() ) { + api.state( 'expandedSection' ).set( false ); + } + + } else { + if ( args.completeCallback ) { + args.completeCallback(); + } + } + } + }); + + api.ThemesSection = api.Section.extend(/** @lends wp.customize.ThemesSection.prototype */{ + currentTheme: '', + overlay: '', + template: '', + screenshotQueue: null, + $window: null, + $body: null, + loaded: 0, + loading: false, + fullyLoaded: false, + term: '', + tags: '', + nextTerm: '', + nextTags: '', + filtersHeight: 0, + headerContainer: null, + updateCountDebounced: null, + + /** + * wp.customize.ThemesSection + * + * Custom section for themes that loads themes by category, and also + * handles the theme-details view rendering and navigation. + * + * @constructs wp.customize.ThemesSection + * @augments wp.customize.Section + * + * @since 4.9.0 + * + * @param {string} id - ID. + * @param {object} options - Options. + * @return {void} + */ + initialize: function( id, options ) { + var section = this; + section.headerContainer = $(); + section.$window = $( window ); + section.$body = $( document.body ); + api.Section.prototype.initialize.call( section, id, options ); + section.updateCountDebounced = _.debounce( section.updateCount, 500 ); + }, + + /** + * Embed the section in the DOM when the themes panel is ready. + * + * Insert the section before the themes container. Assume that a themes section is within a panel, but not necessarily the themes panel. + * + * @since 4.9.0 + */ + embed: function() { + var inject, + section = this; + + // Watch for changes to the panel state. + inject = function( panelId ) { + var parentContainer; + api.panel( panelId, function( panel ) { + + // The panel has been registered, wait for it to become ready/initialized. + panel.deferred.embedded.done( function() { + parentContainer = panel.contentContainer; + if ( ! section.headContainer.parent().is( parentContainer ) ) { + parentContainer.find( '.customize-themes-full-container-container' ).before( section.headContainer ); + } + if ( ! section.contentContainer.parent().is( section.headContainer ) ) { + section.containerParent.append( section.contentContainer ); + } + section.deferred.embedded.resolve(); + }); + } ); + }; + section.panel.bind( inject ); + inject( section.panel.get() ); // Since a section may never get a panel, assume that it won't ever get one. + }, + + /** + * Set up. + * + * @since 4.2.0 + * + * @return {void} + */ + ready: function() { + var section = this; + section.overlay = section.container.find( '.theme-overlay' ); + section.template = wp.template( 'customize-themes-details-view' ); + + // Bind global keyboard events. + section.container.on( 'keydown', function( event ) { + if ( ! section.overlay.find( '.theme-wrap' ).is( ':visible' ) ) { + return; + } + + // Pressing the right arrow key fires a theme:next event. + if ( 39 === event.keyCode ) { + section.nextTheme(); + } + + // Pressing the left arrow key fires a theme:previous event. + if ( 37 === event.keyCode ) { + section.previousTheme(); + } + + // Pressing the escape key fires a theme:collapse event. + if ( 27 === event.keyCode ) { + if ( section.$body.hasClass( 'modal-open' ) ) { + + // Escape from the details modal. + section.closeDetails(); + } else { + + // Escape from the inifinite scroll list. + section.headerContainer.find( '.customize-themes-section-title' ).focus(); + } + event.stopPropagation(); // Prevent section from being collapsed. + } + }); + + section.renderScreenshots = _.throttle( section.renderScreenshots, 100 ); + + _.bindAll( section, 'renderScreenshots', 'loadMore', 'checkTerm', 'filtersChecked' ); + }, + + /** + * Override Section.isContextuallyActive method. + * + * Ignore the active states' of the contained theme controls, and just + * use the section's own active state instead. This prevents empty search + * results for theme sections from causing the section to become inactive. + * + * @since 4.2.0 + * + * @return {Boolean} + */ + isContextuallyActive: function () { + return this.active(); + }, + + /** + * Attach events. + * + * @since 4.2.0 + * + * @return {void} + */ + attachEvents: function () { + var section = this, debounced; + + // Expand/Collapse accordion sections on click. + section.container.find( '.customize-section-back' ).on( 'click keydown', function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + event.preventDefault(); // Keep this AFTER the key filter above. + section.collapse(); + }); + + section.headerContainer = $( '#accordion-section-' + section.id ); + + // Expand section/panel. Only collapse when opening another section. + section.headerContainer.on( 'click', '.customize-themes-section-title', function() { + + // Toggle accordion filters under section headers. + if ( section.headerContainer.find( '.filter-details' ).length ) { + section.headerContainer.find( '.customize-themes-section-title' ) + .toggleClass( 'details-open' ) + .attr( 'aria-expanded', function( i, attr ) { + return 'true' === attr ? 'false' : 'true'; + }); + section.headerContainer.find( '.filter-details' ).slideToggle( 180 ); + } + + // Open the section. + if ( ! section.expanded() ) { + section.expand(); + } + }); + + // Preview installed themes. + section.container.on( 'click', '.theme-actions .preview-theme', function() { + api.panel( 'themes' ).loadThemePreview( $( this ).data( 'slug' ) ); + }); + + // Theme navigation in details view. + section.container.on( 'click', '.left', function() { + section.previousTheme(); + }); + + section.container.on( 'click', '.right', function() { + section.nextTheme(); + }); + + section.container.on( 'click', '.theme-backdrop, .close', function() { + section.closeDetails(); + }); + + if ( 'local' === section.params.filter_type ) { + + // Filter-search all theme objects loaded in the section. + section.container.on( 'input', '.wp-filter-search-themes', function( event ) { + section.filterSearch( event.currentTarget.value ); + }); + + } else if ( 'remote' === section.params.filter_type ) { + + // Event listeners for remote queries with user-entered terms. + // Search terms. + debounced = _.debounce( section.checkTerm, 500 ); // Wait until there is no input for 500 milliseconds to initiate a search. + section.contentContainer.on( 'input', '.wp-filter-search', function() { + if ( ! api.panel( 'themes' ).expanded() ) { + return; + } + debounced( section ); + if ( ! section.expanded() ) { + section.expand(); + } + }); + + // Feature filters. + section.contentContainer.on( 'click', '.filter-group input', function() { + section.filtersChecked(); + section.checkTerm( section ); + }); + } + + // Toggle feature filters. + section.contentContainer.on( 'click', '.feature-filter-toggle', function( e ) { + var $themeContainer = $( '.customize-themes-full-container' ), + $filterToggle = $( e.currentTarget ); + section.filtersHeight = $filterToggle.parent().next( '.filter-drawer' ).height(); + + if ( 0 < $themeContainer.scrollTop() ) { + $themeContainer.animate( { scrollTop: 0 }, 400 ); + + if ( $filterToggle.hasClass( 'open' ) ) { + return; + } + } + + $filterToggle + .toggleClass( 'open' ) + .attr( 'aria-expanded', function( i, attr ) { + return 'true' === attr ? 'false' : 'true'; + }) + .parent().next( '.filter-drawer' ).slideToggle( 180, 'linear' ); + + if ( $filterToggle.hasClass( 'open' ) ) { + var marginOffset = 1018 < window.innerWidth ? 50 : 76; + + section.contentContainer.find( '.themes' ).css( 'margin-top', section.filtersHeight + marginOffset ); + } else { + section.contentContainer.find( '.themes' ).css( 'margin-top', 0 ); + } + }); + + // Setup section cross-linking. + section.contentContainer.on( 'click', '.no-themes-local .search-dotorg-themes', function() { + api.section( 'wporg_themes' ).focus(); + }); + + function updateSelectedState() { + var el = section.headerContainer.find( '.customize-themes-section-title' ); + el.toggleClass( 'selected', section.expanded() ); + el.attr( 'aria-expanded', section.expanded() ? 'true' : 'false' ); + if ( ! section.expanded() ) { + el.removeClass( 'details-open' ); + } + } + section.expanded.bind( updateSelectedState ); + updateSelectedState(); + + // Move section controls to the themes area. + api.bind( 'ready', function () { + section.contentContainer = section.container.find( '.customize-themes-section' ); + section.contentContainer.appendTo( $( '.customize-themes-full-container' ) ); + section.container.add( section.headerContainer ); + }); + }, + + /** + * Update UI to reflect expanded state + * + * @since 4.2.0 + * + * @param {Boolean} expanded + * @param {Object} args + * @param {Boolean} args.unchanged + * @param {Function} args.completeCallback + * @return {void} + */ + onChangeExpanded: function ( expanded, args ) { + + // Note: there is a second argument 'args' passed. + var section = this, + container = section.contentContainer.closest( '.customize-themes-full-container' ); + + // Immediately call the complete callback if there were no changes. + if ( args.unchanged ) { + if ( args.completeCallback ) { + args.completeCallback(); + } + return; + } + + function expand() { + + // Try to load controls if none are loaded yet. + if ( 0 === section.loaded ) { + section.loadThemes(); + } + + // Collapse any sibling sections/panels. + api.section.each( function ( otherSection ) { + var searchTerm; + + if ( otherSection !== section ) { + + // Try to sync the current search term to the new section. + if ( 'themes' === otherSection.params.type ) { + searchTerm = otherSection.contentContainer.find( '.wp-filter-search' ).val(); + section.contentContainer.find( '.wp-filter-search' ).val( searchTerm ); + + // Directly initialize an empty remote search to avoid a race condition. + if ( '' === searchTerm && '' !== section.term && 'local' !== section.params.filter_type ) { + section.term = ''; + section.initializeNewQuery( section.term, section.tags ); + } else { + if ( 'remote' === section.params.filter_type ) { + section.checkTerm( section ); + } else if ( 'local' === section.params.filter_type ) { + section.filterSearch( searchTerm ); + } + } + otherSection.collapse( { duration: args.duration } ); + } + } + }); + + section.contentContainer.addClass( 'current-section' ); + container.scrollTop(); + + container.on( 'scroll', _.throttle( section.renderScreenshots, 300 ) ); + container.on( 'scroll', _.throttle( section.loadMore, 300 ) ); + + if ( args.completeCallback ) { + args.completeCallback(); + } + section.updateCount(); // Show this section's count. + } + + if ( expanded ) { + if ( section.panel() && api.panel.has( section.panel() ) ) { + api.panel( section.panel() ).expand({ + duration: args.duration, + completeCallback: expand + }); + } else { + expand(); + } + } else { + section.contentContainer.removeClass( 'current-section' ); + + // Always hide, even if they don't exist or are already hidden. + section.headerContainer.find( '.filter-details' ).slideUp( 180 ); + + container.off( 'scroll' ); + + if ( args.completeCallback ) { + args.completeCallback(); + } + } + }, + + /** + * Return the section's content element without detaching from the parent. + * + * @since 4.9.0 + * + * @return {jQuery} + */ + getContent: function() { + return this.container.find( '.control-section-content' ); + }, + + /** + * Load theme data via Ajax and add themes to the section as controls. + * + * @since 4.9.0 + * + * @return {void} + */ + loadThemes: function() { + var section = this, params, page, request; + + if ( section.loading ) { + return; // We're already loading a batch of themes. + } + + // Parameters for every API query. Additional params are set in PHP. + page = Math.ceil( section.loaded / 100 ) + 1; + params = { + 'nonce': api.settings.nonce.switch_themes, + 'wp_customize': 'on', + 'theme_action': section.params.action, + 'customized_theme': api.settings.theme.stylesheet, + 'page': page + }; + + // Add fields for remote filtering. + if ( 'remote' === section.params.filter_type ) { + params.search = section.term; + params.tags = section.tags; + } + + // Load themes. + section.headContainer.closest( '.wp-full-overlay' ).addClass( 'loading' ); + section.loading = true; + section.container.find( '.no-themes' ).hide(); + request = wp.ajax.post( 'customize_load_themes', params ); + request.done(function( data ) { + var themes = data.themes; + + // Stop and try again if the term changed while loading. + if ( '' !== section.nextTerm || '' !== section.nextTags ) { + if ( section.nextTerm ) { + section.term = section.nextTerm; + } + if ( section.nextTags ) { + section.tags = section.nextTags; + } + section.nextTerm = ''; + section.nextTags = ''; + section.loading = false; + section.loadThemes(); + return; + } + + if ( 0 !== themes.length ) { + + section.loadControls( themes, page ); + + if ( 1 === page ) { + + // Pre-load the first 3 theme screenshots. + _.each( section.controls().slice( 0, 3 ), function( control ) { + var img, src = control.params.theme.screenshot[0]; + if ( src ) { + img = new Image(); + img.src = src; + } + }); + if ( 'local' !== section.params.filter_type ) { + wp.a11y.speak( api.settings.l10n.themeSearchResults.replace( '%d', data.info.results ) ); + } + } + + _.delay( section.renderScreenshots, 100 ); // Wait for the controls to become visible. + + if ( 'local' === section.params.filter_type || 100 > themes.length ) { + // If we have less than the requested 100 themes, it's the end of the list. + section.fullyLoaded = true; + } + } else { + if ( 0 === section.loaded ) { + section.container.find( '.no-themes' ).show(); + wp.a11y.speak( section.container.find( '.no-themes' ).text() ); + } else { + section.fullyLoaded = true; + } + } + if ( 'local' === section.params.filter_type ) { + section.updateCount(); // Count of visible theme controls. + } else { + section.updateCount( data.info.results ); // Total number of results including pages not yet loaded. + } + section.container.find( '.unexpected-error' ).hide(); // Hide error notice in case it was previously shown. + + // This cannot run on request.always, as section.loading may turn false before the new controls load in the success case. + section.headContainer.closest( '.wp-full-overlay' ).removeClass( 'loading' ); + section.loading = false; + }); + request.fail(function( data ) { + if ( 'undefined' === typeof data ) { + section.container.find( '.unexpected-error' ).show(); + wp.a11y.speak( section.container.find( '.unexpected-error' ).text() ); + } else if ( 'undefined' !== typeof console && console.error ) { + console.error( data ); + } + + // This cannot run on request.always, as section.loading may turn false before the new controls load in the success case. + section.headContainer.closest( '.wp-full-overlay' ).removeClass( 'loading' ); + section.loading = false; + }); + }, + + /** + * Loads controls into the section from data received from loadThemes(). + * + * @since 4.9.0 + * @param {Array} themes - Array of theme data to create controls with. + * @param {integer} page - Page of results being loaded. + * @return {void} + */ + loadControls: function( themes, page ) { + var newThemeControls = [], + section = this; + + // Add controls for each theme. + _.each( themes, function( theme ) { + var themeControl = new api.controlConstructor.theme( section.params.action + '_theme_' + theme.id, { + type: 'theme', + section: section.params.id, + theme: theme, + priority: section.loaded + 1 + } ); + + api.control.add( themeControl ); + newThemeControls.push( themeControl ); + section.loaded = section.loaded + 1; + }); + + if ( 1 !== page ) { + Array.prototype.push.apply( section.screenshotQueue, newThemeControls ); // Add new themes to the screenshot queue. + } + }, + + /** + * Determines whether more themes should be loaded, and loads them. + * + * @since 4.9.0 + * @return {void} + */ + loadMore: function() { + var section = this, container, bottom, threshold; + if ( ! section.fullyLoaded && ! section.loading ) { + container = section.container.closest( '.customize-themes-full-container' ); + + bottom = container.scrollTop() + container.height(); + // Use a fixed distance to the bottom of loaded results to avoid unnecessarily + // loading results sooner when using a percentage of scroll distance. + threshold = container.prop( 'scrollHeight' ) - 3000; + + if ( bottom > threshold ) { + section.loadThemes(); + } + } + }, + + /** + * Event handler for search input that filters visible controls. + * + * @since 4.9.0 + * + * @param {string} term - The raw search input value. + * @return {void} + */ + filterSearch: function( term ) { + var count = 0, + visible = false, + section = this, + noFilter = ( api.section.has( 'wporg_themes' ) && 'remote' !== section.params.filter_type ) ? '.no-themes-local' : '.no-themes', + controls = section.controls(), + terms; + + if ( section.loading ) { + return; + } + + // Standardize search term format and split into an array of individual words. + terms = term.toLowerCase().trim().replace( /-/g, ' ' ).split( ' ' ); + + _.each( controls, function( control ) { + visible = control.filter( terms ); // Shows/hides and sorts control based on the applicability of the search term. + if ( visible ) { + count = count + 1; + } + }); + + if ( 0 === count ) { + section.container.find( noFilter ).show(); + wp.a11y.speak( section.container.find( noFilter ).text() ); + } else { + section.container.find( noFilter ).hide(); + } + + section.renderScreenshots(); + api.reflowPaneContents(); + + // Update theme count. + section.updateCountDebounced( count ); + }, + + /** + * Event handler for search input that determines if the terms have changed and loads new controls as needed. + * + * @since 4.9.0 + * + * @param {wp.customize.ThemesSection} section - The current theme section, passed through the debouncer. + * @return {void} + */ + checkTerm: function( section ) { + var newTerm; + if ( 'remote' === section.params.filter_type ) { + newTerm = section.contentContainer.find( '.wp-filter-search' ).val(); + if ( section.term !== newTerm.trim() ) { + section.initializeNewQuery( newTerm, section.tags ); + } + } + }, + + /** + * Check for filters checked in the feature filter list and initialize a new query. + * + * @since 4.9.0 + * + * @return {void} + */ + filtersChecked: function() { + var section = this, + items = section.container.find( '.filter-group' ).find( ':checkbox' ), + tags = []; + + _.each( items.filter( ':checked' ), function( item ) { + tags.push( $( item ).prop( 'value' ) ); + }); + + // When no filters are checked, restore initial state. Update filter count. + if ( 0 === tags.length ) { + tags = ''; + section.contentContainer.find( '.feature-filter-toggle .filter-count-0' ).show(); + section.contentContainer.find( '.feature-filter-toggle .filter-count-filters' ).hide(); + } else { + section.contentContainer.find( '.feature-filter-toggle .theme-filter-count' ).text( tags.length ); + section.contentContainer.find( '.feature-filter-toggle .filter-count-0' ).hide(); + section.contentContainer.find( '.feature-filter-toggle .filter-count-filters' ).show(); + } + + // Check whether tags have changed, and either load or queue them. + if ( ! _.isEqual( section.tags, tags ) ) { + if ( section.loading ) { + section.nextTags = tags; + } else { + if ( 'remote' === section.params.filter_type ) { + section.initializeNewQuery( section.term, tags ); + } else if ( 'local' === section.params.filter_type ) { + section.filterSearch( tags.join( ' ' ) ); + } + } + } + }, + + /** + * Reset the current query and load new results. + * + * @since 4.9.0 + * + * @param {string} newTerm - New term. + * @param {Array} newTags - New tags. + * @return {void} + */ + initializeNewQuery: function( newTerm, newTags ) { + var section = this; + + // Clear the controls in the section. + _.each( section.controls(), function( control ) { + control.container.remove(); + api.control.remove( control.id ); + }); + section.loaded = 0; + section.fullyLoaded = false; + section.screenshotQueue = null; + + // Run a new query, with loadThemes handling paging, etc. + if ( ! section.loading ) { + section.term = newTerm; + section.tags = newTags; + section.loadThemes(); + } else { + section.nextTerm = newTerm; // This will reload from loadThemes() with the newest term once the current batch is loaded. + section.nextTags = newTags; // This will reload from loadThemes() with the newest tags once the current batch is loaded. + } + if ( ! section.expanded() ) { + section.expand(); // Expand the section if it isn't expanded. + } + }, + + /** + * Render control's screenshot if the control comes into view. + * + * @since 4.2.0 + * + * @return {void} + */ + renderScreenshots: function() { + var section = this; + + // Fill queue initially, or check for more if empty. + if ( null === section.screenshotQueue || 0 === section.screenshotQueue.length ) { + + // Add controls that haven't had their screenshots rendered. + section.screenshotQueue = _.filter( section.controls(), function( control ) { + return ! control.screenshotRendered; + }); + } + + // Are all screenshots rendered (for now)? + if ( ! section.screenshotQueue.length ) { + return; + } + + section.screenshotQueue = _.filter( section.screenshotQueue, function( control ) { + var $imageWrapper = control.container.find( '.theme-screenshot' ), + $image = $imageWrapper.find( 'img' ); + + if ( ! $image.length ) { + return false; + } + + if ( $image.is( ':hidden' ) ) { + return true; + } + + // Based on unveil.js. + var wt = section.$window.scrollTop(), + wb = wt + section.$window.height(), + et = $image.offset().top, + ih = $imageWrapper.height(), + eb = et + ih, + threshold = ih * 3, + inView = eb >= wt - threshold && et <= wb + threshold; + + if ( inView ) { + control.container.trigger( 'render-screenshot' ); + } + + // If the image is in view return false so it's cleared from the queue. + return ! inView; + } ); + }, + + /** + * Get visible count. + * + * @since 4.9.0 + * + * @return {int} Visible count. + */ + getVisibleCount: function() { + return this.contentContainer.find( 'li.customize-control:visible' ).length; + }, + + /** + * Update the number of themes in the section. + * + * @since 4.9.0 + * + * @return {void} + */ + updateCount: function( count ) { + var section = this, countEl, displayed; + + if ( ! count && 0 !== count ) { + count = section.getVisibleCount(); + } + + displayed = section.contentContainer.find( '.themes-displayed' ); + countEl = section.contentContainer.find( '.theme-count' ); + + if ( 0 === count ) { + countEl.text( '0' ); + } else { + + // Animate the count change for emphasis. + displayed.fadeOut( 180, function() { + countEl.text( count ); + displayed.fadeIn( 180 ); + } ); + wp.a11y.speak( api.settings.l10n.announceThemeCount.replace( '%d', count ) ); + } + }, + + /** + * Advance the modal to the next theme. + * + * @since 4.2.0 + * + * @return {void} + */ + nextTheme: function () { + var section = this; + if ( section.getNextTheme() ) { + section.showDetails( section.getNextTheme(), function() { + section.overlay.find( '.right' ).focus(); + } ); + } + }, + + /** + * Get the next theme model. + * + * @since 4.2.0 + * + * @return {wp.customize.ThemeControl|boolean} Next theme. + */ + getNextTheme: function () { + var section = this, control, nextControl, sectionControls, i; + control = api.control( section.params.action + '_theme_' + section.currentTheme ); + sectionControls = section.controls(); + i = _.indexOf( sectionControls, control ); + if ( -1 === i ) { + return false; + } + + nextControl = sectionControls[ i + 1 ]; + if ( ! nextControl ) { + return false; + } + return nextControl.params.theme; + }, + + /** + * Advance the modal to the previous theme. + * + * @since 4.2.0 + * @return {void} + */ + previousTheme: function () { + var section = this; + if ( section.getPreviousTheme() ) { + section.showDetails( section.getPreviousTheme(), function() { + section.overlay.find( '.left' ).focus(); + } ); + } + }, + + /** + * Get the previous theme model. + * + * @since 4.2.0 + * @return {wp.customize.ThemeControl|boolean} Previous theme. + */ + getPreviousTheme: function () { + var section = this, control, nextControl, sectionControls, i; + control = api.control( section.params.action + '_theme_' + section.currentTheme ); + sectionControls = section.controls(); + i = _.indexOf( sectionControls, control ); + if ( -1 === i ) { + return false; + } + + nextControl = sectionControls[ i - 1 ]; + if ( ! nextControl ) { + return false; + } + return nextControl.params.theme; + }, + + /** + * Disable buttons when we're viewing the first or last theme. + * + * @since 4.2.0 + * + * @return {void} + */ + updateLimits: function () { + if ( ! this.getNextTheme() ) { + this.overlay.find( '.right' ).addClass( 'disabled' ); + } + if ( ! this.getPreviousTheme() ) { + this.overlay.find( '.left' ).addClass( 'disabled' ); + } + }, + + /** + * Load theme preview. + * + * @since 4.7.0 + * @access public + * + * @deprecated + * @param {string} themeId Theme ID. + * @return {jQuery.promise} Promise. + */ + loadThemePreview: function( themeId ) { + return api.ThemesPanel.prototype.loadThemePreview.call( this, themeId ); + }, + + /** + * Render & show the theme details for a given theme model. + * + * @since 4.2.0 + * + * @param {object} theme - Theme. + * @param {Function} [callback] - Callback once the details have been shown. + * @return {void} + */ + showDetails: function ( theme, callback ) { + var section = this, panel = api.panel( 'themes' ); + section.currentTheme = theme.id; + section.overlay.html( section.template( theme ) ) + .fadeIn( 'fast' ) + .focus(); + + function disableSwitchButtons() { + return ! panel.canSwitchTheme( theme.id ); + } + + // Temporary special function since supplying SFTP credentials does not work yet. See #42184. + function disableInstallButtons() { + return disableSwitchButtons() || false === api.settings.theme._canInstall || true === api.settings.theme._filesystemCredentialsNeeded; + } + + section.overlay.find( 'button.preview, button.preview-theme' ).toggleClass( 'disabled', disableSwitchButtons() ); + section.overlay.find( 'button.theme-install' ).toggleClass( 'disabled', disableInstallButtons() ); + + section.$body.addClass( 'modal-open' ); + section.containFocus( section.overlay ); + section.updateLimits(); + wp.a11y.speak( api.settings.l10n.announceThemeDetails.replace( '%s', theme.name ) ); + if ( callback ) { + callback(); + } + }, + + /** + * Close the theme details modal. + * + * @since 4.2.0 + * + * @return {void} + */ + closeDetails: function () { + var section = this; + section.$body.removeClass( 'modal-open' ); + section.overlay.fadeOut( 'fast' ); + api.control( section.params.action + '_theme_' + section.currentTheme ).container.find( '.theme' ).focus(); + }, + + /** + * Keep tab focus within the theme details modal. + * + * @since 4.2.0 + * + * @param {jQuery} el - Element to contain focus. + * @return {void} + */ + containFocus: function( el ) { + var tabbables; + + el.on( 'keydown', function( event ) { + + // Return if it's not the tab key + // When navigating with prev/next focus is already handled. + if ( 9 !== event.keyCode ) { + return; + } + + // Uses jQuery UI to get the tabbable elements. + tabbables = $( ':tabbable', el ); + + // Keep focus within the overlay. + if ( tabbables.last()[0] === event.target && ! event.shiftKey ) { + tabbables.first().focus(); + return false; + } else if ( tabbables.first()[0] === event.target && event.shiftKey ) { + tabbables.last().focus(); + return false; + } + }); + } + }); + + api.OuterSection = api.Section.extend(/** @lends wp.customize.OuterSection.prototype */{ + + /** + * Class wp.customize.OuterSection. + * + * Creates section outside of the sidebar, there is no ui to trigger collapse/expand so + * it would require custom handling. + * + * @constructs wp.customize.OuterSection + * @augments wp.customize.Section + * + * @since 4.9.0 + * + * @return {void} + */ + initialize: function() { + var section = this; + section.containerParent = '#customize-outer-theme-controls'; + section.containerPaneParent = '.customize-outer-pane-parent'; + api.Section.prototype.initialize.apply( section, arguments ); + }, + + /** + * Overrides api.Section.prototype.onChangeExpanded to prevent collapse/expand effect + * on other sections and panels. + * + * @since 4.9.0 + * + * @param {Boolean} expanded - The expanded state to transition to. + * @param {Object} [args] - Args. + * @param {boolean} [args.unchanged] - Whether the state is already known to not be changed, and so short-circuit with calling completeCallback early. + * @param {Function} [args.completeCallback] - Function to call when the slideUp/slideDown has completed. + * @param {Object} [args.duration] - The duration for the animation. + */ + onChangeExpanded: function( expanded, args ) { + var section = this, + container = section.headContainer.closest( '.wp-full-overlay-sidebar-content' ), + content = section.contentContainer, + backBtn = content.find( '.customize-section-back' ), + sectionTitle = section.headContainer.find( '.accordion-section-title' ).first(), + body = $( document.body ), + expand, panel; + + body.toggleClass( 'outer-section-open', expanded ); + section.container.toggleClass( 'open', expanded ); + section.container.removeClass( 'busy' ); + api.section.each( function( _section ) { + if ( 'outer' === _section.params.type && _section.id !== section.id ) { + _section.container.removeClass( 'open' ); + } + } ); + + if ( expanded && ! content.hasClass( 'open' ) ) { + + if ( args.unchanged ) { + expand = args.completeCallback; + } else { + expand = $.proxy( function() { + section._animateChangeExpanded( function() { + sectionTitle.attr( 'tabindex', '-1' ); + backBtn.attr( 'tabindex', '0' ); + + backBtn.focus(); + content.css( 'top', '' ); + container.scrollTop( 0 ); + + if ( args.completeCallback ) { + args.completeCallback(); + } + } ); + + content.addClass( 'open' ); + }, this ); + } + + if ( section.panel() ) { + api.panel( section.panel() ).expand({ + duration: args.duration, + completeCallback: expand + }); + } else { + expand(); + } + + } else if ( ! expanded && content.hasClass( 'open' ) ) { + if ( section.panel() ) { + panel = api.panel( section.panel() ); + if ( panel.contentContainer.hasClass( 'skip-transition' ) ) { + panel.collapse(); + } + } + section._animateChangeExpanded( function() { + backBtn.attr( 'tabindex', '-1' ); + sectionTitle.attr( 'tabindex', '0' ); + + sectionTitle.focus(); + content.css( 'top', '' ); + + if ( args.completeCallback ) { + args.completeCallback(); + } + } ); + + content.removeClass( 'open' ); + + } else { + if ( args.completeCallback ) { + args.completeCallback(); + } + } + } + }); + + api.Panel = Container.extend(/** @lends wp.customize.Panel.prototype */{ + containerType: 'panel', + + /** + * @constructs wp.customize.Panel + * @augments wp.customize~Container + * + * @since 4.1.0 + * + * @param {string} id - The ID for the panel. + * @param {object} options - Object containing one property: params. + * @param {string} options.title - Title shown when panel is collapsed and expanded. + * @param {string} [options.description] - Description shown at the top of the panel. + * @param {number} [options.priority=100] - The sort priority for the panel. + * @param {string} [options.type=default] - The type of the panel. See wp.customize.panelConstructor. + * @param {string} [options.content] - The markup to be used for the panel container. If empty, a JS template is used. + * @param {boolean} [options.active=true] - Whether the panel is active or not. + * @param {object} [options.params] - Deprecated wrapper for the above properties. + */ + initialize: function ( id, options ) { + var panel = this, params; + params = options.params || options; + + // Look up the type if one was not supplied. + if ( ! params.type ) { + _.find( api.panelConstructor, function( Constructor, type ) { + if ( Constructor === panel.constructor ) { + params.type = type; + return true; + } + return false; + } ); + } + + Container.prototype.initialize.call( panel, id, params ); + + panel.embed(); + panel.deferred.embedded.done( function () { + panel.ready(); + }); + }, + + /** + * Embed the container in the DOM when any parent panel is ready. + * + * @since 4.1.0 + */ + embed: function () { + var panel = this, + container = $( '#customize-theme-controls' ), + parentContainer = $( '.customize-pane-parent' ); // @todo This should be defined elsewhere, and to be configurable. + + if ( ! panel.headContainer.parent().is( parentContainer ) ) { + parentContainer.append( panel.headContainer ); + } + if ( ! panel.contentContainer.parent().is( panel.headContainer ) ) { + container.append( panel.contentContainer ); + } + panel.renderContent(); + + panel.deferred.embedded.resolve(); + }, + + /** + * @since 4.1.0 + */ + attachEvents: function () { + var meta, panel = this; + + // Expand/Collapse accordion sections on click. + panel.headContainer.find( '.accordion-section-title' ).on( 'click keydown', function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + event.preventDefault(); // Keep this AFTER the key filter above. + + if ( ! panel.expanded() ) { + panel.expand(); + } + }); + + // Close panel. + panel.container.find( '.customize-panel-back' ).on( 'click keydown', function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + event.preventDefault(); // Keep this AFTER the key filter above. + + if ( panel.expanded() ) { + panel.collapse(); + } + }); + + meta = panel.container.find( '.panel-meta:first' ); + + meta.find( '> .accordion-section-title .customize-help-toggle' ).on( 'click', function() { + if ( meta.hasClass( 'cannot-expand' ) ) { + return; + } + + var content = meta.find( '.customize-panel-description:first' ); + if ( meta.hasClass( 'open' ) ) { + meta.toggleClass( 'open' ); + content.slideUp( panel.defaultExpandedArguments.duration, function() { + content.trigger( 'toggled' ); + } ); + $( this ).attr( 'aria-expanded', false ); + } else { + content.slideDown( panel.defaultExpandedArguments.duration, function() { + content.trigger( 'toggled' ); + } ); + meta.toggleClass( 'open' ); + $( this ).attr( 'aria-expanded', true ); + } + }); + + }, + + /** + * Get the sections that are associated with this panel, sorted by their priority Value. + * + * @since 4.1.0 + * + * @return {Array} + */ + sections: function () { + return this._children( 'panel', 'section' ); + }, + + /** + * Return whether this panel has any active sections. + * + * @since 4.1.0 + * + * @return {boolean} Whether contextually active. + */ + isContextuallyActive: function () { + var panel = this, + sections = panel.sections(), + activeCount = 0; + _( sections ).each( function ( section ) { + if ( section.active() && section.isContextuallyActive() ) { + activeCount += 1; + } + } ); + return ( activeCount !== 0 ); + }, + + /** + * Update UI to reflect expanded state. + * + * @since 4.1.0 + * + * @param {Boolean} expanded + * @param {Object} args + * @param {Boolean} args.unchanged + * @param {Function} args.completeCallback + * @return {void} + */ + onChangeExpanded: function ( expanded, args ) { + + // Immediately call the complete callback if there were no changes. + if ( args.unchanged ) { + if ( args.completeCallback ) { + args.completeCallback(); + } + return; + } + + // Note: there is a second argument 'args' passed. + var panel = this, + accordionSection = panel.contentContainer, + overlay = accordionSection.closest( '.wp-full-overlay' ), + container = accordionSection.closest( '.wp-full-overlay-sidebar-content' ), + topPanel = panel.headContainer.find( '.accordion-section-title' ), + backBtn = accordionSection.find( '.customize-panel-back' ), + childSections = panel.sections(), + skipTransition; + + if ( expanded && ! accordionSection.hasClass( 'current-panel' ) ) { + // Collapse any sibling sections/panels. + api.section.each( function ( section ) { + if ( panel.id !== section.panel() ) { + section.collapse( { duration: 0 } ); + } + }); + api.panel.each( function ( otherPanel ) { + if ( panel !== otherPanel ) { + otherPanel.collapse( { duration: 0 } ); + } + }); + + if ( panel.params.autoExpandSoleSection && 1 === childSections.length && childSections[0].active.get() ) { + accordionSection.addClass( 'current-panel skip-transition' ); + overlay.addClass( 'in-sub-panel' ); + + childSections[0].expand( { + completeCallback: args.completeCallback + } ); + } else { + panel._animateChangeExpanded( function() { + topPanel.attr( 'tabindex', '-1' ); + backBtn.attr( 'tabindex', '0' ); + + backBtn.focus(); + accordionSection.css( 'top', '' ); + container.scrollTop( 0 ); + + if ( args.completeCallback ) { + args.completeCallback(); + } + } ); + + accordionSection.addClass( 'current-panel' ); + overlay.addClass( 'in-sub-panel' ); + } + + api.state( 'expandedPanel' ).set( panel ); + + } else if ( ! expanded && accordionSection.hasClass( 'current-panel' ) ) { + skipTransition = accordionSection.hasClass( 'skip-transition' ); + if ( ! skipTransition ) { + panel._animateChangeExpanded( function() { + topPanel.attr( 'tabindex', '0' ); + backBtn.attr( 'tabindex', '-1' ); + + topPanel.focus(); + accordionSection.css( 'top', '' ); + + if ( args.completeCallback ) { + args.completeCallback(); + } + } ); + } else { + accordionSection.removeClass( 'skip-transition' ); + } + + overlay.removeClass( 'in-sub-panel' ); + accordionSection.removeClass( 'current-panel' ); + if ( panel === api.state( 'expandedPanel' ).get() ) { + api.state( 'expandedPanel' ).set( false ); + } + } + }, + + /** + * Render the panel from its JS template, if it exists. + * + * The panel's container must already exist in the DOM. + * + * @since 4.3.0 + */ + renderContent: function () { + var template, + panel = this; + + // Add the content to the container. + if ( 0 !== $( '#tmpl-' + panel.templateSelector + '-content' ).length ) { + template = wp.template( panel.templateSelector + '-content' ); + } else { + template = wp.template( 'customize-panel-default-content' ); + } + if ( template && panel.headContainer ) { + panel.contentContainer.html( template( _.extend( + { id: panel.id }, + panel.params + ) ) ); + } + } + }); + + api.ThemesPanel = api.Panel.extend(/** @lends wp.customize.ThemsPanel.prototype */{ + + /** + * Class wp.customize.ThemesPanel. + * + * Custom section for themes that displays without the customize preview. + * + * @constructs wp.customize.ThemesPanel + * @augments wp.customize.Panel + * + * @since 4.9.0 + * + * @param {string} id - The ID for the panel. + * @param {object} options - Options. + * @return {void} + */ + initialize: function( id, options ) { + var panel = this; + panel.installingThemes = []; + api.Panel.prototype.initialize.call( panel, id, options ); + }, + + /** + * Determine whether a given theme can be switched to, or in general. + * + * @since 4.9.0 + * + * @param {string} [slug] - Theme slug. + * @return {boolean} Whether the theme can be switched to. + */ + canSwitchTheme: function canSwitchTheme( slug ) { + if ( slug && slug === api.settings.theme.stylesheet ) { + return true; + } + return 'publish' === api.state( 'selectedChangesetStatus' ).get() && ( '' === api.state( 'changesetStatus' ).get() || 'auto-draft' === api.state( 'changesetStatus' ).get() ); + }, + + /** + * Attach events. + * + * @since 4.9.0 + * @return {void} + */ + attachEvents: function() { + var panel = this; + + // Attach regular panel events. + api.Panel.prototype.attachEvents.apply( panel ); + + // Temporary since supplying SFTP credentials does not work yet. See #42184. + if ( api.settings.theme._canInstall && api.settings.theme._filesystemCredentialsNeeded ) { + panel.notifications.add( new api.Notification( 'theme_install_unavailable', { + message: api.l10n.themeInstallUnavailable, + type: 'info', + dismissible: true + } ) ); + } + + function toggleDisabledNotifications() { + if ( panel.canSwitchTheme() ) { + panel.notifications.remove( 'theme_switch_unavailable' ); + } else { + panel.notifications.add( new api.Notification( 'theme_switch_unavailable', { + message: api.l10n.themePreviewUnavailable, + type: 'warning' + } ) ); + } + } + toggleDisabledNotifications(); + api.state( 'selectedChangesetStatus' ).bind( toggleDisabledNotifications ); + api.state( 'changesetStatus' ).bind( toggleDisabledNotifications ); + + // Collapse panel to customize the current theme. + panel.contentContainer.on( 'click', '.customize-theme', function() { + panel.collapse(); + }); + + // Toggle between filtering and browsing themes on mobile. + panel.contentContainer.on( 'click', '.customize-themes-section-title, .customize-themes-mobile-back', function() { + $( '.wp-full-overlay' ).toggleClass( 'showing-themes' ); + }); + + // Install (and maybe preview) a theme. + panel.contentContainer.on( 'click', '.theme-install', function( event ) { + panel.installTheme( event ); + }); + + // Update a theme. Theme cards have the class, the details modal has the id. + panel.contentContainer.on( 'click', '.update-theme, #update-theme', function( event ) { + + // #update-theme is a link. + event.preventDefault(); + event.stopPropagation(); + + panel.updateTheme( event ); + }); + + // Delete a theme. + panel.contentContainer.on( 'click', '.delete-theme', function( event ) { + panel.deleteTheme( event ); + }); + + _.bindAll( panel, 'installTheme', 'updateTheme' ); + }, + + /** + * Update UI to reflect expanded state + * + * @since 4.9.0 + * + * @param {Boolean} expanded - Expanded state. + * @param {Object} args - Args. + * @param {Boolean} args.unchanged - Whether or not the state changed. + * @param {Function} args.completeCallback - Callback to execute when the animation completes. + * @return {void} + */ + onChangeExpanded: function( expanded, args ) { + var panel = this, overlay, sections, hasExpandedSection = false; + + // Expand/collapse the panel normally. + api.Panel.prototype.onChangeExpanded.apply( this, [ expanded, args ] ); + + // Immediately call the complete callback if there were no changes. + if ( args.unchanged ) { + if ( args.completeCallback ) { + args.completeCallback(); + } + return; + } + + overlay = panel.headContainer.closest( '.wp-full-overlay' ); + + if ( expanded ) { + overlay + .addClass( 'in-themes-panel' ) + .delay( 200 ).find( '.customize-themes-full-container' ).addClass( 'animate' ); + + _.delay( function() { + overlay.addClass( 'themes-panel-expanded' ); + }, 200 ); + + // Automatically open the first section (except on small screens), if one isn't already expanded. + if ( 600 < window.innerWidth ) { + sections = panel.sections(); + _.each( sections, function( section ) { + if ( section.expanded() ) { + hasExpandedSection = true; + } + } ); + if ( ! hasExpandedSection && sections.length > 0 ) { + sections[0].expand(); + } + } + } else { + overlay + .removeClass( 'in-themes-panel themes-panel-expanded' ) + .find( '.customize-themes-full-container' ).removeClass( 'animate' ); + } + }, + + /** + * Install a theme via wp.updates. + * + * @since 4.9.0 + * + * @param {jQuery.Event} event - Event. + * @return {jQuery.promise} Promise. + */ + installTheme: function( event ) { + var panel = this, preview, onInstallSuccess, slug = $( event.target ).data( 'slug' ), deferred = $.Deferred(), request; + preview = $( event.target ).hasClass( 'preview' ); + + // Temporary since supplying SFTP credentials does not work yet. See #42184. + if ( api.settings.theme._filesystemCredentialsNeeded ) { + deferred.reject({ + errorCode: 'theme_install_unavailable' + }); + return deferred.promise(); + } + + // Prevent loading a non-active theme preview when there is a drafted/scheduled changeset. + if ( ! panel.canSwitchTheme( slug ) ) { + deferred.reject({ + errorCode: 'theme_switch_unavailable' + }); + return deferred.promise(); + } + + // Theme is already being installed. + if ( _.contains( panel.installingThemes, slug ) ) { + deferred.reject({ + errorCode: 'theme_already_installing' + }); + return deferred.promise(); + } + + wp.updates.maybeRequestFilesystemCredentials( event ); + + onInstallSuccess = function( response ) { + var theme = false, themeControl; + if ( preview ) { + api.notifications.remove( 'theme_installing' ); + + panel.loadThemePreview( slug ); + + } else { + api.control.each( function( control ) { + if ( 'theme' === control.params.type && control.params.theme.id === response.slug ) { + theme = control.params.theme; // Used below to add theme control. + control.rerenderAsInstalled( true ); + } + }); + + // Don't add the same theme more than once. + if ( ! theme || api.control.has( 'installed_theme_' + theme.id ) ) { + deferred.resolve( response ); + return; + } + + // Add theme control to installed section. + theme.type = 'installed'; + themeControl = new api.controlConstructor.theme( 'installed_theme_' + theme.id, { + type: 'theme', + section: 'installed_themes', + theme: theme, + priority: 0 // Add all newly-installed themes to the top. + } ); + + api.control.add( themeControl ); + api.control( themeControl.id ).container.trigger( 'render-screenshot' ); + + // Close the details modal if it's open to the installed theme. + api.section.each( function( section ) { + if ( 'themes' === section.params.type ) { + if ( theme.id === section.currentTheme ) { // Don't close the modal if the user has navigated elsewhere. + section.closeDetails(); + } + } + }); + } + deferred.resolve( response ); + }; + + panel.installingThemes.push( slug ); // Note: we don't remove elements from installingThemes, since they shouldn't be installed again. + request = wp.updates.installTheme( { + slug: slug + } ); + + // Also preview the theme as the event is triggered on Install & Preview. + if ( preview ) { + api.notifications.add( new api.OverlayNotification( 'theme_installing', { + message: api.l10n.themeDownloading, + type: 'info', + loading: true + } ) ); + } + + request.done( onInstallSuccess ); + request.fail( function() { + api.notifications.remove( 'theme_installing' ); + } ); + + return deferred.promise(); + }, + + /** + * Load theme preview. + * + * @since 4.9.0 + * + * @param {string} themeId Theme ID. + * @return {jQuery.promise} Promise. + */ + loadThemePreview: function( themeId ) { + var panel = this, deferred = $.Deferred(), onceProcessingComplete, urlParser, queryParams; + + // Prevent loading a non-active theme preview when there is a drafted/scheduled changeset. + if ( ! panel.canSwitchTheme( themeId ) ) { + deferred.reject({ + errorCode: 'theme_switch_unavailable' + }); + return deferred.promise(); + } + + urlParser = document.createElement( 'a' ); + urlParser.href = location.href; + queryParams = _.extend( + api.utils.parseQueryString( urlParser.search.substr( 1 ) ), + { + theme: themeId, + changeset_uuid: api.settings.changeset.uuid, + 'return': api.settings.url['return'] + } + ); + + // Include autosaved param to load autosave revision without prompting user to restore it. + if ( ! api.state( 'saved' ).get() ) { + queryParams.customize_autosaved = 'on'; + } + + urlParser.search = $.param( queryParams ); + + // Update loading message. Everything else is handled by reloading the page. + api.notifications.add( new api.OverlayNotification( 'theme_previewing', { + message: api.l10n.themePreviewWait, + type: 'info', + loading: true + } ) ); + + onceProcessingComplete = function() { + var request; + if ( api.state( 'processing' ).get() > 0 ) { + return; + } + + api.state( 'processing' ).unbind( onceProcessingComplete ); + + request = api.requestChangesetUpdate( {}, { autosave: true } ); + request.done( function() { + deferred.resolve(); + $( window ).off( 'beforeunload.customize-confirm' ); + location.replace( urlParser.href ); + } ); + request.fail( function() { + + // @todo Show notification regarding failure. + api.notifications.remove( 'theme_previewing' ); + + deferred.reject(); + } ); + }; + + if ( 0 === api.state( 'processing' ).get() ) { + onceProcessingComplete(); + } else { + api.state( 'processing' ).bind( onceProcessingComplete ); + } + + return deferred.promise(); + }, + + /** + * Update a theme via wp.updates. + * + * @since 4.9.0 + * + * @param {jQuery.Event} event - Event. + * @return {void} + */ + updateTheme: function( event ) { + wp.updates.maybeRequestFilesystemCredentials( event ); + + $( document ).one( 'wp-theme-update-success', function( e, response ) { + + // Rerender the control to reflect the update. + api.control.each( function( control ) { + if ( 'theme' === control.params.type && control.params.theme.id === response.slug ) { + control.params.theme.hasUpdate = false; + control.params.theme.version = response.newVersion; + setTimeout( function() { + control.rerenderAsInstalled( true ); + }, 2000 ); + } + }); + } ); + + wp.updates.updateTheme( { + slug: $( event.target ).closest( '.notice' ).data( 'slug' ) + } ); + }, + + /** + * Delete a theme via wp.updates. + * + * @since 4.9.0 + * + * @param {jQuery.Event} event - Event. + * @return {void} + */ + deleteTheme: function( event ) { + var theme, section; + theme = $( event.target ).data( 'slug' ); + section = api.section( 'installed_themes' ); + + event.preventDefault(); + + // Temporary since supplying SFTP credentials does not work yet. See #42184. + if ( api.settings.theme._filesystemCredentialsNeeded ) { + return; + } + + // Confirmation dialog for deleting a theme. + if ( ! window.confirm( api.settings.l10n.confirmDeleteTheme ) ) { + return; + } + + wp.updates.maybeRequestFilesystemCredentials( event ); + + $( document ).one( 'wp-theme-delete-success', function() { + var control = api.control( 'installed_theme_' + theme ); + + // Remove theme control. + control.container.remove(); + api.control.remove( control.id ); + + // Update installed count. + section.loaded = section.loaded - 1; + section.updateCount(); + + // Rerender any other theme controls as uninstalled. + api.control.each( function( control ) { + if ( 'theme' === control.params.type && control.params.theme.id === theme ) { + control.rerenderAsInstalled( false ); + } + }); + } ); + + wp.updates.deleteTheme( { + slug: theme + } ); + + // Close modal and focus the section. + section.closeDetails(); + section.focus(); + } + }); + + api.Control = api.Class.extend(/** @lends wp.customize.Control.prototype */{ + defaultActiveArguments: { duration: 'fast', completeCallback: $.noop }, + + /** + * Default params. + * + * @since 4.9.0 + * @var {object} + */ + defaults: { + label: '', + description: '', + active: true, + priority: 10 + }, + + /** + * A Customizer Control. + * + * A control provides a UI element that allows a user to modify a Customizer Setting. + * + * @see PHP class WP_Customize_Control. + * + * @constructs wp.customize.Control + * @augments wp.customize.Class + * + * @borrows wp.customize~focus as this#focus + * @borrows wp.customize~Container#activate as this#activate + * @borrows wp.customize~Container#deactivate as this#deactivate + * @borrows wp.customize~Container#_toggleActive as this#_toggleActive + * + * @param {string} id - Unique identifier for the control instance. + * @param {object} options - Options hash for the control instance. + * @param {object} options.type - Type of control (e.g. text, radio, dropdown-pages, etc.) + * @param {string} [options.content] - The HTML content for the control or at least its container. This should normally be left blank and instead supplying a templateId. + * @param {string} [options.templateId] - Template ID for control's content. + * @param {string} [options.priority=10] - Order of priority to show the control within the section. + * @param {string} [options.active=true] - Whether the control is active. + * @param {string} options.section - The ID of the section the control belongs to. + * @param {mixed} [options.setting] - The ID of the main setting or an instance of this setting. + * @param {mixed} options.settings - An object with keys (e.g. default) that maps to setting IDs or Setting/Value objects, or an array of setting IDs or Setting/Value objects. + * @param {mixed} options.settings.default - The ID of the setting the control relates to. + * @param {string} options.settings.data - @todo Is this used? + * @param {string} options.label - Label. + * @param {string} options.description - Description. + * @param {number} [options.instanceNumber] - Order in which this instance was created in relation to other instances. + * @param {object} [options.params] - Deprecated wrapper for the above properties. + * @return {void} + */ + initialize: function( id, options ) { + var control = this, deferredSettingIds = [], settings, gatherSettings; + + control.params = _.extend( + {}, + control.defaults, + control.params || {}, // In case subclass already defines. + options.params || options || {} // The options.params property is deprecated, but it is checked first for back-compat. + ); + + if ( ! api.Control.instanceCounter ) { + api.Control.instanceCounter = 0; + } + api.Control.instanceCounter++; + if ( ! control.params.instanceNumber ) { + control.params.instanceNumber = api.Control.instanceCounter; + } + + // Look up the type if one was not supplied. + if ( ! control.params.type ) { + _.find( api.controlConstructor, function( Constructor, type ) { + if ( Constructor === control.constructor ) { + control.params.type = type; + return true; + } + return false; + } ); + } + + if ( ! control.params.content ) { + control.params.content = $( '
        • ', { + id: 'customize-control-' + id.replace( /]/g, '' ).replace( /\[/g, '-' ), + 'class': 'customize-control customize-control-' + control.params.type + } ); + } + + control.id = id; + control.selector = '#customize-control-' + id.replace( /\]/g, '' ).replace( /\[/g, '-' ); // Deprecated, likely dead code from time before #28709. + if ( control.params.content ) { + control.container = $( control.params.content ); + } else { + control.container = $( control.selector ); // Likely dead, per above. See #28709. + } + + if ( control.params.templateId ) { + control.templateSelector = control.params.templateId; + } else { + control.templateSelector = 'customize-control-' + control.params.type + '-content'; + } + + control.deferred = _.extend( control.deferred || {}, { + embedded: new $.Deferred() + } ); + control.section = new api.Value(); + control.priority = new api.Value(); + control.active = new api.Value(); + control.activeArgumentsQueue = []; + control.notifications = new api.Notifications({ + alt: control.altNotice + }); + + control.elements = []; + + control.active.bind( function ( active ) { + var args = control.activeArgumentsQueue.shift(); + args = $.extend( {}, control.defaultActiveArguments, args ); + control.onChangeActive( active, args ); + } ); + + control.section.set( control.params.section ); + control.priority.set( isNaN( control.params.priority ) ? 10 : control.params.priority ); + control.active.set( control.params.active ); + + api.utils.bubbleChildValueChanges( control, [ 'section', 'priority', 'active' ] ); + + control.settings = {}; + + settings = {}; + if ( control.params.setting ) { + settings['default'] = control.params.setting; + } + _.extend( settings, control.params.settings ); + + // Note: Settings can be an array or an object, with values being either setting IDs or Setting (or Value) objects. + _.each( settings, function( value, key ) { + var setting; + if ( _.isObject( value ) && _.isFunction( value.extended ) && value.extended( api.Value ) ) { + control.settings[ key ] = value; + } else if ( _.isString( value ) ) { + setting = api( value ); + if ( setting ) { + control.settings[ key ] = setting; + } else { + deferredSettingIds.push( value ); + } + } + } ); + + gatherSettings = function() { + + // Fill-in all resolved settings. + _.each( settings, function ( settingId, key ) { + if ( ! control.settings[ key ] && _.isString( settingId ) ) { + control.settings[ key ] = api( settingId ); + } + } ); + + // Make sure settings passed as array gets associated with default. + if ( control.settings[0] && ! control.settings['default'] ) { + control.settings['default'] = control.settings[0]; + } + + // Identify the main setting. + control.setting = control.settings['default'] || null; + + control.linkElements(); // Link initial elements present in server-rendered content. + control.embed(); + }; + + if ( 0 === deferredSettingIds.length ) { + gatherSettings(); + } else { + api.apply( api, deferredSettingIds.concat( gatherSettings ) ); + } + + // After the control is embedded on the page, invoke the "ready" method. + control.deferred.embedded.done( function () { + control.linkElements(); // Link any additional elements after template is rendered by renderContent(). + control.setupNotifications(); + control.ready(); + }); + }, + + /** + * Link elements between settings and inputs. + * + * @since 4.7.0 + * @access public + * + * @return {void} + */ + linkElements: function () { + var control = this, nodes, radios, element; + + nodes = control.container.find( '[data-customize-setting-link], [data-customize-setting-key-link]' ); + radios = {}; + + nodes.each( function () { + var node = $( this ), name, setting; + + if ( node.data( 'customizeSettingLinked' ) ) { + return; + } + node.data( 'customizeSettingLinked', true ); // Prevent re-linking element. + + if ( node.is( ':radio' ) ) { + name = node.prop( 'name' ); + if ( radios[name] ) { + return; + } + + radios[name] = true; + node = nodes.filter( '[name="' + name + '"]' ); + } + + // Let link by default refer to setting ID. If it doesn't exist, fallback to looking up by setting key. + if ( node.data( 'customizeSettingLink' ) ) { + setting = api( node.data( 'customizeSettingLink' ) ); + } else if ( node.data( 'customizeSettingKeyLink' ) ) { + setting = control.settings[ node.data( 'customizeSettingKeyLink' ) ]; + } + + if ( setting ) { + element = new api.Element( node ); + control.elements.push( element ); + element.sync( setting ); + element.set( setting() ); + } + } ); + }, + + /** + * Embed the control into the page. + */ + embed: function () { + var control = this, + inject; + + // Watch for changes to the section state. + inject = function ( sectionId ) { + var parentContainer; + if ( ! sectionId ) { // @todo Allow a control to be embedded without a section, for instance a control embedded in the front end. + return; + } + // Wait for the section to be registered. + api.section( sectionId, function ( section ) { + // Wait for the section to be ready/initialized. + section.deferred.embedded.done( function () { + parentContainer = ( section.contentContainer.is( 'ul' ) ) ? section.contentContainer : section.contentContainer.find( 'ul:first' ); + if ( ! control.container.parent().is( parentContainer ) ) { + parentContainer.append( control.container ); + control.renderContent(); + } + control.deferred.embedded.resolve(); + }); + }); + }; + control.section.bind( inject ); + inject( control.section.get() ); + }, + + /** + * Triggered when the control's markup has been injected into the DOM. + * + * @return {void} + */ + ready: function() { + var control = this, newItem; + if ( 'dropdown-pages' === control.params.type && control.params.allow_addition ) { + newItem = control.container.find( '.new-content-item' ); + newItem.hide(); // Hide in JS to preserve flex display when showing. + control.container.on( 'click', '.add-new-toggle', function( e ) { + $( e.currentTarget ).slideUp( 180 ); + newItem.slideDown( 180 ); + newItem.find( '.create-item-input' ).focus(); + }); + control.container.on( 'click', '.add-content', function() { + control.addNewPage(); + }); + control.container.on( 'keydown', '.create-item-input', function( e ) { + if ( 13 === e.which ) { // Enter. + control.addNewPage(); + } + }); + } + }, + + /** + * Get the element inside of a control's container that contains the validation error message. + * + * Control subclasses may override this to return the proper container to render notifications into. + * Injects the notification container for existing controls that lack the necessary container, + * including special handling for nav menu items and widgets. + * + * @since 4.6.0 + * @return {jQuery} Setting validation message element. + */ + getNotificationsContainerElement: function() { + var control = this, controlTitle, notificationsContainer; + + notificationsContainer = control.container.find( '.customize-control-notifications-container:first' ); + if ( notificationsContainer.length ) { + return notificationsContainer; + } + + notificationsContainer = $( '
          ' ); + + if ( control.container.hasClass( 'customize-control-nav_menu_item' ) ) { + control.container.find( '.menu-item-settings:first' ).prepend( notificationsContainer ); + } else if ( control.container.hasClass( 'customize-control-widget_form' ) ) { + control.container.find( '.widget-inside:first' ).prepend( notificationsContainer ); + } else { + controlTitle = control.container.find( '.customize-control-title' ); + if ( controlTitle.length ) { + controlTitle.after( notificationsContainer ); + } else { + control.container.prepend( notificationsContainer ); + } + } + return notificationsContainer; + }, + + /** + * Set up notifications. + * + * @since 4.9.0 + * @return {void} + */ + setupNotifications: function() { + var control = this, renderNotificationsIfVisible, onSectionAssigned; + + // Add setting notifications to the control notification. + _.each( control.settings, function( setting ) { + if ( ! setting.notifications ) { + return; + } + setting.notifications.bind( 'add', function( settingNotification ) { + var params = _.extend( + {}, + settingNotification, + { + setting: setting.id + } + ); + control.notifications.add( new api.Notification( setting.id + ':' + settingNotification.code, params ) ); + } ); + setting.notifications.bind( 'remove', function( settingNotification ) { + control.notifications.remove( setting.id + ':' + settingNotification.code ); + } ); + } ); + + renderNotificationsIfVisible = function() { + var sectionId = control.section(); + if ( ! sectionId || ( api.section.has( sectionId ) && api.section( sectionId ).expanded() ) ) { + control.notifications.render(); + } + }; + + control.notifications.bind( 'rendered', function() { + var notifications = control.notifications.get(); + control.container.toggleClass( 'has-notifications', 0 !== notifications.length ); + control.container.toggleClass( 'has-error', 0 !== _.where( notifications, { type: 'error' } ).length ); + } ); + + onSectionAssigned = function( newSectionId, oldSectionId ) { + if ( oldSectionId && api.section.has( oldSectionId ) ) { + api.section( oldSectionId ).expanded.unbind( renderNotificationsIfVisible ); + } + if ( newSectionId ) { + api.section( newSectionId, function( section ) { + section.expanded.bind( renderNotificationsIfVisible ); + renderNotificationsIfVisible(); + }); + } + }; + + control.section.bind( onSectionAssigned ); + onSectionAssigned( control.section.get() ); + control.notifications.bind( 'change', _.debounce( renderNotificationsIfVisible ) ); + }, + + /** + * Render notifications. + * + * Renders the `control.notifications` into the control's container. + * Control subclasses may override this method to do their own handling + * of rendering notifications. + * + * @deprecated in favor of `control.notifications.render()` + * @since 4.6.0 + * @this {wp.customize.Control} + */ + renderNotifications: function() { + var control = this, container, notifications, hasError = false; + + if ( 'undefined' !== typeof console && console.warn ) { + console.warn( '[DEPRECATED] wp.customize.Control.prototype.renderNotifications() is deprecated in favor of instantating a wp.customize.Notifications and calling its render() method.' ); + } + + container = control.getNotificationsContainerElement(); + if ( ! container || ! container.length ) { + return; + } + notifications = []; + control.notifications.each( function( notification ) { + notifications.push( notification ); + if ( 'error' === notification.type ) { + hasError = true; + } + } ); + + if ( 0 === notifications.length ) { + container.stop().slideUp( 'fast' ); + } else { + container.stop().slideDown( 'fast', null, function() { + $( this ).css( 'height', 'auto' ); + } ); + } + + if ( ! control.notificationsTemplate ) { + control.notificationsTemplate = wp.template( 'customize-control-notifications' ); + } + + control.container.toggleClass( 'has-notifications', 0 !== notifications.length ); + control.container.toggleClass( 'has-error', hasError ); + container.empty().append( $.trim( + control.notificationsTemplate( { notifications: notifications, altNotice: Boolean( control.altNotice ) } ) + ) ); + }, + + /** + * Normal controls do not expand, so just expand its parent + * + * @param {Object} [params] + */ + expand: function ( params ) { + api.section( this.section() ).expand( params ); + }, + + /* + * Documented using @borrows in the constructor. + */ + focus: focus, + + /** + * Update UI in response to a change in the control's active state. + * This does not change the active state, it merely handles the behavior + * for when it does change. + * + * @since 4.1.0 + * + * @param {Boolean} active + * @param {Object} args + * @param {Number} args.duration + * @param {Function} args.completeCallback + */ + onChangeActive: function ( active, args ) { + if ( args.unchanged ) { + if ( args.completeCallback ) { + args.completeCallback(); + } + return; + } + + if ( ! $.contains( document, this.container[0] ) ) { + // jQuery.fn.slideUp is not hiding an element if it is not in the DOM. + this.container.toggle( active ); + if ( args.completeCallback ) { + args.completeCallback(); + } + } else if ( active ) { + this.container.slideDown( args.duration, args.completeCallback ); + } else { + this.container.slideUp( args.duration, args.completeCallback ); + } + }, + + /** + * @deprecated 4.1.0 Use this.onChangeActive() instead. + */ + toggle: function ( active ) { + return this.onChangeActive( active, this.defaultActiveArguments ); + }, + + /* + * Documented using @borrows in the constructor + */ + activate: Container.prototype.activate, + + /* + * Documented using @borrows in the constructor + */ + deactivate: Container.prototype.deactivate, + + /* + * Documented using @borrows in the constructor + */ + _toggleActive: Container.prototype._toggleActive, + + // @todo This function appears to be dead code and can be removed. + dropdownInit: function() { + var control = this, + statuses = this.container.find('.dropdown-status'), + params = this.params, + toggleFreeze = false, + update = function( to ) { + if ( 'string' === typeof to && params.statuses && params.statuses[ to ] ) { + statuses.html( params.statuses[ to ] ).show(); + } else { + statuses.hide(); + } + }; + + // Support the .dropdown class to open/close complex elements. + this.container.on( 'click keydown', '.dropdown', function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + + event.preventDefault(); + + if ( ! toggleFreeze ) { + control.container.toggleClass( 'open' ); + } + + if ( control.container.hasClass( 'open' ) ) { + control.container.parent().parent().find( 'li.library-selected' ).focus(); + } + + // Don't want to fire focus and click at same time. + toggleFreeze = true; + setTimeout(function () { + toggleFreeze = false; + }, 400); + }); + + this.setting.bind( update ); + update( this.setting() ); + }, + + /** + * Render the control from its JS template, if it exists. + * + * The control's container must already exist in the DOM. + * + * @since 4.1.0 + */ + renderContent: function () { + var control = this, template, standardTypes, templateId, sectionId; + + standardTypes = [ + 'button', + 'checkbox', + 'date', + 'datetime-local', + 'email', + 'month', + 'number', + 'password', + 'radio', + 'range', + 'search', + 'select', + 'tel', + 'time', + 'text', + 'textarea', + 'week', + 'url' + ]; + + templateId = control.templateSelector; + + // Use default content template when a standard HTML type is used, + // there isn't a more specific template existing, and the control container is empty. + if ( templateId === 'customize-control-' + control.params.type + '-content' && + _.contains( standardTypes, control.params.type ) && + ! document.getElementById( 'tmpl-' + templateId ) && + 0 === control.container.children().length ) + { + templateId = 'customize-control-default-content'; + } + + // Replace the container element's content with the control. + if ( document.getElementById( 'tmpl-' + templateId ) ) { + template = wp.template( templateId ); + if ( template && control.container ) { + control.container.html( template( control.params ) ); + } + } + + // Re-render notifications after content has been re-rendered. + control.notifications.container = control.getNotificationsContainerElement(); + sectionId = control.section(); + if ( ! sectionId || ( api.section.has( sectionId ) && api.section( sectionId ).expanded() ) ) { + control.notifications.render(); + } + }, + + /** + * Add a new page to a dropdown-pages control reusing menus code for this. + * + * @since 4.7.0 + * @access private + * + * @return {void} + */ + addNewPage: function () { + var control = this, promise, toggle, container, input, title, select; + + if ( 'dropdown-pages' !== control.params.type || ! control.params.allow_addition || ! api.Menus ) { + return; + } + + toggle = control.container.find( '.add-new-toggle' ); + container = control.container.find( '.new-content-item' ); + input = control.container.find( '.create-item-input' ); + title = input.val(); + select = control.container.find( 'select' ); + + if ( ! title ) { + input.addClass( 'invalid' ); + return; + } + + input.removeClass( 'invalid' ); + input.attr( 'disabled', 'disabled' ); + + // The menus functions add the page, publish when appropriate, + // and also add the new page to the dropdown-pages controls. + promise = api.Menus.insertAutoDraftPost( { + post_title: title, + post_type: 'page' + } ); + promise.done( function( data ) { + var availableItem, $content, itemTemplate; + + // Prepare the new page as an available menu item. + // See api.Menus.submitNew(). + availableItem = new api.Menus.AvailableItemModel( { + 'id': 'post-' + data.post_id, // Used for available menu item Backbone models. + 'title': title, + 'type': 'post_type', + 'type_label': api.Menus.data.l10n.page_label, + 'object': 'page', + 'object_id': data.post_id, + 'url': data.url + } ); + + // Add the new item to the list of available menu items. + api.Menus.availableMenuItemsPanel.collection.add( availableItem ); + $content = $( '#available-menu-items-post_type-page' ).find( '.available-menu-items-list' ); + itemTemplate = wp.template( 'available-menu-item' ); + $content.prepend( itemTemplate( availableItem.attributes ) ); + + // Focus the select control. + select.focus(); + control.setting.set( String( data.post_id ) ); // Triggers a preview refresh and updates the setting. + + // Reset the create page form. + container.slideUp( 180 ); + toggle.slideDown( 180 ); + } ); + promise.always( function() { + input.val( '' ).removeAttr( 'disabled' ); + } ); + } + }); + + /** + * A colorpicker control. + * + * @class wp.customize.ColorControl + * @augments wp.customize.Control + */ + api.ColorControl = api.Control.extend(/** @lends wp.customize.ColorControl.prototype */{ + ready: function() { + var control = this, + isHueSlider = this.params.mode === 'hue', + updating = false, + picker; + + if ( isHueSlider ) { + picker = this.container.find( '.color-picker-hue' ); + picker.val( control.setting() ).wpColorPicker({ + change: function( event, ui ) { + updating = true; + control.setting( ui.color.h() ); + updating = false; + } + }); + } else { + picker = this.container.find( '.color-picker-hex' ); + picker.val( control.setting() ).wpColorPicker({ + change: function() { + updating = true; + control.setting.set( picker.wpColorPicker( 'color' ) ); + updating = false; + }, + clear: function() { + updating = true; + control.setting.set( '' ); + updating = false; + } + }); + } + + control.setting.bind( function ( value ) { + // Bail if the update came from the control itself. + if ( updating ) { + return; + } + picker.val( value ); + picker.wpColorPicker( 'color', value ); + } ); + + // Collapse color picker when hitting Esc instead of collapsing the current section. + control.container.on( 'keydown', function( event ) { + var pickerContainer; + if ( 27 !== event.which ) { // Esc. + return; + } + pickerContainer = control.container.find( '.wp-picker-container' ); + if ( pickerContainer.hasClass( 'wp-picker-active' ) ) { + picker.wpColorPicker( 'close' ); + control.container.find( '.wp-color-result' ).focus(); + event.stopPropagation(); // Prevent section from being collapsed. + } + } ); + } + }); + + /** + * A control that implements the media modal. + * + * @class wp.customize.MediaControl + * @augments wp.customize.Control + */ + api.MediaControl = api.Control.extend(/** @lends wp.customize.MediaControl.prototype */{ + + /** + * When the control's DOM structure is ready, + * set up internal event bindings. + */ + ready: function() { + var control = this; + // Shortcut so that we don't have to use _.bind every time we add a callback. + _.bindAll( control, 'restoreDefault', 'removeFile', 'openFrame', 'select', 'pausePlayer' ); + + // Bind events, with delegation to facilitate re-rendering. + control.container.on( 'click keydown', '.upload-button', control.openFrame ); + control.container.on( 'click keydown', '.upload-button', control.pausePlayer ); + control.container.on( 'click keydown', '.thumbnail-image img', control.openFrame ); + control.container.on( 'click keydown', '.default-button', control.restoreDefault ); + control.container.on( 'click keydown', '.remove-button', control.pausePlayer ); + control.container.on( 'click keydown', '.remove-button', control.removeFile ); + control.container.on( 'click keydown', '.remove-button', control.cleanupPlayer ); + + // Resize the player controls when it becomes visible (ie when section is expanded). + api.section( control.section() ).container + .on( 'expanded', function() { + if ( control.player ) { + control.player.setControlsSize(); + } + }) + .on( 'collapsed', function() { + control.pausePlayer(); + }); + + /** + * Set attachment data and render content. + * + * Note that BackgroundImage.prototype.ready applies this ready method + * to itself. Since BackgroundImage is an UploadControl, the value + * is the attachment URL instead of the attachment ID. In this case + * we skip fetching the attachment data because we have no ID available, + * and it is the responsibility of the UploadControl to set the control's + * attachmentData before calling the renderContent method. + * + * @param {number|string} value Attachment + */ + function setAttachmentDataAndRenderContent( value ) { + var hasAttachmentData = $.Deferred(); + + if ( control.extended( api.UploadControl ) ) { + hasAttachmentData.resolve(); + } else { + value = parseInt( value, 10 ); + if ( _.isNaN( value ) || value <= 0 ) { + delete control.params.attachment; + hasAttachmentData.resolve(); + } else if ( control.params.attachment && control.params.attachment.id === value ) { + hasAttachmentData.resolve(); + } + } + + // Fetch the attachment data. + if ( 'pending' === hasAttachmentData.state() ) { + wp.media.attachment( value ).fetch().done( function() { + control.params.attachment = this.attributes; + hasAttachmentData.resolve(); + + // Send attachment information to the preview for possible use in `postMessage` transport. + wp.customize.previewer.send( control.setting.id + '-attachment-data', this.attributes ); + } ); + } + + hasAttachmentData.done( function() { + control.renderContent(); + } ); + } + + // Ensure attachment data is initially set (for dynamically-instantiated controls). + setAttachmentDataAndRenderContent( control.setting() ); + + // Update the attachment data and re-render the control when the setting changes. + control.setting.bind( setAttachmentDataAndRenderContent ); + }, + + pausePlayer: function () { + this.player && this.player.pause(); + }, + + cleanupPlayer: function () { + this.player && wp.media.mixin.removePlayer( this.player ); + }, + + /** + * Open the media modal. + */ + openFrame: function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + + event.preventDefault(); + + if ( ! this.frame ) { + this.initFrame(); + } + + this.frame.open(); + }, + + /** + * Create a media modal select frame, and store it so the instance can be reused when needed. + */ + initFrame: function() { + this.frame = wp.media({ + button: { + text: this.params.button_labels.frame_button + }, + states: [ + new wp.media.controller.Library({ + title: this.params.button_labels.frame_title, + library: wp.media.query({ type: this.params.mime_type }), + multiple: false, + date: false + }) + ] + }); + + // When a file is selected, run a callback. + this.frame.on( 'select', this.select ); + }, + + /** + * Callback handler for when an attachment is selected in the media modal. + * Gets the selected image information, and sets it within the control. + */ + select: function() { + // Get the attachment from the modal frame. + var node, + attachment = this.frame.state().get( 'selection' ).first().toJSON(), + mejsSettings = window._wpmejsSettings || {}; + + this.params.attachment = attachment; + + // Set the Customizer setting; the callback takes care of rendering. + this.setting( attachment.id ); + node = this.container.find( 'audio, video' ).get(0); + + // Initialize audio/video previews. + if ( node ) { + this.player = new MediaElementPlayer( node, mejsSettings ); + } else { + this.cleanupPlayer(); + } + }, + + /** + * Reset the setting to the default value. + */ + restoreDefault: function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + event.preventDefault(); + + this.params.attachment = this.params.defaultAttachment; + this.setting( this.params.defaultAttachment.url ); + }, + + /** + * Called when the "Remove" link is clicked. Empties the setting. + * + * @param {object} event jQuery Event object + */ + removeFile: function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + event.preventDefault(); + + this.params.attachment = {}; + this.setting( '' ); + this.renderContent(); // Not bound to setting change when emptying. + } + }); + + /** + * An upload control, which utilizes the media modal. + * + * @class wp.customize.UploadControl + * @augments wp.customize.MediaControl + */ + api.UploadControl = api.MediaControl.extend(/** @lends wp.customize.UploadControl.prototype */{ + + /** + * Callback handler for when an attachment is selected in the media modal. + * Gets the selected image information, and sets it within the control. + */ + select: function() { + // Get the attachment from the modal frame. + var node, + attachment = this.frame.state().get( 'selection' ).first().toJSON(), + mejsSettings = window._wpmejsSettings || {}; + + this.params.attachment = attachment; + + // Set the Customizer setting; the callback takes care of rendering. + this.setting( attachment.url ); + node = this.container.find( 'audio, video' ).get(0); + + // Initialize audio/video previews. + if ( node ) { + this.player = new MediaElementPlayer( node, mejsSettings ); + } else { + this.cleanupPlayer(); + } + }, + + // @deprecated + success: function() {}, + + // @deprecated + removerVisibility: function() {} + }); + + /** + * A control for uploading images. + * + * This control no longer needs to do anything more + * than what the upload control does in JS. + * + * @class wp.customize.ImageControl + * @augments wp.customize.UploadControl + */ + api.ImageControl = api.UploadControl.extend(/** @lends wp.customize.ImageControl.prototype */{ + // @deprecated + thumbnailSrc: function() {} + }); + + /** + * A control for uploading background images. + * + * @class wp.customize.BackgroundControl + * @augments wp.customize.UploadControl + */ + api.BackgroundControl = api.UploadControl.extend(/** @lends wp.customize.BackgroundControl.prototype */{ + + /** + * When the control's DOM structure is ready, + * set up internal event bindings. + */ + ready: function() { + api.UploadControl.prototype.ready.apply( this, arguments ); + }, + + /** + * Callback handler for when an attachment is selected in the media modal. + * Does an additional AJAX request for setting the background context. + */ + select: function() { + api.UploadControl.prototype.select.apply( this, arguments ); + + wp.ajax.post( 'custom-background-add', { + nonce: _wpCustomizeBackground.nonces.add, + wp_customize: 'on', + customize_theme: api.settings.theme.stylesheet, + attachment_id: this.params.attachment.id + } ); + } + }); + + /** + * A control for positioning a background image. + * + * @since 4.7.0 + * + * @class wp.customize.BackgroundPositionControl + * @augments wp.customize.Control + */ + api.BackgroundPositionControl = api.Control.extend(/** @lends wp.customize.BackgroundPositionControl.prototype */{ + + /** + * Set up control UI once embedded in DOM and settings are created. + * + * @since 4.7.0 + * @access public + */ + ready: function() { + var control = this, updateRadios; + + control.container.on( 'change', 'input[name="background-position"]', function() { + var position = $( this ).val().split( ' ' ); + control.settings.x( position[0] ); + control.settings.y( position[1] ); + } ); + + updateRadios = _.debounce( function() { + var x, y, radioInput, inputValue; + x = control.settings.x.get(); + y = control.settings.y.get(); + inputValue = String( x ) + ' ' + String( y ); + radioInput = control.container.find( 'input[name="background-position"][value="' + inputValue + '"]' ); + radioInput.click(); + } ); + control.settings.x.bind( updateRadios ); + control.settings.y.bind( updateRadios ); + + updateRadios(); // Set initial UI. + } + } ); + + /** + * A control for selecting and cropping an image. + * + * @class wp.customize.CroppedImageControl + * @augments wp.customize.MediaControl + */ + api.CroppedImageControl = api.MediaControl.extend(/** @lends wp.customize.CroppedImageControl.prototype */{ + + /** + * Open the media modal to the library state. + */ + openFrame: function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + + this.initFrame(); + this.frame.setState( 'library' ).open(); + }, + + /** + * Create a media modal select frame, and store it so the instance can be reused when needed. + */ + initFrame: function() { + var l10n = _wpMediaViewsL10n; + + this.frame = wp.media({ + button: { + text: l10n.select, + close: false + }, + states: [ + new wp.media.controller.Library({ + title: this.params.button_labels.frame_title, + library: wp.media.query({ type: 'image' }), + multiple: false, + date: false, + priority: 20, + suggestedWidth: this.params.width, + suggestedHeight: this.params.height + }), + new wp.media.controller.CustomizeImageCropper({ + imgSelectOptions: this.calculateImageSelectOptions, + control: this + }) + ] + }); + + this.frame.on( 'select', this.onSelect, this ); + this.frame.on( 'cropped', this.onCropped, this ); + this.frame.on( 'skippedcrop', this.onSkippedCrop, this ); + }, + + /** + * After an image is selected in the media modal, switch to the cropper + * state if the image isn't the right size. + */ + onSelect: function() { + var attachment = this.frame.state().get( 'selection' ).first().toJSON(); + + if ( this.params.width === attachment.width && this.params.height === attachment.height && ! this.params.flex_width && ! this.params.flex_height ) { + this.setImageFromAttachment( attachment ); + this.frame.close(); + } else { + this.frame.setState( 'cropper' ); + } + }, + + /** + * After the image has been cropped, apply the cropped image data to the setting. + * + * @param {object} croppedImage Cropped attachment data. + */ + onCropped: function( croppedImage ) { + this.setImageFromAttachment( croppedImage ); + }, + + /** + * Returns a set of options, computed from the attached image data and + * control-specific data, to be fed to the imgAreaSelect plugin in + * wp.media.view.Cropper. + * + * @param {wp.media.model.Attachment} attachment + * @param {wp.media.controller.Cropper} controller + * @return {Object} Options + */ + calculateImageSelectOptions: function( attachment, controller ) { + var control = controller.get( 'control' ), + flexWidth = !! parseInt( control.params.flex_width, 10 ), + flexHeight = !! parseInt( control.params.flex_height, 10 ), + realWidth = attachment.get( 'width' ), + realHeight = attachment.get( 'height' ), + xInit = parseInt( control.params.width, 10 ), + yInit = parseInt( control.params.height, 10 ), + ratio = xInit / yInit, + xImg = xInit, + yImg = yInit, + x1, y1, imgSelectOptions; + + controller.set( 'canSkipCrop', ! control.mustBeCropped( flexWidth, flexHeight, xInit, yInit, realWidth, realHeight ) ); + + if ( realWidth / realHeight > ratio ) { + yInit = realHeight; + xInit = yInit * ratio; + } else { + xInit = realWidth; + yInit = xInit / ratio; + } + + x1 = ( realWidth - xInit ) / 2; + y1 = ( realHeight - yInit ) / 2; + + imgSelectOptions = { + handles: true, + keys: true, + instance: true, + persistent: true, + imageWidth: realWidth, + imageHeight: realHeight, + minWidth: xImg > xInit ? xInit : xImg, + minHeight: yImg > yInit ? yInit : yImg, + x1: x1, + y1: y1, + x2: xInit + x1, + y2: yInit + y1 + }; + + if ( flexHeight === false && flexWidth === false ) { + imgSelectOptions.aspectRatio = xInit + ':' + yInit; + } + + if ( true === flexHeight ) { + delete imgSelectOptions.minHeight; + imgSelectOptions.maxWidth = realWidth; + } + + if ( true === flexWidth ) { + delete imgSelectOptions.minWidth; + imgSelectOptions.maxHeight = realHeight; + } + + return imgSelectOptions; + }, + + /** + * Return whether the image must be cropped, based on required dimensions. + * + * @param {bool} flexW + * @param {bool} flexH + * @param {int} dstW + * @param {int} dstH + * @param {int} imgW + * @param {int} imgH + * @return {bool} + */ + mustBeCropped: function( flexW, flexH, dstW, dstH, imgW, imgH ) { + if ( true === flexW && true === flexH ) { + return false; + } + + if ( true === flexW && dstH === imgH ) { + return false; + } + + if ( true === flexH && dstW === imgW ) { + return false; + } + + if ( dstW === imgW && dstH === imgH ) { + return false; + } + + if ( imgW <= dstW ) { + return false; + } + + return true; + }, + + /** + * If cropping was skipped, apply the image data directly to the setting. + */ + onSkippedCrop: function() { + var attachment = this.frame.state().get( 'selection' ).first().toJSON(); + this.setImageFromAttachment( attachment ); + }, + + /** + * Updates the setting and re-renders the control UI. + * + * @param {object} attachment + */ + setImageFromAttachment: function( attachment ) { + this.params.attachment = attachment; + + // Set the Customizer setting; the callback takes care of rendering. + this.setting( attachment.id ); + } + }); + + /** + * A control for selecting and cropping Site Icons. + * + * @class wp.customize.SiteIconControl + * @augments wp.customize.CroppedImageControl + */ + api.SiteIconControl = api.CroppedImageControl.extend(/** @lends wp.customize.SiteIconControl.prototype */{ + + /** + * Create a media modal select frame, and store it so the instance can be reused when needed. + */ + initFrame: function() { + var l10n = _wpMediaViewsL10n; + + this.frame = wp.media({ + button: { + text: l10n.select, + close: false + }, + states: [ + new wp.media.controller.Library({ + title: this.params.button_labels.frame_title, + library: wp.media.query({ type: 'image' }), + multiple: false, + date: false, + priority: 20, + suggestedWidth: this.params.width, + suggestedHeight: this.params.height + }), + new wp.media.controller.SiteIconCropper({ + imgSelectOptions: this.calculateImageSelectOptions, + control: this + }) + ] + }); + + this.frame.on( 'select', this.onSelect, this ); + this.frame.on( 'cropped', this.onCropped, this ); + this.frame.on( 'skippedcrop', this.onSkippedCrop, this ); + }, + + /** + * After an image is selected in the media modal, switch to the cropper + * state if the image isn't the right size. + */ + onSelect: function() { + var attachment = this.frame.state().get( 'selection' ).first().toJSON(), + controller = this; + + if ( this.params.width === attachment.width && this.params.height === attachment.height && ! this.params.flex_width && ! this.params.flex_height ) { + wp.ajax.post( 'crop-image', { + nonce: attachment.nonces.edit, + id: attachment.id, + context: 'site-icon', + cropDetails: { + x1: 0, + y1: 0, + width: this.params.width, + height: this.params.height, + dst_width: this.params.width, + dst_height: this.params.height + } + } ).done( function( croppedImage ) { + controller.setImageFromAttachment( croppedImage ); + controller.frame.close(); + } ).fail( function() { + controller.frame.trigger('content:error:crop'); + } ); + } else { + this.frame.setState( 'cropper' ); + } + }, + + /** + * Updates the setting and re-renders the control UI. + * + * @param {object} attachment + */ + setImageFromAttachment: function( attachment ) { + var sizes = [ 'site_icon-32', 'thumbnail', 'full' ], link, + icon; + + _.each( sizes, function( size ) { + if ( ! icon && ! _.isUndefined ( attachment.sizes[ size ] ) ) { + icon = attachment.sizes[ size ]; + } + } ); + + this.params.attachment = attachment; + + // Set the Customizer setting; the callback takes care of rendering. + this.setting( attachment.id ); + + if ( ! icon ) { + return; + } + + // Update the icon in-browser. + link = $( 'link[rel="icon"][sizes="32x32"]' ); + link.attr( 'href', icon.url ); + }, + + /** + * Called when the "Remove" link is clicked. Empties the setting. + * + * @param {object} event jQuery Event object + */ + removeFile: function( event ) { + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + event.preventDefault(); + + this.params.attachment = {}; + this.setting( '' ); + this.renderContent(); // Not bound to setting change when emptying. + $( 'link[rel="icon"][sizes="32x32"]' ).attr( 'href', '/favicon.ico' ); // Set to default. + } + }); + + /** + * @class wp.customize.HeaderControl + * @augments wp.customize.Control + */ + api.HeaderControl = api.Control.extend(/** @lends wp.customize.HeaderControl.prototype */{ + ready: function() { + this.btnRemove = $('#customize-control-header_image .actions .remove'); + this.btnNew = $('#customize-control-header_image .actions .new'); + + _.bindAll(this, 'openMedia', 'removeImage'); + + this.btnNew.on( 'click', this.openMedia ); + this.btnRemove.on( 'click', this.removeImage ); + + api.HeaderTool.currentHeader = this.getInitialHeaderImage(); + + new api.HeaderTool.CurrentView({ + model: api.HeaderTool.currentHeader, + el: '#customize-control-header_image .current .container' + }); + + new api.HeaderTool.ChoiceListView({ + collection: api.HeaderTool.UploadsList = new api.HeaderTool.ChoiceList(), + el: '#customize-control-header_image .choices .uploaded .list' + }); + + new api.HeaderTool.ChoiceListView({ + collection: api.HeaderTool.DefaultsList = new api.HeaderTool.DefaultsList(), + el: '#customize-control-header_image .choices .default .list' + }); + + api.HeaderTool.combinedList = api.HeaderTool.CombinedList = new api.HeaderTool.CombinedList([ + api.HeaderTool.UploadsList, + api.HeaderTool.DefaultsList + ]); + + // Ensure custom-header-crop Ajax requests bootstrap the Customizer to activate the previewed theme. + wp.media.controller.Cropper.prototype.defaults.doCropArgs.wp_customize = 'on'; + wp.media.controller.Cropper.prototype.defaults.doCropArgs.customize_theme = api.settings.theme.stylesheet; + }, + + /** + * Returns a new instance of api.HeaderTool.ImageModel based on the currently + * saved header image (if any). + * + * @since 4.2.0 + * + * @return {Object} Options + */ + getInitialHeaderImage: function() { + if ( ! api.get().header_image || ! api.get().header_image_data || _.contains( [ 'remove-header', 'random-default-image', 'random-uploaded-image' ], api.get().header_image ) ) { + return new api.HeaderTool.ImageModel(); + } + + // Get the matching uploaded image object. + var currentHeaderObject = _.find( _wpCustomizeHeader.uploads, function( imageObj ) { + return ( imageObj.attachment_id === api.get().header_image_data.attachment_id ); + } ); + // Fall back to raw current header image. + if ( ! currentHeaderObject ) { + currentHeaderObject = { + url: api.get().header_image, + thumbnail_url: api.get().header_image, + attachment_id: api.get().header_image_data.attachment_id + }; + } + + return new api.HeaderTool.ImageModel({ + header: currentHeaderObject, + choice: currentHeaderObject.url.split( '/' ).pop() + }); + }, + + /** + * Returns a set of options, computed from the attached image data and + * theme-specific data, to be fed to the imgAreaSelect plugin in + * wp.media.view.Cropper. + * + * @param {wp.media.model.Attachment} attachment + * @param {wp.media.controller.Cropper} controller + * @return {Object} Options + */ + calculateImageSelectOptions: function(attachment, controller) { + var xInit = parseInt(_wpCustomizeHeader.data.width, 10), + yInit = parseInt(_wpCustomizeHeader.data.height, 10), + flexWidth = !! parseInt(_wpCustomizeHeader.data['flex-width'], 10), + flexHeight = !! parseInt(_wpCustomizeHeader.data['flex-height'], 10), + ratio, xImg, yImg, realHeight, realWidth, + imgSelectOptions; + + realWidth = attachment.get('width'); + realHeight = attachment.get('height'); + + this.headerImage = new api.HeaderTool.ImageModel(); + this.headerImage.set({ + themeWidth: xInit, + themeHeight: yInit, + themeFlexWidth: flexWidth, + themeFlexHeight: flexHeight, + imageWidth: realWidth, + imageHeight: realHeight + }); + + controller.set( 'canSkipCrop', ! this.headerImage.shouldBeCropped() ); + + ratio = xInit / yInit; + xImg = realWidth; + yImg = realHeight; + + if ( xImg / yImg > ratio ) { + yInit = yImg; + xInit = yInit * ratio; + } else { + xInit = xImg; + yInit = xInit / ratio; + } + + imgSelectOptions = { + handles: true, + keys: true, + instance: true, + persistent: true, + imageWidth: realWidth, + imageHeight: realHeight, + x1: 0, + y1: 0, + x2: xInit, + y2: yInit + }; + + if (flexHeight === false && flexWidth === false) { + imgSelectOptions.aspectRatio = xInit + ':' + yInit; + } + if (flexHeight === false ) { + imgSelectOptions.maxHeight = yInit; + } + if (flexWidth === false ) { + imgSelectOptions.maxWidth = xInit; + } + + return imgSelectOptions; + }, + + /** + * Sets up and opens the Media Manager in order to select an image. + * Depending on both the size of the image and the properties of the + * current theme, a cropping step after selection may be required or + * skippable. + * + * @param {event} event + */ + openMedia: function(event) { + var l10n = _wpMediaViewsL10n; + + event.preventDefault(); + + this.frame = wp.media({ + button: { + text: l10n.selectAndCrop, + close: false + }, + states: [ + new wp.media.controller.Library({ + title: l10n.chooseImage, + library: wp.media.query({ type: 'image' }), + multiple: false, + date: false, + priority: 20, + suggestedWidth: _wpCustomizeHeader.data.width, + suggestedHeight: _wpCustomizeHeader.data.height + }), + new wp.media.controller.Cropper({ + imgSelectOptions: this.calculateImageSelectOptions + }) + ] + }); + + this.frame.on('select', this.onSelect, this); + this.frame.on('cropped', this.onCropped, this); + this.frame.on('skippedcrop', this.onSkippedCrop, this); + + this.frame.open(); + }, + + /** + * After an image is selected in the media modal, + * switch to the cropper state. + */ + onSelect: function() { + this.frame.setState('cropper'); + }, + + /** + * After the image has been cropped, apply the cropped image data to the setting. + * + * @param {object} croppedImage Cropped attachment data. + */ + onCropped: function(croppedImage) { + var url = croppedImage.url, + attachmentId = croppedImage.attachment_id, + w = croppedImage.width, + h = croppedImage.height; + this.setImageFromURL(url, attachmentId, w, h); + }, + + /** + * If cropping was skipped, apply the image data directly to the setting. + * + * @param {object} selection + */ + onSkippedCrop: function(selection) { + var url = selection.get('url'), + w = selection.get('width'), + h = selection.get('height'); + this.setImageFromURL(url, selection.id, w, h); + }, + + /** + * Creates a new wp.customize.HeaderTool.ImageModel from provided + * header image data and inserts it into the user-uploaded headers + * collection. + * + * @param {String} url + * @param {Number} attachmentId + * @param {Number} width + * @param {Number} height + */ + setImageFromURL: function(url, attachmentId, width, height) { + var choice, data = {}; + + data.url = url; + data.thumbnail_url = url; + data.timestamp = _.now(); + + if (attachmentId) { + data.attachment_id = attachmentId; + } + + if (width) { + data.width = width; + } + + if (height) { + data.height = height; + } + + choice = new api.HeaderTool.ImageModel({ + header: data, + choice: url.split('/').pop() + }); + api.HeaderTool.UploadsList.add(choice); + api.HeaderTool.currentHeader.set(choice.toJSON()); + choice.save(); + choice.importImage(); + }, + + /** + * Triggers the necessary events to deselect an image which was set as + * the currently selected one. + */ + removeImage: function() { + api.HeaderTool.currentHeader.trigger('hide'); + api.HeaderTool.CombinedList.trigger('control:removeImage'); + } + + }); + + /** + * wp.customize.ThemeControl + * + * @class wp.customize.ThemeControl + * @augments wp.customize.Control + */ + api.ThemeControl = api.Control.extend(/** @lends wp.customize.ThemeControl.prototype */{ + + touchDrag: false, + screenshotRendered: false, + + /** + * @since 4.2.0 + */ + ready: function() { + var control = this, panel = api.panel( 'themes' ); + + function disableSwitchButtons() { + return ! panel.canSwitchTheme( control.params.theme.id ); + } + + // Temporary special function since supplying SFTP credentials does not work yet. See #42184. + function disableInstallButtons() { + return disableSwitchButtons() || false === api.settings.theme._canInstall || true === api.settings.theme._filesystemCredentialsNeeded; + } + function updateButtons() { + control.container.find( 'button.preview, button.preview-theme' ).toggleClass( 'disabled', disableSwitchButtons() ); + control.container.find( 'button.theme-install' ).toggleClass( 'disabled', disableInstallButtons() ); + } + + api.state( 'selectedChangesetStatus' ).bind( updateButtons ); + api.state( 'changesetStatus' ).bind( updateButtons ); + updateButtons(); + + control.container.on( 'touchmove', '.theme', function() { + control.touchDrag = true; + }); + + // Bind details view trigger. + control.container.on( 'click keydown touchend', '.theme', function( event ) { + var section; + if ( api.utils.isKeydownButNotEnterEvent( event ) ) { + return; + } + + // Bail if the user scrolled on a touch device. + if ( control.touchDrag === true ) { + return control.touchDrag = false; + } + + // Prevent the modal from showing when the user clicks the action button. + if ( $( event.target ).is( '.theme-actions .button, .update-theme' ) ) { + return; + } + + event.preventDefault(); // Keep this AFTER the key filter above. + section = api.section( control.section() ); + section.showDetails( control.params.theme, function() { + + // Temporary special function since supplying SFTP credentials does not work yet. See #42184. + if ( api.settings.theme._filesystemCredentialsNeeded ) { + section.overlay.find( '.theme-actions .delete-theme' ).remove(); + } + } ); + }); + + control.container.on( 'render-screenshot', function() { + var $screenshot = $( this ).find( 'img' ), + source = $screenshot.data( 'src' ); + + if ( source ) { + $screenshot.attr( 'src', source ); + } + control.screenshotRendered = true; + }); + }, + + /** + * Show or hide the theme based on the presence of the term in the title, description, tags, and author. + * + * @since 4.2.0 + * @param {Array} terms - An array of terms to search for. + * @return {boolean} Whether a theme control was activated or not. + */ + filter: function( terms ) { + var control = this, + matchCount = 0, + haystack = control.params.theme.name + ' ' + + control.params.theme.description + ' ' + + control.params.theme.tags + ' ' + + control.params.theme.author + ' '; + haystack = haystack.toLowerCase().replace( '-', ' ' ); + + // Back-compat for behavior in WordPress 4.2.0 to 4.8.X. + if ( ! _.isArray( terms ) ) { + terms = [ terms ]; + } + + // Always give exact name matches highest ranking. + if ( control.params.theme.name.toLowerCase() === terms.join( ' ' ) ) { + matchCount = 100; + } else { + + // Search for and weight (by 10) complete term matches. + matchCount = matchCount + 10 * ( haystack.split( terms.join( ' ' ) ).length - 1 ); + + // Search for each term individually (as whole-word and partial match) and sum weighted match counts. + _.each( terms, function( term ) { + matchCount = matchCount + 2 * ( haystack.split( term + ' ' ).length - 1 ); // Whole-word, double-weighted. + matchCount = matchCount + haystack.split( term ).length - 1; // Partial word, to minimize empty intermediate searches while typing. + }); + + // Upper limit on match ranking. + if ( matchCount > 99 ) { + matchCount = 99; + } + } + + if ( 0 !== matchCount ) { + control.activate(); + control.params.priority = 101 - matchCount; // Sort results by match count. + return true; + } else { + control.deactivate(); // Hide control. + control.params.priority = 101; + return false; + } + }, + + /** + * Rerender the theme from its JS template with the installed type. + * + * @since 4.9.0 + * + * @return {void} + */ + rerenderAsInstalled: function( installed ) { + var control = this, section; + if ( installed ) { + control.params.theme.type = 'installed'; + } else { + section = api.section( control.params.section ); + control.params.theme.type = section.params.action; + } + control.renderContent(); // Replaces existing content. + control.container.trigger( 'render-screenshot' ); + } + }); + + /** + * Class wp.customize.CodeEditorControl + * + * @since 4.9.0 + * + * @class wp.customize.CodeEditorControl + * @augments wp.customize.Control + */ + api.CodeEditorControl = api.Control.extend(/** @lends wp.customize.CodeEditorControl.prototype */{ + + /** + * Initialize. + * + * @since 4.9.0 + * @param {string} id - Unique identifier for the control instance. + * @param {object} options - Options hash for the control instance. + * @return {void} + */ + initialize: function( id, options ) { + var control = this; + control.deferred = _.extend( control.deferred || {}, { + codemirror: $.Deferred() + } ); + api.Control.prototype.initialize.call( control, id, options ); + + // Note that rendering is debounced so the props will be used when rendering happens after add event. + control.notifications.bind( 'add', function( notification ) { + + // Skip if control notification is not from setting csslint_error notification. + if ( notification.code !== control.setting.id + ':csslint_error' ) { + return; + } + + // Customize the template and behavior of csslint_error notifications. + notification.templateId = 'customize-code-editor-lint-error-notification'; + notification.render = (function( render ) { + return function() { + var li = render.call( this ); + li.find( 'input[type=checkbox]' ).on( 'click', function() { + control.setting.notifications.remove( 'csslint_error' ); + } ); + return li; + }; + })( notification.render ); + } ); + }, + + /** + * Initialize the editor when the containing section is ready and expanded. + * + * @since 4.9.0 + * @return {void} + */ + ready: function() { + var control = this; + if ( ! control.section() ) { + control.initEditor(); + return; + } + + // Wait to initialize editor until section is embedded and expanded. + api.section( control.section(), function( section ) { + section.deferred.embedded.done( function() { + var onceExpanded; + if ( section.expanded() ) { + control.initEditor(); + } else { + onceExpanded = function( isExpanded ) { + if ( isExpanded ) { + control.initEditor(); + section.expanded.unbind( onceExpanded ); + } + }; + section.expanded.bind( onceExpanded ); + } + } ); + } ); + }, + + /** + * Initialize editor. + * + * @since 4.9.0 + * @return {void} + */ + initEditor: function() { + var control = this, element, editorSettings = false; + + // Obtain editorSettings for instantiation. + if ( wp.codeEditor && ( _.isUndefined( control.params.editor_settings ) || false !== control.params.editor_settings ) ) { + + // Obtain default editor settings. + editorSettings = wp.codeEditor.defaultSettings ? _.clone( wp.codeEditor.defaultSettings ) : {}; + editorSettings.codemirror = _.extend( + {}, + editorSettings.codemirror, + { + indentUnit: 2, + tabSize: 2 + } + ); + + // Merge editor_settings param on top of defaults. + if ( _.isObject( control.params.editor_settings ) ) { + _.each( control.params.editor_settings, function( value, key ) { + if ( _.isObject( value ) ) { + editorSettings[ key ] = _.extend( + {}, + editorSettings[ key ], + value + ); + } + } ); + } + } + + element = new api.Element( control.container.find( 'textarea' ) ); + control.elements.push( element ); + element.sync( control.setting ); + element.set( control.setting() ); + + if ( editorSettings ) { + control.initSyntaxHighlightingEditor( editorSettings ); + } else { + control.initPlainTextareaEditor(); + } + }, + + /** + * Make sure editor gets focused when control is focused. + * + * @since 4.9.0 + * @param {Object} [params] - Focus params. + * @param {Function} [params.completeCallback] - Function to call when expansion is complete. + * @return {void} + */ + focus: function( params ) { + var control = this, extendedParams = _.extend( {}, params ), originalCompleteCallback; + originalCompleteCallback = extendedParams.completeCallback; + extendedParams.completeCallback = function() { + if ( originalCompleteCallback ) { + originalCompleteCallback(); + } + if ( control.editor ) { + control.editor.codemirror.focus(); + } + }; + api.Control.prototype.focus.call( control, extendedParams ); + }, + + /** + * Initialize syntax-highlighting editor. + * + * @since 4.9.0 + * @param {object} codeEditorSettings - Code editor settings. + * @return {void} + */ + initSyntaxHighlightingEditor: function( codeEditorSettings ) { + var control = this, $textarea = control.container.find( 'textarea' ), settings, suspendEditorUpdate = false; + + settings = _.extend( {}, codeEditorSettings, { + onTabNext: _.bind( control.onTabNext, control ), + onTabPrevious: _.bind( control.onTabPrevious, control ), + onUpdateErrorNotice: _.bind( control.onUpdateErrorNotice, control ) + }); + + control.editor = wp.codeEditor.initialize( $textarea, settings ); + + // Improve the editor accessibility. + $( control.editor.codemirror.display.lineDiv ) + .attr({ + role: 'textbox', + 'aria-multiline': 'true', + 'aria-label': control.params.label, + 'aria-describedby': 'editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4' + }); + + // Focus the editor when clicking on its label. + control.container.find( 'label' ).on( 'click', function() { + control.editor.codemirror.focus(); + }); + + /* + * When the CodeMirror instance changes, mirror to the textarea, + * where we have our "true" change event handler bound. + */ + control.editor.codemirror.on( 'change', function( codemirror ) { + suspendEditorUpdate = true; + $textarea.val( codemirror.getValue() ).trigger( 'change' ); + suspendEditorUpdate = false; + }); + + // Update CodeMirror when the setting is changed by another plugin. + control.setting.bind( function( value ) { + if ( ! suspendEditorUpdate ) { + control.editor.codemirror.setValue( value ); + } + }); + + // Prevent collapsing section when hitting Esc to tab out of editor. + control.editor.codemirror.on( 'keydown', function onKeydown( codemirror, event ) { + var escKeyCode = 27; + if ( escKeyCode === event.keyCode ) { + event.stopPropagation(); + } + }); + + control.deferred.codemirror.resolveWith( control, [ control.editor.codemirror ] ); + }, + + /** + * Handle tabbing to the field after the editor. + * + * @since 4.9.0 + * @return {void} + */ + onTabNext: function onTabNext() { + var control = this, controls, controlIndex, section; + section = api.section( control.section() ); + controls = section.controls(); + controlIndex = controls.indexOf( control ); + if ( controls.length === controlIndex + 1 ) { + $( '#customize-footer-actions .collapse-sidebar' ).focus(); + } else { + controls[ controlIndex + 1 ].container.find( ':focusable:first' ).focus(); + } + }, + + /** + * Handle tabbing to the field before the editor. + * + * @since 4.9.0 + * @return {void} + */ + onTabPrevious: function onTabPrevious() { + var control = this, controls, controlIndex, section; + section = api.section( control.section() ); + controls = section.controls(); + controlIndex = controls.indexOf( control ); + if ( 0 === controlIndex ) { + section.contentContainer.find( '.customize-section-title .customize-help-toggle, .customize-section-title .customize-section-description.open .section-description-close' ).last().focus(); + } else { + controls[ controlIndex - 1 ].contentContainer.find( ':focusable:first' ).focus(); + } + }, + + /** + * Update error notice. + * + * @since 4.9.0 + * @param {Array} errorAnnotations - Error annotations. + * @return {void} + */ + onUpdateErrorNotice: function onUpdateErrorNotice( errorAnnotations ) { + var control = this, message; + control.setting.notifications.remove( 'csslint_error' ); + + if ( 0 !== errorAnnotations.length ) { + if ( 1 === errorAnnotations.length ) { + message = api.l10n.customCssError.singular.replace( '%d', '1' ); + } else { + message = api.l10n.customCssError.plural.replace( '%d', String( errorAnnotations.length ) ); + } + control.setting.notifications.add( new api.Notification( 'csslint_error', { + message: message, + type: 'error' + } ) ); + } + }, + + /** + * Initialize plain-textarea editor when syntax highlighting is disabled. + * + * @since 4.9.0 + * @return {void} + */ + initPlainTextareaEditor: function() { + var control = this, $textarea = control.container.find( 'textarea' ), textarea = $textarea[0]; + + $textarea.on( 'blur', function onBlur() { + $textarea.data( 'next-tab-blurs', false ); + } ); + + $textarea.on( 'keydown', function onKeydown( event ) { + var selectionStart, selectionEnd, value, tabKeyCode = 9, escKeyCode = 27; + + if ( escKeyCode === event.keyCode ) { + if ( ! $textarea.data( 'next-tab-blurs' ) ) { + $textarea.data( 'next-tab-blurs', true ); + event.stopPropagation(); // Prevent collapsing the section. + } + return; + } + + // Short-circuit if tab key is not being pressed or if a modifier key *is* being pressed. + if ( tabKeyCode !== event.keyCode || event.ctrlKey || event.altKey || event.shiftKey ) { + return; + } + + // Prevent capturing Tab characters if Esc was pressed. + if ( $textarea.data( 'next-tab-blurs' ) ) { + return; + } + + selectionStart = textarea.selectionStart; + selectionEnd = textarea.selectionEnd; + value = textarea.value; + + if ( selectionStart >= 0 ) { + textarea.value = value.substring( 0, selectionStart ).concat( '\t', value.substring( selectionEnd ) ); + $textarea.selectionStart = textarea.selectionEnd = selectionStart + 1; + } + + event.stopPropagation(); + event.preventDefault(); + }); + + control.deferred.codemirror.rejectWith( control ); + } + }); + + /** + * Class wp.customize.DateTimeControl. + * + * @since 4.9.0 + * @class wp.customize.DateTimeControl + * @augments wp.customize.Control + */ + api.DateTimeControl = api.Control.extend(/** @lends wp.customize.DateTimeControl.prototype */{ + + /** + * Initialize behaviors. + * + * @since 4.9.0 + * @return {void} + */ + ready: function ready() { + var control = this; + + control.inputElements = {}; + control.invalidDate = false; + + _.bindAll( control, 'populateSetting', 'updateDaysForMonth', 'populateDateInputs' ); + + if ( ! control.setting ) { + throw new Error( 'Missing setting' ); + } + + control.container.find( '.date-input' ).each( function() { + var input = $( this ), component, element; + component = input.data( 'component' ); + element = new api.Element( input ); + control.inputElements[ component ] = element; + control.elements.push( element ); + + // Add invalid date error once user changes (and has blurred the input). + input.on( 'change', function() { + if ( control.invalidDate ) { + control.notifications.add( new api.Notification( 'invalid_date', { + message: api.l10n.invalidDate + } ) ); + } + } ); + + // Remove the error immediately after validity change. + input.on( 'input', _.debounce( function() { + if ( ! control.invalidDate ) { + control.notifications.remove( 'invalid_date' ); + } + } ) ); + + // Add zero-padding when blurring field. + input.on( 'blur', _.debounce( function() { + if ( ! control.invalidDate ) { + control.populateDateInputs(); + } + } ) ); + } ); + + control.inputElements.month.bind( control.updateDaysForMonth ); + control.inputElements.year.bind( control.updateDaysForMonth ); + control.populateDateInputs(); + control.setting.bind( control.populateDateInputs ); + + // Start populating setting after inputs have been populated. + _.each( control.inputElements, function( element ) { + element.bind( control.populateSetting ); + } ); + }, + + /** + * Parse datetime string. + * + * @since 4.9.0 + * + * @param {string} datetime - Date/Time string. Accepts Y-m-d[ H:i[:s]] format. + * @return {object|null} Returns object containing date components or null if parse error. + */ + parseDateTime: function parseDateTime( datetime ) { + var control = this, matches, date, midDayHour = 12; + + if ( datetime ) { + matches = datetime.match( /^(\d\d\d\d)-(\d\d)-(\d\d)(?: (\d\d):(\d\d)(?::(\d\d))?)?$/ ); + } + + if ( ! matches ) { + return null; + } + + matches.shift(); + + date = { + year: matches.shift(), + month: matches.shift(), + day: matches.shift(), + hour: matches.shift() || '00', + minute: matches.shift() || '00', + second: matches.shift() || '00' + }; + + if ( control.params.includeTime && control.params.twelveHourFormat ) { + date.hour = parseInt( date.hour, 10 ); + date.meridian = date.hour >= midDayHour ? 'pm' : 'am'; + date.hour = date.hour % midDayHour ? String( date.hour % midDayHour ) : String( midDayHour ); + delete date.second; // @todo Why only if twelveHourFormat? + } + + return date; + }, + + /** + * Validates if input components have valid date and time. + * + * @since 4.9.0 + * @return {boolean} If date input fields has error. + */ + validateInputs: function validateInputs() { + var control = this, components, validityInput; + + control.invalidDate = false; + + components = [ 'year', 'day' ]; + if ( control.params.includeTime ) { + components.push( 'hour', 'minute' ); + } + + _.find( components, function( component ) { + var element, max, min, value; + + element = control.inputElements[ component ]; + validityInput = element.element.get( 0 ); + max = parseInt( element.element.attr( 'max' ), 10 ); + min = parseInt( element.element.attr( 'min' ), 10 ); + value = parseInt( element(), 10 ); + control.invalidDate = isNaN( value ) || value > max || value < min; + + if ( ! control.invalidDate ) { + validityInput.setCustomValidity( '' ); + } + + return control.invalidDate; + } ); + + if ( control.inputElements.meridian && ! control.invalidDate ) { + validityInput = control.inputElements.meridian.element.get( 0 ); + if ( 'am' !== control.inputElements.meridian.get() && 'pm' !== control.inputElements.meridian.get() ) { + control.invalidDate = true; + } else { + validityInput.setCustomValidity( '' ); + } + } + + if ( control.invalidDate ) { + validityInput.setCustomValidity( api.l10n.invalidValue ); + } else { + validityInput.setCustomValidity( '' ); + } + if ( ! control.section() || api.section.has( control.section() ) && api.section( control.section() ).expanded() ) { + _.result( validityInput, 'reportValidity' ); + } + + return control.invalidDate; + }, + + /** + * Updates number of days according to the month and year selected. + * + * @since 4.9.0 + * @return {void} + */ + updateDaysForMonth: function updateDaysForMonth() { + var control = this, daysInMonth, year, month, day; + + month = parseInt( control.inputElements.month(), 10 ); + year = parseInt( control.inputElements.year(), 10 ); + day = parseInt( control.inputElements.day(), 10 ); + + if ( month && year ) { + daysInMonth = new Date( year, month, 0 ).getDate(); + control.inputElements.day.element.attr( 'max', daysInMonth ); + + if ( day > daysInMonth ) { + control.inputElements.day( String( daysInMonth ) ); + } + } + }, + + /** + * Populate setting value from the inputs. + * + * @since 4.9.0 + * @return {boolean} If setting updated. + */ + populateSetting: function populateSetting() { + var control = this, date; + + if ( control.validateInputs() || ! control.params.allowPastDate && ! control.isFutureDate() ) { + return false; + } + + date = control.convertInputDateToString(); + control.setting.set( date ); + return true; + }, + + /** + * Converts input values to string in Y-m-d H:i:s format. + * + * @since 4.9.0 + * @return {string} Date string. + */ + convertInputDateToString: function convertInputDateToString() { + var control = this, date = '', dateFormat, hourInTwentyFourHourFormat, + getElementValue, pad; + + pad = function( number, padding ) { + var zeros; + if ( String( number ).length < padding ) { + zeros = padding - String( number ).length; + number = Math.pow( 10, zeros ).toString().substr( 1 ) + String( number ); + } + return number; + }; + + getElementValue = function( component ) { + var value = parseInt( control.inputElements[ component ].get(), 10 ); + + if ( _.contains( [ 'month', 'day', 'hour', 'minute' ], component ) ) { + value = pad( value, 2 ); + } else if ( 'year' === component ) { + value = pad( value, 4 ); + } + return value; + }; + + dateFormat = [ 'year', '-', 'month', '-', 'day' ]; + if ( control.params.includeTime ) { + hourInTwentyFourHourFormat = control.inputElements.meridian ? control.convertHourToTwentyFourHourFormat( control.inputElements.hour(), control.inputElements.meridian() ) : control.inputElements.hour(); + dateFormat = dateFormat.concat( [ ' ', pad( hourInTwentyFourHourFormat, 2 ), ':', 'minute', ':', '00' ] ); + } + + _.each( dateFormat, function( component ) { + date += control.inputElements[ component ] ? getElementValue( component ) : component; + } ); + + return date; + }, + + /** + * Check if the date is in the future. + * + * @since 4.9.0 + * @return {boolean} True if future date. + */ + isFutureDate: function isFutureDate() { + var control = this; + return 0 < api.utils.getRemainingTime( control.convertInputDateToString() ); + }, + + /** + * Convert hour in twelve hour format to twenty four hour format. + * + * @since 4.9.0 + * @param {string} hourInTwelveHourFormat - Hour in twelve hour format. + * @param {string} meridian - Either 'am' or 'pm'. + * @return {string} Hour in twenty four hour format. + */ + convertHourToTwentyFourHourFormat: function convertHour( hourInTwelveHourFormat, meridian ) { + var hourInTwentyFourHourFormat, hour, midDayHour = 12; + + hour = parseInt( hourInTwelveHourFormat, 10 ); + if ( isNaN( hour ) ) { + return ''; + } + + if ( 'pm' === meridian && hour < midDayHour ) { + hourInTwentyFourHourFormat = hour + midDayHour; + } else if ( 'am' === meridian && midDayHour === hour ) { + hourInTwentyFourHourFormat = hour - midDayHour; + } else { + hourInTwentyFourHourFormat = hour; + } + + return String( hourInTwentyFourHourFormat ); + }, + + /** + * Populates date inputs in date fields. + * + * @since 4.9.0 + * @return {boolean} Whether the inputs were populated. + */ + populateDateInputs: function populateDateInputs() { + var control = this, parsed; + + parsed = control.parseDateTime( control.setting.get() ); + + if ( ! parsed ) { + return false; + } + + _.each( control.inputElements, function( element, component ) { + var value = parsed[ component ]; // This will be zero-padded string. + + // Set month and meridian regardless of focused state since they are dropdowns. + if ( 'month' === component || 'meridian' === component ) { + + // Options in dropdowns are not zero-padded. + value = value.replace( /^0/, '' ); + + element.set( value ); + } else { + + value = parseInt( value, 10 ); + if ( ! element.element.is( document.activeElement ) ) { + + // Populate element with zero-padded value if not focused. + element.set( parsed[ component ] ); + } else if ( value !== parseInt( element(), 10 ) ) { + + // Forcibly update the value if its underlying value changed, regardless of zero-padding. + element.set( String( value ) ); + } + } + } ); + + return true; + }, + + /** + * Toggle future date notification for date control. + * + * @since 4.9.0 + * @param {boolean} notify Add or remove the notification. + * @return {wp.customize.DateTimeControl} + */ + toggleFutureDateNotification: function toggleFutureDateNotification( notify ) { + var control = this, notificationCode, notification; + + notificationCode = 'not_future_date'; + + if ( notify ) { + notification = new api.Notification( notificationCode, { + type: 'error', + message: api.l10n.futureDateError + } ); + control.notifications.add( notification ); + } else { + control.notifications.remove( notificationCode ); + } + + return control; + } + }); + + /** + * Class PreviewLinkControl. + * + * @since 4.9.0 + * @class wp.customize.PreviewLinkControl + * @augments wp.customize.Control + */ + api.PreviewLinkControl = api.Control.extend(/** @lends wp.customize.PreviewLinkControl.prototype */{ + + defaults: _.extend( {}, api.Control.prototype.defaults, { + templateId: 'customize-preview-link-control' + } ), + + /** + * Initialize behaviors. + * + * @since 4.9.0 + * @return {void} + */ + ready: function ready() { + var control = this, element, component, node, url, input, button; + + _.bindAll( control, 'updatePreviewLink' ); + + if ( ! control.setting ) { + control.setting = new api.Value(); + } + + control.previewElements = {}; + + control.container.find( '.preview-control-element' ).each( function() { + node = $( this ); + component = node.data( 'component' ); + element = new api.Element( node ); + control.previewElements[ component ] = element; + control.elements.push( element ); + } ); + + url = control.previewElements.url; + input = control.previewElements.input; + button = control.previewElements.button; + + input.link( control.setting ); + url.link( control.setting ); + + url.bind( function( value ) { + url.element.parent().attr( { + href: value, + target: api.settings.changeset.uuid + } ); + } ); + + api.bind( 'ready', control.updatePreviewLink ); + api.state( 'saved' ).bind( control.updatePreviewLink ); + api.state( 'changesetStatus' ).bind( control.updatePreviewLink ); + api.state( 'activated' ).bind( control.updatePreviewLink ); + api.previewer.previewUrl.bind( control.updatePreviewLink ); + + button.element.on( 'click', function( event ) { + event.preventDefault(); + if ( control.setting() ) { + input.element.select(); + document.execCommand( 'copy' ); + button( button.element.data( 'copied-text' ) ); + } + } ); + + url.element.parent().on( 'click', function( event ) { + if ( $( this ).hasClass( 'disabled' ) ) { + event.preventDefault(); + } + } ); + + button.element.on( 'mouseenter', function() { + if ( control.setting() ) { + button( button.element.data( 'copy-text' ) ); + } + } ); + }, + + /** + * Updates Preview Link + * + * @since 4.9.0 + * @return {void} + */ + updatePreviewLink: function updatePreviewLink() { + var control = this, unsavedDirtyValues; + + unsavedDirtyValues = ! api.state( 'saved' ).get() || '' === api.state( 'changesetStatus' ).get() || 'auto-draft' === api.state( 'changesetStatus' ).get(); + + control.toggleSaveNotification( unsavedDirtyValues ); + control.previewElements.url.element.parent().toggleClass( 'disabled', unsavedDirtyValues ); + control.previewElements.button.element.prop( 'disabled', unsavedDirtyValues ); + control.setting.set( api.previewer.getFrontendPreviewUrl() ); + }, + + /** + * Toggles save notification. + * + * @since 4.9.0 + * @param {boolean} notify Add or remove notification. + * @return {void} + */ + toggleSaveNotification: function toggleSaveNotification( notify ) { + var control = this, notificationCode, notification; + + notificationCode = 'changes_not_saved'; + + if ( notify ) { + notification = new api.Notification( notificationCode, { + type: 'info', + message: api.l10n.saveBeforeShare + } ); + control.notifications.add( notification ); + } else { + control.notifications.remove( notificationCode ); + } + } + }); + + /** + * Change objects contained within the main customize object to Settings. + * + * @alias wp.customize.defaultConstructor + */ + api.defaultConstructor = api.Setting; + + /** + * Callback for resolved controls. + * + * @callback wp.customize.deferredControlsCallback + * @param {wp.customize.Control[]} controls Resolved controls. + */ + + /** + * Collection of all registered controls. + * + * @alias wp.customize.control + * + * @since 3.4.0 + * + * @type {Function} + * @param {...string} ids - One or more ids for controls to obtain. + * @param {deferredControlsCallback} [callback] - Function called when all supplied controls exist. + * @return {wp.customize.Control|undefined|jQuery.promise} Control instance or undefined (if function called with one id param), + * or promise resolving to requested controls. + * + * @example Loop over all registered controls. + * wp.customize.control.each( function( control ) { ... } ); + * + * @example Getting `background_color` control instance. + * control = wp.customize.control( 'background_color' ); + * + * @example Check if control exists. + * hasControl = wp.customize.control.has( 'background_color' ); + * + * @example Deferred getting of `background_color` control until it exists, using callback. + * wp.customize.control( 'background_color', function( control ) { ... } ); + * + * @example Get title and tagline controls when they both exist, using promise (only available when multiple IDs are present). + * promise = wp.customize.control( 'blogname', 'blogdescription' ); + * promise.done( function( titleControl, taglineControl ) { ... } ); + * + * @example Get title and tagline controls when they both exist, using callback. + * wp.customize.control( 'blogname', 'blogdescription', function( titleControl, taglineControl ) { ... } ); + * + * @example Getting setting value for `background_color` control. + * value = wp.customize.control( 'background_color ').setting.get(); + * value = wp.customize( 'background_color' ).get(); // Same as above, since setting ID and control ID are the same. + * + * @example Add new control for site title. + * wp.customize.control.add( new wp.customize.Control( 'other_blogname', { + * setting: 'blogname', + * type: 'text', + * label: 'Site title', + * section: 'other_site_identify' + * } ) ); + * + * @example Remove control. + * wp.customize.control.remove( 'other_blogname' ); + * + * @example Listen for control being added. + * wp.customize.control.bind( 'add', function( addedControl ) { ... } ) + * + * @example Listen for control being removed. + * wp.customize.control.bind( 'removed', function( removedControl ) { ... } ) + */ + api.control = new api.Values({ defaultConstructor: api.Control }); + + /** + * Callback for resolved sections. + * + * @callback wp.customize.deferredSectionsCallback + * @param {wp.customize.Section[]} sections Resolved sections. + */ + + /** + * Collection of all registered sections. + * + * @alias wp.customize.section + * + * @since 3.4.0 + * + * @type {Function} + * @param {...string} ids - One or more ids for sections to obtain. + * @param {deferredSectionsCallback} [callback] - Function called when all supplied sections exist. + * @return {wp.customize.Section|undefined|jQuery.promise} Section instance or undefined (if function called with one id param), + * or promise resolving to requested sections. + * + * @example Loop over all registered sections. + * wp.customize.section.each( function( section ) { ... } ) + * + * @example Getting `title_tagline` section instance. + * section = wp.customize.section( 'title_tagline' ) + * + * @example Expand dynamically-created section when it exists. + * wp.customize.section( 'dynamically_created', function( section ) { + * section.expand(); + * } ); + * + * @see {@link wp.customize.control} for further examples of how to interact with {@link wp.customize.Values} instances. + */ + api.section = new api.Values({ defaultConstructor: api.Section }); + + /** + * Callback for resolved panels. + * + * @callback wp.customize.deferredPanelsCallback + * @param {wp.customize.Panel[]} panels Resolved panels. + */ + + /** + * Collection of all registered panels. + * + * @alias wp.customize.panel + * + * @since 4.0.0 + * + * @type {Function} + * @param {...string} ids - One or more ids for panels to obtain. + * @param {deferredPanelsCallback} [callback] - Function called when all supplied panels exist. + * @return {wp.customize.Panel|undefined|jQuery.promise} Panel instance or undefined (if function called with one id param), + * or promise resolving to requested panels. + * + * @example Loop over all registered panels. + * wp.customize.panel.each( function( panel ) { ... } ) + * + * @example Getting nav_menus panel instance. + * panel = wp.customize.panel( 'nav_menus' ); + * + * @example Expand dynamically-created panel when it exists. + * wp.customize.panel( 'dynamically_created', function( panel ) { + * panel.expand(); + * } ); + * + * @see {@link wp.customize.control} for further examples of how to interact with {@link wp.customize.Values} instances. + */ + api.panel = new api.Values({ defaultConstructor: api.Panel }); + + /** + * Callback for resolved notifications. + * + * @callback wp.customize.deferredNotificationsCallback + * @param {wp.customize.Notification[]} notifications Resolved notifications. + */ + + /** + * Collection of all global notifications. + * + * @alias wp.customize.notifications + * + * @since 4.9.0 + * + * @type {Function} + * @param {...string} codes - One or more codes for notifications to obtain. + * @param {deferredNotificationsCallback} [callback] - Function called when all supplied notifications exist. + * @return {wp.customize.Notification|undefined|jQuery.promise} Notification instance or undefined (if function called with one code param), + * or promise resolving to requested notifications. + * + * @example Check if existing notification + * exists = wp.customize.notifications.has( 'a_new_day_arrived' ); + * + * @example Obtain existing notification + * notification = wp.customize.notifications( 'a_new_day_arrived' ); + * + * @example Obtain notification that may not exist yet. + * wp.customize.notifications( 'a_new_day_arrived', function( notification ) { ... } ); + * + * @example Add a warning notification. + * wp.customize.notifications.add( new wp.customize.Notification( 'midnight_almost_here', { + * type: 'warning', + * message: 'Midnight has almost arrived!', + * dismissible: true + * } ) ); + * + * @example Remove a notification. + * wp.customize.notifications.remove( 'a_new_day_arrived' ); + * + * @see {@link wp.customize.control} for further examples of how to interact with {@link wp.customize.Values} instances. + */ + api.notifications = new api.Notifications(); + + api.PreviewFrame = api.Messenger.extend(/** @lends wp.customize.PreviewFrame.prototype */{ + sensitivity: null, // Will get set to api.settings.timeouts.previewFrameSensitivity. + + /** + * An object that fetches a preview in the background of the document, which + * allows for seamless replacement of an existing preview. + * + * @constructs wp.customize.PreviewFrame + * @augments wp.customize.Messenger + * + * @param {object} params.container + * @param {object} params.previewUrl + * @param {object} params.query + * @param {object} options + */ + initialize: function( params, options ) { + var deferred = $.Deferred(); + + /* + * Make the instance of the PreviewFrame the promise object + * so other objects can easily interact with it. + */ + deferred.promise( this ); + + this.container = params.container; + + $.extend( params, { channel: api.PreviewFrame.uuid() }); + + api.Messenger.prototype.initialize.call( this, params, options ); + + this.add( 'previewUrl', params.previewUrl ); + + this.query = $.extend( params.query || {}, { customize_messenger_channel: this.channel() }); + + this.run( deferred ); + }, + + /** + * Run the preview request. + * + * @param {object} deferred jQuery Deferred object to be resolved with + * the request. + */ + run: function( deferred ) { + var previewFrame = this, + loaded = false, + ready = false, + readyData = null, + hasPendingChangesetUpdate = '{}' !== previewFrame.query.customized, + urlParser, + params, + form; + + if ( previewFrame._ready ) { + previewFrame.unbind( 'ready', previewFrame._ready ); + } + + previewFrame._ready = function( data ) { + ready = true; + readyData = data; + previewFrame.container.addClass( 'iframe-ready' ); + if ( ! data ) { + return; + } + + if ( loaded ) { + deferred.resolveWith( previewFrame, [ data ] ); + } + }; + + previewFrame.bind( 'ready', previewFrame._ready ); + + urlParser = document.createElement( 'a' ); + urlParser.href = previewFrame.previewUrl(); + + params = _.extend( + api.utils.parseQueryString( urlParser.search.substr( 1 ) ), + { + customize_changeset_uuid: previewFrame.query.customize_changeset_uuid, + customize_theme: previewFrame.query.customize_theme, + customize_messenger_channel: previewFrame.query.customize_messenger_channel + } + ); + if ( api.settings.changeset.autosaved || ! api.state( 'saved' ).get() ) { + params.customize_autosaved = 'on'; + } + + urlParser.search = $.param( params ); + previewFrame.iframe = $( '"; + echo '
          '; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + exit; + case 'delete-selected': + if ( ! current_user_can( 'delete_themes' ) ) { + wp_die( __( 'Sorry, you are not allowed to delete themes for this site.' ) ); + } + + check_admin_referer( 'bulk-themes' ); + + $themes = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array(); + + if ( empty( $themes ) ) { + wp_safe_redirect( add_query_arg( 'error', 'none', $referer ) ); + exit; + } + + $themes = array_diff( $themes, array( get_option( 'stylesheet' ), get_option( 'template' ) ) ); + + if ( empty( $themes ) ) { + wp_safe_redirect( add_query_arg( 'error', 'main', $referer ) ); + exit; + } + + $theme_info = array(); + foreach ( $themes as $key => $theme ) { + $theme_info[ $theme ] = wp_get_theme( $theme ); + } + + require ABSPATH . 'wp-admin/update.php'; + + $parent_file = 'themes.php'; + + if ( ! isset( $_REQUEST['verify-delete'] ) ) { + wp_enqueue_script( 'jquery' ); + require_once ABSPATH . 'wp-admin/admin-header.php'; + $themes_to_delete = count( $themes ); + ?> +
          + +

          +

          +

          + +

          +

          +

          + +
            + ' . sprintf( + /* translators: 1: Theme name, 2: Theme author. */ + _x( '%1$s by %2$s', 'theme' ), + '' . $theme->display( 'Name' ) . '', + '' . $theme->display( 'Author' ) . '' + ) . ''; + } + ?> +
          + +

          + +

          + +
          + + + '; + } + + wp_nonce_field( 'bulk-themes' ); + + if ( 1 == $themes_to_delete ) { + submit_button( __( 'Yes, delete this theme' ), '', 'submit', false ); + } else { + submit_button( __( 'Yes, delete these themes' ), '', 'submit', false ); + } + ?> +
          + +
          + +
          +
          + 1, + 'action' => 'delete-selected', + 'checked' => $_REQUEST['checked'], + '_wpnonce' => $_REQUEST['_wpnonce'], + ), + network_admin_url( 'themes.php' ) + ) + ) + ); + } + + $paged = ( $_REQUEST['paged'] ) ? $_REQUEST['paged'] : 1; + wp_redirect( + add_query_arg( + array( + 'deleted' => count( $themes ), + 'paged' => $paged, + 's' => $s, + ), + network_admin_url( 'themes.php' ) + ) + ); + exit; + default: + $themes = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array(); + if ( empty( $themes ) ) { + wp_safe_redirect( add_query_arg( 'error', 'none', $referer ) ); + exit; + } + check_admin_referer( 'bulk-themes' ); + + /** This action is documented in wp-admin/network/site-themes.php */ + $referer = apply_filters( 'handle_network_bulk_actions-' . get_current_screen()->id, $referer, $action, $themes ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + wp_safe_redirect( $referer ); + exit; + } +} + +$wp_list_table->prepare_items(); + +add_thickbox(); + +add_screen_option( 'per_page' ); + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using.' ) . '

          ' . + '

          ' . __( 'If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site’s Appearance > Themes screen.' ) . '

          ' . + '

          ' . __( 'Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Network Themes' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +get_current_screen()->set_screen_reader_content( + array( + 'heading_views' => __( 'Filter themes list' ), + 'heading_pagination' => __( 'Themes list navigation' ), + 'heading_list' => __( 'Themes list' ), + ) +); + +$title = __( 'Themes' ); +$parent_file = 'themes.php'; + +wp_enqueue_script( 'updates' ); +wp_enqueue_script( 'theme-preview' ); + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +?> + +
          +

          + + + + + +' . __( 'Search results for “%s”' ) . '', esc_html( $s ) ); +} +?> + +
          + +

          ' . sprintf( $message, number_format_i18n( $enabled ) ) . '

          '; +} elseif ( isset( $_GET['disabled'] ) ) { + $disabled = absint( $_GET['disabled'] ); + if ( 1 == $disabled ) { + $message = __( 'Theme disabled.' ); + } else { + /* translators: %s: Number of themes. */ + $message = _n( '%s theme disabled.', '%s themes disabled.', $disabled ); + } + echo '

          ' . sprintf( $message, number_format_i18n( $disabled ) ) . '

          '; +} elseif ( isset( $_GET['deleted'] ) ) { + $deleted = absint( $_GET['deleted'] ); + if ( 1 == $deleted ) { + $message = __( 'Theme deleted.' ); + } else { + /* translators: %s: Number of themes. */ + $message = _n( '%s theme deleted.', '%s themes deleted.', $deleted ); + } + echo '

          ' . sprintf( $message, number_format_i18n( $deleted ) ) . '

          '; +} elseif ( isset( $_GET['error'] ) && 'none' == $_GET['error'] ) { + echo '

          ' . __( 'No theme selected.' ) . '

          '; +} elseif ( isset( $_GET['error'] ) && 'main' == $_GET['error'] ) { + echo '

          ' . __( 'You cannot delete a theme while it is active on the main site.' ) . '

          '; +} + +?> + +
          +search_box( __( 'Search Installed Themes' ), 'theme' ); ?> +
          + +views(); + +if ( 'broken' == $status ) { + echo '

          ' . __( 'The following themes are installed but incomplete.' ) . '

          '; +} +?> + +
          + + + +display(); ?> +
          + +
          + +add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Toolbar). Clicking the Upgrade Network button will step through each site in the network, five at a time, and make sure any database updates are applied.' ) . '

          ' . + '

          ' . __( 'If a version update to core has not happened, clicking this button won’t affect anything.' ) . '

          ' . + '

          ' . __( 'If this process fails for any reason, users logging in to their sites will force the same update.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Upgrade Network' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +if ( ! current_user_can( 'upgrade_network' ) ) { + wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 ); +} + +echo '
          '; +echo '

          ' . __( 'Upgrade Network' ) . '

          '; + +$action = isset( $_GET['action'] ) ? $_GET['action'] : 'show'; + +switch ( $action ) { + case 'upgrade': + $n = ( isset( $_GET['n'] ) ) ? intval( $_GET['n'] ) : 0; + + if ( $n < 5 ) { + /** + * @global int $wp_db_version WordPress database version. + */ + global $wp_db_version; + update_site_option( 'wpmu_upgrade_site', $wp_db_version ); + } + + $site_ids = get_sites( + array( + 'spam' => 0, + 'deleted' => 0, + 'archived' => 0, + 'network_id' => get_current_network_id(), + 'number' => 5, + 'offset' => $n, + 'fields' => 'ids', + 'order' => 'DESC', + 'orderby' => 'id', + 'update_site_meta_cache' => false, + ) + ); + if ( empty( $site_ids ) ) { + echo '

          ' . __( 'All done!' ) . '

          '; + break; + } + echo '
            '; + foreach ( (array) $site_ids as $site_id ) { + switch_to_blog( $site_id ); + $siteurl = site_url(); + $upgrade_url = admin_url( 'upgrade.php?step=upgrade_db' ); + restore_current_blog(); + + echo "
          • $siteurl
          • "; + + $response = wp_remote_get( + $upgrade_url, + array( + 'timeout' => 120, + 'httpversion' => '1.1', + 'sslverify' => false, + ) + ); + if ( is_wp_error( $response ) ) { + wp_die( + sprintf( + /* translators: 1: Site URL, 2: Server error message. */ + __( 'Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s' ), + $siteurl, + '' . $response->get_error_message() . '' + ) + ); + } + + /** + * Fires after the Multisite DB upgrade for each site is complete. + * + * @since MU (3.0.0) + * + * @param array|WP_Error $response The upgrade response array or WP_Error on failure. + */ + do_action( 'after_mu_upgrade', $response ); + /** + * Fires after each site has been upgraded. + * + * @since MU (3.0.0) + * + * @param int $site_id The Site ID. + */ + do_action( 'wpmu_upgrade_site', $site_id ); + } + echo '
          '; + ?>

          + + +

          +

          + + +

          +

          + +
          + + diff --git a/wp-admin/network/user-edit.php b/wp-admin/network/user-edit.php new file mode 100644 index 0000000..7b908fd --- /dev/null +++ b/wp-admin/network/user-edit.php @@ -0,0 +1,13 @@ +add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'Add User will set up a new user account on the network and send that person an email with username and password.' ) . '

          ' . + '

          ' . __( 'Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Network Users' ) . '

          ' . + '

          ' . __( 'Support Forums' ) . '

          ' +); + +if ( isset( $_REQUEST['action'] ) && 'add-user' == $_REQUEST['action'] ) { + check_admin_referer( 'add-user', '_wpnonce_add-user' ); + + if ( ! current_user_can( 'manage_network_users' ) ) { + wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 ); + } + + if ( ! is_array( $_POST['user'] ) ) { + wp_die( __( 'Cannot create an empty user.' ) ); + } + + $user = wp_unslash( $_POST['user'] ); + + $user_details = wpmu_validate_user_signup( $user['username'], $user['email'] ); + if ( is_wp_error( $user_details['errors'] ) && $user_details['errors']->has_errors() ) { + $add_user_errors = $user_details['errors']; + } else { + $password = wp_generate_password( 12, false ); + $user_id = wpmu_create_user( esc_html( strtolower( $user['username'] ) ), $password, sanitize_email( $user['email'] ) ); + + if ( ! $user_id ) { + $add_user_errors = new WP_Error( 'add_user_fail', __( 'Cannot add user.' ) ); + } else { + /** + * Fires after a new user has been created via the network user-new.php page. + * + * @since 4.4.0 + * + * @param int $user_id ID of the newly created user. + */ + do_action( 'network_user_new_created_user', $user_id ); + wp_redirect( + add_query_arg( + array( + 'update' => 'added', + 'user_id' => $user_id, + ), + 'user-new.php' + ) + ); + exit; + } + } +} + +if ( isset( $_GET['update'] ) ) { + $messages = array(); + if ( 'added' == $_GET['update'] ) { + $edit_link = ''; + if ( isset( $_GET['user_id'] ) ) { + $user_id_new = absint( $_GET['user_id'] ); + if ( $user_id_new ) { + $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user_id_new ) ) ); + } + } + + $message = __( 'User added.' ); + + if ( $edit_link ) { + $message .= sprintf( ' %s', $edit_link, __( 'Edit user' ) ); + } + + $messages[] = $message; + } +} + +$title = __( 'Add New User' ); +$parent_file = 'users.php'; + +require_once ABSPATH . 'wp-admin/admin-header.php'; ?> + +
          +

          +

          ' . $msg . '

          '; + } +} + +if ( isset( $add_user_errors ) && is_wp_error( $add_user_errors ) ) { + ?> +
          + get_error_messages() as $message ) { + echo "

          $message

          "; + } + ?> +
          + +
          + + + + + + + + + + + + + + +
          + +'; + confirm_delete_users( $_POST['allusers'] ); + echo ''; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + } else { + wp_redirect( network_admin_url( 'users.php' ) ); + } + exit(); + + case 'allusers': + if ( ! current_user_can( 'manage_network_users' ) ) { + wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 ); + } + + if ( ( isset( $_POST['action'] ) || isset( $_POST['action2'] ) ) && isset( $_POST['allusers'] ) ) { + check_admin_referer( 'bulk-users-network' ); + + $doaction = -1 != $_POST['action'] ? $_POST['action'] : $_POST['action2']; + $userfunction = ''; + + foreach ( (array) $_POST['allusers'] as $user_id ) { + if ( ! empty( $user_id ) ) { + switch ( $doaction ) { + case 'delete': + if ( ! current_user_can( 'delete_users' ) ) { + wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 ); + } + $title = __( 'Users' ); + $parent_file = 'users.php'; + require_once ABSPATH . 'wp-admin/admin-header.php'; + echo '
          '; + confirm_delete_users( $_POST['allusers'] ); + echo '
          '; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + exit(); + + case 'spam': + $user = get_userdata( $user_id ); + if ( is_super_admin( $user->ID ) ) { + wp_die( + sprintf( + /* translators: %s: User login. */ + __( 'Warning! User cannot be modified. The user %s is a network administrator.' ), + esc_html( $user->user_login ) + ) + ); + } + + $userfunction = 'all_spam'; + $blogs = get_blogs_of_user( $user_id, true ); + + foreach ( (array) $blogs as $details ) { + if ( get_network()->site_id != $details->userblog_id ) { // Main blog is not a spam! + update_blog_status( $details->userblog_id, 'spam', '1' ); + } + } + + $user_data = $user->to_array(); + $user_data['spam'] = '1'; + + wp_update_user( $user_data ); + break; + + case 'notspam': + $user = get_userdata( $user_id ); + + $userfunction = 'all_notspam'; + $blogs = get_blogs_of_user( $user_id, true ); + + foreach ( (array) $blogs as $details ) { + update_blog_status( $details->userblog_id, 'spam', '0' ); + } + + $user_data = $user->to_array(); + $user_data['spam'] = '0'; + + wp_update_user( $user_data ); + break; + } + } + } + + if ( ! in_array( $doaction, array( 'delete', 'spam', 'notspam' ), true ) ) { + $sendback = wp_get_referer(); + + $user_ids = (array) $_POST['allusers']; + /** This action is documented in wp-admin/network/site-themes.php */ + $sendback = apply_filters( 'handle_network_bulk_actions-' . get_current_screen()->id, $sendback, $doaction, $user_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + wp_safe_redirect( $sendback ); + exit(); + } + + wp_safe_redirect( + add_query_arg( + array( + 'updated' => 'true', + 'action' => $userfunction, + ), + wp_get_referer() + ) + ); + } else { + $location = network_admin_url( 'users.php' ); + + if ( ! empty( $_REQUEST['paged'] ) ) { + $location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location ); + } + wp_redirect( $location ); + } + exit(); + + case 'dodelete': + check_admin_referer( 'ms-users-delete' ); + if ( ! ( current_user_can( 'manage_network_users' ) && current_user_can( 'delete_users' ) ) ) { + wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 ); + } + + if ( ! empty( $_POST['blog'] ) && is_array( $_POST['blog'] ) ) { + foreach ( $_POST['blog'] as $id => $users ) { + foreach ( $users as $blogid => $user_id ) { + if ( ! current_user_can( 'delete_user', $id ) ) { + continue; + } + + if ( ! empty( $_POST['delete'] ) && 'reassign' == $_POST['delete'][ $blogid ][ $id ] ) { + remove_user_from_blog( $id, $blogid, (int) $user_id ); + } else { + remove_user_from_blog( $id, $blogid ); + } + } + } + } + $i = 0; + if ( is_array( $_POST['user'] ) && ! empty( $_POST['user'] ) ) { + foreach ( $_POST['user'] as $id ) { + if ( ! current_user_can( 'delete_user', $id ) ) { + continue; + } + wpmu_delete_user( $id ); + $i++; + } + } + + if ( 1 == $i ) { + $deletefunction = 'delete'; + } else { + $deletefunction = 'all_delete'; + } + + wp_redirect( + add_query_arg( + array( + 'updated' => 'true', + 'action' => $deletefunction, + ), + network_admin_url( 'users.php' ) + ) + ); + exit(); + } +} + +$wp_list_table = _get_list_table( 'WP_MS_Users_List_Table' ); +$pagenum = $wp_list_table->get_pagenum(); +$wp_list_table->prepare_items(); +$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' ); + +if ( $pagenum > $total_pages && $total_pages > 0 ) { + wp_redirect( add_query_arg( 'paged', $total_pages ) ); + exit; +} +$title = __( 'Users' ); +$parent_file = 'users.php'; + +add_screen_option( 'per_page' ); + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'This table shows all users across the network and the sites to which they are assigned.' ) . '

          ' . + '

          ' . __( 'Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to their Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site.' ) . '

          ' . + '

          ' . __( 'You can also go to the user’s profile page by clicking on the individual username.' ) . '

          ' . + '

          ' . __( 'You can sort the table by clicking on any of the table headings and switch between list and excerpt views by using the icons above the users list.' ) . '

          ' . + '

          ' . __( 'The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses.' ) . '

          ' . + '

          ' . __( 'You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Network Users' ) . '

          ' . + '

          ' . __( 'Support Forums' ) . '

          ' +); + +get_current_screen()->set_screen_reader_content( + array( + 'heading_views' => __( 'Filter users list' ), + 'heading_pagination' => __( 'Users list navigation' ), + 'heading_list' => __( 'Users list' ), + ) +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +if ( isset( $_REQUEST['updated'] ) && 'true' == $_REQUEST['updated'] && ! empty( $_REQUEST['action'] ) ) { + ?> +

          + +

          + +
          +

          + + + + ' . __( 'Search results for “%s”' ) . '', esc_html( $usersearch ) ); + } + ?> + +
          + + views(); ?> + +
          + search_box( __( 'Search Users' ), 'all-user' ); ?> +
          + +
          + display(); ?> +
          +
          + + diff --git a/wp-admin/options-discussion.php b/wp-admin/options-discussion.php new file mode 100644 index 0000000..e80105e --- /dev/null +++ b/wp-admin/options-discussion.php @@ -0,0 +1,331 @@ +add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => '

          ' . __( 'This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they won’t all fit here! :) Use the documentation links to get information on what each discussion setting does.' ) . '

          ' . + '

          ' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Discussion Settings' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
          +

          + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          + +

          + + + + + + + + + + + + + + + + + + + + + + +
          +
          + + diff --git a/wp-admin/options-general.php b/wp-admin/options-general.php new file mode 100644 index 0000000..5a2ef1b --- /dev/null +++ b/wp-admin/options-general.php @@ -0,0 +1,408 @@ +' . __( 'The fields on this screen determine some of the basics of your site setup.' ) . '

          ' . + '

          ' . __( 'Most themes display the site title at the top of every page, in the title bar of the browser, and as the identifying name for syndicated feeds. The tagline is also displayed by many themes.' ) . '

          '; + +if ( ! is_multisite() ) { + $options_help .= '

          ' . __( 'The WordPress URL and the Site URL can be the same (example.com) or different; for example, having the WordPress core files (example.com/wordpress) in a subdirectory instead of the root directory.' ) . '

          ' . + '

          ' . __( 'If you want site visitors to be able to register themselves, as opposed to by the site administrator, check the membership box. A default user role can be set for all new users, whether self-registered or registered by the site admin.' ) . '

          '; +} + +$options_help .= '

          ' . __( 'You can set the language, and the translation files will be automatically downloaded and installed (available if your filesystem is writable).' ) . '

          ' . + '

          ' . __( 'UTC means Coordinated Universal Time.' ) . '

          ' . + '

          ' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '

          '; + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => $options_help, + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on General Settings' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
          +

          + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + +
          + + diff --git a/wp-admin/options-head.php b/wp-admin/options-head.php new file mode 100644 index 0000000..d96978b --- /dev/null +++ b/wp-admin/options-head.php @@ -0,0 +1,18 @@ +' . __( 'You can set maximum sizes for images inserted into your written content; you can also insert an image as Full Size.' ) . '

          '; + +if ( ! is_multisite() && ( get_option( 'upload_url_path' ) || ( get_option( 'upload_path' ) != 'wp-content/uploads' && get_option( 'upload_path' ) ) ) ) { + $media_options_help .= '

          ' . __( 'Uploading Files allows you to choose the folder and path for storing your uploaded files.' ) . '

          '; +} + +$media_options_help .= '

          ' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '

          '; + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => $media_options_help, + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Media Settings' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +?> + +
          +

          + +
          + + +

          +

          + + + + + + + + + + + + + + + + + + + + + +

          + + + + + + +

          + + + + + + + + + + + + + + + + + + + + + + + + +
          + +
          + + diff --git a/wp-admin/options-permalink.php b/wp-admin/options-permalink.php new file mode 100644 index 0000000..bf564d1 --- /dev/null +++ b/wp-admin/options-permalink.php @@ -0,0 +1,426 @@ +add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => '

          ' . __( 'Permalinks are the permanent URLs to your individual pages and blog posts, as well as your category and tag archives. A permalink is the web address used to link to your content. The URL to each post should be permanent, and never change — hence the name permalink.' ) . '

          ' . + '

          ' . __( 'This screen allows you to choose your permalink structure. You can choose from common settings or create custom URL structures.' ) . '

          ' . + '

          ' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '

          ', + ) +); + +get_current_screen()->add_help_tab( + array( + 'id' => 'permalink-settings', + 'title' => __( 'Permalink Settings' ), + 'content' => '

          ' . __( 'Permalinks can contain useful information, such as the post date, title, or other elements. You can choose from any of the suggested permalink formats, or you can craft your own if you select Custom Structure.' ) . '

          ' . + '

          ' . sprintf( + /* translators: %s: Percent sign (%). */ + __( 'If you pick an option other than Plain, your general URL path with structure tags (terms surrounded by %s) will also appear in the custom structure field and your path can be further modified there.' ), + '%' + ) . '

          ' . + '

          ' . sprintf( + /* translators: 1: %category%, 2: %tag% */ + __( 'When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes %1$s or %2$s.' ), + '%category%', + '%tag%' + ) . '

          ' . + '

          ' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '

          ', + ) +); + +get_current_screen()->add_help_tab( + array( + 'id' => 'custom-structures', + 'title' => __( 'Custom Structures' ), + 'content' => '

          ' . __( 'The Optional fields let you customize the “category” and “tag” base names that will appear in archive URLs. For example, the page listing all posts in the “Uncategorized” category could be /topics/uncategorized instead of /category/uncategorized.' ) . '

          ' . + '

          ' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Permalinks Settings' ) . '

          ' . + '

          ' . __( 'Documentation on Using Permalinks' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +$home_path = get_home_path(); +$iis7_permalinks = iis7_supports_permalinks(); +$permalink_structure = get_option( 'permalink_structure' ); + +$prefix = ''; +$blog_prefix = ''; +if ( ! got_url_rewrite() ) { + $prefix = '/index.php'; +} + +/** + * In a subdirectory configuration of multisite, the `/blog` prefix is used by + * default on the main site to avoid collisions with other sites created on that + * network. If the `permalink_structure` option has been changed to remove this + * base prefix, WordPress core can no longer account for the possible collision. + */ +if ( is_multisite() && ! is_subdomain_install() && is_main_site() && 0 === strpos( $permalink_structure, '/blog/' ) ) { + $blog_prefix = '/blog'; +} + +$category_base = get_option( 'category_base' ); +$tag_base = get_option( 'tag_base' ); +$update_required = false; + +if ( $iis7_permalinks ) { + if ( ( ! file_exists( $home_path . 'web.config' ) && win_is_writable( $home_path ) ) || win_is_writable( $home_path . 'web.config' ) ) { + $writable = true; + } else { + $writable = false; + } +} elseif ( $is_nginx ) { + $writable = false; +} else { + if ( ( ! file_exists( $home_path . '.htaccess' ) && is_writable( $home_path ) ) || is_writable( $home_path . '.htaccess' ) ) { + $writable = true; + } else { + $writable = false; + $existing_rules = array_filter( extract_from_markers( $home_path . '.htaccess', 'WordPress' ) ); + $new_rules = array_filter( explode( "\n", $wp_rewrite->mod_rewrite_rules() ) ); + $update_required = ( $new_rules !== $existing_rules ); + } +} + +$using_index_permalinks = $wp_rewrite->using_index_permalinks(); + +if ( isset( $_POST['permalink_structure'] ) || isset( $_POST['category_base'] ) ) { + check_admin_referer( 'update-permalink' ); + + if ( isset( $_POST['permalink_structure'] ) ) { + if ( isset( $_POST['selection'] ) && 'custom' != $_POST['selection'] ) { + $permalink_structure = $_POST['selection']; + } else { + $permalink_structure = $_POST['permalink_structure']; + } + + if ( ! empty( $permalink_structure ) ) { + $permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) ); + if ( $prefix && $blog_prefix ) { + $permalink_structure = $prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure ); + } else { + $permalink_structure = $blog_prefix . $permalink_structure; + } + } + + $permalink_structure = sanitize_option( 'permalink_structure', $permalink_structure ); + + $wp_rewrite->set_permalink_structure( $permalink_structure ); + } + + if ( isset( $_POST['category_base'] ) ) { + $category_base = $_POST['category_base']; + if ( ! empty( $category_base ) ) { + $category_base = $blog_prefix . preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $category_base ) ); + } + $wp_rewrite->set_category_base( $category_base ); + } + + if ( isset( $_POST['tag_base'] ) ) { + $tag_base = $_POST['tag_base']; + if ( ! empty( $tag_base ) ) { + $tag_base = $blog_prefix . preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $tag_base ) ); + } + $wp_rewrite->set_tag_base( $tag_base ); + } + + $message = __( 'Permalink structure updated.' ); + + if ( $iis7_permalinks ) { + if ( $permalink_structure && ! $using_index_permalinks && ! $writable ) { + $message = sprintf( + /* translators: %s: web.config */ + __( 'You should update your %s file now.' ), + 'web.config' + ); + } elseif ( $permalink_structure && ! $using_index_permalinks && $writable ) { + $message = sprintf( + /* translators: %s: web.config */ + __( 'Permalink structure updated. Remove write access on %s file now!' ), + 'web.config' + ); + } + } elseif ( ! $is_nginx && $permalink_structure && ! $using_index_permalinks && ! $writable && $update_required ) { + $message = sprintf( + /* translators: %s: .htaccess */ + __( 'You should update your %s file now.' ), + '.htaccess' + ); + } + + if ( ! get_settings_errors() ) { + add_settings_error( 'general', 'settings_updated', $message, 'success' ); + } + + set_transient( 'settings_errors', get_settings_errors(), 30 ); + + wp_redirect( admin_url( 'options-permalink.php?settings-updated=true' ) ); + exit; +} + +flush_rewrite_rules(); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> +
          +

          + +
          + + +

          + number of tags are available, and here are some examples to get you started.' ), + __( 'https://wordpress.org/support/article/using-permalinks/' ) + ); + ?> +

          + + '', + 1 => $prefix . '/%year%/%monthnum%/%day%/%postname%/', + 2 => $prefix . '/%year%/%monthnum%/%postname%/', + 3 => $prefix . '/' . _x( 'archives', 'sample permalink base' ) . '/%post_id%', + 4 => $prefix . '/%postname%/', +); +?> +

          + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          +

          +topics as your category base would make your category links like %s/topics/uncategorized/. If you leave these blank the defaults will be used.' ), get_option( 'home' ) . $blog_prefix . $prefix ); +?> +

          + + + + + + + + + + + + + + + + +
          + + +

          + writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your %1$s file. Click in the field and press %3$s to select all. Then insert this rule inside of the %4$s element in %1$s file.' ), + 'web.config', + __( 'https://wordpress.org/support/article/changing-file-permissions/' ), + 'CTRL + a', + '/<configuration>/<system.webServer>/<rewrite>/<rules>' + ); + ?> +

          +
          + +

          +
          +

          + web.config' + ); + ?> +

          + +

          + writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your %2$s file. Create a new file, called %2$s in the root directory of your site. Click in the field and press %3$s to select all. Then insert this code into the %2$s file.' ), + __( 'https://wordpress.org/support/article/changing-file-permissions/' ), + 'web.config', + 'CTRL + a' + ); + ?> +

          +
          + +

          +
          +

          + web.config' + ); + ?> +

          + + + +

          Documentation on Nginx configuration.' ); ?>

          + +

          + writable, we could do this automatically, but it isn’t so these are the mod_rewrite rules you should have in your %1$s file. Click in the field and press %3$s to select all.' ), + '.htaccess', + __( 'https://wordpress.org/support/article/changing-file-permissions/' ), + 'CTRL + a' + ); + ?> +

          +
          + +

          +
          + + + + +
          + + diff --git a/wp-admin/options-privacy.php b/wp-admin/options-privacy.php new file mode 100644 index 0000000..9c70784 --- /dev/null +++ b/wp-admin/options-privacy.php @@ -0,0 +1,255 @@ + Menus. */ + __( 'Privacy Policy page setting updated successfully. Remember to update your menus!' ), + esc_url( add_query_arg( 'autofocus[panel]', 'nav_menus', admin_url( 'customize.php' ) ) ) + ); + } + } + + add_settings_error( 'page_for_privacy_policy', 'page_for_privacy_policy', $privacy_page_updated_message, 'success' ); + } elseif ( 'create-privacy-page' === $action ) { + + if ( ! class_exists( 'WP_Privacy_Policy_Content' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-policy-content.php'; + } + + $privacy_policy_page_content = WP_Privacy_Policy_Content::get_default_content(); + $privacy_policy_page_id = wp_insert_post( + array( + 'post_title' => __( 'Privacy Policy' ), + 'post_status' => 'draft', + 'post_type' => 'page', + 'post_content' => $privacy_policy_page_content, + ), + true + ); + + if ( is_wp_error( $privacy_policy_page_id ) ) { + add_settings_error( + 'page_for_privacy_policy', + 'page_for_privacy_policy', + __( 'Unable to create a Privacy Policy page.' ), + 'error' + ); + } else { + update_option( 'wp_page_for_privacy_policy', $privacy_policy_page_id ); + + wp_redirect( admin_url( 'post.php?post=' . $privacy_policy_page_id . '&action=edit' ) ); + exit; + } + } +} + +// If a Privacy Policy page ID is available, make sure the page actually exists. If not, display an error. +$privacy_policy_page_exists = false; +$privacy_policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' ); + +if ( ! empty( $privacy_policy_page_id ) ) { + + $privacy_policy_page = get_post( $privacy_policy_page_id ); + + if ( ! $privacy_policy_page instanceof WP_Post ) { + add_settings_error( + 'page_for_privacy_policy', + 'page_for_privacy_policy', + __( 'The currently selected Privacy Policy page does not exist. Please create or select a new page.' ), + 'error' + ); + } else { + if ( 'trash' === $privacy_policy_page->post_status ) { + add_settings_error( + 'page_for_privacy_policy', + 'page_for_privacy_policy', + sprintf( + /* translators: %s: URL to Pages Trash. */ + __( 'The currently selected Privacy Policy page is in the Trash. Please create or select a new Privacy Policy page or restore the current page.' ), + 'edit.php?post_status=trash&post_type=page' + ), + 'error' + ); + } else { + $privacy_policy_page_exists = true; + } + } +} + +$title = __( 'Privacy Settings' ); +$parent_file = 'options-general.php'; + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +?> +
          +

          +

          +

          + + +

          +

          + + +

          +

          + + +

          + $privacy_policy_page_id, + 'action' => 'edit', + ), + admin_url( 'post.php' ) + ); + + $view_href = get_permalink( $privacy_policy_page_id ); + ?> +

          + Edit or view your Privacy Policy page content.' ), + esc_url( $edit_href ), + esc_url( $view_href ) + ); + } else { + printf( + /* translators: 1: URL to edit Privacy Policy page, 2: URL to preview Privacy Policy page. */ + __( 'Edit or preview your Privacy Policy page content.' ), + esc_url( $edit_href ), + esc_url( $view_href ) + ); + } + ?> +

          + +

          + Check out our guide%3$s for recommendations on what content to include, along with policies suggested by your plugins and theme.' ), + esc_url( admin_url( 'privacy-policy-guide.php' ) ), + '', + '' + ); + ?> +

          + +
          + + + + + + +
          +add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => '

          ' . __( 'This screen contains the settings that affect the display of your content.' ) . '

          ' . + '

          ' . sprintf( + /* translators: %s: URL to create a new page. */ + __( 'You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed.' ), + 'post-new.php?post_type=page' + ) . '

          ' . + '

          ' . sprintf( + /* translators: %s: Documentation URL. */ + __( 'You can also control the display of your content in RSS feeds, including the maximum number of posts to display and whether to show full text or a summary. Learn more about feeds.' ), + __( 'https://wordpress.org/support/article/wordpress-feeds/' ) + ) . '

          ' . + '

          ' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '

          ', + ) +); + +get_current_screen()->add_help_tab( + array( + 'id' => 'site-visibility', + 'title' => has_action( 'blog_privacy_selector' ) ? __( 'Site Visibility' ) : __( 'Search Engine Visibility' ), + 'content' => '

          ' . __( 'You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the checkbox next to “Discourage search engines from indexing this site” and click the Save Changes button at the bottom of the screen. Note that your privacy is not complete; your site is still visible on the web.' ) . '

          ' . + '

          ' . __( 'When this setting is in effect, a reminder is shown in the At a Glance box of the Dashboard that says, “Search Engines Discouraged,” to remind you that your site is not being crawled.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Reading Settings' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
          +

          + +
          + 'blog_charset' ) ); +} +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          + diff --git a/wp-admin/options-writing.php b/wp-admin/options-writing.php new file mode 100644 index 0000000..5815553 --- /dev/null +++ b/wp-admin/options-writing.php @@ -0,0 +1,239 @@ +add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => '

          ' . __( 'You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within the dashboard, while the rest control external publishing methods. For more information on any of these methods, use the documentation links.' ) . '

          ' . + '

          ' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '

          ', + ) +); + +/** This filter is documented in wp-admin/options.php */ +if ( apply_filters( 'enable_post_by_email_configuration', true ) ) { + get_current_screen()->add_help_tab( + array( + 'id' => 'options-postemail', + 'title' => __( 'Post Via Email' ), + 'content' => '

          ' . __( 'Post via email settings allow you to send your WordPress installation an email with the content of your post. You must set up a secret email account with POP3 access to use this, and any mail received at this address will be posted, so it’s a good idea to keep this address very secret.' ) . '

          ', + ) + ); +} + +/** This filter is documented in wp-admin/options-writing.php */ +if ( apply_filters( 'enable_update_services_configuration', true ) ) { + get_current_screen()->add_help_tab( + array( + 'id' => 'options-services', + 'title' => __( 'Update Services' ), + 'content' => '

          ' . __( 'If desired, WordPress will automatically alert various services of your new posts.' ) . '

          ', + ) + ); +} + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Writing Settings' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
          +

          + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          +

          + %s', wp_generate_password( 8, false ) ), + sprintf( '%s', wp_generate_password( 8, false ) ), + sprintf( '%s', wp_generate_password( 8, false ) ) + ); + ?> +

          + + + + + + + + + + + + + + + + + + + + + + + +

          + + + +

          + + + + + +

          + Update Services because of your site’s visibility settings.' ), + __( 'https://codex.wordpress.org/Update_Services' ), + 'options-reading.php' + ); + ?> +

          + + + + + + + +
          +
          + + diff --git a/wp-admin/options.php b/wp-admin/options.php new file mode 100644 index 0000000..5b3efc5 --- /dev/null +++ b/wp-admin/options.php @@ -0,0 +1,379 @@ +' . __( 'You need a higher level of permission.' ) . '' . + '

          ' . __( 'Sorry, you are not allowed to manage options for this site.' ) . '

          ', + 403 + ); +} + +// Handle admin email change requests. +if ( ! empty( $_GET['adminhash'] ) ) { + $new_admin_details = get_option( 'adminhash' ); + $redirect = 'options-general.php?updated=false'; + if ( is_array( $new_admin_details ) && hash_equals( $new_admin_details['hash'], $_GET['adminhash'] ) && ! empty( $new_admin_details['newemail'] ) ) { + update_option( 'admin_email', $new_admin_details['newemail'] ); + delete_option( 'adminhash' ); + delete_option( 'new_admin_email' ); + $redirect = 'options-general.php?updated=true'; + } + wp_redirect( admin_url( $redirect ) ); + exit; +} elseif ( ! empty( $_GET['dismiss'] ) && 'new_admin_email' == $_GET['dismiss'] ) { + check_admin_referer( 'dismiss-' . get_current_blog_id() . '-new_admin_email' ); + delete_option( 'adminhash' ); + delete_option( 'new_admin_email' ); + wp_redirect( admin_url( 'options-general.php?updated=true' ) ); + exit; +} + +if ( is_multisite() && ! current_user_can( 'manage_network_options' ) && 'update' != $action ) { + wp_die( + '

          ' . __( 'You need a higher level of permission.' ) . '

          ' . + '

          ' . __( 'Sorry, you are not allowed to delete these items.' ) . '

          ', + 403 + ); +} + +$whitelist_options = array( + 'general' => array( + 'blogname', + 'blogdescription', + 'gmt_offset', + 'date_format', + 'time_format', + 'start_of_week', + 'timezone_string', + 'WPLANG', + 'new_admin_email', + ), + 'discussion' => array( + 'default_pingback_flag', + 'default_ping_status', + 'default_comment_status', + 'comments_notify', + 'moderation_notify', + 'comment_moderation', + 'require_name_email', + 'comment_whitelist', + 'comment_max_links', + 'moderation_keys', + 'blacklist_keys', + 'show_avatars', + 'avatar_rating', + 'avatar_default', + 'close_comments_for_old_posts', + 'close_comments_days_old', + 'thread_comments', + 'thread_comments_depth', + 'page_comments', + 'comments_per_page', + 'default_comments_page', + 'comment_order', + 'comment_registration', + 'show_comments_cookies_opt_in', + ), + 'media' => array( + 'thumbnail_size_w', + 'thumbnail_size_h', + 'thumbnail_crop', + 'medium_size_w', + 'medium_size_h', + 'large_size_w', + 'large_size_h', + 'image_default_size', + 'image_default_align', + 'image_default_link_type', + ), + 'reading' => array( + 'posts_per_page', + 'posts_per_rss', + 'rss_use_excerpt', + 'show_on_front', + 'page_on_front', + 'page_for_posts', + 'blog_public', + ), + 'writing' => array( + 'default_category', + 'default_email_category', + 'default_link_category', + 'default_post_format', + ), +); +$whitelist_options['misc'] = array(); +$whitelist_options['options'] = array(); +$whitelist_options['privacy'] = array(); + +$mail_options = array( 'mailserver_url', 'mailserver_port', 'mailserver_login', 'mailserver_pass' ); + +if ( ! in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) ) { + $whitelist_options['reading'][] = 'blog_charset'; +} + +if ( get_site_option( 'initial_db_version' ) < 32453 ) { + $whitelist_options['writing'][] = 'use_smilies'; + $whitelist_options['writing'][] = 'use_balanceTags'; +} + +if ( ! is_multisite() ) { + if ( ! defined( 'WP_SITEURL' ) ) { + $whitelist_options['general'][] = 'siteurl'; + } + if ( ! defined( 'WP_HOME' ) ) { + $whitelist_options['general'][] = 'home'; + } + + $whitelist_options['general'][] = 'users_can_register'; + $whitelist_options['general'][] = 'default_role'; + + $whitelist_options['writing'] = array_merge( $whitelist_options['writing'], $mail_options ); + $whitelist_options['writing'][] = 'ping_sites'; + + $whitelist_options['media'][] = 'uploads_use_yearmonth_folders'; + + // If upload_url_path and upload_path are both default values, they're locked. + if ( get_option( 'upload_url_path' ) || ( get_option( 'upload_path' ) != 'wp-content/uploads' && get_option( 'upload_path' ) ) ) { + $whitelist_options['media'][] = 'upload_path'; + $whitelist_options['media'][] = 'upload_url_path'; + } +} else { + /** + * Filters whether the post-by-email functionality is enabled. + * + * @since 3.0.0 + * + * @param bool $enabled Whether post-by-email configuration is enabled. Default true. + */ + if ( apply_filters( 'enable_post_by_email_configuration', true ) ) { + $whitelist_options['writing'] = array_merge( $whitelist_options['writing'], $mail_options ); + } +} + +/** + * Filters the options whitelist. + * + * @since 2.7.0 + * + * @param array $whitelist_options The options whitelist. + */ +$whitelist_options = apply_filters( 'whitelist_options', $whitelist_options ); + +if ( 'update' == $action ) { // We are saving settings sent from a settings page. + if ( 'options' == $option_page && ! isset( $_POST['option_page'] ) ) { // This is for back compat and will eventually be removed. + $unregistered = true; + check_admin_referer( 'update-options' ); + } else { + $unregistered = false; + check_admin_referer( $option_page . '-options' ); + } + + if ( ! isset( $whitelist_options[ $option_page ] ) ) { + wp_die( + sprintf( + /* translators: %s: The options page name. */ + __( 'Error: Options page %s not found in the options whitelist.' ), + '' . esc_html( $option_page ) . '' + ) + ); + } + + if ( 'options' == $option_page ) { + if ( is_multisite() && ! current_user_can( 'manage_network_options' ) ) { + wp_die( __( 'Sorry, you are not allowed to modify unregistered settings for this site.' ) ); + } + $options = explode( ',', wp_unslash( $_POST['page_options'] ) ); + } else { + $options = $whitelist_options[ $option_page ]; + } + + if ( 'general' == $option_page ) { + // Handle custom date/time formats. + if ( ! empty( $_POST['date_format'] ) && isset( $_POST['date_format_custom'] ) && '\c\u\s\t\o\m' == wp_unslash( $_POST['date_format'] ) ) { + $_POST['date_format'] = $_POST['date_format_custom']; + } + if ( ! empty( $_POST['time_format'] ) && isset( $_POST['time_format_custom'] ) && '\c\u\s\t\o\m' == wp_unslash( $_POST['time_format'] ) ) { + $_POST['time_format'] = $_POST['time_format_custom']; + } + // Map UTC+- timezones to gmt_offsets and set timezone_string to empty. + if ( ! empty( $_POST['timezone_string'] ) && preg_match( '/^UTC[+-]/', $_POST['timezone_string'] ) ) { + $_POST['gmt_offset'] = $_POST['timezone_string']; + $_POST['gmt_offset'] = preg_replace( '/UTC\+?/', '', $_POST['gmt_offset'] ); + $_POST['timezone_string'] = ''; + } + + // Handle translation installation. + if ( ! empty( $_POST['WPLANG'] ) && current_user_can( 'install_languages' ) ) { + require_once ABSPATH . 'wp-admin/includes/translation-install.php'; + + if ( wp_can_install_language_pack() ) { + $language = wp_download_language_pack( $_POST['WPLANG'] ); + if ( $language ) { + $_POST['WPLANG'] = $language; + } + } + } + } + + if ( $options ) { + $user_language_old = get_user_locale(); + + foreach ( $options as $option ) { + if ( $unregistered ) { + _deprecated_argument( + 'options.php', + '2.7.0', + sprintf( + /* translators: %s: The option/setting. */ + __( 'The %s setting is unregistered. Unregistered settings are deprecated. See https://developer.wordpress.org/plugins/settings/settings-api/' ), + '' . esc_html( $option ) . '' + ) + ); + } + + $option = trim( $option ); + $value = null; + if ( isset( $_POST[ $option ] ) ) { + $value = $_POST[ $option ]; + if ( ! is_array( $value ) ) { + $value = trim( $value ); + } + $value = wp_unslash( $value ); + } + update_option( $option, $value ); + } + + /* + * Switch translation in case WPLANG was changed. + * The global $locale is used in get_locale() which is + * used as a fallback in get_user_locale(). + */ + unset( $GLOBALS['locale'] ); + $user_language_new = get_user_locale(); + if ( $user_language_old !== $user_language_new ) { + load_default_textdomain( $user_language_new ); + } + } + + /* + * Handle settings errors and return to options page. + */ + + // If no settings errors were registered add a general 'updated' message. + if ( ! count( get_settings_errors() ) ) { + add_settings_error( 'general', 'settings_updated', __( 'Settings saved.' ), 'success' ); + } + set_transient( 'settings_errors', get_settings_errors(), 30 ); + + // Redirect back to the settings page that was submitted. + $goback = add_query_arg( 'settings-updated', 'true', wp_get_referer() ); + wp_redirect( $goback ); + exit; +} + +require_once ABSPATH . 'wp-admin/admin-header.php'; ?> + +
          +

          + +
          +

          +
          + +
          + + + + +get_results( "SELECT * FROM $wpdb->options ORDER BY option_name" ); + +foreach ( (array) $options as $option ) : + $disabled = false; + if ( '' == $option->option_name ) { + continue; + } + if ( is_serialized( $option->option_value ) ) { + if ( is_serialized_string( $option->option_value ) ) { + // This is a serialized string, so we should display it. + $value = maybe_unserialize( $option->option_value ); + $options_to_update[] = $option->option_name; + $class = 'all-options'; + } else { + $value = 'SERIALIZED DATA'; + $disabled = true; + $class = 'all-options disabled'; + } + } else { + $value = $option->option_value; + $options_to_update[] = $option->option_name; + $class = 'all-options'; + } + $name = esc_attr( $option->option_name ); + ?> + + + + + + + + + + + +
          +
          + + +
          +

          +

          +
          + 1, // This means "success" for some reason. + 'plugin' => $plugin, + 'file' => $file, + ), + admin_url( 'plugin-editor.php' ) + ) + ); + exit; + } +} + +// List of allowable extensions. +$editable_extensions = wp_get_plugin_file_editable_extensions( $plugin ); + +if ( ! is_file( $real_file ) ) { + wp_die( sprintf( '

          %s

          ', __( 'File does not exist! Please double check the name and try again.' ) ) ); +} else { + // Get the extension of the file. + if ( preg_match( '/\.([^.]+)$/', $real_file, $matches ) ) { + $ext = strtolower( $matches[1] ); + // If extension is not in the acceptable list, skip it. + if ( ! in_array( $ext, $editable_extensions ) ) { + wp_die( sprintf( '

          %s

          ', __( 'Files of this type are not editable.' ) ) ); + } + } +} + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'You can use the plugin editor to make changes to any of your plugins’ individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations.' ) . '

          ' . + '

          ' . __( 'Choose a plugin to edit from the dropdown menu and click the Select button. Click once on any file name to load it in the editor, and make your changes. Don’t forget to save your changes (Update File) when you’re finished.' ) . '

          ' . + '

          ' . __( 'The Documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Look Up takes you to a web page about that particular function.' ) . '

          ' . + '

          ' . __( 'When using a keyboard to navigate:' ) . '

          ' . + '
            ' . + '
          • ' . __( 'In the editing area, the Tab key enters a tab character.' ) . '
          • ' . + '
          • ' . __( 'To move away from this area, press the Esc key followed by the Tab key.' ) . '
          • ' . + '
          • ' . __( 'Screen reader users: when in forms mode, you may need to press the Esc key twice.' ) . '
          • ' . + '
          ' . + '

          ' . __( 'If you want to make changes but don’t want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below.' ) . '

          ' . + ( is_network_admin() ? '

          ' . __( 'Any edits to files from this screen will be reflected on all sites in the network.' ) . '

          ' : '' ), + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Editing Plugins' ) . '

          ' . + '

          ' . __( 'Documentation on Writing Plugins' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +$settings = array( + 'codeEditor' => wp_enqueue_code_editor( array( 'file' => $real_file ) ), +); +wp_enqueue_script( 'wp-theme-plugin-editor' ); +wp_add_inline_script( 'wp-theme-plugin-editor', sprintf( 'jQuery( function( $ ) { wp.themePluginEditor.init( $( "#template" ), %s ); } )', wp_json_encode( $settings ) ) ); +wp_add_inline_script( 'wp-theme-plugin-editor', sprintf( 'wp.themePluginEditor.themeOrPlugin = "plugin";' ) ); + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +update_recently_edited( WP_PLUGIN_DIR . '/' . $file ); + +if ( ! empty( $posted_content ) ) { + $content = $posted_content; +} else { + $content = file_get_contents( $real_file ); +} + +if ( '.php' == substr( $real_file, strrpos( $real_file, '.' ) ) ) { + $functions = wp_doc_link_parse( $content ); + + if ( ! empty( $functions ) ) { + $docs_select = ''; + } +} + +$content = esc_textarea( $content ); +?> +
          +

          + + +
          +

          +
          + +
          +

          +
          get_error_message() ? $edit_error->get_error_message() : $edit_error->get_error_code() ); ?>
          +
          + + +
          +
          +

          + ' . esc_html( $file ) . '' ); + } else { + /* translators: %s: Plugin file name. */ + echo sprintf( __( 'Browsing %s (active)' ), '' . esc_html( $file ) . '' ); + } + } else { + if ( is_writeable( $real_file ) ) { + /* translators: %s: Plugin file name. */ + echo sprintf( __( 'Editing %s (inactive)' ), '' . esc_html( $file ) . '' ); + } else { + /* translators: %s: Plugin file name. */ + echo sprintf( __( 'Browsing %s (inactive)' ), '' . esc_html( $file ) . '' ); + } + } + ?> +

          +
          +
          +
          + + + +
          +
          +
          +
          + +
          +

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

          Warning: Making changes to active plugins is not recommended.' ); ?>

          +
          + +
          +

          + + +

          + +

          + Changing File Permissions for more information.' ), + __( 'https://wordpress.org/support/article/changing-file-permissions/' ) + ); + ?> +

          + + + +
          +
          +
          + + + get_pagenum(); + +if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) { + $location = remove_query_arg( '_wp_http_referer', wp_unslash( $_SERVER['REQUEST_URI'] ) ); + + if ( ! empty( $_REQUEST['paged'] ) ) { + $location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location ); + } + + wp_redirect( $location ); + exit; +} + +$wp_list_table->prepare_items(); + +$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' ); + +if ( $pagenum > $total_pages && $total_pages > 0 ) { + wp_redirect( add_query_arg( 'paged', $total_pages ) ); + exit; +} + +$title = __( 'Add Plugins' ); +$parent_file = 'plugins.php'; + +wp_enqueue_script( 'plugin-install' ); +if ( 'plugin-information' != $tab ) { + add_thickbox(); +} + +$body_id = $tab; + +wp_enqueue_script( 'updates' ); + +/** + * Fires before each tab on the Install Plugins screen is loaded. + * + * The dynamic portion of the action hook, `$tab`, allows for targeting + * individual tabs, for instance 'install_plugins_pre_plugin-information'. + * + * @since 2.7.0 + */ +do_action( "install_plugins_pre_{$tab}" ); + +/* + * Call the pre upload action on every non-upload plugin installation screen + * because the form is always displayed on these screens. + */ +if ( 'upload' !== $tab ) { + /** This action is documented in wp-admin/plugin-install.php */ + do_action( 'install_plugins_pre_upload' ); +} + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . sprintf( + /* translators: %s: https://wordpress.org/plugins/ */ + __( 'Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official WordPress Plugin Directory are compatible with the license WordPress uses.' ), + __( 'https://wordpress.org/plugins/' ) + ) . '

          ' . + '

          ' . __( 'You can find new plugins to install by searching or browsing the directory right here in your own Plugins section.' ) . ' ' . __( 'The search results will be updated as you type.' ) . '

          ', + + ) +); +get_current_screen()->add_help_tab( + array( + 'id' => 'adding-plugins', + 'title' => __( 'Adding Plugins' ), + 'content' => + '

          ' . __( 'If you know what you’re looking for, Search is your best bet. The Search screen has options to search the WordPress Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting popular tags. Tags in larger type mean more plugins have been labeled with that tag.' ) . '

          ' . + '

          ' . __( 'If you just want to get an idea of what’s available, you can browse Featured and Popular plugins by using the links above the plugins list. These sections rotate regularly.' ) . '

          ' . + '

          ' . __( 'You can also browse a user’s favorite plugins, by using the Favorites link above the plugins list and entering their WordPress.org username.' ) . '

          ' . + '

          ' . __( 'If you want to install a plugin that you’ve downloaded elsewhere, click the Upload Plugin button above the plugins list. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Installing Plugins' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +get_current_screen()->set_screen_reader_content( + array( + 'heading_views' => __( 'Filter plugins list' ), + 'heading_pagination' => __( 'Plugins list navigation' ), + 'heading_list' => __( 'Plugins list' ), + ) +); + +/** + * WordPress Administration Template Header. + */ +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> +
          "> +

          + +

          + +%s%s', + ( 'upload' === $tab ) ? self_admin_url( 'plugin-install.php' ) : self_admin_url( 'plugin-install.php?tab=upload' ), + __( 'Upload Plugin' ), + __( 'Browse Plugins' ) + ); +} +?> + +
          + + +
          + +
          + views(); + echo '
          '; +} + +/** + * Fires after the plugins list table in each tab of the Install Plugins screen. + * + * The dynamic portion of the action hook, `$tab`, allows for targeting + * individual tabs, for instance 'install_plugins_plugin-information'. + * + * @since 2.7.0 + * + * @param int $paged The current page number of the plugins list table. + */ +do_action( "install_plugins_{$tab}", $paged ); +?> + + +
          + +get_pagenum(); + +$action = $wp_list_table->current_action(); + +$plugin = isset( $_REQUEST['plugin'] ) ? wp_unslash( $_REQUEST['plugin'] ) : ''; +$s = isset( $_REQUEST['s'] ) ? urlencode( wp_unslash( $_REQUEST['s'] ) ) : ''; + +// Clean up request URI from temporary args for screen options/paging uri's to work as expected. +$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'error', 'deleted', 'activate', 'activate-multi', 'deactivate', 'deactivate-multi', '_error_nonce' ), $_SERVER['REQUEST_URI'] ); + +wp_enqueue_script( 'updates' ); + +if ( $action ) { + + switch ( $action ) { + case 'activate': + if ( ! current_user_can( 'activate_plugin', $plugin ) ) { + wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) ); + } + + if ( is_multisite() && ! is_network_admin() && is_network_only_plugin( $plugin ) ) { + wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) ); + exit; + } + + check_admin_referer( 'activate-plugin_' . $plugin ); + + $result = activate_plugin( $plugin, self_admin_url( 'plugins.php?error=true&plugin=' . urlencode( $plugin ) ), is_network_admin() ); + if ( is_wp_error( $result ) ) { + if ( 'unexpected_output' == $result->get_error_code() ) { + $redirect = self_admin_url( 'plugins.php?error=true&charsout=' . strlen( $result->get_error_data() ) . '&plugin=' . urlencode( $plugin ) . "&plugin_status=$status&paged=$page&s=$s" ); + wp_redirect( add_query_arg( '_error_nonce', wp_create_nonce( 'plugin-activation-error_' . $plugin ), $redirect ) ); + exit; + } else { + wp_die( $result ); + } + } + + if ( ! is_network_admin() ) { + $recent = (array) get_option( 'recently_activated' ); + unset( $recent[ $plugin ] ); + update_option( 'recently_activated', $recent ); + } else { + $recent = (array) get_site_option( 'recently_activated' ); + unset( $recent[ $plugin ] ); + update_site_option( 'recently_activated', $recent ); + } + + if ( isset( $_GET['from'] ) && 'import' == $_GET['from'] ) { + // Overrides the ?error=true one above and redirects to the Imports page, stripping the -importer suffix. + wp_redirect( self_admin_url( 'import.php?import=' . str_replace( '-importer', '', dirname( $plugin ) ) ) ); + } elseif ( isset( $_GET['from'] ) && 'press-this' == $_GET['from'] ) { + wp_redirect( self_admin_url( 'press-this.php' ) ); + } else { + // Overrides the ?error=true one above. + wp_redirect( self_admin_url( "plugins.php?activate=true&plugin_status=$status&paged=$page&s=$s" ) ); + } + exit; + + case 'activate-selected': + if ( ! current_user_can( 'activate_plugins' ) ) { + wp_die( __( 'Sorry, you are not allowed to activate plugins for this site.' ) ); + } + + check_admin_referer( 'bulk-plugins' ); + + $plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array(); + + if ( is_network_admin() ) { + foreach ( $plugins as $i => $plugin ) { + // Only activate plugins which are not already network activated. + if ( is_plugin_active_for_network( $plugin ) ) { + unset( $plugins[ $i ] ); + } + } + } else { + foreach ( $plugins as $i => $plugin ) { + // Only activate plugins which are not already active and are not network-only when on Multisite. + if ( is_plugin_active( $plugin ) || ( is_multisite() && is_network_only_plugin( $plugin ) ) ) { + unset( $plugins[ $i ] ); + } + // Only activate plugins which the user can activate. + if ( ! current_user_can( 'activate_plugin', $plugin ) ) { + unset( $plugins[ $i ] ); + } + } + } + + if ( empty( $plugins ) ) { + wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) ); + exit; + } + + activate_plugins( $plugins, self_admin_url( 'plugins.php?error=true' ), is_network_admin() ); + + if ( ! is_network_admin() ) { + $recent = (array) get_option( 'recently_activated' ); + } else { + $recent = (array) get_site_option( 'recently_activated' ); + } + + foreach ( $plugins as $plugin ) { + unset( $recent[ $plugin ] ); + } + + if ( ! is_network_admin() ) { + update_option( 'recently_activated', $recent ); + } else { + update_site_option( 'recently_activated', $recent ); + } + + wp_redirect( self_admin_url( "plugins.php?activate-multi=true&plugin_status=$status&paged=$page&s=$s" ) ); + exit; + + case 'update-selected': + check_admin_referer( 'bulk-plugins' ); + + if ( isset( $_GET['plugins'] ) ) { + $plugins = explode( ',', wp_unslash( $_GET['plugins'] ) ); + } elseif ( isset( $_POST['checked'] ) ) { + $plugins = (array) wp_unslash( $_POST['checked'] ); + } else { + $plugins = array(); + } + + $title = __( 'Update Plugins' ); + $parent_file = 'plugins.php'; + + wp_enqueue_script( 'updates' ); + require_once ABSPATH . 'wp-admin/admin-header.php'; + + echo '
          '; + echo '

          ' . esc_html( $title ) . '

          '; + + $url = self_admin_url( 'update.php?action=update-selected&plugins=' . urlencode( join( ',', $plugins ) ) ); + $url = wp_nonce_url( $url, 'bulk-update-plugins' ); + + echo ""; + echo '
          '; + require_once ABSPATH . 'wp-admin/admin-footer.php'; + exit; + + case 'error_scrape': + if ( ! current_user_can( 'activate_plugin', $plugin ) ) { + wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) ); + } + + check_admin_referer( 'plugin-activation-error_' . $plugin ); + + $valid = validate_plugin( $plugin ); + if ( is_wp_error( $valid ) ) { + wp_die( $valid ); + } + + if ( ! WP_DEBUG ) { + error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR ); + } + + ini_set( 'display_errors', true ); // Ensure that fatal errors are displayed. + // Go back to "sandbox" scope so we get the same errors as before. + plugin_sandbox_scrape( $plugin ); + /** This action is documented in wp-admin/includes/plugin.php */ + do_action( "activate_{$plugin}" ); + exit; + + case 'deactivate': + if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) { + wp_die( __( 'Sorry, you are not allowed to deactivate this plugin.' ) ); + } + + check_admin_referer( 'deactivate-plugin_' . $plugin ); + + if ( ! is_network_admin() && is_plugin_active_for_network( $plugin ) ) { + wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) ); + exit; + } + + deactivate_plugins( $plugin, false, is_network_admin() ); + + if ( ! is_network_admin() ) { + update_option( 'recently_activated', array( $plugin => time() ) + (array) get_option( 'recently_activated' ) ); + } else { + update_site_option( 'recently_activated', array( $plugin => time() ) + (array) get_site_option( 'recently_activated' ) ); + } + + if ( headers_sent() ) { + echo ""; + } else { + wp_redirect( self_admin_url( "plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s" ) ); + } + exit; + + case 'deactivate-selected': + if ( ! current_user_can( 'deactivate_plugins' ) ) { + wp_die( __( 'Sorry, you are not allowed to deactivate plugins for this site.' ) ); + } + + check_admin_referer( 'bulk-plugins' ); + + $plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array(); + // Do not deactivate plugins which are already deactivated. + if ( is_network_admin() ) { + $plugins = array_filter( $plugins, 'is_plugin_active_for_network' ); + } else { + $plugins = array_filter( $plugins, 'is_plugin_active' ); + $plugins = array_diff( $plugins, array_filter( $plugins, 'is_plugin_active_for_network' ) ); + + foreach ( $plugins as $i => $plugin ) { + // Only deactivate plugins which the user can deactivate. + if ( ! current_user_can( 'deactivate_plugin', $plugin ) ) { + unset( $plugins[ $i ] ); + } + } + } + if ( empty( $plugins ) ) { + wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) ); + exit; + } + + deactivate_plugins( $plugins, false, is_network_admin() ); + + $deactivated = array(); + foreach ( $plugins as $plugin ) { + $deactivated[ $plugin ] = time(); + } + + if ( ! is_network_admin() ) { + update_option( 'recently_activated', $deactivated + (array) get_option( 'recently_activated' ) ); + } else { + update_site_option( 'recently_activated', $deactivated + (array) get_site_option( 'recently_activated' ) ); + } + + wp_redirect( self_admin_url( "plugins.php?deactivate-multi=true&plugin_status=$status&paged=$page&s=$s" ) ); + exit; + + case 'delete-selected': + if ( ! current_user_can( 'delete_plugins' ) ) { + wp_die( __( 'Sorry, you are not allowed to delete plugins for this site.' ) ); + } + + check_admin_referer( 'bulk-plugins' ); + + // $_POST = from the plugin form; $_GET = from the FTP details screen. + $plugins = isset( $_REQUEST['checked'] ) ? (array) wp_unslash( $_REQUEST['checked'] ) : array(); + if ( empty( $plugins ) ) { + wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) ); + exit; + } + + $plugins = array_filter( $plugins, 'is_plugin_inactive' ); // Do not allow to delete activated plugins. + if ( empty( $plugins ) ) { + wp_redirect( self_admin_url( "plugins.php?error=true&main=true&plugin_status=$status&paged=$page&s=$s" ) ); + exit; + } + + // Bail on all if any paths are invalid. + // validate_file() returns truthy for invalid files. + $invalid_plugin_files = array_filter( $plugins, 'validate_file' ); + if ( $invalid_plugin_files ) { + wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) ); + exit; + } + + require ABSPATH . 'wp-admin/update.php'; + + $parent_file = 'plugins.php'; + + if ( ! isset( $_REQUEST['verify-delete'] ) ) { + wp_enqueue_script( 'jquery' ); + require_once ABSPATH . 'wp-admin/admin-header.php'; + ?> +
          + $data ) { + $plugin_info[ $plugin_file ] = _get_plugin_data_markup_translate( $plugin_file, $data ); + $plugin_info[ $plugin_file ]['is_uninstallable'] = is_uninstallable_plugin( $plugin ); + if ( ! $plugin_info[ $plugin_file ]['Network'] ) { + $have_non_network_plugins = true; + } + } + } + } + } + $plugins_to_delete = count( $plugin_info ); + ?> + +

          + +

          + +

          + +

          + +

          + +

          + +
            + ', sprintf( __( '%1$s by %2$s (will also delete its data)' ), '' . $plugin['Name'] . '', '' . $plugin['AuthorName'] . '' ), ''; + $data_to_delete = true; + } else { + /* translators: 1: Plugin name, 2: Plugin author. */ + echo '
          • ', sprintf( _x( '%1$s by %2$s', 'plugin' ), '' . $plugin['Name'] . '', '' . $plugin['AuthorName'] ) . '', '
          • '; + } + } + ?> +
          +

          + +

          +
          + + + '; + } + ?> + + +
          + +
          + +
          +
          + id; + $sendback = wp_get_referer(); + $plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array(); + + /** This action is documented in wp-admin/edit.php */ + $sendback = apply_filters( "handle_bulk_actions-{$screen}", $sendback, $action, $plugins ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + wp_safe_redirect( $sendback ); + exit; + } + break; + } +} + +$wp_list_table->prepare_items(); + +wp_enqueue_script( 'plugin-install' ); +add_thickbox(); + +add_screen_option( 'per_page', array( 'default' => 999 ) ); + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.' ) . '

          ' . + '

          ' . __( 'The search for installed plugins will search for terms in their name, description, or author.' ) . ' ' . __( 'The search results will be updated as you type.' ) . '

          ' . + '

          ' . sprintf( + /* translators: %s: WordPress Plugin Directory URL. */ + __( 'If you would like to see more plugins to choose from, click on the “Add New” button and you will be able to browse or search for additional plugins from the WordPress Plugin Directory. Plugins in the WordPress Plugin Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!' ), + __( 'https://wordpress.org/plugins/' ) + ) . '

          ', + ) +); +get_current_screen()->add_help_tab( + array( + 'id' => 'compatibility-problems', + 'title' => __( 'Troubleshooting' ), + 'content' => + '

          ' . __( 'Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin’s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue.' ) . '

          ' . + '

          ' . sprintf( + /* translators: %s: WP_PLUGIN_DIR constant value. */ + __( 'If something goes wrong with a plugin and you can’t use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated.' ), + '' . WP_PLUGIN_DIR . '' + ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Managing Plugins' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +get_current_screen()->set_screen_reader_content( + array( + 'heading_views' => __( 'Filter plugins list' ), + 'heading_pagination' => __( 'Plugins list navigation' ), + 'heading_list' => __( 'Plugins list' ), + ) +); + +$title = __( 'Plugins' ); +$parent_file = 'plugins.php'; + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +$invalid = validate_active_plugins(); +if ( ! empty( $invalid ) ) { + foreach ( $invalid as $plugin_file => $error ) { + echo '

          '; + printf( + /* translators: 1: Plugin file, 2: Error message. */ + __( 'The plugin %1$s has been deactivated due to an error: %2$s' ), + '' . esc_html( $plugin_file ) . '', + $error->get_error_message() + ); + echo '

          '; + } +} +?> + +unexpected output during activation.', + 'The plugin generated %d characters of unexpected output during activation.', + $_GET['charsout'] + ), + $_GET['charsout'] + ); + $errmsg .= ' ' . __( 'If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.' ); + } elseif ( 'resuming' === $_GET['error'] ) { + $errmsg = __( 'Plugin could not be resumed because it triggered a fatal error.' ); + } else { + $errmsg = __( 'Plugin could not be activated because it triggered a fatal error.' ); + } + ?> +

          + 'error_scrape', + 'plugin' => urlencode( $plugin ), + '_wpnonce' => urlencode( $_GET['_error_nonce'] ), + ), + admin_url( 'plugins.php' ) + ); + ?> + + +
          + +
          +

          + get_error_message() + ); + ?> +

          +
          + +
          +

          + +

          +
          + + +

          + +

          + +

          + +

          + +

          + +

          + + +
          +

          + +

          + + + + ' . __( 'Search results for “%s”' ) . '', esc_html( urldecode( $s ) ) ); +} +?> + +
          + + + +views(); ?> + +
          +search_box( __( 'Search Installed Plugins' ), 'plugin' ); ?> +
          + +
          + + + + +display(); ?> +
          + + +
          + + true ) ) ) ) { + $post_type = $_GET['post_type']; +} else { + wp_die( __( 'Invalid post type.' ) ); +} +$post_type_object = get_post_type_object( $post_type ); + +if ( 'post' == $post_type ) { + $parent_file = 'edit.php'; + $submenu_file = 'post-new.php'; +} elseif ( 'attachment' == $post_type ) { + if ( wp_redirect( admin_url( 'media-new.php' ) ) ) { + exit; + } +} else { + $submenu_file = "post-new.php?post_type=$post_type"; + if ( isset( $post_type_object ) && $post_type_object->show_in_menu && true !== $post_type_object->show_in_menu ) { + $parent_file = $post_type_object->show_in_menu; + // What if there isn't a post-new.php item for this post type? + if ( ! isset( $_registered_pages[ get_plugin_page_hookname( "post-new.php?post_type=$post_type", $post_type_object->show_in_menu ) ] ) ) { + if ( isset( $_registered_pages[ get_plugin_page_hookname( "edit.php?post_type=$post_type", $post_type_object->show_in_menu ) ] ) ) { + // Fall back to edit.php for that post type, if it exists. + $submenu_file = "edit.php?post_type=$post_type"; + } else { + // Otherwise, give up and highlight the parent. + $submenu_file = $parent_file; + } + } + } else { + $parent_file = "edit.php?post_type=$post_type"; + } +} + +$title = $post_type_object->labels->add_new_item; + +$editing = true; + +if ( ! current_user_can( $post_type_object->cap->edit_posts ) || ! current_user_can( $post_type_object->cap->create_posts ) ) { + wp_die( + '

          ' . __( 'You need a higher level of permission.' ) . '

          ' . + '

          ' . __( 'Sorry, you are not allowed to create posts as this user.' ) . '

          ', + 403 + ); +} + +$post = get_default_post_to_edit( $post_type, true ); +$post_ID = $post->ID; + +/** This filter is documented in wp-admin/post.php */ +if ( apply_filters( 'replace_editor', false, $post ) !== true ) { + if ( use_block_editor_for_post( $post ) ) { + require ABSPATH . 'wp-admin/edit-form-blocks.php'; + } else { + wp_enqueue_script( 'autosave' ); + require ABSPATH . 'wp-admin/edit-form-advanced.php'; + } +} else { + // Flag that we're not loading the block editor. + $current_screen = get_current_screen(); + $current_screen->is_block_editor( false ); +} + +require_once ABSPATH . 'wp-admin/admin-footer.php'; diff --git a/wp-admin/post.php b/wp-admin/post.php new file mode 100644 index 0000000..f5693f4 --- /dev/null +++ b/wp-admin/post.php @@ -0,0 +1,362 @@ +post_type; + $post_type_object = get_post_type_object( $post_type ); +} + +if ( isset( $_POST['post_type'] ) && $post && $post_type !== $_POST['post_type'] ) { + wp_die( __( 'A post type mismatch has been detected.' ), __( 'Sorry, you are not allowed to edit this item.' ), 400 ); +} + +if ( isset( $_POST['deletepost'] ) ) { + $action = 'delete'; +} elseif ( isset( $_POST['wp-preview'] ) && 'dopreview' == $_POST['wp-preview'] ) { + $action = 'preview'; +} + +$sendback = wp_get_referer(); +if ( ! $sendback || + false !== strpos( $sendback, 'post.php' ) || + false !== strpos( $sendback, 'post-new.php' ) ) { + if ( 'attachment' == $post_type ) { + $sendback = admin_url( 'upload.php' ); + } else { + $sendback = admin_url( 'edit.php' ); + if ( ! empty( $post_type ) ) { + $sendback = add_query_arg( 'post_type', $post_type, $sendback ); + } + } +} else { + $sendback = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'ids' ), $sendback ); +} + +switch ( $action ) { + case 'post-quickdraft-save': + // Check nonce and capabilities. + $nonce = $_REQUEST['_wpnonce']; + $error_msg = false; + + // For output of the Quick Draft dashboard widget. + require_once ABSPATH . 'wp-admin/includes/dashboard.php'; + + if ( ! wp_verify_nonce( $nonce, 'add-post' ) ) { + $error_msg = __( 'Unable to submit this form, please refresh and try again.' ); + } + + if ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) { + exit; + } + + if ( $error_msg ) { + return wp_dashboard_quick_press( $error_msg ); + } + + $post = get_post( $_REQUEST['post_ID'] ); + check_admin_referer( 'add-' . $post->post_type ); + + $_POST['comment_status'] = get_default_comment_status( $post->post_type ); + $_POST['ping_status'] = get_default_comment_status( $post->post_type, 'pingback' ); + + // Wrap Quick Draft content in the Paragraph block. + if ( false === strpos( $_POST['content'], '' ) ) { + $_POST['content'] = sprintf( + '%s', + str_replace( array( "\r\n", "\r", "\n" ), '
          ', $_POST['content'] ) + ); + } + + edit_post(); + wp_dashboard_quick_press(); + exit; + + case 'postajaxpost': + case 'post': + check_admin_referer( 'add-' . $post_type ); + $post_id = 'postajaxpost' == $action ? edit_post() : write_post(); + redirect_post( $post_id ); + exit(); + + case 'edit': + $editing = true; + + if ( empty( $post_id ) ) { + wp_redirect( admin_url( 'post.php' ) ); + exit(); + } + + if ( ! $post ) { + wp_die( __( 'You attempted to edit an item that doesn’t exist. Perhaps it was deleted?' ) ); + } + + if ( ! $post_type_object ) { + wp_die( __( 'Invalid post type.' ) ); + } + + if ( ! in_array( $typenow, get_post_types( array( 'show_ui' => true ) ) ) ) { + wp_die( __( 'Sorry, you are not allowed to edit posts in this post type.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this item.' ) ); + } + + if ( 'trash' == $post->post_status ) { + wp_die( __( 'You can’t edit this item because it is in the Trash. Please restore it and try again.' ) ); + } + + if ( ! empty( $_GET['get-post-lock'] ) ) { + check_admin_referer( 'lock-post_' . $post_id ); + wp_set_post_lock( $post_id ); + wp_redirect( get_edit_post_link( $post_id, 'url' ) ); + exit(); + } + + $post_type = $post->post_type; + if ( 'post' == $post_type ) { + $parent_file = 'edit.php'; + $submenu_file = 'edit.php'; + $post_new_file = 'post-new.php'; + } elseif ( 'attachment' == $post_type ) { + $parent_file = 'upload.php'; + $submenu_file = 'upload.php'; + $post_new_file = 'media-new.php'; + } else { + if ( isset( $post_type_object ) && $post_type_object->show_in_menu && true !== $post_type_object->show_in_menu ) { + $parent_file = $post_type_object->show_in_menu; + } else { + $parent_file = "edit.php?post_type=$post_type"; + } + $submenu_file = "edit.php?post_type=$post_type"; + $post_new_file = "post-new.php?post_type=$post_type"; + } + + $title = $post_type_object->labels->edit_item; + + /** + * Allows replacement of the editor. + * + * @since 4.9.0 + * + * @param bool $replace Whether to replace the editor. Default false. + * @param WP_Post $post Post object. + */ + if ( true === apply_filters( 'replace_editor', false, $post ) ) { + break; + } + + if ( use_block_editor_for_post( $post ) ) { + require ABSPATH . 'wp-admin/edit-form-blocks.php'; + break; + } + + if ( ! wp_check_post_lock( $post->ID ) ) { + $active_post_lock = wp_set_post_lock( $post->ID ); + + if ( 'attachment' !== $post_type ) { + wp_enqueue_script( 'autosave' ); + } + } + + $post = get_post( $post_id, OBJECT, 'edit' ); + + if ( post_type_supports( $post_type, 'comments' ) ) { + wp_enqueue_script( 'admin-comments' ); + enqueue_comment_hotkeys_js(); + } + + require ABSPATH . 'wp-admin/edit-form-advanced.php'; + + break; + + case 'editattachment': + check_admin_referer( 'update-post_' . $post_id ); + + // Don't let these be changed. + unset( $_POST['guid'] ); + $_POST['post_type'] = 'attachment'; + + // Update the thumbnail filename. + $newmeta = wp_get_attachment_metadata( $post_id, true ); + $newmeta['thumb'] = wp_basename( $_POST['thumb'] ); + + wp_update_attachment_metadata( $post_id, $newmeta ); + + // Intentional fall-through to trigger the edit_post() call. + case 'editpost': + check_admin_referer( 'update-post_' . $post_id ); + + $post_id = edit_post(); + + // Session cookie flag that the post was saved. + if ( isset( $_COOKIE['wp-saving-post'] ) && $_COOKIE['wp-saving-post'] === $post_id . '-check' ) { + setcookie( 'wp-saving-post', $post_id . '-saved', time() + DAY_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, is_ssl() ); + } + + redirect_post( $post_id ); // Send user on their way while we keep working. + + exit(); + + case 'trash': + check_admin_referer( 'trash-post_' . $post_id ); + + if ( ! $post ) { + wp_die( __( 'The item you are trying to move to the Trash no longer exists.' ) ); + } + + if ( ! $post_type_object ) { + wp_die( __( 'Invalid post type.' ) ); + } + + if ( ! current_user_can( 'delete_post', $post_id ) ) { + wp_die( __( 'Sorry, you are not allowed to move this item to the Trash.' ) ); + } + + $user_id = wp_check_post_lock( $post_id ); + if ( $user_id ) { + $user = get_userdata( $user_id ); + /* translators: %s: User's display name. */ + wp_die( sprintf( __( 'You cannot move this item to the Trash. %s is currently editing.' ), $user->display_name ) ); + } + + if ( ! wp_trash_post( $post_id ) ) { + wp_die( __( 'Error in moving to Trash.' ) ); + } + + wp_redirect( + add_query_arg( + array( + 'trashed' => 1, + 'ids' => $post_id, + ), + $sendback + ) + ); + exit(); + + case 'untrash': + check_admin_referer( 'untrash-post_' . $post_id ); + + if ( ! $post ) { + wp_die( __( 'The item you are trying to restore from the Trash no longer exists.' ) ); + } + + if ( ! $post_type_object ) { + wp_die( __( 'Invalid post type.' ) ); + } + + if ( ! current_user_can( 'delete_post', $post_id ) ) { + wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) ); + } + + if ( ! wp_untrash_post( $post_id ) ) { + wp_die( __( 'Error in restoring from Trash.' ) ); + } + + wp_redirect( add_query_arg( 'untrashed', 1, $sendback ) ); + exit(); + + case 'delete': + check_admin_referer( 'delete-post_' . $post_id ); + + if ( ! $post ) { + wp_die( __( 'This item has already been deleted.' ) ); + } + + if ( ! $post_type_object ) { + wp_die( __( 'Invalid post type.' ) ); + } + + if ( ! current_user_can( 'delete_post', $post_id ) ) { + wp_die( __( 'Sorry, you are not allowed to delete this item.' ) ); + } + + if ( 'attachment' === $post->post_type ) { + $force = ( ! MEDIA_TRASH ); + if ( ! wp_delete_attachment( $post_id, $force ) ) { + wp_die( __( 'Error in deleting.' ) ); + } + } else { + if ( ! wp_delete_post( $post_id, true ) ) { + wp_die( __( 'Error in deleting.' ) ); + } + } + + wp_redirect( add_query_arg( 'deleted', 1, $sendback ) ); + exit(); + + case 'preview': + check_admin_referer( 'update-post_' . $post_id ); + + $url = post_preview(); + + wp_redirect( $url ); + exit(); + + case 'toggle-custom-fields': + check_admin_referer( 'toggle-custom-fields' ); + + $current_user_id = get_current_user_id(); + if ( $current_user_id ) { + $enable_custom_fields = (bool) get_user_meta( $current_user_id, 'enable_custom_fields', true ); + update_user_meta( $current_user_id, 'enable_custom_fields', ! $enable_custom_fields ); + } + + wp_safe_redirect( wp_get_referer() ); + exit(); + + default: + /** + * Fires for a given custom post action request. + * + * The dynamic portion of the hook name, `$action`, refers to the custom post action. + * + * @since 4.6.0 + * + * @param int $post_id Post ID sent with the request. + */ + do_action( "post_action_{$action}", $post_id ); + + wp_redirect( admin_url( 'edit.php' ) ); + exit(); +} // End switch. + +require_once ABSPATH . 'wp-admin/admin-footer.php'; diff --git a/wp-admin/press-this.php b/wp-admin/press-this.php new file mode 100644 index 0000000..ebe7502 --- /dev/null +++ b/wp-admin/press-this.php @@ -0,0 +1,87 @@ +cap->create_posts ) ) { + wp_die( + __( 'Sorry, you are not allowed to create posts as this user.' ), + __( 'You need a higher level of permission.' ), + 403 + ); + } elseif ( is_plugin_active( $plugin_file ) ) { + include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php'; + $wp_press_this = new WP_Press_This_Plugin(); + $wp_press_this->html(); + } elseif ( current_user_can( 'activate_plugins' ) ) { + if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_file ) ) { + $url = wp_nonce_url( + add_query_arg( + array( + 'action' => 'activate', + 'plugin' => $plugin_file, + 'from' => 'press-this', + ), + admin_url( 'plugins.php' ) + ), + 'activate-plugin_' . $plugin_file + ); + $action = sprintf( + '%2$s', + esc_url( $url ), + __( 'Activate Press This' ) + ); + } else { + if ( is_main_site() ) { + $url = wp_nonce_url( + add_query_arg( + array( + 'action' => 'install-plugin', + 'plugin' => $plugin_slug, + 'from' => 'press-this', + ), + self_admin_url( 'update.php' ) + ), + 'install-plugin_' . $plugin_slug + ); + $action = sprintf( + '%3$s', + esc_url( $url ), + esc_attr( $plugin_slug ), + __( 'Install Now' ) + ); + } else { + $action = sprintf( + /* translators: %s: URL to Press This bookmarklet on the main site. */ + __( 'Press This is not installed. Please install Press This from the main site.' ), + get_admin_url( get_current_network_id(), 'press-this.php' ) + ); + } + } + wp_die( + __( 'The Press This plugin is required.' ) . '
          ' . $action, + __( 'Installation Required' ), + 200 + ); + } else { + wp_die( + __( 'Press This is not available. Please contact your site administrator.' ), + __( 'Installation Required' ), + 200 + ); + } +} + +wp_load_press_this(); diff --git a/wp-admin/privacy-policy-guide.php b/wp-admin/privacy-policy-guide.php new file mode 100644 index 0000000..566f3f1 --- /dev/null +++ b/wp-admin/privacy-policy-guide.php @@ -0,0 +1,36 @@ + +
          +

          + +
          + +
          +
          + +
          + +
          +
          +

          + + +

          +
          + +
          +

          + +

          +
          + + +
          + +
          +
          +

          + +

          + +

          + WordPress.org stats page.' ), + __( 'https://wordpress.org/about/stats/' ) + ); + ?> +

          + +

          + WordPress.org/about/privacy.' ), + __( 'https://wordpress.org/about/privacy/' ) + ); + ?> +

          +
          +
          + +
          + diff --git a/wp-admin/profile.php b/wp-admin/profile.php new file mode 100644 index 0000000..18fb600 --- /dev/null +++ b/wp-admin/profile.php @@ -0,0 +1,18 @@ +post_parent ) ) { + break; + } + + $post = get_post( $revision->post_parent ); + if ( ! $post ) { + break; + } + + // Restore if revisions are enabled or this is an autosave. + if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) { + $redirect = 'edit.php?post_type=' . $post->post_type; + break; + } + + // Don't allow revision restore when post is locked. + if ( wp_check_post_lock( $post->ID ) ) { + break; + } + + check_admin_referer( "restore-post_{$revision->ID}" ); + + wp_restore_post_revision( $revision->ID ); + $redirect = add_query_arg( + array( + 'message' => 5, + 'revision' => $revision->ID, + ), + get_edit_post_link( $post->ID, 'url' ) + ); + break; + case 'view': + case 'edit': + default: + $revision = wp_get_post_revision( $revision_id ); + if ( ! $revision ) { + break; + } + + $post = get_post( $revision->post_parent ); + if ( ! $post ) { + break; + } + + if ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'edit_post', $revision->post_parent ) ) { + break; + } + + // Revisions disabled and we're not looking at an autosave. + if ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) { + $redirect = 'edit.php?post_type=' . $post->post_type; + break; + } + + $post_edit_link = get_edit_post_link(); + $post_title = '' . _draft_or_post_title() . ''; + /* translators: %s: Post title. */ + $h1 = sprintf( __( 'Compare Revisions of “%s”' ), $post_title ); + $return_to_post = '' . __( '← Return to editor' ) . ''; + $title = __( 'Revisions' ); + + $redirect = false; + break; +} + +// Empty post_type means either malformed object found, or no valid parent was found. +if ( ! $redirect && empty( $post->post_type ) ) { + $redirect = 'edit.php'; +} + +if ( ! empty( $redirect ) ) { + wp_redirect( $redirect ); + exit; +} + +// This is so that the correct "Edit" menu item is selected. +if ( ! empty( $post->post_type ) && 'post' != $post->post_type ) { + $parent_file = 'edit.php?post_type=' . $post->post_type; +} else { + $parent_file = 'edit.php'; +} +$submenu_file = $parent_file; + +wp_enqueue_script( 'revisions' ); +wp_localize_script( 'revisions', '_wpRevisionsSettings', wp_prepare_revisions_for_js( $post, $revision_id, $from ) ); + +/* Revisions Help Tab */ + +$revisions_overview = '

          ' . __( 'This screen is used for managing your content revisions.' ) . '

          '; +$revisions_overview .= '

          ' . __( 'Revisions are saved copies of your post or page, which are periodically created as you update your content. The red text on the left shows the content that was removed. The green text on the right shows the content that was added.' ) . '

          '; +$revisions_overview .= '

          ' . __( 'From this screen you can review, compare, and restore revisions:' ) . '

          '; +$revisions_overview .= '
          • ' . __( 'To navigate between revisions, drag the slider handle left or right or use the Previous or Next buttons.' ) . '
          • '; +$revisions_overview .= '
          • ' . __( 'Compare two different revisions by selecting the “Compare any two revisions” box to the side.' ) . '
          • '; +$revisions_overview .= '
          • ' . __( 'To restore a revision, click Restore This Revision.' ) . '
          '; + +get_current_screen()->add_help_tab( + array( + 'id' => 'revisions-overview', + 'title' => __( 'Overview' ), + 'content' => $revisions_overview, + ) +); + +$revisions_sidebar = '

          ' . __( 'For more information:' ) . '

          '; +$revisions_sidebar .= '

          ' . __( 'Revisions Management' ) . '

          '; +$revisions_sidebar .= '

          ' . __( 'Support' ) . '

          '; + +get_current_screen()->set_help_sidebar( $revisions_sidebar ); + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +?> + +
          +

          + +
          +wp-config-sample.php' + ) + ); +} + +// Check if wp-config.php has been created. +if ( file_exists( ABSPATH . 'wp-config.php' ) ) { + wp_die( + '

          ' . sprintf( + /* translators: 1: wp-config.php, 2: install.php */ + __( 'The file %1$s already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now.' ), + 'wp-config.php', + 'install.php' + ) . '

          ' + ); +} + +// Check if wp-config.php exists above the root directory but is not part of another installation. +if ( @file_exists( ABSPATH . '../wp-config.php' ) && ! @file_exists( ABSPATH . '../wp-settings.php' ) ) { + wp_die( + '

          ' . sprintf( + /* translators: 1: wp-config.php, 2: install.php */ + __( 'The file %1$s already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now.' ), + 'wp-config.php', + 'install.php' + ) . '

          ' + ); +} + +$step = isset( $_GET['step'] ) ? (int) $_GET['step'] : -1; + +/** + * Display setup wp-config.php file header. + * + * @ignore + * @since 2.3.0 + * + * @global string $wp_local_package Locale code of the package. + * @global WP_Locale $wp_locale WordPress date and time locale object. + * + * @param string|array $body_classes + */ +function setup_config_display_header( $body_classes = array() ) { + $body_classes = (array) $body_classes; + $body_classes[] = 'wp-core-ui'; + $dir_attr = ''; + if ( is_rtl() ) { + $body_classes[] = 'rtl'; + $dir_attr = ' dir="rtl"'; + } + + header( 'Content-Type: text/html; charset=utf-8' ); + ?> + +> + + + + + <?php _e( 'WordPress › Setup Configuration File' ); ?> + + + + + Select a default language'; + echo '
          '; + wp_install_language_form( $languages ); + echo '
          '; + break; + } + } + + // Deliberately fall through if we can't reach the translations API. + + case 0: + if ( ! empty( $language ) ) { + $loaded_language = wp_download_language_pack( $language ); + if ( $loaded_language ) { + load_default_textdomain( $loaded_language ); + $GLOBALS['wp_locale'] = new WP_Locale(); + } + } + + setup_config_display_header(); + $step_1 = 'setup-config.php?step=1'; + if ( isset( $_REQUEST['noapi'] ) ) { + $step_1 .= '&noapi'; + } + if ( ! empty( $loaded_language ) ) { + $step_1 .= '&language=' . $loaded_language; + } + ?> +

          +

          +
            +
          1. +
          2. +
          3. +
          4. +
          5. +
          +

          + wp-config.php' + ); + ?> + + wp-config-sample.php', + 'wp-config.php' + ); + ?> + + We got it.' ), + __( 'https://wordpress.org/support/article/editing-wp-config-php/' ) + ); + ?> +

          +

          + +

          + +

          +
          +

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          +
          +

          ' . __( 'Try Again' ) . ''; + + if ( empty( $prefix ) ) { + wp_die( __( 'Error: "Table Prefix" must not be empty.' ) . $tryagain_link ); + } + + // Validate $prefix: it can only contain letters, numbers and underscores. + if ( preg_match( '|[^a-z0-9_]|i', $prefix ) ) { + wp_die( __( 'Error: "Table Prefix" can only contain numbers, letters, and underscores.' ) . $tryagain_link ); + } + + // Test the DB connection. + /**#@+ + * + * @ignore + */ + define( 'DB_NAME', $dbname ); + define( 'DB_USER', $uname ); + define( 'DB_PASSWORD', $pwd ); + define( 'DB_HOST', $dbhost ); + /**#@-*/ + + // Re-construct $wpdb with these new values. + unset( $wpdb ); + require_wp_db(); + + /* + * The wpdb constructor bails when WP_SETUP_CONFIG is set, so we must + * fire this manually. We'll fail here if the values are no good. + */ + $wpdb->db_connect(); + + if ( ! empty( $wpdb->error ) ) { + wp_die( $wpdb->error->get_error_message() . $tryagain_link ); + } + + $errors = $wpdb->hide_errors(); + $wpdb->query( "SELECT $prefix" ); + $wpdb->show_errors( $errors ); + if ( ! $wpdb->last_error ) { + // MySQL was able to parse the prefix as a value, which we don't want. Bail. + wp_die( __( 'Error: "Table Prefix" is invalid.' ) ); + } + + // Generate keys and salts using secure CSPRNG; fallback to API if enabled; further fallback to original wp_generate_password(). + try { + $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|'; + $max = strlen( $chars ) - 1; + for ( $i = 0; $i < 8; $i++ ) { + $key = ''; + for ( $j = 0; $j < 64; $j++ ) { + $key .= substr( $chars, random_int( 0, $max ), 1 ); + } + $secret_keys[] = $key; + } + } catch ( Exception $ex ) { + $no_api = isset( $_POST['noapi'] ); + + if ( ! $no_api ) { + $secret_keys = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' ); + } + + if ( $no_api || is_wp_error( $secret_keys ) ) { + $secret_keys = array(); + for ( $i = 0; $i < 8; $i++ ) { + $secret_keys[] = wp_generate_password( 64, true, true ); + } + } else { + $secret_keys = explode( "\n", wp_remote_retrieve_body( $secret_keys ) ); + foreach ( $secret_keys as $k => $v ) { + $secret_keys[ $k ] = substr( $v, 28, 64 ); + } + } + } + + $key = 0; + foreach ( $config_file as $line_num => $line ) { + if ( '$table_prefix =' == substr( $line, 0, 15 ) ) { + $config_file[ $line_num ] = '$table_prefix = \'' . addcslashes( $prefix, "\\'" ) . "';\r\n"; + continue; + } + + if ( ! preg_match( '/^define\(\s*\'([A-Z_]+)\',([ ]+)/', $line, $match ) ) { + continue; + } + + $constant = $match[1]; + $padding = $match[2]; + + switch ( $constant ) { + case 'DB_NAME': + case 'DB_USER': + case 'DB_PASSWORD': + case 'DB_HOST': + $config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'" . addcslashes( constant( $constant ), "\\'" ) . "' );\r\n"; + break; + case 'DB_CHARSET': + if ( 'utf8mb4' === $wpdb->charset || ( ! $wpdb->charset && $wpdb->has_cap( 'utf8mb4' ) ) ) { + $config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'utf8mb4' );\r\n"; + } + break; + case 'AUTH_KEY': + case 'SECURE_AUTH_KEY': + case 'LOGGED_IN_KEY': + case 'NONCE_KEY': + case 'AUTH_SALT': + case 'SECURE_AUTH_SALT': + case 'LOGGED_IN_SALT': + case 'NONCE_SALT': + $config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'" . $secret_keys[ $key++ ] . "' );\r\n"; + break; + } + } + unset( $line ); + + if ( ! is_writable( ABSPATH ) ) : + setup_config_display_header(); + ?> +

          + wp-config.php' ); + ?> +

          +

          + wp-config.php' ); + + $config_text = ''; + + foreach ( $config_file as $line ) { + $config_text .= htmlentities( $line, ENT_COMPAT, 'UTF-8' ); + } + ?> +

          + +

          +

          + + +

          +

          + +

          + + + + diff --git a/wp-admin/site-health-info.php b/wp-admin/site-health-info.php new file mode 100644 index 0000000..53b3360 --- /dev/null +++ b/wp-admin/site-health-info.php @@ -0,0 +1,184 @@ + +
          +
          +

          + +

          +
          + +
          +
          + +
          +
          + +
          +
          + + +
          + +
          + +
          +

          +
          + +
          + + +

          + +

          + +

          + Site Health Status page.' ), esc_url( admin_url( 'site-health.php' ) ) ); + ?> +

          +

          + +

          + +
          +
          + + +
          +
          + +
          + + $details ) { + if ( ! isset( $details['fields'] ) || empty( $details['fields'] ) ) { + continue; + } + + ?> +

          + +

          + + + +
          +
          + +check_wp_version_check_exists(); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> +
          +
          +

          + +

          +
          + +
          +
          + +
          +
          + +
          +
          + + +
          + +
          + +
          +

          +
          + +
          +
          +

          + +

          + +

          + +

          + +

          + +

          +
          + +
          +

          + +

          + +

          + +
          +

          + 0' ); + ?> +

          + +
          +
          + + +
          + +
          + +
          + + +
          + + + + $taxnow ), $sendback ); + } + + if ( 'post' !== get_current_screen()->post_type ) { + $sendback = add_query_arg( 'post_type', get_current_screen()->post_type, $sendback ); + } + + wp_redirect( esc_url_raw( $sendback ) ); + exit; +} + +$tag_ID = absint( $_REQUEST['tag_ID'] ); +$tag = get_term( $tag_ID, $taxnow, OBJECT, 'edit' ); + +if ( ! $tag instanceof WP_Term ) { + wp_die( __( 'You attempted to edit an item that doesn’t exist. Perhaps it was deleted?' ) ); +} + +$tax = get_taxonomy( $tag->taxonomy ); +$taxonomy = $tax->name; +$title = $tax->labels->edit_item; + +if ( ! in_array( $taxonomy, get_taxonomies( array( 'show_ui' => true ) ) ) || + ! current_user_can( 'edit_term', $tag->term_id ) ) { + + wp_die( + '

          ' . __( 'You need a higher level of permission.' ) . '

          ' . + '

          ' . __( 'Sorry, you are not allowed to edit this item.' ) . '

          ', + 403 + ); +} + +$post_type = get_current_screen()->post_type; + +// Default to the first object_type associated with the taxonomy if no post type was passed. +if ( empty( $post_type ) ) { + $post_type = reset( $tax->object_type ); +} + +if ( 'post' !== $post_type ) { + $parent_file = ( 'attachment' === $post_type ) ? 'upload.php' : "edit.php?post_type=$post_type"; + $submenu_file = "edit-tags.php?taxonomy=$taxonomy&post_type=$post_type"; +} elseif ( 'link_category' === $taxonomy ) { + $parent_file = 'link-manager.php'; + $submenu_file = 'edit-tags.php?taxonomy=link_category'; +} else { + $parent_file = 'edit.php'; + $submenu_file = "edit-tags.php?taxonomy=$taxonomy"; +} + +get_current_screen()->set_screen_reader_content( + array( + 'heading_pagination' => $tax->labels->items_list_navigation, + 'heading_list' => $tax->labels->items_list, + ) +); +wp_enqueue_script( 'admin-tags' ); +require_once ABSPATH . 'wp-admin/admin-header.php'; +require ABSPATH . 'wp-admin/edit-tag-form.php'; +require_once ABSPATH . 'wp-admin/admin-footer.php'; diff --git a/wp-admin/theme-editor.php b/wp-admin/theme-editor.php new file mode 100644 index 0000000..31c82ec --- /dev/null +++ b/wp-admin/theme-editor.php @@ -0,0 +1,387 @@ +' . __( 'Sorry, you are not allowed to edit templates for this site.' ) . '

          ' ); +} + +$title = __( 'Edit Themes' ); +$parent_file = 'themes.php'; + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'You can use the theme editor to edit the individual CSS and PHP files which make up your theme.' ) . '

          ' . + '

          ' . __( 'Begin by choosing a theme to edit from the dropdown menu and clicking the Select button. A list then appears of the theme’s template files. Clicking once on any file name causes the file to appear in the large Editor box.' ) . '

          ' . + '

          ' . __( 'For PHP files, you can use the Documentation dropdown to select from functions recognized in that file. Look Up takes you to a web page with reference material about that particular function.' ) . '

          ' . + '

          ' . __( 'When using a keyboard to navigate:' ) . '

          ' . + '
            ' . + '
          • ' . __( 'In the editing area, the Tab key enters a tab character.' ) . '
          • ' . + '
          • ' . __( 'To move away from this area, press the Esc key followed by the Tab key.' ) . '
          • ' . + '
          • ' . __( 'Screen reader users: when in forms mode, you may need to press the Esc key twice.' ) . '
          • ' . + '
          ' . + '

          ' . __( 'After typing in your edits, click Update File.' ) . '

          ' . + '

          ' . __( 'Advice: Think very carefully about your site crashing if you are live-editing the theme currently in use.' ) . '

          ' . + '

          ' . sprintf( + /* translators: %s: Link to documentation on child themes. */ + __( 'Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a child theme instead.' ), + __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ) + ) . '

          ' . + ( is_network_admin() ? '

          ' . __( 'Any edits to files from this screen will be reflected on all sites in the network.' ) . '

          ' : '' ), + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Theme Development' ) . '

          ' . + '

          ' . __( 'Documentation on Using Themes' ) . '

          ' . + '

          ' . __( 'Documentation on Editing Files' ) . '

          ' . + '

          ' . __( 'Documentation on Template Tags' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +wp_reset_vars( array( 'action', 'error', 'file', 'theme' ) ); + +if ( $theme ) { + $stylesheet = $theme; +} else { + $stylesheet = get_stylesheet(); +} + +$theme = wp_get_theme( $stylesheet ); + +if ( ! $theme->exists() ) { + wp_die( __( 'The requested theme does not exist.' ) ); +} + +if ( $theme->errors() && 'theme_no_stylesheet' == $theme->errors()->get_error_code() ) { + wp_die( __( 'The requested theme does not exist.' ) . ' ' . $theme->errors()->get_error_message() ); +} + +$allowed_files = array(); +$style_files = array(); +$has_templates = false; + +$file_types = wp_get_theme_file_editable_extensions( $theme ); + +foreach ( $file_types as $type ) { + switch ( $type ) { + case 'php': + $allowed_files += $theme->get_files( 'php', -1 ); + $has_templates = ! empty( $allowed_files ); + break; + case 'css': + $style_files = $theme->get_files( 'css', -1 ); + $allowed_files['style.css'] = $style_files['style.css']; + $allowed_files += $style_files; + break; + default: + $allowed_files += $theme->get_files( $type, -1 ); + break; + } +} + +// Move functions.php and style.css to the top. +if ( isset( $allowed_files['functions.php'] ) ) { + $allowed_files = array( 'functions.php' => $allowed_files['functions.php'] ) + $allowed_files; +} +if ( isset( $allowed_files['style.css'] ) ) { + $allowed_files = array( 'style.css' => $allowed_files['style.css'] ) + $allowed_files; +} + +if ( empty( $file ) ) { + $relative_file = 'style.css'; + $file = $allowed_files['style.css']; +} else { + $relative_file = wp_unslash( $file ); + $file = $theme->get_stylesheet_directory() . '/' . $relative_file; +} + +validate_file_to_edit( $file, $allowed_files ); + +// Handle fallback editing of file when JavaScript is not available. +$edit_error = null; +$posted_content = null; + +if ( 'POST' === $_SERVER['REQUEST_METHOD'] ) { + $r = wp_edit_theme_plugin_file( wp_unslash( $_POST ) ); + if ( is_wp_error( $r ) ) { + $edit_error = $r; + if ( check_ajax_referer( 'edit-theme_' . $stylesheet . '_' . $relative_file, 'nonce', false ) && isset( $_POST['newcontent'] ) ) { + $posted_content = wp_unslash( $_POST['newcontent'] ); + } + } else { + wp_redirect( + add_query_arg( + array( + 'a' => 1, // This means "success" for some reason. + 'theme' => $stylesheet, + 'file' => $relative_file, + ), + admin_url( 'theme-editor.php' ) + ) + ); + exit; + } +} + +$settings = array( + 'codeEditor' => wp_enqueue_code_editor( compact( 'file' ) ), +); +wp_enqueue_script( 'wp-theme-plugin-editor' ); +wp_add_inline_script( 'wp-theme-plugin-editor', sprintf( 'jQuery( function( $ ) { wp.themePluginEditor.init( $( "#template" ), %s ); } )', wp_json_encode( $settings ) ) ); +wp_add_inline_script( 'wp-theme-plugin-editor', 'wp.themePluginEditor.themeOrPlugin = "theme";' ); + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +update_recently_edited( $file ); + +if ( ! is_file( $file ) ) { + $error = true; +} + +$content = ''; +if ( ! empty( $posted_content ) ) { + $content = $posted_content; +} elseif ( ! $error && filesize( $file ) > 0 ) { + $f = fopen( $file, 'r' ); + $content = fread( $f, filesize( $file ) ); + + if ( '.php' == substr( $file, strrpos( $file, '.' ) ) ) { + $functions = wp_doc_link_parse( $content ); + + $docs_select = ''; + } + + $content = esc_textarea( $content ); +} + +$file_description = get_file_description( $relative_file ); +$file_show = array_search( $file, array_filter( $allowed_files ) ); +$description = esc_html( $file_description ); +if ( $file_description != $file_show ) { + $description .= ' (' . esc_html( $file_show ) . ')'; +} +?> +
          +

          + + +
          +

          +
          + +
          +

          +
          get_error_message() ? $edit_error->get_error_message() : $edit_error->get_error_code() ); ?>
          +
          + + + +
          +

          +

          + built-in CSS editor.' ), + esc_url( add_query_arg( 'autofocus[section]', 'custom_css', admin_url( 'customize.php' ) ) ) + ); + ?> +

          +
          + + +
          +
          +

          + display( 'Name' ); + if ( $description ) { + echo ': ' . $description;} + ?> +

          +
          +
          +
          + + + +
          +
          +
          +
          + +errors() ) { + echo '

          ' . __( 'This theme is broken.' ) . ' ' . $theme->errors()->get_error_message() . '

          '; +} +?> + +
          +

          +
            + parent() ) && $theme->parent() ) : ?> +
          • + %s', + self_admin_url( 'theme-editor.php?theme=' . urlencode( $theme->get_template() ) ), + $theme->parent()->display( 'Name' ) + ) + ); + ?> +
          • + +
          • +
              + +
            +
          • +
          +
          + +

          ' . __( 'File does not exist! Please double check the name and try again.' ) . '

          '; +else : + ?> +
          + +
          + + + + + +
          + + +
          + + + +
          + + +
          +
          + get_stylesheet() == get_template() ) : ?> +
          +

          + + + + +

          +
          + +
          + +

          + + +

          + +

          + Changing File Permissions for more information.' ), + __( 'https://wordpress.org/support/article/changing-file-permissions/' ) + ); + ?> +

          + +
          + + +
          + +
          + + + + $v ) { + if ( false !== strpos( $k, '/' ) ) { + unset( $installed_themes[ $k ] ); + } +} + +wp_localize_script( + 'theme', + '_wpThemeSettings', + array( + 'themes' => false, + 'settings' => array( + 'isInstall' => true, + 'canInstall' => current_user_can( 'install_themes' ), + 'installURI' => current_user_can( 'install_themes' ) ? self_admin_url( 'theme-install.php' ) : null, + 'adminUrl' => parse_url( self_admin_url(), PHP_URL_PATH ), + ), + 'l10n' => array( + 'addNew' => __( 'Add New Theme' ), + 'search' => __( 'Search Themes' ), + 'searchPlaceholder' => __( 'Search themes...' ), // Placeholder (no ellipsis). + 'upload' => __( 'Upload Theme' ), + 'back' => __( 'Back' ), + 'error' => sprintf( + /* translators: %s: Support forums URL. */ + __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), + __( 'https://wordpress.org/support/forums/' ) + ), + 'tryAgain' => __( 'Try Again' ), + /* translators: %d: Number of themes. */ + 'themesFound' => __( 'Number of Themes found: %d' ), + 'noThemesFound' => __( 'No themes found. Try a different search.' ), + 'collapseSidebar' => __( 'Collapse Sidebar' ), + 'expandSidebar' => __( 'Expand Sidebar' ), + /* translators: Accessibility text. */ + 'selectFeatureFilter' => __( 'Select one or more Theme features to filter by' ), + ), + 'installedThemes' => array_keys( $installed_themes ), + ) +); + +wp_enqueue_script( 'theme' ); +wp_enqueue_script( 'updates' ); + +if ( $tab ) { + /** + * Fires before each of the tabs are rendered on the Install Themes page. + * + * The dynamic portion of the hook name, `$tab`, refers to the current + * theme installation tab. Possible values are 'dashboard', 'search', 'upload', + * 'featured', 'new', or 'updated'. + * + * @since 2.8.0 + */ + do_action( "install_themes_pre_{$tab}" ); +} + +$help_overview = + '

          ' . sprintf( + /* translators: %s: Theme Directory URL. */ + __( 'You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the WordPress Theme Directory. These themes are designed and developed by third parties, are available free of charge, and are compatible with the license WordPress uses.' ), + __( 'https://wordpress.org/themes/' ) + ) . '

          ' . + '

          ' . __( 'You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter.' ) . ' ' . __( 'The search results will be updated as you type.' ) . '

          ' . + '

          ' . __( 'Alternately, you can browse the themes that are Featured, Popular, or Latest. When you find a theme you like, you can preview it or install it.' ) . '

          ' . + '

          ' . sprintf( + /* translators: %s: /wp-content/themes */ + __( 'You can Upload a theme manually if you have already downloaded its ZIP archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme’s folder via FTP into your %s directory.' ), + '/wp-content/themes' + ) . '

          '; + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => $help_overview, + ) +); + +$help_installing = + '

          ' . __( 'Once you have generated a list of themes, you can preview and install any of them. Click on the thumbnail of the theme you’re interested in previewing. It will open up in a full-screen Preview page to give you a better idea of how that theme will look.' ) . '

          ' . + '

          ' . __( 'To install the theme so you can preview it with your site’s content and customize its theme options, click the "Install" button at the top of the left-hand pane. The theme files will be downloaded to your website automatically. When this is complete, the theme is now available for activation, which you can do by clicking the "Activate" link, or by navigating to your Manage Themes screen and clicking the "Live Preview" link under any installed theme’s thumbnail image.' ) . '

          '; + +get_current_screen()->add_help_tab( + array( + 'id' => 'installing', + 'title' => __( 'Previewing and Installing' ), + 'content' => $help_installing, + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Adding New Themes' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +?> +
          +

          + + __( 'Upload Theme' ) ) ); + if ( ! empty( $tabs['upload'] ) && current_user_can( 'upload_themes' ) ) { + echo ' '; + } + ?> + +
          + +
          +

          +
          + +
          + +
          + +

          + +
          +
          + +
          + + + + + +
          + +
          + +

          + +

          + + + + +

          +
          + +
          +
          + + +
          + $features ) { + echo '
          '; + $feature_name = esc_html( $feature_name ); + echo '' . $feature_name . ''; + echo '
          '; + foreach ( $features as $feature => $feature_name ) { + $feature = esc_attr( $feature ); + echo ' '; + echo ''; + } + echo '
          '; + echo '
          '; + } + ?> +
          + + +
          +
          + +
          + +
          +
          +
          +

          +
          +
          + +

          + + + +
          + + + + + +' . __( 'You need a higher level of permission.' ) . '' . + '

          ' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '

          ', + 403 + ); +} + +if ( current_user_can( 'switch_themes' ) && isset( $_GET['action'] ) ) { + if ( 'activate' == $_GET['action'] ) { + check_admin_referer( 'switch-theme_' . $_GET['stylesheet'] ); + $theme = wp_get_theme( $_GET['stylesheet'] ); + + if ( ! $theme->exists() || ! $theme->is_allowed() ) { + wp_die( + '

          ' . __( 'Something went wrong.' ) . '

          ' . + '

          ' . __( 'The requested theme does not exist.' ) . '

          ', + 403 + ); + } + + switch_theme( $theme->get_stylesheet() ); + wp_redirect( admin_url( 'themes.php?activated=true' ) ); + exit; + } elseif ( 'resume' === $_GET['action'] ) { + check_admin_referer( 'resume-theme_' . $_GET['stylesheet'] ); + $theme = wp_get_theme( $_GET['stylesheet'] ); + + if ( ! current_user_can( 'resume_theme', $_GET['stylesheet'] ) ) { + wp_die( + '

          ' . __( 'You need a higher level of permission.' ) . '

          ' . + '

          ' . __( 'Sorry, you are not allowed to resume this theme.' ) . '

          ', + 403 + ); + } + + $result = resume_theme( $theme->get_stylesheet(), self_admin_url( 'themes.php?error=resuming' ) ); + + if ( is_wp_error( $result ) ) { + wp_die( $result ); + } + + wp_redirect( admin_url( 'themes.php?resumed=true' ) ); + exit; + } elseif ( 'delete' == $_GET['action'] ) { + check_admin_referer( 'delete-theme_' . $_GET['stylesheet'] ); + $theme = wp_get_theme( $_GET['stylesheet'] ); + + if ( ! current_user_can( 'delete_themes' ) ) { + wp_die( + '

          ' . __( 'You need a higher level of permission.' ) . '

          ' . + '

          ' . __( 'Sorry, you are not allowed to delete this item.' ) . '

          ', + 403 + ); + } + + if ( ! $theme->exists() ) { + wp_die( + '

          ' . __( 'Something went wrong.' ) . '

          ' . + '

          ' . __( 'The requested theme does not exist.' ) . '

          ', + 403 + ); + } + + $active = wp_get_theme(); + if ( $active->get( 'Template' ) == $_GET['stylesheet'] ) { + wp_redirect( admin_url( 'themes.php?delete-active-child=true' ) ); + } else { + delete_theme( $_GET['stylesheet'] ); + wp_redirect( admin_url( 'themes.php?deleted=true' ) ); + } + exit; + } +} + +$title = __( 'Manage Themes' ); +$parent_file = 'themes.php'; + +// Help tab: Overview. +if ( current_user_can( 'switch_themes' ) ) { + $help_overview = '

          ' . __( 'This screen is used for managing your installed themes. Aside from the default theme(s) included with your WordPress installation, themes are designed and developed by third parties.' ) . '

          ' . + '

          ' . __( 'From this screen you can:' ) . '

          ' . + '
          • ' . __( 'Hover or tap to see Activate and Live Preview buttons' ) . '
          • ' . + '
          • ' . __( 'Click on the theme to see the theme name, version, author, description, tags, and the Delete link' ) . '
          • ' . + '
          • ' . __( 'Click Customize for the current theme or Live Preview for any other theme to see a live preview' ) . '
          ' . + '

          ' . __( 'The current theme is displayed highlighted as the first theme.' ) . '

          ' . + '

          ' . __( 'The search for installed themes will search for terms in their name, description, author, or tag.' ) . ' ' . __( 'The search results will be updated as you type.' ) . '

          '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => $help_overview, + ) + ); +} // End if 'switch_themes'. + +// Help tab: Adding Themes. +if ( current_user_can( 'install_themes' ) ) { + if ( is_multisite() ) { + $help_install = '

          ' . __( 'Installing themes on Multisite can only be done from the Network Admin section.' ) . '

          '; + } else { + $help_install = '

          ' . sprintf( + /* translators: %s: https://wordpress.org/themes/ */ + __( 'If you would like to see more themes to choose from, click on the “Add New” button and you will be able to browse or search for additional themes from the WordPress Theme Directory. Themes in the WordPress Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!' ), + __( 'https://wordpress.org/themes/' ) + ) . '

          '; + } + + get_current_screen()->add_help_tab( + array( + 'id' => 'adding-themes', + 'title' => __( 'Adding Themes' ), + 'content' => $help_install, + ) + ); +} // End if 'install_themes'. + +// Help tab: Previewing and Customizing. +if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { + $help_customize = + '

          ' . __( 'Tap or hover on any theme then click the Live Preview button to see a live preview of that theme and change theme options in a separate, full-screen view. You can also find a Live Preview button at the bottom of the theme details screen. Any installed theme can be previewed and customized in this way.' ) . '

          ' . + '

          ' . __( 'The theme being previewed is fully interactive — navigate to different pages to see how the theme handles posts, archives, and other page templates. The settings may differ depending on what theme features the theme being previewed supports. To accept the new settings and activate the theme all in one step, click the Publish & Activate button above the menu.' ) . '

          ' . + '

          ' . __( 'When previewing on smaller monitors, you can use the collapse icon at the bottom of the left-hand pane. This will hide the pane, giving you more room to preview your site in the new theme. To bring the pane back, click on the collapse icon again.' ) . '

          '; + + get_current_screen()->add_help_tab( + array( + 'id' => 'customize-preview-themes', + 'title' => __( 'Previewing and Customizing' ), + 'content' => $help_customize, + ) + ); +} // End if 'edit_theme_options' && 'customize'. + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Using Themes' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +if ( current_user_can( 'switch_themes' ) ) { + $themes = wp_prepare_themes_for_js(); +} else { + $themes = wp_prepare_themes_for_js( array( wp_get_theme() ) ); +} +wp_reset_vars( array( 'theme', 'search' ) ); + +wp_localize_script( + 'theme', + '_wpThemeSettings', + array( + 'themes' => $themes, + 'settings' => array( + 'canInstall' => ( ! is_multisite() && current_user_can( 'install_themes' ) ), + 'installURI' => ( ! is_multisite() && current_user_can( 'install_themes' ) ) ? admin_url( 'theme-install.php' ) : null, + 'confirmDelete' => __( "Are you sure you want to delete this theme?\n\nClick 'Cancel' to go back, 'OK' to confirm the delete." ), + 'adminUrl' => parse_url( admin_url(), PHP_URL_PATH ), + ), + 'l10n' => array( + 'addNew' => __( 'Add New Theme' ), + 'search' => __( 'Search Installed Themes' ), + 'searchPlaceholder' => __( 'Search installed themes...' ), // Placeholder (no ellipsis). + /* translators: %d: Number of themes. */ + 'themesFound' => __( 'Number of Themes found: %d' ), + 'noThemesFound' => __( 'No themes found. Try a different search.' ), + ), + ) +); + +add_thickbox(); +wp_enqueue_script( 'theme' ); +wp_enqueue_script( 'updates' ); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
          +

          + +

          + + + + + +
          + +
          + +

          + +

          + +

          + +

          + +

          + +

          + +

          fatal error.' ); ?>

          + errors() && ( ! is_multisite() || current_user_can( 'manage_network_themes' ) ) ) { + echo '

          ' . __( 'Error:' ) . ' ' . $ct->errors()->get_error_message() . '

          '; +} + +/* +// Certain error codes are less fatal than others. We can still display theme information in most cases. +if ( ! $ct->errors() || ( 1 == count( $ct->errors()->get_error_codes() ) + && in_array( $ct->errors()->get_error_code(), array( 'theme_no_parent', 'theme_parent_invalid', 'theme_no_index' ) ) ) ) : ?> +*/ + + // Pretend you didn't see this. + $current_theme_actions = array(); +if ( is_array( $submenu ) && isset( $submenu['themes.php'] ) ) { + foreach ( (array) $submenu['themes.php'] as $item ) { + $class = ''; + if ( 'themes.php' == $item[2] || 'theme-editor.php' == $item[2] || 0 === strpos( $item[2], 'customize.php' ) ) { + continue; + } + // 0 = name, 1 = capability, 2 = file. + if ( ( strcmp( $self, $item[2] ) == 0 && empty( $parent_file ) ) || ( $parent_file && ( $item[2] == $parent_file ) ) ) { + $class = ' current'; + } + if ( ! empty( $submenu[ $item[2] ] ) ) { + $submenu[ $item[2] ] = array_values( $submenu[ $item[2] ] ); // Re-index. + $menu_hook = get_plugin_page_hook( $submenu[ $item[2] ][0][2], $item[2] ); + if ( file_exists( WP_PLUGIN_DIR . "/{$submenu[$item[2]][0][2]}" ) || ! empty( $menu_hook ) ) { + $current_theme_actions[] = "{$item[0]}"; + } else { + $current_theme_actions[] = "{$item[0]}"; + } + } elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) { + $menu_file = $item[2]; + + if ( current_user_can( 'customize' ) ) { + if ( 'custom-header' === $menu_file ) { + $current_theme_actions[] = "{$item[0]}"; + } elseif ( 'custom-background' === $menu_file ) { + $current_theme_actions[] = "{$item[0]}"; + } + } + + $pos = strpos( $menu_file, '?' ); + if ( false !== $pos ) { + $menu_file = substr( $menu_file, 0, $pos ); + } + + if ( file_exists( ABSPATH . "wp-admin/$menu_file" ) ) { + $current_theme_actions[] = "{$item[0]}"; + } else { + $current_theme_actions[] = "{$item[0]}"; + } + } + } +} + +?> + + +
          +
          + + +
          + +
          + +
          + +
          + + + +
          + +

          Update now' ); ?>

          + +

          + +
          + + + +
          + +
          + +
          + +

          + +

          + +

          + + +
          + + + + + + + + + + + + +
          +
          +
          + +
          +
          + + +

          + + true ) ); +if ( ! is_multisite() && current_user_can( 'edit_themes' ) && $broken_themes ) { + ?> + +
          +

          +

          + + + + + + + + + + + + + + + + + + + + + errors()->get_error_code() ) { + $stylesheet = $broken_theme->get_stylesheet(); + $resume_url = add_query_arg( + array( + 'action' => 'resume', + 'stylesheet' => urlencode( $stylesheet ), + ), + admin_url( 'themes.php' ) + ); + $resume_url = wp_nonce_url( $resume_url, 'resume-theme_' . $stylesheet ); + ?> + + + + get_stylesheet(); + $delete_url = add_query_arg( + array( + 'action' => 'delete', + 'stylesheet' => urlencode( $stylesheet ), + ), + admin_url( 'themes.php' ) + ); + $delete_url = wp_nonce_url( $delete_url, 'delete-theme_' . $stylesheet ); + ?> + + errors()->get_error_code() ) { + $parent_theme_name = $broken_theme->get( 'Template' ); + $parent_theme = themes_api( 'theme_information', array( 'slug' => urlencode( $parent_theme_name ) ) ); + + if ( ! is_wp_error( $parent_theme ) ) { + $install_url = add_query_arg( + array( + 'action' => 'install-theme', + 'theme' => urlencode( $parent_theme_name ), + ), + admin_url( 'update.php' ) + ); + $install_url = wp_nonce_url( $install_url, 'install-theme_' . $parent_theme_name ); + ?> + + + + +
          get( 'Name' ) ? $broken_theme->display( 'Name' ) : esc_html( $broken_theme->get_stylesheet() ); ?>errors()->get_error_message(); ?>
          +
          + + +
          + + + + + + + wp_get_update_data(), + ) +); + +require_once ABSPATH . 'wp-admin/admin-footer.php'; diff --git a/wp-admin/tools.php b/wp-admin/tools.php new file mode 100644 index 0000000..ff72cec --- /dev/null +++ b/wp-admin/tools.php @@ -0,0 +1,98 @@ +add_help_tab( + array( + 'id' => 'converter', + 'title' => __( 'Categories and Tags Converter' ), + 'content' => '

          ' . __( 'Categories have hierarchy, meaning that you can nest sub-categories. Tags do not have hierarchy and cannot be nested. Sometimes people start out using one on their posts, then later realize that the other would work better for their content.' ) . '

          ' . + '

          ' . __( 'The Categories and Tags Converter link on this screen will take you to the Import screen, where that Converter is one of the plugins you can install. Once that plugin is installed, the Activate Plugin & Run Importer link will take you to a screen where you can choose to convert tags into categories or vice versa.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Tools' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +?> +
          +

          +cap->manage_terms ) || current_user_can( $tags->cap->manage_terms ) ) : + ?> +
          +

          +

          + Categories and Tags Converter available from the Import screen.' ), + 'import.php' + ); + ?> +

          +
          + +
          +%s', $update->current, $update->locale ); + + if ( 'en_US' === $update->locale && 'en_US' === get_locale() ) { + $version_string = $update->current; + } elseif ( 'en_US' === $update->locale && $update->packages->partial && $wp_version == $update->partial_version ) { + $updates = get_core_updates(); + if ( $updates && 1 == count( $updates ) ) { + // If the only available update is a partial builds, it doesn't need a language-specific version string. + $version_string = $update->current; + } + } + + $current = false; + if ( ! isset( $update->response ) || 'latest' === $update->response ) { + $current = true; + } + $submit = __( 'Update Now' ); + $form_action = 'update-core.php?action=do-core-upgrade'; + $php_version = phpversion(); + $mysql_version = $wpdb->db_version(); + $show_buttons = true; + if ( 'development' === $update->response ) { + $message = __( 'You are using a development version of WordPress. You can update to the latest nightly build automatically:' ); + } else { + if ( $current ) { + /* translators: %s: WordPress version. */ + $message = sprintf( __( 'If you need to re-install version %s, you can do so here:' ), $version_string ); + $submit = __( 'Re-install Now' ); + $form_action = 'update-core.php?action=do-core-reinstall'; + } else { + $php_compat = version_compare( $php_version, $update->php_version, '>=' ); + if ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) ) { + $mysql_compat = true; + } else { + $mysql_compat = version_compare( $mysql_version, $update->mysql_version, '>=' ); + } + + $version_url = sprintf( + /* translators: %s: WordPress version. */ + esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ), + sanitize_title( $update->current ) + ); + + $php_update_message = '

          ' . sprintf( + /* translators: %s: URL to Update PHP page. */ + __( 'Learn more about updating PHP.' ), + esc_url( wp_get_update_php_url() ) + ); + + $annotation = wp_get_update_php_annotation(); + if ( $annotation ) { + $php_update_message .= '

          ' . $annotation . ''; + } + + if ( ! $mysql_compat && ! $php_compat ) { + $message = sprintf( + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Minimum required MySQL version number, 5: Current PHP version number, 6: Current MySQL version number. */ + __( 'You cannot update because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s.' ), + $version_url, + $update->current, + $update->php_version, + $update->mysql_version, + $php_version, + $mysql_version + ) . $php_update_message; + } elseif ( ! $php_compat ) { + $message = sprintf( + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Current PHP version number. */ + __( 'You cannot update because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s.' ), + $version_url, + $update->current, + $update->php_version, + $php_version + ) . $php_update_message; + } elseif ( ! $mysql_compat ) { + $message = sprintf( + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required MySQL version number, 4: Current MySQL version number. */ + __( 'You cannot update because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s.' ), + $version_url, + $update->current, + $update->mysql_version, + $mysql_version + ); + } else { + $message = sprintf( + /* translators: 1: URL to WordPress release notes, 2: WordPress version number including locale if necessary. */ + __( 'You can update to WordPress %2$s automatically:' ), + $version_url, + $version_string + ); + } + if ( ! $mysql_compat || ! $php_compat ) { + $show_buttons = false; + } + } + } + + echo '

          '; + echo $message; + echo '

          '; + echo '
          '; + wp_nonce_field( 'upgrade-core' ); + echo '

          '; + echo ''; + echo ''; + if ( $show_buttons ) { + if ( $first_pass ) { + submit_button( $submit, $current ? '' : 'primary regular', 'upgrade', false ); + $first_pass = false; + } else { + submit_button( $submit, '', 'upgrade', false ); + } + } + if ( 'en_US' !== $update->locale ) { + if ( ! isset( $update->dismissed ) || ! $update->dismissed ) { + submit_button( __( 'Hide this update' ), '', 'dismiss', false ); + } else { + submit_button( __( 'Bring back this update' ), '', 'undismiss', false ); + } + } + echo '

          '; + if ( 'en_US' !== $update->locale && ( ! isset( $wp_local_package ) || $wp_local_package != $update->locale ) ) { + echo '

          ' . __( 'This localized version contains both the translation and various other localization fixes.' ) . '

          '; + } elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() && ( ! $update->packages->partial && $wp_version == $update->partial_version ) ) { + // Partial builds don't need language-specific warnings. + echo '

          ' . sprintf( + /* translators: %s: WordPress version. */ + __( 'You are about to install WordPress %s in English (US). There is a chance this update will break your translation. You may prefer to wait for the localized version to be released.' ), + 'development' !== $update->response ? $update->current : '' + ) . '

          '; + } + echo '
          '; + +} + +/** + * Display dismissed updates. + * + * @since 2.7.0 + */ +function dismissed_updates() { + $dismissed = get_core_updates( + array( + 'dismissed' => true, + 'available' => false, + ) + ); + if ( $dismissed ) { + + $show_text = esc_js( __( 'Show hidden updates' ) ); + $hide_text = esc_js( __( 'Hide hidden updates' ) ); + ?> + +

          '; + echo '
            '; + foreach ( (array) $dismissed as $update ) { + echo '
          • '; + list_core_update( $update ); + echo '
          • '; + } + echo '
          '; + } +} + +/** + * Display upgrade WordPress for downloading latest or upgrading automatically form. + * + * @since 2.7.0 + * + * @global string $required_php_version The required PHP version string. + * @global string $required_mysql_version The required MySQL version string. + */ +function core_upgrade_preamble() { + global $required_php_version, $required_mysql_version; + + $wp_version = get_bloginfo( 'version' ); + $updates = get_core_updates(); + + if ( ! isset( $updates[0]->response ) || 'latest' === $updates[0]->response ) { + echo '

          '; + _e( 'You have the latest version of WordPress.' ); + + if ( wp_http_supports( array( 'ssl' ) ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $upgrader = new WP_Automatic_Updater; + $future_minor_update = (object) array( + 'current' => $wp_version . '.1.next.minor', + 'version' => $wp_version . '.1.next.minor', + 'php_version' => $required_php_version, + 'mysql_version' => $required_mysql_version, + ); + $should_auto_update = $upgrader->should_update( 'core', $future_minor_update, ABSPATH ); + if ( $should_auto_update ) { + echo ' ' . __( 'Future security updates will be applied automatically.' ); + } + } + echo '

          '; + } + + if ( isset( $updates[0]->version ) && version_compare( $updates[0]->version, $wp_version, '>' ) ) { + echo '

          '; + _e( 'Important: Before updating, please back up your database and files. For help with updates, visit the Updating WordPress documentation page.' ); + echo '

          '; + + echo '

          '; + _e( 'An updated version of WordPress is available.' ); + echo '

          '; + } + + if ( isset( $updates[0] ) && 'development' === $updates[0]->response ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $upgrader = new WP_Automatic_Updater; + if ( wp_http_supports( 'ssl' ) && $upgrader->should_update( 'core', $updates[0], ABSPATH ) ) { + echo '

          '; + echo '' . __( 'BETA TESTERS:' ) . ' ' . __( 'This site is set up to install updates of future beta versions automatically.' ); + echo '

          '; + } + } + + echo '
            '; + foreach ( (array) $updates as $update ) { + echo '
          • '; + list_core_update( $update ); + echo '
          • '; + } + echo '
          '; + // Don't show the maintenance mode notice when we are only showing a single re-install option. + if ( $updates && ( count( $updates ) > 1 || 'latest' !== $updates[0]->response ) ) { + echo '

          ' . __( 'While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, your site will return to normal.' ) . '

          '; + } elseif ( ! $updates ) { + list( $normalized_version ) = explode( '-', $wp_version ); + echo '

          ' . sprintf( + /* translators: 1: URL to About screen, 2: WordPress version. */ + __( 'Learn more about WordPress %2$s.' ), + esc_url( self_admin_url( 'about.php' ) ), + $normalized_version + ) . '

          '; + } + dismissed_updates(); +} + +/** + * Display the upgrade plugins form. + * + * @since 2.9.0 + */ +function list_plugin_updates() { + $wp_version = get_bloginfo( 'version' ); + $cur_wp_version = preg_replace( '/-.*$/', '', $wp_version ); + + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + $plugins = get_plugin_updates(); + if ( empty( $plugins ) ) { + echo '

          ' . __( 'Plugins' ) . '

          '; + echo '

          ' . __( 'Your plugins are all up to date.' ) . '

          '; + return; + } + $form_action = 'update-core.php?action=do-plugin-upgrade'; + + $core_updates = get_core_updates(); + if ( ! isset( $core_updates[0]->response ) || 'latest' === $core_updates[0]->response || 'development' === $core_updates[0]->response || version_compare( $core_updates[0]->current, $cur_wp_version, '=' ) ) { + $core_update_version = false; + } else { + $core_update_version = $core_updates[0]->current; + } + ?> +

          +

          +
          + +

          + + + + + + + + + + $plugin_data ) { + $plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true ); + + $icon = ''; + $preferred_icons = array( 'svg', '2x', '1x', 'default' ); + foreach ( $preferred_icons as $preferred_icon ) { + if ( ! empty( $plugin_data->update->icons[ $preferred_icon ] ) ) { + $icon = ''; + break; + } + } + + // Get plugin compat for running version of WordPress. + if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $cur_wp_version, '>=' ) ) { + /* translators: %s: WordPress version. */ + $compat = '
          ' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $cur_wp_version ); + } else { + /* translators: %s: WordPress version. */ + $compat = '
          ' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $cur_wp_version ); + } + // Get plugin compat for updated version of WordPress. + if ( $core_update_version ) { + if ( isset( $plugin_data->update->tested ) && version_compare( $plugin_data->update->tested, $core_update_version, '>=' ) ) { + /* translators: %s: WordPress version. */ + $compat .= '
          ' . sprintf( __( 'Compatibility with WordPress %s: 100%% (according to its author)' ), $core_update_version ); + } else { + /* translators: %s: WordPress version. */ + $compat .= '
          ' . sprintf( __( 'Compatibility with WordPress %s: Unknown' ), $core_update_version ); + } + } + + $requires_php = isset( $plugin_data->update->requires_php ) ? $plugin_data->update->requires_php : null; + $compatible_php = is_php_version_compatible( $requires_php ); + + if ( ! $compatible_php && current_user_can( 'update_php' ) ) { + $compat .= '
          ' . __( 'This update doesn’t work with your version of PHP.' ) . ' '; + $compat .= sprintf( + /* translators: %s: URL to Update PHP page. */ + __( 'Learn more about updating PHP.' ), + esc_url( wp_get_update_php_url() ) + ); + + $annotation = wp_get_update_php_annotation(); + + if ( $annotation ) { + $compat .= '

          ' . $annotation . ''; + } + } + + // Get the upgrade notice for the new plugin version. + if ( isset( $plugin_data->update->upgrade_notice ) ) { + $upgrade_notice = '
          ' . strip_tags( $plugin_data->update->upgrade_notice ); + } else { + $upgrade_notice = ''; + } + + $details_url = self_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data->update->slug . '§ion=changelog&TB_iframe=true&width=640&height=662' ); + $details = sprintf( + '%3$s', + esc_url( $details_url ), + /* translators: 1: Plugin name, 2: Version number. */ + esc_attr( sprintf( __( 'View %1$s version %2$s details' ), $plugin_data->Name, $plugin_data->update->new_version ) ), + /* translators: %s: Plugin version. */ + sprintf( __( 'View version %s details.' ), $plugin_data->update->new_version ) + ); + + $checkbox_id = 'checkbox_' . md5( $plugin_data->Name ); + ?> +

          + + + + + + + + + + + + +
          + + + + +

          + + Name; ?> + Version, + $plugin_data->update->new_version + ); + echo ' ' . $details . $compat . $upgrade_notice; + ?> +

          +

          +
          + ' . __( 'Themes' ) . ''; + echo '

          ' . __( 'Your themes are all up to date.' ) . '

          '; + return; + } + + $form_action = 'update-core.php?action=do-theme-upgrade'; + ?> +

          +

          +

          + Please Note: Any customizations you have made to theme files will be lost. Please consider using child themes for modifications.' ), + __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ) + ); + ?> +

          +
          + +

          + + + + + + + + + + $theme ) { + $checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) ); + ?> + + + + + + + + + + + + + +
          + + +

          + + display( 'Name' ); ?> + display( 'Version' ), + $theme->update['new_version'] + ); + ?> +

          +

          +
          + ' . __( 'Translations' ) . ''; + echo '

          ' . __( 'Your translations are all up to date.' ) . '

          '; + } + return; + } + + $form_action = 'update-core.php?action=do-translation-upgrade'; + ?> +

          +
          +

          + +

          +
          + new_files ) && ! $update->new_files; + + ?> +
          +

          + '; + return; + } + + if ( ! WP_Filesystem( $credentials, ABSPATH, $allow_relaxed_file_ownership ) ) { + // Failed to connect. Error and request again. + request_filesystem_credentials( $url, '', true, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership ); + echo '
          '; + return; + } + + if ( $wp_filesystem->errors->has_errors() ) { + foreach ( $wp_filesystem->errors->get_error_messages() as $message ) { + show_message( $message ); + } + echo ''; + return; + } + + if ( $reinstall ) { + $update->response = 'reinstall'; + } + + add_filter( 'update_feedback', 'show_message' ); + + $upgrader = new Core_Upgrader(); + $result = $upgrader->upgrade( + $update, + array( + 'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership, + ) + ); + + if ( is_wp_error( $result ) ) { + show_message( $result ); + if ( 'up_to_date' != $result->get_error_code() && 'locked' != $result->get_error_code() ) { + show_message( __( 'Installation Failed' ) ); + } + echo ''; + return; + } + + show_message( __( 'WordPress updated successfully' ) ); + show_message( + '' . sprintf( + /* translators: 1: WordPress version, 2: URL to About screen. */ + __( 'Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click here.' ), + $result, + esc_url( self_admin_url( 'about.php?updated' ) ) + ) . '' + ); + show_message( + '' . sprintf( + /* translators: 1: WordPress version, 2: URL to About screen. */ + __( 'Welcome to WordPress %1$s. Learn more.' ), + $result, + esc_url( self_admin_url( 'about.php?updated' ) ) + ) . '' + ); + ?> + + + ' . __( 'On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories.' ) . '

          '; +$updates_overview .= '

          ' . __( 'If an update is available, you᾿ll see a notification appear in the Toolbar and navigation menu.' ) . ' ' . __( 'Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers.' ) . '

          '; + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => $updates_overview, + ) +); + +$updates_howto = '

          ' . __( 'WordPress — Updating your WordPress installation is a simple one-click procedure: just click on the “Update Now” button when you are notified that a new version is available.' ) . ' ' . __( 'In most cases, WordPress will automatically apply maintenance and security updates in the background for you.' ) . '

          '; +$updates_howto .= '

          ' . __( 'Themes and Plugins — To update individual themes or plugins from this screen, use the checkboxes to make your selection, then click on the appropriate “Update” button. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button.' ) . '

          '; + +if ( 'en_US' !== get_locale() ) { + $updates_howto .= '

          ' . __( 'Translations — The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can click the “Update Translations” button.' ) . '

          '; +} + +get_current_screen()->add_help_tab( + array( + 'id' => 'how-to-update', + 'title' => __( 'How to Update' ), + 'content' => $updates_howto, + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Updating WordPress' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +if ( 'upgrade-core' == $action ) { + // Force a update check when requested. + $force_check = ! empty( $_GET['force-check'] ); + wp_version_check( array(), $force_check ); + + require_once ABSPATH . 'wp-admin/admin-header.php'; + ?> +
          +

          +

          '; + if ( 'themes' === $upgrade_error ) { + _e( 'Please select one or more themes to update.' ); + } else { + _e( 'Please select one or more plugins to update.' ); + } + echo '

          '; + } + + $last_update_check = false; + $current = get_site_transient( 'update_core' ); + + if ( $current && isset( $current->last_checked ) ) { + $last_update_check = $current->last_checked + get_option( 'gmt_offset' ) * HOUR_IN_SECONDS; + } + + echo '

          '; + /* translators: 1: Date, 2: Time. */ + printf( __( 'Last checked on %1$s at %2$s.' ), date_i18n( __( 'F j, Y' ), $last_update_check ), date_i18n( __( 'g:i a' ), $last_update_check ) ); + echo '   ' . __( 'Check Again' ) . ''; + echo '

          '; + + if ( current_user_can( 'update_core' ) ) { + core_upgrade_preamble(); + } + if ( current_user_can( 'update_plugins' ) ) { + list_plugin_updates(); + } + if ( current_user_can( 'update_themes' ) ) { + list_theme_updates(); + } + if ( current_user_can( 'update_languages' ) ) { + list_translation_updates(); + } + + /** + * Fires after the core, plugin, and theme update tables. + * + * @since 2.9.0 + */ + do_action( 'core_upgrade_preamble' ); + echo ''; + + wp_localize_script( + 'updates', + '_wpUpdatesItemCounts', + array( + 'totals' => wp_get_update_data(), + ) + ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + +} elseif ( 'do-core-upgrade' == $action || 'do-core-reinstall' == $action ) { + + if ( ! current_user_can( 'update_core' ) ) { + wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); + } + + check_admin_referer( 'upgrade-core' ); + + // Do the (un)dismiss actions before headers, so that they can redirect. + if ( isset( $_POST['dismiss'] ) ) { + do_dismiss_core_update(); + } elseif ( isset( $_POST['undismiss'] ) ) { + do_undismiss_core_update(); + } + + require_once ABSPATH . 'wp-admin/admin-header.php'; + if ( 'do-core-reinstall' == $action ) { + $reinstall = true; + } else { + $reinstall = false; + } + + if ( isset( $_POST['upgrade'] ) ) { + do_core_upgrade( $reinstall ); + } + + wp_localize_script( + 'updates', + '_wpUpdatesItemCounts', + array( + 'totals' => wp_get_update_data(), + ) + ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + +} elseif ( 'do-plugin-upgrade' == $action ) { + + if ( ! current_user_can( 'update_plugins' ) ) { + wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); + } + + check_admin_referer( 'upgrade-core' ); + + if ( isset( $_GET['plugins'] ) ) { + $plugins = explode( ',', $_GET['plugins'] ); + } elseif ( isset( $_POST['checked'] ) ) { + $plugins = (array) $_POST['checked']; + } else { + wp_redirect( admin_url( 'update-core.php' ) ); + exit; + } + + $url = 'update.php?action=update-selected&plugins=' . urlencode( implode( ',', $plugins ) ); + $url = wp_nonce_url( $url, 'bulk-update-plugins' ); + + $title = __( 'Update Plugins' ); + + require_once ABSPATH . 'wp-admin/admin-header.php'; + echo '
          '; + echo '

          ' . __( 'Update Plugins' ) . '

          '; + echo ''; + echo '
          '; + + wp_localize_script( + 'updates', + '_wpUpdatesItemCounts', + array( + 'totals' => wp_get_update_data(), + ) + ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + +} elseif ( 'do-theme-upgrade' == $action ) { + + if ( ! current_user_can( 'update_themes' ) ) { + wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); + } + + check_admin_referer( 'upgrade-core' ); + + if ( isset( $_GET['themes'] ) ) { + $themes = explode( ',', $_GET['themes'] ); + } elseif ( isset( $_POST['checked'] ) ) { + $themes = (array) $_POST['checked']; + } else { + wp_redirect( admin_url( 'update-core.php' ) ); + exit; + } + + $url = 'update.php?action=update-selected-themes&themes=' . urlencode( implode( ',', $themes ) ); + $url = wp_nonce_url( $url, 'bulk-update-themes' ); + + $title = __( 'Update Themes' ); + + require_once ABSPATH . 'wp-admin/admin-header.php'; + ?> +
          +

          + +
          + wp_get_update_data(), + ) + ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + +} elseif ( 'do-translation-upgrade' == $action ) { + + if ( ! current_user_can( 'update_languages' ) ) { + wp_die( __( 'Sorry, you are not allowed to update this site.' ) ); + } + + check_admin_referer( 'upgrade-translations' ); + + require_once ABSPATH . 'wp-admin/admin-header.php'; + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + + $url = 'update-core.php?action=do-translation-upgrade'; + $nonce = 'upgrade-translations'; + $title = __( 'Update Translations' ); + $context = WP_LANG_DIR; + + $upgrader = new Language_Pack_Upgrader( new Language_Pack_Upgrader_Skin( compact( 'url', 'nonce', 'title', 'context' ) ) ); + $result = $upgrader->bulk_upgrade(); + + wp_localize_script( + 'updates', + '_wpUpdatesItemCounts', + array( + 'totals' => wp_get_update_data(), + ) + ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + +} else { + /** + * Fires for each custom update action on the WordPress Updates screen. + * + * The dynamic portion of the hook name, `$action`, refers to the + * passed update action. The hook fires in lieu of all available + * default update actions. + * + * @since 3.2.0 + */ + do_action( "update-core-custom_{$action}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores +} diff --git a/wp-admin/update.php b/wp-admin/update.php new file mode 100644 index 0000000..09c5307 --- /dev/null +++ b/wp-admin/update.php @@ -0,0 +1,304 @@ +bulk_upgrade( $plugins ); + + iframe_footer(); + + } elseif ( 'upgrade-plugin' == $action ) { + if ( ! current_user_can( 'update_plugins' ) ) { + wp_die( __( 'Sorry, you are not allowed to update plugins for this site.' ) ); + } + + check_admin_referer( 'upgrade-plugin_' . $plugin ); + + $title = __( 'Update Plugin' ); + $parent_file = 'plugins.php'; + $submenu_file = 'plugins.php'; + + wp_enqueue_script( 'updates' ); + require_once ABSPATH . 'wp-admin/admin-header.php'; + + $nonce = 'upgrade-plugin_' . $plugin; + $url = 'update.php?action=upgrade-plugin&plugin=' . urlencode( $plugin ); + + $upgrader = new Plugin_Upgrader( new Plugin_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'plugin' ) ) ); + $upgrader->upgrade( $plugin ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + + } elseif ( 'activate-plugin' == $action ) { + if ( ! current_user_can( 'update_plugins' ) ) { + wp_die( __( 'Sorry, you are not allowed to update plugins for this site.' ) ); + } + + check_admin_referer( 'activate-plugin_' . $plugin ); + if ( ! isset( $_GET['failure'] ) && ! isset( $_GET['success'] ) ) { + wp_redirect( admin_url( 'update.php?action=activate-plugin&failure=true&plugin=' . urlencode( $plugin ) . '&_wpnonce=' . $_GET['_wpnonce'] ) ); + activate_plugin( $plugin, '', ! empty( $_GET['networkwide'] ), true ); + wp_redirect( admin_url( 'update.php?action=activate-plugin&success=true&plugin=' . urlencode( $plugin ) . '&_wpnonce=' . $_GET['_wpnonce'] ) ); + die(); + } + iframe_header( __( 'Plugin Reactivation' ), true ); + if ( isset( $_GET['success'] ) ) { + echo '

          ' . __( 'Plugin reactivated successfully.' ) . '

          '; + } + + if ( isset( $_GET['failure'] ) ) { + echo '

          ' . __( 'Plugin failed to reactivate due to a fatal error.' ) . '

          '; + + error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR ); + ini_set( 'display_errors', true ); // Ensure that fatal errors are displayed. + wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin ); + include WP_PLUGIN_DIR . '/' . $plugin; + } + iframe_footer(); + } elseif ( 'install-plugin' == $action ) { + + if ( ! current_user_can( 'install_plugins' ) ) { + wp_die( __( 'Sorry, you are not allowed to install plugins on this site.' ) ); + } + + include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; // For plugins_api(). + + check_admin_referer( 'install-plugin_' . $plugin ); + $api = plugins_api( + 'plugin_information', + array( + 'slug' => $plugin, + 'fields' => array( + 'sections' => false, + ), + ) + ); + + if ( is_wp_error( $api ) ) { + wp_die( $api ); + } + + $title = __( 'Plugin Installation' ); + $parent_file = 'plugins.php'; + $submenu_file = 'plugin-install.php'; + require_once ABSPATH . 'wp-admin/admin-header.php'; + + /* translators: %s: Plugin name and version. */ + $title = sprintf( __( 'Installing Plugin: %s' ), $api->name . ' ' . $api->version ); + $nonce = 'install-plugin_' . $plugin; + $url = 'update.php?action=install-plugin&plugin=' . urlencode( $plugin ); + if ( isset( $_GET['from'] ) ) { + $url .= '&from=' . urlencode( stripslashes( $_GET['from'] ) ); + } + + $type = 'web'; // Install plugin type, From Web or an Upload. + + $upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact( 'title', 'url', 'nonce', 'plugin', 'api' ) ) ); + $upgrader->install( $api->download_link ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + + } elseif ( 'upload-plugin' == $action ) { + + if ( ! current_user_can( 'upload_plugins' ) ) { + wp_die( __( 'Sorry, you are not allowed to install plugins on this site.' ) ); + } + + check_admin_referer( 'plugin-upload' ); + + $file_upload = new File_Upload_Upgrader( 'pluginzip', 'package' ); + + $title = __( 'Upload Plugin' ); + $parent_file = 'plugins.php'; + $submenu_file = 'plugin-install.php'; + require_once ABSPATH . 'wp-admin/admin-header.php'; + + /* translators: %s: File name. */ + $title = sprintf( __( 'Installing Plugin from uploaded file: %s' ), esc_html( basename( $file_upload->filename ) ) ); + $nonce = 'plugin-upload'; + $url = add_query_arg( array( 'package' => $file_upload->id ), 'update.php?action=upload-plugin' ); + $type = 'upload'; // Install plugin type, From Web or an Upload. + + $upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact( 'type', 'title', 'nonce', 'url' ) ) ); + $result = $upgrader->install( $file_upload->package ); + + if ( $result || is_wp_error( $result ) ) { + $file_upload->cleanup(); + } + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + + } elseif ( 'upgrade-theme' == $action ) { + + if ( ! current_user_can( 'update_themes' ) ) { + wp_die( __( 'Sorry, you are not allowed to update themes for this site.' ) ); + } + + check_admin_referer( 'upgrade-theme_' . $theme ); + + wp_enqueue_script( 'updates' ); + + $title = __( 'Update Theme' ); + $parent_file = 'themes.php'; + $submenu_file = 'themes.php'; + require_once ABSPATH . 'wp-admin/admin-header.php'; + + $nonce = 'upgrade-theme_' . $theme; + $url = 'update.php?action=upgrade-theme&theme=' . urlencode( $theme ); + + $upgrader = new Theme_Upgrader( new Theme_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'theme' ) ) ); + $upgrader->upgrade( $theme ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + } elseif ( 'update-selected-themes' == $action ) { + if ( ! current_user_can( 'update_themes' ) ) { + wp_die( __( 'Sorry, you are not allowed to update themes for this site.' ) ); + } + + check_admin_referer( 'bulk-update-themes' ); + + if ( isset( $_GET['themes'] ) ) { + $themes = explode( ',', stripslashes( $_GET['themes'] ) ); + } elseif ( isset( $_POST['checked'] ) ) { + $themes = (array) $_POST['checked']; + } else { + $themes = array(); + } + + $themes = array_map( 'urldecode', $themes ); + + $url = 'update.php?action=update-selected-themes&themes=' . urlencode( implode( ',', $themes ) ); + $nonce = 'bulk-update-themes'; + + wp_enqueue_script( 'updates' ); + iframe_header(); + + $upgrader = new Theme_Upgrader( new Bulk_Theme_Upgrader_Skin( compact( 'nonce', 'url' ) ) ); + $upgrader->bulk_upgrade( $themes ); + + iframe_footer(); + } elseif ( 'install-theme' == $action ) { + + if ( ! current_user_can( 'install_themes' ) ) { + wp_die( __( 'Sorry, you are not allowed to install themes on this site.' ) ); + } + + include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; // For themes_api(). + + check_admin_referer( 'install-theme_' . $theme ); + $api = themes_api( + 'theme_information', + array( + 'slug' => $theme, + 'fields' => array( + 'sections' => false, + 'tags' => false, + ), + ) + ); // Save on a bit of bandwidth. + + if ( is_wp_error( $api ) ) { + wp_die( $api ); + } + + $title = __( 'Install Themes' ); + $parent_file = 'themes.php'; + $submenu_file = 'themes.php'; + require_once ABSPATH . 'wp-admin/admin-header.php'; + + /* translators: %s: Theme name and version. */ + $title = sprintf( __( 'Installing Theme: %s' ), $api->name . ' ' . $api->version ); + $nonce = 'install-theme_' . $theme; + $url = 'update.php?action=install-theme&theme=' . urlencode( $theme ); + $type = 'web'; // Install theme type, From Web or an Upload. + + $upgrader = new Theme_Upgrader( new Theme_Installer_Skin( compact( 'title', 'url', 'nonce', 'plugin', 'api' ) ) ); + $upgrader->install( $api->download_link ); + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + + } elseif ( 'upload-theme' == $action ) { + + if ( ! current_user_can( 'upload_themes' ) ) { + wp_die( __( 'Sorry, you are not allowed to install themes on this site.' ) ); + } + + check_admin_referer( 'theme-upload' ); + + $file_upload = new File_Upload_Upgrader( 'themezip', 'package' ); + + $title = __( 'Upload Theme' ); + $parent_file = 'themes.php'; + $submenu_file = 'theme-install.php'; + + require_once ABSPATH . 'wp-admin/admin-header.php'; + + /* translators: %s: File name. */ + $title = sprintf( __( 'Installing Theme from uploaded file: %s' ), esc_html( basename( $file_upload->filename ) ) ); + $nonce = 'theme-upload'; + $url = add_query_arg( array( 'package' => $file_upload->id ), 'update.php?action=upload-theme' ); + $type = 'upload'; // Install theme type, From Web or an Upload. + + $upgrader = new Theme_Upgrader( new Theme_Installer_Skin( compact( 'type', 'title', 'nonce', 'url' ) ) ); + $result = $upgrader->install( $file_upload->package ); + + if ( $result || is_wp_error( $result ) ) { + $file_upload->cleanup(); + } + + require_once ABSPATH . 'wp-admin/admin-footer.php'; + + } else { + /** + * Fires when a custom plugin or theme update request is received. + * + * The dynamic portion of the hook name, `$action`, refers to the action + * provided in the request for wp-admin/update.php. Can be used to + * provide custom update functionality for themes and plugins. + * + * @since 2.8.0 + */ + do_action( "update-custom_{$action}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } +} diff --git a/wp-admin/upgrade-functions.php b/wp-admin/upgrade-functions.php new file mode 100644 index 0000000..0d1f499 --- /dev/null +++ b/wp-admin/upgrade-functions.php @@ -0,0 +1,12 @@ +db_version(); +$php_compat = version_compare( $php_version, $required_php_version, '>=' ); +if ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) ) { + $mysql_compat = true; +} else { + $mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' ); +} + +header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) ); +?> + +> + + + + + <?php _e( 'WordPress › Update' ); ?> + + + + + + + +

          +

          +

          + +

          ' . sprintf( __( 'Learn more about updating PHP.' ), esc_url( wp_get_update_php_url() ) ); + + $annotation = wp_get_update_php_annotation(); + if ( $annotation ) { + $php_update_message .= '

          ' . $annotation . ''; + } + + if ( ! $mysql_compat && ! $php_compat ) { + $message = sprintf( + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Minimum required MySQL version number, 5: Current PHP version number, 6: Current MySQL version number. */ + __( 'You cannot update because WordPress %2$s requires PHP version %3$s or higher and MySQL version %4$s or higher. You are running PHP version %5$s and MySQL version %6$s.' ), + $version_url, + $wp_version, + $required_php_version, + $required_mysql_version, + $php_version, + $mysql_version + ) . $php_update_message; + } elseif ( ! $php_compat ) { + $message = sprintf( + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required PHP version number, 4: Current PHP version number. */ + __( 'You cannot update because WordPress %2$s requires PHP version %3$s or higher. You are running version %4$s.' ), + $version_url, + $wp_version, + $required_php_version, + $php_version + ) . $php_update_message; + } elseif ( ! $mysql_compat ) { + $message = sprintf( + /* translators: 1: URL to WordPress release notes, 2: WordPress version number, 3: Minimum required MySQL version number, 4: Current MySQL version number. */ + __( 'You cannot update because WordPress %2$s requires MySQL version %3$s or higher. You are running version %4$s.' ), + $version_url, + $wp_version, + $required_mysql_version, + $mysql_version + ); + } + + echo '

          ' . $message . '

          '; + ?> + +

          +

          +

          +

          + +

          +

          +

          + + + diff --git a/wp-admin/upload.php b/wp-admin/upload.php new file mode 100644 index 0000000..43d192a --- /dev/null +++ b/wp-admin/upload.php @@ -0,0 +1,381 @@ + $value ) { + if ( ! $value || in_array( $key, $ignore ) ) { + unset( $vars[ $key ] ); + } + } + + wp_localize_script( + 'media-grid', + '_wpMediaGridSettings', + array( + 'adminUrl' => parse_url( self_admin_url(), PHP_URL_PATH ), + 'queryVars' => (object) $vars, + ) + ); + + get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first.' ) . '

          ' . + '

          ' . __( 'You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media.' ) . '

          ' . + '

          ' . __( 'To delete media items, click the Bulk Select button at the top of the screen. Select any items you wish to delete, then click the Delete Selected button. Clicking the Cancel Selection button takes you back to viewing your media.' ) . '

          ', + ) + ); + + get_current_screen()->add_help_tab( + array( + 'id' => 'attachment-details', + 'title' => __( 'Attachment Details' ), + 'content' => + '

          ' . __( 'Clicking an item will display an Attachment Details dialog, which allows you to preview media and make quick edits. Any changes you make to the attachment details will be automatically saved.' ) . '

          ' . + '

          ' . __( 'Use the arrow buttons at the top of the dialog, or the left and right arrow keys on your keyboard, to navigate between media items quickly.' ) . '

          ' . + '

          ' . __( 'You can also delete individual items and access the extended edit screen from the details dialog.' ) . '

          ', + ) + ); + + get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Media Library' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' + ); + + $title = __( 'Media Library' ); + $parent_file = 'upload.php'; + + require_once ABSPATH . 'wp-admin/admin-header.php'; + ?> +
          +

          + + + + + +
          + +
          +

          + Switch to the list view.' ), + 'upload.php?mode=list' + ); + ?> +

          +
          +
          + get_pagenum(); + +// Handle bulk actions. +$doaction = $wp_list_table->current_action(); + +if ( $doaction ) { + check_admin_referer( 'bulk-media' ); + + if ( 'delete_all' == $doaction ) { + $post_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type='attachment' AND post_status = 'trash'" ); + $doaction = 'delete'; + } elseif ( isset( $_REQUEST['media'] ) ) { + $post_ids = $_REQUEST['media']; + } elseif ( isset( $_REQUEST['ids'] ) ) { + $post_ids = explode( ',', $_REQUEST['ids'] ); + } + + $location = 'upload.php'; + $referer = wp_get_referer(); + if ( $referer ) { + if ( false !== strpos( $referer, 'upload.php' ) ) { + $location = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'message', 'ids', 'posted' ), $referer ); + } + } + + switch ( $doaction ) { + case 'detach': + wp_media_attach_action( $_REQUEST['parent_post_id'], 'detach' ); + break; + + case 'attach': + wp_media_attach_action( $_REQUEST['found_post_id'] ); + break; + + case 'trash': + if ( ! isset( $post_ids ) ) { + break; + } + foreach ( (array) $post_ids as $post_id ) { + if ( ! current_user_can( 'delete_post', $post_id ) ) { + wp_die( __( 'Sorry, you are not allowed to move this item to the Trash.' ) ); + } + + if ( ! wp_trash_post( $post_id ) ) { + wp_die( __( 'Error in moving to Trash.' ) ); + } + } + $location = add_query_arg( + array( + 'trashed' => count( $post_ids ), + 'ids' => join( ',', $post_ids ), + ), + $location + ); + break; + case 'untrash': + if ( ! isset( $post_ids ) ) { + break; + } + foreach ( (array) $post_ids as $post_id ) { + if ( ! current_user_can( 'delete_post', $post_id ) ) { + wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) ); + } + + if ( ! wp_untrash_post( $post_id ) ) { + wp_die( __( 'Error in restoring from Trash.' ) ); + } + } + $location = add_query_arg( 'untrashed', count( $post_ids ), $location ); + break; + case 'delete': + if ( ! isset( $post_ids ) ) { + break; + } + foreach ( (array) $post_ids as $post_id_del ) { + if ( ! current_user_can( 'delete_post', $post_id_del ) ) { + wp_die( __( 'Sorry, you are not allowed to delete this item.' ) ); + } + + if ( ! wp_delete_attachment( $post_id_del ) ) { + wp_die( __( 'Error in deleting.' ) ); + } + } + $location = add_query_arg( 'deleted', count( $post_ids ), $location ); + break; + default: + $screen = get_current_screen()->id; + + /** This action is documented in wp-admin/edit.php */ + $location = apply_filters( "handle_bulk_actions-{$screen}", $location, $doaction, $post_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } + + wp_redirect( $location ); + exit; +} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) { + wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); + exit; +} + +$wp_list_table->prepare_items(); + +$title = __( 'Media Library' ); +$parent_file = 'upload.php'; + +wp_enqueue_script( 'media' ); + +add_screen_option( 'per_page' ); + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customize the display of this screen.' ) . '

          ' . + '

          ' . __( 'You can narrow the list by file type/status or by date using the dropdown menus above the media table.' ) . '

          ' . + '

          ' . __( 'You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media.' ) . '

          ', + ) +); +get_current_screen()->add_help_tab( + array( + 'id' => 'actions-links', + 'title' => __( 'Available Actions' ), + 'content' => + '

          ' . __( 'Hovering over a row reveals action links: Edit, Delete Permanently, and View. Clicking Edit or on the media file’s name displays a simple screen to edit that individual file’s metadata. Clicking Delete Permanently will delete the file from the media library (as well as from any posts to which it is currently attached). View will take you to the display page for that file.' ) . '

          ', + ) +); +get_current_screen()->add_help_tab( + array( + 'id' => 'attaching-files', + 'title' => __( 'Attaching Files' ), + 'content' => + '

          ' . __( 'If a media file has not been attached to any content, you will see that in the Uploaded To column, and can click on Attach to launch a small popup that will allow you to search for existing content and attach the file.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Media Library' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +get_current_screen()->set_screen_reader_content( + array( + 'heading_views' => __( 'Filter media items list' ), + 'heading_pagination' => __( 'Media items list navigation' ), + 'heading_list' => __( 'Media items list' ), + ) +); + +require_once ABSPATH . 'wp-admin/admin-header.php'; +?> + +
          +

          + + + + ' . __( 'Search results for “%s”' ) . '', get_search_query() ); +} +?> + +
          + +' . __( 'Undo' ) . ''; + $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'trashed' ), $_SERVER['REQUEST_URI'] ); +} + +if ( ! empty( $_GET['untrashed'] ) && absint( $_GET['untrashed'] ) ) { + $untrashed = absint( $_GET['untrashed'] ); + if ( 1 == $untrashed ) { + $message = __( 'Media file restored from the Trash.' ); + } else { + /* translators: %s: Number of media files. */ + $message = _n( '%s media file restored from the Trash.', '%s media files restored from the Trash.', $untrashed ); + } + $message = sprintf( $message, number_format_i18n( $untrashed ) ); + $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'untrashed' ), $_SERVER['REQUEST_URI'] ); +} + +$messages[1] = __( 'Media file updated.' ); +$messages[2] = __( 'Media file permanently deleted.' ); +$messages[3] = __( 'Error saving media file.' ); +$messages[4] = __( 'Media file moved to the Trash.' ) . ' ' . __( 'Undo' ) . ''; +$messages[5] = __( 'Media file restored from the Trash.' ); + +if ( ! empty( $_GET['message'] ) && isset( $messages[ $_GET['message'] ] ) ) { + $message = $messages[ $_GET['message'] ]; + $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'message' ), $_SERVER['REQUEST_URI'] ); +} + +if ( ! empty( $message ) ) { + ?> +

          + + +
          + +views(); ?> + +display(); ?> + +
          + +
          +
          + +ID ) ); +} + +if ( ! $user_id && IS_PROFILE_PAGE ) { + $user_id = $current_user->ID; +} elseif ( ! $user_id && ! IS_PROFILE_PAGE ) { + wp_die( __( 'Invalid user ID.' ) ); +} elseif ( ! get_userdata( $user_id ) ) { + wp_die( __( 'Invalid user ID.' ) ); +} + +wp_enqueue_script( 'user-profile' ); + +if ( IS_PROFILE_PAGE ) { + $title = __( 'Profile' ); +} else { + /* translators: %s: User's display name. */ + $title = __( 'Edit User %s' ); +} + +if ( current_user_can( 'edit_users' ) && ! IS_PROFILE_PAGE ) { + $submenu_file = 'users.php'; +} else { + $submenu_file = 'profile.php'; +} + +if ( current_user_can( 'edit_users' ) && ! is_user_admin() ) { + $parent_file = 'users.php'; +} else { + $parent_file = 'profile.php'; +} + +$profile_help = '

          ' . __( 'Your profile contains information about you (your “account”) as well as some personal options related to using WordPress.' ) . '

          ' . + '

          ' . __( 'You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things. You can hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens.' ) . '

          ' . + '

          ' . __( 'You can select the language you wish to use while using the WordPress administration screen without affecting the language site visitors see.' ) . '

          ' . + '

          ' . __( 'Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts.' ) . '

          ' . + '

          ' . __( 'You can log out of other devices, such as your phone or a public computer, by clicking the Log Out Everywhere Else button.' ) . '

          ' . + '

          ' . __( 'Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so.' ) . '

          ' . + '

          ' . __( 'Remember to click the Update Profile button when you are finished.' ) . '

          '; + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => $profile_help, + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on User Profiles' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +$wp_http_referer = remove_query_arg( array( 'update', 'delete_count', 'user_id' ), $wp_http_referer ); + +$user_can_edit = current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' ); + +/** + * Filters whether to allow administrators on Multisite to edit every user. + * + * Enabling the user editing form via this filter also hinges on the user holding + * the 'manage_network_users' cap, and the logged-in user not matching the user + * profile open for editing. + * + * The filter was introduced to replace the EDIT_ANY_USER constant. + * + * @since 3.0.0 + * + * @param bool $allow Whether to allow editing of any user. Default true. + */ +if ( is_multisite() + && ! current_user_can( 'manage_network_users' ) + && $user_id != $current_user->ID + && ! apply_filters( 'enable_edit_any_user_configuration', true ) +) { + wp_die( __( 'Sorry, you are not allowed to edit this user.' ) ); +} + +// Execute confirmed email change. See send_confirmation_on_profile_email(). +if ( IS_PROFILE_PAGE && isset( $_GET['newuseremail'] ) && $current_user->ID ) { + $new_email = get_user_meta( $current_user->ID, '_new_email', true ); + if ( $new_email && hash_equals( $new_email['hash'], $_GET['newuseremail'] ) ) { + $user = new stdClass; + $user->ID = $current_user->ID; + $user->user_email = esc_html( trim( $new_email['newemail'] ) ); + if ( is_multisite() && $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $current_user->user_login ) ) ) { + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $user->user_email, $current_user->user_login ) ); + } + wp_update_user( $user ); + delete_user_meta( $current_user->ID, '_new_email' ); + wp_redirect( add_query_arg( array( 'updated' => 'true' ), self_admin_url( 'profile.php' ) ) ); + die(); + } else { + wp_redirect( add_query_arg( array( 'error' => 'new-email' ), self_admin_url( 'profile.php' ) ) ); + } +} elseif ( IS_PROFILE_PAGE && ! empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' === $_GET['dismiss'] ) { + check_admin_referer( 'dismiss-' . $current_user->ID . '_new_email' ); + delete_user_meta( $current_user->ID, '_new_email' ); + wp_redirect( add_query_arg( array( 'updated' => 'true' ), self_admin_url( 'profile.php' ) ) ); + die(); +} + +switch ( $action ) { + case 'update': + check_admin_referer( 'update-user_' . $user_id ); + + if ( ! current_user_can( 'edit_user', $user_id ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this user.' ) ); + } + + if ( IS_PROFILE_PAGE ) { + /** + * Fires before the page loads on the 'Your Profile' editing screen. + * + * The action only fires if the current user is editing their own profile. + * + * @since 2.0.0 + * + * @param int $user_id The user ID. + */ + do_action( 'personal_options_update', $user_id ); + } else { + /** + * Fires before the page loads on the 'Edit User' screen. + * + * @since 2.7.0 + * + * @param int $user_id The user ID. + */ + do_action( 'edit_user_profile_update', $user_id ); + } + + // Update the email address in signups, if present. + if ( is_multisite() ) { + $user = get_userdata( $user_id ); + + if ( $user->user_login && isset( $_POST['email'] ) && is_email( $_POST['email'] ) && $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $user->user_login ) ) ) { + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $_POST['email'], $user_login ) ); + } + } + + // Update the user. + $errors = edit_user( $user_id ); + + // Grant or revoke super admin status if requested. + if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && ! isset( $super_admins ) && empty( $_POST['super_admin'] ) == is_super_admin( $user_id ) ) { + empty( $_POST['super_admin'] ) ? revoke_super_admin( $user_id ) : grant_super_admin( $user_id ); + } + + if ( ! is_wp_error( $errors ) ) { + $redirect = add_query_arg( 'updated', true, get_edit_user_link( $user_id ) ); + if ( $wp_http_referer ) { + $redirect = add_query_arg( 'wp_http_referer', urlencode( $wp_http_referer ), $redirect ); + } + wp_redirect( $redirect ); + exit; + } + + // Intentional fall-through to display $errors. + default: + $profileuser = get_user_to_edit( $user_id ); + + if ( ! current_user_can( 'edit_user', $user_id ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this user.' ) ); + } + + $title = sprintf( $title, $profileuser->display_name ); + $sessions = WP_Session_Tokens::get_instance( $profileuser->ID ); + + require_once ABSPATH . 'wp-admin/admin-header.php'; + ?> + + ID ) && current_user_can( 'manage_network_options' ) ) { ?> +

          + + +
          + +

          + +

          + + +

          + +
          + + +
          + +

          + +
          + + +

          \n

          ", $errors->get_error_messages() ); ?>

          + + +
          +

          + +

          + + + + + + + +
          + +
          + > + + + + +

          + + +

          + +

          + + + + + + + + + + + + + + + + + + 1 && has_action( 'admin_color_scheme_picker' ) ) : ?> + + + + + 1 ?> + + + + + + + + + + + + + + + + + + + + + + + + + +

          + + + + + + + + ID ) ) : ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          + + + + + + + + + + + + + $desc ) { + ?> + + + + + + + +

          + + + + + + + + + + + + + + + + + +

          + + + + + + + + + + + + + + + + get_all() ) === 1 ) : + ?> + + + + +get_all() ) > 1 ) : ?> + + + + +get_all() ) : ?> + + + + + + + + + + + caps ) > count( $profileuser->roles ) + && apply_filters( 'additional_capabilities_display', true, $profileuser ) + ) : + ?> +

          + + + + + + + + + + + + + +
          +
          + + +' . __( 'You need a higher level of permission.' ) . '' . + '

          ' . __( 'Sorry, you are not allowed to add users to this network.' ) . '

          ', + 403 + ); + } +} elseif ( ! current_user_can( 'create_users' ) ) { + wp_die( + '

          ' . __( 'You need a higher level of permission.' ) . '

          ' . + '

          ' . __( 'Sorry, you are not allowed to create users.' ) . '

          ', + 403 + ); +} + +if ( is_multisite() ) { + add_filter( 'wpmu_signup_user_notification_email', 'admin_created_user_email' ); +} + +if ( isset( $_REQUEST['action'] ) && 'adduser' == $_REQUEST['action'] ) { + check_admin_referer( 'add-user', '_wpnonce_add-user' ); + + $user_details = null; + $user_email = wp_unslash( $_REQUEST['email'] ); + if ( false !== strpos( $user_email, '@' ) ) { + $user_details = get_user_by( 'email', $user_email ); + } else { + if ( current_user_can( 'manage_network_users' ) ) { + $user_details = get_user_by( 'login', $user_email ); + } else { + wp_redirect( add_query_arg( array( 'update' => 'enter_email' ), 'user-new.php' ) ); + die(); + } + } + + if ( ! $user_details ) { + wp_redirect( add_query_arg( array( 'update' => 'does_not_exist' ), 'user-new.php' ) ); + die(); + } + + if ( ! current_user_can( 'promote_user', $user_details->ID ) ) { + wp_die( + '

          ' . __( 'You need a higher level of permission.' ) . '

          ' . + '

          ' . __( 'Sorry, you are not allowed to add users to this network.' ) . '

          ', + 403 + ); + } + + // Adding an existing user to this blog. + $new_user_email = $user_details->user_email; + $redirect = 'user-new.php'; + $username = $user_details->user_login; + $user_id = $user_details->ID; + if ( null != $username && array_key_exists( $blog_id, get_blogs_of_user( $user_id ) ) ) { + $redirect = add_query_arg( array( 'update' => 'addexisting' ), 'user-new.php' ); + } else { + if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) { + $result = add_existing_user_to_blog( + array( + 'user_id' => $user_id, + 'role' => $_REQUEST['role'], + ) + ); + + if ( ! is_wp_error( $result ) ) { + $redirect = add_query_arg( + array( + 'update' => 'addnoconfirmation', + 'user_id' => $user_id, + ), + 'user-new.php' + ); + } else { + $redirect = add_query_arg( array( 'update' => 'could_not_add' ), 'user-new.php' ); + } + } else { + $newuser_key = wp_generate_password( 20, false ); + add_option( + 'new_user_' . $newuser_key, + array( + 'user_id' => $user_id, + 'email' => $user_details->user_email, + 'role' => $_REQUEST['role'], + ) + ); + + $roles = get_editable_roles(); + $role = $roles[ $_REQUEST['role'] ]; + + /** + * Fires immediately after a user is invited to join a site, but before the notification is sent. + * + * @since 4.4.0 + * + * @param int $user_id The invited user's ID. + * @param array $role Array containing role information for the invited user. + * @param string $newuser_key The key of the invitation. + */ + do_action( 'invite_user', $user_id, $role, $newuser_key ); + + $switched_locale = switch_to_locale( get_user_locale( $user_details ) ); + + /* translators: 1: Site title, 2: Site URL, 3: User role, 4: Activation URL. */ + $message = __( + 'Hi, + +You\'ve been invited to join \'%1$s\' at +%2$s with the role of %3$s. + +Please click the following link to confirm the invite: +%4$s' + ); + + wp_mail( + $new_user_email, + sprintf( + /* translators: Joining confirmation notification email subject. %s: Site title. */ + __( '[%s] Joining Confirmation' ), + wp_specialchars_decode( get_option( 'blogname' ) ) + ), + sprintf( + $message, + get_option( 'blogname' ), + home_url(), + wp_specialchars_decode( translate_user_role( $role['name'] ) ), + home_url( "/newbloguser/$newuser_key/" ) + ) + ); + + if ( $switched_locale ) { + restore_previous_locale(); + } + + $redirect = add_query_arg( array( 'update' => 'add' ), 'user-new.php' ); + } + } + wp_redirect( $redirect ); + die(); +} elseif ( isset( $_REQUEST['action'] ) && 'createuser' == $_REQUEST['action'] ) { + check_admin_referer( 'create-user', '_wpnonce_create-user' ); + + if ( ! current_user_can( 'create_users' ) ) { + wp_die( + '

          ' . __( 'You need a higher level of permission.' ) . '

          ' . + '

          ' . __( 'Sorry, you are not allowed to create users.' ) . '

          ', + 403 + ); + } + + if ( ! is_multisite() ) { + $user_id = edit_user(); + + if ( is_wp_error( $user_id ) ) { + $add_user_errors = $user_id; + } else { + if ( current_user_can( 'list_users' ) ) { + $redirect = 'users.php?update=add&id=' . $user_id; + } else { + $redirect = add_query_arg( 'update', 'add', 'user-new.php' ); + } + wp_redirect( $redirect ); + die(); + } + } else { + // Adding a new user to this site. + $new_user_email = wp_unslash( $_REQUEST['email'] ); + $user_details = wpmu_validate_user_signup( $_REQUEST['user_login'], $new_user_email ); + if ( is_wp_error( $user_details['errors'] ) && $user_details['errors']->has_errors() ) { + $add_user_errors = $user_details['errors']; + } else { + /** This filter is documented in wp-includes/user.php */ + $new_user_login = apply_filters( 'pre_user_login', sanitize_user( wp_unslash( $_REQUEST['user_login'] ), true ) ); + if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) { + add_filter( 'wpmu_signup_user_notification', '__return_false' ); // Disable confirmation email. + add_filter( 'wpmu_welcome_user_notification', '__return_false' ); // Disable welcome email. + } + wpmu_signup_user( + $new_user_login, + $new_user_email, + array( + 'add_to_blog' => get_current_blog_id(), + 'new_role' => $_REQUEST['role'], + ) + ); + if ( isset( $_POST['noconfirmation'] ) && current_user_can( 'manage_network_users' ) ) { + $key = $wpdb->get_var( $wpdb->prepare( "SELECT activation_key FROM {$wpdb->signups} WHERE user_login = %s AND user_email = %s", $new_user_login, $new_user_email ) ); + $new_user = wpmu_activate_signup( $key ); + if ( is_wp_error( $new_user ) ) { + $redirect = add_query_arg( array( 'update' => 'addnoconfirmation' ), 'user-new.php' ); + } elseif ( ! is_user_member_of_blog( $new_user['user_id'] ) ) { + $redirect = add_query_arg( array( 'update' => 'created_could_not_add' ), 'user-new.php' ); + } else { + $redirect = add_query_arg( + array( + 'update' => 'addnoconfirmation', + 'user_id' => $new_user['user_id'], + ), + 'user-new.php' + ); + } + } else { + $redirect = add_query_arg( array( 'update' => 'newuserconfirmation' ), 'user-new.php' ); + } + wp_redirect( $redirect ); + die(); + } + } +} + +$title = __( 'Add New User' ); +$parent_file = 'users.php'; + +$do_both = false; +if ( is_multisite() && current_user_can( 'promote_users' ) && current_user_can( 'create_users' ) ) { + $do_both = true; +} + +$help = '

          ' . __( 'To add a new user to your site, fill in the form on this screen and click the Add New User button at the bottom.' ) . '

          '; + +if ( is_multisite() ) { + $help .= '

          ' . __( 'Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user’s name to Edit the user profile under Network Admin > All Users.' ) . '

          ' . + '

          ' . __( 'New users will receive an email letting them know they’ve been added as a user for your site. This email will also contain their password. Check the box if you don’t want the user to receive a welcome email.' ) . '

          '; +} else { + $help .= '

          ' . __( 'New users are automatically assigned a password, which they can change after logging in. You can view or edit the assigned password by clicking the Show Password button. The username cannot be changed once the user has been added.' ) . '

          ' . + + '

          ' . __( 'By default, new users will receive an email letting them know they’ve been added as a user for your site. This email will also contain a password reset link. Uncheck the box if you don’t want to send the new user a welcome email.' ) . '

          '; +} + +$help .= '

          ' . __( 'Remember to click the Add New User button at the bottom of this screen when you are finished.' ) . '

          '; + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => $help, + ) +); + +get_current_screen()->add_help_tab( + array( + 'id' => 'user-roles', + 'title' => __( 'User Roles' ), + 'content' => '

          ' . __( 'Here is a basic overview of the different user roles and the permissions associated with each one:' ) . '

          ' . + '
            ' . + '
          • ' . __( 'Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content.' ) . '
          • ' . + '
          • ' . __( 'Contributors can write and manage their posts but not publish posts or upload media files.' ) . '
          • ' . + '
          • ' . __( 'Authors can publish and manage their own posts, and are able to upload files.' ) . '
          • ' . + '
          • ' . __( 'Editors can publish posts, manage posts as well as manage other people’s posts, etc.' ) . '
          • ' . + '
          • ' . __( 'Administrators have access to all the administration features.' ) . '
          • ' . + '
          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Adding New Users' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +wp_enqueue_script( 'wp-ajax-response' ); +wp_enqueue_script( 'user-profile' ); + +/** + * Filters whether to enable user auto-complete for non-super admins in Multisite. + * + * @since 3.4.0 + * + * @param bool $enable Whether to enable auto-complete for non-super admins. Default false. + */ +if ( is_multisite() && current_user_can( 'promote_users' ) && ! wp_is_large_network( 'users' ) + && ( current_user_can( 'manage_network_users' ) || apply_filters( 'autocomplete_users_for_site_admins', false ) ) +) { + wp_enqueue_script( 'user-suggest' ); +} + +require_once ABSPATH . 'wp-admin/admin-header.php'; + +if ( isset( $_GET['update'] ) ) { + $messages = array(); + if ( is_multisite() ) { + $edit_link = ''; + if ( ( isset( $_GET['user_id'] ) ) ) { + $user_id_new = absint( $_GET['user_id'] ); + if ( $user_id_new ) { + $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user_id_new ) ) ); + } + } + + switch ( $_GET['update'] ) { + case 'newuserconfirmation': + $messages[] = __( 'Invitation email sent to new user. A confirmation link must be clicked before their account is created.' ); + break; + case 'add': + $messages[] = __( 'Invitation email sent to user. A confirmation link must be clicked for them to be added to your site.' ); + break; + case 'addnoconfirmation': + $message = __( 'User has been added to your site.' ); + + if ( $edit_link ) { + $message .= sprintf( ' %s', $edit_link, __( 'Edit user' ) ); + } + + $messages[] = $message; + break; + case 'addexisting': + $messages[] = __( 'That user is already a member of this site.' ); + break; + case 'could_not_add': + $add_user_errors = new WP_Error( 'could_not_add', __( 'That user could not be added to this site.' ) ); + break; + case 'created_could_not_add': + $add_user_errors = new WP_Error( 'created_could_not_add', __( 'User has been created, but could not be added to this site.' ) ); + break; + case 'does_not_exist': + $add_user_errors = new WP_Error( 'does_not_exist', __( 'The requested user does not exist.' ) ); + break; + case 'enter_email': + $add_user_errors = new WP_Error( 'enter_email', __( 'Please enter a valid email address.' ) ); + break; + } + } else { + if ( 'add' == $_GET['update'] ) { + $messages[] = __( 'User added.' ); + } + } +} +?> +
          +

          + +

          + + +
          +
            + get_error_messages() as $err ) { + echo "
          • $err
          • \n"; + } + ?> +
          +
          +

          ' . $msg . '

          '; + } +} +?> + + +
          + get_error_messages() as $message ) { + echo "

          $message

          "; + } + ?> +
          + +
          + +' . __( 'Add Existing User' ) . ''; + } + if ( ! current_user_can( 'manage_network_users' ) ) { + echo '

          ' . __( 'Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '

          '; + $label = __( 'Email' ); + $type = 'email'; + } else { + echo '

          ' . __( 'Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '

          '; + $label = __( 'Email or Username' ); + $type = 'text'; + } + ?> +
          +> + + + + + + + + + + + + + + + + + + + + + 'addusersub' ) ); ?> +
          + ' . __( 'Add New User' ) . ''; + } + ?> +

          +
          +> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'createusersub' ) ); ?> + +
          + + +domain, $current_site->domain ) || 0 !== strcasecmp( $current_blog->path, $current_site->path ) ); + +/** + * Filters whether to redirect the request to the User Admin in Multisite. + * + * @since 3.2.0 + * + * @param bool $redirect_user_admin_request Whether the request should be redirected. + */ +$redirect_user_admin_request = apply_filters( 'redirect_user_admin_request', $redirect_user_admin_request ); + +if ( $redirect_user_admin_request ) { + wp_redirect( user_admin_url() ); + exit; +} + +unset( $redirect_user_admin_request ); diff --git a/wp-admin/user/credits.php b/wp-admin/user/credits.php new file mode 100644 index 0000000..b28461c --- /dev/null +++ b/wp-admin/user/credits.php @@ -0,0 +1,13 @@ +' . __( 'You need a higher level of permission.' ) . '' . + '

          ' . __( 'Sorry, you are not allowed to list users.' ) . '

          ', + 403 + ); +} + +$wp_list_table = _get_list_table( 'WP_Users_List_Table' ); +$pagenum = $wp_list_table->get_pagenum(); +$title = __( 'Users' ); +$parent_file = 'users.php'; + +add_screen_option( 'per_page' ); + +// Contextual help - choose Help on the top right of admin panel to preview this. +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => '

          ' . __( 'This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role.' ) . '

          ' . + '

          ' . __( 'To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section.' ) . '

          ', + ) +); + +get_current_screen()->add_help_tab( + array( + 'id' => 'screen-content', + 'title' => __( 'Screen Content' ), + 'content' => '

          ' . __( 'You can customize the display of this screen in a number of ways:' ) . '

          ' . + '
            ' . + '
          • ' . __( 'You can hide/display columns based on your needs and decide how many users to list per screen using the Screen Options tab.' ) . '
          • ' . + '
          • ' . __( 'You can filter the list of users by User Role using the text links above the users list to show All, Administrator, Editor, Author, Contributor, or Subscriber. The default view is to show all users. Unused User Roles are not listed.' ) . '
          • ' . + '
          • ' . __( 'You can view all posts made by a user by clicking on the number under the Posts column.' ) . '
          • ' . + '
          ', + ) +); + +$help = '

          ' . __( 'Hovering over a row in the users list will display action links that allow you to manage users. You can perform the following actions:' ) . '

          ' . + '
            ' . + '
          • ' . __( 'Edit takes you to the editable profile screen for that user. You can also reach that screen by clicking on the username.' ) . '
          • '; + +if ( is_multisite() ) { + $help .= '
          • ' . __( 'Remove allows you to remove a user from your site. It does not delete their content. You can also remove multiple users at once by using Bulk Actions.' ) . '
          • '; +} else { + $help .= '
          • ' . __( 'Delete brings you to the Delete Users screen for confirmation, where you can permanently remove a user from your site and delete their content. You can also delete multiple users at once by using Bulk Actions.' ) . '
          • '; +} + +$help .= '
          '; + +get_current_screen()->add_help_tab( + array( + 'id' => 'action-links', + 'title' => __( 'Available Actions' ), + 'content' => $help, + ) +); +unset( $help ); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Managing Users' ) . '

          ' . + '

          ' . __( 'Descriptions of Roles and Capabilities' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +get_current_screen()->set_screen_reader_content( + array( + 'heading_views' => __( 'Filter users list' ), + 'heading_pagination' => __( 'Users list navigation' ), + 'heading_list' => __( 'Users list' ), + ) +); + +if ( empty( $_REQUEST ) ) { + $referer = ''; +} elseif ( isset( $_REQUEST['wp_http_referer'] ) ) { + $redirect = remove_query_arg( array( 'wp_http_referer', 'updated', 'delete_count' ), wp_unslash( $_REQUEST['wp_http_referer'] ) ); + $referer = ''; +} else { + $redirect = 'users.php'; + $referer = ''; +} + +$update = ''; + +switch ( $wp_list_table->current_action() ) { + + /* Bulk Dropdown menu Role changes */ + case 'promote': + check_admin_referer( 'bulk-users' ); + + if ( ! current_user_can( 'promote_users' ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this user.' ), 403 ); + } + + if ( empty( $_REQUEST['users'] ) ) { + wp_redirect( $redirect ); + exit(); + } + + $editable_roles = get_editable_roles(); + $role = false; + if ( ! empty( $_REQUEST['new_role2'] ) ) { + $role = $_REQUEST['new_role2']; + } elseif ( ! empty( $_REQUEST['new_role'] ) ) { + $role = $_REQUEST['new_role']; + } + + if ( ! $role || empty( $editable_roles[ $role ] ) ) { + wp_die( __( 'Sorry, you are not allowed to give users that role.' ), 403 ); + } + + $userids = $_REQUEST['users']; + $update = 'promote'; + foreach ( $userids as $id ) { + $id = (int) $id; + + if ( ! current_user_can( 'promote_user', $id ) ) { + wp_die( __( 'Sorry, you are not allowed to edit this user.' ), 403 ); + } + + // The new role of the current user must also have the promote_users cap or be a multisite super admin. + if ( $id == $current_user->ID && ! $wp_roles->role_objects[ $role ]->has_cap( 'promote_users' ) + && ! ( is_multisite() && current_user_can( 'manage_network_users' ) ) ) { + $update = 'err_admin_role'; + continue; + } + + // If the user doesn't already belong to the blog, bail. + if ( is_multisite() && ! is_user_member_of_blog( $id ) ) { + wp_die( + '

          ' . __( 'Something went wrong.' ) . '

          ' . + '

          ' . __( 'One of the selected users is not a member of this site.' ) . '

          ', + 403 + ); + } + + $user = get_userdata( $id ); + $user->set_role( $role ); + } + + wp_redirect( add_query_arg( 'update', $update, $redirect ) ); + exit(); + + case 'dodelete': + if ( is_multisite() ) { + wp_die( __( 'User deletion is not allowed from this screen.' ), 400 ); + } + + check_admin_referer( 'delete-users' ); + + if ( empty( $_REQUEST['users'] ) ) { + wp_redirect( $redirect ); + exit(); + } + + $userids = array_map( 'intval', (array) $_REQUEST['users'] ); + + if ( empty( $_REQUEST['delete_option'] ) ) { + $url = self_admin_url( 'users.php?action=delete&users[]=' . implode( '&users[]=', $userids ) . '&error=true' ); + $url = str_replace( '&', '&', wp_nonce_url( $url, 'bulk-users' ) ); + wp_redirect( $url ); + exit; + } + + if ( ! current_user_can( 'delete_users' ) ) { + wp_die( __( 'Sorry, you are not allowed to delete users.' ), 403 ); + } + + $update = 'del'; + $delete_count = 0; + + foreach ( $userids as $id ) { + if ( ! current_user_can( 'delete_user', $id ) ) { + wp_die( __( 'Sorry, you are not allowed to delete that user.' ), 403 ); + } + + if ( $id == $current_user->ID ) { + $update = 'err_admin_del'; + continue; + } + switch ( $_REQUEST['delete_option'] ) { + case 'delete': + wp_delete_user( $id ); + break; + case 'reassign': + wp_delete_user( $id, $_REQUEST['reassign_user'] ); + break; + } + ++$delete_count; + } + + $redirect = add_query_arg( + array( + 'delete_count' => $delete_count, + 'update' => $update, + ), + $redirect + ); + wp_redirect( $redirect ); + exit(); + + case 'delete': + if ( is_multisite() ) { + wp_die( __( 'User deletion is not allowed from this screen.' ), 400 ); + } + + check_admin_referer( 'bulk-users' ); + + if ( empty( $_REQUEST['users'] ) && empty( $_REQUEST['user'] ) ) { + wp_redirect( $redirect ); + exit(); + } + + if ( ! current_user_can( 'delete_users' ) ) { + $errors = new WP_Error( 'edit_users', __( 'Sorry, you are not allowed to delete users.' ) ); + } + + if ( empty( $_REQUEST['users'] ) ) { + $userids = array( intval( $_REQUEST['user'] ) ); + } else { + $userids = array_map( 'intval', (array) $_REQUEST['users'] ); + } + + $all_userids = $userids; + + if ( in_array( $current_user->ID, $userids ) ) { + $userids = array_diff( $userids, array( $current_user->ID ) ); + } + + /** + * Filters whether the users being deleted have additional content + * associated with them outside of the `post_author` and `link_owner` relationships. + * + * @since 5.2.0 + * + * @param boolean $users_have_additional_content Whether the users have additional content. Default false. + * @param int[] $userids Array of IDs for users being deleted. + */ + $users_have_content = (bool) apply_filters( 'users_have_additional_content', false, $userids ); + + if ( $userids && ! $users_have_content ) { + if ( $wpdb->get_var( "SELECT ID FROM {$wpdb->posts} WHERE post_author IN( " . implode( ',', $userids ) . ' ) LIMIT 1' ) ) { + $users_have_content = true; + } elseif ( $wpdb->get_var( "SELECT link_id FROM {$wpdb->links} WHERE link_owner IN( " . implode( ',', $userids ) . ' ) LIMIT 1' ) ) { + $users_have_content = true; + } + } + + if ( $users_have_content ) { + add_action( 'admin_head', 'delete_users_add_js' ); + } + + require_once ABSPATH . 'wp-admin/admin-header.php'; + ?> +
          + + + +
          +

          + +
          +

          +
          + + + +

          + +

          + + +
            + ID ) { + /* translators: 1: User ID, 2: User login. */ + echo '
          • ' . sprintf( __( 'ID #%1$s: %2$s The current user will not be deleted.' ), $id, $user->user_login ) . "
          • \n"; + } else { + /* translators: 1: User ID, 2: User login. */ + echo '
          • ' . sprintf( __( 'ID #%1$s: %2$s' ), $id, $user->user_login ) . "
          • \n"; + $go_delete++; + } + } + ?> +
          + + + + +

          + +

          + +
            +
          • +
          • + ' . __( 'Attribute all content to:' ) . ' '; + wp_dropdown_users( + array( + 'name' => 'reassign_user', + 'exclude' => $userids, + 'show' => 'display_name_with_login', + ) + ); + ?> +
          • +
          + + + + +

          + +
          +
          + $update ), $redirect ); + wp_redirect( $redirect ); + exit; + + case 'remove': + check_admin_referer( 'bulk-users' ); + + if ( ! is_multisite() ) { + wp_die( __( 'You can’t remove users.' ), 400 ); + } + + if ( empty( $_REQUEST['users'] ) && empty( $_REQUEST['user'] ) ) { + wp_redirect( $redirect ); + exit(); + } + + if ( ! current_user_can( 'remove_users' ) ) { + $error = new WP_Error( 'edit_users', __( 'Sorry, you are not allowed to remove users.' ) ); + } + + if ( empty( $_REQUEST['users'] ) ) { + $userids = array( intval( $_REQUEST['user'] ) ); + } else { + $userids = $_REQUEST['users']; + } + + require_once ABSPATH . 'wp-admin/admin-header.php'; + ?> +
          + + + +
          +

          + + +

          + +

          + + +
            + ' . sprintf( __( 'ID #%1$s: %2$s Sorry, you are not allowed to remove this user.' ), $id, $user->user_login ) . "\n"; + } else { + /* translators: 1: User ID, 2: User login. */ + echo "
          • " . sprintf( __( 'ID #%1$s: %2$s' ), $id, $user->user_login ) . "
          • \n"; + $go_remove = true; + } + } + ?> +
          + + + + +

          + +
          +
          + current_action() && ! empty( $_REQUEST['users'] ) ) { + $screen = get_current_screen()->id; + $sendback = wp_get_referer(); + $userids = $_REQUEST['users']; + + /** This action is documented in wp-admin/edit.php */ + $sendback = apply_filters( "handle_bulk_actions-{$screen}", $sendback, $wp_list_table->current_action(), $userids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + wp_safe_redirect( $sendback ); + exit; + } + + $wp_list_table->prepare_items(); + $total_pages = $wp_list_table->get_pagination_arg( 'total_pages' ); + if ( $pagenum > $total_pages && $total_pages > 0 ) { + wp_redirect( add_query_arg( 'paged', $total_pages ) ); + exit; + } + + require_once ABSPATH . 'wp-admin/admin-header.php'; + + $messages = array(); + if ( isset( $_GET['update'] ) ) : + switch ( $_GET['update'] ) { + case 'del': + case 'del_many': + $delete_count = isset( $_GET['delete_count'] ) ? (int) $_GET['delete_count'] : 0; + if ( 1 == $delete_count ) { + $message = __( 'User deleted.' ); + } else { + /* translators: %s: Number of users. */ + $message = _n( '%s user deleted.', '%s users deleted.', $delete_count ); + } + $messages[] = '

          ' . sprintf( $message, number_format_i18n( $delete_count ) ) . '

          '; + break; + case 'add': + $message = __( 'New user created.' ); + + $user_id = isset( $_GET['id'] ) ? $_GET['id'] : false; + if ( $user_id && current_user_can( 'edit_user', $user_id ) ) { + $message .= sprintf( + ' %s', + esc_url( + add_query_arg( + 'wp_http_referer', + urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), + self_admin_url( 'user-edit.php?user_id=' . $user_id ) + ) + ), + __( 'Edit user' ) + ); + } + + $messages[] = '

          ' . $message . '

          '; + break; + case 'promote': + $messages[] = '

          ' . __( 'Changed roles.' ) . '

          '; + break; + case 'err_admin_role': + $messages[] = '

          ' . __( 'The current user’s role must have user editing capabilities.' ) . '

          '; + $messages[] = '

          ' . __( 'Other user roles have been changed.' ) . '

          '; + break; + case 'err_admin_del': + $messages[] = '

          ' . __( 'You can’t delete the current user.' ) . '

          '; + $messages[] = '

          ' . __( 'Other users have been deleted.' ) . '

          '; + break; + case 'remove': + $messages[] = '

          ' . __( 'User removed from this site.' ) . '

          '; + break; + case 'err_admin_remove': + $messages[] = '

          ' . __( "You can't remove the current user." ) . '

          '; + $messages[] = '

          ' . __( 'Other users have been removed.' ) . '

          '; + break; + } + endif; + ?> + + +
          +
            + get_error_messages() as $err ) { + echo "
          • $err
          • \n"; + } + ?> +
          +
          + + +
          +

          + +

          + + + + + + ' . __( 'Search results for “%s”' ) . '', esc_html( $usersearch ) ); +} +?> + +
          + + views(); ?> + +
          + + search_box( __( 'Search Users' ), 'user' ); ?> + + + + + + display(); ?> +
          + +
          +
          + ' . __( 'You need a higher level of permission.' ) . '' . + '

          ' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '

          ', + 403 + ); +} + +$widgets_access = get_user_setting( 'widgets_access' ); +if ( isset( $_GET['widgets-access'] ) ) { + check_admin_referer( 'widgets-access' ); + + $widgets_access = 'on' === $_GET['widgets-access'] ? 'on' : 'off'; + set_user_setting( 'widgets_access', $widgets_access ); +} + +if ( 'on' === $widgets_access ) { + add_filter( 'admin_body_class', 'wp_widgets_access_body_class' ); +} else { + wp_enqueue_script( 'admin-widgets' ); + + if ( wp_is_mobile() ) { + wp_enqueue_script( 'jquery-touch-punch' ); + } +} + +/** + * Fires early before the Widgets administration screen loads, + * after scripts are enqueued. + * + * @since 2.2.0 + */ +do_action( 'sidebar_admin_setup' ); + +$title = __( 'Widgets' ); +$parent_file = 'themes.php'; + +get_current_screen()->add_help_tab( + array( + 'id' => 'overview', + 'title' => __( 'Overview' ), + 'content' => + '

          ' . __( 'Widgets are independent sections of content that can be placed into any widgetized area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them.' ) . '

          +

          ' . __( 'The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget.' ) . '

          ', + ) +); +get_current_screen()->add_help_tab( + array( + 'id' => 'removing-reusing', + 'title' => __( 'Removing and Reusing' ), + 'content' => + '

          ' . __( 'If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas.' ) . '

          +

          ' . __( 'Widgets may be used multiple times. You can give each widget a title, to display on your site, but it’s not required.' ) . '

          +

          ' . __( 'Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop.' ) . '

          ', + ) +); +get_current_screen()->add_help_tab( + array( + 'id' => 'missing-widgets', + 'title' => __( 'Missing Widgets' ), + 'content' => + '

          ' . __( 'Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area.' ) . '

          ' . + '

          ' . __( 'When changing themes, there is often some variation in the number and setup of widget areas/sidebars and sometimes these conflicts make the transition a bit less smooth. If you changed themes and seem to be missing widgets, scroll down on this screen to the Inactive Widgets area, where all of your widgets and their settings will have been saved.' ) . '

          ', + ) +); + +get_current_screen()->set_help_sidebar( + '

          ' . __( 'For more information:' ) . '

          ' . + '

          ' . __( 'Documentation on Widgets' ) . '

          ' . + '

          ' . __( 'Support' ) . '

          ' +); + +if ( ! current_theme_supports( 'widgets' ) ) { + wp_die( __( 'The theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions.' ) ); +} + +// These are the widgets grouped by sidebar. +$sidebars_widgets = wp_get_sidebars_widgets(); + +if ( empty( $sidebars_widgets ) ) { + $sidebars_widgets = wp_get_widget_defaults(); +} + +foreach ( $sidebars_widgets as $sidebar_id => $widgets ) { + if ( 'wp_inactive_widgets' === $sidebar_id ) { + continue; + } + + if ( ! is_registered_sidebar( $sidebar_id ) ) { + if ( ! empty( $widgets ) ) { // Register the inactive_widgets area as sidebar. + register_sidebar( + array( + 'name' => __( 'Inactive Sidebar (not used)' ), + 'id' => $sidebar_id, + 'class' => 'inactive-sidebar orphan-sidebar', + 'description' => __( 'This sidebar is no longer available and does not show anywhere on your site. Remove each of the widgets below to fully remove this inactive sidebar.' ), + 'before_widget' => '', + 'after_widget' => '', + 'before_title' => '', + 'after_title' => '', + ) + ); + } else { + unset( $sidebars_widgets[ $sidebar_id ] ); + } + } +} + +// Register the inactive_widgets area as sidebar. +register_sidebar( + array( + 'name' => __( 'Inactive Widgets' ), + 'id' => 'wp_inactive_widgets', + 'class' => 'inactive-sidebar', + 'description' => __( 'Drag widgets here to remove them from the sidebar but keep their settings.' ), + 'before_widget' => '', + 'after_widget' => '', + 'before_title' => '', + 'after_title' => '', + ) +); + +retrieve_widgets(); + +// We're saving a widget without JS. +if ( isset( $_POST['savewidget'] ) || isset( $_POST['removewidget'] ) ) { + $widget_id = $_POST['widget-id']; + check_admin_referer( "save-delete-widget-$widget_id" ); + + $number = isset( $_POST['multi_number'] ) ? (int) $_POST['multi_number'] : ''; + if ( $number ) { + foreach ( $_POST as $key => $val ) { + if ( is_array( $val ) && preg_match( '/__i__|%i%/', key( $val ) ) ) { + $_POST[ $key ] = array( $number => array_shift( $val ) ); + break; + } + } + } + + $sidebar_id = $_POST['sidebar']; + $position = isset( $_POST[ $sidebar_id . '_position' ] ) ? (int) $_POST[ $sidebar_id . '_position' ] - 1 : 0; + + $id_base = $_POST['id_base']; + $sidebar = isset( $sidebars_widgets[ $sidebar_id ] ) ? $sidebars_widgets[ $sidebar_id ] : array(); + + // Delete. + if ( isset( $_POST['removewidget'] ) && $_POST['removewidget'] ) { + + if ( ! in_array( $widget_id, $sidebar, true ) ) { + wp_redirect( admin_url( 'widgets.php?error=0' ) ); + exit; + } + + $sidebar = array_diff( $sidebar, array( $widget_id ) ); + $_POST = array( + 'sidebar' => $sidebar_id, + 'widget-' . $id_base => array(), + 'the-widget-id' => $widget_id, + 'delete_widget' => '1', + ); + + /** + * Fires immediately after a widget has been marked for deletion. + * + * @since 4.4.0 + * + * @param string $widget_id ID of the widget marked for deletion. + * @param string $sidebar_id ID of the sidebar the widget was deleted from. + * @param string $id_base ID base for the widget. + */ + do_action( 'delete_widget', $widget_id, $sidebar_id, $id_base ); + } + + $_POST['widget-id'] = $sidebar; + + foreach ( (array) $wp_registered_widget_updates as $name => $control ) { + if ( $name !== $id_base || ! is_callable( $control['callback'] ) ) { + continue; + } + + ob_start(); + call_user_func_array( $control['callback'], $control['params'] ); + ob_end_clean(); + + break; + } + + $sidebars_widgets[ $sidebar_id ] = $sidebar; + + // Remove old position. + if ( ! isset( $_POST['delete_widget'] ) ) { + foreach ( $sidebars_widgets as $key => $sb ) { + if ( is_array( $sb ) ) { + $sidebars_widgets[ $key ] = array_diff( $sb, array( $widget_id ) ); + } + } + array_splice( $sidebars_widgets[ $sidebar_id ], $position, 0, $widget_id ); + } + + wp_set_sidebars_widgets( $sidebars_widgets ); + wp_redirect( admin_url( 'widgets.php?message=0' ) ); + exit; +} + +// Remove inactive widgets without JS. +if ( isset( $_POST['removeinactivewidgets'] ) ) { + check_admin_referer( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' ); + + if ( $_POST['removeinactivewidgets'] ) { + foreach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) { + $pieces = explode( '-', $widget_id ); + $multi_number = array_pop( $pieces ); + $id_base = implode( '-', $pieces ); + $widget = get_option( 'widget_' . $id_base ); + unset( $widget[ $multi_number ] ); + update_option( 'widget_' . $id_base, $widget ); + unset( $sidebars_widgets['wp_inactive_widgets'][ $key ] ); + } + + wp_set_sidebars_widgets( $sidebars_widgets ); + } + + wp_redirect( admin_url( 'widgets.php?message=0' ) ); + exit; +} + +// Output the widget form without JS. +if ( isset( $_GET['editwidget'] ) && $_GET['editwidget'] ) { + $widget_id = $_GET['editwidget']; + + if ( isset( $_GET['addnew'] ) ) { + // Default to the first sidebar. + $keys = array_keys( $wp_registered_sidebars ); + $sidebar = reset( $keys ); + + if ( isset( $_GET['base'] ) && isset( $_GET['num'] ) ) { // Multi-widget. + // Copy minimal info from an existing instance of this widget to a new instance. + foreach ( $wp_registered_widget_controls as $control ) { + if ( $_GET['base'] === $control['id_base'] ) { + $control_callback = $control['callback']; + $multi_number = (int) $_GET['num']; + $control['params'][0]['number'] = -1; + $control['id'] = $control['id_base'] . '-' . $multi_number; + $widget_id = $control['id']; + $wp_registered_widget_controls[ $control['id'] ] = $control; + break; + } + } + } + } + + if ( isset( $wp_registered_widget_controls[ $widget_id ] ) && ! isset( $control ) ) { + $control = $wp_registered_widget_controls[ $widget_id ]; + $control_callback = $control['callback']; + } elseif ( ! isset( $wp_registered_widget_controls[ $widget_id ] ) && isset( $wp_registered_widgets[ $widget_id ] ) ) { + $name = esc_html( strip_tags( $wp_registered_widgets[ $widget_id ]['name'] ) ); + } + + if ( ! isset( $name ) ) { + $name = esc_html( strip_tags( $control['name'] ) ); + } + + if ( ! isset( $sidebar ) ) { + $sidebar = isset( $_GET['sidebar'] ) ? $_GET['sidebar'] : 'wp_inactive_widgets'; + } + + if ( ! isset( $multi_number ) ) { + $multi_number = isset( $control['params'][0]['number'] ) ? $control['params'][0]['number'] : ''; + } + + $id_base = isset( $control['id_base'] ) ? $control['id_base'] : $control['id']; + + // Show the widget form. + $width = ' style="width:' . max( $control['width'], 350 ) . 'px"'; + $key = isset( $_GET['key'] ) ? (int) $_GET['key'] : 0; + + require_once ABSPATH . 'wp-admin/admin-header.php'; ?> +
          +

          +
          > +

          + +

          + +
          +
          + ' . __( 'There are no options for this widget.' ) . "

          \n"; + } + ?> +
          + +

          +
          + + $sbvalue ) { + echo "\t\t\n"; + } + ?> +
          "; + if ( 'wp_inactive_widgets' === $sbname || 'orphaned_widgets' === substr( $sbname, 0, 16 ) ) { + echo ' '; + } else { + if ( ! isset( $sidebars_widgets[ $sbname ] ) || ! is_array( $sidebars_widgets[ $sbname ] ) ) { + $j = 1; + $sidebars_widgets[ $sbname ] = array(); + } else { + $j = count( $sidebars_widgets[ $sbname ] ); + if ( isset( $_GET['addnew'] ) || ! in_array( $widget_id, $sidebars_widgets[ $sbname ], true ) ) { + $j++; + } + } + $selected = ''; + echo "\t\t\n"; + } + echo "
          +
          + +
          + + + + + + + +
          +
          +
          +
          +
          + + +
          +

          + +

          + +%2$s', + esc_url( + add_query_arg( + array( + array( 'autofocus' => array( 'panel' => 'widgets' ) ), + 'return' => urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ), + ), + admin_url( 'customize.php' ) + ) + ), + __( 'Manage with Live Preview' ) + ); +} + +$nonce = wp_create_nonce( 'widgets-access' ); +?> + + +
          + + +

          + + +

          + + + + +
          +
          +
          + +
          + +
          + +
          +
          +
          +
          +
          + + $registered_sidebar ) { + if ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) { + $wrap_class = 'widgets-holder-wrap'; + if ( ! empty( $registered_sidebar['class'] ) ) { + $wrap_class .= ' ' . $registered_sidebar['class']; + } + + $is_inactive_widgets = 'wp_inactive_widgets' === $registered_sidebar['id']; + ?> +
          +
          + + + +
          +
          +

          + 'inactive-widgets-control-remove' ); + + if ( empty( $sidebars_widgets['wp_inactive_widgets'] ) ) { + $attributes['disabled'] = ''; + } + + submit_button( __( 'Clear Inactive Widgets' ), 'delete', 'removeinactivewidgets', false, $attributes ); + ?> + +

          + +
          +
          + +
          + +

          + +
          + +
          +
          + 1 ) { + $split = (int) ceil( $sidebars_count / 2 ); +} else { + $single_sidebar_class = ' single-sidebar'; +} + +?> +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          +
            +
            + + +
            +
            + +get_error_data() ); + if ( ! empty( $data ) ) { + wp_die( + '

            ' . $comment->get_error_message() . '

            ', + __( 'Comment Submission Failure' ), + array( + 'response' => $data, + 'back_link' => true, + ) + ); + } else { + exit; + } +} + +$user = wp_get_current_user(); +$cookies_consent = ( isset( $_POST['wp-comment-cookies-consent'] ) ); + +/** + * Perform other actions when comment cookies are set. + * + * @since 3.4.0 + * @since 4.9.6 The `$cookies_consent` parameter was added. + * + * @param WP_Comment $comment Comment object. + * @param WP_User $user Comment author's user object. The user may not exist. + * @param boolean $cookies_consent Comment author's consent to store cookies. + */ +do_action( 'set_comment_cookies', $comment, $user, $cookies_consent ); + +$location = empty( $_POST['redirect_to'] ) ? get_comment_link( $comment ) : $_POST['redirect_to'] . '#comment-' . $comment->comment_ID; + +// If user didn't consent to cookies, add specific query arguments to display the awaiting moderation message. +if ( ! $cookies_consent && 'unapproved' === wp_get_comment_status( $comment ) && ! empty( $comment->comment_author_email ) ) { + $location = add_query_arg( + array( + 'unapproved' => $comment->comment_ID, + 'moderation-hash' => wp_hash( $comment->comment_date_gmt ), + ), + $location + ); +} + +/** + * Filters the location URI to send the commenter after posting. + * + * @since 2.0.5 + * + * @param string $location The 'redirect_to' URI sent via $_POST. + * @param WP_Comment $comment Comment object. + */ +$location = apply_filters( 'comment_post_redirect', $location, $comment ); + +wp_safe_redirect( $location ); +exit; diff --git a/wp-config-sample.php b/wp-config-sample.php new file mode 100644 index 0000000..22881c7 --- /dev/null +++ b/wp-config-sample.php @@ -0,0 +1,98 @@ +load(); + + +// Custom Dotenv Boolean Support +if (! function_exists('evalBool')) { + function evalBool($value) + { + return (strcasecmp($value, 'true') ? false : true); + } +} + + +/** + * La configuration de base de votre installation WordPress. + * + * Ce fichier est utilisé par le script de création de wp-config.php pendant + * le processus d’installation. Vous n’avez pas à utiliser le site web, vous + * pouvez simplement renommer ce fichier en « wp-config.php » et remplir les + * valeurs. + * + * Ce fichier contient les réglages de configuration suivants : + * + * Réglages MySQL + * Préfixe de table + * Clés secrètes + * Langue utilisée + * ABSPATH + * + * @link https://fr.wordpress.org/support/article/editing-wp-config-php/. + * + * @package WordPress + */ +define('ENV_LOCAL', 'local'); +define('ENV_DEV', 'development'); +define('ENV_PROD', 'production'); +define('ENV', getenv('ENVIRONMENT')); + +if (isset($_SERVER["HTTP_X_FORWARDED_PROTO"] ) && "https" == $_SERVER["HTTP_X_FORWARDED_PROTO"] ) { + $_SERVER["HTTPS"] = "on"; +} + +/** production **/ +if (ENV === ENV_PROD) { + error_reporting(0); + @ini_set('display_errors', 0); + /* ADMIN */ + define( 'FORCE_SSL_ADMIN', true); + /* Hide ACF BO page */ + define( 'ACF_LITE', true ); + /* Disable plugins editor & upgrades */ + define( 'DISALLOW_FILE_MODS', true ); + define( 'DISALLOW_FILE_EDIT', true ); +} + +// ** Réglages MySQL - Votre hébergeur doit vous fournir ces informations. ** // +/** The name of the database for WordPress */ +define('DB_NAME', getenv('DB_NAME')); + +/** MySQL database username */ +define('DB_USER', getenv('DB_USER')); + +/** MySQL database password */ +define('DB_PASSWORD', getenv('DB_PASSWORD')); + +/** MySQL hostname */ +define('DB_HOST', getenv('DB_HOST')); + +/** Database Charset to use in creating database tables. */ +define( 'DB_CHARSET', 'utf8mb4' ); + +/** The Database Collate type. Don't change this if in doubt. */ +define( 'DB_COLLATE', '' ); + +/**#@+ + * Clés uniques d’authentification et salage. + * + * Remplacez les valeurs par défaut par des phrases uniques ! + * Vous pouvez générer des phrases aléatoires en utilisant + * {@link https://api.wordpress.org/secret-key/1.1/salt/ le service de clés secrètes de WordPress.org}. + * Vous pouvez modifier ces phrases à n’importe quel moment, afin d’invalider tous les cookies existants. + * Cela forcera également tous les utilisateurs à se reconnecter. + * + * @since 2.6.0 + */ +define( 'AUTH_KEY', ':z>$s5J(+TA/vDQM}ZbB6853rnQv*:F1=6&q;<[r1q?^@IIupn>He>E| q&[GdFf' ); +define( 'SECURE_AUTH_KEY', ' al[5Y7mGJGbe%)7CNOje#7zNfFs>]l(Gv-#4&~46vGd^t./t:N]#v6`h1@SgA&)5vYZ' ); +define( 'NONCE_KEY', 'RUQq*A.Qwi)5|HCtLM_7%`+Mg#@_sn|cNj:A;!`K{lD(2ZPY+SorpD&pU2j8W~Wr' ); +define( 'AUTH_SALT', 'gK~<&}EXE,0fA:nYKq}VhSq9_@ e`Y{-Fp6(tsE~6^+A|5wk;T8NReDFNoqOX[&f' ); +define( 'SECURE_AUTH_SALT', 'q4QWVBA|7fYw3@U9f;`#YYB=qHkaq*mmsz]D;iAG3$I1qwZP=<#ZMvnCu+vi(F`' ); +/**#@-*/ + +/** + * Préfixe de base de données pour les tables de WordPress. + * + * Vous pouvez installer plusieurs WordPress sur une seule base de données + * si vous leur donnez chacune un préfixe unique. + * N’utilisez que des chiffres, des lettres non-accentuées, et des caractères soulignés ! + */ +$table_prefix = getenv('DB_PREFIX'); +/** Changement du nom du répertoire wp-content => content. */ +define ('WP_CONTENT_FOLDERNAME', 'content'); +define ('WP_CONTENT_DIR', ABSPATH . WP_CONTENT_FOLDERNAME) ; + +if(isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] = "on"){ + define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/'); +}else{ + define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/'); +} +define('WP_CONTENT_URL', WP_SITEURL . WP_CONTENT_FOLDERNAME); +define ('WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins'); + +define('FS_METHOD','direct'); + +/* Disable all core automatic updates */ +define( 'WP_AUTO_UPDATE_CORE', false ); + +/* enable log file */ +define('WP_DEBUG_LOG', true); + +/** Stop du cron WordPress **/ +define('DISABLE_WP_CRON', true); + +/* Change revisions limitation & autosave interval */ +define( 'WP_POST_REVISIONS', 3 ); +define( 'AUTOSAVE_INTERVAL', 300 ); + +/* SMTP */ +define( 'SMTP_HOST', getenv('SMTP_HOST') ); +define( 'SMTP_PORT', getenv('SMTP_PORT') ); +define( 'SMTP_AUTH', evalBool(getenv('SMTP_AUTH')) ); +define( 'SMTP_USER', getenv('SMTP_USER') ); +define( 'SMTP_PASS', getenv('SMTP_PASS') ); +define( 'SMTP_SECURE', getenv('SMTP_SECURE') ); + +define( 'SCRIPT_DEBUG', evalBool(getenv('SCRIPT_DEBUG')) ); +define('WP_DEBUG', evalBool(getenv('WP_DEBUG'))); +define('WP_DEBUG_DISPLAY', evalBool(getenv('WP_DEBUG_DISPLAY'))); + +define('WP_HTTP_BLOCK_EXTERNAL', evalBool(getenv('WP_HTTP_BLOCK_EXTERNAL'))); + +/* CRM */ +define( 'CRM_PLATOS_WSDL', getenv('CRM_PLATOS_WSDL') ); +define( 'WS_SERVCE_LOGIN', getenv('WS_SERVCE_LOGIN') ); +define( 'WS_SERVCE_PASSWORD', getenv('WS_SERVCE_PASSWORD') ); + +/* C’est tout, ne touchez pas à ce qui suit ! */ + +/** Chemin absolu vers le dossier de WordPress. */ +if ( ! defined( 'ABSPATH' ) ) + define( 'ABSPATH', dirname( __FILE__ ) . '/' ); + +/** Réglage des variables de WordPress et de ses fichiers inclus. */ +require_once( ABSPATH . 'wp-settings.php' ); diff --git a/wp-cron.php b/wp-cron.php new file mode 100644 index 0000000..333625c --- /dev/null +++ b/wp-cron.php @@ -0,0 +1,152 @@ +=' ) ) { + if ( ! headers_sent() ) { + header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' ); + header( 'Cache-Control: no-cache, must-revalidate, max-age=0' ); + } + + fastcgi_finish_request(); +} + +if ( ! empty( $_POST ) || defined( 'DOING_AJAX' ) || defined( 'DOING_CRON' ) ) { + die(); +} + +/** + * Tell WordPress we are doing the CRON task. + * + * @var bool + */ +define( 'DOING_CRON', true ); + +if ( ! defined( 'ABSPATH' ) ) { + /** Set up WordPress environment */ + require_once __DIR__ . '/wp-load.php'; +} + +/** + * Retrieves the cron lock. + * + * Returns the uncached `doing_cron` transient. + * + * @ignore + * @since 3.3.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return string|false Value of the `doing_cron` transient, 0|false otherwise. + */ +function _get_cron_lock() { + global $wpdb; + + $value = 0; + if ( wp_using_ext_object_cache() ) { + /* + * Skip local cache and force re-fetch of doing_cron transient + * in case another process updated the cache. + */ + $value = wp_cache_get( 'doing_cron', 'transient', true ); + } else { + $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", '_transient_doing_cron' ) ); + if ( is_object( $row ) ) { + $value = $row->option_value; + } + } + + return $value; +} + +$crons = wp_get_ready_cron_jobs(); +if ( empty( $crons ) ) { + die(); +} + +$gmt_time = microtime( true ); + +// The cron lock: a unix timestamp from when the cron was spawned. +$doing_cron_transient = get_transient( 'doing_cron' ); + +// Use global $doing_wp_cron lock, otherwise use the GET lock. If no lock, try to grab a new lock. +if ( empty( $doing_wp_cron ) ) { + if ( empty( $_GET['doing_wp_cron'] ) ) { + // Called from external script/job. Try setting a lock. + if ( $doing_cron_transient && ( $doing_cron_transient + WP_CRON_LOCK_TIMEOUT > $gmt_time ) ) { + return; + } + $doing_wp_cron = sprintf( '%.22F', microtime( true ) ); + $doing_cron_transient = $doing_wp_cron; + set_transient( 'doing_cron', $doing_wp_cron ); + } else { + $doing_wp_cron = $_GET['doing_wp_cron']; + } +} + +/* + * The cron lock (a unix timestamp set when the cron was spawned), + * must match $doing_wp_cron (the "key"). + */ +if ( $doing_cron_transient !== $doing_wp_cron ) { + return; +} + +foreach ( $crons as $timestamp => $cronhooks ) { + if ( $timestamp > $gmt_time ) { + break; + } + + foreach ( $cronhooks as $hook => $keys ) { + + foreach ( $keys as $k => $v ) { + + $schedule = $v['schedule']; + + if ( $schedule ) { + wp_reschedule_event( $timestamp, $schedule, $hook, $v['args'] ); + } + + wp_unschedule_event( $timestamp, $hook, $v['args'] ); + + /** + * Fires scheduled events. + * + * @ignore + * @since 2.1.0 + * + * @param string $hook Name of the hook that was scheduled to be fired. + * @param array $args The arguments to be passed to the hook. + */ + do_action_ref_array( $hook, $v['args'] ); + + // If the hook ran too long and another cron process stole the lock, quit. + if ( _get_cron_lock() !== $doing_wp_cron ) { + return; + } + } + } +} + +if ( _get_cron_lock() === $doing_wp_cron ) { + delete_transient( 'doing_cron' ); +} + +die(); diff --git a/wp-includes/ID3/getid3.lib.php b/wp-includes/ID3/getid3.lib.php new file mode 100644 index 0000000..1d51e8c --- /dev/null +++ b/wp-includes/ID3/getid3.lib.php @@ -0,0 +1,1781 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// // +// getid3.lib.php - part of getID3() // +// see readme.txt for more details // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_lib +{ + /** + * @param string $string + * @param bool $hex + * @param bool $spaces + * @param string $htmlencoding + * + * @return string + */ + public static function PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8') { + $returnstring = ''; + for ($i = 0; $i < strlen($string); $i++) { + if ($hex) { + $returnstring .= str_pad(dechex(ord($string[$i])), 2, '0', STR_PAD_LEFT); + } else { + $returnstring .= ' '.(preg_match("#[\x20-\x7E]#", $string[$i]) ? $string[$i] : '¤'); + } + if ($spaces) { + $returnstring .= ' '; + } + } + if (!empty($htmlencoding)) { + if ($htmlencoding === true) { + $htmlencoding = 'UTF-8'; // prior to getID3 v1.9.0 the function's 4th parameter was boolean + } + $returnstring = htmlentities($returnstring, ENT_QUOTES, $htmlencoding); + } + return $returnstring; + } + + /** + * Truncates a floating-point number at the decimal point. + * + * @param float $floatnumber + * + * @return float|int returns int (if possible, otherwise float) + */ + public static function trunc($floatnumber) { + if ($floatnumber >= 1) { + $truncatednumber = floor($floatnumber); + } elseif ($floatnumber <= -1) { + $truncatednumber = ceil($floatnumber); + } else { + $truncatednumber = 0; + } + if (self::intValueSupported($truncatednumber)) { + $truncatednumber = (int) $truncatednumber; + } + return $truncatednumber; + } + + /** + * @param int|null $variable + * @param int $increment + * + * @return bool + */ + public static function safe_inc(&$variable, $increment=1) { + if (isset($variable)) { + $variable += $increment; + } else { + $variable = $increment; + } + return true; + } + + /** + * @param int|float $floatnum + * + * @return int|float + */ + public static function CastAsInt($floatnum) { + // convert to float if not already + $floatnum = (float) $floatnum; + + // convert a float to type int, only if possible + if (self::trunc($floatnum) == $floatnum) { + // it's not floating point + if (self::intValueSupported($floatnum)) { + // it's within int range + $floatnum = (int) $floatnum; + } + } + return $floatnum; + } + + /** + * @param int $num + * + * @return bool + */ + public static function intValueSupported($num) { + // check if integers are 64-bit + static $hasINT64 = null; + if ($hasINT64 === null) { // 10x faster than is_null() + $hasINT64 = is_int(pow(2, 31)); // 32-bit int are limited to (2^31)-1 + if (!$hasINT64 && !defined('PHP_INT_MIN')) { + define('PHP_INT_MIN', ~PHP_INT_MAX); + } + } + // if integers are 64-bit - no other check required + if ($hasINT64 || (($num <= PHP_INT_MAX) && ($num >= PHP_INT_MIN))) { + return true; + } + return false; + } + + /** + * @param string $fraction + * + * @return float + */ + public static function DecimalizeFraction($fraction) { + list($numerator, $denominator) = explode('/', $fraction); + return $numerator / ($denominator ? $denominator : 1); + } + + /** + * @param string $binarynumerator + * + * @return float + */ + public static function DecimalBinary2Float($binarynumerator) { + $numerator = self::Bin2Dec($binarynumerator); + $denominator = self::Bin2Dec('1'.str_repeat('0', strlen($binarynumerator))); + return ($numerator / $denominator); + } + + /** + * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html + * + * @param string $binarypointnumber + * @param int $maxbits + * + * @return array + */ + public static function NormalizeBinaryPoint($binarypointnumber, $maxbits=52) { + if (strpos($binarypointnumber, '.') === false) { + $binarypointnumber = '0.'.$binarypointnumber; + } elseif ($binarypointnumber[0] == '.') { + $binarypointnumber = '0'.$binarypointnumber; + } + $exponent = 0; + while (($binarypointnumber[0] != '1') || (substr($binarypointnumber, 1, 1) != '.')) { + if (substr($binarypointnumber, 1, 1) == '.') { + $exponent--; + $binarypointnumber = substr($binarypointnumber, 2, 1).'.'.substr($binarypointnumber, 3); + } else { + $pointpos = strpos($binarypointnumber, '.'); + $exponent += ($pointpos - 1); + $binarypointnumber = str_replace('.', '', $binarypointnumber); + $binarypointnumber = $binarypointnumber[0].'.'.substr($binarypointnumber, 1); + } + } + $binarypointnumber = str_pad(substr($binarypointnumber, 0, $maxbits + 2), $maxbits + 2, '0', STR_PAD_RIGHT); + return array('normalized'=>$binarypointnumber, 'exponent'=>(int) $exponent); + } + + /** + * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html + * + * @param float $floatvalue + * + * @return string + */ + public static function Float2BinaryDecimal($floatvalue) { + $maxbits = 128; // to how many bits of precision should the calculations be taken? + $intpart = self::trunc($floatvalue); + $floatpart = abs($floatvalue - $intpart); + $pointbitstring = ''; + while (($floatpart != 0) && (strlen($pointbitstring) < $maxbits)) { + $floatpart *= 2; + $pointbitstring .= (string) self::trunc($floatpart); + $floatpart -= self::trunc($floatpart); + } + $binarypointnumber = decbin($intpart).'.'.$pointbitstring; + return $binarypointnumber; + } + + /** + * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html + * + * @param float $floatvalue + * @param int $bits + * + * @return string|false + */ + public static function Float2String($floatvalue, $bits) { + $exponentbits = 0; + $fractionbits = 0; + switch ($bits) { + case 32: + $exponentbits = 8; + $fractionbits = 23; + break; + + case 64: + $exponentbits = 11; + $fractionbits = 52; + break; + + default: + return false; + break; + } + if ($floatvalue >= 0) { + $signbit = '0'; + } else { + $signbit = '1'; + } + $normalizedbinary = self::NormalizeBinaryPoint(self::Float2BinaryDecimal($floatvalue), $fractionbits); + $biasedexponent = pow(2, $exponentbits - 1) - 1 + $normalizedbinary['exponent']; // (127 or 1023) +/- exponent + $exponentbitstring = str_pad(decbin($biasedexponent), $exponentbits, '0', STR_PAD_LEFT); + $fractionbitstring = str_pad(substr($normalizedbinary['normalized'], 2), $fractionbits, '0', STR_PAD_RIGHT); + + return self::BigEndian2String(self::Bin2Dec($signbit.$exponentbitstring.$fractionbitstring), $bits % 8, false); + } + + /** + * @param string $byteword + * + * @return float|false + */ + public static function LittleEndian2Float($byteword) { + return self::BigEndian2Float(strrev($byteword)); + } + + /** + * ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic + * + * @link http://www.psc.edu/general/software/packages/ieee/ieee.html + * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee.html + * + * @param string $byteword + * + * @return float|false + */ + public static function BigEndian2Float($byteword) { + $bitword = self::BigEndian2Bin($byteword); + if (!$bitword) { + return 0; + } + $signbit = $bitword[0]; + $floatvalue = 0; + $exponentbits = 0; + $fractionbits = 0; + + switch (strlen($byteword) * 8) { + case 32: + $exponentbits = 8; + $fractionbits = 23; + break; + + case 64: + $exponentbits = 11; + $fractionbits = 52; + break; + + case 80: + // 80-bit Apple SANE format + // http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/ + $exponentstring = substr($bitword, 1, 15); + $isnormalized = intval($bitword[16]); + $fractionstring = substr($bitword, 17, 63); + $exponent = pow(2, self::Bin2Dec($exponentstring) - 16383); + $fraction = $isnormalized + self::DecimalBinary2Float($fractionstring); + $floatvalue = $exponent * $fraction; + if ($signbit == '1') { + $floatvalue *= -1; + } + return $floatvalue; + break; + + default: + return false; + break; + } + $exponentstring = substr($bitword, 1, $exponentbits); + $fractionstring = substr($bitword, $exponentbits + 1, $fractionbits); + $exponent = self::Bin2Dec($exponentstring); + $fraction = self::Bin2Dec($fractionstring); + + if (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction != 0)) { + // Not a Number + $floatvalue = false; + } elseif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction == 0)) { + if ($signbit == '1') { + $floatvalue = '-infinity'; + } else { + $floatvalue = '+infinity'; + } + } elseif (($exponent == 0) && ($fraction == 0)) { + if ($signbit == '1') { + $floatvalue = -0; + } else { + $floatvalue = 0; + } + $floatvalue = ($signbit ? 0 : -0); + } elseif (($exponent == 0) && ($fraction != 0)) { + // These are 'unnormalized' values + $floatvalue = pow(2, (-1 * (pow(2, $exponentbits - 1) - 2))) * self::DecimalBinary2Float($fractionstring); + if ($signbit == '1') { + $floatvalue *= -1; + } + } elseif ($exponent != 0) { + $floatvalue = pow(2, ($exponent - (pow(2, $exponentbits - 1) - 1))) * (1 + self::DecimalBinary2Float($fractionstring)); + if ($signbit == '1') { + $floatvalue *= -1; + } + } + return (float) $floatvalue; + } + + /** + * @param string $byteword + * @param bool $synchsafe + * @param bool $signed + * + * @return int|float|false + * @throws Exception + */ + public static function BigEndian2Int($byteword, $synchsafe=false, $signed=false) { + $intvalue = 0; + $bytewordlen = strlen($byteword); + if ($bytewordlen == 0) { + return false; + } + for ($i = 0; $i < $bytewordlen; $i++) { + if ($synchsafe) { // disregard MSB, effectively 7-bit bytes + //$intvalue = $intvalue | (ord($byteword{$i}) & 0x7F) << (($bytewordlen - 1 - $i) * 7); // faster, but runs into problems past 2^31 on 32-bit systems + $intvalue += (ord($byteword[$i]) & 0x7F) * pow(2, ($bytewordlen - 1 - $i) * 7); + } else { + $intvalue += ord($byteword[$i]) * pow(256, ($bytewordlen - 1 - $i)); + } + } + if ($signed && !$synchsafe) { + // synchsafe ints are not allowed to be signed + if ($bytewordlen <= PHP_INT_SIZE) { + $signMaskBit = 0x80 << (8 * ($bytewordlen - 1)); + if ($intvalue & $signMaskBit) { + $intvalue = 0 - ($intvalue & ($signMaskBit - 1)); + } + } else { + throw new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits ('.strlen($byteword).') in self::BigEndian2Int()'); + } + } + return self::CastAsInt($intvalue); + } + + /** + * @param string $byteword + * @param bool $signed + * + * @return int|float|false + */ + public static function LittleEndian2Int($byteword, $signed=false) { + return self::BigEndian2Int(strrev($byteword), false, $signed); + } + + /** + * @param string $byteword + * + * @return string + */ + public static function LittleEndian2Bin($byteword) { + return self::BigEndian2Bin(strrev($byteword)); + } + + /** + * @param string $byteword + * + * @return string + */ + public static function BigEndian2Bin($byteword) { + $binvalue = ''; + $bytewordlen = strlen($byteword); + for ($i = 0; $i < $bytewordlen; $i++) { + $binvalue .= str_pad(decbin(ord($byteword[$i])), 8, '0', STR_PAD_LEFT); + } + return $binvalue; + } + + /** + * @param int $number + * @param int $minbytes + * @param bool $synchsafe + * @param bool $signed + * + * @return string + * @throws Exception + */ + public static function BigEndian2String($number, $minbytes=1, $synchsafe=false, $signed=false) { + if ($number < 0) { + throw new Exception('ERROR: self::BigEndian2String() does not support negative numbers'); + } + $maskbyte = (($synchsafe || $signed) ? 0x7F : 0xFF); + $intstring = ''; + if ($signed) { + if ($minbytes > PHP_INT_SIZE) { + throw new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits in self::BigEndian2String()'); + } + $number = $number & (0x80 << (8 * ($minbytes - 1))); + } + while ($number != 0) { + $quotient = ($number / ($maskbyte + 1)); + $intstring = chr(ceil(($quotient - floor($quotient)) * $maskbyte)).$intstring; + $number = floor($quotient); + } + return str_pad($intstring, $minbytes, "\x00", STR_PAD_LEFT); + } + + /** + * @param int $number + * + * @return string + */ + public static function Dec2Bin($number) { + while ($number >= 256) { + $bytes[] = (($number / 256) - (floor($number / 256))) * 256; + $number = floor($number / 256); + } + $bytes[] = $number; + $binstring = ''; + for ($i = 0; $i < count($bytes); $i++) { + $binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8, '0', STR_PAD_LEFT)).$binstring; + } + return $binstring; + } + + /** + * @param string $binstring + * @param bool $signed + * + * @return int|float + */ + public static function Bin2Dec($binstring, $signed=false) { + $signmult = 1; + if ($signed) { + if ($binstring[0] == '1') { + $signmult = -1; + } + $binstring = substr($binstring, 1); + } + $decvalue = 0; + for ($i = 0; $i < strlen($binstring); $i++) { + $decvalue += ((int) substr($binstring, strlen($binstring) - $i - 1, 1)) * pow(2, $i); + } + return self::CastAsInt($decvalue * $signmult); + } + + /** + * @param string $binstring + * + * @return string + */ + public static function Bin2String($binstring) { + // return 'hi' for input of '0110100001101001' + $string = ''; + $binstringreversed = strrev($binstring); + for ($i = 0; $i < strlen($binstringreversed); $i += 8) { + $string = chr(self::Bin2Dec(strrev(substr($binstringreversed, $i, 8)))).$string; + } + return $string; + } + + /** + * @param int $number + * @param int $minbytes + * @param bool $synchsafe + * + * @return string + */ + public static function LittleEndian2String($number, $minbytes=1, $synchsafe=false) { + $intstring = ''; + while ($number > 0) { + if ($synchsafe) { + $intstring = $intstring.chr($number & 127); + $number >>= 7; + } else { + $intstring = $intstring.chr($number & 255); + $number >>= 8; + } + } + return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT); + } + + /** + * @param array $array1 + * @param array $array2 + * + * @return array|false + */ + public static function array_merge_clobber($array1, $array2) { + // written by kcØhireability*com + // taken from http://www.php.net/manual/en/function.array-merge-recursive.php + if (!is_array($array1) || !is_array($array2)) { + return false; + } + $newarray = $array1; + foreach ($array2 as $key => $val) { + if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { + $newarray[$key] = self::array_merge_clobber($newarray[$key], $val); + } else { + $newarray[$key] = $val; + } + } + return $newarray; + } + + /** + * @param array $array1 + * @param array $array2 + * + * @return array|false + */ + public static function array_merge_noclobber($array1, $array2) { + if (!is_array($array1) || !is_array($array2)) { + return false; + } + $newarray = $array1; + foreach ($array2 as $key => $val) { + if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { + $newarray[$key] = self::array_merge_noclobber($newarray[$key], $val); + } elseif (!isset($newarray[$key])) { + $newarray[$key] = $val; + } + } + return $newarray; + } + + /** + * @param array $array1 + * @param array $array2 + * + * @return array|false|null + */ + public static function flipped_array_merge_noclobber($array1, $array2) { + if (!is_array($array1) || !is_array($array2)) { + return false; + } + # naturally, this only works non-recursively + $newarray = array_flip($array1); + foreach (array_flip($array2) as $key => $val) { + if (!isset($newarray[$key])) { + $newarray[$key] = count($newarray); + } + } + return array_flip($newarray); + } + + /** + * @param array $theArray + * + * @return bool + */ + public static function ksort_recursive(&$theArray) { + ksort($theArray); + foreach ($theArray as $key => $value) { + if (is_array($value)) { + self::ksort_recursive($theArray[$key]); + } + } + return true; + } + + /** + * @param string $filename + * @param int $numextensions + * + * @return string + */ + public static function fileextension($filename, $numextensions=1) { + if (strstr($filename, '.')) { + $reversedfilename = strrev($filename); + $offset = 0; + for ($i = 0; $i < $numextensions; $i++) { + $offset = strpos($reversedfilename, '.', $offset + 1); + if ($offset === false) { + return ''; + } + } + return strrev(substr($reversedfilename, 0, $offset)); + } + return ''; + } + + /** + * @param int $seconds + * + * @return string + */ + public static function PlaytimeString($seconds) { + $sign = (($seconds < 0) ? '-' : ''); + $seconds = round(abs($seconds)); + $H = (int) floor( $seconds / 3600); + $M = (int) floor(($seconds - (3600 * $H) ) / 60); + $S = (int) round( $seconds - (3600 * $H) - (60 * $M) ); + return $sign.($H ? $H.':' : '').($H ? str_pad($M, 2, '0', STR_PAD_LEFT) : intval($M)).':'.str_pad($S, 2, 0, STR_PAD_LEFT); + } + + /** + * @param int $macdate + * + * @return int|float + */ + public static function DateMac2Unix($macdate) { + // Macintosh timestamp: seconds since 00:00h January 1, 1904 + // UNIX timestamp: seconds since 00:00h January 1, 1970 + return self::CastAsInt($macdate - 2082844800); + } + + /** + * @param string $rawdata + * + * @return float + */ + public static function FixedPoint8_8($rawdata) { + return self::BigEndian2Int(substr($rawdata, 0, 1)) + (float) (self::BigEndian2Int(substr($rawdata, 1, 1)) / pow(2, 8)); + } + + /** + * @param string $rawdata + * + * @return float + */ + public static function FixedPoint16_16($rawdata) { + return self::BigEndian2Int(substr($rawdata, 0, 2)) + (float) (self::BigEndian2Int(substr($rawdata, 2, 2)) / pow(2, 16)); + } + + /** + * @param string $rawdata + * + * @return float + */ + public static function FixedPoint2_30($rawdata) { + $binarystring = self::BigEndian2Bin($rawdata); + return self::Bin2Dec(substr($binarystring, 0, 2)) + (float) (self::Bin2Dec(substr($binarystring, 2, 30)) / pow(2, 30)); + } + + + /** + * @param string $ArrayPath + * @param string $Separator + * @param mixed $Value + * + * @return array + */ + public static function CreateDeepArray($ArrayPath, $Separator, $Value) { + // assigns $Value to a nested array path: + // $foo = self::CreateDeepArray('/path/to/my', '/', 'file.txt') + // is the same as: + // $foo = array('path'=>array('to'=>'array('my'=>array('file.txt')))); + // or + // $foo['path']['to']['my'] = 'file.txt'; + $ArrayPath = ltrim($ArrayPath, $Separator); + if (($pos = strpos($ArrayPath, $Separator)) !== false) { + $ReturnedArray[substr($ArrayPath, 0, $pos)] = self::CreateDeepArray(substr($ArrayPath, $pos + 1), $Separator, $Value); + } else { + $ReturnedArray[$ArrayPath] = $Value; + } + return $ReturnedArray; + } + + /** + * @param array $arraydata + * @param bool $returnkey + * + * @return int|false + */ + public static function array_max($arraydata, $returnkey=false) { + $maxvalue = false; + $maxkey = false; + foreach ($arraydata as $key => $value) { + if (!is_array($value)) { + if ($value > $maxvalue) { + $maxvalue = $value; + $maxkey = $key; + } + } + } + return ($returnkey ? $maxkey : $maxvalue); + } + + /** + * @param array $arraydata + * @param bool $returnkey + * + * @return int|false + */ + public static function array_min($arraydata, $returnkey=false) { + $minvalue = false; + $minkey = false; + foreach ($arraydata as $key => $value) { + if (!is_array($value)) { + if ($value > $minvalue) { + $minvalue = $value; + $minkey = $key; + } + } + } + return ($returnkey ? $minkey : $minvalue); + } + + /** + * @param string $XMLstring + * + * @return array|false + */ + public static function XML2array($XMLstring) { + if (function_exists('simplexml_load_string') && function_exists('libxml_disable_entity_loader')) { + // http://websec.io/2012/08/27/Preventing-XEE-in-PHP.html + // https://core.trac.wordpress.org/changeset/29378 + $loader = libxml_disable_entity_loader(true); + $XMLobject = simplexml_load_string($XMLstring, 'SimpleXMLElement', LIBXML_NOENT); + $return = self::SimpleXMLelement2array($XMLobject); + libxml_disable_entity_loader($loader); + return $return; + } + return false; + } + + /** + * @param SimpleXMLElement|array $XMLobject + * + * @return array + */ + public static function SimpleXMLelement2array($XMLobject) { + if (!is_object($XMLobject) && !is_array($XMLobject)) { + return $XMLobject; + } + $XMLarray = $XMLobject instanceof SimpleXMLElement ? get_object_vars($XMLobject) : $XMLobject; + foreach ($XMLarray as $key => $value) { + $XMLarray[$key] = self::SimpleXMLelement2array($value); + } + return $XMLarray; + } + + /** + * Returns checksum for a file from starting position to absolute end position. + * + * @param string $file + * @param int $offset + * @param int $end + * @param string $algorithm + * + * @return string|false + * @throws getid3_exception + */ + public static function hash_data($file, $offset, $end, $algorithm) { + if (!self::intValueSupported($end)) { + return false; + } + if (!in_array($algorithm, array('md5', 'sha1'))) { + throw new getid3_exception('Invalid algorithm ('.$algorithm.') in self::hash_data()'); + } + + $size = $end - $offset; + + $fp = fopen($file, 'rb'); + fseek($fp, $offset); + $ctx = hash_init($algorithm); + while ($size > 0) { + $buffer = fread($fp, min($size, getID3::FREAD_BUFFER_SIZE)); + hash_update($ctx, $buffer); + $size -= getID3::FREAD_BUFFER_SIZE; + } + $hash = hash_final($ctx); + fclose($fp); + + return $hash; + } + + /** + * @param string $filename_source + * @param string $filename_dest + * @param int $offset + * @param int $length + * + * @return bool + * @throws Exception + * + * @deprecated Unused, may be removed in future versions of getID3 + */ + public static function CopyFileParts($filename_source, $filename_dest, $offset, $length) { + if (!self::intValueSupported($offset + $length)) { + throw new Exception('cannot copy file portion, it extends beyond the '.round(PHP_INT_MAX / 1073741824).'GB limit'); + } + if (is_readable($filename_source) && is_file($filename_source) && ($fp_src = fopen($filename_source, 'rb'))) { + if (($fp_dest = fopen($filename_dest, 'wb'))) { + if (fseek($fp_src, $offset) == 0) { + $byteslefttowrite = $length; + while (($byteslefttowrite > 0) && ($buffer = fread($fp_src, min($byteslefttowrite, getID3::FREAD_BUFFER_SIZE)))) { + $byteswritten = fwrite($fp_dest, $buffer, $byteslefttowrite); + $byteslefttowrite -= $byteswritten; + } + fclose($fp_dest); + return true; + } else { + fclose($fp_src); + throw new Exception('failed to seek to offset '.$offset.' in '.$filename_source); + } + } else { + throw new Exception('failed to create file for writing '.$filename_dest); + } + } else { + throw new Exception('failed to open file for reading '.$filename_source); + } + } + + /** + * @param int $charval + * + * @return string + */ + public static function iconv_fallback_int_utf8($charval) { + if ($charval < 128) { + // 0bbbbbbb + $newcharstring = chr($charval); + } elseif ($charval < 2048) { + // 110bbbbb 10bbbbbb + $newcharstring = chr(($charval >> 6) | 0xC0); + $newcharstring .= chr(($charval & 0x3F) | 0x80); + } elseif ($charval < 65536) { + // 1110bbbb 10bbbbbb 10bbbbbb + $newcharstring = chr(($charval >> 12) | 0xE0); + $newcharstring .= chr(($charval >> 6) | 0xC0); + $newcharstring .= chr(($charval & 0x3F) | 0x80); + } else { + // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb + $newcharstring = chr(($charval >> 18) | 0xF0); + $newcharstring .= chr(($charval >> 12) | 0xC0); + $newcharstring .= chr(($charval >> 6) | 0xC0); + $newcharstring .= chr(($charval & 0x3F) | 0x80); + } + return $newcharstring; + } + + /** + * ISO-8859-1 => UTF-8 + * + * @param string $string + * @param bool $bom + * + * @return string + */ + public static function iconv_fallback_iso88591_utf8($string, $bom=false) { + if (function_exists('utf8_encode')) { + return utf8_encode($string); + } + // utf8_encode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support) + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xEF\xBB\xBF"; + } + for ($i = 0; $i < strlen($string); $i++) { + $charval = ord($string[$i]); + $newcharstring .= self::iconv_fallback_int_utf8($charval); + } + return $newcharstring; + } + + /** + * ISO-8859-1 => UTF-16BE + * + * @param string $string + * @param bool $bom + * + * @return string + */ + public static function iconv_fallback_iso88591_utf16be($string, $bom=false) { + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xFE\xFF"; + } + for ($i = 0; $i < strlen($string); $i++) { + $newcharstring .= "\x00".$string[$i]; + } + return $newcharstring; + } + + /** + * ISO-8859-1 => UTF-16LE + * + * @param string $string + * @param bool $bom + * + * @return string + */ + public static function iconv_fallback_iso88591_utf16le($string, $bom=false) { + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xFF\xFE"; + } + for ($i = 0; $i < strlen($string); $i++) { + $newcharstring .= $string[$i]."\x00"; + } + return $newcharstring; + } + + /** + * ISO-8859-1 => UTF-16LE (BOM) + * + * @param string $string + * + * @return string + */ + public static function iconv_fallback_iso88591_utf16($string) { + return self::iconv_fallback_iso88591_utf16le($string, true); + } + + /** + * UTF-8 => ISO-8859-1 + * + * @param string $string + * + * @return string + */ + public static function iconv_fallback_utf8_iso88591($string) { + if (function_exists('utf8_decode')) { + return utf8_decode($string); + } + // utf8_decode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support) + $newcharstring = ''; + $offset = 0; + $stringlength = strlen($string); + while ($offset < $stringlength) { + if ((ord($string[$offset]) | 0x07) == 0xF7) { + // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) & + ((ord($string[($offset + 1)]) & 0x3F) << 12) & + ((ord($string[($offset + 2)]) & 0x3F) << 6) & + (ord($string[($offset + 3)]) & 0x3F); + $offset += 4; + } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) { + // 1110bbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) & + ((ord($string[($offset + 1)]) & 0x3F) << 6) & + (ord($string[($offset + 2)]) & 0x3F); + $offset += 3; + } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) { + // 110bbbbb 10bbbbbb + $charval = ((ord($string[($offset + 0)]) & 0x1F) << 6) & + (ord($string[($offset + 1)]) & 0x3F); + $offset += 2; + } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) { + // 0bbbbbbb + $charval = ord($string[$offset]); + $offset += 1; + } else { + // error? throw some kind of warning here? + $charval = false; + $offset += 1; + } + if ($charval !== false) { + $newcharstring .= (($charval < 256) ? chr($charval) : '?'); + } + } + return $newcharstring; + } + + /** + * UTF-8 => UTF-16BE + * + * @param string $string + * @param bool $bom + * + * @return string + */ + public static function iconv_fallback_utf8_utf16be($string, $bom=false) { + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xFE\xFF"; + } + $offset = 0; + $stringlength = strlen($string); + while ($offset < $stringlength) { + if ((ord($string[$offset]) | 0x07) == 0xF7) { + // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) & + ((ord($string[($offset + 1)]) & 0x3F) << 12) & + ((ord($string[($offset + 2)]) & 0x3F) << 6) & + (ord($string[($offset + 3)]) & 0x3F); + $offset += 4; + } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) { + // 1110bbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) & + ((ord($string[($offset + 1)]) & 0x3F) << 6) & + (ord($string[($offset + 2)]) & 0x3F); + $offset += 3; + } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) { + // 110bbbbb 10bbbbbb + $charval = ((ord($string[($offset + 0)]) & 0x1F) << 6) & + (ord($string[($offset + 1)]) & 0x3F); + $offset += 2; + } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) { + // 0bbbbbbb + $charval = ord($string[$offset]); + $offset += 1; + } else { + // error? throw some kind of warning here? + $charval = false; + $offset += 1; + } + if ($charval !== false) { + $newcharstring .= (($charval < 65536) ? self::BigEndian2String($charval, 2) : "\x00".'?'); + } + } + return $newcharstring; + } + + /** + * UTF-8 => UTF-16LE + * + * @param string $string + * @param bool $bom + * + * @return string + */ + public static function iconv_fallback_utf8_utf16le($string, $bom=false) { + $newcharstring = ''; + if ($bom) { + $newcharstring .= "\xFF\xFE"; + } + $offset = 0; + $stringlength = strlen($string); + while ($offset < $stringlength) { + if ((ord($string[$offset]) | 0x07) == 0xF7) { + // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) & + ((ord($string[($offset + 1)]) & 0x3F) << 12) & + ((ord($string[($offset + 2)]) & 0x3F) << 6) & + (ord($string[($offset + 3)]) & 0x3F); + $offset += 4; + } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) { + // 1110bbbb 10bbbbbb 10bbbbbb + $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) & + ((ord($string[($offset + 1)]) & 0x3F) << 6) & + (ord($string[($offset + 2)]) & 0x3F); + $offset += 3; + } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) { + // 110bbbbb 10bbbbbb + $charval = ((ord($string[($offset + 0)]) & 0x1F) << 6) & + (ord($string[($offset + 1)]) & 0x3F); + $offset += 2; + } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) { + // 0bbbbbbb + $charval = ord($string[$offset]); + $offset += 1; + } else { + // error? maybe throw some warning here? + $charval = false; + $offset += 1; + } + if ($charval !== false) { + $newcharstring .= (($charval < 65536) ? self::LittleEndian2String($charval, 2) : '?'."\x00"); + } + } + return $newcharstring; + } + + /** + * UTF-8 => UTF-16LE (BOM) + * + * @param string $string + * + * @return string + */ + public static function iconv_fallback_utf8_utf16($string) { + return self::iconv_fallback_utf8_utf16le($string, true); + } + + /** + * UTF-16BE => UTF-8 + * + * @param string $string + * + * @return string + */ + public static function iconv_fallback_utf16be_utf8($string) { + if (substr($string, 0, 2) == "\xFE\xFF") { + // strip BOM + $string = substr($string, 2); + } + $newcharstring = ''; + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = self::BigEndian2Int(substr($string, $i, 2)); + $newcharstring .= self::iconv_fallback_int_utf8($charval); + } + return $newcharstring; + } + + /** + * UTF-16LE => UTF-8 + * + * @param string $string + * + * @return string + */ + public static function iconv_fallback_utf16le_utf8($string) { + if (substr($string, 0, 2) == "\xFF\xFE") { + // strip BOM + $string = substr($string, 2); + } + $newcharstring = ''; + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = self::LittleEndian2Int(substr($string, $i, 2)); + $newcharstring .= self::iconv_fallback_int_utf8($charval); + } + return $newcharstring; + } + + /** + * UTF-16BE => ISO-8859-1 + * + * @param string $string + * + * @return string + */ + public static function iconv_fallback_utf16be_iso88591($string) { + if (substr($string, 0, 2) == "\xFE\xFF") { + // strip BOM + $string = substr($string, 2); + } + $newcharstring = ''; + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = self::BigEndian2Int(substr($string, $i, 2)); + $newcharstring .= (($charval < 256) ? chr($charval) : '?'); + } + return $newcharstring; + } + + /** + * UTF-16LE => ISO-8859-1 + * + * @param string $string + * + * @return string + */ + public static function iconv_fallback_utf16le_iso88591($string) { + if (substr($string, 0, 2) == "\xFF\xFE") { + // strip BOM + $string = substr($string, 2); + } + $newcharstring = ''; + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = self::LittleEndian2Int(substr($string, $i, 2)); + $newcharstring .= (($charval < 256) ? chr($charval) : '?'); + } + return $newcharstring; + } + + /** + * UTF-16 (BOM) => ISO-8859-1 + * + * @param string $string + * + * @return string + */ + public static function iconv_fallback_utf16_iso88591($string) { + $bom = substr($string, 0, 2); + if ($bom == "\xFE\xFF") { + return self::iconv_fallback_utf16be_iso88591(substr($string, 2)); + } elseif ($bom == "\xFF\xFE") { + return self::iconv_fallback_utf16le_iso88591(substr($string, 2)); + } + return $string; + } + + /** + * UTF-16 (BOM) => UTF-8 + * + * @param string $string + * + * @return string + */ + public static function iconv_fallback_utf16_utf8($string) { + $bom = substr($string, 0, 2); + if ($bom == "\xFE\xFF") { + return self::iconv_fallback_utf16be_utf8(substr($string, 2)); + } elseif ($bom == "\xFF\xFE") { + return self::iconv_fallback_utf16le_utf8(substr($string, 2)); + } + return $string; + } + + /** + * @param string $in_charset + * @param string $out_charset + * @param string $string + * + * @return string + * @throws Exception + */ + public static function iconv_fallback($in_charset, $out_charset, $string) { + + if ($in_charset == $out_charset) { + return $string; + } + + // mb_convert_encoding() available + if (function_exists('mb_convert_encoding')) { + if ((strtoupper($in_charset) == 'UTF-16') && (substr($string, 0, 2) != "\xFE\xFF") && (substr($string, 0, 2) != "\xFF\xFE")) { + // if BOM missing, mb_convert_encoding will mishandle the conversion, assume UTF-16BE and prepend appropriate BOM + $string = "\xFF\xFE".$string; + } + if ((strtoupper($in_charset) == 'UTF-16') && (strtoupper($out_charset) == 'UTF-8')) { + if (($string == "\xFF\xFE") || ($string == "\xFE\xFF")) { + // if string consists of only BOM, mb_convert_encoding will return the BOM unmodified + return ''; + } + } + if ($converted_string = @mb_convert_encoding($string, $out_charset, $in_charset)) { + switch ($out_charset) { + case 'ISO-8859-1': + $converted_string = rtrim($converted_string, "\x00"); + break; + } + return $converted_string; + } + return $string; + + // iconv() available + } elseif (function_exists('iconv')) { + if ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) { + switch ($out_charset) { + case 'ISO-8859-1': + $converted_string = rtrim($converted_string, "\x00"); + break; + } + return $converted_string; + } + + // iconv() may sometimes fail with "illegal character in input string" error message + // and return an empty string, but returning the unconverted string is more useful + return $string; + } + + + // neither mb_convert_encoding or iconv() is available + static $ConversionFunctionList = array(); + if (empty($ConversionFunctionList)) { + $ConversionFunctionList['ISO-8859-1']['UTF-8'] = 'iconv_fallback_iso88591_utf8'; + $ConversionFunctionList['ISO-8859-1']['UTF-16'] = 'iconv_fallback_iso88591_utf16'; + $ConversionFunctionList['ISO-8859-1']['UTF-16BE'] = 'iconv_fallback_iso88591_utf16be'; + $ConversionFunctionList['ISO-8859-1']['UTF-16LE'] = 'iconv_fallback_iso88591_utf16le'; + $ConversionFunctionList['UTF-8']['ISO-8859-1'] = 'iconv_fallback_utf8_iso88591'; + $ConversionFunctionList['UTF-8']['UTF-16'] = 'iconv_fallback_utf8_utf16'; + $ConversionFunctionList['UTF-8']['UTF-16BE'] = 'iconv_fallback_utf8_utf16be'; + $ConversionFunctionList['UTF-8']['UTF-16LE'] = 'iconv_fallback_utf8_utf16le'; + $ConversionFunctionList['UTF-16']['ISO-8859-1'] = 'iconv_fallback_utf16_iso88591'; + $ConversionFunctionList['UTF-16']['UTF-8'] = 'iconv_fallback_utf16_utf8'; + $ConversionFunctionList['UTF-16LE']['ISO-8859-1'] = 'iconv_fallback_utf16le_iso88591'; + $ConversionFunctionList['UTF-16LE']['UTF-8'] = 'iconv_fallback_utf16le_utf8'; + $ConversionFunctionList['UTF-16BE']['ISO-8859-1'] = 'iconv_fallback_utf16be_iso88591'; + $ConversionFunctionList['UTF-16BE']['UTF-8'] = 'iconv_fallback_utf16be_utf8'; + } + if (isset($ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)])) { + $ConversionFunction = $ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)]; + return self::$ConversionFunction($string); + } + throw new Exception('PHP does not has mb_convert_encoding() or iconv() support - cannot convert from '.$in_charset.' to '.$out_charset); + } + + /** + * @param mixed $data + * @param string $charset + * + * @return mixed + */ + public static function recursiveMultiByteCharString2HTML($data, $charset='ISO-8859-1') { + if (is_string($data)) { + return self::MultiByteCharString2HTML($data, $charset); + } elseif (is_array($data)) { + $return_data = array(); + foreach ($data as $key => $value) { + $return_data[$key] = self::recursiveMultiByteCharString2HTML($value, $charset); + } + return $return_data; + } + // integer, float, objects, resources, etc + return $data; + } + + /** + * @param string|int|float $string + * @param string $charset + * + * @return string + */ + public static function MultiByteCharString2HTML($string, $charset='ISO-8859-1') { + $string = (string) $string; // in case trying to pass a numeric (float, int) string, would otherwise return an empty string + $HTMLstring = ''; + + switch (strtolower($charset)) { + case '1251': + case '1252': + case '866': + case '932': + case '936': + case '950': + case 'big5': + case 'big5-hkscs': + case 'cp1251': + case 'cp1252': + case 'cp866': + case 'euc-jp': + case 'eucjp': + case 'gb2312': + case 'ibm866': + case 'iso-8859-1': + case 'iso-8859-15': + case 'iso8859-1': + case 'iso8859-15': + case 'koi8-r': + case 'koi8-ru': + case 'koi8r': + case 'shift_jis': + case 'sjis': + case 'win-1251': + case 'windows-1251': + case 'windows-1252': + $HTMLstring = htmlentities($string, ENT_COMPAT, $charset); + break; + + case 'utf-8': + $strlen = strlen($string); + for ($i = 0; $i < $strlen; $i++) { + $char_ord_val = ord($string[$i]); + $charval = 0; + if ($char_ord_val < 0x80) { + $charval = $char_ord_val; + } elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F && $i+3 < $strlen) { + $charval = (($char_ord_val & 0x07) << 18); + $charval += ((ord($string[++$i]) & 0x3F) << 12); + $charval += ((ord($string[++$i]) & 0x3F) << 6); + $charval += (ord($string[++$i]) & 0x3F); + } elseif ((($char_ord_val & 0xE0) >> 5) == 0x07 && $i+2 < $strlen) { + $charval = (($char_ord_val & 0x0F) << 12); + $charval += ((ord($string[++$i]) & 0x3F) << 6); + $charval += (ord($string[++$i]) & 0x3F); + } elseif ((($char_ord_val & 0xC0) >> 6) == 0x03 && $i+1 < $strlen) { + $charval = (($char_ord_val & 0x1F) << 6); + $charval += (ord($string[++$i]) & 0x3F); + } + if (($charval >= 32) && ($charval <= 127)) { + $HTMLstring .= htmlentities(chr($charval)); + } else { + $HTMLstring .= '&#'.$charval.';'; + } + } + break; + + case 'utf-16le': + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = self::LittleEndian2Int(substr($string, $i, 2)); + if (($charval >= 32) && ($charval <= 127)) { + $HTMLstring .= chr($charval); + } else { + $HTMLstring .= '&#'.$charval.';'; + } + } + break; + + case 'utf-16be': + for ($i = 0; $i < strlen($string); $i += 2) { + $charval = self::BigEndian2Int(substr($string, $i, 2)); + if (($charval >= 32) && ($charval <= 127)) { + $HTMLstring .= chr($charval); + } else { + $HTMLstring .= '&#'.$charval.';'; + } + } + break; + + default: + $HTMLstring = 'ERROR: Character set "'.$charset.'" not supported in MultiByteCharString2HTML()'; + break; + } + return $HTMLstring; + } + + /** + * @param int $namecode + * + * @return string + */ + public static function RGADnameLookup($namecode) { + static $RGADname = array(); + if (empty($RGADname)) { + $RGADname[0] = 'not set'; + $RGADname[1] = 'Track Gain Adjustment'; + $RGADname[2] = 'Album Gain Adjustment'; + } + + return (isset($RGADname[$namecode]) ? $RGADname[$namecode] : ''); + } + + /** + * @param int $originatorcode + * + * @return string + */ + public static function RGADoriginatorLookup($originatorcode) { + static $RGADoriginator = array(); + if (empty($RGADoriginator)) { + $RGADoriginator[0] = 'unspecified'; + $RGADoriginator[1] = 'pre-set by artist/producer/mastering engineer'; + $RGADoriginator[2] = 'set by user'; + $RGADoriginator[3] = 'determined automatically'; + } + + return (isset($RGADoriginator[$originatorcode]) ? $RGADoriginator[$originatorcode] : ''); + } + + /** + * @param int $rawadjustment + * @param int $signbit + * + * @return float + */ + public static function RGADadjustmentLookup($rawadjustment, $signbit) { + $adjustment = (float) $rawadjustment / 10; + if ($signbit == 1) { + $adjustment *= -1; + } + return $adjustment; + } + + /** + * @param int $namecode + * @param int $originatorcode + * @param int $replaygain + * + * @return string + */ + public static function RGADgainString($namecode, $originatorcode, $replaygain) { + if ($replaygain < 0) { + $signbit = '1'; + } else { + $signbit = '0'; + } + $storedreplaygain = intval(round($replaygain * 10)); + $gainstring = str_pad(decbin($namecode), 3, '0', STR_PAD_LEFT); + $gainstring .= str_pad(decbin($originatorcode), 3, '0', STR_PAD_LEFT); + $gainstring .= $signbit; + $gainstring .= str_pad(decbin($storedreplaygain), 9, '0', STR_PAD_LEFT); + + return $gainstring; + } + + /** + * @param float $amplitude + * + * @return float + */ + public static function RGADamplitude2dB($amplitude) { + return 20 * log10($amplitude); + } + + /** + * @param string $imgData + * @param array $imageinfo + * + * @return array|false + */ + public static function GetDataImageSize($imgData, &$imageinfo=array()) { + static $tempdir = ''; + if (empty($tempdir)) { + if (function_exists('sys_get_temp_dir')) { + $tempdir = sys_get_temp_dir(); // https://github.com/JamesHeinrich/getID3/issues/52 + } + + // yes this is ugly, feel free to suggest a better way + if (include_once(dirname(__FILE__).'/getid3.php')) { + if ($getid3_temp = new getID3()) { + if ($getid3_temp_tempdir = $getid3_temp->tempdir) { + $tempdir = $getid3_temp_tempdir; + } + unset($getid3_temp, $getid3_temp_tempdir); + } + } + } + $GetDataImageSize = false; + if ($tempfilename = tempnam($tempdir, 'gI3')) { + if (is_writable($tempfilename) && is_file($tempfilename) && ($tmp = fopen($tempfilename, 'wb'))) { + fwrite($tmp, $imgData); + fclose($tmp); + $GetDataImageSize = @getimagesize($tempfilename, $imageinfo); + if (($GetDataImageSize === false) || !isset($GetDataImageSize[0]) || !isset($GetDataImageSize[1])) { + return false; + } + $GetDataImageSize['height'] = $GetDataImageSize[0]; + $GetDataImageSize['width'] = $GetDataImageSize[1]; + } + unlink($tempfilename); + } + return $GetDataImageSize; + } + + /** + * @param string $mime_type + * + * @return string + */ + public static function ImageExtFromMime($mime_type) { + // temporary way, works OK for now, but should be reworked in the future + return str_replace(array('image/', 'x-', 'jpeg'), array('', '', 'jpg'), $mime_type); + } + + /** + * @param array $ThisFileInfo + * + * @return bool + */ + public static function CopyTagsToComments(&$ThisFileInfo) { + + // Copy all entries from ['tags'] into common ['comments'] + if (!empty($ThisFileInfo['tags'])) { + foreach ($ThisFileInfo['tags'] as $tagtype => $tagarray) { + foreach ($tagarray as $tagname => $tagdata) { + foreach ($tagdata as $key => $value) { + if (!empty($value)) { + if (empty($ThisFileInfo['comments'][$tagname])) { + + // fall through and append value + + } elseif ($tagtype == 'id3v1') { + + $newvaluelength = strlen(trim($value)); + foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) { + $oldvaluelength = strlen(trim($existingvalue)); + if (($newvaluelength <= $oldvaluelength) && (substr($existingvalue, 0, $newvaluelength) == trim($value))) { + // new value is identical but shorter-than (or equal-length to) one already in comments - skip + break 2; + } + } + + } elseif (!is_array($value)) { + + $newvaluelength = strlen(trim($value)); + foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) { + $oldvaluelength = strlen(trim($existingvalue)); + if ((strlen($existingvalue) > 10) && ($newvaluelength > $oldvaluelength) && (substr(trim($value), 0, strlen($existingvalue)) == $existingvalue)) { + $ThisFileInfo['comments'][$tagname][$existingkey] = trim($value); + //break 2; + break; + } + } + + } + if (is_array($value) || empty($ThisFileInfo['comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo['comments'][$tagname])) { + $value = (is_string($value) ? trim($value) : $value); + if (!is_int($key) && !ctype_digit($key)) { + $ThisFileInfo['comments'][$tagname][$key] = $value; + } else { + if (isset($ThisFileInfo['comments'][$tagname])) { + $ThisFileInfo['comments'][$tagname] = array($value); + } else { + $ThisFileInfo['comments'][$tagname][] = $value; + } + } + } + } + } + } + } + + // attempt to standardize spelling of returned keys + $StandardizeFieldNames = array( + 'tracknumber' => 'track_number', + 'track' => 'track_number', + ); + foreach ($StandardizeFieldNames as $badkey => $goodkey) { + if (array_key_exists($badkey, $ThisFileInfo['comments']) && !array_key_exists($goodkey, $ThisFileInfo['comments'])) { + $ThisFileInfo['comments'][$goodkey] = $ThisFileInfo['comments'][$badkey]; + unset($ThisFileInfo['comments'][$badkey]); + } + } + + // Copy to ['comments_html'] + if (!empty($ThisFileInfo['comments'])) { + foreach ($ThisFileInfo['comments'] as $field => $values) { + if ($field == 'picture') { + // pictures can take up a lot of space, and we don't need multiple copies of them + // let there be a single copy in [comments][picture], and not elsewhere + continue; + } + foreach ($values as $index => $value) { + if (is_array($value)) { + $ThisFileInfo['comments_html'][$field][$index] = $value; + } else { + $ThisFileInfo['comments_html'][$field][$index] = str_replace('�', '', self::MultiByteCharString2HTML($value, $ThisFileInfo['encoding'])); + } + } + } + } + + } + return true; + } + + /** + * @param string $key + * @param int $begin + * @param int $end + * @param string $file + * @param string $name + * + * @return string + */ + public static function EmbeddedLookup($key, $begin, $end, $file, $name) { + + // Cached + static $cache; + if (isset($cache[$file][$name])) { + return (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : ''); + } + + // Init + $keylength = strlen($key); + $line_count = $end - $begin - 7; + + // Open php file + $fp = fopen($file, 'r'); + + // Discard $begin lines + for ($i = 0; $i < ($begin + 3); $i++) { + fgets($fp, 1024); + } + + // Loop thru line + while (0 < $line_count--) { + + // Read line + $line = ltrim(fgets($fp, 1024), "\t "); + + // METHOD A: only cache the matching key - less memory but slower on next lookup of not-previously-looked-up key + //$keycheck = substr($line, 0, $keylength); + //if ($key == $keycheck) { + // $cache[$file][$name][$keycheck] = substr($line, $keylength + 1); + // break; + //} + + // METHOD B: cache all keys in this lookup - more memory but faster on next lookup of not-previously-looked-up key + //$cache[$file][$name][substr($line, 0, $keylength)] = trim(substr($line, $keylength + 1)); + $explodedLine = explode("\t", $line, 2); + $ThisKey = (isset($explodedLine[0]) ? $explodedLine[0] : ''); + $ThisValue = (isset($explodedLine[1]) ? $explodedLine[1] : ''); + $cache[$file][$name][$ThisKey] = trim($ThisValue); + } + + // Close and return + fclose($fp); + return (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : ''); + } + + /** + * @param string $filename + * @param string $sourcefile + * @param bool $DieOnFailure + * + * @return bool + * @throws Exception + */ + public static function IncludeDependency($filename, $sourcefile, $DieOnFailure=false) { + global $GETID3_ERRORARRAY; + + if (file_exists($filename)) { + if (include_once($filename)) { + return true; + } else { + $diemessage = basename($sourcefile).' depends on '.$filename.', which has errors'; + } + } else { + $diemessage = basename($sourcefile).' depends on '.$filename.', which is missing'; + } + if ($DieOnFailure) { + throw new Exception($diemessage); + } else { + $GETID3_ERRORARRAY[] = $diemessage; + } + return false; + } + + /** + * @param string $string + * + * @return string + */ + public static function trimNullByte($string) { + return trim($string, "\x00"); + } + + /** + * @param string $path + * + * @return float|bool + */ + public static function getFileSizeSyscall($path) { + $filesize = false; + + if (GETID3_OS_ISWINDOWS) { + if (class_exists('COM')) { // From PHP 5.3.15 and 5.4.5, COM and DOTNET is no longer built into the php core.you have to add COM support in php.ini: + $filesystem = new COM('Scripting.FileSystemObject'); + $file = $filesystem->GetFile($path); + $filesize = $file->Size(); + unset($filesystem, $file); + } else { + $commandline = 'for %I in ('.escapeshellarg($path).') do @echo %~zI'; + } + } else { + $commandline = 'ls -l '.escapeshellarg($path).' | awk \'{print $5}\''; + } + if (isset($commandline)) { + $output = trim(`$commandline`); + if (ctype_digit($output)) { + $filesize = (float) $output; + } + } + return $filesize; + } + + /** + * @param string $filename + * + * @return string|false + */ + public static function truepath($filename) { + // 2017-11-08: this could use some improvement, patches welcome + if (preg_match('#^(\\\\\\\\|//)[a-z0-9]#i', $filename, $matches)) { + // PHP's built-in realpath function does not work on UNC Windows shares + $goodpath = array(); + foreach (explode('/', str_replace('\\', '/', $filename)) as $part) { + if ($part == '.') { + continue; + } + if ($part == '..') { + if (count($goodpath)) { + array_pop($goodpath); + } else { + // cannot step above this level, already at top level + return false; + } + } else { + $goodpath[] = $part; + } + } + return implode(DIRECTORY_SEPARATOR, $goodpath); + } + return realpath($filename); + } + + /** + * Workaround for Bug #37268 (https://bugs.php.net/bug.php?id=37268) + * + * @param string $path A path. + * @param string $suffix If the name component ends in suffix this will also be cut off. + * + * @return string + */ + public static function mb_basename($path, $suffix = null) { + $splited = preg_split('#/#', rtrim($path, '/ ')); + return substr(basename('X'.$splited[count($splited) - 1], $suffix), 1); + } + +} diff --git a/wp-includes/ID3/getid3.php b/wp-includes/ID3/getid3.php new file mode 100644 index 0000000..cb25253 --- /dev/null +++ b/wp-includes/ID3/getid3.php @@ -0,0 +1,2181 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// // +// Please see readme.txt for more information // +// /// +///////////////////////////////////////////////////////////////// + +// define a constant rather than looking up every time it is needed +if (!defined('GETID3_OS_ISWINDOWS')) { + define('GETID3_OS_ISWINDOWS', (stripos(PHP_OS, 'WIN') === 0)); +} +// Get base path of getID3() - ONCE +if (!defined('GETID3_INCLUDEPATH')) { + define('GETID3_INCLUDEPATH', dirname(__FILE__).DIRECTORY_SEPARATOR); +} +// Workaround Bug #39923 (https://bugs.php.net/bug.php?id=39923) +if (!defined('IMG_JPG') && defined('IMAGETYPE_JPEG')) { + define('IMG_JPG', IMAGETYPE_JPEG); +} +if (!defined('ENT_SUBSTITUTE')) { // PHP5.3 adds ENT_IGNORE, PHP5.4 adds ENT_SUBSTITUTE + define('ENT_SUBSTITUTE', (defined('ENT_IGNORE') ? ENT_IGNORE : 8)); +} + +/* +https://www.getid3.org/phpBB3/viewtopic.php?t=2114 +If you are running into a the problem where filenames with special characters are being handled +incorrectly by external helper programs (e.g. metaflac), notably with the special characters removed, +and you are passing in the filename in UTF8 (typically via a HTML form), try uncommenting this line: +*/ +//setlocale(LC_CTYPE, 'en_US.UTF-8'); + +// attempt to define temp dir as something flexible but reliable +$temp_dir = ini_get('upload_tmp_dir'); +if ($temp_dir && (!is_dir($temp_dir) || !is_readable($temp_dir))) { + $temp_dir = ''; +} +if (!$temp_dir && function_exists('sys_get_temp_dir')) { // sys_get_temp_dir added in PHP v5.2.1 + // sys_get_temp_dir() may give inaccessible temp dir, e.g. with open_basedir on virtual hosts + $temp_dir = sys_get_temp_dir(); +} +$temp_dir = @realpath($temp_dir); // see https://github.com/JamesHeinrich/getID3/pull/10 +$open_basedir = ini_get('open_basedir'); +if ($open_basedir) { + // e.g. "/var/www/vhosts/getid3.org/httpdocs/:/tmp/" + $temp_dir = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $temp_dir); + $open_basedir = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $open_basedir); + if (substr($temp_dir, -1, 1) != DIRECTORY_SEPARATOR) { + $temp_dir .= DIRECTORY_SEPARATOR; + } + $found_valid_tempdir = false; + $open_basedirs = explode(PATH_SEPARATOR, $open_basedir); + foreach ($open_basedirs as $basedir) { + if (substr($basedir, -1, 1) != DIRECTORY_SEPARATOR) { + $basedir .= DIRECTORY_SEPARATOR; + } + if (preg_match('#^'.preg_quote($basedir).'#', $temp_dir)) { + $found_valid_tempdir = true; + break; + } + } + if (!$found_valid_tempdir) { + $temp_dir = ''; + } + unset($open_basedirs, $found_valid_tempdir, $basedir); +} +if (!$temp_dir) { + $temp_dir = '*'; // invalid directory name should force tempnam() to use system default temp dir +} +// $temp_dir = '/something/else/'; // feel free to override temp dir here if it works better for your system +if (!defined('GETID3_TEMP_DIR')) { + define('GETID3_TEMP_DIR', $temp_dir); +} +unset($open_basedir, $temp_dir); + +// End: Defines + + +class getID3 +{ + /* + * Settings + */ + + /** + * CASE SENSITIVE! - i.e. (must be supported by iconv()). Examples: ISO-8859-1 UTF-8 UTF-16 UTF-16BE + * + * @var string + */ + public $encoding = 'UTF-8'; + + /** + * Should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'EUC-CN' or 'CP1252' + * + * @var string + */ + public $encoding_id3v1 = 'ISO-8859-1'; + + /* + * Optional tag checks - disable for speed. + */ + + /** + * Read and process ID3v1 tags + * + * @var bool + */ + public $option_tag_id3v1 = true; + + /** + * Read and process ID3v2 tags + * + * @var bool + */ + public $option_tag_id3v2 = true; + + /** + * Read and process Lyrics3 tags + * + * @var bool + */ + public $option_tag_lyrics3 = true; + + /** + * Read and process APE tags + * + * @var bool + */ + public $option_tag_apetag = true; + + /** + * Copy tags to root key 'tags' and encode to $this->encoding + * + * @var bool + */ + public $option_tags_process = true; + + /** + * Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities + * + * @var bool + */ + public $option_tags_html = true; + + /* + * Optional tag/comment calculations + */ + + /** + * Calculate additional info such as bitrate, channelmode etc + * + * @var bool + */ + public $option_extra_info = true; + + /* + * Optional handling of embedded attachments (e.g. images) + */ + + /** + * Defaults to true (ATTACHMENTS_INLINE) for backward compatibility + * + * @var bool|string + */ + public $option_save_attachments = true; + + /* + * Optional calculations + */ + + /** + * Get MD5 sum of data part - slow + * + * @var bool + */ + public $option_md5_data = false; + + /** + * Use MD5 of source file if availble - only FLAC and OptimFROG + * + * @var bool + */ + public $option_md5_data_source = false; + + /** + * Get SHA1 sum of data part - slow + * + * @var bool + */ + public $option_sha1_data = false; + + /** + * Check whether file is larger than 2GB and thus not supported by 32-bit PHP (null: auto-detect based on + * PHP_INT_MAX) + * + * @var bool|null + */ + public $option_max_2gb_check; + + /** + * Read buffer size in bytes + * + * @var int + */ + public $option_fread_buffer_size = 32768; + + // Public variables + + /** + * Filename of file being analysed. + * + * @var string + */ + public $filename; + + /** + * Filepointer to file being analysed. + * + * @var resource + */ + public $fp; + + /** + * Result array. + * + * @var array + */ + public $info; + + /** + * @var string + */ + public $tempdir = GETID3_TEMP_DIR; + + /** + * @var int + */ + public $memory_limit = 0; + + /** + * @var string + */ + protected $startup_error = ''; + + /** + * @var string + */ + protected $startup_warning = ''; + + const VERSION = '1.9.18-201907240906'; + const FREAD_BUFFER_SIZE = 32768; + + const ATTACHMENTS_NONE = false; + const ATTACHMENTS_INLINE = true; + + public function __construct() { + + // Check for PHP version + $required_php_version = '5.3.0'; + if (version_compare(PHP_VERSION, $required_php_version, '<')) { + $this->startup_error .= 'getID3() requires PHP v'.$required_php_version.' or higher - you are running v'.PHP_VERSION."\n"; + return; + } + + // Check memory + $this->memory_limit = ini_get('memory_limit'); + if (preg_match('#([0-9]+) ?M#i', $this->memory_limit, $matches)) { + // could be stored as "16M" rather than 16777216 for example + $this->memory_limit = $matches[1] * 1048576; + } elseif (preg_match('#([0-9]+) ?G#i', $this->memory_limit, $matches)) { // The 'G' modifier is available since PHP 5.1.0 + // could be stored as "2G" rather than 2147483648 for example + $this->memory_limit = $matches[1] * 1073741824; + } + if ($this->memory_limit <= 0) { + // memory limits probably disabled + } elseif ($this->memory_limit <= 4194304) { + $this->startup_error .= 'PHP has less than 4MB available memory and will very likely run out. Increase memory_limit in php.ini'."\n"; + } elseif ($this->memory_limit <= 12582912) { + $this->startup_warning .= 'PHP has less than 12MB available memory and might run out if all modules are loaded. Increase memory_limit in php.ini'."\n"; + } + + // Check safe_mode off + if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) { + $this->warning('WARNING: Safe mode is on, shorten support disabled, md5data/sha1data for ogg vorbis disabled, ogg vorbos/flac tag writing disabled.'); + } + + if (($mbstring_func_overload = ini_get('mbstring.func_overload')) && ($mbstring_func_overload & 0x02)) { + // http://php.net/manual/en/mbstring.overload.php + // "mbstring.func_overload in php.ini is a positive value that represents a combination of bitmasks specifying the categories of functions to be overloaded. It should be set to 1 to overload the mail() function. 2 for string functions, 4 for regular expression functions" + // getID3 cannot run when string functions are overloaded. It doesn't matter if mail() or ereg* functions are overloaded since getID3 does not use those. + $this->startup_error .= 'WARNING: php.ini contains "mbstring.func_overload = '.ini_get('mbstring.func_overload').'", getID3 cannot run with this setting (bitmask 2 (string functions) cannot be set). Recommended to disable entirely.'."\n"; + } + + // WORDPRESS CHANGE FROM UPSTREAM + // Comment out deprecated function + /* + // Check for magic_quotes_runtime + if (function_exists('get_magic_quotes_runtime')) { + if (get_magic_quotes_runtime()) { + $this->startup_error .= 'magic_quotes_runtime must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_runtime(0) and set_magic_quotes_runtime(1).'."\n"; + } + } + + // Check for magic_quotes_gpc + if (function_exists('magic_quotes_gpc')) { + if (get_magic_quotes_gpc()) { + $this->startup_error .= 'magic_quotes_gpc must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_gpc(0) and set_magic_quotes_gpc(1).'."\n"; + } + } + **/ + + // Load support library + if (!include_once(GETID3_INCLUDEPATH.'getid3.lib.php')) { + $this->startup_error .= 'getid3.lib.php is missing or corrupt'."\n"; + } + + if ($this->option_max_2gb_check === null) { + $this->option_max_2gb_check = (PHP_INT_MAX <= 2147483647); + } + + + // Needed for Windows only: + // Define locations of helper applications for Shorten, VorbisComment, MetaFLAC + // as well as other helper functions such as head, etc + // This path cannot contain spaces, but the below code will attempt to get the + // 8.3-equivalent path automatically + // IMPORTANT: This path must include the trailing slash + if (GETID3_OS_ISWINDOWS && !defined('GETID3_HELPERAPPSDIR')) { + + $helperappsdir = GETID3_INCLUDEPATH.'..'.DIRECTORY_SEPARATOR.'helperapps'; // must not have any space in this path + + if (!is_dir($helperappsdir)) { + $this->startup_warning .= '"'.$helperappsdir.'" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist'."\n"; + } elseif (strpos(realpath($helperappsdir), ' ') !== false) { + $DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir)); + $path_so_far = array(); + foreach ($DirPieces as $key => $value) { + if (strpos($value, ' ') !== false) { + if (!empty($path_so_far)) { + $commandline = 'dir /x '.escapeshellarg(implode(DIRECTORY_SEPARATOR, $path_so_far)); + $dir_listing = `$commandline`; + $lines = explode("\n", $dir_listing); + foreach ($lines as $line) { + $line = trim($line); + if (preg_match('#^([0-9/]{10}) +([0-9:]{4,5}( [AP]M)?) +(|[0-9,]+) +([^ ]{0,11}) +(.+)$#', $line, $matches)) { + list($dummy, $date, $time, $ampm, $filesize, $shortname, $filename) = $matches; + if ((strtoupper($filesize) == '') && (strtolower($filename) == strtolower($value))) { + $value = $shortname; + } + } + } + } else { + $this->startup_warning .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary. You can run "dir /x" from the commandline to see the correct 8.3-style names.'."\n"; + } + } + $path_so_far[] = $value; + } + $helperappsdir = implode(DIRECTORY_SEPARATOR, $path_so_far); + } + define('GETID3_HELPERAPPSDIR', $helperappsdir.DIRECTORY_SEPARATOR); + } + + if (!empty($this->startup_error)) { + echo $this->startup_error; + throw new getid3_exception($this->startup_error); + } + } + + /** + * @return string + */ + public function version() { + return self::VERSION; + } + + /** + * @return int + */ + public function fread_buffer_size() { + return $this->option_fread_buffer_size; + } + + /** + * @param array $optArray + * + * @return bool + */ + public function setOption($optArray) { + if (!is_array($optArray) || empty($optArray)) { + return false; + } + foreach ($optArray as $opt => $val) { + if (isset($this->$opt) === false) { + continue; + } + $this->$opt = $val; + } + return true; + } + + /** + * @param string $filename + * @param int $filesize + * + * @return bool + * + * @throws getid3_exception + */ + public function openfile($filename, $filesize=null, $fp=null) { + try { + if (!empty($this->startup_error)) { + throw new getid3_exception($this->startup_error); + } + if (!empty($this->startup_warning)) { + foreach (explode("\n", $this->startup_warning) as $startup_warning) { + $this->warning($startup_warning); + } + } + + // init result array and set parameters + $this->filename = $filename; + $this->info = array(); + $this->info['GETID3_VERSION'] = $this->version(); + $this->info['php_memory_limit'] = (($this->memory_limit > 0) ? $this->memory_limit : false); + + // remote files not supported + if (preg_match('#^(ht|f)tp://#', $filename)) { + throw new getid3_exception('Remote files are not supported - please copy the file locally first'); + } + + $filename = str_replace('/', DIRECTORY_SEPARATOR, $filename); + //$filename = preg_replace('#(?fp = fopen($filename, 'rb'))) { // see https://www.getid3.org/phpBB3/viewtopic.php?t=1720 + if (($fp != null) && ((get_resource_type($fp) == 'file') || (get_resource_type($fp) == 'stream'))) { + $this->fp = $fp; + } elseif ((is_readable($filename) || file_exists($filename)) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) { + // great + } else { + $errormessagelist = array(); + if (!is_readable($filename)) { + $errormessagelist[] = '!is_readable'; + } + if (!is_file($filename)) { + $errormessagelist[] = '!is_file'; + } + if (!file_exists($filename)) { + $errormessagelist[] = '!file_exists'; + } + if (empty($errormessagelist)) { + $errormessagelist[] = 'fopen failed'; + } + throw new getid3_exception('Could not open "'.$filename.'" ('.implode('; ', $errormessagelist).')'); + } + + $this->info['filesize'] = (!is_null($filesize) ? $filesize : filesize($filename)); + // set redundant parameters - might be needed in some include file + // filenames / filepaths in getID3 are always expressed with forward slashes (unix-style) for both Windows and other to try and minimize confusion + $filename = str_replace('\\', '/', $filename); + $this->info['filepath'] = str_replace('\\', '/', realpath(dirname($filename))); + $this->info['filename'] = getid3_lib::mb_basename($filename); + $this->info['filenamepath'] = $this->info['filepath'].'/'.$this->info['filename']; + + // set more parameters + $this->info['avdataoffset'] = 0; + $this->info['avdataend'] = $this->info['filesize']; + $this->info['fileformat'] = ''; // filled in later + $this->info['audio']['dataformat'] = ''; // filled in later, unset if not used + $this->info['video']['dataformat'] = ''; // filled in later, unset if not used + $this->info['tags'] = array(); // filled in later, unset if not used + $this->info['error'] = array(); // filled in later, unset if not used + $this->info['warning'] = array(); // filled in later, unset if not used + $this->info['comments'] = array(); // filled in later, unset if not used + $this->info['encoding'] = $this->encoding; // required by id3v2 and iso modules - can be unset at the end if desired + + // option_max_2gb_check + if ($this->option_max_2gb_check) { + // PHP (32-bit all, and 64-bit Windows) doesn't support integers larger than 2^31 (~2GB) + // filesize() simply returns (filesize % (pow(2, 32)), no matter the actual filesize + // ftell() returns 0 if seeking to the end is beyond the range of unsigned integer + $fseek = fseek($this->fp, 0, SEEK_END); + if (($fseek < 0) || (($this->info['filesize'] != 0) && (ftell($this->fp) == 0)) || + ($this->info['filesize'] < 0) || + (ftell($this->fp) < 0)) { + $real_filesize = getid3_lib::getFileSizeSyscall($this->info['filenamepath']); + + if ($real_filesize === false) { + unset($this->info['filesize']); + fclose($this->fp); + throw new getid3_exception('Unable to determine actual filesize. File is most likely larger than '.round(PHP_INT_MAX / 1073741824).'GB and is not supported by PHP.'); + } elseif (getid3_lib::intValueSupported($real_filesize)) { + unset($this->info['filesize']); + fclose($this->fp); + throw new getid3_exception('PHP seems to think the file is larger than '.round(PHP_INT_MAX / 1073741824).'GB, but filesystem reports it as '.number_format($real_filesize / 1073741824, 3).'GB, please report to info@getid3.org'); + } + $this->info['filesize'] = $real_filesize; + $this->warning('File is larger than '.round(PHP_INT_MAX / 1073741824).'GB (filesystem reports it as '.number_format($real_filesize / 1073741824, 3).'GB) and is not properly supported by PHP.'); + } + } + + return true; + + } catch (Exception $e) { + $this->error($e->getMessage()); + } + return false; + } + + /** + * analyze file + * + * @param string $filename + * @param int $filesize + * @param string $original_filename + * + * @return array + */ + public function analyze($filename, $filesize=null, $original_filename='', $fp=null) { + try { + if (!$this->openfile($filename, $filesize, $fp)) { + return $this->info; + } + + // Handle tags + foreach (array('id3v2'=>'id3v2', 'id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) { + $option_tag = 'option_tag_'.$tag_name; + if ($this->$option_tag) { + $this->include_module('tag.'.$tag_name); + try { + $tag_class = 'getid3_'.$tag_name; + $tag = new $tag_class($this); + $tag->Analyze(); + } + catch (getid3_exception $e) { + throw $e; + } + } + } + if (isset($this->info['id3v2']['tag_offset_start'])) { + $this->info['avdataoffset'] = max($this->info['avdataoffset'], $this->info['id3v2']['tag_offset_end']); + } + foreach (array('id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) { + if (isset($this->info[$tag_key]['tag_offset_start'])) { + $this->info['avdataend'] = min($this->info['avdataend'], $this->info[$tag_key]['tag_offset_start']); + } + } + + // ID3v2 detection (NOT parsing), even if ($this->option_tag_id3v2 == false) done to make fileformat easier + if (!$this->option_tag_id3v2) { + fseek($this->fp, 0); + $header = fread($this->fp, 10); + if ((substr($header, 0, 3) == 'ID3') && (strlen($header) == 10)) { + $this->info['id3v2']['header'] = true; + $this->info['id3v2']['majorversion'] = ord($header[3]); + $this->info['id3v2']['minorversion'] = ord($header[4]); + $this->info['avdataoffset'] += getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length + } + } + + // read 32 kb file data + fseek($this->fp, $this->info['avdataoffset']); + $formattest = fread($this->fp, 32774); + + // determine format + $determined_format = $this->GetFileFormat($formattest, ($original_filename ? $original_filename : $filename)); + + // unable to determine file format + if (!$determined_format) { + fclose($this->fp); + return $this->error('unable to determine file format'); + } + + // check for illegal ID3 tags + if (isset($determined_format['fail_id3']) && (in_array('id3v1', $this->info['tags']) || in_array('id3v2', $this->info['tags']))) { + if ($determined_format['fail_id3'] === 'ERROR') { + fclose($this->fp); + return $this->error('ID3 tags not allowed on this file type.'); + } elseif ($determined_format['fail_id3'] === 'WARNING') { + $this->warning('ID3 tags not allowed on this file type.'); + } + } + + // check for illegal APE tags + if (isset($determined_format['fail_ape']) && in_array('ape', $this->info['tags'])) { + if ($determined_format['fail_ape'] === 'ERROR') { + fclose($this->fp); + return $this->error('APE tags not allowed on this file type.'); + } elseif ($determined_format['fail_ape'] === 'WARNING') { + $this->warning('APE tags not allowed on this file type.'); + } + } + + // set mime type + $this->info['mime_type'] = $determined_format['mime_type']; + + // supported format signature pattern detected, but module deleted + if (!file_exists(GETID3_INCLUDEPATH.$determined_format['include'])) { + fclose($this->fp); + return $this->error('Format not supported, module "'.$determined_format['include'].'" was removed.'); + } + + // module requires mb_convert_encoding/iconv support + // Check encoding/iconv support + if (!empty($determined_format['iconv_req']) && !function_exists('mb_convert_encoding') && !function_exists('iconv') && !in_array($this->encoding, array('ISO-8859-1', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'UTF-16'))) { + $errormessage = 'mb_convert_encoding() or iconv() support is required for this module ('.$determined_format['include'].') for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. '; + if (GETID3_OS_ISWINDOWS) { + $errormessage .= 'PHP does not have mb_convert_encoding() or iconv() support. Please enable php_mbstring.dll / php_iconv.dll in php.ini, and copy php_mbstring.dll / iconv.dll from c:/php/dlls to c:/windows/system32'; + } else { + $errormessage .= 'PHP is not compiled with mb_convert_encoding() or iconv() support. Please recompile with the --enable-mbstring / --with-iconv switch'; + } + return $this->error($errormessage); + } + + // include module + include_once(GETID3_INCLUDEPATH.$determined_format['include']); + + // instantiate module class + $class_name = 'getid3_'.$determined_format['module']; + if (!class_exists($class_name)) { + return $this->error('Format not supported, module "'.$determined_format['include'].'" is corrupt.'); + } + $class = new $class_name($this); + $class->Analyze(); + unset($class); + + // close file + fclose($this->fp); + + // process all tags - copy to 'tags' and convert charsets + if ($this->option_tags_process) { + $this->HandleAllTags(); + } + + // perform more calculations + if ($this->option_extra_info) { + $this->ChannelsBitratePlaytimeCalculations(); + $this->CalculateCompressionRatioVideo(); + $this->CalculateCompressionRatioAudio(); + $this->CalculateReplayGain(); + $this->ProcessAudioStreams(); + } + + // get the MD5 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags + if ($this->option_md5_data) { + // do not calc md5_data if md5_data_source is present - set by flac only - future MPC/SV8 too + if (!$this->option_md5_data_source || empty($this->info['md5_data_source'])) { + $this->getHashdata('md5'); + } + } + + // get the SHA1 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags + if ($this->option_sha1_data) { + $this->getHashdata('sha1'); + } + + // remove undesired keys + $this->CleanUp(); + + } catch (Exception $e) { + $this->error('Caught exception: '.$e->getMessage()); + } + + // return info array + return $this->info; + } + + + /** + * Error handling. + * + * @param string $message + * + * @return array + */ + public function error($message) { + $this->CleanUp(); + if (!isset($this->info['error'])) { + $this->info['error'] = array(); + } + $this->info['error'][] = $message; + return $this->info; + } + + + /** + * Warning handling. + * + * @param string $message + * + * @return bool + */ + public function warning($message) { + $this->info['warning'][] = $message; + return true; + } + + + /** + * @return bool + */ + private function CleanUp() { + + // remove possible empty keys + $AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams', 'bitrate'); + foreach ($AVpossibleEmptyKeys as $dummy => $key) { + if (empty($this->info['audio'][$key]) && isset($this->info['audio'][$key])) { + unset($this->info['audio'][$key]); + } + if (empty($this->info['video'][$key]) && isset($this->info['video'][$key])) { + unset($this->info['video'][$key]); + } + } + + // remove empty root keys + if (!empty($this->info)) { + foreach ($this->info as $key => $value) { + if (empty($this->info[$key]) && ($this->info[$key] !== 0) && ($this->info[$key] !== '0')) { + unset($this->info[$key]); + } + } + } + + // remove meaningless entries from unknown-format files + if (empty($this->info['fileformat'])) { + if (isset($this->info['avdataoffset'])) { + unset($this->info['avdataoffset']); + } + if (isset($this->info['avdataend'])) { + unset($this->info['avdataend']); + } + } + + // remove possible duplicated identical entries + if (!empty($this->info['error'])) { + $this->info['error'] = array_values(array_unique($this->info['error'])); + } + if (!empty($this->info['warning'])) { + $this->info['warning'] = array_values(array_unique($this->info['warning'])); + } + + // remove "global variable" type keys + unset($this->info['php_memory_limit']); + + return true; + } + + /** + * Return array containing information about all supported formats. + * + * @return array + */ + public function GetFileFormatArray() { + static $format_info = array(); + if (empty($format_info)) { + $format_info = array( + + // Audio formats + + // AC-3 - audio - Dolby AC-3 / Dolby Digital + 'ac3' => array( + 'pattern' => '^\\x0B\\x77', + 'group' => 'audio', + 'module' => 'ac3', + 'mime_type' => 'audio/ac3', + ), + + // AAC - audio - Advanced Audio Coding (AAC) - ADIF format + 'adif' => array( + 'pattern' => '^ADIF', + 'group' => 'audio', + 'module' => 'aac', + 'mime_type' => 'audio/aac', + 'fail_ape' => 'WARNING', + ), + +/* + // AA - audio - Audible Audiobook + 'aa' => array( + 'pattern' => '^.{4}\\x57\\x90\\x75\\x36', + 'group' => 'audio', + 'module' => 'aa', + 'mime_type' => 'audio/audible', + ), +*/ + // AAC - audio - Advanced Audio Coding (AAC) - ADTS format (very similar to MP3) + 'adts' => array( + 'pattern' => '^\\xFF[\\xF0-\\xF1\\xF8-\\xF9]', + 'group' => 'audio', + 'module' => 'aac', + 'mime_type' => 'audio/aac', + 'fail_ape' => 'WARNING', + ), + + + // AU - audio - NeXT/Sun AUdio (AU) + 'au' => array( + 'pattern' => '^\\.snd', + 'group' => 'audio', + 'module' => 'au', + 'mime_type' => 'audio/basic', + ), + + // AMR - audio - Adaptive Multi Rate + 'amr' => array( + 'pattern' => '^\\x23\\x21AMR\\x0A', // #!AMR[0A] + 'group' => 'audio', + 'module' => 'amr', + 'mime_type' => 'audio/amr', + ), + + // AVR - audio - Audio Visual Research + 'avr' => array( + 'pattern' => '^2BIT', + 'group' => 'audio', + 'module' => 'avr', + 'mime_type' => 'application/octet-stream', + ), + + // BONK - audio - Bonk v0.9+ + 'bonk' => array( + 'pattern' => '^\\x00(BONK|INFO|META| ID3)', + 'group' => 'audio', + 'module' => 'bonk', + 'mime_type' => 'audio/xmms-bonk', + ), + + // DSF - audio - Direct Stream Digital (DSD) Storage Facility files (DSF) - https://en.wikipedia.org/wiki/Direct_Stream_Digital + 'dsf' => array( + 'pattern' => '^DSD ', // including trailing space: 44 53 44 20 + 'group' => 'audio', + 'module' => 'dsf', + 'mime_type' => 'audio/dsd', + ), + + // DSS - audio - Digital Speech Standard + 'dss' => array( + 'pattern' => '^[\\x02-\\x08]ds[s2]', + 'group' => 'audio', + 'module' => 'dss', + 'mime_type' => 'application/octet-stream', + ), + + // DTS - audio - Dolby Theatre System + 'dts' => array( + 'pattern' => '^\\x7F\\xFE\\x80\\x01', + 'group' => 'audio', + 'module' => 'dts', + 'mime_type' => 'audio/dts', + ), + + // FLAC - audio - Free Lossless Audio Codec + 'flac' => array( + 'pattern' => '^fLaC', + 'group' => 'audio', + 'module' => 'flac', + 'mime_type' => 'audio/flac', + ), + + // LA - audio - Lossless Audio (LA) + 'la' => array( + 'pattern' => '^LA0[2-4]', + 'group' => 'audio', + 'module' => 'la', + 'mime_type' => 'application/octet-stream', + ), + + // LPAC - audio - Lossless Predictive Audio Compression (LPAC) + 'lpac' => array( + 'pattern' => '^LPAC', + 'group' => 'audio', + 'module' => 'lpac', + 'mime_type' => 'application/octet-stream', + ), + + // MIDI - audio - MIDI (Musical Instrument Digital Interface) + 'midi' => array( + 'pattern' => '^MThd', + 'group' => 'audio', + 'module' => 'midi', + 'mime_type' => 'audio/midi', + ), + + // MAC - audio - Monkey's Audio Compressor + 'mac' => array( + 'pattern' => '^MAC ', + 'group' => 'audio', + 'module' => 'monkey', + 'mime_type' => 'audio/x-monkeys-audio', + ), + +// has been known to produce false matches in random files (e.g. JPEGs), leave out until more precise matching available +// // MOD - audio - MODule (assorted sub-formats) +// 'mod' => array( +// 'pattern' => '^.{1080}(M\\.K\\.|M!K!|FLT4|FLT8|[5-9]CHN|[1-3][0-9]CH)', +// 'group' => 'audio', +// 'module' => 'mod', +// 'option' => 'mod', +// 'mime_type' => 'audio/mod', +// ), + + // MOD - audio - MODule (Impulse Tracker) + 'it' => array( + 'pattern' => '^IMPM', + 'group' => 'audio', + 'module' => 'mod', + //'option' => 'it', + 'mime_type' => 'audio/it', + ), + + // MOD - audio - MODule (eXtended Module, various sub-formats) + 'xm' => array( + 'pattern' => '^Extended Module', + 'group' => 'audio', + 'module' => 'mod', + //'option' => 'xm', + 'mime_type' => 'audio/xm', + ), + + // MOD - audio - MODule (ScreamTracker) + 's3m' => array( + 'pattern' => '^.{44}SCRM', + 'group' => 'audio', + 'module' => 'mod', + //'option' => 's3m', + 'mime_type' => 'audio/s3m', + ), + + // MPC - audio - Musepack / MPEGplus + 'mpc' => array( + 'pattern' => '^(MPCK|MP\\+|[\\x00\\x01\\x10\\x11\\x40\\x41\\x50\\x51\\x80\\x81\\x90\\x91\\xC0\\xC1\\xD0\\xD1][\\x20-\\x37][\\x00\\x20\\x40\\x60\\x80\\xA0\\xC0\\xE0])', + 'group' => 'audio', + 'module' => 'mpc', + 'mime_type' => 'audio/x-musepack', + ), + + // MP3 - audio - MPEG-audio Layer 3 (very similar to AAC-ADTS) + 'mp3' => array( + 'pattern' => '^\\xFF[\\xE2-\\xE7\\xF2-\\xF7\\xFA-\\xFF][\\x00-\\x0B\\x10-\\x1B\\x20-\\x2B\\x30-\\x3B\\x40-\\x4B\\x50-\\x5B\\x60-\\x6B\\x70-\\x7B\\x80-\\x8B\\x90-\\x9B\\xA0-\\xAB\\xB0-\\xBB\\xC0-\\xCB\\xD0-\\xDB\\xE0-\\xEB\\xF0-\\xFB]', + 'group' => 'audio', + 'module' => 'mp3', + 'mime_type' => 'audio/mpeg', + ), + + // OFR - audio - OptimFROG + 'ofr' => array( + 'pattern' => '^(\\*RIFF|OFR)', + 'group' => 'audio', + 'module' => 'optimfrog', + 'mime_type' => 'application/octet-stream', + ), + + // RKAU - audio - RKive AUdio compressor + 'rkau' => array( + 'pattern' => '^RKA', + 'group' => 'audio', + 'module' => 'rkau', + 'mime_type' => 'application/octet-stream', + ), + + // SHN - audio - Shorten + 'shn' => array( + 'pattern' => '^ajkg', + 'group' => 'audio', + 'module' => 'shorten', + 'mime_type' => 'audio/xmms-shn', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // TTA - audio - TTA Lossless Audio Compressor (http://tta.corecodec.org) + 'tta' => array( + 'pattern' => '^TTA', // could also be '^TTA(\\x01|\\x02|\\x03|2|1)' + 'group' => 'audio', + 'module' => 'tta', + 'mime_type' => 'application/octet-stream', + ), + + // VOC - audio - Creative Voice (VOC) + 'voc' => array( + 'pattern' => '^Creative Voice File', + 'group' => 'audio', + 'module' => 'voc', + 'mime_type' => 'audio/voc', + ), + + // VQF - audio - transform-domain weighted interleave Vector Quantization Format (VQF) + 'vqf' => array( + 'pattern' => '^TWIN', + 'group' => 'audio', + 'module' => 'vqf', + 'mime_type' => 'application/octet-stream', + ), + + // WV - audio - WavPack (v4.0+) + 'wv' => array( + 'pattern' => '^wvpk', + 'group' => 'audio', + 'module' => 'wavpack', + 'mime_type' => 'application/octet-stream', + ), + + + // Audio-Video formats + + // ASF - audio/video - Advanced Streaming Format, Windows Media Video, Windows Media Audio + 'asf' => array( + 'pattern' => '^\\x30\\x26\\xB2\\x75\\x8E\\x66\\xCF\\x11\\xA6\\xD9\\x00\\xAA\\x00\\x62\\xCE\\x6C', + 'group' => 'audio-video', + 'module' => 'asf', + 'mime_type' => 'video/x-ms-asf', + 'iconv_req' => false, + ), + + // BINK - audio/video - Bink / Smacker + 'bink' => array( + 'pattern' => '^(BIK|SMK)', + 'group' => 'audio-video', + 'module' => 'bink', + 'mime_type' => 'application/octet-stream', + ), + + // FLV - audio/video - FLash Video + 'flv' => array( + 'pattern' => '^FLV[\\x01]', + 'group' => 'audio-video', + 'module' => 'flv', + 'mime_type' => 'video/x-flv', + ), + + // MKAV - audio/video - Mastroka + 'matroska' => array( + 'pattern' => '^\\x1A\\x45\\xDF\\xA3', + 'group' => 'audio-video', + 'module' => 'matroska', + 'mime_type' => 'video/x-matroska', // may also be audio/x-matroska + ), + + // MPEG - audio/video - MPEG (Moving Pictures Experts Group) + 'mpeg' => array( + 'pattern' => '^\\x00\\x00\\x01[\\xB3\\xBA]', + 'group' => 'audio-video', + 'module' => 'mpeg', + 'mime_type' => 'video/mpeg', + ), + + // NSV - audio/video - Nullsoft Streaming Video (NSV) + 'nsv' => array( + 'pattern' => '^NSV[sf]', + 'group' => 'audio-video', + 'module' => 'nsv', + 'mime_type' => 'application/octet-stream', + ), + + // Ogg - audio/video - Ogg (Ogg-Vorbis, Ogg-FLAC, Speex, Ogg-Theora(*), Ogg-Tarkin(*)) + 'ogg' => array( + 'pattern' => '^OggS', + 'group' => 'audio', + 'module' => 'ogg', + 'mime_type' => 'application/ogg', + 'fail_id3' => 'WARNING', + 'fail_ape' => 'WARNING', + ), + + // QT - audio/video - Quicktime + 'quicktime' => array( + 'pattern' => '^.{4}(cmov|free|ftyp|mdat|moov|pnot|skip|wide)', + 'group' => 'audio-video', + 'module' => 'quicktime', + 'mime_type' => 'video/quicktime', + ), + + // RIFF - audio/video - Resource Interchange File Format (RIFF) / WAV / AVI / CD-audio / SDSS = renamed variant used by SmartSound QuickTracks (www.smartsound.com) / FORM = Audio Interchange File Format (AIFF) + 'riff' => array( + 'pattern' => '^(RIFF|SDSS|FORM)', + 'group' => 'audio-video', + 'module' => 'riff', + 'mime_type' => 'audio/wav', + 'fail_ape' => 'WARNING', + ), + + // Real - audio/video - RealAudio, RealVideo + 'real' => array( + 'pattern' => '^\\.(RMF|ra)', + 'group' => 'audio-video', + 'module' => 'real', + 'mime_type' => 'audio/x-realaudio', + ), + + // SWF - audio/video - ShockWave Flash + 'swf' => array( + 'pattern' => '^(F|C)WS', + 'group' => 'audio-video', + 'module' => 'swf', + 'mime_type' => 'application/x-shockwave-flash', + ), + + // TS - audio/video - MPEG-2 Transport Stream + 'ts' => array( + 'pattern' => '^(\\x47.{187}){10,}', // packets are 188 bytes long and start with 0x47 "G". Check for at least 10 packets matching this pattern + 'group' => 'audio-video', + 'module' => 'ts', + 'mime_type' => 'video/MP2T', + ), + + + // Still-Image formats + + // BMP - still image - Bitmap (Windows, OS/2; uncompressed, RLE8, RLE4) + 'bmp' => array( + 'pattern' => '^BM', + 'group' => 'graphic', + 'module' => 'bmp', + 'mime_type' => 'image/bmp', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // GIF - still image - Graphics Interchange Format + 'gif' => array( + 'pattern' => '^GIF', + 'group' => 'graphic', + 'module' => 'gif', + 'mime_type' => 'image/gif', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // JPEG - still image - Joint Photographic Experts Group (JPEG) + 'jpg' => array( + 'pattern' => '^\\xFF\\xD8\\xFF', + 'group' => 'graphic', + 'module' => 'jpg', + 'mime_type' => 'image/jpeg', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // PCD - still image - Kodak Photo CD + 'pcd' => array( + 'pattern' => '^.{2048}PCD_IPI\\x00', + 'group' => 'graphic', + 'module' => 'pcd', + 'mime_type' => 'image/x-photo-cd', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // PNG - still image - Portable Network Graphics (PNG) + 'png' => array( + 'pattern' => '^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A', + 'group' => 'graphic', + 'module' => 'png', + 'mime_type' => 'image/png', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // SVG - still image - Scalable Vector Graphics (SVG) + 'svg' => array( + 'pattern' => '( 'graphic', + 'module' => 'svg', + 'mime_type' => 'image/svg+xml', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // TIFF - still image - Tagged Information File Format (TIFF) + 'tiff' => array( + 'pattern' => '^(II\\x2A\\x00|MM\\x00\\x2A)', + 'group' => 'graphic', + 'module' => 'tiff', + 'mime_type' => 'image/tiff', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // EFAX - still image - eFax (TIFF derivative) + 'efax' => array( + 'pattern' => '^\\xDC\\xFE', + 'group' => 'graphic', + 'module' => 'efax', + 'mime_type' => 'image/efax', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // Data formats + + // ISO - data - International Standards Organization (ISO) CD-ROM Image + 'iso' => array( + 'pattern' => '^.{32769}CD001', + 'group' => 'misc', + 'module' => 'iso', + 'mime_type' => 'application/octet-stream', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + 'iconv_req' => false, + ), + + // RAR - data - RAR compressed data + 'rar' => array( + 'pattern' => '^Rar\\!', + 'group' => 'archive', + 'module' => 'rar', + 'mime_type' => 'application/octet-stream', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // SZIP - audio/data - SZIP compressed data + 'szip' => array( + 'pattern' => '^SZ\\x0A\\x04', + 'group' => 'archive', + 'module' => 'szip', + 'mime_type' => 'application/octet-stream', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // TAR - data - TAR compressed data + 'tar' => array( + 'pattern' => '^.{100}[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20\\x00]{12}[0-9\\x20\\x00]{12}', + 'group' => 'archive', + 'module' => 'tar', + 'mime_type' => 'application/x-tar', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // GZIP - data - GZIP compressed data + 'gz' => array( + 'pattern' => '^\\x1F\\x8B\\x08', + 'group' => 'archive', + 'module' => 'gzip', + 'mime_type' => 'application/gzip', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // ZIP - data - ZIP compressed data + 'zip' => array( + 'pattern' => '^PK\\x03\\x04', + 'group' => 'archive', + 'module' => 'zip', + 'mime_type' => 'application/zip', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // XZ - data - XZ compressed data + 'xz' => array( + 'pattern' => '^\\xFD7zXZ\\x00', + 'group' => 'archive', + 'module' => 'xz', + 'mime_type' => 'application/x-xz', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + + // Misc other formats + + // PAR2 - data - Parity Volume Set Specification 2.0 + 'par2' => array ( + 'pattern' => '^PAR2\\x00PKT', + 'group' => 'misc', + 'module' => 'par2', + 'mime_type' => 'application/octet-stream', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // PDF - data - Portable Document Format + 'pdf' => array( + 'pattern' => '^\\x25PDF', + 'group' => 'misc', + 'module' => 'pdf', + 'mime_type' => 'application/pdf', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // MSOFFICE - data - ZIP compressed data + 'msoffice' => array( + 'pattern' => '^\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1', // D0CF11E == DOCFILE == Microsoft Office Document + 'group' => 'misc', + 'module' => 'msoffice', + 'mime_type' => 'application/octet-stream', + 'fail_id3' => 'ERROR', + 'fail_ape' => 'ERROR', + ), + + // CUE - data - CUEsheet (index to single-file disc images) + 'cue' => array( + 'pattern' => '', // empty pattern means cannot be automatically detected, will fall through all other formats and match based on filename and very basic file contents + 'group' => 'misc', + 'module' => 'cue', + 'mime_type' => 'application/octet-stream', + ), + + ); + } + + return $format_info; + } + + /** + * @param string $filedata + * @param string $filename + * + * @return mixed|false + */ + public function GetFileFormat(&$filedata, $filename='') { + // this function will determine the format of a file based on usually + // the first 2-4 bytes of the file (8 bytes for PNG, 16 bytes for JPG, + // and in the case of ISO CD image, 6 bytes offset 32kb from the start + // of the file). + + // Identify file format - loop through $format_info and detect with reg expr + foreach ($this->GetFileFormatArray() as $format_name => $info) { + // The /s switch on preg_match() forces preg_match() NOT to treat + // newline (0x0A) characters as special chars but do a binary match + if (!empty($info['pattern']) && preg_match('#'.$info['pattern'].'#s', $filedata)) { + $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; + return $info; + } + } + + + if (preg_match('#\\.mp[123a]$#i', $filename)) { + // Too many mp3 encoders on the market put garbage in front of mpeg files + // use assume format on these if format detection failed + $GetFileFormatArray = $this->GetFileFormatArray(); + $info = $GetFileFormatArray['mp3']; + $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; + return $info; + } elseif (preg_match('#\\.cue$#i', $filename) && preg_match('#FILE "[^"]+" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) { + // there's not really a useful consistent "magic" at the beginning of .cue files to identify them + // so until I think of something better, just go by filename if all other format checks fail + // and verify there's at least one instance of "TRACK xx AUDIO" in the file + $GetFileFormatArray = $this->GetFileFormatArray(); + $info = $GetFileFormatArray['cue']; + $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; + return $info; + } + + return false; + } + + /** + * Converts array to $encoding charset from $this->encoding. + * + * @param array $array + * @param string $encoding + */ + public function CharConvert(&$array, $encoding) { + + // identical encoding - end here + if ($encoding == $this->encoding) { + return; + } + + // loop thru array + foreach ($array as $key => $value) { + + // go recursive + if (is_array($value)) { + $this->CharConvert($array[$key], $encoding); + } + + // convert string + elseif (is_string($value)) { + $array[$key] = trim(getid3_lib::iconv_fallback($encoding, $this->encoding, $value)); + } + } + } + + /** + * @return bool + */ + public function HandleAllTags() { + + // key name => array (tag name, character encoding) + static $tags; + if (empty($tags)) { + $tags = array( + 'asf' => array('asf' , 'UTF-16LE'), + 'midi' => array('midi' , 'ISO-8859-1'), + 'nsv' => array('nsv' , 'ISO-8859-1'), + 'ogg' => array('vorbiscomment' , 'UTF-8'), + 'png' => array('png' , 'UTF-8'), + 'tiff' => array('tiff' , 'ISO-8859-1'), + 'quicktime' => array('quicktime' , 'UTF-8'), + 'real' => array('real' , 'ISO-8859-1'), + 'vqf' => array('vqf' , 'ISO-8859-1'), + 'zip' => array('zip' , 'ISO-8859-1'), + 'riff' => array('riff' , 'ISO-8859-1'), + 'lyrics3' => array('lyrics3' , 'ISO-8859-1'), + 'id3v1' => array('id3v1' , $this->encoding_id3v1), + 'id3v2' => array('id3v2' , 'UTF-8'), // not according to the specs (every frame can have a different encoding), but getID3() force-converts all encodings to UTF-8 + 'ape' => array('ape' , 'UTF-8'), + 'cue' => array('cue' , 'ISO-8859-1'), + 'matroska' => array('matroska' , 'UTF-8'), + 'flac' => array('vorbiscomment' , 'UTF-8'), + 'divxtag' => array('divx' , 'ISO-8859-1'), + 'iptc' => array('iptc' , 'ISO-8859-1'), + ); + } + + // loop through comments array + foreach ($tags as $comment_name => $tagname_encoding_array) { + list($tag_name, $encoding) = $tagname_encoding_array; + + // fill in default encoding type if not already present + if (isset($this->info[$comment_name]) && !isset($this->info[$comment_name]['encoding'])) { + $this->info[$comment_name]['encoding'] = $encoding; + } + + // copy comments if key name set + if (!empty($this->info[$comment_name]['comments'])) { + foreach ($this->info[$comment_name]['comments'] as $tag_key => $valuearray) { + foreach ($valuearray as $key => $value) { + if (is_string($value)) { + $value = trim($value, " \r\n\t"); // do not trim nulls from $value!! Unicode characters will get mangled if trailing nulls are removed! + } + if ($value) { + if (!is_numeric($key)) { + $this->info['tags'][trim($tag_name)][trim($tag_key)][$key] = $value; + } else { + $this->info['tags'][trim($tag_name)][trim($tag_key)][] = $value; + } + } + } + if ($tag_key == 'picture') { + // pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere + unset($this->info[$comment_name]['comments'][$tag_key]); + } + } + + if (!isset($this->info['tags'][$tag_name])) { + // comments are set but contain nothing but empty strings, so skip + continue; + } + + $this->CharConvert($this->info['tags'][$tag_name], $this->info[$comment_name]['encoding']); // only copy gets converted! + + if ($this->option_tags_html) { + foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) { + if ($tag_key == 'picture') { + // Do not to try to convert binary picture data to HTML + // https://github.com/JamesHeinrich/getID3/issues/178 + continue; + } + $this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $this->info[$comment_name]['encoding']); + } + } + + } + + } + + // pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere + if (!empty($this->info['tags'])) { + $unset_keys = array('tags', 'tags_html'); + foreach ($this->info['tags'] as $tagtype => $tagarray) { + foreach ($tagarray as $tagname => $tagdata) { + if ($tagname == 'picture') { + foreach ($tagdata as $key => $tagarray) { + $this->info['comments']['picture'][] = $tagarray; + if (isset($tagarray['data']) && isset($tagarray['image_mime'])) { + if (isset($this->info['tags'][$tagtype][$tagname][$key])) { + unset($this->info['tags'][$tagtype][$tagname][$key]); + } + if (isset($this->info['tags_html'][$tagtype][$tagname][$key])) { + unset($this->info['tags_html'][$tagtype][$tagname][$key]); + } + } + } + } + } + foreach ($unset_keys as $unset_key) { + // remove possible empty keys from (e.g. [tags][id3v2][picture]) + if (empty($this->info[$unset_key][$tagtype]['picture'])) { + unset($this->info[$unset_key][$tagtype]['picture']); + } + if (empty($this->info[$unset_key][$tagtype])) { + unset($this->info[$unset_key][$tagtype]); + } + if (empty($this->info[$unset_key])) { + unset($this->info[$unset_key]); + } + } + // remove duplicate copy of picture data from (e.g. [id3v2][comments][picture]) + if (isset($this->info[$tagtype]['comments']['picture'])) { + unset($this->info[$tagtype]['comments']['picture']); + } + if (empty($this->info[$tagtype]['comments'])) { + unset($this->info[$tagtype]['comments']); + } + if (empty($this->info[$tagtype])) { + unset($this->info[$tagtype]); + } + } + } + return true; + } + + /** + * @param string $algorithm + * + * @return array|bool + */ + public function getHashdata($algorithm) { + switch ($algorithm) { + case 'md5': + case 'sha1': + break; + + default: + return $this->error('bad algorithm "'.$algorithm.'" in getHashdata()'); + break; + } + + if (!empty($this->info['fileformat']) && !empty($this->info['dataformat']) && ($this->info['fileformat'] == 'ogg') && ($this->info['audio']['dataformat'] == 'vorbis')) { + + // We cannot get an identical md5_data value for Ogg files where the comments + // span more than 1 Ogg page (compared to the same audio data with smaller + // comments) using the normal getID3() method of MD5'ing the data between the + // end of the comments and the end of the file (minus any trailing tags), + // because the page sequence numbers of the pages that the audio data is on + // do not match. Under normal circumstances, where comments are smaller than + // the nominal 4-8kB page size, then this is not a problem, but if there are + // very large comments, the only way around it is to strip off the comment + // tags with vorbiscomment and MD5 that file. + // This procedure must be applied to ALL Ogg files, not just the ones with + // comments larger than 1 page, because the below method simply MD5's the + // whole file with the comments stripped, not just the portion after the + // comments block (which is the standard getID3() method. + + // The above-mentioned problem of comments spanning multiple pages and changing + // page sequence numbers likely happens for OggSpeex and OggFLAC as well, but + // currently vorbiscomment only works on OggVorbis files. + + if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) { + + $this->warning('Failed making system call to vorbiscomment.exe - '.$algorithm.'_data is incorrect - error returned: PHP running in Safe Mode (backtick operator not available)'); + $this->info[$algorithm.'_data'] = false; + + } else { + + // Prevent user from aborting script + $old_abort = ignore_user_abort(true); + + // Create empty file + $empty = tempnam(GETID3_TEMP_DIR, 'getID3'); + touch($empty); + + // Use vorbiscomment to make temp file without comments + $temp = tempnam(GETID3_TEMP_DIR, 'getID3'); + $file = $this->info['filenamepath']; + + if (GETID3_OS_ISWINDOWS) { + + if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) { + + $commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w -c "'.$empty.'" "'.$file.'" "'.$temp.'"'; + $VorbisCommentError = `$commandline`; + + } else { + + $VorbisCommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR; + + } + + } else { + + $commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1'; + $VorbisCommentError = `$commandline`; + + } + + if (!empty($VorbisCommentError)) { + + $this->warning('Failed making system call to vorbiscomment(.exe) - '.$algorithm.'_data will be incorrect. If vorbiscomment is unavailable, please download from http://www.vorbis.com/download.psp and put in the getID3() directory. Error returned: '.$VorbisCommentError); + $this->info[$algorithm.'_data'] = false; + + } else { + + // Get hash of newly created file + switch ($algorithm) { + case 'md5': + $this->info[$algorithm.'_data'] = md5_file($temp); + break; + + case 'sha1': + $this->info[$algorithm.'_data'] = sha1_file($temp); + break; + } + } + + // Clean up + unlink($empty); + unlink($temp); + + // Reset abort setting + ignore_user_abort($old_abort); + + } + + } else { + + if (!empty($this->info['avdataoffset']) || (isset($this->info['avdataend']) && ($this->info['avdataend'] < $this->info['filesize']))) { + + // get hash from part of file + $this->info[$algorithm.'_data'] = getid3_lib::hash_data($this->info['filenamepath'], $this->info['avdataoffset'], $this->info['avdataend'], $algorithm); + + } else { + + // get hash from whole file + switch ($algorithm) { + case 'md5': + $this->info[$algorithm.'_data'] = md5_file($this->info['filenamepath']); + break; + + case 'sha1': + $this->info[$algorithm.'_data'] = sha1_file($this->info['filenamepath']); + break; + } + } + + } + return true; + } + + public function ChannelsBitratePlaytimeCalculations() { + + // set channelmode on audio + if (!empty($this->info['audio']['channelmode']) || !isset($this->info['audio']['channels'])) { + // ignore + } elseif ($this->info['audio']['channels'] == 1) { + $this->info['audio']['channelmode'] = 'mono'; + } elseif ($this->info['audio']['channels'] == 2) { + $this->info['audio']['channelmode'] = 'stereo'; + } + + // Calculate combined bitrate - audio + video + $CombinedBitrate = 0; + $CombinedBitrate += (isset($this->info['audio']['bitrate']) ? $this->info['audio']['bitrate'] : 0); + $CombinedBitrate += (isset($this->info['video']['bitrate']) ? $this->info['video']['bitrate'] : 0); + if (($CombinedBitrate > 0) && empty($this->info['bitrate'])) { + $this->info['bitrate'] = $CombinedBitrate; + } + //if ((isset($this->info['video']) && !isset($this->info['video']['bitrate'])) || (isset($this->info['audio']) && !isset($this->info['audio']['bitrate']))) { + // // for example, VBR MPEG video files cannot determine video bitrate: + // // should not set overall bitrate and playtime from audio bitrate only + // unset($this->info['bitrate']); + //} + + // video bitrate undetermined, but calculable + if (isset($this->info['video']['dataformat']) && $this->info['video']['dataformat'] && (!isset($this->info['video']['bitrate']) || ($this->info['video']['bitrate'] == 0))) { + // if video bitrate not set + if (isset($this->info['audio']['bitrate']) && ($this->info['audio']['bitrate'] > 0) && ($this->info['audio']['bitrate'] == $this->info['bitrate'])) { + // AND if audio bitrate is set to same as overall bitrate + if (isset($this->info['playtime_seconds']) && ($this->info['playtime_seconds'] > 0)) { + // AND if playtime is set + if (isset($this->info['avdataend']) && isset($this->info['avdataoffset'])) { + // AND if AV data offset start/end is known + // THEN we can calculate the video bitrate + $this->info['bitrate'] = round((($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']); + $this->info['video']['bitrate'] = $this->info['bitrate'] - $this->info['audio']['bitrate']; + } + } + } + } + + if ((!isset($this->info['playtime_seconds']) || ($this->info['playtime_seconds'] <= 0)) && !empty($this->info['bitrate'])) { + $this->info['playtime_seconds'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['bitrate']; + } + + if (!isset($this->info['bitrate']) && !empty($this->info['playtime_seconds'])) { + $this->info['bitrate'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']; + } + if (isset($this->info['bitrate']) && empty($this->info['audio']['bitrate']) && empty($this->info['video']['bitrate'])) { + if (isset($this->info['audio']['dataformat']) && empty($this->info['video']['resolution_x'])) { + // audio only + $this->info['audio']['bitrate'] = $this->info['bitrate']; + } elseif (isset($this->info['video']['resolution_x']) && empty($this->info['audio']['dataformat'])) { + // video only + $this->info['video']['bitrate'] = $this->info['bitrate']; + } + } + + // Set playtime string + if (!empty($this->info['playtime_seconds']) && empty($this->info['playtime_string'])) { + $this->info['playtime_string'] = getid3_lib::PlaytimeString($this->info['playtime_seconds']); + } + } + + /** + * @return bool + */ + public function CalculateCompressionRatioVideo() { + if (empty($this->info['video'])) { + return false; + } + if (empty($this->info['video']['resolution_x']) || empty($this->info['video']['resolution_y'])) { + return false; + } + if (empty($this->info['video']['bits_per_sample'])) { + return false; + } + + switch ($this->info['video']['dataformat']) { + case 'bmp': + case 'gif': + case 'jpeg': + case 'jpg': + case 'png': + case 'tiff': + $FrameRate = 1; + $PlaytimeSeconds = 1; + $BitrateCompressed = $this->info['filesize'] * 8; + break; + + default: + if (!empty($this->info['video']['frame_rate'])) { + $FrameRate = $this->info['video']['frame_rate']; + } else { + return false; + } + if (!empty($this->info['playtime_seconds'])) { + $PlaytimeSeconds = $this->info['playtime_seconds']; + } else { + return false; + } + if (!empty($this->info['video']['bitrate'])) { + $BitrateCompressed = $this->info['video']['bitrate']; + } else { + return false; + } + break; + } + $BitrateUncompressed = $this->info['video']['resolution_x'] * $this->info['video']['resolution_y'] * $this->info['video']['bits_per_sample'] * $FrameRate; + + $this->info['video']['compression_ratio'] = $BitrateCompressed / $BitrateUncompressed; + return true; + } + + /** + * @return bool + */ + public function CalculateCompressionRatioAudio() { + if (empty($this->info['audio']['bitrate']) || empty($this->info['audio']['channels']) || empty($this->info['audio']['sample_rate']) || !is_numeric($this->info['audio']['sample_rate'])) { + return false; + } + $this->info['audio']['compression_ratio'] = $this->info['audio']['bitrate'] / ($this->info['audio']['channels'] * $this->info['audio']['sample_rate'] * (!empty($this->info['audio']['bits_per_sample']) ? $this->info['audio']['bits_per_sample'] : 16)); + + if (!empty($this->info['audio']['streams'])) { + foreach ($this->info['audio']['streams'] as $streamnumber => $streamdata) { + if (!empty($streamdata['bitrate']) && !empty($streamdata['channels']) && !empty($streamdata['sample_rate'])) { + $this->info['audio']['streams'][$streamnumber]['compression_ratio'] = $streamdata['bitrate'] / ($streamdata['channels'] * $streamdata['sample_rate'] * (!empty($streamdata['bits_per_sample']) ? $streamdata['bits_per_sample'] : 16)); + } + } + } + return true; + } + + /** + * @return bool + */ + public function CalculateReplayGain() { + if (isset($this->info['replay_gain'])) { + if (!isset($this->info['replay_gain']['reference_volume'])) { + $this->info['replay_gain']['reference_volume'] = 89.0; + } + if (isset($this->info['replay_gain']['track']['adjustment'])) { + $this->info['replay_gain']['track']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['track']['adjustment']; + } + if (isset($this->info['replay_gain']['album']['adjustment'])) { + $this->info['replay_gain']['album']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['album']['adjustment']; + } + + if (isset($this->info['replay_gain']['track']['peak'])) { + $this->info['replay_gain']['track']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['track']['peak']); + } + if (isset($this->info['replay_gain']['album']['peak'])) { + $this->info['replay_gain']['album']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['album']['peak']); + } + } + return true; + } + + /** + * @return bool + */ + public function ProcessAudioStreams() { + if (!empty($this->info['audio']['bitrate']) || !empty($this->info['audio']['channels']) || !empty($this->info['audio']['sample_rate'])) { + if (!isset($this->info['audio']['streams'])) { + foreach ($this->info['audio'] as $key => $value) { + if ($key != 'streams') { + $this->info['audio']['streams'][0][$key] = $value; + } + } + } + } + return true; + } + + /** + * @return string|bool + */ + public function getid3_tempnam() { + return tempnam($this->tempdir, 'gI3'); + } + + /** + * @param string $name + * + * @return bool + * + * @throws getid3_exception + */ + public function include_module($name) { + //if (!file_exists($this->include_path.'module.'.$name.'.php')) { + if (!file_exists(GETID3_INCLUDEPATH.'module.'.$name.'.php')) { + throw new getid3_exception('Required module.'.$name.'.php is missing.'); + } + include_once(GETID3_INCLUDEPATH.'module.'.$name.'.php'); + return true; + } + + /** + * @param string $filename + * + * @return bool + */ + public static function is_writable ($filename) { + $ret = is_writable($filename); + if (!$ret) { + $perms = fileperms($filename); + $ret = ($perms & 0x0080) || ($perms & 0x0010) || ($perms & 0x0002); + } + return $ret; + } + +} + + +abstract class getid3_handler +{ + + /** + * @var getID3 + */ + protected $getid3; // pointer + + /** + * Analyzing filepointer or string. + * + * @var bool + */ + protected $data_string_flag = false; + + /** + * String to analyze. + * + * @var string + */ + protected $data_string = ''; + + /** + * Seek position in string. + * + * @var int + */ + protected $data_string_position = 0; + + /** + * String length. + * + * @var int + */ + protected $data_string_length = 0; + + /** + * @var string + */ + private $dependency_to; + + /** + * getid3_handler constructor. + * + * @param getID3 $getid3 + * @param string $call_module + */ + public function __construct(getID3 $getid3, $call_module=null) { + $this->getid3 = $getid3; + + if ($call_module) { + $this->dependency_to = str_replace('getid3_', '', $call_module); + } + } + + /** + * Analyze from file pointer. + * + * @return bool + */ + abstract public function Analyze(); + + /** + * Analyze from string instead. + * + * @param string $string + */ + public function AnalyzeString($string) { + // Enter string mode + $this->setStringMode($string); + + // Save info + $saved_avdataoffset = $this->getid3->info['avdataoffset']; + $saved_avdataend = $this->getid3->info['avdataend']; + $saved_filesize = (isset($this->getid3->info['filesize']) ? $this->getid3->info['filesize'] : null); // may be not set if called as dependency without openfile() call + + // Reset some info + $this->getid3->info['avdataoffset'] = 0; + $this->getid3->info['avdataend'] = $this->getid3->info['filesize'] = $this->data_string_length; + + // Analyze + $this->Analyze(); + + // Restore some info + $this->getid3->info['avdataoffset'] = $saved_avdataoffset; + $this->getid3->info['avdataend'] = $saved_avdataend; + $this->getid3->info['filesize'] = $saved_filesize; + + // Exit string mode + $this->data_string_flag = false; + } + + /** + * @param string $string + */ + public function setStringMode($string) { + $this->data_string_flag = true; + $this->data_string = $string; + $this->data_string_length = strlen($string); + } + + /** + * @return int|bool + */ + protected function ftell() { + if ($this->data_string_flag) { + return $this->data_string_position; + } + return ftell($this->getid3->fp); + } + + /** + * @param int $bytes + * + * @return string|false + * + * @throws getid3_exception + */ + protected function fread($bytes) { + if ($this->data_string_flag) { + $this->data_string_position += $bytes; + return substr($this->data_string, $this->data_string_position - $bytes, $bytes); + } + $pos = $this->ftell() + $bytes; + if (!getid3_lib::intValueSupported($pos)) { + throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') because beyond PHP filesystem limit', 10); + } + + //return fread($this->getid3->fp, $bytes); + /* + * https://www.getid3.org/phpBB3/viewtopic.php?t=1930 + * "I found out that the root cause for the problem was how getID3 uses the PHP system function fread(). + * It seems to assume that fread() would always return as many bytes as were requested. + * However, according the PHP manual (http://php.net/manual/en/function.fread.php), this is the case only with regular local files, but not e.g. with Linux pipes. + * The call may return only part of the requested data and a new call is needed to get more." + */ + $contents = ''; + do { + //if (($this->getid3->memory_limit > 0) && ($bytes > $this->getid3->memory_limit)) { + if (($this->getid3->memory_limit > 0) && (($bytes / $this->getid3->memory_limit) > 0.99)) { // enable a more-fuzzy match to prevent close misses generating errors like "PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 33554464 bytes)" + throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') that is more than available PHP memory ('.$this->getid3->memory_limit.')', 10); + } + $part = fread($this->getid3->fp, $bytes); + $partLength = strlen($part); + $bytes -= $partLength; + $contents .= $part; + } while (($bytes > 0) && ($partLength > 0)); + return $contents; + } + + /** + * @param int $bytes + * @param int $whence + * + * @return int + * + * @throws getid3_exception + */ + protected function fseek($bytes, $whence=SEEK_SET) { + if ($this->data_string_flag) { + switch ($whence) { + case SEEK_SET: + $this->data_string_position = $bytes; + break; + + case SEEK_CUR: + $this->data_string_position += $bytes; + break; + + case SEEK_END: + $this->data_string_position = $this->data_string_length + $bytes; + break; + } + return 0; + } else { + $pos = $bytes; + if ($whence == SEEK_CUR) { + $pos = $this->ftell() + $bytes; + } elseif ($whence == SEEK_END) { + $pos = $this->getid3->info['filesize'] + $bytes; + } + if (!getid3_lib::intValueSupported($pos)) { + throw new getid3_exception('cannot fseek('.$pos.') because beyond PHP filesystem limit', 10); + } + } + return fseek($this->getid3->fp, $bytes, $whence); + } + + /** + * @return bool + */ + protected function feof() { + if ($this->data_string_flag) { + return $this->data_string_position >= $this->data_string_length; + } + return feof($this->getid3->fp); + } + + /** + * @param string $module + * + * @return bool + */ + final protected function isDependencyFor($module) { + return $this->dependency_to == $module; + } + + /** + * @param string $text + * + * @return bool + */ + protected function error($text) { + $this->getid3->info['error'][] = $text; + + return false; + } + + /** + * @param string $text + * + * @return bool + */ + protected function warning($text) { + return $this->getid3->warning($text); + } + + /** + * @param string $text + */ + protected function notice($text) { + // does nothing for now + } + + /** + * @param string $name + * @param int $offset + * @param int $length + * @param string $image_mime + * + * @return string|null + * + * @throws Exception + * @throws getid3_exception + */ + public function saveAttachment($name, $offset, $length, $image_mime=null) { + try { + + // do not extract at all + if ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_NONE) { + + $attachment = null; // do not set any + + // extract to return array + } elseif ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_INLINE) { + + $this->fseek($offset); + $attachment = $this->fread($length); // get whole data in one pass, till it is anyway stored in memory + if ($attachment === false || strlen($attachment) != $length) { + throw new Exception('failed to read attachment data'); + } + + // assume directory path is given + } else { + + // set up destination path + $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR); + if (!is_dir($dir) || !getID3::is_writable($dir)) { // check supplied directory + throw new Exception('supplied path ('.$dir.') does not exist, or is not writable'); + } + $dest = $dir.DIRECTORY_SEPARATOR.$name.($image_mime ? '.'.getid3_lib::ImageExtFromMime($image_mime) : ''); + + // create dest file + if (($fp_dest = fopen($dest, 'wb')) == false) { + throw new Exception('failed to create file '.$dest); + } + + // copy data + $this->fseek($offset); + $buffersize = ($this->data_string_flag ? $length : $this->getid3->fread_buffer_size()); + $bytesleft = $length; + while ($bytesleft > 0) { + if (($buffer = $this->fread(min($buffersize, $bytesleft))) === false || ($byteswritten = fwrite($fp_dest, $buffer)) === false || ($byteswritten === 0)) { + throw new Exception($buffer === false ? 'not enough data to read' : 'failed to write to destination file, may be not enough disk space'); + } + $bytesleft -= $byteswritten; + } + + fclose($fp_dest); + $attachment = $dest; + + } + + } catch (Exception $e) { + + // close and remove dest file if created + if (isset($fp_dest) && is_resource($fp_dest)) { + fclose($fp_dest); + } + + if (isset($dest) && file_exists($dest)) { + unlink($dest); + } + + // do not set any is case of error + $attachment = null; + $this->warning('Failed to extract attachment '.$name.': '.$e->getMessage()); + + } + + // seek to the end of attachment + $this->fseek($offset + $length); + + return $attachment; + } + +} + + +class getid3_exception extends Exception +{ + public $message; +} diff --git a/wp-includes/ID3/license.commercial.txt b/wp-includes/ID3/license.commercial.txt new file mode 100644 index 0000000..416e5a1 --- /dev/null +++ b/wp-includes/ID3/license.commercial.txt @@ -0,0 +1,27 @@ + getID3() Commercial License + =========================== + +getID3() is licensed under the "GNU Public License" (GPL) and/or the +"getID3() Commercial License" (gCL). This document describes the gCL. + +--------------------------------------------------------------------- + +The license is non-exclusively granted to a single person or company, +per payment of the license fee, for the lifetime of that person or +company. The license is non-transferrable. + +The gCL grants the licensee the right to use getID3() in commercial +closed-source projects. Modifications may be made to getID3() with no +obligation to release the modified source code. getID3() (or pieces +thereof) may be included in any number of projects authored (in whole +or in part) by the licensee. + +The licensee may use any version of getID3(), past, present or future, +as is most convenient. This license does not entitle the licensee to +receive any technical support, updates or bugfixes, except as such are +made publicly available to all getID3() users. + +The licensee may not sub-license getID3() itself, meaning that any +commercially released product containing all or parts of getID3() must +have added functionality beyond what is available in getID3(); +getID3() itself may not be re-licensed by the licensee. diff --git a/wp-includes/ID3/license.txt b/wp-includes/ID3/license.txt new file mode 100644 index 0000000..c67873a --- /dev/null +++ b/wp-includes/ID3/license.txt @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////// +/// getID3() by James Heinrich // +// available at http://getid3.sourceforge.net // +// or https://www.getid3.org // +// also https://github.com/JamesHeinrich/getID3 // +///////////////////////////////////////////////////////////////// + +***************************************************************** +***************************************************************** + + getID3() is released under multiple licenses. You may choose + from the following licenses, and use getID3 according to the + terms of the license most suitable to your project. + +GNU GPL: https://gnu.org/licenses/gpl.html (v3) + https://gnu.org/licenses/old-licenses/gpl-2.0.html (v2) + https://gnu.org/licenses/old-licenses/gpl-1.0.html (v1) + +GNU LGPL: https://gnu.org/licenses/lgpl.html (v3) + +Mozilla MPL: https://www.mozilla.org/MPL/2.0/ (v2) + +getID3 Commercial License: https://www.getid3.org/#gCL (payment required) + +***************************************************************** +***************************************************************** + +Copies of each of the above licenses are included in the 'licenses' +directory of the getID3 distribution. diff --git a/wp-includes/ID3/module.audio-video.asf.php b/wp-includes/ID3/module.audio-video.asf.php new file mode 100644 index 0000000..0a2132d --- /dev/null +++ b/wp-includes/ID3/module.audio-video.asf.php @@ -0,0 +1,2084 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.asf.php // +// module for analyzing ASF, WMA and WMV files // +// dependencies: module.audio-video.riff.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + +class getid3_asf extends getid3_handler +{ + /** + * @param getID3 $getid3 + */ + public function __construct(getID3 $getid3) { + parent::__construct($getid3); // extends getid3_handler::__construct() + + // initialize all GUID constants + $GUIDarray = $this->KnownGUIDs(); + foreach ($GUIDarray as $GUIDname => $hexstringvalue) { + if (!defined($GUIDname)) { + define($GUIDname, $this->GUIDtoBytestring($hexstringvalue)); + } + } + } + + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + // Shortcuts + $thisfile_audio = &$info['audio']; + $thisfile_video = &$info['video']; + $info['asf'] = array(); + $thisfile_asf = &$info['asf']; + $thisfile_asf['comments'] = array(); + $thisfile_asf_comments = &$thisfile_asf['comments']; + $thisfile_asf['header_object'] = array(); + $thisfile_asf_headerobject = &$thisfile_asf['header_object']; + + + // ASF structure: + // * Header Object [required] + // * File Properties Object [required] (global file attributes) + // * Stream Properties Object [required] (defines media stream & characteristics) + // * Header Extension Object [required] (additional functionality) + // * Content Description Object (bibliographic information) + // * Script Command Object (commands for during playback) + // * Marker Object (named jumped points within the file) + // * Data Object [required] + // * Data Packets + // * Index Object + + // Header Object: (mandatory, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for header object - GETID3_ASF_Header_Object + // Object Size QWORD 64 // size of header object, including 30 bytes of Header Object header + // Number of Header Objects DWORD 32 // number of objects in header object + // Reserved1 BYTE 8 // hardcoded: 0x01 + // Reserved2 BYTE 8 // hardcoded: 0x02 + + $info['fileformat'] = 'asf'; + + $this->fseek($info['avdataoffset']); + $HeaderObjectData = $this->fread(30); + + $thisfile_asf_headerobject['objectid'] = substr($HeaderObjectData, 0, 16); + $thisfile_asf_headerobject['objectid_guid'] = $this->BytestringToGUID($thisfile_asf_headerobject['objectid']); + if ($thisfile_asf_headerobject['objectid'] != GETID3_ASF_Header_Object) { + unset($info['fileformat'], $info['asf']); + return $this->error('ASF header GUID {'.$this->BytestringToGUID($thisfile_asf_headerobject['objectid']).'} does not match expected "GETID3_ASF_Header_Object" GUID {'.$this->BytestringToGUID(GETID3_ASF_Header_Object).'}'); + } + $thisfile_asf_headerobject['objectsize'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 16, 8)); + $thisfile_asf_headerobject['headerobjects'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 24, 4)); + $thisfile_asf_headerobject['reserved1'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 28, 1)); + $thisfile_asf_headerobject['reserved2'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 29, 1)); + + $NextObjectOffset = $this->ftell(); + $ASFHeaderData = $this->fread($thisfile_asf_headerobject['objectsize'] - 30); + $offset = 0; + $thisfile_asf_streambitratepropertiesobject = array(); + $thisfile_asf_codeclistobject = array(); + + for ($HeaderObjectsCounter = 0; $HeaderObjectsCounter < $thisfile_asf_headerobject['headerobjects']; $HeaderObjectsCounter++) { + $NextObjectGUID = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); + $NextObjectSize = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + switch ($NextObjectGUID) { + + case GETID3_ASF_File_Properties_Object: + // File Properties Object: (mandatory, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for file properties object - GETID3_ASF_File_Properties_Object + // Object Size QWORD 64 // size of file properties object, including 104 bytes of File Properties Object header + // File ID GUID 128 // unique ID - identical to File ID in Data Object + // File Size QWORD 64 // entire file in bytes. Invalid if Broadcast Flag == 1 + // Creation Date QWORD 64 // date & time of file creation. Maybe invalid if Broadcast Flag == 1 + // Data Packets Count QWORD 64 // number of data packets in Data Object. Invalid if Broadcast Flag == 1 + // Play Duration QWORD 64 // playtime, in 100-nanosecond units. Invalid if Broadcast Flag == 1 + // Send Duration QWORD 64 // time needed to send file, in 100-nanosecond units. Players can ignore this value. Invalid if Broadcast Flag == 1 + // Preroll QWORD 64 // time to buffer data before starting to play file, in 1-millisecond units. If <> 0, PlayDuration and PresentationTime have been offset by this amount + // Flags DWORD 32 // + // * Broadcast Flag bits 1 (0x01) // file is currently being written, some header values are invalid + // * Seekable Flag bits 1 (0x02) // is file seekable + // * Reserved bits 30 (0xFFFFFFFC) // reserved - set to zero + // Minimum Data Packet Size DWORD 32 // in bytes. should be same as Maximum Data Packet Size. Invalid if Broadcast Flag == 1 + // Maximum Data Packet Size DWORD 32 // in bytes. should be same as Minimum Data Packet Size. Invalid if Broadcast Flag == 1 + // Maximum Bitrate DWORD 32 // maximum instantaneous bitrate in bits per second for entire file, including all data streams and ASF overhead + + // shortcut + $thisfile_asf['file_properties_object'] = array(); + $thisfile_asf_filepropertiesobject = &$thisfile_asf['file_properties_object']; + + $thisfile_asf_filepropertiesobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_filepropertiesobject['objectid'] = $NextObjectGUID; + $thisfile_asf_filepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_filepropertiesobject['objectsize'] = $NextObjectSize; + $thisfile_asf_filepropertiesobject['fileid'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_filepropertiesobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_filepropertiesobject['fileid']); + $thisfile_asf_filepropertiesobject['filesize'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_filepropertiesobject['creation_date'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $thisfile_asf_filepropertiesobject['creation_date_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_filepropertiesobject['creation_date']); + $offset += 8; + $thisfile_asf_filepropertiesobject['data_packets'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_filepropertiesobject['play_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_filepropertiesobject['send_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_filepropertiesobject['preroll'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_filepropertiesobject['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_filepropertiesobject['flags']['broadcast'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0001); + $thisfile_asf_filepropertiesobject['flags']['seekable'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0002); + + $thisfile_asf_filepropertiesobject['min_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_filepropertiesobject['max_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_filepropertiesobject['max_bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + + if ($thisfile_asf_filepropertiesobject['flags']['broadcast']) { + + // broadcast flag is set, some values invalid + unset($thisfile_asf_filepropertiesobject['filesize']); + unset($thisfile_asf_filepropertiesobject['data_packets']); + unset($thisfile_asf_filepropertiesobject['play_duration']); + unset($thisfile_asf_filepropertiesobject['send_duration']); + unset($thisfile_asf_filepropertiesobject['min_packet_size']); + unset($thisfile_asf_filepropertiesobject['max_packet_size']); + + } else { + + // broadcast flag NOT set, perform calculations + $info['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000); + + //$info['bitrate'] = $thisfile_asf_filepropertiesobject['max_bitrate']; + $info['bitrate'] = ((isset($thisfile_asf_filepropertiesobject['filesize']) ? $thisfile_asf_filepropertiesobject['filesize'] : $info['filesize']) * 8) / $info['playtime_seconds']; + } + break; + + case GETID3_ASF_Stream_Properties_Object: + // Stream Properties Object: (mandatory, one per media stream) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for stream properties object - GETID3_ASF_Stream_Properties_Object + // Object Size QWORD 64 // size of stream properties object, including 78 bytes of Stream Properties Object header + // Stream Type GUID 128 // GETID3_ASF_Audio_Media, GETID3_ASF_Video_Media or GETID3_ASF_Command_Media + // Error Correction Type GUID 128 // GETID3_ASF_Audio_Spread for audio-only streams, GETID3_ASF_No_Error_Correction for other stream types + // Time Offset QWORD 64 // 100-nanosecond units. typically zero. added to all timestamps of samples in the stream + // Type-Specific Data Length DWORD 32 // number of bytes for Type-Specific Data field + // Error Correction Data Length DWORD 32 // number of bytes for Error Correction Data field + // Flags WORD 16 // + // * Stream Number bits 7 (0x007F) // number of this stream. 1 <= valid <= 127 + // * Reserved bits 8 (0x7F80) // reserved - set to zero + // * Encrypted Content Flag bits 1 (0x8000) // stream contents encrypted if set + // Reserved DWORD 32 // reserved - set to zero + // Type-Specific Data BYTESTREAM variable // type-specific format data, depending on value of Stream Type + // Error Correction Data BYTESTREAM variable // error-correction-specific format data, depending on value of Error Correct Type + + // There is one GETID3_ASF_Stream_Properties_Object for each stream (audio, video) but the + // stream number isn't known until halfway through decoding the structure, hence it + // it is decoded to a temporary variable and then stuck in the appropriate index later + + $StreamPropertiesObjectData['offset'] = $NextObjectOffset + $offset; + $StreamPropertiesObjectData['objectid'] = $NextObjectGUID; + $StreamPropertiesObjectData['objectid_guid'] = $NextObjectGUIDtext; + $StreamPropertiesObjectData['objectsize'] = $NextObjectSize; + $StreamPropertiesObjectData['stream_type'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $StreamPropertiesObjectData['stream_type_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['stream_type']); + $StreamPropertiesObjectData['error_correct_type'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $StreamPropertiesObjectData['error_correct_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['error_correct_type']); + $StreamPropertiesObjectData['time_offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $StreamPropertiesObjectData['type_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $StreamPropertiesObjectData['error_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $StreamPropertiesObjectData['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $StreamPropertiesObjectStreamNumber = $StreamPropertiesObjectData['flags_raw'] & 0x007F; + $StreamPropertiesObjectData['flags']['encrypted'] = (bool) ($StreamPropertiesObjectData['flags_raw'] & 0x8000); + + $offset += 4; // reserved - DWORD + $StreamPropertiesObjectData['type_specific_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['type_data_length']); + $offset += $StreamPropertiesObjectData['type_data_length']; + $StreamPropertiesObjectData['error_correct_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['error_data_length']); + $offset += $StreamPropertiesObjectData['error_data_length']; + + switch ($StreamPropertiesObjectData['stream_type']) { + + case GETID3_ASF_Audio_Media: + $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); + $thisfile_audio['bitrate_mode'] = (!empty($thisfile_audio['bitrate_mode']) ? $thisfile_audio['bitrate_mode'] : 'cbr'); + + $audiodata = getid3_riff::parseWAVEFORMATex(substr($StreamPropertiesObjectData['type_specific_data'], 0, 16)); + unset($audiodata['raw']); + $thisfile_audio = getid3_lib::array_merge_noclobber($audiodata, $thisfile_audio); + break; + + case GETID3_ASF_Video_Media: + $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); + $thisfile_video['bitrate_mode'] = (!empty($thisfile_video['bitrate_mode']) ? $thisfile_video['bitrate_mode'] : 'cbr'); + break; + + case GETID3_ASF_Command_Media: + default: + // do nothing + break; + + } + + $thisfile_asf['stream_properties_object'][$StreamPropertiesObjectStreamNumber] = $StreamPropertiesObjectData; + unset($StreamPropertiesObjectData); // clear for next stream, if any + break; + + case GETID3_ASF_Header_Extension_Object: + // Header Extension Object: (mandatory, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Header Extension object - GETID3_ASF_Header_Extension_Object + // Object Size QWORD 64 // size of Header Extension object, including 46 bytes of Header Extension Object header + // Reserved Field 1 GUID 128 // hardcoded: GETID3_ASF_Reserved_1 + // Reserved Field 2 WORD 16 // hardcoded: 0x00000006 + // Header Extension Data Size DWORD 32 // in bytes. valid: 0, or > 24. equals object size minus 46 + // Header Extension Data BYTESTREAM variable // array of zero or more extended header objects + + // shortcut + $thisfile_asf['header_extension_object'] = array(); + $thisfile_asf_headerextensionobject = &$thisfile_asf['header_extension_object']; + + $thisfile_asf_headerextensionobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_headerextensionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_headerextensionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_headerextensionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_headerextensionobject['reserved_1'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_headerextensionobject['reserved_1_guid'] = $this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']); + if ($thisfile_asf_headerextensionobject['reserved_1'] != GETID3_ASF_Reserved_1) { + $this->warning('header_extension_object.reserved_1 GUID ('.$this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']).') does not match expected "GETID3_ASF_Reserved_1" GUID ('.$this->BytestringToGUID(GETID3_ASF_Reserved_1).')'); + //return false; + break; + } + $thisfile_asf_headerextensionobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + if ($thisfile_asf_headerextensionobject['reserved_2'] != 6) { + $this->warning('header_extension_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_headerextensionobject['reserved_2']).') does not match expected value of "6"'); + //return false; + break; + } + $thisfile_asf_headerextensionobject['extension_data_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_headerextensionobject['extension_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_headerextensionobject['extension_data_size']); + $unhandled_sections = 0; + $thisfile_asf_headerextensionobject['extension_data_parsed'] = $this->HeaderExtensionObjectDataParse($thisfile_asf_headerextensionobject['extension_data'], $unhandled_sections); + if ($unhandled_sections === 0) { + unset($thisfile_asf_headerextensionobject['extension_data']); + } + $offset += $thisfile_asf_headerextensionobject['extension_data_size']; + break; + + case GETID3_ASF_Codec_List_Object: + // Codec List Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Codec List object - GETID3_ASF_Codec_List_Object + // Object Size QWORD 64 // size of Codec List object, including 44 bytes of Codec List Object header + // Reserved GUID 128 // hardcoded: 86D15241-311D-11D0-A3A4-00A0C90348F6 + // Codec Entries Count DWORD 32 // number of entries in Codec Entries array + // Codec Entries array of: variable // + // * Type WORD 16 // 0x0001 = Video Codec, 0x0002 = Audio Codec, 0xFFFF = Unknown Codec + // * Codec Name Length WORD 16 // number of Unicode characters stored in the Codec Name field + // * Codec Name WCHAR variable // array of Unicode characters - name of codec used to create the content + // * Codec Description Length WORD 16 // number of Unicode characters stored in the Codec Description field + // * Codec Description WCHAR variable // array of Unicode characters - description of format used to create the content + // * Codec Information Length WORD 16 // number of Unicode characters stored in the Codec Information field + // * Codec Information BYTESTREAM variable // opaque array of information bytes about the codec used to create the content + + // shortcut + $thisfile_asf['codec_list_object'] = array(); + $thisfile_asf_codeclistobject = &$thisfile_asf['codec_list_object']; + + $thisfile_asf_codeclistobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_codeclistobject['objectid'] = $NextObjectGUID; + $thisfile_asf_codeclistobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_codeclistobject['objectsize'] = $NextObjectSize; + $thisfile_asf_codeclistobject['reserved'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_codeclistobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']); + if ($thisfile_asf_codeclistobject['reserved'] != $this->GUIDtoBytestring('86D15241-311D-11D0-A3A4-00A0C90348F6')) { + $this->warning('codec_list_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {86D15241-311D-11D0-A3A4-00A0C90348F6}'); + //return false; + break; + } + $thisfile_asf_codeclistobject['codec_entries_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + for ($CodecEntryCounter = 0; $CodecEntryCounter < $thisfile_asf_codeclistobject['codec_entries_count']; $CodecEntryCounter++) { + // shortcut + $thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter] = array(); + $thisfile_asf_codeclistobject_codecentries_current = &$thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter]; + + $thisfile_asf_codeclistobject_codecentries_current['type_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_codeclistobject_codecentries_current['type'] = self::codecListObjectTypeLookup($thisfile_asf_codeclistobject_codecentries_current['type_raw']); + + $CodecNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character + $offset += 2; + $thisfile_asf_codeclistobject_codecentries_current['name'] = substr($ASFHeaderData, $offset, $CodecNameLength); + $offset += $CodecNameLength; + + $CodecDescriptionLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character + $offset += 2; + $thisfile_asf_codeclistobject_codecentries_current['description'] = substr($ASFHeaderData, $offset, $CodecDescriptionLength); + $offset += $CodecDescriptionLength; + + $CodecInformationLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_codeclistobject_codecentries_current['information'] = substr($ASFHeaderData, $offset, $CodecInformationLength); + $offset += $CodecInformationLength; + + if ($thisfile_asf_codeclistobject_codecentries_current['type_raw'] == 2) { // audio codec + + if (strpos($thisfile_asf_codeclistobject_codecentries_current['description'], ',') === false) { + $this->warning('[asf][codec_list_object][codec_entries]['.$CodecEntryCounter.'][description] expected to contain comma-separated list of parameters: "'.$thisfile_asf_codeclistobject_codecentries_current['description'].'"'); + } else { + + list($AudioCodecBitrate, $AudioCodecFrequency, $AudioCodecChannels) = explode(',', $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description'])); + $thisfile_audio['codec'] = $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['name']); + + if (!isset($thisfile_audio['bitrate']) && strstr($AudioCodecBitrate, 'kbps')) { + $thisfile_audio['bitrate'] = (int) (trim(str_replace('kbps', '', $AudioCodecBitrate)) * 1000); + } + //if (!isset($thisfile_video['bitrate']) && isset($thisfile_audio['bitrate']) && isset($thisfile_asf['file_properties_object']['max_bitrate']) && ($thisfile_asf_codeclistobject['codec_entries_count'] > 1)) { + if (empty($thisfile_video['bitrate']) && !empty($thisfile_audio['bitrate']) && !empty($info['bitrate'])) { + //$thisfile_video['bitrate'] = $thisfile_asf['file_properties_object']['max_bitrate'] - $thisfile_audio['bitrate']; + $thisfile_video['bitrate'] = $info['bitrate'] - $thisfile_audio['bitrate']; + } + + $AudioCodecFrequency = (int) trim(str_replace('kHz', '', $AudioCodecFrequency)); + switch ($AudioCodecFrequency) { + case 8: + case 8000: + $thisfile_audio['sample_rate'] = 8000; + break; + + case 11: + case 11025: + $thisfile_audio['sample_rate'] = 11025; + break; + + case 12: + case 12000: + $thisfile_audio['sample_rate'] = 12000; + break; + + case 16: + case 16000: + $thisfile_audio['sample_rate'] = 16000; + break; + + case 22: + case 22050: + $thisfile_audio['sample_rate'] = 22050; + break; + + case 24: + case 24000: + $thisfile_audio['sample_rate'] = 24000; + break; + + case 32: + case 32000: + $thisfile_audio['sample_rate'] = 32000; + break; + + case 44: + case 441000: + $thisfile_audio['sample_rate'] = 44100; + break; + + case 48: + case 48000: + $thisfile_audio['sample_rate'] = 48000; + break; + + default: + $this->warning('unknown frequency: "'.$AudioCodecFrequency.'" ('.$this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']).')'); + break; + } + + if (!isset($thisfile_audio['channels'])) { + if (strstr($AudioCodecChannels, 'stereo')) { + $thisfile_audio['channels'] = 2; + } elseif (strstr($AudioCodecChannels, 'mono')) { + $thisfile_audio['channels'] = 1; + } + } + + } + } + } + break; + + case GETID3_ASF_Script_Command_Object: + // Script Command Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Script Command object - GETID3_ASF_Script_Command_Object + // Object Size QWORD 64 // size of Script Command object, including 44 bytes of Script Command Object header + // Reserved GUID 128 // hardcoded: 4B1ACBE3-100B-11D0-A39B-00A0C90348F6 + // Commands Count WORD 16 // number of Commands structures in the Script Commands Objects + // Command Types Count WORD 16 // number of Command Types structures in the Script Commands Objects + // Command Types array of: variable // + // * Command Type Name Length WORD 16 // number of Unicode characters for Command Type Name + // * Command Type Name WCHAR variable // array of Unicode characters - name of a type of command + // Commands array of: variable // + // * Presentation Time DWORD 32 // presentation time of that command, in milliseconds + // * Type Index WORD 16 // type of this command, as a zero-based index into the array of Command Types of this object + // * Command Name Length WORD 16 // number of Unicode characters for Command Name + // * Command Name WCHAR variable // array of Unicode characters - name of this command + + // shortcut + $thisfile_asf['script_command_object'] = array(); + $thisfile_asf_scriptcommandobject = &$thisfile_asf['script_command_object']; + + $thisfile_asf_scriptcommandobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_scriptcommandobject['objectid'] = $NextObjectGUID; + $thisfile_asf_scriptcommandobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_scriptcommandobject['objectsize'] = $NextObjectSize; + $thisfile_asf_scriptcommandobject['reserved'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_scriptcommandobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']); + if ($thisfile_asf_scriptcommandobject['reserved'] != $this->GUIDtoBytestring('4B1ACBE3-100B-11D0-A39B-00A0C90348F6')) { + $this->warning('script_command_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4B1ACBE3-100B-11D0-A39B-00A0C90348F6}'); + //return false; + break; + } + $thisfile_asf_scriptcommandobject['commands_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_scriptcommandobject['command_types_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + for ($CommandTypesCounter = 0; $CommandTypesCounter < $thisfile_asf_scriptcommandobject['command_types_count']; $CommandTypesCounter++) { + $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character + $offset += 2; + $thisfile_asf_scriptcommandobject['command_types'][$CommandTypesCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); + $offset += $CommandTypeNameLength; + } + for ($CommandsCounter = 0; $CommandsCounter < $thisfile_asf_scriptcommandobject['commands_count']; $CommandsCounter++) { + $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['type_index'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + + $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character + $offset += 2; + $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); + $offset += $CommandTypeNameLength; + } + break; + + case GETID3_ASF_Marker_Object: + // Marker Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Marker object - GETID3_ASF_Marker_Object + // Object Size QWORD 64 // size of Marker object, including 48 bytes of Marker Object header + // Reserved GUID 128 // hardcoded: 4CFEDB20-75F6-11CF-9C0F-00A0C90349CB + // Markers Count DWORD 32 // number of Marker structures in Marker Object + // Reserved WORD 16 // hardcoded: 0x0000 + // Name Length WORD 16 // number of bytes in the Name field + // Name WCHAR variable // name of the Marker Object + // Markers array of: variable // + // * Offset QWORD 64 // byte offset into Data Object + // * Presentation Time QWORD 64 // in 100-nanosecond units + // * Entry Length WORD 16 // length in bytes of (Send Time + Flags + Marker Description Length + Marker Description + Padding) + // * Send Time DWORD 32 // in milliseconds + // * Flags DWORD 32 // hardcoded: 0x00000000 + // * Marker Description Length DWORD 32 // number of bytes in Marker Description field + // * Marker Description WCHAR variable // array of Unicode characters - description of marker entry + // * Padding BYTESTREAM variable // optional padding bytes + + // shortcut + $thisfile_asf['marker_object'] = array(); + $thisfile_asf_markerobject = &$thisfile_asf['marker_object']; + + $thisfile_asf_markerobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_markerobject['objectid'] = $NextObjectGUID; + $thisfile_asf_markerobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_markerobject['objectsize'] = $NextObjectSize; + $thisfile_asf_markerobject['reserved'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_markerobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_markerobject['reserved']); + if ($thisfile_asf_markerobject['reserved'] != $this->GUIDtoBytestring('4CFEDB20-75F6-11CF-9C0F-00A0C90349CB')) { + $this->warning('marker_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_markerobject['reserved_1']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}'); + break; + } + $thisfile_asf_markerobject['markers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_markerobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + if ($thisfile_asf_markerobject['reserved_2'] != 0) { + $this->warning('marker_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_markerobject['reserved_2']).') does not match expected value of "0"'); + break; + } + $thisfile_asf_markerobject['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_markerobject['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['name_length']); + $offset += $thisfile_asf_markerobject['name_length']; + for ($MarkersCounter = 0; $MarkersCounter < $thisfile_asf_markerobject['markers_count']; $MarkersCounter++) { + $thisfile_asf_markerobject['markers'][$MarkersCounter]['offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); + $offset += 8; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['send_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['flags'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']); + $offset += $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; + $PaddingLength = $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] - 4 - 4 - 4 - $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; + if ($PaddingLength > 0) { + $thisfile_asf_markerobject['markers'][$MarkersCounter]['padding'] = substr($ASFHeaderData, $offset, $PaddingLength); + $offset += $PaddingLength; + } + } + break; + + case GETID3_ASF_Bitrate_Mutual_Exclusion_Object: + // Bitrate Mutual Exclusion Object: (optional) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Bitrate Mutual Exclusion object - GETID3_ASF_Bitrate_Mutual_Exclusion_Object + // Object Size QWORD 64 // size of Bitrate Mutual Exclusion object, including 42 bytes of Bitrate Mutual Exclusion Object header + // Exlusion Type GUID 128 // nature of mutual exclusion relationship. one of: (GETID3_ASF_Mutex_Bitrate, GETID3_ASF_Mutex_Unknown) + // Stream Numbers Count WORD 16 // number of video streams + // Stream Numbers WORD variable // array of mutually exclusive video stream numbers. 1 <= valid <= 127 + + // shortcut + $thisfile_asf['bitrate_mutual_exclusion_object'] = array(); + $thisfile_asf_bitratemutualexclusionobject = &$thisfile_asf['bitrate_mutual_exclusion_object']; + + $thisfile_asf_bitratemutualexclusionobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_bitratemutualexclusionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_bitratemutualexclusionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_bitratemutualexclusionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_bitratemutualexclusionobject['reserved'] = substr($ASFHeaderData, $offset, 16); + $thisfile_asf_bitratemutualexclusionobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']); + $offset += 16; + if (($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Bitrate) && ($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Unknown)) { + $this->warning('bitrate_mutual_exclusion_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']).'} does not match expected "GETID3_ASF_Mutex_Bitrate" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Bitrate).'} or "GETID3_ASF_Mutex_Unknown" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Unknown).'}'); + //return false; + break; + } + $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + for ($StreamNumberCounter = 0; $StreamNumberCounter < $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count']; $StreamNumberCounter++) { + $thisfile_asf_bitratemutualexclusionobject['stream_numbers'][$StreamNumberCounter] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + } + break; + + case GETID3_ASF_Error_Correction_Object: + // Error Correction Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Error Correction object - GETID3_ASF_Error_Correction_Object + // Object Size QWORD 64 // size of Error Correction object, including 44 bytes of Error Correction Object header + // Error Correction Type GUID 128 // type of error correction. one of: (GETID3_ASF_No_Error_Correction, GETID3_ASF_Audio_Spread) + // Error Correction Data Length DWORD 32 // number of bytes in Error Correction Data field + // Error Correction Data BYTESTREAM variable // structure depends on value of Error Correction Type field + + // shortcut + $thisfile_asf['error_correction_object'] = array(); + $thisfile_asf_errorcorrectionobject = &$thisfile_asf['error_correction_object']; + + $thisfile_asf_errorcorrectionobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_errorcorrectionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_errorcorrectionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_errorcorrectionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_errorcorrectionobject['error_correction_type'] = substr($ASFHeaderData, $offset, 16); + $offset += 16; + $thisfile_asf_errorcorrectionobject['error_correction_guid'] = $this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']); + $thisfile_asf_errorcorrectionobject['error_correction_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + switch ($thisfile_asf_errorcorrectionobject['error_correction_type']) { + case GETID3_ASF_No_Error_Correction: + // should be no data, but just in case there is, skip to the end of the field + $offset += $thisfile_asf_errorcorrectionobject['error_correction_data_length']; + break; + + case GETID3_ASF_Audio_Spread: + // Field Name Field Type Size (bits) + // Span BYTE 8 // number of packets over which audio will be spread. + // Virtual Packet Length WORD 16 // size of largest audio payload found in audio stream + // Virtual Chunk Length WORD 16 // size of largest audio payload found in audio stream + // Silence Data Length WORD 16 // number of bytes in Silence Data field + // Silence Data BYTESTREAM variable // hardcoded: 0x00 * (Silence Data Length) bytes + + $thisfile_asf_errorcorrectionobject['span'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 1)); + $offset += 1; + $thisfile_asf_errorcorrectionobject['virtual_packet_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_errorcorrectionobject['virtual_chunk_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_errorcorrectionobject['silence_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_errorcorrectionobject['silence_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_errorcorrectionobject['silence_data_length']); + $offset += $thisfile_asf_errorcorrectionobject['silence_data_length']; + break; + + default: + $this->warning('error_correction_object.error_correction_type GUID {'.$this->BytestringToGUID($thisfile_asf_errorcorrectionobject['reserved']).'} does not match expected "GETID3_ASF_No_Error_Correction" GUID {'.$this->BytestringToGUID(GETID3_ASF_No_Error_Correction).'} or "GETID3_ASF_Audio_Spread" GUID {'.$this->BytestringToGUID(GETID3_ASF_Audio_Spread).'}'); + //return false; + break; + } + + break; + + case GETID3_ASF_Content_Description_Object: + // Content Description Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Content Description object - GETID3_ASF_Content_Description_Object + // Object Size QWORD 64 // size of Content Description object, including 34 bytes of Content Description Object header + // Title Length WORD 16 // number of bytes in Title field + // Author Length WORD 16 // number of bytes in Author field + // Copyright Length WORD 16 // number of bytes in Copyright field + // Description Length WORD 16 // number of bytes in Description field + // Rating Length WORD 16 // number of bytes in Rating field + // Title WCHAR 16 // array of Unicode characters - Title + // Author WCHAR 16 // array of Unicode characters - Author + // Copyright WCHAR 16 // array of Unicode characters - Copyright + // Description WCHAR 16 // array of Unicode characters - Description + // Rating WCHAR 16 // array of Unicode characters - Rating + + // shortcut + $thisfile_asf['content_description_object'] = array(); + $thisfile_asf_contentdescriptionobject = &$thisfile_asf['content_description_object']; + + $thisfile_asf_contentdescriptionobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_contentdescriptionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_contentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_contentdescriptionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_contentdescriptionobject['title_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['author_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['copyright_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['rating_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_contentdescriptionobject['title'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['title_length']); + $offset += $thisfile_asf_contentdescriptionobject['title_length']; + $thisfile_asf_contentdescriptionobject['author'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['author_length']); + $offset += $thisfile_asf_contentdescriptionobject['author_length']; + $thisfile_asf_contentdescriptionobject['copyright'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['copyright_length']); + $offset += $thisfile_asf_contentdescriptionobject['copyright_length']; + $thisfile_asf_contentdescriptionobject['description'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['description_length']); + $offset += $thisfile_asf_contentdescriptionobject['description_length']; + $thisfile_asf_contentdescriptionobject['rating'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['rating_length']); + $offset += $thisfile_asf_contentdescriptionobject['rating_length']; + + $ASFcommentKeysToCopy = array('title'=>'title', 'author'=>'artist', 'copyright'=>'copyright', 'description'=>'comment', 'rating'=>'rating'); + foreach ($ASFcommentKeysToCopy as $keytocopyfrom => $keytocopyto) { + if (!empty($thisfile_asf_contentdescriptionobject[$keytocopyfrom])) { + $thisfile_asf_comments[$keytocopyto][] = $this->TrimTerm($thisfile_asf_contentdescriptionobject[$keytocopyfrom]); + } + } + break; + + case GETID3_ASF_Extended_Content_Description_Object: + // Extended Content Description Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Extended Content Description object - GETID3_ASF_Extended_Content_Description_Object + // Object Size QWORD 64 // size of ExtendedContent Description object, including 26 bytes of Extended Content Description Object header + // Content Descriptors Count WORD 16 // number of entries in Content Descriptors list + // Content Descriptors array of: variable // + // * Descriptor Name Length WORD 16 // size in bytes of Descriptor Name field + // * Descriptor Name WCHAR variable // array of Unicode characters - Descriptor Name + // * Descriptor Value Data Type WORD 16 // Lookup array: + // 0x0000 = Unicode String (variable length) + // 0x0001 = BYTE array (variable length) + // 0x0002 = BOOL (DWORD, 32 bits) + // 0x0003 = DWORD (DWORD, 32 bits) + // 0x0004 = QWORD (QWORD, 64 bits) + // 0x0005 = WORD (WORD, 16 bits) + // * Descriptor Value Length WORD 16 // number of bytes stored in Descriptor Value field + // * Descriptor Value variable variable // value for Content Descriptor + + // shortcut + $thisfile_asf['extended_content_description_object'] = array(); + $thisfile_asf_extendedcontentdescriptionobject = &$thisfile_asf['extended_content_description_object']; + + $thisfile_asf_extendedcontentdescriptionobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_extendedcontentdescriptionobject['objectid'] = $NextObjectGUID; + $thisfile_asf_extendedcontentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_extendedcontentdescriptionobject['objectsize'] = $NextObjectSize; + $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + for ($ExtendedContentDescriptorsCounter = 0; $ExtendedContentDescriptorsCounter < $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count']; $ExtendedContentDescriptorsCounter++) { + // shortcut + $thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter] = array(); + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current = &$thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter]; + + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['base_offset'] = $offset + 30; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']); + $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']); + $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']; + switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { + case 0x0000: // Unicode string + break; + + case 0x0001: // BYTE array + // do nothing + break; + + case 0x0002: // BOOL + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = (bool) getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + break; + + case 0x0003: // DWORD + case 0x0004: // QWORD + case 0x0005: // WORD + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + break; + + default: + $this->warning('extended_content_description.content_descriptors.'.$ExtendedContentDescriptorsCounter.'.value_type is invalid ('.$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'].')'); + //return false; + break; + } + switch ($this->TrimConvert(strtolower($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']))) { + + case 'wm/albumartist': + case 'artist': + // Note: not 'artist', that comes from 'author' tag + $thisfile_asf_comments['albumartist'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'wm/albumtitle': + case 'album': + $thisfile_asf_comments['album'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'wm/genre': + case 'genre': + $thisfile_asf_comments['genre'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'wm/partofset': + $thisfile_asf_comments['partofset'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'wm/tracknumber': + case 'tracknumber': + // be careful casting to int: casting unicode strings to int gives unexpected results (stops parsing at first non-numeric character) + $thisfile_asf_comments['track_number'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + foreach ($thisfile_asf_comments['track_number'] as $key => $value) { + if (preg_match('/^[0-9\x00]+$/', $value)) { + $thisfile_asf_comments['track_number'][$key] = intval(str_replace("\x00", '', $value)); + } + } + break; + + case 'wm/track': + if (empty($thisfile_asf_comments['track_number'])) { + $thisfile_asf_comments['track_number'] = array(1 + $this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + } + break; + + case 'wm/year': + case 'year': + case 'date': + $thisfile_asf_comments['year'] = array( $this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'wm/lyrics': + case 'lyrics': + $thisfile_asf_comments['lyrics'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + break; + + case 'isvbr': + if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']) { + $thisfile_audio['bitrate_mode'] = 'vbr'; + $thisfile_video['bitrate_mode'] = 'vbr'; + } + break; + + case 'id3': + $this->getid3->include_module('tag.id3v2'); + + $getid3_id3v2 = new getid3_id3v2($this->getid3); + $getid3_id3v2->AnalyzeString($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + unset($getid3_id3v2); + + if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] > 1024) { + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = ''; + } + break; + + case 'wm/encodingtime': + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + $thisfile_asf_comments['encoding_time_unix'] = array($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix']); + break; + + case 'wm/picture': + $WMpicture = $this->ASF_WMpicture($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + foreach ($WMpicture as $key => $value) { + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current[$key] = $value; + } + unset($WMpicture); +/* + $wm_picture_offset = 0; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 1)); + $wm_picture_offset += 1; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type'] = self::WMpictureTypeLookup($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id']); + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 4)); + $wm_picture_offset += 4; + + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = ''; + do { + $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); + $wm_picture_offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] .= $next_byte_pair; + } while ($next_byte_pair !== "\x00\x00"); + + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] = ''; + do { + $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); + $wm_picture_offset += 2; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] .= $next_byte_pair; + } while ($next_byte_pair !== "\x00\x00"); + + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['dataoffset'] = $wm_picture_offset; + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'] = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset); + unset($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); + + $imageinfo = array(); + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = ''; + $imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], $imageinfo); + unset($imageinfo); + if (!empty($imagechunkcheck)) { + $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); + } + if (!isset($thisfile_asf_comments['picture'])) { + $thisfile_asf_comments['picture'] = array(); + } + $thisfile_asf_comments['picture'][] = array('data'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], 'image_mime'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime']); +*/ + break; + + default: + switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { + case 0: // Unicode string + if (substr($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']), 0, 3) == 'WM/') { + $thisfile_asf_comments[str_replace('wm/', '', strtolower($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'])))] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); + } + break; + + case 1: + break; + } + break; + } + + } + break; + + case GETID3_ASF_Stream_Bitrate_Properties_Object: + // Stream Bitrate Properties Object: (optional, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Stream Bitrate Properties object - GETID3_ASF_Stream_Bitrate_Properties_Object + // Object Size QWORD 64 // size of Extended Content Description object, including 26 bytes of Stream Bitrate Properties Object header + // Bitrate Records Count WORD 16 // number of records in Bitrate Records + // Bitrate Records array of: variable // + // * Flags WORD 16 // + // * * Stream Number bits 7 (0x007F) // number of this stream + // * * Reserved bits 9 (0xFF80) // hardcoded: 0 + // * Average Bitrate DWORD 32 // in bits per second + + // shortcut + $thisfile_asf['stream_bitrate_properties_object'] = array(); + $thisfile_asf_streambitratepropertiesobject = &$thisfile_asf['stream_bitrate_properties_object']; + + $thisfile_asf_streambitratepropertiesobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_streambitratepropertiesobject['objectid'] = $NextObjectGUID; + $thisfile_asf_streambitratepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_streambitratepropertiesobject['objectsize'] = $NextObjectSize; + $thisfile_asf_streambitratepropertiesobject['bitrate_records_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) { + $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); + $offset += 2; + $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags']['stream_number'] = $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] & 0x007F; + $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); + $offset += 4; + } + break; + + case GETID3_ASF_Padding_Object: + // Padding Object: (optional) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Padding object - GETID3_ASF_Padding_Object + // Object Size QWORD 64 // size of Padding object, including 24 bytes of ASF Padding Object header + // Padding Data BYTESTREAM variable // ignore + + // shortcut + $thisfile_asf['padding_object'] = array(); + $thisfile_asf_paddingobject = &$thisfile_asf['padding_object']; + + $thisfile_asf_paddingobject['offset'] = $NextObjectOffset + $offset; + $thisfile_asf_paddingobject['objectid'] = $NextObjectGUID; + $thisfile_asf_paddingobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_paddingobject['objectsize'] = $NextObjectSize; + $thisfile_asf_paddingobject['padding_length'] = $thisfile_asf_paddingobject['objectsize'] - 16 - 8; + $thisfile_asf_paddingobject['padding'] = substr($ASFHeaderData, $offset, $thisfile_asf_paddingobject['padding_length']); + $offset += ($NextObjectSize - 16 - 8); + break; + + case GETID3_ASF_Extended_Content_Encryption_Object: + case GETID3_ASF_Content_Encryption_Object: + // WMA DRM - just ignore + $offset += ($NextObjectSize - 16 - 8); + break; + + default: + // Implementations shall ignore any standard or non-standard object that they do not know how to handle. + if ($this->GUIDname($NextObjectGUIDtext)) { + $this->warning('unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8)); + } else { + $this->warning('unknown GUID {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8)); + } + $offset += ($NextObjectSize - 16 - 8); + break; + } + } + if (isset($thisfile_asf_streambitratepropertiesobject['bitrate_records_count'])) { + $ASFbitrateAudio = 0; + $ASFbitrateVideo = 0; + for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) { + if (isset($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter])) { + switch ($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter]['type_raw']) { + case 1: + $ASFbitrateVideo += $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate']; + break; + + case 2: + $ASFbitrateAudio += $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate']; + break; + + default: + // do nothing + break; + } + } + } + if ($ASFbitrateAudio > 0) { + $thisfile_audio['bitrate'] = $ASFbitrateAudio; + } + if ($ASFbitrateVideo > 0) { + $thisfile_video['bitrate'] = $ASFbitrateVideo; + } + } + if (isset($thisfile_asf['stream_properties_object']) && is_array($thisfile_asf['stream_properties_object'])) { + + $thisfile_audio['bitrate'] = 0; + $thisfile_video['bitrate'] = 0; + + foreach ($thisfile_asf['stream_properties_object'] as $streamnumber => $streamdata) { + + switch ($streamdata['stream_type']) { + case GETID3_ASF_Audio_Media: + // Field Name Field Type Size (bits) + // Codec ID / Format Tag WORD 16 // unique ID of audio codec - defined as wFormatTag field of WAVEFORMATEX structure + // Number of Channels WORD 16 // number of channels of audio - defined as nChannels field of WAVEFORMATEX structure + // Samples Per Second DWORD 32 // in Hertz - defined as nSamplesPerSec field of WAVEFORMATEX structure + // Average number of Bytes/sec DWORD 32 // bytes/sec of audio stream - defined as nAvgBytesPerSec field of WAVEFORMATEX structure + // Block Alignment WORD 16 // block size in bytes of audio codec - defined as nBlockAlign field of WAVEFORMATEX structure + // Bits per sample WORD 16 // bits per sample of mono data. set to zero for variable bitrate codecs. defined as wBitsPerSample field of WAVEFORMATEX structure + // Codec Specific Data Size WORD 16 // size in bytes of Codec Specific Data buffer - defined as cbSize field of WAVEFORMATEX structure + // Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes + + // shortcut + $thisfile_asf['audio_media'][$streamnumber] = array(); + $thisfile_asf_audiomedia_currentstream = &$thisfile_asf['audio_media'][$streamnumber]; + + $audiomediaoffset = 0; + + $thisfile_asf_audiomedia_currentstream = getid3_riff::parseWAVEFORMATex(substr($streamdata['type_specific_data'], $audiomediaoffset, 16)); + $audiomediaoffset += 16; + + $thisfile_audio['lossless'] = false; + switch ($thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']) { + case 0x0001: // PCM + case 0x0163: // WMA9 Lossless + $thisfile_audio['lossless'] = true; + break; + } + + if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { + foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { + if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) { + $thisfile_asf_audiomedia_currentstream['bitrate'] = $dataarray['bitrate']; + $thisfile_audio['bitrate'] += $dataarray['bitrate']; + break; + } + } + } else { + if (!empty($thisfile_asf_audiomedia_currentstream['bytes_sec'])) { + $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bytes_sec'] * 8; + } elseif (!empty($thisfile_asf_audiomedia_currentstream['bitrate'])) { + $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bitrate']; + } + } + $thisfile_audio['streams'][$streamnumber] = $thisfile_asf_audiomedia_currentstream; + $thisfile_audio['streams'][$streamnumber]['wformattag'] = $thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']; + $thisfile_audio['streams'][$streamnumber]['lossless'] = $thisfile_audio['lossless']; + $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; + $thisfile_audio['streams'][$streamnumber]['dataformat'] = 'wma'; + unset($thisfile_audio['streams'][$streamnumber]['raw']); + + $thisfile_asf_audiomedia_currentstream['codec_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $audiomediaoffset, 2)); + $audiomediaoffset += 2; + $thisfile_asf_audiomedia_currentstream['codec_data'] = substr($streamdata['type_specific_data'], $audiomediaoffset, $thisfile_asf_audiomedia_currentstream['codec_data_size']); + $audiomediaoffset += $thisfile_asf_audiomedia_currentstream['codec_data_size']; + + break; + + case GETID3_ASF_Video_Media: + // Field Name Field Type Size (bits) + // Encoded Image Width DWORD 32 // width of image in pixels + // Encoded Image Height DWORD 32 // height of image in pixels + // Reserved Flags BYTE 8 // hardcoded: 0x02 + // Format Data Size WORD 16 // size of Format Data field in bytes + // Format Data array of: variable // + // * Format Data Size DWORD 32 // number of bytes in Format Data field, in bytes - defined as biSize field of BITMAPINFOHEADER structure + // * Image Width LONG 32 // width of encoded image in pixels - defined as biWidth field of BITMAPINFOHEADER structure + // * Image Height LONG 32 // height of encoded image in pixels - defined as biHeight field of BITMAPINFOHEADER structure + // * Reserved WORD 16 // hardcoded: 0x0001 - defined as biPlanes field of BITMAPINFOHEADER structure + // * Bits Per Pixel Count WORD 16 // bits per pixel - defined as biBitCount field of BITMAPINFOHEADER structure + // * Compression ID FOURCC 32 // fourcc of video codec - defined as biCompression field of BITMAPINFOHEADER structure + // * Image Size DWORD 32 // image size in bytes - defined as biSizeImage field of BITMAPINFOHEADER structure + // * Horizontal Pixels / Meter DWORD 32 // horizontal resolution of target device in pixels per meter - defined as biXPelsPerMeter field of BITMAPINFOHEADER structure + // * Vertical Pixels / Meter DWORD 32 // vertical resolution of target device in pixels per meter - defined as biYPelsPerMeter field of BITMAPINFOHEADER structure + // * Colors Used Count DWORD 32 // number of color indexes in the color table that are actually used - defined as biClrUsed field of BITMAPINFOHEADER structure + // * Important Colors Count DWORD 32 // number of color index required for displaying bitmap. if zero, all colors are required. defined as biClrImportant field of BITMAPINFOHEADER structure + // * Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes + + // shortcut + $thisfile_asf['video_media'][$streamnumber] = array(); + $thisfile_asf_videomedia_currentstream = &$thisfile_asf['video_media'][$streamnumber]; + + $videomediaoffset = 0; + $thisfile_asf_videomedia_currentstream['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['flags'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 1)); + $videomediaoffset += 1; + $thisfile_asf_videomedia_currentstream['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); + $videomediaoffset += 2; + $thisfile_asf_videomedia_currentstream['format_data']['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['reserved'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); + $videomediaoffset += 2; + $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); + $videomediaoffset += 2; + $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc'] = substr($streamdata['type_specific_data'], $videomediaoffset, 4); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['image_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['horizontal_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['vertical_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['colors_used'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['colors_important'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); + $videomediaoffset += 4; + $thisfile_asf_videomedia_currentstream['format_data']['codec_data'] = substr($streamdata['type_specific_data'], $videomediaoffset); + + if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { + foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { + if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) { + $thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate']; + $thisfile_video['streams'][$streamnumber]['bitrate'] = $dataarray['bitrate']; + $thisfile_video['bitrate'] += $dataarray['bitrate']; + break; + } + } + } + + $thisfile_asf_videomedia_currentstream['format_data']['codec'] = getid3_riff::fourccLookup($thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']); + + $thisfile_video['streams'][$streamnumber]['fourcc'] = $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']; + $thisfile_video['streams'][$streamnumber]['codec'] = $thisfile_asf_videomedia_currentstream['format_data']['codec']; + $thisfile_video['streams'][$streamnumber]['resolution_x'] = $thisfile_asf_videomedia_currentstream['image_width']; + $thisfile_video['streams'][$streamnumber]['resolution_y'] = $thisfile_asf_videomedia_currentstream['image_height']; + $thisfile_video['streams'][$streamnumber]['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel']; + break; + + default: + break; + } + } + } + + while ($this->ftell() < $info['avdataend']) { + $NextObjectDataHeader = $this->fread(24); + $offset = 0; + $NextObjectGUID = substr($NextObjectDataHeader, 0, 16); + $offset += 16; + $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); + $NextObjectSize = getid3_lib::LittleEndian2Int(substr($NextObjectDataHeader, $offset, 8)); + $offset += 8; + + switch ($NextObjectGUID) { + case GETID3_ASF_Data_Object: + // Data Object: (mandatory, one only) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Data object - GETID3_ASF_Data_Object + // Object Size QWORD 64 // size of Data object, including 50 bytes of Data Object header. may be 0 if FilePropertiesObject.BroadcastFlag == 1 + // File ID GUID 128 // unique identifier. identical to File ID field in Header Object + // Total Data Packets QWORD 64 // number of Data Packet entries in Data Object. invalid if FilePropertiesObject.BroadcastFlag == 1 + // Reserved WORD 16 // hardcoded: 0x0101 + + // shortcut + $thisfile_asf['data_object'] = array(); + $thisfile_asf_dataobject = &$thisfile_asf['data_object']; + + $DataObjectData = $NextObjectDataHeader.$this->fread(50 - 24); + $offset = 24; + + $thisfile_asf_dataobject['objectid'] = $NextObjectGUID; + $thisfile_asf_dataobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_dataobject['objectsize'] = $NextObjectSize; + + $thisfile_asf_dataobject['fileid'] = substr($DataObjectData, $offset, 16); + $offset += 16; + $thisfile_asf_dataobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_dataobject['fileid']); + $thisfile_asf_dataobject['total_data_packets'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 8)); + $offset += 8; + $thisfile_asf_dataobject['reserved'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 2)); + $offset += 2; + if ($thisfile_asf_dataobject['reserved'] != 0x0101) { + $this->warning('data_object.reserved ('.getid3_lib::PrintHexBytes($thisfile_asf_dataobject['reserved']).') does not match expected value of "0x0101"'); + //return false; + break; + } + + // Data Packets array of: variable // + // * Error Correction Flags BYTE 8 // + // * * Error Correction Data Length bits 4 // if Error Correction Length Type == 00, size of Error Correction Data in bytes, else hardcoded: 0000 + // * * Opaque Data Present bits 1 // + // * * Error Correction Length Type bits 2 // number of bits for size of the error correction data. hardcoded: 00 + // * * Error Correction Present bits 1 // If set, use Opaque Data Packet structure, else use Payload structure + // * Error Correction Data + + $info['avdataoffset'] = $this->ftell(); + $this->fseek(($thisfile_asf_dataobject['objectsize'] - 50), SEEK_CUR); // skip actual audio/video data + $info['avdataend'] = $this->ftell(); + break; + + case GETID3_ASF_Simple_Index_Object: + // Simple Index Object: (optional, recommended, one per video stream) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for Simple Index object - GETID3_ASF_Data_Object + // Object Size QWORD 64 // size of Simple Index object, including 56 bytes of Simple Index Object header + // File ID GUID 128 // unique identifier. may be zero or identical to File ID field in Data Object and Header Object + // Index Entry Time Interval QWORD 64 // interval between index entries in 100-nanosecond units + // Maximum Packet Count DWORD 32 // maximum packet count for all index entries + // Index Entries Count DWORD 32 // number of Index Entries structures + // Index Entries array of: variable // + // * Packet Number DWORD 32 // number of the Data Packet associated with this index entry + // * Packet Count WORD 16 // number of Data Packets to sent at this index entry + + // shortcut + $thisfile_asf['simple_index_object'] = array(); + $thisfile_asf_simpleindexobject = &$thisfile_asf['simple_index_object']; + + $SimpleIndexObjectData = $NextObjectDataHeader.$this->fread(56 - 24); + $offset = 24; + + $thisfile_asf_simpleindexobject['objectid'] = $NextObjectGUID; + $thisfile_asf_simpleindexobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_simpleindexobject['objectsize'] = $NextObjectSize; + + $thisfile_asf_simpleindexobject['fileid'] = substr($SimpleIndexObjectData, $offset, 16); + $offset += 16; + $thisfile_asf_simpleindexobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_simpleindexobject['fileid']); + $thisfile_asf_simpleindexobject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 8)); + $offset += 8; + $thisfile_asf_simpleindexobject['maximum_packet_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); + $offset += 4; + $thisfile_asf_simpleindexobject['index_entries_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); + $offset += 4; + + $IndexEntriesData = $SimpleIndexObjectData.$this->fread(6 * $thisfile_asf_simpleindexobject['index_entries_count']); + for ($IndexEntriesCounter = 0; $IndexEntriesCounter < $thisfile_asf_simpleindexobject['index_entries_count']; $IndexEntriesCounter++) { + $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_number'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); + $offset += 4; + $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_count'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); + $offset += 2; + } + + break; + + case GETID3_ASF_Index_Object: + // 6.2 ASF top-level Index Object (optional but recommended when appropriate, 0 or 1) + // Field Name Field Type Size (bits) + // Object ID GUID 128 // GUID for the Index Object - GETID3_ASF_Index_Object + // Object Size QWORD 64 // Specifies the size, in bytes, of the Index Object, including at least 34 bytes of Index Object header + // Index Entry Time Interval DWORD 32 // Specifies the time interval between each index entry in ms. + // Index Specifiers Count WORD 16 // Specifies the number of Index Specifiers structures in this Index Object. + // Index Blocks Count DWORD 32 // Specifies the number of Index Blocks structures in this Index Object. + + // Index Entry Time Interval DWORD 32 // Specifies the time interval between index entries in milliseconds. This value cannot be 0. + // Index Specifiers Count WORD 16 // Specifies the number of entries in the Index Specifiers list. Valid values are 1 and greater. + // Index Specifiers array of: varies // + // * Stream Number WORD 16 // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127. + // * Index Type WORD 16 // Specifies Index Type values as follows: + // 1 = Nearest Past Data Packet - indexes point to the data packet whose presentation time is closest to the index entry time. + // 2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire object or first fragment of an object. + // 3 = Nearest Past Cleanpoint. - indexes point to the closest data packet containing an entire object (or first fragment of an object) that has the Cleanpoint Flag set. + // Nearest Past Cleanpoint is the most common type of index. + // Index Entry Count DWORD 32 // Specifies the number of Index Entries in the block. + // * Block Positions QWORD varies // Specifies a list of byte offsets of the beginnings of the blocks relative to the beginning of the first Data Packet (i.e., the beginning of the Data Object + 50 bytes). The number of entries in this list is specified by the value of the Index Specifiers Count field. The order of those byte offsets is tied to the order in which Index Specifiers are listed. + // * Index Entries array of: varies // + // * * Offsets DWORD varies // An offset value of 0xffffffff indicates an invalid offset value + + // shortcut + $thisfile_asf['asf_index_object'] = array(); + $thisfile_asf_asfindexobject = &$thisfile_asf['asf_index_object']; + + $ASFIndexObjectData = $NextObjectDataHeader.$this->fread(34 - 24); + $offset = 24; + + $thisfile_asf_asfindexobject['objectid'] = $NextObjectGUID; + $thisfile_asf_asfindexobject['objectid_guid'] = $NextObjectGUIDtext; + $thisfile_asf_asfindexobject['objectsize'] = $NextObjectSize; + + $thisfile_asf_asfindexobject['entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); + $offset += 4; + $thisfile_asf_asfindexobject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); + $offset += 2; + $thisfile_asf_asfindexobject['index_blocks_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); + $offset += 4; + + $ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count']); + for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { + $IndexSpecifierStreamNumber = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); + $offset += 2; + $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['stream_number'] = $IndexSpecifierStreamNumber; + $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); + $offset += 2; + $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type_text'] = $this->ASFIndexObjectIndexTypeLookup($thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type']); + } + + $ASFIndexObjectData .= $this->fread(4); + $thisfile_asf_asfindexobject['index_entry_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); + $offset += 4; + + $ASFIndexObjectData .= $this->fread(8 * $thisfile_asf_asfindexobject['index_specifiers_count']); + for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { + $thisfile_asf_asfindexobject['block_positions'][$IndexSpecifiersCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 8)); + $offset += 8; + } + + $ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count'] * $thisfile_asf_asfindexobject['index_entry_count']); + for ($IndexEntryCounter = 0; $IndexEntryCounter < $thisfile_asf_asfindexobject['index_entry_count']; $IndexEntryCounter++) { + for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { + $thisfile_asf_asfindexobject['offsets'][$IndexSpecifiersCounter][$IndexEntryCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); + $offset += 4; + } + } + break; + + + default: + // Implementations shall ignore any standard or non-standard object that they do not know how to handle. + if ($this->GUIDname($NextObjectGUIDtext)) { + $this->warning('unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF body at offset '.($offset - 16 - 8)); + } else { + $this->warning('unknown GUID {'.$NextObjectGUIDtext.'} in ASF body at offset '.($this->ftell() - 16 - 8)); + } + $this->fseek(($NextObjectSize - 16 - 8), SEEK_CUR); + break; + } + } + + if (isset($thisfile_asf_codeclistobject['codec_entries']) && is_array($thisfile_asf_codeclistobject['codec_entries'])) { + foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { + switch ($streamdata['information']) { + case 'WMV1': + case 'WMV2': + case 'WMV3': + case 'MSS1': + case 'MSS2': + case 'WMVA': + case 'WVC1': + case 'WMVP': + case 'WVP2': + $thisfile_video['dataformat'] = 'wmv'; + $info['mime_type'] = 'video/x-ms-wmv'; + break; + + case 'MP42': + case 'MP43': + case 'MP4S': + case 'mp4s': + $thisfile_video['dataformat'] = 'asf'; + $info['mime_type'] = 'video/x-ms-asf'; + break; + + default: + switch ($streamdata['type_raw']) { + case 1: + if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { + $thisfile_video['dataformat'] = 'wmv'; + if ($info['mime_type'] == 'video/x-ms-asf') { + $info['mime_type'] = 'video/x-ms-wmv'; + } + } + break; + + case 2: + if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { + $thisfile_audio['dataformat'] = 'wma'; + if ($info['mime_type'] == 'video/x-ms-asf') { + $info['mime_type'] = 'audio/x-ms-wma'; + } + } + break; + + } + break; + } + } + } + + switch (isset($thisfile_audio['codec']) ? $thisfile_audio['codec'] : '') { + case 'MPEG Layer-3': + $thisfile_audio['dataformat'] = 'mp3'; + break; + + default: + break; + } + + if (isset($thisfile_asf_codeclistobject['codec_entries'])) { + foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { + switch ($streamdata['type_raw']) { + + case 1: // video + $thisfile_video['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); + break; + + case 2: // audio + $thisfile_audio['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); + + // AH 2003-10-01 + $thisfile_audio['encoder_options'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][0]['description']); + + $thisfile_audio['codec'] = $thisfile_audio['encoder']; + break; + + default: + $this->warning('Unknown streamtype: [codec_list_object][codec_entries]['.$streamnumber.'][type_raw] == '.$streamdata['type_raw']); + break; + + } + } + } + + if (isset($info['audio'])) { + $thisfile_audio['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); + $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); + } + if (!empty($thisfile_video['dataformat'])) { + $thisfile_video['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); + $thisfile_video['pixel_aspect_ratio'] = (isset($thisfile_audio['pixel_aspect_ratio']) ? $thisfile_audio['pixel_aspect_ratio'] : (float) 1); + $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); + } + if (!empty($thisfile_video['streams'])) { + $thisfile_video['resolution_x'] = 0; + $thisfile_video['resolution_y'] = 0; + foreach ($thisfile_video['streams'] as $key => $valuearray) { + if (($valuearray['resolution_x'] > $thisfile_video['resolution_x']) || ($valuearray['resolution_y'] > $thisfile_video['resolution_y'])) { + $thisfile_video['resolution_x'] = $valuearray['resolution_x']; + $thisfile_video['resolution_y'] = $valuearray['resolution_y']; + } + } + } + $info['bitrate'] = (isset($thisfile_audio['bitrate']) ? $thisfile_audio['bitrate'] : 0) + (isset($thisfile_video['bitrate']) ? $thisfile_video['bitrate'] : 0); + + if ((!isset($info['playtime_seconds']) || ($info['playtime_seconds'] <= 0)) && ($info['bitrate'] > 0)) { + $info['playtime_seconds'] = ($info['filesize'] - $info['avdataoffset']) / ($info['bitrate'] / 8); + } + + return true; + } + + /** + * @param int $CodecListType + * + * @return string + */ + public static function codecListObjectTypeLookup($CodecListType) { + static $lookup = array( + 0x0001 => 'Video Codec', + 0x0002 => 'Audio Codec', + 0xFFFF => 'Unknown Codec' + ); + + return (isset($lookup[$CodecListType]) ? $lookup[$CodecListType] : 'Invalid Codec Type'); + } + + /** + * @return array + */ + public static function KnownGUIDs() { + static $GUIDarray = array( + 'GETID3_ASF_Extended_Stream_Properties_Object' => '14E6A5CB-C672-4332-8399-A96952065B5A', + 'GETID3_ASF_Padding_Object' => '1806D474-CADF-4509-A4BA-9AABCB96AAE8', + 'GETID3_ASF_Payload_Ext_Syst_Pixel_Aspect_Ratio' => '1B1EE554-F9EA-4BC8-821A-376B74E4C4B8', + 'GETID3_ASF_Script_Command_Object' => '1EFB1A30-0B62-11D0-A39B-00A0C90348F6', + 'GETID3_ASF_No_Error_Correction' => '20FB5700-5B55-11CF-A8FD-00805F5C442B', + 'GETID3_ASF_Content_Branding_Object' => '2211B3FA-BD23-11D2-B4B7-00A0C955FC6E', + 'GETID3_ASF_Content_Encryption_Object' => '2211B3FB-BD23-11D2-B4B7-00A0C955FC6E', + 'GETID3_ASF_Digital_Signature_Object' => '2211B3FC-BD23-11D2-B4B7-00A0C955FC6E', + 'GETID3_ASF_Extended_Content_Encryption_Object' => '298AE614-2622-4C17-B935-DAE07EE9289C', + 'GETID3_ASF_Simple_Index_Object' => '33000890-E5B1-11CF-89F4-00A0C90349CB', + 'GETID3_ASF_Degradable_JPEG_Media' => '35907DE0-E415-11CF-A917-00805F5C442B', + 'GETID3_ASF_Payload_Extension_System_Timecode' => '399595EC-8667-4E2D-8FDB-98814CE76C1E', + 'GETID3_ASF_Binary_Media' => '3AFB65E2-47EF-40F2-AC2C-70A90D71D343', + 'GETID3_ASF_Timecode_Index_Object' => '3CB73FD0-0C4A-4803-953D-EDF7B6228F0C', + 'GETID3_ASF_Metadata_Library_Object' => '44231C94-9498-49D1-A141-1D134E457054', + 'GETID3_ASF_Reserved_3' => '4B1ACBE3-100B-11D0-A39B-00A0C90348F6', + 'GETID3_ASF_Reserved_4' => '4CFEDB20-75F6-11CF-9C0F-00A0C90349CB', + 'GETID3_ASF_Command_Media' => '59DACFC0-59E6-11D0-A3AC-00A0C90348F6', + 'GETID3_ASF_Header_Extension_Object' => '5FBF03B5-A92E-11CF-8EE3-00C00C205365', + 'GETID3_ASF_Media_Object_Index_Parameters_Obj' => '6B203BAD-3F11-4E84-ACA8-D7613DE2CFA7', + 'GETID3_ASF_Header_Object' => '75B22630-668E-11CF-A6D9-00AA0062CE6C', + 'GETID3_ASF_Content_Description_Object' => '75B22633-668E-11CF-A6D9-00AA0062CE6C', + 'GETID3_ASF_Error_Correction_Object' => '75B22635-668E-11CF-A6D9-00AA0062CE6C', + 'GETID3_ASF_Data_Object' => '75B22636-668E-11CF-A6D9-00AA0062CE6C', + 'GETID3_ASF_Web_Stream_Media_Subtype' => '776257D4-C627-41CB-8F81-7AC7FF1C40CC', + 'GETID3_ASF_Stream_Bitrate_Properties_Object' => '7BF875CE-468D-11D1-8D82-006097C9A2B2', + 'GETID3_ASF_Language_List_Object' => '7C4346A9-EFE0-4BFC-B229-393EDE415C85', + 'GETID3_ASF_Codec_List_Object' => '86D15240-311D-11D0-A3A4-00A0C90348F6', + 'GETID3_ASF_Reserved_2' => '86D15241-311D-11D0-A3A4-00A0C90348F6', + 'GETID3_ASF_File_Properties_Object' => '8CABDCA1-A947-11CF-8EE4-00C00C205365', + 'GETID3_ASF_File_Transfer_Media' => '91BD222C-F21C-497A-8B6D-5AA86BFC0185', + 'GETID3_ASF_Old_RTP_Extension_Data' => '96800C63-4C94-11D1-837B-0080C7A37F95', + 'GETID3_ASF_Advanced_Mutual_Exclusion_Object' => 'A08649CF-4775-4670-8A16-6E35357566CD', + 'GETID3_ASF_Bandwidth_Sharing_Object' => 'A69609E6-517B-11D2-B6AF-00C04FD908E9', + 'GETID3_ASF_Reserved_1' => 'ABD3D211-A9BA-11cf-8EE6-00C00C205365', + 'GETID3_ASF_Bandwidth_Sharing_Exclusive' => 'AF6060AA-5197-11D2-B6AF-00C04FD908E9', + 'GETID3_ASF_Bandwidth_Sharing_Partial' => 'AF6060AB-5197-11D2-B6AF-00C04FD908E9', + 'GETID3_ASF_JFIF_Media' => 'B61BE100-5B4E-11CF-A8FD-00805F5C442B', + 'GETID3_ASF_Stream_Properties_Object' => 'B7DC0791-A9B7-11CF-8EE6-00C00C205365', + 'GETID3_ASF_Video_Media' => 'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B', + 'GETID3_ASF_Audio_Spread' => 'BFC3CD50-618F-11CF-8BB2-00AA00B4E220', + 'GETID3_ASF_Metadata_Object' => 'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA', + 'GETID3_ASF_Payload_Ext_Syst_Sample_Duration' => 'C6BD9450-867F-4907-83A3-C77921B733AD', + 'GETID3_ASF_Group_Mutual_Exclusion_Object' => 'D1465A40-5A79-4338-B71B-E36B8FD6C249', + 'GETID3_ASF_Extended_Content_Description_Object' => 'D2D0A440-E307-11D2-97F0-00A0C95EA850', + 'GETID3_ASF_Stream_Prioritization_Object' => 'D4FED15B-88D3-454F-81F0-ED5C45999E24', + 'GETID3_ASF_Payload_Ext_System_Content_Type' => 'D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC', + 'GETID3_ASF_Old_File_Properties_Object' => 'D6E229D0-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_ASF_Header_Object' => 'D6E229D1-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_ASF_Data_Object' => 'D6E229D2-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Index_Object' => 'D6E229D3-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Stream_Properties_Object' => 'D6E229D4-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Content_Description_Object' => 'D6E229D5-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Script_Command_Object' => 'D6E229D6-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Marker_Object' => 'D6E229D7-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Component_Download_Object' => 'D6E229D8-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Stream_Group_Object' => 'D6E229D9-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Scalable_Object' => 'D6E229DA-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Prioritization_Object' => 'D6E229DB-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Bitrate_Mutual_Exclusion_Object' => 'D6E229DC-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Inter_Media_Dependency_Object' => 'D6E229DD-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Rating_Object' => 'D6E229DE-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Index_Parameters_Object' => 'D6E229DF-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Color_Table_Object' => 'D6E229E0-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Language_List_Object' => 'D6E229E1-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Audio_Media' => 'D6E229E2-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Video_Media' => 'D6E229E3-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Image_Media' => 'D6E229E4-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Timecode_Media' => 'D6E229E5-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Text_Media' => 'D6E229E6-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_MIDI_Media' => 'D6E229E7-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Command_Media' => 'D6E229E8-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_No_Error_Concealment' => 'D6E229EA-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Scrambled_Audio' => 'D6E229EB-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_No_Color_Table' => 'D6E229EC-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_SMPTE_Time' => 'D6E229ED-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_ASCII_Text' => 'D6E229EE-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Unicode_Text' => 'D6E229EF-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_HTML_Text' => 'D6E229F0-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_URL_Command' => 'D6E229F1-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Filename_Command' => 'D6E229F2-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_ACM_Codec' => 'D6E229F3-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_VCM_Codec' => 'D6E229F4-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_QuickTime_Codec' => 'D6E229F5-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_DirectShow_Transform_Filter' => 'D6E229F6-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_DirectShow_Rendering_Filter' => 'D6E229F7-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_No_Enhancement' => 'D6E229F8-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Unknown_Enhancement_Type' => 'D6E229F9-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Temporal_Enhancement' => 'D6E229FA-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Spatial_Enhancement' => 'D6E229FB-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Quality_Enhancement' => 'D6E229FC-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Number_of_Channels_Enhancement' => 'D6E229FD-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Frequency_Response_Enhancement' => 'D6E229FE-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Media_Object' => 'D6E229FF-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Mutex_Language' => 'D6E22A00-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Mutex_Bitrate' => 'D6E22A01-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Mutex_Unknown' => 'D6E22A02-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_ASF_Placeholder_Object' => 'D6E22A0E-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Old_Data_Unit_Extension_Object' => 'D6E22A0F-35DA-11D1-9034-00A0C90349BE', + 'GETID3_ASF_Web_Stream_Format' => 'DA1E6B13-8359-4050-B398-388E965BF00C', + 'GETID3_ASF_Payload_Ext_System_File_Name' => 'E165EC0E-19ED-45D7-B4A7-25CBD1E28E9B', + 'GETID3_ASF_Marker_Object' => 'F487CD01-A951-11CF-8EE6-00C00C205365', + 'GETID3_ASF_Timecode_Index_Parameters_Object' => 'F55E496D-9797-4B5D-8C8B-604DFE9BFB24', + 'GETID3_ASF_Audio_Media' => 'F8699E40-5B4D-11CF-A8FD-00805F5C442B', + 'GETID3_ASF_Media_Object_Index_Object' => 'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C', + 'GETID3_ASF_Alt_Extended_Content_Encryption_Obj' => 'FF889EF1-ADEE-40DA-9E71-98704BB928CE', + 'GETID3_ASF_Index_Placeholder_Object' => 'D9AADE20-7C17-4F9C-BC28-8555DD98E2A2', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html + 'GETID3_ASF_Compatibility_Object' => '26F18B5D-4584-47EC-9F5F-0E651F0452C9', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html + ); + return $GUIDarray; + } + + /** + * @param string $GUIDstring + * + * @return string|false + */ + public static function GUIDname($GUIDstring) { + static $GUIDarray = array(); + if (empty($GUIDarray)) { + $GUIDarray = self::KnownGUIDs(); + } + return array_search($GUIDstring, $GUIDarray); + } + + /** + * @param int $id + * + * @return string + */ + public static function ASFIndexObjectIndexTypeLookup($id) { + static $ASFIndexObjectIndexTypeLookup = array(); + if (empty($ASFIndexObjectIndexTypeLookup)) { + $ASFIndexObjectIndexTypeLookup[1] = 'Nearest Past Data Packet'; + $ASFIndexObjectIndexTypeLookup[2] = 'Nearest Past Media Object'; + $ASFIndexObjectIndexTypeLookup[3] = 'Nearest Past Cleanpoint'; + } + return (isset($ASFIndexObjectIndexTypeLookup[$id]) ? $ASFIndexObjectIndexTypeLookup[$id] : 'invalid'); + } + + /** + * @param string $GUIDstring + * + * @return string + */ + public static function GUIDtoBytestring($GUIDstring) { + // Microsoft defines these 16-byte (128-bit) GUIDs in the strangest way: + // first 4 bytes are in little-endian order + // next 2 bytes are appended in little-endian order + // next 2 bytes are appended in little-endian order + // next 2 bytes are appended in big-endian order + // next 6 bytes are appended in big-endian order + + // AaBbCcDd-EeFf-GgHh-IiJj-KkLlMmNnOoPp is stored as this 16-byte string: + // $Dd $Cc $Bb $Aa $Ff $Ee $Hh $Gg $Ii $Jj $Kk $Ll $Mm $Nn $Oo $Pp + + $hexbytecharstring = chr(hexdec(substr($GUIDstring, 6, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 4, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 2, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 0, 2))); + + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 11, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 9, 2))); + + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 16, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 14, 2))); + + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 19, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 21, 2))); + + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 24, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 26, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 28, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 30, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 32, 2))); + $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 34, 2))); + + return $hexbytecharstring; + } + + /** + * @param string $Bytestring + * + * @return string + */ + public static function BytestringToGUID($Bytestring) { + $GUIDstring = str_pad(dechex(ord($Bytestring[3])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[2])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[1])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[0])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= '-'; + $GUIDstring .= str_pad(dechex(ord($Bytestring[5])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[4])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= '-'; + $GUIDstring .= str_pad(dechex(ord($Bytestring[7])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[6])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= '-'; + $GUIDstring .= str_pad(dechex(ord($Bytestring[8])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[9])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= '-'; + $GUIDstring .= str_pad(dechex(ord($Bytestring[10])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[11])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[12])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[13])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[14])), 2, '0', STR_PAD_LEFT); + $GUIDstring .= str_pad(dechex(ord($Bytestring[15])), 2, '0', STR_PAD_LEFT); + + return strtoupper($GUIDstring); + } + + /** + * @param int $FILETIME + * @param bool $round + * + * @return float|int + */ + public static function FILETIMEtoUNIXtime($FILETIME, $round=true) { + // FILETIME is a 64-bit unsigned integer representing + // the number of 100-nanosecond intervals since January 1, 1601 + // UNIX timestamp is number of seconds since January 1, 1970 + // 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days + if ($round) { + return intval(round(($FILETIME - 116444736000000000) / 10000000)); + } + return ($FILETIME - 116444736000000000) / 10000000; + } + + /** + * @param int $WMpictureType + * + * @return string + */ + public static function WMpictureTypeLookup($WMpictureType) { + static $lookup = null; + if ($lookup === null) { + $lookup = array( + 0x03 => 'Front Cover', + 0x04 => 'Back Cover', + 0x00 => 'User Defined', + 0x05 => 'Leaflet Page', + 0x06 => 'Media Label', + 0x07 => 'Lead Artist', + 0x08 => 'Artist', + 0x09 => 'Conductor', + 0x0A => 'Band', + 0x0B => 'Composer', + 0x0C => 'Lyricist', + 0x0D => 'Recording Location', + 0x0E => 'During Recording', + 0x0F => 'During Performance', + 0x10 => 'Video Screen Capture', + 0x12 => 'Illustration', + 0x13 => 'Band Logotype', + 0x14 => 'Publisher Logotype' + ); + $lookup = array_map(function($str) { + return getid3_lib::iconv_fallback('UTF-8', 'UTF-16LE', $str); + }, $lookup); + } + + return (isset($lookup[$WMpictureType]) ? $lookup[$WMpictureType] : ''); + } + + /** + * @param string $asf_header_extension_object_data + * @param int $unhandled_sections + * + * @return array + */ + public function HeaderExtensionObjectDataParse(&$asf_header_extension_object_data, &$unhandled_sections) { + // http://msdn.microsoft.com/en-us/library/bb643323.aspx + + $offset = 0; + $objectOffset = 0; + $HeaderExtensionObjectParsed = array(); + while ($objectOffset < strlen($asf_header_extension_object_data)) { + $offset = $objectOffset; + $thisObject = array(); + + $thisObject['guid'] = substr($asf_header_extension_object_data, $offset, 16); + $offset += 16; + $thisObject['guid_text'] = $this->BytestringToGUID($thisObject['guid']); + $thisObject['guid_name'] = $this->GUIDname($thisObject['guid_text']); + + $thisObject['size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); + $offset += 8; + if ($thisObject['size'] <= 0) { + break; + } + + switch ($thisObject['guid']) { + case GETID3_ASF_Extended_Stream_Properties_Object: + $thisObject['start_time'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); + $offset += 8; + $thisObject['start_time_unix'] = $this->FILETIMEtoUNIXtime($thisObject['start_time']); + + $thisObject['end_time'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); + $offset += 8; + $thisObject['end_time_unix'] = $this->FILETIMEtoUNIXtime($thisObject['end_time']); + + $thisObject['data_bitrate'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $thisObject['buffer_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $thisObject['initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $thisObject['alternate_data_bitrate'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $thisObject['alternate_buffer_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $thisObject['alternate_initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $thisObject['maximum_object_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $thisObject['flags_raw'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + $thisObject['flags']['reliable'] = (bool) $thisObject['flags_raw'] & 0x00000001; + $thisObject['flags']['seekable'] = (bool) $thisObject['flags_raw'] & 0x00000002; + $thisObject['flags']['no_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000004; + $thisObject['flags']['resend_live_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000008; + + $thisObject['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $thisObject['stream_language_id_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $thisObject['average_time_per_frame'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $thisObject['stream_name_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $thisObject['payload_extension_system_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + for ($i = 0; $i < $thisObject['stream_name_count']; $i++) { + $streamName = array(); + + $streamName['language_id_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $streamName['stream_name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $streamName['stream_name'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, $streamName['stream_name_length'])); + $offset += $streamName['stream_name_length']; + + $thisObject['stream_names'][$i] = $streamName; + } + + for ($i = 0; $i < $thisObject['payload_extension_system_count']; $i++) { + $payloadExtensionSystem = array(); + + $payloadExtensionSystem['extension_system_id'] = substr($asf_header_extension_object_data, $offset, 16); + $offset += 16; + $payloadExtensionSystem['extension_system_id_text'] = $this->BytestringToGUID($payloadExtensionSystem['extension_system_id']); + + $payloadExtensionSystem['extension_system_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + if ($payloadExtensionSystem['extension_system_size'] <= 0) { + break 2; + } + + $payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, $payloadExtensionSystem['extension_system_info_length'])); + $offset += $payloadExtensionSystem['extension_system_info_length']; + + $thisObject['payload_extension_systems'][$i] = $payloadExtensionSystem; + } + + break; + + case GETID3_ASF_Padding_Object: + // padding, skip it + break; + + case GETID3_ASF_Metadata_Object: + $thisObject['description_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + for ($i = 0; $i < $thisObject['description_record_counts']; $i++) { + $descriptionRecord = array(); + + $descriptionRecord['reserved_1'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); // must be zero + $offset += 2; + + $descriptionRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $descriptionRecord['name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $descriptionRecord['data_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + $descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']); + + $descriptionRecord['data_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $descriptionRecord['name'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['name_length']); + $offset += $descriptionRecord['name_length']; + + $descriptionRecord['data'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['data_length']); + $offset += $descriptionRecord['data_length']; + switch ($descriptionRecord['data_type']) { + case 0x0000: // Unicode string + break; + + case 0x0001: // BYTE array + // do nothing + break; + + case 0x0002: // BOOL + $descriptionRecord['data'] = (bool) getid3_lib::LittleEndian2Int($descriptionRecord['data']); + break; + + case 0x0003: // DWORD + case 0x0004: // QWORD + case 0x0005: // WORD + $descriptionRecord['data'] = getid3_lib::LittleEndian2Int($descriptionRecord['data']); + break; + + case 0x0006: // GUID + $descriptionRecord['data_text'] = $this->BytestringToGUID($descriptionRecord['data']); + break; + } + + $thisObject['description_record'][$i] = $descriptionRecord; + } + break; + + case GETID3_ASF_Language_List_Object: + $thisObject['language_id_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + for ($i = 0; $i < $thisObject['language_id_record_counts']; $i++) { + $languageIDrecord = array(); + + $languageIDrecord['language_id_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1)); + $offset += 1; + + $languageIDrecord['language_id'] = substr($asf_header_extension_object_data, $offset, $languageIDrecord['language_id_length']); + $offset += $languageIDrecord['language_id_length']; + + $thisObject['language_id_record'][$i] = $languageIDrecord; + } + break; + + case GETID3_ASF_Metadata_Library_Object: + $thisObject['description_records_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + for ($i = 0; $i < $thisObject['description_records_count']; $i++) { + $descriptionRecord = array(); + + $descriptionRecord['language_list_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $descriptionRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $descriptionRecord['name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + + $descriptionRecord['data_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); + $offset += 2; + $descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']); + + $descriptionRecord['data_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); + $offset += 4; + + $descriptionRecord['name'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['name_length']); + $offset += $descriptionRecord['name_length']; + + $descriptionRecord['data'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['data_length']); + $offset += $descriptionRecord['data_length']; + + if (preg_match('#^WM/Picture$#', str_replace("\x00", '', trim($descriptionRecord['name'])))) { + $WMpicture = $this->ASF_WMpicture($descriptionRecord['data']); + foreach ($WMpicture as $key => $value) { + $descriptionRecord['data'] = $WMpicture; + } + unset($WMpicture); + } + + $thisObject['description_record'][$i] = $descriptionRecord; + } + break; + + default: + $unhandled_sections++; + if ($this->GUIDname($thisObject['guid_text'])) { + $this->warning('unhandled Header Extension Object GUID "'.$this->GUIDname($thisObject['guid_text']).'" {'.$thisObject['guid_text'].'} at offset '.($offset - 16 - 8)); + } else { + $this->warning('unknown Header Extension Object GUID {'.$thisObject['guid_text'].'} in at offset '.($offset - 16 - 8)); + } + break; + } + $HeaderExtensionObjectParsed[] = $thisObject; + + $objectOffset += $thisObject['size']; + } + return $HeaderExtensionObjectParsed; + } + + /** + * @param int $id + * + * @return string + */ + public static function metadataLibraryObjectDataTypeLookup($id) { + static $lookup = array( + 0x0000 => 'Unicode string', // The data consists of a sequence of Unicode characters + 0x0001 => 'BYTE array', // The type of the data is implementation-specific + 0x0002 => 'BOOL', // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer. Only 0x0000 or 0x0001 are permitted values + 0x0003 => 'DWORD', // The data is 4 bytes long and should be interpreted as a 32-bit unsigned integer + 0x0004 => 'QWORD', // The data is 8 bytes long and should be interpreted as a 64-bit unsigned integer + 0x0005 => 'WORD', // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer + 0x0006 => 'GUID', // The data is 16 bytes long and should be interpreted as a 128-bit GUID + ); + return (isset($lookup[$id]) ? $lookup[$id] : 'invalid'); + } + + /** + * @param string $data + * + * @return array + */ + public function ASF_WMpicture(&$data) { + //typedef struct _WMPicture{ + // LPWSTR pwszMIMEType; + // BYTE bPictureType; + // LPWSTR pwszDescription; + // DWORD dwDataLen; + // BYTE* pbData; + //} WM_PICTURE; + + $WMpicture = array(); + + $offset = 0; + $WMpicture['image_type_id'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 1)); + $offset += 1; + $WMpicture['image_type'] = self::WMpictureTypeLookup($WMpicture['image_type_id']); + $WMpicture['image_size'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 4)); + $offset += 4; + + $WMpicture['image_mime'] = ''; + do { + $next_byte_pair = substr($data, $offset, 2); + $offset += 2; + $WMpicture['image_mime'] .= $next_byte_pair; + } while ($next_byte_pair !== "\x00\x00"); + + $WMpicture['image_description'] = ''; + do { + $next_byte_pair = substr($data, $offset, 2); + $offset += 2; + $WMpicture['image_description'] .= $next_byte_pair; + } while ($next_byte_pair !== "\x00\x00"); + + $WMpicture['dataoffset'] = $offset; + $WMpicture['data'] = substr($data, $offset); + + $imageinfo = array(); + $WMpicture['image_mime'] = ''; + $imagechunkcheck = getid3_lib::GetDataImageSize($WMpicture['data'], $imageinfo); + unset($imageinfo); + if (!empty($imagechunkcheck)) { + $WMpicture['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); + } + if (!isset($this->getid3->info['asf']['comments']['picture'])) { + $this->getid3->info['asf']['comments']['picture'] = array(); + } + $this->getid3->info['asf']['comments']['picture'][] = array('data'=>$WMpicture['data'], 'image_mime'=>$WMpicture['image_mime']); + + return $WMpicture; + } + + /** + * Remove terminator 00 00 and convert UTF-16LE to Latin-1. + * + * @param string $string + * + * @return string + */ + public static function TrimConvert($string) { + return trim(getid3_lib::iconv_fallback('UTF-16LE', 'ISO-8859-1', self::TrimTerm($string)), ' '); + } + + /** + * Remove terminator 00 00. + * + * @param string $string + * + * @return string + */ + public static function TrimTerm($string) { + // remove terminator, only if present (it should be, but...) + if (substr($string, -2) === "\x00\x00") { + $string = substr($string, 0, -2); + } + return $string; + } + +} diff --git a/wp-includes/ID3/module.audio-video.flv.php b/wp-includes/ID3/module.audio-video.flv.php new file mode 100644 index 0000000..eb292c6 --- /dev/null +++ b/wp-includes/ID3/module.audio-video.flv.php @@ -0,0 +1,906 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.flv.php // +// module for analyzing Shockwave Flash Video files // +// dependencies: NONE // +// // +///////////////////////////////////////////////////////////////// +// // +// FLV module by Seth Kaufman // +// // +// * version 0.1 (26 June 2005) // +// // +// * version 0.1.1 (15 July 2005) // +// minor modifications by James Heinrich // +// // +// * version 0.2 (22 February 2006) // +// Support for On2 VP6 codec and meta information // +// by Steve Webster // +// // +// * version 0.3 (15 June 2006) // +// Modified to not read entire file into memory // +// by James Heinrich // +// // +// * version 0.4 (07 December 2007) // +// Bugfixes for incorrectly parsed FLV dimensions // +// and incorrect parsing of onMetaTag // +// by Evgeny Moysevich // +// // +// * version 0.5 (21 May 2009) // +// Fixed parsing of audio tags and added additional codec // +// details. The duration is now read from onMetaTag (if // +// exists), rather than parsing whole file // +// by Nigel Barnes // +// // +// * version 0.6 (24 May 2009) // +// Better parsing of files with h264 video // +// by Evgeny Moysevich // +// // +// * version 0.6.1 (30 May 2011) // +// prevent infinite loops in expGolombUe() // +// // +// * version 0.7.0 (16 Jul 2013) // +// handle GETID3_FLV_VIDEO_VP6FLV_ALPHA // +// improved AVCSequenceParameterSetReader::readData() // +// by Xander Schouwerwou // +// /// +///////////////////////////////////////////////////////////////// + +define('GETID3_FLV_TAG_AUDIO', 8); +define('GETID3_FLV_TAG_VIDEO', 9); +define('GETID3_FLV_TAG_META', 18); + +define('GETID3_FLV_VIDEO_H263', 2); +define('GETID3_FLV_VIDEO_SCREEN', 3); +define('GETID3_FLV_VIDEO_VP6FLV', 4); +define('GETID3_FLV_VIDEO_VP6FLV_ALPHA', 5); +define('GETID3_FLV_VIDEO_SCREENV2', 6); +define('GETID3_FLV_VIDEO_H264', 7); + +define('H264_AVC_SEQUENCE_HEADER', 0); +define('H264_PROFILE_BASELINE', 66); +define('H264_PROFILE_MAIN', 77); +define('H264_PROFILE_EXTENDED', 88); +define('H264_PROFILE_HIGH', 100); +define('H264_PROFILE_HIGH10', 110); +define('H264_PROFILE_HIGH422', 122); +define('H264_PROFILE_HIGH444', 144); +define('H264_PROFILE_HIGH444_PREDICTIVE', 244); + +class getid3_flv extends getid3_handler +{ + const magic = 'FLV'; + + /** + * Break out of the loop if too many frames have been scanned; only scan this + * many if meta frame does not contain useful duration. + * + * @var int + */ + public $max_frames = 100000; + + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + $this->fseek($info['avdataoffset']); + + $FLVdataLength = $info['avdataend'] - $info['avdataoffset']; + $FLVheader = $this->fread(5); + + $info['fileformat'] = 'flv'; + $info['flv']['header']['signature'] = substr($FLVheader, 0, 3); + $info['flv']['header']['version'] = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1)); + $TypeFlags = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1)); + + if ($info['flv']['header']['signature'] != self::magic) { + $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::magic).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($info['flv']['header']['signature']).'"'); + unset($info['flv'], $info['fileformat']); + return false; + } + + $info['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04); + $info['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01); + + $FrameSizeDataLength = getid3_lib::BigEndian2Int($this->fread(4)); + $FLVheaderFrameLength = 9; + if ($FrameSizeDataLength > $FLVheaderFrameLength) { + $this->fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR); + } + $Duration = 0; + $found_video = false; + $found_audio = false; + $found_meta = false; + $found_valid_meta_playtime = false; + $tagParseCount = 0; + $info['flv']['framecount'] = array('total'=>0, 'audio'=>0, 'video'=>0); + $flv_framecount = &$info['flv']['framecount']; + while ((($this->ftell() + 16) < $info['avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime)) { + $ThisTagHeader = $this->fread(16); + + $PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 0, 4)); + $TagType = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 4, 1)); + $DataLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 5, 3)); + $Timestamp = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 8, 3)); + $LastHeaderByte = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1)); + $NextOffset = $this->ftell() - 1 + $DataLength; + if ($Timestamp > $Duration) { + $Duration = $Timestamp; + } + + $flv_framecount['total']++; + switch ($TagType) { + case GETID3_FLV_TAG_AUDIO: + $flv_framecount['audio']++; + if (!$found_audio) { + $found_audio = true; + $info['flv']['audio']['audioFormat'] = ($LastHeaderByte >> 4) & 0x0F; + $info['flv']['audio']['audioRate'] = ($LastHeaderByte >> 2) & 0x03; + $info['flv']['audio']['audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01; + $info['flv']['audio']['audioType'] = $LastHeaderByte & 0x01; + } + break; + + case GETID3_FLV_TAG_VIDEO: + $flv_framecount['video']++; + if (!$found_video) { + $found_video = true; + $info['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07; + + $FLVvideoHeader = $this->fread(11); + + if ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H264) { + // this code block contributed by: moysevichØgmail*com + + $AVCPacketType = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 0, 1)); + if ($AVCPacketType == H264_AVC_SEQUENCE_HEADER) { + // read AVCDecoderConfigurationRecord + $configurationVersion = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 1)); + $AVCProfileIndication = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 1)); + $profile_compatibility = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 1)); + $lengthSizeMinusOne = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 1)); + $numOfSequenceParameterSets = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 8, 1)); + + if (($numOfSequenceParameterSets & 0x1F) != 0) { + // there is at least one SequenceParameterSet + // read size of the first SequenceParameterSet + //$spsSize = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 9, 2)); + $spsSize = getid3_lib::LittleEndian2Int(substr($FLVvideoHeader, 9, 2)); + // read the first SequenceParameterSet + $sps = $this->fread($spsSize); + if (strlen($sps) == $spsSize) { // make sure that whole SequenceParameterSet was red + $spsReader = new AVCSequenceParameterSetReader($sps); + $spsReader->readData(); + $info['video']['resolution_x'] = $spsReader->getWidth(); + $info['video']['resolution_y'] = $spsReader->getHeight(); + } + } + } + // end: moysevichØgmail*com + + } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H263) { + + $PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7; + $PictureSizeType = $PictureSizeType & 0x0007; + $info['flv']['header']['videoSizeType'] = $PictureSizeType; + switch ($PictureSizeType) { + case 0: + //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)); + //$PictureSizeEnc <<= 1; + //$info['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8; + //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2)); + //$PictureSizeEnc <<= 1; + //$info['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8; + + $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 2)) >> 7; + $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)) >> 7; + $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFF; + $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFF; + break; + + case 1: + $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 3)) >> 7; + $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 3)) >> 7; + $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFFFF; + $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFFFF; + break; + + case 2: + $info['video']['resolution_x'] = 352; + $info['video']['resolution_y'] = 288; + break; + + case 3: + $info['video']['resolution_x'] = 176; + $info['video']['resolution_y'] = 144; + break; + + case 4: + $info['video']['resolution_x'] = 128; + $info['video']['resolution_y'] = 96; + break; + + case 5: + $info['video']['resolution_x'] = 320; + $info['video']['resolution_y'] = 240; + break; + + case 6: + $info['video']['resolution_x'] = 160; + $info['video']['resolution_y'] = 120; + break; + + default: + $info['video']['resolution_x'] = 0; + $info['video']['resolution_y'] = 0; + break; + + } + + } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_VP6FLV_ALPHA) { + + /* contributed by schouwerwouØgmail*com */ + if (!isset($info['video']['resolution_x'])) { // only when meta data isn't set + $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2)); + $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 2)); + $info['video']['resolution_x'] = ($PictureSizeEnc['x'] & 0xFF) << 3; + $info['video']['resolution_y'] = ($PictureSizeEnc['y'] & 0xFF) << 3; + } + /* end schouwerwouØgmail*com */ + + } + if (!empty($info['video']['resolution_x']) && !empty($info['video']['resolution_y'])) { + $info['video']['pixel_aspect_ratio'] = $info['video']['resolution_x'] / $info['video']['resolution_y']; + } + } + break; + + // Meta tag + case GETID3_FLV_TAG_META: + if (!$found_meta) { + $found_meta = true; + $this->fseek(-1, SEEK_CUR); + $datachunk = $this->fread($DataLength); + $AMFstream = new AMFStream($datachunk); + $reader = new AMFReader($AMFstream); + $eventName = $reader->readData(); + $info['flv']['meta'][$eventName] = $reader->readData(); + unset($reader); + + $copykeys = array('framerate'=>'frame_rate', 'width'=>'resolution_x', 'height'=>'resolution_y', 'audiodatarate'=>'bitrate', 'videodatarate'=>'bitrate'); + foreach ($copykeys as $sourcekey => $destkey) { + if (isset($info['flv']['meta']['onMetaData'][$sourcekey])) { + switch ($sourcekey) { + case 'width': + case 'height': + $info['video'][$destkey] = intval(round($info['flv']['meta']['onMetaData'][$sourcekey])); + break; + case 'audiodatarate': + $info['audio'][$destkey] = getid3_lib::CastAsInt(round($info['flv']['meta']['onMetaData'][$sourcekey] * 1000)); + break; + case 'videodatarate': + case 'frame_rate': + default: + $info['video'][$destkey] = $info['flv']['meta']['onMetaData'][$sourcekey]; + break; + } + } + } + if (!empty($info['flv']['meta']['onMetaData']['duration'])) { + $found_valid_meta_playtime = true; + } + } + break; + + default: + // noop + break; + } + $this->fseek($NextOffset); + } + + $info['playtime_seconds'] = $Duration / 1000; + if ($info['playtime_seconds'] > 0) { + $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; + } + + if ($info['flv']['header']['hasAudio']) { + $info['audio']['codec'] = self::audioFormatLookup($info['flv']['audio']['audioFormat']); + $info['audio']['sample_rate'] = self::audioRateLookup($info['flv']['audio']['audioRate']); + $info['audio']['bits_per_sample'] = self::audioBitDepthLookup($info['flv']['audio']['audioSampleSize']); + + $info['audio']['channels'] = $info['flv']['audio']['audioType'] + 1; // 0=mono,1=stereo + $info['audio']['lossless'] = ($info['flv']['audio']['audioFormat'] ? false : true); // 0=uncompressed + $info['audio']['dataformat'] = 'flv'; + } + if (!empty($info['flv']['header']['hasVideo'])) { + $info['video']['codec'] = self::videoCodecLookup($info['flv']['video']['videoCodec']); + $info['video']['dataformat'] = 'flv'; + $info['video']['lossless'] = false; + } + + // Set information from meta + if (!empty($info['flv']['meta']['onMetaData']['duration'])) { + $info['playtime_seconds'] = $info['flv']['meta']['onMetaData']['duration']; + $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; + } + if (isset($info['flv']['meta']['onMetaData']['audiocodecid'])) { + $info['audio']['codec'] = self::audioFormatLookup($info['flv']['meta']['onMetaData']['audiocodecid']); + } + if (isset($info['flv']['meta']['onMetaData']['videocodecid'])) { + $info['video']['codec'] = self::videoCodecLookup($info['flv']['meta']['onMetaData']['videocodecid']); + } + return true; + } + + /** + * @param int $id + * + * @return string|false + */ + public static function audioFormatLookup($id) { + static $lookup = array( + 0 => 'Linear PCM, platform endian', + 1 => 'ADPCM', + 2 => 'mp3', + 3 => 'Linear PCM, little endian', + 4 => 'Nellymoser 16kHz mono', + 5 => 'Nellymoser 8kHz mono', + 6 => 'Nellymoser', + 7 => 'G.711A-law logarithmic PCM', + 8 => 'G.711 mu-law logarithmic PCM', + 9 => 'reserved', + 10 => 'AAC', + 11 => 'Speex', + 12 => false, // unknown? + 13 => false, // unknown? + 14 => 'mp3 8kHz', + 15 => 'Device-specific sound', + ); + return (isset($lookup[$id]) ? $lookup[$id] : false); + } + + /** + * @param int $id + * + * @return int|false + */ + public static function audioRateLookup($id) { + static $lookup = array( + 0 => 5500, + 1 => 11025, + 2 => 22050, + 3 => 44100, + ); + return (isset($lookup[$id]) ? $lookup[$id] : false); + } + + /** + * @param int $id + * + * @return int|false + */ + public static function audioBitDepthLookup($id) { + static $lookup = array( + 0 => 8, + 1 => 16, + ); + return (isset($lookup[$id]) ? $lookup[$id] : false); + } + + /** + * @param int $id + * + * @return string|false + */ + public static function videoCodecLookup($id) { + static $lookup = array( + GETID3_FLV_VIDEO_H263 => 'Sorenson H.263', + GETID3_FLV_VIDEO_SCREEN => 'Screen video', + GETID3_FLV_VIDEO_VP6FLV => 'On2 VP6', + GETID3_FLV_VIDEO_VP6FLV_ALPHA => 'On2 VP6 with alpha channel', + GETID3_FLV_VIDEO_SCREENV2 => 'Screen video v2', + GETID3_FLV_VIDEO_H264 => 'Sorenson H.264', + ); + return (isset($lookup[$id]) ? $lookup[$id] : false); + } +} + +class AMFStream +{ + /** + * @var string + */ + public $bytes; + + /** + * @var int + */ + public $pos; + + /** + * @param string $bytes + */ + public function __construct(&$bytes) { + $this->bytes =& $bytes; + $this->pos = 0; + } + + /** + * @return int + */ + public function readByte() { // 8-bit + return ord(substr($this->bytes, $this->pos++, 1)); + } + + /** + * @return int + */ + public function readInt() { // 16-bit + return ($this->readByte() << 8) + $this->readByte(); + } + + /** + * @return int + */ + public function readLong() { // 32-bit + return ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte(); + } + + /** + * @return float|false + */ + public function readDouble() { + return getid3_lib::BigEndian2Float($this->read(8)); + } + + /** + * @return string + */ + public function readUTF() { + $length = $this->readInt(); + return $this->read($length); + } + + /** + * @return string + */ + public function readLongUTF() { + $length = $this->readLong(); + return $this->read($length); + } + + /** + * @param int $length + * + * @return string + */ + public function read($length) { + $val = substr($this->bytes, $this->pos, $length); + $this->pos += $length; + return $val; + } + + /** + * @return int + */ + public function peekByte() { + $pos = $this->pos; + $val = $this->readByte(); + $this->pos = $pos; + return $val; + } + + /** + * @return int + */ + public function peekInt() { + $pos = $this->pos; + $val = $this->readInt(); + $this->pos = $pos; + return $val; + } + + /** + * @return int + */ + public function peekLong() { + $pos = $this->pos; + $val = $this->readLong(); + $this->pos = $pos; + return $val; + } + + /** + * @return float|false + */ + public function peekDouble() { + $pos = $this->pos; + $val = $this->readDouble(); + $this->pos = $pos; + return $val; + } + + /** + * @return string + */ + public function peekUTF() { + $pos = $this->pos; + $val = $this->readUTF(); + $this->pos = $pos; + return $val; + } + + /** + * @return string + */ + public function peekLongUTF() { + $pos = $this->pos; + $val = $this->readLongUTF(); + $this->pos = $pos; + return $val; + } +} + +class AMFReader +{ + /** + * @var AMFStream + */ + public $stream; + + /** + * @param AMFStream $stream + */ + public function __construct(AMFStream $stream) { + $this->stream = $stream; + } + + /** + * @return mixed + */ + public function readData() { + $value = null; + + $type = $this->stream->readByte(); + switch ($type) { + + // Double + case 0: + $value = $this->readDouble(); + break; + + // Boolean + case 1: + $value = $this->readBoolean(); + break; + + // String + case 2: + $value = $this->readString(); + break; + + // Object + case 3: + $value = $this->readObject(); + break; + + // null + case 6: + return null; + break; + + // Mixed array + case 8: + $value = $this->readMixedArray(); + break; + + // Array + case 10: + $value = $this->readArray(); + break; + + // Date + case 11: + $value = $this->readDate(); + break; + + // Long string + case 13: + $value = $this->readLongString(); + break; + + // XML (handled as string) + case 15: + $value = $this->readXML(); + break; + + // Typed object (handled as object) + case 16: + $value = $this->readTypedObject(); + break; + + // Long string + default: + $value = '(unknown or unsupported data type)'; + break; + } + + return $value; + } + + /** + * @return float|false + */ + public function readDouble() { + return $this->stream->readDouble(); + } + + /** + * @return bool + */ + public function readBoolean() { + return $this->stream->readByte() == 1; + } + + /** + * @return string + */ + public function readString() { + return $this->stream->readUTF(); + } + + /** + * @return array + */ + public function readObject() { + // Get highest numerical index - ignored +// $highestIndex = $this->stream->readLong(); + + $data = array(); + $key = null; + + while ($key = $this->stream->readUTF()) { + $data[$key] = $this->readData(); + } + // Mixed array record ends with empty string (0x00 0x00) and 0x09 + if (($key == '') && ($this->stream->peekByte() == 0x09)) { + // Consume byte + $this->stream->readByte(); + } + return $data; + } + + /** + * @return array + */ + public function readMixedArray() { + // Get highest numerical index - ignored + $highestIndex = $this->stream->readLong(); + + $data = array(); + $key = null; + + while ($key = $this->stream->readUTF()) { + if (is_numeric($key)) { + $key = (int) $key; + } + $data[$key] = $this->readData(); + } + // Mixed array record ends with empty string (0x00 0x00) and 0x09 + if (($key == '') && ($this->stream->peekByte() == 0x09)) { + // Consume byte + $this->stream->readByte(); + } + + return $data; + } + + /** + * @return array + */ + public function readArray() { + $length = $this->stream->readLong(); + $data = array(); + + for ($i = 0; $i < $length; $i++) { + $data[] = $this->readData(); + } + return $data; + } + + /** + * @return float|false + */ + public function readDate() { + $timestamp = $this->stream->readDouble(); + $timezone = $this->stream->readInt(); + return $timestamp; + } + + /** + * @return string + */ + public function readLongString() { + return $this->stream->readLongUTF(); + } + + /** + * @return string + */ + public function readXML() { + return $this->stream->readLongUTF(); + } + + /** + * @return array + */ + public function readTypedObject() { + $className = $this->stream->readUTF(); + return $this->readObject(); + } +} + +class AVCSequenceParameterSetReader +{ + /** + * @var string + */ + public $sps; + public $start = 0; + public $currentBytes = 0; + public $currentBits = 0; + + /** + * @var int + */ + public $width; + + /** + * @var int + */ + public $height; + + /** + * @param string $sps + */ + public function __construct($sps) { + $this->sps = $sps; + } + + public function readData() { + $this->skipBits(8); + $this->skipBits(8); + $profile = $this->getBits(8); // read profile + if ($profile > 0) { + $this->skipBits(8); + $level_idc = $this->getBits(8); // level_idc + $this->expGolombUe(); // seq_parameter_set_id // sps + $this->expGolombUe(); // log2_max_frame_num_minus4 + $picOrderType = $this->expGolombUe(); // pic_order_cnt_type + if ($picOrderType == 0) { + $this->expGolombUe(); // log2_max_pic_order_cnt_lsb_minus4 + } elseif ($picOrderType == 1) { + $this->skipBits(1); // delta_pic_order_always_zero_flag + $this->expGolombSe(); // offset_for_non_ref_pic + $this->expGolombSe(); // offset_for_top_to_bottom_field + $num_ref_frames_in_pic_order_cnt_cycle = $this->expGolombUe(); // num_ref_frames_in_pic_order_cnt_cycle + for ($i = 0; $i < $num_ref_frames_in_pic_order_cnt_cycle; $i++) { + $this->expGolombSe(); // offset_for_ref_frame[ i ] + } + } + $this->expGolombUe(); // num_ref_frames + $this->skipBits(1); // gaps_in_frame_num_value_allowed_flag + $pic_width_in_mbs_minus1 = $this->expGolombUe(); // pic_width_in_mbs_minus1 + $pic_height_in_map_units_minus1 = $this->expGolombUe(); // pic_height_in_map_units_minus1 + + $frame_mbs_only_flag = $this->getBits(1); // frame_mbs_only_flag + if ($frame_mbs_only_flag == 0) { + $this->skipBits(1); // mb_adaptive_frame_field_flag + } + $this->skipBits(1); // direct_8x8_inference_flag + $frame_cropping_flag = $this->getBits(1); // frame_cropping_flag + + $frame_crop_left_offset = 0; + $frame_crop_right_offset = 0; + $frame_crop_top_offset = 0; + $frame_crop_bottom_offset = 0; + + if ($frame_cropping_flag) { + $frame_crop_left_offset = $this->expGolombUe(); // frame_crop_left_offset + $frame_crop_right_offset = $this->expGolombUe(); // frame_crop_right_offset + $frame_crop_top_offset = $this->expGolombUe(); // frame_crop_top_offset + $frame_crop_bottom_offset = $this->expGolombUe(); // frame_crop_bottom_offset + } + $this->skipBits(1); // vui_parameters_present_flag + // etc + + $this->width = (($pic_width_in_mbs_minus1 + 1) * 16) - ($frame_crop_left_offset * 2) - ($frame_crop_right_offset * 2); + $this->height = ((2 - $frame_mbs_only_flag) * ($pic_height_in_map_units_minus1 + 1) * 16) - ($frame_crop_top_offset * 2) - ($frame_crop_bottom_offset * 2); + } + } + + /** + * @param int $bits + */ + public function skipBits($bits) { + $newBits = $this->currentBits + $bits; + $this->currentBytes += (int)floor($newBits / 8); + $this->currentBits = $newBits % 8; + } + + /** + * @return int + */ + public function getBit() { + $result = (getid3_lib::BigEndian2Int(substr($this->sps, $this->currentBytes, 1)) >> (7 - $this->currentBits)) & 0x01; + $this->skipBits(1); + return $result; + } + + /** + * @param int $bits + * + * @return int + */ + public function getBits($bits) { + $result = 0; + for ($i = 0; $i < $bits; $i++) { + $result = ($result << 1) + $this->getBit(); + } + return $result; + } + + /** + * @return int + */ + public function expGolombUe() { + $significantBits = 0; + $bit = $this->getBit(); + while ($bit == 0) { + $significantBits++; + $bit = $this->getBit(); + + if ($significantBits > 31) { + // something is broken, this is an emergency escape to prevent infinite loops + return 0; + } + } + return (1 << $significantBits) + $this->getBits($significantBits) - 1; + } + + /** + * @return int + */ + public function expGolombSe() { + $result = $this->expGolombUe(); + if (($result & 0x01) == 0) { + return -($result >> 1); + } else { + return ($result + 1) >> 1; + } + } + + /** + * @return int + */ + public function getWidth() { + return $this->width; + } + + /** + * @return int + */ + public function getHeight() { + return $this->height; + } +} diff --git a/wp-includes/ID3/module.audio-video.matroska.php b/wp-includes/ID3/module.audio-video.matroska.php new file mode 100644 index 0000000..5999066 --- /dev/null +++ b/wp-includes/ID3/module.audio-video.matroska.php @@ -0,0 +1,1893 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.matriska.php // +// module for analyzing Matroska containers // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +define('EBML_ID_CHAPTERS', 0x0043A770); // [10][43][A7][70] -- A system to define basic menus and partition data. For more detailed information, look at the Chapters Explanation. +define('EBML_ID_SEEKHEAD', 0x014D9B74); // [11][4D][9B][74] -- Contains the position of other level 1 elements. +define('EBML_ID_TAGS', 0x0254C367); // [12][54][C3][67] -- Element containing elements specific to Tracks/Chapters. A list of valid tags can be found . +define('EBML_ID_INFO', 0x0549A966); // [15][49][A9][66] -- Contains miscellaneous general information and statistics on the file. +define('EBML_ID_TRACKS', 0x0654AE6B); // [16][54][AE][6B] -- A top-level block of information with many tracks described. +define('EBML_ID_SEGMENT', 0x08538067); // [18][53][80][67] -- This element contains all other top-level (level 1) elements. Typically a Matroska file is composed of 1 segment. +define('EBML_ID_ATTACHMENTS', 0x0941A469); // [19][41][A4][69] -- Contain attached files. +define('EBML_ID_EBML', 0x0A45DFA3); // [1A][45][DF][A3] -- Set the EBML characteristics of the data to follow. Each EBML document has to start with this. +define('EBML_ID_CUES', 0x0C53BB6B); // [1C][53][BB][6B] -- A top-level element to speed seeking access. All entries are local to the segment. +define('EBML_ID_CLUSTER', 0x0F43B675); // [1F][43][B6][75] -- The lower level element containing the (monolithic) Block structure. +define('EBML_ID_LANGUAGE', 0x02B59C); // [22][B5][9C] -- Specifies the language of the track in the Matroska languages form. +define('EBML_ID_TRACKTIMECODESCALE', 0x03314F); // [23][31][4F] -- The scale to apply on this track to work at normal speed in relation with other tracks (mostly used to adjust video speed when the audio length differs). +define('EBML_ID_DEFAULTDURATION', 0x03E383); // [23][E3][83] -- Number of nanoseconds (i.e. not scaled) per frame. +define('EBML_ID_CODECNAME', 0x058688); // [25][86][88] -- A human-readable string specifying the codec. +define('EBML_ID_CODECDOWNLOADURL', 0x06B240); // [26][B2][40] -- A URL to download about the codec used. +define('EBML_ID_TIMECODESCALE', 0x0AD7B1); // [2A][D7][B1] -- Timecode scale in nanoseconds (1.000.000 means all timecodes in the segment are expressed in milliseconds). +define('EBML_ID_COLOURSPACE', 0x0EB524); // [2E][B5][24] -- Same value as in AVI (32 bits). +define('EBML_ID_GAMMAVALUE', 0x0FB523); // [2F][B5][23] -- Gamma Value. +define('EBML_ID_CODECSETTINGS', 0x1A9697); // [3A][96][97] -- A string describing the encoding setting used. +define('EBML_ID_CODECINFOURL', 0x1B4040); // [3B][40][40] -- A URL to find information about the codec used. +define('EBML_ID_PREVFILENAME', 0x1C83AB); // [3C][83][AB] -- An escaped filename corresponding to the previous segment. +define('EBML_ID_PREVUID', 0x1CB923); // [3C][B9][23] -- A unique ID to identify the previous chained segment (128 bits). +define('EBML_ID_NEXTFILENAME', 0x1E83BB); // [3E][83][BB] -- An escaped filename corresponding to the next segment. +define('EBML_ID_NEXTUID', 0x1EB923); // [3E][B9][23] -- A unique ID to identify the next chained segment (128 bits). +define('EBML_ID_CONTENTCOMPALGO', 0x0254); // [42][54] -- The compression algorithm used. Algorithms that have been specified so far are: +define('EBML_ID_CONTENTCOMPSETTINGS', 0x0255); // [42][55] -- Settings that might be needed by the decompressor. For Header Stripping (ContentCompAlgo=3), the bytes that were removed from the beggining of each frames of the track. +define('EBML_ID_DOCTYPE', 0x0282); // [42][82] -- A string that describes the type of document that follows this EBML header ('matroska' in our case). +define('EBML_ID_DOCTYPEREADVERSION', 0x0285); // [42][85] -- The minimum DocType version an interpreter has to support to read this file. +define('EBML_ID_EBMLVERSION', 0x0286); // [42][86] -- The version of EBML parser used to create the file. +define('EBML_ID_DOCTYPEVERSION', 0x0287); // [42][87] -- The version of DocType interpreter used to create the file. +define('EBML_ID_EBMLMAXIDLENGTH', 0x02F2); // [42][F2] -- The maximum length of the IDs you'll find in this file (4 or less in Matroska). +define('EBML_ID_EBMLMAXSIZELENGTH', 0x02F3); // [42][F3] -- The maximum length of the sizes you'll find in this file (8 or less in Matroska). This does not override the element size indicated at the beginning of an element. Elements that have an indicated size which is larger than what is allowed by EBMLMaxSizeLength shall be considered invalid. +define('EBML_ID_EBMLREADVERSION', 0x02F7); // [42][F7] -- The minimum EBML version a parser has to support to read this file. +define('EBML_ID_CHAPLANGUAGE', 0x037C); // [43][7C] -- The languages corresponding to the string, in the bibliographic ISO-639-2 form. +define('EBML_ID_CHAPCOUNTRY', 0x037E); // [43][7E] -- The countries corresponding to the string, same 2 octets as in Internet domains. +define('EBML_ID_SEGMENTFAMILY', 0x0444); // [44][44] -- A randomly generated unique ID that all segments related to each other must use (128 bits). +define('EBML_ID_DATEUTC', 0x0461); // [44][61] -- Date of the origin of timecode (value 0), i.e. production date. +define('EBML_ID_TAGLANGUAGE', 0x047A); // [44][7A] -- Specifies the language of the tag specified, in the Matroska languages form. +define('EBML_ID_TAGDEFAULT', 0x0484); // [44][84] -- Indication to know if this is the default/original language to use for the given tag. +define('EBML_ID_TAGBINARY', 0x0485); // [44][85] -- The values of the Tag if it is binary. Note that this cannot be used in the same SimpleTag as TagString. +define('EBML_ID_TAGSTRING', 0x0487); // [44][87] -- The value of the Tag. +define('EBML_ID_DURATION', 0x0489); // [44][89] -- Duration of the segment (based on TimecodeScale). +define('EBML_ID_CHAPPROCESSPRIVATE', 0x050D); // [45][0D] -- Some optional data attached to the ChapProcessCodecID information. For ChapProcessCodecID = 1, it is the "DVD level" equivalent. +define('EBML_ID_CHAPTERFLAGENABLED', 0x0598); // [45][98] -- Specify wether the chapter is enabled. It can be enabled/disabled by a Control Track. When disabled, the movie should skip all the content between the TimeStart and TimeEnd of this chapter. +define('EBML_ID_TAGNAME', 0x05A3); // [45][A3] -- The name of the Tag that is going to be stored. +define('EBML_ID_EDITIONENTRY', 0x05B9); // [45][B9] -- Contains all information about a segment edition. +define('EBML_ID_EDITIONUID', 0x05BC); // [45][BC] -- A unique ID to identify the edition. It's useful for tagging an edition. +define('EBML_ID_EDITIONFLAGHIDDEN', 0x05BD); // [45][BD] -- If an edition is hidden (1), it should not be available to the user interface (but still to Control Tracks). +define('EBML_ID_EDITIONFLAGDEFAULT', 0x05DB); // [45][DB] -- If a flag is set (1) the edition should be used as the default one. +define('EBML_ID_EDITIONFLAGORDERED', 0x05DD); // [45][DD] -- Specify if the chapters can be defined multiple times and the order to play them is enforced. +define('EBML_ID_FILEDATA', 0x065C); // [46][5C] -- The data of the file. +define('EBML_ID_FILEMIMETYPE', 0x0660); // [46][60] -- MIME type of the file. +define('EBML_ID_FILENAME', 0x066E); // [46][6E] -- Filename of the attached file. +define('EBML_ID_FILEREFERRAL', 0x0675); // [46][75] -- A binary value that a track/codec can refer to when the attachment is needed. +define('EBML_ID_FILEDESCRIPTION', 0x067E); // [46][7E] -- A human-friendly name for the attached file. +define('EBML_ID_FILEUID', 0x06AE); // [46][AE] -- Unique ID representing the file, as random as possible. +define('EBML_ID_CONTENTENCALGO', 0x07E1); // [47][E1] -- The encryption algorithm used. The value '0' means that the contents have not been encrypted but only signed. Predefined values: +define('EBML_ID_CONTENTENCKEYID', 0x07E2); // [47][E2] -- For public key algorithms this is the ID of the public key the data was encrypted with. +define('EBML_ID_CONTENTSIGNATURE', 0x07E3); // [47][E3] -- A cryptographic signature of the contents. +define('EBML_ID_CONTENTSIGKEYID', 0x07E4); // [47][E4] -- This is the ID of the private key the data was signed with. +define('EBML_ID_CONTENTSIGALGO', 0x07E5); // [47][E5] -- The algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values: +define('EBML_ID_CONTENTSIGHASHALGO', 0x07E6); // [47][E6] -- The hash algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values: +define('EBML_ID_MUXINGAPP', 0x0D80); // [4D][80] -- Muxing application or library ("libmatroska-0.4.3"). +define('EBML_ID_SEEK', 0x0DBB); // [4D][BB] -- Contains a single seek entry to an EBML element. +define('EBML_ID_CONTENTENCODINGORDER', 0x1031); // [50][31] -- Tells when this modification was used during encoding/muxing starting with 0 and counting upwards. The decoder/demuxer has to start with the highest order number it finds and work its way down. This value has to be unique over all ContentEncodingOrder elements in the segment. +define('EBML_ID_CONTENTENCODINGSCOPE', 0x1032); // [50][32] -- A bit field that describes which elements have been modified in this way. Values (big endian) can be OR'ed. Possible values: +define('EBML_ID_CONTENTENCODINGTYPE', 0x1033); // [50][33] -- A value describing what kind of transformation has been done. Possible values: +define('EBML_ID_CONTENTCOMPRESSION', 0x1034); // [50][34] -- Settings describing the compression used. Must be present if the value of ContentEncodingType is 0 and absent otherwise. Each block must be decompressable even if no previous block is available in order not to prevent seeking. +define('EBML_ID_CONTENTENCRYPTION', 0x1035); // [50][35] -- Settings describing the encryption used. Must be present if the value of ContentEncodingType is 1 and absent otherwise. +define('EBML_ID_CUEREFNUMBER', 0x135F); // [53][5F] -- Number of the referenced Block of Track X in the specified Cluster. +define('EBML_ID_NAME', 0x136E); // [53][6E] -- A human-readable track name. +define('EBML_ID_CUEBLOCKNUMBER', 0x1378); // [53][78] -- Number of the Block in the specified Cluster. +define('EBML_ID_TRACKOFFSET', 0x137F); // [53][7F] -- A value to add to the Block's Timecode. This can be used to adjust the playback offset of a track. +define('EBML_ID_SEEKID', 0x13AB); // [53][AB] -- The binary ID corresponding to the element name. +define('EBML_ID_SEEKPOSITION', 0x13AC); // [53][AC] -- The position of the element in the segment in octets (0 = first level 1 element). +define('EBML_ID_STEREOMODE', 0x13B8); // [53][B8] -- Stereo-3D video mode. +define('EBML_ID_OLDSTEREOMODE', 0x13B9); // [53][B9] -- Bogus StereoMode value used in old versions of libmatroska. DO NOT USE. (0: mono, 1: right eye, 2: left eye, 3: both eyes). +define('EBML_ID_PIXELCROPBOTTOM', 0x14AA); // [54][AA] -- The number of video pixels to remove at the bottom of the image (for HDTV content). +define('EBML_ID_DISPLAYWIDTH', 0x14B0); // [54][B0] -- Width of the video frames to display. +define('EBML_ID_DISPLAYUNIT', 0x14B2); // [54][B2] -- Type of the unit for DisplayWidth/Height (0: pixels, 1: centimeters, 2: inches). +define('EBML_ID_ASPECTRATIOTYPE', 0x14B3); // [54][B3] -- Specify the possible modifications to the aspect ratio (0: free resizing, 1: keep aspect ratio, 2: fixed). +define('EBML_ID_DISPLAYHEIGHT', 0x14BA); // [54][BA] -- Height of the video frames to display. +define('EBML_ID_PIXELCROPTOP', 0x14BB); // [54][BB] -- The number of video pixels to remove at the top of the image. +define('EBML_ID_PIXELCROPLEFT', 0x14CC); // [54][CC] -- The number of video pixels to remove on the left of the image. +define('EBML_ID_PIXELCROPRIGHT', 0x14DD); // [54][DD] -- The number of video pixels to remove on the right of the image. +define('EBML_ID_FLAGFORCED', 0x15AA); // [55][AA] -- Set if that track MUST be used during playback. There can be many forced track for a kind (audio, video or subs), the player should select the one which language matches the user preference or the default + forced track. Overlay MAY happen between a forced and non-forced track of the same kind. +define('EBML_ID_MAXBLOCKADDITIONID', 0x15EE); // [55][EE] -- The maximum value of BlockAddID. A value 0 means there is no BlockAdditions for this track. +define('EBML_ID_WRITINGAPP', 0x1741); // [57][41] -- Writing application ("mkvmerge-0.3.3"). +define('EBML_ID_CLUSTERSILENTTRACKS', 0x1854); // [58][54] -- The list of tracks that are not used in that part of the stream. It is useful when using overlay tracks on seeking. Then you should decide what track to use. +define('EBML_ID_CLUSTERSILENTTRACKNUMBER', 0x18D7); // [58][D7] -- One of the track number that are not used from now on in the stream. It could change later if not specified as silent in a further Cluster. +define('EBML_ID_ATTACHEDFILE', 0x21A7); // [61][A7] -- An attached file. +define('EBML_ID_CONTENTENCODING', 0x2240); // [62][40] -- Settings for one content encoding like compression or encryption. +define('EBML_ID_BITDEPTH', 0x2264); // [62][64] -- Bits per sample, mostly used for PCM. +define('EBML_ID_CODECPRIVATE', 0x23A2); // [63][A2] -- Private data only known to the codec. +define('EBML_ID_TARGETS', 0x23C0); // [63][C0] -- Contain all UIDs where the specified meta data apply. It is void to describe everything in the segment. +define('EBML_ID_CHAPTERPHYSICALEQUIV', 0x23C3); // [63][C3] -- Specify the physical equivalent of this ChapterAtom like "DVD" (60) or "SIDE" (50), see complete list of values. +define('EBML_ID_TAGCHAPTERUID', 0x23C4); // [63][C4] -- A unique ID to identify the Chapter(s) the tags belong to. If the value is 0 at this level, the tags apply to all chapters in the Segment. +define('EBML_ID_TAGTRACKUID', 0x23C5); // [63][C5] -- A unique ID to identify the Track(s) the tags belong to. If the value is 0 at this level, the tags apply to all tracks in the Segment. +define('EBML_ID_TAGATTACHMENTUID', 0x23C6); // [63][C6] -- A unique ID to identify the Attachment(s) the tags belong to. If the value is 0 at this level, the tags apply to all the attachments in the Segment. +define('EBML_ID_TAGEDITIONUID', 0x23C9); // [63][C9] -- A unique ID to identify the EditionEntry(s) the tags belong to. If the value is 0 at this level, the tags apply to all editions in the Segment. +define('EBML_ID_TARGETTYPE', 0x23CA); // [63][CA] -- An informational string that can be used to display the logical level of the target like "ALBUM", "TRACK", "MOVIE", "CHAPTER", etc (see TargetType). +define('EBML_ID_TRACKTRANSLATE', 0x2624); // [66][24] -- The track identification for the given Chapter Codec. +define('EBML_ID_TRACKTRANSLATETRACKID', 0x26A5); // [66][A5] -- The binary value used to represent this track in the chapter codec data. The format depends on the ChapProcessCodecID used. +define('EBML_ID_TRACKTRANSLATECODEC', 0x26BF); // [66][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu). +define('EBML_ID_TRACKTRANSLATEEDITIONUID', 0x26FC); // [66][FC] -- Specify an edition UID on which this translation applies. When not specified, it means for all editions found in the segment. +define('EBML_ID_SIMPLETAG', 0x27C8); // [67][C8] -- Contains general information about the target. +define('EBML_ID_TARGETTYPEVALUE', 0x28CA); // [68][CA] -- A number to indicate the logical level of the target (see TargetType). +define('EBML_ID_CHAPPROCESSCOMMAND', 0x2911); // [69][11] -- Contains all the commands associated to the Atom. +define('EBML_ID_CHAPPROCESSTIME', 0x2922); // [69][22] -- Defines when the process command should be handled (0: during the whole chapter, 1: before starting playback, 2: after playback of the chapter). +define('EBML_ID_CHAPTERTRANSLATE', 0x2924); // [69][24] -- A tuple of corresponding ID used by chapter codecs to represent this segment. +define('EBML_ID_CHAPPROCESSDATA', 0x2933); // [69][33] -- Contains the command information. The data should be interpreted depending on the ChapProcessCodecID value. For ChapProcessCodecID = 1, the data correspond to the binary DVD cell pre/post commands. +define('EBML_ID_CHAPPROCESS', 0x2944); // [69][44] -- Contains all the commands associated to the Atom. +define('EBML_ID_CHAPPROCESSCODECID', 0x2955); // [69][55] -- Contains the type of the codec used for the processing. A value of 0 means native Matroska processing (to be defined), a value of 1 means the DVD command set is used. More codec IDs can be added later. +define('EBML_ID_CHAPTERTRANSLATEID', 0x29A5); // [69][A5] -- The binary value used to represent this segment in the chapter codec data. The format depends on the ChapProcessCodecID used. +define('EBML_ID_CHAPTERTRANSLATECODEC', 0x29BF); // [69][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu). +define('EBML_ID_CHAPTERTRANSLATEEDITIONUID', 0x29FC); // [69][FC] -- Specify an edition UID on which this correspondance applies. When not specified, it means for all editions found in the segment. +define('EBML_ID_CONTENTENCODINGS', 0x2D80); // [6D][80] -- Settings for several content encoding mechanisms like compression or encryption. +define('EBML_ID_MINCACHE', 0x2DE7); // [6D][E7] -- The minimum number of frames a player should be able to cache during playback. If set to 0, the reference pseudo-cache system is not used. +define('EBML_ID_MAXCACHE', 0x2DF8); // [6D][F8] -- The maximum cache size required to store referenced frames in and the current frame. 0 means no cache is needed. +define('EBML_ID_CHAPTERSEGMENTUID', 0x2E67); // [6E][67] -- A segment to play in place of this chapter. Edition ChapterSegmentEditionUID should be used for this segment, otherwise no edition is used. +define('EBML_ID_CHAPTERSEGMENTEDITIONUID', 0x2EBC); // [6E][BC] -- The edition to play from the segment linked in ChapterSegmentUID. +define('EBML_ID_TRACKOVERLAY', 0x2FAB); // [6F][AB] -- Specify that this track is an overlay track for the Track specified (in the u-integer). That means when this track has a gap (see SilentTracks) the overlay track should be used instead. The order of multiple TrackOverlay matters, the first one is the one that should be used. If not found it should be the second, etc. +define('EBML_ID_TAG', 0x3373); // [73][73] -- Element containing elements specific to Tracks/Chapters. +define('EBML_ID_SEGMENTFILENAME', 0x3384); // [73][84] -- A filename corresponding to this segment. +define('EBML_ID_SEGMENTUID', 0x33A4); // [73][A4] -- A randomly generated unique ID to identify the current segment between many others (128 bits). +define('EBML_ID_CHAPTERUID', 0x33C4); // [73][C4] -- A unique ID to identify the Chapter. +define('EBML_ID_TRACKUID', 0x33C5); // [73][C5] -- A unique ID to identify the Track. This should be kept the same when making a direct stream copy of the Track to another file. +define('EBML_ID_ATTACHMENTLINK', 0x3446); // [74][46] -- The UID of an attachment that is used by this codec. +define('EBML_ID_CLUSTERBLOCKADDITIONS', 0x35A1); // [75][A1] -- Contain additional blocks to complete the main one. An EBML parser that has no knowledge of the Block structure could still see and use/skip these data. +define('EBML_ID_CHANNELPOSITIONS', 0x347B); // [7D][7B] -- Table of horizontal angles for each successive channel, see appendix. +define('EBML_ID_OUTPUTSAMPLINGFREQUENCY', 0x38B5); // [78][B5] -- Real output sampling frequency in Hz (used for SBR techniques). +define('EBML_ID_TITLE', 0x3BA9); // [7B][A9] -- General name of the segment. +define('EBML_ID_CHAPTERDISPLAY', 0x00); // [80] -- Contains all possible strings to use for the chapter display. +define('EBML_ID_TRACKTYPE', 0x03); // [83] -- A set of track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: subtitle, 0x12: buttons, 0x20: control). +define('EBML_ID_CHAPSTRING', 0x05); // [85] -- Contains the string to use as the chapter atom. +define('EBML_ID_CODECID', 0x06); // [86] -- An ID corresponding to the codec, see the codec page for more info. +define('EBML_ID_FLAGDEFAULT', 0x08); // [88] -- Set if that track (audio, video or subs) SHOULD be used if no language found matches the user preference. +define('EBML_ID_CHAPTERTRACKNUMBER', 0x09); // [89] -- UID of the Track to apply this chapter too. In the absense of a control track, choosing this chapter will select the listed Tracks and deselect unlisted tracks. Absense of this element indicates that the Chapter should be applied to any currently used Tracks. +define('EBML_ID_CLUSTERSLICES', 0x0E); // [8E] -- Contains slices description. +define('EBML_ID_CHAPTERTRACK', 0x0F); // [8F] -- List of tracks on which the chapter applies. If this element is not present, all tracks apply +define('EBML_ID_CHAPTERTIMESTART', 0x11); // [91] -- Timecode of the start of Chapter (not scaled). +define('EBML_ID_CHAPTERTIMEEND', 0x12); // [92] -- Timecode of the end of Chapter (timecode excluded, not scaled). +define('EBML_ID_CUEREFTIME', 0x16); // [96] -- Timecode of the referenced Block. +define('EBML_ID_CUEREFCLUSTER', 0x17); // [97] -- Position of the Cluster containing the referenced Block. +define('EBML_ID_CHAPTERFLAGHIDDEN', 0x18); // [98] -- If a chapter is hidden (1), it should not be available to the user interface (but still to Control Tracks). +define('EBML_ID_FLAGINTERLACED', 0x1A); // [9A] -- Set if the video is interlaced. +define('EBML_ID_CLUSTERBLOCKDURATION', 0x1B); // [9B] -- The duration of the Block (based on TimecodeScale). This element is mandatory when DefaultDuration is set for the track. When not written and with no DefaultDuration, the value is assumed to be the difference between the timecode of this Block and the timecode of the next Block in "display" order (not coding order). This element can be useful at the end of a Track (as there is not other Block available), or when there is a break in a track like for subtitle tracks. +define('EBML_ID_FLAGLACING', 0x1C); // [9C] -- Set if the track may contain blocks using lacing. +define('EBML_ID_CHANNELS', 0x1F); // [9F] -- Numbers of channels in the track. +define('EBML_ID_CLUSTERBLOCKGROUP', 0x20); // [A0] -- Basic container of information containing a single Block or BlockVirtual, and information specific to that Block/VirtualBlock. +define('EBML_ID_CLUSTERBLOCK', 0x21); // [A1] -- Block containing the actual data to be rendered and a timecode relative to the Cluster Timecode. +define('EBML_ID_CLUSTERBLOCKVIRTUAL', 0x22); // [A2] -- A Block with no data. It must be stored in the stream at the place the real Block should be in display order. +define('EBML_ID_CLUSTERSIMPLEBLOCK', 0x23); // [A3] -- Similar to Block but without all the extra information, mostly used to reduced overhead when no extra feature is needed. +define('EBML_ID_CLUSTERCODECSTATE', 0x24); // [A4] -- The new codec state to use. Data interpretation is private to the codec. This information should always be referenced by a seek entry. +define('EBML_ID_CLUSTERBLOCKADDITIONAL', 0x25); // [A5] -- Interpreted by the codec as it wishes (using the BlockAddID). +define('EBML_ID_CLUSTERBLOCKMORE', 0x26); // [A6] -- Contain the BlockAdditional and some parameters. +define('EBML_ID_CLUSTERPOSITION', 0x27); // [A7] -- Position of the Cluster in the segment (0 in live broadcast streams). It might help to resynchronise offset on damaged streams. +define('EBML_ID_CODECDECODEALL', 0x2A); // [AA] -- The codec can decode potentially damaged data. +define('EBML_ID_CLUSTERPREVSIZE', 0x2B); // [AB] -- Size of the previous Cluster, in octets. Can be useful for backward playing. +define('EBML_ID_TRACKENTRY', 0x2E); // [AE] -- Describes a track with all elements. +define('EBML_ID_CLUSTERENCRYPTEDBLOCK', 0x2F); // [AF] -- Similar to SimpleBlock but the data inside the Block are Transformed (encrypt and/or signed). +define('EBML_ID_PIXELWIDTH', 0x30); // [B0] -- Width of the encoded video frames in pixels. +define('EBML_ID_CUETIME', 0x33); // [B3] -- Absolute timecode according to the segment time base. +define('EBML_ID_SAMPLINGFREQUENCY', 0x35); // [B5] -- Sampling frequency in Hz. +define('EBML_ID_CHAPTERATOM', 0x36); // [B6] -- Contains the atom information to use as the chapter atom (apply to all tracks). +define('EBML_ID_CUETRACKPOSITIONS', 0x37); // [B7] -- Contain positions for different tracks corresponding to the timecode. +define('EBML_ID_FLAGENABLED', 0x39); // [B9] -- Set if the track is used. +define('EBML_ID_PIXELHEIGHT', 0x3A); // [BA] -- Height of the encoded video frames in pixels. +define('EBML_ID_CUEPOINT', 0x3B); // [BB] -- Contains all information relative to a seek point in the segment. +define('EBML_ID_CRC32', 0x3F); // [BF] -- The CRC is computed on all the data of the Master element it's in, regardless of its position. It's recommended to put the CRC value at the beggining of the Master element for easier reading. All level 1 elements should include a CRC-32. +define('EBML_ID_CLUSTERBLOCKADDITIONID', 0x4B); // [CB] -- The ID of the BlockAdditional element (0 is the main Block). +define('EBML_ID_CLUSTERLACENUMBER', 0x4C); // [CC] -- The reverse number of the frame in the lace (0 is the last frame, 1 is the next to last, etc). While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback. +define('EBML_ID_CLUSTERFRAMENUMBER', 0x4D); // [CD] -- The number of the frame to generate from this lace with this delay (allow you to generate many frames from the same Block/Frame). +define('EBML_ID_CLUSTERDELAY', 0x4E); // [CE] -- The (scaled) delay to apply to the element. +define('EBML_ID_CLUSTERDURATION', 0x4F); // [CF] -- The (scaled) duration to apply to the element. +define('EBML_ID_TRACKNUMBER', 0x57); // [D7] -- The track number as used in the Block Header (using more than 127 tracks is not encouraged, though the design allows an unlimited number). +define('EBML_ID_CUEREFERENCE', 0x5B); // [DB] -- The Clusters containing the required referenced Blocks. +define('EBML_ID_VIDEO', 0x60); // [E0] -- Video settings. +define('EBML_ID_AUDIO', 0x61); // [E1] -- Audio settings. +define('EBML_ID_CLUSTERTIMESLICE', 0x68); // [E8] -- Contains extra time information about the data contained in the Block. While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback. +define('EBML_ID_CUECODECSTATE', 0x6A); // [EA] -- The position of the Codec State corresponding to this Cue element. 0 means that the data is taken from the initial Track Entry. +define('EBML_ID_CUEREFCODECSTATE', 0x6B); // [EB] -- The position of the Codec State corresponding to this referenced element. 0 means that the data is taken from the initial Track Entry. +define('EBML_ID_VOID', 0x6C); // [EC] -- Used to void damaged data, to avoid unexpected behaviors when using damaged data. The content is discarded. Also used to reserve space in a sub-element for later use. +define('EBML_ID_CLUSTERTIMECODE', 0x67); // [E7] -- Absolute timecode of the cluster (based on TimecodeScale). +define('EBML_ID_CLUSTERBLOCKADDID', 0x6E); // [EE] -- An ID to identify the BlockAdditional level. +define('EBML_ID_CUECLUSTERPOSITION', 0x71); // [F1] -- The position of the Cluster containing the required Block. +define('EBML_ID_CUETRACK', 0x77); // [F7] -- The track for which a position is given. +define('EBML_ID_CLUSTERREFERENCEPRIORITY', 0x7A); // [FA] -- This frame is referenced and has the specified cache priority. In cache only a frame of the same or higher priority can replace this frame. A value of 0 means the frame is not referenced. +define('EBML_ID_CLUSTERREFERENCEBLOCK', 0x7B); // [FB] -- Timecode of another frame used as a reference (ie: B or P frame). The timecode is relative to the block it's attached to. +define('EBML_ID_CLUSTERREFERENCEVIRTUAL', 0x7D); // [FD] -- Relative position of the data that should be in position of the virtual block. + + +/** +* @tutorial http://www.matroska.org/technical/specs/index.html +* +* @todo Rewrite EBML parser to reduce it's size and honor default element values +* @todo After rewrite implement stream size calculation, that will provide additional useful info and enable AAC/FLAC audio bitrate detection +*/ +class getid3_matroska extends getid3_handler +{ + /** + * If true, do not return information about CLUSTER chunks, since there's a lot of them + * and they're not usually useful [default: TRUE]. + * + * @var bool + */ + public static $hide_clusters = true; + + /** + * True to parse the whole file, not only header [default: FALSE]. + * + * @var bool + */ + public static $parse_whole_file = false; + + /* + * Private parser settings/placeholders. + */ + private $EBMLbuffer = ''; + private $EBMLbuffer_offset = 0; + private $EBMLbuffer_length = 0; + private $current_offset = 0; + private $unuseful_elements = array(EBML_ID_CRC32, EBML_ID_VOID); + + /** + * @return bool + */ + public function Analyze() + { + $info = &$this->getid3->info; + + // parse container + try { + $this->parseEBML($info); + } catch (Exception $e) { + $this->error('EBML parser: '.$e->getMessage()); + } + + // calculate playtime + if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) { + foreach ($info['matroska']['info'] as $key => $infoarray) { + if (isset($infoarray['Duration'])) { + // TimecodeScale is how many nanoseconds each Duration unit is + $info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000); + break; + } + } + } + + // extract tags + if (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) { + foreach ($info['matroska']['tags'] as $key => $infoarray) { + $this->ExtractCommentsSimpleTag($infoarray); + } + } + + // process tracks + if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) { + foreach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) { + + $track_info = array(); + $track_info['dataformat'] = self::CodecIDtoCommonName($trackarray['CodecID']); + $track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true); + if (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; } + + switch ($trackarray['TrackType']) { + + case 1: // Video + $track_info['resolution_x'] = $trackarray['PixelWidth']; + $track_info['resolution_y'] = $trackarray['PixelHeight']; + $track_info['display_unit'] = self::displayUnit(isset($trackarray['DisplayUnit']) ? $trackarray['DisplayUnit'] : 0); + $track_info['display_x'] = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']); + $track_info['display_y'] = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']); + + if (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; } + if (isset($trackarray['PixelCropTop'])) { $track_info['crop_top'] = $trackarray['PixelCropTop']; } + if (isset($trackarray['PixelCropLeft'])) { $track_info['crop_left'] = $trackarray['PixelCropLeft']; } + if (isset($trackarray['PixelCropRight'])) { $track_info['crop_right'] = $trackarray['PixelCropRight']; } + if (isset($trackarray['DefaultDuration'])) { $track_info['frame_rate'] = round(1000000000 / $trackarray['DefaultDuration'], 3); } + if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; } + + switch ($trackarray['CodecID']) { + case 'V_MS/VFW/FOURCC': + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + + $parsed = getid3_riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']); + $track_info['codec'] = getid3_riff::fourccLookup($parsed['fourcc']); + $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed; + break; + + /*case 'V_MPEG4/ISO/AVC': + $h264['profile'] = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1)); + $h264['level'] = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1)); + $rn = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1)); + $h264['NALUlength'] = ($rn & 3) + 1; + $rn = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1)); + $nsps = ($rn & 31); + $offset = 6; + for ($i = 0; $i < $nsps; $i ++) { + $length = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2)); + $h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length); + $offset += 2 + $length; + } + $npps = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1)); + $offset += 1; + for ($i = 0; $i < $npps; $i ++) { + $length = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2)); + $h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length); + $offset += 2 + $length; + } + $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264; + break;*/ + } + + $info['video']['streams'][] = $track_info; + break; + + case 2: // Audio + $track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0); + $track_info['channels'] = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1); + $track_info['language'] = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng'); + if (isset($trackarray['BitDepth'])) { $track_info['bits_per_sample'] = $trackarray['BitDepth']; } + if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; } + + switch ($trackarray['CodecID']) { + case 'A_PCM/INT/LIT': + case 'A_PCM/INT/BIG': + $track_info['bitrate'] = $track_info['sample_rate'] * $track_info['channels'] * $trackarray['BitDepth']; + break; + + case 'A_AC3': + case 'A_EAC3': + case 'A_DTS': + case 'A_MPEG/L3': + case 'A_MPEG/L2': + case 'A_FLAC': + $module_dataformat = ($track_info['dataformat'] == 'mp2' ? 'mp3' : ($track_info['dataformat'] == 'eac3' ? 'ac3' : $track_info['dataformat'])); + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.$module_dataformat.'.php', __FILE__, true); + + if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) { + $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because $info[matroska][track_data_offsets]['.$trackarray['TrackNumber'].'] not set'); + break; + } + + // create temp instance + $getid3_temp = new getID3(); + if ($track_info['dataformat'] != 'flac') { + $getid3_temp->openfile($this->getid3->filename); + } + $getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset']; + if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') { + $getid3_temp->info['avdataend'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'] + $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['length']; + } + + // analyze + $class = 'getid3_'.$module_dataformat; + $header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat']; + $getid3_audio = new $class($getid3_temp, __CLASS__); + if ($track_info['dataformat'] == 'flac') { + $getid3_audio->AnalyzeString($trackarray['CodecPrivate']); + } + else { + $getid3_audio->Analyze(); + } + if (!empty($getid3_temp->info[$header_data_key])) { + $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key]; + if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) { + foreach ($getid3_temp->info['audio'] as $sub_key => $value) { + $track_info[$sub_key] = $value; + } + } + } + else { + $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because '.$class.'::Analyze() failed at offset '.$getid3_temp->info['avdataoffset']); + } + + // copy errors and warnings + if (!empty($getid3_temp->info['error'])) { + foreach ($getid3_temp->info['error'] as $newerror) { + $this->warning($class.'() says: ['.$newerror.']'); + } + } + if (!empty($getid3_temp->info['warning'])) { + foreach ($getid3_temp->info['warning'] as $newerror) { + $this->warning($class.'() says: ['.$newerror.']'); + } + } + unset($getid3_temp, $getid3_audio); + break; + + case 'A_AAC': + case 'A_AAC/MPEG2/LC': + case 'A_AAC/MPEG2/LC/SBR': + case 'A_AAC/MPEG4/LC': + case 'A_AAC/MPEG4/LC/SBR': + $this->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\'t be calculated'); + break; + + case 'A_VORBIS': + if (!isset($trackarray['CodecPrivate'])) { + $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data not set'); + break; + } + $vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1); + if ($vorbis_offset === false) { + $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data does not contain "vorbis" keyword'); + break; + } + $vorbis_offset -= 1; + + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true); + + // create temp instance + $getid3_temp = new getID3(); + + // analyze + $getid3_ogg = new getid3_ogg($getid3_temp); + $oggpageinfo['page_seqno'] = 0; + $getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo); + if (!empty($getid3_temp->info['ogg'])) { + $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg']; + if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) { + foreach ($getid3_temp->info['audio'] as $sub_key => $value) { + $track_info[$sub_key] = $value; + } + } + } + + // copy errors and warnings + if (!empty($getid3_temp->info['error'])) { + foreach ($getid3_temp->info['error'] as $newerror) { + $this->warning('getid3_ogg() says: ['.$newerror.']'); + } + } + if (!empty($getid3_temp->info['warning'])) { + foreach ($getid3_temp->info['warning'] as $newerror) { + $this->warning('getid3_ogg() says: ['.$newerror.']'); + } + } + + if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) { + $track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal']; + } + unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset); + break; + + case 'A_MS/ACM': + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); + + $parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']); + foreach ($parsed as $sub_key => $value) { + if ($sub_key != 'raw') { + $track_info[$sub_key] = $value; + } + } + $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed; + break; + + default: + $this->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"'); + break; + } + + $info['audio']['streams'][] = $track_info; + break; + } + } + + if (!empty($info['video']['streams'])) { + $info['video'] = self::getDefaultStreamInfo($info['video']['streams']); + } + if (!empty($info['audio']['streams'])) { + $info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']); + } + } + + // process attachments + if (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) { + foreach ($info['matroska']['attachments'] as $i => $entry) { + if (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) { + $info['matroska']['comments']['picture'][] = array('data' => $entry['FileData'], 'image_mime' => $entry['FileMimeType'], 'filename' => $entry['FileName']); + } + } + } + + // determine mime type + if (!empty($info['video']['streams'])) { + $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska'); + } elseif (!empty($info['audio']['streams'])) { + $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska'); + } elseif (isset($info['mime_type'])) { + unset($info['mime_type']); + } + + return true; + } + + /** + * @param array $info + */ + private function parseEBML(&$info) { + // http://www.matroska.org/technical/specs/index.html#EBMLBasics + $this->current_offset = $info['avdataoffset']; + + while ($this->getEBMLelement($top_element, $info['avdataend'])) { + switch ($top_element['id']) { + + case EBML_ID_EBML: + $info['matroska']['header']['offset'] = $top_element['offset']; + $info['matroska']['header']['length'] = $top_element['length']; + + while ($this->getEBMLelement($element_data, $top_element['end'], true)) { + switch ($element_data['id']) { + + case EBML_ID_EBMLVERSION: + case EBML_ID_EBMLREADVERSION: + case EBML_ID_EBMLMAXIDLENGTH: + case EBML_ID_EBMLMAXSIZELENGTH: + case EBML_ID_DOCTYPEVERSION: + case EBML_ID_DOCTYPEREADVERSION: + $element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']); + break; + + case EBML_ID_DOCTYPE: + $element_data['data'] = getid3_lib::trimNullByte($element_data['data']); + $info['matroska']['doctype'] = $element_data['data']; + $info['fileformat'] = $element_data['data']; + break; + + default: + $this->unhandledElement('header', __LINE__, $element_data); + break; + } + + unset($element_data['offset'], $element_data['end']); + $info['matroska']['header']['elements'][] = $element_data; + } + break; + + case EBML_ID_SEGMENT: + $info['matroska']['segment'][0]['offset'] = $top_element['offset']; + $info['matroska']['segment'][0]['length'] = $top_element['length']; + + while ($this->getEBMLelement($element_data, $top_element['end'])) { + if ($element_data['id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required + $info['matroska']['segments'][] = $element_data; + } + switch ($element_data['id']) { + + case EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements. + + while ($this->getEBMLelement($seek_entry, $element_data['end'])) { + switch ($seek_entry['id']) { + + case EBML_ID_SEEK: // Contains a single seek entry to an EBML element + while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) { + + switch ($sub_seek_entry['id']) { + + case EBML_ID_SEEKID: + $seek_entry['target_id'] = self::EBML2Int($sub_seek_entry['data']); + $seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']); + break; + + case EBML_ID_SEEKPOSITION: + $seek_entry['target_offset'] = $element_data['offset'] + getid3_lib::BigEndian2Int($sub_seek_entry['data']); + break; + + default: + $this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry); } + break; + } + if (!isset($seek_entry['target_id'])) { + $this->warning('seek_entry[target_id] unexpectedly not set at '.$seek_entry['offset']); + break; + } + if (($seek_entry['target_id'] != EBML_ID_CLUSTER) || !self::$hide_clusters) { // collect clusters only if required + $info['matroska']['seek'][] = $seek_entry; + } + break; + + default: + $this->unhandledElement('seekhead', __LINE__, $seek_entry); + break; + } + } + break; + + case EBML_ID_TRACKS: // A top-level block of information with many tracks described. + $info['matroska']['tracks'] = $element_data; + + while ($this->getEBMLelement($track_entry, $element_data['end'])) { + switch ($track_entry['id']) { + + case EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements. + + while ($this->getEBMLelement($subelement, $track_entry['end'], array(EBML_ID_VIDEO, EBML_ID_AUDIO, EBML_ID_CONTENTENCODINGS, EBML_ID_CODECPRIVATE))) { + switch ($subelement['id']) { + + case EBML_ID_TRACKNUMBER: + case EBML_ID_TRACKUID: + case EBML_ID_TRACKTYPE: + case EBML_ID_MINCACHE: + case EBML_ID_MAXCACHE: + case EBML_ID_MAXBLOCKADDITIONID: + case EBML_ID_DEFAULTDURATION: // nanoseconds per frame + $track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); + break; + + case EBML_ID_TRACKTIMECODESCALE: + $track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']); + break; + + case EBML_ID_CODECID: + case EBML_ID_LANGUAGE: + case EBML_ID_NAME: + case EBML_ID_CODECNAME: + $track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); + break; + + case EBML_ID_CODECPRIVATE: + $track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true); + break; + + case EBML_ID_FLAGENABLED: + case EBML_ID_FLAGDEFAULT: + case EBML_ID_FLAGFORCED: + case EBML_ID_FLAGLACING: + case EBML_ID_CODECDECODEALL: + $track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']); + break; + + case EBML_ID_VIDEO: + + while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { + switch ($sub_subelement['id']) { + + case EBML_ID_PIXELWIDTH: + case EBML_ID_PIXELHEIGHT: + case EBML_ID_PIXELCROPBOTTOM: + case EBML_ID_PIXELCROPTOP: + case EBML_ID_PIXELCROPLEFT: + case EBML_ID_PIXELCROPRIGHT: + case EBML_ID_DISPLAYWIDTH: + case EBML_ID_DISPLAYHEIGHT: + case EBML_ID_DISPLAYUNIT: + case EBML_ID_ASPECTRATIOTYPE: + case EBML_ID_STEREOMODE: + case EBML_ID_OLDSTEREOMODE: + $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + case EBML_ID_FLAGINTERLACED: + $track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + case EBML_ID_GAMMAVALUE: + $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']); + break; + + case EBML_ID_COLOURSPACE: + $track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); + break; + + default: + $this->unhandledElement('track.video', __LINE__, $sub_subelement); + break; + } + } + break; + + case EBML_ID_AUDIO: + + while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { + switch ($sub_subelement['id']) { + + case EBML_ID_CHANNELS: + case EBML_ID_BITDEPTH: + $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + case EBML_ID_SAMPLINGFREQUENCY: + case EBML_ID_OUTPUTSAMPLINGFREQUENCY: + $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']); + break; + + case EBML_ID_CHANNELPOSITIONS: + $track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); + break; + + default: + $this->unhandledElement('track.audio', __LINE__, $sub_subelement); + break; + } + } + break; + + case EBML_ID_CONTENTENCODINGS: + + while ($this->getEBMLelement($sub_subelement, $subelement['end'])) { + switch ($sub_subelement['id']) { + + case EBML_ID_CONTENTENCODING: + + while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CONTENTCOMPRESSION, EBML_ID_CONTENTENCRYPTION))) { + switch ($sub_sub_subelement['id']) { + + case EBML_ID_CONTENTENCODINGORDER: + case EBML_ID_CONTENTENCODINGSCOPE: + case EBML_ID_CONTENTENCODINGTYPE: + $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); + break; + + case EBML_ID_CONTENTCOMPRESSION: + + while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { + switch ($sub_sub_sub_subelement['id']) { + + case EBML_ID_CONTENTCOMPALGO: + $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); + break; + + case EBML_ID_CONTENTCOMPSETTINGS: + $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; + break; + + default: + $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement); + break; + } + } + break; + + case EBML_ID_CONTENTENCRYPTION: + + while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { + switch ($sub_sub_sub_subelement['id']) { + + case EBML_ID_CONTENTENCALGO: + case EBML_ID_CONTENTSIGALGO: + case EBML_ID_CONTENTSIGHASHALGO: + $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); + break; + + case EBML_ID_CONTENTENCKEYID: + case EBML_ID_CONTENTSIGNATURE: + case EBML_ID_CONTENTSIGKEYID: + $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; + break; + + default: + $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement); + break; + } + } + break; + + default: + $this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement); + break; + } + } + break; + + default: + $this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement); + break; + } + } + break; + + default: + $this->unhandledElement('track', __LINE__, $subelement); + break; + } + } + + $info['matroska']['tracks']['tracks'][] = $track_entry; + break; + + default: + $this->unhandledElement('tracks', __LINE__, $track_entry); + break; + } + } + break; + + case EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file. + $info_entry = array(); + + while ($this->getEBMLelement($subelement, $element_data['end'], true)) { + switch ($subelement['id']) { + + case EBML_ID_TIMECODESCALE: + $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); + break; + + case EBML_ID_DURATION: + $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']); + break; + + case EBML_ID_DATEUTC: + $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); + $info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]); + break; + + case EBML_ID_SEGMENTUID: + case EBML_ID_PREVUID: + case EBML_ID_NEXTUID: + $info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); + break; + + case EBML_ID_SEGMENTFAMILY: + $info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']); + break; + + case EBML_ID_SEGMENTFILENAME: + case EBML_ID_PREVFILENAME: + case EBML_ID_NEXTFILENAME: + case EBML_ID_TITLE: + case EBML_ID_MUXINGAPP: + case EBML_ID_WRITINGAPP: + $info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); + $info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']]; + break; + + case EBML_ID_CHAPTERTRANSLATE: + $chaptertranslate_entry = array(); + + while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { + switch ($sub_subelement['id']) { + + case EBML_ID_CHAPTERTRANSLATEEDITIONUID: + $chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + case EBML_ID_CHAPTERTRANSLATECODEC: + $chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + case EBML_ID_CHAPTERTRANSLATEID: + $chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); + break; + + default: + $this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement); + break; + } + } + $info_entry[$subelement['id_name']] = $chaptertranslate_entry; + break; + + default: + $this->unhandledElement('info', __LINE__, $subelement); + break; + } + } + $info['matroska']['info'][] = $info_entry; + break; + + case EBML_ID_CUES: // A top-level element to speed seeking access. All entries are local to the segment. Should be mandatory for non "live" streams. + if (self::$hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway + $this->current_offset = $element_data['end']; + break; + } + $cues_entry = array(); + + while ($this->getEBMLelement($subelement, $element_data['end'])) { + switch ($subelement['id']) { + + case EBML_ID_CUEPOINT: + $cuepoint_entry = array(); + + while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) { + switch ($sub_subelement['id']) { + + case EBML_ID_CUETRACKPOSITIONS: + $cuetrackpositions_entry = array(); + + while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) { + switch ($sub_sub_subelement['id']) { + + case EBML_ID_CUETRACK: + case EBML_ID_CUECLUSTERPOSITION: + case EBML_ID_CUEBLOCKNUMBER: + case EBML_ID_CUECODECSTATE: + $cuetrackpositions_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); + break; + + default: + $this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement); + break; + } + } + $cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry; + break; + + case EBML_ID_CUETIME: + $cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + default: + $this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement); + break; + } + } + $cues_entry[] = $cuepoint_entry; + break; + + default: + $this->unhandledElement('cues', __LINE__, $subelement); + break; + } + } + $info['matroska']['cues'] = $cues_entry; + break; + + case EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters. + $tags_entry = array(); + + while ($this->getEBMLelement($subelement, $element_data['end'], false)) { + switch ($subelement['id']) { + + case EBML_ID_TAG: + $tag_entry = array(); + + while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) { + switch ($sub_subelement['id']) { + + case EBML_ID_TARGETS: + $targets_entry = array(); + + while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) { + switch ($sub_sub_subelement['id']) { + + case EBML_ID_TARGETTYPEVALUE: + $targets_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); + $targets_entry[strtolower($sub_sub_subelement['id_name']).'_long'] = self::TargetTypeValue($targets_entry[$sub_sub_subelement['id_name']]); + break; + + case EBML_ID_TARGETTYPE: + $targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data']; + break; + + case EBML_ID_TAGTRACKUID: + case EBML_ID_TAGEDITIONUID: + case EBML_ID_TAGCHAPTERUID: + case EBML_ID_TAGATTACHMENTUID: + $targets_entry[$sub_sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); + break; + + default: + $this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement); + break; + } + } + $tag_entry[$sub_subelement['id_name']] = $targets_entry; + break; + + case EBML_ID_SIMPLETAG: + $tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']); + break; + + default: + $this->unhandledElement('tags.tag', __LINE__, $sub_subelement); + break; + } + } + $tags_entry[] = $tag_entry; + break; + + default: + $this->unhandledElement('tags', __LINE__, $subelement); + break; + } + } + $info['matroska']['tags'] = $tags_entry; + break; + + case EBML_ID_ATTACHMENTS: // Contain attached files. + + while ($this->getEBMLelement($subelement, $element_data['end'])) { + switch ($subelement['id']) { + + case EBML_ID_ATTACHEDFILE: + $attachedfile_entry = array(); + + while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) { + switch ($sub_subelement['id']) { + + case EBML_ID_FILEDESCRIPTION: + case EBML_ID_FILENAME: + case EBML_ID_FILEMIMETYPE: + $attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data']; + break; + + case EBML_ID_FILEDATA: + $attachedfile_entry['data_offset'] = $this->current_offset; + $attachedfile_entry['data_length'] = $sub_subelement['length']; + + $attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment( + $attachedfile_entry['FileName'], + $attachedfile_entry['data_offset'], + $attachedfile_entry['data_length']); + + $this->current_offset = $sub_subelement['end']; + break; + + case EBML_ID_FILEUID: + $attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + default: + $this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement); + break; + } + } + $info['matroska']['attachments'][] = $attachedfile_entry; + break; + + default: + $this->unhandledElement('attachments', __LINE__, $subelement); + break; + } + } + break; + + case EBML_ID_CHAPTERS: + + while ($this->getEBMLelement($subelement, $element_data['end'])) { + switch ($subelement['id']) { + + case EBML_ID_EDITIONENTRY: + $editionentry_entry = array(); + + while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) { + switch ($sub_subelement['id']) { + + case EBML_ID_EDITIONUID: + $editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + case EBML_ID_EDITIONFLAGHIDDEN: + case EBML_ID_EDITIONFLAGDEFAULT: + case EBML_ID_EDITIONFLAGORDERED: + $editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + case EBML_ID_CHAPTERATOM: + $chapteratom_entry = array(); + + while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CHAPTERTRACK, EBML_ID_CHAPTERDISPLAY))) { + switch ($sub_sub_subelement['id']) { + + case EBML_ID_CHAPTERSEGMENTUID: + case EBML_ID_CHAPTERSEGMENTEDITIONUID: + $chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data']; + break; + + case EBML_ID_CHAPTERFLAGENABLED: + case EBML_ID_CHAPTERFLAGHIDDEN: + $chapteratom_entry[$sub_sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_sub_subelement['data']); + break; + + case EBML_ID_CHAPTERUID: + case EBML_ID_CHAPTERTIMESTART: + case EBML_ID_CHAPTERTIMEEND: + $chapteratom_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); + break; + + case EBML_ID_CHAPTERTRACK: + $chaptertrack_entry = array(); + + while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { + switch ($sub_sub_sub_subelement['id']) { + + case EBML_ID_CHAPTERTRACKNUMBER: + $chaptertrack_entry[$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); + break; + + default: + $this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement); + break; + } + } + $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry; + break; + + case EBML_ID_CHAPTERDISPLAY: + $chapterdisplay_entry = array(); + + while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { + switch ($sub_sub_sub_subelement['id']) { + + case EBML_ID_CHAPSTRING: + case EBML_ID_CHAPLANGUAGE: + case EBML_ID_CHAPCOUNTRY: + $chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; + break; + + default: + $this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement); + break; + } + } + $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry; + break; + + default: + $this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement); + break; + } + } + $editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry; + break; + + default: + $this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement); + break; + } + } + $info['matroska']['chapters'][] = $editionentry_entry; + break; + + default: + $this->unhandledElement('chapters', __LINE__, $subelement); + break; + } + } + break; + + case EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure. + $cluster_entry = array(); + + while ($this->getEBMLelement($subelement, $element_data['end'], array(EBML_ID_CLUSTERSILENTTRACKS, EBML_ID_CLUSTERBLOCKGROUP, EBML_ID_CLUSTERSIMPLEBLOCK))) { + switch ($subelement['id']) { + + case EBML_ID_CLUSTERTIMECODE: + case EBML_ID_CLUSTERPOSITION: + case EBML_ID_CLUSTERPREVSIZE: + $cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); + break; + + case EBML_ID_CLUSTERSILENTTRACKS: + $cluster_silent_tracks = array(); + + while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { + switch ($sub_subelement['id']) { + + case EBML_ID_CLUSTERSILENTTRACKNUMBER: + $cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + default: + $this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement); + break; + } + } + $cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks; + break; + + case EBML_ID_CLUSTERBLOCKGROUP: + $cluster_block_group = array('offset' => $this->current_offset); + + while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) { + switch ($sub_subelement['id']) { + + case EBML_ID_CLUSTERBLOCK: + $cluster_block_group[$sub_subelement['id_name']] = $this->HandleEMBLClusterBlock($sub_subelement, EBML_ID_CLUSTERBLOCK, $info); + break; + + case EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int + case EBML_ID_CLUSTERBLOCKDURATION: // unsigned-int + $cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); + break; + + case EBML_ID_CLUSTERREFERENCEBLOCK: // signed-int + $cluster_block_group[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data'], false, true); + break; + + case EBML_ID_CLUSTERCODECSTATE: + $cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); + break; + + default: + $this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement); + break; + } + } + $cluster_entry[$subelement['id_name']][] = $cluster_block_group; + break; + + case EBML_ID_CLUSTERSIMPLEBLOCK: + $cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info); + break; + + default: + $this->unhandledElement('cluster', __LINE__, $subelement); + break; + } + $this->current_offset = $subelement['end']; + } + if (!self::$hide_clusters) { + $info['matroska']['cluster'][] = $cluster_entry; + } + + // check to see if all the data we need exists already, if so, break out of the loop + if (!self::$parse_whole_file) { + if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) { + if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) { + if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) { + return; + } + } + } + } + break; + + default: + $this->unhandledElement('segment', __LINE__, $element_data); + break; + } + } + break; + + default: + $this->unhandledElement('root', __LINE__, $top_element); + break; + } + } + } + + /** + * @param int $min_data + * + * @return bool + */ + private function EnsureBufferHasEnoughData($min_data=1024) { + if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) { + $read_bytes = max($min_data, $this->getid3->fread_buffer_size()); + + try { + $this->fseek($this->current_offset); + $this->EBMLbuffer_offset = $this->current_offset; + $this->EBMLbuffer = $this->fread($read_bytes); + $this->EBMLbuffer_length = strlen($this->EBMLbuffer); + } catch (getid3_exception $e) { + $this->warning('EBML parser: '.$e->getMessage()); + return false; + } + + if ($this->EBMLbuffer_length == 0 && $this->feof()) { + return $this->error('EBML parser: ran out of file at offset '.$this->current_offset); + } + } + return true; + } + + /** + * @return int|float|false + */ + private function readEBMLint() { + $actual_offset = $this->current_offset - $this->EBMLbuffer_offset; + + // get length of integer + $first_byte_int = ord($this->EBMLbuffer[$actual_offset]); + if (0x80 & $first_byte_int) { + $length = 1; + } elseif (0x40 & $first_byte_int) { + $length = 2; + } elseif (0x20 & $first_byte_int) { + $length = 3; + } elseif (0x10 & $first_byte_int) { + $length = 4; + } elseif (0x08 & $first_byte_int) { + $length = 5; + } elseif (0x04 & $first_byte_int) { + $length = 6; + } elseif (0x02 & $first_byte_int) { + $length = 7; + } elseif (0x01 & $first_byte_int) { + $length = 8; + } else { + throw new Exception('invalid EBML integer (leading 0x00) at '.$this->current_offset); + } + + // read + $int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length)); + $this->current_offset += $length; + + return $int_value; + } + + /** + * @param int $length + * @param bool $check_buffer + * + * @return string|false + */ + private function readEBMLelementData($length, $check_buffer=false) { + if ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) { + return false; + } + $data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length); + $this->current_offset += $length; + return $data; + } + + /** + * @param array $element + * @param int $parent_end + * @param array|bool $get_data + * + * @return bool + */ + private function getEBMLelement(&$element, $parent_end, $get_data=false) { + if ($this->current_offset >= $parent_end) { + return false; + } + + if (!$this->EnsureBufferHasEnoughData()) { + $this->current_offset = PHP_INT_MAX; // do not exit parser right now, allow to finish current loop to gather maximum information + return false; + } + + $element = array(); + + // set offset + $element['offset'] = $this->current_offset; + + // get ID + $element['id'] = $this->readEBMLint(); + + // get name + $element['id_name'] = self::EBMLidName($element['id']); + + // get length + $element['length'] = $this->readEBMLint(); + + // get end offset + $element['end'] = $this->current_offset + $element['length']; + + // get raw data + $dont_parse = (in_array($element['id'], $this->unuseful_elements) || $element['id_name'] == dechex($element['id'])); + if (($get_data === true || (is_array($get_data) && !in_array($element['id'], $get_data))) && !$dont_parse) { + $element['data'] = $this->readEBMLelementData($element['length'], $element); + } + + return true; + } + + /** + * @param string $type + * @param int $line + * @param array $element + */ + private function unhandledElement($type, $line, $element) { + // warn only about unknown and missed elements, not about unuseful + if (!in_array($element['id'], $this->unuseful_elements)) { + $this->warning('Unhandled '.$type.' element ['.basename(__FILE__).':'.$line.'] ('.$element['id'].'::'.$element['id_name'].' ['.$element['length'].' bytes]) at '.$element['offset']); + } + + // increase offset for unparsed elements + if (!isset($element['data'])) { + $this->current_offset = $element['end']; + } + } + + /** + * @param array $SimpleTagArray + * + * @return bool + */ + private function ExtractCommentsSimpleTag($SimpleTagArray) { + if (!empty($SimpleTagArray['SimpleTag'])) { + foreach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) { + if (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) { + $this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString']; + } + if (!empty($SimpleTagData['SimpleTag'])) { + $this->ExtractCommentsSimpleTag($SimpleTagData); + } + } + } + + return true; + } + + /** + * @param int $parent_end + * + * @return array + */ + private function HandleEMBLSimpleTag($parent_end) { + $simpletag_entry = array(); + + while ($this->getEBMLelement($element, $parent_end, array(EBML_ID_SIMPLETAG))) { + switch ($element['id']) { + + case EBML_ID_TAGNAME: + case EBML_ID_TAGLANGUAGE: + case EBML_ID_TAGSTRING: + case EBML_ID_TAGBINARY: + $simpletag_entry[$element['id_name']] = $element['data']; + break; + + case EBML_ID_SIMPLETAG: + $simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']); + break; + + case EBML_ID_TAGDEFAULT: + $simpletag_entry[$element['id_name']] = (bool)getid3_lib::BigEndian2Int($element['data']); + break; + + default: + $this->unhandledElement('tag.simpletag', __LINE__, $element); + break; + } + } + + return $simpletag_entry; + } + + /** + * @param array $element + * @param int $block_type + * @param array $info + * + * @return array + */ + private function HandleEMBLClusterBlock($element, $block_type, &$info) { + // http://www.matroska.org/technical/specs/index.html#block_structure + // http://www.matroska.org/technical/specs/index.html#simpleblock_structure + + $block_data = array(); + $block_data['tracknumber'] = $this->readEBMLint(); + $block_data['timecode'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(2), false, true); + $block_data['flags_raw'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)); + + if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) { + $block_data['flags']['keyframe'] = (($block_data['flags_raw'] & 0x80) >> 7); + //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4); + } + else { + //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4); + } + $block_data['flags']['invisible'] = (bool)(($block_data['flags_raw'] & 0x08) >> 3); + $block_data['flags']['lacing'] = (($block_data['flags_raw'] & 0x06) >> 1); // 00=no lacing; 01=Xiph lacing; 11=EBML lacing; 10=fixed-size lacing + if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) { + $block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01)); + } + else { + //$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0); + } + $block_data['flags']['lacing_type'] = self::BlockLacingType($block_data['flags']['lacing']); + + // Lace (when lacing bit is set) + if ($block_data['flags']['lacing'] > 0) { + $block_data['lace_frames'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)) + 1; // Number of frames in the lace-1 (uint8) + if ($block_data['flags']['lacing'] != 0x02) { + for ($i = 1; $i < $block_data['lace_frames']; $i ++) { // Lace-coded size of each frame of the lace, except for the last one (multiple uint8). *This is not used with Fixed-size lacing as it is calculated automatically from (total size of lace) / (number of frames in lace). + if ($block_data['flags']['lacing'] == 0x03) { // EBML lacing + $block_data['lace_frames_size'][$i] = $this->readEBMLint(); // TODO: read size correctly, calc size for the last frame. For now offsets are deteminded OK with readEBMLint() and that's the most important thing. + } + else { // Xiph lacing + $block_data['lace_frames_size'][$i] = 0; + do { + $size = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)); + $block_data['lace_frames_size'][$i] += $size; + } + while ($size == 255); + } + } + if ($block_data['flags']['lacing'] == 0x01) { // calc size of the last frame only for Xiph lacing, till EBML sizes are now anyway determined incorrectly + $block_data['lace_frames_size'][] = $element['end'] - $this->current_offset - array_sum($block_data['lace_frames_size']); + } + } + } + + if (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) { + $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset; + $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'] = $element['end'] - $this->current_offset; + //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0; + } + //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] += $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length']; + //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['duration'] = $block_data['timecode'] * ((isset($info['matroska']['info'][0]['TimecodeScale']) ? $info['matroska']['info'][0]['TimecodeScale'] : 1000000) / 1000000000); + + // set offset manually + $this->current_offset = $element['end']; + + return $block_data; + } + + /** + * @param string $EBMLstring + * + * @return int|float|false + */ + private static function EBML2Int($EBMLstring) { + // http://matroska.org/specs/ + + // Element ID coded with an UTF-8 like system: + // 1xxx xxxx - Class A IDs (2^7 -2 possible values) (base 0x8X) + // 01xx xxxx xxxx xxxx - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX) + // 001x xxxx xxxx xxxx xxxx xxxx - Class C IDs (2^21-2 possible values) (base 0x2X 0xXX 0xXX) + // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - Class D IDs (2^28-2 possible values) (base 0x1X 0xXX 0xXX 0xXX) + // Values with all x at 0 and 1 are reserved (hence the -2). + + // Data size, in octets, is also coded with an UTF-8 like system : + // 1xxx xxxx - value 0 to 2^7-2 + // 01xx xxxx xxxx xxxx - value 0 to 2^14-2 + // 001x xxxx xxxx xxxx xxxx xxxx - value 0 to 2^21-2 + // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^28-2 + // 0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^35-2 + // 0000 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^42-2 + // 0000 001x xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^49-2 + // 0000 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^56-2 + + $first_byte_int = ord($EBMLstring[0]); + if (0x80 & $first_byte_int) { + $EBMLstring[0] = chr($first_byte_int & 0x7F); + } elseif (0x40 & $first_byte_int) { + $EBMLstring[0] = chr($first_byte_int & 0x3F); + } elseif (0x20 & $first_byte_int) { + $EBMLstring[0] = chr($first_byte_int & 0x1F); + } elseif (0x10 & $first_byte_int) { + $EBMLstring[0] = chr($first_byte_int & 0x0F); + } elseif (0x08 & $first_byte_int) { + $EBMLstring[0] = chr($first_byte_int & 0x07); + } elseif (0x04 & $first_byte_int) { + $EBMLstring[0] = chr($first_byte_int & 0x03); + } elseif (0x02 & $first_byte_int) { + $EBMLstring[0] = chr($first_byte_int & 0x01); + } elseif (0x01 & $first_byte_int) { + $EBMLstring[0] = chr($first_byte_int & 0x00); + } + + return getid3_lib::BigEndian2Int($EBMLstring); + } + + /** + * @param int $EBMLdatestamp + * + * @return float + */ + private static function EBMLdate2unix($EBMLdatestamp) { + // Date - signed 8 octets integer in nanoseconds with 0 indicating the precise beginning of the millennium (at 2001-01-01T00:00:00,000000000 UTC) + // 978307200 == mktime(0, 0, 0, 1, 1, 2001) == January 1, 2001 12:00:00am UTC + return round(($EBMLdatestamp / 1000000000) + 978307200); + } + + /** + * @param int $target_type + * + * @return string|int + */ + public static function TargetTypeValue($target_type) { + // http://www.matroska.org/technical/specs/tagging/index.html + static $TargetTypeValue = array(); + if (empty($TargetTypeValue)) { + $TargetTypeValue[10] = 'A: ~ V:shot'; // the lowest hierarchy found in music or movies + $TargetTypeValue[20] = 'A:subtrack/part/movement ~ V:scene'; // corresponds to parts of a track for audio (like a movement) + $TargetTypeValue[30] = 'A:track/song ~ V:chapter'; // the common parts of an album or a movie + $TargetTypeValue[40] = 'A:part/session ~ V:part/session'; // when an album or episode has different logical parts + $TargetTypeValue[50] = 'A:album/opera/concert ~ V:movie/episode/concert'; // the most common grouping level of music and video (equals to an episode for TV series) + $TargetTypeValue[60] = 'A:edition/issue/volume/opus ~ V:season/sequel/volume'; // a list of lower levels grouped together + $TargetTypeValue[70] = 'A:collection ~ V:collection'; // the high hierarchy consisting of many different lower items + } + return (isset($TargetTypeValue[$target_type]) ? $TargetTypeValue[$target_type] : $target_type); + } + + /** + * @param int $lacingtype + * + * @return string|int + */ + public static function BlockLacingType($lacingtype) { + // http://matroska.org/technical/specs/index.html#block_structure + static $BlockLacingType = array(); + if (empty($BlockLacingType)) { + $BlockLacingType[0x00] = 'no lacing'; + $BlockLacingType[0x01] = 'Xiph lacing'; + $BlockLacingType[0x02] = 'fixed-size lacing'; + $BlockLacingType[0x03] = 'EBML lacing'; + } + return (isset($BlockLacingType[$lacingtype]) ? $BlockLacingType[$lacingtype] : $lacingtype); + } + + /** + * @param string $codecid + * + * @return string + */ + public static function CodecIDtoCommonName($codecid) { + // http://www.matroska.org/technical/specs/codecid/index.html + static $CodecIDlist = array(); + if (empty($CodecIDlist)) { + $CodecIDlist['A_AAC'] = 'aac'; + $CodecIDlist['A_AAC/MPEG2/LC'] = 'aac'; + $CodecIDlist['A_AC3'] = 'ac3'; + $CodecIDlist['A_EAC3'] = 'eac3'; + $CodecIDlist['A_DTS'] = 'dts'; + $CodecIDlist['A_FLAC'] = 'flac'; + $CodecIDlist['A_MPEG/L1'] = 'mp1'; + $CodecIDlist['A_MPEG/L2'] = 'mp2'; + $CodecIDlist['A_MPEG/L3'] = 'mp3'; + $CodecIDlist['A_PCM/INT/LIT'] = 'pcm'; // PCM Integer Little Endian + $CodecIDlist['A_PCM/INT/BIG'] = 'pcm'; // PCM Integer Big Endian + $CodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music + $CodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2 + $CodecIDlist['A_VORBIS'] = 'vorbis'; + $CodecIDlist['V_MPEG1'] = 'mpeg'; + $CodecIDlist['V_THEORA'] = 'theora'; + $CodecIDlist['V_REAL/RV40'] = 'real'; + $CodecIDlist['V_REAL/RV10'] = 'real'; + $CodecIDlist['V_REAL/RV20'] = 'real'; + $CodecIDlist['V_REAL/RV30'] = 'real'; + $CodecIDlist['V_QUICKTIME'] = 'quicktime'; // Quicktime + $CodecIDlist['V_MPEG4/ISO/AP'] = 'mpeg4'; + $CodecIDlist['V_MPEG4/ISO/ASP'] = 'mpeg4'; + $CodecIDlist['V_MPEG4/ISO/AVC'] = 'h264'; + $CodecIDlist['V_MPEG4/ISO/SP'] = 'mpeg4'; + $CodecIDlist['V_VP8'] = 'vp8'; + $CodecIDlist['V_MS/VFW/FOURCC'] = 'vcm'; // Microsoft (TM) Video Codec Manager (VCM) + $CodecIDlist['A_MS/ACM'] = 'acm'; // Microsoft (TM) Audio Codec Manager (ACM) + } + return (isset($CodecIDlist[$codecid]) ? $CodecIDlist[$codecid] : $codecid); + } + + /** + * @param int $value + * + * @return string + */ + private static function EBMLidName($value) { + static $EBMLidList = array(); + if (empty($EBMLidList)) { + $EBMLidList[EBML_ID_ASPECTRATIOTYPE] = 'AspectRatioType'; + $EBMLidList[EBML_ID_ATTACHEDFILE] = 'AttachedFile'; + $EBMLidList[EBML_ID_ATTACHMENTLINK] = 'AttachmentLink'; + $EBMLidList[EBML_ID_ATTACHMENTS] = 'Attachments'; + $EBMLidList[EBML_ID_AUDIO] = 'Audio'; + $EBMLidList[EBML_ID_BITDEPTH] = 'BitDepth'; + $EBMLidList[EBML_ID_CHANNELPOSITIONS] = 'ChannelPositions'; + $EBMLidList[EBML_ID_CHANNELS] = 'Channels'; + $EBMLidList[EBML_ID_CHAPCOUNTRY] = 'ChapCountry'; + $EBMLidList[EBML_ID_CHAPLANGUAGE] = 'ChapLanguage'; + $EBMLidList[EBML_ID_CHAPPROCESS] = 'ChapProcess'; + $EBMLidList[EBML_ID_CHAPPROCESSCODECID] = 'ChapProcessCodecID'; + $EBMLidList[EBML_ID_CHAPPROCESSCOMMAND] = 'ChapProcessCommand'; + $EBMLidList[EBML_ID_CHAPPROCESSDATA] = 'ChapProcessData'; + $EBMLidList[EBML_ID_CHAPPROCESSPRIVATE] = 'ChapProcessPrivate'; + $EBMLidList[EBML_ID_CHAPPROCESSTIME] = 'ChapProcessTime'; + $EBMLidList[EBML_ID_CHAPSTRING] = 'ChapString'; + $EBMLidList[EBML_ID_CHAPTERATOM] = 'ChapterAtom'; + $EBMLidList[EBML_ID_CHAPTERDISPLAY] = 'ChapterDisplay'; + $EBMLidList[EBML_ID_CHAPTERFLAGENABLED] = 'ChapterFlagEnabled'; + $EBMLidList[EBML_ID_CHAPTERFLAGHIDDEN] = 'ChapterFlagHidden'; + $EBMLidList[EBML_ID_CHAPTERPHYSICALEQUIV] = 'ChapterPhysicalEquiv'; + $EBMLidList[EBML_ID_CHAPTERS] = 'Chapters'; + $EBMLidList[EBML_ID_CHAPTERSEGMENTEDITIONUID] = 'ChapterSegmentEditionUID'; + $EBMLidList[EBML_ID_CHAPTERSEGMENTUID] = 'ChapterSegmentUID'; + $EBMLidList[EBML_ID_CHAPTERTIMEEND] = 'ChapterTimeEnd'; + $EBMLidList[EBML_ID_CHAPTERTIMESTART] = 'ChapterTimeStart'; + $EBMLidList[EBML_ID_CHAPTERTRACK] = 'ChapterTrack'; + $EBMLidList[EBML_ID_CHAPTERTRACKNUMBER] = 'ChapterTrackNumber'; + $EBMLidList[EBML_ID_CHAPTERTRANSLATE] = 'ChapterTranslate'; + $EBMLidList[EBML_ID_CHAPTERTRANSLATECODEC] = 'ChapterTranslateCodec'; + $EBMLidList[EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID'; + $EBMLidList[EBML_ID_CHAPTERTRANSLATEID] = 'ChapterTranslateID'; + $EBMLidList[EBML_ID_CHAPTERUID] = 'ChapterUID'; + $EBMLidList[EBML_ID_CLUSTER] = 'Cluster'; + $EBMLidList[EBML_ID_CLUSTERBLOCK] = 'ClusterBlock'; + $EBMLidList[EBML_ID_CLUSTERBLOCKADDID] = 'ClusterBlockAddID'; + $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONAL] = 'ClusterBlockAdditional'; + $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONID] = 'ClusterBlockAdditionID'; + $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONS] = 'ClusterBlockAdditions'; + $EBMLidList[EBML_ID_CLUSTERBLOCKDURATION] = 'ClusterBlockDuration'; + $EBMLidList[EBML_ID_CLUSTERBLOCKGROUP] = 'ClusterBlockGroup'; + $EBMLidList[EBML_ID_CLUSTERBLOCKMORE] = 'ClusterBlockMore'; + $EBMLidList[EBML_ID_CLUSTERBLOCKVIRTUAL] = 'ClusterBlockVirtual'; + $EBMLidList[EBML_ID_CLUSTERCODECSTATE] = 'ClusterCodecState'; + $EBMLidList[EBML_ID_CLUSTERDELAY] = 'ClusterDelay'; + $EBMLidList[EBML_ID_CLUSTERDURATION] = 'ClusterDuration'; + $EBMLidList[EBML_ID_CLUSTERENCRYPTEDBLOCK] = 'ClusterEncryptedBlock'; + $EBMLidList[EBML_ID_CLUSTERFRAMENUMBER] = 'ClusterFrameNumber'; + $EBMLidList[EBML_ID_CLUSTERLACENUMBER] = 'ClusterLaceNumber'; + $EBMLidList[EBML_ID_CLUSTERPOSITION] = 'ClusterPosition'; + $EBMLidList[EBML_ID_CLUSTERPREVSIZE] = 'ClusterPrevSize'; + $EBMLidList[EBML_ID_CLUSTERREFERENCEBLOCK] = 'ClusterReferenceBlock'; + $EBMLidList[EBML_ID_CLUSTERREFERENCEPRIORITY] = 'ClusterReferencePriority'; + $EBMLidList[EBML_ID_CLUSTERREFERENCEVIRTUAL] = 'ClusterReferenceVirtual'; + $EBMLidList[EBML_ID_CLUSTERSILENTTRACKNUMBER] = 'ClusterSilentTrackNumber'; + $EBMLidList[EBML_ID_CLUSTERSILENTTRACKS] = 'ClusterSilentTracks'; + $EBMLidList[EBML_ID_CLUSTERSIMPLEBLOCK] = 'ClusterSimpleBlock'; + $EBMLidList[EBML_ID_CLUSTERTIMECODE] = 'ClusterTimecode'; + $EBMLidList[EBML_ID_CLUSTERTIMESLICE] = 'ClusterTimeSlice'; + $EBMLidList[EBML_ID_CODECDECODEALL] = 'CodecDecodeAll'; + $EBMLidList[EBML_ID_CODECDOWNLOADURL] = 'CodecDownloadURL'; + $EBMLidList[EBML_ID_CODECID] = 'CodecID'; + $EBMLidList[EBML_ID_CODECINFOURL] = 'CodecInfoURL'; + $EBMLidList[EBML_ID_CODECNAME] = 'CodecName'; + $EBMLidList[EBML_ID_CODECPRIVATE] = 'CodecPrivate'; + $EBMLidList[EBML_ID_CODECSETTINGS] = 'CodecSettings'; + $EBMLidList[EBML_ID_COLOURSPACE] = 'ColourSpace'; + $EBMLidList[EBML_ID_CONTENTCOMPALGO] = 'ContentCompAlgo'; + $EBMLidList[EBML_ID_CONTENTCOMPRESSION] = 'ContentCompression'; + $EBMLidList[EBML_ID_CONTENTCOMPSETTINGS] = 'ContentCompSettings'; + $EBMLidList[EBML_ID_CONTENTENCALGO] = 'ContentEncAlgo'; + $EBMLidList[EBML_ID_CONTENTENCKEYID] = 'ContentEncKeyID'; + $EBMLidList[EBML_ID_CONTENTENCODING] = 'ContentEncoding'; + $EBMLidList[EBML_ID_CONTENTENCODINGORDER] = 'ContentEncodingOrder'; + $EBMLidList[EBML_ID_CONTENTENCODINGS] = 'ContentEncodings'; + $EBMLidList[EBML_ID_CONTENTENCODINGSCOPE] = 'ContentEncodingScope'; + $EBMLidList[EBML_ID_CONTENTENCODINGTYPE] = 'ContentEncodingType'; + $EBMLidList[EBML_ID_CONTENTENCRYPTION] = 'ContentEncryption'; + $EBMLidList[EBML_ID_CONTENTSIGALGO] = 'ContentSigAlgo'; + $EBMLidList[EBML_ID_CONTENTSIGHASHALGO] = 'ContentSigHashAlgo'; + $EBMLidList[EBML_ID_CONTENTSIGKEYID] = 'ContentSigKeyID'; + $EBMLidList[EBML_ID_CONTENTSIGNATURE] = 'ContentSignature'; + $EBMLidList[EBML_ID_CRC32] = 'CRC32'; + $EBMLidList[EBML_ID_CUEBLOCKNUMBER] = 'CueBlockNumber'; + $EBMLidList[EBML_ID_CUECLUSTERPOSITION] = 'CueClusterPosition'; + $EBMLidList[EBML_ID_CUECODECSTATE] = 'CueCodecState'; + $EBMLidList[EBML_ID_CUEPOINT] = 'CuePoint'; + $EBMLidList[EBML_ID_CUEREFCLUSTER] = 'CueRefCluster'; + $EBMLidList[EBML_ID_CUEREFCODECSTATE] = 'CueRefCodecState'; + $EBMLidList[EBML_ID_CUEREFERENCE] = 'CueReference'; + $EBMLidList[EBML_ID_CUEREFNUMBER] = 'CueRefNumber'; + $EBMLidList[EBML_ID_CUEREFTIME] = 'CueRefTime'; + $EBMLidList[EBML_ID_CUES] = 'Cues'; + $EBMLidList[EBML_ID_CUETIME] = 'CueTime'; + $EBMLidList[EBML_ID_CUETRACK] = 'CueTrack'; + $EBMLidList[EBML_ID_CUETRACKPOSITIONS] = 'CueTrackPositions'; + $EBMLidList[EBML_ID_DATEUTC] = 'DateUTC'; + $EBMLidList[EBML_ID_DEFAULTDURATION] = 'DefaultDuration'; + $EBMLidList[EBML_ID_DISPLAYHEIGHT] = 'DisplayHeight'; + $EBMLidList[EBML_ID_DISPLAYUNIT] = 'DisplayUnit'; + $EBMLidList[EBML_ID_DISPLAYWIDTH] = 'DisplayWidth'; + $EBMLidList[EBML_ID_DOCTYPE] = 'DocType'; + $EBMLidList[EBML_ID_DOCTYPEREADVERSION] = 'DocTypeReadVersion'; + $EBMLidList[EBML_ID_DOCTYPEVERSION] = 'DocTypeVersion'; + $EBMLidList[EBML_ID_DURATION] = 'Duration'; + $EBMLidList[EBML_ID_EBML] = 'EBML'; + $EBMLidList[EBML_ID_EBMLMAXIDLENGTH] = 'EBMLMaxIDLength'; + $EBMLidList[EBML_ID_EBMLMAXSIZELENGTH] = 'EBMLMaxSizeLength'; + $EBMLidList[EBML_ID_EBMLREADVERSION] = 'EBMLReadVersion'; + $EBMLidList[EBML_ID_EBMLVERSION] = 'EBMLVersion'; + $EBMLidList[EBML_ID_EDITIONENTRY] = 'EditionEntry'; + $EBMLidList[EBML_ID_EDITIONFLAGDEFAULT] = 'EditionFlagDefault'; + $EBMLidList[EBML_ID_EDITIONFLAGHIDDEN] = 'EditionFlagHidden'; + $EBMLidList[EBML_ID_EDITIONFLAGORDERED] = 'EditionFlagOrdered'; + $EBMLidList[EBML_ID_EDITIONUID] = 'EditionUID'; + $EBMLidList[EBML_ID_FILEDATA] = 'FileData'; + $EBMLidList[EBML_ID_FILEDESCRIPTION] = 'FileDescription'; + $EBMLidList[EBML_ID_FILEMIMETYPE] = 'FileMimeType'; + $EBMLidList[EBML_ID_FILENAME] = 'FileName'; + $EBMLidList[EBML_ID_FILEREFERRAL] = 'FileReferral'; + $EBMLidList[EBML_ID_FILEUID] = 'FileUID'; + $EBMLidList[EBML_ID_FLAGDEFAULT] = 'FlagDefault'; + $EBMLidList[EBML_ID_FLAGENABLED] = 'FlagEnabled'; + $EBMLidList[EBML_ID_FLAGFORCED] = 'FlagForced'; + $EBMLidList[EBML_ID_FLAGINTERLACED] = 'FlagInterlaced'; + $EBMLidList[EBML_ID_FLAGLACING] = 'FlagLacing'; + $EBMLidList[EBML_ID_GAMMAVALUE] = 'GammaValue'; + $EBMLidList[EBML_ID_INFO] = 'Info'; + $EBMLidList[EBML_ID_LANGUAGE] = 'Language'; + $EBMLidList[EBML_ID_MAXBLOCKADDITIONID] = 'MaxBlockAdditionID'; + $EBMLidList[EBML_ID_MAXCACHE] = 'MaxCache'; + $EBMLidList[EBML_ID_MINCACHE] = 'MinCache'; + $EBMLidList[EBML_ID_MUXINGAPP] = 'MuxingApp'; + $EBMLidList[EBML_ID_NAME] = 'Name'; + $EBMLidList[EBML_ID_NEXTFILENAME] = 'NextFilename'; + $EBMLidList[EBML_ID_NEXTUID] = 'NextUID'; + $EBMLidList[EBML_ID_OUTPUTSAMPLINGFREQUENCY] = 'OutputSamplingFrequency'; + $EBMLidList[EBML_ID_PIXELCROPBOTTOM] = 'PixelCropBottom'; + $EBMLidList[EBML_ID_PIXELCROPLEFT] = 'PixelCropLeft'; + $EBMLidList[EBML_ID_PIXELCROPRIGHT] = 'PixelCropRight'; + $EBMLidList[EBML_ID_PIXELCROPTOP] = 'PixelCropTop'; + $EBMLidList[EBML_ID_PIXELHEIGHT] = 'PixelHeight'; + $EBMLidList[EBML_ID_PIXELWIDTH] = 'PixelWidth'; + $EBMLidList[EBML_ID_PREVFILENAME] = 'PrevFilename'; + $EBMLidList[EBML_ID_PREVUID] = 'PrevUID'; + $EBMLidList[EBML_ID_SAMPLINGFREQUENCY] = 'SamplingFrequency'; + $EBMLidList[EBML_ID_SEEK] = 'Seek'; + $EBMLidList[EBML_ID_SEEKHEAD] = 'SeekHead'; + $EBMLidList[EBML_ID_SEEKID] = 'SeekID'; + $EBMLidList[EBML_ID_SEEKPOSITION] = 'SeekPosition'; + $EBMLidList[EBML_ID_SEGMENT] = 'Segment'; + $EBMLidList[EBML_ID_SEGMENTFAMILY] = 'SegmentFamily'; + $EBMLidList[EBML_ID_SEGMENTFILENAME] = 'SegmentFilename'; + $EBMLidList[EBML_ID_SEGMENTUID] = 'SegmentUID'; + $EBMLidList[EBML_ID_SIMPLETAG] = 'SimpleTag'; + $EBMLidList[EBML_ID_CLUSTERSLICES] = 'ClusterSlices'; + $EBMLidList[EBML_ID_STEREOMODE] = 'StereoMode'; + $EBMLidList[EBML_ID_OLDSTEREOMODE] = 'OldStereoMode'; + $EBMLidList[EBML_ID_TAG] = 'Tag'; + $EBMLidList[EBML_ID_TAGATTACHMENTUID] = 'TagAttachmentUID'; + $EBMLidList[EBML_ID_TAGBINARY] = 'TagBinary'; + $EBMLidList[EBML_ID_TAGCHAPTERUID] = 'TagChapterUID'; + $EBMLidList[EBML_ID_TAGDEFAULT] = 'TagDefault'; + $EBMLidList[EBML_ID_TAGEDITIONUID] = 'TagEditionUID'; + $EBMLidList[EBML_ID_TAGLANGUAGE] = 'TagLanguage'; + $EBMLidList[EBML_ID_TAGNAME] = 'TagName'; + $EBMLidList[EBML_ID_TAGTRACKUID] = 'TagTrackUID'; + $EBMLidList[EBML_ID_TAGS] = 'Tags'; + $EBMLidList[EBML_ID_TAGSTRING] = 'TagString'; + $EBMLidList[EBML_ID_TARGETS] = 'Targets'; + $EBMLidList[EBML_ID_TARGETTYPE] = 'TargetType'; + $EBMLidList[EBML_ID_TARGETTYPEVALUE] = 'TargetTypeValue'; + $EBMLidList[EBML_ID_TIMECODESCALE] = 'TimecodeScale'; + $EBMLidList[EBML_ID_TITLE] = 'Title'; + $EBMLidList[EBML_ID_TRACKENTRY] = 'TrackEntry'; + $EBMLidList[EBML_ID_TRACKNUMBER] = 'TrackNumber'; + $EBMLidList[EBML_ID_TRACKOFFSET] = 'TrackOffset'; + $EBMLidList[EBML_ID_TRACKOVERLAY] = 'TrackOverlay'; + $EBMLidList[EBML_ID_TRACKS] = 'Tracks'; + $EBMLidList[EBML_ID_TRACKTIMECODESCALE] = 'TrackTimecodeScale'; + $EBMLidList[EBML_ID_TRACKTRANSLATE] = 'TrackTranslate'; + $EBMLidList[EBML_ID_TRACKTRANSLATECODEC] = 'TrackTranslateCodec'; + $EBMLidList[EBML_ID_TRACKTRANSLATEEDITIONUID] = 'TrackTranslateEditionUID'; + $EBMLidList[EBML_ID_TRACKTRANSLATETRACKID] = 'TrackTranslateTrackID'; + $EBMLidList[EBML_ID_TRACKTYPE] = 'TrackType'; + $EBMLidList[EBML_ID_TRACKUID] = 'TrackUID'; + $EBMLidList[EBML_ID_VIDEO] = 'Video'; + $EBMLidList[EBML_ID_VOID] = 'Void'; + $EBMLidList[EBML_ID_WRITINGAPP] = 'WritingApp'; + } + + return (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value)); + } + + /** + * @param int $value + * + * @return string + */ + public static function displayUnit($value) { + // http://www.matroska.org/technical/specs/index.html#DisplayUnit + static $units = array( + 0 => 'pixels', + 1 => 'centimeters', + 2 => 'inches', + 3 => 'Display Aspect Ratio'); + + return (isset($units[$value]) ? $units[$value] : 'unknown'); + } + + /** + * @param array $streams + * + * @return array + */ + private static function getDefaultStreamInfo($streams) + { + $stream = array(); + foreach (array_reverse($streams) as $stream) { + if ($stream['default']) { + break; + } + } + + $unset = array('default', 'name'); + foreach ($unset as $u) { + if (isset($stream[$u])) { + unset($stream[$u]); + } + } + + $info = $stream; + $info['streams'] = $streams; + + return $info; + } + +} diff --git a/wp-includes/ID3/module.audio-video.quicktime.php b/wp-includes/ID3/module.audio-video.quicktime.php new file mode 100644 index 0000000..cb1173b --- /dev/null +++ b/wp-includes/ID3/module.audio-video.quicktime.php @@ -0,0 +1,2905 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.quicktime.php // +// module for analyzing Quicktime and MP3-in-MP4 files // +// dependencies: module.audio.mp3.php // +// dependencies: module.tag.id3v2.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); // needed for ISO 639-2 language code lookup + +class getid3_quicktime extends getid3_handler +{ + + public $ReturnAtomData = true; + public $ParseAllPossibleAtoms = false; + + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + $info['fileformat'] = 'quicktime'; + $info['quicktime']['hinting'] = false; + $info['quicktime']['controller'] = 'standard'; // may be overridden if 'ctyp' atom is present + + $this->fseek($info['avdataoffset']); + + $offset = 0; + $atomcounter = 0; + $atom_data_read_buffer_size = $info['php_memory_limit'] ? round($info['php_memory_limit'] / 4) : $this->getid3->option_fread_buffer_size * 1024; // set read buffer to 25% of PHP memory limit (if one is specified), otherwise use option_fread_buffer_size [default: 32MB] + while ($offset < $info['avdataend']) { + if (!getid3_lib::intValueSupported($offset)) { + $this->error('Unable to parse atom at offset '.$offset.' because beyond '.round(PHP_INT_MAX / 1073741824).'GB limit of PHP filesystem functions'); + break; + } + $this->fseek($offset); + $AtomHeader = $this->fread(8); + + $atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4)); + $atomname = substr($AtomHeader, 4, 4); + + // 64-bit MOV patch by jlegateØktnc*com + if ($atomsize == 1) { + $atomsize = getid3_lib::BigEndian2Int($this->fread(8)); + } + + $info['quicktime'][$atomname]['name'] = $atomname; + $info['quicktime'][$atomname]['size'] = $atomsize; + $info['quicktime'][$atomname]['offset'] = $offset; + + if (($offset + $atomsize) > $info['avdataend']) { + $this->error('Atom at offset '.$offset.' claims to go beyond end-of-file (length: '.$atomsize.' bytes)'); + return false; + } + + if ($atomsize == 0) { + // Furthermore, for historical reasons the list of atoms is optionally + // terminated by a 32-bit integer set to 0. If you are writing a program + // to read user data atoms, you should allow for the terminating 0. + break; + } + $atomHierarchy = array(); + $info['quicktime'][$atomname] = $this->QuicktimeParseAtom($atomname, $atomsize, $this->fread(min($atomsize, $atom_data_read_buffer_size)), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms); + + $offset += $atomsize; + $atomcounter++; + } + + if (!empty($info['avdataend_tmp'])) { + // this value is assigned to a temp value and then erased because + // otherwise any atoms beyond the 'mdat' atom would not get parsed + $info['avdataend'] = $info['avdataend_tmp']; + unset($info['avdataend_tmp']); + } + + if (!empty($info['quicktime']['comments']['chapters']) && is_array($info['quicktime']['comments']['chapters']) && (count($info['quicktime']['comments']['chapters']) > 0)) { + $durations = $this->quicktime_time_to_sample_table($info); + for ($i = 0; $i < count($info['quicktime']['comments']['chapters']); $i++) { + $bookmark = array(); + $bookmark['title'] = $info['quicktime']['comments']['chapters'][$i]; + if (isset($durations[$i])) { + $bookmark['duration_sample'] = $durations[$i]['sample_duration']; + if ($i > 0) { + $bookmark['start_sample'] = $info['quicktime']['bookmarks'][($i - 1)]['start_sample'] + $info['quicktime']['bookmarks'][($i - 1)]['duration_sample']; + } else { + $bookmark['start_sample'] = 0; + } + if ($time_scale = $this->quicktime_bookmark_time_scale($info)) { + $bookmark['duration_seconds'] = $bookmark['duration_sample'] / $time_scale; + $bookmark['start_seconds'] = $bookmark['start_sample'] / $time_scale; + } + } + $info['quicktime']['bookmarks'][] = $bookmark; + } + } + + if (isset($info['quicktime']['temp_meta_key_names'])) { + unset($info['quicktime']['temp_meta_key_names']); + } + + if (!empty($info['quicktime']['comments']['location.ISO6709'])) { + // https://en.wikipedia.org/wiki/ISO_6709 + foreach ($info['quicktime']['comments']['location.ISO6709'] as $ISO6709string) { + $latitude = false; + $longitude = false; + $altitude = false; + if (preg_match('#^([\\+\\-])([0-9]{2}|[0-9]{4}|[0-9]{6})(\\.[0-9]+)?([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?(([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?)?/$#', $ISO6709string, $matches)) { + @list($dummy, $lat_sign, $lat_deg, $lat_deg_dec, $lon_sign, $lon_deg, $lon_deg_dec, $dummy, $alt_sign, $alt_deg, $alt_deg_dec) = $matches; + + if (strlen($lat_deg) == 2) { // [+-]DD.D + $latitude = floatval(ltrim($lat_deg, '0').$lat_deg_dec); + } elseif (strlen($lat_deg) == 4) { // [+-]DDMM.M + $latitude = floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0').$lat_deg_dec / 60); + } elseif (strlen($lat_deg) == 6) { // [+-]DDMMSS.S + $latitude = floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lat_deg, 4, 2), '0').$lat_deg_dec / 3600); + } + + if (strlen($lon_deg) == 3) { // [+-]DDD.D + $longitude = floatval(ltrim($lon_deg, '0').$lon_deg_dec); + } elseif (strlen($lon_deg) == 5) { // [+-]DDDMM.M + $longitude = floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0').$lon_deg_dec / 60); + } elseif (strlen($lon_deg) == 7) { // [+-]DDDMMSS.S + $longitude = floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lon_deg, 4, 2), '0').$lon_deg_dec / 3600); + } + + if (strlen($alt_deg) == 3) { // [+-]DDD.D + $altitude = floatval(ltrim($alt_deg, '0').$alt_deg_dec); + } elseif (strlen($alt_deg) == 5) { // [+-]DDDMM.M + $altitude = floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0').$alt_deg_dec / 60); + } elseif (strlen($alt_deg) == 7) { // [+-]DDDMMSS.S + $altitude = floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($alt_deg, 4, 2), '0').$alt_deg_dec / 3600); + } + + if ($latitude !== false) { + $info['quicktime']['comments']['gps_latitude'][] = (($lat_sign == '-') ? -1 : 1) * floatval($latitude); + } + if ($longitude !== false) { + $info['quicktime']['comments']['gps_longitude'][] = (($lon_sign == '-') ? -1 : 1) * floatval($longitude); + } + if ($altitude !== false) { + $info['quicktime']['comments']['gps_altitude'][] = (($alt_sign == '-') ? -1 : 1) * floatval($altitude); + } + } + if ($latitude === false) { + $this->warning('location.ISO6709 string not parsed correctly: "'.$ISO6709string.'", please submit as a bug'); + } + break; + } + } + + if (!isset($info['bitrate']) && isset($info['playtime_seconds'])) { + $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; + } + if (isset($info['bitrate']) && !isset($info['audio']['bitrate']) && !isset($info['quicktime']['video'])) { + $info['audio']['bitrate'] = $info['bitrate']; + } + if (!empty($info['bitrate']) && !empty($info['audio']['bitrate']) && empty($info['video']['bitrate']) && !empty($info['video']['frame_rate']) && !empty($info['video']['resolution_x']) && ($info['bitrate'] > $info['audio']['bitrate'])) { + $info['video']['bitrate'] = $info['bitrate'] - $info['audio']['bitrate']; + } + if (!empty($info['playtime_seconds']) && !isset($info['video']['frame_rate']) && !empty($info['quicktime']['stts_framecount'])) { + foreach ($info['quicktime']['stts_framecount'] as $key => $samples_count) { + $samples_per_second = $samples_count / $info['playtime_seconds']; + if ($samples_per_second > 240) { + // has to be audio samples + } else { + $info['video']['frame_rate'] = $samples_per_second; + break; + } + } + } + if ($info['audio']['dataformat'] == 'mp4') { + $info['fileformat'] = 'mp4'; + if (empty($info['video']['resolution_x'])) { + $info['mime_type'] = 'audio/mp4'; + unset($info['video']['dataformat']); + } else { + $info['mime_type'] = 'video/mp4'; + } + } + + if (!$this->ReturnAtomData) { + unset($info['quicktime']['moov']); + } + + if (empty($info['audio']['dataformat']) && !empty($info['quicktime']['audio'])) { + $info['audio']['dataformat'] = 'quicktime'; + } + if (empty($info['video']['dataformat']) && !empty($info['quicktime']['video'])) { + $info['video']['dataformat'] = 'quicktime'; + } + if (isset($info['video']) && ($info['mime_type'] == 'audio/mp4') && empty($info['video']['resolution_x']) && empty($info['video']['resolution_y'])) { + unset($info['video']); + } + + return true; + } + + /** + * @param string $atomname + * @param int $atomsize + * @param string $atom_data + * @param int $baseoffset + * @param array $atomHierarchy + * @param bool $ParseAllPossibleAtoms + * + * @return array|false + */ + public function QuicktimeParseAtom($atomname, $atomsize, $atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) { + // http://developer.apple.com/techpubs/quicktime/qtdevdocs/APIREF/INDEX/atomalphaindex.htm + // https://code.google.com/p/mp4v2/wiki/iTunesMetadata + + $info = &$this->getid3->info; + + $atom_parent = end($atomHierarchy); // not array_pop($atomHierarchy); see https://www.getid3.org/phpBB3/viewtopic.php?t=1717 + array_push($atomHierarchy, $atomname); + $atom_structure['hierarchy'] = implode(' ', $atomHierarchy); + $atom_structure['name'] = $atomname; + $atom_structure['size'] = $atomsize; + $atom_structure['offset'] = $baseoffset; + if (substr($atomname, 0, 3) == "\x00\x00\x00") { + // https://github.com/JamesHeinrich/getID3/issues/139 + $atomname = getid3_lib::BigEndian2Int($atomname); + $atom_structure['name'] = $atomname; + $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); + } else { + switch ($atomname) { + case 'moov': // MOVie container atom + case 'trak': // TRAcK container atom + case 'clip': // CLIPping container atom + case 'matt': // track MATTe container atom + case 'edts': // EDiTS container atom + case 'tref': // Track REFerence container atom + case 'mdia': // MeDIA container atom + case 'minf': // Media INFormation container atom + case 'dinf': // Data INFormation container atom + case 'udta': // User DaTA container atom + case 'cmov': // Compressed MOVie container atom + case 'rmra': // Reference Movie Record Atom + case 'rmda': // Reference Movie Descriptor Atom + case 'gmhd': // Generic Media info HeaDer atom (seen on QTVR) + $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); + break; + + case 'ilst': // Item LiST container atom + if ($atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms)) { + // some "ilst" atoms contain data atoms that have a numeric name, and the data is far more accessible if the returned array is compacted + $allnumericnames = true; + foreach ($atom_structure['subatoms'] as $subatomarray) { + if (!is_integer($subatomarray['name']) || (count($subatomarray['subatoms']) != 1)) { + $allnumericnames = false; + break; + } + } + if ($allnumericnames) { + $newData = array(); + foreach ($atom_structure['subatoms'] as $subatomarray) { + foreach ($subatomarray['subatoms'] as $newData_subatomarray) { + unset($newData_subatomarray['hierarchy'], $newData_subatomarray['name']); + $newData[$subatomarray['name']] = $newData_subatomarray; + break; + } + } + $atom_structure['data'] = $newData; + unset($atom_structure['subatoms']); + } + } + break; + + case 'stbl': // Sample TaBLe container atom + $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); + $isVideo = false; + $framerate = 0; + $framecount = 0; + foreach ($atom_structure['subatoms'] as $key => $value_array) { + if (isset($value_array['sample_description_table'])) { + foreach ($value_array['sample_description_table'] as $key2 => $value_array2) { + if (isset($value_array2['data_format'])) { + switch ($value_array2['data_format']) { + case 'avc1': + case 'mp4v': + // video data + $isVideo = true; + break; + case 'mp4a': + // audio data + break; + } + } + } + } elseif (isset($value_array['time_to_sample_table'])) { + foreach ($value_array['time_to_sample_table'] as $key2 => $value_array2) { + if (isset($value_array2['sample_count']) && isset($value_array2['sample_duration']) && ($value_array2['sample_duration'] > 0)) { + $framerate = round($info['quicktime']['time_scale'] / $value_array2['sample_duration'], 3); + $framecount = $value_array2['sample_count']; + } + } + } + } + if ($isVideo && $framerate) { + $info['quicktime']['video']['frame_rate'] = $framerate; + $info['video']['frame_rate'] = $info['quicktime']['video']['frame_rate']; + } + if ($isVideo && $framecount) { + $info['quicktime']['video']['frame_count'] = $framecount; + } + break; + + + case "\xA9".'alb': // ALBum + case "\xA9".'ART': // + case "\xA9".'art': // ARTist + case "\xA9".'aut': // + case "\xA9".'cmt': // CoMmenT + case "\xA9".'com': // COMposer + case "\xA9".'cpy': // + case "\xA9".'day': // content created year + case "\xA9".'dir': // + case "\xA9".'ed1': // + case "\xA9".'ed2': // + case "\xA9".'ed3': // + case "\xA9".'ed4': // + case "\xA9".'ed5': // + case "\xA9".'ed6': // + case "\xA9".'ed7': // + case "\xA9".'ed8': // + case "\xA9".'ed9': // + case "\xA9".'enc': // + case "\xA9".'fmt': // + case "\xA9".'gen': // GENre + case "\xA9".'grp': // GRouPing + case "\xA9".'hst': // + case "\xA9".'inf': // + case "\xA9".'lyr': // LYRics + case "\xA9".'mak': // + case "\xA9".'mod': // + case "\xA9".'nam': // full NAMe + case "\xA9".'ope': // + case "\xA9".'PRD': // + case "\xA9".'prf': // + case "\xA9".'req': // + case "\xA9".'src': // + case "\xA9".'swr': // + case "\xA9".'too': // encoder + case "\xA9".'trk': // TRacK + case "\xA9".'url': // + case "\xA9".'wrn': // + case "\xA9".'wrt': // WRiTer + case '----': // itunes specific + case 'aART': // Album ARTist + case 'akID': // iTunes store account type + case 'apID': // Purchase Account + case 'atID': // + case 'catg': // CaTeGory + case 'cmID': // + case 'cnID': // + case 'covr': // COVeR artwork + case 'cpil': // ComPILation + case 'cprt': // CoPyRighT + case 'desc': // DESCription + case 'disk': // DISK number + case 'egid': // Episode Global ID + case 'geID': // + case 'gnre': // GeNRE + case 'hdvd': // HD ViDeo + case 'keyw': // KEYWord + case 'ldes': // Long DEScription + case 'pcst': // PodCaST + case 'pgap': // GAPless Playback + case 'plID': // + case 'purd': // PURchase Date + case 'purl': // Podcast URL + case 'rati': // + case 'rndu': // + case 'rpdu': // + case 'rtng': // RaTiNG + case 'sfID': // iTunes store country + case 'soaa': // SOrt Album Artist + case 'soal': // SOrt ALbum + case 'soar': // SOrt ARtist + case 'soco': // SOrt COmposer + case 'sonm': // SOrt NaMe + case 'sosn': // SOrt Show Name + case 'stik': // + case 'tmpo': // TeMPO (BPM) + case 'trkn': // TRacK Number + case 'tven': // tvEpisodeID + case 'tves': // TV EpiSode + case 'tvnn': // TV Network Name + case 'tvsh': // TV SHow Name + case 'tvsn': // TV SeasoN + if ($atom_parent == 'udta') { + // User data atom handler + $atom_structure['data_length'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); + $atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); + $atom_structure['data'] = substr($atom_data, 4); + + $atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']); + if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) { + $info['comments']['language'][] = $atom_structure['language']; + } + } else { + // Apple item list box atom handler + $atomoffset = 0; + if (substr($atom_data, 2, 2) == "\x10\xB5") { + // not sure what it means, but observed on iPhone4 data. + // Each $atom_data has 2 bytes of datasize, plus 0x10B5, then data + while ($atomoffset < strlen($atom_data)) { + $boxsmallsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset, 2)); + $boxsmalltype = substr($atom_data, $atomoffset + 2, 2); + $boxsmalldata = substr($atom_data, $atomoffset + 4, $boxsmallsize); + if ($boxsmallsize <= 1) { + $this->warning('Invalid QuickTime atom smallbox size "'.$boxsmallsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset)); + $atom_structure['data'] = null; + $atomoffset = strlen($atom_data); + break; + } + switch ($boxsmalltype) { + case "\x10\xB5": + $atom_structure['data'] = $boxsmalldata; + break; + default: + $this->warning('Unknown QuickTime smallbox type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxsmalltype).'" ('.trim(getid3_lib::PrintHexBytes($boxsmalltype)).') at offset '.$baseoffset); + $atom_structure['data'] = $atom_data; + break; + } + $atomoffset += (4 + $boxsmallsize); + } + } else { + while ($atomoffset < strlen($atom_data)) { + $boxsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset, 4)); + $boxtype = substr($atom_data, $atomoffset + 4, 4); + $boxdata = substr($atom_data, $atomoffset + 8, $boxsize - 8); + if ($boxsize <= 1) { + $this->warning('Invalid QuickTime atom box size "'.$boxsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset)); + $atom_structure['data'] = null; + $atomoffset = strlen($atom_data); + break; + } + $atomoffset += $boxsize; + + switch ($boxtype) { + case 'mean': + case 'name': + $atom_structure[$boxtype] = substr($boxdata, 4); + break; + + case 'data': + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($boxdata, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($boxdata, 1, 3)); + switch ($atom_structure['flags_raw']) { + case 0: // data flag + case 21: // tmpo/cpil flag + switch ($atomname) { + case 'cpil': + case 'hdvd': + case 'pcst': + case 'pgap': + // 8-bit integer (boolean) + $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1)); + break; + + case 'tmpo': + // 16-bit integer + $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 2)); + break; + + case 'disk': + case 'trkn': + // binary + $num = getid3_lib::BigEndian2Int(substr($boxdata, 10, 2)); + $num_total = getid3_lib::BigEndian2Int(substr($boxdata, 12, 2)); + $atom_structure['data'] = empty($num) ? '' : $num; + $atom_structure['data'] .= empty($num_total) ? '' : '/'.$num_total; + break; + + case 'gnre': + // enum + $GenreID = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4)); + $atom_structure['data'] = getid3_id3v1::LookupGenreName($GenreID - 1); + break; + + case 'rtng': + // 8-bit integer + $atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1)); + $atom_structure['data'] = $this->QuicktimeContentRatingLookup($atom_structure[$atomname]); + break; + + case 'stik': + // 8-bit integer (enum) + $atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1)); + $atom_structure['data'] = $this->QuicktimeSTIKLookup($atom_structure[$atomname]); + break; + + case 'sfID': + // 32-bit integer + $atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4)); + $atom_structure['data'] = $this->QuicktimeStoreFrontCodeLookup($atom_structure[$atomname]); + break; + + case 'egid': + case 'purl': + $atom_structure['data'] = substr($boxdata, 8); + break; + + case 'plID': + // 64-bit integer + $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 8)); + break; + + case 'covr': + $atom_structure['data'] = substr($boxdata, 8); + // not a foolproof check, but better than nothing + if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) { + $atom_structure['image_mime'] = 'image/jpeg'; + } elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) { + $atom_structure['image_mime'] = 'image/png'; + } elseif (preg_match('#^GIF#', $atom_structure['data'])) { + $atom_structure['image_mime'] = 'image/gif'; + } + break; + + case 'atID': + case 'cnID': + case 'geID': + case 'tves': + case 'tvsn': + default: + // 32-bit integer + $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4)); + } + break; + + case 1: // text flag + case 13: // image flag + default: + $atom_structure['data'] = substr($boxdata, 8); + if ($atomname == 'covr') { + // not a foolproof check, but better than nothing + if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) { + $atom_structure['image_mime'] = 'image/jpeg'; + } elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) { + $atom_structure['image_mime'] = 'image/png'; + } elseif (preg_match('#^GIF#', $atom_structure['data'])) { + $atom_structure['image_mime'] = 'image/gif'; + } + } + break; + + } + break; + + default: + $this->warning('Unknown QuickTime box type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxtype).'" ('.trim(getid3_lib::PrintHexBytes($boxtype)).') at offset '.$baseoffset); + $atom_structure['data'] = $atom_data; + + } + } + } + } + $this->CopyToAppropriateCommentsSection($atomname, $atom_structure['data'], $atom_structure['name']); + break; + + + case 'play': // auto-PLAY atom + $atom_structure['autoplay'] = (bool) getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + + $info['quicktime']['autoplay'] = $atom_structure['autoplay']; + break; + + + case 'WLOC': // Window LOCation atom + $atom_structure['location_x'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); + $atom_structure['location_y'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); + break; + + + case 'LOOP': // LOOPing atom + case 'SelO': // play SELection Only atom + case 'AllF': // play ALL Frames atom + $atom_structure['data'] = getid3_lib::BigEndian2Int($atom_data); + break; + + + case 'name': // + case 'MCPS': // Media Cleaner PRo + case '@PRM': // adobe PReMiere version + case '@PRQ': // adobe PRemiere Quicktime version + $atom_structure['data'] = $atom_data; + break; + + + case 'cmvd': // Compressed MooV Data atom + // Code by ubergeekØubergeek*tv based on information from + // http://developer.apple.com/quicktime/icefloe/dispatch012.html + $atom_structure['unCompressedSize'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); + + $CompressedFileData = substr($atom_data, 4); + if ($UncompressedHeader = @gzuncompress($CompressedFileData)) { + $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($UncompressedHeader, 0, $atomHierarchy, $ParseAllPossibleAtoms); + } else { + $this->warning('Error decompressing compressed MOV atom at offset '.$atom_structure['offset']); + } + break; + + + case 'dcom': // Data COMpression atom + $atom_structure['compression_id'] = $atom_data; + $atom_structure['compression_text'] = $this->QuicktimeDCOMLookup($atom_data); + break; + + + case 'rdrf': // Reference movie Data ReFerence atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); + $atom_structure['flags']['internal_data'] = (bool) ($atom_structure['flags_raw'] & 0x000001); + + $atom_structure['reference_type_name'] = substr($atom_data, 4, 4); + $atom_structure['reference_length'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); + switch ($atom_structure['reference_type_name']) { + case 'url ': + $atom_structure['url'] = $this->NoNullString(substr($atom_data, 12)); + break; + + case 'alis': + $atom_structure['file_alias'] = substr($atom_data, 12); + break; + + case 'rsrc': + $atom_structure['resource_alias'] = substr($atom_data, 12); + break; + + default: + $atom_structure['data'] = substr($atom_data, 12); + break; + } + break; + + + case 'rmqu': // Reference Movie QUality atom + $atom_structure['movie_quality'] = getid3_lib::BigEndian2Int($atom_data); + break; + + + case 'rmcs': // Reference Movie Cpu Speed atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['cpu_speed_rating'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); + break; + + + case 'rmvc': // Reference Movie Version Check atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['gestalt_selector'] = substr($atom_data, 4, 4); + $atom_structure['gestalt_value_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); + $atom_structure['gestalt_value'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); + $atom_structure['gestalt_check_type'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2)); + break; + + + case 'rmcd': // Reference Movie Component check atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['component_type'] = substr($atom_data, 4, 4); + $atom_structure['component_subtype'] = substr($atom_data, 8, 4); + $atom_structure['component_manufacturer'] = substr($atom_data, 12, 4); + $atom_structure['component_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); + $atom_structure['component_flags_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4)); + $atom_structure['component_min_version'] = getid3_lib::BigEndian2Int(substr($atom_data, 24, 4)); + break; + + + case 'rmdr': // Reference Movie Data Rate atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['data_rate'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + + $atom_structure['data_rate_bps'] = $atom_structure['data_rate'] * 10; + break; + + + case 'rmla': // Reference Movie Language Atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); + + $atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']); + if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) { + $info['comments']['language'][] = $atom_structure['language']; + } + break; + + + case 'ptv ': // Print To Video - defines a movie's full screen mode + // http://developer.apple.com/documentation/QuickTime/APIREF/SOURCESIV/at_ptv-_pg.htm + $atom_structure['display_size_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); + $atom_structure['reserved_1'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); // hardcoded: 0x0000 + $atom_structure['reserved_2'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x0000 + $atom_structure['slide_show_flag'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 1)); + $atom_structure['play_on_open_flag'] = getid3_lib::BigEndian2Int(substr($atom_data, 7, 1)); + + $atom_structure['flags']['play_on_open'] = (bool) $atom_structure['play_on_open_flag']; + $atom_structure['flags']['slide_show'] = (bool) $atom_structure['slide_show_flag']; + + $ptv_lookup[0] = 'normal'; + $ptv_lookup[1] = 'double'; + $ptv_lookup[2] = 'half'; + $ptv_lookup[3] = 'full'; + $ptv_lookup[4] = 'current'; + if (isset($ptv_lookup[$atom_structure['display_size_raw']])) { + $atom_structure['display_size'] = $ptv_lookup[$atom_structure['display_size_raw']]; + } else { + $this->warning('unknown "ptv " display constant ('.$atom_structure['display_size_raw'].')'); + } + break; + + + case 'stsd': // Sample Table Sample Description atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + + // see: https://github.com/JamesHeinrich/getID3/issues/111 + // Some corrupt files have been known to have high bits set in the number_entries field + // This field shouldn't really need to be 32-bits, values stores are likely in the range 1-100000 + // Workaround: mask off the upper byte and throw a warning if it's nonzero + if ($atom_structure['number_entries'] > 0x000FFFFF) { + if ($atom_structure['number_entries'] > 0x00FFFFFF) { + $this->warning('"stsd" atom contains improbably large number_entries (0x'.getid3_lib::PrintHexBytes(substr($atom_data, 4, 4), true, false).' = '.$atom_structure['number_entries'].'), probably in error. Ignoring upper byte and interpreting this as 0x'.getid3_lib::PrintHexBytes(substr($atom_data, 5, 3), true, false).' = '.($atom_structure['number_entries'] & 0x00FFFFFF)); + $atom_structure['number_entries'] = ($atom_structure['number_entries'] & 0x00FFFFFF); + } else { + $this->warning('"stsd" atom contains improbably large number_entries (0x'.getid3_lib::PrintHexBytes(substr($atom_data, 4, 4), true, false).' = '.$atom_structure['number_entries'].'), probably in error. Please report this to info@getid3.org referencing bug report #111'); + } + } + + $stsdEntriesDataOffset = 8; + for ($i = 0; $i < $atom_structure['number_entries']; $i++) { + $atom_structure['sample_description_table'][$i]['size'] = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 4)); + $stsdEntriesDataOffset += 4; + $atom_structure['sample_description_table'][$i]['data_format'] = substr($atom_data, $stsdEntriesDataOffset, 4); + $stsdEntriesDataOffset += 4; + $atom_structure['sample_description_table'][$i]['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 6)); + $stsdEntriesDataOffset += 6; + $atom_structure['sample_description_table'][$i]['reference_index'] = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 2)); + $stsdEntriesDataOffset += 2; + $atom_structure['sample_description_table'][$i]['data'] = substr($atom_data, $stsdEntriesDataOffset, ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2)); + $stsdEntriesDataOffset += ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2); + + $atom_structure['sample_description_table'][$i]['encoder_version'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 0, 2)); + $atom_structure['sample_description_table'][$i]['encoder_revision'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 2, 2)); + $atom_structure['sample_description_table'][$i]['encoder_vendor'] = substr($atom_structure['sample_description_table'][$i]['data'], 4, 4); + + switch ($atom_structure['sample_description_table'][$i]['encoder_vendor']) { + + case "\x00\x00\x00\x00": + // audio tracks + $atom_structure['sample_description_table'][$i]['audio_channels'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 8, 2)); + $atom_structure['sample_description_table'][$i]['audio_bit_depth'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 10, 2)); + $atom_structure['sample_description_table'][$i]['audio_compression_id'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12, 2)); + $atom_structure['sample_description_table'][$i]['audio_packet_size'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 14, 2)); + $atom_structure['sample_description_table'][$i]['audio_sample_rate'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 16, 4)); + + // video tracks + // http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap3/qtff3.html + $atom_structure['sample_description_table'][$i]['temporal_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 8, 4)); + $atom_structure['sample_description_table'][$i]['spatial_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12, 4)); + $atom_structure['sample_description_table'][$i]['width'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16, 2)); + $atom_structure['sample_description_table'][$i]['height'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18, 2)); + $atom_structure['sample_description_table'][$i]['resolution_x'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24, 4)); + $atom_structure['sample_description_table'][$i]['resolution_y'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 28, 4)); + $atom_structure['sample_description_table'][$i]['data_size'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32, 4)); + $atom_structure['sample_description_table'][$i]['frame_count'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 36, 2)); + $atom_structure['sample_description_table'][$i]['compressor_name'] = substr($atom_structure['sample_description_table'][$i]['data'], 38, 4); + $atom_structure['sample_description_table'][$i]['pixel_depth'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 42, 2)); + $atom_structure['sample_description_table'][$i]['color_table_id'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 44, 2)); + + switch ($atom_structure['sample_description_table'][$i]['data_format']) { + case '2vuY': + case 'avc1': + case 'cvid': + case 'dvc ': + case 'dvcp': + case 'gif ': + case 'h263': + case 'jpeg': + case 'kpcd': + case 'mjpa': + case 'mjpb': + case 'mp4v': + case 'png ': + case 'raw ': + case 'rle ': + case 'rpza': + case 'smc ': + case 'SVQ1': + case 'SVQ3': + case 'tiff': + case 'v210': + case 'v216': + case 'v308': + case 'v408': + case 'v410': + case 'yuv2': + $info['fileformat'] = 'mp4'; + $info['video']['fourcc'] = $atom_structure['sample_description_table'][$i]['data_format']; + if ($this->QuicktimeVideoCodecLookup($info['video']['fourcc'])) { + $info['video']['fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($info['video']['fourcc']); + } + + // https://www.getid3.org/phpBB3/viewtopic.php?t=1550 + //if ((!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['width'])) && (empty($info['video']['resolution_x']) || empty($info['video']['resolution_y']) || (number_format($info['video']['resolution_x'], 6) != number_format(round($info['video']['resolution_x']), 6)) || (number_format($info['video']['resolution_y'], 6) != number_format(round($info['video']['resolution_y']), 6)))) { // ugly check for floating point numbers + if (!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['height'])) { + // assume that values stored here are more important than values stored in [tkhd] atom + $info['video']['resolution_x'] = $atom_structure['sample_description_table'][$i]['width']; + $info['video']['resolution_y'] = $atom_structure['sample_description_table'][$i]['height']; + $info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x']; + $info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y']; + } + break; + + case 'qtvr': + $info['video']['dataformat'] = 'quicktimevr'; + break; + + case 'mp4a': + default: + $info['quicktime']['audio']['codec'] = $this->QuicktimeAudioCodecLookup($atom_structure['sample_description_table'][$i]['data_format']); + $info['quicktime']['audio']['sample_rate'] = $atom_structure['sample_description_table'][$i]['audio_sample_rate']; + $info['quicktime']['audio']['channels'] = $atom_structure['sample_description_table'][$i]['audio_channels']; + $info['quicktime']['audio']['bit_depth'] = $atom_structure['sample_description_table'][$i]['audio_bit_depth']; + $info['audio']['codec'] = $info['quicktime']['audio']['codec']; + $info['audio']['sample_rate'] = $info['quicktime']['audio']['sample_rate']; + $info['audio']['channels'] = $info['quicktime']['audio']['channels']; + $info['audio']['bits_per_sample'] = $info['quicktime']['audio']['bit_depth']; + switch ($atom_structure['sample_description_table'][$i]['data_format']) { + case 'raw ': // PCM + case 'alac': // Apple Lossless Audio Codec + case 'sowt': // signed/two's complement (Little Endian) + case 'twos': // signed/two's complement (Big Endian) + case 'in24': // 24-bit Integer + case 'in32': // 32-bit Integer + case 'fl32': // 32-bit Floating Point + case 'fl64': // 64-bit Floating Point + $info['audio']['lossless'] = $info['quicktime']['audio']['lossless'] = true; + $info['audio']['bitrate'] = $info['quicktime']['audio']['bitrate'] = $info['audio']['channels'] * $info['audio']['bits_per_sample'] * $info['audio']['sample_rate']; + break; + default: + $info['audio']['lossless'] = false; + break; + } + break; + } + break; + + default: + switch ($atom_structure['sample_description_table'][$i]['data_format']) { + case 'mp4s': + $info['fileformat'] = 'mp4'; + break; + + default: + // video atom + $atom_structure['sample_description_table'][$i]['video_temporal_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 8, 4)); + $atom_structure['sample_description_table'][$i]['video_spatial_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12, 4)); + $atom_structure['sample_description_table'][$i]['video_frame_width'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16, 2)); + $atom_structure['sample_description_table'][$i]['video_frame_height'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18, 2)); + $atom_structure['sample_description_table'][$i]['video_resolution_x'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 20, 4)); + $atom_structure['sample_description_table'][$i]['video_resolution_y'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24, 4)); + $atom_structure['sample_description_table'][$i]['video_data_size'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 28, 4)); + $atom_structure['sample_description_table'][$i]['video_frame_count'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32, 2)); + $atom_structure['sample_description_table'][$i]['video_encoder_name_len'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 34, 1)); + $atom_structure['sample_description_table'][$i]['video_encoder_name'] = substr($atom_structure['sample_description_table'][$i]['data'], 35, $atom_structure['sample_description_table'][$i]['video_encoder_name_len']); + $atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 66, 2)); + $atom_structure['sample_description_table'][$i]['video_color_table_id'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 68, 2)); + + $atom_structure['sample_description_table'][$i]['video_pixel_color_type'] = (($atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] > 32) ? 'grayscale' : 'color'); + $atom_structure['sample_description_table'][$i]['video_pixel_color_name'] = $this->QuicktimeColorNameLookup($atom_structure['sample_description_table'][$i]['video_pixel_color_depth']); + + if ($atom_structure['sample_description_table'][$i]['video_pixel_color_name'] != 'invalid') { + $info['quicktime']['video']['codec_fourcc'] = $atom_structure['sample_description_table'][$i]['data_format']; + $info['quicktime']['video']['codec_fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($atom_structure['sample_description_table'][$i]['data_format']); + $info['quicktime']['video']['codec'] = (($atom_structure['sample_description_table'][$i]['video_encoder_name_len'] > 0) ? $atom_structure['sample_description_table'][$i]['video_encoder_name'] : $atom_structure['sample_description_table'][$i]['data_format']); + $info['quicktime']['video']['color_depth'] = $atom_structure['sample_description_table'][$i]['video_pixel_color_depth']; + $info['quicktime']['video']['color_depth_name'] = $atom_structure['sample_description_table'][$i]['video_pixel_color_name']; + + $info['video']['codec'] = $info['quicktime']['video']['codec']; + $info['video']['bits_per_sample'] = $info['quicktime']['video']['color_depth']; + } + $info['video']['lossless'] = false; + $info['video']['pixel_aspect_ratio'] = (float) 1; + break; + } + break; + } + switch (strtolower($atom_structure['sample_description_table'][$i]['data_format'])) { + case 'mp4a': + $info['audio']['dataformat'] = 'mp4'; + $info['quicktime']['audio']['codec'] = 'mp4'; + break; + + case '3ivx': + case '3iv1': + case '3iv2': + $info['video']['dataformat'] = '3ivx'; + break; + + case 'xvid': + $info['video']['dataformat'] = 'xvid'; + break; + + case 'mp4v': + $info['video']['dataformat'] = 'mpeg4'; + break; + + case 'divx': + case 'div1': + case 'div2': + case 'div3': + case 'div4': + case 'div5': + case 'div6': + $info['video']['dataformat'] = 'divx'; + break; + + default: + // do nothing + break; + } + unset($atom_structure['sample_description_table'][$i]['data']); + } + break; + + + case 'stts': // Sample Table Time-to-Sample atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $sttsEntriesDataOffset = 8; + //$FrameRateCalculatorArray = array(); + $frames_count = 0; + + $max_stts_entries_to_scan = ($info['php_memory_limit'] ? min(floor($this->getid3->memory_limit / 10000), $atom_structure['number_entries']) : $atom_structure['number_entries']); + if ($max_stts_entries_to_scan < $atom_structure['number_entries']) { + $this->warning('QuickTime atom "stts" has '.$atom_structure['number_entries'].' but only scanning the first '.$max_stts_entries_to_scan.' entries due to limited PHP memory available ('.floor($this->getid3->memory_limit / 1048576).'MB).'); + } + for ($i = 0; $i < $max_stts_entries_to_scan; $i++) { + $atom_structure['time_to_sample_table'][$i]['sample_count'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4)); + $sttsEntriesDataOffset += 4; + $atom_structure['time_to_sample_table'][$i]['sample_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4)); + $sttsEntriesDataOffset += 4; + + $frames_count += $atom_structure['time_to_sample_table'][$i]['sample_count']; + + // THIS SECTION REPLACED WITH CODE IN "stbl" ATOM + //if (!empty($info['quicktime']['time_scale']) && ($atom_structure['time_to_sample_table'][$i]['sample_duration'] > 0)) { + // $stts_new_framerate = $info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration']; + // if ($stts_new_framerate <= 60) { + // // some atoms have durations of "1" giving a very large framerate, which probably is not right + // $info['video']['frame_rate'] = max($info['video']['frame_rate'], $stts_new_framerate); + // } + //} + // + //$FrameRateCalculatorArray[($info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'])] += $atom_structure['time_to_sample_table'][$i]['sample_count']; + } + $info['quicktime']['stts_framecount'][] = $frames_count; + //$sttsFramesTotal = 0; + //$sttsSecondsTotal = 0; + //foreach ($FrameRateCalculatorArray as $frames_per_second => $frame_count) { + // if (($frames_per_second > 60) || ($frames_per_second < 1)) { + // // not video FPS information, probably audio information + // $sttsFramesTotal = 0; + // $sttsSecondsTotal = 0; + // break; + // } + // $sttsFramesTotal += $frame_count; + // $sttsSecondsTotal += $frame_count / $frames_per_second; + //} + //if (($sttsFramesTotal > 0) && ($sttsSecondsTotal > 0)) { + // if (($sttsFramesTotal / $sttsSecondsTotal) > $info['video']['frame_rate']) { + // $info['video']['frame_rate'] = $sttsFramesTotal / $sttsSecondsTotal; + // } + //} + break; + + + case 'stss': // Sample Table Sync Sample (key frames) atom + if ($ParseAllPossibleAtoms) { + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $stssEntriesDataOffset = 8; + for ($i = 0; $i < $atom_structure['number_entries']; $i++) { + $atom_structure['time_to_sample_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stssEntriesDataOffset, 4)); + $stssEntriesDataOffset += 4; + } + } + break; + + + case 'stsc': // Sample Table Sample-to-Chunk atom + if ($ParseAllPossibleAtoms) { + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $stscEntriesDataOffset = 8; + for ($i = 0; $i < $atom_structure['number_entries']; $i++) { + $atom_structure['sample_to_chunk_table'][$i]['first_chunk'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4)); + $stscEntriesDataOffset += 4; + $atom_structure['sample_to_chunk_table'][$i]['samples_per_chunk'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4)); + $stscEntriesDataOffset += 4; + $atom_structure['sample_to_chunk_table'][$i]['sample_description'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4)); + $stscEntriesDataOffset += 4; + } + } + break; + + + case 'stsz': // Sample Table SiZe atom + if ($ParseAllPossibleAtoms) { + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['sample_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); + $stszEntriesDataOffset = 12; + if ($atom_structure['sample_size'] == 0) { + for ($i = 0; $i < $atom_structure['number_entries']; $i++) { + $atom_structure['sample_size_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stszEntriesDataOffset, 4)); + $stszEntriesDataOffset += 4; + } + } + } + break; + + + case 'stco': // Sample Table Chunk Offset atom + if ($ParseAllPossibleAtoms) { + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $stcoEntriesDataOffset = 8; + for ($i = 0; $i < $atom_structure['number_entries']; $i++) { + $atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 4)); + $stcoEntriesDataOffset += 4; + } + } + break; + + + case 'co64': // Chunk Offset 64-bit (version of "stco" that supports > 2GB files) + if ($ParseAllPossibleAtoms) { + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $stcoEntriesDataOffset = 8; + for ($i = 0; $i < $atom_structure['number_entries']; $i++) { + $atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 8)); + $stcoEntriesDataOffset += 8; + } + } + break; + + + case 'dref': // Data REFerence atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $drefDataOffset = 8; + for ($i = 0; $i < $atom_structure['number_entries']; $i++) { + $atom_structure['data_references'][$i]['size'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 4)); + $drefDataOffset += 4; + $atom_structure['data_references'][$i]['type'] = substr($atom_data, $drefDataOffset, 4); + $drefDataOffset += 4; + $atom_structure['data_references'][$i]['version'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 1)); + $drefDataOffset += 1; + $atom_structure['data_references'][$i]['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 3)); // hardcoded: 0x0000 + $drefDataOffset += 3; + $atom_structure['data_references'][$i]['data'] = substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3)); + $drefDataOffset += ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3); + + $atom_structure['data_references'][$i]['flags']['self_reference'] = (bool) ($atom_structure['data_references'][$i]['flags_raw'] & 0x001); + } + break; + + + case 'gmin': // base Media INformation atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); + $atom_structure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)); + $atom_structure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 2)); + $atom_structure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); + $atom_structure['balance'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 2)); + $atom_structure['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2)); + break; + + + case 'smhd': // Sound Media information HeaDer atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['balance'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); + $atom_structure['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)); + break; + + + case 'vmhd': // Video Media information HeaDer atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); + $atom_structure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); + $atom_structure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)); + $atom_structure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 2)); + $atom_structure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); + + $atom_structure['flags']['no_lean_ahead'] = (bool) ($atom_structure['flags_raw'] & 0x001); + break; + + + case 'hdlr': // HanDLeR reference atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['component_type'] = substr($atom_data, 4, 4); + $atom_structure['component_subtype'] = substr($atom_data, 8, 4); + $atom_structure['component_manufacturer'] = substr($atom_data, 12, 4); + $atom_structure['component_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); + $atom_structure['component_flags_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4)); + $atom_structure['component_name'] = $this->Pascal2String(substr($atom_data, 24)); + + if (($atom_structure['component_subtype'] == 'STpn') && ($atom_structure['component_manufacturer'] == 'zzzz')) { + $info['video']['dataformat'] = 'quicktimevr'; + } + break; + + + case 'mdhd': // MeDia HeaDer atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); + $atom_structure['time_scale'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); + $atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); + $atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 2)); + $atom_structure['quality'] = getid3_lib::BigEndian2Int(substr($atom_data, 22, 2)); + + if ($atom_structure['time_scale'] == 0) { + $this->error('Corrupt Quicktime file: mdhd.time_scale == zero'); + return false; + } + $info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']); + + $atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']); + $atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']); + $atom_structure['playtime_seconds'] = $atom_structure['duration'] / $atom_structure['time_scale']; + $atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']); + if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) { + $info['comments']['language'][] = $atom_structure['language']; + } + break; + + + case 'pnot': // Preview atom + $atom_structure['modification_date'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); // "standard Macintosh format" + $atom_structure['version_number'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x00 + $atom_structure['atom_type'] = substr($atom_data, 6, 4); // usually: 'PICT' + $atom_structure['atom_index'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); // usually: 0x01 + + $atom_structure['modification_date_unix'] = getid3_lib::DateMac2Unix($atom_structure['modification_date']); + break; + + + case 'crgn': // Clipping ReGioN atom + $atom_structure['region_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); // The Region size, Region boundary box, + $atom_structure['boundary_box'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 8)); // and Clipping region data fields + $atom_structure['clipping_data'] = substr($atom_data, 10); // constitute a QuickDraw region. + break; + + + case 'load': // track LOAD settings atom + $atom_structure['preload_start_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); + $atom_structure['preload_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $atom_structure['preload_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); + $atom_structure['default_hints_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); + + $atom_structure['default_hints']['double_buffer'] = (bool) ($atom_structure['default_hints_raw'] & 0x0020); + $atom_structure['default_hints']['high_quality'] = (bool) ($atom_structure['default_hints_raw'] & 0x0100); + break; + + + case 'tmcd': // TiMe CoDe atom + case 'chap': // CHAPter list atom + case 'sync': // SYNChronization atom + case 'scpt': // tranSCriPT atom + case 'ssrc': // non-primary SouRCe atom + for ($i = 0; $i < strlen($atom_data); $i += 4) { + @$atom_structure['track_id'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4)); + } + break; + + + case 'elst': // Edit LiST atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + for ($i = 0; $i < $atom_structure['number_entries']; $i++ ) { + $atom_structure['edit_list'][$i]['track_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 0, 4)); + $atom_structure['edit_list'][$i]['media_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 4, 4)); + $atom_structure['edit_list'][$i]['media_rate'] = getid3_lib::FixedPoint16_16(substr($atom_data, 8 + ($i * 12) + 8, 4)); + } + break; + + + case 'kmat': // compressed MATte atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 + $atom_structure['matte_data_raw'] = substr($atom_data, 4); + break; + + + case 'ctab': // Color TABle atom + $atom_structure['color_table_seed'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); // hardcoded: 0x00000000 + $atom_structure['color_table_flags'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x8000 + $atom_structure['color_table_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)) + 1; + for ($colortableentry = 0; $colortableentry < $atom_structure['color_table_size']; $colortableentry++) { + $atom_structure['color_table'][$colortableentry]['alpha'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 0, 2)); + $atom_structure['color_table'][$colortableentry]['red'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 2, 2)); + $atom_structure['color_table'][$colortableentry]['green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 4, 2)); + $atom_structure['color_table'][$colortableentry]['blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 6, 2)); + } + break; + + + case 'mvhd': // MoVie HeaDer atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); + $atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); + $atom_structure['time_scale'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); + $atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); + $atom_structure['preferred_rate'] = getid3_lib::FixedPoint16_16(substr($atom_data, 20, 4)); + $atom_structure['preferred_volume'] = getid3_lib::FixedPoint8_8(substr($atom_data, 24, 2)); + $atom_structure['reserved'] = substr($atom_data, 26, 10); + $atom_structure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atom_data, 36, 4)); + $atom_structure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4)); + $atom_structure['matrix_u'] = getid3_lib::FixedPoint2_30(substr($atom_data, 44, 4)); + $atom_structure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atom_data, 48, 4)); + $atom_structure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4)); + $atom_structure['matrix_v'] = getid3_lib::FixedPoint2_30(substr($atom_data, 56, 4)); + $atom_structure['matrix_x'] = getid3_lib::FixedPoint16_16(substr($atom_data, 60, 4)); + $atom_structure['matrix_y'] = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4)); + $atom_structure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atom_data, 68, 4)); + $atom_structure['preview_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 72, 4)); + $atom_structure['preview_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 76, 4)); + $atom_structure['poster_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 80, 4)); + $atom_structure['selection_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 84, 4)); + $atom_structure['selection_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 88, 4)); + $atom_structure['current_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 92, 4)); + $atom_structure['next_track_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 96, 4)); + + if ($atom_structure['time_scale'] == 0) { + $this->error('Corrupt Quicktime file: mvhd.time_scale == zero'); + return false; + } + $atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']); + $atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']); + $info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']); + $info['quicktime']['display_scale'] = $atom_structure['matrix_a']; + $info['playtime_seconds'] = $atom_structure['duration'] / $atom_structure['time_scale']; + break; + + + case 'tkhd': // TracK HeaDer atom + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); + $atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); + $atom_structure['trackid'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); + $atom_structure['reserved1'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); + $atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4)); + $atom_structure['reserved2'] = getid3_lib::BigEndian2Int(substr($atom_data, 24, 8)); + $atom_structure['layer'] = getid3_lib::BigEndian2Int(substr($atom_data, 32, 2)); + $atom_structure['alternate_group'] = getid3_lib::BigEndian2Int(substr($atom_data, 34, 2)); + $atom_structure['volume'] = getid3_lib::FixedPoint8_8(substr($atom_data, 36, 2)); + $atom_structure['reserved3'] = getid3_lib::BigEndian2Int(substr($atom_data, 38, 2)); + // http://developer.apple.com/library/mac/#documentation/QuickTime/RM/MovieBasics/MTEditing/K-Chapter/11MatrixFunctions.html + // http://developer.apple.com/library/mac/#documentation/QuickTime/qtff/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-18737 + $atom_structure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4)); + $atom_structure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atom_data, 44, 4)); + $atom_structure['matrix_u'] = getid3_lib::FixedPoint2_30(substr($atom_data, 48, 4)); + $atom_structure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4)); + $atom_structure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atom_data, 56, 4)); + $atom_structure['matrix_v'] = getid3_lib::FixedPoint2_30(substr($atom_data, 60, 4)); + $atom_structure['matrix_x'] = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4)); + $atom_structure['matrix_y'] = getid3_lib::FixedPoint16_16(substr($atom_data, 68, 4)); + $atom_structure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atom_data, 72, 4)); + $atom_structure['width'] = getid3_lib::FixedPoint16_16(substr($atom_data, 76, 4)); + $atom_structure['height'] = getid3_lib::FixedPoint16_16(substr($atom_data, 80, 4)); + $atom_structure['flags']['enabled'] = (bool) ($atom_structure['flags_raw'] & 0x0001); + $atom_structure['flags']['in_movie'] = (bool) ($atom_structure['flags_raw'] & 0x0002); + $atom_structure['flags']['in_preview'] = (bool) ($atom_structure['flags_raw'] & 0x0004); + $atom_structure['flags']['in_poster'] = (bool) ($atom_structure['flags_raw'] & 0x0008); + $atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']); + $atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']); + + // https://www.getid3.org/phpBB3/viewtopic.php?t=1908 + // attempt to compute rotation from matrix values + // 2017-Dec-28: uncertain if 90/270 are correctly oriented; values returned by FixedPoint16_16 should perhaps be -1 instead of 65535(?) + $matrixRotation = 0; + switch ($atom_structure['matrix_a'].':'.$atom_structure['matrix_b'].':'.$atom_structure['matrix_c'].':'.$atom_structure['matrix_d']) { + case '1:0:0:1': $matrixRotation = 0; break; + case '0:1:65535:0': $matrixRotation = 90; break; + case '65535:0:0:65535': $matrixRotation = 180; break; + case '0:65535:1:0': $matrixRotation = 270; break; + default: break; + } + + // https://www.getid3.org/phpBB3/viewtopic.php?t=2468 + // The rotation matrix can appear in the Quicktime file multiple times, at least once for each track, + // and it's possible that only the video track (or, in theory, one of the video tracks) is flagged as + // rotated while the other tracks (e.g. audio) is tagged as rotation=0 (behavior noted on iPhone 8 Plus) + // The correct solution would be to check if the TrackID associated with the rotation matrix is indeed + // a video track (or the main video track) and only set the rotation then, but since information about + // what track is what is not trivially there to be examined, the lazy solution is to set the rotation + // if it is found to be nonzero, on the assumption that tracks that don't need it will have rotation set + // to zero (and be effectively ignored) and the video track will have rotation set correctly, which will + // either be zero and automatically correct, or nonzero and be set correctly. + if (!isset($info['video']['rotate']) || (($info['video']['rotate'] == 0) && ($matrixRotation > 0))) { + $info['quicktime']['video']['rotate'] = $info['video']['rotate'] = $matrixRotation; + } + + if ($atom_structure['flags']['enabled'] == 1) { + if (!isset($info['video']['resolution_x']) || !isset($info['video']['resolution_y'])) { + $info['video']['resolution_x'] = $atom_structure['width']; + $info['video']['resolution_y'] = $atom_structure['height']; + } + $info['video']['resolution_x'] = max($info['video']['resolution_x'], $atom_structure['width']); + $info['video']['resolution_y'] = max($info['video']['resolution_y'], $atom_structure['height']); + $info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x']; + $info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y']; + } else { + // see: https://www.getid3.org/phpBB3/viewtopic.php?t=1295 + //if (isset($info['video']['resolution_x'])) { unset($info['video']['resolution_x']); } + //if (isset($info['video']['resolution_y'])) { unset($info['video']['resolution_y']); } + //if (isset($info['quicktime']['video'])) { unset($info['quicktime']['video']); } + } + break; + + + case 'iods': // Initial Object DeScriptor atom + // http://www.koders.com/c/fid1FAB3E762903DC482D8A246D4A4BF9F28E049594.aspx?s=windows.h + // http://libquicktime.sourcearchive.com/documentation/1.0.2plus-pdebian/iods_8c-source.html + $offset = 0; + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); + $offset += 1; + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 3)); + $offset += 3; + $atom_structure['mp4_iod_tag'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); + $offset += 1; + $atom_structure['length'] = $this->quicktime_read_mp4_descr_length($atom_data, $offset); + //$offset already adjusted by quicktime_read_mp4_descr_length() + $atom_structure['object_descriptor_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2)); + $offset += 2; + $atom_structure['od_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); + $offset += 1; + $atom_structure['scene_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); + $offset += 1; + $atom_structure['audio_profile_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); + $offset += 1; + $atom_structure['video_profile_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); + $offset += 1; + $atom_structure['graphics_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); + $offset += 1; + + $atom_structure['num_iods_tracks'] = ($atom_structure['length'] - 7) / 6; // 6 bytes would only be right if all tracks use 1-byte length fields + for ($i = 0; $i < $atom_structure['num_iods_tracks']; $i++) { + $atom_structure['track'][$i]['ES_ID_IncTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); + $offset += 1; + $atom_structure['track'][$i]['length'] = $this->quicktime_read_mp4_descr_length($atom_data, $offset); + //$offset already adjusted by quicktime_read_mp4_descr_length() + $atom_structure['track'][$i]['track_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4)); + $offset += 4; + } + + $atom_structure['audio_profile_name'] = $this->QuicktimeIODSaudioProfileName($atom_structure['audio_profile_id']); + $atom_structure['video_profile_name'] = $this->QuicktimeIODSvideoProfileName($atom_structure['video_profile_id']); + break; + + case 'ftyp': // FileTYPe (?) atom (for MP4 it seems) + $atom_structure['signature'] = substr($atom_data, 0, 4); + $atom_structure['unknown_1'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $atom_structure['fourcc'] = substr($atom_data, 8, 4); + break; + + case 'mdat': // Media DATa atom + // 'mdat' contains the actual data for the audio/video, possibly also subtitles + + /* due to lack of known documentation, this is a kludge implementation. If you know of documentation on how mdat is properly structed, please send it to info@getid3.org */ + + // first, skip any 'wide' padding, and second 'mdat' header (with specified size of zero?) + $mdat_offset = 0; + while (true) { + if (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x08".'wide') { + $mdat_offset += 8; + } elseif (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x00".'mdat') { + $mdat_offset += 8; + } else { + break; + } + } + if (substr($atom_data, $mdat_offset, 4) == 'GPRO') { + $GOPRO_chunk_length = getid3_lib::LittleEndian2Int(substr($atom_data, $mdat_offset + 4, 4)); + $GOPRO_offset = 8; + $atom_structure['GPRO']['raw'] = substr($atom_data, $mdat_offset + 8, $GOPRO_chunk_length - 8); + $atom_structure['GPRO']['firmware'] = substr($atom_structure['GPRO']['raw'], 0, 15); + $atom_structure['GPRO']['unknown1'] = substr($atom_structure['GPRO']['raw'], 15, 16); + $atom_structure['GPRO']['unknown2'] = substr($atom_structure['GPRO']['raw'], 31, 32); + $atom_structure['GPRO']['unknown3'] = substr($atom_structure['GPRO']['raw'], 63, 16); + $atom_structure['GPRO']['camera'] = substr($atom_structure['GPRO']['raw'], 79, 32); + $info['quicktime']['camera']['model'] = rtrim($atom_structure['GPRO']['camera'], "\x00"); + } + + // check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field + while (($mdat_offset < (strlen($atom_data) - 8)) + && ($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2))) + && ($chapter_string_length < 1000) + && ($chapter_string_length <= (strlen($atom_data) - $mdat_offset - 2)) + && preg_match('#^([\x00-\xFF]{2})([\x20-\xFF]+)$#', substr($atom_data, $mdat_offset, $chapter_string_length + 2), $chapter_matches)) { + list($dummy, $chapter_string_length_hex, $chapter_string) = $chapter_matches; + $mdat_offset += (2 + $chapter_string_length); + @$info['quicktime']['comments']['chapters'][] = $chapter_string; + + // "encd" atom specifies encoding. In theory could be anything, almost always UTF-8, but may be UTF-16 with BOM (not currently handled) + if (substr($atom_data, $mdat_offset, 12) == "\x00\x00\x00\x0C\x65\x6E\x63\x64\x00\x00\x01\x00") { // UTF-8 + $mdat_offset += 12; + } + } + + if (($atomsize > 8) && (!isset($info['avdataend_tmp']) || ($info['quicktime'][$atomname]['size'] > ($info['avdataend_tmp'] - $info['avdataoffset'])))) { + + $info['avdataoffset'] = $atom_structure['offset'] + 8; // $info['quicktime'][$atomname]['offset'] + 8; + $OldAVDataEnd = $info['avdataend']; + $info['avdataend'] = $atom_structure['offset'] + $atom_structure['size']; // $info['quicktime'][$atomname]['offset'] + $info['quicktime'][$atomname]['size']; + + $getid3_temp = new getID3(); + $getid3_temp->openfile($this->getid3->filename); + $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; + $getid3_temp->info['avdataend'] = $info['avdataend']; + $getid3_mp3 = new getid3_mp3($getid3_temp); + if ($getid3_mp3->MPEGaudioHeaderValid($getid3_mp3->MPEGaudioHeaderDecode($this->fread(4)))) { + $getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false); + if (!empty($getid3_temp->info['warning'])) { + foreach ($getid3_temp->info['warning'] as $value) { + $this->warning($value); + } + } + if (!empty($getid3_temp->info['mpeg'])) { + $info['mpeg'] = $getid3_temp->info['mpeg']; + if (isset($info['mpeg']['audio'])) { + $info['audio']['dataformat'] = 'mp3'; + $info['audio']['codec'] = (!empty($info['mpeg']['audio']['encoder']) ? $info['mpeg']['audio']['encoder'] : (!empty($info['mpeg']['audio']['codec']) ? $info['mpeg']['audio']['codec'] : (!empty($info['mpeg']['audio']['LAME']) ? 'LAME' :'mp3'))); + $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; + $info['audio']['channels'] = $info['mpeg']['audio']['channels']; + $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; + $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); + $info['bitrate'] = $info['audio']['bitrate']; + } + } + } + unset($getid3_mp3, $getid3_temp); + $info['avdataend'] = $OldAVDataEnd; + unset($OldAVDataEnd); + + } + + unset($mdat_offset, $chapter_string_length, $chapter_matches); + break; + + case 'free': // FREE space atom + case 'skip': // SKIP atom + case 'wide': // 64-bit expansion placeholder atom + // 'free', 'skip' and 'wide' are just padding, contains no useful data at all + + // When writing QuickTime files, it is sometimes necessary to update an atom's size. + // It is impossible to update a 32-bit atom to a 64-bit atom since the 32-bit atom + // is only 8 bytes in size, and the 64-bit atom requires 16 bytes. Therefore, QuickTime + // puts an 8-byte placeholder atom before any atoms it may have to update the size of. + // In this way, if the atom needs to be converted from a 32-bit to a 64-bit atom, the + // placeholder atom can be overwritten to obtain the necessary 8 extra bytes. + // The placeholder atom has a type of kWideAtomPlaceholderType ( 'wide' ). + break; + + + case 'nsav': // NoSAVe atom + // http://developer.apple.com/technotes/tn/tn2038.html + $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); + break; + + case 'ctyp': // Controller TYPe atom (seen on QTVR) + // http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt + // some controller names are: + // 0x00 + 'std' for linear movie + // 'none' for no controls + $atom_structure['ctyp'] = substr($atom_data, 0, 4); + $info['quicktime']['controller'] = $atom_structure['ctyp']; + switch ($atom_structure['ctyp']) { + case 'qtvr': + $info['video']['dataformat'] = 'quicktimevr'; + break; + } + break; + + case 'pano': // PANOrama track (seen on QTVR) + $atom_structure['pano'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); + break; + + case 'hint': // HINT track + case 'hinf': // + case 'hinv': // + case 'hnti': // + $info['quicktime']['hinting'] = true; + break; + + case 'imgt': // IMaGe Track reference (kQTVRImageTrackRefType) (seen on QTVR) + for ($i = 0; $i < ($atom_structure['size'] - 8); $i += 4) { + $atom_structure['imgt'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4)); + } + break; + + + // Observed-but-not-handled atom types are just listed here to prevent warnings being generated + case 'FXTC': // Something to do with Adobe After Effects (?) + case 'PrmA': + case 'code': + case 'FIEL': // this is NOT "fiel" (Field Ordering) as describe here: http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html + case 'tapt': // TrackApertureModeDimensionsAID - http://developer.apple.com/documentation/QuickTime/Reference/QT7-1_Update_Reference/Constants/Constants.html + // tapt seems to be used to compute the video size [https://www.getid3.org/phpBB3/viewtopic.php?t=838] + // * http://lists.apple.com/archives/quicktime-api/2006/Aug/msg00014.html + // * http://handbrake.fr/irclogs/handbrake-dev/handbrake-dev20080128_pg2.html + case 'ctts':// STCompositionOffsetAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html + case 'cslg':// STCompositionShiftLeastGreatestAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html + case 'sdtp':// STSampleDependencyAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html + case 'stps':// STPartialSyncSampleAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html + //$atom_structure['data'] = $atom_data; + break; + + case "\xA9".'xyz': // GPS latitude+longitude+altitude + $atom_structure['data'] = $atom_data; + if (preg_match('#([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)?/$#i', $atom_data, $matches)) { + @list($all, $latitude, $longitude, $altitude) = $matches; + $info['quicktime']['comments']['gps_latitude'][] = floatval($latitude); + $info['quicktime']['comments']['gps_longitude'][] = floatval($longitude); + if (!empty($altitude)) { + $info['quicktime']['comments']['gps_altitude'][] = floatval($altitude); + } + } else { + $this->warning('QuickTime atom "©xyz" data does not match expected data pattern at offset '.$baseoffset.'. Please report as getID3() bug.'); + } + break; + + case 'NCDT': + // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html + // Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100 + $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms); + break; + case 'NCTH': // Nikon Camera THumbnail image + case 'NCVW': // Nikon Camera preVieW image + // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html + if (preg_match('/^\xFF\xD8\xFF/', $atom_data)) { + $atom_structure['data'] = $atom_data; + $atom_structure['image_mime'] = 'image/jpeg'; + $atom_structure['description'] = (($atomname == 'NCTH') ? 'Nikon Camera Thumbnail Image' : (($atomname == 'NCVW') ? 'Nikon Camera Preview Image' : 'Nikon preview image')); + $info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_data, 'description'=>$atom_structure['description']); + } + break; + case 'NCTG': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG + $atom_structure['data'] = $this->QuicktimeParseNikonNCTG($atom_data); + break; + case 'NCHD': // Nikon:MakerNoteVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html + case 'NCDB': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html + case 'CNCV': // Canon:CompressorVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html + $atom_structure['data'] = $atom_data; + break; + + case "\x00\x00\x00\x00": + // some kind of metacontainer, may contain a big data dump such as: + // mdta keys \005 mdtacom.apple.quicktime.make (mdtacom.apple.quicktime.creationdate ,mdtacom.apple.quicktime.location.ISO6709 $mdtacom.apple.quicktime.software !mdtacom.apple.quicktime.model ilst \01D \001 \015data \001DE\010Apple 0 \002 (data \001DE\0102011-05-11T17:54:04+0200 2 \003 *data \001DE\010+52.4936+013.3897+040.247/ \01D \004 \015data \001DE\0104.3.1 \005 \018data \001DE\010iPhone 4 + // http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt + + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); + $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); + //$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); + break; + + case 'meta': // METAdata atom + // https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html + + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); + $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); + break; + + case 'data': // metaDATA atom + static $metaDATAkey = 1; // real ugly, but so is the QuickTime structure that stores keys and values in different multinested locations that are hard to relate to each other + // seems to be 2 bytes language code (ASCII), 2 bytes unknown (set to 0x10B5 in sample I have), remainder is useful data + $atom_structure['language'] = substr($atom_data, 4 + 0, 2); + $atom_structure['unknown'] = getid3_lib::BigEndian2Int(substr($atom_data, 4 + 2, 2)); + $atom_structure['data'] = substr($atom_data, 4 + 4); + $atom_structure['key_name'] = @$info['quicktime']['temp_meta_key_names'][$metaDATAkey++]; + + if ($atom_structure['key_name'] && $atom_structure['data']) { + @$info['quicktime']['comments'][str_replace('com.apple.quicktime.', '', $atom_structure['key_name'])][] = $atom_structure['data']; + } + break; + + case 'keys': // KEYS that may be present in the metadata atom. + // https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW21 + // The metadata item keys atom holds a list of the metadata keys that may be present in the metadata atom. + // This list is indexed starting with 1; 0 is a reserved index value. The metadata item keys atom is a full atom with an atom type of "keys". + $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); + $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); + $atom_structure['entry_count'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); + $keys_atom_offset = 8; + for ($i = 1; $i <= $atom_structure['entry_count']; $i++) { + $atom_structure['keys'][$i]['key_size'] = getid3_lib::BigEndian2Int(substr($atom_data, $keys_atom_offset + 0, 4)); + $atom_structure['keys'][$i]['key_namespace'] = substr($atom_data, $keys_atom_offset + 4, 4); + $atom_structure['keys'][$i]['key_value'] = substr($atom_data, $keys_atom_offset + 8, $atom_structure['keys'][$i]['key_size'] - 8); + $keys_atom_offset += $atom_structure['keys'][$i]['key_size']; // key_size includes the 4+4 bytes for key_size and key_namespace + + $info['quicktime']['temp_meta_key_names'][$i] = $atom_structure['keys'][$i]['key_value']; + } + break; + + case 'gps ': + // https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730 + // The 'gps ' contains simple look up table made up of 8byte rows, that point to the 'free' atoms that contains the actual GPS data. + // The first row is version/metadata/notsure, I skip that. + // The following rows consist of 4byte address (absolute) and 4byte size (0x1000), these point to the GPS data in the file. + + $GPS_rowsize = 8; // 4 bytes for offset, 4 bytes for size + if (strlen($atom_data) > 0) { + if ((strlen($atom_data) % $GPS_rowsize) == 0) { + $atom_structure['gps_toc'] = array(); + foreach (str_split($atom_data, $GPS_rowsize) as $counter => $datapair) { + $atom_structure['gps_toc'][] = unpack('Noffset/Nsize', substr($atom_data, $counter * $GPS_rowsize, $GPS_rowsize)); + } + + $atom_structure['gps_entries'] = array(); + $previous_offset = $this->ftell(); + foreach ($atom_structure['gps_toc'] as $key => $gps_pointer) { + if ($key == 0) { + // "The first row is version/metadata/notsure, I skip that." + continue; + } + $this->fseek($gps_pointer['offset']); + $GPS_free_data = $this->fread($gps_pointer['size']); + + /* + // 2017-05-10: I see some of the data, notably the Hour-Minute-Second, but cannot reconcile the rest of the data. However, the NMEA "GPRMC" line is there and relatively easy to parse, so I'm using that instead + + // https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730 + // The structure of the GPS data atom (the 'free' atoms mentioned above) is following: + // hour,minute,second,year,month,day,active,latitude_b,longitude_b,unknown2,latitude,longitude,speed = struct.unpack_from(' 90) ? 1900 : 2000); // complete lack of foresight: datestamps are stored with 2-digit years, take best guess + $GPS_this_GPRMC['timestamp'] = $year.'-'.$month.'-'.$day.' '.$hour.':'.$minute.':'.$second.$ms; + + $GPS_this_GPRMC['active'] = ($GPS_this_GPRMC['raw']['status'] == 'A'); // A=Active,V=Void + + foreach (array('latitude','longitude') as $latlon) { + preg_match('#^([0-9]{1,3})([0-9]{2}\\.[0-9]+)$#', $GPS_this_GPRMC['raw'][$latlon], $matches); + list($dummy, $deg, $min) = $matches; + $GPS_this_GPRMC[$latlon] = $deg + ($min / 60); + } + $GPS_this_GPRMC['latitude'] *= (($GPS_this_GPRMC['raw']['latitude_direction'] == 'S') ? -1 : 1); + $GPS_this_GPRMC['longitude'] *= (($GPS_this_GPRMC['raw']['longitude_direction'] == 'W') ? -1 : 1); + + $GPS_this_GPRMC['heading'] = $GPS_this_GPRMC['raw']['angle']; + $GPS_this_GPRMC['speed_knot'] = $GPS_this_GPRMC['raw']['knots']; + $GPS_this_GPRMC['speed_kmh'] = $GPS_this_GPRMC['raw']['knots'] * 1.852; + if ($GPS_this_GPRMC['raw']['variation']) { + $GPS_this_GPRMC['variation'] = $GPS_this_GPRMC['raw']['variation']; + $GPS_this_GPRMC['variation'] *= (($GPS_this_GPRMC['raw']['variation_direction'] == 'W') ? -1 : 1); + } + + $atom_structure['gps_entries'][$key] = $GPS_this_GPRMC; + + @$info['quicktime']['gps_track'][$GPS_this_GPRMC['timestamp']] = array( + 'latitude' => (float) $GPS_this_GPRMC['latitude'], + 'longitude' => (float) $GPS_this_GPRMC['longitude'], + 'speed_kmh' => (float) $GPS_this_GPRMC['speed_kmh'], + 'heading' => (float) $GPS_this_GPRMC['heading'], + ); + + } else { + $this->warning('Unhandled GPS format in "free" atom at offset '.$gps_pointer['offset']); + } + } + $this->fseek($previous_offset); + + } else { + $this->warning('QuickTime atom "'.$atomname.'" is not mod-8 bytes long ('.$atomsize.' bytes) at offset '.$baseoffset); + } + } else { + $this->warning('QuickTime atom "'.$atomname.'" is zero bytes long at offset '.$baseoffset); + } + break; + + case 'loci':// 3GP location (El Loco) + $loffset = 0; + $info['quicktime']['comments']['gps_flags'] = array( getid3_lib::BigEndian2Int(substr($atom_data, 0, 4))); + $info['quicktime']['comments']['gps_lang'] = array( getid3_lib::BigEndian2Int(substr($atom_data, 4, 2))); + $info['quicktime']['comments']['gps_location'] = array( $this->LociString(substr($atom_data, 6), $loffset)); + $loci_data = substr($atom_data, 6 + $loffset); + $info['quicktime']['comments']['gps_role'] = array( getid3_lib::BigEndian2Int(substr($loci_data, 0, 1))); + $info['quicktime']['comments']['gps_longitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 1, 4))); + $info['quicktime']['comments']['gps_latitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 5, 4))); + $info['quicktime']['comments']['gps_altitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 9, 4))); + $info['quicktime']['comments']['gps_body'] = array( $this->LociString(substr($loci_data, 13 ), $loffset)); + $info['quicktime']['comments']['gps_notes'] = array( $this->LociString(substr($loci_data, 13 + $loffset), $loffset)); + break; + + case 'chpl': // CHaPter List + // https://www.adobe.com/content/dam/Adobe/en/devnet/flv/pdfs/video_file_format_spec_v10.pdf + $chpl_version = getid3_lib::BigEndian2Int(substr($atom_data, 4, 1)); // Expected to be 0 + $chpl_flags = getid3_lib::BigEndian2Int(substr($atom_data, 5, 3)); // Reserved, set to 0 + $chpl_count = getid3_lib::BigEndian2Int(substr($atom_data, 8, 1)); + $chpl_offset = 9; + for ($i = 0; $i < $chpl_count; $i++) { + if (($chpl_offset + 9) >= strlen($atom_data)) { + $this->warning('QuickTime chapter '.$i.' extends beyond end of "chpl" atom'); + break; + } + $info['quicktime']['chapters'][$i]['timestamp'] = getid3_lib::BigEndian2Int(substr($atom_data, $chpl_offset, 8)) / 10000000; // timestamps are stored as 100-nanosecond units + $chpl_offset += 8; + $chpl_title_size = getid3_lib::BigEndian2Int(substr($atom_data, $chpl_offset, 1)); + $chpl_offset += 1; + $info['quicktime']['chapters'][$i]['title'] = substr($atom_data, $chpl_offset, $chpl_title_size); + $chpl_offset += $chpl_title_size; + } + break; + + case 'FIRM': // FIRMware version(?), seen on GoPro Hero4 + $info['quicktime']['camera']['firmware'] = $atom_data; + break; + + case 'CAME': // FIRMware version(?), seen on GoPro Hero4 + $info['quicktime']['camera']['serial_hash'] = unpack('H*', $atom_data); + break; + + case 'dscp': + case 'rcif': + // https://www.getid3.org/phpBB3/viewtopic.php?t=1908 + if (substr($atom_data, 0, 7) == "\x00\x00\x00\x00\x55\xC4".'{') { + if ($json_decoded = @json_decode(rtrim(substr($atom_data, 6), "\x00"), true)) { + $info['quicktime']['camera'][$atomname] = $json_decoded; + if (($atomname == 'rcif') && isset($info['quicktime']['camera']['rcif']['wxcamera']['rotate'])) { + $info['video']['rotate'] = $info['quicktime']['video']['rotate'] = $info['quicktime']['camera']['rcif']['wxcamera']['rotate']; + } + } else { + $this->warning('Failed to JSON decode atom "'.$atomname.'"'); + $atom_structure['data'] = $atom_data; + } + unset($json_decoded); + } else { + $this->warning('Expecting 55 C4 7B at start of atom "'.$atomname.'", found '.getid3_lib::PrintHexBytes(substr($atom_data, 4, 3)).' instead'); + $atom_structure['data'] = $atom_data; + } + break; + + case 'frea': + // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea + // may contain "scra" (PreviewImage) and/or "thma" (ThumbnailImage) + $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms); + break; + case 'tima': // subatom to "frea" + // no idea what this does, the one sample file I've seen has a value of 0x00000027 + $atom_structure['data'] = $atom_data; + break; + case 'ver ': // subatom to "frea" + // some kind of version number, the one sample file I've seen has a value of "3.00.073" + $atom_structure['data'] = $atom_data; + break; + case 'thma': // subatom to "frea" -- "ThumbnailImage" + // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea + if (strlen($atom_data) > 0) { + $info['quicktime']['comments']['picture'][] = array('data'=>$atom_data, 'image_mime'=>'image/jpeg'); + } + break; + case 'scra': // subatom to "frea" -- "PreviewImage" + // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea + // but the only sample file I've seen has no useful data here + if (strlen($atom_data) > 0) { + $info['quicktime']['comments']['picture'][] = array('data'=>$atom_data, 'image_mime'=>'image/jpeg'); + } + break; + + + default: + $this->warning('Unknown QuickTime atom type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" ('.trim(getid3_lib::PrintHexBytes($atomname)).'), '.$atomsize.' bytes at offset '.$baseoffset); + $atom_structure['data'] = $atom_data; + break; + } + } + array_pop($atomHierarchy); + return $atom_structure; + } + + /** + * @param string $atom_data + * @param int $baseoffset + * @param array $atomHierarchy + * @param bool $ParseAllPossibleAtoms + * + * @return array|false + */ + public function QuicktimeParseContainerAtom($atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) { + $atom_structure = false; + $subatomoffset = 0; + $subatomcounter = 0; + if ((strlen($atom_data) == 4) && (getid3_lib::BigEndian2Int($atom_data) == 0x00000000)) { + return false; + } + while ($subatomoffset < strlen($atom_data)) { + $subatomsize = getid3_lib::BigEndian2Int(substr($atom_data, $subatomoffset + 0, 4)); + $subatomname = substr($atom_data, $subatomoffset + 4, 4); + $subatomdata = substr($atom_data, $subatomoffset + 8, $subatomsize - 8); + if ($subatomsize == 0) { + // Furthermore, for historical reasons the list of atoms is optionally + // terminated by a 32-bit integer set to 0. If you are writing a program + // to read user data atoms, you should allow for the terminating 0. + if (strlen($atom_data) > 12) { + $subatomoffset += 4; + continue; + } + return $atom_structure; + } + $atom_structure[$subatomcounter++] = $this->QuicktimeParseAtom($subatomname, $subatomsize, $subatomdata, $baseoffset + $subatomoffset, $atomHierarchy, $ParseAllPossibleAtoms); + $subatomoffset += $subatomsize; + } + return $atom_structure; + } + + /** + * @param string $data + * @param int $offset + * + * @return int + */ + public function quicktime_read_mp4_descr_length($data, &$offset) { + // http://libquicktime.sourcearchive.com/documentation/2:1.0.2plus-pdebian-2build1/esds_8c-source.html + $num_bytes = 0; + $length = 0; + do { + $b = ord(substr($data, $offset++, 1)); + $length = ($length << 7) | ($b & 0x7F); + } while (($b & 0x80) && ($num_bytes++ < 4)); + return $length; + } + + /** + * @param int $languageid + * + * @return string + */ + public function QuicktimeLanguageLookup($languageid) { + // http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-34353 + static $QuicktimeLanguageLookup = array(); + if (empty($QuicktimeLanguageLookup)) { + $QuicktimeLanguageLookup[0] = 'English'; + $QuicktimeLanguageLookup[1] = 'French'; + $QuicktimeLanguageLookup[2] = 'German'; + $QuicktimeLanguageLookup[3] = 'Italian'; + $QuicktimeLanguageLookup[4] = 'Dutch'; + $QuicktimeLanguageLookup[5] = 'Swedish'; + $QuicktimeLanguageLookup[6] = 'Spanish'; + $QuicktimeLanguageLookup[7] = 'Danish'; + $QuicktimeLanguageLookup[8] = 'Portuguese'; + $QuicktimeLanguageLookup[9] = 'Norwegian'; + $QuicktimeLanguageLookup[10] = 'Hebrew'; + $QuicktimeLanguageLookup[11] = 'Japanese'; + $QuicktimeLanguageLookup[12] = 'Arabic'; + $QuicktimeLanguageLookup[13] = 'Finnish'; + $QuicktimeLanguageLookup[14] = 'Greek'; + $QuicktimeLanguageLookup[15] = 'Icelandic'; + $QuicktimeLanguageLookup[16] = 'Maltese'; + $QuicktimeLanguageLookup[17] = 'Turkish'; + $QuicktimeLanguageLookup[18] = 'Croatian'; + $QuicktimeLanguageLookup[19] = 'Chinese (Traditional)'; + $QuicktimeLanguageLookup[20] = 'Urdu'; + $QuicktimeLanguageLookup[21] = 'Hindi'; + $QuicktimeLanguageLookup[22] = 'Thai'; + $QuicktimeLanguageLookup[23] = 'Korean'; + $QuicktimeLanguageLookup[24] = 'Lithuanian'; + $QuicktimeLanguageLookup[25] = 'Polish'; + $QuicktimeLanguageLookup[26] = 'Hungarian'; + $QuicktimeLanguageLookup[27] = 'Estonian'; + $QuicktimeLanguageLookup[28] = 'Lettish'; + $QuicktimeLanguageLookup[28] = 'Latvian'; + $QuicktimeLanguageLookup[29] = 'Saamisk'; + $QuicktimeLanguageLookup[29] = 'Lappish'; + $QuicktimeLanguageLookup[30] = 'Faeroese'; + $QuicktimeLanguageLookup[31] = 'Farsi'; + $QuicktimeLanguageLookup[31] = 'Persian'; + $QuicktimeLanguageLookup[32] = 'Russian'; + $QuicktimeLanguageLookup[33] = 'Chinese (Simplified)'; + $QuicktimeLanguageLookup[34] = 'Flemish'; + $QuicktimeLanguageLookup[35] = 'Irish'; + $QuicktimeLanguageLookup[36] = 'Albanian'; + $QuicktimeLanguageLookup[37] = 'Romanian'; + $QuicktimeLanguageLookup[38] = 'Czech'; + $QuicktimeLanguageLookup[39] = 'Slovak'; + $QuicktimeLanguageLookup[40] = 'Slovenian'; + $QuicktimeLanguageLookup[41] = 'Yiddish'; + $QuicktimeLanguageLookup[42] = 'Serbian'; + $QuicktimeLanguageLookup[43] = 'Macedonian'; + $QuicktimeLanguageLookup[44] = 'Bulgarian'; + $QuicktimeLanguageLookup[45] = 'Ukrainian'; + $QuicktimeLanguageLookup[46] = 'Byelorussian'; + $QuicktimeLanguageLookup[47] = 'Uzbek'; + $QuicktimeLanguageLookup[48] = 'Kazakh'; + $QuicktimeLanguageLookup[49] = 'Azerbaijani'; + $QuicktimeLanguageLookup[50] = 'AzerbaijanAr'; + $QuicktimeLanguageLookup[51] = 'Armenian'; + $QuicktimeLanguageLookup[52] = 'Georgian'; + $QuicktimeLanguageLookup[53] = 'Moldavian'; + $QuicktimeLanguageLookup[54] = 'Kirghiz'; + $QuicktimeLanguageLookup[55] = 'Tajiki'; + $QuicktimeLanguageLookup[56] = 'Turkmen'; + $QuicktimeLanguageLookup[57] = 'Mongolian'; + $QuicktimeLanguageLookup[58] = 'MongolianCyr'; + $QuicktimeLanguageLookup[59] = 'Pashto'; + $QuicktimeLanguageLookup[60] = 'Kurdish'; + $QuicktimeLanguageLookup[61] = 'Kashmiri'; + $QuicktimeLanguageLookup[62] = 'Sindhi'; + $QuicktimeLanguageLookup[63] = 'Tibetan'; + $QuicktimeLanguageLookup[64] = 'Nepali'; + $QuicktimeLanguageLookup[65] = 'Sanskrit'; + $QuicktimeLanguageLookup[66] = 'Marathi'; + $QuicktimeLanguageLookup[67] = 'Bengali'; + $QuicktimeLanguageLookup[68] = 'Assamese'; + $QuicktimeLanguageLookup[69] = 'Gujarati'; + $QuicktimeLanguageLookup[70] = 'Punjabi'; + $QuicktimeLanguageLookup[71] = 'Oriya'; + $QuicktimeLanguageLookup[72] = 'Malayalam'; + $QuicktimeLanguageLookup[73] = 'Kannada'; + $QuicktimeLanguageLookup[74] = 'Tamil'; + $QuicktimeLanguageLookup[75] = 'Telugu'; + $QuicktimeLanguageLookup[76] = 'Sinhalese'; + $QuicktimeLanguageLookup[77] = 'Burmese'; + $QuicktimeLanguageLookup[78] = 'Khmer'; + $QuicktimeLanguageLookup[79] = 'Lao'; + $QuicktimeLanguageLookup[80] = 'Vietnamese'; + $QuicktimeLanguageLookup[81] = 'Indonesian'; + $QuicktimeLanguageLookup[82] = 'Tagalog'; + $QuicktimeLanguageLookup[83] = 'MalayRoman'; + $QuicktimeLanguageLookup[84] = 'MalayArabic'; + $QuicktimeLanguageLookup[85] = 'Amharic'; + $QuicktimeLanguageLookup[86] = 'Tigrinya'; + $QuicktimeLanguageLookup[87] = 'Galla'; + $QuicktimeLanguageLookup[87] = 'Oromo'; + $QuicktimeLanguageLookup[88] = 'Somali'; + $QuicktimeLanguageLookup[89] = 'Swahili'; + $QuicktimeLanguageLookup[90] = 'Ruanda'; + $QuicktimeLanguageLookup[91] = 'Rundi'; + $QuicktimeLanguageLookup[92] = 'Chewa'; + $QuicktimeLanguageLookup[93] = 'Malagasy'; + $QuicktimeLanguageLookup[94] = 'Esperanto'; + $QuicktimeLanguageLookup[128] = 'Welsh'; + $QuicktimeLanguageLookup[129] = 'Basque'; + $QuicktimeLanguageLookup[130] = 'Catalan'; + $QuicktimeLanguageLookup[131] = 'Latin'; + $QuicktimeLanguageLookup[132] = 'Quechua'; + $QuicktimeLanguageLookup[133] = 'Guarani'; + $QuicktimeLanguageLookup[134] = 'Aymara'; + $QuicktimeLanguageLookup[135] = 'Tatar'; + $QuicktimeLanguageLookup[136] = 'Uighur'; + $QuicktimeLanguageLookup[137] = 'Dzongkha'; + $QuicktimeLanguageLookup[138] = 'JavaneseRom'; + $QuicktimeLanguageLookup[32767] = 'Unspecified'; + } + if (($languageid > 138) && ($languageid < 32767)) { + /* + ISO Language Codes - http://www.loc.gov/standards/iso639-2/php/code_list.php + Because the language codes specified by ISO 639-2/T are three characters long, they must be packed to fit into a 16-bit field. + The packing algorithm must map each of the three characters, which are always lowercase, into a 5-bit integer and then concatenate + these integers into the least significant 15 bits of a 16-bit integer, leaving the 16-bit integer's most significant bit set to zero. + + One algorithm for performing this packing is to treat each ISO character as a 16-bit integer. Subtract 0x60 from the first character + and multiply by 2^10 (0x400), subtract 0x60 from the second character and multiply by 2^5 (0x20), subtract 0x60 from the third character, + and add the three 16-bit values. This will result in a single 16-bit value with the three codes correctly packed into the 15 least + significant bits and the most significant bit set to zero. + */ + $iso_language_id = ''; + $iso_language_id .= chr((($languageid & 0x7C00) >> 10) + 0x60); + $iso_language_id .= chr((($languageid & 0x03E0) >> 5) + 0x60); + $iso_language_id .= chr((($languageid & 0x001F) >> 0) + 0x60); + $QuicktimeLanguageLookup[$languageid] = getid3_id3v2::LanguageLookup($iso_language_id); + } + return (isset($QuicktimeLanguageLookup[$languageid]) ? $QuicktimeLanguageLookup[$languageid] : 'invalid'); + } + + /** + * @param string $codecid + * + * @return string + */ + public function QuicktimeVideoCodecLookup($codecid) { + static $QuicktimeVideoCodecLookup = array(); + if (empty($QuicktimeVideoCodecLookup)) { + $QuicktimeVideoCodecLookup['.SGI'] = 'SGI'; + $QuicktimeVideoCodecLookup['3IV1'] = '3ivx MPEG-4 v1'; + $QuicktimeVideoCodecLookup['3IV2'] = '3ivx MPEG-4 v2'; + $QuicktimeVideoCodecLookup['3IVX'] = '3ivx MPEG-4'; + $QuicktimeVideoCodecLookup['8BPS'] = 'Planar RGB'; + $QuicktimeVideoCodecLookup['avc1'] = 'H.264/MPEG-4 AVC'; + $QuicktimeVideoCodecLookup['avr '] = 'AVR-JPEG'; + $QuicktimeVideoCodecLookup['b16g'] = '16Gray'; + $QuicktimeVideoCodecLookup['b32a'] = '32AlphaGray'; + $QuicktimeVideoCodecLookup['b48r'] = '48RGB'; + $QuicktimeVideoCodecLookup['b64a'] = '64ARGB'; + $QuicktimeVideoCodecLookup['base'] = 'Base'; + $QuicktimeVideoCodecLookup['clou'] = 'Cloud'; + $QuicktimeVideoCodecLookup['cmyk'] = 'CMYK'; + $QuicktimeVideoCodecLookup['cvid'] = 'Cinepak'; + $QuicktimeVideoCodecLookup['dmb1'] = 'OpenDML JPEG'; + $QuicktimeVideoCodecLookup['dvc '] = 'DVC-NTSC'; + $QuicktimeVideoCodecLookup['dvcp'] = 'DVC-PAL'; + $QuicktimeVideoCodecLookup['dvpn'] = 'DVCPro-NTSC'; + $QuicktimeVideoCodecLookup['dvpp'] = 'DVCPro-PAL'; + $QuicktimeVideoCodecLookup['fire'] = 'Fire'; + $QuicktimeVideoCodecLookup['flic'] = 'FLC'; + $QuicktimeVideoCodecLookup['gif '] = 'GIF'; + $QuicktimeVideoCodecLookup['h261'] = 'H261'; + $QuicktimeVideoCodecLookup['h263'] = 'H263'; + $QuicktimeVideoCodecLookup['IV41'] = 'Indeo4'; + $QuicktimeVideoCodecLookup['jpeg'] = 'JPEG'; + $QuicktimeVideoCodecLookup['kpcd'] = 'PhotoCD'; + $QuicktimeVideoCodecLookup['mjpa'] = 'Motion JPEG-A'; + $QuicktimeVideoCodecLookup['mjpb'] = 'Motion JPEG-B'; + $QuicktimeVideoCodecLookup['msvc'] = 'Microsoft Video1'; + $QuicktimeVideoCodecLookup['myuv'] = 'MPEG YUV420'; + $QuicktimeVideoCodecLookup['path'] = 'Vector'; + $QuicktimeVideoCodecLookup['png '] = 'PNG'; + $QuicktimeVideoCodecLookup['PNTG'] = 'MacPaint'; + $QuicktimeVideoCodecLookup['qdgx'] = 'QuickDrawGX'; + $QuicktimeVideoCodecLookup['qdrw'] = 'QuickDraw'; + $QuicktimeVideoCodecLookup['raw '] = 'RAW'; + $QuicktimeVideoCodecLookup['ripl'] = 'WaterRipple'; + $QuicktimeVideoCodecLookup['rpza'] = 'Video'; + $QuicktimeVideoCodecLookup['smc '] = 'Graphics'; + $QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 1'; + $QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 3'; + $QuicktimeVideoCodecLookup['syv9'] = 'Sorenson YUV9'; + $QuicktimeVideoCodecLookup['tga '] = 'Targa'; + $QuicktimeVideoCodecLookup['tiff'] = 'TIFF'; + $QuicktimeVideoCodecLookup['WRAW'] = 'Windows RAW'; + $QuicktimeVideoCodecLookup['WRLE'] = 'BMP'; + $QuicktimeVideoCodecLookup['y420'] = 'YUV420'; + $QuicktimeVideoCodecLookup['yuv2'] = 'ComponentVideo'; + $QuicktimeVideoCodecLookup['yuvs'] = 'ComponentVideoUnsigned'; + $QuicktimeVideoCodecLookup['yuvu'] = 'ComponentVideoSigned'; + } + return (isset($QuicktimeVideoCodecLookup[$codecid]) ? $QuicktimeVideoCodecLookup[$codecid] : ''); + } + + /** + * @param string $codecid + * + * @return mixed|string + */ + public function QuicktimeAudioCodecLookup($codecid) { + static $QuicktimeAudioCodecLookup = array(); + if (empty($QuicktimeAudioCodecLookup)) { + $QuicktimeAudioCodecLookup['.mp3'] = 'Fraunhofer MPEG Layer-III alias'; + $QuicktimeAudioCodecLookup['aac '] = 'ISO/IEC 14496-3 AAC'; + $QuicktimeAudioCodecLookup['agsm'] = 'Apple GSM 10:1'; + $QuicktimeAudioCodecLookup['alac'] = 'Apple Lossless Audio Codec'; + $QuicktimeAudioCodecLookup['alaw'] = 'A-law 2:1'; + $QuicktimeAudioCodecLookup['conv'] = 'Sample Format'; + $QuicktimeAudioCodecLookup['dvca'] = 'DV'; + $QuicktimeAudioCodecLookup['dvi '] = 'DV 4:1'; + $QuicktimeAudioCodecLookup['eqal'] = 'Frequency Equalizer'; + $QuicktimeAudioCodecLookup['fl32'] = '32-bit Floating Point'; + $QuicktimeAudioCodecLookup['fl64'] = '64-bit Floating Point'; + $QuicktimeAudioCodecLookup['ima4'] = 'Interactive Multimedia Association 4:1'; + $QuicktimeAudioCodecLookup['in24'] = '24-bit Integer'; + $QuicktimeAudioCodecLookup['in32'] = '32-bit Integer'; + $QuicktimeAudioCodecLookup['lpc '] = 'LPC 23:1'; + $QuicktimeAudioCodecLookup['MAC3'] = 'Macintosh Audio Compression/Expansion (MACE) 3:1'; + $QuicktimeAudioCodecLookup['MAC6'] = 'Macintosh Audio Compression/Expansion (MACE) 6:1'; + $QuicktimeAudioCodecLookup['mixb'] = '8-bit Mixer'; + $QuicktimeAudioCodecLookup['mixw'] = '16-bit Mixer'; + $QuicktimeAudioCodecLookup['mp4a'] = 'ISO/IEC 14496-3 AAC'; + $QuicktimeAudioCodecLookup['MS'."\x00\x02"] = 'Microsoft ADPCM'; + $QuicktimeAudioCodecLookup['MS'."\x00\x11"] = 'DV IMA'; + $QuicktimeAudioCodecLookup['MS'."\x00\x55"] = 'Fraunhofer MPEG Layer III'; + $QuicktimeAudioCodecLookup['NONE'] = 'No Encoding'; + $QuicktimeAudioCodecLookup['Qclp'] = 'Qualcomm PureVoice'; + $QuicktimeAudioCodecLookup['QDM2'] = 'QDesign Music 2'; + $QuicktimeAudioCodecLookup['QDMC'] = 'QDesign Music 1'; + $QuicktimeAudioCodecLookup['ratb'] = '8-bit Rate'; + $QuicktimeAudioCodecLookup['ratw'] = '16-bit Rate'; + $QuicktimeAudioCodecLookup['raw '] = 'raw PCM'; + $QuicktimeAudioCodecLookup['sour'] = 'Sound Source'; + $QuicktimeAudioCodecLookup['sowt'] = 'signed/two\'s complement (Little Endian)'; + $QuicktimeAudioCodecLookup['str1'] = 'Iomega MPEG layer II'; + $QuicktimeAudioCodecLookup['str2'] = 'Iomega MPEG *layer II'; + $QuicktimeAudioCodecLookup['str3'] = 'Iomega MPEG **layer II'; + $QuicktimeAudioCodecLookup['str4'] = 'Iomega MPEG ***layer II'; + $QuicktimeAudioCodecLookup['twos'] = 'signed/two\'s complement (Big Endian)'; + $QuicktimeAudioCodecLookup['ulaw'] = 'mu-law 2:1'; + } + return (isset($QuicktimeAudioCodecLookup[$codecid]) ? $QuicktimeAudioCodecLookup[$codecid] : ''); + } + + /** + * @param string $compressionid + * + * @return string + */ + public function QuicktimeDCOMLookup($compressionid) { + static $QuicktimeDCOMLookup = array(); + if (empty($QuicktimeDCOMLookup)) { + $QuicktimeDCOMLookup['zlib'] = 'ZLib Deflate'; + $QuicktimeDCOMLookup['adec'] = 'Apple Compression'; + } + return (isset($QuicktimeDCOMLookup[$compressionid]) ? $QuicktimeDCOMLookup[$compressionid] : ''); + } + + /** + * @param int $colordepthid + * + * @return string + */ + public function QuicktimeColorNameLookup($colordepthid) { + static $QuicktimeColorNameLookup = array(); + if (empty($QuicktimeColorNameLookup)) { + $QuicktimeColorNameLookup[1] = '2-color (monochrome)'; + $QuicktimeColorNameLookup[2] = '4-color'; + $QuicktimeColorNameLookup[4] = '16-color'; + $QuicktimeColorNameLookup[8] = '256-color'; + $QuicktimeColorNameLookup[16] = 'thousands (16-bit color)'; + $QuicktimeColorNameLookup[24] = 'millions (24-bit color)'; + $QuicktimeColorNameLookup[32] = 'millions+ (32-bit color)'; + $QuicktimeColorNameLookup[33] = 'black & white'; + $QuicktimeColorNameLookup[34] = '4-gray'; + $QuicktimeColorNameLookup[36] = '16-gray'; + $QuicktimeColorNameLookup[40] = '256-gray'; + } + return (isset($QuicktimeColorNameLookup[$colordepthid]) ? $QuicktimeColorNameLookup[$colordepthid] : 'invalid'); + } + + /** + * @param int $stik + * + * @return string + */ + public function QuicktimeSTIKLookup($stik) { + static $QuicktimeSTIKLookup = array(); + if (empty($QuicktimeSTIKLookup)) { + $QuicktimeSTIKLookup[0] = 'Movie'; + $QuicktimeSTIKLookup[1] = 'Normal'; + $QuicktimeSTIKLookup[2] = 'Audiobook'; + $QuicktimeSTIKLookup[5] = 'Whacked Bookmark'; + $QuicktimeSTIKLookup[6] = 'Music Video'; + $QuicktimeSTIKLookup[9] = 'Short Film'; + $QuicktimeSTIKLookup[10] = 'TV Show'; + $QuicktimeSTIKLookup[11] = 'Booklet'; + $QuicktimeSTIKLookup[14] = 'Ringtone'; + $QuicktimeSTIKLookup[21] = 'Podcast'; + } + return (isset($QuicktimeSTIKLookup[$stik]) ? $QuicktimeSTIKLookup[$stik] : 'invalid'); + } + + /** + * @param int $audio_profile_id + * + * @return string + */ + public function QuicktimeIODSaudioProfileName($audio_profile_id) { + static $QuicktimeIODSaudioProfileNameLookup = array(); + if (empty($QuicktimeIODSaudioProfileNameLookup)) { + $QuicktimeIODSaudioProfileNameLookup = array( + 0x00 => 'ISO Reserved (0x00)', + 0x01 => 'Main Audio Profile @ Level 1', + 0x02 => 'Main Audio Profile @ Level 2', + 0x03 => 'Main Audio Profile @ Level 3', + 0x04 => 'Main Audio Profile @ Level 4', + 0x05 => 'Scalable Audio Profile @ Level 1', + 0x06 => 'Scalable Audio Profile @ Level 2', + 0x07 => 'Scalable Audio Profile @ Level 3', + 0x08 => 'Scalable Audio Profile @ Level 4', + 0x09 => 'Speech Audio Profile @ Level 1', + 0x0A => 'Speech Audio Profile @ Level 2', + 0x0B => 'Synthetic Audio Profile @ Level 1', + 0x0C => 'Synthetic Audio Profile @ Level 2', + 0x0D => 'Synthetic Audio Profile @ Level 3', + 0x0E => 'High Quality Audio Profile @ Level 1', + 0x0F => 'High Quality Audio Profile @ Level 2', + 0x10 => 'High Quality Audio Profile @ Level 3', + 0x11 => 'High Quality Audio Profile @ Level 4', + 0x12 => 'High Quality Audio Profile @ Level 5', + 0x13 => 'High Quality Audio Profile @ Level 6', + 0x14 => 'High Quality Audio Profile @ Level 7', + 0x15 => 'High Quality Audio Profile @ Level 8', + 0x16 => 'Low Delay Audio Profile @ Level 1', + 0x17 => 'Low Delay Audio Profile @ Level 2', + 0x18 => 'Low Delay Audio Profile @ Level 3', + 0x19 => 'Low Delay Audio Profile @ Level 4', + 0x1A => 'Low Delay Audio Profile @ Level 5', + 0x1B => 'Low Delay Audio Profile @ Level 6', + 0x1C => 'Low Delay Audio Profile @ Level 7', + 0x1D => 'Low Delay Audio Profile @ Level 8', + 0x1E => 'Natural Audio Profile @ Level 1', + 0x1F => 'Natural Audio Profile @ Level 2', + 0x20 => 'Natural Audio Profile @ Level 3', + 0x21 => 'Natural Audio Profile @ Level 4', + 0x22 => 'Mobile Audio Internetworking Profile @ Level 1', + 0x23 => 'Mobile Audio Internetworking Profile @ Level 2', + 0x24 => 'Mobile Audio Internetworking Profile @ Level 3', + 0x25 => 'Mobile Audio Internetworking Profile @ Level 4', + 0x26 => 'Mobile Audio Internetworking Profile @ Level 5', + 0x27 => 'Mobile Audio Internetworking Profile @ Level 6', + 0x28 => 'AAC Profile @ Level 1', + 0x29 => 'AAC Profile @ Level 2', + 0x2A => 'AAC Profile @ Level 4', + 0x2B => 'AAC Profile @ Level 5', + 0x2C => 'High Efficiency AAC Profile @ Level 2', + 0x2D => 'High Efficiency AAC Profile @ Level 3', + 0x2E => 'High Efficiency AAC Profile @ Level 4', + 0x2F => 'High Efficiency AAC Profile @ Level 5', + 0xFE => 'Not part of MPEG-4 audio profiles', + 0xFF => 'No audio capability required', + ); + } + return (isset($QuicktimeIODSaudioProfileNameLookup[$audio_profile_id]) ? $QuicktimeIODSaudioProfileNameLookup[$audio_profile_id] : 'ISO Reserved / User Private'); + } + + /** + * @param int $video_profile_id + * + * @return string + */ + public function QuicktimeIODSvideoProfileName($video_profile_id) { + static $QuicktimeIODSvideoProfileNameLookup = array(); + if (empty($QuicktimeIODSvideoProfileNameLookup)) { + $QuicktimeIODSvideoProfileNameLookup = array( + 0x00 => 'Reserved (0x00) Profile', + 0x01 => 'Simple Profile @ Level 1', + 0x02 => 'Simple Profile @ Level 2', + 0x03 => 'Simple Profile @ Level 3', + 0x08 => 'Simple Profile @ Level 0', + 0x10 => 'Simple Scalable Profile @ Level 0', + 0x11 => 'Simple Scalable Profile @ Level 1', + 0x12 => 'Simple Scalable Profile @ Level 2', + 0x15 => 'AVC/H264 Profile', + 0x21 => 'Core Profile @ Level 1', + 0x22 => 'Core Profile @ Level 2', + 0x32 => 'Main Profile @ Level 2', + 0x33 => 'Main Profile @ Level 3', + 0x34 => 'Main Profile @ Level 4', + 0x42 => 'N-bit Profile @ Level 2', + 0x51 => 'Scalable Texture Profile @ Level 1', + 0x61 => 'Simple Face Animation Profile @ Level 1', + 0x62 => 'Simple Face Animation Profile @ Level 2', + 0x63 => 'Simple FBA Profile @ Level 1', + 0x64 => 'Simple FBA Profile @ Level 2', + 0x71 => 'Basic Animated Texture Profile @ Level 1', + 0x72 => 'Basic Animated Texture Profile @ Level 2', + 0x81 => 'Hybrid Profile @ Level 1', + 0x82 => 'Hybrid Profile @ Level 2', + 0x91 => 'Advanced Real Time Simple Profile @ Level 1', + 0x92 => 'Advanced Real Time Simple Profile @ Level 2', + 0x93 => 'Advanced Real Time Simple Profile @ Level 3', + 0x94 => 'Advanced Real Time Simple Profile @ Level 4', + 0xA1 => 'Core Scalable Profile @ Level1', + 0xA2 => 'Core Scalable Profile @ Level2', + 0xA3 => 'Core Scalable Profile @ Level3', + 0xB1 => 'Advanced Coding Efficiency Profile @ Level 1', + 0xB2 => 'Advanced Coding Efficiency Profile @ Level 2', + 0xB3 => 'Advanced Coding Efficiency Profile @ Level 3', + 0xB4 => 'Advanced Coding Efficiency Profile @ Level 4', + 0xC1 => 'Advanced Core Profile @ Level 1', + 0xC2 => 'Advanced Core Profile @ Level 2', + 0xD1 => 'Advanced Scalable Texture @ Level1', + 0xD2 => 'Advanced Scalable Texture @ Level2', + 0xE1 => 'Simple Studio Profile @ Level 1', + 0xE2 => 'Simple Studio Profile @ Level 2', + 0xE3 => 'Simple Studio Profile @ Level 3', + 0xE4 => 'Simple Studio Profile @ Level 4', + 0xE5 => 'Core Studio Profile @ Level 1', + 0xE6 => 'Core Studio Profile @ Level 2', + 0xE7 => 'Core Studio Profile @ Level 3', + 0xE8 => 'Core Studio Profile @ Level 4', + 0xF0 => 'Advanced Simple Profile @ Level 0', + 0xF1 => 'Advanced Simple Profile @ Level 1', + 0xF2 => 'Advanced Simple Profile @ Level 2', + 0xF3 => 'Advanced Simple Profile @ Level 3', + 0xF4 => 'Advanced Simple Profile @ Level 4', + 0xF5 => 'Advanced Simple Profile @ Level 5', + 0xF7 => 'Advanced Simple Profile @ Level 3b', + 0xF8 => 'Fine Granularity Scalable Profile @ Level 0', + 0xF9 => 'Fine Granularity Scalable Profile @ Level 1', + 0xFA => 'Fine Granularity Scalable Profile @ Level 2', + 0xFB => 'Fine Granularity Scalable Profile @ Level 3', + 0xFC => 'Fine Granularity Scalable Profile @ Level 4', + 0xFD => 'Fine Granularity Scalable Profile @ Level 5', + 0xFE => 'Not part of MPEG-4 Visual profiles', + 0xFF => 'No visual capability required', + ); + } + return (isset($QuicktimeIODSvideoProfileNameLookup[$video_profile_id]) ? $QuicktimeIODSvideoProfileNameLookup[$video_profile_id] : 'ISO Reserved Profile'); + } + + /** + * @param int $rtng + * + * @return string + */ + public function QuicktimeContentRatingLookup($rtng) { + static $QuicktimeContentRatingLookup = array(); + if (empty($QuicktimeContentRatingLookup)) { + $QuicktimeContentRatingLookup[0] = 'None'; + $QuicktimeContentRatingLookup[2] = 'Clean'; + $QuicktimeContentRatingLookup[4] = 'Explicit'; + } + return (isset($QuicktimeContentRatingLookup[$rtng]) ? $QuicktimeContentRatingLookup[$rtng] : 'invalid'); + } + + /** + * @param int $akid + * + * @return string + */ + public function QuicktimeStoreAccountTypeLookup($akid) { + static $QuicktimeStoreAccountTypeLookup = array(); + if (empty($QuicktimeStoreAccountTypeLookup)) { + $QuicktimeStoreAccountTypeLookup[0] = 'iTunes'; + $QuicktimeStoreAccountTypeLookup[1] = 'AOL'; + } + return (isset($QuicktimeStoreAccountTypeLookup[$akid]) ? $QuicktimeStoreAccountTypeLookup[$akid] : 'invalid'); + } + + /** + * @param int $sfid + * + * @return string + */ + public function QuicktimeStoreFrontCodeLookup($sfid) { + static $QuicktimeStoreFrontCodeLookup = array(); + if (empty($QuicktimeStoreFrontCodeLookup)) { + $QuicktimeStoreFrontCodeLookup[143460] = 'Australia'; + $QuicktimeStoreFrontCodeLookup[143445] = 'Austria'; + $QuicktimeStoreFrontCodeLookup[143446] = 'Belgium'; + $QuicktimeStoreFrontCodeLookup[143455] = 'Canada'; + $QuicktimeStoreFrontCodeLookup[143458] = 'Denmark'; + $QuicktimeStoreFrontCodeLookup[143447] = 'Finland'; + $QuicktimeStoreFrontCodeLookup[143442] = 'France'; + $QuicktimeStoreFrontCodeLookup[143443] = 'Germany'; + $QuicktimeStoreFrontCodeLookup[143448] = 'Greece'; + $QuicktimeStoreFrontCodeLookup[143449] = 'Ireland'; + $QuicktimeStoreFrontCodeLookup[143450] = 'Italy'; + $QuicktimeStoreFrontCodeLookup[143462] = 'Japan'; + $QuicktimeStoreFrontCodeLookup[143451] = 'Luxembourg'; + $QuicktimeStoreFrontCodeLookup[143452] = 'Netherlands'; + $QuicktimeStoreFrontCodeLookup[143461] = 'New Zealand'; + $QuicktimeStoreFrontCodeLookup[143457] = 'Norway'; + $QuicktimeStoreFrontCodeLookup[143453] = 'Portugal'; + $QuicktimeStoreFrontCodeLookup[143454] = 'Spain'; + $QuicktimeStoreFrontCodeLookup[143456] = 'Sweden'; + $QuicktimeStoreFrontCodeLookup[143459] = 'Switzerland'; + $QuicktimeStoreFrontCodeLookup[143444] = 'United Kingdom'; + $QuicktimeStoreFrontCodeLookup[143441] = 'United States'; + } + return (isset($QuicktimeStoreFrontCodeLookup[$sfid]) ? $QuicktimeStoreFrontCodeLookup[$sfid] : 'invalid'); + } + + /** + * @param string $atom_data + * + * @return array + */ + public function QuicktimeParseNikonNCTG($atom_data) { + // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG + // Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100 + // Data is stored as records of: + // * 4 bytes record type + // * 2 bytes size of data field type: + // 0x0001 = flag (size field *= 1-byte) + // 0x0002 = char (size field *= 1-byte) + // 0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB + // 0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD + // 0x0005 = float (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together + // 0x0007 = bytes (size field *= 1-byte), values are stored as ?????? + // 0x0008 = ????? (size field *= 2-byte), values are stored as ?????? + // * 2 bytes data size field + // * ? bytes data (string data may be null-padded; datestamp fields are in the format "2011:05:25 20:24:15") + // all integers are stored BigEndian + + $NCTGtagName = array( + 0x00000001 => 'Make', + 0x00000002 => 'Model', + 0x00000003 => 'Software', + 0x00000011 => 'CreateDate', + 0x00000012 => 'DateTimeOriginal', + 0x00000013 => 'FrameCount', + 0x00000016 => 'FrameRate', + 0x00000022 => 'FrameWidth', + 0x00000023 => 'FrameHeight', + 0x00000032 => 'AudioChannels', + 0x00000033 => 'AudioBitsPerSample', + 0x00000034 => 'AudioSampleRate', + 0x02000001 => 'MakerNoteVersion', + 0x02000005 => 'WhiteBalance', + 0x0200000b => 'WhiteBalanceFineTune', + 0x0200001e => 'ColorSpace', + 0x02000023 => 'PictureControlData', + 0x02000024 => 'WorldTime', + 0x02000032 => 'UnknownInfo', + 0x02000083 => 'LensType', + 0x02000084 => 'Lens', + ); + + $offset = 0; + $data = null; + $datalength = strlen($atom_data); + $parsed = array(); + while ($offset < $datalength) { + $record_type = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4)); $offset += 4; + $data_size_type = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2)); $offset += 2; + $data_size = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2)); $offset += 2; + switch ($data_size_type) { + case 0x0001: // 0x0001 = flag (size field *= 1-byte) + $data = getid3_lib::BigEndian2Int(substr($atom_data, $offset, $data_size * 1)); + $offset += ($data_size * 1); + break; + case 0x0002: // 0x0002 = char (size field *= 1-byte) + $data = substr($atom_data, $offset, $data_size * 1); + $offset += ($data_size * 1); + $data = rtrim($data, "\x00"); + break; + case 0x0003: // 0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB + $data = ''; + for ($i = $data_size - 1; $i >= 0; $i--) { + $data .= substr($atom_data, $offset + ($i * 2), 2); + } + $data = getid3_lib::BigEndian2Int($data); + $offset += ($data_size * 2); + break; + case 0x0004: // 0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD + $data = ''; + for ($i = $data_size - 1; $i >= 0; $i--) { + $data .= substr($atom_data, $offset + ($i * 4), 4); + } + $data = getid3_lib::BigEndian2Int($data); + $offset += ($data_size * 4); + break; + case 0x0005: // 0x0005 = float (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together + $data = array(); + for ($i = 0; $i < $data_size; $i++) { + $numerator = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 0, 4)); + $denomninator = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 4, 4)); + if ($denomninator == 0) { + $data[$i] = false; + } else { + $data[$i] = (double) $numerator / $denomninator; + } + } + $offset += (8 * $data_size); + if (count($data) == 1) { + $data = $data[0]; + } + break; + case 0x0007: // 0x0007 = bytes (size field *= 1-byte), values are stored as ?????? + $data = substr($atom_data, $offset, $data_size * 1); + $offset += ($data_size * 1); + break; + case 0x0008: // 0x0008 = ????? (size field *= 2-byte), values are stored as ?????? + $data = substr($atom_data, $offset, $data_size * 2); + $offset += ($data_size * 2); + break; + default: + echo 'QuicktimeParseNikonNCTG()::unknown $data_size_type: '.$data_size_type.'
            '; + break 2; + } + + switch ($record_type) { + case 0x00000011: // CreateDate + case 0x00000012: // DateTimeOriginal + $data = strtotime($data); + break; + case 0x0200001e: // ColorSpace + switch ($data) { + case 1: + $data = 'sRGB'; + break; + case 2: + $data = 'Adobe RGB'; + break; + } + break; + case 0x02000023: // PictureControlData + $PictureControlAdjust = array(0=>'default', 1=>'quick', 2=>'full'); + $FilterEffect = array(0x80=>'off', 0x81=>'yellow', 0x82=>'orange', 0x83=>'red', 0x84=>'green', 0xff=>'n/a'); + $ToningEffect = array(0x80=>'b&w', 0x81=>'sepia', 0x82=>'cyanotype', 0x83=>'red', 0x84=>'yellow', 0x85=>'green', 0x86=>'blue-green', 0x87=>'blue', 0x88=>'purple-blue', 0x89=>'red-purple', 0xff=>'n/a'); + $data = array( + 'PictureControlVersion' => substr($data, 0, 4), + 'PictureControlName' => rtrim(substr($data, 4, 20), "\x00"), + 'PictureControlBase' => rtrim(substr($data, 24, 20), "\x00"), + //'?' => substr($data, 44, 4), + 'PictureControlAdjust' => $PictureControlAdjust[ord(substr($data, 48, 1))], + 'PictureControlQuickAdjust' => ord(substr($data, 49, 1)), + 'Sharpness' => ord(substr($data, 50, 1)), + 'Contrast' => ord(substr($data, 51, 1)), + 'Brightness' => ord(substr($data, 52, 1)), + 'Saturation' => ord(substr($data, 53, 1)), + 'HueAdjustment' => ord(substr($data, 54, 1)), + 'FilterEffect' => $FilterEffect[ord(substr($data, 55, 1))], + 'ToningEffect' => $ToningEffect[ord(substr($data, 56, 1))], + 'ToningSaturation' => ord(substr($data, 57, 1)), + ); + break; + case 0x02000024: // WorldTime + // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#WorldTime + // timezone is stored as offset from GMT in minutes + $timezone = getid3_lib::BigEndian2Int(substr($data, 0, 2)); + if ($timezone & 0x8000) { + $timezone = 0 - (0x10000 - $timezone); + } + $timezone /= 60; + + $dst = (bool) getid3_lib::BigEndian2Int(substr($data, 2, 1)); + switch (getid3_lib::BigEndian2Int(substr($data, 3, 1))) { + case 2: + $datedisplayformat = 'D/M/Y'; break; + case 1: + $datedisplayformat = 'M/D/Y'; break; + case 0: + default: + $datedisplayformat = 'Y/M/D'; break; + } + + $data = array('timezone'=>floatval($timezone), 'dst'=>$dst, 'display'=>$datedisplayformat); + break; + case 0x02000083: // LensType + $data = array( + //'_' => $data, + 'mf' => (bool) ($data & 0x01), + 'd' => (bool) ($data & 0x02), + 'g' => (bool) ($data & 0x04), + 'vr' => (bool) ($data & 0x08), + ); + break; + } + $tag_name = (isset($NCTGtagName[$record_type]) ? $NCTGtagName[$record_type] : '0x'.str_pad(dechex($record_type), 8, '0', STR_PAD_LEFT)); + $parsed[$tag_name] = $data; + } + return $parsed; + } + + /** + * @param string $keyname + * @param string|array $data + * @param string $boxname + * + * @return bool + */ + public function CopyToAppropriateCommentsSection($keyname, $data, $boxname='') { + static $handyatomtranslatorarray = array(); + if (empty($handyatomtranslatorarray)) { + // http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt + // http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt + // http://atomicparsley.sourceforge.net/mpeg-4files.html + // https://code.google.com/p/mp4v2/wiki/iTunesMetadata + $handyatomtranslatorarray["\xA9".'alb'] = 'album'; // iTunes 4.0 + $handyatomtranslatorarray["\xA9".'ART'] = 'artist'; + $handyatomtranslatorarray["\xA9".'art'] = 'artist'; // iTunes 4.0 + $handyatomtranslatorarray["\xA9".'aut'] = 'author'; + $handyatomtranslatorarray["\xA9".'cmt'] = 'comment'; // iTunes 4.0 + $handyatomtranslatorarray["\xA9".'com'] = 'comment'; + $handyatomtranslatorarray["\xA9".'cpy'] = 'copyright'; + $handyatomtranslatorarray["\xA9".'day'] = 'creation_date'; // iTunes 4.0 + $handyatomtranslatorarray["\xA9".'dir'] = 'director'; + $handyatomtranslatorarray["\xA9".'ed1'] = 'edit1'; + $handyatomtranslatorarray["\xA9".'ed2'] = 'edit2'; + $handyatomtranslatorarray["\xA9".'ed3'] = 'edit3'; + $handyatomtranslatorarray["\xA9".'ed4'] = 'edit4'; + $handyatomtranslatorarray["\xA9".'ed5'] = 'edit5'; + $handyatomtranslatorarray["\xA9".'ed6'] = 'edit6'; + $handyatomtranslatorarray["\xA9".'ed7'] = 'edit7'; + $handyatomtranslatorarray["\xA9".'ed8'] = 'edit8'; + $handyatomtranslatorarray["\xA9".'ed9'] = 'edit9'; + $handyatomtranslatorarray["\xA9".'enc'] = 'encoded_by'; + $handyatomtranslatorarray["\xA9".'fmt'] = 'format'; + $handyatomtranslatorarray["\xA9".'gen'] = 'genre'; // iTunes 4.0 + $handyatomtranslatorarray["\xA9".'grp'] = 'grouping'; // iTunes 4.2 + $handyatomtranslatorarray["\xA9".'hst'] = 'host_computer'; + $handyatomtranslatorarray["\xA9".'inf'] = 'information'; + $handyatomtranslatorarray["\xA9".'lyr'] = 'lyrics'; // iTunes 5.0 + $handyatomtranslatorarray["\xA9".'mak'] = 'make'; + $handyatomtranslatorarray["\xA9".'mod'] = 'model'; + $handyatomtranslatorarray["\xA9".'nam'] = 'title'; // iTunes 4.0 + $handyatomtranslatorarray["\xA9".'ope'] = 'composer'; + $handyatomtranslatorarray["\xA9".'prd'] = 'producer'; + $handyatomtranslatorarray["\xA9".'PRD'] = 'product'; + $handyatomtranslatorarray["\xA9".'prf'] = 'performers'; + $handyatomtranslatorarray["\xA9".'req'] = 'system_requirements'; + $handyatomtranslatorarray["\xA9".'src'] = 'source_credit'; + $handyatomtranslatorarray["\xA9".'swr'] = 'software'; + $handyatomtranslatorarray["\xA9".'too'] = 'encoding_tool'; // iTunes 4.0 + $handyatomtranslatorarray["\xA9".'trk'] = 'track_number'; + $handyatomtranslatorarray["\xA9".'url'] = 'url'; + $handyatomtranslatorarray["\xA9".'wrn'] = 'warning'; + $handyatomtranslatorarray["\xA9".'wrt'] = 'composer'; + $handyatomtranslatorarray['aART'] = 'album_artist'; + $handyatomtranslatorarray['apID'] = 'purchase_account'; + $handyatomtranslatorarray['catg'] = 'category'; // iTunes 4.9 + $handyatomtranslatorarray['covr'] = 'picture'; // iTunes 4.0 + $handyatomtranslatorarray['cpil'] = 'compilation'; // iTunes 4.0 + $handyatomtranslatorarray['cprt'] = 'copyright'; // iTunes 4.0? + $handyatomtranslatorarray['desc'] = 'description'; // iTunes 5.0 + $handyatomtranslatorarray['disk'] = 'disc_number'; // iTunes 4.0 + $handyatomtranslatorarray['egid'] = 'episode_guid'; // iTunes 4.9 + $handyatomtranslatorarray['gnre'] = 'genre'; // iTunes 4.0 + $handyatomtranslatorarray['hdvd'] = 'hd_video'; // iTunes 4.0 + $handyatomtranslatorarray['ldes'] = 'description_long'; // + $handyatomtranslatorarray['keyw'] = 'keyword'; // iTunes 4.9 + $handyatomtranslatorarray['pcst'] = 'podcast'; // iTunes 4.9 + $handyatomtranslatorarray['pgap'] = 'gapless_playback'; // iTunes 7.0 + $handyatomtranslatorarray['purd'] = 'purchase_date'; // iTunes 6.0.2 + $handyatomtranslatorarray['purl'] = 'podcast_url'; // iTunes 4.9 + $handyatomtranslatorarray['rtng'] = 'rating'; // iTunes 4.0 + $handyatomtranslatorarray['soaa'] = 'sort_album_artist'; // + $handyatomtranslatorarray['soal'] = 'sort_album'; // + $handyatomtranslatorarray['soar'] = 'sort_artist'; // + $handyatomtranslatorarray['soco'] = 'sort_composer'; // + $handyatomtranslatorarray['sonm'] = 'sort_title'; // + $handyatomtranslatorarray['sosn'] = 'sort_show'; // + $handyatomtranslatorarray['stik'] = 'stik'; // iTunes 4.9 + $handyatomtranslatorarray['tmpo'] = 'bpm'; // iTunes 4.0 + $handyatomtranslatorarray['trkn'] = 'track_number'; // iTunes 4.0 + $handyatomtranslatorarray['tven'] = 'tv_episode_id'; // + $handyatomtranslatorarray['tves'] = 'tv_episode'; // iTunes 6.0 + $handyatomtranslatorarray['tvnn'] = 'tv_network_name'; // iTunes 6.0 + $handyatomtranslatorarray['tvsh'] = 'tv_show_name'; // iTunes 6.0 + $handyatomtranslatorarray['tvsn'] = 'tv_season'; // iTunes 6.0 + + // boxnames: + /* + $handyatomtranslatorarray['iTunSMPB'] = 'iTunSMPB'; + $handyatomtranslatorarray['iTunNORM'] = 'iTunNORM'; + $handyatomtranslatorarray['Encoding Params'] = 'Encoding Params'; + $handyatomtranslatorarray['replaygain_track_gain'] = 'replaygain_track_gain'; + $handyatomtranslatorarray['replaygain_track_peak'] = 'replaygain_track_peak'; + $handyatomtranslatorarray['replaygain_track_minmax'] = 'replaygain_track_minmax'; + $handyatomtranslatorarray['MusicIP PUID'] = 'MusicIP PUID'; + $handyatomtranslatorarray['MusicBrainz Artist Id'] = 'MusicBrainz Artist Id'; + $handyatomtranslatorarray['MusicBrainz Album Id'] = 'MusicBrainz Album Id'; + $handyatomtranslatorarray['MusicBrainz Album Artist Id'] = 'MusicBrainz Album Artist Id'; + $handyatomtranslatorarray['MusicBrainz Track Id'] = 'MusicBrainz Track Id'; + $handyatomtranslatorarray['MusicBrainz Disc Id'] = 'MusicBrainz Disc Id'; + + // http://age.hobba.nl/audio/tag_frame_reference.html + $handyatomtranslatorarray['PLAY_COUNTER'] = 'play_counter'; // Foobar2000 - https://www.getid3.org/phpBB3/viewtopic.php?t=1355 + $handyatomtranslatorarray['MEDIATYPE'] = 'mediatype'; // Foobar2000 - https://www.getid3.org/phpBB3/viewtopic.php?t=1355 + */ + } + $info = &$this->getid3->info; + $comment_key = ''; + if ($boxname && ($boxname != $keyname)) { + $comment_key = (isset($handyatomtranslatorarray[$boxname]) ? $handyatomtranslatorarray[$boxname] : $boxname); + } elseif (isset($handyatomtranslatorarray[$keyname])) { + $comment_key = $handyatomtranslatorarray[$keyname]; + } + if ($comment_key) { + if ($comment_key == 'picture') { + if (!is_array($data)) { + $image_mime = ''; + if (preg_match('#^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A#', $data)) { + $image_mime = 'image/png'; + } elseif (preg_match('#^\xFF\xD8\xFF#', $data)) { + $image_mime = 'image/jpeg'; + } elseif (preg_match('#^GIF#', $data)) { + $image_mime = 'image/gif'; + } elseif (preg_match('#^BM#', $data)) { + $image_mime = 'image/bmp'; + } + $data = array('data'=>$data, 'image_mime'=>$image_mime); + } + } + $gooddata = array($data); + if ($comment_key == 'genre') { + // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal" + $gooddata = explode(';', $data); + } + foreach ($gooddata as $data) { + $info['quicktime']['comments'][$comment_key][] = $data; + } + } + return true; + } + + /** + * @param string $lstring + * @param int $count + * + * @return string + */ + public function LociString($lstring, &$count) { + // Loci strings are UTF-8 or UTF-16 and null (x00/x0000) terminated. UTF-16 has a BOM + // Also need to return the number of bytes the string occupied so additional fields can be extracted + $len = strlen($lstring); + if ($len == 0) { + $count = 0; + return ''; + } + if ($lstring[0] == "\x00") { + $count = 1; + return ''; + } + // check for BOM + if (($len > 2) && ((($lstring[0] == "\xFE") && ($lstring[1] == "\xFF")) || (($lstring[0] == "\xFF") && ($lstring[1] == "\xFE")))) { + // UTF-16 + if (preg_match('/(.*)\x00/', $lstring, $lmatches)) { + $count = strlen($lmatches[1]) * 2 + 2; //account for 2 byte characters and trailing \x0000 + return getid3_lib::iconv_fallback_utf16_utf8($lmatches[1]); + } else { + return ''; + } + } + // UTF-8 + if (preg_match('/(.*)\x00/', $lstring, $lmatches)) { + $count = strlen($lmatches[1]) + 1; //account for trailing \x00 + return $lmatches[1]; + } + return ''; + } + + /** + * @param string $nullterminatedstring + * + * @return string + */ + public function NoNullString($nullterminatedstring) { + // remove the single null terminator on null terminated strings + if (substr($nullterminatedstring, strlen($nullterminatedstring) - 1, 1) === "\x00") { + return substr($nullterminatedstring, 0, strlen($nullterminatedstring) - 1); + } + return $nullterminatedstring; + } + + /** + * @param string $pascalstring + * + * @return string + */ + public function Pascal2String($pascalstring) { + // Pascal strings have 1 unsigned byte at the beginning saying how many chars (1-255) are in the string + return substr($pascalstring, 1); + } + + + /** + * Helper functions for m4b audiobook chapters + * code by Steffen Hartmann 2015-Nov-08. + * + * @param array $info + * @param string $tag + * @param string $history + * @param array $result + */ + public function search_tag_by_key($info, $tag, $history, &$result) { + foreach ($info as $key => $value) { + $key_history = $history.'/'.$key; + if ($key === $tag) { + $result[] = array($key_history, $info); + } else { + if (is_array($value)) { + $this->search_tag_by_key($value, $tag, $key_history, $result); + } + } + } + } + + /** + * @param array $info + * @param string $k + * @param string $v + * @param string $history + * @param array $result + */ + public function search_tag_by_pair($info, $k, $v, $history, &$result) { + foreach ($info as $key => $value) { + $key_history = $history.'/'.$key; + if (($key === $k) && ($value === $v)) { + $result[] = array($key_history, $info); + } else { + if (is_array($value)) { + $this->search_tag_by_pair($value, $k, $v, $key_history, $result); + } + } + } + } + + /** + * @param array $info + * + * @return array + */ + public function quicktime_time_to_sample_table($info) { + $res = array(); + $this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res); + foreach ($res as $value) { + $stbl_res = array(); + $this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res); + if (count($stbl_res) > 0) { + $stts_res = array(); + $this->search_tag_by_key($value[1], 'time_to_sample_table', $value[0], $stts_res); + if (count($stts_res) > 0) { + return $stts_res[0][1]['time_to_sample_table']; + } + } + } + return array(); + } + + /** + * @param array $info + * + * @return int + */ + public function quicktime_bookmark_time_scale($info) { + $time_scale = ''; + $ts_prefix_len = 0; + $res = array(); + $this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res); + foreach ($res as $value) { + $stbl_res = array(); + $this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res); + if (count($stbl_res) > 0) { + $ts_res = array(); + $this->search_tag_by_key($info['quicktime']['moov'], 'time_scale', 'quicktime/moov', $ts_res); + foreach ($ts_res as $sub_value) { + $prefix = substr($sub_value[0], 0, -12); + if ((substr($stbl_res[0][0], 0, strlen($prefix)) === $prefix) && ($ts_prefix_len < strlen($prefix))) { + $time_scale = $sub_value[1]['time_scale']; + $ts_prefix_len = strlen($prefix); + } + } + } + } + return $time_scale; + } + /* + // END helper functions for m4b audiobook chapters + */ + + +} diff --git a/wp-includes/ID3/module.audio-video.riff.php b/wp-includes/ID3/module.audio-video.riff.php new file mode 100644 index 0000000..276f131 --- /dev/null +++ b/wp-includes/ID3/module.audio-video.riff.php @@ -0,0 +1,2788 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio-video.riff.php // +// module for analyzing RIFF files // +// multiple formats supported by this module: // +// Wave, AVI, AIFF/AIFC, (MP3,AC3)/RIFF, Wavpack v3, 8SVX // +// dependencies: module.audio.mp3.php // +// module.audio.ac3.php // +// module.audio.dts.php // +// /// +///////////////////////////////////////////////////////////////// + +/** +* @todo Parse AC-3/DTS audio inside WAVE correctly +* @todo Rewrite RIFF parser totally +*/ + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, true); +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.dts.php', __FILE__, true); + +class getid3_riff extends getid3_handler +{ + protected $container = 'riff'; // default + + /** + * @return bool + * + * @throws getid3_exception + */ + public function Analyze() { + $info = &$this->getid3->info; + + // initialize these values to an empty array, otherwise they default to NULL + // and you can't append array values to a NULL value + $info['riff'] = array('raw'=>array()); + + // Shortcuts + $thisfile_riff = &$info['riff']; + $thisfile_riff_raw = &$thisfile_riff['raw']; + $thisfile_audio = &$info['audio']; + $thisfile_video = &$info['video']; + $thisfile_audio_dataformat = &$thisfile_audio['dataformat']; + $thisfile_riff_audio = &$thisfile_riff['audio']; + $thisfile_riff_video = &$thisfile_riff['video']; + $thisfile_riff_WAVE = array(); + + $Original['avdataoffset'] = $info['avdataoffset']; + $Original['avdataend'] = $info['avdataend']; + + $this->fseek($info['avdataoffset']); + $RIFFheader = $this->fread(12); + $offset = $this->ftell(); + $RIFFtype = substr($RIFFheader, 0, 4); + $RIFFsize = substr($RIFFheader, 4, 4); + $RIFFsubtype = substr($RIFFheader, 8, 4); + + switch ($RIFFtype) { + + case 'FORM': // AIFF, AIFC + //$info['fileformat'] = 'aiff'; + $this->container = 'aiff'; + $thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize); + $thisfile_riff[$RIFFsubtype] = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4)); + break; + + case 'RIFF': // AVI, WAV, etc + case 'SDSS': // SDSS is identical to RIFF, just renamed. Used by SmartSound QuickTracks (www.smartsound.com) + case 'RMP3': // RMP3 is identical to RIFF, just renamed. Used by [unknown program] when creating RIFF-MP3s + //$info['fileformat'] = 'riff'; + $this->container = 'riff'; + $thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize); + if ($RIFFsubtype == 'RMP3') { + // RMP3 is identical to WAVE, just renamed. Used by [unknown program] when creating RIFF-MP3s + $RIFFsubtype = 'WAVE'; + } + if ($RIFFsubtype != 'AMV ') { + // AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size + // Handled separately in ParseRIFFAMV() + $thisfile_riff[$RIFFsubtype] = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4)); + } + if (($info['avdataend'] - $info['filesize']) == 1) { + // LiteWave appears to incorrectly *not* pad actual output file + // to nearest WORD boundary so may appear to be short by one + // byte, in which case - skip warning + $info['avdataend'] = $info['filesize']; + } + + $nextRIFFoffset = $Original['avdataoffset'] + 8 + $thisfile_riff['header_size']; // 8 = "RIFF" + 32-bit offset + while ($nextRIFFoffset < min($info['filesize'], $info['avdataend'])) { + try { + $this->fseek($nextRIFFoffset); + } catch (getid3_exception $e) { + if ($e->getCode() == 10) { + //$this->warning('RIFF parser: '.$e->getMessage()); + $this->error('AVI extends beyond '.round(PHP_INT_MAX / 1073741824).'GB and PHP filesystem functions cannot read that far, playtime may be wrong'); + $this->warning('[avdataend] value may be incorrect, multiple AVIX chunks may be present'); + break; + } else { + throw $e; + } + } + $nextRIFFheader = $this->fread(12); + if ($nextRIFFoffset == ($info['avdataend'] - 1)) { + if (substr($nextRIFFheader, 0, 1) == "\x00") { + // RIFF padded to WORD boundary, we're actually already at the end + break; + } + } + $nextRIFFheaderID = substr($nextRIFFheader, 0, 4); + $nextRIFFsize = $this->EitherEndian2Int(substr($nextRIFFheader, 4, 4)); + $nextRIFFtype = substr($nextRIFFheader, 8, 4); + $chunkdata = array(); + $chunkdata['offset'] = $nextRIFFoffset + 8; + $chunkdata['size'] = $nextRIFFsize; + $nextRIFFoffset = $chunkdata['offset'] + $chunkdata['size']; + + switch ($nextRIFFheaderID) { + case 'RIFF': + $chunkdata['chunks'] = $this->ParseRIFF($chunkdata['offset'] + 4, $nextRIFFoffset); + if (!isset($thisfile_riff[$nextRIFFtype])) { + $thisfile_riff[$nextRIFFtype] = array(); + } + $thisfile_riff[$nextRIFFtype][] = $chunkdata; + break; + + case 'AMV ': + unset($info['riff']); + $info['amv'] = $this->ParseRIFFAMV($chunkdata['offset'] + 4, $nextRIFFoffset); + break; + + case 'JUNK': + // ignore + $thisfile_riff[$nextRIFFheaderID][] = $chunkdata; + break; + + case 'IDVX': + $info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunkdata['size'])); + break; + + default: + if ($info['filesize'] == ($chunkdata['offset'] - 8 + 128)) { + $DIVXTAG = $nextRIFFheader.$this->fread(128 - 12); + if (substr($DIVXTAG, -7) == 'DIVXTAG') { + // DIVXTAG is supposed to be inside an IDVX chunk in a LIST chunk, but some bad encoders just slap it on the end of a file + $this->warning('Found wrongly-structured DIVXTAG at offset '.($this->ftell() - 128).', parsing anyway'); + $info['divxtag']['comments'] = self::ParseDIVXTAG($DIVXTAG); + break 2; + } + } + $this->warning('Expecting "RIFF|JUNK|IDVX" at '.$nextRIFFoffset.', found "'.$nextRIFFheaderID.'" ('.getid3_lib::PrintHexBytes($nextRIFFheaderID).') - skipping rest of file'); + break 2; + + } + + } + if ($RIFFsubtype == 'WAVE') { + $thisfile_riff_WAVE = &$thisfile_riff['WAVE']; + } + break; + + default: + $this->error('Cannot parse RIFF (this is maybe not a RIFF / WAV / AVI file?) - expecting "FORM|RIFF|SDSS|RMP3" found "'.$RIFFsubtype.'" instead'); + //unset($info['fileformat']); + return false; + } + + $streamindex = 0; + switch ($RIFFsubtype) { + + // http://en.wikipedia.org/wiki/Wav + case 'WAVE': + $info['fileformat'] = 'wav'; + + if (empty($thisfile_audio['bitrate_mode'])) { + $thisfile_audio['bitrate_mode'] = 'cbr'; + } + if (empty($thisfile_audio_dataformat)) { + $thisfile_audio_dataformat = 'wav'; + } + + if (isset($thisfile_riff_WAVE['data'][0]['offset'])) { + $info['avdataoffset'] = $thisfile_riff_WAVE['data'][0]['offset'] + 8; + $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff_WAVE['data'][0]['size']; + } + if (isset($thisfile_riff_WAVE['fmt '][0]['data'])) { + + $thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($thisfile_riff_WAVE['fmt '][0]['data']); + $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; + if (!isset($thisfile_riff_audio[$streamindex]['bitrate']) || ($thisfile_riff_audio[$streamindex]['bitrate'] == 0)) { + $this->error('Corrupt RIFF file: bitrate_audio == zero'); + return false; + } + $thisfile_riff_raw['fmt '] = $thisfile_riff_audio[$streamindex]['raw']; + unset($thisfile_riff_audio[$streamindex]['raw']); + $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; + + $thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); + if (substr($thisfile_audio['codec'], 0, strlen('unknown: 0x')) == 'unknown: 0x') { + $this->warning('Audio codec = '.$thisfile_audio['codec']); + } + $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; + + if (empty($info['playtime_seconds'])) { // may already be set (e.g. DTS-WAV) + $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']); + } + + $thisfile_audio['lossless'] = false; + if (isset($thisfile_riff_WAVE['data'][0]['offset']) && isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { + switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { + + case 0x0001: // PCM + $thisfile_audio['lossless'] = true; + break; + + case 0x2000: // AC-3 + $thisfile_audio_dataformat = 'ac3'; + break; + + default: + // do nothing + break; + + } + } + $thisfile_audio['streams'][$streamindex]['wformattag'] = $thisfile_audio['wformattag']; + $thisfile_audio['streams'][$streamindex]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; + $thisfile_audio['streams'][$streamindex]['lossless'] = $thisfile_audio['lossless']; + $thisfile_audio['streams'][$streamindex]['dataformat'] = $thisfile_audio_dataformat; + } + + if (isset($thisfile_riff_WAVE['rgad'][0]['data'])) { + + // shortcuts + $rgadData = &$thisfile_riff_WAVE['rgad'][0]['data']; + $thisfile_riff_raw['rgad'] = array('track'=>array(), 'album'=>array()); + $thisfile_riff_raw_rgad = &$thisfile_riff_raw['rgad']; + $thisfile_riff_raw_rgad_track = &$thisfile_riff_raw_rgad['track']; + $thisfile_riff_raw_rgad_album = &$thisfile_riff_raw_rgad['album']; + + $thisfile_riff_raw_rgad['fPeakAmplitude'] = getid3_lib::LittleEndian2Float(substr($rgadData, 0, 4)); + $thisfile_riff_raw_rgad['nRadioRgAdjust'] = $this->EitherEndian2Int(substr($rgadData, 4, 2)); + $thisfile_riff_raw_rgad['nAudiophileRgAdjust'] = $this->EitherEndian2Int(substr($rgadData, 6, 2)); + + $nRadioRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nRadioRgAdjust']), 16, '0', STR_PAD_LEFT); + $nAudiophileRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nAudiophileRgAdjust']), 16, '0', STR_PAD_LEFT); + $thisfile_riff_raw_rgad_track['name'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 0, 3)); + $thisfile_riff_raw_rgad_track['originator'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 3, 3)); + $thisfile_riff_raw_rgad_track['signbit'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 6, 1)); + $thisfile_riff_raw_rgad_track['adjustment'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 7, 9)); + $thisfile_riff_raw_rgad_album['name'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 0, 3)); + $thisfile_riff_raw_rgad_album['originator'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 3, 3)); + $thisfile_riff_raw_rgad_album['signbit'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 6, 1)); + $thisfile_riff_raw_rgad_album['adjustment'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 7, 9)); + + $thisfile_riff['rgad']['peakamplitude'] = $thisfile_riff_raw_rgad['fPeakAmplitude']; + if (($thisfile_riff_raw_rgad_track['name'] != 0) && ($thisfile_riff_raw_rgad_track['originator'] != 0)) { + $thisfile_riff['rgad']['track']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_track['name']); + $thisfile_riff['rgad']['track']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_track['originator']); + $thisfile_riff['rgad']['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_track['adjustment'], $thisfile_riff_raw_rgad_track['signbit']); + } + if (($thisfile_riff_raw_rgad_album['name'] != 0) && ($thisfile_riff_raw_rgad_album['originator'] != 0)) { + $thisfile_riff['rgad']['album']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_album['name']); + $thisfile_riff['rgad']['album']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_album['originator']); + $thisfile_riff['rgad']['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_album['adjustment'], $thisfile_riff_raw_rgad_album['signbit']); + } + } + + if (isset($thisfile_riff_WAVE['fact'][0]['data'])) { + $thisfile_riff_raw['fact']['NumberOfSamples'] = $this->EitherEndian2Int(substr($thisfile_riff_WAVE['fact'][0]['data'], 0, 4)); + + // This should be a good way of calculating exact playtime, + // but some sample files have had incorrect number of samples, + // so cannot use this method + + // if (!empty($thisfile_riff_raw['fmt ']['nSamplesPerSec'])) { + // $info['playtime_seconds'] = (float) $thisfile_riff_raw['fact']['NumberOfSamples'] / $thisfile_riff_raw['fmt ']['nSamplesPerSec']; + // } + } + if (!empty($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'])) { + $thisfile_audio['bitrate'] = getid3_lib::CastAsInt($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'] * 8); + } + + if (isset($thisfile_riff_WAVE['bext'][0]['data'])) { + // shortcut + $thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0]; + + $thisfile_riff_WAVE_bext_0['title'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 0, 256)); + $thisfile_riff_WAVE_bext_0['author'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 256, 32)); + $thisfile_riff_WAVE_bext_0['reference'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 288, 32)); + $thisfile_riff_WAVE_bext_0['origin_date'] = substr($thisfile_riff_WAVE_bext_0['data'], 320, 10); + $thisfile_riff_WAVE_bext_0['origin_time'] = substr($thisfile_riff_WAVE_bext_0['data'], 330, 8); + $thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338, 8)); + $thisfile_riff_WAVE_bext_0['bwf_version'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 346, 1)); + $thisfile_riff_WAVE_bext_0['reserved'] = substr($thisfile_riff_WAVE_bext_0['data'], 347, 254); + $thisfile_riff_WAVE_bext_0['coding_history'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601))); + if (preg_match('#^([0-9]{4}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_date'], $matches_bext_date)) { + if (preg_match('#^([0-9]{2}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_time'], $matches_bext_time)) { + list($dummy, $bext_timestamp['year'], $bext_timestamp['month'], $bext_timestamp['day']) = $matches_bext_date; + list($dummy, $bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second']) = $matches_bext_time; + $thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime($bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second'], $bext_timestamp['month'], $bext_timestamp['day'], $bext_timestamp['year']); + } else { + $this->warning('RIFF.WAVE.BEXT.origin_time is invalid'); + } + } else { + $this->warning('RIFF.WAVE.BEXT.origin_date is invalid'); + } + $thisfile_riff['comments']['author'][] = $thisfile_riff_WAVE_bext_0['author']; + $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_bext_0['title']; + } + + if (isset($thisfile_riff_WAVE['MEXT'][0]['data'])) { + // shortcut + $thisfile_riff_WAVE_MEXT_0 = &$thisfile_riff_WAVE['MEXT'][0]; + + $thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 0, 2)); + $thisfile_riff_WAVE_MEXT_0['flags']['homogenous'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0001); + if ($thisfile_riff_WAVE_MEXT_0['flags']['homogenous']) { + $thisfile_riff_WAVE_MEXT_0['flags']['padding'] = ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0002) ? false : true; + $thisfile_riff_WAVE_MEXT_0['flags']['22_or_44'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0004); + $thisfile_riff_WAVE_MEXT_0['flags']['free_format'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0008); + + $thisfile_riff_WAVE_MEXT_0['nominal_frame_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 2, 2)); + } + $thisfile_riff_WAVE_MEXT_0['anciliary_data_length'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 6, 2)); + $thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 8, 2)); + $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_left'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0001); + $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_free'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0002); + $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_right'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0004); + } + + if (isset($thisfile_riff_WAVE['cart'][0]['data'])) { + // shortcut + $thisfile_riff_WAVE_cart_0 = &$thisfile_riff_WAVE['cart'][0]; + + $thisfile_riff_WAVE_cart_0['version'] = substr($thisfile_riff_WAVE_cart_0['data'], 0, 4); + $thisfile_riff_WAVE_cart_0['title'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 4, 64)); + $thisfile_riff_WAVE_cart_0['artist'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 68, 64)); + $thisfile_riff_WAVE_cart_0['cut_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 132, 64)); + $thisfile_riff_WAVE_cart_0['client_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 196, 64)); + $thisfile_riff_WAVE_cart_0['category'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 260, 64)); + $thisfile_riff_WAVE_cart_0['classification'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 324, 64)); + $thisfile_riff_WAVE_cart_0['out_cue'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 388, 64)); + $thisfile_riff_WAVE_cart_0['start_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 452, 10)); + $thisfile_riff_WAVE_cart_0['start_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 462, 8)); + $thisfile_riff_WAVE_cart_0['end_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 470, 10)); + $thisfile_riff_WAVE_cart_0['end_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 480, 8)); + $thisfile_riff_WAVE_cart_0['producer_app_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 488, 64)); + $thisfile_riff_WAVE_cart_0['producer_app_version'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 552, 64)); + $thisfile_riff_WAVE_cart_0['user_defined_text'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 616, 64)); + $thisfile_riff_WAVE_cart_0['zero_db_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 680, 4), true); + for ($i = 0; $i < 8; $i++) { + $thisfile_riff_WAVE_cart_0['post_time'][$i]['usage_fourcc'] = substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8), 4); + $thisfile_riff_WAVE_cart_0['post_time'][$i]['timer_value'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8) + 4, 4)); + } + $thisfile_riff_WAVE_cart_0['url'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 748, 1024)); + $thisfile_riff_WAVE_cart_0['tag_text'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_cart_0['data'], 1772))); + $thisfile_riff['comments']['tag_text'][] = substr($thisfile_riff_WAVE_cart_0['data'], 1772); + + $thisfile_riff['comments']['artist'][] = $thisfile_riff_WAVE_cart_0['artist']; + $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_cart_0['title']; + } + + if (isset($thisfile_riff_WAVE['SNDM'][0]['data'])) { + // SoundMiner metadata + + // shortcuts + $thisfile_riff_WAVE_SNDM_0 = &$thisfile_riff_WAVE['SNDM'][0]; + $thisfile_riff_WAVE_SNDM_0_data = &$thisfile_riff_WAVE_SNDM_0['data']; + $SNDM_startoffset = 0; + $SNDM_endoffset = $thisfile_riff_WAVE_SNDM_0['size']; + + while ($SNDM_startoffset < $SNDM_endoffset) { + $SNDM_thisTagOffset = 0; + $SNDM_thisTagSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4)); + $SNDM_thisTagOffset += 4; + $SNDM_thisTagKey = substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4); + $SNDM_thisTagOffset += 4; + $SNDM_thisTagDataSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2)); + $SNDM_thisTagOffset += 2; + $SNDM_thisTagDataFlags = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2)); + $SNDM_thisTagOffset += 2; + $SNDM_thisTagDataText = substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, $SNDM_thisTagDataSize); + $SNDM_thisTagOffset += $SNDM_thisTagDataSize; + + if ($SNDM_thisTagSize != (4 + 4 + 2 + 2 + $SNDM_thisTagDataSize)) { + $this->warning('RIFF.WAVE.SNDM.data contains tag not expected length (expected: '.$SNDM_thisTagSize.', found: '.(4 + 4 + 2 + 2 + $SNDM_thisTagDataSize).') at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'); + break; + } elseif ($SNDM_thisTagSize <= 0) { + $this->warning('RIFF.WAVE.SNDM.data contains zero-size tag at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'); + break; + } + $SNDM_startoffset += $SNDM_thisTagSize; + + $thisfile_riff_WAVE_SNDM_0['parsed_raw'][$SNDM_thisTagKey] = $SNDM_thisTagDataText; + if ($parsedkey = self::waveSNDMtagLookup($SNDM_thisTagKey)) { + $thisfile_riff_WAVE_SNDM_0['parsed'][$parsedkey] = $SNDM_thisTagDataText; + } else { + $this->warning('RIFF.WAVE.SNDM contains unknown tag "'.$SNDM_thisTagKey.'" at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'); + } + } + + $tagmapping = array( + 'tracktitle'=>'title', + 'category' =>'genre', + 'cdtitle' =>'album', + ); + foreach ($tagmapping as $fromkey => $tokey) { + if (isset($thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey])) { + $thisfile_riff['comments'][$tokey][] = $thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey]; + } + } + } + + if (isset($thisfile_riff_WAVE['iXML'][0]['data'])) { + // requires functions simplexml_load_string and get_object_vars + if ($parsedXML = getid3_lib::XML2array($thisfile_riff_WAVE['iXML'][0]['data'])) { + $thisfile_riff_WAVE['iXML'][0]['parsed'] = $parsedXML; + if (isset($parsedXML['SPEED']['MASTER_SPEED'])) { + @list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['MASTER_SPEED']); + $thisfile_riff_WAVE['iXML'][0]['master_speed'] = $numerator / ($denominator ? $denominator : 1000); + } + if (isset($parsedXML['SPEED']['TIMECODE_RATE'])) { + @list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['TIMECODE_RATE']); + $thisfile_riff_WAVE['iXML'][0]['timecode_rate'] = $numerator / ($denominator ? $denominator : 1000); + } + if (isset($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO']) && !empty($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) && !empty($thisfile_riff_WAVE['iXML'][0]['timecode_rate'])) { + $samples_since_midnight = floatval(ltrim($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_HI'].$parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO'], '0')); + $timestamp_sample_rate = (is_array($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) ? max($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) : $parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']); // XML could possibly contain more than one TIMESTAMP_SAMPLE_RATE tag, returning as array instead of integer [why? does it make sense? perhaps doesn't matter but getID3 needs to deal with it] - see https://github.com/JamesHeinrich/getID3/issues/105 + $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] = $samples_since_midnight / $timestamp_sample_rate; + $h = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] / 3600); + $m = floor(($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600)) / 60); + $s = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60)); + $f = ($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60) - $s) * $thisfile_riff_WAVE['iXML'][0]['timecode_rate']; + $thisfile_riff_WAVE['iXML'][0]['timecode_string'] = sprintf('%02d:%02d:%02d:%05.2f', $h, $m, $s, $f); + $thisfile_riff_WAVE['iXML'][0]['timecode_string_round'] = sprintf('%02d:%02d:%02d:%02d', $h, $m, $s, round($f)); + unset($samples_since_midnight, $timestamp_sample_rate, $h, $m, $s, $f); + } + unset($parsedXML); + } + } + + + + if (!isset($thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) { + $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; + $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']); + } + + if (!empty($info['wavpack'])) { + $thisfile_audio_dataformat = 'wavpack'; + $thisfile_audio['bitrate_mode'] = 'vbr'; + $thisfile_audio['encoder'] = 'WavPack v'.$info['wavpack']['version']; + + // Reset to the way it was - RIFF parsing will have messed this up + $info['avdataend'] = $Original['avdataend']; + $thisfile_audio['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; + + $this->fseek($info['avdataoffset'] - 44); + $RIFFdata = $this->fread(44); + $OrignalRIFFheaderSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 4, 4)) + 8; + $OrignalRIFFdataSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44; + + if ($OrignalRIFFheaderSize > $OrignalRIFFdataSize) { + $info['avdataend'] -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize); + $this->fseek($info['avdataend']); + $RIFFdata .= $this->fread($OrignalRIFFheaderSize - $OrignalRIFFdataSize); + } + + // move the data chunk after all other chunks (if any) + // so that the RIFF parser doesn't see EOF when trying + // to skip over the data chunk + $RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8); + $getid3_riff = new getid3_riff($this->getid3); + $getid3_riff->ParseRIFFdata($RIFFdata); + unset($getid3_riff); + } + + if (isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { + switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { + case 0x0001: // PCM + if (!empty($info['ac3'])) { + // Dolby Digital WAV files masquerade as PCM-WAV, but they're not + $thisfile_audio['wformattag'] = 0x2000; + $thisfile_audio['codec'] = self::wFormatTagLookup($thisfile_audio['wformattag']); + $thisfile_audio['lossless'] = false; + $thisfile_audio['bitrate'] = $info['ac3']['bitrate']; + $thisfile_audio['sample_rate'] = $info['ac3']['sample_rate']; + } + if (!empty($info['dts'])) { + // Dolby DTS files masquerade as PCM-WAV, but they're not + $thisfile_audio['wformattag'] = 0x2001; + $thisfile_audio['codec'] = self::wFormatTagLookup($thisfile_audio['wformattag']); + $thisfile_audio['lossless'] = false; + $thisfile_audio['bitrate'] = $info['dts']['bitrate']; + $thisfile_audio['sample_rate'] = $info['dts']['sample_rate']; + } + break; + case 0x08AE: // ClearJump LiteWave + $thisfile_audio['bitrate_mode'] = 'vbr'; + $thisfile_audio_dataformat = 'litewave'; + + //typedef struct tagSLwFormat { + // WORD m_wCompFormat; // low byte defines compression method, high byte is compression flags + // DWORD m_dwScale; // scale factor for lossy compression + // DWORD m_dwBlockSize; // number of samples in encoded blocks + // WORD m_wQuality; // alias for the scale factor + // WORD m_wMarkDistance; // distance between marks in bytes + // WORD m_wReserved; + // + // //following paramters are ignored if CF_FILESRC is not set + // DWORD m_dwOrgSize; // original file size in bytes + // WORD m_bFactExists; // indicates if 'fact' chunk exists in the original file + // DWORD m_dwRiffChunkSize; // riff chunk size in the original file + // + // PCMWAVEFORMAT m_OrgWf; // original wave format + // }SLwFormat, *PSLwFormat; + + // shortcut + $thisfile_riff['litewave']['raw'] = array(); + $riff_litewave = &$thisfile_riff['litewave']; + $riff_litewave_raw = &$riff_litewave['raw']; + + $flags = array( + 'compression_method' => 1, + 'compression_flags' => 1, + 'm_dwScale' => 4, + 'm_dwBlockSize' => 4, + 'm_wQuality' => 2, + 'm_wMarkDistance' => 2, + 'm_wReserved' => 2, + 'm_dwOrgSize' => 4, + 'm_bFactExists' => 2, + 'm_dwRiffChunkSize' => 4, + ); + $litewave_offset = 18; + foreach ($flags as $flag => $length) { + $riff_litewave_raw[$flag] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], $litewave_offset, $length)); + $litewave_offset += $length; + } + + //$riff_litewave['quality_factor'] = intval(round((2000 - $riff_litewave_raw['m_dwScale']) / 20)); + $riff_litewave['quality_factor'] = $riff_litewave_raw['m_wQuality']; + + $riff_litewave['flags']['raw_source'] = ($riff_litewave_raw['compression_flags'] & 0x01) ? false : true; + $riff_litewave['flags']['vbr_blocksize'] = ($riff_litewave_raw['compression_flags'] & 0x02) ? false : true; + $riff_litewave['flags']['seekpoints'] = (bool) ($riff_litewave_raw['compression_flags'] & 0x04); + + $thisfile_audio['lossless'] = (($riff_litewave_raw['m_wQuality'] == 100) ? true : false); + $thisfile_audio['encoder_options'] = '-q'.$riff_litewave['quality_factor']; + break; + + default: + break; + } + } + if ($info['avdataend'] > $info['filesize']) { + switch (!empty($thisfile_audio_dataformat) ? $thisfile_audio_dataformat : '') { + case 'wavpack': // WavPack + case 'lpac': // LPAC + case 'ofr': // OptimFROG + case 'ofs': // OptimFROG DualStream + // lossless compressed audio formats that keep original RIFF headers - skip warning + break; + + case 'litewave': + if (($info['avdataend'] - $info['filesize']) == 1) { + // LiteWave appears to incorrectly *not* pad actual output file + // to nearest WORD boundary so may appear to be short by one + // byte, in which case - skip warning + } else { + // Short by more than one byte, throw warning + $this->warning('Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'); + $info['avdataend'] = $info['filesize']; + } + break; + + default: + if ((($info['avdataend'] - $info['filesize']) == 1) && (($thisfile_riff[$RIFFsubtype]['data'][0]['size'] % 2) == 0) && ((($info['filesize'] - $info['avdataoffset']) % 2) == 1)) { + // output file appears to be incorrectly *not* padded to nearest WORD boundary + // Output less severe warning + $this->warning('File should probably be padded to nearest WORD boundary, but it is not (expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' therefore short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'); + $info['avdataend'] = $info['filesize']; + } else { + // Short by more than one byte, throw warning + $this->warning('Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'); + $info['avdataend'] = $info['filesize']; + } + break; + } + } + if (!empty($info['mpeg']['audio']['LAME']['audio_bytes'])) { + if ((($info['avdataend'] - $info['avdataoffset']) - $info['mpeg']['audio']['LAME']['audio_bytes']) == 1) { + $info['avdataend']--; + $this->warning('Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'); + } + } + if (isset($thisfile_audio_dataformat) && ($thisfile_audio_dataformat == 'ac3')) { + unset($thisfile_audio['bits_per_sample']); + if (!empty($info['ac3']['bitrate']) && ($info['ac3']['bitrate'] != $thisfile_audio['bitrate'])) { + $thisfile_audio['bitrate'] = $info['ac3']['bitrate']; + } + } + break; + + // http://en.wikipedia.org/wiki/Audio_Video_Interleave + case 'AVI ': + $info['fileformat'] = 'avi'; + $info['mime_type'] = 'video/avi'; + + $thisfile_video['bitrate_mode'] = 'vbr'; // maybe not, but probably + $thisfile_video['dataformat'] = 'avi'; + + $thisfile_riff_video_current = array(); + + if (isset($thisfile_riff[$RIFFsubtype]['movi']['offset'])) { + $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['movi']['offset'] + 8; + if (isset($thisfile_riff['AVIX'])) { + $info['avdataend'] = $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['offset'] + $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['size']; + } else { + $info['avdataend'] = $thisfile_riff['AVI ']['movi']['offset'] + $thisfile_riff['AVI ']['movi']['size']; + } + if ($info['avdataend'] > $info['filesize']) { + $this->warning('Probably truncated file - expecting '.($info['avdataend'] - $info['avdataoffset']).' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($info['avdataend'] - $info['filesize']).' bytes)'); + $info['avdataend'] = $info['filesize']; + } + } + + if (isset($thisfile_riff['AVI ']['hdrl']['strl']['indx'])) { + //$bIndexType = array( + // 0x00 => 'AVI_INDEX_OF_INDEXES', + // 0x01 => 'AVI_INDEX_OF_CHUNKS', + // 0x80 => 'AVI_INDEX_IS_DATA', + //); + //$bIndexSubtype = array( + // 0x01 => array( + // 0x01 => 'AVI_INDEX_2FIELD', + // ), + //); + foreach ($thisfile_riff['AVI ']['hdrl']['strl']['indx'] as $streamnumber => $steamdataarray) { + $ahsisd = &$thisfile_riff['AVI ']['hdrl']['strl']['indx'][$streamnumber]['data']; + + $thisfile_riff_raw['indx'][$streamnumber]['wLongsPerEntry'] = $this->EitherEndian2Int(substr($ahsisd, 0, 2)); + $thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType'] = $this->EitherEndian2Int(substr($ahsisd, 2, 1)); + $thisfile_riff_raw['indx'][$streamnumber]['bIndexType'] = $this->EitherEndian2Int(substr($ahsisd, 3, 1)); + $thisfile_riff_raw['indx'][$streamnumber]['nEntriesInUse'] = $this->EitherEndian2Int(substr($ahsisd, 4, 4)); + $thisfile_riff_raw['indx'][$streamnumber]['dwChunkId'] = substr($ahsisd, 8, 4); + $thisfile_riff_raw['indx'][$streamnumber]['dwReserved'] = $this->EitherEndian2Int(substr($ahsisd, 12, 4)); + + //$thisfile_riff_raw['indx'][$streamnumber]['bIndexType_name'] = $bIndexType[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']]; + //$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType_name'] = $bIndexSubtype[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']][$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType']]; + + unset($ahsisd); + } + } + if (isset($thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data'])) { + $avihData = $thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data']; + + // shortcut + $thisfile_riff_raw['avih'] = array(); + $thisfile_riff_raw_avih = &$thisfile_riff_raw['avih']; + + $thisfile_riff_raw_avih['dwMicroSecPerFrame'] = $this->EitherEndian2Int(substr($avihData, 0, 4)); // frame display rate (or 0L) + if ($thisfile_riff_raw_avih['dwMicroSecPerFrame'] == 0) { + $this->error('Corrupt RIFF file: avih.dwMicroSecPerFrame == zero'); + return false; + } + + $flags = array( + 'dwMaxBytesPerSec', // max. transfer rate + 'dwPaddingGranularity', // pad to multiples of this size; normally 2K. + 'dwFlags', // the ever-present flags + 'dwTotalFrames', // # frames in file + 'dwInitialFrames', // + 'dwStreams', // + 'dwSuggestedBufferSize', // + 'dwWidth', // + 'dwHeight', // + 'dwScale', // + 'dwRate', // + 'dwStart', // + 'dwLength', // + ); + $avih_offset = 4; + foreach ($flags as $flag) { + $thisfile_riff_raw_avih[$flag] = $this->EitherEndian2Int(substr($avihData, $avih_offset, 4)); + $avih_offset += 4; + } + + $flags = array( + 'hasindex' => 0x00000010, + 'mustuseindex' => 0x00000020, + 'interleaved' => 0x00000100, + 'trustcktype' => 0x00000800, + 'capturedfile' => 0x00010000, + 'copyrighted' => 0x00020010, + ); + foreach ($flags as $flag => $value) { + $thisfile_riff_raw_avih['flags'][$flag] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & $value); + } + + // shortcut + $thisfile_riff_video[$streamindex] = array(); + /** @var array $thisfile_riff_video_current */ + $thisfile_riff_video_current = &$thisfile_riff_video[$streamindex]; + + if ($thisfile_riff_raw_avih['dwWidth'] > 0) { + $thisfile_riff_video_current['frame_width'] = $thisfile_riff_raw_avih['dwWidth']; + $thisfile_video['resolution_x'] = $thisfile_riff_video_current['frame_width']; + } + if ($thisfile_riff_raw_avih['dwHeight'] > 0) { + $thisfile_riff_video_current['frame_height'] = $thisfile_riff_raw_avih['dwHeight']; + $thisfile_video['resolution_y'] = $thisfile_riff_video_current['frame_height']; + } + if ($thisfile_riff_raw_avih['dwTotalFrames'] > 0) { + $thisfile_riff_video_current['total_frames'] = $thisfile_riff_raw_avih['dwTotalFrames']; + $thisfile_video['total_frames'] = $thisfile_riff_video_current['total_frames']; + } + + $thisfile_riff_video_current['frame_rate'] = round(1000000 / $thisfile_riff_raw_avih['dwMicroSecPerFrame'], 3); + $thisfile_video['frame_rate'] = $thisfile_riff_video_current['frame_rate']; + } + if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][0]['data'])) { + if (is_array($thisfile_riff['AVI ']['hdrl']['strl']['strh'])) { + for ($i = 0; $i < count($thisfile_riff['AVI ']['hdrl']['strl']['strh']); $i++) { + if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'])) { + $strhData = $thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data']; + $strhfccType = substr($strhData, 0, 4); + + if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'])) { + $strfData = $thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data']; + + // shortcut + $thisfile_riff_raw_strf_strhfccType_streamindex = &$thisfile_riff_raw['strf'][$strhfccType][$streamindex]; + + switch ($strhfccType) { + case 'auds': + $thisfile_audio['bitrate_mode'] = 'cbr'; + $thisfile_audio_dataformat = 'wav'; + if (isset($thisfile_riff_audio) && is_array($thisfile_riff_audio)) { + $streamindex = count($thisfile_riff_audio); + } + + $thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($strfData); + $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; + + // shortcut + $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; + $thisfile_audio_streams_currentstream = &$thisfile_audio['streams'][$streamindex]; + + if ($thisfile_audio_streams_currentstream['bits_per_sample'] == 0) { + unset($thisfile_audio_streams_currentstream['bits_per_sample']); + } + $thisfile_audio_streams_currentstream['wformattag'] = $thisfile_audio_streams_currentstream['raw']['wFormatTag']; + unset($thisfile_audio_streams_currentstream['raw']); + + // shortcut + $thisfile_riff_raw['strf'][$strhfccType][$streamindex] = $thisfile_riff_audio[$streamindex]['raw']; + + unset($thisfile_riff_audio[$streamindex]['raw']); + $thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); + + $thisfile_audio['lossless'] = false; + switch ($thisfile_riff_raw_strf_strhfccType_streamindex['wFormatTag']) { + case 0x0001: // PCM + $thisfile_audio_dataformat = 'wav'; + $thisfile_audio['lossless'] = true; + break; + + case 0x0050: // MPEG Layer 2 or Layer 1 + $thisfile_audio_dataformat = 'mp2'; // Assume Layer-2 + break; + + case 0x0055: // MPEG Layer 3 + $thisfile_audio_dataformat = 'mp3'; + break; + + case 0x00FF: // AAC + $thisfile_audio_dataformat = 'aac'; + break; + + case 0x0161: // Windows Media v7 / v8 / v9 + case 0x0162: // Windows Media Professional v9 + case 0x0163: // Windows Media Lossess v9 + $thisfile_audio_dataformat = 'wma'; + break; + + case 0x2000: // AC-3 + $thisfile_audio_dataformat = 'ac3'; + break; + + case 0x2001: // DTS + $thisfile_audio_dataformat = 'dts'; + break; + + default: + $thisfile_audio_dataformat = 'wav'; + break; + } + $thisfile_audio_streams_currentstream['dataformat'] = $thisfile_audio_dataformat; + $thisfile_audio_streams_currentstream['lossless'] = $thisfile_audio['lossless']; + $thisfile_audio_streams_currentstream['bitrate_mode'] = $thisfile_audio['bitrate_mode']; + break; + + + case 'iavs': + case 'vids': + // shortcut + $thisfile_riff_raw['strh'][$i] = array(); + $thisfile_riff_raw_strh_current = &$thisfile_riff_raw['strh'][$i]; + + $thisfile_riff_raw_strh_current['fccType'] = substr($strhData, 0, 4); // same as $strhfccType; + $thisfile_riff_raw_strh_current['fccHandler'] = substr($strhData, 4, 4); + $thisfile_riff_raw_strh_current['dwFlags'] = $this->EitherEndian2Int(substr($strhData, 8, 4)); // Contains AVITF_* flags + $thisfile_riff_raw_strh_current['wPriority'] = $this->EitherEndian2Int(substr($strhData, 12, 2)); + $thisfile_riff_raw_strh_current['wLanguage'] = $this->EitherEndian2Int(substr($strhData, 14, 2)); + $thisfile_riff_raw_strh_current['dwInitialFrames'] = $this->EitherEndian2Int(substr($strhData, 16, 4)); + $thisfile_riff_raw_strh_current['dwScale'] = $this->EitherEndian2Int(substr($strhData, 20, 4)); + $thisfile_riff_raw_strh_current['dwRate'] = $this->EitherEndian2Int(substr($strhData, 24, 4)); + $thisfile_riff_raw_strh_current['dwStart'] = $this->EitherEndian2Int(substr($strhData, 28, 4)); + $thisfile_riff_raw_strh_current['dwLength'] = $this->EitherEndian2Int(substr($strhData, 32, 4)); + $thisfile_riff_raw_strh_current['dwSuggestedBufferSize'] = $this->EitherEndian2Int(substr($strhData, 36, 4)); + $thisfile_riff_raw_strh_current['dwQuality'] = $this->EitherEndian2Int(substr($strhData, 40, 4)); + $thisfile_riff_raw_strh_current['dwSampleSize'] = $this->EitherEndian2Int(substr($strhData, 44, 4)); + $thisfile_riff_raw_strh_current['rcFrame'] = $this->EitherEndian2Int(substr($strhData, 48, 4)); + + $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strh_current['fccHandler']); + $thisfile_video['fourcc'] = $thisfile_riff_raw_strh_current['fccHandler']; + if (!$thisfile_riff_video_current['codec'] && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) && self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { + $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']); + $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; + } + $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; + $thisfile_video['pixel_aspect_ratio'] = (float) 1; + switch ($thisfile_riff_raw_strh_current['fccHandler']) { + case 'HFYU': // Huffman Lossless Codec + case 'IRAW': // Intel YUV Uncompressed + case 'YUY2': // Uncompressed YUV 4:2:2 + $thisfile_video['lossless'] = true; + break; + + default: + $thisfile_video['lossless'] = false; + break; + } + + switch ($strhfccType) { + case 'vids': + $thisfile_riff_raw_strf_strhfccType_streamindex = self::ParseBITMAPINFOHEADER(substr($strfData, 0, 40), ($this->container == 'riff')); + $thisfile_video['bits_per_sample'] = $thisfile_riff_raw_strf_strhfccType_streamindex['biBitCount']; + + if ($thisfile_riff_video_current['codec'] == 'DV') { + $thisfile_riff_video_current['dv_type'] = 2; + } + break; + + case 'iavs': + $thisfile_riff_video_current['dv_type'] = 1; + break; + } + break; + + default: + $this->warning('Unhandled fccType for stream ('.$i.'): "'.$strhfccType.'"'); + break; + + } + } + } + + if (isset($thisfile_riff_raw_strf_strhfccType_streamindex) && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { + + $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; + if (self::fourccLookup($thisfile_video['fourcc'])) { + $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_video['fourcc']); + $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; + } + + switch ($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) { + case 'HFYU': // Huffman Lossless Codec + case 'IRAW': // Intel YUV Uncompressed + case 'YUY2': // Uncompressed YUV 4:2:2 + $thisfile_video['lossless'] = true; + //$thisfile_video['bits_per_sample'] = 24; + break; + + default: + $thisfile_video['lossless'] = false; + //$thisfile_video['bits_per_sample'] = 24; + break; + } + + } + } + } + } + break; + + + case 'AMV ': + $info['fileformat'] = 'amv'; + $info['mime_type'] = 'video/amv'; + + $thisfile_video['bitrate_mode'] = 'vbr'; // it's MJPEG, presumably contant-quality encoding, thereby VBR + $thisfile_video['dataformat'] = 'mjpeg'; + $thisfile_video['codec'] = 'mjpeg'; + $thisfile_video['lossless'] = false; + $thisfile_video['bits_per_sample'] = 24; + + $thisfile_audio['dataformat'] = 'adpcm'; + $thisfile_audio['lossless'] = false; + break; + + + // http://en.wikipedia.org/wiki/CD-DA + case 'CDDA': + $info['fileformat'] = 'cda'; + unset($info['mime_type']); + + $thisfile_audio_dataformat = 'cda'; + + $info['avdataoffset'] = 44; + + if (isset($thisfile_riff['CDDA']['fmt '][0]['data'])) { + // shortcut + $thisfile_riff_CDDA_fmt_0 = &$thisfile_riff['CDDA']['fmt '][0]; + + $thisfile_riff_CDDA_fmt_0['unknown1'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 0, 2)); + $thisfile_riff_CDDA_fmt_0['track_num'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 2, 2)); + $thisfile_riff_CDDA_fmt_0['disc_id'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 4, 4)); + $thisfile_riff_CDDA_fmt_0['start_offset_frame'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 8, 4)); + $thisfile_riff_CDDA_fmt_0['playtime_frames'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 12, 4)); + $thisfile_riff_CDDA_fmt_0['unknown6'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 16, 4)); + $thisfile_riff_CDDA_fmt_0['unknown7'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 20, 4)); + + $thisfile_riff_CDDA_fmt_0['start_offset_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['start_offset_frame'] / 75; + $thisfile_riff_CDDA_fmt_0['playtime_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['playtime_frames'] / 75; + $info['comments']['track_number'] = $thisfile_riff_CDDA_fmt_0['track_num']; + $info['playtime_seconds'] = $thisfile_riff_CDDA_fmt_0['playtime_seconds']; + + // hardcoded data for CD-audio + $thisfile_audio['lossless'] = true; + $thisfile_audio['sample_rate'] = 44100; + $thisfile_audio['channels'] = 2; + $thisfile_audio['bits_per_sample'] = 16; + $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $thisfile_audio['channels'] * $thisfile_audio['bits_per_sample']; + $thisfile_audio['bitrate_mode'] = 'cbr'; + } + break; + + // http://en.wikipedia.org/wiki/AIFF + case 'AIFF': + case 'AIFC': + $info['fileformat'] = 'aiff'; + $info['mime_type'] = 'audio/x-aiff'; + + $thisfile_audio['bitrate_mode'] = 'cbr'; + $thisfile_audio_dataformat = 'aiff'; + $thisfile_audio['lossless'] = true; + + if (isset($thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'])) { + $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'] + 8; + $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['SSND'][0]['size']; + if ($info['avdataend'] > $info['filesize']) { + if (($info['avdataend'] == ($info['filesize'] + 1)) && (($info['filesize'] % 2) == 1)) { + // structures rounded to 2-byte boundary, but dumb encoders + // forget to pad end of file to make this actually work + } else { + $this->warning('Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['SSND'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found'); + } + $info['avdataend'] = $info['filesize']; + } + } + + if (isset($thisfile_riff[$RIFFsubtype]['COMM'][0]['data'])) { + + // shortcut + $thisfile_riff_RIFFsubtype_COMM_0_data = &$thisfile_riff[$RIFFsubtype]['COMM'][0]['data']; + + $thisfile_riff_audio['channels'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 0, 2), true); + $thisfile_riff_audio['total_samples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 2, 4), false); + $thisfile_riff_audio['bits_per_sample'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 6, 2), true); + $thisfile_riff_audio['sample_rate'] = (int) getid3_lib::BigEndian2Float(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 8, 10)); + + if ($thisfile_riff[$RIFFsubtype]['COMM'][0]['size'] > 18) { + $thisfile_riff_audio['codec_fourcc'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 18, 4); + $CodecNameSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 22, 1), false); + $thisfile_riff_audio['codec_name'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 23, $CodecNameSize); + switch ($thisfile_riff_audio['codec_name']) { + case 'NONE': + $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; + $thisfile_audio['lossless'] = true; + break; + + case '': + switch ($thisfile_riff_audio['codec_fourcc']) { + // http://developer.apple.com/qa/snd/snd07.html + case 'sowt': + $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Little-Endian PCM'; + $thisfile_audio['lossless'] = true; + break; + + case 'twos': + $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Big-Endian PCM'; + $thisfile_audio['lossless'] = true; + break; + + default: + break; + } + break; + + default: + $thisfile_audio['codec'] = $thisfile_riff_audio['codec_name']; + $thisfile_audio['lossless'] = false; + break; + } + } + + $thisfile_audio['channels'] = $thisfile_riff_audio['channels']; + if ($thisfile_riff_audio['bits_per_sample'] > 0) { + $thisfile_audio['bits_per_sample'] = $thisfile_riff_audio['bits_per_sample']; + } + $thisfile_audio['sample_rate'] = $thisfile_riff_audio['sample_rate']; + if ($thisfile_audio['sample_rate'] == 0) { + $this->error('Corrupted AIFF file: sample_rate == zero'); + return false; + } + $info['playtime_seconds'] = $thisfile_riff_audio['total_samples'] / $thisfile_audio['sample_rate']; + } + + if (isset($thisfile_riff[$RIFFsubtype]['COMT'])) { + $offset = 0; + $CommentCount = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); + $offset += 2; + for ($i = 0; $i < $CommentCount; $i++) { + $info['comments_raw'][$i]['timestamp'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 4), false); + $offset += 4; + $info['comments_raw'][$i]['marker_id'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), true); + $offset += 2; + $CommentLength = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); + $offset += 2; + $info['comments_raw'][$i]['comment'] = substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, $CommentLength); + $offset += $CommentLength; + + $info['comments_raw'][$i]['timestamp_unix'] = getid3_lib::DateMac2Unix($info['comments_raw'][$i]['timestamp']); + $thisfile_riff['comments']['comment'][] = $info['comments_raw'][$i]['comment']; + } + } + + $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); + foreach ($CommentsChunkNames as $key => $value) { + if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { + $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; + } + } +/* + if (isset($thisfile_riff[$RIFFsubtype]['ID3 '])) { + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); + $getid3_temp = new getID3(); + $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); + $getid3_id3v2 = new getid3_id3v2($getid3_temp); + $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['ID3 '][0]['offset'] + 8; + if ($thisfile_riff[$RIFFsubtype]['ID3 '][0]['valid'] = $getid3_id3v2->Analyze()) { + $info['id3v2'] = $getid3_temp->info['id3v2']; + } + unset($getid3_temp, $getid3_id3v2); + } +*/ + break; + + // http://en.wikipedia.org/wiki/8SVX + case '8SVX': + $info['fileformat'] = '8svx'; + $info['mime_type'] = 'audio/8svx'; + + $thisfile_audio['bitrate_mode'] = 'cbr'; + $thisfile_audio_dataformat = '8svx'; + $thisfile_audio['bits_per_sample'] = 8; + $thisfile_audio['channels'] = 1; // overridden below, if need be + $ActualBitsPerSample = 0; + + if (isset($thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'])) { + $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'] + 8; + $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['BODY'][0]['size']; + if ($info['avdataend'] > $info['filesize']) { + $this->warning('Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['BODY'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found'); + } + } + + if (isset($thisfile_riff[$RIFFsubtype]['VHDR'][0]['offset'])) { + // shortcut + $thisfile_riff_RIFFsubtype_VHDR_0 = &$thisfile_riff[$RIFFsubtype]['VHDR'][0]; + + $thisfile_riff_RIFFsubtype_VHDR_0['oneShotHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 0, 4)); + $thisfile_riff_RIFFsubtype_VHDR_0['repeatHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 4, 4)); + $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerHiCycle'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 8, 4)); + $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 12, 2)); + $thisfile_riff_RIFFsubtype_VHDR_0['ctOctave'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 14, 1)); + $thisfile_riff_RIFFsubtype_VHDR_0['sCompression'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 15, 1)); + $thisfile_riff_RIFFsubtype_VHDR_0['Volume'] = getid3_lib::FixedPoint16_16(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 16, 4)); + + $thisfile_audio['sample_rate'] = $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec']; + + switch ($thisfile_riff_RIFFsubtype_VHDR_0['sCompression']) { + case 0: + $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; + $thisfile_audio['lossless'] = true; + $ActualBitsPerSample = 8; + break; + + case 1: + $thisfile_audio['codec'] = 'Fibonacci-delta encoding'; + $thisfile_audio['lossless'] = false; + $ActualBitsPerSample = 4; + break; + + default: + $this->warning('Unexpected sCompression value in 8SVX.VHDR chunk - expecting 0 or 1, found "'.$thisfile_riff_RIFFsubtype_VHDR_0['sCompression'].'"'); + break; + } + } + + if (isset($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'])) { + $ChannelsIndex = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'], 0, 4)); + switch ($ChannelsIndex) { + case 6: // Stereo + $thisfile_audio['channels'] = 2; + break; + + case 2: // Left channel only + case 4: // Right channel only + $thisfile_audio['channels'] = 1; + break; + + default: + $this->warning('Unexpected value in 8SVX.CHAN chunk - expecting 2 or 4 or 6, found "'.$ChannelsIndex.'"'); + break; + } + + } + + $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); + foreach ($CommentsChunkNames as $key => $value) { + if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { + $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; + } + } + + $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $ActualBitsPerSample * $thisfile_audio['channels']; + if (!empty($thisfile_audio['bitrate'])) { + $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($thisfile_audio['bitrate'] / 8); + } + break; + + case 'CDXA': + $info['fileformat'] = 'vcd'; // Asume Video CD + $info['mime_type'] = 'video/mpeg'; + + if (!empty($thisfile_riff['CDXA']['data'][0]['size'])) { + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.mpeg.php', __FILE__, true); + + $getid3_temp = new getID3(); + $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); + $getid3_mpeg = new getid3_mpeg($getid3_temp); + $getid3_mpeg->Analyze(); + if (empty($getid3_temp->info['error'])) { + $info['audio'] = $getid3_temp->info['audio']; + $info['video'] = $getid3_temp->info['video']; + $info['mpeg'] = $getid3_temp->info['mpeg']; + $info['warning'] = $getid3_temp->info['warning']; + } + unset($getid3_temp, $getid3_mpeg); + } + break; + + case 'WEBP': + // https://developers.google.com/speed/webp/docs/riff_container + // https://tools.ietf.org/html/rfc6386 + // https://chromium.googlesource.com/webm/libwebp/+/master/doc/webp-lossless-bitstream-spec.txt + $info['fileformat'] = 'webp'; + $info['mime_type'] = 'image/webp'; + + if (!empty($thisfile_riff['WEBP']['VP8 '][0]['size'])) { + $old_offset = $this->ftell(); + $this->fseek($thisfile_riff['WEBP']['VP8 '][0]['offset'] + 8); // 4 bytes "VP8 " + 4 bytes chunk size + $WEBP_VP8_header = $this->fread(10); + $this->fseek($old_offset); + if (substr($WEBP_VP8_header, 3, 3) == "\x9D\x01\x2A") { + $thisfile_riff['WEBP']['VP8 '][0]['keyframe'] = !(getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x800000); + $thisfile_riff['WEBP']['VP8 '][0]['version'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x700000) >> 20; + $thisfile_riff['WEBP']['VP8 '][0]['show_frame'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x080000); + $thisfile_riff['WEBP']['VP8 '][0]['data_bytes'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x07FFFF) >> 0; + + $thisfile_riff['WEBP']['VP8 '][0]['scale_x'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 6, 2)) & 0xC000) >> 14; + $thisfile_riff['WEBP']['VP8 '][0]['width'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 6, 2)) & 0x3FFF); + $thisfile_riff['WEBP']['VP8 '][0]['scale_y'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 8, 2)) & 0xC000) >> 14; + $thisfile_riff['WEBP']['VP8 '][0]['height'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 8, 2)) & 0x3FFF); + + $info['video']['resolution_x'] = $thisfile_riff['WEBP']['VP8 '][0]['width']; + $info['video']['resolution_y'] = $thisfile_riff['WEBP']['VP8 '][0]['height']; + } else { + $this->error('Expecting 9D 01 2A at offset '.($thisfile_riff['WEBP']['VP8 '][0]['offset'] + 8 + 3).', found "'.getid3_lib::PrintHexBytes(substr($WEBP_VP8_header, 3, 3)).'"'); + } + + } + if (!empty($thisfile_riff['WEBP']['VP8L'][0]['size'])) { + $old_offset = $this->ftell(); + $this->fseek($thisfile_riff['WEBP']['VP8L'][0]['offset'] + 8); // 4 bytes "VP8L" + 4 bytes chunk size + $WEBP_VP8L_header = $this->fread(10); + $this->fseek($old_offset); + if (substr($WEBP_VP8L_header, 0, 1) == "\x2F") { + $width_height_flags = getid3_lib::LittleEndian2Bin(substr($WEBP_VP8L_header, 1, 4)); + $thisfile_riff['WEBP']['VP8L'][0]['width'] = bindec(substr($width_height_flags, 18, 14)) + 1; + $thisfile_riff['WEBP']['VP8L'][0]['height'] = bindec(substr($width_height_flags, 4, 14)) + 1; + $thisfile_riff['WEBP']['VP8L'][0]['alpha_is_used'] = (bool) bindec(substr($width_height_flags, 3, 1)); + $thisfile_riff['WEBP']['VP8L'][0]['version'] = bindec(substr($width_height_flags, 0, 3)); + + $info['video']['resolution_x'] = $thisfile_riff['WEBP']['VP8L'][0]['width']; + $info['video']['resolution_y'] = $thisfile_riff['WEBP']['VP8L'][0]['height']; + } else { + $this->error('Expecting 2F at offset '.($thisfile_riff['WEBP']['VP8L'][0]['offset'] + 8).', found "'.getid3_lib::PrintHexBytes(substr($WEBP_VP8L_header, 0, 1)).'"'); + } + + } + break; + + default: + $this->error('Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA|WEBP), found "'.$RIFFsubtype.'" instead'); + //unset($info['fileformat']); + } + + switch ($RIFFsubtype) { + case 'WAVE': + case 'AIFF': + case 'AIFC': + $ID3v2_key_good = 'id3 '; + $ID3v2_keys_bad = array('ID3 ', 'tag '); + foreach ($ID3v2_keys_bad as $ID3v2_key_bad) { + if (isset($thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]) && !array_key_exists($ID3v2_key_good, $thisfile_riff[$RIFFsubtype])) { + $thisfile_riff[$RIFFsubtype][$ID3v2_key_good] = $thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]; + $this->warning('mapping "'.$ID3v2_key_bad.'" chunk to "'.$ID3v2_key_good.'"'); + } + } + + if (isset($thisfile_riff[$RIFFsubtype]['id3 '])) { + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); + + $getid3_temp = new getID3(); + $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); + $getid3_id3v2 = new getid3_id3v2($getid3_temp); + $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['id3 '][0]['offset'] + 8; + if ($thisfile_riff[$RIFFsubtype]['id3 '][0]['valid'] = $getid3_id3v2->Analyze()) { + $info['id3v2'] = $getid3_temp->info['id3v2']; + } + unset($getid3_temp, $getid3_id3v2); + } + break; + } + + if (isset($thisfile_riff_WAVE['DISP']) && is_array($thisfile_riff_WAVE['DISP'])) { + $thisfile_riff['comments']['title'][] = trim(substr($thisfile_riff_WAVE['DISP'][count($thisfile_riff_WAVE['DISP']) - 1]['data'], 4)); + } + if (isset($thisfile_riff_WAVE['INFO']) && is_array($thisfile_riff_WAVE['INFO'])) { + self::parseComments($thisfile_riff_WAVE['INFO'], $thisfile_riff['comments']); + } + if (isset($thisfile_riff['AVI ']['INFO']) && is_array($thisfile_riff['AVI ']['INFO'])) { + self::parseComments($thisfile_riff['AVI ']['INFO'], $thisfile_riff['comments']); + } + + if (empty($thisfile_audio['encoder']) && !empty($info['mpeg']['audio']['LAME']['short_version'])) { + $thisfile_audio['encoder'] = $info['mpeg']['audio']['LAME']['short_version']; + } + + if (!isset($info['playtime_seconds'])) { + $info['playtime_seconds'] = 0; + } + if (isset($thisfile_riff_raw['strh'][0]['dwLength']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { + // needed for >2GB AVIs where 'avih' chunk only lists number of frames in that chunk, not entire movie + $info['playtime_seconds'] = $thisfile_riff_raw['strh'][0]['dwLength'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000); + } elseif (isset($thisfile_riff_raw['avih']['dwTotalFrames']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { + $info['playtime_seconds'] = $thisfile_riff_raw['avih']['dwTotalFrames'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000); + } + + if ($info['playtime_seconds'] > 0) { + if (isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { + + if (!isset($info['bitrate'])) { + $info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); + } + + } elseif (isset($thisfile_riff_audio) && !isset($thisfile_riff_video)) { + + if (!isset($thisfile_audio['bitrate'])) { + $thisfile_audio['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); + } + + } elseif (!isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { + + if (!isset($thisfile_video['bitrate'])) { + $thisfile_video['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); + } + + } + } + + + if (isset($thisfile_riff_video) && isset($thisfile_audio['bitrate']) && ($thisfile_audio['bitrate'] > 0) && ($info['playtime_seconds'] > 0)) { + + $info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); + $thisfile_audio['bitrate'] = 0; + $thisfile_video['bitrate'] = $info['bitrate']; + foreach ($thisfile_riff_audio as $channelnumber => $audioinfoarray) { + $thisfile_video['bitrate'] -= $audioinfoarray['bitrate']; + $thisfile_audio['bitrate'] += $audioinfoarray['bitrate']; + } + if ($thisfile_video['bitrate'] <= 0) { + unset($thisfile_video['bitrate']); + } + if ($thisfile_audio['bitrate'] <= 0) { + unset($thisfile_audio['bitrate']); + } + } + + if (isset($info['mpeg']['audio'])) { + $thisfile_audio_dataformat = 'mp'.$info['mpeg']['audio']['layer']; + $thisfile_audio['sample_rate'] = $info['mpeg']['audio']['sample_rate']; + $thisfile_audio['channels'] = $info['mpeg']['audio']['channels']; + $thisfile_audio['bitrate'] = $info['mpeg']['audio']['bitrate']; + $thisfile_audio['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); + if (!empty($info['mpeg']['audio']['codec'])) { + $thisfile_audio['codec'] = $info['mpeg']['audio']['codec'].' '.$thisfile_audio['codec']; + } + if (!empty($thisfile_audio['streams'])) { + foreach ($thisfile_audio['streams'] as $streamnumber => $streamdata) { + if ($streamdata['dataformat'] == $thisfile_audio_dataformat) { + $thisfile_audio['streams'][$streamnumber]['sample_rate'] = $thisfile_audio['sample_rate']; + $thisfile_audio['streams'][$streamnumber]['channels'] = $thisfile_audio['channels']; + $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; + $thisfile_audio['streams'][$streamnumber]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; + $thisfile_audio['streams'][$streamnumber]['codec'] = $thisfile_audio['codec']; + } + } + } + $getid3_mp3 = new getid3_mp3($this->getid3); + $thisfile_audio['encoder_options'] = $getid3_mp3->GuessEncoderOptions(); + unset($getid3_mp3); + } + + + if (!empty($thisfile_riff_raw['fmt ']['wBitsPerSample']) && ($thisfile_riff_raw['fmt ']['wBitsPerSample'] > 0)) { + switch ($thisfile_audio_dataformat) { + case 'ac3': + // ignore bits_per_sample + break; + + default: + $thisfile_audio['bits_per_sample'] = $thisfile_riff_raw['fmt ']['wBitsPerSample']; + break; + } + } + + + if (empty($thisfile_riff_raw)) { + unset($thisfile_riff['raw']); + } + if (empty($thisfile_riff_audio)) { + unset($thisfile_riff['audio']); + } + if (empty($thisfile_riff_video)) { + unset($thisfile_riff['video']); + } + + return true; + } + + /** + * @param int $startoffset + * @param int $maxoffset + * + * @return array|false + * + * @throws Exception + * @throws getid3_exception + */ + public function ParseRIFFAMV($startoffset, $maxoffset) { + // AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size + + // https://code.google.com/p/amv-codec-tools/wiki/AmvDocumentation + //typedef struct _amvmainheader { + //FOURCC fcc; // 'amvh' + //DWORD cb; + //DWORD dwMicroSecPerFrame; + //BYTE reserve[28]; + //DWORD dwWidth; + //DWORD dwHeight; + //DWORD dwSpeed; + //DWORD reserve0; + //DWORD reserve1; + //BYTE bTimeSec; + //BYTE bTimeMin; + //WORD wTimeHour; + //} AMVMAINHEADER; + + $info = &$this->getid3->info; + $RIFFchunk = false; + + try { + + $this->fseek($startoffset); + $maxoffset = min($maxoffset, $info['avdataend']); + $AMVheader = $this->fread(284); + if (substr($AMVheader, 0, 8) != 'hdrlamvh') { + throw new Exception('expecting "hdrlamv" at offset '.($startoffset + 0).', found "'.substr($AMVheader, 0, 8).'"'); + } + if (substr($AMVheader, 8, 4) != "\x38\x00\x00\x00") { // "amvh" chunk size, hardcoded to 0x38 = 56 bytes + throw new Exception('expecting "0x38000000" at offset '.($startoffset + 8).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 8, 4)).'"'); + } + $RIFFchunk = array(); + $RIFFchunk['amvh']['us_per_frame'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 12, 4)); + $RIFFchunk['amvh']['reserved28'] = substr($AMVheader, 16, 28); // null? reserved? + $RIFFchunk['amvh']['resolution_x'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 44, 4)); + $RIFFchunk['amvh']['resolution_y'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 48, 4)); + $RIFFchunk['amvh']['frame_rate_int'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 52, 4)); + $RIFFchunk['amvh']['reserved0'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 56, 4)); // 1? reserved? + $RIFFchunk['amvh']['reserved1'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 60, 4)); // 0? reserved? + $RIFFchunk['amvh']['runtime_sec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 64, 1)); + $RIFFchunk['amvh']['runtime_min'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 65, 1)); + $RIFFchunk['amvh']['runtime_hrs'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 66, 2)); + + $info['video']['frame_rate'] = 1000000 / $RIFFchunk['amvh']['us_per_frame']; + $info['video']['resolution_x'] = $RIFFchunk['amvh']['resolution_x']; + $info['video']['resolution_y'] = $RIFFchunk['amvh']['resolution_y']; + $info['playtime_seconds'] = ($RIFFchunk['amvh']['runtime_hrs'] * 3600) + ($RIFFchunk['amvh']['runtime_min'] * 60) + $RIFFchunk['amvh']['runtime_sec']; + + // the rest is all hardcoded(?) and does not appear to be useful until you get to audio info at offset 256, even then everything is probably hardcoded + + if (substr($AMVheader, 68, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x38\x00\x00\x00") { + throw new Exception('expecting "LIST<0x00000000>strlstrh<0x38000000>" at offset '.($startoffset + 68).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 68, 20)).'"'); + } + // followed by 56 bytes of null: substr($AMVheader, 88, 56) -> 144 + if (substr($AMVheader, 144, 8) != 'strf'."\x24\x00\x00\x00") { + throw new Exception('expecting "strf<0x24000000>" at offset '.($startoffset + 144).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 144, 8)).'"'); + } + // followed by 36 bytes of null: substr($AMVheader, 144, 36) -> 180 + + if (substr($AMVheader, 188, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x30\x00\x00\x00") { + throw new Exception('expecting "LIST<0x00000000>strlstrh<0x30000000>" at offset '.($startoffset + 188).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 188, 20)).'"'); + } + // followed by 48 bytes of null: substr($AMVheader, 208, 48) -> 256 + if (substr($AMVheader, 256, 8) != 'strf'."\x14\x00\x00\x00") { + throw new Exception('expecting "strf<0x14000000>" at offset '.($startoffset + 256).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 256, 8)).'"'); + } + // followed by 20 bytes of a modified WAVEFORMATEX: + // typedef struct { + // WORD wFormatTag; //(Fixme: this is equal to PCM's 0x01 format code) + // WORD nChannels; //(Fixme: this is always 1) + // DWORD nSamplesPerSec; //(Fixme: for all known sample files this is equal to 22050) + // DWORD nAvgBytesPerSec; //(Fixme: for all known sample files this is equal to 44100) + // WORD nBlockAlign; //(Fixme: this seems to be 2 in AMV files, is this correct ?) + // WORD wBitsPerSample; //(Fixme: this seems to be 16 in AMV files instead of the expected 4) + // WORD cbSize; //(Fixme: this seems to be 0 in AMV files) + // WORD reserved; + // } WAVEFORMATEX; + $RIFFchunk['strf']['wformattag'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 264, 2)); + $RIFFchunk['strf']['nchannels'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 266, 2)); + $RIFFchunk['strf']['nsamplespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 268, 4)); + $RIFFchunk['strf']['navgbytespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 272, 4)); + $RIFFchunk['strf']['nblockalign'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 276, 2)); + $RIFFchunk['strf']['wbitspersample'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 278, 2)); + $RIFFchunk['strf']['cbsize'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 280, 2)); + $RIFFchunk['strf']['reserved'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 282, 2)); + + + $info['audio']['lossless'] = false; + $info['audio']['sample_rate'] = $RIFFchunk['strf']['nsamplespersec']; + $info['audio']['channels'] = $RIFFchunk['strf']['nchannels']; + $info['audio']['bits_per_sample'] = $RIFFchunk['strf']['wbitspersample']; + $info['audio']['bitrate'] = $info['audio']['sample_rate'] * $info['audio']['channels'] * $info['audio']['bits_per_sample']; + $info['audio']['bitrate_mode'] = 'cbr'; + + + } catch (getid3_exception $e) { + if ($e->getCode() == 10) { + $this->warning('RIFFAMV parser: '.$e->getMessage()); + } else { + throw $e; + } + } + + return $RIFFchunk; + } + + /** + * @param int $startoffset + * @param int $maxoffset + * + * @return array|false + * @throws getid3_exception + */ + public function ParseRIFF($startoffset, $maxoffset) { + $info = &$this->getid3->info; + + $RIFFchunk = false; + $FoundAllChunksWeNeed = false; + + try { + $this->fseek($startoffset); + $maxoffset = min($maxoffset, $info['avdataend']); + while ($this->ftell() < $maxoffset) { + $chunknamesize = $this->fread(8); + //$chunkname = substr($chunknamesize, 0, 4); + $chunkname = str_replace("\x00", '_', substr($chunknamesize, 0, 4)); // note: chunk names of 4 null bytes do appear to be legal (has been observed inside INFO and PRMI chunks, for example), but makes traversing array keys more difficult + $chunksize = $this->EitherEndian2Int(substr($chunknamesize, 4, 4)); + //if (strlen(trim($chunkname, "\x00")) < 4) { + if (strlen($chunkname) < 4) { + $this->error('Expecting chunk name at offset '.($this->ftell() - 8).' but found nothing. Aborting RIFF parsing.'); + break; + } + if (($chunksize == 0) && ($chunkname != 'JUNK')) { + $this->warning('Chunk ('.$chunkname.') size at offset '.($this->ftell() - 4).' is zero. Aborting RIFF parsing.'); + break; + } + if (($chunksize % 2) != 0) { + // all structures are packed on word boundaries + $chunksize++; + } + + switch ($chunkname) { + case 'LIST': + $listname = $this->fread(4); + if (preg_match('#^(movi|rec )$#i', $listname)) { + $RIFFchunk[$listname]['offset'] = $this->ftell() - 4; + $RIFFchunk[$listname]['size'] = $chunksize; + + if (!$FoundAllChunksWeNeed) { + $WhereWeWere = $this->ftell(); + $AudioChunkHeader = $this->fread(12); + $AudioChunkStreamNum = substr($AudioChunkHeader, 0, 2); + $AudioChunkStreamType = substr($AudioChunkHeader, 2, 2); + $AudioChunkSize = getid3_lib::LittleEndian2Int(substr($AudioChunkHeader, 4, 4)); + + if ($AudioChunkStreamType == 'wb') { + $FirstFourBytes = substr($AudioChunkHeader, 8, 4); + if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', $FirstFourBytes)) { + // MP3 + if (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) { + $getid3_temp = new getID3(); + $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); + $getid3_temp->info['avdataoffset'] = $this->ftell() - 4; + $getid3_temp->info['avdataend'] = $this->ftell() + $AudioChunkSize; + $getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__); + $getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false); + if (isset($getid3_temp->info['mpeg']['audio'])) { + $info['mpeg']['audio'] = $getid3_temp->info['mpeg']['audio']; + $info['audio'] = $getid3_temp->info['audio']; + $info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer']; + $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; + $info['audio']['channels'] = $info['mpeg']['audio']['channels']; + $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; + $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); + //$info['bitrate'] = $info['audio']['bitrate']; + } + unset($getid3_temp, $getid3_mp3); + } + + } elseif (strpos($FirstFourBytes, getid3_ac3::syncword) === 0) { + + // AC3 + $getid3_temp = new getID3(); + $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); + $getid3_temp->info['avdataoffset'] = $this->ftell() - 4; + $getid3_temp->info['avdataend'] = $this->ftell() + $AudioChunkSize; + $getid3_ac3 = new getid3_ac3($getid3_temp); + $getid3_ac3->Analyze(); + if (empty($getid3_temp->info['error'])) { + $info['audio'] = $getid3_temp->info['audio']; + $info['ac3'] = $getid3_temp->info['ac3']; + if (!empty($getid3_temp->info['warning'])) { + foreach ($getid3_temp->info['warning'] as $key => $value) { + $this->warning($value); + } + } + } + unset($getid3_temp, $getid3_ac3); + } + } + $FoundAllChunksWeNeed = true; + $this->fseek($WhereWeWere); + } + $this->fseek($chunksize - 4, SEEK_CUR); + + } else { + + if (!isset($RIFFchunk[$listname])) { + $RIFFchunk[$listname] = array(); + } + $LISTchunkParent = $listname; + $LISTchunkMaxOffset = $this->ftell() - 4 + $chunksize; + if ($parsedChunk = $this->ParseRIFF($this->ftell(), $LISTchunkMaxOffset)) { + $RIFFchunk[$listname] = array_merge_recursive($RIFFchunk[$listname], $parsedChunk); + } + + } + break; + + default: + if (preg_match('#^[0-9]{2}(wb|pc|dc|db)$#', $chunkname)) { + $this->fseek($chunksize, SEEK_CUR); + break; + } + $thisindex = 0; + if (isset($RIFFchunk[$chunkname]) && is_array($RIFFchunk[$chunkname])) { + $thisindex = count($RIFFchunk[$chunkname]); + } + $RIFFchunk[$chunkname][$thisindex]['offset'] = $this->ftell() - 8; + $RIFFchunk[$chunkname][$thisindex]['size'] = $chunksize; + switch ($chunkname) { + case 'data': + $info['avdataoffset'] = $this->ftell(); + $info['avdataend'] = $info['avdataoffset'] + $chunksize; + + $testData = $this->fread(36); + if ($testData === '') { + break; + } + if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', substr($testData, 0, 4))) { + + // Probably is MP3 data + if (getid3_mp3::MPEGaudioHeaderBytesValid(substr($testData, 0, 4))) { + $getid3_temp = new getID3(); + $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); + $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; + $getid3_temp->info['avdataend'] = $info['avdataend']; + $getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__); + $getid3_mp3->getOnlyMPEGaudioInfo($info['avdataoffset'], false); + if (empty($getid3_temp->info['error'])) { + $info['audio'] = $getid3_temp->info['audio']; + $info['mpeg'] = $getid3_temp->info['mpeg']; + } + unset($getid3_temp, $getid3_mp3); + } + + } elseif (($isRegularAC3 = (substr($testData, 0, 2) == getid3_ac3::syncword)) || substr($testData, 8, 2) == strrev(getid3_ac3::syncword)) { + + // This is probably AC-3 data + $getid3_temp = new getID3(); + if ($isRegularAC3) { + $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); + $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; + $getid3_temp->info['avdataend'] = $info['avdataend']; + } + $getid3_ac3 = new getid3_ac3($getid3_temp); + if ($isRegularAC3) { + $getid3_ac3->Analyze(); + } else { + // Dolby Digital WAV + // AC-3 content, but not encoded in same format as normal AC-3 file + // For one thing, byte order is swapped + $ac3_data = ''; + for ($i = 0; $i < 28; $i += 2) { + $ac3_data .= substr($testData, 8 + $i + 1, 1); + $ac3_data .= substr($testData, 8 + $i + 0, 1); + } + $getid3_ac3->AnalyzeString($ac3_data); + } + + if (empty($getid3_temp->info['error'])) { + $info['audio'] = $getid3_temp->info['audio']; + $info['ac3'] = $getid3_temp->info['ac3']; + if (!empty($getid3_temp->info['warning'])) { + foreach ($getid3_temp->info['warning'] as $newerror) { + $this->warning('getid3_ac3() says: ['.$newerror.']'); + } + } + } + unset($getid3_temp, $getid3_ac3); + + } elseif (preg_match('/^('.implode('|', array_map('preg_quote', getid3_dts::$syncwords)).')/', $testData)) { + + // This is probably DTS data + $getid3_temp = new getID3(); + $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); + $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; + $getid3_dts = new getid3_dts($getid3_temp); + $getid3_dts->Analyze(); + if (empty($getid3_temp->info['error'])) { + $info['audio'] = $getid3_temp->info['audio']; + $info['dts'] = $getid3_temp->info['dts']; + $info['playtime_seconds'] = $getid3_temp->info['playtime_seconds']; // may not match RIFF calculations since DTS-WAV often used 14/16 bit-word packing + if (!empty($getid3_temp->info['warning'])) { + foreach ($getid3_temp->info['warning'] as $newerror) { + $this->warning('getid3_dts() says: ['.$newerror.']'); + } + } + } + + unset($getid3_temp, $getid3_dts); + + } elseif (substr($testData, 0, 4) == 'wvpk') { + + // This is WavPack data + $info['wavpack']['offset'] = $info['avdataoffset']; + $info['wavpack']['size'] = getid3_lib::LittleEndian2Int(substr($testData, 4, 4)); + $this->parseWavPackHeader(substr($testData, 8, 28)); + + } else { + // This is some other kind of data (quite possibly just PCM) + // do nothing special, just skip it + } + $nextoffset = $info['avdataend']; + $this->fseek($nextoffset); + break; + + case 'iXML': + case 'bext': + case 'cart': + case 'fmt ': + case 'strh': + case 'strf': + case 'indx': + case 'MEXT': + case 'DISP': + // always read data in + case 'JUNK': + // should be: never read data in + // but some programs write their version strings in a JUNK chunk (e.g. VirtualDub, AVIdemux, etc) + if ($chunksize < 1048576) { + if ($chunksize > 0) { + $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); + if ($chunkname == 'JUNK') { + if (preg_match('#^([\\x20-\\x7F]+)#', $RIFFchunk[$chunkname][$thisindex]['data'], $matches)) { + // only keep text characters [chr(32)-chr(127)] + $info['riff']['comments']['junk'][] = trim($matches[1]); + } + // but if nothing there, ignore + // remove the key in either case + unset($RIFFchunk[$chunkname][$thisindex]['data']); + } + } + } else { + $this->warning('Chunk "'.$chunkname.'" at offset '.$this->ftell().' is unexpectedly larger than 1MB (claims to be '.number_format($chunksize).' bytes), skipping data'); + $this->fseek($chunksize, SEEK_CUR); + } + break; + + //case 'IDVX': + // $info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunksize)); + // break; + + case 'scot': + // https://cmsdk.com/node-js/adding-scot-chunk-to-wav-file.html + $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); + $RIFFchunk[$chunkname][$thisindex]['parsed']['alter'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 0, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['attrib'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 1, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['artnum'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 2, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['title'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 4, 43); // "name" in other documentation + $RIFFchunk[$chunkname][$thisindex]['parsed']['copy'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 47, 4); + $RIFFchunk[$chunkname][$thisindex]['parsed']['padd'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 51, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['asclen'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 52, 5); + $RIFFchunk[$chunkname][$thisindex]['parsed']['startseconds'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 57, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['starthundredths'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 59, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['endseconds'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 61, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['endhundreths'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 63, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['sdate'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 65, 6); + $RIFFchunk[$chunkname][$thisindex]['parsed']['kdate'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 71, 6); + $RIFFchunk[$chunkname][$thisindex]['parsed']['start_hr'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 77, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['kill_hr'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 78, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['digital'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 79, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 80, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['stereo'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 82, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['compress'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 83, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['eomstrt'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 84, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['eomlen'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 88, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['attrib2'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 90, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['future1'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 94, 12); + $RIFFchunk[$chunkname][$thisindex]['parsed']['catfontcolor'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 106, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['catcolor'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 110, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['segeompos'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 114, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['vt_startsecs'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 118, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['vt_starthunds'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 120, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['priorcat'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 122, 3); + $RIFFchunk[$chunkname][$thisindex]['parsed']['priorcopy'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 125, 4); + $RIFFchunk[$chunkname][$thisindex]['parsed']['priorpadd'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 129, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['postcat'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 130, 3); + $RIFFchunk[$chunkname][$thisindex]['parsed']['postcopy'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 133, 4); + $RIFFchunk[$chunkname][$thisindex]['parsed']['postpadd'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 137, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['hrcanplay'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 138, 21); + $RIFFchunk[$chunkname][$thisindex]['parsed']['future2'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 159, 108); + $RIFFchunk[$chunkname][$thisindex]['parsed']['artist'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 267, 34); + $RIFFchunk[$chunkname][$thisindex]['parsed']['comment'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 301, 34); // "trivia" in other documentation + $RIFFchunk[$chunkname][$thisindex]['parsed']['intro'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 335, 2); + $RIFFchunk[$chunkname][$thisindex]['parsed']['end'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 337, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['year'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 338, 4); + $RIFFchunk[$chunkname][$thisindex]['parsed']['obsolete2'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 342, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['rec_hr'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 343, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['rdate'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 344, 6); + $RIFFchunk[$chunkname][$thisindex]['parsed']['mpeg_bitrate'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 350, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['pitch'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 352, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['playlevel'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 354, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['lenvalid'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 356, 1); + $RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 357, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['newplaylevel'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 361, 2)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['chopsize'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 363, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['vteomovr'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 367, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['desiredlen'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 371, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['triggers'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 375, 4)); + $RIFFchunk[$chunkname][$thisindex]['parsed']['fillout'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 379, 33); + + foreach (array('title', 'artist', 'comment') as $key) { + if (trim($RIFFchunk[$chunkname][$thisindex]['parsed'][$key])) { + $info['riff']['comments'][$key] = array($RIFFchunk[$chunkname][$thisindex]['parsed'][$key]); + } + } + if ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] && !empty($info['filesize']) && ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] != $info['filesize'])) { + $this->warning('RIFF.WAVE.scot.filelength ('.$RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'].') different from actual filesize ('.$info['filesize'].')'); + } + break; + + default: + if (!empty($LISTchunkParent) && isset($LISTchunkMaxOffset) && (($RIFFchunk[$chunkname][$thisindex]['offset'] + $RIFFchunk[$chunkname][$thisindex]['size']) <= $LISTchunkMaxOffset)) { + $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['offset'] = $RIFFchunk[$chunkname][$thisindex]['offset']; + $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['size'] = $RIFFchunk[$chunkname][$thisindex]['size']; + unset($RIFFchunk[$chunkname][$thisindex]['offset']); + unset($RIFFchunk[$chunkname][$thisindex]['size']); + if (isset($RIFFchunk[$chunkname][$thisindex]) && empty($RIFFchunk[$chunkname][$thisindex])) { + unset($RIFFchunk[$chunkname][$thisindex]); + } + if (isset($RIFFchunk[$chunkname]) && empty($RIFFchunk[$chunkname])) { + unset($RIFFchunk[$chunkname]); + } + $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['data'] = $this->fread($chunksize); + } elseif ($chunksize < 2048) { + // only read data in if smaller than 2kB + $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); + } else { + $this->fseek($chunksize, SEEK_CUR); + } + break; + } + break; + } + } + + } catch (getid3_exception $e) { + if ($e->getCode() == 10) { + $this->warning('RIFF parser: '.$e->getMessage()); + } else { + throw $e; + } + } + + return $RIFFchunk; + } + + /** + * @param string $RIFFdata + * + * @return bool + */ + public function ParseRIFFdata(&$RIFFdata) { + $info = &$this->getid3->info; + if ($RIFFdata) { + $tempfile = tempnam(GETID3_TEMP_DIR, 'getID3'); + $fp_temp = fopen($tempfile, 'wb'); + $RIFFdataLength = strlen($RIFFdata); + $NewLengthString = getid3_lib::LittleEndian2String($RIFFdataLength, 4); + for ($i = 0; $i < 4; $i++) { + $RIFFdata[($i + 4)] = $NewLengthString[$i]; + } + fwrite($fp_temp, $RIFFdata); + fclose($fp_temp); + + $getid3_temp = new getID3(); + $getid3_temp->openfile($tempfile); + $getid3_temp->info['filesize'] = $RIFFdataLength; + $getid3_temp->info['filenamepath'] = $info['filenamepath']; + $getid3_temp->info['tags'] = $info['tags']; + $getid3_temp->info['warning'] = $info['warning']; + $getid3_temp->info['error'] = $info['error']; + $getid3_temp->info['comments'] = $info['comments']; + $getid3_temp->info['audio'] = (isset($info['audio']) ? $info['audio'] : array()); + $getid3_temp->info['video'] = (isset($info['video']) ? $info['video'] : array()); + $getid3_riff = new getid3_riff($getid3_temp); + $getid3_riff->Analyze(); + + $info['riff'] = $getid3_temp->info['riff']; + $info['warning'] = $getid3_temp->info['warning']; + $info['error'] = $getid3_temp->info['error']; + $info['tags'] = $getid3_temp->info['tags']; + $info['comments'] = $getid3_temp->info['comments']; + unset($getid3_riff, $getid3_temp); + unlink($tempfile); + } + return false; + } + + /** + * @param array $RIFFinfoArray + * @param array $CommentsTargetArray + * + * @return bool + */ + public static function parseComments(&$RIFFinfoArray, &$CommentsTargetArray) { + $RIFFinfoKeyLookup = array( + 'IARL'=>'archivallocation', + 'IART'=>'artist', + 'ICDS'=>'costumedesigner', + 'ICMS'=>'commissionedby', + 'ICMT'=>'comment', + 'ICNT'=>'country', + 'ICOP'=>'copyright', + 'ICRD'=>'creationdate', + 'IDIM'=>'dimensions', + 'IDIT'=>'digitizationdate', + 'IDPI'=>'resolution', + 'IDST'=>'distributor', + 'IEDT'=>'editor', + 'IENG'=>'engineers', + 'IFRM'=>'accountofparts', + 'IGNR'=>'genre', + 'IKEY'=>'keywords', + 'ILGT'=>'lightness', + 'ILNG'=>'language', + 'IMED'=>'orignalmedium', + 'IMUS'=>'composer', + 'INAM'=>'title', + 'IPDS'=>'productiondesigner', + 'IPLT'=>'palette', + 'IPRD'=>'product', + 'IPRO'=>'producer', + 'IPRT'=>'part', + 'IRTD'=>'rating', + 'ISBJ'=>'subject', + 'ISFT'=>'software', + 'ISGN'=>'secondarygenre', + 'ISHP'=>'sharpness', + 'ISRC'=>'sourcesupplier', + 'ISRF'=>'digitizationsource', + 'ISTD'=>'productionstudio', + 'ISTR'=>'starring', + 'ITCH'=>'encoded_by', + 'IWEB'=>'url', + 'IWRI'=>'writer', + '____'=>'comment', + ); + foreach ($RIFFinfoKeyLookup as $key => $value) { + if (isset($RIFFinfoArray[$key])) { + foreach ($RIFFinfoArray[$key] as $commentid => $commentdata) { + if (trim($commentdata['data']) != '') { + if (isset($CommentsTargetArray[$value])) { + $CommentsTargetArray[$value][] = trim($commentdata['data']); + } else { + $CommentsTargetArray[$value] = array(trim($commentdata['data'])); + } + } + } + } + } + return true; + } + + /** + * @param string $WaveFormatExData + * + * @return array + */ + public static function parseWAVEFORMATex($WaveFormatExData) { + // shortcut + $WaveFormatEx = array(); + $WaveFormatEx['raw'] = array(); + $WaveFormatEx_raw = &$WaveFormatEx['raw']; + + $WaveFormatEx_raw['wFormatTag'] = substr($WaveFormatExData, 0, 2); + $WaveFormatEx_raw['nChannels'] = substr($WaveFormatExData, 2, 2); + $WaveFormatEx_raw['nSamplesPerSec'] = substr($WaveFormatExData, 4, 4); + $WaveFormatEx_raw['nAvgBytesPerSec'] = substr($WaveFormatExData, 8, 4); + $WaveFormatEx_raw['nBlockAlign'] = substr($WaveFormatExData, 12, 2); + $WaveFormatEx_raw['wBitsPerSample'] = substr($WaveFormatExData, 14, 2); + if (strlen($WaveFormatExData) > 16) { + $WaveFormatEx_raw['cbSize'] = substr($WaveFormatExData, 16, 2); + } + $WaveFormatEx_raw = array_map('getid3_lib::LittleEndian2Int', $WaveFormatEx_raw); + + $WaveFormatEx['codec'] = self::wFormatTagLookup($WaveFormatEx_raw['wFormatTag']); + $WaveFormatEx['channels'] = $WaveFormatEx_raw['nChannels']; + $WaveFormatEx['sample_rate'] = $WaveFormatEx_raw['nSamplesPerSec']; + $WaveFormatEx['bitrate'] = $WaveFormatEx_raw['nAvgBytesPerSec'] * 8; + $WaveFormatEx['bits_per_sample'] = $WaveFormatEx_raw['wBitsPerSample']; + + return $WaveFormatEx; + } + + /** + * @param string $WavPackChunkData + * + * @return bool + */ + public function parseWavPackHeader($WavPackChunkData) { + // typedef struct { + // char ckID [4]; + // long ckSize; + // short version; + // short bits; // added for version 2.00 + // short flags, shift; // added for version 3.00 + // long total_samples, crc, crc2; + // char extension [4], extra_bc, extras [3]; + // } WavpackHeader; + + // shortcut + $info = &$this->getid3->info; + $info['wavpack'] = array(); + $thisfile_wavpack = &$info['wavpack']; + + $thisfile_wavpack['version'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 0, 2)); + if ($thisfile_wavpack['version'] >= 2) { + $thisfile_wavpack['bits'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 2, 2)); + } + if ($thisfile_wavpack['version'] >= 3) { + $thisfile_wavpack['flags_raw'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 4, 2)); + $thisfile_wavpack['shift'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 6, 2)); + $thisfile_wavpack['total_samples'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 8, 4)); + $thisfile_wavpack['crc1'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 12, 4)); + $thisfile_wavpack['crc2'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 16, 4)); + $thisfile_wavpack['extension'] = substr($WavPackChunkData, 20, 4); + $thisfile_wavpack['extra_bc'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 24, 1)); + for ($i = 0; $i <= 2; $i++) { + $thisfile_wavpack['extras'][] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 25 + $i, 1)); + } + + // shortcut + $thisfile_wavpack['flags'] = array(); + $thisfile_wavpack_flags = &$thisfile_wavpack['flags']; + + $thisfile_wavpack_flags['mono'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000001); + $thisfile_wavpack_flags['fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000002); + $thisfile_wavpack_flags['raw_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000004); + $thisfile_wavpack_flags['calc_noise'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000008); + $thisfile_wavpack_flags['high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000010); + $thisfile_wavpack_flags['3_byte_samples'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000020); + $thisfile_wavpack_flags['over_20_bits'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000040); + $thisfile_wavpack_flags['use_wvc'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000080); + $thisfile_wavpack_flags['noiseshaping'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000100); + $thisfile_wavpack_flags['very_fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000200); + $thisfile_wavpack_flags['new_high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000400); + $thisfile_wavpack_flags['cancel_extreme'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000800); + $thisfile_wavpack_flags['cross_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x001000); + $thisfile_wavpack_flags['new_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x002000); + $thisfile_wavpack_flags['joint_stereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x004000); + $thisfile_wavpack_flags['extra_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x008000); + $thisfile_wavpack_flags['override_noiseshape'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x010000); + $thisfile_wavpack_flags['override_jointstereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x020000); + $thisfile_wavpack_flags['copy_source_filetime'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x040000); + $thisfile_wavpack_flags['create_exe'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x080000); + } + + return true; + } + + /** + * @param string $BITMAPINFOHEADER + * @param bool $littleEndian + * + * @return array + */ + public static function ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian=true) { + + $parsed['biSize'] = substr($BITMAPINFOHEADER, 0, 4); // number of bytes required by the BITMAPINFOHEADER structure + $parsed['biWidth'] = substr($BITMAPINFOHEADER, 4, 4); // width of the bitmap in pixels + $parsed['biHeight'] = substr($BITMAPINFOHEADER, 8, 4); // height of the bitmap in pixels. If biHeight is positive, the bitmap is a 'bottom-up' DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a 'top-down' DIB and its origin is the upper left corner + $parsed['biPlanes'] = substr($BITMAPINFOHEADER, 12, 2); // number of color planes on the target device. In most cases this value must be set to 1 + $parsed['biBitCount'] = substr($BITMAPINFOHEADER, 14, 2); // Specifies the number of bits per pixels + $parsed['biSizeImage'] = substr($BITMAPINFOHEADER, 20, 4); // size of the bitmap data section of the image (the actual pixel data, excluding BITMAPINFOHEADER and RGBQUAD structures) + $parsed['biXPelsPerMeter'] = substr($BITMAPINFOHEADER, 24, 4); // horizontal resolution, in pixels per metre, of the target device + $parsed['biYPelsPerMeter'] = substr($BITMAPINFOHEADER, 28, 4); // vertical resolution, in pixels per metre, of the target device + $parsed['biClrUsed'] = substr($BITMAPINFOHEADER, 32, 4); // actual number of color indices in the color table used by the bitmap. If this value is zero, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member for the compression mode specified by biCompression + $parsed['biClrImportant'] = substr($BITMAPINFOHEADER, 36, 4); // number of color indices that are considered important for displaying the bitmap. If this value is zero, all colors are important + $parsed = array_map('getid3_lib::'.($littleEndian ? 'Little' : 'Big').'Endian2Int', $parsed); + + $parsed['fourcc'] = substr($BITMAPINFOHEADER, 16, 4); // compression identifier + + return $parsed; + } + + /** + * @param string $DIVXTAG + * @param bool $raw + * + * @return array + */ + public static function ParseDIVXTAG($DIVXTAG, $raw=false) { + // structure from "IDivX" source, Form1.frm, by "Greg Frazier of Daemonic Software Group", email: gfrazier@icestorm.net, web: http://dsg.cjb.net/ + // source available at http://files.divx-digest.com/download/c663efe7ef8ad2e90bf4af4d3ea6188a/on0SWN2r/edit/IDivX.zip + // 'Byte Layout: '1111111111111111 + // '32 for Movie - 1 '1111111111111111 + // '28 for Author - 6 '6666666666666666 + // '4 for year - 2 '6666666666662222 + // '3 for genre - 3 '7777777777777777 + // '48 for Comments - 7 '7777777777777777 + // '1 for Rating - 4 '7777777777777777 + // '5 for Future Additions - 0 '333400000DIVXTAG + // '128 bytes total + + static $DIVXTAGgenre = array( + 0 => 'Action', + 1 => 'Action/Adventure', + 2 => 'Adventure', + 3 => 'Adult', + 4 => 'Anime', + 5 => 'Cartoon', + 6 => 'Claymation', + 7 => 'Comedy', + 8 => 'Commercial', + 9 => 'Documentary', + 10 => 'Drama', + 11 => 'Home Video', + 12 => 'Horror', + 13 => 'Infomercial', + 14 => 'Interactive', + 15 => 'Mystery', + 16 => 'Music Video', + 17 => 'Other', + 18 => 'Religion', + 19 => 'Sci Fi', + 20 => 'Thriller', + 21 => 'Western', + ), + $DIVXTAGrating = array( + 0 => 'Unrated', + 1 => 'G', + 2 => 'PG', + 3 => 'PG-13', + 4 => 'R', + 5 => 'NC-17', + ); + + $parsed = array(); + $parsed['title'] = trim(substr($DIVXTAG, 0, 32)); + $parsed['artist'] = trim(substr($DIVXTAG, 32, 28)); + $parsed['year'] = intval(trim(substr($DIVXTAG, 60, 4))); + $parsed['comment'] = trim(substr($DIVXTAG, 64, 48)); + $parsed['genre_id'] = intval(trim(substr($DIVXTAG, 112, 3))); + $parsed['rating_id'] = ord(substr($DIVXTAG, 115, 1)); + //$parsed['padding'] = substr($DIVXTAG, 116, 5); // 5-byte null + //$parsed['magic'] = substr($DIVXTAG, 121, 7); // "DIVXTAG" + + $parsed['genre'] = (isset($DIVXTAGgenre[$parsed['genre_id']]) ? $DIVXTAGgenre[$parsed['genre_id']] : $parsed['genre_id']); + $parsed['rating'] = (isset($DIVXTAGrating[$parsed['rating_id']]) ? $DIVXTAGrating[$parsed['rating_id']] : $parsed['rating_id']); + + if (!$raw) { + unset($parsed['genre_id'], $parsed['rating_id']); + foreach ($parsed as $key => $value) { + if (empty($value)) { + unset($parsed[$key]); + } + } + } + + foreach ($parsed as $tag => $value) { + $parsed[$tag] = array($value); + } + + return $parsed; + } + + /** + * @param string $tagshortname + * + * @return string + */ + public static function waveSNDMtagLookup($tagshortname) { + $begin = __LINE__; + + /** This is not a comment! + + ©kwd keywords + ©BPM bpm + ©trt tracktitle + ©des description + ©gen category + ©fin featuredinstrument + ©LID longid + ©bex bwdescription + ©pub publisher + ©cdt cdtitle + ©alb library + ©com composer + + */ + + return getid3_lib::EmbeddedLookup($tagshortname, $begin, __LINE__, __FILE__, 'riff-sndm'); + } + + /** + * @param int $wFormatTag + * + * @return string + */ + public static function wFormatTagLookup($wFormatTag) { + + $begin = __LINE__; + + /** This is not a comment! + + 0x0000 Microsoft Unknown Wave Format + 0x0001 Pulse Code Modulation (PCM) + 0x0002 Microsoft ADPCM + 0x0003 IEEE Float + 0x0004 Compaq Computer VSELP + 0x0005 IBM CVSD + 0x0006 Microsoft A-Law + 0x0007 Microsoft mu-Law + 0x0008 Microsoft DTS + 0x0010 OKI ADPCM + 0x0011 Intel DVI/IMA ADPCM + 0x0012 Videologic MediaSpace ADPCM + 0x0013 Sierra Semiconductor ADPCM + 0x0014 Antex Electronics G.723 ADPCM + 0x0015 DSP Solutions DigiSTD + 0x0016 DSP Solutions DigiFIX + 0x0017 Dialogic OKI ADPCM + 0x0018 MediaVision ADPCM + 0x0019 Hewlett-Packard CU + 0x0020 Yamaha ADPCM + 0x0021 Speech Compression Sonarc + 0x0022 DSP Group TrueSpeech + 0x0023 Echo Speech EchoSC1 + 0x0024 Audiofile AF36 + 0x0025 Audio Processing Technology APTX + 0x0026 AudioFile AF10 + 0x0027 Prosody 1612 + 0x0028 LRC + 0x0030 Dolby AC2 + 0x0031 Microsoft GSM 6.10 + 0x0032 MSNAudio + 0x0033 Antex Electronics ADPCME + 0x0034 Control Resources VQLPC + 0x0035 DSP Solutions DigiREAL + 0x0036 DSP Solutions DigiADPCM + 0x0037 Control Resources CR10 + 0x0038 Natural MicroSystems VBXADPCM + 0x0039 Crystal Semiconductor IMA ADPCM + 0x003A EchoSC3 + 0x003B Rockwell ADPCM + 0x003C Rockwell Digit LK + 0x003D Xebec + 0x0040 Antex Electronics G.721 ADPCM + 0x0041 G.728 CELP + 0x0042 MSG723 + 0x0050 MPEG Layer-2 or Layer-1 + 0x0052 RT24 + 0x0053 PAC + 0x0055 MPEG Layer-3 + 0x0059 Lucent G.723 + 0x0060 Cirrus + 0x0061 ESPCM + 0x0062 Voxware + 0x0063 Canopus Atrac + 0x0064 G.726 ADPCM + 0x0065 G.722 ADPCM + 0x0066 DSAT + 0x0067 DSAT Display + 0x0069 Voxware Byte Aligned + 0x0070 Voxware AC8 + 0x0071 Voxware AC10 + 0x0072 Voxware AC16 + 0x0073 Voxware AC20 + 0x0074 Voxware MetaVoice + 0x0075 Voxware MetaSound + 0x0076 Voxware RT29HW + 0x0077 Voxware VR12 + 0x0078 Voxware VR18 + 0x0079 Voxware TQ40 + 0x0080 Softsound + 0x0081 Voxware TQ60 + 0x0082 MSRT24 + 0x0083 G.729A + 0x0084 MVI MV12 + 0x0085 DF G.726 + 0x0086 DF GSM610 + 0x0088 ISIAudio + 0x0089 Onlive + 0x0091 SBC24 + 0x0092 Dolby AC3 SPDIF + 0x0093 MediaSonic G.723 + 0x0094 Aculab PLC Prosody 8kbps + 0x0097 ZyXEL ADPCM + 0x0098 Philips LPCBB + 0x0099 Packed + 0x00FF AAC + 0x0100 Rhetorex ADPCM + 0x0101 IBM mu-law + 0x0102 IBM A-law + 0x0103 IBM AVC Adaptive Differential Pulse Code Modulation (ADPCM) + 0x0111 Vivo G.723 + 0x0112 Vivo Siren + 0x0123 Digital G.723 + 0x0125 Sanyo LD ADPCM + 0x0130 Sipro Lab Telecom ACELP NET + 0x0131 Sipro Lab Telecom ACELP 4800 + 0x0132 Sipro Lab Telecom ACELP 8V3 + 0x0133 Sipro Lab Telecom G.729 + 0x0134 Sipro Lab Telecom G.729A + 0x0135 Sipro Lab Telecom Kelvin + 0x0140 Windows Media Video V8 + 0x0150 Qualcomm PureVoice + 0x0151 Qualcomm HalfRate + 0x0155 Ring Zero Systems TUB GSM + 0x0160 Microsoft Audio 1 + 0x0161 Windows Media Audio V7 / V8 / V9 + 0x0162 Windows Media Audio Professional V9 + 0x0163 Windows Media Audio Lossless V9 + 0x0200 Creative Labs ADPCM + 0x0202 Creative Labs Fastspeech8 + 0x0203 Creative Labs Fastspeech10 + 0x0210 UHER Informatic GmbH ADPCM + 0x0220 Quarterdeck + 0x0230 I-link Worldwide VC + 0x0240 Aureal RAW Sport + 0x0250 Interactive Products HSX + 0x0251 Interactive Products RPELP + 0x0260 Consistent Software CS2 + 0x0270 Sony SCX + 0x0300 Fujitsu FM Towns Snd + 0x0400 BTV Digital + 0x0401 Intel Music Coder + 0x0450 QDesign Music + 0x0680 VME VMPCM + 0x0681 AT&T Labs TPC + 0x08AE ClearJump LiteWave + 0x1000 Olivetti GSM + 0x1001 Olivetti ADPCM + 0x1002 Olivetti CELP + 0x1003 Olivetti SBC + 0x1004 Olivetti OPR + 0x1100 Lernout & Hauspie Codec (0x1100) + 0x1101 Lernout & Hauspie CELP Codec (0x1101) + 0x1102 Lernout & Hauspie SBC Codec (0x1102) + 0x1103 Lernout & Hauspie SBC Codec (0x1103) + 0x1104 Lernout & Hauspie SBC Codec (0x1104) + 0x1400 Norris + 0x1401 AT&T ISIAudio + 0x1500 Soundspace Music Compression + 0x181C VoxWare RT24 Speech + 0x1FC4 NCT Soft ALF2CD (www.nctsoft.com) + 0x2000 Dolby AC3 + 0x2001 Dolby DTS + 0x2002 WAVE_FORMAT_14_4 + 0x2003 WAVE_FORMAT_28_8 + 0x2004 WAVE_FORMAT_COOK + 0x2005 WAVE_FORMAT_DNET + 0x674F Ogg Vorbis 1 + 0x6750 Ogg Vorbis 2 + 0x6751 Ogg Vorbis 3 + 0x676F Ogg Vorbis 1+ + 0x6770 Ogg Vorbis 2+ + 0x6771 Ogg Vorbis 3+ + 0x7A21 GSM-AMR (CBR, no SID) + 0x7A22 GSM-AMR (VBR, including SID) + 0xFFFE WAVE_FORMAT_EXTENSIBLE + 0xFFFF WAVE_FORMAT_DEVELOPMENT + + */ + + return getid3_lib::EmbeddedLookup('0x'.str_pad(strtoupper(dechex($wFormatTag)), 4, '0', STR_PAD_LEFT), $begin, __LINE__, __FILE__, 'riff-wFormatTag'); + } + + /** + * @param string $fourcc + * + * @return string + */ + public static function fourccLookup($fourcc) { + + $begin = __LINE__; + + /** This is not a comment! + + swot http://developer.apple.com/qa/snd/snd07.html + ____ No Codec (____) + _BIT BI_BITFIELDS (Raw RGB) + _JPG JPEG compressed + _PNG PNG compressed W3C/ISO/IEC (RFC-2083) + _RAW Full Frames (Uncompressed) + _RGB Raw RGB Bitmap + _RL4 RLE 4bpp RGB + _RL8 RLE 8bpp RGB + 3IV1 3ivx MPEG-4 v1 + 3IV2 3ivx MPEG-4 v2 + 3IVX 3ivx MPEG-4 + AASC Autodesk Animator + ABYR Kensington ?ABYR? + AEMI Array Microsystems VideoONE MPEG1-I Capture + AFLC Autodesk Animator FLC + AFLI Autodesk Animator FLI + AMPG Array Microsystems VideoONE MPEG + ANIM Intel RDX (ANIM) + AP41 AngelPotion Definitive + ASV1 Asus Video v1 + ASV2 Asus Video v2 + ASVX Asus Video 2.0 (audio) + AUR2 AuraVision Aura 2 Codec - YUV 4:2:2 + AURA AuraVision Aura 1 Codec - YUV 4:1:1 + AVDJ Independent JPEG Group\'s codec (AVDJ) + AVRN Independent JPEG Group\'s codec (AVRN) + AYUV 4:4:4 YUV (AYUV) + AZPR Quicktime Apple Video (AZPR) + BGR Raw RGB32 + BLZ0 Blizzard DivX MPEG-4 + BTVC Conexant Composite Video + BINK RAD Game Tools Bink Video + BT20 Conexant Prosumer Video + BTCV Conexant Composite Video Codec + BW10 Data Translation Broadway MPEG Capture + CC12 Intel YUV12 + CDVC Canopus DV + CFCC Digital Processing Systems DPS Perception + CGDI Microsoft Office 97 Camcorder Video + CHAM Winnov Caviara Champagne + CJPG Creative WebCam JPEG + CLJR Cirrus Logic YUV 4:1:1 + CMYK Common Data Format in Printing (Colorgraph) + CPLA Weitek 4:2:0 YUV Planar + CRAM Microsoft Video 1 (CRAM) + cvid Radius Cinepak + CVID Radius Cinepak + CWLT Microsoft Color WLT DIB + CYUV Creative Labs YUV + CYUY ATI YUV + D261 H.261 + D263 H.263 + DIB Device Independent Bitmap + DIV1 FFmpeg OpenDivX + DIV2 Microsoft MPEG-4 v1/v2 + DIV3 DivX ;-) MPEG-4 v3.x Low-Motion + DIV4 DivX ;-) MPEG-4 v3.x Fast-Motion + DIV5 DivX MPEG-4 v5.x + DIV6 DivX ;-) (MS MPEG-4 v3.x) + DIVX DivX MPEG-4 v4 (OpenDivX / Project Mayo) + divx DivX MPEG-4 + DMB1 Matrox Rainbow Runner hardware MJPEG + DMB2 Paradigm MJPEG + DSVD ?DSVD? + DUCK Duck TrueMotion 1.0 + DPS0 DPS/Leitch Reality Motion JPEG + DPSC DPS/Leitch PAR Motion JPEG + DV25 Matrox DVCPRO codec + DV50 Matrox DVCPRO50 codec + DVC IEC 61834 and SMPTE 314M (DVC/DV Video) + DVCP IEC 61834 and SMPTE 314M (DVC/DV Video) + DVHD IEC Standard DV 1125 lines @ 30fps / 1250 lines @ 25fps + DVMA Darim Vision DVMPEG (dummy for MPEG compressor) (www.darvision.com) + DVSL IEC Standard DV compressed in SD (SDL) + DVAN ?DVAN? + DVE2 InSoft DVE-2 Videoconferencing + dvsd IEC 61834 and SMPTE 314M DVC/DV Video + DVSD IEC 61834 and SMPTE 314M DVC/DV Video + DVX1 Lucent DVX1000SP Video Decoder + DVX2 Lucent DVX2000S Video Decoder + DVX3 Lucent DVX3000S Video Decoder + DX50 DivX v5 + DXT1 Microsoft DirectX Compressed Texture (DXT1) + DXT2 Microsoft DirectX Compressed Texture (DXT2) + DXT3 Microsoft DirectX Compressed Texture (DXT3) + DXT4 Microsoft DirectX Compressed Texture (DXT4) + DXT5 Microsoft DirectX Compressed Texture (DXT5) + DXTC Microsoft DirectX Compressed Texture (DXTC) + DXTn Microsoft DirectX Compressed Texture (DXTn) + EM2V Etymonix MPEG-2 I-frame (www.etymonix.com) + EKQ0 Elsa ?EKQ0? + ELK0 Elsa ?ELK0? + ESCP Eidos Escape + ETV1 eTreppid Video ETV1 + ETV2 eTreppid Video ETV2 + ETVC eTreppid Video ETVC + FLIC Autodesk FLI/FLC Animation + FLV1 Sorenson Spark + FLV4 On2 TrueMotion VP6 + FRWT Darim Vision Forward Motion JPEG (www.darvision.com) + FRWU Darim Vision Forward Uncompressed (www.darvision.com) + FLJP D-Vision Field Encoded Motion JPEG + FPS1 FRAPS v1 + FRWA SoftLab-Nsk Forward Motion JPEG w/ alpha channel + FRWD SoftLab-Nsk Forward Motion JPEG + FVF1 Iterated Systems Fractal Video Frame + GLZW Motion LZW (gabest@freemail.hu) + GPEG Motion JPEG (gabest@freemail.hu) + GWLT Microsoft Greyscale WLT DIB + H260 Intel ITU H.260 Videoconferencing + H261 Intel ITU H.261 Videoconferencing + H262 Intel ITU H.262 Videoconferencing + H263 Intel ITU H.263 Videoconferencing + H264 Intel ITU H.264 Videoconferencing + H265 Intel ITU H.265 Videoconferencing + H266 Intel ITU H.266 Videoconferencing + H267 Intel ITU H.267 Videoconferencing + H268 Intel ITU H.268 Videoconferencing + H269 Intel ITU H.269 Videoconferencing + HFYU Huffman Lossless Codec + HMCR Rendition Motion Compensation Format (HMCR) + HMRR Rendition Motion Compensation Format (HMRR) + I263 FFmpeg I263 decoder + IF09 Indeo YVU9 ("YVU9 with additional delta-frame info after the U plane") + IUYV Interlaced version of UYVY (www.leadtools.com) + IY41 Interlaced version of Y41P (www.leadtools.com) + IYU1 12 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard + IYU2 24 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard + IYUV Planar YUV format (8-bpp Y plane, followed by 8-bpp 2×2 U and V planes) + i263 Intel ITU H.263 Videoconferencing (i263) + I420 Intel Indeo 4 + IAN Intel Indeo 4 (RDX) + ICLB InSoft CellB Videoconferencing + IGOR Power DVD + IJPG Intergraph JPEG + ILVC Intel Layered Video + ILVR ITU-T H.263+ + IPDV I-O Data Device Giga AVI DV Codec + IR21 Intel Indeo 2.1 + IRAW Intel YUV Uncompressed + IV30 Intel Indeo 3.0 + IV31 Intel Indeo 3.1 + IV32 Ligos Indeo 3.2 + IV33 Ligos Indeo 3.3 + IV34 Ligos Indeo 3.4 + IV35 Ligos Indeo 3.5 + IV36 Ligos Indeo 3.6 + IV37 Ligos Indeo 3.7 + IV38 Ligos Indeo 3.8 + IV39 Ligos Indeo 3.9 + IV40 Ligos Indeo Interactive 4.0 + IV41 Ligos Indeo Interactive 4.1 + IV42 Ligos Indeo Interactive 4.2 + IV43 Ligos Indeo Interactive 4.3 + IV44 Ligos Indeo Interactive 4.4 + IV45 Ligos Indeo Interactive 4.5 + IV46 Ligos Indeo Interactive 4.6 + IV47 Ligos Indeo Interactive 4.7 + IV48 Ligos Indeo Interactive 4.8 + IV49 Ligos Indeo Interactive 4.9 + IV50 Ligos Indeo Interactive 5.0 + JBYR Kensington ?JBYR? + JPEG Still Image JPEG DIB + JPGL Pegasus Lossless Motion JPEG + KMVC Team17 Software Karl Morton\'s Video Codec + LSVM Vianet Lighting Strike Vmail (Streaming) (www.vianet.com) + LEAD LEAD Video Codec + Ljpg LEAD MJPEG Codec + MDVD Alex MicroDVD Video (hacked MS MPEG-4) (www.tiasoft.de) + MJPA Morgan Motion JPEG (MJPA) (www.morgan-multimedia.com) + MJPB Morgan Motion JPEG (MJPB) (www.morgan-multimedia.com) + MMES Matrox MPEG-2 I-frame + MP2v Microsoft S-Mpeg 4 version 1 (MP2v) + MP42 Microsoft S-Mpeg 4 version 2 (MP42) + MP43 Microsoft S-Mpeg 4 version 3 (MP43) + MP4S Microsoft S-Mpeg 4 version 3 (MP4S) + MP4V FFmpeg MPEG-4 + MPG1 FFmpeg MPEG 1/2 + MPG2 FFmpeg MPEG 1/2 + MPG3 FFmpeg DivX ;-) (MS MPEG-4 v3) + MPG4 Microsoft MPEG-4 + MPGI Sigma Designs MPEG + MPNG PNG images decoder + MSS1 Microsoft Windows Screen Video + MSZH LCL (Lossless Codec Library) (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) + M261 Microsoft H.261 + M263 Microsoft H.263 + M4S2 Microsoft Fully Compliant MPEG-4 v2 simple profile (M4S2) + m4s2 Microsoft Fully Compliant MPEG-4 v2 simple profile (m4s2) + MC12 ATI Motion Compensation Format (MC12) + MCAM ATI Motion Compensation Format (MCAM) + MJ2C Morgan Multimedia Motion JPEG2000 + mJPG IBM Motion JPEG w/ Huffman Tables + MJPG Microsoft Motion JPEG DIB + MP42 Microsoft MPEG-4 (low-motion) + MP43 Microsoft MPEG-4 (fast-motion) + MP4S Microsoft MPEG-4 (MP4S) + mp4s Microsoft MPEG-4 (mp4s) + MPEG Chromatic Research MPEG-1 Video I-Frame + MPG4 Microsoft MPEG-4 Video High Speed Compressor + MPGI Sigma Designs MPEG + MRCA FAST Multimedia Martin Regen Codec + MRLE Microsoft Run Length Encoding + MSVC Microsoft Video 1 + MTX1 Matrox ?MTX1? + MTX2 Matrox ?MTX2? + MTX3 Matrox ?MTX3? + MTX4 Matrox ?MTX4? + MTX5 Matrox ?MTX5? + MTX6 Matrox ?MTX6? + MTX7 Matrox ?MTX7? + MTX8 Matrox ?MTX8? + MTX9 Matrox ?MTX9? + MV12 Motion Pixels Codec (old) + MWV1 Aware Motion Wavelets + nAVI SMR Codec (hack of Microsoft MPEG-4) (IRC #shadowrealm) + NT00 NewTek LightWave HDTV YUV w/ Alpha (www.newtek.com) + NUV1 NuppelVideo + NTN1 Nogatech Video Compression 1 + NVS0 nVidia GeForce Texture (NVS0) + NVS1 nVidia GeForce Texture (NVS1) + NVS2 nVidia GeForce Texture (NVS2) + NVS3 nVidia GeForce Texture (NVS3) + NVS4 nVidia GeForce Texture (NVS4) + NVS5 nVidia GeForce Texture (NVS5) + NVT0 nVidia GeForce Texture (NVT0) + NVT1 nVidia GeForce Texture (NVT1) + NVT2 nVidia GeForce Texture (NVT2) + NVT3 nVidia GeForce Texture (NVT3) + NVT4 nVidia GeForce Texture (NVT4) + NVT5 nVidia GeForce Texture (NVT5) + PIXL MiroXL, Pinnacle PCTV + PDVC I-O Data Device Digital Video Capture DV codec + PGVV Radius Video Vision + PHMO IBM Photomotion + PIM1 MPEG Realtime (Pinnacle Cards) + PIM2 Pegasus Imaging ?PIM2? + PIMJ Pegasus Imaging Lossless JPEG + PVEZ Horizons Technology PowerEZ + PVMM PacketVideo Corporation MPEG-4 + PVW2 Pegasus Imaging Wavelet Compression + Q1.0 Q-Team\'s QPEG 1.0 (www.q-team.de) + Q1.1 Q-Team\'s QPEG 1.1 (www.q-team.de) + QPEG Q-Team QPEG 1.0 + qpeq Q-Team QPEG 1.1 + RGB Raw BGR32 + RGBA Raw RGB w/ Alpha + RMP4 REALmagic MPEG-4 (unauthorized XVID copy) (www.sigmadesigns.com) + ROQV Id RoQ File Video Decoder + RPZA Quicktime Apple Video (RPZA) + RUD0 Rududu video codec (http://rududu.ifrance.com/rududu/) + RV10 RealVideo 1.0 (aka RealVideo 5.0) + RV13 RealVideo 1.0 (RV13) + RV20 RealVideo G2 + RV30 RealVideo 8 + RV40 RealVideo 9 + RGBT Raw RGB w/ Transparency + RLE Microsoft Run Length Encoder + RLE4 Run Length Encoded (4bpp, 16-color) + RLE8 Run Length Encoded (8bpp, 256-color) + RT21 Intel Indeo RealTime Video 2.1 + rv20 RealVideo G2 + rv30 RealVideo 8 + RVX Intel RDX (RVX ) + SMC Apple Graphics (SMC ) + SP54 Logitech Sunplus Sp54 Codec for Mustek GSmart Mini 2 + SPIG Radius Spigot + SVQ3 Sorenson Video 3 (Apple Quicktime 5) + s422 Tekram VideoCap C210 YUV 4:2:2 + SDCC Sun Communication Digital Camera Codec + SFMC CrystalNet Surface Fitting Method + SMSC Radius SMSC + SMSD Radius SMSD + smsv WorldConnect Wavelet Video + SPIG Radius Spigot + SPLC Splash Studios ACM Audio Codec (www.splashstudios.net) + SQZ2 Microsoft VXTreme Video Codec V2 + STVA ST Microelectronics CMOS Imager Data (Bayer) + STVB ST Microelectronics CMOS Imager Data (Nudged Bayer) + STVC ST Microelectronics CMOS Imager Data (Bunched) + STVX ST Microelectronics CMOS Imager Data (Extended CODEC Data Format) + STVY ST Microelectronics CMOS Imager Data (Extended CODEC Data Format with Correction Data) + SV10 Sorenson Video R1 + SVQ1 Sorenson Video + T420 Toshiba YUV 4:2:0 + TM2A Duck TrueMotion Archiver 2.0 (www.duck.com) + TVJP Pinnacle/Truevision Targa 2000 board (TVJP) + TVMJ Pinnacle/Truevision Targa 2000 board (TVMJ) + TY0N Tecomac Low-Bit Rate Codec (www.tecomac.com) + TY2C Trident Decompression Driver + TLMS TeraLogic Motion Intraframe Codec (TLMS) + TLST TeraLogic Motion Intraframe Codec (TLST) + TM20 Duck TrueMotion 2.0 + TM2X Duck TrueMotion 2X + TMIC TeraLogic Motion Intraframe Codec (TMIC) + TMOT Horizons Technology TrueMotion S + tmot Horizons TrueMotion Video Compression + TR20 Duck TrueMotion RealTime 2.0 + TSCC TechSmith Screen Capture Codec + TV10 Tecomac Low-Bit Rate Codec + TY2N Trident ?TY2N? + U263 UB Video H.263/H.263+/H.263++ Decoder + UMP4 UB Video MPEG 4 (www.ubvideo.com) + UYNV Nvidia UYVY packed 4:2:2 + UYVP Evans & Sutherland YCbCr 4:2:2 extended precision + UCOD eMajix.com ClearVideo + ULTI IBM Ultimotion + UYVY UYVY packed 4:2:2 + V261 Lucent VX2000S + VIFP VFAPI Reader Codec (www.yks.ne.jp/~hori/) + VIV1 FFmpeg H263+ decoder + VIV2 Vivo H.263 + VQC2 Vector-quantised codec 2 (research) http://eprints.ecs.soton.ac.uk/archive/00001310/01/VTC97-js.pdf) + VTLP Alaris VideoGramPiX + VYU9 ATI YUV (VYU9) + VYUY ATI YUV (VYUY) + V261 Lucent VX2000S + V422 Vitec Multimedia 24-bit YUV 4:2:2 Format + V655 Vitec Multimedia 16-bit YUV 4:2:2 Format + VCR1 ATI Video Codec 1 + VCR2 ATI Video Codec 2 + VCR3 ATI VCR 3.0 + VCR4 ATI VCR 4.0 + VCR5 ATI VCR 5.0 + VCR6 ATI VCR 6.0 + VCR7 ATI VCR 7.0 + VCR8 ATI VCR 8.0 + VCR9 ATI VCR 9.0 + VDCT Vitec Multimedia Video Maker Pro DIB + VDOM VDOnet VDOWave + VDOW VDOnet VDOLive (H.263) + VDTZ Darim Vison VideoTizer YUV + VGPX Alaris VideoGramPiX + VIDS Vitec Multimedia YUV 4:2:2 CCIR 601 for V422 + VIVO Vivo H.263 v2.00 + vivo Vivo H.263 + VIXL Miro/Pinnacle Video XL + VLV1 VideoLogic/PURE Digital Videologic Capture + VP30 On2 VP3.0 + VP31 On2 VP3.1 + VP6F On2 TrueMotion VP6 + VX1K Lucent VX1000S Video Codec + VX2K Lucent VX2000S Video Codec + VXSP Lucent VX1000SP Video Codec + WBVC Winbond W9960 + WHAM Microsoft Video 1 (WHAM) + WINX Winnov Software Compression + WJPG AverMedia Winbond JPEG + WMV1 Windows Media Video V7 + WMV2 Windows Media Video V8 + WMV3 Windows Media Video V9 + WNV1 Winnov Hardware Compression + XYZP Extended PAL format XYZ palette (www.riff.org) + x263 Xirlink H.263 + XLV0 NetXL Video Decoder + XMPG Xing MPEG (I-Frame only) + XVID XviD MPEG-4 (www.xvid.org) + XXAN ?XXAN? + YU92 Intel YUV (YU92) + YUNV Nvidia Uncompressed YUV 4:2:2 + YUVP Extended PAL format YUV palette (www.riff.org) + Y211 YUV 2:1:1 Packed + Y411 YUV 4:1:1 Packed + Y41B Weitek YUV 4:1:1 Planar + Y41P Brooktree PC1 YUV 4:1:1 Packed + Y41T Brooktree PC1 YUV 4:1:1 with transparency + Y42B Weitek YUV 4:2:2 Planar + Y42T Brooktree UYUV 4:2:2 with transparency + Y422 ADS Technologies Copy of UYVY used in Pyro WebCam firewire camera + Y800 Simple, single Y plane for monochrome images + Y8 Grayscale video + YC12 Intel YUV 12 codec + YUV8 Winnov Caviar YUV8 + YUV9 Intel YUV9 + YUY2 Uncompressed YUV 4:2:2 + YUYV Canopus YUV + YV12 YVU12 Planar + YVU9 Intel YVU9 Planar (8-bpp Y plane, followed by 8-bpp 4x4 U and V planes) + YVYU YVYU 4:2:2 Packed + ZLIB Lossless Codec Library zlib compression (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) + ZPEG Metheus Video Zipper + + */ + + return getid3_lib::EmbeddedLookup($fourcc, $begin, __LINE__, __FILE__, 'riff-fourcc'); + } + + /** + * @param string $byteword + * @param bool $signed + * + * @return int|float|false + */ + private function EitherEndian2Int($byteword, $signed=false) { + if ($this->container == 'riff') { + return getid3_lib::LittleEndian2Int($byteword, $signed); + } + return getid3_lib::BigEndian2Int($byteword, false, $signed); + } + +} diff --git a/wp-includes/ID3/module.audio.ac3.php b/wp-includes/ID3/module.audio.ac3.php new file mode 100644 index 0000000..364681b --- /dev/null +++ b/wp-includes/ID3/module.audio.ac3.php @@ -0,0 +1,820 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.ac3.php // +// module for analyzing AC-3 (aka Dolby Digital) audio files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_ac3 extends getid3_handler +{ + /** + * @var array + */ + private $AC3header = array(); + + /** + * @var int + */ + private $BSIoffset = 0; + + const syncword = 0x0B77; + + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + ///AH + $info['ac3']['raw']['bsi'] = array(); + $thisfile_ac3 = &$info['ac3']; + $thisfile_ac3_raw = &$thisfile_ac3['raw']; + $thisfile_ac3_raw_bsi = &$thisfile_ac3_raw['bsi']; + + + // http://www.atsc.org/standards/a_52a.pdf + + $info['fileformat'] = 'ac3'; + + // An AC-3 serial coded audio bit stream is made up of a sequence of synchronization frames + // Each synchronization frame contains 6 coded audio blocks (AB), each of which represent 256 + // new audio samples per channel. A synchronization information (SI) header at the beginning + // of each frame contains information needed to acquire and maintain synchronization. A + // bit stream information (BSI) header follows SI, and contains parameters describing the coded + // audio service. The coded audio blocks may be followed by an auxiliary data (Aux) field. At the + // end of each frame is an error check field that includes a CRC word for error detection. An + // additional CRC word is located in the SI header, the use of which, by a decoder, is optional. + // + // syncinfo() | bsi() | AB0 | AB1 | AB2 | AB3 | AB4 | AB5 | Aux | CRC + + // syncinfo() { + // syncword 16 + // crc1 16 + // fscod 2 + // frmsizecod 6 + // } /* end of syncinfo */ + + $this->fseek($info['avdataoffset']); + $tempAC3header = $this->fread(100); // should be enough to cover all data, there are some variable-length fields...? + $this->AC3header['syncinfo'] = getid3_lib::BigEndian2Int(substr($tempAC3header, 0, 2)); + $this->AC3header['bsi'] = getid3_lib::BigEndian2Bin(substr($tempAC3header, 2)); + $thisfile_ac3_raw_bsi['bsid'] = (getid3_lib::LittleEndian2Int(substr($tempAC3header, 5, 1)) & 0xF8) >> 3; // AC3 and E-AC3 put the "bsid" version identifier in the same place, but unfortnately the 4 bytes between the syncword and the version identifier are interpreted differently, so grab it here so the following code structure can make sense + unset($tempAC3header); + + if ($this->AC3header['syncinfo'] !== self::syncword) { + if (!$this->isDependencyFor('matroska')) { + unset($info['fileformat'], $info['ac3']); + return $this->error('Expecting "'.dechex(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.dechex($this->AC3header['syncinfo']).'"'); + } + } + + $info['audio']['dataformat'] = 'ac3'; + $info['audio']['bitrate_mode'] = 'cbr'; + $info['audio']['lossless'] = false; + + if ($thisfile_ac3_raw_bsi['bsid'] <= 8) { + + $thisfile_ac3_raw_bsi['crc1'] = getid3_lib::Bin2Dec($this->readHeaderBSI(16)); + $thisfile_ac3_raw_bsi['fscod'] = $this->readHeaderBSI(2); // 5.4.1.3 + $thisfile_ac3_raw_bsi['frmsizecod'] = $this->readHeaderBSI(6); // 5.4.1.4 + if ($thisfile_ac3_raw_bsi['frmsizecod'] > 37) { // binary: 100101 - see Table 5.18 Frame Size Code Table (1 word = 16 bits) + $this->warning('Unexpected ac3.bsi.frmsizecod value: '.$thisfile_ac3_raw_bsi['frmsizecod'].', bitrate not set correctly'); + } + + $thisfile_ac3_raw_bsi['bsid'] = $this->readHeaderBSI(5); // we already know this from pre-parsing the version identifier, but re-read it to let the bitstream flow as intended + $thisfile_ac3_raw_bsi['bsmod'] = $this->readHeaderBSI(3); + $thisfile_ac3_raw_bsi['acmod'] = $this->readHeaderBSI(3); + + if ($thisfile_ac3_raw_bsi['acmod'] & 0x01) { + // If the lsb of acmod is a 1, center channel is in use and cmixlev follows in the bit stream. + $thisfile_ac3_raw_bsi['cmixlev'] = $this->readHeaderBSI(2); + $thisfile_ac3['center_mix_level'] = self::centerMixLevelLookup($thisfile_ac3_raw_bsi['cmixlev']); + } + + if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) { + // If the msb of acmod is a 1, surround channels are in use and surmixlev follows in the bit stream. + $thisfile_ac3_raw_bsi['surmixlev'] = $this->readHeaderBSI(2); + $thisfile_ac3['surround_mix_level'] = self::surroundMixLevelLookup($thisfile_ac3_raw_bsi['surmixlev']); + } + + if ($thisfile_ac3_raw_bsi['acmod'] == 0x02) { + // When operating in the two channel mode, this 2-bit code indicates whether or not the program has been encoded in Dolby Surround. + $thisfile_ac3_raw_bsi['dsurmod'] = $this->readHeaderBSI(2); + $thisfile_ac3['dolby_surround_mode'] = self::dolbySurroundModeLookup($thisfile_ac3_raw_bsi['dsurmod']); + } + + $thisfile_ac3_raw_bsi['flags']['lfeon'] = (bool) $this->readHeaderBSI(1); + + // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31. + // The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent. + $thisfile_ac3_raw_bsi['dialnorm'] = $this->readHeaderBSI(5); // 5.4.2.8 dialnorm: Dialogue Normalization, 5 Bits + + $thisfile_ac3_raw_bsi['flags']['compr'] = (bool) $this->readHeaderBSI(1); // 5.4.2.9 compre: Compression Gain Word Exists, 1 Bit + if ($thisfile_ac3_raw_bsi['flags']['compr']) { + $thisfile_ac3_raw_bsi['compr'] = $this->readHeaderBSI(8); // 5.4.2.10 compr: Compression Gain Word, 8 Bits + $thisfile_ac3['heavy_compression'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr']); + } + + $thisfile_ac3_raw_bsi['flags']['langcod'] = (bool) $this->readHeaderBSI(1); // 5.4.2.11 langcode: Language Code Exists, 1 Bit + if ($thisfile_ac3_raw_bsi['flags']['langcod']) { + $thisfile_ac3_raw_bsi['langcod'] = $this->readHeaderBSI(8); // 5.4.2.12 langcod: Language Code, 8 Bits + } + + $thisfile_ac3_raw_bsi['flags']['audprodinfo'] = (bool) $this->readHeaderBSI(1); // 5.4.2.13 audprodie: Audio Production Information Exists, 1 Bit + if ($thisfile_ac3_raw_bsi['flags']['audprodinfo']) { + $thisfile_ac3_raw_bsi['mixlevel'] = $this->readHeaderBSI(5); // 5.4.2.14 mixlevel: Mixing Level, 5 Bits + $thisfile_ac3_raw_bsi['roomtyp'] = $this->readHeaderBSI(2); // 5.4.2.15 roomtyp: Room Type, 2 Bits + + $thisfile_ac3['mixing_level'] = (80 + $thisfile_ac3_raw_bsi['mixlevel']).'dB'; + $thisfile_ac3['room_type'] = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp']); + } + + + $thisfile_ac3_raw_bsi['dialnorm2'] = $this->readHeaderBSI(5); // 5.4.2.16 dialnorm2: Dialogue Normalization, ch2, 5 Bits + $thisfile_ac3['dialogue_normalization2'] = '-'.$thisfile_ac3_raw_bsi['dialnorm2'].'dB'; // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31. The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent. + + $thisfile_ac3_raw_bsi['flags']['compr2'] = (bool) $this->readHeaderBSI(1); // 5.4.2.17 compr2e: Compression Gain Word Exists, ch2, 1 Bit + if ($thisfile_ac3_raw_bsi['flags']['compr2']) { + $thisfile_ac3_raw_bsi['compr2'] = $this->readHeaderBSI(8); // 5.4.2.18 compr2: Compression Gain Word, ch2, 8 Bits + $thisfile_ac3['heavy_compression2'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr2']); + } + + $thisfile_ac3_raw_bsi['flags']['langcod2'] = (bool) $this->readHeaderBSI(1); // 5.4.2.19 langcod2e: Language Code Exists, ch2, 1 Bit + if ($thisfile_ac3_raw_bsi['flags']['langcod2']) { + $thisfile_ac3_raw_bsi['langcod2'] = $this->readHeaderBSI(8); // 5.4.2.20 langcod2: Language Code, ch2, 8 Bits + } + + $thisfile_ac3_raw_bsi['flags']['audprodinfo2'] = (bool) $this->readHeaderBSI(1); // 5.4.2.21 audprodi2e: Audio Production Information Exists, ch2, 1 Bit + if ($thisfile_ac3_raw_bsi['flags']['audprodinfo2']) { + $thisfile_ac3_raw_bsi['mixlevel2'] = $this->readHeaderBSI(5); // 5.4.2.22 mixlevel2: Mixing Level, ch2, 5 Bits + $thisfile_ac3_raw_bsi['roomtyp2'] = $this->readHeaderBSI(2); // 5.4.2.23 roomtyp2: Room Type, ch2, 2 Bits + + $thisfile_ac3['mixing_level2'] = (80 + $thisfile_ac3_raw_bsi['mixlevel2']).'dB'; + $thisfile_ac3['room_type2'] = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp2']); + } + + $thisfile_ac3_raw_bsi['copyright'] = (bool) $this->readHeaderBSI(1); // 5.4.2.24 copyrightb: Copyright Bit, 1 Bit + + $thisfile_ac3_raw_bsi['original'] = (bool) $this->readHeaderBSI(1); // 5.4.2.25 origbs: Original Bit Stream, 1 Bit + + $thisfile_ac3_raw_bsi['flags']['timecod1'] = $this->readHeaderBSI(2); // 5.4.2.26 timecod1e, timcode2e: Time Code (first and second) Halves Exist, 2 Bits + if ($thisfile_ac3_raw_bsi['flags']['timecod1'] & 0x01) { + $thisfile_ac3_raw_bsi['timecod1'] = $this->readHeaderBSI(14); // 5.4.2.27 timecod1: Time code first half, 14 bits + $thisfile_ac3['timecode1'] = 0; + $thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x3E00) >> 9) * 3600; // The first 5 bits of this 14-bit field represent the time in hours, with valid values of 0�23 + $thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x01F8) >> 3) * 60; // The next 6 bits represent the time in minutes, with valid values of 0�59 + $thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x0003) >> 0) * 8; // The final 3 bits represents the time in 8 second increments, with valid values of 0�7 (representing 0, 8, 16, ... 56 seconds) + } + if ($thisfile_ac3_raw_bsi['flags']['timecod1'] & 0x02) { + $thisfile_ac3_raw_bsi['timecod2'] = $this->readHeaderBSI(14); // 5.4.2.28 timecod2: Time code second half, 14 bits + $thisfile_ac3['timecode2'] = 0; + $thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x3800) >> 11) * 1; // The first 3 bits of this 14-bit field represent the time in seconds, with valid values from 0�7 (representing 0-7 seconds) + $thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x07C0) >> 6) * (1 / 30); // The next 5 bits represents the time in frames, with valid values from 0�29 (one frame = 1/30th of a second) + $thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x003F) >> 0) * ((1 / 30) / 60); // The final 6 bits represents fractions of 1/64 of a frame, with valid values from 0�63 + } + + $thisfile_ac3_raw_bsi['flags']['addbsi'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['addbsi']) { + $thisfile_ac3_raw_bsi['addbsi_length'] = $this->readHeaderBSI(6) + 1; // This 6-bit code, which exists only if addbside is a 1, indicates the length in bytes of additional bit stream information. The valid range of addbsil is 0�63, indicating 1�64 additional bytes, respectively. + + $this->AC3header['bsi'] .= getid3_lib::BigEndian2Bin($this->fread($thisfile_ac3_raw_bsi['addbsi_length'])); + + $thisfile_ac3_raw_bsi['addbsi_data'] = substr($this->AC3header['bsi'], $this->BSIoffset, $thisfile_ac3_raw_bsi['addbsi_length'] * 8); + $this->BSIoffset += $thisfile_ac3_raw_bsi['addbsi_length'] * 8; + } + + + } elseif ($thisfile_ac3_raw_bsi['bsid'] <= 16) { // E-AC3 + + + $this->error('E-AC3 parsing is incomplete and experimental in this version of getID3 ('.$this->getid3->version().'). Notably the bitrate calculations are wrong -- value might (or not) be correct, but it is not calculated correctly. Email info@getid3.org if you know how to calculate EAC3 bitrate correctly.'); + $info['audio']['dataformat'] = 'eac3'; + + $thisfile_ac3_raw_bsi['strmtyp'] = $this->readHeaderBSI(2); + $thisfile_ac3_raw_bsi['substreamid'] = $this->readHeaderBSI(3); + $thisfile_ac3_raw_bsi['frmsiz'] = $this->readHeaderBSI(11); + $thisfile_ac3_raw_bsi['fscod'] = $this->readHeaderBSI(2); + if ($thisfile_ac3_raw_bsi['fscod'] == 3) { + $thisfile_ac3_raw_bsi['fscod2'] = $this->readHeaderBSI(2); + $thisfile_ac3_raw_bsi['numblkscod'] = 3; // six blocks per syncframe + } else { + $thisfile_ac3_raw_bsi['numblkscod'] = $this->readHeaderBSI(2); + } + $thisfile_ac3['bsi']['blocks_per_sync_frame'] = self::blocksPerSyncFrame($thisfile_ac3_raw_bsi['numblkscod']); + $thisfile_ac3_raw_bsi['acmod'] = $this->readHeaderBSI(3); + $thisfile_ac3_raw_bsi['flags']['lfeon'] = (bool) $this->readHeaderBSI(1); + $thisfile_ac3_raw_bsi['bsid'] = $this->readHeaderBSI(5); // we already know this from pre-parsing the version identifier, but re-read it to let the bitstream flow as intended + $thisfile_ac3_raw_bsi['dialnorm'] = $this->readHeaderBSI(5); + $thisfile_ac3_raw_bsi['flags']['compr'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['compr']) { + $thisfile_ac3_raw_bsi['compr'] = $this->readHeaderBSI(8); + } + if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value) + $thisfile_ac3_raw_bsi['dialnorm2'] = $this->readHeaderBSI(5); + $thisfile_ac3_raw_bsi['flags']['compr2'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['compr2']) { + $thisfile_ac3_raw_bsi['compr2'] = $this->readHeaderBSI(8); + } + } + if ($thisfile_ac3_raw_bsi['strmtyp'] == 1) { // if dependent stream + $thisfile_ac3_raw_bsi['flags']['chanmap'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['chanmap']) { + $thisfile_ac3_raw_bsi['chanmap'] = $this->readHeaderBSI(8); + } + } + $thisfile_ac3_raw_bsi['flags']['mixmdat'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['mixmdat']) { // Mixing metadata + if ($thisfile_ac3_raw_bsi['acmod'] > 2) { // if more than 2 channels + $thisfile_ac3_raw_bsi['dmixmod'] = $this->readHeaderBSI(2); + } + if (($thisfile_ac3_raw_bsi['acmod'] & 0x01) && ($thisfile_ac3_raw_bsi['acmod'] > 2)) { // if three front channels exist + $thisfile_ac3_raw_bsi['ltrtcmixlev'] = $this->readHeaderBSI(3); + $thisfile_ac3_raw_bsi['lorocmixlev'] = $this->readHeaderBSI(3); + } + if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) { // if a surround channel exists + $thisfile_ac3_raw_bsi['ltrtsurmixlev'] = $this->readHeaderBSI(3); + $thisfile_ac3_raw_bsi['lorosurmixlev'] = $this->readHeaderBSI(3); + } + if ($thisfile_ac3_raw_bsi['flags']['lfeon']) { // if the LFE channel exists + $thisfile_ac3_raw_bsi['flags']['lfemixlevcod'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['lfemixlevcod']) { + $thisfile_ac3_raw_bsi['lfemixlevcod'] = $this->readHeaderBSI(5); + } + } + if ($thisfile_ac3_raw_bsi['strmtyp'] == 0) { // if independent stream + $thisfile_ac3_raw_bsi['flags']['pgmscl'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['pgmscl']) { + $thisfile_ac3_raw_bsi['pgmscl'] = $this->readHeaderBSI(6); + } + if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value) + $thisfile_ac3_raw_bsi['flags']['pgmscl2'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['pgmscl2']) { + $thisfile_ac3_raw_bsi['pgmscl2'] = $this->readHeaderBSI(6); + } + } + $thisfile_ac3_raw_bsi['flags']['extpgmscl'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['extpgmscl']) { + $thisfile_ac3_raw_bsi['extpgmscl'] = $this->readHeaderBSI(6); + } + $thisfile_ac3_raw_bsi['mixdef'] = $this->readHeaderBSI(2); + if ($thisfile_ac3_raw_bsi['mixdef'] == 1) { // mixing option 2 + $thisfile_ac3_raw_bsi['premixcmpsel'] = (bool) $this->readHeaderBSI(1); + $thisfile_ac3_raw_bsi['drcsrc'] = (bool) $this->readHeaderBSI(1); + $thisfile_ac3_raw_bsi['premixcmpscl'] = $this->readHeaderBSI(3); + } elseif ($thisfile_ac3_raw_bsi['mixdef'] == 2) { // mixing option 3 + $thisfile_ac3_raw_bsi['mixdata'] = $this->readHeaderBSI(12); + } elseif ($thisfile_ac3_raw_bsi['mixdef'] == 3) { // mixing option 4 + $mixdefbitsread = 0; + $thisfile_ac3_raw_bsi['mixdeflen'] = $this->readHeaderBSI(5); $mixdefbitsread += 5; + $thisfile_ac3_raw_bsi['flags']['mixdata2'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['mixdata2']) { + $thisfile_ac3_raw_bsi['premixcmpsel'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + $thisfile_ac3_raw_bsi['drcsrc'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + $thisfile_ac3_raw_bsi['premixcmpscl'] = $this->readHeaderBSI(3); $mixdefbitsread += 3; + $thisfile_ac3_raw_bsi['flags']['extpgmlscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['extpgmlscl']) { + $thisfile_ac3_raw_bsi['extpgmlscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; + } + $thisfile_ac3_raw_bsi['flags']['extpgmcscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['extpgmcscl']) { + $thisfile_ac3_raw_bsi['extpgmcscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; + } + $thisfile_ac3_raw_bsi['flags']['extpgmrscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['extpgmrscl']) { + $thisfile_ac3_raw_bsi['extpgmrscl'] = $this->readHeaderBSI(4); + } + $thisfile_ac3_raw_bsi['flags']['extpgmlsscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['extpgmlsscl']) { + $thisfile_ac3_raw_bsi['extpgmlsscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; + } + $thisfile_ac3_raw_bsi['flags']['extpgmrsscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['extpgmrsscl']) { + $thisfile_ac3_raw_bsi['extpgmrsscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; + } + $thisfile_ac3_raw_bsi['flags']['extpgmlfescl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['extpgmlfescl']) { + $thisfile_ac3_raw_bsi['extpgmlfescl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; + } + $thisfile_ac3_raw_bsi['flags']['dmixscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['dmixscl']) { + $thisfile_ac3_raw_bsi['dmixscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; + } + $thisfile_ac3_raw_bsi['flags']['addch'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['addch']) { + $thisfile_ac3_raw_bsi['flags']['extpgmaux1scl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['extpgmaux1scl']) { + $thisfile_ac3_raw_bsi['extpgmaux1scl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; + } + $thisfile_ac3_raw_bsi['flags']['extpgmaux2scl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['extpgmaux2scl']) { + $thisfile_ac3_raw_bsi['extpgmaux2scl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; + } + } + } + $thisfile_ac3_raw_bsi['flags']['mixdata3'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['mixdata3']) { + $thisfile_ac3_raw_bsi['spchdat'] = $this->readHeaderBSI(5); $mixdefbitsread += 5; + $thisfile_ac3_raw_bsi['flags']['addspchdat'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['addspchdat']) { + $thisfile_ac3_raw_bsi['spchdat1'] = $this->readHeaderBSI(5); $mixdefbitsread += 5; + $thisfile_ac3_raw_bsi['spchan1att'] = $this->readHeaderBSI(2); $mixdefbitsread += 2; + $thisfile_ac3_raw_bsi['flags']['addspchdat1'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; + if ($thisfile_ac3_raw_bsi['flags']['addspchdat1']) { + $thisfile_ac3_raw_bsi['spchdat2'] = $this->readHeaderBSI(5); $mixdefbitsread += 5; + $thisfile_ac3_raw_bsi['spchan2att'] = $this->readHeaderBSI(3); $mixdefbitsread += 3; + } + } + } + $mixdata_bits = (8 * ($thisfile_ac3_raw_bsi['mixdeflen'] + 2)) - $mixdefbitsread; + $mixdata_fill = (($mixdata_bits % 8) ? 8 - ($mixdata_bits % 8) : 0); + $thisfile_ac3_raw_bsi['mixdata'] = $this->readHeaderBSI($mixdata_bits); + $thisfile_ac3_raw_bsi['mixdatafill'] = $this->readHeaderBSI($mixdata_fill); + unset($mixdefbitsread, $mixdata_bits, $mixdata_fill); + } + if ($thisfile_ac3_raw_bsi['acmod'] < 2) { // if mono or dual mono source + $thisfile_ac3_raw_bsi['flags']['paninfo'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['paninfo']) { + $thisfile_ac3_raw_bsi['panmean'] = $this->readHeaderBSI(8); + $thisfile_ac3_raw_bsi['paninfo'] = $this->readHeaderBSI(6); + } + if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value) + $thisfile_ac3_raw_bsi['flags']['paninfo2'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['paninfo2']) { + $thisfile_ac3_raw_bsi['panmean2'] = $this->readHeaderBSI(8); + $thisfile_ac3_raw_bsi['paninfo2'] = $this->readHeaderBSI(6); + } + } + } + $thisfile_ac3_raw_bsi['flags']['frmmixcfginfo'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['frmmixcfginfo']) { // mixing configuration information + if ($thisfile_ac3_raw_bsi['numblkscod'] == 0) { + $thisfile_ac3_raw_bsi['blkmixcfginfo'][0] = $this->readHeaderBSI(5); + } else { + for ($blk = 0; $blk < $thisfile_ac3_raw_bsi['numblkscod']; $blk++) { + $thisfile_ac3_raw_bsi['flags']['blkmixcfginfo'.$blk] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['blkmixcfginfo'.$blk]) { // mixing configuration information + $thisfile_ac3_raw_bsi['blkmixcfginfo'][$blk] = $this->readHeaderBSI(5); + } + } + } + } + } + } + $thisfile_ac3_raw_bsi['flags']['infomdat'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['infomdat']) { // Informational metadata + $thisfile_ac3_raw_bsi['bsmod'] = $this->readHeaderBSI(3); + $thisfile_ac3_raw_bsi['flags']['copyrightb'] = (bool) $this->readHeaderBSI(1); + $thisfile_ac3_raw_bsi['flags']['origbs'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['acmod'] == 2) { // if in 2/0 mode + $thisfile_ac3_raw_bsi['dsurmod'] = $this->readHeaderBSI(2); + $thisfile_ac3_raw_bsi['dheadphonmod'] = $this->readHeaderBSI(2); + } + if ($thisfile_ac3_raw_bsi['acmod'] >= 6) { // if both surround channels exist + $thisfile_ac3_raw_bsi['dsurexmod'] = $this->readHeaderBSI(2); + } + $thisfile_ac3_raw_bsi['flags']['audprodi'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['audprodi']) { + $thisfile_ac3_raw_bsi['mixlevel'] = $this->readHeaderBSI(5); + $thisfile_ac3_raw_bsi['roomtyp'] = $this->readHeaderBSI(2); + $thisfile_ac3_raw_bsi['flags']['adconvtyp'] = (bool) $this->readHeaderBSI(1); + } + if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value) + $thisfile_ac3_raw_bsi['flags']['audprodi2'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['audprodi2']) { + $thisfile_ac3_raw_bsi['mixlevel2'] = $this->readHeaderBSI(5); + $thisfile_ac3_raw_bsi['roomtyp2'] = $this->readHeaderBSI(2); + $thisfile_ac3_raw_bsi['flags']['adconvtyp2'] = (bool) $this->readHeaderBSI(1); + } + } + if ($thisfile_ac3_raw_bsi['fscod'] < 3) { // if not half sample rate + $thisfile_ac3_raw_bsi['flags']['sourcefscod'] = (bool) $this->readHeaderBSI(1); + } + } + if (($thisfile_ac3_raw_bsi['strmtyp'] == 0) && ($thisfile_ac3_raw_bsi['numblkscod'] != 3)) { // if both surround channels exist + $thisfile_ac3_raw_bsi['flags']['convsync'] = (bool) $this->readHeaderBSI(1); + } + if ($thisfile_ac3_raw_bsi['strmtyp'] == 2) { // if bit stream converted from AC-3 + if ($thisfile_ac3_raw_bsi['numblkscod'] != 3) { // 6 blocks per syncframe + $thisfile_ac3_raw_bsi['flags']['blkid'] = 1; + } else { + $thisfile_ac3_raw_bsi['flags']['blkid'] = (bool) $this->readHeaderBSI(1); + } + if ($thisfile_ac3_raw_bsi['flags']['blkid']) { + $thisfile_ac3_raw_bsi['frmsizecod'] = $this->readHeaderBSI(6); + } + } + $thisfile_ac3_raw_bsi['flags']['addbsi'] = (bool) $this->readHeaderBSI(1); + if ($thisfile_ac3_raw_bsi['flags']['addbsi']) { + $thisfile_ac3_raw_bsi['addbsil'] = $this->readHeaderBSI(6); + $thisfile_ac3_raw_bsi['addbsi'] = $this->readHeaderBSI(($thisfile_ac3_raw_bsi['addbsil'] + 1) * 8); + } + + } else { + + $this->error('Bit stream identification is version '.$thisfile_ac3_raw_bsi['bsid'].', but getID3() only understands up to version 16. Please submit a support ticket with a sample file.'); + unset($info['ac3']); + return false; + + } + + if (isset($thisfile_ac3_raw_bsi['fscod2'])) { + $thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup2($thisfile_ac3_raw_bsi['fscod2']); + } else { + $thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup($thisfile_ac3_raw_bsi['fscod']); + } + if ($thisfile_ac3_raw_bsi['fscod'] <= 3) { + $info['audio']['sample_rate'] = $thisfile_ac3['sample_rate']; + } else { + $this->warning('Unexpected ac3.bsi.fscod value: '.$thisfile_ac3_raw_bsi['fscod']); + } + if (isset($thisfile_ac3_raw_bsi['frmsizecod'])) { + $thisfile_ac3['frame_length'] = self::frameSizeLookup($thisfile_ac3_raw_bsi['frmsizecod'], $thisfile_ac3_raw_bsi['fscod']); + $thisfile_ac3['bitrate'] = self::bitrateLookup($thisfile_ac3_raw_bsi['frmsizecod']); + } elseif (!empty($thisfile_ac3_raw_bsi['frmsiz'])) { + // this isn't right, but it's (usually) close, roughly 5% less than it should be. + // but WHERE is the actual bitrate value stored in EAC3?? email info@getid3.org if you know! + $thisfile_ac3['bitrate'] = ($thisfile_ac3_raw_bsi['frmsiz'] + 1) * 16 * 30; // The frmsiz field shall contain a value one less than the overall size of the coded syncframe in 16-bit words. That is, this field may assume a value ranging from 0 to 2047, and these values correspond to syncframe sizes ranging from 1 to 2048. + // kludge-fix to make it approximately the expected value, still not "right": + $thisfile_ac3['bitrate'] = round(($thisfile_ac3['bitrate'] * 1.05) / 16000) * 16000; + } + $info['audio']['bitrate'] = $thisfile_ac3['bitrate']; + + if (isset($thisfile_ac3_raw_bsi['bsmod']) && isset($thisfile_ac3_raw_bsi['acmod'])) { + $thisfile_ac3['service_type'] = self::serviceTypeLookup($thisfile_ac3_raw_bsi['bsmod'], $thisfile_ac3_raw_bsi['acmod']); + } + $ac3_coding_mode = self::audioCodingModeLookup($thisfile_ac3_raw_bsi['acmod']); + foreach($ac3_coding_mode as $key => $value) { + $thisfile_ac3[$key] = $value; + } + switch ($thisfile_ac3_raw_bsi['acmod']) { + case 0: + case 1: + $info['audio']['channelmode'] = 'mono'; + break; + case 3: + case 4: + $info['audio']['channelmode'] = 'stereo'; + break; + default: + $info['audio']['channelmode'] = 'surround'; + break; + } + $info['audio']['channels'] = $thisfile_ac3['num_channels']; + + $thisfile_ac3['lfe_enabled'] = $thisfile_ac3_raw_bsi['flags']['lfeon']; + if ($thisfile_ac3_raw_bsi['flags']['lfeon']) { + $info['audio']['channels'] .= '.1'; + } + + $thisfile_ac3['channels_enabled'] = self::channelsEnabledLookup($thisfile_ac3_raw_bsi['acmod'], $thisfile_ac3_raw_bsi['flags']['lfeon']); + $thisfile_ac3['dialogue_normalization'] = '-'.$thisfile_ac3_raw_bsi['dialnorm'].'dB'; + + return true; + } + + /** + * @param int $length + * + * @return float|int + */ + private function readHeaderBSI($length) { + $data = substr($this->AC3header['bsi'], $this->BSIoffset, $length); + $this->BSIoffset += $length; + + return bindec($data); + } + + /** + * @param int $fscod + * + * @return int|string|false + */ + public static function sampleRateCodeLookup($fscod) { + static $sampleRateCodeLookup = array( + 0 => 48000, + 1 => 44100, + 2 => 32000, + 3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute. + ); + return (isset($sampleRateCodeLookup[$fscod]) ? $sampleRateCodeLookup[$fscod] : false); + } + + /** + * @param int $fscod2 + * + * @return int|string|false + */ + public static function sampleRateCodeLookup2($fscod2) { + static $sampleRateCodeLookup2 = array( + 0 => 24000, + 1 => 22050, + 2 => 16000, + 3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute. + ); + return (isset($sampleRateCodeLookup2[$fscod2]) ? $sampleRateCodeLookup2[$fscod2] : false); + } + + /** + * @param int $bsmod + * @param int $acmod + * + * @return string|false + */ + public static function serviceTypeLookup($bsmod, $acmod) { + static $serviceTypeLookup = array(); + if (empty($serviceTypeLookup)) { + for ($i = 0; $i <= 7; $i++) { + $serviceTypeLookup[0][$i] = 'main audio service: complete main (CM)'; + $serviceTypeLookup[1][$i] = 'main audio service: music and effects (ME)'; + $serviceTypeLookup[2][$i] = 'associated service: visually impaired (VI)'; + $serviceTypeLookup[3][$i] = 'associated service: hearing impaired (HI)'; + $serviceTypeLookup[4][$i] = 'associated service: dialogue (D)'; + $serviceTypeLookup[5][$i] = 'associated service: commentary (C)'; + $serviceTypeLookup[6][$i] = 'associated service: emergency (E)'; + } + + $serviceTypeLookup[7][1] = 'associated service: voice over (VO)'; + for ($i = 2; $i <= 7; $i++) { + $serviceTypeLookup[7][$i] = 'main audio service: karaoke'; + } + } + return (isset($serviceTypeLookup[$bsmod][$acmod]) ? $serviceTypeLookup[$bsmod][$acmod] : false); + } + + /** + * @param int $acmod + * + * @return array|false + */ + public static function audioCodingModeLookup($acmod) { + // array(channel configuration, # channels (not incl LFE), channel order) + static $audioCodingModeLookup = array ( + 0 => array('channel_config'=>'1+1', 'num_channels'=>2, 'channel_order'=>'Ch1,Ch2'), + 1 => array('channel_config'=>'1/0', 'num_channels'=>1, 'channel_order'=>'C'), + 2 => array('channel_config'=>'2/0', 'num_channels'=>2, 'channel_order'=>'L,R'), + 3 => array('channel_config'=>'3/0', 'num_channels'=>3, 'channel_order'=>'L,C,R'), + 4 => array('channel_config'=>'2/1', 'num_channels'=>3, 'channel_order'=>'L,R,S'), + 5 => array('channel_config'=>'3/1', 'num_channels'=>4, 'channel_order'=>'L,C,R,S'), + 6 => array('channel_config'=>'2/2', 'num_channels'=>4, 'channel_order'=>'L,R,SL,SR'), + 7 => array('channel_config'=>'3/2', 'num_channels'=>5, 'channel_order'=>'L,C,R,SL,SR'), + ); + return (isset($audioCodingModeLookup[$acmod]) ? $audioCodingModeLookup[$acmod] : false); + } + + /** + * @param int $cmixlev + * + * @return int|float|string|false + */ + public static function centerMixLevelLookup($cmixlev) { + static $centerMixLevelLookup; + if (empty($centerMixLevelLookup)) { + $centerMixLevelLookup = array( + 0 => pow(2, -3.0 / 6), // 0.707 (-3.0 dB) + 1 => pow(2, -4.5 / 6), // 0.595 (-4.5 dB) + 2 => pow(2, -6.0 / 6), // 0.500 (-6.0 dB) + 3 => 'reserved' + ); + } + return (isset($centerMixLevelLookup[$cmixlev]) ? $centerMixLevelLookup[$cmixlev] : false); + } + + /** + * @param int $surmixlev + * + * @return int|float|string|false + */ + public static function surroundMixLevelLookup($surmixlev) { + static $surroundMixLevelLookup; + if (empty($surroundMixLevelLookup)) { + $surroundMixLevelLookup = array( + 0 => pow(2, -3.0 / 6), + 1 => pow(2, -6.0 / 6), + 2 => 0, + 3 => 'reserved' + ); + } + return (isset($surroundMixLevelLookup[$surmixlev]) ? $surroundMixLevelLookup[$surmixlev] : false); + } + + /** + * @param int $dsurmod + * + * @return string|false + */ + public static function dolbySurroundModeLookup($dsurmod) { + static $dolbySurroundModeLookup = array( + 0 => 'not indicated', + 1 => 'Not Dolby Surround encoded', + 2 => 'Dolby Surround encoded', + 3 => 'reserved' + ); + return (isset($dolbySurroundModeLookup[$dsurmod]) ? $dolbySurroundModeLookup[$dsurmod] : false); + } + + /** + * @param int $acmod + * @param bool $lfeon + * + * @return array + */ + public static function channelsEnabledLookup($acmod, $lfeon) { + $lookup = array( + 'ch1'=>($acmod == 0), + 'ch2'=>($acmod == 0), + 'left'=>($acmod > 1), + 'right'=>($acmod > 1), + 'center'=>(bool) ($acmod & 0x01), + 'surround_mono'=>false, + 'surround_left'=>false, + 'surround_right'=>false, + 'lfe'=>$lfeon); + switch ($acmod) { + case 4: + case 5: + $lookup['surround_mono'] = true; + break; + case 6: + case 7: + $lookup['surround_left'] = true; + $lookup['surround_right'] = true; + break; + } + return $lookup; + } + + /** + * @param int $compre + * + * @return float|int + */ + public static function heavyCompression($compre) { + // The first four bits indicate gain changes in 6.02dB increments which can be + // implemented with an arithmetic shift operation. The following four bits + // indicate linear gain changes, and require a 5-bit multiply. + // We will represent the two 4-bit fields of compr as follows: + // X0 X1 X2 X3 . Y4 Y5 Y6 Y7 + // The meaning of the X values is most simply described by considering X to represent a 4-bit + // signed integer with values from -8 to +7. The gain indicated by X is then (X + 1) * 6.02 dB. The + // following table shows this in detail. + + // Meaning of 4 msb of compr + // 7 +48.16 dB + // 6 +42.14 dB + // 5 +36.12 dB + // 4 +30.10 dB + // 3 +24.08 dB + // 2 +18.06 dB + // 1 +12.04 dB + // 0 +6.02 dB + // -1 0 dB + // -2 -6.02 dB + // -3 -12.04 dB + // -4 -18.06 dB + // -5 -24.08 dB + // -6 -30.10 dB + // -7 -36.12 dB + // -8 -42.14 dB + + $fourbit = str_pad(decbin(($compre & 0xF0) >> 4), 4, '0', STR_PAD_LEFT); + if ($fourbit[0] == '1') { + $log_gain = -8 + bindec(substr($fourbit, 1)); + } else { + $log_gain = bindec(substr($fourbit, 1)); + } + $log_gain = ($log_gain + 1) * getid3_lib::RGADamplitude2dB(2); + + // The value of Y is a linear representation of a gain change of up to -6 dB. Y is considered to + // be an unsigned fractional integer, with a leading value of 1, or: 0.1 Y4 Y5 Y6 Y7 (base 2). Y can + // represent values between 0.111112 (or 31/32) and 0.100002 (or 1/2). Thus, Y can represent gain + // changes from -0.28 dB to -6.02 dB. + + $lin_gain = (16 + ($compre & 0x0F)) / 32; + + // The combination of X and Y values allows compr to indicate gain changes from + // 48.16 - 0.28 = +47.89 dB, to + // -42.14 - 6.02 = -48.16 dB. + + return $log_gain - $lin_gain; + } + + /** + * @param int $roomtyp + * + * @return string|false + */ + public static function roomTypeLookup($roomtyp) { + static $roomTypeLookup = array( + 0 => 'not indicated', + 1 => 'large room, X curve monitor', + 2 => 'small room, flat monitor', + 3 => 'reserved' + ); + return (isset($roomTypeLookup[$roomtyp]) ? $roomTypeLookup[$roomtyp] : false); + } + + /** + * @param int $frmsizecod + * @param int $fscod + * + * @return int|false + */ + public static function frameSizeLookup($frmsizecod, $fscod) { + // LSB is whether padding is used or not + $padding = (bool) ($frmsizecod & 0x01); + $framesizeid = ($frmsizecod & 0x3E) >> 1; + + static $frameSizeLookup = array(); + if (empty($frameSizeLookup)) { + $frameSizeLookup = array ( + 0 => array( 128, 138, 192), // 32 kbps + 1 => array( 160, 174, 240), // 40 kbps + 2 => array( 192, 208, 288), // 48 kbps + 3 => array( 224, 242, 336), // 56 kbps + 4 => array( 256, 278, 384), // 64 kbps + 5 => array( 320, 348, 480), // 80 kbps + 6 => array( 384, 416, 576), // 96 kbps + 7 => array( 448, 486, 672), // 112 kbps + 8 => array( 512, 556, 768), // 128 kbps + 9 => array( 640, 696, 960), // 160 kbps + 10 => array( 768, 834, 1152), // 192 kbps + 11 => array( 896, 974, 1344), // 224 kbps + 12 => array(1024, 1114, 1536), // 256 kbps + 13 => array(1280, 1392, 1920), // 320 kbps + 14 => array(1536, 1670, 2304), // 384 kbps + 15 => array(1792, 1950, 2688), // 448 kbps + 16 => array(2048, 2228, 3072), // 512 kbps + 17 => array(2304, 2506, 3456), // 576 kbps + 18 => array(2560, 2786, 3840) // 640 kbps + ); + } + $paddingBytes = 0; + if (($fscod == 1) && $padding) { + // frame lengths are padded by 1 word (16 bits) at 44100 + // (fscode==1) means 44100Hz (see sampleRateCodeLookup) + $paddingBytes = 2; + } + return (isset($frameSizeLookup[$framesizeid][$fscod]) ? $frameSizeLookup[$framesizeid][$fscod] + $paddingBytes : false); + } + + /** + * @param int $frmsizecod + * + * @return int|false + */ + public static function bitrateLookup($frmsizecod) { + // LSB is whether padding is used or not + $padding = (bool) ($frmsizecod & 0x01); + $framesizeid = ($frmsizecod & 0x3E) >> 1; + + static $bitrateLookup = array( + 0 => 32000, + 1 => 40000, + 2 => 48000, + 3 => 56000, + 4 => 64000, + 5 => 80000, + 6 => 96000, + 7 => 112000, + 8 => 128000, + 9 => 160000, + 10 => 192000, + 11 => 224000, + 12 => 256000, + 13 => 320000, + 14 => 384000, + 15 => 448000, + 16 => 512000, + 17 => 576000, + 18 => 640000, + ); + return (isset($bitrateLookup[$framesizeid]) ? $bitrateLookup[$framesizeid] : false); + } + + /** + * @param int $numblkscod + * + * @return int|false + */ + public static function blocksPerSyncFrame($numblkscod) { + static $blocksPerSyncFrameLookup = array( + 0 => 1, + 1 => 2, + 2 => 3, + 3 => 6, + ); + return (isset($blocksPerSyncFrameLookup[$numblkscod]) ? $blocksPerSyncFrameLookup[$numblkscod] : false); + } + + +} diff --git a/wp-includes/ID3/module.audio.dts.php b/wp-includes/ID3/module.audio.dts.php new file mode 100644 index 0000000..9be8f1b --- /dev/null +++ b/wp-includes/ID3/module.audio.dts.php @@ -0,0 +1,334 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.dts.php // +// module for analyzing DTS Audio files // +// dependencies: NONE // +// // +///////////////////////////////////////////////////////////////// + + +/** +* @tutorial http://wiki.multimedia.cx/index.php?title=DTS +*/ +class getid3_dts extends getid3_handler +{ + /** + * Default DTS syncword used in native .cpt or .dts formats. + */ + const syncword = "\x7F\xFE\x80\x01"; + + /** + * @var int + */ + private $readBinDataOffset = 0; + + /** + * Possible syncwords indicating bitstream encoding. + */ + public static $syncwords = array( + 0 => "\x7F\xFE\x80\x01", // raw big-endian + 1 => "\xFE\x7F\x01\x80", // raw little-endian + 2 => "\x1F\xFF\xE8\x00", // 14-bit big-endian + 3 => "\xFF\x1F\x00\xE8"); // 14-bit little-endian + + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + $info['fileformat'] = 'dts'; + + $this->fseek($info['avdataoffset']); + $DTSheader = $this->fread(20); // we only need 2 words magic + 6 words frame header, but these words may be normal 16-bit words OR 14-bit words with 2 highest bits set to zero, so 8 words can be either 8*16/8 = 16 bytes OR 8*16*(16/14)/8 = 18.3 bytes + + // check syncword + $sync = substr($DTSheader, 0, 4); + if (($encoding = array_search($sync, self::$syncwords)) !== false) { + + $info['dts']['raw']['magic'] = $sync; + $this->readBinDataOffset = 32; + + } elseif ($this->isDependencyFor('matroska')) { + + // Matroska contains DTS without syncword encoded as raw big-endian format + $encoding = 0; + $this->readBinDataOffset = 0; + + } else { + + unset($info['fileformat']); + return $this->error('Expecting "'.implode('| ', array_map('getid3_lib::PrintHexBytes', self::$syncwords)).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($sync).'"'); + + } + + // decode header + $fhBS = ''; + for ($word_offset = 0; $word_offset <= strlen($DTSheader); $word_offset += 2) { + switch ($encoding) { + case 0: // raw big-endian + $fhBS .= getid3_lib::BigEndian2Bin( substr($DTSheader, $word_offset, 2) ); + break; + case 1: // raw little-endian + $fhBS .= getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2))); + break; + case 2: // 14-bit big-endian + $fhBS .= substr(getid3_lib::BigEndian2Bin( substr($DTSheader, $word_offset, 2) ), 2, 14); + break; + case 3: // 14-bit little-endian + $fhBS .= substr(getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2))), 2, 14); + break; + } + } + + $info['dts']['raw']['frame_type'] = $this->readBinData($fhBS, 1); + $info['dts']['raw']['deficit_samples'] = $this->readBinData($fhBS, 5); + $info['dts']['flags']['crc_present'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['raw']['pcm_sample_blocks'] = $this->readBinData($fhBS, 7); + $info['dts']['raw']['frame_byte_size'] = $this->readBinData($fhBS, 14); + $info['dts']['raw']['channel_arrangement'] = $this->readBinData($fhBS, 6); + $info['dts']['raw']['sample_frequency'] = $this->readBinData($fhBS, 4); + $info['dts']['raw']['bitrate'] = $this->readBinData($fhBS, 5); + $info['dts']['flags']['embedded_downmix'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['flags']['dynamicrange'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['flags']['timestamp'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['flags']['auxdata'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['flags']['hdcd'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['raw']['extension_audio'] = $this->readBinData($fhBS, 3); + $info['dts']['flags']['extended_coding'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['flags']['audio_sync_insertion'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['raw']['lfe_effects'] = $this->readBinData($fhBS, 2); + $info['dts']['flags']['predictor_history'] = (bool) $this->readBinData($fhBS, 1); + if ($info['dts']['flags']['crc_present']) { + $info['dts']['raw']['crc16'] = $this->readBinData($fhBS, 16); + } + $info['dts']['flags']['mri_perfect_reconst'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['raw']['encoder_soft_version'] = $this->readBinData($fhBS, 4); + $info['dts']['raw']['copy_history'] = $this->readBinData($fhBS, 2); + $info['dts']['raw']['bits_per_sample'] = $this->readBinData($fhBS, 2); + $info['dts']['flags']['surround_es'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['flags']['front_sum_diff'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['flags']['surround_sum_diff'] = (bool) $this->readBinData($fhBS, 1); + $info['dts']['raw']['dialog_normalization'] = $this->readBinData($fhBS, 4); + + + $info['dts']['bitrate'] = self::bitrateLookup($info['dts']['raw']['bitrate']); + $info['dts']['bits_per_sample'] = self::bitPerSampleLookup($info['dts']['raw']['bits_per_sample']); + $info['dts']['sample_rate'] = self::sampleRateLookup($info['dts']['raw']['sample_frequency']); + $info['dts']['dialog_normalization'] = self::dialogNormalization($info['dts']['raw']['dialog_normalization'], $info['dts']['raw']['encoder_soft_version']); + $info['dts']['flags']['lossless'] = (($info['dts']['raw']['bitrate'] == 31) ? true : false); + $info['dts']['bitrate_mode'] = (($info['dts']['raw']['bitrate'] == 30) ? 'vbr' : 'cbr'); + $info['dts']['channels'] = self::numChannelsLookup($info['dts']['raw']['channel_arrangement']); + $info['dts']['channel_arrangement'] = self::channelArrangementLookup($info['dts']['raw']['channel_arrangement']); + + $info['audio']['dataformat'] = 'dts'; + $info['audio']['lossless'] = $info['dts']['flags']['lossless']; + $info['audio']['bitrate_mode'] = $info['dts']['bitrate_mode']; + $info['audio']['bits_per_sample'] = $info['dts']['bits_per_sample']; + $info['audio']['sample_rate'] = $info['dts']['sample_rate']; + $info['audio']['channels'] = $info['dts']['channels']; + $info['audio']['bitrate'] = $info['dts']['bitrate']; + if (isset($info['avdataend']) && !empty($info['dts']['bitrate']) && is_numeric($info['dts']['bitrate'])) { + $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($info['dts']['bitrate'] / 8); + if (($encoding == 2) || ($encoding == 3)) { + // 14-bit data packed into 16-bit words, so the playtime is wrong because only (14/16) of the bytes in the data portion of the file are used at the specified bitrate + $info['playtime_seconds'] *= (14 / 16); + } + } + return true; + } + + /** + * @param string $bin + * @param int $length + * + * @return float|int + */ + private function readBinData($bin, $length) { + $data = substr($bin, $this->readBinDataOffset, $length); + $this->readBinDataOffset += $length; + + return bindec($data); + } + + /** + * @param int $index + * + * @return int|string|false + */ + public static function bitrateLookup($index) { + static $lookup = array( + 0 => 32000, + 1 => 56000, + 2 => 64000, + 3 => 96000, + 4 => 112000, + 5 => 128000, + 6 => 192000, + 7 => 224000, + 8 => 256000, + 9 => 320000, + 10 => 384000, + 11 => 448000, + 12 => 512000, + 13 => 576000, + 14 => 640000, + 15 => 768000, + 16 => 960000, + 17 => 1024000, + 18 => 1152000, + 19 => 1280000, + 20 => 1344000, + 21 => 1408000, + 22 => 1411200, + 23 => 1472000, + 24 => 1536000, + 25 => 1920000, + 26 => 2048000, + 27 => 3072000, + 28 => 3840000, + 29 => 'open', + 30 => 'variable', + 31 => 'lossless', + ); + return (isset($lookup[$index]) ? $lookup[$index] : false); + } + + /** + * @param int $index + * + * @return int|string|false + */ + public static function sampleRateLookup($index) { + static $lookup = array( + 0 => 'invalid', + 1 => 8000, + 2 => 16000, + 3 => 32000, + 4 => 'invalid', + 5 => 'invalid', + 6 => 11025, + 7 => 22050, + 8 => 44100, + 9 => 'invalid', + 10 => 'invalid', + 11 => 12000, + 12 => 24000, + 13 => 48000, + 14 => 'invalid', + 15 => 'invalid', + ); + return (isset($lookup[$index]) ? $lookup[$index] : false); + } + + /** + * @param int $index + * + * @return int|false + */ + public static function bitPerSampleLookup($index) { + static $lookup = array( + 0 => 16, + 1 => 20, + 2 => 24, + 3 => 24, + ); + return (isset($lookup[$index]) ? $lookup[$index] : false); + } + + /** + * @param int $index + * + * @return int|false + */ + public static function numChannelsLookup($index) { + switch ($index) { + case 0: + return 1; + break; + case 1: + case 2: + case 3: + case 4: + return 2; + break; + case 5: + case 6: + return 3; + break; + case 7: + case 8: + return 4; + break; + case 9: + return 5; + break; + case 10: + case 11: + case 12: + return 6; + break; + case 13: + return 7; + break; + case 14: + case 15: + return 8; + break; + } + return false; + } + + /** + * @param int $index + * + * @return string + */ + public static function channelArrangementLookup($index) { + static $lookup = array( + 0 => 'A', + 1 => 'A + B (dual mono)', + 2 => 'L + R (stereo)', + 3 => '(L+R) + (L-R) (sum-difference)', + 4 => 'LT + RT (left and right total)', + 5 => 'C + L + R', + 6 => 'L + R + S', + 7 => 'C + L + R + S', + 8 => 'L + R + SL + SR', + 9 => 'C + L + R + SL + SR', + 10 => 'CL + CR + L + R + SL + SR', + 11 => 'C + L + R+ LR + RR + OV', + 12 => 'CF + CR + LF + RF + LR + RR', + 13 => 'CL + C + CR + L + R + SL + SR', + 14 => 'CL + CR + L + R + SL1 + SL2 + SR1 + SR2', + 15 => 'CL + C+ CR + L + R + SL + S + SR', + ); + return (isset($lookup[$index]) ? $lookup[$index] : 'user-defined'); + } + + /** + * @param int $index + * @param int $version + * + * @return int|false + */ + public static function dialogNormalization($index, $version) { + switch ($version) { + case 7: + return 0 - $index; + break; + case 6: + return 0 - 16 - $index; + break; + } + return false; + } + +} diff --git a/wp-includes/ID3/module.audio.flac.php b/wp-includes/ID3/module.audio.flac.php new file mode 100644 index 0000000..a37bae9 --- /dev/null +++ b/wp-includes/ID3/module.audio.flac.php @@ -0,0 +1,516 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.flac.php // +// module for analyzing FLAC and OggFLAC audio files // +// dependencies: module.audio.ogg.php // +// /// +///////////////////////////////////////////////////////////////// + + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true); + +/** +* @tutorial http://flac.sourceforge.net/format.html +*/ +class getid3_flac extends getid3_handler +{ + const syncword = 'fLaC'; + + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + $this->fseek($info['avdataoffset']); + $StreamMarker = $this->fread(4); + if ($StreamMarker != self::syncword) { + return $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($StreamMarker).'"'); + } + $info['fileformat'] = 'flac'; + $info['audio']['dataformat'] = 'flac'; + $info['audio']['bitrate_mode'] = 'vbr'; + $info['audio']['lossless'] = true; + + // parse flac container + return $this->parseMETAdata(); + } + + /** + * @return bool + */ + public function parseMETAdata() { + $info = &$this->getid3->info; + do { + $BlockOffset = $this->ftell(); + $BlockHeader = $this->fread(4); + $LBFBT = getid3_lib::BigEndian2Int(substr($BlockHeader, 0, 1)); // LBFBT = LastBlockFlag + BlockType + $LastBlockFlag = (bool) ($LBFBT & 0x80); + $BlockType = ($LBFBT & 0x7F); + $BlockLength = getid3_lib::BigEndian2Int(substr($BlockHeader, 1, 3)); + $BlockTypeText = self::metaBlockTypeLookup($BlockType); + + if (($BlockOffset + 4 + $BlockLength) > $info['avdataend']) { + $this->warning('METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockTypeText.') at offset '.$BlockOffset.' extends beyond end of file'); + break; + } + if ($BlockLength < 1) { + if ($BlockTypeText != 'reserved') { + // probably supposed to be zero-length + $this->warning('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockTypeText.') at offset '.$BlockOffset.' is zero bytes'); + continue; + } + $this->error('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockLength.') at offset '.$BlockOffset.' is invalid'); + break; + } + + $info['flac'][$BlockTypeText]['raw'] = array(); + $BlockTypeText_raw = &$info['flac'][$BlockTypeText]['raw']; + + $BlockTypeText_raw['offset'] = $BlockOffset; + $BlockTypeText_raw['last_meta_block'] = $LastBlockFlag; + $BlockTypeText_raw['block_type'] = $BlockType; + $BlockTypeText_raw['block_type_text'] = $BlockTypeText; + $BlockTypeText_raw['block_length'] = $BlockLength; + if ($BlockTypeText_raw['block_type'] != 0x06) { // do not read attachment data automatically + $BlockTypeText_raw['block_data'] = $this->fread($BlockLength); + } + + switch ($BlockTypeText) { + case 'STREAMINFO': // 0x00 + if (!$this->parseSTREAMINFO($BlockTypeText_raw['block_data'])) { + return false; + } + break; + + case 'PADDING': // 0x01 + unset($info['flac']['PADDING']); // ignore + break; + + case 'APPLICATION': // 0x02 + if (!$this->parseAPPLICATION($BlockTypeText_raw['block_data'])) { + return false; + } + break; + + case 'SEEKTABLE': // 0x03 + if (!$this->parseSEEKTABLE($BlockTypeText_raw['block_data'])) { + return false; + } + break; + + case 'VORBIS_COMMENT': // 0x04 + if (!$this->parseVORBIS_COMMENT($BlockTypeText_raw['block_data'])) { + return false; + } + break; + + case 'CUESHEET': // 0x05 + if (!$this->parseCUESHEET($BlockTypeText_raw['block_data'])) { + return false; + } + break; + + case 'PICTURE': // 0x06 + if (!$this->parsePICTURE()) { + return false; + } + break; + + default: + $this->warning('Unhandled METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockType.') at offset '.$BlockOffset); + } + + unset($info['flac'][$BlockTypeText]['raw']); + $info['avdataoffset'] = $this->ftell(); + } + while ($LastBlockFlag === false); + + // handle tags + if (!empty($info['flac']['VORBIS_COMMENT']['comments'])) { + $info['flac']['comments'] = $info['flac']['VORBIS_COMMENT']['comments']; + } + if (!empty($info['flac']['VORBIS_COMMENT']['vendor'])) { + $info['audio']['encoder'] = str_replace('reference ', '', $info['flac']['VORBIS_COMMENT']['vendor']); + } + + // copy attachments to 'comments' array if nesesary + if (isset($info['flac']['PICTURE']) && ($this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE)) { + foreach ($info['flac']['PICTURE'] as $entry) { + if (!empty($entry['data'])) { + if (!isset($info['flac']['comments']['picture'])) { + $info['flac']['comments']['picture'] = array(); + } + $comments_picture_data = array(); + foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { + if (isset($entry[$picture_key])) { + $comments_picture_data[$picture_key] = $entry[$picture_key]; + } + } + $info['flac']['comments']['picture'][] = $comments_picture_data; + unset($comments_picture_data); + } + } + } + + if (isset($info['flac']['STREAMINFO'])) { + if (!$this->isDependencyFor('matroska')) { + $info['flac']['compressed_audio_bytes'] = $info['avdataend'] - $info['avdataoffset']; + } + $info['flac']['uncompressed_audio_bytes'] = $info['flac']['STREAMINFO']['samples_stream'] * $info['flac']['STREAMINFO']['channels'] * ($info['flac']['STREAMINFO']['bits_per_sample'] / 8); + if ($info['flac']['uncompressed_audio_bytes'] == 0) { + return $this->error('Corrupt FLAC file: uncompressed_audio_bytes == zero'); + } + if (!empty($info['flac']['compressed_audio_bytes'])) { + $info['flac']['compression_ratio'] = $info['flac']['compressed_audio_bytes'] / $info['flac']['uncompressed_audio_bytes']; + } + } + + // set md5_data_source - built into flac 0.5+ + if (isset($info['flac']['STREAMINFO']['audio_signature'])) { + + if ($info['flac']['STREAMINFO']['audio_signature'] === str_repeat("\x00", 16)) { + $this->warning('FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)'); + } + else { + $info['md5_data_source'] = ''; + $md5 = $info['flac']['STREAMINFO']['audio_signature']; + for ($i = 0; $i < strlen($md5); $i++) { + $info['md5_data_source'] .= str_pad(dechex(ord($md5[$i])), 2, '00', STR_PAD_LEFT); + } + if (!preg_match('/^[0-9a-f]{32}$/', $info['md5_data_source'])) { + unset($info['md5_data_source']); + } + } + } + + if (isset($info['flac']['STREAMINFO']['bits_per_sample'])) { + $info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample']; + if ($info['audio']['bits_per_sample'] == 8) { + // special case + // must invert sign bit on all data bytes before MD5'ing to match FLAC's calculated value + // MD5sum calculates on unsigned bytes, but FLAC calculated MD5 on 8-bit audio data as signed + $this->warning('FLAC calculates MD5 data strangely on 8-bit audio, so the stored md5_data_source value will not match the decoded WAV file'); + } + } + + return true; + } + + + /** + * @param string $BlockData + * + * @return array + */ + public static function parseSTREAMINFOdata($BlockData) { + $streaminfo = array(); + $streaminfo['min_block_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 0, 2)); + $streaminfo['max_block_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 2, 2)); + $streaminfo['min_frame_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 4, 3)); + $streaminfo['max_frame_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 7, 3)); + + $SRCSBSS = getid3_lib::BigEndian2Bin(substr($BlockData, 10, 8)); + $streaminfo['sample_rate'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 0, 20)); + $streaminfo['channels'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 20, 3)) + 1; + $streaminfo['bits_per_sample'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 23, 5)) + 1; + $streaminfo['samples_stream'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 28, 36)); + + $streaminfo['audio_signature'] = substr($BlockData, 18, 16); + + return $streaminfo; + } + + /** + * @param string $BlockData + * + * @return bool + */ + private function parseSTREAMINFO($BlockData) { + $info = &$this->getid3->info; + + $info['flac']['STREAMINFO'] = self::parseSTREAMINFOdata($BlockData); + + if (!empty($info['flac']['STREAMINFO']['sample_rate'])) { + + $info['audio']['bitrate_mode'] = 'vbr'; + $info['audio']['sample_rate'] = $info['flac']['STREAMINFO']['sample_rate']; + $info['audio']['channels'] = $info['flac']['STREAMINFO']['channels']; + $info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample']; + $info['playtime_seconds'] = $info['flac']['STREAMINFO']['samples_stream'] / $info['flac']['STREAMINFO']['sample_rate']; + if ($info['playtime_seconds'] > 0) { + if (!$this->isDependencyFor('matroska')) { + $info['audio']['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; + } + else { + $this->warning('Cannot determine audio bitrate because total stream size is unknown'); + } + } + + } else { + return $this->error('Corrupt METAdata block: STREAMINFO'); + } + + return true; + } + + /** + * @param string $BlockData + * + * @return bool + */ + private function parseAPPLICATION($BlockData) { + $info = &$this->getid3->info; + + $ApplicationID = getid3_lib::BigEndian2Int(substr($BlockData, 0, 4)); + $info['flac']['APPLICATION'][$ApplicationID]['name'] = self::applicationIDLookup($ApplicationID); + $info['flac']['APPLICATION'][$ApplicationID]['data'] = substr($BlockData, 4); + + return true; + } + + /** + * @param string $BlockData + * + * @return bool + */ + private function parseSEEKTABLE($BlockData) { + $info = &$this->getid3->info; + + $offset = 0; + $BlockLength = strlen($BlockData); + $placeholderpattern = str_repeat("\xFF", 8); + while ($offset < $BlockLength) { + $SampleNumberString = substr($BlockData, $offset, 8); + $offset += 8; + if ($SampleNumberString == $placeholderpattern) { + + // placeholder point + getid3_lib::safe_inc($info['flac']['SEEKTABLE']['placeholders'], 1); + $offset += 10; + + } else { + + $SampleNumber = getid3_lib::BigEndian2Int($SampleNumberString); + $info['flac']['SEEKTABLE'][$SampleNumber]['offset'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); + $offset += 8; + $info['flac']['SEEKTABLE'][$SampleNumber]['samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 2)); + $offset += 2; + + } + } + + return true; + } + + /** + * @param string $BlockData + * + * @return bool + */ + private function parseVORBIS_COMMENT($BlockData) { + $info = &$this->getid3->info; + + $getid3_ogg = new getid3_ogg($this->getid3); + if ($this->isDependencyFor('matroska')) { + $getid3_ogg->setStringMode($this->data_string); + } + $getid3_ogg->ParseVorbisComments(); + if (isset($info['ogg'])) { + unset($info['ogg']['comments_raw']); + $info['flac']['VORBIS_COMMENT'] = $info['ogg']; + unset($info['ogg']); + } + + unset($getid3_ogg); + + return true; + } + + /** + * @param string $BlockData + * + * @return bool + */ + private function parseCUESHEET($BlockData) { + $info = &$this->getid3->info; + $offset = 0; + $info['flac']['CUESHEET']['media_catalog_number'] = trim(substr($BlockData, $offset, 128), "\0"); + $offset += 128; + $info['flac']['CUESHEET']['lead_in_samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); + $offset += 8; + $info['flac']['CUESHEET']['flags']['is_cd'] = (bool) (getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)) & 0x80); + $offset += 1; + + $offset += 258; // reserved + + $info['flac']['CUESHEET']['number_tracks'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); + $offset += 1; + + for ($track = 0; $track < $info['flac']['CUESHEET']['number_tracks']; $track++) { + $TrackSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); + $offset += 8; + $TrackNumber = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); + $offset += 1; + + $info['flac']['CUESHEET']['tracks'][$TrackNumber]['sample_offset'] = $TrackSampleOffset; + + $info['flac']['CUESHEET']['tracks'][$TrackNumber]['isrc'] = substr($BlockData, $offset, 12); + $offset += 12; + + $TrackFlagsRaw = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); + $offset += 1; + $info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['is_audio'] = (bool) ($TrackFlagsRaw & 0x80); + $info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['pre_emphasis'] = (bool) ($TrackFlagsRaw & 0x40); + + $offset += 13; // reserved + + $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); + $offset += 1; + + for ($index = 0; $index < $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']; $index++) { + $IndexSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); + $offset += 8; + $IndexNumber = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); + $offset += 1; + + $offset += 3; // reserved + + $info['flac']['CUESHEET']['tracks'][$TrackNumber]['indexes'][$IndexNumber] = $IndexSampleOffset; + } + } + + return true; + } + + /** + * Parse METADATA_BLOCK_PICTURE flac structure and extract attachment + * External usage: audio.ogg + * + * @return bool + */ + public function parsePICTURE() { + $info = &$this->getid3->info; + + $picture['typeid'] = getid3_lib::BigEndian2Int($this->fread(4)); + $picture['picturetype'] = self::pictureTypeLookup($picture['typeid']); + $picture['image_mime'] = $this->fread(getid3_lib::BigEndian2Int($this->fread(4))); + $descr_length = getid3_lib::BigEndian2Int($this->fread(4)); + if ($descr_length) { + $picture['description'] = $this->fread($descr_length); + } + $picture['image_width'] = getid3_lib::BigEndian2Int($this->fread(4)); + $picture['image_height'] = getid3_lib::BigEndian2Int($this->fread(4)); + $picture['color_depth'] = getid3_lib::BigEndian2Int($this->fread(4)); + $picture['colors_indexed'] = getid3_lib::BigEndian2Int($this->fread(4)); + $picture['datalength'] = getid3_lib::BigEndian2Int($this->fread(4)); + + if ($picture['image_mime'] == '-->') { + $picture['data'] = $this->fread($picture['datalength']); + } else { + $picture['data'] = $this->saveAttachment( + str_replace('/', '_', $picture['picturetype']).'_'.$this->ftell(), + $this->ftell(), + $picture['datalength'], + $picture['image_mime']); + } + + $info['flac']['PICTURE'][] = $picture; + + return true; + } + + /** + * @param int $blocktype + * + * @return string + */ + public static function metaBlockTypeLookup($blocktype) { + static $lookup = array( + 0 => 'STREAMINFO', + 1 => 'PADDING', + 2 => 'APPLICATION', + 3 => 'SEEKTABLE', + 4 => 'VORBIS_COMMENT', + 5 => 'CUESHEET', + 6 => 'PICTURE', + ); + return (isset($lookup[$blocktype]) ? $lookup[$blocktype] : 'reserved'); + } + + /** + * @param int $applicationid + * + * @return string + */ + public static function applicationIDLookup($applicationid) { + // http://flac.sourceforge.net/id.html + static $lookup = array( + 0x41544348 => 'FlacFile', // "ATCH" + 0x42534F4C => 'beSolo', // "BSOL" + 0x42554753 => 'Bugs Player', // "BUGS" + 0x43756573 => 'GoldWave cue points (specification)', // "Cues" + 0x46696361 => 'CUE Splitter', // "Fica" + 0x46746F6C => 'flac-tools', // "Ftol" + 0x4D4F5442 => 'MOTB MetaCzar', // "MOTB" + 0x4D505345 => 'MP3 Stream Editor', // "MPSE" + 0x4D754D4C => 'MusicML: Music Metadata Language', // "MuML" + 0x52494646 => 'Sound Devices RIFF chunk storage', // "RIFF" + 0x5346464C => 'Sound Font FLAC', // "SFFL" + 0x534F4E59 => 'Sony Creative Software', // "SONY" + 0x5351455A => 'flacsqueeze', // "SQEZ" + 0x54745776 => 'TwistedWave', // "TtWv" + 0x55495453 => 'UITS Embedding tools', // "UITS" + 0x61696666 => 'FLAC AIFF chunk storage', // "aiff" + 0x696D6167 => 'flac-image application for storing arbitrary files in APPLICATION metadata blocks', // "imag" + 0x7065656D => 'Parseable Embedded Extensible Metadata (specification)', // "peem" + 0x71667374 => 'QFLAC Studio', // "qfst" + 0x72696666 => 'FLAC RIFF chunk storage', // "riff" + 0x74756E65 => 'TagTuner', // "tune" + 0x78626174 => 'XBAT', // "xbat" + 0x786D6364 => 'xmcd', // "xmcd" + ); + return (isset($lookup[$applicationid]) ? $lookup[$applicationid] : 'reserved'); + } + + /** + * @param int $type_id + * + * @return string + */ + public static function pictureTypeLookup($type_id) { + static $lookup = array ( + 0 => 'Other', + 1 => '32x32 pixels \'file icon\' (PNG only)', + 2 => 'Other file icon', + 3 => 'Cover (front)', + 4 => 'Cover (back)', + 5 => 'Leaflet page', + 6 => 'Media (e.g. label side of CD)', + 7 => 'Lead artist/lead performer/soloist', + 8 => 'Artist/performer', + 9 => 'Conductor', + 10 => 'Band/Orchestra', + 11 => 'Composer', + 12 => 'Lyricist/text writer', + 13 => 'Recording Location', + 14 => 'During recording', + 15 => 'During performance', + 16 => 'Movie/video screen capture', + 17 => 'A bright coloured fish', + 18 => 'Illustration', + 19 => 'Band/artist logotype', + 20 => 'Publisher/Studio logotype', + ); + return (isset($lookup[$type_id]) ? $lookup[$type_id] : 'reserved'); + } + +} diff --git a/wp-includes/ID3/module.audio.mp3.php b/wp-includes/ID3/module.audio.mp3.php new file mode 100644 index 0000000..4bd75a0 --- /dev/null +++ b/wp-includes/ID3/module.audio.mp3.php @@ -0,0 +1,2150 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.mp3.php // +// module for analyzing MP3 files // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +// number of frames to scan to determine if MPEG-audio sequence is valid +// Lower this number to 5-20 for faster scanning +// Increase this number to 50+ for most accurate detection of valid VBR/CBR +// mpeg-audio streams +define('GETID3_MP3_VALID_CHECK_FRAMES', 35); + + +class getid3_mp3 extends getid3_handler +{ + /** + * Forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow, + * unrecommended, but may provide data from otherwise-unusable files. + * + * @var bool + */ + public $allow_bruteforce = false; + + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + $initialOffset = $info['avdataoffset']; + + if (!$this->getOnlyMPEGaudioInfo($info['avdataoffset'])) { + if ($this->allow_bruteforce) { + $this->error('Rescanning file in BruteForce mode'); + $this->getOnlyMPEGaudioInfoBruteForce(); + } + } + + + if (isset($info['mpeg']['audio']['bitrate_mode'])) { + $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); + } + + if (((isset($info['id3v2']['headerlength']) && ($info['avdataoffset'] > $info['id3v2']['headerlength'])) || (!isset($info['id3v2']) && ($info['avdataoffset'] > 0) && ($info['avdataoffset'] != $initialOffset)))) { + + $synchoffsetwarning = 'Unknown data before synch '; + if (isset($info['id3v2']['headerlength'])) { + $synchoffsetwarning .= '(ID3v2 header ends at '.$info['id3v2']['headerlength'].', then '.($info['avdataoffset'] - $info['id3v2']['headerlength']).' bytes garbage, '; + } elseif ($initialOffset > 0) { + $synchoffsetwarning .= '(should be at '.$initialOffset.', '; + } else { + $synchoffsetwarning .= '(should be at beginning of file, '; + } + $synchoffsetwarning .= 'synch detected at '.$info['avdataoffset'].')'; + if (isset($info['audio']['bitrate_mode']) && ($info['audio']['bitrate_mode'] == 'cbr')) { + + if (!empty($info['id3v2']['headerlength']) && (($info['avdataoffset'] - $info['id3v2']['headerlength']) == $info['mpeg']['audio']['framelength'])) { + + $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90-3.92) DLL in CBR mode.'; + $info['audio']['codec'] = 'LAME'; + $CurrentDataLAMEversionString = 'LAME3.'; + + } elseif (empty($info['id3v2']['headerlength']) && ($info['avdataoffset'] == $info['mpeg']['audio']['framelength'])) { + + $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90 - 3.92) DLL in CBR mode.'; + $info['audio']['codec'] = 'LAME'; + $CurrentDataLAMEversionString = 'LAME3.'; + + } + + } + $this->warning($synchoffsetwarning); + + } + + if (isset($info['mpeg']['audio']['LAME'])) { + $info['audio']['codec'] = 'LAME'; + if (!empty($info['mpeg']['audio']['LAME']['long_version'])) { + $info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['long_version'], "\x00"); + } elseif (!empty($info['mpeg']['audio']['LAME']['short_version'])) { + $info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['short_version'], "\x00"); + } + } + + $CurrentDataLAMEversionString = (!empty($CurrentDataLAMEversionString) ? $CurrentDataLAMEversionString : (isset($info['audio']['encoder']) ? $info['audio']['encoder'] : '')); + if (!empty($CurrentDataLAMEversionString) && (substr($CurrentDataLAMEversionString, 0, 6) == 'LAME3.') && !preg_match('[0-9\)]', substr($CurrentDataLAMEversionString, -1))) { + // a version number of LAME that does not end with a number like "LAME3.92" + // or with a closing parenthesis like "LAME3.88 (alpha)" + // or a version of LAME with the LAMEtag-not-filled-in-DLL-mode bug (3.90-3.92) + + // not sure what the actual last frame length will be, but will be less than or equal to 1441 + $PossiblyLongerLAMEversion_FrameLength = 1441; + + // Not sure what version of LAME this is - look in padding of last frame for longer version string + $PossibleLAMEversionStringOffset = $info['avdataend'] - $PossiblyLongerLAMEversion_FrameLength; + $this->fseek($PossibleLAMEversionStringOffset); + $PossiblyLongerLAMEversion_Data = $this->fread($PossiblyLongerLAMEversion_FrameLength); + switch (substr($CurrentDataLAMEversionString, -1)) { + case 'a': + case 'b': + // "LAME3.94a" will have a longer version string of "LAME3.94 (alpha)" for example + // need to trim off "a" to match longer string + $CurrentDataLAMEversionString = substr($CurrentDataLAMEversionString, 0, -1); + break; + } + if (($PossiblyLongerLAMEversion_String = strstr($PossiblyLongerLAMEversion_Data, $CurrentDataLAMEversionString)) !== false) { + if (substr($PossiblyLongerLAMEversion_String, 0, strlen($CurrentDataLAMEversionString)) == $CurrentDataLAMEversionString) { + $PossiblyLongerLAMEversion_NewString = substr($PossiblyLongerLAMEversion_String, 0, strspn($PossiblyLongerLAMEversion_String, 'LAME0123456789., (abcdefghijklmnopqrstuvwxyzJFSOND)')); //"LAME3.90.3" "LAME3.87 (beta 1, Sep 27 2000)" "LAME3.88 (beta)" + if (empty($info['audio']['encoder']) || (strlen($PossiblyLongerLAMEversion_NewString) > strlen($info['audio']['encoder']))) { + $info['audio']['encoder'] = $PossiblyLongerLAMEversion_NewString; + } + } + } + } + if (!empty($info['audio']['encoder'])) { + $info['audio']['encoder'] = rtrim($info['audio']['encoder'], "\x00 "); + } + + switch (isset($info['mpeg']['audio']['layer']) ? $info['mpeg']['audio']['layer'] : '') { + case 1: + case 2: + $info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer']; + break; + } + if (isset($info['fileformat']) && ($info['fileformat'] == 'mp3')) { + switch ($info['audio']['dataformat']) { + case 'mp1': + case 'mp2': + case 'mp3': + $info['fileformat'] = $info['audio']['dataformat']; + break; + + default: + $this->warning('Expecting [audio][dataformat] to be mp1/mp2/mp3 when fileformat == mp3, [audio][dataformat] actually "'.$info['audio']['dataformat'].'"'); + break; + } + } + + if (empty($info['fileformat'])) { + unset($info['fileformat']); + unset($info['audio']['bitrate_mode']); + unset($info['avdataoffset']); + unset($info['avdataend']); + return false; + } + + $info['mime_type'] = 'audio/mpeg'; + $info['audio']['lossless'] = false; + + // Calculate playtime + if (!isset($info['playtime_seconds']) && isset($info['audio']['bitrate']) && ($info['audio']['bitrate'] > 0)) { + // https://github.com/JamesHeinrich/getID3/issues/161 + // VBR header frame contains ~0.026s of silent audio data, but is not actually part of the original encoding and should be ignored + $xingVBRheaderFrameLength = ((isset($info['mpeg']['audio']['VBR_frames']) && isset($info['mpeg']['audio']['framelength'])) ? $info['mpeg']['audio']['framelength'] : 0); + + $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset'] - $xingVBRheaderFrameLength) * 8 / $info['audio']['bitrate']; + } + + $info['audio']['encoder_options'] = $this->GuessEncoderOptions(); + + return true; + } + + /** + * @return string + */ + public function GuessEncoderOptions() { + // shortcuts + $info = &$this->getid3->info; + $thisfile_mpeg_audio = array(); + $thisfile_mpeg_audio_lame = array(); + if (!empty($info['mpeg']['audio'])) { + $thisfile_mpeg_audio = &$info['mpeg']['audio']; + if (!empty($thisfile_mpeg_audio['LAME'])) { + $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; + } + } + + $encoder_options = ''; + static $NamedPresetBitrates = array(16, 24, 40, 56, 112, 128, 160, 192, 256); + + if (isset($thisfile_mpeg_audio['VBR_method']) && ($thisfile_mpeg_audio['VBR_method'] == 'Fraunhofer') && !empty($thisfile_mpeg_audio['VBR_quality'])) { + + $encoder_options = 'VBR q'.$thisfile_mpeg_audio['VBR_quality']; + + } elseif (!empty($thisfile_mpeg_audio_lame['preset_used']) && isset($thisfile_mpeg_audio_lame['preset_used_id']) && (!in_array($thisfile_mpeg_audio_lame['preset_used_id'], $NamedPresetBitrates))) { + + $encoder_options = $thisfile_mpeg_audio_lame['preset_used']; + + } elseif (!empty($thisfile_mpeg_audio_lame['vbr_quality'])) { + + static $KnownEncoderValues = array(); + if (empty($KnownEncoderValues)) { + + //$KnownEncoderValues[abrbitrate_minbitrate][vbr_quality][raw_vbr_method][raw_noise_shaping][raw_stereo_mode][ath_type][lowpass_frequency] = 'preset name'; + $KnownEncoderValues[0xFF][58][1][1][3][2][20500] = '--alt-preset insane'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues[0xFF][58][1][1][3][2][20600] = '--alt-preset insane'; // 3.90.2, 3.90.3, 3.91 + $KnownEncoderValues[0xFF][57][1][1][3][4][20500] = '--alt-preset insane'; // 3.94, 3.95 + $KnownEncoderValues['**'][78][3][2][3][2][19500] = '--alt-preset extreme'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues['**'][78][3][2][3][2][19600] = '--alt-preset extreme'; // 3.90.2, 3.91 + $KnownEncoderValues['**'][78][3][1][3][2][19600] = '--alt-preset extreme'; // 3.90.3 + $KnownEncoderValues['**'][78][4][2][3][2][19500] = '--alt-preset fast extreme'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues['**'][78][4][2][3][2][19600] = '--alt-preset fast extreme'; // 3.90.2, 3.90.3, 3.91 + $KnownEncoderValues['**'][78][3][2][3][4][19000] = '--alt-preset standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues['**'][78][3][1][3][4][19000] = '--alt-preset standard'; // 3.90.3 + $KnownEncoderValues['**'][78][4][2][3][4][19000] = '--alt-preset fast standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues['**'][78][4][1][3][4][19000] = '--alt-preset fast standard'; // 3.90.3 + $KnownEncoderValues['**'][88][4][1][3][3][19500] = '--r3mix'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues['**'][88][4][1][3][3][19600] = '--r3mix'; // 3.90.2, 3.90.3, 3.91 + $KnownEncoderValues['**'][67][4][1][3][4][18000] = '--r3mix'; // 3.94, 3.95 + $KnownEncoderValues['**'][68][3][2][3][4][18000] = '--alt-preset medium'; // 3.90.3 + $KnownEncoderValues['**'][68][4][2][3][4][18000] = '--alt-preset fast medium'; // 3.90.3 + + $KnownEncoderValues[0xFF][99][1][1][1][2][0] = '--preset studio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0xFF][58][2][1][3][2][20600] = '--preset studio'; // 3.90.3, 3.93.1 + $KnownEncoderValues[0xFF][58][2][1][3][2][20500] = '--preset studio'; // 3.93 + $KnownEncoderValues[0xFF][57][2][1][3][4][20500] = '--preset studio'; // 3.94, 3.95 + $KnownEncoderValues[0xC0][88][1][1][1][2][0] = '--preset cd'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0xC0][58][2][2][3][2][19600] = '--preset cd'; // 3.90.3, 3.93.1 + $KnownEncoderValues[0xC0][58][2][2][3][2][19500] = '--preset cd'; // 3.93 + $KnownEncoderValues[0xC0][57][2][1][3][4][19500] = '--preset cd'; // 3.94, 3.95 + $KnownEncoderValues[0xA0][78][1][1][3][2][18000] = '--preset hifi'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0xA0][58][2][2][3][2][18000] = '--preset hifi'; // 3.90.3, 3.93, 3.93.1 + $KnownEncoderValues[0xA0][57][2][1][3][4][18000] = '--preset hifi'; // 3.94, 3.95 + $KnownEncoderValues[0x80][67][1][1][3][2][18000] = '--preset tape'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0x80][67][1][1][3][2][15000] = '--preset radio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0x70][67][1][1][3][2][15000] = '--preset fm'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 + $KnownEncoderValues[0x70][58][2][2][3][2][16000] = '--preset tape/radio/fm'; // 3.90.3, 3.93, 3.93.1 + $KnownEncoderValues[0x70][57][2][1][3][4][16000] = '--preset tape/radio/fm'; // 3.94, 3.95 + $KnownEncoderValues[0x38][58][2][2][0][2][10000] = '--preset voice'; // 3.90.3, 3.93, 3.93.1 + $KnownEncoderValues[0x38][57][2][1][0][4][15000] = '--preset voice'; // 3.94, 3.95 + $KnownEncoderValues[0x38][57][2][1][0][4][16000] = '--preset voice'; // 3.94a14 + $KnownEncoderValues[0x28][65][1][1][0][2][7500] = '--preset mw-us'; // 3.90, 3.90.1, 3.92 + $KnownEncoderValues[0x28][65][1][1][0][2][7600] = '--preset mw-us'; // 3.90.2, 3.91 + $KnownEncoderValues[0x28][58][2][2][0][2][7000] = '--preset mw-us'; // 3.90.3, 3.93, 3.93.1 + $KnownEncoderValues[0x28][57][2][1][0][4][10500] = '--preset mw-us'; // 3.94, 3.95 + $KnownEncoderValues[0x28][57][2][1][0][4][11200] = '--preset mw-us'; // 3.94a14 + $KnownEncoderValues[0x28][57][2][1][0][4][8800] = '--preset mw-us'; // 3.94a15 + $KnownEncoderValues[0x18][58][2][2][0][2][4000] = '--preset phon+/lw/mw-eu/sw'; // 3.90.3, 3.93.1 + $KnownEncoderValues[0x18][58][2][2][0][2][3900] = '--preset phon+/lw/mw-eu/sw'; // 3.93 + $KnownEncoderValues[0x18][57][2][1][0][4][5900] = '--preset phon+/lw/mw-eu/sw'; // 3.94, 3.95 + $KnownEncoderValues[0x18][57][2][1][0][4][6200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a14 + $KnownEncoderValues[0x18][57][2][1][0][4][3200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a15 + $KnownEncoderValues[0x10][58][2][2][0][2][3800] = '--preset phone'; // 3.90.3, 3.93.1 + $KnownEncoderValues[0x10][58][2][2][0][2][3700] = '--preset phone'; // 3.93 + $KnownEncoderValues[0x10][57][2][1][0][4][5600] = '--preset phone'; // 3.94, 3.95 + } + + if (isset($KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { + + $encoder_options = $KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; + + } elseif (isset($KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { + + $encoder_options = $KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; + + } elseif ($info['audio']['bitrate_mode'] == 'vbr') { + + // http://gabriel.mp3-tech.org/mp3infotag.html + // int Quality = (100 - 10 * gfp->VBR_q - gfp->quality)h + + + $LAME_V_value = 10 - ceil($thisfile_mpeg_audio_lame['vbr_quality'] / 10); + $LAME_q_value = 100 - $thisfile_mpeg_audio_lame['vbr_quality'] - ($LAME_V_value * 10); + $encoder_options = '-V'.$LAME_V_value.' -q'.$LAME_q_value; + + } elseif ($info['audio']['bitrate_mode'] == 'cbr') { + + $encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); + + } else { + + $encoder_options = strtoupper($info['audio']['bitrate_mode']); + + } + + } elseif (!empty($thisfile_mpeg_audio_lame['bitrate_abr'])) { + + $encoder_options = 'ABR'.$thisfile_mpeg_audio_lame['bitrate_abr']; + + } elseif (!empty($info['audio']['bitrate'])) { + + if ($info['audio']['bitrate_mode'] == 'cbr') { + $encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); + } else { + $encoder_options = strtoupper($info['audio']['bitrate_mode']); + } + + } + if (!empty($thisfile_mpeg_audio_lame['bitrate_min'])) { + $encoder_options .= ' -b'.$thisfile_mpeg_audio_lame['bitrate_min']; + } + + if (!empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']) || !empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'])) { + $encoder_options .= ' --nogap'; + } + + if (!empty($thisfile_mpeg_audio_lame['lowpass_frequency'])) { + $ExplodedOptions = explode(' ', $encoder_options, 4); + if ($ExplodedOptions[0] == '--r3mix') { + $ExplodedOptions[1] = 'r3mix'; + } + switch ($ExplodedOptions[0]) { + case '--preset': + case '--alt-preset': + case '--r3mix': + if ($ExplodedOptions[1] == 'fast') { + $ExplodedOptions[1] .= ' '.$ExplodedOptions[2]; + } + switch ($ExplodedOptions[1]) { + case 'portable': + case 'medium': + case 'standard': + case 'extreme': + case 'insane': + case 'fast portable': + case 'fast medium': + case 'fast standard': + case 'fast extreme': + case 'fast insane': + case 'r3mix': + static $ExpectedLowpass = array( + 'insane|20500' => 20500, + 'insane|20600' => 20600, // 3.90.2, 3.90.3, 3.91 + 'medium|18000' => 18000, + 'fast medium|18000' => 18000, + 'extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 + 'extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 + 'fast extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 + 'fast extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 + 'standard|19000' => 19000, + 'fast standard|19000' => 19000, + 'r3mix|19500' => 19500, // 3.90, 3.90.1, 3.92 + 'r3mix|19600' => 19600, // 3.90.2, 3.90.3, 3.91 + 'r3mix|18000' => 18000, // 3.94, 3.95 + ); + if (!isset($ExpectedLowpass[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio_lame['lowpass_frequency']]) && ($thisfile_mpeg_audio_lame['lowpass_frequency'] < 22050) && (round($thisfile_mpeg_audio_lame['lowpass_frequency'] / 1000) < round($thisfile_mpeg_audio['sample_rate'] / 2000))) { + $encoder_options .= ' --lowpass '.$thisfile_mpeg_audio_lame['lowpass_frequency']; + } + break; + + default: + break; + } + break; + } + } + + if (isset($thisfile_mpeg_audio_lame['raw']['source_sample_freq'])) { + if (($thisfile_mpeg_audio['sample_rate'] == 44100) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 1)) { + $encoder_options .= ' --resample 44100'; + } elseif (($thisfile_mpeg_audio['sample_rate'] == 48000) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 2)) { + $encoder_options .= ' --resample 48000'; + } elseif ($thisfile_mpeg_audio['sample_rate'] < 44100) { + switch ($thisfile_mpeg_audio_lame['raw']['source_sample_freq']) { + case 0: // <= 32000 + // may or may not be same as source frequency - ignore + break; + case 1: // 44100 + case 2: // 48000 + case 3: // 48000+ + $ExplodedOptions = explode(' ', $encoder_options, 4); + switch ($ExplodedOptions[0]) { + case '--preset': + case '--alt-preset': + switch ($ExplodedOptions[1]) { + case 'fast': + case 'portable': + case 'medium': + case 'standard': + case 'extreme': + case 'insane': + $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; + break; + + default: + static $ExpectedResampledRate = array( + 'phon+/lw/mw-eu/sw|16000' => 16000, + 'mw-us|24000' => 24000, // 3.95 + 'mw-us|32000' => 32000, // 3.93 + 'mw-us|16000' => 16000, // 3.92 + 'phone|16000' => 16000, + 'phone|11025' => 11025, // 3.94a15 + 'radio|32000' => 32000, // 3.94a15 + 'fm/radio|32000' => 32000, // 3.92 + 'fm|32000' => 32000, // 3.90 + 'voice|32000' => 32000); + if (!isset($ExpectedResampledRate[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio['sample_rate']])) { + $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; + } + break; + } + break; + + case '--r3mix': + default: + $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; + break; + } + break; + } + } + } + if (empty($encoder_options) && !empty($info['audio']['bitrate']) && !empty($info['audio']['bitrate_mode'])) { + //$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); + $encoder_options = strtoupper($info['audio']['bitrate_mode']); + } + + return $encoder_options; + } + + /** + * @param int $offset + * @param array $info + * @param bool $recursivesearch + * @param bool $ScanAsCBR + * @param bool $FastMPEGheaderScan + * + * @return bool + */ + public function decodeMPEGaudioHeader($offset, &$info, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) { + static $MPEGaudioVersionLookup; + static $MPEGaudioLayerLookup; + static $MPEGaudioBitrateLookup; + static $MPEGaudioFrequencyLookup; + static $MPEGaudioChannelModeLookup; + static $MPEGaudioModeExtensionLookup; + static $MPEGaudioEmphasisLookup; + if (empty($MPEGaudioVersionLookup)) { + $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); + $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); + $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); + $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); + $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); + $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); + $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); + } + + if ($this->fseek($offset) != 0) { + $this->error('decodeMPEGaudioHeader() failed to seek to next offset at '.$offset); + return false; + } + //$headerstring = $this->fread(1441); // worst-case max length = 32kHz @ 320kbps layer 3 = 1441 bytes/frame + $headerstring = $this->fread(226); // LAME header at offset 36 + 190 bytes of Xing/LAME data + + // MP3 audio frame structure: + // $aa $aa $aa $aa [$bb $bb] $cc... + // where $aa..$aa is the four-byte mpeg-audio header (below) + // $bb $bb is the optional 2-byte CRC + // and $cc... is the audio data + + $head4 = substr($headerstring, 0, 4); + $head4_key = getid3_lib::PrintHexBytes($head4, true, false, false); + static $MPEGaudioHeaderDecodeCache = array(); + if (isset($MPEGaudioHeaderDecodeCache[$head4_key])) { + $MPEGheaderRawArray = $MPEGaudioHeaderDecodeCache[$head4_key]; + } else { + $MPEGheaderRawArray = self::MPEGaudioHeaderDecode($head4); + $MPEGaudioHeaderDecodeCache[$head4_key] = $MPEGheaderRawArray; + } + + static $MPEGaudioHeaderValidCache = array(); + if (!isset($MPEGaudioHeaderValidCache[$head4_key])) { // Not in cache + //$MPEGaudioHeaderValidCache[$head4_key] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, true); // allow badly-formatted freeformat (from LAME 3.90 - 3.93.1) + $MPEGaudioHeaderValidCache[$head4_key] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, false); + } + + // shortcut + if (!isset($info['mpeg']['audio'])) { + $info['mpeg']['audio'] = array(); + } + $thisfile_mpeg_audio = &$info['mpeg']['audio']; + + if ($MPEGaudioHeaderValidCache[$head4_key]) { + $thisfile_mpeg_audio['raw'] = $MPEGheaderRawArray; + } else { + $this->error('Invalid MPEG audio header ('.getid3_lib::PrintHexBytes($head4).') at offset '.$offset); + return false; + } + + if (!$FastMPEGheaderScan) { + $thisfile_mpeg_audio['version'] = $MPEGaudioVersionLookup[$thisfile_mpeg_audio['raw']['version']]; + $thisfile_mpeg_audio['layer'] = $MPEGaudioLayerLookup[$thisfile_mpeg_audio['raw']['layer']]; + + $thisfile_mpeg_audio['channelmode'] = $MPEGaudioChannelModeLookup[$thisfile_mpeg_audio['raw']['channelmode']]; + $thisfile_mpeg_audio['channels'] = (($thisfile_mpeg_audio['channelmode'] == 'mono') ? 1 : 2); + $thisfile_mpeg_audio['sample_rate'] = $MPEGaudioFrequencyLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['raw']['sample_rate']]; + $thisfile_mpeg_audio['protection'] = !$thisfile_mpeg_audio['raw']['protection']; + $thisfile_mpeg_audio['private'] = (bool) $thisfile_mpeg_audio['raw']['private']; + $thisfile_mpeg_audio['modeextension'] = $MPEGaudioModeExtensionLookup[$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['modeextension']]; + $thisfile_mpeg_audio['copyright'] = (bool) $thisfile_mpeg_audio['raw']['copyright']; + $thisfile_mpeg_audio['original'] = (bool) $thisfile_mpeg_audio['raw']['original']; + $thisfile_mpeg_audio['emphasis'] = $MPEGaudioEmphasisLookup[$thisfile_mpeg_audio['raw']['emphasis']]; + + $info['audio']['channels'] = $thisfile_mpeg_audio['channels']; + $info['audio']['sample_rate'] = $thisfile_mpeg_audio['sample_rate']; + + if ($thisfile_mpeg_audio['protection']) { + $thisfile_mpeg_audio['crc'] = getid3_lib::BigEndian2Int(substr($headerstring, 4, 2)); + } + } + + if ($thisfile_mpeg_audio['raw']['bitrate'] == 15) { + // http://www.hydrogenaudio.org/?act=ST&f=16&t=9682&st=0 + $this->warning('Invalid bitrate index (15), this is a known bug in free-format MP3s encoded by LAME v3.90 - 3.93.1'); + $thisfile_mpeg_audio['raw']['bitrate'] = 0; + } + $thisfile_mpeg_audio['padding'] = (bool) $thisfile_mpeg_audio['raw']['padding']; + $thisfile_mpeg_audio['bitrate'] = $MPEGaudioBitrateLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['bitrate']]; + + if (($thisfile_mpeg_audio['bitrate'] == 'free') && ($offset == $info['avdataoffset'])) { + // only skip multiple frame check if free-format bitstream found at beginning of file + // otherwise is quite possibly simply corrupted data + $recursivesearch = false; + } + + // For Layer 2 there are some combinations of bitrate and mode which are not allowed. + if (!$FastMPEGheaderScan && ($thisfile_mpeg_audio['layer'] == '2')) { + + $info['audio']['dataformat'] = 'mp2'; + switch ($thisfile_mpeg_audio['channelmode']) { + + case 'mono': + if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] <= 192000)) { + // these are ok + } else { + $this->error($thisfile_mpeg_audio['bitrate'].'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'); + return false; + } + break; + + case 'stereo': + case 'joint stereo': + case 'dual channel': + if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] == 64000) || ($thisfile_mpeg_audio['bitrate'] >= 96000)) { + // these are ok + } else { + $this->error(intval(round($thisfile_mpeg_audio['bitrate'] / 1000)).'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'); + return false; + } + break; + + } + + } + + + if ($info['audio']['sample_rate'] > 0) { + $thisfile_mpeg_audio['framelength'] = self::MPEGaudioFrameLength($thisfile_mpeg_audio['bitrate'], $thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['layer'], (int) $thisfile_mpeg_audio['padding'], $info['audio']['sample_rate']); + } + + $nextframetestoffset = $offset + 1; + if ($thisfile_mpeg_audio['bitrate'] != 'free') { + + $info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; + + if (isset($thisfile_mpeg_audio['framelength'])) { + $nextframetestoffset = $offset + $thisfile_mpeg_audio['framelength']; + } else { + $this->error('Frame at offset('.$offset.') is has an invalid frame length.'); + return false; + } + + } + + $ExpectedNumberOfAudioBytes = 0; + + //////////////////////////////////////////////////////////////////////////////////// + // Variable-bitrate headers + + if (substr($headerstring, 4 + 32, 4) == 'VBRI') { + // Fraunhofer VBR header is hardcoded 'VBRI' at offset 0x24 (36) + // specs taken from http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html + + $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; + $thisfile_mpeg_audio['VBR_method'] = 'Fraunhofer'; + $info['audio']['codec'] = 'Fraunhofer'; + + $SideInfoData = substr($headerstring, 4 + 2, 32); + + $FraunhoferVBROffset = 36; + + $thisfile_mpeg_audio['VBR_encoder_version'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 4, 2)); // VbriVersion + $thisfile_mpeg_audio['VBR_encoder_delay'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 6, 2)); // VbriDelay + $thisfile_mpeg_audio['VBR_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 8, 2)); // VbriQuality + $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 10, 4)); // VbriStreamBytes + $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 14, 4)); // VbriStreamFrames + $thisfile_mpeg_audio['VBR_seek_offsets'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 18, 2)); // VbriTableSize + $thisfile_mpeg_audio['VBR_seek_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 20, 2)); // VbriTableScale + $thisfile_mpeg_audio['VBR_entry_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 22, 2)); // VbriEntryBytes + $thisfile_mpeg_audio['VBR_entry_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 24, 2)); // VbriEntryFrames + + $ExpectedNumberOfAudioBytes = $thisfile_mpeg_audio['VBR_bytes']; + + $previousbyteoffset = $offset; + for ($i = 0; $i < $thisfile_mpeg_audio['VBR_seek_offsets']; $i++) { + $Fraunhofer_OffsetN = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset, $thisfile_mpeg_audio['VBR_entry_bytes'])); + $FraunhoferVBROffset += $thisfile_mpeg_audio['VBR_entry_bytes']; + $thisfile_mpeg_audio['VBR_offsets_relative'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']); + $thisfile_mpeg_audio['VBR_offsets_absolute'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']) + $previousbyteoffset; + $previousbyteoffset += $Fraunhofer_OffsetN; + } + + + } else { + + // Xing VBR header is hardcoded 'Xing' at a offset 0x0D (13), 0x15 (21) or 0x24 (36) + // depending on MPEG layer and number of channels + + $VBRidOffset = self::XingVBRidOffset($thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['channelmode']); + $SideInfoData = substr($headerstring, 4 + 2, $VBRidOffset - 4); + + if ((substr($headerstring, $VBRidOffset, strlen('Xing')) == 'Xing') || (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Info')) { + // 'Xing' is traditional Xing VBR frame + // 'Info' is LAME-encoded CBR (This was done to avoid CBR files to be recognized as traditional Xing VBR files by some decoders.) + // 'Info' *can* legally be used to specify a VBR file as well, however. + + // http://www.multiweb.cz/twoinches/MP3inside.htm + //00..03 = "Xing" or "Info" + //04..07 = Flags: + // 0x01 Frames Flag set if value for number of frames in file is stored + // 0x02 Bytes Flag set if value for filesize in bytes is stored + // 0x04 TOC Flag set if values for TOC are stored + // 0x08 VBR Scale Flag set if values for VBR scale is stored + //08..11 Frames: Number of frames in file (including the first Xing/Info one) + //12..15 Bytes: File length in Bytes + //16..115 TOC (Table of Contents): + // Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately solves problem with moving inside file. + // Each Byte has a value according this formula: + // (TOC[i] / 256) * fileLenInBytes + // So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000 000 Bytes length) you can use: + // TOC[(60/240)*100] = TOC[25] + // and corresponding Byte in file is then approximately at: + // (TOC[25]/256) * 5000000 + //116..119 VBR Scale + + + // should be safe to leave this at 'vbr' and let it be overriden to 'cbr' if a CBR preset/mode is used by LAME +// if (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Xing') { + $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; + $thisfile_mpeg_audio['VBR_method'] = 'Xing'; +// } else { +// $ScanAsCBR = true; +// $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; +// } + + $thisfile_mpeg_audio['xing_flags_raw'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 4, 4)); + + $thisfile_mpeg_audio['xing_flags']['frames'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000001); + $thisfile_mpeg_audio['xing_flags']['bytes'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000002); + $thisfile_mpeg_audio['xing_flags']['toc'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000004); + $thisfile_mpeg_audio['xing_flags']['vbr_scale'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000008); + + if ($thisfile_mpeg_audio['xing_flags']['frames']) { + $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 8, 4)); + //$thisfile_mpeg_audio['VBR_frames']--; // don't count header Xing/Info frame + } + if ($thisfile_mpeg_audio['xing_flags']['bytes']) { + $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 12, 4)); + } + + //if (($thisfile_mpeg_audio['bitrate'] == 'free') && !empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { + //if (!empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { + if (!empty($thisfile_mpeg_audio['VBR_frames'])) { + $used_filesize = 0; + if (!empty($thisfile_mpeg_audio['VBR_bytes'])) { + $used_filesize = $thisfile_mpeg_audio['VBR_bytes']; + } elseif (!empty($info['filesize'])) { + $used_filesize = $info['filesize']; + $used_filesize -= (isset($info['id3v2']['headerlength']) ? intval($info['id3v2']['headerlength']) : 0); + $used_filesize -= (isset($info['id3v1']) ? 128 : 0); + $used_filesize -= (isset($info['tag_offset_end']) ? $info['tag_offset_end'] - $info['tag_offset_start'] : 0); + $this->warning('MP3.Xing header missing VBR_bytes, assuming MPEG audio portion of file is '.number_format($used_filesize).' bytes'); + } + + $framelengthfloat = $used_filesize / $thisfile_mpeg_audio['VBR_frames']; + + if ($thisfile_mpeg_audio['layer'] == '1') { + // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 + //$info['audio']['bitrate'] = ((($framelengthfloat / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; + $info['audio']['bitrate'] = ($framelengthfloat / 4) * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 12; + } else { + // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 + //$info['audio']['bitrate'] = (($framelengthfloat - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; + $info['audio']['bitrate'] = $framelengthfloat * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 144; + } + $thisfile_mpeg_audio['framelength'] = floor($framelengthfloat); + } + + if ($thisfile_mpeg_audio['xing_flags']['toc']) { + $LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100); + for ($i = 0; $i < 100; $i++) { + $thisfile_mpeg_audio['toc'][$i] = ord($LAMEtocData[$i]); + } + } + if ($thisfile_mpeg_audio['xing_flags']['vbr_scale']) { + $thisfile_mpeg_audio['VBR_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 116, 4)); + } + + + // http://gabriel.mp3-tech.org/mp3infotag.html + if (substr($headerstring, $VBRidOffset + 120, 4) == 'LAME') { + + // shortcut + $thisfile_mpeg_audio['LAME'] = array(); + $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; + + + $thisfile_mpeg_audio_lame['long_version'] = substr($headerstring, $VBRidOffset + 120, 20); + $thisfile_mpeg_audio_lame['short_version'] = substr($thisfile_mpeg_audio_lame['long_version'], 0, 9); + + if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.90') { + + // extra 11 chars are not part of version string when LAMEtag present + unset($thisfile_mpeg_audio_lame['long_version']); + + // It the LAME tag was only introduced in LAME v3.90 + // http://www.hydrogenaudio.org/?act=ST&f=15&t=9933 + + // Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html + // are assuming a 'Xing' identifier offset of 0x24, which is the case for + // MPEG-1 non-mono, but not for other combinations + $LAMEtagOffsetContant = $VBRidOffset - 0x24; + + // shortcuts + $thisfile_mpeg_audio_lame['RGAD'] = array('track'=>array(), 'album'=>array()); + $thisfile_mpeg_audio_lame_RGAD = &$thisfile_mpeg_audio_lame['RGAD']; + $thisfile_mpeg_audio_lame_RGAD_track = &$thisfile_mpeg_audio_lame_RGAD['track']; + $thisfile_mpeg_audio_lame_RGAD_album = &$thisfile_mpeg_audio_lame_RGAD['album']; + $thisfile_mpeg_audio_lame['raw'] = array(); + $thisfile_mpeg_audio_lame_raw = &$thisfile_mpeg_audio_lame['raw']; + + // byte $9B VBR Quality + // This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications. + // Actually overwrites original Xing bytes + unset($thisfile_mpeg_audio['VBR_scale']); + $thisfile_mpeg_audio_lame['vbr_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1)); + + // bytes $9C-$A4 Encoder short VersionString + $thisfile_mpeg_audio_lame['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9); + + // byte $A5 Info Tag revision + VBR method + $LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1)); + + $thisfile_mpeg_audio_lame['tag_revision'] = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4; + $thisfile_mpeg_audio_lame_raw['vbr_method'] = $LAMEtagRevisionVBRmethod & 0x0F; + $thisfile_mpeg_audio_lame['vbr_method'] = self::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']); + $thisfile_mpeg_audio['bitrate_mode'] = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr' + + // byte $A6 Lowpass filter value + $thisfile_mpeg_audio_lame['lowpass_frequency'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100; + + // bytes $A7-$AE Replay Gain + // http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html + // bytes $A7-$AA : 32 bit floating point "Peak signal amplitude" + if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.94b') { + // LAME 3.94a16 and later - 9.23 fixed point + // ie 0x0059E2EE / (2^23) = 5890798 / 8388608 = 0.7022378444671630859375 + $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = (float) ((getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4))) / 8388608); + } else { + // LAME 3.94a15 and earlier - 32-bit floating point + // Actually 3.94a16 will fall in here too and be WRONG, but is hard to detect 3.94a16 vs 3.94a15 + $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = getid3_lib::LittleEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4)); + } + if ($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] == 0) { + unset($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); + } else { + $thisfile_mpeg_audio_lame_RGAD['peak_db'] = getid3_lib::RGADamplitude2dB($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); + } + + $thisfile_mpeg_audio_lame_raw['RGAD_track'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2)); + $thisfile_mpeg_audio_lame_raw['RGAD_album'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2)); + + + if ($thisfile_mpeg_audio_lame_raw['RGAD_track'] != 0) { + + $thisfile_mpeg_audio_lame_RGAD_track['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0xE000) >> 13; + $thisfile_mpeg_audio_lame_RGAD_track['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x1C00) >> 10; + $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x0200) >> 9; + $thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x01FF; + $thisfile_mpeg_audio_lame_RGAD_track['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['name']); + $thisfile_mpeg_audio_lame_RGAD_track['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']); + $thisfile_mpeg_audio_lame_RGAD_track['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']); + + if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { + $info['replay_gain']['track']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; + } + $info['replay_gain']['track']['originator'] = $thisfile_mpeg_audio_lame_RGAD_track['originator']; + $info['replay_gain']['track']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_track['gain_db']; + } else { + unset($thisfile_mpeg_audio_lame_RGAD['track']); + } + if ($thisfile_mpeg_audio_lame_raw['RGAD_album'] != 0) { + + $thisfile_mpeg_audio_lame_RGAD_album['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0xE000) >> 13; + $thisfile_mpeg_audio_lame_RGAD_album['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x1C00) >> 10; + $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x0200) >> 9; + $thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x01FF; + $thisfile_mpeg_audio_lame_RGAD_album['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['name']); + $thisfile_mpeg_audio_lame_RGAD_album['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']); + $thisfile_mpeg_audio_lame_RGAD_album['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']); + + if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { + $info['replay_gain']['album']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; + } + $info['replay_gain']['album']['originator'] = $thisfile_mpeg_audio_lame_RGAD_album['originator']; + $info['replay_gain']['album']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_album['gain_db']; + } else { + unset($thisfile_mpeg_audio_lame_RGAD['album']); + } + if (empty($thisfile_mpeg_audio_lame_RGAD)) { + unset($thisfile_mpeg_audio_lame['RGAD']); + } + + + // byte $AF Encoding flags + ATH Type + $EncodingFlagsATHtype = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1)); + $thisfile_mpeg_audio_lame['encoding_flags']['nspsytune'] = (bool) ($EncodingFlagsATHtype & 0x10); + $thisfile_mpeg_audio_lame['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20); + $thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'] = (bool) ($EncodingFlagsATHtype & 0x40); + $thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev'] = (bool) ($EncodingFlagsATHtype & 0x80); + $thisfile_mpeg_audio_lame['ath_type'] = $EncodingFlagsATHtype & 0x0F; + + // byte $B0 if ABR {specified bitrate} else {minimal bitrate} + $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1)); + if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 2) { // Average BitRate (ABR) + $thisfile_mpeg_audio_lame['bitrate_abr'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; + } elseif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { // Constant BitRate (CBR) + // ignore + } elseif ($thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] > 0) { // Variable BitRate (VBR) - minimum bitrate + $thisfile_mpeg_audio_lame['bitrate_min'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; + } + + // bytes $B1-$B3 Encoder delays + $EncoderDelays = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3)); + $thisfile_mpeg_audio_lame['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12; + $thisfile_mpeg_audio_lame['end_padding'] = $EncoderDelays & 0x000FFF; + + // byte $B4 Misc + $MiscByte = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1)); + $thisfile_mpeg_audio_lame_raw['noise_shaping'] = ($MiscByte & 0x03); + $thisfile_mpeg_audio_lame_raw['stereo_mode'] = ($MiscByte & 0x1C) >> 2; + $thisfile_mpeg_audio_lame_raw['not_optimal_quality'] = ($MiscByte & 0x20) >> 5; + $thisfile_mpeg_audio_lame_raw['source_sample_freq'] = ($MiscByte & 0xC0) >> 6; + $thisfile_mpeg_audio_lame['noise_shaping'] = $thisfile_mpeg_audio_lame_raw['noise_shaping']; + $thisfile_mpeg_audio_lame['stereo_mode'] = self::LAMEmiscStereoModeLookup($thisfile_mpeg_audio_lame_raw['stereo_mode']); + $thisfile_mpeg_audio_lame['not_optimal_quality'] = (bool) $thisfile_mpeg_audio_lame_raw['not_optimal_quality']; + $thisfile_mpeg_audio_lame['source_sample_freq'] = self::LAMEmiscSourceSampleFrequencyLookup($thisfile_mpeg_audio_lame_raw['source_sample_freq']); + + // byte $B5 MP3 Gain + $thisfile_mpeg_audio_lame_raw['mp3_gain'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true); + $thisfile_mpeg_audio_lame['mp3_gain_db'] = (getid3_lib::RGADamplitude2dB(2) / 4) * $thisfile_mpeg_audio_lame_raw['mp3_gain']; + $thisfile_mpeg_audio_lame['mp3_gain_factor'] = pow(2, ($thisfile_mpeg_audio_lame['mp3_gain_db'] / 6)); + + // bytes $B6-$B7 Preset and surround info + $PresetSurroundBytes = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2)); + // Reserved = ($PresetSurroundBytes & 0xC000); + $thisfile_mpeg_audio_lame_raw['surround_info'] = ($PresetSurroundBytes & 0x3800); + $thisfile_mpeg_audio_lame['surround_info'] = self::LAMEsurroundInfoLookup($thisfile_mpeg_audio_lame_raw['surround_info']); + $thisfile_mpeg_audio_lame['preset_used_id'] = ($PresetSurroundBytes & 0x07FF); + $thisfile_mpeg_audio_lame['preset_used'] = self::LAMEpresetUsedLookup($thisfile_mpeg_audio_lame); + if (!empty($thisfile_mpeg_audio_lame['preset_used_id']) && empty($thisfile_mpeg_audio_lame['preset_used'])) { + $this->warning('Unknown LAME preset used ('.$thisfile_mpeg_audio_lame['preset_used_id'].') - please report to info@getid3.org'); + } + if (($thisfile_mpeg_audio_lame['short_version'] == 'LAME3.90.') && !empty($thisfile_mpeg_audio_lame['preset_used_id'])) { + // this may change if 3.90.4 ever comes out + $thisfile_mpeg_audio_lame['short_version'] = 'LAME3.90.3'; + } + + // bytes $B8-$BB MusicLength + $thisfile_mpeg_audio_lame['audio_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4)); + $ExpectedNumberOfAudioBytes = (($thisfile_mpeg_audio_lame['audio_bytes'] > 0) ? $thisfile_mpeg_audio_lame['audio_bytes'] : $thisfile_mpeg_audio['VBR_bytes']); + + // bytes $BC-$BD MusicCRC + $thisfile_mpeg_audio_lame['music_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2)); + + // bytes $BE-$BF CRC-16 of Info Tag + $thisfile_mpeg_audio_lame['lame_tag_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2)); + + + // LAME CBR + if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { + + $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; + $thisfile_mpeg_audio['bitrate'] = self::ClosestStandardMP3Bitrate($thisfile_mpeg_audio['bitrate']); + $info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; + //if (empty($thisfile_mpeg_audio['bitrate']) || (!empty($thisfile_mpeg_audio_lame['bitrate_min']) && ($thisfile_mpeg_audio_lame['bitrate_min'] != 255))) { + // $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio_lame['bitrate_min']; + //} + + } + + } + } + + } else { + + // not Fraunhofer or Xing VBR methods, most likely CBR (but could be VBR with no header) + $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; + if ($recursivesearch) { + $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; + if ($this->RecursiveFrameScanning($offset, $nextframetestoffset, true)) { + $recursivesearch = false; + $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; + } + if ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') { + $this->warning('VBR file with no VBR header. Bitrate values calculated from actual frame bitrates.'); + } + } + + } + + } + + if (($ExpectedNumberOfAudioBytes > 0) && ($ExpectedNumberOfAudioBytes != ($info['avdataend'] - $info['avdataoffset']))) { + if ($ExpectedNumberOfAudioBytes > ($info['avdataend'] - $info['avdataoffset'])) { + if ($this->isDependencyFor('matroska') || $this->isDependencyFor('riff')) { + // ignore, audio data is broken into chunks so will always be data "missing" + } + elseif (($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])) == 1) { + $this->warning('Last byte of data truncated (this is a known bug in Meracl ID3 Tag Writer before v1.3.5)'); + } + else { + $this->warning('Probable truncated file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, only found '.($info['avdataend'] - $info['avdataoffset']).' (short by '.($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])).' bytes)'); + } + } else { + if ((($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes) == 1) { + // $prenullbytefileoffset = $this->ftell(); + // $this->fseek($info['avdataend']); + // $PossibleNullByte = $this->fread(1); + // $this->fseek($prenullbytefileoffset); + // if ($PossibleNullByte === "\x00") { + $info['avdataend']--; + // $this->warning('Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'); + // } else { + // $this->warning('Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'); + // } + } else { + $this->warning('Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'); + } + } + } + + if (($thisfile_mpeg_audio['bitrate'] == 'free') && empty($info['audio']['bitrate'])) { + if (($offset == $info['avdataoffset']) && empty($thisfile_mpeg_audio['VBR_frames'])) { + $framebytelength = $this->FreeFormatFrameLength($offset, true); + if ($framebytelength > 0) { + $thisfile_mpeg_audio['framelength'] = $framebytelength; + if ($thisfile_mpeg_audio['layer'] == '1') { + // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 + $info['audio']['bitrate'] = ((($framebytelength / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; + } else { + // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 + $info['audio']['bitrate'] = (($framebytelength - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; + } + } else { + $this->error('Error calculating frame length of free-format MP3 without Xing/LAME header'); + } + } + } + + if (isset($thisfile_mpeg_audio['VBR_frames']) ? $thisfile_mpeg_audio['VBR_frames'] : '') { + switch ($thisfile_mpeg_audio['bitrate_mode']) { + case 'vbr': + case 'abr': + $bytes_per_frame = 1152; + if (($thisfile_mpeg_audio['version'] == '1') && ($thisfile_mpeg_audio['layer'] == 1)) { + $bytes_per_frame = 384; + } elseif ((($thisfile_mpeg_audio['version'] == '2') || ($thisfile_mpeg_audio['version'] == '2.5')) && ($thisfile_mpeg_audio['layer'] == 3)) { + $bytes_per_frame = 576; + } + $thisfile_mpeg_audio['VBR_bitrate'] = (isset($thisfile_mpeg_audio['VBR_bytes']) ? (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($info['audio']['sample_rate'] / $bytes_per_frame) : 0); + if ($thisfile_mpeg_audio['VBR_bitrate'] > 0) { + $info['audio']['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; + $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; // to avoid confusion + } + break; + } + } + + // End variable-bitrate headers + //////////////////////////////////////////////////////////////////////////////////// + + if ($recursivesearch) { + + if (!$this->RecursiveFrameScanning($offset, $nextframetestoffset, $ScanAsCBR)) { + return false; + } + + } + + + //if (false) { + // // experimental side info parsing section - not returning anything useful yet + // + // $SideInfoBitstream = getid3_lib::BigEndian2Bin($SideInfoData); + // $SideInfoOffset = 0; + // + // if ($thisfile_mpeg_audio['version'] == '1') { + // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { + // // MPEG-1 (mono) + // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); + // $SideInfoOffset += 9; + // $SideInfoOffset += 5; + // } else { + // // MPEG-1 (stereo, joint-stereo, dual-channel) + // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); + // $SideInfoOffset += 9; + // $SideInfoOffset += 3; + // } + // } else { // 2 or 2.5 + // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { + // // MPEG-2, MPEG-2.5 (mono) + // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); + // $SideInfoOffset += 8; + // $SideInfoOffset += 1; + // } else { + // // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel) + // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); + // $SideInfoOffset += 8; + // $SideInfoOffset += 2; + // } + // } + // + // if ($thisfile_mpeg_audio['version'] == '1') { + // for ($channel = 0; $channel < $info['audio']['channels']; $channel++) { + // for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) { + // $thisfile_mpeg_audio['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 2; + // } + // } + // } + // for ($granule = 0; $granule < (($thisfile_mpeg_audio['version'] == '1') ? 2 : 1); $granule++) { + // for ($channel = 0; $channel < $info['audio']['channels']; $channel++) { + // $thisfile_mpeg_audio['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12); + // $SideInfoOffset += 12; + // $thisfile_mpeg_audio['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); + // $SideInfoOffset += 9; + // $thisfile_mpeg_audio['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8); + // $SideInfoOffset += 8; + // if ($thisfile_mpeg_audio['version'] == '1') { + // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); + // $SideInfoOffset += 4; + // } else { + // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); + // $SideInfoOffset += 9; + // } + // $thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // + // if ($thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] == '1') { + // + // $thisfile_mpeg_audio['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2); + // $SideInfoOffset += 2; + // $thisfile_mpeg_audio['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // + // for ($region = 0; $region < 2; $region++) { + // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); + // $SideInfoOffset += 5; + // } + // $thisfile_mpeg_audio['table_select'][$granule][$channel][2] = 0; + // + // for ($window = 0; $window < 3; $window++) { + // $thisfile_mpeg_audio['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3); + // $SideInfoOffset += 3; + // } + // + // } else { + // + // for ($region = 0; $region < 3; $region++) { + // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); + // $SideInfoOffset += 5; + // } + // + // $thisfile_mpeg_audio['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); + // $SideInfoOffset += 4; + // $thisfile_mpeg_audio['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3); + // $SideInfoOffset += 3; + // $thisfile_mpeg_audio['block_type'][$granule][$channel] = 0; + // } + // + // if ($thisfile_mpeg_audio['version'] == '1') { + // $thisfile_mpeg_audio['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // } + // $thisfile_mpeg_audio['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // $thisfile_mpeg_audio['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); + // $SideInfoOffset += 1; + // } + // } + //} + + return true; + } + + /** + * @param int $offset + * @param int $nextframetestoffset + * @param bool $ScanAsCBR + * + * @return bool + */ + public function RecursiveFrameScanning(&$offset, &$nextframetestoffset, $ScanAsCBR) { + $info = &$this->getid3->info; + $firstframetestarray = array('error' => array(), 'warning'=> array(), 'avdataend' => $info['avdataend'], 'avdataoffset' => $info['avdataoffset']); + $this->decodeMPEGaudioHeader($offset, $firstframetestarray, false); + + for ($i = 0; $i < GETID3_MP3_VALID_CHECK_FRAMES; $i++) { + // check next GETID3_MP3_VALID_CHECK_FRAMES frames for validity, to make sure we haven't run across a false synch + if (($nextframetestoffset + 4) >= $info['avdataend']) { + // end of file + return true; + } + + $nextframetestarray = array('error' => array(), 'warning' => array(), 'avdataend' => $info['avdataend'], 'avdataoffset'=>$info['avdataoffset']); + if ($this->decodeMPEGaudioHeader($nextframetestoffset, $nextframetestarray, false)) { + if ($ScanAsCBR) { + // force CBR mode, used for trying to pick out invalid audio streams with valid(?) VBR headers, or VBR streams with no VBR header + if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($firstframetestarray['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $firstframetestarray['mpeg']['audio']['bitrate'])) { + return false; + } + } + + + // next frame is OK, get ready to check the one after that + if (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) { + $nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength']; + } else { + $this->error('Frame at offset ('.$offset.') is has an invalid frame length.'); + return false; + } + + } elseif (!empty($firstframetestarray['mpeg']['audio']['framelength']) && (($nextframetestoffset + $firstframetestarray['mpeg']['audio']['framelength']) > $info['avdataend'])) { + + // it's not the end of the file, but there's not enough data left for another frame, so assume it's garbage/padding and return OK + return true; + + } else { + + // next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence + $this->warning('Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.'); + + return false; + } + } + return true; + } + + /** + * @param int $offset + * @param bool $deepscan + * + * @return int|false + */ + public function FreeFormatFrameLength($offset, $deepscan=false) { + $info = &$this->getid3->info; + + $this->fseek($offset); + $MPEGaudioData = $this->fread(32768); + + $SyncPattern1 = substr($MPEGaudioData, 0, 4); + // may be different pattern due to padding + $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) | 0x02).$SyncPattern1[3]; + if ($SyncPattern2 === $SyncPattern1) { + $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) & 0xFD).$SyncPattern1[3]; + } + + $framelength = false; + $framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4); + $framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4); + if ($framelength1 > 4) { + $framelength = $framelength1; + } + if (($framelength2 > 4) && ($framelength2 < $framelength1)) { + $framelength = $framelength2; + } + if (!$framelength) { + + // LAME 3.88 has a different value for modeextension on the first frame vs the rest + $framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4); + $framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4); + + if ($framelength1 > 4) { + $framelength = $framelength1; + } + if (($framelength2 > 4) && ($framelength2 < $framelength1)) { + $framelength = $framelength2; + } + if (!$framelength) { + $this->error('Cannot find next free-format synch pattern ('.getid3_lib::PrintHexBytes($SyncPattern1).' or '.getid3_lib::PrintHexBytes($SyncPattern2).') after offset '.$offset); + return false; + } else { + $this->warning('ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)'); + $info['audio']['codec'] = 'LAME'; + $info['audio']['encoder'] = 'LAME3.88'; + $SyncPattern1 = substr($SyncPattern1, 0, 3); + $SyncPattern2 = substr($SyncPattern2, 0, 3); + } + } + + if ($deepscan) { + + $ActualFrameLengthValues = array(); + $nextoffset = $offset + $framelength; + while ($nextoffset < ($info['avdataend'] - 6)) { + $this->fseek($nextoffset - 1); + $NextSyncPattern = $this->fread(6); + if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) { + // good - found where expected + $ActualFrameLengthValues[] = $framelength; + } elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) { + // ok - found one byte earlier than expected (last frame wasn't padded, first frame was) + $ActualFrameLengthValues[] = ($framelength - 1); + $nextoffset--; + } elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) { + // ok - found one byte later than expected (last frame was padded, first frame wasn't) + $ActualFrameLengthValues[] = ($framelength + 1); + $nextoffset++; + } else { + $this->error('Did not find expected free-format sync pattern at offset '.$nextoffset); + return false; + } + $nextoffset += $framelength; + } + if (count($ActualFrameLengthValues) > 0) { + $framelength = intval(round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues))); + } + } + return $framelength; + } + + /** + * @return bool + */ + public function getOnlyMPEGaudioInfoBruteForce() { + $MPEGaudioHeaderDecodeCache = array(); + $MPEGaudioHeaderValidCache = array(); + $MPEGaudioHeaderLengthCache = array(); + $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); + $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); + $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); + $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); + $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); + $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); + $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); + $LongMPEGversionLookup = array(); + $LongMPEGlayerLookup = array(); + $LongMPEGbitrateLookup = array(); + $LongMPEGpaddingLookup = array(); + $LongMPEGfrequencyLookup = array(); + $Distribution['bitrate'] = array(); + $Distribution['frequency'] = array(); + $Distribution['layer'] = array(); + $Distribution['version'] = array(); + $Distribution['padding'] = array(); + + $info = &$this->getid3->info; + $this->fseek($info['avdataoffset']); + + $max_frames_scan = 5000; + $frames_scanned = 0; + + $previousvalidframe = $info['avdataoffset']; + while ($this->ftell() < $info['avdataend']) { + set_time_limit(30); + $head4 = $this->fread(4); + if (strlen($head4) < 4) { + break; + } + if ($head4[0] != "\xFF") { + for ($i = 1; $i < 4; $i++) { + if ($head4[$i] == "\xFF") { + $this->fseek($i - 4, SEEK_CUR); + continue 2; + } + } + continue; + } + if (!isset($MPEGaudioHeaderDecodeCache[$head4])) { + $MPEGaudioHeaderDecodeCache[$head4] = self::MPEGaudioHeaderDecode($head4); + } + if (!isset($MPEGaudioHeaderValidCache[$head4])) { + $MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$head4], false, false); + } + if ($MPEGaudioHeaderValidCache[$head4]) { + + if (!isset($MPEGaudioHeaderLengthCache[$head4])) { + $LongMPEGversionLookup[$head4] = $MPEGaudioVersionLookup[$MPEGaudioHeaderDecodeCache[$head4]['version']]; + $LongMPEGlayerLookup[$head4] = $MPEGaudioLayerLookup[$MPEGaudioHeaderDecodeCache[$head4]['layer']]; + $LongMPEGbitrateLookup[$head4] = $MPEGaudioBitrateLookup[$LongMPEGversionLookup[$head4]][$LongMPEGlayerLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['bitrate']]; + $LongMPEGpaddingLookup[$head4] = (bool) $MPEGaudioHeaderDecodeCache[$head4]['padding']; + $LongMPEGfrequencyLookup[$head4] = $MPEGaudioFrequencyLookup[$LongMPEGversionLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['sample_rate']]; + $MPEGaudioHeaderLengthCache[$head4] = self::MPEGaudioFrameLength( + $LongMPEGbitrateLookup[$head4], + $LongMPEGversionLookup[$head4], + $LongMPEGlayerLookup[$head4], + $LongMPEGpaddingLookup[$head4], + $LongMPEGfrequencyLookup[$head4]); + } + if ($MPEGaudioHeaderLengthCache[$head4] > 4) { + $WhereWeWere = $this->ftell(); + $this->fseek($MPEGaudioHeaderLengthCache[$head4] - 4, SEEK_CUR); + $next4 = $this->fread(4); + if ($next4[0] == "\xFF") { + if (!isset($MPEGaudioHeaderDecodeCache[$next4])) { + $MPEGaudioHeaderDecodeCache[$next4] = self::MPEGaudioHeaderDecode($next4); + } + if (!isset($MPEGaudioHeaderValidCache[$next4])) { + $MPEGaudioHeaderValidCache[$next4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$next4], false, false); + } + if ($MPEGaudioHeaderValidCache[$next4]) { + $this->fseek(-4, SEEK_CUR); + + getid3_lib::safe_inc($Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]]); + getid3_lib::safe_inc($Distribution['layer'][$LongMPEGlayerLookup[$head4]]); + getid3_lib::safe_inc($Distribution['version'][$LongMPEGversionLookup[$head4]]); + getid3_lib::safe_inc($Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])]); + getid3_lib::safe_inc($Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]]); + if ($max_frames_scan && (++$frames_scanned >= $max_frames_scan)) { + $pct_data_scanned = ($this->ftell() - $info['avdataoffset']) / ($info['avdataend'] - $info['avdataoffset']); + $this->warning('too many MPEG audio frames to scan, only scanned first '.$max_frames_scan.' frames ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.'); + foreach ($Distribution as $key1 => $value1) { + foreach ($value1 as $key2 => $value2) { + $Distribution[$key1][$key2] = round($value2 / $pct_data_scanned); + } + } + break; + } + continue; + } + } + unset($next4); + $this->fseek($WhereWeWere - 3); + } + + } + } + foreach ($Distribution as $key => $value) { + ksort($Distribution[$key], SORT_NUMERIC); + } + ksort($Distribution['version'], SORT_STRING); + $info['mpeg']['audio']['bitrate_distribution'] = $Distribution['bitrate']; + $info['mpeg']['audio']['frequency_distribution'] = $Distribution['frequency']; + $info['mpeg']['audio']['layer_distribution'] = $Distribution['layer']; + $info['mpeg']['audio']['version_distribution'] = $Distribution['version']; + $info['mpeg']['audio']['padding_distribution'] = $Distribution['padding']; + if (count($Distribution['version']) > 1) { + $this->error('Corrupt file - more than one MPEG version detected'); + } + if (count($Distribution['layer']) > 1) { + $this->error('Corrupt file - more than one MPEG layer detected'); + } + if (count($Distribution['frequency']) > 1) { + $this->error('Corrupt file - more than one MPEG sample rate detected'); + } + + + $bittotal = 0; + foreach ($Distribution['bitrate'] as $bitratevalue => $bitratecount) { + if ($bitratevalue != 'free') { + $bittotal += ($bitratevalue * $bitratecount); + } + } + $info['mpeg']['audio']['frame_count'] = array_sum($Distribution['bitrate']); + if ($info['mpeg']['audio']['frame_count'] == 0) { + $this->error('no MPEG audio frames found'); + return false; + } + $info['mpeg']['audio']['bitrate'] = ($bittotal / $info['mpeg']['audio']['frame_count']); + $info['mpeg']['audio']['bitrate_mode'] = ((count($Distribution['bitrate']) > 0) ? 'vbr' : 'cbr'); + $info['mpeg']['audio']['sample_rate'] = getid3_lib::array_max($Distribution['frequency'], true); + + $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; + $info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode']; + $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; + $info['audio']['dataformat'] = 'mp'.getid3_lib::array_max($Distribution['layer'], true); + $info['fileformat'] = $info['audio']['dataformat']; + + return true; + } + + /** + * @param int $avdataoffset + * @param bool $BitrateHistogram + * + * @return bool + */ + public function getOnlyMPEGaudioInfo($avdataoffset, $BitrateHistogram=false) { + // looks for synch, decodes MPEG audio header + + $info = &$this->getid3->info; + + static $MPEGaudioVersionLookup; + static $MPEGaudioLayerLookup; + static $MPEGaudioBitrateLookup; + if (empty($MPEGaudioVersionLookup)) { + $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); + $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); + $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); + } + + $this->fseek($avdataoffset); + $sync_seek_buffer_size = min(128 * 1024, $info['avdataend'] - $avdataoffset); + if ($sync_seek_buffer_size <= 0) { + $this->error('Invalid $sync_seek_buffer_size at offset '.$avdataoffset); + return false; + } + $header = $this->fread($sync_seek_buffer_size); + $sync_seek_buffer_size = strlen($header); + $SynchSeekOffset = 0; + while ($SynchSeekOffset < $sync_seek_buffer_size) { + if ((($avdataoffset + $SynchSeekOffset) < $info['avdataend']) && !feof($this->getid3->fp)) { + + if ($SynchSeekOffset > $sync_seek_buffer_size) { + // if a synch's not found within the first 128k bytes, then give up + $this->error('Could not find valid MPEG audio synch within the first '.round($sync_seek_buffer_size / 1024).'kB'); + if (isset($info['audio']['bitrate'])) { + unset($info['audio']['bitrate']); + } + if (isset($info['mpeg']['audio'])) { + unset($info['mpeg']['audio']); + } + if (empty($info['mpeg'])) { + unset($info['mpeg']); + } + return false; + + } elseif (feof($this->getid3->fp)) { + + $this->error('Could not find valid MPEG audio synch before end of file'); + if (isset($info['audio']['bitrate'])) { + unset($info['audio']['bitrate']); + } + if (isset($info['mpeg']['audio'])) { + unset($info['mpeg']['audio']); + } + if (isset($info['mpeg']) && (!is_array($info['mpeg']) || (count($info['mpeg']) == 0))) { + unset($info['mpeg']); + } + return false; + } + } + + if (($SynchSeekOffset + 1) >= strlen($header)) { + $this->error('Could not find valid MPEG synch before end of file'); + return false; + } + + if (($header[$SynchSeekOffset] == "\xFF") && ($header[($SynchSeekOffset + 1)] > "\xE0")) { // synch detected + $FirstFrameAVDataOffset = null; + if (!isset($FirstFrameThisfileInfo) && !isset($info['mpeg']['audio'])) { + $FirstFrameThisfileInfo = $info; + $FirstFrameAVDataOffset = $avdataoffset + $SynchSeekOffset; + if (!$this->decodeMPEGaudioHeader($FirstFrameAVDataOffset, $FirstFrameThisfileInfo, false)) { + // if this is the first valid MPEG-audio frame, save it in case it's a VBR header frame and there's + // garbage between this frame and a valid sequence of MPEG-audio frames, to be restored below + unset($FirstFrameThisfileInfo); + } + } + + $dummy = $info; // only overwrite real data if valid header found + if ($this->decodeMPEGaudioHeader($avdataoffset + $SynchSeekOffset, $dummy, true)) { + $info = $dummy; + $info['avdataoffset'] = $avdataoffset + $SynchSeekOffset; + switch (isset($info['fileformat']) ? $info['fileformat'] : '') { + case '': + case 'id3': + case 'ape': + case 'mp3': + $info['fileformat'] = 'mp3'; + $info['audio']['dataformat'] = 'mp3'; + break; + } + if (isset($FirstFrameThisfileInfo) && isset($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode']) && ($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr')) { + if (!(abs($info['audio']['bitrate'] - $FirstFrameThisfileInfo['audio']['bitrate']) <= 1)) { + // If there is garbage data between a valid VBR header frame and a sequence + // of valid MPEG-audio frames the VBR data is no longer discarded. + $info = $FirstFrameThisfileInfo; + $info['avdataoffset'] = $FirstFrameAVDataOffset; + $info['fileformat'] = 'mp3'; + $info['audio']['dataformat'] = 'mp3'; + $dummy = $info; + unset($dummy['mpeg']['audio']); + $GarbageOffsetStart = $FirstFrameAVDataOffset + $FirstFrameThisfileInfo['mpeg']['audio']['framelength']; + $GarbageOffsetEnd = $avdataoffset + $SynchSeekOffset; + if ($this->decodeMPEGaudioHeader($GarbageOffsetEnd, $dummy, true, true)) { + $info = $dummy; + $info['avdataoffset'] = $GarbageOffsetEnd; + $this->warning('apparently-valid VBR header not used because could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd); + } else { + $this->warning('using data from VBR header even though could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')'); + } + } + } + if (isset($info['mpeg']['audio']['bitrate_mode']) && ($info['mpeg']['audio']['bitrate_mode'] == 'vbr') && !isset($info['mpeg']['audio']['VBR_method'])) { + // VBR file with no VBR header + $BitrateHistogram = true; + } + + if ($BitrateHistogram) { + + $info['mpeg']['audio']['stereo_distribution'] = array('stereo'=>0, 'joint stereo'=>0, 'dual channel'=>0, 'mono'=>0); + $info['mpeg']['audio']['version_distribution'] = array('1'=>0, '2'=>0, '2.5'=>0); + + if ($info['mpeg']['audio']['version'] == '1') { + if ($info['mpeg']['audio']['layer'] == 3) { + $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0); + } elseif ($info['mpeg']['audio']['layer'] == 2) { + $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0, 384000=>0); + } elseif ($info['mpeg']['audio']['layer'] == 1) { + $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 64000=>0, 96000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 288000=>0, 320000=>0, 352000=>0, 384000=>0, 416000=>0, 448000=>0); + } + } elseif ($info['mpeg']['audio']['layer'] == 1) { + $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0, 176000=>0, 192000=>0, 224000=>0, 256000=>0); + } else { + $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 8000=>0, 16000=>0, 24000=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0); + } + + $dummy = array('error'=>$info['error'], 'warning'=>$info['warning'], 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']); + $synchstartoffset = $info['avdataoffset']; + $this->fseek($info['avdataoffset']); + + // you can play with these numbers: + $max_frames_scan = 50000; + $max_scan_segments = 10; + + // don't play with these numbers: + $FastMode = false; + $SynchErrorsFound = 0; + $frames_scanned = 0; + $this_scan_segment = 0; + $frames_scan_per_segment = ceil($max_frames_scan / $max_scan_segments); + $pct_data_scanned = 0; + for ($current_segment = 0; $current_segment < $max_scan_segments; $current_segment++) { + $frames_scanned_this_segment = 0; + if ($this->ftell() >= $info['avdataend']) { + break; + } + $scan_start_offset[$current_segment] = max($this->ftell(), $info['avdataoffset'] + round($current_segment * (($info['avdataend'] - $info['avdataoffset']) / $max_scan_segments))); + if ($current_segment > 0) { + $this->fseek($scan_start_offset[$current_segment]); + $buffer_4k = $this->fread(4096); + for ($j = 0; $j < (strlen($buffer_4k) - 4); $j++) { + if (($buffer_4k[$j] == "\xFF") && ($buffer_4k[($j + 1)] > "\xE0")) { // synch detected + if ($this->decodeMPEGaudioHeader($scan_start_offset[$current_segment] + $j, $dummy, false, false, $FastMode)) { + $calculated_next_offset = $scan_start_offset[$current_segment] + $j + $dummy['mpeg']['audio']['framelength']; + if ($this->decodeMPEGaudioHeader($calculated_next_offset, $dummy, false, false, $FastMode)) { + $scan_start_offset[$current_segment] += $j; + break; + } + } + } + } + } + $synchstartoffset = $scan_start_offset[$current_segment]; + while (($synchstartoffset < $info['avdataend']) && $this->decodeMPEGaudioHeader($synchstartoffset, $dummy, false, false, $FastMode)) { + $FastMode = true; + $thisframebitrate = $MPEGaudioBitrateLookup[$MPEGaudioVersionLookup[$dummy['mpeg']['audio']['raw']['version']]][$MPEGaudioLayerLookup[$dummy['mpeg']['audio']['raw']['layer']]][$dummy['mpeg']['audio']['raw']['bitrate']]; + + if (empty($dummy['mpeg']['audio']['framelength'])) { + $SynchErrorsFound++; + $synchstartoffset++; + } else { + getid3_lib::safe_inc($info['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]); + getid3_lib::safe_inc($info['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]); + getid3_lib::safe_inc($info['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]); + $synchstartoffset += $dummy['mpeg']['audio']['framelength']; + } + $frames_scanned++; + if ($frames_scan_per_segment && (++$frames_scanned_this_segment >= $frames_scan_per_segment)) { + $this_pct_scanned = ($this->ftell() - $scan_start_offset[$current_segment]) / ($info['avdataend'] - $info['avdataoffset']); + if (($current_segment == 0) && (($this_pct_scanned * $max_scan_segments) >= 1)) { + // file likely contains < $max_frames_scan, just scan as one segment + $max_scan_segments = 1; + $frames_scan_per_segment = $max_frames_scan; + } else { + $pct_data_scanned += $this_pct_scanned; + break; + } + } + } + } + if ($pct_data_scanned > 0) { + $this->warning('too many MPEG audio frames to scan, only scanned '.$frames_scanned.' frames in '.$max_scan_segments.' segments ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.'); + foreach ($info['mpeg']['audio'] as $key1 => $value1) { + if (!preg_match('#_distribution$#i', $key1)) { + continue; + } + foreach ($value1 as $key2 => $value2) { + $info['mpeg']['audio'][$key1][$key2] = round($value2 / $pct_data_scanned); + } + } + } + + if ($SynchErrorsFound > 0) { + $this->warning('Found '.$SynchErrorsFound.' synch errors in histogram analysis'); + //return false; + } + + $bittotal = 0; + $framecounter = 0; + foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitratevalue => $bitratecount) { + $framecounter += $bitratecount; + if ($bitratevalue != 'free') { + $bittotal += ($bitratevalue * $bitratecount); + } + } + if ($framecounter == 0) { + $this->error('Corrupt MP3 file: framecounter == zero'); + return false; + } + $info['mpeg']['audio']['frame_count'] = getid3_lib::CastAsInt($framecounter); + $info['mpeg']['audio']['bitrate'] = ($bittotal / $framecounter); + + $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; + + + // Definitively set VBR vs CBR, even if the Xing/LAME/VBRI header says differently + $distinct_bitrates = 0; + foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitrate_value => $bitrate_count) { + if ($bitrate_count > 0) { + $distinct_bitrates++; + } + } + if ($distinct_bitrates > 1) { + $info['mpeg']['audio']['bitrate_mode'] = 'vbr'; + } else { + $info['mpeg']['audio']['bitrate_mode'] = 'cbr'; + } + $info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode']; + + } + + break; // exit while() + } + } + + $SynchSeekOffset++; + if (($avdataoffset + $SynchSeekOffset) >= $info['avdataend']) { + // end of file/data + + if (empty($info['mpeg']['audio'])) { + + $this->error('could not find valid MPEG synch before end of file'); + if (isset($info['audio']['bitrate'])) { + unset($info['audio']['bitrate']); + } + if (isset($info['mpeg']['audio'])) { + unset($info['mpeg']['audio']); + } + if (isset($info['mpeg']) && (!is_array($info['mpeg']) || empty($info['mpeg']))) { + unset($info['mpeg']); + } + return false; + + } + break; + } + + } + $info['audio']['channels'] = $info['mpeg']['audio']['channels']; + $info['audio']['channelmode'] = $info['mpeg']['audio']['channelmode']; + $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; + return true; + } + + /** + * @return array + */ + public static function MPEGaudioVersionArray() { + static $MPEGaudioVersion = array('2.5', false, '2', '1'); + return $MPEGaudioVersion; + } + + /** + * @return array + */ + public static function MPEGaudioLayerArray() { + static $MPEGaudioLayer = array(false, 3, 2, 1); + return $MPEGaudioLayer; + } + + /** + * @return array + */ + public static function MPEGaudioBitrateArray() { + static $MPEGaudioBitrate; + if (empty($MPEGaudioBitrate)) { + $MPEGaudioBitrate = array ( + '1' => array (1 => array('free', 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000), + 2 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000), + 3 => array('free', 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000) + ), + + '2' => array (1 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000), + 2 => array('free', 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000), + ) + ); + $MPEGaudioBitrate['2'][3] = $MPEGaudioBitrate['2'][2]; + $MPEGaudioBitrate['2.5'] = $MPEGaudioBitrate['2']; + } + return $MPEGaudioBitrate; + } + + /** + * @return array + */ + public static function MPEGaudioFrequencyArray() { + static $MPEGaudioFrequency; + if (empty($MPEGaudioFrequency)) { + $MPEGaudioFrequency = array ( + '1' => array(44100, 48000, 32000), + '2' => array(22050, 24000, 16000), + '2.5' => array(11025, 12000, 8000) + ); + } + return $MPEGaudioFrequency; + } + + /** + * @return array + */ + public static function MPEGaudioChannelModeArray() { + static $MPEGaudioChannelMode = array('stereo', 'joint stereo', 'dual channel', 'mono'); + return $MPEGaudioChannelMode; + } + + /** + * @return array + */ + public static function MPEGaudioModeExtensionArray() { + static $MPEGaudioModeExtension; + if (empty($MPEGaudioModeExtension)) { + $MPEGaudioModeExtension = array ( + 1 => array('4-31', '8-31', '12-31', '16-31'), + 2 => array('4-31', '8-31', '12-31', '16-31'), + 3 => array('', 'IS', 'MS', 'IS+MS') + ); + } + return $MPEGaudioModeExtension; + } + + /** + * @return array + */ + public static function MPEGaudioEmphasisArray() { + static $MPEGaudioEmphasis = array('none', '50/15ms', false, 'CCIT J.17'); + return $MPEGaudioEmphasis; + } + + /** + * @param string $head4 + * @param bool $allowBitrate15 + * + * @return bool + */ + public static function MPEGaudioHeaderBytesValid($head4, $allowBitrate15=false) { + return self::MPEGaudioHeaderValid(self::MPEGaudioHeaderDecode($head4), false, $allowBitrate15); + } + + /** + * @param array $rawarray + * @param bool $echoerrors + * @param bool $allowBitrate15 + * + * @return bool + */ + public static function MPEGaudioHeaderValid($rawarray, $echoerrors=false, $allowBitrate15=false) { + if (($rawarray['synch'] & 0x0FFE) != 0x0FFE) { + return false; + } + + static $MPEGaudioVersionLookup; + static $MPEGaudioLayerLookup; + static $MPEGaudioBitrateLookup; + static $MPEGaudioFrequencyLookup; + static $MPEGaudioChannelModeLookup; + static $MPEGaudioModeExtensionLookup; + static $MPEGaudioEmphasisLookup; + if (empty($MPEGaudioVersionLookup)) { + $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); + $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); + $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); + $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); + $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); + $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); + $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); + } + + if (isset($MPEGaudioVersionLookup[$rawarray['version']])) { + $decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']]; + } else { + echo ($echoerrors ? "\n".'invalid Version ('.$rawarray['version'].')' : ''); + return false; + } + if (isset($MPEGaudioLayerLookup[$rawarray['layer']])) { + $decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']]; + } else { + echo ($echoerrors ? "\n".'invalid Layer ('.$rawarray['layer'].')' : ''); + return false; + } + if (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) { + echo ($echoerrors ? "\n".'invalid Bitrate ('.$rawarray['bitrate'].')' : ''); + if ($rawarray['bitrate'] == 15) { + // known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0 + // let it go through here otherwise file will not be identified + if (!$allowBitrate15) { + return false; + } + } else { + return false; + } + } + if (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) { + echo ($echoerrors ? "\n".'invalid Frequency ('.$rawarray['sample_rate'].')' : ''); + return false; + } + if (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) { + echo ($echoerrors ? "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')' : ''); + return false; + } + if (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) { + echo ($echoerrors ? "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')' : ''); + return false; + } + if (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) { + echo ($echoerrors ? "\n".'invalid Emphasis ('.$rawarray['emphasis'].')' : ''); + return false; + } + // These are just either set or not set, you can't mess that up :) + // $rawarray['protection']; + // $rawarray['padding']; + // $rawarray['private']; + // $rawarray['copyright']; + // $rawarray['original']; + + return true; + } + + /** + * @param string $Header4Bytes + * + * @return array|false + */ + public static function MPEGaudioHeaderDecode($Header4Bytes) { + // AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM + // A - Frame sync (all bits set) + // B - MPEG Audio version ID + // C - Layer description + // D - Protection bit + // E - Bitrate index + // F - Sampling rate frequency index + // G - Padding bit + // H - Private bit + // I - Channel Mode + // J - Mode extension (Only if Joint stereo) + // K - Copyright + // L - Original + // M - Emphasis + + if (strlen($Header4Bytes) != 4) { + return false; + } + + $MPEGrawHeader['synch'] = (getid3_lib::BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4; + $MPEGrawHeader['version'] = (ord($Header4Bytes[1]) & 0x18) >> 3; // BB + $MPEGrawHeader['layer'] = (ord($Header4Bytes[1]) & 0x06) >> 1; // CC + $MPEGrawHeader['protection'] = (ord($Header4Bytes[1]) & 0x01); // D + $MPEGrawHeader['bitrate'] = (ord($Header4Bytes[2]) & 0xF0) >> 4; // EEEE + $MPEGrawHeader['sample_rate'] = (ord($Header4Bytes[2]) & 0x0C) >> 2; // FF + $MPEGrawHeader['padding'] = (ord($Header4Bytes[2]) & 0x02) >> 1; // G + $MPEGrawHeader['private'] = (ord($Header4Bytes[2]) & 0x01); // H + $MPEGrawHeader['channelmode'] = (ord($Header4Bytes[3]) & 0xC0) >> 6; // II + $MPEGrawHeader['modeextension'] = (ord($Header4Bytes[3]) & 0x30) >> 4; // JJ + $MPEGrawHeader['copyright'] = (ord($Header4Bytes[3]) & 0x08) >> 3; // K + $MPEGrawHeader['original'] = (ord($Header4Bytes[3]) & 0x04) >> 2; // L + $MPEGrawHeader['emphasis'] = (ord($Header4Bytes[3]) & 0x03); // MM + + return $MPEGrawHeader; + } + + /** + * @param int|string $bitrate + * @param string $version + * @param string $layer + * @param bool $padding + * @param int $samplerate + * + * @return int|false + */ + public static function MPEGaudioFrameLength(&$bitrate, &$version, &$layer, $padding, &$samplerate) { + static $AudioFrameLengthCache = array(); + + if (!isset($AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate])) { + $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = false; + if ($bitrate != 'free') { + + if ($version == '1') { + + if ($layer == '1') { + + // For Layer I slot is 32 bits long + $FrameLengthCoefficient = 48; + $SlotLength = 4; + + } else { // Layer 2 / 3 + + // for Layer 2 and Layer 3 slot is 8 bits long. + $FrameLengthCoefficient = 144; + $SlotLength = 1; + + } + + } else { // MPEG-2 / MPEG-2.5 + + if ($layer == '1') { + + // For Layer I slot is 32 bits long + $FrameLengthCoefficient = 24; + $SlotLength = 4; + + } elseif ($layer == '2') { + + // for Layer 2 and Layer 3 slot is 8 bits long. + $FrameLengthCoefficient = 144; + $SlotLength = 1; + + } else { // layer 3 + + // for Layer 2 and Layer 3 slot is 8 bits long. + $FrameLengthCoefficient = 72; + $SlotLength = 1; + + } + + } + + // FrameLengthInBytes = ((Coefficient * BitRate) / SampleRate) + Padding + if ($samplerate > 0) { + $NewFramelength = ($FrameLengthCoefficient * $bitrate) / $samplerate; + $NewFramelength = floor($NewFramelength / $SlotLength) * $SlotLength; // round to next-lower multiple of SlotLength (1 byte for Layer 2/3, 4 bytes for Layer I) + if ($padding) { + $NewFramelength += $SlotLength; + } + $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = (int) $NewFramelength; + } + } + } + return $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate]; + } + + /** + * @param float|int $bit_rate + * + * @return int|float|string + */ + public static function ClosestStandardMP3Bitrate($bit_rate) { + static $standard_bit_rates = array (320000, 256000, 224000, 192000, 160000, 128000, 112000, 96000, 80000, 64000, 56000, 48000, 40000, 32000, 24000, 16000, 8000); + static $bit_rate_table = array (0=>'-'); + $round_bit_rate = intval(round($bit_rate, -3)); + if (!isset($bit_rate_table[$round_bit_rate])) { + if ($round_bit_rate > max($standard_bit_rates)) { + $bit_rate_table[$round_bit_rate] = round($bit_rate, 2 - strlen($bit_rate)); + } else { + $bit_rate_table[$round_bit_rate] = max($standard_bit_rates); + foreach ($standard_bit_rates as $standard_bit_rate) { + if ($round_bit_rate >= $standard_bit_rate + (($bit_rate_table[$round_bit_rate] - $standard_bit_rate) / 2)) { + break; + } + $bit_rate_table[$round_bit_rate] = $standard_bit_rate; + } + } + } + return $bit_rate_table[$round_bit_rate]; + } + + /** + * @param string $version + * @param string $channelmode + * + * @return int + */ + public static function XingVBRidOffset($version, $channelmode) { + static $XingVBRidOffsetCache = array(); + if (empty($XingVBRidOffsetCache)) { + $XingVBRidOffsetCache = array ( + '1' => array ('mono' => 0x15, // 4 + 17 = 21 + 'stereo' => 0x24, // 4 + 32 = 36 + 'joint stereo' => 0x24, + 'dual channel' => 0x24 + ), + + '2' => array ('mono' => 0x0D, // 4 + 9 = 13 + 'stereo' => 0x15, // 4 + 17 = 21 + 'joint stereo' => 0x15, + 'dual channel' => 0x15 + ), + + '2.5' => array ('mono' => 0x15, + 'stereo' => 0x15, + 'joint stereo' => 0x15, + 'dual channel' => 0x15 + ) + ); + } + return $XingVBRidOffsetCache[$version][$channelmode]; + } + + /** + * @param int $VBRmethodID + * + * @return string + */ + public static function LAMEvbrMethodLookup($VBRmethodID) { + static $LAMEvbrMethodLookup = array( + 0x00 => 'unknown', + 0x01 => 'cbr', + 0x02 => 'abr', + 0x03 => 'vbr-old / vbr-rh', + 0x04 => 'vbr-new / vbr-mtrh', + 0x05 => 'vbr-mt', + 0x06 => 'vbr (full vbr method 4)', + 0x08 => 'cbr (constant bitrate 2 pass)', + 0x09 => 'abr (2 pass)', + 0x0F => 'reserved' + ); + return (isset($LAMEvbrMethodLookup[$VBRmethodID]) ? $LAMEvbrMethodLookup[$VBRmethodID] : ''); + } + + /** + * @param int $StereoModeID + * + * @return string + */ + public static function LAMEmiscStereoModeLookup($StereoModeID) { + static $LAMEmiscStereoModeLookup = array( + 0 => 'mono', + 1 => 'stereo', + 2 => 'dual mono', + 3 => 'joint stereo', + 4 => 'forced stereo', + 5 => 'auto', + 6 => 'intensity stereo', + 7 => 'other' + ); + return (isset($LAMEmiscStereoModeLookup[$StereoModeID]) ? $LAMEmiscStereoModeLookup[$StereoModeID] : ''); + } + + /** + * @param int $SourceSampleFrequencyID + * + * @return string + */ + public static function LAMEmiscSourceSampleFrequencyLookup($SourceSampleFrequencyID) { + static $LAMEmiscSourceSampleFrequencyLookup = array( + 0 => '<= 32 kHz', + 1 => '44.1 kHz', + 2 => '48 kHz', + 3 => '> 48kHz' + ); + return (isset($LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID]) ? $LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID] : ''); + } + + /** + * @param int $SurroundInfoID + * + * @return string + */ + public static function LAMEsurroundInfoLookup($SurroundInfoID) { + static $LAMEsurroundInfoLookup = array( + 0 => 'no surround info', + 1 => 'DPL encoding', + 2 => 'DPL2 encoding', + 3 => 'Ambisonic encoding' + ); + return (isset($LAMEsurroundInfoLookup[$SurroundInfoID]) ? $LAMEsurroundInfoLookup[$SurroundInfoID] : 'reserved'); + } + + /** + * @param array $LAMEtag + * + * @return string + */ + public static function LAMEpresetUsedLookup($LAMEtag) { + + if ($LAMEtag['preset_used_id'] == 0) { + // no preset used (LAME >=3.93) + // no preset recorded (LAME <3.93) + return ''; + } + $LAMEpresetUsedLookup = array(); + + ///// THIS PART CANNOT BE STATIC . + for ($i = 8; $i <= 320; $i++) { + switch ($LAMEtag['vbr_method']) { + case 'cbr': + $LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i; + break; + case 'abr': + default: // other VBR modes shouldn't be here(?) + $LAMEpresetUsedLookup[$i] = '--alt-preset '.$i; + break; + } + } + + // named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions() + + // named alt-presets + $LAMEpresetUsedLookup[1000] = '--r3mix'; + $LAMEpresetUsedLookup[1001] = '--alt-preset standard'; + $LAMEpresetUsedLookup[1002] = '--alt-preset extreme'; + $LAMEpresetUsedLookup[1003] = '--alt-preset insane'; + $LAMEpresetUsedLookup[1004] = '--alt-preset fast standard'; + $LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme'; + $LAMEpresetUsedLookup[1006] = '--alt-preset medium'; + $LAMEpresetUsedLookup[1007] = '--alt-preset fast medium'; + + // LAME 3.94 additions/changes + $LAMEpresetUsedLookup[1010] = '--preset portable'; // 3.94a15 Oct 21 2003 + $LAMEpresetUsedLookup[1015] = '--preset radio'; // 3.94a15 Oct 21 2003 + + $LAMEpresetUsedLookup[320] = '--preset insane'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[410] = '-V9'; + $LAMEpresetUsedLookup[420] = '-V8'; + $LAMEpresetUsedLookup[440] = '-V6'; + $LAMEpresetUsedLookup[430] = '--preset radio'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[450] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[460] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[470] = '--r3mix'; // 3.94b1 Dec 18 2003 + $LAMEpresetUsedLookup[480] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard'; // 3.94a15 Nov 12 2003 + $LAMEpresetUsedLookup[490] = '-V1'; + $LAMEpresetUsedLookup[500] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme'; // 3.94a15 Nov 12 2003 + + return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org'); + } + +} diff --git a/wp-includes/ID3/module.audio.ogg.php b/wp-includes/ID3/module.audio.ogg.php new file mode 100644 index 0000000..51fee3e --- /dev/null +++ b/wp-includes/ID3/module.audio.ogg.php @@ -0,0 +1,918 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.audio.ogg.php // +// module for analyzing Ogg Vorbis, OggFLAC and Speex files // +// dependencies: module.audio.flac.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true); + +class getid3_ogg extends getid3_handler +{ + /** + * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html + * + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + $info['fileformat'] = 'ogg'; + + // Warn about illegal tags - only vorbiscomments are allowed + if (isset($info['id3v2'])) { + $this->warning('Illegal ID3v2 tag present.'); + } + if (isset($info['id3v1'])) { + $this->warning('Illegal ID3v1 tag present.'); + } + if (isset($info['ape'])) { + $this->warning('Illegal APE tag present.'); + } + + + // Page 1 - Stream Header + + $this->fseek($info['avdataoffset']); + + $oggpageinfo = $this->ParseOggPageHeader(); + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; + + if ($this->ftell() >= $this->getid3->fread_buffer_size()) { + $this->error('Could not find start of Ogg page in the first '.$this->getid3->fread_buffer_size().' bytes (this might not be an Ogg-Vorbis file?)'); + unset($info['fileformat']); + unset($info['ogg']); + return false; + } + + $filedata = $this->fread($oggpageinfo['page_length']); + $filedataoffset = 0; + + if (substr($filedata, 0, 4) == 'fLaC') { + + $info['audio']['dataformat'] = 'flac'; + $info['audio']['bitrate_mode'] = 'vbr'; + $info['audio']['lossless'] = true; + + } elseif (substr($filedata, 1, 6) == 'vorbis') { + + $this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo); + + } elseif (substr($filedata, 0, 8) == 'OpusHead') { + + if ($this->ParseOpusPageHeader($filedata, $filedataoffset, $oggpageinfo) === false) { + return false; + } + + } elseif (substr($filedata, 0, 8) == 'Speex ') { + + // http://www.speex.org/manual/node10.html + + $info['audio']['dataformat'] = 'speex'; + $info['mime_type'] = 'audio/speex'; + $info['audio']['bitrate_mode'] = 'abr'; + $info['audio']['lossless'] = false; + + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_string'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'Speex ' + $filedataoffset += 8; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version'] = substr($filedata, $filedataoffset, 20); + $filedataoffset += 20; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version_id'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['header_size'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode_bitstream_version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['bitrate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['framesize'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['frames_per_packet'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['extra_headers'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved1'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved2'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + + $info['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']); + $info['speex']['sample_rate'] = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate']; + $info['speex']['channels'] = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels']; + $info['speex']['vbr'] = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr']; + $info['speex']['band_type'] = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']); + + $info['audio']['sample_rate'] = $info['speex']['sample_rate']; + $info['audio']['channels'] = $info['speex']['channels']; + if ($info['speex']['vbr']) { + $info['audio']['bitrate_mode'] = 'vbr'; + } + + } elseif (substr($filedata, 0, 7) == "\x80".'theora') { + + // http://www.theora.org/doc/Theora.pdf (section 6.2) + + $info['ogg']['pageheader']['theora']['theora_magic'] = substr($filedata, $filedataoffset, 7); // hard-coded to "\x80.'theora' + $filedataoffset += 7; + $info['ogg']['pageheader']['theora']['version_major'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $info['ogg']['pageheader']['theora']['version_minor'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $info['ogg']['pageheader']['theora']['version_revision'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $info['ogg']['pageheader']['theora']['frame_width_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); + $filedataoffset += 2; + $info['ogg']['pageheader']['theora']['frame_height_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); + $filedataoffset += 2; + $info['ogg']['pageheader']['theora']['resolution_x'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); + $filedataoffset += 3; + $info['ogg']['pageheader']['theora']['resolution_y'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); + $filedataoffset += 3; + $info['ogg']['pageheader']['theora']['picture_offset_x'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $info['ogg']['pageheader']['theora']['picture_offset_y'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $info['ogg']['pageheader']['theora']['frame_rate_numerator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader']['theora']['frame_rate_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); + $filedataoffset += 3; + $info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); + $filedataoffset += 3; + $info['ogg']['pageheader']['theora']['color_space_id'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $info['ogg']['pageheader']['theora']['nominal_bitrate'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); + $filedataoffset += 3; + $info['ogg']['pageheader']['theora']['flags'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); + $filedataoffset += 2; + + $info['ogg']['pageheader']['theora']['quality'] = ($info['ogg']['pageheader']['theora']['flags'] & 0xFC00) >> 10; + $info['ogg']['pageheader']['theora']['kfg_shift'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x03E0) >> 5; + $info['ogg']['pageheader']['theora']['pixel_format_id'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0018) >> 3; + $info['ogg']['pageheader']['theora']['reserved'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0007) >> 0; // should be 0 + $info['ogg']['pageheader']['theora']['color_space'] = self::TheoraColorSpace($info['ogg']['pageheader']['theora']['color_space_id']); + $info['ogg']['pageheader']['theora']['pixel_format'] = self::TheoraPixelFormat($info['ogg']['pageheader']['theora']['pixel_format_id']); + + $info['video']['dataformat'] = 'theora'; + $info['mime_type'] = 'video/ogg'; + //$info['audio']['bitrate_mode'] = 'abr'; + //$info['audio']['lossless'] = false; + $info['video']['resolution_x'] = $info['ogg']['pageheader']['theora']['resolution_x']; + $info['video']['resolution_y'] = $info['ogg']['pageheader']['theora']['resolution_y']; + if ($info['ogg']['pageheader']['theora']['frame_rate_denominator'] > 0) { + $info['video']['frame_rate'] = (float) $info['ogg']['pageheader']['theora']['frame_rate_numerator'] / $info['ogg']['pageheader']['theora']['frame_rate_denominator']; + } + if ($info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] > 0) { + $info['video']['pixel_aspect_ratio'] = (float) $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] / $info['ogg']['pageheader']['theora']['pixel_aspect_denominator']; + } + $this->warning('Ogg Theora (v3) not fully supported in this version of getID3 ['.$this->getid3->version().'] -- bitrate, playtime and all audio data are currently unavailable'); + + + } elseif (substr($filedata, 0, 8) == "fishead\x00") { + + // Ogg Skeleton version 3.0 Format Specification + // http://xiph.org/ogg/doc/skeleton.html + $filedataoffset += 8; + $info['ogg']['skeleton']['fishead']['raw']['version_major'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); + $filedataoffset += 2; + $info['ogg']['skeleton']['fishead']['raw']['version_minor'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); + $filedataoffset += 2; + $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); + $filedataoffset += 8; + $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); + $filedataoffset += 8; + $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); + $filedataoffset += 8; + $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); + $filedataoffset += 8; + $info['ogg']['skeleton']['fishead']['raw']['utc'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20)); + $filedataoffset += 20; + + $info['ogg']['skeleton']['fishead']['version'] = $info['ogg']['skeleton']['fishead']['raw']['version_major'].'.'.$info['ogg']['skeleton']['fishead']['raw']['version_minor']; + $info['ogg']['skeleton']['fishead']['presentationtime'] = $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator']; + $info['ogg']['skeleton']['fishead']['basetime'] = $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']; + $info['ogg']['skeleton']['fishead']['utc'] = $info['ogg']['skeleton']['fishead']['raw']['utc']; + + + $counter = 0; + do { + $oggpageinfo = $this->ParseOggPageHeader(); + $info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo; + $filedata = $this->fread($oggpageinfo['page_length']); + $this->fseek($oggpageinfo['page_end_offset']); + + if (substr($filedata, 0, 8) == "fisbone\x00") { + + $filedataoffset = 8; + $info['ogg']['skeleton']['fisbone']['raw']['message_header_offset'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['skeleton']['fisbone']['raw']['serial_number'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['skeleton']['fisbone']['raw']['number_header_packets'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['skeleton']['fisbone']['raw']['granulerate_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); + $filedataoffset += 8; + $info['ogg']['skeleton']['fisbone']['raw']['granulerate_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); + $filedataoffset += 8; + $info['ogg']['skeleton']['fisbone']['raw']['basegranule'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); + $filedataoffset += 8; + $info['ogg']['skeleton']['fisbone']['raw']['preroll'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['skeleton']['fisbone']['raw']['granuleshift'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $info['ogg']['skeleton']['fisbone']['raw']['padding'] = substr($filedata, $filedataoffset, 3); + $filedataoffset += 3; + + } elseif (substr($filedata, 1, 6) == 'theora') { + + $info['video']['dataformat'] = 'theora1'; + $this->error('Ogg Theora (v1) not correctly handled in this version of getID3 ['.$this->getid3->version().']'); + //break; + + } elseif (substr($filedata, 1, 6) == 'vorbis') { + + $this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo); + + } else { + $this->error('unexpected'); + //break; + } + //} while ($oggpageinfo['page_seqno'] == 0); + } while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != "fisbone\x00")); + + $this->fseek($oggpageinfo['page_start_offset']); + + $this->error('Ogg Skeleton not correctly handled in this version of getID3 ['.$this->getid3->version().']'); + //return false; + + } elseif (substr($filedata, 0, 5) == "\x7F".'FLAC') { + // https://xiph.org/flac/ogg_mapping.html + + $info['audio']['dataformat'] = 'flac'; + $info['audio']['bitrate_mode'] = 'vbr'; + $info['audio']['lossless'] = true; + + $info['ogg']['flac']['header']['version_major'] = ord(substr($filedata, 5, 1)); + $info['ogg']['flac']['header']['version_minor'] = ord(substr($filedata, 6, 1)); + $info['ogg']['flac']['header']['header_packets'] = getid3_lib::BigEndian2Int(substr($filedata, 7, 2)) + 1; // "A two-byte, big-endian binary number signifying the number of header (non-audio) packets, not including this one. This number may be zero (0x0000) to signify 'unknown' but be aware that some decoders may not be able to handle such streams." + $info['ogg']['flac']['header']['magic'] = substr($filedata, 9, 4); + if ($info['ogg']['flac']['header']['magic'] != 'fLaC') { + $this->error('Ogg-FLAC expecting "fLaC", found "'.$info['ogg']['flac']['header']['magic'].'" ('.trim(getid3_lib::PrintHexBytes($info['ogg']['flac']['header']['magic'])).')'); + return false; + } + $info['ogg']['flac']['header']['STREAMINFO_bytes'] = getid3_lib::BigEndian2Int(substr($filedata, 13, 4)); + $info['flac']['STREAMINFO'] = getid3_flac::parseSTREAMINFOdata(substr($filedata, 17, 34)); + if (!empty($info['flac']['STREAMINFO']['sample_rate'])) { + $info['audio']['bitrate_mode'] = 'vbr'; + $info['audio']['sample_rate'] = $info['flac']['STREAMINFO']['sample_rate']; + $info['audio']['channels'] = $info['flac']['STREAMINFO']['channels']; + $info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample']; + $info['playtime_seconds'] = $info['flac']['STREAMINFO']['samples_stream'] / $info['flac']['STREAMINFO']['sample_rate']; + } + + } else { + + $this->error('Expecting one of "vorbis", "Speex", "OpusHead", "vorbis", "fishhead", "theora", "fLaC" identifier strings, found "'.substr($filedata, 0, 8).'"'); + unset($info['ogg']); + unset($info['mime_type']); + return false; + + } + + // Page 2 - Comment Header + $oggpageinfo = $this->ParseOggPageHeader(); + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; + + switch ($info['audio']['dataformat']) { + case 'vorbis': + $filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, 0, 1)); + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 1, 6); // hard-coded to 'vorbis' + + $this->ParseVorbisComments(); + break; + + case 'flac': + $flac = new getid3_flac($this->getid3); + if (!$flac->parseMETAdata()) { + $this->error('Failed to parse FLAC headers'); + return false; + } + unset($flac); + break; + + case 'speex': + $this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR); + $this->ParseVorbisComments(); + break; + + case 'opus': + $filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 0, 8); // hard-coded to 'OpusTags' + if(substr($filedata, 0, 8) != 'OpusTags') { + $this->error('Expected "OpusTags" as header but got "'.substr($filedata, 0, 8).'"'); + return false; + } + + $this->ParseVorbisComments(); + break; + + } + + // Last Page - Number of Samples + if (!getid3_lib::intValueSupported($info['avdataend'])) { + + $this->warning('Unable to parse Ogg end chunk file (PHP does not support file operations beyond '.round(PHP_INT_MAX / 1073741824).'GB)'); + + } else { + + $this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0)); + $LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size())); + if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) { + $this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO'))); + $info['avdataend'] = $this->ftell(); + $info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader(); + $info['ogg']['samples'] = $info['ogg']['pageheader']['eos']['pcm_abs_position']; + if ($info['ogg']['samples'] == 0) { + $this->error('Corrupt Ogg file: eos.number of samples == zero'); + return false; + } + if (!empty($info['audio']['sample_rate'])) { + $info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / ($info['ogg']['samples'] / $info['audio']['sample_rate']); + } + } + + } + + if (!empty($info['ogg']['bitrate_average'])) { + $info['audio']['bitrate'] = $info['ogg']['bitrate_average']; + } elseif (!empty($info['ogg']['bitrate_nominal'])) { + $info['audio']['bitrate'] = $info['ogg']['bitrate_nominal']; + } elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) { + $info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2; + } + if (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) { + if ($info['audio']['bitrate'] == 0) { + $this->error('Corrupt Ogg file: bitrate_audio == zero'); + return false; + } + $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']); + } + + if (isset($info['ogg']['vendor'])) { + $info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']); + + // Vorbis only + if ($info['audio']['dataformat'] == 'vorbis') { + + // Vorbis 1.0 starts with Xiph.Org + if (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) { + + if ($info['audio']['bitrate_mode'] == 'abr') { + + // Set -b 128 on abr files + $info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000); + + } elseif (($info['audio']['bitrate_mode'] == 'vbr') && ($info['audio']['channels'] == 2) && ($info['audio']['sample_rate'] >= 44100) && ($info['audio']['sample_rate'] <= 48000)) { + // Set -q N on vbr files + $info['audio']['encoder_options'] = '-q '.$this->get_quality_from_nominal_bitrate($info['ogg']['bitrate_nominal']); + + } + } + + if (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) { + $info['audio']['encoder_options'] = 'Nominal bitrate: '.intval(round($info['ogg']['bitrate_nominal'] / 1000)).'kbps'; + } + } + } + + return true; + } + + /** + * @param string $filedata + * @param int $filedataoffset + * @param array $oggpageinfo + * + * @return bool + */ + public function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) { + $info = &$this->getid3->info; + $info['audio']['dataformat'] = 'vorbis'; + $info['audio']['lossless'] = false; + + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, $filedataoffset, 6); // hard-coded to 'vorbis' + $filedataoffset += 6; + $info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $info['audio']['channels'] = $info['ogg']['numberofchannels']; + $info['ogg']['samplerate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + if ($info['ogg']['samplerate'] == 0) { + $this->error('Corrupt Ogg file: sample rate == zero'); + return false; + } + $info['audio']['sample_rate'] = $info['ogg']['samplerate']; + $info['ogg']['samples'] = 0; // filled in later + $info['ogg']['bitrate_average'] = 0; // filled in later + $info['ogg']['bitrate_max'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['bitrate_nominal'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['bitrate_min'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $info['ogg']['blocksize_small'] = pow(2, getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0x0F); + $info['ogg']['blocksize_large'] = pow(2, (getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0xF0) >> 4); + $info['ogg']['stop_bit'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); // must be 1, marks end of packet + + $info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr + if ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) { + unset($info['ogg']['bitrate_max']); + $info['audio']['bitrate_mode'] = 'abr'; + } + if ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) { + unset($info['ogg']['bitrate_nominal']); + } + if ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) { + unset($info['ogg']['bitrate_min']); + $info['audio']['bitrate_mode'] = 'abr'; + } + return true; + } + + /** + * @link http://tools.ietf.org/html/draft-ietf-codec-oggopus-03 + * + * @param string $filedata + * @param int $filedataoffset + * @param array $oggpageinfo + * + * @return bool + */ + public function ParseOpusPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) { + $info = &$this->getid3->info; + $info['audio']['dataformat'] = 'opus'; + $info['mime_type'] = 'audio/ogg; codecs=opus'; + + /** @todo find a usable way to detect abr (vbr that is padded to be abr) */ + $info['audio']['bitrate_mode'] = 'vbr'; + + $info['audio']['lossless'] = false; + + $info['ogg']['pageheader']['opus']['opus_magic'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'OpusHead' + $filedataoffset += 8; + $info['ogg']['pageheader']['opus']['version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + + if ($info['ogg']['pageheader']['opus']['version'] < 1 || $info['ogg']['pageheader']['opus']['version'] > 15) { + $this->error('Unknown opus version number (only accepting 1-15)'); + return false; + } + + $info['ogg']['pageheader']['opus']['out_channel_count'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + + if ($info['ogg']['pageheader']['opus']['out_channel_count'] == 0) { + $this->error('Invalid channel count in opus header (must not be zero)'); + return false; + } + + $info['ogg']['pageheader']['opus']['pre_skip'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); + $filedataoffset += 2; + + $info['ogg']['pageheader']['opus']['input_sample_rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + + //$info['ogg']['pageheader']['opus']['output_gain'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); + //$filedataoffset += 2; + + //$info['ogg']['pageheader']['opus']['channel_mapping_family'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + //$filedataoffset += 1; + + $info['opus']['opus_version'] = $info['ogg']['pageheader']['opus']['version']; + $info['opus']['sample_rate_input'] = $info['ogg']['pageheader']['opus']['input_sample_rate']; + $info['opus']['out_channel_count'] = $info['ogg']['pageheader']['opus']['out_channel_count']; + + $info['audio']['channels'] = $info['opus']['out_channel_count']; + $info['audio']['sample_rate_input'] = $info['opus']['sample_rate_input']; + $info['audio']['sample_rate'] = 48000; // "All Opus audio is coded at 48 kHz, and should also be decoded at 48 kHz for playback (unless the target hardware does not support this sampling rate). However, this field may be used to resample the audio back to the original sampling rate, for example, when saving the output to a file." -- https://mf4.xiph.org/jenkins/view/opus/job/opusfile-unix/ws/doc/html/structOpusHead.html + return true; + } + + /** + * @return array|false + */ + public function ParseOggPageHeader() { + // http://xiph.org/ogg/vorbis/doc/framing.html + $oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file + + $filedata = $this->fread($this->getid3->fread_buffer_size()); + $filedataoffset = 0; + while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) { + if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) { + // should be found before here + return false; + } + if ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) { + if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === '')) { + // get some more data, unless eof, in which case fail + return false; + } + } + } + $filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS' + + $oggheader['stream_structver'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $oggheader['flags_raw'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $oggheader['flags']['fresh'] = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet + $oggheader['flags']['bos'] = (bool) ($oggheader['flags_raw'] & 0x02); // first page of logical bitstream (bos) + $oggheader['flags']['eos'] = (bool) ($oggheader['flags_raw'] & 0x04); // last page of logical bitstream (eos) + + $oggheader['pcm_abs_position'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); + $filedataoffset += 8; + $oggheader['stream_serialno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $oggheader['page_seqno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $oggheader['page_checksum'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); + $filedataoffset += 4; + $oggheader['page_segments'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $oggheader['page_length'] = 0; + for ($i = 0; $i < $oggheader['page_segments']; $i++) { + $oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); + $filedataoffset += 1; + $oggheader['page_length'] += $oggheader['segment_table'][$i]; + } + $oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset; + $oggheader['page_end_offset'] = $oggheader['header_end_offset'] + $oggheader['page_length']; + $this->fseek($oggheader['header_end_offset']); + + return $oggheader; + } + + /** + * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005 + * + * @return bool + */ + public function ParseVorbisComments() { + $info = &$this->getid3->info; + + $OriginalOffset = $this->ftell(); + $commentdata = null; + $commentdataoffset = 0; + $VorbisCommentPage = 1; + $CommentStartOffset = 0; + + switch ($info['audio']['dataformat']) { + case 'vorbis': + case 'speex': + case 'opus': + $CommentStartOffset = $info['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset']; // Second Ogg page, after header block + $this->fseek($CommentStartOffset); + $commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments']; + $commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset); + + if ($info['audio']['dataformat'] == 'vorbis') { + $commentdataoffset += (strlen('vorbis') + 1); + } + else if ($info['audio']['dataformat'] == 'opus') { + $commentdataoffset += strlen('OpusTags'); + } + + break; + + case 'flac': + $CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4; + $this->fseek($CommentStartOffset); + $commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']); + break; + + default: + return false; + break; + } + + $VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); + $commentdataoffset += 4; + + $info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize); + $commentdataoffset += $VendorSize; + + $CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); + $commentdataoffset += 4; + $info['avdataoffset'] = $CommentStartOffset + $commentdataoffset; + + $basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT'); + $ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw']; + for ($i = 0; $i < $CommentsCount; $i++) { + + if ($i >= 10000) { + // https://github.com/owncloud/music/issues/212#issuecomment-43082336 + $this->warning('Unexpectedly large number ('.$CommentsCount.') of Ogg comments - breaking after reading '.$i.' comments'); + break; + } + + $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset; + + if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) { + if ($oggpageinfo = $this->ParseOggPageHeader()) { + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; + + $VorbisCommentPage++; + + // First, save what we haven't read yet + $AsYetUnusedData = substr($commentdata, $commentdataoffset); + + // Then take that data off the end + $commentdata = substr($commentdata, 0, $commentdataoffset); + + // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct + $commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); + $commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); + + // Finally, stick the unused data back on the end + $commentdata .= $AsYetUnusedData; + + //$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); + $commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1)); + } + + } + $ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); + + // replace avdataoffset with position just after the last vorbiscomment + $info['avdataoffset'] = $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + $ThisFileInfo_ogg_comments_raw[$i]['size'] + 4; + + $commentdataoffset += 4; + while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) { + if (($ThisFileInfo_ogg_comments_raw[$i]['size'] > $info['avdataend']) || ($ThisFileInfo_ogg_comments_raw[$i]['size'] < 0)) { + $this->warning('Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo_ogg_comments_raw[$i]['size']).' bytes) - aborting reading comments'); + break 2; + } + + $VorbisCommentPage++; + + $oggpageinfo = $this->ParseOggPageHeader(); + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; + + // First, save what we haven't read yet + $AsYetUnusedData = substr($commentdata, $commentdataoffset); + + // Then take that data off the end + $commentdata = substr($commentdata, 0, $commentdataoffset); + + // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct + $commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); + $commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); + + // Finally, stick the unused data back on the end + $commentdata .= $AsYetUnusedData; + + //$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); + if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) { + $this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell()); + break; + } + $readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1); + if ($readlength <= 0) { + $this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell()); + break; + } + $commentdata .= $this->fread($readlength); + + //$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset']; + } + $ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset; + $commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']); + $commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size']; + + if (!$commentstring) { + + // no comment? + $this->warning('Blank Ogg comment ['.$i.']'); + + } elseif (strstr($commentstring, '=')) { + + $commentexploded = explode('=', $commentstring, 2); + $ThisFileInfo_ogg_comments_raw[$i]['key'] = strtoupper($commentexploded[0]); + $ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : ''); + + if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') { + + // http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE + // The unencoded format is that of the FLAC picture block. The fields are stored in big endian order as in FLAC, picture data is stored according to the relevant standard. + // http://flac.sourceforge.net/format.html#metadata_block_picture + $flac = new getid3_flac($this->getid3); + $flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value'])); + $flac->parsePICTURE(); + $info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0]; + unset($flac); + + } elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') { + + $data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']); + $this->notice('Found deprecated COVERART tag, it should be replaced in honor of METADATA_BLOCK_PICTURE structure'); + /** @todo use 'coverartmime' where available */ + $imageinfo = getid3_lib::GetDataImageSize($data); + if ($imageinfo === false || !isset($imageinfo['mime'])) { + $this->warning('COVERART vorbiscomment tag contains invalid image'); + continue; + } + + $ogg = new self($this->getid3); + $ogg->setStringMode($data); + $info['ogg']['comments']['picture'][] = array( + 'image_mime' => $imageinfo['mime'], + 'datalength' => strlen($data), + 'picturetype' => 'cover art', + 'image_height' => $imageinfo['height'], + 'image_width' => $imageinfo['width'], + 'data' => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']), + ); + unset($ogg); + + } else { + + $info['ogg']['comments'][strtolower($ThisFileInfo_ogg_comments_raw[$i]['key'])][] = $ThisFileInfo_ogg_comments_raw[$i]['value']; + + } + + } else { + + $this->warning('[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring); + + } + unset($ThisFileInfo_ogg_comments_raw[$i]); + } + unset($ThisFileInfo_ogg_comments_raw); + + + // Replay Gain Adjustment + // http://privatewww.essex.ac.uk/~djmrob/replaygain/ + if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) { + foreach ($info['ogg']['comments'] as $index => $commentvalue) { + switch ($index) { + case 'rg_audiophile': + case 'replaygain_album_gain': + $info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0]; + unset($info['ogg']['comments'][$index]); + break; + + case 'rg_radio': + case 'replaygain_track_gain': + $info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0]; + unset($info['ogg']['comments'][$index]); + break; + + case 'replaygain_album_peak': + $info['replay_gain']['album']['peak'] = (double) $commentvalue[0]; + unset($info['ogg']['comments'][$index]); + break; + + case 'rg_peak': + case 'replaygain_track_peak': + $info['replay_gain']['track']['peak'] = (double) $commentvalue[0]; + unset($info['ogg']['comments'][$index]); + break; + + case 'replaygain_reference_loudness': + $info['replay_gain']['reference_volume'] = (double) $commentvalue[0]; + unset($info['ogg']['comments'][$index]); + break; + + default: + // do nothing + break; + } + } + } + + $this->fseek($OriginalOffset); + + return true; + } + + /** + * @param int $mode + * + * @return string|null + */ + public static function SpeexBandModeLookup($mode) { + static $SpeexBandModeLookup = array(); + if (empty($SpeexBandModeLookup)) { + $SpeexBandModeLookup[0] = 'narrow'; + $SpeexBandModeLookup[1] = 'wide'; + $SpeexBandModeLookup[2] = 'ultra-wide'; + } + return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null); + } + + /** + * @param array $OggInfoArray + * @param int $SegmentNumber + * + * @return int + */ + public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) { + $segmentlength = 0; + for ($i = 0; $i < $SegmentNumber; $i++) { + $segmentlength = 0; + foreach ($OggInfoArray['segment_table'] as $key => $value) { + $segmentlength += $value; + if ($value < 255) { + break; + } + } + } + return $segmentlength; + } + + /** + * @param int $nominal_bitrate + * + * @return float + */ + public static function get_quality_from_nominal_bitrate($nominal_bitrate) { + + // decrease precision + $nominal_bitrate = $nominal_bitrate / 1000; + + if ($nominal_bitrate < 128) { + // q-1 to q4 + $qval = ($nominal_bitrate - 64) / 16; + } elseif ($nominal_bitrate < 256) { + // q4 to q8 + $qval = $nominal_bitrate / 32; + } elseif ($nominal_bitrate < 320) { + // q8 to q9 + $qval = ($nominal_bitrate + 256) / 64; + } else { + // q9 to q10 + $qval = ($nominal_bitrate + 1300) / 180; + } + //return $qval; // 5.031324 + //return intval($qval); // 5 + return round($qval, 1); // 5 or 4.9 + } + + /** + * @param int $colorspace_id + * + * @return string|null + */ + public static function TheoraColorSpace($colorspace_id) { + // http://www.theora.org/doc/Theora.pdf (table 6.3) + static $TheoraColorSpaceLookup = array(); + if (empty($TheoraColorSpaceLookup)) { + $TheoraColorSpaceLookup[0] = 'Undefined'; + $TheoraColorSpaceLookup[1] = 'Rec. 470M'; + $TheoraColorSpaceLookup[2] = 'Rec. 470BG'; + $TheoraColorSpaceLookup[3] = 'Reserved'; + } + return (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null); + } + + /** + * @param int $pixelformat_id + * + * @return string|null + */ + public static function TheoraPixelFormat($pixelformat_id) { + // http://www.theora.org/doc/Theora.pdf (table 6.4) + static $TheoraPixelFormatLookup = array(); + if (empty($TheoraPixelFormatLookup)) { + $TheoraPixelFormatLookup[0] = '4:2:0'; + $TheoraPixelFormatLookup[1] = 'Reserved'; + $TheoraPixelFormatLookup[2] = '4:2:2'; + $TheoraPixelFormatLookup[3] = '4:4:4'; + } + return (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null); + } + +} diff --git a/wp-includes/ID3/module.tag.apetag.php b/wp-includes/ID3/module.tag.apetag.php new file mode 100644 index 0000000..d56fcba --- /dev/null +++ b/wp-includes/ID3/module.tag.apetag.php @@ -0,0 +1,448 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.tag.apetag.php // +// module for analyzing APE tags // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + +class getid3_apetag extends getid3_handler +{ + /** + * true: return full data for all attachments; + * false: return no data for all attachments; + * integer: return data for attachments <= than this; + * string: save as file to this directory. + * + * @var int|bool|string + */ + public $inline_attachments = true; + + public $overrideendoffset = 0; + + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + if (!getid3_lib::intValueSupported($info['filesize'])) { + $this->warning('Unable to check for APEtags because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); + return false; + } + + $id3v1tagsize = 128; + $apetagheadersize = 32; + $lyrics3tagsize = 10; + + if ($this->overrideendoffset == 0) { + + $this->fseek(0 - $id3v1tagsize - $apetagheadersize - $lyrics3tagsize, SEEK_END); + $APEfooterID3v1 = $this->fread($id3v1tagsize + $apetagheadersize + $lyrics3tagsize); + + //if (preg_match('/APETAGEX.{24}TAG.{125}$/i', $APEfooterID3v1)) { + if (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $id3v1tagsize - $apetagheadersize, 8) == 'APETAGEX') { + + // APE tag found before ID3v1 + $info['ape']['tag_offset_end'] = $info['filesize'] - $id3v1tagsize; + + //} elseif (preg_match('/APETAGEX.{24}$/i', $APEfooterID3v1)) { + } elseif (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $apetagheadersize, 8) == 'APETAGEX') { + + // APE tag found, no ID3v1 + $info['ape']['tag_offset_end'] = $info['filesize']; + + } + + } else { + + $this->fseek($this->overrideendoffset - $apetagheadersize); + if ($this->fread(8) == 'APETAGEX') { + $info['ape']['tag_offset_end'] = $this->overrideendoffset; + } + + } + if (!isset($info['ape']['tag_offset_end'])) { + + // APE tag not found + unset($info['ape']); + return false; + + } + + // shortcut + $thisfile_ape = &$info['ape']; + + $this->fseek($thisfile_ape['tag_offset_end'] - $apetagheadersize); + $APEfooterData = $this->fread(32); + if (!($thisfile_ape['footer'] = $this->parseAPEheaderFooter($APEfooterData))) { + $this->error('Error parsing APE footer at offset '.$thisfile_ape['tag_offset_end']); + return false; + } + + if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) { + $this->fseek($thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize'] - $apetagheadersize); + $thisfile_ape['tag_offset_start'] = $this->ftell(); + $APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize'] + $apetagheadersize); + } else { + $thisfile_ape['tag_offset_start'] = $thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize']; + $this->fseek($thisfile_ape['tag_offset_start']); + $APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize']); + } + $info['avdataend'] = $thisfile_ape['tag_offset_start']; + + if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] < $thisfile_ape['tag_offset_end'])) { + $this->warning('ID3v1 tag information ignored since it appears to be a false synch in APEtag data'); + unset($info['id3v1']); + foreach ($info['warning'] as $key => $value) { + if ($value == 'Some ID3v1 fields do not use NULL characters for padding') { + unset($info['warning'][$key]); + sort($info['warning']); + break; + } + } + } + + $offset = 0; + if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) { + if ($thisfile_ape['header'] = $this->parseAPEheaderFooter(substr($APEtagData, 0, $apetagheadersize))) { + $offset += $apetagheadersize; + } else { + $this->error('Error parsing APE header at offset '.$thisfile_ape['tag_offset_start']); + return false; + } + } + + // shortcut + $info['replay_gain'] = array(); + $thisfile_replaygain = &$info['replay_gain']; + + for ($i = 0; $i < $thisfile_ape['footer']['raw']['tag_items']; $i++) { + $value_size = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4)); + $offset += 4; + $item_flags = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4)); + $offset += 4; + if (strstr(substr($APEtagData, $offset), "\x00") === false) { + $this->error('Cannot find null-byte (0x00) separator between ItemKey #'.$i.' and value. ItemKey starts '.$offset.' bytes into the APE tag, at file offset '.($thisfile_ape['tag_offset_start'] + $offset)); + return false; + } + $ItemKeyLength = strpos($APEtagData, "\x00", $offset) - $offset; + $item_key = strtolower(substr($APEtagData, $offset, $ItemKeyLength)); + + // shortcut + $thisfile_ape['items'][$item_key] = array(); + $thisfile_ape_items_current = &$thisfile_ape['items'][$item_key]; + + $thisfile_ape_items_current['offset'] = $thisfile_ape['tag_offset_start'] + $offset; + + $offset += ($ItemKeyLength + 1); // skip 0x00 terminator + $thisfile_ape_items_current['data'] = substr($APEtagData, $offset, $value_size); + $offset += $value_size; + + $thisfile_ape_items_current['flags'] = $this->parseAPEtagFlags($item_flags); + switch ($thisfile_ape_items_current['flags']['item_contents_raw']) { + case 0: // UTF-8 + case 2: // Locator (URL, filename, etc), UTF-8 encoded + $thisfile_ape_items_current['data'] = explode("\x00", $thisfile_ape_items_current['data']); + break; + + case 1: // binary data + default: + break; + } + + switch (strtolower($item_key)) { + // http://wiki.hydrogenaud.io/index.php?title=ReplayGain#MP3Gain + case 'replaygain_track_gain': + if (preg_match('#^([\\-\\+][0-9\\.,]{8})( dB)?$#', $thisfile_ape_items_current['data'][0], $matches)) { + $thisfile_replaygain['track']['adjustment'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero! + $thisfile_replaygain['track']['originator'] = 'unspecified'; + } else { + $this->warning('MP3gainTrackGain value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); + } + break; + + case 'replaygain_track_peak': + if (preg_match('#^([0-9\\.,]{8})$#', $thisfile_ape_items_current['data'][0], $matches)) { + $thisfile_replaygain['track']['peak'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero! + $thisfile_replaygain['track']['originator'] = 'unspecified'; + if ($thisfile_replaygain['track']['peak'] <= 0) { + $this->warning('ReplayGain Track peak from APEtag appears invalid: '.$thisfile_replaygain['track']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")'); + } + } else { + $this->warning('MP3gainTrackPeak value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); + } + break; + + case 'replaygain_album_gain': + if (preg_match('#^([\\-\\+][0-9\\.,]{8})( dB)?$#', $thisfile_ape_items_current['data'][0], $matches)) { + $thisfile_replaygain['album']['adjustment'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero! + $thisfile_replaygain['album']['originator'] = 'unspecified'; + } else { + $this->warning('MP3gainAlbumGain value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); + } + break; + + case 'replaygain_album_peak': + if (preg_match('#^([0-9\\.,]{8})$#', $thisfile_ape_items_current['data'][0], $matches)) { + $thisfile_replaygain['album']['peak'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero! + $thisfile_replaygain['album']['originator'] = 'unspecified'; + if ($thisfile_replaygain['album']['peak'] <= 0) { + $this->warning('ReplayGain Album peak from APEtag appears invalid: '.$thisfile_replaygain['album']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")'); + } + } else { + $this->warning('MP3gainAlbumPeak value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); + } + break; + + case 'mp3gain_undo': + if (preg_match('#^[\\-\\+][0-9]{3},[\\-\\+][0-9]{3},[NW]$#', $thisfile_ape_items_current['data'][0])) { + list($mp3gain_undo_left, $mp3gain_undo_right, $mp3gain_undo_wrap) = explode(',', $thisfile_ape_items_current['data'][0]); + $thisfile_replaygain['mp3gain']['undo_left'] = intval($mp3gain_undo_left); + $thisfile_replaygain['mp3gain']['undo_right'] = intval($mp3gain_undo_right); + $thisfile_replaygain['mp3gain']['undo_wrap'] = (($mp3gain_undo_wrap == 'Y') ? true : false); + } else { + $this->warning('MP3gainUndo value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); + } + break; + + case 'mp3gain_minmax': + if (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) { + list($mp3gain_globalgain_min, $mp3gain_globalgain_max) = explode(',', $thisfile_ape_items_current['data'][0]); + $thisfile_replaygain['mp3gain']['globalgain_track_min'] = intval($mp3gain_globalgain_min); + $thisfile_replaygain['mp3gain']['globalgain_track_max'] = intval($mp3gain_globalgain_max); + } else { + $this->warning('MP3gainMinMax value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); + } + break; + + case 'mp3gain_album_minmax': + if (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) { + list($mp3gain_globalgain_album_min, $mp3gain_globalgain_album_max) = explode(',', $thisfile_ape_items_current['data'][0]); + $thisfile_replaygain['mp3gain']['globalgain_album_min'] = intval($mp3gain_globalgain_album_min); + $thisfile_replaygain['mp3gain']['globalgain_album_max'] = intval($mp3gain_globalgain_album_max); + } else { + $this->warning('MP3gainAlbumMinMax value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); + } + break; + + case 'tracknumber': + if (is_array($thisfile_ape_items_current['data'])) { + foreach ($thisfile_ape_items_current['data'] as $comment) { + $thisfile_ape['comments']['track_number'][] = $comment; + } + } + break; + + case 'cover art (artist)': + case 'cover art (back)': + case 'cover art (band logo)': + case 'cover art (band)': + case 'cover art (colored fish)': + case 'cover art (composer)': + case 'cover art (conductor)': + case 'cover art (front)': + case 'cover art (icon)': + case 'cover art (illustration)': + case 'cover art (lead)': + case 'cover art (leaflet)': + case 'cover art (lyricist)': + case 'cover art (media)': + case 'cover art (movie scene)': + case 'cover art (other icon)': + case 'cover art (other)': + case 'cover art (performance)': + case 'cover art (publisher logo)': + case 'cover art (recording)': + case 'cover art (studio)': + // list of possible cover arts from http://taglib-sharp.sourcearchive.com/documentation/2.0.3.0-2/Ape_2Tag_8cs-source.html + if (is_array($thisfile_ape_items_current['data'])) { + $this->warning('APEtag "'.$item_key.'" should be flagged as Binary data, but was incorrectly flagged as UTF-8'); + $thisfile_ape_items_current['data'] = implode("\x00", $thisfile_ape_items_current['data']); + } + list($thisfile_ape_items_current['filename'], $thisfile_ape_items_current['data']) = explode("\x00", $thisfile_ape_items_current['data'], 2); + $thisfile_ape_items_current['data_offset'] = $thisfile_ape_items_current['offset'] + strlen($thisfile_ape_items_current['filename']."\x00"); + $thisfile_ape_items_current['data_length'] = strlen($thisfile_ape_items_current['data']); + + do { + $thisfile_ape_items_current['image_mime'] = ''; + $imageinfo = array(); + $imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_ape_items_current['data'], $imageinfo); + if (($imagechunkcheck === false) || !isset($imagechunkcheck[2])) { + $this->warning('APEtag "'.$item_key.'" contains invalid image data'); + break; + } + $thisfile_ape_items_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); + + if ($this->inline_attachments === false) { + // skip entirely + unset($thisfile_ape_items_current['data']); + break; + } + if ($this->inline_attachments === true) { + // great + } elseif (is_int($this->inline_attachments)) { + if ($this->inline_attachments < $thisfile_ape_items_current['data_length']) { + // too big, skip + $this->warning('attachment at '.$thisfile_ape_items_current['offset'].' is too large to process inline ('.number_format($thisfile_ape_items_current['data_length']).' bytes)'); + unset($thisfile_ape_items_current['data']); + break; + } + } elseif (is_string($this->inline_attachments)) { + $this->inline_attachments = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->inline_attachments), DIRECTORY_SEPARATOR); + if (!is_dir($this->inline_attachments) || !getID3::is_writable($this->inline_attachments)) { + // cannot write, skip + $this->warning('attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to "'.$this->inline_attachments.'" (not writable)'); + unset($thisfile_ape_items_current['data']); + break; + } + } + // if we get this far, must be OK + if (is_string($this->inline_attachments)) { + $destination_filename = $this->inline_attachments.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$thisfile_ape_items_current['data_offset']; + if (!file_exists($destination_filename) || getID3::is_writable($destination_filename)) { + file_put_contents($destination_filename, $thisfile_ape_items_current['data']); + } else { + $this->warning('attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to "'.$destination_filename.'" (not writable)'); + } + $thisfile_ape_items_current['data_filename'] = $destination_filename; + unset($thisfile_ape_items_current['data']); + } else { + if (!isset($info['ape']['comments']['picture'])) { + $info['ape']['comments']['picture'] = array(); + } + $comments_picture_data = array(); + foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { + if (isset($thisfile_ape_items_current[$picture_key])) { + $comments_picture_data[$picture_key] = $thisfile_ape_items_current[$picture_key]; + } + } + $info['ape']['comments']['picture'][] = $comments_picture_data; + unset($comments_picture_data); + } + } while (false); + break; + + default: + if (is_array($thisfile_ape_items_current['data'])) { + foreach ($thisfile_ape_items_current['data'] as $comment) { + $thisfile_ape['comments'][strtolower($item_key)][] = $comment; + } + } + break; + } + + } + if (empty($thisfile_replaygain)) { + unset($info['replay_gain']); + } + return true; + } + + /** + * @param string $APEheaderFooterData + * + * @return array|false + */ + public function parseAPEheaderFooter($APEheaderFooterData) { + // http://www.uni-jena.de/~pfk/mpp/sv8/apeheader.html + + // shortcut + $headerfooterinfo['raw'] = array(); + $headerfooterinfo_raw = &$headerfooterinfo['raw']; + + $headerfooterinfo_raw['footer_tag'] = substr($APEheaderFooterData, 0, 8); + if ($headerfooterinfo_raw['footer_tag'] != 'APETAGEX') { + return false; + } + $headerfooterinfo_raw['version'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 8, 4)); + $headerfooterinfo_raw['tagsize'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 12, 4)); + $headerfooterinfo_raw['tag_items'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 16, 4)); + $headerfooterinfo_raw['global_flags'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 20, 4)); + $headerfooterinfo_raw['reserved'] = substr($APEheaderFooterData, 24, 8); + + $headerfooterinfo['tag_version'] = $headerfooterinfo_raw['version'] / 1000; + if ($headerfooterinfo['tag_version'] >= 2) { + $headerfooterinfo['flags'] = $this->parseAPEtagFlags($headerfooterinfo_raw['global_flags']); + } + return $headerfooterinfo; + } + + /** + * @param int $rawflagint + * + * @return array + */ + public function parseAPEtagFlags($rawflagint) { + // "Note: APE Tags 1.0 do not use any of the APE Tag flags. + // All are set to zero on creation and ignored on reading." + // http://wiki.hydrogenaud.io/index.php?title=Ape_Tags_Flags + $flags['header'] = (bool) ($rawflagint & 0x80000000); + $flags['footer'] = (bool) ($rawflagint & 0x40000000); + $flags['this_is_header'] = (bool) ($rawflagint & 0x20000000); + $flags['item_contents_raw'] = ($rawflagint & 0x00000006) >> 1; + $flags['read_only'] = (bool) ($rawflagint & 0x00000001); + + $flags['item_contents'] = $this->APEcontentTypeFlagLookup($flags['item_contents_raw']); + + return $flags; + } + + /** + * @param int $contenttypeid + * + * @return string + */ + public function APEcontentTypeFlagLookup($contenttypeid) { + static $APEcontentTypeFlagLookup = array( + 0 => 'utf-8', + 1 => 'binary', + 2 => 'external', + 3 => 'reserved' + ); + return (isset($APEcontentTypeFlagLookup[$contenttypeid]) ? $APEcontentTypeFlagLookup[$contenttypeid] : 'invalid'); + } + + /** + * @param string $itemkey + * + * @return bool + */ + public function APEtagItemIsUTF8Lookup($itemkey) { + static $APEtagItemIsUTF8Lookup = array( + 'title', + 'subtitle', + 'artist', + 'album', + 'debut album', + 'publisher', + 'conductor', + 'track', + 'composer', + 'comment', + 'copyright', + 'publicationright', + 'file', + 'year', + 'record date', + 'record location', + 'genre', + 'media', + 'related', + 'isrc', + 'abstract', + 'language', + 'bibliography' + ); + return in_array(strtolower($itemkey), $APEtagItemIsUTF8Lookup); + } + +} diff --git a/wp-includes/ID3/module.tag.id3v1.php b/wp-includes/ID3/module.tag.id3v1.php new file mode 100644 index 0000000..0084838 --- /dev/null +++ b/wp-includes/ID3/module.tag.id3v1.php @@ -0,0 +1,421 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +// // +// module.tag.id3v1.php // +// module for analyzing ID3v1 tags // +// dependencies: NONE // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_id3v1 extends getid3_handler +{ + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + if (!getid3_lib::intValueSupported($info['filesize'])) { + $this->warning('Unable to check for ID3v1 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); + return false; + } + + $this->fseek(-256, SEEK_END); + $preid3v1 = $this->fread(128); + $id3v1tag = $this->fread(128); + + if (substr($id3v1tag, 0, 3) == 'TAG') { + + $info['avdataend'] = $info['filesize'] - 128; + + $ParsedID3v1['title'] = $this->cutfield(substr($id3v1tag, 3, 30)); + $ParsedID3v1['artist'] = $this->cutfield(substr($id3v1tag, 33, 30)); + $ParsedID3v1['album'] = $this->cutfield(substr($id3v1tag, 63, 30)); + $ParsedID3v1['year'] = $this->cutfield(substr($id3v1tag, 93, 4)); + $ParsedID3v1['comment'] = substr($id3v1tag, 97, 30); // can't remove nulls yet, track detection depends on them + $ParsedID3v1['genreid'] = ord(substr($id3v1tag, 127, 1)); + + // If second-last byte of comment field is null and last byte of comment field is non-null + // then this is ID3v1.1 and the comment field is 28 bytes long and the 30th byte is the track number + if (($id3v1tag[125] === "\x00") && ($id3v1tag[126] !== "\x00")) { + $ParsedID3v1['track_number'] = ord(substr($ParsedID3v1['comment'], 29, 1)); + $ParsedID3v1['comment'] = substr($ParsedID3v1['comment'], 0, 28); + } + $ParsedID3v1['comment'] = $this->cutfield($ParsedID3v1['comment']); + + $ParsedID3v1['genre'] = $this->LookupGenreName($ParsedID3v1['genreid']); + if (!empty($ParsedID3v1['genre'])) { + unset($ParsedID3v1['genreid']); + } + if (isset($ParsedID3v1['genre']) && (empty($ParsedID3v1['genre']) || ($ParsedID3v1['genre'] == 'Unknown'))) { + unset($ParsedID3v1['genre']); + } + + foreach ($ParsedID3v1 as $key => $value) { + $ParsedID3v1['comments'][$key][0] = $value; + } + // ID3v1 encoding detection hack START + // ID3v1 is defined as always using ISO-8859-1 encoding, but it is not uncommon to find files tagged with ID3v1 using Windows-1251 or other character sets + // Since ID3v1 has no concept of character sets there is no certain way to know we have the correct non-ISO-8859-1 character set, but we can guess + $ID3v1encoding = 'ISO-8859-1'; + foreach ($ParsedID3v1['comments'] as $tag_key => $valuearray) { + foreach ($valuearray as $key => $value) { + if (preg_match('#^[\\x00-\\x40\\xA8\\xB8\\x80-\\xFF]+$#', $value)) { + foreach (array('Windows-1251', 'KOI8-R') as $id3v1_bad_encoding) { + if (function_exists('mb_convert_encoding') && @mb_convert_encoding($value, $id3v1_bad_encoding, $id3v1_bad_encoding) === $value) { + $ID3v1encoding = $id3v1_bad_encoding; + break 3; + } elseif (function_exists('iconv') && @iconv($id3v1_bad_encoding, $id3v1_bad_encoding, $value) === $value) { + $ID3v1encoding = $id3v1_bad_encoding; + break 3; + } + } + } + } + } + // ID3v1 encoding detection hack END + + // ID3v1 data is supposed to be padded with NULL characters, but some taggers pad with spaces + $GoodFormatID3v1tag = $this->GenerateID3v1Tag( + $ParsedID3v1['title'], + $ParsedID3v1['artist'], + $ParsedID3v1['album'], + $ParsedID3v1['year'], + (isset($ParsedID3v1['genre']) ? $this->LookupGenreID($ParsedID3v1['genre']) : false), + $ParsedID3v1['comment'], + (!empty($ParsedID3v1['track_number']) ? $ParsedID3v1['track_number'] : '')); + $ParsedID3v1['padding_valid'] = true; + if ($id3v1tag !== $GoodFormatID3v1tag) { + $ParsedID3v1['padding_valid'] = false; + $this->warning('Some ID3v1 fields do not use NULL characters for padding'); + } + + $ParsedID3v1['tag_offset_end'] = $info['filesize']; + $ParsedID3v1['tag_offset_start'] = $ParsedID3v1['tag_offset_end'] - 128; + + $info['id3v1'] = $ParsedID3v1; + $info['id3v1']['encoding'] = $ID3v1encoding; + } + + if (substr($preid3v1, 0, 3) == 'TAG') { + // The way iTunes handles tags is, well, brain-damaged. + // It completely ignores v1 if ID3v2 is present. + // This goes as far as adding a new v1 tag *even if there already is one* + + // A suspected double-ID3v1 tag has been detected, but it could be that + // the "TAG" identifier is a legitimate part of an APE or Lyrics3 tag + if (substr($preid3v1, 96, 8) == 'APETAGEX') { + // an APE tag footer was found before the last ID3v1, assume false "TAG" synch + } elseif (substr($preid3v1, 119, 6) == 'LYRICS') { + // a Lyrics3 tag footer was found before the last ID3v1, assume false "TAG" synch + } else { + // APE and Lyrics3 footers not found - assume double ID3v1 + $this->warning('Duplicate ID3v1 tag detected - this has been known to happen with iTunes'); + $info['avdataend'] -= 128; + } + } + + return true; + } + + /** + * @param string $str + * + * @return string + */ + public static function cutfield($str) { + return trim(substr($str, 0, strcspn($str, "\x00"))); + } + + /** + * @param bool $allowSCMPXextended + * + * @return string[] + */ + public static function ArrayOfGenres($allowSCMPXextended=false) { + static $GenreLookup = array( + 0 => 'Blues', + 1 => 'Classic Rock', + 2 => 'Country', + 3 => 'Dance', + 4 => 'Disco', + 5 => 'Funk', + 6 => 'Grunge', + 7 => 'Hip-Hop', + 8 => 'Jazz', + 9 => 'Metal', + 10 => 'New Age', + 11 => 'Oldies', + 12 => 'Other', + 13 => 'Pop', + 14 => 'R&B', + 15 => 'Rap', + 16 => 'Reggae', + 17 => 'Rock', + 18 => 'Techno', + 19 => 'Industrial', + 20 => 'Alternative', + 21 => 'Ska', + 22 => 'Death Metal', + 23 => 'Pranks', + 24 => 'Soundtrack', + 25 => 'Euro-Techno', + 26 => 'Ambient', + 27 => 'Trip-Hop', + 28 => 'Vocal', + 29 => 'Jazz+Funk', + 30 => 'Fusion', + 31 => 'Trance', + 32 => 'Classical', + 33 => 'Instrumental', + 34 => 'Acid', + 35 => 'House', + 36 => 'Game', + 37 => 'Sound Clip', + 38 => 'Gospel', + 39 => 'Noise', + 40 => 'Alt. Rock', + 41 => 'Bass', + 42 => 'Soul', + 43 => 'Punk', + 44 => 'Space', + 45 => 'Meditative', + 46 => 'Instrumental Pop', + 47 => 'Instrumental Rock', + 48 => 'Ethnic', + 49 => 'Gothic', + 50 => 'Darkwave', + 51 => 'Techno-Industrial', + 52 => 'Electronic', + 53 => 'Pop-Folk', + 54 => 'Eurodance', + 55 => 'Dream', + 56 => 'Southern Rock', + 57 => 'Comedy', + 58 => 'Cult', + 59 => 'Gangsta Rap', + 60 => 'Top 40', + 61 => 'Christian Rap', + 62 => 'Pop/Funk', + 63 => 'Jungle', + 64 => 'Native American', + 65 => 'Cabaret', + 66 => 'New Wave', + 67 => 'Psychedelic', + 68 => 'Rave', + 69 => 'Showtunes', + 70 => 'Trailer', + 71 => 'Lo-Fi', + 72 => 'Tribal', + 73 => 'Acid Punk', + 74 => 'Acid Jazz', + 75 => 'Polka', + 76 => 'Retro', + 77 => 'Musical', + 78 => 'Rock & Roll', + 79 => 'Hard Rock', + 80 => 'Folk', + 81 => 'Folk/Rock', + 82 => 'National Folk', + 83 => 'Swing', + 84 => 'Fast-Fusion', + 85 => 'Bebob', + 86 => 'Latin', + 87 => 'Revival', + 88 => 'Celtic', + 89 => 'Bluegrass', + 90 => 'Avantgarde', + 91 => 'Gothic Rock', + 92 => 'Progressive Rock', + 93 => 'Psychedelic Rock', + 94 => 'Symphonic Rock', + 95 => 'Slow Rock', + 96 => 'Big Band', + 97 => 'Chorus', + 98 => 'Easy Listening', + 99 => 'Acoustic', + 100 => 'Humour', + 101 => 'Speech', + 102 => 'Chanson', + 103 => 'Opera', + 104 => 'Chamber Music', + 105 => 'Sonata', + 106 => 'Symphony', + 107 => 'Booty Bass', + 108 => 'Primus', + 109 => 'Porn Groove', + 110 => 'Satire', + 111 => 'Slow Jam', + 112 => 'Club', + 113 => 'Tango', + 114 => 'Samba', + 115 => 'Folklore', + 116 => 'Ballad', + 117 => 'Power Ballad', + 118 => 'Rhythmic Soul', + 119 => 'Freestyle', + 120 => 'Duet', + 121 => 'Punk Rock', + 122 => 'Drum Solo', + 123 => 'A Cappella', + 124 => 'Euro-House', + 125 => 'Dance Hall', + 126 => 'Goa', + 127 => 'Drum & Bass', + 128 => 'Club-House', + 129 => 'Hardcore', + 130 => 'Terror', + 131 => 'Indie', + 132 => 'BritPop', + 133 => 'Negerpunk', + 134 => 'Polsk Punk', + 135 => 'Beat', + 136 => 'Christian Gangsta Rap', + 137 => 'Heavy Metal', + 138 => 'Black Metal', + 139 => 'Crossover', + 140 => 'Contemporary Christian', + 141 => 'Christian Rock', + 142 => 'Merengue', + 143 => 'Salsa', + 144 => 'Thrash Metal', + 145 => 'Anime', + 146 => 'JPop', + 147 => 'Synthpop', + + 255 => 'Unknown', + + 'CR' => 'Cover', + 'RX' => 'Remix' + ); + + static $GenreLookupSCMPX = array(); + if ($allowSCMPXextended && empty($GenreLookupSCMPX)) { + $GenreLookupSCMPX = $GenreLookup; + // http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended + // Extended ID3v1 genres invented by SCMPX + // Note that 255 "Japanese Anime" conflicts with standard "Unknown" + $GenreLookupSCMPX[240] = 'Sacred'; + $GenreLookupSCMPX[241] = 'Northern Europe'; + $GenreLookupSCMPX[242] = 'Irish & Scottish'; + $GenreLookupSCMPX[243] = 'Scotland'; + $GenreLookupSCMPX[244] = 'Ethnic Europe'; + $GenreLookupSCMPX[245] = 'Enka'; + $GenreLookupSCMPX[246] = 'Children\'s Song'; + $GenreLookupSCMPX[247] = 'Japanese Sky'; + $GenreLookupSCMPX[248] = 'Japanese Heavy Rock'; + $GenreLookupSCMPX[249] = 'Japanese Doom Rock'; + $GenreLookupSCMPX[250] = 'Japanese J-POP'; + $GenreLookupSCMPX[251] = 'Japanese Seiyu'; + $GenreLookupSCMPX[252] = 'Japanese Ambient Techno'; + $GenreLookupSCMPX[253] = 'Japanese Moemoe'; + $GenreLookupSCMPX[254] = 'Japanese Tokusatsu'; + //$GenreLookupSCMPX[255] = 'Japanese Anime'; + } + + return ($allowSCMPXextended ? $GenreLookupSCMPX : $GenreLookup); + } + + /** + * @param string $genreid + * @param bool $allowSCMPXextended + * + * @return string|false + */ + public static function LookupGenreName($genreid, $allowSCMPXextended=true) { + switch ($genreid) { + case 'RX': + case 'CR': + break; + default: + if (!is_numeric($genreid)) { + return false; + } + $genreid = intval($genreid); // to handle 3 or '3' or '03' + break; + } + $GenreLookup = self::ArrayOfGenres($allowSCMPXextended); + return (isset($GenreLookup[$genreid]) ? $GenreLookup[$genreid] : false); + } + + /** + * @param string $genre + * @param bool $allowSCMPXextended + * + * @return string|false + */ + public static function LookupGenreID($genre, $allowSCMPXextended=false) { + $GenreLookup = self::ArrayOfGenres($allowSCMPXextended); + $LowerCaseNoSpaceSearchTerm = strtolower(str_replace(' ', '', $genre)); + foreach ($GenreLookup as $key => $value) { + if (strtolower(str_replace(' ', '', $value)) == $LowerCaseNoSpaceSearchTerm) { + return $key; + } + } + return false; + } + + /** + * @param string $OriginalGenre + * + * @return string|false + */ + public static function StandardiseID3v1GenreName($OriginalGenre) { + if (($GenreID = self::LookupGenreID($OriginalGenre)) !== false) { + return self::LookupGenreName($GenreID); + } + return $OriginalGenre; + } + + /** + * @param string $title + * @param string $artist + * @param string $album + * @param string $year + * @param int $genreid + * @param string $comment + * @param int|string $track + * + * @return string + */ + public static function GenerateID3v1Tag($title, $artist, $album, $year, $genreid, $comment, $track='') { + $ID3v1Tag = 'TAG'; + $ID3v1Tag .= str_pad(trim(substr($title, 0, 30)), 30, "\x00", STR_PAD_RIGHT); + $ID3v1Tag .= str_pad(trim(substr($artist, 0, 30)), 30, "\x00", STR_PAD_RIGHT); + $ID3v1Tag .= str_pad(trim(substr($album, 0, 30)), 30, "\x00", STR_PAD_RIGHT); + $ID3v1Tag .= str_pad(trim(substr($year, 0, 4)), 4, "\x00", STR_PAD_LEFT); + if (!empty($track) && ($track > 0) && ($track <= 255)) { + $ID3v1Tag .= str_pad(trim(substr($comment, 0, 28)), 28, "\x00", STR_PAD_RIGHT); + $ID3v1Tag .= "\x00"; + if (gettype($track) == 'string') { + $track = (int) $track; + } + $ID3v1Tag .= chr($track); + } else { + $ID3v1Tag .= str_pad(trim(substr($comment, 0, 30)), 30, "\x00", STR_PAD_RIGHT); + } + if (($genreid < 0) || ($genreid > 147)) { + $genreid = 255; // 'unknown' genre + } + switch (gettype($genreid)) { + case 'string': + case 'integer': + $ID3v1Tag .= chr(intval($genreid)); + break; + default: + $ID3v1Tag .= chr(255); // 'unknown' genre + break; + } + + return $ID3v1Tag; + } + +} diff --git a/wp-includes/ID3/module.tag.id3v2.php b/wp-includes/ID3/module.tag.id3v2.php new file mode 100644 index 0000000..0c7c34b --- /dev/null +++ b/wp-includes/ID3/module.tag.id3v2.php @@ -0,0 +1,3891 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +/// // +// module.tag.id3v2.php // +// module for analyzing ID3v2 tags // +// dependencies: module.tag.id3v1.php // +// /// +///////////////////////////////////////////////////////////////// + +getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); + +class getid3_id3v2 extends getid3_handler +{ + public $StartingOffset = 0; + + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + // Overall tag structure: + // +-----------------------------+ + // | Header (10 bytes) | + // +-----------------------------+ + // | Extended Header | + // | (variable length, OPTIONAL) | + // +-----------------------------+ + // | Frames (variable length) | + // +-----------------------------+ + // | Padding | + // | (variable length, OPTIONAL) | + // +-----------------------------+ + // | Footer (10 bytes, OPTIONAL) | + // +-----------------------------+ + + // Header + // ID3v2/file identifier "ID3" + // ID3v2 version $04 00 + // ID3v2 flags (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x) + // ID3v2 size 4 * %0xxxxxxx + + + // shortcuts + $info['id3v2']['header'] = true; + $thisfile_id3v2 = &$info['id3v2']; + $thisfile_id3v2['flags'] = array(); + $thisfile_id3v2_flags = &$thisfile_id3v2['flags']; + + + $this->fseek($this->StartingOffset); + $header = $this->fread(10); + if (substr($header, 0, 3) == 'ID3' && strlen($header) == 10) { + + $thisfile_id3v2['majorversion'] = ord($header[3]); + $thisfile_id3v2['minorversion'] = ord($header[4]); + + // shortcut + $id3v2_majorversion = &$thisfile_id3v2['majorversion']; + + } else { + + unset($info['id3v2']); + return false; + + } + + if ($id3v2_majorversion > 4) { // this script probably won't correctly parse ID3v2.5.x and above (if it ever exists) + + $this->error('this script only parses up to ID3v2.4.x - this tag is ID3v2.'.$id3v2_majorversion.'.'.$thisfile_id3v2['minorversion']); + return false; + + } + + $id3_flags = ord($header[5]); + switch ($id3v2_majorversion) { + case 2: + // %ab000000 in v2.2 + $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation + $thisfile_id3v2_flags['compression'] = (bool) ($id3_flags & 0x40); // b - Compression + break; + + case 3: + // %abc00000 in v2.3 + $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation + $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header + $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator + break; + + case 4: + // %abcd0000 in v2.4 + $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation + $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header + $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator + $thisfile_id3v2_flags['isfooter'] = (bool) ($id3_flags & 0x10); // d - Footer present + break; + } + + $thisfile_id3v2['headerlength'] = getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length + + $thisfile_id3v2['tag_offset_start'] = $this->StartingOffset; + $thisfile_id3v2['tag_offset_end'] = $thisfile_id3v2['tag_offset_start'] + $thisfile_id3v2['headerlength']; + + + + // create 'encoding' key - used by getid3::HandleAllTags() + // in ID3v2 every field can have it's own encoding type + // so force everything to UTF-8 so it can be handled consistantly + $thisfile_id3v2['encoding'] = 'UTF-8'; + + + // Frames + + // All ID3v2 frames consists of one frame header followed by one or more + // fields containing the actual information. The header is always 10 + // bytes and laid out as follows: + // + // Frame ID $xx xx xx xx (four characters) + // Size 4 * %0xxxxxxx + // Flags $xx xx + + $sizeofframes = $thisfile_id3v2['headerlength'] - 10; // not including 10-byte initial header + if (!empty($thisfile_id3v2['exthead']['length'])) { + $sizeofframes -= ($thisfile_id3v2['exthead']['length'] + 4); + } + if (!empty($thisfile_id3v2_flags['isfooter'])) { + $sizeofframes -= 10; // footer takes last 10 bytes of ID3v2 header, after frame data, before audio + } + if ($sizeofframes > 0) { + + $framedata = $this->fread($sizeofframes); // read all frames from file into $framedata variable + + // if entire frame data is unsynched, de-unsynch it now (ID3v2.3.x) + if (!empty($thisfile_id3v2_flags['unsynch']) && ($id3v2_majorversion <= 3)) { + $framedata = $this->DeUnsynchronise($framedata); + } + // [in ID3v2.4.0] Unsynchronisation [S:6.1] is done on frame level, instead + // of on tag level, making it easier to skip frames, increasing the streamability + // of the tag. The unsynchronisation flag in the header [S:3.1] indicates that + // there exists an unsynchronised frame, while the new unsynchronisation flag in + // the frame header [S:4.1.2] indicates unsynchronisation. + + + //$framedataoffset = 10 + ($thisfile_id3v2['exthead']['length'] ? $thisfile_id3v2['exthead']['length'] + 4 : 0); // how many bytes into the stream - start from after the 10-byte header (and extended header length+4, if present) + $framedataoffset = 10; // how many bytes into the stream - start from after the 10-byte header + + + // Extended Header + if (!empty($thisfile_id3v2_flags['exthead'])) { + $extended_header_offset = 0; + + if ($id3v2_majorversion == 3) { + + // v2.3 definition: + //Extended header size $xx xx xx xx // 32-bit integer + //Extended Flags $xx xx + // %x0000000 %00000000 // v2.3 + // x - CRC data present + //Size of padding $xx xx xx xx + + $thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), 0); + $extended_header_offset += 4; + + $thisfile_id3v2['exthead']['flag_bytes'] = 2; + $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes'])); + $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes']; + + $thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x8000); + + $thisfile_id3v2['exthead']['padding_size'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4)); + $extended_header_offset += 4; + + if ($thisfile_id3v2['exthead']['flags']['crc']) { + $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4)); + $extended_header_offset += 4; + } + $extended_header_offset += $thisfile_id3v2['exthead']['padding_size']; + + } elseif ($id3v2_majorversion == 4) { + + // v2.4 definition: + //Extended header size 4 * %0xxxxxxx // 28-bit synchsafe integer + //Number of flag bytes $01 + //Extended Flags $xx + // %0bcd0000 // v2.4 + // b - Tag is an update + // Flag data length $00 + // c - CRC data present + // Flag data length $05 + // Total frame CRC 5 * %0xxxxxxx + // d - Tag restrictions + // Flag data length $01 + + $thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), true); + $extended_header_offset += 4; + + $thisfile_id3v2['exthead']['flag_bytes'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should always be 1 + $extended_header_offset += 1; + + $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes'])); + $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes']; + + $thisfile_id3v2['exthead']['flags']['update'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x40); + $thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x20); + $thisfile_id3v2['exthead']['flags']['restrictions'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x10); + + if ($thisfile_id3v2['exthead']['flags']['update']) { + $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 0 + $extended_header_offset += 1; + } + + if ($thisfile_id3v2['exthead']['flags']['crc']) { + $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 5 + $extended_header_offset += 1; + $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $ext_header_chunk_length), true, false); + $extended_header_offset += $ext_header_chunk_length; + } + + if ($thisfile_id3v2['exthead']['flags']['restrictions']) { + $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 1 + $extended_header_offset += 1; + + // %ppqrrstt + $restrictions_raw = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); + $extended_header_offset += 1; + $thisfile_id3v2['exthead']['flags']['restrictions']['tagsize'] = ($restrictions_raw & 0xC0) >> 6; // p - Tag size restrictions + $thisfile_id3v2['exthead']['flags']['restrictions']['textenc'] = ($restrictions_raw & 0x20) >> 5; // q - Text encoding restrictions + $thisfile_id3v2['exthead']['flags']['restrictions']['textsize'] = ($restrictions_raw & 0x18) >> 3; // r - Text fields size restrictions + $thisfile_id3v2['exthead']['flags']['restrictions']['imgenc'] = ($restrictions_raw & 0x04) >> 2; // s - Image encoding restrictions + $thisfile_id3v2['exthead']['flags']['restrictions']['imgsize'] = ($restrictions_raw & 0x03) >> 0; // t - Image size restrictions + + $thisfile_id3v2['exthead']['flags']['restrictions_text']['tagsize'] = $this->LookupExtendedHeaderRestrictionsTagSizeLimits($thisfile_id3v2['exthead']['flags']['restrictions']['tagsize']); + $thisfile_id3v2['exthead']['flags']['restrictions_text']['textenc'] = $this->LookupExtendedHeaderRestrictionsTextEncodings($thisfile_id3v2['exthead']['flags']['restrictions']['textenc']); + $thisfile_id3v2['exthead']['flags']['restrictions_text']['textsize'] = $this->LookupExtendedHeaderRestrictionsTextFieldSize($thisfile_id3v2['exthead']['flags']['restrictions']['textsize']); + $thisfile_id3v2['exthead']['flags']['restrictions_text']['imgenc'] = $this->LookupExtendedHeaderRestrictionsImageEncoding($thisfile_id3v2['exthead']['flags']['restrictions']['imgenc']); + $thisfile_id3v2['exthead']['flags']['restrictions_text']['imgsize'] = $this->LookupExtendedHeaderRestrictionsImageSizeSize($thisfile_id3v2['exthead']['flags']['restrictions']['imgsize']); + } + + if ($thisfile_id3v2['exthead']['length'] != $extended_header_offset) { + $this->warning('ID3v2.4 extended header length mismatch (expecting '.intval($thisfile_id3v2['exthead']['length']).', found '.intval($extended_header_offset).')'); + } + } + + $framedataoffset += $extended_header_offset; + $framedata = substr($framedata, $extended_header_offset); + } // end extended header + + + while (isset($framedata) && (strlen($framedata) > 0)) { // cycle through until no more frame data is left to parse + if (strlen($framedata) <= $this->ID3v2HeaderLength($id3v2_majorversion)) { + // insufficient room left in ID3v2 header for actual data - must be padding + $thisfile_id3v2['padding']['start'] = $framedataoffset; + $thisfile_id3v2['padding']['length'] = strlen($framedata); + $thisfile_id3v2['padding']['valid'] = true; + for ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) { + if ($framedata[$i] != "\x00") { + $thisfile_id3v2['padding']['valid'] = false; + $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; + $this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'); + break; + } + } + break; // skip rest of ID3v2 header + } + $frame_header = null; + $frame_name = null; + $frame_size = null; + $frame_flags = null; + if ($id3v2_majorversion == 2) { + // Frame ID $xx xx xx (three characters) + // Size $xx xx xx (24-bit integer) + // Flags $xx xx + + $frame_header = substr($framedata, 0, 6); // take next 6 bytes for header + $framedata = substr($framedata, 6); // and leave the rest in $framedata + $frame_name = substr($frame_header, 0, 3); + $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 3, 3), 0); + $frame_flags = 0; // not used for anything in ID3v2.2, just set to avoid E_NOTICEs + + } elseif ($id3v2_majorversion > 2) { + + // Frame ID $xx xx xx xx (four characters) + // Size $xx xx xx xx (32-bit integer in v2.3, 28-bit synchsafe in v2.4+) + // Flags $xx xx + + $frame_header = substr($framedata, 0, 10); // take next 10 bytes for header + $framedata = substr($framedata, 10); // and leave the rest in $framedata + + $frame_name = substr($frame_header, 0, 4); + if ($id3v2_majorversion == 3) { + $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer + } else { // ID3v2.4+ + $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 1); // 32-bit synchsafe integer (28-bit value) + } + + if ($frame_size < (strlen($framedata) + 4)) { + $nextFrameID = substr($framedata, $frame_size, 4); + if ($this->IsValidID3v2FrameName($nextFrameID, $id3v2_majorversion)) { + // next frame is OK + } elseif (($frame_name == "\x00".'MP3') || ($frame_name == "\x00\x00".'MP') || ($frame_name == ' MP3') || ($frame_name == 'MP3e')) { + // MP3ext known broken frames - "ok" for the purposes of this test + } elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) { + $this->warning('ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of (Helium2; iTunes) are known culprits of this. Tag has been parsed as ID3v2.3'); + $id3v2_majorversion = 3; + $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer + } + } + + + $frame_flags = getid3_lib::BigEndian2Int(substr($frame_header, 8, 2)); + } + + if ((($id3v2_majorversion == 2) && ($frame_name == "\x00\x00\x00")) || ($frame_name == "\x00\x00\x00\x00")) { + // padding encountered + + $thisfile_id3v2['padding']['start'] = $framedataoffset; + $thisfile_id3v2['padding']['length'] = strlen($frame_header) + strlen($framedata); + $thisfile_id3v2['padding']['valid'] = true; + + $len = strlen($framedata); + for ($i = 0; $i < $len; $i++) { + if ($framedata[$i] != "\x00") { + $thisfile_id3v2['padding']['valid'] = false; + $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; + $this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'); + break; + } + } + break; // skip rest of ID3v2 header + } + + if ($iTunesBrokenFrameNameFixed = self::ID3v22iTunesBrokenFrameName($frame_name)) { + $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1", "v7.0.0.70" are known-guilty, probably others too)]. Translated frame name from "'.str_replace("\x00", ' ', $frame_name).'" to "'.$iTunesBrokenFrameNameFixed.'" for parsing.'); + $frame_name = $iTunesBrokenFrameNameFixed; + } + if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) { + + unset($parsedFrame); + $parsedFrame['frame_name'] = $frame_name; + $parsedFrame['frame_flags_raw'] = $frame_flags; + $parsedFrame['data'] = substr($framedata, 0, $frame_size); + $parsedFrame['datalength'] = getid3_lib::CastAsInt($frame_size); + $parsedFrame['dataoffset'] = $framedataoffset; + + $this->ParseID3v2Frame($parsedFrame); + $thisfile_id3v2[$frame_name][] = $parsedFrame; + + $framedata = substr($framedata, $frame_size); + + } else { // invalid frame length or FrameID + + if ($frame_size <= strlen($framedata)) { + + if ($this->IsValidID3v2FrameName(substr($framedata, $frame_size, 4), $id3v2_majorversion)) { + + // next frame is valid, just skip the current frame + $framedata = substr($framedata, $frame_size); + $this->warning('Next ID3v2 frame is valid, skipping current frame.'); + + } else { + + // next frame is invalid too, abort processing + //unset($framedata); + $framedata = null; + $this->error('Next ID3v2 frame is also invalid, aborting processing.'); + + } + + } elseif ($frame_size == strlen($framedata)) { + + // this is the last frame, just skip + $this->warning('This was the last ID3v2 frame.'); + + } else { + + // next frame is invalid too, abort processing + //unset($framedata); + $framedata = null; + $this->warning('Invalid ID3v2 frame size, aborting.'); + + } + if (!$this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion)) { + + switch ($frame_name) { + case "\x00\x00".'MP': + case "\x00".'MP3': + case ' MP3': + case 'MP3e': + case "\x00".'MP': + case ' MP': + case 'MP3': + $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by "MP3ext (www.mutschler.de/mp3ext/)"]'); + break; + + default: + $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))).'); + break; + } + + } elseif (!isset($framedata) || ($frame_size > strlen($framedata))) { + + $this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.(isset($framedata) ? strlen($framedata) : 'null').')).'); + + } else { + + $this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag).'); + + } + + } + $framedataoffset += ($frame_size + $this->ID3v2HeaderLength($id3v2_majorversion)); + + } + + } + + + // Footer + + // The footer is a copy of the header, but with a different identifier. + // ID3v2 identifier "3DI" + // ID3v2 version $04 00 + // ID3v2 flags %abcd0000 + // ID3v2 size 4 * %0xxxxxxx + + if (isset($thisfile_id3v2_flags['isfooter']) && $thisfile_id3v2_flags['isfooter']) { + $footer = $this->fread(10); + if (substr($footer, 0, 3) == '3DI') { + $thisfile_id3v2['footer'] = true; + $thisfile_id3v2['majorversion_footer'] = ord($footer[3]); + $thisfile_id3v2['minorversion_footer'] = ord($footer[4]); + } + if ($thisfile_id3v2['majorversion_footer'] <= 4) { + $id3_flags = ord($footer[5]); + $thisfile_id3v2_flags['unsynch_footer'] = (bool) ($id3_flags & 0x80); + $thisfile_id3v2_flags['extfoot_footer'] = (bool) ($id3_flags & 0x40); + $thisfile_id3v2_flags['experim_footer'] = (bool) ($id3_flags & 0x20); + $thisfile_id3v2_flags['isfooter_footer'] = (bool) ($id3_flags & 0x10); + + $thisfile_id3v2['footerlength'] = getid3_lib::BigEndian2Int(substr($footer, 6, 4), 1); + } + } // end footer + + if (isset($thisfile_id3v2['comments']['genre'])) { + $genres = array(); + foreach ($thisfile_id3v2['comments']['genre'] as $key => $value) { + foreach ($this->ParseID3v2GenreString($value) as $genre) { + $genres[] = $genre; + } + } + $thisfile_id3v2['comments']['genre'] = array_unique($genres); + unset($key, $value, $genres, $genre); + } + + if (isset($thisfile_id3v2['comments']['track_number'])) { + foreach ($thisfile_id3v2['comments']['track_number'] as $key => $value) { + if (strstr($value, '/')) { + list($thisfile_id3v2['comments']['track_number'][$key], $thisfile_id3v2['comments']['totaltracks'][$key]) = explode('/', $thisfile_id3v2['comments']['track_number'][$key]); + } + } + } + + if (!isset($thisfile_id3v2['comments']['year']) && !empty($thisfile_id3v2['comments']['recording_time'][0]) && preg_match('#^([0-9]{4})#', trim($thisfile_id3v2['comments']['recording_time'][0]), $matches)) { + $thisfile_id3v2['comments']['year'] = array($matches[1]); + } + + + if (!empty($thisfile_id3v2['TXXX'])) { + // MediaMonkey does this, maybe others: write a blank RGAD frame, but put replay-gain adjustment values in TXXX frames + foreach ($thisfile_id3v2['TXXX'] as $txxx_array) { + switch ($txxx_array['description']) { + case 'replaygain_track_gain': + if (empty($info['replay_gain']['track']['adjustment']) && !empty($txxx_array['data'])) { + $info['replay_gain']['track']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data']))); + } + break; + case 'replaygain_track_peak': + if (empty($info['replay_gain']['track']['peak']) && !empty($txxx_array['data'])) { + $info['replay_gain']['track']['peak'] = floatval($txxx_array['data']); + } + break; + case 'replaygain_album_gain': + if (empty($info['replay_gain']['album']['adjustment']) && !empty($txxx_array['data'])) { + $info['replay_gain']['album']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data']))); + } + break; + } + } + } + + + // Set avdataoffset + $info['avdataoffset'] = $thisfile_id3v2['headerlength']; + if (isset($thisfile_id3v2['footer'])) { + $info['avdataoffset'] += 10; + } + + return true; + } + + /** + * @param string $genrestring + * + * @return array + */ + public function ParseID3v2GenreString($genrestring) { + // Parse genres into arrays of genreName and genreID + // ID3v2.2.x, ID3v2.3.x: '(21)' or '(4)Eurodisco' or '(51)(39)' or '(55)((I think...)' + // ID3v2.4.x: '21' $00 'Eurodisco' $00 + $clean_genres = array(); + + // hack-fixes for some badly-written ID3v2.3 taggers, while trying not to break correctly-written tags + if (($this->getid3->info['id3v2']['majorversion'] == 3) && !preg_match('#[\x00]#', $genrestring)) { + // note: MusicBrainz Picard incorrectly stores plaintext genres separated by "/" when writing in ID3v2.3 mode, hack-fix here: + // replace / with NULL, then replace back the two ID3v1 genres that legitimately have "/" as part of the single genre name + if (preg_match('#/#', $genrestring)) { + $genrestring = str_replace('/', "\x00", $genrestring); + $genrestring = str_replace('Pop'."\x00".'Funk', 'Pop/Funk', $genrestring); + $genrestring = str_replace('Rock'."\x00".'Rock', 'Folk/Rock', $genrestring); + } + + // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal" + if (preg_match('#;#', $genrestring)) { + $genrestring = str_replace(';', "\x00", $genrestring); + } + } + + + if (strpos($genrestring, "\x00") === false) { + $genrestring = preg_replace('#\(([0-9]{1,3})\)#', '$1'."\x00", $genrestring); + } + + $genre_elements = explode("\x00", $genrestring); + foreach ($genre_elements as $element) { + $element = trim($element); + if ($element) { + if (preg_match('#^[0-9]{1,3}$#', $element)) { + $clean_genres[] = getid3_id3v1::LookupGenreName($element); + } else { + $clean_genres[] = str_replace('((', '(', $element); + } + } + } + return $clean_genres; + } + + /** + * @param array $parsedFrame + * + * @return bool + */ + public function ParseID3v2Frame(&$parsedFrame) { + + // shortcuts + $info = &$this->getid3->info; + $id3v2_majorversion = $info['id3v2']['majorversion']; + + $parsedFrame['framenamelong'] = $this->FrameNameLongLookup($parsedFrame['frame_name']); + if (empty($parsedFrame['framenamelong'])) { + unset($parsedFrame['framenamelong']); + } + $parsedFrame['framenameshort'] = $this->FrameNameShortLookup($parsedFrame['frame_name']); + if (empty($parsedFrame['framenameshort'])) { + unset($parsedFrame['framenameshort']); + } + + if ($id3v2_majorversion >= 3) { // frame flags are not part of the ID3v2.2 standard + if ($id3v2_majorversion == 3) { + // Frame Header Flags + // %abc00000 %ijk00000 + $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x8000); // a - Tag alter preservation + $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // b - File alter preservation + $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // c - Read only + $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0080); // i - Compression + $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // j - Encryption + $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0020); // k - Grouping identity + + } elseif ($id3v2_majorversion == 4) { + // Frame Header Flags + // %0abc0000 %0h00kmnp + $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // a - Tag alter preservation + $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // b - File alter preservation + $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x1000); // c - Read only + $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // h - Grouping identity + $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0008); // k - Compression + $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0004); // m - Encryption + $parsedFrame['flags']['Unsynchronisation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0002); // n - Unsynchronisation + $parsedFrame['flags']['DataLengthIndicator'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0001); // p - Data length indicator + + // Frame-level de-unsynchronisation - ID3v2.4 + if ($parsedFrame['flags']['Unsynchronisation']) { + $parsedFrame['data'] = $this->DeUnsynchronise($parsedFrame['data']); + } + + if ($parsedFrame['flags']['DataLengthIndicator']) { + $parsedFrame['data_length_indicator'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4), 1); + $parsedFrame['data'] = substr($parsedFrame['data'], 4); + } + } + + // Frame-level de-compression + if ($parsedFrame['flags']['compression']) { + $parsedFrame['decompressed_size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4)); + if (!function_exists('gzuncompress')) { + $this->warning('gzuncompress() support required to decompress ID3v2 frame "'.$parsedFrame['frame_name'].'"'); + } else { + if ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) { + //if ($decompresseddata = @gzuncompress($parsedFrame['data'])) { + $parsedFrame['data'] = $decompresseddata; + unset($decompresseddata); + } else { + $this->warning('gzuncompress() failed on compressed contents of ID3v2 frame "'.$parsedFrame['frame_name'].'"'); + } + } + } + } + + if (!empty($parsedFrame['flags']['DataLengthIndicator'])) { + if ($parsedFrame['data_length_indicator'] != strlen($parsedFrame['data'])) { + $this->warning('ID3v2 frame "'.$parsedFrame['frame_name'].'" should be '.$parsedFrame['data_length_indicator'].' bytes long according to DataLengthIndicator, but found '.strlen($parsedFrame['data']).' bytes of data'); + } + } + + if (isset($parsedFrame['datalength']) && ($parsedFrame['datalength'] == 0)) { + + $warning = 'Frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset'].' has no data portion'; + switch ($parsedFrame['frame_name']) { + case 'WCOM': + $warning .= ' (this is known to happen with files tagged by RioPort)'; + break; + + default: + break; + } + $this->warning($warning); + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) || // 4.1 UFID Unique file identifier + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'UFI'))) { // 4.1 UFI Unique file identifier + // There may be more than one 'UFID' frame in a tag, + // but only one with the same 'Owner identifier'. + //
            + // Owner identifier $00 + // Identifier + $exploded = explode("\x00", $parsedFrame['data'], 2); + $parsedFrame['ownerid'] = (isset($exploded[0]) ? $exploded[0] : ''); + $parsedFrame['data'] = (isset($exploded[1]) ? $exploded[1] : ''); + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'TXXX')) || // 4.2.2 TXXX User defined text information frame + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'TXX'))) { // 4.2.2 TXX User defined text information frame + // There may be more than one 'TXXX' frame in each tag, + // but only one with the same description. + //
            + // Text encoding $xx + // Description $00 (00) + // Value + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + $frame_textencoding_terminator = "\x00"; + } + $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['description'] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['description'])); + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); + $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator); + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0)); + if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data'])); + } else { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data'])); + } + } + //unset($parsedFrame['data']); do not unset, may be needed elsewhere, e.g. for replaygain + + + } elseif ($parsedFrame['frame_name'][0] == 'T') { // 4.2. T??[?] Text information frame + // There may only be one text information frame of its kind in an tag. + //
            + // Text encoding $xx + // Information + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + } + + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding)); + + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + // ID3v2.3 specs say that TPE1 (and others) can contain multiple artist values separated with / + // This of course breaks when an artist name contains slash character, e.g. "AC/DC" + // MP3tag (maybe others) implement alternative system where multiple artists are null-separated, which makes more sense + // getID3 will split null-separated artists into multiple artists and leave slash-separated ones to the user + switch ($parsedFrame['encoding']) { + case 'UTF-16': + case 'UTF-16BE': + case 'UTF-16LE': + $wordsize = 2; + break; + case 'ISO-8859-1': + case 'UTF-8': + default: + $wordsize = 1; + break; + } + $Txxx_elements = array(); + $Txxx_elements_start_offset = 0; + for ($i = 0; $i < strlen($parsedFrame['data']); $i += $wordsize) { + if (substr($parsedFrame['data'], $i, $wordsize) == str_repeat("\x00", $wordsize)) { + $Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset); + $Txxx_elements_start_offset = $i + $wordsize; + } + } + $Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset); + foreach ($Txxx_elements as $Txxx_element) { + $string = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $Txxx_element); + if (!empty($string)) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $string; + } + } + unset($string, $wordsize, $i, $Txxx_elements, $Txxx_element, $Txxx_elements_start_offset); + } + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'WXXX')) || // 4.3.2 WXXX User defined URL link frame + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'WXX'))) { // 4.3.2 WXX User defined URL link frame + // There may be more than one 'WXXX' frame in each tag, + // but only one with the same description + //
            + // Text encoding $xx + // Description $00 (00) + // URL + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + $frame_textencoding_terminator = "\x00"; + } + $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); // according to the frame text encoding + $parsedFrame['url'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); // always ISO-8859-1 + $parsedFrame['description'] = $this->RemoveStringTerminator($parsedFrame['description'], $frame_textencoding_terminator); + $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); + + if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback('ISO-8859-1', $info['id3v2']['encoding'], $parsedFrame['url']); + } + unset($parsedFrame['data']); + + + } elseif ($parsedFrame['frame_name'][0] == 'W') { // 4.3. W??? URL link frames + // There may only be one URL link frame of its kind in a tag, + // except when stated otherwise in the frame description + //
            + // URL + + $parsedFrame['url'] = trim($parsedFrame['data']); // always ISO-8859-1 + if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback('ISO-8859-1', $info['id3v2']['encoding'], $parsedFrame['url']); + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'IPLS')) || // 4.4 IPLS Involved people list (ID3v2.3 only) + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'IPL'))) { // 4.4 IPL Involved people list (ID3v2.2 only) + // http://id3.org/id3v2.3.0#sec4.4 + // There may only be one 'IPL' frame in each tag + //
            + // Text encoding $xx + // People list strings + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + } + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($parsedFrame['encodingid']); + $parsedFrame['data_raw'] = (string) substr($parsedFrame['data'], $frame_offset); + + // https://www.getid3.org/phpBB3/viewtopic.php?t=1369 + // "this tag typically contains null terminated strings, which are associated in pairs" + // "there are users that use the tag incorrectly" + $IPLS_parts = array(); + if (strpos($parsedFrame['data_raw'], "\x00") !== false) { + $IPLS_parts_unsorted = array(); + if (((strlen($parsedFrame['data_raw']) % 2) == 0) && ((substr($parsedFrame['data_raw'], 0, 2) == "\xFF\xFE") || (substr($parsedFrame['data_raw'], 0, 2) == "\xFE\xFF"))) { + // UTF-16, be careful looking for null bytes since most 2-byte characters may contain one; you need to find twin null bytes, and on even padding + $thisILPS = ''; + for ($i = 0; $i < strlen($parsedFrame['data_raw']); $i += 2) { + $twobytes = substr($parsedFrame['data_raw'], $i, 2); + if ($twobytes === "\x00\x00") { + $IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS); + $thisILPS = ''; + } else { + $thisILPS .= $twobytes; + } + } + if (strlen($thisILPS) > 2) { // 2-byte BOM + $IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS); + } + } else { + // ISO-8859-1 or UTF-8 or other single-byte-null character set + $IPLS_parts_unsorted = explode("\x00", $parsedFrame['data_raw']); + } + if (count($IPLS_parts_unsorted) == 1) { + // just a list of names, e.g. "Dino Baptiste, Jimmy Copley, John Gordon, Bernie Marsden, Sharon Watson" + foreach ($IPLS_parts_unsorted as $key => $value) { + $IPLS_parts_sorted = preg_split('#[;,\\r\\n\\t]#', $value); + $position = ''; + foreach ($IPLS_parts_sorted as $person) { + $IPLS_parts[] = array('position'=>$position, 'person'=>$person); + } + } + } elseif ((count($IPLS_parts_unsorted) % 2) == 0) { + $position = ''; + $person = ''; + foreach ($IPLS_parts_unsorted as $key => $value) { + if (($key % 2) == 0) { + $position = $value; + } else { + $person = $value; + $IPLS_parts[] = array('position'=>$position, 'person'=>$person); + $position = ''; + $person = ''; + } + } + } else { + foreach ($IPLS_parts_unsorted as $key => $value) { + $IPLS_parts[] = array($value); + } + } + + } else { + $IPLS_parts = preg_split('#[;,\\r\\n\\t]#', $parsedFrame['data_raw']); + } + $parsedFrame['data'] = $IPLS_parts; + + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data']; + } + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MCDI')) || // 4.4 MCDI Music CD identifier + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MCI'))) { // 4.5 MCI Music CD identifier + // There may only be one 'MCDI' frame in each tag + //
            + // CD TOC + + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data']; + } + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ETCO')) || // 4.5 ETCO Event timing codes + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ETC'))) { // 4.6 ETC Event timing codes + // There may only be one 'ETCO' frame in each tag + //
            + // Time stamp format $xx + // Where time stamp format is: + // $01 (32-bit value) MPEG frames from beginning of file + // $02 (32-bit value) milliseconds from beginning of file + // Followed by a list of key events in the following format: + // Type of event $xx + // Time stamp $xx (xx ...) + // The 'Time stamp' is set to zero if directly at the beginning of the sound + // or after the previous event. All events MUST be sorted in chronological order. + + $frame_offset = 0; + $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + + while ($frame_offset < strlen($parsedFrame['data'])) { + $parsedFrame['typeid'] = substr($parsedFrame['data'], $frame_offset++, 1); + $parsedFrame['type'] = $this->ETCOEventLookup($parsedFrame['typeid']); + $parsedFrame['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MLLT')) || // 4.6 MLLT MPEG location lookup table + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MLL'))) { // 4.7 MLL MPEG location lookup table + // There may only be one 'MLLT' frame in each tag + //
            + // MPEG frames between reference $xx xx + // Bytes between reference $xx xx xx + // Milliseconds between reference $xx xx xx + // Bits for bytes deviation $xx + // Bits for milliseconds dev. $xx + // Then for every reference the following data is included; + // Deviation in bytes %xxx.... + // Deviation in milliseconds %xxx.... + + $frame_offset = 0; + $parsedFrame['framesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 2)); + $parsedFrame['bytesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 2, 3)); + $parsedFrame['msbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 5, 3)); + $parsedFrame['bitsforbytesdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 8, 1)); + $parsedFrame['bitsformsdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 9, 1)); + $parsedFrame['data'] = substr($parsedFrame['data'], 10); + $deviationbitstream = ''; + while ($frame_offset < strlen($parsedFrame['data'])) { + $deviationbitstream .= getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); + } + $reference_counter = 0; + while (strlen($deviationbitstream) > 0) { + $parsedFrame[$reference_counter]['bytedeviation'] = bindec(substr($deviationbitstream, 0, $parsedFrame['bitsforbytesdeviation'])); + $parsedFrame[$reference_counter]['msdeviation'] = bindec(substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'], $parsedFrame['bitsformsdeviation'])); + $deviationbitstream = substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'] + $parsedFrame['bitsformsdeviation']); + $reference_counter++; + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYTC')) || // 4.7 SYTC Synchronised tempo codes + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'STC'))) { // 4.8 STC Synchronised tempo codes + // There may only be one 'SYTC' frame in each tag + //
            + // Time stamp format $xx + // Tempo data + // Where time stamp format is: + // $01 (32-bit value) MPEG frames from beginning of file + // $02 (32-bit value) milliseconds from beginning of file + + $frame_offset = 0; + $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $timestamp_counter = 0; + while ($frame_offset < strlen($parsedFrame['data'])) { + $parsedFrame[$timestamp_counter]['tempo'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ($parsedFrame[$timestamp_counter]['tempo'] == 255) { + $parsedFrame[$timestamp_counter]['tempo'] += ord(substr($parsedFrame['data'], $frame_offset++, 1)); + } + $parsedFrame[$timestamp_counter]['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $timestamp_counter++; + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) || // 4.8 USLT Unsynchronised lyric/text transcription + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) { // 4.9 ULT Unsynchronised lyric/text transcription + // There may be more than one 'Unsynchronised lyrics/text transcription' frame + // in each tag, but only one with the same language and content descriptor. + //
            + // Text encoding $xx + // Language $xx xx xx + // Content descriptor $00 (00) + // Lyrics/text + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + $frame_textencoding_terminator = "\x00"; + } + $frame_language = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); + $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator); + + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['language'] = $frame_language; + $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYLT')) || // 4.9 SYLT Synchronised lyric/text + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'SLT'))) { // 4.10 SLT Synchronised lyric/text + // There may be more than one 'SYLT' frame in each tag, + // but only one with the same language and content descriptor. + //
            + // Text encoding $xx + // Language $xx xx xx + // Time stamp format $xx + // $01 (32-bit value) MPEG frames from beginning of file + // $02 (32-bit value) milliseconds from beginning of file + // Content type $xx + // Content descriptor $00 (00) + // Terminated text to be synced (typically a syllable) + // Sync identifier (terminator to above string) $00 (00) + // Time stamp $xx (xx ...) + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + $frame_textencoding_terminator = "\x00"; + } + $frame_language = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['contenttypeid'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['contenttype'] = $this->SYTLContentTypeLookup($parsedFrame['contenttypeid']); + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['language'] = $frame_language; + $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); + + $timestampindex = 0; + $frame_remainingdata = substr($parsedFrame['data'], $frame_offset); + while (strlen($frame_remainingdata)) { + $frame_offset = 0; + $frame_terminatorpos = strpos($frame_remainingdata, $frame_textencoding_terminator); + if ($frame_terminatorpos === false) { + $frame_remainingdata = ''; + } else { + if (ord(substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $parsedFrame['lyrics'][$timestampindex]['data'] = substr($frame_remainingdata, $frame_offset, $frame_terminatorpos - $frame_offset); + + $frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator)); + if (($timestampindex == 0) && (ord($frame_remainingdata[0]) != 0)) { + // timestamp probably omitted for first data item + } else { + $parsedFrame['lyrics'][$timestampindex]['timestamp'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 4)); + $frame_remainingdata = substr($frame_remainingdata, 4); + } + $timestampindex++; + } + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMM')) || // 4.10 COMM Comments + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'COM'))) { // 4.11 COM Comments + // There may be more than one comment frame in each tag, + // but only one with the same language and content descriptor. + //
            + // Text encoding $xx + // Language $xx xx xx + // Short content descrip. $00 (00) + // The actual text + + if (strlen($parsedFrame['data']) < 5) { + + $this->warning('Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset']); + + } else { + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + $frame_textencoding_terminator = "\x00"; + } + $frame_language = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); + $frame_text = (string) substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); + $frame_text = $this->RemoveStringTerminator($frame_text, $frame_textencoding_terminator); + + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['language'] = $frame_language; + $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); + $parsedFrame['data'] = $frame_text; + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (!empty($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0)); + if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); + } else { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); + } + } + + } + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'RVA2')) { // 4.11 RVA2 Relative volume adjustment (2) (ID3v2.4+ only) + // There may be more than one 'RVA2' frame in each tag, + // but only one with the same identification string + //
            + // Identification $00 + // The 'identification' string is used to identify the situation and/or + // device where this adjustment should apply. The following is then + // repeated for every channel: + // Type of channel $xx + // Volume adjustment $xx xx + // Bits representing peak $xx + // Peak volume $xx (xx ...) + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00"); + $frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos); + if (ord($frame_idstring) === 0) { + $frame_idstring = ''; + } + $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); + $parsedFrame['description'] = $frame_idstring; + $RVA2channelcounter = 0; + while (strlen($frame_remainingdata) >= 5) { + $frame_offset = 0; + $frame_channeltypeid = ord(substr($frame_remainingdata, $frame_offset++, 1)); + $parsedFrame[$RVA2channelcounter]['channeltypeid'] = $frame_channeltypeid; + $parsedFrame[$RVA2channelcounter]['channeltype'] = $this->RVA2ChannelTypeLookup($frame_channeltypeid); + $parsedFrame[$RVA2channelcounter]['volumeadjust'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, 2), false, true); // 16-bit signed + $frame_offset += 2; + $parsedFrame[$RVA2channelcounter]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1)); + if (($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] < 1) || ($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] > 4)) { + $this->warning('ID3v2::RVA2 frame['.$RVA2channelcounter.'] contains invalid '.$parsedFrame[$RVA2channelcounter]['bitspeakvolume'].'-byte bits-representing-peak value'); + break; + } + $frame_bytespeakvolume = ceil($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] / 8); + $parsedFrame[$RVA2channelcounter]['peakvolume'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, $frame_bytespeakvolume)); + $frame_remainingdata = substr($frame_remainingdata, $frame_offset + $frame_bytespeakvolume); + $RVA2channelcounter++; + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'RVAD')) || // 4.12 RVAD Relative volume adjustment (ID3v2.3 only) + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'RVA'))) { // 4.12 RVA Relative volume adjustment (ID3v2.2 only) + // There may only be one 'RVA' frame in each tag + //
            + // ID3v2.2 => Increment/decrement %000000ba + // ID3v2.3 => Increment/decrement %00fedcba + // Bits used for volume descr. $xx + // Relative volume change, right $xx xx (xx ...) // a + // Relative volume change, left $xx xx (xx ...) // b + // Peak volume right $xx xx (xx ...) + // Peak volume left $xx xx (xx ...) + // ID3v2.3 only, optional (not present in ID3v2.2): + // Relative volume change, right back $xx xx (xx ...) // c + // Relative volume change, left back $xx xx (xx ...) // d + // Peak volume right back $xx xx (xx ...) + // Peak volume left back $xx xx (xx ...) + // ID3v2.3 only, optional (not present in ID3v2.2): + // Relative volume change, center $xx xx (xx ...) // e + // Peak volume center $xx xx (xx ...) + // ID3v2.3 only, optional (not present in ID3v2.2): + // Relative volume change, bass $xx xx (xx ...) // f + // Peak volume bass $xx xx (xx ...) + + $frame_offset = 0; + $frame_incrdecrflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['incdec']['right'] = (bool) substr($frame_incrdecrflags, 6, 1); + $parsedFrame['incdec']['left'] = (bool) substr($frame_incrdecrflags, 7, 1); + $parsedFrame['bitsvolume'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_bytesvolume = ceil($parsedFrame['bitsvolume'] / 8); + $parsedFrame['volumechange']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['right'] === false) { + $parsedFrame['volumechange']['right'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['volumechange']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['left'] === false) { + $parsedFrame['volumechange']['left'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + if ($id3v2_majorversion == 3) { + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); + if (strlen($parsedFrame['data']) > 0) { + $parsedFrame['incdec']['rightrear'] = (bool) substr($frame_incrdecrflags, 4, 1); + $parsedFrame['incdec']['leftrear'] = (bool) substr($frame_incrdecrflags, 5, 1); + $parsedFrame['volumechange']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['rightrear'] === false) { + $parsedFrame['volumechange']['rightrear'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['volumechange']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['leftrear'] === false) { + $parsedFrame['volumechange']['leftrear'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + } + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); + if (strlen($parsedFrame['data']) > 0) { + $parsedFrame['incdec']['center'] = (bool) substr($frame_incrdecrflags, 3, 1); + $parsedFrame['volumechange']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['center'] === false) { + $parsedFrame['volumechange']['center'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + } + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); + if (strlen($parsedFrame['data']) > 0) { + $parsedFrame['incdec']['bass'] = (bool) substr($frame_incrdecrflags, 2, 1); + $parsedFrame['volumechange']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + if ($parsedFrame['incdec']['bass'] === false) { + $parsedFrame['volumechange']['bass'] *= -1; + } + $frame_offset += $frame_bytesvolume; + $parsedFrame['peakvolume']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); + $frame_offset += $frame_bytesvolume; + } + } + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'EQU2')) { // 4.12 EQU2 Equalisation (2) (ID3v2.4+ only) + // There may be more than one 'EQU2' frame in each tag, + // but only one with the same identification string + //
            + // Interpolation method $xx + // $00 Band + // $01 Linear + // Identification $00 + // The following is then repeated for every adjustment point + // Frequency $xx xx + // Volume adjustment $xx xx + + $frame_offset = 0; + $frame_interpolationmethod = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_idstring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_idstring) === 0) { + $frame_idstring = ''; + } + $parsedFrame['description'] = $frame_idstring; + $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); + while (strlen($frame_remainingdata)) { + $frame_frequency = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 2)) / 2; + $parsedFrame['data'][$frame_frequency] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, 2), false, true); + $frame_remainingdata = substr($frame_remainingdata, 4); + } + $parsedFrame['interpolationmethod'] = $frame_interpolationmethod; + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'EQUA')) || // 4.12 EQUA Equalisation (ID3v2.3 only) + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'EQU'))) { // 4.13 EQU Equalisation (ID3v2.2 only) + // There may only be one 'EQUA' frame in each tag + //
            + // Adjustment bits $xx + // This is followed by 2 bytes + ('adjustment bits' rounded up to the + // nearest byte) for every equalisation band in the following format, + // giving a frequency range of 0 - 32767Hz: + // Increment/decrement %x (MSB of the Frequency) + // Frequency (lower 15 bits) + // Adjustment $xx (xx ...) + + $frame_offset = 0; + $parsedFrame['adjustmentbits'] = substr($parsedFrame['data'], $frame_offset++, 1); + $frame_adjustmentbytes = ceil($parsedFrame['adjustmentbits'] / 8); + + $frame_remainingdata = (string) substr($parsedFrame['data'], $frame_offset); + while (strlen($frame_remainingdata) > 0) { + $frame_frequencystr = getid3_lib::BigEndian2Bin(substr($frame_remainingdata, 0, 2)); + $frame_incdec = (bool) substr($frame_frequencystr, 0, 1); + $frame_frequency = bindec(substr($frame_frequencystr, 1, 15)); + $parsedFrame[$frame_frequency]['incdec'] = $frame_incdec; + $parsedFrame[$frame_frequency]['adjustment'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, $frame_adjustmentbytes)); + if ($parsedFrame[$frame_frequency]['incdec'] === false) { + $parsedFrame[$frame_frequency]['adjustment'] *= -1; + } + $frame_remainingdata = substr($frame_remainingdata, 2 + $frame_adjustmentbytes); + } + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RVRB')) || // 4.13 RVRB Reverb + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'REV'))) { // 4.14 REV Reverb + // There may only be one 'RVRB' frame in each tag. + //
            + // Reverb left (ms) $xx xx + // Reverb right (ms) $xx xx + // Reverb bounces, left $xx + // Reverb bounces, right $xx + // Reverb feedback, left to left $xx + // Reverb feedback, left to right $xx + // Reverb feedback, right to right $xx + // Reverb feedback, right to left $xx + // Premix left to right $xx + // Premix right to left $xx + + $frame_offset = 0; + $parsedFrame['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['bouncesL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['bouncesR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['feedbackLL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['feedbackLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['feedbackRR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['feedbackRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['premixLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['premixRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'APIC')) || // 4.14 APIC Attached picture + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'PIC'))) { // 4.15 PIC Attached picture + // There may be several pictures attached to one file, + // each in their individual 'APIC' frame, but only one + // with the same content descriptor + //
            + // Text encoding $xx + // ID3v2.3+ => MIME type $00 + // ID3v2.2 => Image format $xx xx xx + // Picture type $xx + // Description $00 (00) + // Picture data + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + $frame_textencoding_terminator = "\x00"; + } + + if ($id3v2_majorversion == 2 && strlen($parsedFrame['data']) > $frame_offset) { + $frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3); + if (strtolower($frame_imagetype) == 'ima') { + // complete hack for mp3Rage (www.chaoticsoftware.com) that puts ID3v2.3-formatted + // MIME type instead of 3-char ID3v2.2-format image type (thanks xbhoffØpacbell*net) + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_mimetype) === 0) { + $frame_mimetype = ''; + } + $frame_imagetype = strtoupper(str_replace('image/', '', strtolower($frame_mimetype))); + if ($frame_imagetype == 'JPEG') { + $frame_imagetype = 'JPG'; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + } else { + $frame_offset += 3; + } + } + if ($id3v2_majorversion > 2 && strlen($parsedFrame['data']) > $frame_offset) { + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_mimetype) === 0) { + $frame_mimetype = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + } + + $frame_picturetype = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + + if ($frame_offset >= $parsedFrame['datalength']) { + $this->warning('data portion of APIC frame is missing at offset '.($parsedFrame['dataoffset'] + 8 + $frame_offset)); + } else { + $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + if ($id3v2_majorversion == 2) { + $parsedFrame['imagetype'] = isset($frame_imagetype) ? $frame_imagetype : null; + } else { + $parsedFrame['mime'] = isset($frame_mimetype) ? $frame_mimetype : null; + } + $parsedFrame['picturetypeid'] = $frame_picturetype; + $parsedFrame['picturetype'] = $this->APICPictureTypeLookup($frame_picturetype); + $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); + $parsedFrame['datalength'] = strlen($parsedFrame['data']); + + $parsedFrame['image_mime'] = ''; + $imageinfo = array(); + if ($imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data'], $imageinfo)) { + if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) { + $parsedFrame['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); + if ($imagechunkcheck[0]) { + $parsedFrame['image_width'] = $imagechunkcheck[0]; + } + if ($imagechunkcheck[1]) { + $parsedFrame['image_height'] = $imagechunkcheck[1]; + } + } + } + + do { + if ($this->getid3->option_save_attachments === false) { + // skip entirely + unset($parsedFrame['data']); + break; + } + $dir = ''; + if ($this->getid3->option_save_attachments === true) { + // great +/* + } elseif (is_int($this->getid3->option_save_attachments)) { + if ($this->getid3->option_save_attachments < $parsedFrame['data_length']) { + // too big, skip + $this->warning('attachment at '.$frame_offset.' is too large to process inline ('.number_format($parsedFrame['data_length']).' bytes)'); + unset($parsedFrame['data']); + break; + } +*/ + } elseif (is_string($this->getid3->option_save_attachments)) { + $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR); + if (!is_dir($dir) || !getID3::is_writable($dir)) { + // cannot write, skip + $this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$dir.'" (not writable)'); + unset($parsedFrame['data']); + break; + } + } + // if we get this far, must be OK + if (is_string($this->getid3->option_save_attachments)) { + $destination_filename = $dir.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$frame_offset; + if (!file_exists($destination_filename) || getID3::is_writable($destination_filename)) { + file_put_contents($destination_filename, $parsedFrame['data']); + } else { + $this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$destination_filename.'" (not writable)'); + } + $parsedFrame['data_filename'] = $destination_filename; + unset($parsedFrame['data']); + } else { + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + if (!isset($info['id3v2']['comments']['picture'])) { + $info['id3v2']['comments']['picture'] = array(); + } + $comments_picture_data = array(); + foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { + if (isset($parsedFrame[$picture_key])) { + $comments_picture_data[$picture_key] = $parsedFrame[$picture_key]; + } + } + $info['id3v2']['comments']['picture'][] = $comments_picture_data; + unset($comments_picture_data); + } + } + } while (false); + } + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GEOB')) || // 4.15 GEOB General encapsulated object + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'GEO'))) { // 4.16 GEO General encapsulated object + // There may be more than one 'GEOB' frame in each tag, + // but only one with the same content descriptor + //
            + // Text encoding $xx + // MIME type $00 + // Filename $00 (00) + // Content description $00 (00) + // Encapsulated object + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + $frame_textencoding_terminator = "\x00"; + } + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_mimetype) === 0) { + $frame_mimetype = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_filename = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_filename) === 0) { + $frame_filename = ''; + } + $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); + + $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); + $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); + + $parsedFrame['objectdata'] = (string) substr($parsedFrame['data'], $frame_offset); + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['mime'] = $frame_mimetype; + $parsedFrame['filename'] = $frame_filename; + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PCNT')) || // 4.16 PCNT Play counter + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CNT'))) { // 4.17 CNT Play counter + // There may only be one 'PCNT' frame in each tag. + // When the counter reaches all one's, one byte is inserted in + // front of the counter thus making the counter eight bits bigger + //
            + // Counter $xx xx xx xx (xx ...) + + $parsedFrame['data'] = getid3_lib::BigEndian2Int($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POPM')) || // 4.17 POPM Popularimeter + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'POP'))) { // 4.18 POP Popularimeter + // There may be more than one 'POPM' frame in each tag, + // but only one with the same email address + //
            + // Email to user $00 + // Rating $xx + // Counter $xx xx xx xx (xx ...) + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_emailaddress = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_emailaddress) === 0) { + $frame_emailaddress = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + $frame_rating = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['counter'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); + $parsedFrame['email'] = $frame_emailaddress; + $parsedFrame['rating'] = $frame_rating; + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RBUF')) || // 4.18 RBUF Recommended buffer size + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'BUF'))) { // 4.19 BUF Recommended buffer size + // There may only be one 'RBUF' frame in each tag + //
            + // Buffer size $xx xx xx + // Embedded info flag %0000000x + // Offset to next tag $xx xx xx xx + + $frame_offset = 0; + $parsedFrame['buffersize'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 3)); + $frame_offset += 3; + + $frame_embeddedinfoflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['flags']['embededinfo'] = (bool) substr($frame_embeddedinfoflags, 7, 1); + $parsedFrame['nexttagoffset'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRM')) { // 4.20 Encrypted meta frame (ID3v2.2 only) + // There may be more than one 'CRM' frame in a tag, + // but only one with the same 'owner identifier' + //
            + // Owner identifier $00 (00) + // Content/explanation $00 (00) + // Encrypted datablock + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'AENC')) || // 4.19 AENC Audio encryption + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRA'))) { // 4.21 CRA Audio encryption + // There may be more than one 'AENC' frames in a tag, + // but only one with the same 'Owner identifier' + //
            + // Owner identifier $00 + // Preview start $xx xx + // Preview length $xx xx + // Encryption info + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_ownerid) === 0) { + $frame_ownerid = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['previewstart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['previewlength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['encryptioninfo'] = (string) substr($parsedFrame['data'], $frame_offset); + unset($parsedFrame['data']); + + + } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'LINK')) || // 4.20 LINK Linked information + (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'LNK'))) { // 4.22 LNK Linked information + // There may be more than one 'LINK' frame in a tag, + // but only one with the same contents + //
            + // ID3v2.3+ => Frame identifier $xx xx xx xx + // ID3v2.2 => Frame identifier $xx xx xx + // URL $00 + // ID and additional data + + $frame_offset = 0; + if ($id3v2_majorversion == 2) { + $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + } else { + $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 4); + $frame_offset += 4; + } + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_url = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_url) === 0) { + $frame_url = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + $parsedFrame['url'] = $frame_url; + + $parsedFrame['additionaldata'] = (string) substr($parsedFrame['data'], $frame_offset); + if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback_iso88591_utf8($parsedFrame['url']); + } + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POSS')) { // 4.21 POSS Position synchronisation frame (ID3v2.3+ only) + // There may only be one 'POSS' frame in each tag + // + // Time stamp format $xx + // Position $xx (xx ...) + + $frame_offset = 0; + $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['position'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USER')) { // 4.22 USER Terms of use (ID3v2.3+ only) + // There may be more than one 'Terms of use' frame in a tag, + // but only one with the same 'Language' + //
            + // Text encoding $xx + // Language $xx xx xx + // The actual text + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + } + $frame_language = substr($parsedFrame['data'], $frame_offset, 3); + $frame_offset += 3; + $parsedFrame['language'] = $frame_language; + $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding)); + if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { + $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); + } + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'OWNE')) { // 4.23 OWNE Ownership frame (ID3v2.3+ only) + // There may only be one 'OWNE' frame in a tag + //
            + // Text encoding $xx + // Price paid $00 + // Date of purch. + // Seller + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + } + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_pricepaid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['pricepaid']['currencyid'] = substr($frame_pricepaid, 0, 3); + $parsedFrame['pricepaid']['currency'] = $this->LookupCurrencyUnits($parsedFrame['pricepaid']['currencyid']); + $parsedFrame['pricepaid']['value'] = substr($frame_pricepaid, 3); + + $parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8); + if ($this->IsValidDateStampString($parsedFrame['purchasedate'])) { + $parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4)); + } + $frame_offset += 8; + + $parsedFrame['seller'] = (string) substr($parsedFrame['data'], $frame_offset); + $parsedFrame['seller'] = $this->RemoveStringTerminator($parsedFrame['seller'], $this->TextEncodingTerminatorLookup($frame_textencoding)); + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMR')) { // 4.24 COMR Commercial frame (ID3v2.3+ only) + // There may be more than one 'commercial frame' in a tag, + // but no two may be identical + //
            + // Text encoding $xx + // Price string $00 + // Valid until + // Contact URL $00 + // Received as $xx + // Name of seller $00 (00) + // Description $00 (00) + // Picture MIME type $00 + // Seller logo + + $frame_offset = 0; + $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); + if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { + $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); + $frame_textencoding_terminator = "\x00"; + } + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_pricestring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + $frame_rawpricearray = explode('/', $frame_pricestring); + foreach ($frame_rawpricearray as $key => $val) { + $frame_currencyid = substr($val, 0, 3); + $parsedFrame['price'][$frame_currencyid]['currency'] = $this->LookupCurrencyUnits($frame_currencyid); + $parsedFrame['price'][$frame_currencyid]['value'] = substr($val, 3); + } + + $frame_datestring = substr($parsedFrame['data'], $frame_offset, 8); + $frame_offset += 8; + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_contacturl = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $frame_receivedasid = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + + $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $frame_sellername = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_sellername) === 0) { + $frame_sellername = ''; + } + $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); + + $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); + if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { + $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 + } + $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); + $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); + + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $frame_sellerlogo = substr($parsedFrame['data'], $frame_offset); + + $parsedFrame['encodingid'] = $frame_textencoding; + $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); + + $parsedFrame['pricevaliduntil'] = $frame_datestring; + $parsedFrame['contacturl'] = $frame_contacturl; + $parsedFrame['receivedasid'] = $frame_receivedasid; + $parsedFrame['receivedas'] = $this->COMRReceivedAsLookup($frame_receivedasid); + $parsedFrame['sellername'] = $frame_sellername; + $parsedFrame['mime'] = $frame_mimetype; + $parsedFrame['logo'] = $frame_sellerlogo; + unset($parsedFrame['data']); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ENCR')) { // 4.25 ENCR Encryption method registration (ID3v2.3+ only) + // There may be several 'ENCR' frames in a tag, + // but only one containing the same symbol + // and only one containing the same owner identifier + //
            + // Owner identifier $00 + // Method symbol $xx + // Encryption data + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_ownerid) === 0) { + $frame_ownerid = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['methodsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GRID')) { // 4.26 GRID Group identification registration (ID3v2.3+ only) + + // There may be several 'GRID' frames in a tag, + // but only one containing the same symbol + // and only one containing the same owner identifier + //
            + // Owner identifier $00 + // Group symbol $xx + // Group dependent data + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_ownerid) === 0) { + $frame_ownerid = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PRIV')) { // 4.27 PRIV Private frame (ID3v2.3+ only) + // The tag may contain more than one 'PRIV' frame + // but only with different contents + //
            + // Owner identifier $00 + // The private data + + $frame_offset = 0; + $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); + $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); + if (ord($frame_ownerid) === 0) { + $frame_ownerid = ''; + } + $frame_offset = $frame_terminatorpos + strlen("\x00"); + + $parsedFrame['ownerid'] = $frame_ownerid; + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SIGN')) { // 4.28 SIGN Signature frame (ID3v2.4+ only) + // There may be more than one 'signature frame' in a tag, + // but no two may be identical + //
            + // Group symbol $xx + // Signature + + $frame_offset = 0; + $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); + + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SEEK')) { // 4.29 SEEK Seek frame (ID3v2.4+ only) + // There may only be one 'seek frame' in a tag + //
            + // Minimum offset to next tag $xx xx xx xx + + $frame_offset = 0; + $parsedFrame['data'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + + + } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'ASPI')) { // 4.30 ASPI Audio seek point index (ID3v2.4+ only) + // There may only be one 'audio seek point index' frame in a tag + //
            + // Indexed data start (S) $xx xx xx xx + // Indexed data length (L) $xx xx xx xx + // Number of index points (N) $xx xx + // Bits per index point (b) $xx + // Then for every index point the following data is included: + // Fraction at index (Fi) $xx (xx) + + $frame_offset = 0; + $parsedFrame['datastart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $parsedFrame['indexeddatalength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $parsedFrame['indexpoints'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['bitsperpoint'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); + $frame_bytesperpoint = ceil($parsedFrame['bitsperpoint'] / 8); + for ($i = 0; $i < $parsedFrame['indexpoints']; $i++) { + $parsedFrame['indexes'][$i] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesperpoint)); + $frame_offset += $frame_bytesperpoint; + } + unset($parsedFrame['data']); + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RGAD')) { // Replay Gain Adjustment + // http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html + // There may only be one 'RGAD' frame in a tag + //
            + // Peak Amplitude $xx $xx $xx $xx + // Radio Replay Gain Adjustment %aaabbbcd %dddddddd + // Audiophile Replay Gain Adjustment %aaabbbcd %dddddddd + // a - name code + // b - originator code + // c - sign bit + // d - replay gain adjustment + + $frame_offset = 0; + $parsedFrame['peakamplitude'] = getid3_lib::BigEndian2Float(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $rg_track_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $rg_album_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['raw']['track']['name'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 0, 3)); + $parsedFrame['raw']['track']['originator'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 3, 3)); + $parsedFrame['raw']['track']['signbit'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 6, 1)); + $parsedFrame['raw']['track']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 7, 9)); + $parsedFrame['raw']['album']['name'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 0, 3)); + $parsedFrame['raw']['album']['originator'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 3, 3)); + $parsedFrame['raw']['album']['signbit'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 6, 1)); + $parsedFrame['raw']['album']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 7, 9)); + $parsedFrame['track']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['track']['name']); + $parsedFrame['track']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['track']['originator']); + $parsedFrame['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['track']['adjustment'], $parsedFrame['raw']['track']['signbit']); + $parsedFrame['album']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['album']['name']); + $parsedFrame['album']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['album']['originator']); + $parsedFrame['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['album']['adjustment'], $parsedFrame['raw']['album']['signbit']); + + $info['replay_gain']['track']['peak'] = $parsedFrame['peakamplitude']; + $info['replay_gain']['track']['originator'] = $parsedFrame['track']['originator']; + $info['replay_gain']['track']['adjustment'] = $parsedFrame['track']['adjustment']; + $info['replay_gain']['album']['originator'] = $parsedFrame['album']['originator']; + $info['replay_gain']['album']['adjustment'] = $parsedFrame['album']['adjustment']; + + unset($parsedFrame['data']); + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CHAP')) { // CHAP Chapters frame (ID3v2.3+ only) + // http://id3.org/id3v2-chapters-1.0 + // (10 bytes) + // Element ID $00 + // Start time $xx xx xx xx + // End time $xx xx xx xx + // Start offset $xx xx xx xx + // End offset $xx xx xx xx + // + + $frame_offset = 0; + @list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2); + $frame_offset += strlen($parsedFrame['element_id']."\x00"); + $parsedFrame['time_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $parsedFrame['time_end'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") { + // "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized." + $parsedFrame['offset_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + } + $frame_offset += 4; + if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") { + // "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized." + $parsedFrame['offset_end'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + } + $frame_offset += 4; + + if ($frame_offset < strlen($parsedFrame['data'])) { + $parsedFrame['subframes'] = array(); + while ($frame_offset < strlen($parsedFrame['data'])) { + // + $subframe = array(); + $subframe['name'] = substr($parsedFrame['data'], $frame_offset, 4); + $frame_offset += 4; + $subframe['size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) { + $this->warning('CHAP subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)'); + break; + } + $subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']); + $frame_offset += $subframe['size']; + + $subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1)); + $subframe['text'] = substr($subframe_rawdata, 1); + $subframe['encoding'] = $this->TextEncodingNameLookup($subframe['encodingid']); + $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text'])); + switch (substr($encoding_converted_text, 0, 2)) { + case "\xFF\xFE": + case "\xFE\xFF": + switch (strtoupper($info['id3v2']['encoding'])) { + case 'ISO-8859-1': + case 'UTF-8': + $encoding_converted_text = substr($encoding_converted_text, 2); + // remove unwanted byte-order-marks + break; + default: + // ignore + break; + } + break; + default: + // do not remove BOM + break; + } + + switch ($subframe['name']) { + case 'TIT2': + $parsedFrame['chapter_name'] = $encoding_converted_text; + $parsedFrame['subframes'][] = $subframe; + break; + case 'TIT3': + $parsedFrame['chapter_description'] = $encoding_converted_text; + $parsedFrame['subframes'][] = $subframe; + break; + case 'WXXX': + list($subframe['chapter_url_description'], $subframe['chapter_url']) = explode("\x00", $encoding_converted_text, 2); + $parsedFrame['chapter_url'][$subframe['chapter_url_description']] = $subframe['chapter_url']; + $parsedFrame['subframes'][] = $subframe; + break; + case 'APIC': + if (preg_match('#^([^\\x00]+)*\\x00(.)([^\\x00]+)*\\x00(.+)$#s', $subframe['text'], $matches)) { + list($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata) = $matches; + $subframe['image_mime'] = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_mime)); + $subframe['picture_type'] = $this->APICPictureTypeLookup($subframe_apic_picturetype); + $subframe['description'] = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_description)); + if (strlen($this->TextEncodingTerminatorLookup($subframe['encoding'])) == 2) { + // the null terminator between "description" and "picture data" could be either 1 byte (ISO-8859-1, UTF-8) or two bytes (UTF-16) + // the above regex assumes one byte, if it's actually two then strip the second one here + $subframe_apic_picturedata = substr($subframe_apic_picturedata, 1); + } + $subframe['data'] = $subframe_apic_picturedata; + unset($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata); + unset($subframe['text'], $parsedFrame['text']); + $parsedFrame['subframes'][] = $subframe; + $parsedFrame['picture_present'] = true; + } else { + $this->warning('ID3v2.CHAP subframe #'.(count($parsedFrame['subframes']) + 1).' "'.$subframe['name'].'" not in expected format'); + } + break; + default: + $this->warning('ID3v2.CHAP subframe "'.$subframe['name'].'" not handled (supported: TIT2, TIT3, WXXX, APIC)'); + break; + } + } + unset($subframe_rawdata, $subframe, $encoding_converted_text); + unset($parsedFrame['data']); // debatable whether this this be here, without it the returned structure may contain a large amount of duplicate data if chapters contain APIC + } + + $id3v2_chapter_entry = array(); + foreach (array('id', 'time_begin', 'time_end', 'offset_begin', 'offset_end', 'chapter_name', 'chapter_description', 'chapter_url', 'picture_present') as $id3v2_chapter_key) { + if (isset($parsedFrame[$id3v2_chapter_key])) { + $id3v2_chapter_entry[$id3v2_chapter_key] = $parsedFrame[$id3v2_chapter_key]; + } + } + if (!isset($info['id3v2']['chapters'])) { + $info['id3v2']['chapters'] = array(); + } + $info['id3v2']['chapters'][] = $id3v2_chapter_entry; + unset($id3v2_chapter_entry, $id3v2_chapter_key); + + + } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CTOC')) { // CTOC Chapters Table Of Contents frame (ID3v2.3+ only) + // http://id3.org/id3v2-chapters-1.0 + // (10 bytes) + // Element ID $00 + // CTOC flags %xx + // Entry count $xx + // Child Element ID $00 /* zero or more child CHAP or CTOC entries */ + // + + $frame_offset = 0; + @list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2); + $frame_offset += strlen($parsedFrame['element_id']."\x00"); + $ctoc_flags_raw = ord(substr($parsedFrame['data'], $frame_offset, 1)); + $frame_offset += 1; + $parsedFrame['entry_count'] = ord(substr($parsedFrame['data'], $frame_offset, 1)); + $frame_offset += 1; + + $terminator_position = null; + for ($i = 0; $i < $parsedFrame['entry_count']; $i++) { + $terminator_position = strpos($parsedFrame['data'], "\x00", $frame_offset); + $parsedFrame['child_element_ids'][$i] = substr($parsedFrame['data'], $frame_offset, $terminator_position - $frame_offset); + $frame_offset = $terminator_position + 1; + } + + $parsedFrame['ctoc_flags']['ordered'] = (bool) ($ctoc_flags_raw & 0x01); + $parsedFrame['ctoc_flags']['top_level'] = (bool) ($ctoc_flags_raw & 0x03); + + unset($ctoc_flags_raw, $terminator_position); + + if ($frame_offset < strlen($parsedFrame['data'])) { + $parsedFrame['subframes'] = array(); + while ($frame_offset < strlen($parsedFrame['data'])) { + // + $subframe = array(); + $subframe['name'] = substr($parsedFrame['data'], $frame_offset, 4); + $frame_offset += 4; + $subframe['size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); + $frame_offset += 4; + $subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) { + $this->warning('CTOS subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)'); + break; + } + $subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']); + $frame_offset += $subframe['size']; + + $subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1)); + $subframe['text'] = substr($subframe_rawdata, 1); + $subframe['encoding'] = $this->TextEncodingNameLookup($subframe['encodingid']); + $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));; + switch (substr($encoding_converted_text, 0, 2)) { + case "\xFF\xFE": + case "\xFE\xFF": + switch (strtoupper($info['id3v2']['encoding'])) { + case 'ISO-8859-1': + case 'UTF-8': + $encoding_converted_text = substr($encoding_converted_text, 2); + // remove unwanted byte-order-marks + break; + default: + // ignore + break; + } + break; + default: + // do not remove BOM + break; + } + + if (($subframe['name'] == 'TIT2') || ($subframe['name'] == 'TIT3')) { + if ($subframe['name'] == 'TIT2') { + $parsedFrame['toc_name'] = $encoding_converted_text; + } elseif ($subframe['name'] == 'TIT3') { + $parsedFrame['toc_description'] = $encoding_converted_text; + } + $parsedFrame['subframes'][] = $subframe; + } else { + $this->warning('ID3v2.CTOC subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)'); + } + } + unset($subframe_rawdata, $subframe, $encoding_converted_text); + } + + } + + return true; + } + + /** + * @param string $data + * + * @return string + */ + public function DeUnsynchronise($data) { + return str_replace("\xFF\x00", "\xFF", $data); + } + + /** + * @param int $index + * + * @return string + */ + public function LookupExtendedHeaderRestrictionsTagSizeLimits($index) { + static $LookupExtendedHeaderRestrictionsTagSizeLimits = array( + 0x00 => 'No more than 128 frames and 1 MB total tag size', + 0x01 => 'No more than 64 frames and 128 KB total tag size', + 0x02 => 'No more than 32 frames and 40 KB total tag size', + 0x03 => 'No more than 32 frames and 4 KB total tag size', + ); + return (isset($LookupExtendedHeaderRestrictionsTagSizeLimits[$index]) ? $LookupExtendedHeaderRestrictionsTagSizeLimits[$index] : ''); + } + + /** + * @param int $index + * + * @return string + */ + public function LookupExtendedHeaderRestrictionsTextEncodings($index) { + static $LookupExtendedHeaderRestrictionsTextEncodings = array( + 0x00 => 'No restrictions', + 0x01 => 'Strings are only encoded with ISO-8859-1 or UTF-8', + ); + return (isset($LookupExtendedHeaderRestrictionsTextEncodings[$index]) ? $LookupExtendedHeaderRestrictionsTextEncodings[$index] : ''); + } + + /** + * @param int $index + * + * @return string + */ + public function LookupExtendedHeaderRestrictionsTextFieldSize($index) { + static $LookupExtendedHeaderRestrictionsTextFieldSize = array( + 0x00 => 'No restrictions', + 0x01 => 'No string is longer than 1024 characters', + 0x02 => 'No string is longer than 128 characters', + 0x03 => 'No string is longer than 30 characters', + ); + return (isset($LookupExtendedHeaderRestrictionsTextFieldSize[$index]) ? $LookupExtendedHeaderRestrictionsTextFieldSize[$index] : ''); + } + + /** + * @param int $index + * + * @return string + */ + public function LookupExtendedHeaderRestrictionsImageEncoding($index) { + static $LookupExtendedHeaderRestrictionsImageEncoding = array( + 0x00 => 'No restrictions', + 0x01 => 'Images are encoded only with PNG or JPEG', + ); + return (isset($LookupExtendedHeaderRestrictionsImageEncoding[$index]) ? $LookupExtendedHeaderRestrictionsImageEncoding[$index] : ''); + } + + /** + * @param int $index + * + * @return string + */ + public function LookupExtendedHeaderRestrictionsImageSizeSize($index) { + static $LookupExtendedHeaderRestrictionsImageSizeSize = array( + 0x00 => 'No restrictions', + 0x01 => 'All images are 256x256 pixels or smaller', + 0x02 => 'All images are 64x64 pixels or smaller', + 0x03 => 'All images are exactly 64x64 pixels, unless required otherwise', + ); + return (isset($LookupExtendedHeaderRestrictionsImageSizeSize[$index]) ? $LookupExtendedHeaderRestrictionsImageSizeSize[$index] : ''); + } + + /** + * @param string $currencyid + * + * @return string + */ + public function LookupCurrencyUnits($currencyid) { + + $begin = __LINE__; + + /** This is not a comment! + + + AED Dirhams + AFA Afghanis + ALL Leke + AMD Drams + ANG Guilders + AOA Kwanza + ARS Pesos + ATS Schillings + AUD Dollars + AWG Guilders + AZM Manats + BAM Convertible Marka + BBD Dollars + BDT Taka + BEF Francs + BGL Leva + BHD Dinars + BIF Francs + BMD Dollars + BND Dollars + BOB Bolivianos + BRL Brazil Real + BSD Dollars + BTN Ngultrum + BWP Pulas + BYR Rubles + BZD Dollars + CAD Dollars + CDF Congolese Francs + CHF Francs + CLP Pesos + CNY Yuan Renminbi + COP Pesos + CRC Colones + CUP Pesos + CVE Escudos + CYP Pounds + CZK Koruny + DEM Deutsche Marks + DJF Francs + DKK Kroner + DOP Pesos + DZD Algeria Dinars + EEK Krooni + EGP Pounds + ERN Nakfa + ESP Pesetas + ETB Birr + EUR Euro + FIM Markkaa + FJD Dollars + FKP Pounds + FRF Francs + GBP Pounds + GEL Lari + GGP Pounds + GHC Cedis + GIP Pounds + GMD Dalasi + GNF Francs + GRD Drachmae + GTQ Quetzales + GYD Dollars + HKD Dollars + HNL Lempiras + HRK Kuna + HTG Gourdes + HUF Forints + IDR Rupiahs + IEP Pounds + ILS New Shekels + IMP Pounds + INR Rupees + IQD Dinars + IRR Rials + ISK Kronur + ITL Lire + JEP Pounds + JMD Dollars + JOD Dinars + JPY Yen + KES Shillings + KGS Soms + KHR Riels + KMF Francs + KPW Won + KWD Dinars + KYD Dollars + KZT Tenge + LAK Kips + LBP Pounds + LKR Rupees + LRD Dollars + LSL Maloti + LTL Litai + LUF Francs + LVL Lati + LYD Dinars + MAD Dirhams + MDL Lei + MGF Malagasy Francs + MKD Denars + MMK Kyats + MNT Tugriks + MOP Patacas + MRO Ouguiyas + MTL Liri + MUR Rupees + MVR Rufiyaa + MWK Kwachas + MXN Pesos + MYR Ringgits + MZM Meticais + NAD Dollars + NGN Nairas + NIO Gold Cordobas + NLG Guilders + NOK Krone + NPR Nepal Rupees + NZD Dollars + OMR Rials + PAB Balboa + PEN Nuevos Soles + PGK Kina + PHP Pesos + PKR Rupees + PLN Zlotych + PTE Escudos + PYG Guarani + QAR Rials + ROL Lei + RUR Rubles + RWF Rwanda Francs + SAR Riyals + SBD Dollars + SCR Rupees + SDD Dinars + SEK Kronor + SGD Dollars + SHP Pounds + SIT Tolars + SKK Koruny + SLL Leones + SOS Shillings + SPL Luigini + SRG Guilders + STD Dobras + SVC Colones + SYP Pounds + SZL Emalangeni + THB Baht + TJR Rubles + TMM Manats + TND Dinars + TOP Pa'anga + TRL Liras + TTD Dollars + TVD Tuvalu Dollars + TWD New Dollars + TZS Shillings + UAH Hryvnia + UGX Shillings + USD Dollars + UYU Pesos + UZS Sums + VAL Lire + VEB Bolivares + VND Dong + VUV Vatu + WST Tala + XAF Francs + XAG Ounces + XAU Ounces + XCD Dollars + XDR Special Drawing Rights + XPD Ounces + XPF Francs + XPT Ounces + YER Rials + YUM New Dinars + ZAR Rand + ZMK Kwacha + ZWD Zimbabwe Dollars + + */ + + return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-units'); + } + + /** + * @param string $currencyid + * + * @return string + */ + public function LookupCurrencyCountry($currencyid) { + + $begin = __LINE__; + + /** This is not a comment! + + AED United Arab Emirates + AFA Afghanistan + ALL Albania + AMD Armenia + ANG Netherlands Antilles + AOA Angola + ARS Argentina + ATS Austria + AUD Australia + AWG Aruba + AZM Azerbaijan + BAM Bosnia and Herzegovina + BBD Barbados + BDT Bangladesh + BEF Belgium + BGL Bulgaria + BHD Bahrain + BIF Burundi + BMD Bermuda + BND Brunei Darussalam + BOB Bolivia + BRL Brazil + BSD Bahamas + BTN Bhutan + BWP Botswana + BYR Belarus + BZD Belize + CAD Canada + CDF Congo/Kinshasa + CHF Switzerland + CLP Chile + CNY China + COP Colombia + CRC Costa Rica + CUP Cuba + CVE Cape Verde + CYP Cyprus + CZK Czech Republic + DEM Germany + DJF Djibouti + DKK Denmark + DOP Dominican Republic + DZD Algeria + EEK Estonia + EGP Egypt + ERN Eritrea + ESP Spain + ETB Ethiopia + EUR Euro Member Countries + FIM Finland + FJD Fiji + FKP Falkland Islands (Malvinas) + FRF France + GBP United Kingdom + GEL Georgia + GGP Guernsey + GHC Ghana + GIP Gibraltar + GMD Gambia + GNF Guinea + GRD Greece + GTQ Guatemala + GYD Guyana + HKD Hong Kong + HNL Honduras + HRK Croatia + HTG Haiti + HUF Hungary + IDR Indonesia + IEP Ireland (Eire) + ILS Israel + IMP Isle of Man + INR India + IQD Iraq + IRR Iran + ISK Iceland + ITL Italy + JEP Jersey + JMD Jamaica + JOD Jordan + JPY Japan + KES Kenya + KGS Kyrgyzstan + KHR Cambodia + KMF Comoros + KPW Korea + KWD Kuwait + KYD Cayman Islands + KZT Kazakstan + LAK Laos + LBP Lebanon + LKR Sri Lanka + LRD Liberia + LSL Lesotho + LTL Lithuania + LUF Luxembourg + LVL Latvia + LYD Libya + MAD Morocco + MDL Moldova + MGF Madagascar + MKD Macedonia + MMK Myanmar (Burma) + MNT Mongolia + MOP Macau + MRO Mauritania + MTL Malta + MUR Mauritius + MVR Maldives (Maldive Islands) + MWK Malawi + MXN Mexico + MYR Malaysia + MZM Mozambique + NAD Namibia + NGN Nigeria + NIO Nicaragua + NLG Netherlands (Holland) + NOK Norway + NPR Nepal + NZD New Zealand + OMR Oman + PAB Panama + PEN Peru + PGK Papua New Guinea + PHP Philippines + PKR Pakistan + PLN Poland + PTE Portugal + PYG Paraguay + QAR Qatar + ROL Romania + RUR Russia + RWF Rwanda + SAR Saudi Arabia + SBD Solomon Islands + SCR Seychelles + SDD Sudan + SEK Sweden + SGD Singapore + SHP Saint Helena + SIT Slovenia + SKK Slovakia + SLL Sierra Leone + SOS Somalia + SPL Seborga + SRG Suriname + STD São Tome and Principe + SVC El Salvador + SYP Syria + SZL Swaziland + THB Thailand + TJR Tajikistan + TMM Turkmenistan + TND Tunisia + TOP Tonga + TRL Turkey + TTD Trinidad and Tobago + TVD Tuvalu + TWD Taiwan + TZS Tanzania + UAH Ukraine + UGX Uganda + USD United States of America + UYU Uruguay + UZS Uzbekistan + VAL Vatican City + VEB Venezuela + VND Viet Nam + VUV Vanuatu + WST Samoa + XAF Communauté Financière Africaine + XAG Silver + XAU Gold + XCD East Caribbean + XDR International Monetary Fund + XPD Palladium + XPF Comptoirs Français du Pacifique + XPT Platinum + YER Yemen + YUM Yugoslavia + ZAR South Africa + ZMK Zambia + ZWD Zimbabwe + + */ + + return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-country'); + } + + /** + * @param string $languagecode + * @param bool $casesensitive + * + * @return string + */ + public static function LanguageLookup($languagecode, $casesensitive=false) { + + if (!$casesensitive) { + $languagecode = strtolower($languagecode); + } + + // http://www.id3.org/id3v2.4.0-structure.txt + // [4. ID3v2 frame overview] + // The three byte language field, present in several frames, is used to + // describe the language of the frame's content, according to ISO-639-2 + // [ISO-639-2]. The language should be represented in lower case. If the + // language is not known the string "XXX" should be used. + + + // ISO 639-2 - http://www.id3.org/iso639-2.html + + $begin = __LINE__; + + /** This is not a comment! + + XXX unknown + xxx unknown + aar Afar + abk Abkhazian + ace Achinese + ach Acoli + ada Adangme + afa Afro-Asiatic (Other) + afh Afrihili + afr Afrikaans + aka Akan + akk Akkadian + alb Albanian + ale Aleut + alg Algonquian Languages + amh Amharic + ang English, Old (ca. 450-1100) + apa Apache Languages + ara Arabic + arc Aramaic + arm Armenian + arn Araucanian + arp Arapaho + art Artificial (Other) + arw Arawak + asm Assamese + ath Athapascan Languages + ava Avaric + ave Avestan + awa Awadhi + aym Aymara + aze Azerbaijani + bad Banda + bai Bamileke Languages + bak Bashkir + bal Baluchi + bam Bambara + ban Balinese + baq Basque + bas Basa + bat Baltic (Other) + bej Beja + bel Byelorussian + bem Bemba + ben Bengali + ber Berber (Other) + bho Bhojpuri + bih Bihari + bik Bikol + bin Bini + bis Bislama + bla Siksika + bnt Bantu (Other) + bod Tibetan + bra Braj + bre Breton + bua Buriat + bug Buginese + bul Bulgarian + bur Burmese + cad Caddo + cai Central American Indian (Other) + car Carib + cat Catalan + cau Caucasian (Other) + ceb Cebuano + cel Celtic (Other) + ces Czech + cha Chamorro + chb Chibcha + che Chechen + chg Chagatai + chi Chinese + chm Mari + chn Chinook jargon + cho Choctaw + chr Cherokee + chu Church Slavic + chv Chuvash + chy Cheyenne + cop Coptic + cor Cornish + cos Corsican + cpe Creoles and Pidgins, English-based (Other) + cpf Creoles and Pidgins, French-based (Other) + cpp Creoles and Pidgins, Portuguese-based (Other) + cre Cree + crp Creoles and Pidgins (Other) + cus Cushitic (Other) + cym Welsh + cze Czech + dak Dakota + dan Danish + del Delaware + deu German + din Dinka + div Divehi + doi Dogri + dra Dravidian (Other) + dua Duala + dum Dutch, Middle (ca. 1050-1350) + dut Dutch + dyu Dyula + dzo Dzongkha + efi Efik + egy Egyptian (Ancient) + eka Ekajuk + ell Greek, Modern (1453-) + elx Elamite + eng English + enm English, Middle (ca. 1100-1500) + epo Esperanto + esk Eskimo (Other) + esl Spanish + est Estonian + eus Basque + ewe Ewe + ewo Ewondo + fan Fang + fao Faroese + fas Persian + fat Fanti + fij Fijian + fin Finnish + fiu Finno-Ugrian (Other) + fon Fon + fra French + fre French + frm French, Middle (ca. 1400-1600) + fro French, Old (842- ca. 1400) + fry Frisian + ful Fulah + gaa Ga + gae Gaelic (Scots) + gai Irish + gay Gayo + gdh Gaelic (Scots) + gem Germanic (Other) + geo Georgian + ger German + gez Geez + gil Gilbertese + glg Gallegan + gmh German, Middle High (ca. 1050-1500) + goh German, Old High (ca. 750-1050) + gon Gondi + got Gothic + grb Grebo + grc Greek, Ancient (to 1453) + gre Greek, Modern (1453-) + grn Guarani + guj Gujarati + hai Haida + hau Hausa + haw Hawaiian + heb Hebrew + her Herero + hil Hiligaynon + him Himachali + hin Hindi + hmo Hiri Motu + hun Hungarian + hup Hupa + hye Armenian + iba Iban + ibo Igbo + ice Icelandic + ijo Ijo + iku Inuktitut + ilo Iloko + ina Interlingua (International Auxiliary language Association) + inc Indic (Other) + ind Indonesian + ine Indo-European (Other) + ine Interlingue + ipk Inupiak + ira Iranian (Other) + iri Irish + iro Iroquoian uages + isl Icelandic + ita Italian + jav Javanese + jaw Javanese + jpn Japanese + jpr Judeo-Persian + jrb Judeo-Arabic + kaa Kara-Kalpak + kab Kabyle + kac Kachin + kal Greenlandic + kam Kamba + kan Kannada + kar Karen + kas Kashmiri + kat Georgian + kau Kanuri + kaw Kawi + kaz Kazakh + kha Khasi + khi Khoisan (Other) + khm Khmer + kho Khotanese + kik Kikuyu + kin Kinyarwanda + kir Kirghiz + kok Konkani + kom Komi + kon Kongo + kor Korean + kpe Kpelle + kro Kru + kru Kurukh + kua Kuanyama + kum Kumyk + kur Kurdish + kus Kusaie + kut Kutenai + lad Ladino + lah Lahnda + lam Lamba + lao Lao + lat Latin + lav Latvian + lez Lezghian + lin Lingala + lit Lithuanian + lol Mongo + loz Lozi + ltz Letzeburgesch + lub Luba-Katanga + lug Ganda + lui Luiseno + lun Lunda + luo Luo (Kenya and Tanzania) + mac Macedonian + mad Madurese + mag Magahi + mah Marshall + mai Maithili + mak Macedonian + mak Makasar + mal Malayalam + man Mandingo + mao Maori + map Austronesian (Other) + mar Marathi + mas Masai + max Manx + may Malay + men Mende + mga Irish, Middle (900 - 1200) + mic Micmac + min Minangkabau + mis Miscellaneous (Other) + mkh Mon-Kmer (Other) + mlg Malagasy + mlt Maltese + mni Manipuri + mno Manobo Languages + moh Mohawk + mol Moldavian + mon Mongolian + mos Mossi + mri Maori + msa Malay + mul Multiple Languages + mun Munda Languages + mus Creek + mwr Marwari + mya Burmese + myn Mayan Languages + nah Aztec + nai North American Indian (Other) + nau Nauru + nav Navajo + nbl Ndebele, South + nde Ndebele, North + ndo Ndongo + nep Nepali + new Newari + nic Niger-Kordofanian (Other) + niu Niuean + nla Dutch + nno Norwegian (Nynorsk) + non Norse, Old + nor Norwegian + nso Sotho, Northern + nub Nubian Languages + nya Nyanja + nym Nyamwezi + nyn Nyankole + nyo Nyoro + nzi Nzima + oci Langue d'Oc (post 1500) + oji Ojibwa + ori Oriya + orm Oromo + osa Osage + oss Ossetic + ota Turkish, Ottoman (1500 - 1928) + oto Otomian Languages + paa Papuan-Australian (Other) + pag Pangasinan + pal Pahlavi + pam Pampanga + pan Panjabi + pap Papiamento + pau Palauan + peo Persian, Old (ca 600 - 400 B.C.) + per Persian + phn Phoenician + pli Pali + pol Polish + pon Ponape + por Portuguese + pra Prakrit uages + pro Provencal, Old (to 1500) + pus Pushto + que Quechua + raj Rajasthani + rar Rarotongan + roa Romance (Other) + roh Rhaeto-Romance + rom Romany + ron Romanian + rum Romanian + run Rundi + rus Russian + sad Sandawe + sag Sango + sah Yakut + sai South American Indian (Other) + sal Salishan Languages + sam Samaritan Aramaic + san Sanskrit + sco Scots + scr Serbo-Croatian + sel Selkup + sem Semitic (Other) + sga Irish, Old (to 900) + shn Shan + sid Sidamo + sin Singhalese + sio Siouan Languages + sit Sino-Tibetan (Other) + sla Slavic (Other) + slk Slovak + slo Slovak + slv Slovenian + smi Sami Languages + smo Samoan + sna Shona + snd Sindhi + sog Sogdian + som Somali + son Songhai + sot Sotho, Southern + spa Spanish + sqi Albanian + srd Sardinian + srr Serer + ssa Nilo-Saharan (Other) + ssw Siswant + ssw Swazi + suk Sukuma + sun Sudanese + sus Susu + sux Sumerian + sve Swedish + swa Swahili + swe Swedish + syr Syriac + tah Tahitian + tam Tamil + tat Tatar + tel Telugu + tem Timne + ter Tereno + tgk Tajik + tgl Tagalog + tha Thai + tib Tibetan + tig Tigre + tir Tigrinya + tiv Tivi + tli Tlingit + tmh Tamashek + tog Tonga (Nyasa) + ton Tonga (Tonga Islands) + tru Truk + tsi Tsimshian + tsn Tswana + tso Tsonga + tuk Turkmen + tum Tumbuka + tur Turkish + tut Altaic (Other) + twi Twi + tyv Tuvinian + uga Ugaritic + uig Uighur + ukr Ukrainian + umb Umbundu + und Undetermined + urd Urdu + uzb Uzbek + vai Vai + ven Venda + vie Vietnamese + vol Volapük + vot Votic + wak Wakashan Languages + wal Walamo + war Waray + was Washo + wel Welsh + wen Sorbian Languages + wol Wolof + xho Xhosa + yao Yao + yap Yap + yid Yiddish + yor Yoruba + zap Zapotec + zen Zenaga + zha Zhuang + zho Chinese + zul Zulu + zun Zuni + + */ + + return getid3_lib::EmbeddedLookup($languagecode, $begin, __LINE__, __FILE__, 'id3v2-languagecode'); + } + + /** + * @param int $index + * + * @return string + */ + public static function ETCOEventLookup($index) { + if (($index >= 0x17) && ($index <= 0xDF)) { + return 'reserved for future use'; + } + if (($index >= 0xE0) && ($index <= 0xEF)) { + return 'not predefined synch 0-F'; + } + if (($index >= 0xF0) && ($index <= 0xFC)) { + return 'reserved for future use'; + } + + static $EventLookup = array( + 0x00 => 'padding (has no meaning)', + 0x01 => 'end of initial silence', + 0x02 => 'intro start', + 0x03 => 'main part start', + 0x04 => 'outro start', + 0x05 => 'outro end', + 0x06 => 'verse start', + 0x07 => 'refrain start', + 0x08 => 'interlude start', + 0x09 => 'theme start', + 0x0A => 'variation start', + 0x0B => 'key change', + 0x0C => 'time change', + 0x0D => 'momentary unwanted noise (Snap, Crackle & Pop)', + 0x0E => 'sustained noise', + 0x0F => 'sustained noise end', + 0x10 => 'intro end', + 0x11 => 'main part end', + 0x12 => 'verse end', + 0x13 => 'refrain end', + 0x14 => 'theme end', + 0x15 => 'profanity', + 0x16 => 'profanity end', + 0xFD => 'audio end (start of silence)', + 0xFE => 'audio file ends', + 0xFF => 'one more byte of events follows' + ); + + return (isset($EventLookup[$index]) ? $EventLookup[$index] : ''); + } + + /** + * @param int $index + * + * @return string + */ + public static function SYTLContentTypeLookup($index) { + static $SYTLContentTypeLookup = array( + 0x00 => 'other', + 0x01 => 'lyrics', + 0x02 => 'text transcription', + 0x03 => 'movement/part name', // (e.g. 'Adagio') + 0x04 => 'events', // (e.g. 'Don Quijote enters the stage') + 0x05 => 'chord', // (e.g. 'Bb F Fsus') + 0x06 => 'trivia/\'pop up\' information', + 0x07 => 'URLs to webpages', + 0x08 => 'URLs to images' + ); + + return (isset($SYTLContentTypeLookup[$index]) ? $SYTLContentTypeLookup[$index] : ''); + } + + /** + * @param int $index + * @param bool $returnarray + * + * @return array|string + */ + public static function APICPictureTypeLookup($index, $returnarray=false) { + static $APICPictureTypeLookup = array( + 0x00 => 'Other', + 0x01 => '32x32 pixels \'file icon\' (PNG only)', + 0x02 => 'Other file icon', + 0x03 => 'Cover (front)', + 0x04 => 'Cover (back)', + 0x05 => 'Leaflet page', + 0x06 => 'Media (e.g. label side of CD)', + 0x07 => 'Lead artist/lead performer/soloist', + 0x08 => 'Artist/performer', + 0x09 => 'Conductor', + 0x0A => 'Band/Orchestra', + 0x0B => 'Composer', + 0x0C => 'Lyricist/text writer', + 0x0D => 'Recording Location', + 0x0E => 'During recording', + 0x0F => 'During performance', + 0x10 => 'Movie/video screen capture', + 0x11 => 'A bright coloured fish', + 0x12 => 'Illustration', + 0x13 => 'Band/artist logotype', + 0x14 => 'Publisher/Studio logotype' + ); + if ($returnarray) { + return $APICPictureTypeLookup; + } + return (isset($APICPictureTypeLookup[$index]) ? $APICPictureTypeLookup[$index] : ''); + } + + /** + * @param int $index + * + * @return string + */ + public static function COMRReceivedAsLookup($index) { + static $COMRReceivedAsLookup = array( + 0x00 => 'Other', + 0x01 => 'Standard CD album with other songs', + 0x02 => 'Compressed audio on CD', + 0x03 => 'File over the Internet', + 0x04 => 'Stream over the Internet', + 0x05 => 'As note sheets', + 0x06 => 'As note sheets in a book with other sheets', + 0x07 => 'Music on other media', + 0x08 => 'Non-musical merchandise' + ); + + return (isset($COMRReceivedAsLookup[$index]) ? $COMRReceivedAsLookup[$index] : ''); + } + + /** + * @param int $index + * + * @return string + */ + public static function RVA2ChannelTypeLookup($index) { + static $RVA2ChannelTypeLookup = array( + 0x00 => 'Other', + 0x01 => 'Master volume', + 0x02 => 'Front right', + 0x03 => 'Front left', + 0x04 => 'Back right', + 0x05 => 'Back left', + 0x06 => 'Front centre', + 0x07 => 'Back centre', + 0x08 => 'Subwoofer' + ); + + return (isset($RVA2ChannelTypeLookup[$index]) ? $RVA2ChannelTypeLookup[$index] : ''); + } + + /** + * @param string $framename + * + * @return string + */ + public static function FrameNameLongLookup($framename) { + + $begin = __LINE__; + + /** This is not a comment! + + AENC Audio encryption + APIC Attached picture + ASPI Audio seek point index + BUF Recommended buffer size + CNT Play counter + COM Comments + COMM Comments + COMR Commercial frame + CRA Audio encryption + CRM Encrypted meta frame + ENCR Encryption method registration + EQU Equalisation + EQU2 Equalisation (2) + EQUA Equalisation + ETC Event timing codes + ETCO Event timing codes + GEO General encapsulated object + GEOB General encapsulated object + GRID Group identification registration + IPL Involved people list + IPLS Involved people list + LINK Linked information + LNK Linked information + MCDI Music CD identifier + MCI Music CD Identifier + MLL MPEG location lookup table + MLLT MPEG location lookup table + OWNE Ownership frame + PCNT Play counter + PIC Attached picture + POP Popularimeter + POPM Popularimeter + POSS Position synchronisation frame + PRIV Private frame + RBUF Recommended buffer size + REV Reverb + RVA Relative volume adjustment + RVA2 Relative volume adjustment (2) + RVAD Relative volume adjustment + RVRB Reverb + SEEK Seek frame + SIGN Signature frame + SLT Synchronised lyric/text + STC Synced tempo codes + SYLT Synchronised lyric/text + SYTC Synchronised tempo codes + TAL Album/Movie/Show title + TALB Album/Movie/Show title + TBP BPM (Beats Per Minute) + TBPM BPM (beats per minute) + TCM Composer + TCMP Part of a compilation + TCO Content type + TCOM Composer + TCON Content type + TCOP Copyright message + TCP Part of a compilation + TCR Copyright message + TDA Date + TDAT Date + TDEN Encoding time + TDLY Playlist delay + TDOR Original release time + TDRC Recording time + TDRL Release time + TDTG Tagging time + TDY Playlist delay + TEN Encoded by + TENC Encoded by + TEXT Lyricist/Text writer + TFLT File type + TFT File type + TIM Time + TIME Time + TIPL Involved people list + TIT1 Content group description + TIT2 Title/songname/content description + TIT3 Subtitle/Description refinement + TKE Initial key + TKEY Initial key + TLA Language(s) + TLAN Language(s) + TLE Length + TLEN Length + TMCL Musician credits list + TMED Media type + TMOO Mood + TMT Media type + TOA Original artist(s)/performer(s) + TOAL Original album/movie/show title + TOF Original filename + TOFN Original filename + TOL Original Lyricist(s)/text writer(s) + TOLY Original lyricist(s)/text writer(s) + TOPE Original artist(s)/performer(s) + TOR Original release year + TORY Original release year + TOT Original album/Movie/Show title + TOWN File owner/licensee + TP1 Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group + TP2 Band/Orchestra/Accompaniment + TP3 Conductor/Performer refinement + TP4 Interpreted, remixed, or otherwise modified by + TPA Part of a set + TPB Publisher + TPE1 Lead performer(s)/Soloist(s) + TPE2 Band/orchestra/accompaniment + TPE3 Conductor/performer refinement + TPE4 Interpreted, remixed, or otherwise modified by + TPOS Part of a set + TPRO Produced notice + TPUB Publisher + TRC ISRC (International Standard Recording Code) + TRCK Track number/Position in set + TRD Recording dates + TRDA Recording dates + TRK Track number/Position in set + TRSN Internet radio station name + TRSO Internet radio station owner + TS2 Album-Artist sort order + TSA Album sort order + TSC Composer sort order + TSI Size + TSIZ Size + TSO2 Album-Artist sort order + TSOA Album sort order + TSOC Composer sort order + TSOP Performer sort order + TSOT Title sort order + TSP Performer sort order + TSRC ISRC (international standard recording code) + TSS Software/hardware and settings used for encoding + TSSE Software/Hardware and settings used for encoding + TSST Set subtitle + TST Title sort order + TT1 Content group description + TT2 Title/Songname/Content description + TT3 Subtitle/Description refinement + TXT Lyricist/text writer + TXX User defined text information frame + TXXX User defined text information frame + TYE Year + TYER Year + UFI Unique file identifier + UFID Unique file identifier + ULT Unsynchronised lyric/text transcription + USER Terms of use + USLT Unsynchronised lyric/text transcription + WAF Official audio file webpage + WAR Official artist/performer webpage + WAS Official audio source webpage + WCM Commercial information + WCOM Commercial information + WCOP Copyright/Legal information + WCP Copyright/Legal information + WOAF Official audio file webpage + WOAR Official artist/performer webpage + WOAS Official audio source webpage + WORS Official Internet radio station homepage + WPAY Payment + WPB Publishers official webpage + WPUB Publishers official webpage + WXX User defined URL link frame + WXXX User defined URL link frame + TFEA Featured Artist + TSTU Recording Studio + rgad Replay Gain Adjustment + + */ + + return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_long'); + + // Last three: + // from Helium2 [www.helium2.com] + // from http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html + } + + /** + * @param string $framename + * + * @return string + */ + public static function FrameNameShortLookup($framename) { + + $begin = __LINE__; + + /** This is not a comment! + + AENC audio_encryption + APIC attached_picture + ASPI audio_seek_point_index + BUF recommended_buffer_size + CNT play_counter + COM comment + COMM comment + COMR commercial_frame + CRA audio_encryption + CRM encrypted_meta_frame + ENCR encryption_method_registration + EQU equalisation + EQU2 equalisation + EQUA equalisation + ETC event_timing_codes + ETCO event_timing_codes + GEO general_encapsulated_object + GEOB general_encapsulated_object + GRID group_identification_registration + IPL involved_people_list + IPLS involved_people_list + LINK linked_information + LNK linked_information + MCDI music_cd_identifier + MCI music_cd_identifier + MLL mpeg_location_lookup_table + MLLT mpeg_location_lookup_table + OWNE ownership_frame + PCNT play_counter + PIC attached_picture + POP popularimeter + POPM popularimeter + POSS position_synchronisation_frame + PRIV private_frame + RBUF recommended_buffer_size + REV reverb + RVA relative_volume_adjustment + RVA2 relative_volume_adjustment + RVAD relative_volume_adjustment + RVRB reverb + SEEK seek_frame + SIGN signature_frame + SLT synchronised_lyric + STC synced_tempo_codes + SYLT synchronised_lyric + SYTC synchronised_tempo_codes + TAL album + TALB album + TBP bpm + TBPM bpm + TCM composer + TCMP part_of_a_compilation + TCO genre + TCOM composer + TCON genre + TCOP copyright_message + TCP part_of_a_compilation + TCR copyright_message + TDA date + TDAT date + TDEN encoding_time + TDLY playlist_delay + TDOR original_release_time + TDRC recording_time + TDRL release_time + TDTG tagging_time + TDY playlist_delay + TEN encoded_by + TENC encoded_by + TEXT lyricist + TFLT file_type + TFT file_type + TIM time + TIME time + TIPL involved_people_list + TIT1 content_group_description + TIT2 title + TIT3 subtitle + TKE initial_key + TKEY initial_key + TLA language + TLAN language + TLE length + TLEN length + TMCL musician_credits_list + TMED media_type + TMOO mood + TMT media_type + TOA original_artist + TOAL original_album + TOF original_filename + TOFN original_filename + TOL original_lyricist + TOLY original_lyricist + TOPE original_artist + TOR original_year + TORY original_year + TOT original_album + TOWN file_owner + TP1 artist + TP2 band + TP3 conductor + TP4 remixer + TPA part_of_a_set + TPB publisher + TPE1 artist + TPE2 band + TPE3 conductor + TPE4 remixer + TPOS part_of_a_set + TPRO produced_notice + TPUB publisher + TRC isrc + TRCK track_number + TRD recording_dates + TRDA recording_dates + TRK track_number + TRSN internet_radio_station_name + TRSO internet_radio_station_owner + TS2 album_artist_sort_order + TSA album_sort_order + TSC composer_sort_order + TSI size + TSIZ size + TSO2 album_artist_sort_order + TSOA album_sort_order + TSOC composer_sort_order + TSOP performer_sort_order + TSOT title_sort_order + TSP performer_sort_order + TSRC isrc + TSS encoder_settings + TSSE encoder_settings + TSST set_subtitle + TST title_sort_order + TT1 content_group_description + TT2 title + TT3 subtitle + TXT lyricist + TXX text + TXXX text + TYE year + TYER year + UFI unique_file_identifier + UFID unique_file_identifier + ULT unsynchronised_lyric + USER terms_of_use + USLT unsynchronised_lyric + WAF url_file + WAR url_artist + WAS url_source + WCM commercial_information + WCOM commercial_information + WCOP copyright + WCP copyright + WOAF url_file + WOAR url_artist + WOAS url_source + WORS url_station + WPAY url_payment + WPB url_publisher + WPUB url_publisher + WXX url_user + WXXX url_user + TFEA featured_artist + TSTU recording_studio + rgad replay_gain_adjustment + + */ + + return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_short'); + } + + /** + * @param string $encoding + * + * @return string + */ + public static function TextEncodingTerminatorLookup($encoding) { + // http://www.id3.org/id3v2.4.0-structure.txt + // Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: + static $TextEncodingTerminatorLookup = array( + 0 => "\x00", // $00 ISO-8859-1. Terminated with $00. + 1 => "\x00\x00", // $01 UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. + 2 => "\x00\x00", // $02 UTF-16BE encoded Unicode without BOM. Terminated with $00 00. + 3 => "\x00", // $03 UTF-8 encoded Unicode. Terminated with $00. + 255 => "\x00\x00" + ); + return (isset($TextEncodingTerminatorLookup[$encoding]) ? $TextEncodingTerminatorLookup[$encoding] : "\x00"); + } + + /** + * @param int $encoding + * + * @return string + */ + public static function TextEncodingNameLookup($encoding) { + // http://www.id3.org/id3v2.4.0-structure.txt + // Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: + static $TextEncodingNameLookup = array( + 0 => 'ISO-8859-1', // $00 ISO-8859-1. Terminated with $00. + 1 => 'UTF-16', // $01 UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. + 2 => 'UTF-16BE', // $02 UTF-16BE encoded Unicode without BOM. Terminated with $00 00. + 3 => 'UTF-8', // $03 UTF-8 encoded Unicode. Terminated with $00. + 255 => 'UTF-16BE' + ); + return (isset($TextEncodingNameLookup[$encoding]) ? $TextEncodingNameLookup[$encoding] : 'ISO-8859-1'); + } + + /** + * @param string $string + * @param string $terminator + * + * @return string + */ + public static function RemoveStringTerminator($string, $terminator) { + // Null terminator at end of comment string is somewhat ambiguous in the specification, may or may not be implemented by various taggers. Remove terminator only if present. + // https://github.com/JamesHeinrich/getID3/issues/121 + // https://community.mp3tag.de/t/x-trailing-nulls-in-id3v2-comments/19227 + if (substr($string, -strlen($terminator), strlen($terminator)) === $terminator) { + $string = substr($string, 0, -strlen($terminator)); + } + return $string; + } + + /** + * @param string $string + * + * @return string + */ + public static function MakeUTF16emptyStringEmpty($string) { + if (in_array($string, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) { + // if string only contains a BOM or terminator then make it actually an empty string + $string = ''; + } + return $string; + } + + /** + * @param string $framename + * @param int $id3v2majorversion + * + * @return bool|int + */ + public static function IsValidID3v2FrameName($framename, $id3v2majorversion) { + switch ($id3v2majorversion) { + case 2: + return preg_match('#[A-Z][A-Z0-9]{2}#', $framename); + break; + + case 3: + case 4: + return preg_match('#[A-Z][A-Z0-9]{3}#', $framename); + break; + } + return false; + } + + /** + * @param string $numberstring + * @param bool $allowdecimal + * @param bool $allownegative + * + * @return bool + */ + public static function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) { + for ($i = 0; $i < strlen($numberstring); $i++) { + if ((chr($numberstring[$i]) < chr('0')) || (chr($numberstring[$i]) > chr('9'))) { + if (($numberstring[$i] == '.') && $allowdecimal) { + // allowed + } elseif (($numberstring[$i] == '-') && $allownegative && ($i == 0)) { + // allowed + } else { + return false; + } + } + } + return true; + } + + /** + * @param string $datestamp + * + * @return bool + */ + public static function IsValidDateStampString($datestamp) { + if (strlen($datestamp) != 8) { + return false; + } + if (!self::IsANumber($datestamp, false)) { + return false; + } + $year = substr($datestamp, 0, 4); + $month = substr($datestamp, 4, 2); + $day = substr($datestamp, 6, 2); + if (($year == 0) || ($month == 0) || ($day == 0)) { + return false; + } + if ($month > 12) { + return false; + } + if ($day > 31) { + return false; + } + if (($day > 30) && (($month == 4) || ($month == 6) || ($month == 9) || ($month == 11))) { + return false; + } + if (($day > 29) && ($month == 2)) { + return false; + } + return true; + } + + /** + * @param int $majorversion + * + * @return int + */ + public static function ID3v2HeaderLength($majorversion) { + return (($majorversion == 2) ? 6 : 10); + } + + /** + * @param string $frame_name + * + * @return string|false + */ + public static function ID3v22iTunesBrokenFrameName($frame_name) { + // iTunes (multiple versions) has been known to write ID3v2.3 style frames + // but use ID3v2.2 frame names, right-padded using either [space] or [null] + // to make them fit in the 4-byte frame name space of the ID3v2.3 frame. + // This function will detect and translate the corrupt frame name into ID3v2.3 standard. + static $ID3v22_iTunes_BrokenFrames = array( + 'BUF' => 'RBUF', // Recommended buffer size + 'CNT' => 'PCNT', // Play counter + 'COM' => 'COMM', // Comments + 'CRA' => 'AENC', // Audio encryption + 'EQU' => 'EQUA', // Equalisation + 'ETC' => 'ETCO', // Event timing codes + 'GEO' => 'GEOB', // General encapsulated object + 'IPL' => 'IPLS', // Involved people list + 'LNK' => 'LINK', // Linked information + 'MCI' => 'MCDI', // Music CD identifier + 'MLL' => 'MLLT', // MPEG location lookup table + 'PIC' => 'APIC', // Attached picture + 'POP' => 'POPM', // Popularimeter + 'REV' => 'RVRB', // Reverb + 'RVA' => 'RVAD', // Relative volume adjustment + 'SLT' => 'SYLT', // Synchronised lyric/text + 'STC' => 'SYTC', // Synchronised tempo codes + 'TAL' => 'TALB', // Album/Movie/Show title + 'TBP' => 'TBPM', // BPM (beats per minute) + 'TCM' => 'TCOM', // Composer + 'TCO' => 'TCON', // Content type + 'TCP' => 'TCMP', // Part of a compilation + 'TCR' => 'TCOP', // Copyright message + 'TDA' => 'TDAT', // Date + 'TDY' => 'TDLY', // Playlist delay + 'TEN' => 'TENC', // Encoded by + 'TFT' => 'TFLT', // File type + 'TIM' => 'TIME', // Time + 'TKE' => 'TKEY', // Initial key + 'TLA' => 'TLAN', // Language(s) + 'TLE' => 'TLEN', // Length + 'TMT' => 'TMED', // Media type + 'TOA' => 'TOPE', // Original artist(s)/performer(s) + 'TOF' => 'TOFN', // Original filename + 'TOL' => 'TOLY', // Original lyricist(s)/text writer(s) + 'TOR' => 'TORY', // Original release year + 'TOT' => 'TOAL', // Original album/movie/show title + 'TP1' => 'TPE1', // Lead performer(s)/Soloist(s) + 'TP2' => 'TPE2', // Band/orchestra/accompaniment + 'TP3' => 'TPE3', // Conductor/performer refinement + 'TP4' => 'TPE4', // Interpreted, remixed, or otherwise modified by + 'TPA' => 'TPOS', // Part of a set + 'TPB' => 'TPUB', // Publisher + 'TRC' => 'TSRC', // ISRC (international standard recording code) + 'TRD' => 'TRDA', // Recording dates + 'TRK' => 'TRCK', // Track number/Position in set + 'TS2' => 'TSO2', // Album-Artist sort order + 'TSA' => 'TSOA', // Album sort order + 'TSC' => 'TSOC', // Composer sort order + 'TSI' => 'TSIZ', // Size + 'TSP' => 'TSOP', // Performer sort order + 'TSS' => 'TSSE', // Software/Hardware and settings used for encoding + 'TST' => 'TSOT', // Title sort order + 'TT1' => 'TIT1', // Content group description + 'TT2' => 'TIT2', // Title/songname/content description + 'TT3' => 'TIT3', // Subtitle/Description refinement + 'TXT' => 'TEXT', // Lyricist/Text writer + 'TXX' => 'TXXX', // User defined text information frame + 'TYE' => 'TYER', // Year + 'UFI' => 'UFID', // Unique file identifier + 'ULT' => 'USLT', // Unsynchronised lyric/text transcription + 'WAF' => 'WOAF', // Official audio file webpage + 'WAR' => 'WOAR', // Official artist/performer webpage + 'WAS' => 'WOAS', // Official audio source webpage + 'WCM' => 'WCOM', // Commercial information + 'WCP' => 'WCOP', // Copyright/Legal information + 'WPB' => 'WPUB', // Publishers official webpage + 'WXX' => 'WXXX', // User defined URL link frame + ); + if (strlen($frame_name) == 4) { + if ((substr($frame_name, 3, 1) == ' ') || (substr($frame_name, 3, 1) == "\x00")) { + if (isset($ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)])) { + return $ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)]; + } + } + } + return false; + } + +} + diff --git a/wp-includes/ID3/module.tag.lyrics3.php b/wp-includes/ID3/module.tag.lyrics3.php new file mode 100644 index 0000000..80e8165 --- /dev/null +++ b/wp-includes/ID3/module.tag.lyrics3.php @@ -0,0 +1,325 @@ + // +// available at https://github.com/JamesHeinrich/getID3 // +// or https://www.getid3.org // +// or http://getid3.sourceforge.net // +// see readme.txt for more details // +///////////////////////////////////////////////////////////////// +/// // +// module.tag.lyrics3.php // +// module for analyzing Lyrics3 tags // +// dependencies: module.tag.apetag.php (optional) // +// /// +///////////////////////////////////////////////////////////////// + + +class getid3_lyrics3 extends getid3_handler +{ + /** + * @return bool + */ + public function Analyze() { + $info = &$this->getid3->info; + + // http://www.volweb.cz/str/tags.htm + + if (!getid3_lib::intValueSupported($info['filesize'])) { + $this->warning('Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); + return false; + } + + $this->fseek((0 - 128 - 9 - 6), SEEK_END); // end - ID3v1 - "LYRICSEND" - [Lyrics3size] + $lyrics3_id3v1 = $this->fread(128 + 9 + 6); + $lyrics3lsz = substr($lyrics3_id3v1, 0, 6); // Lyrics3size + $lyrics3end = substr($lyrics3_id3v1, 6, 9); // LYRICSEND or LYRICS200 + $id3v1tag = substr($lyrics3_id3v1, 15, 128); // ID3v1 + + if ($lyrics3end == 'LYRICSEND') { + // Lyrics3v1, ID3v1, no APE + + $lyrics3size = 5100; + $lyrics3offset = $info['filesize'] - 128 - $lyrics3size; + $lyrics3version = 1; + + } elseif ($lyrics3end == 'LYRICS200') { + // Lyrics3v2, ID3v1, no APE + + // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' + $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); + $lyrics3offset = $info['filesize'] - 128 - $lyrics3size; + $lyrics3version = 2; + + } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICSEND')) { + // Lyrics3v1, no ID3v1, no APE + + $lyrics3size = 5100; + $lyrics3offset = $info['filesize'] - $lyrics3size; + $lyrics3version = 1; + $lyrics3offset = $info['filesize'] - $lyrics3size; + + } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICS200')) { + + // Lyrics3v2, no ID3v1, no APE + + $lyrics3size = (int) strrev(substr(strrev($lyrics3_id3v1), 9, 6)) + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' + $lyrics3offset = $info['filesize'] - $lyrics3size; + $lyrics3version = 2; + + } else { + + if (isset($info['ape']['tag_offset_start']) && ($info['ape']['tag_offset_start'] > 15)) { + + $this->fseek($info['ape']['tag_offset_start'] - 15); + $lyrics3lsz = $this->fread(6); + $lyrics3end = $this->fread(9); + + if ($lyrics3end == 'LYRICSEND') { + // Lyrics3v1, APE, maybe ID3v1 + + $lyrics3size = 5100; + $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size; + $info['avdataend'] = $lyrics3offset; + $lyrics3version = 1; + $this->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability'); + + } elseif ($lyrics3end == 'LYRICS200') { + // Lyrics3v2, APE, maybe ID3v1 + + $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' + $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size; + $lyrics3version = 2; + $this->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability'); + + } + + } + + } + + if (isset($lyrics3offset) && isset($lyrics3version) && isset($lyrics3size)) { + $info['avdataend'] = $lyrics3offset; + $this->getLyrics3Data($lyrics3offset, $lyrics3version, $lyrics3size); + + if (!isset($info['ape'])) { + if (isset($info['lyrics3']['tag_offset_start'])) { + $GETID3_ERRORARRAY = &$info['warning']; + getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, true); + $getid3_temp = new getID3(); + $getid3_temp->openfile($this->getid3->filename); + $getid3_apetag = new getid3_apetag($getid3_temp); + $getid3_apetag->overrideendoffset = $info['lyrics3']['tag_offset_start']; + $getid3_apetag->Analyze(); + if (!empty($getid3_temp->info['ape'])) { + $info['ape'] = $getid3_temp->info['ape']; + } + if (!empty($getid3_temp->info['replay_gain'])) { + $info['replay_gain'] = $getid3_temp->info['replay_gain']; + } + unset($getid3_temp, $getid3_apetag); + } else { + $this->warning('Lyrics3 and APE tags appear to have become entangled (most likely due to updating the APE tags with a non-Lyrics3-aware tagger)'); + } + } + + } + + return true; + } + + /** + * @param int $endoffset + * @param int $version + * @param int $length + * + * @return bool + */ + public function getLyrics3Data($endoffset, $version, $length) { + // http://www.volweb.cz/str/tags.htm + + $info = &$this->getid3->info; + + if (!getid3_lib::intValueSupported($endoffset)) { + $this->warning('Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); + return false; + } + + $this->fseek($endoffset); + if ($length <= 0) { + return false; + } + $rawdata = $this->fread($length); + + $ParsedLyrics3 = array(); + + $ParsedLyrics3['raw']['lyrics3version'] = $version; + $ParsedLyrics3['raw']['lyrics3tagsize'] = $length; + $ParsedLyrics3['tag_offset_start'] = $endoffset; + $ParsedLyrics3['tag_offset_end'] = $endoffset + $length - 1; + + if (substr($rawdata, 0, 11) != 'LYRICSBEGIN') { + if (strpos($rawdata, 'LYRICSBEGIN') !== false) { + + $this->warning('"LYRICSBEGIN" expected at '.$endoffset.' but actually found at '.($endoffset + strpos($rawdata, 'LYRICSBEGIN')).' - this is invalid for Lyrics3 v'.$version); + $info['avdataend'] = $endoffset + strpos($rawdata, 'LYRICSBEGIN'); + $rawdata = substr($rawdata, strpos($rawdata, 'LYRICSBEGIN')); + $length = strlen($rawdata); + $ParsedLyrics3['tag_offset_start'] = $info['avdataend']; + $ParsedLyrics3['raw']['lyrics3tagsize'] = $length; + + } else { + + $this->error('"LYRICSBEGIN" expected at '.$endoffset.' but found "'.substr($rawdata, 0, 11).'" instead'); + return false; + + } + + } + + switch ($version) { + + case 1: + if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICSEND') { + $ParsedLyrics3['raw']['LYR'] = trim(substr($rawdata, 11, strlen($rawdata) - 11 - 9)); + $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); + } else { + $this->error('"LYRICSEND" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'); + return false; + } + break; + + case 2: + if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICS200') { + $ParsedLyrics3['raw']['unparsed'] = substr($rawdata, 11, strlen($rawdata) - 11 - 9 - 6); // LYRICSBEGIN + LYRICS200 + LSZ + $rawdata = $ParsedLyrics3['raw']['unparsed']; + while (strlen($rawdata) > 0) { + $fieldname = substr($rawdata, 0, 3); + $fieldsize = (int) substr($rawdata, 3, 5); + $ParsedLyrics3['raw'][$fieldname] = substr($rawdata, 8, $fieldsize); + $rawdata = substr($rawdata, 3 + 5 + $fieldsize); + } + + if (isset($ParsedLyrics3['raw']['IND'])) { + $i = 0; + $flagnames = array('lyrics', 'timestamps', 'inhibitrandom'); + foreach ($flagnames as $flagname) { + if (strlen($ParsedLyrics3['raw']['IND']) > $i++) { + $ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1 - 1)); + } + } + } + + $fieldnametranslation = array('ETT'=>'title', 'EAR'=>'artist', 'EAL'=>'album', 'INF'=>'comment', 'AUT'=>'author'); + foreach ($fieldnametranslation as $key => $value) { + if (isset($ParsedLyrics3['raw'][$key])) { + $ParsedLyrics3['comments'][$value][] = trim($ParsedLyrics3['raw'][$key]); + } + } + + if (isset($ParsedLyrics3['raw']['IMG'])) { + $imagestrings = explode("\r\n", $ParsedLyrics3['raw']['IMG']); + foreach ($imagestrings as $key => $imagestring) { + if (strpos($imagestring, '||') !== false) { + $imagearray = explode('||', $imagestring); + $ParsedLyrics3['images'][$key]['filename'] = (isset($imagearray[0]) ? $imagearray[0] : ''); + $ParsedLyrics3['images'][$key]['description'] = (isset($imagearray[1]) ? $imagearray[1] : ''); + $ParsedLyrics3['images'][$key]['timestamp'] = $this->Lyrics3Timestamp2Seconds(isset($imagearray[2]) ? $imagearray[2] : ''); + } + } + } + if (isset($ParsedLyrics3['raw']['LYR'])) { + $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); + } + } else { + $this->error('"LYRICS200" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'); + return false; + } + break; + + default: + $this->error('Cannot process Lyrics3 version '.$version.' (only v1 and v2)'); + return false; + break; + } + + + if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] <= $ParsedLyrics3['tag_offset_end'])) { + $this->warning('ID3v1 tag information ignored since it appears to be a false synch in Lyrics3 tag data'); + unset($info['id3v1']); + foreach ($info['warning'] as $key => $value) { + if ($value == 'Some ID3v1 fields do not use NULL characters for padding') { + unset($info['warning'][$key]); + sort($info['warning']); + break; + } + } + } + + $info['lyrics3'] = $ParsedLyrics3; + + return true; + } + + /** + * @param string $rawtimestamp + * + * @return int|false + */ + public function Lyrics3Timestamp2Seconds($rawtimestamp) { + if (preg_match('#^\\[([0-9]{2}):([0-9]{2})\\]$#', $rawtimestamp, $regs)) { + return (int) (($regs[1] * 60) + $regs[2]); + } + return false; + } + + /** + * @param array $Lyrics3data + * + * @return bool + */ + public function Lyrics3LyricsTimestampParse(&$Lyrics3data) { + $lyricsarray = explode("\r\n", $Lyrics3data['raw']['LYR']); + $notimestamplyricsarray = array(); + foreach ($lyricsarray as $key => $lyricline) { + $regs = array(); + unset($thislinetimestamps); + while (preg_match('#^(\\[[0-9]{2}:[0-9]{2}\\])#', $lyricline, $regs)) { + $thislinetimestamps[] = $this->Lyrics3Timestamp2Seconds($regs[0]); + $lyricline = str_replace($regs[0], '', $lyricline); + } + $notimestamplyricsarray[$key] = $lyricline; + if (isset($thislinetimestamps) && is_array($thislinetimestamps)) { + sort($thislinetimestamps); + foreach ($thislinetimestamps as $timestampkey => $timestamp) { + if (isset($Lyrics3data['synchedlyrics'][$timestamp])) { + // timestamps only have a 1-second resolution, it's possible that multiple lines + // could have the same timestamp, if so, append + $Lyrics3data['synchedlyrics'][$timestamp] .= "\r\n".$lyricline; + } else { + $Lyrics3data['synchedlyrics'][$timestamp] = $lyricline; + } + } + } + } + $Lyrics3data['unsynchedlyrics'] = implode("\r\n", $notimestamplyricsarray); + if (isset($Lyrics3data['synchedlyrics']) && is_array($Lyrics3data['synchedlyrics'])) { + ksort($Lyrics3data['synchedlyrics']); + } + return true; + } + + /** + * @param string $char + * + * @return bool|null + */ + public function IntString2Bool($char) { + if ($char == '1') { + return true; + } elseif ($char == '0') { + return false; + } + return null; + } +} diff --git a/wp-includes/ID3/readme.txt b/wp-includes/ID3/readme.txt new file mode 100644 index 0000000..e48bcef --- /dev/null +++ b/wp-includes/ID3/readme.txt @@ -0,0 +1,627 @@ +///////////////////////////////////////////////////////////////// +/// getID3() by James Heinrich // +// available at http://getid3.sourceforge.net // +// or https://www.getid3.org // +// also https://github.com/JamesHeinrich/getID3 // +///////////////////////////////////////////////////////////////// + +***************************************************************** +***************************************************************** + + getID3() is released under multiple licenses. You may choose + from the following licenses, and use getID3 according to the + terms of the license most suitable to your project. + +GNU GPL: https://gnu.org/licenses/gpl.html (v3) + https://gnu.org/licenses/old-licenses/gpl-2.0.html (v2) + https://gnu.org/licenses/old-licenses/gpl-1.0.html (v1) + +GNU LGPL: https://gnu.org/licenses/lgpl.html (v3) + +Mozilla MPL: https://www.mozilla.org/MPL/2.0/ (v2) + +getID3 Commercial License: https://www.getid3.org/#gCL (payment required) + +***************************************************************** +***************************************************************** +Copies of each of the above licenses are included in the 'licenses' +directory of the getID3 distribution. + + + +----------------------------------------------+ + | If you want to donate, there is a link on | + | https://www.getid3.org for PayPal donations. | + +----------------------------------------------+ + + +Quick Start +=========================================================================== + +Q: How can I check that getID3() works on my server/files? +A: Unzip getID3() to a directory, then access /demos/demo.browse.php + + + +Support +=========================================================================== + +Q: I have a question, or I found a bug. What do I do? +A: The preferred method of support requests and/or bug reports is the + forum at http://support.getid3.org/ + + + +Sourceforge Notification +=========================================================================== + +It's highly recommended that you sign up for notification from +Sourceforge for when new versions are released. Please visit: +http://sourceforge.net/project/showfiles.php?group_id=55859 +and click the little "monitor package" icon/link. If you're +previously signed up for the mailing list, be aware that it has +been discontinued, only the automated Sourceforge notification +will be used from now on. + + + +What does getID3() do? +=========================================================================== + +Reads & parses (to varying degrees): + ¤ tags: + * APE (v1 and v2) + * ID3v1 (& ID3v1.1) + * ID3v2 (v2.4, v2.3, v2.2) + * Lyrics3 (v1 & v2) + + ¤ audio-lossy: + * MP3/MP2/MP1 + * MPC / Musepack + * Ogg (Vorbis, OggFLAC, Speex, Opus) + * AAC / MP4 + * AC3 + * DTS + * RealAudio + * Speex + * DSS + * VQF + + ¤ audio-lossless: + * AIFF + * AU + * Bonk + * CD-audio (*.cda) + * FLAC + * LA (Lossless Audio) + * LiteWave + * LPAC + * MIDI + * Monkey's Audio + * OptimFROG + * RKAU + * Shorten + * TTA + * VOC + * WAV (RIFF) + * WavPack + + ¤ audio-video: + * ASF: ASF, Windows Media Audio (WMA), Windows Media Video (WMV) + * AVI (RIFF) + * Flash + * Matroska (MKV) + * MPEG-1 / MPEG-2 + * NSV (Nullsoft Streaming Video) + * Quicktime (including MP4) + * RealVideo + + ¤ still image: + * BMP + * GIF + * JPEG + * PNG + * TIFF + * SWF (Flash) + * PhotoCD + + ¤ data: + * ISO-9660 CD-ROM image (directory structure) + * SZIP (limited support) + * ZIP (directory structure) + * TAR + * CUE + + +Writes: + * ID3v1 (& ID3v1.1) + * ID3v2 (v2.3 & v2.4) + * VorbisComment on OggVorbis + * VorbisComment on FLAC (not OggFLAC) + * APE v2 + * Lyrics3 (delete only) + + + +Requirements +=========================================================================== + +* PHP 4.2.0 up to 5.2.x for getID3() 1.7.x (and earlier) +* PHP 5.0.5 (or higher) for getID3() 1.8.x (and up) +* PHP 5.3.0 (or higher) for getID3() 1.9.17 (and up) +* PHP 5.3.0 (or higher) for getID3() 2.0.x (and up) +* at least 4MB memory for PHP. 8MB or more is highly recommended. + 12MB is required with all modules loaded. + + + +Usage +=========================================================================== + +See /demos/demo.basic.php for a very basic use of getID3() with no +fancy output, just scanning one file. + +See structure.txt for the returned data structure. + +*> For an example of a complete directory-browsing, <* +*> file-scanning implementation of getID3(), please run <* +*> /demos/demo.browse.php <* + +See /demos/demo.mysql.php for a sample recursive scanning code that +scans every file in a given directory, and all sub-directories, stores +the results in a database and allows various analysis / maintenance +operations + +To analyze remote files over HTTP or FTP you need to copy the file +locally first before running getID3(). Your code would look something +like this: + +// Copy remote file locally to scan with getID3() +$remotefilename = 'http://www.example.com/filename.mp3'; +if ($fp_remote = fopen($remotefilename, 'rb')) { + $localtempfilename = tempnam('/tmp', 'getID3'); + if ($fp_local = fopen($localtempfilename, 'wb')) { + while ($buffer = fread($fp_remote, 32768)) { + fwrite($fp_local, $buffer); + } + fclose($fp_local); + + $remote_headers = array_change_key_case(get_headers($remotefilename, 1), CASE_LOWER); + $remote_filesize = (isset($remote_headers['content-length']) ? (is_array($remote_headers['content-length']) ? $remote_headers['content-length'][count($remote_headers['content-length']) - 1] : $remote_headers['content-length']) : null); + + // Initialize getID3 engine + $getID3 = new getID3; + + $ThisFileInfo = $getID3->analyze($localtempfilename, $remote_filesize, basename($remotefilename)); + + // Delete temporary file + unlink($localtempfilename); + } + fclose($fp_remote); +} + +Note: since v1.9.9-20150212 it is possible a second and third parameter +to $getID3->analyze(), for original filesize and original filename +respectively. This permits you to download only a portion of a large remote +file but get accurate playtime estimates, assuming the format only requires +the beginning of the file for correct format analysis. + +See /demos/demo.write.php for how to write tags. + + + +What does the returned data structure look like? +=========================================================================== + +See structure.txt + +It is recommended that you look at the output of +/demos/demo.browse.php scanning the file(s) you're interested in to +confirm what data is actually returned for any particular filetype in +general, and your files in particular, as the actual data returned +may vary considerably depending on what information is available in +the file itself. + + + +Notes +=========================================================================== + +getID3() 1.x: +If the format parser encounters a critical problem, it will return +something in $fileinfo['error'], describing the encountered error. If +a less critical error or notice is generated it will appear in +$fileinfo['warning']. Both keys may contain more than one warning or +error. If something is returned in ['error'] then the file was not +correctly parsed and returned data may or may not be correct and/or +complete. If something is returned in ['warning'] (and not ['error']) +then the data that is returned is OK - usually getID3() is reporting +errors in the file that have been worked around due to known bugs in +other programs. Some warnings may indicate that the data that is +returned is OK but that some data could not be extracted due to +errors in the file. + +getID3() 2.x: +See above except errors are thrown (so you will only get one error). + + + +Disclaimer +=========================================================================== + +getID3() has been tested on many systems, on many types of files, +under many operating systems, and is generally believe to be stable +and safe. That being said, there is still the chance there is an +undiscovered and/or unfixed bug that may potentially corrupt your +file, especially within the writing functions. By using getID3() you +agree that it's not my fault if any of your files are corrupted. +In fact, I'm not liable for anything :) + + + +License +=========================================================================== + +GNU General Public License - see license.txt + +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: +Free Software Foundation, Inc. +59 Temple Place - Suite 330 +Boston, MA 02111-1307, USA. + +FAQ: +Q: Can I use getID3() in my program? Do I need a commercial license? +A: You're generally free to use getID3 however you see fit. The only + case in which you would require a commercial license is if you're + selling your closed-source program that integrates getID3. If you + sell your program including a copy of getID3, that's fine as long + as you include a copy of the sourcecode when you sell it. Or you + can distribute your code without getID3 and say "download it from + getid3.sourceforge.net" + + + +Why is it called "getID3()" if it does so much more than just that? +=========================================================================== + +v0.1 did in fact just do that. I don't have a copy of code that old, but I +could essentially write it today with a one-line function: + function getID3($filename) { return unpack('a3TAG/a30title/a30artist/a30album/a4year/a28comment/c1track/c1genreid', substr(file_get_contents($filename), -128)); } + + +Future Plans +=========================================================================== +https://www.getid3.org/phpBB3/viewforum.php?f=7 + +* Better support for MP4 container format +* Scan for appended ID3v2 tag at end of file per ID3v2.4 specs (Section 5.0) +* Support for JPEG-2000 (http://www.morgan-multimedia.com/jpeg2000_overview.htm) +* Support for MOD (mod/stm/s3m/it/xm/mtm/ult/669) +* Support for ACE (thanks Vince) +* Support for Ogg other than Vorbis, Speex and OggFlac (ie. Ogg+Xvid) +* Ability to create Xing/LAME VBR header for VBR MP3s that are missing VBR header +* Ability to "clean" ID3v2 padding (replace invalid padding with valid padding) +* Warn if MP3s change version mid-stream (in full-scan mode) +* check for corrupt/broken mid-file MP3 streams in histogram scan +* Support for lossless-compression formats + (http://www.firstpr.com.au/audiocomp/lossless/#Links) + (http://compression.ca/act-sound.html) + (http://web.inter.nl.net/users/hvdh/lossless/lossless.htm) +* Support for RIFF-INFO chunks + * http://lotto.st-andrews.ac.uk/~njh/tag_interchange.html + (thanks Nick Humfrey ) + * http://abcavi.narod.ru/sof/abcavi/infotags.htm + (thanks Kibi) +* Better support for Bink video +* http://www.hr/josip/DSP/AudioFile2.html +* http://www.pcisys.net/~melanson/codecs/ +* Detect mp3PRO +* Support for PSD +* Support for JPC +* Support for JP2 +* Support for JPX +* Support for JB2 +* Support for IFF +* Support for ICO +* Support for ANI +* Support for EXE (comments, author, etc) (thanks p*quaedackersØplanet*nl) +* Support for DVD-IFO (region, subtitles, aspect ratio, etc) + (thanks p*quaedackersØplanet*nl) +* More complete support for SWF - parsing encapsulated MP3 and/or JPEG content + (thanks n8n8Øyahoo*com) +* Support for a2b +* Optional scan-through-frames for AVI verification + (thanks rockcohenØmassive-interactive*nl) +* Support for TTF (thanks infoØbutterflyx*com) +* Support for DSS (https://www.getid3.org/phpBB3/viewtopic.php?t=171) +* Support for SMAF (http://smaf-yamaha.com/what/demo.html) + https://www.getid3.org/phpBB3/viewtopic.php?t=182 +* Support for AMR (https://www.getid3.org/phpBB3/viewtopic.php?t=195) +* Support for 3gpp (https://www.getid3.org/phpBB3/viewtopic.php?t=195) +* Support for ID4 (http://www.wackysoft.cjb.net grizlyY2KØhotmail*com) +* Parse XML data returned in Ogg comments +* Parse XML data from Quicktime SMIL metafiles (klausrathØmac*com) +* ID3v2 genre string creator function +* More complete parsing of JPG +* Support for all old-style ASF packets +* ASF/WMA/WMV tag writing +* Parse declared T??? ID3v2 text information frames, where appropriate + (thanks Christian Fritz for the idea) +* Recognize encoder: + http://www.guerillasoft.com/EncSpot2/index.html + http://ff123.net/identify.html + http://www.hydrogenaudio.org/?act=ST&f=16&t=9414 + http://www.hydrogenaudio.org/?showtopic=11785 +* Support for other OS/2 bitmap structures: Bitmap Array('BA'), + Color Icon('CI'), Color Pointer('CP'), Icon('IC'), Pointer ('PT') + http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm +* Support for WavPack RAW mode +* ASF/WMA/WMV data packet parsing +* ID3v2FrameFlagsLookupTagAlter() +* ID3v2FrameFlagsLookupFileAlter() +* obey ID3v2 tag alter/preserve/discard rules +* http://www.geocities.com/SiliconValley/Sector/9654/Softdoc/Illyrium/Aolyr.htm +* proper checking for LINK/LNK frame validity in ID3v2 writing +* proper checking for ASPI-TLEN frame validity in ID3v2 writing +* proper checking for COMR frame validity in ID3v2 writing +* http://www.geocities.co.jp/SiliconValley-Oakland/3664/index.html +* decode GEOB ID3v2 structure as encoded by RealJukebox, + decode NCON ID3v2 structure as encoded by MusicMatch + (probably won't happen - the formats are proprietary) + + + +Known Bugs/Issues in getID3() that may be fixed eventually +=========================================================================== +https://www.getid3.org/phpBB3/viewtopic.php?t=25 + +* Cannot determine bitrate for MPEG video with VBR video data + (need documentation) +* Interlace/progressive cannot be determined for MPEG video + (need documentation) +* MIDI playtime is sometimes inaccurate +* AAC-RAW mode files cannot be identified +* WavPack-RAW mode files cannot be identified +* mp4 files report lots of "Unknown QuickTime atom type" + (need documentation) +* Encrypted ASF/WMA/WMV files warn about "unhandled GUID + ASF_Content_Encryption_Object" +* Bitrate split between audio and video cannot be calculated for + NSV, only the total bitrate. (need documentation) +* All Ogg formats (Vorbis, OggFLAC, Speex) are affected by the + problem of large VorbisComments spanning multiple Ogg pages, but + but only OggVorbis files can be processed with vorbiscomment. +* The version of "head" supplied with Mac OS 10.2.8 (maybe other + versions too) does only understands a single option (-n) and + therefore fails. getID3 ignores this and returns wrong md5_data. + + + +Known Bugs/Issues in getID3() that cannot be fixed +-------------------------------------------------- +https://www.getid3.org/phpBB3/viewtopic.php?t=25 + +* 32-bit PHP installations only: + Files larger than 2GB cannot always be parsed fully by getID3() + due to limitations in the 32-bit PHP filesystem functions. + NOTE: Since v1.7.8b3 there is partial support for larger-than- + 2GB files, most of which will parse OK, as long as no critical + data is located beyond the 2GB offset. + Known will-work: + * all file formats on 64-bit PHP + * ZIP (format doesn't support files >2GB) + * FLAC (current encoders don't support files >2GB) + Known will-not-work: + * ID3v1 tags (always located at end-of-file) + * Lyrics3 tags (always located at end-of-file) + * APE tags (always located at end-of-file) + Maybe-will-work: + * Quicktime (will work if needed metadata is before 2GB offset, + that is if the file has been hinted/optimized for streaming) + * RIFF.WAV (should work fine, but gives warnings about not being + able to parse all chunks) + * RIFF.AVI (playtime will probably be wrong, is only based on + "movi" chunk that fits in the first 2GB, should issue error + to show that playtime is incorrect. Other data should be mostly + correct, assuming that data is constant throughout the file) +* PHP <= v5 on Windows cannot read UTF-8 filenames + + +Known Bugs/Issues in other programs +----------------------------------- +https://www.getid3.org/phpBB3/viewtopic.php?t=25 + +* MusicBrainz Picard (at least up to v1.3.2) writes multiple + ID3v2.3 genres in non-standard forward-slash separated text + rather than parenthesis-numeric+refinement style per the ID3v2.3 + specs. Tags written in ID3v2.4 mode are written correctly. + (detected and worked around by getID3()) +* PZ TagEditor v4.53.408 has been known to insert ID3v2.3 frames + into an existing ID3v2.2 tag which, of course, breaks things +* Windows Media Player (up to v11) and iTunes (up to v10+) do + not correctly handle ID3v2.3 tags with UTF-16BE+BOM + encoding (they assume the data is UTF-16LE+BOM and either + crash (WMP) or output Asian character set (iTunes) +* Winamp (up to v2.80 at least) does not support ID3v2.4 tags, + only ID3v2.3 + see: http://forums.winamp.com/showthread.php?postid=387524 +* Some versions of Helium2 (www.helium2.com) do not write + ID3v2.4-compliant Frame Sizes, even though the tag is marked + as ID3v2.4) (detected by getID3()) +* MP3ext V3.3.17 places a non-compliant padding string at the end + of the ID3v2 header. This is supposedly fixed in v3.4b21 but + only if you manually add a registry key. This fix is not yet + confirmed. (detected by getID3()) +* CDex v1.40 (fixed by v1.50b7) writes non-compliant Ogg comment + strings, supposed to be in the format "NAME=value" but actually + written just "value" (detected by getID3()) +* Oggenc 0.9-rc3 flags the encoded file as ABR whether it's + actually ABR or VBR. +* iTunes (versions "v7.0.0.70" is known-guilty, probably + other versions are too) writes ID3v2.3 comment tags using an + ID3v2.2 frame name (3-bytes) null-padded to 4 bytes which is + not valid for ID3v2.3+ + (detected by getID3() since 1.9.12-201603221746) +* iTunes (versions "X v2.0.3", "v3.0.1" are known-guilty, probably + other versions are too) writes ID3v2.3 comment tags using a + frame name 'COM ' which is not valid for ID3v2.3+ (it's an + ID3v2.2-style frame name) (detected by getID3()) +* MP2enc does not encode mono CBR MP2 files properly (half speed + sound and double playtime) +* MP2enc does not encode mono VBR MP2 files properly (actually + encoded as stereo) +* tooLAME does not encode mono VBR MP2 files properly (actually + encoded as stereo) +* AACenc encodes files in VBR mode (actually ABR) even if CBR is + specified +* AAC/ADIF - bitrate_mode = cbr for vbr files +* LAME 3.90-3.92 prepends one frame of null data (space for the + LAME/VBR header, but it never gets written) when encoding in CBR + mode with the DLL +* Ahead Nero encodes TwinVQF with a DSIZ value (which is supposed + to be the filesize in bytes) of "0" for TwinVQF v1.0 and "1" for + TwinVQF v2.0 (detected by getID3()) +* Ahead Nero encodes TwinVQF files 1 second shorter than they + should be +* AAC-ADTS files are always actually encoded VBR, even if CBR mode + is specified (the CBR-mode switches on the encoder enable ABR + mode, not CBR as such, but it's not possible to tell the + difference between such ABR files and true VBR) +* STREAMINFO.audio_signature in OggFLAC is always null. "The reason + it's like that is because there is no seeking support in + libOggFLAC yet, so it has no way to go back and write the + computed sum after encoding. Seeking support in Ogg FLAC is the + #1 item for the next release." - Josh Coalson (FLAC developer) + NOTE: getID3() will calculate md5_data in a method similar to + other file formats, but that value cannot be compared to the + md5_data value from FLAC data in a FLAC file format. +* STREAMINFO.audio_signature is not calculated in FLAC v0.3.0 & + v0.4.0 - getID3() will calculate md5_data in a method similar to + other file formats, but that value cannot be compared to the + md5_data value from FLAC v0.5.0+ +* RioPort (various versions including 2.0 and 3.11) tags ID3v2 with + a WCOM frame that has no data portion +* Earlier versions of Coolplayer adds illegal ID3 tags to Ogg Vorbis + files, thus making them corrupt. +* Meracl ID3 Tag Writer v1.3.4 (and older) incorrectly truncates the + last byte of data from an MP3 file when appending a new ID3v1 tag. + (detected by getID3()) +* Lossless-Audio files encoded with and without the -noseek switch + do actually differ internally and therefore cannot match md5_data +* iTunes has been known to append a new ID3v1 tag on the end of an + existing ID3v1 tag when ID3v2 tag is also present + (detected by getID3()) +* MediaMonkey may write a blank RGAD ID3v2 frame but put actual + replay gain adjustments in a series of user-defined TXXX frames + (detected and handled by getID3() since v1.9.2) + + + + +Reference material: +=========================================================================== + +[www.id3.org material now mirrored at http://id3lib.sourceforge.net/id3/] +* http://www.id3.org/id3v2.4.0-structure.txt +* http://www.id3.org/id3v2.4.0-frames.txt +* http://www.id3.org/id3v2.4.0-changes.txt +* http://www.id3.org/id3v2.3.0.txt +* http://www.id3.org/id3v2-00.txt +* http://www.id3.org/mp3frame.html +* http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html +* http://www.dv.co.yu/mpgscript/mpeghdr.htm +* http://www.mp3-tech.org/programmer/frame_header.html +* http://users.belgacom.net/gc247244/extra/tag.html +* http://gabriel.mp3-tech.org/mp3infotag.html +* http://www.id3.org/iso4217.html +* http://www.unicode.org/Public/MAPPINGS/ISO8859/8859-1.TXT +* http://www.xiph.org/ogg/vorbis/doc/framing.html +* http://www.xiph.org/ogg/vorbis/doc/v-comment.html +* http://leknor.com/code/php/class.ogg.php.txt +* http://www.id3.org/iso639-2.html +* http://www.id3.org/lyrics3.html +* http://www.id3.org/lyrics3200.html +* http://www.psc.edu/general/software/packages/ieee/ieee.html +* http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html +* http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html +* http://www.jmcgowan.com/avi.html +* http://www.wotsit.org/ +* http://www.herdsoft.com/ti/davincie/davp3xo2.htm +* http://www.mathdogs.com/vorbis-illuminated/bitstream-appendix.html +* "Standard MIDI File Format" by Dustin Caldwell (from www.wotsit.org) +* http://midistudio.com/Help/GMSpecs_Patches.htm +* http://www.xiph.org/archives/vorbis/200109/0459.html +* http://www.replaygain.org/ +* http://www.lossless-audio.com/ +* http://download.microsoft.com/download/winmediatech40/Doc/1.0/WIN98MeXP/EN-US/ASF_Specification_v.1.0.exe +* http://mediaxw.sourceforge.net/files/doc/Active%20Streaming%20Format%20(ASF)%201.0%20Specification.pdf +* http://www.uni-jena.de/~pfk/mpp/sv8/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/sv8/) +* http://jfaul.de/atl/ +* http://www.uni-jena.de/~pfk/mpp/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/) +* http://www.libpng.org/pub/png/spec/png-1.2-pdg.html +* http://www.real.com/devzone/library/creating/rmsdk/doc/rmff.htm +* http://www.fastgraph.com/help/bmp_os2_header_format.html +* http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm +* http://flac.sourceforge.net/format.html +* http://www.research.att.com/projects/mpegaudio/mpeg2.html +* http://www.audiocoding.com/wiki/index.php?page=AAC +* http://libmpeg.org/mpeg4/doc/w2203tfs.pdf +* http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt +* http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/frameset.htm +* http://www.nullsoft.com/nsv/ +* http://www.wotsit.org/download.asp?f=iso9660 +* http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html +* http://www.cdroller.com/htm/readdata.html +* http://www.speex.org/manual/node10.html +* http://www.harmony-central.com/Computer/Programming/aiff-file-format.doc +* http://www.faqs.org/rfcs/rfc2361.html +* http://ghido.shelter.ro/ +* http://www.ebu.ch/tech_t3285.pdf +* http://www.sr.se/utveckling/tu/bwf +* http://ftp.aessc.org/pub/aes46-2002.pdf +* http://cartchunk.org:8080/ +* http://www.broadcastpapers.com/radio/cartchunk01.htm +* http://www.hr/josip/DSP/AudioFile2.html +* http://home.attbi.com/~chris.bagwell/AudioFormats-11.html +* http://www.pure-mac.com/extkey.html +* http://cesnet.dl.sourceforge.net/sourceforge/bonkenc/bonk-binary-format-0.9.txt +* http://www.headbands.com/gspot/ +* http://www.openswf.org/spec/SWFfileformat.html +* http://j-faul.virtualave.net/ +* http://www.btinternet.com/~AnthonyJ/Atari/programming/avr_format.html +* http://cui.unige.ch/OSG/info/AudioFormats/ap11.html +* http://sswf.sourceforge.net/SWFalexref.html +* http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt +* http://www-lehre.informatik.uni-osnabrueck.de/~fbstark/diplom/docs/swf/Flash_Uncovered.htm +* http://developer.apple.com/quicktime/icefloe/dispatch012.html +* http://www.csdn.net/Dev/Format/graphics/PCD.htm +* http://tta.iszf.irk.ru/ +* http://www.atsc.org/standards/a_52a.pdf +* http://www.alanwood.net/unicode/ +* http://www.freelists.org/archives/matroska-devel/07-2003/msg00010.html +* http://www.its.msstate.edu/net/real/reports/config/tags.stats +* http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt +* http://brennan.young.net/Comp/LiveStage/things.html +* http://www.multiweb.cz/twoinches/MP3inside.htm +* http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended +* http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/ +* http://www.unicode.org/unicode/faq/utf_bom.html +* http://tta.corecodec.org/?menu=format +* http://www.scvi.net/nsvformat.htm +* http://pda.etsi.org/pda/queryform.asp +* http://cpansearch.perl.org/src/RGIBSON/Audio-DSS-0.02/lib/Audio/DSS.pm +* http://trac.musepack.net/trac/wiki/SV8Specification +* http://wyday.com/cuesharp/specification.php +* http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html +* http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header +* http://dsd-guide.com/sites/default/files/white-papers/DSFFileFormatSpec_E.pdf diff --git a/wp-includes/IXR/class-IXR-base64.php b/wp-includes/IXR/class-IXR-base64.php new file mode 100644 index 0000000..910f81b --- /dev/null +++ b/wp-includes/IXR/class-IXR-base64.php @@ -0,0 +1,32 @@ +data = $data; + } + + /** + * PHP4 constructor. + */ + public function IXR_Base64( $data ) { + self::__construct( $data ); + } + + function getXml() + { + return ''.base64_encode($this->data).''; + } +} diff --git a/wp-includes/IXR/class-IXR-client.php b/wp-includes/IXR/class-IXR-client.php new file mode 100644 index 0000000..f66bcb3 --- /dev/null +++ b/wp-includes/IXR/class-IXR-client.php @@ -0,0 +1,166 @@ +server = $bits['host']; + $this->port = isset($bits['port']) ? $bits['port'] : 80; + $this->path = isset($bits['path']) ? $bits['path'] : '/'; + + // Make absolutely sure we have a path + if (!$this->path) { + $this->path = '/'; + } + + if ( ! empty( $bits['query'] ) ) { + $this->path .= '?' . $bits['query']; + } + } else { + $this->server = $server; + $this->path = $path; + $this->port = $port; + } + $this->useragent = 'The Incutio XML-RPC PHP Library'; + $this->timeout = $timeout; + } + + /** + * PHP4 constructor. + */ + public function IXR_Client( $server, $path = false, $port = 80, $timeout = 15 ) { + self::__construct( $server, $path, $port, $timeout ); + } + + function query() + { + $args = func_get_args(); + $method = array_shift($args); + $request = new IXR_Request($method, $args); + $length = $request->getLength(); + $xml = $request->getXml(); + $r = "\r\n"; + $request = "POST {$this->path} HTTP/1.0$r"; + + // Merged from WP #8145 - allow custom headers + $this->headers['Host'] = $this->server; + $this->headers['Content-Type'] = 'text/xml'; + $this->headers['User-Agent'] = $this->useragent; + $this->headers['Content-Length']= $length; + + foreach( $this->headers as $header => $value ) { + $request .= "{$header}: {$value}{$r}"; + } + $request .= $r; + + $request .= $xml; + + // Now send the request + if ($this->debug) { + echo '
            '.htmlspecialchars($request)."\n
            \n\n"; + } + + if ($this->timeout) { + $fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout); + } else { + $fp = @fsockopen($this->server, $this->port, $errno, $errstr); + } + if (!$fp) { + $this->error = new IXR_Error(-32300, 'transport error - could not open socket'); + return false; + } + fputs($fp, $request); + $contents = ''; + $debugContents = ''; + $gotFirstLine = false; + $gettingHeaders = true; + while (!feof($fp)) { + $line = fgets($fp, 4096); + if (!$gotFirstLine) { + // Check line for '200' + if (strstr($line, '200') === false) { + $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200'); + return false; + } + $gotFirstLine = true; + } + if (trim($line) == '') { + $gettingHeaders = false; + } + if (!$gettingHeaders) { + // merged from WP #12559 - remove trim + $contents .= $line; + } + if ($this->debug) { + $debugContents .= $line; + } + } + if ($this->debug) { + echo '
            '.htmlspecialchars($debugContents)."\n
            \n\n"; + } + + // Now parse what we've got back + $this->message = new IXR_Message($contents); + if (!$this->message->parse()) { + // XML error + $this->error = new IXR_Error(-32700, 'parse error. not well formed'); + return false; + } + + // Is the message a fault? + if ($this->message->messageType == 'fault') { + $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString); + return false; + } + + // Message must be OK + return true; + } + + function getResponse() + { + // methodResponses can only have one param - return that + return $this->message->params[0]; + } + + function isError() + { + return (is_object($this->error)); + } + + function getErrorCode() + { + return $this->error->code; + } + + function getErrorMessage() + { + return $this->error->message; + } +} diff --git a/wp-includes/IXR/class-IXR-clientmulticall.php b/wp-includes/IXR/class-IXR-clientmulticall.php new file mode 100644 index 0000000..bc40efd --- /dev/null +++ b/wp-includes/IXR/class-IXR-clientmulticall.php @@ -0,0 +1,44 @@ +useragent = 'The Incutio XML-RPC PHP Library (multicall client)'; + } + + /** + * PHP4 constructor. + */ + public function IXR_ClientMulticall( $server, $path = false, $port = 80 ) { + self::__construct( $server, $path, $port ); + } + + function addCall() + { + $args = func_get_args(); + $methodName = array_shift($args); + $struct = array( + 'methodName' => $methodName, + 'params' => $args + ); + $this->calls[] = $struct; + } + + function query() + { + // Prepare multicall, then call the parent::query() method + return parent::query('system.multicall', $this->calls); + } +} diff --git a/wp-includes/IXR/class-IXR-date.php b/wp-includes/IXR/class-IXR-date.php new file mode 100644 index 0000000..fc80cda --- /dev/null +++ b/wp-includes/IXR/class-IXR-date.php @@ -0,0 +1,74 @@ +parseTimestamp($time); + } else { + $this->parseIso($time); + } + } + + /** + * PHP4 constructor. + */ + public function IXR_Date( $time ) { + self::__construct( $time ); + } + + function parseTimestamp($timestamp) + { + $this->year = gmdate('Y', $timestamp); + $this->month = gmdate('m', $timestamp); + $this->day = gmdate('d', $timestamp); + $this->hour = gmdate('H', $timestamp); + $this->minute = gmdate('i', $timestamp); + $this->second = gmdate('s', $timestamp); + $this->timezone = ''; + } + + function parseIso($iso) + { + $this->year = substr($iso, 0, 4); + $this->month = substr($iso, 4, 2); + $this->day = substr($iso, 6, 2); + $this->hour = substr($iso, 9, 2); + $this->minute = substr($iso, 12, 2); + $this->second = substr($iso, 15, 2); + $this->timezone = substr($iso, 17); + } + + function getIso() + { + return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second.$this->timezone; + } + + function getXml() + { + return ''.$this->getIso().''; + } + + function getTimestamp() + { + return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year); + } +} diff --git a/wp-includes/IXR/class-IXR-error.php b/wp-includes/IXR/class-IXR-error.php new file mode 100644 index 0000000..660f7d1 --- /dev/null +++ b/wp-includes/IXR/class-IXR-error.php @@ -0,0 +1,53 @@ +code = $code; + $this->message = htmlspecialchars($message); + } + + /** + * PHP4 constructor. + */ + public function IXR_Error( $code, $message ) { + self::__construct( $code, $message ); + } + + function getXml() + { + $xml = << + + + + + faultCode + {$this->code} + + + faultString + {$this->message} + + + + + + +EOD; + return $xml; + } +} diff --git a/wp-includes/IXR/class-IXR-introspectionserver.php b/wp-includes/IXR/class-IXR-introspectionserver.php new file mode 100644 index 0000000..5628d81 --- /dev/null +++ b/wp-includes/IXR/class-IXR-introspectionserver.php @@ -0,0 +1,174 @@ +setCallbacks(); + $this->setCapabilities(); + $this->capabilities['introspection'] = array( + 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html', + 'specVersion' => 1 + ); + $this->addCallback( + 'system.methodSignature', + 'this:methodSignature', + array('array', 'string'), + 'Returns an array describing the return type and required parameters of a method' + ); + $this->addCallback( + 'system.getCapabilities', + 'this:getCapabilities', + array('struct'), + 'Returns a struct describing the XML-RPC specifications supported by this server' + ); + $this->addCallback( + 'system.listMethods', + 'this:listMethods', + array('array'), + 'Returns an array of available methods on this server' + ); + $this->addCallback( + 'system.methodHelp', + 'this:methodHelp', + array('string', 'string'), + 'Returns a documentation string for the specified method' + ); + } + + /** + * PHP4 constructor. + */ + public function IXR_IntrospectionServer() { + self::__construct(); + } + + function addCallback($method, $callback, $args, $help) + { + $this->callbacks[$method] = $callback; + $this->signatures[$method] = $args; + $this->help[$method] = $help; + } + + function call($methodname, $args) + { + // Make sure it's in an array + if ($args && !is_array($args)) { + $args = array($args); + } + + // Over-rides default call method, adds signature check + if (!$this->hasMethod($methodname)) { + return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.'); + } + $method = $this->callbacks[$methodname]; + $signature = $this->signatures[$methodname]; + $returnType = array_shift($signature); + + // Check the number of arguments + if (count($args) != count($signature)) { + return new IXR_Error(-32602, 'server error. wrong number of method parameters'); + } + + // Check the argument types + $ok = true; + $argsbackup = $args; + for ($i = 0, $j = count($args); $i < $j; $i++) { + $arg = array_shift($args); + $type = array_shift($signature); + switch ($type) { + case 'int': + case 'i4': + if (is_array($arg) || !is_int($arg)) { + $ok = false; + } + break; + case 'base64': + case 'string': + if (!is_string($arg)) { + $ok = false; + } + break; + case 'boolean': + if ($arg !== false && $arg !== true) { + $ok = false; + } + break; + case 'float': + case 'double': + if (!is_float($arg)) { + $ok = false; + } + break; + case 'date': + case 'dateTime.iso8601': + if (!is_a($arg, 'IXR_Date')) { + $ok = false; + } + break; + } + if (!$ok) { + return new IXR_Error(-32602, 'server error. invalid method parameters'); + } + } + // It passed the test - run the "real" method call + return parent::call($methodname, $argsbackup); + } + + function methodSignature($method) + { + if (!$this->hasMethod($method)) { + return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.'); + } + // We should be returning an array of types + $types = $this->signatures[$method]; + $return = array(); + foreach ($types as $type) { + switch ($type) { + case 'string': + $return[] = 'string'; + break; + case 'int': + case 'i4': + $return[] = 42; + break; + case 'double': + $return[] = 3.1415; + break; + case 'dateTime.iso8601': + $return[] = new IXR_Date(time()); + break; + case 'boolean': + $return[] = true; + break; + case 'base64': + $return[] = new IXR_Base64('base64'); + break; + case 'array': + $return[] = array('array'); + break; + case 'struct': + $return[] = array('struct' => 'struct'); + break; + } + } + return $return; + } + + function methodHelp($method) + { + return $this->help[$method]; + } +} diff --git a/wp-includes/IXR/class-IXR-message.php b/wp-includes/IXR/class-IXR-message.php new file mode 100644 index 0000000..6b8cd5a --- /dev/null +++ b/wp-includes/IXR/class-IXR-message.php @@ -0,0 +1,234 @@ +message =& $message; + } + + /** + * PHP4 constructor. + */ + public function IXR_Message( $message ) { + self::__construct( $message ); + } + + function parse() + { + if ( ! function_exists( 'xml_parser_create' ) ) { + trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) ); + return false; + } + + // first remove the XML declaration + // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages + $header = preg_replace( '/<\?xml.*?\?'.'>/s', '', substr( $this->message, 0, 100 ), 1 ); + $this->message = trim( substr_replace( $this->message, $header, 0, 100 ) ); + if ( '' == $this->message ) { + return false; + } + + // Then remove the DOCTYPE + $header = preg_replace( '/^]*+>/i', '', substr( $this->message, 0, 200 ), 1 ); + $this->message = trim( substr_replace( $this->message, $header, 0, 200 ) ); + if ( '' == $this->message ) { + return false; + } + + // Check that the root tag is valid + $root_tag = substr( $this->message, 0, strcspn( substr( $this->message, 0, 20 ), "> \t\r\n" ) ); + if ( 'message, '<' ) ) { + return false; + } + + $this->_parser = xml_parser_create(); + // Set XML parser to take the case of tags in to account + xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false); + // Set XML parser callback functions + xml_set_object($this->_parser, $this); + xml_set_element_handler($this->_parser, 'tag_open', 'tag_close'); + xml_set_character_data_handler($this->_parser, 'cdata'); + + // 256Kb, parse in chunks to avoid the RAM usage on very large messages + $chunk_size = 262144; + + /** + * Filters the chunk size that can be used to parse an XML-RPC response message. + * + * @since 4.4.0 + * + * @param int $chunk_size Chunk size to parse in bytes. + */ + $chunk_size = apply_filters( 'xmlrpc_chunk_parsing_size', $chunk_size ); + + $final = false; + do { + if (strlen($this->message) <= $chunk_size) { + $final = true; + } + $part = substr($this->message, 0, $chunk_size); + $this->message = substr($this->message, $chunk_size); + if (!xml_parse($this->_parser, $part, $final)) { + return false; + } + if ($final) { + break; + } + } while (true); + xml_parser_free($this->_parser); + + // Grab the error messages, if any + if ($this->messageType == 'fault') { + $this->faultCode = $this->params[0]['faultCode']; + $this->faultString = $this->params[0]['faultString']; + } + return true; + } + + function tag_open($parser, $tag, $attr) + { + $this->_currentTagContents = ''; + $this->currentTag = $tag; + switch($tag) { + case 'methodCall': + case 'methodResponse': + case 'fault': + $this->messageType = $tag; + break; + /* Deal with stacks of arrays and structs */ + case 'data': // data is to all intents and puposes more interesting than array + $this->_arraystructstypes[] = 'array'; + $this->_arraystructs[] = array(); + break; + case 'struct': + $this->_arraystructstypes[] = 'struct'; + $this->_arraystructs[] = array(); + break; + } + } + + function cdata($parser, $cdata) + { + $this->_currentTagContents .= $cdata; + } + + function tag_close($parser, $tag) + { + $valueFlag = false; + switch($tag) { + case 'int': + case 'i4': + $value = (int)trim($this->_currentTagContents); + $valueFlag = true; + break; + case 'double': + $value = (double)trim($this->_currentTagContents); + $valueFlag = true; + break; + case 'string': + $value = (string)trim($this->_currentTagContents); + $valueFlag = true; + break; + case 'dateTime.iso8601': + $value = new IXR_Date(trim($this->_currentTagContents)); + $valueFlag = true; + break; + case 'value': + // "If no type is indicated, the type is string." + if (trim($this->_currentTagContents) != '') { + $value = (string)$this->_currentTagContents; + $valueFlag = true; + } + break; + case 'boolean': + $value = (boolean)trim($this->_currentTagContents); + $valueFlag = true; + break; + case 'base64': + $value = base64_decode($this->_currentTagContents); + $valueFlag = true; + break; + /* Deal with stacks of arrays and structs */ + case 'data': + case 'struct': + $value = array_pop($this->_arraystructs); + array_pop($this->_arraystructstypes); + $valueFlag = true; + break; + case 'member': + array_pop($this->_currentStructName); + break; + case 'name': + $this->_currentStructName[] = trim($this->_currentTagContents); + break; + case 'methodName': + $this->methodName = trim($this->_currentTagContents); + break; + } + + if ($valueFlag) { + if (count($this->_arraystructs) > 0) { + // Add value to struct or array + if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') { + // Add to struct + $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value; + } else { + // Add to array + $this->_arraystructs[count($this->_arraystructs)-1][] = $value; + } + } else { + // Just add as a parameter + $this->params[] = $value; + } + } + $this->_currentTagContents = ''; + } +} diff --git a/wp-includes/IXR/class-IXR-request.php b/wp-includes/IXR/class-IXR-request.php new file mode 100644 index 0000000..b00687b --- /dev/null +++ b/wp-includes/IXR/class-IXR-request.php @@ -0,0 +1,54 @@ +method = $method; + $this->args = $args; + $this->xml = << + +{$this->method} + + +EOD; + foreach ($this->args as $arg) { + $this->xml .= ''; + $v = new IXR_Value($arg); + $this->xml .= $v->getXml(); + $this->xml .= "\n"; + } + $this->xml .= ''; + } + + /** + * PHP4 constructor. + */ + public function IXR_Request( $method, $args ) { + self::__construct( $method, $args ); + } + + function getLength() + { + return strlen($this->xml); + } + + function getXml() + { + return $this->xml; + } +} diff --git a/wp-includes/IXR/class-IXR-server.php b/wp-includes/IXR/class-IXR-server.php new file mode 100644 index 0000000..9702ba2 --- /dev/null +++ b/wp-includes/IXR/class-IXR-server.php @@ -0,0 +1,225 @@ +setCapabilities(); + if ($callbacks) { + $this->callbacks = $callbacks; + } + $this->setCallbacks(); + if (!$wait) { + $this->serve($data); + } + } + + /** + * PHP4 constructor. + */ + public function IXR_Server( $callbacks = false, $data = false, $wait = false ) { + self::__construct( $callbacks, $data, $wait ); + } + + function serve($data = false) + { + if (!$data) { + if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') { + if ( function_exists( 'status_header' ) ) { + status_header( 405 ); // WP #20986 + header( 'Allow: POST' ); + } + header('Content-Type: text/plain'); // merged from WP #9093 + die('XML-RPC server accepts POST requests only.'); + } + + global $HTTP_RAW_POST_DATA; + if (empty($HTTP_RAW_POST_DATA)) { + // workaround for a bug in PHP 5.2.2 - http://bugs.php.net/bug.php?id=41293 + $data = file_get_contents('php://input'); + } else { + $data =& $HTTP_RAW_POST_DATA; + } + } + $this->message = new IXR_Message($data); + if (!$this->message->parse()) { + $this->error(-32700, 'parse error. not well formed'); + } + if ($this->message->messageType != 'methodCall') { + $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall'); + } + $result = $this->call($this->message->methodName, $this->message->params); + + // Is the result an error? + if (is_a($result, 'IXR_Error')) { + $this->error($result); + } + + // Encode the result + $r = new IXR_Value($result); + $resultxml = $r->getXml(); + + // Create the XML + $xml = << + + + + $resultxml + + + + + +EOD; + // Send it + $this->output($xml); + } + + function call($methodname, $args) + { + if (!$this->hasMethod($methodname)) { + return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.'); + } + $method = $this->callbacks[$methodname]; + + // Perform the callback and send the response + if (count($args) == 1) { + // If only one parameter just send that instead of the whole array + $args = $args[0]; + } + + // Are we dealing with a function or a method? + if (is_string($method) && substr($method, 0, 5) == 'this:') { + // It's a class method - check it exists + $method = substr($method, 5); + if (!method_exists($this, $method)) { + return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.'); + } + + //Call the method + $result = $this->$method($args); + } else { + // It's a function - does it exist? + if (is_array($method)) { + if (!is_callable(array($method[0], $method[1]))) { + return new IXR_Error(-32601, 'server error. requested object method "'.$method[1].'" does not exist.'); + } + } else if (!function_exists($method)) { + return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.'); + } + + // Call the function + $result = call_user_func($method, $args); + } + return $result; + } + + function error($error, $message = false) + { + // Accepts either an error object or an error code and message + if ($message && !is_object($error)) { + $error = new IXR_Error($error, $message); + } + $this->output($error->getXml()); + } + + function output($xml) + { + $charset = function_exists('get_option') ? get_option('blog_charset') : ''; + if ($charset) + $xml = ''."\n".$xml; + else + $xml = ''."\n".$xml; + $length = strlen($xml); + header('Connection: close'); + if ($charset) + header('Content-Type: text/xml; charset='.$charset); + else + header('Content-Type: text/xml'); + header('Date: '.gmdate('r')); + echo $xml; + exit; + } + + function hasMethod($method) + { + return in_array($method, array_keys($this->callbacks)); + } + + function setCapabilities() + { + // Initialises capabilities array + $this->capabilities = array( + 'xmlrpc' => array( + 'specUrl' => 'http://www.xmlrpc.com/spec', + 'specVersion' => 1 + ), + 'faults_interop' => array( + 'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php', + 'specVersion' => 20010516 + ), + 'system.multicall' => array( + 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208', + 'specVersion' => 1 + ), + ); + } + + function getCapabilities($args) + { + return $this->capabilities; + } + + function setCallbacks() + { + $this->callbacks['system.getCapabilities'] = 'this:getCapabilities'; + $this->callbacks['system.listMethods'] = 'this:listMethods'; + $this->callbacks['system.multicall'] = 'this:multiCall'; + } + + function listMethods($args) + { + // Returns a list of methods - uses array_reverse to ensure user defined + // methods are listed before server defined methods + return array_reverse(array_keys($this->callbacks)); + } + + function multiCall($methodcalls) + { + // See http://www.xmlrpc.com/discuss/msgReader$1208 + $return = array(); + foreach ($methodcalls as $call) { + $method = $call['methodName']; + $params = $call['params']; + if ($method == 'system.multicall') { + $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden'); + } else { + $result = $this->call($method, $params); + } + if (is_a($result, 'IXR_Error')) { + $return[] = array( + 'faultCode' => $result->code, + 'faultString' => $result->message + ); + } else { + $return[] = array($result); + } + } + return $return; + } +} diff --git a/wp-includes/IXR/class-IXR-value.php b/wp-includes/IXR/class-IXR-value.php new file mode 100644 index 0000000..0fd878b --- /dev/null +++ b/wp-includes/IXR/class-IXR-value.php @@ -0,0 +1,138 @@ +data = $data; + if (!$type) { + $type = $this->calculateType(); + } + $this->type = $type; + if ($type == 'struct') { + // Turn all the values in the array in to new IXR_Value objects + foreach ($this->data as $key => $value) { + $this->data[$key] = new IXR_Value($value); + } + } + if ($type == 'array') { + for ($i = 0, $j = count($this->data); $i < $j; $i++) { + $this->data[$i] = new IXR_Value($this->data[$i]); + } + } + } + + /** + * PHP4 constructor. + */ + public function IXR_Value( $data, $type = false ) { + self::__construct( $data, $type ); + } + + function calculateType() + { + if ($this->data === true || $this->data === false) { + return 'boolean'; + } + if (is_integer($this->data)) { + return 'int'; + } + if (is_double($this->data)) { + return 'double'; + } + + // Deal with IXR object types base64 and date + if (is_object($this->data) && is_a($this->data, 'IXR_Date')) { + return 'date'; + } + if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) { + return 'base64'; + } + + // If it is a normal PHP object convert it in to a struct + if (is_object($this->data)) { + $this->data = get_object_vars($this->data); + return 'struct'; + } + if (!is_array($this->data)) { + return 'string'; + } + + // We have an array - is it an array or a struct? + if ($this->isStruct($this->data)) { + return 'struct'; + } else { + return 'array'; + } + } + + function getXml() + { + // Return XML for this value + switch ($this->type) { + case 'boolean': + return ''.(($this->data) ? '1' : '0').''; + break; + case 'int': + return ''.$this->data.''; + break; + case 'double': + return ''.$this->data.''; + break; + case 'string': + return ''.htmlspecialchars($this->data).''; + break; + case 'array': + $return = ''."\n"; + foreach ($this->data as $item) { + $return .= ' '.$item->getXml()."\n"; + } + $return .= ''; + return $return; + break; + case 'struct': + $return = ''."\n"; + foreach ($this->data as $name => $value) { + $name = htmlspecialchars($name); + $return .= " $name"; + $return .= $value->getXml()."\n"; + } + $return .= ''; + return $return; + break; + case 'date': + case 'base64': + return $this->data->getXml(); + break; + } + return false; + } + + /** + * Checks whether or not the supplied array is a struct or not + * + * @param array $array + * @return bool + */ + function isStruct($array) + { + $expected = 0; + foreach ($array as $key => $value) { + if ((string)$key !== (string)$expected) { + return true; + } + $expected++; + } + return false; + } +} diff --git a/wp-includes/Requests/Auth.php b/wp-includes/Requests/Auth.php new file mode 100644 index 0000000..bca4109 --- /dev/null +++ b/wp-includes/Requests/Auth.php @@ -0,0 +1,33 @@ +user, $this->pass) = $args; + } + } + + /** + * Register the necessary callbacks + * + * @see curl_before_send + * @see fsockopen_header + * @param Requests_Hooks $hooks Hook system + */ + public function register(Requests_Hooks &$hooks) { + $hooks->register('curl.before_send', array(&$this, 'curl_before_send')); + $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header')); + } + + /** + * Set cURL parameters before the data is sent + * + * @param resource $handle cURL resource + */ + public function curl_before_send(&$handle) { + curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_setopt($handle, CURLOPT_USERPWD, $this->getAuthString()); + } + + /** + * Add extra headers to the request before sending + * + * @param string $out HTTP header string + */ + public function fsockopen_header(&$out) { + $out .= sprintf("Authorization: Basic %s\r\n", base64_encode($this->getAuthString())); + } + + /** + * Get the authentication string (user:pass) + * + * @return string + */ + public function getAuthString() { + return $this->user . ':' . $this->pass; + } +} \ No newline at end of file diff --git a/wp-includes/Requests/Cookie.php b/wp-includes/Requests/Cookie.php new file mode 100644 index 0000000..6fccec6 --- /dev/null +++ b/wp-includes/Requests/Cookie.php @@ -0,0 +1,505 @@ +name = $name; + $this->value = $value; + $this->attributes = $attributes; + $default_flags = array( + 'creation' => time(), + 'last-access' => time(), + 'persistent' => false, + 'host-only' => true, + ); + $this->flags = array_merge($default_flags, $flags); + + $this->reference_time = time(); + if ($reference_time !== null) { + $this->reference_time = $reference_time; + } + + $this->normalize(); + } + + /** + * Check if a cookie is expired. + * + * Checks the age against $this->reference_time to determine if the cookie + * is expired. + * + * @return boolean True if expired, false if time is valid. + */ + public function is_expired() { + // RFC6265, s. 4.1.2.2: + // If a cookie has both the Max-Age and the Expires attribute, the Max- + // Age attribute has precedence and controls the expiration date of the + // cookie. + if (isset($this->attributes['max-age'])) { + $max_age = $this->attributes['max-age']; + return $max_age < $this->reference_time; + } + + if (isset($this->attributes['expires'])) { + $expires = $this->attributes['expires']; + return $expires < $this->reference_time; + } + + return false; + } + + /** + * Check if a cookie is valid for a given URI + * + * @param Requests_IRI $uri URI to check + * @return boolean Whether the cookie is valid for the given URI + */ + public function uri_matches(Requests_IRI $uri) { + if (!$this->domain_matches($uri->host)) { + return false; + } + + if (!$this->path_matches($uri->path)) { + return false; + } + + return empty($this->attributes['secure']) || $uri->scheme === 'https'; + } + + /** + * Check if a cookie is valid for a given domain + * + * @param string $string Domain to check + * @return boolean Whether the cookie is valid for the given domain + */ + public function domain_matches($string) { + if (!isset($this->attributes['domain'])) { + // Cookies created manually; cookies created by Requests will set + // the domain to the requested domain + return true; + } + + $domain_string = $this->attributes['domain']; + if ($domain_string === $string) { + // The domain string and the string are identical. + return true; + } + + // If the cookie is marked as host-only and we don't have an exact + // match, reject the cookie + if ($this->flags['host-only'] === true) { + return false; + } + + if (strlen($string) <= strlen($domain_string)) { + // For obvious reasons, the string cannot be a suffix if the domain + // is shorter than the domain string + return false; + } + + if (substr($string, -1 * strlen($domain_string)) !== $domain_string) { + // The domain string should be a suffix of the string. + return false; + } + + $prefix = substr($string, 0, strlen($string) - strlen($domain_string)); + if (substr($prefix, -1) !== '.') { + // The last character of the string that is not included in the + // domain string should be a %x2E (".") character. + return false; + } + + // The string should be a host name (i.e., not an IP address). + return !preg_match('#^(.+\.)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $string); + } + + /** + * Check if a cookie is valid for a given path + * + * From the path-match check in RFC 6265 section 5.1.4 + * + * @param string $request_path Path to check + * @return boolean Whether the cookie is valid for the given path + */ + public function path_matches($request_path) { + if (empty($request_path)) { + // Normalize empty path to root + $request_path = '/'; + } + + if (!isset($this->attributes['path'])) { + // Cookies created manually; cookies created by Requests will set + // the path to the requested path + return true; + } + + $cookie_path = $this->attributes['path']; + + if ($cookie_path === $request_path) { + // The cookie-path and the request-path are identical. + return true; + } + + if (strlen($request_path) > strlen($cookie_path) && substr($request_path, 0, strlen($cookie_path)) === $cookie_path) { + if (substr($cookie_path, -1) === '/') { + // The cookie-path is a prefix of the request-path, and the last + // character of the cookie-path is %x2F ("/"). + return true; + } + + if (substr($request_path, strlen($cookie_path), 1) === '/') { + // The cookie-path is a prefix of the request-path, and the + // first character of the request-path that is not included in + // the cookie-path is a %x2F ("/") character. + return true; + } + } + + return false; + } + + /** + * Normalize cookie and attributes + * + * @return boolean Whether the cookie was successfully normalized + */ + public function normalize() { + foreach ($this->attributes as $key => $value) { + $orig_value = $value; + $value = $this->normalize_attribute($key, $value); + if ($value === null) { + unset($this->attributes[$key]); + continue; + } + + if ($value !== $orig_value) { + $this->attributes[$key] = $value; + } + } + + return true; + } + + /** + * Parse an individual cookie attribute + * + * Handles parsing individual attributes from the cookie values. + * + * @param string $name Attribute name + * @param string|boolean $value Attribute value (string value, or true if empty/flag) + * @return mixed Value if available, or null if the attribute value is invalid (and should be skipped) + */ + protected function normalize_attribute($name, $value) { + switch (strtolower($name)) { + case 'expires': + // Expiration parsing, as per RFC 6265 section 5.2.1 + if (is_int($value)) { + return $value; + } + + $expiry_time = strtotime($value); + if ($expiry_time === false) { + return null; + } + + return $expiry_time; + + case 'max-age': + // Expiration parsing, as per RFC 6265 section 5.2.2 + if (is_int($value)) { + return $value; + } + + // Check that we have a valid age + if (!preg_match('/^-?\d+$/', $value)) { + return null; + } + + $delta_seconds = (int) $value; + if ($delta_seconds <= 0) { + $expiry_time = 0; + } + else { + $expiry_time = $this->reference_time + $delta_seconds; + } + + return $expiry_time; + + case 'domain': + // Domains are not required as per RFC 6265 section 5.2.3 + if (empty($value)) { + return null; + } + + // Domain normalization, as per RFC 6265 section 5.2.3 + if ($value[0] === '.') { + $value = substr($value, 1); + } + + return $value; + + default: + return $value; + } + } + + /** + * Format a cookie for a Cookie header + * + * This is used when sending cookies to a server. + * + * @return string Cookie formatted for Cookie header + */ + public function format_for_header() { + return sprintf('%s=%s', $this->name, $this->value); + } + + /** + * Format a cookie for a Cookie header + * + * @codeCoverageIgnore + * @deprecated Use {@see Requests_Cookie::format_for_header} + * @return string + */ + public function formatForHeader() { + return $this->format_for_header(); + } + + /** + * Format a cookie for a Set-Cookie header + * + * This is used when sending cookies to clients. This isn't really + * applicable to client-side usage, but might be handy for debugging. + * + * @return string Cookie formatted for Set-Cookie header + */ + public function format_for_set_cookie() { + $header_value = $this->format_for_header(); + if (!empty($this->attributes)) { + $parts = array(); + foreach ($this->attributes as $key => $value) { + // Ignore non-associative attributes + if (is_numeric($key)) { + $parts[] = $value; + } + else { + $parts[] = sprintf('%s=%s', $key, $value); + } + } + + $header_value .= '; ' . implode('; ', $parts); + } + return $header_value; + } + + /** + * Format a cookie for a Set-Cookie header + * + * @codeCoverageIgnore + * @deprecated Use {@see Requests_Cookie::format_for_set_cookie} + * @return string + */ + public function formatForSetCookie() { + return $this->format_for_set_cookie(); + } + + /** + * Get the cookie value + * + * Attributes and other data can be accessed via methods. + */ + public function __toString() { + return $this->value; + } + + /** + * Parse a cookie string into a cookie object + * + * Based on Mozilla's parsing code in Firefox and related projects, which + * is an intentional deviation from RFC 2109 and RFC 2616. RFC 6265 + * specifies some of this handling, but not in a thorough manner. + * + * @param string Cookie header value (from a Set-Cookie header) + * @return Requests_Cookie Parsed cookie object + */ + public static function parse($string, $name = '', $reference_time = null) { + $parts = explode(';', $string); + $kvparts = array_shift($parts); + + if (!empty($name)) { + $value = $string; + } + elseif (strpos($kvparts, '=') === false) { + // Some sites might only have a value without the equals separator. + // Deviate from RFC 6265 and pretend it was actually a blank name + // (`=foo`) + // + // https://bugzilla.mozilla.org/show_bug.cgi?id=169091 + $name = ''; + $value = $kvparts; + } + else { + list($name, $value) = explode('=', $kvparts, 2); + } + $name = trim($name); + $value = trim($value); + + // Attribute key are handled case-insensitively + $attributes = new Requests_Utility_CaseInsensitiveDictionary(); + + if (!empty($parts)) { + foreach ($parts as $part) { + if (strpos($part, '=') === false) { + $part_key = $part; + $part_value = true; + } + else { + list($part_key, $part_value) = explode('=', $part, 2); + $part_value = trim($part_value); + } + + $part_key = trim($part_key); + $attributes[$part_key] = $part_value; + } + } + + return new Requests_Cookie($name, $value, $attributes, array(), $reference_time); + } + + /** + * Parse all Set-Cookie headers from request headers + * + * @param Requests_Response_Headers $headers Headers to parse from + * @param Requests_IRI|null $origin URI for comparing cookie origins + * @param int|null $time Reference time for expiration calculation + * @return array + */ + public static function parse_from_headers(Requests_Response_Headers $headers, Requests_IRI $origin = null, $time = null) { + $cookie_headers = $headers->getValues('Set-Cookie'); + if (empty($cookie_headers)) { + return array(); + } + + $cookies = array(); + foreach ($cookie_headers as $header) { + $parsed = self::parse($header, '', $time); + + // Default domain/path attributes + if (empty($parsed->attributes['domain']) && !empty($origin)) { + $parsed->attributes['domain'] = $origin->host; + $parsed->flags['host-only'] = true; + } + else { + $parsed->flags['host-only'] = false; + } + + $path_is_valid = (!empty($parsed->attributes['path']) && $parsed->attributes['path'][0] === '/'); + if (!$path_is_valid && !empty($origin)) { + $path = $origin->path; + + // Default path normalization as per RFC 6265 section 5.1.4 + if (substr($path, 0, 1) !== '/') { + // If the uri-path is empty or if the first character of + // the uri-path is not a %x2F ("/") character, output + // %x2F ("/") and skip the remaining steps. + $path = '/'; + } + elseif (substr_count($path, '/') === 1) { + // If the uri-path contains no more than one %x2F ("/") + // character, output %x2F ("/") and skip the remaining + // step. + $path = '/'; + } + else { + // Output the characters of the uri-path from the first + // character up to, but not including, the right-most + // %x2F ("/"). + $path = substr($path, 0, strrpos($path, '/')); + } + $parsed->attributes['path'] = $path; + } + + // Reject invalid cookie domains + if (!empty($origin) && !$parsed->domain_matches($origin->host)) { + continue; + } + + $cookies[$parsed->name] = $parsed; + } + + return $cookies; + } + + /** + * Parse all Set-Cookie headers from request headers + * + * @codeCoverageIgnore + * @deprecated Use {@see Requests_Cookie::parse_from_headers} + * @return string + */ + public static function parseFromHeaders(Requests_Response_Headers $headers) { + return self::parse_from_headers($headers); + } +} diff --git a/wp-includes/Requests/Cookie/Jar.php b/wp-includes/Requests/Cookie/Jar.php new file mode 100644 index 0000000..69be0fb --- /dev/null +++ b/wp-includes/Requests/Cookie/Jar.php @@ -0,0 +1,175 @@ +cookies = $cookies; + } + + /** + * Normalise cookie data into a Requests_Cookie + * + * @param string|Requests_Cookie $cookie + * @return Requests_Cookie + */ + public function normalize_cookie($cookie, $key = null) { + if ($cookie instanceof Requests_Cookie) { + return $cookie; + } + + return Requests_Cookie::parse($cookie, $key); + } + + /** + * Normalise cookie data into a Requests_Cookie + * + * @codeCoverageIgnore + * @deprecated Use {@see Requests_Cookie_Jar::normalize_cookie} + * @return Requests_Cookie + */ + public function normalizeCookie($cookie, $key = null) { + return $this->normalize_cookie($cookie, $key); + } + + /** + * Check if the given item exists + * + * @param string $key Item key + * @return boolean Does the item exist? + */ + public function offsetExists($key) { + return isset($this->cookies[$key]); + } + + /** + * Get the value for the item + * + * @param string $key Item key + * @return string Item value + */ + public function offsetGet($key) { + if (!isset($this->cookies[$key])) { + return null; + } + + return $this->cookies[$key]; + } + + /** + * Set the given item + * + * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) + * + * @param string $key Item name + * @param string $value Item value + */ + public function offsetSet($key, $value) { + if ($key === null) { + throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); + } + + $this->cookies[$key] = $value; + } + + /** + * Unset the given header + * + * @param string $key + */ + public function offsetUnset($key) { + unset($this->cookies[$key]); + } + + /** + * Get an iterator for the data + * + * @return ArrayIterator + */ + public function getIterator() { + return new ArrayIterator($this->cookies); + } + + /** + * Register the cookie handler with the request's hooking system + * + * @param Requests_Hooker $hooks Hooking system + */ + public function register(Requests_Hooker $hooks) { + $hooks->register('requests.before_request', array($this, 'before_request')); + $hooks->register('requests.before_redirect_check', array($this, 'before_redirect_check')); + } + + /** + * Add Cookie header to a request if we have any + * + * As per RFC 6265, cookies are separated by '; ' + * + * @param string $url + * @param array $headers + * @param array $data + * @param string $type + * @param array $options + */ + public function before_request($url, &$headers, &$data, &$type, &$options) { + if (!$url instanceof Requests_IRI) { + $url = new Requests_IRI($url); + } + + if (!empty($this->cookies)) { + $cookies = array(); + foreach ($this->cookies as $key => $cookie) { + $cookie = $this->normalize_cookie($cookie, $key); + + // Skip expired cookies + if ($cookie->is_expired()) { + continue; + } + + if ($cookie->domain_matches($url->host)) { + $cookies[] = $cookie->format_for_header(); + } + } + + $headers['Cookie'] = implode('; ', $cookies); + } + } + + /** + * Parse all cookies from a response and attach them to the response + * + * @var Requests_Response $response + */ + public function before_redirect_check(Requests_Response &$return) { + $url = $return->url; + if (!$url instanceof Requests_IRI) { + $url = new Requests_IRI($url); + } + + $cookies = Requests_Cookie::parse_from_headers($return->headers, $url); + $this->cookies = array_merge($this->cookies, $cookies); + $return->cookies = $this; + } +} \ No newline at end of file diff --git a/wp-includes/Requests/Exception.php b/wp-includes/Requests/Exception.php new file mode 100644 index 0000000..37d4711 --- /dev/null +++ b/wp-includes/Requests/Exception.php @@ -0,0 +1,62 @@ +type = $type; + $this->data = $data; + } + + /** + * Like {@see getCode()}, but a string code. + * + * @codeCoverageIgnore + * @return string + */ + public function getType() { + return $this->type; + } + + /** + * Gives any relevant data + * + * @codeCoverageIgnore + * @return mixed + */ + public function getData() { + return $this->data; + } +} \ No newline at end of file diff --git a/wp-includes/Requests/Exception/HTTP.php b/wp-includes/Requests/Exception/HTTP.php new file mode 100644 index 0000000..9ac6a87 --- /dev/null +++ b/wp-includes/Requests/Exception/HTTP.php @@ -0,0 +1,71 @@ +reason = $reason; + } + + $message = sprintf('%d %s', $this->code, $this->reason); + parent::__construct($message, 'httpresponse', $data, $this->code); + } + + /** + * Get the status message + */ + public function getReason() { + return $this->reason; + } + + /** + * Get the correct exception class for a given error code + * + * @param int|bool $code HTTP status code, or false if unavailable + * @return string Exception class name to use + */ + public static function get_class($code) { + if (!$code) { + return 'Requests_Exception_HTTP_Unknown'; + } + + $class = sprintf('Requests_Exception_HTTP_%d', $code); + if (class_exists($class)) { + return $class; + } + + return 'Requests_Exception_HTTP_Unknown'; + } +} \ No newline at end of file diff --git a/wp-includes/Requests/Exception/HTTP/304.php b/wp-includes/Requests/Exception/HTTP/304.php new file mode 100644 index 0000000..6799033 --- /dev/null +++ b/wp-includes/Requests/Exception/HTTP/304.php @@ -0,0 +1,27 @@ +code = $data->status_code; + } + + parent::__construct($reason, $data); + } +} \ No newline at end of file diff --git a/wp-includes/Requests/Exception/Transport.php b/wp-includes/Requests/Exception/Transport.php new file mode 100644 index 0000000..e60b488 --- /dev/null +++ b/wp-includes/Requests/Exception/Transport.php @@ -0,0 +1,5 @@ +type = $type; + } + + if ($code !== null) { + $this->code = $code; + } + + if ($message !== null) { + $this->reason = $message; + } + + $message = sprintf('%d %s', $this->code, $this->reason); + parent::__construct($message, $this->type, $data, $this->code); + } + + /** + * Get the error message + */ + public function getReason() { + return $this->reason; + } + +} diff --git a/wp-includes/Requests/Hooker.php b/wp-includes/Requests/Hooker.php new file mode 100644 index 0000000..f667ae9 --- /dev/null +++ b/wp-includes/Requests/Hooker.php @@ -0,0 +1,33 @@ +0 is executed later + */ + public function register($hook, $callback, $priority = 0); + + /** + * Dispatch a message + * + * @param string $hook Hook name + * @param array $parameters Parameters to pass to callbacks + * @return boolean Successfulness + */ + public function dispatch($hook, $parameters = array()); +} \ No newline at end of file diff --git a/wp-includes/Requests/Hooks.php b/wp-includes/Requests/Hooks.php new file mode 100644 index 0000000..2e61c73 --- /dev/null +++ b/wp-includes/Requests/Hooks.php @@ -0,0 +1,68 @@ +0 is executed later + */ + public function register($hook, $callback, $priority = 0) { + if (!isset($this->hooks[$hook])) { + $this->hooks[$hook] = array(); + } + if (!isset($this->hooks[$hook][$priority])) { + $this->hooks[$hook][$priority] = array(); + } + + $this->hooks[$hook][$priority][] = $callback; + } + + /** + * Dispatch a message + * + * @param string $hook Hook name + * @param array $parameters Parameters to pass to callbacks + * @return boolean Successfulness + */ + public function dispatch($hook, $parameters = array()) { + if (empty($this->hooks[$hook])) { + return false; + } + + foreach ($this->hooks[$hook] as $priority => $hooked) { + foreach ($hooked as $callback) { + call_user_func_array($callback, $parameters); + } + } + + return true; + } +} \ No newline at end of file diff --git a/wp-includes/Requests/IDNAEncoder.php b/wp-includes/Requests/IDNAEncoder.php new file mode 100644 index 0000000..ebbe211 --- /dev/null +++ b/wp-includes/Requests/IDNAEncoder.php @@ -0,0 +1,388 @@ + 0) { + if ($position + $length > $strlen) { + throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); + } + for ($position++; $remaining > 0; $position++) { + $value = ord($input[$position]); + + // If it is invalid, count the sequence as invalid and reprocess the current byte: + if (($value & 0xC0) !== 0x80) { + throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); + } + + $character |= ($value & 0x3F) << (--$remaining * 6); + } + $position--; + } + + if ( + // Non-shortest form sequences are invalid + $length > 1 && $character <= 0x7F + || $length > 2 && $character <= 0x7FF + || $length > 3 && $character <= 0xFFFF + // Outside of range of ucschar codepoints + // Noncharacters + || ($character & 0xFFFE) === 0xFFFE + || $character >= 0xFDD0 && $character <= 0xFDEF + || ( + // Everything else not in ucschar + $character > 0xD7FF && $character < 0xF900 + || $character < 0x20 + || $character > 0x7E && $character < 0xA0 + || $character > 0xEFFFD + ) + ) { + throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); + } + + $codepoints[] = $character; + } + + return $codepoints; + } + + /** + * RFC3492-compliant encoder + * + * @internal Pseudo-code from Section 6.3 is commented with "#" next to relevant code + * @throws Requests_Exception On character outside of the domain (never happens with Punycode) (`idna.character_outside_domain`) + * + * @param string $input UTF-8 encoded string to encode + * @return string Punycode-encoded string + */ + public static function punycode_encode($input) { + $output = ''; +# let n = initial_n + $n = self::BOOTSTRAP_INITIAL_N; +# let delta = 0 + $delta = 0; +# let bias = initial_bias + $bias = self::BOOTSTRAP_INITIAL_BIAS; +# let h = b = the number of basic code points in the input + $h = $b = 0; // see loop +# copy them to the output in order + $codepoints = self::utf8_to_codepoints($input); + $extended = array(); + + foreach ($codepoints as $char) { + if ($char < 128) { + // Character is valid ASCII + // TODO: this should also check if it's valid for a URL + $output .= chr($char); + $h++; + } + // Check if the character is non-ASCII, but below initial n + // This never occurs for Punycode, so ignore in coverage + // @codeCoverageIgnoreStart + elseif ($char < $n) { + throw new Requests_Exception('Invalid character', 'idna.character_outside_domain', $char); + } + // @codeCoverageIgnoreEnd + else { + $extended[$char] = true; + } + } + $extended = array_keys($extended); + sort($extended); + $b = $h; +# [copy them] followed by a delimiter if b > 0 + if (strlen($output) > 0) { + $output .= '-'; + } +# {if the input contains a non-basic code point < n then fail} +# while h < length(input) do begin + while ($h < count($codepoints)) { +# let m = the minimum code point >= n in the input + $m = array_shift($extended); + //printf('next code point to insert is %s' . PHP_EOL, dechex($m)); +# let delta = delta + (m - n) * (h + 1), fail on overflow + $delta += ($m - $n) * ($h + 1); +# let n = m + $n = $m; +# for each code point c in the input (in order) do begin + for ($num = 0; $num < count($codepoints); $num++) { + $c = $codepoints[$num]; +# if c < n then increment delta, fail on overflow + if ($c < $n) { + $delta++; + } +# if c == n then begin + elseif ($c === $n) { +# let q = delta + $q = $delta; +# for k = base to infinity in steps of base do begin + for ($k = self::BOOTSTRAP_BASE; ; $k += self::BOOTSTRAP_BASE) { +# let t = tmin if k <= bias {+ tmin}, or +# tmax if k >= bias + tmax, or k - bias otherwise + if ($k <= ($bias + self::BOOTSTRAP_TMIN)) { + $t = self::BOOTSTRAP_TMIN; + } + elseif ($k >= ($bias + self::BOOTSTRAP_TMAX)) { + $t = self::BOOTSTRAP_TMAX; + } + else { + $t = $k - $bias; + } +# if q < t then break + if ($q < $t) { + break; + } +# output the code point for digit t + ((q - t) mod (base - t)) + $digit = $t + (($q - $t) % (self::BOOTSTRAP_BASE - $t)); + $output .= self::digit_to_char($digit); +# let q = (q - t) div (base - t) + $q = floor(($q - $t) / (self::BOOTSTRAP_BASE - $t)); +# end + } +# output the code point for digit q + $output .= self::digit_to_char($q); +# let bias = adapt(delta, h + 1, test h equals b?) + $bias = self::adapt($delta, $h + 1, $h === $b); +# let delta = 0 + $delta = 0; +# increment h + $h++; +# end + } +# end + } +# increment delta and n + $delta++; + $n++; +# end + } + + return $output; + } + + /** + * Convert a digit to its respective character + * + * @see https://tools.ietf.org/html/rfc3492#section-5 + * @throws Requests_Exception On invalid digit (`idna.invalid_digit`) + * + * @param int $digit Digit in the range 0-35 + * @return string Single character corresponding to digit + */ + protected static function digit_to_char($digit) { + // @codeCoverageIgnoreStart + // As far as I know, this never happens, but still good to be sure. + if ($digit < 0 || $digit > 35) { + throw new Requests_Exception(sprintf('Invalid digit %d', $digit), 'idna.invalid_digit', $digit); + } + // @codeCoverageIgnoreEnd + $digits = 'abcdefghijklmnopqrstuvwxyz0123456789'; + return substr($digits, $digit, 1); + } + + /** + * Adapt the bias + * + * @see https://tools.ietf.org/html/rfc3492#section-6.1 + * @param int $delta + * @param int $numpoints + * @param bool $firsttime + * @return int New bias + */ + protected static function adapt($delta, $numpoints, $firsttime) { +# function adapt(delta,numpoints,firsttime): +# if firsttime then let delta = delta div damp + if ($firsttime) { + $delta = floor($delta / self::BOOTSTRAP_DAMP); + } +# else let delta = delta div 2 + else { + $delta = floor($delta / 2); + } +# let delta = delta + (delta div numpoints) + $delta += floor($delta / $numpoints); +# let k = 0 + $k = 0; +# while delta > ((base - tmin) * tmax) div 2 do begin + $max = floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN) * self::BOOTSTRAP_TMAX) / 2); + while ($delta > $max) { +# let delta = delta div (base - tmin) + $delta = floor($delta / (self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN)); +# let k = k + base + $k += self::BOOTSTRAP_BASE; +# end + } +# return k + (((base - tmin + 1) * delta) div (delta + skew)) + return $k + floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN + 1) * $delta) / ($delta + self::BOOTSTRAP_SKEW)); + } +} \ No newline at end of file diff --git a/wp-includes/Requests/IPv6.php b/wp-includes/Requests/IPv6.php new file mode 100644 index 0000000..204dbd7 --- /dev/null +++ b/wp-includes/Requests/IPv6.php @@ -0,0 +1,190 @@ + FF01:0:0:0:0:0:0:101 + * ::1 -> 0:0:0:0:0:0:0:1 + * + * @author Alexander Merz + * @author elfrink at introweb dot nl + * @author Josh Peck + * @copyright 2003-2005 The PHP Group + * @license http://www.opensource.org/licenses/bsd-license.php + * @param string $ip An IPv6 address + * @return string The uncompressed IPv6 address + */ + public static function uncompress($ip) { + if (substr_count($ip, '::') !== 1) { + return $ip; + } + + list($ip1, $ip2) = explode('::', $ip); + $c1 = ($ip1 === '') ? -1 : substr_count($ip1, ':'); + $c2 = ($ip2 === '') ? -1 : substr_count($ip2, ':'); + + if (strpos($ip2, '.') !== false) { + $c2++; + } + // :: + if ($c1 === -1 && $c2 === -1) { + $ip = '0:0:0:0:0:0:0:0'; + } + // ::xxx + else if ($c1 === -1) { + $fill = str_repeat('0:', 7 - $c2); + $ip = str_replace('::', $fill, $ip); + } + // xxx:: + else if ($c2 === -1) { + $fill = str_repeat(':0', 7 - $c1); + $ip = str_replace('::', $fill, $ip); + } + // xxx::xxx + else { + $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); + $ip = str_replace('::', $fill, $ip); + } + return $ip; + } + + /** + * Compresses an IPv6 address + * + * RFC 4291 allows you to compress consecutive zero pieces in an address to + * '::'. This method expects a valid IPv6 address and compresses consecutive + * zero pieces to '::'. + * + * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 + * 0:0:0:0:0:0:0:1 -> ::1 + * + * @see uncompress() + * @param string $ip An IPv6 address + * @return string The compressed IPv6 address + */ + public static function compress($ip) { + // Prepare the IP to be compressed + $ip = self::uncompress($ip); + $ip_parts = self::split_v6_v4($ip); + + // Replace all leading zeros + $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); + + // Find bunches of zeros + if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) { + $max = 0; + $pos = null; + foreach ($matches[0] as $match) { + if (strlen($match[0]) > $max) { + $max = strlen($match[0]); + $pos = $match[1]; + } + } + + $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); + } + + if ($ip_parts[1] !== '') { + return implode(':', $ip_parts); + } + else { + return $ip_parts[0]; + } + } + + /** + * Splits an IPv6 address into the IPv6 and IPv4 representation parts + * + * RFC 4291 allows you to represent the last two parts of an IPv6 address + * using the standard IPv4 representation + * + * Example: 0:0:0:0:0:0:13.1.68.3 + * 0:0:0:0:0:FFFF:129.144.52.38 + * + * @param string $ip An IPv6 address + * @return string[] [0] contains the IPv6 represented part, and [1] the IPv4 represented part + */ + protected static function split_v6_v4($ip) { + if (strpos($ip, '.') !== false) { + $pos = strrpos($ip, ':'); + $ipv6_part = substr($ip, 0, $pos); + $ipv4_part = substr($ip, $pos + 1); + return array($ipv6_part, $ipv4_part); + } + else { + return array($ip, ''); + } + } + + /** + * Checks an IPv6 address + * + * Checks if the given IP is a valid IPv6 address + * + * @param string $ip An IPv6 address + * @return bool true if $ip is a valid IPv6 address + */ + public static function check_ipv6($ip) { + $ip = self::uncompress($ip); + list($ipv6, $ipv4) = self::split_v6_v4($ip); + $ipv6 = explode(':', $ipv6); + $ipv4 = explode('.', $ipv4); + if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) { + foreach ($ipv6 as $ipv6_part) { + // The section can't be empty + if ($ipv6_part === '') { + return false; + } + + // Nor can it be over four characters + if (strlen($ipv6_part) > 4) { + return false; + } + + // Remove leading zeros (this is safe because of the above) + $ipv6_part = ltrim($ipv6_part, '0'); + if ($ipv6_part === '') { + $ipv6_part = '0'; + } + + // Check the value is valid + $value = hexdec($ipv6_part); + if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) { + return false; + } + } + if (count($ipv4) === 4) { + foreach ($ipv4 as $ipv4_part) { + $value = (int) $ipv4_part; + if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) { + return false; + } + } + } + return true; + } + else { + return false; + } + } +} diff --git a/wp-includes/Requests/IRI.php b/wp-includes/Requests/IRI.php new file mode 100644 index 0000000..8dc2fa2 --- /dev/null +++ b/wp-includes/Requests/IRI.php @@ -0,0 +1,1084 @@ + array( + 'port' => 674 + ), + 'dict' => array( + 'port' => 2628 + ), + 'file' => array( + 'ihost' => 'localhost' + ), + 'http' => array( + 'port' => 80, + ), + 'https' => array( + 'port' => 443, + ), + ); + + /** + * Return the entire IRI when you try and read the object as a string + * + * @return string + */ + public function __toString() { + return $this->get_iri(); + } + + /** + * Overload __set() to provide access via properties + * + * @param string $name Property name + * @param mixed $value Property value + */ + public function __set($name, $value) { + if (method_exists($this, 'set_' . $name)) { + call_user_func(array($this, 'set_' . $name), $value); + } + elseif ( + $name === 'iauthority' + || $name === 'iuserinfo' + || $name === 'ihost' + || $name === 'ipath' + || $name === 'iquery' + || $name === 'ifragment' + ) { + call_user_func(array($this, 'set_' . substr($name, 1)), $value); + } + } + + /** + * Overload __get() to provide access via properties + * + * @param string $name Property name + * @return mixed + */ + public function __get($name) { + // isset() returns false for null, we don't want to do that + // Also why we use array_key_exists below instead of isset() + $props = get_object_vars($this); + + if ( + $name === 'iri' || + $name === 'uri' || + $name === 'iauthority' || + $name === 'authority' + ) { + $method = 'get_' . $name; + $return = $this->$method(); + } + elseif (array_key_exists($name, $props)) { + $return = $this->$name; + } + // host -> ihost + elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) { + $name = $prop; + $return = $this->$prop; + } + // ischeme -> scheme + elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) { + $name = $prop; + $return = $this->$prop; + } + else { + trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE); + $return = null; + } + + if ($return === null && isset($this->normalization[$this->scheme][$name])) { + return $this->normalization[$this->scheme][$name]; + } + else { + return $return; + } + } + + /** + * Overload __isset() to provide access via properties + * + * @param string $name Property name + * @return bool + */ + public function __isset($name) { + return (method_exists($this, 'get_' . $name) || isset($this->$name)); + } + + /** + * Overload __unset() to provide access via properties + * + * @param string $name Property name + */ + public function __unset($name) { + if (method_exists($this, 'set_' . $name)) { + call_user_func(array($this, 'set_' . $name), ''); + } + } + + /** + * Create a new IRI object, from a specified string + * + * @param string|null $iri + */ + public function __construct($iri = null) { + $this->set_iri($iri); + } + + /** + * Create a new IRI object by resolving a relative IRI + * + * Returns false if $base is not absolute, otherwise an IRI. + * + * @param IRI|string $base (Absolute) Base IRI + * @param IRI|string $relative Relative IRI + * @return IRI|false + */ + public static function absolutize($base, $relative) { + if (!($relative instanceof Requests_IRI)) { + $relative = new Requests_IRI($relative); + } + if (!$relative->is_valid()) { + return false; + } + elseif ($relative->scheme !== null) { + return clone $relative; + } + + if (!($base instanceof Requests_IRI)) { + $base = new Requests_IRI($base); + } + if ($base->scheme === null || !$base->is_valid()) { + return false; + } + + if ($relative->get_iri() !== '') { + if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) { + $target = clone $relative; + $target->scheme = $base->scheme; + } + else { + $target = new Requests_IRI; + $target->scheme = $base->scheme; + $target->iuserinfo = $base->iuserinfo; + $target->ihost = $base->ihost; + $target->port = $base->port; + if ($relative->ipath !== '') { + if ($relative->ipath[0] === '/') { + $target->ipath = $relative->ipath; + } + elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') { + $target->ipath = '/' . $relative->ipath; + } + elseif (($last_segment = strrpos($base->ipath, '/')) !== false) { + $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath; + } + else { + $target->ipath = $relative->ipath; + } + $target->ipath = $target->remove_dot_segments($target->ipath); + $target->iquery = $relative->iquery; + } + else { + $target->ipath = $base->ipath; + if ($relative->iquery !== null) { + $target->iquery = $relative->iquery; + } + elseif ($base->iquery !== null) { + $target->iquery = $base->iquery; + } + } + $target->ifragment = $relative->ifragment; + } + } + else { + $target = clone $base; + $target->ifragment = null; + } + $target->scheme_normalization(); + return $target; + } + + /** + * Parse an IRI into scheme/authority/path/query/fragment segments + * + * @param string $iri + * @return array + */ + protected function parse_iri($iri) { + $iri = trim($iri, "\x20\x09\x0A\x0C\x0D"); + $has_match = preg_match('/^((?P[^:\/?#]+):)?(\/\/(?P[^\/?#]*))?(?P[^?#]*)(\?(?P[^#]*))?(#(?P.*))?$/', $iri, $match); + if (!$has_match) { + throw new Requests_Exception('Cannot parse supplied IRI', 'iri.cannot_parse', $iri); + } + + if ($match[1] === '') { + $match['scheme'] = null; + } + if (!isset($match[3]) || $match[3] === '') { + $match['authority'] = null; + } + if (!isset($match[5])) { + $match['path'] = ''; + } + if (!isset($match[6]) || $match[6] === '') { + $match['query'] = null; + } + if (!isset($match[8]) || $match[8] === '') { + $match['fragment'] = null; + } + return $match; + } + + /** + * Remove dot segments from a path + * + * @param string $input + * @return string + */ + protected function remove_dot_segments($input) { + $output = ''; + while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') { + // A: If the input buffer begins with a prefix of "../" or "./", + // then remove that prefix from the input buffer; otherwise, + if (strpos($input, '../') === 0) { + $input = substr($input, 3); + } + elseif (strpos($input, './') === 0) { + $input = substr($input, 2); + } + // B: if the input buffer begins with a prefix of "/./" or "/.", + // where "." is a complete path segment, then replace that prefix + // with "/" in the input buffer; otherwise, + elseif (strpos($input, '/./') === 0) { + $input = substr($input, 2); + } + elseif ($input === '/.') { + $input = '/'; + } + // C: if the input buffer begins with a prefix of "/../" or "/..", + // where ".." is a complete path segment, then replace that prefix + // with "/" in the input buffer and remove the last segment and its + // preceding "/" (if any) from the output buffer; otherwise, + elseif (strpos($input, '/../') === 0) { + $input = substr($input, 3); + $output = substr_replace($output, '', strrpos($output, '/')); + } + elseif ($input === '/..') { + $input = '/'; + $output = substr_replace($output, '', strrpos($output, '/')); + } + // D: if the input buffer consists only of "." or "..", then remove + // that from the input buffer; otherwise, + elseif ($input === '.' || $input === '..') { + $input = ''; + } + // E: move the first path segment in the input buffer to the end of + // the output buffer, including the initial "/" character (if any) + // and any subsequent characters up to, but not including, the next + // "/" character or the end of the input buffer + elseif (($pos = strpos($input, '/', 1)) !== false) { + $output .= substr($input, 0, $pos); + $input = substr_replace($input, '', 0, $pos); + } + else { + $output .= $input; + $input = ''; + } + } + return $output . $input; + } + + /** + * Replace invalid character with percent encoding + * + * @param string $string Input string + * @param string $extra_chars Valid characters not in iunreserved or + * iprivate (this is ASCII-only) + * @param bool $iprivate Allow iprivate + * @return string + */ + protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false) { + // Normalize as many pct-encoded sections as possible + $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array(&$this, 'remove_iunreserved_percent_encoded'), $string); + + // Replace invalid percent characters + $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string); + + // Add unreserved and % to $extra_chars (the latter is safe because all + // pct-encoded sections are now valid). + $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%'; + + // Now replace any bytes that aren't allowed with their pct-encoded versions + $position = 0; + $strlen = strlen($string); + while (($position += strspn($string, $extra_chars, $position)) < $strlen) { + $value = ord($string[$position]); + + // Start position + $start = $position; + + // By default we are valid + $valid = true; + + // No one byte sequences are valid due to the while. + // Two byte sequence: + if (($value & 0xE0) === 0xC0) { + $character = ($value & 0x1F) << 6; + $length = 2; + $remaining = 1; + } + // Three byte sequence: + elseif (($value & 0xF0) === 0xE0) { + $character = ($value & 0x0F) << 12; + $length = 3; + $remaining = 2; + } + // Four byte sequence: + elseif (($value & 0xF8) === 0xF0) { + $character = ($value & 0x07) << 18; + $length = 4; + $remaining = 3; + } + // Invalid byte: + else { + $valid = false; + $length = 1; + $remaining = 0; + } + + if ($remaining) { + if ($position + $length <= $strlen) { + for ($position++; $remaining; $position++) { + $value = ord($string[$position]); + + // Check that the byte is valid, then add it to the character: + if (($value & 0xC0) === 0x80) { + $character |= ($value & 0x3F) << (--$remaining * 6); + } + // If it is invalid, count the sequence as invalid and reprocess the current byte: + else { + $valid = false; + $position--; + break; + } + } + } + else { + $position = $strlen - 1; + $valid = false; + } + } + + // Percent encode anything invalid or not in ucschar + if ( + // Invalid sequences + !$valid + // Non-shortest form sequences are invalid + || $length > 1 && $character <= 0x7F + || $length > 2 && $character <= 0x7FF + || $length > 3 && $character <= 0xFFFF + // Outside of range of ucschar codepoints + // Noncharacters + || ($character & 0xFFFE) === 0xFFFE + || $character >= 0xFDD0 && $character <= 0xFDEF + || ( + // Everything else not in ucschar + $character > 0xD7FF && $character < 0xF900 + || $character < 0xA0 + || $character > 0xEFFFD + ) + && ( + // Everything not in iprivate, if it applies + !$iprivate + || $character < 0xE000 + || $character > 0x10FFFD + ) + ) { + // If we were a character, pretend we weren't, but rather an error. + if ($valid) { + $position--; + } + + for ($j = $start; $j <= $position; $j++) { + $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1); + $j += 2; + $position += 2; + $strlen += 2; + } + } + } + + return $string; + } + + /** + * Callback function for preg_replace_callback. + * + * Removes sequences of percent encoded bytes that represent UTF-8 + * encoded characters in iunreserved + * + * @param array $match PCRE match + * @return string Replacement + */ + protected function remove_iunreserved_percent_encoded($match) { + // As we just have valid percent encoded sequences we can just explode + // and ignore the first member of the returned array (an empty string). + $bytes = explode('%', $match[0]); + + // Initialize the new string (this is what will be returned) and that + // there are no bytes remaining in the current sequence (unsurprising + // at the first byte!). + $string = ''; + $remaining = 0; + + // Loop over each and every byte, and set $value to its value + for ($i = 1, $len = count($bytes); $i < $len; $i++) { + $value = hexdec($bytes[$i]); + + // If we're the first byte of sequence: + if (!$remaining) { + // Start position + $start = $i; + + // By default we are valid + $valid = true; + + // One byte sequence: + if ($value <= 0x7F) { + $character = $value; + $length = 1; + } + // Two byte sequence: + elseif (($value & 0xE0) === 0xC0) { + $character = ($value & 0x1F) << 6; + $length = 2; + $remaining = 1; + } + // Three byte sequence: + elseif (($value & 0xF0) === 0xE0) { + $character = ($value & 0x0F) << 12; + $length = 3; + $remaining = 2; + } + // Four byte sequence: + elseif (($value & 0xF8) === 0xF0) { + $character = ($value & 0x07) << 18; + $length = 4; + $remaining = 3; + } + // Invalid byte: + else { + $valid = false; + $remaining = 0; + } + } + // Continuation byte: + else { + // Check that the byte is valid, then add it to the character: + if (($value & 0xC0) === 0x80) { + $remaining--; + $character |= ($value & 0x3F) << ($remaining * 6); + } + // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence: + else { + $valid = false; + $remaining = 0; + $i--; + } + } + + // If we've reached the end of the current byte sequence, append it to Unicode::$data + if (!$remaining) { + // Percent encode anything invalid or not in iunreserved + if ( + // Invalid sequences + !$valid + // Non-shortest form sequences are invalid + || $length > 1 && $character <= 0x7F + || $length > 2 && $character <= 0x7FF + || $length > 3 && $character <= 0xFFFF + // Outside of range of iunreserved codepoints + || $character < 0x2D + || $character > 0xEFFFD + // Noncharacters + || ($character & 0xFFFE) === 0xFFFE + || $character >= 0xFDD0 && $character <= 0xFDEF + // Everything else not in iunreserved (this is all BMP) + || $character === 0x2F + || $character > 0x39 && $character < 0x41 + || $character > 0x5A && $character < 0x61 + || $character > 0x7A && $character < 0x7E + || $character > 0x7E && $character < 0xA0 + || $character > 0xD7FF && $character < 0xF900 + ) { + for ($j = $start; $j <= $i; $j++) { + $string .= '%' . strtoupper($bytes[$j]); + } + } + else { + for ($j = $start; $j <= $i; $j++) { + $string .= chr(hexdec($bytes[$j])); + } + } + } + } + + // If we have any bytes left over they are invalid (i.e., we are + // mid-way through a multi-byte sequence) + if ($remaining) { + for ($j = $start; $j < $len; $j++) { + $string .= '%' . strtoupper($bytes[$j]); + } + } + + return $string; + } + + protected function scheme_normalization() { + if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) { + $this->iuserinfo = null; + } + if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) { + $this->ihost = null; + } + if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) { + $this->port = null; + } + if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) { + $this->ipath = ''; + } + if (isset($this->ihost) && empty($this->ipath)) { + $this->ipath = '/'; + } + if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) { + $this->iquery = null; + } + if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) { + $this->ifragment = null; + } + } + + /** + * Check if the object represents a valid IRI. This needs to be done on each + * call as some things change depending on another part of the IRI. + * + * @return bool + */ + public function is_valid() { + $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null; + if ($this->ipath !== '' && + ( + $isauthority && $this->ipath[0] !== '/' || + ( + $this->scheme === null && + !$isauthority && + strpos($this->ipath, ':') !== false && + (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/')) + ) + ) + ) { + return false; + } + + return true; + } + + /** + * Set the entire IRI. Returns true on success, false on failure (if there + * are any invalid characters). + * + * @param string $iri + * @return bool + */ + protected function set_iri($iri) { + static $cache; + if (!$cache) { + $cache = array(); + } + + if ($iri === null) { + return true; + } + if (isset($cache[$iri])) { + list($this->scheme, + $this->iuserinfo, + $this->ihost, + $this->port, + $this->ipath, + $this->iquery, + $this->ifragment, + $return) = $cache[$iri]; + return $return; + } + + $parsed = $this->parse_iri((string) $iri); + + $return = $this->set_scheme($parsed['scheme']) + && $this->set_authority($parsed['authority']) + && $this->set_path($parsed['path']) + && $this->set_query($parsed['query']) + && $this->set_fragment($parsed['fragment']); + + $cache[$iri] = array($this->scheme, + $this->iuserinfo, + $this->ihost, + $this->port, + $this->ipath, + $this->iquery, + $this->ifragment, + $return); + return $return; + } + + /** + * Set the scheme. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $scheme + * @return bool + */ + protected function set_scheme($scheme) { + if ($scheme === null) { + $this->scheme = null; + } + elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) { + $this->scheme = null; + return false; + } + else { + $this->scheme = strtolower($scheme); + } + return true; + } + + /** + * Set the authority. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $authority + * @return bool + */ + protected function set_authority($authority) { + static $cache; + if (!$cache) { + $cache = array(); + } + + if ($authority === null) { + $this->iuserinfo = null; + $this->ihost = null; + $this->port = null; + return true; + } + if (isset($cache[$authority])) { + list($this->iuserinfo, + $this->ihost, + $this->port, + $return) = $cache[$authority]; + + return $return; + } + + $remaining = $authority; + if (($iuserinfo_end = strrpos($remaining, '@')) !== false) { + $iuserinfo = substr($remaining, 0, $iuserinfo_end); + $remaining = substr($remaining, $iuserinfo_end + 1); + } + else { + $iuserinfo = null; + } + if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) { + $port = substr($remaining, $port_start + 1); + if ($port === false || $port === '') { + $port = null; + } + $remaining = substr($remaining, 0, $port_start); + } + else { + $port = null; + } + + $return = $this->set_userinfo($iuserinfo) && + $this->set_host($remaining) && + $this->set_port($port); + + $cache[$authority] = array($this->iuserinfo, + $this->ihost, + $this->port, + $return); + + return $return; + } + + /** + * Set the iuserinfo. + * + * @param string $iuserinfo + * @return bool + */ + protected function set_userinfo($iuserinfo) { + if ($iuserinfo === null) { + $this->iuserinfo = null; + } + else { + $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:'); + $this->scheme_normalization(); + } + + return true; + } + + /** + * Set the ihost. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $ihost + * @return bool + */ + protected function set_host($ihost) { + if ($ihost === null) { + $this->ihost = null; + return true; + } + if (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') { + if (Requests_IPv6::check_ipv6(substr($ihost, 1, -1))) { + $this->ihost = '[' . Requests_IPv6::compress(substr($ihost, 1, -1)) . ']'; + } + else { + $this->ihost = null; + return false; + } + } + else { + $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;='); + + // Lowercase, but ignore pct-encoded sections (as they should + // remain uppercase). This must be done after the previous step + // as that can add unescaped characters. + $position = 0; + $strlen = strlen($ihost); + while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) { + if ($ihost[$position] === '%') { + $position += 3; + } + else { + $ihost[$position] = strtolower($ihost[$position]); + $position++; + } + } + + $this->ihost = $ihost; + } + + $this->scheme_normalization(); + + return true; + } + + /** + * Set the port. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $port + * @return bool + */ + protected function set_port($port) { + if ($port === null) { + $this->port = null; + return true; + } + + if (strspn($port, '0123456789') === strlen($port)) { + $this->port = (int) $port; + $this->scheme_normalization(); + return true; + } + + $this->port = null; + return false; + } + + /** + * Set the ipath. + * + * @param string $ipath + * @return bool + */ + protected function set_path($ipath) { + static $cache; + if (!$cache) { + $cache = array(); + } + + $ipath = (string) $ipath; + + if (isset($cache[$ipath])) { + $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)]; + } + else { + $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/'); + $removed = $this->remove_dot_segments($valid); + + $cache[$ipath] = array($valid, $removed); + $this->ipath = ($this->scheme !== null) ? $removed : $valid; + } + $this->scheme_normalization(); + return true; + } + + /** + * Set the iquery. + * + * @param string $iquery + * @return bool + */ + protected function set_query($iquery) { + if ($iquery === null) { + $this->iquery = null; + } + else { + $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true); + $this->scheme_normalization(); + } + return true; + } + + /** + * Set the ifragment. + * + * @param string $ifragment + * @return bool + */ + protected function set_fragment($ifragment) { + if ($ifragment === null) { + $this->ifragment = null; + } + else { + $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?'); + $this->scheme_normalization(); + } + return true; + } + + /** + * Convert an IRI to a URI (or parts thereof) + * + * @param string|bool IRI to convert (or false from {@see get_iri}) + * @return string|false URI if IRI is valid, false otherwise. + */ + protected function to_uri($string) { + if (!is_string($string)) { + return false; + } + + static $non_ascii; + if (!$non_ascii) { + $non_ascii = implode('', range("\x80", "\xFF")); + } + + $position = 0; + $strlen = strlen($string); + while (($position += strcspn($string, $non_ascii, $position)) < $strlen) { + $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1); + $position += 3; + $strlen += 2; + } + + return $string; + } + + /** + * Get the complete IRI + * + * @return string + */ + protected function get_iri() { + if (!$this->is_valid()) { + return false; + } + + $iri = ''; + if ($this->scheme !== null) { + $iri .= $this->scheme . ':'; + } + if (($iauthority = $this->get_iauthority()) !== null) { + $iri .= '//' . $iauthority; + } + $iri .= $this->ipath; + if ($this->iquery !== null) { + $iri .= '?' . $this->iquery; + } + if ($this->ifragment !== null) { + $iri .= '#' . $this->ifragment; + } + + return $iri; + } + + /** + * Get the complete URI + * + * @return string + */ + protected function get_uri() { + return $this->to_uri($this->get_iri()); + } + + /** + * Get the complete iauthority + * + * @return string + */ + protected function get_iauthority() { + if ($this->iuserinfo === null && $this->ihost === null && $this->port === null) { + return null; + } + + $iauthority = ''; + if ($this->iuserinfo !== null) { + $iauthority .= $this->iuserinfo . '@'; + } + if ($this->ihost !== null) { + $iauthority .= $this->ihost; + } + if ($this->port !== null) { + $iauthority .= ':' . $this->port; + } + return $iauthority; + } + + /** + * Get the complete authority + * + * @return string + */ + protected function get_authority() { + $iauthority = $this->get_iauthority(); + if (is_string($iauthority)) { + return $this->to_uri($iauthority); + } + else { + return $iauthority; + } + } +} diff --git a/wp-includes/Requests/Proxy.php b/wp-includes/Requests/Proxy.php new file mode 100644 index 0000000..ac7c1d6 --- /dev/null +++ b/wp-includes/Requests/Proxy.php @@ -0,0 +1,35 @@ +proxy = $args; + } + elseif (is_array($args)) { + if (count($args) == 1) { + list($this->proxy) = $args; + } + elseif (count($args) == 3) { + list($this->proxy, $this->user, $this->pass) = $args; + $this->use_authentication = true; + } + else { + throw new Requests_Exception('Invalid number of arguments', 'proxyhttpbadargs'); + } + } + } + + /** + * Register the necessary callbacks + * + * @since 1.6 + * @see curl_before_send + * @see fsockopen_remote_socket + * @see fsockopen_remote_host_path + * @see fsockopen_header + * @param Requests_Hooks $hooks Hook system + */ + public function register(Requests_Hooks &$hooks) { + $hooks->register('curl.before_send', array(&$this, 'curl_before_send')); + + $hooks->register('fsockopen.remote_socket', array(&$this, 'fsockopen_remote_socket')); + $hooks->register('fsockopen.remote_host_path', array(&$this, 'fsockopen_remote_host_path')); + if ($this->use_authentication) { + $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header')); + } + } + + /** + * Set cURL parameters before the data is sent + * + * @since 1.6 + * @param resource $handle cURL resource + */ + public function curl_before_send(&$handle) { + curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); + curl_setopt($handle, CURLOPT_PROXY, $this->proxy); + + if ($this->use_authentication) { + curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY); + curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string()); + } + } + + /** + * Alter remote socket information before opening socket connection + * + * @since 1.6 + * @param string $remote_socket Socket connection string + */ + public function fsockopen_remote_socket(&$remote_socket) { + $remote_socket = $this->proxy; + } + + /** + * Alter remote path before getting stream data + * + * @since 1.6 + * @param string $path Path to send in HTTP request string ("GET ...") + * @param string $url Full URL we're requesting + */ + public function fsockopen_remote_host_path(&$path, $url) { + $path = $url; + } + + /** + * Add extra headers to the request before sending + * + * @since 1.6 + * @param string $out HTTP header string + */ + public function fsockopen_header(&$out) { + $out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string())); + } + + /** + * Get the authentication string (user:pass) + * + * @since 1.6 + * @return string + */ + public function get_auth_string() { + return $this->user . ':' . $this->pass; + } +} \ No newline at end of file diff --git a/wp-includes/Requests/Response.php b/wp-includes/Requests/Response.php new file mode 100644 index 0000000..3152fb6 --- /dev/null +++ b/wp-includes/Requests/Response.php @@ -0,0 +1,121 @@ +headers = new Requests_Response_Headers(); + $this->cookies = new Requests_Cookie_Jar(); + } + + /** + * Response body + * + * @var string + */ + public $body = ''; + + /** + * Raw HTTP data from the transport + * + * @var string + */ + public $raw = ''; + + /** + * Headers, as an associative array + * + * @var Requests_Response_Headers Array-like object representing headers + */ + public $headers = array(); + + /** + * Status code, false if non-blocking + * + * @var integer|boolean + */ + public $status_code = false; + + /** + * Protocol version, false if non-blocking + * @var float|boolean + */ + public $protocol_version = false; + + /** + * Whether the request succeeded or not + * + * @var boolean + */ + public $success = false; + + /** + * Number of redirects the request used + * + * @var integer + */ + public $redirects = 0; + + /** + * URL requested + * + * @var string + */ + public $url = ''; + + /** + * Previous requests (from redirects) + * + * @var array Array of Requests_Response objects + */ + public $history = array(); + + /** + * Cookies from the request + * + * @var Requests_Cookie_Jar Array-like object representing a cookie jar + */ + public $cookies = array(); + + /** + * Is the response a redirect? + * + * @return boolean True if redirect (3xx status), false if not. + */ + public function is_redirect() { + $code = $this->status_code; + return in_array($code, array(300, 301, 302, 303, 307)) || $code > 307 && $code < 400; + } + + /** + * Throws an exception if the request was not successful + * + * @throws Requests_Exception If `$allow_redirects` is false, and code is 3xx (`response.no_redirects`) + * @throws Requests_Exception_HTTP On non-successful status code. Exception class corresponds to code (e.g. {@see Requests_Exception_HTTP_404}) + * @param boolean $allow_redirects Set to false to throw on a 3xx as well + */ + public function throw_for_status($allow_redirects = true) { + if ($this->is_redirect()) { + if (!$allow_redirects) { + throw new Requests_Exception('Redirection not allowed', 'response.no_redirects', $this); + } + } + elseif (!$this->success) { + $exception = Requests_Exception_HTTP::get_class($this->status_code); + throw new $exception(null, $this); + } + } +} diff --git a/wp-includes/Requests/Response/Headers.php b/wp-includes/Requests/Response/Headers.php new file mode 100644 index 0000000..cc6a208 --- /dev/null +++ b/wp-includes/Requests/Response/Headers.php @@ -0,0 +1,98 @@ +data[$key])) { + return null; + } + + return $this->flatten($this->data[$key]); + } + + /** + * Set the given item + * + * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) + * + * @param string $key Item name + * @param string $value Item value + */ + public function offsetSet($key, $value) { + if ($key === null) { + throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); + } + + $key = strtolower($key); + + if (!isset($this->data[$key])) { + $this->data[$key] = array(); + } + + $this->data[$key][] = $value; + } + + /** + * Get all values for a given header + * + * @param string $key + * @return array Header values + */ + public function getValues($key) { + $key = strtolower($key); + if (!isset($this->data[$key])) { + return null; + } + + return $this->data[$key]; + } + + /** + * Flattens a value into a string + * + * Converts an array into a string by imploding values with a comma, as per + * RFC2616's rules for folding headers. + * + * @param string|array $value Value to flatten + * @return string Flattened value + */ + public function flatten($value) { + if (is_array($value)) { + $value = implode(',', $value); + } + + return $value; + } + + /** + * Get an iterator for the data + * + * Converts the internal + * @return ArrayIterator + */ + public function getIterator() { + return new Requests_Utility_FilteredIterator($this->data, array($this, 'flatten')); + } +} diff --git a/wp-includes/Requests/SSL.php b/wp-includes/Requests/SSL.php new file mode 100644 index 0000000..2b03768 --- /dev/null +++ b/wp-includes/Requests/SSL.php @@ -0,0 +1,152 @@ +useragent = 'X';` + * + * @var array + */ + public $options = array(); + + /** + * Create a new session + * + * @param string|null $url Base URL for requests + * @param array $headers Default headers for requests + * @param array $data Default data for requests + * @param array $options Default options for requests + */ + public function __construct($url = null, $headers = array(), $data = array(), $options = array()) { + $this->url = $url; + $this->headers = $headers; + $this->data = $data; + $this->options = $options; + + if (empty($this->options['cookies'])) { + $this->options['cookies'] = new Requests_Cookie_Jar(); + } + } + + /** + * Get a property's value + * + * @param string $key Property key + * @return mixed|null Property value, null if none found + */ + public function __get($key) { + if (isset($this->options[$key])) { + return $this->options[$key]; + } + + return null; + } + + /** + * Set a property's value + * + * @param string $key Property key + * @param mixed $value Property value + */ + public function __set($key, $value) { + $this->options[$key] = $value; + } + + /** + * Remove a property's value + * + * @param string $key Property key + */ + public function __isset($key) { + return isset($this->options[$key]); + } + + /** + * Remove a property's value + * + * @param string $key Property key + */ + public function __unset($key) { + if (isset($this->options[$key])) { + unset($this->options[$key]); + } + } + + /**#@+ + * @see request() + * @param string $url + * @param array $headers + * @param array $options + * @return Requests_Response + */ + /** + * Send a GET request + */ + public function get($url, $headers = array(), $options = array()) { + return $this->request($url, $headers, null, Requests::GET, $options); + } + + /** + * Send a HEAD request + */ + public function head($url, $headers = array(), $options = array()) { + return $this->request($url, $headers, null, Requests::HEAD, $options); + } + + /** + * Send a DELETE request + */ + public function delete($url, $headers = array(), $options = array()) { + return $this->request($url, $headers, null, Requests::DELETE, $options); + } + /**#@-*/ + + /**#@+ + * @see request() + * @param string $url + * @param array $headers + * @param array $data + * @param array $options + * @return Requests_Response + */ + /** + * Send a POST request + */ + public function post($url, $headers = array(), $data = array(), $options = array()) { + return $this->request($url, $headers, $data, Requests::POST, $options); + } + + /** + * Send a PUT request + */ + public function put($url, $headers = array(), $data = array(), $options = array()) { + return $this->request($url, $headers, $data, Requests::PUT, $options); + } + + /** + * Send a PATCH request + * + * Note: Unlike {@see post} and {@see put}, `$headers` is required, as the + * specification recommends that should send an ETag + * + * @link https://tools.ietf.org/html/rfc5789 + */ + public function patch($url, $headers, $data = array(), $options = array()) { + return $this->request($url, $headers, $data, Requests::PATCH, $options); + } + /**#@-*/ + + /** + * Main interface for HTTP requests + * + * This method initiates a request and sends it via a transport before + * parsing. + * + * @see Requests::request() + * + * @throws Requests_Exception On invalid URLs (`nonhttp`) + * + * @param string $url URL to request + * @param array $headers Extra headers to send with the request + * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests + * @param string $type HTTP request type (use Requests constants) + * @param array $options Options for the request (see {@see Requests::request}) + * @return Requests_Response + */ + public function request($url, $headers = array(), $data = array(), $type = Requests::GET, $options = array()) { + $request = $this->merge_request(compact('url', 'headers', 'data', 'options')); + + return Requests::request($request['url'], $request['headers'], $request['data'], $type, $request['options']); + } + + /** + * Send multiple HTTP requests simultaneously + * + * @see Requests::request_multiple() + * + * @param array $requests Requests data (see {@see Requests::request_multiple}) + * @param array $options Global and default options (see {@see Requests::request}) + * @return array Responses (either Requests_Response or a Requests_Exception object) + */ + public function request_multiple($requests, $options = array()) { + foreach ($requests as $key => $request) { + $requests[$key] = $this->merge_request($request, false); + } + + $options = array_merge($this->options, $options); + + // Disallow forcing the type, as that's a per request setting + unset($options['type']); + + return Requests::request_multiple($requests, $options); + } + + /** + * Merge a request's data with the default data + * + * @param array $request Request data (same form as {@see request_multiple}) + * @param boolean $merge_options Should we merge options as well? + * @return array Request data + */ + protected function merge_request($request, $merge_options = true) { + if ($this->url !== null) { + $request['url'] = Requests_IRI::absolutize($this->url, $request['url']); + $request['url'] = $request['url']->uri; + } + + if (empty($request['headers'])) { + $request['headers'] = array(); + } + $request['headers'] = array_merge($this->headers, $request['headers']); + + if (empty($request['data'])) { + if (is_array($this->data)) { + $request['data'] = $this->data; + } + } + elseif (is_array($request['data']) && is_array($this->data)) { + $request['data'] = array_merge($this->data, $request['data']); + } + + if ($merge_options !== false) { + $request['options'] = array_merge($this->options, $request['options']); + + // Disallow forcing the type, as that's a per request setting + unset($request['options']['type']); + } + + return $request; + } +} diff --git a/wp-includes/Requests/Transport.php b/wp-includes/Requests/Transport.php new file mode 100644 index 0000000..7e4a262 --- /dev/null +++ b/wp-includes/Requests/Transport.php @@ -0,0 +1,41 @@ +version = $curl['version_number']; + $this->handle = curl_init(); + + curl_setopt($this->handle, CURLOPT_HEADER, false); + curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); + if ($this->version >= self::CURL_7_10_5) { + curl_setopt($this->handle, CURLOPT_ENCODING, ''); + } + if (defined('CURLOPT_PROTOCOLS')) { + curl_setopt($this->handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); + } + if (defined('CURLOPT_REDIR_PROTOCOLS')) { + curl_setopt($this->handle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); + } + } + + /** + * Destructor + */ + public function __destruct() { + if (is_resource($this->handle)) { + curl_close($this->handle); + } + } + + /** + * Perform a request + * + * @throws Requests_Exception On a cURL error (`curlerror`) + * + * @param string $url URL to request + * @param array $headers Associative array of request headers + * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD + * @param array $options Request options, see {@see Requests::response()} for documentation + * @return string Raw HTTP result + */ + public function request($url, $headers = array(), $data = array(), $options = array()) { + $this->hooks = $options['hooks']; + + $this->setup_handle($url, $headers, $data, $options); + + $options['hooks']->dispatch('curl.before_send', array(&$this->handle)); + + if ($options['filename'] !== false) { + $this->stream_handle = fopen($options['filename'], 'wb'); + } + + $this->response_data = ''; + $this->response_bytes = 0; + $this->response_byte_limit = false; + if ($options['max_bytes'] !== false) { + $this->response_byte_limit = $options['max_bytes']; + } + + if (isset($options['verify'])) { + if ($options['verify'] === false) { + curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0); + } + elseif (is_string($options['verify'])) { + curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']); + } + } + + if (isset($options['verifyname']) && $options['verifyname'] === false) { + curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); + } + + curl_exec($this->handle); + $response = $this->response_data; + + $options['hooks']->dispatch('curl.after_send', array()); + + if (curl_errno($this->handle) === 23 || curl_errno($this->handle) === 61) { + // Reset encoding and try again + curl_setopt($this->handle, CURLOPT_ENCODING, 'none'); + + $this->response_data = ''; + $this->response_bytes = 0; + curl_exec($this->handle); + $response = $this->response_data; + } + + $this->process_response($response, $options); + + // Need to remove the $this reference from the curl handle. + // Otherwise Requests_Transport_cURL wont be garbage collected and the curl_close() will never be called. + curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, null); + curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, null); + + return $this->headers; + } + + /** + * Send multiple requests simultaneously + * + * @param array $requests Request data + * @param array $options Global options + * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well) + */ + public function request_multiple($requests, $options) { + // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯ + if (empty($requests)) { + return array(); + } + + $multihandle = curl_multi_init(); + $subrequests = array(); + $subhandles = array(); + + $class = get_class($this); + foreach ($requests as $id => $request) { + $subrequests[$id] = new $class(); + $subhandles[$id] = $subrequests[$id]->get_subrequest_handle($request['url'], $request['headers'], $request['data'], $request['options']); + $request['options']['hooks']->dispatch('curl.before_multi_add', array(&$subhandles[$id])); + curl_multi_add_handle($multihandle, $subhandles[$id]); + } + + $completed = 0; + $responses = array(); + + $request['options']['hooks']->dispatch('curl.before_multi_exec', array(&$multihandle)); + + do { + $active = false; + + do { + $status = curl_multi_exec($multihandle, $active); + } + while ($status === CURLM_CALL_MULTI_PERFORM); + + $to_process = array(); + + // Read the information as needed + while ($done = curl_multi_info_read($multihandle)) { + $key = array_search($done['handle'], $subhandles, true); + if (!isset($to_process[$key])) { + $to_process[$key] = $done; + } + } + + // Parse the finished requests before we start getting the new ones + foreach ($to_process as $key => $done) { + $options = $requests[$key]['options']; + if (CURLE_OK !== $done['result']) { + //get error string for handle. + $reason = curl_error($done['handle']); + $exception = new Requests_Exception_Transport_cURL( + $reason, + Requests_Exception_Transport_cURL::EASY, + $done['handle'], + $done['result'] + ); + $responses[$key] = $exception; + $options['hooks']->dispatch('transport.internal.parse_error', array(&$responses[$key], $requests[$key])); + } + else { + $responses[$key] = $subrequests[$key]->process_response($subrequests[$key]->response_data, $options); + + $options['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$key], $requests[$key])); + } + + curl_multi_remove_handle($multihandle, $done['handle']); + curl_close($done['handle']); + + if (!is_string($responses[$key])) { + $options['hooks']->dispatch('multiple.request.complete', array(&$responses[$key], $key)); + } + $completed++; + } + } + while ($active || $completed < count($subrequests)); + + $request['options']['hooks']->dispatch('curl.after_multi_exec', array(&$multihandle)); + + curl_multi_close($multihandle); + + return $responses; + } + + /** + * Get the cURL handle for use in a multi-request + * + * @param string $url URL to request + * @param array $headers Associative array of request headers + * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD + * @param array $options Request options, see {@see Requests::response()} for documentation + * @return resource Subrequest's cURL handle + */ + public function &get_subrequest_handle($url, $headers, $data, $options) { + $this->setup_handle($url, $headers, $data, $options); + + if ($options['filename'] !== false) { + $this->stream_handle = fopen($options['filename'], 'wb'); + } + + $this->response_data = ''; + $this->response_bytes = 0; + $this->response_byte_limit = false; + if ($options['max_bytes'] !== false) { + $this->response_byte_limit = $options['max_bytes']; + } + $this->hooks = $options['hooks']; + + return $this->handle; + } + + /** + * Setup the cURL handle for the given data + * + * @param string $url URL to request + * @param array $headers Associative array of request headers + * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD + * @param array $options Request options, see {@see Requests::response()} for documentation + */ + protected function setup_handle($url, $headers, $data, $options) { + $options['hooks']->dispatch('curl.before_request', array(&$this->handle)); + + // Force closing the connection for old versions of cURL (<7.22). + if ( ! isset( $headers['Connection'] ) ) { + $headers['Connection'] = 'close'; + } + + $headers = Requests::flatten($headers); + + if (!empty($data)) { + $data_format = $options['data_format']; + + if ($data_format === 'query') { + $url = self::format_get($url, $data); + $data = ''; + } + elseif (!is_string($data)) { + $data = http_build_query($data, null, '&'); + } + } + + switch ($options['type']) { + case Requests::POST: + curl_setopt($this->handle, CURLOPT_POST, true); + curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); + break; + case Requests::HEAD: + curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); + curl_setopt($this->handle, CURLOPT_NOBODY, true); + break; + case Requests::TRACE: + curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); + break; + case Requests::PATCH: + case Requests::PUT: + case Requests::DELETE: + case Requests::OPTIONS: + default: + curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); + if (!empty($data)) { + curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); + } + } + + // cURL requires a minimum timeout of 1 second when using the system + // DNS resolver, as it uses `alarm()`, which is second resolution only. + // There's no way to detect which DNS resolver is being used from our + // end, so we need to round up regardless of the supplied timeout. + // + // https://github.com/curl/curl/blob/4f45240bc84a9aa648c8f7243be7b79e9f9323a5/lib/hostip.c#L606-L609 + $timeout = max($options['timeout'], 1); + + if (is_int($timeout) || $this->version < self::CURL_7_16_2) { + curl_setopt($this->handle, CURLOPT_TIMEOUT, ceil($timeout)); + } + else { + curl_setopt($this->handle, CURLOPT_TIMEOUT_MS, round($timeout * 1000)); + } + + if (is_int($options['connect_timeout']) || $this->version < self::CURL_7_16_2) { + curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, ceil($options['connect_timeout'])); + } + else { + curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT_MS, round($options['connect_timeout'] * 1000)); + } + curl_setopt($this->handle, CURLOPT_URL, $url); + curl_setopt($this->handle, CURLOPT_REFERER, $url); + curl_setopt($this->handle, CURLOPT_USERAGENT, $options['useragent']); + if (!empty($headers)) { + curl_setopt($this->handle, CURLOPT_HTTPHEADER, $headers); + } + if ($options['protocol_version'] === 1.1) { + curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + } + else { + curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + } + + if (true === $options['blocking']) { + curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, array(&$this, 'stream_headers')); + curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, array(&$this, 'stream_body')); + curl_setopt($this->handle, CURLOPT_BUFFERSIZE, Requests::BUFFER_SIZE); + } + } + + /** + * Process a response + * + * @param string $response Response data from the body + * @param array $options Request options + * @return string HTTP response data including headers + */ + public function process_response($response, $options) { + if ($options['blocking'] === false) { + $fake_headers = ''; + $options['hooks']->dispatch('curl.after_request', array(&$fake_headers)); + return false; + } + if ($options['filename'] !== false) { + fclose($this->stream_handle); + $this->headers = trim($this->headers); + } + else { + $this->headers .= $response; + } + + if (curl_errno($this->handle)) { + $error = sprintf( + 'cURL error %s: %s', + curl_errno($this->handle), + curl_error($this->handle) + ); + throw new Requests_Exception($error, 'curlerror', $this->handle); + } + $this->info = curl_getinfo($this->handle); + + $options['hooks']->dispatch('curl.after_request', array(&$this->headers, &$this->info)); + return $this->headers; + } + + /** + * Collect the headers as they are received + * + * @param resource $handle cURL resource + * @param string $headers Header string + * @return integer Length of provided header + */ + public function stream_headers($handle, $headers) { + // Why do we do this? cURL will send both the final response and any + // interim responses, such as a 100 Continue. We don't need that. + // (We may want to keep this somewhere just in case) + if ($this->done_headers) { + $this->headers = ''; + $this->done_headers = false; + } + $this->headers .= $headers; + + if ($headers === "\r\n") { + $this->done_headers = true; + } + return strlen($headers); + } + + /** + * Collect data as it's received + * + * @since 1.6.1 + * + * @param resource $handle cURL resource + * @param string $data Body data + * @return integer Length of provided data + */ + public function stream_body($handle, $data) { + $this->hooks->dispatch('request.progress', array($data, $this->response_bytes, $this->response_byte_limit)); + $data_length = strlen($data); + + // Are we limiting the response size? + if ($this->response_byte_limit) { + if ($this->response_bytes === $this->response_byte_limit) { + // Already at maximum, move on + return $data_length; + } + + if (($this->response_bytes + $data_length) > $this->response_byte_limit) { + // Limit the length + $limited_length = ($this->response_byte_limit - $this->response_bytes); + $data = substr($data, 0, $limited_length); + } + } + + if ($this->stream_handle) { + fwrite($this->stream_handle, $data); + } + else { + $this->response_data .= $data; + } + + $this->response_bytes += strlen($data); + return $data_length; + } + + /** + * Format a URL given GET data + * + * @param string $url + * @param array|object $data Data to build query using, see {@see https://secure.php.net/http_build_query} + * @return string URL with data + */ + protected static function format_get($url, $data) { + if (!empty($data)) { + $url_parts = parse_url($url); + if (empty($url_parts['query'])) { + $query = $url_parts['query'] = ''; + } + else { + $query = $url_parts['query']; + } + + $query .= '&' . http_build_query($data, null, '&'); + $query = trim($query, '&'); + + if (empty($url_parts['query'])) { + $url .= '?' . $query; + } + else { + $url = str_replace($url_parts['query'], $query, $url); + } + } + return $url; + } + + /** + * Whether this transport is valid + * + * @codeCoverageIgnore + * @return boolean True if the transport is valid, false otherwise. + */ + public static function test($capabilities = array()) { + if (!function_exists('curl_init') || !function_exists('curl_exec')) { + return false; + } + + // If needed, check that our installed curl version supports SSL + if (isset($capabilities['ssl']) && $capabilities['ssl']) { + $curl_version = curl_version(); + if (!(CURL_VERSION_SSL & $curl_version['features'])) { + return false; + } + } + + return true; + } +} diff --git a/wp-includes/Requests/Transport/fsockopen.php b/wp-includes/Requests/Transport/fsockopen.php new file mode 100644 index 0000000..c7c61d3 --- /dev/null +++ b/wp-includes/Requests/Transport/fsockopen.php @@ -0,0 +1,444 @@ +dispatch('fsockopen.before_request'); + + $url_parts = parse_url($url); + if (empty($url_parts)) { + throw new Requests_Exception('Invalid URL.', 'invalidurl', $url); + } + $host = $url_parts['host']; + $context = stream_context_create(); + $verifyname = false; + $case_insensitive_headers = new Requests_Utility_CaseInsensitiveDictionary($headers); + + // HTTPS support + if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') { + $remote_socket = 'ssl://' . $host; + if (!isset($url_parts['port'])) { + $url_parts['port'] = 443; + } + + $context_options = array( + 'verify_peer' => true, + // 'CN_match' => $host, + 'capture_peer_cert' => true + ); + $verifyname = true; + + // SNI, if enabled (OpenSSL >=0.9.8j) + if (defined('OPENSSL_TLSEXT_SERVER_NAME') && OPENSSL_TLSEXT_SERVER_NAME) { + $context_options['SNI_enabled'] = true; + if (isset($options['verifyname']) && $options['verifyname'] === false) { + $context_options['SNI_enabled'] = false; + } + } + + if (isset($options['verify'])) { + if ($options['verify'] === false) { + $context_options['verify_peer'] = false; + } + elseif (is_string($options['verify'])) { + $context_options['cafile'] = $options['verify']; + } + } + + if (isset($options['verifyname']) && $options['verifyname'] === false) { + $context_options['verify_peer_name'] = false; + $verifyname = false; + } + + stream_context_set_option($context, array('ssl' => $context_options)); + } + else { + $remote_socket = 'tcp://' . $host; + } + + $this->max_bytes = $options['max_bytes']; + + if (!isset($url_parts['port'])) { + $url_parts['port'] = 80; + } + $remote_socket .= ':' . $url_parts['port']; + + set_error_handler(array($this, 'connect_error_handler'), E_WARNING | E_NOTICE); + + $options['hooks']->dispatch('fsockopen.remote_socket', array(&$remote_socket)); + + $socket = stream_socket_client($remote_socket, $errno, $errstr, ceil($options['connect_timeout']), STREAM_CLIENT_CONNECT, $context); + + restore_error_handler(); + + if ($verifyname && !$this->verify_certificate_from_context($host, $context)) { + throw new Requests_Exception('SSL certificate did not match the requested domain name', 'ssl.no_match'); + } + + if (!$socket) { + if ($errno === 0) { + // Connection issue + throw new Requests_Exception(rtrim($this->connect_error), 'fsockopen.connect_error'); + } + + throw new Requests_Exception($errstr, 'fsockopenerror', null, $errno); + } + + $data_format = $options['data_format']; + + if ($data_format === 'query') { + $path = self::format_get($url_parts, $data); + $data = ''; + } + else { + $path = self::format_get($url_parts, array()); + } + + $options['hooks']->dispatch('fsockopen.remote_host_path', array(&$path, $url)); + + $request_body = ''; + $out = sprintf("%s %s HTTP/%.1F\r\n", $options['type'], $path, $options['protocol_version']); + + if ($options['type'] !== Requests::TRACE) { + if (is_array($data)) { + $request_body = http_build_query($data, null, '&'); + } + else { + $request_body = $data; + } + + if (!empty($data)) { + if (!isset($case_insensitive_headers['Content-Length'])) { + $headers['Content-Length'] = strlen($request_body); + } + + if (!isset($case_insensitive_headers['Content-Type'])) { + $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; + } + } + } + + if (!isset($case_insensitive_headers['Host'])) { + $out .= sprintf('Host: %s', $url_parts['host']); + + if (( 'http' === strtolower($url_parts['scheme']) && $url_parts['port'] !== 80 ) || ( 'https' === strtolower($url_parts['scheme']) && $url_parts['port'] !== 443 )) { + $out .= ':' . $url_parts['port']; + } + $out .= "\r\n"; + } + + if (!isset($case_insensitive_headers['User-Agent'])) { + $out .= sprintf("User-Agent: %s\r\n", $options['useragent']); + } + + $accept_encoding = $this->accept_encoding(); + if (!isset($case_insensitive_headers['Accept-Encoding']) && !empty($accept_encoding)) { + $out .= sprintf("Accept-Encoding: %s\r\n", $accept_encoding); + } + + $headers = Requests::flatten($headers); + + if (!empty($headers)) { + $out .= implode("\r\n", $headers) . "\r\n"; + } + + $options['hooks']->dispatch('fsockopen.after_headers', array(&$out)); + + if (substr($out, -2) !== "\r\n") { + $out .= "\r\n"; + } + + if (!isset($case_insensitive_headers['Connection'])) { + $out .= "Connection: Close\r\n"; + } + + $out .= "\r\n" . $request_body; + + $options['hooks']->dispatch('fsockopen.before_send', array(&$out)); + + fwrite($socket, $out); + $options['hooks']->dispatch('fsockopen.after_send', array($out)); + + if (!$options['blocking']) { + fclose($socket); + $fake_headers = ''; + $options['hooks']->dispatch('fsockopen.after_request', array(&$fake_headers)); + return ''; + } + + $timeout_sec = (int) floor($options['timeout']); + if ($timeout_sec == $options['timeout']) { + $timeout_msec = 0; + } + else { + $timeout_msec = self::SECOND_IN_MICROSECONDS * $options['timeout'] % self::SECOND_IN_MICROSECONDS; + } + stream_set_timeout($socket, $timeout_sec, $timeout_msec); + + $response = $body = $headers = ''; + $this->info = stream_get_meta_data($socket); + $size = 0; + $doingbody = false; + $download = false; + if ($options['filename']) { + $download = fopen($options['filename'], 'wb'); + } + + while (!feof($socket)) { + $this->info = stream_get_meta_data($socket); + if ($this->info['timed_out']) { + throw new Requests_Exception('fsocket timed out', 'timeout'); + } + + $block = fread($socket, Requests::BUFFER_SIZE); + if (!$doingbody) { + $response .= $block; + if (strpos($response, "\r\n\r\n")) { + list($headers, $block) = explode("\r\n\r\n", $response, 2); + $doingbody = true; + } + } + + // Are we in body mode now? + if ($doingbody) { + $options['hooks']->dispatch('request.progress', array($block, $size, $this->max_bytes)); + $data_length = strlen($block); + if ($this->max_bytes) { + // Have we already hit a limit? + if ($size === $this->max_bytes) { + continue; + } + if (($size + $data_length) > $this->max_bytes) { + // Limit the length + $limited_length = ($this->max_bytes - $size); + $block = substr($block, 0, $limited_length); + } + } + + $size += strlen($block); + if ($download) { + fwrite($download, $block); + } + else { + $body .= $block; + } + } + } + $this->headers = $headers; + + if ($download) { + fclose($download); + } + else { + $this->headers .= "\r\n\r\n" . $body; + } + fclose($socket); + + $options['hooks']->dispatch('fsockopen.after_request', array(&$this->headers, &$this->info)); + return $this->headers; + } + + /** + * Send multiple requests simultaneously + * + * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see Requests_Transport::request} + * @param array $options Global options, see {@see Requests::response()} for documentation + * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well) + */ + public function request_multiple($requests, $options) { + $responses = array(); + $class = get_class($this); + foreach ($requests as $id => $request) { + try { + $handler = new $class(); + $responses[$id] = $handler->request($request['url'], $request['headers'], $request['data'], $request['options']); + + $request['options']['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$id], $request)); + } + catch (Requests_Exception $e) { + $responses[$id] = $e; + } + + if (!is_string($responses[$id])) { + $request['options']['hooks']->dispatch('multiple.request.complete', array(&$responses[$id], $id)); + } + } + + return $responses; + } + + /** + * Retrieve the encodings we can accept + * + * @return string Accept-Encoding header value + */ + protected static function accept_encoding() { + $type = array(); + if (function_exists('gzinflate')) { + $type[] = 'deflate;q=1.0'; + } + + if (function_exists('gzuncompress')) { + $type[] = 'compress;q=0.5'; + } + + $type[] = 'gzip;q=0.5'; + + return implode(', ', $type); + } + + /** + * Format a URL given GET data + * + * @param array $url_parts + * @param array|object $data Data to build query using, see {@see https://secure.php.net/http_build_query} + * @return string URL with data + */ + protected static function format_get($url_parts, $data) { + if (!empty($data)) { + if (empty($url_parts['query'])) { + $url_parts['query'] = ''; + } + + $url_parts['query'] .= '&' . http_build_query($data, null, '&'); + $url_parts['query'] = trim($url_parts['query'], '&'); + } + if (isset($url_parts['path'])) { + if (isset($url_parts['query'])) { + $get = $url_parts['path'] . '?' . $url_parts['query']; + } + else { + $get = $url_parts['path']; + } + } + else { + $get = '/'; + } + return $get; + } + + /** + * Error handler for stream_socket_client() + * + * @param int $errno Error number (e.g. E_WARNING) + * @param string $errstr Error message + */ + public function connect_error_handler($errno, $errstr) { + // Double-check we can handle it + if (($errno & E_WARNING) === 0 && ($errno & E_NOTICE) === 0) { + // Return false to indicate the default error handler should engage + return false; + } + + $this->connect_error .= $errstr . "\n"; + return true; + } + + /** + * Verify the certificate against common name and subject alternative names + * + * Unfortunately, PHP doesn't check the certificate against the alternative + * names, leading things like 'https://www.github.com/' to be invalid. + * Instead + * + * @see https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1 + * + * @throws Requests_Exception On failure to connect via TLS (`fsockopen.ssl.connect_error`) + * @throws Requests_Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`) + * @param string $host Host name to verify against + * @param resource $context Stream context + * @return bool + */ + public function verify_certificate_from_context($host, $context) { + $meta = stream_context_get_options($context); + + // If we don't have SSL options, then we couldn't make the connection at + // all + if (empty($meta) || empty($meta['ssl']) || empty($meta['ssl']['peer_certificate'])) { + throw new Requests_Exception(rtrim($this->connect_error), 'ssl.connect_error'); + } + + $cert = openssl_x509_parse($meta['ssl']['peer_certificate']); + + return Requests_SSL::verify_certificate($host, $cert); + } + + /** + * Whether this transport is valid + * + * @codeCoverageIgnore + * @return boolean True if the transport is valid, false otherwise. + */ + public static function test($capabilities = array()) { + if (!function_exists('fsockopen')) { + return false; + } + + // If needed, check that streams support SSL + if (isset($capabilities['ssl']) && $capabilities['ssl']) { + if (!extension_loaded('openssl') || !function_exists('openssl_x509_parse')) { + return false; + } + + // Currently broken, thanks to https://github.com/facebook/hhvm/issues/2156 + if (defined('HHVM_VERSION')) { + return false; + } + } + + return true; + } +} diff --git a/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php b/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php new file mode 100644 index 0000000..2c97893 --- /dev/null +++ b/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php @@ -0,0 +1,103 @@ + $value) { + $this->offsetSet($key, $value); + } + } + + /** + * Check if the given item exists + * + * @param string $key Item key + * @return boolean Does the item exist? + */ + public function offsetExists($key) { + $key = strtolower($key); + return isset($this->data[$key]); + } + + /** + * Get the value for the item + * + * @param string $key Item key + * @return string Item value + */ + public function offsetGet($key) { + $key = strtolower($key); + if (!isset($this->data[$key])) { + return null; + } + + return $this->data[$key]; + } + + /** + * Set the given item + * + * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) + * + * @param string $key Item name + * @param string $value Item value + */ + public function offsetSet($key, $value) { + if ($key === null) { + throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); + } + + $key = strtolower($key); + $this->data[$key] = $value; + } + + /** + * Unset the given header + * + * @param string $key + */ + public function offsetUnset($key) { + unset($this->data[strtolower($key)]); + } + + /** + * Get an iterator for the data + * + * @return ArrayIterator + */ + public function getIterator() { + return new ArrayIterator($this->data); + } + + /** + * Get the headers as an array + * + * @return array Header data + */ + public function getAll() { + return $this->data; + } +} diff --git a/wp-includes/Requests/Utility/FilteredIterator.php b/wp-includes/Requests/Utility/FilteredIterator.php new file mode 100644 index 0000000..76a29e7 --- /dev/null +++ b/wp-includes/Requests/Utility/FilteredIterator.php @@ -0,0 +1,45 @@ +callback = $callback; + } + + /** + * Get the current item's value after filtering + * + * @return string + */ + public function current() { + $value = parent::current(); + $value = call_user_func($this->callback, $value); + return $value; + } +} diff --git a/wp-includes/SimplePie/Author.php b/wp-includes/SimplePie/Author.php new file mode 100644 index 0000000..bbf3812 --- /dev/null +++ b/wp-includes/SimplePie/Author.php @@ -0,0 +1,157 @@ +name = $name; + $this->link = $link; + $this->email = $email; + } + + /** + * String-ified version + * + * @return string + */ + public function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + /** + * Author's name + * + * @return string|null + */ + public function get_name() + { + if ($this->name !== null) + { + return $this->name; + } + else + { + return null; + } + } + + /** + * Author's link + * + * @return string|null + */ + public function get_link() + { + if ($this->link !== null) + { + return $this->link; + } + else + { + return null; + } + } + + /** + * Author's email address + * + * @return string|null + */ + public function get_email() + { + if ($this->email !== null) + { + return $this->email; + } + else + { + return null; + } + } +} + diff --git a/wp-includes/SimplePie/Cache.php b/wp-includes/SimplePie/Cache.php new file mode 100644 index 0000000..75586d7 --- /dev/null +++ b/wp-includes/SimplePie/Cache.php @@ -0,0 +1,133 @@ + 'SimplePie_Cache_MySQL', + 'memcache' => 'SimplePie_Cache_Memcache', + ); + + /** + * Don't call the constructor. Please. + */ + private function __construct() { } + + /** + * Create a new SimplePie_Cache object + * + * @param string $location URL location (scheme is used to determine handler) + * @param string $filename Unique identifier for cache object + * @param string $extension 'spi' or 'spc' + * @return SimplePie_Cache_Base Type of object depends on scheme of `$location` + */ + public static function get_handler($location, $filename, $extension) + { + $type = explode(':', $location, 2); + $type = $type[0]; + if (!empty(self::$handlers[$type])) + { + $class = self::$handlers[$type]; + return new $class($location, $filename, $extension); + } + + return new SimplePie_Cache_File($location, $filename, $extension); + } + + /** + * Create a new SimplePie_Cache object + * + * @deprecated Use {@see get_handler} instead + */ + public function create($location, $filename, $extension) + { + trigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED); + return self::get_handler($location, $filename, $extension); + } + + /** + * Register a handler + * + * @param string $type DSN type to register for + * @param string $class Name of handler class. Must implement SimplePie_Cache_Base + */ + public static function register($type, $class) + { + self::$handlers[$type] = $class; + } + + /** + * Parse a URL into an array + * + * @param string $url + * @return array + */ + public static function parse_URL($url) + { + $params = parse_url($url); + $params['extras'] = array(); + if (isset($params['query'])) + { + parse_str($params['query'], $params['extras']); + } + return $params; + } +} diff --git a/wp-includes/SimplePie/Cache/Base.php b/wp-includes/SimplePie/Cache/Base.php new file mode 100644 index 0000000..937e346 --- /dev/null +++ b/wp-includes/SimplePie/Cache/Base.php @@ -0,0 +1,114 @@ +get_items(); + $items_by_id = array(); + + if (!empty($items)) + { + foreach ($items as $item) + { + $items_by_id[$item->get_id()] = $item; + } + + if (count($items_by_id) !== count($items)) + { + $items_by_id = array(); + foreach ($items as $item) + { + $items_by_id[$item->get_id(true)] = $item; + } + } + + if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) + { + $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; + } + elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) + { + $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; + } + elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) + { + $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; + } + elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0])) + { + $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]; + } + else + { + $channel = null; + } + + if ($channel !== null) + { + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']); + } + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']); + } + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']); + } + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']); + } + if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item'])) + { + unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']); + } + } + if (isset($data->data['items'])) + { + unset($data->data['items']); + } + if (isset($data->data['ordered_items'])) + { + unset($data->data['ordered_items']); + } + } + return array(serialize($data->data), $items_by_id); + } +} diff --git a/wp-includes/SimplePie/Cache/File.php b/wp-includes/SimplePie/Cache/File.php new file mode 100644 index 0000000..5797b3a --- /dev/null +++ b/wp-includes/SimplePie/Cache/File.php @@ -0,0 +1,173 @@ +location = $location; + $this->filename = $name; + $this->extension = $type; + $this->name = "$this->location/$this->filename.$this->extension"; + } + + /** + * Save data to the cache + * + * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property + * @return bool Successfulness + */ + public function save($data) + { + if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location)) + { + if ($data instanceof SimplePie) + { + $data = $data->data; + } + + $data = serialize($data); + return (bool) file_put_contents($this->name, $data); + } + return false; + } + + /** + * Retrieve the data saved to the cache + * + * @return array Data for SimplePie::$data + */ + public function load() + { + if (file_exists($this->name) && is_readable($this->name)) + { + return unserialize(file_get_contents($this->name)); + } + return false; + } + + /** + * Retrieve the last modified time for the cache + * + * @return int Timestamp + */ + public function mtime() + { + if (file_exists($this->name)) + { + return filemtime($this->name); + } + return false; + } + + /** + * Set the last modified time to the current time + * + * @return bool Success status + */ + public function touch() + { + if (file_exists($this->name)) + { + return touch($this->name); + } + return false; + } + + /** + * Remove the cache + * + * @return bool Success status + */ + public function unlink() + { + if (file_exists($this->name)) + { + return unlink($this->name); + } + return false; + } +} diff --git a/wp-includes/SimplePie/Cache/Memcache.php b/wp-includes/SimplePie/Cache/Memcache.php new file mode 100644 index 0000000..fd44780 --- /dev/null +++ b/wp-includes/SimplePie/Cache/Memcache.php @@ -0,0 +1,183 @@ +options = array( + 'host' => '127.0.0.1', + 'port' => 11211, + 'extras' => array( + 'timeout' => 3600, // one hour + 'prefix' => 'simplepie_', + ), + ); + $parsed = SimplePie_Cache::parse_URL($location); + $this->options['host'] = empty($parsed['host']) ? $this->options['host'] : $parsed['host']; + $this->options['port'] = empty($parsed['port']) ? $this->options['port'] : $parsed['port']; + $this->options['extras'] = array_merge($this->options['extras'], $parsed['extras']); + $this->name = $this->options['extras']['prefix'] . md5("$name:$type"); + + $this->cache = new Memcache(); + $this->cache->addServer($this->options['host'], (int) $this->options['port']); + } + + /** + * Save data to the cache + * + * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property + * @return bool Successfulness + */ + public function save($data) + { + if ($data instanceof SimplePie) + { + $data = $data->data; + } + return $this->cache->set($this->name, serialize($data), MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']); + } + + /** + * Retrieve the data saved to the cache + * + * @return array Data for SimplePie::$data + */ + public function load() + { + $data = $this->cache->get($this->name); + + if ($data !== false) + { + return unserialize($data); + } + return false; + } + + /** + * Retrieve the last modified time for the cache + * + * @return int Timestamp + */ + public function mtime() + { + $data = $this->cache->get($this->name); + + if ($data !== false) + { + // essentially ignore the mtime because Memcache expires on it's own + return time(); + } + + return false; + } + + /** + * Set the last modified time to the current time + * + * @return bool Success status + */ + public function touch() + { + $data = $this->cache->get($this->name); + + if ($data !== false) + { + return $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->duration); + } + + return false; + } + + /** + * Remove the cache + * + * @return bool Success status + */ + public function unlink() + { + return $this->cache->delete($this->name, 0); + } +} diff --git a/wp-includes/SimplePie/Cache/MySQL.php b/wp-includes/SimplePie/Cache/MySQL.php new file mode 100644 index 0000000..d53ebc1 --- /dev/null +++ b/wp-includes/SimplePie/Cache/MySQL.php @@ -0,0 +1,438 @@ +options = array( + 'user' => null, + 'pass' => null, + 'host' => '127.0.0.1', + 'port' => '3306', + 'path' => '', + 'extras' => array( + 'prefix' => '', + ), + ); + $this->options = array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location)); + + // Path is prefixed with a "/" + $this->options['dbname'] = substr($this->options['path'], 1); + + try + { + $this->mysql = new PDO("mysql:dbname={$this->options['dbname']};host={$this->options['host']};port={$this->options['port']}", $this->options['user'], $this->options['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); + } + catch (PDOException $e) + { + $this->mysql = null; + return; + } + + $this->id = $name . $type; + + if (!$query = $this->mysql->query('SHOW TABLES')) + { + $this->mysql = null; + return; + } + + $db = array(); + while ($row = $query->fetchColumn()) + { + $db[] = $row; + } + + if (!in_array($this->options['extras']['prefix'] . 'cache_data', $db)) + { + $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))'); + if ($query === false) + { + $this->mysql = null; + } + } + + if (!in_array($this->options['extras']['prefix'] . 'items', $db)) + { + $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))'); + if ($query === false) + { + $this->mysql = null; + } + } + } + + /** + * Save data to the cache + * + * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property + * @return bool Successfulness + */ + public function save($data) + { + if ($this->mysql === null) + { + return false; + } + + if ($data instanceof SimplePie) + { + $data = clone $data; + + $prepared = self::prepare_simplepie_object_for_cache($data); + + $query = $this->mysql->prepare('SELECT COUNT(*) FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed'); + $query->bindValue(':feed', $this->id); + if ($query->execute()) + { + if ($query->fetchColumn() > 0) + { + $items = count($prepared[1]); + if ($items) + { + $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = :items, `data` = :data, `mtime` = :time WHERE `id` = :feed'; + $query = $this->mysql->prepare($sql); + $query->bindValue(':items', $items); + } + else + { + $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `data` = :data, `mtime` = :time WHERE `id` = :feed'; + $query = $this->mysql->prepare($sql); + } + + $query->bindValue(':data', $prepared[0]); + $query->bindValue(':time', time()); + $query->bindValue(':feed', $this->id); + if (!$query->execute()) + { + return false; + } + } + else + { + $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:feed, :count, :data, :time)'); + $query->bindValue(':feed', $this->id); + $query->bindValue(':count', count($prepared[1])); + $query->bindValue(':data', $prepared[0]); + $query->bindValue(':time', time()); + if (!$query->execute()) + { + return false; + } + } + + $ids = array_keys($prepared[1]); + if (!empty($ids)) + { + foreach ($ids as $id) + { + $database_ids[] = $this->mysql->quote($id); + } + + $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `id` = ' . implode(' OR `id` = ', $database_ids) . ' AND `feed_id` = :feed'); + $query->bindValue(':feed', $this->id); + + if ($query->execute()) + { + $existing_ids = array(); + while ($row = $query->fetchColumn()) + { + $existing_ids[] = $row; + } + + $new_ids = array_diff($ids, $existing_ids); + + foreach ($new_ids as $new_id) + { + if (!($date = $prepared[1][$new_id]->get_date('U'))) + { + $date = time(); + } + + $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(:feed, :id, :data, :date)'); + $query->bindValue(':feed', $this->id); + $query->bindValue(':id', $new_id); + $query->bindValue(':data', serialize($prepared[1][$new_id]->data)); + $query->bindValue(':date', $date); + if (!$query->execute()) + { + return false; + } + } + return true; + } + } + else + { + return true; + } + } + } + else + { + $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed'); + $query->bindValue(':feed', $this->id); + if ($query->execute()) + { + if ($query->rowCount() > 0) + { + $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = 0, `data` = :data, `mtime` = :time WHERE `id` = :feed'); + $query->bindValue(':data', serialize($data)); + $query->bindValue(':time', time()); + $query->bindValue(':feed', $this->id); + if ($this->execute()) + { + return true; + } + } + else + { + $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:id, 0, :data, :time)'); + $query->bindValue(':id', $this->id); + $query->bindValue(':data', serialize($data)); + $query->bindValue(':time', time()); + if ($query->execute()) + { + return true; + } + } + } + } + return false; + } + + /** + * Retrieve the data saved to the cache + * + * @return array Data for SimplePie::$data + */ + public function load() + { + if ($this->mysql === null) + { + return false; + } + + $query = $this->mysql->prepare('SELECT `items`, `data` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); + $query->bindValue(':id', $this->id); + if ($query->execute() && ($row = $query->fetch())) + { + $data = unserialize($row[1]); + + if (isset($this->options['items'][0])) + { + $items = (int) $this->options['items'][0]; + } + else + { + $items = (int) $row[0]; + } + + if ($items !== 0) + { + if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) + { + $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; + } + elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) + { + $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; + } + elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) + { + $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; + } + elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0])) + { + $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]; + } + else + { + $feed = null; + } + + if ($feed !== null) + { + $sql = 'SELECT `data` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :feed ORDER BY `posted` DESC'; + if ($items > 0) + { + $sql .= ' LIMIT ' . $items; + } + + $query = $this->mysql->prepare($sql); + $query->bindValue(':feed', $this->id); + if ($query->execute()) + { + while ($row = $query->fetchColumn()) + { + $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row); + } + } + else + { + return false; + } + } + } + return $data; + } + return false; + } + + /** + * Retrieve the last modified time for the cache + * + * @return int Timestamp + */ + public function mtime() + { + if ($this->mysql === null) + { + return false; + } + + $query = $this->mysql->prepare('SELECT `mtime` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); + $query->bindValue(':id', $this->id); + if ($query->execute() && ($time = $query->fetchColumn())) + { + return $time; + } + else + { + return false; + } + } + + /** + * Set the last modified time to the current time + * + * @return bool Success status + */ + public function touch() + { + if ($this->mysql === null) + { + return false; + } + + $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id'); + $query->bindValue(':time', time()); + $query->bindValue(':id', $this->id); + if ($query->execute() && $query->rowCount() > 0) + { + return true; + } + else + { + return false; + } + } + + /** + * Remove the cache + * + * @return bool Success status + */ + public function unlink() + { + if ($this->mysql === null) + { + return false; + } + + $query = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); + $query->bindValue(':id', $this->id); + $query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id'); + $query2->bindValue(':id', $this->id); + if ($query->execute() && $query2->execute()) + { + return true; + } + else + { + return false; + } + } +} diff --git a/wp-includes/SimplePie/Caption.php b/wp-includes/SimplePie/Caption.php new file mode 100644 index 0000000..52922c5 --- /dev/null +++ b/wp-includes/SimplePie/Caption.php @@ -0,0 +1,210 @@ +` captions as defined in Media RSS. + * + * Used by {@see SimplePie_Enclosure::get_caption()} and {@see SimplePie_Enclosure::get_captions()} + * + * This class can be overloaded with {@see SimplePie::set_caption_class()} + * + * @package SimplePie + * @subpackage API + */ +class SimplePie_Caption +{ + /** + * Content type + * + * @var string + * @see get_type() + */ + var $type; + + /** + * Language + * + * @var string + * @see get_language() + */ + var $lang; + + /** + * Start time + * + * @var string + * @see get_starttime() + */ + var $startTime; + + /** + * End time + * + * @var string + * @see get_endtime() + */ + var $endTime; + + /** + * Caption text + * + * @var string + * @see get_text() + */ + var $text; + + /** + * Constructor, used to input the data + * + * For documentation on all the parameters, see the corresponding + * properties and their accessors + */ + public function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) + { + $this->type = $type; + $this->lang = $lang; + $this->startTime = $startTime; + $this->endTime = $endTime; + $this->text = $text; + } + + /** + * String-ified version + * + * @return string + */ + public function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + /** + * Get the end time + * + * @return string|null Time in the format 'hh:mm:ss.SSS' + */ + public function get_endtime() + { + if ($this->endTime !== null) + { + return $this->endTime; + } + else + { + return null; + } + } + + /** + * Get the language + * + * @link http://tools.ietf.org/html/rfc3066 + * @return string|null Language code as per RFC 3066 + */ + public function get_language() + { + if ($this->lang !== null) + { + return $this->lang; + } + else + { + return null; + } + } + + /** + * Get the start time + * + * @return string|null Time in the format 'hh:mm:ss.SSS' + */ + public function get_starttime() + { + if ($this->startTime !== null) + { + return $this->startTime; + } + else + { + return null; + } + } + + /** + * Get the text of the caption + * + * @return string|null + */ + public function get_text() + { + if ($this->text !== null) + { + return $this->text; + } + else + { + return null; + } + } + + /** + * Get the content type (not MIME type) + * + * @return string|null Either 'text' or 'html' + */ + public function get_type() + { + if ($this->type !== null) + { + return $this->type; + } + else + { + return null; + } + } +} + diff --git a/wp-includes/SimplePie/Category.php b/wp-includes/SimplePie/Category.php new file mode 100644 index 0000000..ad0407b --- /dev/null +++ b/wp-includes/SimplePie/Category.php @@ -0,0 +1,157 @@ +term = $term; + $this->scheme = $scheme; + $this->label = $label; + } + + /** + * String-ified version + * + * @return string + */ + public function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + /** + * Get the category identifier + * + * @return string|null + */ + public function get_term() + { + if ($this->term !== null) + { + return $this->term; + } + else + { + return null; + } + } + + /** + * Get the categorization scheme identifier + * + * @return string|null + */ + public function get_scheme() + { + if ($this->scheme !== null) + { + return $this->scheme; + } + else + { + return null; + } + } + + /** + * Get the human readable label + * + * @return string|null + */ + public function get_label() + { + if ($this->label !== null) + { + return $this->label; + } + else + { + return $this->get_term(); + } + } +} + diff --git a/wp-includes/SimplePie/Content/Type/Sniffer.php b/wp-includes/SimplePie/Content/Type/Sniffer.php new file mode 100644 index 0000000..20d053d --- /dev/null +++ b/wp-includes/SimplePie/Content/Type/Sniffer.php @@ -0,0 +1,332 @@ +file = $file; + } + + /** + * Get the Content-Type of the specified file + * + * @return string Actual Content-Type + */ + public function get_type() + { + if (isset($this->file->headers['content-type'])) + { + if (!isset($this->file->headers['content-encoding']) + && ($this->file->headers['content-type'] === 'text/plain' + || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1' + || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1' + || $this->file->headers['content-type'] === 'text/plain; charset=UTF-8')) + { + return $this->text_or_binary(); + } + + if (($pos = strpos($this->file->headers['content-type'], ';')) !== false) + { + $official = substr($this->file->headers['content-type'], 0, $pos); + } + else + { + $official = $this->file->headers['content-type']; + } + $official = trim(strtolower($official)); + + if ($official === 'unknown/unknown' + || $official === 'application/unknown') + { + return $this->unknown(); + } + elseif (substr($official, -4) === '+xml' + || $official === 'text/xml' + || $official === 'application/xml') + { + return $official; + } + elseif (substr($official, 0, 6) === 'image/') + { + if ($return = $this->image()) + { + return $return; + } + else + { + return $official; + } + } + elseif ($official === 'text/html') + { + return $this->feed_or_html(); + } + else + { + return $official; + } + } + else + { + return $this->unknown(); + } + } + + /** + * Sniff text or binary + * + * @return string Actual Content-Type + */ + public function text_or_binary() + { + if (substr($this->file->body, 0, 2) === "\xFE\xFF" + || substr($this->file->body, 0, 2) === "\xFF\xFE" + || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF" + || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF") + { + return 'text/plain'; + } + elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body)) + { + return 'application/octect-stream'; + } + else + { + return 'text/plain'; + } + } + + /** + * Sniff unknown + * + * @return string Actual Content-Type + */ + public function unknown() + { + $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20"); + if (strtolower(substr($this->file->body, $ws, 14)) === 'file->body, $ws, 5)) === 'file->body, $ws, 7)) === 'file->body, 0, 5) === '%PDF-') + { + return 'application/pdf'; + } + elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-') + { + return 'application/postscript'; + } + elseif (substr($this->file->body, 0, 6) === 'GIF87a' + || substr($this->file->body, 0, 6) === 'GIF89a') + { + return 'image/gif'; + } + elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") + { + return 'image/png'; + } + elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") + { + return 'image/jpeg'; + } + elseif (substr($this->file->body, 0, 2) === "\x42\x4D") + { + return 'image/bmp'; + } + elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00") + { + return 'image/vnd.microsoft.icon'; + } + else + { + return $this->text_or_binary(); + } + } + + /** + * Sniff images + * + * @return string Actual Content-Type + */ + public function image() + { + if (substr($this->file->body, 0, 6) === 'GIF87a' + || substr($this->file->body, 0, 6) === 'GIF89a') + { + return 'image/gif'; + } + elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") + { + return 'image/png'; + } + elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") + { + return 'image/jpeg'; + } + elseif (substr($this->file->body, 0, 2) === "\x42\x4D") + { + return 'image/bmp'; + } + elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00") + { + return 'image/vnd.microsoft.icon'; + } + else + { + return false; + } + } + + /** + * Sniff HTML + * + * @return string Actual Content-Type + */ + public function feed_or_html() + { + $len = strlen($this->file->body); + $pos = strspn($this->file->body, "\x09\x0A\x0D\x20"); + + while ($pos < $len) + { + switch ($this->file->body[$pos]) + { + case "\x09": + case "\x0A": + case "\x0D": + case "\x20": + $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos); + continue 2; + + case '<': + $pos++; + break; + + default: + return 'text/html'; + } + + if (substr($this->file->body, $pos, 3) === '!--') + { + $pos += 3; + if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false) + { + $pos += 3; + } + else + { + return 'text/html'; + } + } + elseif (substr($this->file->body, $pos, 1) === '!') + { + if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false) + { + $pos++; + } + else + { + return 'text/html'; + } + } + elseif (substr($this->file->body, $pos, 1) === '?') + { + if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false) + { + $pos += 2; + } + else + { + return 'text/html'; + } + } + elseif (substr($this->file->body, $pos, 3) === 'rss' + || substr($this->file->body, $pos, 7) === 'rdf:RDF') + { + return 'application/rss+xml'; + } + elseif (substr($this->file->body, $pos, 4) === 'feed') + { + return 'application/atom+xml'; + } + else + { + return 'text/html'; + } + } + + return 'text/html'; + } +} + diff --git a/wp-includes/SimplePie/Copyright.php b/wp-includes/SimplePie/Copyright.php new file mode 100644 index 0000000..57c535a --- /dev/null +++ b/wp-includes/SimplePie/Copyright.php @@ -0,0 +1,130 @@ +` copyright tags as defined in Media RSS + * + * Used by {@see SimplePie_Enclosure::get_copyright()} + * + * This class can be overloaded with {@see SimplePie::set_copyright_class()} + * + * @package SimplePie + * @subpackage API + */ +class SimplePie_Copyright +{ + /** + * Copyright URL + * + * @var string + * @see get_url() + */ + var $url; + + /** + * Attribution + * + * @var string + * @see get_attribution() + */ + var $label; + + /** + * Constructor, used to input the data + * + * For documentation on all the parameters, see the corresponding + * properties and their accessors + */ + public function __construct($url = null, $label = null) + { + $this->url = $url; + $this->label = $label; + } + + /** + * String-ified version + * + * @return string + */ + public function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + /** + * Get the copyright URL + * + * @return string|null URL to copyright information + */ + public function get_url() + { + if ($this->url !== null) + { + return $this->url; + } + else + { + return null; + } + } + + /** + * Get the attribution text + * + * @return string|null + */ + public function get_attribution() + { + if ($this->label !== null) + { + return $this->label; + } + else + { + return null; + } + } +} + diff --git a/wp-includes/SimplePie/Core.php b/wp-includes/SimplePie/Core.php new file mode 100644 index 0000000..46d9966 --- /dev/null +++ b/wp-includes/SimplePie/Core.php @@ -0,0 +1,57 @@ +` as defined in Media RSS + * + * Used by {@see SimplePie_Enclosure::get_credit()} and {@see SimplePie_Enclosure::get_credits()} + * + * This class can be overloaded with {@see SimplePie::set_credit_class()} + * + * @package SimplePie + * @subpackage API + */ +class SimplePie_Credit +{ + /** + * Credited role + * + * @var string + * @see get_role() + */ + var $role; + + /** + * Organizational scheme + * + * @var string + * @see get_scheme() + */ + var $scheme; + + /** + * Credited name + * + * @var string + * @see get_name() + */ + var $name; + + /** + * Constructor, used to input the data + * + * For documentation on all the parameters, see the corresponding + * properties and their accessors + */ + public function __construct($role = null, $scheme = null, $name = null) + { + $this->role = $role; + $this->scheme = $scheme; + $this->name = $name; + } + + /** + * String-ified version + * + * @return string + */ + public function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + /** + * Get the role of the person receiving credit + * + * @return string|null + */ + public function get_role() + { + if ($this->role !== null) + { + return $this->role; + } + else + { + return null; + } + } + + /** + * Get the organizational scheme + * + * @return string|null + */ + public function get_scheme() + { + if ($this->scheme !== null) + { + return $this->scheme; + } + else + { + return null; + } + } + + /** + * Get the credited person/entity's name + * + * @return string|null + */ + public function get_name() + { + if ($this->name !== null) + { + return $this->name; + } + else + { + return null; + } + } +} + diff --git a/wp-includes/SimplePie/Decode/HTML/Entities.php b/wp-includes/SimplePie/Decode/HTML/Entities.php new file mode 100644 index 0000000..069e8d8 --- /dev/null +++ b/wp-includes/SimplePie/Decode/HTML/Entities.php @@ -0,0 +1,617 @@ +data = $data; + } + + /** + * Parse the input data + * + * @access public + * @return string Output data + */ + public function parse() + { + while (($this->position = strpos($this->data, '&', $this->position)) !== false) + { + $this->consume(); + $this->entity(); + $this->consumed = ''; + } + return $this->data; + } + + /** + * Consume the next byte + * + * @access private + * @return mixed The next byte, or false, if there is no more data + */ + public function consume() + { + if (isset($this->data[$this->position])) + { + $this->consumed .= $this->data[$this->position]; + return $this->data[$this->position++]; + } + else + { + return false; + } + } + + /** + * Consume a range of characters + * + * @access private + * @param string $chars Characters to consume + * @return mixed A series of characters that match the range, or false + */ + public function consume_range($chars) + { + if ($len = strspn($this->data, $chars, $this->position)) + { + $data = substr($this->data, $this->position, $len); + $this->consumed .= $data; + $this->position += $len; + return $data; + } + else + { + return false; + } + } + + /** + * Unconsume one byte + * + * @access private + */ + public function unconsume() + { + $this->consumed = substr($this->consumed, 0, -1); + $this->position--; + } + + /** + * Decode an entity + * + * @access private + */ + public function entity() + { + switch ($this->consume()) + { + case "\x09": + case "\x0A": + case "\x0B": + case "\x0B": + case "\x0C": + case "\x20": + case "\x3C": + case "\x26": + case false: + break; + + case "\x23": + switch ($this->consume()) + { + case "\x78": + case "\x58": + $range = '0123456789ABCDEFabcdef'; + $hex = true; + break; + + default: + $range = '0123456789'; + $hex = false; + $this->unconsume(); + break; + } + + if ($codepoint = $this->consume_range($range)) + { + static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8"); + + if ($hex) + { + $codepoint = hexdec($codepoint); + } + else + { + $codepoint = intval($codepoint); + } + + if (isset($windows_1252_specials[$codepoint])) + { + $replacement = $windows_1252_specials[$codepoint]; + } + else + { + $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint); + } + + if (!in_array($this->consume(), array(';', false), true)) + { + $this->unconsume(); + } + + $consumed_length = strlen($this->consumed); + $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length); + $this->position += strlen($replacement) - $consumed_length; + } + break; + + default: + static $entities = array( + 'Aacute' => "\xC3\x81", + 'aacute' => "\xC3\xA1", + 'Aacute;' => "\xC3\x81", + 'aacute;' => "\xC3\xA1", + 'Acirc' => "\xC3\x82", + 'acirc' => "\xC3\xA2", + 'Acirc;' => "\xC3\x82", + 'acirc;' => "\xC3\xA2", + 'acute' => "\xC2\xB4", + 'acute;' => "\xC2\xB4", + 'AElig' => "\xC3\x86", + 'aelig' => "\xC3\xA6", + 'AElig;' => "\xC3\x86", + 'aelig;' => "\xC3\xA6", + 'Agrave' => "\xC3\x80", + 'agrave' => "\xC3\xA0", + 'Agrave;' => "\xC3\x80", + 'agrave;' => "\xC3\xA0", + 'alefsym;' => "\xE2\x84\xB5", + 'Alpha;' => "\xCE\x91", + 'alpha;' => "\xCE\xB1", + 'AMP' => "\x26", + 'amp' => "\x26", + 'AMP;' => "\x26", + 'amp;' => "\x26", + 'and;' => "\xE2\x88\xA7", + 'ang;' => "\xE2\x88\xA0", + 'apos;' => "\x27", + 'Aring' => "\xC3\x85", + 'aring' => "\xC3\xA5", + 'Aring;' => "\xC3\x85", + 'aring;' => "\xC3\xA5", + 'asymp;' => "\xE2\x89\x88", + 'Atilde' => "\xC3\x83", + 'atilde' => "\xC3\xA3", + 'Atilde;' => "\xC3\x83", + 'atilde;' => "\xC3\xA3", + 'Auml' => "\xC3\x84", + 'auml' => "\xC3\xA4", + 'Auml;' => "\xC3\x84", + 'auml;' => "\xC3\xA4", + 'bdquo;' => "\xE2\x80\x9E", + 'Beta;' => "\xCE\x92", + 'beta;' => "\xCE\xB2", + 'brvbar' => "\xC2\xA6", + 'brvbar;' => "\xC2\xA6", + 'bull;' => "\xE2\x80\xA2", + 'cap;' => "\xE2\x88\xA9", + 'Ccedil' => "\xC3\x87", + 'ccedil' => "\xC3\xA7", + 'Ccedil;' => "\xC3\x87", + 'ccedil;' => "\xC3\xA7", + 'cedil' => "\xC2\xB8", + 'cedil;' => "\xC2\xB8", + 'cent' => "\xC2\xA2", + 'cent;' => "\xC2\xA2", + 'Chi;' => "\xCE\xA7", + 'chi;' => "\xCF\x87", + 'circ;' => "\xCB\x86", + 'clubs;' => "\xE2\x99\xA3", + 'cong;' => "\xE2\x89\x85", + 'COPY' => "\xC2\xA9", + 'copy' => "\xC2\xA9", + 'COPY;' => "\xC2\xA9", + 'copy;' => "\xC2\xA9", + 'crarr;' => "\xE2\x86\xB5", + 'cup;' => "\xE2\x88\xAA", + 'curren' => "\xC2\xA4", + 'curren;' => "\xC2\xA4", + 'Dagger;' => "\xE2\x80\xA1", + 'dagger;' => "\xE2\x80\xA0", + 'dArr;' => "\xE2\x87\x93", + 'darr;' => "\xE2\x86\x93", + 'deg' => "\xC2\xB0", + 'deg;' => "\xC2\xB0", + 'Delta;' => "\xCE\x94", + 'delta;' => "\xCE\xB4", + 'diams;' => "\xE2\x99\xA6", + 'divide' => "\xC3\xB7", + 'divide;' => "\xC3\xB7", + 'Eacute' => "\xC3\x89", + 'eacute' => "\xC3\xA9", + 'Eacute;' => "\xC3\x89", + 'eacute;' => "\xC3\xA9", + 'Ecirc' => "\xC3\x8A", + 'ecirc' => "\xC3\xAA", + 'Ecirc;' => "\xC3\x8A", + 'ecirc;' => "\xC3\xAA", + 'Egrave' => "\xC3\x88", + 'egrave' => "\xC3\xA8", + 'Egrave;' => "\xC3\x88", + 'egrave;' => "\xC3\xA8", + 'empty;' => "\xE2\x88\x85", + 'emsp;' => "\xE2\x80\x83", + 'ensp;' => "\xE2\x80\x82", + 'Epsilon;' => "\xCE\x95", + 'epsilon;' => "\xCE\xB5", + 'equiv;' => "\xE2\x89\xA1", + 'Eta;' => "\xCE\x97", + 'eta;' => "\xCE\xB7", + 'ETH' => "\xC3\x90", + 'eth' => "\xC3\xB0", + 'ETH;' => "\xC3\x90", + 'eth;' => "\xC3\xB0", + 'Euml' => "\xC3\x8B", + 'euml' => "\xC3\xAB", + 'Euml;' => "\xC3\x8B", + 'euml;' => "\xC3\xAB", + 'euro;' => "\xE2\x82\xAC", + 'exist;' => "\xE2\x88\x83", + 'fnof;' => "\xC6\x92", + 'forall;' => "\xE2\x88\x80", + 'frac12' => "\xC2\xBD", + 'frac12;' => "\xC2\xBD", + 'frac14' => "\xC2\xBC", + 'frac14;' => "\xC2\xBC", + 'frac34' => "\xC2\xBE", + 'frac34;' => "\xC2\xBE", + 'frasl;' => "\xE2\x81\x84", + 'Gamma;' => "\xCE\x93", + 'gamma;' => "\xCE\xB3", + 'ge;' => "\xE2\x89\xA5", + 'GT' => "\x3E", + 'gt' => "\x3E", + 'GT;' => "\x3E", + 'gt;' => "\x3E", + 'hArr;' => "\xE2\x87\x94", + 'harr;' => "\xE2\x86\x94", + 'hearts;' => "\xE2\x99\xA5", + 'hellip;' => "\xE2\x80\xA6", + 'Iacute' => "\xC3\x8D", + 'iacute' => "\xC3\xAD", + 'Iacute;' => "\xC3\x8D", + 'iacute;' => "\xC3\xAD", + 'Icirc' => "\xC3\x8E", + 'icirc' => "\xC3\xAE", + 'Icirc;' => "\xC3\x8E", + 'icirc;' => "\xC3\xAE", + 'iexcl' => "\xC2\xA1", + 'iexcl;' => "\xC2\xA1", + 'Igrave' => "\xC3\x8C", + 'igrave' => "\xC3\xAC", + 'Igrave;' => "\xC3\x8C", + 'igrave;' => "\xC3\xAC", + 'image;' => "\xE2\x84\x91", + 'infin;' => "\xE2\x88\x9E", + 'int;' => "\xE2\x88\xAB", + 'Iota;' => "\xCE\x99", + 'iota;' => "\xCE\xB9", + 'iquest' => "\xC2\xBF", + 'iquest;' => "\xC2\xBF", + 'isin;' => "\xE2\x88\x88", + 'Iuml' => "\xC3\x8F", + 'iuml' => "\xC3\xAF", + 'Iuml;' => "\xC3\x8F", + 'iuml;' => "\xC3\xAF", + 'Kappa;' => "\xCE\x9A", + 'kappa;' => "\xCE\xBA", + 'Lambda;' => "\xCE\x9B", + 'lambda;' => "\xCE\xBB", + 'lang;' => "\xE3\x80\x88", + 'laquo' => "\xC2\xAB", + 'laquo;' => "\xC2\xAB", + 'lArr;' => "\xE2\x87\x90", + 'larr;' => "\xE2\x86\x90", + 'lceil;' => "\xE2\x8C\x88", + 'ldquo;' => "\xE2\x80\x9C", + 'le;' => "\xE2\x89\xA4", + 'lfloor;' => "\xE2\x8C\x8A", + 'lowast;' => "\xE2\x88\x97", + 'loz;' => "\xE2\x97\x8A", + 'lrm;' => "\xE2\x80\x8E", + 'lsaquo;' => "\xE2\x80\xB9", + 'lsquo;' => "\xE2\x80\x98", + 'LT' => "\x3C", + 'lt' => "\x3C", + 'LT;' => "\x3C", + 'lt;' => "\x3C", + 'macr' => "\xC2\xAF", + 'macr;' => "\xC2\xAF", + 'mdash;' => "\xE2\x80\x94", + 'micro' => "\xC2\xB5", + 'micro;' => "\xC2\xB5", + 'middot' => "\xC2\xB7", + 'middot;' => "\xC2\xB7", + 'minus;' => "\xE2\x88\x92", + 'Mu;' => "\xCE\x9C", + 'mu;' => "\xCE\xBC", + 'nabla;' => "\xE2\x88\x87", + 'nbsp' => "\xC2\xA0", + 'nbsp;' => "\xC2\xA0", + 'ndash;' => "\xE2\x80\x93", + 'ne;' => "\xE2\x89\xA0", + 'ni;' => "\xE2\x88\x8B", + 'not' => "\xC2\xAC", + 'not;' => "\xC2\xAC", + 'notin;' => "\xE2\x88\x89", + 'nsub;' => "\xE2\x8A\x84", + 'Ntilde' => "\xC3\x91", + 'ntilde' => "\xC3\xB1", + 'Ntilde;' => "\xC3\x91", + 'ntilde;' => "\xC3\xB1", + 'Nu;' => "\xCE\x9D", + 'nu;' => "\xCE\xBD", + 'Oacute' => "\xC3\x93", + 'oacute' => "\xC3\xB3", + 'Oacute;' => "\xC3\x93", + 'oacute;' => "\xC3\xB3", + 'Ocirc' => "\xC3\x94", + 'ocirc' => "\xC3\xB4", + 'Ocirc;' => "\xC3\x94", + 'ocirc;' => "\xC3\xB4", + 'OElig;' => "\xC5\x92", + 'oelig;' => "\xC5\x93", + 'Ograve' => "\xC3\x92", + 'ograve' => "\xC3\xB2", + 'Ograve;' => "\xC3\x92", + 'ograve;' => "\xC3\xB2", + 'oline;' => "\xE2\x80\xBE", + 'Omega;' => "\xCE\xA9", + 'omega;' => "\xCF\x89", + 'Omicron;' => "\xCE\x9F", + 'omicron;' => "\xCE\xBF", + 'oplus;' => "\xE2\x8A\x95", + 'or;' => "\xE2\x88\xA8", + 'ordf' => "\xC2\xAA", + 'ordf;' => "\xC2\xAA", + 'ordm' => "\xC2\xBA", + 'ordm;' => "\xC2\xBA", + 'Oslash' => "\xC3\x98", + 'oslash' => "\xC3\xB8", + 'Oslash;' => "\xC3\x98", + 'oslash;' => "\xC3\xB8", + 'Otilde' => "\xC3\x95", + 'otilde' => "\xC3\xB5", + 'Otilde;' => "\xC3\x95", + 'otilde;' => "\xC3\xB5", + 'otimes;' => "\xE2\x8A\x97", + 'Ouml' => "\xC3\x96", + 'ouml' => "\xC3\xB6", + 'Ouml;' => "\xC3\x96", + 'ouml;' => "\xC3\xB6", + 'para' => "\xC2\xB6", + 'para;' => "\xC2\xB6", + 'part;' => "\xE2\x88\x82", + 'permil;' => "\xE2\x80\xB0", + 'perp;' => "\xE2\x8A\xA5", + 'Phi;' => "\xCE\xA6", + 'phi;' => "\xCF\x86", + 'Pi;' => "\xCE\xA0", + 'pi;' => "\xCF\x80", + 'piv;' => "\xCF\x96", + 'plusmn' => "\xC2\xB1", + 'plusmn;' => "\xC2\xB1", + 'pound' => "\xC2\xA3", + 'pound;' => "\xC2\xA3", + 'Prime;' => "\xE2\x80\xB3", + 'prime;' => "\xE2\x80\xB2", + 'prod;' => "\xE2\x88\x8F", + 'prop;' => "\xE2\x88\x9D", + 'Psi;' => "\xCE\xA8", + 'psi;' => "\xCF\x88", + 'QUOT' => "\x22", + 'quot' => "\x22", + 'QUOT;' => "\x22", + 'quot;' => "\x22", + 'radic;' => "\xE2\x88\x9A", + 'rang;' => "\xE3\x80\x89", + 'raquo' => "\xC2\xBB", + 'raquo;' => "\xC2\xBB", + 'rArr;' => "\xE2\x87\x92", + 'rarr;' => "\xE2\x86\x92", + 'rceil;' => "\xE2\x8C\x89", + 'rdquo;' => "\xE2\x80\x9D", + 'real;' => "\xE2\x84\x9C", + 'REG' => "\xC2\xAE", + 'reg' => "\xC2\xAE", + 'REG;' => "\xC2\xAE", + 'reg;' => "\xC2\xAE", + 'rfloor;' => "\xE2\x8C\x8B", + 'Rho;' => "\xCE\xA1", + 'rho;' => "\xCF\x81", + 'rlm;' => "\xE2\x80\x8F", + 'rsaquo;' => "\xE2\x80\xBA", + 'rsquo;' => "\xE2\x80\x99", + 'sbquo;' => "\xE2\x80\x9A", + 'Scaron;' => "\xC5\xA0", + 'scaron;' => "\xC5\xA1", + 'sdot;' => "\xE2\x8B\x85", + 'sect' => "\xC2\xA7", + 'sect;' => "\xC2\xA7", + 'shy' => "\xC2\xAD", + 'shy;' => "\xC2\xAD", + 'Sigma;' => "\xCE\xA3", + 'sigma;' => "\xCF\x83", + 'sigmaf;' => "\xCF\x82", + 'sim;' => "\xE2\x88\xBC", + 'spades;' => "\xE2\x99\xA0", + 'sub;' => "\xE2\x8A\x82", + 'sube;' => "\xE2\x8A\x86", + 'sum;' => "\xE2\x88\x91", + 'sup;' => "\xE2\x8A\x83", + 'sup1' => "\xC2\xB9", + 'sup1;' => "\xC2\xB9", + 'sup2' => "\xC2\xB2", + 'sup2;' => "\xC2\xB2", + 'sup3' => "\xC2\xB3", + 'sup3;' => "\xC2\xB3", + 'supe;' => "\xE2\x8A\x87", + 'szlig' => "\xC3\x9F", + 'szlig;' => "\xC3\x9F", + 'Tau;' => "\xCE\xA4", + 'tau;' => "\xCF\x84", + 'there4;' => "\xE2\x88\xB4", + 'Theta;' => "\xCE\x98", + 'theta;' => "\xCE\xB8", + 'thetasym;' => "\xCF\x91", + 'thinsp;' => "\xE2\x80\x89", + 'THORN' => "\xC3\x9E", + 'thorn' => "\xC3\xBE", + 'THORN;' => "\xC3\x9E", + 'thorn;' => "\xC3\xBE", + 'tilde;' => "\xCB\x9C", + 'times' => "\xC3\x97", + 'times;' => "\xC3\x97", + 'TRADE;' => "\xE2\x84\xA2", + 'trade;' => "\xE2\x84\xA2", + 'Uacute' => "\xC3\x9A", + 'uacute' => "\xC3\xBA", + 'Uacute;' => "\xC3\x9A", + 'uacute;' => "\xC3\xBA", + 'uArr;' => "\xE2\x87\x91", + 'uarr;' => "\xE2\x86\x91", + 'Ucirc' => "\xC3\x9B", + 'ucirc' => "\xC3\xBB", + 'Ucirc;' => "\xC3\x9B", + 'ucirc;' => "\xC3\xBB", + 'Ugrave' => "\xC3\x99", + 'ugrave' => "\xC3\xB9", + 'Ugrave;' => "\xC3\x99", + 'ugrave;' => "\xC3\xB9", + 'uml' => "\xC2\xA8", + 'uml;' => "\xC2\xA8", + 'upsih;' => "\xCF\x92", + 'Upsilon;' => "\xCE\xA5", + 'upsilon;' => "\xCF\x85", + 'Uuml' => "\xC3\x9C", + 'uuml' => "\xC3\xBC", + 'Uuml;' => "\xC3\x9C", + 'uuml;' => "\xC3\xBC", + 'weierp;' => "\xE2\x84\x98", + 'Xi;' => "\xCE\x9E", + 'xi;' => "\xCE\xBE", + 'Yacute' => "\xC3\x9D", + 'yacute' => "\xC3\xBD", + 'Yacute;' => "\xC3\x9D", + 'yacute;' => "\xC3\xBD", + 'yen' => "\xC2\xA5", + 'yen;' => "\xC2\xA5", + 'yuml' => "\xC3\xBF", + 'Yuml;' => "\xC5\xB8", + 'yuml;' => "\xC3\xBF", + 'Zeta;' => "\xCE\x96", + 'zeta;' => "\xCE\xB6", + 'zwj;' => "\xE2\x80\x8D", + 'zwnj;' => "\xE2\x80\x8C" + ); + + for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++) + { + $consumed = substr($this->consumed, 1); + if (isset($entities[$consumed])) + { + $match = $consumed; + } + } + + if ($match !== null) + { + $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1); + $this->position += strlen($entities[$match]) - strlen($consumed) - 1; + } + break; + } + } +} + diff --git a/wp-includes/SimplePie/Enclosure.php b/wp-includes/SimplePie/Enclosure.php new file mode 100644 index 0000000..5567437 --- /dev/null +++ b/wp-includes/SimplePie/Enclosure.php @@ -0,0 +1,1380 @@ +bitrate = $bitrate; + $this->captions = $captions; + $this->categories = $categories; + $this->channels = $channels; + $this->copyright = $copyright; + $this->credits = $credits; + $this->description = $description; + $this->duration = $duration; + $this->expression = $expression; + $this->framerate = $framerate; + $this->hashes = $hashes; + $this->height = $height; + $this->keywords = $keywords; + $this->lang = $lang; + $this->length = $length; + $this->link = $link; + $this->medium = $medium; + $this->player = $player; + $this->ratings = $ratings; + $this->restrictions = $restrictions; + $this->samplingrate = $samplingrate; + $this->thumbnails = $thumbnails; + $this->title = $title; + $this->type = $type; + $this->width = $width; + + if (class_exists('idna_convert')) + { + $idn = new idna_convert(); + $parsed = SimplePie_Misc::parse_url($link); + $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); + } + $this->handler = $this->get_handler(); // Needs to load last + } + + /** + * String-ified version + * + * @return string + */ + public function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + /** + * Get the bitrate + * + * @return string|null + */ + public function get_bitrate() + { + if ($this->bitrate !== null) + { + return $this->bitrate; + } + else + { + return null; + } + } + + /** + * Get a single caption + * + * @param int $key + * @return SimplePie_Caption|null + */ + public function get_caption($key = 0) + { + $captions = $this->get_captions(); + if (isset($captions[$key])) + { + return $captions[$key]; + } + else + { + return null; + } + } + + /** + * Get all captions + * + * @return array|null Array of {@see SimplePie_Caption} objects + */ + public function get_captions() + { + if ($this->captions !== null) + { + return $this->captions; + } + else + { + return null; + } + } + + /** + * Get a single category + * + * @param int $key + * @return SimplePie_Category|null + */ + public function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + /** + * Get all categories + * + * @return array|null Array of {@see SimplePie_Category} objects + */ + public function get_categories() + { + if ($this->categories !== null) + { + return $this->categories; + } + else + { + return null; + } + } + + /** + * Get the number of audio channels + * + * @return int|null + */ + public function get_channels() + { + if ($this->channels !== null) + { + return $this->channels; + } + else + { + return null; + } + } + + /** + * Get the copyright information + * + * @return SimplePie_Copyright|null + */ + public function get_copyright() + { + if ($this->copyright !== null) + { + return $this->copyright; + } + else + { + return null; + } + } + + /** + * Get a single credit + * + * @param int $key + * @return SimplePie_Credit|null + */ + public function get_credit($key = 0) + { + $credits = $this->get_credits(); + if (isset($credits[$key])) + { + return $credits[$key]; + } + else + { + return null; + } + } + + /** + * Get all credits + * + * @return array|null Array of {@see SimplePie_Credit} objects + */ + public function get_credits() + { + if ($this->credits !== null) + { + return $this->credits; + } + else + { + return null; + } + } + + /** + * Get the description of the enclosure + * + * @return string|null + */ + public function get_description() + { + if ($this->description !== null) + { + return $this->description; + } + else + { + return null; + } + } + + /** + * Get the duration of the enclosure + * + * @param string $convert Convert seconds into hh:mm:ss + * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found) + */ + public function get_duration($convert = false) + { + if ($this->duration !== null) + { + if ($convert) + { + $time = SimplePie_Misc::time_hms($this->duration); + return $time; + } + else + { + return $this->duration; + } + } + else + { + return null; + } + } + + /** + * Get the expression + * + * @return string Probably one of 'sample', 'full', 'nonstop', 'clip'. Defaults to 'full' + */ + public function get_expression() + { + if ($this->expression !== null) + { + return $this->expression; + } + else + { + return 'full'; + } + } + + /** + * Get the file extension + * + * @return string|null + */ + public function get_extension() + { + if ($this->link !== null) + { + $url = SimplePie_Misc::parse_url($this->link); + if ($url['path'] !== '') + { + return pathinfo($url['path'], PATHINFO_EXTENSION); + } + } + return null; + } + + /** + * Get the framerate (in frames-per-second) + * + * @return string|null + */ + public function get_framerate() + { + if ($this->framerate !== null) + { + return $this->framerate; + } + else + { + return null; + } + } + + /** + * Get the preferred handler + * + * @return string|null One of 'flash', 'fmedia', 'quicktime', 'wmedia', 'mp3' + */ + public function get_handler() + { + return $this->get_real_type(true); + } + + /** + * Get a single hash + * + * @link http://www.rssboard.org/media-rss#media-hash + * @param int $key + * @return string|null Hash as per `media:hash`, prefixed with "$algo:" + */ + public function get_hash($key = 0) + { + $hashes = $this->get_hashes(); + if (isset($hashes[$key])) + { + return $hashes[$key]; + } + else + { + return null; + } + } + + /** + * Get all credits + * + * @return array|null Array of strings, see {@see get_hash()} + */ + public function get_hashes() + { + if ($this->hashes !== null) + { + return $this->hashes; + } + else + { + return null; + } + } + + /** + * Get the height + * + * @return string|null + */ + public function get_height() + { + if ($this->height !== null) + { + return $this->height; + } + else + { + return null; + } + } + + /** + * Get the language + * + * @link http://tools.ietf.org/html/rfc3066 + * @return string|null Language code as per RFC 3066 + */ + public function get_language() + { + if ($this->lang !== null) + { + return $this->lang; + } + else + { + return null; + } + } + + /** + * Get a single keyword + * + * @param int $key + * @return string|null + */ + public function get_keyword($key = 0) + { + $keywords = $this->get_keywords(); + if (isset($keywords[$key])) + { + return $keywords[$key]; + } + else + { + return null; + } + } + + /** + * Get all keywords + * + * @return array|null Array of strings + */ + public function get_keywords() + { + if ($this->keywords !== null) + { + return $this->keywords; + } + else + { + return null; + } + } + + /** + * Get length + * + * @return float Length in bytes + */ + public function get_length() + { + if ($this->length !== null) + { + return $this->length; + } + else + { + return null; + } + } + + /** + * Get the URL + * + * @return string|null + */ + public function get_link() + { + if ($this->link !== null) + { + return urldecode($this->link); + } + else + { + return null; + } + } + + /** + * Get the medium + * + * @link http://www.rssboard.org/media-rss#media-content + * @return string|null Should be one of 'image', 'audio', 'video', 'document', 'executable' + */ + public function get_medium() + { + if ($this->medium !== null) + { + return $this->medium; + } + else + { + return null; + } + } + + /** + * Get the player URL + * + * Typically the same as {@see get_permalink()} + * @return string|null Player URL + */ + public function get_player() + { + if ($this->player !== null) + { + return $this->player; + } + else + { + return null; + } + } + + /** + * Get a single rating + * + * @param int $key + * @return SimplePie_Rating|null + */ + public function get_rating($key = 0) + { + $ratings = $this->get_ratings(); + if (isset($ratings[$key])) + { + return $ratings[$key]; + } + else + { + return null; + } + } + + /** + * Get all ratings + * + * @return array|null Array of {@see SimplePie_Rating} objects + */ + public function get_ratings() + { + if ($this->ratings !== null) + { + return $this->ratings; + } + else + { + return null; + } + } + + /** + * Get a single restriction + * + * @param int $key + * @return SimplePie_Restriction|null + */ + public function get_restriction($key = 0) + { + $restrictions = $this->get_restrictions(); + if (isset($restrictions[$key])) + { + return $restrictions[$key]; + } + else + { + return null; + } + } + + /** + * Get all restrictions + * + * @return array|null Array of {@see SimplePie_Restriction} objects + */ + public function get_restrictions() + { + if ($this->restrictions !== null) + { + return $this->restrictions; + } + else + { + return null; + } + } + + /** + * Get the sampling rate (in kHz) + * + * @return string|null + */ + public function get_sampling_rate() + { + if ($this->samplingrate !== null) + { + return $this->samplingrate; + } + else + { + return null; + } + } + + /** + * Get the file size (in MiB) + * + * @return float|null File size in mebibytes (1048 bytes) + */ + public function get_size() + { + $length = $this->get_length(); + if ($length !== null) + { + return round($length/1048576, 2); + } + else + { + return null; + } + } + + /** + * Get a single thumbnail + * + * @param int $key + * @return string|null Thumbnail URL + */ + public function get_thumbnail($key = 0) + { + $thumbnails = $this->get_thumbnails(); + if (isset($thumbnails[$key])) + { + return $thumbnails[$key]; + } + else + { + return null; + } + } + + /** + * Get all thumbnails + * + * @return array|null Array of thumbnail URLs + */ + public function get_thumbnails() + { + if ($this->thumbnails !== null) + { + return $this->thumbnails; + } + else + { + return null; + } + } + + /** + * Get the title + * + * @return string|null + */ + public function get_title() + { + if ($this->title !== null) + { + return $this->title; + } + else + { + return null; + } + } + + /** + * Get mimetype of the enclosure + * + * @see get_real_type() + * @return string|null MIME type + */ + public function get_type() + { + if ($this->type !== null) + { + return $this->type; + } + else + { + return null; + } + } + + /** + * Get the width + * + * @return string|null + */ + public function get_width() + { + if ($this->width !== null) + { + return $this->width; + } + else + { + return null; + } + } + + /** + * Embed the enclosure using `` + * + * @deprecated Use the second parameter to {@see embed} instead + * + * @param array|string $options See first paramter to {@see embed} + * @return string HTML string to output + */ + public function native_embed($options='') + { + return $this->embed($options, true); + } + + /** + * Embed the enclosure using Javascript + * + * `$options` is an array or comma-separated key:value string, with the + * following properties: + * + * - `alt` (string): Alternate content for when an end-user does not have + * the appropriate handler installed or when a file type is + * unsupported. Can be any text or HTML. Defaults to blank. + * - `altclass` (string): If a file type is unsupported, the end-user will + * see the alt text (above) linked directly to the content. That link + * will have this value as its class name. Defaults to blank. + * - `audio` (string): This is an image that should be used as a + * placeholder for audio files before they're loaded (QuickTime-only). + * Can be any relative or absolute URL. Defaults to blank. + * - `bgcolor` (string): The background color for the media, if not + * already transparent. Defaults to `#ffffff`. + * - `height` (integer): The height of the embedded media. Accepts any + * numeric pixel value (such as `360`) or `auto`. Defaults to `auto`, + * and it is recommended that you use this default. + * - `loop` (boolean): Do you want the media to loop when its done? + * Defaults to `false`. + * - `mediaplayer` (string): The location of the included + * `mediaplayer.swf` file. This allows for the playback of Flash Video + * (`.flv`) files, and is the default handler for non-Odeo MP3's. + * Defaults to blank. + * - `video` (string): This is an image that should be used as a + * placeholder for video files before they're loaded (QuickTime-only). + * Can be any relative or absolute URL. Defaults to blank. + * - `width` (integer): The width of the embedded media. Accepts any + * numeric pixel value (such as `480`) or `auto`. Defaults to `auto`, + * and it is recommended that you use this default. + * - `widescreen` (boolean): Is the enclosure widescreen or standard? + * This applies only to video enclosures, and will automatically resize + * the content appropriately. Defaults to `false`, implying 4:3 mode. + * + * Note: Non-widescreen (4:3) mode with `width` and `height` set to `auto` + * will default to 480x360 video resolution. Widescreen (16:9) mode with + * `width` and `height` set to `auto` will default to 480x270 video resolution. + * + * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'. + * @param array|string $options Comma-separated key:value list, or array + * @param bool $native Use `` + * @return string HTML string to output + */ + public function embed($options = '', $native = false) + { + // Set up defaults + $audio = ''; + $video = ''; + $alt = ''; + $altclass = ''; + $loop = 'false'; + $width = 'auto'; + $height = 'auto'; + $bgcolor = '#ffffff'; + $mediaplayer = ''; + $widescreen = false; + $handler = $this->get_handler(); + $type = $this->get_real_type(); + + // Process options and reassign values as necessary + if (is_array($options)) + { + extract($options); + } + else + { + $options = explode(',', $options); + foreach($options as $option) + { + $opt = explode(':', $option, 2); + if (isset($opt[0], $opt[1])) + { + $opt[0] = trim($opt[0]); + $opt[1] = trim($opt[1]); + switch ($opt[0]) + { + case 'audio': + $audio = $opt[1]; + break; + + case 'video': + $video = $opt[1]; + break; + + case 'alt': + $alt = $opt[1]; + break; + + case 'altclass': + $altclass = $opt[1]; + break; + + case 'loop': + $loop = $opt[1]; + break; + + case 'width': + $width = $opt[1]; + break; + + case 'height': + $height = $opt[1]; + break; + + case 'bgcolor': + $bgcolor = $opt[1]; + break; + + case 'mediaplayer': + $mediaplayer = $opt[1]; + break; + + case 'widescreen': + $widescreen = $opt[1]; + break; + } + } + } + } + + $mime = explode('/', $type, 2); + $mime = $mime[0]; + + // Process values for 'auto' + if ($width === 'auto') + { + if ($mime === 'video') + { + if ($height === 'auto') + { + $width = 480; + } + elseif ($widescreen) + { + $width = round((intval($height)/9)*16); + } + else + { + $width = round((intval($height)/3)*4); + } + } + else + { + $width = '100%'; + } + } + + if ($height === 'auto') + { + if ($mime === 'audio') + { + $height = 0; + } + elseif ($mime === 'video') + { + if ($width === 'auto') + { + if ($widescreen) + { + $height = 270; + } + else + { + $height = 360; + } + } + elseif ($widescreen) + { + $height = round((intval($width)/16)*9); + } + else + { + $height = round((intval($width)/4)*3); + } + } + else + { + $height = 376; + } + } + elseif ($mime === 'audio') + { + $height = 0; + } + + // Set proper placeholder value + if ($mime === 'audio') + { + $placeholder = $audio; + } + elseif ($mime === 'video') + { + $placeholder = $video; + } + + $embed = ''; + + // Flash + if ($handler === 'flash') + { + if ($native) + { + $embed .= "get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\">"; + } + else + { + $embed .= ""; + } + } + + // Flash Media Player file types. + // Preferred handler for MP3 file types. + elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== '')) + { + $height += 20; + if ($native) + { + $embed .= "get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\">"; + } + else + { + $embed .= ""; + } + } + + // QuickTime 7 file types. Need to test with QuickTime 6. + // Only handle MP3's if the Flash Media Player is not present. + elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === '')) + { + $height += 16; + if ($native) + { + if ($placeholder !== '') + { + $embed .= "get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\">"; + } + else + { + $embed .= "get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\">"; + } + } + else + { + $embed .= ""; + } + } + + // Windows Media + elseif ($handler === 'wmedia') + { + $height += 45; + if ($native) + { + $embed .= "get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\">"; + } + else + { + $embed .= ""; + } + } + + // Everything else + else $embed .= '' . $alt . ''; + + return $embed; + } + + /** + * Get the real media type + * + * Often, feeds lie to us, necessitating a bit of deeper inspection. This + * converts types to their canonical representations based on the file + * extension + * + * @see get_type() + * @param bool $find_handler Internal use only, use {@see get_handler()} instead + * @return string MIME type + */ + public function get_real_type($find_handler = false) + { + // Mime-types by handler. + $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash + $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player + $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime + $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media + $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3 + + if ($this->get_type() !== null) + { + $type = strtolower($this->type); + } + else + { + $type = null; + } + + // If we encounter an unsupported mime-type, check the file extension and guess intelligently. + if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3))) + { + switch (strtolower($this->get_extension())) + { + // Audio mime-types + case 'aac': + case 'adts': + $type = 'audio/acc'; + break; + + case 'aif': + case 'aifc': + case 'aiff': + case 'cdda': + $type = 'audio/aiff'; + break; + + case 'bwf': + $type = 'audio/wav'; + break; + + case 'kar': + case 'mid': + case 'midi': + case 'smf': + $type = 'audio/midi'; + break; + + case 'm4a': + $type = 'audio/x-m4a'; + break; + + case 'mp3': + case 'swa': + $type = 'audio/mp3'; + break; + + case 'wav': + $type = 'audio/wav'; + break; + + case 'wax': + $type = 'audio/x-ms-wax'; + break; + + case 'wma': + $type = 'audio/x-ms-wma'; + break; + + // Video mime-types + case '3gp': + case '3gpp': + $type = 'video/3gpp'; + break; + + case '3g2': + case '3gp2': + $type = 'video/3gpp2'; + break; + + case 'asf': + $type = 'video/x-ms-asf'; + break; + + case 'flv': + $type = 'video/x-flv'; + break; + + case 'm1a': + case 'm1s': + case 'm1v': + case 'm15': + case 'm75': + case 'mp2': + case 'mpa': + case 'mpeg': + case 'mpg': + case 'mpm': + case 'mpv': + $type = 'video/mpeg'; + break; + + case 'm4v': + $type = 'video/x-m4v'; + break; + + case 'mov': + case 'qt': + $type = 'video/quicktime'; + break; + + case 'mp4': + case 'mpg4': + $type = 'video/mp4'; + break; + + case 'sdv': + $type = 'video/sd-video'; + break; + + case 'wm': + $type = 'video/x-ms-wm'; + break; + + case 'wmv': + $type = 'video/x-ms-wmv'; + break; + + case 'wvx': + $type = 'video/x-ms-wvx'; + break; + + // Flash mime-types + case 'spl': + $type = 'application/futuresplash'; + break; + + case 'swf': + $type = 'application/x-shockwave-flash'; + break; + } + } + + if ($find_handler) + { + if (in_array($type, $types_flash)) + { + return 'flash'; + } + elseif (in_array($type, $types_fmedia)) + { + return 'fmedia'; + } + elseif (in_array($type, $types_quicktime)) + { + return 'quicktime'; + } + elseif (in_array($type, $types_wmedia)) + { + return 'wmedia'; + } + elseif (in_array($type, $types_mp3)) + { + return 'mp3'; + } + else + { + return null; + } + } + else + { + return $type; + } + } +} + diff --git a/wp-includes/SimplePie/Exception.php b/wp-includes/SimplePie/Exception.php new file mode 100644 index 0000000..73e104d --- /dev/null +++ b/wp-includes/SimplePie/Exception.php @@ -0,0 +1,52 @@ +encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); + } + $this->url = $url; + $this->useragent = $useragent; + if (preg_match('/^http(s)?:\/\//i', $url)) + { + if ($useragent === null) + { + $useragent = ini_get('user_agent'); + $this->useragent = $useragent; + } + if (!is_array($headers)) + { + $headers = array(); + } + if (!$force_fsockopen && function_exists('curl_exec')) + { + $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL; + $fp = curl_init(); + $headers2 = array(); + foreach ($headers as $key => $value) + { + $headers2[] = "$key: $value"; + } + if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>=')) + { + curl_setopt($fp, CURLOPT_ENCODING, ''); + } + curl_setopt($fp, CURLOPT_URL, $url); + curl_setopt($fp, CURLOPT_HEADER, 1); + curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($fp, CURLOPT_TIMEOUT, $timeout); + curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout); + curl_setopt($fp, CURLOPT_REFERER, $url); + curl_setopt($fp, CURLOPT_USERAGENT, $useragent); + curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2); + if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>=')) + { + curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects); + } + + $this->headers = curl_exec($fp); + if (curl_errno($fp) === 23 || curl_errno($fp) === 61) + { + curl_setopt($fp, CURLOPT_ENCODING, 'none'); + $this->headers = curl_exec($fp); + } + if (curl_errno($fp)) + { + $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp); + $this->success = false; + } + else + { + $info = curl_getinfo($fp); + curl_close($fp); + $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1); + $this->headers = array_pop($this->headers); + $parser = new SimplePie_HTTP_Parser($this->headers); + if ($parser->parse()) + { + $this->headers = $parser->headers; + $this->body = $parser->body; + $this->status_code = $parser->status_code; + if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) + { + $this->redirects++; + $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); + return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); + } + } + } + } + else + { + $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN; + $url_parts = parse_url($url); + $socket_host = $url_parts['host']; + if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') + { + $socket_host = "ssl://$url_parts[host]"; + $url_parts['port'] = 443; + } + if (!isset($url_parts['port'])) + { + $url_parts['port'] = 80; + } + $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout); + if (!$fp) + { + $this->error = 'fsockopen error: ' . $errstr; + $this->success = false; + } + else + { + stream_set_timeout($fp, $timeout); + if (isset($url_parts['path'])) + { + if (isset($url_parts['query'])) + { + $get = "$url_parts[path]?$url_parts[query]"; + } + else + { + $get = $url_parts['path']; + } + } + else + { + $get = '/'; + } + $out = "GET $get HTTP/1.1\r\n"; + $out .= "Host: $url_parts[host]\r\n"; + $out .= "User-Agent: $useragent\r\n"; + if (extension_loaded('zlib')) + { + $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n"; + } + + if (isset($url_parts['user']) && isset($url_parts['pass'])) + { + $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n"; + } + foreach ($headers as $key => $value) + { + $out .= "$key: $value\r\n"; + } + $out .= "Connection: Close\r\n\r\n"; + fwrite($fp, $out); + + $info = stream_get_meta_data($fp); + + $this->headers = ''; + while (!$info['eof'] && !$info['timed_out']) + { + $this->headers .= fread($fp, 1160); + $info = stream_get_meta_data($fp); + } + if (!$info['timed_out']) + { + $parser = new SimplePie_HTTP_Parser($this->headers); + if ($parser->parse()) + { + $this->headers = $parser->headers; + $this->body = $parser->body; + $this->status_code = $parser->status_code; + if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) + { + $this->redirects++; + $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); + return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); + } + if (isset($this->headers['content-encoding'])) + { + // Hey, we act dumb elsewhere, so let's do that here too + switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20"))) + { + case 'gzip': + case 'x-gzip': + $decoder = new SimplePie_gzdecode($this->body); + if (!$decoder->parse()) + { + $this->error = 'Unable to decode HTTP "gzip" stream'; + $this->success = false; + } + else + { + $this->body = $decoder->data; + } + break; + + case 'deflate': + if (($decompressed = gzinflate($this->body)) !== false) + { + $this->body = $decompressed; + } + else if (($decompressed = gzuncompress($this->body)) !== false) + { + $this->body = $decompressed; + } + else if (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false) + { + $this->body = $decompressed; + } + else + { + $this->error = 'Unable to decode HTTP "deflate" stream'; + $this->success = false; + } + break; + + default: + $this->error = 'Unknown content coding'; + $this->success = false; + } + } + } + } + else + { + $this->error = 'fsocket timed out'; + $this->success = false; + } + fclose($fp); + } + } + } + else + { + $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS; + if (!$this->body = file_get_contents($url)) + { + $this->error = 'file_get_contents could not read the file'; + $this->success = false; + } + } + } +} diff --git a/wp-includes/SimplePie/HTTP/Parser.php b/wp-includes/SimplePie/HTTP/Parser.php new file mode 100644 index 0000000..bff2222 --- /dev/null +++ b/wp-includes/SimplePie/HTTP/Parser.php @@ -0,0 +1,500 @@ +data = $data; + $this->data_length = strlen($this->data); + } + + /** + * Parse the input data + * + * @return bool true on success, false on failure + */ + public function parse() + { + while ($this->state && $this->state !== 'emit' && $this->has_data()) + { + $state = $this->state; + $this->$state(); + } + $this->data = ''; + if ($this->state === 'emit' || $this->state === 'body') + { + return true; + } + else + { + $this->http_version = ''; + $this->status_code = ''; + $this->reason = ''; + $this->headers = array(); + $this->body = ''; + return false; + } + } + + /** + * Check whether there is data beyond the pointer + * + * @return bool true if there is further data, false if not + */ + protected function has_data() + { + return (bool) ($this->position < $this->data_length); + } + + /** + * See if the next character is LWS + * + * @return bool true if the next character is LWS, false if not + */ + protected function is_linear_whitespace() + { + return (bool) ($this->data[$this->position] === "\x09" + || $this->data[$this->position] === "\x20" + || ($this->data[$this->position] === "\x0A" + && isset($this->data[$this->position + 1]) + && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20"))); + } + + /** + * Parse the HTTP version + */ + protected function http_version() + { + if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/') + { + $len = strspn($this->data, '0123456789.', 5); + $this->http_version = substr($this->data, 5, $len); + $this->position += 5 + $len; + if (substr_count($this->http_version, '.') <= 1) + { + $this->http_version = (float) $this->http_version; + $this->position += strspn($this->data, "\x09\x20", $this->position); + $this->state = 'status'; + } + else + { + $this->state = false; + } + } + else + { + $this->state = false; + } + } + + /** + * Parse the status code + */ + protected function status() + { + if ($len = strspn($this->data, '0123456789', $this->position)) + { + $this->status_code = (int) substr($this->data, $this->position, $len); + $this->position += $len; + $this->state = 'reason'; + } + else + { + $this->state = false; + } + } + + /** + * Parse the reason phrase + */ + protected function reason() + { + $len = strcspn($this->data, "\x0A", $this->position); + $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20"); + $this->position += $len + 1; + $this->state = 'new_line'; + } + + /** + * Deal with a new line, shifting data around as needed + */ + protected function new_line() + { + $this->value = trim($this->value, "\x0D\x20"); + if ($this->name !== '' && $this->value !== '') + { + $this->name = strtolower($this->name); + // We should only use the last Content-Type header. c.f. issue #1 + if (isset($this->headers[$this->name]) && $this->name !== 'content-type') + { + $this->headers[$this->name] .= ', ' . $this->value; + } + else + { + $this->headers[$this->name] = $this->value; + } + } + $this->name = ''; + $this->value = ''; + if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A") + { + $this->position += 2; + $this->state = 'body'; + } + elseif ($this->data[$this->position] === "\x0A") + { + $this->position++; + $this->state = 'body'; + } + else + { + $this->state = 'name'; + } + } + + /** + * Parse a header name + */ + protected function name() + { + $len = strcspn($this->data, "\x0A:", $this->position); + if (isset($this->data[$this->position + $len])) + { + if ($this->data[$this->position + $len] === "\x0A") + { + $this->position += $len; + $this->state = 'new_line'; + } + else + { + $this->name = substr($this->data, $this->position, $len); + $this->position += $len + 1; + $this->state = 'value'; + } + } + else + { + $this->state = false; + } + } + + /** + * Parse LWS, replacing consecutive LWS characters with a single space + */ + protected function linear_whitespace() + { + do + { + if (substr($this->data, $this->position, 2) === "\x0D\x0A") + { + $this->position += 2; + } + elseif ($this->data[$this->position] === "\x0A") + { + $this->position++; + } + $this->position += strspn($this->data, "\x09\x20", $this->position); + } while ($this->has_data() && $this->is_linear_whitespace()); + $this->value .= "\x20"; + } + + /** + * See what state to move to while within non-quoted header values + */ + protected function value() + { + if ($this->is_linear_whitespace()) + { + $this->linear_whitespace(); + } + else + { + switch ($this->data[$this->position]) + { + case '"': + // Workaround for ETags: we have to include the quotes as + // part of the tag. + if (strtolower($this->name) === 'etag') + { + $this->value .= '"'; + $this->position++; + $this->state = 'value_char'; + break; + } + $this->position++; + $this->state = 'quote'; + break; + + case "\x0A": + $this->position++; + $this->state = 'new_line'; + break; + + default: + $this->state = 'value_char'; + break; + } + } + } + + /** + * Parse a header value while outside quotes + */ + protected function value_char() + { + $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position); + $this->value .= substr($this->data, $this->position, $len); + $this->position += $len; + $this->state = 'value'; + } + + /** + * See what state to move to while within quoted header values + */ + protected function quote() + { + if ($this->is_linear_whitespace()) + { + $this->linear_whitespace(); + } + else + { + switch ($this->data[$this->position]) + { + case '"': + $this->position++; + $this->state = 'value'; + break; + + case "\x0A": + $this->position++; + $this->state = 'new_line'; + break; + + case '\\': + $this->position++; + $this->state = 'quote_escaped'; + break; + + default: + $this->state = 'quote_char'; + break; + } + } + } + + /** + * Parse a header value while within quotes + */ + protected function quote_char() + { + $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position); + $this->value .= substr($this->data, $this->position, $len); + $this->position += $len; + $this->state = 'value'; + } + + /** + * Parse an escaped character within quotes + */ + protected function quote_escaped() + { + $this->value .= $this->data[$this->position]; + $this->position++; + $this->state = 'quote'; + } + + /** + * Parse the body + */ + protected function body() + { + $this->body = substr($this->data, $this->position); + if (!empty($this->headers['transfer-encoding'])) + { + unset($this->headers['transfer-encoding']); + $this->state = 'chunked'; + } + else + { + $this->state = 'emit'; + } + } + + /** + * Parsed a "Transfer-Encoding: chunked" body + */ + protected function chunked() + { + if (!preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', trim($this->body))) + { + $this->state = 'emit'; + return; + } + + $decoded = ''; + $encoded = $this->body; + + while (true) + { + $is_chunked = (bool) preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', $encoded, $matches ); + if (!$is_chunked) + { + // Looks like it's not chunked after all + $this->state = 'emit'; + return; + } + + $length = hexdec(trim($matches[1])); + if ($length === 0) + { + // Ignore trailer headers + $this->state = 'emit'; + $this->body = $decoded; + return; + } + + $chunk_length = strlen($matches[0]); + $decoded .= $part = substr($encoded, $chunk_length, $length); + $encoded = substr($encoded, $chunk_length + $length + 2); + + if (trim($encoded) === '0' || empty($encoded)) + { + $this->state = 'emit'; + $this->body = $decoded; + return; + } + } + } +} diff --git a/wp-includes/SimplePie/IRI.php b/wp-includes/SimplePie/IRI.php new file mode 100644 index 0000000..d3198c0 --- /dev/null +++ b/wp-includes/SimplePie/IRI.php @@ -0,0 +1,1238 @@ + array( + 'port' => 674 + ), + 'dict' => array( + 'port' => 2628 + ), + 'file' => array( + 'ihost' => 'localhost' + ), + 'http' => array( + 'port' => 80, + 'ipath' => '/' + ), + 'https' => array( + 'port' => 443, + 'ipath' => '/' + ), + ); + + /** + * Return the entire IRI when you try and read the object as a string + * + * @return string + */ + public function __toString() + { + return $this->get_iri(); + } + + /** + * Overload __set() to provide access via properties + * + * @param string $name Property name + * @param mixed $value Property value + */ + public function __set($name, $value) + { + if (method_exists($this, 'set_' . $name)) + { + call_user_func(array($this, 'set_' . $name), $value); + } + elseif ( + $name === 'iauthority' + || $name === 'iuserinfo' + || $name === 'ihost' + || $name === 'ipath' + || $name === 'iquery' + || $name === 'ifragment' + ) + { + call_user_func(array($this, 'set_' . substr($name, 1)), $value); + } + } + + /** + * Overload __get() to provide access via properties + * + * @param string $name Property name + * @return mixed + */ + public function __get($name) + { + // isset() returns false for null, we don't want to do that + // Also why we use array_key_exists below instead of isset() + $props = get_object_vars($this); + + if ( + $name === 'iri' || + $name === 'uri' || + $name === 'iauthority' || + $name === 'authority' + ) + { + $return = $this->{"get_$name"}(); + } + elseif (array_key_exists($name, $props)) + { + $return = $this->$name; + } + // host -> ihost + elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) + { + $name = $prop; + $return = $this->$prop; + } + // ischeme -> scheme + elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) + { + $name = $prop; + $return = $this->$prop; + } + else + { + trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE); + $return = null; + } + + if ($return === null && isset($this->normalization[$this->scheme][$name])) + { + return $this->normalization[$this->scheme][$name]; + } + else + { + return $return; + } + } + + /** + * Overload __isset() to provide access via properties + * + * @param string $name Property name + * @return bool + */ + public function __isset($name) + { + if (method_exists($this, 'get_' . $name) || isset($this->$name)) + { + return true; + } + else + { + return false; + } + } + + /** + * Overload __unset() to provide access via properties + * + * @param string $name Property name + */ + public function __unset($name) + { + if (method_exists($this, 'set_' . $name)) + { + call_user_func(array($this, 'set_' . $name), ''); + } + } + + /** + * Create a new IRI object, from a specified string + * + * @param string $iri + */ + public function __construct($iri = null) + { + $this->set_iri($iri); + } + + /** + * Create a new IRI object by resolving a relative IRI + * + * Returns false if $base is not absolute, otherwise an IRI. + * + * @param IRI|string $base (Absolute) Base IRI + * @param IRI|string $relative Relative IRI + * @return IRI|false + */ + public static function absolutize($base, $relative) + { + if (!($relative instanceof SimplePie_IRI)) + { + $relative = new SimplePie_IRI($relative); + } + if (!$relative->is_valid()) + { + return false; + } + elseif ($relative->scheme !== null) + { + return clone $relative; + } + else + { + if (!($base instanceof SimplePie_IRI)) + { + $base = new SimplePie_IRI($base); + } + if ($base->scheme !== null && $base->is_valid()) + { + if ($relative->get_iri() !== '') + { + if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) + { + $target = clone $relative; + $target->scheme = $base->scheme; + } + else + { + $target = new SimplePie_IRI; + $target->scheme = $base->scheme; + $target->iuserinfo = $base->iuserinfo; + $target->ihost = $base->ihost; + $target->port = $base->port; + if ($relative->ipath !== '') + { + if ($relative->ipath[0] === '/') + { + $target->ipath = $relative->ipath; + } + elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') + { + $target->ipath = '/' . $relative->ipath; + } + elseif (($last_segment = strrpos($base->ipath, '/')) !== false) + { + $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath; + } + else + { + $target->ipath = $relative->ipath; + } + $target->ipath = $target->remove_dot_segments($target->ipath); + $target->iquery = $relative->iquery; + } + else + { + $target->ipath = $base->ipath; + if ($relative->iquery !== null) + { + $target->iquery = $relative->iquery; + } + elseif ($base->iquery !== null) + { + $target->iquery = $base->iquery; + } + } + $target->ifragment = $relative->ifragment; + } + } + else + { + $target = clone $base; + $target->ifragment = null; + } + $target->scheme_normalization(); + return $target; + } + else + { + return false; + } + } + } + + /** + * Parse an IRI into scheme/authority/path/query/fragment segments + * + * @param string $iri + * @return array + */ + protected function parse_iri($iri) + { + $iri = trim($iri, "\x20\x09\x0A\x0C\x0D"); + if (preg_match('/^((?P[^:\/?#]+):)?(\/\/(?P[^\/?#]*))?(?P[^?#]*)(\?(?P[^#]*))?(#(?P.*))?$/', $iri, $match)) + { + if ($match[1] === '') + { + $match['scheme'] = null; + } + if (!isset($match[3]) || $match[3] === '') + { + $match['authority'] = null; + } + if (!isset($match[5])) + { + $match['path'] = ''; + } + if (!isset($match[6]) || $match[6] === '') + { + $match['query'] = null; + } + if (!isset($match[8]) || $match[8] === '') + { + $match['fragment'] = null; + } + return $match; + } + else + { + // This can occur when a paragraph is accidentally parsed as a URI + return false; + } + } + + /** + * Remove dot segments from a path + * + * @param string $input + * @return string + */ + protected function remove_dot_segments($input) + { + $output = ''; + while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') + { + // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise, + if (strpos($input, '../') === 0) + { + $input = substr($input, 3); + } + elseif (strpos($input, './') === 0) + { + $input = substr($input, 2); + } + // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise, + elseif (strpos($input, '/./') === 0) + { + $input = substr($input, 2); + } + elseif ($input === '/.') + { + $input = '/'; + } + // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise, + elseif (strpos($input, '/../') === 0) + { + $input = substr($input, 3); + $output = substr_replace($output, '', strrpos($output, '/')); + } + elseif ($input === '/..') + { + $input = '/'; + $output = substr_replace($output, '', strrpos($output, '/')); + } + // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise, + elseif ($input === '.' || $input === '..') + { + $input = ''; + } + // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer + elseif (($pos = strpos($input, '/', 1)) !== false) + { + $output .= substr($input, 0, $pos); + $input = substr_replace($input, '', 0, $pos); + } + else + { + $output .= $input; + $input = ''; + } + } + return $output . $input; + } + + /** + * Replace invalid character with percent encoding + * + * @param string $string Input string + * @param string $extra_chars Valid characters not in iunreserved or + * iprivate (this is ASCII-only) + * @param bool $iprivate Allow iprivate + * @return string + */ + protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false) + { + // Normalize as many pct-encoded sections as possible + $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $string); + + // Replace invalid percent characters + $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string); + + // Add unreserved and % to $extra_chars (the latter is safe because all + // pct-encoded sections are now valid). + $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%'; + + // Now replace any bytes that aren't allowed with their pct-encoded versions + $position = 0; + $strlen = strlen($string); + while (($position += strspn($string, $extra_chars, $position)) < $strlen) + { + $value = ord($string[$position]); + + // Start position + $start = $position; + + // By default we are valid + $valid = true; + + // No one byte sequences are valid due to the while. + // Two byte sequence: + if (($value & 0xE0) === 0xC0) + { + $character = ($value & 0x1F) << 6; + $length = 2; + $remaining = 1; + } + // Three byte sequence: + elseif (($value & 0xF0) === 0xE0) + { + $character = ($value & 0x0F) << 12; + $length = 3; + $remaining = 2; + } + // Four byte sequence: + elseif (($value & 0xF8) === 0xF0) + { + $character = ($value & 0x07) << 18; + $length = 4; + $remaining = 3; + } + // Invalid byte: + else + { + $valid = false; + $length = 1; + $remaining = 0; + } + + if ($remaining) + { + if ($position + $length <= $strlen) + { + for ($position++; $remaining; $position++) + { + $value = ord($string[$position]); + + // Check that the byte is valid, then add it to the character: + if (($value & 0xC0) === 0x80) + { + $character |= ($value & 0x3F) << (--$remaining * 6); + } + // If it is invalid, count the sequence as invalid and reprocess the current byte: + else + { + $valid = false; + $position--; + break; + } + } + } + else + { + $position = $strlen - 1; + $valid = false; + } + } + + // Percent encode anything invalid or not in ucschar + if ( + // Invalid sequences + !$valid + // Non-shortest form sequences are invalid + || $length > 1 && $character <= 0x7F + || $length > 2 && $character <= 0x7FF + || $length > 3 && $character <= 0xFFFF + // Outside of range of ucschar codepoints + // Noncharacters + || ($character & 0xFFFE) === 0xFFFE + || $character >= 0xFDD0 && $character <= 0xFDEF + || ( + // Everything else not in ucschar + $character > 0xD7FF && $character < 0xF900 + || $character < 0xA0 + || $character > 0xEFFFD + ) + && ( + // Everything not in iprivate, if it applies + !$iprivate + || $character < 0xE000 + || $character > 0x10FFFD + ) + ) + { + // If we were a character, pretend we weren't, but rather an error. + if ($valid) + $position--; + + for ($j = $start; $j <= $position; $j++) + { + $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1); + $j += 2; + $position += 2; + $strlen += 2; + } + } + } + + return $string; + } + + /** + * Callback function for preg_replace_callback. + * + * Removes sequences of percent encoded bytes that represent UTF-8 + * encoded characters in iunreserved + * + * @param array $match PCRE match + * @return string Replacement + */ + protected function remove_iunreserved_percent_encoded($match) + { + // As we just have valid percent encoded sequences we can just explode + // and ignore the first member of the returned array (an empty string). + $bytes = explode('%', $match[0]); + + // Initialize the new string (this is what will be returned) and that + // there are no bytes remaining in the current sequence (unsurprising + // at the first byte!). + $string = ''; + $remaining = 0; + + // Loop over each and every byte, and set $value to its value + for ($i = 1, $len = count($bytes); $i < $len; $i++) + { + $value = hexdec($bytes[$i]); + + // If we're the first byte of sequence: + if (!$remaining) + { + // Start position + $start = $i; + + // By default we are valid + $valid = true; + + // One byte sequence: + if ($value <= 0x7F) + { + $character = $value; + $length = 1; + } + // Two byte sequence: + elseif (($value & 0xE0) === 0xC0) + { + $character = ($value & 0x1F) << 6; + $length = 2; + $remaining = 1; + } + // Three byte sequence: + elseif (($value & 0xF0) === 0xE0) + { + $character = ($value & 0x0F) << 12; + $length = 3; + $remaining = 2; + } + // Four byte sequence: + elseif (($value & 0xF8) === 0xF0) + { + $character = ($value & 0x07) << 18; + $length = 4; + $remaining = 3; + } + // Invalid byte: + else + { + $valid = false; + $remaining = 0; + } + } + // Continuation byte: + else + { + // Check that the byte is valid, then add it to the character: + if (($value & 0xC0) === 0x80) + { + $remaining--; + $character |= ($value & 0x3F) << ($remaining * 6); + } + // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence: + else + { + $valid = false; + $remaining = 0; + $i--; + } + } + + // If we've reached the end of the current byte sequence, append it to Unicode::$data + if (!$remaining) + { + // Percent encode anything invalid or not in iunreserved + if ( + // Invalid sequences + !$valid + // Non-shortest form sequences are invalid + || $length > 1 && $character <= 0x7F + || $length > 2 && $character <= 0x7FF + || $length > 3 && $character <= 0xFFFF + // Outside of range of iunreserved codepoints + || $character < 0x2D + || $character > 0xEFFFD + // Noncharacters + || ($character & 0xFFFE) === 0xFFFE + || $character >= 0xFDD0 && $character <= 0xFDEF + // Everything else not in iunreserved (this is all BMP) + || $character === 0x2F + || $character > 0x39 && $character < 0x41 + || $character > 0x5A && $character < 0x61 + || $character > 0x7A && $character < 0x7E + || $character > 0x7E && $character < 0xA0 + || $character > 0xD7FF && $character < 0xF900 + ) + { + for ($j = $start; $j <= $i; $j++) + { + $string .= '%' . strtoupper($bytes[$j]); + } + } + else + { + for ($j = $start; $j <= $i; $j++) + { + $string .= chr(hexdec($bytes[$j])); + } + } + } + } + + // If we have any bytes left over they are invalid (i.e., we are + // mid-way through a multi-byte sequence) + if ($remaining) + { + for ($j = $start; $j < $len; $j++) + { + $string .= '%' . strtoupper($bytes[$j]); + } + } + + return $string; + } + + protected function scheme_normalization() + { + if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) + { + $this->iuserinfo = null; + } + if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) + { + $this->ihost = null; + } + if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) + { + $this->port = null; + } + if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) + { + $this->ipath = ''; + } + if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) + { + $this->iquery = null; + } + if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) + { + $this->ifragment = null; + } + } + + /** + * Check if the object represents a valid IRI. This needs to be done on each + * call as some things change depending on another part of the IRI. + * + * @return bool + */ + public function is_valid() + { + $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null; + if ($this->ipath !== '' && + ( + $isauthority && ( + $this->ipath[0] !== '/' || + substr($this->ipath, 0, 2) === '//' + ) || + ( + $this->scheme === null && + !$isauthority && + strpos($this->ipath, ':') !== false && + (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/')) + ) + ) + ) + { + return false; + } + + return true; + } + + /** + * Set the entire IRI. Returns true on success, false on failure (if there + * are any invalid characters). + * + * @param string $iri + * @return bool + */ + public function set_iri($iri) + { + static $cache; + if (!$cache) + { + $cache = array(); + } + + if ($iri === null) + { + return true; + } + elseif (isset($cache[$iri])) + { + list($this->scheme, + $this->iuserinfo, + $this->ihost, + $this->port, + $this->ipath, + $this->iquery, + $this->ifragment, + $return) = $cache[$iri]; + return $return; + } + else + { + $parsed = $this->parse_iri((string) $iri); + if (!$parsed) + { + return false; + } + + $return = $this->set_scheme($parsed['scheme']) + && $this->set_authority($parsed['authority']) + && $this->set_path($parsed['path']) + && $this->set_query($parsed['query']) + && $this->set_fragment($parsed['fragment']); + + $cache[$iri] = array($this->scheme, + $this->iuserinfo, + $this->ihost, + $this->port, + $this->ipath, + $this->iquery, + $this->ifragment, + $return); + return $return; + } + } + + /** + * Set the scheme. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $scheme + * @return bool + */ + public function set_scheme($scheme) + { + if ($scheme === null) + { + $this->scheme = null; + } + elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) + { + $this->scheme = null; + return false; + } + else + { + $this->scheme = strtolower($scheme); + } + return true; + } + + /** + * Set the authority. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $authority + * @return bool + */ + public function set_authority($authority) + { + static $cache; + if (!$cache) + $cache = array(); + + if ($authority === null) + { + $this->iuserinfo = null; + $this->ihost = null; + $this->port = null; + return true; + } + elseif (isset($cache[$authority])) + { + list($this->iuserinfo, + $this->ihost, + $this->port, + $return) = $cache[$authority]; + + return $return; + } + else + { + $remaining = $authority; + if (($iuserinfo_end = strrpos($remaining, '@')) !== false) + { + $iuserinfo = substr($remaining, 0, $iuserinfo_end); + $remaining = substr($remaining, $iuserinfo_end + 1); + } + else + { + $iuserinfo = null; + } + if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) + { + if (($port = substr($remaining, $port_start + 1)) === false) + { + $port = null; + } + $remaining = substr($remaining, 0, $port_start); + } + else + { + $port = null; + } + + $return = $this->set_userinfo($iuserinfo) && + $this->set_host($remaining) && + $this->set_port($port); + + $cache[$authority] = array($this->iuserinfo, + $this->ihost, + $this->port, + $return); + + return $return; + } + } + + /** + * Set the iuserinfo. + * + * @param string $iuserinfo + * @return bool + */ + public function set_userinfo($iuserinfo) + { + if ($iuserinfo === null) + { + $this->iuserinfo = null; + } + else + { + $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:'); + $this->scheme_normalization(); + } + + return true; + } + + /** + * Set the ihost. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $ihost + * @return bool + */ + public function set_host($ihost) + { + if ($ihost === null) + { + $this->ihost = null; + return true; + } + elseif (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') + { + if (SimplePie_Net_IPv6::check_ipv6(substr($ihost, 1, -1))) + { + $this->ihost = '[' . SimplePie_Net_IPv6::compress(substr($ihost, 1, -1)) . ']'; + } + else + { + $this->ihost = null; + return false; + } + } + else + { + $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;='); + + // Lowercase, but ignore pct-encoded sections (as they should + // remain uppercase). This must be done after the previous step + // as that can add unescaped characters. + $position = 0; + $strlen = strlen($ihost); + while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) + { + if ($ihost[$position] === '%') + { + $position += 3; + } + else + { + $ihost[$position] = strtolower($ihost[$position]); + $position++; + } + } + + $this->ihost = $ihost; + } + + $this->scheme_normalization(); + + return true; + } + + /** + * Set the port. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @param string $port + * @return bool + */ + public function set_port($port) + { + if ($port === null) + { + $this->port = null; + return true; + } + elseif (strspn($port, '0123456789') === strlen($port)) + { + $this->port = (int) $port; + $this->scheme_normalization(); + return true; + } + else + { + $this->port = null; + return false; + } + } + + /** + * Set the ipath. + * + * @param string $ipath + * @return bool + */ + public function set_path($ipath) + { + static $cache; + if (!$cache) + { + $cache = array(); + } + + $ipath = (string) $ipath; + + if (isset($cache[$ipath])) + { + $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)]; + } + else + { + $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/'); + $removed = $this->remove_dot_segments($valid); + + $cache[$ipath] = array($valid, $removed); + $this->ipath = ($this->scheme !== null) ? $removed : $valid; + } + + $this->scheme_normalization(); + return true; + } + + /** + * Set the iquery. + * + * @param string $iquery + * @return bool + */ + public function set_query($iquery) + { + if ($iquery === null) + { + $this->iquery = null; + } + else + { + $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true); + $this->scheme_normalization(); + } + return true; + } + + /** + * Set the ifragment. + * + * @param string $ifragment + * @return bool + */ + public function set_fragment($ifragment) + { + if ($ifragment === null) + { + $this->ifragment = null; + } + else + { + $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?'); + $this->scheme_normalization(); + } + return true; + } + + /** + * Convert an IRI to a URI (or parts thereof) + * + * @return string + */ + public function to_uri($string) + { + static $non_ascii; + if (!$non_ascii) + { + $non_ascii = implode('', range("\x80", "\xFF")); + } + + $position = 0; + $strlen = strlen($string); + while (($position += strcspn($string, $non_ascii, $position)) < $strlen) + { + $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1); + $position += 3; + $strlen += 2; + } + + return $string; + } + + /** + * Get the complete IRI + * + * @return string + */ + public function get_iri() + { + if (!$this->is_valid()) + { + return false; + } + + $iri = ''; + if ($this->scheme !== null) + { + $iri .= $this->scheme . ':'; + } + if (($iauthority = $this->get_iauthority()) !== null) + { + $iri .= '//' . $iauthority; + } + if ($this->ipath !== '') + { + $iri .= $this->ipath; + } + elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '') + { + $iri .= $this->normalization[$this->scheme]['ipath']; + } + if ($this->iquery !== null) + { + $iri .= '?' . $this->iquery; + } + if ($this->ifragment !== null) + { + $iri .= '#' . $this->ifragment; + } + + return $iri; + } + + /** + * Get the complete URI + * + * @return string + */ + public function get_uri() + { + return $this->to_uri($this->get_iri()); + } + + /** + * Get the complete iauthority + * + * @return string + */ + protected function get_iauthority() + { + if ($this->iuserinfo !== null || $this->ihost !== null || $this->port !== null) + { + $iauthority = ''; + if ($this->iuserinfo !== null) + { + $iauthority .= $this->iuserinfo . '@'; + } + if ($this->ihost !== null) + { + $iauthority .= $this->ihost; + } + if ($this->port !== null) + { + $iauthority .= ':' . $this->port; + } + return $iauthority; + } + else + { + return null; + } + } + + /** + * Get the complete authority + * + * @return string + */ + protected function get_authority() + { + $iauthority = $this->get_iauthority(); + if (is_string($iauthority)) + return $this->to_uri($iauthority); + else + return $iauthority; + } +} diff --git a/wp-includes/SimplePie/Item.php b/wp-includes/SimplePie/Item.php new file mode 100644 index 0000000..a77574b --- /dev/null +++ b/wp-includes/SimplePie/Item.php @@ -0,0 +1,2964 @@ +feed = $feed; + $this->data = $data; + } + + /** + * Set the registry handler + * + * This is usually used by {@see SimplePie_Registry::create} + * + * @since 1.3 + * @param SimplePie_Registry $registry + */ + public function set_registry(SimplePie_Registry $registry) + { + $this->registry = $registry; + } + + /** + * Get a string representation of the item + * + * @return string + */ + public function __toString() + { + return md5(serialize($this->data)); + } + + /** + * Remove items that link back to this before destroying this object + */ + public function __destruct() + { + if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) + { + unset($this->feed); + } + } + + /** + * Get data for an item-level element + * + * This method allows you to get access to ANY element/attribute that is a + * sub-element of the item/entry tag. + * + * See {@see SimplePie::get_feed_tags()} for a description of the return value + * + * @since 1.0 + * @see http://simplepie.org/wiki/faq/supported_xml_namespaces + * @param string $namespace The URL of the XML namespace of the elements you're trying to access + * @param string $tag Tag name + * @return array + */ + public function get_item_tags($namespace, $tag) + { + if (isset($this->data['child'][$namespace][$tag])) + { + return $this->data['child'][$namespace][$tag]; + } + else + { + return null; + } + } + + /** + * Get the base URL value from the parent feed + * + * Uses `` + * + * @param array $element + * @return string + */ + public function get_base($element = array()) + { + return $this->feed->get_base($element); + } + + /** + * Sanitize feed data + * + * @access private + * @see SimplePie::sanitize() + * @param string $data Data to sanitize + * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants + * @param string $base Base URL to resolve URLs against + * @return string Sanitized data + */ + public function sanitize($data, $type, $base = '') + { + return $this->feed->sanitize($data, $type, $base); + } + + /** + * Get the parent feed + * + * Note: this may not work as you think for multifeeds! + * + * @link http://simplepie.org/faq/typical_multifeed_gotchas#missing_data_from_feed + * @since 1.0 + * @return SimplePie + */ + public function get_feed() + { + return $this->feed; + } + + /** + * Get the unique identifier for the item + * + * This is usually used when writing code to check for new items in a feed. + * + * Uses ``, ``, `` or the `about` attribute + * for RDF. If none of these are supplied (or `$hash` is true), creates an + * MD5 hash based on the permalink and title. If either of those are not + * supplied, creates a hash based on the full feed data. + * + * @since Beta 2 + * @param boolean $hash Should we force using a hash instead of the supplied ID? + * @return string + */ + public function get_id($hash = false) + { + if (!$hash) + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (isset($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'])) + { + return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (($return = $this->get_permalink()) !== null) + { + return $return; + } + elseif (($return = $this->get_title()) !== null) + { + return $return; + } + } + if ($this->get_permalink() !== null || $this->get_title() !== null) + { + return md5($this->get_permalink() . $this->get_title()); + } + else + { + return md5(serialize($this->data)); + } + } + + /** + * Get the title of the item + * + * Uses ``, `` or `<dc:title>` + * + * @since Beta 2 (previously called `get_item_title` since 0.8) + * @return string|null + */ + public function get_title() + { + if (!isset($this->data['title'])) + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) + { + $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $this->data['title'] = null; + } + } + return $this->data['title']; + } + + /** + * Get the content for the item + * + * Prefers summaries over full content , but will return full content if a + * summary does not exist. + * + * To prefer full content instead, use {@see get_content} + * + * Uses `<atom:summary>`, `<description>`, `<dc:description>` or + * `<itunes:subtitle>` + * + * @since 0.8 + * @param boolean $description_only Should we avoid falling back to the content? + * @return string|null + */ + public function get_description($description_only = false) + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML); + } + + elseif (!$description_only) + { + return $this->get_content(true); + } + else + { + return null; + } + } + + /** + * Get the content for the item + * + * Prefers full content over summaries, but will return a summary if full + * content does not exist. + * + * To prefer summaries instead, use {@see get_description} + * + * Uses `<atom:content>` or `<content:encoded>` (RSS 1.0 Content Module) + * + * @since 1.0 + * @param boolean $content_only Should we avoid falling back to the description? + * @return string|null + */ + public function get_content($content_only = false) + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + elseif (!$content_only) + { + return $this->get_description(true); + } + else + { + return null; + } + } + + /** + * Get a category for the item + * + * @since Beta 3 (previously called `get_categories()` since Beta 2) + * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1 + * @return SimplePie_Category|null + */ + public function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + /** + * Get all categories for the item + * + * Uses `<atom:category>`, `<category>` or `<dc:subject>` + * + * @since Beta 3 + * @return array|null List of {@see SimplePie_Category} objects + */ + public function get_categories() + { + $categories = array(); + + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['attribs']['']['term'])) + { + $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) + { + // This is really the label, but keep this as the term also for BC. + // Label will also work on retrieving because that falls back to term. + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + if (isset($category['attribs']['']['domain'])) + { + $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = null; + } + $categories[] = $this->registry->create('Category', array($term, $scheme, null)); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) + { + $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) + { + $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + + if (!empty($categories)) + { + return array_unique($categories); + } + else + { + return null; + } + } + + /** + * Get an author for the item + * + * @since Beta 2 + * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1 + * @return SimplePie_Author|null + */ + public function get_author($key = 0) + { + $authors = $this->get_authors(); + if (isset($authors[$key])) + { + return $authors[$key]; + } + else + { + return null; + } + } + + /** + * Get a contributor for the item + * + * @since 1.1 + * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1 + * @return SimplePie_Author|null + */ + public function get_contributor($key = 0) + { + $contributors = $this->get_contributors(); + if (isset($contributors[$key])) + { + return $contributors[$key]; + } + else + { + return null; + } + } + + /** + * Get all contributors for the item + * + * Uses `<atom:contributor>` + * + * @since 1.1 + * @return array|null List of {@see SimplePie_Author} objects + */ + public function get_contributors() + { + $contributors = array(); + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) + { + $name = null; + $uri = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $contributors[] = $this->registry->create('Author', array($name, $uri, $email)); + } + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) + { + $name = null; + $url = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $contributors[] = $this->registry->create('Author', array($name, $url, $email)); + } + } + + if (!empty($contributors)) + { + return array_unique($contributors); + } + else + { + return null; + } + } + + /** + * Get all authors for the item + * + * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>` + * + * @since Beta 2 + * @return array|null List of {@see SimplePie_Author} objects + */ + public function get_authors() + { + $authors = array(); + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) + { + $name = null; + $uri = null; + $email = null; + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $authors[] = $this->registry->create('Author', array($name, $uri, $email)); + } + } + if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) + { + $name = null; + $url = null; + $email = null; + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $authors[] = $this->registry->create('Author', array($name, $url, $email)); + } + } + if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author')) + { + $authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT))); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) + { + $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) + { + $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) + { + $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + + if (!empty($authors)) + { + return array_unique($authors); + } + elseif (($source = $this->get_source()) && ($authors = $source->get_authors())) + { + return $authors; + } + elseif ($authors = $this->feed->get_authors()) + { + return $authors; + } + else + { + return null; + } + } + + /** + * Get the copyright info for the item + * + * Uses `<atom:rights>` or `<dc:rights>` + * + * @since 1.1 + * @return string + */ + public function get_copyright() + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + /** + * Get the posting date/time for the item + * + * Uses `<atom:published>`, `<atom:updated>`, `<atom:issued>`, + * `<atom:modified>`, `<pubDate>` or `<dc:date>` + * + * Note: obeys PHP's timezone setting. To get a UTC date/time, use + * {@see get_gmdate} + * + * @since Beta 2 (previously called `get_item_date` since 0.8) + * + * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data) + * @return int|string|null + */ + public function get_date($date_format = 'j F Y, g:i a') + { + if (!isset($this->data['date'])) + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published')) + { + $this->data['date']['raw'] = $return[0]['data']; + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) + { + $this->data['date']['raw'] = $return[0]['data']; + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued')) + { + $this->data['date']['raw'] = $return[0]['data']; + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created')) + { + $this->data['date']['raw'] = $return[0]['data']; + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified')) + { + $this->data['date']['raw'] = $return[0]['data']; + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate')) + { + $this->data['date']['raw'] = $return[0]['data']; + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date')) + { + $this->data['date']['raw'] = $return[0]['data']; + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date')) + { + $this->data['date']['raw'] = $return[0]['data']; + } + + if (!empty($this->data['date']['raw'])) + { + $parser = $this->registry->call('Parse_Date', 'get'); + $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']); + } + else + { + $this->data['date'] = null; + } + } + if ($this->data['date']) + { + $date_format = (string) $date_format; + switch ($date_format) + { + case '': + return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT); + + case 'U': + return $this->data['date']['parsed']; + + default: + return date($date_format, $this->data['date']['parsed']); + } + } + else + { + return null; + } + } + + /** + * Get the update date/time for the item + * + * Uses `<atom:updated>` + * + * Note: obeys PHP's timezone setting. To get a UTC date/time, use + * {@see get_gmdate} + * + * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data) + * @return int|string|null + */ + public function get_updated_date($date_format = 'j F Y, g:i a') + { + if (!isset($this->data['updated'])) + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) + { + $this->data['updated']['raw'] = $return[0]['data']; + } + + if (!empty($this->data['updated']['raw'])) + { + $parser = $this->registry->call('Parse_Date', 'get'); + $this->data['updated']['parsed'] = $parser->parse($this->data['date']['raw']); + } + else + { + $this->data['updated'] = null; + } + } + if ($this->data['updated']) + { + $date_format = (string) $date_format; + switch ($date_format) + { + case '': + return $this->sanitize($this->data['updated']['raw'], SIMPLEPIE_CONSTRUCT_TEXT); + + case 'U': + return $this->data['updated']['parsed']; + + default: + return date($date_format, $this->data['updated']['parsed']); + } + } + else + { + return null; + } + } + + /** + * Get the localized posting date/time for the item + * + * Returns the date formatted in the localized language. To display in + * languages other than the server's default, you need to change the locale + * with {@link http://php.net/setlocale setlocale()}. The available + * localizations depend on which ones are installed on your web server. + * + * @since 1.0 + * + * @param string $date_format Supports any PHP date format from {@see http://php.net/strftime} (empty for the raw data) + * @return int|string|null + */ + public function get_local_date($date_format = '%c') + { + if (!$date_format) + { + return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (($date = $this->get_date('U')) !== null && $date !== false) + { + return strftime($date_format, $date); + } + else + { + return null; + } + } + + /** + * Get the posting date/time for the item (UTC time) + * + * @see get_date + * @param string $date_format Supports any PHP date format from {@see http://php.net/date} + * @return int|string|null + */ + public function get_gmdate($date_format = 'j F Y, g:i a') + { + $date = $this->get_date('U'); + if ($date === null) + { + return null; + } + + return gmdate($date_format, $date); + } + + /** + * Get the update date/time for the item (UTC time) + * + * @see get_updated_date + * @param string $date_format Supports any PHP date format from {@see http://php.net/date} + * @return int|string|null + */ + public function get_updated_gmdate($date_format = 'j F Y, g:i a') + { + $date = $this->get_updated_date('U'); + if ($date === null) + { + return null; + } + + return gmdate($date_format, $date); + } + + /** + * Get the permalink for the item + * + * Returns the first link available with a relationship of "alternate". + * Identical to {@see get_link()} with key 0 + * + * @see get_link + * @since 0.8 + * @return string|null Permalink URL + */ + public function get_permalink() + { + $link = $this->get_link(); + $enclosure = $this->get_enclosure(0); + if ($link !== null) + { + return $link; + } + elseif ($enclosure !== null) + { + return $enclosure->get_link(); + } + else + { + return null; + } + } + + /** + * Get a single link for the item + * + * @since Beta 3 + * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1 + * @param string $rel The relationship of the link to return + * @return string|null Link URL + */ + public function get_link($key = 0, $rel = 'alternate') + { + $links = $this->get_links($rel); + if ($links[$key] !== null) + { + return $links[$key]; + } + else + { + return null; + } + } + + /** + * Get all links for the item + * + * Uses `<atom:link>`, `<link>` or `<guid>` + * + * @since Beta 2 + * @param string $rel The relationship of links to return + * @return array|null Links found for the item (strings) + */ + public function get_links($rel = 'alternate') + { + if (!isset($this->data['links'])) + { + $this->data['links'] = array(); + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) + { + if (isset($link['attribs']['']['href'])) + { + $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; + $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + + } + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) + { + if (isset($link['attribs']['']['href'])) + { + $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; + $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + } + } + if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) + { + if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true') + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + } + + $keys = array_keys($this->data['links']); + foreach ($keys as $key) + { + if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key))) + { + if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) + { + $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); + $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; + } + else + { + $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; + } + } + elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) + { + $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; + } + $this->data['links'][$key] = array_unique($this->data['links'][$key]); + } + } + if (isset($this->data['links'][$rel])) + { + return $this->data['links'][$rel]; + } + else + { + return null; + } + } + + /** + * Get an enclosure from the item + * + * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. + * + * @since Beta 2 + * @todo Add ability to prefer one type of content over another (in a media group). + * @param int $key The enclosure that you want to return. Remember that arrays begin with 0, not 1 + * @return SimplePie_Enclosure|null + */ + public function get_enclosure($key = 0, $prefer = null) + { + $enclosures = $this->get_enclosures(); + if (isset($enclosures[$key])) + { + return $enclosures[$key]; + } + else + { + return null; + } + } + + /** + * Get all available enclosures (podcasts, etc.) + * + * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. + * + * At this point, we're pretty much assuming that all enclosures for an item + * are the same content. Anything else is too complicated to + * properly support. + * + * @since Beta 2 + * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4). + * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists). + * @return array|null List of SimplePie_Enclosure items + */ + public function get_enclosures() + { + if (!isset($this->data['enclosures'])) + { + $this->data['enclosures'] = array(); + + // Elements + $captions_parent = null; + $categories_parent = null; + $copyrights_parent = null; + $credits_parent = null; + $description_parent = null; + $duration_parent = null; + $hashes_parent = null; + $keywords_parent = null; + $player_parent = null; + $ratings_parent = null; + $restrictions_parent = null; + $thumbnails_parent = null; + $title_parent = null; + + // Let's do the channel and item-level ones first, and just re-use them if we need to. + $parent = $this->get_feed(); + + // CAPTIONS + if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) + { + foreach ($captions as $caption) + { + $caption_type = null; + $caption_lang = null; + $caption_startTime = null; + $caption_endTime = null; + $caption_text = null; + if (isset($caption['attribs']['']['type'])) + { + $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['lang'])) + { + $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['start'])) + { + $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['end'])) + { + $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['data'])) + { + $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); + } + } + elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) + { + foreach ($captions as $caption) + { + $caption_type = null; + $caption_lang = null; + $caption_startTime = null; + $caption_endTime = null; + $caption_text = null; + if (isset($caption['attribs']['']['type'])) + { + $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['lang'])) + { + $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['start'])) + { + $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['end'])) + { + $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['data'])) + { + $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); + } + } + if (is_array($captions_parent)) + { + $captions_parent = array_values(array_unique($captions_parent)); + } + + // CATEGORIES + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['data'])) + { + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = 'http://search.yahoo.com/mrss/category_schema'; + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); + } + foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['data'])) + { + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = 'http://search.yahoo.com/mrss/category_schema'; + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); + } + foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category) + { + $term = null; + $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd'; + $label = null; + if (isset($category['attribs']['']['text'])) + { + $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); + + if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'])) + { + foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory) + { + if (isset($subcategory['attribs']['']['text'])) + { + $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); + } + } + } + if (is_array($categories_parent)) + { + $categories_parent = array_values(array_unique($categories_parent)); + } + + // COPYRIGHT + if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) + { + $copyright_url = null; + $copyright_label = null; + if (isset($copyright[0]['attribs']['']['url'])) + { + $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($copyright[0]['data'])) + { + $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); + } + elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) + { + $copyright_url = null; + $copyright_label = null; + if (isset($copyright[0]['attribs']['']['url'])) + { + $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($copyright[0]['data'])) + { + $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); + } + + // CREDITS + if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) + { + foreach ($credits as $credit) + { + $credit_role = null; + $credit_scheme = null; + $credit_name = null; + if (isset($credit['attribs']['']['role'])) + { + $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($credit['attribs']['']['scheme'])) + { + $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $credit_scheme = 'urn:ebu'; + } + if (isset($credit['data'])) + { + $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); + } + } + elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) + { + foreach ($credits as $credit) + { + $credit_role = null; + $credit_scheme = null; + $credit_name = null; + if (isset($credit['attribs']['']['role'])) + { + $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($credit['attribs']['']['scheme'])) + { + $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $credit_scheme = 'urn:ebu'; + } + if (isset($credit['data'])) + { + $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); + } + } + if (is_array($credits_parent)) + { + $credits_parent = array_values(array_unique($credits_parent)); + } + + // DESCRIPTION + if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) + { + if (isset($description_parent[0]['data'])) + { + $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + } + elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) + { + if (isset($description_parent[0]['data'])) + { + $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + } + + // DURATION + if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration')) + { + $seconds = null; + $minutes = null; + $hours = null; + if (isset($duration_parent[0]['data'])) + { + $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + if (sizeof($temp) > 0) + { + $seconds = (int) array_pop($temp); + } + if (sizeof($temp) > 0) + { + $minutes = (int) array_pop($temp); + $seconds += $minutes * 60; + } + if (sizeof($temp) > 0) + { + $hours = (int) array_pop($temp); + $seconds += $hours * 3600; + } + unset($temp); + $duration_parent = $seconds; + } + } + + // HASHES + if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) + { + foreach ($hashes_iterator as $hash) + { + $value = null; + $algo = null; + if (isset($hash['data'])) + { + $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($hash['attribs']['']['algo'])) + { + $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $algo = 'md5'; + } + $hashes_parent[] = $algo.':'.$value; + } + } + elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) + { + foreach ($hashes_iterator as $hash) + { + $value = null; + $algo = null; + if (isset($hash['data'])) + { + $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($hash['attribs']['']['algo'])) + { + $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $algo = 'md5'; + } + $hashes_parent[] = $algo.':'.$value; + } + } + if (is_array($hashes_parent)) + { + $hashes_parent = array_values(array_unique($hashes_parent)); + } + + // KEYWORDS + if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) + { + if (isset($keywords[0]['data'])) + { + $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + foreach ($temp as $word) + { + $keywords_parent[] = trim($word); + } + } + unset($temp); + } + elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) + { + if (isset($keywords[0]['data'])) + { + $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + foreach ($temp as $word) + { + $keywords_parent[] = trim($word); + } + } + unset($temp); + } + elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) + { + if (isset($keywords[0]['data'])) + { + $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + foreach ($temp as $word) + { + $keywords_parent[] = trim($word); + } + } + unset($temp); + } + elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) + { + if (isset($keywords[0]['data'])) + { + $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + foreach ($temp as $word) + { + $keywords_parent[] = trim($word); + } + } + unset($temp); + } + if (is_array($keywords_parent)) + { + $keywords_parent = array_values(array_unique($keywords_parent)); + } + + // PLAYER + if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) + { + if (isset($player_parent[0]['attribs']['']['url'])) + { + $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + } + elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) + { + if (isset($player_parent[0]['attribs']['']['url'])) + { + $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + } + + // RATINGS + if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) + { + foreach ($ratings as $rating) + { + $rating_scheme = null; + $rating_value = null; + if (isset($rating['attribs']['']['scheme'])) + { + $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $rating_scheme = 'urn:simple'; + } + if (isset($rating['data'])) + { + $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); + } + } + elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) + { + foreach ($ratings as $rating) + { + $rating_scheme = 'urn:itunes'; + $rating_value = null; + if (isset($rating['data'])) + { + $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); + } + } + elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) + { + foreach ($ratings as $rating) + { + $rating_scheme = null; + $rating_value = null; + if (isset($rating['attribs']['']['scheme'])) + { + $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $rating_scheme = 'urn:simple'; + } + if (isset($rating['data'])) + { + $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); + } + } + elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) + { + foreach ($ratings as $rating) + { + $rating_scheme = 'urn:itunes'; + $rating_value = null; + if (isset($rating['data'])) + { + $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); + } + } + if (is_array($ratings_parent)) + { + $ratings_parent = array_values(array_unique($ratings_parent)); + } + + // RESTRICTIONS + if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) + { + foreach ($restrictions as $restriction) + { + $restriction_relationship = null; + $restriction_type = null; + $restriction_value = null; + if (isset($restriction['attribs']['']['relationship'])) + { + $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['attribs']['']['type'])) + { + $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['data'])) + { + $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); + } + } + elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) + { + foreach ($restrictions as $restriction) + { + $restriction_relationship = 'allow'; + $restriction_type = null; + $restriction_value = 'itunes'; + if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') + { + $restriction_relationship = 'deny'; + } + $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); + } + } + elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) + { + foreach ($restrictions as $restriction) + { + $restriction_relationship = null; + $restriction_type = null; + $restriction_value = null; + if (isset($restriction['attribs']['']['relationship'])) + { + $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['attribs']['']['type'])) + { + $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['data'])) + { + $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); + } + } + elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) + { + foreach ($restrictions as $restriction) + { + $restriction_relationship = 'allow'; + $restriction_type = null; + $restriction_value = 'itunes'; + if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') + { + $restriction_relationship = 'deny'; + } + $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); + } + } + if (is_array($restrictions_parent)) + { + $restrictions_parent = array_values(array_unique($restrictions_parent)); + } + else + { + $restrictions_parent = array(new SimplePie_Restriction('allow', null, 'default')); + } + + // THUMBNAILS + if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) + { + foreach ($thumbnails as $thumbnail) + { + if (isset($thumbnail['attribs']['']['url'])) + { + $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + } + } + elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) + { + foreach ($thumbnails as $thumbnail) + { + if (isset($thumbnail['attribs']['']['url'])) + { + $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + } + } + + // TITLES + if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) + { + if (isset($title_parent[0]['data'])) + { + $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + } + elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) + { + if (isset($title_parent[0]['data'])) + { + $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + } + + // Clear the memory + unset($parent); + + // Attributes + $bitrate = null; + $channels = null; + $duration = null; + $expression = null; + $framerate = null; + $height = null; + $javascript = null; + $lang = null; + $length = null; + $medium = null; + $samplingrate = null; + $type = null; + $url = null; + $width = null; + + // Elements + $captions = null; + $categories = null; + $copyrights = null; + $credits = null; + $description = null; + $hashes = null; + $keywords = null; + $player = null; + $ratings = null; + $restrictions = null; + $thumbnails = null; + $title = null; + + // If we have media:group tags, loop through them. + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group) + { + if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) + { + // If we have media:content tags, loop through them. + foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) + { + if (isset($content['attribs']['']['url'])) + { + // Attributes + $bitrate = null; + $channels = null; + $duration = null; + $expression = null; + $framerate = null; + $height = null; + $javascript = null; + $lang = null; + $length = null; + $medium = null; + $samplingrate = null; + $type = null; + $url = null; + $width = null; + + // Elements + $captions = null; + $categories = null; + $copyrights = null; + $credits = null; + $description = null; + $hashes = null; + $keywords = null; + $player = null; + $ratings = null; + $restrictions = null; + $thumbnails = null; + $title = null; + + // Start checking the attributes of media:content + if (isset($content['attribs']['']['bitrate'])) + { + $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['channels'])) + { + $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['duration'])) + { + $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $duration = $duration_parent; + } + if (isset($content['attribs']['']['expression'])) + { + $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['framerate'])) + { + $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['height'])) + { + $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['lang'])) + { + $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['fileSize'])) + { + $length = ceil($content['attribs']['']['fileSize']); + } + if (isset($content['attribs']['']['medium'])) + { + $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['samplingrate'])) + { + $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['type'])) + { + $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['width'])) + { + $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + + // Checking the other optional media: elements. Priority: media:content, media:group, item, channel + + // CAPTIONS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) + { + $caption_type = null; + $caption_lang = null; + $caption_startTime = null; + $caption_endTime = null; + $caption_text = null; + if (isset($caption['attribs']['']['type'])) + { + $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['lang'])) + { + $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['start'])) + { + $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['end'])) + { + $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['data'])) + { + $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); + } + if (is_array($captions)) + { + $captions = array_values(array_unique($captions)); + } + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) + { + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) + { + $caption_type = null; + $caption_lang = null; + $caption_startTime = null; + $caption_endTime = null; + $caption_text = null; + if (isset($caption['attribs']['']['type'])) + { + $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['lang'])) + { + $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['start'])) + { + $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['end'])) + { + $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['data'])) + { + $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); + } + if (is_array($captions)) + { + $captions = array_values(array_unique($captions)); + } + } + else + { + $captions = $captions_parent; + } + + // CATEGORIES + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) + { + foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['data'])) + { + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = 'http://search.yahoo.com/mrss/category_schema'; + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); + } + } + if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) + { + foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['data'])) + { + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = 'http://search.yahoo.com/mrss/category_schema'; + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); + } + } + if (is_array($categories) && is_array($categories_parent)) + { + $categories = array_values(array_unique(array_merge($categories, $categories_parent))); + } + elseif (is_array($categories)) + { + $categories = array_values(array_unique($categories)); + } + elseif (is_array($categories_parent)) + { + $categories = array_values(array_unique($categories_parent)); + } + + // COPYRIGHTS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) + { + $copyright_url = null; + $copyright_label = null; + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) + { + $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) + { + $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) + { + $copyright_url = null; + $copyright_label = null; + if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) + { + $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) + { + $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); + } + else + { + $copyrights = $copyrights_parent; + } + + // CREDITS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) + { + $credit_role = null; + $credit_scheme = null; + $credit_name = null; + if (isset($credit['attribs']['']['role'])) + { + $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($credit['attribs']['']['scheme'])) + { + $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $credit_scheme = 'urn:ebu'; + } + if (isset($credit['data'])) + { + $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); + } + if (is_array($credits)) + { + $credits = array_values(array_unique($credits)); + } + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) + { + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) + { + $credit_role = null; + $credit_scheme = null; + $credit_name = null; + if (isset($credit['attribs']['']['role'])) + { + $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($credit['attribs']['']['scheme'])) + { + $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $credit_scheme = 'urn:ebu'; + } + if (isset($credit['data'])) + { + $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); + } + if (is_array($credits)) + { + $credits = array_values(array_unique($credits)); + } + } + else + { + $credits = $credits_parent; + } + + // DESCRIPTION + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) + { + $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) + { + $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $description = $description_parent; + } + + // HASHES + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) + { + $value = null; + $algo = null; + if (isset($hash['data'])) + { + $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($hash['attribs']['']['algo'])) + { + $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $algo = 'md5'; + } + $hashes[] = $algo.':'.$value; + } + if (is_array($hashes)) + { + $hashes = array_values(array_unique($hashes)); + } + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) + { + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) + { + $value = null; + $algo = null; + if (isset($hash['data'])) + { + $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($hash['attribs']['']['algo'])) + { + $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $algo = 'md5'; + } + $hashes[] = $algo.':'.$value; + } + if (is_array($hashes)) + { + $hashes = array_values(array_unique($hashes)); + } + } + else + { + $hashes = $hashes_parent; + } + + // KEYWORDS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) + { + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) + { + $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + foreach ($temp as $word) + { + $keywords[] = trim($word); + } + unset($temp); + } + if (is_array($keywords)) + { + $keywords = array_values(array_unique($keywords)); + } + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) + { + if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) + { + $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + foreach ($temp as $word) + { + $keywords[] = trim($word); + } + unset($temp); + } + if (is_array($keywords)) + { + $keywords = array_values(array_unique($keywords)); + } + } + else + { + $keywords = $keywords_parent; + } + + // PLAYER + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) + { + $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) + { + $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + $player = $player_parent; + } + + // RATINGS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) + { + $rating_scheme = null; + $rating_value = null; + if (isset($rating['attribs']['']['scheme'])) + { + $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $rating_scheme = 'urn:simple'; + } + if (isset($rating['data'])) + { + $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); + } + if (is_array($ratings)) + { + $ratings = array_values(array_unique($ratings)); + } + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) + { + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) + { + $rating_scheme = null; + $rating_value = null; + if (isset($rating['attribs']['']['scheme'])) + { + $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $rating_scheme = 'urn:simple'; + } + if (isset($rating['data'])) + { + $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); + } + if (is_array($ratings)) + { + $ratings = array_values(array_unique($ratings)); + } + } + else + { + $ratings = $ratings_parent; + } + + // RESTRICTIONS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) + { + $restriction_relationship = null; + $restriction_type = null; + $restriction_value = null; + if (isset($restriction['attribs']['']['relationship'])) + { + $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['attribs']['']['type'])) + { + $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['data'])) + { + $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); + } + if (is_array($restrictions)) + { + $restrictions = array_values(array_unique($restrictions)); + } + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) + { + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) + { + $restriction_relationship = null; + $restriction_type = null; + $restriction_value = null; + if (isset($restriction['attribs']['']['relationship'])) + { + $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['attribs']['']['type'])) + { + $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['data'])) + { + $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); + } + if (is_array($restrictions)) + { + $restrictions = array_values(array_unique($restrictions)); + } + } + else + { + $restrictions = $restrictions_parent; + } + + // THUMBNAILS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) + { + $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + if (is_array($thumbnails)) + { + $thumbnails = array_values(array_unique($thumbnails)); + } + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) + { + foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) + { + $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + if (is_array($thumbnails)) + { + $thumbnails = array_values(array_unique($thumbnails)); + } + } + else + { + $thumbnails = $thumbnails_parent; + } + + // TITLES + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) + { + $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) + { + $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $title = $title_parent; + } + + $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width)); + } + } + } + } + + // If we have standalone media:content tags, loop through them. + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) + { + foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) + { + if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) + { + // Attributes + $bitrate = null; + $channels = null; + $duration = null; + $expression = null; + $framerate = null; + $height = null; + $javascript = null; + $lang = null; + $length = null; + $medium = null; + $samplingrate = null; + $type = null; + $url = null; + $width = null; + + // Elements + $captions = null; + $categories = null; + $copyrights = null; + $credits = null; + $description = null; + $hashes = null; + $keywords = null; + $player = null; + $ratings = null; + $restrictions = null; + $thumbnails = null; + $title = null; + + // Start checking the attributes of media:content + if (isset($content['attribs']['']['bitrate'])) + { + $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['channels'])) + { + $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['duration'])) + { + $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $duration = $duration_parent; + } + if (isset($content['attribs']['']['expression'])) + { + $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['framerate'])) + { + $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['height'])) + { + $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['lang'])) + { + $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['fileSize'])) + { + $length = ceil($content['attribs']['']['fileSize']); + } + if (isset($content['attribs']['']['medium'])) + { + $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['samplingrate'])) + { + $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['type'])) + { + $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['width'])) + { + $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['attribs']['']['url'])) + { + $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + // Checking the other optional media: elements. Priority: media:content, media:group, item, channel + + // CAPTIONS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) + { + $caption_type = null; + $caption_lang = null; + $caption_startTime = null; + $caption_endTime = null; + $caption_text = null; + if (isset($caption['attribs']['']['type'])) + { + $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['lang'])) + { + $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['start'])) + { + $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['attribs']['']['end'])) + { + $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($caption['data'])) + { + $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); + } + if (is_array($captions)) + { + $captions = array_values(array_unique($captions)); + } + } + else + { + $captions = $captions_parent; + } + + // CATEGORIES + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) + { + foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['data'])) + { + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = 'http://search.yahoo.com/mrss/category_schema'; + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); + } + } + if (is_array($categories) && is_array($categories_parent)) + { + $categories = array_values(array_unique(array_merge($categories, $categories_parent))); + } + elseif (is_array($categories)) + { + $categories = array_values(array_unique($categories)); + } + elseif (is_array($categories_parent)) + { + $categories = array_values(array_unique($categories_parent)); + } + else + { + $categories = null; + } + + // COPYRIGHTS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) + { + $copyright_url = null; + $copyright_label = null; + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) + { + $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) + { + $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); + } + else + { + $copyrights = $copyrights_parent; + } + + // CREDITS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) + { + $credit_role = null; + $credit_scheme = null; + $credit_name = null; + if (isset($credit['attribs']['']['role'])) + { + $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($credit['attribs']['']['scheme'])) + { + $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $credit_scheme = 'urn:ebu'; + } + if (isset($credit['data'])) + { + $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); + } + if (is_array($credits)) + { + $credits = array_values(array_unique($credits)); + } + } + else + { + $credits = $credits_parent; + } + + // DESCRIPTION + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) + { + $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $description = $description_parent; + } + + // HASHES + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) + { + $value = null; + $algo = null; + if (isset($hash['data'])) + { + $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($hash['attribs']['']['algo'])) + { + $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $algo = 'md5'; + } + $hashes[] = $algo.':'.$value; + } + if (is_array($hashes)) + { + $hashes = array_values(array_unique($hashes)); + } + } + else + { + $hashes = $hashes_parent; + } + + // KEYWORDS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) + { + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) + { + $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + foreach ($temp as $word) + { + $keywords[] = trim($word); + } + unset($temp); + } + if (is_array($keywords)) + { + $keywords = array_values(array_unique($keywords)); + } + } + else + { + $keywords = $keywords_parent; + } + + // PLAYER + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) + { + $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + $player = $player_parent; + } + + // RATINGS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) + { + $rating_scheme = null; + $rating_value = null; + if (isset($rating['attribs']['']['scheme'])) + { + $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $rating_scheme = 'urn:simple'; + } + if (isset($rating['data'])) + { + $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); + } + if (is_array($ratings)) + { + $ratings = array_values(array_unique($ratings)); + } + } + else + { + $ratings = $ratings_parent; + } + + // RESTRICTIONS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) + { + $restriction_relationship = null; + $restriction_type = null; + $restriction_value = null; + if (isset($restriction['attribs']['']['relationship'])) + { + $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['attribs']['']['type'])) + { + $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($restriction['data'])) + { + $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); + } + if (is_array($restrictions)) + { + $restrictions = array_values(array_unique($restrictions)); + } + } + else + { + $restrictions = $restrictions_parent; + } + + // THUMBNAILS + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) + { + foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) + { + $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); + } + if (is_array($thumbnails)) + { + $thumbnails = array_values(array_unique($thumbnails)); + } + } + else + { + $thumbnails = $thumbnails_parent; + } + + // TITLES + if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) + { + $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $title = $title_parent; + } + + $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width)); + } + } + } + + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) + { + if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') + { + // Attributes + $bitrate = null; + $channels = null; + $duration = null; + $expression = null; + $framerate = null; + $height = null; + $javascript = null; + $lang = null; + $length = null; + $medium = null; + $samplingrate = null; + $type = null; + $url = null; + $width = null; + + $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + if (isset($link['attribs']['']['type'])) + { + $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($link['attribs']['']['length'])) + { + $length = ceil($link['attribs']['']['length']); + } + + // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor + $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); + } + } + + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) + { + if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') + { + // Attributes + $bitrate = null; + $channels = null; + $duration = null; + $expression = null; + $framerate = null; + $height = null; + $javascript = null; + $lang = null; + $length = null; + $medium = null; + $samplingrate = null; + $type = null; + $url = null; + $width = null; + + $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + if (isset($link['attribs']['']['type'])) + { + $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($link['attribs']['']['length'])) + { + $length = ceil($link['attribs']['']['length']); + } + + // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor + $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); + } + } + + if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure')) + { + if (isset($enclosure[0]['attribs']['']['url'])) + { + // Attributes + $bitrate = null; + $channels = null; + $duration = null; + $expression = null; + $framerate = null; + $height = null; + $javascript = null; + $lang = null; + $length = null; + $medium = null; + $samplingrate = null; + $type = null; + $url = null; + $width = null; + + $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0])); + if (isset($enclosure[0]['attribs']['']['type'])) + { + $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($enclosure[0]['attribs']['']['length'])) + { + $length = ceil($enclosure[0]['attribs']['']['length']); + } + + // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor + $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); + } + } + + if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width)) + { + // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor + $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); + } + + $this->data['enclosures'] = array_values(array_unique($this->data['enclosures'])); + } + if (!empty($this->data['enclosures'])) + { + return $this->data['enclosures']; + } + else + { + return null; + } + } + + /** + * Get the latitude coordinates for the item + * + * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications + * + * Uses `<geo:lat>` or `<georss:point>` + * + * @since 1.0 + * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo + * @link http://www.georss.org/ GeoRSS + * @return string|null + */ + public function get_latitude() + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) + { + return (float) $return[0]['data']; + } + elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) + { + return (float) $match[1]; + } + else + { + return null; + } + } + + /** + * Get the longitude coordinates for the item + * + * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications + * + * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>` + * + * @since 1.0 + * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo + * @link http://www.georss.org/ GeoRSS + * @return string|null + */ + public function get_longitude() + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) + { + return (float) $return[0]['data']; + } + elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) + { + return (float) $return[0]['data']; + } + elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) + { + return (float) $match[2]; + } + else + { + return null; + } + } + + /** + * Get the `<atom:source>` for the item + * + * @since 1.1 + * @return SimplePie_Source|null + */ + public function get_source() + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source')) + { + return $this->registry->create('Source', array($this, $return[0])); + } + else + { + return null; + } + } +} + diff --git a/wp-includes/SimplePie/Locator.php b/wp-includes/SimplePie/Locator.php new file mode 100644 index 0000000..da89514 --- /dev/null +++ b/wp-includes/SimplePie/Locator.php @@ -0,0 +1,372 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + +/** + * Used for feed auto-discovery + * + * + * This class can be overloaded with {@see SimplePie::set_locator_class()} + * + * @package SimplePie + */ +class SimplePie_Locator +{ + var $useragent; + var $timeout; + var $file; + var $local = array(); + var $elsewhere = array(); + var $cached_entities = array(); + var $http_base; + var $base; + var $base_location = 0; + var $checked_feeds = 0; + var $max_checked_feeds = 10; + protected $registry; + + public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10) + { + $this->file = $file; + $this->useragent = $useragent; + $this->timeout = $timeout; + $this->max_checked_feeds = $max_checked_feeds; + + if (class_exists('DOMDocument')) + { + $this->dom = new DOMDocument(); + + set_error_handler(array('SimplePie_Misc', 'silence_errors')); + $this->dom->loadHTML($this->file->body); + restore_error_handler(); + } + else + { + $this->dom = null; + } + } + + public function set_registry(SimplePie_Registry $registry) + { + $this->registry = $registry; + } + + public function find($type = SIMPLEPIE_LOCATOR_ALL, &$working) + { + if ($this->is_feed($this->file)) + { + return $this->file; + } + + if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) + { + $sniffer = $this->registry->create('Content_Type_Sniffer', array($this->file)); + if ($sniffer->get_type() !== 'text/html') + { + return null; + } + } + + if ($type & ~SIMPLEPIE_LOCATOR_NONE) + { + $this->get_base(); + } + + if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery()) + { + return $working[0]; + } + + if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links()) + { + if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local)) + { + return $working; + } + + if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local)) + { + return $working; + } + + if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere)) + { + return $working; + } + + if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere)) + { + return $working; + } + } + return null; + } + + public function is_feed($file) + { + if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) + { + $sniffer = $this->registry->create('Content_Type_Sniffer', array($file)); + $sniffed = $sniffer->get_type(); + if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml'))) + { + return true; + } + else + { + return false; + } + } + elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL) + { + return true; + } + else + { + return false; + } + } + + public function get_base() + { + if ($this->dom === null) + { + throw new SimplePie_Exception('DOMDocument not found, unable to use locator'); + } + $this->http_base = $this->file->url; + $this->base = $this->http_base; + $elements = $this->dom->getElementsByTagName('base'); + foreach ($elements as $element) + { + if ($element->hasAttribute('href')) + { + $base = $this->registry->call('Misc', 'absolutize_url', array(trim($element->getAttribute('href')), $this->http_base)); + if ($base === false) + { + continue; + } + $this->base = $base; + $this->base_location = method_exists($element, 'getLineNo') ? $element->getLineNo() : 0; + break; + } + } + } + + public function autodiscovery() + { + $done = array(); + $feeds = array(); + $feeds = array_merge($feeds, $this->search_elements_by_tag('link', $done, $feeds)); + $feeds = array_merge($feeds, $this->search_elements_by_tag('a', $done, $feeds)); + $feeds = array_merge($feeds, $this->search_elements_by_tag('area', $done, $feeds)); + + if (!empty($feeds)) + { + return array_values($feeds); + } + else + { + return null; + } + } + + protected function search_elements_by_tag($name, &$done, $feeds) + { + if ($this->dom === null) + { + throw new SimplePie_Exception('DOMDocument not found, unable to use locator'); + } + + $links = $this->dom->getElementsByTagName($name); + foreach ($links as $link) + { + if ($this->checked_feeds === $this->max_checked_feeds) + { + break; + } + if ($link->hasAttribute('href') && $link->hasAttribute('rel')) + { + $rel = array_unique($this->registry->call('Misc', 'space_seperated_tokens', array(strtolower($link->getAttribute('rel'))))); + $line = method_exists($link, 'getLineNo') ? $link->getLineNo() : 1; + + if ($this->base_location < $line) + { + $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base)); + } + else + { + $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base)); + } + if ($href === false) + { + continue; + } + + if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', array($link->getAttribute('type')))), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href])) + { + $this->checked_feeds++; + $headers = array( + 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', + ); + $feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent)); + if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) + { + $feeds[$href] = $feed; + } + } + $done[] = $href; + } + } + + return $feeds; + } + + public function get_links() + { + if ($this->dom === null) + { + throw new SimplePie_Exception('DOMDocument not found, unable to use locator'); + } + + $links = $this->dom->getElementsByTagName('a'); + foreach ($links as $link) + { + if ($link->hasAttribute('href')) + { + $href = trim($link->getAttribute('href')); + $parsed = $this->registry->call('Misc', 'parse_url', array($href)); + if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme'])) + { + if (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo()) + { + $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base)); + } + else + { + $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base)); + } + if ($href === false) + { + continue; + } + + $current = $this->registry->call('Misc', 'parse_url', array($this->file->url)); + + if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority']) + { + $this->local[] = $href; + } + else + { + $this->elsewhere[] = $href; + } + } + } + } + $this->local = array_unique($this->local); + $this->elsewhere = array_unique($this->elsewhere); + if (!empty($this->local) || !empty($this->elsewhere)) + { + return true; + } + return null; + } + + public function extension(&$array) + { + foreach ($array as $key => $value) + { + if ($this->checked_feeds === $this->max_checked_feeds) + { + break; + } + if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml'))) + { + $this->checked_feeds++; + + $headers = array( + 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', + ); + $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent)); + if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) + { + return $feed; + } + else + { + unset($array[$key]); + } + } + } + return null; + } + + public function body(&$array) + { + foreach ($array as $key => $value) + { + if ($this->checked_feeds === $this->max_checked_feeds) + { + break; + } + if (preg_match('/(rss|rdf|atom|xml)/i', $value)) + { + $this->checked_feeds++; + $headers = array( + 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', + ); + $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent)); + if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) + { + return $feed; + } + else + { + unset($array[$key]); + } + } + } + return null; + } +} + diff --git a/wp-includes/SimplePie/Misc.php b/wp-includes/SimplePie/Misc.php new file mode 100644 index 0000000..1c1b618 --- /dev/null +++ b/wp-includes/SimplePie/Misc.php @@ -0,0 +1,2247 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + +/** + * Miscellanous utilities + * + * @package SimplePie + */ +class SimplePie_Misc +{ + public static function time_hms($seconds) + { + $time = ''; + + $hours = floor($seconds / 3600); + $remainder = $seconds % 3600; + if ($hours > 0) + { + $time .= $hours.':'; + } + + $minutes = floor($remainder / 60); + $seconds = $remainder % 60; + if ($minutes < 10 && $hours > 0) + { + $minutes = '0' . $minutes; + } + if ($seconds < 10) + { + $seconds = '0' . $seconds; + } + + $time .= $minutes.':'; + $time .= $seconds; + + return $time; + } + + public static function absolutize_url($relative, $base) + { + $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative); + if ($iri === false) + { + return false; + } + return $iri->get_uri(); + } + + /** + * Get a HTML/XML element from a HTML string + * + * @deprecated Use DOMDocument instead (parsing HTML with regex is bad!) + * @param string $realname Element name (including namespace prefix if applicable) + * @param string $string HTML document + * @return array + */ + public static function get_element($realname, $string) + { + $return = array(); + $name = preg_quote($realname, '/'); + if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) + { + for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++) + { + $return[$i]['tag'] = $realname; + $return[$i]['full'] = $matches[$i][0][0]; + $return[$i]['offset'] = $matches[$i][0][1]; + if (strlen($matches[$i][3][0]) <= 2) + { + $return[$i]['self_closing'] = true; + } + else + { + $return[$i]['self_closing'] = false; + $return[$i]['content'] = $matches[$i][4][0]; + } + $return[$i]['attribs'] = array(); + if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER)) + { + for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++) + { + if (count($attribs[$j]) === 2) + { + $attribs[$j][2] = $attribs[$j][1]; + } + $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j])); + } + } + } + } + return $return; + } + + public static function element_implode($element) + { + $full = "<$element[tag]"; + foreach ($element['attribs'] as $key => $value) + { + $key = strtolower($key); + $full .= " $key=\"" . htmlspecialchars($value['data']) . '"'; + } + if ($element['self_closing']) + { + $full .= ' />'; + } + else + { + $full .= ">$element[content]</$element[tag]>"; + } + return $full; + } + + public static function error($message, $level, $file, $line) + { + if ((ini_get('error_reporting') & $level) > 0) + { + switch ($level) + { + case E_USER_ERROR: + $note = 'PHP Error'; + break; + case E_USER_WARNING: + $note = 'PHP Warning'; + break; + case E_USER_NOTICE: + $note = 'PHP Notice'; + break; + default: + $note = 'Unknown Error'; + break; + } + + $log_error = true; + if (!function_exists('error_log')) + { + $log_error = false; + } + + $log_file = @ini_get('error_log'); + if (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file)) + { + $log_error = false; + } + + if ($log_error) + { + @error_log("$note: $message in $file on line $line", 0); + } + } + + return $message; + } + + public static function fix_protocol($url, $http = 1) + { + $url = SimplePie_Misc::normalize_url($url); + $parsed = SimplePie_Misc::parse_url($url); + if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https') + { + return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http); + } + + if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url)) + { + return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http); + } + + if ($http === 2 && $parsed['scheme'] !== '') + { + return "feed:$url"; + } + elseif ($http === 3 && strtolower($parsed['scheme']) === 'http') + { + return substr_replace($url, 'podcast', 0, 4); + } + elseif ($http === 4 && strtolower($parsed['scheme']) === 'http') + { + return substr_replace($url, 'itpc', 0, 4); + } + else + { + return $url; + } + } + + public static function parse_url($url) + { + $iri = new SimplePie_IRI($url); + return array( + 'scheme' => (string) $iri->scheme, + 'authority' => (string) $iri->authority, + 'path' => (string) $iri->path, + 'query' => (string) $iri->query, + 'fragment' => (string) $iri->fragment + ); + } + + public static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '') + { + $iri = new SimplePie_IRI(''); + $iri->scheme = $scheme; + $iri->authority = $authority; + $iri->path = $path; + $iri->query = $query; + $iri->fragment = $fragment; + return $iri->get_uri(); + } + + public static function normalize_url($url) + { + $iri = new SimplePie_IRI($url); + return $iri->get_uri(); + } + + public static function percent_encoding_normalization($match) + { + $integer = hexdec($match[1]); + if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E) + { + return chr($integer); + } + else + { + return strtoupper($match[0]); + } + } + + /** + * Converts a Windows-1252 encoded string to a UTF-8 encoded string + * + * @static + * @param string $string Windows-1252 encoded string + * @return string UTF-8 encoded string + */ + public static function windows_1252_to_utf8($string) + { + static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF"); + + return strtr($string, $convert_table); + } + + /** + * Change a string from one encoding to another + * + * @param string $data Raw data in $input encoding + * @param string $input Encoding of $data + * @param string $output Encoding you want + * @return string|boolean False if we can't convert it + */ + public static function change_encoding($data, $input, $output) + { + $input = SimplePie_Misc::encoding($input); + $output = SimplePie_Misc::encoding($output); + + // We fail to fail on non US-ASCII bytes + if ($input === 'US-ASCII') + { + static $non_ascii_octects = ''; + if (!$non_ascii_octects) + { + for ($i = 0x80; $i <= 0xFF; $i++) + { + $non_ascii_octects .= chr($i); + } + } + $data = substr($data, 0, strcspn($data, $non_ascii_octects)); + } + + // This is first, as behaviour of this is completely predictable + if ($input === 'windows-1252' && $output === 'UTF-8') + { + return SimplePie_Misc::windows_1252_to_utf8($data); + } + // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported). + elseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output))) + { + return $return; + } + // This is last, as behaviour of this varies with OS userland and PHP version + elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output))) + { + return $return; + } + // If we can't do anything, just fail + else + { + return false; + } + } + + protected static function change_encoding_mbstring($data, $input, $output) + { + if ($input === 'windows-949') + { + $input = 'EUC-KR'; + } + if ($output === 'windows-949') + { + $output = 'EUC-KR'; + } + if ($input === 'Windows-31J') + { + $input = 'SJIS'; + } + if ($output === 'Windows-31J') + { + $output = 'SJIS'; + } + + // Check that the encoding is supported + if (@mb_convert_encoding("\x80", 'UTF-16BE', $input) === "\x00\x80") + { + return false; + } + if (!in_array($input, mb_list_encodings())) + { + return false; + } + + // Let's do some conversion + if ($return = @mb_convert_encoding($data, $output, $input)) + { + return $return; + } + + return false; + } + + protected static function change_encoding_iconv($data, $input, $output) + { + return @iconv($input, $output, $data); + } + + /** + * Normalize an encoding name + * + * This is automatically generated by create.php + * + * To generate it, run `php create.php` on the command line, and copy the + * output to replace this function. + * + * @param string $charset Character set to standardise + * @return string Standardised name + */ + public static function encoding($charset) + { + // Normalization from UTS #22 + switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset))) + { + case 'adobestandardencoding': + case 'csadobestandardencoding': + return 'Adobe-Standard-Encoding'; + + case 'adobesymbolencoding': + case 'cshppsmath': + return 'Adobe-Symbol-Encoding'; + + case 'ami1251': + case 'amiga1251': + return 'Amiga-1251'; + + case 'ansix31101983': + case 'csat5001983': + case 'csiso99naplps': + case 'isoir99': + case 'naplps': + return 'ANSI_X3.110-1983'; + + case 'arabic7': + case 'asmo449': + case 'csiso89asmo449': + case 'iso9036': + case 'isoir89': + return 'ASMO_449'; + + case 'big5': + case 'csbig5': + return 'Big5'; + + case 'big5hkscs': + return 'Big5-HKSCS'; + + case 'bocu1': + case 'csbocu1': + return 'BOCU-1'; + + case 'brf': + case 'csbrf': + return 'BRF'; + + case 'bs4730': + case 'csiso4unitedkingdom': + case 'gb': + case 'iso646gb': + case 'isoir4': + case 'uk': + return 'BS_4730'; + + case 'bsviewdata': + case 'csiso47bsviewdata': + case 'isoir47': + return 'BS_viewdata'; + + case 'cesu8': + case 'cscesu8': + return 'CESU-8'; + + case 'ca': + case 'csa71': + case 'csaz243419851': + case 'csiso121canadian1': + case 'iso646ca': + case 'isoir121': + return 'CSA_Z243.4-1985-1'; + + case 'csa72': + case 'csaz243419852': + case 'csiso122canadian2': + case 'iso646ca2': + case 'isoir122': + return 'CSA_Z243.4-1985-2'; + + case 'csaz24341985gr': + case 'csiso123csaz24341985gr': + case 'isoir123': + return 'CSA_Z243.4-1985-gr'; + + case 'csiso139csn369103': + case 'csn369103': + case 'isoir139': + return 'CSN_369103'; + + case 'csdecmcs': + case 'dec': + case 'decmcs': + return 'DEC-MCS'; + + case 'csiso21german': + case 'de': + case 'din66003': + case 'iso646de': + case 'isoir21': + return 'DIN_66003'; + + case 'csdkus': + case 'dkus': + return 'dk-us'; + + case 'csiso646danish': + case 'dk': + case 'ds2089': + case 'iso646dk': + return 'DS_2089'; + + case 'csibmebcdicatde': + case 'ebcdicatde': + return 'EBCDIC-AT-DE'; + + case 'csebcdicatdea': + case 'ebcdicatdea': + return 'EBCDIC-AT-DE-A'; + + case 'csebcdiccafr': + case 'ebcdiccafr': + return 'EBCDIC-CA-FR'; + + case 'csebcdicdkno': + case 'ebcdicdkno': + return 'EBCDIC-DK-NO'; + + case 'csebcdicdknoa': + case 'ebcdicdknoa': + return 'EBCDIC-DK-NO-A'; + + case 'csebcdices': + case 'ebcdices': + return 'EBCDIC-ES'; + + case 'csebcdicesa': + case 'ebcdicesa': + return 'EBCDIC-ES-A'; + + case 'csebcdicess': + case 'ebcdicess': + return 'EBCDIC-ES-S'; + + case 'csebcdicfise': + case 'ebcdicfise': + return 'EBCDIC-FI-SE'; + + case 'csebcdicfisea': + case 'ebcdicfisea': + return 'EBCDIC-FI-SE-A'; + + case 'csebcdicfr': + case 'ebcdicfr': + return 'EBCDIC-FR'; + + case 'csebcdicit': + case 'ebcdicit': + return 'EBCDIC-IT'; + + case 'csebcdicpt': + case 'ebcdicpt': + return 'EBCDIC-PT'; + + case 'csebcdicuk': + case 'ebcdicuk': + return 'EBCDIC-UK'; + + case 'csebcdicus': + case 'ebcdicus': + return 'EBCDIC-US'; + + case 'csiso111ecmacyrillic': + case 'ecmacyrillic': + case 'isoir111': + case 'koi8e': + return 'ECMA-cyrillic'; + + case 'csiso17spanish': + case 'es': + case 'iso646es': + case 'isoir17': + return 'ES'; + + case 'csiso85spanish2': + case 'es2': + case 'iso646es2': + case 'isoir85': + return 'ES2'; + + case 'cseucpkdfmtjapanese': + case 'eucjp': + case 'extendedunixcodepackedformatforjapanese': + return 'EUC-JP'; + + case 'cseucfixwidjapanese': + case 'extendedunixcodefixedwidthforjapanese': + return 'Extended_UNIX_Code_Fixed_Width_for_Japanese'; + + case 'gb18030': + return 'GB18030'; + + case 'chinese': + case 'cp936': + case 'csgb2312': + case 'csiso58gb231280': + case 'gb2312': + case 'gb231280': + case 'gbk': + case 'isoir58': + case 'ms936': + case 'windows936': + return 'GBK'; + + case 'cn': + case 'csiso57gb1988': + case 'gb198880': + case 'iso646cn': + case 'isoir57': + return 'GB_1988-80'; + + case 'csiso153gost1976874': + case 'gost1976874': + case 'isoir153': + case 'stsev35888': + return 'GOST_19768-74'; + + case 'csiso150': + case 'csiso150greekccitt': + case 'greekccitt': + case 'isoir150': + return 'greek-ccitt'; + + case 'csiso88greek7': + case 'greek7': + case 'isoir88': + return 'greek7'; + + case 'csiso18greek7old': + case 'greek7old': + case 'isoir18': + return 'greek7-old'; + + case 'cshpdesktop': + case 'hpdesktop': + return 'HP-DeskTop'; + + case 'cshplegal': + case 'hplegal': + return 'HP-Legal'; + + case 'cshpmath8': + case 'hpmath8': + return 'HP-Math8'; + + case 'cshppifont': + case 'hppifont': + return 'HP-Pi-font'; + + case 'cshproman8': + case 'hproman8': + case 'r8': + case 'roman8': + return 'hp-roman8'; + + case 'hzgb2312': + return 'HZ-GB-2312'; + + case 'csibmsymbols': + case 'ibmsymbols': + return 'IBM-Symbols'; + + case 'csibmthai': + case 'ibmthai': + return 'IBM-Thai'; + + case 'cp37': + case 'csibm37': + case 'ebcdiccpca': + case 'ebcdiccpnl': + case 'ebcdiccpus': + case 'ebcdiccpwt': + case 'ibm37': + return 'IBM037'; + + case 'cp38': + case 'csibm38': + case 'ebcdicint': + case 'ibm38': + return 'IBM038'; + + case 'cp273': + case 'csibm273': + case 'ibm273': + return 'IBM273'; + + case 'cp274': + case 'csibm274': + case 'ebcdicbe': + case 'ibm274': + return 'IBM274'; + + case 'cp275': + case 'csibm275': + case 'ebcdicbr': + case 'ibm275': + return 'IBM275'; + + case 'csibm277': + case 'ebcdiccpdk': + case 'ebcdiccpno': + case 'ibm277': + return 'IBM277'; + + case 'cp278': + case 'csibm278': + case 'ebcdiccpfi': + case 'ebcdiccpse': + case 'ibm278': + return 'IBM278'; + + case 'cp280': + case 'csibm280': + case 'ebcdiccpit': + case 'ibm280': + return 'IBM280'; + + case 'cp281': + case 'csibm281': + case 'ebcdicjpe': + case 'ibm281': + return 'IBM281'; + + case 'cp284': + case 'csibm284': + case 'ebcdiccpes': + case 'ibm284': + return 'IBM284'; + + case 'cp285': + case 'csibm285': + case 'ebcdiccpgb': + case 'ibm285': + return 'IBM285'; + + case 'cp290': + case 'csibm290': + case 'ebcdicjpkana': + case 'ibm290': + return 'IBM290'; + + case 'cp297': + case 'csibm297': + case 'ebcdiccpfr': + case 'ibm297': + return 'IBM297'; + + case 'cp420': + case 'csibm420': + case 'ebcdiccpar1': + case 'ibm420': + return 'IBM420'; + + case 'cp423': + case 'csibm423': + case 'ebcdiccpgr': + case 'ibm423': + return 'IBM423'; + + case 'cp424': + case 'csibm424': + case 'ebcdiccphe': + case 'ibm424': + return 'IBM424'; + + case '437': + case 'cp437': + case 'cspc8codepage437': + case 'ibm437': + return 'IBM437'; + + case 'cp500': + case 'csibm500': + case 'ebcdiccpbe': + case 'ebcdiccpch': + case 'ibm500': + return 'IBM500'; + + case 'cp775': + case 'cspc775baltic': + case 'ibm775': + return 'IBM775'; + + case '850': + case 'cp850': + case 'cspc850multilingual': + case 'ibm850': + return 'IBM850'; + + case '851': + case 'cp851': + case 'csibm851': + case 'ibm851': + return 'IBM851'; + + case '852': + case 'cp852': + case 'cspcp852': + case 'ibm852': + return 'IBM852'; + + case '855': + case 'cp855': + case 'csibm855': + case 'ibm855': + return 'IBM855'; + + case '857': + case 'cp857': + case 'csibm857': + case 'ibm857': + return 'IBM857'; + + case 'ccsid858': + case 'cp858': + case 'ibm858': + case 'pcmultilingual850euro': + return 'IBM00858'; + + case '860': + case 'cp860': + case 'csibm860': + case 'ibm860': + return 'IBM860'; + + case '861': + case 'cp861': + case 'cpis': + case 'csibm861': + case 'ibm861': + return 'IBM861'; + + case '862': + case 'cp862': + case 'cspc862latinhebrew': + case 'ibm862': + return 'IBM862'; + + case '863': + case 'cp863': + case 'csibm863': + case 'ibm863': + return 'IBM863'; + + case 'cp864': + case 'csibm864': + case 'ibm864': + return 'IBM864'; + + case '865': + case 'cp865': + case 'csibm865': + case 'ibm865': + return 'IBM865'; + + case '866': + case 'cp866': + case 'csibm866': + case 'ibm866': + return 'IBM866'; + + case 'cp868': + case 'cpar': + case 'csibm868': + case 'ibm868': + return 'IBM868'; + + case '869': + case 'cp869': + case 'cpgr': + case 'csibm869': + case 'ibm869': + return 'IBM869'; + + case 'cp870': + case 'csibm870': + case 'ebcdiccproece': + case 'ebcdiccpyu': + case 'ibm870': + return 'IBM870'; + + case 'cp871': + case 'csibm871': + case 'ebcdiccpis': + case 'ibm871': + return 'IBM871'; + + case 'cp880': + case 'csibm880': + case 'ebcdiccyrillic': + case 'ibm880': + return 'IBM880'; + + case 'cp891': + case 'csibm891': + case 'ibm891': + return 'IBM891'; + + case 'cp903': + case 'csibm903': + case 'ibm903': + return 'IBM903'; + + case '904': + case 'cp904': + case 'csibbm904': + case 'ibm904': + return 'IBM904'; + + case 'cp905': + case 'csibm905': + case 'ebcdiccptr': + case 'ibm905': + return 'IBM905'; + + case 'cp918': + case 'csibm918': + case 'ebcdiccpar2': + case 'ibm918': + return 'IBM918'; + + case 'ccsid924': + case 'cp924': + case 'ebcdiclatin9euro': + case 'ibm924': + return 'IBM00924'; + + case 'cp1026': + case 'csibm1026': + case 'ibm1026': + return 'IBM1026'; + + case 'ibm1047': + return 'IBM1047'; + + case 'ccsid1140': + case 'cp1140': + case 'ebcdicus37euro': + case 'ibm1140': + return 'IBM01140'; + + case 'ccsid1141': + case 'cp1141': + case 'ebcdicde273euro': + case 'ibm1141': + return 'IBM01141'; + + case 'ccsid1142': + case 'cp1142': + case 'ebcdicdk277euro': + case 'ebcdicno277euro': + case 'ibm1142': + return 'IBM01142'; + + case 'ccsid1143': + case 'cp1143': + case 'ebcdicfi278euro': + case 'ebcdicse278euro': + case 'ibm1143': + return 'IBM01143'; + + case 'ccsid1144': + case 'cp1144': + case 'ebcdicit280euro': + case 'ibm1144': + return 'IBM01144'; + + case 'ccsid1145': + case 'cp1145': + case 'ebcdices284euro': + case 'ibm1145': + return 'IBM01145'; + + case 'ccsid1146': + case 'cp1146': + case 'ebcdicgb285euro': + case 'ibm1146': + return 'IBM01146'; + + case 'ccsid1147': + case 'cp1147': + case 'ebcdicfr297euro': + case 'ibm1147': + return 'IBM01147'; + + case 'ccsid1148': + case 'cp1148': + case 'ebcdicinternational500euro': + case 'ibm1148': + return 'IBM01148'; + + case 'ccsid1149': + case 'cp1149': + case 'ebcdicis871euro': + case 'ibm1149': + return 'IBM01149'; + + case 'csiso143iecp271': + case 'iecp271': + case 'isoir143': + return 'IEC_P27-1'; + + case 'csiso49inis': + case 'inis': + case 'isoir49': + return 'INIS'; + + case 'csiso50inis8': + case 'inis8': + case 'isoir50': + return 'INIS-8'; + + case 'csiso51iniscyrillic': + case 'iniscyrillic': + case 'isoir51': + return 'INIS-cyrillic'; + + case 'csinvariant': + case 'invariant': + return 'INVARIANT'; + + case 'iso2022cn': + return 'ISO-2022-CN'; + + case 'iso2022cnext': + return 'ISO-2022-CN-EXT'; + + case 'csiso2022jp': + case 'iso2022jp': + return 'ISO-2022-JP'; + + case 'csiso2022jp2': + case 'iso2022jp2': + return 'ISO-2022-JP-2'; + + case 'csiso2022kr': + case 'iso2022kr': + return 'ISO-2022-KR'; + + case 'cswindows30latin1': + case 'iso88591windows30latin1': + return 'ISO-8859-1-Windows-3.0-Latin-1'; + + case 'cswindows31latin1': + case 'iso88591windows31latin1': + return 'ISO-8859-1-Windows-3.1-Latin-1'; + + case 'csisolatin2': + case 'iso88592': + case 'iso885921987': + case 'isoir101': + case 'l2': + case 'latin2': + return 'ISO-8859-2'; + + case 'cswindows31latin2': + case 'iso88592windowslatin2': + return 'ISO-8859-2-Windows-Latin-2'; + + case 'csisolatin3': + case 'iso88593': + case 'iso885931988': + case 'isoir109': + case 'l3': + case 'latin3': + return 'ISO-8859-3'; + + case 'csisolatin4': + case 'iso88594': + case 'iso885941988': + case 'isoir110': + case 'l4': + case 'latin4': + return 'ISO-8859-4'; + + case 'csisolatincyrillic': + case 'cyrillic': + case 'iso88595': + case 'iso885951988': + case 'isoir144': + return 'ISO-8859-5'; + + case 'arabic': + case 'asmo708': + case 'csisolatinarabic': + case 'ecma114': + case 'iso88596': + case 'iso885961987': + case 'isoir127': + return 'ISO-8859-6'; + + case 'csiso88596e': + case 'iso88596e': + return 'ISO-8859-6-E'; + + case 'csiso88596i': + case 'iso88596i': + return 'ISO-8859-6-I'; + + case 'csisolatingreek': + case 'ecma118': + case 'elot928': + case 'greek': + case 'greek8': + case 'iso88597': + case 'iso885971987': + case 'isoir126': + return 'ISO-8859-7'; + + case 'csisolatinhebrew': + case 'hebrew': + case 'iso88598': + case 'iso885981988': + case 'isoir138': + return 'ISO-8859-8'; + + case 'csiso88598e': + case 'iso88598e': + return 'ISO-8859-8-E'; + + case 'csiso88598i': + case 'iso88598i': + return 'ISO-8859-8-I'; + + case 'cswindows31latin5': + case 'iso88599windowslatin5': + return 'ISO-8859-9-Windows-Latin-5'; + + case 'csisolatin6': + case 'iso885910': + case 'iso8859101992': + case 'isoir157': + case 'l6': + case 'latin6': + return 'ISO-8859-10'; + + case 'iso885913': + return 'ISO-8859-13'; + + case 'iso885914': + case 'iso8859141998': + case 'isoceltic': + case 'isoir199': + case 'l8': + case 'latin8': + return 'ISO-8859-14'; + + case 'iso885915': + case 'latin9': + return 'ISO-8859-15'; + + case 'iso885916': + case 'iso8859162001': + case 'isoir226': + case 'l10': + case 'latin10': + return 'ISO-8859-16'; + + case 'iso10646j1': + return 'ISO-10646-J-1'; + + case 'csunicode': + case 'iso10646ucs2': + return 'ISO-10646-UCS-2'; + + case 'csucs4': + case 'iso10646ucs4': + return 'ISO-10646-UCS-4'; + + case 'csunicodeascii': + case 'iso10646ucsbasic': + return 'ISO-10646-UCS-Basic'; + + case 'csunicodelatin1': + case 'iso10646': + case 'iso10646unicodelatin1': + return 'ISO-10646-Unicode-Latin1'; + + case 'csiso10646utf1': + case 'iso10646utf1': + return 'ISO-10646-UTF-1'; + + case 'csiso115481': + case 'iso115481': + case 'isotr115481': + return 'ISO-11548-1'; + + case 'csiso90': + case 'isoir90': + return 'iso-ir-90'; + + case 'csunicodeibm1261': + case 'isounicodeibm1261': + return 'ISO-Unicode-IBM-1261'; + + case 'csunicodeibm1264': + case 'isounicodeibm1264': + return 'ISO-Unicode-IBM-1264'; + + case 'csunicodeibm1265': + case 'isounicodeibm1265': + return 'ISO-Unicode-IBM-1265'; + + case 'csunicodeibm1268': + case 'isounicodeibm1268': + return 'ISO-Unicode-IBM-1268'; + + case 'csunicodeibm1276': + case 'isounicodeibm1276': + return 'ISO-Unicode-IBM-1276'; + + case 'csiso646basic1983': + case 'iso646basic1983': + case 'ref': + return 'ISO_646.basic:1983'; + + case 'csiso2intlrefversion': + case 'irv': + case 'iso646irv1983': + case 'isoir2': + return 'ISO_646.irv:1983'; + + case 'csiso2033': + case 'e13b': + case 'iso20331983': + case 'isoir98': + return 'ISO_2033-1983'; + + case 'csiso5427cyrillic': + case 'iso5427': + case 'isoir37': + return 'ISO_5427'; + + case 'iso5427cyrillic1981': + case 'iso54271981': + case 'isoir54': + return 'ISO_5427:1981'; + + case 'csiso5428greek': + case 'iso54281980': + case 'isoir55': + return 'ISO_5428:1980'; + + case 'csiso6937add': + case 'iso6937225': + case 'isoir152': + return 'ISO_6937-2-25'; + + case 'csisotextcomm': + case 'iso69372add': + case 'isoir142': + return 'ISO_6937-2-add'; + + case 'csiso8859supp': + case 'iso8859supp': + case 'isoir154': + case 'latin125': + return 'ISO_8859-supp'; + + case 'csiso10367box': + case 'iso10367box': + case 'isoir155': + return 'ISO_10367-box'; + + case 'csiso15italian': + case 'iso646it': + case 'isoir15': + case 'it': + return 'IT'; + + case 'csiso13jisc6220jp': + case 'isoir13': + case 'jisc62201969': + case 'jisc62201969jp': + case 'katakana': + case 'x2017': + return 'JIS_C6220-1969-jp'; + + case 'csiso14jisc6220ro': + case 'iso646jp': + case 'isoir14': + case 'jisc62201969ro': + case 'jp': + return 'JIS_C6220-1969-ro'; + + case 'csiso42jisc62261978': + case 'isoir42': + case 'jisc62261978': + return 'JIS_C6226-1978'; + + case 'csiso87jisx208': + case 'isoir87': + case 'jisc62261983': + case 'jisx2081983': + case 'x208': + return 'JIS_C6226-1983'; + + case 'csiso91jisc62291984a': + case 'isoir91': + case 'jisc62291984a': + case 'jpocra': + return 'JIS_C6229-1984-a'; + + case 'csiso92jisc62991984b': + case 'iso646jpocrb': + case 'isoir92': + case 'jisc62291984b': + case 'jpocrb': + return 'JIS_C6229-1984-b'; + + case 'csiso93jis62291984badd': + case 'isoir93': + case 'jisc62291984badd': + case 'jpocrbadd': + return 'JIS_C6229-1984-b-add'; + + case 'csiso94jis62291984hand': + case 'isoir94': + case 'jisc62291984hand': + case 'jpocrhand': + return 'JIS_C6229-1984-hand'; + + case 'csiso95jis62291984handadd': + case 'isoir95': + case 'jisc62291984handadd': + case 'jpocrhandadd': + return 'JIS_C6229-1984-hand-add'; + + case 'csiso96jisc62291984kana': + case 'isoir96': + case 'jisc62291984kana': + return 'JIS_C6229-1984-kana'; + + case 'csjisencoding': + case 'jisencoding': + return 'JIS_Encoding'; + + case 'cshalfwidthkatakana': + case 'jisx201': + case 'x201': + return 'JIS_X0201'; + + case 'csiso159jisx2121990': + case 'isoir159': + case 'jisx2121990': + case 'x212': + return 'JIS_X0212-1990'; + + case 'csiso141jusib1002': + case 'iso646yu': + case 'isoir141': + case 'js': + case 'jusib1002': + case 'yu': + return 'JUS_I.B1.002'; + + case 'csiso147macedonian': + case 'isoir147': + case 'jusib1003mac': + case 'macedonian': + return 'JUS_I.B1.003-mac'; + + case 'csiso146serbian': + case 'isoir146': + case 'jusib1003serb': + case 'serbian': + return 'JUS_I.B1.003-serb'; + + case 'koi7switched': + return 'KOI7-switched'; + + case 'cskoi8r': + case 'koi8r': + return 'KOI8-R'; + + case 'koi8u': + return 'KOI8-U'; + + case 'csksc5636': + case 'iso646kr': + case 'ksc5636': + return 'KSC5636'; + + case 'cskz1048': + case 'kz1048': + case 'rk1048': + case 'strk10482002': + return 'KZ-1048'; + + case 'csiso19latingreek': + case 'isoir19': + case 'latingreek': + return 'latin-greek'; + + case 'csiso27latingreek1': + case 'isoir27': + case 'latingreek1': + return 'Latin-greek-1'; + + case 'csiso158lap': + case 'isoir158': + case 'lap': + case 'latinlap': + return 'latin-lap'; + + case 'csmacintosh': + case 'mac': + case 'macintosh': + return 'macintosh'; + + case 'csmicrosoftpublishing': + case 'microsoftpublishing': + return 'Microsoft-Publishing'; + + case 'csmnem': + case 'mnem': + return 'MNEM'; + + case 'csmnemonic': + case 'mnemonic': + return 'MNEMONIC'; + + case 'csiso86hungarian': + case 'hu': + case 'iso646hu': + case 'isoir86': + case 'msz77953': + return 'MSZ_7795.3'; + + case 'csnatsdano': + case 'isoir91': + case 'natsdano': + return 'NATS-DANO'; + + case 'csnatsdanoadd': + case 'isoir92': + case 'natsdanoadd': + return 'NATS-DANO-ADD'; + + case 'csnatssefi': + case 'isoir81': + case 'natssefi': + return 'NATS-SEFI'; + + case 'csnatssefiadd': + case 'isoir82': + case 'natssefiadd': + return 'NATS-SEFI-ADD'; + + case 'csiso151cuba': + case 'cuba': + case 'iso646cu': + case 'isoir151': + case 'ncnc1081': + return 'NC_NC00-10:81'; + + case 'csiso69french': + case 'fr': + case 'iso646fr': + case 'isoir69': + case 'nfz62010': + return 'NF_Z_62-010'; + + case 'csiso25french': + case 'iso646fr1': + case 'isoir25': + case 'nfz620101973': + return 'NF_Z_62-010_(1973)'; + + case 'csiso60danishnorwegian': + case 'csiso60norwegian1': + case 'iso646no': + case 'isoir60': + case 'no': + case 'ns45511': + return 'NS_4551-1'; + + case 'csiso61norwegian2': + case 'iso646no2': + case 'isoir61': + case 'no2': + case 'ns45512': + return 'NS_4551-2'; + + case 'osdebcdicdf3irv': + return 'OSD_EBCDIC_DF03_IRV'; + + case 'osdebcdicdf41': + return 'OSD_EBCDIC_DF04_1'; + + case 'osdebcdicdf415': + return 'OSD_EBCDIC_DF04_15'; + + case 'cspc8danishnorwegian': + case 'pc8danishnorwegian': + return 'PC8-Danish-Norwegian'; + + case 'cspc8turkish': + case 'pc8turkish': + return 'PC8-Turkish'; + + case 'csiso16portuguese': + case 'iso646pt': + case 'isoir16': + case 'pt': + return 'PT'; + + case 'csiso84portuguese2': + case 'iso646pt2': + case 'isoir84': + case 'pt2': + return 'PT2'; + + case 'cp154': + case 'csptcp154': + case 'cyrillicasian': + case 'pt154': + case 'ptcp154': + return 'PTCP154'; + + case 'scsu': + return 'SCSU'; + + case 'csiso10swedish': + case 'fi': + case 'iso646fi': + case 'iso646se': + case 'isoir10': + case 'se': + case 'sen850200b': + return 'SEN_850200_B'; + + case 'csiso11swedishfornames': + case 'iso646se2': + case 'isoir11': + case 'se2': + case 'sen850200c': + return 'SEN_850200_C'; + + case 'csiso102t617bit': + case 'isoir102': + case 't617bit': + return 'T.61-7bit'; + + case 'csiso103t618bit': + case 'isoir103': + case 't61': + case 't618bit': + return 'T.61-8bit'; + + case 'csiso128t101g2': + case 'isoir128': + case 't101g2': + return 'T.101-G2'; + + case 'cstscii': + case 'tscii': + return 'TSCII'; + + case 'csunicode11': + case 'unicode11': + return 'UNICODE-1-1'; + + case 'csunicode11utf7': + case 'unicode11utf7': + return 'UNICODE-1-1-UTF-7'; + + case 'csunknown8bit': + case 'unknown8bit': + return 'UNKNOWN-8BIT'; + + case 'ansix341968': + case 'ansix341986': + case 'ascii': + case 'cp367': + case 'csascii': + case 'ibm367': + case 'iso646irv1991': + case 'iso646us': + case 'isoir6': + case 'us': + case 'usascii': + return 'US-ASCII'; + + case 'csusdk': + case 'usdk': + return 'us-dk'; + + case 'utf7': + return 'UTF-7'; + + case 'utf8': + return 'UTF-8'; + + case 'utf16': + return 'UTF-16'; + + case 'utf16be': + return 'UTF-16BE'; + + case 'utf16le': + return 'UTF-16LE'; + + case 'utf32': + return 'UTF-32'; + + case 'utf32be': + return 'UTF-32BE'; + + case 'utf32le': + return 'UTF-32LE'; + + case 'csventurainternational': + case 'venturainternational': + return 'Ventura-International'; + + case 'csventuramath': + case 'venturamath': + return 'Ventura-Math'; + + case 'csventuraus': + case 'venturaus': + return 'Ventura-US'; + + case 'csiso70videotexsupp1': + case 'isoir70': + case 'videotexsuppl': + return 'videotex-suppl'; + + case 'csviqr': + case 'viqr': + return 'VIQR'; + + case 'csviscii': + case 'viscii': + return 'VISCII'; + + case 'csshiftjis': + case 'cswindows31j': + case 'mskanji': + case 'shiftjis': + case 'windows31j': + return 'Windows-31J'; + + case 'iso885911': + case 'tis620': + return 'windows-874'; + + case 'cseuckr': + case 'csksc56011987': + case 'euckr': + case 'isoir149': + case 'korean': + case 'ksc5601': + case 'ksc56011987': + case 'ksc56011989': + case 'windows949': + return 'windows-949'; + + case 'windows1250': + return 'windows-1250'; + + case 'windows1251': + return 'windows-1251'; + + case 'cp819': + case 'csisolatin1': + case 'ibm819': + case 'iso88591': + case 'iso885911987': + case 'isoir100': + case 'l1': + case 'latin1': + case 'windows1252': + return 'windows-1252'; + + case 'windows1253': + return 'windows-1253'; + + case 'csisolatin5': + case 'iso88599': + case 'iso885991989': + case 'isoir148': + case 'l5': + case 'latin5': + case 'windows1254': + return 'windows-1254'; + + case 'windows1255': + return 'windows-1255'; + + case 'windows1256': + return 'windows-1256'; + + case 'windows1257': + return 'windows-1257'; + + case 'windows1258': + return 'windows-1258'; + + default: + return $charset; + } + } + + public static function get_curl_version() + { + if (is_array($curl = curl_version())) + { + $curl = $curl['version']; + } + elseif (substr($curl, 0, 5) === 'curl/') + { + $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5)); + } + elseif (substr($curl, 0, 8) === 'libcurl/') + { + $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8)); + } + else + { + $curl = 0; + } + return $curl; + } + + /** + * Strip HTML comments + * + * @param string $data Data to strip comments from + * @return string Comment stripped string + */ + public static function strip_comments($data) + { + $output = ''; + while (($start = strpos($data, '<!--')) !== false) + { + $output .= substr($data, 0, $start); + if (($end = strpos($data, '-->', $start)) !== false) + { + $data = substr_replace($data, '', 0, $end + 3); + } + else + { + $data = ''; + } + } + return $output . $data; + } + + public static function parse_date($dt) + { + $parser = SimplePie_Parse_Date::get(); + return $parser->parse($dt); + } + + /** + * Decode HTML entities + * + * @deprecated Use DOMDocument instead + * @param string $data Input data + * @return string Output data + */ + public static function entities_decode($data) + { + $decoder = new SimplePie_Decode_HTML_Entities($data); + return $decoder->parse(); + } + + /** + * Remove RFC822 comments + * + * @param string $data Data to strip comments from + * @return string Comment stripped string + */ + public static function uncomment_rfc822($string) + { + $string = (string) $string; + $position = 0; + $length = strlen($string); + $depth = 0; + + $output = ''; + + while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) + { + $output .= substr($string, $position, $pos - $position); + $position = $pos + 1; + if ($string[$pos - 1] !== '\\') + { + $depth++; + while ($depth && $position < $length) + { + $position += strcspn($string, '()', $position); + if ($string[$position - 1] === '\\') + { + $position++; + continue; + } + elseif (isset($string[$position])) + { + switch ($string[$position]) + { + case '(': + $depth++; + break; + + case ')': + $depth--; + break; + } + $position++; + } + else + { + break; + } + } + } + else + { + $output .= '('; + } + } + $output .= substr($string, $position); + + return $output; + } + + public static function parse_mime($mime) + { + if (($pos = strpos($mime, ';')) === false) + { + return trim($mime); + } + else + { + return trim(substr($mime, 0, $pos)); + } + } + + public static function atom_03_construct_type($attribs) + { + if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64')) + { + $mode = SIMPLEPIE_CONSTRUCT_BASE64; + } + else + { + $mode = SIMPLEPIE_CONSTRUCT_NONE; + } + if (isset($attribs['']['type'])) + { + switch (strtolower(trim($attribs['']['type']))) + { + case 'text': + case 'text/plain': + return SIMPLEPIE_CONSTRUCT_TEXT | $mode; + + case 'html': + case 'text/html': + return SIMPLEPIE_CONSTRUCT_HTML | $mode; + + case 'xhtml': + case 'application/xhtml+xml': + return SIMPLEPIE_CONSTRUCT_XHTML | $mode; + + default: + return SIMPLEPIE_CONSTRUCT_NONE | $mode; + } + } + else + { + return SIMPLEPIE_CONSTRUCT_TEXT | $mode; + } + } + + public static function atom_10_construct_type($attribs) + { + if (isset($attribs['']['type'])) + { + switch (strtolower(trim($attribs['']['type']))) + { + case 'text': + return SIMPLEPIE_CONSTRUCT_TEXT; + + case 'html': + return SIMPLEPIE_CONSTRUCT_HTML; + + case 'xhtml': + return SIMPLEPIE_CONSTRUCT_XHTML; + + default: + return SIMPLEPIE_CONSTRUCT_NONE; + } + } + return SIMPLEPIE_CONSTRUCT_TEXT; + } + + public static function atom_10_content_construct_type($attribs) + { + if (isset($attribs['']['type'])) + { + $type = strtolower(trim($attribs['']['type'])); + switch ($type) + { + case 'text': + return SIMPLEPIE_CONSTRUCT_TEXT; + + case 'html': + return SIMPLEPIE_CONSTRUCT_HTML; + + case 'xhtml': + return SIMPLEPIE_CONSTRUCT_XHTML; + } + if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/') + { + return SIMPLEPIE_CONSTRUCT_NONE; + } + else + { + return SIMPLEPIE_CONSTRUCT_BASE64; + } + } + else + { + return SIMPLEPIE_CONSTRUCT_TEXT; + } + } + + public static function is_isegment_nz_nc($string) + { + return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string); + } + + public static function space_seperated_tokens($string) + { + $space_characters = "\x20\x09\x0A\x0B\x0C\x0D"; + $string_length = strlen($string); + + $position = strspn($string, $space_characters); + $tokens = array(); + + while ($position < $string_length) + { + $len = strcspn($string, $space_characters, $position); + $tokens[] = substr($string, $position, $len); + $position += $len; + $position += strspn($string, $space_characters, $position); + } + + return $tokens; + } + + /** + * Converts a unicode codepoint to a UTF-8 character + * + * @static + * @param int $codepoint Unicode codepoint + * @return string UTF-8 character + */ + public static function codepoint_to_utf8($codepoint) + { + $codepoint = (int) $codepoint; + if ($codepoint < 0) + { + return false; + } + else if ($codepoint <= 0x7f) + { + return chr($codepoint); + } + else if ($codepoint <= 0x7ff) + { + return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f)); + } + else if ($codepoint <= 0xffff) + { + return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); + } + else if ($codepoint <= 0x10ffff) + { + return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); + } + else + { + // U+FFFD REPLACEMENT CHARACTER + return "\xEF\xBF\xBD"; + } + } + + /** + * Similar to parse_str() + * + * Returns an associative array of name/value pairs, where the value is an + * array of values that have used the same name + * + * @static + * @param string $str The input string. + * @return array + */ + public static function parse_str($str) + { + $return = array(); + $str = explode('&', $str); + + foreach ($str as $section) + { + if (strpos($section, '=') !== false) + { + list($name, $value) = explode('=', $section, 2); + $return[urldecode($name)][] = urldecode($value); + } + else + { + $return[urldecode($section)][] = null; + } + } + + return $return; + } + + /** + * Detect XML encoding, as per XML 1.0 Appendix F.1 + * + * @todo Add support for EBCDIC + * @param string $data XML data + * @param SimplePie_Registry $registry Class registry + * @return array Possible encodings + */ + public static function xml_encoding($data, $registry) + { + // UTF-32 Big Endian BOM + if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") + { + $encoding[] = 'UTF-32BE'; + } + // UTF-32 Little Endian BOM + elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") + { + $encoding[] = 'UTF-32LE'; + } + // UTF-16 Big Endian BOM + elseif (substr($data, 0, 2) === "\xFE\xFF") + { + $encoding[] = 'UTF-16BE'; + } + // UTF-16 Little Endian BOM + elseif (substr($data, 0, 2) === "\xFF\xFE") + { + $encoding[] = 'UTF-16LE'; + } + // UTF-8 BOM + elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") + { + $encoding[] = 'UTF-8'; + } + // UTF-32 Big Endian Without BOM + elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C") + { + if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E")) + { + $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8'))); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-32BE'; + } + // UTF-32 Little Endian Without BOM + elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00") + { + if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00")) + { + $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8'))); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-32LE'; + } + // UTF-16 Big Endian Without BOM + elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C") + { + if ($pos = strpos($data, "\x00\x3F\x00\x3E")) + { + $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8'))); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-16BE'; + } + // UTF-16 Little Endian Without BOM + elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00") + { + if ($pos = strpos($data, "\x3F\x00\x3E\x00")) + { + $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8'))); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-16LE'; + } + // US-ASCII (or superset) + elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C") + { + if ($pos = strpos($data, "\x3F\x3E")) + { + $parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5))); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-8'; + } + // Fallback to UTF-8 + else + { + $encoding[] = 'UTF-8'; + } + return $encoding; + } + + public static function output_javascript() + { + if (function_exists('ob_gzhandler')) + { + ob_start('ob_gzhandler'); + } + header('Content-type: text/javascript; charset: UTF-8'); + header('Cache-Control: must-revalidate'); + header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days + ?> +function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) { + if (placeholder != '') { + document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); + } + else { + document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); + } +} + +function embed_flash(bgcolor, width, height, link, loop, type) { + document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>'); +} + +function embed_flv(width, height, link, placeholder, loop, player) { + document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>'); +} + +function embed_wmedia(width, height, link) { + document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>'); +} + <?php + } + + /** + * Get the SimplePie build timestamp + * + * Uses the git index if it exists, otherwise uses the modification time + * of the newest file. + */ + public static function get_build() + { + $root = dirname(dirname(__FILE__)); + if (file_exists($root . '/.git/index')) + { + return filemtime($root . '/.git/index'); + } + elseif (file_exists($root . '/SimplePie')) + { + $time = 0; + foreach (glob($root . '/SimplePie/*.php') as $file) + { + if (($mtime = filemtime($file)) > $time) + { + $time = $mtime; + } + } + return $time; + } + elseif (file_exists(dirname(__FILE__) . '/Core.php')) + { + return filemtime(dirname(__FILE__) . '/Core.php'); + } + else + { + return filemtime(__FILE__); + } + } + + /** + * Format debugging information + */ + public static function debug(&$sp) + { + $info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n"; + $info .= 'PHP ' . PHP_VERSION . "\n"; + if ($sp->error() !== null) + { + $info .= 'Error occurred: ' . $sp->error() . "\n"; + } + else + { + $info .= "No error found.\n"; + } + $info .= "Extensions:\n"; + $extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml'); + foreach ($extensions as $ext) + { + if (extension_loaded($ext)) + { + $info .= " $ext loaded\n"; + switch ($ext) + { + case 'pcre': + $info .= ' Version ' . PCRE_VERSION . "\n"; + break; + case 'curl': + $version = curl_version(); + $info .= ' Version ' . $version['version'] . "\n"; + break; + case 'mbstring': + $info .= ' Overloading: ' . mb_get_info('func_overload') . "\n"; + break; + case 'iconv': + $info .= ' Version ' . ICONV_VERSION . "\n"; + break; + case 'xml': + $info .= ' Version ' . LIBXML_DOTTED_VERSION . "\n"; + break; + } + } + else + { + $info .= " $ext not loaded\n"; + } + } + return $info; + } + + public static function silence_errors($num, $str) + { + // No-op + } +} + diff --git a/wp-includes/SimplePie/Net/IPv6.php b/wp-includes/SimplePie/Net/IPv6.php new file mode 100644 index 0000000..da80d8a --- /dev/null +++ b/wp-includes/SimplePie/Net/IPv6.php @@ -0,0 +1,276 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + + +/** + * Class to validate and to work with IPv6 addresses. + * + * @package SimplePie + * @subpackage HTTP + * @copyright 2003-2005 The PHP Group + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/package/Net_IPv6 + * @author Alexander Merz <alexander.merz@web.de> + * @author elfrink at introweb dot nl + * @author Josh Peck <jmp at joshpeck dot org> + * @author Geoffrey Sneddon <geoffers@gmail.com> + */ +class SimplePie_Net_IPv6 +{ + /** + * Uncompresses an IPv6 address + * + * RFC 4291 allows you to compress concecutive zero pieces in an address to + * '::'. This method expects a valid IPv6 address and expands the '::' to + * the required number of zero pieces. + * + * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 + * ::1 -> 0:0:0:0:0:0:0:1 + * + * @author Alexander Merz <alexander.merz@web.de> + * @author elfrink at introweb dot nl + * @author Josh Peck <jmp at joshpeck dot org> + * @copyright 2003-2005 The PHP Group + * @license http://www.opensource.org/licenses/bsd-license.php + * @param string $ip An IPv6 address + * @return string The uncompressed IPv6 address + */ + public static function uncompress($ip) + { + $c1 = -1; + $c2 = -1; + if (substr_count($ip, '::') === 1) + { + list($ip1, $ip2) = explode('::', $ip); + if ($ip1 === '') + { + $c1 = -1; + } + else + { + $c1 = substr_count($ip1, ':'); + } + if ($ip2 === '') + { + $c2 = -1; + } + else + { + $c2 = substr_count($ip2, ':'); + } + if (strpos($ip2, '.') !== false) + { + $c2++; + } + // :: + if ($c1 === -1 && $c2 === -1) + { + $ip = '0:0:0:0:0:0:0:0'; + } + // ::xxx + else if ($c1 === -1) + { + $fill = str_repeat('0:', 7 - $c2); + $ip = str_replace('::', $fill, $ip); + } + // xxx:: + else if ($c2 === -1) + { + $fill = str_repeat(':0', 7 - $c1); + $ip = str_replace('::', $fill, $ip); + } + // xxx::xxx + else + { + $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); + $ip = str_replace('::', $fill, $ip); + } + } + return $ip; + } + + /** + * Compresses an IPv6 address + * + * RFC 4291 allows you to compress concecutive zero pieces in an address to + * '::'. This method expects a valid IPv6 address and compresses consecutive + * zero pieces to '::'. + * + * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 + * 0:0:0:0:0:0:0:1 -> ::1 + * + * @see uncompress() + * @param string $ip An IPv6 address + * @return string The compressed IPv6 address + */ + public static function compress($ip) + { + // Prepare the IP to be compressed + $ip = self::uncompress($ip); + $ip_parts = self::split_v6_v4($ip); + + // Replace all leading zeros + $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); + + // Find bunches of zeros + if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) + { + $max = 0; + $pos = null; + foreach ($matches[0] as $match) + { + if (strlen($match[0]) > $max) + { + $max = strlen($match[0]); + $pos = $match[1]; + } + } + + $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); + } + + if ($ip_parts[1] !== '') + { + return implode(':', $ip_parts); + } + else + { + return $ip_parts[0]; + } + } + + /** + * Splits an IPv6 address into the IPv6 and IPv4 representation parts + * + * RFC 4291 allows you to represent the last two parts of an IPv6 address + * using the standard IPv4 representation + * + * Example: 0:0:0:0:0:0:13.1.68.3 + * 0:0:0:0:0:FFFF:129.144.52.38 + * + * @param string $ip An IPv6 address + * @return array [0] contains the IPv6 represented part, and [1] the IPv4 represented part + */ + private static function split_v6_v4($ip) + { + if (strpos($ip, '.') !== false) + { + $pos = strrpos($ip, ':'); + $ipv6_part = substr($ip, 0, $pos); + $ipv4_part = substr($ip, $pos + 1); + return array($ipv6_part, $ipv4_part); + } + else + { + return array($ip, ''); + } + } + + /** + * Checks an IPv6 address + * + * Checks if the given IP is a valid IPv6 address + * + * @param string $ip An IPv6 address + * @return bool true if $ip is a valid IPv6 address + */ + public static function check_ipv6($ip) + { + $ip = self::uncompress($ip); + list($ipv6, $ipv4) = self::split_v6_v4($ip); + $ipv6 = explode(':', $ipv6); + $ipv4 = explode('.', $ipv4); + if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) + { + foreach ($ipv6 as $ipv6_part) + { + // The section can't be empty + if ($ipv6_part === '') + return false; + + // Nor can it be over four characters + if (strlen($ipv6_part) > 4) + return false; + + // Remove leading zeros (this is safe because of the above) + $ipv6_part = ltrim($ipv6_part, '0'); + if ($ipv6_part === '') + $ipv6_part = '0'; + + // Check the value is valid + $value = hexdec($ipv6_part); + if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) + return false; + } + if (count($ipv4) === 4) + { + foreach ($ipv4 as $ipv4_part) + { + $value = (int) $ipv4_part; + if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) + return false; + } + } + return true; + } + else + { + return false; + } + } + + /** + * Checks if the given IP is a valid IPv6 address + * + * @codeCoverageIgnore + * @deprecated Use {@see SimplePie_Net_IPv6::check_ipv6()} instead + * @see check_ipv6 + * @param string $ip An IPv6 address + * @return bool true if $ip is a valid IPv6 address + */ + public static function checkIPv6($ip) + { + return self::check_ipv6($ip); + } +} diff --git a/wp-includes/SimplePie/Parse/Date.php b/wp-includes/SimplePie/Parse/Date.php new file mode 100644 index 0000000..52fea21 --- /dev/null +++ b/wp-includes/SimplePie/Parse/Date.php @@ -0,0 +1,984 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + + +/** + * Date Parser + * + * @package SimplePie + * @subpackage Parsing + */ +class SimplePie_Parse_Date +{ + /** + * Input data + * + * @access protected + * @var string + */ + var $date; + + /** + * List of days, calendar day name => ordinal day number in the week + * + * @access protected + * @var array + */ + var $day = array( + // English + 'mon' => 1, + 'monday' => 1, + 'tue' => 2, + 'tuesday' => 2, + 'wed' => 3, + 'wednesday' => 3, + 'thu' => 4, + 'thursday' => 4, + 'fri' => 5, + 'friday' => 5, + 'sat' => 6, + 'saturday' => 6, + 'sun' => 7, + 'sunday' => 7, + // Dutch + 'maandag' => 1, + 'dinsdag' => 2, + 'woensdag' => 3, + 'donderdag' => 4, + 'vrijdag' => 5, + 'zaterdag' => 6, + 'zondag' => 7, + // French + 'lundi' => 1, + 'mardi' => 2, + 'mercredi' => 3, + 'jeudi' => 4, + 'vendredi' => 5, + 'samedi' => 6, + 'dimanche' => 7, + // German + 'montag' => 1, + 'dienstag' => 2, + 'mittwoch' => 3, + 'donnerstag' => 4, + 'freitag' => 5, + 'samstag' => 6, + 'sonnabend' => 6, + 'sonntag' => 7, + // Italian + 'lunedì' => 1, + 'martedì' => 2, + 'mercoledì' => 3, + 'giovedì' => 4, + 'venerdì' => 5, + 'sabato' => 6, + 'domenica' => 7, + // Spanish + 'lunes' => 1, + 'martes' => 2, + 'miércoles' => 3, + 'jueves' => 4, + 'viernes' => 5, + 'sábado' => 6, + 'domingo' => 7, + // Finnish + 'maanantai' => 1, + 'tiistai' => 2, + 'keskiviikko' => 3, + 'torstai' => 4, + 'perjantai' => 5, + 'lauantai' => 6, + 'sunnuntai' => 7, + // Hungarian + 'hétfő' => 1, + 'kedd' => 2, + 'szerda' => 3, + 'csütörtok' => 4, + 'péntek' => 5, + 'szombat' => 6, + 'vasárnap' => 7, + // Greek + 'Δευ' => 1, + 'Τρι' => 2, + 'Τετ' => 3, + 'Πεμ' => 4, + 'Παρ' => 5, + 'Σαβ' => 6, + 'Κυρ' => 7, + ); + + /** + * List of months, calendar month name => calendar month number + * + * @access protected + * @var array + */ + var $month = array( + // English + 'jan' => 1, + 'january' => 1, + 'feb' => 2, + 'february' => 2, + 'mar' => 3, + 'march' => 3, + 'apr' => 4, + 'april' => 4, + 'may' => 5, + // No long form of May + 'jun' => 6, + 'june' => 6, + 'jul' => 7, + 'july' => 7, + 'aug' => 8, + 'august' => 8, + 'sep' => 9, + 'september' => 8, + 'oct' => 10, + 'october' => 10, + 'nov' => 11, + 'november' => 11, + 'dec' => 12, + 'december' => 12, + // Dutch + 'januari' => 1, + 'februari' => 2, + 'maart' => 3, + 'april' => 4, + 'mei' => 5, + 'juni' => 6, + 'juli' => 7, + 'augustus' => 8, + 'september' => 9, + 'oktober' => 10, + 'november' => 11, + 'december' => 12, + // French + 'janvier' => 1, + 'février' => 2, + 'mars' => 3, + 'avril' => 4, + 'mai' => 5, + 'juin' => 6, + 'juillet' => 7, + 'août' => 8, + 'septembre' => 9, + 'octobre' => 10, + 'novembre' => 11, + 'décembre' => 12, + // German + 'januar' => 1, + 'februar' => 2, + 'märz' => 3, + 'april' => 4, + 'mai' => 5, + 'juni' => 6, + 'juli' => 7, + 'august' => 8, + 'september' => 9, + 'oktober' => 10, + 'november' => 11, + 'dezember' => 12, + // Italian + 'gennaio' => 1, + 'febbraio' => 2, + 'marzo' => 3, + 'aprile' => 4, + 'maggio' => 5, + 'giugno' => 6, + 'luglio' => 7, + 'agosto' => 8, + 'settembre' => 9, + 'ottobre' => 10, + 'novembre' => 11, + 'dicembre' => 12, + // Spanish + 'enero' => 1, + 'febrero' => 2, + 'marzo' => 3, + 'abril' => 4, + 'mayo' => 5, + 'junio' => 6, + 'julio' => 7, + 'agosto' => 8, + 'septiembre' => 9, + 'setiembre' => 9, + 'octubre' => 10, + 'noviembre' => 11, + 'diciembre' => 12, + // Finnish + 'tammikuu' => 1, + 'helmikuu' => 2, + 'maaliskuu' => 3, + 'huhtikuu' => 4, + 'toukokuu' => 5, + 'kesäkuu' => 6, + 'heinäkuu' => 7, + 'elokuu' => 8, + 'suuskuu' => 9, + 'lokakuu' => 10, + 'marras' => 11, + 'joulukuu' => 12, + // Hungarian + 'január' => 1, + 'február' => 2, + 'március' => 3, + 'április' => 4, + 'május' => 5, + 'június' => 6, + 'július' => 7, + 'augusztus' => 8, + 'szeptember' => 9, + 'október' => 10, + 'november' => 11, + 'december' => 12, + // Greek + 'Ιαν' => 1, + 'Φεβ' => 2, + 'Μάώ' => 3, + 'Μαώ' => 3, + 'Απρ' => 4, + 'Μάι' => 5, + 'Μαϊ' => 5, + 'Μαι' => 5, + 'Ιούν' => 6, + 'Ιον' => 6, + 'Ιούλ' => 7, + 'Ιολ' => 7, + 'Αύγ' => 8, + 'Αυγ' => 8, + 'Σεπ' => 9, + 'Οκτ' => 10, + 'Νοέ' => 11, + 'Δεκ' => 12, + ); + + /** + * List of timezones, abbreviation => offset from UTC + * + * @access protected + * @var array + */ + var $timezone = array( + 'ACDT' => 37800, + 'ACIT' => 28800, + 'ACST' => 34200, + 'ACT' => -18000, + 'ACWDT' => 35100, + 'ACWST' => 31500, + 'AEDT' => 39600, + 'AEST' => 36000, + 'AFT' => 16200, + 'AKDT' => -28800, + 'AKST' => -32400, + 'AMDT' => 18000, + 'AMT' => -14400, + 'ANAST' => 46800, + 'ANAT' => 43200, + 'ART' => -10800, + 'AZOST' => -3600, + 'AZST' => 18000, + 'AZT' => 14400, + 'BIOT' => 21600, + 'BIT' => -43200, + 'BOT' => -14400, + 'BRST' => -7200, + 'BRT' => -10800, + 'BST' => 3600, + 'BTT' => 21600, + 'CAST' => 18000, + 'CAT' => 7200, + 'CCT' => 23400, + 'CDT' => -18000, + 'CEDT' => 7200, + 'CEST' => 7200, + 'CET' => 3600, + 'CGST' => -7200, + 'CGT' => -10800, + 'CHADT' => 49500, + 'CHAST' => 45900, + 'CIST' => -28800, + 'CKT' => -36000, + 'CLDT' => -10800, + 'CLST' => -14400, + 'COT' => -18000, + 'CST' => -21600, + 'CVT' => -3600, + 'CXT' => 25200, + 'DAVT' => 25200, + 'DTAT' => 36000, + 'EADT' => -18000, + 'EAST' => -21600, + 'EAT' => 10800, + 'ECT' => -18000, + 'EDT' => -14400, + 'EEST' => 10800, + 'EET' => 7200, + 'EGT' => -3600, + 'EKST' => 21600, + 'EST' => -18000, + 'FJT' => 43200, + 'FKDT' => -10800, + 'FKST' => -14400, + 'FNT' => -7200, + 'GALT' => -21600, + 'GEDT' => 14400, + 'GEST' => 10800, + 'GFT' => -10800, + 'GILT' => 43200, + 'GIT' => -32400, + 'GST' => 14400, + 'GST' => -7200, + 'GYT' => -14400, + 'HAA' => -10800, + 'HAC' => -18000, + 'HADT' => -32400, + 'HAE' => -14400, + 'HAP' => -25200, + 'HAR' => -21600, + 'HAST' => -36000, + 'HAT' => -9000, + 'HAY' => -28800, + 'HKST' => 28800, + 'HMT' => 18000, + 'HNA' => -14400, + 'HNC' => -21600, + 'HNE' => -18000, + 'HNP' => -28800, + 'HNR' => -25200, + 'HNT' => -12600, + 'HNY' => -32400, + 'IRDT' => 16200, + 'IRKST' => 32400, + 'IRKT' => 28800, + 'IRST' => 12600, + 'JFDT' => -10800, + 'JFST' => -14400, + 'JST' => 32400, + 'KGST' => 21600, + 'KGT' => 18000, + 'KOST' => 39600, + 'KOVST' => 28800, + 'KOVT' => 25200, + 'KRAST' => 28800, + 'KRAT' => 25200, + 'KST' => 32400, + 'LHDT' => 39600, + 'LHST' => 37800, + 'LINT' => 50400, + 'LKT' => 21600, + 'MAGST' => 43200, + 'MAGT' => 39600, + 'MAWT' => 21600, + 'MDT' => -21600, + 'MESZ' => 7200, + 'MEZ' => 3600, + 'MHT' => 43200, + 'MIT' => -34200, + 'MNST' => 32400, + 'MSDT' => 14400, + 'MSST' => 10800, + 'MST' => -25200, + 'MUT' => 14400, + 'MVT' => 18000, + 'MYT' => 28800, + 'NCT' => 39600, + 'NDT' => -9000, + 'NFT' => 41400, + 'NMIT' => 36000, + 'NOVST' => 25200, + 'NOVT' => 21600, + 'NPT' => 20700, + 'NRT' => 43200, + 'NST' => -12600, + 'NUT' => -39600, + 'NZDT' => 46800, + 'NZST' => 43200, + 'OMSST' => 25200, + 'OMST' => 21600, + 'PDT' => -25200, + 'PET' => -18000, + 'PETST' => 46800, + 'PETT' => 43200, + 'PGT' => 36000, + 'PHOT' => 46800, + 'PHT' => 28800, + 'PKT' => 18000, + 'PMDT' => -7200, + 'PMST' => -10800, + 'PONT' => 39600, + 'PST' => -28800, + 'PWT' => 32400, + 'PYST' => -10800, + 'PYT' => -14400, + 'RET' => 14400, + 'ROTT' => -10800, + 'SAMST' => 18000, + 'SAMT' => 14400, + 'SAST' => 7200, + 'SBT' => 39600, + 'SCDT' => 46800, + 'SCST' => 43200, + 'SCT' => 14400, + 'SEST' => 3600, + 'SGT' => 28800, + 'SIT' => 28800, + 'SRT' => -10800, + 'SST' => -39600, + 'SYST' => 10800, + 'SYT' => 7200, + 'TFT' => 18000, + 'THAT' => -36000, + 'TJT' => 18000, + 'TKT' => -36000, + 'TMT' => 18000, + 'TOT' => 46800, + 'TPT' => 32400, + 'TRUT' => 36000, + 'TVT' => 43200, + 'TWT' => 28800, + 'UYST' => -7200, + 'UYT' => -10800, + 'UZT' => 18000, + 'VET' => -14400, + 'VLAST' => 39600, + 'VLAT' => 36000, + 'VOST' => 21600, + 'VUT' => 39600, + 'WAST' => 7200, + 'WAT' => 3600, + 'WDT' => 32400, + 'WEST' => 3600, + 'WFT' => 43200, + 'WIB' => 25200, + 'WIT' => 32400, + 'WITA' => 28800, + 'WKST' => 18000, + 'WST' => 28800, + 'YAKST' => 36000, + 'YAKT' => 32400, + 'YAPT' => 36000, + 'YEKST' => 21600, + 'YEKT' => 18000, + ); + + /** + * Cached PCRE for SimplePie_Parse_Date::$day + * + * @access protected + * @var string + */ + var $day_pcre; + + /** + * Cached PCRE for SimplePie_Parse_Date::$month + * + * @access protected + * @var string + */ + var $month_pcre; + + /** + * Array of user-added callback methods + * + * @access private + * @var array + */ + var $built_in = array(); + + /** + * Array of user-added callback methods + * + * @access private + * @var array + */ + var $user = array(); + + /** + * Create new SimplePie_Parse_Date object, and set self::day_pcre, + * self::month_pcre, and self::built_in + * + * @access private + */ + public function __construct() + { + $this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')'; + $this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')'; + + static $cache; + if (!isset($cache[get_class($this)])) + { + $all_methods = get_class_methods($this); + + foreach ($all_methods as $method) + { + if (strtolower(substr($method, 0, 5)) === 'date_') + { + $cache[get_class($this)][] = $method; + } + } + } + + foreach ($cache[get_class($this)] as $method) + { + $this->built_in[] = $method; + } + } + + /** + * Get the object + * + * @access public + */ + public static function get() + { + static $object; + if (!$object) + { + $object = new SimplePie_Parse_Date; + } + return $object; + } + + /** + * Parse a date + * + * @final + * @access public + * @param string $date Date to parse + * @return int Timestamp corresponding to date string, or false on failure + */ + public function parse($date) + { + foreach ($this->user as $method) + { + if (($returned = call_user_func($method, $date)) !== false) + { + return $returned; + } + } + + foreach ($this->built_in as $method) + { + if (($returned = call_user_func(array($this, $method), $date)) !== false) + { + return $returned; + } + } + + return false; + } + + /** + * Add a callback method to parse a date + * + * @final + * @access public + * @param callable $callback + */ + public function add_callback($callback) + { + if (is_callable($callback)) + { + $this->user[] = $callback; + } + else + { + trigger_error('User-supplied function must be a valid callback', E_USER_WARNING); + } + } + + /** + * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as + * well as allowing any of upper or lower case "T", horizontal tabs, or + * spaces to be used as the time seperator (including more than one)) + * + * @access protected + * @return int Timestamp + */ + public function date_w3cdtf($date) + { + static $pcre; + if (!$pcre) + { + $year = '([0-9]{4})'; + $month = $day = $hour = $minute = $second = '([0-9]{2})'; + $decimal = '([0-9]*)'; + $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))'; + $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/'; + } + if (preg_match($pcre, $date, $match)) + { + /* + Capturing subpatterns: + 1: Year + 2: Month + 3: Day + 4: Hour + 5: Minute + 6: Second + 7: Decimal fraction of a second + 8: Zulu + 9: Timezone ± + 10: Timezone hours + 11: Timezone minutes + */ + + // Fill in empty matches + for ($i = count($match); $i <= 3; $i++) + { + $match[$i] = '1'; + } + + for ($i = count($match); $i <= 7; $i++) + { + $match[$i] = '0'; + } + + // Numeric timezone + if (isset($match[9]) && $match[9] !== '') + { + $timezone = $match[10] * 3600; + $timezone += $match[11] * 60; + if ($match[9] === '-') + { + $timezone = 0 - $timezone; + } + } + else + { + $timezone = 0; + } + + // Convert the number of seconds to an integer, taking decimals into account + $second = round($match[6] + $match[7] / pow(10, strlen($match[7]))); + + return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone; + } + else + { + return false; + } + } + + /** + * Remove RFC822 comments + * + * @access protected + * @param string $data Data to strip comments from + * @return string Comment stripped string + */ + public function remove_rfc2822_comments($string) + { + $string = (string) $string; + $position = 0; + $length = strlen($string); + $depth = 0; + + $output = ''; + + while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) + { + $output .= substr($string, $position, $pos - $position); + $position = $pos + 1; + if ($string[$pos - 1] !== '\\') + { + $depth++; + while ($depth && $position < $length) + { + $position += strcspn($string, '()', $position); + if ($string[$position - 1] === '\\') + { + $position++; + continue; + } + elseif (isset($string[$position])) + { + switch ($string[$position]) + { + case '(': + $depth++; + break; + + case ')': + $depth--; + break; + } + $position++; + } + else + { + break; + } + } + } + else + { + $output .= '('; + } + } + $output .= substr($string, $position); + + return $output; + } + + /** + * Parse RFC2822's date format + * + * @access protected + * @return int Timestamp + */ + public function date_rfc2822($date) + { + static $pcre; + if (!$pcre) + { + $wsp = '[\x09\x20]'; + $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)'; + $optional_fws = $fws . '?'; + $day_name = $this->day_pcre; + $month = $this->month_pcre; + $day = '([0-9]{1,2})'; + $hour = $minute = $second = '([0-9]{2})'; + $year = '([0-9]{2,4})'; + $num_zone = '([+\-])([0-9]{2})([0-9]{2})'; + $character_zone = '([A-Z]{1,5})'; + $zone = '(?:' . $num_zone . '|' . $character_zone . ')'; + $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i'; + } + if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match)) + { + /* + Capturing subpatterns: + 1: Day name + 2: Day + 3: Month + 4: Year + 5: Hour + 6: Minute + 7: Second + 8: Timezone ± + 9: Timezone hours + 10: Timezone minutes + 11: Alphabetic timezone + */ + + // Find the month number + $month = $this->month[strtolower($match[3])]; + + // Numeric timezone + if ($match[8] !== '') + { + $timezone = $match[9] * 3600; + $timezone += $match[10] * 60; + if ($match[8] === '-') + { + $timezone = 0 - $timezone; + } + } + // Character timezone + elseif (isset($this->timezone[strtoupper($match[11])])) + { + $timezone = $this->timezone[strtoupper($match[11])]; + } + // Assume everything else to be -0000 + else + { + $timezone = 0; + } + + // Deal with 2/3 digit years + if ($match[4] < 50) + { + $match[4] += 2000; + } + elseif ($match[4] < 1000) + { + $match[4] += 1900; + } + + // Second is optional, if it is empty set it to zero + if ($match[7] !== '') + { + $second = $match[7]; + } + else + { + $second = 0; + } + + return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone; + } + else + { + return false; + } + } + + /** + * Parse RFC850's date format + * + * @access protected + * @return int Timestamp + */ + public function date_rfc850($date) + { + static $pcre; + if (!$pcre) + { + $space = '[\x09\x20]+'; + $day_name = $this->day_pcre; + $month = $this->month_pcre; + $day = '([0-9]{1,2})'; + $year = $hour = $minute = $second = '([0-9]{2})'; + $zone = '([A-Z]{1,5})'; + $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i'; + } + if (preg_match($pcre, $date, $match)) + { + /* + Capturing subpatterns: + 1: Day name + 2: Day + 3: Month + 4: Year + 5: Hour + 6: Minute + 7: Second + 8: Timezone + */ + + // Month + $month = $this->month[strtolower($match[3])]; + + // Character timezone + if (isset($this->timezone[strtoupper($match[8])])) + { + $timezone = $this->timezone[strtoupper($match[8])]; + } + // Assume everything else to be -0000 + else + { + $timezone = 0; + } + + // Deal with 2 digit year + if ($match[4] < 50) + { + $match[4] += 2000; + } + else + { + $match[4] += 1900; + } + + return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone; + } + else + { + return false; + } + } + + /** + * Parse C99's asctime()'s date format + * + * @access protected + * @return int Timestamp + */ + public function date_asctime($date) + { + static $pcre; + if (!$pcre) + { + $space = '[\x09\x20]+'; + $wday_name = $this->day_pcre; + $mon_name = $this->month_pcre; + $day = '([0-9]{1,2})'; + $hour = $sec = $min = '([0-9]{2})'; + $year = '([0-9]{4})'; + $terminator = '\x0A?\x00?'; + $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i'; + } + if (preg_match($pcre, $date, $match)) + { + /* + Capturing subpatterns: + 1: Day name + 2: Month + 3: Day + 4: Hour + 5: Minute + 6: Second + 7: Year + */ + + $month = $this->month[strtolower($match[2])]; + return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]); + } + else + { + return false; + } + } + + /** + * Parse dates using strtotime() + * + * @access protected + * @return int Timestamp + */ + public function date_strtotime($date) + { + $strtotime = strtotime($date); + if ($strtotime === -1 || $strtotime === false) + { + return false; + } + else + { + return $strtotime; + } + } +} + diff --git a/wp-includes/SimplePie/Parser.php b/wp-includes/SimplePie/Parser.php new file mode 100644 index 0000000..d698552 --- /dev/null +++ b/wp-includes/SimplePie/Parser.php @@ -0,0 +1,407 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + +/** + * Parses XML into something sane + * + * + * This class can be overloaded with {@see SimplePie::set_parser_class()} + * + * @package SimplePie + * @subpackage Parsing + */ +class SimplePie_Parser +{ + var $error_code; + var $error_string; + var $current_line; + var $current_column; + var $current_byte; + var $separator = ' '; + var $namespace = array(''); + var $element = array(''); + var $xml_base = array(''); + var $xml_base_explicit = array(false); + var $xml_lang = array(''); + var $data = array(); + var $datas = array(array()); + var $current_xhtml_construct = -1; + var $encoding; + protected $registry; + + public function set_registry(SimplePie_Registry $registry) + { + $this->registry = $registry; + } + + public function parse(&$data, $encoding) + { + // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character + if (strtoupper($encoding) === 'US-ASCII') + { + $this->encoding = 'UTF-8'; + } + else + { + $this->encoding = $encoding; + } + + // Strip BOM: + // UTF-32 Big Endian BOM + if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") + { + $data = substr($data, 4); + } + // UTF-32 Little Endian BOM + elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") + { + $data = substr($data, 4); + } + // UTF-16 Big Endian BOM + elseif (substr($data, 0, 2) === "\xFE\xFF") + { + $data = substr($data, 2); + } + // UTF-16 Little Endian BOM + elseif (substr($data, 0, 2) === "\xFF\xFE") + { + $data = substr($data, 2); + } + // UTF-8 BOM + elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") + { + $data = substr($data, 3); + } + + if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false) + { + $declaration = $this->registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5))); + if ($declaration->parse()) + { + $data = substr($data, $pos + 2); + $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data; + } + else + { + $this->error_string = 'SimplePie bug! Please report this!'; + return false; + } + } + + $return = true; + + static $xml_is_sane = null; + if ($xml_is_sane === null) + { + $parser_check = xml_parser_create(); + xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); + xml_parser_free($parser_check); + $xml_is_sane = isset($values[0]['value']); + } + + // Create the parser + if ($xml_is_sane) + { + $xml = xml_parser_create_ns($this->encoding, $this->separator); + xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0); + xml_set_object($xml, $this); + xml_set_character_data_handler($xml, 'cdata'); + xml_set_element_handler($xml, 'tag_open', 'tag_close'); + + // Parse! + if (!xml_parse($xml, $data, true)) + { + $this->error_code = xml_get_error_code($xml); + $this->error_string = xml_error_string($this->error_code); + $return = false; + } + $this->current_line = xml_get_current_line_number($xml); + $this->current_column = xml_get_current_column_number($xml); + $this->current_byte = xml_get_current_byte_index($xml); + xml_parser_free($xml); + return $return; + } + else + { + libxml_clear_errors(); + $xml = new XMLReader(); + $xml->xml($data); + while (@$xml->read()) + { + switch ($xml->nodeType) + { + + case constant('XMLReader::END_ELEMENT'): + if ($xml->namespaceURI !== '') + { + $tagName = $xml->namespaceURI . $this->separator . $xml->localName; + } + else + { + $tagName = $xml->localName; + } + $this->tag_close(null, $tagName); + break; + case constant('XMLReader::ELEMENT'): + $empty = $xml->isEmptyElement; + if ($xml->namespaceURI !== '') + { + $tagName = $xml->namespaceURI . $this->separator . $xml->localName; + } + else + { + $tagName = $xml->localName; + } + $attributes = array(); + while ($xml->moveToNextAttribute()) + { + if ($xml->namespaceURI !== '') + { + $attrName = $xml->namespaceURI . $this->separator . $xml->localName; + } + else + { + $attrName = $xml->localName; + } + $attributes[$attrName] = $xml->value; + } + $this->tag_open(null, $tagName, $attributes); + if ($empty) + { + $this->tag_close(null, $tagName); + } + break; + case constant('XMLReader::TEXT'): + + case constant('XMLReader::CDATA'): + $this->cdata(null, $xml->value); + break; + } + } + if ($error = libxml_get_last_error()) + { + $this->error_code = $error->code; + $this->error_string = $error->message; + $this->current_line = $error->line; + $this->current_column = $error->column; + return false; + } + else + { + return true; + } + } + } + + public function get_error_code() + { + return $this->error_code; + } + + public function get_error_string() + { + return $this->error_string; + } + + public function get_current_line() + { + return $this->current_line; + } + + public function get_current_column() + { + return $this->current_column; + } + + public function get_current_byte() + { + return $this->current_byte; + } + + public function get_data() + { + return $this->data; + } + + public function tag_open($parser, $tag, $attributes) + { + list($this->namespace[], $this->element[]) = $this->split_ns($tag); + + $attribs = array(); + foreach ($attributes as $name => $value) + { + list($attrib_namespace, $attribute) = $this->split_ns($name); + $attribs[$attrib_namespace][$attribute] = $value; + } + + if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base'])) + { + $base = $this->registry->call('Misc', 'absolutize_url', array($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base))); + if ($base !== false) + { + $this->xml_base[] = $base; + $this->xml_base_explicit[] = true; + } + } + else + { + $this->xml_base[] = end($this->xml_base); + $this->xml_base_explicit[] = end($this->xml_base_explicit); + } + + if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang'])) + { + $this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang']; + } + else + { + $this->xml_lang[] = end($this->xml_lang); + } + + if ($this->current_xhtml_construct >= 0) + { + $this->current_xhtml_construct++; + if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML) + { + $this->data['data'] .= '<' . end($this->element); + if (isset($attribs[''])) + { + foreach ($attribs[''] as $name => $value) + { + $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"'; + } + } + $this->data['data'] .= '>'; + } + } + else + { + $this->datas[] =& $this->data; + $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][]; + $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang)); + if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml') + || (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml') + || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_20 && in_array(end($this->element), array('title'))) + || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_090 && in_array(end($this->element), array('title'))) + || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_10 && in_array(end($this->element), array('title')))) + { + $this->current_xhtml_construct = 0; + } + } + } + + public function cdata($parser, $cdata) + { + if ($this->current_xhtml_construct >= 0) + { + $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding); + } + else + { + $this->data['data'] .= $cdata; + } + } + + public function tag_close($parser, $tag) + { + if ($this->current_xhtml_construct >= 0) + { + $this->current_xhtml_construct--; + if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'))) + { + $this->data['data'] .= '</' . end($this->element) . '>'; + } + } + if ($this->current_xhtml_construct === -1) + { + $this->data =& $this->datas[count($this->datas) - 1]; + array_pop($this->datas); + } + + array_pop($this->element); + array_pop($this->namespace); + array_pop($this->xml_base); + array_pop($this->xml_base_explicit); + array_pop($this->xml_lang); + } + + public function split_ns($string) + { + static $cache = array(); + if (!isset($cache[$string])) + { + if ($pos = strpos($string, $this->separator)) + { + static $separator_length; + if (!$separator_length) + { + $separator_length = strlen($this->separator); + } + $namespace = substr($string, 0, $pos); + $local_name = substr($string, $pos + $separator_length); + if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES) + { + $namespace = SIMPLEPIE_NAMESPACE_ITUNES; + } + + // Normalize the Media RSS namespaces + if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG || + $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2 || + $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3 || + $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4 || + $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5 ) + { + $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS; + } + $cache[$string] = array($namespace, $local_name); + } + else + { + $cache[$string] = array('', $string); + } + } + return $cache[$string]; + } +} diff --git a/wp-includes/SimplePie/Rating.php b/wp-includes/SimplePie/Rating.php new file mode 100644 index 0000000..8689e5d --- /dev/null +++ b/wp-includes/SimplePie/Rating.php @@ -0,0 +1,129 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + +/** + * Handles `<media:rating>` or `<itunes:explicit>` tags as defined in Media RSS and iTunes RSS respectively + * + * Used by {@see SimplePie_Enclosure::get_rating()} and {@see SimplePie_Enclosure::get_ratings()} + * + * This class can be overloaded with {@see SimplePie::set_rating_class()} + * + * @package SimplePie + * @subpackage API + */ +class SimplePie_Rating +{ + /** + * Rating scheme + * + * @var string + * @see get_scheme() + */ + var $scheme; + + /** + * Rating value + * + * @var string + * @see get_value() + */ + var $value; + + /** + * Constructor, used to input the data + * + * For documentation on all the parameters, see the corresponding + * properties and their accessors + */ + public function __construct($scheme = null, $value = null) + { + $this->scheme = $scheme; + $this->value = $value; + } + + /** + * String-ified version + * + * @return string + */ + public function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + /** + * Get the organizational scheme for the rating + * + * @return string|null + */ + public function get_scheme() + { + if ($this->scheme !== null) + { + return $this->scheme; + } + else + { + return null; + } + } + + /** + * Get the value of the rating + * + * @return string|null + */ + public function get_value() + { + if ($this->value !== null) + { + return $this->value; + } + else + { + return null; + } + } +} diff --git a/wp-includes/SimplePie/Registry.php b/wp-includes/SimplePie/Registry.php new file mode 100644 index 0000000..1072cde --- /dev/null +++ b/wp-includes/SimplePie/Registry.php @@ -0,0 +1,225 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + +/** + * Handles creating objects and calling methods + * + * Access this via {@see SimplePie::get_registry()} + * + * @package SimplePie + */ +class SimplePie_Registry +{ + /** + * Default class mapping + * + * Overriding classes *must* subclass these. + * + * @var array + */ + protected $default = array( + 'Cache' => 'SimplePie_Cache', + 'Locator' => 'SimplePie_Locator', + 'Parser' => 'SimplePie_Parser', + 'File' => 'SimplePie_File', + 'Sanitize' => 'SimplePie_Sanitize', + 'Item' => 'SimplePie_Item', + 'Author' => 'SimplePie_Author', + 'Category' => 'SimplePie_Category', + 'Enclosure' => 'SimplePie_Enclosure', + 'Caption' => 'SimplePie_Caption', + 'Copyright' => 'SimplePie_Copyright', + 'Credit' => 'SimplePie_Credit', + 'Rating' => 'SimplePie_Rating', + 'Restriction' => 'SimplePie_Restriction', + 'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer', + 'Source' => 'SimplePie_Source', + 'Misc' => 'SimplePie_Misc', + 'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser', + 'Parse_Date' => 'SimplePie_Parse_Date', + ); + + /** + * Class mapping + * + * @see register() + * @var array + */ + protected $classes = array(); + + /** + * Legacy classes + * + * @see register() + * @var array + */ + protected $legacy = array(); + + /** + * Constructor + * + * No-op + */ + public function __construct() { } + + /** + * Register a class + * + * @param string $type See {@see $default} for names + * @param string $class Class name, must subclass the corresponding default + * @param bool $legacy Whether to enable legacy support for this class + * @return bool Successfulness + */ + public function register($type, $class, $legacy = false) + { + if (!is_subclass_of($class, $this->default[$type])) + { + return false; + } + + $this->classes[$type] = $class; + + if ($legacy) + { + $this->legacy[] = $class; + } + + return true; + } + + /** + * Get the class registered for a type + * + * Where possible, use {@see create()} or {@see call()} instead + * + * @param string $type + * @return string|null + */ + public function get_class($type) + { + if (!empty($this->classes[$type])) + { + return $this->classes[$type]; + } + if (!empty($this->default[$type])) + { + return $this->default[$type]; + } + + return null; + } + + /** + * Create a new instance of a given type + * + * @param string $type + * @param array $parameters Parameters to pass to the constructor + * @return object Instance of class + */ + public function &create($type, $parameters = array()) + { + $class = $this->get_class($type); + + if (in_array($class, $this->legacy)) + { + switch ($type) + { + case 'locator': + // Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class + // Specified: file, timeout, useragent, max_checked_feeds + $replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer')); + array_splice($parameters, 3, 1, $replacement); + break; + } + } + + if (!method_exists($class, '__construct')) + { + $instance = new $class; + } + else + { + $reflector = new ReflectionClass($class); + $instance = $reflector->newInstanceArgs($parameters); + } + + if (method_exists($instance, 'set_registry')) + { + $instance->set_registry($this); + } + return $instance; + } + + /** + * Call a static method for a type + * + * @param string $type + * @param string $method + * @param array $parameters + * @return mixed + */ + public function &call($type, $method, $parameters = array()) + { + $class = $this->get_class($type); + + if (in_array($class, $this->legacy)) + { + switch ($type) + { + case 'Cache': + // For backwards compatibility with old non-static + // Cache::create() methods + if ($method === 'get_handler') + { + $result = @call_user_func_array(array($class, 'create'), $parameters); + return $result; + } + break; + } + } + + $result = call_user_func_array(array($class, $method), $parameters); + return $result; + } +} \ No newline at end of file diff --git a/wp-includes/SimplePie/Restriction.php b/wp-includes/SimplePie/Restriction.php new file mode 100644 index 0000000..4ba371b --- /dev/null +++ b/wp-includes/SimplePie/Restriction.php @@ -0,0 +1,155 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + +/** + * Handles `<media:restriction>` as defined in Media RSS + * + * Used by {@see SimplePie_Enclosure::get_restriction()} and {@see SimplePie_Enclosure::get_restrictions()} + * + * This class can be overloaded with {@see SimplePie::set_restriction_class()} + * + * @package SimplePie + * @subpackage API + */ +class SimplePie_Restriction +{ + /** + * Relationship ('allow'/'deny') + * + * @var string + * @see get_relationship() + */ + var $relationship; + + /** + * Type of restriction + * + * @var string + * @see get_type() + */ + var $type; + + /** + * Restricted values + * + * @var string + * @see get_value() + */ + var $value; + + /** + * Constructor, used to input the data + * + * For documentation on all the parameters, see the corresponding + * properties and their accessors + */ + public function __construct($relationship = null, $type = null, $value = null) + { + $this->relationship = $relationship; + $this->type = $type; + $this->value = $value; + } + + /** + * String-ified version + * + * @return string + */ + public function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + /** + * Get the relationship + * + * @return string|null Either 'allow' or 'deny' + */ + public function get_relationship() + { + if ($this->relationship !== null) + { + return $this->relationship; + } + else + { + return null; + } + } + + /** + * Get the type + * + * @return string|null + */ + public function get_type() + { + if ($this->type !== null) + { + return $this->type; + } + else + { + return null; + } + } + + /** + * Get the list of restricted things + * + * @return string|null + */ + public function get_value() + { + if ($this->value !== null) + { + return $this->value; + } + else + { + return null; + } + } +} diff --git a/wp-includes/SimplePie/Sanitize.php b/wp-includes/SimplePie/Sanitize.php new file mode 100644 index 0000000..1ce047a --- /dev/null +++ b/wp-includes/SimplePie/Sanitize.php @@ -0,0 +1,554 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + +/** + * Used for data cleanup and post-processing + * + * + * This class can be overloaded with {@see SimplePie::set_sanitize_class()} + * + * @package SimplePie + * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags + */ +class SimplePie_Sanitize +{ + // Private vars + var $base; + + // Options + var $remove_div = true; + var $image_handler = ''; + var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); + var $encode_instead_of_strip = false; + var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); + var $strip_comments = false; + var $output_encoding = 'UTF-8'; + var $enable_cache = true; + var $cache_location = './cache'; + var $cache_name_function = 'md5'; + var $timeout = 10; + var $useragent = ''; + var $force_fsockopen = false; + var $replace_url_attributes = null; + + public function __construct() + { + // Set defaults + $this->set_url_replacements(null); + } + + public function remove_div($enable = true) + { + $this->remove_div = (bool) $enable; + } + + public function set_image_handler($page = false) + { + if ($page) + { + $this->image_handler = (string) $page; + } + else + { + $this->image_handler = false; + } + } + + public function set_registry(SimplePie_Registry $registry) + { + $this->registry = $registry; + } + + public function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache') + { + if (isset($enable_cache)) + { + $this->enable_cache = (bool) $enable_cache; + } + + if ($cache_location) + { + $this->cache_location = (string) $cache_location; + } + + if ($cache_name_function) + { + $this->cache_name_function = (string) $cache_name_function; + } + } + + public function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false) + { + if ($timeout) + { + $this->timeout = (string) $timeout; + } + + if ($useragent) + { + $this->useragent = (string) $useragent; + } + + if ($force_fsockopen) + { + $this->force_fsockopen = (string) $force_fsockopen; + } + } + + public function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style')) + { + if ($tags) + { + if (is_array($tags)) + { + $this->strip_htmltags = $tags; + } + else + { + $this->strip_htmltags = explode(',', $tags); + } + } + else + { + $this->strip_htmltags = false; + } + } + + public function encode_instead_of_strip($encode = false) + { + $this->encode_instead_of_strip = (bool) $encode; + } + + public function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc')) + { + if ($attribs) + { + if (is_array($attribs)) + { + $this->strip_attributes = $attribs; + } + else + { + $this->strip_attributes = explode(',', $attribs); + } + } + else + { + $this->strip_attributes = false; + } + } + + public function strip_comments($strip = false) + { + $this->strip_comments = (bool) $strip; + } + + public function set_output_encoding($encoding = 'UTF-8') + { + $this->output_encoding = (string) $encoding; + } + + /** + * Set element/attribute key/value pairs of HTML attributes + * containing URLs that need to be resolved relative to the feed + * + * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite, + * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite, + * |q|@cite + * + * @since 1.0 + * @param array|null $element_attribute Element/attribute key/value pairs, null for default + */ + public function set_url_replacements($element_attribute = null) + { + if ($element_attribute === null) + { + $element_attribute = array( + 'a' => 'href', + 'area' => 'href', + 'blockquote' => 'cite', + 'del' => 'cite', + 'form' => 'action', + 'img' => array( + 'longdesc', + 'src' + ), + 'input' => 'src', + 'ins' => 'cite', + 'q' => 'cite' + ); + } + $this->replace_url_attributes = (array) $element_attribute; + } + + public function sanitize($data, $type, $base = '') + { + $data = trim($data); + if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI) + { + if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML) + { + if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data)) + { + $type |= SIMPLEPIE_CONSTRUCT_HTML; + } + else + { + $type |= SIMPLEPIE_CONSTRUCT_TEXT; + } + } + + if ($type & SIMPLEPIE_CONSTRUCT_BASE64) + { + $data = base64_decode($data); + } + + if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML)) + { + + if (!class_exists('DOMDocument')) + { + $this->registry->call('Misc', 'error', array('DOMDocument not found, unable to use sanitizer', E_USER_WARNING, __FILE__, __LINE__)); + return ''; + } + $document = new DOMDocument(); + $document->encoding = 'UTF-8'; + $data = $this->preprocess($data, $type); + + set_error_handler(array('SimplePie_Misc', 'silence_errors')); + $document->loadHTML($data); + restore_error_handler(); + + // Strip comments + if ($this->strip_comments) + { + $xpath = new DOMXPath($document); + $comments = $xpath->query('//comment()'); + + foreach ($comments as $comment) + { + $comment->parentNode->removeChild($comment); + } + } + + // Strip out HTML tags and attributes that might cause various security problems. + // Based on recommendations by Mark Pilgrim at: + // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely + if ($this->strip_htmltags) + { + foreach ($this->strip_htmltags as $tag) + { + $this->strip_tag($tag, $document, $type); + } + } + + if ($this->strip_attributes) + { + foreach ($this->strip_attributes as $attrib) + { + $this->strip_attr($attrib, $document); + } + } + + // Replace relative URLs + $this->base = $base; + foreach ($this->replace_url_attributes as $element => $attributes) + { + $this->replace_urls($document, $element, $attributes); + } + + // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags. + if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache) + { + $images = $document->getElementsByTagName('img'); + foreach ($images as $img) + { + if ($img->hasAttribute('src')) + { + $image_url = call_user_func($this->cache_name_function, $img->getAttribute('src')); + $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $image_url, 'spi')); + + if ($cache->load()) + { + $img->setAttribute('src', $this->image_handler . $image_url); + } + else + { + $file = $this->registry->create('File', array($img->getAttribute('src'), $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen)); + $headers = $file->headers; + + if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) + { + if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) + { + $img->setAttribute('src', $this->image_handler . $image_url); + } + else + { + trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); + } + } + } + } + } + } + + // Remove the DOCTYPE + // Seems to cause segfaulting if we don't do this + if ($document->firstChild instanceof DOMDocumentType) + { + $document->removeChild($document->firstChild); + } + + // Move everything from the body to the root + $real_body = $document->getElementsByTagName('body')->item(0)->childNodes->item(0); + $document->replaceChild($real_body, $document->firstChild); + + // Finally, convert to a HTML string + $data = trim($document->saveHTML()); + + if ($this->remove_div) + { + $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data); + $data = preg_replace('/<\/div>$/', '', $data); + } + else + { + $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data); + } + } + + if ($type & SIMPLEPIE_CONSTRUCT_IRI) + { + $absolute = $this->registry->call('Misc', 'absolutize_url', array($data, $base)); + if ($absolute !== false) + { + $data = $absolute; + } + } + + if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI)) + { + $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); + } + + if ($this->output_encoding !== 'UTF-8') + { + $data = $this->registry->call('Misc', 'change_encoding', array($data, 'UTF-8', $this->output_encoding)); + } + } + return $data; + } + + protected function preprocess($html, $type) + { + $ret = ''; + if ($type & ~SIMPLEPIE_CONSTRUCT_XHTML) + { + // Atom XHTML constructs are wrapped with a div by default + // Note: No protection if $html contains a stray </div>! + $html = '<div>' . $html . '</div>'; + $ret .= '<!DOCTYPE html>'; + $content_type = 'text/html'; + } + else + { + $ret .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'; + $content_type = 'application/xhtml+xml'; + } + + $ret .= '<html><head>'; + $ret .= '<meta http-equiv="Content-Type" content="' . $content_type . '; charset=utf-8" />'; + $ret .= '</head><body>' . $html . '</body></html>'; + return $ret; + } + + public function replace_urls($document, $tag, $attributes) + { + if (!is_array($attributes)) + { + $attributes = array($attributes); + } + + if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags)) + { + $elements = $document->getElementsByTagName($tag); + foreach ($elements as $element) + { + foreach ($attributes as $attribute) + { + if ($element->hasAttribute($attribute)) + { + $value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base)); + if ($value !== false) + { + $element->setAttribute($attribute, $value); + } + } + } + } + } + } + + public function do_strip_htmltags($match) + { + if ($this->encode_instead_of_strip) + { + if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style'))) + { + $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8'); + $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8'); + return "<$match[1]$match[2]>$match[3]</$match[1]>"; + } + else + { + return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8'); + } + } + elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style'))) + { + return $match[4]; + } + else + { + return ''; + } + } + + protected function strip_tag($tag, $document, $type) + { + $xpath = new DOMXPath($document); + $elements = $xpath->query('body//' . $tag); + if ($this->encode_instead_of_strip) + { + foreach ($elements as $element) + { + $fragment = $document->createDocumentFragment(); + + // For elements which aren't script or style, include the tag itself + if (!in_array($tag, array('script', 'style'))) + { + $text = '<' . $tag; + if ($element->hasAttributes()) + { + $attrs = array(); + foreach ($element->attributes as $name => $attr) + { + $value = $attr->value; + + // In XHTML, empty values should never exist, so we repeat the value + if (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_XHTML)) + { + $value = $name; + } + // For HTML, empty is fine + elseif (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_HTML)) + { + $attrs[] = $name; + continue; + } + + // Standard attribute text + $attrs[] = $name . '="' . $attr->value . '"'; + } + $text .= ' ' . implode(' ', $attrs); + } + $text .= '>'; + $fragment->appendChild(new DOMText($text)); + } + + $number = $element->childNodes->length; + for ($i = $number; $i > 0; $i--) + { + $child = $element->childNodes->item(0); + $fragment->appendChild($child); + } + + if (!in_array($tag, array('script', 'style'))) + { + $fragment->appendChild(new DOMText('</' . $tag . '>')); + } + + $element->parentNode->replaceChild($fragment, $element); + } + + return; + } + elseif (in_array($tag, array('script', 'style'))) + { + foreach ($elements as $element) + { + $element->parentNode->removeChild($element); + } + + return; + } + else + { + foreach ($elements as $element) + { + $fragment = $document->createDocumentFragment(); + $number = $element->childNodes->length; + for ($i = $number; $i > 0; $i--) + { + $child = $element->childNodes->item(0); + $fragment->appendChild($child); + } + + $element->parentNode->replaceChild($fragment, $element); + } + } + } + + protected function strip_attr($attrib, $document) + { + $xpath = new DOMXPath($document); + $elements = $xpath->query('//*[@' . $attrib . ']'); + + foreach ($elements as $element) + { + $element->removeAttribute($attrib); + } + } +} diff --git a/wp-includes/SimplePie/Source.php b/wp-includes/SimplePie/Source.php new file mode 100644 index 0000000..51d8e6c --- /dev/null +++ b/wp-includes/SimplePie/Source.php @@ -0,0 +1,611 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + +/** + * Handles `<atom:source>` + * + * Used by {@see SimplePie_Item::get_source()} + * + * This class can be overloaded with {@see SimplePie::set_source_class()} + * + * @package SimplePie + * @subpackage API + */ +class SimplePie_Source +{ + var $item; + var $data = array(); + protected $registry; + + public function __construct($item, $data) + { + $this->item = $item; + $this->data = $data; + } + + public function set_registry(SimplePie_Registry $registry) + { + $this->registry = $registry; + } + + public function __toString() + { + return md5(serialize($this->data)); + } + + public function get_source_tags($namespace, $tag) + { + if (isset($this->data['child'][$namespace][$tag])) + { + return $this->data['child'][$namespace][$tag]; + } + else + { + return null; + } + } + + public function get_base($element = array()) + { + return $this->item->get_base($element); + } + + public function sanitize($data, $type, $base = '') + { + return $this->item->sanitize($data, $type, $base); + } + + public function get_item() + { + return $this->item; + } + + public function get_title() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + public function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + public function get_categories() + { + $categories = array(); + + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['attribs']['']['term'])) + { + $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) + { + // This is really the label, but keep this as the term also for BC. + // Label will also work on retrieving because that falls back to term. + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + if (isset($category['attribs']['']['domain'])) + { + $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = null; + } + $categories[] = $this->registry->create('Category', array($term, $scheme, null)); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) + { + $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) + { + $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + + if (!empty($categories)) + { + return array_unique($categories); + } + else + { + return null; + } + } + + public function get_author($key = 0) + { + $authors = $this->get_authors(); + if (isset($authors[$key])) + { + return $authors[$key]; + } + else + { + return null; + } + } + + public function get_authors() + { + $authors = array(); + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) + { + $name = null; + $uri = null; + $email = null; + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $authors[] = $this->registry->create('Author', array($name, $uri, $email)); + } + } + if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) + { + $name = null; + $url = null; + $email = null; + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $authors[] = $this->registry->create('Author', array($name, $url, $email)); + } + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) + { + $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) + { + $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) + { + $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + + if (!empty($authors)) + { + return array_unique($authors); + } + else + { + return null; + } + } + + public function get_contributor($key = 0) + { + $contributors = $this->get_contributors(); + if (isset($contributors[$key])) + { + return $contributors[$key]; + } + else + { + return null; + } + } + + public function get_contributors() + { + $contributors = array(); + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) + { + $name = null; + $uri = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $contributors[] = $this->registry->create('Author', array($name, $uri, $email)); + } + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) + { + $name = null; + $url = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $contributors[] = $this->registry->create('Author', array($name, $url, $email)); + } + } + + if (!empty($contributors)) + { + return array_unique($contributors); + } + else + { + return null; + } + } + + public function get_link($key = 0, $rel = 'alternate') + { + $links = $this->get_links($rel); + if (isset($links[$key])) + { + return $links[$key]; + } + else + { + return null; + } + } + + /** + * Added for parity between the parent-level and the item/entry-level. + */ + public function get_permalink() + { + return $this->get_link(0); + } + + public function get_links($rel = 'alternate') + { + if (!isset($this->data['links'])) + { + $this->data['links'] = array(); + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) + { + foreach ($links as $link) + { + if (isset($link['attribs']['']['href'])) + { + $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; + $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + } + } + } + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) + { + foreach ($links as $link) + { + if (isset($link['attribs']['']['href'])) + { + $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; + $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + + } + } + } + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + + $keys = array_keys($this->data['links']); + foreach ($keys as $key) + { + if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key))) + { + if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) + { + $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); + $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; + } + else + { + $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; + } + } + elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) + { + $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; + } + $this->data['links'][$key] = array_unique($this->data['links'][$key]); + } + } + + if (isset($this->data['links'][$rel])) + { + return $this->data['links'][$rel]; + } + else + { + return null; + } + } + + public function get_description() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + else + { + return null; + } + } + + public function get_copyright() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + public function get_language() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (isset($this->data['xml_lang'])) + { + return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + public function get_latitude() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) + { + return (float) $return[0]['data']; + } + elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) + { + return (float) $match[1]; + } + else + { + return null; + } + } + + public function get_longitude() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) + { + return (float) $return[0]['data']; + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) + { + return (float) $return[0]['data']; + } + elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) + { + return (float) $match[2]; + } + else + { + return null; + } + } + + public function get_image_url() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) + { + return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + else + { + return null; + } + } +} + diff --git a/wp-includes/SimplePie/XML/Declaration/Parser.php b/wp-includes/SimplePie/XML/Declaration/Parser.php new file mode 100644 index 0000000..aec19f1 --- /dev/null +++ b/wp-includes/SimplePie/XML/Declaration/Parser.php @@ -0,0 +1,362 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + + +/** + * Parses the XML Declaration + * + * @package SimplePie + * @subpackage Parsing + */ +class SimplePie_XML_Declaration_Parser +{ + /** + * XML Version + * + * @access public + * @var string + */ + var $version = '1.0'; + + /** + * Encoding + * + * @access public + * @var string + */ + var $encoding = 'UTF-8'; + + /** + * Standalone + * + * @access public + * @var bool + */ + var $standalone = false; + + /** + * Current state of the state machine + * + * @access private + * @var string + */ + var $state = 'before_version_name'; + + /** + * Input data + * + * @access private + * @var string + */ + var $data = ''; + + /** + * Input data length (to avoid calling strlen() everytime this is needed) + * + * @access private + * @var int + */ + var $data_length = 0; + + /** + * Current position of the pointer + * + * @var int + * @access private + */ + var $position = 0; + + /** + * Create an instance of the class with the input data + * + * @access public + * @param string $data Input data + */ + public function __construct($data) + { + $this->data = $data; + $this->data_length = strlen($this->data); + } + + /** + * Parse the input data + * + * @access public + * @return bool true on success, false on failure + */ + public function parse() + { + while ($this->state && $this->state !== 'emit' && $this->has_data()) + { + $state = $this->state; + $this->$state(); + } + $this->data = ''; + if ($this->state === 'emit') + { + return true; + } + else + { + $this->version = ''; + $this->encoding = ''; + $this->standalone = ''; + return false; + } + } + + /** + * Check whether there is data beyond the pointer + * + * @access private + * @return bool true if there is further data, false if not + */ + public function has_data() + { + return (bool) ($this->position < $this->data_length); + } + + /** + * Advance past any whitespace + * + * @return int Number of whitespace characters passed + */ + public function skip_whitespace() + { + $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position); + $this->position += $whitespace; + return $whitespace; + } + + /** + * Read value + */ + public function get_value() + { + $quote = substr($this->data, $this->position, 1); + if ($quote === '"' || $quote === "'") + { + $this->position++; + $len = strcspn($this->data, $quote, $this->position); + if ($this->has_data()) + { + $value = substr($this->data, $this->position, $len); + $this->position += $len + 1; + return $value; + } + } + return false; + } + + public function before_version_name() + { + if ($this->skip_whitespace()) + { + $this->state = 'version_name'; + } + else + { + $this->state = false; + } + } + + public function version_name() + { + if (substr($this->data, $this->position, 7) === 'version') + { + $this->position += 7; + $this->skip_whitespace(); + $this->state = 'version_equals'; + } + else + { + $this->state = false; + } + } + + public function version_equals() + { + if (substr($this->data, $this->position, 1) === '=') + { + $this->position++; + $this->skip_whitespace(); + $this->state = 'version_value'; + } + else + { + $this->state = false; + } + } + + public function version_value() + { + if ($this->version = $this->get_value()) + { + $this->skip_whitespace(); + if ($this->has_data()) + { + $this->state = 'encoding_name'; + } + else + { + $this->state = 'emit'; + } + } + else + { + $this->state = false; + } + } + + public function encoding_name() + { + if (substr($this->data, $this->position, 8) === 'encoding') + { + $this->position += 8; + $this->skip_whitespace(); + $this->state = 'encoding_equals'; + } + else + { + $this->state = 'standalone_name'; + } + } + + public function encoding_equals() + { + if (substr($this->data, $this->position, 1) === '=') + { + $this->position++; + $this->skip_whitespace(); + $this->state = 'encoding_value'; + } + else + { + $this->state = false; + } + } + + public function encoding_value() + { + if ($this->encoding = $this->get_value()) + { + $this->skip_whitespace(); + if ($this->has_data()) + { + $this->state = 'standalone_name'; + } + else + { + $this->state = 'emit'; + } + } + else + { + $this->state = false; + } + } + + public function standalone_name() + { + if (substr($this->data, $this->position, 10) === 'standalone') + { + $this->position += 10; + $this->skip_whitespace(); + $this->state = 'standalone_equals'; + } + else + { + $this->state = false; + } + } + + public function standalone_equals() + { + if (substr($this->data, $this->position, 1) === '=') + { + $this->position++; + $this->skip_whitespace(); + $this->state = 'standalone_value'; + } + else + { + $this->state = false; + } + } + + public function standalone_value() + { + if ($standalone = $this->get_value()) + { + switch ($standalone) + { + case 'yes': + $this->standalone = true; + break; + + case 'no': + $this->standalone = false; + break; + + default: + $this->state = false; + return; + } + + $this->skip_whitespace(); + if ($this->has_data()) + { + $this->state = false; + } + else + { + $this->state = 'emit'; + } + } + else + { + $this->state = false; + } + } +} diff --git a/wp-includes/SimplePie/gzdecode.php b/wp-includes/SimplePie/gzdecode.php new file mode 100644 index 0000000..52e024e --- /dev/null +++ b/wp-includes/SimplePie/gzdecode.php @@ -0,0 +1,371 @@ +<?php +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + + +/** + * Decode 'gzip' encoded HTTP data + * + * @package SimplePie + * @subpackage HTTP + * @link http://www.gzip.org/format.txt + */ +class SimplePie_gzdecode +{ + /** + * Compressed data + * + * @access private + * @var string + * @see gzdecode::$data + */ + var $compressed_data; + + /** + * Size of compressed data + * + * @access private + * @var int + */ + var $compressed_size; + + /** + * Minimum size of a valid gzip string + * + * @access private + * @var int + */ + var $min_compressed_size = 18; + + /** + * Current position of pointer + * + * @access private + * @var int + */ + var $position = 0; + + /** + * Flags (FLG) + * + * @access private + * @var int + */ + var $flags; + + /** + * Uncompressed data + * + * @access public + * @see gzdecode::$compressed_data + * @var string + */ + var $data; + + /** + * Modified time + * + * @access public + * @var int + */ + var $MTIME; + + /** + * Extra Flags + * + * @access public + * @var int + */ + var $XFL; + + /** + * Operating System + * + * @access public + * @var int + */ + var $OS; + + /** + * Subfield ID 1 + * + * @access public + * @see gzdecode::$extra_field + * @see gzdecode::$SI2 + * @var string + */ + var $SI1; + + /** + * Subfield ID 2 + * + * @access public + * @see gzdecode::$extra_field + * @see gzdecode::$SI1 + * @var string + */ + var $SI2; + + /** + * Extra field content + * + * @access public + * @see gzdecode::$SI1 + * @see gzdecode::$SI2 + * @var string + */ + var $extra_field; + + /** + * Original filename + * + * @access public + * @var string + */ + var $filename; + + /** + * Human readable comment + * + * @access public + * @var string + */ + var $comment; + + /** + * Don't allow anything to be set + * + * @param string $name + * @param mixed $value + */ + public function __set($name, $value) + { + trigger_error("Cannot write property $name", E_USER_ERROR); + } + + /** + * Set the compressed string and related properties + * + * @param string $data + */ + public function __construct($data) + { + $this->compressed_data = $data; + $this->compressed_size = strlen($data); + } + + /** + * Decode the GZIP stream + * + * @return bool Successfulness + */ + public function parse() + { + if ($this->compressed_size >= $this->min_compressed_size) + { + // Check ID1, ID2, and CM + if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08") + { + return false; + } + + // Get the FLG (FLaGs) + $this->flags = ord($this->compressed_data[3]); + + // FLG bits above (1 << 4) are reserved + if ($this->flags > 0x1F) + { + return false; + } + + // Advance the pointer after the above + $this->position += 4; + + // MTIME + $mtime = substr($this->compressed_data, $this->position, 4); + // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness + if (current(unpack('S', "\x00\x01")) === 1) + { + $mtime = strrev($mtime); + } + $this->MTIME = current(unpack('l', $mtime)); + $this->position += 4; + + // Get the XFL (eXtra FLags) + $this->XFL = ord($this->compressed_data[$this->position++]); + + // Get the OS (Operating System) + $this->OS = ord($this->compressed_data[$this->position++]); + + // Parse the FEXTRA + if ($this->flags & 4) + { + // Read subfield IDs + $this->SI1 = $this->compressed_data[$this->position++]; + $this->SI2 = $this->compressed_data[$this->position++]; + + // SI2 set to zero is reserved for future use + if ($this->SI2 === "\x00") + { + return false; + } + + // Get the length of the extra field + $len = current(unpack('v', substr($this->compressed_data, $this->position, 2))); + $this->position += 2; + + // Check the length of the string is still valid + $this->min_compressed_size += $len + 4; + if ($this->compressed_size >= $this->min_compressed_size) + { + // Set the extra field to the given data + $this->extra_field = substr($this->compressed_data, $this->position, $len); + $this->position += $len; + } + else + { + return false; + } + } + + // Parse the FNAME + if ($this->flags & 8) + { + // Get the length of the filename + $len = strcspn($this->compressed_data, "\x00", $this->position); + + // Check the length of the string is still valid + $this->min_compressed_size += $len + 1; + if ($this->compressed_size >= $this->min_compressed_size) + { + // Set the original filename to the given string + $this->filename = substr($this->compressed_data, $this->position, $len); + $this->position += $len + 1; + } + else + { + return false; + } + } + + // Parse the FCOMMENT + if ($this->flags & 16) + { + // Get the length of the comment + $len = strcspn($this->compressed_data, "\x00", $this->position); + + // Check the length of the string is still valid + $this->min_compressed_size += $len + 1; + if ($this->compressed_size >= $this->min_compressed_size) + { + // Set the original comment to the given string + $this->comment = substr($this->compressed_data, $this->position, $len); + $this->position += $len + 1; + } + else + { + return false; + } + } + + // Parse the FHCRC + if ($this->flags & 2) + { + // Check the length of the string is still valid + $this->min_compressed_size += $len + 2; + if ($this->compressed_size >= $this->min_compressed_size) + { + // Read the CRC + $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2))); + + // Check the CRC matches + if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc) + { + $this->position += 2; + } + else + { + return false; + } + } + else + { + return false; + } + } + + // Decompress the actual data + if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false) + { + return false; + } + else + { + $this->position = $this->compressed_size - 8; + } + + // Check CRC of data + $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4))); + $this->position += 4; + /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc)) + { + return false; + }*/ + + // Check ISIZE of data + $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4))); + $this->position += 4; + if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize)) + { + return false; + } + + // Wow, against all odds, we've actually got a valid gzip string + return true; + } + else + { + return false; + } + } +} diff --git a/wp-includes/Text/Diff.php b/wp-includes/Text/Diff.php new file mode 100644 index 0000000..edcdd3a --- /dev/null +++ b/wp-includes/Text/Diff.php @@ -0,0 +1,506 @@ +<?php +/** + * General API for generating and formatting diffs - the differences between + * two sequences of strings. + * + * The original PHP version of this code was written by Geoffrey T. Dairiki + * <dairiki@dairiki.org>, and is used/adapted with his permission. + * + * Copyright 2004 Geoffrey T. Dairiki <dairiki@dairiki.org> + * Copyright 2004-2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + */ +class Text_Diff { + + /** + * Array of changes. + * + * @var array + */ + var $_edits; + + /** + * Computes diffs between sequences of strings. + * + * @param string $engine Name of the diffing engine to use. 'auto' + * will automatically select the best. + * @param array $params Parameters to pass to the diffing engine. + * Normally an array of two arrays, each + * containing the lines from a file. + */ + function __construct( $engine, $params ) + { + // Backward compatibility workaround. + if (!is_string($engine)) { + $params = array($engine, $params); + $engine = 'auto'; + } + + if ($engine == 'auto') { + $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; + } else { + $engine = basename($engine); + } + + // WP #7391 + require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; + $class = 'Text_Diff_Engine_' . $engine; + $diff_engine = new $class(); + + $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); + } + + /** + * PHP4 constructor. + */ + public function Text_Diff( $engine, $params ) { + self::__construct( $engine, $params ); + } + + /** + * Returns the array of differences. + */ + function getDiff() + { + return $this->_edits; + } + + /** + * returns the number of new (added) lines in a given diff. + * + * @since Text_Diff 1.1.0 + * + * @return integer The number of new lines + */ + function countAddedLines() + { + $count = 0; + foreach ($this->_edits as $edit) { + if (is_a($edit, 'Text_Diff_Op_add') || + is_a($edit, 'Text_Diff_Op_change')) { + $count += $edit->nfinal(); + } + } + return $count; + } + + /** + * Returns the number of deleted (removed) lines in a given diff. + * + * @since Text_Diff 1.1.0 + * + * @return integer The number of deleted lines + */ + function countDeletedLines() + { + $count = 0; + foreach ($this->_edits as $edit) { + if (is_a($edit, 'Text_Diff_Op_delete') || + is_a($edit, 'Text_Diff_Op_change')) { + $count += $edit->norig(); + } + } + return $count; + } + + /** + * Computes a reversed diff. + * + * Example: + * <code> + * $diff = new Text_Diff($lines1, $lines2); + * $rev = $diff->reverse(); + * </code> + * + * @return Text_Diff A Diff object representing the inverse of the + * original diff. Note that we purposely don't return a + * reference here, since this essentially is a clone() + * method. + */ + function reverse() + { + if (version_compare(zend_version(), '2', '>')) { + $rev = clone($this); + } else { + $rev = $this; + } + $rev->_edits = array(); + foreach ($this->_edits as $edit) { + $rev->_edits[] = $edit->reverse(); + } + return $rev; + } + + /** + * Checks for an empty diff. + * + * @return boolean True if two sequences were identical. + */ + function isEmpty() + { + foreach ($this->_edits as $edit) { + if (!is_a($edit, 'Text_Diff_Op_copy')) { + return false; + } + } + return true; + } + + /** + * Computes the length of the Longest Common Subsequence (LCS). + * + * This is mostly for diagnostic purposes. + * + * @return integer The length of the LCS. + */ + function lcs() + { + $lcs = 0; + foreach ($this->_edits as $edit) { + if (is_a($edit, 'Text_Diff_Op_copy')) { + $lcs += count($edit->orig); + } + } + return $lcs; + } + + /** + * Gets the original set of lines. + * + * This reconstructs the $from_lines parameter passed to the constructor. + * + * @return array The original sequence of strings. + */ + function getOriginal() + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->orig) { + array_splice($lines, count($lines), 0, $edit->orig); + } + } + return $lines; + } + + /** + * Gets the final set of lines. + * + * This reconstructs the $to_lines parameter passed to the constructor. + * + * @return array The sequence of strings. + */ + function getFinal() + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->final) { + array_splice($lines, count($lines), 0, $edit->final); + } + } + return $lines; + } + + /** + * Removes trailing newlines from a line of text. This is meant to be used + * with array_walk(). + * + * @param string $line The line to trim. + * @param integer $key The index of the line in the array. Not used. + */ + static function trimNewlines(&$line, $key) + { + $line = str_replace(array("\n", "\r"), '', $line); + } + + /** + * Determines the location of the system temporary directory. + * + * @static + * + * @access protected + * + * @return string A directory name which can be used for temp files. + * Returns false if one could not be found. + */ + function _getTempDir() + { + $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', + 'c:\windows\temp', 'c:\winnt\temp'); + + /* Try PHP's upload_tmp_dir directive. */ + $tmp = ini_get('upload_tmp_dir'); + + /* Otherwise, try to determine the TMPDIR environment variable. */ + if (!strlen($tmp)) { + $tmp = getenv('TMPDIR'); + } + + /* If we still cannot determine a value, then cycle through a list of + * preset possibilities. */ + while (!strlen($tmp) && count($tmp_locations)) { + $tmp_check = array_shift($tmp_locations); + if (@is_dir($tmp_check)) { + $tmp = $tmp_check; + } + } + + /* If it is still empty, we have failed, so return false; otherwise + * return the directory determined. */ + return strlen($tmp) ? $tmp : false; + } + + /** + * Checks a diff for validity. + * + * This is here only for debugging purposes. + */ + function _check($from_lines, $to_lines) + { + if (serialize($from_lines) != serialize($this->getOriginal())) { + trigger_error("Reconstructed original doesn't match", E_USER_ERROR); + } + if (serialize($to_lines) != serialize($this->getFinal())) { + trigger_error("Reconstructed final doesn't match", E_USER_ERROR); + } + + $rev = $this->reverse(); + if (serialize($to_lines) != serialize($rev->getOriginal())) { + trigger_error("Reversed original doesn't match", E_USER_ERROR); + } + if (serialize($from_lines) != serialize($rev->getFinal())) { + trigger_error("Reversed final doesn't match", E_USER_ERROR); + } + + $prevtype = null; + foreach ($this->_edits as $edit) { + if ($prevtype == get_class($edit)) { + trigger_error("Edit sequence is non-optimal", E_USER_ERROR); + } + $prevtype = get_class($edit); + } + + return true; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + */ +class Text_MappedDiff extends Text_Diff { + + /** + * Computes a diff between sequences of strings. + * + * This can be used to compute things like case-insensitve diffs, or diffs + * which ignore changes in white-space. + * + * @param array $from_lines An array of strings. + * @param array $to_lines An array of strings. + * @param array $mapped_from_lines This array should have the same size + * number of elements as $from_lines. The + * elements in $mapped_from_lines and + * $mapped_to_lines are what is actually + * compared when computing the diff. + * @param array $mapped_to_lines This array should have the same number + * of elements as $to_lines. + */ + function __construct($from_lines, $to_lines, + $mapped_from_lines, $mapped_to_lines) + { + assert(count($from_lines) == count($mapped_from_lines)); + assert(count($to_lines) == count($mapped_to_lines)); + + parent::Text_Diff($mapped_from_lines, $mapped_to_lines); + + $xi = $yi = 0; + for ($i = 0; $i < count($this->_edits); $i++) { + $orig = &$this->_edits[$i]->orig; + if (is_array($orig)) { + $orig = array_slice($from_lines, $xi, count($orig)); + $xi += count($orig); + } + + $final = &$this->_edits[$i]->final; + if (is_array($final)) { + $final = array_slice($to_lines, $yi, count($final)); + $yi += count($final); + } + } + } + + /** + * PHP4 constructor. + */ + public function Text_MappedDiff( $from_lines, $to_lines, + $mapped_from_lines, $mapped_to_lines ) { + self::__construct( $from_lines, $to_lines, + $mapped_from_lines, $mapped_to_lines ); + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op { + + var $orig; + var $final; + + function &reverse() + { + trigger_error('Abstract method', E_USER_ERROR); + } + + function norig() + { + return $this->orig ? count($this->orig) : 0; + } + + function nfinal() + { + return $this->final ? count($this->final) : 0; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op_copy extends Text_Diff_Op { + + /** + * PHP5 constructor. + */ + function __construct( $orig, $final = false ) + { + if (!is_array($final)) { + $final = $orig; + } + $this->orig = $orig; + $this->final = $final; + } + + /** + * PHP4 constructor. + */ + public function Text_Diff_Op_copy( $orig, $final = false ) { + self::__construct( $orig, $final ); + } + + function &reverse() + { + $reverse = new Text_Diff_Op_copy($this->final, $this->orig); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op_delete extends Text_Diff_Op { + + /** + * PHP5 constructor. + */ + function __construct( $lines ) + { + $this->orig = $lines; + $this->final = false; + } + + /** + * PHP4 constructor. + */ + public function Text_Diff_Op_delete( $lines ) { + self::__construct( $lines ); + } + + function &reverse() + { + $reverse = new Text_Diff_Op_add($this->orig); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op_add extends Text_Diff_Op { + + /** + * PHP5 constructor. + */ + function __construct( $lines ) + { + $this->final = $lines; + $this->orig = false; + } + + /** + * PHP4 constructor. + */ + public function Text_Diff_Op_add( $lines ) { + self::__construct( $lines ); + } + + function &reverse() + { + $reverse = new Text_Diff_Op_delete($this->final); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op_change extends Text_Diff_Op { + + /** + * PHP5 constructor. + */ + function __construct( $orig, $final ) + { + $this->orig = $orig; + $this->final = $final; + } + + /** + * PHP4 constructor. + */ + public function Text_Diff_Op_change( $orig, $final ) { + self::__construct( $orig, $final ); + } + + function &reverse() + { + $reverse = new Text_Diff_Op_change($this->final, $this->orig); + return $reverse; + } + +} diff --git a/wp-includes/Text/Diff/Engine/native.php b/wp-includes/Text/Diff/Engine/native.php new file mode 100644 index 0000000..5824329 --- /dev/null +++ b/wp-includes/Text/Diff/Engine/native.php @@ -0,0 +1,438 @@ +<?php +/** + * Class used internally by Text_Diff to actually compute the diffs. + * + * This class is implemented using native PHP code. + * + * The algorithm used here is mostly lifted from the perl module + * Algorithm::Diff (version 1.06) by Ned Konz, which is available at: + * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip + * + * More ideas are taken from: http://www.ics.uci.edu/~eppstein/161/960229.html + * + * Some ideas (and a bit of code) are taken from analyze.c, of GNU + * diffutils-2.7, which can be found at: + * ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz + * + * Some ideas (subdivision by NCHUNKS > 2, and some optimizations) are from + * Geoffrey T. Dairiki <dairiki@dairiki.org>. The original PHP version of this + * code was written by him, and is used/adapted with his permission. + * + * Copyright 2004-2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * @package Text_Diff + */ +class Text_Diff_Engine_native { + + function diff($from_lines, $to_lines) + { + array_walk($from_lines, array('Text_Diff', 'trimNewlines')); + array_walk($to_lines, array('Text_Diff', 'trimNewlines')); + + $n_from = count($from_lines); + $n_to = count($to_lines); + + $this->xchanged = $this->ychanged = array(); + $this->xv = $this->yv = array(); + $this->xind = $this->yind = array(); + unset($this->seq); + unset($this->in_seq); + unset($this->lcs); + + // Skip leading common lines. + for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) { + if ($from_lines[$skip] !== $to_lines[$skip]) { + break; + } + $this->xchanged[$skip] = $this->ychanged[$skip] = false; + } + + // Skip trailing common lines. + $xi = $n_from; $yi = $n_to; + for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) { + if ($from_lines[$xi] !== $to_lines[$yi]) { + break; + } + $this->xchanged[$xi] = $this->ychanged[$yi] = false; + } + + // Ignore lines which do not exist in both files. + for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { + $xhash[$from_lines[$xi]] = 1; + } + for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { + $line = $to_lines[$yi]; + if (($this->ychanged[$yi] = empty($xhash[$line]))) { + continue; + } + $yhash[$line] = 1; + $this->yv[] = $line; + $this->yind[] = $yi; + } + for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { + $line = $from_lines[$xi]; + if (($this->xchanged[$xi] = empty($yhash[$line]))) { + continue; + } + $this->xv[] = $line; + $this->xind[] = $xi; + } + + // Find the LCS. + $this->_compareseq(0, count($this->xv), 0, count($this->yv)); + + // Merge edits when possible. + $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged); + $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged); + + // Compute the edit operations. + $edits = array(); + $xi = $yi = 0; + while ($xi < $n_from || $yi < $n_to) { + assert($yi < $n_to || $this->xchanged[$xi]); + assert($xi < $n_from || $this->ychanged[$yi]); + + // Skip matching "snake". + $copy = array(); + while ($xi < $n_from && $yi < $n_to + && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { + $copy[] = $from_lines[$xi++]; + ++$yi; + } + if ($copy) { + $edits[] = new Text_Diff_Op_copy($copy); + } + + // Find deletes & adds. + $delete = array(); + while ($xi < $n_from && $this->xchanged[$xi]) { + $delete[] = $from_lines[$xi++]; + } + + $add = array(); + while ($yi < $n_to && $this->ychanged[$yi]) { + $add[] = $to_lines[$yi++]; + } + + if ($delete && $add) { + $edits[] = new Text_Diff_Op_change($delete, $add); + } elseif ($delete) { + $edits[] = new Text_Diff_Op_delete($delete); + } elseif ($add) { + $edits[] = new Text_Diff_Op_add($add); + } + } + + return $edits; + } + + /** + * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF, + * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized + * segments. + * + * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an array of + * NCHUNKS+1 (X, Y) indexes giving the diving points between sub + * sequences. The first sub-sequence is contained in (X0, X1), (Y0, Y1), + * the second in (X1, X2), (Y1, Y2) and so on. Note that (X0, Y0) == + * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM). + * + * This function assumes that the first lines of the specified portions of + * the two files do not match, and likewise that the last lines do not + * match. The caller must trim matching lines from the beginning and end + * of the portions it is going to specify. + */ + function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) + { + $flip = false; + + if ($xlim - $xoff > $ylim - $yoff) { + /* Things seems faster (I'm not sure I understand why) when the + * shortest sequence is in X. */ + $flip = true; + list ($xoff, $xlim, $yoff, $ylim) + = array($yoff, $ylim, $xoff, $xlim); + } + + if ($flip) { + for ($i = $ylim - 1; $i >= $yoff; $i--) { + $ymatches[$this->xv[$i]][] = $i; + } + } else { + for ($i = $ylim - 1; $i >= $yoff; $i--) { + $ymatches[$this->yv[$i]][] = $i; + } + } + + $this->lcs = 0; + $this->seq[0]= $yoff - 1; + $this->in_seq = array(); + $ymids[0] = array(); + + $numer = $xlim - $xoff + $nchunks - 1; + $x = $xoff; + for ($chunk = 0; $chunk < $nchunks; $chunk++) { + if ($chunk > 0) { + for ($i = 0; $i <= $this->lcs; $i++) { + $ymids[$i][$chunk - 1] = $this->seq[$i]; + } + } + + $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks); + for (; $x < $x1; $x++) { + $line = $flip ? $this->yv[$x] : $this->xv[$x]; + if (empty($ymatches[$line])) { + continue; + } + $matches = $ymatches[$line]; + reset($matches); + while ($y = current($matches)) { + if (empty($this->in_seq[$y])) { + $k = $this->_lcsPos($y); + assert($k > 0); + $ymids[$k] = $ymids[$k - 1]; + break; + } + next($matches); + } + while ($y = current($matches)) { + if ($y > $this->seq[$k - 1]) { + assert($y <= $this->seq[$k]); + /* Optimization: this is a common case: next match is + * just replacing previous match. */ + $this->in_seq[$this->seq[$k]] = false; + $this->seq[$k] = $y; + $this->in_seq[$y] = 1; + } elseif (empty($this->in_seq[$y])) { + $k = $this->_lcsPos($y); + assert($k > 0); + $ymids[$k] = $ymids[$k - 1]; + } + next($matches); + } + } + } + + $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff); + $ymid = $ymids[$this->lcs]; + for ($n = 0; $n < $nchunks - 1; $n++) { + $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks); + $y1 = $ymid[$n] + 1; + $seps[] = $flip ? array($y1, $x1) : array($x1, $y1); + } + $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim); + + return array($this->lcs, $seps); + } + + function _lcsPos($ypos) + { + $end = $this->lcs; + if ($end == 0 || $ypos > $this->seq[$end]) { + $this->seq[++$this->lcs] = $ypos; + $this->in_seq[$ypos] = 1; + return $this->lcs; + } + + $beg = 1; + while ($beg < $end) { + $mid = (int)(($beg + $end) / 2); + if ($ypos > $this->seq[$mid]) { + $beg = $mid + 1; + } else { + $end = $mid; + } + } + + assert($ypos != $this->seq[$end]); + + $this->in_seq[$this->seq[$end]] = false; + $this->seq[$end] = $ypos; + $this->in_seq[$ypos] = 1; + return $end; + } + + /** + * Finds LCS of two sequences. + * + * The results are recorded in the vectors $this->{x,y}changed[], by + * storing a 1 in the element for each line that is an insertion or + * deletion (ie. is not in the LCS). + * + * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1. + * + * Note that XLIM, YLIM are exclusive bounds. All line numbers are + * origin-0 and discarded lines are not counted. + */ + function _compareseq ($xoff, $xlim, $yoff, $ylim) + { + /* Slide down the bottom initial diagonal. */ + while ($xoff < $xlim && $yoff < $ylim + && $this->xv[$xoff] == $this->yv[$yoff]) { + ++$xoff; + ++$yoff; + } + + /* Slide up the top initial diagonal. */ + while ($xlim > $xoff && $ylim > $yoff + && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { + --$xlim; + --$ylim; + } + + if ($xoff == $xlim || $yoff == $ylim) { + $lcs = 0; + } else { + /* This is ad hoc but seems to work well. $nchunks = + * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks = + * max(2,min(8,(int)$nchunks)); */ + $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1; + list($lcs, $seps) + = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks); + } + + if ($lcs == 0) { + /* X and Y sequences have no common subsequence: mark all + * changed. */ + while ($yoff < $ylim) { + $this->ychanged[$this->yind[$yoff++]] = 1; + } + while ($xoff < $xlim) { + $this->xchanged[$this->xind[$xoff++]] = 1; + } + } else { + /* Use the partitions to split this problem into subproblems. */ + reset($seps); + $pt1 = $seps[0]; + while ($pt2 = next($seps)) { + $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]); + $pt1 = $pt2; + } + } + } + + /** + * Adjusts inserts/deletes of identical lines to join changes as much as + * possible. + * + * We do something when a run of changed lines include a line at one end + * and has an excluded, identical line at the other. We are free to + * choose which identical line is included. `compareseq' usually chooses + * the one at the beginning, but usually it is cleaner to consider the + * following identical line to be the "change". + * + * This is extracted verbatim from analyze.c (GNU diffutils-2.7). + */ + function _shiftBoundaries($lines, &$changed, $other_changed) + { + $i = 0; + $j = 0; + + assert(count($lines) == count($changed)); + $len = count($lines); + $other_len = count($other_changed); + + while (1) { + /* Scan forward to find the beginning of another run of + * changes. Also keep track of the corresponding point in the + * other file. + * + * Throughout this code, $i and $j are adjusted together so that + * the first $i elements of $changed and the first $j elements of + * $other_changed both contain the same number of zeros (unchanged + * lines). + * + * Furthermore, $j is always kept so that $j == $other_len or + * $other_changed[$j] == false. */ + while ($j < $other_len && $other_changed[$j]) { + $j++; + } + + while ($i < $len && ! $changed[$i]) { + assert($j < $other_len && ! $other_changed[$j]); + $i++; $j++; + while ($j < $other_len && $other_changed[$j]) { + $j++; + } + } + + if ($i == $len) { + break; + } + + $start = $i; + + /* Find the end of this run of changes. */ + while (++$i < $len && $changed[$i]) { + continue; + } + + do { + /* Record the length of this run of changes, so that we can + * later determine whether the run has grown. */ + $runlength = $i - $start; + + /* Move the changed region back, so long as the previous + * unchanged line matches the last changed one. This merges + * with previous changed regions. */ + while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) { + $changed[--$start] = 1; + $changed[--$i] = false; + while ($start > 0 && $changed[$start - 1]) { + $start--; + } + assert($j > 0); + while ($other_changed[--$j]) { + continue; + } + assert($j >= 0 && !$other_changed[$j]); + } + + /* Set CORRESPONDING to the end of the changed run, at the + * last point where it corresponds to a changed run in the + * other file. CORRESPONDING == LEN means no such point has + * been found. */ + $corresponding = $j < $other_len ? $i : $len; + + /* Move the changed region forward, so long as the first + * changed line matches the following unchanged one. This + * merges with following changed regions. Do this second, so + * that if there are no merges, the changed region is moved + * forward as far as possible. */ + while ($i < $len && $lines[$start] == $lines[$i]) { + $changed[$start++] = false; + $changed[$i++] = 1; + while ($i < $len && $changed[$i]) { + $i++; + } + + assert($j < $other_len && ! $other_changed[$j]); + $j++; + if ($j < $other_len && $other_changed[$j]) { + $corresponding = $i; + while ($j < $other_len && $other_changed[$j]) { + $j++; + } + } + } + } while ($runlength != $i - $start); + + /* If possible, move the fully-merged run of changes back to a + * corresponding run in the other file. */ + while ($corresponding < $i) { + $changed[--$start] = 1; + $changed[--$i] = 0; + assert($j > 0); + while ($other_changed[--$j]) { + continue; + } + assert($j >= 0 && !$other_changed[$j]); + } + } + } + +} diff --git a/wp-includes/Text/Diff/Engine/shell.php b/wp-includes/Text/Diff/Engine/shell.php new file mode 100644 index 0000000..91c1843 --- /dev/null +++ b/wp-includes/Text/Diff/Engine/shell.php @@ -0,0 +1,162 @@ +<?php +/** + * Class used internally by Diff to actually compute the diffs. + * + * This class uses the Unix `diff` program via shell_exec to compute the + * differences between the two input arrays. + * + * Copyright 2007-2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @author Milian Wolff <mail@milianw.de> + * @package Text_Diff + * @since 0.3.0 + */ +class Text_Diff_Engine_shell { + + /** + * Path to the diff executable + * + * @var string + */ + var $_diffCommand = 'diff'; + + /** + * Returns the array of differences. + * + * @param array $from_lines lines of text from old file + * @param array $to_lines lines of text from new file + * + * @return array all changes made (array with Text_Diff_Op_* objects) + */ + function diff($from_lines, $to_lines) + { + array_walk($from_lines, array('Text_Diff', 'trimNewlines')); + array_walk($to_lines, array('Text_Diff', 'trimNewlines')); + + $temp_dir = Text_Diff::_getTempDir(); + + // Execute gnu diff or similar to get a standard diff file. + $from_file = tempnam($temp_dir, 'Text_Diff'); + $to_file = tempnam($temp_dir, 'Text_Diff'); + $fp = fopen($from_file, 'w'); + fwrite($fp, implode("\n", $from_lines)); + fclose($fp); + $fp = fopen($to_file, 'w'); + fwrite($fp, implode("\n", $to_lines)); + fclose($fp); + $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file); + unlink($from_file); + unlink($to_file); + + if (is_null($diff)) { + // No changes were made + return array(new Text_Diff_Op_copy($from_lines)); + } + + $from_line_no = 1; + $to_line_no = 1; + $edits = array(); + + // Get changed lines by parsing something like: + // 0a1,2 + // 1,2c4,6 + // 1,5d6 + preg_match_all('#^(\d+)(?:,(\d+))?([adc])(\d+)(?:,(\d+))?$#m', $diff, + $matches, PREG_SET_ORDER); + + foreach ($matches as $match) { + if (!isset($match[5])) { + // This paren is not set every time (see regex). + $match[5] = false; + } + + if ($match[3] == 'a') { + $from_line_no--; + } + + if ($match[3] == 'd') { + $to_line_no--; + } + + if ($from_line_no < $match[1] || $to_line_no < $match[4]) { + // copied lines + assert('$match[1] - $from_line_no == $match[4] - $to_line_no'); + array_push($edits, + new Text_Diff_Op_copy( + $this->_getLines($from_lines, $from_line_no, $match[1] - 1), + $this->_getLines($to_lines, $to_line_no, $match[4] - 1))); + } + + switch ($match[3]) { + case 'd': + // deleted lines + array_push($edits, + new Text_Diff_Op_delete( + $this->_getLines($from_lines, $from_line_no, $match[2]))); + $to_line_no++; + break; + + case 'c': + // changed lines + array_push($edits, + new Text_Diff_Op_change( + $this->_getLines($from_lines, $from_line_no, $match[2]), + $this->_getLines($to_lines, $to_line_no, $match[5]))); + break; + + case 'a': + // added lines + array_push($edits, + new Text_Diff_Op_add( + $this->_getLines($to_lines, $to_line_no, $match[5]))); + $from_line_no++; + break; + } + } + + if (!empty($from_lines)) { + // Some lines might still be pending. Add them as copied + array_push($edits, + new Text_Diff_Op_copy( + $this->_getLines($from_lines, $from_line_no, + $from_line_no + count($from_lines) - 1), + $this->_getLines($to_lines, $to_line_no, + $to_line_no + count($to_lines) - 1))); + } + + return $edits; + } + + /** + * Get lines from either the old or new text + * + * @access private + * + * @param array $text_lines Either $from_lines or $to_lines (passed by reference). + * @param int $line_no Current line number (passed by reference). + * @param int $end Optional end line, when we want to chop more + * than one line. + * + * @return array The chopped lines + */ + function _getLines(&$text_lines, &$line_no, $end = false) + { + if (!empty($end)) { + $lines = array(); + // We can shift even more + while ($line_no <= $end) { + array_push($lines, array_shift($text_lines)); + $line_no++; + } + } else { + $lines = array(array_shift($text_lines)); + $line_no++; + } + + return $lines; + } + +} diff --git a/wp-includes/Text/Diff/Engine/string.php b/wp-includes/Text/Diff/Engine/string.php new file mode 100644 index 0000000..76a1111 --- /dev/null +++ b/wp-includes/Text/Diff/Engine/string.php @@ -0,0 +1,248 @@ +<?php +/** + * Parses unified or context diffs output from eg. the diff utility. + * + * Example: + * <code> + * $patch = file_get_contents('example.patch'); + * $diff = new Text_Diff('string', array($patch)); + * $renderer = new Text_Diff_Renderer_inline(); + * echo $renderer->render($diff); + * </code> + * + * Copyright 2005 Örjan Persson <o@42mm.org> + * Copyright 2005-2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @author Örjan Persson <o@42mm.org> + * @package Text_Diff + * @since 0.2.0 + */ +class Text_Diff_Engine_string { + + /** + * Parses a unified or context diff. + * + * First param contains the whole diff and the second can be used to force + * a specific diff type. If the second parameter is 'autodetect', the + * diff will be examined to find out which type of diff this is. + * + * @param string $diff The diff content. + * @param string $mode The diff mode of the content in $diff. One of + * 'context', 'unified', or 'autodetect'. + * + * @return array List of all diff operations. + */ + function diff($diff, $mode = 'autodetect') + { + // Detect line breaks. + $lnbr = "\n"; + if (strpos($diff, "\r\n") !== false) { + $lnbr = "\r\n"; + } elseif (strpos($diff, "\r") !== false) { + $lnbr = "\r"; + } + + // Make sure we have a line break at the EOF. + if (substr($diff, -strlen($lnbr)) != $lnbr) { + $diff .= $lnbr; + } + + if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') { + return PEAR::raiseError('Type of diff is unsupported'); + } + + if ($mode == 'autodetect') { + $context = strpos($diff, '***'); + $unified = strpos($diff, '---'); + if ($context === $unified) { + return PEAR::raiseError('Type of diff could not be detected'); + } elseif ($context === false || $unified === false) { + $mode = $context !== false ? 'context' : 'unified'; + } else { + $mode = $context < $unified ? 'context' : 'unified'; + } + } + + // Split by new line and remove the diff header, if there is one. + $diff = explode($lnbr, $diff); + if (($mode == 'context' && strpos($diff[0], '***') === 0) || + ($mode == 'unified' && strpos($diff[0], '---') === 0)) { + array_shift($diff); + array_shift($diff); + } + + if ($mode == 'context') { + return $this->parseContextDiff($diff); + } else { + return $this->parseUnifiedDiff($diff); + } + } + + /** + * Parses an array containing the unified diff. + * + * @param array $diff Array of lines. + * + * @return array List of all diff operations. + */ + function parseUnifiedDiff($diff) + { + $edits = array(); + $end = count($diff) - 1; + for ($i = 0; $i < $end;) { + $diff1 = array(); + switch (substr($diff[$i], 0, 1)) { + case ' ': + do { + $diff1[] = substr($diff[$i], 1); + } while (++$i < $end && substr($diff[$i], 0, 1) == ' '); + $edits[] = new Text_Diff_Op_copy($diff1); + break; + + case '+': + // get all new lines + do { + $diff1[] = substr($diff[$i], 1); + } while (++$i < $end && substr($diff[$i], 0, 1) == '+'); + $edits[] = new Text_Diff_Op_add($diff1); + break; + + case '-': + // get changed or removed lines + $diff2 = array(); + do { + $diff1[] = substr($diff[$i], 1); + } while (++$i < $end && substr($diff[$i], 0, 1) == '-'); + + while ($i < $end && substr($diff[$i], 0, 1) == '+') { + $diff2[] = substr($diff[$i++], 1); + } + if (count($diff2) == 0) { + $edits[] = new Text_Diff_Op_delete($diff1); + } else { + $edits[] = new Text_Diff_Op_change($diff1, $diff2); + } + break; + + default: + $i++; + break; + } + } + + return $edits; + } + + /** + * Parses an array containing the context diff. + * + * @param array $diff Array of lines. + * + * @return array List of all diff operations. + */ + function parseContextDiff(&$diff) + { + $edits = array(); + $i = $max_i = $j = $max_j = 0; + $end = count($diff) - 1; + while ($i < $end && $j < $end) { + while ($i >= $max_i && $j >= $max_j) { + // Find the boundaries of the diff output of the two files + for ($i = $j; + $i < $end && substr($diff[$i], 0, 3) == '***'; + $i++); + for ($max_i = $i; + $max_i < $end && substr($diff[$max_i], 0, 3) != '---'; + $max_i++); + for ($j = $max_i; + $j < $end && substr($diff[$j], 0, 3) == '---'; + $j++); + for ($max_j = $j; + $max_j < $end && substr($diff[$max_j], 0, 3) != '***'; + $max_j++); + } + + // find what hasn't been changed + $array = array(); + while ($i < $max_i && + $j < $max_j && + strcmp($diff[$i], $diff[$j]) == 0) { + $array[] = substr($diff[$i], 2); + $i++; + $j++; + } + + while ($i < $max_i && ($max_j-$j) <= 1) { + if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') { + break; + } + $array[] = substr($diff[$i++], 2); + } + + while ($j < $max_j && ($max_i-$i) <= 1) { + if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') { + break; + } + $array[] = substr($diff[$j++], 2); + } + if (count($array) > 0) { + $edits[] = new Text_Diff_Op_copy($array); + } + + if ($i < $max_i) { + $diff1 = array(); + switch (substr($diff[$i], 0, 1)) { + case '!': + $diff2 = array(); + do { + $diff1[] = substr($diff[$i], 2); + if ($j < $max_j && substr($diff[$j], 0, 1) == '!') { + $diff2[] = substr($diff[$j++], 2); + } + } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!'); + $edits[] = new Text_Diff_Op_change($diff1, $diff2); + break; + + case '+': + do { + $diff1[] = substr($diff[$i], 2); + } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+'); + $edits[] = new Text_Diff_Op_add($diff1); + break; + + case '-': + do { + $diff1[] = substr($diff[$i], 2); + } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-'); + $edits[] = new Text_Diff_Op_delete($diff1); + break; + } + } + + if ($j < $max_j) { + $diff2 = array(); + switch (substr($diff[$j], 0, 1)) { + case '+': + do { + $diff2[] = substr($diff[$j++], 2); + } while ($j < $max_j && substr($diff[$j], 0, 1) == '+'); + $edits[] = new Text_Diff_Op_add($diff2); + break; + + case '-': + do { + $diff2[] = substr($diff[$j++], 2); + } while ($j < $max_j && substr($diff[$j], 0, 1) == '-'); + $edits[] = new Text_Diff_Op_delete($diff2); + break; + } + } + } + + return $edits; + } + +} diff --git a/wp-includes/Text/Diff/Engine/xdiff.php b/wp-includes/Text/Diff/Engine/xdiff.php new file mode 100644 index 0000000..02ce848 --- /dev/null +++ b/wp-includes/Text/Diff/Engine/xdiff.php @@ -0,0 +1,64 @@ +<?php +/** + * Class used internally by Diff to actually compute the diffs. + * + * This class uses the xdiff PECL package (http://pecl.php.net/package/xdiff) + * to compute the differences between the two input arrays. + * + * Copyright 2004-2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @author Jon Parise <jon@horde.org> + * @package Text_Diff + */ +class Text_Diff_Engine_xdiff { + + /** + */ + function diff($from_lines, $to_lines) + { + array_walk($from_lines, array('Text_Diff', 'trimNewlines')); + array_walk($to_lines, array('Text_Diff', 'trimNewlines')); + + /* Convert the two input arrays into strings for xdiff processing. */ + $from_string = implode("\n", $from_lines); + $to_string = implode("\n", $to_lines); + + /* Diff the two strings and convert the result to an array. */ + $diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); + $diff = explode("\n", $diff); + + /* Walk through the diff one line at a time. We build the $edits + * array of diff operations by reading the first character of the + * xdiff output (which is in the "unified diff" format). + * + * Note that we don't have enough information to detect "changed" + * lines using this approach, so we can't add Text_Diff_Op_changed + * instances to the $edits array. The result is still perfectly + * valid, albeit a little less descriptive and efficient. */ + $edits = array(); + foreach ($diff as $line) { + if (!strlen($line)) { + continue; + } + switch ($line[0]) { + case ' ': + $edits[] = new Text_Diff_Op_copy(array(substr($line, 1))); + break; + + case '+': + $edits[] = new Text_Diff_Op_add(array(substr($line, 1))); + break; + + case '-': + $edits[] = new Text_Diff_Op_delete(array(substr($line, 1))); + break; + } + } + + return $edits; + } + +} diff --git a/wp-includes/Text/Diff/Renderer.php b/wp-includes/Text/Diff/Renderer.php new file mode 100644 index 0000000..712d985 --- /dev/null +++ b/wp-includes/Text/Diff/Renderer.php @@ -0,0 +1,242 @@ +<?php +/** + * A class to render Diffs in different formats. + * + * This class renders the diff in classic diff format. It is intended that + * this class be customized via inheritance, to obtain fancier outputs. + * + * Copyright 2004-2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @package Text_Diff + */ +class Text_Diff_Renderer { + + /** + * Number of leading context "lines" to preserve. + * + * This should be left at zero for this class, but subclasses may want to + * set this to other values. + */ + var $_leading_context_lines = 0; + + /** + * Number of trailing context "lines" to preserve. + * + * This should be left at zero for this class, but subclasses may want to + * set this to other values. + */ + var $_trailing_context_lines = 0; + + /** + * Constructor. + */ + function __construct( $params = array() ) + { + foreach ($params as $param => $value) { + $v = '_' . $param; + if (isset($this->$v)) { + $this->$v = $value; + } + } + } + + /** + * PHP4 constructor. + */ + public function Text_Diff_Renderer( $params = array() ) { + self::__construct( $params ); + } + + /** + * Get any renderer parameters. + * + * @return array All parameters of this renderer object. + */ + function getParams() + { + $params = array(); + foreach (get_object_vars($this) as $k => $v) { + if ($k[0] == '_') { + $params[substr($k, 1)] = $v; + } + } + + return $params; + } + + /** + * Renders a diff. + * + * @param Text_Diff $diff A Text_Diff object. + * + * @return string The formatted output. + */ + function render($diff) + { + $xi = $yi = 1; + $block = false; + $context = array(); + + $nlead = $this->_leading_context_lines; + $ntrail = $this->_trailing_context_lines; + + $output = $this->_startDiff(); + + $diffs = $diff->getDiff(); + foreach ($diffs as $i => $edit) { + /* If these are unchanged (copied) lines, and we want to keep + * leading or trailing context lines, extract them from the copy + * block. */ + if (is_a($edit, 'Text_Diff_Op_copy')) { + /* Do we have any diff blocks yet? */ + if (is_array($block)) { + /* How many lines to keep as context from the copy + * block. */ + $keep = $i == count($diffs) - 1 ? $ntrail : $nlead + $ntrail; + if (count($edit->orig) <= $keep) { + /* We have less lines in the block than we want for + * context => keep the whole block. */ + $block[] = $edit; + } else { + if ($ntrail) { + /* Create a new block with as many lines as we need + * for the trailing context. */ + $context = array_slice($edit->orig, 0, $ntrail); + $block[] = new Text_Diff_Op_copy($context); + } + /* @todo */ + $output .= $this->_block($x0, $ntrail + $xi - $x0, + $y0, $ntrail + $yi - $y0, + $block); + $block = false; + } + } + /* Keep the copy block as the context for the next block. */ + $context = $edit->orig; + } else { + /* Don't we have any diff blocks yet? */ + if (!is_array($block)) { + /* Extract context lines from the preceding copy block. */ + $context = array_slice($context, count($context) - $nlead); + $x0 = $xi - count($context); + $y0 = $yi - count($context); + $block = array(); + if ($context) { + $block[] = new Text_Diff_Op_copy($context); + } + } + $block[] = $edit; + } + + if ($edit->orig) { + $xi += count($edit->orig); + } + if ($edit->final) { + $yi += count($edit->final); + } + } + + if (is_array($block)) { + $output .= $this->_block($x0, $xi - $x0, + $y0, $yi - $y0, + $block); + } + + return $output . $this->_endDiff(); + } + + function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) + { + $output = $this->_startBlock($this->_blockHeader($xbeg, $xlen, $ybeg, $ylen)); + + foreach ($edits as $edit) { + switch (strtolower(get_class($edit))) { + case 'text_diff_op_copy': + $output .= $this->_context($edit->orig); + break; + + case 'text_diff_op_add': + $output .= $this->_added($edit->final); + break; + + case 'text_diff_op_delete': + $output .= $this->_deleted($edit->orig); + break; + + case 'text_diff_op_change': + $output .= $this->_changed($edit->orig, $edit->final); + break; + } + } + + return $output . $this->_endBlock(); + } + + function _startDiff() + { + return ''; + } + + function _endDiff() + { + return ''; + } + + function _blockHeader($xbeg, $xlen, $ybeg, $ylen) + { + if ($xlen > 1) { + $xbeg .= ',' . ($xbeg + $xlen - 1); + } + if ($ylen > 1) { + $ybeg .= ',' . ($ybeg + $ylen - 1); + } + + // this matches the GNU Diff behaviour + if ($xlen && !$ylen) { + $ybeg--; + } elseif (!$xlen) { + $xbeg--; + } + + return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; + } + + function _startBlock($header) + { + return $header . "\n"; + } + + function _endBlock() + { + return ''; + } + + function _lines($lines, $prefix = ' ') + { + return $prefix . implode("\n$prefix", $lines) . "\n"; + } + + function _context($lines) + { + return $this->_lines($lines, ' '); + } + + function _added($lines) + { + return $this->_lines($lines, '> '); + } + + function _deleted($lines) + { + return $this->_lines($lines, '< '); + } + + function _changed($orig, $final) + { + return $this->_deleted($orig) . "---\n" . $this->_added($final); + } + +} diff --git a/wp-includes/Text/Diff/Renderer/inline.php b/wp-includes/Text/Diff/Renderer/inline.php new file mode 100644 index 0000000..392bd57 --- /dev/null +++ b/wp-includes/Text/Diff/Renderer/inline.php @@ -0,0 +1,206 @@ +<?php +/** + * "Inline" diff renderer. + * + * Copyright 2004-2010 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you did + * not receive this file, see http://opensource.org/licenses/lgpl-license.php. + * + * @author Ciprian Popovici + * @package Text_Diff + */ + +/** Text_Diff_Renderer */ + +// WP #7391 +require_once dirname(dirname(__FILE__)) . '/Renderer.php'; + +/** + * "Inline" diff renderer. + * + * This class renders diffs in the Wiki-style "inline" format. + * + * @author Ciprian Popovici + * @package Text_Diff + */ +class Text_Diff_Renderer_inline extends Text_Diff_Renderer { + + /** + * Number of leading context "lines" to preserve. + * + * @var integer + */ + var $_leading_context_lines = 10000; + + /** + * Number of trailing context "lines" to preserve. + * + * @var integer + */ + var $_trailing_context_lines = 10000; + + /** + * Prefix for inserted text. + * + * @var string + */ + var $_ins_prefix = '<ins>'; + + /** + * Suffix for inserted text. + * + * @var string + */ + var $_ins_suffix = '</ins>'; + + /** + * Prefix for deleted text. + * + * @var string + */ + var $_del_prefix = '<del>'; + + /** + * Suffix for deleted text. + * + * @var string + */ + var $_del_suffix = '</del>'; + + /** + * Header for each change block. + * + * @var string + */ + var $_block_header = ''; + + /** + * Whether to split down to character-level. + * + * @var boolean + */ + var $_split_characters = false; + + /** + * What are we currently splitting on? Used to recurse to show word-level + * or character-level changes. + * + * @var string + */ + var $_split_level = 'lines'; + + function _blockHeader($xbeg, $xlen, $ybeg, $ylen) + { + return $this->_block_header; + } + + function _startBlock($header) + { + return $header; + } + + function _lines($lines, $prefix = ' ', $encode = true) + { + if ($encode) { + array_walk($lines, array(&$this, '_encode')); + } + + if ($this->_split_level == 'lines') { + return implode("\n", $lines) . "\n"; + } else { + return implode('', $lines); + } + } + + function _added($lines) + { + array_walk($lines, array(&$this, '_encode')); + $lines[0] = $this->_ins_prefix . $lines[0]; + $lines[count($lines) - 1] .= $this->_ins_suffix; + return $this->_lines($lines, ' ', false); + } + + function _deleted($lines, $words = false) + { + array_walk($lines, array(&$this, '_encode')); + $lines[0] = $this->_del_prefix . $lines[0]; + $lines[count($lines) - 1] .= $this->_del_suffix; + return $this->_lines($lines, ' ', false); + } + + function _changed($orig, $final) + { + /* If we've already split on characters, just display. */ + if ($this->_split_level == 'characters') { + return $this->_deleted($orig) + . $this->_added($final); + } + + /* If we've already split on words, just display. */ + if ($this->_split_level == 'words') { + $prefix = ''; + while ($orig[0] !== false && $final[0] !== false && + substr($orig[0], 0, 1) == ' ' && + substr($final[0], 0, 1) == ' ') { + $prefix .= substr($orig[0], 0, 1); + $orig[0] = substr($orig[0], 1); + $final[0] = substr($final[0], 1); + } + return $prefix . $this->_deleted($orig) . $this->_added($final); + } + + $text1 = implode("\n", $orig); + $text2 = implode("\n", $final); + + /* Non-printing newline marker. */ + $nl = "\0"; + + if ($this->_split_characters) { + $diff = new Text_Diff('native', + array(preg_split('//', $text1), + preg_split('//', $text2))); + } else { + /* We want to split on word boundaries, but we need to preserve + * whitespace as well. Therefore we split on words, but include + * all blocks of whitespace in the wordlist. */ + $diff = new Text_Diff('native', + array($this->_splitOnWords($text1, $nl), + $this->_splitOnWords($text2, $nl))); + } + + /* Get the diff in inline format. */ + $renderer = new Text_Diff_Renderer_inline + (array_merge($this->getParams(), + array('split_level' => $this->_split_characters ? 'characters' : 'words'))); + + /* Run the diff and get the output. */ + return str_replace($nl, "\n", $renderer->render($diff)) . "\n"; + } + + function _splitOnWords($string, $newlineEscape = "\n") + { + // Ignore \0; otherwise the while loop will never finish. + $string = str_replace("\0", '', $string); + + $words = array(); + $length = strlen($string); + $pos = 0; + + while ($pos < $length) { + // Eat a word with any preceding whitespace. + $spaces = strspn(substr($string, $pos), " \n"); + $nextpos = strcspn(substr($string, $pos + $spaces), " \n"); + $words[] = str_replace("\n", $newlineEscape, substr($string, $pos, $spaces + $nextpos)); + $pos += $spaces + $nextpos; + } + + return $words; + } + + function _encode(&$string) + { + $string = htmlspecialchars($string); + } + +} diff --git a/wp-includes/admin-bar.php b/wp-includes/admin-bar.php new file mode 100644 index 0000000..753e5ab --- /dev/null +++ b/wp-includes/admin-bar.php @@ -0,0 +1,1247 @@ +<?php +/** + * Toolbar API: Top-level Toolbar functionality + * + * @package WordPress + * @subpackage Toolbar + * @since 3.1.0 + */ + +/** + * Instantiate the admin bar object and set it up as a global for access elsewhere. + * + * UNHOOKING THIS FUNCTION WILL NOT PROPERLY REMOVE THE ADMIN BAR. + * For that, use show_admin_bar(false) or the {@see 'show_admin_bar'} filter. + * + * @since 3.1.0 + * @access private + * + * @global WP_Admin_Bar $wp_admin_bar + * + * @return bool Whether the admin bar was successfully initialized. + */ +function _wp_admin_bar_init() { + global $wp_admin_bar; + + if ( ! is_admin_bar_showing() ) { + return false; + } + + /* Load the admin bar class code ready for instantiation */ + require_once ABSPATH . WPINC . '/class-wp-admin-bar.php'; + + /* Instantiate the admin bar */ + + /** + * Filters the admin bar class to instantiate. + * + * @since 3.1.0 + * + * @param string $wp_admin_bar_class Admin bar class to use. Default 'WP_Admin_Bar'. + */ + $admin_bar_class = apply_filters( 'wp_admin_bar_class', 'WP_Admin_Bar' ); + if ( class_exists( $admin_bar_class ) ) { + $wp_admin_bar = new $admin_bar_class; + } else { + return false; + } + + $wp_admin_bar->initialize(); + $wp_admin_bar->add_menus(); + + return true; +} + +/** + * Renders the admin bar to the page based on the $wp_admin_bar->menu member var. + * + * This is called very early on the {@see 'wp_body_open'} action so that it will render + * before anything else being added to the page body. + * + * For backward compatibility with themes not using the 'wp_body_open' action, + * the function is also called late on {@see 'wp_footer'}. + * + * It includes the {@see 'admin_bar_menu'} action which should be used to hook in and + * add new menus to the admin bar. That way you can be sure that you are adding at most + * optimal point, right before the admin bar is rendered. This also gives you access to + * the `$post` global, among others. + * + * @since 3.1.0 + * @since 5.4.0 Called on 'wp_body_open' action first, with 'wp_footer' as a fallback. + * + * @global WP_Admin_Bar $wp_admin_bar + * + * @staticvar bool $rendered + */ +function wp_admin_bar_render() { + global $wp_admin_bar; + static $rendered = false; + + if ( $rendered ) { + return; + } + + if ( ! is_admin_bar_showing() || ! is_object( $wp_admin_bar ) ) { + return; + } + + /** + * Load all necessary admin bar items. + * + * This is the hook used to add, remove, or manipulate admin bar items. + * + * @since 3.1.0 + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference + */ + do_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) ); + + /** + * Fires before the admin bar is rendered. + * + * @since 3.1.0 + */ + do_action( 'wp_before_admin_bar_render' ); + + $wp_admin_bar->render(); + + /** + * Fires after the admin bar is rendered. + * + * @since 3.1.0 + */ + do_action( 'wp_after_admin_bar_render' ); + + $rendered = true; +} + +/** + * Add the WordPress logo menu. + * + * @since 3.3.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_wp_menu( $wp_admin_bar ) { + if ( current_user_can( 'read' ) ) { + $about_url = self_admin_url( 'about.php' ); + } elseif ( is_multisite() ) { + $about_url = get_dashboard_url( get_current_user_id(), 'about.php' ); + } else { + $about_url = false; + } + + $wp_logo_menu_args = array( + 'id' => 'wp-logo', + 'title' => '<span class="ab-icon"></span><span class="screen-reader-text">' . __( 'About WordPress' ) . '</span>', + 'href' => $about_url, + ); + + // Set tabindex="0" to make sub menus accessible when no URL is available. + if ( ! $about_url ) { + $wp_logo_menu_args['meta'] = array( + 'tabindex' => 0, + ); + } + + $wp_admin_bar->add_node( $wp_logo_menu_args ); + + if ( $about_url ) { + // Add "About WordPress" link. + $wp_admin_bar->add_node( + array( + 'parent' => 'wp-logo', + 'id' => 'about', + 'title' => __( 'About WordPress' ), + 'href' => $about_url, + ) + ); + } + + // Add WordPress.org link. + $wp_admin_bar->add_node( + array( + 'parent' => 'wp-logo-external', + 'id' => 'wporg', + 'title' => __( 'WordPress.org' ), + 'href' => __( 'https://wordpress.org/' ), + ) + ); + + // Add Codex link. + $wp_admin_bar->add_node( + array( + 'parent' => 'wp-logo-external', + 'id' => 'documentation', + 'title' => __( 'Documentation' ), + 'href' => __( 'https://codex.wordpress.org/' ), + ) + ); + + // Add forums link. + $wp_admin_bar->add_node( + array( + 'parent' => 'wp-logo-external', + 'id' => 'support-forums', + 'title' => __( 'Support' ), + 'href' => __( 'https://wordpress.org/support/' ), + ) + ); + + // Add feedback link. + $wp_admin_bar->add_node( + array( + 'parent' => 'wp-logo-external', + 'id' => 'feedback', + 'title' => __( 'Feedback' ), + 'href' => __( 'https://wordpress.org/support/forum/requests-and-feedback' ), + ) + ); +} + +/** + * Add the sidebar toggle button. + * + * @since 3.8.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_sidebar_toggle( $wp_admin_bar ) { + if ( is_admin() ) { + $wp_admin_bar->add_node( + array( + 'id' => 'menu-toggle', + 'title' => '<span class="ab-icon"></span><span class="screen-reader-text">' . __( 'Menu' ) . '</span>', + 'href' => '#', + ) + ); + } +} + +/** + * Add the "My Account" item. + * + * @since 3.3.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_my_account_item( $wp_admin_bar ) { + $user_id = get_current_user_id(); + $current_user = wp_get_current_user(); + + if ( ! $user_id ) { + return; + } + + if ( current_user_can( 'read' ) ) { + $profile_url = get_edit_profile_url( $user_id ); + } elseif ( is_multisite() ) { + $profile_url = get_dashboard_url( $user_id, 'profile.php' ); + } else { + $profile_url = false; + } + + $avatar = get_avatar( $user_id, 26 ); + /* translators: %s: Current user's display name. */ + $howdy = sprintf( __( 'Howdy, %s' ), '<span class="display-name">' . $current_user->display_name . '</span>' ); + $class = empty( $avatar ) ? '' : 'with-avatar'; + + $wp_admin_bar->add_node( + array( + 'id' => 'my-account', + 'parent' => 'top-secondary', + 'title' => $howdy . $avatar, + 'href' => $profile_url, + 'meta' => array( + 'class' => $class, + ), + ) + ); +} + +/** + * Add the "My Account" submenu items. + * + * @since 3.1.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_my_account_menu( $wp_admin_bar ) { + $user_id = get_current_user_id(); + $current_user = wp_get_current_user(); + + if ( ! $user_id ) { + return; + } + + if ( current_user_can( 'read' ) ) { + $profile_url = get_edit_profile_url( $user_id ); + } elseif ( is_multisite() ) { + $profile_url = get_dashboard_url( $user_id, 'profile.php' ); + } else { + $profile_url = false; + } + + $wp_admin_bar->add_group( + array( + 'parent' => 'my-account', + 'id' => 'user-actions', + ) + ); + + $user_info = get_avatar( $user_id, 64 ); + $user_info .= "<span class='display-name'>{$current_user->display_name}</span>"; + + if ( $current_user->display_name !== $current_user->user_login ) { + $user_info .= "<span class='username'>{$current_user->user_login}</span>"; + } + + $wp_admin_bar->add_node( + array( + 'parent' => 'user-actions', + 'id' => 'user-info', + 'title' => $user_info, + 'href' => $profile_url, + 'meta' => array( + 'tabindex' => -1, + ), + ) + ); + + if ( false !== $profile_url ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'user-actions', + 'id' => 'edit-profile', + 'title' => __( 'Edit My Profile' ), + 'href' => $profile_url, + ) + ); + } + + $wp_admin_bar->add_node( + array( + 'parent' => 'user-actions', + 'id' => 'logout', + 'title' => __( 'Log Out' ), + 'href' => wp_logout_url(), + ) + ); +} + +/** + * Add the "Site Name" menu. + * + * @since 3.3.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_site_menu( $wp_admin_bar ) { + // Don't show for logged out users. + if ( ! is_user_logged_in() ) { + return; + } + + // Show only when the user is a member of this site, or they're a super admin. + if ( ! is_user_member_of_blog() && ! current_user_can( 'manage_network' ) ) { + return; + } + + $blogname = get_bloginfo( 'name' ); + + if ( ! $blogname ) { + $blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() ); + } + + if ( is_network_admin() ) { + /* translators: %s: Site title. */ + $blogname = sprintf( __( 'Network Admin: %s' ), esc_html( get_network()->site_name ) ); + } elseif ( is_user_admin() ) { + /* translators: %s: Site title. */ + $blogname = sprintf( __( 'User Dashboard: %s' ), esc_html( get_network()->site_name ) ); + } + + $title = wp_html_excerpt( $blogname, 40, '…' ); + + $wp_admin_bar->add_node( + array( + 'id' => 'site-name', + 'title' => $title, + 'href' => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(), + ) + ); + + // Create submenu items. + + if ( is_admin() ) { + // Add an option to visit the site. + $wp_admin_bar->add_node( + array( + 'parent' => 'site-name', + 'id' => 'view-site', + 'title' => __( 'Visit Site' ), + 'href' => home_url( '/' ), + ) + ); + + if ( is_blog_admin() && is_multisite() && current_user_can( 'manage_sites' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'site-name', + 'id' => 'edit-site', + 'title' => __( 'Edit Site' ), + 'href' => network_admin_url( 'site-info.php?id=' . get_current_blog_id() ), + ) + ); + } + } elseif ( current_user_can( 'read' ) ) { + // We're on the front end, link to the Dashboard. + $wp_admin_bar->add_node( + array( + 'parent' => 'site-name', + 'id' => 'dashboard', + 'title' => __( 'Dashboard' ), + 'href' => admin_url(), + ) + ); + + // Add the appearance submenu items. + wp_admin_bar_appearance_menu( $wp_admin_bar ); + } +} + +/** + * Adds the "Customize" link to the Toolbar. + * + * @since 4.3.0 + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance. + * @global WP_Customize_Manager $wp_customize + */ +function wp_admin_bar_customize_menu( $wp_admin_bar ) { + global $wp_customize; + + // Don't show for users who can't access the customizer or when in the admin. + if ( ! current_user_can( 'customize' ) || is_admin() ) { + return; + } + + // Don't show if the user cannot edit a given customize_changeset post currently being previewed. + if ( is_customize_preview() && $wp_customize->changeset_post_id() && ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $wp_customize->changeset_post_id() ) ) { + return; + } + + $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + if ( is_customize_preview() && $wp_customize->changeset_uuid() ) { + $current_url = remove_query_arg( 'customize_changeset_uuid', $current_url ); + } + + $customize_url = add_query_arg( 'url', urlencode( $current_url ), wp_customize_url() ); + if ( is_customize_preview() ) { + $customize_url = add_query_arg( array( 'changeset_uuid' => $wp_customize->changeset_uuid() ), $customize_url ); + } + + $wp_admin_bar->add_node( + array( + 'id' => 'customize', + 'title' => __( 'Customize' ), + 'href' => $customize_url, + 'meta' => array( + 'class' => 'hide-if-no-customize', + ), + ) + ); + add_action( 'wp_before_admin_bar_render', 'wp_customize_support_script' ); +} + +/** + * Add the "My Sites/[Site Name]" menu and all submenus. + * + * @since 3.1.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_my_sites_menu( $wp_admin_bar ) { + // Don't show for logged out users or single site mode. + if ( ! is_user_logged_in() || ! is_multisite() ) { + return; + } + + // Show only when the user has at least one site, or they're a super admin. + if ( count( $wp_admin_bar->user->blogs ) < 1 && ! current_user_can( 'manage_network' ) ) { + return; + } + + if ( $wp_admin_bar->user->active_blog ) { + $my_sites_url = get_admin_url( $wp_admin_bar->user->active_blog->blog_id, 'my-sites.php' ); + } else { + $my_sites_url = admin_url( 'my-sites.php' ); + } + + $wp_admin_bar->add_node( + array( + 'id' => 'my-sites', + 'title' => __( 'My Sites' ), + 'href' => $my_sites_url, + ) + ); + + if ( current_user_can( 'manage_network' ) ) { + $wp_admin_bar->add_group( + array( + 'parent' => 'my-sites', + 'id' => 'my-sites-super-admin', + ) + ); + + $wp_admin_bar->add_node( + array( + 'parent' => 'my-sites-super-admin', + 'id' => 'network-admin', + 'title' => __( 'Network Admin' ), + 'href' => network_admin_url(), + ) + ); + + $wp_admin_bar->add_node( + array( + 'parent' => 'network-admin', + 'id' => 'network-admin-d', + 'title' => __( 'Dashboard' ), + 'href' => network_admin_url(), + ) + ); + + if ( current_user_can( 'manage_sites' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'network-admin', + 'id' => 'network-admin-s', + 'title' => __( 'Sites' ), + 'href' => network_admin_url( 'sites.php' ), + ) + ); + } + + if ( current_user_can( 'manage_network_users' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'network-admin', + 'id' => 'network-admin-u', + 'title' => __( 'Users' ), + 'href' => network_admin_url( 'users.php' ), + ) + ); + } + + if ( current_user_can( 'manage_network_themes' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'network-admin', + 'id' => 'network-admin-t', + 'title' => __( 'Themes' ), + 'href' => network_admin_url( 'themes.php' ), + ) + ); + } + + if ( current_user_can( 'manage_network_plugins' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'network-admin', + 'id' => 'network-admin-p', + 'title' => __( 'Plugins' ), + 'href' => network_admin_url( 'plugins.php' ), + ) + ); + } + + if ( current_user_can( 'manage_network_options' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'network-admin', + 'id' => 'network-admin-o', + 'title' => __( 'Settings' ), + 'href' => network_admin_url( 'settings.php' ), + ) + ); + } + } + + // Add site links. + $wp_admin_bar->add_group( + array( + 'parent' => 'my-sites', + 'id' => 'my-sites-list', + 'meta' => array( + 'class' => current_user_can( 'manage_network' ) ? 'ab-sub-secondary' : '', + ), + ) + ); + + foreach ( (array) $wp_admin_bar->user->blogs as $blog ) { + switch_to_blog( $blog->userblog_id ); + + $blavatar = '<div class="blavatar"></div>'; + + $blogname = $blog->blogname; + + if ( ! $blogname ) { + $blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() ); + } + + $menu_id = 'blog-' . $blog->userblog_id; + + if ( current_user_can( 'read' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'my-sites-list', + 'id' => $menu_id, + 'title' => $blavatar . $blogname, + 'href' => admin_url(), + ) + ); + + $wp_admin_bar->add_node( + array( + 'parent' => $menu_id, + 'id' => $menu_id . '-d', + 'title' => __( 'Dashboard' ), + 'href' => admin_url(), + ) + ); + } else { + $wp_admin_bar->add_node( + array( + 'parent' => 'my-sites-list', + 'id' => $menu_id, + 'title' => $blavatar . $blogname, + 'href' => home_url(), + ) + ); + } + + if ( current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => $menu_id, + 'id' => $menu_id . '-n', + 'title' => get_post_type_object( 'post' )->labels->new_item, + 'href' => admin_url( 'post-new.php' ), + ) + ); + } + + if ( current_user_can( 'edit_posts' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => $menu_id, + 'id' => $menu_id . '-c', + 'title' => __( 'Manage Comments' ), + 'href' => admin_url( 'edit-comments.php' ), + ) + ); + } + + $wp_admin_bar->add_node( + array( + 'parent' => $menu_id, + 'id' => $menu_id . '-v', + 'title' => __( 'Visit Site' ), + 'href' => home_url( '/' ), + ) + ); + + restore_current_blog(); + } +} + +/** + * Provide a shortlink. + * + * @since 3.1.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_shortlink_menu( $wp_admin_bar ) { + $short = wp_get_shortlink( 0, 'query' ); + $id = 'get-shortlink'; + + if ( empty( $short ) ) { + return; + } + + $html = '<input class="shortlink-input" type="text" readonly="readonly" value="' . esc_attr( $short ) . '" />'; + + $wp_admin_bar->add_node( + array( + 'id' => $id, + 'title' => __( 'Shortlink' ), + 'href' => $short, + 'meta' => array( 'html' => $html ), + ) + ); +} + +/** + * Provide an edit link for posts and terms. + * + * @since 3.1.0 + * + * @global WP_Term $tag + * @global WP_Query $wp_the_query WordPress Query object. + * @global int $user_id The ID of the user being edited. Not to be confused with the + * global $user_ID, which contains the ID of the current user. + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_edit_menu( $wp_admin_bar ) { + global $tag, $wp_the_query, $user_id; + + if ( is_admin() ) { + $current_screen = get_current_screen(); + $post = get_post(); + if ( 'post' == $current_screen->base ) { + $post_type_object = get_post_type_object( $post->post_type ); + } elseif ( 'edit' == $current_screen->base ) { + $post_type_object = get_post_type_object( $current_screen->post_type ); + } + + if ( 'post' == $current_screen->base + && 'add' != $current_screen->action + && ( $post_type_object ) + && current_user_can( 'read_post', $post->ID ) + && ( $post_type_object->public ) + && ( $post_type_object->show_in_admin_bar ) ) { + if ( 'draft' == $post->post_status ) { + $preview_link = get_preview_post_link( $post ); + $wp_admin_bar->add_node( + array( + 'id' => 'preview', + 'title' => $post_type_object->labels->view_item, + 'href' => esc_url( $preview_link ), + 'meta' => array( 'target' => 'wp-preview-' . $post->ID ), + ) + ); + } else { + $wp_admin_bar->add_node( + array( + 'id' => 'view', + 'title' => $post_type_object->labels->view_item, + 'href' => get_permalink( $post->ID ), + ) + ); + } + } elseif ( 'edit' == $current_screen->base + && ( $post_type_object ) + && ( $post_type_object->public ) + && ( $post_type_object->show_in_admin_bar ) + && ( get_post_type_archive_link( $post_type_object->name ) ) + && ! ( 'post' === $post_type_object->name && 'posts' === get_option( 'show_on_front' ) ) ) { + $wp_admin_bar->add_node( + array( + 'id' => 'archive', + 'title' => $post_type_object->labels->view_items, + 'href' => get_post_type_archive_link( $current_screen->post_type ), + ) + ); + } elseif ( 'term' == $current_screen->base && isset( $tag ) && is_object( $tag ) && ! is_wp_error( $tag ) ) { + $tax = get_taxonomy( $tag->taxonomy ); + if ( is_taxonomy_viewable( $tax ) ) { + $wp_admin_bar->add_node( + array( + 'id' => 'view', + 'title' => $tax->labels->view_item, + 'href' => get_term_link( $tag ), + ) + ); + } + } elseif ( 'user-edit' == $current_screen->base && isset( $user_id ) ) { + $user_object = get_userdata( $user_id ); + $view_link = get_author_posts_url( $user_object->ID ); + if ( $user_object->exists() && $view_link ) { + $wp_admin_bar->add_node( + array( + 'id' => 'view', + 'title' => __( 'View User' ), + 'href' => $view_link, + ) + ); + } + } + } else { + $current_object = $wp_the_query->get_queried_object(); + + if ( empty( $current_object ) ) { + return; + } + + if ( ! empty( $current_object->post_type ) ) { + $post_type_object = get_post_type_object( $current_object->post_type ); + $edit_post_link = get_edit_post_link( $current_object->ID ); + if ( $post_type_object + && $edit_post_link + && current_user_can( 'edit_post', $current_object->ID ) + && $post_type_object->show_in_admin_bar ) { + $wp_admin_bar->add_node( + array( + 'id' => 'edit', + 'title' => $post_type_object->labels->edit_item, + 'href' => $edit_post_link, + ) + ); + } + } elseif ( ! empty( $current_object->taxonomy ) ) { + $tax = get_taxonomy( $current_object->taxonomy ); + $edit_term_link = get_edit_term_link( $current_object->term_id, $current_object->taxonomy ); + if ( $tax && $edit_term_link && current_user_can( 'edit_term', $current_object->term_id ) ) { + $wp_admin_bar->add_node( + array( + 'id' => 'edit', + 'title' => $tax->labels->edit_item, + 'href' => $edit_term_link, + ) + ); + } + } elseif ( is_a( $current_object, 'WP_User' ) && current_user_can( 'edit_user', $current_object->ID ) ) { + $edit_user_link = get_edit_user_link( $current_object->ID ); + if ( $edit_user_link ) { + $wp_admin_bar->add_node( + array( + 'id' => 'edit', + 'title' => __( 'Edit User' ), + 'href' => $edit_user_link, + ) + ); + } + } + } +} + +/** + * Add "Add New" menu. + * + * @since 3.1.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_new_content_menu( $wp_admin_bar ) { + $actions = array(); + + $cpts = (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' ); + + if ( isset( $cpts['post'] ) && current_user_can( $cpts['post']->cap->create_posts ) ) { + $actions['post-new.php'] = array( $cpts['post']->labels->name_admin_bar, 'new-post' ); + } + + if ( isset( $cpts['attachment'] ) && current_user_can( 'upload_files' ) ) { + $actions['media-new.php'] = array( $cpts['attachment']->labels->name_admin_bar, 'new-media' ); + } + + if ( current_user_can( 'manage_links' ) ) { + $actions['link-add.php'] = array( _x( 'Link', 'add new from admin bar' ), 'new-link' ); + } + + if ( isset( $cpts['page'] ) && current_user_can( $cpts['page']->cap->create_posts ) ) { + $actions['post-new.php?post_type=page'] = array( $cpts['page']->labels->name_admin_bar, 'new-page' ); + } + + unset( $cpts['post'], $cpts['page'], $cpts['attachment'] ); + + // Add any additional custom post types. + foreach ( $cpts as $cpt ) { + if ( ! current_user_can( $cpt->cap->create_posts ) ) { + continue; + } + + $key = 'post-new.php?post_type=' . $cpt->name; + $actions[ $key ] = array( $cpt->labels->name_admin_bar, 'new-' . $cpt->name ); + } + // Avoid clash with parent node and a 'content' post type. + if ( isset( $actions['post-new.php?post_type=content'] ) ) { + $actions['post-new.php?post_type=content'][1] = 'add-new-content'; + } + + if ( current_user_can( 'create_users' ) || ( is_multisite() && current_user_can( 'promote_users' ) ) ) { + $actions['user-new.php'] = array( _x( 'User', 'add new from admin bar' ), 'new-user' ); + } + + if ( ! $actions ) { + return; + } + + $title = '<span class="ab-icon"></span><span class="ab-label">' . _x( 'New', 'admin bar menu group label' ) . '</span>'; + + $wp_admin_bar->add_node( + array( + 'id' => 'new-content', + 'title' => $title, + 'href' => admin_url( current( array_keys( $actions ) ) ), + ) + ); + + foreach ( $actions as $link => $action ) { + list( $title, $id ) = $action; + + $wp_admin_bar->add_node( + array( + 'parent' => 'new-content', + 'id' => $id, + 'title' => $title, + 'href' => admin_url( $link ), + ) + ); + } +} + +/** + * Add edit comments link with awaiting moderation count bubble. + * + * @since 3.1.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_comments_menu( $wp_admin_bar ) { + if ( ! current_user_can( 'edit_posts' ) ) { + return; + } + + $awaiting_mod = wp_count_comments(); + $awaiting_mod = $awaiting_mod->moderated; + $awaiting_text = sprintf( + /* translators: %s: Number of comments. */ + _n( '%s Comment in moderation', '%s Comments in moderation', $awaiting_mod ), + number_format_i18n( $awaiting_mod ) + ); + + $icon = '<span class="ab-icon"></span>'; + $title = '<span class="ab-label awaiting-mod pending-count count-' . $awaiting_mod . '" aria-hidden="true">' . number_format_i18n( $awaiting_mod ) . '</span>'; + $title .= '<span class="screen-reader-text comments-in-moderation-text">' . $awaiting_text . '</span>'; + + $wp_admin_bar->add_node( + array( + 'id' => 'comments', + 'title' => $icon . $title, + 'href' => admin_url( 'edit-comments.php' ), + ) + ); +} + +/** + * Add appearance submenu items to the "Site Name" menu. + * + * @since 3.1.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_appearance_menu( $wp_admin_bar ) { + $wp_admin_bar->add_group( + array( + 'parent' => 'site-name', + 'id' => 'appearance', + ) + ); + + if ( current_user_can( 'switch_themes' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'appearance', + 'id' => 'themes', + 'title' => __( 'Themes' ), + 'href' => admin_url( 'themes.php' ), + ) + ); + } + + if ( ! current_user_can( 'edit_theme_options' ) ) { + return; + } + + if ( current_theme_supports( 'widgets' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'appearance', + 'id' => 'widgets', + 'title' => __( 'Widgets' ), + 'href' => admin_url( 'widgets.php' ), + ) + ); + } + + if ( current_theme_supports( 'menus' ) || current_theme_supports( 'widgets' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'appearance', + 'id' => 'menus', + 'title' => __( 'Menus' ), + 'href' => admin_url( 'nav-menus.php' ), + ) + ); + } + + if ( current_theme_supports( 'custom-background' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'appearance', + 'id' => 'background', + 'title' => __( 'Background' ), + 'href' => admin_url( 'themes.php?page=custom-background' ), + 'meta' => array( + 'class' => 'hide-if-customize', + ), + ) + ); + } + + if ( current_theme_supports( 'custom-header' ) ) { + $wp_admin_bar->add_node( + array( + 'parent' => 'appearance', + 'id' => 'header', + 'title' => __( 'Header' ), + 'href' => admin_url( 'themes.php?page=custom-header' ), + 'meta' => array( + 'class' => 'hide-if-customize', + ), + ) + ); + } + +} + +/** + * Provide an update link if theme/plugin/core updates are available. + * + * @since 3.1.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_updates_menu( $wp_admin_bar ) { + + $update_data = wp_get_update_data(); + + if ( ! $update_data['counts']['total'] ) { + return; + } + + $title = '<span class="ab-icon"></span><span class="ab-label">' . number_format_i18n( $update_data['counts']['total'] ) . '</span>'; + $title .= '<span class="screen-reader-text">' . $update_data['title'] . '</span>'; + + $wp_admin_bar->add_node( + array( + 'id' => 'updates', + 'title' => $title, + 'href' => network_admin_url( 'update-core.php' ), + 'meta' => array( + 'title' => $update_data['title'], + ), + ) + ); +} + +/** + * Add search form. + * + * @since 3.3.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_search_menu( $wp_admin_bar ) { + if ( is_admin() ) { + return; + } + + $form = '<form action="' . esc_url( home_url( '/' ) ) . '" method="get" id="adminbarsearch">'; + $form .= '<input class="adminbar-input" name="s" id="adminbar-search" type="text" value="" maxlength="150" />'; + $form .= '<label for="adminbar-search" class="screen-reader-text">' . __( 'Search' ) . '</label>'; + $form .= '<input type="submit" class="adminbar-button" value="' . __( 'Search' ) . '"/>'; + $form .= '</form>'; + + $wp_admin_bar->add_node( + array( + 'parent' => 'top-secondary', + 'id' => 'search', + 'title' => $form, + 'meta' => array( + 'class' => 'admin-bar-search', + 'tabindex' => -1, + ), + ) + ); +} + +/** + * Add a link to exit recovery mode when Recovery Mode is active. + * + * @since 5.2.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_recovery_mode_menu( $wp_admin_bar ) { + if ( ! wp_is_recovery_mode() ) { + return; + } + + $url = wp_login_url(); + $url = add_query_arg( 'action', WP_Recovery_Mode::EXIT_ACTION, $url ); + $url = wp_nonce_url( $url, WP_Recovery_Mode::EXIT_ACTION ); + + $wp_admin_bar->add_node( + array( + 'parent' => 'top-secondary', + 'id' => 'recovery-mode', + 'title' => __( 'Exit Recovery Mode' ), + 'href' => $url, + ) + ); +} + +/** + * Add secondary menus. + * + * @since 3.3.0 + * + * @param WP_Admin_Bar $wp_admin_bar + */ +function wp_admin_bar_add_secondary_groups( $wp_admin_bar ) { + $wp_admin_bar->add_group( + array( + 'id' => 'top-secondary', + 'meta' => array( + 'class' => 'ab-top-secondary', + ), + ) + ); + + $wp_admin_bar->add_group( + array( + 'parent' => 'wp-logo', + 'id' => 'wp-logo-external', + 'meta' => array( + 'class' => 'ab-sub-secondary', + ), + ) + ); +} + +/** + * Style and scripts for the admin bar. + * + * @since 3.1.0 + */ +function wp_admin_bar_header() { + $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; + ?> +<style<?php echo $type_attr; ?> media="print">#wpadminbar { display:none; }</style> + <?php +} + +/** + * Default admin bar callback. + * + * @since 3.1.0 + */ +function _admin_bar_bump_cb() { + $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; + ?> +<style<?php echo $type_attr; ?> media="screen"> + html { margin-top: 32px !important; } + * html body { margin-top: 32px !important; } + @media screen and ( max-width: 782px ) { + html { margin-top: 46px !important; } + * html body { margin-top: 46px !important; } + } +</style> + <?php +} + +/** + * Sets the display status of the admin bar. + * + * This can be called immediately upon plugin load. It does not need to be called + * from a function hooked to the {@see 'init'} action. + * + * @since 3.1.0 + * + * @global bool $show_admin_bar + * + * @param bool $show Whether to allow the admin bar to show. + */ +function show_admin_bar( $show ) { + global $show_admin_bar; + $show_admin_bar = (bool) $show; +} + +/** + * Determines whether the admin bar should be showing. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 3.1.0 + * + * @global bool $show_admin_bar + * @global string $pagenow + * + * @return bool Whether the admin bar should be showing. + */ +function is_admin_bar_showing() { + global $show_admin_bar, $pagenow; + + // For all these types of requests, we never want an admin bar. + if ( defined( 'XMLRPC_REQUEST' ) || defined( 'DOING_AJAX' ) || defined( 'IFRAME_REQUEST' ) || wp_is_json_request() ) { + return false; + } + + if ( is_embed() ) { + return false; + } + + // Integrated into the admin. + if ( is_admin() ) { + return true; + } + + if ( ! isset( $show_admin_bar ) ) { + if ( ! is_user_logged_in() || 'wp-login.php' == $pagenow ) { + $show_admin_bar = false; + } else { + $show_admin_bar = _get_admin_bar_pref(); + } + } + + /** + * Filters whether to show the admin bar. + * + * Returning false to this hook is the recommended way to hide the admin bar. + * The user's display preference is used for logged in users. + * + * @since 3.1.0 + * + * @param bool $show_admin_bar Whether the admin bar should be shown. Default false. + */ + $show_admin_bar = apply_filters( 'show_admin_bar', $show_admin_bar ); + + return $show_admin_bar; +} + +/** + * Retrieve the admin bar display preference of a user. + * + * @since 3.1.0 + * @access private + * + * @param string $context Context of this preference check. Defaults to 'front'. The 'admin' + * preference is no longer used. + * @param int $user Optional. ID of the user to check, defaults to 0 for current user. + * @return bool Whether the admin bar should be showing for this user. + */ +function _get_admin_bar_pref( $context = 'front', $user = 0 ) { + $pref = get_user_option( "show_admin_bar_{$context}", $user ); + if ( false === $pref ) { + return true; + } + + return 'true' === $pref; +} diff --git a/wp-includes/assets/script-loader-packages.php b/wp-includes/assets/script-loader-packages.php new file mode 100644 index 0000000..fc03622 --- /dev/null +++ b/wp-includes/assets/script-loader-packages.php @@ -0,0 +1 @@ +<?php return array('a11y.js' => array('dependencies' => array('wp-dom-ready', 'wp-polyfill'), 'version' => '45f739d280d1244f6cb498ed8f1bf042'), 'annotations.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => 'c32d429d3012d9d46c0b1874fa1b6560'), 'api-fetch.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'b437dd9d1118e698b1b85961e759bf03'), 'autop.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'aa8f88d2344416fcd2f7946cac4d5dd4'), 'blob.js' => array('dependencies' => array('wp-polyfill'), 'version' => '60ed48227f0a303ddf818dc8dc3e16fd'), 'block-directory.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-plugins', 'wp-polyfill', 'wp-primitives'), 'version' => '51d7097d8f9501396fc6f2299bdd61f9'), 'block-editor.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-blob', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-token-list', 'wp-url', 'wp-viewport', 'wp-wordcount'), 'version' => 'aacb5c07c68e448af6536df79db8f400'), 'block-library.js' => array('dependencies' => array('lodash', 'moment', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport'), 'version' => '067800bc020babb22719c7a030bf65d9'), 'block-serialization-default-parser.js' => array('dependencies' => array('wp-polyfill'), 'version' => '30e97d4a87a3a28bd9052050ce276b47'), 'blocks.js' => array('dependencies' => array('lodash', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-shortcode'), 'version' => '423068d7079f57cf9f02458ccb4a6131'), 'components.js' => array('dependencies' => array('lodash', 'moment', 'react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-warning'), 'version' => '90861a4430fed183d94d6750cb7ae6f4'), 'compose.js' => array('dependencies' => array('lodash', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill'), 'version' => '3c7f1e5a90aa3c9e9b0f65014efccb35'), 'core-data.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-url'), 'version' => '30bbd0e8996befdf7ce081c737c9c75c'), 'data.js' => array('dependencies' => array('lodash', 'react', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-redux-routine'), 'version' => 'e80048e7b309581a40e44b8bd8aaba41'), 'data-controls.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-polyfill'), 'version' => '01499e0a61256afb555131b4ed614fed'), 'date.js' => array('dependencies' => array('moment', 'wp-polyfill'), 'version' => '87f9d64d7050eeeffa6a6f670f0c546e'), 'deprecated.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => 'cd9e35508705772fbc5e2d9736bde31b'), 'dom.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '47fe5105eb1c16e22c3970e08b1f0953'), 'dom-ready.js' => array('dependencies' => array('wp-polyfill'), 'version' => '91fc8f05178d5c6365aec778f840ae17'), 'edit-post.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url', 'wp-viewport'), 'version' => '99ca111a562584048ddeb818a39c18f6'), 'editor.js' => array('dependencies' => array('lodash', 'react', 'wp-api-fetch', 'wp-autop', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-data-controls', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-wordcount'), 'version' => 'bb928f624169f992ec79a4889c7abf35'), 'element.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => 'a7bf20cbfb0791e9fc65111e966d5592'), 'escape-html.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4198c7c0e05a9f34f4126334be746ddd'), 'format-library.js' => array('dependencies' => array('lodash', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-dom', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-url'), 'version' => '1cceafc98ef77eb54f1da78b10949b4b'), 'hooks.js' => array('dependencies' => array('wp-polyfill'), 'version' => '552e55b6e60db2edbd9073097f2686f7'), 'html-entities.js' => array('dependencies' => array('wp-polyfill'), 'version' => '81efc2ce02f13b864d66666c7bec2136'), 'i18n.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'cced130522e86c87a37cd7b8397b882c'), 'is-shallow-equal.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'a4b6079b15ec86d646a9228996f79cf7'), 'keyboard-shortcuts.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-keycodes', 'wp-polyfill'), 'version' => 'e5de24153978d727a85bc355566df02f'), 'keycodes.js' => array('dependencies' => array('lodash', 'wp-i18n', 'wp-polyfill'), 'version' => '46e6adf844a1e989da37d39c64fca9e2'), 'list-reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'e3f5ece5fd3e8a2951172d531c3e1aab'), 'media-utils.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '591443ff969b73a6db3bc4d8cc57722d'), 'notices.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-polyfill'), 'version' => '74c8f15ff58eb236879fb3c4bcc0b9e2'), 'nux.js' => array('dependencies' => array('lodash', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => 'f52ed6421db1d89876d15481c111f1ad'), 'plugins.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-polyfill'), 'version' => 'b1050e54f3a934a1c06648c984d141ed'), 'primitives.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => 'ecfd167b66d8272c99af2b0220535f33'), 'priority-queue.js' => array('dependencies' => array('wp-polyfill'), 'version' => '8d7738a3dac3e69a70c11e046ecfd5ff'), 'redux-routine.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '7b7d8224ca3d5f24509583833d71c388'), 'rich-text.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill'), 'version' => '942ff14b26cac991c71bdc5fd907ea4b'), 'server-side-render.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '0982eea1efaf70db5d7a28a18b7f8bfa'), 'shortcode.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '6b07711152e32e32d3fc082cc7dd632c'), 'token-list.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'f2fd25ef34512e2ebba30cfede36f1da'), 'url.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'b7106409bea2c78aabddc45249f7c1fc'), 'viewport.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-element', 'wp-polyfill'), 'version' => 'a1159de92dac2fded88b078b7a172740'), 'warning.js' => array('dependencies' => array('wp-polyfill'), 'version' => '98c469cb6d86983eb5fa9fc7a8dfa0c4'), 'wordcount.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '3bd8af3b607ad44d3f7f3c491a33e6bc')); \ No newline at end of file diff --git a/wp-includes/atomlib.php b/wp-includes/atomlib.php new file mode 100644 index 0000000..2e87098 --- /dev/null +++ b/wp-includes/atomlib.php @@ -0,0 +1,394 @@ +<?php +/** + * Atom Syndication Format PHP Library + * + * @package AtomLib + * @link http://code.google.com/p/phpatomlib/ + * + * @author Elias Torres <elias@torrez.us> + * @version 0.4 + * @since 2.3.0 + */ + +/** + * Structure that store common Atom Feed Properties + * + * @package AtomLib + */ +class AtomFeed { + /** + * Stores Links + * @var array + * @access public + */ + var $links = array(); + /** + * Stores Categories + * @var array + * @access public + */ + var $categories = array(); + /** + * Stores Entries + * + * @var array + * @access public + */ + var $entries = array(); +} + +/** + * Structure that store Atom Entry Properties + * + * @package AtomLib + */ +class AtomEntry { + /** + * Stores Links + * @var array + * @access public + */ + var $links = array(); + /** + * Stores Categories + * @var array + * @access public + */ + var $categories = array(); +} + +/** + * AtomLib Atom Parser API + * + * @package AtomLib + */ +class AtomParser { + + var $NS = 'http://www.w3.org/2005/Atom'; + var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights'); + var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft'); + + var $debug = false; + + var $depth = 0; + var $indent = 2; + var $in_content; + var $ns_contexts = array(); + var $ns_decls = array(); + var $content_ns_decls = array(); + var $content_ns_contexts = array(); + var $is_xhtml = false; + var $is_html = false; + var $is_text = true; + var $skipped_div = false; + + var $FILE = "php://input"; + + var $feed; + var $current; + + /** + * PHP5 constructor. + */ + function __construct() { + + $this->feed = new AtomFeed(); + $this->current = null; + $this->map_attrs_func = array( __CLASS__, 'map_attrs' ); + $this->map_xmlns_func = array( __CLASS__, 'map_xmlns' ); + } + + /** + * PHP4 constructor. + */ + public function AtomParser() { + self::__construct(); + } + + /** + * Map attributes to key="val" + * + * @param string $k Key + * @param string $v Value + * @return string + */ + public static function map_attrs($k, $v) { + return "$k=\"$v\""; + } + + /** + * Map XML namespace to string. + * + * @param indexish $p XML Namespace element index + * @param array $n Two-element array pair. [ 0 => {namespace}, 1 => {url} ] + * @return string 'xmlns="{url}"' or 'xmlns:{namespace}="{url}"' + */ + public static function map_xmlns($p, $n) { + $xd = "xmlns"; + if( 0 < strlen($n[0]) ) { + $xd .= ":{$n[0]}"; + } + return "{$xd}=\"{$n[1]}\""; + } + + function _p($msg) { + if($this->debug) { + print str_repeat(" ", $this->depth * $this->indent) . $msg ."\n"; + } + } + + function error_handler($log_level, $log_text, $error_file, $error_line) { + $this->error = $log_text; + } + + function parse() { + + set_error_handler(array(&$this, 'error_handler')); + + array_unshift($this->ns_contexts, array()); + + if ( ! function_exists( 'xml_parser_create_ns' ) ) { + trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) ); + return false; + } + + $parser = xml_parser_create_ns(); + xml_set_object($parser, $this); + xml_set_element_handler($parser, "start_element", "end_element"); + xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0); + xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0); + xml_set_character_data_handler($parser, "cdata"); + xml_set_default_handler($parser, "_default"); + xml_set_start_namespace_decl_handler($parser, "start_ns"); + xml_set_end_namespace_decl_handler($parser, "end_ns"); + + $this->content = ''; + + $ret = true; + + $fp = fopen($this->FILE, "r"); + while ($data = fread($fp, 4096)) { + if($this->debug) $this->content .= $data; + + if(!xml_parse($parser, $data, feof($fp))) { + /* translators: 1: Error message, 2: Line number. */ + trigger_error(sprintf(__('XML Error: %1$s at line %2$s')."\n", + xml_error_string(xml_get_error_code($parser)), + xml_get_current_line_number($parser))); + $ret = false; + break; + } + } + fclose($fp); + + xml_parser_free($parser); + + restore_error_handler(); + + return $ret; + } + + function start_element($parser, $name, $attrs) { + + $tag = array_pop(explode(":", $name)); + + switch($name) { + case $this->NS . ':feed': + $this->current = $this->feed; + break; + case $this->NS . ':entry': + $this->current = new AtomEntry(); + break; + }; + + $this->_p("start_element('$name')"); + #$this->_p(print_r($this->ns_contexts,true)); + #$this->_p('current(' . $this->current . ')'); + + array_unshift($this->ns_contexts, $this->ns_decls); + + $this->depth++; + + if(!empty($this->in_content)) { + + $this->content_ns_decls = array(); + + if($this->is_html || $this->is_text) + trigger_error("Invalid content in element found. Content must not be of type text or html if it contains markup."); + + $attrs_prefix = array(); + + // resolve prefixes for attributes + foreach($attrs as $key => $value) { + $with_prefix = $this->ns_to_prefix($key, true); + $attrs_prefix[$with_prefix[1]] = $this->xml_escape($value); + } + + $attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix))); + if(strlen($attrs_str) > 0) { + $attrs_str = " " . $attrs_str; + } + + $with_prefix = $this->ns_to_prefix($name); + + if(!$this->is_declared_content_ns($with_prefix[0])) { + array_push($this->content_ns_decls, $with_prefix[0]); + } + + $xmlns_str = ''; + if(count($this->content_ns_decls) > 0) { + array_unshift($this->content_ns_contexts, $this->content_ns_decls); + $xmlns_str .= join(' ', array_map($this->map_xmlns_func, array_keys($this->content_ns_contexts[0]), array_values($this->content_ns_contexts[0]))); + if(strlen($xmlns_str) > 0) { + $xmlns_str = " " . $xmlns_str; + } + } + + array_push($this->in_content, array($tag, $this->depth, "<". $with_prefix[1] ."{$xmlns_str}{$attrs_str}" . ">")); + + } else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) { + $this->in_content = array(); + $this->is_xhtml = $attrs['type'] == 'xhtml'; + $this->is_html = $attrs['type'] == 'html' || $attrs['type'] == 'text/html'; + $this->is_text = !in_array('type',array_keys($attrs)) || $attrs['type'] == 'text'; + $type = $this->is_xhtml ? 'XHTML' : ($this->is_html ? 'HTML' : ($this->is_text ? 'TEXT' : $attrs['type'])); + + if(in_array('src',array_keys($attrs))) { + $this->current->$tag = $attrs; + } else { + array_push($this->in_content, array($tag,$this->depth, $type)); + } + } else if($tag == 'link') { + array_push($this->current->links, $attrs); + } else if($tag == 'category') { + array_push($this->current->categories, $attrs); + } + + $this->ns_decls = array(); + } + + function end_element($parser, $name) { + + $tag = array_pop(explode(":", $name)); + + $ccount = count($this->in_content); + + # if we are *in* content, then let's proceed to serialize it + if(!empty($this->in_content)) { + # if we are ending the original content element + # then let's finalize the content + if($this->in_content[0][0] == $tag && + $this->in_content[0][1] == $this->depth) { + $origtype = $this->in_content[0][2]; + array_shift($this->in_content); + $newcontent = array(); + foreach($this->in_content as $c) { + if(count($c) == 3) { + array_push($newcontent, $c[2]); + } else { + if($this->is_xhtml || $this->is_text) { + array_push($newcontent, $this->xml_escape($c)); + } else { + array_push($newcontent, $c); + } + } + } + if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS)) { + $this->current->$tag = array($origtype, join('',$newcontent)); + } else { + $this->current->$tag = join('',$newcontent); + } + $this->in_content = array(); + } else if($this->in_content[$ccount-1][0] == $tag && + $this->in_content[$ccount-1][1] == $this->depth) { + $this->in_content[$ccount-1][2] = substr($this->in_content[$ccount-1][2],0,-1) . "/>"; + } else { + # else, just finalize the current element's content + $endtag = $this->ns_to_prefix($name); + array_push($this->in_content, array($tag, $this->depth, "</$endtag[1]>")); + } + } + + array_shift($this->ns_contexts); + + $this->depth--; + + if($name == ($this->NS . ':entry')) { + array_push($this->feed->entries, $this->current); + $this->current = null; + } + + $this->_p("end_element('$name')"); + } + + function start_ns($parser, $prefix, $uri) { + $this->_p("starting: " . $prefix . ":" . $uri); + array_push($this->ns_decls, array($prefix,$uri)); + } + + function end_ns($parser, $prefix) { + $this->_p("ending: #" . $prefix . "#"); + } + + function cdata($parser, $data) { + $this->_p("data: #" . str_replace(array("\n"), array("\\n"), trim($data)) . "#"); + if(!empty($this->in_content)) { + array_push($this->in_content, $data); + } + } + + function _default($parser, $data) { + # when does this gets called? + } + + + function ns_to_prefix($qname, $attr=false) { + # split 'http://www.w3.org/1999/xhtml:div' into ('http','//www.w3.org/1999/xhtml','div') + $components = explode(":", $qname); + + # grab the last one (e.g 'div') + $name = array_pop($components); + + if(!empty($components)) { + # re-join back the namespace component + $ns = join(":",$components); + foreach($this->ns_contexts as $context) { + foreach($context as $mapping) { + if($mapping[1] == $ns && strlen($mapping[0]) > 0) { + return array($mapping, "$mapping[0]:$name"); + } + } + } + } + + if($attr) { + return array(null, $name); + } else { + foreach($this->ns_contexts as $context) { + foreach($context as $mapping) { + if(strlen($mapping[0]) == 0) { + return array($mapping, $name); + } + } + } + } + } + + function is_declared_content_ns($new_mapping) { + foreach($this->content_ns_contexts as $context) { + foreach($context as $mapping) { + if($new_mapping == $mapping) { + return true; + } + } + } + return false; + } + + function xml_escape($string) + { + return str_replace(array('&','"',"'",'<','>'), + array('&','"',''','<','>'), + $string ); + } +} diff --git a/wp-includes/author-template.php b/wp-includes/author-template.php new file mode 100644 index 0000000..2646fb9 --- /dev/null +++ b/wp-includes/author-template.php @@ -0,0 +1,571 @@ +<?php +/** + * Author Template functions for use in themes. + * + * These functions must be used within the WordPress Loop. + * + * @link https://codex.wordpress.org/Author_Templates + * + * @package WordPress + * @subpackage Template + */ + +/** + * Retrieve the author of the current post. + * + * @since 1.5.0 + * + * @global object $authordata The current author's DB object. + * + * @param string $deprecated Deprecated. + * @return string|null The author's display name. + */ +function get_the_author( $deprecated = '' ) { + global $authordata; + + if ( ! empty( $deprecated ) ) { + _deprecated_argument( __FUNCTION__, '2.1.0' ); + } + + /** + * Filters the display name of the current post's author. + * + * @since 2.9.0 + * + * @param string $authordata->display_name The author's display name. + */ + return apply_filters( 'the_author', is_object( $authordata ) ? $authordata->display_name : null ); +} + +/** + * Display the name of the author of the current post. + * + * The behavior of this function is based off of old functionality predating + * get_the_author(). This function is not deprecated, but is designed to echo + * the value from get_the_author() and as an result of any old theme that might + * still use the old behavior will also pass the value from get_the_author(). + * + * The normal, expected behavior of this function is to echo the author and not + * return it. However, backward compatibility has to be maintained. + * + * @since 0.71 + * @see get_the_author() + * @link https://developer.wordpress.org/reference/functions/the_author/ + * + * @param string $deprecated Deprecated. + * @param bool $deprecated_echo Deprecated. Use get_the_author(). Echo the string or return it. + * @return string|null The author's display name, from get_the_author(). + */ +function the_author( $deprecated = '', $deprecated_echo = true ) { + if ( ! empty( $deprecated ) ) { + _deprecated_argument( __FUNCTION__, '2.1.0' ); + } + + if ( true !== $deprecated_echo ) { + _deprecated_argument( + __FUNCTION__, + '1.5.0', + sprintf( + /* translators: %s: get_the_author() */ + __( 'Use %s instead if you do not want the value echoed.' ), + '<code>get_the_author()</code>' + ) + ); + } + + if ( $deprecated_echo ) { + echo get_the_author(); + } + + return get_the_author(); +} + +/** + * Retrieve the author who last edited the current post. + * + * @since 2.8.0 + * + * @return string|void The author's display name. + */ +function get_the_modified_author() { + $last_id = get_post_meta( get_post()->ID, '_edit_last', true ); + + if ( $last_id ) { + $last_user = get_userdata( $last_id ); + + /** + * Filters the display name of the author who last edited the current post. + * + * @since 2.8.0 + * + * @param string $last_user->display_name The author's display name. + */ + return apply_filters( 'the_modified_author', $last_user->display_name ); + } +} + +/** + * Display the name of the author who last edited the current post, + * if the author's ID is available. + * + * @since 2.8.0 + * + * @see get_the_author() + */ +function the_modified_author() { + echo get_the_modified_author(); +} + +/** + * Retrieves the requested data of the author of the current post. + * + * Valid values for the `$field` parameter include: + * + * - admin_color + * - aim + * - comment_shortcuts + * - description + * - display_name + * - first_name + * - ID + * - jabber + * - last_name + * - nickname + * - plugins_last_view + * - plugins_per_page + * - rich_editing + * - syntax_highlighting + * - user_activation_key + * - user_description + * - user_email + * - user_firstname + * - user_lastname + * - user_level + * - user_login + * - user_nicename + * - user_pass + * - user_registered + * - user_status + * - user_url + * - yim + * + * @since 2.8.0 + * + * @global object $authordata The current author's DB object. + * + * @param string $field Optional. The user field to retrieve. Default empty. + * @param int|false $user_id Optional. User ID. + * @return string The author's field from the current author's DB object, otherwise an empty string. + */ +function get_the_author_meta( $field = '', $user_id = false ) { + $original_user_id = $user_id; + + if ( ! $user_id ) { + global $authordata; + $user_id = isset( $authordata->ID ) ? $authordata->ID : 0; + } else { + $authordata = get_userdata( $user_id ); + } + + if ( in_array( $field, array( 'login', 'pass', 'nicename', 'email', 'url', 'registered', 'activation_key', 'status' ) ) ) { + $field = 'user_' . $field; + } + + $value = isset( $authordata->$field ) ? $authordata->$field : ''; + + /** + * Filters the value of the requested user metadata. + * + * The filter name is dynamic and depends on the $field parameter of the function. + * + * @since 2.8.0 + * @since 4.3.0 The `$original_user_id` parameter was added. + * + * @param string $value The value of the metadata. + * @param int $user_id The user ID for the value. + * @param int|false $original_user_id The original user ID, as passed to the function. + */ + return apply_filters( "get_the_author_{$field}", $value, $user_id, $original_user_id ); +} + +/** + * Outputs the field from the user's DB object. Defaults to current post's author. + * + * @since 2.8.0 + * + * @param string $field Selects the field of the users record. See get_the_author_meta() + * for the list of possible fields. + * @param int|false $user_id Optional. User ID. + * + * @see get_the_author_meta() + */ +function the_author_meta( $field = '', $user_id = false ) { + $author_meta = get_the_author_meta( $field, $user_id ); + + /** + * The value of the requested user metadata. + * + * The filter name is dynamic and depends on the $field parameter of the function. + * + * @since 2.8.0 + * + * @param string $author_meta The value of the metadata. + * @param int|false $user_id The user ID. + */ + echo apply_filters( "the_author_{$field}", $author_meta, $user_id ); +} + +/** + * Retrieve either author's link or author's name. + * + * If the author has a home page set, return an HTML link, otherwise just return the + * author's name. + * + * @since 3.0.0 + * + * @return string|null An HTML link if the author's url exist in user meta, + * else the result of get_the_author(). + */ +function get_the_author_link() { + if ( get_the_author_meta( 'url' ) ) { + return sprintf( + '<a href="%1$s" title="%2$s" rel="author external">%3$s</a>', + esc_url( get_the_author_meta( 'url' ) ), + /* translators: %s: Author's display name. */ + esc_attr( sprintf( __( 'Visit %s’s website' ), get_the_author() ) ), + get_the_author() + ); + } else { + return get_the_author(); + } +} + +/** + * Display either author's link or author's name. + * + * If the author has a home page set, echo an HTML link, otherwise just echo the + * author's name. + * + * @link https://developer.wordpress.org/reference/functions/the_author_link/ + * + * @since 2.1.0 + */ +function the_author_link() { + echo get_the_author_link(); +} + +/** + * Retrieve the number of posts by the author of the current post. + * + * @since 1.5.0 + * + * @return int The number of posts by the author. + */ +function get_the_author_posts() { + $post = get_post(); + if ( ! $post ) { + return 0; + } + return count_user_posts( $post->post_author, $post->post_type ); +} + +/** + * Display the number of posts by the author of the current post. + * + * @link https://developer.wordpress.org/reference/functions/the_author_posts/ + * @since 0.71 + */ +function the_author_posts() { + echo get_the_author_posts(); +} + +/** + * Retrieves an HTML link to the author page of the current post's author. + * + * Returns an HTML-formatted link using get_author_posts_url(). + * + * @since 4.4.0 + * + * @global object $authordata The current author's DB object. + * + * @return string An HTML link to the author page, or an empty string if $authordata isn't defined. + */ +function get_the_author_posts_link() { + global $authordata; + if ( ! is_object( $authordata ) ) { + return ''; + } + + $link = sprintf( + '<a href="%1$s" title="%2$s" rel="author">%3$s</a>', + esc_url( get_author_posts_url( $authordata->ID, $authordata->user_nicename ) ), + /* translators: %s: Author's display name. */ + esc_attr( sprintf( __( 'Posts by %s' ), get_the_author() ) ), + get_the_author() + ); + + /** + * Filters the link to the author page of the author of the current post. + * + * @since 2.9.0 + * + * @param string $link HTML link. + */ + return apply_filters( 'the_author_posts_link', $link ); +} + +/** + * Displays an HTML link to the author page of the current post's author. + * + * @since 1.2.0 + * @since 4.4.0 Converted into a wrapper for get_the_author_posts_link() + * + * @param string $deprecated Unused. + */ +function the_author_posts_link( $deprecated = '' ) { + if ( ! empty( $deprecated ) ) { + _deprecated_argument( __FUNCTION__, '2.1.0' ); + } + echo get_the_author_posts_link(); +} + +/** + * Retrieve the URL to the author page for the user with the ID provided. + * + * @since 2.1.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * + * @param int $author_id Author ID. + * @param string $author_nicename Optional. The author's nicename (slug). Default empty. + * @return string The URL to the author's page. + */ +function get_author_posts_url( $author_id, $author_nicename = '' ) { + global $wp_rewrite; + $auth_ID = (int) $author_id; + $link = $wp_rewrite->get_author_permastruct(); + + if ( empty( $link ) ) { + $file = home_url( '/' ); + $link = $file . '?author=' . $auth_ID; + } else { + if ( '' == $author_nicename ) { + $user = get_userdata( $author_id ); + if ( ! empty( $user->user_nicename ) ) { + $author_nicename = $user->user_nicename; + } + } + $link = str_replace( '%author%', $author_nicename, $link ); + $link = home_url( user_trailingslashit( $link ) ); + } + + /** + * Filters the URL to the author's page. + * + * @since 2.1.0 + * + * @param string $link The URL to the author's page. + * @param int $author_id The author's id. + * @param string $author_nicename The author's nice name. + */ + $link = apply_filters( 'author_link', $link, $author_id, $author_nicename ); + + return $link; +} + +/** + * List all the authors of the site, with several options available. + * + * @link https://developer.wordpress.org/reference/functions/wp_list_authors/ + * + * @since 1.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string|array $args { + * Optional. Array or string of default arguments. + * + * @type string $orderby How to sort the authors. Accepts 'nicename', 'email', 'url', 'registered', + * 'user_nicename', 'user_email', 'user_url', 'user_registered', 'name', + * 'display_name', 'post_count', 'ID', 'meta_value', 'user_login'. Default 'name'. + * @type string $order Sorting direction for $orderby. Accepts 'ASC', 'DESC'. Default 'ASC'. + * @type int $number Maximum authors to return or display. Default empty (all authors). + * @type bool $optioncount Show the count in parenthesis next to the author's name. Default false. + * @type bool $exclude_admin Whether to exclude the 'admin' account, if it exists. Default true. + * @type bool $show_fullname Whether to show the author's full name. Default false. + * @type bool $hide_empty Whether to hide any authors with no posts. Default true. + * @type string $feed If not empty, show a link to the author's feed and use this text as the alt + * parameter of the link. Default empty. + * @type string $feed_image If not empty, show a link to the author's feed and use this image URL as + * clickable anchor. Default empty. + * @type string $feed_type The feed type to link to. Possible values include 'rss2', 'atom'. + * Default is the value of get_default_feed(). + * @type bool $echo Whether to output the result or instead return it. Default true. + * @type string $style If 'list', each author is wrapped in an `<li>` element, otherwise the authors + * will be separated by commas. + * @type bool $html Whether to list the items in HTML form or plaintext. Default true. + * @type array|string $exclude Array or comma/space-separated list of author IDs to exclude. Default empty. + * @type array|string $include Array or comma/space-separated list of author IDs to include. Default empty. + * } + * @return void|string Void if 'echo' argument is true, list of authors if 'echo' is false. + */ +function wp_list_authors( $args = '' ) { + global $wpdb; + + $defaults = array( + 'orderby' => 'name', + 'order' => 'ASC', + 'number' => '', + 'optioncount' => false, + 'exclude_admin' => true, + 'show_fullname' => false, + 'hide_empty' => true, + 'feed' => '', + 'feed_image' => '', + 'feed_type' => '', + 'echo' => true, + 'style' => 'list', + 'html' => true, + 'exclude' => '', + 'include' => '', + ); + + $args = wp_parse_args( $args, $defaults ); + + $return = ''; + + $query_args = wp_array_slice_assoc( $args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) ); + $query_args['fields'] = 'ids'; + $authors = get_users( $query_args ); + + $author_count = array(); + foreach ( (array) $wpdb->get_results( "SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE " . get_private_posts_cap_sql( 'post' ) . ' GROUP BY post_author' ) as $row ) { + $author_count[ $row->post_author ] = $row->count; + } + foreach ( $authors as $author_id ) { + $posts = isset( $author_count[ $author_id ] ) ? $author_count[ $author_id ] : 0; + + if ( ! $posts && $args['hide_empty'] ) { + continue; + } + + $author = get_userdata( $author_id ); + + if ( $args['exclude_admin'] && 'admin' === $author->display_name ) { + continue; + } + + if ( $args['show_fullname'] && $author->first_name && $author->last_name ) { + $name = "$author->first_name $author->last_name"; + } else { + $name = $author->display_name; + } + + if ( ! $args['html'] ) { + $return .= $name . ', '; + + continue; // No need to go further to process HTML. + } + + if ( 'list' == $args['style'] ) { + $return .= '<li>'; + } + + $link = sprintf( + '<a href="%1$s" title="%2$s">%3$s</a>', + get_author_posts_url( $author->ID, $author->user_nicename ), + /* translators: %s: Author's display name. */ + esc_attr( sprintf( __( 'Posts by %s' ), $author->display_name ) ), + $name + ); + + if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) { + $link .= ' '; + if ( empty( $args['feed_image'] ) ) { + $link .= '('; + } + + $link .= '<a href="' . get_author_feed_link( $author->ID, $args['feed_type'] ) . '"'; + + $alt = ''; + if ( ! empty( $args['feed'] ) ) { + $alt = ' alt="' . esc_attr( $args['feed'] ) . '"'; + $name = $args['feed']; + } + + $link .= '>'; + + if ( ! empty( $args['feed_image'] ) ) { + $link .= '<img src="' . esc_url( $args['feed_image'] ) . '" style="border: none;"' . $alt . ' />'; + } else { + $link .= $name; + } + + $link .= '</a>'; + + if ( empty( $args['feed_image'] ) ) { + $link .= ')'; + } + } + + if ( $args['optioncount'] ) { + $link .= ' (' . $posts . ')'; + } + + $return .= $link; + $return .= ( 'list' == $args['style'] ) ? '</li>' : ', '; + } + + $return = rtrim( $return, ', ' ); + + if ( $args['echo'] ) { + echo $return; + } else { + return $return; + } +} + +/** + * Determines whether this site has more than one author. + * + * Checks to see if more than one author has published posts. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 3.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return bool Whether or not we have more than one author + */ +function is_multi_author() { + global $wpdb; + + $is_multi_author = get_transient( 'is_multi_author' ); + if ( false === $is_multi_author ) { + $rows = (array) $wpdb->get_col( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 2" ); + $is_multi_author = 1 < count( $rows ) ? 1 : 0; + set_transient( 'is_multi_author', $is_multi_author ); + } + + /** + * Filters whether the site has more than one author with published posts. + * + * @since 3.2.0 + * + * @param bool $is_multi_author Whether $is_multi_author should evaluate as true. + */ + return apply_filters( 'is_multi_author', (bool) $is_multi_author ); +} + +/** + * Helper function to clear the cache for number of authors. + * + * @since 3.2.0 + * @access private + */ +function __clear_multi_author_cache() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore + delete_transient( 'is_multi_author' ); +} diff --git a/wp-includes/blocks.php b/wp-includes/blocks.php new file mode 100644 index 0000000..422b75e --- /dev/null +++ b/wp-includes/blocks.php @@ -0,0 +1,610 @@ +<?php +/** + * Functions related to registering and parsing blocks. + * + * @package WordPress + * @subpackage Blocks + * @since 5.0.0 + */ + +/** + * Registers a block type. + * + * @since 5.0.0 + * + * @param string|WP_Block_Type $name Block type name including namespace, or alternatively a + * complete WP_Block_Type instance. In case a WP_Block_Type + * is provided, the $args parameter will be ignored. + * @param array $args { + * Optional. Array of block type arguments. Any arguments may be defined, however the + * ones described below are supported by default. Default empty array. + * + * @type callable $render_callback Callback used to render blocks of this block type. + * } + * @return WP_Block_Type|false The registered block type on success, or false on failure. + */ +function register_block_type( $name, $args = array() ) { + return WP_Block_Type_Registry::get_instance()->register( $name, $args ); +} + +/** + * Unregisters a block type. + * + * @since 5.0.0 + * + * @param string|WP_Block_Type $name Block type name including namespace, or alternatively a + * complete WP_Block_Type instance. + * @return WP_Block_Type|false The unregistered block type on success, or false on failure. + */ +function unregister_block_type( $name ) { + return WP_Block_Type_Registry::get_instance()->unregister( $name ); +} + +/** + * Determine whether a post or content string has blocks. + * + * This test optimizes for performance rather than strict accuracy, detecting + * the pattern of a block but not validating its structure. For strict accuracy, + * you should use the block parser on post content. + * + * @since 5.0.0 + * @see parse_blocks() + * + * @param int|string|WP_Post|null $post Optional. Post content, post ID, or post object. Defaults to global $post. + * @return bool Whether the post has blocks. + */ +function has_blocks( $post = null ) { + if ( ! is_string( $post ) ) { + $wp_post = get_post( $post ); + if ( $wp_post instanceof WP_Post ) { + $post = $wp_post->post_content; + } + } + + return false !== strpos( (string) $post, '<!-- wp:' ); +} + +/** + * Determine whether a $post or a string contains a specific block type. + * + * This test optimizes for performance rather than strict accuracy, detecting + * the block type exists but not validating its structure. For strict accuracy, + * you should use the block parser on post content. + * + * @since 5.0.0 + * @see parse_blocks() + * + * @param string $block_name Full Block type to look for. + * @param int|string|WP_Post|null $post Optional. Post content, post ID, or post object. Defaults to global $post. + * @return bool Whether the post content contains the specified block. + */ +function has_block( $block_name, $post = null ) { + if ( ! has_blocks( $post ) ) { + return false; + } + + if ( ! is_string( $post ) ) { + $wp_post = get_post( $post ); + if ( $wp_post instanceof WP_Post ) { + $post = $wp_post->post_content; + } + } + + /* + * Normalize block name to include namespace, if provided as non-namespaced. + * This matches behavior for WordPress 5.0.0 - 5.3.0 in matching blocks by + * their serialized names. + */ + if ( false === strpos( $block_name, '/' ) ) { + $block_name = 'core/' . $block_name; + } + + // Test for existence of block by its fully qualified name. + $has_block = false !== strpos( $post, '<!-- wp:' . $block_name . ' ' ); + + if ( ! $has_block ) { + /* + * If the given block name would serialize to a different name, test for + * existence by the serialized form. + */ + $serialized_block_name = strip_core_block_namespace( $block_name ); + if ( $serialized_block_name !== $block_name ) { + $has_block = false !== strpos( $post, '<!-- wp:' . $serialized_block_name . ' ' ); + } + } + + return $has_block; +} + +/** + * Returns an array of the names of all registered dynamic block types. + * + * @since 5.0.0 + * + * @return string[] Array of dynamic block names. + */ +function get_dynamic_block_names() { + $dynamic_block_names = array(); + + $block_types = WP_Block_Type_Registry::get_instance()->get_all_registered(); + foreach ( $block_types as $block_type ) { + if ( $block_type->is_dynamic() ) { + $dynamic_block_names[] = $block_type->name; + } + } + + return $dynamic_block_names; +} + +/** + * Given an array of attributes, returns a string in the serialized attributes + * format prepared for post content. + * + * The serialized result is a JSON-encoded string, with unicode escape sequence + * substitution for characters which might otherwise interfere with embedding + * the result in an HTML comment. + * + * @since 5.3.1 + * + * @param array $attributes Attributes object. + * @return string Serialized attributes. + */ +function serialize_block_attributes( $block_attributes ) { + $encoded_attributes = json_encode( $block_attributes ); + $encoded_attributes = preg_replace( '/--/', '\\u002d\\u002d', $encoded_attributes ); + $encoded_attributes = preg_replace( '/</', '\\u003c', $encoded_attributes ); + $encoded_attributes = preg_replace( '/>/', '\\u003e', $encoded_attributes ); + $encoded_attributes = preg_replace( '/&/', '\\u0026', $encoded_attributes ); + // Regex: /\\"/ + $encoded_attributes = preg_replace( '/\\\\"/', '\\u0022', $encoded_attributes ); + + return $encoded_attributes; +} + +/** + * Returns the block name to use for serialization. This will remove the default + * "core/" namespace from a block name. + * + * @since 5.3.1 + * + * @param string $block_name Original block name. + * @return string Block name to use for serialization. + */ +function strip_core_block_namespace( $block_name = null ) { + if ( is_string( $block_name ) && 0 === strpos( $block_name, 'core/' ) ) { + return substr( $block_name, 5 ); + } + + return $block_name; +} + +/** + * Returns the content of a block, including comment delimiters. + * + * @since 5.3.1 + * + * @param string $block_name Block name. + * @param array $attributes Block attributes. + * @param string $content Block save content. + * @return string Comment-delimited block content. + */ +function get_comment_delimited_block_content( $block_name = null, $block_attributes, $block_content ) { + if ( is_null( $block_name ) ) { + return $block_content; + } + + $serialized_block_name = strip_core_block_namespace( $block_name ); + $serialized_attributes = empty( $block_attributes ) ? '' : serialize_block_attributes( $block_attributes ) . ' '; + + if ( empty( $block_content ) ) { + return sprintf( '<!-- wp:%s %s/-->', $serialized_block_name, $serialized_attributes ); + } + + return sprintf( + '<!-- wp:%s %s-->%s<!-- /wp:%s -->', + $serialized_block_name, + $serialized_attributes, + $block_content, + $serialized_block_name + ); +} + +/** + * Returns the content of a block, including comment delimiters, serializing all + * attributes from the given parsed block. + * + * This should be used when preparing a block to be saved to post content. + * Prefer `render_block` when preparing a block for display. Unlike + * `render_block`, this does not evaluate a block's `render_callback`, and will + * instead preserve the markup as parsed. + * + * @since 5.3.1 + * + * @param WP_Block_Parser_Block $block A single parsed block object. + * @return string String of rendered HTML. + */ +function serialize_block( $block ) { + $block_content = ''; + + $index = 0; + foreach ( $block['innerContent'] as $chunk ) { + $block_content .= is_string( $chunk ) ? $chunk : serialize_block( $block['innerBlocks'][ $index++ ] ); + } + + if ( ! is_array( $block['attrs'] ) ) { + $block['attrs'] = array(); + } + + return get_comment_delimited_block_content( + $block['blockName'], + $block['attrs'], + $block_content + ); +} + +/** + * Returns a joined string of the aggregate serialization of the given parsed + * blocks. + * + * @since 5.3.1 + * + * @param WP_Block_Parser_Block[] $blocks Parsed block objects. + * @return string String of rendered HTML. + */ +function serialize_blocks( $blocks ) { + return implode( '', array_map( 'serialize_block', $blocks ) ); +} + +/** + * Filters and sanitizes block content to remove non-allowable HTML from + * parsed block attribute values. + * + * @since 5.3.1 + * + * @param string $text Text that may contain block content. + * @param array[]|string $allowed_html An array of allowed HTML elements + * and attributes, or a context name + * such as 'post'. + * @param string[] $allowed_protocols Array of allowed URL protocols. + * @return string The filtered and sanitized content result. + */ +function filter_block_content( $text, $allowed_html = 'post', $allowed_protocols = array() ) { + $result = ''; + + $blocks = parse_blocks( $text ); + foreach ( $blocks as $block ) { + $block = filter_block_kses( $block, $allowed_html, $allowed_protocols ); + $result .= serialize_block( $block ); + } + + return $result; +} + +/** + * Filters and sanitizes a parsed block to remove non-allowable HTML from block + * attribute values. + * + * @since 5.3.1 + * + * @param WP_Block_Parser_Block $block The parsed block object. + * @param array[]|string $allowed_html An array of allowed HTML + * elements and attributes, or a + * context name such as 'post'. + * @param string[] $allowed_protocols Allowed URL protocols. + * @return array The filtered and sanitized block object result. + */ +function filter_block_kses( $block, $allowed_html, $allowed_protocols = array() ) { + $block['attrs'] = filter_block_kses_value( $block['attrs'], $allowed_html, $allowed_protocols ); + + if ( is_array( $block['innerBlocks'] ) ) { + foreach ( $block['innerBlocks'] as $i => $inner_block ) { + $block['innerBlocks'][ $i ] = filter_block_kses( $inner_block, $allowed_html, $allowed_protocols ); + } + } + + return $block; +} + +/** + * Filters and sanitizes a parsed block attribute value to remove non-allowable + * HTML. + * + * @since 5.3.1 + * + * @param string[]|string $value The attribute value to filter. + * @param array[]|string $allowed_html An array of allowed HTML elements + * and attributes, or a context name + * such as 'post'. + * @param string[] $allowed_protocols Array of allowed URL protocols. + * @return string[]|string The filtered and sanitized result. + */ +function filter_block_kses_value( $value, $allowed_html, $allowed_protocols = array() ) { + if ( is_array( $value ) ) { + foreach ( $value as $key => $inner_value ) { + $filtered_key = filter_block_kses_value( $key, $allowed_html, $allowed_protocols ); + $filtered_value = filter_block_kses_value( $inner_value, $allowed_html, $allowed_protocols ); + + if ( $filtered_key !== $key ) { + unset( $value[ $key ] ); + } + + $value[ $filtered_key ] = $filtered_value; + } + } elseif ( is_string( $value ) ) { + return wp_kses( $value, $allowed_html, $allowed_protocols ); + } + + return $value; +} + +/** + * Parses blocks out of a content string, and renders those appropriate for the excerpt. + * + * As the excerpt should be a small string of text relevant to the full post content, + * this function renders the blocks that are most likely to contain such text. + * + * @since 5.0.0 + * + * @param string $content The content to parse. + * @return string The parsed and filtered content. + */ +function excerpt_remove_blocks( $content ) { + $allowed_inner_blocks = array( + // Classic blocks have their blockName set to null. + null, + 'core/freeform', + 'core/heading', + 'core/html', + 'core/list', + 'core/media-text', + 'core/paragraph', + 'core/preformatted', + 'core/pullquote', + 'core/quote', + 'core/table', + 'core/verse', + ); + + $allowed_blocks = array_merge( $allowed_inner_blocks, array( 'core/columns' ) ); + + /** + * Filters the list of blocks that can contribute to the excerpt. + * + * If a dynamic block is added to this list, it must not generate another + * excerpt, as this will cause an infinite loop to occur. + * + * @since 5.0.0 + * + * @param array $allowed_blocks The list of allowed blocks. + */ + $allowed_blocks = apply_filters( 'excerpt_allowed_blocks', $allowed_blocks ); + $blocks = parse_blocks( $content ); + $output = ''; + + foreach ( $blocks as $block ) { + if ( in_array( $block['blockName'], $allowed_blocks, true ) ) { + if ( ! empty( $block['innerBlocks'] ) ) { + if ( 'core/columns' === $block['blockName'] ) { + $output .= _excerpt_render_inner_columns_blocks( $block, $allowed_inner_blocks ); + continue; + } + + // Skip the block if it has disallowed or nested inner blocks. + foreach ( $block['innerBlocks'] as $inner_block ) { + if ( + ! in_array( $inner_block['blockName'], $allowed_inner_blocks, true ) || + ! empty( $inner_block['innerBlocks'] ) + ) { + continue 2; + } + } + } + + $output .= render_block( $block ); + } + } + + return $output; +} + +/** + * Render inner blocks from the `core/columns` block for generating an excerpt. + * + * @since 5.2.0 + * @access private + * + * @param array $columns The parsed columns block. + * @param array $allowed_blocks The list of allowed inner blocks. + * @return string The rendered inner blocks. + */ +function _excerpt_render_inner_columns_blocks( $columns, $allowed_blocks ) { + $output = ''; + + foreach ( $columns['innerBlocks'] as $column ) { + foreach ( $column['innerBlocks'] as $inner_block ) { + if ( in_array( $inner_block['blockName'], $allowed_blocks, true ) && empty( $inner_block['innerBlocks'] ) ) { + $output .= render_block( $inner_block ); + } + } + } + + return $output; +} + +/** + * Renders a single block into a HTML string. + * + * @since 5.0.0 + * + * @global WP_Post $post The post to edit. + * + * @param array $block A single parsed block object. + * @return string String of rendered HTML. + */ +function render_block( $block ) { + global $post; + + /** + * Allows render_block() to be shortcircuited, by returning a non-null value. + * + * @since 5.1.0 + * + * @param string|null $pre_render The pre-rendered content. Default null. + * @param array $block The block being rendered. + */ + $pre_render = apply_filters( 'pre_render_block', null, $block ); + if ( ! is_null( $pre_render ) ) { + return $pre_render; + } + + $source_block = $block; + + /** + * Filters the block being rendered in render_block(), before it's processed. + * + * @since 5.1.0 + * + * @param array $block The block being rendered. + * @param array $source_block An un-modified copy of $block, as it appeared in the source content. + */ + $block = apply_filters( 'render_block_data', $block, $source_block ); + + $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); + $is_dynamic = $block['blockName'] && null !== $block_type && $block_type->is_dynamic(); + $block_content = ''; + $index = 0; + + foreach ( $block['innerContent'] as $chunk ) { + $block_content .= is_string( $chunk ) ? $chunk : render_block( $block['innerBlocks'][ $index++ ] ); + } + + if ( ! is_array( $block['attrs'] ) ) { + $block['attrs'] = array(); + } + + if ( $is_dynamic ) { + $global_post = $post; + $block_content = $block_type->render( $block['attrs'], $block_content ); + $post = $global_post; + } + + /** + * Filters the content of a single block. + * + * @since 5.0.0 + * + * @param string $block_content The block content about to be appended. + * @param array $block The full block, including name and attributes. + */ + return apply_filters( 'render_block', $block_content, $block ); +} + +/** + * Parses blocks out of a content string. + * + * @since 5.0.0 + * + * @param string $content Post content. + * @return array[] Array of parsed block objects. + */ +function parse_blocks( $content ) { + /** + * Filter to allow plugins to replace the server-side block parser + * + * @since 5.0.0 + * + * @param string $parser_class Name of block parser class. + */ + $parser_class = apply_filters( 'block_parser_class', 'WP_Block_Parser' ); + + $parser = new $parser_class(); + return $parser->parse( $content ); +} + +/** + * Parses dynamic blocks out of `post_content` and re-renders them. + * + * @since 5.0.0 + * + * @param string $content Post content. + * @return string Updated post content. + */ +function do_blocks( $content ) { + $blocks = parse_blocks( $content ); + $output = ''; + + foreach ( $blocks as $block ) { + $output .= render_block( $block ); + } + + // If there are blocks in this content, we shouldn't run wpautop() on it later. + $priority = has_filter( 'the_content', 'wpautop' ); + if ( false !== $priority && doing_filter( 'the_content' ) && has_blocks( $content ) ) { + remove_filter( 'the_content', 'wpautop', $priority ); + add_filter( 'the_content', '_restore_wpautop_hook', $priority + 1 ); + } + + return $output; +} + +/** + * If do_blocks() needs to remove wpautop() from the `the_content` filter, this re-adds it afterwards, + * for subsequent `the_content` usage. + * + * @access private + * + * @since 5.0.0 + * + * @param string $content The post content running through this filter. + * @return string The unmodified content. + */ +function _restore_wpautop_hook( $content ) { + $current_priority = has_filter( 'the_content', '_restore_wpautop_hook' ); + + add_filter( 'the_content', 'wpautop', $current_priority - 1 ); + remove_filter( 'the_content', '_restore_wpautop_hook', $current_priority ); + + return $content; +} + +/** + * Returns the current version of the block format that the content string is using. + * + * If the string doesn't contain blocks, it returns 0. + * + * @since 5.0.0 + * + * @param string $content Content to test. + * @return int The block format version is 1 if the content contains one or more blocks, 0 otherwise. + */ +function block_version( $content ) { + return has_blocks( $content ) ? 1 : 0; +} + +/** + * Registers a new block style. + * + * @since 5.3.0 + * + * @param string $block_name Block type name including namespace. + * @param array $style_properties Array containing the properties of the style name, label, style (name of the stylesheet to be enqueued), inline_style (string containing the CSS to be added). + * + * @return boolean True if the block style was registered with success and false otherwise. + */ +function register_block_style( $block_name, $style_properties ) { + return WP_Block_Styles_Registry::get_instance()->register( $block_name, $style_properties ); +} + +/** + * Unregisters a block style. + * + * @since 5.3.0 + * + * @param string $block_name Block type name including namespace. + * @param array $block_style_name Block style name. + * + * @return boolean True if the block style was unregistered with success and false otherwise. + */ +function unregister_block_style( $block_name, $block_style_name ) { + return WP_Block_Styles_Registry::get_instance()->unregister( $block_name, $block_style_name ); +} diff --git a/wp-includes/blocks/archives.php b/wp-includes/blocks/archives.php new file mode 100644 index 0000000..172b1c7 --- /dev/null +++ b/wp-includes/blocks/archives.php @@ -0,0 +1,143 @@ +<?php +/** + * Server-side rendering of the `core/archives` block. + * + * @package WordPress + */ + +/** + * Renders the `core/archives` block on server. + * + * @see WP_Widget_Archives + * + * @param array $attributes The block attributes. + * + * @return string Returns the post content with archives added. + */ +function render_block_core_archives( $attributes ) { + $show_post_count = ! empty( $attributes['showPostCounts'] ); + + $class = 'wp-block-archives'; + + if ( isset( $attributes['align'] ) ) { + $class .= " align{$attributes['align']}"; + } + + if ( isset( $attributes['className'] ) ) { + $class .= " {$attributes['className']}"; + } + + if ( ! empty( $attributes['displayAsDropdown'] ) ) { + + $class .= ' wp-block-archives-dropdown'; + + $dropdown_id = esc_attr( uniqid( 'wp-block-archives-' ) ); + $title = __( 'Archives' ); + + /** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */ + $dropdown_args = apply_filters( + 'widget_archives_dropdown_args', + array( + 'type' => 'monthly', + 'format' => 'option', + 'show_post_count' => $show_post_count, + ) + ); + + $dropdown_args['echo'] = 0; + + $archives = wp_get_archives( $dropdown_args ); + + switch ( $dropdown_args['type'] ) { + case 'yearly': + $label = __( 'Select Year' ); + break; + case 'monthly': + $label = __( 'Select Month' ); + break; + case 'daily': + $label = __( 'Select Day' ); + break; + case 'weekly': + $label = __( 'Select Week' ); + break; + default: + $label = __( 'Select Post' ); + break; + } + + $label = esc_attr( $label ); + + $block_content = '<label class="screen-reader-text" for="' . $dropdown_id . '">' . $title . '</label> + <select id="' . $dropdown_id . '" name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;"> + <option value="">' . $label . '</option>' . $archives . '</select>'; + + return sprintf( + '<div class="%1$s">%2$s</div>', + esc_attr( $class ), + $block_content + ); + } + + $class .= ' wp-block-archives-list'; + + /** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */ + $archives_args = apply_filters( + 'widget_archives_args', + array( + 'type' => 'monthly', + 'show_post_count' => $show_post_count, + ) + ); + + $archives_args['echo'] = 0; + + $archives = wp_get_archives( $archives_args ); + + $classnames = esc_attr( $class ); + + if ( empty( $archives ) ) { + + return sprintf( + '<div class="%1$s">%2$s</div>', + $classnames, + __( 'No archives to show.' ) + ); + } + + return sprintf( + '<ul class="%1$s">%2$s</ul>', + $classnames, + $archives + ); +} + +/** + * Register archives block. + */ +function register_block_core_archives() { + register_block_type( + 'core/archives', + array( + 'attributes' => array( + 'align' => array( + 'type' => 'string', + 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), + ), + 'className' => array( + 'type' => 'string', + ), + 'displayAsDropdown' => array( + 'type' => 'boolean', + 'default' => false, + ), + 'showPostCounts' => array( + 'type' => 'boolean', + 'default' => false, + ), + ), + 'render_callback' => 'render_block_core_archives', + ) + ); +} +add_action( 'init', 'register_block_core_archives' ); diff --git a/wp-includes/blocks/block.php b/wp-includes/blocks/block.php new file mode 100644 index 0000000..24d2ab5 --- /dev/null +++ b/wp-includes/blocks/block.php @@ -0,0 +1,48 @@ +<?php +/** + * Server-side rendering of the `core/block` block. + * + * @package WordPress + */ + +/** + * Renders the `core/block` block on server. + * + * @param array $attributes The block attributes. + * + * @return string Rendered HTML of the referenced block. + */ +function render_block_core_block( $attributes ) { + if ( empty( $attributes['ref'] ) ) { + return ''; + } + + $reusable_block = get_post( $attributes['ref'] ); + if ( ! $reusable_block || 'wp_block' !== $reusable_block->post_type ) { + return ''; + } + + if ( 'publish' !== $reusable_block->post_status || ! empty( $reusable_block->post_password ) ) { + return ''; + } + + return do_blocks( $reusable_block->post_content ); +} + +/** + * Registers the `core/block` block. + */ +function register_block_core_block() { + register_block_type( + 'core/block', + array( + 'attributes' => array( + 'ref' => array( + 'type' => 'number', + ), + ), + 'render_callback' => 'render_block_core_block', + ) + ); +} +add_action( 'init', 'register_block_core_block' ); diff --git a/wp-includes/blocks/calendar.php b/wp-includes/blocks/calendar.php new file mode 100644 index 0000000..3d2e806 --- /dev/null +++ b/wp-includes/blocks/calendar.php @@ -0,0 +1,78 @@ +<?php +/** + * Server-side rendering of the `core/calendar` block. + * + * @package WordPress + */ + +/** + * Renders the `core/calendar` block on server. + * + * @param array $attributes The block attributes. + * + * @return string Returns the block content. + */ +function render_block_core_calendar( $attributes ) { + global $monthnum, $year; + + $previous_monthnum = $monthnum; + $previous_year = $year; + + if ( isset( $attributes['month'] ) && isset( $attributes['year'] ) ) { + $permalink_structure = get_option( 'permalink_structure' ); + if ( + strpos( $permalink_structure, '%monthnum%' ) !== false && + strpos( $permalink_structure, '%year%' ) !== false + ) { + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited + $monthnum = $attributes['month']; + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited + $year = $attributes['year']; + } + } + + $custom_class_name = empty( $attributes['className'] ) ? '' : ' ' . $attributes['className']; + $align_class_name = empty( $attributes['align'] ) ? '' : ' ' . "align{$attributes['align']}"; + + $output = sprintf( + '<div class="%1$s">%2$s</div>', + esc_attr( 'wp-block-calendar' . $custom_class_name . $align_class_name ), + get_calendar( true, false ) + ); + + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited + $monthnum = $previous_monthnum; + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited + $year = $previous_year; + + return $output; +} + +/** + * Registers the `core/calendar` block on server. + */ +function register_block_core_calendar() { + register_block_type( + 'core/calendar', + array( + 'attributes' => array( + 'align' => array( + 'type' => 'string', + 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), + ), + 'className' => array( + 'type' => 'string', + ), + 'month' => array( + 'type' => 'integer', + ), + 'year' => array( + 'type' => 'integer', + ), + ), + 'render_callback' => 'render_block_core_calendar', + ) + ); +} + +add_action( 'init', 'register_block_core_calendar' ); diff --git a/wp-includes/blocks/categories.php b/wp-includes/blocks/categories.php new file mode 100644 index 0000000..159bb8b --- /dev/null +++ b/wp-includes/blocks/categories.php @@ -0,0 +1,120 @@ +<?php +/** + * Server-side rendering of the `core/categories` block. + * + * @package WordPress + */ + +/** + * Renders the `core/categories` block on server. + * + * @param array $attributes The block attributes. + * + * @return string Returns the categories list/dropdown markup. + */ +function render_block_core_categories( $attributes ) { + static $block_id = 0; + $block_id++; + + $args = array( + 'echo' => false, + 'hierarchical' => ! empty( $attributes['showHierarchy'] ), + 'orderby' => 'name', + 'show_count' => ! empty( $attributes['showPostCounts'] ), + 'title_li' => '', + ); + + if ( ! empty( $attributes['displayAsDropdown'] ) ) { + $id = 'wp-block-categories-' . $block_id; + $args['id'] = $id; + $args['show_option_none'] = __( 'Select Category' ); + $wrapper_markup = '<div class="%1$s">%2$s</div>'; + $items_markup = wp_dropdown_categories( $args ); + $type = 'dropdown'; + + if ( ! is_admin() ) { + $wrapper_markup .= build_dropdown_script_block_core_categories( $id ); + } + } else { + $wrapper_markup = '<ul class="%1$s">%2$s</ul>'; + $items_markup = wp_list_categories( $args ); + $type = 'list'; + } + + $class = "wp-block-categories wp-block-categories-{$type}"; + + if ( isset( $attributes['align'] ) ) { + $class .= " align{$attributes['align']}"; + } + + if ( isset( $attributes['className'] ) ) { + $class .= " {$attributes['className']}"; + } + + return sprintf( + $wrapper_markup, + esc_attr( $class ), + $items_markup + ); +} + +/** + * Generates the inline script for a categories dropdown field. + * + * @param string $dropdown_id ID of the dropdown field. + * + * @return string Returns the dropdown onChange redirection script. + */ +function build_dropdown_script_block_core_categories( $dropdown_id ) { + ob_start(); + ?> + <script type='text/javascript'> + /* <![CDATA[ */ + ( function() { + var dropdown = document.getElementById( '<?php echo esc_js( $dropdown_id ); ?>' ); + function onCatChange() { + if ( dropdown.options[ dropdown.selectedIndex ].value > 0 ) { + location.href = "<?php echo home_url(); ?>/?cat=" + dropdown.options[ dropdown.selectedIndex ].value; + } + } + dropdown.onchange = onCatChange; + })(); + /* ]]> */ + </script> + <?php + return ob_get_clean(); +} + +/** + * Registers the `core/categories` block on server. + */ +function register_block_core_categories() { + register_block_type( + 'core/categories', + array( + 'attributes' => array( + 'align' => array( + 'type' => 'string', + 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), + ), + 'className' => array( + 'type' => 'string', + ), + 'displayAsDropdown' => array( + 'type' => 'boolean', + 'default' => false, + ), + 'showHierarchy' => array( + 'type' => 'boolean', + 'default' => false, + ), + 'showPostCounts' => array( + 'type' => 'boolean', + 'default' => false, + ), + ), + 'render_callback' => 'render_block_core_categories', + ) + ); +} +add_action( 'init', 'register_block_core_categories' ); diff --git a/wp-includes/blocks/latest-comments.php b/wp-includes/blocks/latest-comments.php new file mode 100644 index 0000000..d68e89a --- /dev/null +++ b/wp-includes/blocks/latest-comments.php @@ -0,0 +1,196 @@ +<?php +/** + * Server-side rendering of the `core/latest-comments` block. + * + * @package WordPress + */ + +/** + * Get the post title. + * + * The post title is fetched and if it is blank then a default string is + * returned. + * + * Copied from `wp-admin/includes/template.php`, but we can't include that + * file because: + * + * 1. It causes bugs with test fixture generation and strange Docker 255 error + * codes. + * 2. It's in the admin; ideally we *shouldn't* be including files from the + * admin for a block's output. It's a very small/simple function as well, + * so duplicating it isn't too terrible. + * + * @since 3.3.0 + * + * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post. + * @return string The post title if set; "(no title)" if no title is set. + */ +function wp_latest_comments_draft_or_post_title( $post = 0 ) { + $title = get_the_title( $post ); + if ( empty( $title ) ) { + $title = __( '(no title)' ); + } + return esc_html( $title ); +} + +/** + * Renders the `core/latest-comments` block on server. + * + * @param array $attributes The block attributes. + * + * @return string Returns the post content with latest comments added. + */ +function render_block_core_latest_comments( $attributes = array() ) { + // This filter is documented in wp-includes/widgets/class-wp-widget-recent-comments.php. + $comments = get_comments( + apply_filters( + 'widget_comments_args', + array( + 'number' => $attributes['commentsToShow'], + 'status' => 'approve', + 'post_status' => 'publish', + ) + ) + ); + + $list_items_markup = ''; + if ( ! empty( $comments ) ) { + // Prime the cache for associated posts. This is copied from \WP_Widget_Recent_Comments::widget(). + $post_ids = array_unique( wp_list_pluck( $comments, 'comment_post_ID' ) ); + _prime_post_caches( $post_ids, strpos( get_option( 'permalink_structure' ), '%category%' ), false ); + + foreach ( $comments as $comment ) { + $list_items_markup .= '<li class="wp-block-latest-comments__comment">'; + if ( $attributes['displayAvatar'] ) { + $avatar = get_avatar( + $comment, + 48, + '', + '', + array( + 'class' => 'wp-block-latest-comments__comment-avatar', + ) + ); + if ( $avatar ) { + $list_items_markup .= $avatar; + } + } + + $list_items_markup .= '<article>'; + $list_items_markup .= '<footer class="wp-block-latest-comments__comment-meta">'; + $author_url = get_comment_author_url( $comment ); + if ( empty( $author_url ) && ! empty( $comment->user_id ) ) { + $author_url = get_author_posts_url( $comment->user_id ); + } + + $author_markup = ''; + if ( $author_url ) { + $author_markup .= '<a class="wp-block-latest-comments__comment-author" href="' . esc_url( $author_url ) . '">' . get_comment_author( $comment ) . '</a>'; + } else { + $author_markup .= '<span class="wp-block-latest-comments__comment-author">' . get_comment_author( $comment ) . '</span>'; + } + + // `_draft_or_post_title` calls `esc_html()` so we don't need to wrap that call in + // `esc_html`. + $post_title = '<a class="wp-block-latest-comments__comment-link" href="' . esc_url( get_comment_link( $comment ) ) . '">' . wp_latest_comments_draft_or_post_title( $comment->comment_post_ID ) . '</a>'; + + $list_items_markup .= sprintf( + /* translators: 1: author name (inside <a> or <span> tag, based on if they have a URL), 2: post title related to this comment */ + __( '%1$s on %2$s' ), + $author_markup, + $post_title + ); + + if ( $attributes['displayDate'] ) { + $list_items_markup .= sprintf( + '<time datetime="%1$s" class="wp-block-latest-comments__comment-date">%2$s</time>', + esc_attr( get_comment_date( 'c', $comment ) ), + date_i18n( get_option( 'date_format' ), get_comment_date( 'U', $comment ) ) + ); + } + $list_items_markup .= '</footer>'; + if ( $attributes['displayExcerpt'] ) { + $list_items_markup .= '<div class="wp-block-latest-comments__comment-excerpt">' . wpautop( get_comment_excerpt( $comment ) ) . '</div>'; + } + $list_items_markup .= '</article></li>'; + } + } + + $class = 'wp-block-latest-comments'; + if ( ! empty( $attributes['className'] ) ) { + $class .= ' ' . $attributes['className']; + } + if ( isset( $attributes['align'] ) ) { + $class .= " align{$attributes['align']}"; + } + if ( $attributes['displayAvatar'] ) { + $class .= ' has-avatars'; + } + if ( $attributes['displayDate'] ) { + $class .= ' has-dates'; + } + if ( $attributes['displayExcerpt'] ) { + $class .= ' has-excerpts'; + } + if ( empty( $comments ) ) { + $class .= ' no-comments'; + } + $classnames = esc_attr( $class ); + + return ! empty( $comments ) ? sprintf( + '<ol class="%1$s">%2$s</ol>', + $classnames, + $list_items_markup + ) : sprintf( + '<div class="%1$s">%2$s</div>', + $classnames, + __( 'No comments to show.' ) + ); +} + +/** + * Registers the `core/latest-comments` block. + */ +function register_block_core_latest_comments() { + register_block_type( + 'core/latest-comments', + array( + 'attributes' => array( + 'align' => array( + 'type' => 'string', + 'enum' => array( + 'left', + 'center', + 'right', + 'wide', + 'full', + ), + ), + 'className' => array( + 'type' => 'string', + ), + 'commentsToShow' => array( + 'type' => 'number', + 'default' => 5, + 'minimum' => 1, + 'maximum' => 100, + ), + 'displayAvatar' => array( + 'type' => 'boolean', + 'default' => true, + ), + 'displayDate' => array( + 'type' => 'boolean', + 'default' => true, + ), + 'displayExcerpt' => array( + 'type' => 'boolean', + 'default' => true, + ), + ), + 'render_callback' => 'render_block_core_latest_comments', + ) + ); +} + +add_action( 'init', 'register_block_core_latest_comments' ); diff --git a/wp-includes/blocks/latest-posts.php b/wp-includes/blocks/latest-posts.php new file mode 100644 index 0000000..6e96f10 --- /dev/null +++ b/wp-includes/blocks/latest-posts.php @@ -0,0 +1,248 @@ +<?php +/** + * Server-side rendering of the `core/latest-posts` block. + * + * @package WordPress + */ + +/** + * The excerpt length set by the Latest Posts core block + * set at render time and used by the block itself. + * + * @var int + */ +$block_core_latest_posts_excerpt_length = 0; + +/** + * Callback for the excerpt_length filter used by + * the Latest Posts block at render time. + * + * @return int Returns the global $block_core_latest_posts_excerpt_length variable + * to allow the excerpt_length filter respect the Latest Block setting. + */ +function block_core_latest_posts_get_excerpt_length() { + global $block_core_latest_posts_excerpt_length; + return $block_core_latest_posts_excerpt_length; +} + +/** + * Renders the `core/latest-posts` block on server. + * + * @param array $attributes The block attributes. + * + * @return string Returns the post content with latest posts added. + */ +function render_block_core_latest_posts( $attributes ) { + global $block_core_latest_posts_excerpt_length; + + $args = array( + 'posts_per_page' => $attributes['postsToShow'], + 'post_status' => 'publish', + 'order' => $attributes['order'], + 'orderby' => $attributes['orderBy'], + 'suppress_filters' => false, + ); + + $block_core_latest_posts_excerpt_length = $attributes['excerptLength']; + add_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 ); + + if ( isset( $attributes['categories'] ) ) { + $args['category'] = $attributes['categories']; + } + + $recent_posts = get_posts( $args ); + + $list_items_markup = ''; + + foreach ( $recent_posts as $post ) { + $list_items_markup .= '<li>'; + + if ( $attributes['displayFeaturedImage'] && has_post_thumbnail( $post ) ) { + $image_style = ''; + if ( isset( $attributes['featuredImageSizeWidth'] ) ) { + $image_style .= sprintf( 'max-width:%spx;', $attributes['featuredImageSizeWidth'] ); + } + if ( isset( $attributes['featuredImageSizeHeight'] ) ) { + $image_style .= sprintf( 'max-height:%spx;', $attributes['featuredImageSizeHeight'] ); + } + + $image_classes = 'wp-block-latest-posts__featured-image'; + if ( isset( $attributes['featuredImageAlign'] ) ) { + $image_classes .= ' align' . $attributes['featuredImageAlign']; + } + + $list_items_markup .= sprintf( + '<div class="%1$s">%2$s</div>', + $image_classes, + get_the_post_thumbnail( + $post, + $attributes['featuredImageSizeSlug'], + array( + 'style' => $image_style, + ) + ) + ); + } + + $title = get_the_title( $post ); + if ( ! $title ) { + $title = __( '(no title)' ); + } + $list_items_markup .= sprintf( + '<a href="%1$s">%2$s</a>', + esc_url( get_permalink( $post ) ), + $title + ); + + if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) { + $list_items_markup .= sprintf( + '<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', + esc_attr( get_the_date( 'c', $post ) ), + esc_html( get_the_date( '', $post ) ) + ); + } + + if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent'] + && isset( $attributes['displayPostContentRadio'] ) && 'excerpt' === $attributes['displayPostContentRadio'] ) { + + $trimmed_excerpt = get_the_excerpt( $post ); + + $list_items_markup .= sprintf( + '<div class="wp-block-latest-posts__post-excerpt">%1$s', + $trimmed_excerpt + ); + + if ( strpos( $trimmed_excerpt, ' … ' ) !== false ) { + $list_items_markup .= sprintf( + '<a href="%1$s">%2$s</a></div>', + esc_url( get_permalink( $post ) ), + __( 'Read more' ) + ); + } else { + $list_items_markup .= sprintf( + '</div>' + ); + } + } + + if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent'] + && isset( $attributes['displayPostContentRadio'] ) && 'full_post' === $attributes['displayPostContentRadio'] ) { + $list_items_markup .= sprintf( + '<div class="wp-block-latest-posts__post-full-content">%1$s</div>', + wp_kses_post( html_entity_decode( $post->post_content, ENT_QUOTES, get_option( 'blog_charset' ) ) ) + ); + } + + $list_items_markup .= "</li>\n"; + } + + remove_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 ); + + $class = 'wp-block-latest-posts wp-block-latest-posts__list'; + if ( isset( $attributes['align'] ) ) { + $class .= ' align' . $attributes['align']; + } + + if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) { + $class .= ' is-grid'; + } + + if ( isset( $attributes['columns'] ) && 'grid' === $attributes['postLayout'] ) { + $class .= ' columns-' . $attributes['columns']; + } + + if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) { + $class .= ' has-dates'; + } + + if ( isset( $attributes['className'] ) ) { + $class .= ' ' . $attributes['className']; + } + + return sprintf( + '<ul class="%1$s">%2$s</ul>', + esc_attr( $class ), + $list_items_markup + ); +} + +/** + * Registers the `core/latest-posts` block on server. + */ +function register_block_core_latest_posts() { + register_block_type( + 'core/latest-posts', + array( + 'attributes' => array( + 'align' => array( + 'type' => 'string', + 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), + ), + 'className' => array( + 'type' => 'string', + ), + 'categories' => array( + 'type' => 'string', + ), + 'postsToShow' => array( + 'type' => 'number', + 'default' => 5, + ), + 'displayPostContent' => array( + 'type' => 'boolean', + 'default' => false, + ), + 'displayPostContentRadio' => array( + 'type' => 'string', + 'default' => 'excerpt', + ), + 'excerptLength' => array( + 'type' => 'number', + 'default' => 55, + ), + 'displayPostDate' => array( + 'type' => 'boolean', + 'default' => false, + ), + 'postLayout' => array( + 'type' => 'string', + 'default' => 'list', + ), + 'columns' => array( + 'type' => 'number', + 'default' => 3, + ), + 'order' => array( + 'type' => 'string', + 'default' => 'desc', + ), + 'orderBy' => array( + 'type' => 'string', + 'default' => 'date', + ), + 'displayFeaturedImage' => array( + 'type' => 'boolean', + 'default' => false, + ), + 'featuredImageAlign' => array( + 'type' => 'string', + 'enum' => array( 'left', 'center', 'right' ), + ), + 'featuredImageSizeSlug' => array( + 'type' => 'string', + 'default' => 'thumbnail', + ), + 'featuredImageSizeWidth' => array( + 'type' => 'number', + 'default' => null, + ), + 'featuredImageSizeHeight' => array( + 'type' => 'number', + 'default' => null, + ), + ), + 'render_callback' => 'render_block_core_latest_posts', + ) + ); +} +add_action( 'init', 'register_block_core_latest_posts' ); diff --git a/wp-includes/blocks/rss.php b/wp-includes/blocks/rss.php new file mode 100644 index 0000000..07ddb3d --- /dev/null +++ b/wp-includes/blocks/rss.php @@ -0,0 +1,150 @@ +<?php +/** + * Server-side rendering of the `core/rss` block. + * + * @package WordPress + */ + +/** + * Renders the `core/rss` block on server. + * + * @param array $attributes The block attributes. + * + * @return string Returns the block content with received rss items. + */ +function render_block_core_rss( $attributes ) { + $rss = fetch_feed( $attributes['feedURL'] ); + + if ( is_wp_error( $rss ) ) { + return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __( 'RSS Error:' ) . '</strong> ' . $rss->get_error_message() . '</div></div>'; + } + + if ( ! $rss->get_item_quantity() ) { + return '<div class="components-placeholder"><div class="notice notice-error">' . __( 'An error has occurred, which probably means the feed is down. Try again later.' ) . '</div></div>'; + } + + $rss_items = $rss->get_items( 0, $attributes['itemsToShow'] ); + $list_items = ''; + foreach ( $rss_items as $item ) { + $title = esc_html( trim( strip_tags( $item->get_title() ) ) ); + if ( empty( $title ) ) { + $title = __( '(no title)' ); + } + $link = $item->get_link(); + $link = esc_url( $link ); + if ( $link ) { + $title = "<a href='{$link}'>{$title}</a>"; + } + $title = "<div class='wp-block-rss__item-title'>{$title}</div>"; + + $date = ''; + if ( $attributes['displayDate'] ) { + $date = $item->get_date( 'U' ); + + if ( $date ) { + $date = sprintf( + '<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', + date_i18n( get_option( 'c' ), $date ), + date_i18n( get_option( 'date_format' ), $date ) + ); + } + } + + $author = ''; + if ( $attributes['displayAuthor'] ) { + $author = $item->get_author(); + if ( is_object( $author ) ) { + $author = $author->get_name(); + $author = '<span class="wp-block-rss__item-author">' . __( 'by' ) . ' ' . esc_html( strip_tags( $author ) ) . '</span>'; + } + } + + $excerpt = ''; + if ( $attributes['displayExcerpt'] ) { + $excerpt = html_entity_decode( $item->get_description(), ENT_QUOTES, get_option( 'blog_charset' ) ); + $excerpt = esc_attr( wp_trim_words( $excerpt, $attributes['excerptLength'], ' […]' ) ); + + // Change existing [...] to […]. + if ( '[...]' === substr( $excerpt, -5 ) ) { + $excerpt = substr( $excerpt, 0, -5 ) . '[…]'; + } + + $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html( $excerpt ) . '</div>'; + } + + $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>"; + } + + $class = 'wp-block-rss'; + if ( isset( $attributes['align'] ) ) { + $class .= ' align' . $attributes['align']; + } + + if ( isset( $attributes['blockLayout'] ) && 'grid' === $attributes['blockLayout'] ) { + $class .= ' is-grid'; + } + + if ( isset( $attributes['columns'] ) && 'grid' === $attributes['blockLayout'] ) { + $class .= ' columns-' . $attributes['columns']; + } + + if ( isset( $attributes['className'] ) ) { + $class .= ' ' . $attributes['className']; + } + + return sprintf( "<ul class='%s'>%s</ul>", esc_attr( $class ), $list_items ); +} + +/** + * Registers the `core/rss` block on server. + */ +function register_block_core_rss() { + register_block_type( + 'core/rss', + array( + 'attributes' => array( + 'align' => array( + 'type' => 'string', + 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), + ), + 'className' => array( + 'type' => 'string', + ), + 'columns' => array( + 'type' => 'number', + 'default' => 2, + ), + 'blockLayout' => array( + 'type' => 'string', + 'default' => 'list', + ), + 'feedURL' => array( + 'type' => 'string', + 'default' => '', + ), + 'itemsToShow' => array( + 'type' => 'number', + 'default' => 5, + ), + 'displayExcerpt' => array( + 'type' => 'boolean', + 'default' => false, + ), + 'displayAuthor' => array( + 'type' => 'boolean', + 'default' => false, + ), + 'displayDate' => array( + 'type' => 'boolean', + 'default' => false, + ), + 'excerptLength' => array( + 'type' => 'number', + 'default' => 55, + ), + ), + 'render_callback' => 'render_block_core_rss', + ) + ); +} +add_action( 'init', 'register_block_core_rss' ); diff --git a/wp-includes/blocks/search.php b/wp-includes/blocks/search.php new file mode 100644 index 0000000..a140caf --- /dev/null +++ b/wp-includes/blocks/search.php @@ -0,0 +1,98 @@ +<?php +/** + * Server-side rendering of the `core/search` block. + * + * @package WordPress + */ + +/** + * Dynamically renders the `core/search` block. + * + * @param array $attributes The block attributes. + * + * @return string The search block markup. + */ +function render_block_core_search( $attributes ) { + static $instance_id = 0; + + $input_id = 'wp-block-search__input-' . ++$instance_id; + $label_markup = ''; + $button_markup = ''; + + if ( ! empty( $attributes['label'] ) ) { + $label_markup = sprintf( + '<label for="%s" class="wp-block-search__label">%s</label>', + $input_id, + $attributes['label'] + ); + } else { + $label_markup = sprintf( + '<label for="%s" class="wp-block-search__label screen-reader-text">%s</label>', + $input_id, + __( 'Search' ) + ); + } + + $input_markup = sprintf( + '<input type="search" id="%s" class="wp-block-search__input" name="s" value="%s" placeholder="%s" required />', + $input_id, + esc_attr( get_search_query() ), + esc_attr( $attributes['placeholder'] ) + ); + + if ( ! empty( $attributes['buttonText'] ) ) { + $button_markup = sprintf( + '<button type="submit" class="wp-block-search__button">%s</button>', + $attributes['buttonText'] + ); + } + + $class = 'wp-block-search'; + if ( isset( $attributes['className'] ) ) { + $class .= ' ' . $attributes['className']; + } + if ( isset( $attributes['align'] ) ) { + $class .= ' align' . $attributes['align']; + } + + return sprintf( + '<form class="%s" role="search" method="get" action="%s">%s</form>', + esc_attr( $class ), + esc_url( home_url( '/' ) ), + $label_markup . $input_markup . $button_markup + ); +} + +/** + * Registers the `core/search` block on the server. + */ +function register_block_core_search() { + register_block_type( + 'core/search', + array( + 'attributes' => array( + 'align' => array( + 'type' => 'string', + 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), + ), + 'className' => array( + 'type' => 'string', + ), + 'label' => array( + 'type' => 'string', + 'default' => __( 'Search' ), + ), + 'placeholder' => array( + 'type' => 'string', + 'default' => '', + ), + 'buttonText' => array( + 'type' => 'string', + 'default' => __( 'Search' ), + ), + ), + 'render_callback' => 'render_block_core_search', + ) + ); +} +add_action( 'init', 'register_block_core_search' ); diff --git a/wp-includes/blocks/shortcode.php b/wp-includes/blocks/shortcode.php new file mode 100644 index 0000000..cfa8ab9 --- /dev/null +++ b/wp-includes/blocks/shortcode.php @@ -0,0 +1,36 @@ +<?php +/** + * Server-side rendering of the `core/shortcode` block. + * + * @package WordPress + */ + +/** + * Performs wpautop() on the shortcode block content. + * + * @param array $attributes The block attributes. + * @param string $content The block content. + * + * @return string Returns the block content. + */ +function render_block_core_shortcode( $attributes, $content ) { + return wpautop( $content ); +} + +/** + * Registers the `core/shortcode` block on server. + */ +function register_block_core_shortcode() { + $path = __DIR__ . '/shortcode/block.json'; + $metadata = json_decode( file_get_contents( $path ), true ); + register_block_type( + $metadata['name'], + array_merge( + $metadata, + array( + 'render_callback' => 'render_block_core_shortcode', + ) + ) + ); +} +add_action( 'init', 'register_block_core_shortcode' ); diff --git a/wp-includes/blocks/shortcode/block.json b/wp-includes/blocks/shortcode/block.json new file mode 100644 index 0000000..b31c213 --- /dev/null +++ b/wp-includes/blocks/shortcode/block.json @@ -0,0 +1,10 @@ +{ + "name": "core/shortcode", + "category": "widgets", + "attributes": { + "text": { + "type": "string", + "source": "html" + } + } +} diff --git a/wp-includes/blocks/social-link.php b/wp-includes/blocks/social-link.php new file mode 100644 index 0000000..1c8d367 --- /dev/null +++ b/wp-includes/blocks/social-link.php @@ -0,0 +1,268 @@ +<?php +/** + * Server-side rendering of the `core/social-link` blocks. + * + * @package WordPress + */ + +/** + * Renders the `core/social-link` block on server. + * + * @param array $attributes The block attributes. + * + * @return string Rendered HTML of the referenced block. + */ +function render_block_core_social_link( $attributes ) { + $service = ( isset( $attributes['service'] ) ) ? $attributes['service'] : 'Icon'; + $url = ( isset( $attributes['url'] ) ) ? $attributes['url'] : false; + $label = ( isset( $attributes['label'] ) ) ? + $attributes['label'] : + /* translators: %s: Social Link service name */ + sprintf( __( 'Link to %s' ), block_core_social_link_get_name( $service ) ); + $class_name = isset( $attributes['className'] ) ? ' ' . $attributes['className'] : false; + + // Don't render a link if there is no URL set. + if ( ! $url ) { + return ''; + } + + $icon = block_core_social_link_get_icon( $service ); + return '<li class="wp-social-link wp-social-link-' . esc_attr( $service ) . esc_attr( $class_name ) . '"><a href="' . esc_url( $url ) . '" aria-label="' . esc_attr( $label ) . '"> ' . $icon . '</a></li>'; +} + +/** + * Registers the `core/social-link` blocks. + */ +function register_block_core_social_link() { + $path = __DIR__ . '/social-link/block.json'; + $metadata = json_decode( file_get_contents( $path ), true ); + + register_block_type( + $metadata['name'], + array_merge( + $metadata, + array( + 'render_callback' => 'render_block_core_social_link', + ) + ) + ); +} +add_action( 'init', 'register_block_core_social_link' ); + + +/** + * Returns the SVG for social link. + * + * @param string $service The service icon. + * + * @return string SVG Element for service icon. + */ +function block_core_social_link_get_icon( $service ) { + $services = block_core_social_link_services(); + if ( isset( $services[ $service ] ) && isset( $services[ $service ]['icon'] ) ) { + return $services[ $service ]['icon']; + } + + return $services['share']['icon']; +} + +/** + * Returns the brand name for social link. + * + * @param string $service The service icon. + * + * @return string Brand label. + */ +function block_core_social_link_get_name( $service ) { + $services = block_core_social_link_services(); + if ( isset( $services[ $service ] ) && isset( $services[ $service ]['name'] ) ) { + return $services[ $service ]['name']; + } + + return $services['share']['name']; +} + +/** + * Returns the SVG for social link. + * + * @param string $service The service slug to extract data from. + * @param string $field The field ('name', 'icon', etc) to extract for a service. + * + * @return array|string + */ +function block_core_social_link_services( $service = '', $field = '' ) { + $services_data = array( + 'fivehundredpx' => array( + 'name' => '500px', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M6.94026,15.1412c.00437.01213.108.29862.168.44064a6.55008,6.55008,0,1,0,6.03191-9.09557,6.68654,6.68654,0,0,0-2.58357.51467A8.53914,8.53914,0,0,0,8.21268,8.61344L8.209,8.61725V3.22948l9.0504-.00008c.32934-.0036.32934-.46353.32934-.61466s0-.61091-.33035-.61467L7.47248,2a.43.43,0,0,0-.43131.42692v7.58355c0,.24466.30476.42131.58793.4819.553.11812.68074-.05864.81617-.2457l.018-.02481A10.52673,10.52673,0,0,1,9.32258,9.258a5.35268,5.35268,0,1,1,7.58985,7.54976,5.417,5.417,0,0,1-3.80867,1.56365,5.17483,5.17483,0,0,1-2.69822-.74478l.00342-4.61111a2.79372,2.79372,0,0,1,.71372-1.78792,2.61611,2.61611,0,0,1,1.98282-.89477,2.75683,2.75683,0,0,1,1.95525.79477,2.66867,2.66867,0,0,1,.79656,1.909,2.724,2.724,0,0,1-2.75849,2.748,4.94651,4.94651,0,0,1-.86254-.13719c-.31234-.093-.44519.34058-.48892.48349-.16811.54966.08453.65862.13687.67489a3.75751,3.75751,0,0,0,1.25234.18375,3.94634,3.94634,0,1,0-2.82444-6.742,3.67478,3.67478,0,0,0-1.13028,2.584l-.00041.02323c-.0035.11667-.00579,2.881-.00644,3.78811l-.00407-.00451a6.18521,6.18521,0,0,1-1.0851-1.86092c-.10544-.27856-.34358-.22925-.66857-.12917-.14192.04372-.57386.17677-.47833.489Zm4.65165-1.08338a.51346.51346,0,0,0,.19513.31818l.02276.022a.52945.52945,0,0,0,.3517.18416.24242.24242,0,0,0,.16577-.0611c.05473-.05082.67382-.67812.73287-.738l.69041.68819a.28978.28978,0,0,0,.21437.11032.53239.53239,0,0,0,.35708-.19486c.29792-.30419.14885-.46821.07676-.54751l-.69954-.69975.72952-.73469c.16-.17311.01874-.35708-.12218-.498-.20461-.20461-.402-.25742-.52855-.14083l-.7254.72665-.73354-.73375a.20128.20128,0,0,0-.14179-.05695.54135.54135,0,0,0-.34379.19648c-.22561.22555-.274.38149-.15656.5059l.73374.7315-.72942.73072A.26589.26589,0,0,0,11.59191,14.05782Zm1.59866-9.915A8.86081,8.86081,0,0,0,9.854,4.776a.26169.26169,0,0,0-.16938.22759.92978.92978,0,0,0,.08619.42094c.05682.14524.20779.531.50006.41955a8.40969,8.40969,0,0,1,2.91968-.55484,7.87875,7.87875,0,0,1,3.086.62286,8.61817,8.61817,0,0,1,2.30562,1.49315.2781.2781,0,0,0,.18318.07586c.15529,0,.30425-.15253.43167-.29551.21268-.23861.35873-.4369.1492-.63538a8.50425,8.50425,0,0,0-2.62312-1.694A9.0177,9.0177,0,0,0,13.19058,4.14283ZM19.50945,18.6236h0a.93171.93171,0,0,0-.36642-.25406.26589.26589,0,0,0-.27613.06613l-.06943.06929A7.90606,7.90606,0,0,1,7.60639,18.505a7.57284,7.57284,0,0,1-1.696-2.51537,8.58715,8.58715,0,0,1-.5147-1.77754l-.00871-.04864c-.04939-.25873-.28755-.27684-.62981-.22448-.14234.02178-.5755.088-.53426.39969l.001.00712a9.08807,9.08807,0,0,0,15.406,4.99094c.00193-.00192.04753-.04718.0725-.07436C19.79425,19.16234,19.87422,18.98728,19.50945,18.6236Z"></path></svg>', + ), + 'amazon' => array( + 'name' => 'Amazon', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M13.582,8.182C11.934,8.367,9.78,8.49,8.238,9.166c-1.781,0.769-3.03,2.337-3.03,4.644 c0,2.953,1.86,4.429,4.253,4.429c2.02,0,3.125-0.477,4.685-2.065c0.516,0.747,0.685,1.109,1.629,1.894 c0.212,0.114,0.483,0.103,0.672-0.066l0.006,0.006c0.567-0.505,1.599-1.401,2.18-1.888c0.231-0.188,0.19-0.496,0.009-0.754 c-0.52-0.718-1.072-1.303-1.072-2.634V8.305c0-1.876,0.133-3.599-1.249-4.891C15.23,2.369,13.422,2,12.04,2 C9.336,2,6.318,3.01,5.686,6.351C5.618,6.706,5.877,6.893,6.109,6.945l2.754,0.298C9.121,7.23,9.308,6.977,9.357,6.72 c0.236-1.151,1.2-1.706,2.284-1.706c0.584,0,1.249,0.215,1.595,0.738c0.398,0.584,0.346,1.384,0.346,2.061V8.182z M13.049,14.088 c-0.451,0.8-1.169,1.291-1.967,1.291c-1.09,0-1.728-0.83-1.728-2.061c0-2.42,2.171-2.86,4.227-2.86v0.615 C13.582,12.181,13.608,13.104,13.049,14.088z M20.683,19.339C18.329,21.076,14.917,22,11.979,22c-4.118,0-7.826-1.522-10.632-4.057 c-0.22-0.199-0.024-0.471,0.241-0.317c3.027,1.762,6.771,2.823,10.639,2.823c2.608,0,5.476-0.541,8.115-1.66 C20.739,18.62,21.072,19.051,20.683,19.339z M21.336,21.043c-0.194,0.163-0.379,0.076-0.293-0.139 c0.284-0.71,0.92-2.298,0.619-2.684c-0.301-0.386-1.99-0.183-2.749-0.092c-0.23,0.027-0.266-0.173-0.059-0.319 c1.348-0.946,3.555-0.673,3.811-0.356C22.925,17.773,22.599,19.986,21.336,21.043z"></path></svg>', + ), + 'bandcamp' => array( + 'name' => 'Bandcamp', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M15.27 17.289 3 17.289 8.73 6.711 21 6.711 15.27 17.289"></path></svg>', + ), + 'behance' => array( + 'name' => 'Behance', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M7.799,5.698c0.589,0,1.12,0.051,1.606,0.156c0.482,0.102,0.894,0.273,1.241,0.507c0.344,0.235,0.612,0.546,0.804,0.938 c0.188,0.387,0.281,0.871,0.281,1.443c0,0.619-0.141,1.137-0.421,1.551c-0.284,0.413-0.7,0.751-1.255,1.014 c0.756,0.218,1.317,0.601,1.689,1.146c0.374,0.549,0.557,1.205,0.557,1.975c0,0.623-0.12,1.161-0.359,1.612 c-0.241,0.457-0.569,0.828-0.973,1.114c-0.408,0.288-0.876,0.5-1.399,0.637C9.052,17.931,8.514,18,7.963,18H2V5.698H7.799 M7.449,10.668c0.481,0,0.878-0.114,1.192-0.345c0.311-0.228,0.463-0.603,0.463-1.119c0-0.286-0.051-0.523-0.152-0.707 C8.848,8.315,8.711,8.171,8.536,8.07C8.362,7.966,8.166,7.894,7.94,7.854c-0.224-0.044-0.457-0.06-0.697-0.06H4.709v2.874H7.449z M7.6,15.905c0.267,0,0.521-0.024,0.759-0.077c0.243-0.053,0.457-0.137,0.637-0.261c0.182-0.12,0.332-0.283,0.441-0.491 C9.547,14.87,9.6,14.602,9.6,14.278c0-0.633-0.18-1.084-0.533-1.357c-0.356-0.27-0.83-0.404-1.413-0.404H4.709v3.388L7.6,15.905z M16.162,15.864c0.367,0.358,0.897,0.538,1.583,0.538c0.493,0,0.92-0.125,1.277-0.374c0.354-0.248,0.571-0.514,0.654-0.79h2.155 c-0.347,1.072-0.872,1.838-1.589,2.299C19.534,18,18.67,18.23,17.662,18.23c-0.701,0-1.332-0.113-1.899-0.337 c-0.567-0.227-1.041-0.544-1.439-0.958c-0.389-0.415-0.689-0.907-0.904-1.484c-0.213-0.574-0.32-1.21-0.32-1.899 c0-0.666,0.11-1.288,0.329-1.863c0.222-0.577,0.529-1.075,0.933-1.492c0.406-0.42,0.885-0.751,1.444-0.994 c0.558-0.241,1.175-0.363,1.857-0.363c0.754,0,1.414,0.145,1.98,0.44c0.563,0.291,1.026,0.686,1.389,1.181 c0.363,0.493,0.622,1.057,0.783,1.69c0.16,0.632,0.217,1.292,0.171,1.983h-6.428C15.557,14.84,15.795,15.506,16.162,15.864 M18.973,11.184c-0.291-0.321-0.783-0.496-1.384-0.496c-0.39,0-0.714,0.066-0.973,0.2c-0.254,0.132-0.461,0.297-0.621,0.491 c-0.157,0.197-0.265,0.405-0.328,0.628c-0.063,0.217-0.101,0.413-0.111,0.587h3.98C19.478,11.969,19.265,11.509,18.973,11.184z M15.057,7.738h4.985V6.524h-4.985L15.057,7.738z"></path></svg>', + ), + 'chain' => array( + 'name' => 'Link', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M19.647,16.706a1.134,1.134,0,0,0-.343-.833l-2.549-2.549a1.134,1.134,0,0,0-.833-.343,1.168,1.168,0,0,0-.883.392l.233.226q.2.189.264.264a2.922,2.922,0,0,1,.184.233.986.986,0,0,1,.159.312,1.242,1.242,0,0,1,.043.337,1.172,1.172,0,0,1-1.176,1.176,1.237,1.237,0,0,1-.337-.043,1,1,0,0,1-.312-.159,2.76,2.76,0,0,1-.233-.184q-.073-.068-.264-.264l-.226-.233a1.19,1.19,0,0,0-.4.895,1.134,1.134,0,0,0,.343.833L15.837,19.3a1.13,1.13,0,0,0,.833.331,1.18,1.18,0,0,0,.833-.318l1.8-1.789a1.12,1.12,0,0,0,.343-.821Zm-8.615-8.64a1.134,1.134,0,0,0-.343-.833L8.163,4.7a1.134,1.134,0,0,0-.833-.343,1.184,1.184,0,0,0-.833.331L4.7,6.473a1.12,1.12,0,0,0-.343.821,1.134,1.134,0,0,0,.343.833l2.549,2.549a1.13,1.13,0,0,0,.833.331,1.184,1.184,0,0,0,.883-.38L8.728,10.4q-.2-.189-.264-.264A2.922,2.922,0,0,1,8.28,9.9a.986.986,0,0,1-.159-.312,1.242,1.242,0,0,1-.043-.337A1.172,1.172,0,0,1,9.254,8.079a1.237,1.237,0,0,1,.337.043,1,1,0,0,1,.312.159,2.761,2.761,0,0,1,.233.184q.073.068.264.264l.226.233a1.19,1.19,0,0,0,.4-.895ZM22,16.706a3.343,3.343,0,0,1-1.042,2.488l-1.8,1.789a3.536,3.536,0,0,1-4.988-.025l-2.525-2.537a3.384,3.384,0,0,1-1.017-2.488,3.448,3.448,0,0,1,1.078-2.561l-1.078-1.078a3.434,3.434,0,0,1-2.549,1.078,3.4,3.4,0,0,1-2.5-1.029L3.029,9.794A3.4,3.4,0,0,1,2,7.294,3.343,3.343,0,0,1,3.042,4.806l1.8-1.789A3.384,3.384,0,0,1,7.331,2a3.357,3.357,0,0,1,2.5,1.042l2.525,2.537a3.384,3.384,0,0,1,1.017,2.488,3.448,3.448,0,0,1-1.078,2.561l1.078,1.078a3.551,3.551,0,0,1,5.049-.049l2.549,2.549A3.4,3.4,0,0,1,22,16.706Z"></path></svg>', + ), + 'codepen' => array( + 'name' => 'CodePen', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M22.016,8.84c-0.002-0.013-0.005-0.025-0.007-0.037c-0.005-0.025-0.008-0.048-0.015-0.072 c-0.003-0.015-0.01-0.028-0.013-0.042c-0.008-0.02-0.015-0.04-0.023-0.062c-0.007-0.015-0.013-0.028-0.02-0.042 c-0.008-0.02-0.018-0.037-0.03-0.057c-0.007-0.013-0.017-0.027-0.025-0.038c-0.012-0.018-0.023-0.035-0.035-0.052 c-0.01-0.013-0.02-0.025-0.03-0.037c-0.015-0.017-0.028-0.032-0.043-0.045c-0.01-0.012-0.022-0.023-0.035-0.035 c-0.015-0.015-0.032-0.028-0.048-0.04c-0.012-0.01-0.025-0.02-0.037-0.03c-0.005-0.003-0.01-0.008-0.015-0.012l-9.161-6.096 c-0.289-0.192-0.666-0.192-0.955,0L2.359,8.237C2.354,8.24,2.349,8.245,2.344,8.249L2.306,8.277 c-0.017,0.013-0.033,0.027-0.048,0.04C2.246,8.331,2.234,8.342,2.222,8.352c-0.015,0.015-0.028,0.03-0.042,0.047 c-0.012,0.013-0.022,0.023-0.03,0.037C2.139,8.453,2.125,8.471,2.115,8.488C2.107,8.501,2.099,8.514,2.09,8.526 C2.079,8.548,2.069,8.565,2.06,8.585C2.054,8.6,2.047,8.613,2.04,8.626C2.032,8.648,2.025,8.67,2.019,8.69 c-0.005,0.013-0.01,0.027-0.013,0.042C1.999,8.755,1.995,8.778,1.99,8.803C1.989,8.817,1.985,8.828,1.984,8.84 C1.978,8.879,1.975,8.915,1.975,8.954v6.093c0,0.037,0.003,0.075,0.008,0.112c0.002,0.012,0.005,0.025,0.007,0.038 c0.005,0.023,0.008,0.047,0.015,0.072c0.003,0.015,0.008,0.028,0.013,0.04c0.007,0.022,0.013,0.042,0.022,0.063 c0.007,0.015,0.013,0.028,0.02,0.04c0.008,0.02,0.018,0.038,0.03,0.058c0.007,0.013,0.015,0.027,0.025,0.038 c0.012,0.018,0.023,0.035,0.035,0.052c0.01,0.013,0.02,0.025,0.03,0.037c0.013,0.015,0.028,0.032,0.042,0.045 c0.012,0.012,0.023,0.023,0.035,0.035c0.015,0.013,0.032,0.028,0.048,0.04l0.038,0.03c0.005,0.003,0.01,0.007,0.013,0.01 l9.163,6.095C11.668,21.953,11.833,22,12,22c0.167,0,0.332-0.047,0.478-0.144l9.163-6.095l0.015-0.01 c0.013-0.01,0.027-0.02,0.037-0.03c0.018-0.013,0.035-0.028,0.048-0.04c0.013-0.012,0.025-0.023,0.035-0.035 c0.017-0.015,0.03-0.032,0.043-0.045c0.01-0.013,0.02-0.025,0.03-0.037c0.013-0.018,0.025-0.035,0.035-0.052 c0.008-0.013,0.018-0.027,0.025-0.038c0.012-0.02,0.022-0.038,0.03-0.058c0.007-0.013,0.013-0.027,0.02-0.04 c0.008-0.022,0.015-0.042,0.023-0.063c0.003-0.013,0.01-0.027,0.013-0.04c0.007-0.025,0.01-0.048,0.015-0.072 c0.002-0.013,0.005-0.027,0.007-0.037c0.003-0.042,0.007-0.079,0.007-0.117V8.954C22.025,8.915,22.022,8.879,22.016,8.84z M12.862,4.464l6.751,4.49l-3.016,2.013l-3.735-2.492V4.464z M11.138,4.464v4.009l-3.735,2.494L4.389,8.954L11.138,4.464z M3.699,10.562L5.853,12l-2.155,1.438V10.562z M11.138,19.536l-6.749-4.491l3.015-2.011l3.735,2.492V19.536z M12,14.035L8.953,12 L12,9.966L15.047,12L12,14.035z M12.862,19.536v-4.009l3.735-2.492l3.016,2.011L12.862,19.536z M20.303,13.438L18.147,12 l2.156-1.438L20.303,13.438z"></path></svg>', + ), + 'deviantart' => array( + 'name' => 'DeviantArt', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M 18.19 5.636 18.19 2 18.188 2 14.553 2 14.19 2.366 12.474 5.636 11.935 6 5.81 6 5.81 10.994 9.177 10.994 9.477 11.357 5.81 18.363 5.81 22 5.811 22 9.447 22 9.81 21.634 11.526 18.364 12.065 18 18.19 18 18.19 13.006 14.823 13.006 14.523 12.641 18.19 5.636z"></path></svg>', + ), + 'dribbble' => array( + 'name' => 'Dribbble', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12,22C6.486,22,2,17.514,2,12S6.486,2,12,2c5.514,0,10,4.486,10,10S17.514,22,12,22z M20.434,13.369 c-0.292-0.092-2.644-0.794-5.32-0.365c1.117,3.07,1.572,5.57,1.659,6.09C18.689,17.798,20.053,15.745,20.434,13.369z M15.336,19.876c-0.127-0.749-0.623-3.361-1.822-6.477c-0.019,0.006-0.038,0.013-0.056,0.019c-4.818,1.679-6.547,5.02-6.701,5.334 c1.448,1.129,3.268,1.803,5.243,1.803C13.183,20.555,14.311,20.313,15.336,19.876z M5.654,17.724 c0.193-0.331,2.538-4.213,6.943-5.637c0.111-0.036,0.224-0.07,0.337-0.102c-0.214-0.485-0.448-0.971-0.692-1.45 c-4.266,1.277-8.405,1.223-8.778,1.216c-0.003,0.087-0.004,0.174-0.004,0.261C3.458,14.207,4.29,16.21,5.654,17.724z M3.639,10.264 c0.382,0.005,3.901,0.02,7.897-1.041c-1.415-2.516-2.942-4.631-3.167-4.94C5.979,5.41,4.193,7.613,3.639,10.264z M9.998,3.709 c0.236,0.316,1.787,2.429,3.187,5c3.037-1.138,4.323-2.867,4.477-3.085C16.154,4.286,14.17,3.471,12,3.471 C11.311,3.471,10.641,3.554,9.998,3.709z M18.612,6.612C18.432,6.855,17,8.69,13.842,9.979c0.199,0.407,0.389,0.821,0.567,1.237 c0.063,0.148,0.124,0.295,0.184,0.441c2.842-0.357,5.666,0.215,5.948,0.275C20.522,9.916,19.801,8.065,18.612,6.612z"></path></svg>', + ), + 'dropbox' => array( + 'name' => 'Dropbox', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12,6.134L6.069,9.797L2,6.54l5.883-3.843L12,6.134z M2,13.054l5.883,3.843L12,13.459L6.069,9.797L2,13.054z M12,13.459 l4.116,3.439L22,13.054l-4.069-3.257L12,13.459z M22,6.54l-5.884-3.843L12,6.134l5.931,3.663L22,6.54z M12.011,14.2l-4.129,3.426 l-1.767-1.153v1.291l5.896,3.539l5.897-3.539v-1.291l-1.769,1.153L12.011,14.2z"></path></svg>', + ), + 'etsy' => array( + 'name' => 'Etsy', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M9.16033,4.038c0-.27174.02717-.43478.48913-.43478h6.22283c1.087,0,1.68478.92391,2.11957,2.663l.35326,1.38587h1.05978C19.59511,3.712,19.75815,2,19.75815,2s-2.663.29891-4.23913.29891h-7.962L3.29076,2.163v1.1413L4.731,3.57609c1.00543.19022,1.25.40761,1.33152,1.33152,0,0,.08152,2.71739.08152,7.20109s-.08152,7.17391-.08152,7.17391c0,.81522-.32609,1.11413-1.33152,1.30435l-1.44022.27174V22l4.2663-.13587h7.11957c1.60326,0,5.32609.13587,5.32609.13587.08152-.97826.625-5.40761.70652-5.89674H19.7038L18.644,18.52174c-.84239,1.90217-2.06522,2.038-3.42391,2.038H11.1712c-1.3587,0-2.01087-.54348-2.01087-1.712V12.65217s3.0163,0,3.99457.08152c.76087.05435,1.22283.27174,1.46739,1.33152l.32609,1.413h1.16848l-.08152-3.55978.163-3.587H15.02989l-.38043,1.57609c-.24457,1.03261-.40761,1.22283-1.46739,1.33152-1.38587.13587-4.02174.1087-4.02174.1087Z"></path></svg>', + ), + 'facebook' => array( + 'name' => 'Facebook', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg>', + ), + 'feed' => array( + 'name' => 'RSS Feed', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M2,8.667V12c5.515,0,10,4.485,10,10h3.333C15.333,14.637,9.363,8.667,2,8.667z M2,2v3.333 c9.19,0,16.667,7.477,16.667,16.667H22C22,10.955,13.045,2,2,2z M4.5,17C3.118,17,2,18.12,2,19.5S3.118,22,4.5,22S7,20.88,7,19.5 S5.882,17,4.5,17z"></path></svg>', + ), + 'flickr' => array( + 'name' => 'Flickr', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M6.5,7c-2.75,0-5,2.25-5,5s2.25,5,5,5s5-2.25,5-5S9.25,7,6.5,7z M17.5,7c-2.75,0-5,2.25-5,5s2.25,5,5,5s5-2.25,5-5 S20.25,7,17.5,7z"></path></svg>', + ), + 'foursquare' => array( + 'name' => 'Foursquare', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M17.573,2c0,0-9.197,0-10.668,0S5,3.107,5,3.805s0,16.948,0,16.948c0,0.785,0.422,1.077,0.66,1.172 c0.238,0.097,0.892,0.177,1.285-0.275c0,0,5.035-5.843,5.122-5.93c0.132-0.132,0.132-0.132,0.262-0.132h3.26 c1.368,0,1.588-0.977,1.732-1.552c0.078-0.318,0.692-3.428,1.225-6.122l0.675-3.368C19.56,2.893,19.14,2,17.573,2z M16.495,7.22 c-0.053,0.252-0.372,0.518-0.665,0.518c-0.293,0-4.157,0-4.157,0c-0.467,0-0.802,0.318-0.802,0.787v0.508 c0,0.467,0.337,0.798,0.805,0.798c0,0,3.197,0,3.528,0s0.655,0.362,0.583,0.715c-0.072,0.353-0.407,2.102-0.448,2.295 c-0.04,0.193-0.262,0.523-0.655,0.523c-0.33,0-2.88,0-2.88,0c-0.523,0-0.683,0.068-1.033,0.503 c-0.35,0.437-3.505,4.223-3.505,4.223c-0.032,0.035-0.063,0.027-0.063-0.015V4.852c0-0.298,0.26-0.648,0.648-0.648 c0,0,8.228,0,8.562,0c0.315,0,0.61,0.297,0.528,0.683L16.495,7.22z"></path></svg>', + ), + 'goodreads' => array( + 'name' => 'Goodreads', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M17.3,17.5c-0.2,0.8-0.5,1.4-1,1.9c-0.4,0.5-1,0.9-1.7,1.2C13.9,20.9,13.1,21,12,21c-0.6,0-1.3-0.1-1.9-0.2 c-0.6-0.1-1.1-0.4-1.6-0.7c-0.5-0.3-0.9-0.7-1.2-1.2c-0.3-0.5-0.5-1.1-0.5-1.7h1.5c0.1,0.5,0.2,0.9,0.5,1.2 c0.2,0.3,0.5,0.6,0.9,0.8c0.3,0.2,0.7,0.3,1.1,0.4c0.4,0.1,0.8,0.1,1.2,0.1c1.4,0,2.5-0.4,3.1-1.2c0.6-0.8,1-2,1-3.5v-1.7h0 c-0.4,0.8-0.9,1.4-1.6,1.9c-0.7,0.5-1.5,0.7-2.4,0.7c-1,0-1.9-0.2-2.6-0.5C8.7,15,8.1,14.5,7.7,14c-0.5-0.6-0.8-1.3-1-2.1 c-0.2-0.8-0.3-1.6-0.3-2.5c0-0.9,0.1-1.7,0.4-2.5c0.3-0.8,0.6-1.5,1.1-2c0.5-0.6,1.1-1,1.8-1.4C10.3,3.2,11.1,3,12,3 c0.5,0,0.9,0.1,1.3,0.2c0.4,0.1,0.8,0.3,1.1,0.5c0.3,0.2,0.6,0.5,0.9,0.8c0.3,0.3,0.5,0.6,0.6,1h0V3.4h1.5V15 C17.6,15.9,17.5,16.7,17.3,17.5z M13.8,14.1c0.5-0.3,0.9-0.7,1.3-1.1c0.3-0.5,0.6-1,0.8-1.6c0.2-0.6,0.3-1.2,0.3-1.9 c0-0.6-0.1-1.2-0.2-1.9c-0.1-0.6-0.4-1.2-0.7-1.7c-0.3-0.5-0.7-0.9-1.3-1.2c-0.5-0.3-1.1-0.5-1.9-0.5s-1.4,0.2-1.9,0.5 c-0.5,0.3-1,0.7-1.3,1.2C8.5,6.4,8.3,7,8.1,7.6C8,8.2,7.9,8.9,7.9,9.5c0,0.6,0.1,1.3,0.2,1.9C8.3,12,8.6,12.5,8.9,13 c0.3,0.5,0.8,0.8,1.3,1.1c0.5,0.3,1.1,0.4,1.9,0.4C12.7,14.5,13.3,14.4,13.8,14.1z"></path></svg>', + ), + 'google' => array( + 'name' => 'Google', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12.02,10.18v3.72v0.01h5.51c-0.26,1.57-1.67,4.22-5.5,4.22c-3.31,0-6.01-2.75-6.01-6.12s2.7-6.12,6.01-6.12 c1.87,0,3.13,0.8,3.85,1.48l2.84-2.76C16.99,2.99,14.73,2,12.03,2c-5.52,0-10,4.48-10,10s4.48,10,10,10c5.77,0,9.6-4.06,9.6-9.77 c0-0.83-0.11-1.42-0.25-2.05H12.02z"></path></svg>', + ), + 'github' => array( + 'name' => 'GitHub', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg>', + ), + 'instagram' => array( + 'name' => 'Instagram', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12,4.622c2.403,0,2.688,0.009,3.637,0.052c0.877,0.04,1.354,0.187,1.671,0.31c0.42,0.163,0.72,0.358,1.035,0.673 c0.315,0.315,0.51,0.615,0.673,1.035c0.123,0.317,0.27,0.794,0.31,1.671c0.043,0.949,0.052,1.234,0.052,3.637 s-0.009,2.688-0.052,3.637c-0.04,0.877-0.187,1.354-0.31,1.671c-0.163,0.42-0.358,0.72-0.673,1.035 c-0.315,0.315-0.615,0.51-1.035,0.673c-0.317,0.123-0.794,0.27-1.671,0.31c-0.949,0.043-1.233,0.052-3.637,0.052 s-2.688-0.009-3.637-0.052c-0.877-0.04-1.354-0.187-1.671-0.31c-0.42-0.163-0.72-0.358-1.035-0.673 c-0.315-0.315-0.51-0.615-0.673-1.035c-0.123-0.317-0.27-0.794-0.31-1.671C4.631,14.688,4.622,14.403,4.622,12 s0.009-2.688,0.052-3.637c0.04-0.877,0.187-1.354,0.31-1.671c0.163-0.42,0.358-0.72,0.673-1.035 c0.315-0.315,0.615-0.51,1.035-0.673c0.317-0.123,0.794-0.27,1.671-0.31C9.312,4.631,9.597,4.622,12,4.622 M12,3 C9.556,3,9.249,3.01,8.289,3.054C7.331,3.098,6.677,3.25,6.105,3.472C5.513,3.702,5.011,4.01,4.511,4.511 c-0.5,0.5-0.808,1.002-1.038,1.594C3.25,6.677,3.098,7.331,3.054,8.289C3.01,9.249,3,9.556,3,12c0,2.444,0.01,2.751,0.054,3.711 c0.044,0.958,0.196,1.612,0.418,2.185c0.23,0.592,0.538,1.094,1.038,1.594c0.5,0.5,1.002,0.808,1.594,1.038 c0.572,0.222,1.227,0.375,2.185,0.418C9.249,20.99,9.556,21,12,21s2.751-0.01,3.711-0.054c0.958-0.044,1.612-0.196,2.185-0.418 c0.592-0.23,1.094-0.538,1.594-1.038c0.5-0.5,0.808-1.002,1.038-1.594c0.222-0.572,0.375-1.227,0.418-2.185 C20.99,14.751,21,14.444,21,12s-0.01-2.751-0.054-3.711c-0.044-0.958-0.196-1.612-0.418-2.185c-0.23-0.592-0.538-1.094-1.038-1.594 c-0.5-0.5-1.002-0.808-1.594-1.038c-0.572-0.222-1.227-0.375-2.185-0.418C14.751,3.01,14.444,3,12,3L12,3z M12,7.378 c-2.552,0-4.622,2.069-4.622,4.622S9.448,16.622,12,16.622s4.622-2.069,4.622-4.622S14.552,7.378,12,7.378z M12,15 c-1.657,0-3-1.343-3-3s1.343-3,3-3s3,1.343,3,3S13.657,15,12,15z M16.804,6.116c-0.596,0-1.08,0.484-1.08,1.08 s0.484,1.08,1.08,1.08c0.596,0,1.08-0.484,1.08-1.08S17.401,6.116,16.804,6.116z"></path></svg>', + ), + 'lastfm' => array( + 'name' => 'Last.fm', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M10.5002,0 C4.7006,0 0,4.70109753 0,10.4998496 C0,16.2989526 4.7006,21 10.5002,21 C16.299,21 21,16.2989526 21,10.4998496 C21,4.70109753 16.299,0 10.5002,0 Z M14.69735,14.7204413 C13.3164,14.7151781 12.4346,14.0870017 11.83445,12.6859357 L11.6816001,12.3451305 L10.35405,9.31011397 C9.92709997,8.26875064 8.85260001,7.57120012 7.68010001,7.57120012 C6.06945001,7.57120012 4.75925001,8.88509738 4.75925001,10.5009524 C4.75925001,12.1164565 6.06945001,13.4303036 7.68010001,13.4303036 C8.77200001,13.4303036 9.76514999,12.827541 10.2719501,11.8567047 C10.2893,11.8235214 10.3239,11.8019673 10.36305,11.8038219 C10.4007,11.8053759 10.43535,11.8287847 10.4504,11.8631709 L10.98655,13.1045863 C11.0016,13.1389726 10.9956,13.17782 10.97225,13.2068931 C10.1605001,14.1995341 8.96020001,14.7683115 7.68010001,14.7683115 C5.33305,14.7683115 3.42340001,12.8535563 3.42340001,10.5009524 C3.42340001,8.14679459 5.33300001,6.23203946 7.68010001,6.23203946 C9.45720002,6.23203946 10.8909,7.19074535 11.6138,8.86359341 C11.6205501,8.88018505 12.3412,10.5707777 12.97445,12.0190621 C13.34865,12.8739575 13.64615,13.3959676 14.6288,13.4291508 C15.5663001,13.4612814 16.25375,12.9121534 16.25375,12.1484869 C16.25375,11.4691321 15.8320501,11.3003585 14.8803,10.98216 C13.2365,10.4397989 12.34495,9.88605929 12.34495,8.51817658 C12.34495,7.1809207 13.26665,6.31615054 14.692,6.31615054 C15.62875,6.31615054 16.3155,6.7286858 16.79215,7.5768142 C16.80495,7.60062396 16.8079001,7.62814302 16.8004001,7.65420843 C16.7929,7.68027384 16.7748,7.70212868 16.7507001,7.713808 L15.86145,8.16900031 C15.8178001,8.19200805 15.7643,8.17807308 15.73565,8.13847371 C15.43295,7.71345711 15.0956,7.52513451 14.6423,7.52513451 C14.05125,7.52513451 13.6220001,7.92899802 13.6220001,8.48649708 C13.6220001,9.17382194 14.1529001,9.34144259 15.0339,9.61923972 C15.14915,9.65578139 15.26955,9.69397731 15.39385,9.73432853 C16.7763,10.1865133 17.57675,10.7311301 17.57675,12.1836251 C17.57685,13.629654 16.3389,14.7204413 14.69735,14.7204413 Z"></path></svg>', + ), + 'linkedin' => array( + 'name' => 'LinkedIn', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg>', + ), + 'mail' => array( + 'name' => 'Mail', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M20,4H4C2.895,4,2,4.895,2,6v12c0,1.105,0.895,2,2,2h16c1.105,0,2-0.895,2-2V6C22,4.895,21.105,4,20,4z M20,8.236l-8,4.882 L4,8.236V6h16V8.236z"></path></svg>', + ), + 'mastodon' => array( + 'name' => 'Mastodon', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M23.193 7.879c0-5.206-3.411-6.732-3.411-6.732C18.062.357 15.108.025 12.041 0h-.076c-3.068.025-6.02.357-7.74 1.147 0 0-3.411 1.526-3.411 6.732 0 1.192-.023 2.618.015 4.129.124 5.092.934 10.109 5.641 11.355 2.17.574 4.034.695 5.535.612 2.722-.15 4.25-.972 4.25-.972l-.09-1.975s-1.945.613-4.129.539c-2.165-.074-4.449-.233-4.799-2.891a5.499 5.499 0 0 1-.048-.745s2.125.52 4.817.643c1.646.075 3.19-.097 4.758-.283 3.007-.359 5.625-2.212 5.954-3.905.517-2.665.475-6.507.475-6.507zm-4.024 6.709h-2.497V8.469c0-1.29-.543-1.944-1.628-1.944-1.2 0-1.802.776-1.802 2.312v3.349h-2.483v-3.35c0-1.536-.602-2.312-1.802-2.312-1.085 0-1.628.655-1.628 1.944v6.119H4.832V8.284c0-1.289.328-2.313.987-3.07.68-.758 1.569-1.146 2.674-1.146 1.278 0 2.246.491 2.886 1.474L12 6.585l.622-1.043c.64-.983 1.608-1.474 2.886-1.474 1.104 0 1.994.388 2.674 1.146.658.757.986 1.781.986 3.07v6.304z"/></svg>', + ), + 'meetup' => array( + 'name' => 'Meetup', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M19.24775,14.722a3.57032,3.57032,0,0,1-2.94457,3.52073,3.61886,3.61886,0,0,1-.64652.05634c-.07314-.0008-.10187.02846-.12507.09547A2.38881,2.38881,0,0,1,13.49453,20.094a2.33092,2.33092,0,0,1-1.827-.50716.13635.13635,0,0,0-.19878-.00408,3.191,3.191,0,0,1-2.104.60248,3.26309,3.26309,0,0,1-3.00324-2.71993,2.19076,2.19076,0,0,1-.03512-.30865c-.00156-.08579-.03413-.1189-.11608-.13493a2.86421,2.86421,0,0,1-1.23189-.56111,2.945,2.945,0,0,1-1.166-2.05749,2.97484,2.97484,0,0,1,.87524-2.50774.112.112,0,0,0,.02091-.16107,2.7213,2.7213,0,0,1-.36648-1.48A2.81256,2.81256,0,0,1,6.57673,7.58838a.35764.35764,0,0,0,.28869-.22819,4.2208,4.2208,0,0,1,6.02892-1.90111.25161.25161,0,0,0,.22023.0243,3.65608,3.65608,0,0,1,3.76031.90678A3.57244,3.57244,0,0,1,17.95918,8.626a2.97339,2.97339,0,0,1,.01829.57356.10637.10637,0,0,0,.0853.12792,1.97669,1.97669,0,0,1,1.27939,1.33733,2.00266,2.00266,0,0,1-.57112,2.12652c-.05284.05166-.04168.08328-.01173.13489A3.51189,3.51189,0,0,1,19.24775,14.722Zm-6.35959-.27836a1.6984,1.6984,0,0,0,1.14556,1.61113,3.82039,3.82039,0,0,0,1.036.17935,1.46888,1.46888,0,0,0,.73509-.12255.44082.44082,0,0,0,.26057-.44274.45312.45312,0,0,0-.29211-.43375.97191.97191,0,0,0-.20678-.063c-.21326-.03806-.42754-.0701-.63973-.11215a.54787.54787,0,0,1-.50172-.60926,2.75864,2.75864,0,0,1,.1773-.901c.1763-.535.414-1.045.64183-1.55913A12.686,12.686,0,0,0,15.85,10.47863a1.58461,1.58461,0,0,0,.04861-.87208,1.04531,1.04531,0,0,0-.85432-.83981,1.60658,1.60658,0,0,0-1.23654.16594.27593.27593,0,0,1-.36286-.03413c-.085-.0747-.16594-.15379-.24918-.23055a.98682.98682,0,0,0-1.33577-.04933,6.1468,6.1468,0,0,1-.4989.41615.47762.47762,0,0,1-.51535.03566c-.17448-.09307-.35512-.175-.53531-.25665a1.74949,1.74949,0,0,0-.56476-.2016,1.69943,1.69943,0,0,0-1.61654.91787,8.05815,8.05815,0,0,0-.32952.80126c-.45471,1.2557-.82507,2.53825-1.20838,3.81639a1.24151,1.24151,0,0,0,.51532,1.44389,1.42659,1.42659,0,0,0,1.22008.17166,1.09728,1.09728,0,0,0,.66994-.69764c.44145-1.04111.839-2.09989,1.25981-3.14926.11581-.28876.22792-.57874.35078-.86438a.44548.44548,0,0,1,.69189-.19539.50521.50521,0,0,1,.15044.43836,1.75625,1.75625,0,0,1-.14731.50453c-.27379.69219-.55265,1.38236-.82766,2.074a2.0836,2.0836,0,0,0-.14038.42876.50719.50719,0,0,0,.27082.57722.87236.87236,0,0,0,.66145.02739.99137.99137,0,0,0,.53406-.532q.61571-1.20914,1.228-2.42031.28423-.55863.57585-1.1133a.87189.87189,0,0,1,.29055-.35253.34987.34987,0,0,1,.37634-.01265.30291.30291,0,0,1,.12434.31459.56716.56716,0,0,1-.04655.1915c-.05318.12739-.10286.25669-.16183.38156-.34118.71775-.68754,1.43273-1.02568,2.152A2.00213,2.00213,0,0,0,12.88816,14.44366Zm4.78568,5.28972a.88573.88573,0,0,0-1.77139.00465.8857.8857,0,0,0,1.77139-.00465Zm-14.83838-7.296a.84329.84329,0,1,0,.00827-1.68655.8433.8433,0,0,0-.00827,1.68655Zm10.366-9.43673a.83506.83506,0,1,0-.0091,1.67.83505.83505,0,0,0,.0091-1.67Zm6.85014,5.22a.71651.71651,0,0,0-1.433.0093.71656.71656,0,0,0,1.433-.0093ZM5.37528,6.17908A.63823.63823,0,1,0,6.015,5.54483.62292.62292,0,0,0,5.37528,6.17908Zm6.68214,14.80843a.54949.54949,0,1,0-.55052.541A.54556.54556,0,0,0,12.05742,20.98752Zm8.53235-8.49689a.54777.54777,0,0,0-.54027.54023.53327.53327,0,0,0,.532.52293.51548.51548,0,0,0,.53272-.5237A.53187.53187,0,0,0,20.58977,12.49063ZM7.82846,2.4715a.44927.44927,0,1,0,.44484.44766A.43821.43821,0,0,0,7.82846,2.4715Zm13.775,7.60492a.41186.41186,0,0,0-.40065.39623.40178.40178,0,0,0,.40168.40168A.38994.38994,0,0,0,22,10.48172.39946.39946,0,0,0,21.60349,10.07642ZM5.79193,17.96207a.40469.40469,0,0,0-.397-.39646.399.399,0,0,0-.396.405.39234.39234,0,0,0,.39939.389A.39857.39857,0,0,0,5.79193,17.96207Z"></path></svg>', + ), + 'medium' => array( + 'name' => 'Medium', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z"></path></svg>', + ), + 'pinterest' => array( + 'name' => 'Pinterest', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12.289,2C6.617,2,3.606,5.648,3.606,9.622c0,1.846,1.025,4.146,2.666,4.878c0.25,0.111,0.381,0.063,0.439-0.169 c0.044-0.175,0.267-1.029,0.365-1.428c0.032-0.128,0.017-0.237-0.091-0.362C6.445,11.911,6.01,10.75,6.01,9.668 c0-2.777,2.194-5.464,5.933-5.464c3.23,0,5.49,2.108,5.49,5.122c0,3.407-1.794,5.768-4.13,5.768c-1.291,0-2.257-1.021-1.948-2.277 c0.372-1.495,1.089-3.112,1.089-4.191c0-0.967-0.542-1.775-1.663-1.775c-1.319,0-2.379,1.309-2.379,3.059 c0,1.115,0.394,1.869,0.394,1.869s-1.302,5.279-1.54,6.261c-0.405,1.666,0.053,4.368,0.094,4.604 c0.021,0.126,0.167,0.169,0.25,0.063c0.129-0.165,1.699-2.419,2.142-4.051c0.158-0.59,0.817-2.995,0.817-2.995 c0.43,0.784,1.681,1.446,3.013,1.446c3.963,0,6.822-3.494,6.822-7.833C20.394,5.112,16.849,2,12.289,2"></path></svg>', + ), + 'pocket' => array( + 'name' => 'Pocket', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M21.927,4.194C21.667,3.48,20.982,3,20.222,3h-0.01h-1.721H3.839C3.092,3,2.411,3.47,2.145,4.17 C2.066,4.378,2.026,4.594,2.026,4.814v6.035l0.069,1.2c0.29,2.73,1.707,5.115,3.899,6.778c0.039,0.03,0.079,0.059,0.119,0.089 l0.025,0.018c1.175,0.859,2.491,1.441,3.91,1.727c0.655,0.132,1.325,0.2,1.991,0.2c0.615,0,1.232-0.057,1.839-0.17 c0.073-0.014,0.145-0.028,0.219-0.044c0.02-0.004,0.042-0.012,0.064-0.023c1.359-0.297,2.621-0.864,3.753-1.691l0.025-0.018 c0.04-0.029,0.08-0.058,0.119-0.089c2.192-1.664,3.609-4.049,3.898-6.778l0.069-1.2V4.814C22.026,4.605,22,4.398,21.927,4.194z M17.692,10.481l-4.704,4.512c-0.266,0.254-0.608,0.382-0.949,0.382c-0.342,0-0.684-0.128-0.949-0.382l-4.705-4.512 C5.838,9.957,5.82,9.089,6.344,8.542c0.524-0.547,1.392-0.565,1.939-0.04l3.756,3.601l3.755-3.601 c0.547-0.524,1.415-0.506,1.939,0.04C18.256,9.089,18.238,9.956,17.692,10.481z"></path></svg>', + ), + 'reddit' => array( + 'name' => 'Reddit', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M22,11.816c0-1.256-1.021-2.277-2.277-2.277c-0.593,0-1.122,0.24-1.526,0.614c-1.481-0.965-3.455-1.594-5.647-1.69 l1.171-3.702l3.18,0.748c0.008,1.028,0.846,1.862,1.876,1.862c1.035,0,1.877-0.842,1.877-1.878c0-1.035-0.842-1.877-1.877-1.877 c-0.769,0-1.431,0.466-1.72,1.13l-3.508-0.826c-0.203-0.047-0.399,0.067-0.46,0.261l-1.35,4.268 c-2.316,0.038-4.411,0.67-5.97,1.671C5.368,9.765,4.853,9.539,4.277,9.539C3.021,9.539,2,10.56,2,11.816 c0,0.814,0.433,1.523,1.078,1.925c-0.037,0.221-0.061,0.444-0.061,0.672c0,3.292,4.011,5.97,8.941,5.97s8.941-2.678,8.941-5.97 c0-0.214-0.02-0.424-0.053-0.632C21.533,13.39,22,12.661,22,11.816z M18.776,4.394c0.606,0,1.1,0.493,1.1,1.1s-0.493,1.1-1.1,1.1 s-1.1-0.494-1.1-1.1S18.169,4.394,18.776,4.394z M2.777,11.816c0-0.827,0.672-1.5,1.499-1.5c0.313,0,0.598,0.103,0.838,0.269 c-0.851,0.676-1.477,1.479-1.812,2.36C2.983,12.672,2.777,12.27,2.777,11.816z M11.959,19.606c-4.501,0-8.164-2.329-8.164-5.193 S7.457,9.22,11.959,9.22s8.164,2.329,8.164,5.193S16.46,19.606,11.959,19.606z M20.636,13.001c-0.326-0.89-0.948-1.701-1.797-2.384 c0.248-0.186,0.55-0.301,0.883-0.301c0.827,0,1.5,0.673,1.5,1.5C21.223,12.299,20.992,12.727,20.636,13.001z M8.996,14.704 c-0.76,0-1.397-0.616-1.397-1.376c0-0.76,0.637-1.397,1.397-1.397c0.76,0,1.376,0.637,1.376,1.397 C10.372,14.088,9.756,14.704,8.996,14.704z M16.401,13.328c0,0.76-0.616,1.376-1.376,1.376c-0.76,0-1.399-0.616-1.399-1.376 c0-0.76,0.639-1.397,1.399-1.397C15.785,11.931,16.401,12.568,16.401,13.328z M15.229,16.708c0.152,0.152,0.152,0.398,0,0.55 c-0.674,0.674-1.727,1.002-3.219,1.002c-0.004,0-0.007-0.002-0.011-0.002c-0.004,0-0.007,0.002-0.011,0.002 c-1.492,0-2.544-0.328-3.218-1.002c-0.152-0.152-0.152-0.398,0-0.55c0.152-0.152,0.399-0.151,0.55,0 c0.521,0.521,1.394,0.775,2.669,0.775c0.004,0,0.007,0.002,0.011,0.002c0.004,0,0.007-0.002,0.011-0.002 c1.275,0,2.148-0.253,2.669-0.775C14.831,16.556,15.078,16.556,15.229,16.708z"></path></svg>', + ), + 'skype' => array( + 'name' => 'Skype', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M10.113,2.699c0.033-0.006,0.067-0.013,0.1-0.02c0.033,0.017,0.066,0.033,0.098,0.051L10.113,2.699z M2.72,10.223 c-0.006,0.034-0.011,0.069-0.017,0.103c0.018,0.032,0.033,0.064,0.051,0.095L2.72,10.223z M21.275,13.771 c0.007-0.035,0.011-0.071,0.018-0.106c-0.018-0.031-0.033-0.064-0.052-0.095L21.275,13.771z M13.563,21.199 c0.032,0.019,0.065,0.035,0.096,0.053c0.036-0.006,0.071-0.011,0.105-0.017L13.563,21.199z M22,16.386 c0,1.494-0.581,2.898-1.637,3.953c-1.056,1.057-2.459,1.637-3.953,1.637c-0.967,0-1.914-0.251-2.75-0.725 c0.036-0.006,0.071-0.011,0.105-0.017l-0.202-0.035c0.032,0.019,0.065,0.035,0.096,0.053c-0.543,0.096-1.099,0.147-1.654,0.147 c-1.275,0-2.512-0.25-3.676-0.743c-1.125-0.474-2.135-1.156-3.002-2.023c-0.867-0.867-1.548-1.877-2.023-3.002 c-0.493-1.164-0.743-2.401-0.743-3.676c0-0.546,0.049-1.093,0.142-1.628c0.018,0.032,0.033,0.064,0.051,0.095L2.72,10.223 c-0.006,0.034-0.011,0.069-0.017,0.103C2.244,9.5,2,8.566,2,7.615c0-1.493,0.582-2.898,1.637-3.953 c1.056-1.056,2.46-1.638,3.953-1.638c0.915,0,1.818,0.228,2.622,0.655c-0.033,0.007-0.067,0.013-0.1,0.02l0.199,0.031 c-0.032-0.018-0.066-0.034-0.098-0.051c0.002,0,0.003-0.001,0.004-0.001c0.586-0.112,1.187-0.169,1.788-0.169 c1.275,0,2.512,0.249,3.676,0.742c1.124,0.476,2.135,1.156,3.002,2.024c0.868,0.867,1.548,1.877,2.024,3.002 c0.493,1.164,0.743,2.401,0.743,3.676c0,0.575-0.054,1.15-0.157,1.712c-0.018-0.031-0.033-0.064-0.052-0.095l0.034,0.201 c0.007-0.035,0.011-0.071,0.018-0.106C21.754,14.494,22,15.432,22,16.386z M16.817,14.138c0-1.331-0.613-2.743-3.033-3.282 l-2.209-0.49c-0.84-0.192-1.807-0.444-1.807-1.237c0-0.794,0.679-1.348,1.903-1.348c2.468,0,2.243,1.696,3.468,1.696 c0.645,0,1.209-0.379,1.209-1.031c0-1.521-2.435-2.663-4.5-2.663c-2.242,0-4.63,0.952-4.63,3.488c0,1.221,0.436,2.521,2.839,3.123 l2.984,0.745c0.903,0.223,1.129,0.731,1.129,1.189c0,0.762-0.758,1.507-2.129,1.507c-2.679,0-2.307-2.062-3.743-2.062 c-0.645,0-1.113,0.444-1.113,1.078c0,1.236,1.501,2.886,4.856,2.886C15.236,17.737,16.817,16.199,16.817,14.138z"></path></svg>', + ), + 'snapchat' => array( + 'name' => 'Snapchat', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12.065,2a5.526,5.526,0,0,1,3.132.892A5.854,5.854,0,0,1,17.326,5.4a5.821,5.821,0,0,1,.351,2.33q0,.612-.117,2.487a.809.809,0,0,0,.365.091,1.93,1.93,0,0,0,.664-.176,1.93,1.93,0,0,1,.664-.176,1.3,1.3,0,0,1,.729.234.7.7,0,0,1,.351.6.839.839,0,0,1-.41.7,2.732,2.732,0,0,1-.9.41,3.192,3.192,0,0,0-.9.378.728.728,0,0,0-.41.618,1.575,1.575,0,0,0,.156.56,6.9,6.9,0,0,0,1.334,1.953,5.6,5.6,0,0,0,1.881,1.315,5.875,5.875,0,0,0,1.042.3.42.42,0,0,1,.365.456q0,.911-2.852,1.341a1.379,1.379,0,0,0-.143.507,1.8,1.8,0,0,1-.182.605.451.451,0,0,1-.429.241,5.878,5.878,0,0,1-.807-.085,5.917,5.917,0,0,0-.833-.085,4.217,4.217,0,0,0-.807.065,2.42,2.42,0,0,0-.82.293,6.682,6.682,0,0,0-.755.5q-.351.267-.755.527a3.886,3.886,0,0,1-.989.436A4.471,4.471,0,0,1,11.831,22a4.307,4.307,0,0,1-1.256-.176,3.784,3.784,0,0,1-.976-.436q-.4-.26-.749-.527a6.682,6.682,0,0,0-.755-.5,2.422,2.422,0,0,0-.807-.293,4.432,4.432,0,0,0-.82-.065,5.089,5.089,0,0,0-.853.1,5,5,0,0,1-.762.1.474.474,0,0,1-.456-.241,1.819,1.819,0,0,1-.182-.618,1.411,1.411,0,0,0-.143-.521q-2.852-.429-2.852-1.341a.42.42,0,0,1,.365-.456,5.793,5.793,0,0,0,1.042-.3,5.524,5.524,0,0,0,1.881-1.315,6.789,6.789,0,0,0,1.334-1.953A1.575,1.575,0,0,0,6,12.9a.728.728,0,0,0-.41-.618,3.323,3.323,0,0,0-.9-.384,2.912,2.912,0,0,1-.9-.41.814.814,0,0,1-.41-.684.71.71,0,0,1,.338-.593,1.208,1.208,0,0,1,.716-.241,1.976,1.976,0,0,1,.625.169,2.008,2.008,0,0,0,.69.169.919.919,0,0,0,.416-.091q-.117-1.849-.117-2.474A5.861,5.861,0,0,1,6.385,5.4,5.516,5.516,0,0,1,8.625,2.819,7.075,7.075,0,0,1,12.062,2Z"></path></svg>', + ), + 'soundcloud' => array( + 'name' => 'Soundcloud', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M8.9,16.1L9,14L8.9,9.5c0-0.1,0-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c-0.1,0-0.1,0-0.1,0.1c0,0-0.1,0.1-0.1,0.1L8.3,14l0.1,2.1 c0,0.1,0,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1C8.8,16.3,8.9,16.3,8.9,16.1z M11.4,15.9l0.1-1.8L11.4,9c0-0.1,0-0.2-0.1-0.2 c0,0-0.1,0-0.1,0s-0.1,0-0.1,0c-0.1,0-0.1,0.1-0.1,0.2l0,0.1l-0.1,5c0,0,0,0.7,0.1,2v0c0,0.1,0,0.1,0.1,0.1c0.1,0.1,0.1,0.1,0.2,0.1 c0.1,0,0.1,0,0.2-0.1c0.1,0,0.1-0.1,0.1-0.2L11.4,15.9z M2.4,12.9L2.5,14l-0.2,1.1c0,0.1,0,0.1-0.1,0.1c0,0-0.1,0-0.1-0.1L2.1,14 l0.1-1.1C2.2,12.9,2.3,12.9,2.4,12.9C2.3,12.9,2.4,12.9,2.4,12.9z M3.1,12.2L3.3,14l-0.2,1.8c0,0.1,0,0.1-0.1,0.1 c-0.1,0-0.1,0-0.1-0.1L2.8,14L3,12.2C3,12.2,3,12.2,3.1,12.2C3.1,12.2,3.1,12.2,3.1,12.2z M3.9,11.9L4.1,14l-0.2,2.1 c0,0.1,0,0.1-0.1,0.1c-0.1,0-0.1,0-0.1-0.1L3.5,14l0.2-2.1c0-0.1,0-0.1,0.1-0.1C3.9,11.8,3.9,11.8,3.9,11.9z M4.7,11.9L4.9,14 l-0.2,2.1c0,0.1-0.1,0.1-0.1,0.1c-0.1,0-0.1,0-0.1-0.1L4.3,14l0.2-2.2c0-0.1,0-0.1,0.1-0.1C4.7,11.7,4.7,11.8,4.7,11.9z M5.6,12 l0.2,2l-0.2,2.1c0,0.1-0.1,0.1-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0-0.1,0-0.1L5.1,14l0.2-2c0,0,0-0.1,0-0.1s0.1,0,0.1,0 C5.5,11.9,5.5,11.9,5.6,12L5.6,12z M6.4,10.7L6.6,14l-0.2,2.1c0,0,0,0.1,0,0.1c0,0-0.1,0-0.1,0c-0.1,0-0.1-0.1-0.2-0.2L5.9,14 l0.2-3.3c0-0.1,0.1-0.2,0.2-0.2c0,0,0.1,0,0.1,0C6.4,10.7,6.4,10.7,6.4,10.7z M7.2,10l0.2,4.1l-0.2,2.1c0,0,0,0.1,0,0.1 c0,0-0.1,0-0.1,0c-0.1,0-0.2-0.1-0.2-0.2l-0.1-2.1L6.8,10c0-0.1,0.1-0.2,0.2-0.2c0,0,0.1,0,0.1,0S7.2,9.9,7.2,10z M8,9.6L8.2,14 L8,16.1c0,0.1-0.1,0.2-0.2,0.2c-0.1,0-0.2-0.1-0.2-0.2L7.5,14l0.1-4.4c0-0.1,0-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1c0.1,0,0.1,0,0.1,0.1 C8,9.6,8,9.6,8,9.6z M11.4,16.1L11.4,16.1L11.4,16.1z M9.7,9.6L9.8,14l-0.1,2.1c0,0.1,0,0.1-0.1,0.2s-0.1,0.1-0.2,0.1 c-0.1,0-0.1,0-0.1-0.1s-0.1-0.1-0.1-0.2L9.2,14l0.1-4.4c0-0.1,0-0.1,0.1-0.2s0.1-0.1,0.2-0.1c0.1,0,0.1,0,0.2,0.1S9.7,9.5,9.7,9.6 L9.7,9.6z M10.6,9.8l0.1,4.3l-0.1,2c0,0.1,0,0.1-0.1,0.2c0,0-0.1,0.1-0.2,0.1c-0.1,0-0.1,0-0.2-0.1c0,0-0.1-0.1-0.1-0.2L10,14 l0.1-4.3c0-0.1,0-0.1,0.1-0.2c0,0,0.1-0.1,0.2-0.1c0.1,0,0.1,0,0.2,0.1S10.6,9.7,10.6,9.8z M12.4,14l-0.1,2c0,0.1,0,0.1-0.1,0.2 c-0.1,0.1-0.1,0.1-0.2,0.1c-0.1,0-0.1,0-0.2-0.1c-0.1-0.1-0.1-0.1-0.1-0.2l-0.1-1l-0.1-1l0.1-5.5v0c0-0.1,0-0.2,0.1-0.2 c0.1,0,0.1-0.1,0.2-0.1c0,0,0.1,0,0.1,0c0.1,0,0.1,0.1,0.1,0.2L12.4,14z M22.1,13.9c0,0.7-0.2,1.3-0.7,1.7c-0.5,0.5-1.1,0.7-1.7,0.7 h-6.8c-0.1,0-0.1,0-0.2-0.1c-0.1-0.1-0.1-0.1-0.1-0.2V8.2c0-0.1,0.1-0.2,0.2-0.3c0.5-0.2,1-0.3,1.6-0.3c1.1,0,2.1,0.4,2.9,1.1 c0.8,0.8,1.3,1.7,1.4,2.8c0.3-0.1,0.6-0.2,1-0.2c0.7,0,1.3,0.2,1.7,0.7C21.8,12.6,22.1,13.2,22.1,13.9L22.1,13.9z"></path></svg>', + ), + 'spotify' => array( + 'name' => 'Spotify', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,5.523,4.477,10,10,10c5.523,0,10-4.477,10-10C22,6.477,17.523,2,12,2 M16.586,16.424 c-0.18,0.295-0.563,0.387-0.857,0.207c-2.348-1.435-5.304-1.76-8.785-0.964c-0.335,0.077-0.67-0.133-0.746-0.469 c-0.077-0.335,0.132-0.67,0.469-0.746c3.809-0.871,7.077-0.496,9.713,1.115C16.673,15.746,16.766,16.13,16.586,16.424 M17.81,13.7 c-0.226,0.367-0.706,0.482-1.072,0.257c-2.687-1.652-6.785-2.131-9.965-1.166C6.36,12.917,5.925,12.684,5.8,12.273 C5.675,11.86,5.908,11.425,6.32,11.3c3.632-1.102,8.147-0.568,11.234,1.328C17.92,12.854,18.035,13.335,17.81,13.7 M17.915,10.865 c-3.223-1.914-8.54-2.09-11.618-1.156C5.804,9.859,5.281,9.58,5.131,9.086C4.982,8.591,5.26,8.069,5.755,7.919 c3.532-1.072,9.404-0.865,13.115,1.338c0.445,0.264,0.59,0.838,0.327,1.282C18.933,10.983,18.359,11.129,17.915,10.865"></path></svg>', + ), + 'tumblr' => array( + 'name' => 'Tumblr', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M16.749,17.396c-0.357,0.17-1.041,0.319-1.551,0.332c-1.539,0.041-1.837-1.081-1.85-1.896V9.847h3.861V6.937h-3.847V2.039 c0,0-2.77,0-2.817,0c-0.046,0-0.127,0.041-0.138,0.144c-0.165,1.499-0.867,4.13-3.783,5.181v2.484h1.945v6.282 c0,2.151,1.587,5.206,5.775,5.135c1.413-0.024,2.982-0.616,3.329-1.126L16.749,17.396z"></path></svg>', + ), + 'twitch' => array( + 'name' => 'Twitch', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M16.499,8.089h-1.636v4.91h1.636V8.089z M12,8.089h-1.637v4.91H12V8.089z M4.228,3.178L3,6.451v13.092h4.499V22h2.456 l2.454-2.456h3.681L21,14.636V3.178H4.228z M19.364,13.816l-2.864,2.865H12l-2.453,2.453V16.68H5.863V4.814h13.501V13.816z"></path></svg>', + ), + 'twitter' => array( + 'name' => 'Twitter', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M22.23,5.924c-0.736,0.326-1.527,0.547-2.357,0.646c0.847-0.508,1.498-1.312,1.804-2.27 c-0.793,0.47-1.671,0.812-2.606,0.996C18.324,4.498,17.257,4,16.077,4c-2.266,0-4.103,1.837-4.103,4.103 c0,0.322,0.036,0.635,0.106,0.935C8.67,8.867,5.647,7.234,3.623,4.751C3.27,5.357,3.067,6.062,3.067,6.814 c0,1.424,0.724,2.679,1.825,3.415c-0.673-0.021-1.305-0.206-1.859-0.513c0,0.017,0,0.034,0,0.052c0,1.988,1.414,3.647,3.292,4.023 c-0.344,0.094-0.707,0.144-1.081,0.144c-0.264,0-0.521-0.026-0.772-0.074c0.522,1.63,2.038,2.816,3.833,2.85 c-1.404,1.1-3.174,1.756-5.096,1.756c-0.331,0-0.658-0.019-0.979-0.057c1.816,1.164,3.973,1.843,6.29,1.843 c7.547,0,11.675-6.252,11.675-11.675c0-0.178-0.004-0.355-0.012-0.531C20.985,7.47,21.68,6.747,22.23,5.924z"></path></svg>', + ), + 'vimeo' => array( + 'name' => 'Vimeo', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M22.396,7.164c-0.093,2.026-1.507,4.799-4.245,8.32C15.322,19.161,12.928,21,10.97,21c-1.214,0-2.24-1.119-3.079-3.359 c-0.56-2.053-1.119-4.106-1.68-6.159C5.588,9.243,4.921,8.122,4.206,8.122c-0.156,0-0.701,0.328-1.634,0.98L1.594,7.841 c1.027-0.902,2.04-1.805,3.037-2.708C6.001,3.95,7.03,3.327,7.715,3.264c1.619-0.156,2.616,0.951,2.99,3.321 c0.404,2.557,0.685,4.147,0.841,4.769c0.467,2.121,0.981,3.181,1.542,3.181c0.435,0,1.09-0.688,1.963-2.065 c0.871-1.376,1.338-2.422,1.401-3.142c0.125-1.187-0.343-1.782-1.401-1.782c-0.498,0-1.012,0.115-1.541,0.341 c1.023-3.35,2.977-4.977,5.862-4.884C21.511,3.066,22.52,4.453,22.396,7.164z"></path></svg>', + ), + 'vk' => array( + 'name' => 'VK', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M22,7.1c0.2,0.4-0.4,1.5-1.6,3.1c-0.2,0.2-0.4,0.5-0.7,0.9c-0.5,0.7-0.9,1.1-0.9,1.4c-0.1,0.3-0.1,0.6,0.1,0.8 c0.1,0.1,0.4,0.4,0.8,0.9h0l0,0c1,0.9,1.6,1.7,2,2.3c0,0,0,0.1,0.1,0.1c0,0.1,0,0.1,0.1,0.3c0,0.1,0,0.2,0,0.4 c0,0.1-0.1,0.2-0.3,0.3c-0.1,0.1-0.4,0.1-0.6,0.1l-2.7,0c-0.2,0-0.4,0-0.6-0.1c-0.2-0.1-0.4-0.1-0.5-0.2l-0.2-0.1 c-0.2-0.1-0.5-0.4-0.7-0.7s-0.5-0.6-0.7-0.8c-0.2-0.2-0.4-0.4-0.6-0.6C14.8,15,14.6,15,14.4,15c0,0,0,0-0.1,0c0,0-0.1,0.1-0.2,0.2 c-0.1,0.1-0.2,0.2-0.2,0.3c-0.1,0.1-0.1,0.3-0.2,0.5c-0.1,0.2-0.1,0.5-0.1,0.8c0,0.1,0,0.2,0,0.3c0,0.1-0.1,0.2-0.1,0.2l0,0.1 c-0.1,0.1-0.3,0.2-0.6,0.2h-1.2c-0.5,0-1,0-1.5-0.2c-0.5-0.1-1-0.3-1.4-0.6s-0.7-0.5-1.1-0.7s-0.6-0.4-0.7-0.6l-0.3-0.3 c-0.1-0.1-0.2-0.2-0.3-0.3s-0.4-0.5-0.7-0.9s-0.7-1-1.1-1.6c-0.4-0.6-0.8-1.3-1.3-2.2C2.9,9.4,2.5,8.5,2.1,7.5C2,7.4,2,7.3,2,7.2 c0-0.1,0-0.1,0-0.2l0-0.1c0.1-0.1,0.3-0.2,0.6-0.2l2.9,0c0.1,0,0.2,0,0.2,0.1S5.9,6.9,5.9,7L6,7c0.1,0.1,0.2,0.2,0.3,0.3 C6.4,7.7,6.5,8,6.7,8.4C6.9,8.8,7,9,7.1,9.2l0.2,0.3c0.2,0.4,0.4,0.8,0.6,1.1c0.2,0.3,0.4,0.5,0.5,0.7s0.3,0.3,0.4,0.4 c0.1,0.1,0.3,0.1,0.4,0.1c0.1,0,0.2,0,0.3-0.1c0,0,0,0,0.1-0.1c0,0,0.1-0.1,0.1-0.2c0.1-0.1,0.1-0.3,0.1-0.5c0-0.2,0.1-0.5,0.1-0.8 c0-0.4,0-0.8,0-1.3c0-0.3,0-0.5-0.1-0.8c0-0.2-0.1-0.4-0.1-0.5L9.6,7.6C9.4,7.3,9.1,7.2,8.7,7.1C8.6,7.1,8.6,7,8.7,6.9 C8.9,6.7,9,6.6,9.1,6.5c0.4-0.2,1.2-0.3,2.5-0.3c0.6,0,1,0.1,1.4,0.1c0.1,0,0.3,0.1,0.3,0.1c0.1,0.1,0.2,0.1,0.2,0.3 c0,0.1,0.1,0.2,0.1,0.3s0,0.3,0,0.5c0,0.2,0,0.4,0,0.6c0,0.2,0,0.4,0,0.7c0,0.3,0,0.6,0,0.9c0,0.1,0,0.2,0,0.4c0,0.2,0,0.4,0,0.5 c0,0.1,0,0.3,0,0.4s0.1,0.3,0.1,0.4c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0,0.1,0,0.2,0c0.1,0,0.2,0,0.3-0.1c0.1-0.1,0.2-0.2,0.4-0.4 s0.3-0.4,0.5-0.7c0.2-0.3,0.5-0.7,0.7-1.1c0.4-0.7,0.8-1.5,1.1-2.3c0-0.1,0.1-0.1,0.1-0.2c0-0.1,0.1-0.1,0.1-0.1l0,0l0.1,0 c0,0,0,0,0.1,0s0.2,0,0.2,0l3,0c0.3,0,0.5,0,0.7,0S21.9,7,21.9,7L22,7.1z"></path></svg>', + ), + 'wordpress' => array( + 'name' => 'WordPress', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12.158,12.786L9.46,20.625c0.806,0.237,1.657,0.366,2.54,0.366c1.047,0,2.051-0.181,2.986-0.51 c-0.024-0.038-0.046-0.079-0.065-0.124L12.158,12.786z M3.009,12c0,3.559,2.068,6.634,5.067,8.092L3.788,8.341 C3.289,9.459,3.009,10.696,3.009,12z M18.069,11.546c0-1.112-0.399-1.881-0.741-2.48c-0.456-0.741-0.883-1.368-0.883-2.109 c0-0.826,0.627-1.596,1.51-1.596c0.04,0,0.078,0.005,0.116,0.007C16.472,3.904,14.34,3.009,12,3.009 c-3.141,0-5.904,1.612-7.512,4.052c0.211,0.007,0.41,0.011,0.579,0.011c0.94,0,2.396-0.114,2.396-0.114 C7.947,6.93,8.004,7.642,7.52,7.699c0,0-0.487,0.057-1.029,0.085l3.274,9.739l1.968-5.901l-1.401-3.838 C9.848,7.756,9.389,7.699,9.389,7.699C8.904,7.67,8.961,6.93,9.446,6.958c0,0,1.484,0.114,2.368,0.114 c0.94,0,2.397-0.114,2.397-0.114c0.485-0.028,0.542,0.684,0.057,0.741c0,0-0.488,0.057-1.029,0.085l3.249,9.665l0.897-2.996 C17.841,13.284,18.069,12.316,18.069,11.546z M19.889,7.686c0.039,0.286,0.06,0.593,0.06,0.924c0,0.912-0.171,1.938-0.684,3.22 l-2.746,7.94c2.673-1.558,4.47-4.454,4.47-7.771C20.991,10.436,20.591,8.967,19.889,7.686z M12,22C6.486,22,2,17.514,2,12 C2,6.486,6.486,2,12,2c5.514,0,10,4.486,10,10C22,17.514,17.514,22,12,22z"></path></svg>', + ), + 'yelp' => array( + 'name' => 'Yelp', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M12.271,16.718v1.417q-.011,3.257-.067,3.4a.707.707,0,0,1-.569.446,4.637,4.637,0,0,1-2.024-.424A4.609,4.609,0,0,1,7.8,20.565a.844.844,0,0,1-.19-.4.692.692,0,0,1,.044-.29,3.181,3.181,0,0,1,.379-.524q.335-.412,2.019-2.409.011,0,.669-.781a.757.757,0,0,1,.44-.274.965.965,0,0,1,.552.039.945.945,0,0,1,.418.324.732.732,0,0,1,.139.468Zm-1.662-2.8a.783.783,0,0,1-.58.781l-1.339.435q-3.067.981-3.257.981a.711.711,0,0,1-.6-.4,2.636,2.636,0,0,1-.19-.836,9.134,9.134,0,0,1,.011-1.857,3.559,3.559,0,0,1,.335-1.389.659.659,0,0,1,.625-.357,22.629,22.629,0,0,1,2.253.859q.781.324,1.283.524l.937.379a.771.771,0,0,1,.4.34A.982.982,0,0,1,10.609,13.917Zm9.213,3.313a4.467,4.467,0,0,1-1.021,1.8,4.559,4.559,0,0,1-1.512,1.417.671.671,0,0,1-.7-.078q-.156-.112-2.052-3.2l-.524-.859a.761.761,0,0,1-.128-.513.957.957,0,0,1,.217-.513.774.774,0,0,1,.926-.29q.011.011,1.327.446,2.264.736,2.7.887a2.082,2.082,0,0,1,.524.229.673.673,0,0,1,.245.68Zm-7.5-7.049q.056,1.137-.6,1.361-.647.19-1.272-.792L6.237,4.08a.7.7,0,0,1,.212-.691,5.788,5.788,0,0,1,2.314-1,5.928,5.928,0,0,1,2.5-.352.681.681,0,0,1,.547.5q.034.2.245,3.407T12.327,10.181Zm7.384,1.2a.679.679,0,0,1-.29.658q-.167.112-3.67.959-.747.167-1.015.257l.011-.022a.769.769,0,0,1-.513-.044.914.914,0,0,1-.413-.357.786.786,0,0,1,0-.971q.011-.011.836-1.137,1.394-1.908,1.673-2.275a2.423,2.423,0,0,1,.379-.435A.7.7,0,0,1,17.435,8a4.482,4.482,0,0,1,1.372,1.489,4.81,4.81,0,0,1,.9,1.868v.034Z"></path></svg>', + ), + 'youtube' => array( + 'name' => 'YouTube', + 'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg>', + ), + 'share' => array( + 'name' => 'Share Icon', + 'icon' => '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" role="img" aria-hidden="true" focusable="false"><rect x="0" fill="none" width="20" height="20"/><g><path d="M14.5 12c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3c0-.24.03-.46.09-.69l-4.38-2.3c-.55.61-1.33.99-2.21.99-1.66 0-3-1.34-3-3s1.34-3 3-3c.88 0 1.66.39 2.21.99l4.38-2.3c-.06-.23-.09-.45-.09-.69 0-1.66 1.34-3 3-3s3 1.34 3 3-1.34 3-3 3c-.88 0-1.66-.39-2.21-.99l-4.38 2.3c.06.23.09.45.09.69s-.03.46-.09.69l4.38 2.3c.55-.61 1.33-.99 2.21-.99z"/></g></svg>', + ), + ); + + if ( ! empty( $service ) + && ! empty( $field ) + && isset( $services_data[ $service ] ) + && ( 'icon' === $field || 'name' === $field ) + ) { + return $services_data[ $service ][ $field ]; + } elseif ( ! empty( $service ) && isset( $services_data[ $service ] ) ) { + return $services_data[ $service ]; + } + + return $services_data; +} diff --git a/wp-includes/blocks/social-link/block.json b/wp-includes/blocks/social-link/block.json new file mode 100644 index 0000000..977f573 --- /dev/null +++ b/wp-includes/blocks/social-link/block.json @@ -0,0 +1,16 @@ +{ + "name": "core/social-link", + "category": "widgets", + "icon": "share", + "attributes": { + "url": { + "type": "string" + }, + "service": { + "type": "string" + }, + "label": { + "type": "string" + } + } +} diff --git a/wp-includes/blocks/tag-cloud.php b/wp-includes/blocks/tag-cloud.php new file mode 100644 index 0000000..cf9c4d2 --- /dev/null +++ b/wp-includes/blocks/tag-cloud.php @@ -0,0 +1,78 @@ +<?php +/** + * Server-side rendering of the `core/tag-cloud` block. + * + * @package WordPress + */ + +/** + * Renders the `core/tag-cloud` block on server. + * + * @param array $attributes The block attributes. + * + * @return string Returns the tag cloud for selected taxonomy. + */ +function render_block_core_tag_cloud( $attributes ) { + $class = isset( $attributes['align'] ) ? + "wp-block-tag-cloud align{$attributes['align']}" : + 'wp-block-tag-cloud'; + + if ( isset( $attributes['className'] ) ) { + $class .= ' ' . $attributes['className']; + } + + $args = array( + 'echo' => false, + 'taxonomy' => $attributes['taxonomy'], + 'show_count' => $attributes['showTagCounts'], + ); + + $tag_cloud = wp_tag_cloud( $args ); + + if ( ! $tag_cloud ) { + $labels = get_taxonomy_labels( get_taxonomy( $attributes['taxonomy'] ) ); + $tag_cloud = esc_html( + sprintf( + /* translators: %s: taxonomy name */ + __( 'Your site doesn’t have any %s, so there’s nothing to display here at the moment.' ), + strtolower( $labels->name ) + ) + ); + } + + return sprintf( + '<p class="%1$s">%2$s</p>', + esc_attr( $class ), + $tag_cloud + ); +} + +/** + * Registers the `core/tag-cloud` block on server. + */ +function register_block_core_tag_cloud() { + register_block_type( + 'core/tag-cloud', + array( + 'attributes' => array( + 'align' => array( + 'type' => 'string', + 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), + ), + 'className' => array( + 'type' => 'string', + ), + 'taxonomy' => array( + 'type' => 'string', + 'default' => 'post_tag', + ), + 'showTagCounts' => array( + 'type' => 'boolean', + 'default' => false, + ), + ), + 'render_callback' => 'render_block_core_tag_cloud', + ) + ); +} +add_action( 'init', 'register_block_core_tag_cloud' ); diff --git a/wp-includes/bookmark-template.php b/wp-includes/bookmark-template.php new file mode 100644 index 0000000..9385a36 --- /dev/null +++ b/wp-includes/bookmark-template.php @@ -0,0 +1,324 @@ +<?php +/** + * Bookmark Template Functions for usage in Themes + * + * @package WordPress + * @subpackage Template + */ + +/** + * The formatted output of a list of bookmarks. + * + * The $bookmarks array must contain bookmark objects and will be iterated over + * to retrieve the bookmark to be used in the output. + * + * The output is formatted as HTML with no way to change that format. However, + * what is between, before, and after can be changed. The link itself will be + * HTML. + * + * This function is used internally by wp_list_bookmarks() and should not be + * used by themes. + * + * @since 2.1.0 + * @access private + * + * @param array $bookmarks List of bookmarks to traverse. + * @param string|array $args { + * Optional. Bookmarks arguments. + * + * @type int|bool $show_updated Whether to show the time the bookmark was last updated. + * Accepts 1|true or 0|false. Default 0|false. + * @type int|bool $show_description Whether to show the bookmark description. Accepts 1|true, + * Accepts 1|true or 0|false. Default 0|false. + * @type int|bool $show_images Whether to show the link image if available. Accepts 1|true + * or 0|false. Default 1|true. + * @type int|bool $show_name Whether to show link name if available. Accepts 1|true or + * 0|false. Default 0|false. + * @type string $before The HTML or text to prepend to each bookmark. Default `<li>`. + * @type string $after The HTML or text to append to each bookmark. Default `</li>`. + * @type string $link_before The HTML or text to prepend to each bookmark inside the anchor + * tags. Default empty. + * @type string $link_after The HTML or text to append to each bookmark inside the anchor + * tags. Default empty. + * @type string $between The string for use in between the link, description, and image. + * Default "\n". + * @type int|bool $show_rating Whether to show the link rating. Accepts 1|true or 0|false. + * Default 0|false. + * + * } + * @return string Formatted output in HTML + */ +function _walk_bookmarks( $bookmarks, $args = '' ) { + $defaults = array( + 'show_updated' => 0, + 'show_description' => 0, + 'show_images' => 1, + 'show_name' => 0, + 'before' => '<li>', + 'after' => '</li>', + 'between' => "\n", + 'show_rating' => 0, + 'link_before' => '', + 'link_after' => '', + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + $output = ''; // Blank string to start with. + + foreach ( (array) $bookmarks as $bookmark ) { + if ( ! isset( $bookmark->recently_updated ) ) { + $bookmark->recently_updated = false; + } + $output .= $parsed_args['before']; + if ( $parsed_args['show_updated'] && $bookmark->recently_updated ) { + $output .= '<em>'; + } + $the_link = '#'; + if ( ! empty( $bookmark->link_url ) ) { + $the_link = esc_url( $bookmark->link_url ); + } + $desc = esc_attr( sanitize_bookmark_field( 'link_description', $bookmark->link_description, $bookmark->link_id, 'display' ) ); + $name = esc_attr( sanitize_bookmark_field( 'link_name', $bookmark->link_name, $bookmark->link_id, 'display' ) ); + $title = $desc; + + if ( $parsed_args['show_updated'] ) { + if ( '00' != substr( $bookmark->link_updated_f, 0, 2 ) ) { + $title .= ' ('; + $title .= sprintf( + /* translators: %s: Date and time of last update. */ + __( 'Last updated: %s' ), + gmdate( + get_option( 'links_updated_date_format' ), + $bookmark->link_updated_f + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) + ) + ); + $title .= ')'; + } + } + $alt = ' alt="' . $name . ( $parsed_args['show_description'] ? ' ' . $title : '' ) . '"'; + + if ( '' != $title ) { + $title = ' title="' . $title . '"'; + } + $rel = $bookmark->link_rel; + if ( '' != $rel ) { + $rel = ' rel="' . esc_attr( $rel ) . '"'; + } + $target = $bookmark->link_target; + if ( '' != $target ) { + $target = ' target="' . $target . '"'; + } + $output .= '<a href="' . $the_link . '"' . $rel . $title . $target . '>'; + + $output .= $parsed_args['link_before']; + + if ( null != $bookmark->link_image && $parsed_args['show_images'] ) { + if ( strpos( $bookmark->link_image, 'http' ) === 0 ) { + $output .= "<img src=\"$bookmark->link_image\" $alt $title />"; + } else { // If it's a relative path. + $output .= '<img src="' . get_option( 'siteurl' ) . "$bookmark->link_image\" $alt $title />"; + } + if ( $parsed_args['show_name'] ) { + $output .= " $name"; + } + } else { + $output .= $name; + } + + $output .= $parsed_args['link_after']; + + $output .= '</a>'; + + if ( $parsed_args['show_updated'] && $bookmark->recently_updated ) { + $output .= '</em>'; + } + + if ( $parsed_args['show_description'] && '' != $desc ) { + $output .= $parsed_args['between'] . $desc; + } + + if ( $parsed_args['show_rating'] ) { + $output .= $parsed_args['between'] . sanitize_bookmark_field( + 'link_rating', + $bookmark->link_rating, + $bookmark->link_id, + 'display' + ); + } + $output .= $parsed_args['after'] . "\n"; + } // End while. + + return $output; +} + +/** + * Retrieve or echo all of the bookmarks. + * + * List of default arguments are as follows: + * + * These options define how the Category name will appear before the category + * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will + * display for only the 'title_li' string and only if 'title_li' is not empty. + * + * @since 2.1.0 + * + * @see _walk_bookmarks() + * + * @param string|array $args { + * Optional. String or array of arguments to list bookmarks. + * + * @type string $orderby How to order the links by. Accepts post fields. Default 'name'. + * @type string $order Whether to order bookmarks in ascending or descending order. + * Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'. + * @type int $limit Amount of bookmarks to display. Accepts 1+ or -1 for all. + * Default -1. + * @type string $category Comma-separated list of category ids to include links from. + * Default empty. + * @type string $category_name Category to retrieve links for by name. Default empty. + * @type int|bool $hide_invisible Whether to show or hide links marked as 'invisible'. Accepts + * 1|true or 0|false. Default 1|true. + * @type int|bool $show_updated Whether to display the time the bookmark was last updated. + * Accepts 1|true or 0|false. Default 0|false. + * @type int|bool $echo Whether to echo or return the formatted bookmarks. Accepts + * 1|true (echo) or 0|false (return). Default 1|true. + * @type int|bool $categorize Whether to show links listed by category or in a single column. + * Accepts 1|true (by category) or 0|false (one column). Default 1|true. + * @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false. + * Default 0|false. + * @type string $title_li What to show before the links appear. Default 'Bookmarks'. + * @type string $title_before The HTML or text to prepend to the $title_li string. Default '<h2>'. + * @type string $title_after The HTML or text to append to the $title_li string. Default '</h2>'. + * @type string $class The CSS class to use for the $title_li. Default 'linkcat'. + * @type string $category_before The HTML or text to prepend to $title_before if $categorize is true. + * String must contain '%id' and '%class' to inherit the category ID and + * the $class argument used for formatting in themes. + * Default '<li id="%id" class="%class">'. + * @type string $category_after The HTML or text to append to $title_after if $categorize is true. + * Default '</li>'. + * @type string $category_orderby How to order the bookmark category based on term scheme if $categorize + * is true. Default 'name'. + * @type string $category_order Whether to order categories in ascending or descending order if + * $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending). + * Default 'ASC'. + * } + * @return void|string Void if 'echo' argument is true, HTML list of bookmarks if 'echo' is false. + */ +function wp_list_bookmarks( $args = '' ) { + $defaults = array( + 'orderby' => 'name', + 'order' => 'ASC', + 'limit' => -1, + 'category' => '', + 'exclude_category' => '', + 'category_name' => '', + 'hide_invisible' => 1, + 'show_updated' => 0, + 'echo' => 1, + 'categorize' => 1, + 'title_li' => __( 'Bookmarks' ), + 'title_before' => '<h2>', + 'title_after' => '</h2>', + 'category_orderby' => 'name', + 'category_order' => 'ASC', + 'class' => 'linkcat', + 'category_before' => '<li id="%id" class="%class">', + 'category_after' => '</li>', + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + $output = ''; + + if ( ! is_array( $parsed_args['class'] ) ) { + $parsed_args['class'] = explode( ' ', $parsed_args['class'] ); + } + $parsed_args['class'] = array_map( 'sanitize_html_class', $parsed_args['class'] ); + $parsed_args['class'] = trim( join( ' ', $parsed_args['class'] ) ); + + if ( $parsed_args['categorize'] ) { + $cats = get_terms( + array( + 'taxonomy' => 'link_category', + 'name__like' => $parsed_args['category_name'], + 'include' => $parsed_args['category'], + 'exclude' => $parsed_args['exclude_category'], + 'orderby' => $parsed_args['category_orderby'], + 'order' => $parsed_args['category_order'], + 'hierarchical' => 0, + ) + ); + if ( empty( $cats ) ) { + $parsed_args['categorize'] = false; + } + } + + if ( $parsed_args['categorize'] ) { + // Split the bookmarks into ul's for each category. + foreach ( (array) $cats as $cat ) { + $params = array_merge( $parsed_args, array( 'category' => $cat->term_id ) ); + $bookmarks = get_bookmarks( $params ); + if ( empty( $bookmarks ) ) { + continue; + } + $output .= str_replace( + array( '%id', '%class' ), + array( "linkcat-$cat->term_id", $parsed_args['class'] ), + $parsed_args['category_before'] + ); + /** + * Filters the category name. + * + * @since 2.2.0 + * + * @param string $cat_name The category name. + */ + $catname = apply_filters( 'link_category', $cat->name ); + + $output .= $parsed_args['title_before']; + $output .= $catname; + $output .= $parsed_args['title_after']; + $output .= "\n\t<ul class='xoxo blogroll'>\n"; + $output .= _walk_bookmarks( $bookmarks, $parsed_args ); + $output .= "\n\t</ul>\n"; + $output .= $parsed_args['category_after'] . "\n"; + } + } else { + // Output one single list using title_li for the title. + $bookmarks = get_bookmarks( $parsed_args ); + + if ( ! empty( $bookmarks ) ) { + if ( ! empty( $parsed_args['title_li'] ) ) { + $output .= str_replace( + array( '%id', '%class' ), + array( 'linkcat-' . $parsed_args['category'], $parsed_args['class'] ), + $parsed_args['category_before'] + ); + $output .= $parsed_args['title_before']; + $output .= $parsed_args['title_li']; + $output .= $parsed_args['title_after']; + $output .= "\n\t<ul class='xoxo blogroll'>\n"; + $output .= _walk_bookmarks( $bookmarks, $parsed_args ); + $output .= "\n\t</ul>\n"; + $output .= $parsed_args['category_after'] . "\n"; + } else { + $output .= _walk_bookmarks( $bookmarks, $parsed_args ); + } + } + } + + /** + * Filters the bookmarks list before it is echoed or returned. + * + * @since 2.5.0 + * + * @param string $html The HTML list of bookmarks. + */ + $html = apply_filters( 'wp_list_bookmarks', $output ); + + if ( $parsed_args['echo'] ) { + echo $html; + } else { + return $html; + } +} diff --git a/wp-includes/bookmark.php b/wp-includes/bookmark.php new file mode 100644 index 0000000..ef0f11a --- /dev/null +++ b/wp-includes/bookmark.php @@ -0,0 +1,462 @@ +<?php +/** + * Link/Bookmark API + * + * @package WordPress + * @subpackage Bookmark + */ + +/** + * Retrieve Bookmark data + * + * @since 2.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int|stdClass $bookmark + * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to + * an stdClass object, an associative array, or a numeric array, respectively. Default OBJECT. + * @param string $filter Optional, default is 'raw'. + * @return array|object|null Type returned depends on $output value. + */ +function get_bookmark( $bookmark, $output = OBJECT, $filter = 'raw' ) { + global $wpdb; + + if ( empty( $bookmark ) ) { + if ( isset( $GLOBALS['link'] ) ) { + $_bookmark = & $GLOBALS['link']; + } else { + $_bookmark = null; + } + } elseif ( is_object( $bookmark ) ) { + wp_cache_add( $bookmark->link_id, $bookmark, 'bookmark' ); + $_bookmark = $bookmark; + } else { + if ( isset( $GLOBALS['link'] ) && ( $GLOBALS['link']->link_id == $bookmark ) ) { + $_bookmark = & $GLOBALS['link']; + } else { + $_bookmark = wp_cache_get( $bookmark, 'bookmark' ); + if ( ! $_bookmark ) { + $_bookmark = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1", $bookmark ) ); + if ( $_bookmark ) { + $_bookmark->link_category = array_unique( wp_get_object_terms( $_bookmark->link_id, 'link_category', array( 'fields' => 'ids' ) ) ); + wp_cache_add( $_bookmark->link_id, $_bookmark, 'bookmark' ); + } + } + } + } + + if ( ! $_bookmark ) { + return $_bookmark; + } + + $_bookmark = sanitize_bookmark( $_bookmark, $filter ); + + if ( OBJECT == $output ) { + return $_bookmark; + } elseif ( ARRAY_A == $output ) { + return get_object_vars( $_bookmark ); + } elseif ( ARRAY_N == $output ) { + return array_values( get_object_vars( $_bookmark ) ); + } else { + return $_bookmark; + } +} + +/** + * Retrieve single bookmark data item or field. + * + * @since 2.3.0 + * + * @param string $field The name of the data field to return + * @param int $bookmark The bookmark ID to get field + * @param string $context Optional. The context of how the field will be used. + * @return string|WP_Error + */ +function get_bookmark_field( $field, $bookmark, $context = 'display' ) { + $bookmark = (int) $bookmark; + $bookmark = get_bookmark( $bookmark ); + + if ( is_wp_error( $bookmark ) ) { + return $bookmark; + } + + if ( ! is_object( $bookmark ) ) { + return ''; + } + + if ( ! isset( $bookmark->$field ) ) { + return ''; + } + + return sanitize_bookmark_field( $field, $bookmark->$field, $bookmark->link_id, $context ); +} + +/** + * Retrieves the list of bookmarks + * + * Attempts to retrieve from the cache first based on MD5 hash of arguments. If + * that fails, then the query will be built from the arguments and executed. The + * results will be stored to the cache. + * + * @since 2.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string|array $args { + * Optional. String or array of arguments to retrieve bookmarks. + * + * @type string $orderby How to order the links by. Accepts 'id', 'link_id', 'name', 'link_name', + * 'url', 'link_url', 'visible', 'link_visible', 'rating', 'link_rating', + * 'owner', 'link_owner', 'updated', 'link_updated', 'notes', 'link_notes', + * 'description', 'link_description', 'length' and 'rand'. + * When `$orderby` is 'length', orders by the character length of + * 'link_name'. Default 'name'. + * @type string $order Whether to order bookmarks in ascending or descending order. + * Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'. + * @type int $limit Amount of bookmarks to display. Accepts any positive number or + * -1 for all. Default -1. + * @type string $category Comma-separated list of category ids to include links from. + * Default empty. + * @type string $category_name Category to retrieve links for by name. Default empty. + * @type int|bool $hide_invisible Whether to show or hide links marked as 'invisible'. Accepts + * 1|true or 0|false. Default 1|true. + * @type int|bool $show_updated Whether to display the time the bookmark was last updated. + * Accepts 1|true or 0|false. Default 0|false. + * @type string $include Comma-separated list of bookmark IDs to include. Default empty. + * @type string $exclude Comma-separated list of bookmark IDs to exclude. Default empty. + * @type string $search Search terms. Will be SQL-formatted with wildcards before and after + * and searched in 'link_url', 'link_name' and 'link_description'. + * Default empty. + * } + * @return object[] List of bookmark row objects. + */ +function get_bookmarks( $args = '' ) { + global $wpdb; + + $defaults = array( + 'orderby' => 'name', + 'order' => 'ASC', + 'limit' => -1, + 'category' => '', + 'category_name' => '', + 'hide_invisible' => 1, + 'show_updated' => 0, + 'include' => '', + 'exclude' => '', + 'search' => '', + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + $key = md5( serialize( $parsed_args ) ); + $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ); + + if ( 'rand' !== $parsed_args['orderby'] && $cache ) { + if ( is_array( $cache ) && isset( $cache[ $key ] ) ) { + $bookmarks = $cache[ $key ]; + /** + * Filters the returned list of bookmarks. + * + * The first time the hook is evaluated in this file, it returns the cached + * bookmarks list. The second evaluation returns a cached bookmarks list if the + * link category is passed but does not exist. The third evaluation returns + * the full cached results. + * + * @since 2.1.0 + * + * @see get_bookmarks() + * + * @param array $bookmarks List of the cached bookmarks. + * @param array $parsed_args An array of bookmark query arguments. + */ + return apply_filters( 'get_bookmarks', $bookmarks, $parsed_args ); + } + } + + if ( ! is_array( $cache ) ) { + $cache = array(); + } + + $inclusions = ''; + if ( ! empty( $parsed_args['include'] ) ) { + $parsed_args['exclude'] = ''; // Ignore exclude, category, and category_name params if using include. + $parsed_args['category'] = ''; + $parsed_args['category_name'] = ''; + + $inclinks = wp_parse_id_list( $parsed_args['include'] ); + if ( count( $inclinks ) ) { + foreach ( $inclinks as $inclink ) { + if ( empty( $inclusions ) ) { + $inclusions = ' AND ( link_id = ' . $inclink . ' '; + } else { + $inclusions .= ' OR link_id = ' . $inclink . ' '; + } + } + } + } + if ( ! empty( $inclusions ) ) { + $inclusions .= ')'; + } + + $exclusions = ''; + if ( ! empty( $parsed_args['exclude'] ) ) { + $exlinks = wp_parse_id_list( $parsed_args['exclude'] ); + if ( count( $exlinks ) ) { + foreach ( $exlinks as $exlink ) { + if ( empty( $exclusions ) ) { + $exclusions = ' AND ( link_id <> ' . $exlink . ' '; + } else { + $exclusions .= ' AND link_id <> ' . $exlink . ' '; + } + } + } + } + if ( ! empty( $exclusions ) ) { + $exclusions .= ')'; + } + + if ( ! empty( $parsed_args['category_name'] ) ) { + $parsed_args['category'] = get_term_by( 'name', $parsed_args['category_name'], 'link_category' ); + if ( $parsed_args['category'] ) { + $parsed_args['category'] = $parsed_args['category']->term_id; + } else { + $cache[ $key ] = array(); + wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); + /** This filter is documented in wp-includes/bookmark.php */ + return apply_filters( 'get_bookmarks', array(), $parsed_args ); + } + } + + $search = ''; + if ( ! empty( $parsed_args['search'] ) ) { + $like = '%' . $wpdb->esc_like( $parsed_args['search'] ) . '%'; + $search = $wpdb->prepare( ' AND ( (link_url LIKE %s) OR (link_name LIKE %s) OR (link_description LIKE %s) ) ', $like, $like, $like ); + } + + $category_query = ''; + $join = ''; + if ( ! empty( $parsed_args['category'] ) ) { + $incategories = wp_parse_id_list( $parsed_args['category'] ); + if ( count( $incategories ) ) { + foreach ( $incategories as $incat ) { + if ( empty( $category_query ) ) { + $category_query = ' AND ( tt.term_id = ' . $incat . ' '; + } else { + $category_query .= ' OR tt.term_id = ' . $incat . ' '; + } + } + } + } + if ( ! empty( $category_query ) ) { + $category_query .= ") AND taxonomy = 'link_category'"; + $join = " INNER JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id"; + } + + if ( $parsed_args['show_updated'] ) { + $recently_updated_test = ', IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated '; + } else { + $recently_updated_test = ''; + } + + $get_updated = ( $parsed_args['show_updated'] ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : ''; + + $orderby = strtolower( $parsed_args['orderby'] ); + $length = ''; + switch ( $orderby ) { + case 'length': + $length = ', CHAR_LENGTH(link_name) AS length'; + break; + case 'rand': + $orderby = 'rand()'; + break; + case 'link_id': + $orderby = "$wpdb->links.link_id"; + break; + default: + $orderparams = array(); + $keys = array( 'link_id', 'link_name', 'link_url', 'link_visible', 'link_rating', 'link_owner', 'link_updated', 'link_notes', 'link_description' ); + foreach ( explode( ',', $orderby ) as $ordparam ) { + $ordparam = trim( $ordparam ); + + if ( in_array( 'link_' . $ordparam, $keys ) ) { + $orderparams[] = 'link_' . $ordparam; + } elseif ( in_array( $ordparam, $keys ) ) { + $orderparams[] = $ordparam; + } + } + $orderby = implode( ',', $orderparams ); + } + + if ( empty( $orderby ) ) { + $orderby = 'link_name'; + } + + $order = strtoupper( $parsed_args['order'] ); + if ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ) ) ) { + $order = 'ASC'; + } + + $visible = ''; + if ( $parsed_args['hide_invisible'] ) { + $visible = "AND link_visible = 'Y'"; + } + + $query = "SELECT * $length $recently_updated_test $get_updated FROM $wpdb->links $join WHERE 1=1 $visible $category_query"; + $query .= " $exclusions $inclusions $search"; + $query .= " ORDER BY $orderby $order"; + if ( -1 != $parsed_args['limit'] ) { + $query .= ' LIMIT ' . $parsed_args['limit']; + } + + $results = $wpdb->get_results( $query ); + + if ( 'rand()' !== $orderby ) { + $cache[ $key ] = $results; + wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); + } + + /** This filter is documented in wp-includes/bookmark.php */ + return apply_filters( 'get_bookmarks', $results, $parsed_args ); +} + +/** + * Sanitizes all bookmark fields + * + * @since 2.3.0 + * + * @param stdClass|array $bookmark Bookmark row + * @param string $context Optional, default is 'display'. How to filter the + * fields + * @return stdClass|array Same type as $bookmark but with fields sanitized. + */ +function sanitize_bookmark( $bookmark, $context = 'display' ) { + $fields = array( + 'link_id', + 'link_url', + 'link_name', + 'link_image', + 'link_target', + 'link_category', + 'link_description', + 'link_visible', + 'link_owner', + 'link_rating', + 'link_updated', + 'link_rel', + 'link_notes', + 'link_rss', + ); + + if ( is_object( $bookmark ) ) { + $do_object = true; + $link_id = $bookmark->link_id; + } else { + $do_object = false; + $link_id = $bookmark['link_id']; + } + + foreach ( $fields as $field ) { + if ( $do_object ) { + if ( isset( $bookmark->$field ) ) { + $bookmark->$field = sanitize_bookmark_field( $field, $bookmark->$field, $link_id, $context ); + } + } else { + if ( isset( $bookmark[ $field ] ) ) { + $bookmark[ $field ] = sanitize_bookmark_field( $field, $bookmark[ $field ], $link_id, $context ); + } + } + } + + return $bookmark; +} + +/** + * Sanitizes a bookmark field. + * + * Sanitizes the bookmark fields based on what the field name is. If the field + * has a strict value set, then it will be tested for that, else a more generic + * filtering is applied. After the more strict filter is applied, if the `$context` + * is 'raw' then the value is immediately return. + * + * Hooks exist for the more generic cases. With the 'edit' context, the {@see 'edit_$field'} + * filter will be called and passed the `$value` and `$bookmark_id` respectively. + * + * With the 'db' context, the {@see 'pre_$field'} filter is called and passed the value. + * The 'display' context is the final context and has the `$field` has the filter name + * and is passed the `$value`, `$bookmark_id`, and `$context`, respectively. + * + * @since 2.3.0 + * + * @param string $field The bookmark field. + * @param mixed $value The bookmark field value. + * @param int $bookmark_id Bookmark ID. + * @param string $context How to filter the field value. Accepts 'raw', 'edit', 'attribute', + * 'js', 'db', or 'display' + * @return mixed The filtered value. + */ +function sanitize_bookmark_field( $field, $value, $bookmark_id, $context ) { + switch ( $field ) { + case 'link_id': // ints + case 'link_rating': + $value = (int) $value; + break; + case 'link_category': // array( ints ) + $value = array_map( 'absint', (array) $value ); + // We return here so that the categories aren't filtered. + // The 'link_category' filter is for the name of a link category, not an array of a link's link categories. + return $value; + + case 'link_visible': // bool stored as Y|N + $value = preg_replace( '/[^YNyn]/', '', $value ); + break; + case 'link_target': // "enum" + $targets = array( '_top', '_blank' ); + if ( ! in_array( $value, $targets ) ) { + $value = ''; + } + break; + } + + if ( 'raw' == $context ) { + return $value; + } + + if ( 'edit' == $context ) { + /** This filter is documented in wp-includes/post.php */ + $value = apply_filters( "edit_{$field}", $value, $bookmark_id ); + + if ( 'link_notes' == $field ) { + $value = esc_html( $value ); // textarea_escaped + } else { + $value = esc_attr( $value ); + } + } elseif ( 'db' == $context ) { + /** This filter is documented in wp-includes/post.php */ + $value = apply_filters( "pre_{$field}", $value ); + } else { + /** This filter is documented in wp-includes/post.php */ + $value = apply_filters( "{$field}", $value, $bookmark_id, $context ); + + if ( 'attribute' == $context ) { + $value = esc_attr( $value ); + } elseif ( 'js' == $context ) { + $value = esc_js( $value ); + } + } + + return $value; +} + +/** + * Deletes the bookmark cache. + * + * @since 2.7.0 + * + * @param int $bookmark_id Bookmark ID. + */ +function clean_bookmark_cache( $bookmark_id ) { + wp_cache_delete( $bookmark_id, 'bookmark' ); + wp_cache_delete( 'get_bookmarks', 'bookmark' ); + clean_object_term_cache( $bookmark_id, 'link' ); +} diff --git a/wp-includes/cache.php b/wp-includes/cache.php new file mode 100644 index 0000000..9957235 --- /dev/null +++ b/wp-includes/cache.php @@ -0,0 +1,275 @@ +<?php +/** + * Object Cache API + * + * @link https://codex.wordpress.org/Class_Reference/WP_Object_Cache + * + * @package WordPress + * @subpackage Cache + */ + +/** WP_Object_Cache class */ +require_once ABSPATH . WPINC . '/class-wp-object-cache.php'; + +/** + * Adds data to the cache, if the cache key doesn't already exist. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::add() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key The cache key to use for retrieval later. + * @param mixed $data The data to add to the cache. + * @param string $group Optional. The group to add the cache to. Enables the same key + * to be used across groups. Default empty. + * @param int $expire Optional. When the cache data should expire, in seconds. + * Default 0 (no expiration). + * @return bool True on success, false if cache key and group already exist. + */ +function wp_cache_add( $key, $data, $group = '', $expire = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->add( $key, $data, $group, (int) $expire ); +} + +/** + * Closes the cache. + * + * This function has ceased to do anything since WordPress 2.5. The + * functionality was removed along with the rest of the persistent cache. + * + * This does not mean that plugins can't implement this function when they need + * to make sure that the cache is cleaned up after WordPress no longer needs it. + * + * @since 2.0.0 + * + * @return true Always returns true. + */ +function wp_cache_close() { + return true; +} + +/** + * Decrements numeric cache item's value. + * + * @since 3.3.0 + * + * @see WP_Object_Cache::decr() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key The cache key to decrement. + * @param int $offset Optional. The amount by which to decrement the item's value. Default 1. + * @param string $group Optional. The group the key is in. Default empty. + * @return int|false The item's new value on success, false on failure. + */ +function wp_cache_decr( $key, $offset = 1, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->decr( $key, $offset, $group ); +} + +/** + * Removes the cache contents matching key and group. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::delete() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key What the contents in the cache are called. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @return bool True on successful removal, false on failure. + */ +function wp_cache_delete( $key, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->delete( $key, $group ); +} + +/** + * Removes all cache items. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::flush() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @return bool True on success, false on failure. + */ +function wp_cache_flush() { + global $wp_object_cache; + + return $wp_object_cache->flush(); +} + +/** + * Retrieves the cache contents from the cache by key and group. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::get() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key The key under which the cache contents are stored. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param bool $force Optional. Whether to force an update of the local cache from the persistent + * cache. Default false. + * @param bool $found Optional. Whether the key was found in the cache (passed by reference). + * Disambiguates a return of false, a storable value. Default null. + * @return bool|mixed False on failure to retrieve contents or the cache + * contents on success + */ +function wp_cache_get( $key, $group = '', $force = false, &$found = null ) { + global $wp_object_cache; + + return $wp_object_cache->get( $key, $group, $force, $found ); +} + +/** + * Increment numeric cache item's value + * + * @since 3.3.0 + * + * @see WP_Object_Cache::incr() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key The key for the cache contents that should be incremented. + * @param int $offset Optional. The amount by which to increment the item's value. Default 1. + * @param string $group Optional. The group the key is in. Default empty. + * @return int|false The item's new value on success, false on failure. + */ +function wp_cache_incr( $key, $offset = 1, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->incr( $key, $offset, $group ); +} + +/** + * Sets up Object Cache Global and assigns it. + * + * @since 2.0.0 + * + * @global WP_Object_Cache $wp_object_cache + */ +function wp_cache_init() { + $GLOBALS['wp_object_cache'] = new WP_Object_Cache(); +} + +/** + * Replaces the contents of the cache with new data. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::replace() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key The key for the cache data that should be replaced. + * @param mixed $data The new data to store in the cache. + * @param string $group Optional. The group for the cache data that should be replaced. + * Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool False if original value does not exist, true if contents were replaced + */ +function wp_cache_replace( $key, $data, $group = '', $expire = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->replace( $key, $data, $group, (int) $expire ); +} + +/** + * Saves the data to the cache. + * + * Differs from wp_cache_add() and wp_cache_replace() in that it will always write data. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::set() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key The cache key to use for retrieval later. + * @param mixed $data The contents to store in the cache. + * @param string $group Optional. Where to group the cache contents. Enables the same key + * to be used across groups. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool True on success, false on failure. + */ +function wp_cache_set( $key, $data, $group = '', $expire = 0 ) { + global $wp_object_cache; + + return $wp_object_cache->set( $key, $data, $group, (int) $expire ); +} + +/** + * Switches the internal blog ID. + * + * This changes the blog id used to create keys in blog specific groups. + * + * @since 3.5.0 + * + * @see WP_Object_Cache::switch_to_blog() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int $blog_id Site ID. + */ +function wp_cache_switch_to_blog( $blog_id ) { + global $wp_object_cache; + + $wp_object_cache->switch_to_blog( $blog_id ); +} + +/** + * Adds a group or set of groups to the list of global groups. + * + * @since 2.6.0 + * + * @see WP_Object_Cache::add_global_groups() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param string|array $groups A group or an array of groups to add. + */ +function wp_cache_add_global_groups( $groups ) { + global $wp_object_cache; + + $wp_object_cache->add_global_groups( $groups ); +} + +/** + * Adds a group or set of groups to the list of non-persistent groups. + * + * @since 2.6.0 + * + * @param string|array $groups A group or an array of groups to add. + */ +function wp_cache_add_non_persistent_groups( $groups ) { + // Default cache doesn't persist so nothing to do here. +} + +/** + * Reset internal cache keys and structures. + * + * If the cache back end uses global blog or site IDs as part of its cache keys, + * this function instructs the back end to reset those keys and perform any cleanup + * since blog or site IDs have changed since cache init. + * + * This function is deprecated. Use wp_cache_switch_to_blog() instead of this + * function when preparing the cache for a blog switch. For clearing the cache + * during unit tests, consider using wp_cache_init(). wp_cache_init() is not + * recommended outside of unit tests as the performance penalty for using it is + * high. + * + * @since 2.6.0 + * @deprecated 3.5.0 WP_Object_Cache::reset() + * @see WP_Object_Cache::reset() + * + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + */ +function wp_cache_reset() { + _deprecated_function( __FUNCTION__, '3.5.0', 'WP_Object_Cache::reset()' ); + + global $wp_object_cache; + + $wp_object_cache->reset(); +} diff --git a/wp-includes/canonical.php b/wp-includes/canonical.php new file mode 100644 index 0000000..339e099 --- /dev/null +++ b/wp-includes/canonical.php @@ -0,0 +1,768 @@ +<?php +/** + * Canonical API to handle WordPress Redirecting + * + * Based on "Permalink Redirect" from Scott Yang and "Enforce www. Preference" + * by Mark Jaquith + * + * @package WordPress + * @since 2.3.0 + */ + +/** + * Redirects incoming links to the proper URL based on the site url. + * + * Search engines consider www.somedomain.com and somedomain.com to be two + * different URLs when they both go to the same location. This SEO enhancement + * prevents penalty for duplicate content by redirecting all incoming links to + * one or the other. + * + * Prevents redirection for feeds, trackbacks, searches, and + * admin URLs. Does not redirect on non-pretty-permalink-supporting IIS 7+, + * page/post previews, WP admin, Trackbacks, robots.txt, favicon.ico, searches, + * or on POST requests. + * + * Will also attempt to find the correct link when a user enters a URL that does + * not exist based on exact WordPress query. Will instead try to parse the URL + * or query in an attempt to figure the correct page to go to. + * + * @since 2.3.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * @global bool $is_IIS + * @global WP_Query $wp_query WordPress Query object. + * @global wpdb $wpdb WordPress database abstraction object. + * @global WP $wp Current WordPress environment instance. + * + * @param string $requested_url Optional. The URL that was requested, used to + * figure if redirect is needed. + * @param bool $do_redirect Optional. Redirect to the new URL. + * @return string|void The string of the URL, if redirect needed. + */ +function redirect_canonical( $requested_url = null, $do_redirect = true ) { + global $wp_rewrite, $is_IIS, $wp_query, $wpdb, $wp; + + if ( isset( $_SERVER['REQUEST_METHOD'] ) && ! in_array( strtoupper( $_SERVER['REQUEST_METHOD'] ), array( 'GET', 'HEAD' ) ) ) { + return; + } + + // If we're not in wp-admin and the post has been published and preview nonce + // is non-existent or invalid then no need for preview in query. + if ( is_preview() && get_query_var( 'p' ) && 'publish' == get_post_status( get_query_var( 'p' ) ) ) { + if ( ! isset( $_GET['preview_id'] ) + || ! isset( $_GET['preview_nonce'] ) + || ! wp_verify_nonce( $_GET['preview_nonce'], 'post_preview_' . (int) $_GET['preview_id'] ) ) { + $wp_query->is_preview = false; + } + } + + if ( is_trackback() || is_search() || is_admin() || is_preview() || is_robots() || is_favicon() || ( $is_IIS && ! iis7_supports_permalinks() ) ) { + return; + } + + if ( ! $requested_url && isset( $_SERVER['HTTP_HOST'] ) ) { + // Build the URL in the address bar. + $requested_url = is_ssl() ? 'https://' : 'http://'; + $requested_url .= $_SERVER['HTTP_HOST']; + $requested_url .= $_SERVER['REQUEST_URI']; + } + + $original = @parse_url( $requested_url ); + if ( false === $original ) { + return; + } + + $redirect = $original; + $redirect_url = false; + + // Notice fixing. + if ( ! isset( $redirect['path'] ) ) { + $redirect['path'] = ''; + } + if ( ! isset( $redirect['query'] ) ) { + $redirect['query'] = ''; + } + + /* + * If the original URL ended with non-breaking spaces, they were almost + * certainly inserted by accident. Let's remove them, so the reader doesn't + * see a 404 error with no obvious cause. + */ + $redirect['path'] = preg_replace( '|(%C2%A0)+$|i', '', $redirect['path'] ); + + // It's not a preview, so remove it from URL. + if ( get_query_var( 'preview' ) ) { + $redirect['query'] = remove_query_arg( 'preview', $redirect['query'] ); + } + + $id = get_query_var( 'p' ); + + if ( is_feed() && $id ) { + $redirect_url = get_post_comments_feed_link( $id, get_query_var( 'feed' ) ); + if ( $redirect_url ) { + $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type', 'feed' ), $redirect_url ); + $redirect['path'] = parse_url( $redirect_url, PHP_URL_PATH ); + } + } + + if ( is_singular() && 1 > $wp_query->post_count && $id ) { + + $vars = $wpdb->get_results( $wpdb->prepare( "SELECT post_type, post_parent FROM $wpdb->posts WHERE ID = %d", $id ) ); + + if ( ! empty( $vars[0] ) ) { + $vars = $vars[0]; + if ( 'revision' == $vars->post_type && $vars->post_parent > 0 ) { + $id = $vars->post_parent; + } + + $redirect_url = get_permalink( $id ); + if ( $redirect_url ) { + $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); + } + } + } + + // These tests give us a WP-generated permalink. + if ( is_404() ) { + + // Redirect ?page_id, ?p=, ?attachment_id= to their respective URLs. + $id = max( get_query_var( 'p' ), get_query_var( 'page_id' ), get_query_var( 'attachment_id' ) ); + $redirect_post = $id ? get_post( $id ) : false; + if ( $redirect_post ) { + $post_type_obj = get_post_type_object( $redirect_post->post_type ); + if ( $post_type_obj->public && 'auto-draft' != $redirect_post->post_status ) { + $redirect_url = get_permalink( $redirect_post ); + $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); + } + } + + if ( get_query_var( 'day' ) && get_query_var( 'monthnum' ) && get_query_var( 'year' ) ) { + $year = get_query_var( 'year' ); + $month = get_query_var( 'monthnum' ); + $day = get_query_var( 'day' ); + $date = sprintf( '%04d-%02d-%02d', $year, $month, $day ); + if ( ! wp_checkdate( $month, $day, $year, $date ) ) { + $redirect_url = get_month_link( $year, $month ); + $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum', 'day' ), $redirect_url ); + } + } elseif ( get_query_var( 'monthnum' ) && get_query_var( 'year' ) && 12 < get_query_var( 'monthnum' ) ) { + $redirect_url = get_year_link( get_query_var( 'year' ) ); + $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum' ), $redirect_url ); + } + + if ( ! $redirect_url ) { + $redirect_url = redirect_guess_404_permalink(); + if ( $redirect_url ) { + $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'page', 'feed', 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); + } + } + + if ( get_query_var( 'page' ) && $wp_query->post && + false !== strpos( $wp_query->post->post_content, '<!--nextpage-->' ) ) { + $redirect['path'] = rtrim( $redirect['path'], (int) get_query_var( 'page' ) . '/' ); + $redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); + $redirect_url = get_permalink( $wp_query->post->ID ); + } + } elseif ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) { + // Rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101. + if ( is_attachment() && + ! array_diff( array_keys( $wp->query_vars ), array( 'attachment', 'attachment_id' ) ) && + ! $redirect_url ) { + if ( ! empty( $_GET['attachment_id'] ) ) { + $redirect_url = get_attachment_link( get_query_var( 'attachment_id' ) ); + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( 'attachment_id', $redirect['query'] ); + } + } else { + $redirect_url = get_attachment_link(); + } + } elseif ( is_single() && ! empty( $_GET['p'] ) && ! $redirect_url ) { + $redirect_url = get_permalink( get_query_var( 'p' ) ); + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( array( 'p', 'post_type' ), $redirect['query'] ); + } + } elseif ( is_single() && ! empty( $_GET['name'] ) && ! $redirect_url ) { + $redirect_url = get_permalink( $wp_query->get_queried_object_id() ); + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( 'name', $redirect['query'] ); + } + } elseif ( is_page() && ! empty( $_GET['page_id'] ) && ! $redirect_url ) { + $redirect_url = get_permalink( get_query_var( 'page_id' ) ); + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); + } + } elseif ( is_page() && ! is_feed() && 'page' == get_option( 'show_on_front' ) && get_queried_object_id() == get_option( 'page_on_front' ) && ! $redirect_url ) { + $redirect_url = home_url( '/' ); + } elseif ( is_home() && ! empty( $_GET['page_id'] ) && 'page' == get_option( 'show_on_front' ) && get_query_var( 'page_id' ) == get_option( 'page_for_posts' ) && ! $redirect_url ) { + $redirect_url = get_permalink( get_option( 'page_for_posts' ) ); + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); + } + } elseif ( ! empty( $_GET['m'] ) && ( is_year() || is_month() || is_day() ) ) { + $m = get_query_var( 'm' ); + switch ( strlen( $m ) ) { + case 4: // Yearly. + $redirect_url = get_year_link( $m ); + break; + case 6: // Monthly. + $redirect_url = get_month_link( substr( $m, 0, 4 ), substr( $m, 4, 2 ) ); + break; + case 8: // Daily. + $redirect_url = get_day_link( substr( $m, 0, 4 ), substr( $m, 4, 2 ), substr( $m, 6, 2 ) ); + break; + } + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( 'm', $redirect['query'] ); + } + // Now moving on to non ?m=X year/month/day links. + } elseif ( is_day() && get_query_var( 'year' ) && get_query_var( 'monthnum' ) && ! empty( $_GET['day'] ) ) { + $redirect_url = get_day_link( get_query_var( 'year' ), get_query_var( 'monthnum' ), get_query_var( 'day' ) ); + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( array( 'year', 'monthnum', 'day' ), $redirect['query'] ); + } + } elseif ( is_month() && get_query_var( 'year' ) && ! empty( $_GET['monthnum'] ) ) { + $redirect_url = get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum' ) ); + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( array( 'year', 'monthnum' ), $redirect['query'] ); + } + } elseif ( is_year() && ! empty( $_GET['year'] ) ) { + $redirect_url = get_year_link( get_query_var( 'year' ) ); + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( 'year', $redirect['query'] ); + } + } elseif ( is_author() && ! empty( $_GET['author'] ) && preg_match( '|^[0-9]+$|', $_GET['author'] ) ) { + $author = get_userdata( get_query_var( 'author' ) ); + if ( ( false !== $author ) && $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_author = %d AND $wpdb->posts.post_status = 'publish' LIMIT 1", $author->ID ) ) ) { + $redirect_url = get_author_posts_url( $author->ID, $author->user_nicename ); + if ( $redirect_url ) { + $redirect['query'] = remove_query_arg( 'author', $redirect['query'] ); + } + } + } elseif ( is_category() || is_tag() || is_tax() ) { // Terms (tags/categories). + + $term_count = 0; + foreach ( $wp_query->tax_query->queried_terms as $tax_query ) { + $term_count += count( $tax_query['terms'] ); + } + + $obj = $wp_query->get_queried_object(); + if ( $term_count <= 1 && ! empty( $obj->term_id ) ) { + $tax_url = get_term_link( (int) $obj->term_id, $obj->taxonomy ); + if ( $tax_url && ! is_wp_error( $tax_url ) ) { + if ( ! empty( $redirect['query'] ) ) { + // Strip taxonomy query vars off the URL. + $qv_remove = array( 'term', 'taxonomy' ); + if ( is_category() ) { + $qv_remove[] = 'category_name'; + $qv_remove[] = 'cat'; + } elseif ( is_tag() ) { + $qv_remove[] = 'tag'; + $qv_remove[] = 'tag_id'; + } else { + // Custom taxonomies will have a custom query var, remove those too. + $tax_obj = get_taxonomy( $obj->taxonomy ); + if ( false !== $tax_obj->query_var ) { + $qv_remove[] = $tax_obj->query_var; + } + } + + $rewrite_vars = array_diff( array_keys( $wp_query->query ), array_keys( $_GET ) ); + + // Check to see if all the query vars are coming from the rewrite, none are set via $_GET. + if ( ! array_diff( $rewrite_vars, array_keys( $_GET ) ) ) { + // Remove all of the per-tax query vars. + $redirect['query'] = remove_query_arg( $qv_remove, $redirect['query'] ); + + // Create the destination URL for this taxonomy. + $tax_url = parse_url( $tax_url ); + if ( ! empty( $tax_url['query'] ) ) { + // Taxonomy accessible via ?taxonomy=...&term=... or any custom query var. + parse_str( $tax_url['query'], $query_vars ); + $redirect['query'] = add_query_arg( $query_vars, $redirect['query'] ); + } else { + // Taxonomy is accessible via a "pretty URL". + $redirect['path'] = $tax_url['path']; + } + } else { + // Some query vars are set via $_GET. Unset those from $_GET that exist via the rewrite. + foreach ( $qv_remove as $_qv ) { + if ( isset( $rewrite_vars[ $_qv ] ) ) { + $redirect['query'] = remove_query_arg( $_qv, $redirect['query'] ); + } + } + } + } + } + } + } elseif ( is_single() && strpos( $wp_rewrite->permalink_structure, '%category%' ) !== false ) { + $cat = get_query_var( 'category_name' ); + if ( $cat ) { + $category = get_category_by_path( $cat ); + if ( ( ! $category || is_wp_error( $category ) ) || ! has_term( $category->term_id, 'category', $wp_query->get_queried_object_id() ) ) { + $redirect_url = get_permalink( $wp_query->get_queried_object_id() ); + } + } + } + + // Post paging. + if ( is_singular() && get_query_var( 'page' ) ) { + if ( ! $redirect_url ) { + $redirect_url = get_permalink( get_queried_object_id() ); + } + + $page = get_query_var( 'page' ); + if ( $page > 1 ) { + if ( is_front_page() ) { + $redirect_url = trailingslashit( $redirect_url ) . user_trailingslashit( "$wp_rewrite->pagination_base/$page", 'paged' ); + } else { + $redirect_url = trailingslashit( $redirect_url ) . user_trailingslashit( $page, 'single_paged' ); + } + } + $redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); + } + + // Paging and feeds. + if ( get_query_var( 'paged' ) || is_feed() || get_query_var( 'cpage' ) ) { + while ( preg_match( "#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#", $redirect['path'] ) || preg_match( '#/(comments/?)?(feed|rss|rdf|atom|rss2)(/+)?$#', $redirect['path'] ) || preg_match( "#/{$wp_rewrite->comments_pagination_base}-[0-9]+(/+)?$#", $redirect['path'] ) ) { + // Strip off paging and feed. + $redirect['path'] = preg_replace( "#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#", '/', $redirect['path'] ); // Strip off any existing paging. + $redirect['path'] = preg_replace( '#/(comments/?)?(feed|rss2?|rdf|atom)(/+|$)#', '/', $redirect['path'] ); // Strip off feed endings. + $redirect['path'] = preg_replace( "#/{$wp_rewrite->comments_pagination_base}-[0-9]+?(/+)?$#", '/', $redirect['path'] ); // Strip off any existing comment paging. + } + + $addl_path = ''; + if ( is_feed() && in_array( get_query_var( 'feed' ), $wp_rewrite->feeds ) ) { + $addl_path = ! empty( $addl_path ) ? trailingslashit( $addl_path ) : ''; + if ( ! is_singular() && get_query_var( 'withcomments' ) ) { + $addl_path .= 'comments/'; + } + if ( ( 'rss' == get_default_feed() && 'feed' == get_query_var( 'feed' ) ) || 'rss' == get_query_var( 'feed' ) ) { + $addl_path .= user_trailingslashit( 'feed/' . ( ( get_default_feed() == 'rss2' ) ? '' : 'rss2' ), 'feed' ); + } else { + $addl_path .= user_trailingslashit( 'feed/' . ( ( get_default_feed() == get_query_var( 'feed' ) || 'feed' == get_query_var( 'feed' ) ) ? '' : get_query_var( 'feed' ) ), 'feed' ); + } + $redirect['query'] = remove_query_arg( 'feed', $redirect['query'] ); + } elseif ( is_feed() && 'old' == get_query_var( 'feed' ) ) { + $old_feed_files = array( + 'wp-atom.php' => 'atom', + 'wp-commentsrss2.php' => 'comments_rss2', + 'wp-feed.php' => get_default_feed(), + 'wp-rdf.php' => 'rdf', + 'wp-rss.php' => 'rss2', + 'wp-rss2.php' => 'rss2', + ); + if ( isset( $old_feed_files[ basename( $redirect['path'] ) ] ) ) { + $redirect_url = get_feed_link( $old_feed_files[ basename( $redirect['path'] ) ] ); + wp_redirect( $redirect_url, 301 ); + die(); + } + } + + if ( get_query_var( 'paged' ) > 0 ) { + $paged = get_query_var( 'paged' ); + $redirect['query'] = remove_query_arg( 'paged', $redirect['query'] ); + if ( ! is_feed() ) { + if ( $paged > 1 && ! is_single() ) { + $addl_path = ( ! empty( $addl_path ) ? trailingslashit( $addl_path ) : '' ) . user_trailingslashit( "$wp_rewrite->pagination_base/$paged", 'paged' ); + } elseif ( ! is_single() ) { + $addl_path = ! empty( $addl_path ) ? trailingslashit( $addl_path ) : ''; + } + } elseif ( $paged > 1 ) { + $redirect['query'] = add_query_arg( 'paged', $paged, $redirect['query'] ); + } + } + + if ( get_option( 'page_comments' ) && ( + ( 'newest' == get_option( 'default_comments_page' ) && get_query_var( 'cpage' ) > 0 ) || + ( 'newest' != get_option( 'default_comments_page' ) && get_query_var( 'cpage' ) > 1 ) + ) ) { + $addl_path = ( ! empty( $addl_path ) ? trailingslashit( $addl_path ) : '' ) . user_trailingslashit( $wp_rewrite->comments_pagination_base . '-' . get_query_var( 'cpage' ), 'commentpaged' ); + $redirect['query'] = remove_query_arg( 'cpage', $redirect['query'] ); + } + + $redirect['path'] = user_trailingslashit( preg_replace( '|/' . preg_quote( $wp_rewrite->index, '|' ) . '/?$|', '/', $redirect['path'] ) ); // Strip off trailing /index.php/. + if ( ! empty( $addl_path ) && $wp_rewrite->using_index_permalinks() && strpos( $redirect['path'], '/' . $wp_rewrite->index . '/' ) === false ) { + $redirect['path'] = trailingslashit( $redirect['path'] ) . $wp_rewrite->index . '/'; + } + if ( ! empty( $addl_path ) ) { + $redirect['path'] = trailingslashit( $redirect['path'] ) . $addl_path; + } + $redirect_url = $redirect['scheme'] . '://' . $redirect['host'] . $redirect['path']; + } + + if ( 'wp-register.php' == basename( $redirect['path'] ) ) { + if ( is_multisite() ) { + /** This filter is documented in wp-login.php */ + $redirect_url = apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ); + } else { + $redirect_url = wp_registration_url(); + } + + wp_redirect( $redirect_url, 301 ); + die(); + } + } + + // Tack on any additional query vars. + $redirect['query'] = preg_replace( '#^\??&*?#', '', $redirect['query'] ); + if ( $redirect_url && ! empty( $redirect['query'] ) ) { + parse_str( $redirect['query'], $_parsed_query ); + $redirect = @parse_url( $redirect_url ); + + if ( ! empty( $_parsed_query['name'] ) && ! empty( $redirect['query'] ) ) { + parse_str( $redirect['query'], $_parsed_redirect_query ); + + if ( empty( $_parsed_redirect_query['name'] ) ) { + unset( $_parsed_query['name'] ); + } + } + + $_parsed_query = array_combine( + rawurlencode_deep( array_keys( $_parsed_query ) ), + rawurlencode_deep( array_values( $_parsed_query ) ) + ); + $redirect_url = add_query_arg( $_parsed_query, $redirect_url ); + } + + if ( $redirect_url ) { + $redirect = @parse_url( $redirect_url ); + } + + // www.example.com vs. example.com + $user_home = @parse_url( home_url() ); + if ( ! empty( $user_home['host'] ) ) { + $redirect['host'] = $user_home['host']; + } + if ( empty( $user_home['path'] ) ) { + $user_home['path'] = '/'; + } + + // Handle ports. + if ( ! empty( $user_home['port'] ) ) { + $redirect['port'] = $user_home['port']; + } else { + unset( $redirect['port'] ); + } + + // Trailing /index.php. + $redirect['path'] = preg_replace( '|/' . preg_quote( $wp_rewrite->index, '|' ) . '/*?$|', '/', $redirect['path'] ); + + $punctuation_pattern = implode( + '|', + array_map( + 'preg_quote', + array( + ' ', + '%20', // Space. + '!', + '%21', // Exclamation mark. + '"', + '%22', // Double quote. + "'", + '%27', // Single quote. + '(', + '%28', // Opening bracket. + ')', + '%29', // Closing bracket. + ',', + '%2C', // Comma. + '.', + '%2E', // Period. + ';', + '%3B', // Semicolon. + '{', + '%7B', // Opening curly bracket. + '}', + '%7D', // Closing curly bracket. + '%E2%80%9C', // Opening curly quote. + '%E2%80%9D', // Closing curly quote. + ) + ) + ); + + // Remove trailing spaces and end punctuation from the path. + $redirect['path'] = preg_replace( "#($punctuation_pattern)+$#", '', $redirect['path'] ); + + if ( ! empty( $redirect['query'] ) ) { + // Remove trailing spaces and end punctuation from certain terminating query string args. + $redirect['query'] = preg_replace( "#((^|&)(p|page_id|cat|tag)=[^&]*?)($punctuation_pattern)+$#", '$1', $redirect['query'] ); + + // Clean up empty query strings. + $redirect['query'] = trim( preg_replace( '#(^|&)(p|page_id|cat|tag)=?(&|$)#', '&', $redirect['query'] ), '&' ); + + // Redirect obsolete feeds. + $redirect['query'] = preg_replace( '#(^|&)feed=rss(&|$)#', '$1feed=rss2$2', $redirect['query'] ); + + // Remove redundant leading ampersands. + $redirect['query'] = preg_replace( '#^\??&*?#', '', $redirect['query'] ); + } + + // Strip /index.php/ when we're not using PATHINFO permalinks. + if ( ! $wp_rewrite->using_index_permalinks() ) { + $redirect['path'] = str_replace( '/' . $wp_rewrite->index . '/', '/', $redirect['path'] ); + } + + // Trailing slashes. + if ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() && ! is_404() && ( ! is_front_page() || ( is_front_page() && ( get_query_var( 'paged' ) > 1 ) ) ) ) { + $user_ts_type = ''; + if ( get_query_var( 'paged' ) > 0 ) { + $user_ts_type = 'paged'; + } else { + foreach ( array( 'single', 'category', 'page', 'day', 'month', 'year', 'home' ) as $type ) { + $func = 'is_' . $type; + if ( call_user_func( $func ) ) { + $user_ts_type = $type; + break; + } + } + } + $redirect['path'] = user_trailingslashit( $redirect['path'], $user_ts_type ); + } elseif ( is_front_page() ) { + $redirect['path'] = trailingslashit( $redirect['path'] ); + } + + // Strip multiple slashes out of the URL. + if ( strpos( $redirect['path'], '//' ) > -1 ) { + $redirect['path'] = preg_replace( '|/+|', '/', $redirect['path'] ); + } + + // Always trailing slash the Front Page URL. + if ( trailingslashit( $redirect['path'] ) == trailingslashit( $user_home['path'] ) ) { + $redirect['path'] = trailingslashit( $redirect['path'] ); + } + + // Ignore differences in host capitalization, as this can lead to infinite redirects. + // Only redirect no-www <=> yes-www. + if ( strtolower( $original['host'] ) == strtolower( $redirect['host'] ) || + ( strtolower( $original['host'] ) != 'www.' . strtolower( $redirect['host'] ) && 'www.' . strtolower( $original['host'] ) != strtolower( $redirect['host'] ) ) ) { + $redirect['host'] = $original['host']; + } + + $compare_original = array( $original['host'], $original['path'] ); + + if ( ! empty( $original['port'] ) ) { + $compare_original[] = $original['port']; + } + + if ( ! empty( $original['query'] ) ) { + $compare_original[] = $original['query']; + } + + $compare_redirect = array( $redirect['host'], $redirect['path'] ); + + if ( ! empty( $redirect['port'] ) ) { + $compare_redirect[] = $redirect['port']; + } + + if ( ! empty( $redirect['query'] ) ) { + $compare_redirect[] = $redirect['query']; + } + + if ( $compare_original !== $compare_redirect ) { + $redirect_url = $redirect['scheme'] . '://' . $redirect['host']; + if ( ! empty( $redirect['port'] ) ) { + $redirect_url .= ':' . $redirect['port']; + } + $redirect_url .= $redirect['path']; + if ( ! empty( $redirect['query'] ) ) { + $redirect_url .= '?' . $redirect['query']; + } + } + + if ( ! $redirect_url || $redirect_url == $requested_url ) { + return; + } + + // Hex encoded octets are case-insensitive. + if ( false !== strpos( $requested_url, '%' ) ) { + if ( ! function_exists( 'lowercase_octets' ) ) { + /** + * Converts the first hex-encoded octet match to lowercase. + * + * @since 3.1.0 + * @ignore + * + * @param array $matches Hex-encoded octet matches for the requested URL. + * @return string Lowercased version of the first match. + */ + function lowercase_octets( $matches ) { + return strtolower( $matches[0] ); + } + } + $requested_url = preg_replace_callback( '|%[a-fA-F0-9][a-fA-F0-9]|', 'lowercase_octets', $requested_url ); + } + + /** + * Filters the canonical redirect URL. + * + * Returning false to this filter will cancel the redirect. + * + * @since 2.3.0 + * + * @param string $redirect_url The redirect URL. + * @param string $requested_url The requested URL. + */ + $redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url ); + + // Yes, again -- in case the filter aborted the request. + if ( ! $redirect_url || strip_fragment_from_url( $redirect_url ) == strip_fragment_from_url( $requested_url ) ) { + return; + } + + if ( $do_redirect ) { + // Protect against chained redirects. + if ( ! redirect_canonical( $redirect_url, false ) ) { + wp_redirect( $redirect_url, 301 ); + exit(); + } else { + // Debug. + // die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) ); + return; + } + } else { + return $redirect_url; + } +} + +/** + * Removes arguments from a query string if they are not present in a URL + * DO NOT use this in plugin code. + * + * @since 3.4.0 + * @access private + * + * @param string $query_string + * @param array $args_to_check + * @param string $url + * @return string The altered query string + */ +function _remove_qs_args_if_not_in_url( $query_string, array $args_to_check, $url ) { + $parsed_url = @parse_url( $url ); + if ( ! empty( $parsed_url['query'] ) ) { + parse_str( $parsed_url['query'], $parsed_query ); + foreach ( $args_to_check as $qv ) { + if ( ! isset( $parsed_query[ $qv ] ) ) { + $query_string = remove_query_arg( $qv, $query_string ); + } + } + } else { + $query_string = remove_query_arg( $args_to_check, $query_string ); + } + return $query_string; +} + +/** + * Strips the #fragment from a URL, if one is present. + * + * @since 4.4.0 + * + * @param string $url The URL to strip. + * @return string The altered URL. + */ +function strip_fragment_from_url( $url ) { + $parsed_url = @parse_url( $url ); + if ( ! empty( $parsed_url['host'] ) ) { + // This mirrors code in redirect_canonical(). It does not handle every case. + $url = $parsed_url['scheme'] . '://' . $parsed_url['host']; + if ( ! empty( $parsed_url['port'] ) ) { + $url .= ':' . $parsed_url['port']; + } + + if ( ! empty( $parsed_url['path'] ) ) { + $url .= $parsed_url['path']; + } + + if ( ! empty( $parsed_url['query'] ) ) { + $url .= '?' . $parsed_url['query']; + } + } + + return $url; +} + +/** + * Attempts to guess the correct URL based on query vars + * + * @since 2.3.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return string|false The correct URL if one is found. False on failure. + */ +function redirect_guess_404_permalink() { + global $wpdb; + + if ( get_query_var( 'name' ) ) { + $where = $wpdb->prepare( 'post_name LIKE %s', $wpdb->esc_like( get_query_var( 'name' ) ) . '%' ); + + // If any of post_type, year, monthnum, or day are set, use them to refine the query. + if ( get_query_var( 'post_type' ) ) { + $where .= $wpdb->prepare( ' AND post_type = %s', get_query_var( 'post_type' ) ); + } else { + $where .= " AND post_type IN ('" . implode( "', '", get_post_types( array( 'public' => true ) ) ) . "')"; + } + + if ( get_query_var( 'year' ) ) { + $where .= $wpdb->prepare( ' AND YEAR(post_date) = %d', get_query_var( 'year' ) ); + } + if ( get_query_var( 'monthnum' ) ) { + $where .= $wpdb->prepare( ' AND MONTH(post_date) = %d', get_query_var( 'monthnum' ) ); + } + if ( get_query_var( 'day' ) ) { + $where .= $wpdb->prepare( ' AND DAYOFMONTH(post_date) = %d', get_query_var( 'day' ) ); + } + + $post_id = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'" ); + if ( ! $post_id ) { + return false; + } + if ( get_query_var( 'feed' ) ) { + return get_post_comments_feed_link( $post_id, get_query_var( 'feed' ) ); + } elseif ( get_query_var( 'page' ) && 1 < get_query_var( 'page' ) ) { + return trailingslashit( get_permalink( $post_id ) ) . user_trailingslashit( get_query_var( 'page' ), 'single_paged' ); + } else { + return get_permalink( $post_id ); + } + } + + return false; +} + +/** + * Redirects a variety of shorthand URLs to the admin. + * + * If a user visits example.com/admin, they'll be redirected to /wp-admin. + * Visiting /login redirects to /wp-login.php, and so on. + * + * @since 3.4.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + */ +function wp_redirect_admin_locations() { + global $wp_rewrite; + if ( ! ( is_404() && $wp_rewrite->using_permalinks() ) ) { + return; + } + + $admins = array( + home_url( 'wp-admin', 'relative' ), + home_url( 'dashboard', 'relative' ), + home_url( 'admin', 'relative' ), + site_url( 'dashboard', 'relative' ), + site_url( 'admin', 'relative' ), + ); + if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $admins ) ) { + wp_redirect( admin_url() ); + exit; + } + + $logins = array( + home_url( 'wp-login.php', 'relative' ), + home_url( 'login', 'relative' ), + site_url( 'login', 'relative' ), + ); + if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $logins ) ) { + wp_redirect( wp_login_url() ); + exit; + } +} diff --git a/wp-includes/capabilities.php b/wp-includes/capabilities.php new file mode 100644 index 0000000..f48cb58 --- /dev/null +++ b/wp-includes/capabilities.php @@ -0,0 +1,1069 @@ +<?php +/** + * Core User Role & Capabilities API + * + * @package WordPress + * @subpackage Users + */ + +/** + * Maps meta capabilities to primitive capabilities. + * + * This function also accepts an ID of an object to map against if the capability is a meta capability. Meta + * capabilities such as `edit_post` and `edit_user` are capabilities used by this function to map to primitive + * capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. + * + * Example usage: + * + * map_meta_cap( 'edit_posts', $user->ID ); + * map_meta_cap( 'edit_post', $user->ID, $post->ID ); + * map_meta_cap( 'edit_post_meta', $user->ID, $post->ID, $meta_key ); + * + * This does not actually compare whether the user ID has the actual capability, + * just what the capability or capabilities are. Meta capability list value can + * be 'delete_user', 'edit_user', 'remove_user', 'promote_user', 'delete_post', + * 'delete_page', 'edit_post', 'edit_page', 'read_post', or 'read_page'. + * + * @since 2.0.0 + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @global array $post_type_meta_caps Used to get post type meta capabilities. + * + * @param string $cap Capability name. + * @param int $user_id User ID. + * @param mixed ...$args Optional further parameters, typically starting with an object ID. + * @return string[] Actual capabilities for meta capability. + */ +function map_meta_cap( $cap, $user_id, ...$args ) { + $caps = array(); + + switch ( $cap ) { + case 'remove_user': + // In multisite the user must be a super admin to remove themselves. + if ( isset( $args[0] ) && $user_id == $args[0] && ! is_super_admin( $user_id ) ) { + $caps[] = 'do_not_allow'; + } else { + $caps[] = 'remove_users'; + } + break; + case 'promote_user': + case 'add_users': + $caps[] = 'promote_users'; + break; + case 'edit_user': + case 'edit_users': + // Allow user to edit themselves. + if ( 'edit_user' == $cap && isset( $args[0] ) && $user_id == $args[0] ) { + break; + } + + // In multisite the user must have manage_network_users caps. If editing a super admin, the user must be a super admin. + if ( is_multisite() && ( ( ! is_super_admin( $user_id ) && 'edit_user' === $cap && is_super_admin( $args[0] ) ) || ! user_can( $user_id, 'manage_network_users' ) ) ) { + $caps[] = 'do_not_allow'; + } else { + $caps[] = 'edit_users'; // edit_user maps to edit_users. + } + break; + case 'delete_post': + case 'delete_page': + $post = get_post( $args[0] ); + if ( ! $post ) { + $caps[] = 'do_not_allow'; + break; + } + + if ( 'revision' == $post->post_type ) { + $caps[] = 'do_not_allow'; + break; + } + + if ( ( get_option( 'page_for_posts' ) == $post->ID ) || ( get_option( 'page_on_front' ) == $post->ID ) ) { + $caps[] = 'manage_options'; + break; + } + + $post_type = get_post_type_object( $post->post_type ); + if ( ! $post_type ) { + /* translators: 1: Post type, 2: Capability name. */ + _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); + $caps[] = 'edit_others_posts'; + break; + } + + if ( ! $post_type->map_meta_cap ) { + $caps[] = $post_type->cap->$cap; + // Prior to 3.1 we would re-call map_meta_cap here. + if ( 'delete_post' == $cap ) { + $cap = $post_type->cap->$cap; + } + break; + } + + // If the post author is set and the user is the author... + if ( $post->post_author && $user_id == $post->post_author ) { + // If the post is published or scheduled... + if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { + $caps[] = $post_type->cap->delete_published_posts; + } elseif ( 'trash' == $post->post_status ) { + $status = get_post_meta( $post->ID, '_wp_trash_meta_status', true ); + if ( in_array( $status, array( 'publish', 'future' ), true ) ) { + $caps[] = $post_type->cap->delete_published_posts; + } else { + $caps[] = $post_type->cap->delete_posts; + } + } else { + // If the post is draft... + $caps[] = $post_type->cap->delete_posts; + } + } else { + // The user is trying to edit someone else's post. + $caps[] = $post_type->cap->delete_others_posts; + // The post is published or scheduled, extra cap required. + if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { + $caps[] = $post_type->cap->delete_published_posts; + } elseif ( 'private' == $post->post_status ) { + $caps[] = $post_type->cap->delete_private_posts; + } + } + + /* + * Setting the privacy policy page requires `manage_privacy_options`, + * so deleting it should require that too. + */ + if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) { + $caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) ); + } + + break; + // edit_post breaks down to edit_posts, edit_published_posts, or + // edit_others_posts. + case 'edit_post': + case 'edit_page': + $post = get_post( $args[0] ); + if ( ! $post ) { + $caps[] = 'do_not_allow'; + break; + } + + if ( 'revision' == $post->post_type ) { + $post = get_post( $post->post_parent ); + if ( ! $post ) { + $caps[] = 'do_not_allow'; + break; + } + } + + $post_type = get_post_type_object( $post->post_type ); + if ( ! $post_type ) { + /* translators: 1: Post type, 2: Capability name. */ + _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); + $caps[] = 'edit_others_posts'; + break; + } + + if ( ! $post_type->map_meta_cap ) { + $caps[] = $post_type->cap->$cap; + // Prior to 3.1 we would re-call map_meta_cap here. + if ( 'edit_post' == $cap ) { + $cap = $post_type->cap->$cap; + } + break; + } + + // If the post author is set and the user is the author... + if ( $post->post_author && $user_id == $post->post_author ) { + // If the post is published or scheduled... + if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { + $caps[] = $post_type->cap->edit_published_posts; + } elseif ( 'trash' == $post->post_status ) { + $status = get_post_meta( $post->ID, '_wp_trash_meta_status', true ); + if ( in_array( $status, array( 'publish', 'future' ), true ) ) { + $caps[] = $post_type->cap->edit_published_posts; + } else { + $caps[] = $post_type->cap->edit_posts; + } + } else { + // If the post is draft... + $caps[] = $post_type->cap->edit_posts; + } + } else { + // The user is trying to edit someone else's post. + $caps[] = $post_type->cap->edit_others_posts; + // The post is published or scheduled, extra cap required. + if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { + $caps[] = $post_type->cap->edit_published_posts; + } elseif ( 'private' == $post->post_status ) { + $caps[] = $post_type->cap->edit_private_posts; + } + } + + /* + * Setting the privacy policy page requires `manage_privacy_options`, + * so editing it should require that too. + */ + if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) { + $caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) ); + } + + break; + case 'read_post': + case 'read_page': + $post = get_post( $args[0] ); + if ( ! $post ) { + $caps[] = 'do_not_allow'; + break; + } + + if ( 'revision' == $post->post_type ) { + $post = get_post( $post->post_parent ); + if ( ! $post ) { + $caps[] = 'do_not_allow'; + break; + } + } + + $post_type = get_post_type_object( $post->post_type ); + if ( ! $post_type ) { + /* translators: 1: Post type, 2: Capability name. */ + _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); + $caps[] = 'edit_others_posts'; + break; + } + + if ( ! $post_type->map_meta_cap ) { + $caps[] = $post_type->cap->$cap; + // Prior to 3.1 we would re-call map_meta_cap here. + if ( 'read_post' == $cap ) { + $cap = $post_type->cap->$cap; + } + break; + } + + $status_obj = get_post_status_object( $post->post_status ); + if ( ! $status_obj ) { + /* translators: 1: Post status, 2: Capability name. */ + _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post status %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post with that status.' ), $post->post_status, $cap ), '5.4.0' ); + $caps[] = 'edit_others_posts'; + break; + } + + if ( $status_obj->public ) { + $caps[] = $post_type->cap->read; + break; + } + + if ( $post->post_author && $user_id == $post->post_author ) { + $caps[] = $post_type->cap->read; + } elseif ( $status_obj->private ) { + $caps[] = $post_type->cap->read_private_posts; + } else { + $caps = map_meta_cap( 'edit_post', $user_id, $post->ID ); + } + break; + case 'publish_post': + $post = get_post( $args[0] ); + if ( ! $post ) { + $caps[] = 'do_not_allow'; + break; + } + + $post_type = get_post_type_object( $post->post_type ); + if ( ! $post_type ) { + /* translators: 1: Post type, 2: Capability name. */ + _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); + $caps[] = 'edit_others_posts'; + break; + } + + $caps[] = $post_type->cap->publish_posts; + break; + case 'edit_post_meta': + case 'delete_post_meta': + case 'add_post_meta': + case 'edit_comment_meta': + case 'delete_comment_meta': + case 'add_comment_meta': + case 'edit_term_meta': + case 'delete_term_meta': + case 'add_term_meta': + case 'edit_user_meta': + case 'delete_user_meta': + case 'add_user_meta': + list( $_, $object_type, $_ ) = explode( '_', $cap ); + $object_id = (int) $args[0]; + + $object_subtype = get_object_subtype( $object_type, $object_id ); + + if ( empty( $object_subtype ) ) { + $caps[] = 'do_not_allow'; + break; + } + + $caps = map_meta_cap( "edit_{$object_type}", $user_id, $object_id ); + + $meta_key = isset( $args[1] ) ? $args[1] : false; + + if ( $meta_key ) { + $allowed = ! is_protected_meta( $meta_key, $object_type ); + + if ( ! empty( $object_subtype ) && has_filter( "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}" ) ) { + + /** + * Filters whether the user is allowed to edit a specific meta key of a specific object type and subtype. + * + * The dynamic portions of the hook name, `$object_type`, `$meta_key`, + * and `$object_subtype`, refer to the metadata object type (comment, post, term or user), + * the meta key value, and the object subtype respectively. + * + * @since 4.9.8 + * + * @param bool $allowed Whether the user can add the object meta. Default false. + * @param string $meta_key The meta key. + * @param int $object_id Object ID. + * @param int $user_id User ID. + * @param string $cap Capability name. + * @param string[] $caps Array of the user's capabilities. + */ + $allowed = apply_filters( "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}", $allowed, $meta_key, $object_id, $user_id, $cap, $caps ); + } else { + + /** + * Filters whether the user is allowed to edit a specific meta key of a specific object type. + * + * Return true to have the mapped meta caps from `edit_{$object_type}` apply. + * + * The dynamic portion of the hook name, `$object_type` refers to the object type being filtered. + * The dynamic portion of the hook name, `$meta_key`, refers to the meta key passed to map_meta_cap(). + * + * @since 3.3.0 As `auth_post_meta_{$meta_key}`. + * @since 4.6.0 + * + * @param bool $allowed Whether the user can add the object meta. Default false. + * @param string $meta_key The meta key. + * @param int $object_id Object ID. + * @param int $user_id User ID. + * @param string $cap Capability name. + * @param string[] $caps Array of the user's capabilities. + */ + $allowed = apply_filters( "auth_{$object_type}_meta_{$meta_key}", $allowed, $meta_key, $object_id, $user_id, $cap, $caps ); + } + + if ( ! empty( $object_subtype ) ) { + + /** + * Filters whether the user is allowed to edit meta for specific object types/subtypes. + * + * Return true to have the mapped meta caps from `edit_{$object_type}` apply. + * + * The dynamic portion of the hook name, `$object_type` refers to the object type being filtered. + * The dynamic portion of the hook name, `$object_subtype` refers to the object subtype being filtered. + * The dynamic portion of the hook name, `$meta_key`, refers to the meta key passed to map_meta_cap(). + * + * @since 4.6.0 As `auth_post_{$post_type}_meta_{$meta_key}`. + * @since 4.7.0 Renamed from `auth_post_{$post_type}_meta_{$meta_key}` to + * `auth_{$object_type}_{$object_subtype}_meta_{$meta_key}`. + * @deprecated 4.9.8 Use {@see 'auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}'} instead. + * + * @param bool $allowed Whether the user can add the object meta. Default false. + * @param string $meta_key The meta key. + * @param int $object_id Object ID. + * @param int $user_id User ID. + * @param string $cap Capability name. + * @param string[] $caps Array of the user's capabilities. + */ + $allowed = apply_filters_deprecated( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", array( $allowed, $meta_key, $object_id, $user_id, $cap, $caps ), '4.9.8', "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}" ); + } + + if ( ! $allowed ) { + $caps[] = $cap; + } + } + break; + case 'edit_comment': + $comment = get_comment( $args[0] ); + if ( ! $comment ) { + $caps[] = 'do_not_allow'; + break; + } + + $post = get_post( $comment->comment_post_ID ); + + /* + * If the post doesn't exist, we have an orphaned comment. + * Fall back to the edit_posts capability, instead. + */ + if ( $post ) { + $caps = map_meta_cap( 'edit_post', $user_id, $post->ID ); + } else { + $caps = map_meta_cap( 'edit_posts', $user_id ); + } + break; + case 'unfiltered_upload': + if ( defined( 'ALLOW_UNFILTERED_UPLOADS' ) && ALLOW_UNFILTERED_UPLOADS && ( ! is_multisite() || is_super_admin( $user_id ) ) ) { + $caps[] = $cap; + } else { + $caps[] = 'do_not_allow'; + } + break; + case 'edit_css': + case 'unfiltered_html': + // Disallow unfiltered_html for all users, even admins and super admins. + if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ) { + $caps[] = 'do_not_allow'; + } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { + $caps[] = 'do_not_allow'; + } else { + $caps[] = 'unfiltered_html'; + } + break; + case 'edit_files': + case 'edit_plugins': + case 'edit_themes': + // Disallow the file editors. + if ( defined( 'DISALLOW_FILE_EDIT' ) && DISALLOW_FILE_EDIT ) { + $caps[] = 'do_not_allow'; + } elseif ( ! wp_is_file_mod_allowed( 'capability_edit_themes' ) ) { + $caps[] = 'do_not_allow'; + } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { + $caps[] = 'do_not_allow'; + } else { + $caps[] = $cap; + } + break; + case 'update_plugins': + case 'delete_plugins': + case 'install_plugins': + case 'upload_plugins': + case 'update_themes': + case 'delete_themes': + case 'install_themes': + case 'upload_themes': + case 'update_core': + // Disallow anything that creates, deletes, or updates core, plugin, or theme files. + // Files in uploads are excepted. + if ( ! wp_is_file_mod_allowed( 'capability_update_core' ) ) { + $caps[] = 'do_not_allow'; + } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { + $caps[] = 'do_not_allow'; + } elseif ( 'upload_themes' === $cap ) { + $caps[] = 'install_themes'; + } elseif ( 'upload_plugins' === $cap ) { + $caps[] = 'install_plugins'; + } else { + $caps[] = $cap; + } + break; + case 'install_languages': + case 'update_languages': + if ( ! wp_is_file_mod_allowed( 'can_install_language_pack' ) ) { + $caps[] = 'do_not_allow'; + } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { + $caps[] = 'do_not_allow'; + } else { + $caps[] = 'install_languages'; + } + break; + case 'activate_plugins': + case 'deactivate_plugins': + case 'activate_plugin': + case 'deactivate_plugin': + $caps[] = 'activate_plugins'; + if ( is_multisite() ) { + // update_, install_, and delete_ are handled above with is_super_admin(). + $menu_perms = get_site_option( 'menu_items', array() ); + if ( empty( $menu_perms['plugins'] ) ) { + $caps[] = 'manage_network_plugins'; + } + } + break; + case 'resume_plugin': + $caps[] = 'resume_plugins'; + break; + case 'resume_theme': + $caps[] = 'resume_themes'; + break; + case 'delete_user': + case 'delete_users': + // If multisite only super admins can delete users. + if ( is_multisite() && ! is_super_admin( $user_id ) ) { + $caps[] = 'do_not_allow'; + } else { + $caps[] = 'delete_users'; // delete_user maps to delete_users. + } + break; + case 'create_users': + if ( ! is_multisite() ) { + $caps[] = $cap; + } elseif ( is_super_admin( $user_id ) || get_site_option( 'add_new_users' ) ) { + $caps[] = $cap; + } else { + $caps[] = 'do_not_allow'; + } + break; + case 'manage_links': + if ( get_option( 'link_manager_enabled' ) ) { + $caps[] = $cap; + } else { + $caps[] = 'do_not_allow'; + } + break; + case 'customize': + $caps[] = 'edit_theme_options'; + break; + case 'delete_site': + if ( is_multisite() ) { + $caps[] = 'manage_options'; + } else { + $caps[] = 'do_not_allow'; + } + break; + case 'edit_term': + case 'delete_term': + case 'assign_term': + $term_id = (int) $args[0]; + $term = get_term( $term_id ); + if ( ! $term || is_wp_error( $term ) ) { + $caps[] = 'do_not_allow'; + break; + } + + $tax = get_taxonomy( $term->taxonomy ); + if ( ! $tax ) { + $caps[] = 'do_not_allow'; + break; + } + + if ( 'delete_term' === $cap && ( get_option( 'default_' . $term->taxonomy ) == $term->term_id ) ) { + $caps[] = 'do_not_allow'; + break; + } + + $taxo_cap = $cap . 's'; + + $caps = map_meta_cap( $tax->cap->$taxo_cap, $user_id, $term_id ); + + break; + case 'manage_post_tags': + case 'edit_categories': + case 'edit_post_tags': + case 'delete_categories': + case 'delete_post_tags': + $caps[] = 'manage_categories'; + break; + case 'assign_categories': + case 'assign_post_tags': + $caps[] = 'edit_posts'; + break; + case 'create_sites': + case 'delete_sites': + case 'manage_network': + case 'manage_sites': + case 'manage_network_users': + case 'manage_network_plugins': + case 'manage_network_themes': + case 'manage_network_options': + case 'upgrade_network': + $caps[] = $cap; + break; + case 'setup_network': + if ( is_multisite() ) { + $caps[] = 'manage_network_options'; + } else { + $caps[] = 'manage_options'; + } + break; + case 'update_php': + if ( is_multisite() && ! is_super_admin( $user_id ) ) { + $caps[] = 'do_not_allow'; + } else { + $caps[] = 'update_core'; + } + break; + case 'export_others_personal_data': + case 'erase_others_personal_data': + case 'manage_privacy_options': + $caps[] = is_multisite() ? 'manage_network' : 'manage_options'; + break; + default: + // Handle meta capabilities for custom post types. + global $post_type_meta_caps; + if ( isset( $post_type_meta_caps[ $cap ] ) ) { + return map_meta_cap( $post_type_meta_caps[ $cap ], $user_id, ...$args ); + } + + // Block capabilities map to their post equivalent. + $block_caps = array( + 'edit_blocks', + 'edit_others_blocks', + 'publish_blocks', + 'read_private_blocks', + 'delete_blocks', + 'delete_private_blocks', + 'delete_published_blocks', + 'delete_others_blocks', + 'edit_private_blocks', + 'edit_published_blocks', + ); + if ( in_array( $cap, $block_caps, true ) ) { + $cap = str_replace( '_blocks', '_posts', $cap ); + } + + // If no meta caps match, return the original cap. + $caps[] = $cap; + } + + /** + * Filters a user's capabilities depending on specific context and/or privilege. + * + * @since 2.8.0 + * + * @param string[] $caps Array of the user's capabilities. + * @param string $cap Capability name. + * @param int $user_id The user ID. + * @param array $args Adds the context to the cap. Typically the object ID. + */ + return apply_filters( 'map_meta_cap', $caps, $cap, $user_id, $args ); +} + +/** + * Returns whether the current user has the specified capability. + * + * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta + * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to + * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. + * + * Example usage: + * + * current_user_can( 'edit_posts' ); + * current_user_can( 'edit_post', $post->ID ); + * current_user_can( 'edit_post_meta', $post->ID, $meta_key ); + * + * While checking against particular roles in place of a capability is supported + * in part, this practice is discouraged as it may produce unreliable results. + * + * Note: Will always return true if the current user is a super admin, unless specifically denied. + * + * @since 2.0.0 + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @see WP_User::has_cap() + * @see map_meta_cap() + * + * @param string $capability Capability name. + * @param mixed ...$args Optional further parameters, typically starting with an object ID. + * @return bool Whether the current user has the given capability. If `$capability` is a meta cap and `$object_id` is + * passed, whether the current user has the given meta capability for the given object. + */ +function current_user_can( $capability, ...$args ) { + $current_user = wp_get_current_user(); + + if ( empty( $current_user ) ) { + return false; + } + + return $current_user->has_cap( $capability, ...$args ); +} + +/** + * Returns whether the current user has the specified capability for a given site. + * + * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta + * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to + * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. + * + * Example usage: + * + * current_user_can_for_blog( $blog_id, 'edit_posts' ); + * current_user_can_for_blog( $blog_id, 'edit_post', $post->ID ); + * current_user_can_for_blog( $blog_id, 'edit_post_meta', $post->ID, $meta_key ); + * + * @since 3.0.0 + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @param int $blog_id Site ID. + * @param string $capability Capability name. + * @param mixed ...$args Optional further parameters, typically starting with an object ID. + * @return bool Whether the user has the given capability. + */ +function current_user_can_for_blog( $blog_id, $capability, ...$args ) { + $switched = is_multisite() ? switch_to_blog( $blog_id ) : false; + + $current_user = wp_get_current_user(); + + if ( empty( $current_user ) ) { + if ( $switched ) { + restore_current_blog(); + } + return false; + } + + $can = $current_user->has_cap( $capability, ...$args ); + + if ( $switched ) { + restore_current_blog(); + } + + return $can; +} + +/** + * Returns whether the author of the supplied post has the specified capability. + * + * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta + * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to + * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. + * + * Example usage: + * + * author_can( $post, 'edit_posts' ); + * author_can( $post, 'edit_post', $post->ID ); + * author_can( $post, 'edit_post_meta', $post->ID, $meta_key ); + * + * @since 2.9.0 + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @param int|WP_Post $post Post ID or post object. + * @param string $capability Capability name. + * @param mixed ...$args Optional further parameters, typically starting with an object ID. + * @return bool Whether the post author has the given capability. + */ +function author_can( $post, $capability, ...$args ) { + $post = get_post( $post ); + if ( ! $post ) { + return false; + } + + $author = get_userdata( $post->post_author ); + + if ( ! $author ) { + return false; + } + + return $author->has_cap( $capability, ...$args ); +} + +/** + * Returns whether a particular user has the specified capability. + * + * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta + * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to + * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. + * + * Example usage: + * + * user_can( $user->ID, 'edit_posts' ); + * user_can( $user->ID, 'edit_post', $post->ID ); + * user_can( $user->ID, 'edit_post_meta', $post->ID, $meta_key ); + * + * @since 3.1.0 + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @param int|WP_User $user User ID or object. + * @param string $capability Capability name. + * @param mixed ...$args Optional further parameters, typically starting with an object ID. + * @return bool Whether the user has the given capability. + */ +function user_can( $user, $capability, ...$args ) { + if ( ! is_object( $user ) ) { + $user = get_userdata( $user ); + } + + if ( ! $user || ! $user->exists() ) { + return false; + } + + return $user->has_cap( $capability, ...$args ); +} + +/** + * Retrieves the global WP_Roles instance and instantiates it if necessary. + * + * @since 4.3.0 + * + * @global WP_Roles $wp_roles WordPress role management object. + * + * @return WP_Roles WP_Roles global instance if not already instantiated. + */ +function wp_roles() { + global $wp_roles; + + if ( ! isset( $wp_roles ) ) { + $wp_roles = new WP_Roles(); + } + return $wp_roles; +} + +/** + * Retrieve role object. + * + * @since 2.0.0 + * + * @param string $role Role name. + * @return WP_Role|null WP_Role object if found, null if the role does not exist. + */ +function get_role( $role ) { + return wp_roles()->get_role( $role ); +} + +/** + * Add role, if it does not exist. + * + * @since 2.0.0 + * + * @param string $role Role name. + * @param string $display_name Display name for role. + * @param bool[] $capabilities List of capabilities keyed by the capability name, + * e.g. array( 'edit_posts' => true, 'delete_posts' => false ). + * @return WP_Role|null WP_Role object if role is added, null if already exists. + */ +function add_role( $role, $display_name, $capabilities = array() ) { + if ( empty( $role ) ) { + return; + } + return wp_roles()->add_role( $role, $display_name, $capabilities ); +} + +/** + * Remove role, if it exists. + * + * @since 2.0.0 + * + * @param string $role Role name. + */ +function remove_role( $role ) { + wp_roles()->remove_role( $role ); +} + +/** + * Retrieve a list of super admins. + * + * @since 3.0.0 + * + * @global array $super_admins + * + * @return string[] List of super admin logins. + */ +function get_super_admins() { + global $super_admins; + + if ( isset( $super_admins ) ) { + return $super_admins; + } else { + return get_site_option( 'site_admins', array( 'admin' ) ); + } +} + +/** + * Determine if user is a site admin. + * + * @since 3.0.0 + * + * @param int $user_id (Optional) The ID of a user. Defaults to the current user. + * @return bool True if the user is a site admin. + */ +function is_super_admin( $user_id = false ) { + if ( ! $user_id || get_current_user_id() == $user_id ) { + $user = wp_get_current_user(); + } else { + $user = get_userdata( $user_id ); + } + + if ( ! $user || ! $user->exists() ) { + return false; + } + + if ( is_multisite() ) { + $super_admins = get_super_admins(); + if ( is_array( $super_admins ) && in_array( $user->user_login, $super_admins ) ) { + return true; + } + } else { + if ( $user->has_cap( 'delete_users' ) ) { + return true; + } + } + + return false; +} + +/** + * Grants Super Admin privileges. + * + * @since 3.0.0 + * + * @global array $super_admins + * + * @param int $user_id ID of the user to be granted Super Admin privileges. + * @return bool True on success, false on failure. This can fail when the user is + * already a super admin or when the `$super_admins` global is defined. + */ +function grant_super_admin( $user_id ) { + // If global super_admins override is defined, there is nothing to do here. + if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) { + return false; + } + + /** + * Fires before the user is granted Super Admin privileges. + * + * @since 3.0.0 + * + * @param int $user_id ID of the user that is about to be granted Super Admin privileges. + */ + do_action( 'grant_super_admin', $user_id ); + + // Directly fetch site_admins instead of using get_super_admins(). + $super_admins = get_site_option( 'site_admins', array( 'admin' ) ); + + $user = get_userdata( $user_id ); + if ( $user && ! in_array( $user->user_login, $super_admins ) ) { + $super_admins[] = $user->user_login; + update_site_option( 'site_admins', $super_admins ); + + /** + * Fires after the user is granted Super Admin privileges. + * + * @since 3.0.0 + * + * @param int $user_id ID of the user that was granted Super Admin privileges. + */ + do_action( 'granted_super_admin', $user_id ); + return true; + } + return false; +} + +/** + * Revokes Super Admin privileges. + * + * @since 3.0.0 + * + * @global array $super_admins + * + * @param int $user_id ID of the user Super Admin privileges to be revoked from. + * @return bool True on success, false on failure. This can fail when the user's email + * is the network admin email or when the `$super_admins` global is defined. + */ +function revoke_super_admin( $user_id ) { + // If global super_admins override is defined, there is nothing to do here. + if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) { + return false; + } + + /** + * Fires before the user's Super Admin privileges are revoked. + * + * @since 3.0.0 + * + * @param int $user_id ID of the user Super Admin privileges are being revoked from. + */ + do_action( 'revoke_super_admin', $user_id ); + + // Directly fetch site_admins instead of using get_super_admins(). + $super_admins = get_site_option( 'site_admins', array( 'admin' ) ); + + $user = get_userdata( $user_id ); + if ( $user && 0 !== strcasecmp( $user->user_email, get_site_option( 'admin_email' ) ) ) { + $key = array_search( $user->user_login, $super_admins ); + if ( false !== $key ) { + unset( $super_admins[ $key ] ); + update_site_option( 'site_admins', $super_admins ); + + /** + * Fires after the user's Super Admin privileges are revoked. + * + * @since 3.0.0 + * + * @param int $user_id ID of the user Super Admin privileges were revoked from. + */ + do_action( 'revoked_super_admin', $user_id ); + return true; + } + } + return false; +} + +/** + * Filters the user capabilities to grant the 'install_languages' capability as necessary. + * + * A user must have at least one out of the 'update_core', 'install_plugins', and + * 'install_themes' capabilities to qualify for 'install_languages'. + * + * @since 4.9.0 + * + * @param bool[] $allcaps An array of all the user's capabilities. + * @return bool[] Filtered array of the user's capabilities. + */ +function wp_maybe_grant_install_languages_cap( $allcaps ) { + if ( ! empty( $allcaps['update_core'] ) || ! empty( $allcaps['install_plugins'] ) || ! empty( $allcaps['install_themes'] ) ) { + $allcaps['install_languages'] = true; + } + + return $allcaps; +} + +/** + * Filters the user capabilities to grant the 'resume_plugins' and 'resume_themes' capabilities as necessary. + * + * @since 5.2.0 + * + * @param bool[] $allcaps An array of all the user's capabilities. + * @return bool[] Filtered array of the user's capabilities. + */ +function wp_maybe_grant_resume_extensions_caps( $allcaps ) { + // Even in a multisite, regular administrators should be able to resume plugins. + if ( ! empty( $allcaps['activate_plugins'] ) ) { + $allcaps['resume_plugins'] = true; + } + + // Even in a multisite, regular administrators should be able to resume themes. + if ( ! empty( $allcaps['switch_themes'] ) ) { + $allcaps['resume_themes'] = true; + } + + return $allcaps; +} + +/** + * Filters the user capabilities to grant the 'view_site_health_checks' capabilities as necessary. + * + * @since 5.2.2 + * + * @param bool[] $allcaps An array of all the user's capabilities. + * @param string[] $caps Required primitive capabilities for the requested capability. + * @param array $args { + * Arguments that accompany the requested capability check. + * + * @type string $0 Requested capability. + * @type int $1 Concerned user ID. + * @type mixed ...$2 Optional second and further parameters, typically object ID. + * } + * @param WP_User $user The user object. + * @return bool[] Filtered array of the user's capabilities. + */ +function wp_maybe_grant_site_health_caps( $allcaps, $caps, $args, $user ) { + if ( ! empty( $allcaps['install_plugins'] ) && ( ! is_multisite() || is_super_admin( $user->ID ) ) ) { + $allcaps['view_site_health_checks'] = true; + } + + return $allcaps; +} + +return; + +// Dummy gettext calls to get strings in the catalog. +/* translators: User role for administrators. */ +_x( 'Administrator', 'User role' ); +/* translators: User role for editors. */ +_x( 'Editor', 'User role' ); +/* translators: User role for authors. */ +_x( 'Author', 'User role' ); +/* translators: User role for contributors. */ +_x( 'Contributor', 'User role' ); +/* translators: User role for subscribers. */ +_x( 'Subscriber', 'User role' ); diff --git a/wp-includes/category-template.php b/wp-includes/category-template.php new file mode 100644 index 0000000..edd5db6 --- /dev/null +++ b/wp-includes/category-template.php @@ -0,0 +1,1480 @@ +<?php +/** + * Taxonomy API: Core category-specific template tags + * + * @package WordPress + * @subpackage Template + * @since 1.2.0 + */ + +/** + * Retrieve category link URL. + * + * @since 1.0.0 + * @see get_term_link() + * + * @param int|object $category Category ID or object. + * @return string Link on success, empty string if category does not exist. + */ +function get_category_link( $category ) { + if ( ! is_object( $category ) ) { + $category = (int) $category; + } + + $category = get_term_link( $category ); + + if ( is_wp_error( $category ) ) { + return ''; + } + + return $category; +} + +/** + * Retrieve category parents with separator. + * + * @since 1.2.0 + * @since 4.8.0 The `$visited` parameter was deprecated and renamed to `$deprecated`. + * + * @param int $id Category ID. + * @param bool $link Optional, default is false. Whether to format with link. + * @param string $separator Optional, default is '/'. How to separate categories. + * @param bool $nicename Optional, default is false. Whether to use nice name for display. + * @param array $deprecated Not used. + * @return string|WP_Error A list of category parents on success, WP_Error on failure. + */ +function get_category_parents( $id, $link = false, $separator = '/', $nicename = false, $deprecated = array() ) { + + if ( ! empty( $deprecated ) ) { + _deprecated_argument( __FUNCTION__, '4.8.0' ); + } + + $format = $nicename ? 'slug' : 'name'; + + $args = array( + 'separator' => $separator, + 'link' => $link, + 'format' => $format, + ); + + return get_term_parents_list( $id, 'category', $args ); +} + +/** + * Retrieve post categories. + * + * This tag may be used outside The Loop by passing a post id as the parameter. + * + * Note: This function only returns results from the default "category" taxonomy. + * For custom taxonomies use get_the_terms(). + * + * @since 0.71 + * + * @param int $id Optional, default to current post ID. The post ID. + * @return WP_Term[] Array of WP_Term objects, one for each category assigned to the post. + */ +function get_the_category( $id = false ) { + $categories = get_the_terms( $id, 'category' ); + if ( ! $categories || is_wp_error( $categories ) ) { + $categories = array(); + } + + $categories = array_values( $categories ); + + foreach ( array_keys( $categories ) as $key ) { + _make_cat_compat( $categories[ $key ] ); + } + + /** + * Filters the array of categories to return for a post. + * + * @since 3.1.0 + * @since 4.4.0 Added `$id` parameter. + * + * @param WP_Term[] $categories An array of categories to return for the post. + * @param int|false $id ID of the post. + */ + return apply_filters( 'get_the_categories', $categories, $id ); +} + +/** + * Retrieve category name based on category ID. + * + * @since 0.71 + * + * @param int $cat_ID Category ID. + * @return string|WP_Error Category name on success, WP_Error on failure. + */ +function get_the_category_by_ID( $cat_ID ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + $cat_ID = (int) $cat_ID; + $category = get_term( $cat_ID ); + + if ( is_wp_error( $category ) ) { + return $category; + } + + return ( $category ) ? $category->name : ''; +} + +/** + * Retrieve category list for a post in either HTML list or custom format. + * + * @since 1.5.1 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * + * @param string $separator Optional. Separator between the categories. By default, the links are placed + * in an unordered list. An empty string will result in the default behavior. + * @param string $parents Optional. How to display the parents. + * @param int $post_id Optional. Post ID to retrieve categories. + * @return string + */ +function get_the_category_list( $separator = '', $parents = '', $post_id = false ) { + global $wp_rewrite; + if ( ! is_object_in_taxonomy( get_post_type( $post_id ), 'category' ) ) { + /** This filter is documented in wp-includes/category-template.php */ + return apply_filters( 'the_category', '', $separator, $parents ); + } + + /** + * Filters the categories before building the category list. + * + * @since 4.4.0 + * + * @param WP_Term[] $categories An array of the post's categories. + * @param int|bool $post_id ID of the post we're retrieving categories for. When `false`, we assume the + * current post in the loop. + */ + $categories = apply_filters( 'the_category_list', get_the_category( $post_id ), $post_id ); + + if ( empty( $categories ) ) { + /** This filter is documented in wp-includes/category-template.php */ + return apply_filters( 'the_category', __( 'Uncategorized' ), $separator, $parents ); + } + + $rel = ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) ? 'rel="category tag"' : 'rel="category"'; + + $thelist = ''; + if ( '' == $separator ) { + $thelist .= '<ul class="post-categories">'; + foreach ( $categories as $category ) { + $thelist .= "\n\t<li>"; + switch ( strtolower( $parents ) ) { + case 'multiple': + if ( $category->parent ) { + $thelist .= get_category_parents( $category->parent, true, $separator ); + } + $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a></li>'; + break; + case 'single': + $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>'; + if ( $category->parent ) { + $thelist .= get_category_parents( $category->parent, false, $separator ); + } + $thelist .= $category->name . '</a></li>'; + break; + case '': + default: + $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a></li>'; + } + } + $thelist .= '</ul>'; + } else { + $i = 0; + foreach ( $categories as $category ) { + if ( 0 < $i ) { + $thelist .= $separator; + } + switch ( strtolower( $parents ) ) { + case 'multiple': + if ( $category->parent ) { + $thelist .= get_category_parents( $category->parent, true, $separator ); + } + $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a>'; + break; + case 'single': + $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>'; + if ( $category->parent ) { + $thelist .= get_category_parents( $category->parent, false, $separator ); + } + $thelist .= "$category->name</a>"; + break; + case '': + default: + $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name . '</a>'; + } + ++$i; + } + } + + /** + * Filters the category or list of categories. + * + * @since 1.2.0 + * + * @param string $thelist List of categories for the current post. + * @param string $separator Separator used between the categories. + * @param string $parents How to display the category parents. Accepts 'multiple', + * 'single', or empty. + */ + return apply_filters( 'the_category', $thelist, $separator, $parents ); +} + +/** + * Checks if the current post is within any of the given categories. + * + * The given categories are checked against the post's categories' term_ids, names and slugs. + * Categories given as integers will only be checked against the post's categories' term_ids. + * + * Prior to v2.5 of WordPress, category names were not supported. + * Prior to v2.7, category slugs were not supported. + * Prior to v2.7, only one category could be compared: in_category( $single_category ). + * Prior to v2.7, this function could only be used in the WordPress Loop. + * As of 2.7, the function can be used anywhere if it is provided a post ID or post object. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 1.2.0 + * + * @param int|string|array $category Category ID, name or slug, or array of said. + * @param int|object $post Optional. Post to check instead of the current post. (since 2.7.0) + * @return bool True if the current post is in any of the given categories. + */ +function in_category( $category, $post = null ) { + if ( empty( $category ) ) { + return false; + } + + return has_category( $category, $post ); +} + +/** + * Display category list for a post in either HTML list or custom format. + * + * @since 0.71 + * + * @param string $separator Optional. Separator between the categories. By default, the links are placed + * in an unordered list. An empty string will result in the default behavior. + * @param string $parents Optional. How to display the parents. + * @param int $post_id Optional. Post ID to retrieve categories. + */ +function the_category( $separator = '', $parents = '', $post_id = false ) { + echo get_the_category_list( $separator, $parents, $post_id ); +} + +/** + * Retrieve category description. + * + * @since 1.0.0 + * + * @param int $category Optional. Category ID. Will use global category ID by default. + * @return string Category description, available. + */ +function category_description( $category = 0 ) { + return term_description( $category ); +} + +/** + * Display or retrieve the HTML dropdown list of categories. + * + * The 'hierarchical' argument, which is disabled by default, will override the + * depth argument, unless it is true. When the argument is false, it will + * display all of the categories. When it is enabled it will use the value in + * the 'depth' argument. + * + * @since 2.1.0 + * @since 4.2.0 Introduced the `value_field` argument. + * @since 4.6.0 Introduced the `required` argument. + * + * @param array|string $args { + * Optional. Array or string of arguments to generate a categories drop-down element. See WP_Term_Query::__construct() + * for information on additional accepted arguments. + * + * @type string $show_option_all Text to display for showing all categories. Default empty. + * @type string $show_option_none Text to display for showing no categories. Default empty. + * @type string $option_none_value Value to use when no category is selected. Default empty. + * @type string $orderby Which column to use for ordering categories. See get_terms() for a list + * of accepted values. Default 'id' (term_id). + * @type bool $pad_counts See get_terms() for an argument description. Default false. + * @type bool|int $show_count Whether to include post counts. Accepts 0, 1, or their bool equivalents. + * Default 0. + * @type bool|int $echo Whether to echo or return the generated markup. Accepts 0, 1, or their + * bool equivalents. Default 1. + * @type bool|int $hierarchical Whether to traverse the taxonomy hierarchy. Accepts 0, 1, or their bool + * equivalents. Default 0. + * @type int $depth Maximum depth. Default 0. + * @type int $tab_index Tab index for the select element. Default 0 (no tabindex). + * @type string $name Value for the 'name' attribute of the select element. Default 'cat'. + * @type string $id Value for the 'id' attribute of the select element. Defaults to the value + * of `$name`. + * @type string $class Value for the 'class' attribute of the select element. Default 'postform'. + * @type int|string $selected Value of the option that should be selected. Default 0. + * @type string $value_field Term field that should be used to populate the 'value' attribute + * of the option elements. Accepts any valid term field: 'term_id', 'name', + * 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description', + * 'parent', 'count'. Default 'term_id'. + * @type string|array $taxonomy Name of the category or categories to retrieve. Default 'category'. + * @type bool $hide_if_empty True to skip generating markup if no categories are found. + * Default false (create select element even if no categories are found). + * @type bool $required Whether the `<select>` element should have the HTML5 'required' attribute. + * Default false. + * } + * @return string HTML dropdown list of categories. + */ +function wp_dropdown_categories( $args = '' ) { + $defaults = array( + 'show_option_all' => '', + 'show_option_none' => '', + 'orderby' => 'id', + 'order' => 'ASC', + 'show_count' => 0, + 'hide_empty' => 1, + 'child_of' => 0, + 'exclude' => '', + 'echo' => 1, + 'selected' => 0, + 'hierarchical' => 0, + 'name' => 'cat', + 'id' => '', + 'class' => 'postform', + 'depth' => 0, + 'tab_index' => 0, + 'taxonomy' => 'category', + 'hide_if_empty' => false, + 'option_none_value' => -1, + 'value_field' => 'term_id', + 'required' => false, + ); + + $defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0; + + // Back compat. + if ( isset( $args['type'] ) && 'link' == $args['type'] ) { + _deprecated_argument( + __FUNCTION__, + '3.0.0', + sprintf( + /* translators: 1: "type => link", 2: "taxonomy => link_category" */ + __( '%1$s is deprecated. Use %2$s instead.' ), + '<code>type => link</code>', + '<code>taxonomy => link_category</code>' + ) + ); + $args['taxonomy'] = 'link_category'; + } + + // Parse incoming $args into an array and merge it with $defaults. + $parsed_args = wp_parse_args( $args, $defaults ); + + $option_none_value = $parsed_args['option_none_value']; + + if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) { + $parsed_args['pad_counts'] = true; + } + + $tab_index = $parsed_args['tab_index']; + + $tab_index_attribute = ''; + if ( (int) $tab_index > 0 ) { + $tab_index_attribute = " tabindex=\"$tab_index\""; + } + + // Avoid clashes with the 'name' param of get_terms(). + $get_terms_args = $parsed_args; + unset( $get_terms_args['name'] ); + $categories = get_terms( $get_terms_args ); + + $name = esc_attr( $parsed_args['name'] ); + $class = esc_attr( $parsed_args['class'] ); + $id = $parsed_args['id'] ? esc_attr( $parsed_args['id'] ) : $name; + $required = $parsed_args['required'] ? 'required' : ''; + + if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) { + $output = "<select $required name='$name' id='$id' class='$class' $tab_index_attribute>\n"; + } else { + $output = ''; + } + if ( empty( $categories ) && ! $parsed_args['hide_if_empty'] && ! empty( $parsed_args['show_option_none'] ) ) { + + /** + * Filters a taxonomy drop-down display element. + * + * A variety of taxonomy drop-down display elements can be modified + * just prior to display via this filter. Filterable arguments include + * 'show_option_none', 'show_option_all', and various forms of the + * term name. + * + * @since 1.2.0 + * + * @see wp_dropdown_categories() + * + * @param string $element Category name. + * @param WP_Term|null $category The category object, or null if there's no corresponding category. + */ + $show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null ); + $output .= "\t<option value='" . esc_attr( $option_none_value ) . "' selected='selected'>$show_option_none</option>\n"; + } + + if ( ! empty( $categories ) ) { + + if ( $parsed_args['show_option_all'] ) { + + /** This filter is documented in wp-includes/category-template.php */ + $show_option_all = apply_filters( 'list_cats', $parsed_args['show_option_all'], null ); + $selected = ( '0' === strval( $parsed_args['selected'] ) ) ? " selected='selected'" : ''; + $output .= "\t<option value='0'$selected>$show_option_all</option>\n"; + } + + if ( $parsed_args['show_option_none'] ) { + + /** This filter is documented in wp-includes/category-template.php */ + $show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null ); + $selected = selected( $option_none_value, $parsed_args['selected'], false ); + $output .= "\t<option value='" . esc_attr( $option_none_value ) . "'$selected>$show_option_none</option>\n"; + } + + if ( $parsed_args['hierarchical'] ) { + $depth = $parsed_args['depth']; // Walk the full depth. + } else { + $depth = -1; // Flat. + } + $output .= walk_category_dropdown_tree( $categories, $depth, $parsed_args ); + } + + if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) { + $output .= "</select>\n"; + } + + /** + * Filters the taxonomy drop-down output. + * + * @since 2.1.0 + * + * @param string $output HTML output. + * @param array $parsed_args Arguments used to build the drop-down. + */ + $output = apply_filters( 'wp_dropdown_cats', $output, $parsed_args ); + + if ( $parsed_args['echo'] ) { + echo $output; + } + + return $output; +} + +/** + * Display or retrieve the HTML list of categories. + * + * @since 2.1.0 + * @since 4.4.0 Introduced the `hide_title_if_empty` and `separator` arguments. + * @since 4.4.0 The `current_category` argument was modified to optionally accept an array of values. + * + * @param array|string $args { + * Array of optional arguments. See get_categories(), get_terms(), and WP_Term_Query::__construct() + * for information on additional accepted arguments. + * + * @type int|array $current_category ID of category, or array of IDs of categories, that should get the + * 'current-cat' class. Default 0. + * @type int $depth Category depth. Used for tab indentation. Default 0. + * @type bool|int $echo Whether to echo or return the generated markup. Accepts 0, 1, or their + * bool equivalents. Default 1. + * @type array|string $exclude Array or comma/space-separated string of term IDs to exclude. + * If `$hierarchical` is true, descendants of `$exclude` terms will also + * be excluded; see `$exclude_tree`. See get_terms(). + * Default empty string. + * @type array|string $exclude_tree Array or comma/space-separated string of term IDs to exclude, along + * with their descendants. See get_terms(). Default empty string. + * @type string $feed Text to use for the feed link. Default 'Feed for all posts filed + * under [cat name]'. + * @type string $feed_image URL of an image to use for the feed link. Default empty string. + * @type string $feed_type Feed type. Used to build feed link. See get_term_feed_link(). + * Default empty string (default feed). + * @type bool $hide_title_if_empty Whether to hide the `$title_li` element if there are no terms in + * the list. Default false (title will always be shown). + * @type string $separator Separator between links. Default '<br />'. + * @type bool|int $show_count Whether to include post counts. Accepts 0, 1, or their bool equivalents. + * Default 0. + * @type string $show_option_all Text to display for showing all categories. Default empty string. + * @type string $show_option_none Text to display for the 'no categories' option. + * Default 'No categories'. + * @type string $style The style used to display the categories list. If 'list', categories + * will be output as an unordered list. If left empty or another value, + * categories will be output separated by `<br>` tags. Default 'list'. + * @type string $title_li Text to use for the list title `<li>` element. Pass an empty string + * to disable. Default 'Categories'. + * @type bool|int $use_desc_for_title Whether to use the category description as the title attribute. + * Accepts 0, 1, or their bool equivalents. Default 1. + * } + * @return void|string|false Void if 'echo' argument is true, HTML list of categories if 'echo' is false. + * False if the taxonomy does not exist. + */ +function wp_list_categories( $args = '' ) { + $defaults = array( + 'child_of' => 0, + 'current_category' => 0, + 'depth' => 0, + 'echo' => 1, + 'exclude' => '', + 'exclude_tree' => '', + 'feed' => '', + 'feed_image' => '', + 'feed_type' => '', + 'hide_empty' => 1, + 'hide_title_if_empty' => false, + 'hierarchical' => true, + 'order' => 'ASC', + 'orderby' => 'name', + 'separator' => '<br />', + 'show_count' => 0, + 'show_option_all' => '', + 'show_option_none' => __( 'No categories' ), + 'style' => 'list', + 'taxonomy' => 'category', + 'title_li' => __( 'Categories' ), + 'use_desc_for_title' => 1, + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) { + $parsed_args['pad_counts'] = true; + } + + // Descendants of exclusions should be excluded too. + if ( true == $parsed_args['hierarchical'] ) { + $exclude_tree = array(); + + if ( $parsed_args['exclude_tree'] ) { + $exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude_tree'] ) ); + } + + if ( $parsed_args['exclude'] ) { + $exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude'] ) ); + } + + $parsed_args['exclude_tree'] = $exclude_tree; + $parsed_args['exclude'] = ''; + } + + if ( ! isset( $parsed_args['class'] ) ) { + $parsed_args['class'] = ( 'category' == $parsed_args['taxonomy'] ) ? 'categories' : $parsed_args['taxonomy']; + } + + if ( ! taxonomy_exists( $parsed_args['taxonomy'] ) ) { + return false; + } + + $show_option_all = $parsed_args['show_option_all']; + $show_option_none = $parsed_args['show_option_none']; + + $categories = get_categories( $parsed_args ); + + $output = ''; + if ( $parsed_args['title_li'] && 'list' == $parsed_args['style'] && ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] ) ) { + $output = '<li class="' . esc_attr( $parsed_args['class'] ) . '">' . $parsed_args['title_li'] . '<ul>'; + } + if ( empty( $categories ) ) { + if ( ! empty( $show_option_none ) ) { + if ( 'list' == $parsed_args['style'] ) { + $output .= '<li class="cat-item-none">' . $show_option_none . '</li>'; + } else { + $output .= $show_option_none; + } + } + } else { + if ( ! empty( $show_option_all ) ) { + + $posts_page = ''; + + // For taxonomies that belong only to custom post types, point to a valid archive. + $taxonomy_object = get_taxonomy( $parsed_args['taxonomy'] ); + if ( ! in_array( 'post', $taxonomy_object->object_type ) && ! in_array( 'page', $taxonomy_object->object_type ) ) { + foreach ( $taxonomy_object->object_type as $object_type ) { + $_object_type = get_post_type_object( $object_type ); + + // Grab the first one. + if ( ! empty( $_object_type->has_archive ) ) { + $posts_page = get_post_type_archive_link( $object_type ); + break; + } + } + } + + // Fallback for the 'All' link is the posts page. + if ( ! $posts_page ) { + if ( 'page' == get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) ) { + $posts_page = get_permalink( get_option( 'page_for_posts' ) ); + } else { + $posts_page = home_url( '/' ); + } + } + + $posts_page = esc_url( $posts_page ); + if ( 'list' == $parsed_args['style'] ) { + $output .= "<li class='cat-item-all'><a href='$posts_page'>$show_option_all</a></li>"; + } else { + $output .= "<a href='$posts_page'>$show_option_all</a>"; + } + } + + if ( empty( $parsed_args['current_category'] ) && ( is_category() || is_tax() || is_tag() ) ) { + $current_term_object = get_queried_object(); + if ( $current_term_object && $parsed_args['taxonomy'] === $current_term_object->taxonomy ) { + $parsed_args['current_category'] = get_queried_object_id(); + } + } + + if ( $parsed_args['hierarchical'] ) { + $depth = $parsed_args['depth']; + } else { + $depth = -1; // Flat. + } + $output .= walk_category_tree( $categories, $depth, $parsed_args ); + } + + if ( $parsed_args['title_li'] && 'list' == $parsed_args['style'] && ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] ) ) { + $output .= '</ul></li>'; + } + + /** + * Filters the HTML output of a taxonomy list. + * + * @since 2.1.0 + * + * @param string $output HTML output. + * @param array $args An array of taxonomy-listing arguments. + */ + $html = apply_filters( 'wp_list_categories', $output, $args ); + + if ( $parsed_args['echo'] ) { + echo $html; + } else { + return $html; + } +} + +/** + * Displays a tag cloud. + * + * @since 2.3.0 + * @since 4.8.0 Added the `show_count` argument. + * + * @param array|string $args { + * Optional. Array or string of arguments for displaying a tag cloud. See wp_generate_tag_cloud() + * and get_terms() for the full lists of arguments that can be passed in `$args`. + * + * @type int $number The number of tags to display. Accepts any positive integer + * or zero to return all. Default 0 (all tags). + * @type string $link Whether to display term editing links or term permalinks. + * Accepts 'edit' and 'view'. Default 'view'. + * @type string $post_type The post type. Used to highlight the proper post type menu + * on the linked edit page. Defaults to the first post type + * associated with the taxonomy. + * @type bool $echo Whether or not to echo the return value. Default true. + * } + * @return void|string|array Void if 'echo' argument is true, or on failure. Otherwise, tag cloud + * as a string or an array, depending on 'format' argument. + */ +function wp_tag_cloud( $args = '' ) { + $defaults = array( + 'smallest' => 8, + 'largest' => 22, + 'unit' => 'pt', + 'number' => 45, + 'format' => 'flat', + 'separator' => "\n", + 'orderby' => 'name', + 'order' => 'ASC', + 'exclude' => '', + 'include' => '', + 'link' => 'view', + 'taxonomy' => 'post_tag', + 'post_type' => '', + 'echo' => true, + 'show_count' => 0, + ); + + $args = wp_parse_args( $args, $defaults ); + + $tags = get_terms( + array_merge( + $args, + array( + 'orderby' => 'count', + 'order' => 'DESC', + ) + ) + ); // Always query top tags. + + if ( empty( $tags ) || is_wp_error( $tags ) ) { + return; + } + + foreach ( $tags as $key => $tag ) { + if ( 'edit' == $args['link'] ) { + $link = get_edit_term_link( $tag->term_id, $tag->taxonomy, $args['post_type'] ); + } else { + $link = get_term_link( intval( $tag->term_id ), $tag->taxonomy ); + } + + if ( is_wp_error( $link ) ) { + return; + } + + $tags[ $key ]->link = $link; + $tags[ $key ]->id = $tag->term_id; + } + + // Here's where those top tags get sorted according to $args. + $return = wp_generate_tag_cloud( $tags, $args ); + + /** + * Filters the tag cloud output. + * + * @since 2.3.0 + * + * @param string|array $return Tag cloud as a string or an array, depending on 'format' argument. + * @param array $args An array of tag cloud arguments. + */ + $return = apply_filters( 'wp_tag_cloud', $return, $args ); + + if ( 'array' == $args['format'] || empty( $args['echo'] ) ) { + return $return; + } + + echo $return; +} + +/** + * Default topic count scaling for tag links. + * + * @since 2.9.0 + * + * @param int $count Number of posts with that tag. + * @return int Scaled count. + */ +function default_topic_count_scale( $count ) { + return round( log10( $count + 1 ) * 100 ); +} + +/** + * Generates a tag cloud (heatmap) from provided data. + * + * @todo Complete functionality. + * @since 2.3.0 + * @since 4.8.0 Added the `show_count` argument. + * + * @param WP_Term[] $tags Array of WP_Term objects to generate the tag cloud for. + * @param string|array $args { + * Optional. Array or string of arguments for generating a tag cloud. + * + * @type int $smallest Smallest font size used to display tags. Paired + * with the value of `$unit`, to determine CSS text + * size unit. Default 8 (pt). + * @type int $largest Largest font size used to display tags. Paired + * with the value of `$unit`, to determine CSS text + * size unit. Default 22 (pt). + * @type string $unit CSS text size unit to use with the `$smallest` + * and `$largest` values. Accepts any valid CSS text + * size unit. Default 'pt'. + * @type int $number The number of tags to return. Accepts any + * positive integer or zero to return all. + * Default 0. + * @type string $format Format to display the tag cloud in. Accepts 'flat' + * (tags separated with spaces), 'list' (tags displayed + * in an unordered list), or 'array' (returns an array). + * Default 'flat'. + * @type string $separator HTML or text to separate the tags. Default "\n" (newline). + * @type string $orderby Value to order tags by. Accepts 'name' or 'count'. + * Default 'name'. The {@see 'tag_cloud_sort'} filter + * can also affect how tags are sorted. + * @type string $order How to order the tags. Accepts 'ASC' (ascending), + * 'DESC' (descending), or 'RAND' (random). Default 'ASC'. + * @type int|bool $filter Whether to enable filtering of the final output + * via {@see 'wp_generate_tag_cloud'}. Default 1|true. + * @type string $topic_count_text Nooped plural text from _n_noop() to supply to + * tag counts. Default null. + * @type callable $topic_count_text_callback Callback used to generate nooped plural text for + * tag counts based on the count. Default null. + * @type callable $topic_count_scale_callback Callback used to determine the tag count scaling + * value. Default default_topic_count_scale(). + * @type bool|int $show_count Whether to display the tag counts. Default 0. Accepts + * 0, 1, or their bool equivalents. + * } + * @return string|array Tag cloud as a string or an array, depending on 'format' argument. + */ +function wp_generate_tag_cloud( $tags, $args = '' ) { + $defaults = array( + 'smallest' => 8, + 'largest' => 22, + 'unit' => 'pt', + 'number' => 0, + 'format' => 'flat', + 'separator' => "\n", + 'orderby' => 'name', + 'order' => 'ASC', + 'topic_count_text' => null, + 'topic_count_text_callback' => null, + 'topic_count_scale_callback' => 'default_topic_count_scale', + 'filter' => 1, + 'show_count' => 0, + ); + + $args = wp_parse_args( $args, $defaults ); + + $return = ( 'array' === $args['format'] ) ? array() : ''; + + if ( empty( $tags ) ) { + return $return; + } + + // Juggle topic counts. + if ( isset( $args['topic_count_text'] ) ) { + // First look for nooped plural support via topic_count_text. + $translate_nooped_plural = $args['topic_count_text']; + } elseif ( ! empty( $args['topic_count_text_callback'] ) ) { + // Look for the alternative callback style. Ignore the previous default. + if ( 'default_topic_count_text' === $args['topic_count_text_callback'] ) { + /* translators: %s: Number of items (tags). */ + $translate_nooped_plural = _n_noop( '%s item', '%s items' ); + } else { + $translate_nooped_plural = false; + } + } elseif ( isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) { + // If no callback exists, look for the old-style single_text and multiple_text arguments. + // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingle,WordPress.WP.I18n.NonSingularStringLiteralPlural + $translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] ); + } else { + // This is the default for when no callback, plural, or argument is passed in. + /* translators: %s: Number of items (tags). */ + $translate_nooped_plural = _n_noop( '%s item', '%s items' ); + } + + /** + * Filters how the items in a tag cloud are sorted. + * + * @since 2.8.0 + * + * @param WP_Term[] $tags Ordered array of terms. + * @param array $args An array of tag cloud arguments. + */ + $tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args ); + if ( empty( $tags_sorted ) ) { + return $return; + } + + if ( $tags_sorted !== $tags ) { + $tags = $tags_sorted; + unset( $tags_sorted ); + } else { + if ( 'RAND' === $args['order'] ) { + shuffle( $tags ); + } else { + // SQL cannot save you; this is a second (potentially different) sort on a subset of data. + if ( 'name' === $args['orderby'] ) { + uasort( $tags, '_wp_object_name_sort_cb' ); + } else { + uasort( $tags, '_wp_object_count_sort_cb' ); + } + + if ( 'DESC' === $args['order'] ) { + $tags = array_reverse( $tags, true ); + } + } + } + + if ( $args['number'] > 0 ) { + $tags = array_slice( $tags, 0, $args['number'] ); + } + + $counts = array(); + $real_counts = array(); // For the alt tag. + foreach ( (array) $tags as $key => $tag ) { + $real_counts[ $key ] = $tag->count; + $counts[ $key ] = call_user_func( $args['topic_count_scale_callback'], $tag->count ); + } + + $min_count = min( $counts ); + $spread = max( $counts ) - $min_count; + if ( $spread <= 0 ) { + $spread = 1; + } + $font_spread = $args['largest'] - $args['smallest']; + if ( $font_spread < 0 ) { + $font_spread = 1; + } + $font_step = $font_spread / $spread; + + $aria_label = false; + /* + * Determine whether to output an 'aria-label' attribute with the tag name and count. + * When tags have a different font size, they visually convey an important information + * that should be available to assistive technologies too. On the other hand, sometimes + * themes set up the Tag Cloud to display all tags with the same font size (setting + * the 'smallest' and 'largest' arguments to the same value). + * In order to always serve the same content to all users, the 'aria-label' gets printed out: + * - when tags have a different size + * - when the tag count is displayed (for example when users check the checkbox in the + * Tag Cloud widget), regardless of the tags font size + */ + if ( $args['show_count'] || 0 !== $font_spread ) { + $aria_label = true; + } + + // Assemble the data that will be used to generate the tag cloud markup. + $tags_data = array(); + foreach ( $tags as $key => $tag ) { + $tag_id = isset( $tag->id ) ? $tag->id : $key; + + $count = $counts[ $key ]; + $real_count = $real_counts[ $key ]; + + if ( $translate_nooped_plural ) { + $formatted_count = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) ); + } else { + $formatted_count = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args ); + } + + $tags_data[] = array( + 'id' => $tag_id, + 'url' => '#' != $tag->link ? $tag->link : '#', + 'role' => '#' != $tag->link ? '' : ' role="button"', + 'name' => $tag->name, + 'formatted_count' => $formatted_count, + 'slug' => $tag->slug, + 'real_count' => $real_count, + 'class' => 'tag-cloud-link tag-link-' . $tag_id, + 'font_size' => $args['smallest'] + ( $count - $min_count ) * $font_step, + 'aria_label' => $aria_label ? sprintf( ' aria-label="%1$s (%2$s)"', esc_attr( $tag->name ), esc_attr( $formatted_count ) ) : '', + 'show_count' => $args['show_count'] ? '<span class="tag-link-count"> (' . $real_count . ')</span>' : '', + ); + } + + /** + * Filters the data used to generate the tag cloud. + * + * @since 4.3.0 + * + * @param array $tags_data An array of term data for term used to generate the tag cloud. + */ + $tags_data = apply_filters( 'wp_generate_tag_cloud_data', $tags_data ); + + $a = array(); + + // Generate the output links array. + foreach ( $tags_data as $key => $tag_data ) { + $class = $tag_data['class'] . ' tag-link-position-' . ( $key + 1 ); + $a[] = sprintf( + '<a href="%1$s"%2$s class="%3$s" style="font-size: %4$s;"%5$s>%6$s%7$s</a>', + esc_url( $tag_data['url'] ), + $tag_data['role'], + esc_attr( $class ), + esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ), + $tag_data['aria_label'], + esc_html( $tag_data['name'] ), + $tag_data['show_count'] + ); + } + + switch ( $args['format'] ) { + case 'array': + $return =& $a; + break; + case 'list': + /* + * Force role="list", as some browsers (sic: Safari 10) don't expose to assistive + * technologies the default role when the list is styled with `list-style: none`. + * Note: this is redundant but doesn't harm. + */ + $return = "<ul class='wp-tag-cloud' role='list'>\n\t<li>"; + $return .= join( "</li>\n\t<li>", $a ); + $return .= "</li>\n</ul>\n"; + break; + default: + $return = join( $args['separator'], $a ); + break; + } + + if ( $args['filter'] ) { + /** + * Filters the generated output of a tag cloud. + * + * The filter is only evaluated if a true value is passed + * to the $filter argument in wp_generate_tag_cloud(). + * + * @since 2.3.0 + * + * @see wp_generate_tag_cloud() + * + * @param array|string $return String containing the generated HTML tag cloud output + * or an array of tag links if the 'format' argument + * equals 'array'. + * @param WP_Term[] $tags An array of terms used in the tag cloud. + * @param array $args An array of wp_generate_tag_cloud() arguments. + */ + return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args ); + } else { + return $return; + } +} + +/** + * Serves as a callback for comparing objects based on name. + * + * Used with `uasort()`. + * + * @since 3.1.0 + * @access private + * + * @param object $a The first object to compare. + * @param object $b The second object to compare. + * @return int Negative number if `$a->name` is less than `$b->name`, zero if they are equal, + * or greater than zero if `$a->name` is greater than `$b->name`. + */ +function _wp_object_name_sort_cb( $a, $b ) { + return strnatcasecmp( $a->name, $b->name ); +} + +/** + * Serves as a callback for comparing objects based on count. + * + * Used with `uasort()`. + * + * @since 3.1.0 + * @access private + * + * @param object $a The first object to compare. + * @param object $b The second object to compare. + * @return bool Whether the count value for `$a` is greater than the count value for `$b`. + */ +function _wp_object_count_sort_cb( $a, $b ) { + return ( $a->count > $b->count ); +} + +// +// Helper functions. +// + +/** + * Retrieve HTML list content for category list. + * + * @since 2.1.0 + * @since 5.3.0 Formalized the existing `...$args` parameter by adding it + * to the function signature. + * + * @uses Walker_Category to create HTML list content. + * @see Walker::walk() for parameters and return description. + * + * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments. + * @return string + */ +function walk_category_tree( ...$args ) { + // The user's options are the third parameter. + if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) { + $walker = new Walker_Category; + } else { + $walker = $args[2]['walker']; + } + return $walker->walk( ...$args ); +} + +/** + * Retrieve HTML dropdown (select) content for category list. + * + * @since 2.1.0 + * @since 5.3.0 Formalized the existing `...$args` parameter by adding it + * to the function signature. + * + * @uses Walker_CategoryDropdown to create HTML dropdown content. + * @see Walker::walk() for parameters and return description. + * + * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments. + * @return string + */ +function walk_category_dropdown_tree( ...$args ) { + // The user's options are the third parameter. + if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) { + $walker = new Walker_CategoryDropdown; + } else { + $walker = $args[2]['walker']; + } + return $walker->walk( ...$args ); +} + +// +// Tags. +// + +/** + * Retrieve the link to the tag. + * + * @since 2.3.0 + * @see get_term_link() + * + * @param int|object $tag Tag ID or object. + * @return string Link on success, empty string if tag does not exist. + */ +function get_tag_link( $tag ) { + return get_category_link( $tag ); +} + +/** + * Retrieve the tags for a post. + * + * @since 2.3.0 + * + * @param int $id Post ID. + * @return array|false|WP_Error Array of tag objects on success, false on failure. + */ +function get_the_tags( $id = 0 ) { + + /** + * Filters the array of tags for the given post. + * + * @since 2.3.0 + * + * @see get_the_terms() + * + * @param WP_Term[] $terms An array of tags for the given post. + */ + return apply_filters( 'get_the_tags', get_the_terms( $id, 'post_tag' ) ); +} + +/** + * Retrieve the tags for a post formatted as a string. + * + * @since 2.3.0 + * + * @param string $before Optional. Before tags. + * @param string $sep Optional. Between tags. + * @param string $after Optional. After tags. + * @param int $id Optional. Post ID. Defaults to the current post. + * @return string|false|WP_Error A list of tags on success, false if there are no terms, WP_Error on failure. + */ +function get_the_tag_list( $before = '', $sep = '', $after = '', $id = 0 ) { + + /** + * Filters the tags list for a given post. + * + * @since 2.3.0 + * + * @param string $tag_list List of tags. + * @param string $before String to use before tags. + * @param string $sep String to use between the tags. + * @param string $after String to use after tags. + * @param int $id Post ID. + */ + return apply_filters( 'the_tags', get_the_term_list( $id, 'post_tag', $before, $sep, $after ), $before, $sep, $after, $id ); +} + +/** + * Retrieve the tags for a post. + * + * @since 2.3.0 + * + * @param string $before Optional. Before list. + * @param string $sep Optional. Separate items using this. + * @param string $after Optional. After list. + */ +function the_tags( $before = null, $sep = ', ', $after = '' ) { + if ( null === $before ) { + $before = __( 'Tags: ' ); + } + + $the_tags = get_the_tag_list( $before, $sep, $after ); + + if ( ! is_wp_error( $the_tags ) ) { + echo $the_tags; + } +} + +/** + * Retrieve tag description. + * + * @since 2.8.0 + * + * @param int $tag Optional. Tag ID. Will use global tag ID by default. + * @return string Tag description, available. + */ +function tag_description( $tag = 0 ) { + return term_description( $tag ); +} + +/** + * Retrieve term description. + * + * @since 2.8.0 + * @since 4.9.2 The `$taxonomy` parameter was deprecated. + * + * @param int $term Optional. Term ID. Will use global term ID by default. + * @param null $deprecated Deprecated argument. + * @return string Term description, available. + */ +function term_description( $term = 0, $deprecated = null ) { + if ( ! $term && ( is_tax() || is_tag() || is_category() ) ) { + $term = get_queried_object(); + if ( $term ) { + $term = $term->term_id; + } + } + $description = get_term_field( 'description', $term ); + return is_wp_error( $description ) ? '' : $description; +} + +/** + * Retrieve the terms of the taxonomy that are attached to the post. + * + * @since 2.5.0 + * + * @param int|WP_Post $post Post ID or object. + * @param string $taxonomy Taxonomy name. + * @return WP_Term[]|false|WP_Error Array of WP_Term objects on success, false if there are no terms + * or the post does not exist, WP_Error on failure. + */ +function get_the_terms( $post, $taxonomy ) { + $post = get_post( $post ); + if ( ! $post ) { + return false; + } + + $terms = get_object_term_cache( $post->ID, $taxonomy ); + if ( false === $terms ) { + $terms = wp_get_object_terms( $post->ID, $taxonomy ); + if ( ! is_wp_error( $terms ) ) { + $term_ids = wp_list_pluck( $terms, 'term_id' ); + wp_cache_add( $post->ID, $term_ids, $taxonomy . '_relationships' ); + } + } + + /** + * Filters the list of terms attached to the given post. + * + * @since 3.1.0 + * + * @param WP_Term[]|WP_Error $terms Array of attached terms, or WP_Error on failure. + * @param int $post_id Post ID. + * @param string $taxonomy Name of the taxonomy. + */ + $terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy ); + + if ( empty( $terms ) ) { + return false; + } + + return $terms; +} + +/** + * Retrieve a post's terms as a list with specified format. + * + * @since 2.5.0 + * + * @param int $id Post ID. + * @param string $taxonomy Taxonomy name. + * @param string $before Optional. Before list. + * @param string $sep Optional. Separate items using this. + * @param string $after Optional. After list. + * @return string|false|WP_Error A list of terms on success, false if there are no terms, WP_Error on failure. + */ +function get_the_term_list( $id, $taxonomy, $before = '', $sep = '', $after = '' ) { + $terms = get_the_terms( $id, $taxonomy ); + + if ( is_wp_error( $terms ) ) { + return $terms; + } + + if ( empty( $terms ) ) { + return false; + } + + $links = array(); + + foreach ( $terms as $term ) { + $link = get_term_link( $term, $taxonomy ); + if ( is_wp_error( $link ) ) { + return $link; + } + $links[] = '<a href="' . esc_url( $link ) . '" rel="tag">' . $term->name . '</a>'; + } + + /** + * Filters the term links for a given taxonomy. + * + * The dynamic portion of the filter name, `$taxonomy`, refers + * to the taxonomy slug. + * + * @since 2.5.0 + * + * @param string[] $links An array of term links. + */ + $term_links = apply_filters( "term_links-{$taxonomy}", $links ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + return $before . join( $sep, $term_links ) . $after; +} + +/** + * Retrieve term parents with separator. + * + * @since 4.8.0 + * + * @param int $term_id Term ID. + * @param string $taxonomy Taxonomy name. + * @param string|array $args { + * Array of optional arguments. + * + * @type string $format Use term names or slugs for display. Accepts 'name' or 'slug'. + * Default 'name'. + * @type string $separator Separator for between the terms. Default '/'. + * @type bool $link Whether to format as a link. Default true. + * @type bool $inclusive Include the term to get the parents for. Default true. + * } + * @return string|WP_Error A list of term parents on success, WP_Error or empty string on failure. + */ +function get_term_parents_list( $term_id, $taxonomy, $args = array() ) { + $list = ''; + $term = get_term( $term_id, $taxonomy ); + + if ( is_wp_error( $term ) ) { + return $term; + } + + if ( ! $term ) { + return $list; + } + + $term_id = $term->term_id; + + $defaults = array( + 'format' => 'name', + 'separator' => '/', + 'link' => true, + 'inclusive' => true, + ); + + $args = wp_parse_args( $args, $defaults ); + + foreach ( array( 'link', 'inclusive' ) as $bool ) { + $args[ $bool ] = wp_validate_boolean( $args[ $bool ] ); + } + + $parents = get_ancestors( $term_id, $taxonomy, 'taxonomy' ); + + if ( $args['inclusive'] ) { + array_unshift( $parents, $term_id ); + } + + foreach ( array_reverse( $parents ) as $term_id ) { + $parent = get_term( $term_id, $taxonomy ); + $name = ( 'slug' === $args['format'] ) ? $parent->slug : $parent->name; + + if ( $args['link'] ) { + $list .= '<a href="' . esc_url( get_term_link( $parent->term_id, $taxonomy ) ) . '">' . $name . '</a>' . $args['separator']; + } else { + $list .= $name . $args['separator']; + } + } + + return $list; +} + +/** + * Display the terms in a list. + * + * @since 2.5.0 + * + * @param int $id Post ID. + * @param string $taxonomy Taxonomy name. + * @param string $before Optional. Before list. + * @param string $sep Optional. Separate items using this. + * @param string $after Optional. After list. + * @return void|false Void on success, false on failure. + */ +function the_terms( $id, $taxonomy, $before = '', $sep = ', ', $after = '' ) { + $term_list = get_the_term_list( $id, $taxonomy, $before, $sep, $after ); + + if ( is_wp_error( $term_list ) ) { + return false; + } + + /** + * Filters the list of terms to display. + * + * @since 2.9.0 + * + * @param string $term_list List of terms to display. + * @param string $taxonomy The taxonomy name. + * @param string $before String to use before the terms. + * @param string $sep String to use between the terms. + * @param string $after String to use after the terms. + */ + echo apply_filters( 'the_terms', $term_list, $taxonomy, $before, $sep, $after ); +} + +/** + * Check if the current post has any of given category. + * + * @since 3.1.0 + * + * @param string|int|array $category Optional. The category name/term_id/slug or array of them to check for. + * @param int|object $post Optional. Post to check instead of the current post. + * @return bool True if the current post has any of the given categories (or any category, if no category specified). + */ +function has_category( $category = '', $post = null ) { + return has_term( $category, 'category', $post ); +} + +/** + * Checks if the current post has any of given tags. + * + * The given tags are checked against the post's tags' term_ids, names and slugs. + * Tags given as integers will only be checked against the post's tags' term_ids. + * If no tags are given, determines if post has any tags. + * + * Prior to v2.7 of WordPress, tags given as integers would also be checked against the post's tags' names and slugs (in addition to term_ids) + * Prior to v2.7, this function could only be used in the WordPress Loop. + * As of 2.7, the function can be used anywhere if it is provided a post ID or post object. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 2.6.0 + * + * @param string|int|array $tag Optional. The tag name/term_id/slug or array of them to check for. + * @param int|object $post Optional. Post to check instead of the current post. (since 2.7.0) + * @return bool True if the current post has any of the given tags (or any tag, if no tag specified). + */ +function has_tag( $tag = '', $post = null ) { + return has_term( $tag, 'post_tag', $post ); +} + +/** + * Check if the current post has any of given terms. + * + * The given terms are checked against the post's terms' term_ids, names and slugs. + * Terms given as integers will only be checked against the post's terms' term_ids. + * If no terms are given, determines if post has any terms. + * + * @since 3.1.0 + * + * @param string|int|array $term Optional. The term name/term_id/slug or array of them to check for. + * @param string $taxonomy Taxonomy name. + * @param int|WP_Post $post Optional. Post to check instead of the current post. + * @return bool True if the current post has any of the given tags (or any tag, if no tag specified). + */ +function has_term( $term = '', $taxonomy = '', $post = null ) { + $post = get_post( $post ); + + if ( ! $post ) { + return false; + } + + $r = is_object_in_term( $post->ID, $taxonomy, $term ); + if ( is_wp_error( $r ) ) { + return false; + } + + return $r; +} diff --git a/wp-includes/category.php b/wp-includes/category.php new file mode 100644 index 0000000..3f5cb19 --- /dev/null +++ b/wp-includes/category.php @@ -0,0 +1,371 @@ +<?php +/** + * Taxonomy API: Core category-specific functionality + * + * @package WordPress + * @subpackage Taxonomy + */ + +/** + * Retrieve list of category objects. + * + * If you set the 'taxonomy' argument to 'link_category', the link categories + * will be returned instead. + * + * @since 2.1.0 + * @see get_terms() Type of arguments that can be changed. + * + * @param string|array $args { + * Optional. Arguments to retrieve categories. See get_terms() for additional options. + * + * @type string $taxonomy Taxonomy to retrieve terms for. Default 'category'. + * } + * @return array List of category objects. + */ +function get_categories( $args = '' ) { + $defaults = array( 'taxonomy' => 'category' ); + $args = wp_parse_args( $args, $defaults ); + + /** + * Filters the taxonomy used to retrieve terms when calling get_categories(). + * + * @since 2.7.0 + * + * @param string $taxonomy Taxonomy to retrieve terms from. + * @param array $args An array of arguments. See get_terms(). + */ + $args['taxonomy'] = apply_filters( 'get_categories_taxonomy', $args['taxonomy'], $args ); + + // Back compat. + if ( isset( $args['type'] ) && 'link' == $args['type'] ) { + _deprecated_argument( + __FUNCTION__, + '3.0.0', + sprintf( + /* translators: 1: "type => link", 2: "taxonomy => link_category" */ + __( '%1$s is deprecated. Use %2$s instead.' ), + '<code>type => link</code>', + '<code>taxonomy => link_category</code>' + ) + ); + $args['taxonomy'] = 'link_category'; + } + + $categories = get_terms( $args ); + + if ( is_wp_error( $categories ) ) { + $categories = array(); + } else { + $categories = (array) $categories; + foreach ( array_keys( $categories ) as $k ) { + _make_cat_compat( $categories[ $k ] ); + } + } + + return $categories; +} + +/** + * Retrieves category data given a category ID or category object. + * + * If you pass the $category parameter an object, which is assumed to be the + * category row object retrieved the database. It will cache the category data. + * + * If you pass $category an integer of the category ID, then that category will + * be retrieved from the database, if it isn't already cached, and pass it back. + * + * If you look at get_term(), then both types will be passed through several + * filters and finally sanitized based on the $filter parameter value. + * + * @since 1.5.1 + * + * @param int|object $category Category ID or Category row object + * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to a + * WP_Term object, an associative array, or a numeric array, respectively. Default OBJECT. + * @param string $filter Optional. Default is raw or no WordPress defined filter will applied. + * @return object|array|WP_Error|null Category data in type defined by $output parameter. + * WP_Error if $category is empty, null if it does not exist. + */ +function get_category( $category, $output = OBJECT, $filter = 'raw' ) { + $category = get_term( $category, 'category', $output, $filter ); + + if ( is_wp_error( $category ) ) { + return $category; + } + + _make_cat_compat( $category ); + + return $category; +} + +/** + * Retrieve category based on URL containing the category slug. + * + * Breaks the $category_path parameter up to get the category slug. + * + * Tries to find the child path and will return it. If it doesn't find a + * match, then it will return the first category matching slug, if $full_match, + * is set to false. If it does not, then it will return null. + * + * It is also possible that it will return a WP_Error object on failure. Check + * for it when using this function. + * + * @since 2.1.0 + * + * @param string $category_path URL containing category slugs. + * @param bool $full_match Optional. Whether full path should be matched. + * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to + * a WP_Term object, an associative array, or a numeric array, respectively. Default OBJECT. + * @return WP_Term|array|WP_Error|null Type is based on $output value. + */ +function get_category_by_path( $category_path, $full_match = true, $output = OBJECT ) { + $category_path = rawurlencode( urldecode( $category_path ) ); + $category_path = str_replace( '%2F', '/', $category_path ); + $category_path = str_replace( '%20', ' ', $category_path ); + $category_paths = '/' . trim( $category_path, '/' ); + $leaf_path = sanitize_title( basename( $category_paths ) ); + $category_paths = explode( '/', $category_paths ); + $full_path = ''; + foreach ( (array) $category_paths as $pathdir ) { + $full_path .= ( '' != $pathdir ? '/' : '' ) . sanitize_title( $pathdir ); + } + $categories = get_terms( + array( + 'taxonomy' => 'category', + 'get' => 'all', + 'slug' => $leaf_path, + ) + ); + + if ( empty( $categories ) ) { + return; + } + + foreach ( $categories as $category ) { + $path = '/' . $leaf_path; + $curcategory = $category; + while ( ( 0 != $curcategory->parent ) && ( $curcategory->parent != $curcategory->term_id ) ) { + $curcategory = get_term( $curcategory->parent, 'category' ); + if ( is_wp_error( $curcategory ) ) { + return $curcategory; + } + $path = '/' . $curcategory->slug . $path; + } + + if ( $path == $full_path ) { + $category = get_term( $category->term_id, 'category', $output ); + _make_cat_compat( $category ); + return $category; + } + } + + // If full matching is not required, return the first cat that matches the leaf. + if ( ! $full_match ) { + $category = get_term( reset( $categories )->term_id, 'category', $output ); + _make_cat_compat( $category ); + return $category; + } +} + +/** + * Retrieve category object by category slug. + * + * @since 2.3.0 + * + * @param string $slug The category slug. + * @return object Category data object + */ +function get_category_by_slug( $slug ) { + $category = get_term_by( 'slug', $slug, 'category' ); + if ( $category ) { + _make_cat_compat( $category ); + } + + return $category; +} + +/** + * Retrieve the ID of a category from its name. + * + * @since 1.0.0 + * + * @param string $cat_name Category name. + * @return int 0, if failure and ID of category on success. + */ +function get_cat_ID( $cat_name ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + $cat = get_term_by( 'name', $cat_name, 'category' ); + if ( $cat ) { + return $cat->term_id; + } + return 0; +} + +/** + * Retrieve the name of a category from its ID. + * + * @since 1.0.0 + * + * @param int $cat_id Category ID + * @return string Category name, or an empty string if category doesn't exist. + */ +function get_cat_name( $cat_id ) { + $cat_id = (int) $cat_id; + $category = get_term( $cat_id, 'category' ); + if ( ! $category || is_wp_error( $category ) ) { + return ''; + } + return $category->name; +} + +/** + * Check if a category is an ancestor of another category. + * + * You can use either an id or the category object for both parameters. If you + * use an integer the category will be retrieved. + * + * @since 2.1.0 + * + * @param int|object $cat1 ID or object to check if this is the parent category. + * @param int|object $cat2 The child category. + * @return bool Whether $cat2 is child of $cat1 + */ +function cat_is_ancestor_of( $cat1, $cat2 ) { + return term_is_ancestor_of( $cat1, $cat2, 'category' ); +} + +/** + * Sanitizes category data based on context. + * + * @since 2.3.0 + * + * @param object|array $category Category data + * @param string $context Optional. Default is 'display'. + * @return object|array Same type as $category with sanitized data for safe use. + */ +function sanitize_category( $category, $context = 'display' ) { + return sanitize_term( $category, 'category', $context ); +} + +/** + * Sanitizes data in single category key field. + * + * @since 2.3.0 + * + * @param string $field Category key to sanitize + * @param mixed $value Category value to sanitize + * @param int $cat_id Category ID + * @param string $context What filter to use, 'raw', 'display', etc. + * @return mixed Same type as $value after $value has been sanitized. + */ +function sanitize_category_field( $field, $value, $cat_id, $context ) { + return sanitize_term_field( $field, $value, $cat_id, 'category', $context ); +} + +/* Tags */ + +/** + * Retrieves all post tags. + * + * @since 2.3.0 + * @see get_terms() For list of arguments to pass. + * + * @param string|array $args Tag arguments to use when retrieving tags. + * @return WP_Term[]|int $tags Array of 'post_tag' term objects, or a count thereof. + */ +function get_tags( $args = '' ) { + $defaults = array( 'taxonomy' => 'post_tag' ); + $args = wp_parse_args( $args, $defaults ); + + $tags = get_terms( $args ); + + if ( empty( $tags ) ) { + $return = array(); + return $return; + } + + /** + * Filters the array of term objects returned for the 'post_tag' taxonomy. + * + * @since 2.3.0 + * + * @param WP_Term[]|int $tags Array of 'post_tag' term objects, or a count thereof. + * @param array $args An array of arguments. @see get_terms() + */ + $tags = apply_filters( 'get_tags', $tags, $args ); + return $tags; +} + +/** + * Retrieve post tag by tag ID or tag object. + * + * If you pass the $tag parameter an object, which is assumed to be the tag row + * object retrieved the database. It will cache the tag data. + * + * If you pass $tag an integer of the tag ID, then that tag will + * be retrieved from the database, if it isn't already cached, and pass it back. + * + * If you look at get_term(), then both types will be passed through several + * filters and finally sanitized based on the $filter parameter value. + * + * @since 2.3.0 + * + * @param int|WP_Term|object $tag A tag ID or object. + * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to + * a WP_Term object, an associative array, or a numeric array, respectively. Default OBJECT. + * @param string $filter Optional. Default is raw or no WordPress defined filter will applied. + * @return WP_Term|array|WP_Error|null Tag data in type defined by $output parameter. WP_Error if $tag is empty, null if it does not exist. + */ +function get_tag( $tag, $output = OBJECT, $filter = 'raw' ) { + return get_term( $tag, 'post_tag', $output, $filter ); +} + +/* Cache */ + +/** + * Remove the category cache data based on ID. + * + * @since 2.1.0 + * + * @param int $id Category ID + */ +function clean_category_cache( $id ) { + clean_term_cache( $id, 'category' ); +} + +/** + * Update category structure to old pre-2.3 from new taxonomy structure. + * + * This function was added for the taxonomy support to update the new category + * structure with the old category one. This will maintain compatibility with + * plugins and themes which depend on the old key or property names. + * + * The parameter should only be passed a variable and not create the array or + * object inline to the parameter. The reason for this is that parameter is + * passed by reference and PHP will fail unless it has the variable. + * + * There is no return value, because everything is updated on the variable you + * pass to it. This is one of the features with using pass by reference in PHP. + * + * @since 2.3.0 + * @since 4.4.0 The `$category` parameter now also accepts a WP_Term object. + * @access private + * + * @param array|object|WP_Term $category Category Row object or array + */ +function _make_cat_compat( &$category ) { + if ( is_object( $category ) && ! is_wp_error( $category ) ) { + $category->cat_ID = $category->term_id; + $category->category_count = $category->count; + $category->category_description = $category->description; + $category->cat_name = $category->name; + $category->category_nicename = $category->slug; + $category->category_parent = $category->parent; + } elseif ( is_array( $category ) && isset( $category['term_id'] ) ) { + $category['cat_ID'] = &$category['term_id']; + $category['category_count'] = &$category['count']; + $category['category_description'] = &$category['description']; + $category['cat_name'] = &$category['name']; + $category['category_nicename'] = &$category['slug']; + $category['category_parent'] = &$category['parent']; + } +} diff --git a/wp-includes/certificates/ca-bundle.crt b/wp-includes/certificates/ca-bundle.crt new file mode 100644 index 0000000..9d44ac7 --- /dev/null +++ b/wp-includes/certificates/ca-bundle.crt @@ -0,0 +1,3673 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Wed Aug 28 03:12:10 2019 GMT +## Includes a WordPress Modification - We include the 'legacy' 1024bit certificates +## for backward compatibility. See https://core.trac.wordpress.org/ticket/34935#comment:10 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.27. +## SHA256: fffa309937c3be940649293f749b8207fabc6eb224e50e4bb3f2c5e44e0d6a6b +## + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +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 +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G3 +================================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y +olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t +x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy +EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K +Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur +mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 +1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp +07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo +FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE +41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu +yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq +KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 +v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA +8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b +8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r +mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq +1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI +JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV +tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +LuxTrust Global Root 2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +TrustCor RootCert CA-1 +====================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP +MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig +U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx +MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu +YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe +VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy +dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq +jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 +pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 +JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h +gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw +/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j +BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 +mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C +qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P +3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +TrustCor RootCert CA-2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TrustCor ECA-1 +============== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP +MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig +U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw +N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 +MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y +IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR +MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 +xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc +p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ +fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj +YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL +f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF +AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u +/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs +J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC +jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +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 +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG +EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv +b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG +A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx +9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r +aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW +r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM +LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly +4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr +06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om +3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu +JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM +BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv +fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm +ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b +gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq +4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr +tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo +pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0 +sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql +CFF1pkgl +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG +EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv +b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG +A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk +k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo +7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI +m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm +dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu +ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz +cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl +aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy +5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM +BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ ++YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw +c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da +WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r +n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu +Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ +7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs +gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld +o/DUhgkC +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU +Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej +QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP +0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0 +glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa +KaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa +6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj +QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV +2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI +N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x +zPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +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 +dBb9HxEGmpv0 +-----END CERTIFICATE----- diff --git a/wp-includes/class-IXR.php b/wp-includes/class-IXR.php new file mode 100644 index 0000000..0cd72df --- /dev/null +++ b/wp-includes/class-IXR.php @@ -0,0 +1,60 @@ +<?php +/** + * IXR - The Incutio XML-RPC Library + * + * Copyright (c) 2010, Incutio Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of Incutio Ltd. nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @package IXR + * @since 1.5.0 + * + * @copyright Incutio Ltd 2010 (http://www.incutio.com) + * @version 1.7.4 7th September 2010 + * @author Simon Willison + * @link http://scripts.incutio.com/xmlrpc/ Site/manual + * @license http://www.opensource.org/licenses/bsd-license.php BSD + */ + +require_once ABSPATH . WPINC . '/IXR/class-IXR-server.php'; + +require_once ABSPATH . WPINC . '/IXR/class-IXR-base64.php'; + +require_once ABSPATH . WPINC . '/IXR/class-IXR-client.php'; + +require_once ABSPATH . WPINC . '/IXR/class-IXR-clientmulticall.php'; + +require_once ABSPATH . WPINC . '/IXR/class-IXR-date.php'; + +require_once ABSPATH . WPINC . '/IXR/class-IXR-error.php'; + +require_once ABSPATH . WPINC . '/IXR/class-IXR-introspectionserver.php'; + +require_once ABSPATH . WPINC . '/IXR/class-IXR-message.php'; + +require_once ABSPATH . WPINC . '/IXR/class-IXR-request.php'; + +require_once ABSPATH . WPINC . '/IXR/class-IXR-value.php'; \ No newline at end of file diff --git a/wp-includes/class-feed.php b/wp-includes/class-feed.php new file mode 100644 index 0000000..9a4772d --- /dev/null +++ b/wp-includes/class-feed.php @@ -0,0 +1,19 @@ +<?php +/** + * Feed API + * + * @package WordPress + * @subpackage Feed + * @deprecated 4.7.0 + */ + +_deprecated_file( basename( __FILE__ ), '4.7.0', 'fetch_feed()' ); + +if ( ! class_exists( 'SimplePie', false ) ) { + require_once ABSPATH . WPINC . '/class-simplepie.php'; +} + +require_once ABSPATH . WPINC . '/class-wp-feed-cache.php'; +require_once ABSPATH . WPINC . '/class-wp-feed-cache-transient.php'; +require_once ABSPATH . WPINC . '/class-wp-simplepie-file.php'; +require_once ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php'; diff --git a/wp-includes/class-http.php b/wp-includes/class-http.php new file mode 100644 index 0000000..a30a9b3 --- /dev/null +++ b/wp-includes/class-http.php @@ -0,0 +1,1088 @@ +<?php +/** + * HTTP API: WP_Http class + * + * @package WordPress + * @subpackage HTTP + * @since 2.7.0 + */ + +if ( ! class_exists( 'Requests' ) ) { + require ABSPATH . WPINC . '/class-requests.php'; + + Requests::register_autoloader(); + Requests::set_certificate_path( ABSPATH . WPINC . '/certificates/ca-bundle.crt' ); +} + +/** + * Core class used for managing HTTP transports and making HTTP requests. + * + * This class is used to consistently make outgoing HTTP requests easy for developers + * while still being compatible with the many PHP configurations under which + * WordPress runs. + * + * Debugging includes several actions, which pass different variables for debugging the HTTP API. + * + * @since 2.7.0 + */ +class WP_Http { + + // Aliases for HTTP response codes. + const HTTP_CONTINUE = 100; + const SWITCHING_PROTOCOLS = 101; + const PROCESSING = 102; + const EARLY_HINTS = 103; + + const OK = 200; + const CREATED = 201; + const ACCEPTED = 202; + const NON_AUTHORITATIVE_INFORMATION = 203; + const NO_CONTENT = 204; + const RESET_CONTENT = 205; + const PARTIAL_CONTENT = 206; + const MULTI_STATUS = 207; + const IM_USED = 226; + + const MULTIPLE_CHOICES = 300; + const MOVED_PERMANENTLY = 301; + const FOUND = 302; + const SEE_OTHER = 303; + const NOT_MODIFIED = 304; + const USE_PROXY = 305; + const RESERVED = 306; + const TEMPORARY_REDIRECT = 307; + const PERMANENT_REDIRECT = 308; + + const BAD_REQUEST = 400; + const UNAUTHORIZED = 401; + const PAYMENT_REQUIRED = 402; + const FORBIDDEN = 403; + const NOT_FOUND = 404; + const METHOD_NOT_ALLOWED = 405; + const NOT_ACCEPTABLE = 406; + const PROXY_AUTHENTICATION_REQUIRED = 407; + const REQUEST_TIMEOUT = 408; + const CONFLICT = 409; + const GONE = 410; + const LENGTH_REQUIRED = 411; + const PRECONDITION_FAILED = 412; + const REQUEST_ENTITY_TOO_LARGE = 413; + const REQUEST_URI_TOO_LONG = 414; + const UNSUPPORTED_MEDIA_TYPE = 415; + const REQUESTED_RANGE_NOT_SATISFIABLE = 416; + const EXPECTATION_FAILED = 417; + const IM_A_TEAPOT = 418; + const MISDIRECTED_REQUEST = 421; + const UNPROCESSABLE_ENTITY = 422; + const LOCKED = 423; + const FAILED_DEPENDENCY = 424; + const UPGRADE_REQUIRED = 426; + const PRECONDITION_REQUIRED = 428; + const TOO_MANY_REQUESTS = 429; + const REQUEST_HEADER_FIELDS_TOO_LARGE = 431; + const UNAVAILABLE_FOR_LEGAL_REASONS = 451; + + const INTERNAL_SERVER_ERROR = 500; + const NOT_IMPLEMENTED = 501; + const BAD_GATEWAY = 502; + const SERVICE_UNAVAILABLE = 503; + const GATEWAY_TIMEOUT = 504; + const HTTP_VERSION_NOT_SUPPORTED = 505; + const VARIANT_ALSO_NEGOTIATES = 506; + const INSUFFICIENT_STORAGE = 507; + const NOT_EXTENDED = 510; + const NETWORK_AUTHENTICATION_REQUIRED = 511; + + /** + * Send an HTTP request to a URI. + * + * Please note: The only URI that are supported in the HTTP Transport implementation + * are the HTTP and HTTPS protocols. + * + * @since 2.7.0 + * + * @param string $url The request URL. + * @param string|array $args { + * Optional. Array or string of HTTP request arguments. + * + * @type string $method Request method. Accepts 'GET', 'POST', 'HEAD', 'PUT', 'DELETE', + * 'TRACE', 'OPTIONS', or 'PATCH'. + * Some transports technically allow others, but should not be + * assumed. Default 'GET'. + * @type float $timeout How long the connection should stay open in seconds. Default 5. + * @type int $redirection Number of allowed redirects. Not supported by all transports + * Default 5. + * @type string $httpversion Version of the HTTP protocol to use. Accepts '1.0' and '1.1'. + * Default '1.0'. + * @type string $user-agent User-agent value sent. + * Default 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ). + * @type bool $reject_unsafe_urls Whether to pass URLs through wp_http_validate_url(). + * Default false. + * @type bool $blocking Whether the calling code requires the result of the request. + * If set to false, the request will be sent to the remote server, + * and processing returned to the calling code immediately, the caller + * will know if the request succeeded or failed, but will not receive + * any response from the remote server. Default true. + * @type string|array $headers Array or string of headers to send with the request. + * Default empty array. + * @type array $cookies List of cookies to send with the request. Default empty array. + * @type string|array $body Body to send with the request. Default null. + * @type bool $compress Whether to compress the $body when sending the request. + * Default false. + * @type bool $decompress Whether to decompress a compressed response. If set to false and + * compressed content is returned in the response anyway, it will + * need to be separately decompressed. Default true. + * @type bool $sslverify Whether to verify SSL for the request. Default true. + * @type string $sslcertificates Absolute path to an SSL certificate .crt file. + * Default ABSPATH . WPINC . '/certificates/ca-bundle.crt'. + * @type bool $stream Whether to stream to a file. If set to true and no filename was + * given, it will be droped it in the WP temp dir and its name will + * be set using the basename of the URL. Default false. + * @type string $filename Filename of the file to write to when streaming. $stream must be + * set to true. Default null. + * @type int $limit_response_size Size in bytes to limit the response to. Default null. + * + * } + * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. + * A WP_Error instance upon error. + */ + public function request( $url, $args = array() ) { + $defaults = array( + 'method' => 'GET', + /** + * Filters the timeout value for an HTTP request. + * + * @since 2.7.0 + * @since 5.1.0 The `$url` parameter was added. + * + * @param float $timeout_value Time in seconds until a request times out. Default 5. + * @param string $url The request URL. + */ + 'timeout' => apply_filters( 'http_request_timeout', 5, $url ), + /** + * Filters the number of redirects allowed during an HTTP request. + * + * @since 2.7.0 + * @since 5.1.0 The `$url` parameter was added. + * + * @param int $redirect_count Number of redirects allowed. Default 5. + * @param string $url The request URL. + */ + 'redirection' => apply_filters( 'http_request_redirection_count', 5, $url ), + /** + * Filters the version of the HTTP protocol used in a request. + * + * @since 2.7.0 + * @since 5.1.0 The `$url` parameter was added. + * + * @param string $version Version of HTTP used. Accepts '1.0' and '1.1'. Default '1.0'. + * @param string $url The request URL. + */ + 'httpversion' => apply_filters( 'http_request_version', '1.0', $url ), + /** + * Filters the user agent value sent with an HTTP request. + * + * @since 2.7.0 + * @since 5.1.0 The `$url` parameter was added. + * + * @param string $user_agent WordPress user agent string. + * @param string $url The request URL. + */ + 'user-agent' => apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ), $url ), + /** + * Filters whether to pass URLs through wp_http_validate_url() in an HTTP request. + * + * @since 3.6.0 + * @since 5.1.0 The `$url` parameter was added. + * + * @param bool $pass_url Whether to pass URLs through wp_http_validate_url(). Default false. + * @param string $url The request URL. + */ + 'reject_unsafe_urls' => apply_filters( 'http_request_reject_unsafe_urls', false, $url ), + 'blocking' => true, + 'headers' => array(), + 'cookies' => array(), + 'body' => null, + 'compress' => false, + 'decompress' => true, + 'sslverify' => true, + 'sslcertificates' => ABSPATH . WPINC . '/certificates/ca-bundle.crt', + 'stream' => false, + 'filename' => null, + 'limit_response_size' => null, + ); + + // Pre-parse for the HEAD checks. + $args = wp_parse_args( $args ); + + // By default, HEAD requests do not cause redirections. + if ( isset( $args['method'] ) && 'HEAD' == $args['method'] ) { + $defaults['redirection'] = 0; + } + + $parsed_args = wp_parse_args( $args, $defaults ); + /** + * Filters the arguments used in an HTTP request. + * + * @since 2.7.0 + * + * @param array $parsed_args An array of HTTP request arguments. + * @param string $url The request URL. + */ + $parsed_args = apply_filters( 'http_request_args', $parsed_args, $url ); + + // The transports decrement this, store a copy of the original value for loop purposes. + if ( ! isset( $parsed_args['_redirection'] ) ) { + $parsed_args['_redirection'] = $parsed_args['redirection']; + } + + /** + * Filters whether to preempt an HTTP request's return value. + * + * Returning a non-false value from the filter will short-circuit the HTTP request and return + * early with that value. A filter should return either: + * + * - An array containing 'headers', 'body', 'response', 'cookies', and 'filename' elements + * - A WP_Error instance + * - boolean false (to avoid short-circuiting the response) + * + * Returning any other value may result in unexpected behaviour. + * + * @since 2.9.0 + * + * @param false|array|WP_Error $preempt Whether to preempt an HTTP request's return value. Default false. + * @param array $parsed_args HTTP request arguments. + * @param string $url The request URL. + */ + $pre = apply_filters( 'pre_http_request', false, $parsed_args, $url ); + + if ( false !== $pre ) { + return $pre; + } + + if ( function_exists( 'wp_kses_bad_protocol' ) ) { + if ( $parsed_args['reject_unsafe_urls'] ) { + $url = wp_http_validate_url( $url ); + } + if ( $url ) { + $url = wp_kses_bad_protocol( $url, array( 'http', 'https', 'ssl' ) ); + } + } + + $arrURL = @parse_url( $url ); + + if ( empty( $url ) || empty( $arrURL['scheme'] ) ) { + $response = new WP_Error( 'http_request_failed', __( 'A valid URL was not provided.' ) ); + /** This action is documented in wp-includes/class-http.php */ + do_action( 'http_api_debug', $response, 'response', 'Requests', $parsed_args, $url ); + return $response; + } + + if ( $this->block_request( $url ) ) { + $response = new WP_Error( 'http_request_not_executed', __( 'User has blocked requests through HTTP.' ) ); + /** This action is documented in wp-includes/class-http.php */ + do_action( 'http_api_debug', $response, 'response', 'Requests', $parsed_args, $url ); + return $response; + } + + // If we are streaming to a file but no filename was given drop it in the WP temp dir + // and pick its name using the basename of the $url. + if ( $parsed_args['stream'] ) { + if ( empty( $parsed_args['filename'] ) ) { + $parsed_args['filename'] = get_temp_dir() . basename( $url ); + } + + // Force some settings if we are streaming to a file and check for existence + // and perms of destination directory. + $parsed_args['blocking'] = true; + if ( ! wp_is_writable( dirname( $parsed_args['filename'] ) ) ) { + $response = new WP_Error( 'http_request_failed', __( 'Destination directory for file streaming does not exist or is not writable.' ) ); + /** This action is documented in wp-includes/class-http.php */ + do_action( 'http_api_debug', $response, 'response', 'Requests', $parsed_args, $url ); + return $response; + } + } + + if ( is_null( $parsed_args['headers'] ) ) { + $parsed_args['headers'] = array(); + } + + // WP allows passing in headers as a string, weirdly. + if ( ! is_array( $parsed_args['headers'] ) ) { + $processedHeaders = WP_Http::processHeaders( $parsed_args['headers'] ); + $parsed_args['headers'] = $processedHeaders['headers']; + } + + // Setup arguments. + $headers = $parsed_args['headers']; + $data = $parsed_args['body']; + $type = $parsed_args['method']; + $options = array( + 'timeout' => $parsed_args['timeout'], + 'useragent' => $parsed_args['user-agent'], + 'blocking' => $parsed_args['blocking'], + 'hooks' => new WP_HTTP_Requests_Hooks( $url, $parsed_args ), + ); + + // Ensure redirects follow browser behaviour. + $options['hooks']->register( 'requests.before_redirect', array( get_class(), 'browser_redirect_compatibility' ) ); + + // Validate redirected URLs. + if ( function_exists( 'wp_kses_bad_protocol' ) && $parsed_args['reject_unsafe_urls'] ) { + $options['hooks']->register( 'requests.before_redirect', array( get_class(), 'validate_redirects' ) ); + } + + if ( $parsed_args['stream'] ) { + $options['filename'] = $parsed_args['filename']; + } + if ( empty( $parsed_args['redirection'] ) ) { + $options['follow_redirects'] = false; + } else { + $options['redirects'] = $parsed_args['redirection']; + } + + // Use byte limit, if we can. + if ( isset( $parsed_args['limit_response_size'] ) ) { + $options['max_bytes'] = $parsed_args['limit_response_size']; + } + + // If we've got cookies, use and convert them to Requests_Cookie. + if ( ! empty( $parsed_args['cookies'] ) ) { + $options['cookies'] = WP_Http::normalize_cookies( $parsed_args['cookies'] ); + } + + // SSL certificate handling. + if ( ! $parsed_args['sslverify'] ) { + $options['verify'] = false; + $options['verifyname'] = false; + } else { + $options['verify'] = $parsed_args['sslcertificates']; + } + + // All non-GET/HEAD requests should put the arguments in the form body. + if ( 'HEAD' !== $type && 'GET' !== $type ) { + $options['data_format'] = 'body'; + } + + /** + * Filters whether SSL should be verified for non-local requests. + * + * @since 2.8.0 + * @since 5.1.0 The `$url` parameter was added. + * + * @param bool $ssl_verify Whether to verify the SSL connection. Default true. + * @param string $url The request URL. + */ + $options['verify'] = apply_filters( 'https_ssl_verify', $options['verify'], $url ); + + // Check for proxies. + $proxy = new WP_HTTP_Proxy(); + if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { + $options['proxy'] = new Requests_Proxy_HTTP( $proxy->host() . ':' . $proxy->port() ); + + if ( $proxy->use_authentication() ) { + $options['proxy']->use_authentication = true; + $options['proxy']->user = $proxy->username(); + $options['proxy']->pass = $proxy->password(); + } + } + + // Avoid issues where mbstring.func_overload is enabled. + mbstring_binary_safe_encoding(); + + try { + $requests_response = Requests::request( $url, $headers, $data, $type, $options ); + + // Convert the response into an array. + $http_response = new WP_HTTP_Requests_Response( $requests_response, $parsed_args['filename'] ); + $response = $http_response->to_array(); + + // Add the original object to the array. + $response['http_response'] = $http_response; + } catch ( Requests_Exception $e ) { + $response = new WP_Error( 'http_request_failed', $e->getMessage() ); + } + + reset_mbstring_encoding(); + + /** + * Fires after an HTTP API response is received and before the response is returned. + * + * @since 2.8.0 + * + * @param array|WP_Error $response HTTP response or WP_Error object. + * @param string $context Context under which the hook is fired. + * @param string $class HTTP transport used. + * @param array $parsed_args HTTP request arguments. + * @param string $url The request URL. + */ + do_action( 'http_api_debug', $response, 'response', 'Requests', $parsed_args, $url ); + if ( is_wp_error( $response ) ) { + return $response; + } + + if ( ! $parsed_args['blocking'] ) { + return array( + 'headers' => array(), + 'body' => '', + 'response' => array( + 'code' => false, + 'message' => false, + ), + 'cookies' => array(), + 'http_response' => null, + ); + } + + /** + * Filters the HTTP API response immediately before the response is returned. + * + * @since 2.9.0 + * + * @param array $response HTTP response. + * @param array $parsed_args HTTP request arguments. + * @param string $url The request URL. + */ + return apply_filters( 'http_response', $response, $parsed_args, $url ); + } + + /** + * Normalizes cookies for using in Requests. + * + * @since 4.6.0 + * + * @param array $cookies Array of cookies to send with the request. + * @return Requests_Cookie_Jar Cookie holder object. + */ + public static function normalize_cookies( $cookies ) { + $cookie_jar = new Requests_Cookie_Jar(); + + foreach ( $cookies as $name => $value ) { + if ( $value instanceof WP_Http_Cookie ) { + $cookie_jar[ $value->name ] = new Requests_Cookie( $value->name, $value->value, $value->get_attributes(), array( 'host-only' => $value->host_only ) ); + } elseif ( is_scalar( $value ) ) { + $cookie_jar[ $name ] = new Requests_Cookie( $name, $value ); + } + } + + return $cookie_jar; + } + + /** + * Match redirect behaviour to browser handling. + * + * Changes 302 redirects from POST to GET to match browser handling. Per + * RFC 7231, user agents can deviate from the strict reading of the + * specification for compatibility purposes. + * + * @since 4.6.0 + * + * @param string $location URL to redirect to. + * @param array $headers Headers for the redirect. + * @param string|array $data Body to send with the request. + * @param array $options Redirect request options. + * @param Requests_Response $original Response object. + */ + public static function browser_redirect_compatibility( $location, $headers, $data, &$options, $original ) { + // Browser compatibility. + if ( 302 === $original->status_code ) { + $options['type'] = Requests::GET; + } + } + + /** + * Validate redirected URLs. + * + * @since 4.7.5 + * + * @throws Requests_Exception On unsuccessful URL validation. + * @param string $location URL to redirect to. + */ + public static function validate_redirects( $location ) { + if ( ! wp_http_validate_url( $location ) ) { + throw new Requests_Exception( __( 'A valid URL was not provided.' ), 'wp_http.redirect_failed_validation' ); + } + } + + /** + * Tests which transports are capable of supporting the request. + * + * @since 3.2.0 + * + * @param array $args Request arguments. + * @param string $url URL to Request. + * + * @return string|false Class name for the first transport that claims to support the request. + * False if no transport claims to support the request. + */ + public function _get_first_available_transport( $args, $url = null ) { + $transports = array( 'curl', 'streams' ); + + /** + * Filters which HTTP transports are available and in what order. + * + * @since 3.7.0 + * + * @param string[] $transports Array of HTTP transports to check. Default array contains + * 'curl' and 'streams', in that order. + * @param array $args HTTP request arguments. + * @param string $url The URL to request. + */ + $request_order = apply_filters( 'http_api_transports', $transports, $args, $url ); + + // Loop over each transport on each HTTP request looking for one which will serve this request's needs. + foreach ( $request_order as $transport ) { + if ( in_array( $transport, $transports ) ) { + $transport = ucfirst( $transport ); + } + $class = 'WP_Http_' . $transport; + + // Check to see if this transport is a possibility, calls the transport statically. + if ( ! call_user_func( array( $class, 'test' ), $args, $url ) ) { + continue; + } + + return $class; + } + + return false; + } + + /** + * Dispatches a HTTP request to a supporting transport. + * + * Tests each transport in order to find a transport which matches the request arguments. + * Also caches the transport instance to be used later. + * + * The order for requests is cURL, and then PHP Streams. + * + * @since 3.2.0 + * @deprecated 5.1.0 Use WP_Http::request() + * @see WP_Http::request() + * + * @staticvar array $transports + * + * @param string $url URL to Request. + * @param array $args Request arguments. + * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. + * A WP_Error instance upon error. + */ + private function _dispatch_request( $url, $args ) { + static $transports = array(); + + $class = $this->_get_first_available_transport( $args, $url ); + if ( ! $class ) { + return new WP_Error( 'http_failure', __( 'There are no HTTP transports available which can complete the requested request.' ) ); + } + + // Transport claims to support request, instantiate it and give it a whirl. + if ( empty( $transports[ $class ] ) ) { + $transports[ $class ] = new $class; + } + + $response = $transports[ $class ]->request( $url, $args ); + + /** This action is documented in wp-includes/class-http.php */ + do_action( 'http_api_debug', $response, 'response', $class, $args, $url ); + + if ( is_wp_error( $response ) ) { + return $response; + } + + /** This filter is documented in wp-includes/class-http.php */ + return apply_filters( 'http_response', $response, $args, $url ); + } + + /** + * Uses the POST HTTP method. + * + * Used for sending data that is expected to be in the body. + * + * @since 2.7.0 + * + * @param string $url The request URL. + * @param string|array $args Optional. Override the defaults. + * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. + * A WP_Error instance upon error. + */ + public function post( $url, $args = array() ) { + $defaults = array( 'method' => 'POST' ); + $parsed_args = wp_parse_args( $args, $defaults ); + return $this->request( $url, $parsed_args ); + } + + /** + * Uses the GET HTTP method. + * + * Used for sending data that is expected to be in the body. + * + * @since 2.7.0 + * + * @param string $url The request URL. + * @param string|array $args Optional. Override the defaults. + * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. + * A WP_Error instance upon error. + */ + public function get( $url, $args = array() ) { + $defaults = array( 'method' => 'GET' ); + $parsed_args = wp_parse_args( $args, $defaults ); + return $this->request( $url, $parsed_args ); + } + + /** + * Uses the HEAD HTTP method. + * + * Used for sending data that is expected to be in the body. + * + * @since 2.7.0 + * + * @param string $url The request URL. + * @param string|array $args Optional. Override the defaults. + * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. + * A WP_Error instance upon error. + */ + public function head( $url, $args = array() ) { + $defaults = array( 'method' => 'HEAD' ); + $parsed_args = wp_parse_args( $args, $defaults ); + return $this->request( $url, $parsed_args ); + } + + /** + * Parses the responses and splits the parts into headers and body. + * + * @since 2.7.0 + * + * @param string $strResponse The full response string. + * @return array { + * Array with response headers and body. + * + * @type string $headers HTTP response headers. + * @type string $body HTTP response body. + * } + */ + public static function processResponse( $strResponse ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid + $res = explode( "\r\n\r\n", $strResponse, 2 ); + + return array( + 'headers' => $res[0], + 'body' => isset( $res[1] ) ? $res[1] : '', + ); + } + + /** + * Transform header string into an array. + * + * If an array is given, then it is assumed to be raw header data with numeric keys with the + * headers as the values. No headers must be passed that were already processed. + * + * @since 2.7.0 + * + * @param string|array $headers + * @param string $url The URL that was requested. + * @return array Processed string headers. If duplicate headers are encountered, + * then a numbered array is returned as the value of that header-key. + */ + public static function processHeaders( $headers, $url = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid + // Split headers, one per array element. + if ( is_string( $headers ) ) { + // Tolerate line terminator: CRLF = LF (RFC 2616 19.3). + $headers = str_replace( "\r\n", "\n", $headers ); + /* + * Unfold folded header fields. LWS = [CRLF] 1*( SP | HT ) <US-ASCII SP, space (32)>, + * <US-ASCII HT, horizontal-tab (9)> (RFC 2616 2.2). + */ + $headers = preg_replace( '/\n[ \t]/', ' ', $headers ); + // Create the headers array. + $headers = explode( "\n", $headers ); + } + + $response = array( + 'code' => 0, + 'message' => '', + ); + + /* + * If a redirection has taken place, The headers for each page request may have been passed. + * In this case, determine the final HTTP header and parse from there. + */ + for ( $i = count( $headers ) - 1; $i >= 0; $i-- ) { + if ( ! empty( $headers[ $i ] ) && false === strpos( $headers[ $i ], ':' ) ) { + $headers = array_splice( $headers, $i ); + break; + } + } + + $cookies = array(); + $newheaders = array(); + foreach ( (array) $headers as $tempheader ) { + if ( empty( $tempheader ) ) { + continue; + } + + if ( false === strpos( $tempheader, ':' ) ) { + $stack = explode( ' ', $tempheader, 3 ); + $stack[] = ''; + list( , $response['code'], $response['message']) = $stack; + continue; + } + + list($key, $value) = explode( ':', $tempheader, 2 ); + + $key = strtolower( $key ); + $value = trim( $value ); + + if ( isset( $newheaders[ $key ] ) ) { + if ( ! is_array( $newheaders[ $key ] ) ) { + $newheaders[ $key ] = array( $newheaders[ $key ] ); + } + $newheaders[ $key ][] = $value; + } else { + $newheaders[ $key ] = $value; + } + if ( 'set-cookie' == $key ) { + $cookies[] = new WP_Http_Cookie( $value, $url ); + } + } + + // Cast the Response Code to an int. + $response['code'] = intval( $response['code'] ); + + return array( + 'response' => $response, + 'headers' => $newheaders, + 'cookies' => $cookies, + ); + } + + /** + * Takes the arguments for a ::request() and checks for the cookie array. + * + * If it's found, then it upgrades any basic name => value pairs to WP_Http_Cookie instances, + * which are each parsed into strings and added to the Cookie: header (within the arguments array). + * Edits the array by reference. + * + * @since 2.8.0 + * + * @param array $r Full array of args passed into ::request() + */ + public static function buildCookieHeader( &$r ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid + if ( ! empty( $r['cookies'] ) ) { + // Upgrade any name => value cookie pairs to WP_HTTP_Cookie instances. + foreach ( $r['cookies'] as $name => $value ) { + if ( ! is_object( $value ) ) { + $r['cookies'][ $name ] = new WP_Http_Cookie( + array( + 'name' => $name, + 'value' => $value, + ) + ); + } + } + + $cookies_header = ''; + foreach ( (array) $r['cookies'] as $cookie ) { + $cookies_header .= $cookie->getHeaderValue() . '; '; + } + + $cookies_header = substr( $cookies_header, 0, -2 ); + $r['headers']['cookie'] = $cookies_header; + } + } + + /** + * Decodes chunk transfer-encoding, based off the HTTP 1.1 specification. + * + * Based off the HTTP http_encoding_dechunk function. + * + * @link https://tools.ietf.org/html/rfc2616#section-19.4.6 Process for chunked decoding. + * + * @since 2.7.0 + * + * @param string $body Body content. + * @return string Chunked decoded body on success or raw body on failure. + */ + public static function chunkTransferDecode( $body ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid + // The body is not chunked encoded or is malformed. + if ( ! preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', trim( $body ) ) ) { + return $body; + } + + $parsed_body = ''; + + // We'll be altering $body, so need a backup in case of error. + $body_original = $body; + + while ( true ) { + $has_chunk = (bool) preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', $body, $match ); + if ( ! $has_chunk || empty( $match[1] ) ) { + return $body_original; + } + + $length = hexdec( $match[1] ); + $chunk_length = strlen( $match[0] ); + + // Parse out the chunk of data. + $parsed_body .= substr( $body, $chunk_length, $length ); + + // Remove the chunk from the raw data. + $body = substr( $body, $length + $chunk_length ); + + // End of the document. + if ( '0' === trim( $body ) ) { + return $parsed_body; + } + } + } + + /** + * Determines whether an HTTP API request to the given URL should be blocked. + * + * Those who are behind a proxy and want to prevent access to certain hosts may do so. This will + * prevent plugins from working and core functionality, if you don't include `api.wordpress.org`. + * + * You block external URL requests by defining `WP_HTTP_BLOCK_EXTERNAL` as true in your `wp-config.php` + * file and this will only allow localhost and your site to make requests. The constant + * `WP_ACCESSIBLE_HOSTS` will allow additional hosts to go through for requests. The format of the + * `WP_ACCESSIBLE_HOSTS` constant is a comma separated list of hostnames to allow, wildcard domains + * are supported, eg `*.wordpress.org` will allow for all subdomains of `wordpress.org` to be contacted. + * + * @since 2.8.0 + * @link https://core.trac.wordpress.org/ticket/8927 Allow preventing external requests. + * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_ACCESSIBLE_HOSTS + * + * @staticvar array|null $accessible_hosts + * @staticvar array $wildcard_regex + * + * @param string $uri URI of url. + * @return bool True to block, false to allow. + */ + public function block_request( $uri ) { + // We don't need to block requests, because nothing is blocked. + if ( ! defined( 'WP_HTTP_BLOCK_EXTERNAL' ) || ! WP_HTTP_BLOCK_EXTERNAL ) { + return false; + } + + $check = parse_url( $uri ); + if ( ! $check ) { + return true; + } + + $home = parse_url( get_option( 'siteurl' ) ); + + // Don't block requests back to ourselves by default. + if ( 'localhost' == $check['host'] || ( isset( $home['host'] ) && $home['host'] == $check['host'] ) ) { + /** + * Filters whether to block local HTTP API requests. + * + * A local request is one to `localhost` or to the same host as the site itself. + * + * @since 2.8.0 + * + * @param bool $block Whether to block local requests. Default false. + */ + return apply_filters( 'block_local_requests', false ); + } + + if ( ! defined( 'WP_ACCESSIBLE_HOSTS' ) ) { + return true; + } + + static $accessible_hosts = null; + static $wildcard_regex = array(); + if ( null === $accessible_hosts ) { + $accessible_hosts = preg_split( '|,\s*|', WP_ACCESSIBLE_HOSTS ); + + if ( false !== strpos( WP_ACCESSIBLE_HOSTS, '*' ) ) { + $wildcard_regex = array(); + foreach ( $accessible_hosts as $host ) { + $wildcard_regex[] = str_replace( '\*', '.+', preg_quote( $host, '/' ) ); + } + $wildcard_regex = '/^(' . implode( '|', $wildcard_regex ) . ')$/i'; + } + } + + if ( ! empty( $wildcard_regex ) ) { + return ! preg_match( $wildcard_regex, $check['host'] ); + } else { + return ! in_array( $check['host'], $accessible_hosts ); // Inverse logic, if it's in the array, then don't block it. + } + + } + + /** + * Used as a wrapper for PHP's parse_url() function that handles edgecases in < PHP 5.4.7. + * + * @deprecated 4.4.0 Use wp_parse_url() + * @see wp_parse_url() + * + * @param string $url The URL to parse. + * @return bool|array False on failure; Array of URL components on success; + * See parse_url()'s return values. + */ + protected static function parse_url( $url ) { + _deprecated_function( __METHOD__, '4.4.0', 'wp_parse_url()' ); + return wp_parse_url( $url ); + } + + /** + * Converts a relative URL to an absolute URL relative to a given URL. + * + * If an Absolute URL is provided, no processing of that URL is done. + * + * @since 3.4.0 + * + * @param string $maybe_relative_path The URL which might be relative. + * @param string $url The URL which $maybe_relative_path is relative to. + * @return string An Absolute URL, in a failure condition where the URL cannot be parsed, the relative URL will be returned. + */ + public static function make_absolute_url( $maybe_relative_path, $url ) { + if ( empty( $url ) ) { + return $maybe_relative_path; + } + + $url_parts = wp_parse_url( $url ); + if ( ! $url_parts ) { + return $maybe_relative_path; + } + + $relative_url_parts = wp_parse_url( $maybe_relative_path ); + if ( ! $relative_url_parts ) { + return $maybe_relative_path; + } + + // Check for a scheme on the 'relative' URL. + if ( ! empty( $relative_url_parts['scheme'] ) ) { + return $maybe_relative_path; + } + + $absolute_path = $url_parts['scheme'] . '://'; + + // Schemeless URLs will make it this far, so we check for a host in the relative URL + // and convert it to a protocol-URL. + if ( isset( $relative_url_parts['host'] ) ) { + $absolute_path .= $relative_url_parts['host']; + if ( isset( $relative_url_parts['port'] ) ) { + $absolute_path .= ':' . $relative_url_parts['port']; + } + } else { + $absolute_path .= $url_parts['host']; + if ( isset( $url_parts['port'] ) ) { + $absolute_path .= ':' . $url_parts['port']; + } + } + + // Start off with the absolute URL path. + $path = ! empty( $url_parts['path'] ) ? $url_parts['path'] : '/'; + + // If it's a root-relative path, then great. + if ( ! empty( $relative_url_parts['path'] ) && '/' == $relative_url_parts['path'][0] ) { + $path = $relative_url_parts['path']; + + // Else it's a relative path. + } elseif ( ! empty( $relative_url_parts['path'] ) ) { + // Strip off any file components from the absolute path. + $path = substr( $path, 0, strrpos( $path, '/' ) + 1 ); + + // Build the new path. + $path .= $relative_url_parts['path']; + + // Strip all /path/../ out of the path. + while ( strpos( $path, '../' ) > 1 ) { + $path = preg_replace( '![^/]+/\.\./!', '', $path ); + } + + // Strip any final leading ../ from the path. + $path = preg_replace( '!^/(\.\./)+!', '', $path ); + } + + // Add the query string. + if ( ! empty( $relative_url_parts['query'] ) ) { + $path .= '?' . $relative_url_parts['query']; + } + + return $absolute_path . '/' . ltrim( $path, '/' ); + } + + /** + * Handles an HTTP redirect and follows it if appropriate. + * + * @since 3.7.0 + * + * @param string $url The URL which was requested. + * @param array $args The arguments which were used to make the request. + * @param array $response The response of the HTTP request. + * @return array|false|WP_Error An HTTP API response array if the redirect is successfully followed, + * false if no redirect is present, or a WP_Error object if there's an error. + */ + public static function handle_redirects( $url, $args, $response ) { + // If no redirects are present, or, redirects were not requested, perform no action. + if ( ! isset( $response['headers']['location'] ) || 0 === $args['_redirection'] ) { + return false; + } + + // Only perform redirections on redirection http codes. + if ( $response['response']['code'] > 399 || $response['response']['code'] < 300 ) { + return false; + } + + // Don't redirect if we've run out of redirects. + if ( $args['redirection']-- <= 0 ) { + return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); + } + + $redirect_location = $response['headers']['location']; + + // If there were multiple Location headers, use the last header specified. + if ( is_array( $redirect_location ) ) { + $redirect_location = array_pop( $redirect_location ); + } + + $redirect_location = WP_Http::make_absolute_url( $redirect_location, $url ); + + // POST requests should not POST to a redirected location. + if ( 'POST' == $args['method'] ) { + if ( in_array( $response['response']['code'], array( 302, 303 ) ) ) { + $args['method'] = 'GET'; + } + } + + // Include valid cookies in the redirect process. + if ( ! empty( $response['cookies'] ) ) { + foreach ( $response['cookies'] as $cookie ) { + if ( $cookie->test( $redirect_location ) ) { + $args['cookies'][] = $cookie; + } + } + } + + return wp_remote_request( $redirect_location, $args ); + } + + /** + * Determines if a specified string represents an IP address or not. + * + * This function also detects the type of the IP address, returning either + * '4' or '6' to represent a IPv4 and IPv6 address respectively. + * This does not verify if the IP is a valid IP, only that it appears to be + * an IP address. + * + * @link http://home.deds.nl/~aeron/regex/ for IPv6 regex. + * + * @since 3.7.0 + * + * @param string $maybe_ip A suspected IP address. + * @return integer|bool Upon success, '4' or '6' to represent a IPv4 or IPv6 address, false upon failure + */ + public static function is_ip_address( $maybe_ip ) { + if ( preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $maybe_ip ) ) { + return 4; + } + + if ( false !== strpos( $maybe_ip, ':' ) && preg_match( '/^(((?=.*(::))(?!.*\3.+\3))\3?|([\dA-F]{1,4}(\3|:\b|$)|\2))(?4){5}((?4){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i', trim( $maybe_ip, ' []' ) ) ) { + return 6; + } + + return false; + } + +} diff --git a/wp-includes/class-json.php b/wp-includes/class-json.php new file mode 100644 index 0000000..7df464c --- /dev/null +++ b/wp-includes/class-json.php @@ -0,0 +1,1037 @@ +<?php +_deprecated_file( basename( __FILE__ ), '5.3.0', null, 'The PHP native JSON extension is now a requirement.' ); + +if ( ! class_exists( 'Services_JSON' ) ) : +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ +/** + * Converts to and from JSON format. + * + * JSON (JavaScript Object Notation) is a lightweight data-interchange + * format. It is easy for humans to read and write. It is easy for machines + * to parse and generate. It is based on a subset of the JavaScript + * Programming Language, Standard ECMA-262 3rd Edition - December 1999. + * This feature can also be found in Python. JSON is a text format that is + * completely language independent but uses conventions that are familiar + * to programmers of the C-family of languages, including C, C++, C#, Java, + * JavaScript, Perl, TCL, and many others. These properties make JSON an + * ideal data-interchange language. + * + * This package provides a simple encoder and decoder for JSON notation. It + * is intended for use with client-side JavaScript applications that make + * use of HTTPRequest to perform server communication functions - data can + * be encoded into JSON notation for use in a client-side javaScript, or + * decoded from incoming JavaScript requests. JSON format is native to + * JavaScript, and can be directly eval()'ed with no further parsing + * overhead + * + * All strings should be in ASCII or UTF-8 format! + * + * LICENSE: Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: Redistributions of source code must retain the + * above copyright notice, this list of conditions and the following + * disclaimer. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * @category + * @package Services_JSON + * @author Michal Migurski <mike-json@teczno.com> + * @author Matt Knapp <mdknapp[at]gmail[dot]com> + * @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com> + * @copyright 2005 Michal Migurski + * @version CVS: $Id: JSON.php 305040 2010-11-02 23:19:03Z alan_k $ + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR', 3); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 5); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_SUPPRESS_ERRORS', 32); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_USE_TO_JSON', 64); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * <code> + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complex value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * </code> + */ +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param int $use object behavior flags; combine with boolean-OR + * + * possible values: + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays + * instead of objects in decode(). + * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. + * Values which can't be encoded (e.g. resources) + * appear as NULL instead of throwing errors. + * By default, a deeply-nested resource will + * bubble up with an error, so all return values + * from encode() should be checked with isError() + * - SERVICES_JSON_USE_TO_JSON: call toJSON when serializing objects + * It serializes the return value from the toJSON call rather + * than the object itself, toJSON can return associative arrays, + * strings or numbers, if you return an object, make sure it does + * not have a toJSON method, otherwise an error will occur. + */ + function __construct( $use = 0 ) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + $this->use = $use; + $this->_mb_strlen = function_exists('mb_strlen'); + $this->_mb_convert_encoding = function_exists('mb_convert_encoding'); + $this->_mb_substr = function_exists('mb_substr'); + } + + /** + * PHP4 constructor. + * + * @deprecated 5.3.0 Use __construct() instead. + * + * @see Services_JSON::__construct() + */ + public function Services_JSON( $use = 0 ) { + _deprecated_constructor( 'Services_JSON', '5.3.0', get_class( $this ) ); + self::__construct( $use ); + } + // private - cache the mbstring lookup results.. + var $_mb_strlen = false; + var $_mb_substr = false; + var $_mb_convert_encoding = false; + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + // oh please oh please oh please oh please oh please + if($this->_mb_convert_encoding) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibyte string extension. + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + // oh please oh please oh please oh please oh please + if($this->_mb_convert_encoding) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch($this->strlen8($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8[0]) >> 2)) + . chr((0xC0 & (ord($utf8[0]) << 6)) + | (0x3F & ord($utf8[1]))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8[0]) << 4)) + | (0x0F & (ord($utf8[1]) >> 2))) + . chr((0xC0 & (ord($utf8[1]) << 6)) + | (0x7F & ord($utf8[2]))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format (and sends JSON Header) + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a string, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encode($var) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + header('Content-type: application/json'); + return $this->encodeUnsafe($var); + } + /** + * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow XSS!!!!) + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a string, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encodeUnsafe($var) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + // see bug #16908 - regarding numeric locale printing + $lc = setlocale(LC_NUMERIC, 0); + setlocale(LC_NUMERIC, 'C'); + $ret = $this->_encode($var); + setlocale(LC_NUMERIC, $lc); + return $ret; + + } + /** + * PRIVATE CODE that does the work of encodes an arbitrary variable into JSON format + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a string, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function _encode($var) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = $this->strlen8($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var[$c]); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var[$c]; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var[$c]; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + if ($c+1 >= $strlen_var) { + $c += 1; + $ascii .= '?'; + break; + } + + $char = pack('C*', $ord_var_c, ord($var[$c + 1])); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + if ($c+2 >= $strlen_var) { + $c += 2; + $ascii .= '?'; + break; + } + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + @ord($var[$c + 1]), + @ord($var[$c + 2])); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + if ($c+3 >= $strlen_var) { + $c += 3; + $ascii .= '?'; + break; + } + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var[$c + 1]), + ord($var[$c + 2]), + ord($var[$c + 3])); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + if ($c+4 >= $strlen_var) { + $c += 4; + $ascii .= '?'; + break; + } + $char = pack('C*', $ord_var_c, + ord($var[$c + 1]), + ord($var[$c + 2]), + ord($var[$c + 3]), + ord($var[$c + 4])); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + if ($c+5 >= $strlen_var) { + $c += 5; + $ascii .= '?'; + break; + } + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var[$c + 1]), + ord($var[$c + 2]), + ord($var[$c + 3]), + ord($var[$c + 4]), + ord($var[$c + 5])); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + $properties = array_map(array($this, 'name_value'), + array_keys($var), + array_values($var)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + } + + // treat it like a regular array + $elements = array_map(array($this, '_encode'), $var); + + foreach($elements as $element) { + if(Services_JSON::isError($element)) { + return $element; + } + } + + return '[' . join(',', $elements) . ']'; + + case 'object': + + // support toJSON methods. + if (($this->use & SERVICES_JSON_USE_TO_JSON) && method_exists($var, 'toJSON')) { + // this may end up allowing unlimited recursion + // so we check the return value to make sure it's not got the same method. + $recode = $var->toJSON(); + + if (method_exists($recode, 'toJSON')) { + + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(get_class($var). + " toJSON returned an object with a toJSON method."); + + } + + return $this->_encode( $recode ); + } + + $vars = get_object_vars($var); + + $properties = array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + + default: + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + $encoded_value = $this->_encode($value); + + if(Services_JSON::isError($encoded_value)) { + return $encoded_value; + } + + return $this->_encode(strval($name)) . ':' . $encoded_value; + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + $m = array(); + + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = $this->substr8($str, 0, 1); + $chrs = $this->substr8($str, 1, -1); + $utf8 = ''; + $strlen_chrs = $this->strlen8($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); + $ord_chrs_c = ord($chrs[$c]); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs[++$c]; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec($this->substr8($chrs, ($c + 2), 2))) + . chr(hexdec($this->substr8($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs[$c]; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= $this->substr8($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= $this->substr8($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= $this->substr8($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= $this->substr8($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= $this->substr8($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str[0] == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = $this->substr8($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = $this->strlen8($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = $this->substr8($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + $parts = array(); + + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c])); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs[$c] == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + (($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) { + // found a quote, we're in a string, and it's not escaped + // we know that it's not escaped because there is _not_ an + // odd number of backslashes at the end of the string so far + array_pop($stk); + //print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs[$c] == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs[$c] == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + + /** + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @todo Ultimately, this should just call PEAR::isError() + */ + function isError($data, $code = null) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + if (class_exists('pear')) { + return PEAR::isError($data, $code); + } elseif (is_object($data) && (get_class($data) == 'services_json_error' || + is_subclass_of($data, 'services_json_error'))) { + return true; + } + + return false; + } + + /** + * Calculates length of string in bytes + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param string + * @return integer length + */ + function strlen8( $str ) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + if ( $this->_mb_strlen ) { + return mb_strlen( $str, "8bit" ); + } + return strlen( $str ); + } + + /** + * Returns part of a string, interpreting $start and $length as number of bytes. + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + * + * @param string + * @param integer start + * @param integer length + * @return integer length + */ + function substr8( $string, $start, $length=false ) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + if ( $length === false ) { + $length = $this->strlen8( $string ) - $start; + } + if ( $this->_mb_substr ) { + return mb_substr( $string, $start, $length, "8bit" ); + } + return substr( $string, $start, $length ); + } + +} + +if (class_exists('PEAR_Error')) { + + class Services_JSON_Error extends PEAR_Error + { + /** + * PHP5 constructor. + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + */ + function __construct($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + + parent::PEAR_Error($message, $code, $mode, $options, $userinfo); + } + + /** + * PHP4 constructor. + * + * @deprecated 5.3.0 Use __construct() instead. + * + * @see Services_JSON_Error::__construct() + */ + public function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) { + _deprecated_constructor( 'Services_JSON_Error', '5.3.0', get_class( $this ) ); + self::__construct($message, $code, $mode, $options, $userinfo); + } + } + +} else { + + /** + * @todo Ultimately, this class shall be descended from PEAR_Error + */ + class Services_JSON_Error + { + /** + * PHP5 constructor. + * + * @deprecated 5.3.0 Use the PHP native JSON extension instead. + */ + function __construct( $message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null ) + { + _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); + } + + /** + * PHP4 constructor. + * + * @deprecated 5.3.0 Use __construct() instead. + * + * @see Services_JSON_Error::__construct() + */ + public function Services_JSON_Error( $message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null ) { + _deprecated_constructor( 'Services_JSON_Error', '5.3.0', get_class( $this ) ); + self::__construct( $message, $code, $mode, $options, $userinfo ); + } + } + +} + +endif; diff --git a/wp-includes/class-oembed.php b/wp-includes/class-oembed.php new file mode 100644 index 0000000..747fffa --- /dev/null +++ b/wp-includes/class-oembed.php @@ -0,0 +1,15 @@ +<?php +/** + * API for fetching the HTML to embed remote content based on a provided URL. + * + * This file is deprecated, use 'wp-includes/class-wp-oembed.php' instead. + * + * @deprecated 5.3.0 + * @package WordPress + * @subpackage oEmbed + */ + +_deprecated_file( basename( __FILE__ ), '5.3.0', 'wp-includes/class-wp-oembed.php' ); + +/** WP_oEmbed class */ +require_once ABSPATH . 'wp-includes/class-wp-oembed.php'; diff --git a/wp-includes/class-phpass.php b/wp-includes/class-phpass.php new file mode 100644 index 0000000..8fcab44 --- /dev/null +++ b/wp-includes/class-phpass.php @@ -0,0 +1,276 @@ +<?php +/** + * Portable PHP password hashing framework. + * @package phpass + * @since 2.5.0 + * @version 0.3 / WordPress + * @link https://www.openwall.com/phpass/ + */ + +# +# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in +# the public domain. Revised in subsequent years, still public domain. +# +# There's absolutely no warranty. +# +# Please be sure to update the Version line if you edit this file in any way. +# It is suggested that you leave the main version number intact, but indicate +# your project name (after the slash) and add your own revision information. +# +# Please do not change the "private" password hashing method implemented in +# here, thereby making your hashes incompatible. However, if you must, please +# change the hash type identifier (the "$P$") to something different. +# +# Obviously, since this code is in the public domain, the above are not +# requirements (there can be none), but merely suggestions. +# + +/** + * Portable PHP password hashing framework. + * + * @package phpass + * @version 0.3 / WordPress + * @link https://www.openwall.com/phpass/ + * @since 2.5.0 + */ +class PasswordHash { + var $itoa64; + var $iteration_count_log2; + var $portable_hashes; + var $random_state; + + /** + * PHP5 constructor. + */ + function __construct( $iteration_count_log2, $portable_hashes ) + { + $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + + if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31) + $iteration_count_log2 = 8; + $this->iteration_count_log2 = $iteration_count_log2; + + $this->portable_hashes = $portable_hashes; + + $this->random_state = microtime() . uniqid(rand(), TRUE); // removed getmypid() for compatibility reasons + } + + /** + * PHP4 constructor. + */ + public function PasswordHash( $iteration_count_log2, $portable_hashes ) { + self::__construct( $iteration_count_log2, $portable_hashes ); + } + + function get_random_bytes($count) + { + $output = ''; + if ( @is_readable('/dev/urandom') && + ($fh = @fopen('/dev/urandom', 'rb'))) { + $output = fread($fh, $count); + fclose($fh); + } + + if (strlen($output) < $count) { + $output = ''; + for ($i = 0; $i < $count; $i += 16) { + $this->random_state = + md5(microtime() . $this->random_state); + $output .= + pack('H*', md5($this->random_state)); + } + $output = substr($output, 0, $count); + } + + return $output; + } + + function encode64($input, $count) + { + $output = ''; + $i = 0; + do { + $value = ord($input[$i++]); + $output .= $this->itoa64[$value & 0x3f]; + if ($i < $count) + $value |= ord($input[$i]) << 8; + $output .= $this->itoa64[($value >> 6) & 0x3f]; + if ($i++ >= $count) + break; + if ($i < $count) + $value |= ord($input[$i]) << 16; + $output .= $this->itoa64[($value >> 12) & 0x3f]; + if ($i++ >= $count) + break; + $output .= $this->itoa64[($value >> 18) & 0x3f]; + } while ($i < $count); + + return $output; + } + + function gensalt_private($input) + { + $output = '$P$'; + $output .= $this->itoa64[min($this->iteration_count_log2 + + ((PHP_VERSION >= '5') ? 5 : 3), 30)]; + $output .= $this->encode64($input, 6); + + return $output; + } + + function crypt_private($password, $setting) + { + $output = '*0'; + if (substr($setting, 0, 2) == $output) + $output = '*1'; + + $id = substr($setting, 0, 3); + # We use "$P$", phpBB3 uses "$H$" for the same thing + if ($id != '$P$' && $id != '$H$') + return $output; + + $count_log2 = strpos($this->itoa64, $setting[3]); + if ($count_log2 < 7 || $count_log2 > 30) + return $output; + + $count = 1 << $count_log2; + + $salt = substr($setting, 4, 8); + if (strlen($salt) != 8) + return $output; + + # We're kind of forced to use MD5 here since it's the only + # cryptographic primitive available in all versions of PHP + # currently in use. To implement our own low-level crypto + # in PHP would result in much worse performance and + # consequently in lower iteration counts and hashes that are + # quicker to crack (by non-PHP code). + if (PHP_VERSION >= '5') { + $hash = md5($salt . $password, TRUE); + do { + $hash = md5($hash . $password, TRUE); + } while (--$count); + } else { + $hash = pack('H*', md5($salt . $password)); + do { + $hash = pack('H*', md5($hash . $password)); + } while (--$count); + } + + $output = substr($setting, 0, 12); + $output .= $this->encode64($hash, 16); + + return $output; + } + + function gensalt_extended($input) + { + $count_log2 = min($this->iteration_count_log2 + 8, 24); + # This should be odd to not reveal weak DES keys, and the + # maximum valid value is (2**24 - 1) which is odd anyway. + $count = (1 << $count_log2) - 1; + + $output = '_'; + $output .= $this->itoa64[$count & 0x3f]; + $output .= $this->itoa64[($count >> 6) & 0x3f]; + $output .= $this->itoa64[($count >> 12) & 0x3f]; + $output .= $this->itoa64[($count >> 18) & 0x3f]; + + $output .= $this->encode64($input, 3); + + return $output; + } + + function gensalt_blowfish($input) + { + # This one needs to use a different order of characters and a + # different encoding scheme from the one in encode64() above. + # We care because the last character in our encoded string will + # only represent 2 bits. While two known implementations of + # bcrypt will happily accept and correct a salt string which + # has the 4 unused bits set to non-zero, we do not want to take + # chances and we also do not want to waste an additional byte + # of entropy. + $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + $output = '$2a$'; + $output .= chr(ord('0') + $this->iteration_count_log2 / 10); + $output .= chr(ord('0') + $this->iteration_count_log2 % 10); + $output .= '$'; + + $i = 0; + do { + $c1 = ord($input[$i++]); + $output .= $itoa64[$c1 >> 2]; + $c1 = ($c1 & 0x03) << 4; + if ($i >= 16) { + $output .= $itoa64[$c1]; + break; + } + + $c2 = ord($input[$i++]); + $c1 |= $c2 >> 4; + $output .= $itoa64[$c1]; + $c1 = ($c2 & 0x0f) << 2; + + $c2 = ord($input[$i++]); + $c1 |= $c2 >> 6; + $output .= $itoa64[$c1]; + $output .= $itoa64[$c2 & 0x3f]; + } while (1); + + return $output; + } + + function HashPassword($password) + { + if ( strlen( $password ) > 4096 ) { + return '*'; + } + + $random = ''; + + if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) { + $random = $this->get_random_bytes(16); + $hash = + crypt($password, $this->gensalt_blowfish($random)); + if (strlen($hash) == 60) + return $hash; + } + + if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) { + if (strlen($random) < 3) + $random = $this->get_random_bytes(3); + $hash = + crypt($password, $this->gensalt_extended($random)); + if (strlen($hash) == 20) + return $hash; + } + + if (strlen($random) < 6) + $random = $this->get_random_bytes(6); + $hash = + $this->crypt_private($password, + $this->gensalt_private($random)); + if (strlen($hash) == 34) + return $hash; + + # Returning '*' on error is safe here, but would _not_ be safe + # in a crypt(3)-like function used _both_ for generating new + # hashes and for validating passwords against existing hashes. + return '*'; + } + + function CheckPassword($password, $stored_hash) + { + if ( strlen( $password ) > 4096 ) { + return false; + } + + $hash = $this->crypt_private($password, $stored_hash); + if ($hash[0] == '*') + $hash = crypt($password, $stored_hash); + + return $hash === $stored_hash; + } +} \ No newline at end of file diff --git a/wp-includes/class-phpmailer.php b/wp-includes/class-phpmailer.php new file mode 100644 index 0000000..30754a4 --- /dev/null +++ b/wp-includes/class-phpmailer.php @@ -0,0 +1,4062 @@ +<?php +/** + * PHPMailer - PHP email creation and transport class. + * PHP Version 5 + * @package PHPMailer + * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project + * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk> + * @author Jim Jagielski (jimjag) <jimjag@gmail.com> + * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2014 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +/** + * PHPMailer - PHP email creation and transport class. + * @package PHPMailer + * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk> + * @author Jim Jagielski (jimjag) <jimjag@gmail.com> + * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> + * @author Brent R. Matzelle (original founder) + */ +class PHPMailer +{ + /** + * The PHPMailer Version number. + * @var string + */ + public $Version = '5.2.27'; + + /** + * Email priority. + * Options: null (default), 1 = High, 3 = Normal, 5 = low. + * When null, the header is not set at all. + * @var integer + */ + public $Priority = null; + + /** + * The character set of the message. + * @var string + */ + public $CharSet = 'iso-8859-1'; + + /** + * The MIME Content-type of the message. + * @var string + */ + public $ContentType = 'text/plain'; + + /** + * The message encoding. + * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". + * @var string + */ + public $Encoding = '8bit'; + + /** + * Holds the most recent mailer error message. + * @var string + */ + public $ErrorInfo = ''; + + /** + * The From email address for the message. + * @var string + */ + public $From = 'root@localhost'; + + /** + * The From name of the message. + * @var string + */ + public $FromName = 'Root User'; + + /** + * The Sender email (Return-Path) of the message. + * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode. + * @var string + */ + public $Sender = ''; + + /** + * The Return-Path of the message. + * If empty, it will be set to either From or Sender. + * @var string + * @deprecated Email senders should never set a return-path header; + * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything. + * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference + */ + public $ReturnPath = ''; + + /** + * The Subject of the message. + * @var string + */ + public $Subject = ''; + + /** + * An HTML or plain text message body. + * If HTML then call isHTML(true). + * @var string + */ + public $Body = ''; + + /** + * The plain-text message body. + * This body can be read by mail clients that do not have HTML email + * capability such as mutt & Eudora. + * Clients that can read HTML will view the normal Body. + * @var string + */ + public $AltBody = ''; + + /** + * An iCal message part body. + * Only supported in simple alt or alt_inline message types + * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator + * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ + * @link http://kigkonsult.se/iCalcreator/ + * @var string + */ + public $Ical = ''; + + /** + * The complete compiled MIME message body. + * @access protected + * @var string + */ + protected $MIMEBody = ''; + + /** + * The complete compiled MIME message headers. + * @var string + * @access protected + */ + protected $MIMEHeader = ''; + + /** + * Extra headers that createHeader() doesn't fold in. + * @var string + * @access protected + */ + protected $mailHeader = ''; + + /** + * Word-wrap the message body to this number of chars. + * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. + * @var integer + */ + public $WordWrap = 0; + + /** + * Which method to use to send mail. + * Options: "mail", "sendmail", or "smtp". + * @var string + */ + public $Mailer = 'mail'; + + /** + * The path to the sendmail program. + * @var string + */ + public $Sendmail = '/usr/sbin/sendmail'; + + /** + * Whether mail() uses a fully sendmail-compatible MTA. + * One which supports sendmail's "-oi -f" options. + * @var boolean + */ + public $UseSendmailOptions = true; + + /** + * Path to PHPMailer plugins. + * Useful if the SMTP class is not in the PHP include path. + * @var string + * @deprecated Should not be needed now there is an autoloader. + */ + public $PluginDir = ''; + + /** + * The email address that a reading confirmation should be sent to, also known as read receipt. + * @var string + */ + public $ConfirmReadingTo = ''; + + /** + * The hostname to use in the Message-ID header and as default HELO string. + * If empty, PHPMailer attempts to find one with, in order, + * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value + * 'localhost.localdomain'. + * @var string + */ + public $Hostname = ''; + + /** + * An ID to be used in the Message-ID header. + * If empty, a unique id will be generated. + * You can set your own, but it must be in the format "<id@domain>", + * as defined in RFC5322 section 3.6.4 or it will be ignored. + * @see https://tools.ietf.org/html/rfc5322#section-3.6.4 + * @var string + */ + public $MessageID = ''; + + /** + * The message Date to be used in the Date header. + * If empty, the current date will be added. + * @var string + */ + public $MessageDate = ''; + + /** + * SMTP hosts. + * Either a single hostname or multiple semicolon-delimited hostnames. + * You can also specify a different port + * for each host by using this format: [hostname:port] + * (e.g. "smtp1.example.com:25;smtp2.example.com"). + * You can also specify encryption type, for example: + * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). + * Hosts will be tried in order. + * @var string + */ + public $Host = 'localhost'; + + /** + * The default SMTP server port. + * @var integer + * @TODO Why is this needed when the SMTP class takes care of it? + */ + public $Port = 25; + + /** + * The SMTP HELO of the message. + * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find + * one with the same method described above for $Hostname. + * @var string + * @see PHPMailer::$Hostname + */ + public $Helo = ''; + + /** + * What kind of encryption to use on the SMTP connection. + * Options: '', 'ssl' or 'tls' + * @var string + */ + public $SMTPSecure = ''; + + /** + * Whether to enable TLS encryption automatically if a server supports it, + * even if `SMTPSecure` is not set to 'tls'. + * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. + * @var boolean + */ + public $SMTPAutoTLS = true; + + /** + * Whether to use SMTP authentication. + * Uses the Username and Password properties. + * @var boolean + * @see PHPMailer::$Username + * @see PHPMailer::$Password + */ + public $SMTPAuth = false; + + /** + * Options array passed to stream_context_create when connecting via SMTP. + * @var array + */ + public $SMTPOptions = array(); + + /** + * SMTP username. + * @var string + */ + public $Username = ''; + + /** + * SMTP password. + * @var string + */ + public $Password = ''; + + /** + * SMTP auth type. + * Options are CRAM-MD5, LOGIN, PLAIN, attempted in that order if not specified + * @var string + */ + public $AuthType = ''; + + /** + * SMTP realm. + * Used for NTLM auth + * @var string + */ + public $Realm = ''; + + /** + * SMTP workstation. + * Used for NTLM auth + * @var string + */ + public $Workstation = ''; + + /** + * The SMTP server timeout in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 + * @var integer + */ + public $Timeout = 300; + + /** + * SMTP class debug output mode. + * Debug output level. + * Options: + * * `0` No output + * * `1` Commands + * * `2` Data and commands + * * `3` As 2 plus connection status + * * `4` Low-level data output + * @var integer + * @see SMTP::$do_debug + */ + public $SMTPDebug = 0; + + /** + * How to handle debug output. + * Options: + * * `echo` Output plain-text as-is, appropriate for CLI + * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output + * * `error_log` Output to error log as configured in php.ini + * + * Alternatively, you can provide a callable expecting two params: a message string and the debug level: + * <code> + * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; + * </code> + * @var string|callable + * @see SMTP::$Debugoutput + */ + public $Debugoutput = 'echo'; + + /** + * Whether to keep SMTP connection open after each message. + * If this is set to true then to close the connection + * requires an explicit call to smtpClose(). + * @var boolean + */ + public $SMTPKeepAlive = false; + + /** + * Whether to split multiple to addresses into multiple messages + * or send them all in one message. + * Only supported in `mail` and `sendmail` transports, not in SMTP. + * @var boolean + */ + public $SingleTo = false; + + /** + * Storage for addresses when SingleTo is enabled. + * @var array + * @TODO This should really not be public + */ + public $SingleToArray = array(); + + /** + * Whether to generate VERP addresses on send. + * Only applicable when sending via SMTP. + * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path + * @link http://www.postfix.org/VERP_README.html Postfix VERP info + * @var boolean + */ + public $do_verp = false; + + /** + * Whether to allow sending messages with an empty body. + * @var boolean + */ + public $AllowEmpty = false; + + /** + * The default line ending. + * @note The default remains "\n". We force CRLF where we know + * it must be used via self::CRLF. + * @var string + */ + public $LE = "\n"; + + /** + * DKIM selector. + * @var string + */ + public $DKIM_selector = ''; + + /** + * DKIM Identity. + * Usually the email address used as the source of the email. + * @var string + */ + public $DKIM_identity = ''; + + /** + * DKIM passphrase. + * Used if your key is encrypted. + * @var string + */ + public $DKIM_passphrase = ''; + + /** + * DKIM signing domain name. + * @example 'example.com' + * @var string + */ + public $DKIM_domain = ''; + + /** + * DKIM private key file path. + * @var string + */ + public $DKIM_private = ''; + + /** + * DKIM private key string. + * If set, takes precedence over `$DKIM_private`. + * @var string + */ + public $DKIM_private_string = ''; + + /** + * Callback Action function name. + * + * The function that handles the result of the send email action. + * It is called out by send() for each email sent. + * + * Value can be any php callable: http://www.php.net/is_callable + * + * Parameters: + * boolean $result result of the send action + * array $to email addresses of the recipients + * array $cc cc email addresses + * array $bcc bcc email addresses + * string $subject the subject + * string $body the email body + * string $from email address of sender + * @var string + */ + public $action_function = ''; + + /** + * What to put in the X-Mailer header. + * Options: An empty string for PHPMailer default, whitespace for none, or a string to use + * @var string + */ + public $XMailer = ''; + + /** + * Which validator to use by default when validating email addresses. + * May be a callable to inject your own validator, but there are several built-in validators. + * @see PHPMailer::validateAddress() + * @var string|callable + * @static + */ + public static $validator = 'auto'; + + /** + * An instance of the SMTP sender class. + * @var SMTP + * @access protected + */ + protected $smtp = null; + + /** + * The array of 'to' names and addresses. + * @var array + * @access protected + */ + protected $to = array(); + + /** + * The array of 'cc' names and addresses. + * @var array + * @access protected + */ + protected $cc = array(); + + /** + * The array of 'bcc' names and addresses. + * @var array + * @access protected + */ + protected $bcc = array(); + + /** + * The array of reply-to names and addresses. + * @var array + * @access protected + */ + protected $ReplyTo = array(); + + /** + * An array of all kinds of addresses. + * Includes all of $to, $cc, $bcc + * @var array + * @access protected + * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc + */ + protected $all_recipients = array(); + + /** + * An array of names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $all_recipients + * and one of $to, $cc, or $bcc. + * This array is used only for addresses with IDN. + * @var array + * @access protected + * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc + * @see PHPMailer::$all_recipients + */ + protected $RecipientsQueue = array(); + + /** + * An array of reply-to names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $ReplyTo. + * This array is used only for addresses with IDN. + * @var array + * @access protected + * @see PHPMailer::$ReplyTo + */ + protected $ReplyToQueue = array(); + + /** + * The array of attachments. + * @var array + * @access protected + */ + protected $attachment = array(); + + /** + * The array of custom headers. + * @var array + * @access protected + */ + protected $CustomHeader = array(); + + /** + * The most recent Message-ID (including angular brackets). + * @var string + * @access protected + */ + protected $lastMessageID = ''; + + /** + * The message's MIME type. + * @var string + * @access protected + */ + protected $message_type = ''; + + /** + * The array of MIME boundary strings. + * @var array + * @access protected + */ + protected $boundary = array(); + + /** + * The array of available languages. + * @var array + * @access protected + */ + protected $language = array(); + + /** + * The number of errors encountered. + * @var integer + * @access protected + */ + protected $error_count = 0; + + /** + * The S/MIME certificate file path. + * @var string + * @access protected + */ + protected $sign_cert_file = ''; + + /** + * The S/MIME key file path. + * @var string + * @access protected + */ + protected $sign_key_file = ''; + + /** + * The optional S/MIME extra certificates ("CA Chain") file path. + * @var string + * @access protected + */ + protected $sign_extracerts_file = ''; + + /** + * The S/MIME password for the key. + * Used only if the key is encrypted. + * @var string + * @access protected + */ + protected $sign_key_pass = ''; + + /** + * Whether to throw exceptions for errors. + * @var boolean + * @access protected + */ + protected $exceptions = false; + + /** + * Unique ID used for message ID and boundaries. + * @var string + * @access protected + */ + protected $uniqueid = ''; + + /** + * Error severity: message only, continue processing. + */ + const STOP_MESSAGE = 0; + + /** + * Error severity: message, likely ok to continue processing. + */ + const STOP_CONTINUE = 1; + + /** + * Error severity: message, plus full stop, critical error reached. + */ + const STOP_CRITICAL = 2; + + /** + * SMTP RFC standard line ending. + */ + const CRLF = "\r\n"; + + /** + * The maximum line length allowed by RFC 2822 section 2.1.1 + * @var integer + */ + const MAX_LINE_LENGTH = 998; + + /** + * Constructor. + * @param boolean $exceptions Should we throw external exceptions? + */ + public function __construct($exceptions = null) + { + if ($exceptions !== null) { + $this->exceptions = (boolean)$exceptions; + } + //Pick an appropriate debug output format automatically + $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html'); + } + + /** + * Destructor. + */ + public function __destruct() + { + //Close any open SMTP connection nicely + $this->smtpClose(); + } + + /** + * Call mail() in a safe_mode-aware fashion. + * Also, unless sendmail_path points to sendmail (or something that + * claims to be sendmail), don't pass params (not a perfect fix, + * but it will do) + * @param string $to To + * @param string $subject Subject + * @param string $body Message Body + * @param string $header Additional Header(s) + * @param string $params Params + * @access private + * @return boolean + */ + private function mailPassthru($to, $subject, $body, $header, $params) + { + //Check overloading of mail function to avoid double-encoding + if (ini_get('mbstring.func_overload') & 1) { + $subject = $this->secureHeader($subject); + } else { + $subject = $this->encodeHeader($this->secureHeader($subject)); + } + + //Can't use additional_parameters in safe_mode, calling mail() with null params breaks + //@link http://php.net/manual/en/function.mail.php + if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) { + $result = @mail($to, $subject, $body, $header); + } else { + $result = @mail($to, $subject, $body, $header, $params); + } + return $result; + } + /** + * Output debugging info via user-defined method. + * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug). + * @see PHPMailer::$Debugoutput + * @see PHPMailer::$SMTPDebug + * @param string $str + */ + protected function edebug($str) + { + if ($this->SMTPDebug <= 0) { + return; + } + //Avoid clash with built-in function names + if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) { + call_user_func($this->Debugoutput, $str, $this->SMTPDebug); + return; + } + switch ($this->Debugoutput) { + case 'error_log': + //Don't output, just log + error_log($str); + break; + case 'html': + //Cleans up output a bit for a better looking, HTML-safe output + echo htmlentities( + preg_replace('/[\r\n]+/', '', $str), + ENT_QUOTES, + 'UTF-8' + ) + . "<br>\n"; + break; + case 'echo': + default: + //Normalize line breaks + $str = preg_replace('/\r\n?/ms', "\n", $str); + echo gmdate('Y-m-d H:i:s') . "\t" . str_replace( + "\n", + "\n \t ", + trim($str) + ) . "\n"; + } + } + + /** + * Sets message type to HTML or plain. + * @param boolean $isHtml True for HTML mode. + * @return void + */ + public function isHTML($isHtml = true) + { + if ($isHtml) { + $this->ContentType = 'text/html'; + } else { + $this->ContentType = 'text/plain'; + } + } + + /** + * Send messages using SMTP. + * @return void + */ + public function isSMTP() + { + $this->Mailer = 'smtp'; + } + + /** + * Send messages using PHP's mail() function. + * @return void + */ + public function isMail() + { + $this->Mailer = 'mail'; + } + + /** + * Send messages using $Sendmail. + * @return void + */ + public function isSendmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (!stristr($ini_sendmail_path, 'sendmail')) { + $this->Sendmail = '/usr/sbin/sendmail'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'sendmail'; + } + + /** + * Send messages using qmail. + * @return void + */ + public function isQmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (!stristr($ini_sendmail_path, 'qmail')) { + $this->Sendmail = '/var/qmail/bin/qmail-inject'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'qmail'; + } + + /** + * Add a "To" address. + * @param string $address The email address to send to + * @param string $name + * @return boolean true on success, false if address already used or invalid in some way + */ + public function addAddress($address, $name = '') + { + return $this->addOrEnqueueAnAddress('to', $address, $name); + } + + /** + * Add a "CC" address. + * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer. + * @param string $address The email address to send to + * @param string $name + * @return boolean true on success, false if address already used or invalid in some way + */ + public function addCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('cc', $address, $name); + } + + /** + * Add a "BCC" address. + * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer. + * @param string $address The email address to send to + * @param string $name + * @return boolean true on success, false if address already used or invalid in some way + */ + public function addBCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('bcc', $address, $name); + } + + /** + * Add a "Reply-To" address. + * @param string $address The email address to reply to + * @param string $name + * @return boolean true on success, false if address already used or invalid in some way + */ + public function addReplyTo($address, $name = '') + { + return $this->addOrEnqueueAnAddress('Reply-To', $address, $name); + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer + * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still + * be modified after calling this function), addition of such addresses is delayed until send(). + * Addresses that have been added already return false, but do not throw exceptions. + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address to send, resp. to reply to + * @param string $name + * @throws phpmailerException + * @return boolean true on success, false if address already used or invalid in some way + * @access protected + */ + protected function addOrEnqueueAnAddress($kind, $address, $name) + { + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + if (($pos = strrpos($address, '@')) === false) { + // At-sign is misssing. + $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address"; + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new phpmailerException($error_message); + } + return false; + } + $params = array($kind, $address, $name); + // Enqueue addresses with IDN until we know the PHPMailer::$CharSet. + if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) { + if ($kind != 'Reply-To') { + if (!array_key_exists($address, $this->RecipientsQueue)) { + $this->RecipientsQueue[$address] = $params; + return true; + } + } else { + if (!array_key_exists($address, $this->ReplyToQueue)) { + $this->ReplyToQueue[$address] = $params; + return true; + } + } + return false; + } + // Immediately add standard addresses without IDN. + return call_user_func_array(array($this, 'addAnAddress'), $params); + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. + * Addresses that have been added already return false, but do not throw exceptions. + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address to send, resp. to reply to + * @param string $name + * @throws phpmailerException + * @return boolean true on success, false if address already used or invalid in some way + * @access protected + */ + protected function addAnAddress($kind, $address, $name = '') + { + if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) { + $error_message = $this->lang('Invalid recipient kind: ') . $kind; + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new phpmailerException($error_message); + } + return false; + } + if (!$this->validateAddress($address)) { + $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address"; + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new phpmailerException($error_message); + } + return false; + } + if ($kind != 'Reply-To') { + if (!array_key_exists(strtolower($address), $this->all_recipients)) { + array_push($this->$kind, array($address, $name)); + $this->all_recipients[strtolower($address)] = true; + return true; + } + } else { + if (!array_key_exists(strtolower($address), $this->ReplyTo)) { + $this->ReplyTo[strtolower($address)] = array($address, $name); + return true; + } + } + return false; + } + + /** + * Parse and validate a string containing one or more RFC822-style comma-separated email addresses + * of the form "display name <address>" into an array of name/address pairs. + * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. + * Note that quotes in the name part are removed. + * @param string $addrstr The address list string + * @param bool $useimap Whether to use the IMAP extension to parse the list + * @return array + * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation + */ + public function parseAddresses($addrstr, $useimap = true) + { + $addresses = array(); + if ($useimap and function_exists('imap_rfc822_parse_adrlist')) { + //Use this built-in parser if it's available + $list = imap_rfc822_parse_adrlist($addrstr, ''); + foreach ($list as $address) { + if ($address->host != '.SYNTAX-ERROR.') { + if ($this->validateAddress($address->mailbox . '@' . $address->host)) { + $addresses[] = array( + 'name' => (property_exists($address, 'personal') ? $address->personal : ''), + 'address' => $address->mailbox . '@' . $address->host + ); + } + } + } + } else { + //Use this simpler parser + $list = explode(',', $addrstr); + foreach ($list as $address) { + $address = trim($address); + //Is there a separate name part? + if (strpos($address, '<') === false) { + //No separate name, just use the whole thing + if ($this->validateAddress($address)) { + $addresses[] = array( + 'name' => '', + 'address' => $address + ); + } + } else { + list($name, $email) = explode('<', $address); + $email = trim(str_replace('>', '', $email)); + if ($this->validateAddress($email)) { + $addresses[] = array( + 'name' => trim(str_replace(array('"', "'"), '', $name)), + 'address' => $email + ); + } + } + } + } + return $addresses; + } + + /** + * Set the From and FromName properties. + * @param string $address + * @param string $name + * @param boolean $auto Whether to also set the Sender address, defaults to true + * @throws phpmailerException + * @return boolean + */ + public function setFrom($address, $name = '', $auto = true) + { + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + // Don't validate now addresses with IDN. Will be done in send(). + if (($pos = strrpos($address, '@')) === false or + (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and + !$this->validateAddress($address)) { + $error_message = $this->lang('invalid_address') . " (setFrom) $address"; + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new phpmailerException($error_message); + } + return false; + } + $this->From = $address; + $this->FromName = $name; + if ($auto) { + if (empty($this->Sender)) { + $this->Sender = $address; + } + } + return true; + } + + /** + * Return the Message-ID header of the last email. + * Technically this is the value from the last time the headers were created, + * but it's also the message ID of the last sent message except in + * pathological cases. + * @return string + */ + public function getLastMessageID() + { + return $this->lastMessageID; + } + + /** + * Check that a string looks like an email address. + * @param string $address The email address to check + * @param string|callable $patternselect A selector for the validation pattern to use : + * * `auto` Pick best pattern automatically; + * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14; + * * `pcre` Use old PCRE implementation; + * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; + * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. + * * `noregex` Don't use a regex: super fast, really dumb. + * Alternatively you may pass in a callable to inject your own validator, for example: + * PHPMailer::validateAddress('user@example.com', function($address) { + * return (strpos($address, '@') !== false); + * }); + * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator. + * @return boolean + * @static + * @access public + */ + public static function validateAddress($address, $patternselect = null) + { + if (is_null($patternselect)) { + $patternselect = self::$validator; + } + if (is_callable($patternselect)) { + return call_user_func($patternselect, $address); + } + //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321 + if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) { + return false; + } + if (!$patternselect or $patternselect == 'auto') { + //Check this constant first so it works when extension_loaded() is disabled by safe mode + //Constant was added in PHP 5.2.4 + if (defined('PCRE_VERSION')) { + //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2 + if (version_compare(PCRE_VERSION, '8.0.3') >= 0) { + $patternselect = 'pcre8'; + } else { + $patternselect = 'pcre'; + } + } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) { + //Fall back to older PCRE + $patternselect = 'pcre'; + } else { + //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension + if (version_compare(PHP_VERSION, '5.2.0') >= 0) { + $patternselect = 'php'; + } else { + $patternselect = 'noregex'; + } + } + } + switch ($patternselect) { + case 'pcre8': + /** + * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains. + * @link http://squiloople.com/2009/12/20/email-address-validation/ + * @copyright 2009-2010 Michael Rushton + * Feel free to use and redistribute this code. But please keep this copyright notice. + */ + return (boolean)preg_match( + '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . + '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . + '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . + '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . + '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . + '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . + '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . + '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . + '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', + $address + ); + case 'pcre': + //An older regex that doesn't need a recent PCRE + return (boolean)preg_match( + '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' . + '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' . + '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' . + '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' . + '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' . + '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' . + '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' . + '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' . + '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' . + '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD', + $address + ); + case 'html5': + /** + * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. + * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email) + */ + return (boolean)preg_match( + '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . + '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', + $address + ); + case 'noregex': + //No PCRE! Do something _very_ approximate! + //Check the address is 3 chars or longer and contains an @ that's not the first or last char + return (strlen($address) >= 3 + and strpos($address, '@') >= 1 + and strpos($address, '@') != strlen($address) - 1); + case 'php': + default: + return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL); + } + } + + /** + * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the + * "intl" and "mbstring" PHP extensions. + * @return bool "true" if required functions for IDN support are present + */ + public function idnSupported() + { + // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2. + return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding'); + } + + /** + * Converts IDN in given email address to its ASCII form, also known as punycode, if possible. + * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet. + * This function silently returns unmodified address if: + * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form) + * - Conversion to punycode is impossible (e.g. required PHP functions are not available) + * or fails for any reason (e.g. domain has characters not allowed in an IDN) + * @see PHPMailer::$CharSet + * @param string $address The email address to convert + * @return string The encoded address in ASCII form + */ + public function punyencodeAddress($address) + { + // Verify we have required functions, CharSet, and at-sign. + if ($this->idnSupported() and + !empty($this->CharSet) and + ($pos = strrpos($address, '@')) !== false) { + $domain = substr($address, ++$pos); + // Verify CharSet string is a valid one, and domain properly encoded in this CharSet. + if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) { + $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet); + if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ? + idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) : + idn_to_ascii($domain)) !== false) { + return substr($address, 0, $pos) . $punycode; + } + } + } + return $address; + } + + /** + * Create a message and send it. + * Uses the sending method specified by $Mailer. + * @throws phpmailerException + * @return boolean false on error - See the ErrorInfo property for details of the error. + */ + public function send() + { + try { + if (!$this->preSend()) { + return false; + } + return $this->postSend(); + } catch (phpmailerException $exc) { + $this->mailHeader = ''; + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + return false; + } + } + + /** + * Prepare a message for sending. + * @throws phpmailerException + * @return boolean + */ + public function preSend() + { + try { + $this->error_count = 0; // Reset errors + $this->mailHeader = ''; + + // Dequeue recipient and Reply-To addresses with IDN + foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) { + $params[1] = $this->punyencodeAddress($params[1]); + call_user_func_array(array($this, 'addAnAddress'), $params); + } + if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { + throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL); + } + + // Validate From, Sender, and ConfirmReadingTo addresses + foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) { + $this->$address_kind = trim($this->$address_kind); + if (empty($this->$address_kind)) { + continue; + } + $this->$address_kind = $this->punyencodeAddress($this->$address_kind); + if (!$this->validateAddress($this->$address_kind)) { + $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind; + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new phpmailerException($error_message); + } + return false; + } + } + + // Set whether the message is multipart/alternative + if ($this->alternativeExists()) { + $this->ContentType = 'multipart/alternative'; + } + + $this->setMessageType(); + // Refuse to send an empty message unless we are specifically allowing it + if (!$this->AllowEmpty and empty($this->Body)) { + throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL); + } + + // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) + $this->MIMEHeader = ''; + $this->MIMEBody = $this->createBody(); + // createBody may have added some headers, so retain them + $tempheaders = $this->MIMEHeader; + $this->MIMEHeader = $this->createHeader(); + $this->MIMEHeader .= $tempheaders; + + // To capture the complete message when using mail(), create + // an extra header list which createHeader() doesn't fold in + if ($this->Mailer == 'mail') { + if (count($this->to) > 0) { + $this->mailHeader .= $this->addrAppend('To', $this->to); + } else { + $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); + } + $this->mailHeader .= $this->headerLine( + 'Subject', + $this->encodeHeader($this->secureHeader(trim($this->Subject))) + ); + } + + // Sign with DKIM if enabled + if (!empty($this->DKIM_domain) + and !empty($this->DKIM_selector) + and (!empty($this->DKIM_private_string) + or (!empty($this->DKIM_private) + and self::isPermittedPath($this->DKIM_private) + and file_exists($this->DKIM_private) + ) + ) + ) { + $header_dkim = $this->DKIM_Add( + $this->MIMEHeader . $this->mailHeader, + $this->encodeHeader($this->secureHeader($this->Subject)), + $this->MIMEBody + ); + $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF . + str_replace("\r\n", "\n", $header_dkim) . self::CRLF; + } + return true; + } catch (phpmailerException $exc) { + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + return false; + } + } + + /** + * Actually send a message. + * Send the email via the selected mechanism + * @throws phpmailerException + * @return boolean + */ + public function postSend() + { + try { + // Choose the mailer and send through it + switch ($this->Mailer) { + case 'sendmail': + case 'qmail': + return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); + case 'smtp': + return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); + case 'mail': + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + default: + $sendMethod = $this->Mailer.'Send'; + if (method_exists($this, $sendMethod)) { + return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody); + } + + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + } + } catch (phpmailerException $exc) { + $this->setError($exc->getMessage()); + $this->edebug($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + } + return false; + } + + /** + * Send mail using the $Sendmail program. + * @param string $header The message headers + * @param string $body The message body + * @see PHPMailer::$Sendmail + * @throws phpmailerException + * @access protected + * @return boolean + */ + protected function sendmailSend($header, $body) + { + // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + if (!empty($this->Sender) and self::isShellSafe($this->Sender)) { + if ($this->Mailer == 'qmail') { + $sendmailFmt = '%s -f%s'; + } else { + $sendmailFmt = '%s -oi -f%s -t'; + } + } else { + if ($this->Mailer == 'qmail') { + $sendmailFmt = '%s'; + } else { + $sendmailFmt = '%s -oi -t'; + } + } + + // TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing. + $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender); + + if ($this->SingleTo) { + foreach ($this->SingleToArray as $toAddr) { + if (!@$mail = popen($sendmail, 'w')) { + throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fputs($mail, 'To: ' . $toAddr . "\n"); + fputs($mail, $header); + fputs($mail, $body); + $result = pclose($mail); + $this->doCallback( + ($result == 0), + array($toAddr), + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From + ); + if ($result != 0) { + throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + } else { + if (!@$mail = popen($sendmail, 'w')) { + throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fputs($mail, $header); + fputs($mail, $body); + $result = pclose($mail); + $this->doCallback( + ($result == 0), + $this->to, + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From + ); + if ($result != 0) { + throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + return true; + } + + /** + * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters. + * + * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. + * @param string $string The string to be validated + * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report + * @access protected + * @return boolean + */ + protected static function isShellSafe($string) + { + // Future-proof + if (escapeshellcmd($string) !== $string + or !in_array(escapeshellarg($string), array("'$string'", "\"$string\"")) + ) { + return false; + } + + $length = strlen($string); + + for ($i = 0; $i < $length; $i++) { + $c = $string[$i]; + + // All other characters have a special meaning in at least one common shell, including = and +. + // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. + // Note that this does permit non-Latin alphanumeric characters based on the current locale. + if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { + return false; + } + } + + return true; + } + + /** + * Check whether a file path is of a permitted type. + * Used to reject URLs and phar files from functions that access local file paths, + * such as addAttachment. + * @param string $path A relative or absolute path to a file. + * @return bool + */ + protected static function isPermittedPath($path) + { + return !preg_match('#^[a-z]+://#i', $path); + } + + /** + * Send mail using the PHP mail() function. + * @param string $header The message headers + * @param string $body The message body + * @link http://www.php.net/manual/en/book.mail.php + * @throws phpmailerException + * @access protected + * @return boolean + */ + protected function mailSend($header, $body) + { + $toArr = array(); + foreach ($this->to as $toaddr) { + $toArr[] = $this->addrFormat($toaddr); + } + $to = implode(', ', $toArr); + + $params = null; + //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver + if (!empty($this->Sender) and $this->validateAddress($this->Sender)) { + // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + if (self::isShellSafe($this->Sender)) { + $params = sprintf('-f%s', $this->Sender); + } + } + if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) { + $old_from = ini_get('sendmail_from'); + ini_set('sendmail_from', $this->Sender); + } + $result = false; + if ($this->SingleTo and count($toArr) > 1) { + foreach ($toArr as $toAddr) { + $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); + $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From); + } + } else { + $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); + $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From); + } + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + if (!$result) { + throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL); + } + return true; + } + + /** + * Get an instance to use for SMTP operations. + * Override this function to load your own SMTP implementation + * @return SMTP + */ + public function getSMTPInstance() + { + if (!is_object($this->smtp)) { + require_once 'class-smtp.php'; + $this->smtp = new SMTP; + } + return $this->smtp; + } + + /** + * Send mail via SMTP. + * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. + * Uses the PHPMailerSMTP class by default. + * @see PHPMailer::getSMTPInstance() to use a different class. + * @param string $header The message headers + * @param string $body The message body + * @throws phpmailerException + * @uses SMTP + * @access protected + * @return boolean + */ + protected function smtpSend($header, $body) + { + $bad_rcpt = array(); + if (!$this->smtpConnect($this->SMTPOptions)) { + throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); + } + if (!empty($this->Sender) and $this->validateAddress($this->Sender)) { + $smtp_from = $this->Sender; + } else { + $smtp_from = $this->From; + } + if (!$this->smtp->mail($smtp_from)) { + $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); + throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL); + } + + // Attempt to send to all recipients + foreach (array($this->to, $this->cc, $this->bcc) as $togroup) { + foreach ($togroup as $to) { + if (!$this->smtp->recipient($to[0])) { + $error = $this->smtp->getError(); + $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']); + $isSent = false; + } else { + $isSent = true; + } + $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From); + } + } + + // Only send the DATA command if we have viable recipients + if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) { + throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL); + } + if ($this->SMTPKeepAlive) { + $this->smtp->reset(); + } else { + $this->smtp->quit(); + $this->smtp->close(); + } + //Create error message for any bad addresses + if (count($bad_rcpt) > 0) { + $errstr = ''; + foreach ($bad_rcpt as $bad) { + $errstr .= $bad['to'] . ': ' . $bad['error']; + } + throw new phpmailerException( + $this->lang('recipients_failed') . $errstr, + self::STOP_CONTINUE + ); + } + return true; + } + + /** + * Initiate a connection to an SMTP server. + * Returns false if the operation failed. + * @param array $options An array of options compatible with stream_context_create() + * @uses SMTP + * @access public + * @throws phpmailerException + * @return boolean + */ + public function smtpConnect($options = null) + { + if (is_null($this->smtp)) { + $this->smtp = $this->getSMTPInstance(); + } + + //If no options are provided, use whatever is set in the instance + if (is_null($options)) { + $options = $this->SMTPOptions; + } + + // Already connected? + if ($this->smtp->connected()) { + return true; + } + + $this->smtp->setTimeout($this->Timeout); + $this->smtp->setDebugLevel($this->SMTPDebug); + $this->smtp->setDebugOutput($this->Debugoutput); + $this->smtp->setVerp($this->do_verp); + $hosts = explode(';', $this->Host); + $lastexception = null; + + foreach ($hosts as $hostentry) { + $hostinfo = array(); + if (!preg_match( + '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/', + trim($hostentry), + $hostinfo + )) { + // Not a valid host entry + $this->edebug('Ignoring invalid host: ' . $hostentry); + continue; + } + // $hostinfo[2]: optional ssl or tls prefix + // $hostinfo[3]: the hostname + // $hostinfo[4]: optional port number + // The host string prefix can temporarily override the current setting for SMTPSecure + // If it's not specified, the default value is used + $prefix = ''; + $secure = $this->SMTPSecure; + $tls = ($this->SMTPSecure == 'tls'); + if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) { + $prefix = 'ssl://'; + $tls = false; // Can't have SSL and TLS at the same time + $secure = 'ssl'; + } elseif ($hostinfo[2] == 'tls') { + $tls = true; + // tls doesn't use a prefix + $secure = 'tls'; + } + //Do we need the OpenSSL extension? + $sslext = defined('OPENSSL_ALGO_SHA1'); + if ('tls' === $secure or 'ssl' === $secure) { + //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled + if (!$sslext) { + throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL); + } + } + $host = $hostinfo[3]; + $port = $this->Port; + $tport = (integer)$hostinfo[4]; + if ($tport > 0 and $tport < 65536) { + $port = $tport; + } + if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { + try { + if ($this->Helo) { + $hello = $this->Helo; + } else { + $hello = $this->serverHostname(); + } + $this->smtp->hello($hello); + //Automatically enable TLS encryption if: + // * it's not disabled + // * we have openssl extension + // * we are not already using SSL + // * the server offers STARTTLS + if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) { + $tls = true; + } + if ($tls) { + if (!$this->smtp->startTLS()) { + throw new phpmailerException($this->lang('connect_host')); + } + // We must resend EHLO after TLS negotiation + $this->smtp->hello($hello); + } + if ($this->SMTPAuth) { + if (!$this->smtp->authenticate( + $this->Username, + $this->Password, + $this->AuthType, + $this->Realm, + $this->Workstation + ) + ) { + throw new phpmailerException($this->lang('authenticate')); + } + } + return true; + } catch (phpmailerException $exc) { + $lastexception = $exc; + $this->edebug($exc->getMessage()); + // We must have connected, but then failed TLS or Auth, so close connection nicely + $this->smtp->quit(); + } + } + } + // If we get here, all connection attempts have failed, so close connection hard + $this->smtp->close(); + // As we've caught all exceptions, just report whatever the last one was + if ($this->exceptions and !is_null($lastexception)) { + throw $lastexception; + } + return false; + } + + /** + * Close the active SMTP session if one exists. + * @return void + */ + public function smtpClose() + { + if (is_a($this->smtp, 'SMTP')) { + if ($this->smtp->connected()) { + $this->smtp->quit(); + $this->smtp->close(); + } + } + } + + /** + * Set the language for error messages. + * Returns false if it cannot load the language file. + * The default language is English. + * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") + * @param string $lang_path Path to the language file directory, with trailing separator (slash) + * @return boolean + * @access public + */ + public function setLanguage($langcode = 'en', $lang_path = '') + { + // Backwards compatibility for renamed language codes + $renamed_langcodes = array( + 'br' => 'pt_br', + 'cz' => 'cs', + 'dk' => 'da', + 'no' => 'nb', + 'se' => 'sv', + 'sr' => 'rs' + ); + + if (isset($renamed_langcodes[$langcode])) { + $langcode = $renamed_langcodes[$langcode]; + } + + // Define full set of translatable strings in English + $PHPMAILER_LANG = array( + 'authenticate' => 'SMTP Error: Could not authenticate.', + 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', + 'data_not_accepted' => 'SMTP Error: data not accepted.', + 'empty_message' => 'Message body empty', + 'encoding' => 'Unknown encoding: ', + 'execute' => 'Could not execute: ', + 'file_access' => 'Could not access file: ', + 'file_open' => 'File Error: Could not open file: ', + 'from_failed' => 'The following From address failed: ', + 'instantiate' => 'Could not instantiate mail function.', + 'invalid_address' => 'Invalid address: ', + 'mailer_not_supported' => ' mailer is not supported.', + 'provide_address' => 'You must provide at least one recipient email address.', + 'recipients_failed' => 'SMTP Error: The following recipients failed: ', + 'signing' => 'Signing Error: ', + 'smtp_connect_failed' => 'SMTP connect() failed.', + 'smtp_error' => 'SMTP server error: ', + 'variable_set' => 'Cannot set or reset variable: ', + 'extension_missing' => 'Extension missing: ' + ); + if (empty($lang_path)) { + // Calculate an absolute path so it can work if CWD is not here + $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR; + } + //Validate $langcode + if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) { + $langcode = 'en'; + } + $foundlang = true; + $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php'; + // There is no English translation file + if ($langcode != 'en') { + // Make sure language file path is readable + if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) { + $foundlang = false; + } else { + // Overwrite language-specific strings. + // This way we'll never have missing translation keys. + $foundlang = include $lang_file; + } + } + $this->language = $PHPMAILER_LANG; + return (boolean)$foundlang; // Returns false if language not found + } + + /** + * Get the array of strings for the current language. + * @return array + */ + public function getTranslations() + { + return $this->language; + } + + /** + * Create recipient headers. + * @access public + * @param string $type + * @param array $addr An array of recipient, + * where each recipient is a 2-element indexed array with element 0 containing an address + * and element 1 containing a name, like: + * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User')) + * @return string + */ + public function addrAppend($type, $addr) + { + $addresses = array(); + foreach ($addr as $address) { + $addresses[] = $this->addrFormat($address); + } + return $type . ': ' . implode(', ', $addresses) . $this->LE; + } + + /** + * Format an address for use in a message header. + * @access public + * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name + * like array('joe@example.com', 'Joe User') + * @return string + */ + public function addrFormat($addr) + { + if (empty($addr[1])) { // No name provided + return $this->secureHeader($addr[0]); + } else { + return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader( + $addr[0] + ) . '>'; + } + } + + /** + * Word-wrap message. + * For use with mailers that do not automatically perform wrapping + * and for quoted-printable encoded messages. + * Original written by philippe. + * @param string $message The message to wrap + * @param integer $length The line length to wrap to + * @param boolean $qp_mode Whether to run in Quoted-Printable mode + * @access public + * @return string + */ + public function wrapText($message, $length, $qp_mode = false) + { + if ($qp_mode) { + $soft_break = sprintf(' =%s', $this->LE); + } else { + $soft_break = $this->LE; + } + // If utf-8 encoding is used, we will need to make sure we don't + // split multibyte characters when we wrap + $is_utf8 = (strtolower($this->CharSet) == 'utf-8'); + $lelen = strlen($this->LE); + $crlflen = strlen(self::CRLF); + + $message = $this->fixEOL($message); + //Remove a trailing line break + if (substr($message, -$lelen) == $this->LE) { + $message = substr($message, 0, -$lelen); + } + + //Split message into lines + $lines = explode($this->LE, $message); + //Message will be rebuilt in here + $message = ''; + foreach ($lines as $line) { + $words = explode(' ', $line); + $buf = ''; + $firstword = true; + foreach ($words as $word) { + if ($qp_mode and (strlen($word) > $length)) { + $space_left = $length - strlen($buf) - $crlflen; + if (!$firstword) { + if ($space_left > 20) { + $len = $space_left; + if ($is_utf8) { + $len = $this->utf8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == '=') { + $len--; + } elseif (substr($word, $len - 2, 1) == '=') { + $len -= 2; + } + $part = substr($word, 0, $len); + $word = substr($word, $len); + $buf .= ' ' . $part; + $message .= $buf . sprintf('=%s', self::CRLF); + } else { + $message .= $buf . $soft_break; + } + $buf = ''; + } + while (strlen($word) > 0) { + if ($length <= 0) { + break; + } + $len = $length; + if ($is_utf8) { + $len = $this->utf8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == '=') { + $len--; + } elseif (substr($word, $len - 2, 1) == '=') { + $len -= 2; + } + $part = substr($word, 0, $len); + $word = substr($word, $len); + + if (strlen($word) > 0) { + $message .= $part . sprintf('=%s', self::CRLF); + } else { + $buf = $part; + } + } + } else { + $buf_o = $buf; + if (!$firstword) { + $buf .= ' '; + } + $buf .= $word; + + if (strlen($buf) > $length and $buf_o != '') { + $message .= $buf_o . $soft_break; + $buf = $word; + } + } + $firstword = false; + } + $message .= $buf . self::CRLF; + } + + return $message; + } + + /** + * Find the last character boundary prior to $maxLength in a utf-8 + * quoted-printable encoded string. + * Original written by Colin Brown. + * @access public + * @param string $encodedText utf-8 QP text + * @param integer $maxLength Find the last character boundary prior to this length + * @return integer + */ + public function utf8CharBoundary($encodedText, $maxLength) + { + $foundSplitPos = false; + $lookBack = 3; + while (!$foundSplitPos) { + $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); + $encodedCharPos = strpos($lastChunk, '='); + if (false !== $encodedCharPos) { + // Found start of encoded character byte within $lookBack block. + // Check the encoded byte value (the 2 chars after the '=') + $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2); + $dec = hexdec($hex); + if ($dec < 128) { + // Single byte character. + // If the encoded char was found at pos 0, it will fit + // otherwise reduce maxLength to start of the encoded char + if ($encodedCharPos > 0) { + $maxLength = $maxLength - ($lookBack - $encodedCharPos); + } + $foundSplitPos = true; + } elseif ($dec >= 192) { + // First byte of a multi byte character + // Reduce maxLength to split at start of character + $maxLength = $maxLength - ($lookBack - $encodedCharPos); + $foundSplitPos = true; + } elseif ($dec < 192) { + // Middle byte of a multi byte character, look further back + $lookBack += 3; + } + } else { + // No encoded character found + $foundSplitPos = true; + } + } + return $maxLength; + } + + /** + * Apply word wrapping to the message body. + * Wraps the message body to the number of chars set in the WordWrap property. + * You should only do this to plain-text bodies as wrapping HTML tags may break them. + * This is called automatically by createBody(), so you don't need to call it yourself. + * @access public + * @return void + */ + public function setWordWrap() + { + if ($this->WordWrap < 1) { + return; + } + + switch ($this->message_type) { + case 'alt': + case 'alt_inline': + case 'alt_attach': + case 'alt_inline_attach': + $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap); + break; + default: + $this->Body = $this->wrapText($this->Body, $this->WordWrap); + break; + } + } + + /** + * Assemble message headers. + * @access public + * @return string The assembled headers + */ + public function createHeader() + { + $result = ''; + + $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate); + + // To be created automatically by mail() + if ($this->SingleTo) { + if ($this->Mailer != 'mail') { + foreach ($this->to as $toaddr) { + $this->SingleToArray[] = $this->addrFormat($toaddr); + } + } + } else { + if (count($this->to) > 0) { + if ($this->Mailer != 'mail') { + $result .= $this->addrAppend('To', $this->to); + } + } elseif (count($this->cc) == 0) { + $result .= $this->headerLine('To', 'undisclosed-recipients:;'); + } + } + + $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName))); + + // sendmail and mail() extract Cc from the header before sending + if (count($this->cc) > 0) { + $result .= $this->addrAppend('Cc', $this->cc); + } + + // sendmail and mail() extract Bcc from the header before sending + if (( + $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail' + ) + and count($this->bcc) > 0 + ) { + $result .= $this->addrAppend('Bcc', $this->bcc); + } + + if (count($this->ReplyTo) > 0) { + $result .= $this->addrAppend('Reply-To', $this->ReplyTo); + } + + // mail() sets the subject itself + if ($this->Mailer != 'mail') { + $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject))); + } + + // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4 + // https://tools.ietf.org/html/rfc5322#section-3.6.4 + if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) { + $this->lastMessageID = $this->MessageID; + } else { + $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname()); + } + $result .= $this->headerLine('Message-ID', $this->lastMessageID); + if (!is_null($this->Priority)) { + $result .= $this->headerLine('X-Priority', $this->Priority); + } + if ($this->XMailer == '') { + $result .= $this->headerLine( + 'X-Mailer', + 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)' + ); + } else { + $myXmailer = trim($this->XMailer); + if ($myXmailer) { + $result .= $this->headerLine('X-Mailer', $myXmailer); + } + } + + if ($this->ConfirmReadingTo != '') { + $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>'); + } + + // Add custom headers + foreach ($this->CustomHeader as $header) { + $result .= $this->headerLine( + trim($header[0]), + $this->encodeHeader(trim($header[1])) + ); + } + if (!$this->sign_key_file) { + $result .= $this->headerLine('MIME-Version', '1.0'); + $result .= $this->getMailMIME(); + } + + return $result; + } + + /** + * Get the message MIME type headers. + * @access public + * @return string + */ + public function getMailMIME() + { + $result = ''; + $ismultipart = true; + switch ($this->message_type) { + case 'inline': + $result .= $this->headerLine('Content-Type', 'multipart/related;'); + $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + case 'attach': + case 'inline_attach': + case 'alt_attach': + case 'alt_inline_attach': + $result .= $this->headerLine('Content-Type', 'multipart/mixed;'); + $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + case 'alt': + case 'alt_inline': + $result .= $this->headerLine('Content-Type', 'multipart/alternative;'); + $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + default: + // Catches case 'plain': and case '': + $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet); + $ismultipart = false; + break; + } + // RFC1341 part 5 says 7bit is assumed if not specified + if ($this->Encoding != '7bit') { + // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE + if ($ismultipart) { + if ($this->Encoding == '8bit') { + $result .= $this->headerLine('Content-Transfer-Encoding', '8bit'); + } + // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible + } else { + $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding); + } + } + + if ($this->Mailer != 'mail') { + $result .= $this->LE; + } + + return $result; + } + + /** + * Returns the whole MIME message. + * Includes complete headers and body. + * Only valid post preSend(). + * @see PHPMailer::preSend() + * @access public + * @return string + */ + public function getSentMIMEMessage() + { + return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody; + } + + /** + * Create unique ID + * @return string + */ + protected function generateId() { + return md5(uniqid(time())); + } + + /** + * Assemble the message body. + * Returns an empty string on failure. + * @access public + * @throws phpmailerException + * @return string The assembled message body + */ + public function createBody() + { + $body = ''; + //Create unique IDs and preset boundaries + $this->uniqueid = $this->generateId(); + $this->boundary[1] = 'b1_' . $this->uniqueid; + $this->boundary[2] = 'b2_' . $this->uniqueid; + $this->boundary[3] = 'b3_' . $this->uniqueid; + + if ($this->sign_key_file) { + $body .= $this->getMailMIME() . $this->LE; + } + + $this->setWordWrap(); + + $bodyEncoding = $this->Encoding; + $bodyCharSet = $this->CharSet; + //Can we do a 7-bit downgrade? + if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) { + $bodyEncoding = '7bit'; + //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit + $bodyCharSet = 'us-ascii'; + } + //If lines are too long, and we're not already using an encoding that will shorten them, + //change to quoted-printable transfer encoding for the body part only + if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) { + $bodyEncoding = 'quoted-printable'; + } + + $altBodyEncoding = $this->Encoding; + $altBodyCharSet = $this->CharSet; + //Can we do a 7-bit downgrade? + if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) { + $altBodyEncoding = '7bit'; + //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit + $altBodyCharSet = 'us-ascii'; + } + //If lines are too long, and we're not already using an encoding that will shorten them, + //change to quoted-printable transfer encoding for the alt body part only + if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) { + $altBodyEncoding = 'quoted-printable'; + } + //Use this as a preamble in all multipart message types + $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE; + switch ($this->message_type) { + case 'inline': + $body .= $mimepre; + $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('inline', $this->boundary[1]); + break; + case 'attach': + $body .= $mimepre; + $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('attachment', $this->boundary[1]); + break; + case 'inline_attach': + $body .= $mimepre; + $body .= $this->textLine('--' . $this->boundary[1]); + $body .= $this->headerLine('Content-Type', 'multipart/related;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('inline', $this->boundary[2]); + $body .= $this->LE; + $body .= $this->attachAll('attachment', $this->boundary[1]); + break; + case 'alt': + $body .= $mimepre; + $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->encodeString($this->AltBody, $altBodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + if (!empty($this->Ical)) { + $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', ''); + $body .= $this->encodeString($this->Ical, $this->Encoding); + $body .= $this->LE . $this->LE; + } + $body .= $this->endBoundary($this->boundary[1]); + break; + case 'alt_inline': + $body .= $mimepre; + $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->encodeString($this->AltBody, $altBodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->textLine('--' . $this->boundary[1]); + $body .= $this->headerLine('Content-Type', 'multipart/related;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('inline', $this->boundary[2]); + $body .= $this->LE; + $body .= $this->endBoundary($this->boundary[1]); + break; + case 'alt_attach': + $body .= $mimepre; + $body .= $this->textLine('--' . $this->boundary[1]); + $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->encodeString($this->AltBody, $altBodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->endBoundary($this->boundary[2]); + $body .= $this->LE; + $body .= $this->attachAll('attachment', $this->boundary[1]); + break; + case 'alt_inline_attach': + $body .= $mimepre; + $body .= $this->textLine('--' . $this->boundary[1]); + $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->encodeString($this->AltBody, $altBodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->textLine('--' . $this->boundary[2]); + $body .= $this->headerLine('Content-Type', 'multipart/related;'); + $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"'); + $body .= $this->LE; + $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->encodeString($this->Body, $bodyEncoding); + $body .= $this->LE . $this->LE; + $body .= $this->attachAll('inline', $this->boundary[3]); + $body .= $this->LE; + $body .= $this->endBoundary($this->boundary[2]); + $body .= $this->LE; + $body .= $this->attachAll('attachment', $this->boundary[1]); + break; + default: + // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types + //Reset the `Encoding` property in case we changed it for line length reasons + $this->Encoding = $bodyEncoding; + $body .= $this->encodeString($this->Body, $this->Encoding); + break; + } + + if ($this->isError()) { + $body = ''; + } elseif ($this->sign_key_file) { + try { + if (!defined('PKCS7_TEXT')) { + throw new phpmailerException($this->lang('extension_missing') . 'openssl'); + } + // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1 + $file = tempnam(sys_get_temp_dir(), 'mail'); + if (false === file_put_contents($file, $body)) { + throw new phpmailerException($this->lang('signing') . ' Could not write temp file'); + } + $signed = tempnam(sys_get_temp_dir(), 'signed'); + //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197 + if (empty($this->sign_extracerts_file)) { + $sign = @openssl_pkcs7_sign( + $file, + $signed, + 'file://' . realpath($this->sign_cert_file), + array('file://' . realpath($this->sign_key_file), $this->sign_key_pass), + null + ); + } else { + $sign = @openssl_pkcs7_sign( + $file, + $signed, + 'file://' . realpath($this->sign_cert_file), + array('file://' . realpath($this->sign_key_file), $this->sign_key_pass), + null, + PKCS7_DETACHED, + $this->sign_extracerts_file + ); + } + if ($sign) { + @unlink($file); + $body = file_get_contents($signed); + @unlink($signed); + //The message returned by openssl contains both headers and body, so need to split them up + $parts = explode("\n\n", $body, 2); + $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE; + $body = $parts[1]; + } else { + @unlink($file); + @unlink($signed); + throw new phpmailerException($this->lang('signing') . openssl_error_string()); + } + } catch (phpmailerException $exc) { + $body = ''; + if ($this->exceptions) { + throw $exc; + } + } + } + return $body; + } + + /** + * Return the start of a message boundary. + * @access protected + * @param string $boundary + * @param string $charSet + * @param string $contentType + * @param string $encoding + * @return string + */ + protected function getBoundary($boundary, $charSet, $contentType, $encoding) + { + $result = ''; + if ($charSet == '') { + $charSet = $this->CharSet; + } + if ($contentType == '') { + $contentType = $this->ContentType; + } + if ($encoding == '') { + $encoding = $this->Encoding; + } + $result .= $this->textLine('--' . $boundary); + $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet); + $result .= $this->LE; + // RFC1341 part 5 says 7bit is assumed if not specified + if ($encoding != '7bit') { + $result .= $this->headerLine('Content-Transfer-Encoding', $encoding); + } + $result .= $this->LE; + + return $result; + } + + /** + * Return the end of a message boundary. + * @access protected + * @param string $boundary + * @return string + */ + protected function endBoundary($boundary) + { + return $this->LE . '--' . $boundary . '--' . $this->LE; + } + + /** + * Set the message type. + * PHPMailer only supports some preset message types, not arbitrary MIME structures. + * @access protected + * @return void + */ + protected function setMessageType() + { + $type = array(); + if ($this->alternativeExists()) { + $type[] = 'alt'; + } + if ($this->inlineImageExists()) { + $type[] = 'inline'; + } + if ($this->attachmentExists()) { + $type[] = 'attach'; + } + $this->message_type = implode('_', $type); + if ($this->message_type == '') { + //The 'plain' message_type refers to the message having a single body element, not that it is plain-text + $this->message_type = 'plain'; + } + } + + /** + * Format a header line. + * @access public + * @param string $name + * @param string $value + * @return string + */ + public function headerLine($name, $value) + { + return $name . ': ' . $value . $this->LE; + } + + /** + * Return a formatted mail line. + * @access public + * @param string $value + * @return string + */ + public function textLine($value) + { + return $value . $this->LE; + } + + /** + * Add an attachment from a path on the filesystem. + * Never use a user-supplied path to a file! + * Returns false if the file could not be found or read. + * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client. + * If you need to do that, fetch the resource yourself and pass it in via a local file or string. + * @param string $path Path to the attachment. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @param string $disposition Disposition to use + * @throws phpmailerException + * @return boolean + */ + public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment') + { + try { + if (!self::isPermittedPath($path) or !@is_file($path)) { + throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE); + } + + // If a MIME type is not specified, try to work it out from the file name + if ($type == '') { + $type = self::filenameToType($path); + } + + $filename = basename($path); + if ($name == '') { + $name = $filename; + } + + $this->attachment[] = array( + 0 => $path, + 1 => $filename, + 2 => $name, + 3 => $encoding, + 4 => $type, + 5 => false, // isStringAttachment + 6 => $disposition, + 7 => 0 + ); + + } catch (phpmailerException $exc) { + $this->setError($exc->getMessage()); + $this->edebug($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + return false; + } + return true; + } + + /** + * Return the array of attachments. + * @return array + */ + public function getAttachments() + { + return $this->attachment; + } + + /** + * Attach all file, string, and binary attachments to the message. + * Returns an empty string on failure. + * @access protected + * @param string $disposition_type + * @param string $boundary + * @return string + */ + protected function attachAll($disposition_type, $boundary) + { + // Return text of body + $mime = array(); + $cidUniq = array(); + $incl = array(); + + // Add all attachments + foreach ($this->attachment as $attachment) { + // Check if it is a valid disposition_filter + if ($attachment[6] == $disposition_type) { + // Check for string attachment + $string = ''; + $path = ''; + $bString = $attachment[5]; + if ($bString) { + $string = $attachment[0]; + } else { + $path = $attachment[0]; + } + + $inclhash = md5(serialize($attachment)); + if (in_array($inclhash, $incl)) { + continue; + } + $incl[] = $inclhash; + $name = $attachment[2]; + $encoding = $attachment[3]; + $type = $attachment[4]; + $disposition = $attachment[6]; + $cid = $attachment[7]; + if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) { + continue; + } + $cidUniq[$cid] = true; + + $mime[] = sprintf('--%s%s', $boundary, $this->LE); + //Only include a filename property if we have one + if (!empty($name)) { + $mime[] = sprintf( + 'Content-Type: %s; name="%s"%s', + $type, + $this->encodeHeader($this->secureHeader($name)), + $this->LE + ); + } else { + $mime[] = sprintf( + 'Content-Type: %s%s', + $type, + $this->LE + ); + } + // RFC1341 part 5 says 7bit is assumed if not specified + if ($encoding != '7bit') { + $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE); + } + + if ($disposition == 'inline') { + $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE); + } + + // If a filename contains any of these chars, it should be quoted, + // but not otherwise: RFC2183 & RFC2045 5.1 + // Fixes a warning in IETF's msglint MIME checker + // Allow for bypassing the Content-Disposition header totally + if (!(empty($disposition))) { + $encoded_name = $this->encodeHeader($this->secureHeader($name)); + if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) { + $mime[] = sprintf( + 'Content-Disposition: %s; filename="%s"%s', + $disposition, + $encoded_name, + $this->LE . $this->LE + ); + } else { + if (!empty($encoded_name)) { + $mime[] = sprintf( + 'Content-Disposition: %s; filename=%s%s', + $disposition, + $encoded_name, + $this->LE . $this->LE + ); + } else { + $mime[] = sprintf( + 'Content-Disposition: %s%s', + $disposition, + $this->LE . $this->LE + ); + } + } + } else { + $mime[] = $this->LE; + } + + // Encode as string attachment + if ($bString) { + $mime[] = $this->encodeString($string, $encoding); + if ($this->isError()) { + return ''; + } + $mime[] = $this->LE . $this->LE; + } else { + $mime[] = $this->encodeFile($path, $encoding); + if ($this->isError()) { + return ''; + } + $mime[] = $this->LE . $this->LE; + } + } + } + + $mime[] = sprintf('--%s--%s', $boundary, $this->LE); + + return implode('', $mime); + } + + /** + * Encode a file attachment in requested format. + * Returns an empty string on failure. + * @param string $path The full path to the file + * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' + * @throws phpmailerException + * @access protected + * @return string + */ + protected function encodeFile($path, $encoding = 'base64') + { + try { + if (!self::isPermittedPath($path) or !file_exists($path)) { + throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE); + } + $magic_quotes = ( PHP_VERSION_ID < 70400 && get_magic_quotes_runtime() ); // WP: Patched for PHP 7.4. + if ($magic_quotes) { + if (version_compare(PHP_VERSION, '5.3.0', '<')) { + set_magic_quotes_runtime(false); + } else { + //Doesn't exist in PHP 5.4, but we don't need to check because + //get_magic_quotes_runtime always returns false in 5.4+ + //so it will never get here + ini_set('magic_quotes_runtime', false); + } + } + $file_buffer = file_get_contents($path); + $file_buffer = $this->encodeString($file_buffer, $encoding); + if ($magic_quotes) { + if (version_compare(PHP_VERSION, '5.3.0', '<')) { + set_magic_quotes_runtime($magic_quotes); + } else { + ini_set('magic_quotes_runtime', $magic_quotes); + } + } + return $file_buffer; + } catch (Exception $exc) { + $this->setError($exc->getMessage()); + return ''; + } + } + + /** + * Encode a string in requested format. + * Returns an empty string on failure. + * @param string $str The text to encode + * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' + * @access public + * @return string + */ + public function encodeString($str, $encoding = 'base64') + { + $encoded = ''; + switch (strtolower($encoding)) { + case 'base64': + $encoded = chunk_split(base64_encode($str), 76, $this->LE); + break; + case '7bit': + case '8bit': + $encoded = $this->fixEOL($str); + // Make sure it ends with a line break + if (substr($encoded, -(strlen($this->LE))) != $this->LE) { + $encoded .= $this->LE; + } + break; + case 'binary': + $encoded = $str; + break; + case 'quoted-printable': + $encoded = $this->encodeQP($str); + break; + default: + $this->setError($this->lang('encoding') . $encoding); + break; + } + return $encoded; + } + + /** + * Encode a header string optimally. + * Picks shortest of Q, B, quoted-printable or none. + * @access public + * @param string $str + * @param string $position + * @return string + */ + public function encodeHeader($str, $position = 'text') + { + $matchcount = 0; + switch (strtolower($position)) { + case 'phrase': + if (!preg_match('/[\200-\377]/', $str)) { + // Can't use addslashes as we don't know the value of magic_quotes_sybase + $encoded = addcslashes($str, "\0..\37\177\\\""); + if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { + return ($encoded); + } else { + return ("\"$encoded\""); + } + } + $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); + break; + /** @noinspection PhpMissingBreakStatementInspection */ + case 'comment': + $matchcount = preg_match_all('/[()"]/', $str, $matches); + // Intentional fall-through + case 'text': + default: + $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); + break; + } + + //There are no chars that need encoding + if ($matchcount == 0) { + return ($str); + } + + $maxlen = 75 - 7 - strlen($this->CharSet); + // Try to select the encoding which should produce the shortest output + if ($matchcount > strlen($str) / 3) { + // More than a third of the content will need encoding, so B encoding will be most efficient + $encoding = 'B'; + if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) { + // Use a custom function which correctly encodes and wraps long + // multibyte strings without breaking lines within a character + $encoded = $this->base64EncodeWrapMB($str, "\n"); + } else { + $encoded = base64_encode($str); + $maxlen -= $maxlen % 4; + $encoded = trim(chunk_split($encoded, $maxlen, "\n")); + } + } else { + $encoding = 'Q'; + $encoded = $this->encodeQ($str, $position); + $encoded = $this->wrapText($encoded, $maxlen, true); + $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded)); + } + + $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded); + $encoded = trim(str_replace("\n", $this->LE, $encoded)); + + return $encoded; + } + + /** + * Check if a string contains multi-byte characters. + * @access public + * @param string $str multi-byte text to wrap encode + * @return boolean + */ + public function hasMultiBytes($str) + { + if (function_exists('mb_strlen')) { + return (strlen($str) > mb_strlen($str, $this->CharSet)); + } else { // Assume no multibytes (we can't handle without mbstring functions anyway) + return false; + } + } + + /** + * Does a string contain any 8-bit chars (in any charset)? + * @param string $text + * @return boolean + */ + public function has8bitChars($text) + { + return (boolean)preg_match('/[\x80-\xFF]/', $text); + } + + /** + * Encode and wrap long multibyte strings for mail headers + * without breaking lines within a character. + * Adapted from a function by paravoid + * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283 + * @access public + * @param string $str multi-byte text to wrap encode + * @param string $linebreak string to use as linefeed/end-of-line + * @return string + */ + public function base64EncodeWrapMB($str, $linebreak = null) + { + $start = '=?' . $this->CharSet . '?B?'; + $end = '?='; + $encoded = ''; + if ($linebreak === null) { + $linebreak = $this->LE; + } + + $mb_length = mb_strlen($str, $this->CharSet); + // Each line must have length <= 75, including $start and $end + $length = 75 - strlen($start) - strlen($end); + // Average multi-byte ratio + $ratio = $mb_length / strlen($str); + // Base64 has a 4:3 ratio + $avgLength = floor($length * $ratio * .75); + + for ($i = 0; $i < $mb_length; $i += $offset) { + $lookBack = 0; + do { + $offset = $avgLength - $lookBack; + $chunk = mb_substr($str, $i, $offset, $this->CharSet); + $chunk = base64_encode($chunk); + $lookBack++; + } while (strlen($chunk) > $length); + $encoded .= $chunk . $linebreak; + } + + // Chomp the last linefeed + $encoded = substr($encoded, 0, -strlen($linebreak)); + return $encoded; + } + + /** + * Encode a string in quoted-printable format. + * According to RFC2045 section 6.7. + * @access public + * @param string $string The text to encode + * @param integer $line_max Number of chars allowed on a line before wrapping + * @return string + * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment + */ + public function encodeQP($string, $line_max = 76) + { + // Use native function if it's available (>= PHP5.3) + if (function_exists('quoted_printable_encode')) { + return quoted_printable_encode($string); + } + // Fall back to a pure PHP implementation + $string = str_replace( + array('%20', '%0D%0A.', '%0D%0A', '%'), + array(' ', "\r\n=2E", "\r\n", '='), + rawurlencode($string) + ); + return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string); + } + + /** + * Backward compatibility wrapper for an old QP encoding function that was removed. + * @see PHPMailer::encodeQP() + * @access public + * @param string $string + * @param integer $line_max + * @param boolean $space_conv + * @return string + * @deprecated Use encodeQP instead. + */ + public function encodeQPphp( + $string, + $line_max = 76, + /** @noinspection PhpUnusedParameterInspection */ $space_conv = false + ) { + return $this->encodeQP($string, $line_max); + } + + /** + * Encode a string using Q encoding. + * @link http://tools.ietf.org/html/rfc2047 + * @param string $str the text to encode + * @param string $position Where the text is going to be used, see the RFC for what that means + * @access public + * @return string + */ + public function encodeQ($str, $position = 'text') + { + // There should not be any EOL in the string + $pattern = ''; + $encoded = str_replace(array("\r", "\n"), '', $str); + switch (strtolower($position)) { + case 'phrase': + // RFC 2047 section 5.3 + $pattern = '^A-Za-z0-9!*+\/ -'; + break; + /** @noinspection PhpMissingBreakStatementInspection */ + case 'comment': + // RFC 2047 section 5.2 + $pattern = '\(\)"'; + // intentional fall-through + // for this reason we build the $pattern without including delimiters and [] + case 'text': + default: + // RFC 2047 section 5.1 + // Replace every high ascii, control, =, ? and _ characters + $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern; + break; + } + $matches = array(); + if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) { + // If the string contains an '=', make sure it's the first thing we replace + // so as to avoid double-encoding + $eqkey = array_search('=', $matches[0]); + if (false !== $eqkey) { + unset($matches[0][$eqkey]); + array_unshift($matches[0], '='); + } + foreach (array_unique($matches[0]) as $char) { + $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded); + } + } + // Replace every spaces to _ (more readable than =20) + return str_replace(' ', '_', $encoded); + } + + /** + * Add a string or binary attachment (non-filesystem). + * This method can be used to attach ascii or binary data, + * such as a BLOB record from a database. + * @param string $string String attachment data. + * @param string $filename Name of the attachment. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @param string $disposition Disposition to use + * @return void + */ + public function addStringAttachment( + $string, + $filename, + $encoding = 'base64', + $type = '', + $disposition = 'attachment' + ) { + // If a MIME type is not specified, try to work it out from the file name + if ($type == '') { + $type = self::filenameToType($filename); + } + // Append to $attachment array + $this->attachment[] = array( + 0 => $string, + 1 => $filename, + 2 => basename($filename), + 3 => $encoding, + 4 => $type, + 5 => true, // isStringAttachment + 6 => $disposition, + 7 => 0 + ); + } + + /** + * Add an embedded (inline) attachment from a file. + * This can include images, sounds, and just about any other document type. + * These differ from 'regular' attachments in that they are intended to be + * displayed inline with the message, not just attached for download. + * This is used in HTML messages that embed the images + * the HTML refers to using the $cid value. + * Never use a user-supplied path to a file! + * @param string $path Path to the attachment. + * @param string $cid Content ID of the attachment; Use this to reference + * the content when using an embedded image in HTML. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File MIME type. + * @param string $disposition Disposition to use + * @return boolean True on successfully adding an attachment + */ + public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline') + { + if (!self::isPermittedPath($path) or !@is_file($path)) { + $this->setError($this->lang('file_access') . $path); + return false; + } + + // If a MIME type is not specified, try to work it out from the file name + if ($type == '') { + $type = self::filenameToType($path); + } + + $filename = basename($path); + if ($name == '') { + $name = $filename; + } + + // Append to $attachment array + $this->attachment[] = array( + 0 => $path, + 1 => $filename, + 2 => $name, + 3 => $encoding, + 4 => $type, + 5 => false, // isStringAttachment + 6 => $disposition, + 7 => $cid + ); + return true; + } + + /** + * Add an embedded stringified attachment. + * This can include images, sounds, and just about any other document type. + * Be sure to set the $type to an image type for images: + * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'. + * @param string $string The attachment binary data. + * @param string $cid Content ID of the attachment; Use this to reference + * the content when using an embedded image in HTML. + * @param string $name + * @param string $encoding File encoding (see $Encoding). + * @param string $type MIME type. + * @param string $disposition Disposition to use + * @return boolean True on successfully adding an attachment + */ + public function addStringEmbeddedImage( + $string, + $cid, + $name = '', + $encoding = 'base64', + $type = '', + $disposition = 'inline' + ) { + // If a MIME type is not specified, try to work it out from the name + if ($type == '' and !empty($name)) { + $type = self::filenameToType($name); + } + + // Append to $attachment array + $this->attachment[] = array( + 0 => $string, + 1 => $name, + 2 => $name, + 3 => $encoding, + 4 => $type, + 5 => true, // isStringAttachment + 6 => $disposition, + 7 => $cid + ); + return true; + } + + /** + * Check if an inline attachment is present. + * @access public + * @return boolean + */ + public function inlineImageExists() + { + foreach ($this->attachment as $attachment) { + if ($attachment[6] == 'inline') { + return true; + } + } + return false; + } + + /** + * Check if an attachment (non-inline) is present. + * @return boolean + */ + public function attachmentExists() + { + foreach ($this->attachment as $attachment) { + if ($attachment[6] == 'attachment') { + return true; + } + } + return false; + } + + /** + * Check if this message has an alternative body set. + * @return boolean + */ + public function alternativeExists() + { + return !empty($this->AltBody); + } + + /** + * Clear queued addresses of given kind. + * @access protected + * @param string $kind 'to', 'cc', or 'bcc' + * @return void + */ + public function clearQueuedAddresses($kind) + { + $RecipientsQueue = $this->RecipientsQueue; + foreach ($RecipientsQueue as $address => $params) { + if ($params[0] == $kind) { + unset($this->RecipientsQueue[$address]); + } + } + } + + /** + * Clear all To recipients. + * @return void + */ + public function clearAddresses() + { + foreach ($this->to as $to) { + unset($this->all_recipients[strtolower($to[0])]); + } + $this->to = array(); + $this->clearQueuedAddresses('to'); + } + + /** + * Clear all CC recipients. + * @return void + */ + public function clearCCs() + { + foreach ($this->cc as $cc) { + unset($this->all_recipients[strtolower($cc[0])]); + } + $this->cc = array(); + $this->clearQueuedAddresses('cc'); + } + + /** + * Clear all BCC recipients. + * @return void + */ + public function clearBCCs() + { + foreach ($this->bcc as $bcc) { + unset($this->all_recipients[strtolower($bcc[0])]); + } + $this->bcc = array(); + $this->clearQueuedAddresses('bcc'); + } + + /** + * Clear all ReplyTo recipients. + * @return void + */ + public function clearReplyTos() + { + $this->ReplyTo = array(); + $this->ReplyToQueue = array(); + } + + /** + * Clear all recipient types. + * @return void + */ + public function clearAllRecipients() + { + $this->to = array(); + $this->cc = array(); + $this->bcc = array(); + $this->all_recipients = array(); + $this->RecipientsQueue = array(); + } + + /** + * Clear all filesystem, string, and binary attachments. + * @return void + */ + public function clearAttachments() + { + $this->attachment = array(); + } + + /** + * Clear all custom headers. + * @return void + */ + public function clearCustomHeaders() + { + $this->CustomHeader = array(); + } + + /** + * Add an error message to the error container. + * @access protected + * @param string $msg + * @return void + */ + protected function setError($msg) + { + $this->error_count++; + if ($this->Mailer == 'smtp' and !is_null($this->smtp)) { + $lasterror = $this->smtp->getError(); + if (!empty($lasterror['error'])) { + $msg .= $this->lang('smtp_error') . $lasterror['error']; + if (!empty($lasterror['detail'])) { + $msg .= ' Detail: '. $lasterror['detail']; + } + if (!empty($lasterror['smtp_code'])) { + $msg .= ' SMTP code: ' . $lasterror['smtp_code']; + } + if (!empty($lasterror['smtp_code_ex'])) { + $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex']; + } + } + } + $this->ErrorInfo = $msg; + } + + /** + * Return an RFC 822 formatted date. + * @access public + * @return string + * @static + */ + public static function rfcDate() + { + // Set the time zone to whatever the default is to avoid 500 errors + // Will default to UTC if it's not set properly in php.ini + date_default_timezone_set(@date_default_timezone_get()); + return date('D, j M Y H:i:s O'); + } + + /** + * Get the server hostname. + * Returns 'localhost.localdomain' if unknown. + * @access protected + * @return string + */ + protected function serverHostname() + { + $result = 'localhost.localdomain'; + if (!empty($this->Hostname)) { + $result = $this->Hostname; + } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) { + $result = $_SERVER['SERVER_NAME']; + } elseif (function_exists('gethostname') && gethostname() !== false) { + $result = gethostname(); + } elseif (php_uname('n') !== false) { + $result = php_uname('n'); + } + return $result; + } + + /** + * Get an error message in the current language. + * @access protected + * @param string $key + * @return string + */ + protected function lang($key) + { + if (count($this->language) < 1) { + $this->setLanguage('en'); // set the default language + } + + if (array_key_exists($key, $this->language)) { + if ($key == 'smtp_connect_failed') { + //Include a link to troubleshooting docs on SMTP connection failure + //this is by far the biggest cause of support questions + //but it's usually not PHPMailer's fault. + return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting'; + } + return $this->language[$key]; + } else { + //Return the key as a fallback + return $key; + } + } + + /** + * Check if an error occurred. + * @access public + * @return boolean True if an error did occur. + */ + public function isError() + { + return ($this->error_count > 0); + } + + /** + * Ensure consistent line endings in a string. + * Changes every end of line from CRLF, CR or LF to $this->LE. + * @access public + * @param string $str String to fixEOL + * @return string + */ + public function fixEOL($str) + { + // Normalise to \n + $nstr = str_replace(array("\r\n", "\r"), "\n", $str); + // Now convert LE as needed + if ($this->LE !== "\n") { + $nstr = str_replace("\n", $this->LE, $nstr); + } + return $nstr; + } + + /** + * Add a custom header. + * $name value can be overloaded to contain + * both header name and value (name:value) + * @access public + * @param string $name Custom header name + * @param string $value Header value + * @return void + */ + public function addCustomHeader($name, $value = null) + { + if ($value === null) { + // Value passed in as name:value + $this->CustomHeader[] = explode(':', $name, 2); + } else { + $this->CustomHeader[] = array($name, $value); + } + } + + /** + * Returns all custom headers. + * @return array + */ + public function getCustomHeaders() + { + return $this->CustomHeader; + } + + /** + * Create a message body from an HTML string. + * Automatically inlines images and creates a plain-text version by converting the HTML, + * overwriting any existing values in Body and AltBody. + * Do not source $message content from user input! + * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty + * will look for an image file in $basedir/images/a.png and convert it to inline. + * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email) + * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly. + * @access public + * @param string $message HTML message string + * @param string $basedir Absolute path to a base directory to prepend to relative paths to images + * @param boolean|callable $advanced Whether to use the internal HTML to text converter + * or your own custom converter @see PHPMailer::html2text() + * @return string $message The transformed message Body + */ + public function msgHTML($message, $basedir = '', $advanced = false) + { + preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images); + if (array_key_exists(2, $images)) { + if (strlen($basedir) > 1 && substr($basedir, -1) != '/') { + // Ensure $basedir has a trailing / + $basedir .= '/'; + } + foreach ($images[2] as $imgindex => $url) { + // Convert data URIs into embedded images + if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) { + $data = substr($url, strpos($url, ',')); + if ($match[2]) { + $data = base64_decode($data); + } else { + $data = rawurldecode($data); + } + $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2 + if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) { + $message = str_replace( + $images[0][$imgindex], + $images[1][$imgindex] . '="cid:' . $cid . '"', + $message + ); + } + continue; + } + if ( + // Only process relative URLs if a basedir is provided (i.e. no absolute local paths) + !empty($basedir) + // Ignore URLs containing parent dir traversal (..) + && (strpos($url, '..') === false) + // Do not change urls that are already inline images + && substr($url, 0, 4) !== 'cid:' + // Do not change absolute URLs, including anonymous protocol + && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url) + ) { + $filename = basename($url); + $directory = dirname($url); + if ($directory == '.') { + $directory = ''; + } + $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2 + if (strlen($directory) > 1 && substr($directory, -1) != '/') { + $directory .= '/'; + } + if ($this->addEmbeddedImage( + $basedir . $directory . $filename, + $cid, + $filename, + 'base64', + self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION)) + ) + ) { + $message = preg_replace( + '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui', + $images[1][$imgindex] . '="cid:' . $cid . '"', + $message + ); + } + } + } + } + $this->isHTML(true); + // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better + $this->Body = $this->normalizeBreaks($message); + $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced)); + if (!$this->alternativeExists()) { + $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . + self::CRLF . self::CRLF; + } + return $this->Body; + } + + /** + * Convert an HTML string into plain text. + * This is used by msgHTML(). + * Note - older versions of this function used a bundled advanced converter + * which was been removed for license reasons in #232. + * Example usage: + * <code> + * // Use default conversion + * $plain = $mail->html2text($html); + * // Use your own custom converter + * $plain = $mail->html2text($html, function($html) { + * $converter = new MyHtml2text($html); + * return $converter->get_text(); + * }); + * </code> + * @param string $html The HTML text to convert + * @param boolean|callable $advanced Any boolean value to use the internal converter, + * or provide your own callable for custom conversion. + * @return string + */ + public function html2text($html, $advanced = false) + { + if (is_callable($advanced)) { + return call_user_func($advanced, $html); + } + return html_entity_decode( + trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))), + ENT_QUOTES, + $this->CharSet + ); + } + + /** + * Get the MIME type for a file extension. + * @param string $ext File extension + * @access public + * @return string MIME type of file. + * @static + */ + public static function _mime_types($ext = '') + { + $mimes = array( + 'xl' => 'application/excel', + 'js' => 'application/javascript', + 'hqx' => 'application/mac-binhex40', + 'cpt' => 'application/mac-compactpro', + 'bin' => 'application/macbinary', + 'doc' => 'application/msword', + 'word' => 'application/msword', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', + 'class' => 'application/octet-stream', + 'dll' => 'application/octet-stream', + 'dms' => 'application/octet-stream', + 'exe' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'psd' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'so' => 'application/octet-stream', + 'oda' => 'application/oda', + 'pdf' => 'application/pdf', + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'mif' => 'application/vnd.mif', + 'xls' => 'application/vnd.ms-excel', + 'ppt' => 'application/vnd.ms-powerpoint', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'gtar' => 'application/x-gtar', + 'php3' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'php' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => 'application/x-tar', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'zip' => 'application/zip', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mp2' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mpga' => 'audio/mpeg', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'wav' => 'audio/x-wav', + 'bmp' => 'image/bmp', + 'gif' => 'image/gif', + 'jpeg' => 'image/jpeg', + 'jpe' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'png' => 'image/png', + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'eml' => 'message/rfc822', + 'css' => 'text/css', + 'html' => 'text/html', + 'htm' => 'text/html', + 'shtml' => 'text/html', + 'log' => 'text/plain', + 'text' => 'text/plain', + 'txt' => 'text/plain', + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'vcf' => 'text/vcard', + 'vcard' => 'text/vcard', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'mpeg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mov' => 'video/quicktime', + 'qt' => 'video/quicktime', + 'rv' => 'video/vnd.rn-realvideo', + 'avi' => 'video/x-msvideo', + 'movie' => 'video/x-sgi-movie' + ); + if (array_key_exists(strtolower($ext), $mimes)) { + return $mimes[strtolower($ext)]; + } + return 'application/octet-stream'; + } + + /** + * Map a file name to a MIME type. + * Defaults to 'application/octet-stream', i.e.. arbitrary binary data. + * @param string $filename A file name or full path, does not need to exist as a file + * @return string + * @static + */ + public static function filenameToType($filename) + { + // In case the path is a URL, strip any query string before getting extension + $qpos = strpos($filename, '?'); + if (false !== $qpos) { + $filename = substr($filename, 0, $qpos); + } + $pathinfo = self::mb_pathinfo($filename); + return self::_mime_types($pathinfo['extension']); + } + + /** + * Multi-byte-safe pathinfo replacement. + * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe. + * Works similarly to the one in PHP >= 5.2.0 + * @link http://www.php.net/manual/en/function.pathinfo.php#107461 + * @param string $path A filename or path, does not need to exist as a file + * @param integer|string $options Either a PATHINFO_* constant, + * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2 + * @return string|array + * @static + */ + public static function mb_pathinfo($path, $options = null) + { + $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => ''); + $pathinfo = array(); + if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) { + if (array_key_exists(1, $pathinfo)) { + $ret['dirname'] = $pathinfo[1]; + } + if (array_key_exists(2, $pathinfo)) { + $ret['basename'] = $pathinfo[2]; + } + if (array_key_exists(5, $pathinfo)) { + $ret['extension'] = $pathinfo[5]; + } + if (array_key_exists(3, $pathinfo)) { + $ret['filename'] = $pathinfo[3]; + } + } + switch ($options) { + case PATHINFO_DIRNAME: + case 'dirname': + return $ret['dirname']; + case PATHINFO_BASENAME: + case 'basename': + return $ret['basename']; + case PATHINFO_EXTENSION: + case 'extension': + return $ret['extension']; + case PATHINFO_FILENAME: + case 'filename': + return $ret['filename']; + default: + return $ret; + } + } + + /** + * Set or reset instance properties. + * You should avoid this function - it's more verbose, less efficient, more error-prone and + * harder to debug than setting properties directly. + * Usage Example: + * `$mail->set('SMTPSecure', 'tls');` + * is the same as: + * `$mail->SMTPSecure = 'tls';` + * @access public + * @param string $name The property name to set + * @param mixed $value The value to set the property to + * @return boolean + * @TODO Should this not be using the __set() magic function? + */ + public function set($name, $value = '') + { + if (property_exists($this, $name)) { + $this->$name = $value; + return true; + } else { + $this->setError($this->lang('variable_set') . $name); + return false; + } + } + + /** + * Strip newlines to prevent header injection. + * @access public + * @param string $str + * @return string + */ + public function secureHeader($str) + { + return trim(str_replace(array("\r", "\n"), '', $str)); + } + + /** + * Normalize line breaks in a string. + * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format. + * Defaults to CRLF (for message bodies) and preserves consecutive breaks. + * @param string $text + * @param string $breaktype What kind of line break to use, defaults to CRLF + * @return string + * @access public + * @static + */ + public static function normalizeBreaks($text, $breaktype = "\r\n") + { + return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text); + } + + /** + * Set the public and private key files and password for S/MIME signing. + * @access public + * @param string $cert_filename + * @param string $key_filename + * @param string $key_pass Password for private key + * @param string $extracerts_filename Optional path to chain certificate + */ + public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '') + { + $this->sign_cert_file = $cert_filename; + $this->sign_key_file = $key_filename; + $this->sign_key_pass = $key_pass; + $this->sign_extracerts_file = $extracerts_filename; + } + + /** + * Quoted-Printable-encode a DKIM header. + * @access public + * @param string $txt + * @return string + */ + public function DKIM_QP($txt) + { + $line = ''; + for ($i = 0; $i < strlen($txt); $i++) { + $ord = ord($txt[$i]); + if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) { + $line .= $txt[$i]; + } else { + $line .= '=' . sprintf('%02X', $ord); + } + } + return $line; + } + + /** + * Generate a DKIM signature. + * @access public + * @param string $signHeader + * @throws phpmailerException + * @return string The DKIM signature value + */ + public function DKIM_Sign($signHeader) + { + if (!defined('PKCS7_TEXT')) { + if ($this->exceptions) { + throw new phpmailerException($this->lang('extension_missing') . 'openssl'); + } + return ''; + } + $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private); + if ('' != $this->DKIM_passphrase) { + $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase); + } else { + $privKey = openssl_pkey_get_private($privKeyStr); + } + //Workaround for missing digest algorithms in old PHP & OpenSSL versions + //@link http://stackoverflow.com/a/11117338/333340 + if (version_compare(PHP_VERSION, '5.3.0') >= 0 and + in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) { + if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) { + openssl_pkey_free($privKey); + return base64_encode($signature); + } + } else { + $pinfo = openssl_pkey_get_details($privKey); + $hash = hash('sha256', $signHeader); + //'Magic' constant for SHA256 from RFC3447 + //@link https://tools.ietf.org/html/rfc3447#page-43 + $t = '3031300d060960864801650304020105000420' . $hash; + $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3); + $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t); + + if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) { + openssl_pkey_free($privKey); + return base64_encode($signature); + } + } + openssl_pkey_free($privKey); + return ''; + } + + /** + * Generate a DKIM canonicalization header. + * @access public + * @param string $signHeader Header + * @return string + */ + public function DKIM_HeaderC($signHeader) + { + $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader); + $lines = explode("\r\n", $signHeader); + foreach ($lines as $key => $line) { + list($heading, $value) = explode(':', $line, 2); + $heading = strtolower($heading); + $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces + $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value + } + $signHeader = implode("\r\n", $lines); + return $signHeader; + } + + /** + * Generate a DKIM canonicalization body. + * @access public + * @param string $body Message Body + * @return string + */ + public function DKIM_BodyC($body) + { + if ($body == '') { + return "\r\n"; + } + // stabilize line endings + $body = str_replace("\r\n", "\n", $body); + $body = str_replace("\n", "\r\n", $body); + // END stabilize line endings + while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") { + $body = substr($body, 0, strlen($body) - 2); + } + return $body; + } + + /** + * Create the DKIM header and body in a new message header. + * @access public + * @param string $headers_line Header lines + * @param string $subject Subject + * @param string $body Body + * @return string + */ + public function DKIM_Add($headers_line, $subject, $body) + { + $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms + $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body + $DKIMquery = 'dns/txt'; // Query method + $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone) + $subject_header = "Subject: $subject"; + $headers = explode($this->LE, $headers_line); + $from_header = ''; + $to_header = ''; + $date_header = ''; + $current = ''; + foreach ($headers as $header) { + if (strpos($header, 'From:') === 0) { + $from_header = $header; + $current = 'from_header'; + } elseif (strpos($header, 'To:') === 0) { + $to_header = $header; + $current = 'to_header'; + } elseif (strpos($header, 'Date:') === 0) { + $date_header = $header; + $current = 'date_header'; + } else { + if (!empty($$current) && strpos($header, ' =?') === 0) { + $$current .= $header; + } else { + $current = ''; + } + } + } + $from = str_replace('|', '=7C', $this->DKIM_QP($from_header)); + $to = str_replace('|', '=7C', $this->DKIM_QP($to_header)); + $date = str_replace('|', '=7C', $this->DKIM_QP($date_header)); + $subject = str_replace( + '|', + '=7C', + $this->DKIM_QP($subject_header) + ); // Copied header fields (dkim-quoted-printable) + $body = $this->DKIM_BodyC($body); + $DKIMlen = strlen($body); // Length of body + $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body + if ('' == $this->DKIM_identity) { + $ident = ''; + } else { + $ident = ' i=' . $this->DKIM_identity . ';'; + } + $dkimhdrs = 'DKIM-Signature: v=1; a=' . + $DKIMsignatureType . '; q=' . + $DKIMquery . '; l=' . + $DKIMlen . '; s=' . + $this->DKIM_selector . + ";\r\n" . + "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" . + "\th=From:To:Date:Subject;\r\n" . + "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" . + "\tz=$from\r\n" . + "\t|$to\r\n" . + "\t|$date\r\n" . + "\t|$subject;\r\n" . + "\tbh=" . $DKIMb64 . ";\r\n" . + "\tb="; + $toSign = $this->DKIM_HeaderC( + $from_header . "\r\n" . + $to_header . "\r\n" . + $date_header . "\r\n" . + $subject_header . "\r\n" . + $dkimhdrs + ); + $signed = $this->DKIM_Sign($toSign); + return $dkimhdrs . $signed . "\r\n"; + } + + /** + * Detect if a string contains a line longer than the maximum line length allowed. + * @param string $str + * @return boolean + * @static + */ + public static function hasLineLongerThanMax($str) + { + //+2 to include CRLF line break for a 1000 total + return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str); + } + + /** + * Allows for public read access to 'to' property. + * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. + * @access public + * @return array + */ + public function getToAddresses() + { + return $this->to; + } + + /** + * Allows for public read access to 'cc' property. + * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. + * @access public + * @return array + */ + public function getCcAddresses() + { + return $this->cc; + } + + /** + * Allows for public read access to 'bcc' property. + * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. + * @access public + * @return array + */ + public function getBccAddresses() + { + return $this->bcc; + } + + /** + * Allows for public read access to 'ReplyTo' property. + * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. + * @access public + * @return array + */ + public function getReplyToAddresses() + { + return $this->ReplyTo; + } + + /** + * Allows for public read access to 'all_recipients' property. + * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. + * @access public + * @return array + */ + public function getAllRecipientAddresses() + { + return $this->all_recipients; + } + + /** + * Perform a callback. + * @param boolean $isSent + * @param array $to + * @param array $cc + * @param array $bcc + * @param string $subject + * @param string $body + * @param string $from + */ + protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from) + { + if (!empty($this->action_function) && is_callable($this->action_function)) { + $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from); + call_user_func_array($this->action_function, $params); + } + } +} + +/** + * PHPMailer exception handler + * @package PHPMailer + */ +class phpmailerException extends Exception +{ + /** + * Prettify error message output + * @return string + */ + public function errorMessage() + { + $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . "</strong><br />\n"; + return $errorMsg; + } +} diff --git a/wp-includes/class-pop3.php b/wp-includes/class-pop3.php new file mode 100644 index 0000000..9ad1856 --- /dev/null +++ b/wp-includes/class-pop3.php @@ -0,0 +1,662 @@ +<?php +/** + * mail_fetch/setup.php + * + * Copyright (c) 1999-2011 CDI (cdi@thewebmasters.net) All Rights Reserved + * Modified by Philippe Mingo 2001-2009 mingo@rotedic.com + * An RFC 1939 compliant wrapper class for the POP3 protocol. + * + * Licensed under the GNU GPL. For full terms see the file COPYING. + * + * POP3 class + * + * @copyright 1999-2011 The SquirrelMail Project Team + * @license http://opensource.org/licenses/gpl-license.php GNU Public License + * @package plugins + * @subpackage mail_fetch + */ + +class POP3 { + var $ERROR = ''; // Error string. + + var $TIMEOUT = 60; // Default timeout before giving up on a + // network operation. + + var $COUNT = -1; // Mailbox msg count + + var $BUFFER = 512; // Socket buffer for socket fgets() calls. + // Per RFC 1939 the returned line a POP3 + // server can send is 512 bytes. + + var $FP = ''; // The connection to the server's + // file descriptor + + var $MAILSERVER = ''; // Set this to hard code the server name + + var $DEBUG = FALSE; // set to true to echo pop3 + // commands and responses to error_log + // this WILL log passwords! + + var $BANNER = ''; // Holds the banner returned by the + // pop server - used for apop() + + var $ALLOWAPOP = FALSE; // Allow or disallow apop() + // This must be set to true + // manually + + /** + * PHP5 constructor. + */ + function __construct ( $server = '', $timeout = '' ) { + settype($this->BUFFER,"integer"); + if( !empty($server) ) { + // Do not allow programs to alter MAILSERVER + // if it is already specified. They can get around + // this if they -really- want to, so don't count on it. + if(empty($this->MAILSERVER)) + $this->MAILSERVER = $server; + } + if(!empty($timeout)) { + settype($timeout,"integer"); + $this->TIMEOUT = $timeout; + if (!ini_get('safe_mode')) + set_time_limit($timeout); + } + return true; + } + + /** + * PHP4 constructor. + */ + public function POP3( $server = '', $timeout = '' ) { + self::__construct( $server, $timeout ); + } + + function update_timer () { + if (!ini_get('safe_mode')) + set_time_limit($this->TIMEOUT); + return true; + } + + function connect ($server, $port = 110) { + // Opens a socket to the specified server. Unless overridden, + // port defaults to 110. Returns true on success, false on fail + + // If MAILSERVER is set, override $server with its value. + + if (!isset($port) || !$port) {$port = 110;} + if(!empty($this->MAILSERVER)) + $server = $this->MAILSERVER; + + if(empty($server)){ + $this->ERROR = "POP3 connect: " . _("No server specified"); + unset($this->FP); + return false; + } + + $fp = @fsockopen("$server", $port, $errno, $errstr); + + if(!$fp) { + $this->ERROR = "POP3 connect: " . _("Error ") . "[$errno] [$errstr]"; + unset($this->FP); + return false; + } + + socket_set_blocking($fp,-1); + $this->update_timer(); + $reply = fgets($fp,$this->BUFFER); + $reply = $this->strip_clf($reply); + if($this->DEBUG) + error_log("POP3 SEND [connect: $server] GOT [$reply]",0); + if(!$this->is_ok($reply)) { + $this->ERROR = "POP3 connect: " . _("Error ") . "[$reply]"; + unset($this->FP); + return false; + } + $this->FP = $fp; + $this->BANNER = $this->parse_banner($reply); + return true; + } + + function user ($user = "") { + // Sends the USER command, returns true or false + + if( empty($user) ) { + $this->ERROR = "POP3 user: " . _("no login ID submitted"); + return false; + } elseif(!isset($this->FP)) { + $this->ERROR = "POP3 user: " . _("connection not established"); + return false; + } else { + $reply = $this->send_cmd("USER $user"); + if(!$this->is_ok($reply)) { + $this->ERROR = "POP3 user: " . _("Error ") . "[$reply]"; + return false; + } else + return true; + } + } + + function pass ($pass = "") { + // Sends the PASS command, returns # of msgs in mailbox, + // returns false (undef) on Auth failure + + if(empty($pass)) { + $this->ERROR = "POP3 pass: " . _("No password submitted"); + return false; + } elseif(!isset($this->FP)) { + $this->ERROR = "POP3 pass: " . _("connection not established"); + return false; + } else { + $reply = $this->send_cmd("PASS $pass"); + if(!$this->is_ok($reply)) { + $this->ERROR = "POP3 pass: " . _("Authentication failed") . " [$reply]"; + $this->quit(); + return false; + } else { + // Auth successful. + $count = $this->last("count"); + $this->COUNT = $count; + return $count; + } + } + } + + function apop ($login,$pass) { + // Attempts an APOP login. If this fails, it'll + // try a standard login. YOUR SERVER MUST SUPPORT + // THE USE OF THE APOP COMMAND! + // (apop is optional per rfc1939) + + if(!isset($this->FP)) { + $this->ERROR = "POP3 apop: " . _("No connection to server"); + return false; + } elseif(!$this->ALLOWAPOP) { + $retVal = $this->login($login,$pass); + return $retVal; + } elseif(empty($login)) { + $this->ERROR = "POP3 apop: " . _("No login ID submitted"); + return false; + } elseif(empty($pass)) { + $this->ERROR = "POP3 apop: " . _("No password submitted"); + return false; + } else { + $banner = $this->BANNER; + if( (!$banner) or (empty($banner)) ) { + $this->ERROR = "POP3 apop: " . _("No server banner") . ' - ' . _("abort"); + $retVal = $this->login($login,$pass); + return $retVal; + } else { + $AuthString = $banner; + $AuthString .= $pass; + $APOPString = md5($AuthString); + $cmd = "APOP $login $APOPString"; + $reply = $this->send_cmd($cmd); + if(!$this->is_ok($reply)) { + $this->ERROR = "POP3 apop: " . _("apop authentication failed") . ' - ' . _("abort"); + $retVal = $this->login($login,$pass); + return $retVal; + } else { + // Auth successful. + $count = $this->last("count"); + $this->COUNT = $count; + return $count; + } + } + } + } + + function login ($login = "", $pass = "") { + // Sends both user and pass. Returns # of msgs in mailbox or + // false on failure (or -1, if the error occurs while getting + // the number of messages.) + + if( !isset($this->FP) ) { + $this->ERROR = "POP3 login: " . _("No connection to server"); + return false; + } else { + $fp = $this->FP; + if( !$this->user( $login ) ) { + // Preserve the error generated by user() + return false; + } else { + $count = $this->pass($pass); + if( (!$count) || ($count == -1) ) { + // Preserve the error generated by last() and pass() + return false; + } else + return $count; + } + } + } + + function top ($msgNum, $numLines = "0") { + // Gets the header and first $numLines of the msg body + // returns data in an array with each returned line being + // an array element. If $numLines is empty, returns + // only the header information, and none of the body. + + if(!isset($this->FP)) { + $this->ERROR = "POP3 top: " . _("No connection to server"); + return false; + } + $this->update_timer(); + + $fp = $this->FP; + $buffer = $this->BUFFER; + $cmd = "TOP $msgNum $numLines"; + fwrite($fp, "TOP $msgNum $numLines\r\n"); + $reply = fgets($fp, $buffer); + $reply = $this->strip_clf($reply); + if($this->DEBUG) { + @error_log("POP3 SEND [$cmd] GOT [$reply]",0); + } + if(!$this->is_ok($reply)) + { + $this->ERROR = "POP3 top: " . _("Error ") . "[$reply]"; + return false; + } + + $count = 0; + $MsgArray = array(); + + $line = fgets($fp,$buffer); + while ( !preg_match('/^\.\r\n/',$line)) + { + $MsgArray[$count] = $line; + $count++; + $line = fgets($fp,$buffer); + if(empty($line)) { break; } + } + + return $MsgArray; + } + + function pop_list ($msgNum = "") { + // If called with an argument, returns that msgs' size in octets + // No argument returns an associative array of undeleted + // msg numbers and their sizes in octets + + if(!isset($this->FP)) + { + $this->ERROR = "POP3 pop_list: " . _("No connection to server"); + return false; + } + $fp = $this->FP; + $Total = $this->COUNT; + if( (!$Total) or ($Total == -1) ) + { + return false; + } + if($Total == 0) + { + return array("0","0"); + // return -1; // mailbox empty + } + + $this->update_timer(); + + if(!empty($msgNum)) + { + $cmd = "LIST $msgNum"; + fwrite($fp,"$cmd\r\n"); + $reply = fgets($fp,$this->BUFFER); + $reply = $this->strip_clf($reply); + if($this->DEBUG) { + @error_log("POP3 SEND [$cmd] GOT [$reply]",0); + } + if(!$this->is_ok($reply)) + { + $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; + return false; + } + list($junk,$num,$size) = preg_split('/\s+/',$reply); + return $size; + } + $cmd = "LIST"; + $reply = $this->send_cmd($cmd); + if(!$this->is_ok($reply)) + { + $reply = $this->strip_clf($reply); + $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; + return false; + } + $MsgArray = array(); + $MsgArray[0] = $Total; + for($msgC=1;$msgC <= $Total; $msgC++) + { + if($msgC > $Total) { break; } + $line = fgets($fp,$this->BUFFER); + $line = $this->strip_clf($line); + if(strpos($line, '.') === 0) + { + $this->ERROR = "POP3 pop_list: " . _("Premature end of list"); + return false; + } + list($thisMsg,$msgSize) = preg_split('/\s+/',$line); + settype($thisMsg,"integer"); + if($thisMsg != $msgC) + { + $MsgArray[$msgC] = "deleted"; + } + else + { + $MsgArray[$msgC] = $msgSize; + } + } + return $MsgArray; + } + + function get ($msgNum) { + // Retrieve the specified msg number. Returns an array + // where each line of the msg is an array element. + + if(!isset($this->FP)) + { + $this->ERROR = "POP3 get: " . _("No connection to server"); + return false; + } + + $this->update_timer(); + + $fp = $this->FP; + $buffer = $this->BUFFER; + $cmd = "RETR $msgNum"; + $reply = $this->send_cmd($cmd); + + if(!$this->is_ok($reply)) + { + $this->ERROR = "POP3 get: " . _("Error ") . "[$reply]"; + return false; + } + + $count = 0; + $MsgArray = array(); + + $line = fgets($fp,$buffer); + while ( !preg_match('/^\.\r\n/',$line)) + { + if ( $line[0] == '.' ) { $line = substr($line,1); } + $MsgArray[$count] = $line; + $count++; + $line = fgets($fp,$buffer); + if(empty($line)) { break; } + } + return $MsgArray; + } + + function last ( $type = "count" ) { + // Returns the highest msg number in the mailbox. + // returns -1 on error, 0+ on success, if type != count + // results in a popstat() call (2 element array returned) + + $last = -1; + if(!isset($this->FP)) + { + $this->ERROR = "POP3 last: " . _("No connection to server"); + return $last; + } + + $reply = $this->send_cmd("STAT"); + if(!$this->is_ok($reply)) + { + $this->ERROR = "POP3 last: " . _("Error ") . "[$reply]"; + return $last; + } + + $Vars = preg_split('/\s+/',$reply); + $count = $Vars[1]; + $size = $Vars[2]; + settype($count,"integer"); + settype($size,"integer"); + if($type != "count") + { + return array($count,$size); + } + return $count; + } + + function reset () { + // Resets the status of the remote server. This includes + // resetting the status of ALL msgs to not be deleted. + // This method automatically closes the connection to the server. + + if(!isset($this->FP)) + { + $this->ERROR = "POP3 reset: " . _("No connection to server"); + return false; + } + $reply = $this->send_cmd("RSET"); + if(!$this->is_ok($reply)) + { + // The POP3 RSET command -never- gives a -ERR + // response - if it ever does, something truly + // wild is going on. + + $this->ERROR = "POP3 reset: " . _("Error ") . "[$reply]"; + @error_log("POP3 reset: ERROR [$reply]",0); + } + $this->quit(); + return true; + } + + function send_cmd ( $cmd = "" ) + { + // Sends a user defined command string to the + // POP server and returns the results. Useful for + // non-compliant or custom POP servers. + // Do NOT includ the \r\n as part of your command + // string - it will be appended automatically. + + // The return value is a standard fgets() call, which + // will read up to $this->BUFFER bytes of data, until it + // encounters a new line, or EOF, whichever happens first. + + // This method works best if $cmd responds with only + // one line of data. + + if(!isset($this->FP)) + { + $this->ERROR = "POP3 send_cmd: " . _("No connection to server"); + return false; + } + + if(empty($cmd)) + { + $this->ERROR = "POP3 send_cmd: " . _("Empty command string"); + return ""; + } + + $fp = $this->FP; + $buffer = $this->BUFFER; + $this->update_timer(); + fwrite($fp,"$cmd\r\n"); + $reply = fgets($fp,$buffer); + $reply = $this->strip_clf($reply); + if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } + return $reply; + } + + function quit() { + // Closes the connection to the POP3 server, deleting + // any msgs marked as deleted. + + if(!isset($this->FP)) + { + $this->ERROR = "POP3 quit: " . _("connection does not exist"); + return false; + } + $fp = $this->FP; + $cmd = "QUIT"; + fwrite($fp,"$cmd\r\n"); + $reply = fgets($fp,$this->BUFFER); + $reply = $this->strip_clf($reply); + if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } + fclose($fp); + unset($this->FP); + return true; + } + + function popstat () { + // Returns an array of 2 elements. The number of undeleted + // msgs in the mailbox, and the size of the mbox in octets. + + $PopArray = $this->last("array"); + + if($PopArray == -1) { return false; } + + if( (!$PopArray) or (empty($PopArray)) ) + { + return false; + } + return $PopArray; + } + + function uidl ($msgNum = "") + { + // Returns the UIDL of the msg specified. If called with + // no arguments, returns an associative array where each + // undeleted msg num is a key, and the msg's uidl is the element + // Array element 0 will contain the total number of msgs + + if(!isset($this->FP)) { + $this->ERROR = "POP3 uidl: " . _("No connection to server"); + return false; + } + + $fp = $this->FP; + $buffer = $this->BUFFER; + + if(!empty($msgNum)) { + $cmd = "UIDL $msgNum"; + $reply = $this->send_cmd($cmd); + if(!$this->is_ok($reply)) + { + $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; + return false; + } + list ($ok,$num,$myUidl) = preg_split('/\s+/',$reply); + return $myUidl; + } else { + $this->update_timer(); + + $UIDLArray = array(); + $Total = $this->COUNT; + $UIDLArray[0] = $Total; + + if ($Total < 1) + { + return $UIDLArray; + } + $cmd = "UIDL"; + fwrite($fp, "UIDL\r\n"); + $reply = fgets($fp, $buffer); + $reply = $this->strip_clf($reply); + if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } + if(!$this->is_ok($reply)) + { + $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; + return false; + } + + $line = ""; + $count = 1; + $line = fgets($fp,$buffer); + while ( !preg_match('/^\.\r\n/',$line)) { + list ($msg,$msgUidl) = preg_split('/\s+/',$line); + $msgUidl = $this->strip_clf($msgUidl); + if($count == $msg) { + $UIDLArray[$msg] = $msgUidl; + } + else + { + $UIDLArray[$count] = 'deleted'; + } + $count++; + $line = fgets($fp,$buffer); + } + } + return $UIDLArray; + } + + function delete ($msgNum = "") { + // Flags a specified msg as deleted. The msg will not + // be deleted until a quit() method is called. + + if(!isset($this->FP)) + { + $this->ERROR = "POP3 delete: " . _("No connection to server"); + return false; + } + if(empty($msgNum)) + { + $this->ERROR = "POP3 delete: " . _("No msg number submitted"); + return false; + } + $reply = $this->send_cmd("DELE $msgNum"); + if(!$this->is_ok($reply)) + { + $this->ERROR = "POP3 delete: " . _("Command failed ") . "[$reply]"; + return false; + } + return true; + } + + // ********************************************************* + + // The following methods are internal to the class. + + function is_ok ($cmd = "") { + // Return true or false on +OK or -ERR + + if( empty($cmd) ) + return false; + else + return( stripos($cmd, '+OK') !== false ); + } + + function strip_clf ($text = "") { + // Strips \r\n from server responses + + if(empty($text)) + return $text; + else { + $stripped = str_replace(array("\r","\n"),'',$text); + return $stripped; + } + } + + function parse_banner ( $server_text ) { + $outside = true; + $banner = ""; + $length = strlen($server_text); + for($count =0; $count < $length; $count++) + { + $digit = substr($server_text,$count,1); + if(!empty($digit)) { + if( (!$outside) && ($digit != '<') && ($digit != '>') ) + { + $banner .= $digit; + } + if ($digit == '<') + { + $outside = false; + } + if($digit == '>') + { + $outside = true; + } + } + } + $banner = $this->strip_clf($banner); // Just in case + return "<$banner>"; + } + +} // End class + +// For php4 compatibility +if (!function_exists("stripos")) { + function stripos($haystack, $needle){ + return strpos($haystack, stristr( $haystack, $needle )); + } +} diff --git a/wp-includes/class-requests.php b/wp-includes/class-requests.php new file mode 100644 index 0000000..e977380 --- /dev/null +++ b/wp-includes/class-requests.php @@ -0,0 +1,980 @@ +<?php +/** + * Requests for PHP + * + * Inspired by Requests for Python. + * + * Based on concepts from SimplePie_File, RequestCore and WP_Http. + * + * @package Requests + */ + +/** + * Requests for PHP + * + * Inspired by Requests for Python. + * + * Based on concepts from SimplePie_File, RequestCore and WP_Http. + * + * @package Requests + */ +class Requests { + /** + * POST method + * + * @var string + */ + const POST = 'POST'; + + /** + * PUT method + * + * @var string + */ + const PUT = 'PUT'; + + /** + * GET method + * + * @var string + */ + const GET = 'GET'; + + /** + * HEAD method + * + * @var string + */ + const HEAD = 'HEAD'; + + /** + * DELETE method + * + * @var string + */ + const DELETE = 'DELETE'; + + /** + * OPTIONS method + * + * @var string + */ + const OPTIONS = 'OPTIONS'; + + /** + * TRACE method + * + * @var string + */ + const TRACE = 'TRACE'; + + /** + * PATCH method + * + * @link https://tools.ietf.org/html/rfc5789 + * @var string + */ + const PATCH = 'PATCH'; + + /** + * Default size of buffer size to read streams + * + * @var integer + */ + const BUFFER_SIZE = 1160; + + /** + * Current version of Requests + * + * @var string + */ + const VERSION = '1.7-3470169'; + + /** + * Registered transport classes + * + * @var array + */ + protected static $transports = array(); + + /** + * Selected transport name + * + * Use {@see get_transport()} instead + * + * @var array + */ + public static $transport = array(); + + /** + * Default certificate path. + * + * @see Requests::get_certificate_path() + * @see Requests::set_certificate_path() + * + * @var string + */ + protected static $certificate_path; + + /** + * This is a static class, do not instantiate it + * + * @codeCoverageIgnore + */ + private function __construct() {} + + /** + * Autoloader for Requests + * + * Register this with {@see register_autoloader()} if you'd like to avoid + * having to create your own. + * + * (You can also use `spl_autoload_register` directly if you'd prefer.) + * + * @codeCoverageIgnore + * + * @param string $class Class name to load + */ + public static function autoloader($class) { + // Check that the class starts with "Requests" + if (strpos($class, 'Requests') !== 0) { + return; + } + + $file = str_replace('_', '/', $class); + if (file_exists(dirname(__FILE__) . '/' . $file . '.php')) { + require_once(dirname(__FILE__) . '/' . $file . '.php'); + } + } + + /** + * Register the built-in autoloader + * + * @codeCoverageIgnore + */ + public static function register_autoloader() { + spl_autoload_register(array('Requests', 'autoloader')); + } + + /** + * Register a transport + * + * @param string $transport Transport class to add, must support the Requests_Transport interface + */ + public static function add_transport($transport) { + if (empty(self::$transports)) { + self::$transports = array( + 'Requests_Transport_cURL', + 'Requests_Transport_fsockopen', + ); + } + + self::$transports = array_merge(self::$transports, array($transport)); + } + + /** + * Get a working transport + * + * @throws Requests_Exception If no valid transport is found (`notransport`) + * @return Requests_Transport + */ + protected static function get_transport($capabilities = array()) { + // Caching code, don't bother testing coverage + // @codeCoverageIgnoreStart + // array of capabilities as a string to be used as an array key + ksort($capabilities); + $cap_string = serialize($capabilities); + + // Don't search for a transport if it's already been done for these $capabilities + if (isset(self::$transport[$cap_string]) && self::$transport[$cap_string] !== null) { + return new self::$transport[$cap_string](); + } + // @codeCoverageIgnoreEnd + + if (empty(self::$transports)) { + self::$transports = array( + 'Requests_Transport_cURL', + 'Requests_Transport_fsockopen', + ); + } + + // Find us a working transport + foreach (self::$transports as $class) { + if (!class_exists($class)) { + continue; + } + + $result = call_user_func(array($class, 'test'), $capabilities); + if ($result) { + self::$transport[$cap_string] = $class; + break; + } + } + if (self::$transport[$cap_string] === null) { + throw new Requests_Exception('No working transports found', 'notransport', self::$transports); + } + + return new self::$transport[$cap_string](); + } + + /**#@+ + * @see request() + * @param string $url + * @param array $headers + * @param array $options + * @return Requests_Response + */ + /** + * Send a GET request + */ + public static function get($url, $headers = array(), $options = array()) { + return self::request($url, $headers, null, self::GET, $options); + } + + /** + * Send a HEAD request + */ + public static function head($url, $headers = array(), $options = array()) { + return self::request($url, $headers, null, self::HEAD, $options); + } + + /** + * Send a DELETE request + */ + public static function delete($url, $headers = array(), $options = array()) { + return self::request($url, $headers, null, self::DELETE, $options); + } + + /** + * Send a TRACE request + */ + public static function trace($url, $headers = array(), $options = array()) { + return self::request($url, $headers, null, self::TRACE, $options); + } + /**#@-*/ + + /**#@+ + * @see request() + * @param string $url + * @param array $headers + * @param array $data + * @param array $options + * @return Requests_Response + */ + /** + * Send a POST request + */ + public static function post($url, $headers = array(), $data = array(), $options = array()) { + return self::request($url, $headers, $data, self::POST, $options); + } + /** + * Send a PUT request + */ + public static function put($url, $headers = array(), $data = array(), $options = array()) { + return self::request($url, $headers, $data, self::PUT, $options); + } + + /** + * Send an OPTIONS request + */ + public static function options($url, $headers = array(), $data = array(), $options = array()) { + return self::request($url, $headers, $data, self::OPTIONS, $options); + } + + /** + * Send a PATCH request + * + * Note: Unlike {@see post} and {@see put}, `$headers` is required, as the + * specification recommends that should send an ETag + * + * @link https://tools.ietf.org/html/rfc5789 + */ + public static function patch($url, $headers, $data = array(), $options = array()) { + return self::request($url, $headers, $data, self::PATCH, $options); + } + /**#@-*/ + + /** + * Main interface for HTTP requests + * + * This method initiates a request and sends it via a transport before + * parsing. + * + * The `$options` parameter takes an associative array with the following + * options: + * + * - `timeout`: How long should we wait for a response? + * Note: for cURL, a minimum of 1 second applies, as DNS resolution + * operates at second-resolution only. + * (float, seconds with a millisecond precision, default: 10, example: 0.01) + * - `connect_timeout`: How long should we wait while trying to connect? + * (float, seconds with a millisecond precision, default: 10, example: 0.01) + * - `useragent`: Useragent to send to the server + * (string, default: php-requests/$version) + * - `follow_redirects`: Should we follow 3xx redirects? + * (boolean, default: true) + * - `redirects`: How many times should we redirect before erroring? + * (integer, default: 10) + * - `blocking`: Should we block processing on this request? + * (boolean, default: true) + * - `filename`: File to stream the body to instead. + * (string|boolean, default: false) + * - `auth`: Authentication handler or array of user/password details to use + * for Basic authentication + * (Requests_Auth|array|boolean, default: false) + * - `proxy`: Proxy details to use for proxy by-passing and authentication + * (Requests_Proxy|array|string|boolean, default: false) + * - `max_bytes`: Limit for the response body size. + * (integer|boolean, default: false) + * - `idn`: Enable IDN parsing + * (boolean, default: true) + * - `transport`: Custom transport. Either a class name, or a + * transport object. Defaults to the first working transport from + * {@see getTransport()} + * (string|Requests_Transport, default: {@see getTransport()}) + * - `hooks`: Hooks handler. + * (Requests_Hooker, default: new Requests_Hooks()) + * - `verify`: Should we verify SSL certificates? Allows passing in a custom + * certificate file as a string. (Using true uses the system-wide root + * certificate store instead, but this may have different behaviour + * across transports.) + * (string|boolean, default: library/Requests/Transport/cacert.pem) + * - `verifyname`: Should we verify the common name in the SSL certificate? + * (boolean: default, true) + * - `data_format`: How should we send the `$data` parameter? + * (string, one of 'query' or 'body', default: 'query' for + * HEAD/GET/DELETE, 'body' for POST/PUT/OPTIONS/PATCH) + * + * @throws Requests_Exception On invalid URLs (`nonhttp`) + * + * @param string $url URL to request + * @param array $headers Extra headers to send with the request + * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests + * @param string $type HTTP request type (use Requests constants) + * @param array $options Options for the request (see description for more information) + * @return Requests_Response + */ + public static function request($url, $headers = array(), $data = array(), $type = self::GET, $options = array()) { + if (empty($options['type'])) { + $options['type'] = $type; + } + $options = array_merge(self::get_default_options(), $options); + + self::set_defaults($url, $headers, $data, $type, $options); + + $options['hooks']->dispatch('requests.before_request', array(&$url, &$headers, &$data, &$type, &$options)); + + if (!empty($options['transport'])) { + $transport = $options['transport']; + + if (is_string($options['transport'])) { + $transport = new $transport(); + } + } + else { + $need_ssl = (0 === stripos($url, 'https://')); + $capabilities = array('ssl' => $need_ssl); + $transport = self::get_transport($capabilities); + } + $response = $transport->request($url, $headers, $data, $options); + + $options['hooks']->dispatch('requests.before_parse', array(&$response, $url, $headers, $data, $type, $options)); + + return self::parse_response($response, $url, $headers, $data, $options); + } + + /** + * Send multiple HTTP requests simultaneously + * + * The `$requests` parameter takes an associative or indexed array of + * request fields. The key of each request can be used to match up the + * request with the returned data, or with the request passed into your + * `multiple.request.complete` callback. + * + * The request fields value is an associative array with the following keys: + * + * - `url`: Request URL Same as the `$url` parameter to + * {@see Requests::request} + * (string, required) + * - `headers`: Associative array of header fields. Same as the `$headers` + * parameter to {@see Requests::request} + * (array, default: `array()`) + * - `data`: Associative array of data fields or a string. Same as the + * `$data` parameter to {@see Requests::request} + * (array|string, default: `array()`) + * - `type`: HTTP request type (use Requests constants). Same as the `$type` + * parameter to {@see Requests::request} + * (string, default: `Requests::GET`) + * - `cookies`: Associative array of cookie name to value, or cookie jar. + * (array|Requests_Cookie_Jar) + * + * If the `$options` parameter is specified, individual requests will + * inherit options from it. This can be used to use a single hooking system, + * or set all the types to `Requests::POST`, for example. + * + * In addition, the `$options` parameter takes the following global options: + * + * - `complete`: A callback for when a request is complete. Takes two + * parameters, a Requests_Response/Requests_Exception reference, and the + * ID from the request array (Note: this can also be overridden on a + * per-request basis, although that's a little silly) + * (callback) + * + * @param array $requests Requests data (see description for more information) + * @param array $options Global and default options (see {@see Requests::request}) + * @return array Responses (either Requests_Response or a Requests_Exception object) + */ + public static function request_multiple($requests, $options = array()) { + $options = array_merge(self::get_default_options(true), $options); + + if (!empty($options['hooks'])) { + $options['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple')); + if (!empty($options['complete'])) { + $options['hooks']->register('multiple.request.complete', $options['complete']); + } + } + + foreach ($requests as $id => &$request) { + if (!isset($request['headers'])) { + $request['headers'] = array(); + } + if (!isset($request['data'])) { + $request['data'] = array(); + } + if (!isset($request['type'])) { + $request['type'] = self::GET; + } + if (!isset($request['options'])) { + $request['options'] = $options; + $request['options']['type'] = $request['type']; + } + else { + if (empty($request['options']['type'])) { + $request['options']['type'] = $request['type']; + } + $request['options'] = array_merge($options, $request['options']); + } + + self::set_defaults($request['url'], $request['headers'], $request['data'], $request['type'], $request['options']); + + // Ensure we only hook in once + if ($request['options']['hooks'] !== $options['hooks']) { + $request['options']['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple')); + if (!empty($request['options']['complete'])) { + $request['options']['hooks']->register('multiple.request.complete', $request['options']['complete']); + } + } + } + unset($request); + + if (!empty($options['transport'])) { + $transport = $options['transport']; + + if (is_string($options['transport'])) { + $transport = new $transport(); + } + } + else { + $transport = self::get_transport(); + } + $responses = $transport->request_multiple($requests, $options); + + foreach ($responses as $id => &$response) { + // If our hook got messed with somehow, ensure we end up with the + // correct response + if (is_string($response)) { + $request = $requests[$id]; + self::parse_multiple($response, $request); + $request['options']['hooks']->dispatch('multiple.request.complete', array(&$response, $id)); + } + } + + return $responses; + } + + /** + * Get the default options + * + * @see Requests::request() for values returned by this method + * @param boolean $multirequest Is this a multirequest? + * @return array Default option values + */ + protected static function get_default_options($multirequest = false) { + $defaults = array( + 'timeout' => 10, + 'connect_timeout' => 10, + 'useragent' => 'php-requests/' . self::VERSION, + 'protocol_version' => 1.1, + 'redirected' => 0, + 'redirects' => 10, + 'follow_redirects' => true, + 'blocking' => true, + 'type' => self::GET, + 'filename' => false, + 'auth' => false, + 'proxy' => false, + 'cookies' => false, + 'max_bytes' => false, + 'idn' => true, + 'hooks' => null, + 'transport' => null, + 'verify' => Requests::get_certificate_path(), + 'verifyname' => true, + ); + if ($multirequest !== false) { + $defaults['complete'] = null; + } + return $defaults; + } + + /** + * Get default certificate path. + * + * @return string Default certificate path. + */ + public static function get_certificate_path() { + if ( ! empty( Requests::$certificate_path ) ) { + return Requests::$certificate_path; + } + + return dirname(__FILE__) . '/Requests/Transport/cacert.pem'; + } + + /** + * Set default certificate path. + * + * @param string $path Certificate path, pointing to a PEM file. + */ + public static function set_certificate_path( $path ) { + Requests::$certificate_path = $path; + } + + /** + * Set the default values + * + * @param string $url URL to request + * @param array $headers Extra headers to send with the request + * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests + * @param string $type HTTP request type + * @param array $options Options for the request + * @return array $options + */ + protected static function set_defaults(&$url, &$headers, &$data, &$type, &$options) { + if (!preg_match('/^http(s)?:\/\//i', $url, $matches)) { + throw new Requests_Exception('Only HTTP(S) requests are handled.', 'nonhttp', $url); + } + + if (empty($options['hooks'])) { + $options['hooks'] = new Requests_Hooks(); + } + + if (is_array($options['auth'])) { + $options['auth'] = new Requests_Auth_Basic($options['auth']); + } + if ($options['auth'] !== false) { + $options['auth']->register($options['hooks']); + } + + if (is_string($options['proxy']) || is_array($options['proxy'])) { + $options['proxy'] = new Requests_Proxy_HTTP($options['proxy']); + } + if ($options['proxy'] !== false) { + $options['proxy']->register($options['hooks']); + } + + if (is_array($options['cookies'])) { + $options['cookies'] = new Requests_Cookie_Jar($options['cookies']); + } + elseif (empty($options['cookies'])) { + $options['cookies'] = new Requests_Cookie_Jar(); + } + if ($options['cookies'] !== false) { + $options['cookies']->register($options['hooks']); + } + + if ($options['idn'] !== false) { + $iri = new Requests_IRI($url); + $iri->host = Requests_IDNAEncoder::encode($iri->ihost); + $url = $iri->uri; + } + + // Massage the type to ensure we support it. + $type = strtoupper($type); + + if (!isset($options['data_format'])) { + if (in_array($type, array(self::HEAD, self::GET, self::DELETE))) { + $options['data_format'] = 'query'; + } + else { + $options['data_format'] = 'body'; + } + } + } + + /** + * HTTP response parser + * + * @throws Requests_Exception On missing head/body separator (`requests.no_crlf_separator`) + * @throws Requests_Exception On missing head/body separator (`noversion`) + * @throws Requests_Exception On missing head/body separator (`toomanyredirects`) + * + * @param string $headers Full response text including headers and body + * @param string $url Original request URL + * @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects + * @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects + * @param array $options Original $options array passed to {@link request()}, in case we need to follow redirects + * @return Requests_Response + */ + protected static function parse_response($headers, $url, $req_headers, $req_data, $options) { + $return = new Requests_Response(); + if (!$options['blocking']) { + return $return; + } + + $return->raw = $headers; + $return->url = $url; + + if (!$options['filename']) { + if (($pos = strpos($headers, "\r\n\r\n")) === false) { + // Crap! + throw new Requests_Exception('Missing header/body separator', 'requests.no_crlf_separator'); + } + + $headers = substr($return->raw, 0, $pos); + $return->body = substr($return->raw, $pos + strlen("\n\r\n\r")); + } + else { + $return->body = ''; + } + // Pretend CRLF = LF for compatibility (RFC 2616, section 19.3) + $headers = str_replace("\r\n", "\n", $headers); + // Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2) + $headers = preg_replace('/\n[ \t]/', ' ', $headers); + $headers = explode("\n", $headers); + preg_match('#^HTTP/(1\.\d)[ \t]+(\d+)#i', array_shift($headers), $matches); + if (empty($matches)) { + throw new Requests_Exception('Response could not be parsed', 'noversion', $headers); + } + $return->protocol_version = (float) $matches[1]; + $return->status_code = (int) $matches[2]; + if ($return->status_code >= 200 && $return->status_code < 300) { + $return->success = true; + } + + foreach ($headers as $header) { + list($key, $value) = explode(':', $header, 2); + $value = trim($value); + preg_replace('#(\s+)#i', ' ', $value); + $return->headers[$key] = $value; + } + if (isset($return->headers['transfer-encoding'])) { + $return->body = self::decode_chunked($return->body); + unset($return->headers['transfer-encoding']); + } + if (isset($return->headers['content-encoding'])) { + $return->body = self::decompress($return->body); + } + + //fsockopen and cURL compatibility + if (isset($return->headers['connection'])) { + unset($return->headers['connection']); + } + + $options['hooks']->dispatch('requests.before_redirect_check', array(&$return, $req_headers, $req_data, $options)); + + if ($return->is_redirect() && $options['follow_redirects'] === true) { + if (isset($return->headers['location']) && $options['redirected'] < $options['redirects']) { + if ($return->status_code === 303) { + $options['type'] = self::GET; + } + $options['redirected']++; + $location = $return->headers['location']; + if (strpos($location, 'http://') !== 0 && strpos($location, 'https://') !== 0) { + // relative redirect, for compatibility make it absolute + $location = Requests_IRI::absolutize($url, $location); + $location = $location->uri; + } + + $hook_args = array( + &$location, + &$req_headers, + &$req_data, + &$options, + $return + ); + $options['hooks']->dispatch('requests.before_redirect', $hook_args); + $redirected = self::request($location, $req_headers, $req_data, $options['type'], $options); + $redirected->history[] = $return; + return $redirected; + } + elseif ($options['redirected'] >= $options['redirects']) { + throw new Requests_Exception('Too many redirects', 'toomanyredirects', $return); + } + } + + $return->redirects = $options['redirected']; + + $options['hooks']->dispatch('requests.after_request', array(&$return, $req_headers, $req_data, $options)); + return $return; + } + + /** + * Callback for `transport.internal.parse_response` + * + * Internal use only. Converts a raw HTTP response to a Requests_Response + * while still executing a multiple request. + * + * @param string $response Full response text including headers and body (will be overwritten with Response instance) + * @param array $request Request data as passed into {@see Requests::request_multiple()} + * @return null `$response` is either set to a Requests_Response instance, or a Requests_Exception object + */ + public static function parse_multiple(&$response, $request) { + try { + $url = $request['url']; + $headers = $request['headers']; + $data = $request['data']; + $options = $request['options']; + $response = self::parse_response($response, $url, $headers, $data, $options); + } + catch (Requests_Exception $e) { + $response = $e; + } + } + + /** + * Decoded a chunked body as per RFC 2616 + * + * @see https://tools.ietf.org/html/rfc2616#section-3.6.1 + * @param string $data Chunked body + * @return string Decoded body + */ + protected static function decode_chunked($data) { + if (!preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', trim($data))) { + return $data; + } + + + + $decoded = ''; + $encoded = $data; + + while (true) { + $is_chunked = (bool) preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', $encoded, $matches); + if (!$is_chunked) { + // Looks like it's not chunked after all + return $data; + } + + $length = hexdec(trim($matches[1])); + if ($length === 0) { + // Ignore trailer headers + return $decoded; + } + + $chunk_length = strlen($matches[0]); + $decoded .= substr($encoded, $chunk_length, $length); + $encoded = substr($encoded, $chunk_length + $length + 2); + + if (trim($encoded) === '0' || empty($encoded)) { + return $decoded; + } + } + + // We'll never actually get down here + // @codeCoverageIgnoreStart + } + // @codeCoverageIgnoreEnd + + /** + * Convert a key => value array to a 'key: value' array for headers + * + * @param array $array Dictionary of header values + * @return string[] List of headers + */ + public static function flatten($array) { + $return = array(); + foreach ($array as $key => $value) { + $return[] = sprintf('%s: %s', $key, $value); + } + return $return; + } + + /** + * Convert a key => value array to a 'key: value' array for headers + * + * @codeCoverageIgnore + * @deprecated Misspelling of {@see Requests::flatten} + * @param array $array Dictionary of header values + * @return string[] List of headers + */ + public static function flattern($array) { + return self::flatten($array); + } + + /** + * Decompress an encoded body + * + * Implements gzip, compress and deflate. Guesses which it is by attempting + * to decode. + * + * @param string $data Compressed data in one of the above formats + * @return string Decompressed string + */ + public static function decompress($data) { + if (substr($data, 0, 2) !== "\x1f\x8b" && substr($data, 0, 2) !== "\x78\x9c") { + // Not actually compressed. Probably cURL ruining this for us. + return $data; + } + + if (function_exists('gzdecode') && ($decoded = @gzdecode($data)) !== false) { + return $decoded; + } + elseif (function_exists('gzinflate') && ($decoded = @gzinflate($data)) !== false) { + return $decoded; + } + elseif (($decoded = self::compatible_gzinflate($data)) !== false) { + return $decoded; + } + elseif (function_exists('gzuncompress') && ($decoded = @gzuncompress($data)) !== false) { + return $decoded; + } + + return $data; + } + + /** + * Decompression of deflated string while staying compatible with the majority of servers. + * + * Certain Servers will return deflated data with headers which PHP's gzinflate() + * function cannot handle out of the box. The following function has been created from + * various snippets on the gzinflate() PHP documentation. + * + * Warning: Magic numbers within. Due to the potential different formats that the compressed + * data may be returned in, some "magic offsets" are needed to ensure proper decompression + * takes place. For a simple progmatic way to determine the magic offset in use, see: + * https://core.trac.wordpress.org/ticket/18273 + * + * @since 2.8.1 + * @link https://core.trac.wordpress.org/ticket/18273 + * @link https://secure.php.net/manual/en/function.gzinflate.php#70875 + * @link https://secure.php.net/manual/en/function.gzinflate.php#77336 + * + * @param string $gzData String to decompress. + * @return string|bool False on failure. + */ + public static function compatible_gzinflate($gzData) { + // Compressed data might contain a full zlib header, if so strip it for + // gzinflate() + if (substr($gzData, 0, 3) == "\x1f\x8b\x08") { + $i = 10; + $flg = ord(substr($gzData, 3, 1)); + if ($flg > 0) { + if ($flg & 4) { + list($xlen) = unpack('v', substr($gzData, $i, 2)); + $i = $i + 2 + $xlen; + } + if ($flg & 8) { + $i = strpos($gzData, "\0", $i) + 1; + } + if ($flg & 16) { + $i = strpos($gzData, "\0", $i) + 1; + } + if ($flg & 2) { + $i = $i + 2; + } + } + $decompressed = self::compatible_gzinflate(substr($gzData, $i)); + if (false !== $decompressed) { + return $decompressed; + } + } + + // If the data is Huffman Encoded, we must first strip the leading 2 + // byte Huffman marker for gzinflate() + // The response is Huffman coded by many compressors such as + // java.util.zip.Deflater, Ruby’s Zlib::Deflate, and .NET's + // System.IO.Compression.DeflateStream. + // + // See https://decompres.blogspot.com/ for a quick explanation of this + // data type + $huffman_encoded = false; + + // low nibble of first byte should be 0x08 + list(, $first_nibble) = unpack('h', $gzData); + + // First 2 bytes should be divisible by 0x1F + list(, $first_two_bytes) = unpack('n', $gzData); + + if (0x08 == $first_nibble && 0 == ($first_two_bytes % 0x1F)) { + $huffman_encoded = true; + } + + if ($huffman_encoded) { + if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) { + return $decompressed; + } + } + + if ("\x50\x4b\x03\x04" == substr($gzData, 0, 4)) { + // ZIP file format header + // Offset 6: 2 bytes, General-purpose field + // Offset 26: 2 bytes, filename length + // Offset 28: 2 bytes, optional field length + // Offset 30: Filename field, followed by optional field, followed + // immediately by data + list(, $general_purpose_flag) = unpack('v', substr($gzData, 6, 2)); + + // If the file has been compressed on the fly, 0x08 bit is set of + // the general purpose field. We can use this to differentiate + // between a compressed document, and a ZIP file + $zip_compressed_on_the_fly = (0x08 == (0x08 & $general_purpose_flag)); + + if (!$zip_compressed_on_the_fly) { + // Don't attempt to decode a compressed zip file + return $gzData; + } + + // Determine the first byte of data, based on the above ZIP header + // offsets: + $first_file_start = array_sum(unpack('v2', substr($gzData, 26, 4))); + if (false !== ($decompressed = @gzinflate(substr($gzData, 30 + $first_file_start)))) { + return $decompressed; + } + return false; + } + + // Finally fall back to straight gzinflate + if (false !== ($decompressed = @gzinflate($gzData))) { + return $decompressed; + } + + // Fallback for all above failing, not expected, but included for + // debugging and preventing regressions and to track stats + if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) { + return $decompressed; + } + + return false; + } + + public static function match_domain($host, $reference) { + // Check for a direct match + if ($host === $reference) { + return true; + } + + // Calculate the valid wildcard match if the host is not an IP address + // Also validates that the host has 3 parts or more, as per Firefox's + // ruleset. + $parts = explode('.', $host); + if (ip2long($host) === false && count($parts) >= 3) { + $parts[0] = '*'; + $wildcard = implode('.', $parts); + if ($wildcard === $reference) { + return true; + } + } + + return false; + } +} diff --git a/wp-includes/class-simplepie.php b/wp-includes/class-simplepie.php new file mode 100644 index 0000000..348657f --- /dev/null +++ b/wp-includes/class-simplepie.php @@ -0,0 +1,3094 @@ +<?php +if ( ! class_exists( 'SimplePie', false ) ) : + +// Load classes we will need. +require ABSPATH . WPINC . '/SimplePie/Misc.php'; +require ABSPATH . WPINC . '/SimplePie/Cache.php'; +require ABSPATH . WPINC . '/SimplePie/File.php'; +require ABSPATH . WPINC . '/SimplePie/Sanitize.php'; +require ABSPATH . WPINC . '/SimplePie/Registry.php'; +require ABSPATH . WPINC . '/SimplePie/IRI.php'; +require ABSPATH . WPINC . '/SimplePie/Locator.php'; +require ABSPATH . WPINC . '/SimplePie/Content/Type/Sniffer.php'; +require ABSPATH . WPINC . '/SimplePie/XML/Declaration/Parser.php'; +require ABSPATH . WPINC . '/SimplePie/Parser.php'; +require ABSPATH . WPINC . '/SimplePie/Item.php'; +require ABSPATH . WPINC . '/SimplePie/Parse/Date.php'; +require ABSPATH . WPINC . '/SimplePie/Author.php'; + +/** + * WordPress autoloader for SimplePie. + * + * @since 3.5.0 + */ +function wp_simplepie_autoload( $class ) { + if ( 0 !== strpos( $class, 'SimplePie_' ) ) + return; + + $file = ABSPATH . WPINC . '/' . str_replace( '_', '/', $class ) . '.php'; + include $file; +} + +/** + * We autoload classes we may not need. + */ +spl_autoload_register( 'wp_simplepie_autoload' ); + +/** + * SimplePie + * + * A PHP-Based RSS and Atom Feed Framework. + * Takes the hard work out of managing a complete RSS/Atom solution. + * + * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * * Neither the name of the SimplePie Team nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS + * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @package SimplePie + * @version 1.3.1 + * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue + * @author Ryan Parman + * @author Geoffrey Sneddon + * @author Ryan McCue + * @link http://simplepie.org/ SimplePie + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + */ + +/** + * SimplePie Name + */ +define('SIMPLEPIE_NAME', 'SimplePie'); + +/** + * SimplePie Version + */ +define('SIMPLEPIE_VERSION', '1.3.1'); + +/** + * SimplePie Build + * @todo Hardcode for release (there's no need to have to call SimplePie_Misc::get_build() only every load of simplepie.inc) + */ +define('SIMPLEPIE_BUILD', gmdate('YmdHis', SimplePie_Misc::get_build())); + +/** + * SimplePie Website URL + */ +define('SIMPLEPIE_URL', 'http://simplepie.org'); + +/** + * SimplePie Useragent + * @see SimplePie::set_useragent() + */ +define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD); + +/** + * SimplePie Linkback + */ +define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>'); + +/** + * No Autodiscovery + * @see SimplePie::set_autodiscovery_level() + */ +define('SIMPLEPIE_LOCATOR_NONE', 0); + +/** + * Feed Link Element Autodiscovery + * @see SimplePie::set_autodiscovery_level() + */ +define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1); + +/** + * Local Feed Extension Autodiscovery + * @see SimplePie::set_autodiscovery_level() + */ +define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2); + +/** + * Local Feed Body Autodiscovery + * @see SimplePie::set_autodiscovery_level() + */ +define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4); + +/** + * Remote Feed Extension Autodiscovery + * @see SimplePie::set_autodiscovery_level() + */ +define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8); + +/** + * Remote Feed Body Autodiscovery + * @see SimplePie::set_autodiscovery_level() + */ +define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16); + +/** + * All Feed Autodiscovery + * @see SimplePie::set_autodiscovery_level() + */ +define('SIMPLEPIE_LOCATOR_ALL', 31); + +/** + * No known feed type + */ +define('SIMPLEPIE_TYPE_NONE', 0); + +/** + * RSS 0.90 + */ +define('SIMPLEPIE_TYPE_RSS_090', 1); + +/** + * RSS 0.91 (Netscape) + */ +define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2); + +/** + * RSS 0.91 (Userland) + */ +define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4); + +/** + * RSS 0.91 (both Netscape and Userland) + */ +define('SIMPLEPIE_TYPE_RSS_091', 6); + +/** + * RSS 0.92 + */ +define('SIMPLEPIE_TYPE_RSS_092', 8); + +/** + * RSS 0.93 + */ +define('SIMPLEPIE_TYPE_RSS_093', 16); + +/** + * RSS 0.94 + */ +define('SIMPLEPIE_TYPE_RSS_094', 32); + +/** + * RSS 1.0 + */ +define('SIMPLEPIE_TYPE_RSS_10', 64); + +/** + * RSS 2.0 + */ +define('SIMPLEPIE_TYPE_RSS_20', 128); + +/** + * RDF-based RSS + */ +define('SIMPLEPIE_TYPE_RSS_RDF', 65); + +/** + * Non-RDF-based RSS (truly intended as syndication format) + */ +define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190); + +/** + * All RSS + */ +define('SIMPLEPIE_TYPE_RSS_ALL', 255); + +/** + * Atom 0.3 + */ +define('SIMPLEPIE_TYPE_ATOM_03', 256); + +/** + * Atom 1.0 + */ +define('SIMPLEPIE_TYPE_ATOM_10', 512); + +/** + * All Atom + */ +define('SIMPLEPIE_TYPE_ATOM_ALL', 768); + +/** + * All feed types + */ +define('SIMPLEPIE_TYPE_ALL', 1023); + +/** + * No construct + */ +define('SIMPLEPIE_CONSTRUCT_NONE', 0); + +/** + * Text construct + */ +define('SIMPLEPIE_CONSTRUCT_TEXT', 1); + +/** + * HTML construct + */ +define('SIMPLEPIE_CONSTRUCT_HTML', 2); + +/** + * XHTML construct + */ +define('SIMPLEPIE_CONSTRUCT_XHTML', 4); + +/** + * base64-encoded construct + */ +define('SIMPLEPIE_CONSTRUCT_BASE64', 8); + +/** + * IRI construct + */ +define('SIMPLEPIE_CONSTRUCT_IRI', 16); + +/** + * A construct that might be HTML + */ +define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32); + +/** + * All constructs + */ +define('SIMPLEPIE_CONSTRUCT_ALL', 63); + +/** + * Don't change case + */ +define('SIMPLEPIE_SAME_CASE', 1); + +/** + * Change to lowercase + */ +define('SIMPLEPIE_LOWERCASE', 2); + +/** + * Change to uppercase + */ +define('SIMPLEPIE_UPPERCASE', 4); + +/** + * PCRE for HTML attributes + */ +define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*'); + +/** + * PCRE for XML attributes + */ +define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*'); + +/** + * XML Namespace + */ +define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace'); + +/** + * Atom 1.0 Namespace + */ +define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom'); + +/** + * Atom 0.3 Namespace + */ +define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#'); + +/** + * RDF Namespace + */ +define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); + +/** + * RSS 0.90 Namespace + */ +define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/'); + +/** + * RSS 1.0 Namespace + */ +define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/'); + +/** + * RSS 1.0 Content Module Namespace + */ +define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/'); + +/** + * RSS 2.0 Namespace + * (Stupid, I know, but I'm certain it will confuse people less with support.) + */ +define('SIMPLEPIE_NAMESPACE_RSS_20', ''); + +/** + * DC 1.0 Namespace + */ +define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/'); + +/** + * DC 1.1 Namespace + */ +define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/'); + +/** + * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace + */ +define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#'); + +/** + * GeoRSS Namespace + */ +define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss'); + +/** + * Media RSS Namespace + */ +define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/'); + +/** + * Wrong Media RSS Namespace. Caused by a long-standing typo in the spec. + */ +define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss'); + +/** + * Wrong Media RSS Namespace #2. New namespace introduced in Media RSS 1.5. + */ +define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2', 'http://video.search.yahoo.com/mrss'); + +/** + * Wrong Media RSS Namespace #3. A possible typo of the Media RSS 1.5 namespace. + */ +define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3', 'http://video.search.yahoo.com/mrss/'); + +/** + * Wrong Media RSS Namespace #4. New spec location after the RSS Advisory Board takes it over, but not a valid namespace. + */ +define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4', 'http://www.rssboard.org/media-rss'); + +/** + * Wrong Media RSS Namespace #5. A possible typo of the RSS Advisory Board URL. + */ +define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5', 'http://www.rssboard.org/media-rss/'); + +/** + * iTunes RSS Namespace + */ +define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); + +/** + * XHTML Namespace + */ +define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml'); + +/** + * IANA Link Relations Registry + */ +define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/'); + +/** + * No file source + */ +define('SIMPLEPIE_FILE_SOURCE_NONE', 0); + +/** + * Remote file source + */ +define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1); + +/** + * Local file source + */ +define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2); + +/** + * fsockopen() file source + */ +define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4); + +/** + * cURL file source + */ +define('SIMPLEPIE_FILE_SOURCE_CURL', 8); + +/** + * file_get_contents() file source + */ +define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16); + + + +/** + * SimplePie + * + * @package SimplePie + * @subpackage API + */ +class SimplePie +{ + /** + * @var array Raw data + * @access private + */ + public $data = array(); + + /** + * @var mixed Error string + * @access private + */ + public $error; + + /** + * @var object Instance of SimplePie_Sanitize (or other class) + * @see SimplePie::set_sanitize_class() + * @access private + */ + public $sanitize; + + /** + * @var string SimplePie Useragent + * @see SimplePie::set_useragent() + * @access private + */ + public $useragent = SIMPLEPIE_USERAGENT; + + /** + * @var string Feed URL + * @see SimplePie::set_feed_url() + * @access private + */ + public $feed_url; + + /** + * @var object Instance of SimplePie_File to use as a feed + * @see SimplePie::set_file() + * @access private + */ + public $file; + + /** + * @var string Raw feed data + * @see SimplePie::set_raw_data() + * @access private + */ + public $raw_data; + + /** + * @var int Timeout for fetching remote files + * @see SimplePie::set_timeout() + * @access private + */ + public $timeout = 10; + + /** + * @var bool Forces fsockopen() to be used for remote files instead + * of cURL, even if a new enough version is installed + * @see SimplePie::force_fsockopen() + * @access private + */ + public $force_fsockopen = false; + + /** + * @var bool Force the given data/URL to be treated as a feed no matter what + * it appears like + * @see SimplePie::force_feed() + * @access private + */ + public $force_feed = false; + + /** + * @var bool Enable/Disable Caching + * @see SimplePie::enable_cache() + * @access private + */ + public $cache = true; + + /** + * @var int Cache duration (in seconds) + * @see SimplePie::set_cache_duration() + * @access private + */ + public $cache_duration = 3600; + + /** + * @var int Auto-discovery cache duration (in seconds) + * @see SimplePie::set_autodiscovery_cache_duration() + * @access private + */ + public $autodiscovery_cache_duration = 604800; // 7 Days. + + /** + * @var string Cache location (relative to executing script) + * @see SimplePie::set_cache_location() + * @access private + */ + public $cache_location = './cache'; + + /** + * @var string Function that creates the cache filename + * @see SimplePie::set_cache_name_function() + * @access private + */ + public $cache_name_function = 'md5'; + + /** + * @var bool Reorder feed by date descending + * @see SimplePie::enable_order_by_date() + * @access private + */ + public $order_by_date = true; + + /** + * @var mixed Force input encoding to be set to the follow value + * (false, or anything type-cast to false, disables this feature) + * @see SimplePie::set_input_encoding() + * @access private + */ + public $input_encoding = false; + + /** + * @var int Feed Autodiscovery Level + * @see SimplePie::set_autodiscovery_level() + * @access private + */ + public $autodiscovery = SIMPLEPIE_LOCATOR_ALL; + + /** + * Class registry object + * + * @var SimplePie_Registry + */ + public $registry; + + /** + * @var int Maximum number of feeds to check with autodiscovery + * @see SimplePie::set_max_checked_feeds() + * @access private + */ + public $max_checked_feeds = 10; + + /** + * @var array All the feeds found during the autodiscovery process + * @see SimplePie::get_all_discovered_feeds() + * @access private + */ + public $all_discovered_feeds = array(); + + /** + * @var string Web-accessible path to the handler_image.php file. + * @see SimplePie::set_image_handler() + * @access private + */ + public $image_handler = ''; + + /** + * @var array Stores the URLs when multiple feeds are being initialized. + * @see SimplePie::set_feed_url() + * @access private + */ + public $multifeed_url = array(); + + /** + * @var array Stores SimplePie objects when multiple feeds initialized. + * @access private + */ + public $multifeed_objects = array(); + + /** + * @var array Stores the get_object_vars() array for use with multifeeds. + * @see SimplePie::set_feed_url() + * @access private + */ + public $config_settings = null; + + /** + * @var integer Stores the number of items to return per-feed with multifeeds. + * @see SimplePie::set_item_limit() + * @access private + */ + public $item_limit = 0; + + /** + * @var array Stores the default attributes to be stripped by strip_attributes(). + * @see SimplePie::strip_attributes() + * @access private + */ + public $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); + + /** + * @var array Stores the default tags to be stripped by strip_htmltags(). + * @see SimplePie::strip_htmltags() + * @access private + */ + public $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); + + /** + * The SimplePie class contains feed level data and options + * + * To use SimplePie, create the SimplePie object with no parameters. You can + * then set configuration options using the provided methods. After setting + * them, you must initialise the feed using $feed->init(). At that point the + * object's methods and properties will be available to you. + * + * Previously, it was possible to pass in the feed URL along with cache + * options directly into the constructor. This has been removed as of 1.3 as + * it caused a lot of confusion. + * + * @since 1.0 Preview Release + */ + public function __construct() + { + if (version_compare(PHP_VERSION, '5.2', '<')) + { + trigger_error('PHP 4.x, 5.0 and 5.1 are no longer supported. Please upgrade to PHP 5.2 or newer.'); + die(); + } + + // Other objects, instances created here so we can set options on them + $this->sanitize = new SimplePie_Sanitize(); + $this->registry = new SimplePie_Registry(); + + if (func_num_args() > 0) + { + $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; + trigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_location() directly.', $level); + + $args = func_get_args(); + switch (count($args)) { + case 3: + $this->set_cache_duration($args[2]); + case 2: + $this->set_cache_location($args[1]); + case 1: + $this->set_feed_url($args[0]); + $this->init(); + } + } + } + + /** + * Used for converting object to a string + */ + public function __toString() + { + return md5(serialize($this->data)); + } + + /** + * Remove items that link back to this before destroying this object + */ + public function __destruct() + { + if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) + { + if (!empty($this->data['items'])) + { + foreach ($this->data['items'] as $item) + { + $item->__destruct(); + } + unset($item, $this->data['items']); + } + if (!empty($this->data['ordered_items'])) + { + foreach ($this->data['ordered_items'] as $item) + { + $item->__destruct(); + } + unset($item, $this->data['ordered_items']); + } + } + } + + /** + * Force the given data/URL to be treated as a feed + * + * This tells SimplePie to ignore the content-type provided by the server. + * Be careful when using this option, as it will also disable autodiscovery. + * + * @since 1.1 + * @param bool $enable Force the given data/URL to be treated as a feed + */ + public function force_feed($enable = false) + { + $this->force_feed = (bool) $enable; + } + + /** + * Set the URL of the feed you want to parse + * + * This allows you to enter the URL of the feed you want to parse, or the + * website you want to try to use auto-discovery on. This takes priority + * over any set raw data. + * + * You can set multiple feeds to mash together by passing an array instead + * of a string for the $url. Remember that with each additional feed comes + * additional processing and resources. + * + * @since 1.0 Preview Release + * @see set_raw_data() + * @param string|array $url This is the URL (or array of URLs) that you want to parse. + */ + public function set_feed_url($url) + { + $this->multifeed_url = array(); + if (is_array($url)) + { + foreach ($url as $value) + { + $this->multifeed_url[] = $this->registry->call('Misc', 'fix_protocol', array($value, 1)); + } + } + else + { + $this->feed_url = $this->registry->call('Misc', 'fix_protocol', array($url, 1)); + } + } + + /** + * Set an instance of {@see SimplePie_File} to use as a feed + * + * @param SimplePie_File &$file + * @return bool True on success, false on failure + */ + public function set_file(&$file) + { + if ($file instanceof SimplePie_File) + { + $this->feed_url = $file->url; + $this->file =& $file; + return true; + } + return false; + } + + /** + * Set the raw XML data to parse + * + * Allows you to use a string of RSS/Atom data instead of a remote feed. + * + * If you have a feed available as a string in PHP, you can tell SimplePie + * to parse that data string instead of a remote feed. Any set feed URL + * takes precedence. + * + * @since 1.0 Beta 3 + * @param string $data RSS or Atom data as a string. + * @see set_feed_url() + */ + public function set_raw_data($data) + { + $this->raw_data = $data; + } + + /** + * Set the the default timeout for fetching remote feeds + * + * This allows you to change the maximum time the feed's server to respond + * and send the feed back. + * + * @since 1.0 Beta 3 + * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed. + */ + public function set_timeout($timeout = 10) + { + $this->timeout = (int) $timeout; + } + + /** + * Force SimplePie to use fsockopen() instead of cURL + * + * @since 1.0 Beta 3 + * @param bool $enable Force fsockopen() to be used + */ + public function force_fsockopen($enable = false) + { + $this->force_fsockopen = (bool) $enable; + } + + /** + * Enable/disable caching in SimplePie. + * + * This option allows you to disable caching all-together in SimplePie. + * However, disabling the cache can lead to longer load times. + * + * @since 1.0 Preview Release + * @param bool $enable Enable caching + */ + public function enable_cache($enable = true) + { + $this->cache = (bool) $enable; + } + + /** + * Set the length of time (in seconds) that the contents of a feed will be + * cached + * + * @param int $seconds The feed content cache duration + */ + public function set_cache_duration($seconds = 3600) + { + $this->cache_duration = (int) $seconds; + } + + /** + * Set the length of time (in seconds) that the autodiscovered feed URL will + * be cached + * + * @param int $seconds The autodiscovered feed URL cache duration. + */ + public function set_autodiscovery_cache_duration($seconds = 604800) + { + $this->autodiscovery_cache_duration = (int) $seconds; + } + + /** + * Set the file system location where the cached files should be stored + * + * @param string $location The file system location. + */ + public function set_cache_location($location = './cache') + { + $this->cache_location = (string) $location; + } + + /** + * Set whether feed items should be sorted into reverse chronological order + * + * @param bool $enable Sort as reverse chronological order. + */ + public function enable_order_by_date($enable = true) + { + $this->order_by_date = (bool) $enable; + } + + /** + * Set the character encoding used to parse the feed + * + * This overrides the encoding reported by the feed, however it will fall + * back to the normal encoding detection if the override fails + * + * @param string $encoding Character encoding + */ + public function set_input_encoding($encoding = false) + { + if ($encoding) + { + $this->input_encoding = (string) $encoding; + } + else + { + $this->input_encoding = false; + } + } + + /** + * Set how much feed autodiscovery to do + * + * @see SIMPLEPIE_LOCATOR_NONE + * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY + * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION + * @see SIMPLEPIE_LOCATOR_LOCAL_BODY + * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION + * @see SIMPLEPIE_LOCATOR_REMOTE_BODY + * @see SIMPLEPIE_LOCATOR_ALL + * @param int $level Feed Autodiscovery Level (level can be a combination of the above constants, see bitwise OR operator) + */ + public function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL) + { + $this->autodiscovery = (int) $level; + } + + /** + * Get the class registry + * + * Use this to override SimplePie's default classes + * @see SimplePie_Registry + * @return SimplePie_Registry + */ + public function &get_registry() + { + return $this->registry; + } + + /**#@+ + * Useful when you are overloading or extending SimplePie's default classes. + * + * @deprecated Use {@see get_registry()} instead + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + * @param string $class Name of custom class + * @return boolean True on success, false otherwise + */ + /** + * Set which class SimplePie uses for caching + */ + public function set_cache_class($class = 'SimplePie_Cache') + { + return $this->registry->register('Cache', $class, true); + } + + /** + * Set which class SimplePie uses for auto-discovery + */ + public function set_locator_class($class = 'SimplePie_Locator') + { + return $this->registry->register('Locator', $class, true); + } + + /** + * Set which class SimplePie uses for XML parsing + */ + public function set_parser_class($class = 'SimplePie_Parser') + { + return $this->registry->register('Parser', $class, true); + } + + /** + * Set which class SimplePie uses for remote file fetching + */ + public function set_file_class($class = 'SimplePie_File') + { + return $this->registry->register('File', $class, true); + } + + /** + * Set which class SimplePie uses for data sanitization + */ + public function set_sanitize_class($class = 'SimplePie_Sanitize') + { + return $this->registry->register('Sanitize', $class, true); + } + + /** + * Set which class SimplePie uses for handling feed items + */ + public function set_item_class($class = 'SimplePie_Item') + { + return $this->registry->register('Item', $class, true); + } + + /** + * Set which class SimplePie uses for handling author data + */ + public function set_author_class($class = 'SimplePie_Author') + { + return $this->registry->register('Author', $class, true); + } + + /** + * Set which class SimplePie uses for handling category data + */ + public function set_category_class($class = 'SimplePie_Category') + { + return $this->registry->register('Category', $class, true); + } + + /** + * Set which class SimplePie uses for feed enclosures + */ + public function set_enclosure_class($class = 'SimplePie_Enclosure') + { + return $this->registry->register('Enclosure', $class, true); + } + + /** + * Set which class SimplePie uses for `<media:text>` captions + */ + public function set_caption_class($class = 'SimplePie_Caption') + { + return $this->registry->register('Caption', $class, true); + } + + /** + * Set which class SimplePie uses for `<media:copyright>` + */ + public function set_copyright_class($class = 'SimplePie_Copyright') + { + return $this->registry->register('Copyright', $class, true); + } + + /** + * Set which class SimplePie uses for `<media:credit>` + */ + public function set_credit_class($class = 'SimplePie_Credit') + { + return $this->registry->register('Credit', $class, true); + } + + /** + * Set which class SimplePie uses for `<media:rating>` + */ + public function set_rating_class($class = 'SimplePie_Rating') + { + return $this->registry->register('Rating', $class, true); + } + + /** + * Set which class SimplePie uses for `<media:restriction>` + */ + public function set_restriction_class($class = 'SimplePie_Restriction') + { + return $this->registry->register('Restriction', $class, true); + } + + /** + * Set which class SimplePie uses for content-type sniffing + */ + public function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer') + { + return $this->registry->register('Content_Type_Sniffer', $class, true); + } + + /** + * Set which class SimplePie uses item sources + */ + public function set_source_class($class = 'SimplePie_Source') + { + return $this->registry->register('Source', $class, true); + } + /**#@-*/ + + /** + * Set the user agent string + * + * @param string $ua New user agent string. + */ + public function set_useragent($ua = SIMPLEPIE_USERAGENT) + { + $this->useragent = (string) $ua; + } + + /** + * Set callback function to create cache filename with + * + * @param mixed $function Callback function + */ + public function set_cache_name_function($function = 'md5') + { + if (is_callable($function)) + { + $this->cache_name_function = $function; + } + } + + /** + * Set options to make SP as fast as possible + * + * Forgoes a substantial amount of data sanitization in favor of speed. This + * turns SimplePie into a dumb parser of feeds. + * + * @param bool $set Whether to set them or not + */ + public function set_stupidly_fast($set = false) + { + if ($set) + { + $this->enable_order_by_date(false); + $this->remove_div(false); + $this->strip_comments(false); + $this->strip_htmltags(false); + $this->strip_attributes(false); + $this->set_image_handler(false); + } + } + + /** + * Set maximum number of feeds to check with autodiscovery + * + * @param int $max Maximum number of feeds to check + */ + public function set_max_checked_feeds($max = 10) + { + $this->max_checked_feeds = (int) $max; + } + + public function remove_div($enable = true) + { + $this->sanitize->remove_div($enable); + } + + public function strip_htmltags($tags = '', $encode = null) + { + if ($tags === '') + { + $tags = $this->strip_htmltags; + } + $this->sanitize->strip_htmltags($tags); + if ($encode !== null) + { + $this->sanitize->encode_instead_of_strip($tags); + } + } + + public function encode_instead_of_strip($enable = true) + { + $this->sanitize->encode_instead_of_strip($enable); + } + + public function strip_attributes($attribs = '') + { + if ($attribs === '') + { + $attribs = $this->strip_attributes; + } + $this->sanitize->strip_attributes($attribs); + } + + /** + * Set the output encoding + * + * Allows you to override SimplePie's output to match that of your webpage. + * This is useful for times when your webpages are not being served as + * UTF-8. This setting will be obeyed by {@see handle_content_type()}, and + * is similar to {@see set_input_encoding()}. + * + * It should be noted, however, that not all character encodings can support + * all characters. If your page is being served as ISO-8859-1 and you try + * to display a Japanese feed, you'll likely see garbled characters. + * Because of this, it is highly recommended to ensure that your webpages + * are served as UTF-8. + * + * The number of supported character encodings depends on whether your web + * host supports {@link http://php.net/mbstring mbstring}, + * {@link http://php.net/iconv iconv}, or both. See + * {@link http://simplepie.org/wiki/faq/Supported_Character_Encodings} for + * more information. + * + * @param string $encoding + */ + public function set_output_encoding($encoding = 'UTF-8') + { + $this->sanitize->set_output_encoding($encoding); + } + + public function strip_comments($strip = false) + { + $this->sanitize->strip_comments($strip); + } + + /** + * Set element/attribute key/value pairs of HTML attributes + * containing URLs that need to be resolved relative to the feed + * + * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite, + * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite, + * |q|@cite + * + * @since 1.0 + * @param array|null $element_attribute Element/attribute key/value pairs, null for default + */ + public function set_url_replacements($element_attribute = null) + { + $this->sanitize->set_url_replacements($element_attribute); + } + + /** + * Set the handler to enable the display of cached images. + * + * @param str $page Web-accessible path to the handler_image.php file. + * @param str $qs The query string that the value should be passed to. + */ + public function set_image_handler($page = false, $qs = 'i') + { + if ($page !== false) + { + $this->sanitize->set_image_handler($page . '?' . $qs . '='); + } + else + { + $this->image_handler = ''; + } + } + + /** + * Set the limit for items returned per-feed with multifeeds + * + * @param integer $limit The maximum number of items to return. + */ + public function set_item_limit($limit = 0) + { + $this->item_limit = (int) $limit; + } + + /** + * Initialize the feed object + * + * This is what makes everything happen. Period. This is where all of the + * configuration options get processed, feeds are fetched, cached, and + * parsed, and all of that other good stuff. + * + * @return boolean True if successful, false otherwise + */ + public function init() + { + // Check absolute bare minimum requirements. + if (!extension_loaded('xml') || !extension_loaded('pcre')) + { + return false; + } + // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader. + elseif (!extension_loaded('xmlreader')) + { + static $xml_is_sane = null; + if ($xml_is_sane === null) + { + $parser_check = xml_parser_create(); + xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); + xml_parser_free($parser_check); + $xml_is_sane = isset($values[0]['value']); + } + if (!$xml_is_sane) + { + return false; + } + } + + if (method_exists($this->sanitize, 'set_registry')) + { + $this->sanitize->set_registry($this->registry); + } + + // Pass whatever was set with config options over to the sanitizer. + // Pass the classes in for legacy support; new classes should use the registry instead + $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->registry->get_class('Cache')); + $this->sanitize->pass_file_data($this->registry->get_class('File'), $this->timeout, $this->useragent, $this->force_fsockopen); + + if (!empty($this->multifeed_url)) + { + $i = 0; + $success = 0; + $this->multifeed_objects = array(); + $this->error = array(); + foreach ($this->multifeed_url as $url) + { + $this->multifeed_objects[$i] = clone $this; + $this->multifeed_objects[$i]->set_feed_url($url); + $single_success = $this->multifeed_objects[$i]->init(); + $success |= $single_success; + if (!$single_success) + { + $this->error[$i] = $this->multifeed_objects[$i]->error(); + } + $i++; + } + return (bool) $success; + } + elseif ($this->feed_url === null && $this->raw_data === null) + { + return false; + } + + $this->error = null; + $this->data = array(); + $this->multifeed_objects = array(); + $cache = false; + + if ($this->feed_url !== null) + { + $parsed_feed_url = $this->registry->call('Misc', 'parse_url', array($this->feed_url)); + + // Decide whether to enable caching + if ($this->cache && $parsed_feed_url['scheme'] !== '') + { + $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc')); + } + + // Fetch the data via SimplePie_File into $this->raw_data + if (($fetched = $this->fetch_data($cache)) === true) + { + return true; + } + elseif ($fetched === false) { + return false; + } + + list($headers, $sniffed) = $fetched; + } + + // Set up array of possible encodings + $encodings = array(); + + // First check to see if input has been overridden. + if ($this->input_encoding !== false) + { + $encodings[] = $this->input_encoding; + } + + $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity'); + $text_types = array('text/xml', 'text/xml-external-parsed-entity'); + + // RFC 3023 (only applies to sniffed content) + if (isset($sniffed)) + { + if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml') + { + if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) + { + $encodings[] = strtoupper($charset[1]); + } + $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry))); + $encodings[] = 'UTF-8'; + } + elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml') + { + if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) + { + $encodings[] = $charset[1]; + } + $encodings[] = 'US-ASCII'; + } + // Text MIME-type default + elseif (substr($sniffed, 0, 5) === 'text/') + { + $encodings[] = 'US-ASCII'; + } + } + + // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1 + $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry))); + $encodings[] = 'UTF-8'; + $encodings[] = 'ISO-8859-1'; + + // There's no point in trying an encoding twice + $encodings = array_unique($encodings); + + // Loop through each possible encoding, till we return something, or run out of possibilities + foreach ($encodings as $encoding) + { + // Change the encoding to UTF-8 (as we always use UTF-8 internally) + if ($utf8_data = $this->registry->call('Misc', 'change_encoding', array($this->raw_data, $encoding, 'UTF-8'))) + { + // Create new parser + $parser = $this->registry->create('Parser'); + + // If it's parsed fine + if ($parser->parse($utf8_data, 'UTF-8')) + { + $this->data = $parser->get_data(); + if (!($this->get_type() & ~SIMPLEPIE_TYPE_NONE)) + { + $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed."; + $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); + return false; + } + + if (isset($headers)) + { + $this->data['headers'] = $headers; + } + $this->data['build'] = SIMPLEPIE_BUILD; + + // Cache the file if caching is enabled + if ($cache && !$cache->save($this)) + { + trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); + } + return true; + } + } + } + + if (isset($parser)) + { + // We have an error, just set SimplePie_Misc::error to it and quit + $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column()); + } + else + { + $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.'; + } + + $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); + + return false; + } + + /** + * Fetch the data via SimplePie_File + * + * If the data is already cached, attempt to fetch it from there instead + * @param SimplePie_Cache|false $cache Cache handler, or false to not load from the cache + * @return array|true Returns true if the data was loaded from the cache, or an array of HTTP headers and sniffed type + */ + protected function fetch_data(&$cache) + { + // If it's enabled, use the cache + if ($cache) + { + // Load the Cache + $this->data = $cache->load(); + if (!empty($this->data)) + { + // If the cache is for an outdated build of SimplePie + if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD) + { + $cache->unlink(); + $this->data = array(); + } + // If we've hit a collision just rerun it with caching disabled + elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url) + { + $cache = false; + $this->data = array(); + } + // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL. + elseif (isset($this->data['feed_url'])) + { + // If the autodiscovery cache is still valid use it. + if ($cache->mtime() + $this->autodiscovery_cache_duration > time()) + { + // Do not need to do feed autodiscovery yet. + if ($this->data['feed_url'] !== $this->data['url']) + { + $this->set_feed_url($this->data['feed_url']); + return $this->init(); + } + + $cache->unlink(); + $this->data = array(); + } + } + // Check if the cache has been updated + elseif ($cache->mtime() + $this->cache_duration < time()) + { + // If we have last-modified and/or etag set + if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag'])) + { + $headers = array( + 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', + ); + if (isset($this->data['headers']['last-modified'])) + { + $headers['if-modified-since'] = $this->data['headers']['last-modified']; + } + if (isset($this->data['headers']['etag'])) + { + $headers['if-none-match'] = $this->data['headers']['etag']; + } + + $file = $this->registry->create('File', array($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen)); + + if ($file->success) + { + if ($file->status_code === 304) + { + $cache->touch(); + return true; + } + } + else + { + unset($file); + } + } + } + // If the cache is still valid, just return true + else + { + $this->raw_data = false; + return true; + } + } + // If the cache is empty, delete it + else + { + $cache->unlink(); + $this->data = array(); + } + } + // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it. + if (!isset($file)) + { + if ($this->file instanceof SimplePie_File && $this->file->url === $this->feed_url) + { + $file =& $this->file; + } + else + { + $headers = array( + 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', + ); + $file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen)); + } + } + // If the file connection has an error, set SimplePie::error to that and quit + if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) + { + $this->error = $file->error; + return !empty($this->data); + } + + if (!$this->force_feed) + { + // Check if the supplied URL is a feed, if it isn't, look for it. + $locate = $this->registry->create('Locator', array(&$file, $this->timeout, $this->useragent, $this->max_checked_feeds)); + + if (!$locate->is_feed($file)) + { + // We need to unset this so that if SimplePie::set_file() has been called that object is untouched + unset($file); + try + { + if (!($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds))) + { + $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed."; + $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); + return false; + } + } + catch (SimplePie_Exception $e) + { + // This is usually because DOMDocument doesn't exist + $this->error = $e->getMessage(); + $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, $e->getFile(), $e->getLine())); + return false; + } + if ($cache) + { + $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD); + if (!$cache->save($this)) + { + trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); + } + $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc')); + } + $this->feed_url = $file->url; + } + $locate = null; + } + + $this->raw_data = $file->body; + + $headers = $file->headers; + $sniffer = $this->registry->create('Content_Type_Sniffer', array(&$file)); + $sniffed = $sniffer->get_type(); + + return array($headers, $sniffed); + } + + /** + * Get the error message for the occurred error. + * + * @return string|array Error message, or array of messages for multifeeds + */ + public function error() + { + return $this->error; + } + + /** + * Get the raw XML + * + * This is the same as the old `$feed->enable_xml_dump(true)`, but returns + * the data instead of printing it. + * + * @return string|boolean Raw XML data, false if the cache is used + */ + public function get_raw_data() + { + return $this->raw_data; + } + + /** + * Get the character encoding used for output + * + * @since Preview Release + * @return string + */ + public function get_encoding() + { + return $this->sanitize->output_encoding; + } + + /** + * Send the content-type header with correct encoding + * + * This method ensures that the SimplePie-enabled page is being served with + * the correct {@link http://www.iana.org/assignments/media-types/ mime-type} + * and character encoding HTTP headers (character encoding determined by the + * {@see set_output_encoding} config option). + * + * This won't work properly if any content or whitespace has already been + * sent to the browser, because it relies on PHP's + * {@link http://php.net/header header()} function, and these are the + * circumstances under which the function works. + * + * Because it's setting these settings for the entire page (as is the nature + * of HTTP headers), this should only be used once per page (again, at the + * top). + * + * @param string $mime MIME type to serve the page as + */ + public function handle_content_type($mime = 'text/html') + { + if (!headers_sent()) + { + $header = "Content-type: $mime;"; + if ($this->get_encoding()) + { + $header .= ' charset=' . $this->get_encoding(); + } + else + { + $header .= ' charset=UTF-8'; + } + header($header); + } + } + + /** + * Get the type of the feed + * + * This returns a SIMPLEPIE_TYPE_* constant, which can be tested against + * using {@link http://php.net/language.operators.bitwise bitwise operators} + * + * @since 0.8 (usage changed to using constants in 1.0) + * @see SIMPLEPIE_TYPE_NONE Unknown. + * @see SIMPLEPIE_TYPE_RSS_090 RSS 0.90. + * @see SIMPLEPIE_TYPE_RSS_091_NETSCAPE RSS 0.91 (Netscape). + * @see SIMPLEPIE_TYPE_RSS_091_USERLAND RSS 0.91 (Userland). + * @see SIMPLEPIE_TYPE_RSS_091 RSS 0.91. + * @see SIMPLEPIE_TYPE_RSS_092 RSS 0.92. + * @see SIMPLEPIE_TYPE_RSS_093 RSS 0.93. + * @see SIMPLEPIE_TYPE_RSS_094 RSS 0.94. + * @see SIMPLEPIE_TYPE_RSS_10 RSS 1.0. + * @see SIMPLEPIE_TYPE_RSS_20 RSS 2.0.x. + * @see SIMPLEPIE_TYPE_RSS_RDF RDF-based RSS. + * @see SIMPLEPIE_TYPE_RSS_SYNDICATION Non-RDF-based RSS (truly intended as syndication format). + * @see SIMPLEPIE_TYPE_RSS_ALL Any version of RSS. + * @see SIMPLEPIE_TYPE_ATOM_03 Atom 0.3. + * @see SIMPLEPIE_TYPE_ATOM_10 Atom 1.0. + * @see SIMPLEPIE_TYPE_ATOM_ALL Any version of Atom. + * @see SIMPLEPIE_TYPE_ALL Any known/supported feed type. + * @return int SIMPLEPIE_TYPE_* constant + */ + public function get_type() + { + if (!isset($this->data['type'])) + { + $this->data['type'] = SIMPLEPIE_TYPE_ALL; + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'])) + { + $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10; + } + elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'])) + { + $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03; + } + elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'])) + { + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel']) + || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image']) + || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']) + || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput'])) + { + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10; + } + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel']) + || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image']) + || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']) + || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput'])) + { + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090; + } + } + elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'])) + { + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL; + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) + { + switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) + { + case '0.91': + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091; + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) + { + switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) + { + case '0': + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE; + break; + + case '24': + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND; + break; + } + } + break; + + case '0.92': + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092; + break; + + case '0.93': + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093; + break; + + case '0.94': + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094; + break; + + case '2.0': + $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20; + break; + } + } + } + else + { + $this->data['type'] = SIMPLEPIE_TYPE_NONE; + } + } + return $this->data['type']; + } + + /** + * Get the URL for the feed + * + * May or may not be different from the URL passed to {@see set_feed_url()}, + * depending on whether auto-discovery was used. + * + * @since Preview Release (previously called `get_feed_url()` since SimplePie 0.8.) + * @todo If we have a perm redirect we should return the new URL + * @todo When we make the above change, let's support <itunes:new-feed-url> as well + * @todo Also, |atom:link|@rel=self + * @return string|null + */ + public function subscribe_url() + { + if ($this->feed_url !== null) + { + return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + return null; + } + } + + /** + * Get data for an feed-level element + * + * This method allows you to get access to ANY element/attribute that is a + * sub-element of the opening feed tag. + * + * The return value is an indexed array of elements matching the given + * namespace and tag name. Each element has `attribs`, `data` and `child` + * subkeys. For `attribs` and `child`, these contain namespace subkeys. + * `attribs` then has one level of associative name => value data (where + * `value` is a string) after the namespace. `child` has tag-indexed keys + * after the namespace, each member of which is an indexed array matching + * this same format. + * + * For example: + * <pre> + * // This is probably a bad example because we already support + * // <media:content> natively, but it shows you how to parse through + * // the nodes. + * $group = $item->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group'); + * $content = $group[0]['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']; + * $file = $content[0]['attribs']['']['url']; + * echo $file; + * </pre> + * + * @since 1.0 + * @see http://simplepie.org/wiki/faq/supported_xml_namespaces + * @param string $namespace The URL of the XML namespace of the elements you're trying to access + * @param string $tag Tag name + * @return array + */ + public function get_feed_tags($namespace, $tag) + { + $type = $this->get_type(); + if ($type & SIMPLEPIE_TYPE_ATOM_10) + { + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag])) + { + return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]; + } + } + if ($type & SIMPLEPIE_TYPE_ATOM_03) + { + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag])) + { + return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]; + } + } + if ($type & SIMPLEPIE_TYPE_RSS_RDF) + { + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag])) + { + return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]; + } + } + if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) + { + if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag])) + { + return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]; + } + } + return null; + } + + /** + * Get data for an channel-level element + * + * This method allows you to get access to ANY element/attribute in the + * channel/header section of the feed. + * + * See {@see SimplePie::get_feed_tags()} for a description of the return value + * + * @since 1.0 + * @see http://simplepie.org/wiki/faq/supported_xml_namespaces + * @param string $namespace The URL of the XML namespace of the elements you're trying to access + * @param string $tag Tag name + * @return array + */ + public function get_channel_tags($namespace, $tag) + { + $type = $this->get_type(); + if ($type & SIMPLEPIE_TYPE_ATOM_ALL) + { + if ($return = $this->get_feed_tags($namespace, $tag)) + { + return $return; + } + } + if ($type & SIMPLEPIE_TYPE_RSS_10) + { + if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel')) + { + if (isset($channel[0]['child'][$namespace][$tag])) + { + return $channel[0]['child'][$namespace][$tag]; + } + } + } + if ($type & SIMPLEPIE_TYPE_RSS_090) + { + if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel')) + { + if (isset($channel[0]['child'][$namespace][$tag])) + { + return $channel[0]['child'][$namespace][$tag]; + } + } + } + if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) + { + if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel')) + { + if (isset($channel[0]['child'][$namespace][$tag])) + { + return $channel[0]['child'][$namespace][$tag]; + } + } + } + return null; + } + + /** + * Get data for an channel-level element + * + * This method allows you to get access to ANY element/attribute in the + * image/logo section of the feed. + * + * See {@see SimplePie::get_feed_tags()} for a description of the return value + * + * @since 1.0 + * @see http://simplepie.org/wiki/faq/supported_xml_namespaces + * @param string $namespace The URL of the XML namespace of the elements you're trying to access + * @param string $tag Tag name + * @return array + */ + public function get_image_tags($namespace, $tag) + { + $type = $this->get_type(); + if ($type & SIMPLEPIE_TYPE_RSS_10) + { + if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image')) + { + if (isset($image[0]['child'][$namespace][$tag])) + { + return $image[0]['child'][$namespace][$tag]; + } + } + } + if ($type & SIMPLEPIE_TYPE_RSS_090) + { + if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image')) + { + if (isset($image[0]['child'][$namespace][$tag])) + { + return $image[0]['child'][$namespace][$tag]; + } + } + } + if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) + { + if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image')) + { + if (isset($image[0]['child'][$namespace][$tag])) + { + return $image[0]['child'][$namespace][$tag]; + } + } + } + return null; + } + + /** + * Get the base URL value from the feed + * + * Uses `<xml:base>` if available, otherwise uses the first link in the + * feed, or failing that, the URL of the feed itself. + * + * @see get_link + * @see subscribe_url + * + * @param array $element + * @return string + */ + public function get_base($element = array()) + { + if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base'])) + { + return $element['xml_base']; + } + elseif ($this->get_link() !== null) + { + return $this->get_link(); + } + else + { + return $this->subscribe_url(); + } + } + + /** + * Sanitize feed data + * + * @access private + * @see SimplePie_Sanitize::sanitize() + * @param string $data Data to sanitize + * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants + * @param string $base Base URL to resolve URLs against + * @return string Sanitized data + */ + public function sanitize($data, $type, $base = '') + { + return $this->sanitize->sanitize($data, $type, $base); + } + + /** + * Get the title of the feed + * + * Uses `<atom:title>`, `<title>` or `<dc:title>` + * + * @since 1.0 (previously called `get_feed_title` since 0.8) + * @return string|null + */ + public function get_title() + { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + /** + * Get a category for the feed + * + * @since Unknown + * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1 + * @return SimplePie_Category|null + */ + public function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + /** + * Get all categories for the feed + * + * Uses `<atom:category>`, `<category>` or `<dc:subject>` + * + * @since Unknown + * @return array|null List of {@see SimplePie_Category} objects + */ + public function get_categories() + { + $categories = array(); + + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) + { + $term = null; + $scheme = null; + $label = null; + if (isset($category['attribs']['']['term'])) + { + $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['scheme'])) + { + $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($category['attribs']['']['label'])) + { + $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); + } + $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) + { + // This is really the label, but keep this as the term also for BC. + // Label will also work on retrieving because that falls back to term. + $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); + if (isset($category['attribs']['']['domain'])) + { + $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + $scheme = null; + } + $categories[] = $this->registry->create('Category', array($term, $scheme, null)); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) + { + $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) + { + $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + + if (!empty($categories)) + { + return array_unique($categories); + } + else + { + return null; + } + } + + /** + * Get an author for the feed + * + * @since 1.1 + * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1 + * @return SimplePie_Author|null + */ + public function get_author($key = 0) + { + $authors = $this->get_authors(); + if (isset($authors[$key])) + { + return $authors[$key]; + } + else + { + return null; + } + } + + /** + * Get all authors for the feed + * + * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>` + * + * @since 1.1 + * @return array|null List of {@see SimplePie_Author} objects + */ + public function get_authors() + { + $authors = array(); + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) + { + $name = null; + $uri = null; + $email = null; + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $authors[] = $this->registry->create('Author', array($name, $uri, $email)); + } + } + if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) + { + $name = null; + $url = null; + $email = null; + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $authors[] = $this->registry->create('Author', array($name, $url, $email)); + } + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) + { + $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) + { + $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) + { + $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); + } + + if (!empty($authors)) + { + return array_unique($authors); + } + else + { + return null; + } + } + + /** + * Get a contributor for the feed + * + * @since 1.1 + * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1 + * @return SimplePie_Author|null + */ + public function get_contributor($key = 0) + { + $contributors = $this->get_contributors(); + if (isset($contributors[$key])) + { + return $contributors[$key]; + } + else + { + return null; + } + } + + /** + * Get all contributors for the feed + * + * Uses `<atom:contributor>` + * + * @since 1.1 + * @return array|null List of {@see SimplePie_Author} objects + */ + public function get_contributors() + { + $contributors = array(); + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) + { + $name = null; + $uri = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) + { + $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $uri !== null) + { + $contributors[] = $this->registry->create('Author', array($name, $uri, $email)); + } + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) + { + $name = null; + $url = null; + $email = null; + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) + { + $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) + { + $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); + } + if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) + { + $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + if ($name !== null || $email !== null || $url !== null) + { + $contributors[] = $this->registry->create('Author', array($name, $url, $email)); + } + } + + if (!empty($contributors)) + { + return array_unique($contributors); + } + else + { + return null; + } + } + + /** + * Get a single link for the feed + * + * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8) + * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1 + * @param string $rel The relationship of the link to return + * @return string|null Link URL + */ + public function get_link($key = 0, $rel = 'alternate') + { + $links = $this->get_links($rel); + if (isset($links[$key])) + { + return $links[$key]; + } + else + { + return null; + } + } + + /** + * Get the permalink for the item + * + * Returns the first link available with a relationship of "alternate". + * Identical to {@see get_link()} with key 0 + * + * @see get_link + * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8) + * @internal Added for parity between the parent-level and the item/entry-level. + * @return string|null Link URL + */ + public function get_permalink() + { + return $this->get_link(0); + } + + /** + * Get all links for the feed + * + * Uses `<atom:link>` or `<link>` + * + * @since Beta 2 + * @param string $rel The relationship of links to return + * @return array|null Links found for the feed (strings) + */ + public function get_links($rel = 'alternate') + { + if (!isset($this->data['links'])) + { + $this->data['links'] = array(); + if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) + { + foreach ($links as $link) + { + if (isset($link['attribs']['']['href'])) + { + $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; + $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + } + } + } + if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) + { + foreach ($links as $link) + { + if (isset($link['attribs']['']['href'])) + { + $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; + $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); + + } + } + } + if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) + { + $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); + } + + $keys = array_keys($this->data['links']); + foreach ($keys as $key) + { + if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key))) + { + if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) + { + $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); + $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; + } + else + { + $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; + } + } + elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) + { + $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; + } + $this->data['links'][$key] = array_unique($this->data['links'][$key]); + } + } + + if (isset($this->data['links'][$rel])) + { + return $this->data['links'][$rel]; + } + else + { + return null; + } + } + + public function get_all_discovered_feeds() + { + return $this->all_discovered_feeds; + } + + /** + * Get the content for the item + * + * Uses `<atom:subtitle>`, `<atom:tagline>`, `<description>`, + * `<dc:description>`, `<itunes:summary>` or `<itunes:subtitle>` + * + * @since 1.0 (previously called `get_feed_description()` since 0.8) + * @return string|null + */ + public function get_description() + { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); + } + else + { + return null; + } + } + + /** + * Get the copyright info for the feed + * + * Uses `<atom:rights>`, `<atom:copyright>` or `<dc:rights>` + * + * @since 1.0 (previously called `get_feed_copyright()` since 0.8) + * @return string|null + */ + public function get_copyright() + { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) + { + return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + /** + * Get the language for the feed + * + * Uses `<language>`, `<dc:language>`, or @xml_lang + * + * @since 1.0 (previously called `get_feed_language()` since 0.8) + * @return string|null + */ + public function get_language() + { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'])) + { + return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'])) + { + return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'])) + { + return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif (isset($this->data['headers']['content-language'])) + { + return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + /** + * Get the latitude coordinates for the item + * + * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications + * + * Uses `<geo:lat>` or `<georss:point>` + * + * @since 1.0 + * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo + * @link http://www.georss.org/ GeoRSS + * @return string|null + */ + public function get_latitude() + { + + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) + { + return (float) $return[0]['data']; + } + elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) + { + return (float) $match[1]; + } + else + { + return null; + } + } + + /** + * Get the longitude coordinates for the feed + * + * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications + * + * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>` + * + * @since 1.0 + * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo + * @link http://www.georss.org/ GeoRSS + * @return string|null + */ + public function get_longitude() + { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) + { + return (float) $return[0]['data']; + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) + { + return (float) $return[0]['data']; + } + elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) + { + return (float) $match[2]; + } + else + { + return null; + } + } + + /** + * Get the feed logo's title + * + * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" title. + * + * Uses `<image><title>` or `<image><dc:title>` + * + * @return string|null + */ + public function get_image_title() + { + if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); + } + else + { + return null; + } + } + + /** + * Get the feed logo's URL + * + * RSS 0.9.0, 2.0, Atom 1.0, and feeds with iTunes RSS tags are allowed to + * have a "feed logo" URL. This points directly to the image itself. + * + * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`, + * `<image><title>` or `<image><dc:title>` + * + * @return string|null + */ + public function get_image_url() + { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) + { + return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + else + { + return null; + } + } + + + /** + * Get the feed logo's link + * + * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" link. This + * points to a human-readable page that the image should link to. + * + * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`, + * `<image><title>` or `<image><dc:title>` + * + * @return string|null + */ + public function get_image_link() + { + if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) + { + return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); + } + else + { + return null; + } + } + + /** + * Get the feed logo's link + * + * RSS 2.0 feeds are allowed to have a "feed logo" width. + * + * Uses `<image><width>` or defaults to 88.0 if no width is specified and + * the feed is an RSS 2.0 feed. + * + * @return int|float|null + */ + public function get_image_width() + { + if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width')) + { + return round($return[0]['data']); + } + elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) + { + return 88.0; + } + else + { + return null; + } + } + + /** + * Get the feed logo's height + * + * RSS 2.0 feeds are allowed to have a "feed logo" height. + * + * Uses `<image><height>` or defaults to 31.0 if no height is specified and + * the feed is an RSS 2.0 feed. + * + * @return int|float|null + */ + public function get_image_height() + { + if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height')) + { + return round($return[0]['data']); + } + elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) + { + return 31.0; + } + else + { + return null; + } + } + + /** + * Get the number of items in the feed + * + * This is well-suited for {@link http://php.net/for for()} loops with + * {@see get_item()} + * + * @param int $max Maximum value to return. 0 for no limit + * @return int Number of items in the feed + */ + public function get_item_quantity($max = 0) + { + $max = (int) $max; + $qty = count($this->get_items()); + if ($max === 0) + { + return $qty; + } + else + { + return ($qty > $max) ? $max : $qty; + } + } + + /** + * Get a single item from the feed + * + * This is better suited for {@link http://php.net/for for()} loops, whereas + * {@see get_items()} is better suited for + * {@link http://php.net/foreach foreach()} loops. + * + * @see get_item_quantity() + * @since Beta 2 + * @param int $key The item that you want to return. Remember that arrays begin with 0, not 1 + * @return SimplePie_Item|null + */ + public function get_item($key = 0) + { + $items = $this->get_items(); + if (isset($items[$key])) + { + return $items[$key]; + } + else + { + return null; + } + } + + /** + * Get all items from the feed + * + * This is better suited for {@link http://php.net/for for()} loops, whereas + * {@see get_items()} is better suited for + * {@link http://php.net/foreach foreach()} loops. + * + * @see get_item_quantity + * @since Beta 2 + * @param int $start Index to start at + * @param int $end Number of items to return. 0 for all items after `$start` + * @return array|null List of {@see SimplePie_Item} objects + */ + public function get_items($start = 0, $end = 0) + { + if (!isset($this->data['items'])) + { + if (!empty($this->multifeed_objects)) + { + $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit); + } + else + { + $this->data['items'] = array(); + if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry')) + { + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); + } + } + if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry')) + { + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); + } + } + if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item')) + { + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); + } + } + if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item')) + { + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); + } + } + if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item')) + { + $keys = array_keys($items); + foreach ($keys as $key) + { + $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); + } + } + } + } + + if (!empty($this->data['items'])) + { + // If we want to order it by date, check if all items have a date, and then sort it + if ($this->order_by_date && empty($this->multifeed_objects)) + { + if (!isset($this->data['ordered_items'])) + { + $do_sort = true; + foreach ($this->data['items'] as $item) + { + if (!$item->get_date('U')) + { + $do_sort = false; + break; + } + } + $item = null; + $this->data['ordered_items'] = $this->data['items']; + if ($do_sort) + { + usort($this->data['ordered_items'], array(get_class($this), 'sort_items')); + } + } + $items = $this->data['ordered_items']; + } + else + { + $items = $this->data['items']; + } + + // Slice the data as desired + if ($end === 0) + { + return array_slice($items, $start); + } + else + { + return array_slice($items, $start, $end); + } + } + else + { + return array(); + } + } + + /** + * Set the favicon handler + * + * @deprecated Use your own favicon handling instead + */ + public function set_favicon_handler($page = false, $qs = 'i') + { + $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; + trigger_error('Favicon handling has been removed, please use your own handling', $level); + return false; + } + + /** + * Get the favicon for the current feed + * + * @deprecated Use your own favicon handling instead + */ + public function get_favicon() + { + $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; + trigger_error('Favicon handling has been removed, please use your own handling', $level); + + if (($url = $this->get_link()) !== null) + { + return 'http://g.etfv.co/' . urlencode($url); + } + + return false; + } + + /** + * Magic method handler + * + * @param string $method Method name + * @param array $args Arguments to the method + * @return mixed + */ + public function __call($method, $args) + { + if (strpos($method, 'subscribe_') === 0) + { + $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; + trigger_error('subscribe_*() has been deprecated, implement the callback yourself', $level); + return ''; + } + if ($method === 'enable_xml_dump') + { + $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; + trigger_error('enable_xml_dump() has been deprecated, use get_raw_data() instead', $level); + return false; + } + + $class = get_class($this); + $trace = debug_backtrace(); + $file = $trace[0]['file']; + $line = $trace[0]['line']; + trigger_error("Call to undefined method $class::$method() in $file on line $line", E_USER_ERROR); + } + + /** + * Sorting callback for items + * + * @access private + * @param SimplePie $a + * @param SimplePie $b + * @return boolean + */ + public static function sort_items($a, $b) + { + return $a->get_date('U') <= $b->get_date('U'); + } + + /** + * Merge items from several feeds into one + * + * If you're merging multiple feeds together, they need to all have dates + * for the items or else SimplePie will refuse to sort them. + * + * @link http://simplepie.org/wiki/tutorial/sort_multiple_feeds_by_time_and_date#if_feeds_require_separate_per-feed_settings + * @param array $urls List of SimplePie feed objects to merge + * @param int $start Starting item + * @param int $end Number of items to return + * @param int $limit Maximum number of items per feed + * @return array + */ + public static function merge_items($urls, $start = 0, $end = 0, $limit = 0) + { + if (is_array($urls) && sizeof($urls) > 0) + { + $items = array(); + foreach ($urls as $arg) + { + if ($arg instanceof SimplePie) + { + $items = array_merge($items, $arg->get_items(0, $limit)); + } + else + { + trigger_error('Arguments must be SimplePie objects', E_USER_WARNING); + } + } + + $do_sort = true; + foreach ($items as $item) + { + if (!$item->get_date('U')) + { + $do_sort = false; + break; + } + } + $item = null; + if ($do_sort) + { + usort($items, array(get_class($urls[0]), 'sort_items')); + } + + if ($end === 0) + { + return array_slice($items, $start); + } + else + { + return array_slice($items, $start, $end); + } + } + else + { + trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING); + return array(); + } + } +} +endif; \ No newline at end of file diff --git a/wp-includes/class-smtp.php b/wp-includes/class-smtp.php new file mode 100644 index 0000000..8b11c73 --- /dev/null +++ b/wp-includes/class-smtp.php @@ -0,0 +1,1213 @@ +<?php +/** + * PHPMailer RFC821 SMTP email transport class. + * PHP Version 5 + * @package PHPMailer + * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project + * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk> + * @author Jim Jagielski (jimjag) <jimjag@gmail.com> + * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> + * @author Brent R. Matzelle (original founder) + * @copyright 2014 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +/** + * PHPMailer RFC821 SMTP email transport class. + * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server. + * @package PHPMailer + * @author Chris Ryan + * @author Marcus Bointon <phpmailer@synchromedia.co.uk> + */ +class SMTP +{ + /** + * The PHPMailer SMTP version number. + * @var string + */ + const VERSION = '5.2.27'; + + /** + * SMTP line break constant. + * @var string + */ + const CRLF = "\r\n"; + + /** + * The SMTP port to use if one is not specified. + * @var integer + */ + const DEFAULT_SMTP_PORT = 25; + + /** + * The maximum line length allowed by RFC 2822 section 2.1.1 + * @var integer + */ + const MAX_LINE_LENGTH = 998; + + /** + * Debug level for no output + */ + const DEBUG_OFF = 0; + + /** + * Debug level to show client -> server messages + */ + const DEBUG_CLIENT = 1; + + /** + * Debug level to show client -> server and server -> client messages + */ + const DEBUG_SERVER = 2; + + /** + * Debug level to show connection status, client -> server and server -> client messages + */ + const DEBUG_CONNECTION = 3; + + /** + * Debug level to show all messages + */ + const DEBUG_LOWLEVEL = 4; + + /** + * The PHPMailer SMTP Version number. + * @var string + * @deprecated Use the `VERSION` constant instead + * @see SMTP::VERSION + */ + public $Version = '5.2.27'; + + /** + * SMTP server port number. + * @var integer + * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead + * @see SMTP::DEFAULT_SMTP_PORT + */ + public $SMTP_PORT = 25; + + /** + * SMTP reply line ending. + * @var string + * @deprecated Use the `CRLF` constant instead + * @see SMTP::CRLF + */ + public $CRLF = "\r\n"; + + /** + * Debug output level. + * Options: + * * self::DEBUG_OFF (`0`) No debug output, default + * * self::DEBUG_CLIENT (`1`) Client commands + * * self::DEBUG_SERVER (`2`) Client commands and server responses + * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status + * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages + * @var integer + */ + public $do_debug = self::DEBUG_OFF; + + /** + * How to handle debug output. + * Options: + * * `echo` Output plain-text as-is, appropriate for CLI + * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output + * * `error_log` Output to error log as configured in php.ini + * + * Alternatively, you can provide a callable expecting two params: a message string and the debug level: + * <code> + * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; + * </code> + * @var string|callable + */ + public $Debugoutput = 'echo'; + + /** + * Whether to use VERP. + * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path + * @link http://www.postfix.org/VERP_README.html Info on VERP + * @var boolean + */ + public $do_verp = false; + + /** + * The timeout value for connection, in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 + * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure. + * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2 + * @var integer + */ + public $Timeout = 300; + + /** + * How long to wait for commands to complete, in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 + * @var integer + */ + public $Timelimit = 300; + + /** + * @var array Patterns to extract an SMTP transaction id from reply to a DATA command. + * The first capture group in each regex will be used as the ID. + */ + protected $smtp_transaction_id_patterns = array( + 'exim' => '/[0-9]{3} OK id=(.*)/', + 'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/', + 'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/' + ); + + /** + * @var string The last transaction ID issued in response to a DATA command, + * if one was detected + */ + protected $last_smtp_transaction_id; + + /** + * The socket for the server connection. + * @var resource + */ + protected $smtp_conn; + + /** + * Error information, if any, for the last SMTP command. + * @var array + */ + protected $error = array( + 'error' => '', + 'detail' => '', + 'smtp_code' => '', + 'smtp_code_ex' => '' + ); + + /** + * The reply the server sent to us for HELO. + * If null, no HELO string has yet been received. + * @var string|null + */ + protected $helo_rply = null; + + /** + * The set of SMTP extensions sent in reply to EHLO command. + * Indexes of the array are extension names. + * Value at index 'HELO' or 'EHLO' (according to command that was sent) + * represents the server name. In case of HELO it is the only element of the array. + * Other values can be boolean TRUE or an array containing extension options. + * If null, no HELO/EHLO string has yet been received. + * @var array|null + */ + protected $server_caps = null; + + /** + * The most recent reply received from the server. + * @var string + */ + protected $last_reply = ''; + + /** + * Output debugging info via a user-selected method. + * @see SMTP::$Debugoutput + * @see SMTP::$do_debug + * @param string $str Debug string to output + * @param integer $level The debug level of this message; see DEBUG_* constants + * @return void + */ + protected function edebug($str, $level = 0) + { + if ($level > $this->do_debug) { + return; + } + //Avoid clash with built-in function names + if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) { + call_user_func($this->Debugoutput, $str, $level); + return; + } + switch ($this->Debugoutput) { + case 'error_log': + //Don't output, just log + error_log($str); + break; + case 'html': + //Cleans up output a bit for a better looking, HTML-safe output + echo gmdate('Y-m-d H:i:s') . ' ' . htmlentities( + preg_replace('/[\r\n]+/', '', $str), + ENT_QUOTES, + 'UTF-8' + ) . "<br>\n"; + break; + case 'echo': + default: + //Normalize line breaks + $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str); + echo gmdate('Y-m-d H:i:s') . "\t" . str_replace( + "\n", + "\n \t ", + trim($str) + ) . "\n"; + } + } + + /** + * Connect to an SMTP server. + * @param string $host SMTP server IP or host name + * @param integer $port The port number to connect to + * @param integer $timeout How long to wait for the connection to open + * @param array $options An array of options for stream_context_create() + * @access public + * @return boolean + */ + public function connect($host, $port = null, $timeout = 30, $options = array()) + { + static $streamok; + //This is enabled by default since 5.0.0 but some providers disable it + //Check this once and cache the result + if (is_null($streamok)) { + $streamok = function_exists('stream_socket_client'); + } + // Clear errors to avoid confusion + $this->setError(''); + // Make sure we are __not__ connected + if ($this->connected()) { + // Already connected, generate error + $this->setError('Already connected to a server'); + return false; + } + if (empty($port)) { + $port = self::DEFAULT_SMTP_PORT; + } + // Connect to the SMTP server + $this->edebug( + "Connection: opening to $host:$port, timeout=$timeout, options=" . + var_export($options, true), + self::DEBUG_CONNECTION + ); + $errno = 0; + $errstr = ''; + if ($streamok) { + $socket_context = stream_context_create($options); + set_error_handler(array($this, 'errorHandler')); + $this->smtp_conn = stream_socket_client( + $host . ":" . $port, + $errno, + $errstr, + $timeout, + STREAM_CLIENT_CONNECT, + $socket_context + ); + restore_error_handler(); + } else { + //Fall back to fsockopen which should work in more places, but is missing some features + $this->edebug( + "Connection: stream_socket_client not available, falling back to fsockopen", + self::DEBUG_CONNECTION + ); + set_error_handler(array($this, 'errorHandler')); + $this->smtp_conn = fsockopen( + $host, + $port, + $errno, + $errstr, + $timeout + ); + restore_error_handler(); + } + // Verify we connected properly + if (!is_resource($this->smtp_conn)) { + $this->setError( + 'Failed to connect to server', + $errno, + $errstr + ); + $this->edebug( + 'SMTP ERROR: ' . $this->error['error'] + . ": $errstr ($errno)", + self::DEBUG_CLIENT + ); + return false; + } + $this->edebug('Connection: opened', self::DEBUG_CONNECTION); + // SMTP server can take longer to respond, give longer timeout for first read + // Windows does not have support for this timeout function + if (substr(PHP_OS, 0, 3) != 'WIN') { + $max = ini_get('max_execution_time'); + // Don't bother if unlimited + if ($max != 0 && $timeout > $max) { + @set_time_limit($timeout); + } + stream_set_timeout($this->smtp_conn, $timeout, 0); + } + // Get any announcement + $announce = $this->get_lines(); + $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER); + return true; + } + + /** + * Initiate a TLS (encrypted) session. + * @access public + * @return boolean + */ + public function startTLS() + { + if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) { + return false; + } + + //Allow the best TLS version(s) we can + $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT; + + //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT + //so add them back in manually if we can + if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) { + $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; + $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; + } + + // Begin encrypted connection + set_error_handler(array($this, 'errorHandler')); + $crypto_ok = stream_socket_enable_crypto( + $this->smtp_conn, + true, + $crypto_method + ); + restore_error_handler(); + return $crypto_ok; + } + + /** + * Perform SMTP authentication. + * Must be run after hello(). + * @see hello() + * @param string $username The user name + * @param string $password The password + * @param string $authtype The auth type (PLAIN, LOGIN, CRAM-MD5) + * @param string $realm The auth realm for NTLM + * @param string $workstation The auth workstation for NTLM + * @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth) + * @return bool True if successfully authenticated.* @access public + */ + public function authenticate( + $username, + $password, + $authtype = null, + $realm = '', + $workstation = '', + $OAuth = null + ) { + if (!$this->server_caps) { + $this->setError('Authentication is not allowed before HELO/EHLO'); + return false; + } + + if (array_key_exists('EHLO', $this->server_caps)) { + // SMTP extensions are available; try to find a proper authentication method + if (!array_key_exists('AUTH', $this->server_caps)) { + $this->setError('Authentication is not allowed at this stage'); + // 'at this stage' means that auth may be allowed after the stage changes + // e.g. after STARTTLS + return false; + } + + self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL); + self::edebug( + 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']), + self::DEBUG_LOWLEVEL + ); + + if (empty($authtype)) { + foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN') as $method) { + if (in_array($method, $this->server_caps['AUTH'])) { + $authtype = $method; + break; + } + } + if (empty($authtype)) { + $this->setError('No supported authentication methods found'); + return false; + } + self::edebug('Auth method selected: ' . $authtype, self::DEBUG_LOWLEVEL); + } + + if (!in_array($authtype, $this->server_caps['AUTH'])) { + $this->setError("The requested authentication method \"$authtype\" is not supported by the server"); + return false; + } + } elseif (empty($authtype)) { + $authtype = 'LOGIN'; + } + switch ($authtype) { + case 'PLAIN': + // Start authentication + if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) { + return false; + } + // Send encoded username and password + if (!$this->sendCommand( + 'User & Password', + base64_encode("\0" . $username . "\0" . $password), + 235 + ) + ) { + return false; + } + break; + case 'LOGIN': + // Start authentication + if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) { + return false; + } + if (!$this->sendCommand("Username", base64_encode($username), 334)) { + return false; + } + if (!$this->sendCommand("Password", base64_encode($password), 235)) { + return false; + } + break; + case 'CRAM-MD5': + // Start authentication + if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) { + return false; + } + // Get the challenge + $challenge = base64_decode(substr($this->last_reply, 4)); + + // Build the response + $response = $username . ' ' . $this->hmac($challenge, $password); + + // send encoded credentials + return $this->sendCommand('Username', base64_encode($response), 235); + default: + $this->setError("Authentication method \"$authtype\" is not supported"); + return false; + } + return true; + } + + /** + * Calculate an MD5 HMAC hash. + * Works like hash_hmac('md5', $data, $key) + * in case that function is not available + * @param string $data The data to hash + * @param string $key The key to hash with + * @access protected + * @return string + */ + protected function hmac($data, $key) + { + if (function_exists('hash_hmac')) { + return hash_hmac('md5', $data, $key); + } + + // The following borrowed from + // http://php.net/manual/en/function.mhash.php#27225 + + // RFC 2104 HMAC implementation for php. + // Creates an md5 HMAC. + // Eliminates the need to install mhash to compute a HMAC + // by Lance Rushing + + $bytelen = 64; // byte length for md5 + if (strlen($key) > $bytelen) { + $key = pack('H*', md5($key)); + } + $key = str_pad($key, $bytelen, chr(0x00)); + $ipad = str_pad('', $bytelen, chr(0x36)); + $opad = str_pad('', $bytelen, chr(0x5c)); + $k_ipad = $key ^ $ipad; + $k_opad = $key ^ $opad; + + return md5($k_opad . pack('H*', md5($k_ipad . $data))); + } + + /** + * Check connection state. + * @access public + * @return boolean True if connected. + */ + public function connected() + { + if (is_resource($this->smtp_conn)) { + $sock_status = stream_get_meta_data($this->smtp_conn); + if ($sock_status['eof']) { + // The socket is valid but we are not connected + $this->edebug( + 'SMTP NOTICE: EOF caught while checking if connected', + self::DEBUG_CLIENT + ); + $this->close(); + return false; + } + return true; // everything looks good + } + return false; + } + + /** + * Close the socket and clean up the state of the class. + * Don't use this function without first trying to use QUIT. + * @see quit() + * @access public + * @return void + */ + public function close() + { + $this->setError(''); + $this->server_caps = null; + $this->helo_rply = null; + if (is_resource($this->smtp_conn)) { + // close the connection and cleanup + fclose($this->smtp_conn); + $this->smtp_conn = null; //Makes for cleaner serialization + $this->edebug('Connection: closed', self::DEBUG_CONNECTION); + } + } + + /** + * Send an SMTP DATA command. + * Issues a data command and sends the msg_data to the server, + * finializing the mail transaction. $msg_data is the message + * that is to be send with the headers. Each header needs to be + * on a single line followed by a <CRLF> with the message headers + * and the message body being separated by and additional <CRLF>. + * Implements rfc 821: DATA <CRLF> + * @param string $msg_data Message data to send + * @access public + * @return boolean + */ + public function data($msg_data) + { + //This will use the standard timelimit + if (!$this->sendCommand('DATA', 'DATA', 354)) { + return false; + } + + /* The server is ready to accept data! + * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF) + * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into + * smaller lines to fit within the limit. + * We will also look for lines that start with a '.' and prepend an additional '.'. + * NOTE: this does not count towards line-length limit. + */ + + // Normalize line breaks before exploding + $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data)); + + /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field + * of the first line (':' separated) does not contain a space then it _should_ be a header and we will + * process all lines before a blank line as headers. + */ + + $field = substr($lines[0], 0, strpos($lines[0], ':')); + $in_headers = false; + if (!empty($field) && strpos($field, ' ') === false) { + $in_headers = true; + } + + foreach ($lines as $line) { + $lines_out = array(); + if ($in_headers and $line == '') { + $in_headers = false; + } + //Break this line up into several smaller lines if it's too long + //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len), + while (isset($line[self::MAX_LINE_LENGTH])) { + //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on + //so as to avoid breaking in the middle of a word + $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' '); + //Deliberately matches both false and 0 + if (!$pos) { + //No nice break found, add a hard break + $pos = self::MAX_LINE_LENGTH - 1; + $lines_out[] = substr($line, 0, $pos); + $line = substr($line, $pos); + } else { + //Break at the found point + $lines_out[] = substr($line, 0, $pos); + //Move along by the amount we dealt with + $line = substr($line, $pos + 1); + } + //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1 + if ($in_headers) { + $line = "\t" . $line; + } + } + $lines_out[] = $line; + + //Send the lines to the server + foreach ($lines_out as $line_out) { + //RFC2821 section 4.5.2 + if (!empty($line_out) and $line_out[0] == '.') { + $line_out = '.' . $line_out; + } + $this->client_send($line_out . self::CRLF); + } + } + + //Message data has been sent, complete the command + //Increase timelimit for end of DATA command + $savetimelimit = $this->Timelimit; + $this->Timelimit = $this->Timelimit * 2; + $result = $this->sendCommand('DATA END', '.', 250); + $this->recordLastTransactionID(); + //Restore timelimit + $this->Timelimit = $savetimelimit; + return $result; + } + + /** + * Send an SMTP HELO or EHLO command. + * Used to identify the sending server to the receiving server. + * This makes sure that client and server are in a known state. + * Implements RFC 821: HELO <SP> <domain> <CRLF> + * and RFC 2821 EHLO. + * @param string $host The host name or IP to connect to + * @access public + * @return boolean + */ + public function hello($host = '') + { + //Try extended hello first (RFC 2821) + return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host)); + } + + /** + * Send an SMTP HELO or EHLO command. + * Low-level implementation used by hello() + * @see hello() + * @param string $hello The HELO string + * @param string $host The hostname to say we are + * @access protected + * @return boolean + */ + protected function sendHello($hello, $host) + { + $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250); + $this->helo_rply = $this->last_reply; + if ($noerror) { + $this->parseHelloFields($hello); + } else { + $this->server_caps = null; + } + return $noerror; + } + + /** + * Parse a reply to HELO/EHLO command to discover server extensions. + * In case of HELO, the only parameter that can be discovered is a server name. + * @access protected + * @param string $type - 'HELO' or 'EHLO' + */ + protected function parseHelloFields($type) + { + $this->server_caps = array(); + $lines = explode("\n", $this->helo_rply); + + foreach ($lines as $n => $s) { + //First 4 chars contain response code followed by - or space + $s = trim(substr($s, 4)); + if (empty($s)) { + continue; + } + $fields = explode(' ', $s); + if (!empty($fields)) { + if (!$n) { + $name = $type; + $fields = $fields[0]; + } else { + $name = array_shift($fields); + switch ($name) { + case 'SIZE': + $fields = ($fields ? $fields[0] : 0); + break; + case 'AUTH': + if (!is_array($fields)) { + $fields = array(); + } + break; + default: + $fields = true; + } + } + $this->server_caps[$name] = $fields; + } + } + } + + /** + * Send an SMTP MAIL command. + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more recipient + * commands may be called followed by a data command. + * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF> + * @param string $from Source address of this message + * @access public + * @return boolean + */ + public function mail($from) + { + $useVerp = ($this->do_verp ? ' XVERP' : ''); + return $this->sendCommand( + 'MAIL FROM', + 'MAIL FROM:<' . $from . '>' . $useVerp, + 250 + ); + } + + /** + * Send an SMTP QUIT command. + * Closes the socket if there is no error or the $close_on_error argument is true. + * Implements from rfc 821: QUIT <CRLF> + * @param boolean $close_on_error Should the connection close if an error occurs? + * @access public + * @return boolean + */ + public function quit($close_on_error = true) + { + $noerror = $this->sendCommand('QUIT', 'QUIT', 221); + $err = $this->error; //Save any error + if ($noerror or $close_on_error) { + $this->close(); + $this->error = $err; //Restore any error from the quit command + } + return $noerror; + } + + /** + * Send an SMTP RCPT command. + * Sets the TO argument to $toaddr. + * Returns true if the recipient was accepted false if it was rejected. + * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF> + * @param string $address The address the message is being sent to + * @access public + * @return boolean + */ + public function recipient($address) + { + return $this->sendCommand( + 'RCPT TO', + 'RCPT TO:<' . $address . '>', + array(250, 251) + ); + } + + /** + * Send an SMTP RSET command. + * Abort any transaction that is currently in progress. + * Implements rfc 821: RSET <CRLF> + * @access public + * @return boolean True on success. + */ + public function reset() + { + return $this->sendCommand('RSET', 'RSET', 250); + } + + /** + * Send a command to an SMTP server and check its return code. + * @param string $command The command name - not sent to the server + * @param string $commandstring The actual command to send + * @param integer|array $expect One or more expected integer success codes + * @access protected + * @return boolean True on success. + */ + protected function sendCommand($command, $commandstring, $expect) + { + if (!$this->connected()) { + $this->setError("Called $command without being connected"); + return false; + } + //Reject line breaks in all commands + if (strpos($commandstring, "\n") !== false or strpos($commandstring, "\r") !== false) { + $this->setError("Command '$command' contained line breaks"); + return false; + } + $this->client_send($commandstring . self::CRLF); + + $this->last_reply = $this->get_lines(); + // Fetch SMTP code and possible error code explanation + $matches = array(); + if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) { + $code = $matches[1]; + $code_ex = (count($matches) > 2 ? $matches[2] : null); + // Cut off error code from each response line + $detail = preg_replace( + "/{$code}[ -]" . + ($code_ex ? str_replace('.', '\\.', $code_ex) . ' ' : '') . "/m", + '', + $this->last_reply + ); + } else { + // Fall back to simple parsing if regex fails + $code = substr($this->last_reply, 0, 3); + $code_ex = null; + $detail = substr($this->last_reply, 4); + } + + $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER); + + if (!in_array($code, (array)$expect)) { + $this->setError( + "$command command failed", + $detail, + $code, + $code_ex + ); + $this->edebug( + 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply, + self::DEBUG_CLIENT + ); + return false; + } + + $this->setError(''); + return true; + } + + /** + * Send an SMTP SAML command. + * Starts a mail transaction from the email address specified in $from. + * Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more recipient + * commands may be called followed by a data command. This command + * will send the message to the users terminal if they are logged + * in and send them an email. + * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF> + * @param string $from The address the message is from + * @access public + * @return boolean + */ + public function sendAndMail($from) + { + return $this->sendCommand('SAML', "SAML FROM:$from", 250); + } + + /** + * Send an SMTP VRFY command. + * @param string $name The name to verify + * @access public + * @return boolean + */ + public function verify($name) + { + return $this->sendCommand('VRFY', "VRFY $name", array(250, 251)); + } + + /** + * Send an SMTP NOOP command. + * Used to keep keep-alives alive, doesn't actually do anything + * @access public + * @return boolean + */ + public function noop() + { + return $this->sendCommand('NOOP', 'NOOP', 250); + } + + /** + * Send an SMTP TURN command. + * This is an optional command for SMTP that this class does not support. + * This method is here to make the RFC821 Definition complete for this class + * and _may_ be implemented in future + * Implements from rfc 821: TURN <CRLF> + * @access public + * @return boolean + */ + public function turn() + { + $this->setError('The SMTP TURN command is not implemented'); + $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT); + return false; + } + + /** + * Send raw data to the server. + * @param string $data The data to send + * @access public + * @return integer|boolean The number of bytes sent to the server or false on error + */ + public function client_send($data) + { + $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT); + set_error_handler(array($this, 'errorHandler')); + $result = fwrite($this->smtp_conn, $data); + restore_error_handler(); + return $result; + } + + /** + * Get the latest error. + * @access public + * @return array + */ + public function getError() + { + return $this->error; + } + + /** + * Get SMTP extensions available on the server + * @access public + * @return array|null + */ + public function getServerExtList() + { + return $this->server_caps; + } + + /** + * A multipurpose method + * The method works in three ways, dependent on argument value and current state + * 1. HELO/EHLO was not sent - returns null and set up $this->error + * 2. HELO was sent + * $name = 'HELO': returns server name + * $name = 'EHLO': returns boolean false + * $name = any string: returns null and set up $this->error + * 3. EHLO was sent + * $name = 'HELO'|'EHLO': returns server name + * $name = any string: if extension $name exists, returns boolean True + * or its options. Otherwise returns boolean False + * In other words, one can use this method to detect 3 conditions: + * - null returned: handshake was not or we don't know about ext (refer to $this->error) + * - false returned: the requested feature exactly not exists + * - positive value returned: the requested feature exists + * @param string $name Name of SMTP extension or 'HELO'|'EHLO' + * @return mixed + */ + public function getServerExt($name) + { + if (!$this->server_caps) { + $this->setError('No HELO/EHLO was sent'); + return null; + } + + // the tight logic knot ;) + if (!array_key_exists($name, $this->server_caps)) { + if ($name == 'HELO') { + return $this->server_caps['EHLO']; + } + if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) { + return false; + } + $this->setError('HELO handshake was used. Client knows nothing about server extensions'); + return null; + } + + return $this->server_caps[$name]; + } + + /** + * Get the last reply from the server. + * @access public + * @return string + */ + public function getLastReply() + { + return $this->last_reply; + } + + /** + * Read the SMTP server's response. + * Either before eof or socket timeout occurs on the operation. + * With SMTP we can tell if we have more lines to read if the + * 4th character is '-' symbol. If it is a space then we don't + * need to read anything else. + * @access protected + * @return string + */ + protected function get_lines() + { + // If the connection is bad, give up straight away + if (!is_resource($this->smtp_conn)) { + return ''; + } + $data = ''; + $endtime = 0; + stream_set_timeout($this->smtp_conn, $this->Timeout); + if ($this->Timelimit > 0) { + $endtime = time() + $this->Timelimit; + } + while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) { + $str = @fgets($this->smtp_conn, 515); + $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL); + $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL); + $data .= $str; + // If response is only 3 chars (not valid, but RFC5321 S4.2 says it must be handled), + // or 4th character is a space, we are done reading, break the loop, + // string array access is a micro-optimisation over strlen + if (!isset($str[3]) or (isset($str[3]) and $str[3] == ' ')) { + break; + } + // Timed-out? Log and break + $info = stream_get_meta_data($this->smtp_conn); + if ($info['timed_out']) { + $this->edebug( + 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)', + self::DEBUG_LOWLEVEL + ); + break; + } + // Now check if reads took too long + if ($endtime and time() > $endtime) { + $this->edebug( + 'SMTP -> get_lines(): timelimit reached (' . + $this->Timelimit . ' sec)', + self::DEBUG_LOWLEVEL + ); + break; + } + } + return $data; + } + + /** + * Enable or disable VERP address generation. + * @param boolean $enabled + */ + public function setVerp($enabled = false) + { + $this->do_verp = $enabled; + } + + /** + * Get VERP address generation mode. + * @return boolean + */ + public function getVerp() + { + return $this->do_verp; + } + + /** + * Set error messages and codes. + * @param string $message The error message + * @param string $detail Further detail on the error + * @param string $smtp_code An associated SMTP error code + * @param string $smtp_code_ex Extended SMTP code + */ + protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '') + { + $this->error = array( + 'error' => $message, + 'detail' => $detail, + 'smtp_code' => $smtp_code, + 'smtp_code_ex' => $smtp_code_ex + ); + } + + /** + * Set debug output method. + * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it. + */ + public function setDebugOutput($method = 'echo') + { + $this->Debugoutput = $method; + } + + /** + * Get debug output method. + * @return string + */ + public function getDebugOutput() + { + return $this->Debugoutput; + } + + /** + * Set debug output level. + * @param integer $level + */ + public function setDebugLevel($level = 0) + { + $this->do_debug = $level; + } + + /** + * Get debug output level. + * @return integer + */ + public function getDebugLevel() + { + return $this->do_debug; + } + + /** + * Set SMTP timeout. + * @param integer $timeout + */ + public function setTimeout($timeout = 0) + { + $this->Timeout = $timeout; + } + + /** + * Get SMTP timeout. + * @return integer + */ + public function getTimeout() + { + return $this->Timeout; + } + + /** + * Reports an error number and string. + * @param integer $errno The error number returned by PHP. + * @param string $errmsg The error message returned by PHP. + * @param string $errfile The file the error occurred in + * @param integer $errline The line number the error occurred on + */ + protected function errorHandler($errno, $errmsg, $errfile = '', $errline = 0) + { + $notice = 'Connection failed.'; + $this->setError( + $notice, + $errno, + $errmsg + ); + $this->edebug( + $notice . ' Error #' . $errno . ': ' . $errmsg . " [$errfile line $errline]", + self::DEBUG_CONNECTION + ); + } + + /** + * Extract and return the ID of the last SMTP transaction based on + * a list of patterns provided in SMTP::$smtp_transaction_id_patterns. + * Relies on the host providing the ID in response to a DATA command. + * If no reply has been received yet, it will return null. + * If no pattern was matched, it will return false. + * @return bool|null|string + */ + protected function recordLastTransactionID() + { + $reply = $this->getLastReply(); + + if (empty($reply)) { + $this->last_smtp_transaction_id = null; + } else { + $this->last_smtp_transaction_id = false; + foreach ($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) { + if (preg_match($smtp_transaction_id_pattern, $reply, $matches)) { + $this->last_smtp_transaction_id = $matches[1]; + } + } + } + + return $this->last_smtp_transaction_id; + } + + /** + * Get the queue/transaction ID of the last SMTP transaction + * If no reply has been received yet, it will return null. + * If no pattern was matched, it will return false. + * @return bool|null|string + * @see recordLastTransactionID() + */ + public function getLastTransactionID() + { + return $this->last_smtp_transaction_id; + } +} diff --git a/wp-includes/class-snoopy.php b/wp-includes/class-snoopy.php new file mode 100644 index 0000000..f26eb0e --- /dev/null +++ b/wp-includes/class-snoopy.php @@ -0,0 +1,1259 @@ +<?php + +/** + * Deprecated. Use WP_HTTP (http.php) instead. + */ +_deprecated_file( basename( __FILE__ ), '3.0.0', WPINC . '/http.php' ); + +if ( ! class_exists( 'Snoopy', false ) ) : +/************************************************* + +Snoopy - the PHP net client +Author: Monte Ohrt <monte@ispi.net> +Copyright (c): 1999-2008 New Digital Group, all rights reserved +Version: 1.2.4 + + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +You may contact the author of Snoopy by e-mail at: +monte@ohrt.com + +The latest version of Snoopy can be obtained from: +http://snoopy.sourceforge.net/ + +*************************************************/ + +class Snoopy +{ + /**** Public variables ****/ + + /* user definable vars */ + + var $host = "www.php.net"; // host name we are connecting to + var $port = 80; // port we are connecting to + var $proxy_host = ""; // proxy host to use + var $proxy_port = ""; // proxy port to use + var $proxy_user = ""; // proxy user to use + var $proxy_pass = ""; // proxy password to use + + var $agent = "Snoopy v1.2.4"; // agent we masquerade as + var $referer = ""; // referer info to pass + var $cookies = array(); // array of cookies to pass + // $cookies["username"]="joe"; + var $rawheaders = array(); // array of raw headers to send + // $rawheaders["Content-type"]="text/html"; + + var $maxredirs = 5; // http redirection depth maximum. 0 = disallow + var $lastredirectaddr = ""; // contains address of last redirected address + var $offsiteok = true; // allows redirection off-site + var $maxframes = 0; // frame content depth maximum. 0 = disallow + var $expandlinks = true; // expand links to fully qualified URLs. + // this only applies to fetchlinks() + // submitlinks(), and submittext() + var $passcookies = true; // pass set cookies back through redirects + // NOTE: this currently does not respect + // dates, domains or paths. + + var $user = ""; // user for http authentication + var $pass = ""; // password for http authentication + + // http accept types + var $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; + + var $results = ""; // where the content is put + + var $error = ""; // error messages sent here + var $response_code = ""; // response code returned from server + var $headers = array(); // headers returned from server sent here + var $maxlength = 500000; // max return data length (body) + var $read_timeout = 0; // timeout on read operations, in seconds + // supported only since PHP 4 Beta 4 + // set to 0 to disallow timeouts + var $timed_out = false; // if a read operation timed out + var $status = 0; // http request status + + var $temp_dir = "/tmp"; // temporary directory that the webserver + // has permission to write to. + // under Windows, this should be C:\temp + + var $curl_path = "/usr/local/bin/curl"; + // Snoopy will use cURL for fetching + // SSL content if a full system path to + // the cURL binary is supplied here. + // set to false if you do not have + // cURL installed. See http://curl.haxx.se + // for details on installing cURL. + // Snoopy does *not* use the cURL + // library functions built into php, + // as these functions are not stable + // as of this Snoopy release. + + /**** Private variables ****/ + + var $_maxlinelen = 4096; // max line length (headers) + + var $_httpmethod = "GET"; // default http request method + var $_httpversion = "HTTP/1.0"; // default http request version + var $_submit_method = "POST"; // default submit method + var $_submit_type = "application/x-www-form-urlencoded"; // default submit type + var $_mime_boundary = ""; // MIME boundary for multipart/form-data submit type + var $_redirectaddr = false; // will be set if page fetched is a redirect + var $_redirectdepth = 0; // increments on an http redirect + var $_frameurls = array(); // frame src urls + var $_framedepth = 0; // increments on frame depth + + var $_isproxy = false; // set if using a proxy server + var $_fp_timeout = 30; // timeout for socket connection + +/*======================================================================*\ + Function: fetch + Purpose: fetch the contents of a web page + (and possibly other protocols in the + future like ftp, nntp, gopher, etc.) + Input: $URI the location of the page to fetch + Output: $this->results the output text from the fetch +\*======================================================================*/ + + function fetch($URI) + { + + //preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS); + $URI_PARTS = parse_url($URI); + if (!empty($URI_PARTS["user"])) + $this->user = $URI_PARTS["user"]; + if (!empty($URI_PARTS["pass"])) + $this->pass = $URI_PARTS["pass"]; + if (empty($URI_PARTS["query"])) + $URI_PARTS["query"] = ''; + if (empty($URI_PARTS["path"])) + $URI_PARTS["path"] = ''; + + switch(strtolower($URI_PARTS["scheme"])) + { + case "http": + $this->host = $URI_PARTS["host"]; + if(!empty($URI_PARTS["port"])) + $this->port = $URI_PARTS["port"]; + if($this->_connect($fp)) + { + if($this->_isproxy) + { + // using proxy, send entire URI + $this->_httprequest($URI,$fp,$URI,$this->_httpmethod); + } + else + { + $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); + // no proxy, send only the path + $this->_httprequest($path, $fp, $URI, $this->_httpmethod); + } + + $this->_disconnect($fp); + + if($this->_redirectaddr) + { + /* url was redirected, check if we've hit the max depth */ + if($this->maxredirs > $this->_redirectdepth) + { + // only follow redirect if it's on this site, or offsiteok is true + if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) + { + /* follow the redirect */ + $this->_redirectdepth++; + $this->lastredirectaddr=$this->_redirectaddr; + $this->fetch($this->_redirectaddr); + } + } + } + + if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) + { + $frameurls = $this->_frameurls; + $this->_frameurls = array(); + + while(list(,$frameurl) = each($frameurls)) + { + if($this->_framedepth < $this->maxframes) + { + $this->fetch($frameurl); + $this->_framedepth++; + } + else + break; + } + } + } + else + { + return false; + } + return true; + break; + case "https": + if(!$this->curl_path) + return false; + if(function_exists("is_executable")) + if (!is_executable($this->curl_path)) + return false; + $this->host = $URI_PARTS["host"]; + if(!empty($URI_PARTS["port"])) + $this->port = $URI_PARTS["port"]; + if($this->_isproxy) + { + // using proxy, send entire URI + $this->_httpsrequest($URI,$URI,$this->_httpmethod); + } + else + { + $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); + // no proxy, send only the path + $this->_httpsrequest($path, $URI, $this->_httpmethod); + } + + if($this->_redirectaddr) + { + /* url was redirected, check if we've hit the max depth */ + if($this->maxredirs > $this->_redirectdepth) + { + // only follow redirect if it's on this site, or offsiteok is true + if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) + { + /* follow the redirect */ + $this->_redirectdepth++; + $this->lastredirectaddr=$this->_redirectaddr; + $this->fetch($this->_redirectaddr); + } + } + } + + if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) + { + $frameurls = $this->_frameurls; + $this->_frameurls = array(); + + while(list(,$frameurl) = each($frameurls)) + { + if($this->_framedepth < $this->maxframes) + { + $this->fetch($frameurl); + $this->_framedepth++; + } + else + break; + } + } + return true; + break; + default: + // not a valid protocol + $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; + return false; + break; + } + return true; + } + +/*======================================================================*\ + Function: submit + Purpose: submit an http form + Input: $URI the location to post the data + $formvars the formvars to use. + format: $formvars["var"] = "val"; + $formfiles an array of files to submit + format: $formfiles["var"] = "/dir/filename.ext"; + Output: $this->results the text output from the post +\*======================================================================*/ + + function submit($URI, $formvars="", $formfiles="") + { + unset($postdata); + + $postdata = $this->_prepare_post_body($formvars, $formfiles); + + $URI_PARTS = parse_url($URI); + if (!empty($URI_PARTS["user"])) + $this->user = $URI_PARTS["user"]; + if (!empty($URI_PARTS["pass"])) + $this->pass = $URI_PARTS["pass"]; + if (empty($URI_PARTS["query"])) + $URI_PARTS["query"] = ''; + if (empty($URI_PARTS["path"])) + $URI_PARTS["path"] = ''; + + switch(strtolower($URI_PARTS["scheme"])) + { + case "http": + $this->host = $URI_PARTS["host"]; + if(!empty($URI_PARTS["port"])) + $this->port = $URI_PARTS["port"]; + if($this->_connect($fp)) + { + if($this->_isproxy) + { + // using proxy, send entire URI + $this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata); + } + else + { + $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); + // no proxy, send only the path + $this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata); + } + + $this->_disconnect($fp); + + if($this->_redirectaddr) + { + /* url was redirected, check if we've hit the max depth */ + if($this->maxredirs > $this->_redirectdepth) + { + if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) + $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); + + // only follow redirect if it's on this site, or offsiteok is true + if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) + { + /* follow the redirect */ + $this->_redirectdepth++; + $this->lastredirectaddr=$this->_redirectaddr; + if( strpos( $this->_redirectaddr, "?" ) > 0 ) + $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get + else + $this->submit($this->_redirectaddr,$formvars, $formfiles); + } + } + } + + if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) + { + $frameurls = $this->_frameurls; + $this->_frameurls = array(); + + while(list(,$frameurl) = each($frameurls)) + { + if($this->_framedepth < $this->maxframes) + { + $this->fetch($frameurl); + $this->_framedepth++; + } + else + break; + } + } + + } + else + { + return false; + } + return true; + break; + case "https": + if(!$this->curl_path) + return false; + if(function_exists("is_executable")) + if (!is_executable($this->curl_path)) + return false; + $this->host = $URI_PARTS["host"]; + if(!empty($URI_PARTS["port"])) + $this->port = $URI_PARTS["port"]; + if($this->_isproxy) + { + // using proxy, send entire URI + $this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata); + } + else + { + $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); + // no proxy, send only the path + $this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata); + } + + if($this->_redirectaddr) + { + /* url was redirected, check if we've hit the max depth */ + if($this->maxredirs > $this->_redirectdepth) + { + if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) + $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); + + // only follow redirect if it's on this site, or offsiteok is true + if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) + { + /* follow the redirect */ + $this->_redirectdepth++; + $this->lastredirectaddr=$this->_redirectaddr; + if( strpos( $this->_redirectaddr, "?" ) > 0 ) + $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get + else + $this->submit($this->_redirectaddr,$formvars, $formfiles); + } + } + } + + if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) + { + $frameurls = $this->_frameurls; + $this->_frameurls = array(); + + while(list(,$frameurl) = each($frameurls)) + { + if($this->_framedepth < $this->maxframes) + { + $this->fetch($frameurl); + $this->_framedepth++; + } + else + break; + } + } + return true; + break; + + default: + // not a valid protocol + $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; + return false; + break; + } + return true; + } + +/*======================================================================*\ + Function: fetchlinks + Purpose: fetch the links from a web page + Input: $URI where you are fetching from + Output: $this->results an array of the URLs +\*======================================================================*/ + + function fetchlinks($URI) + { + if ($this->fetch($URI)) + { + if($this->lastredirectaddr) + $URI = $this->lastredirectaddr; + if(is_array($this->results)) + { + for($x=0;$x<count($this->results);$x++) + $this->results[$x] = $this->_striplinks($this->results[$x]); + } + else + $this->results = $this->_striplinks($this->results); + + if($this->expandlinks) + $this->results = $this->_expandlinks($this->results, $URI); + return true; + } + else + return false; + } + +/*======================================================================*\ + Function: fetchform + Purpose: fetch the form elements from a web page + Input: $URI where you are fetching from + Output: $this->results the resulting html form +\*======================================================================*/ + + function fetchform($URI) + { + + if ($this->fetch($URI)) + { + + if(is_array($this->results)) + { + for($x=0;$x<count($this->results);$x++) + $this->results[$x] = $this->_stripform($this->results[$x]); + } + else + $this->results = $this->_stripform($this->results); + + return true; + } + else + return false; + } + + +/*======================================================================*\ + Function: fetchtext + Purpose: fetch the text from a web page, stripping the links + Input: $URI where you are fetching from + Output: $this->results the text from the web page +\*======================================================================*/ + + function fetchtext($URI) + { + if($this->fetch($URI)) + { + if(is_array($this->results)) + { + for($x=0;$x<count($this->results);$x++) + $this->results[$x] = $this->_striptext($this->results[$x]); + } + else + $this->results = $this->_striptext($this->results); + return true; + } + else + return false; + } + +/*======================================================================*\ + Function: submitlinks + Purpose: grab links from a form submission + Input: $URI where you are submitting from + Output: $this->results an array of the links from the post +\*======================================================================*/ + + function submitlinks($URI, $formvars="", $formfiles="") + { + if($this->submit($URI,$formvars, $formfiles)) + { + if($this->lastredirectaddr) + $URI = $this->lastredirectaddr; + if(is_array($this->results)) + { + for($x=0;$x<count($this->results);$x++) + { + $this->results[$x] = $this->_striplinks($this->results[$x]); + if($this->expandlinks) + $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); + } + } + else + { + $this->results = $this->_striplinks($this->results); + if($this->expandlinks) + $this->results = $this->_expandlinks($this->results,$URI); + } + return true; + } + else + return false; + } + +/*======================================================================*\ + Function: submittext + Purpose: grab text from a form submission + Input: $URI where you are submitting from + Output: $this->results the text from the web page +\*======================================================================*/ + + function submittext($URI, $formvars = "", $formfiles = "") + { + if($this->submit($URI,$formvars, $formfiles)) + { + if($this->lastredirectaddr) + $URI = $this->lastredirectaddr; + if(is_array($this->results)) + { + for($x=0;$x<count($this->results);$x++) + { + $this->results[$x] = $this->_striptext($this->results[$x]); + if($this->expandlinks) + $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); + } + } + else + { + $this->results = $this->_striptext($this->results); + if($this->expandlinks) + $this->results = $this->_expandlinks($this->results,$URI); + } + return true; + } + else + return false; + } + + + +/*======================================================================*\ + Function: set_submit_multipart + Purpose: Set the form submission content type to + multipart/form-data +\*======================================================================*/ + function set_submit_multipart() + { + $this->_submit_type = "multipart/form-data"; + } + + +/*======================================================================*\ + Function: set_submit_normal + Purpose: Set the form submission content type to + application/x-www-form-urlencoded +\*======================================================================*/ + function set_submit_normal() + { + $this->_submit_type = "application/x-www-form-urlencoded"; + } + + + + +/*======================================================================*\ + Private functions +\*======================================================================*/ + + +/*======================================================================*\ + Function: _striplinks + Purpose: strip the hyperlinks from an html document + Input: $document document to strip. + Output: $match an array of the links +\*======================================================================*/ + + function _striplinks($document) + { + preg_match_all("'<\s*a\s.*?href\s*=\s* # find <a href= + ([\"\'])? # find single or double quote + (?(1) (.*?)\\1 | ([^\s\>]+)) # if quote found, match up to next matching + # quote, otherwise match up to next space + 'isx",$document,$links); + + + // catenate the non-empty matches from the conditional subpattern + + while(list($key,$val) = each($links[2])) + { + if(!empty($val)) + $match[] = $val; + } + + while(list($key,$val) = each($links[3])) + { + if(!empty($val)) + $match[] = $val; + } + + // return the links + return $match; + } + +/*======================================================================*\ + Function: _stripform + Purpose: strip the form elements from an html document + Input: $document document to strip. + Output: $match an array of the links +\*======================================================================*/ + + function _stripform($document) + { + preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements); + + // catenate the matches + $match = implode("\r\n",$elements[0]); + + // return the links + return $match; + } + + + +/*======================================================================*\ + Function: _striptext + Purpose: strip the text from an html document + Input: $document document to strip. + Output: $text the resulting text +\*======================================================================*/ + + function _striptext($document) + { + + // I didn't use preg eval (//e) since that is only available in PHP 4.0. + // so, list your entities one by one here. I included some of the + // more common ones. + + $search = array("'<script[^>]*?>.*?</script>'si", // strip out javascript + "'<[\/\!]*?[^<>]*?>'si", // strip out html tags + "'([\r\n])[\s]+'", // strip out white space + "'&(quot|#34|#034|#x22);'i", // replace html entities + "'&(amp|#38|#038|#x26);'i", // added hexadecimal values + "'&(lt|#60|#060|#x3c);'i", + "'&(gt|#62|#062|#x3e);'i", + "'&(nbsp|#160|#xa0);'i", + "'&(iexcl|#161);'i", + "'&(cent|#162);'i", + "'&(pound|#163);'i", + "'&(copy|#169);'i", + "'&(reg|#174);'i", + "'&(deg|#176);'i", + "'&(#39|#039|#x27);'", + "'&(euro|#8364);'i", // europe + "'&a(uml|UML);'", // german + "'&o(uml|UML);'", + "'&u(uml|UML);'", + "'&A(uml|UML);'", + "'&O(uml|UML);'", + "'&U(uml|UML);'", + "'ß'i", + ); + $replace = array( "", + "", + "\\1", + "\"", + "&", + "<", + ">", + " ", + chr(161), + chr(162), + chr(163), + chr(169), + chr(174), + chr(176), + chr(39), + chr(128), + chr(0xE4), // ANSI ä + chr(0xF6), // ANSI ö + chr(0xFC), // ANSI ü + chr(0xC4), // ANSI Ä + chr(0xD6), // ANSI Ö + chr(0xDC), // ANSI Ü + chr(0xDF), // ANSI ß + ); + + $text = preg_replace($search,$replace,$document); + + return $text; + } + +/*======================================================================*\ + Function: _expandlinks + Purpose: expand each link into a fully qualified URL + Input: $links the links to qualify + $URI the full URI to get the base from + Output: $expandedLinks the expanded links +\*======================================================================*/ + + function _expandlinks($links,$URI) + { + + preg_match("/^[^\?]+/",$URI,$match); + + $match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]); + $match = preg_replace("|/$|","",$match); + $match_part = parse_url($match); + $match_root = + $match_part["scheme"]."://".$match_part["host"]; + + $search = array( "|^http://".preg_quote($this->host)."|i", + "|^(\/)|i", + "|^(?!http://)(?!mailto:)|i", + "|/\./|", + "|/[^\/]+/\.\./|" + ); + + $replace = array( "", + $match_root."/", + $match."/", + "/", + "/" + ); + + $expandedLinks = preg_replace($search,$replace,$links); + + return $expandedLinks; + } + +/*======================================================================*\ + Function: _httprequest + Purpose: go get the http data from the server + Input: $url the url to fetch + $fp the current open file pointer + $URI the full URI + $body body contents to send if any (POST) + Output: +\*======================================================================*/ + + function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="") + { + $cookie_headers = ''; + if($this->passcookies && $this->_redirectaddr) + $this->setcookies(); + + $URI_PARTS = parse_url($URI); + if(empty($url)) + $url = "/"; + $headers = $http_method." ".$url." ".$this->_httpversion."\r\n"; + if(!empty($this->agent)) + $headers .= "User-Agent: ".$this->agent."\r\n"; + if(!empty($this->host) && !isset($this->rawheaders['Host'])) { + $headers .= "Host: ".$this->host; + if(!empty($this->port) && $this->port != 80) + $headers .= ":".$this->port; + $headers .= "\r\n"; + } + if(!empty($this->accept)) + $headers .= "Accept: ".$this->accept."\r\n"; + if(!empty($this->referer)) + $headers .= "Referer: ".$this->referer."\r\n"; + if(!empty($this->cookies)) + { + if(!is_array($this->cookies)) + $this->cookies = (array)$this->cookies; + + reset($this->cookies); + if ( count($this->cookies) > 0 ) { + $cookie_headers .= 'Cookie: '; + foreach ( $this->cookies as $cookieKey => $cookieVal ) { + $cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; "; + } + $headers .= substr($cookie_headers,0,-2) . "\r\n"; + } + } + if(!empty($this->rawheaders)) + { + if(!is_array($this->rawheaders)) + $this->rawheaders = (array)$this->rawheaders; + while(list($headerKey,$headerVal) = each($this->rawheaders)) + $headers .= $headerKey.": ".$headerVal."\r\n"; + } + if(!empty($content_type)) { + $headers .= "Content-type: $content_type"; + if ($content_type == "multipart/form-data") + $headers .= "; boundary=".$this->_mime_boundary; + $headers .= "\r\n"; + } + if(!empty($body)) + $headers .= "Content-length: ".strlen($body)."\r\n"; + if(!empty($this->user) || !empty($this->pass)) + $headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n"; + + //add proxy auth headers + if(!empty($this->proxy_user)) + $headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n"; + + + $headers .= "\r\n"; + + // set the read timeout if needed + if ($this->read_timeout > 0) + socket_set_timeout($fp, $this->read_timeout); + $this->timed_out = false; + + fwrite($fp,$headers.$body,strlen($headers.$body)); + + $this->_redirectaddr = false; + unset($this->headers); + + while($currentHeader = fgets($fp,$this->_maxlinelen)) + { + if ($this->read_timeout > 0 && $this->_check_timeout($fp)) + { + $this->status=-100; + return false; + } + + if($currentHeader == "\r\n") + break; + + // if a header begins with Location: or URI:, set the redirect + if(preg_match("/^(Location:|URI:)/i",$currentHeader)) + { + // get URL portion of the redirect + preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches); + // look for :// in the Location header to see if hostname is included + if(!preg_match("|\:\/\/|",$matches[2])) + { + // no host in the path, so prepend + $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; + // eliminate double slash + if(!preg_match("|^/|",$matches[2])) + $this->_redirectaddr .= "/".$matches[2]; + else + $this->_redirectaddr .= $matches[2]; + } + else + $this->_redirectaddr = $matches[2]; + } + + if(preg_match("|^HTTP/|",$currentHeader)) + { + if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status)) + { + $this->status= $status[1]; + } + $this->response_code = $currentHeader; + } + + $this->headers[] = $currentHeader; + } + + $results = ''; + do { + $_data = fread($fp, $this->maxlength); + if (strlen($_data) == 0) { + break; + } + $results .= $_data; + } while(true); + + if ($this->read_timeout > 0 && $this->_check_timeout($fp)) + { + $this->status=-100; + return false; + } + + // check if there is a redirect meta tag + + if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) + + { + $this->_redirectaddr = $this->_expandlinks($match[1],$URI); + } + + // have we hit our frame depth and is there frame src to fetch? + if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match)) + { + $this->results[] = $results; + for($x=0; $x<count($match[1]); $x++) + $this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); + } + // have we already fetched framed content? + elseif(is_array($this->results)) + $this->results[] = $results; + // no framed content + else + $this->results = $results; + + return true; + } + +/*======================================================================*\ + Function: _httpsrequest + Purpose: go get the https data from the server using curl + Input: $url the url to fetch + $URI the full URI + $body body contents to send if any (POST) + Output: +\*======================================================================*/ + + function _httpsrequest($url,$URI,$http_method,$content_type="",$body="") + { + if($this->passcookies && $this->_redirectaddr) + $this->setcookies(); + + $headers = array(); + + $URI_PARTS = parse_url($URI); + if(empty($url)) + $url = "/"; + // GET ... header not needed for curl + //$headers[] = $http_method." ".$url." ".$this->_httpversion; + if(!empty($this->agent)) + $headers[] = "User-Agent: ".$this->agent; + if(!empty($this->host)) + if(!empty($this->port)) + $headers[] = "Host: ".$this->host.":".$this->port; + else + $headers[] = "Host: ".$this->host; + if(!empty($this->accept)) + $headers[] = "Accept: ".$this->accept; + if(!empty($this->referer)) + $headers[] = "Referer: ".$this->referer; + if(!empty($this->cookies)) + { + if(!is_array($this->cookies)) + $this->cookies = (array)$this->cookies; + + reset($this->cookies); + if ( count($this->cookies) > 0 ) { + $cookie_str = 'Cookie: '; + foreach ( $this->cookies as $cookieKey => $cookieVal ) { + $cookie_str .= $cookieKey."=".urlencode($cookieVal)."; "; + } + $headers[] = substr($cookie_str,0,-2); + } + } + if(!empty($this->rawheaders)) + { + if(!is_array($this->rawheaders)) + $this->rawheaders = (array)$this->rawheaders; + while(list($headerKey,$headerVal) = each($this->rawheaders)) + $headers[] = $headerKey.": ".$headerVal; + } + if(!empty($content_type)) { + if ($content_type == "multipart/form-data") + $headers[] = "Content-type: $content_type; boundary=".$this->_mime_boundary; + else + $headers[] = "Content-type: $content_type"; + } + if(!empty($body)) + $headers[] = "Content-length: ".strlen($body); + if(!empty($this->user) || !empty($this->pass)) + $headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass); + + $headerfile = tempnam( $this->temp_dir, "sno" ); + $cmdline_params = '-k -D ' . escapeshellarg( $headerfile ); + + foreach ( $headers as $header ) { + $cmdline_params .= ' -H ' . escapeshellarg( $header ); + } + + if ( ! empty( $body ) ) { + $cmdline_params .= ' -d ' . escapeshellarg( $body ); + } + + if ( $this->read_timeout > 0 ) { + $cmdline_params .= ' -m ' . escapeshellarg( $this->read_timeout ); + } + + + exec( $this->curl_path . ' ' . $cmdline_params . ' ' . escapeshellarg( $URI ), $results, $return ); + + if($return) + { + $this->error = "Error: cURL could not retrieve the document, error $return."; + return false; + } + + + $results = implode("\r\n",$results); + + $result_headers = file("$headerfile"); + + $this->_redirectaddr = false; + unset($this->headers); + + for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++) + { + + // if a header begins with Location: or URI:, set the redirect + if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader])) + { + // get URL portion of the redirect + preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches); + // look for :// in the Location header to see if hostname is included + if(!preg_match("|\:\/\/|",$matches[2])) + { + // no host in the path, so prepend + $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; + // eliminate double slash + if(!preg_match("|^/|",$matches[2])) + $this->_redirectaddr .= "/".$matches[2]; + else + $this->_redirectaddr .= $matches[2]; + } + else + $this->_redirectaddr = $matches[2]; + } + + if(preg_match("|^HTTP/|",$result_headers[$currentHeader])) + $this->response_code = $result_headers[$currentHeader]; + + $this->headers[] = $result_headers[$currentHeader]; + } + + // check if there is a redirect meta tag + + if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) + { + $this->_redirectaddr = $this->_expandlinks($match[1],$URI); + } + + // have we hit our frame depth and is there frame src to fetch? + if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match)) + { + $this->results[] = $results; + for($x=0; $x<count($match[1]); $x++) + $this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); + } + // have we already fetched framed content? + elseif(is_array($this->results)) + $this->results[] = $results; + // no framed content + else + $this->results = $results; + + unlink("$headerfile"); + + return true; + } + +/*======================================================================*\ + Function: setcookies() + Purpose: set cookies for a redirection +\*======================================================================*/ + + function setcookies() + { + for($x=0; $x<count($this->headers); $x++) + { + if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match)) + $this->cookies[$match[1]] = urldecode($match[2]); + } + } + + +/*======================================================================*\ + Function: _check_timeout + Purpose: checks whether timeout has occurred + Input: $fp file pointer +\*======================================================================*/ + + function _check_timeout($fp) + { + if ($this->read_timeout > 0) { + $fp_status = socket_get_status($fp); + if ($fp_status["timed_out"]) { + $this->timed_out = true; + return true; + } + } + return false; + } + +/*======================================================================*\ + Function: _connect + Purpose: make a socket connection + Input: $fp file pointer +\*======================================================================*/ + + function _connect(&$fp) + { + if(!empty($this->proxy_host) && !empty($this->proxy_port)) + { + $this->_isproxy = true; + + $host = $this->proxy_host; + $port = $this->proxy_port; + } + else + { + $host = $this->host; + $port = $this->port; + } + + $this->status = 0; + + if($fp = fsockopen( + $host, + $port, + $errno, + $errstr, + $this->_fp_timeout + )) + { + // socket connection succeeded + + return true; + } + else + { + // socket connection failed + $this->status = $errno; + switch($errno) + { + case -3: + $this->error="socket creation failed (-3)"; + case -4: + $this->error="dns lookup failure (-4)"; + case -5: + $this->error="connection refused or timed out (-5)"; + default: + $this->error="connection failed (".$errno.")"; + } + return false; + } + } +/*======================================================================*\ + Function: _disconnect + Purpose: disconnect a socket connection + Input: $fp file pointer +\*======================================================================*/ + + function _disconnect($fp) + { + return(fclose($fp)); + } + + +/*======================================================================*\ + Function: _prepare_post_body + Purpose: Prepare post body according to encoding type + Input: $formvars - form variables + $formfiles - form upload files + Output: post body +\*======================================================================*/ + + function _prepare_post_body($formvars, $formfiles) + { + settype($formvars, "array"); + settype($formfiles, "array"); + $postdata = ''; + + if (count($formvars) == 0 && count($formfiles) == 0) + return; + + switch ($this->_submit_type) { + case "application/x-www-form-urlencoded": + reset($formvars); + while(list($key,$val) = each($formvars)) { + if (is_array($val) || is_object($val)) { + while (list($cur_key, $cur_val) = each($val)) { + $postdata .= urlencode($key)."[]=".urlencode($cur_val)."&"; + } + } else + $postdata .= urlencode($key)."=".urlencode($val)."&"; + } + break; + + case "multipart/form-data": + $this->_mime_boundary = "Snoopy".md5(uniqid(microtime())); + + reset($formvars); + while(list($key,$val) = each($formvars)) { + if (is_array($val) || is_object($val)) { + while (list($cur_key, $cur_val) = each($val)) { + $postdata .= "--".$this->_mime_boundary."\r\n"; + $postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n"; + $postdata .= "$cur_val\r\n"; + } + } else { + $postdata .= "--".$this->_mime_boundary."\r\n"; + $postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n"; + $postdata .= "$val\r\n"; + } + } + + reset($formfiles); + while (list($field_name, $file_names) = each($formfiles)) { + settype($file_names, "array"); + while (list(, $file_name) = each($file_names)) { + if (!is_readable($file_name)) continue; + + $fp = fopen($file_name, "r"); + $file_content = fread($fp, filesize($file_name)); + fclose($fp); + $base_name = basename($file_name); + + $postdata .= "--".$this->_mime_boundary."\r\n"; + $postdata .= "Content-Disposition: form-data; name=\"$field_name\"; filename=\"$base_name\"\r\n\r\n"; + $postdata .= "$file_content\r\n"; + } + } + $postdata .= "--".$this->_mime_boundary."--\r\n"; + break; + } + + return $postdata; + } +} +endif; +?> diff --git a/wp-includes/class-walker-category-dropdown.php b/wp-includes/class-walker-category-dropdown.php new file mode 100644 index 0000000..c0fbbd6 --- /dev/null +++ b/wp-includes/class-walker-category-dropdown.php @@ -0,0 +1,82 @@ +<?php +/** + * Taxonomy API: Walker_CategoryDropdown class + * + * @package WordPress + * @subpackage Template + * @since 4.4.0 + */ + +/** + * Core class used to create an HTML dropdown list of Categories. + * + * @since 2.1.0 + * + * @see Walker + */ +class Walker_CategoryDropdown extends Walker { + + /** + * What the class handles. + * + * @since 2.1.0 + * @var string + * + * @see Walker::$tree_type + */ + public $tree_type = 'category'; + + /** + * Database fields to use. + * + * @since 2.1.0 + * @todo Decouple this + * @var array + * + * @see Walker::$db_fields + */ + public $db_fields = array( + 'parent' => 'parent', + 'id' => 'term_id', + ); + + /** + * Starts the element output. + * + * @since 2.1.0 + * + * @see Walker::start_el() + * + * @param string $output Used to append additional content (passed by reference). + * @param object $category Category data object. + * @param int $depth Depth of category. Used for padding. + * @param array $args Uses 'selected', 'show_count', and 'value_field' keys, if they exist. + * See wp_dropdown_categories(). + * @param int $id Optional. ID of the current category. Default 0 (unused). + */ + public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { + $pad = str_repeat( ' ', $depth * 3 ); + + /** This filter is documented in wp-includes/category-template.php */ + $cat_name = apply_filters( 'list_cats', $category->name, $category ); + + if ( isset( $args['value_field'] ) && isset( $category->{$args['value_field']} ) ) { + $value_field = $args['value_field']; + } else { + $value_field = 'term_id'; + } + + $output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $category->{$value_field} ) . '"'; + + // Type-juggling causes false matches, so we force everything to a string. + if ( (string) $category->{$value_field} === (string) $args['selected'] ) { + $output .= ' selected="selected"'; + } + $output .= '>'; + $output .= $pad . $cat_name; + if ( $args['show_count'] ) { + $output .= '  (' . number_format_i18n( $category->count ) . ')'; + } + $output .= "</option>\n"; + } +} diff --git a/wp-includes/class-walker-category.php b/wp-includes/class-walker-category.php new file mode 100644 index 0000000..16ad852 --- /dev/null +++ b/wp-includes/class-walker-category.php @@ -0,0 +1,268 @@ +<?php +/** + * Taxonomy API: Walker_Category class + * + * @package WordPress + * @subpackage Template + * @since 4.4.0 + */ + +/** + * Core class used to create an HTML list of categories. + * + * @since 2.1.0 + * + * @see Walker + */ +class Walker_Category extends Walker { + + /** + * What the class handles. + * + * @since 2.1.0 + * @var string + * + * @see Walker::$tree_type + */ + public $tree_type = 'category'; + + /** + * Database fields to use. + * + * @since 2.1.0 + * @var array + * + * @see Walker::$db_fields + * @todo Decouple this + */ + public $db_fields = array( + 'parent' => 'parent', + 'id' => 'term_id', + ); + + /** + * Starts the list before the elements are added. + * + * @since 2.1.0 + * + * @see Walker::start_lvl() + * + * @param string $output Used to append additional content. Passed by reference. + * @param int $depth Optional. Depth of category. Used for tab indentation. Default 0. + * @param array $args Optional. An array of arguments. Will only append content if style argument + * value is 'list'. See wp_list_categories(). Default empty array. + */ + public function start_lvl( &$output, $depth = 0, $args = array() ) { + if ( 'list' != $args['style'] ) { + return; + } + + $indent = str_repeat( "\t", $depth ); + $output .= "$indent<ul class='children'>\n"; + } + + /** + * Ends the list of after the elements are added. + * + * @since 2.1.0 + * + * @see Walker::end_lvl() + * + * @param string $output Used to append additional content. Passed by reference. + * @param int $depth Optional. Depth of category. Used for tab indentation. Default 0. + * @param array $args Optional. An array of arguments. Will only append content if style argument + * value is 'list'. See wp_list_categories(). Default empty array. + */ + public function end_lvl( &$output, $depth = 0, $args = array() ) { + if ( 'list' != $args['style'] ) { + return; + } + + $indent = str_repeat( "\t", $depth ); + $output .= "$indent</ul>\n"; + } + + /** + * Starts the element output. + * + * @since 2.1.0 + * + * @see Walker::start_el() + * + * @param string $output Used to append additional content (passed by reference). + * @param object $category Category data object. + * @param int $depth Optional. Depth of category in reference to parents. Default 0. + * @param array $args Optional. An array of arguments. See wp_list_categories(). Default empty array. + * @param int $id Optional. ID of the current category. Default 0. + */ + public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { + /** This filter is documented in wp-includes/category-template.php */ + $cat_name = apply_filters( 'list_cats', esc_attr( $category->name ), $category ); + + // Don't generate an element if the category name is empty. + if ( '' === $cat_name ) { + return; + } + + $atts = array(); + $atts['href'] = get_term_link( $category ); + + if ( $args['use_desc_for_title'] && ! empty( $category->description ) ) { + /** + * Filters the category description for display. + * + * @since 1.2.0 + * + * @param string $description Category description. + * @param object $category Category object. + */ + $atts['title'] = strip_tags( apply_filters( 'category_description', $category->description, $category ) ); + } + + /** + * Filters the HTML attributes applied to a category list item's anchor element. + * + * @since 5.2.0 + * + * @param array $atts { + * The HTML attributes applied to the list item's `<a>` element, empty strings are ignored. + * + * @type string $href The href attribute. + * @type string $title The title attribute. + * } + * @param WP_Term $category Term data object. + * @param int $depth Depth of category, used for padding. + * @param array $args An array of arguments. + * @param int $id ID of the current category. + */ + $atts = apply_filters( 'category_list_link_attributes', $atts, $category, $depth, $args, $id ); + + $attributes = ''; + foreach ( $atts as $attr => $value ) { + if ( is_scalar( $value ) && '' !== $value && false !== $value ) { + $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); + $attributes .= ' ' . $attr . '="' . $value . '"'; + } + } + + $link = sprintf( + '<a%s>%s</a>', + $attributes, + $cat_name + ); + + if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) { + $link .= ' '; + + if ( empty( $args['feed_image'] ) ) { + $link .= '('; + } + + $link .= '<a href="' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $args['feed_type'] ) ) . '"'; + + if ( empty( $args['feed'] ) ) { + /* translators: %s: Category name. */ + $alt = ' alt="' . sprintf( __( 'Feed for all posts filed under %s' ), $cat_name ) . '"'; + } else { + $alt = ' alt="' . $args['feed'] . '"'; + $name = $args['feed']; + $link .= empty( $args['title'] ) ? '' : $args['title']; + } + + $link .= '>'; + + if ( empty( $args['feed_image'] ) ) { + $link .= $name; + } else { + $link .= "<img src='" . esc_url( $args['feed_image'] ) . "'$alt" . ' />'; + } + $link .= '</a>'; + + if ( empty( $args['feed_image'] ) ) { + $link .= ')'; + } + } + + if ( ! empty( $args['show_count'] ) ) { + $link .= ' (' . number_format_i18n( $category->count ) . ')'; + } + if ( 'list' == $args['style'] ) { + $output .= "\t<li"; + $css_classes = array( + 'cat-item', + 'cat-item-' . $category->term_id, + ); + + if ( ! empty( $args['current_category'] ) ) { + // 'current_category' can be an array, so we use `get_terms()`. + $_current_terms = get_terms( + array( + 'taxonomy' => $category->taxonomy, + 'include' => $args['current_category'], + 'hide_empty' => false, + ) + ); + + foreach ( $_current_terms as $_current_term ) { + if ( $category->term_id == $_current_term->term_id ) { + $css_classes[] = 'current-cat'; + $link = str_replace( '<a', '<a aria-current="page"', $link ); + } elseif ( $category->term_id == $_current_term->parent ) { + $css_classes[] = 'current-cat-parent'; + } + while ( $_current_term->parent ) { + if ( $category->term_id == $_current_term->parent ) { + $css_classes[] = 'current-cat-ancestor'; + break; + } + $_current_term = get_term( $_current_term->parent, $category->taxonomy ); + } + } + } + + /** + * Filters the list of CSS classes to include with each category in the list. + * + * @since 4.2.0 + * + * @see wp_list_categories() + * + * @param array $css_classes An array of CSS classes to be applied to each list item. + * @param object $category Category data object. + * @param int $depth Depth of page, used for padding. + * @param array $args An array of wp_list_categories() arguments. + */ + $css_classes = implode( ' ', apply_filters( 'category_css_class', $css_classes, $category, $depth, $args ) ); + $css_classes = $css_classes ? ' class="' . esc_attr( $css_classes ) . '"' : ''; + + $output .= $css_classes; + $output .= ">$link\n"; + } elseif ( isset( $args['separator'] ) ) { + $output .= "\t$link" . $args['separator'] . "\n"; + } else { + $output .= "\t$link<br />\n"; + } + } + + /** + * Ends the element output, if needed. + * + * @since 2.1.0 + * + * @see Walker::end_el() + * + * @param string $output Used to append additional content (passed by reference). + * @param object $page Not used. + * @param int $depth Optional. Depth of category. Not used. + * @param array $args Optional. An array of arguments. Only uses 'list' for whether should append + * to output. See wp_list_categories(). Default empty array. + */ + public function end_el( &$output, $page, $depth = 0, $args = array() ) { + if ( 'list' != $args['style'] ) { + return; + } + + $output .= "</li>\n"; + } + +} diff --git a/wp-includes/class-walker-comment.php b/wp-includes/class-walker-comment.php new file mode 100644 index 0000000..08c8503 --- /dev/null +++ b/wp-includes/class-walker-comment.php @@ -0,0 +1,469 @@ +<?php +/** + * Comment API: Walker_Comment class + * + * @package WordPress + * @subpackage Comments + * @since 4.4.0 + */ + +/** + * Core walker class used to create an HTML list of comments. + * + * @since 2.7.0 + * + * @see Walker + */ +class Walker_Comment extends Walker { + + /** + * What the class handles. + * + * @since 2.7.0 + * @var string + * + * @see Walker::$tree_type + */ + public $tree_type = 'comment'; + + /** + * Database fields to use. + * + * @since 2.7.0 + * @var array + * + * @see Walker::$db_fields + * @todo Decouple this + */ + public $db_fields = array( + 'parent' => 'comment_parent', + 'id' => 'comment_ID', + ); + + /** + * Starts the list before the elements are added. + * + * @since 2.7.0 + * + * @see Walker::start_lvl() + * @global int $comment_depth + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Optional. Depth of the current comment. Default 0. + * @param array $args Optional. Uses 'style' argument for type of HTML list. Default empty array. + */ + public function start_lvl( &$output, $depth = 0, $args = array() ) { + $GLOBALS['comment_depth'] = $depth + 1; + + switch ( $args['style'] ) { + case 'div': + break; + case 'ol': + $output .= '<ol class="children">' . "\n"; + break; + case 'ul': + default: + $output .= '<ul class="children">' . "\n"; + break; + } + } + + /** + * Ends the list of items after the elements are added. + * + * @since 2.7.0 + * + * @see Walker::end_lvl() + * @global int $comment_depth + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Optional. Depth of the current comment. Default 0. + * @param array $args Optional. Will only append content if style argument value is 'ol' or 'ul'. + * Default empty array. + */ + public function end_lvl( &$output, $depth = 0, $args = array() ) { + $GLOBALS['comment_depth'] = $depth + 1; + + switch ( $args['style'] ) { + case 'div': + break; + case 'ol': + $output .= "</ol><!-- .children -->\n"; + break; + case 'ul': + default: + $output .= "</ul><!-- .children -->\n"; + break; + } + } + + /** + * Traverses elements to create list from elements. + * + * This function is designed to enhance Walker::display_element() to + * display children of higher nesting levels than selected inline on + * the highest depth level displayed. This prevents them being orphaned + * at the end of the comment list. + * + * Example: max_depth = 2, with 5 levels of nested content. + * 1 + * 1.1 + * 1.1.1 + * 1.1.1.1 + * 1.1.1.1.1 + * 1.1.2 + * 1.1.2.1 + * 2 + * 2.2 + * + * @since 2.7.0 + * + * @see Walker::display_element() + * @see wp_list_comments() + * + * @param WP_Comment $element Comment data object. + * @param array $children_elements List of elements to continue traversing. Passed by reference. + * @param int $max_depth Max depth to traverse. + * @param int $depth Depth of the current element. + * @param array $args An array of arguments. + * @param string $output Used to append additional content. Passed by reference. + */ + public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) { + if ( ! $element ) { + return; + } + + $id_field = $this->db_fields['id']; + $id = $element->$id_field; + + parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); + + /* + * If at the max depth, and the current element still has children, loop over those + * and display them at this level. This is to prevent them being orphaned to the end + * of the list. + */ + if ( $max_depth <= $depth + 1 && isset( $children_elements[ $id ] ) ) { + foreach ( $children_elements[ $id ] as $child ) { + $this->display_element( $child, $children_elements, $max_depth, $depth, $args, $output ); + } + + unset( $children_elements[ $id ] ); + } + + } + + /** + * Starts the element output. + * + * @since 2.7.0 + * + * @see Walker::start_el() + * @see wp_list_comments() + * @global int $comment_depth + * @global WP_Comment $comment Global comment object. + * + * @param string $output Used to append additional content. Passed by reference. + * @param WP_Comment $comment Comment data object. + * @param int $depth Optional. Depth of the current comment in reference to parents. Default 0. + * @param array $args Optional. An array of arguments. Default empty array. + * @param int $id Optional. ID of the current comment. Default 0 (unused). + */ + public function start_el( &$output, $comment, $depth = 0, $args = array(), $id = 0 ) { + $depth++; + $GLOBALS['comment_depth'] = $depth; + $GLOBALS['comment'] = $comment; + + if ( ! empty( $args['callback'] ) ) { + ob_start(); + call_user_func( $args['callback'], $comment, $args, $depth ); + $output .= ob_get_clean(); + return; + } + + if ( 'comment' === $comment->comment_type ) { + add_filter( 'comment_text', array( $this, 'filter_comment_text' ), 40, 2 ); + } + + if ( ( 'pingback' == $comment->comment_type || 'trackback' == $comment->comment_type ) && $args['short_ping'] ) { + ob_start(); + $this->ping( $comment, $depth, $args ); + $output .= ob_get_clean(); + } elseif ( 'html5' === $args['format'] ) { + ob_start(); + $this->html5_comment( $comment, $depth, $args ); + $output .= ob_get_clean(); + } else { + ob_start(); + $this->comment( $comment, $depth, $args ); + $output .= ob_get_clean(); + } + + if ( 'comment' === $comment->comment_type ) { + remove_filter( 'comment_text', array( $this, 'filter_comment_text' ), 40, 2 ); + } + } + + /** + * Ends the element output, if needed. + * + * @since 2.7.0 + * + * @see Walker::end_el() + * @see wp_list_comments() + * + * @param string $output Used to append additional content. Passed by reference. + * @param WP_Comment $comment The current comment object. Default current comment. + * @param int $depth Optional. Depth of the current comment. Default 0. + * @param array $args Optional. An array of arguments. Default empty array. + */ + public function end_el( &$output, $comment, $depth = 0, $args = array() ) { + if ( ! empty( $args['end-callback'] ) ) { + ob_start(); + call_user_func( $args['end-callback'], $comment, $args, $depth ); + $output .= ob_get_clean(); + return; + } + if ( 'div' == $args['style'] ) { + $output .= "</div><!-- #comment-## -->\n"; + } else { + $output .= "</li><!-- #comment-## -->\n"; + } + } + + /** + * Outputs a pingback comment. + * + * @since 3.6.0 + * + * @see wp_list_comments() + * + * @param WP_Comment $comment The comment object. + * @param int $depth Depth of the current comment. + * @param array $args An array of arguments. + */ + protected function ping( $comment, $depth, $args ) { + $tag = ( 'div' == $args['style'] ) ? 'div' : 'li'; + ?> + <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( '', $comment ); ?>> + <div class="comment-body"> + <?php _e( 'Pingback:' ); ?> <?php comment_author_link( $comment ); ?> <?php edit_comment_link( __( 'Edit' ), '<span class="edit-link">', '</span>' ); ?> + </div> + <?php + } + + /** + * Filters the comment text. + * + * Removes links from the pending comment's text if the commenter did not consent + * to the comment cookies. + * + * @since 5.4.2 + * + * @param string $comment_text Text of the current comment. + * @param WP_Comment|null $comment The comment object. Null if not found. + * @return string Filtered text of the current comment. + */ + public function filter_comment_text( $comment_text, $comment ) { + $commenter = wp_get_current_commenter(); + $show_pending_links = ! empty( $commenter['comment_author'] ); + + if ( $comment && '0' == $comment->comment_approved && ! $show_pending_links ) { + $comment_text = wp_kses( $comment_text, array() ); + } + + return $comment_text; + } + + /** + * Outputs a single comment. + * + * @since 3.6.0 + * + * @see wp_list_comments() + * + * @param WP_Comment $comment Comment to display. + * @param int $depth Depth of the current comment. + * @param array $args An array of arguments. + */ + protected function comment( $comment, $depth, $args ) { + if ( 'div' == $args['style'] ) { + $tag = 'div'; + $add_below = 'comment'; + } else { + $tag = 'li'; + $add_below = 'div-comment'; + } + + $commenter = wp_get_current_commenter(); + $show_pending_links = isset( $commenter['comment_author'] ) && $commenter['comment_author']; + + if ( $commenter['comment_author_email'] ) { + $moderation_note = __( 'Your comment is awaiting moderation.' ); + } else { + $moderation_note = __( 'Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.' ); + } + ?> + <<?php echo $tag; ?> <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?> id="comment-<?php comment_ID(); ?>"> + <?php if ( 'div' != $args['style'] ) : ?> + <div id="div-comment-<?php comment_ID(); ?>" class="comment-body"> + <?php endif; ?> + <div class="comment-author vcard"> + <?php + if ( 0 != $args['avatar_size'] ) { + echo get_avatar( $comment, $args['avatar_size'] ); + } + ?> + <?php + $comment_author = get_comment_author_link( $comment ); + + if ( '0' == $comment->comment_approved && ! $show_pending_links ) { + $comment_author = get_comment_author( $comment ); + } + + printf( + /* translators: %s: Comment author link. */ + __( '%s <span class="says">says:</span>' ), + sprintf( '<cite class="fn">%s</cite>', $comment_author ) + ); + ?> + </div> + <?php if ( '0' == $comment->comment_approved ) : ?> + <em class="comment-awaiting-moderation"><?php echo $moderation_note; ?></em> + <br /> + <?php endif; ?> + + <div class="comment-meta commentmetadata"><a href="<?php echo esc_url( get_comment_link( $comment, $args ) ); ?>"> + <?php + /* translators: 1: Comment date, 2: Comment time. */ + printf( __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() ); + ?> + </a> + <?php + edit_comment_link( __( '(Edit)' ), '  ', '' ); + ?> + </div> + + <?php + comment_text( + $comment, + array_merge( + $args, + array( + 'add_below' => $add_below, + 'depth' => $depth, + 'max_depth' => $args['max_depth'], + ) + ) + ); + ?> + + <?php + comment_reply_link( + array_merge( + $args, + array( + 'add_below' => $add_below, + 'depth' => $depth, + 'max_depth' => $args['max_depth'], + 'before' => '<div class="reply">', + 'after' => '</div>', + ) + ) + ); + ?> + + <?php if ( 'div' != $args['style'] ) : ?> + </div> + <?php endif; ?> + <?php + } + + /** + * Outputs a comment in the HTML5 format. + * + * @since 3.6.0 + * + * @see wp_list_comments() + * + * @param WP_Comment $comment Comment to display. + * @param int $depth Depth of the current comment. + * @param array $args An array of arguments. + */ + protected function html5_comment( $comment, $depth, $args ) { + $tag = ( 'div' === $args['style'] ) ? 'div' : 'li'; + + $commenter = wp_get_current_commenter(); + $show_pending_links = ! empty( $commenter['comment_author'] ); + + if ( $commenter['comment_author_email'] ) { + $moderation_note = __( 'Your comment is awaiting moderation.' ); + } else { + $moderation_note = __( 'Your comment is awaiting moderation. This is a preview, your comment will be visible after it has been approved.' ); + } + ?> + <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?>> + <article id="div-comment-<?php comment_ID(); ?>" class="comment-body"> + <footer class="comment-meta"> + <div class="comment-author vcard"> + <?php + if ( 0 != $args['avatar_size'] ) { + echo get_avatar( $comment, $args['avatar_size'] ); + } + ?> + <?php + $comment_author = get_comment_author_link( $comment ); + + if ( '0' == $comment->comment_approved && ! $show_pending_links ) { + $comment_author = get_comment_author( $comment ); + } + + printf( + /* translators: %s: Comment author link. */ + __( '%s <span class="says">says:</span>' ), + sprintf( '<b class="fn">%s</b>', $comment_author ) + ); + ?> + </div><!-- .comment-author --> + + <div class="comment-metadata"> + <a href="<?php echo esc_url( get_comment_link( $comment, $args ) ); ?>"> + <time datetime="<?php comment_time( 'c' ); ?>"> + <?php + /* translators: 1: Comment date, 2: Comment time. */ + printf( __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() ); + ?> + </time> + </a> + <?php edit_comment_link( __( 'Edit' ), '<span class="edit-link">', '</span>' ); ?> + </div><!-- .comment-metadata --> + + <?php if ( '0' == $comment->comment_approved ) : ?> + <em class="comment-awaiting-moderation"><?php echo $moderation_note; ?></em> + <?php endif; ?> + </footer><!-- .comment-meta --> + + <div class="comment-content"> + <?php comment_text(); ?> + </div><!-- .comment-content --> + + <?php + if ( '1' == $comment->comment_approved || $show_pending_links ) { + comment_reply_link( + array_merge( + $args, + array( + 'add_below' => 'div-comment', + 'depth' => $depth, + 'max_depth' => $args['max_depth'], + 'before' => '<div class="reply">', + 'after' => '</div>', + ) + ) + ); + } + ?> + </article><!-- .comment-body --> + <?php + } +} diff --git a/wp-includes/class-walker-nav-menu.php b/wp-includes/class-walker-nav-menu.php new file mode 100644 index 0000000..5f4a536 --- /dev/null +++ b/wp-includes/class-walker-nav-menu.php @@ -0,0 +1,273 @@ +<?php +/** + * Nav Menu API: Walker_Nav_Menu class + * + * @package WordPress + * @subpackage Nav_Menus + * @since 4.6.0 + */ + +/** + * Core class used to implement an HTML list of nav menu items. + * + * @since 3.0.0 + * + * @see Walker + */ +class Walker_Nav_Menu extends Walker { + /** + * What the class handles. + * + * @since 3.0.0 + * @var string + * + * @see Walker::$tree_type + */ + public $tree_type = array( 'post_type', 'taxonomy', 'custom' ); + + /** + * Database fields to use. + * + * @since 3.0.0 + * @todo Decouple this. + * @var array + * + * @see Walker::$db_fields + */ + public $db_fields = array( + 'parent' => 'menu_item_parent', + 'id' => 'db_id', + ); + + /** + * Starts the list before the elements are added. + * + * @since 3.0.0 + * + * @see Walker::start_lvl() + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of menu item. Used for padding. + * @param stdClass $args An object of wp_nav_menu() arguments. + */ + public function start_lvl( &$output, $depth = 0, $args = null ) { + if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { + $t = ''; + $n = ''; + } else { + $t = "\t"; + $n = "\n"; + } + $indent = str_repeat( $t, $depth ); + + // Default class. + $classes = array( 'sub-menu' ); + + /** + * Filters the CSS class(es) applied to a menu list element. + * + * @since 4.8.0 + * + * @param string[] $classes Array of the CSS classes that are applied to the menu `<ul>` element. + * @param stdClass $args An object of `wp_nav_menu()` arguments. + * @param int $depth Depth of menu item. Used for padding. + */ + $class_names = join( ' ', apply_filters( 'nav_menu_submenu_css_class', $classes, $args, $depth ) ); + $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; + + $output .= "{$n}{$indent}<ul$class_names>{$n}"; + } + + /** + * Ends the list of after the elements are added. + * + * @since 3.0.0 + * + * @see Walker::end_lvl() + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of menu item. Used for padding. + * @param stdClass $args An object of wp_nav_menu() arguments. + */ + public function end_lvl( &$output, $depth = 0, $args = null ) { + if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { + $t = ''; + $n = ''; + } else { + $t = "\t"; + $n = "\n"; + } + $indent = str_repeat( $t, $depth ); + $output .= "$indent</ul>{$n}"; + } + + /** + * Starts the element output. + * + * @since 3.0.0 + * @since 4.4.0 The {@see 'nav_menu_item_args'} filter was added. + * + * @see Walker::start_el() + * + * @param string $output Used to append additional content (passed by reference). + * @param WP_Post $item Menu item data object. + * @param int $depth Depth of menu item. Used for padding. + * @param stdClass $args An object of wp_nav_menu() arguments. + * @param int $id Current item ID. + */ + public function start_el( &$output, $item, $depth = 0, $args = null, $id = 0 ) { + if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { + $t = ''; + $n = ''; + } else { + $t = "\t"; + $n = "\n"; + } + $indent = ( $depth ) ? str_repeat( $t, $depth ) : ''; + + $classes = empty( $item->classes ) ? array() : (array) $item->classes; + $classes[] = 'menu-item-' . $item->ID; + + /** + * Filters the arguments for a single nav menu item. + * + * @since 4.4.0 + * + * @param stdClass $args An object of wp_nav_menu() arguments. + * @param WP_Post $item Menu item data object. + * @param int $depth Depth of menu item. Used for padding. + */ + $args = apply_filters( 'nav_menu_item_args', $args, $item, $depth ); + + /** + * Filters the CSS classes applied to a menu item's list item element. + * + * @since 3.0.0 + * @since 4.1.0 The `$depth` parameter was added. + * + * @param string[] $classes Array of the CSS classes that are applied to the menu item's `<li>` element. + * @param WP_Post $item The current menu item. + * @param stdClass $args An object of wp_nav_menu() arguments. + * @param int $depth Depth of menu item. Used for padding. + */ + $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) ); + $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; + + /** + * Filters the ID applied to a menu item's list item element. + * + * @since 3.0.1 + * @since 4.1.0 The `$depth` parameter was added. + * + * @param string $menu_id The ID that is applied to the menu item's `<li>` element. + * @param WP_Post $item The current menu item. + * @param stdClass $args An object of wp_nav_menu() arguments. + * @param int $depth Depth of menu item. Used for padding. + */ + $id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $item->ID, $item, $args, $depth ); + $id = $id ? ' id="' . esc_attr( $id ) . '"' : ''; + + $output .= $indent . '<li' . $id . $class_names . '>'; + + $atts = array(); + $atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : ''; + $atts['target'] = ! empty( $item->target ) ? $item->target : ''; + if ( '_blank' === $item->target && empty( $item->xfn ) ) { + $atts['rel'] = 'noopener noreferrer'; + } else { + $atts['rel'] = $item->xfn; + } + $atts['href'] = ! empty( $item->url ) ? $item->url : ''; + $atts['aria-current'] = $item->current ? 'page' : ''; + + /** + * Filters the HTML attributes applied to a menu item's anchor element. + * + * @since 3.6.0 + * @since 4.1.0 The `$depth` parameter was added. + * + * @param array $atts { + * The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored. + * + * @type string $title Title attribute. + * @type string $target Target attribute. + * @type string $rel The rel attribute. + * @type string $href The href attribute. + * @type string $aria_current The aria-current attribute. + * } + * @param WP_Post $item The current menu item. + * @param stdClass $args An object of wp_nav_menu() arguments. + * @param int $depth Depth of menu item. Used for padding. + */ + $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth ); + + $attributes = ''; + foreach ( $atts as $attr => $value ) { + if ( is_scalar( $value ) && '' !== $value && false !== $value ) { + $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); + $attributes .= ' ' . $attr . '="' . $value . '"'; + } + } + + /** This filter is documented in wp-includes/post-template.php */ + $title = apply_filters( 'the_title', $item->title, $item->ID ); + + /** + * Filters a menu item's title. + * + * @since 4.4.0 + * + * @param string $title The menu item's title. + * @param WP_Post $item The current menu item. + * @param stdClass $args An object of wp_nav_menu() arguments. + * @param int $depth Depth of menu item. Used for padding. + */ + $title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth ); + + $item_output = $args->before; + $item_output .= '<a' . $attributes . '>'; + $item_output .= $args->link_before . $title . $args->link_after; + $item_output .= '</a>'; + $item_output .= $args->after; + + /** + * Filters a menu item's starting output. + * + * The menu item's starting output only includes `$args->before`, the opening `<a>`, + * the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is + * no filter for modifying the opening and closing `<li>` for a menu item. + * + * @since 3.0.0 + * + * @param string $item_output The menu item's starting HTML output. + * @param WP_Post $item Menu item data object. + * @param int $depth Depth of menu item. Used for padding. + * @param stdClass $args An object of wp_nav_menu() arguments. + */ + $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); + } + + /** + * Ends the element output, if needed. + * + * @since 3.0.0 + * + * @see Walker::end_el() + * + * @param string $output Used to append additional content (passed by reference). + * @param WP_Post $item Page data object. Not used. + * @param int $depth Depth of page. Not Used. + * @param stdClass $args An object of wp_nav_menu() arguments. + */ + public function end_el( &$output, $item, $depth = 0, $args = null ) { + if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { + $t = ''; + $n = ''; + } else { + $t = "\t"; + $n = "\n"; + } + $output .= "</li>{$n}"; + } + +} diff --git a/wp-includes/class-walker-page-dropdown.php b/wp-includes/class-walker-page-dropdown.php new file mode 100644 index 0000000..1e3a2fd --- /dev/null +++ b/wp-includes/class-walker-page-dropdown.php @@ -0,0 +1,91 @@ +<?php +/** + * Post API: Walker_PageDropdown class + * + * @package WordPress + * @subpackage Post + * @since 4.4.0 + */ + +/** + * Core class used to create an HTML drop-down list of pages. + * + * @since 2.1.0 + * + * @see Walker + */ +class Walker_PageDropdown extends Walker { + + /** + * What the class handles. + * + * @since 2.1.0 + * @var string + * + * @see Walker::$tree_type + */ + public $tree_type = 'page'; + + /** + * Database fields to use. + * + * @since 2.1.0 + * @var array + * + * @see Walker::$db_fields + * @todo Decouple this + */ + public $db_fields = array( + 'parent' => 'post_parent', + 'id' => 'ID', + ); + + /** + * Starts the element output. + * + * @since 2.1.0 + * + * @see Walker::start_el() + * + * @param string $output Used to append additional content. Passed by reference. + * @param WP_Post $page Page data object. + * @param int $depth Optional. Depth of page in reference to parent pages. Used for padding. + * Default 0. + * @param array $args Optional. Uses 'selected' argument for selected page to set selected HTML + * attribute for option element. Uses 'value_field' argument to fill "value" + * attribute. See wp_dropdown_pages(). Default empty array. + * @param int $id Optional. ID of the current page. Default 0 (unused). + */ + public function start_el( &$output, $page, $depth = 0, $args = array(), $id = 0 ) { + $pad = str_repeat( ' ', $depth * 3 ); + + if ( ! isset( $args['value_field'] ) || ! isset( $page->{$args['value_field']} ) ) { + $args['value_field'] = 'ID'; + } + + $output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $page->{$args['value_field']} ) . '"'; + if ( $page->ID == $args['selected'] ) { + $output .= ' selected="selected"'; + } + $output .= '>'; + + $title = $page->post_title; + if ( '' === $title ) { + /* translators: %d: ID of a post. */ + $title = sprintf( __( '#%d (no title)' ), $page->ID ); + } + + /** + * Filters the page title when creating an HTML drop-down list of pages. + * + * @since 3.1.0 + * + * @param string $title Page title. + * @param WP_Post $page Page data object. + */ + $title = apply_filters( 'list_pages', $title, $page ); + + $output .= $pad . esc_html( $title ); + $output .= "</option>\n"; + } +} diff --git a/wp-includes/class-walker-page.php b/wp-includes/class-walker-page.php new file mode 100644 index 0000000..0b77c42 --- /dev/null +++ b/wp-includes/class-walker-page.php @@ -0,0 +1,236 @@ +<?php +/** + * Post API: Walker_Page class + * + * @package WordPress + * @subpackage Template + * @since 4.4.0 + */ + +/** + * Core walker class used to create an HTML list of pages. + * + * @since 2.1.0 + * + * @see Walker + */ +class Walker_Page extends Walker { + + /** + * What the class handles. + * + * @since 2.1.0 + * @var string + * + * @see Walker::$tree_type + */ + public $tree_type = 'page'; + + /** + * Database fields to use. + * + * @since 2.1.0 + * @var array + * + * @see Walker::$db_fields + * @todo Decouple this. + */ + public $db_fields = array( + 'parent' => 'post_parent', + 'id' => 'ID', + ); + + /** + * Outputs the beginning of the current level in the tree before elements are output. + * + * @since 2.1.0 + * + * @see Walker::start_lvl() + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Optional. Depth of page. Used for padding. Default 0. + * @param array $args Optional. Arguments for outputting the next level. + * Default empty array. + */ + public function start_lvl( &$output, $depth = 0, $args = array() ) { + if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { + $t = "\t"; + $n = "\n"; + } else { + $t = ''; + $n = ''; + } + $indent = str_repeat( $t, $depth ); + $output .= "{$n}{$indent}<ul class='children'>{$n}"; + } + + /** + * Outputs the end of the current level in the tree after elements are output. + * + * @since 2.1.0 + * + * @see Walker::end_lvl() + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Optional. Depth of page. Used for padding. Default 0. + * @param array $args Optional. Arguments for outputting the end of the current level. + * Default empty array. + */ + public function end_lvl( &$output, $depth = 0, $args = array() ) { + if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { + $t = "\t"; + $n = "\n"; + } else { + $t = ''; + $n = ''; + } + $indent = str_repeat( $t, $depth ); + $output .= "{$indent}</ul>{$n}"; + } + + /** + * Outputs the beginning of the current element in the tree. + * + * @see Walker::start_el() + * @since 2.1.0 + * + * @param string $output Used to append additional content. Passed by reference. + * @param WP_Post $page Page data object. + * @param int $depth Optional. Depth of page. Used for padding. Default 0. + * @param array $args Optional. Array of arguments. Default empty array. + * @param int $current_page Optional. Page ID. Default 0. + */ + public function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) { + if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { + $t = "\t"; + $n = "\n"; + } else { + $t = ''; + $n = ''; + } + if ( $depth ) { + $indent = str_repeat( $t, $depth ); + } else { + $indent = ''; + } + + $css_class = array( 'page_item', 'page-item-' . $page->ID ); + + if ( isset( $args['pages_with_children'][ $page->ID ] ) ) { + $css_class[] = 'page_item_has_children'; + } + + if ( ! empty( $current_page ) ) { + $_current_page = get_post( $current_page ); + if ( $_current_page && in_array( $page->ID, $_current_page->ancestors ) ) { + $css_class[] = 'current_page_ancestor'; + } + if ( $page->ID == $current_page ) { + $css_class[] = 'current_page_item'; + } elseif ( $_current_page && $page->ID == $_current_page->post_parent ) { + $css_class[] = 'current_page_parent'; + } + } elseif ( get_option( 'page_for_posts' ) == $page->ID ) { + $css_class[] = 'current_page_parent'; + } + + /** + * Filters the list of CSS classes to include with each page item in the list. + * + * @since 2.8.0 + * + * @see wp_list_pages() + * + * @param string[] $css_class An array of CSS classes to be applied to each list item. + * @param WP_Post $page Page data object. + * @param int $depth Depth of page, used for padding. + * @param array $args An array of arguments. + * @param int $current_page ID of the current page. + */ + $css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) ); + $css_classes = $css_classes ? ' class="' . esc_attr( $css_classes ) . '"' : ''; + + if ( '' === $page->post_title ) { + /* translators: %d: ID of a post. */ + $page->post_title = sprintf( __( '#%d (no title)' ), $page->ID ); + } + + $args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before']; + $args['link_after'] = empty( $args['link_after'] ) ? '' : $args['link_after']; + + $atts = array(); + $atts['href'] = get_permalink( $page->ID ); + $atts['aria-current'] = ( $page->ID == $current_page ) ? 'page' : ''; + + /** + * Filters the HTML attributes applied to a page menu item's anchor element. + * + * @since 4.8.0 + * + * @param array $atts { + * The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored. + * + * @type string $href The href attribute. + * @type string $aria_current The aria-current attribute. + * } + * @param WP_Post $page Page data object. + * @param int $depth Depth of page, used for padding. + * @param array $args An array of arguments. + * @param int $current_page ID of the current page. + */ + $atts = apply_filters( 'page_menu_link_attributes', $atts, $page, $depth, $args, $current_page ); + + $attributes = ''; + foreach ( $atts as $attr => $value ) { + if ( is_scalar( $value ) && '' !== $value && false !== $value ) { + $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); + $attributes .= ' ' . $attr . '="' . $value . '"'; + } + } + + $output .= $indent . sprintf( + '<li%s><a%s>%s%s%s</a>', + $css_classes, + $attributes, + $args['link_before'], + /** This filter is documented in wp-includes/post-template.php */ + apply_filters( 'the_title', $page->post_title, $page->ID ), + $args['link_after'] + ); + + if ( ! empty( $args['show_date'] ) ) { + if ( 'modified' == $args['show_date'] ) { + $time = $page->post_modified; + } else { + $time = $page->post_date; + } + + $date_format = empty( $args['date_format'] ) ? '' : $args['date_format']; + $output .= ' ' . mysql2date( $date_format, $time ); + } + } + + /** + * Outputs the end of the current element in the tree. + * + * @since 2.1.0 + * + * @see Walker::end_el() + * + * @param string $output Used to append additional content. Passed by reference. + * @param WP_Post $page Page data object. Not used. + * @param int $depth Optional. Depth of page. Default 0 (unused). + * @param array $args Optional. Array of arguments. Default empty array. + */ + public function end_el( &$output, $page, $depth = 0, $args = array() ) { + if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { + $t = "\t"; + $n = "\n"; + } else { + $t = ''; + $n = ''; + } + $output .= "</li>{$n}"; + } + +} diff --git a/wp-includes/class-wp-admin-bar.php b/wp-includes/class-wp-admin-bar.php new file mode 100644 index 0000000..063aa32 --- /dev/null +++ b/wp-includes/class-wp-admin-bar.php @@ -0,0 +1,640 @@ +<?php +/** + * Toolbar API: WP_Admin_Bar class + * + * @package WordPress + * @subpackage Toolbar + * @since 3.1.0 + */ + +/** + * Core class used to implement the Toolbar API. + * + * @since 3.1.0 + */ +class WP_Admin_Bar { + private $nodes = array(); + private $bound = false; + public $user; + + /** + * @param string $name + * @return string|array|void + */ + public function __get( $name ) { + switch ( $name ) { + case 'proto': + return is_ssl() ? 'https://' : 'http://'; + + case 'menu': + _deprecated_argument( 'WP_Admin_Bar', '3.3.0', 'Modify admin bar nodes with WP_Admin_Bar::get_node(), WP_Admin_Bar::add_node(), and WP_Admin_Bar::remove_node(), not the <code>menu</code> property.' ); + return array(); // Sorry, folks. + } + } + + /** + */ + public function initialize() { + $this->user = new stdClass; + + if ( is_user_logged_in() ) { + /* Populate settings we need for the menu based on the current user. */ + $this->user->blogs = get_blogs_of_user( get_current_user_id() ); + if ( is_multisite() ) { + $this->user->active_blog = get_active_blog_for_user( get_current_user_id() ); + $this->user->domain = empty( $this->user->active_blog ) ? user_admin_url() : trailingslashit( get_home_url( $this->user->active_blog->blog_id ) ); + $this->user->account_domain = $this->user->domain; + } else { + $this->user->active_blog = $this->user->blogs[ get_current_blog_id() ]; + $this->user->domain = trailingslashit( home_url() ); + $this->user->account_domain = $this->user->domain; + } + } + + add_action( 'wp_head', 'wp_admin_bar_header' ); + + add_action( 'admin_head', 'wp_admin_bar_header' ); + + if ( current_theme_supports( 'admin-bar' ) ) { + /** + * To remove the default padding styles from WordPress for the Toolbar, use the following code: + * add_theme_support( 'admin-bar', array( 'callback' => '__return_false' ) ); + */ + $admin_bar_args = get_theme_support( 'admin-bar' ); + $header_callback = $admin_bar_args[0]['callback']; + } + + if ( empty( $header_callback ) ) { + $header_callback = '_admin_bar_bump_cb'; + } + + add_action( 'wp_head', $header_callback ); + + wp_enqueue_script( 'admin-bar' ); + wp_enqueue_style( 'admin-bar' ); + + /** + * Fires after WP_Admin_Bar is initialized. + * + * @since 3.1.0 + */ + do_action( 'admin_bar_init' ); + } + + /** + * Add a node (menu item) to the Admin Bar menu. + * + * @since 3.3.0 + * + * @param array $node The attributes that define the node. + */ + public function add_menu( $node ) { + $this->add_node( $node ); + } + + /** + * Remove a node from the admin bar. + * + * @since 3.1.0 + * + * @param string $id The menu slug to remove. + */ + public function remove_menu( $id ) { + $this->remove_node( $id ); + } + + /** + * Adds a node to the menu. + * + * @since 3.1.0 + * @since 4.5.0 Added the ability to pass 'lang' and 'dir' meta data. + * + * @param array $args { + * Arguments for adding a node. + * + * @type string $id ID of the item. + * @type string $title Title of the node. + * @type string $parent Optional. ID of the parent node. + * @type string $href Optional. Link for the item. + * @type bool $group Optional. Whether or not the node is a group. Default false. + * @type array $meta Meta data including the following keys: 'html', 'class', 'rel', 'lang', 'dir', + * 'onclick', 'target', 'title', 'tabindex'. Default empty. + * } + */ + public function add_node( $args ) { + // Shim for old method signature: add_node( $parent_id, $menu_obj, $args ). + if ( func_num_args() >= 3 && is_string( $args ) ) { + $args = array_merge( array( 'parent' => $args ), func_get_arg( 2 ) ); + } + + if ( is_object( $args ) ) { + $args = get_object_vars( $args ); + } + + // Ensure we have a valid title. + if ( empty( $args['id'] ) ) { + if ( empty( $args['title'] ) ) { + return; + } + + _doing_it_wrong( __METHOD__, __( 'The menu ID should not be empty.' ), '3.3.0' ); + // Deprecated: Generate an ID from the title. + $args['id'] = esc_attr( sanitize_title( trim( $args['title'] ) ) ); + } + + $defaults = array( + 'id' => false, + 'title' => false, + 'parent' => false, + 'href' => false, + 'group' => false, + 'meta' => array(), + ); + + // If the node already exists, keep any data that isn't provided. + $maybe_defaults = $this->get_node( $args['id'] ); + if ( $maybe_defaults ) { + $defaults = get_object_vars( $maybe_defaults ); + } + + // Do the same for 'meta' items. + if ( ! empty( $defaults['meta'] ) && ! empty( $args['meta'] ) ) { + $args['meta'] = wp_parse_args( $args['meta'], $defaults['meta'] ); + } + + $args = wp_parse_args( $args, $defaults ); + + $back_compat_parents = array( + 'my-account-with-avatar' => array( 'my-account', '3.3' ), + 'my-blogs' => array( 'my-sites', '3.3' ), + ); + + if ( isset( $back_compat_parents[ $args['parent'] ] ) ) { + list( $new_parent, $version ) = $back_compat_parents[ $args['parent'] ]; + _deprecated_argument( __METHOD__, $version, sprintf( 'Use <code>%s</code> as the parent for the <code>%s</code> admin bar node instead of <code>%s</code>.', $new_parent, $args['id'], $args['parent'] ) ); + $args['parent'] = $new_parent; + } + + $this->_set_node( $args ); + } + + /** + * @param array $args + */ + final protected function _set_node( $args ) { + $this->nodes[ $args['id'] ] = (object) $args; + } + + /** + * Gets a node. + * + * @param string $id + * @return object|void Node. + */ + final public function get_node( $id ) { + $node = $this->_get_node( $id ); + if ( $node ) { + return clone $node; + } + } + + /** + * @param string $id + * @return object|void + */ + final protected function _get_node( $id ) { + if ( $this->bound ) { + return; + } + + if ( empty( $id ) ) { + $id = 'root'; + } + + if ( isset( $this->nodes[ $id ] ) ) { + return $this->nodes[ $id ]; + } + } + + /** + * @return array|void + */ + final public function get_nodes() { + $nodes = $this->_get_nodes(); + if ( ! $nodes ) { + return; + } + + foreach ( $nodes as &$node ) { + $node = clone $node; + } + return $nodes; + } + + /** + * @return array|void + */ + final protected function _get_nodes() { + if ( $this->bound ) { + return; + } + + return $this->nodes; + } + + /** + * Add a group to a menu node. + * + * @since 3.3.0 + * + * @param array $args { + * Array of arguments for adding a group. + * + * @type string $id ID of the item. + * @type string $parent Optional. ID of the parent node. Default 'root'. + * @type array $meta Meta data for the group including the following keys: + * 'class', 'onclick', 'target', and 'title'. + * } + */ + final public function add_group( $args ) { + $args['group'] = true; + + $this->add_node( $args ); + } + + /** + * Remove a node. + * + * @param string $id The ID of the item. + */ + public function remove_node( $id ) { + $this->_unset_node( $id ); + } + + /** + * @param string $id + */ + final protected function _unset_node( $id ) { + unset( $this->nodes[ $id ] ); + } + + /** + */ + public function render() { + $root = $this->_bind(); + if ( $root ) { + $this->_render( $root ); + } + } + + /** + * @return object|void + */ + final protected function _bind() { + if ( $this->bound ) { + return; + } + + // Add the root node. + // Clear it first, just in case. Don't mess with The Root. + $this->remove_node( 'root' ); + $this->add_node( + array( + 'id' => 'root', + 'group' => false, + ) + ); + + // Normalize nodes: define internal 'children' and 'type' properties. + foreach ( $this->_get_nodes() as $node ) { + $node->children = array(); + $node->type = ( $node->group ) ? 'group' : 'item'; + unset( $node->group ); + + // The Root wants your orphans. No lonely items allowed. + if ( ! $node->parent ) { + $node->parent = 'root'; + } + } + + foreach ( $this->_get_nodes() as $node ) { + if ( 'root' === $node->id ) { + continue; + } + + // Fetch the parent node. If it isn't registered, ignore the node. + $parent = $this->_get_node( $node->parent ); + if ( ! $parent ) { + continue; + } + + // Generate the group class (we distinguish between top level and other level groups). + $group_class = ( 'root' === $node->parent ) ? 'ab-top-menu' : 'ab-submenu'; + + if ( 'group' === $node->type ) { + if ( empty( $node->meta['class'] ) ) { + $node->meta['class'] = $group_class; + } else { + $node->meta['class'] .= ' ' . $group_class; + } + } + + // Items in items aren't allowed. Wrap nested items in 'default' groups. + if ( 'item' === $parent->type && 'item' === $node->type ) { + $default_id = $parent->id . '-default'; + $default = $this->_get_node( $default_id ); + + // The default group is added here to allow groups that are + // added before standard menu items to render first. + if ( ! $default ) { + // Use _set_node because add_node can be overloaded. + // Make sure to specify default settings for all properties. + $this->_set_node( + array( + 'id' => $default_id, + 'parent' => $parent->id, + 'type' => 'group', + 'children' => array(), + 'meta' => array( + 'class' => $group_class, + ), + 'title' => false, + 'href' => false, + ) + ); + $default = $this->_get_node( $default_id ); + $parent->children[] = $default; + } + $parent = $default; + + // Groups in groups aren't allowed. Add a special 'container' node. + // The container will invisibly wrap both groups. + } elseif ( 'group' === $parent->type && 'group' === $node->type ) { + $container_id = $parent->id . '-container'; + $container = $this->_get_node( $container_id ); + + // We need to create a container for this group, life is sad. + if ( ! $container ) { + // Use _set_node because add_node can be overloaded. + // Make sure to specify default settings for all properties. + $this->_set_node( + array( + 'id' => $container_id, + 'type' => 'container', + 'children' => array( $parent ), + 'parent' => false, + 'title' => false, + 'href' => false, + 'meta' => array(), + ) + ); + + $container = $this->_get_node( $container_id ); + + // Link the container node if a grandparent node exists. + $grandparent = $this->_get_node( $parent->parent ); + + if ( $grandparent ) { + $container->parent = $grandparent->id; + + $index = array_search( $parent, $grandparent->children, true ); + if ( false === $index ) { + $grandparent->children[] = $container; + } else { + array_splice( $grandparent->children, $index, 1, array( $container ) ); + } + } + + $parent->parent = $container->id; + } + + $parent = $container; + } + + // Update the parent ID (it might have changed). + $node->parent = $parent->id; + + // Add the node to the tree. + $parent->children[] = $node; + } + + $root = $this->_get_node( 'root' ); + $this->bound = true; + return $root; + } + + /** + * @global bool $is_IE + * @param object $root + */ + final protected function _render( $root ) { + global $is_IE; + + // Add browser classes. + // We have to do this here since admin bar shows on the front end. + $class = 'nojq nojs'; + if ( $is_IE ) { + if ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 7' ) ) { + $class .= ' ie7'; + } elseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 8' ) ) { + $class .= ' ie8'; + } elseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 9' ) ) { + $class .= ' ie9'; + } + } elseif ( wp_is_mobile() ) { + $class .= ' mobile'; + } + + ?> + <div id="wpadminbar" class="<?php echo $class; ?>"> + <?php if ( ! is_admin() ) { ?> + <a class="screen-reader-shortcut" href="#wp-toolbar" tabindex="1"><?php _e( 'Skip to toolbar' ); ?></a> + <?php } ?> + <div class="quicklinks" id="wp-toolbar" role="navigation" aria-label="<?php esc_attr_e( 'Toolbar' ); ?>"> + <?php + foreach ( $root->children as $group ) { + $this->_render_group( $group ); + } + ?> + </div> + <?php if ( is_user_logged_in() ) : ?> + <a class="screen-reader-shortcut" href="<?php echo esc_url( wp_logout_url() ); ?>"><?php _e( 'Log Out' ); ?></a> + <?php endif; ?> + </div> + + <?php + } + + /** + * @param object $node + */ + final protected function _render_container( $node ) { + if ( 'container' !== $node->type || empty( $node->children ) ) { + return; + } + + echo '<div id="' . esc_attr( 'wp-admin-bar-' . $node->id ) . '" class="ab-group-container">'; + foreach ( $node->children as $group ) { + $this->_render_group( $group ); + } + echo '</div>'; + } + + /** + * @param object $node + */ + final protected function _render_group( $node ) { + if ( 'container' === $node->type ) { + $this->_render_container( $node ); + return; + } + if ( 'group' !== $node->type || empty( $node->children ) ) { + return; + } + + if ( ! empty( $node->meta['class'] ) ) { + $class = ' class="' . esc_attr( trim( $node->meta['class'] ) ) . '"'; + } else { + $class = ''; + } + + echo "<ul id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$class>"; + foreach ( $node->children as $item ) { + $this->_render_item( $item ); + } + echo '</ul>'; + } + + /** + * @param object $node + */ + final protected function _render_item( $node ) { + if ( 'item' !== $node->type ) { + return; + } + + $is_parent = ! empty( $node->children ); + $has_link = ! empty( $node->href ); + $is_root_top_item = 'root-default' === $node->parent; + $is_top_secondary_item = 'top-secondary' === $node->parent; + + // Allow only numeric values, then casted to integers, and allow a tabindex value of `0` for a11y. + $tabindex = ( isset( $node->meta['tabindex'] ) && is_numeric( $node->meta['tabindex'] ) ) ? (int) $node->meta['tabindex'] : ''; + $aria_attributes = ( '' !== $tabindex ) ? ' tabindex="' . $tabindex . '"' : ''; + + $menuclass = ''; + $arrow = ''; + + if ( $is_parent ) { + $menuclass = 'menupop '; + $aria_attributes .= ' aria-haspopup="true"'; + } + + if ( ! empty( $node->meta['class'] ) ) { + $menuclass .= $node->meta['class']; + } + + // Print the arrow icon for the menu children with children. + if ( ! $is_root_top_item && ! $is_top_secondary_item && $is_parent ) { + $arrow = '<span class="wp-admin-bar-arrow" aria-hidden="true"></span>'; + } + + if ( $menuclass ) { + $menuclass = ' class="' . esc_attr( trim( $menuclass ) ) . '"'; + } + + echo "<li id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$menuclass>"; + + if ( $has_link ) { + $attributes = array( 'onclick', 'target', 'title', 'rel', 'lang', 'dir' ); + echo "<a class='ab-item'$aria_attributes href='" . esc_url( $node->href ) . "'"; + } else { + $attributes = array( 'onclick', 'target', 'title', 'rel', 'lang', 'dir' ); + echo '<div class="ab-item ab-empty-item"' . $aria_attributes; + } + + foreach ( $attributes as $attribute ) { + if ( empty( $node->meta[ $attribute ] ) ) { + continue; + } + + if ( 'onclick' === $attribute ) { + echo " $attribute='" . esc_js( $node->meta[ $attribute ] ) . "'"; + } else { + echo " $attribute='" . esc_attr( $node->meta[ $attribute ] ) . "'"; + } + } + + echo ">{$arrow}{$node->title}"; + + if ( $has_link ) { + echo '</a>'; + } else { + echo '</div>'; + } + + if ( $is_parent ) { + echo '<div class="ab-sub-wrapper">'; + foreach ( $node->children as $group ) { + $this->_render_group( $group ); + } + echo '</div>'; + } + + if ( ! empty( $node->meta['html'] ) ) { + echo $node->meta['html']; + } + + echo '</li>'; + } + + /** + * Renders toolbar items recursively. + * + * @since 3.1.0 + * @deprecated 3.3.0 Use WP_Admin_Bar::_render_item() or WP_Admin_bar::render() instead. + * @see WP_Admin_Bar::_render_item() + * @see WP_Admin_Bar::render() + * + * @param string $id Unused. + * @param object $node + */ + public function recursive_render( $id, $node ) { + _deprecated_function( __METHOD__, '3.3.0', 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' ); + $this->_render_item( $node ); + } + + /** + */ + public function add_menus() { + // User-related, aligned right. + add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_menu', 0 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 4 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_item', 7 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_recovery_mode_menu', 8 ); + + // Site-related. + add_action( 'admin_bar_menu', 'wp_admin_bar_sidebar_toggle', 0 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_my_sites_menu', 20 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_site_menu', 30 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 ); + + // Content-related. + if ( ! is_network_admin() && ! is_user_admin() ) { + add_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_new_content_menu', 70 ); + } + add_action( 'admin_bar_menu', 'wp_admin_bar_edit_menu', 80 ); + + add_action( 'admin_bar_menu', 'wp_admin_bar_add_secondary_groups', 200 ); + + /** + * Fires after menus are added to the menu bar. + * + * @since 3.1.0 + */ + do_action( 'add_admin_bar_menus' ); + } +} diff --git a/wp-includes/class-wp-ajax-response.php b/wp-includes/class-wp-ajax-response.php new file mode 100644 index 0000000..43772d2 --- /dev/null +++ b/wp-includes/class-wp-ajax-response.php @@ -0,0 +1,163 @@ +<?php +/** + * Send XML response back to Ajax request. + * + * @package WordPress + * @since 2.1.0 + */ +class WP_Ajax_Response { + /** + * Store XML responses to send. + * + * @since 2.1.0 + * @var array + */ + public $responses = array(); + + /** + * Constructor - Passes args to WP_Ajax_Response::add(). + * + * @since 2.1.0 + * @see WP_Ajax_Response::add() + * + * @param string|array $args Optional. Will be passed to add() method. + */ + public function __construct( $args = '' ) { + if ( ! empty( $args ) ) { + $this->add( $args ); + } + } + + /** + * Appends data to an XML response based on given arguments. + * + * With `$args` defaults, extra data output would be: + * + * <response action='{$action}_$id'> + * <$what id='$id' position='$position'> + * <response_data><![CDATA[$data]]></response_data> + * </$what> + * </response> + * + * @since 2.1.0 + * + * @param string|array $args { + * Optional. An array or string of XML response arguments. + * + * @type string $what XML-RPC response type. Used as a child element of `<response>`. + * Default 'object' (`<object>`). + * @type string|false $action Value to use for the `action` attribute in `<response>`. Will be + * appended with `_$id` on output. If false, `$action` will default to + * the value of `$_POST['action']`. Default false. + * @type int|WP_Error $id The response ID, used as the response type `id` attribute. Also + * accepts a `WP_Error` object if the ID does not exist. Default 0. + * @type int|false $old_id The previous response ID. Used as the value for the response type + * `old_id` attribute. False hides the attribute. Default false. + * @type string $position Value of the response type `position` attribute. Accepts 1 (bottom), + * -1 (top), html ID (after), or -html ID (before). Default 1 (bottom). + * @type string|WP_Error $data The response content/message. Also accepts a WP_Error object if the + * ID does not exist. Default empty. + * @type array $supplemental An array of extra strings that will be output within a `<supplemental>` + * element as CDATA. Default empty array. + * } + * @return string XML response. + */ + public function add( $args = '' ) { + $defaults = array( + 'what' => 'object', + 'action' => false, + 'id' => '0', + 'old_id' => false, + 'position' => 1, + 'data' => '', + 'supplemental' => array(), + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + $position = preg_replace( '/[^a-z0-9:_-]/i', '', $parsed_args['position'] ); + $id = $parsed_args['id']; + $what = $parsed_args['what']; + $action = $parsed_args['action']; + $old_id = $parsed_args['old_id']; + $data = $parsed_args['data']; + + if ( is_wp_error( $id ) ) { + $data = $id; + $id = 0; + } + + $response = ''; + if ( is_wp_error( $data ) ) { + foreach ( (array) $data->get_error_codes() as $code ) { + $response .= "<wp_error code='$code'><![CDATA[" . $data->get_error_message( $code ) . ']]></wp_error>'; + $error_data = $data->get_error_data( $code ); + if ( ! $error_data ) { + continue; + } + $class = ''; + if ( is_object( $error_data ) ) { + $class = ' class="' . get_class( $error_data ) . '"'; + $error_data = get_object_vars( $error_data ); + } + + $response .= "<wp_error_data code='$code'$class>"; + + if ( is_scalar( $error_data ) ) { + $response .= "<![CDATA[$error_data]]>"; + } elseif ( is_array( $error_data ) ) { + foreach ( $error_data as $k => $v ) { + $response .= "<$k><![CDATA[$v]]></$k>"; + } + } + + $response .= '</wp_error_data>'; + } + } else { + $response = "<response_data><![CDATA[$data]]></response_data>"; + } + + $s = ''; + if ( is_array( $parsed_args['supplemental'] ) ) { + foreach ( $parsed_args['supplemental'] as $k => $v ) { + $s .= "<$k><![CDATA[$v]]></$k>"; + } + $s = "<supplemental>$s</supplemental>"; + } + + if ( false === $action ) { + $action = $_POST['action']; + } + $x = ''; + $x .= "<response action='{$action}_$id'>"; // The action attribute in the xml output is formatted like a nonce action. + $x .= "<$what id='$id' " . ( false === $old_id ? '' : "old_id='$old_id' " ) . "position='$position'>"; + $x .= $response; + $x .= $s; + $x .= "</$what>"; + $x .= '</response>'; + + $this->responses[] = $x; + return $x; + } + + /** + * Display XML formatted responses. + * + * Sets the content type header to text/xml. + * + * @since 2.1.0 + */ + public function send() { + header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) ); + echo "<?xml version='1.0' encoding='" . get_option( 'blog_charset' ) . "' standalone='yes'?><wp_ajax>"; + foreach ( (array) $this->responses as $response ) { + echo $response; + } + echo '</wp_ajax>'; + if ( wp_doing_ajax() ) { + wp_die(); + } else { + die(); + } + } +} diff --git a/wp-includes/class-wp-block-parser.php b/wp-includes/class-wp-block-parser.php new file mode 100644 index 0000000..eb4c21a --- /dev/null +++ b/wp-includes/class-wp-block-parser.php @@ -0,0 +1,555 @@ +<?php +/** + * Block Serialization Parser + * + * @package WordPress + */ + +/** + * Class WP_Block_Parser_Block + * + * Holds the block structure in memory + * + * @since 3.8.0 + */ +class WP_Block_Parser_Block { + /** + * Name of block + * + * @example "core/paragraph" + * + * @since 3.8.0 + * @var string + */ + public $blockName; + + /** + * Optional set of attributes from block comment delimiters + * + * @example null + * @example array( 'columns' => 3 ) + * + * @since 3.8.0 + * @var array|null + */ + public $attrs; + + /** + * List of inner blocks (of this same class) + * + * @since 3.8.0 + * @var WP_Block_Parser_Block[] + */ + public $innerBlocks; + + /** + * Resultant HTML from inside block comment delimiters + * after removing inner blocks + * + * @example "...Just <!-- wp:test /--> testing..." -> "Just testing..." + * + * @since 3.8.0 + * @var string + */ + public $innerHTML; + + /** + * List of string fragments and null markers where inner blocks were found + * + * @example array( + * 'innerHTML' => 'BeforeInnerAfter', + * 'innerBlocks' => array( block, block ), + * 'innerContent' => array( 'Before', null, 'Inner', null, 'After' ), + * ) + * + * @since 4.2.0 + * @var array + */ + public $innerContent; + + /** + * Constructor. + * + * Will populate object properties from the provided arguments. + * + * @since 3.8.0 + * + * @param string $name Name of block. + * @param array $attrs Optional set of attributes from block comment delimiters. + * @param array $innerBlocks List of inner blocks (of this same class). + * @param string $innerHTML Resultant HTML from inside block comment delimiters after removing inner blocks. + * @param array $innerContent List of string fragments and null markers where inner blocks were found. + */ + function __construct( $name, $attrs, $innerBlocks, $innerHTML, $innerContent ) { + $this->blockName = $name; + $this->attrs = $attrs; + $this->innerBlocks = $innerBlocks; + $this->innerHTML = $innerHTML; + $this->innerContent = $innerContent; + } +} + +/** + * Class WP_Block_Parser_Frame + * + * Holds partial blocks in memory while parsing + * + * @internal + * @since 3.8.0 + */ +class WP_Block_Parser_Frame { + /** + * Full or partial block + * + * @since 3.8.0 + * @var WP_Block_Parser_Block + */ + public $block; + + /** + * Byte offset into document for start of parse token + * + * @since 3.8.0 + * @var int + */ + public $token_start; + + /** + * Byte length of entire parse token string + * + * @since 3.8.0 + * @var int + */ + public $token_length; + + /** + * Byte offset into document for after parse token ends + * (used during reconstruction of stack into parse production) + * + * @since 3.8.0 + * @var int + */ + public $prev_offset; + + /** + * Byte offset into document where leading HTML before token starts + * + * @since 3.8.0 + * @var int + */ + public $leading_html_start; + + /** + * Constructor + * + * Will populate object properties from the provided arguments. + * + * @since 3.8.0 + * + * @param WP_Block_Parser_Block $block Full or partial block. + * @param int $token_start Byte offset into document for start of parse token. + * @param int $token_length Byte length of entire parse token string. + * @param int $prev_offset Byte offset into document for after parse token ends. + * @param int $leading_html_start Byte offset into document where leading HTML before token starts. + */ + function __construct( $block, $token_start, $token_length, $prev_offset = null, $leading_html_start = null ) { + $this->block = $block; + $this->token_start = $token_start; + $this->token_length = $token_length; + $this->prev_offset = isset( $prev_offset ) ? $prev_offset : $token_start + $token_length; + $this->leading_html_start = $leading_html_start; + } +} + +/** + * Class WP_Block_Parser + * + * Parses a document and constructs a list of parsed block objects + * + * @since 3.8.0 + * @since 4.0.0 returns arrays not objects, all attributes are arrays + */ +class WP_Block_Parser { + /** + * Input document being parsed + * + * @example "Pre-text\n<!-- wp:paragraph -->This is inside a block!<!-- /wp:paragraph -->" + * + * @since 3.8.0 + * @var string + */ + public $document; + + /** + * Tracks parsing progress through document + * + * @since 3.8.0 + * @var int + */ + public $offset; + + /** + * List of parsed blocks + * + * @since 3.8.0 + * @var WP_Block_Parser_Block[] + */ + public $output; + + /** + * Stack of partially-parsed structures in memory during parse + * + * @since 3.8.0 + * @var WP_Block_Parser_Frame[] + */ + public $stack; + + /** + * Empty associative array, here due to PHP quirks + * + * @since 4.4.0 + * @var array empty associative array + */ + public $empty_attrs; + + /** + * Parses a document and returns a list of block structures + * + * When encountering an invalid parse will return a best-effort + * parse. In contrast to the specification parser this does not + * return an error on invalid inputs. + * + * @since 3.8.0 + * + * @param string $document Input document being parsed. + * @return WP_Block_Parser_Block[] + */ + function parse( $document ) { + $this->document = $document; + $this->offset = 0; + $this->output = array(); + $this->stack = array(); + $this->empty_attrs = json_decode( '{}', true ); + + do { + // twiddle our thumbs. + } while ( $this->proceed() ); + + return $this->output; + } + + /** + * Processes the next token from the input document + * and returns whether to proceed eating more tokens + * + * This is the "next step" function that essentially + * takes a token as its input and decides what to do + * with that token before descending deeper into a + * nested block tree or continuing along the document + * or breaking out of a level of nesting. + * + * @internal + * @since 3.8.0 + * @return bool + */ + function proceed() { + $next_token = $this->next_token(); + list( $token_type, $block_name, $attrs, $start_offset, $token_length ) = $next_token; + $stack_depth = count( $this->stack ); + + // we may have some HTML soup before the next block. + $leading_html_start = $start_offset > $this->offset ? $this->offset : null; + + switch ( $token_type ) { + case 'no-more-tokens': + // if not in a block then flush output. + if ( 0 === $stack_depth ) { + $this->add_freeform(); + return false; + } + + /* + * Otherwise we have a problem + * This is an error + * + * we have options + * - treat it all as freeform text + * - assume an implicit closer (easiest when not nesting) + */ + + // for the easy case we'll assume an implicit closer. + if ( 1 === $stack_depth ) { + $this->add_block_from_stack(); + return false; + } + + /* + * for the nested case where it's more difficult we'll + * have to assume that multiple closers are missing + * and so we'll collapse the whole stack piecewise + */ + while ( 0 < count( $this->stack ) ) { + $this->add_block_from_stack(); + } + return false; + + case 'void-block': + /* + * easy case is if we stumbled upon a void block + * in the top-level of the document + */ + if ( 0 === $stack_depth ) { + if ( isset( $leading_html_start ) ) { + $this->output[] = (array) self::freeform( + substr( + $this->document, + $leading_html_start, + $start_offset - $leading_html_start + ) + ); + } + + $this->output[] = (array) new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ); + $this->offset = $start_offset + $token_length; + return true; + } + + // otherwise we found an inner block. + $this->add_inner_block( + new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ), + $start_offset, + $token_length + ); + $this->offset = $start_offset + $token_length; + return true; + + case 'block-opener': + // track all newly-opened blocks on the stack. + array_push( + $this->stack, + new WP_Block_Parser_Frame( + new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ), + $start_offset, + $token_length, + $start_offset + $token_length, + $leading_html_start + ) + ); + $this->offset = $start_offset + $token_length; + return true; + + case 'block-closer': + /* + * if we're missing an opener we're in trouble + * This is an error + */ + if ( 0 === $stack_depth ) { + /* + * we have options + * - assume an implicit opener + * - assume _this_ is the opener + * - give up and close out the document + */ + $this->add_freeform(); + return false; + } + + // if we're not nesting then this is easy - close the block. + if ( 1 === $stack_depth ) { + $this->add_block_from_stack( $start_offset ); + $this->offset = $start_offset + $token_length; + return true; + } + + /* + * otherwise we're nested and we have to close out the current + * block and add it as a new innerBlock to the parent + */ + $stack_top = array_pop( $this->stack ); + $html = substr( $this->document, $stack_top->prev_offset, $start_offset - $stack_top->prev_offset ); + $stack_top->block->innerHTML .= $html; + $stack_top->block->innerContent[] = $html; + $stack_top->prev_offset = $start_offset + $token_length; + + $this->add_inner_block( + $stack_top->block, + $stack_top->token_start, + $stack_top->token_length, + $start_offset + $token_length + ); + $this->offset = $start_offset + $token_length; + return true; + + default: + // This is an error. + $this->add_freeform(); + return false; + } + } + + /** + * Scans the document from where we last left off + * and finds the next valid token to parse if it exists + * + * Returns the type of the find: kind of find, block information, attributes + * + * @internal + * @since 3.8.0 + * @since 4.6.1 fixed a bug in attribute parsing which caused catastrophic backtracking on invalid block comments + * @return array + */ + function next_token() { + $matches = null; + + /* + * aye the magic + * we're using a single RegExp to tokenize the block comment delimiters + * we're also using a trick here because the only difference between a + * block opener and a block closer is the leading `/` before `wp:` (and + * a closer has no attributes). we can trap them both and process the + * match back in PHP to see which one it was. + */ + $has_match = preg_match( + '/<!--\s+(?P<closer>\/)?wp:(?P<namespace>[a-z][a-z0-9_-]*\/)?(?P<name>[a-z][a-z0-9_-]*)\s+(?P<attrs>{(?:(?:[^}]+|}+(?=})|(?!}\s+\/?-->).)*+)?}\s+)?(?P<void>\/)?-->/s', + $this->document, + $matches, + PREG_OFFSET_CAPTURE, + $this->offset + ); + + // if we get here we probably have catastrophic backtracking or out-of-memory in the PCRE. + if ( false === $has_match ) { + return array( 'no-more-tokens', null, null, null, null ); + } + + // we have no more tokens. + if ( 0 === $has_match ) { + return array( 'no-more-tokens', null, null, null, null ); + } + + list( $match, $started_at ) = $matches[0]; + + $length = strlen( $match ); + $is_closer = isset( $matches['closer'] ) && -1 !== $matches['closer'][1]; + $is_void = isset( $matches['void'] ) && -1 !== $matches['void'][1]; + $namespace = $matches['namespace']; + $namespace = ( isset( $namespace ) && -1 !== $namespace[1] ) ? $namespace[0] : 'core/'; + $name = $namespace . $matches['name'][0]; + $has_attrs = isset( $matches['attrs'] ) && -1 !== $matches['attrs'][1]; + + /* + * Fun fact! It's not trivial in PHP to create "an empty associative array" since all arrays + * are associative arrays. If we use `array()` we get a JSON `[]` + */ + $attrs = $has_attrs + ? json_decode( $matches['attrs'][0], /* as-associative */ true ) + : $this->empty_attrs; + + /* + * This state isn't allowed + * This is an error + */ + if ( $is_closer && ( $is_void || $has_attrs ) ) { + // we can ignore them since they don't hurt anything. + } + + if ( $is_void ) { + return array( 'void-block', $name, $attrs, $started_at, $length ); + } + + if ( $is_closer ) { + return array( 'block-closer', $name, null, $started_at, $length ); + } + + return array( 'block-opener', $name, $attrs, $started_at, $length ); + } + + /** + * Returns a new block object for freeform HTML + * + * @internal + * @since 3.9.0 + * + * @param string $innerHTML HTML content of block. + * @return WP_Block_Parser_Block freeform block object. + */ + function freeform( $innerHTML ) { + return new WP_Block_Parser_Block( null, $this->empty_attrs, array(), $innerHTML, array( $innerHTML ) ); + } + + /** + * Pushes a length of text from the input document + * to the output list as a freeform block. + * + * @internal + * @since 3.8.0 + * @param null $length how many bytes of document text to output. + */ + function add_freeform( $length = null ) { + $length = $length ? $length : strlen( $this->document ) - $this->offset; + + if ( 0 === $length ) { + return; + } + + $this->output[] = (array) self::freeform( substr( $this->document, $this->offset, $length ) ); + } + + /** + * Given a block structure from memory pushes + * a new block to the output list. + * + * @internal + * @since 3.8.0 + * @param WP_Block_Parser_Block $block The block to add to the output. + * @param int $token_start Byte offset into the document where the first token for the block starts. + * @param int $token_length Byte length of entire block from start of opening token to end of closing token. + * @param int|null $last_offset Last byte offset into document if continuing form earlier output. + */ + function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_length, $last_offset = null ) { + $parent = $this->stack[ count( $this->stack ) - 1 ]; + $parent->block->innerBlocks[] = (array) $block; + $html = substr( $this->document, $parent->prev_offset, $token_start - $parent->prev_offset ); + + if ( ! empty( $html ) ) { + $parent->block->innerHTML .= $html; + $parent->block->innerContent[] = $html; + } + + $parent->block->innerContent[] = null; + $parent->prev_offset = $last_offset ? $last_offset : $token_start + $token_length; + } + + /** + * Pushes the top block from the parsing stack to the output list. + * + * @internal + * @since 3.8.0 + * @param int|null $end_offset byte offset into document for where we should stop sending text output as HTML. + */ + function add_block_from_stack( $end_offset = null ) { + $stack_top = array_pop( $this->stack ); + $prev_offset = $stack_top->prev_offset; + + $html = isset( $end_offset ) + ? substr( $this->document, $prev_offset, $end_offset - $prev_offset ) + : substr( $this->document, $prev_offset ); + + if ( ! empty( $html ) ) { + $stack_top->block->innerHTML .= $html; + $stack_top->block->innerContent[] = $html; + } + + if ( isset( $stack_top->leading_html_start ) ) { + $this->output[] = (array) self::freeform( + substr( + $this->document, + $stack_top->leading_html_start, + $stack_top->token_start - $stack_top->leading_html_start + ) + ); + } + + $this->output[] = (array) $stack_top->block; + } +} diff --git a/wp-includes/class-wp-block-styles-registry.php b/wp-includes/class-wp-block-styles-registry.php new file mode 100644 index 0000000..f56d0e2 --- /dev/null +++ b/wp-includes/class-wp-block-styles-registry.php @@ -0,0 +1,160 @@ +<?php +/** + * Blocks API: WP_Block_Styles_Registry class + * + * @package WordPress + * @subpackage Blocks + * @since 5.3.0 + */ + +/** + * Class used for interacting with block styles. + * + * @since 5.3.0 + */ +final class WP_Block_Styles_Registry { + /** + * Registered block styles, as `$block_name => $block_style_name => $block_style_properties` multidimensional arrays. + * + * @since 5.3.0 + * @var array + */ + private $registered_block_styles = array(); + + /** + * Container for the main instance of the class. + * + * @since 5.3.0 + * @var WP_Block_Styles_Registry|null + */ + private static $instance = null; + + /** + * Registers a block style. + * + * @since 5.3.0 + * + * @param string $block_name Block type name including namespace. + * @param array $style_properties Array containing the properties of the style name, label, + * style (name of the stylesheet to be enqueued), + * inline_style (string containing the CSS to be added). + * @return boolean True if the block style was registered with success and false otherwise. + */ + public function register( $block_name, $style_properties ) { + + if ( ! isset( $block_name ) || ! is_string( $block_name ) ) { + $message = __( 'Block name must be a string.' ); + _doing_it_wrong( __METHOD__, $message, '5.3.0' ); + return false; + } + + if ( ! isset( $style_properties['name'] ) || ! is_string( $style_properties['name'] ) ) { + $message = __( 'Block style name must be a string.' ); + _doing_it_wrong( __METHOD__, $message, '5.3.0' ); + return false; + } + + $block_style_name = $style_properties['name']; + + if ( ! isset( $this->registered_block_styles[ $block_name ] ) ) { + $this->registered_block_styles[ $block_name ] = array(); + } + $this->registered_block_styles[ $block_name ][ $block_style_name ] = $style_properties; + + return true; + } + + /** + * Unregisters a block style. + * + * @param string $block_name Block type name including namespace. + * @param string $block_style_name Block style name. + * @return boolean True if the block style was unregistered with success and false otherwise. + */ + public function unregister( $block_name, $block_style_name ) { + if ( ! $this->is_registered( $block_name, $block_style_name ) ) { + /* translators: 1: Block name, 2: Block style name. */ + $message = sprintf( __( 'Block "%1$s" does not contain a style named "%2$s".' ), $block_name, $block_style_name ); + _doing_it_wrong( __METHOD__, $message, '5.3.0' ); + return false; + } + + unset( $this->registered_block_styles[ $block_name ][ $block_style_name ] ); + + return true; + } + + /** + * Retrieves an array containing the properties of a registered block style. + * + * @since 5.3.0 + * + * @param string $block_name Block type name including namespace. + * @param string $block_style_name Block style name. + * @return array Registered block style properties. + */ + public function get_registered( $block_name, $block_style_name ) { + if ( ! $this->is_registered( $block_name, $block_style_name ) ) { + return null; + } + + return $this->registered_block_styles[ $block_name ][ $block_style_name ]; + } + + /** + * Retrieves all registered block styles. + * + * @since 5.3.0 + * + * @return array Array of arrays containing the registered block styles properties grouped per block, + * and per style. + */ + public function get_all_registered() { + return $this->registered_block_styles; + } + + /** + * Retrieves registered block styles for a specific block. + * + * @since 5.3.0 + * + * @param string $block_name Block type name including namespace. + * @return array Array whose keys are block style names and whose value are block style properties. + */ + public function get_registered_styles_for_block( $block_name ) { + if ( isset( $this->registered_block_styles[ $block_name ] ) ) { + return $this->registered_block_styles[ $block_name ]; + } + return array(); + } + + /** + * Checks if a block style is registered. + * + * @since 5.3.0 + * + * @param string $block_name Block type name including namespace. + * @param string $block_style_name Block style name. + * @return bool True if the block style is registered, false otherwise. + */ + public function is_registered( $block_name, $block_style_name ) { + return isset( $this->registered_block_styles[ $block_name ][ $block_style_name ] ); + } + + /** + * Utility method to retrieve the main instance of the class. + * + * The instance will be created if it does not exist yet. + * + * @since 5.3.0 + * + * @return WP_Block_Styles_Registry The main instance. + */ + public static function get_instance() { + if ( null === self::$instance ) { + self::$instance = new self(); + } + + return self::$instance; + } +} diff --git a/wp-includes/class-wp-block-type-registry.php b/wp-includes/class-wp-block-type-registry.php new file mode 100644 index 0000000..0cc3e94 --- /dev/null +++ b/wp-includes/class-wp-block-type-registry.php @@ -0,0 +1,173 @@ +<?php +/** + * Blocks API: WP_Block_Type_Registry class + * + * @package WordPress + * @subpackage Blocks + * @since 5.0.0 + */ + +/** + * Core class used for interacting with block types. + * + * @since 5.0.0 + */ +final class WP_Block_Type_Registry { + /** + * Registered block types, as `$name => $instance` pairs. + * + * @since 5.0.0 + * @var WP_Block_Type[] + */ + private $registered_block_types = array(); + + /** + * Container for the main instance of the class. + * + * @since 5.0.0 + * @var WP_Block_Type_Registry|null + */ + private static $instance = null; + + /** + * Registers a block type. + * + * @since 5.0.0 + * + * @param string|WP_Block_Type $name Block type name including namespace, or alternatively a + * complete WP_Block_Type instance. In case a WP_Block_Type + * is provided, the $args parameter will be ignored. + * @param array $args { + * Optional. Array of block type arguments. Any arguments may be defined, however the + * ones described below are supported by default. Default empty array. + * + * @type callable $render_callback Callback used to render blocks of this block type. + * @type array $attributes Block attributes mapping, property name to schema. + * } + * @return WP_Block_Type|false The registered block type on success, or false on failure. + */ + public function register( $name, $args = array() ) { + $block_type = null; + if ( $name instanceof WP_Block_Type ) { + $block_type = $name; + $name = $block_type->name; + } + + if ( ! is_string( $name ) ) { + $message = __( 'Block type names must be strings.' ); + _doing_it_wrong( __METHOD__, $message, '5.0.0' ); + return false; + } + + if ( preg_match( '/[A-Z]+/', $name ) ) { + $message = __( 'Block type names must not contain uppercase characters.' ); + _doing_it_wrong( __METHOD__, $message, '5.0.0' ); + return false; + } + + $name_matcher = '/^[a-z0-9-]+\/[a-z0-9-]+$/'; + if ( ! preg_match( $name_matcher, $name ) ) { + $message = __( 'Block type names must contain a namespace prefix. Example: my-plugin/my-custom-block-type' ); + _doing_it_wrong( __METHOD__, $message, '5.0.0' ); + return false; + } + + if ( $this->is_registered( $name ) ) { + /* translators: %s: Block name. */ + $message = sprintf( __( 'Block type "%s" is already registered.' ), $name ); + _doing_it_wrong( __METHOD__, $message, '5.0.0' ); + return false; + } + + if ( ! $block_type ) { + $block_type = new WP_Block_Type( $name, $args ); + } + + $this->registered_block_types[ $name ] = $block_type; + + return $block_type; + } + + /** + * Unregisters a block type. + * + * @since 5.0.0 + * + * @param string|WP_Block_Type $name Block type name including namespace, or alternatively a + * complete WP_Block_Type instance. + * @return WP_Block_Type|false The unregistered block type on success, or false on failure. + */ + public function unregister( $name ) { + if ( $name instanceof WP_Block_Type ) { + $name = $name->name; + } + + if ( ! $this->is_registered( $name ) ) { + /* translators: %s: Block name. */ + $message = sprintf( __( 'Block type "%s" is not registered.' ), $name ); + _doing_it_wrong( __METHOD__, $message, '5.0.0' ); + return false; + } + + $unregistered_block_type = $this->registered_block_types[ $name ]; + unset( $this->registered_block_types[ $name ] ); + + return $unregistered_block_type; + } + + /** + * Retrieves a registered block type. + * + * @since 5.0.0 + * + * @param string $name Block type name including namespace. + * @return WP_Block_Type|null The registered block type, or null if it is not registered. + */ + public function get_registered( $name ) { + if ( ! $this->is_registered( $name ) ) { + return null; + } + + return $this->registered_block_types[ $name ]; + } + + /** + * Retrieves all registered block types. + * + * @since 5.0.0 + * + * @return WP_Block_Type[] Associative array of `$block_type_name => $block_type` pairs. + */ + public function get_all_registered() { + return $this->registered_block_types; + } + + /** + * Checks if a block type is registered. + * + * @since 5.0.0 + * + * @param string $name Block type name including namespace. + * @return bool True if the block type is registered, false otherwise. + */ + public function is_registered( $name ) { + return isset( $this->registered_block_types[ $name ] ); + } + + /** + * Utility method to retrieve the main instance of the class. + * + * The instance will be created if it does not exist yet. + * + * @since 5.0.0 + * + * @return WP_Block_Type_Registry The main instance. + */ + public static function get_instance() { + if ( null === self::$instance ) { + self::$instance = new self(); + } + + return self::$instance; + } +} diff --git a/wp-includes/class-wp-block-type.php b/wp-includes/class-wp-block-type.php new file mode 100644 index 0000000..6ffda95 --- /dev/null +++ b/wp-includes/class-wp-block-type.php @@ -0,0 +1,216 @@ +<?php +/** + * Blocks API: WP_Block_Type class + * + * @package WordPress + * @subpackage Blocks + * @since 5.0.0 + */ + +/** + * Core class representing a block type. + * + * @since 5.0.0 + * + * @see register_block_type() + */ +class WP_Block_Type { + /** + * Block type key. + * + * @since 5.0.0 + * @var string + */ + public $name; + + /** + * Block type render callback. + * + * @since 5.0.0 + * @var callable + */ + public $render_callback; + + /** + * Block type attributes property schemas. + * + * @since 5.0.0 + * @var array + */ + public $attributes; + + /** + * Block type editor script handle. + * + * @since 5.0.0 + * @var string + */ + public $editor_script; + + /** + * Block type front end script handle. + * + * @since 5.0.0 + * @var string + */ + public $script; + + /** + * Block type editor style handle. + * + * @since 5.0.0 + * @var string + */ + public $editor_style; + + /** + * Block type front end style handle. + * + * @since 5.0.0 + * @var string + */ + public $style; + + /** + * Constructor. + * + * Will populate object properties from the provided arguments. + * + * @since 5.0.0 + * + * @see register_block_type() + * + * @param string $block_type Block type name including namespace. + * @param array|string $args Optional. Array or string of arguments for registering a block type. + * Default empty array. + */ + public function __construct( $block_type, $args = array() ) { + $this->name = $block_type; + + $this->set_props( $args ); + } + + /** + * Renders the block type output for given attributes. + * + * @since 5.0.0 + * + * @param array $attributes Optional. Block attributes. Default empty array. + * @param string $content Optional. Block content. Default empty string. + * @return string Rendered block type output. + */ + public function render( $attributes = array(), $content = '' ) { + if ( ! $this->is_dynamic() ) { + return ''; + } + + $attributes = $this->prepare_attributes_for_render( $attributes ); + + return (string) call_user_func( $this->render_callback, $attributes, $content ); + } + + /** + * Returns true if the block type is dynamic, or false otherwise. A dynamic + * block is one which defers its rendering to occur on-demand at runtime. + * + * @since 5.0.0 + * + * @return boolean Whether block type is dynamic. + */ + public function is_dynamic() { + return is_callable( $this->render_callback ); + } + + /** + * Validates attributes against the current block schema, populating + * defaulted and missing values. + * + * @since 5.0.0 + * + * @param array $attributes Original block attributes. + * @return array Prepared block attributes. + */ + public function prepare_attributes_for_render( $attributes ) { + // If there are no attribute definitions for the block type, skip + // processing and return vebatim. + if ( ! isset( $this->attributes ) ) { + return $attributes; + } + + foreach ( $attributes as $attribute_name => $value ) { + // If the attribute is not defined by the block type, it cannot be + // validated. + if ( ! isset( $this->attributes[ $attribute_name ] ) ) { + continue; + } + + $schema = $this->attributes[ $attribute_name ]; + + // Validate value by JSON schema. An invalid value should revert to + // its default, if one exists. This occurs by virtue of the missing + // attributes loop immediately following. If there is not a default + // assigned, the attribute value should remain unset. + $is_valid = rest_validate_value_from_schema( $value, $schema ); + if ( is_wp_error( $is_valid ) ) { + unset( $attributes[ $attribute_name ] ); + } + } + + // Populate values of any missing attributes for which the block type + // defines a default. + $missing_schema_attributes = array_diff_key( $this->attributes, $attributes ); + foreach ( $missing_schema_attributes as $attribute_name => $schema ) { + if ( isset( $schema['default'] ) ) { + $attributes[ $attribute_name ] = $schema['default']; + } + } + + return $attributes; + } + + /** + * Sets block type properties. + * + * @since 5.0.0 + * + * @param array|string $args Array or string of arguments for registering a block type. + */ + public function set_props( $args ) { + $args = wp_parse_args( + $args, + array( + 'render_callback' => null, + ) + ); + + $args['name'] = $this->name; + + foreach ( $args as $property_name => $property_value ) { + $this->$property_name = $property_value; + } + } + + /** + * Get all available block attributes including possible layout attribute from Columns block. + * + * @since 5.0.0 + * + * @return array Array of attributes. + */ + public function get_attributes() { + return is_array( $this->attributes ) ? + array_merge( + $this->attributes, + array( + 'layout' => array( + 'type' => 'string', + ), + ) + ) : + array( + 'layout' => array( + 'type' => 'string', + ), + ); + } +} diff --git a/wp-includes/class-wp-comment-query.php b/wp-includes/class-wp-comment-query.php new file mode 100644 index 0000000..ab92fa1 --- /dev/null +++ b/wp-includes/class-wp-comment-query.php @@ -0,0 +1,1185 @@ +<?php +/** + * Comment API: WP_Comment_Query class + * + * @package WordPress + * @subpackage Comments + * @since 4.4.0 + */ + +/** + * Core class used for querying comments. + * + * @since 3.1.0 + * + * @see WP_Comment_Query::__construct() for accepted arguments. + */ +class WP_Comment_Query { + + /** + * SQL for database query. + * + * @since 4.0.1 + * @var string + */ + public $request; + + /** + * Metadata query container + * + * @since 3.5.0 + * @var object WP_Meta_Query + */ + public $meta_query = false; + + /** + * Metadata query clauses. + * + * @since 4.4.0 + * @var array + */ + protected $meta_query_clauses; + + /** + * SQL query clauses. + * + * @since 4.4.0 + * @var array + */ + protected $sql_clauses = array( + 'select' => '', + 'from' => '', + 'where' => array(), + 'groupby' => '', + 'orderby' => '', + 'limits' => '', + ); + + /** + * SQL WHERE clause. + * + * Stored after the {@see 'comments_clauses'} filter is run on the compiled WHERE sub-clauses. + * + * @since 4.4.2 + * @var string + */ + protected $filtered_where_clause; + + /** + * Date query container + * + * @since 3.7.0 + * @var object WP_Date_Query + */ + public $date_query = false; + + /** + * Query vars set by the user. + * + * @since 3.1.0 + * @var array + */ + public $query_vars; + + /** + * Default values for query vars. + * + * @since 4.2.0 + * @var array + */ + public $query_var_defaults; + + /** + * List of comments located by the query. + * + * @since 4.0.0 + * @var array + */ + public $comments; + + /** + * The amount of found comments for the current query. + * + * @since 4.4.0 + * @var int + */ + public $found_comments = 0; + + /** + * The number of pages. + * + * @since 4.4.0 + * @var int + */ + public $max_num_pages = 0; + + /** + * Make private/protected methods readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Method to call. + * @param array $arguments Arguments to pass when calling. + * @return mixed|false Return value of the callback, false otherwise. + */ + public function __call( $name, $arguments ) { + if ( 'get_search_sql' === $name ) { + return $this->get_search_sql( ...$arguments ); + } + return false; + } + + /** + * Constructor. + * + * Sets up the comment query, based on the query vars passed. + * + * @since 4.2.0 + * @since 4.4.0 `$parent__in` and `$parent__not_in` were added. + * @since 4.4.0 Order by `comment__in` was added. `$update_comment_meta_cache`, `$no_found_rows`, + * `$hierarchical`, and `$update_comment_post_cache` were added. + * @since 4.5.0 Introduced the `$author_url` argument. + * @since 4.6.0 Introduced the `$cache_domain` argument. + * @since 4.9.0 Introduced the `$paged` argument. + * + * @param string|array $query { + * Optional. Array or query string of comment query parameters. Default empty. + * + * @type string $author_email Comment author email address. Default empty. + * @type string $author_url Comment author URL. Default empty. + * @type array $author__in Array of author IDs to include comments for. Default empty. + * @type array $author__not_in Array of author IDs to exclude comments for. Default empty. + * @type array $comment__in Array of comment IDs to include. Default empty. + * @type array $comment__not_in Array of comment IDs to exclude. Default empty. + * @type bool $count Whether to return a comment count (true) or array of + * comment objects (false). Default false. + * @type array $date_query Date query clauses to limit comments by. See WP_Date_Query. + * Default null. + * @type string $fields Comment fields to return. Accepts 'ids' for comment IDs + * only or empty for all fields. Default empty. + * @type int $ID Currently unused. + * @type array $include_unapproved Array of IDs or email addresses of users whose unapproved + * comments will be returned by the query regardless of + * `$status`. Default empty. + * @type int $karma Karma score to retrieve matching comments for. + * Default empty. + * @type string $meta_key Include comments with a matching comment meta key. + * Default empty. + * @type string $meta_value Include comments with a matching comment meta value. + * Requires `$meta_key` to be set. Default empty. + * @type array $meta_query Meta query clauses to limit retrieved comments by. + * See WP_Meta_Query. Default empty. + * @type int $number Maximum number of comments to retrieve. + * Default empty (no limit). + * @type int $paged When used with $number, defines the page of results to return. + * When used with $offset, $offset takes precedence. Default 1. + * @type int $offset Number of comments to offset the query. Used to build + * LIMIT clause. Default 0. + * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. + * Default: true. + * @type string|array $orderby Comment status or array of statuses. To use 'meta_value' + * or 'meta_value_num', `$meta_key` must also be defined. + * To sort by a specific `$meta_query` clause, use that + * clause's array key. Accepts 'comment_agent', + * 'comment_approved', 'comment_author', + * 'comment_author_email', 'comment_author_IP', + * 'comment_author_url', 'comment_content', 'comment_date', + * 'comment_date_gmt', 'comment_ID', 'comment_karma', + * 'comment_parent', 'comment_post_ID', 'comment_type', + * 'user_id', 'comment__in', 'meta_value', 'meta_value_num', + * the value of $meta_key, and the array keys of + * `$meta_query`. Also accepts false, an empty array, or + * 'none' to disable `ORDER BY` clause. + * Default: 'comment_date_gmt'. + * @type string $order How to order retrieved comments. Accepts 'ASC', 'DESC'. + * Default: 'DESC'. + * @type int $parent Parent ID of comment to retrieve children of. + * Default empty. + * @type array $parent__in Array of parent IDs of comments to retrieve children for. + * Default empty. + * @type array $parent__not_in Array of parent IDs of comments *not* to retrieve + * children for. Default empty. + * @type array $post_author__in Array of author IDs to retrieve comments for. + * Default empty. + * @type array $post_author__not_in Array of author IDs *not* to retrieve comments for. + * Default empty. + * @type int $post_ID Currently unused. + * @type int $post_id Limit results to those affiliated with a given post ID. + * Default 0. + * @type array $post__in Array of post IDs to include affiliated comments for. + * Default empty. + * @type array $post__not_in Array of post IDs to exclude affiliated comments for. + * Default empty. + * @type int $post_author Post author ID to limit results by. Default empty. + * @type string|array $post_status Post status or array of post statuses to retrieve + * affiliated comments for. Pass 'any' to match any value. + * Default empty. + * @type string $post_type Post type or array of post types to retrieve affiliated + * comments for. Pass 'any' to match any value. Default empty. + * @type string $post_name Post name to retrieve affiliated comments for. + * Default empty. + * @type int $post_parent Post parent ID to retrieve affiliated comments for. + * Default empty. + * @type string $search Search term(s) to retrieve matching comments for. + * Default empty. + * @type string|array $status Comment stati to limit results by. Accepts an array + * or space/comma-separated list of 'hold' (`comment_status=0`), + * 'approve' (`comment_status=1`), 'all', or a custom + * comment status. Default 'all'. + * @type string|array $type Include comments of a given type, or array of types. + * Accepts 'comment', 'pings' (includes 'pingback' and + * 'trackback'), or anycustom type string. Default empty. + * @type array $type__in Include comments from a given array of comment types. + * Default empty. + * @type array $type__not_in Exclude comments from a given array of comment types. + * Default empty. + * @type int $user_id Include comments for a specific user ID. Default empty. + * @type bool|string $hierarchical Whether to include comment descendants in the results. + * 'threaded' returns a tree, with each comment's children + * stored in a `children` property on the `WP_Comment` + * object. 'flat' returns a flat array of found comments plus + * their children. Pass `false` to leave out descendants. + * The parameter is ignored (forced to `false`) when + * `$fields` is 'ids' or 'counts'. Accepts 'threaded', + * 'flat', or false. Default: false. + * @type string $cache_domain Unique cache key to be produced when this query is stored in + * an object cache. Default is 'core'. + * @type bool $update_comment_meta_cache Whether to prime the metadata cache for found comments. + * Default true. + * @type bool $update_comment_post_cache Whether to prime the cache for comment posts. + * Default false. + * } + */ + public function __construct( $query = '' ) { + $this->query_var_defaults = array( + 'author_email' => '', + 'author_url' => '', + 'author__in' => '', + 'author__not_in' => '', + 'include_unapproved' => '', + 'fields' => '', + 'ID' => '', + 'comment__in' => '', + 'comment__not_in' => '', + 'karma' => '', + 'number' => '', + 'offset' => '', + 'no_found_rows' => true, + 'orderby' => '', + 'order' => 'DESC', + 'paged' => 1, + 'parent' => '', + 'parent__in' => '', + 'parent__not_in' => '', + 'post_author__in' => '', + 'post_author__not_in' => '', + 'post_ID' => '', + 'post_id' => 0, + 'post__in' => '', + 'post__not_in' => '', + 'post_author' => '', + 'post_name' => '', + 'post_parent' => '', + 'post_status' => '', + 'post_type' => '', + 'status' => 'all', + 'type' => '', + 'type__in' => '', + 'type__not_in' => '', + 'user_id' => '', + 'search' => '', + 'count' => false, + 'meta_key' => '', + 'meta_value' => '', + 'meta_query' => '', + 'date_query' => null, // See WP_Date_Query. + 'hierarchical' => false, + 'cache_domain' => 'core', + 'update_comment_meta_cache' => true, + 'update_comment_post_cache' => false, + ); + + if ( ! empty( $query ) ) { + $this->query( $query ); + } + } + + /** + * Parse arguments passed to the comment query with default query parameters. + * + * @since 4.2.0 Extracted from WP_Comment_Query::query(). + * + * @param string|array $query WP_Comment_Query arguments. See WP_Comment_Query::__construct() + */ + public function parse_query( $query = '' ) { + if ( empty( $query ) ) { + $query = $this->query_vars; + } + + $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); + + /** + * Fires after the comment query vars have been parsed. + * + * @since 4.2.0 + * + * @param WP_Comment_Query $this The WP_Comment_Query instance (passed by reference). + */ + do_action_ref_array( 'parse_comment_query', array( &$this ) ); + } + + /** + * Sets up the WordPress query for retrieving comments. + * + * @since 3.1.0 + * @since 4.1.0 Introduced 'comment__in', 'comment__not_in', 'post_author__in', + * 'post_author__not_in', 'author__in', 'author__not_in', 'post__in', + * 'post__not_in', 'include_unapproved', 'type__in', and 'type__not_in' + * arguments to $query_vars. + * @since 4.2.0 Moved parsing to WP_Comment_Query::parse_query(). + * + * @param string|array $query Array or URL query string of parameters. + * @return array|int List of comments, or number of comments when 'count' is passed as a query var. + */ + public function query( $query ) { + $this->query_vars = wp_parse_args( $query ); + return $this->get_comments(); + } + + /** + * Get a list of comments matching the query vars. + * + * @since 4.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return int|array List of comments or number of found comments if `$count` argument is true. + */ + public function get_comments() { + global $wpdb; + + $this->parse_query(); + + // Parse meta query. + $this->meta_query = new WP_Meta_Query(); + $this->meta_query->parse_query_vars( $this->query_vars ); + + /** + * Fires before comments are retrieved. + * + * @since 3.1.0 + * + * @param WP_Comment_Query $this Current instance of WP_Comment_Query (passed by reference). + */ + do_action_ref_array( 'pre_get_comments', array( &$this ) ); + + // Reparse query vars, in case they were modified in a 'pre_get_comments' callback. + $this->meta_query->parse_query_vars( $this->query_vars ); + if ( ! empty( $this->meta_query->queries ) ) { + $this->meta_query_clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this ); + } + + $comment_data = null; + + /** + * Filter the comments data before the query takes place. + * + * Return a non-null value to bypass WordPress's default comment queries. + * + * The expected return type from this filter depends on the value passed in the request query_vars. + * When `$this->query_vars['count']` is set, the filter should return the comment count as an int. + * When `'ids' == $this->query_vars['fields']`, the filter should return an array of comment ids. + * Otherwise the filter should return an array of WP_Comment objects. + * + * @since 5.3.0 + * + * @param array|int|null $comment_data Return an array of comment data to short-circuit WP's comment query, + * the comment count as an integer if `$this->query_vars['count']` is set, + * or null to allow WP to run its normal queries. + * @param WP_Comment_Query $this The WP_Comment_Query instance, passed by reference. + */ + $comment_data = apply_filters_ref_array( 'comments_pre_query', array( $comment_data, &$this ) ); + + if ( null !== $comment_data ) { + return $comment_data; + } + + /* + * Only use the args defined in the query_var_defaults to compute the key, + * but ignore 'fields', which does not affect query results. + */ + $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ); + unset( $_args['fields'] ); + + $key = md5( serialize( $_args ) ); + $last_changed = wp_cache_get_last_changed( 'comment' ); + + $cache_key = "get_comments:$key:$last_changed"; + $cache_value = wp_cache_get( $cache_key, 'comment' ); + if ( false === $cache_value ) { + $comment_ids = $this->get_comment_ids(); + if ( $comment_ids ) { + $this->set_found_comments(); + } + + $cache_value = array( + 'comment_ids' => $comment_ids, + 'found_comments' => $this->found_comments, + ); + wp_cache_add( $cache_key, $cache_value, 'comment' ); + } else { + $comment_ids = $cache_value['comment_ids']; + $this->found_comments = $cache_value['found_comments']; + } + + if ( $this->found_comments && $this->query_vars['number'] ) { + $this->max_num_pages = ceil( $this->found_comments / $this->query_vars['number'] ); + } + + // If querying for a count only, there's nothing more to do. + if ( $this->query_vars['count'] ) { + // $comment_ids is actually a count in this case. + return intval( $comment_ids ); + } + + $comment_ids = array_map( 'intval', $comment_ids ); + + if ( 'ids' == $this->query_vars['fields'] ) { + $this->comments = $comment_ids; + return $this->comments; + } + + _prime_comment_caches( $comment_ids, $this->query_vars['update_comment_meta_cache'] ); + + // Fetch full comment objects from the primed cache. + $_comments = array(); + foreach ( $comment_ids as $comment_id ) { + $_comment = get_comment( $comment_id ); + if ( $_comment ) { + $_comments[] = $_comment; + } + } + + // Prime comment post caches. + if ( $this->query_vars['update_comment_post_cache'] ) { + $comment_post_ids = array(); + foreach ( $_comments as $_comment ) { + $comment_post_ids[] = $_comment->comment_post_ID; + } + + _prime_post_caches( $comment_post_ids, false, false ); + } + + /** + * Filters the comment query results. + * + * @since 3.1.0 + * + * @param WP_Comment[] $_comments An array of comments. + * @param WP_Comment_Query $this Current instance of WP_Comment_Query (passed by reference). + */ + $_comments = apply_filters_ref_array( 'the_comments', array( $_comments, &$this ) ); + + // Convert to WP_Comment instances. + $comments = array_map( 'get_comment', $_comments ); + + if ( $this->query_vars['hierarchical'] ) { + $comments = $this->fill_descendants( $comments ); + } + + $this->comments = $comments; + return $this->comments; + } + + /** + * Used internally to get a list of comment IDs matching the query vars. + * + * @since 4.4.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return int|array A single count of comment IDs if a count query. An array of comment IDs if a full query. + */ + protected function get_comment_ids() { + global $wpdb; + + // Assemble clauses related to 'comment_approved'. + $approved_clauses = array(); + + // 'status' accepts an array or a comma-separated string. + $status_clauses = array(); + $statuses = wp_parse_list( $this->query_vars['status'] ); + + // Empty 'status' should be interpreted as 'all'. + if ( empty( $statuses ) ) { + $statuses = array( 'all' ); + } + + // 'any' overrides other statuses. + if ( ! in_array( 'any', $statuses ) ) { + foreach ( $statuses as $status ) { + switch ( $status ) { + case 'hold': + $status_clauses[] = "comment_approved = '0'"; + break; + + case 'approve': + $status_clauses[] = "comment_approved = '1'"; + break; + + case 'all': + case '': + $status_clauses[] = "( comment_approved = '0' OR comment_approved = '1' )"; + break; + + default: + $status_clauses[] = $wpdb->prepare( 'comment_approved = %s', $status ); + break; + } + } + + if ( ! empty( $status_clauses ) ) { + $approved_clauses[] = '( ' . implode( ' OR ', $status_clauses ) . ' )'; + } + } + + // User IDs or emails whose unapproved comments are included, regardless of $status. + if ( ! empty( $this->query_vars['include_unapproved'] ) ) { + $include_unapproved = wp_parse_list( $this->query_vars['include_unapproved'] ); + + $unapproved_ids = array(); + $unapproved_emails = array(); + foreach ( $include_unapproved as $unapproved_identifier ) { + // Numeric values are assumed to be user ids. + if ( is_numeric( $unapproved_identifier ) ) { + $approved_clauses[] = $wpdb->prepare( "( user_id = %d AND comment_approved = '0' )", $unapproved_identifier ); + } else { + // Otherwise we match against email addresses. + if ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) { + // Only include requested comment. + $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' AND comment_ID = %d )", $unapproved_identifier, (int) $_GET['unapproved'] ); + } else { + // Include all of the author's unapproved comments. + $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' )", $unapproved_identifier ); + } + } + } + } + + // Collapse comment_approved clauses into a single OR-separated clause. + if ( ! empty( $approved_clauses ) ) { + if ( 1 === count( $approved_clauses ) ) { + $this->sql_clauses['where']['approved'] = $approved_clauses[0]; + } else { + $this->sql_clauses['where']['approved'] = '( ' . implode( ' OR ', $approved_clauses ) . ' )'; + } + } + + $order = ( 'ASC' == strtoupper( $this->query_vars['order'] ) ) ? 'ASC' : 'DESC'; + + // Disable ORDER BY with 'none', an empty array, or boolean false. + if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { + $orderby = ''; + } elseif ( ! empty( $this->query_vars['orderby'] ) ) { + $ordersby = is_array( $this->query_vars['orderby'] ) ? + $this->query_vars['orderby'] : + preg_split( '/[,\s]/', $this->query_vars['orderby'] ); + + $orderby_array = array(); + $found_orderby_comment_id = false; + foreach ( $ordersby as $_key => $_value ) { + if ( ! $_value ) { + continue; + } + + if ( is_int( $_key ) ) { + $_orderby = $_value; + $_order = $order; + } else { + $_orderby = $_key; + $_order = $_value; + } + + if ( ! $found_orderby_comment_id && in_array( $_orderby, array( 'comment_ID', 'comment__in' ) ) ) { + $found_orderby_comment_id = true; + } + + $parsed = $this->parse_orderby( $_orderby ); + + if ( ! $parsed ) { + continue; + } + + if ( 'comment__in' === $_orderby ) { + $orderby_array[] = $parsed; + continue; + } + + $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); + } + + // If no valid clauses were found, order by comment_date_gmt. + if ( empty( $orderby_array ) ) { + $orderby_array[] = "$wpdb->comments.comment_date_gmt $order"; + } + + // To ensure determinate sorting, always include a comment_ID clause. + if ( ! $found_orderby_comment_id ) { + $comment_id_order = ''; + + // Inherit order from comment_date or comment_date_gmt, if available. + foreach ( $orderby_array as $orderby_clause ) { + if ( preg_match( '/comment_date(?:_gmt)*\ (ASC|DESC)/', $orderby_clause, $match ) ) { + $comment_id_order = $match[1]; + break; + } + } + + // If no date-related order is available, use the date from the first available clause. + if ( ! $comment_id_order ) { + foreach ( $orderby_array as $orderby_clause ) { + if ( false !== strpos( 'ASC', $orderby_clause ) ) { + $comment_id_order = 'ASC'; + } else { + $comment_id_order = 'DESC'; + } + + break; + } + } + + // Default to DESC. + if ( ! $comment_id_order ) { + $comment_id_order = 'DESC'; + } + + $orderby_array[] = "$wpdb->comments.comment_ID $comment_id_order"; + } + + $orderby = implode( ', ', $orderby_array ); + } else { + $orderby = "$wpdb->comments.comment_date_gmt $order"; + } + + $number = absint( $this->query_vars['number'] ); + $offset = absint( $this->query_vars['offset'] ); + $paged = absint( $this->query_vars['paged'] ); + $limits = ''; + + if ( ! empty( $number ) ) { + if ( $offset ) { + $limits = 'LIMIT ' . $offset . ',' . $number; + } else { + $limits = 'LIMIT ' . ( $number * ( $paged - 1 ) ) . ',' . $number; + } + } + + if ( $this->query_vars['count'] ) { + $fields = 'COUNT(*)'; + } else { + $fields = "$wpdb->comments.comment_ID"; + } + + $post_id = absint( $this->query_vars['post_id'] ); + if ( ! empty( $post_id ) ) { + $this->sql_clauses['where']['post_id'] = $wpdb->prepare( 'comment_post_ID = %d', $post_id ); + } + + // Parse comment IDs for an IN clause. + if ( ! empty( $this->query_vars['comment__in'] ) ) { + $this->sql_clauses['where']['comment__in'] = "$wpdb->comments.comment_ID IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['comment__in'] ) ) . ' )'; + } + + // Parse comment IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['comment__not_in'] ) ) { + $this->sql_clauses['where']['comment__not_in'] = "$wpdb->comments.comment_ID NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['comment__not_in'] ) ) . ' )'; + } + + // Parse comment parent IDs for an IN clause. + if ( ! empty( $this->query_vars['parent__in'] ) ) { + $this->sql_clauses['where']['parent__in'] = 'comment_parent IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__in'] ) ) . ' )'; + } + + // Parse comment parent IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['parent__not_in'] ) ) { + $this->sql_clauses['where']['parent__not_in'] = 'comment_parent NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__not_in'] ) ) . ' )'; + } + + // Parse comment post IDs for an IN clause. + if ( ! empty( $this->query_vars['post__in'] ) ) { + $this->sql_clauses['where']['post__in'] = 'comment_post_ID IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__in'] ) ) . ' )'; + } + + // Parse comment post IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['post__not_in'] ) ) { + $this->sql_clauses['where']['post__not_in'] = 'comment_post_ID NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__not_in'] ) ) . ' )'; + } + + if ( '' !== $this->query_vars['author_email'] ) { + $this->sql_clauses['where']['author_email'] = $wpdb->prepare( 'comment_author_email = %s', $this->query_vars['author_email'] ); + } + + if ( '' !== $this->query_vars['author_url'] ) { + $this->sql_clauses['where']['author_url'] = $wpdb->prepare( 'comment_author_url = %s', $this->query_vars['author_url'] ); + } + + if ( '' !== $this->query_vars['karma'] ) { + $this->sql_clauses['where']['karma'] = $wpdb->prepare( 'comment_karma = %d', $this->query_vars['karma'] ); + } + + // Filtering by comment_type: 'type', 'type__in', 'type__not_in'. + $raw_types = array( + 'IN' => array_merge( (array) $this->query_vars['type'], (array) $this->query_vars['type__in'] ), + 'NOT IN' => (array) $this->query_vars['type__not_in'], + ); + + $comment_types = array(); + foreach ( $raw_types as $operator => $_raw_types ) { + $_raw_types = array_unique( $_raw_types ); + + foreach ( $_raw_types as $type ) { + switch ( $type ) { + // An empty translates to 'all', for backward compatibility. + case '': + case 'all': + break; + + case 'comment': + case 'comments': + $comment_types[ $operator ][] = "''"; + break; + + case 'pings': + $comment_types[ $operator ][] = "'pingback'"; + $comment_types[ $operator ][] = "'trackback'"; + break; + + default: + $comment_types[ $operator ][] = $wpdb->prepare( '%s', $type ); + break; + } + } + + if ( ! empty( $comment_types[ $operator ] ) ) { + $types_sql = implode( ', ', $comment_types[ $operator ] ); + $this->sql_clauses['where'][ 'comment_type__' . strtolower( str_replace( ' ', '_', $operator ) ) ] = "comment_type $operator ($types_sql)"; + } + } + + $parent = $this->query_vars['parent']; + if ( $this->query_vars['hierarchical'] && ! $parent ) { + $parent = 0; + } + + if ( '' !== $parent ) { + $this->sql_clauses['where']['parent'] = $wpdb->prepare( 'comment_parent = %d', $parent ); + } + + if ( is_array( $this->query_vars['user_id'] ) ) { + $this->sql_clauses['where']['user_id'] = 'user_id IN (' . implode( ',', array_map( 'absint', $this->query_vars['user_id'] ) ) . ')'; + } elseif ( '' !== $this->query_vars['user_id'] ) { + $this->sql_clauses['where']['user_id'] = $wpdb->prepare( 'user_id = %d', $this->query_vars['user_id'] ); + } + + // Falsy search strings are ignored. + if ( strlen( $this->query_vars['search'] ) ) { + $search_sql = $this->get_search_sql( + $this->query_vars['search'], + array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' ) + ); + + // Strip leading 'AND'. + $this->sql_clauses['where']['search'] = preg_replace( '/^\s*AND\s*/', '', $search_sql ); + } + + // If any post-related query vars are passed, join the posts table. + $join_posts_table = false; + $plucked = wp_array_slice_assoc( $this->query_vars, array( 'post_author', 'post_name', 'post_parent' ) ); + $post_fields = array_filter( $plucked ); + + if ( ! empty( $post_fields ) ) { + $join_posts_table = true; + foreach ( $post_fields as $field_name => $field_value ) { + // $field_value may be an array. + $esses = array_fill( 0, count( (array) $field_value ), '%s' ); + + // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare + $this->sql_clauses['where'][ $field_name ] = $wpdb->prepare( " {$wpdb->posts}.{$field_name} IN (" . implode( ',', $esses ) . ')', $field_value ); + } + } + + // 'post_status' and 'post_type' are handled separately, due to the specialized behavior of 'any'. + foreach ( array( 'post_status', 'post_type' ) as $field_name ) { + $q_values = array(); + if ( ! empty( $this->query_vars[ $field_name ] ) ) { + $q_values = $this->query_vars[ $field_name ]; + if ( ! is_array( $q_values ) ) { + $q_values = explode( ',', $q_values ); + } + + // 'any' will cause the query var to be ignored. + if ( in_array( 'any', $q_values, true ) || empty( $q_values ) ) { + continue; + } + + $join_posts_table = true; + + $esses = array_fill( 0, count( $q_values ), '%s' ); + + // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare + $this->sql_clauses['where'][ $field_name ] = $wpdb->prepare( " {$wpdb->posts}.{$field_name} IN (" . implode( ',', $esses ) . ')', $q_values ); + } + } + + // Comment author IDs for an IN clause. + if ( ! empty( $this->query_vars['author__in'] ) ) { + $this->sql_clauses['where']['author__in'] = 'user_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__in'] ) ) . ' )'; + } + + // Comment author IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['author__not_in'] ) ) { + $this->sql_clauses['where']['author__not_in'] = 'user_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__not_in'] ) ) . ' )'; + } + + // Post author IDs for an IN clause. + if ( ! empty( $this->query_vars['post_author__in'] ) ) { + $join_posts_table = true; + $this->sql_clauses['where']['post_author__in'] = 'post_author IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__in'] ) ) . ' )'; + } + + // Post author IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['post_author__not_in'] ) ) { + $join_posts_table = true; + $this->sql_clauses['where']['post_author__not_in'] = 'post_author NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__not_in'] ) ) . ' )'; + } + + $join = ''; + $groupby = ''; + + if ( $join_posts_table ) { + $join .= "JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID"; + } + + if ( ! empty( $this->meta_query_clauses ) ) { + $join .= $this->meta_query_clauses['join']; + + // Strip leading 'AND'. + $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] ); + + if ( ! $this->query_vars['count'] ) { + $groupby = "{$wpdb->comments}.comment_ID"; + } + } + + if ( ! empty( $this->query_vars['date_query'] ) && is_array( $this->query_vars['date_query'] ) ) { + $this->date_query = new WP_Date_Query( $this->query_vars['date_query'], 'comment_date' ); + $this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() ); + } + + $where = implode( ' AND ', $this->sql_clauses['where'] ); + + $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); + /** + * Filters the comment query clauses. + * + * @since 3.1.0 + * + * @param string[] $pieces An associative array of comment query clauses. + * @param WP_Comment_Query $this Current instance of WP_Comment_Query (passed by reference). + */ + $clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $pieces ), &$this ) ); + + $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; + $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; + $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; + $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; + $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; + $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; + + $this->filtered_where_clause = $where; + + if ( $where ) { + $where = 'WHERE ' . $where; + } + + if ( $groupby ) { + $groupby = 'GROUP BY ' . $groupby; + } + + if ( $orderby ) { + $orderby = "ORDER BY $orderby"; + } + + $found_rows = ''; + if ( ! $this->query_vars['no_found_rows'] ) { + $found_rows = 'SQL_CALC_FOUND_ROWS'; + } + + $this->sql_clauses['select'] = "SELECT $found_rows $fields"; + $this->sql_clauses['from'] = "FROM $wpdb->comments $join"; + $this->sql_clauses['groupby'] = $groupby; + $this->sql_clauses['orderby'] = $orderby; + $this->sql_clauses['limits'] = $limits; + + $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; + + if ( $this->query_vars['count'] ) { + return intval( $wpdb->get_var( $this->request ) ); + } else { + $comment_ids = $wpdb->get_col( $this->request ); + return array_map( 'intval', $comment_ids ); + } + } + + /** + * Populates found_comments and max_num_pages properties for the current + * query if the limit clause was used. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ + private function set_found_comments() { + global $wpdb; + + if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { + /** + * Filters the query used to retrieve found comment count. + * + * @since 4.4.0 + * + * @param string $found_comments_query SQL query. Default 'SELECT FOUND_ROWS()'. + * @param WP_Comment_Query $comment_query The `WP_Comment_Query` instance. + */ + $found_comments_query = apply_filters( 'found_comments_query', 'SELECT FOUND_ROWS()', $this ); + + $this->found_comments = (int) $wpdb->get_var( $found_comments_query ); + } + } + + /** + * Fetch descendants for located comments. + * + * Instead of calling `get_children()` separately on each child comment, we do a single set of queries to fetch + * the descendant trees for all matched top-level comments. + * + * @since 4.4.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param WP_Comment[] $comments Array of top-level comments whose descendants should be filled in. + * @return array + */ + protected function fill_descendants( $comments ) { + global $wpdb; + + $levels = array( + 0 => wp_list_pluck( $comments, 'comment_ID' ), + ); + + $key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) ); + $last_changed = wp_cache_get_last_changed( 'comment' ); + + // Fetch an entire level of the descendant tree at a time. + $level = 0; + $exclude_keys = array( 'parent', 'parent__in', 'parent__not_in' ); + do { + // Parent-child relationships may be cached. Only query for those that are not. + $child_ids = array(); + $uncached_parent_ids = array(); + $_parent_ids = $levels[ $level ]; + foreach ( $_parent_ids as $parent_id ) { + $cache_key = "get_comment_child_ids:$parent_id:$key:$last_changed"; + $parent_child_ids = wp_cache_get( $cache_key, 'comment' ); + if ( false !== $parent_child_ids ) { + $child_ids = array_merge( $child_ids, $parent_child_ids ); + } else { + $uncached_parent_ids[] = $parent_id; + } + } + + if ( $uncached_parent_ids ) { + // Fetch this level of comments. + $parent_query_args = $this->query_vars; + foreach ( $exclude_keys as $exclude_key ) { + $parent_query_args[ $exclude_key ] = ''; + } + $parent_query_args['parent__in'] = $uncached_parent_ids; + $parent_query_args['no_found_rows'] = true; + $parent_query_args['hierarchical'] = false; + $parent_query_args['offset'] = 0; + $parent_query_args['number'] = 0; + + $level_comments = get_comments( $parent_query_args ); + + // Cache parent-child relationships. + $parent_map = array_fill_keys( $uncached_parent_ids, array() ); + foreach ( $level_comments as $level_comment ) { + $parent_map[ $level_comment->comment_parent ][] = $level_comment->comment_ID; + $child_ids[] = $level_comment->comment_ID; + } + + foreach ( $parent_map as $parent_id => $children ) { + $cache_key = "get_comment_child_ids:$parent_id:$key:$last_changed"; + wp_cache_set( $cache_key, $children, 'comment' ); + } + } + + $level++; + $levels[ $level ] = $child_ids; + } while ( $child_ids ); + + // Prime comment caches for non-top-level comments. + $descendant_ids = array(); + for ( $i = 1, $c = count( $levels ); $i < $c; $i++ ) { + $descendant_ids = array_merge( $descendant_ids, $levels[ $i ] ); + } + + _prime_comment_caches( $descendant_ids, $this->query_vars['update_comment_meta_cache'] ); + + // Assemble a flat array of all comments + descendants. + $all_comments = $comments; + foreach ( $descendant_ids as $descendant_id ) { + $all_comments[] = get_comment( $descendant_id ); + } + + // If a threaded representation was requested, build the tree. + if ( 'threaded' === $this->query_vars['hierarchical'] ) { + $threaded_comments = array(); + $ref = array(); + foreach ( $all_comments as $k => $c ) { + $_c = get_comment( $c->comment_ID ); + + // If the comment isn't in the reference array, it goes in the top level of the thread. + if ( ! isset( $ref[ $c->comment_parent ] ) ) { + $threaded_comments[ $_c->comment_ID ] = $_c; + $ref[ $_c->comment_ID ] = $threaded_comments[ $_c->comment_ID ]; + + // Otherwise, set it as a child of its parent. + } else { + + $ref[ $_c->comment_parent ]->add_child( $_c ); + $ref[ $_c->comment_ID ] = $ref[ $_c->comment_parent ]->get_child( $_c->comment_ID ); + } + } + + // Set the 'populated_children' flag, to ensure additional database queries aren't run. + foreach ( $ref as $_ref ) { + $_ref->populated_children( true ); + } + + $comments = $threaded_comments; + } else { + $comments = $all_comments; + } + + return $comments; + } + + /** + * Used internally to generate an SQL string for searching across multiple columns + * + * @since 3.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $string + * @param array $cols + * @return string + */ + protected function get_search_sql( $string, $cols ) { + global $wpdb; + + $like = '%' . $wpdb->esc_like( $string ) . '%'; + + $searches = array(); + foreach ( $cols as $col ) { + $searches[] = $wpdb->prepare( "$col LIKE %s", $like ); + } + + return ' AND (' . implode( ' OR ', $searches ) . ')'; + } + + /** + * Parse and sanitize 'orderby' keys passed to the comment query. + * + * @since 4.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $orderby Alias for the field to order by. + * @return string|false Value to used in the ORDER clause. False otherwise. + */ + protected function parse_orderby( $orderby ) { + global $wpdb; + + $allowed_keys = array( + 'comment_agent', + 'comment_approved', + 'comment_author', + 'comment_author_email', + 'comment_author_IP', + 'comment_author_url', + 'comment_content', + 'comment_date', + 'comment_date_gmt', + 'comment_ID', + 'comment_karma', + 'comment_parent', + 'comment_post_ID', + 'comment_type', + 'user_id', + ); + + if ( ! empty( $this->query_vars['meta_key'] ) ) { + $allowed_keys[] = $this->query_vars['meta_key']; + $allowed_keys[] = 'meta_value'; + $allowed_keys[] = 'meta_value_num'; + } + + $meta_query_clauses = $this->meta_query->get_clauses(); + if ( $meta_query_clauses ) { + $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_query_clauses ) ); + } + + $parsed = false; + if ( $this->query_vars['meta_key'] === $orderby || 'meta_value' === $orderby ) { + $parsed = "$wpdb->commentmeta.meta_value"; + } elseif ( 'meta_value_num' === $orderby ) { + $parsed = "$wpdb->commentmeta.meta_value+0"; + } elseif ( 'comment__in' === $orderby ) { + $comment__in = implode( ',', array_map( 'absint', $this->query_vars['comment__in'] ) ); + $parsed = "FIELD( {$wpdb->comments}.comment_ID, $comment__in )"; + } elseif ( in_array( $orderby, $allowed_keys ) ) { + + if ( isset( $meta_query_clauses[ $orderby ] ) ) { + $meta_clause = $meta_query_clauses[ $orderby ]; + $parsed = sprintf( 'CAST(%s.meta_value AS %s)', esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) ); + } else { + $parsed = "$wpdb->comments.$orderby"; + } + } + + return $parsed; + } + + /** + * Parse an 'order' query variable and cast it to ASC or DESC as necessary. + * + * @since 4.2.0 + * + * @param string $order The 'order' query variable. + * @return string The sanitized 'order' query variable. + */ + protected function parse_order( $order ) { + if ( ! is_string( $order ) || empty( $order ) ) { + return 'DESC'; + } + + if ( 'ASC' === strtoupper( $order ) ) { + return 'ASC'; + } else { + return 'DESC'; + } + } +} diff --git a/wp-includes/class-wp-comment.php b/wp-includes/class-wp-comment.php new file mode 100644 index 0000000..70d7db2 --- /dev/null +++ b/wp-includes/class-wp-comment.php @@ -0,0 +1,368 @@ +<?php +/** + * Comment API: WP_Comment class + * + * @package WordPress + * @subpackage Comments + * @since 4.4.0 + */ + +/** + * Core class used to organize comments as instantiated objects with defined members. + * + * @since 4.4.0 + */ +final class WP_Comment { + + /** + * Comment ID. + * + * @since 4.4.0 + * @var int + */ + public $comment_ID; + + /** + * ID of the post the comment is associated with. + * + * @since 4.4.0 + * @var int + */ + public $comment_post_ID = 0; + + /** + * Comment author name. + * + * @since 4.4.0 + * @var string + */ + public $comment_author = ''; + + /** + * Comment author email address. + * + * @since 4.4.0 + * @var string + */ + public $comment_author_email = ''; + + /** + * Comment author URL. + * + * @since 4.4.0 + * @var string + */ + public $comment_author_url = ''; + + /** + * Comment author IP address (IPv4 format). + * + * @since 4.4.0 + * @var string + */ + public $comment_author_IP = ''; + + /** + * Comment date in YYYY-MM-DD HH:MM:SS format. + * + * @since 4.4.0 + * @var string + */ + public $comment_date = '0000-00-00 00:00:00'; + + /** + * Comment GMT date in YYYY-MM-DD HH::MM:SS format. + * + * @since 4.4.0 + * @var string + */ + public $comment_date_gmt = '0000-00-00 00:00:00'; + + /** + * Comment content. + * + * @since 4.4.0 + * @var string + */ + public $comment_content; + + /** + * Comment karma count. + * + * @since 4.4.0 + * @var int + */ + public $comment_karma = 0; + + /** + * Comment approval status. + * + * @since 4.4.0 + * @var string + */ + public $comment_approved = '1'; + + /** + * Comment author HTTP user agent. + * + * @since 4.4.0 + * @var string + */ + public $comment_agent = ''; + + /** + * Comment type. + * + * @since 4.4.0 + * @var string + */ + public $comment_type = ''; + + /** + * Parent comment ID. + * + * @since 4.4.0 + * @var int + */ + public $comment_parent = 0; + + /** + * Comment author ID. + * + * @since 4.4.0 + * @var int + */ + public $user_id = 0; + + /** + * Comment children. + * + * @since 4.4.0 + * @var array + */ + protected $children; + + /** + * Whether children have been populated for this comment object. + * + * @since 4.4.0 + * @var bool + */ + protected $populated_children = false; + + /** + * Post fields. + * + * @since 4.4.0 + * @var array + */ + protected $post_fields = array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_content_filtered', 'post_parent', 'guid', 'menu_order', 'post_type', 'post_mime_type', 'comment_count' ); + + /** + * Retrieves a WP_Comment instance. + * + * @since 4.4.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $id Comment ID. + * @return WP_Comment|false Comment object, otherwise false. + */ + public static function get_instance( $id ) { + global $wpdb; + + $comment_id = (int) $id; + if ( ! $comment_id ) { + return false; + } + + $_comment = wp_cache_get( $comment_id, 'comment' ); + + if ( ! $_comment ) { + $_comment = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment_id ) ); + + if ( ! $_comment ) { + return false; + } + + wp_cache_add( $_comment->comment_ID, $_comment, 'comment' ); + } + + return new WP_Comment( $_comment ); + } + + /** + * Constructor. + * + * Populates properties with object vars. + * + * @since 4.4.0 + * + * @param WP_Comment $comment Comment object. + */ + public function __construct( $comment ) { + foreach ( get_object_vars( $comment ) as $key => $value ) { + $this->$key = $value; + } + } + + /** + * Convert object to array. + * + * @since 4.4.0 + * + * @return array Object as array. + */ + public function to_array() { + return get_object_vars( $this ); + } + + /** + * Get the children of a comment. + * + * @since 4.4.0 + * + * @param array $args { + * Array of arguments used to pass to get_comments() and determine format. + * + * @type string $format Return value format. 'tree' for a hierarchical tree, 'flat' for a flattened array. + * Default 'tree'. + * @type string $status Comment status to limit results by. Accepts 'hold' (`comment_status=0`), + * 'approve' (`comment_status=1`), 'all', or a custom comment status. + * Default 'all'. + * @type string $hierarchical Whether to include comment descendants in the results. + * 'threaded' returns a tree, with each comment's children + * stored in a `children` property on the `WP_Comment` object. + * 'flat' returns a flat array of found comments plus their children. + * Pass `false` to leave out descendants. + * The parameter is ignored (forced to `false`) when `$fields` is 'ids' or 'counts'. + * Accepts 'threaded', 'flat', or false. Default: 'threaded'. + * @type string|array $orderby Comment status or array of statuses. To use 'meta_value' + * or 'meta_value_num', `$meta_key` must also be defined. + * To sort by a specific `$meta_query` clause, use that + * clause's array key. Accepts 'comment_agent', + * 'comment_approved', 'comment_author', + * 'comment_author_email', 'comment_author_IP', + * 'comment_author_url', 'comment_content', 'comment_date', + * 'comment_date_gmt', 'comment_ID', 'comment_karma', + * 'comment_parent', 'comment_post_ID', 'comment_type', + * 'user_id', 'comment__in', 'meta_value', 'meta_value_num', + * the value of $meta_key, and the array keys of + * `$meta_query`. Also accepts false, an empty array, or + * 'none' to disable `ORDER BY` clause. + * } + * @return WP_Comment[] Array of `WP_Comment` objects. + */ + public function get_children( $args = array() ) { + $defaults = array( + 'format' => 'tree', + 'status' => 'all', + 'hierarchical' => 'threaded', + 'orderby' => '', + ); + + $_args = wp_parse_args( $args, $defaults ); + $_args['parent'] = $this->comment_ID; + + if ( is_null( $this->children ) ) { + if ( $this->populated_children ) { + $this->children = array(); + } else { + $this->children = get_comments( $_args ); + } + } + + if ( 'flat' === $_args['format'] ) { + $children = array(); + foreach ( $this->children as $child ) { + $child_args = $_args; + $child_args['format'] = 'flat'; + // get_children() resets this value automatically. + unset( $child_args['parent'] ); + + $children = array_merge( $children, array( $child ), $child->get_children( $child_args ) ); + } + } else { + $children = $this->children; + } + + return $children; + } + + /** + * Add a child to the comment. + * + * Used by `WP_Comment_Query` when bulk-filling descendants. + * + * @since 4.4.0 + * + * @param WP_Comment $child Child comment. + */ + public function add_child( WP_Comment $child ) { + $this->children[ $child->comment_ID ] = $child; + } + + /** + * Get a child comment by ID. + * + * @since 4.4.0 + * + * @param int $child_id ID of the child. + * @return WP_Comment|bool Returns the comment object if found, otherwise false. + */ + public function get_child( $child_id ) { + if ( isset( $this->children[ $child_id ] ) ) { + return $this->children[ $child_id ]; + } + + return false; + } + + /** + * Set the 'populated_children' flag. + * + * This flag is important for ensuring that calling `get_children()` on a childless comment will not trigger + * unneeded database queries. + * + * @since 4.4.0 + * + * @param bool $set Whether the comment's children have already been populated. + */ + public function populated_children( $set ) { + $this->populated_children = (bool) $set; + } + + /** + * Check whether a non-public property is set. + * + * If `$name` matches a post field, the comment post will be loaded and the post's value checked. + * + * @since 4.4.0 + * + * @param string $name Property name. + * @return bool + */ + public function __isset( $name ) { + if ( in_array( $name, $this->post_fields ) && 0 !== (int) $this->comment_post_ID ) { + $post = get_post( $this->comment_post_ID ); + return property_exists( $post, $name ); + } + } + + /** + * Magic getter. + * + * If `$name` matches a post field, the comment post will be loaded and the post's value returned. + * + * @since 4.4.0 + * + * @param string $name + * @return mixed + */ + public function __get( $name ) { + if ( in_array( $name, $this->post_fields ) ) { + $post = get_post( $this->comment_post_ID ); + return $post->$name; + } + } +} diff --git a/wp-includes/class-wp-customize-control.php b/wp-includes/class-wp-customize-control.php new file mode 100644 index 0000000..f01d82b --- /dev/null +++ b/wp-includes/class-wp-customize-control.php @@ -0,0 +1,797 @@ +<?php +/** + * WordPress Customize Control classes + * + * @package WordPress + * @subpackage Customize + * @since 3.4.0 + */ + +/** + * Customize Control class. + * + * @since 3.4.0 + */ +class WP_Customize_Control { + + /** + * Incremented with each new class instantiation, then stored in $instance_number. + * + * Used when sorting two instances whose priorities are equal. + * + * @since 4.1.0 + * @var int + */ + protected static $instance_count = 0; + + /** + * Order in which this instance was created in relation to other instances. + * + * @since 4.1.0 + * @var int + */ + public $instance_number; + + /** + * Customizer manager. + * + * @since 3.4.0 + * @var WP_Customize_Manager + */ + public $manager; + + /** + * Control ID. + * + * @since 3.4.0 + * @var string + */ + public $id; + + /** + * All settings tied to the control. + * + * @since 3.4.0 + * @var array + */ + public $settings; + + /** + * The primary setting for the control (if there is one). + * + * @since 3.4.0 + * @var string + */ + public $setting = 'default'; + + /** + * Capability required to use this control. + * + * Normally this is empty and the capability is derived from the capabilities + * of the associated `$settings`. + * + * @since 4.5.0 + * @var string + */ + public $capability; + + /** + * Order priority to load the control in Customizer. + * + * @since 3.4.0 + * @var int + */ + public $priority = 10; + + /** + * Section the control belongs to. + * + * @since 3.4.0 + * @var string + */ + public $section = ''; + + /** + * Label for the control. + * + * @since 3.4.0 + * @var string + */ + public $label = ''; + + /** + * Description for the control. + * + * @since 4.0.0 + * @var string + */ + public $description = ''; + + /** + * List of choices for 'radio' or 'select' type controls, where values are the keys, and labels are the values. + * + * @since 3.4.0 + * @var array + */ + public $choices = array(); + + /** + * List of custom input attributes for control output, where attribute names are the keys and values are the values. + * + * Not used for 'checkbox', 'radio', 'select', 'textarea', or 'dropdown-pages' control types. + * + * @since 4.0.0 + * @var array + */ + public $input_attrs = array(); + + /** + * Show UI for adding new content, currently only used for the dropdown-pages control. + * + * @since 4.7.0 + * @var bool + */ + public $allow_addition = false; + + /** + * @deprecated It is better to just call the json() method + * @since 3.4.0 + * @var array + */ + public $json = array(); + + /** + * Control's Type. + * + * @since 3.4.0 + * @var string + */ + public $type = 'text'; + + /** + * Callback. + * + * @since 4.0.0 + * + * @see WP_Customize_Control::active() + * + * @var callable Callback is called with one argument, the instance of + * WP_Customize_Control, and returns bool to indicate whether + * the control is active (such as it relates to the URL + * currently being previewed). + */ + public $active_callback = ''; + + /** + * Constructor. + * + * Supplied `$args` override class property defaults. + * + * If `$args['settings']` is not defined, use the $id as the setting ID. + * + * @since 3.4.0 + * + * @param WP_Customize_Manager $manager Customizer bootstrap instance. + * @param string $id Control ID. + * @param array $args { + * Optional. Array of properties for the new Control object. Default empty array. + * + * @type int $instance_number Order in which this instance was created in relation + * to other instances. + * @type WP_Customize_Manager $manager Customizer bootstrap instance. + * @type string $id Control ID. + * @type array $settings All settings tied to the control. If undefined, `$id` will + * be used. + * @type string $setting The primary setting for the control (if there is one). + * Default 'default'. + * @type string $capability Capability required to use this control. Normally this is empty + * and the capability is derived from `$settings`. + * @type int $priority Order priority to load the control. Default 10. + * @type string $section Section the control belongs to. Default empty. + * @type string $label Label for the control. Default empty. + * @type string $description Description for the control. Default empty. + * @type array $choices List of choices for 'radio' or 'select' type controls, where + * values are the keys, and labels are the values. + * Default empty array. + * @type array $input_attrs List of custom input attributes for control output, where + * attribute names are the keys and values are the values. Not + * used for 'checkbox', 'radio', 'select', 'textarea', or + * 'dropdown-pages' control types. Default empty array. + * @type bool $allow_addition Show UI for adding new content, currently only used for the + * dropdown-pages control. Default false. + * @type array $json Deprecated. Use WP_Customize_Control::json() instead. + * @type string $type Control type. Core controls include 'text', 'checkbox', + * 'textarea', 'radio', 'select', and 'dropdown-pages'. Additional + * input types such as 'email', 'url', 'number', 'hidden', and + * 'date' are supported implicitly. Default 'text'. + * @type callback $active_callback Active callback. + * } + */ + public function __construct( $manager, $id, $args = array() ) { + $keys = array_keys( get_object_vars( $this ) ); + foreach ( $keys as $key ) { + if ( isset( $args[ $key ] ) ) { + $this->$key = $args[ $key ]; + } + } + + $this->manager = $manager; + $this->id = $id; + if ( empty( $this->active_callback ) ) { + $this->active_callback = array( $this, 'active_callback' ); + } + self::$instance_count += 1; + $this->instance_number = self::$instance_count; + + // Process settings. + if ( ! isset( $this->settings ) ) { + $this->settings = $id; + } + + $settings = array(); + if ( is_array( $this->settings ) ) { + foreach ( $this->settings as $key => $setting ) { + $settings[ $key ] = $this->manager->get_setting( $setting ); + } + } elseif ( is_string( $this->settings ) ) { + $this->setting = $this->manager->get_setting( $this->settings ); + $settings['default'] = $this->setting; + } + $this->settings = $settings; + } + + /** + * Enqueue control related scripts/styles. + * + * @since 3.4.0 + */ + public function enqueue() {} + + /** + * Check whether control is active to current Customizer preview. + * + * @since 4.0.0 + * + * @return bool Whether the control is active to the current preview. + */ + final public function active() { + $control = $this; + $active = call_user_func( $this->active_callback, $this ); + + /** + * Filters response of WP_Customize_Control::active(). + * + * @since 4.0.0 + * + * @param bool $active Whether the Customizer control is active. + * @param WP_Customize_Control $control WP_Customize_Control instance. + */ + $active = apply_filters( 'customize_control_active', $active, $control ); + + return $active; + } + + /** + * Default callback used when invoking WP_Customize_Control::active(). + * + * Subclasses can override this with their specific logic, or they may + * provide an 'active_callback' argument to the constructor. + * + * @since 4.0.0 + * + * @return true Always true. + */ + public function active_callback() { + return true; + } + + /** + * Fetch a setting's value. + * Grabs the main setting by default. + * + * @since 3.4.0 + * + * @param string $setting_key + * @return mixed The requested setting's value, if the setting exists. + */ + final public function value( $setting_key = 'default' ) { + if ( isset( $this->settings[ $setting_key ] ) ) { + return $this->settings[ $setting_key ]->value(); + } + } + + /** + * Refresh the parameters passed to the JavaScript via JSON. + * + * @since 3.4.0 + */ + public function to_json() { + $this->json['settings'] = array(); + foreach ( $this->settings as $key => $setting ) { + $this->json['settings'][ $key ] = $setting->id; + } + + $this->json['type'] = $this->type; + $this->json['priority'] = $this->priority; + $this->json['active'] = $this->active(); + $this->json['section'] = $this->section; + $this->json['content'] = $this->get_content(); + $this->json['label'] = $this->label; + $this->json['description'] = $this->description; + $this->json['instanceNumber'] = $this->instance_number; + + if ( 'dropdown-pages' === $this->type ) { + $this->json['allow_addition'] = $this->allow_addition; + } + } + + /** + * Get the data to export to the client via JSON. + * + * @since 4.1.0 + * + * @return array Array of parameters passed to the JavaScript. + */ + public function json() { + $this->to_json(); + return $this->json; + } + + /** + * Checks if the user can use this control. + * + * Returns false if the user cannot manipulate one of the associated settings, + * or if one of the associated settings does not exist. Also returns false if + * the associated section does not exist or if its capability check returns + * false. + * + * @since 3.4.0 + * + * @return bool False if theme doesn't support the control or user doesn't have the required permissions, otherwise true. + */ + final public function check_capabilities() { + if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) { + return false; + } + + foreach ( $this->settings as $setting ) { + if ( ! $setting || ! $setting->check_capabilities() ) { + return false; + } + } + + $section = $this->manager->get_section( $this->section ); + if ( isset( $section ) && ! $section->check_capabilities() ) { + return false; + } + + return true; + } + + /** + * Get the control's content for insertion into the Customizer pane. + * + * @since 4.1.0 + * + * @return string Contents of the control. + */ + final public function get_content() { + ob_start(); + $this->maybe_render(); + return trim( ob_get_clean() ); + } + + /** + * Check capabilities and render the control. + * + * @since 3.4.0 + * @uses WP_Customize_Control::render() + */ + final public function maybe_render() { + if ( ! $this->check_capabilities() ) { + return; + } + + /** + * Fires just before the current Customizer control is rendered. + * + * @since 3.4.0 + * + * @param WP_Customize_Control $this WP_Customize_Control instance. + */ + do_action( 'customize_render_control', $this ); + + /** + * Fires just before a specific Customizer control is rendered. + * + * The dynamic portion of the hook name, `$this->id`, refers to + * the control ID. + * + * @since 3.4.0 + * + * @param WP_Customize_Control $this WP_Customize_Control instance. + */ + do_action( "customize_render_control_{$this->id}", $this ); + + $this->render(); + } + + /** + * Renders the control wrapper and calls $this->render_content() for the internals. + * + * @since 3.4.0 + */ + protected function render() { + $id = 'customize-control-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id ); + $class = 'customize-control customize-control-' . $this->type; + + printf( '<li id="%s" class="%s">', esc_attr( $id ), esc_attr( $class ) ); + $this->render_content(); + echo '</li>'; + } + + /** + * Get the data link attribute for a setting. + * + * @since 3.4.0 + * @since 4.9.0 Return a `data-customize-setting-key-link` attribute if a setting is not registered for the supplied setting key. + * + * @param string $setting_key + * @return string Data link parameter, a `data-customize-setting-link` attribute if the `$setting_key` refers to a pre-registered setting, + * and a `data-customize-setting-key-link` attribute if the setting is not yet registered. + */ + public function get_link( $setting_key = 'default' ) { + if ( isset( $this->settings[ $setting_key ] ) && $this->settings[ $setting_key ] instanceof WP_Customize_Setting ) { + return 'data-customize-setting-link="' . esc_attr( $this->settings[ $setting_key ]->id ) . '"'; + } else { + return 'data-customize-setting-key-link="' . esc_attr( $setting_key ) . '"'; + } + } + + /** + * Render the data link attribute for the control's input element. + * + * @since 3.4.0 + * @uses WP_Customize_Control::get_link() + * + * @param string $setting_key + */ + public function link( $setting_key = 'default' ) { + echo $this->get_link( $setting_key ); + } + + /** + * Render the custom attributes for the control's input element. + * + * @since 4.0.0 + */ + public function input_attrs() { + foreach ( $this->input_attrs as $attr => $value ) { + echo $attr . '="' . esc_attr( $value ) . '" '; + } + } + + /** + * Render the control's content. + * + * Allows the content to be overridden without having to rewrite the wrapper in `$this::render()`. + * + * Supports basic input types `text`, `checkbox`, `textarea`, `radio`, `select` and `dropdown-pages`. + * Additional input types such as `email`, `url`, `number`, `hidden` and `date` are supported implicitly. + * + * Control content can alternately be rendered in JS. See WP_Customize_Control::print_template(). + * + * @since 3.4.0 + */ + protected function render_content() { + $input_id = '_customize-input-' . $this->id; + $description_id = '_customize-description-' . $this->id; + $describedby_attr = ( ! empty( $this->description ) ) ? ' aria-describedby="' . esc_attr( $description_id ) . '" ' : ''; + switch ( $this->type ) { + case 'checkbox': + ?> + <span class="customize-inside-control-row"> + <input + id="<?php echo esc_attr( $input_id ); ?>" + <?php echo $describedby_attr; ?> + type="checkbox" + value="<?php echo esc_attr( $this->value() ); ?>" + <?php $this->link(); ?> + <?php checked( $this->value() ); ?> + /> + <label for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_html( $this->label ); ?></label> + <?php if ( ! empty( $this->description ) ) : ?> + <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> + <?php endif; ?> + </span> + <?php + break; + case 'radio': + if ( empty( $this->choices ) ) { + return; + } + + $name = '_customize-radio-' . $this->id; + ?> + <?php if ( ! empty( $this->label ) ) : ?> + <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> + <?php endif; ?> + <?php if ( ! empty( $this->description ) ) : ?> + <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> + <?php endif; ?> + + <?php foreach ( $this->choices as $value => $label ) : ?> + <span class="customize-inside-control-row"> + <input + id="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>" + type="radio" + <?php echo $describedby_attr; ?> + value="<?php echo esc_attr( $value ); ?>" + name="<?php echo esc_attr( $name ); ?>" + <?php $this->link(); ?> + <?php checked( $this->value(), $value ); ?> + /> + <label for="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>"><?php echo esc_html( $label ); ?></label> + </span> + <?php endforeach; ?> + <?php + break; + case 'select': + if ( empty( $this->choices ) ) { + return; + } + + ?> + <?php if ( ! empty( $this->label ) ) : ?> + <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> + <?php endif; ?> + <?php if ( ! empty( $this->description ) ) : ?> + <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> + <?php endif; ?> + + <select id="<?php echo esc_attr( $input_id ); ?>" <?php echo $describedby_attr; ?> <?php $this->link(); ?>> + <?php + foreach ( $this->choices as $value => $label ) { + echo '<option value="' . esc_attr( $value ) . '"' . selected( $this->value(), $value, false ) . '>' . $label . '</option>'; + } + ?> + </select> + <?php + break; + case 'textarea': + ?> + <?php if ( ! empty( $this->label ) ) : ?> + <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> + <?php endif; ?> + <?php if ( ! empty( $this->description ) ) : ?> + <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> + <?php endif; ?> + <textarea + id="<?php echo esc_attr( $input_id ); ?>" + rows="5" + <?php echo $describedby_attr; ?> + <?php $this->input_attrs(); ?> + <?php $this->link(); ?> + ><?php echo esc_textarea( $this->value() ); ?></textarea> + <?php + break; + case 'dropdown-pages': + ?> + <?php if ( ! empty( $this->label ) ) : ?> + <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> + <?php endif; ?> + <?php if ( ! empty( $this->description ) ) : ?> + <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> + <?php endif; ?> + + <?php + $dropdown_name = '_customize-dropdown-pages-' . $this->id; + $show_option_none = __( '— Select —' ); + $option_none_value = '0'; + $dropdown = wp_dropdown_pages( + array( + 'name' => $dropdown_name, + 'echo' => 0, + 'show_option_none' => $show_option_none, + 'option_none_value' => $option_none_value, + 'selected' => $this->value(), + ) + ); + if ( empty( $dropdown ) ) { + $dropdown = sprintf( '<select id="%1$s" name="%1$s">', esc_attr( $dropdown_name ) ); + $dropdown .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $option_none_value ), esc_html( $show_option_none ) ); + $dropdown .= '</select>'; + } + + // Hackily add in the data link parameter. + $dropdown = str_replace( '<select', '<select ' . $this->get_link() . ' id="' . esc_attr( $input_id ) . '" ' . $describedby_attr, $dropdown ); + + // Even more hacikly add auto-draft page stubs. + // @todo Eventually this should be removed in favor of the pages being injected into the underlying get_pages() call. See <https://github.com/xwp/wp-customize-posts/pull/250>. + $nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' ); + if ( $nav_menus_created_posts_setting && current_user_can( 'publish_pages' ) ) { + $auto_draft_page_options = ''; + foreach ( $nav_menus_created_posts_setting->value() as $auto_draft_page_id ) { + $post = get_post( $auto_draft_page_id ); + if ( $post && 'page' === $post->post_type ) { + $auto_draft_page_options .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $post->ID ), esc_html( $post->post_title ) ); + } + } + if ( $auto_draft_page_options ) { + $dropdown = str_replace( '</select>', $auto_draft_page_options . '</select>', $dropdown ); + } + } + + echo $dropdown; + ?> + <?php if ( $this->allow_addition && current_user_can( 'publish_pages' ) && current_user_can( 'edit_theme_options' ) ) : // Currently tied to menus functionality. ?> + <button type="button" class="button-link add-new-toggle"> + <?php + /* translators: %s: Add New Page label. */ + printf( __( '+ %s' ), get_post_type_object( 'page' )->labels->add_new_item ); + ?> + </button> + <div class="new-content-item"> + <label for="create-input-<?php echo $this->id; ?>"><span class="screen-reader-text"><?php _e( 'New page title' ); ?></span></label> + <input type="text" id="create-input-<?php echo $this->id; ?>" class="create-item-input" placeholder="<?php esc_attr_e( 'New page title…' ); ?>"> + <button type="button" class="button add-content"><?php _e( 'Add' ); ?></button> + </div> + <?php endif; ?> + <?php + break; + default: + ?> + <?php if ( ! empty( $this->label ) ) : ?> + <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> + <?php endif; ?> + <?php if ( ! empty( $this->description ) ) : ?> + <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> + <?php endif; ?> + <input + id="<?php echo esc_attr( $input_id ); ?>" + type="<?php echo esc_attr( $this->type ); ?>" + <?php echo $describedby_attr; ?> + <?php $this->input_attrs(); ?> + <?php if ( ! isset( $this->input_attrs['value'] ) ) : ?> + value="<?php echo esc_attr( $this->value() ); ?>" + <?php endif; ?> + <?php $this->link(); ?> + /> + <?php + break; + } + } + + /** + * Render the control's JS template. + * + * This function is only run for control types that have been registered with + * WP_Customize_Manager::register_control_type(). + * + * In the future, this will also print the template for the control's container + * element and be override-able. + * + * @since 4.1.0 + */ + final public function print_template() { + ?> + <script type="text/html" id="tmpl-customize-control-<?php echo $this->type; ?>-content"> + <?php $this->content_template(); ?> + </script> + <?php + } + + /** + * An Underscore (JS) template for this control's content (but not its container). + * + * Class variables for this control class are available in the `data` JS object; + * export custom variables by overriding WP_Customize_Control::to_json(). + * + * @see WP_Customize_Control::print_template() + * + * @since 4.1.0 + */ + protected function content_template() {} + +} + +/** + * WP_Customize_Color_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php'; + +/** + * WP_Customize_Media_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php'; + +/** + * WP_Customize_Upload_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php'; + +/** + * WP_Customize_Image_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php'; + +/** + * WP_Customize_Background_Image_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php'; + +/** + * WP_Customize_Background_Position_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-position-control.php'; + +/** + * WP_Customize_Cropped_Image_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php'; + +/** + * WP_Customize_Site_Icon_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php'; + +/** + * WP_Customize_Header_Image_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php'; + +/** + * WP_Customize_Theme_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php'; + +/** + * WP_Widget_Area_Customize_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php'; + +/** + * WP_Widget_Form_Customize_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php'; + +/** + * WP_Customize_Nav_Menu_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php'; + +/** + * WP_Customize_Nav_Menu_Item_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php'; + +/** + * WP_Customize_Nav_Menu_Location_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php'; + +/** + * WP_Customize_Nav_Menu_Name_Control class. + * + * As this file is deprecated, it will trigger a deprecation notice if instantiated. In a subsequent + * release, the require_once here will be removed and _deprecated_file() will be called if file is + * required at all. + * + * @deprecated 4.9.0 This file is no longer used due to new menu creation UX. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php'; + +/** + * WP_Customize_Nav_Menu_Locations_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-locations-control.php'; + +/** + * WP_Customize_Nav_Menu_Auto_Add_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php'; + +/** + * WP_Customize_Date_Time_Control class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-date-time-control.php'; diff --git a/wp-includes/class-wp-customize-manager.php b/wp-includes/class-wp-customize-manager.php new file mode 100644 index 0000000..b06d46f --- /dev/null +++ b/wp-includes/class-wp-customize-manager.php @@ -0,0 +1,6065 @@ +<?php +/** + * WordPress Customize Manager classes + * + * @package WordPress + * @subpackage Customize + * @since 3.4.0 + */ + +/** + * Customize Manager class. + * + * Bootstraps the Customize experience on the server-side. + * + * Sets up the theme-switching process if a theme other than the active one is + * being previewed and customized. + * + * Serves as a factory for Customize Controls and Settings, and + * instantiates default Customize Controls and Settings. + * + * @since 3.4.0 + */ +final class WP_Customize_Manager { + /** + * An instance of the theme being previewed. + * + * @since 3.4.0 + * @var WP_Theme + */ + protected $theme; + + /** + * The directory name of the previously active theme (within the theme_root). + * + * @since 3.4.0 + * @var string + */ + protected $original_stylesheet; + + /** + * Whether this is a Customizer pageload. + * + * @since 3.4.0 + * @var bool + */ + protected $previewing = false; + + /** + * Methods and properties dealing with managing widgets in the Customizer. + * + * @since 3.9.0 + * @var WP_Customize_Widgets + */ + public $widgets; + + /** + * Methods and properties dealing with managing nav menus in the Customizer. + * + * @since 4.3.0 + * @var WP_Customize_Nav_Menus + */ + public $nav_menus; + + /** + * Methods and properties dealing with selective refresh in the Customizer preview. + * + * @since 4.5.0 + * @var WP_Customize_Selective_Refresh + */ + public $selective_refresh; + + /** + * Registered instances of WP_Customize_Setting. + * + * @since 3.4.0 + * @var array + */ + protected $settings = array(); + + /** + * Sorted top-level instances of WP_Customize_Panel and WP_Customize_Section. + * + * @since 4.0.0 + * @var array + */ + protected $containers = array(); + + /** + * Registered instances of WP_Customize_Panel. + * + * @since 4.0.0 + * @var array + */ + protected $panels = array(); + + /** + * List of core components. + * + * @since 4.5.0 + * @var array + */ + protected $components = array( 'widgets', 'nav_menus' ); + + /** + * Registered instances of WP_Customize_Section. + * + * @since 3.4.0 + * @var array + */ + protected $sections = array(); + + /** + * Registered instances of WP_Customize_Control. + * + * @since 3.4.0 + * @var array + */ + protected $controls = array(); + + /** + * Panel types that may be rendered from JS templates. + * + * @since 4.3.0 + * @var array + */ + protected $registered_panel_types = array(); + + /** + * Section types that may be rendered from JS templates. + * + * @since 4.3.0 + * @var array + */ + protected $registered_section_types = array(); + + /** + * Control types that may be rendered from JS templates. + * + * @since 4.1.0 + * @var array + */ + protected $registered_control_types = array(); + + /** + * Initial URL being previewed. + * + * @since 4.4.0 + * @var string + */ + protected $preview_url; + + /** + * URL to link the user to when closing the Customizer. + * + * @since 4.4.0 + * @var string + */ + protected $return_url; + + /** + * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused. + * + * @since 4.4.0 + * @var array + */ + protected $autofocus = array(); + + /** + * Messenger channel. + * + * @since 4.7.0 + * @var string + */ + protected $messenger_channel; + + /** + * Whether the autosave revision of the changeset should be loaded. + * + * @since 4.9.0 + * @var bool + */ + protected $autosaved = false; + + /** + * Whether the changeset branching is allowed. + * + * @since 4.9.0 + * @var bool + */ + protected $branching = true; + + /** + * Whether settings should be previewed. + * + * @since 4.9.0 + * @var bool + */ + protected $settings_previewed = true; + + /** + * Whether a starter content changeset was saved. + * + * @since 4.9.0 + * @var bool + */ + protected $saved_starter_content_changeset = false; + + /** + * Unsanitized values for Customize Settings parsed from $_POST['customized']. + * + * @var array + */ + private $_post_values; + + /** + * Changeset UUID. + * + * @since 4.7.0 + * @var string + */ + private $_changeset_uuid; + + /** + * Changeset post ID. + * + * @since 4.7.0 + * @var int|false + */ + private $_changeset_post_id; + + /** + * Changeset data loaded from a customize_changeset post. + * + * @since 4.7.0 + * @var array|null + */ + private $_changeset_data; + + /** + * Constructor. + * + * @since 3.4.0 + * @since 4.7.0 Added `$args` parameter. + * + * @param array $args { + * Args. + * + * @type null|string|false $changeset_uuid Changeset UUID, the `post_name` for the customize_changeset post containing the customized state. + * Defaults to `null` resulting in a UUID to be immediately generated. If `false` is provided, then + * then the changeset UUID will be determined during `after_setup_theme`: when the + * `customize_changeset_branching` filter returns false, then the default UUID will be that + * of the most recent `customize_changeset` post that has a status other than 'auto-draft', + * 'publish', or 'trash'. Otherwise, if changeset branching is enabled, then a random UUID will be used. + * @type string $theme Theme to be previewed (for theme switch). Defaults to customize_theme or theme query params. + * @type string $messenger_channel Messenger channel. Defaults to customize_messenger_channel query param. + * @type bool $settings_previewed If settings should be previewed. Defaults to true. + * @type bool $branching If changeset branching is allowed; otherwise, changesets are linear. Defaults to true. + * @type bool $autosaved If data from a changeset's autosaved revision should be loaded if it exists. Defaults to false. + * } + */ + public function __construct( $args = array() ) { + + $args = array_merge( + array_fill_keys( array( 'changeset_uuid', 'theme', 'messenger_channel', 'settings_previewed', 'autosaved', 'branching' ), null ), + $args + ); + + // Note that the UUID format will be validated in the setup_theme() method. + if ( ! isset( $args['changeset_uuid'] ) ) { + $args['changeset_uuid'] = wp_generate_uuid4(); + } + + // The theme and messenger_channel should be supplied via $args, + // but they are also looked at in the $_REQUEST global here for back-compat. + if ( ! isset( $args['theme'] ) ) { + if ( isset( $_REQUEST['customize_theme'] ) ) { + $args['theme'] = wp_unslash( $_REQUEST['customize_theme'] ); + } elseif ( isset( $_REQUEST['theme'] ) ) { // Deprecated. + $args['theme'] = wp_unslash( $_REQUEST['theme'] ); + } + } + if ( ! isset( $args['messenger_channel'] ) && isset( $_REQUEST['customize_messenger_channel'] ) ) { + $args['messenger_channel'] = sanitize_key( wp_unslash( $_REQUEST['customize_messenger_channel'] ) ); + } + + $this->original_stylesheet = get_stylesheet(); + $this->theme = wp_get_theme( 0 === validate_file( $args['theme'] ) ? $args['theme'] : null ); + $this->messenger_channel = $args['messenger_channel']; + $this->_changeset_uuid = $args['changeset_uuid']; + + foreach ( array( 'settings_previewed', 'autosaved', 'branching' ) as $key ) { + if ( isset( $args[ $key ] ) ) { + $this->$key = (bool) $args[ $key ]; + } + } + + require_once ABSPATH . WPINC . '/class-wp-customize-setting.php'; + require_once ABSPATH . WPINC . '/class-wp-customize-panel.php'; + require_once ABSPATH . WPINC . '/class-wp-customize-section.php'; + require_once ABSPATH . WPINC . '/class-wp-customize-control.php'; + + require_once ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-position-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-code-editor-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-locations-control.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php'; + + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php'; + + require_once ABSPATH . WPINC . '/customize/class-wp-customize-themes-panel.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-themes-section.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-sidebar-section.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-section.php'; + + require_once ABSPATH . WPINC . '/customize/class-wp-customize-custom-css-setting.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-filter-setting.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-setting.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-setting.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-setting.php'; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-setting.php'; + + /** + * Filters the core Customizer components to load. + * + * This allows Core components to be excluded from being instantiated by + * filtering them out of the array. Note that this filter generally runs + * during the {@see 'plugins_loaded'} action, so it cannot be added + * in a theme. + * + * @since 4.4.0 + * + * @see WP_Customize_Manager::__construct() + * + * @param string[] $components Array of core components to load. + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + $components = apply_filters( 'customize_loaded_components', $this->components, $this ); + + require_once ABSPATH . WPINC . '/customize/class-wp-customize-selective-refresh.php'; + $this->selective_refresh = new WP_Customize_Selective_Refresh( $this ); + + if ( in_array( 'widgets', $components, true ) ) { + require_once ABSPATH . WPINC . '/class-wp-customize-widgets.php'; + $this->widgets = new WP_Customize_Widgets( $this ); + } + + if ( in_array( 'nav_menus', $components, true ) ) { + require_once ABSPATH . WPINC . '/class-wp-customize-nav-menus.php'; + $this->nav_menus = new WP_Customize_Nav_Menus( $this ); + } + + add_action( 'setup_theme', array( $this, 'setup_theme' ) ); + add_action( 'wp_loaded', array( $this, 'wp_loaded' ) ); + + // Do not spawn cron (especially the alternate cron) while running the Customizer. + remove_action( 'init', 'wp_cron' ); + + // Do not run update checks when rendering the controls. + remove_action( 'admin_init', '_maybe_update_core' ); + remove_action( 'admin_init', '_maybe_update_plugins' ); + remove_action( 'admin_init', '_maybe_update_themes' ); + + add_action( 'wp_ajax_customize_save', array( $this, 'save' ) ); + add_action( 'wp_ajax_customize_trash', array( $this, 'handle_changeset_trash_request' ) ); + add_action( 'wp_ajax_customize_refresh_nonces', array( $this, 'refresh_nonces' ) ); + add_action( 'wp_ajax_customize_load_themes', array( $this, 'handle_load_themes_request' ) ); + add_filter( 'heartbeat_settings', array( $this, 'add_customize_screen_to_heartbeat_settings' ) ); + add_filter( 'heartbeat_received', array( $this, 'check_changeset_lock_with_heartbeat' ), 10, 3 ); + add_action( 'wp_ajax_customize_override_changeset_lock', array( $this, 'handle_override_changeset_lock_request' ) ); + add_action( 'wp_ajax_customize_dismiss_autosave_or_lock', array( $this, 'handle_dismiss_autosave_or_lock_request' ) ); + + add_action( 'customize_register', array( $this, 'register_controls' ) ); + add_action( 'customize_register', array( $this, 'register_dynamic_settings' ), 11 ); // Allow code to create settings first. + add_action( 'customize_controls_init', array( $this, 'prepare_controls' ) ); + add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_control_scripts' ) ); + + // Render Common, Panel, Section, and Control templates. + add_action( 'customize_controls_print_footer_scripts', array( $this, 'render_panel_templates' ), 1 ); + add_action( 'customize_controls_print_footer_scripts', array( $this, 'render_section_templates' ), 1 ); + add_action( 'customize_controls_print_footer_scripts', array( $this, 'render_control_templates' ), 1 ); + + // Export header video settings with the partial response. + add_filter( 'customize_render_partials_response', array( $this, 'export_header_video_settings' ), 10, 3 ); + + // Export the settings to JS via the _wpCustomizeSettings variable. + add_action( 'customize_controls_print_footer_scripts', array( $this, 'customize_pane_settings' ), 1000 ); + + // Add theme update notices. + if ( current_user_can( 'install_themes' ) || current_user_can( 'update_themes' ) ) { + require_once ABSPATH . 'wp-admin/includes/update.php'; + add_action( 'customize_controls_print_footer_scripts', 'wp_print_admin_notice_templates' ); + } + } + + /** + * Return true if it's an Ajax request. + * + * @since 3.4.0 + * @since 4.2.0 Added `$action` param. + * + * @param string|null $action Whether the supplied Ajax action is being run. + * @return bool True if it's an Ajax request, false otherwise. + */ + public function doing_ajax( $action = null ) { + if ( ! wp_doing_ajax() ) { + return false; + } + + if ( ! $action ) { + return true; + } else { + /* + * Note: we can't just use doing_action( "wp_ajax_{$action}" ) because we need + * to check before admin-ajax.php gets to that point. + */ + return isset( $_REQUEST['action'] ) && wp_unslash( $_REQUEST['action'] ) === $action; + } + } + + /** + * Custom wp_die wrapper. Returns either the standard message for UI + * or the Ajax message. + * + * @since 3.4.0 + * + * @param string|WP_Error $ajax_message Ajax return. + * @param string $message Optional. UI message. + */ + protected function wp_die( $ajax_message, $message = null ) { + if ( $this->doing_ajax() ) { + wp_die( $ajax_message ); + } + + if ( ! $message ) { + $message = __( 'Something went wrong.' ); + } + + if ( $this->messenger_channel ) { + ob_start(); + wp_enqueue_scripts(); + wp_print_scripts( array( 'customize-base' ) ); + + $settings = array( + 'messengerArgs' => array( + 'channel' => $this->messenger_channel, + 'url' => wp_customize_url(), + ), + 'error' => $ajax_message, + ); + ?> + <script> + ( function( api, settings ) { + var preview = new api.Messenger( settings.messengerArgs ); + preview.send( 'iframe-loading-error', settings.error ); + } )( wp.customize, <?php echo wp_json_encode( $settings ); ?> ); + </script> + <?php + $message .= ob_get_clean(); + } + + wp_die( $message ); + } + + /** + * Return the Ajax wp_die() handler if it's a customized request. + * + * @since 3.4.0 + * @deprecated 4.7.0 + * + * @return callable Die handler. + */ + public function wp_die_handler() { + _deprecated_function( __METHOD__, '4.7.0' ); + + if ( $this->doing_ajax() || isset( $_POST['customized'] ) ) { + return '_ajax_wp_die_handler'; + } + + return '_default_wp_die_handler'; + } + + /** + * Start preview and customize theme. + * + * Check if customize query variable exist. Init filters to filter the current theme. + * + * @since 3.4.0 + * + * @global string $pagenow + */ + public function setup_theme() { + global $pagenow; + + // Check permissions for customize.php access since this method is called before customize.php can run any code. + if ( 'customize.php' === $pagenow && ! current_user_can( 'customize' ) ) { + if ( ! is_user_logged_in() ) { + auth_redirect(); + } else { + wp_die( + '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . + '<p>' . __( 'Sorry, you are not allowed to customize this site.' ) . '</p>', + 403 + ); + } + return; + } + + // If a changeset was provided is invalid. + if ( isset( $this->_changeset_uuid ) && false !== $this->_changeset_uuid && ! wp_is_uuid( $this->_changeset_uuid ) ) { + $this->wp_die( -1, __( 'Invalid changeset UUID' ) ); + } + + /* + * Clear incoming post data if the user lacks a CSRF token (nonce). Note that the customizer + * application will inject the customize_preview_nonce query parameter into all Ajax requests. + * For similar behavior elsewhere in WordPress, see rest_cookie_check_errors() which logs out + * a user when a valid nonce isn't present. + */ + $has_post_data_nonce = ( + check_ajax_referer( 'preview-customize_' . $this->get_stylesheet(), 'nonce', false ) + || + check_ajax_referer( 'save-customize_' . $this->get_stylesheet(), 'nonce', false ) + || + check_ajax_referer( 'preview-customize_' . $this->get_stylesheet(), 'customize_preview_nonce', false ) + ); + if ( ! current_user_can( 'customize' ) || ! $has_post_data_nonce ) { + unset( $_POST['customized'] ); + unset( $_REQUEST['customized'] ); + } + + /* + * If unauthenticated then require a valid changeset UUID to load the preview. + * In this way, the UUID serves as a secret key. If the messenger channel is present, + * then send unauthenticated code to prompt re-auth. + */ + if ( ! current_user_can( 'customize' ) && ! $this->changeset_post_id() ) { + $this->wp_die( $this->messenger_channel ? 0 : -1, __( 'Non-existent changeset UUID.' ) ); + } + + if ( ! headers_sent() ) { + send_origin_headers(); + } + + // Hide the admin bar if we're embedded in the customizer iframe. + if ( $this->messenger_channel ) { + show_admin_bar( false ); + } + + if ( $this->is_theme_active() ) { + // Once the theme is loaded, we'll validate it. + add_action( 'after_setup_theme', array( $this, 'after_setup_theme' ) ); + } else { + // If the requested theme is not the active theme and the user doesn't have + // the switch_themes cap, bail. + if ( ! current_user_can( 'switch_themes' ) ) { + $this->wp_die( -1, __( 'Sorry, you are not allowed to edit theme options on this site.' ) ); + } + + // If the theme has errors while loading, bail. + if ( $this->theme()->errors() ) { + $this->wp_die( -1, $this->theme()->errors()->get_error_message() ); + } + + // If the theme isn't allowed per multisite settings, bail. + if ( ! $this->theme()->is_allowed() ) { + $this->wp_die( -1, __( 'The requested theme does not exist.' ) ); + } + } + + // Make sure changeset UUID is established immediately after the theme is loaded. + add_action( 'after_setup_theme', array( $this, 'establish_loaded_changeset' ), 5 ); + + /* + * Import theme starter content for fresh installations when landing in the customizer. + * Import starter content at after_setup_theme:100 so that any + * add_theme_support( 'starter-content' ) calls will have been made. + */ + if ( get_option( 'fresh_site' ) && 'customize.php' === $pagenow ) { + add_action( 'after_setup_theme', array( $this, 'import_theme_starter_content' ), 100 ); + } + + $this->start_previewing_theme(); + } + + /** + * Establish the loaded changeset. + * + * This method runs right at after_setup_theme and applies the 'customize_changeset_branching' filter to determine + * whether concurrent changesets are allowed. Then if the Customizer is not initialized with a `changeset_uuid` param, + * this method will determine which UUID should be used. If changeset branching is disabled, then the most saved + * changeset will be loaded by default. Otherwise, if there are no existing saved changesets or if changeset branching is + * enabled, then a new UUID will be generated. + * + * @since 4.9.0 + * @global string $pagenow + */ + public function establish_loaded_changeset() { + global $pagenow; + + if ( empty( $this->_changeset_uuid ) ) { + $changeset_uuid = null; + + if ( ! $this->branching() && $this->is_theme_active() ) { + $unpublished_changeset_posts = $this->get_changeset_posts( + array( + 'post_status' => array_diff( get_post_stati(), array( 'auto-draft', 'publish', 'trash', 'inherit', 'private' ) ), + 'exclude_restore_dismissed' => false, + 'author' => 'any', + 'posts_per_page' => 1, + 'order' => 'DESC', + 'orderby' => 'date', + ) + ); + $unpublished_changeset_post = array_shift( $unpublished_changeset_posts ); + if ( ! empty( $unpublished_changeset_post ) && wp_is_uuid( $unpublished_changeset_post->post_name ) ) { + $changeset_uuid = $unpublished_changeset_post->post_name; + } + } + + // If no changeset UUID has been set yet, then generate a new one. + if ( empty( $changeset_uuid ) ) { + $changeset_uuid = wp_generate_uuid4(); + } + + $this->_changeset_uuid = $changeset_uuid; + } + + if ( is_admin() && 'customize.php' === $pagenow ) { + $this->set_changeset_lock( $this->changeset_post_id() ); + } + } + + /** + * Callback to validate a theme once it is loaded + * + * @since 3.4.0 + */ + public function after_setup_theme() { + $doing_ajax_or_is_customized = ( $this->doing_ajax() || isset( $_POST['customized'] ) ); + if ( ! $doing_ajax_or_is_customized && ! validate_current_theme() ) { + wp_redirect( 'themes.php?broken=true' ); + exit; + } + } + + /** + * If the theme to be previewed isn't the active theme, add filter callbacks + * to swap it out at runtime. + * + * @since 3.4.0 + */ + public function start_previewing_theme() { + // Bail if we're already previewing. + if ( $this->is_preview() ) { + return; + } + + $this->previewing = true; + + if ( ! $this->is_theme_active() ) { + add_filter( 'template', array( $this, 'get_template' ) ); + add_filter( 'stylesheet', array( $this, 'get_stylesheet' ) ); + add_filter( 'pre_option_current_theme', array( $this, 'current_theme' ) ); + + // @link: https://core.trac.wordpress.org/ticket/20027 + add_filter( 'pre_option_stylesheet', array( $this, 'get_stylesheet' ) ); + add_filter( 'pre_option_template', array( $this, 'get_template' ) ); + + // Handle custom theme roots. + add_filter( 'pre_option_stylesheet_root', array( $this, 'get_stylesheet_root' ) ); + add_filter( 'pre_option_template_root', array( $this, 'get_template_root' ) ); + } + + /** + * Fires once the Customizer theme preview has started. + * + * @since 3.4.0 + * + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + do_action( 'start_previewing_theme', $this ); + } + + /** + * Stop previewing the selected theme. + * + * Removes filters to change the current theme. + * + * @since 3.4.0 + */ + public function stop_previewing_theme() { + if ( ! $this->is_preview() ) { + return; + } + + $this->previewing = false; + + if ( ! $this->is_theme_active() ) { + remove_filter( 'template', array( $this, 'get_template' ) ); + remove_filter( 'stylesheet', array( $this, 'get_stylesheet' ) ); + remove_filter( 'pre_option_current_theme', array( $this, 'current_theme' ) ); + + // @link: https://core.trac.wordpress.org/ticket/20027 + remove_filter( 'pre_option_stylesheet', array( $this, 'get_stylesheet' ) ); + remove_filter( 'pre_option_template', array( $this, 'get_template' ) ); + + // Handle custom theme roots. + remove_filter( 'pre_option_stylesheet_root', array( $this, 'get_stylesheet_root' ) ); + remove_filter( 'pre_option_template_root', array( $this, 'get_template_root' ) ); + } + + /** + * Fires once the Customizer theme preview has stopped. + * + * @since 3.4.0 + * + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + do_action( 'stop_previewing_theme', $this ); + } + + /** + * Gets whether settings are or will be previewed. + * + * @since 4.9.0 + * @see WP_Customize_Setting::preview() + * + * @return bool + */ + public function settings_previewed() { + return $this->settings_previewed; + } + + /** + * Gets whether data from a changeset's autosaved revision should be loaded if it exists. + * + * @since 4.9.0 + * @see WP_Customize_Manager::changeset_data() + * + * @return bool Is using autosaved changeset revision. + */ + public function autosaved() { + return $this->autosaved; + } + + /** + * Whether the changeset branching is allowed. + * + * @since 4.9.0 + * @see WP_Customize_Manager::establish_loaded_changeset() + * + * @return bool Is changeset branching. + */ + public function branching() { + + /** + * Filters whether or not changeset branching is allowed. + * + * By default in core, when changeset branching is not allowed, changesets will operate + * linearly in that only one saved changeset will exist at a time (with a 'draft' or + * 'future' status). This makes the Customizer operate in a way that is similar to going to + * "edit" to one existing post: all users will be making changes to the same post, and autosave + * revisions will be made for that post. + * + * By contrast, when changeset branching is allowed, then the model is like users going + * to "add new" for a page and each user makes changes independently of each other since + * they are all operating on their own separate pages, each getting their own separate + * initial auto-drafts and then once initially saved, autosave revisions on top of that + * user's specific post. + * + * Since linear changesets are deemed to be more suitable for the majority of WordPress users, + * they are the default. For WordPress sites that have heavy site management in the Customizer + * by multiple users then branching changesets should be enabled by means of this filter. + * + * @since 4.9.0 + * + * @param bool $allow_branching Whether branching is allowed. If `false`, the default, + * then only one saved changeset exists at a time. + * @param WP_Customize_Manager $wp_customize Manager instance. + */ + $this->branching = apply_filters( 'customize_changeset_branching', $this->branching, $this ); + + return $this->branching; + } + + /** + * Get the changeset UUID. + * + * @since 4.7.0 + * @see WP_Customize_Manager::establish_loaded_changeset() + * + * @return string UUID. + */ + public function changeset_uuid() { + if ( empty( $this->_changeset_uuid ) ) { + $this->establish_loaded_changeset(); + } + return $this->_changeset_uuid; + } + + /** + * Get the theme being customized. + * + * @since 3.4.0 + * + * @return WP_Theme + */ + public function theme() { + if ( ! $this->theme ) { + $this->theme = wp_get_theme(); + } + return $this->theme; + } + + /** + * Get the registered settings. + * + * @since 3.4.0 + * + * @return array + */ + public function settings() { + return $this->settings; + } + + /** + * Get the registered controls. + * + * @since 3.4.0 + * + * @return array + */ + public function controls() { + return $this->controls; + } + + /** + * Get the registered containers. + * + * @since 4.0.0 + * + * @return array + */ + public function containers() { + return $this->containers; + } + + /** + * Get the registered sections. + * + * @since 3.4.0 + * + * @return array + */ + public function sections() { + return $this->sections; + } + + /** + * Get the registered panels. + * + * @since 4.0.0 + * + * @return array Panels. + */ + public function panels() { + return $this->panels; + } + + /** + * Checks if the current theme is active. + * + * @since 3.4.0 + * + * @return bool + */ + public function is_theme_active() { + return $this->get_stylesheet() == $this->original_stylesheet; + } + + /** + * Register styles/scripts and initialize the preview of each setting + * + * @since 3.4.0 + */ + public function wp_loaded() { + + // Unconditionally register core types for panels, sections, and controls + // in case plugin unhooks all customize_register actions. + $this->register_panel_type( 'WP_Customize_Panel' ); + $this->register_panel_type( 'WP_Customize_Themes_Panel' ); + $this->register_section_type( 'WP_Customize_Section' ); + $this->register_section_type( 'WP_Customize_Sidebar_Section' ); + $this->register_section_type( 'WP_Customize_Themes_Section' ); + $this->register_control_type( 'WP_Customize_Color_Control' ); + $this->register_control_type( 'WP_Customize_Media_Control' ); + $this->register_control_type( 'WP_Customize_Upload_Control' ); + $this->register_control_type( 'WP_Customize_Image_Control' ); + $this->register_control_type( 'WP_Customize_Background_Image_Control' ); + $this->register_control_type( 'WP_Customize_Background_Position_Control' ); + $this->register_control_type( 'WP_Customize_Cropped_Image_Control' ); + $this->register_control_type( 'WP_Customize_Site_Icon_Control' ); + $this->register_control_type( 'WP_Customize_Theme_Control' ); + $this->register_control_type( 'WP_Customize_Code_Editor_Control' ); + $this->register_control_type( 'WP_Customize_Date_Time_Control' ); + + /** + * Fires once WordPress has loaded, allowing scripts and styles to be initialized. + * + * @since 3.4.0 + * + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + do_action( 'customize_register', $this ); + + if ( $this->settings_previewed() ) { + foreach ( $this->settings as $setting ) { + $setting->preview(); + } + } + + if ( $this->is_preview() && ! is_admin() ) { + $this->customize_preview_init(); + } + } + + /** + * Prevents Ajax requests from following redirects when previewing a theme + * by issuing a 200 response instead of a 30x. + * + * Instead, the JS will sniff out the location header. + * + * @since 3.4.0 + * @deprecated 4.7.0 + * + * @param int $status Status. + * @return int + */ + public function wp_redirect_status( $status ) { + _deprecated_function( __FUNCTION__, '4.7.0' ); + + if ( $this->is_preview() && ! is_admin() ) { + return 200; + } + + return $status; + } + + /** + * Find the changeset post ID for a given changeset UUID. + * + * @since 4.7.0 + * + * @param string $uuid Changeset UUID. + * @return int|null Returns post ID on success and null on failure. + */ + public function find_changeset_post_id( $uuid ) { + $cache_group = 'customize_changeset_post'; + $changeset_post_id = wp_cache_get( $uuid, $cache_group ); + if ( $changeset_post_id && 'customize_changeset' === get_post_type( $changeset_post_id ) ) { + return $changeset_post_id; + } + + $changeset_post_query = new WP_Query( + array( + 'post_type' => 'customize_changeset', + 'post_status' => get_post_stati(), + 'name' => $uuid, + 'posts_per_page' => 1, + 'no_found_rows' => true, + 'cache_results' => true, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'lazy_load_term_meta' => false, + ) + ); + if ( ! empty( $changeset_post_query->posts ) ) { + // Note: 'fields'=>'ids' is not being used in order to cache the post object as it will be needed. + $changeset_post_id = $changeset_post_query->posts[0]->ID; + wp_cache_set( $uuid, $changeset_post_id, $cache_group ); + return $changeset_post_id; + } + + return null; + } + + /** + * Get changeset posts. + * + * @since 4.9.0 + * + * @param array $args { + * Args to pass into `get_posts()` to query changesets. + * + * @type int $posts_per_page Number of posts to return. Defaults to -1 (all posts). + * @type int $author Post author. Defaults to current user. + * @type string $post_status Status of changeset. Defaults to 'auto-draft'. + * @type bool $exclude_restore_dismissed Whether to exclude changeset auto-drafts that have been dismissed. Defaults to true. + * } + * @return WP_Post[] Auto-draft changesets. + */ + protected function get_changeset_posts( $args = array() ) { + $default_args = array( + 'exclude_restore_dismissed' => true, + 'posts_per_page' => -1, + 'post_type' => 'customize_changeset', + 'post_status' => 'auto-draft', + 'order' => 'DESC', + 'orderby' => 'date', + 'no_found_rows' => true, + 'cache_results' => true, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'lazy_load_term_meta' => false, + ); + if ( get_current_user_id() ) { + $default_args['author'] = get_current_user_id(); + } + $args = array_merge( $default_args, $args ); + + if ( ! empty( $args['exclude_restore_dismissed'] ) ) { + unset( $args['exclude_restore_dismissed'] ); + $args['meta_query'] = array( + array( + 'key' => '_customize_restore_dismissed', + 'compare' => 'NOT EXISTS', + ), + ); + } + + return get_posts( $args ); + } + + /** + * Dismiss all of the current user's auto-drafts (other than the present one). + * + * @since 4.9.0 + * @return int The number of auto-drafts that were dismissed. + */ + protected function dismiss_user_auto_draft_changesets() { + $changeset_autodraft_posts = $this->get_changeset_posts( + array( + 'post_status' => 'auto-draft', + 'exclude_restore_dismissed' => true, + 'posts_per_page' => -1, + ) + ); + $dismissed = 0; + foreach ( $changeset_autodraft_posts as $autosave_autodraft_post ) { + if ( $autosave_autodraft_post->ID === $this->changeset_post_id() ) { + continue; + } + if ( update_post_meta( $autosave_autodraft_post->ID, '_customize_restore_dismissed', true ) ) { + $dismissed++; + } + } + return $dismissed; + } + + /** + * Get the changeset post id for the loaded changeset. + * + * @since 4.7.0 + * + * @return int|null Post ID on success or null if there is no post yet saved. + */ + public function changeset_post_id() { + if ( ! isset( $this->_changeset_post_id ) ) { + $post_id = $this->find_changeset_post_id( $this->changeset_uuid() ); + if ( ! $post_id ) { + $post_id = false; + } + $this->_changeset_post_id = $post_id; + } + if ( false === $this->_changeset_post_id ) { + return null; + } + return $this->_changeset_post_id; + } + + /** + * Get the data stored in a changeset post. + * + * @since 4.7.0 + * + * @param int $post_id Changeset post ID. + * @return array|WP_Error Changeset data or WP_Error on error. + */ + protected function get_changeset_post_data( $post_id ) { + if ( ! $post_id ) { + return new WP_Error( 'empty_post_id' ); + } + $changeset_post = get_post( $post_id ); + if ( ! $changeset_post ) { + return new WP_Error( 'missing_post' ); + } + if ( 'revision' === $changeset_post->post_type ) { + if ( 'customize_changeset' !== get_post_type( $changeset_post->post_parent ) ) { + return new WP_Error( 'wrong_post_type' ); + } + } elseif ( 'customize_changeset' !== $changeset_post->post_type ) { + return new WP_Error( 'wrong_post_type' ); + } + $changeset_data = json_decode( $changeset_post->post_content, true ); + $last_error = json_last_error(); + if ( $last_error ) { + return new WP_Error( 'json_parse_error', '', $last_error ); + } + if ( ! is_array( $changeset_data ) ) { + return new WP_Error( 'expected_array' ); + } + return $changeset_data; + } + + /** + * Get changeset data. + * + * @since 4.7.0 + * @since 4.9.0 This will return the changeset's data with a user's autosave revision merged on top, if one exists and $autosaved is true. + * + * @return array Changeset data. + */ + public function changeset_data() { + if ( isset( $this->_changeset_data ) ) { + return $this->_changeset_data; + } + $changeset_post_id = $this->changeset_post_id(); + if ( ! $changeset_post_id ) { + $this->_changeset_data = array(); + } else { + if ( $this->autosaved() && is_user_logged_in() ) { + $autosave_post = wp_get_post_autosave( $changeset_post_id, get_current_user_id() ); + if ( $autosave_post ) { + $data = $this->get_changeset_post_data( $autosave_post->ID ); + if ( ! is_wp_error( $data ) ) { + $this->_changeset_data = $data; + } + } + } + + // Load data from the changeset if it was not loaded from an autosave. + if ( ! isset( $this->_changeset_data ) ) { + $data = $this->get_changeset_post_data( $changeset_post_id ); + if ( ! is_wp_error( $data ) ) { + $this->_changeset_data = $data; + } else { + $this->_changeset_data = array(); + } + } + } + return $this->_changeset_data; + } + + /** + * Starter content setting IDs. + * + * @since 4.7.0 + * @var array + */ + protected $pending_starter_content_settings_ids = array(); + + /** + * Import theme starter content into the customized state. + * + * @since 4.7.0 + * + * @param array $starter_content Starter content. Defaults to `get_theme_starter_content()`. + */ + function import_theme_starter_content( $starter_content = array() ) { + if ( empty( $starter_content ) ) { + $starter_content = get_theme_starter_content(); + } + + $changeset_data = array(); + if ( $this->changeset_post_id() ) { + /* + * Don't re-import starter content into a changeset saved persistently. + * This will need to be revisited in the future once theme switching + * is allowed with drafted/scheduled changesets, since switching to + * another theme could result in more starter content being applied. + * However, when doing an explicit save it is currently possible for + * nav menus and nav menu items specifically to lose their starter_content + * flags, thus resulting in duplicates being created since they fail + * to get re-used. See #40146. + */ + if ( 'auto-draft' !== get_post_status( $this->changeset_post_id() ) ) { + return; + } + + $changeset_data = $this->get_changeset_post_data( $this->changeset_post_id() ); + } + + $sidebars_widgets = isset( $starter_content['widgets'] ) && ! empty( $this->widgets ) ? $starter_content['widgets'] : array(); + $attachments = isset( $starter_content['attachments'] ) && ! empty( $this->nav_menus ) ? $starter_content['attachments'] : array(); + $posts = isset( $starter_content['posts'] ) && ! empty( $this->nav_menus ) ? $starter_content['posts'] : array(); + $options = isset( $starter_content['options'] ) ? $starter_content['options'] : array(); + $nav_menus = isset( $starter_content['nav_menus'] ) && ! empty( $this->nav_menus ) ? $starter_content['nav_menus'] : array(); + $theme_mods = isset( $starter_content['theme_mods'] ) ? $starter_content['theme_mods'] : array(); + + // Widgets. + $max_widget_numbers = array(); + foreach ( $sidebars_widgets as $sidebar_id => $widgets ) { + $sidebar_widget_ids = array(); + foreach ( $widgets as $widget ) { + list( $id_base, $instance ) = $widget; + + if ( ! isset( $max_widget_numbers[ $id_base ] ) ) { + + // When $settings is an array-like object, get an intrinsic array for use with array_keys(). + $settings = get_option( "widget_{$id_base}", array() ); + if ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) { + $settings = $settings->getArrayCopy(); + } + + // Find the max widget number for this type. + $widget_numbers = array_keys( $settings ); + if ( count( $widget_numbers ) > 0 ) { + $widget_numbers[] = 1; + $max_widget_numbers[ $id_base ] = max( ...$widget_numbers ); + } else { + $max_widget_numbers[ $id_base ] = 1; + } + } + $max_widget_numbers[ $id_base ] += 1; + + $widget_id = sprintf( '%s-%d', $id_base, $max_widget_numbers[ $id_base ] ); + $setting_id = sprintf( 'widget_%s[%d]', $id_base, $max_widget_numbers[ $id_base ] ); + + $setting_value = $this->widgets->sanitize_widget_js_instance( $instance ); + if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { + $this->set_post_value( $setting_id, $setting_value ); + $this->pending_starter_content_settings_ids[] = $setting_id; + } + $sidebar_widget_ids[] = $widget_id; + } + + $setting_id = sprintf( 'sidebars_widgets[%s]', $sidebar_id ); + if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { + $this->set_post_value( $setting_id, $sidebar_widget_ids ); + $this->pending_starter_content_settings_ids[] = $setting_id; + } + } + + $starter_content_auto_draft_post_ids = array(); + if ( ! empty( $changeset_data['nav_menus_created_posts']['value'] ) ) { + $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, $changeset_data['nav_menus_created_posts']['value'] ); + } + + // Make an index of all the posts needed and what their slugs are. + $needed_posts = array(); + $attachments = $this->prepare_starter_content_attachments( $attachments ); + foreach ( $attachments as $attachment ) { + $key = 'attachment:' . $attachment['post_name']; + $needed_posts[ $key ] = true; + } + foreach ( array_keys( $posts ) as $post_symbol ) { + if ( empty( $posts[ $post_symbol ]['post_name'] ) && empty( $posts[ $post_symbol ]['post_title'] ) ) { + unset( $posts[ $post_symbol ] ); + continue; + } + if ( empty( $posts[ $post_symbol ]['post_name'] ) ) { + $posts[ $post_symbol ]['post_name'] = sanitize_title( $posts[ $post_symbol ]['post_title'] ); + } + if ( empty( $posts[ $post_symbol ]['post_type'] ) ) { + $posts[ $post_symbol ]['post_type'] = 'post'; + } + $needed_posts[ $posts[ $post_symbol ]['post_type'] . ':' . $posts[ $post_symbol ]['post_name'] ] = true; + } + $all_post_slugs = array_merge( + wp_list_pluck( $attachments, 'post_name' ), + wp_list_pluck( $posts, 'post_name' ) + ); + + /* + * Obtain all post types referenced in starter content to use in query. + * This is needed because 'any' will not account for post types not yet registered. + */ + $post_types = array_filter( array_merge( array( 'attachment' ), wp_list_pluck( $posts, 'post_type' ) ) ); + + // Re-use auto-draft starter content posts referenced in the current customized state. + $existing_starter_content_posts = array(); + if ( ! empty( $starter_content_auto_draft_post_ids ) ) { + $existing_posts_query = new WP_Query( + array( + 'post__in' => $starter_content_auto_draft_post_ids, + 'post_status' => 'auto-draft', + 'post_type' => $post_types, + 'posts_per_page' => -1, + ) + ); + foreach ( $existing_posts_query->posts as $existing_post ) { + $post_name = $existing_post->post_name; + if ( empty( $post_name ) ) { + $post_name = get_post_meta( $existing_post->ID, '_customize_draft_post_name', true ); + } + $existing_starter_content_posts[ $existing_post->post_type . ':' . $post_name ] = $existing_post; + } + } + + // Re-use non-auto-draft posts. + if ( ! empty( $all_post_slugs ) ) { + $existing_posts_query = new WP_Query( + array( + 'post_name__in' => $all_post_slugs, + 'post_status' => array_diff( get_post_stati(), array( 'auto-draft' ) ), + 'post_type' => 'any', + 'posts_per_page' => -1, + ) + ); + foreach ( $existing_posts_query->posts as $existing_post ) { + $key = $existing_post->post_type . ':' . $existing_post->post_name; + if ( isset( $needed_posts[ $key ] ) && ! isset( $existing_starter_content_posts[ $key ] ) ) { + $existing_starter_content_posts[ $key ] = $existing_post; + } + } + } + + // Attachments are technically posts but handled differently. + if ( ! empty( $attachments ) ) { + + $attachment_ids = array(); + + foreach ( $attachments as $symbol => $attachment ) { + $file_array = array( + 'name' => $attachment['file_name'], + ); + $file_path = $attachment['file_path']; + $attachment_id = null; + $attached_file = null; + if ( isset( $existing_starter_content_posts[ 'attachment:' . $attachment['post_name'] ] ) ) { + $attachment_post = $existing_starter_content_posts[ 'attachment:' . $attachment['post_name'] ]; + $attachment_id = $attachment_post->ID; + $attached_file = get_attached_file( $attachment_id ); + if ( empty( $attached_file ) || ! file_exists( $attached_file ) ) { + $attachment_id = null; + $attached_file = null; + } elseif ( $this->get_stylesheet() !== get_post_meta( $attachment_post->ID, '_starter_content_theme', true ) ) { + + // Re-generate attachment metadata since it was previously generated for a different theme. + $metadata = wp_generate_attachment_metadata( $attachment_post->ID, $attached_file ); + wp_update_attachment_metadata( $attachment_id, $metadata ); + update_post_meta( $attachment_id, '_starter_content_theme', $this->get_stylesheet() ); + } + } + + // Insert the attachment auto-draft because it doesn't yet exist or the attached file is gone. + if ( ! $attachment_id ) { + + // Copy file to temp location so that original file won't get deleted from theme after sideloading. + $temp_file_name = wp_tempnam( wp_basename( $file_path ) ); + if ( $temp_file_name && copy( $file_path, $temp_file_name ) ) { + $file_array['tmp_name'] = $temp_file_name; + } + if ( empty( $file_array['tmp_name'] ) ) { + continue; + } + + $attachment_post_data = array_merge( + wp_array_slice_assoc( $attachment, array( 'post_title', 'post_content', 'post_excerpt' ) ), + array( + 'post_status' => 'auto-draft', // So attachment will be garbage collected in a week if changeset is never published. + ) + ); + + $attachment_id = media_handle_sideload( $file_array, 0, null, $attachment_post_data ); + if ( is_wp_error( $attachment_id ) ) { + continue; + } + update_post_meta( $attachment_id, '_starter_content_theme', $this->get_stylesheet() ); + update_post_meta( $attachment_id, '_customize_draft_post_name', $attachment['post_name'] ); + } + + $attachment_ids[ $symbol ] = $attachment_id; + } + $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, array_values( $attachment_ids ) ); + } + + // Posts & pages. + if ( ! empty( $posts ) ) { + foreach ( array_keys( $posts ) as $post_symbol ) { + if ( empty( $posts[ $post_symbol ]['post_type'] ) || empty( $posts[ $post_symbol ]['post_name'] ) ) { + continue; + } + $post_type = $posts[ $post_symbol ]['post_type']; + if ( ! empty( $posts[ $post_symbol ]['post_name'] ) ) { + $post_name = $posts[ $post_symbol ]['post_name']; + } elseif ( ! empty( $posts[ $post_symbol ]['post_title'] ) ) { + $post_name = sanitize_title( $posts[ $post_symbol ]['post_title'] ); + } else { + continue; + } + + // Use existing auto-draft post if one already exists with the same type and name. + if ( isset( $existing_starter_content_posts[ $post_type . ':' . $post_name ] ) ) { + $posts[ $post_symbol ]['ID'] = $existing_starter_content_posts[ $post_type . ':' . $post_name ]->ID; + continue; + } + + // Translate the featured image symbol. + if ( ! empty( $posts[ $post_symbol ]['thumbnail'] ) + && preg_match( '/^{{(?P<symbol>.+)}}$/', $posts[ $post_symbol ]['thumbnail'], $matches ) + && isset( $attachment_ids[ $matches['symbol'] ] ) ) { + $posts[ $post_symbol ]['meta_input']['_thumbnail_id'] = $attachment_ids[ $matches['symbol'] ]; + } + + if ( ! empty( $posts[ $post_symbol ]['template'] ) ) { + $posts[ $post_symbol ]['meta_input']['_wp_page_template'] = $posts[ $post_symbol ]['template']; + } + + $r = $this->nav_menus->insert_auto_draft_post( $posts[ $post_symbol ] ); + if ( $r instanceof WP_Post ) { + $posts[ $post_symbol ]['ID'] = $r->ID; + } + } + + $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, wp_list_pluck( $posts, 'ID' ) ); + } + + // The nav_menus_created_posts setting is why nav_menus component is dependency for adding posts. + if ( ! empty( $this->nav_menus ) && ! empty( $starter_content_auto_draft_post_ids ) ) { + $setting_id = 'nav_menus_created_posts'; + $this->set_post_value( $setting_id, array_unique( array_values( $starter_content_auto_draft_post_ids ) ) ); + $this->pending_starter_content_settings_ids[] = $setting_id; + } + + // Nav menus. + $placeholder_id = -1; + $reused_nav_menu_setting_ids = array(); + foreach ( $nav_menus as $nav_menu_location => $nav_menu ) { + + $nav_menu_term_id = null; + $nav_menu_setting_id = null; + $matches = array(); + + // Look for an existing placeholder menu with starter content to re-use. + foreach ( $changeset_data as $setting_id => $setting_params ) { + $can_reuse = ( + ! empty( $setting_params['starter_content'] ) + && + ! in_array( $setting_id, $reused_nav_menu_setting_ids, true ) + && + preg_match( '#^nav_menu\[(?P<nav_menu_id>-?\d+)\]$#', $setting_id, $matches ) + ); + if ( $can_reuse ) { + $nav_menu_term_id = intval( $matches['nav_menu_id'] ); + $nav_menu_setting_id = $setting_id; + $reused_nav_menu_setting_ids[] = $setting_id; + break; + } + } + + if ( ! $nav_menu_term_id ) { + while ( isset( $changeset_data[ sprintf( 'nav_menu[%d]', $placeholder_id ) ] ) ) { + $placeholder_id--; + } + $nav_menu_term_id = $placeholder_id; + $nav_menu_setting_id = sprintf( 'nav_menu[%d]', $placeholder_id ); + } + + $this->set_post_value( + $nav_menu_setting_id, + array( + 'name' => isset( $nav_menu['name'] ) ? $nav_menu['name'] : $nav_menu_location, + ) + ); + $this->pending_starter_content_settings_ids[] = $nav_menu_setting_id; + + // @todo Add support for menu_item_parent. + $position = 0; + foreach ( $nav_menu['items'] as $nav_menu_item ) { + $nav_menu_item_setting_id = sprintf( 'nav_menu_item[%d]', $placeholder_id-- ); + if ( ! isset( $nav_menu_item['position'] ) ) { + $nav_menu_item['position'] = $position++; + } + $nav_menu_item['nav_menu_term_id'] = $nav_menu_term_id; + + if ( isset( $nav_menu_item['object_id'] ) ) { + if ( 'post_type' === $nav_menu_item['type'] && preg_match( '/^{{(?P<symbol>.+)}}$/', $nav_menu_item['object_id'], $matches ) && isset( $posts[ $matches['symbol'] ] ) ) { + $nav_menu_item['object_id'] = $posts[ $matches['symbol'] ]['ID']; + if ( empty( $nav_menu_item['title'] ) ) { + $original_object = get_post( $nav_menu_item['object_id'] ); + $nav_menu_item['title'] = $original_object->post_title; + } + } else { + continue; + } + } else { + $nav_menu_item['object_id'] = 0; + } + + if ( empty( $changeset_data[ $nav_menu_item_setting_id ] ) || ! empty( $changeset_data[ $nav_menu_item_setting_id ]['starter_content'] ) ) { + $this->set_post_value( $nav_menu_item_setting_id, $nav_menu_item ); + $this->pending_starter_content_settings_ids[] = $nav_menu_item_setting_id; + } + } + + $setting_id = sprintf( 'nav_menu_locations[%s]', $nav_menu_location ); + if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { + $this->set_post_value( $setting_id, $nav_menu_term_id ); + $this->pending_starter_content_settings_ids[] = $setting_id; + } + } + + // Options. + foreach ( $options as $name => $value ) { + + // Serialize the value to check for post symbols. + $value = maybe_serialize( $value ); + + if ( is_serialized( $value ) ) { + if ( preg_match( '/s:\d+:"{{(?P<symbol>.+)}}"/', $value, $matches ) ) { + if ( isset( $posts[ $matches['symbol'] ] ) ) { + $symbol_match = $posts[ $matches['symbol'] ]['ID']; + } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { + $symbol_match = $attachment_ids[ $matches['symbol'] ]; + } + + // If we have any symbol matches, update the values. + if ( isset( $symbol_match ) ) { + // Replace found string matches with post IDs. + $value = str_replace( $matches[0], "i:{$symbol_match}", $value ); + } else { + continue; + } + } + } elseif ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) ) { + if ( isset( $posts[ $matches['symbol'] ] ) ) { + $value = $posts[ $matches['symbol'] ]['ID']; + } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { + $value = $attachment_ids[ $matches['symbol'] ]; + } else { + continue; + } + } + + // Unserialize values after checking for post symbols, so they can be properly referenced. + $value = maybe_unserialize( $value ); + + if ( empty( $changeset_data[ $name ] ) || ! empty( $changeset_data[ $name ]['starter_content'] ) ) { + $this->set_post_value( $name, $value ); + $this->pending_starter_content_settings_ids[] = $name; + } + } + + // Theme mods. + foreach ( $theme_mods as $name => $value ) { + + // Serialize the value to check for post symbols. + $value = maybe_serialize( $value ); + + // Check if value was serialized. + if ( is_serialized( $value ) ) { + if ( preg_match( '/s:\d+:"{{(?P<symbol>.+)}}"/', $value, $matches ) ) { + if ( isset( $posts[ $matches['symbol'] ] ) ) { + $symbol_match = $posts[ $matches['symbol'] ]['ID']; + } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { + $symbol_match = $attachment_ids[ $matches['symbol'] ]; + } + + // If we have any symbol matches, update the values. + if ( isset( $symbol_match ) ) { + // Replace found string matches with post IDs. + $value = str_replace( $matches[0], "i:{$symbol_match}", $value ); + } else { + continue; + } + } + } elseif ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) ) { + if ( isset( $posts[ $matches['symbol'] ] ) ) { + $value = $posts[ $matches['symbol'] ]['ID']; + } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { + $value = $attachment_ids[ $matches['symbol'] ]; + } else { + continue; + } + } + + // Unserialize values after checking for post symbols, so they can be properly referenced. + $value = maybe_unserialize( $value ); + + // Handle header image as special case since setting has a legacy format. + if ( 'header_image' === $name ) { + $name = 'header_image_data'; + $metadata = wp_get_attachment_metadata( $value ); + if ( empty( $metadata ) ) { + continue; + } + $value = array( + 'attachment_id' => $value, + 'url' => wp_get_attachment_url( $value ), + 'height' => $metadata['height'], + 'width' => $metadata['width'], + ); + } elseif ( 'background_image' === $name ) { + $value = wp_get_attachment_url( $value ); + } + + if ( empty( $changeset_data[ $name ] ) || ! empty( $changeset_data[ $name ]['starter_content'] ) ) { + $this->set_post_value( $name, $value ); + $this->pending_starter_content_settings_ids[] = $name; + } + } + + if ( ! empty( $this->pending_starter_content_settings_ids ) ) { + if ( did_action( 'customize_register' ) ) { + $this->_save_starter_content_changeset(); + } else { + add_action( 'customize_register', array( $this, '_save_starter_content_changeset' ), 1000 ); + } + } + } + + /** + * Prepare starter content attachments. + * + * Ensure that the attachments are valid and that they have slugs and file name/path. + * + * @since 4.7.0 + * + * @param array $attachments Attachments. + * @return array Prepared attachments. + */ + protected function prepare_starter_content_attachments( $attachments ) { + $prepared_attachments = array(); + if ( empty( $attachments ) ) { + return $prepared_attachments; + } + + // Such is The WordPress Way. + require_once ABSPATH . 'wp-admin/includes/file.php'; + require_once ABSPATH . 'wp-admin/includes/media.php'; + require_once ABSPATH . 'wp-admin/includes/image.php'; + + foreach ( $attachments as $symbol => $attachment ) { + + // A file is required and URLs to files are not currently allowed. + if ( empty( $attachment['file'] ) || preg_match( '#^https?://$#', $attachment['file'] ) ) { + continue; + } + + $file_path = null; + if ( file_exists( $attachment['file'] ) ) { + $file_path = $attachment['file']; // Could be absolute path to file in plugin. + } elseif ( is_child_theme() && file_exists( get_stylesheet_directory() . '/' . $attachment['file'] ) ) { + $file_path = get_stylesheet_directory() . '/' . $attachment['file']; + } elseif ( file_exists( get_template_directory() . '/' . $attachment['file'] ) ) { + $file_path = get_template_directory() . '/' . $attachment['file']; + } else { + continue; + } + $file_name = wp_basename( $attachment['file'] ); + + // Skip file types that are not recognized. + $checked_filetype = wp_check_filetype( $file_name ); + if ( empty( $checked_filetype['type'] ) ) { + continue; + } + + // Ensure post_name is set since not automatically derived from post_title for new auto-draft posts. + if ( empty( $attachment['post_name'] ) ) { + if ( ! empty( $attachment['post_title'] ) ) { + $attachment['post_name'] = sanitize_title( $attachment['post_title'] ); + } else { + $attachment['post_name'] = sanitize_title( preg_replace( '/\.\w+$/', '', $file_name ) ); + } + } + + $attachment['file_name'] = $file_name; + $attachment['file_path'] = $file_path; + $prepared_attachments[ $symbol ] = $attachment; + } + return $prepared_attachments; + } + + /** + * Save starter content changeset. + * + * @since 4.7.0 + */ + public function _save_starter_content_changeset() { + + if ( empty( $this->pending_starter_content_settings_ids ) ) { + return; + } + + $this->save_changeset_post( + array( + 'data' => array_fill_keys( $this->pending_starter_content_settings_ids, array( 'starter_content' => true ) ), + 'starter_content' => true, + ) + ); + $this->saved_starter_content_changeset = true; + + $this->pending_starter_content_settings_ids = array(); + } + + /** + * Get dirty pre-sanitized setting values in the current customized state. + * + * The returned array consists of a merge of three sources: + * 1. If the theme is not currently active, then the base array is any stashed + * theme mods that were modified previously but never published. + * 2. The values from the current changeset, if it exists. + * 3. If the user can customize, the values parsed from the incoming + * `$_POST['customized']` JSON data. + * 4. Any programmatically-set post values via `WP_Customize_Manager::set_post_value()`. + * + * The name "unsanitized_post_values" is a carry-over from when the customized + * state was exclusively sourced from `$_POST['customized']`. Nevertheless, + * the value returned will come from the current changeset post and from the + * incoming post data. + * + * @since 4.1.1 + * @since 4.7.0 Added `$args` parameter and merging with changeset values and stashed theme mods. + * + * @param array $args { + * Args. + * + * @type bool $exclude_changeset Whether the changeset values should also be excluded. Defaults to false. + * @type bool $exclude_post_data Whether the post input values should also be excluded. Defaults to false when lacking the customize capability. + * } + * @return array + */ + public function unsanitized_post_values( $args = array() ) { + $args = array_merge( + array( + 'exclude_changeset' => false, + 'exclude_post_data' => ! current_user_can( 'customize' ), + ), + $args + ); + + $values = array(); + + // Let default values be from the stashed theme mods if doing a theme switch and if no changeset is present. + if ( ! $this->is_theme_active() ) { + $stashed_theme_mods = get_option( 'customize_stashed_theme_mods' ); + $stylesheet = $this->get_stylesheet(); + if ( isset( $stashed_theme_mods[ $stylesheet ] ) ) { + $values = array_merge( $values, wp_list_pluck( $stashed_theme_mods[ $stylesheet ], 'value' ) ); + } + } + + if ( ! $args['exclude_changeset'] ) { + foreach ( $this->changeset_data() as $setting_id => $setting_params ) { + if ( ! array_key_exists( 'value', $setting_params ) ) { + continue; + } + if ( isset( $setting_params['type'] ) && 'theme_mod' === $setting_params['type'] ) { + + // Ensure that theme mods values are only used if they were saved under the current theme. + $namespace_pattern = '/^(?P<stylesheet>.+?)::(?P<setting_id>.+)$/'; + if ( preg_match( $namespace_pattern, $setting_id, $matches ) && $this->get_stylesheet() === $matches['stylesheet'] ) { + $values[ $matches['setting_id'] ] = $setting_params['value']; + } + } else { + $values[ $setting_id ] = $setting_params['value']; + } + } + } + + if ( ! $args['exclude_post_data'] ) { + if ( ! isset( $this->_post_values ) ) { + if ( isset( $_POST['customized'] ) ) { + $post_values = json_decode( wp_unslash( $_POST['customized'] ), true ); + } else { + $post_values = array(); + } + if ( is_array( $post_values ) ) { + $this->_post_values = $post_values; + } else { + $this->_post_values = array(); + } + } + $values = array_merge( $values, $this->_post_values ); + } + return $values; + } + + /** + * Returns the sanitized value for a given setting from the current customized state. + * + * The name "post_value" is a carry-over from when the customized state was exclusively + * sourced from `$_POST['customized']`. Nevertheless, the value returned will come + * from the current changeset post and from the incoming post data. + * + * @since 3.4.0 + * @since 4.1.1 Introduced the `$default` parameter. + * @since 4.6.0 `$default` is now returned early when the setting post value is invalid. + * + * @see WP_REST_Server::dispatch() + * @see WP_REST_Request::sanitize_params() + * @see WP_REST_Request::has_valid_params() + * + * @param WP_Customize_Setting $setting A WP_Customize_Setting derived object. + * @param mixed $default Value returned $setting has no post value (added in 4.2.0) + * or the post value is invalid (added in 4.6.0). + * @return string|mixed $post_value Sanitized value or the $default provided. + */ + public function post_value( $setting, $default = null ) { + $post_values = $this->unsanitized_post_values(); + if ( ! array_key_exists( $setting->id, $post_values ) ) { + return $default; + } + $value = $post_values[ $setting->id ]; + $valid = $setting->validate( $value ); + if ( is_wp_error( $valid ) ) { + return $default; + } + $value = $setting->sanitize( $value ); + if ( is_null( $value ) || is_wp_error( $value ) ) { + return $default; + } + return $value; + } + + /** + * Override a setting's value in the current customized state. + * + * The name "post_value" is a carry-over from when the customized state was + * exclusively sourced from `$_POST['customized']`. + * + * @since 4.2.0 + * + * @param string $setting_id ID for the WP_Customize_Setting instance. + * @param mixed $value Post value. + */ + public function set_post_value( $setting_id, $value ) { + $this->unsanitized_post_values(); // Populate _post_values from $_POST['customized']. + $this->_post_values[ $setting_id ] = $value; + + /** + * Announce when a specific setting's unsanitized post value has been set. + * + * Fires when the WP_Customize_Manager::set_post_value() method is called. + * + * The dynamic portion of the hook name, `$setting_id`, refers to the setting ID. + * + * @since 4.4.0 + * + * @param mixed $value Unsanitized setting post value. + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + do_action( "customize_post_value_set_{$setting_id}", $value, $this ); + + /** + * Announce when any setting's unsanitized post value has been set. + * + * Fires when the WP_Customize_Manager::set_post_value() method is called. + * + * This is useful for `WP_Customize_Setting` instances to watch + * in order to update a cached previewed value. + * + * @since 4.4.0 + * + * @param string $setting_id Setting ID. + * @param mixed $value Unsanitized setting post value. + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + do_action( 'customize_post_value_set', $setting_id, $value, $this ); + } + + /** + * Print JavaScript settings. + * + * @since 3.4.0 + */ + public function customize_preview_init() { + + /* + * Now that Customizer previews are loaded into iframes via GET requests + * and natural URLs with transaction UUIDs added, we need to ensure that + * the responses are never cached by proxies. In practice, this will not + * be needed if the user is logged-in anyway. But if anonymous access is + * allowed then the auth cookies would not be sent and WordPress would + * not send no-cache headers by default. + */ + if ( ! headers_sent() ) { + nocache_headers(); + header( 'X-Robots: noindex, nofollow, noarchive' ); + } + add_action( 'wp_head', 'wp_no_robots' ); + add_filter( 'wp_headers', array( $this, 'filter_iframe_security_headers' ) ); + + /* + * If preview is being served inside the customizer preview iframe, and + * if the user doesn't have customize capability, then it is assumed + * that the user's session has expired and they need to re-authenticate. + */ + if ( $this->messenger_channel && ! current_user_can( 'customize' ) ) { + $this->wp_die( -1, __( 'Unauthorized. You may remove the customize_messenger_channel param to preview as frontend.' ) ); + return; + } + + $this->prepare_controls(); + + add_filter( 'wp_redirect', array( $this, 'add_state_query_params' ) ); + + wp_enqueue_script( 'customize-preview' ); + wp_enqueue_style( 'customize-preview' ); + add_action( 'wp_head', array( $this, 'customize_preview_loading_style' ) ); + add_action( 'wp_head', array( $this, 'remove_frameless_preview_messenger_channel' ) ); + add_action( 'wp_footer', array( $this, 'customize_preview_settings' ), 20 ); + add_filter( 'get_edit_post_link', '__return_empty_string' ); + + /** + * Fires once the Customizer preview has initialized and JavaScript + * settings have been printed. + * + * @since 3.4.0 + * + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + do_action( 'customize_preview_init', $this ); + } + + /** + * Filter the X-Frame-Options and Content-Security-Policy headers to ensure frontend can load in customizer. + * + * @since 4.7.0 + * + * @param array $headers Headers. + * @return array Headers. + */ + public function filter_iframe_security_headers( $headers ) { + $headers['X-Frame-Options'] = 'SAMEORIGIN'; + $headers['Content-Security-Policy'] = "frame-ancestors 'self'"; + return $headers; + } + + /** + * Add customize state query params to a given URL if preview is allowed. + * + * @since 4.7.0 + * @see wp_redirect() + * @see WP_Customize_Manager::get_allowed_url() + * + * @param string $url URL. + * @return string URL. + */ + public function add_state_query_params( $url ) { + $parsed_original_url = wp_parse_url( $url ); + $is_allowed = false; + foreach ( $this->get_allowed_urls() as $allowed_url ) { + $parsed_allowed_url = wp_parse_url( $allowed_url ); + $is_allowed = ( + $parsed_allowed_url['scheme'] === $parsed_original_url['scheme'] + && + $parsed_allowed_url['host'] === $parsed_original_url['host'] + && + 0 === strpos( $parsed_original_url['path'], $parsed_allowed_url['path'] ) + ); + if ( $is_allowed ) { + break; + } + } + + if ( $is_allowed ) { + $query_params = array( + 'customize_changeset_uuid' => $this->changeset_uuid(), + ); + if ( ! $this->is_theme_active() ) { + $query_params['customize_theme'] = $this->get_stylesheet(); + } + if ( $this->messenger_channel ) { + $query_params['customize_messenger_channel'] = $this->messenger_channel; + } + $url = add_query_arg( $query_params, $url ); + } + + return $url; + } + + /** + * Prevent sending a 404 status when returning the response for the customize + * preview, since it causes the jQuery Ajax to fail. Send 200 instead. + * + * @since 4.0.0 + * @deprecated 4.7.0 + */ + public function customize_preview_override_404_status() { + _deprecated_function( __METHOD__, '4.7.0' ); + } + + /** + * Print base element for preview frame. + * + * @since 3.4.0 + * @deprecated 4.7.0 + */ + public function customize_preview_base() { + _deprecated_function( __METHOD__, '4.7.0' ); + } + + /** + * Print a workaround to handle HTML5 tags in IE < 9. + * + * @since 3.4.0 + * @deprecated 4.7.0 Customizer no longer supports IE8, so all supported browsers recognize HTML5. + */ + public function customize_preview_html5() { + _deprecated_function( __FUNCTION__, '4.7.0' ); + } + + /** + * Print CSS for loading indicators for the Customizer preview. + * + * @since 4.2.0 + */ + public function customize_preview_loading_style() { + ?> + <style> + body.wp-customizer-unloading { + opacity: 0.25; + cursor: progress !important; + -webkit-transition: opacity 0.5s; + transition: opacity 0.5s; + } + body.wp-customizer-unloading * { + pointer-events: none !important; + } + form.customize-unpreviewable, + form.customize-unpreviewable input, + form.customize-unpreviewable select, + form.customize-unpreviewable button, + a.customize-unpreviewable, + area.customize-unpreviewable { + cursor: not-allowed !important; + } + </style> + <?php + } + + /** + * Remove customize_messenger_channel query parameter from the preview window when it is not in an iframe. + * + * This ensures that the admin bar will be shown. It also ensures that link navigation will + * work as expected since the parent frame is not being sent the URL to navigate to. + * + * @since 4.7.0 + */ + public function remove_frameless_preview_messenger_channel() { + if ( ! $this->messenger_channel ) { + return; + } + ?> + <script> + ( function() { + var urlParser, oldQueryParams, newQueryParams, i; + if ( parent !== window ) { + return; + } + urlParser = document.createElement( 'a' ); + urlParser.href = location.href; + oldQueryParams = urlParser.search.substr( 1 ).split( /&/ ); + newQueryParams = []; + for ( i = 0; i < oldQueryParams.length; i += 1 ) { + if ( ! /^customize_messenger_channel=/.test( oldQueryParams[ i ] ) ) { + newQueryParams.push( oldQueryParams[ i ] ); + } + } + urlParser.search = newQueryParams.join( '&' ); + if ( urlParser.search !== location.search ) { + location.replace( urlParser.href ); + } + } )(); + </script> + <?php + } + + /** + * Print JavaScript settings for preview frame. + * + * @since 3.4.0 + */ + public function customize_preview_settings() { + $post_values = $this->unsanitized_post_values( array( 'exclude_changeset' => true ) ); + $setting_validities = $this->validate_setting_values( $post_values ); + $exported_setting_validities = array_map( array( $this, 'prepare_setting_validity_for_js' ), $setting_validities ); + + // Note that the REQUEST_URI is not passed into home_url() since this breaks subdirectory installations. + $self_url = empty( $_SERVER['REQUEST_URI'] ) ? home_url( '/' ) : esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ); + $state_query_params = array( + 'customize_theme', + 'customize_changeset_uuid', + 'customize_messenger_channel', + ); + $self_url = remove_query_arg( $state_query_params, $self_url ); + + $allowed_urls = $this->get_allowed_urls(); + $allowed_hosts = array(); + foreach ( $allowed_urls as $allowed_url ) { + $parsed = wp_parse_url( $allowed_url ); + if ( empty( $parsed['host'] ) ) { + continue; + } + $host = $parsed['host']; + if ( ! empty( $parsed['port'] ) ) { + $host .= ':' . $parsed['port']; + } + $allowed_hosts[] = $host; + } + + $switched_locale = switch_to_locale( get_user_locale() ); + $l10n = array( + 'shiftClickToEdit' => __( 'Shift-click to edit this element.' ), + 'linkUnpreviewable' => __( 'This link is not live-previewable.' ), + 'formUnpreviewable' => __( 'This form is not live-previewable.' ), + ); + if ( $switched_locale ) { + restore_previous_locale(); + } + + $settings = array( + 'changeset' => array( + 'uuid' => $this->changeset_uuid(), + 'autosaved' => $this->autosaved(), + ), + 'timeouts' => array( + 'selectiveRefresh' => 250, + 'keepAliveSend' => 1000, + ), + 'theme' => array( + 'stylesheet' => $this->get_stylesheet(), + 'active' => $this->is_theme_active(), + ), + 'url' => array( + 'self' => $self_url, + 'allowed' => array_map( 'esc_url_raw', $this->get_allowed_urls() ), + 'allowedHosts' => array_unique( $allowed_hosts ), + 'isCrossDomain' => $this->is_cross_domain(), + ), + 'channel' => $this->messenger_channel, + 'activePanels' => array(), + 'activeSections' => array(), + 'activeControls' => array(), + 'settingValidities' => $exported_setting_validities, + 'nonce' => current_user_can( 'customize' ) ? $this->get_nonces() : array(), + 'l10n' => $l10n, + '_dirty' => array_keys( $post_values ), + ); + + foreach ( $this->panels as $panel_id => $panel ) { + if ( $panel->check_capabilities() ) { + $settings['activePanels'][ $panel_id ] = $panel->active(); + foreach ( $panel->sections as $section_id => $section ) { + if ( $section->check_capabilities() ) { + $settings['activeSections'][ $section_id ] = $section->active(); + } + } + } + } + foreach ( $this->sections as $id => $section ) { + if ( $section->check_capabilities() ) { + $settings['activeSections'][ $id ] = $section->active(); + } + } + foreach ( $this->controls as $id => $control ) { + if ( $control->check_capabilities() ) { + $settings['activeControls'][ $id ] = $control->active(); + } + } + + ?> + <script type="text/javascript"> + var _wpCustomizeSettings = <?php echo wp_json_encode( $settings ); ?>; + _wpCustomizeSettings.values = {}; + (function( v ) { + <?php + /* + * Serialize settings separately from the initial _wpCustomizeSettings + * serialization in order to avoid a peak memory usage spike. + * @todo We may not even need to export the values at all since the pane syncs them anyway. + */ + foreach ( $this->settings as $id => $setting ) { + if ( $setting->check_capabilities() ) { + printf( + "v[%s] = %s;\n", + wp_json_encode( $id ), + wp_json_encode( $setting->js_value() ) + ); + } + } + ?> + })( _wpCustomizeSettings.values ); + </script> + <?php + } + + /** + * Prints a signature so we can ensure the Customizer was properly executed. + * + * @since 3.4.0 + * @deprecated 4.7.0 + */ + public function customize_preview_signature() { + _deprecated_function( __METHOD__, '4.7.0' ); + } + + /** + * Removes the signature in case we experience a case where the Customizer was not properly executed. + * + * @since 3.4.0 + * @deprecated 4.7.0 + * + * @param mixed $return Value passed through for {@see 'wp_die_handler'} filter. + * @return mixed Value passed through for {@see 'wp_die_handler'} filter. + */ + public function remove_preview_signature( $return = null ) { + _deprecated_function( __METHOD__, '4.7.0' ); + + return $return; + } + + /** + * Is it a theme preview? + * + * @since 3.4.0 + * + * @return bool True if it's a preview, false if not. + */ + public function is_preview() { + return (bool) $this->previewing; + } + + /** + * Retrieve the template name of the previewed theme. + * + * @since 3.4.0 + * + * @return string Template name. + */ + public function get_template() { + return $this->theme()->get_template(); + } + + /** + * Retrieve the stylesheet name of the previewed theme. + * + * @since 3.4.0 + * + * @return string Stylesheet name. + */ + public function get_stylesheet() { + return $this->theme()->get_stylesheet(); + } + + /** + * Retrieve the template root of the previewed theme. + * + * @since 3.4.0 + * + * @return string Theme root. + */ + public function get_template_root() { + return get_raw_theme_root( $this->get_template(), true ); + } + + /** + * Retrieve the stylesheet root of the previewed theme. + * + * @since 3.4.0 + * + * @return string Theme root. + */ + public function get_stylesheet_root() { + return get_raw_theme_root( $this->get_stylesheet(), true ); + } + + /** + * Filters the current theme and return the name of the previewed theme. + * + * @since 3.4.0 + * + * @param $current_theme {@internal Parameter is not used} + * @return string Theme name. + */ + public function current_theme( $current_theme ) { + return $this->theme()->display( 'Name' ); + } + + /** + * Validates setting values. + * + * Validation is skipped for unregistered settings or for values that are + * already null since they will be skipped anyway. Sanitization is applied + * to values that pass validation, and values that become null or `WP_Error` + * after sanitizing are marked invalid. + * + * @since 4.6.0 + * + * @see WP_REST_Request::has_valid_params() + * @see WP_Customize_Setting::validate() + * + * @param array $setting_values Mapping of setting IDs to values to validate and sanitize. + * @param array $options { + * Options. + * + * @type bool $validate_existence Whether a setting's existence will be checked. + * @type bool $validate_capability Whether the setting capability will be checked. + * } + * @return array Mapping of setting IDs to return value of validate method calls, either `true` or `WP_Error`. + */ + public function validate_setting_values( $setting_values, $options = array() ) { + $options = wp_parse_args( + $options, + array( + 'validate_capability' => false, + 'validate_existence' => false, + ) + ); + + $validities = array(); + foreach ( $setting_values as $setting_id => $unsanitized_value ) { + $setting = $this->get_setting( $setting_id ); + if ( ! $setting ) { + if ( $options['validate_existence'] ) { + $validities[ $setting_id ] = new WP_Error( 'unrecognized', __( 'Setting does not exist or is unrecognized.' ) ); + } + continue; + } + if ( $options['validate_capability'] && ! current_user_can( $setting->capability ) ) { + $validity = new WP_Error( 'unauthorized', __( 'Unauthorized to modify setting due to capability.' ) ); + } else { + if ( is_null( $unsanitized_value ) ) { + continue; + } + $validity = $setting->validate( $unsanitized_value ); + } + if ( ! is_wp_error( $validity ) ) { + /** This filter is documented in wp-includes/class-wp-customize-setting.php */ + $late_validity = apply_filters( "customize_validate_{$setting->id}", new WP_Error(), $unsanitized_value, $setting ); + if ( is_wp_error( $late_validity ) && $late_validity->has_errors() ) { + $validity = $late_validity; + } + } + if ( ! is_wp_error( $validity ) ) { + $value = $setting->sanitize( $unsanitized_value ); + if ( is_null( $value ) ) { + $validity = false; + } elseif ( is_wp_error( $value ) ) { + $validity = $value; + } + } + if ( false === $validity ) { + $validity = new WP_Error( 'invalid_value', __( 'Invalid value.' ) ); + } + $validities[ $setting_id ] = $validity; + } + return $validities; + } + + /** + * Prepares setting validity for exporting to the client (JS). + * + * Converts `WP_Error` instance into array suitable for passing into the + * `wp.customize.Notification` JS model. + * + * @since 4.6.0 + * + * @param true|WP_Error $validity Setting validity. + * @return true|array If `$validity` was a WP_Error, the error codes will be array-mapped + * to their respective `message` and `data` to pass into the + * `wp.customize.Notification` JS model. + */ + public function prepare_setting_validity_for_js( $validity ) { + if ( is_wp_error( $validity ) ) { + $notification = array(); + foreach ( $validity->errors as $error_code => $error_messages ) { + $notification[ $error_code ] = array( + 'message' => join( ' ', $error_messages ), + 'data' => $validity->get_error_data( $error_code ), + ); + } + return $notification; + } else { + return true; + } + } + + /** + * Handle customize_save WP Ajax request to save/update a changeset. + * + * @since 3.4.0 + * @since 4.7.0 The semantics of this method have changed to update a changeset, optionally to also change the status and other attributes. + */ + public function save() { + if ( ! is_user_logged_in() ) { + wp_send_json_error( 'unauthenticated' ); + } + + if ( ! $this->is_preview() ) { + wp_send_json_error( 'not_preview' ); + } + + $action = 'save-customize_' . $this->get_stylesheet(); + if ( ! check_ajax_referer( $action, 'nonce', false ) ) { + wp_send_json_error( 'invalid_nonce' ); + } + + $changeset_post_id = $this->changeset_post_id(); + $is_new_changeset = empty( $changeset_post_id ); + if ( $is_new_changeset ) { + if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->create_posts ) ) { + wp_send_json_error( 'cannot_create_changeset_post' ); + } + } else { + if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post_id ) ) { + wp_send_json_error( 'cannot_edit_changeset_post' ); + } + } + + if ( ! empty( $_POST['customize_changeset_data'] ) ) { + $input_changeset_data = json_decode( wp_unslash( $_POST['customize_changeset_data'] ), true ); + if ( ! is_array( $input_changeset_data ) ) { + wp_send_json_error( 'invalid_customize_changeset_data' ); + } + } else { + $input_changeset_data = array(); + } + + // Validate title. + $changeset_title = null; + if ( isset( $_POST['customize_changeset_title'] ) ) { + $changeset_title = sanitize_text_field( wp_unslash( $_POST['customize_changeset_title'] ) ); + } + + // Validate changeset status param. + $is_publish = null; + $changeset_status = null; + if ( isset( $_POST['customize_changeset_status'] ) ) { + $changeset_status = wp_unslash( $_POST['customize_changeset_status'] ); + if ( ! get_post_status_object( $changeset_status ) || ! in_array( $changeset_status, array( 'draft', 'pending', 'publish', 'future' ), true ) ) { + wp_send_json_error( 'bad_customize_changeset_status', 400 ); + } + $is_publish = ( 'publish' === $changeset_status || 'future' === $changeset_status ); + if ( $is_publish && ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ) ) { + wp_send_json_error( 'changeset_publish_unauthorized', 403 ); + } + } + + /* + * Validate changeset date param. Date is assumed to be in local time for + * the WP if in MySQL format (YYYY-MM-DD HH:MM:SS). Otherwise, the date + * is parsed with strtotime() so that ISO date format may be supplied + * or a string like "+10 minutes". + */ + $changeset_date_gmt = null; + if ( isset( $_POST['customize_changeset_date'] ) ) { + $changeset_date = wp_unslash( $_POST['customize_changeset_date'] ); + if ( preg_match( '/^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$/', $changeset_date ) ) { + $mm = substr( $changeset_date, 5, 2 ); + $jj = substr( $changeset_date, 8, 2 ); + $aa = substr( $changeset_date, 0, 4 ); + $valid_date = wp_checkdate( $mm, $jj, $aa, $changeset_date ); + if ( ! $valid_date ) { + wp_send_json_error( 'bad_customize_changeset_date', 400 ); + } + $changeset_date_gmt = get_gmt_from_date( $changeset_date ); + } else { + $timestamp = strtotime( $changeset_date ); + if ( ! $timestamp ) { + wp_send_json_error( 'bad_customize_changeset_date', 400 ); + } + $changeset_date_gmt = gmdate( 'Y-m-d H:i:s', $timestamp ); + } + } + + $lock_user_id = null; + $autosave = ! empty( $_POST['customize_changeset_autosave'] ); + if ( ! $is_new_changeset ) { + $lock_user_id = wp_check_post_lock( $this->changeset_post_id() ); + } + + // Force request to autosave when changeset is locked. + if ( $lock_user_id && ! $autosave ) { + $autosave = true; + $changeset_status = null; + $changeset_date_gmt = null; + } + + if ( $autosave && ! defined( 'DOING_AUTOSAVE' ) ) { // Back-compat. + define( 'DOING_AUTOSAVE', true ); + } + + $autosaved = false; + $r = $this->save_changeset_post( + array( + 'status' => $changeset_status, + 'title' => $changeset_title, + 'date_gmt' => $changeset_date_gmt, + 'data' => $input_changeset_data, + 'autosave' => $autosave, + ) + ); + if ( $autosave && ! is_wp_error( $r ) ) { + $autosaved = true; + } + + // If the changeset was locked and an autosave request wasn't itself an error, then now explicitly return with a failure. + if ( $lock_user_id && ! is_wp_error( $r ) ) { + $r = new WP_Error( + 'changeset_locked', + __( 'Changeset is being edited by other user.' ), + array( + 'lock_user' => $this->get_lock_user_data( $lock_user_id ), + ) + ); + } + + if ( is_wp_error( $r ) ) { + $response = array( + 'message' => $r->get_error_message(), + 'code' => $r->get_error_code(), + ); + if ( is_array( $r->get_error_data() ) ) { + $response = array_merge( $response, $r->get_error_data() ); + } else { + $response['data'] = $r->get_error_data(); + } + } else { + $response = $r; + $changeset_post = get_post( $this->changeset_post_id() ); + + // Dismiss all other auto-draft changeset posts for this user (they serve like autosave revisions), as there should only be one. + if ( $is_new_changeset ) { + $this->dismiss_user_auto_draft_changesets(); + } + + // Note that if the changeset status was publish, then it will get set to Trash if revisions are not supported. + $response['changeset_status'] = $changeset_post->post_status; + if ( $is_publish && 'trash' === $response['changeset_status'] ) { + $response['changeset_status'] = 'publish'; + } + + if ( 'publish' !== $response['changeset_status'] ) { + $this->set_changeset_lock( $changeset_post->ID ); + } + + if ( 'future' === $response['changeset_status'] ) { + $response['changeset_date'] = $changeset_post->post_date; + } + + if ( 'publish' === $response['changeset_status'] || 'trash' === $response['changeset_status'] ) { + $response['next_changeset_uuid'] = wp_generate_uuid4(); + } + } + + if ( $autosave ) { + $response['autosaved'] = $autosaved; + } + + if ( isset( $response['setting_validities'] ) ) { + $response['setting_validities'] = array_map( array( $this, 'prepare_setting_validity_for_js' ), $response['setting_validities'] ); + } + + /** + * Filters response data for a successful customize_save Ajax request. + * + * This filter does not apply if there was a nonce or authentication failure. + * + * @since 4.2.0 + * + * @param array $response Additional information passed back to the 'saved' + * event on `wp.customize`. + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + $response = apply_filters( 'customize_save_response', $response, $this ); + + if ( is_wp_error( $r ) ) { + wp_send_json_error( $response ); + } else { + wp_send_json_success( $response ); + } + } + + /** + * Save the post for the loaded changeset. + * + * @since 4.7.0 + * + * @param array $args { + * Args for changeset post. + * + * @type array $data Optional additional changeset data. Values will be merged on top of any existing post values. + * @type string $status Post status. Optional. If supplied, the save will be transactional and a post revision will be allowed. + * @type string $title Post title. Optional. + * @type string $date_gmt Date in GMT. Optional. + * @type int $user_id ID for user who is saving the changeset. Optional, defaults to the current user ID. + * @type bool $starter_content Whether the data is starter content. If false (default), then $starter_content will be cleared for any $data being saved. + * @type bool $autosave Whether this is a request to create an autosave revision. + * } + * + * @return array|WP_Error Returns array on success and WP_Error with array data on error. + */ + function save_changeset_post( $args = array() ) { + + $args = array_merge( + array( + 'status' => null, + 'title' => null, + 'data' => array(), + 'date_gmt' => null, + 'user_id' => get_current_user_id(), + 'starter_content' => false, + 'autosave' => false, + ), + $args + ); + + $changeset_post_id = $this->changeset_post_id(); + $existing_changeset_data = array(); + if ( $changeset_post_id ) { + $existing_status = get_post_status( $changeset_post_id ); + if ( 'publish' === $existing_status || 'trash' === $existing_status ) { + return new WP_Error( + 'changeset_already_published', + __( 'The previous set of changes has already been published. Please try saving your current set of changes again.' ), + array( + 'next_changeset_uuid' => wp_generate_uuid4(), + ) + ); + } + + $existing_changeset_data = $this->get_changeset_post_data( $changeset_post_id ); + if ( is_wp_error( $existing_changeset_data ) ) { + return $existing_changeset_data; + } + } + + // Fail if attempting to publish but publish hook is missing. + if ( 'publish' === $args['status'] && false === has_action( 'transition_post_status', '_wp_customize_publish_changeset' ) ) { + return new WP_Error( 'missing_publish_callback' ); + } + + // Validate date. + $now = gmdate( 'Y-m-d H:i:59' ); + if ( $args['date_gmt'] ) { + $is_future_dated = ( mysql2date( 'U', $args['date_gmt'], false ) > mysql2date( 'U', $now, false ) ); + if ( ! $is_future_dated ) { + return new WP_Error( 'not_future_date', __( 'You must supply a future date to schedule.' ) ); // Only future dates are allowed. + } + + if ( ! $this->is_theme_active() && ( 'future' === $args['status'] || $is_future_dated ) ) { + return new WP_Error( 'cannot_schedule_theme_switches' ); // This should be allowed in the future, when theme is a regular setting. + } + $will_remain_auto_draft = ( ! $args['status'] && ( ! $changeset_post_id || 'auto-draft' === get_post_status( $changeset_post_id ) ) ); + if ( $will_remain_auto_draft ) { + return new WP_Error( 'cannot_supply_date_for_auto_draft_changeset' ); + } + } elseif ( $changeset_post_id && 'future' === $args['status'] ) { + + // Fail if the new status is future but the existing post's date is not in the future. + $changeset_post = get_post( $changeset_post_id ); + if ( mysql2date( 'U', $changeset_post->post_date_gmt, false ) <= mysql2date( 'U', $now, false ) ) { + return new WP_Error( 'not_future_date', __( 'You must supply a future date to schedule.' ) ); + } + } + + if ( ! empty( $is_future_dated ) && 'publish' === $args['status'] ) { + $args['status'] = 'future'; + } + + // Validate autosave param. See _wp_post_revision_fields() for why these fields are disallowed. + if ( $args['autosave'] ) { + if ( $args['date_gmt'] ) { + return new WP_Error( 'illegal_autosave_with_date_gmt' ); + } elseif ( $args['status'] ) { + return new WP_Error( 'illegal_autosave_with_status' ); + } elseif ( $args['user_id'] && get_current_user_id() !== $args['user_id'] ) { + return new WP_Error( 'illegal_autosave_with_non_current_user' ); + } + } + + // The request was made via wp.customize.previewer.save(). + $update_transactionally = (bool) $args['status']; + $allow_revision = (bool) $args['status']; + + // Amend post values with any supplied data. + foreach ( $args['data'] as $setting_id => $setting_params ) { + if ( is_array( $setting_params ) && array_key_exists( 'value', $setting_params ) ) { + $this->set_post_value( $setting_id, $setting_params['value'] ); // Add to post values so that they can be validated and sanitized. + } + } + + // Note that in addition to post data, this will include any stashed theme mods. + $post_values = $this->unsanitized_post_values( + array( + 'exclude_changeset' => true, + 'exclude_post_data' => false, + ) + ); + $this->add_dynamic_settings( array_keys( $post_values ) ); // Ensure settings get created even if they lack an input value. + + /* + * Get list of IDs for settings that have values different from what is currently + * saved in the changeset. By skipping any values that are already the same, the + * subset of changed settings can be passed into validate_setting_values to prevent + * an underprivileged modifying a single setting for which they have the capability + * from being blocked from saving. This also prevents a user from touching of the + * previous saved settings and overriding the associated user_id if they made no change. + */ + $changed_setting_ids = array(); + foreach ( $post_values as $setting_id => $setting_value ) { + $setting = $this->get_setting( $setting_id ); + + if ( $setting && 'theme_mod' === $setting->type ) { + $prefixed_setting_id = $this->get_stylesheet() . '::' . $setting->id; + } else { + $prefixed_setting_id = $setting_id; + } + + $is_value_changed = ( + ! isset( $existing_changeset_data[ $prefixed_setting_id ] ) + || + ! array_key_exists( 'value', $existing_changeset_data[ $prefixed_setting_id ] ) + || + $existing_changeset_data[ $prefixed_setting_id ]['value'] !== $setting_value + ); + if ( $is_value_changed ) { + $changed_setting_ids[] = $setting_id; + } + } + + /** + * Fires before save validation happens. + * + * Plugins can add just-in-time {@see 'customize_validate_{$this->ID}'} filters + * at this point to catch any settings registered after `customize_register`. + * The dynamic portion of the hook name, `$this->ID` refers to the setting ID. + * + * @since 4.6.0 + * + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + do_action( 'customize_save_validation_before', $this ); + + // Validate settings. + $validated_values = array_merge( + array_fill_keys( array_keys( $args['data'] ), null ), // Make sure existence/capability checks are done on value-less setting updates. + $post_values + ); + $setting_validities = $this->validate_setting_values( + $validated_values, + array( + 'validate_capability' => true, + 'validate_existence' => true, + ) + ); + $invalid_setting_count = count( array_filter( $setting_validities, 'is_wp_error' ) ); + + /* + * Short-circuit if there are invalid settings the update is transactional. + * A changeset update is transactional when a status is supplied in the request. + */ + if ( $update_transactionally && $invalid_setting_count > 0 ) { + $response = array( + 'setting_validities' => $setting_validities, + /* translators: %s: Number of invalid settings. */ + 'message' => sprintf( _n( 'Unable to save due to %s invalid setting.', 'Unable to save due to %s invalid settings.', $invalid_setting_count ), number_format_i18n( $invalid_setting_count ) ), + ); + return new WP_Error( 'transaction_fail', '', $response ); + } + + // Obtain/merge data for changeset. + $original_changeset_data = $this->get_changeset_post_data( $changeset_post_id ); + $data = $original_changeset_data; + if ( is_wp_error( $data ) ) { + $data = array(); + } + + // Ensure that all post values are included in the changeset data. + foreach ( $post_values as $setting_id => $post_value ) { + if ( ! isset( $args['data'][ $setting_id ] ) ) { + $args['data'][ $setting_id ] = array(); + } + if ( ! isset( $args['data'][ $setting_id ]['value'] ) ) { + $args['data'][ $setting_id ]['value'] = $post_value; + } + } + + foreach ( $args['data'] as $setting_id => $setting_params ) { + $setting = $this->get_setting( $setting_id ); + if ( ! $setting || ! $setting->check_capabilities() ) { + continue; + } + + // Skip updating changeset for invalid setting values. + if ( isset( $setting_validities[ $setting_id ] ) && is_wp_error( $setting_validities[ $setting_id ] ) ) { + continue; + } + + $changeset_setting_id = $setting_id; + if ( 'theme_mod' === $setting->type ) { + $changeset_setting_id = sprintf( '%s::%s', $this->get_stylesheet(), $setting_id ); + } + + if ( null === $setting_params ) { + // Remove setting from changeset entirely. + unset( $data[ $changeset_setting_id ] ); + } else { + + if ( ! isset( $data[ $changeset_setting_id ] ) ) { + $data[ $changeset_setting_id ] = array(); + } + + // Merge any additional setting params that have been supplied with the existing params. + $merged_setting_params = array_merge( $data[ $changeset_setting_id ], $setting_params ); + + // Skip updating setting params if unchanged (ensuring the user_id is not overwritten). + if ( $data[ $changeset_setting_id ] === $merged_setting_params ) { + continue; + } + + $data[ $changeset_setting_id ] = array_merge( + $merged_setting_params, + array( + 'type' => $setting->type, + 'user_id' => $args['user_id'], + 'date_modified_gmt' => current_time( 'mysql', true ), + ) + ); + + // Clear starter_content flag in data if changeset is not explicitly being updated for starter content. + if ( empty( $args['starter_content'] ) ) { + unset( $data[ $changeset_setting_id ]['starter_content'] ); + } + } + } + + $filter_context = array( + 'uuid' => $this->changeset_uuid(), + 'title' => $args['title'], + 'status' => $args['status'], + 'date_gmt' => $args['date_gmt'], + 'post_id' => $changeset_post_id, + 'previous_data' => is_wp_error( $original_changeset_data ) ? array() : $original_changeset_data, + 'manager' => $this, + ); + + /** + * Filters the settings' data that will be persisted into the changeset. + * + * Plugins may amend additional data (such as additional meta for settings) into the changeset with this filter. + * + * @since 4.7.0 + * + * @param array $data Updated changeset data, mapping setting IDs to arrays containing a $value item and optionally other metadata. + * @param array $context { + * Filter context. + * + * @type string $uuid Changeset UUID. + * @type string $title Requested title for the changeset post. + * @type string $status Requested status for the changeset post. + * @type string $date_gmt Requested date for the changeset post in MySQL format and GMT timezone. + * @type int|false $post_id Post ID for the changeset, or false if it doesn't exist yet. + * @type array $previous_data Previous data contained in the changeset. + * @type WP_Customize_Manager $manager Manager instance. + * } + */ + $data = apply_filters( 'customize_changeset_save_data', $data, $filter_context ); + + // Switch theme if publishing changes now. + if ( 'publish' === $args['status'] && ! $this->is_theme_active() ) { + // Temporarily stop previewing the theme to allow switch_themes() to operate properly. + $this->stop_previewing_theme(); + switch_theme( $this->get_stylesheet() ); + update_option( 'theme_switched_via_customizer', true ); + $this->start_previewing_theme(); + } + + // Gather the data for wp_insert_post()/wp_update_post(). + $post_array = array( + // JSON_UNESCAPED_SLASHES is only to improve readability as slashes needn't be escaped in storage. + 'post_content' => wp_json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT ), + ); + if ( $args['title'] ) { + $post_array['post_title'] = $args['title']; + } + if ( $changeset_post_id ) { + $post_array['ID'] = $changeset_post_id; + } else { + $post_array['post_type'] = 'customize_changeset'; + $post_array['post_name'] = $this->changeset_uuid(); + $post_array['post_status'] = 'auto-draft'; + } + if ( $args['status'] ) { + $post_array['post_status'] = $args['status']; + } + + // Reset post date to now if we are publishing, otherwise pass post_date_gmt and translate for post_date. + if ( 'publish' === $args['status'] ) { + $post_array['post_date_gmt'] = '0000-00-00 00:00:00'; + $post_array['post_date'] = '0000-00-00 00:00:00'; + } elseif ( $args['date_gmt'] ) { + $post_array['post_date_gmt'] = $args['date_gmt']; + $post_array['post_date'] = get_date_from_gmt( $args['date_gmt'] ); + } elseif ( $changeset_post_id && 'auto-draft' === get_post_status( $changeset_post_id ) ) { + /* + * Keep bumping the date for the auto-draft whenever it is modified; + * this extends its life, preserving it from garbage-collection via + * wp_delete_auto_drafts(). + */ + $post_array['post_date'] = current_time( 'mysql' ); + $post_array['post_date_gmt'] = ''; + } + + $this->store_changeset_revision = $allow_revision; + add_filter( 'wp_save_post_revision_post_has_changed', array( $this, '_filter_revision_post_has_changed' ), 5, 3 ); + + /* + * Update the changeset post. The publish_customize_changeset action will cause the settings in the + * changeset to be saved via WP_Customize_Setting::save(). Updating a post with publish status will + * trigger WP_Customize_Manager::publish_changeset_values(). + */ + add_filter( 'wp_insert_post_data', array( $this, 'preserve_insert_changeset_post_content' ), 5, 3 ); + if ( $changeset_post_id ) { + if ( $args['autosave'] && 'auto-draft' !== get_post_status( $changeset_post_id ) ) { + // See _wp_translate_postdata() for why this is required as it will use the edit_post meta capability. + add_filter( 'map_meta_cap', array( $this, 'grant_edit_post_capability_for_changeset' ), 10, 4 ); + + $post_array['post_ID'] = $post_array['ID']; + $post_array['post_type'] = 'customize_changeset'; + + $r = wp_create_post_autosave( wp_slash( $post_array ) ); + + remove_filter( 'map_meta_cap', array( $this, 'grant_edit_post_capability_for_changeset' ), 10 ); + } else { + $post_array['edit_date'] = true; // Prevent date clearing. + + $r = wp_update_post( wp_slash( $post_array ), true ); + + // Delete autosave revision for user when the changeset is updated. + if ( ! empty( $args['user_id'] ) ) { + $autosave_draft = wp_get_post_autosave( $changeset_post_id, $args['user_id'] ); + if ( $autosave_draft ) { + wp_delete_post( $autosave_draft->ID, true ); + } + } + } + } else { + $r = wp_insert_post( wp_slash( $post_array ), true ); + if ( ! is_wp_error( $r ) ) { + $this->_changeset_post_id = $r; // Update cached post ID for the loaded changeset. + } + } + remove_filter( 'wp_insert_post_data', array( $this, 'preserve_insert_changeset_post_content' ), 5 ); + + $this->_changeset_data = null; // Reset so WP_Customize_Manager::changeset_data() will re-populate with updated contents. + + remove_filter( 'wp_save_post_revision_post_has_changed', array( $this, '_filter_revision_post_has_changed' ) ); + + $response = array( + 'setting_validities' => $setting_validities, + ); + + if ( is_wp_error( $r ) ) { + $response['changeset_post_save_failure'] = $r->get_error_code(); + return new WP_Error( 'changeset_post_save_failure', '', $response ); + } + + return $response; + } + + /** + * Preserve the initial JSON post_content passed to save into the post. + * + * This is needed to prevent KSES and other {@see 'content_save_pre'} filters + * from corrupting JSON data. + * + * Note that WP_Customize_Manager::validate_setting_values() have already + * run on the setting values being serialized as JSON into the post content + * so it is pre-sanitized. + * + * Also, the sanitization logic is re-run through the respective + * WP_Customize_Setting::sanitize() method when being read out of the + * changeset, via WP_Customize_Manager::post_value(), and this sanitized + * value will also be sent into WP_Customize_Setting::update() for + * persisting to the DB. + * + * Multiple users can collaborate on a single changeset, where one user may + * have the unfiltered_html capability but another may not. A user with + * unfiltered_html may add a script tag to some field which needs to be kept + * intact even when another user updates the changeset to modify another field + * when they do not have unfiltered_html. + * + * @since 5.4.1 + * + * @param array $data An array of slashed and processed post data. + * @param array $postarr An array of sanitized (and slashed) but otherwise unmodified post data. + * @param array $unsanitized_postarr An array of slashed yet *unsanitized* and unprocessed post data as originally passed to wp_insert_post(). + * @return array Filtered post data. + */ + public function preserve_insert_changeset_post_content( $data, $postarr, $unsanitized_postarr ) { + if ( + isset( $data['post_type'] ) && + isset( $unsanitized_postarr['post_content'] ) && + 'customize_changeset' === $data['post_type'] || + ( + 'revision' === $data['post_type'] && + ! empty( $data['post_parent'] ) && + 'customize_changeset' === get_post_type( $data['post_parent'] ) + ) + ) { + $data['post_content'] = $unsanitized_postarr['post_content']; + } + return $data; + } + + /** + * Trash or delete a changeset post. + * + * The following re-formulates the logic from `wp_trash_post()` as done in + * `wp_publish_post()`. The reason for bypassing `wp_trash_post()` is that it + * will mutate the the `post_content` and the `post_name` when they should be + * untouched. + * + * @since 4.9.0 + * @global wpdb $wpdb WordPress database abstraction object. + * @see wp_trash_post() + * + * @param int|WP_Post $post The changeset post. + * @return mixed A WP_Post object for the trashed post or an empty value on failure. + */ + public function trash_changeset_post( $post ) { + global $wpdb; + + $post = get_post( $post ); + + if ( ! ( $post instanceof WP_Post ) ) { + return $post; + } + $post_id = $post->ID; + + if ( ! EMPTY_TRASH_DAYS ) { + return wp_delete_post( $post_id, true ); + } + + if ( 'trash' === get_post_status( $post ) ) { + return false; + } + + /** This filter is documented in wp-includes/post.php */ + $check = apply_filters( 'pre_trash_post', null, $post ); + if ( null !== $check ) { + return $check; + } + + /** This action is documented in wp-includes/post.php */ + do_action( 'wp_trash_post', $post_id ); + + add_post_meta( $post_id, '_wp_trash_meta_status', $post->post_status ); + add_post_meta( $post_id, '_wp_trash_meta_time', time() ); + + $old_status = $post->post_status; + $new_status = 'trash'; + $wpdb->update( $wpdb->posts, array( 'post_status' => $new_status ), array( 'ID' => $post->ID ) ); + clean_post_cache( $post->ID ); + + $post->post_status = $new_status; + wp_transition_post_status( $new_status, $old_status, $post ); + + /** This action is documented in wp-includes/post.php */ + do_action( "edit_post_{$post->post_type}", $post->ID, $post ); + + /** This action is documented in wp-includes/post.php */ + do_action( 'edit_post', $post->ID, $post ); + + /** This action is documented in wp-includes/post.php */ + do_action( "save_post_{$post->post_type}", $post->ID, $post, true ); + + /** This action is documented in wp-includes/post.php */ + do_action( 'save_post', $post->ID, $post, true ); + + /** This action is documented in wp-includes/post.php */ + do_action( 'wp_insert_post', $post->ID, $post, true ); + + wp_trash_post_comments( $post_id ); + + /** This action is documented in wp-includes/post.php */ + do_action( 'trashed_post', $post_id ); + + return $post; + } + + /** + * Handle request to trash a changeset. + * + * @since 4.9.0 + */ + public function handle_changeset_trash_request() { + if ( ! is_user_logged_in() ) { + wp_send_json_error( 'unauthenticated' ); + } + + if ( ! $this->is_preview() ) { + wp_send_json_error( 'not_preview' ); + } + + if ( ! check_ajax_referer( 'trash_customize_changeset', 'nonce', false ) ) { + wp_send_json_error( + array( + 'code' => 'invalid_nonce', + 'message' => __( 'There was an authentication problem. Please reload and try again.' ), + ) + ); + } + + $changeset_post_id = $this->changeset_post_id(); + + if ( ! $changeset_post_id ) { + wp_send_json_error( + array( + 'message' => __( 'No changes saved yet, so there is nothing to trash.' ), + 'code' => 'non_existent_changeset', + ) + ); + return; + } + + if ( $changeset_post_id && ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->delete_post, $changeset_post_id ) ) { + wp_send_json_error( + array( + 'code' => 'changeset_trash_unauthorized', + 'message' => __( 'Unable to trash changes.' ), + ) + ); + } + + if ( 'trash' === get_post_status( $changeset_post_id ) ) { + wp_send_json_error( + array( + 'message' => __( 'Changes have already been trashed.' ), + 'code' => 'changeset_already_trashed', + ) + ); + return; + } + + $r = $this->trash_changeset_post( $changeset_post_id ); + if ( ! ( $r instanceof WP_Post ) ) { + wp_send_json_error( + array( + 'code' => 'changeset_trash_failure', + 'message' => __( 'Unable to trash changes.' ), + ) + ); + } + + wp_send_json_success( + array( + 'message' => __( 'Changes trashed successfully.' ), + ) + ); + } + + /** + * Re-map 'edit_post' meta cap for a customize_changeset post to be the same as 'customize' maps. + * + * There is essentially a "meta meta" cap in play here, where 'edit_post' meta cap maps to + * the 'customize' meta cap which then maps to 'edit_theme_options'. This is currently + * required in core for `wp_create_post_autosave()` because it will call + * `_wp_translate_postdata()` which in turn will check if a user can 'edit_post', but the + * the caps for the customize_changeset post type are all mapping to the meta capability. + * This should be able to be removed once #40922 is addressed in core. + * + * @since 4.9.0 + * @link https://core.trac.wordpress.org/ticket/40922 + * @see WP_Customize_Manager::save_changeset_post() + * @see _wp_translate_postdata() + * + * @param string[] $caps Array of the user's capabilities. + * @param string $cap Capability name. + * @param int $user_id The user ID. + * @param array $args Adds the context to the cap. Typically the object ID. + * @return array Capabilities. + */ + public function grant_edit_post_capability_for_changeset( $caps, $cap, $user_id, $args ) { + if ( 'edit_post' === $cap && ! empty( $args[0] ) && 'customize_changeset' === get_post_type( $args[0] ) ) { + $post_type_obj = get_post_type_object( 'customize_changeset' ); + $caps = map_meta_cap( $post_type_obj->cap->$cap, $user_id ); + } + return $caps; + } + + /** + * Marks the changeset post as being currently edited by the current user. + * + * @since 4.9.0 + * + * @param int $changeset_post_id Changeset post id. + * @param bool $take_over Take over the changeset, default is false. + */ + public function set_changeset_lock( $changeset_post_id, $take_over = false ) { + if ( $changeset_post_id ) { + $can_override = ! (bool) get_post_meta( $changeset_post_id, '_edit_lock', true ); + + if ( $take_over ) { + $can_override = true; + } + + if ( $can_override ) { + $lock = sprintf( '%s:%s', time(), get_current_user_id() ); + update_post_meta( $changeset_post_id, '_edit_lock', $lock ); + } else { + $this->refresh_changeset_lock( $changeset_post_id ); + } + } + } + + /** + * Refreshes changeset lock with the current time if current user edited the changeset before. + * + * @since 4.9.0 + * + * @param int $changeset_post_id Changeset post id. + */ + public function refresh_changeset_lock( $changeset_post_id ) { + if ( ! $changeset_post_id ) { + return; + } + $lock = get_post_meta( $changeset_post_id, '_edit_lock', true ); + $lock = explode( ':', $lock ); + + if ( $lock && ! empty( $lock[1] ) ) { + $user_id = intval( $lock[1] ); + $current_user_id = get_current_user_id(); + if ( $user_id === $current_user_id ) { + $lock = sprintf( '%s:%s', time(), $user_id ); + update_post_meta( $changeset_post_id, '_edit_lock', $lock ); + } + } + } + + /** + * Filter heartbeat settings for the Customizer. + * + * @since 4.9.0 + * @param array $settings Current settings to filter. + * @return array Heartbeat settings. + */ + public function add_customize_screen_to_heartbeat_settings( $settings ) { + global $pagenow; + if ( 'customize.php' === $pagenow ) { + $settings['screenId'] = 'customize'; + } + return $settings; + } + + /** + * Get lock user data. + * + * @since 4.9.0 + * + * @param int $user_id User ID. + * @return array|null User data formatted for client. + */ + protected function get_lock_user_data( $user_id ) { + if ( ! $user_id ) { + return null; + } + $lock_user = get_userdata( $user_id ); + if ( ! $lock_user ) { + return null; + } + return array( + 'id' => $lock_user->ID, + 'name' => $lock_user->display_name, + 'avatar' => get_avatar_url( $lock_user->ID, array( 'size' => 128 ) ), + ); + } + + /** + * Check locked changeset with heartbeat API. + * + * @since 4.9.0 + * + * @param array $response The Heartbeat response. + * @param array $data The $_POST data sent. + * @param string $screen_id The screen id. + * @return array The Heartbeat response. + */ + public function check_changeset_lock_with_heartbeat( $response, $data, $screen_id ) { + if ( isset( $data['changeset_uuid'] ) ) { + $changeset_post_id = $this->find_changeset_post_id( $data['changeset_uuid'] ); + } else { + $changeset_post_id = $this->changeset_post_id(); + } + + if ( + array_key_exists( 'check_changeset_lock', $data ) + && 'customize' === $screen_id + && $changeset_post_id + && current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post_id ) + ) { + $lock_user_id = wp_check_post_lock( $changeset_post_id ); + + if ( $lock_user_id ) { + $response['customize_changeset_lock_user'] = $this->get_lock_user_data( $lock_user_id ); + } else { + + // Refreshing time will ensure that the user is sitting on customizer and has not closed the customizer tab. + $this->refresh_changeset_lock( $changeset_post_id ); + } + } + + return $response; + } + + /** + * Removes changeset lock when take over request is sent via Ajax. + * + * @since 4.9.0 + */ + public function handle_override_changeset_lock_request() { + if ( ! $this->is_preview() ) { + wp_send_json_error( 'not_preview', 400 ); + } + + if ( ! check_ajax_referer( 'customize_override_changeset_lock', 'nonce', false ) ) { + wp_send_json_error( + array( + 'code' => 'invalid_nonce', + 'message' => __( 'Security check failed.' ), + ) + ); + } + + $changeset_post_id = $this->changeset_post_id(); + + if ( empty( $changeset_post_id ) ) { + wp_send_json_error( + array( + 'code' => 'no_changeset_found_to_take_over', + 'message' => __( 'No changeset found to take over' ), + ) + ); + } + + if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post_id ) ) { + wp_send_json_error( + array( + 'code' => 'cannot_remove_changeset_lock', + 'message' => __( 'Sorry, you are not allowed to take over.' ), + ) + ); + } + + $this->set_changeset_lock( $changeset_post_id, true ); + + wp_send_json_success( 'changeset_taken_over' ); + } + + /** + * Whether a changeset revision should be made. + * + * @since 4.7.0 + * @var bool + */ + protected $store_changeset_revision; + + /** + * Filters whether a changeset has changed to create a new revision. + * + * Note that this will not be called while a changeset post remains in auto-draft status. + * + * @since 4.7.0 + * + * @param bool $post_has_changed Whether the post has changed. + * @param WP_Post $last_revision The last revision post object. + * @param WP_Post $post The post object. + * @return bool Whether a revision should be made. + */ + public function _filter_revision_post_has_changed( $post_has_changed, $last_revision, $post ) { + unset( $last_revision ); + if ( 'customize_changeset' === $post->post_type ) { + $post_has_changed = $this->store_changeset_revision; + } + return $post_has_changed; + } + + /** + * Publish changeset values. + * + * This will the values contained in a changeset, even changesets that do not + * correspond to current manager instance. This is called by + * `_wp_customize_publish_changeset()` when a customize_changeset post is + * transitioned to the `publish` status. As such, this method should not be + * called directly and instead `wp_publish_post()` should be used. + * + * Please note that if the settings in the changeset are for a non-activated + * theme, the theme must first be switched to (via `switch_theme()`) before + * invoking this method. + * + * @since 4.7.0 + * @see _wp_customize_publish_changeset() + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $changeset_post_id ID for customize_changeset post. Defaults to the changeset for the current manager instance. + * @return true|WP_Error True or error info. + */ + public function _publish_changeset_values( $changeset_post_id ) { + global $wpdb; + + $publishing_changeset_data = $this->get_changeset_post_data( $changeset_post_id ); + if ( is_wp_error( $publishing_changeset_data ) ) { + return $publishing_changeset_data; + } + + $changeset_post = get_post( $changeset_post_id ); + + /* + * Temporarily override the changeset context so that it will be read + * in calls to unsanitized_post_values() and so that it will be available + * on the $wp_customize object passed to hooks during the save logic. + */ + $previous_changeset_post_id = $this->_changeset_post_id; + $this->_changeset_post_id = $changeset_post_id; + $previous_changeset_uuid = $this->_changeset_uuid; + $this->_changeset_uuid = $changeset_post->post_name; + $previous_changeset_data = $this->_changeset_data; + $this->_changeset_data = $publishing_changeset_data; + + // Parse changeset data to identify theme mod settings and user IDs associated with settings to be saved. + $setting_user_ids = array(); + $theme_mod_settings = array(); + $namespace_pattern = '/^(?P<stylesheet>.+?)::(?P<setting_id>.+)$/'; + $matches = array(); + foreach ( $this->_changeset_data as $raw_setting_id => $setting_params ) { + $actual_setting_id = null; + $is_theme_mod_setting = ( + isset( $setting_params['value'] ) + && + isset( $setting_params['type'] ) + && + 'theme_mod' === $setting_params['type'] + && + preg_match( $namespace_pattern, $raw_setting_id, $matches ) + ); + if ( $is_theme_mod_setting ) { + if ( ! isset( $theme_mod_settings[ $matches['stylesheet'] ] ) ) { + $theme_mod_settings[ $matches['stylesheet'] ] = array(); + } + $theme_mod_settings[ $matches['stylesheet'] ][ $matches['setting_id'] ] = $setting_params; + + if ( $this->get_stylesheet() === $matches['stylesheet'] ) { + $actual_setting_id = $matches['setting_id']; + } + } else { + $actual_setting_id = $raw_setting_id; + } + + // Keep track of the user IDs for settings actually for this theme. + if ( $actual_setting_id && isset( $setting_params['user_id'] ) ) { + $setting_user_ids[ $actual_setting_id ] = $setting_params['user_id']; + } + } + + $changeset_setting_values = $this->unsanitized_post_values( + array( + 'exclude_post_data' => true, + 'exclude_changeset' => false, + ) + ); + $changeset_setting_ids = array_keys( $changeset_setting_values ); + $this->add_dynamic_settings( $changeset_setting_ids ); + + /** + * Fires once the theme has switched in the Customizer, but before settings + * have been saved. + * + * @since 3.4.0 + * + * @param WP_Customize_Manager $manager WP_Customize_Manager instance. + */ + do_action( 'customize_save', $this ); + + /* + * Ensure that all settings will allow themselves to be saved. Note that + * this is safe because the setting would have checked the capability + * when the setting value was written into the changeset. So this is why + * an additional capability check is not required here. + */ + $original_setting_capabilities = array(); + foreach ( $changeset_setting_ids as $setting_id ) { + $setting = $this->get_setting( $setting_id ); + if ( $setting && ! isset( $setting_user_ids[ $setting_id ] ) ) { + $original_setting_capabilities[ $setting->id ] = $setting->capability; + $setting->capability = 'exist'; + } + } + + $original_user_id = get_current_user_id(); + foreach ( $changeset_setting_ids as $setting_id ) { + $setting = $this->get_setting( $setting_id ); + if ( $setting ) { + /* + * Set the current user to match the user who saved the value into + * the changeset so that any filters that apply during the save + * process will respect the original user's capabilities. This + * will ensure, for example, that KSES won't strip unsafe HTML + * when a scheduled changeset publishes via WP Cron. + */ + if ( isset( $setting_user_ids[ $setting_id ] ) ) { + wp_set_current_user( $setting_user_ids[ $setting_id ] ); + } else { + wp_set_current_user( $original_user_id ); + } + + $setting->save(); + } + } + wp_set_current_user( $original_user_id ); + + // Update the stashed theme mod settings, removing the active theme's stashed settings, if activated. + if ( did_action( 'switch_theme' ) ) { + $other_theme_mod_settings = $theme_mod_settings; + unset( $other_theme_mod_settings[ $this->get_stylesheet() ] ); + $this->update_stashed_theme_mod_settings( $other_theme_mod_settings ); + } + + /** + * Fires after Customize settings have been saved. + * + * @since 3.6.0 + * + * @param WP_Customize_Manager $manager WP_Customize_Manager instance. + */ + do_action( 'customize_save_after', $this ); + + // Restore original capabilities. + foreach ( $original_setting_capabilities as $setting_id => $capability ) { + $setting = $this->get_setting( $setting_id ); + if ( $setting ) { + $setting->capability = $capability; + } + } + + // Restore original changeset data. + $this->_changeset_data = $previous_changeset_data; + $this->_changeset_post_id = $previous_changeset_post_id; + $this->_changeset_uuid = $previous_changeset_uuid; + + /* + * Convert all autosave revisions into their own auto-drafts so that users can be prompted to + * restore them when a changeset is published, but they had been locked out from including + * their changes in the changeset. + */ + $revisions = wp_get_post_revisions( $changeset_post_id, array( 'check_enabled' => false ) ); + foreach ( $revisions as $revision ) { + if ( false !== strpos( $revision->post_name, "{$changeset_post_id}-autosave" ) ) { + $wpdb->update( + $wpdb->posts, + array( + 'post_status' => 'auto-draft', + 'post_type' => 'customize_changeset', + 'post_name' => wp_generate_uuid4(), + 'post_parent' => 0, + ), + array( + 'ID' => $revision->ID, + ) + ); + clean_post_cache( $revision->ID ); + } + } + + return true; + } + + /** + * Update stashed theme mod settings. + * + * @since 4.7.0 + * + * @param array $inactive_theme_mod_settings Mapping of stylesheet to arrays of theme mod settings. + * @return array|false Returns array of updated stashed theme mods or false if the update failed or there were no changes. + */ + protected function update_stashed_theme_mod_settings( $inactive_theme_mod_settings ) { + $stashed_theme_mod_settings = get_option( 'customize_stashed_theme_mods' ); + if ( empty( $stashed_theme_mod_settings ) ) { + $stashed_theme_mod_settings = array(); + } + + // Delete any stashed theme mods for the active theme since they would have been loaded and saved upon activation. + unset( $stashed_theme_mod_settings[ $this->get_stylesheet() ] ); + + // Merge inactive theme mods with the stashed theme mod settings. + foreach ( $inactive_theme_mod_settings as $stylesheet => $theme_mod_settings ) { + if ( ! isset( $stashed_theme_mod_settings[ $stylesheet ] ) ) { + $stashed_theme_mod_settings[ $stylesheet ] = array(); + } + + $stashed_theme_mod_settings[ $stylesheet ] = array_merge( + $stashed_theme_mod_settings[ $stylesheet ], + $theme_mod_settings + ); + } + + $autoload = false; + $result = update_option( 'customize_stashed_theme_mods', $stashed_theme_mod_settings, $autoload ); + if ( ! $result ) { + return false; + } + return $stashed_theme_mod_settings; + } + + /** + * Refresh nonces for the current preview. + * + * @since 4.2.0 + */ + public function refresh_nonces() { + if ( ! $this->is_preview() ) { + wp_send_json_error( 'not_preview' ); + } + + wp_send_json_success( $this->get_nonces() ); + } + + /** + * Delete a given auto-draft changeset or the autosave revision for a given changeset or delete changeset lock. + * + * @since 4.9.0 + */ + public function handle_dismiss_autosave_or_lock_request() { + // Calls to dismiss_user_auto_draft_changesets() and wp_get_post_autosave() require non-zero get_current_user_id(). + if ( ! is_user_logged_in() ) { + wp_send_json_error( 'unauthenticated', 401 ); + } + + if ( ! $this->is_preview() ) { + wp_send_json_error( 'not_preview', 400 ); + } + + if ( ! check_ajax_referer( 'customize_dismiss_autosave_or_lock', 'nonce', false ) ) { + wp_send_json_error( 'invalid_nonce', 403 ); + } + + $changeset_post_id = $this->changeset_post_id(); + $dismiss_lock = ! empty( $_POST['dismiss_lock'] ); + $dismiss_autosave = ! empty( $_POST['dismiss_autosave'] ); + + if ( $dismiss_lock ) { + if ( empty( $changeset_post_id ) && ! $dismiss_autosave ) { + wp_send_json_error( 'no_changeset_to_dismiss_lock', 404 ); + } + if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post_id ) && ! $dismiss_autosave ) { + wp_send_json_error( 'cannot_remove_changeset_lock', 403 ); + } + + delete_post_meta( $changeset_post_id, '_edit_lock' ); + + if ( ! $dismiss_autosave ) { + wp_send_json_success( 'changeset_lock_dismissed' ); + } + } + + if ( $dismiss_autosave ) { + if ( empty( $changeset_post_id ) || 'auto-draft' === get_post_status( $changeset_post_id ) ) { + $dismissed = $this->dismiss_user_auto_draft_changesets(); + if ( $dismissed > 0 ) { + wp_send_json_success( 'auto_draft_dismissed' ); + } else { + wp_send_json_error( 'no_auto_draft_to_delete', 404 ); + } + } else { + $revision = wp_get_post_autosave( $changeset_post_id, get_current_user_id() ); + + if ( $revision ) { + if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->delete_post, $changeset_post_id ) ) { + wp_send_json_error( 'cannot_delete_autosave_revision', 403 ); + } + + if ( ! wp_delete_post( $revision->ID, true ) ) { + wp_send_json_error( 'autosave_revision_deletion_failure', 500 ); + } else { + wp_send_json_success( 'autosave_revision_deleted' ); + } + } else { + wp_send_json_error( 'no_autosave_revision_to_delete', 404 ); + } + } + } + + wp_send_json_error( 'unknown_error', 500 ); + } + + /** + * Add a customize setting. + * + * @since 3.4.0 + * @since 4.5.0 Return added WP_Customize_Setting instance. + * + * @see WP_Customize_Setting::__construct() + * @link https://developer.wordpress.org/themes/customize-api + * + * @param WP_Customize_Setting|string $id Customize Setting object, or ID. + * @param array $args Optional. Array of properties for the new Setting object. + * See WP_Customize_Setting::__construct() for information + * on accepted arguments. Default empty array. + * @return WP_Customize_Setting The instance of the setting that was added. + */ + public function add_setting( $id, $args = array() ) { + if ( $id instanceof WP_Customize_Setting ) { + $setting = $id; + } else { + $class = 'WP_Customize_Setting'; + + /** This filter is documented in wp-includes/class-wp-customize-manager.php */ + $args = apply_filters( 'customize_dynamic_setting_args', $args, $id ); + + /** This filter is documented in wp-includes/class-wp-customize-manager.php */ + $class = apply_filters( 'customize_dynamic_setting_class', $class, $id, $args ); + + $setting = new $class( $this, $id, $args ); + } + + $this->settings[ $setting->id ] = $setting; + return $setting; + } + + /** + * Register any dynamically-created settings, such as those from $_POST['customized'] + * that have no corresponding setting created. + * + * This is a mechanism to "wake up" settings that have been dynamically created + * on the front end and have been sent to WordPress in `$_POST['customized']`. When WP + * loads, the dynamically-created settings then will get created and previewed + * even though they are not directly created statically with code. + * + * @since 4.2.0 + * + * @param array $setting_ids The setting IDs to add. + * @return array The WP_Customize_Setting objects added. + */ + public function add_dynamic_settings( $setting_ids ) { + $new_settings = array(); + foreach ( $setting_ids as $setting_id ) { + // Skip settings already created. + if ( $this->get_setting( $setting_id ) ) { + continue; + } + + $setting_args = false; + $setting_class = 'WP_Customize_Setting'; + + /** + * Filters a dynamic setting's constructor args. + * + * For a dynamic setting to be registered, this filter must be employed + * to override the default false value with an array of args to pass to + * the WP_Customize_Setting constructor. + * + * @since 4.2.0 + * + * @param false|array $setting_args The arguments to the WP_Customize_Setting constructor. + * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. + */ + $setting_args = apply_filters( 'customize_dynamic_setting_args', $setting_args, $setting_id ); + if ( false === $setting_args ) { + continue; + } + + /** + * Allow non-statically created settings to be constructed with custom WP_Customize_Setting subclass. + * + * @since 4.2.0 + * + * @param string $setting_class WP_Customize_Setting or a subclass. + * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. + * @param array $setting_args WP_Customize_Setting or a subclass. + */ + $setting_class = apply_filters( 'customize_dynamic_setting_class', $setting_class, $setting_id, $setting_args ); + + $setting = new $setting_class( $this, $setting_id, $setting_args ); + + $this->add_setting( $setting ); + $new_settings[] = $setting; + } + return $new_settings; + } + + /** + * Retrieve a customize setting. + * + * @since 3.4.0 + * + * @param string $id Customize Setting ID. + * @return WP_Customize_Setting|void The setting, if set. + */ + public function get_setting( $id ) { + if ( isset( $this->settings[ $id ] ) ) { + return $this->settings[ $id ]; + } + } + + /** + * Remove a customize setting. + * + * Note that removing the setting doesn't destroy the WP_Customize_Setting instance or remove its filters. + * + * @since 3.4.0 + * + * @param string $id Customize Setting ID. + */ + public function remove_setting( $id ) { + unset( $this->settings[ $id ] ); + } + + /** + * Add a customize panel. + * + * @since 4.0.0 + * @since 4.5.0 Return added WP_Customize_Panel instance. + * + * @see WP_Customize_Panel::__construct() + * + * @param WP_Customize_Panel|string $id Customize Panel object, or ID. + * @param array $args Optional. Array of properties for the new Panel object. + * See WP_Customize_Panel::__construct() for information + * on accepted arguments. Default empty array. + * @return WP_Customize_Panel The instance of the panel that was added. + */ + public function add_panel( $id, $args = array() ) { + if ( $id instanceof WP_Customize_Panel ) { + $panel = $id; + } else { + $panel = new WP_Customize_Panel( $this, $id, $args ); + } + + $this->panels[ $panel->id ] = $panel; + return $panel; + } + + /** + * Retrieve a customize panel. + * + * @since 4.0.0 + * + * @param string $id Panel ID to get. + * @return WP_Customize_Panel|void Requested panel instance, if set. + */ + public function get_panel( $id ) { + if ( isset( $this->panels[ $id ] ) ) { + return $this->panels[ $id ]; + } + } + + /** + * Remove a customize panel. + * + * Note that removing the panel doesn't destroy the WP_Customize_Panel instance or remove its filters. + * + * @since 4.0.0 + * + * @param string $id Panel ID to remove. + */ + public function remove_panel( $id ) { + // Removing core components this way is _doing_it_wrong(). + if ( in_array( $id, $this->components, true ) ) { + $message = sprintf( + /* translators: 1: Panel ID, 2: Link to 'customize_loaded_components' filter reference. */ + __( 'Removing %1$s manually will cause PHP warnings. Use the %2$s filter instead.' ), + $id, + '<a href="' . esc_url( 'https://developer.wordpress.org/reference/hooks/customize_loaded_components/' ) . '"><code>customize_loaded_components</code></a>' + ); + + _doing_it_wrong( __METHOD__, $message, '4.5.0' ); + } + unset( $this->panels[ $id ] ); + } + + /** + * Register a customize panel type. + * + * Registered types are eligible to be rendered via JS and created dynamically. + * + * @since 4.3.0 + * + * @see WP_Customize_Panel + * + * @param string $panel Name of a custom panel which is a subclass of WP_Customize_Panel. + */ + public function register_panel_type( $panel ) { + $this->registered_panel_types[] = $panel; + } + + /** + * Render JS templates for all registered panel types. + * + * @since 4.3.0 + */ + public function render_panel_templates() { + foreach ( $this->registered_panel_types as $panel_type ) { + $panel = new $panel_type( $this, 'temp', array() ); + $panel->print_template(); + } + } + + /** + * Add a customize section. + * + * @since 3.4.0 + * @since 4.5.0 Return added WP_Customize_Section instance. + * + * @see WP_Customize_Section::__construct() + * + * @param WP_Customize_Section|string $id Customize Section object, or ID. + * @param array $args Optional. Array of properties for the new Section object. + * See WP_Customize_Section::__construct() for information + * on accepted arguments. Default empty array. + * @return WP_Customize_Section The instance of the section that was added. + */ + public function add_section( $id, $args = array() ) { + if ( $id instanceof WP_Customize_Section ) { + $section = $id; + } else { + $section = new WP_Customize_Section( $this, $id, $args ); + } + + $this->sections[ $section->id ] = $section; + return $section; + } + + /** + * Retrieve a customize section. + * + * @since 3.4.0 + * + * @param string $id Section ID. + * @return WP_Customize_Section|void The section, if set. + */ + public function get_section( $id ) { + if ( isset( $this->sections[ $id ] ) ) { + return $this->sections[ $id ]; + } + } + + /** + * Remove a customize section. + * + * Note that removing the section doesn't destroy the WP_Customize_Section instance or remove its filters. + * + * @since 3.4.0 + * + * @param string $id Section ID. + */ + public function remove_section( $id ) { + unset( $this->sections[ $id ] ); + } + + /** + * Register a customize section type. + * + * Registered types are eligible to be rendered via JS and created dynamically. + * + * @since 4.3.0 + * + * @see WP_Customize_Section + * + * @param string $section Name of a custom section which is a subclass of WP_Customize_Section. + */ + public function register_section_type( $section ) { + $this->registered_section_types[] = $section; + } + + /** + * Render JS templates for all registered section types. + * + * @since 4.3.0 + */ + public function render_section_templates() { + foreach ( $this->registered_section_types as $section_type ) { + $section = new $section_type( $this, 'temp', array() ); + $section->print_template(); + } + } + + /** + * Add a customize control. + * + * @since 3.4.0 + * @since 4.5.0 Return added WP_Customize_Control instance. + * + * @see WP_Customize_Control::__construct() + * + * @param WP_Customize_Control|string $id Customize Control object, or ID. + * @param array $args Optional. Array of properties for the new Control object. + * See WP_Customize_Control::__construct() for information + * on accepted arguments. Default empty array. + * @return WP_Customize_Control The instance of the control that was added. + */ + public function add_control( $id, $args = array() ) { + if ( $id instanceof WP_Customize_Control ) { + $control = $id; + } else { + $control = new WP_Customize_Control( $this, $id, $args ); + } + + $this->controls[ $control->id ] = $control; + return $control; + } + + /** + * Retrieve a customize control. + * + * @since 3.4.0 + * + * @param string $id ID of the control. + * @return WP_Customize_Control|void The control object, if set. + */ + public function get_control( $id ) { + if ( isset( $this->controls[ $id ] ) ) { + return $this->controls[ $id ]; + } + } + + /** + * Remove a customize control. + * + * Note that removing the control doesn't destroy the WP_Customize_Control instance or remove its filters. + * + * @since 3.4.0 + * + * @param string $id ID of the control. + */ + public function remove_control( $id ) { + unset( $this->controls[ $id ] ); + } + + /** + * Register a customize control type. + * + * Registered types are eligible to be rendered via JS and created dynamically. + * + * @since 4.1.0 + * + * @param string $control Name of a custom control which is a subclass of + * WP_Customize_Control. + */ + public function register_control_type( $control ) { + $this->registered_control_types[] = $control; + } + + /** + * Render JS templates for all registered control types. + * + * @since 4.1.0 + */ + public function render_control_templates() { + if ( $this->branching() ) { + $l10n = array( + /* translators: %s: User who is customizing the changeset in customizer. */ + 'locked' => __( '%s is already customizing this changeset. Please wait until they are done to try customizing. Your latest changes have been autosaved.' ), + /* translators: %s: User who is customizing the changeset in customizer. */ + 'locked_allow_override' => __( '%s is already customizing this changeset. Do you want to take over?' ), + ); + } else { + $l10n = array( + /* translators: %s: User who is customizing the changeset in customizer. */ + 'locked' => __( '%s is already customizing this site. Please wait until they are done to try customizing. Your latest changes have been autosaved.' ), + /* translators: %s: User who is customizing the changeset in customizer. */ + 'locked_allow_override' => __( '%s is already customizing this site. Do you want to take over?' ), + ); + } + + foreach ( $this->registered_control_types as $control_type ) { + $control = new $control_type( + $this, + 'temp', + array( + 'settings' => array(), + ) + ); + $control->print_template(); + } + ?> + + <script type="text/html" id="tmpl-customize-control-default-content"> + <# + var inputId = _.uniqueId( 'customize-control-default-input-' ); + var descriptionId = _.uniqueId( 'customize-control-default-description-' ); + var describedByAttr = data.description ? ' aria-describedby="' + descriptionId + '" ' : ''; + #> + <# switch ( data.type ) { + case 'checkbox': #> + <span class="customize-inside-control-row"> + <input + id="{{ inputId }}" + {{{ describedByAttr }}} + type="checkbox" + value="{{ data.value }}" + data-customize-setting-key-link="default" + > + <label for="{{ inputId }}"> + {{ data.label }} + </label> + <# if ( data.description ) { #> + <span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span> + <# } #> + </span> + <# + break; + case 'radio': + if ( ! data.choices ) { + return; + } + #> + <# if ( data.label ) { #> + <label for="{{ inputId }}" class="customize-control-title"> + {{ data.label }} + </label> + <# } #> + <# if ( data.description ) { #> + <span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span> + <# } #> + <# _.each( data.choices, function( val, key ) { #> + <span class="customize-inside-control-row"> + <# + var value, text; + if ( _.isObject( val ) ) { + value = val.value; + text = val.text; + } else { + value = key; + text = val; + } + #> + <input + id="{{ inputId + '-' + value }}" + type="radio" + value="{{ value }}" + name="{{ inputId }}" + data-customize-setting-key-link="default" + {{{ describedByAttr }}} + > + <label for="{{ inputId + '-' + value }}">{{ text }}</label> + </span> + <# } ); #> + <# + break; + default: + #> + <# if ( data.label ) { #> + <label for="{{ inputId }}" class="customize-control-title"> + {{ data.label }} + </label> + <# } #> + <# if ( data.description ) { #> + <span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span> + <# } #> + + <# + var inputAttrs = { + id: inputId, + 'data-customize-setting-key-link': 'default' + }; + if ( 'textarea' === data.type ) { + inputAttrs.rows = '5'; + } else if ( 'button' === data.type ) { + inputAttrs['class'] = 'button button-secondary'; + inputAttrs.type = 'button'; + } else { + inputAttrs.type = data.type; + } + if ( data.description ) { + inputAttrs['aria-describedby'] = descriptionId; + } + _.extend( inputAttrs, data.input_attrs ); + #> + + <# if ( 'button' === data.type ) { #> + <button + <# _.each( _.extend( inputAttrs ), function( value, key ) { #> + {{{ key }}}="{{ value }}" + <# } ); #> + >{{ inputAttrs.value }}</button> + <# } else if ( 'textarea' === data.type ) { #> + <textarea + <# _.each( _.extend( inputAttrs ), function( value, key ) { #> + {{{ key }}}="{{ value }}" + <# }); #> + >{{ inputAttrs.value }}</textarea> + <# } else if ( 'select' === data.type ) { #> + <# delete inputAttrs.type; #> + <select + <# _.each( _.extend( inputAttrs ), function( value, key ) { #> + {{{ key }}}="{{ value }}" + <# }); #> + > + <# _.each( data.choices, function( val, key ) { #> + <# + var value, text; + if ( _.isObject( val ) ) { + value = val.value; + text = val.text; + } else { + value = key; + text = val; + } + #> + <option value="{{ value }}">{{ text }}</option> + <# } ); #> + </select> + <# } else { #> + <input + <# _.each( _.extend( inputAttrs ), function( value, key ) { #> + {{{ key }}}="{{ value }}" + <# }); #> + > + <# } #> + <# } #> + </script> + + <script type="text/html" id="tmpl-customize-notification"> + <li class="notice notice-{{ data.type || 'info' }} {{ data.alt ? 'notice-alt' : '' }} {{ data.dismissible ? 'is-dismissible' : '' }} {{ data.containerClasses || '' }}" data-code="{{ data.code }}" data-type="{{ data.type }}"> + <div class="notification-message">{{{ data.message || data.code }}}</div> + <# if ( data.dismissible ) { #> + <button type="button" class="notice-dismiss"><span class="screen-reader-text"><?php _e( 'Dismiss' ); ?></span></button> + <# } #> + </li> + </script> + + <script type="text/html" id="tmpl-customize-changeset-locked-notification"> + <li class="notice notice-{{ data.type || 'info' }} {{ data.containerClasses || '' }}" data-code="{{ data.code }}" data-type="{{ data.type }}"> + <div class="notification-message customize-changeset-locked-message"> + <img class="customize-changeset-locked-avatar" src="{{ data.lockUser.avatar }}" alt="{{ data.lockUser.name }}"> + <p class="currently-editing"> + <# if ( data.message ) { #> + {{{ data.message }}} + <# } else if ( data.allowOverride ) { #> + <?php + echo esc_html( sprintf( $l10n['locked_allow_override'], '{{ data.lockUser.name }}' ) ); + ?> + <# } else { #> + <?php + echo esc_html( sprintf( $l10n['locked'], '{{ data.lockUser.name }}' ) ); + ?> + <# } #> + </p> + <p class="notice notice-error notice-alt" hidden></p> + <p class="action-buttons"> + <# if ( data.returnUrl !== data.previewUrl ) { #> + <a class="button customize-notice-go-back-button" href="{{ data.returnUrl }}"><?php _e( 'Go back' ); ?></a> + <# } #> + <a class="button customize-notice-preview-button" href="{{ data.frontendPreviewUrl }}"><?php _e( 'Preview' ); ?></a> + <# if ( data.allowOverride ) { #> + <button class="button button-primary wp-tab-last customize-notice-take-over-button"><?php _e( 'Take over' ); ?></button> + <# } #> + </p> + </div> + </li> + </script> + + <script type="text/html" id="tmpl-customize-code-editor-lint-error-notification"> + <li class="notice notice-{{ data.type || 'info' }} {{ data.alt ? 'notice-alt' : '' }} {{ data.dismissible ? 'is-dismissible' : '' }} {{ data.containerClasses || '' }}" data-code="{{ data.code }}" data-type="{{ data.type }}"> + <div class="notification-message">{{{ data.message || data.code }}}</div> + + <p> + <# var elementId = 'el-' + String( Math.random() ); #> + <input id="{{ elementId }}" type="checkbox"> + <label for="{{ elementId }}"><?php _e( 'Update anyway, even though it might break your site?' ); ?></label> + </p> + </li> + </script> + + <?php + /* The following template is obsolete in core but retained for plugins. */ + ?> + <script type="text/html" id="tmpl-customize-control-notifications"> + <ul> + <# _.each( data.notifications, function( notification ) { #> + <li class="notice notice-{{ notification.type || 'info' }} {{ data.altNotice ? 'notice-alt' : '' }}" data-code="{{ notification.code }}" data-type="{{ notification.type }}">{{{ notification.message || notification.code }}}</li> + <# } ); #> + </ul> + </script> + + <script type="text/html" id="tmpl-customize-preview-link-control" > + <# var elementPrefix = _.uniqueId( 'el' ) + '-' #> + <p class="customize-control-title"> + <?php esc_html_e( 'Share Preview Link' ); ?> + </p> + <p class="description customize-control-description"><?php esc_html_e( 'See how changes would look live on your website, and share the preview with people who can\'t access the Customizer.' ); ?></p> + <div class="customize-control-notifications-container"></div> + <div class="preview-link-wrapper"> + <label for="{{ elementPrefix }}customize-preview-link-input" class="screen-reader-text"><?php esc_html_e( 'Preview Link' ); ?></label> + <a href="" target=""> + <span class="preview-control-element" data-component="url"></span> + <span class="screen-reader-text"><?php _e( '(opens in a new tab)' ); ?></span> + </a> + <input id="{{ elementPrefix }}customize-preview-link-input" readonly tabindex="-1" class="preview-control-element" data-component="input"> + <button class="customize-copy-preview-link preview-control-element button button-secondary" data-component="button" data-copy-text="<?php esc_attr_e( 'Copy' ); ?>" data-copied-text="<?php esc_attr_e( 'Copied' ); ?>" ><?php esc_html_e( 'Copy' ); ?></button> + </div> + </script> + <script type="text/html" id="tmpl-customize-selected-changeset-status-control"> + <# var inputId = _.uniqueId( 'customize-selected-changeset-status-control-input-' ); #> + <# var descriptionId = _.uniqueId( 'customize-selected-changeset-status-control-description-' ); #> + <# if ( data.label ) { #> + <label for="{{ inputId }}" class="customize-control-title">{{ data.label }}</label> + <# } #> + <# if ( data.description ) { #> + <span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span> + <# } #> + <# _.each( data.choices, function( choice ) { #> + <# var choiceId = inputId + '-' + choice.status; #> + <span class="customize-inside-control-row"> + <input id="{{ choiceId }}" type="radio" value="{{ choice.status }}" name="{{ inputId }}" data-customize-setting-key-link="default"> + <label for="{{ choiceId }}">{{ choice.label }}</label> + </span> + <# } ); #> + </script> + <?php + } + + /** + * Helper function to compare two objects by priority, ensuring sort stability via instance_number. + * + * @since 3.4.0 + * @deprecated 4.7.0 Use wp_list_sort() + * + * @param WP_Customize_Panel|WP_Customize_Section|WP_Customize_Control $a Object A. + * @param WP_Customize_Panel|WP_Customize_Section|WP_Customize_Control $b Object B. + * @return int + */ + protected function _cmp_priority( $a, $b ) { + _deprecated_function( __METHOD__, '4.7.0', 'wp_list_sort' ); + + if ( $a->priority === $b->priority ) { + return $a->instance_number - $b->instance_number; + } else { + return $a->priority - $b->priority; + } + } + + /** + * Prepare panels, sections, and controls. + * + * For each, check if required related components exist, + * whether the user has the necessary capabilities, + * and sort by priority. + * + * @since 3.4.0 + */ + public function prepare_controls() { + + $controls = array(); + $this->controls = wp_list_sort( + $this->controls, + array( + 'priority' => 'ASC', + 'instance_number' => 'ASC', + ), + 'ASC', + true + ); + + foreach ( $this->controls as $id => $control ) { + if ( ! isset( $this->sections[ $control->section ] ) || ! $control->check_capabilities() ) { + continue; + } + + $this->sections[ $control->section ]->controls[] = $control; + $controls[ $id ] = $control; + } + $this->controls = $controls; + + // Prepare sections. + $this->sections = wp_list_sort( + $this->sections, + array( + 'priority' => 'ASC', + 'instance_number' => 'ASC', + ), + 'ASC', + true + ); + $sections = array(); + + foreach ( $this->sections as $section ) { + if ( ! $section->check_capabilities() ) { + continue; + } + + $section->controls = wp_list_sort( + $section->controls, + array( + 'priority' => 'ASC', + 'instance_number' => 'ASC', + ) + ); + + if ( ! $section->panel ) { + // Top-level section. + $sections[ $section->id ] = $section; + } else { + // This section belongs to a panel. + if ( isset( $this->panels [ $section->panel ] ) ) { + $this->panels[ $section->panel ]->sections[ $section->id ] = $section; + } + } + } + $this->sections = $sections; + + // Prepare panels. + $this->panels = wp_list_sort( + $this->panels, + array( + 'priority' => 'ASC', + 'instance_number' => 'ASC', + ), + 'ASC', + true + ); + $panels = array(); + + foreach ( $this->panels as $panel ) { + if ( ! $panel->check_capabilities() ) { + continue; + } + + $panel->sections = wp_list_sort( + $panel->sections, + array( + 'priority' => 'ASC', + 'instance_number' => 'ASC', + ), + 'ASC', + true + ); + $panels[ $panel->id ] = $panel; + } + $this->panels = $panels; + + // Sort panels and top-level sections together. + $this->containers = array_merge( $this->panels, $this->sections ); + $this->containers = wp_list_sort( + $this->containers, + array( + 'priority' => 'ASC', + 'instance_number' => 'ASC', + ), + 'ASC', + true + ); + } + + /** + * Enqueue scripts for customize controls. + * + * @since 3.4.0 + */ + public function enqueue_control_scripts() { + foreach ( $this->controls as $control ) { + $control->enqueue(); + } + + if ( ! is_multisite() && ( current_user_can( 'install_themes' ) || current_user_can( 'update_themes' ) || current_user_can( 'delete_themes' ) ) ) { + wp_enqueue_script( 'updates' ); + wp_localize_script( + 'updates', + '_wpUpdatesItemCounts', + array( + 'totals' => wp_get_update_data(), + ) + ); + } + } + + /** + * Determine whether the user agent is iOS. + * + * @since 4.4.0 + * + * @return bool Whether the user agent is iOS. + */ + public function is_ios() { + return wp_is_mobile() && preg_match( '/iPad|iPod|iPhone/', $_SERVER['HTTP_USER_AGENT'] ); + } + + /** + * Get the template string for the Customizer pane document title. + * + * @since 4.4.0 + * + * @return string The template string for the document title. + */ + public function get_document_title_template() { + if ( $this->is_theme_active() ) { + /* translators: %s: Document title from the preview. */ + $document_title_tmpl = __( 'Customize: %s' ); + } else { + /* translators: %s: Document title from the preview. */ + $document_title_tmpl = __( 'Live Preview: %s' ); + } + $document_title_tmpl = html_entity_decode( $document_title_tmpl, ENT_QUOTES, 'UTF-8' ); // Because exported to JS and assigned to document.title. + return $document_title_tmpl; + } + + /** + * Set the initial URL to be previewed. + * + * URL is validated. + * + * @since 4.4.0 + * + * @param string $preview_url URL to be previewed. + */ + public function set_preview_url( $preview_url ) { + $preview_url = esc_url_raw( $preview_url ); + $this->preview_url = wp_validate_redirect( $preview_url, home_url( '/' ) ); + } + + /** + * Get the initial URL to be previewed. + * + * @since 4.4.0 + * + * @return string URL being previewed. + */ + public function get_preview_url() { + if ( empty( $this->preview_url ) ) { + $preview_url = home_url( '/' ); + } else { + $preview_url = $this->preview_url; + } + return $preview_url; + } + + /** + * Determines whether the admin and the frontend are on different domains. + * + * @since 4.7.0 + * + * @return bool Whether cross-domain. + */ + public function is_cross_domain() { + $admin_origin = wp_parse_url( admin_url() ); + $home_origin = wp_parse_url( home_url() ); + $cross_domain = ( strtolower( $admin_origin['host'] ) !== strtolower( $home_origin['host'] ) ); + return $cross_domain; + } + + /** + * Get URLs allowed to be previewed. + * + * If the front end and the admin are served from the same domain, load the + * preview over ssl if the Customizer is being loaded over ssl. This avoids + * insecure content warnings. This is not attempted if the admin and front end + * are on different domains to avoid the case where the front end doesn't have + * ssl certs. Domain mapping plugins can allow other urls in these conditions + * using the customize_allowed_urls filter. + * + * @since 4.7.0 + * + * @return array Allowed URLs. + */ + public function get_allowed_urls() { + $allowed_urls = array( home_url( '/' ) ); + + if ( is_ssl() && ! $this->is_cross_domain() ) { + $allowed_urls[] = home_url( '/', 'https' ); + } + + /** + * Filters the list of URLs allowed to be clicked and followed in the Customizer preview. + * + * @since 3.4.0 + * + * @param string[] $allowed_urls An array of allowed URLs. + */ + $allowed_urls = array_unique( apply_filters( 'customize_allowed_urls', $allowed_urls ) ); + + return $allowed_urls; + } + + /** + * Get messenger channel. + * + * @since 4.7.0 + * + * @return string Messenger channel. + */ + public function get_messenger_channel() { + return $this->messenger_channel; + } + + /** + * Set URL to link the user to when closing the Customizer. + * + * URL is validated. + * + * @since 4.4.0 + * + * @param string $return_url URL for return link. + */ + public function set_return_url( $return_url ) { + $return_url = esc_url_raw( $return_url ); + $return_url = remove_query_arg( wp_removable_query_args(), $return_url ); + $return_url = wp_validate_redirect( $return_url ); + $this->return_url = $return_url; + } + + /** + * Get URL to link the user to when closing the Customizer. + * + * @since 4.4.0 + * + * @global array $_registered_pages + * + * @return string URL for link to close Customizer. + */ + public function get_return_url() { + global $_registered_pages; + + $referer = wp_get_referer(); + $excluded_referer_basenames = array( 'customize.php', 'wp-login.php' ); + + if ( $this->return_url ) { + $return_url = $this->return_url; + } elseif ( $referer && ! in_array( wp_basename( parse_url( $referer, PHP_URL_PATH ) ), $excluded_referer_basenames, true ) ) { + $return_url = $referer; + } elseif ( $this->preview_url ) { + $return_url = $this->preview_url; + } else { + $return_url = home_url( '/' ); + } + + $return_url_basename = wp_basename( parse_url( $this->return_url, PHP_URL_PATH ) ); + $return_url_query = parse_url( $this->return_url, PHP_URL_QUERY ); + + if ( 'themes.php' === $return_url_basename && $return_url_query ) { + parse_str( $return_url_query, $query_vars ); + + /* + * If the return URL is a page added by a theme to the Appearance menu via add_submenu_page(), + * verify that belongs to the active theme, otherwise fall back to the Themes screen. + */ + if ( isset( $query_vars['page'] ) && ! isset( $_registered_pages[ "appearance_page_{$query_vars['page']}" ] ) ) { + $return_url = admin_url( 'themes.php' ); + } + } + + return $return_url; + } + + /** + * Set the autofocused constructs. + * + * @since 4.4.0 + * + * @param array $autofocus { + * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused. + * + * @type string [$control] ID for control to be autofocused. + * @type string [$section] ID for section to be autofocused. + * @type string [$panel] ID for panel to be autofocused. + * } + */ + public function set_autofocus( $autofocus ) { + $this->autofocus = array_filter( wp_array_slice_assoc( $autofocus, array( 'panel', 'section', 'control' ) ), 'is_string' ); + } + + /** + * Get the autofocused constructs. + * + * @since 4.4.0 + * + * @return array { + * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused. + * + * @type string [$control] ID for control to be autofocused. + * @type string [$section] ID for section to be autofocused. + * @type string [$panel] ID for panel to be autofocused. + * } + */ + public function get_autofocus() { + return $this->autofocus; + } + + /** + * Get nonces for the Customizer. + * + * @since 4.5.0 + * + * @return array Nonces. + */ + public function get_nonces() { + $nonces = array( + 'save' => wp_create_nonce( 'save-customize_' . $this->get_stylesheet() ), + 'preview' => wp_create_nonce( 'preview-customize_' . $this->get_stylesheet() ), + 'switch_themes' => wp_create_nonce( 'switch_themes' ), + 'dismiss_autosave_or_lock' => wp_create_nonce( 'customize_dismiss_autosave_or_lock' ), + 'override_lock' => wp_create_nonce( 'customize_override_changeset_lock' ), + 'trash' => wp_create_nonce( 'trash_customize_changeset' ), + ); + + /** + * Filters nonces for Customizer. + * + * @since 4.2.0 + * + * @param string[] $nonces Array of refreshed nonces for save and + * preview actions. + * @param WP_Customize_Manager $this WP_Customize_Manager instance. + */ + $nonces = apply_filters( 'customize_refresh_nonces', $nonces, $this ); + + return $nonces; + } + + /** + * Print JavaScript settings for parent window. + * + * @since 4.4.0 + */ + public function customize_pane_settings() { + + $login_url = add_query_arg( + array( + 'interim-login' => 1, + 'customize-login' => 1, + ), + wp_login_url() + ); + + // Ensure dirty flags are set for modified settings. + foreach ( array_keys( $this->unsanitized_post_values() ) as $setting_id ) { + $setting = $this->get_setting( $setting_id ); + if ( $setting ) { + $setting->dirty = true; + } + } + + $autosave_revision_post = null; + $autosave_autodraft_post = null; + $changeset_post_id = $this->changeset_post_id(); + if ( ! $this->saved_starter_content_changeset && ! $this->autosaved() ) { + if ( $changeset_post_id ) { + if ( is_user_logged_in() ) { + $autosave_revision_post = wp_get_post_autosave( $changeset_post_id, get_current_user_id() ); + } + } else { + $autosave_autodraft_posts = $this->get_changeset_posts( + array( + 'posts_per_page' => 1, + 'post_status' => 'auto-draft', + 'exclude_restore_dismissed' => true, + ) + ); + if ( ! empty( $autosave_autodraft_posts ) ) { + $autosave_autodraft_post = array_shift( $autosave_autodraft_posts ); + } + } + } + + $current_user_can_publish = current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ); + + // @todo Include all of the status labels here from script-loader.php, and then allow it to be filtered. + $status_choices = array(); + if ( $current_user_can_publish ) { + $status_choices[] = array( + 'status' => 'publish', + 'label' => __( 'Publish' ), + ); + } + $status_choices[] = array( + 'status' => 'draft', + 'label' => __( 'Save Draft' ), + ); + if ( $current_user_can_publish ) { + $status_choices[] = array( + 'status' => 'future', + 'label' => _x( 'Schedule', 'customizer changeset action/button label' ), + ); + } + + // Prepare Customizer settings to pass to JavaScript. + $changeset_post = null; + if ( $changeset_post_id ) { + $changeset_post = get_post( $changeset_post_id ); + } + + // Determine initial date to be at present or future, not past. + $current_time = current_time( 'mysql', false ); + $initial_date = $current_time; + if ( $changeset_post ) { + $initial_date = get_the_time( 'Y-m-d H:i:s', $changeset_post->ID ); + if ( $initial_date < $current_time ) { + $initial_date = $current_time; + } + } + + $lock_user_id = false; + if ( $this->changeset_post_id() ) { + $lock_user_id = wp_check_post_lock( $this->changeset_post_id() ); + } + + $settings = array( + 'changeset' => array( + 'uuid' => $this->changeset_uuid(), + 'branching' => $this->branching(), + 'autosaved' => $this->autosaved(), + 'hasAutosaveRevision' => ! empty( $autosave_revision_post ), + 'latestAutoDraftUuid' => $autosave_autodraft_post ? $autosave_autodraft_post->post_name : null, + 'status' => $changeset_post ? $changeset_post->post_status : '', + 'currentUserCanPublish' => $current_user_can_publish, + 'publishDate' => $initial_date, + 'statusChoices' => $status_choices, + 'lockUser' => $lock_user_id ? $this->get_lock_user_data( $lock_user_id ) : null, + ), + 'initialServerDate' => $current_time, + 'dateFormat' => get_option( 'date_format' ), + 'timeFormat' => get_option( 'time_format' ), + 'initialServerTimestamp' => floor( microtime( true ) * 1000 ), + 'initialClientTimestamp' => -1, // To be set with JS below. + 'timeouts' => array( + 'windowRefresh' => 250, + 'changesetAutoSave' => AUTOSAVE_INTERVAL * 1000, + 'keepAliveCheck' => 2500, + 'reflowPaneContents' => 100, + 'previewFrameSensitivity' => 2000, + ), + 'theme' => array( + 'stylesheet' => $this->get_stylesheet(), + 'active' => $this->is_theme_active(), + '_canInstall' => current_user_can( 'install_themes' ), + ), + 'url' => array( + 'preview' => esc_url_raw( $this->get_preview_url() ), + 'return' => esc_url_raw( $this->get_return_url() ), + 'parent' => esc_url_raw( admin_url() ), + 'activated' => esc_url_raw( home_url( '/' ) ), + 'ajax' => esc_url_raw( admin_url( 'admin-ajax.php', 'relative' ) ), + 'allowed' => array_map( 'esc_url_raw', $this->get_allowed_urls() ), + 'isCrossDomain' => $this->is_cross_domain(), + 'home' => esc_url_raw( home_url( '/' ) ), + 'login' => esc_url_raw( $login_url ), + ), + 'browser' => array( + 'mobile' => wp_is_mobile(), + 'ios' => $this->is_ios(), + ), + 'panels' => array(), + 'sections' => array(), + 'nonce' => $this->get_nonces(), + 'autofocus' => $this->get_autofocus(), + 'documentTitleTmpl' => $this->get_document_title_template(), + 'previewableDevices' => $this->get_previewable_devices(), + 'l10n' => array( + 'confirmDeleteTheme' => __( 'Are you sure you want to delete this theme?' ), + /* translators: %d: Number of theme search results, which cannot currently consider singular vs. plural forms. */ + 'themeSearchResults' => __( '%d themes found' ), + /* translators: %d: Number of themes being displayed, which cannot currently consider singular vs. plural forms. */ + 'announceThemeCount' => __( 'Displaying %d themes' ), + /* translators: %s: Theme name. */ + 'announceThemeDetails' => __( 'Showing details for theme: %s' ), + ), + ); + + // Temporarily disable installation in Customizer. See #42184. + $filesystem_method = get_filesystem_method(); + ob_start(); + $filesystem_credentials_are_stored = request_filesystem_credentials( self_admin_url() ); + ob_end_clean(); + if ( 'direct' !== $filesystem_method && ! $filesystem_credentials_are_stored ) { + $settings['theme']['_filesystemCredentialsNeeded'] = true; + } + + // Prepare Customize Section objects to pass to JavaScript. + foreach ( $this->sections() as $id => $section ) { + if ( $section->check_capabilities() ) { + $settings['sections'][ $id ] = $section->json(); + } + } + + // Prepare Customize Panel objects to pass to JavaScript. + foreach ( $this->panels() as $panel_id => $panel ) { + if ( $panel->check_capabilities() ) { + $settings['panels'][ $panel_id ] = $panel->json(); + foreach ( $panel->sections as $section_id => $section ) { + if ( $section->check_capabilities() ) { + $settings['sections'][ $section_id ] = $section->json(); + } + } + } + } + + ?> + <script type="text/javascript"> + var _wpCustomizeSettings = <?php echo wp_json_encode( $settings ); ?>; + _wpCustomizeSettings.initialClientTimestamp = _.now(); + _wpCustomizeSettings.controls = {}; + _wpCustomizeSettings.settings = {}; + <?php + + // Serialize settings one by one to improve memory usage. + echo "(function ( s ){\n"; + foreach ( $this->settings() as $setting ) { + if ( $setting->check_capabilities() ) { + printf( + "s[%s] = %s;\n", + wp_json_encode( $setting->id ), + wp_json_encode( $setting->json() ) + ); + } + } + echo "})( _wpCustomizeSettings.settings );\n"; + + // Serialize controls one by one to improve memory usage. + echo "(function ( c ){\n"; + foreach ( $this->controls() as $control ) { + if ( $control->check_capabilities() ) { + printf( + "c[%s] = %s;\n", + wp_json_encode( $control->id ), + wp_json_encode( $control->json() ) + ); + } + } + echo "})( _wpCustomizeSettings.controls );\n"; + ?> + </script> + <?php + } + + /** + * Returns a list of devices to allow previewing. + * + * @since 4.5.0 + * + * @return array List of devices with labels and default setting. + */ + public function get_previewable_devices() { + $devices = array( + 'desktop' => array( + 'label' => __( 'Enter desktop preview mode' ), + 'default' => true, + ), + 'tablet' => array( + 'label' => __( 'Enter tablet preview mode' ), + ), + 'mobile' => array( + 'label' => __( 'Enter mobile preview mode' ), + ), + ); + + /** + * Filters the available devices to allow previewing in the Customizer. + * + * @since 4.5.0 + * + * @see WP_Customize_Manager::get_previewable_devices() + * + * @param array $devices List of devices with labels and default setting. + */ + $devices = apply_filters( 'customize_previewable_devices', $devices ); + + return $devices; + } + + /** + * Register some default controls. + * + * @since 3.4.0 + */ + public function register_controls() { + + /* Themes (controls are loaded via ajax) */ + + $this->add_panel( + new WP_Customize_Themes_Panel( + $this, + 'themes', + array( + 'title' => $this->theme()->display( 'Name' ), + 'description' => ( + '<p>' . __( 'Looking for a theme? You can search or browse the WordPress.org theme directory, install and preview themes, then activate them right here.' ) . '</p>' . + '<p>' . __( 'While previewing a new theme, you can continue to tailor things like widgets and menus, and explore theme-specific options.' ) . '</p>' + ), + 'capability' => 'switch_themes', + 'priority' => 0, + ) + ) + ); + + $this->add_section( + new WP_Customize_Themes_Section( + $this, + 'installed_themes', + array( + 'title' => __( 'Installed themes' ), + 'action' => 'installed', + 'capability' => 'switch_themes', + 'panel' => 'themes', + 'priority' => 0, + ) + ) + ); + + if ( ! is_multisite() ) { + $this->add_section( + new WP_Customize_Themes_Section( + $this, + 'wporg_themes', + array( + 'title' => __( 'WordPress.org themes' ), + 'action' => 'wporg', + 'filter_type' => 'remote', + 'capability' => 'install_themes', + 'panel' => 'themes', + 'priority' => 5, + ) + ) + ); + } + + // Themes Setting (unused - the theme is considerably more fundamental to the Customizer experience). + $this->add_setting( + new WP_Customize_Filter_Setting( + $this, + 'active_theme', + array( + 'capability' => 'switch_themes', + ) + ) + ); + + /* Site Identity */ + + $this->add_section( + 'title_tagline', + array( + 'title' => __( 'Site Identity' ), + 'priority' => 20, + ) + ); + + $this->add_setting( + 'blogname', + array( + 'default' => get_option( 'blogname' ), + 'type' => 'option', + 'capability' => 'manage_options', + ) + ); + + $this->add_control( + 'blogname', + array( + 'label' => __( 'Site Title' ), + 'section' => 'title_tagline', + ) + ); + + $this->add_setting( + 'blogdescription', + array( + 'default' => get_option( 'blogdescription' ), + 'type' => 'option', + 'capability' => 'manage_options', + ) + ); + + $this->add_control( + 'blogdescription', + array( + 'label' => __( 'Tagline' ), + 'section' => 'title_tagline', + ) + ); + + // Add a setting to hide header text if the theme doesn't support custom headers. + if ( ! current_theme_supports( 'custom-header', 'header-text' ) ) { + $this->add_setting( + 'header_text', + array( + 'theme_supports' => array( 'custom-logo', 'header-text' ), + 'default' => 1, + 'sanitize_callback' => 'absint', + ) + ); + + $this->add_control( + 'header_text', + array( + 'label' => __( 'Display Site Title and Tagline' ), + 'section' => 'title_tagline', + 'settings' => 'header_text', + 'type' => 'checkbox', + ) + ); + } + + $this->add_setting( + 'site_icon', + array( + 'type' => 'option', + 'capability' => 'manage_options', + 'transport' => 'postMessage', // Previewed with JS in the Customizer controls window. + ) + ); + + $this->add_control( + new WP_Customize_Site_Icon_Control( + $this, + 'site_icon', + array( + 'label' => __( 'Site Icon' ), + 'description' => sprintf( + '<p>' . __( 'Site Icons are what you see in browser tabs, bookmark bars, and within the WordPress mobile apps. Upload one here!' ) . '</p>' . + /* translators: %s: Site icon size in pixels. */ + '<p>' . __( 'Site Icons should be square and at least %s pixels.' ) . '</p>', + '<strong>512 × 512</strong>' + ), + 'section' => 'title_tagline', + 'priority' => 60, + 'height' => 512, + 'width' => 512, + ) + ) + ); + + $this->add_setting( + 'custom_logo', + array( + 'theme_supports' => array( 'custom-logo' ), + 'transport' => 'postMessage', + ) + ); + + $custom_logo_args = get_theme_support( 'custom-logo' ); + $this->add_control( + new WP_Customize_Cropped_Image_Control( + $this, + 'custom_logo', + array( + 'label' => __( 'Logo' ), + 'section' => 'title_tagline', + 'priority' => 8, + 'height' => isset( $custom_logo_args[0]['height'] ) ? $custom_logo_args[0]['height'] : null, + 'width' => isset( $custom_logo_args[0]['width'] ) ? $custom_logo_args[0]['width'] : null, + 'flex_height' => isset( $custom_logo_args[0]['flex-height'] ) ? $custom_logo_args[0]['flex-height'] : null, + 'flex_width' => isset( $custom_logo_args[0]['flex-width'] ) ? $custom_logo_args[0]['flex-width'] : null, + 'button_labels' => array( + 'select' => __( 'Select logo' ), + 'change' => __( 'Change logo' ), + 'remove' => __( 'Remove' ), + 'default' => __( 'Default' ), + 'placeholder' => __( 'No logo selected' ), + 'frame_title' => __( 'Select logo' ), + 'frame_button' => __( 'Choose logo' ), + ), + ) + ) + ); + + $this->selective_refresh->add_partial( + 'custom_logo', + array( + 'settings' => array( 'custom_logo' ), + 'selector' => '.custom-logo-link', + 'render_callback' => array( $this, '_render_custom_logo_partial' ), + 'container_inclusive' => true, + ) + ); + + /* Colors */ + + $this->add_section( + 'colors', + array( + 'title' => __( 'Colors' ), + 'priority' => 40, + ) + ); + + $this->add_setting( + 'header_textcolor', + array( + 'theme_supports' => array( 'custom-header', 'header-text' ), + 'default' => get_theme_support( 'custom-header', 'default-text-color' ), + + 'sanitize_callback' => array( $this, '_sanitize_header_textcolor' ), + 'sanitize_js_callback' => 'maybe_hash_hex_color', + ) + ); + + // Input type: checkbox. + // With custom value. + $this->add_control( + 'display_header_text', + array( + 'settings' => 'header_textcolor', + 'label' => __( 'Display Site Title and Tagline' ), + 'section' => 'title_tagline', + 'type' => 'checkbox', + 'priority' => 40, + ) + ); + + $this->add_control( + new WP_Customize_Color_Control( + $this, + 'header_textcolor', + array( + 'label' => __( 'Header Text Color' ), + 'section' => 'colors', + ) + ) + ); + + // Input type: color. + // With sanitize_callback. + $this->add_setting( + 'background_color', + array( + 'default' => get_theme_support( 'custom-background', 'default-color' ), + 'theme_supports' => 'custom-background', + + 'sanitize_callback' => 'sanitize_hex_color_no_hash', + 'sanitize_js_callback' => 'maybe_hash_hex_color', + ) + ); + + $this->add_control( + new WP_Customize_Color_Control( + $this, + 'background_color', + array( + 'label' => __( 'Background Color' ), + 'section' => 'colors', + ) + ) + ); + + /* Custom Header */ + + if ( current_theme_supports( 'custom-header', 'video' ) ) { + $title = __( 'Header Media' ); + $description = '<p>' . __( 'If you add a video, the image will be used as a fallback while the video loads.' ) . '</p>'; + + $width = absint( get_theme_support( 'custom-header', 'width' ) ); + $height = absint( get_theme_support( 'custom-header', 'height' ) ); + if ( $width && $height ) { + $control_description = sprintf( + /* translators: 1: .mp4, 2: Header size in pixels. */ + __( 'Upload your video in %1$s format and minimize its file size for best results. Your theme recommends dimensions of %2$s pixels.' ), + '<code>.mp4</code>', + sprintf( '<strong>%s × %s</strong>', $width, $height ) + ); + } elseif ( $width ) { + $control_description = sprintf( + /* translators: 1: .mp4, 2: Header width in pixels. */ + __( 'Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a width of %2$s pixels.' ), + '<code>.mp4</code>', + sprintf( '<strong>%s</strong>', $width ) + ); + } else { + $control_description = sprintf( + /* translators: 1: .mp4, 2: Header height in pixels. */ + __( 'Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a height of %2$s pixels.' ), + '<code>.mp4</code>', + sprintf( '<strong>%s</strong>', $height ) + ); + } + } else { + $title = __( 'Header Image' ); + $description = ''; + $control_description = ''; + } + + $this->add_section( + 'header_image', + array( + 'title' => $title, + 'description' => $description, + 'theme_supports' => 'custom-header', + 'priority' => 60, + ) + ); + + $this->add_setting( + 'header_video', + array( + 'theme_supports' => array( 'custom-header', 'video' ), + 'transport' => 'postMessage', + 'sanitize_callback' => 'absint', + 'validate_callback' => array( $this, '_validate_header_video' ), + ) + ); + + $this->add_setting( + 'external_header_video', + array( + 'theme_supports' => array( 'custom-header', 'video' ), + 'transport' => 'postMessage', + 'sanitize_callback' => array( $this, '_sanitize_external_header_video' ), + 'validate_callback' => array( $this, '_validate_external_header_video' ), + ) + ); + + $this->add_setting( + new WP_Customize_Filter_Setting( + $this, + 'header_image', + array( + 'default' => sprintf( get_theme_support( 'custom-header', 'default-image' ), get_template_directory_uri(), get_stylesheet_directory_uri() ), + 'theme_supports' => 'custom-header', + ) + ) + ); + + $this->add_setting( + new WP_Customize_Header_Image_Setting( + $this, + 'header_image_data', + array( + 'theme_supports' => 'custom-header', + ) + ) + ); + + /* + * Switch image settings to postMessage when video support is enabled since + * it entails that the_custom_header_markup() will be used, and thus selective + * refresh can be utilized. + */ + if ( current_theme_supports( 'custom-header', 'video' ) ) { + $this->get_setting( 'header_image' )->transport = 'postMessage'; + $this->get_setting( 'header_image_data' )->transport = 'postMessage'; + } + + $this->add_control( + new WP_Customize_Media_Control( + $this, + 'header_video', + array( + 'theme_supports' => array( 'custom-header', 'video' ), + 'label' => __( 'Header Video' ), + 'description' => $control_description, + 'section' => 'header_image', + 'mime_type' => 'video', + 'active_callback' => 'is_header_video_active', + ) + ) + ); + + $this->add_control( + 'external_header_video', + array( + 'theme_supports' => array( 'custom-header', 'video' ), + 'type' => 'url', + 'description' => __( 'Or, enter a YouTube URL:' ), + 'section' => 'header_image', + 'active_callback' => 'is_header_video_active', + ) + ); + + $this->add_control( new WP_Customize_Header_Image_Control( $this ) ); + + $this->selective_refresh->add_partial( + 'custom_header', + array( + 'selector' => '#wp-custom-header', + 'render_callback' => 'the_custom_header_markup', + 'settings' => array( 'header_video', 'external_header_video', 'header_image' ), // The image is used as a video fallback here. + 'container_inclusive' => true, + ) + ); + + /* Custom Background */ + + $this->add_section( + 'background_image', + array( + 'title' => __( 'Background Image' ), + 'theme_supports' => 'custom-background', + 'priority' => 80, + ) + ); + + $this->add_setting( + 'background_image', + array( + 'default' => get_theme_support( 'custom-background', 'default-image' ), + 'theme_supports' => 'custom-background', + 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), + ) + ); + + $this->add_setting( + new WP_Customize_Background_Image_Setting( + $this, + 'background_image_thumb', + array( + 'theme_supports' => 'custom-background', + 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), + ) + ) + ); + + $this->add_control( new WP_Customize_Background_Image_Control( $this ) ); + + $this->add_setting( + 'background_preset', + array( + 'default' => get_theme_support( 'custom-background', 'default-preset' ), + 'theme_supports' => 'custom-background', + 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), + ) + ); + + $this->add_control( + 'background_preset', + array( + 'label' => _x( 'Preset', 'Background Preset' ), + 'section' => 'background_image', + 'type' => 'select', + 'choices' => array( + 'default' => _x( 'Default', 'Default Preset' ), + 'fill' => __( 'Fill Screen' ), + 'fit' => __( 'Fit to Screen' ), + 'repeat' => _x( 'Repeat', 'Repeat Image' ), + 'custom' => _x( 'Custom', 'Custom Preset' ), + ), + ) + ); + + $this->add_setting( + 'background_position_x', + array( + 'default' => get_theme_support( 'custom-background', 'default-position-x' ), + 'theme_supports' => 'custom-background', + 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), + ) + ); + + $this->add_setting( + 'background_position_y', + array( + 'default' => get_theme_support( 'custom-background', 'default-position-y' ), + 'theme_supports' => 'custom-background', + 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), + ) + ); + + $this->add_control( + new WP_Customize_Background_Position_Control( + $this, + 'background_position', + array( + 'label' => __( 'Image Position' ), + 'section' => 'background_image', + 'settings' => array( + 'x' => 'background_position_x', + 'y' => 'background_position_y', + ), + ) + ) + ); + + $this->add_setting( + 'background_size', + array( + 'default' => get_theme_support( 'custom-background', 'default-size' ), + 'theme_supports' => 'custom-background', + 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), + ) + ); + + $this->add_control( + 'background_size', + array( + 'label' => __( 'Image Size' ), + 'section' => 'background_image', + 'type' => 'select', + 'choices' => array( + 'auto' => _x( 'Original', 'Original Size' ), + 'contain' => __( 'Fit to Screen' ), + 'cover' => __( 'Fill Screen' ), + ), + ) + ); + + $this->add_setting( + 'background_repeat', + array( + 'default' => get_theme_support( 'custom-background', 'default-repeat' ), + 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), + 'theme_supports' => 'custom-background', + ) + ); + + $this->add_control( + 'background_repeat', + array( + 'label' => __( 'Repeat Background Image' ), + 'section' => 'background_image', + 'type' => 'checkbox', + ) + ); + + $this->add_setting( + 'background_attachment', + array( + 'default' => get_theme_support( 'custom-background', 'default-attachment' ), + 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), + 'theme_supports' => 'custom-background', + ) + ); + + $this->add_control( + 'background_attachment', + array( + 'label' => __( 'Scroll with Page' ), + 'section' => 'background_image', + 'type' => 'checkbox', + ) + ); + + // If the theme is using the default background callback, we can update + // the background CSS using postMessage. + if ( get_theme_support( 'custom-background', 'wp-head-callback' ) === '_custom_background_cb' ) { + foreach ( array( 'color', 'image', 'preset', 'position_x', 'position_y', 'size', 'repeat', 'attachment' ) as $prop ) { + $this->get_setting( 'background_' . $prop )->transport = 'postMessage'; + } + } + + /* + * Static Front Page + * See also https://core.trac.wordpress.org/ticket/19627 which introduces the static-front-page theme_support. + * The following replicates behavior from options-reading.php. + */ + + $this->add_section( + 'static_front_page', + array( + 'title' => __( 'Homepage Settings' ), + 'priority' => 120, + 'description' => __( 'You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed.' ), + 'active_callback' => array( $this, 'has_published_pages' ), + ) + ); + + $this->add_setting( + 'show_on_front', + array( + 'default' => get_option( 'show_on_front' ), + 'capability' => 'manage_options', + 'type' => 'option', + ) + ); + + $this->add_control( + 'show_on_front', + array( + 'label' => __( 'Your homepage displays' ), + 'section' => 'static_front_page', + 'type' => 'radio', + 'choices' => array( + 'posts' => __( 'Your latest posts' ), + 'page' => __( 'A static page' ), + ), + ) + ); + + $this->add_setting( + 'page_on_front', + array( + 'type' => 'option', + 'capability' => 'manage_options', + ) + ); + + $this->add_control( + 'page_on_front', + array( + 'label' => __( 'Homepage' ), + 'section' => 'static_front_page', + 'type' => 'dropdown-pages', + 'allow_addition' => true, + ) + ); + + $this->add_setting( + 'page_for_posts', + array( + 'type' => 'option', + 'capability' => 'manage_options', + ) + ); + + $this->add_control( + 'page_for_posts', + array( + 'label' => __( 'Posts page' ), + 'section' => 'static_front_page', + 'type' => 'dropdown-pages', + 'allow_addition' => true, + ) + ); + + /* Custom CSS */ + $section_description = '<p>'; + $section_description .= __( 'Add your own CSS code here to customize the appearance and layout of your site.' ); + $section_description .= sprintf( + ' <a href="%1$s" class="external-link" target="_blank">%2$s<span class="screen-reader-text"> %3$s</span></a>', + esc_url( __( 'https://codex.wordpress.org/CSS' ) ), + __( 'Learn more about CSS' ), + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ); + $section_description .= '</p>'; + + $section_description .= '<p id="editor-keyboard-trap-help-1">' . __( 'When using a keyboard to navigate:' ) . '</p>'; + $section_description .= '<ul>'; + $section_description .= '<li id="editor-keyboard-trap-help-2">' . __( 'In the editing area, the Tab key enters a tab character.' ) . '</li>'; + $section_description .= '<li id="editor-keyboard-trap-help-3">' . __( 'To move away from this area, press the Esc key followed by the Tab key.' ) . '</li>'; + $section_description .= '<li id="editor-keyboard-trap-help-4">' . __( 'Screen reader users: when in forms mode, you may need to press the Esc key twice.' ) . '</li>'; + $section_description .= '</ul>'; + + if ( 'false' !== wp_get_current_user()->syntax_highlighting ) { + $section_description .= '<p>'; + $section_description .= sprintf( + /* translators: 1: Link to user profile, 2: Additional link attributes, 3: Accessibility text. */ + __( 'The edit field automatically highlights code syntax. You can disable this in your <a href="%1$s" %2$s>user profile%3$s</a> to work in plain text mode.' ), + esc_url( get_edit_profile_url() ), + 'class="external-link" target="_blank"', + sprintf( + '<span class="screen-reader-text"> %s</span>', + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ) + ); + $section_description .= '</p>'; + } + + $section_description .= '<p class="section-description-buttons">'; + $section_description .= '<button type="button" class="button-link section-description-close">' . __( 'Close' ) . '</button>'; + $section_description .= '</p>'; + + $this->add_section( + 'custom_css', + array( + 'title' => __( 'Additional CSS' ), + 'priority' => 200, + 'description_hidden' => true, + 'description' => $section_description, + ) + ); + + $custom_css_setting = new WP_Customize_Custom_CSS_Setting( + $this, + sprintf( 'custom_css[%s]', get_stylesheet() ), + array( + 'capability' => 'edit_css', + 'default' => '', + ) + ); + $this->add_setting( $custom_css_setting ); + + $this->add_control( + new WP_Customize_Code_Editor_Control( + $this, + 'custom_css', + array( + 'label' => __( 'CSS code' ), + 'section' => 'custom_css', + 'settings' => array( 'default' => $custom_css_setting->id ), + 'code_type' => 'text/css', + 'input_attrs' => array( + 'aria-describedby' => 'editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4', + ), + ) + ) + ); + } + + /** + * Return whether there are published pages. + * + * Used as active callback for static front page section and controls. + * + * @since 4.7.0 + * + * @return bool Whether there are published (or to be published) pages. + */ + public function has_published_pages() { + + $setting = $this->get_setting( 'nav_menus_created_posts' ); + if ( $setting ) { + foreach ( $setting->value() as $post_id ) { + if ( 'page' === get_post_type( $post_id ) ) { + return true; + } + } + } + return 0 !== count( get_pages() ); + } + + /** + * Add settings from the POST data that were not added with code, e.g. dynamically-created settings for Widgets + * + * @since 4.2.0 + * + * @see add_dynamic_settings() + */ + public function register_dynamic_settings() { + $setting_ids = array_keys( $this->unsanitized_post_values() ); + $this->add_dynamic_settings( $setting_ids ); + } + + /** + * Load themes into the theme browsing/installation UI. + * + * @since 4.9.0 + */ + public function handle_load_themes_request() { + check_ajax_referer( 'switch_themes', 'nonce' ); + + if ( ! current_user_can( 'switch_themes' ) ) { + wp_die( -1 ); + } + + if ( empty( $_POST['theme_action'] ) ) { + wp_send_json_error( 'missing_theme_action' ); + } + $theme_action = sanitize_key( $_POST['theme_action'] ); + $themes = array(); + $args = array(); + + // Define query filters based on user input. + if ( ! array_key_exists( 'search', $_POST ) ) { + $args['search'] = ''; + } else { + $args['search'] = sanitize_text_field( wp_unslash( $_POST['search'] ) ); + } + + if ( ! array_key_exists( 'tags', $_POST ) ) { + $args['tag'] = ''; + } else { + $args['tag'] = array_map( 'sanitize_text_field', wp_unslash( (array) $_POST['tags'] ) ); + } + + if ( ! array_key_exists( 'page', $_POST ) ) { + $args['page'] = 1; + } else { + $args['page'] = absint( $_POST['page'] ); + } + + require_once ABSPATH . 'wp-admin/includes/theme.php'; + + if ( 'installed' === $theme_action ) { + + // Load all installed themes from wp_prepare_themes_for_js(). + $themes = array( 'themes' => wp_prepare_themes_for_js() ); + foreach ( $themes['themes'] as &$theme ) { + $theme['type'] = 'installed'; + $theme['active'] = ( isset( $_POST['customized_theme'] ) && $_POST['customized_theme'] === $theme['id'] ); + } + } elseif ( 'wporg' === $theme_action ) { + + // Load WordPress.org themes from the .org API and normalize data to match installed theme objects. + if ( ! current_user_can( 'install_themes' ) ) { + wp_die( -1 ); + } + + // Arguments for all queries. + $wporg_args = array( + 'per_page' => 100, + 'fields' => array( + 'reviews_url' => true, // Explicitly request the reviews URL to be linked from the customizer. + ), + ); + + $args = array_merge( $wporg_args, $args ); + + if ( '' === $args['search'] && '' === $args['tag'] ) { + $args['browse'] = 'new'; // Sort by latest themes by default. + } + + // Load themes from the .org API. + $themes = themes_api( 'query_themes', $args ); + if ( is_wp_error( $themes ) ) { + wp_send_json_error(); + } + + // This list matches the allowed tags in wp-admin/includes/theme-install.php. + $themes_allowedtags = array_fill_keys( + array( 'a', 'abbr', 'acronym', 'code', 'pre', 'em', 'strong', 'div', 'p', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'img' ), + array() + ); + $themes_allowedtags['a'] = array_fill_keys( array( 'href', 'title', 'target' ), true ); + $themes_allowedtags['acronym']['title'] = true; + $themes_allowedtags['abbr']['title'] = true; + $themes_allowedtags['img'] = array_fill_keys( array( 'src', 'class', 'alt' ), true ); + + // Prepare a list of installed themes to check against before the loop. + $installed_themes = array(); + $wp_themes = wp_get_themes(); + foreach ( $wp_themes as $theme ) { + $installed_themes[] = $theme->get_stylesheet(); + } + $update_php = network_admin_url( 'update.php?action=install-theme' ); + + // Set up properties for themes available on WordPress.org. + foreach ( $themes->themes as &$theme ) { + $theme->install_url = add_query_arg( + array( + 'theme' => $theme->slug, + '_wpnonce' => wp_create_nonce( 'install-theme_' . $theme->slug ), + ), + $update_php + ); + + $theme->name = wp_kses( $theme->name, $themes_allowedtags ); + $theme->version = wp_kses( $theme->version, $themes_allowedtags ); + $theme->description = wp_kses( $theme->description, $themes_allowedtags ); + $theme->stars = wp_star_rating( + array( + 'rating' => $theme->rating, + 'type' => 'percent', + 'number' => $theme->num_ratings, + 'echo' => false, + ) + ); + $theme->num_ratings = number_format_i18n( $theme->num_ratings ); + $theme->preview_url = set_url_scheme( $theme->preview_url ); + + // Handle themes that are already installed as installed themes. + if ( in_array( $theme->slug, $installed_themes, true ) ) { + $theme->type = 'installed'; + } else { + $theme->type = $theme_action; + } + + // Set active based on customized theme. + $theme->active = ( isset( $_POST['customized_theme'] ) && $_POST['customized_theme'] === $theme->slug ); + + // Map available theme properties to installed theme properties. + $theme->id = $theme->slug; + $theme->screenshot = array( $theme->screenshot_url ); + $theme->authorAndUri = wp_kses( $theme->author['display_name'], $themes_allowedtags ); + + if ( isset( $theme->parent ) ) { + $theme->parent = $theme->parent['slug']; + } else { + $theme->parent = false; + } + unset( $theme->slug ); + unset( $theme->screenshot_url ); + unset( $theme->author ); + } // End foreach(). + } // End if(). + + /** + * Filters the theme data loaded in the customizer. + * + * This allows theme data to be loading from an external source, + * or modification of data loaded from `wp_prepare_themes_for_js()` + * or WordPress.org via `themes_api()`. + * + * @since 4.9.0 + * + * @see wp_prepare_themes_for_js() + * @see themes_api() + * @see WP_Customize_Manager::__construct() + * + * @param array $themes Nested array of theme data. + * @param array $args List of arguments, such as page, search term, and tags to query for. + * @param WP_Customize_Manager $manager Instance of Customize manager. + */ + $themes = apply_filters( 'customize_load_themes', $themes, $args, $this ); + + wp_send_json_success( $themes ); + } + + + /** + * Callback for validating the header_textcolor value. + * + * Accepts 'blank', and otherwise uses sanitize_hex_color_no_hash(). + * Returns default text color if hex color is empty. + * + * @since 3.4.0 + * + * @param string $color + * @return mixed + */ + public function _sanitize_header_textcolor( $color ) { + if ( 'blank' === $color ) { + return 'blank'; + } + + $color = sanitize_hex_color_no_hash( $color ); + if ( empty( $color ) ) { + $color = get_theme_support( 'custom-header', 'default-text-color' ); + } + + return $color; + } + + /** + * Callback for validating a background setting value. + * + * @since 4.7.0 + * + * @param string $value Repeat value. + * @param WP_Customize_Setting $setting Setting. + * @return string|WP_Error Background value or validation error. + */ + public function _sanitize_background_setting( $value, $setting ) { + if ( 'background_repeat' === $setting->id ) { + if ( ! in_array( $value, array( 'repeat-x', 'repeat-y', 'repeat', 'no-repeat' ) ) ) { + return new WP_Error( 'invalid_value', __( 'Invalid value for background repeat.' ) ); + } + } elseif ( 'background_attachment' === $setting->id ) { + if ( ! in_array( $value, array( 'fixed', 'scroll' ) ) ) { + return new WP_Error( 'invalid_value', __( 'Invalid value for background attachment.' ) ); + } + } elseif ( 'background_position_x' === $setting->id ) { + if ( ! in_array( $value, array( 'left', 'center', 'right' ), true ) ) { + return new WP_Error( 'invalid_value', __( 'Invalid value for background position X.' ) ); + } + } elseif ( 'background_position_y' === $setting->id ) { + if ( ! in_array( $value, array( 'top', 'center', 'bottom' ), true ) ) { + return new WP_Error( 'invalid_value', __( 'Invalid value for background position Y.' ) ); + } + } elseif ( 'background_size' === $setting->id ) { + if ( ! in_array( $value, array( 'auto', 'contain', 'cover' ), true ) ) { + return new WP_Error( 'invalid_value', __( 'Invalid value for background size.' ) ); + } + } elseif ( 'background_preset' === $setting->id ) { + if ( ! in_array( $value, array( 'default', 'fill', 'fit', 'repeat', 'custom' ), true ) ) { + return new WP_Error( 'invalid_value', __( 'Invalid value for background size.' ) ); + } + } elseif ( 'background_image' === $setting->id || 'background_image_thumb' === $setting->id ) { + $value = empty( $value ) ? '' : esc_url_raw( $value ); + } else { + return new WP_Error( 'unrecognized_setting', __( 'Unrecognized background setting.' ) ); + } + return $value; + } + + /** + * Export header video settings to facilitate selective refresh. + * + * @since 4.7.0 + * + * @param array $response Response. + * @param WP_Customize_Selective_Refresh $selective_refresh Selective refresh component. + * @param array $partials Array of partials. + * @return array + */ + public function export_header_video_settings( $response, $selective_refresh, $partials ) { + if ( isset( $partials['custom_header'] ) ) { + $response['custom_header_settings'] = get_header_video_settings(); + } + + return $response; + } + + /** + * Callback for validating the header_video value. + * + * Ensures that the selected video is less than 8MB and provides an error message. + * + * @since 4.7.0 + * + * @param WP_Error $validity + * @param mixed $value + * @return mixed + */ + public function _validate_header_video( $validity, $value ) { + $video = get_attached_file( absint( $value ) ); + if ( $video ) { + $size = filesize( $video ); + if ( $size > 8 * MB_IN_BYTES ) { + $validity->add( + 'size_too_large', + __( 'This video file is too large to use as a header video. Try a shorter video or optimize the compression settings and re-upload a file that is less than 8MB. Or, upload your video to YouTube and link it with the option below.' ) + ); + } + if ( '.mp4' !== substr( $video, -4 ) && '.mov' !== substr( $video, -4 ) ) { // Check for .mp4 or .mov format, which (assuming h.264 encoding) are the only cross-browser-supported formats. + $validity->add( + 'invalid_file_type', + sprintf( + /* translators: 1: .mp4, 2: .mov */ + __( 'Only %1$s or %2$s files may be used for header video. Please convert your video file and try again, or, upload your video to YouTube and link it with the option below.' ), + '<code>.mp4</code>', + '<code>.mov</code>' + ) + ); + } + } + return $validity; + } + + /** + * Callback for validating the external_header_video value. + * + * Ensures that the provided URL is supported. + * + * @since 4.7.0 + * + * @param WP_Error $validity + * @param mixed $value + * @return mixed + */ + public function _validate_external_header_video( $validity, $value ) { + $video = esc_url_raw( $value ); + if ( $video ) { + if ( ! preg_match( '#^https?://(?:www\.)?(?:youtube\.com/watch|youtu\.be/)#', $video ) ) { + $validity->add( 'invalid_url', __( 'Please enter a valid YouTube URL.' ) ); + } + } + return $validity; + } + + /** + * Callback for sanitizing the external_header_video value. + * + * @since 4.7.1 + * + * @param string $value URL. + * @return string Sanitized URL. + */ + public function _sanitize_external_header_video( $value ) { + return esc_url_raw( trim( $value ) ); + } + + /** + * Callback for rendering the custom logo, used in the custom_logo partial. + * + * This method exists because the partial object and context data are passed + * into a partial's render_callback so we cannot use get_custom_logo() as + * the render_callback directly since it expects a blog ID as the first + * argument. When WP no longer supports PHP 5.3, this method can be removed + * in favor of an anonymous function. + * + * @see WP_Customize_Manager::register_controls() + * + * @since 4.5.0 + * + * @return string Custom logo. + */ + public function _render_custom_logo_partial() { + return get_custom_logo(); + } +} diff --git a/wp-includes/class-wp-customize-nav-menus.php b/wp-includes/class-wp-customize-nav-menus.php new file mode 100644 index 0000000..1b44b14 --- /dev/null +++ b/wp-includes/class-wp-customize-nav-menus.php @@ -0,0 +1,1523 @@ +<?php +/** + * WordPress Customize Nav Menus classes + * + * @package WordPress + * @subpackage Customize + * @since 4.3.0 + */ + +/** + * Customize Nav Menus class. + * + * Implements menu management in the Customizer. + * + * @since 4.3.0 + * + * @see WP_Customize_Manager + */ +final class WP_Customize_Nav_Menus { + + /** + * WP_Customize_Manager instance. + * + * @since 4.3.0 + * @var WP_Customize_Manager + */ + public $manager; + + /** + * Original nav menu locations before the theme was switched. + * + * @since 4.9.0 + * @var array + */ + protected $original_nav_menu_locations; + + /** + * Constructor. + * + * @since 4.3.0 + * + * @param WP_Customize_Manager $manager Customizer bootstrap instance. + */ + public function __construct( $manager ) { + $this->manager = $manager; + $this->original_nav_menu_locations = get_nav_menu_locations(); + + // See https://github.com/xwp/wp-customize-snapshots/blob/962586659688a5b1fd9ae93618b7ce2d4e7a421c/php/class-customize-snapshot-manager.php#L469-L499 + add_action( 'customize_register', array( $this, 'customize_register' ), 11 ); + add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_dynamic_setting_args' ), 10, 2 ); + add_filter( 'customize_dynamic_setting_class', array( $this, 'filter_dynamic_setting_class' ), 10, 3 ); + add_action( 'customize_save_nav_menus_created_posts', array( $this, 'save_nav_menus_created_posts' ) ); + + // Skip remaining hooks when the user can't manage nav menus anyway. + if ( ! current_user_can( 'edit_theme_options' ) ) { + return; + } + + add_filter( 'customize_refresh_nonces', array( $this, 'filter_nonces' ) ); + add_action( 'wp_ajax_load-available-menu-items-customizer', array( $this, 'ajax_load_available_items' ) ); + add_action( 'wp_ajax_search-available-menu-items-customizer', array( $this, 'ajax_search_available_items' ) ); + add_action( 'wp_ajax_customize-nav-menus-insert-auto-draft', array( $this, 'ajax_insert_auto_draft_post' ) ); + add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); + add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_templates' ) ); + add_action( 'customize_controls_print_footer_scripts', array( $this, 'available_items_template' ) ); + add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) ); + add_action( 'customize_preview_init', array( $this, 'make_auto_draft_status_previewable' ) ); + + // Selective Refresh partials. + add_filter( 'customize_dynamic_partial_args', array( $this, 'customize_dynamic_partial_args' ), 10, 2 ); + } + + /** + * Adds a nonce for customizing menus. + * + * @since 4.5.0 + * + * @param string[] $nonces Array of nonces. + * @return string[] $nonces Modified array of nonces. + */ + public function filter_nonces( $nonces ) { + $nonces['customize-menus'] = wp_create_nonce( 'customize-menus' ); + return $nonces; + } + + /** + * Ajax handler for loading available menu items. + * + * @since 4.3.0 + */ + public function ajax_load_available_items() { + check_ajax_referer( 'customize-menus', 'customize-menus-nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + $all_items = array(); + $item_types = array(); + if ( isset( $_POST['item_types'] ) && is_array( $_POST['item_types'] ) ) { + $item_types = wp_unslash( $_POST['item_types'] ); + } elseif ( isset( $_POST['type'] ) && isset( $_POST['object'] ) ) { // Back compat. + $item_types[] = array( + 'type' => wp_unslash( $_POST['type'] ), + 'object' => wp_unslash( $_POST['object'] ), + 'page' => empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] ), + ); + } else { + wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' ); + } + + foreach ( $item_types as $item_type ) { + if ( empty( $item_type['type'] ) || empty( $item_type['object'] ) ) { + wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' ); + } + $type = sanitize_key( $item_type['type'] ); + $object = sanitize_key( $item_type['object'] ); + $page = empty( $item_type['page'] ) ? 0 : absint( $item_type['page'] ); + $items = $this->load_available_items_query( $type, $object, $page ); + if ( is_wp_error( $items ) ) { + wp_send_json_error( $items->get_error_code() ); + } + $all_items[ $item_type['type'] . ':' . $item_type['object'] ] = $items; + } + + wp_send_json_success( array( 'items' => $all_items ) ); + } + + /** + * Performs the post_type and taxonomy queries for loading available menu items. + * + * @since 4.3.0 + * + * @param string $type Optional. Accepts any custom object type and has built-in support for + * 'post_type' and 'taxonomy'. Default is 'post_type'. + * @param string $object Optional. Accepts any registered taxonomy or post type name. Default is 'page'. + * @param int $page Optional. The page number used to generate the query offset. Default is '0'. + * @return array|WP_Error An array of menu items on success, a WP_Error object on failure. + */ + public function load_available_items_query( $type = 'post_type', $object = 'page', $page = 0 ) { + $items = array(); + + if ( 'post_type' === $type ) { + $post_type = get_post_type_object( $object ); + if ( ! $post_type ) { + return new WP_Error( 'nav_menus_invalid_post_type' ); + } + + if ( 0 === $page && 'page' === $object ) { + // Add "Home" link. Treat as a page, but switch to custom on add. + $items[] = array( + 'id' => 'home', + 'title' => _x( 'Home', 'nav menu home label' ), + 'type' => 'custom', + 'type_label' => __( 'Custom Link' ), + 'object' => '', + 'url' => home_url(), + ); + } elseif ( 'post' !== $object && 0 === $page && $post_type->has_archive ) { + // Add a post type archive link. + $items[] = array( + 'id' => $object . '-archive', + 'title' => $post_type->labels->archives, + 'type' => 'post_type_archive', + 'type_label' => __( 'Post Type Archive' ), + 'object' => $object, + 'url' => get_post_type_archive_link( $object ), + ); + } + + // Prepend posts with nav_menus_created_posts on first page. + $posts = array(); + if ( 0 === $page && $this->manager->get_setting( 'nav_menus_created_posts' ) ) { + foreach ( $this->manager->get_setting( 'nav_menus_created_posts' )->value() as $post_id ) { + $auto_draft_post = get_post( $post_id ); + if ( $post_type->name === $auto_draft_post->post_type ) { + $posts[] = $auto_draft_post; + } + } + } + + $posts = array_merge( + $posts, + get_posts( + array( + 'numberposts' => 10, + 'offset' => 10 * $page, + 'orderby' => 'date', + 'order' => 'DESC', + 'post_type' => $object, + ) + ) + ); + + foreach ( $posts as $post ) { + $post_title = $post->post_title; + if ( '' === $post_title ) { + /* translators: %d: ID of a post. */ + $post_title = sprintf( __( '#%d (no title)' ), $post->ID ); + } + $items[] = array( + 'id' => "post-{$post->ID}", + 'title' => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ), + 'type' => 'post_type', + 'type_label' => get_post_type_object( $post->post_type )->labels->singular_name, + 'object' => $post->post_type, + 'object_id' => intval( $post->ID ), + 'url' => get_permalink( intval( $post->ID ) ), + ); + } + } elseif ( 'taxonomy' === $type ) { + $terms = get_terms( + array( + 'taxonomy' => $object, + 'child_of' => 0, + 'exclude' => '', + 'hide_empty' => false, + 'hierarchical' => 1, + 'include' => '', + 'number' => 10, + 'offset' => 10 * $page, + 'order' => 'DESC', + 'orderby' => 'count', + 'pad_counts' => false, + ) + ); + if ( is_wp_error( $terms ) ) { + return $terms; + } + + foreach ( $terms as $term ) { + $items[] = array( + 'id' => "term-{$term->term_id}", + 'title' => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), + 'type' => 'taxonomy', + 'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name, + 'object' => $term->taxonomy, + 'object_id' => intval( $term->term_id ), + 'url' => get_term_link( intval( $term->term_id ), $term->taxonomy ), + ); + } + } + + /** + * Filters the available menu items. + * + * @since 4.3.0 + * + * @param array $items The array of menu items. + * @param string $type The object type. + * @param string $object The object name. + * @param int $page The current page number. + */ + $items = apply_filters( 'customize_nav_menu_available_items', $items, $type, $object, $page ); + + return $items; + } + + /** + * Ajax handler for searching available menu items. + * + * @since 4.3.0 + */ + public function ajax_search_available_items() { + check_ajax_referer( 'customize-menus', 'customize-menus-nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + if ( empty( $_POST['search'] ) ) { + wp_send_json_error( 'nav_menus_missing_search_parameter' ); + } + + $p = isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 0; + if ( $p < 1 ) { + $p = 1; + } + + $s = sanitize_text_field( wp_unslash( $_POST['search'] ) ); + $items = $this->search_available_items_query( + array( + 'pagenum' => $p, + 's' => $s, + ) + ); + + if ( empty( $items ) ) { + wp_send_json_error( array( 'message' => __( 'No results found.' ) ) ); + } else { + wp_send_json_success( array( 'items' => $items ) ); + } + } + + /** + * Performs post queries for available-item searching. + * + * Based on WP_Editor::wp_link_query(). + * + * @since 4.3.0 + * + * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments. + * @return array Menu items. + */ + public function search_available_items_query( $args = array() ) { + $items = array(); + + $post_type_objects = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); + $query = array( + 'post_type' => array_keys( $post_type_objects ), + 'suppress_filters' => true, + 'update_post_term_cache' => false, + 'update_post_meta_cache' => false, + 'post_status' => 'publish', + 'posts_per_page' => 20, + ); + + $args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1; + $query['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0; + + if ( isset( $args['s'] ) ) { + $query['s'] = $args['s']; + } + + $posts = array(); + + // Prepend list of posts with nav_menus_created_posts search results on first page. + $nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' ); + if ( 1 === $args['pagenum'] && $nav_menus_created_posts_setting && count( $nav_menus_created_posts_setting->value() ) > 0 ) { + $stub_post_query = new WP_Query( + array_merge( + $query, + array( + 'post_status' => 'auto-draft', + 'post__in' => $nav_menus_created_posts_setting->value(), + 'posts_per_page' => -1, + ) + ) + ); + $posts = array_merge( $posts, $stub_post_query->posts ); + } + + // Query posts. + $get_posts = new WP_Query( $query ); + $posts = array_merge( $posts, $get_posts->posts ); + + // Create items for posts. + foreach ( $posts as $post ) { + $post_title = $post->post_title; + if ( '' === $post_title ) { + /* translators: %d: ID of a post. */ + $post_title = sprintf( __( '#%d (no title)' ), $post->ID ); + } + $items[] = array( + 'id' => 'post-' . $post->ID, + 'title' => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ), + 'type' => 'post_type', + 'type_label' => $post_type_objects[ $post->post_type ]->labels->singular_name, + 'object' => $post->post_type, + 'object_id' => intval( $post->ID ), + 'url' => get_permalink( intval( $post->ID ) ), + ); + } + + // Query taxonomy terms. + $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'names' ); + $terms = get_terms( + array( + 'taxonomies' => $taxonomies, + 'name__like' => $args['s'], + 'number' => 20, + 'offset' => 20 * ( $args['pagenum'] - 1 ), + ) + ); + + // Check if any taxonomies were found. + if ( ! empty( $terms ) ) { + foreach ( $terms as $term ) { + $items[] = array( + 'id' => 'term-' . $term->term_id, + 'title' => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), + 'type' => 'taxonomy', + 'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name, + 'object' => $term->taxonomy, + 'object_id' => intval( $term->term_id ), + 'url' => get_term_link( intval( $term->term_id ), $term->taxonomy ), + ); + } + } + + // Add "Home" link if search term matches. Treat as a page, but switch to custom on add. + if ( isset( $args['s'] ) ) { + $title = _x( 'Home', 'nav menu home label' ); + $matches = function_exists( 'mb_stripos' ) ? false !== mb_stripos( $title, $args['s'] ) : false !== stripos( $title, $args['s'] ); + if ( $matches ) { + $items[] = array( + 'id' => 'home', + 'title' => $title, + 'type' => 'custom', + 'type_label' => __( 'Custom Link' ), + 'object' => '', + 'url' => home_url(), + ); + } + } + + /** + * Filters the available menu items during a search request. + * + * @since 4.5.0 + * + * @param array $items The array of menu items. + * @param array $args Includes 'pagenum' and 's' (search) arguments. + */ + $items = apply_filters( 'customize_nav_menu_searched_items', $items, $args ); + + return $items; + } + + /** + * Enqueue scripts and styles for Customizer pane. + * + * @since 4.3.0 + */ + public function enqueue_scripts() { + wp_enqueue_style( 'customize-nav-menus' ); + wp_enqueue_script( 'customize-nav-menus' ); + + $temp_nav_menu_setting = new WP_Customize_Nav_Menu_Setting( $this->manager, 'nav_menu[-1]' ); + $temp_nav_menu_item_setting = new WP_Customize_Nav_Menu_Item_Setting( $this->manager, 'nav_menu_item[-1]' ); + + $num_locations = count( get_registered_nav_menus() ); + if ( 1 === $num_locations ) { + $locations_description = __( 'Your theme can display menus in one location.' ); + } else { + /* translators: %s: Number of menu locations. */ + $locations_description = sprintf( _n( 'Your theme can display menus in %s location.', 'Your theme can display menus in %s locations.', $num_locations ), number_format_i18n( $num_locations ) ); + } + + // Pass data to JS. + $settings = array( + 'allMenus' => wp_get_nav_menus(), + 'itemTypes' => $this->available_item_types(), + 'l10n' => array( + 'untitled' => _x( '(no label)', 'missing menu item navigation label' ), + 'unnamed' => _x( '(unnamed)', 'Missing menu name.' ), + 'custom_label' => __( 'Custom Link' ), + 'page_label' => get_post_type_object( 'page' )->labels->singular_name, + /* translators: %s: Menu location. */ + 'menuLocation' => _x( '(Currently set to: %s)', 'menu' ), + 'locationsTitle' => 1 === $num_locations ? __( 'Menu Location' ) : __( 'Menu Locations' ), + 'locationsDescription' => $locations_description, + 'menuNameLabel' => __( 'Menu Name' ), + 'newMenuNameDescription' => __( 'If your theme has multiple menus, giving them clear names will help you manage them.' ), + 'itemAdded' => __( 'Menu item added' ), + 'itemDeleted' => __( 'Menu item deleted' ), + 'menuAdded' => __( 'Menu created' ), + 'menuDeleted' => __( 'Menu deleted' ), + 'movedUp' => __( 'Menu item moved up' ), + 'movedDown' => __( 'Menu item moved down' ), + 'movedLeft' => __( 'Menu item moved out of submenu' ), + 'movedRight' => __( 'Menu item is now a sub-item' ), + /* translators: ▸ is the unicode right-pointing triangle. %s: Section title in the Customizer. */ + 'customizingMenus' => sprintf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( 'nav_menus' )->title ) ), + /* translators: %s: Title of an invalid menu item. */ + 'invalidTitleTpl' => __( '%s (Invalid)' ), + /* translators: %s: Title of a menu item in draft status. */ + 'pendingTitleTpl' => __( '%s (Pending)' ), + /* translators: %d: Number of menu items found. */ + 'itemsFound' => __( 'Number of items found: %d' ), + /* translators: %d: Number of additional menu items found. */ + 'itemsFoundMore' => __( 'Additional items found: %d' ), + 'itemsLoadingMore' => __( 'Loading more results... please wait.' ), + 'reorderModeOn' => __( 'Reorder mode enabled' ), + 'reorderModeOff' => __( 'Reorder mode closed' ), + 'reorderLabelOn' => esc_attr__( 'Reorder menu items' ), + 'reorderLabelOff' => esc_attr__( 'Close reorder mode' ), + ), + 'settingTransport' => 'postMessage', + 'phpIntMax' => PHP_INT_MAX, + 'defaultSettingValues' => array( + 'nav_menu' => $temp_nav_menu_setting->default, + 'nav_menu_item' => $temp_nav_menu_item_setting->default, + ), + 'locationSlugMappedToName' => get_registered_nav_menus(), + ); + + $data = sprintf( 'var _wpCustomizeNavMenusSettings = %s;', wp_json_encode( $settings ) ); + wp_scripts()->add_data( 'customize-nav-menus', 'data', $data ); + + // This is copied from nav-menus.php, and it has an unfortunate object name of `menus`. + $nav_menus_l10n = array( + 'oneThemeLocationNoMenus' => null, + 'moveUp' => __( 'Move up one' ), + 'moveDown' => __( 'Move down one' ), + 'moveToTop' => __( 'Move to the top' ), + /* translators: %s: Previous item name. */ + 'moveUnder' => __( 'Move under %s' ), + /* translators: %s: Previous item name. */ + 'moveOutFrom' => __( 'Move out from under %s' ), + /* translators: %s: Previous item name. */ + 'under' => __( 'Under %s' ), + /* translators: %s: Previous item name. */ + 'outFrom' => __( 'Out from under %s' ), + /* translators: 1: Item name, 2: Item position, 3: Total number of items. */ + 'menuFocus' => __( '%1$s. Menu item %2$d of %3$d.' ), + /* translators: 1: Item name, 2: Item position, 3: Parent item name. */ + 'subMenuFocus' => __( '%1$s. Sub item number %2$d under %3$s.' ), + ); + wp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n ); + } + + /** + * Filters a dynamic setting's constructor args. + * + * For a dynamic setting to be registered, this filter must be employed + * to override the default false value with an array of args to pass to + * the WP_Customize_Setting constructor. + * + * @since 4.3.0 + * + * @param false|array $setting_args The arguments to the WP_Customize_Setting constructor. + * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. + * @return array|false + */ + public function filter_dynamic_setting_args( $setting_args, $setting_id ) { + if ( preg_match( WP_Customize_Nav_Menu_Setting::ID_PATTERN, $setting_id ) ) { + $setting_args = array( + 'type' => WP_Customize_Nav_Menu_Setting::TYPE, + 'transport' => 'postMessage', + ); + } elseif ( preg_match( WP_Customize_Nav_Menu_Item_Setting::ID_PATTERN, $setting_id ) ) { + $setting_args = array( + 'type' => WP_Customize_Nav_Menu_Item_Setting::TYPE, + 'transport' => 'postMessage', + ); + } + return $setting_args; + } + + /** + * Allow non-statically created settings to be constructed with custom WP_Customize_Setting subclass. + * + * @since 4.3.0 + * + * @param string $setting_class WP_Customize_Setting or a subclass. + * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. + * @param array $setting_args WP_Customize_Setting or a subclass. + * @return string + */ + public function filter_dynamic_setting_class( $setting_class, $setting_id, $setting_args ) { + unset( $setting_id ); + + if ( ! empty( $setting_args['type'] ) && WP_Customize_Nav_Menu_Setting::TYPE === $setting_args['type'] ) { + $setting_class = 'WP_Customize_Nav_Menu_Setting'; + } elseif ( ! empty( $setting_args['type'] ) && WP_Customize_Nav_Menu_Item_Setting::TYPE === $setting_args['type'] ) { + $setting_class = 'WP_Customize_Nav_Menu_Item_Setting'; + } + return $setting_class; + } + + /** + * Add the customizer settings and controls. + * + * @since 4.3.0 + */ + public function customize_register() { + $changeset = $this->manager->unsanitized_post_values(); + + // Preview settings for nav menus early so that the sections and controls will be added properly. + $nav_menus_setting_ids = array(); + foreach ( array_keys( $changeset ) as $setting_id ) { + if ( preg_match( '/^(nav_menu_locations|nav_menu|nav_menu_item)\[/', $setting_id ) ) { + $nav_menus_setting_ids[] = $setting_id; + } + } + $settings = $this->manager->add_dynamic_settings( $nav_menus_setting_ids ); + if ( $this->manager->settings_previewed() ) { + foreach ( $settings as $setting ) { + $setting->preview(); + } + } + + // Require JS-rendered control types. + $this->manager->register_panel_type( 'WP_Customize_Nav_Menus_Panel' ); + $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Control' ); + $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Name_Control' ); + $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Locations_Control' ); + $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Auto_Add_Control' ); + $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Item_Control' ); + + // Create a panel for Menus. + $description = '<p>' . __( 'This panel is used for managing navigation menus for content you have already published on your site. You can create menus and add items for existing content such as pages, posts, categories, tags, formats, or custom links.' ) . '</p>'; + if ( current_theme_supports( 'widgets' ) ) { + $description .= '<p>' . sprintf( + /* translators: %s: URL to the Widgets panel of the Customizer. */ + __( 'Menus can be displayed in locations defined by your theme or in <a href="%s">widget areas</a> by adding a “Navigation Menu” widget.' ), + "javascript:wp.customize.panel( 'widgets' ).focus();" + ) . '</p>'; + } else { + $description .= '<p>' . __( 'Menus can be displayed in locations defined by your theme.' ) . '</p>'; + } + + /* + * Once multiple theme supports are allowed in WP_Customize_Panel, + * this panel can be restricted to themes that support menus or widgets. + */ + $this->manager->add_panel( + new WP_Customize_Nav_Menus_Panel( + $this->manager, + 'nav_menus', + array( + 'title' => __( 'Menus' ), + 'description' => $description, + 'priority' => 100, + ) + ) + ); + $menus = wp_get_nav_menus(); + + // Menu locations. + $locations = get_registered_nav_menus(); + $num_locations = count( $locations ); + if ( 1 == $num_locations ) { + $description = '<p>' . __( 'Your theme can display menus in one location. Select which menu you would like to use.' ) . '</p>'; + } else { + /* translators: %s: Number of menu locations. */ + $description = '<p>' . sprintf( _n( 'Your theme can display menus in %s location. Select which menu you would like to use.', 'Your theme can display menus in %s locations. Select which menu appears in each location.', $num_locations ), number_format_i18n( $num_locations ) ) . '</p>'; + } + + if ( current_theme_supports( 'widgets' ) ) { + /* translators: URL to the Widgets panel of the Customizer. */ + $description .= '<p>' . sprintf( __( 'If your theme has widget areas, you can also add menus there. Visit the <a href="%s">Widgets panel</a> and add a “Navigation Menu widget” to display a menu in a sidebar or footer.' ), "javascript:wp.customize.panel( 'widgets' ).focus();" ) . '</p>'; + } + + $this->manager->add_section( + 'menu_locations', + array( + 'title' => 1 === $num_locations ? _x( 'View Location', 'menu locations' ) : _x( 'View All Locations', 'menu locations' ), + 'panel' => 'nav_menus', + 'priority' => 30, + 'description' => $description, + ) + ); + + $choices = array( '0' => __( '— Select —' ) ); + foreach ( $menus as $menu ) { + $choices[ $menu->term_id ] = wp_html_excerpt( $menu->name, 40, '…' ); + } + + // Attempt to re-map the nav menu location assignments when previewing a theme switch. + $mapped_nav_menu_locations = array(); + if ( ! $this->manager->is_theme_active() ) { + $theme_mods = get_option( 'theme_mods_' . $this->manager->get_stylesheet(), array() ); + + // If there is no data from a previous activation, start fresh. + if ( empty( $theme_mods['nav_menu_locations'] ) ) { + $theme_mods['nav_menu_locations'] = array(); + } + + $mapped_nav_menu_locations = wp_map_nav_menu_locations( $theme_mods['nav_menu_locations'], $this->original_nav_menu_locations ); + } + + foreach ( $locations as $location => $description ) { + $setting_id = "nav_menu_locations[{$location}]"; + + $setting = $this->manager->get_setting( $setting_id ); + if ( $setting ) { + $setting->transport = 'postMessage'; + remove_filter( "customize_sanitize_{$setting_id}", 'absint' ); + add_filter( "customize_sanitize_{$setting_id}", array( $this, 'intval_base10' ) ); + } else { + $this->manager->add_setting( + $setting_id, + array( + 'sanitize_callback' => array( $this, 'intval_base10' ), + 'theme_supports' => 'menus', + 'type' => 'theme_mod', + 'transport' => 'postMessage', + 'default' => 0, + ) + ); + } + + // Override the assigned nav menu location if mapped during previewed theme switch. + if ( empty( $changeset[ $setting_id ] ) && isset( $mapped_nav_menu_locations[ $location ] ) ) { + $this->manager->set_post_value( $setting_id, $mapped_nav_menu_locations[ $location ] ); + } + + $this->manager->add_control( + new WP_Customize_Nav_Menu_Location_Control( + $this->manager, + $setting_id, + array( + 'label' => $description, + 'location_id' => $location, + 'section' => 'menu_locations', + 'choices' => $choices, + ) + ) + ); + } + + // Register each menu as a Customizer section, and add each menu item to each menu. + foreach ( $menus as $menu ) { + $menu_id = $menu->term_id; + + // Create a section for each menu. + $section_id = 'nav_menu[' . $menu_id . ']'; + $this->manager->add_section( + new WP_Customize_Nav_Menu_Section( + $this->manager, + $section_id, + array( + 'title' => html_entity_decode( $menu->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), + 'priority' => 10, + 'panel' => 'nav_menus', + ) + ) + ); + + $nav_menu_setting_id = 'nav_menu[' . $menu_id . ']'; + $this->manager->add_setting( + new WP_Customize_Nav_Menu_Setting( + $this->manager, + $nav_menu_setting_id, + array( + 'transport' => 'postMessage', + ) + ) + ); + + // Add the menu contents. + $menu_items = (array) wp_get_nav_menu_items( $menu_id ); + + foreach ( array_values( $menu_items ) as $i => $item ) { + + // Create a setting for each menu item (which doesn't actually manage data, currently). + $menu_item_setting_id = 'nav_menu_item[' . $item->ID . ']'; + + $value = (array) $item; + if ( empty( $value['post_title'] ) ) { + $value['title'] = ''; + } + + $value['nav_menu_term_id'] = $menu_id; + $this->manager->add_setting( + new WP_Customize_Nav_Menu_Item_Setting( + $this->manager, + $menu_item_setting_id, + array( + 'value' => $value, + 'transport' => 'postMessage', + ) + ) + ); + + // Create a control for each menu item. + $this->manager->add_control( + new WP_Customize_Nav_Menu_Item_Control( + $this->manager, + $menu_item_setting_id, + array( + 'label' => $item->title, + 'section' => $section_id, + 'priority' => 10 + $i, + ) + ) + ); + } + + // Note: other controls inside of this section get added dynamically in JS via the MenuSection.ready() function. + } + + // Add the add-new-menu section and controls. + $this->manager->add_section( + 'add_menu', + array( + 'type' => 'new_menu', + 'title' => __( 'New Menu' ), + 'panel' => 'nav_menus', + 'priority' => 20, + ) + ); + + $this->manager->add_setting( + new WP_Customize_Filter_Setting( + $this->manager, + 'nav_menus_created_posts', + array( + 'transport' => 'postMessage', + 'type' => 'option', // To prevent theme prefix in changeset. + 'default' => array(), + 'sanitize_callback' => array( $this, 'sanitize_nav_menus_created_posts' ), + ) + ) + ); + } + + /** + * Get the base10 intval. + * + * This is used as a setting's sanitize_callback; we can't use just plain + * intval because the second argument is not what intval() expects. + * + * @since 4.3.0 + * + * @param mixed $value Number to convert. + * @return int Integer. + */ + public function intval_base10( $value ) { + return intval( $value, 10 ); + } + + /** + * Return an array of all the available item types. + * + * @since 4.3.0 + * @since 4.7.0 Each array item now includes a `$type_label` in addition to `$title`, `$type`, and `$object`. + * + * @return array The available menu item types. + */ + public function available_item_types() { + $item_types = array(); + + $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); + if ( $post_types ) { + foreach ( $post_types as $slug => $post_type ) { + $item_types[] = array( + 'title' => $post_type->labels->name, + 'type_label' => $post_type->labels->singular_name, + 'type' => 'post_type', + 'object' => $post_type->name, + ); + } + } + + $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' ); + if ( $taxonomies ) { + foreach ( $taxonomies as $slug => $taxonomy ) { + if ( 'post_format' === $taxonomy && ! current_theme_supports( 'post-formats' ) ) { + continue; + } + $item_types[] = array( + 'title' => $taxonomy->labels->name, + 'type_label' => $taxonomy->labels->singular_name, + 'type' => 'taxonomy', + 'object' => $taxonomy->name, + ); + } + } + + /** + * Filters the available menu item types. + * + * @since 4.3.0 + * @since 4.7.0 Each array item now includes a `$type_label` in addition to `$title`, `$type`, and `$object`. + * + * @param array $item_types Navigation menu item types. + */ + $item_types = apply_filters( 'customize_nav_menu_available_item_types', $item_types ); + + return $item_types; + } + + /** + * Add a new `auto-draft` post. + * + * @since 4.7.0 + * + * @param array $postarr { + * Post array. Note that post_status is overridden to be `auto-draft`. + * + * @var string $post_title Post title. Required. + * @var string $post_type Post type. Required. + * @var string $post_name Post name. + * @var string $post_content Post content. + * } + * @return WP_Post|WP_Error Inserted auto-draft post object or error. + */ + public function insert_auto_draft_post( $postarr ) { + if ( ! isset( $postarr['post_type'] ) ) { + return new WP_Error( 'unknown_post_type', __( 'Invalid post type.' ) ); + } + if ( empty( $postarr['post_title'] ) ) { + return new WP_Error( 'empty_title', __( 'Empty title.' ) ); + } + if ( ! empty( $postarr['post_status'] ) ) { + return new WP_Error( 'status_forbidden', __( 'Status is forbidden.' ) ); + } + + /* + * If the changeset is a draft, this will change to draft the next time the changeset + * is updated; otherwise, auto-draft will persist in autosave revisions, until save. + */ + $postarr['post_status'] = 'auto-draft'; + + // Auto-drafts are allowed to have empty post_names, so it has to be explicitly set. + if ( empty( $postarr['post_name'] ) ) { + $postarr['post_name'] = sanitize_title( $postarr['post_title'] ); + } + if ( ! isset( $postarr['meta_input'] ) ) { + $postarr['meta_input'] = array(); + } + $postarr['meta_input']['_customize_draft_post_name'] = $postarr['post_name']; + $postarr['meta_input']['_customize_changeset_uuid'] = $this->manager->changeset_uuid(); + unset( $postarr['post_name'] ); + + add_filter( 'wp_insert_post_empty_content', '__return_false', 1000 ); + $r = wp_insert_post( wp_slash( $postarr ), true ); + remove_filter( 'wp_insert_post_empty_content', '__return_false', 1000 ); + + if ( is_wp_error( $r ) ) { + return $r; + } else { + return get_post( $r ); + } + } + + /** + * Ajax handler for adding a new auto-draft post. + * + * @since 4.7.0 + */ + public function ajax_insert_auto_draft_post() { + if ( ! check_ajax_referer( 'customize-menus', 'customize-menus-nonce', false ) ) { + wp_send_json_error( 'bad_nonce', 400 ); + } + + if ( ! current_user_can( 'customize' ) ) { + wp_send_json_error( 'customize_not_allowed', 403 ); + } + + if ( empty( $_POST['params'] ) || ! is_array( $_POST['params'] ) ) { + wp_send_json_error( 'missing_params', 400 ); + } + + $params = wp_unslash( $_POST['params'] ); + $illegal_params = array_diff( array_keys( $params ), array( 'post_type', 'post_title' ) ); + if ( ! empty( $illegal_params ) ) { + wp_send_json_error( 'illegal_params', 400 ); + } + + $params = array_merge( + array( + 'post_type' => '', + 'post_title' => '', + ), + $params + ); + + if ( empty( $params['post_type'] ) || ! post_type_exists( $params['post_type'] ) ) { + status_header( 400 ); + wp_send_json_error( 'missing_post_type_param' ); + } + + $post_type_object = get_post_type_object( $params['post_type'] ); + if ( ! current_user_can( $post_type_object->cap->create_posts ) || ! current_user_can( $post_type_object->cap->publish_posts ) ) { + status_header( 403 ); + wp_send_json_error( 'insufficient_post_permissions' ); + } + + $params['post_title'] = trim( $params['post_title'] ); + if ( '' === $params['post_title'] ) { + status_header( 400 ); + wp_send_json_error( 'missing_post_title' ); + } + + $r = $this->insert_auto_draft_post( $params ); + if ( is_wp_error( $r ) ) { + $error = $r; + if ( ! empty( $post_type_object->labels->singular_name ) ) { + $singular_name = $post_type_object->labels->singular_name; + } else { + $singular_name = __( 'Post' ); + } + + $data = array( + /* translators: 1: Post type name, 2: Error message. */ + 'message' => sprintf( __( '%1$s could not be created: %2$s' ), $singular_name, $error->get_error_message() ), + ); + wp_send_json_error( $data ); + } else { + $post = $r; + $data = array( + 'post_id' => $post->ID, + 'url' => get_permalink( $post->ID ), + ); + wp_send_json_success( $data ); + } + } + + /** + * Print the JavaScript templates used to render Menu Customizer components. + * + * Templates are imported into the JS use wp.template. + * + * @since 4.3.0 + */ + public function print_templates() { + ?> + <script type="text/html" id="tmpl-available-menu-item"> + <li id="menu-item-tpl-{{ data.id }}" class="menu-item-tpl" data-menu-item-id="{{ data.id }}"> + <div class="menu-item-bar"> + <div class="menu-item-handle"> + <span class="item-type" aria-hidden="true">{{ data.type_label }}</span> + <span class="item-title" aria-hidden="true"> + <span class="menu-item-title<# if ( ! data.title ) { #> no-title<# } #>">{{ data.title || wp.customize.Menus.data.l10n.untitled }}</span> + </span> + <button type="button" class="button-link item-add"> + <span class="screen-reader-text"> + <?php + /* translators: 1: Title of a menu item, 2: Type of a menu item. */ + printf( __( 'Add to menu: %1$s (%2$s)' ), '{{ data.title || wp.customize.Menus.data.l10n.untitled }}', '{{ data.type_label }}' ); + ?> + </span> + </button> + </div> + </div> + </li> + </script> + + <script type="text/html" id="tmpl-menu-item-reorder-nav"> + <div class="menu-item-reorder-nav"> + <?php + printf( + '<button type="button" class="menus-move-up">%1$s</button><button type="button" class="menus-move-down">%2$s</button><button type="button" class="menus-move-left">%3$s</button><button type="button" class="menus-move-right">%4$s</button>', + __( 'Move up' ), + __( 'Move down' ), + __( 'Move one level up' ), + __( 'Move one level down' ) + ); + ?> + </div> + </script> + + <script type="text/html" id="tmpl-nav-menu-delete-button"> + <div class="menu-delete-item"> + <button type="button" class="button-link button-link-delete"> + <?php _e( 'Delete Menu' ); ?> + </button> + </div> + </script> + + <script type="text/html" id="tmpl-nav-menu-submit-new-button"> + <p id="customize-new-menu-submit-description"><?php _e( 'Click “Next” to start adding links to your new menu.' ); ?></p> + <button id="customize-new-menu-submit" type="button" class="button" aria-describedby="customize-new-menu-submit-description"><?php _e( 'Next' ); ?></button> + </script> + + <script type="text/html" id="tmpl-nav-menu-locations-header"> + <span class="customize-control-title customize-section-title-menu_locations-heading">{{ data.l10n.locationsTitle }}</span> + <p class="customize-control-description customize-section-title-menu_locations-description">{{ data.l10n.locationsDescription }}</p> + </script> + + <script type="text/html" id="tmpl-nav-menu-create-menu-section-title"> + <p class="add-new-menu-notice"> + <?php _e( 'It doesn’t look like your site has any menus yet. Want to build one? Click the button to start.' ); ?> + </p> + <p class="add-new-menu-notice"> + <?php _e( 'You’ll create a menu, assign it a location, and add menu items like links to pages and categories. If your theme has multiple menu areas, you might need to create more than one.' ); ?> + </p> + <h3> + <button type="button" class="button customize-add-menu-button"> + <?php _e( 'Create New Menu' ); ?> + </button> + </h3> + </script> + <?php + } + + /** + * Print the html template used to render the add-menu-item frame. + * + * @since 4.3.0 + */ + public function available_items_template() { + ?> + <div id="available-menu-items" class="accordion-container"> + <div class="customize-section-title"> + <button type="button" class="customize-section-back" tabindex="-1"> + <span class="screen-reader-text"><?php _e( 'Back' ); ?></span> + </button> + <h3> + <span class="customize-action"> + <?php + /* translators: ▸ is the unicode right-pointing triangle. %s: Section title in the Customizer. */ + printf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( 'nav_menus' )->title ) ); + ?> + </span> + <?php _e( 'Add Menu Items' ); ?> + </h3> + </div> + <div id="available-menu-items-search" class="accordion-section cannot-expand"> + <div class="accordion-section-title"> + <label class="screen-reader-text" for="menu-items-search"><?php _e( 'Search Menu Items' ); ?></label> + <input type="text" id="menu-items-search" placeholder="<?php esc_attr_e( 'Search menu items…' ); ?>" aria-describedby="menu-items-search-desc" /> + <p class="screen-reader-text" id="menu-items-search-desc"><?php _e( 'The search results will be updated as you type.' ); ?></p> + <span class="spinner"></span> + </div> + <div class="search-icon" aria-hidden="true"></div> + <button type="button" class="clear-results"><span class="screen-reader-text"><?php _e( 'Clear Results' ); ?></span></button> + <ul class="accordion-section-content available-menu-items-list" data-type="search"></ul> + </div> + <?php + + // Ensure the page post type comes first in the list. + $item_types = $this->available_item_types(); + $page_item_type = null; + foreach ( $item_types as $i => $item_type ) { + if ( isset( $item_type['object'] ) && 'page' === $item_type['object'] ) { + $page_item_type = $item_type; + unset( $item_types[ $i ] ); + } + } + + $this->print_custom_links_available_menu_item(); + if ( $page_item_type ) { + $this->print_post_type_container( $page_item_type ); + } + // Containers for per-post-type item browsing; items are added with JS. + foreach ( $item_types as $item_type ) { + $this->print_post_type_container( $item_type ); + } + ?> + </div><!-- #available-menu-items --> + <?php + } + + /** + * Print the markup for new menu items. + * + * To be used in the template #available-menu-items. + * + * @since 4.7.0 + * + * @param array $available_item_type Menu item data to output, including title, type, and label. + * @return void + */ + protected function print_post_type_container( $available_item_type ) { + $id = sprintf( 'available-menu-items-%s-%s', $available_item_type['type'], $available_item_type['object'] ); + ?> + <div id="<?php echo esc_attr( $id ); ?>" class="accordion-section"> + <h4 class="accordion-section-title" role="presentation"> + <?php echo esc_html( $available_item_type['title'] ); ?> + <span class="spinner"></span> + <span class="no-items"><?php _e( 'No items' ); ?></span> + <button type="button" class="button-link" aria-expanded="false"> + <span class="screen-reader-text"> + <?php + /* translators: %s: Title of a section with menu items. */ + printf( __( 'Toggle section: %s' ), esc_html( $available_item_type['title'] ) ); + ?> + </span> + <span class="toggle-indicator" aria-hidden="true"></span> + </button> + </h4> + <div class="accordion-section-content"> + <?php if ( 'post_type' === $available_item_type['type'] ) : ?> + <?php $post_type_obj = get_post_type_object( $available_item_type['object'] ); ?> + <?php if ( current_user_can( $post_type_obj->cap->create_posts ) && current_user_can( $post_type_obj->cap->publish_posts ) ) : ?> + <div class="new-content-item"> + <label for="<?php echo esc_attr( 'create-item-input-' . $available_item_type['object'] ); ?>" class="screen-reader-text"><?php echo esc_html( $post_type_obj->labels->add_new_item ); ?></label> + <input type="text" id="<?php echo esc_attr( 'create-item-input-' . $available_item_type['object'] ); ?>" class="create-item-input" placeholder="<?php echo esc_attr( $post_type_obj->labels->add_new_item ); ?>"> + <button type="button" class="button add-content"><?php _e( 'Add' ); ?></button> + </div> + <?php endif; ?> + <?php endif; ?> + <ul class="available-menu-items-list" data-type="<?php echo esc_attr( $available_item_type['type'] ); ?>" data-object="<?php echo esc_attr( $available_item_type['object'] ); ?>" data-type_label="<?php echo esc_attr( isset( $available_item_type['type_label'] ) ? $available_item_type['type_label'] : $available_item_type['type'] ); ?>"></ul> + </div> + </div> + <?php + } + + /** + * Print the markup for available menu item custom links. + * + * @since 4.7.0 + * + * @return void + */ + protected function print_custom_links_available_menu_item() { + ?> + <div id="new-custom-menu-item" class="accordion-section"> + <h4 class="accordion-section-title" role="presentation"> + <?php _e( 'Custom Links' ); ?> + <button type="button" class="button-link" aria-expanded="false"> + <span class="screen-reader-text"><?php _e( 'Toggle section: Custom Links' ); ?></span> + <span class="toggle-indicator" aria-hidden="true"></span> + </button> + </h4> + <div class="accordion-section-content customlinkdiv"> + <input type="hidden" value="custom" id="custom-menu-item-type" name="menu-item[-1][menu-item-type]" /> + <p id="menu-item-url-wrap" class="wp-clearfix"> + <label class="howto" for="custom-menu-item-url"><?php _e( 'URL' ); ?></label> + <input id="custom-menu-item-url" name="menu-item[-1][menu-item-url]" type="text" class="code menu-item-textbox" placeholder="https://"> + </p> + <p id="menu-item-name-wrap" class="wp-clearfix"> + <label class="howto" for="custom-menu-item-name"><?php _e( 'Link Text' ); ?></label> + <input id="custom-menu-item-name" name="menu-item[-1][menu-item-title]" type="text" class="regular-text menu-item-textbox"> + </p> + <p class="button-controls"> + <span class="add-to-menu"> + <input type="submit" class="button submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-custom-menu-item" id="custom-menu-item-submit"> + <span class="spinner"></span> + </span> + </p> + </div> + </div> + <?php + } + + // + // Start functionality specific to partial-refresh of menu changes in Customizer preview. + // + + /** + * Nav menu args used for each instance, keyed by the args HMAC. + * + * @since 4.3.0 + * @var array + */ + public $preview_nav_menu_instance_args = array(); + + /** + * Filters arguments for dynamic nav_menu selective refresh partials. + * + * @since 4.5.0 + * + * @param array|false $partial_args Partial args. + * @param string $partial_id Partial ID. + * @return array Partial args. + */ + public function customize_dynamic_partial_args( $partial_args, $partial_id ) { + + if ( preg_match( '/^nav_menu_instance\[[0-9a-f]{32}\]$/', $partial_id ) ) { + if ( false === $partial_args ) { + $partial_args = array(); + } + $partial_args = array_merge( + $partial_args, + array( + 'type' => 'nav_menu_instance', + 'render_callback' => array( $this, 'render_nav_menu_partial' ), + 'container_inclusive' => true, + 'settings' => array(), // Empty because the nav menu instance may relate to a menu or a location. + 'capability' => 'edit_theme_options', + ) + ); + } + + return $partial_args; + } + + /** + * Add hooks for the Customizer preview. + * + * @since 4.3.0 + */ + public function customize_preview_init() { + add_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue_deps' ) ); + add_filter( 'wp_nav_menu_args', array( $this, 'filter_wp_nav_menu_args' ), 1000 ); + add_filter( 'wp_nav_menu', array( $this, 'filter_wp_nav_menu' ), 10, 2 ); + add_filter( 'wp_footer', array( $this, 'export_preview_data' ), 1 ); + add_filter( 'customize_render_partials_response', array( $this, 'export_partial_rendered_nav_menu_instances' ) ); + } + + /** + * Make the auto-draft status protected so that it can be queried. + * + * @since 4.7.0 + * + * @global array $wp_post_statuses List of post statuses. + */ + public function make_auto_draft_status_previewable() { + global $wp_post_statuses; + $wp_post_statuses['auto-draft']->protected = true; + } + + /** + * Sanitize post IDs for posts created for nav menu items to be published. + * + * @since 4.7.0 + * + * @param array $value Post IDs. + * @return array Post IDs. + */ + public function sanitize_nav_menus_created_posts( $value ) { + $post_ids = array(); + foreach ( wp_parse_id_list( $value ) as $post_id ) { + if ( empty( $post_id ) ) { + continue; + } + $post = get_post( $post_id ); + if ( 'auto-draft' !== $post->post_status && 'draft' !== $post->post_status ) { + continue; + } + $post_type_obj = get_post_type_object( $post->post_type ); + if ( ! $post_type_obj ) { + continue; + } + if ( ! current_user_can( $post_type_obj->cap->publish_posts ) || ! current_user_can( $post_type_obj->cap->edit_post, $post_id ) ) { + continue; + } + $post_ids[] = $post->ID; + } + return $post_ids; + } + + /** + * Publish the auto-draft posts that were created for nav menu items. + * + * The post IDs will have been sanitized by already by + * `WP_Customize_Nav_Menu_Items::sanitize_nav_menus_created_posts()` to + * remove any post IDs for which the user cannot publish or for which the + * post is not an auto-draft. + * + * @since 4.7.0 + * + * @param WP_Customize_Setting $setting Customizer setting object. + */ + public function save_nav_menus_created_posts( $setting ) { + $post_ids = $setting->post_value(); + if ( ! empty( $post_ids ) ) { + foreach ( $post_ids as $post_id ) { + + // Prevent overriding the status that a user may have prematurely updated the post to. + $current_status = get_post_status( $post_id ); + if ( 'auto-draft' !== $current_status && 'draft' !== $current_status ) { + continue; + } + + $target_status = 'attachment' === get_post_type( $post_id ) ? 'inherit' : 'publish'; + $args = array( + 'ID' => $post_id, + 'post_status' => $target_status, + ); + $post_name = get_post_meta( $post_id, '_customize_draft_post_name', true ); + if ( $post_name ) { + $args['post_name'] = $post_name; + } + + // Note that wp_publish_post() cannot be used because unique slugs need to be assigned. + wp_update_post( wp_slash( $args ) ); + + delete_post_meta( $post_id, '_customize_draft_post_name' ); + } + } + } + + /** + * Keep track of the arguments that are being passed to wp_nav_menu(). + * + * @since 4.3.0 + * @see wp_nav_menu() + * @see WP_Customize_Widgets::filter_dynamic_sidebar_params() + * + * @param array $args An array containing wp_nav_menu() arguments. + * @return array Arguments. + */ + public function filter_wp_nav_menu_args( $args ) { + /* + * The following conditions determine whether or not this instance of + * wp_nav_menu() can use selective refreshed. A wp_nav_menu() can be + * selective refreshed if... + */ + $can_partial_refresh = ( + // ...if wp_nav_menu() is directly echoing out the menu (and thus isn't manipulating the string after generated), + ! empty( $args['echo'] ) + && + // ...and if the fallback_cb can be serialized to JSON, since it will be included in the placement context data, + ( empty( $args['fallback_cb'] ) || is_string( $args['fallback_cb'] ) ) + && + // ...and if the walker can also be serialized to JSON, since it will be included in the placement context data as well, + ( empty( $args['walker'] ) || is_string( $args['walker'] ) ) + // ...and if it has a theme location assigned or an assigned menu to display, + && ( + ! empty( $args['theme_location'] ) + || + ( ! empty( $args['menu'] ) && ( is_numeric( $args['menu'] ) || is_object( $args['menu'] ) ) ) + ) + && + // ...and if the nav menu would be rendered with a wrapper container element (upon which to attach data-* attributes). + ( + ! empty( $args['container'] ) + || + ( isset( $args['items_wrap'] ) && '<' === substr( $args['items_wrap'], 0, 1 ) ) + ) + ); + $args['can_partial_refresh'] = $can_partial_refresh; + + $exported_args = $args; + + // Empty out args which may not be JSON-serializable. + if ( ! $can_partial_refresh ) { + $exported_args['fallback_cb'] = ''; + $exported_args['walker'] = ''; + } + + /* + * Replace object menu arg with a term_id menu arg, as this exports better + * to JS and is easier to compare hashes. + */ + if ( ! empty( $exported_args['menu'] ) && is_object( $exported_args['menu'] ) ) { + $exported_args['menu'] = $exported_args['menu']->term_id; + } + + ksort( $exported_args ); + $exported_args['args_hmac'] = $this->hash_nav_menu_args( $exported_args ); + + $args['customize_preview_nav_menus_args'] = $exported_args; + $this->preview_nav_menu_instance_args[ $exported_args['args_hmac'] ] = $exported_args; + return $args; + } + + /** + * Prepares wp_nav_menu() calls for partial refresh. + * + * Injects attributes into container element. + * + * @since 4.3.0 + * + * @see wp_nav_menu() + * + * @param string $nav_menu_content The HTML content for the navigation menu. + * @param object $args An object containing wp_nav_menu() arguments. + * @return string Nav menu HTML with selective refresh attributes added if partial can be refreshed. + */ + public function filter_wp_nav_menu( $nav_menu_content, $args ) { + if ( isset( $args->customize_preview_nav_menus_args['can_partial_refresh'] ) && $args->customize_preview_nav_menus_args['can_partial_refresh'] ) { + $attributes = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'nav_menu_instance[' . $args->customize_preview_nav_menus_args['args_hmac'] . ']' ) ); + $attributes .= ' data-customize-partial-type="nav_menu_instance"'; + $attributes .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $args->customize_preview_nav_menus_args ) ) ); + $nav_menu_content = preg_replace( '#^(<\w+)#', '$1 ' . str_replace( '\\', '\\\\', $attributes ), $nav_menu_content, 1 ); + } + return $nav_menu_content; + } + + /** + * Hashes (hmac) the nav menu arguments to ensure they are not tampered with when + * submitted in the Ajax request. + * + * Note that the array is expected to be pre-sorted. + * + * @since 4.3.0 + * + * @param array $args The arguments to hash. + * @return string Hashed nav menu arguments. + */ + public function hash_nav_menu_args( $args ) { + return wp_hash( serialize( $args ) ); + } + + /** + * Enqueue scripts for the Customizer preview. + * + * @since 4.3.0 + */ + public function customize_preview_enqueue_deps() { + wp_enqueue_script( 'customize-preview-nav-menus' ); // Note that we have overridden this. + } + + /** + * Exports data from PHP to JS. + * + * @since 4.3.0 + */ + public function export_preview_data() { + + // Why not wp_localize_script? Because we're not localizing, and it forces values into strings. + $exports = array( + 'navMenuInstanceArgs' => $this->preview_nav_menu_instance_args, + ); + printf( '<script>var _wpCustomizePreviewNavMenusExports = %s;</script>', wp_json_encode( $exports ) ); + } + + /** + * Export any wp_nav_menu() calls during the rendering of any partials. + * + * @since 4.5.0 + * + * @param array $response Response. + * @return array Response. + */ + public function export_partial_rendered_nav_menu_instances( $response ) { + $response['nav_menu_instance_args'] = $this->preview_nav_menu_instance_args; + return $response; + } + + /** + * Render a specific menu via wp_nav_menu() using the supplied arguments. + * + * @since 4.3.0 + * + * @see wp_nav_menu() + * + * @param WP_Customize_Partial $partial Partial. + * @param array $nav_menu_args Nav menu args supplied as container context. + * @return string|false + */ + public function render_nav_menu_partial( $partial, $nav_menu_args ) { + unset( $partial ); + + if ( ! isset( $nav_menu_args['args_hmac'] ) ) { + // Error: missing_args_hmac. + return false; + } + + $nav_menu_args_hmac = $nav_menu_args['args_hmac']; + unset( $nav_menu_args['args_hmac'] ); + + ksort( $nav_menu_args ); + if ( ! hash_equals( $this->hash_nav_menu_args( $nav_menu_args ), $nav_menu_args_hmac ) ) { + // Error: args_hmac_mismatch. + return false; + } + + ob_start(); + wp_nav_menu( $nav_menu_args ); + $content = ob_get_clean(); + + return $content; + } +} diff --git a/wp-includes/class-wp-customize-panel.php b/wp-includes/class-wp-customize-panel.php new file mode 100644 index 0000000..73ce273 --- /dev/null +++ b/wp-includes/class-wp-customize-panel.php @@ -0,0 +1,394 @@ +<?php +/** + * WordPress Customize Panel classes + * + * @package WordPress + * @subpackage Customize + * @since 4.0.0 + */ + +/** + * Customize Panel class. + * + * A UI container for sections, managed by the WP_Customize_Manager. + * + * @since 4.0.0 + * + * @see WP_Customize_Manager + */ +class WP_Customize_Panel { + + /** + * Incremented with each new class instantiation, then stored in $instance_number. + * + * Used when sorting two instances whose priorities are equal. + * + * @since 4.1.0 + * @var int + */ + protected static $instance_count = 0; + + /** + * Order in which this instance was created in relation to other instances. + * + * @since 4.1.0 + * @var int + */ + public $instance_number; + + /** + * WP_Customize_Manager instance. + * + * @since 4.0.0 + * @var WP_Customize_Manager + */ + public $manager; + + /** + * Unique identifier. + * + * @since 4.0.0 + * @var string + */ + public $id; + + /** + * Priority of the panel, defining the display order of panels and sections. + * + * @since 4.0.0 + * @var integer + */ + public $priority = 160; + + /** + * Capability required for the panel. + * + * @since 4.0.0 + * @var string + */ + public $capability = 'edit_theme_options'; + + /** + * Theme features required to support the panel. + * + * @since 4.0.0 + * @var string|string[] + */ + public $theme_supports = ''; + + /** + * Title of the panel to show in UI. + * + * @since 4.0.0 + * @var string + */ + public $title = ''; + + /** + * Description to show in the UI. + * + * @since 4.0.0 + * @var string + */ + public $description = ''; + + /** + * Auto-expand a section in a panel when the panel is expanded when the panel only has the one section. + * + * @since 4.7.4 + * @var bool + */ + public $auto_expand_sole_section = false; + + /** + * Customizer sections for this panel. + * + * @since 4.0.0 + * @var array + */ + public $sections; + + /** + * Type of this panel. + * + * @since 4.1.0 + * @var string + */ + public $type = 'default'; + + /** + * Active callback. + * + * @since 4.1.0 + * + * @see WP_Customize_Section::active() + * + * @var callable Callback is called with one argument, the instance of + * WP_Customize_Section, and returns bool to indicate whether + * the section is active (such as it relates to the URL currently + * being previewed). + */ + public $active_callback = ''; + + /** + * Constructor. + * + * Any supplied $args override class property defaults. + * + * @since 4.0.0 + * + * @param WP_Customize_Manager $manager Customizer bootstrap instance. + * @param string $id A specific ID for the panel. + * @param array $args { + * Optional. Array of properties for the new Panel object. Default empty array. + * + * @type int $priority Priority of the panel, defining the display order + * of panels and sections. Default 160. + * @type string $capability Capability required for the panel. + * Default `edit_theme_options`. + * @type string|string[] $theme_supports Theme features required to support the panel. + * @type string $title Title of the panel to show in UI. + * @type string $description Description to show in the UI. + * @type string $type Type of the panel. + * @type callable $active_callback Active callback. + * } + */ + public function __construct( $manager, $id, $args = array() ) { + $keys = array_keys( get_object_vars( $this ) ); + foreach ( $keys as $key ) { + if ( isset( $args[ $key ] ) ) { + $this->$key = $args[ $key ]; + } + } + + $this->manager = $manager; + $this->id = $id; + if ( empty( $this->active_callback ) ) { + $this->active_callback = array( $this, 'active_callback' ); + } + self::$instance_count += 1; + $this->instance_number = self::$instance_count; + + $this->sections = array(); // Users cannot customize the $sections array. + } + + /** + * Check whether panel is active to current Customizer preview. + * + * @since 4.1.0 + * + * @return bool Whether the panel is active to the current preview. + */ + final public function active() { + $panel = $this; + $active = call_user_func( $this->active_callback, $this ); + + /** + * Filters response of WP_Customize_Panel::active(). + * + * @since 4.1.0 + * + * @param bool $active Whether the Customizer panel is active. + * @param WP_Customize_Panel $panel WP_Customize_Panel instance. + */ + $active = apply_filters( 'customize_panel_active', $active, $panel ); + + return $active; + } + + /** + * Default callback used when invoking WP_Customize_Panel::active(). + * + * Subclasses can override this with their specific logic, or they may + * provide an 'active_callback' argument to the constructor. + * + * @since 4.1.0 + * + * @return bool Always true. + */ + public function active_callback() { + return true; + } + + /** + * Gather the parameters passed to client JavaScript via JSON. + * + * @since 4.1.0 + * + * @return array The array to be exported to the client as JSON. + */ + public function json() { + $array = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'type' ) ); + $array['title'] = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) ); + $array['content'] = $this->get_content(); + $array['active'] = $this->active(); + $array['instanceNumber'] = $this->instance_number; + $array['autoExpandSoleSection'] = $this->auto_expand_sole_section; + return $array; + } + + /** + * Checks required user capabilities and whether the theme has the + * feature support required by the panel. + * + * @since 4.0.0 + * + * @return bool False if theme doesn't support the panel or the user doesn't have the capability. + */ + final public function check_capabilities() { + if ( $this->capability && ! current_user_can( $this->capability ) ) { + return false; + } + + if ( $this->theme_supports && ! current_theme_supports( ... (array) $this->theme_supports ) ) { + return false; + } + + return true; + } + + /** + * Get the panel's content template for insertion into the Customizer pane. + * + * @since 4.1.0 + * + * @return string Content for the panel. + */ + final public function get_content() { + ob_start(); + $this->maybe_render(); + return trim( ob_get_clean() ); + } + + /** + * Check capabilities and render the panel. + * + * @since 4.0.0 + */ + final public function maybe_render() { + if ( ! $this->check_capabilities() ) { + return; + } + + /** + * Fires before rendering a Customizer panel. + * + * @since 4.0.0 + * + * @param WP_Customize_Panel $this WP_Customize_Panel instance. + */ + do_action( 'customize_render_panel', $this ); + + /** + * Fires before rendering a specific Customizer panel. + * + * The dynamic portion of the hook name, `$this->id`, refers to + * the ID of the specific Customizer panel to be rendered. + * + * @since 4.0.0 + */ + do_action( "customize_render_panel_{$this->id}" ); + + $this->render(); + } + + /** + * Render the panel container, and then its contents (via `this->render_content()`) in a subclass. + * + * Panel containers are now rendered in JS by default, see WP_Customize_Panel::print_template(). + * + * @since 4.0.0 + */ + protected function render() {} + + /** + * Render the panel UI in a subclass. + * + * Panel contents are now rendered in JS by default, see WP_Customize_Panel::print_template(). + * + * @since 4.1.0 + */ + protected function render_content() {} + + /** + * Render the panel's JS templates. + * + * This function is only run for panel types that have been registered with + * WP_Customize_Manager::register_panel_type(). + * + * @since 4.3.0 + * + * @see WP_Customize_Manager::register_panel_type() + */ + public function print_template() { + ?> + <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>-content"> + <?php $this->content_template(); ?> + </script> + <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>"> + <?php $this->render_template(); ?> + </script> + <?php + } + + /** + * An Underscore (JS) template for rendering this panel's container. + * + * Class variables for this panel class are available in the `data` JS object; + * export custom variables by overriding WP_Customize_Panel::json(). + * + * @see WP_Customize_Panel::print_template() + * + * @since 4.3.0 + */ + protected function render_template() { + ?> + <li id="accordion-panel-{{ data.id }}" class="accordion-section control-section control-panel control-panel-{{ data.type }}"> + <h3 class="accordion-section-title" tabindex="0"> + {{ data.title }} + <span class="screen-reader-text"><?php _e( 'Press return or enter to open this panel' ); ?></span> + </h3> + <ul class="accordion-sub-container control-panel-content"></ul> + </li> + <?php + } + + /** + * An Underscore (JS) template for this panel's content (but not its container). + * + * Class variables for this panel class are available in the `data` JS object; + * export custom variables by overriding WP_Customize_Panel::json(). + * + * @see WP_Customize_Panel::print_template() + * + * @since 4.3.0 + */ + protected function content_template() { + ?> + <li class="panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>"> + <button class="customize-panel-back" tabindex="-1"><span class="screen-reader-text"><?php _e( 'Back' ); ?></span></button> + <div class="accordion-section-title"> + <span class="preview-notice"> + <?php + /* translators: %s: The site/panel title in the Customizer. */ + echo sprintf( __( 'You are customizing %s' ), '<strong class="panel-title">{{ data.title }}</strong>' ); + ?> + </span> + <# if ( data.description ) { #> + <button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button> + <# } #> + </div> + <# if ( data.description ) { #> + <div class="description customize-panel-description"> + {{{ data.description }}} + </div> + <# } #> + + <div class="customize-control-notifications-container"></div> + </li> + <?php + } +} + +/** WP_Customize_Nav_Menus_Panel class */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php'; diff --git a/wp-includes/class-wp-customize-section.php b/wp-includes/class-wp-customize-section.php new file mode 100644 index 0000000..8a843f0 --- /dev/null +++ b/wp-includes/class-wp-customize-section.php @@ -0,0 +1,402 @@ +<?php +/** + * WordPress Customize Section classes + * + * @package WordPress + * @subpackage Customize + * @since 3.4.0 + */ + +/** + * Customize Section class. + * + * A UI container for controls, managed by the WP_Customize_Manager class. + * + * @since 3.4.0 + * + * @see WP_Customize_Manager + */ +class WP_Customize_Section { + + /** + * Incremented with each new class instantiation, then stored in $instance_number. + * + * Used when sorting two instances whose priorities are equal. + * + * @since 4.1.0 + * @var int + */ + protected static $instance_count = 0; + + /** + * Order in which this instance was created in relation to other instances. + * + * @since 4.1.0 + * @var int + */ + public $instance_number; + + /** + * WP_Customize_Manager instance. + * + * @since 3.4.0 + * @var WP_Customize_Manager + */ + public $manager; + + /** + * Unique identifier. + * + * @since 3.4.0 + * @var string + */ + public $id; + + /** + * Priority of the section which informs load order of sections. + * + * @since 3.4.0 + * @var integer + */ + public $priority = 160; + + /** + * Panel in which to show the section, making it a sub-section. + * + * @since 4.0.0 + * @var string + */ + public $panel = ''; + + /** + * Capability required for the section. + * + * @since 3.4.0 + * @var string + */ + public $capability = 'edit_theme_options'; + + /** + * Theme features required to support the section. + * + * @since 3.4.0 + * @var string|string[] + */ + public $theme_supports = ''; + + /** + * Title of the section to show in UI. + * + * @since 3.4.0 + * @var string + */ + public $title = ''; + + /** + * Description to show in the UI. + * + * @since 3.4.0 + * @var string + */ + public $description = ''; + + /** + * Customizer controls for this section. + * + * @since 3.4.0 + * @var array + */ + public $controls; + + /** + * Type of this section. + * + * @since 4.1.0 + * @var string + */ + public $type = 'default'; + + /** + * Active callback. + * + * @since 4.1.0 + * + * @see WP_Customize_Section::active() + * + * @var callable Callback is called with one argument, the instance of + * WP_Customize_Section, and returns bool to indicate whether + * the section is active (such as it relates to the URL currently + * being previewed). + */ + public $active_callback = ''; + + /** + * Show the description or hide it behind the help icon. + * + * @since 4.7.0 + * + * @var bool Indicates whether the Section's description should be + * hidden behind a help icon ("?") in the Section header, + * similar to how help icons are displayed on Panels. + */ + public $description_hidden = false; + + /** + * Constructor. + * + * Any supplied $args override class property defaults. + * + * @since 3.4.0 + * + * @param WP_Customize_Manager $manager Customizer bootstrap instance. + * @param string $id A specific ID of the section. + * @param array $args { + * Optional. Array of properties for the new Section object. Default empty array. + * + * @type int $priority Priority of the section, defining the display order + * of panels and sections. Default 160. + * @type string $panel The panel this section belongs to (if any). + * Default empty. + * @type string $capability Capability required for the section. + * Default 'edit_theme_options' + * @type string|string[] $theme_supports Theme features required to support the section. + * @type string $title Title of the section to show in UI. + * @type string $description Description to show in the UI. + * @type string $type Type of the section. + * @type callable $active_callback Active callback. + * @type bool $description_hidden Hide the description behind a help icon, + * instead of inline above the first control. + * Default false. + * } + */ + public function __construct( $manager, $id, $args = array() ) { + $keys = array_keys( get_object_vars( $this ) ); + foreach ( $keys as $key ) { + if ( isset( $args[ $key ] ) ) { + $this->$key = $args[ $key ]; + } + } + + $this->manager = $manager; + $this->id = $id; + if ( empty( $this->active_callback ) ) { + $this->active_callback = array( $this, 'active_callback' ); + } + self::$instance_count += 1; + $this->instance_number = self::$instance_count; + + $this->controls = array(); // Users cannot customize the $controls array. + } + + /** + * Check whether section is active to current Customizer preview. + * + * @since 4.1.0 + * + * @return bool Whether the section is active to the current preview. + */ + final public function active() { + $section = $this; + $active = call_user_func( $this->active_callback, $this ); + + /** + * Filters response of WP_Customize_Section::active(). + * + * @since 4.1.0 + * + * @param bool $active Whether the Customizer section is active. + * @param WP_Customize_Section $section WP_Customize_Section instance. + */ + $active = apply_filters( 'customize_section_active', $active, $section ); + + return $active; + } + + /** + * Default callback used when invoking WP_Customize_Section::active(). + * + * Subclasses can override this with their specific logic, or they may provide + * an 'active_callback' argument to the constructor. + * + * @since 4.1.0 + * + * @return true Always true. + */ + public function active_callback() { + return true; + } + + /** + * Gather the parameters passed to client JavaScript via JSON. + * + * @since 4.1.0 + * + * @return array The array to be exported to the client as JSON. + */ + public function json() { + $array = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'panel', 'type', 'description_hidden' ) ); + $array['title'] = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) ); + $array['content'] = $this->get_content(); + $array['active'] = $this->active(); + $array['instanceNumber'] = $this->instance_number; + + if ( $this->panel ) { + /* translators: ▸ is the unicode right-pointing triangle. %s: Section title in the Customizer. */ + $array['customizeAction'] = sprintf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( $this->panel )->title ) ); + } else { + $array['customizeAction'] = __( 'Customizing' ); + } + + return $array; + } + + /** + * Checks required user capabilities and whether the theme has the + * feature support required by the section. + * + * @since 3.4.0 + * + * @return bool False if theme doesn't support the section or user doesn't have the capability. + */ + final public function check_capabilities() { + if ( $this->capability && ! current_user_can( $this->capability ) ) { + return false; + } + + if ( $this->theme_supports && ! current_theme_supports( ... (array) $this->theme_supports ) ) { + return false; + } + + return true; + } + + /** + * Get the section's content for insertion into the Customizer pane. + * + * @since 4.1.0 + * + * @return string Contents of the section. + */ + final public function get_content() { + ob_start(); + $this->maybe_render(); + return trim( ob_get_clean() ); + } + + /** + * Check capabilities and render the section. + * + * @since 3.4.0 + */ + final public function maybe_render() { + if ( ! $this->check_capabilities() ) { + return; + } + + /** + * Fires before rendering a Customizer section. + * + * @since 3.4.0 + * + * @param WP_Customize_Section $this WP_Customize_Section instance. + */ + do_action( 'customize_render_section', $this ); + /** + * Fires before rendering a specific Customizer section. + * + * The dynamic portion of the hook name, `$this->id`, refers to the ID + * of the specific Customizer section to be rendered. + * + * @since 3.4.0 + */ + do_action( "customize_render_section_{$this->id}" ); + + $this->render(); + } + + /** + * Render the section UI in a subclass. + * + * Sections are now rendered in JS by default, see WP_Customize_Section::print_template(). + * + * @since 3.4.0 + */ + protected function render() {} + + /** + * Render the section's JS template. + * + * This function is only run for section types that have been registered with + * WP_Customize_Manager::register_section_type(). + * + * @since 4.3.0 + * + * @see WP_Customize_Manager::render_template() + */ + public function print_template() { + ?> + <script type="text/html" id="tmpl-customize-section-<?php echo $this->type; ?>"> + <?php $this->render_template(); ?> + </script> + <?php + } + + /** + * An Underscore (JS) template for rendering this section. + * + * Class variables for this section class are available in the `data` JS object; + * export custom variables by overriding WP_Customize_Section::json(). + * + * @since 4.3.0 + * + * @see WP_Customize_Section::print_template() + */ + protected function render_template() { + ?> + <li id="accordion-section-{{ data.id }}" class="accordion-section control-section control-section-{{ data.type }}"> + <h3 class="accordion-section-title" tabindex="0"> + {{ data.title }} + <span class="screen-reader-text"><?php _e( 'Press return or enter to open this section' ); ?></span> + </h3> + <ul class="accordion-section-content"> + <li class="customize-section-description-container section-meta <# if ( data.description_hidden ) { #>customize-info<# } #>"> + <div class="customize-section-title"> + <button class="customize-section-back" tabindex="-1"> + <span class="screen-reader-text"><?php _e( 'Back' ); ?></span> + </button> + <h3> + <span class="customize-action"> + {{{ data.customizeAction }}} + </span> + {{ data.title }} + </h3> + <# if ( data.description && data.description_hidden ) { #> + <button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button> + <div class="description customize-section-description"> + {{{ data.description }}} + </div> + <# } #> + + <div class="customize-control-notifications-container"></div> + </div> + + <# if ( data.description && ! data.description_hidden ) { #> + <div class="description customize-section-description"> + {{{ data.description }}} + </div> + <# } #> + </li> + </ul> + </li> + <?php + } +} + +/** WP_Customize_Themes_Section class */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-themes-section.php'; + +/** WP_Customize_Sidebar_Section class */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-sidebar-section.php'; + +/** WP_Customize_Nav_Menu_Section class */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-section.php'; diff --git a/wp-includes/class-wp-customize-setting.php b/wp-includes/class-wp-customize-setting.php new file mode 100644 index 0000000..33a7320 --- /dev/null +++ b/wp-includes/class-wp-customize-setting.php @@ -0,0 +1,982 @@ +<?php +/** + * WordPress Customize Setting classes + * + * @package WordPress + * @subpackage Customize + * @since 3.4.0 + */ + +/** + * Customize Setting class. + * + * Handles saving and sanitizing of settings. + * + * @since 3.4.0 + * @link https://developer.wordpress.org/themes/customize-api + * + * @see WP_Customize_Manager + */ +class WP_Customize_Setting { + /** + * Customizer bootstrap instance. + * + * @since 3.4.0 + * @var WP_Customize_Manager + */ + public $manager; + + /** + * Unique string identifier for the setting. + * + * @since 3.4.0 + * @var string + */ + public $id; + + /** + * Type of customize settings. + * + * @since 3.4.0 + * @var string + */ + public $type = 'theme_mod'; + + /** + * Capability required to edit this setting. + * + * @since 3.4.0 + * @var string|array + */ + public $capability = 'edit_theme_options'; + + /** + * Theme features required to support the setting. + * + * @since 3.4.0 + * @var string|string[] + */ + public $theme_supports = ''; + + /** + * The default value for the setting. + * + * @since 3.4.0 + * @var string + */ + public $default = ''; + + /** + * Options for rendering the live preview of changes in Customizer. + * + * Set this value to 'postMessage' to enable a custom JavaScript handler to render changes to this setting + * as opposed to reloading the whole page. + * + * @since 3.4.0 + * @var string + */ + public $transport = 'refresh'; + + /** + * Server-side validation callback for the setting's value. + * + * @since 4.6.0 + * @var callable + */ + public $validate_callback = ''; + + /** + * Callback to filter a Customize setting value in un-slashed form. + * + * @since 3.4.0 + * @var callable + */ + public $sanitize_callback = ''; + + /** + * Callback to convert a Customize PHP setting value to a value that is JSON serializable. + * + * @since 3.4.0 + * @var string + */ + public $sanitize_js_callback = ''; + + /** + * Whether or not the setting is initially dirty when created. + * + * This is used to ensure that a setting will be sent from the pane to the + * preview when loading the Customizer. Normally a setting only is synced to + * the preview if it has been changed. This allows the setting to be sent + * from the start. + * + * @since 4.2.0 + * @var bool + */ + public $dirty = false; + + /** + * ID Data. + * + * @since 3.4.0 + * @var array + */ + protected $id_data = array(); + + /** + * Whether or not preview() was called. + * + * @since 4.4.0 + * @var bool + */ + protected $is_previewed = false; + + /** + * Cache of multidimensional values to improve performance. + * + * @since 4.4.0 + * @var array + */ + protected static $aggregated_multidimensionals = array(); + + /** + * Whether the multidimensional setting is aggregated. + * + * @since 4.4.0 + * @var bool + */ + protected $is_multidimensional_aggregated = false; + + /** + * Constructor. + * + * Any supplied $args override class property defaults. + * + * @since 3.4.0 + * + * @param WP_Customize_Manager $manager Customizer bootstrap instance. + * @param string $id A specific ID of the setting. + * Can be a theme mod or option name. + * @param array $args { + * Optional. Array of properties for the new Setting object. Default empty array. + * + * @type string $type Type of the setting. Default 'theme_mod'. + * @type string $capability Capability required for the setting. Default 'edit_theme_options' + * @type string|string[] $theme_supports Theme features required to support the panel. Default is none. + * @type string $default Default value for the setting. Default is empty string. + * @type string $transport Options for rendering the live preview of changes in Customizer. + * Using 'refresh' makes the change visible by reloading the whole preview. + * Using 'postMessage' allows a custom JavaScript to handle live changes. + * Default is 'refresh'. + * @type callable $validate_callback Server-side validation callback for the setting's value. + * @type callable $sanitize_callback Callback to filter a Customize setting value in un-slashed form. + * @type callable $sanitize_js_callback Callback to convert a Customize PHP setting value to a value that is + * JSON serializable. + * @type bool $dirty Whether or not the setting is initially dirty when created. + * } + */ + public function __construct( $manager, $id, $args = array() ) { + $keys = array_keys( get_object_vars( $this ) ); + foreach ( $keys as $key ) { + if ( isset( $args[ $key ] ) ) { + $this->$key = $args[ $key ]; + } + } + + $this->manager = $manager; + $this->id = $id; + + // Parse the ID for array keys. + $this->id_data['keys'] = preg_split( '/\[/', str_replace( ']', '', $this->id ) ); + $this->id_data['base'] = array_shift( $this->id_data['keys'] ); + + // Rebuild the ID. + $this->id = $this->id_data['base']; + if ( ! empty( $this->id_data['keys'] ) ) { + $this->id .= '[' . implode( '][', $this->id_data['keys'] ) . ']'; + } + + if ( $this->validate_callback ) { + add_filter( "customize_validate_{$this->id}", $this->validate_callback, 10, 3 ); + } + if ( $this->sanitize_callback ) { + add_filter( "customize_sanitize_{$this->id}", $this->sanitize_callback, 10, 2 ); + } + if ( $this->sanitize_js_callback ) { + add_filter( "customize_sanitize_js_{$this->id}", $this->sanitize_js_callback, 10, 2 ); + } + + if ( 'option' === $this->type || 'theme_mod' === $this->type ) { + // Other setting types can opt-in to aggregate multidimensional explicitly. + $this->aggregate_multidimensional(); + + // Allow option settings to indicate whether they should be autoloaded. + if ( 'option' === $this->type && isset( $args['autoload'] ) ) { + self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] = $args['autoload']; + } + } + } + + /** + * Get parsed ID data for multidimensional setting. + * + * @since 4.4.0 + * + * @return array { + * ID data for multidimensional setting. + * + * @type string $base ID base + * @type array $keys Keys for multidimensional array. + * } + */ + final public function id_data() { + return $this->id_data; + } + + /** + * Set up the setting for aggregated multidimensional values. + * + * When a multidimensional setting gets aggregated, all of its preview and update + * calls get combined into one call, greatly improving performance. + * + * @since 4.4.0 + */ + protected function aggregate_multidimensional() { + $id_base = $this->id_data['base']; + if ( ! isset( self::$aggregated_multidimensionals[ $this->type ] ) ) { + self::$aggregated_multidimensionals[ $this->type ] = array(); + } + if ( ! isset( self::$aggregated_multidimensionals[ $this->type ][ $id_base ] ) ) { + self::$aggregated_multidimensionals[ $this->type ][ $id_base ] = array( + 'previewed_instances' => array(), // Calling preview() will add the $setting to the array. + 'preview_applied_instances' => array(), // Flags for which settings have had their values applied. + 'root_value' => $this->get_root_value( array() ), // Root value for initial state, manipulated by preview and update calls. + ); + } + + if ( ! empty( $this->id_data['keys'] ) ) { + // Note the preview-applied flag is cleared at priority 9 to ensure it is cleared before a deferred-preview runs. + add_action( "customize_post_value_set_{$this->id}", array( $this, '_clear_aggregated_multidimensional_preview_applied_flag' ), 9 ); + $this->is_multidimensional_aggregated = true; + } + } + + /** + * Reset `$aggregated_multidimensionals` static variable. + * + * This is intended only for use by unit tests. + * + * @since 4.5.0 + * @ignore + */ + static public function reset_aggregated_multidimensionals() { + self::$aggregated_multidimensionals = array(); + } + + /** + * The ID for the current site when the preview() method was called. + * + * @since 4.2.0 + * @var int + */ + protected $_previewed_blog_id; + + /** + * Return true if the current site is not the same as the previewed site. + * + * @since 4.2.0 + * + * @return bool If preview() has been called. + */ + public function is_current_blog_previewed() { + if ( ! isset( $this->_previewed_blog_id ) ) { + return false; + } + return ( get_current_blog_id() === $this->_previewed_blog_id ); + } + + /** + * Original non-previewed value stored by the preview method. + * + * @see WP_Customize_Setting::preview() + * @since 4.1.1 + * @var mixed + */ + protected $_original_value; + + /** + * Add filters to supply the setting's value when accessed. + * + * If the setting already has a pre-existing value and there is no incoming + * post value for the setting, then this method will short-circuit since + * there is no change to preview. + * + * @since 3.4.0 + * @since 4.4.0 Added boolean return value. + * + * @return bool False when preview short-circuits due no change needing to be previewed. + */ + public function preview() { + if ( ! isset( $this->_previewed_blog_id ) ) { + $this->_previewed_blog_id = get_current_blog_id(); + } + + // Prevent re-previewing an already-previewed setting. + if ( $this->is_previewed ) { + return true; + } + + $id_base = $this->id_data['base']; + $is_multidimensional = ! empty( $this->id_data['keys'] ); + $multidimensional_filter = array( $this, '_multidimensional_preview_filter' ); + + /* + * Check if the setting has a pre-existing value (an isset check), + * and if doesn't have any incoming post value. If both checks are true, + * then the preview short-circuits because there is nothing that needs + * to be previewed. + */ + $undefined = new stdClass(); + $needs_preview = ( $undefined !== $this->post_value( $undefined ) ); + $value = null; + + // Since no post value was defined, check if we have an initial value set. + if ( ! $needs_preview ) { + if ( $this->is_multidimensional_aggregated ) { + $root = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; + $value = $this->multidimensional_get( $root, $this->id_data['keys'], $undefined ); + } else { + $default = $this->default; + $this->default = $undefined; // Temporarily set default to undefined so we can detect if existing value is set. + $value = $this->value(); + $this->default = $default; + } + $needs_preview = ( $undefined === $value ); // Because the default needs to be supplied. + } + + // If the setting does not need previewing now, defer to when it has a value to preview. + if ( ! $needs_preview ) { + if ( ! has_action( "customize_post_value_set_{$this->id}", array( $this, 'preview' ) ) ) { + add_action( "customize_post_value_set_{$this->id}", array( $this, 'preview' ) ); + } + return false; + } + + switch ( $this->type ) { + case 'theme_mod': + if ( ! $is_multidimensional ) { + add_filter( "theme_mod_{$id_base}", array( $this, '_preview_filter' ) ); + } else { + if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) { + // Only add this filter once for this ID base. + add_filter( "theme_mod_{$id_base}", $multidimensional_filter ); + } + self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'][ $this->id ] = $this; + } + break; + case 'option': + if ( ! $is_multidimensional ) { + add_filter( "pre_option_{$id_base}", array( $this, '_preview_filter' ) ); + } else { + if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) { + // Only add these filters once for this ID base. + add_filter( "option_{$id_base}", $multidimensional_filter ); + add_filter( "default_option_{$id_base}", $multidimensional_filter ); + } + self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'][ $this->id ] = $this; + } + break; + default: + /** + * Fires when the WP_Customize_Setting::preview() method is called for settings + * not handled as theme_mods or options. + * + * The dynamic portion of the hook name, `$this->id`, refers to the setting ID. + * + * @since 3.4.0 + * + * @param WP_Customize_Setting $this WP_Customize_Setting instance. + */ + do_action( "customize_preview_{$this->id}", $this ); + + /** + * Fires when the WP_Customize_Setting::preview() method is called for settings + * not handled as theme_mods or options. + * + * The dynamic portion of the hook name, `$this->type`, refers to the setting type. + * + * @since 4.1.0 + * + * @param WP_Customize_Setting $this WP_Customize_Setting instance. + */ + do_action( "customize_preview_{$this->type}", $this ); + } + + $this->is_previewed = true; + + return true; + } + + /** + * Clear out the previewed-applied flag for a multidimensional-aggregated value whenever its post value is updated. + * + * This ensures that the new value will get sanitized and used the next time + * that `WP_Customize_Setting::_multidimensional_preview_filter()` + * is called for this setting. + * + * @since 4.4.0 + * + * @see WP_Customize_Manager::set_post_value() + * @see WP_Customize_Setting::_multidimensional_preview_filter() + */ + final public function _clear_aggregated_multidimensional_preview_applied_flag() { + unset( self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['preview_applied_instances'][ $this->id ] ); + } + + /** + * Callback function to filter non-multidimensional theme mods and options. + * + * If switch_to_blog() was called after the preview() method, and the current + * site is now not the same site, then this method does a no-op and returns + * the original value. + * + * @since 3.4.0 + * + * @param mixed $original Old value. + * @return mixed New or old value. + */ + public function _preview_filter( $original ) { + if ( ! $this->is_current_blog_previewed() ) { + return $original; + } + + $undefined = new stdClass(); // Symbol hack. + $post_value = $this->post_value( $undefined ); + if ( $undefined !== $post_value ) { + $value = $post_value; + } else { + /* + * Note that we don't use $original here because preview() will + * not add the filter in the first place if it has an initial value + * and there is no post value. + */ + $value = $this->default; + } + return $value; + } + + /** + * Callback function to filter multidimensional theme mods and options. + * + * For all multidimensional settings of a given type, the preview filter for + * the first setting previewed will be used to apply the values for the others. + * + * @since 4.4.0 + * + * @see WP_Customize_Setting::$aggregated_multidimensionals + * @param mixed $original Original root value. + * @return mixed New or old value. + */ + final public function _multidimensional_preview_filter( $original ) { + if ( ! $this->is_current_blog_previewed() ) { + return $original; + } + + $id_base = $this->id_data['base']; + + // If no settings have been previewed yet (which should not be the case, since $this is), just pass through the original value. + if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) { + return $original; + } + + foreach ( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] as $previewed_setting ) { + // Skip applying previewed value for any settings that have already been applied. + if ( ! empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] ) ) { + continue; + } + + // Do the replacements of the posted/default sub value into the root value. + $value = $previewed_setting->post_value( $previewed_setting->default ); + $root = self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value']; + $root = $previewed_setting->multidimensional_replace( $root, $previewed_setting->id_data['keys'], $value ); + self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value'] = $root; + + // Mark this setting having been applied so that it will be skipped when the filter is called again. + self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] = true; + } + + return self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; + } + + /** + * Checks user capabilities and theme supports, and then saves + * the value of the setting. + * + * @since 3.4.0 + * + * @return void|false False if cap check fails or value isn't set or is invalid. + */ + final public function save() { + $value = $this->post_value(); + + if ( ! $this->check_capabilities() || ! isset( $value ) ) { + return false; + } + + $id_base = $this->id_data['base']; + + /** + * Fires when the WP_Customize_Setting::save() method is called. + * + * The dynamic portion of the hook name, `$id_base` refers to + * the base slug of the setting name. + * + * @since 3.4.0 + * + * @param WP_Customize_Setting $this WP_Customize_Setting instance. + */ + do_action( "customize_save_{$id_base}", $this ); + + $this->update( $value ); + } + + /** + * Fetch and sanitize the $_POST value for the setting. + * + * During a save request prior to save, post_value() provides the new value while value() does not. + * + * @since 3.4.0 + * + * @param mixed $default A default value which is used as a fallback. Default is null. + * @return mixed The default value on failure, otherwise the sanitized and validated value. + */ + final public function post_value( $default = null ) { + return $this->manager->post_value( $this, $default ); + } + + /** + * Sanitize an input. + * + * @since 3.4.0 + * + * @param string|array $value The value to sanitize. + * @return string|array|null|WP_Error Sanitized value, or `null`/`WP_Error` if invalid. + */ + public function sanitize( $value ) { + + /** + * Filters a Customize setting value in un-slashed form. + * + * @since 3.4.0 + * + * @param mixed $value Value of the setting. + * @param WP_Customize_Setting $this WP_Customize_Setting instance. + */ + return apply_filters( "customize_sanitize_{$this->id}", $value, $this ); + } + + /** + * Validates an input. + * + * @since 4.6.0 + * + * @see WP_REST_Request::has_valid_params() + * + * @param mixed $value Value to validate. + * @return true|WP_Error True if the input was validated, otherwise WP_Error. + */ + public function validate( $value ) { + if ( is_wp_error( $value ) ) { + return $value; + } + if ( is_null( $value ) ) { + return new WP_Error( 'invalid_value', __( 'Invalid value.' ) ); + } + + $validity = new WP_Error(); + + /** + * Validates a Customize setting value. + * + * Plugins should amend the `$validity` object via its `WP_Error::add()` method. + * + * The dynamic portion of the hook name, `$this->ID`, refers to the setting ID. + * + * @since 4.6.0 + * + * @param WP_Error $validity Filtered from `true` to `WP_Error` when invalid. + * @param mixed $value Value of the setting. + * @param WP_Customize_Setting $this WP_Customize_Setting instance. + */ + $validity = apply_filters( "customize_validate_{$this->id}", $validity, $value, $this ); + + if ( is_wp_error( $validity ) && ! $validity->has_errors() ) { + $validity = true; + } + return $validity; + } + + /** + * Get the root value for a setting, especially for multidimensional ones. + * + * @since 4.4.0 + * + * @param mixed $default Value to return if root does not exist. + * @return mixed + */ + protected function get_root_value( $default = null ) { + $id_base = $this->id_data['base']; + if ( 'option' === $this->type ) { + return get_option( $id_base, $default ); + } elseif ( 'theme_mod' === $this->type ) { + return get_theme_mod( $id_base, $default ); + } else { + /* + * Any WP_Customize_Setting subclass implementing aggregate multidimensional + * will need to override this method to obtain the data from the appropriate + * location. + */ + return $default; + } + } + + /** + * Set the root value for a setting, especially for multidimensional ones. + * + * @since 4.4.0 + * + * @param mixed $value Value to set as root of multidimensional setting. + * @return bool Whether the multidimensional root was updated successfully. + */ + protected function set_root_value( $value ) { + $id_base = $this->id_data['base']; + if ( 'option' === $this->type ) { + $autoload = true; + if ( isset( self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] ) ) { + $autoload = self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload']; + } + return update_option( $id_base, $value, $autoload ); + } elseif ( 'theme_mod' === $this->type ) { + set_theme_mod( $id_base, $value ); + return true; + } else { + /* + * Any WP_Customize_Setting subclass implementing aggregate multidimensional + * will need to override this method to obtain the data from the appropriate + * location. + */ + return false; + } + } + + /** + * Save the value of the setting, using the related API. + * + * @since 3.4.0 + * + * @param mixed $value The value to update. + * @return bool The result of saving the value. + */ + protected function update( $value ) { + $id_base = $this->id_data['base']; + if ( 'option' === $this->type || 'theme_mod' === $this->type ) { + if ( ! $this->is_multidimensional_aggregated ) { + return $this->set_root_value( $value ); + } else { + $root = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; + $root = $this->multidimensional_replace( $root, $this->id_data['keys'], $value ); + self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value'] = $root; + return $this->set_root_value( $root ); + } + } else { + /** + * Fires when the WP_Customize_Setting::update() method is called for settings + * not handled as theme_mods or options. + * + * The dynamic portion of the hook name, `$this->type`, refers to the type of setting. + * + * @since 3.4.0 + * + * @param mixed $value Value of the setting. + * @param WP_Customize_Setting $this WP_Customize_Setting instance. + */ + do_action( "customize_update_{$this->type}", $value, $this ); + + return has_action( "customize_update_{$this->type}" ); + } + } + + /** + * Deprecated method. + * + * @since 3.4.0 + * @deprecated 4.4.0 Deprecated in favor of update() method. + */ + protected function _update_theme_mod() { + _deprecated_function( __METHOD__, '4.4.0', __CLASS__ . '::update()' ); + } + + /** + * Deprecated method. + * + * @since 3.4.0 + * @deprecated 4.4.0 Deprecated in favor of update() method. + */ + protected function _update_option() { + _deprecated_function( __METHOD__, '4.4.0', __CLASS__ . '::update()' ); + } + + /** + * Fetch the value of the setting. + * + * @since 3.4.0 + * + * @return mixed The value. + */ + public function value() { + $id_base = $this->id_data['base']; + $is_core_type = ( 'option' === $this->type || 'theme_mod' === $this->type ); + + if ( ! $is_core_type && ! $this->is_multidimensional_aggregated ) { + + // Use post value if previewed and a post value is present. + if ( $this->is_previewed ) { + $value = $this->post_value( null ); + if ( null !== $value ) { + return $value; + } + } + + $value = $this->get_root_value( $this->default ); + + /** + * Filters a Customize setting value not handled as a theme_mod or option. + * + * The dynamic portion of the hook name, `$id_base`, refers to + * the base slug of the setting name, initialized from `$this->id_data['base']`. + * + * For settings handled as theme_mods or options, see those corresponding + * functions for available hooks. + * + * @since 3.4.0 + * @since 4.6.0 Added the `$this` setting instance as the second parameter. + * + * @param mixed $default The setting default value. Default empty. + * @param WP_Customize_Setting $this The setting instance. + */ + $value = apply_filters( "customize_value_{$id_base}", $value, $this ); + } elseif ( $this->is_multidimensional_aggregated ) { + $root_value = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; + $value = $this->multidimensional_get( $root_value, $this->id_data['keys'], $this->default ); + + // Ensure that the post value is used if the setting is previewed, since preview filters aren't applying on cached $root_value. + if ( $this->is_previewed ) { + $value = $this->post_value( $value ); + } + } else { + $value = $this->get_root_value( $this->default ); + } + return $value; + } + + /** + * Sanitize the setting's value for use in JavaScript. + * + * @since 3.4.0 + * + * @return mixed The requested escaped value. + */ + public function js_value() { + + /** + * Filters a Customize setting value for use in JavaScript. + * + * The dynamic portion of the hook name, `$this->id`, refers to the setting ID. + * + * @since 3.4.0 + * + * @param mixed $value The setting value. + * @param WP_Customize_Setting $this WP_Customize_Setting instance. + */ + $value = apply_filters( "customize_sanitize_js_{$this->id}", $this->value(), $this ); + + if ( is_string( $value ) ) { + return html_entity_decode( $value, ENT_QUOTES, 'UTF-8' ); + } + + return $value; + } + + /** + * Retrieves the data to export to the client via JSON. + * + * @since 4.6.0 + * + * @return array Array of parameters passed to JavaScript. + */ + public function json() { + return array( + 'value' => $this->js_value(), + 'transport' => $this->transport, + 'dirty' => $this->dirty, + 'type' => $this->type, + ); + } + + /** + * Validate user capabilities whether the theme supports the setting. + * + * @since 3.4.0 + * + * @return bool False if theme doesn't support the setting or user can't change setting, otherwise true. + */ + final public function check_capabilities() { + if ( $this->capability && ! current_user_can( $this->capability ) ) { + return false; + } + + if ( $this->theme_supports && ! current_theme_supports( ... (array) $this->theme_supports ) ) { + return false; + } + + return true; + } + + /** + * Multidimensional helper function. + * + * @since 3.4.0 + * + * @param $root + * @param $keys + * @param bool $create Default is false. + * @return array|void Keys are 'root', 'node', and 'key'. + */ + final protected function multidimensional( &$root, $keys, $create = false ) { + if ( $create && empty( $root ) ) { + $root = array(); + } + + if ( ! isset( $root ) || empty( $keys ) ) { + return; + } + + $last = array_pop( $keys ); + $node = &$root; + + foreach ( $keys as $key ) { + if ( $create && ! isset( $node[ $key ] ) ) { + $node[ $key ] = array(); + } + + if ( ! is_array( $node ) || ! isset( $node[ $key ] ) ) { + return; + } + + $node = &$node[ $key ]; + } + + if ( $create ) { + if ( ! is_array( $node ) ) { + // Account for an array overriding a string or object value. + $node = array(); + } + if ( ! isset( $node[ $last ] ) ) { + $node[ $last ] = array(); + } + } + + if ( ! isset( $node[ $last ] ) ) { + return; + } + + return array( + 'root' => &$root, + 'node' => &$node, + 'key' => $last, + ); + } + + /** + * Will attempt to replace a specific value in a multidimensional array. + * + * @since 3.4.0 + * + * @param $root + * @param $keys + * @param mixed $value The value to update. + * @return mixed + */ + final protected function multidimensional_replace( $root, $keys, $value ) { + if ( ! isset( $value ) ) { + return $root; + } elseif ( empty( $keys ) ) { // If there are no keys, we're replacing the root. + return $value; + } + + $result = $this->multidimensional( $root, $keys, true ); + + if ( isset( $result ) ) { + $result['node'][ $result['key'] ] = $value; + } + + return $root; + } + + /** + * Will attempt to fetch a specific value from a multidimensional array. + * + * @since 3.4.0 + * + * @param $root + * @param $keys + * @param mixed $default A default value which is used as a fallback. Default is null. + * @return mixed The requested value or the default value. + */ + final protected function multidimensional_get( $root, $keys, $default = null ) { + if ( empty( $keys ) ) { // If there are no keys, test the root. + return isset( $root ) ? $root : $default; + } + + $result = $this->multidimensional( $root, $keys ); + return isset( $result ) ? $result['node'][ $result['key'] ] : $default; + } + + /** + * Will attempt to check if a specific value in a multidimensional array is set. + * + * @since 3.4.0 + * + * @param $root + * @param $keys + * @return bool True if value is set, false if not. + */ + final protected function multidimensional_isset( $root, $keys ) { + $result = $this->multidimensional_get( $root, $keys ); + return isset( $result ); + } +} + +/** + * WP_Customize_Filter_Setting class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-filter-setting.php'; + +/** + * WP_Customize_Header_Image_Setting class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-setting.php'; + +/** + * WP_Customize_Background_Image_Setting class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-setting.php'; + +/** + * WP_Customize_Nav_Menu_Item_Setting class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-setting.php'; + +/** + * WP_Customize_Nav_Menu_Setting class. + */ +require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-setting.php'; diff --git a/wp-includes/class-wp-customize-widgets.php b/wp-includes/class-wp-customize-widgets.php new file mode 100644 index 0000000..f30c56d --- /dev/null +++ b/wp-includes/class-wp-customize-widgets.php @@ -0,0 +1,2074 @@ +<?php +/** + * WordPress Customize Widgets classes + * + * @package WordPress + * @subpackage Customize + * @since 3.9.0 + */ + +/** + * Customize Widgets class. + * + * Implements widget management in the Customizer. + * + * @since 3.9.0 + * + * @see WP_Customize_Manager + */ +final class WP_Customize_Widgets { + + /** + * WP_Customize_Manager instance. + * + * @since 3.9.0 + * @var WP_Customize_Manager + */ + public $manager; + + /** + * All id_bases for widgets defined in core. + * + * @since 3.9.0 + * @var array + */ + protected $core_widget_id_bases = array( + 'archives', + 'calendar', + 'categories', + 'custom_html', + 'links', + 'media_audio', + 'media_image', + 'media_video', + 'meta', + 'nav_menu', + 'pages', + 'recent-comments', + 'recent-posts', + 'rss', + 'search', + 'tag_cloud', + 'text', + ); + + /** + * @since 3.9.0 + * @var array + */ + protected $rendered_sidebars = array(); + + /** + * @since 3.9.0 + * @var array + */ + protected $rendered_widgets = array(); + + /** + * @since 3.9.0 + * @var array + */ + protected $old_sidebars_widgets = array(); + + /** + * Mapping of widget ID base to whether it supports selective refresh. + * + * @since 4.5.0 + * @var array + */ + protected $selective_refreshable_widgets; + + /** + * Mapping of setting type to setting ID pattern. + * + * @since 4.2.0 + * @var array + */ + protected $setting_id_patterns = array( + 'widget_instance' => '/^widget_(?P<id_base>.+?)(?:\[(?P<widget_number>\d+)\])?$/', + 'sidebar_widgets' => '/^sidebars_widgets\[(?P<sidebar_id>.+?)\]$/', + ); + + /** + * Initial loader. + * + * @since 3.9.0 + * + * @param WP_Customize_Manager $manager Customizer bootstrap instance. + */ + public function __construct( $manager ) { + $this->manager = $manager; + + // See https://github.com/xwp/wp-customize-snapshots/blob/962586659688a5b1fd9ae93618b7ce2d4e7a421c/php/class-customize-snapshot-manager.php#L420-L449 + add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_customize_dynamic_setting_args' ), 10, 2 ); + add_action( 'widgets_init', array( $this, 'register_settings' ), 95 ); + add_action( 'customize_register', array( $this, 'schedule_customize_register' ), 1 ); + + // Skip remaining hooks when the user can't manage widgets anyway. + if ( ! current_user_can( 'edit_theme_options' ) ) { + return; + } + + add_action( 'wp_loaded', array( $this, 'override_sidebars_widgets_for_theme_switch' ) ); + add_action( 'customize_controls_init', array( $this, 'customize_controls_init' ) ); + add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); + add_action( 'customize_controls_print_styles', array( $this, 'print_styles' ) ); + add_action( 'customize_controls_print_scripts', array( $this, 'print_scripts' ) ); + add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_footer_scripts' ) ); + add_action( 'customize_controls_print_footer_scripts', array( $this, 'output_widget_control_templates' ) ); + add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) ); + add_filter( 'customize_refresh_nonces', array( $this, 'refresh_nonces' ) ); + + add_action( 'dynamic_sidebar', array( $this, 'tally_rendered_widgets' ) ); + add_filter( 'is_active_sidebar', array( $this, 'tally_sidebars_via_is_active_sidebar_calls' ), 10, 2 ); + add_filter( 'dynamic_sidebar_has_widgets', array( $this, 'tally_sidebars_via_dynamic_sidebar_calls' ), 10, 2 ); + + // Selective Refresh. + add_filter( 'customize_dynamic_partial_args', array( $this, 'customize_dynamic_partial_args' ), 10, 2 ); + add_action( 'customize_preview_init', array( $this, 'selective_refresh_init' ) ); + } + + /** + * List whether each registered widget can be use selective refresh. + * + * If the theme does not support the customize-selective-refresh-widgets feature, + * then this will always return an empty array. + * + * @since 4.5.0 + * + * @global WP_Widget_Factory $wp_widget_factory + * + * @return array Mapping of id_base to support. If theme doesn't support + * selective refresh, an empty array is returned. + */ + public function get_selective_refreshable_widgets() { + global $wp_widget_factory; + if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) { + return array(); + } + if ( ! isset( $this->selective_refreshable_widgets ) ) { + $this->selective_refreshable_widgets = array(); + foreach ( $wp_widget_factory->widgets as $wp_widget ) { + $this->selective_refreshable_widgets[ $wp_widget->id_base ] = ! empty( $wp_widget->widget_options['customize_selective_refresh'] ); + } + } + return $this->selective_refreshable_widgets; + } + + /** + * Determines if a widget supports selective refresh. + * + * @since 4.5.0 + * + * @param string $id_base Widget ID Base. + * @return bool Whether the widget can be selective refreshed. + */ + public function is_widget_selective_refreshable( $id_base ) { + $selective_refreshable_widgets = $this->get_selective_refreshable_widgets(); + return ! empty( $selective_refreshable_widgets[ $id_base ] ); + } + + /** + * Retrieves the widget setting type given a setting ID. + * + * @since 4.2.0 + * + * @staticvar array $cache + * + * @param string $setting_id Setting ID. + * @return string|void Setting type. + */ + protected function get_setting_type( $setting_id ) { + static $cache = array(); + if ( isset( $cache[ $setting_id ] ) ) { + return $cache[ $setting_id ]; + } + foreach ( $this->setting_id_patterns as $type => $pattern ) { + if ( preg_match( $pattern, $setting_id ) ) { + $cache[ $setting_id ] = $type; + return $type; + } + } + } + + /** + * Inspects the incoming customized data for any widget settings, and dynamically adds + * them up-front so widgets will be initialized properly. + * + * @since 4.2.0 + */ + public function register_settings() { + $widget_setting_ids = array(); + $incoming_setting_ids = array_keys( $this->manager->unsanitized_post_values() ); + foreach ( $incoming_setting_ids as $setting_id ) { + if ( ! is_null( $this->get_setting_type( $setting_id ) ) ) { + $widget_setting_ids[] = $setting_id; + } + } + if ( $this->manager->doing_ajax( 'update-widget' ) && isset( $_REQUEST['widget-id'] ) ) { + $widget_setting_ids[] = $this->get_setting_id( wp_unslash( $_REQUEST['widget-id'] ) ); + } + + $settings = $this->manager->add_dynamic_settings( array_unique( $widget_setting_ids ) ); + + if ( $this->manager->settings_previewed() ) { + foreach ( $settings as $setting ) { + $setting->preview(); + } + } + } + + /** + * Determines the arguments for a dynamically-created setting. + * + * @since 4.2.0 + * + * @param false|array $args The arguments to the WP_Customize_Setting constructor. + * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. + * @return array|false Setting arguments, false otherwise. + */ + public function filter_customize_dynamic_setting_args( $args, $setting_id ) { + if ( $this->get_setting_type( $setting_id ) ) { + $args = $this->get_setting_args( $setting_id ); + } + return $args; + } + + /** + * Retrieves an unslashed post value or return a default. + * + * @since 3.9.0 + * + * @param string $name Post value. + * @param mixed $default Default post value. + * @return mixed Unslashed post value or default value. + */ + protected function get_post_value( $name, $default = null ) { + if ( ! isset( $_POST[ $name ] ) ) { + return $default; + } + + return wp_unslash( $_POST[ $name ] ); + } + + /** + * Override sidebars_widgets for theme switch. + * + * When switching a theme via the Customizer, supply any previously-configured + * sidebars_widgets from the target theme as the initial sidebars_widgets + * setting. Also store the old theme's existing settings so that they can + * be passed along for storing in the sidebars_widgets theme_mod when the + * theme gets switched. + * + * @since 3.9.0 + * + * @global array $sidebars_widgets + * @global array $_wp_sidebars_widgets + */ + public function override_sidebars_widgets_for_theme_switch() { + global $sidebars_widgets; + + if ( $this->manager->doing_ajax() || $this->manager->is_theme_active() ) { + return; + } + + $this->old_sidebars_widgets = wp_get_sidebars_widgets(); + add_filter( 'customize_value_old_sidebars_widgets_data', array( $this, 'filter_customize_value_old_sidebars_widgets_data' ) ); + $this->manager->set_post_value( 'old_sidebars_widgets_data', $this->old_sidebars_widgets ); // Override any value cached in changeset. + + // retrieve_widgets() looks at the global $sidebars_widgets. + $sidebars_widgets = $this->old_sidebars_widgets; + $sidebars_widgets = retrieve_widgets( 'customize' ); + add_filter( 'option_sidebars_widgets', array( $this, 'filter_option_sidebars_widgets_for_theme_switch' ), 1 ); + // Reset global cache var used by wp_get_sidebars_widgets(). + unset( $GLOBALS['_wp_sidebars_widgets'] ); + } + + /** + * Filters old_sidebars_widgets_data Customizer setting. + * + * When switching themes, filter the Customizer setting old_sidebars_widgets_data + * to supply initial $sidebars_widgets before they were overridden by retrieve_widgets(). + * The value for old_sidebars_widgets_data gets set in the old theme's sidebars_widgets + * theme_mod. + * + * @since 3.9.0 + * + * @see WP_Customize_Widgets::handle_theme_switch() + * + * @param array $old_sidebars_widgets + * @return array + */ + public function filter_customize_value_old_sidebars_widgets_data( $old_sidebars_widgets ) { + return $this->old_sidebars_widgets; + } + + /** + * Filters sidebars_widgets option for theme switch. + * + * When switching themes, the retrieve_widgets() function is run when the Customizer initializes, + * and then the new sidebars_widgets here get supplied as the default value for the sidebars_widgets + * option. + * + * @since 3.9.0 + * + * @see WP_Customize_Widgets::handle_theme_switch() + * @global array $sidebars_widgets + * + * @param array $sidebars_widgets + * @return array + */ + public function filter_option_sidebars_widgets_for_theme_switch( $sidebars_widgets ) { + $sidebars_widgets = $GLOBALS['sidebars_widgets']; + $sidebars_widgets['array_version'] = 3; + return $sidebars_widgets; + } + + /** + * Ensures all widgets get loaded into the Customizer. + * + * Note: these actions are also fired in wp_ajax_update_widget(). + * + * @since 3.9.0 + */ + public function customize_controls_init() { + /** This action is documented in wp-admin/includes/ajax-actions.php */ + do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /** This action is documented in wp-admin/includes/ajax-actions.php */ + do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /** This action is documented in wp-admin/widgets.php */ + do_action( 'sidebar_admin_setup' ); + } + + /** + * Ensures widgets are available for all types of previews. + * + * When in preview, hook to {@see 'customize_register'} for settings after WordPress is loaded + * so that all filters have been initialized (e.g. Widget Visibility). + * + * @since 3.9.0 + */ + public function schedule_customize_register() { + if ( is_admin() ) { + $this->customize_register(); + } else { + add_action( 'wp', array( $this, 'customize_register' ) ); + } + } + + /** + * Registers Customizer settings and controls for all sidebars and widgets. + * + * @since 3.9.0 + * + * @global array $wp_registered_widgets + * @global array $wp_registered_widget_controls + * @global array $wp_registered_sidebars + */ + public function customize_register() { + global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_sidebars; + + add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 ); + + $sidebars_widgets = array_merge( + array( 'wp_inactive_widgets' => array() ), + array_fill_keys( array_keys( $wp_registered_sidebars ), array() ), + wp_get_sidebars_widgets() + ); + + $new_setting_ids = array(); + + /* + * Register a setting for all widgets, including those which are active, + * inactive, and orphaned since a widget may get suppressed from a sidebar + * via a plugin (like Widget Visibility). + */ + foreach ( array_keys( $wp_registered_widgets ) as $widget_id ) { + $setting_id = $this->get_setting_id( $widget_id ); + $setting_args = $this->get_setting_args( $setting_id ); + if ( ! $this->manager->get_setting( $setting_id ) ) { + $this->manager->add_setting( $setting_id, $setting_args ); + } + $new_setting_ids[] = $setting_id; + } + + /* + * Add a setting which will be supplied for the theme's sidebars_widgets + * theme_mod when the theme is switched. + */ + if ( ! $this->manager->is_theme_active() ) { + $setting_id = 'old_sidebars_widgets_data'; + $setting_args = $this->get_setting_args( + $setting_id, + array( + 'type' => 'global_variable', + 'dirty' => true, + ) + ); + $this->manager->add_setting( $setting_id, $setting_args ); + } + + $this->manager->add_panel( + 'widgets', + array( + 'type' => 'widgets', + 'title' => __( 'Widgets' ), + 'description' => __( 'Widgets are independent sections of content that can be placed into widgetized areas provided by your theme (commonly called sidebars).' ), + 'priority' => 110, + 'active_callback' => array( $this, 'is_panel_active' ), + 'auto_expand_sole_section' => true, + ) + ); + + foreach ( $sidebars_widgets as $sidebar_id => $sidebar_widget_ids ) { + if ( empty( $sidebar_widget_ids ) ) { + $sidebar_widget_ids = array(); + } + + $is_registered_sidebar = is_registered_sidebar( $sidebar_id ); + $is_inactive_widgets = ( 'wp_inactive_widgets' === $sidebar_id ); + $is_active_sidebar = ( $is_registered_sidebar && ! $is_inactive_widgets ); + + // Add setting for managing the sidebar's widgets. + if ( $is_registered_sidebar || $is_inactive_widgets ) { + $setting_id = sprintf( 'sidebars_widgets[%s]', $sidebar_id ); + $setting_args = $this->get_setting_args( $setting_id ); + if ( ! $this->manager->get_setting( $setting_id ) ) { + if ( ! $this->manager->is_theme_active() ) { + $setting_args['dirty'] = true; + } + $this->manager->add_setting( $setting_id, $setting_args ); + } + $new_setting_ids[] = $setting_id; + + // Add section to contain controls. + $section_id = sprintf( 'sidebar-widgets-%s', $sidebar_id ); + if ( $is_active_sidebar ) { + + $section_args = array( + 'title' => $wp_registered_sidebars[ $sidebar_id ]['name'], + 'description' => $wp_registered_sidebars[ $sidebar_id ]['description'], + 'priority' => array_search( $sidebar_id, array_keys( $wp_registered_sidebars ) ), + 'panel' => 'widgets', + 'sidebar_id' => $sidebar_id, + ); + + /** + * Filters Customizer widget section arguments for a given sidebar. + * + * @since 3.9.0 + * + * @param array $section_args Array of Customizer widget section arguments. + * @param string $section_id Customizer section ID. + * @param int|string $sidebar_id Sidebar ID. + */ + $section_args = apply_filters( 'customizer_widgets_section_args', $section_args, $section_id, $sidebar_id ); + + $section = new WP_Customize_Sidebar_Section( $this->manager, $section_id, $section_args ); + $this->manager->add_section( $section ); + + $control = new WP_Widget_Area_Customize_Control( + $this->manager, + $setting_id, + array( + 'section' => $section_id, + 'sidebar_id' => $sidebar_id, + 'priority' => count( $sidebar_widget_ids ), // place 'Add Widget' and 'Reorder' buttons at end. + ) + ); + $new_setting_ids[] = $setting_id; + + $this->manager->add_control( $control ); + } + } + + // Add a control for each active widget (located in a sidebar). + foreach ( $sidebar_widget_ids as $i => $widget_id ) { + + // Skip widgets that may have gone away due to a plugin being deactivated. + if ( ! $is_active_sidebar || ! isset( $wp_registered_widgets[ $widget_id ] ) ) { + continue; + } + + $registered_widget = $wp_registered_widgets[ $widget_id ]; + $setting_id = $this->get_setting_id( $widget_id ); + $id_base = $wp_registered_widget_controls[ $widget_id ]['id_base']; + + $control = new WP_Widget_Form_Customize_Control( + $this->manager, + $setting_id, + array( + 'label' => $registered_widget['name'], + 'section' => $section_id, + 'sidebar_id' => $sidebar_id, + 'widget_id' => $widget_id, + 'widget_id_base' => $id_base, + 'priority' => $i, + 'width' => $wp_registered_widget_controls[ $widget_id ]['width'], + 'height' => $wp_registered_widget_controls[ $widget_id ]['height'], + 'is_wide' => $this->is_wide_widget( $widget_id ), + ) + ); + $this->manager->add_control( $control ); + } + } + + if ( $this->manager->settings_previewed() ) { + foreach ( $new_setting_ids as $new_setting_id ) { + $this->manager->get_setting( $new_setting_id )->preview(); + } + } + } + + /** + * Determines whether the widgets panel is active, based on whether there are sidebars registered. + * + * @since 4.4.0 + * + * @see WP_Customize_Panel::$active_callback + * + * @global array $wp_registered_sidebars + * @return bool Active. + */ + public function is_panel_active() { + global $wp_registered_sidebars; + return ! empty( $wp_registered_sidebars ); + } + + /** + * Converts a widget_id into its corresponding Customizer setting ID (option name). + * + * @since 3.9.0 + * + * @param string $widget_id Widget ID. + * @return string Maybe-parsed widget ID. + */ + public function get_setting_id( $widget_id ) { + $parsed_widget_id = $this->parse_widget_id( $widget_id ); + $setting_id = sprintf( 'widget_%s', $parsed_widget_id['id_base'] ); + + if ( ! is_null( $parsed_widget_id['number'] ) ) { + $setting_id .= sprintf( '[%d]', $parsed_widget_id['number'] ); + } + return $setting_id; + } + + /** + * Determines whether the widget is considered "wide". + * + * Core widgets which may have controls wider than 250, but can still be shown + * in the narrow Customizer panel. The RSS and Text widgets in Core, for example, + * have widths of 400 and yet they still render fine in the Customizer panel. + * + * This method will return all Core widgets as being not wide, but this can be + * overridden with the {@see 'is_wide_widget_in_customizer'} filter. + * + * @since 3.9.0 + * + * @global $wp_registered_widget_controls + * + * @param string $widget_id Widget ID. + * @return bool Whether or not the widget is a "wide" widget. + */ + public function is_wide_widget( $widget_id ) { + global $wp_registered_widget_controls; + + $parsed_widget_id = $this->parse_widget_id( $widget_id ); + $width = $wp_registered_widget_controls[ $widget_id ]['width']; + $is_core = in_array( $parsed_widget_id['id_base'], $this->core_widget_id_bases ); + $is_wide = ( $width > 250 && ! $is_core ); + + /** + * Filters whether the given widget is considered "wide". + * + * @since 3.9.0 + * + * @param bool $is_wide Whether the widget is wide, Default false. + * @param string $widget_id Widget ID. + */ + return apply_filters( 'is_wide_widget_in_customizer', $is_wide, $widget_id ); + } + + /** + * Converts a widget ID into its id_base and number components. + * + * @since 3.9.0 + * + * @param string $widget_id Widget ID. + * @return array Array containing a widget's id_base and number components. + */ + public function parse_widget_id( $widget_id ) { + $parsed = array( + 'number' => null, + 'id_base' => null, + ); + + if ( preg_match( '/^(.+)-(\d+)$/', $widget_id, $matches ) ) { + $parsed['id_base'] = $matches[1]; + $parsed['number'] = intval( $matches[2] ); + } else { + // Likely an old single widget. + $parsed['id_base'] = $widget_id; + } + return $parsed; + } + + /** + * Converts a widget setting ID (option path) to its id_base and number components. + * + * @since 3.9.0 + * + * @param string $setting_id Widget setting ID. + * @return array|WP_Error Array containing a widget's id_base and number components, + * or a WP_Error object. + */ + public function parse_widget_setting_id( $setting_id ) { + if ( ! preg_match( '/^(widget_(.+?))(?:\[(\d+)\])?$/', $setting_id, $matches ) ) { + return new WP_Error( 'widget_setting_invalid_id' ); + } + + $id_base = $matches[2]; + $number = isset( $matches[3] ) ? intval( $matches[3] ) : null; + + return compact( 'id_base', 'number' ); + } + + /** + * Calls admin_print_styles-widgets.php and admin_print_styles hooks to + * allow custom styles from plugins. + * + * @since 3.9.0 + */ + public function print_styles() { + /** This action is documented in wp-admin/admin-header.php */ + do_action( 'admin_print_styles-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /** This action is documented in wp-admin/admin-header.php */ + do_action( 'admin_print_styles' ); + } + + /** + * Calls admin_print_scripts-widgets.php and admin_print_scripts hooks to + * allow custom scripts from plugins. + * + * @since 3.9.0 + */ + public function print_scripts() { + /** This action is documented in wp-admin/admin-header.php */ + do_action( 'admin_print_scripts-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /** This action is documented in wp-admin/admin-header.php */ + do_action( 'admin_print_scripts' ); + } + + /** + * Enqueues scripts and styles for Customizer panel and export data to JavaScript. + * + * @since 3.9.0 + * + * @global WP_Scripts $wp_scripts + * @global array $wp_registered_sidebars + * @global array $wp_registered_widgets + */ + public function enqueue_scripts() { + global $wp_scripts, $wp_registered_sidebars, $wp_registered_widgets; + + wp_enqueue_style( 'customize-widgets' ); + wp_enqueue_script( 'customize-widgets' ); + + /** This action is documented in wp-admin/admin-header.php */ + do_action( 'admin_enqueue_scripts', 'widgets.php' ); + + /* + * Export available widgets with control_tpl removed from model + * since plugins need templates to be in the DOM. + */ + $available_widgets = array(); + + foreach ( $this->get_available_widgets() as $available_widget ) { + unset( $available_widget['control_tpl'] ); + $available_widgets[] = $available_widget; + } + + $widget_reorder_nav_tpl = sprintf( + '<div class="widget-reorder-nav"><span class="move-widget" tabindex="0">%1$s</span><span class="move-widget-down" tabindex="0">%2$s</span><span class="move-widget-up" tabindex="0">%3$s</span></div>', + __( 'Move to another area…' ), + __( 'Move down' ), + __( 'Move up' ) + ); + + $move_widget_area_tpl = str_replace( + array( '{description}', '{btn}' ), + array( + __( 'Select an area to move this widget into:' ), + _x( 'Move', 'Move widget' ), + ), + '<div class="move-widget-area"> + <p class="description">{description}</p> + <ul class="widget-area-select"> + <% _.each( sidebars, function ( sidebar ){ %> + <li class="" data-id="<%- sidebar.id %>" title="<%- sidebar.description %>" tabindex="0"><%- sidebar.name %></li> + <% }); %> + </ul> + <div class="move-widget-actions"> + <button class="move-widget-btn button" type="button">{btn}</button> + </div> + </div>' + ); + + /* + * Gather all strings in PHP that may be needed by JS on the client. + * Once JS i18n is implemented (in #20491), this can be removed. + */ + $some_non_rendered_areas_messages = array(); + $some_non_rendered_areas_messages[1] = html_entity_decode( + __( 'Your theme has 1 other widget area, but this particular page doesn’t display it.' ), + ENT_QUOTES, + get_bloginfo( 'charset' ) + ); + $registered_sidebar_count = count( $wp_registered_sidebars ); + for ( $non_rendered_count = 2; $non_rendered_count < $registered_sidebar_count; $non_rendered_count++ ) { + $some_non_rendered_areas_messages[ $non_rendered_count ] = html_entity_decode( + sprintf( + /* translators: %s: The number of other widget areas registered but not rendered. */ + _n( + 'Your theme has %s other widget area, but this particular page doesn’t display it.', + 'Your theme has %s other widget areas, but this particular page doesn’t display them.', + $non_rendered_count + ), + number_format_i18n( $non_rendered_count ) + ), + ENT_QUOTES, + get_bloginfo( 'charset' ) + ); + } + + if ( 1 === $registered_sidebar_count ) { + $no_areas_shown_message = html_entity_decode( + sprintf( + __( 'Your theme has 1 widget area, but this particular page doesn’t display it.' ) + ), + ENT_QUOTES, + get_bloginfo( 'charset' ) + ); + } else { + $no_areas_shown_message = html_entity_decode( + sprintf( + /* translators: %s: The total number of widget areas registered. */ + _n( + 'Your theme has %s widget area, but this particular page doesn’t display it.', + 'Your theme has %s widget areas, but this particular page doesn’t display them.', + $registered_sidebar_count + ), + number_format_i18n( $registered_sidebar_count ) + ), + ENT_QUOTES, + get_bloginfo( 'charset' ) + ); + } + + $settings = array( + 'registeredSidebars' => array_values( $wp_registered_sidebars ), + 'registeredWidgets' => $wp_registered_widgets, + 'availableWidgets' => $available_widgets, // @todo Merge this with registered_widgets. + 'l10n' => array( + 'saveBtnLabel' => __( 'Apply' ), + 'saveBtnTooltip' => __( 'Save and preview changes before publishing them.' ), + 'removeBtnLabel' => __( 'Remove' ), + 'removeBtnTooltip' => __( 'Keep widget settings and move it to the inactive widgets' ), + 'error' => __( 'An error has occurred. Please reload the page and try again.' ), + 'widgetMovedUp' => __( 'Widget moved up' ), + 'widgetMovedDown' => __( 'Widget moved down' ), + 'navigatePreview' => __( 'You can navigate to other pages on your site while using the Customizer to view and edit the widgets displayed on those pages.' ), + 'someAreasShown' => $some_non_rendered_areas_messages, + 'noAreasShown' => $no_areas_shown_message, + 'reorderModeOn' => __( 'Reorder mode enabled' ), + 'reorderModeOff' => __( 'Reorder mode closed' ), + 'reorderLabelOn' => esc_attr__( 'Reorder widgets' ), + /* translators: %d: The number of widgets found. */ + 'widgetsFound' => __( 'Number of widgets found: %d' ), + 'noWidgetsFound' => __( 'No widgets found.' ), + ), + 'tpl' => array( + 'widgetReorderNav' => $widget_reorder_nav_tpl, + 'moveWidgetArea' => $move_widget_area_tpl, + ), + 'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(), + ); + + foreach ( $settings['registeredWidgets'] as &$registered_widget ) { + unset( $registered_widget['callback'] ); // May not be JSON-serializeable. + } + + $wp_scripts->add_data( + 'customize-widgets', + 'data', + sprintf( 'var _wpCustomizeWidgetsSettings = %s;', wp_json_encode( $settings ) ) + ); + } + + /** + * Renders the widget form control templates into the DOM. + * + * @since 3.9.0 + */ + public function output_widget_control_templates() { + ?> + <div id="widgets-left"><!-- compatibility with JS which looks for widget templates here --> + <div id="available-widgets"> + <div class="customize-section-title"> + <button class="customize-section-back" tabindex="-1"> + <span class="screen-reader-text"><?php _e( 'Back' ); ?></span> + </button> + <h3> + <span class="customize-action"> + <?php + /* translators: ▸ is the unicode right-pointing triangle. %s: Section title in the Customizer. */ + echo sprintf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( 'widgets' )->title ) ); + ?> + </span> + <?php _e( 'Add a Widget' ); ?> + </h3> + </div> + <div id="available-widgets-filter"> + <label class="screen-reader-text" for="widgets-search"><?php _e( 'Search Widgets' ); ?></label> + <input type="text" id="widgets-search" placeholder="<?php esc_attr_e( 'Search widgets…' ); ?>" aria-describedby="widgets-search-desc" /> + <div class="search-icon" aria-hidden="true"></div> + <button type="button" class="clear-results"><span class="screen-reader-text"><?php _e( 'Clear Results' ); ?></span></button> + <p class="screen-reader-text" id="widgets-search-desc"><?php _e( 'The search results will be updated as you type.' ); ?></p> + </div> + <div id="available-widgets-list"> + <?php foreach ( $this->get_available_widgets() as $available_widget ) : ?> + <div id="widget-tpl-<?php echo esc_attr( $available_widget['id'] ); ?>" data-widget-id="<?php echo esc_attr( $available_widget['id'] ); ?>" class="widget-tpl <?php echo esc_attr( $available_widget['id'] ); ?>" tabindex="0"> + <?php echo $available_widget['control_tpl']; ?> + </div> + <?php endforeach; ?> + <p class="no-widgets-found-message"><?php _e( 'No widgets found.' ); ?></p> + </div><!-- #available-widgets-list --> + </div><!-- #available-widgets --> + </div><!-- #widgets-left --> + <?php + } + + /** + * Calls admin_print_footer_scripts and admin_print_scripts hooks to + * allow custom scripts from plugins. + * + * @since 3.9.0 + */ + public function print_footer_scripts() { + /** This action is documented in wp-admin/admin-footer.php */ + do_action( 'admin_print_footer_scripts-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /** This action is documented in wp-admin/admin-footer.php */ + do_action( 'admin_print_footer_scripts' ); + + /** This action is documented in wp-admin/admin-footer.php */ + do_action( 'admin_footer-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + } + + /** + * Retrieves common arguments to supply when constructing a Customizer setting. + * + * @since 3.9.0 + * + * @param string $id Widget setting ID. + * @param array $overrides Array of setting overrides. + * @return array Possibly modified setting arguments. + */ + public function get_setting_args( $id, $overrides = array() ) { + $args = array( + 'type' => 'option', + 'capability' => 'edit_theme_options', + 'default' => array(), + ); + + if ( preg_match( $this->setting_id_patterns['sidebar_widgets'], $id, $matches ) ) { + $args['sanitize_callback'] = array( $this, 'sanitize_sidebar_widgets' ); + $args['sanitize_js_callback'] = array( $this, 'sanitize_sidebar_widgets_js_instance' ); + $args['transport'] = current_theme_supports( 'customize-selective-refresh-widgets' ) ? 'postMessage' : 'refresh'; + } elseif ( preg_match( $this->setting_id_patterns['widget_instance'], $id, $matches ) ) { + $args['sanitize_callback'] = array( $this, 'sanitize_widget_instance' ); + $args['sanitize_js_callback'] = array( $this, 'sanitize_widget_js_instance' ); + $args['transport'] = $this->is_widget_selective_refreshable( $matches['id_base'] ) ? 'postMessage' : 'refresh'; + } + + $args = array_merge( $args, $overrides ); + + /** + * Filters the common arguments supplied when constructing a Customizer setting. + * + * @since 3.9.0 + * + * @see WP_Customize_Setting + * + * @param array $args Array of Customizer setting arguments. + * @param string $id Widget setting ID. + */ + return apply_filters( 'widget_customizer_setting_args', $args, $id ); + } + + /** + * Ensures sidebar widget arrays only ever contain widget IDS. + * + * Used as the 'sanitize_callback' for each $sidebars_widgets setting. + * + * @since 3.9.0 + * + * @param string[] $widget_ids Array of widget IDs. + * @return string[] Array of sanitized widget IDs. + */ + public function sanitize_sidebar_widgets( $widget_ids ) { + $widget_ids = array_map( 'strval', (array) $widget_ids ); + $sanitized_widget_ids = array(); + foreach ( $widget_ids as $widget_id ) { + $sanitized_widget_ids[] = preg_replace( '/[^a-z0-9_\-]/', '', $widget_id ); + } + return $sanitized_widget_ids; + } + + /** + * Builds up an index of all available widgets for use in Backbone models. + * + * @since 3.9.0 + * + * @global array $wp_registered_widgets + * @global array $wp_registered_widget_controls + * @staticvar array $available_widgets + * + * @see wp_list_widgets() + * + * @return array List of available widgets. + */ + public function get_available_widgets() { + static $available_widgets = array(); + if ( ! empty( $available_widgets ) ) { + return $available_widgets; + } + + global $wp_registered_widgets, $wp_registered_widget_controls; + require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number(). + + $sort = $wp_registered_widgets; + usort( $sort, array( $this, '_sort_name_callback' ) ); + $done = array(); + + foreach ( $sort as $widget ) { + if ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget. + continue; + } + + $sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false ); + $done[] = $widget['callback']; + + if ( ! isset( $widget['params'][0] ) ) { + $widget['params'][0] = array(); + } + + $available_widget = $widget; + unset( $available_widget['callback'] ); // Not serializable to JSON. + + $args = array( + 'widget_id' => $widget['id'], + 'widget_name' => $widget['name'], + '_display' => 'template', + ); + + $is_disabled = false; + $is_multi_widget = ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) ); + if ( $is_multi_widget ) { + $id_base = $wp_registered_widget_controls[ $widget['id'] ]['id_base']; + $args['_temp_id'] = "$id_base-__i__"; + $args['_multi_num'] = next_widget_id_number( $id_base ); + $args['_add'] = 'multi'; + } else { + $args['_add'] = 'single'; + + if ( $sidebar && 'wp_inactive_widgets' !== $sidebar ) { + $is_disabled = true; + } + $id_base = $widget['id']; + } + + $list_widget_controls_args = wp_list_widget_controls_dynamic_sidebar( + array( + 0 => $args, + 1 => $widget['params'][0], + ) + ); + $control_tpl = $this->get_widget_control( $list_widget_controls_args ); + + // The properties here are mapped to the Backbone Widget model. + $available_widget = array_merge( + $available_widget, + array( + 'temp_id' => isset( $args['_temp_id'] ) ? $args['_temp_id'] : null, + 'is_multi' => $is_multi_widget, + 'control_tpl' => $control_tpl, + 'multi_number' => ( 'multi' === $args['_add'] ) ? $args['_multi_num'] : false, + 'is_disabled' => $is_disabled, + 'id_base' => $id_base, + 'transport' => $this->is_widget_selective_refreshable( $id_base ) ? 'postMessage' : 'refresh', + 'width' => $wp_registered_widget_controls[ $widget['id'] ]['width'], + 'height' => $wp_registered_widget_controls[ $widget['id'] ]['height'], + 'is_wide' => $this->is_wide_widget( $widget['id'] ), + ) + ); + + $available_widgets[] = $available_widget; + } + + return $available_widgets; + } + + /** + * Naturally orders available widgets by name. + * + * @since 3.9.0 + * + * @param array $widget_a The first widget to compare. + * @param array $widget_b The second widget to compare. + * @return int Reorder position for the current widget comparison. + */ + protected function _sort_name_callback( $widget_a, $widget_b ) { + return strnatcasecmp( $widget_a['name'], $widget_b['name'] ); + } + + /** + * Retrieves the widget control markup. + * + * @since 3.9.0 + * + * @param array $args Widget control arguments. + * @return string Widget control form HTML markup. + */ + public function get_widget_control( $args ) { + $args[0]['before_form'] = '<div class="form">'; + $args[0]['after_form'] = '</div><!-- .form -->'; + $args[0]['before_widget_content'] = '<div class="widget-content">'; + $args[0]['after_widget_content'] = '</div><!-- .widget-content -->'; + ob_start(); + wp_widget_control( ...$args ); + $control_tpl = ob_get_clean(); + return $control_tpl; + } + + /** + * Retrieves the widget control markup parts. + * + * @since 4.4.0 + * + * @param array $args Widget control arguments. + * @return array { + * @type string $control Markup for widget control wrapping form. + * @type string $content The contents of the widget form itself. + * } + */ + public function get_widget_control_parts( $args ) { + $args[0]['before_widget_content'] = '<div class="widget-content">'; + $args[0]['after_widget_content'] = '</div><!-- .widget-content -->'; + $control_markup = $this->get_widget_control( $args ); + + $content_start_pos = strpos( $control_markup, $args[0]['before_widget_content'] ); + $content_end_pos = strrpos( $control_markup, $args[0]['after_widget_content'] ); + + $control = substr( $control_markup, 0, $content_start_pos + strlen( $args[0]['before_widget_content'] ) ); + $control .= substr( $control_markup, $content_end_pos ); + $content = trim( + substr( + $control_markup, + $content_start_pos + strlen( $args[0]['before_widget_content'] ), + $content_end_pos - $content_start_pos - strlen( $args[0]['before_widget_content'] ) + ) + ); + + return compact( 'control', 'content' ); + } + + /** + * Adds hooks for the Customizer preview. + * + * @since 3.9.0 + */ + public function customize_preview_init() { + add_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue' ) ); + add_action( 'wp_print_styles', array( $this, 'print_preview_css' ), 1 ); + add_action( 'wp_footer', array( $this, 'export_preview_data' ), 20 ); + } + + /** + * Refreshes the nonce for widget updates. + * + * @since 4.2.0 + * + * @param array $nonces Array of nonces. + * @return array Array of nonces. + */ + public function refresh_nonces( $nonces ) { + $nonces['update-widget'] = wp_create_nonce( 'update-widget' ); + return $nonces; + } + + /** + * When previewing, ensures the proper previewing widgets are used. + * + * Because wp_get_sidebars_widgets() gets called early at {@see 'init' } (via + * wp_convert_widget_settings()) and can set global variable `$_wp_sidebars_widgets` + * to the value of `get_option( 'sidebars_widgets' )` before the Customizer preview + * filter is added, it has to be reset after the filter has been added. + * + * @since 3.9.0 + * + * @param array $sidebars_widgets List of widgets for the current sidebar. + * @return array + */ + public function preview_sidebars_widgets( $sidebars_widgets ) { + $sidebars_widgets = get_option( 'sidebars_widgets', array() ); + + unset( $sidebars_widgets['array_version'] ); + return $sidebars_widgets; + } + + /** + * Enqueues scripts for the Customizer preview. + * + * @since 3.9.0 + */ + public function customize_preview_enqueue() { + wp_enqueue_script( 'customize-preview-widgets' ); + } + + /** + * Inserts default style for highlighted widget at early point so theme + * stylesheet can override. + * + * @since 3.9.0 + */ + public function print_preview_css() { + ?> + <style> + .widget-customizer-highlighted-widget { + outline: none; + -webkit-box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); + position: relative; + z-index: 1; + } + </style> + <?php + } + + /** + * Communicates the sidebars that appeared on the page at the very end of the page, + * and at the very end of the wp_footer, + * + * @since 3.9.0 + * + * @global array $wp_registered_sidebars + * @global array $wp_registered_widgets + */ + public function export_preview_data() { + global $wp_registered_sidebars, $wp_registered_widgets; + + $switched_locale = switch_to_locale( get_user_locale() ); + $l10n = array( + 'widgetTooltip' => __( 'Shift-click to edit this widget.' ), + ); + if ( $switched_locale ) { + restore_previous_locale(); + } + + // Prepare Customizer settings to pass to JavaScript. + $settings = array( + 'renderedSidebars' => array_fill_keys( array_unique( $this->rendered_sidebars ), true ), + 'renderedWidgets' => array_fill_keys( array_keys( $this->rendered_widgets ), true ), + 'registeredSidebars' => array_values( $wp_registered_sidebars ), + 'registeredWidgets' => $wp_registered_widgets, + 'l10n' => $l10n, + 'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(), + ); + foreach ( $settings['registeredWidgets'] as &$registered_widget ) { + unset( $registered_widget['callback'] ); // May not be JSON-serializeable. + } + + ?> + <script type="text/javascript"> + var _wpWidgetCustomizerPreviewSettings = <?php echo wp_json_encode( $settings ); ?>; + </script> + <?php + } + + /** + * Tracks the widgets that were rendered. + * + * @since 3.9.0 + * + * @param array $widget Rendered widget to tally. + */ + public function tally_rendered_widgets( $widget ) { + $this->rendered_widgets[ $widget['id'] ] = true; + } + + /** + * Determine if a widget is rendered on the page. + * + * @since 4.0.0 + * + * @param string $widget_id Widget ID to check. + * @return bool Whether the widget is rendered. + */ + public function is_widget_rendered( $widget_id ) { + return in_array( $widget_id, $this->rendered_widgets ); + } + + /** + * Determines if a sidebar is rendered on the page. + * + * @since 4.0.0 + * + * @param string $sidebar_id Sidebar ID to check. + * @return bool Whether the sidebar is rendered. + */ + public function is_sidebar_rendered( $sidebar_id ) { + return in_array( $sidebar_id, $this->rendered_sidebars ); + } + + /** + * Tallies the sidebars rendered via is_active_sidebar(). + * + * Keep track of the times that is_active_sidebar() is called in the template, + * and assume that this means that the sidebar would be rendered on the template + * if there were widgets populating it. + * + * @since 3.9.0 + * + * @param bool $is_active Whether the sidebar is active. + * @param string $sidebar_id Sidebar ID. + * @return bool Whether the sidebar is active. + */ + public function tally_sidebars_via_is_active_sidebar_calls( $is_active, $sidebar_id ) { + if ( is_registered_sidebar( $sidebar_id ) ) { + $this->rendered_sidebars[] = $sidebar_id; + } + /* + * We may need to force this to true, and also force-true the value + * for 'dynamic_sidebar_has_widgets' if we want to ensure that there + * is an area to drop widgets into, if the sidebar is empty. + */ + return $is_active; + } + + /** + * Tallies the sidebars rendered via dynamic_sidebar(). + * + * Keep track of the times that dynamic_sidebar() is called in the template, + * and assume this means the sidebar would be rendered on the template if + * there were widgets populating it. + * + * @since 3.9.0 + * + * @param bool $has_widgets Whether the current sidebar has widgets. + * @param string $sidebar_id Sidebar ID. + * @return bool Whether the current sidebar has widgets. + */ + public function tally_sidebars_via_dynamic_sidebar_calls( $has_widgets, $sidebar_id ) { + if ( is_registered_sidebar( $sidebar_id ) ) { + $this->rendered_sidebars[] = $sidebar_id; + } + + /* + * We may need to force this to true, and also force-true the value + * for 'is_active_sidebar' if we want to ensure there is an area to + * drop widgets into, if the sidebar is empty. + */ + return $has_widgets; + } + + /** + * Retrieves MAC for a serialized widget instance string. + * + * Allows values posted back from JS to be rejected if any tampering of the + * data has occurred. + * + * @since 3.9.0 + * + * @param string $serialized_instance Widget instance. + * @return string MAC for serialized widget instance. + */ + protected function get_instance_hash_key( $serialized_instance ) { + return wp_hash( $serialized_instance ); + } + + /** + * Sanitizes a widget instance. + * + * Unserialize the JS-instance for storing in the options. It's important that this filter + * only get applied to an instance *once*. + * + * @since 3.9.0 + * + * @param array $value Widget instance to sanitize. + * @return array|void Sanitized widget instance. + */ + public function sanitize_widget_instance( $value ) { + if ( array() === $value ) { + return $value; + } + + if ( empty( $value['is_widget_customizer_js_value'] ) + || empty( $value['instance_hash_key'] ) + || empty( $value['encoded_serialized_instance'] ) ) { + return; + } + + $decoded = base64_decode( $value['encoded_serialized_instance'], true ); + if ( false === $decoded ) { + return; + } + + if ( ! hash_equals( $this->get_instance_hash_key( $decoded ), $value['instance_hash_key'] ) ) { + return; + } + + $instance = unserialize( $decoded ); + if ( false === $instance ) { + return; + } + + return $instance; + } + + /** + * Converts a widget instance into JSON-representable format. + * + * @since 3.9.0 + * + * @param array $value Widget instance to convert to JSON. + * @return array JSON-converted widget instance. + */ + public function sanitize_widget_js_instance( $value ) { + if ( empty( $value['is_widget_customizer_js_value'] ) ) { + $serialized = serialize( $value ); + + $value = array( + 'encoded_serialized_instance' => base64_encode( $serialized ), + 'title' => empty( $value['title'] ) ? '' : $value['title'], + 'is_widget_customizer_js_value' => true, + 'instance_hash_key' => $this->get_instance_hash_key( $serialized ), + ); + } + return $value; + } + + /** + * Strips out widget IDs for widgets which are no longer registered. + * + * One example where this might happen is when a plugin orphans a widget + * in a sidebar upon deactivation. + * + * @since 3.9.0 + * + * @global array $wp_registered_widgets + * + * @param array $widget_ids List of widget IDs. + * @return array Parsed list of widget IDs. + */ + public function sanitize_sidebar_widgets_js_instance( $widget_ids ) { + global $wp_registered_widgets; + $widget_ids = array_values( array_intersect( $widget_ids, array_keys( $wp_registered_widgets ) ) ); + return $widget_ids; + } + + /** + * Finds and invokes the widget update and control callbacks. + * + * Requires that `$_POST` be populated with the instance data. + * + * @since 3.9.0 + * + * @global array $wp_registered_widget_updates + * @global array $wp_registered_widget_controls + * + * @param string $widget_id Widget ID. + * @return array|WP_Error Array containing the updated widget information. + * A WP_Error object, otherwise. + */ + public function call_widget_update( $widget_id ) { + global $wp_registered_widget_updates, $wp_registered_widget_controls; + + $setting_id = $this->get_setting_id( $widget_id ); + + /* + * Make sure that other setting changes have previewed since this widget + * may depend on them (e.g. Menus being present for Navigation Menu widget). + */ + if ( ! did_action( 'customize_preview_init' ) ) { + foreach ( $this->manager->settings() as $setting ) { + if ( $setting->id !== $setting_id ) { + $setting->preview(); + } + } + } + + $this->start_capturing_option_updates(); + $parsed_id = $this->parse_widget_id( $widget_id ); + $option_name = 'widget_' . $parsed_id['id_base']; + + /* + * If a previously-sanitized instance is provided, populate the input vars + * with its values so that the widget update callback will read this instance + */ + $added_input_vars = array(); + if ( ! empty( $_POST['sanitized_widget_setting'] ) ) { + $sanitized_widget_setting = json_decode( $this->get_post_value( 'sanitized_widget_setting' ), true ); + if ( false === $sanitized_widget_setting ) { + $this->stop_capturing_option_updates(); + return new WP_Error( 'widget_setting_malformed' ); + } + + $instance = $this->sanitize_widget_instance( $sanitized_widget_setting ); + if ( is_null( $instance ) ) { + $this->stop_capturing_option_updates(); + return new WP_Error( 'widget_setting_unsanitized' ); + } + + if ( ! is_null( $parsed_id['number'] ) ) { + $value = array(); + $value[ $parsed_id['number'] ] = $instance; + $key = 'widget-' . $parsed_id['id_base']; + $_REQUEST[ $key ] = wp_slash( $value ); + $_POST[ $key ] = $_REQUEST[ $key ]; + $added_input_vars[] = $key; + } else { + foreach ( $instance as $key => $value ) { + $_REQUEST[ $key ] = wp_slash( $value ); + $_POST[ $key ] = $_REQUEST[ $key ]; + $added_input_vars[] = $key; + } + } + } + + // Invoke the widget update callback. + foreach ( (array) $wp_registered_widget_updates as $name => $control ) { + if ( $name === $parsed_id['id_base'] && is_callable( $control['callback'] ) ) { + ob_start(); + call_user_func_array( $control['callback'], $control['params'] ); + ob_end_clean(); + break; + } + } + + // Clean up any input vars that were manually added. + foreach ( $added_input_vars as $key ) { + unset( $_POST[ $key ] ); + unset( $_REQUEST[ $key ] ); + } + + // Make sure the expected option was updated. + if ( 0 !== $this->count_captured_options() ) { + if ( $this->count_captured_options() > 1 ) { + $this->stop_capturing_option_updates(); + return new WP_Error( 'widget_setting_too_many_options' ); + } + + $updated_option_name = key( $this->get_captured_options() ); + if ( $updated_option_name !== $option_name ) { + $this->stop_capturing_option_updates(); + return new WP_Error( 'widget_setting_unexpected_option' ); + } + } + + // Obtain the widget instance. + $option = $this->get_captured_option( $option_name ); + if ( null !== $parsed_id['number'] ) { + $instance = $option[ $parsed_id['number'] ]; + } else { + $instance = $option; + } + + /* + * Override the incoming $_POST['customized'] for a newly-created widget's + * setting with the new $instance so that the preview filter currently + * in place from WP_Customize_Setting::preview() will use this value + * instead of the default widget instance value (an empty array). + */ + $this->manager->set_post_value( $setting_id, $this->sanitize_widget_js_instance( $instance ) ); + + // Obtain the widget control with the updated instance in place. + ob_start(); + $form = $wp_registered_widget_controls[ $widget_id ]; + if ( $form ) { + call_user_func_array( $form['callback'], $form['params'] ); + } + $form = ob_get_clean(); + + $this->stop_capturing_option_updates(); + + return compact( 'instance', 'form' ); + } + + /** + * Updates widget settings asynchronously. + * + * Allows the Customizer to update a widget using its form, but return the new + * instance info via Ajax instead of saving it to the options table. + * + * Most code here copied from wp_ajax_save_widget(). + * + * @since 3.9.0 + * + * @see wp_ajax_save_widget() + */ + public function wp_ajax_update_widget() { + + if ( ! is_user_logged_in() ) { + wp_die( 0 ); + } + + check_ajax_referer( 'update-widget', 'nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_die( -1 ); + } + + if ( empty( $_POST['widget-id'] ) ) { + wp_send_json_error( 'missing_widget-id' ); + } + + /** This action is documented in wp-admin/includes/ajax-actions.php */ + do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /** This action is documented in wp-admin/includes/ajax-actions.php */ + do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + /** This action is documented in wp-admin/widgets.php */ + do_action( 'sidebar_admin_setup' ); + + $widget_id = $this->get_post_value( 'widget-id' ); + $parsed_id = $this->parse_widget_id( $widget_id ); + $id_base = $parsed_id['id_base']; + + $is_updating_widget_template = ( + isset( $_POST[ 'widget-' . $id_base ] ) + && + is_array( $_POST[ 'widget-' . $id_base ] ) + && + preg_match( '/__i__|%i%/', key( $_POST[ 'widget-' . $id_base ] ) ) + ); + if ( $is_updating_widget_template ) { + wp_send_json_error( 'template_widget_not_updatable' ); + } + + $updated_widget = $this->call_widget_update( $widget_id ); // => {instance,form} + if ( is_wp_error( $updated_widget ) ) { + wp_send_json_error( $updated_widget->get_error_code() ); + } + + $form = $updated_widget['form']; + $instance = $this->sanitize_widget_js_instance( $updated_widget['instance'] ); + + wp_send_json_success( compact( 'form', 'instance' ) ); + } + + /* + * Selective Refresh Methods + */ + + /** + * Filters arguments for dynamic widget partials. + * + * @since 4.5.0 + * + * @param array|false $partial_args Partial arguments. + * @param string $partial_id Partial ID. + * @return array (Maybe) modified partial arguments. + */ + public function customize_dynamic_partial_args( $partial_args, $partial_id ) { + if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) { + return $partial_args; + } + + if ( preg_match( '/^widget\[(?P<widget_id>.+)\]$/', $partial_id, $matches ) ) { + if ( false === $partial_args ) { + $partial_args = array(); + } + $partial_args = array_merge( + $partial_args, + array( + 'type' => 'widget', + 'render_callback' => array( $this, 'render_widget_partial' ), + 'container_inclusive' => true, + 'settings' => array( $this->get_setting_id( $matches['widget_id'] ) ), + 'capability' => 'edit_theme_options', + ) + ); + } + + return $partial_args; + } + + /** + * Adds hooks for selective refresh. + * + * @since 4.5.0 + */ + public function selective_refresh_init() { + if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) { + return; + } + add_filter( 'dynamic_sidebar_params', array( $this, 'filter_dynamic_sidebar_params' ) ); + add_filter( 'wp_kses_allowed_html', array( $this, 'filter_wp_kses_allowed_data_attributes' ) ); + add_action( 'dynamic_sidebar_before', array( $this, 'start_dynamic_sidebar' ) ); + add_action( 'dynamic_sidebar_after', array( $this, 'end_dynamic_sidebar' ) ); + } + + /** + * Inject selective refresh data attributes into widget container elements. + * + * @since 4.5.0 + * + * @param array $params { + * Dynamic sidebar params. + * + * @type array $args Sidebar args. + * @type array $widget_args Widget args. + * } + * @see WP_Customize_Nav_Menus::filter_wp_nav_menu_args() + * + * @return array Params. + */ + public function filter_dynamic_sidebar_params( $params ) { + $sidebar_args = array_merge( + array( + 'before_widget' => '', + 'after_widget' => '', + ), + $params[0] + ); + + // Skip widgets not in a registered sidebar or ones which lack a proper wrapper element to attach the data-* attributes to. + $matches = array(); + $is_valid = ( + isset( $sidebar_args['id'] ) + && + is_registered_sidebar( $sidebar_args['id'] ) + && + ( isset( $this->current_dynamic_sidebar_id_stack[0] ) && $this->current_dynamic_sidebar_id_stack[0] === $sidebar_args['id'] ) + && + preg_match( '#^<(?P<tag_name>\w+)#', $sidebar_args['before_widget'], $matches ) + ); + if ( ! $is_valid ) { + return $params; + } + $this->before_widget_tags_seen[ $matches['tag_name'] ] = true; + + $context = array( + 'sidebar_id' => $sidebar_args['id'], + ); + if ( isset( $this->context_sidebar_instance_number ) ) { + $context['sidebar_instance_number'] = $this->context_sidebar_instance_number; + } elseif ( isset( $sidebar_args['id'] ) && isset( $this->sidebar_instance_count[ $sidebar_args['id'] ] ) ) { + $context['sidebar_instance_number'] = $this->sidebar_instance_count[ $sidebar_args['id'] ]; + } + + $attributes = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'widget[' . $sidebar_args['widget_id'] . ']' ) ); + $attributes .= ' data-customize-partial-type="widget"'; + $attributes .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $context ) ) ); + $attributes .= sprintf( ' data-customize-widget-id="%s"', esc_attr( $sidebar_args['widget_id'] ) ); + $sidebar_args['before_widget'] = preg_replace( '#^(<\w+)#', '$1 ' . $attributes, $sidebar_args['before_widget'] ); + + $params[0] = $sidebar_args; + return $params; + } + + /** + * List of the tag names seen for before_widget strings. + * + * This is used in the {@see 'filter_wp_kses_allowed_html'} filter to ensure that the + * data-* attributes can be whitelisted. + * + * @since 4.5.0 + * @var array + */ + protected $before_widget_tags_seen = array(); + + /** + * Ensures the HTML data-* attributes for selective refresh are allowed by kses. + * + * This is needed in case the `$before_widget` is run through wp_kses() when printed. + * + * @since 4.5.0 + * + * @param array $allowed_html Allowed HTML. + * @return array (Maybe) modified allowed HTML. + */ + public function filter_wp_kses_allowed_data_attributes( $allowed_html ) { + foreach ( array_keys( $this->before_widget_tags_seen ) as $tag_name ) { + if ( ! isset( $allowed_html[ $tag_name ] ) ) { + $allowed_html[ $tag_name ] = array(); + } + $allowed_html[ $tag_name ] = array_merge( + $allowed_html[ $tag_name ], + array_fill_keys( + array( + 'data-customize-partial-id', + 'data-customize-partial-type', + 'data-customize-partial-placement-context', + 'data-customize-partial-widget-id', + 'data-customize-partial-options', + ), + true + ) + ); + } + return $allowed_html; + } + + /** + * Keep track of the number of times that dynamic_sidebar() was called for a given sidebar index. + * + * This helps facilitate the uncommon scenario where a single sidebar is rendered multiple times on a template. + * + * @since 4.5.0 + * @var array + */ + protected $sidebar_instance_count = array(); + + /** + * The current request's sidebar_instance_number context. + * + * @since 4.5.0 + * @var int|null + */ + protected $context_sidebar_instance_number; + + /** + * Current sidebar ID being rendered. + * + * @since 4.5.0 + * @var array + */ + protected $current_dynamic_sidebar_id_stack = array(); + + /** + * Begins keeping track of the current sidebar being rendered. + * + * Insert marker before widgets are rendered in a dynamic sidebar. + * + * @since 4.5.0 + * + * @param int|string $index Index, name, or ID of the dynamic sidebar. + */ + public function start_dynamic_sidebar( $index ) { + array_unshift( $this->current_dynamic_sidebar_id_stack, $index ); + if ( ! isset( $this->sidebar_instance_count[ $index ] ) ) { + $this->sidebar_instance_count[ $index ] = 0; + } + $this->sidebar_instance_count[ $index ] += 1; + if ( ! $this->manager->selective_refresh->is_render_partials_request() ) { + printf( "\n<!--dynamic_sidebar_before:%s:%d-->\n", esc_html( $index ), intval( $this->sidebar_instance_count[ $index ] ) ); + } + } + + /** + * Finishes keeping track of the current sidebar being rendered. + * + * Inserts a marker after widgets are rendered in a dynamic sidebar. + * + * @since 4.5.0 + * + * @param int|string $index Index, name, or ID of the dynamic sidebar. + */ + public function end_dynamic_sidebar( $index ) { + array_shift( $this->current_dynamic_sidebar_id_stack ); + if ( ! $this->manager->selective_refresh->is_render_partials_request() ) { + printf( "\n<!--dynamic_sidebar_after:%s:%d-->\n", esc_html( $index ), intval( $this->sidebar_instance_count[ $index ] ) ); + } + } + + /** + * Current sidebar being rendered. + * + * @since 4.5.0 + * @var string|null + */ + protected $rendering_widget_id; + + /** + * Current widget being rendered. + * + * @since 4.5.0 + * @var string|null + */ + protected $rendering_sidebar_id; + + /** + * Filters sidebars_widgets to ensure the currently-rendered widget is the only widget in the current sidebar. + * + * @since 4.5.0 + * + * @param array $sidebars_widgets Sidebars widgets. + * @return array Filtered sidebars widgets. + */ + public function filter_sidebars_widgets_for_rendering_widget( $sidebars_widgets ) { + $sidebars_widgets[ $this->rendering_sidebar_id ] = array( $this->rendering_widget_id ); + return $sidebars_widgets; + } + + /** + * Renders a specific widget using the supplied sidebar arguments. + * + * @since 4.5.0 + * + * @see dynamic_sidebar() + * + * @param WP_Customize_Partial $partial Partial. + * @param array $context { + * Sidebar args supplied as container context. + * + * @type string $sidebar_id ID for sidebar for widget to render into. + * @type int $sidebar_instance_number Disambiguating instance number. + * } + * @return string|false + */ + public function render_widget_partial( $partial, $context ) { + $id_data = $partial->id_data(); + $widget_id = array_shift( $id_data['keys'] ); + + if ( ! is_array( $context ) + || empty( $context['sidebar_id'] ) + || ! is_registered_sidebar( $context['sidebar_id'] ) + ) { + return false; + } + + $this->rendering_sidebar_id = $context['sidebar_id']; + + if ( isset( $context['sidebar_instance_number'] ) ) { + $this->context_sidebar_instance_number = intval( $context['sidebar_instance_number'] ); + } + + // Filter sidebars_widgets so that only the queried widget is in the sidebar. + $this->rendering_widget_id = $widget_id; + + $filter_callback = array( $this, 'filter_sidebars_widgets_for_rendering_widget' ); + add_filter( 'sidebars_widgets', $filter_callback, 1000 ); + + // Render the widget. + ob_start(); + $this->rendering_sidebar_id = $context['sidebar_id']; + dynamic_sidebar( $this->rendering_sidebar_id ); + $container = ob_get_clean(); + + // Reset variables for next partial render. + remove_filter( 'sidebars_widgets', $filter_callback, 1000 ); + + $this->context_sidebar_instance_number = null; + $this->rendering_sidebar_id = null; + $this->rendering_widget_id = null; + + return $container; + } + + // + // Option Update Capturing. + // + + /** + * List of captured widget option updates. + * + * @since 3.9.0 + * @var array $_captured_options Values updated while option capture is happening. + */ + protected $_captured_options = array(); + + /** + * Whether option capture is currently happening. + * + * @since 3.9.0 + * @var bool $_is_current Whether option capture is currently happening or not. + */ + protected $_is_capturing_option_updates = false; + + /** + * Determines whether the captured option update should be ignored. + * + * @since 3.9.0 + * + * @param string $option_name Option name. + * @return bool Whether the option capture is ignored. + */ + protected function is_option_capture_ignored( $option_name ) { + return ( 0 === strpos( $option_name, '_transient_' ) ); + } + + /** + * Retrieves captured widget option updates. + * + * @since 3.9.0 + * + * @return array Array of captured options. + */ + protected function get_captured_options() { + return $this->_captured_options; + } + + /** + * Retrieves the option that was captured from being saved. + * + * @since 4.2.0 + * + * @param string $option_name Option name. + * @param mixed $default Optional. Default value to return if the option does not exist. Default false. + * @return mixed Value set for the option. + */ + protected function get_captured_option( $option_name, $default = false ) { + if ( array_key_exists( $option_name, $this->_captured_options ) ) { + $value = $this->_captured_options[ $option_name ]; + } else { + $value = $default; + } + return $value; + } + + /** + * Retrieves the number of captured widget option updates. + * + * @since 3.9.0 + * + * @return int Number of updated options. + */ + protected function count_captured_options() { + return count( $this->_captured_options ); + } + + /** + * Begins keeping track of changes to widget options, caching new values. + * + * @since 3.9.0 + */ + protected function start_capturing_option_updates() { + if ( $this->_is_capturing_option_updates ) { + return; + } + + $this->_is_capturing_option_updates = true; + + add_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10, 3 ); + } + + /** + * Pre-filters captured option values before updating. + * + * @since 3.9.0 + * + * @param mixed $new_value The new option value. + * @param string $option_name Name of the option. + * @param mixed $old_value The old option value. + * @return mixed Filtered option value. + */ + public function capture_filter_pre_update_option( $new_value, $option_name, $old_value ) { + if ( $this->is_option_capture_ignored( $option_name ) ) { + return $new_value; + } + + if ( ! isset( $this->_captured_options[ $option_name ] ) ) { + add_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) ); + } + + $this->_captured_options[ $option_name ] = $new_value; + + return $old_value; + } + + /** + * Pre-filters captured option values before retrieving. + * + * @since 3.9.0 + * + * @param mixed $value Value to return instead of the option value. + * @return mixed Filtered option value. + */ + public function capture_filter_pre_get_option( $value ) { + $option_name = preg_replace( '/^pre_option_/', '', current_filter() ); + + if ( isset( $this->_captured_options[ $option_name ] ) ) { + $value = $this->_captured_options[ $option_name ]; + + /** This filter is documented in wp-includes/option.php */ + $value = apply_filters( 'option_' . $option_name, $value, $option_name ); + } + + return $value; + } + + /** + * Undoes any changes to the options since options capture began. + * + * @since 3.9.0 + */ + protected function stop_capturing_option_updates() { + if ( ! $this->_is_capturing_option_updates ) { + return; + } + + remove_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10 ); + + foreach ( array_keys( $this->_captured_options ) as $option_name ) { + remove_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) ); + } + + $this->_captured_options = array(); + $this->_is_capturing_option_updates = false; + } + + /** + * {@internal Missing Summary} + * + * See the {@see 'customize_dynamic_setting_args'} filter. + * + * @since 3.9.0 + * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. + */ + public function setup_widget_addition_previews() { + _deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' ); + } + + /** + * {@internal Missing Summary} + * + * See the {@see 'customize_dynamic_setting_args'} filter. + * + * @since 3.9.0 + * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. + */ + public function prepreview_added_sidebars_widgets() { + _deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' ); + } + + /** + * {@internal Missing Summary} + * + * See the {@see 'customize_dynamic_setting_args'} filter. + * + * @since 3.9.0 + * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. + */ + public function prepreview_added_widget_instance() { + _deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' ); + } + + /** + * {@internal Missing Summary} + * + * See the {@see 'customize_dynamic_setting_args'} filter. + * + * @since 3.9.0 + * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. + */ + public function remove_prepreview_filters() { + _deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' ); + } +} diff --git a/wp-includes/class-wp-date-query.php b/wp-includes/class-wp-date-query.php new file mode 100644 index 0000000..8765c63 --- /dev/null +++ b/wp-includes/class-wp-date-query.php @@ -0,0 +1,1042 @@ +<?php +/** + * Class for generating SQL clauses that filter a primary query according to date. + * + * WP_Date_Query is a helper that allows primary query classes, such as WP_Query, to filter + * their results by date columns, by generating `WHERE` subclauses to be attached to the + * primary SQL query string. + * + * Attempting to filter by an invalid date value (eg month=13) will generate SQL that will + * return no results. In these cases, a _doing_it_wrong() error notice is also thrown. + * See WP_Date_Query::validate_date_values(). + * + * @link https://developer.wordpress.org/reference/classes/wp_query/ + * + * @since 3.7.0 + */ +class WP_Date_Query { + /** + * Array of date queries. + * + * See WP_Date_Query::__construct() for information on date query arguments. + * + * @since 3.7.0 + * @var array + */ + public $queries = array(); + + /** + * The default relation between top-level queries. Can be either 'AND' or 'OR'. + * + * @since 3.7.0 + * @var string + */ + public $relation = 'AND'; + + /** + * The column to query against. Can be changed via the query arguments. + * + * @since 3.7.0 + * @var string + */ + public $column = 'post_date'; + + /** + * The value comparison operator. Can be changed via the query arguments. + * + * @since 3.7.0 + * @var array + */ + public $compare = '='; + + /** + * Supported time-related parameter keys. + * + * @since 4.1.0 + * @var array + */ + public $time_keys = array( 'after', 'before', 'year', 'month', 'monthnum', 'week', 'w', 'dayofyear', 'day', 'dayofweek', 'dayofweek_iso', 'hour', 'minute', 'second' ); + + /** + * Constructor. + * + * Time-related parameters that normally require integer values ('year', 'month', 'week', 'dayofyear', 'day', + * 'dayofweek', 'dayofweek_iso', 'hour', 'minute', 'second') accept arrays of integers for some values of + * 'compare'. When 'compare' is 'IN' or 'NOT IN', arrays are accepted; when 'compare' is 'BETWEEN' or 'NOT + * BETWEEN', arrays of two valid values are required. See individual argument descriptions for accepted values. + * + * @since 3.7.0 + * @since 4.0.0 The $inclusive logic was updated to include all times within the date range. + * @since 4.1.0 Introduced 'dayofweek_iso' time type parameter. + * + * @param array $date_query { + * Array of date query clauses. + * + * @type array { + * @type string $column Optional. The column to query against. If undefined, inherits the value of + * the `$default_column` parameter. Accepts 'post_date', 'post_date_gmt', + * 'post_modified','post_modified_gmt', 'comment_date', 'comment_date_gmt'. + * Default 'post_date'. + * @type string $compare Optional. The comparison operator. Accepts '=', '!=', '>', '>=', '<', '<=', + * 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. Default '='. + * @type string $relation Optional. The boolean relationship between the date queries. Accepts 'OR' or 'AND'. + * Default 'OR'. + * @type array { + * Optional. An array of first-order clause parameters, or another fully-formed date query. + * + * @type string|array $before { + * Optional. Date to retrieve posts before. Accepts `strtotime()`-compatible string, + * or array of 'year', 'month', 'day' values. + * + * @type string $year The four-digit year. Default empty. Accepts any four-digit year. + * @type string $month Optional when passing array.The month of the year. + * Default (string:empty)|(array:1). Accepts numbers 1-12. + * @type string $day Optional when passing array.The day of the month. + * Default (string:empty)|(array:1). Accepts numbers 1-31. + * } + * @type string|array $after { + * Optional. Date to retrieve posts after. Accepts `strtotime()`-compatible string, + * or array of 'year', 'month', 'day' values. + * + * @type string $year The four-digit year. Accepts any four-digit year. Default empty. + * @type string $month Optional when passing array. The month of the year. Accepts numbers 1-12. + * Default (string:empty)|(array:12). + * @type string $day Optional when passing array.The day of the month. Accepts numbers 1-31. + * Default (string:empty)|(array:last day of month). + * } + * @type string $column Optional. Used to add a clause comparing a column other than the + * column specified in the top-level `$column` parameter. Accepts + * 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', + * 'comment_date', 'comment_date_gmt'. Default is the value of + * top-level `$column`. + * @type string $compare Optional. The comparison operator. Accepts '=', '!=', '>', '>=', + * '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. 'IN', + * 'NOT IN', 'BETWEEN', and 'NOT BETWEEN'. Comparisons support + * arrays in some time-related parameters. Default '='. + * @type bool $inclusive Optional. Include results from dates specified in 'before' or + * 'after'. Default false. + * @type int|array $year Optional. The four-digit year number. Accepts any four-digit year + * or an array of years if `$compare` supports it. Default empty. + * @type int|array $month Optional. The two-digit month number. Accepts numbers 1-12 or an + * array of valid numbers if `$compare` supports it. Default empty. + * @type int|array $week Optional. The week number of the year. Accepts numbers 0-53 or an + * array of valid numbers if `$compare` supports it. Default empty. + * @type int|array $dayofyear Optional. The day number of the year. Accepts numbers 1-366 or an + * array of valid numbers if `$compare` supports it. + * @type int|array $day Optional. The day of the month. Accepts numbers 1-31 or an array + * of valid numbers if `$compare` supports it. Default empty. + * @type int|array $dayofweek Optional. The day number of the week. Accepts numbers 1-7 (1 is + * Sunday) or an array of valid numbers if `$compare` supports it. + * Default empty. + * @type int|array $dayofweek_iso Optional. The day number of the week (ISO). Accepts numbers 1-7 + * (1 is Monday) or an array of valid numbers if `$compare` supports it. + * Default empty. + * @type int|array $hour Optional. The hour of the day. Accepts numbers 0-23 or an array + * of valid numbers if `$compare` supports it. Default empty. + * @type int|array $minute Optional. The minute of the hour. Accepts numbers 0-60 or an array + * of valid numbers if `$compare` supports it. Default empty. + * @type int|array $second Optional. The second of the minute. Accepts numbers 0-60 or an + * array of valid numbers if `$compare` supports it. Default empty. + * } + * } + * } + * @param string $default_column Optional. Default column to query against. Default 'post_date'. + * Accepts 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', + * 'comment_date', 'comment_date_gmt'. + */ + public function __construct( $date_query, $default_column = 'post_date' ) { + if ( empty( $date_query ) || ! is_array( $date_query ) ) { + return; + } + + if ( isset( $date_query['relation'] ) && 'OR' === strtoupper( $date_query['relation'] ) ) { + $this->relation = 'OR'; + } else { + $this->relation = 'AND'; + } + + // Support for passing time-based keys in the top level of the $date_query array. + if ( ! isset( $date_query[0] ) ) { + $date_query = array( $date_query ); + } + + if ( ! empty( $date_query['column'] ) ) { + $date_query['column'] = esc_sql( $date_query['column'] ); + } else { + $date_query['column'] = esc_sql( $default_column ); + } + + $this->column = $this->validate_column( $this->column ); + + $this->compare = $this->get_compare( $date_query ); + + $this->queries = $this->sanitize_query( $date_query ); + } + + /** + * Recursive-friendly query sanitizer. + * + * Ensures that each query-level clause has a 'relation' key, and that + * each first-order clause contains all the necessary keys from + * `$defaults`. + * + * @since 4.1.0 + * + * @param array $queries + * @param array $parent_query + * + * @return array Sanitized queries. + */ + public function sanitize_query( $queries, $parent_query = null ) { + $cleaned_query = array(); + + $defaults = array( + 'column' => 'post_date', + 'compare' => '=', + 'relation' => 'AND', + ); + + // Numeric keys should always have array values. + foreach ( $queries as $qkey => $qvalue ) { + if ( is_numeric( $qkey ) && ! is_array( $qvalue ) ) { + unset( $queries[ $qkey ] ); + } + } + + // Each query should have a value for each default key. Inherit from the parent when possible. + foreach ( $defaults as $dkey => $dvalue ) { + if ( isset( $queries[ $dkey ] ) ) { + continue; + } + + if ( isset( $parent_query[ $dkey ] ) ) { + $queries[ $dkey ] = $parent_query[ $dkey ]; + } else { + $queries[ $dkey ] = $dvalue; + } + } + + // Validate the dates passed in the query. + if ( $this->is_first_order_clause( $queries ) ) { + $this->validate_date_values( $queries ); + } + + foreach ( $queries as $key => $q ) { + if ( ! is_array( $q ) || in_array( $key, $this->time_keys, true ) ) { + // This is a first-order query. Trust the values and sanitize when building SQL. + $cleaned_query[ $key ] = $q; + } else { + // Any array without a time key is another query, so we recurse. + $cleaned_query[] = $this->sanitize_query( $q, $queries ); + } + } + + return $cleaned_query; + } + + /** + * Determine whether this is a first-order clause. + * + * Checks to see if the current clause has any time-related keys. + * If so, it's first-order. + * + * @since 4.1.0 + * + * @param array $query Query clause. + * @return bool True if this is a first-order clause. + */ + protected function is_first_order_clause( $query ) { + $time_keys = array_intersect( $this->time_keys, array_keys( $query ) ); + return ! empty( $time_keys ); + } + + /** + * Determines and validates what comparison operator to use. + * + * @since 3.7.0 + * + * @param array $query A date query or a date subquery. + * @return string The comparison operator. + */ + public function get_compare( $query ) { + if ( ! empty( $query['compare'] ) && in_array( $query['compare'], array( '=', '!=', '>', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) { + return strtoupper( $query['compare'] ); + } + + return $this->compare; + } + + /** + * Validates the given date_query values and triggers errors if something is not valid. + * + * Note that date queries with invalid date ranges are allowed to + * continue (though of course no items will be found for impossible dates). + * This method only generates debug notices for these cases. + * + * @since 4.1.0 + * + * @param array $date_query The date_query array. + * @return bool True if all values in the query are valid, false if one or more fail. + */ + public function validate_date_values( $date_query = array() ) { + if ( empty( $date_query ) ) { + return false; + } + + $valid = true; + + /* + * Validate 'before' and 'after' up front, then let the + * validation routine continue to be sure that all invalid + * values generate errors too. + */ + if ( array_key_exists( 'before', $date_query ) && is_array( $date_query['before'] ) ) { + $valid = $this->validate_date_values( $date_query['before'] ); + } + + if ( array_key_exists( 'after', $date_query ) && is_array( $date_query['after'] ) ) { + $valid = $this->validate_date_values( $date_query['after'] ); + } + + // Array containing all min-max checks. + $min_max_checks = array(); + + // Days per year. + if ( array_key_exists( 'year', $date_query ) ) { + /* + * If a year exists in the date query, we can use it to get the days. + * If multiple years are provided (as in a BETWEEN), use the first one. + */ + if ( is_array( $date_query['year'] ) ) { + $_year = reset( $date_query['year'] ); + } else { + $_year = $date_query['year']; + } + + $max_days_of_year = gmdate( 'z', mktime( 0, 0, 0, 12, 31, $_year ) ) + 1; + } else { + // Otherwise we use the max of 366 (leap-year). + $max_days_of_year = 366; + } + + $min_max_checks['dayofyear'] = array( + 'min' => 1, + 'max' => $max_days_of_year, + ); + + // Days per week. + $min_max_checks['dayofweek'] = array( + 'min' => 1, + 'max' => 7, + ); + + // Days per week. + $min_max_checks['dayofweek_iso'] = array( + 'min' => 1, + 'max' => 7, + ); + + // Months per year. + $min_max_checks['month'] = array( + 'min' => 1, + 'max' => 12, + ); + + // Weeks per year. + if ( isset( $_year ) ) { + /* + * If we have a specific year, use it to calculate number of weeks. + * Note: the number of weeks in a year is the date in which Dec 28 appears. + */ + $week_count = gmdate( 'W', mktime( 0, 0, 0, 12, 28, $_year ) ); + + } else { + // Otherwise set the week-count to a maximum of 53. + $week_count = 53; + } + + $min_max_checks['week'] = array( + 'min' => 1, + 'max' => $week_count, + ); + + // Days per month. + $min_max_checks['day'] = array( + 'min' => 1, + 'max' => 31, + ); + + // Hours per day. + $min_max_checks['hour'] = array( + 'min' => 0, + 'max' => 23, + ); + + // Minutes per hour. + $min_max_checks['minute'] = array( + 'min' => 0, + 'max' => 59, + ); + + // Seconds per minute. + $min_max_checks['second'] = array( + 'min' => 0, + 'max' => 59, + ); + + // Concatenate and throw a notice for each invalid value. + foreach ( $min_max_checks as $key => $check ) { + if ( ! array_key_exists( $key, $date_query ) ) { + continue; + } + + // Throw a notice for each failing value. + foreach ( (array) $date_query[ $key ] as $_value ) { + $is_between = $_value >= $check['min'] && $_value <= $check['max']; + + if ( ! is_numeric( $_value ) || ! $is_between ) { + $error = sprintf( + /* translators: Date query invalid date message. 1: Invalid value, 2: Type of value, 3: Minimum valid value, 4: Maximum valid value. */ + __( 'Invalid value %1$s for %2$s. Expected value should be between %3$s and %4$s.' ), + '<code>' . esc_html( $_value ) . '</code>', + '<code>' . esc_html( $key ) . '</code>', + '<code>' . esc_html( $check['min'] ) . '</code>', + '<code>' . esc_html( $check['max'] ) . '</code>' + ); + + _doing_it_wrong( __CLASS__, $error, '4.1.0' ); + + $valid = false; + } + } + } + + // If we already have invalid date messages, don't bother running through checkdate(). + if ( ! $valid ) { + return $valid; + } + + $day_month_year_error_msg = ''; + + $day_exists = array_key_exists( 'day', $date_query ) && is_numeric( $date_query['day'] ); + $month_exists = array_key_exists( 'month', $date_query ) && is_numeric( $date_query['month'] ); + $year_exists = array_key_exists( 'year', $date_query ) && is_numeric( $date_query['year'] ); + + if ( $day_exists && $month_exists && $year_exists ) { + // 1. Checking day, month, year combination. + if ( ! wp_checkdate( $date_query['month'], $date_query['day'], $date_query['year'], sprintf( '%s-%s-%s', $date_query['year'], $date_query['month'], $date_query['day'] ) ) ) { + $day_month_year_error_msg = sprintf( + /* translators: 1: Year, 2: Month, 3: Day of month. */ + __( 'The following values do not describe a valid date: year %1$s, month %2$s, day %3$s.' ), + '<code>' . esc_html( $date_query['year'] ) . '</code>', + '<code>' . esc_html( $date_query['month'] ) . '</code>', + '<code>' . esc_html( $date_query['day'] ) . '</code>' + ); + + $valid = false; + } + } elseif ( $day_exists && $month_exists ) { + /* + * 2. checking day, month combination + * We use 2012 because, as a leap year, it's the most permissive. + */ + if ( ! wp_checkdate( $date_query['month'], $date_query['day'], 2012, sprintf( '2012-%s-%s', $date_query['month'], $date_query['day'] ) ) ) { + $day_month_year_error_msg = sprintf( + /* translators: 1: Month, 2: Day of month. */ + __( 'The following values do not describe a valid date: month %1$s, day %2$s.' ), + '<code>' . esc_html( $date_query['month'] ) . '</code>', + '<code>' . esc_html( $date_query['day'] ) . '</code>' + ); + + $valid = false; + } + } + + if ( ! empty( $day_month_year_error_msg ) ) { + _doing_it_wrong( __CLASS__, $day_month_year_error_msg, '4.1.0' ); + } + + return $valid; + } + + /** + * Validates a column name parameter. + * + * Column names without a table prefix (like 'post_date') are checked against a whitelist of + * known tables, and then, if found, have a table prefix (such as 'wp_posts.') prepended. + * Prefixed column names (such as 'wp_posts.post_date') bypass this whitelist check, + * and are only sanitized to remove illegal characters. + * + * @since 3.7.0 + * + * @param string $column The user-supplied column name. + * @return string A validated column name value. + */ + public function validate_column( $column ) { + global $wpdb; + + $valid_columns = array( + 'post_date', + 'post_date_gmt', + 'post_modified', + 'post_modified_gmt', + 'comment_date', + 'comment_date_gmt', + 'user_registered', + 'registered', + 'last_updated', + ); + + // Attempt to detect a table prefix. + if ( false === strpos( $column, '.' ) ) { + /** + * Filters the list of valid date query columns. + * + * @since 3.7.0 + * @since 4.1.0 Added 'user_registered' to the default recognized columns. + * + * @param string[] $valid_columns An array of valid date query columns. Defaults + * are 'post_date', 'post_date_gmt', 'post_modified', + * 'post_modified_gmt', 'comment_date', 'comment_date_gmt', + * 'user_registered' + */ + if ( ! in_array( $column, apply_filters( 'date_query_valid_columns', $valid_columns ) ) ) { + $column = 'post_date'; + } + + $known_columns = array( + $wpdb->posts => array( + 'post_date', + 'post_date_gmt', + 'post_modified', + 'post_modified_gmt', + ), + $wpdb->comments => array( + 'comment_date', + 'comment_date_gmt', + ), + $wpdb->users => array( + 'user_registered', + ), + $wpdb->blogs => array( + 'registered', + 'last_updated', + ), + ); + + // If it's a known column name, add the appropriate table prefix. + foreach ( $known_columns as $table_name => $table_columns ) { + if ( in_array( $column, $table_columns ) ) { + $column = $table_name . '.' . $column; + break; + } + } + } + + // Remove unsafe characters. + return preg_replace( '/[^a-zA-Z0-9_$\.]/', '', $column ); + } + + /** + * Generate WHERE clause to be appended to a main query. + * + * @since 3.7.0 + * + * @return string MySQL WHERE clause. + */ + public function get_sql() { + $sql = $this->get_sql_clauses(); + + $where = $sql['where']; + + /** + * Filters the date query WHERE clause. + * + * @since 3.7.0 + * + * @param string $where WHERE clause of the date query. + * @param WP_Date_Query $this The WP_Date_Query instance. + */ + return apply_filters( 'get_date_sql', $where, $this ); + } + + /** + * Generate SQL clauses to be appended to a main query. + * + * Called by the public WP_Date_Query::get_sql(), this method is abstracted + * out to maintain parity with the other Query classes. + * + * @since 4.1.0 + * + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to the main query. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + protected function get_sql_clauses() { + $sql = $this->get_sql_for_query( $this->queries ); + + if ( ! empty( $sql['where'] ) ) { + $sql['where'] = ' AND ' . $sql['where']; + } + + return $sql; + } + + /** + * Generate SQL clauses for a single query array. + * + * If nested subqueries are found, this method recurses the tree to + * produce the properly nested SQL. + * + * @since 4.1.0 + * + * @param array $query Query to parse. + * @param int $depth Optional. Number of tree levels deep we currently are. + * Used to calculate indentation. Default 0. + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to a single query array. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + protected function get_sql_for_query( $query, $depth = 0 ) { + $sql_chunks = array( + 'join' => array(), + 'where' => array(), + ); + + $sql = array( + 'join' => '', + 'where' => '', + ); + + $indent = ''; + for ( $i = 0; $i < $depth; $i++ ) { + $indent .= ' '; + } + + foreach ( $query as $key => $clause ) { + if ( 'relation' === $key ) { + $relation = $query['relation']; + } elseif ( is_array( $clause ) ) { + + // This is a first-order clause. + if ( $this->is_first_order_clause( $clause ) ) { + $clause_sql = $this->get_sql_for_clause( $clause, $query ); + + $where_count = count( $clause_sql['where'] ); + if ( ! $where_count ) { + $sql_chunks['where'][] = ''; + } elseif ( 1 === $where_count ) { + $sql_chunks['where'][] = $clause_sql['where'][0]; + } else { + $sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )'; + } + + $sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] ); + // This is a subquery, so we recurse. + } else { + $clause_sql = $this->get_sql_for_query( $clause, $depth + 1 ); + + $sql_chunks['where'][] = $clause_sql['where']; + $sql_chunks['join'][] = $clause_sql['join']; + } + } + } + + // Filter to remove empties. + $sql_chunks['join'] = array_filter( $sql_chunks['join'] ); + $sql_chunks['where'] = array_filter( $sql_chunks['where'] ); + + if ( empty( $relation ) ) { + $relation = 'AND'; + } + + // Filter duplicate JOIN clauses and combine into a single string. + if ( ! empty( $sql_chunks['join'] ) ) { + $sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) ); + } + + // Generate a single WHERE clause with proper brackets and indentation. + if ( ! empty( $sql_chunks['where'] ) ) { + $sql['where'] = '( ' . "\n " . $indent . implode( ' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')'; + } + + return $sql; + } + + /** + * Turns a single date clause into pieces for a WHERE clause. + * + * A wrapper for get_sql_for_clause(), included here for backward + * compatibility while retaining the naming convention across Query classes. + * + * @since 3.7.0 + * + * @param array $query Date query arguments. + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to the main query. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + protected function get_sql_for_subquery( $query ) { + return $this->get_sql_for_clause( $query, '' ); + } + + /** + * Turns a first-order date query into SQL for a WHERE clause. + * + * @since 4.1.0 + * + * @param array $query Date query clause. + * @param array $parent_query Parent query of the current date query. + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to the main query. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + protected function get_sql_for_clause( $query, $parent_query ) { + global $wpdb; + + // The sub-parts of a $where part. + $where_parts = array(); + + $column = ( ! empty( $query['column'] ) ) ? esc_sql( $query['column'] ) : $this->column; + + $column = $this->validate_column( $column ); + + $compare = $this->get_compare( $query ); + + $inclusive = ! empty( $query['inclusive'] ); + + // Assign greater- and less-than values. + $lt = '<'; + $gt = '>'; + + if ( $inclusive ) { + $lt .= '='; + $gt .= '='; + } + + // Range queries. + if ( ! empty( $query['after'] ) ) { + $where_parts[] = $wpdb->prepare( "$column $gt %s", $this->build_mysql_datetime( $query['after'], ! $inclusive ) ); + } + if ( ! empty( $query['before'] ) ) { + $where_parts[] = $wpdb->prepare( "$column $lt %s", $this->build_mysql_datetime( $query['before'], $inclusive ) ); + } + // Specific value queries. + + $date_units = array( + 'YEAR' => array( 'year' ), + 'MONTH' => array( 'month', 'monthnum' ), + '_wp_mysql_week' => array( 'week', 'w' ), + 'DAYOFYEAR' => array( 'dayofyear' ), + 'DAYOFMONTH' => array( 'day' ), + 'DAYOFWEEK' => array( 'dayofweek' ), + 'WEEKDAY' => array( 'dayofweek_iso' ), + ); + + // Check of the possible date units and add them to the query. + foreach ( $date_units as $sql_part => $query_parts ) { + foreach ( $query_parts as $query_part ) { + if ( isset( $query[ $query_part ] ) ) { + $value = $this->build_value( $compare, $query[ $query_part ] ); + if ( $value ) { + switch ( $sql_part ) { + case '_wp_mysql_week': + $where_parts[] = _wp_mysql_week( $column ) . " $compare $value"; + break; + case 'WEEKDAY': + $where_parts[] = "$sql_part( $column ) + 1 $compare $value"; + break; + default: + $where_parts[] = "$sql_part( $column ) $compare $value"; + } + + break; + } + } + } + } + + if ( isset( $query['hour'] ) || isset( $query['minute'] ) || isset( $query['second'] ) ) { + // Avoid notices. + foreach ( array( 'hour', 'minute', 'second' ) as $unit ) { + if ( ! isset( $query[ $unit ] ) ) { + $query[ $unit ] = null; + } + } + + $time_query = $this->build_time_query( $column, $compare, $query['hour'], $query['minute'], $query['second'] ); + if ( $time_query ) { + $where_parts[] = $time_query; + } + } + + /* + * Return an array of 'join' and 'where' for compatibility + * with other query classes. + */ + return array( + 'where' => $where_parts, + 'join' => array(), + ); + } + + /** + * Builds and validates a value string based on the comparison operator. + * + * @since 3.7.0 + * + * @param string $compare The compare operator to use + * @param string|array $value The value + * @return string|false|int The value to be used in SQL or false on error. + */ + public function build_value( $compare, $value ) { + if ( ! isset( $value ) ) { + return false; + } + + switch ( $compare ) { + case 'IN': + case 'NOT IN': + $value = (array) $value; + + // Remove non-numeric values. + $value = array_filter( $value, 'is_numeric' ); + + if ( empty( $value ) ) { + return false; + } + + return '(' . implode( ',', array_map( 'intval', $value ) ) . ')'; + + case 'BETWEEN': + case 'NOT BETWEEN': + if ( ! is_array( $value ) || 2 != count( $value ) ) { + $value = array( $value, $value ); + } else { + $value = array_values( $value ); + } + + // If either value is non-numeric, bail. + foreach ( $value as $v ) { + if ( ! is_numeric( $v ) ) { + return false; + } + } + + $value = array_map( 'intval', $value ); + + return $value[0] . ' AND ' . $value[1]; + + default: + if ( ! is_numeric( $value ) ) { + return false; + } + + return (int) $value; + } + } + + /** + * Builds a MySQL format date/time based on some query parameters. + * + * You can pass an array of values (year, month, etc.) with missing parameter values being defaulted to + * either the maximum or minimum values (controlled by the $default_to parameter). Alternatively you can + * pass a string that will be passed to date_create(). + * + * @since 3.7.0 + * + * @param string|array $datetime An array of parameters or a strotime() string + * @param bool $default_to_max Whether to round up incomplete dates. Supported by values + * of $datetime that are arrays, or string values that are a + * subset of MySQL date format ('Y', 'Y-m', 'Y-m-d', 'Y-m-d H:i'). + * Default: false. + * @return string|false A MySQL format date/time or false on failure + */ + public function build_mysql_datetime( $datetime, $default_to_max = false ) { + if ( ! is_array( $datetime ) ) { + + /* + * Try to parse some common date formats, so we can detect + * the level of precision and support the 'inclusive' parameter. + */ + if ( preg_match( '/^(\d{4})$/', $datetime, $matches ) ) { + // Y + $datetime = array( + 'year' => intval( $matches[1] ), + ); + + } elseif ( preg_match( '/^(\d{4})\-(\d{2})$/', $datetime, $matches ) ) { + // Y-m + $datetime = array( + 'year' => intval( $matches[1] ), + 'month' => intval( $matches[2] ), + ); + + } elseif ( preg_match( '/^(\d{4})\-(\d{2})\-(\d{2})$/', $datetime, $matches ) ) { + // Y-m-d + $datetime = array( + 'year' => intval( $matches[1] ), + 'month' => intval( $matches[2] ), + 'day' => intval( $matches[3] ), + ); + + } elseif ( preg_match( '/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2})$/', $datetime, $matches ) ) { + // Y-m-d H:i + $datetime = array( + 'year' => intval( $matches[1] ), + 'month' => intval( $matches[2] ), + 'day' => intval( $matches[3] ), + 'hour' => intval( $matches[4] ), + 'minute' => intval( $matches[5] ), + ); + } + + // If no match is found, we don't support default_to_max. + if ( ! is_array( $datetime ) ) { + $wp_timezone = wp_timezone(); + + // Assume local timezone if not provided. + $dt = date_create( $datetime, $wp_timezone ); + + if ( false === $dt ) { + return gmdate( 'Y-m-d H:i:s', false ); + } + + return $dt->setTimezone( $wp_timezone )->format( 'Y-m-d H:i:s' ); + } + } + + $datetime = array_map( 'absint', $datetime ); + + if ( ! isset( $datetime['year'] ) ) { + $datetime['year'] = current_time( 'Y' ); + } + + if ( ! isset( $datetime['month'] ) ) { + $datetime['month'] = ( $default_to_max ) ? 12 : 1; + } + + if ( ! isset( $datetime['day'] ) ) { + $datetime['day'] = ( $default_to_max ) ? (int) gmdate( 't', mktime( 0, 0, 0, $datetime['month'], 1, $datetime['year'] ) ) : 1; + } + + if ( ! isset( $datetime['hour'] ) ) { + $datetime['hour'] = ( $default_to_max ) ? 23 : 0; + } + + if ( ! isset( $datetime['minute'] ) ) { + $datetime['minute'] = ( $default_to_max ) ? 59 : 0; + } + + if ( ! isset( $datetime['second'] ) ) { + $datetime['second'] = ( $default_to_max ) ? 59 : 0; + } + + return sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $datetime['year'], $datetime['month'], $datetime['day'], $datetime['hour'], $datetime['minute'], $datetime['second'] ); + } + + /** + * Builds a query string for comparing time values (hour, minute, second). + * + * If just hour, minute, or second is set than a normal comparison will be done. + * However if multiple values are passed, a pseudo-decimal time will be created + * in order to be able to accurately compare against. + * + * @since 3.7.0 + * + * @param string $column The column to query against. Needs to be pre-validated! + * @param string $compare The comparison operator. Needs to be pre-validated! + * @param int|null $hour Optional. An hour value (0-23). + * @param int|null $minute Optional. A minute value (0-59). + * @param int|null $second Optional. A second value (0-59). + * @return string|false A query part or false on failure. + */ + public function build_time_query( $column, $compare, $hour = null, $minute = null, $second = null ) { + global $wpdb; + + // Have to have at least one. + if ( ! isset( $hour ) && ! isset( $minute ) && ! isset( $second ) ) { + return false; + } + + // Complex combined queries aren't supported for multi-value queries. + if ( in_array( $compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) { + $return = array(); + + $value = $this->build_value( $compare, $hour ); + if ( false !== $value ) { + $return[] = "HOUR( $column ) $compare $value"; + } + + $value = $this->build_value( $compare, $minute ); + if ( false !== $value ) { + $return[] = "MINUTE( $column ) $compare $value"; + } + + $value = $this->build_value( $compare, $second ); + if ( false !== $value ) { + $return[] = "SECOND( $column ) $compare $value"; + } + + return implode( ' AND ', $return ); + } + + // Cases where just one unit is set. + if ( isset( $hour ) && ! isset( $minute ) && ! isset( $second ) ) { + $value = $this->build_value( $compare, $hour ); + if ( false !== $value ) { + return "HOUR( $column ) $compare $value"; + } + } elseif ( ! isset( $hour ) && isset( $minute ) && ! isset( $second ) ) { + $value = $this->build_value( $compare, $minute ); + if ( false !== $value ) { + return "MINUTE( $column ) $compare $value"; + } + } elseif ( ! isset( $hour ) && ! isset( $minute ) && isset( $second ) ) { + $value = $this->build_value( $compare, $second ); + if ( false !== $value ) { + return "SECOND( $column ) $compare $value"; + } + } + + // Single units were already handled. Since hour & second isn't allowed, minute must to be set. + if ( ! isset( $minute ) ) { + return false; + } + + $format = ''; + $time = ''; + + // Hour. + if ( null !== $hour ) { + $format .= '%H.'; + $time .= sprintf( '%02d', $hour ) . '.'; + } else { + $format .= '0.'; + $time .= '0.'; + } + + // Minute. + $format .= '%i'; + $time .= sprintf( '%02d', $minute ); + + if ( isset( $second ) ) { + $format .= '%s'; + $time .= sprintf( '%02d', $second ); + } + + return $wpdb->prepare( "DATE_FORMAT( $column, %s ) $compare %f", $format, $time ); + } +} diff --git a/wp-includes/class-wp-dependency.php b/wp-includes/class-wp-dependency.php new file mode 100644 index 0000000..deb2b37 --- /dev/null +++ b/wp-includes/class-wp-dependency.php @@ -0,0 +1,136 @@ +<?php +/** + * Dependencies API: _WP_Dependency class + * + * @since 4.7.0 + * + * @package WordPress + * @subpackage Dependencies + */ + +/** + * Class _WP_Dependency + * + * Helper class to register a handle and associated data. + * + * @access private + * @since 2.6.0 + */ +class _WP_Dependency { + /** + * The handle name. + * + * @since 2.6.0 + * @var null + */ + public $handle; + + /** + * The handle source. + * + * @since 2.6.0 + * @var null + */ + public $src; + + /** + * An array of handle dependencies. + * + * @since 2.6.0 + * @var string[] + */ + public $deps = array(); + + /** + * The handle version. + * + * Used for cache-busting. + * + * @since 2.6.0 + * @var bool|string + */ + public $ver = false; + + /** + * Additional arguments for the handle. + * + * @since 2.6.0 + * @var null + */ + public $args = null; // Custom property, such as $in_footer or $media. + + /** + * Extra data to supply to the handle. + * + * @since 2.6.0 + * @var array + */ + public $extra = array(); + + /** + * Translation textdomain set for this dependency. + * + * @since 5.0.0 + * @var string + */ + public $textdomain; + + /** + * Translation path set for this dependency. + * + * @since 5.0.0 + * @var string + */ + public $translations_path; + + /** + * Setup dependencies. + * + * @since 2.6.0 + * @since 5.3.0 Formalized the existing `...$args` parameter by adding it + * to the function signature. + * + * @param ...$args Dependency information. + */ + public function __construct( ...$args ) { + list( $this->handle, $this->src, $this->deps, $this->ver, $this->args ) = $args; + if ( ! is_array( $this->deps ) ) { + $this->deps = array(); + } + } + + /** + * Add handle data. + * + * @since 2.6.0 + * + * @param string $name The data key to add. + * @param mixed $data The data value to add. + * @return bool False if not scalar, true otherwise. + */ + public function add_data( $name, $data ) { + if ( ! is_scalar( $name ) ) { + return false; + } + $this->extra[ $name ] = $data; + return true; + } + + /** + * Sets the translation domain for this dependency. + * + * @since 5.0.0 + * + * @param string $domain The translation textdomain. + * @param string $path Optional. The full file path to the directory containing translation files. + * @return bool False if $domain is not a string, true otherwise. + */ + public function set_translations( $domain, $path = null ) { + if ( ! is_string( $domain ) ) { + return false; + } + $this->textdomain = $domain; + $this->translations_path = $path; + return true; + } +} diff --git a/wp-includes/class-wp-editor.php b/wp-includes/class-wp-editor.php new file mode 100644 index 0000000..4dcdd85 --- /dev/null +++ b/wp-includes/class-wp-editor.php @@ -0,0 +1,1896 @@ +<?php +/** + * Facilitates adding of the WordPress editor as used on the Write and Edit screens. + * + * @package WordPress + * @since 3.3.0 + * + * Private, not included by default. See wp_editor() in wp-includes/general-template.php. + */ + +final class _WP_Editors { + public static $mce_locale; + + private static $mce_settings = array(); + private static $qt_settings = array(); + private static $plugins = array(); + private static $qt_buttons = array(); + private static $ext_plugins; + private static $baseurl; + private static $first_init; + private static $this_tinymce = false; + private static $this_quicktags = false; + private static $has_tinymce = false; + private static $has_quicktags = false; + private static $has_medialib = false; + private static $editor_buttons_css = true; + private static $drag_drop_upload = false; + private static $translation; + private static $tinymce_scripts_printed = false; + private static $link_dialog_printed = false; + + private function __construct() {} + + /** + * Parse default arguments for the editor instance. + * + * @since 3.3.0 + * + * @param string $editor_id HTML ID for the textarea and TinyMCE and Quicktags instances. + * Should not contain square brackets. + * @param array $settings { + * Array of editor arguments. + * + * @type bool $wpautop Whether to use wpautop(). Default true. + * @type bool $media_buttons Whether to show the Add Media/other media buttons. + * @type string $default_editor When both TinyMCE and Quicktags are used, set which + * editor is shown on page load. Default empty. + * @type bool $drag_drop_upload Whether to enable drag & drop on the editor uploading. Default false. + * Requires the media modal. + * @type string $textarea_name Give the textarea a unique name here. Square brackets + * can be used here. Default $editor_id. + * @type int $textarea_rows Number rows in the editor textarea. Default 20. + * @type string|int $tabindex Tabindex value to use. Default empty. + * @type string $tabfocus_elements The previous and next element ID to move the focus to + * when pressing the Tab key in TinyMCE. Default ':prev,:next'. + * @type string $editor_css Intended for extra styles for both Visual and Text editors. + * Should include `<style>` tags, and can use "scoped". Default empty. + * @type string $editor_class Extra classes to add to the editor textarea element. Default empty. + * @type bool $teeny Whether to output the minimal editor config. Examples include + * Press This and the Comment editor. Default false. + * @type bool $dfw Deprecated in 4.1. Unused. + * @type bool|array $tinymce Whether to load TinyMCE. Can be used to pass settings directly to + * TinyMCE using an array. Default true. + * @type bool|array $quicktags Whether to load Quicktags. Can be used to pass settings directly to + * Quicktags using an array. Default true. + * } + * @return array Parsed arguments array. + */ + public static function parse_settings( $editor_id, $settings ) { + + /** + * Filters the wp_editor() settings. + * + * @since 4.0.0 + * + * @see _WP_Editors::parse_settings() + * + * @param array $settings Array of editor arguments. + * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' + * when called from block editor's Classic block. + */ + $settings = apply_filters( 'wp_editor_settings', $settings, $editor_id ); + + $set = wp_parse_args( + $settings, + array( + // Disable autop if the current post has blocks in it. + 'wpautop' => ! has_blocks(), + 'media_buttons' => true, + 'default_editor' => '', + 'drag_drop_upload' => false, + 'textarea_name' => $editor_id, + 'textarea_rows' => 20, + 'tabindex' => '', + 'tabfocus_elements' => ':prev,:next', + 'editor_css' => '', + 'editor_class' => '', + 'teeny' => false, + '_content_editor_dfw' => false, + 'tinymce' => true, + 'quicktags' => true, + ) + ); + + self::$this_tinymce = ( $set['tinymce'] && user_can_richedit() ); + + if ( self::$this_tinymce ) { + if ( false !== strpos( $editor_id, '[' ) ) { + self::$this_tinymce = false; + _deprecated_argument( 'wp_editor()', '3.9.0', 'TinyMCE editor IDs cannot have brackets.' ); + } + } + + self::$this_quicktags = (bool) $set['quicktags']; + + if ( self::$this_tinymce ) { + self::$has_tinymce = true; + } + + if ( self::$this_quicktags ) { + self::$has_quicktags = true; + } + + if ( empty( $set['editor_height'] ) ) { + return $set; + } + + if ( 'content' === $editor_id && empty( $set['tinymce']['wp_autoresize_on'] ) ) { + // A cookie (set when a user resizes the editor) overrides the height. + $cookie = (int) get_user_setting( 'ed_size' ); + + if ( $cookie ) { + $set['editor_height'] = $cookie; + } + } + + if ( $set['editor_height'] < 50 ) { + $set['editor_height'] = 50; + } elseif ( $set['editor_height'] > 5000 ) { + $set['editor_height'] = 5000; + } + + return $set; + } + + /** + * Outputs the HTML for a single instance of the editor. + * + * @since 3.3.0 + * + * @param string $content Initial content for the editor. + * @param string $editor_id HTML ID for the textarea and TinyMCE and Quicktags instances. + * Should not contain square brackets. + * @param array $settings See _WP_Editors::parse_settings() for description. + */ + public static function editor( $content, $editor_id, $settings = array() ) { + $set = self::parse_settings( $editor_id, $settings ); + $editor_class = ' class="' . trim( esc_attr( $set['editor_class'] ) . ' wp-editor-area' ) . '"'; + $tabindex = $set['tabindex'] ? ' tabindex="' . (int) $set['tabindex'] . '"' : ''; + $default_editor = 'html'; + $buttons = ''; + $autocomplete = ''; + $editor_id_attr = esc_attr( $editor_id ); + + if ( $set['drag_drop_upload'] ) { + self::$drag_drop_upload = true; + } + + if ( ! empty( $set['editor_height'] ) ) { + $height = ' style="height: ' . (int) $set['editor_height'] . 'px"'; + } else { + $height = ' rows="' . (int) $set['textarea_rows'] . '"'; + } + + if ( ! current_user_can( 'upload_files' ) ) { + $set['media_buttons'] = false; + } + + if ( self::$this_tinymce ) { + $autocomplete = ' autocomplete="off"'; + + if ( self::$this_quicktags ) { + $default_editor = $set['default_editor'] ? $set['default_editor'] : wp_default_editor(); + // 'html' is used for the "Text" editor tab. + if ( 'html' !== $default_editor ) { + $default_editor = 'tinymce'; + } + + $buttons .= '<button type="button" id="' . $editor_id_attr . '-tmce" class="wp-switch-editor switch-tmce"' . + ' data-wp-editor-id="' . $editor_id_attr . '">' . _x( 'Visual', 'Name for the Visual editor tab' ) . "</button>\n"; + $buttons .= '<button type="button" id="' . $editor_id_attr . '-html" class="wp-switch-editor switch-html"' . + ' data-wp-editor-id="' . $editor_id_attr . '">' . _x( 'Text', 'Name for the Text editor tab (formerly HTML)' ) . "</button>\n"; + } else { + $default_editor = 'tinymce'; + } + } + + $switch_class = 'html' === $default_editor ? 'html-active' : 'tmce-active'; + $wrap_class = 'wp-core-ui wp-editor-wrap ' . $switch_class; + + if ( $set['_content_editor_dfw'] ) { + $wrap_class .= ' has-dfw'; + } + + echo '<div id="wp-' . $editor_id_attr . '-wrap" class="' . $wrap_class . '">'; + + if ( self::$editor_buttons_css ) { + wp_print_styles( 'editor-buttons' ); + self::$editor_buttons_css = false; + } + + if ( ! empty( $set['editor_css'] ) ) { + echo $set['editor_css'] . "\n"; + } + + if ( ! empty( $buttons ) || $set['media_buttons'] ) { + echo '<div id="wp-' . $editor_id_attr . '-editor-tools" class="wp-editor-tools hide-if-no-js">'; + + if ( $set['media_buttons'] ) { + self::$has_medialib = true; + + if ( ! function_exists( 'media_buttons' ) ) { + require ABSPATH . 'wp-admin/includes/media.php'; + } + + echo '<div id="wp-' . $editor_id_attr . '-media-buttons" class="wp-media-buttons">'; + + /** + * Fires after the default media button(s) are displayed. + * + * @since 2.5.0 + * + * @param string $editor_id Unique editor identifier, e.g. 'content'. + */ + do_action( 'media_buttons', $editor_id ); + echo "</div>\n"; + } + + echo '<div class="wp-editor-tabs">' . $buttons . "</div>\n"; + echo "</div>\n"; + } + + $quicktags_toolbar = ''; + + if ( self::$this_quicktags ) { + if ( 'content' === $editor_id && ! empty( $GLOBALS['current_screen'] ) && 'post' === $GLOBALS['current_screen']->base ) { + $toolbar_id = 'ed_toolbar'; + } else { + $toolbar_id = 'qt_' . $editor_id_attr . '_toolbar'; + } + + $quicktags_toolbar = '<div id="' . $toolbar_id . '" class="quicktags-toolbar"></div>'; + } + + /** + * Filters the HTML markup output that displays the editor. + * + * @since 2.1.0 + * + * @param string $output Editor's HTML markup. + */ + $the_editor = apply_filters( + 'the_editor', + '<div id="wp-' . $editor_id_attr . '-editor-container" class="wp-editor-container">' . + $quicktags_toolbar . + '<textarea' . $editor_class . $height . $tabindex . $autocomplete . ' cols="40" name="' . esc_attr( $set['textarea_name'] ) . '" ' . + 'id="' . $editor_id_attr . '">%s</textarea></div>' + ); + + // Prepare the content for the Visual or Text editor, only when TinyMCE is used (back-compat). + if ( self::$this_tinymce ) { + add_filter( 'the_editor_content', 'format_for_editor', 10, 2 ); + } + + /** + * Filters the default editor content. + * + * @since 2.1.0 + * + * @param string $content Default editor content. + * @param string $default_editor The default editor for the current user. + * Either 'html' or 'tinymce'. + */ + $content = apply_filters( 'the_editor_content', $content, $default_editor ); + + // Remove the filter as the next editor on the same page may not need it. + if ( self::$this_tinymce ) { + remove_filter( 'the_editor_content', 'format_for_editor' ); + } + + // Back-compat for the `htmledit_pre` and `richedit_pre` filters. + if ( 'html' === $default_editor && has_filter( 'htmledit_pre' ) ) { + /** This filter is documented in wp-includes/deprecated.php */ + $content = apply_filters_deprecated( 'htmledit_pre', array( $content ), '4.3.0', 'format_for_editor' ); + } elseif ( 'tinymce' === $default_editor && has_filter( 'richedit_pre' ) ) { + /** This filter is documented in wp-includes/deprecated.php */ + $content = apply_filters_deprecated( 'richedit_pre', array( $content ), '4.3.0', 'format_for_editor' ); + } + + if ( false !== stripos( $content, 'textarea' ) ) { + $content = preg_replace( '%</textarea%i', '</textarea', $content ); + } + + printf( $the_editor, $content ); + echo "\n</div>\n\n"; + + self::editor_settings( $editor_id, $set ); + } + + /** + * @since 3.3.0 + * + * @global string $tinymce_version + * + * @param string $editor_id Unique editor identifier, e.g. 'content'. + * @param array $set Array of editor arguments. + */ + public static function editor_settings( $editor_id, $set ) { + global $tinymce_version; + + if ( empty( self::$first_init ) ) { + if ( is_admin() ) { + add_action( 'admin_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 ); + add_action( 'admin_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 ); + add_action( 'admin_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 ); + } else { + add_action( 'wp_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 ); + add_action( 'wp_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 ); + add_action( 'wp_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 ); + } + } + + if ( self::$this_quicktags ) { + + $qtInit = array( + 'id' => $editor_id, + 'buttons' => '', + ); + + if ( is_array( $set['quicktags'] ) ) { + $qtInit = array_merge( $qtInit, $set['quicktags'] ); + } + + if ( empty( $qtInit['buttons'] ) ) { + $qtInit['buttons'] = 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close'; + } + + if ( $set['_content_editor_dfw'] ) { + $qtInit['buttons'] .= ',dfw'; + } + + /** + * Filters the Quicktags settings. + * + * @since 3.3.0 + * + * @param array $qtInit Quicktags settings. + * @param string $editor_id Unique editor identifier, e.g. 'content'. + */ + $qtInit = apply_filters( 'quicktags_settings', $qtInit, $editor_id ); + + self::$qt_settings[ $editor_id ] = $qtInit; + + self::$qt_buttons = array_merge( self::$qt_buttons, explode( ',', $qtInit['buttons'] ) ); + } + + if ( self::$this_tinymce ) { + + if ( empty( self::$first_init ) ) { + $baseurl = self::get_baseurl(); + $mce_locale = self::get_mce_locale(); + $ext_plugins = ''; + + if ( $set['teeny'] ) { + + /** + * Filters the list of teenyMCE plugins. + * + * @since 2.7.0 + * @since 3.3.0 The `$editor_id` parameter was added. + * + * @param array $plugins An array of teenyMCE plugins. + * @param string $editor_id Unique editor identifier, e.g. 'content'. + */ + $plugins = apply_filters( + 'teeny_mce_plugins', + array( + 'colorpicker', + 'lists', + 'fullscreen', + 'image', + 'wordpress', + 'wpeditimage', + 'wplink', + ), + $editor_id + ); + } else { + + /** + * Filters the list of TinyMCE external plugins. + * + * The filter takes an associative array of external plugins for + * TinyMCE in the form 'plugin_name' => 'url'. + * + * The url should be absolute, and should include the js filename + * to be loaded. For example: + * 'myplugin' => 'http://mysite.com/wp-content/plugins/myfolder/mce_plugin.js'. + * + * If the external plugin adds a button, it should be added with + * one of the 'mce_buttons' filters. + * + * @since 2.5.0 + * @since 5.3.0 The `$editor_id` parameter was added. + * + * @param array $external_plugins An array of external TinyMCE plugins. + * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' + * when called from block editor's Classic block. + */ + $mce_external_plugins = apply_filters( 'mce_external_plugins', array(), $editor_id ); + + $plugins = array( + 'charmap', + 'colorpicker', + 'hr', + 'lists', + 'media', + 'paste', + 'tabfocus', + 'textcolor', + 'fullscreen', + 'wordpress', + 'wpautoresize', + 'wpeditimage', + 'wpemoji', + 'wpgallery', + 'wplink', + 'wpdialogs', + 'wptextpattern', + 'wpview', + ); + + if ( ! self::$has_medialib ) { + $plugins[] = 'image'; + } + + /** + * Filters the list of default TinyMCE plugins. + * + * The filter specifies which of the default plugins included + * in WordPress should be added to the TinyMCE instance. + * + * @since 3.3.0 + * @since 5.3.0 The `$editor_id` parameter was added. + * + * @param array $plugins An array of default TinyMCE plugins. + * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' + * when called from block editor's Classic block. + */ + $plugins = array_unique( apply_filters( 'tiny_mce_plugins', $plugins, $editor_id ) ); + + $key = array_search( 'spellchecker', $plugins ); + if ( false !== $key ) { + // Remove 'spellchecker' from the internal plugins if added with 'tiny_mce_plugins' filter to prevent errors. + // It can be added with 'mce_external_plugins'. + unset( $plugins[ $key ] ); + } + + if ( ! empty( $mce_external_plugins ) ) { + + /** + * Filters the translations loaded for external TinyMCE 3.x plugins. + * + * The filter takes an associative array ('plugin_name' => 'path') + * where 'path' is the include path to the file. + * + * The language file should follow the same format as wp_mce_translation(), + * and should define a variable ($strings) that holds all translated strings. + * + * @since 2.5.0 + * @since 5.3.0 The `$editor_id` parameter was added. + * + * @param array $translations Translations for external TinyMCE plugins. + * @param string $editor_id Unique editor identifier, e.g. 'content'. + */ + $mce_external_languages = apply_filters( 'mce_external_languages', array(), $editor_id ); + + $loaded_langs = array(); + $strings = ''; + + if ( ! empty( $mce_external_languages ) ) { + foreach ( $mce_external_languages as $name => $path ) { + if ( @is_file( $path ) && @is_readable( $path ) ) { + include_once $path; + $ext_plugins .= $strings . "\n"; + $loaded_langs[] = $name; + } + } + } + + foreach ( $mce_external_plugins as $name => $url ) { + if ( in_array( $name, $plugins, true ) ) { + unset( $mce_external_plugins[ $name ] ); + continue; + } + + $url = set_url_scheme( $url ); + $mce_external_plugins[ $name ] = $url; + $plugurl = dirname( $url ); + $strings = ''; + + // Try to load langs/[locale].js and langs/[locale]_dlg.js. + if ( ! in_array( $name, $loaded_langs, true ) ) { + $path = str_replace( content_url(), '', $plugurl ); + $path = WP_CONTENT_DIR . $path . '/langs/'; + + $path = trailingslashit( realpath( $path ) ); + + if ( @is_file( $path . $mce_locale . '.js' ) ) { + $strings .= @file_get_contents( $path . $mce_locale . '.js' ) . "\n"; + } + + if ( @is_file( $path . $mce_locale . '_dlg.js' ) ) { + $strings .= @file_get_contents( $path . $mce_locale . '_dlg.js' ) . "\n"; + } + + if ( 'en' != $mce_locale && empty( $strings ) ) { + if ( @is_file( $path . 'en.js' ) ) { + $str1 = @file_get_contents( $path . 'en.js' ); + $strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str1, 1 ) . "\n"; + } + + if ( @is_file( $path . 'en_dlg.js' ) ) { + $str2 = @file_get_contents( $path . 'en_dlg.js' ); + $strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str2, 1 ) . "\n"; + } + } + + if ( ! empty( $strings ) ) { + $ext_plugins .= "\n" . $strings . "\n"; + } + } + + $ext_plugins .= 'tinyMCEPreInit.load_ext("' . $plugurl . '", "' . $mce_locale . '");' . "\n"; + } + } + } + + self::$plugins = $plugins; + self::$ext_plugins = $ext_plugins; + + $settings = self::default_settings(); + $settings['plugins'] = implode( ',', $plugins ); + + if ( ! empty( $mce_external_plugins ) ) { + $settings['external_plugins'] = wp_json_encode( $mce_external_plugins ); + } + + /** This filter is documented in wp-admin/includes/media.php */ + if ( apply_filters( 'disable_captions', '' ) ) { + $settings['wpeditimage_disable_captions'] = true; + } + + $mce_css = $settings['content_css']; + + /* + * The `editor-style.css` added by the theme is generally intended for the editor instance on the Edit Post screen. + * Plugins that use wp_editor() on the front-end can decide whether to add the theme stylesheet + * by using `get_editor_stylesheets()` and the `mce_css` or `tiny_mce_before_init` filters, see below. + */ + if ( is_admin() ) { + $editor_styles = get_editor_stylesheets(); + + if ( ! empty( $editor_styles ) ) { + // Force urlencoding of commas. + foreach ( $editor_styles as $key => $url ) { + if ( strpos( $url, ',' ) !== false ) { + $editor_styles[ $key ] = str_replace( ',', '%2C', $url ); + } + } + + $mce_css .= ',' . implode( ',', $editor_styles ); + } + } + + /** + * Filters the comma-delimited list of stylesheets to load in TinyMCE. + * + * @since 2.1.0 + * + * @param string $stylesheets Comma-delimited list of stylesheets. + */ + $mce_css = trim( apply_filters( 'mce_css', $mce_css ), ' ,' ); + + if ( ! empty( $mce_css ) ) { + $settings['content_css'] = $mce_css; + } else { + unset( $settings['content_css'] ); + } + + self::$first_init = $settings; + } + + if ( $set['teeny'] ) { + $mce_buttons = array( + 'bold', + 'italic', + 'underline', + 'blockquote', + 'strikethrough', + 'bullist', + 'numlist', + 'alignleft', + 'aligncenter', + 'alignright', + 'undo', + 'redo', + 'link', + 'fullscreen', + ); + + /** + * Filters the list of teenyMCE buttons (Text tab). + * + * @since 2.7.0 + * @since 3.3.0 The `$editor_id` parameter was added. + * + * @param array $mce_buttons An array of teenyMCE buttons. + * @param string $editor_id Unique editor identifier, e.g. 'content'. + */ + $mce_buttons = apply_filters( 'teeny_mce_buttons', $mce_buttons, $editor_id ); + $mce_buttons_2 = array(); + $mce_buttons_3 = array(); + $mce_buttons_4 = array(); + } else { + $mce_buttons = array( + 'formatselect', + 'bold', + 'italic', + 'bullist', + 'numlist', + 'blockquote', + 'alignleft', + 'aligncenter', + 'alignright', + 'link', + 'wp_more', + 'spellchecker', + ); + + if ( ! wp_is_mobile() ) { + if ( $set['_content_editor_dfw'] ) { + $mce_buttons[] = 'wp_adv'; + $mce_buttons[] = 'dfw'; + } else { + $mce_buttons[] = 'fullscreen'; + $mce_buttons[] = 'wp_adv'; + } + } else { + $mce_buttons[] = 'wp_adv'; + } + + /** + * Filters the first-row list of TinyMCE buttons (Visual tab). + * + * @since 2.0.0 + * @since 3.3.0 The `$editor_id` parameter was added. + * + * @param array $mce_buttons First-row list of buttons. + * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' + * when called from block editor's Classic block. + */ + $mce_buttons = apply_filters( 'mce_buttons', $mce_buttons, $editor_id ); + + $mce_buttons_2 = array( + 'strikethrough', + 'hr', + 'forecolor', + 'pastetext', + 'removeformat', + 'charmap', + 'outdent', + 'indent', + 'undo', + 'redo', + ); + + if ( ! wp_is_mobile() ) { + $mce_buttons_2[] = 'wp_help'; + } + + /** + * Filters the second-row list of TinyMCE buttons (Visual tab). + * + * @since 2.0.0 + * @since 3.3.0 The `$editor_id` parameter was added. + * + * @param array $mce_buttons_2 Second-row list of buttons. + * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' + * when called from block editor's Classic block. + */ + $mce_buttons_2 = apply_filters( 'mce_buttons_2', $mce_buttons_2, $editor_id ); + + /** + * Filters the third-row list of TinyMCE buttons (Visual tab). + * + * @since 2.0.0 + * @since 3.3.0 The `$editor_id` parameter was added. + * + * @param array $mce_buttons_3 Third-row list of buttons. + * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' + * when called from block editor's Classic block. + */ + $mce_buttons_3 = apply_filters( 'mce_buttons_3', array(), $editor_id ); + + /** + * Filters the fourth-row list of TinyMCE buttons (Visual tab). + * + * @since 2.5.0 + * @since 3.3.0 The `$editor_id` parameter was added. + * + * @param array $mce_buttons_4 Fourth-row list of buttons. + * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' + * when called from block editor's Classic block. + */ + $mce_buttons_4 = apply_filters( 'mce_buttons_4', array(), $editor_id ); + } + + $body_class = $editor_id; + + $post = get_post(); + if ( $post ) { + $body_class .= ' post-type-' . sanitize_html_class( $post->post_type ) . ' post-status-' . sanitize_html_class( $post->post_status ); + + if ( post_type_supports( $post->post_type, 'post-formats' ) ) { + $post_format = get_post_format( $post ); + if ( $post_format && ! is_wp_error( $post_format ) ) { + $body_class .= ' post-format-' . sanitize_html_class( $post_format ); + } else { + $body_class .= ' post-format-standard'; + } + } + + $page_template = get_page_template_slug( $post ); + + if ( false !== $page_template ) { + $page_template = empty( $page_template ) ? 'default' : str_replace( '.', '-', basename( $page_template, '.php' ) ); + $body_class .= ' page-template-' . sanitize_html_class( $page_template ); + } + } + + $body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) ); + + if ( ! empty( $set['tinymce']['body_class'] ) ) { + $body_class .= ' ' . $set['tinymce']['body_class']; + unset( $set['tinymce']['body_class'] ); + } + + $mceInit = array( + 'selector' => "#$editor_id", + 'wpautop' => (bool) $set['wpautop'], + 'indent' => ! $set['wpautop'], + 'toolbar1' => implode( ',', $mce_buttons ), + 'toolbar2' => implode( ',', $mce_buttons_2 ), + 'toolbar3' => implode( ',', $mce_buttons_3 ), + 'toolbar4' => implode( ',', $mce_buttons_4 ), + 'tabfocus_elements' => $set['tabfocus_elements'], + 'body_class' => $body_class, + ); + + // Merge with the first part of the init array. + $mceInit = array_merge( self::$first_init, $mceInit ); + + if ( is_array( $set['tinymce'] ) ) { + $mceInit = array_merge( $mceInit, $set['tinymce'] ); + } + + /* + * For people who really REALLY know what they're doing with TinyMCE + * You can modify $mceInit to add, remove, change elements of the config + * before tinyMCE.init. Setting "valid_elements", "invalid_elements" + * and "extended_valid_elements" can be done through this filter. Best + * is to use the default cleanup by not specifying valid_elements, + * as TinyMCE checks against the full set of HTML 5.0 elements and attributes. + */ + if ( $set['teeny'] ) { + + /** + * Filters the teenyMCE config before init. + * + * @since 2.7.0 + * @since 3.3.0 The `$editor_id` parameter was added. + * + * @param array $mceInit An array with teenyMCE config. + * @param string $editor_id Unique editor identifier, e.g. 'content'. + */ + $mceInit = apply_filters( 'teeny_mce_before_init', $mceInit, $editor_id ); + } else { + + /** + * Filters the TinyMCE config before init. + * + * @since 2.5.0 + * @since 3.3.0 The `$editor_id` parameter was added. + * + * @param array $mceInit An array with TinyMCE config. + * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' + * when called from block editor's Classic block. + */ + $mceInit = apply_filters( 'tiny_mce_before_init', $mceInit, $editor_id ); + } + + if ( empty( $mceInit['toolbar3'] ) && ! empty( $mceInit['toolbar4'] ) ) { + $mceInit['toolbar3'] = $mceInit['toolbar4']; + $mceInit['toolbar4'] = ''; + } + + self::$mce_settings[ $editor_id ] = $mceInit; + } // End if self::$this_tinymce. + } + + /** + * @since 3.3.0 + * + * @param array $init + * @return string + */ + private static function _parse_init( $init ) { + $options = ''; + + foreach ( $init as $key => $value ) { + if ( is_bool( $value ) ) { + $val = $value ? 'true' : 'false'; + $options .= $key . ':' . $val . ','; + continue; + } elseif ( ! empty( $value ) && is_string( $value ) && ( + ( '{' == $value[0] && '}' == $value[ strlen( $value ) - 1 ] ) || + ( '[' == $value[0] && ']' == $value[ strlen( $value ) - 1 ] ) || + preg_match( '/^\(?function ?\(/', $value ) ) ) { + + $options .= $key . ':' . $value . ','; + continue; + } + $options .= $key . ':"' . $value . '",'; + } + + return '{' . trim( $options, ' ,' ) . '}'; + } + + /** + * @since 3.3.0 + * + * @param bool $default_scripts Optional. Whether default scripts should be enqueued. Default false. + */ + public static function enqueue_scripts( $default_scripts = false ) { + if ( $default_scripts || self::$has_tinymce ) { + wp_enqueue_script( 'editor' ); + } + + if ( $default_scripts || self::$has_quicktags ) { + wp_enqueue_script( 'quicktags' ); + wp_enqueue_style( 'buttons' ); + } + + if ( $default_scripts || in_array( 'wplink', self::$plugins, true ) || in_array( 'link', self::$qt_buttons, true ) ) { + wp_enqueue_script( 'wplink' ); + wp_enqueue_script( 'jquery-ui-autocomplete' ); + } + + if ( self::$has_medialib ) { + add_thickbox(); + wp_enqueue_script( 'media-upload' ); + wp_enqueue_script( 'wp-embed' ); + } elseif ( $default_scripts ) { + wp_enqueue_script( 'media-upload' ); + } + + /** + * Fires when scripts and styles are enqueued for the editor. + * + * @since 3.9.0 + * + * @param array $to_load An array containing boolean values whether TinyMCE + * and Quicktags are being loaded. + */ + do_action( + 'wp_enqueue_editor', + array( + 'tinymce' => ( $default_scripts || self::$has_tinymce ), + 'quicktags' => ( $default_scripts || self::$has_quicktags ), + ) + ); + } + + /** + * Enqueue all editor scripts. + * For use when the editor is going to be initialized after page load. + * + * @since 4.8.0 + */ + public static function enqueue_default_editor() { + // We are past the point where scripts can be enqueued properly. + if ( did_action( 'wp_enqueue_editor' ) ) { + return; + } + + self::enqueue_scripts( true ); + + // Also add wp-includes/css/editor.css. + wp_enqueue_style( 'editor-buttons' ); + + if ( is_admin() ) { + add_action( 'admin_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 ); + add_action( 'admin_print_footer_scripts', array( __CLASS__, 'print_default_editor_scripts' ), 45 ); + } else { + add_action( 'wp_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 ); + add_action( 'wp_print_footer_scripts', array( __CLASS__, 'print_default_editor_scripts' ), 45 ); + } + } + + /** + * Print (output) all editor scripts and default settings. + * For use when the editor is going to be initialized after page load. + * + * @since 4.8.0 + */ + public static function print_default_editor_scripts() { + $user_can_richedit = user_can_richedit(); + + if ( $user_can_richedit ) { + $settings = self::default_settings(); + + $settings['toolbar1'] = 'bold,italic,bullist,numlist,link'; + $settings['wpautop'] = false; + $settings['indent'] = true; + $settings['elementpath'] = false; + + if ( is_rtl() ) { + $settings['directionality'] = 'rtl'; + } + + /* + * In production all plugins are loaded (they are in wp-editor.js.gz). + * The 'wpview', 'wpdialogs', and 'media' TinyMCE plugins are not initialized by default. + * Can be added from js by using the 'wp-before-tinymce-init' event. + */ + $settings['plugins'] = implode( + ',', + array( + 'charmap', + 'colorpicker', + 'hr', + 'lists', + 'paste', + 'tabfocus', + 'textcolor', + 'fullscreen', + 'wordpress', + 'wpautoresize', + 'wpeditimage', + 'wpemoji', + 'wpgallery', + 'wplink', + 'wptextpattern', + ) + ); + + $settings = self::_parse_init( $settings ); + } else { + $settings = '{}'; + } + + ?> + <script type="text/javascript"> + window.wp = window.wp || {}; + window.wp.editor = window.wp.editor || {}; + window.wp.editor.getDefaultSettings = function() { + return { + tinymce: <?php echo $settings; ?>, + quicktags: { + buttons: 'strong,em,link,ul,ol,li,code' + } + }; + }; + + <?php + + if ( $user_can_richedit ) { + $suffix = SCRIPT_DEBUG ? '' : '.min'; + $baseurl = self::get_baseurl(); + + ?> + var tinyMCEPreInit = { + baseURL: "<?php echo $baseurl; ?>", + suffix: "<?php echo $suffix; ?>", + mceInit: {}, + qtInit: {}, + load_ext: function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');} + }; + <?php + } + ?> + </script> + <?php + + if ( $user_can_richedit ) { + self::print_tinymce_scripts(); + } + + /** + * Fires when the editor scripts are loaded for later initialization, + * after all scripts and settings are printed. + * + * @since 4.8.0 + */ + do_action( 'print_default_editor_scripts' ); + + self::wp_link_dialog(); + } + + /** + * Returns the TinyMCE locale. + * + * @since 4.8.0 + * + * @return string + */ + public static function get_mce_locale() { + if ( empty( self::$mce_locale ) ) { + $mce_locale = get_user_locale(); + self::$mce_locale = empty( $mce_locale ) ? 'en' : strtolower( substr( $mce_locale, 0, 2 ) ); // ISO 639-1. + } + + return self::$mce_locale; + } + + /** + * Returns the TinyMCE base URL. + * + * @since 4.8.0 + * + * @return string + */ + public static function get_baseurl() { + if ( empty( self::$baseurl ) ) { + self::$baseurl = includes_url( 'js/tinymce' ); + } + + return self::$baseurl; + } + + /** + * Returns the default TinyMCE settings. + * Doesn't include plugins, buttons, editor selector. + * + * @since 4.8.0 + * + * @global string $tinymce_version + * + * @return array + */ + private static function default_settings() { + global $tinymce_version; + + $shortcut_labels = array(); + + foreach ( self::get_translation() as $name => $value ) { + if ( is_array( $value ) ) { + $shortcut_labels[ $name ] = $value[1]; + } + } + + $settings = array( + 'theme' => 'modern', + 'skin' => 'lightgray', + 'language' => self::get_mce_locale(), + 'formats' => '{' . + 'alignleft: [' . + '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"left"}},' . + '{selector: "img,table,dl.wp-caption", classes: "alignleft"}' . + '],' . + 'aligncenter: [' . + '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"center"}},' . + '{selector: "img,table,dl.wp-caption", classes: "aligncenter"}' . + '],' . + 'alignright: [' . + '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"right"}},' . + '{selector: "img,table,dl.wp-caption", classes: "alignright"}' . + '],' . + 'strikethrough: {inline: "del"}' . + '}', + 'relative_urls' => false, + 'remove_script_host' => false, + 'convert_urls' => false, + 'browser_spellcheck' => true, + 'fix_list_elements' => true, + 'entities' => '38,amp,60,lt,62,gt', + 'entity_encoding' => 'raw', + 'keep_styles' => false, + 'cache_suffix' => 'wp-mce-' . $tinymce_version, + 'resize' => 'vertical', + 'menubar' => false, + 'branding' => false, + + // Limit the preview styles in the menu/toolbar. + 'preview_styles' => 'font-family font-size font-weight font-style text-decoration text-transform', + + 'end_container_on_empty_block' => true, + 'wpeditimage_html5_captions' => true, + 'wp_lang_attr' => get_bloginfo( 'language' ), + 'wp_keep_scroll_position' => false, + 'wp_shortcut_labels' => wp_json_encode( $shortcut_labels ), + ); + + $suffix = SCRIPT_DEBUG ? '' : '.min'; + $version = 'ver=' . get_bloginfo( 'version' ); + + // Default stylesheets. + $settings['content_css'] = includes_url( "css/dashicons$suffix.css?$version" ) . ',' . + includes_url( "js/tinymce/skins/wordpress/wp-content.css?$version" ); + + return $settings; + } + + /** + * @since 4.7.0 + * + * @return array + */ + private static function get_translation() { + if ( empty( self::$translation ) ) { + self::$translation = array( + // Default TinyMCE strings. + 'New document' => __( 'New document' ), + 'Formats' => _x( 'Formats', 'TinyMCE' ), + + 'Headings' => _x( 'Headings', 'TinyMCE' ), + 'Heading 1' => array( __( 'Heading 1' ), 'access1' ), + 'Heading 2' => array( __( 'Heading 2' ), 'access2' ), + 'Heading 3' => array( __( 'Heading 3' ), 'access3' ), + 'Heading 4' => array( __( 'Heading 4' ), 'access4' ), + 'Heading 5' => array( __( 'Heading 5' ), 'access5' ), + 'Heading 6' => array( __( 'Heading 6' ), 'access6' ), + + /* translators: Block tags. */ + 'Blocks' => _x( 'Blocks', 'TinyMCE' ), + 'Paragraph' => array( __( 'Paragraph' ), 'access7' ), + 'Blockquote' => array( __( 'Blockquote' ), 'accessQ' ), + 'Div' => _x( 'Div', 'HTML tag' ), + 'Pre' => _x( 'Pre', 'HTML tag' ), + 'Preformatted' => _x( 'Preformatted', 'HTML tag' ), + 'Address' => _x( 'Address', 'HTML tag' ), + + 'Inline' => _x( 'Inline', 'HTML elements' ), + 'Underline' => array( __( 'Underline' ), 'metaU' ), + 'Strikethrough' => array( __( 'Strikethrough' ), 'accessD' ), + 'Subscript' => __( 'Subscript' ), + 'Superscript' => __( 'Superscript' ), + 'Clear formatting' => __( 'Clear formatting' ), + 'Bold' => array( __( 'Bold' ), 'metaB' ), + 'Italic' => array( __( 'Italic' ), 'metaI' ), + 'Code' => array( __( 'Code' ), 'accessX' ), + 'Source code' => __( 'Source code' ), + 'Font Family' => __( 'Font Family' ), + 'Font Sizes' => __( 'Font Sizes' ), + + 'Align center' => array( __( 'Align center' ), 'accessC' ), + 'Align right' => array( __( 'Align right' ), 'accessR' ), + 'Align left' => array( __( 'Align left' ), 'accessL' ), + 'Justify' => array( __( 'Justify' ), 'accessJ' ), + 'Increase indent' => __( 'Increase indent' ), + 'Decrease indent' => __( 'Decrease indent' ), + + 'Cut' => array( __( 'Cut' ), 'metaX' ), + 'Copy' => array( __( 'Copy' ), 'metaC' ), + 'Paste' => array( __( 'Paste' ), 'metaV' ), + 'Select all' => array( __( 'Select all' ), 'metaA' ), + 'Undo' => array( __( 'Undo' ), 'metaZ' ), + 'Redo' => array( __( 'Redo' ), 'metaY' ), + + 'Ok' => __( 'OK' ), + 'Cancel' => __( 'Cancel' ), + 'Close' => __( 'Close' ), + 'Visual aids' => __( 'Visual aids' ), + + 'Bullet list' => array( __( 'Bulleted list' ), 'accessU' ), + 'Numbered list' => array( __( 'Numbered list' ), 'accessO' ), + 'Square' => _x( 'Square', 'list style' ), + 'Default' => _x( 'Default', 'list style' ), + 'Circle' => _x( 'Circle', 'list style' ), + 'Disc' => _x( 'Disc', 'list style' ), + 'Lower Greek' => _x( 'Lower Greek', 'list style' ), + 'Lower Alpha' => _x( 'Lower Alpha', 'list style' ), + 'Upper Alpha' => _x( 'Upper Alpha', 'list style' ), + 'Upper Roman' => _x( 'Upper Roman', 'list style' ), + 'Lower Roman' => _x( 'Lower Roman', 'list style' ), + + // Anchor plugin. + 'Name' => _x( 'Name', 'Name of link anchor (TinyMCE)' ), + 'Anchor' => _x( 'Anchor', 'Link anchor (TinyMCE)' ), + 'Anchors' => _x( 'Anchors', 'Link anchors (TinyMCE)' ), + 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.' => + __( 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.' ), + 'Id' => _x( 'Id', 'Id for link anchor (TinyMCE)' ), + + // Fullpage plugin. + 'Document properties' => __( 'Document properties' ), + 'Robots' => __( 'Robots' ), + 'Title' => __( 'Title' ), + 'Keywords' => __( 'Keywords' ), + 'Encoding' => __( 'Encoding' ), + 'Description' => __( 'Description' ), + 'Author' => __( 'Author' ), + + // Media, image plugins. + 'Image' => __( 'Image' ), + 'Insert/edit image' => array( __( 'Insert/edit image' ), 'accessM' ), + 'General' => __( 'General' ), + 'Advanced' => __( 'Advanced' ), + 'Source' => __( 'Source' ), + 'Border' => __( 'Border' ), + 'Constrain proportions' => __( 'Constrain proportions' ), + 'Vertical space' => __( 'Vertical space' ), + 'Image description' => __( 'Image description' ), + 'Style' => __( 'Style' ), + 'Dimensions' => __( 'Dimensions' ), + 'Insert image' => __( 'Insert image' ), + 'Date/time' => __( 'Date/time' ), + 'Insert date/time' => __( 'Insert date/time' ), + 'Table of Contents' => __( 'Table of Contents' ), + 'Insert/Edit code sample' => __( 'Insert/edit code sample' ), + 'Language' => __( 'Language' ), + 'Media' => __( 'Media' ), + 'Insert/edit media' => __( 'Insert/edit media' ), + 'Poster' => __( 'Poster' ), + 'Alternative source' => __( 'Alternative source' ), + 'Paste your embed code below:' => __( 'Paste your embed code below:' ), + 'Insert video' => __( 'Insert video' ), + 'Embed' => __( 'Embed' ), + + // Each of these have a corresponding plugin. + 'Special character' => __( 'Special character' ), + 'Right to left' => _x( 'Right to left', 'editor button' ), + 'Left to right' => _x( 'Left to right', 'editor button' ), + 'Emoticons' => __( 'Emoticons' ), + 'Nonbreaking space' => __( 'Nonbreaking space' ), + 'Page break' => __( 'Page break' ), + 'Paste as text' => __( 'Paste as text' ), + 'Preview' => __( 'Preview' ), + 'Print' => __( 'Print' ), + 'Save' => __( 'Save' ), + 'Fullscreen' => __( 'Fullscreen' ), + 'Horizontal line' => __( 'Horizontal line' ), + 'Horizontal space' => __( 'Horizontal space' ), + 'Restore last draft' => __( 'Restore last draft' ), + 'Insert/edit link' => array( __( 'Insert/edit link' ), 'metaK' ), + 'Remove link' => array( __( 'Remove link' ), 'accessS' ), + + // Link plugin. + 'Link' => __( 'Link' ), + 'Insert link' => __( 'Insert link' ), + 'Target' => __( 'Target' ), + 'New window' => __( 'New window' ), + 'Text to display' => __( 'Text to display' ), + 'Url' => __( 'URL' ), + 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?' => + __( 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?' ), + 'The URL you entered seems to be an external link. Do you want to add the required http:// prefix?' => + __( 'The URL you entered seems to be an external link. Do you want to add the required http:// prefix?' ), + + 'Color' => __( 'Color' ), + 'Custom color' => __( 'Custom color' ), + 'Custom...' => _x( 'Custom...', 'label for custom color' ), // No ellipsis. + 'No color' => __( 'No color' ), + 'R' => _x( 'R', 'Short for red in RGB' ), + 'G' => _x( 'G', 'Short for green in RGB' ), + 'B' => _x( 'B', 'Short for blue in RGB' ), + + // Spelling, search/replace plugins. + 'Could not find the specified string.' => __( 'Could not find the specified string.' ), + 'Replace' => _x( 'Replace', 'find/replace' ), + 'Next' => _x( 'Next', 'find/replace' ), + /* translators: Previous. */ + 'Prev' => _x( 'Prev', 'find/replace' ), + 'Whole words' => _x( 'Whole words', 'find/replace' ), + 'Find and replace' => __( 'Find and replace' ), + 'Replace with' => _x( 'Replace with', 'find/replace' ), + 'Find' => _x( 'Find', 'find/replace' ), + 'Replace all' => _x( 'Replace all', 'find/replace' ), + 'Match case' => __( 'Match case' ), + 'Spellcheck' => __( 'Check Spelling' ), + 'Finish' => _x( 'Finish', 'spellcheck' ), + 'Ignore all' => _x( 'Ignore all', 'spellcheck' ), + 'Ignore' => _x( 'Ignore', 'spellcheck' ), + 'Add to Dictionary' => __( 'Add to Dictionary' ), + + // TinyMCE tables. + 'Insert table' => __( 'Insert table' ), + 'Delete table' => __( 'Delete table' ), + 'Table properties' => __( 'Table properties' ), + 'Row properties' => __( 'Table row properties' ), + 'Cell properties' => __( 'Table cell properties' ), + 'Border color' => __( 'Border color' ), + + 'Row' => __( 'Row' ), + 'Rows' => __( 'Rows' ), + 'Column' => _x( 'Column', 'table column' ), + 'Cols' => _x( 'Cols', 'table columns' ), + 'Cell' => _x( 'Cell', 'table cell' ), + 'Header cell' => __( 'Header cell' ), + 'Header' => _x( 'Header', 'table header' ), + 'Body' => _x( 'Body', 'table body' ), + 'Footer' => _x( 'Footer', 'table footer' ), + + 'Insert row before' => __( 'Insert row before' ), + 'Insert row after' => __( 'Insert row after' ), + 'Insert column before' => __( 'Insert column before' ), + 'Insert column after' => __( 'Insert column after' ), + 'Paste row before' => __( 'Paste table row before' ), + 'Paste row after' => __( 'Paste table row after' ), + 'Delete row' => __( 'Delete row' ), + 'Delete column' => __( 'Delete column' ), + 'Cut row' => __( 'Cut table row' ), + 'Copy row' => __( 'Copy table row' ), + 'Merge cells' => __( 'Merge table cells' ), + 'Split cell' => __( 'Split table cell' ), + + 'Height' => __( 'Height' ), + 'Width' => __( 'Width' ), + 'Caption' => __( 'Caption' ), + 'Alignment' => __( 'Alignment' ), + 'H Align' => _x( 'H Align', 'horizontal table cell alignment' ), + 'Left' => __( 'Left' ), + 'Center' => __( 'Center' ), + 'Right' => __( 'Right' ), + 'None' => _x( 'None', 'table cell alignment attribute' ), + 'V Align' => _x( 'V Align', 'vertical table cell alignment' ), + 'Top' => __( 'Top' ), + 'Middle' => __( 'Middle' ), + 'Bottom' => __( 'Bottom' ), + + 'Row group' => __( 'Row group' ), + 'Column group' => __( 'Column group' ), + 'Row type' => __( 'Row type' ), + 'Cell type' => __( 'Cell type' ), + 'Cell padding' => __( 'Cell padding' ), + 'Cell spacing' => __( 'Cell spacing' ), + 'Scope' => _x( 'Scope', 'table cell scope attribute' ), + + 'Insert template' => _x( 'Insert template', 'TinyMCE' ), + 'Templates' => _x( 'Templates', 'TinyMCE' ), + + 'Background color' => __( 'Background color' ), + 'Text color' => __( 'Text color' ), + 'Show blocks' => _x( 'Show blocks', 'editor button' ), + 'Show invisible characters' => __( 'Show invisible characters' ), + + /* translators: Word count. */ + 'Words: {0}' => sprintf( __( 'Words: %s' ), '{0}' ), + 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.' => + __( 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.' ) . "\n\n" . + __( 'If you’re looking to paste rich content from Microsoft Word, try turning this option off. The editor will clean up text pasted from Word automatically.' ), + 'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help' => + __( 'Rich Text Area. Press Alt-Shift-H for help.' ), + 'Rich Text Area. Press Control-Option-H for help.' => __( 'Rich Text Area. Press Control-Option-H for help.' ), + 'You have unsaved changes are you sure you want to navigate away?' => + __( 'The changes you made will be lost if you navigate away from this page.' ), + 'Your browser doesn\'t support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.' => + __( 'Your browser does not support direct access to the clipboard. Please use keyboard shortcuts or your browser’s edit menu instead.' ), + + // TinyMCE menus. + 'Insert' => _x( 'Insert', 'TinyMCE menu' ), + 'File' => _x( 'File', 'TinyMCE menu' ), + 'Edit' => _x( 'Edit', 'TinyMCE menu' ), + 'Tools' => _x( 'Tools', 'TinyMCE menu' ), + 'View' => _x( 'View', 'TinyMCE menu' ), + 'Table' => _x( 'Table', 'TinyMCE menu' ), + 'Format' => _x( 'Format', 'TinyMCE menu' ), + + // WordPress strings. + 'Toolbar Toggle' => array( __( 'Toolbar Toggle' ), 'accessZ' ), + 'Insert Read More tag' => array( __( 'Insert Read More tag' ), 'accessT' ), + 'Insert Page Break tag' => array( __( 'Insert Page Break tag' ), 'accessP' ), + 'Read more...' => __( 'Read more...' ), // Title on the placeholder inside the editor (no ellipsis). + 'Distraction-free writing mode' => array( __( 'Distraction-free writing mode' ), 'accessW' ), + 'No alignment' => __( 'No alignment' ), // Tooltip for the 'alignnone' button in the image toolbar. + 'Remove' => __( 'Remove' ), // Tooltip for the 'remove' button in the image toolbar. + 'Edit|button' => __( 'Edit' ), // Tooltip for the 'edit' button in the image toolbar. + 'Paste URL or type to search' => __( 'Paste URL or type to search' ), // Placeholder for the inline link dialog. + 'Apply' => __( 'Apply' ), // Tooltip for the 'apply' button in the inline link dialog. + 'Link options' => __( 'Link options' ), // Tooltip for the 'link options' button in the inline link dialog. + 'Visual' => _x( 'Visual', 'Name for the Visual editor tab' ), // Editor switch tab label. + 'Text' => _x( 'Text', 'Name for the Text editor tab (formerly HTML)' ), // Editor switch tab label. + 'Add Media' => array( __( 'Add Media' ), 'accessM' ), // Tooltip for the 'Add Media' button in the block editor Classic block. + + // Shortcuts help modal. + 'Keyboard Shortcuts' => array( __( 'Keyboard Shortcuts' ), 'accessH' ), + 'Classic Block Keyboard Shortcuts' => __( 'Classic Block Keyboard Shortcuts' ), + 'Default shortcuts,' => __( 'Default shortcuts,' ), + 'Additional shortcuts,' => __( 'Additional shortcuts,' ), + 'Focus shortcuts:' => __( 'Focus shortcuts:' ), + 'Inline toolbar (when an image, link or preview is selected)' => __( 'Inline toolbar (when an image, link or preview is selected)' ), + 'Editor menu (when enabled)' => __( 'Editor menu (when enabled)' ), + 'Editor toolbar' => __( 'Editor toolbar' ), + 'Elements path' => __( 'Elements path' ), + 'Ctrl + Alt + letter:' => __( 'Ctrl + Alt + letter:' ), + 'Shift + Alt + letter:' => __( 'Shift + Alt + letter:' ), + 'Cmd + letter:' => __( 'Cmd + letter:' ), + 'Ctrl + letter:' => __( 'Ctrl + letter:' ), + 'Letter' => __( 'Letter' ), + 'Action' => __( 'Action' ), + 'Warning: the link has been inserted but may have errors. Please test it.' => __( 'Warning: the link has been inserted but may have errors. Please test it.' ), + 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' => + __( 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' ), + 'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' => + __( 'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' ), + 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' => + __( 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' ), + 'The next group of formatting shortcuts are applied as you type or when you insert them around plain text in the same paragraph. Press Escape or the Undo button to undo.' => + __( 'The next group of formatting shortcuts are applied as you type or when you insert them around plain text in the same paragraph. Press Escape or the Undo button to undo.' ), + ); + } + + /* + Imagetools plugin (not included): + 'Edit image' => __( 'Edit image' ), + 'Image options' => __( 'Image options' ), + 'Back' => __( 'Back' ), + 'Invert' => __( 'Invert' ), + 'Flip horizontally' => __( 'Flip horizontal' ), + 'Flip vertically' => __( 'Flip vertical' ), + 'Crop' => __( 'Crop' ), + 'Orientation' => __( 'Orientation' ), + 'Resize' => __( 'Resize' ), + 'Rotate clockwise' => __( 'Rotate right' ), + 'Rotate counterclockwise' => __( 'Rotate left' ), + 'Sharpen' => __( 'Sharpen' ), + 'Brightness' => __( 'Brightness' ), + 'Color levels' => __( 'Color levels' ), + 'Contrast' => __( 'Contrast' ), + 'Gamma' => __( 'Gamma' ), + 'Zoom in' => __( 'Zoom in' ), + 'Zoom out' => __( 'Zoom out' ), + */ + + return self::$translation; + } + + /** + * Translates the default TinyMCE strings and returns them as JSON encoded object ready to be loaded with tinymce.addI18n(), + * or as JS snippet that should run after tinymce.js is loaded. + * + * @since 3.9.0 + * + * @param string $mce_locale The locale used for the editor. + * @param bool $json_only optional Whether to include the JavaScript calls to tinymce.addI18n() and tinymce.ScriptLoader.markDone(). + * @return string Translation object, JSON encoded. + */ + public static function wp_mce_translation( $mce_locale = '', $json_only = false ) { + if ( ! $mce_locale ) { + $mce_locale = self::get_mce_locale(); + } + + $mce_translation = self::get_translation(); + + foreach ( $mce_translation as $name => $value ) { + if ( is_array( $value ) ) { + $mce_translation[ $name ] = $value[0]; + } + } + + /** + * Filters translated strings prepared for TinyMCE. + * + * @since 3.9.0 + * + * @param array $mce_translation Key/value pairs of strings. + * @param string $mce_locale Locale. + */ + $mce_translation = apply_filters( 'wp_mce_translation', $mce_translation, $mce_locale ); + + foreach ( $mce_translation as $key => $value ) { + // Remove strings that are not translated. + if ( $key === $value ) { + unset( $mce_translation[ $key ] ); + continue; + } + + if ( false !== strpos( $value, '&' ) ) { + $mce_translation[ $key ] = html_entity_decode( $value, ENT_QUOTES, 'UTF-8' ); + } + } + + // Set direction. + if ( is_rtl() ) { + $mce_translation['_dir'] = 'rtl'; + } + + if ( $json_only ) { + return wp_json_encode( $mce_translation ); + } + + $baseurl = self::get_baseurl(); + + return "tinymce.addI18n( '$mce_locale', " . wp_json_encode( $mce_translation ) . ");\n" . + "tinymce.ScriptLoader.markDone( '$baseurl/langs/$mce_locale.js' );\n"; + } + + /** + * Force uncompressed TinyMCE when a custom theme has been defined. + * + * The compressed TinyMCE file cannot deal with custom themes, so this makes + * sure that we use the uncompressed TinyMCE file if a theme is defined. + * Even if we are on a production environment. + * + * @since 5.0.0 + */ + public static function force_uncompressed_tinymce() { + $has_custom_theme = false; + foreach ( self::$mce_settings as $init ) { + if ( ! empty( $init['theme_url'] ) ) { + $has_custom_theme = true; + break; + } + } + + if ( ! $has_custom_theme ) { + return; + } + + $wp_scripts = wp_scripts(); + + $wp_scripts->remove( 'wp-tinymce' ); + wp_register_tinymce_scripts( $wp_scripts, true ); + } + + /** + * Print (output) the main TinyMCE scripts. + * + * @since 4.8.0 + * + * @global string $tinymce_version + * @global bool $concatenate_scripts + * @global bool $compress_scripts + */ + public static function print_tinymce_scripts() { + global $concatenate_scripts; + + if ( self::$tinymce_scripts_printed ) { + return; + } + + self::$tinymce_scripts_printed = true; + + if ( ! isset( $concatenate_scripts ) ) { + script_concat_settings(); + } + + wp_print_scripts( array( 'wp-tinymce' ) ); + + echo "<script type='text/javascript'>\n" . self::wp_mce_translation() . "</script>\n"; + } + + /** + * Print (output) the TinyMCE configuration and initialization scripts. + * + * @since 3.3.0 + * + * @global string $tinymce_version + */ + public static function editor_js() { + global $tinymce_version; + + $tmce_on = ! empty( self::$mce_settings ); + $mceInit = ''; + $qtInit = ''; + + if ( $tmce_on ) { + foreach ( self::$mce_settings as $editor_id => $init ) { + $options = self::_parse_init( $init ); + $mceInit .= "'$editor_id':{$options},"; + } + $mceInit = '{' . trim( $mceInit, ',' ) . '}'; + } else { + $mceInit = '{}'; + } + + if ( ! empty( self::$qt_settings ) ) { + foreach ( self::$qt_settings as $editor_id => $init ) { + $options = self::_parse_init( $init ); + $qtInit .= "'$editor_id':{$options},"; + } + $qtInit = '{' . trim( $qtInit, ',' ) . '}'; + } else { + $qtInit = '{}'; + } + + $ref = array( + 'plugins' => implode( ',', self::$plugins ), + 'theme' => 'modern', + 'language' => self::$mce_locale, + ); + + $suffix = SCRIPT_DEBUG ? '' : '.min'; + $baseurl = self::get_baseurl(); + $version = 'ver=' . $tinymce_version; + + /** + * Fires immediately before the TinyMCE settings are printed. + * + * @since 3.2.0 + * + * @param array $mce_settings TinyMCE settings array. + */ + do_action( 'before_wp_tiny_mce', self::$mce_settings ); + ?> + + <script type="text/javascript"> + tinyMCEPreInit = { + baseURL: "<?php echo $baseurl; ?>", + suffix: "<?php echo $suffix; ?>", + <?php + + if ( self::$drag_drop_upload ) { + echo 'dragDropUpload: true,'; + } + + ?> + mceInit: <?php echo $mceInit; ?>, + qtInit: <?php echo $qtInit; ?>, + ref: <?php echo self::_parse_init( $ref ); ?>, + load_ext: function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');} + }; + </script> + <?php + + if ( $tmce_on ) { + self::print_tinymce_scripts(); + + if ( self::$ext_plugins ) { + // Load the old-format English strings to prevent unsightly labels in old style popups. + echo "<script type='text/javascript' src='{$baseurl}/langs/wp-langs-en.js?$version'></script>\n"; + } + } + + /** + * Fires after tinymce.js is loaded, but before any TinyMCE editor + * instances are created. + * + * @since 3.9.0 + * + * @param array $mce_settings TinyMCE settings array. + */ + do_action( 'wp_tiny_mce_init', self::$mce_settings ); + + ?> + <script type="text/javascript"> + <?php + + if ( self::$ext_plugins ) { + echo self::$ext_plugins . "\n"; + } + + if ( ! is_admin() ) { + echo 'var ajaxurl = "' . admin_url( 'admin-ajax.php', 'relative' ) . '";'; + } + + ?> + + ( function() { + var init, id, $wrap; + + if ( typeof tinymce !== 'undefined' ) { + if ( tinymce.Env.ie && tinymce.Env.ie < 11 ) { + tinymce.$( '.wp-editor-wrap ' ).removeClass( 'tmce-active' ).addClass( 'html-active' ); + return; + } + + for ( id in tinyMCEPreInit.mceInit ) { + init = tinyMCEPreInit.mceInit[id]; + $wrap = tinymce.$( '#wp-' + id + '-wrap' ); + + if ( ( $wrap.hasClass( 'tmce-active' ) || ! tinyMCEPreInit.qtInit.hasOwnProperty( id ) ) && ! init.wp_skip_init ) { + tinymce.init( init ); + + if ( ! window.wpActiveEditor ) { + window.wpActiveEditor = id; + } + } + } + } + + if ( typeof quicktags !== 'undefined' ) { + for ( id in tinyMCEPreInit.qtInit ) { + quicktags( tinyMCEPreInit.qtInit[id] ); + + if ( ! window.wpActiveEditor ) { + window.wpActiveEditor = id; + } + } + } + }()); + </script> + <?php + + if ( in_array( 'wplink', self::$plugins, true ) || in_array( 'link', self::$qt_buttons, true ) ) { + self::wp_link_dialog(); + } + + /** + * Fires after any core TinyMCE editor instances are created. + * + * @since 3.2.0 + * + * @param array $mce_settings TinyMCE settings array. + */ + do_action( 'after_wp_tiny_mce', self::$mce_settings ); + } + + /** + * Outputs the HTML for distraction-free writing mode. + * + * @since 3.2.0 + * @deprecated 4.3.0 + */ + public static function wp_fullscreen_html() { + _deprecated_function( __FUNCTION__, '4.3.0' ); + } + + /** + * Performs post queries for internal linking. + * + * @since 3.1.0 + * + * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments. + * @return array|false Results. + */ + public static function wp_link_query( $args = array() ) { + $pts = get_post_types( array( 'public' => true ), 'objects' ); + $pt_names = array_keys( $pts ); + + $query = array( + 'post_type' => $pt_names, + 'suppress_filters' => true, + 'update_post_term_cache' => false, + 'update_post_meta_cache' => false, + 'post_status' => 'publish', + 'posts_per_page' => 20, + ); + + $args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1; + + if ( isset( $args['s'] ) ) { + $query['s'] = $args['s']; + } + + $query['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0; + + /** + * Filters the link query arguments. + * + * Allows modification of the link query arguments before querying. + * + * @see WP_Query for a full list of arguments + * + * @since 3.7.0 + * + * @param array $query An array of WP_Query arguments. + */ + $query = apply_filters( 'wp_link_query_args', $query ); + + // Do main query. + $get_posts = new WP_Query; + $posts = $get_posts->query( $query ); + + // Build results. + $results = array(); + foreach ( $posts as $post ) { + if ( 'post' == $post->post_type ) { + $info = mysql2date( __( 'Y/m/d' ), $post->post_date ); + } else { + $info = $pts[ $post->post_type ]->labels->singular_name; + } + + $results[] = array( + 'ID' => $post->ID, + 'title' => trim( esc_html( strip_tags( get_the_title( $post ) ) ) ), + 'permalink' => get_permalink( $post->ID ), + 'info' => $info, + ); + } + + /** + * Filters the link query results. + * + * Allows modification of the returned link query results. + * + * @since 3.7.0 + * + * @see 'wp_link_query_args' filter + * + * @param array $results { + * An associative array of query results. + * + * @type array { + * @type int $ID Post ID. + * @type string $title The trimmed, escaped post title. + * @type string $permalink Post permalink. + * @type string $info A 'Y/m/d'-formatted date for 'post' post type, + * the 'singular_name' post type label otherwise. + * } + * } + * @param array $query An array of WP_Query arguments. + */ + $results = apply_filters( 'wp_link_query', $results, $query ); + + return ! empty( $results ) ? $results : false; + } + + /** + * Dialog for internal linking. + * + * @since 3.1.0 + */ + public static function wp_link_dialog() { + // Run once. + if ( self::$link_dialog_printed ) { + return; + } + + self::$link_dialog_printed = true; + + // `display: none` is required here, see #WP27605. + ?> + <div id="wp-link-backdrop" style="display: none"></div> + <div id="wp-link-wrap" class="wp-core-ui" style="display: none" role="dialog" aria-labelledby="link-modal-title"> + <form id="wp-link" tabindex="-1"> + <?php wp_nonce_field( 'internal-linking', '_ajax_linking_nonce', false ); ?> + <h1 id="link-modal-title"><?php _e( 'Insert/edit link' ); ?></h1> + <button type="button" id="wp-link-close"><span class="screen-reader-text"><?php _e( 'Close' ); ?></span></button> + <div id="link-selector"> + <div id="link-options"> + <p class="howto" id="wplink-enter-url"><?php _e( 'Enter the destination URL' ); ?></p> + <div> + <label><span><?php _e( 'URL' ); ?></span> + <input id="wp-link-url" type="text" aria-describedby="wplink-enter-url" /></label> + </div> + <div class="wp-link-text-field"> + <label><span><?php _e( 'Link Text' ); ?></span> + <input id="wp-link-text" type="text" /></label> + </div> + <div class="link-target"> + <label><span></span> + <input type="checkbox" id="wp-link-target" /> <?php _e( 'Open link in a new tab' ); ?></label> + </div> + </div> + <p class="howto" id="wplink-link-existing-content"><?php _e( 'Or link to existing content' ); ?></p> + <div id="search-panel"> + <div class="link-search-wrapper"> + <label> + <span class="search-label"><?php _e( 'Search' ); ?></span> + <input type="search" id="wp-link-search" class="link-search-field" autocomplete="off" aria-describedby="wplink-link-existing-content" /> + <span class="spinner"></span> + </label> + </div> + <div id="search-results" class="query-results" tabindex="0"> + <ul></ul> + <div class="river-waiting"> + <span class="spinner"></span> + </div> + </div> + <div id="most-recent-results" class="query-results" tabindex="0"> + <div class="query-notice" id="query-notice-message"> + <em class="query-notice-default"><?php _e( 'No search term specified. Showing recent items.' ); ?></em> + <em class="query-notice-hint screen-reader-text"><?php _e( 'Search or use up and down arrow keys to select an item.' ); ?></em> + </div> + <ul></ul> + <div class="river-waiting"> + <span class="spinner"></span> + </div> + </div> + </div> + </div> + <div class="submitbox"> + <div id="wp-link-cancel"> + <button type="button" class="button"><?php _e( 'Cancel' ); ?></button> + </div> + <div id="wp-link-update"> + <input type="submit" value="<?php esc_attr_e( 'Add Link' ); ?>" class="button button-primary" id="wp-link-submit" name="wp-link-submit"> + </div> + </div> + </form> + </div> + <?php + } +} diff --git a/wp-includes/class-wp-embed.php b/wp-includes/class-wp-embed.php new file mode 100644 index 0000000..80461be --- /dev/null +++ b/wp-includes/class-wp-embed.php @@ -0,0 +1,498 @@ +<?php +/** + * API for easily embedding rich media such as videos and images into content. + * + * @package WordPress + * @subpackage Embed + * @since 2.9.0 + */ +class WP_Embed { + public $handlers = array(); + public $post_ID; + public $usecache = true; + public $linkifunknown = true; + public $last_attr = array(); + public $last_url = ''; + + /** + * When a URL cannot be embedded, return false instead of returning a link + * or the URL. + * + * Bypasses the {@see 'embed_maybe_make_link'} filter. + * + * @var bool + */ + public $return_false_on_fail = false; + + /** + * Constructor + */ + public function __construct() { + // Hack to get the [embed] shortcode to run before wpautop(). + add_filter( 'the_content', array( $this, 'run_shortcode' ), 8 ); + add_filter( 'widget_text_content', array( $this, 'run_shortcode' ), 8 ); + + // Shortcode placeholder for strip_shortcodes(). + add_shortcode( 'embed', '__return_false' ); + + // Attempts to embed all URLs in a post. + add_filter( 'the_content', array( $this, 'autoembed' ), 8 ); + add_filter( 'widget_text_content', array( $this, 'autoembed' ), 8 ); + + // After a post is saved, cache oEmbed items via Ajax. + add_action( 'edit_form_advanced', array( $this, 'maybe_run_ajax_cache' ) ); + add_action( 'edit_page_form', array( $this, 'maybe_run_ajax_cache' ) ); + } + + /** + * Process the [embed] shortcode. + * + * Since the [embed] shortcode needs to be run earlier than other shortcodes, + * this function removes all existing shortcodes, registers the [embed] shortcode, + * calls do_shortcode(), and then re-registers the old shortcodes. + * + * @global array $shortcode_tags + * + * @param string $content Content to parse + * @return string Content with shortcode parsed + */ + public function run_shortcode( $content ) { + global $shortcode_tags; + + // Back up current registered shortcodes and clear them all out. + $orig_shortcode_tags = $shortcode_tags; + remove_all_shortcodes(); + + add_shortcode( 'embed', array( $this, 'shortcode' ) ); + + // Do the shortcode (only the [embed] one is registered). + $content = do_shortcode( $content, true ); + + // Put the original shortcodes back. + $shortcode_tags = $orig_shortcode_tags; + + return $content; + } + + /** + * If a post/page was saved, then output JavaScript to make + * an Ajax request that will call WP_Embed::cache_oembed(). + */ + public function maybe_run_ajax_cache() { + $post = get_post(); + + if ( ! $post || empty( $_GET['message'] ) ) { + return; + } + + ?> +<script type="text/javascript"> + jQuery(document).ready(function($){ + $.get("<?php echo admin_url( 'admin-ajax.php?action=oembed-cache&post=' . $post->ID, 'relative' ); ?>"); + }); +</script> + <?php + } + + /** + * Registers an embed handler. + * + * Do not use this function directly, use wp_embed_register_handler() instead. + * + * This function should probably also only be used for sites that do not support oEmbed. + * + * @param string $id An internal ID/name for the handler. Needs to be unique. + * @param string $regex The regex that will be used to see if this handler should be used for a URL. + * @param callable $callback The callback function that will be called if the regex is matched. + * @param int $priority Optional. Used to specify the order in which the registered handlers will be tested (default: 10). Lower numbers correspond with earlier testing, and handlers with the same priority are tested in the order in which they were added to the action. + */ + public function register_handler( $id, $regex, $callback, $priority = 10 ) { + $this->handlers[ $priority ][ $id ] = array( + 'regex' => $regex, + 'callback' => $callback, + ); + } + + /** + * Unregisters a previously-registered embed handler. + * + * Do not use this function directly, use wp_embed_unregister_handler() instead. + * + * @param string $id The handler ID that should be removed. + * @param int $priority Optional. The priority of the handler to be removed (default: 10). + */ + public function unregister_handler( $id, $priority = 10 ) { + unset( $this->handlers[ $priority ][ $id ] ); + } + + /** + * The do_shortcode() callback function. + * + * Attempts to convert a URL into embed HTML. Starts by checking the URL against the regex of + * the registered embed handlers. If none of the regex matches and it's enabled, then the URL + * will be given to the WP_oEmbed class. + * + * @param array $attr { + * Shortcode attributes. Optional. + * + * @type int $width Width of the embed in pixels. + * @type int $height Height of the embed in pixels. + * } + * @param string $url The URL attempting to be embedded. + * @return string|false The embed HTML on success, otherwise the original URL. + * `->maybe_make_link()` can return false on failure. + */ + public function shortcode( $attr, $url = '' ) { + $post = get_post(); + + if ( empty( $url ) && ! empty( $attr['src'] ) ) { + $url = $attr['src']; + } + + $this->last_url = $url; + + if ( empty( $url ) ) { + $this->last_attr = $attr; + return ''; + } + + $rawattr = $attr; + $attr = wp_parse_args( $attr, wp_embed_defaults( $url ) ); + + $this->last_attr = $attr; + + // KSES converts & into & and we need to undo this. + // See https://core.trac.wordpress.org/ticket/11311 + $url = str_replace( '&', '&', $url ); + + // Look for known internal handlers. + ksort( $this->handlers ); + foreach ( $this->handlers as $priority => $handlers ) { + foreach ( $handlers as $id => $handler ) { + if ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) { + $return = call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr ); + if ( false !== $return ) { + /** + * Filters the returned embed HTML. + * + * @since 2.9.0 + * + * @see WP_Embed::shortcode() + * + * @param string|false $return The HTML result of the shortcode, or false on failure. + * @param string $url The embed URL. + * @param array $attr An array of shortcode attributes. + */ + return apply_filters( 'embed_handler_html', $return, $url, $attr ); + } + } + } + } + + $post_ID = ( ! empty( $post->ID ) ) ? $post->ID : null; + + // Potentially set by WP_Embed::cache_oembed(). + if ( ! empty( $this->post_ID ) ) { + $post_ID = $this->post_ID; + } + + // Check for a cached result (stored as custom post or in the post meta). + $key_suffix = md5( $url . serialize( $attr ) ); + $cachekey = '_oembed_' . $key_suffix; + $cachekey_time = '_oembed_time_' . $key_suffix; + + /** + * Filters the oEmbed TTL value (time to live). + * + * @since 4.0.0 + * + * @param int $time Time to live (in seconds). + * @param string $url The attempted embed URL. + * @param array $attr An array of shortcode attributes. + * @param int $post_ID Post ID. + */ + $ttl = apply_filters( 'oembed_ttl', DAY_IN_SECONDS, $url, $attr, $post_ID ); + + $cache = ''; + $cache_time = 0; + + $cached_post_id = $this->find_oembed_post_id( $key_suffix ); + + if ( $post_ID ) { + $cache = get_post_meta( $post_ID, $cachekey, true ); + $cache_time = get_post_meta( $post_ID, $cachekey_time, true ); + + if ( ! $cache_time ) { + $cache_time = 0; + } + } elseif ( $cached_post_id ) { + $cached_post = get_post( $cached_post_id ); + + $cache = $cached_post->post_content; + $cache_time = strtotime( $cached_post->post_modified_gmt ); + } + + $cached_recently = ( time() - $cache_time ) < $ttl; + + if ( $this->usecache || $cached_recently ) { + // Failures are cached. Serve one if we're using the cache. + if ( '{{unknown}}' === $cache ) { + return $this->maybe_make_link( $url ); + } + + if ( ! empty( $cache ) ) { + /** + * Filters the cached oEmbed HTML. + * + * @since 2.9.0 + * + * @see WP_Embed::shortcode() + * + * @param string|false $cache The cached HTML result, stored in post meta. + * @param string $url The attempted embed URL. + * @param array $attr An array of shortcode attributes. + * @param int $post_ID Post ID. + */ + return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID ); + } + } + + /** + * Filters whether to inspect the given URL for discoverable link tags. + * + * @since 2.9.0 + * @since 4.4.0 The default value changed to true. + * + * @see WP_oEmbed::discover() + * + * @param bool $enable Whether to enable `<link>` tag discovery. Default true. + */ + $attr['discover'] = apply_filters( 'embed_oembed_discover', true ); + + // Use oEmbed to get the HTML. + $html = wp_oembed_get( $url, $attr ); + + if ( $post_ID ) { + if ( $html ) { + update_post_meta( $post_ID, $cachekey, $html ); + update_post_meta( $post_ID, $cachekey_time, time() ); + } elseif ( ! $cache ) { + update_post_meta( $post_ID, $cachekey, '{{unknown}}' ); + } + } else { + $has_kses = false !== has_filter( 'content_save_pre', 'wp_filter_post_kses' ); + + if ( $has_kses ) { + // Prevent KSES from corrupting JSON in post_content. + kses_remove_filters(); + } + + $insert_post_args = array( + 'post_name' => $key_suffix, + 'post_status' => 'publish', + 'post_type' => 'oembed_cache', + ); + + if ( $html ) { + if ( $cached_post_id ) { + wp_update_post( + wp_slash( + array( + 'ID' => $cached_post_id, + 'post_content' => $html, + ) + ) + ); + } else { + wp_insert_post( + wp_slash( + array_merge( + $insert_post_args, + array( + 'post_content' => $html, + ) + ) + ) + ); + } + } elseif ( ! $cache ) { + wp_insert_post( + wp_slash( + array_merge( + $insert_post_args, + array( + 'post_content' => '{{unknown}}', + ) + ) + ) + ); + } + + if ( $has_kses ) { + kses_init_filters(); + } + } + + // If there was a result, return it. + if ( $html ) { + /** This filter is documented in wp-includes/class-wp-embed.php */ + return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID ); + } + + // Still unknown. + return $this->maybe_make_link( $url ); + } + + /** + * Delete all oEmbed caches. Unused by core as of 4.0.0. + * + * @param int $post_ID Post ID to delete the caches for. + */ + public function delete_oembed_caches( $post_ID ) { + $post_metas = get_post_custom_keys( $post_ID ); + if ( empty( $post_metas ) ) { + return; + } + + foreach ( $post_metas as $post_meta_key ) { + if ( '_oembed_' == substr( $post_meta_key, 0, 8 ) ) { + delete_post_meta( $post_ID, $post_meta_key ); + } + } + } + + /** + * Triggers a caching of all oEmbed results. + * + * @param int $post_ID Post ID to do the caching for. + */ + public function cache_oembed( $post_ID ) { + $post = get_post( $post_ID ); + + $post_types = get_post_types( array( 'show_ui' => true ) ); + /** + * Filters the array of post types to cache oEmbed results for. + * + * @since 2.9.0 + * + * @param string[] $post_types Array of post type names to cache oEmbed results for. Defaults to post types with `show_ui` set to true. + */ + if ( empty( $post->ID ) || ! in_array( $post->post_type, apply_filters( 'embed_cache_oembed_types', $post_types ) ) ) { + return; + } + + // Trigger a caching. + if ( ! empty( $post->post_content ) ) { + $this->post_ID = $post->ID; + $this->usecache = false; + + $content = $this->run_shortcode( $post->post_content ); + $this->autoembed( $content ); + + $this->usecache = true; + } + } + + /** + * Passes any unlinked URLs that are on their own line to WP_Embed::shortcode() for potential embedding. + * + * @see WP_Embed::autoembed_callback() + * + * @param string $content The content to be searched. + * @return string Potentially modified $content. + */ + public function autoembed( $content ) { + // Replace line breaks from all HTML elements with placeholders. + $content = wp_replace_in_html_tags( $content, array( "\n" => '<!-- wp-line-break -->' ) ); + + if ( preg_match( '#(^|\s|>)https?://#i', $content ) ) { + // Find URLs on their own line. + $content = preg_replace_callback( '|^(\s*)(https?://[^\s<>"]+)(\s*)$|im', array( $this, 'autoembed_callback' ), $content ); + // Find URLs in their own paragraph. + $content = preg_replace_callback( '|(<p(?: [^>]*)?>\s*)(https?://[^\s<>"]+)(\s*<\/p>)|i', array( $this, 'autoembed_callback' ), $content ); + } + + // Put the line breaks back. + return str_replace( '<!-- wp-line-break -->', "\n", $content ); + } + + /** + * Callback function for WP_Embed::autoembed(). + * + * @param array $match A regex match array. + * @return string The embed HTML on success, otherwise the original URL. + */ + public function autoembed_callback( $match ) { + $oldval = $this->linkifunknown; + $this->linkifunknown = false; + $return = $this->shortcode( array(), $match[2] ); + $this->linkifunknown = $oldval; + + return $match[1] . $return . $match[3]; + } + + /** + * Conditionally makes a hyperlink based on an internal class variable. + * + * @param string $url URL to potentially be linked. + * @return string|false Linked URL or the original URL. False if 'return_false_on_fail' is true. + */ + public function maybe_make_link( $url ) { + if ( $this->return_false_on_fail ) { + return false; + } + + $output = ( $this->linkifunknown ) ? '<a href="' . esc_url( $url ) . '">' . esc_html( $url ) . '</a>' : $url; + + /** + * Filters the returned, maybe-linked embed URL. + * + * @since 2.9.0 + * + * @param string $output The linked or original URL. + * @param string $url The original URL. + */ + return apply_filters( 'embed_maybe_make_link', $output, $url ); + } + + /** + * Find the oEmbed cache post ID for a given cache key. + * + * @since 4.9.0 + * + * @param string $cache_key oEmbed cache key. + * @return int|null Post ID on success, null on failure. + */ + public function find_oembed_post_id( $cache_key ) { + $cache_group = 'oembed_cache_post'; + $oembed_post_id = wp_cache_get( $cache_key, $cache_group ); + + if ( $oembed_post_id && 'oembed_cache' === get_post_type( $oembed_post_id ) ) { + return $oembed_post_id; + } + + $oembed_post_query = new WP_Query( + array( + 'post_type' => 'oembed_cache', + 'post_status' => 'publish', + 'name' => $cache_key, + 'posts_per_page' => 1, + 'no_found_rows' => true, + 'cache_results' => true, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'lazy_load_term_meta' => false, + ) + ); + + if ( ! empty( $oembed_post_query->posts ) ) { + // Note: 'fields' => 'ids' is not being used in order to cache the post object as it will be needed. + $oembed_post_id = $oembed_post_query->posts[0]->ID; + wp_cache_set( $cache_key, $oembed_post_id, $cache_group ); + + return $oembed_post_id; + } + + return null; + } +} diff --git a/wp-includes/class-wp-error.php b/wp-includes/class-wp-error.php new file mode 100644 index 0000000..3de8ae7 --- /dev/null +++ b/wp-includes/class-wp-error.php @@ -0,0 +1,226 @@ +<?php +/** + * WordPress Error API. + * + * Contains the WP_Error class and the is_wp_error() function. + * + * @package WordPress + */ + +/** + * WordPress Error class. + * + * Container for checking for WordPress errors and error messages. Return + * WP_Error and use is_wp_error() to check if this class is returned. Many + * core WordPress functions pass this class in the event of an error and + * if not handled properly will result in code errors. + * + * @since 2.1.0 + */ +class WP_Error { + /** + * Stores the list of errors. + * + * @since 2.1.0 + * @var array + */ + public $errors = array(); + + /** + * Stores the list of data for error codes. + * + * @since 2.1.0 + * @var array + */ + public $error_data = array(); + + /** + * Initialize the error. + * + * If `$code` is empty, the other parameters will be ignored. + * When `$code` is not empty, `$message` will be used even if + * it is empty. The `$data` parameter will be used only if it + * is not empty. + * + * Though the class is constructed with a single error code and + * message, multiple codes can be added using the `add()` method. + * + * @since 2.1.0 + * + * @param string|int $code Error code + * @param string $message Error message + * @param mixed $data Optional. Error data. + */ + public function __construct( $code = '', $message = '', $data = '' ) { + if ( empty( $code ) ) { + return; + } + + $this->errors[ $code ][] = $message; + + if ( ! empty( $data ) ) { + $this->error_data[ $code ] = $data; + } + } + + /** + * Retrieve all error codes. + * + * @since 2.1.0 + * + * @return array List of error codes, if available. + */ + public function get_error_codes() { + if ( ! $this->has_errors() ) { + return array(); + } + + return array_keys( $this->errors ); + } + + /** + * Retrieve first error code available. + * + * @since 2.1.0 + * + * @return string|int Empty string, if no error codes. + */ + public function get_error_code() { + $codes = $this->get_error_codes(); + + if ( empty( $codes ) ) { + return ''; + } + + return $codes[0]; + } + + /** + * Retrieve all error messages or error messages matching code. + * + * @since 2.1.0 + * + * @param string|int $code Optional. Retrieve messages matching code, if exists. + * @return array Error strings on success, or empty array on failure (if using code parameter). + */ + public function get_error_messages( $code = '' ) { + // Return all messages if no code specified. + if ( empty( $code ) ) { + $all_messages = array(); + foreach ( (array) $this->errors as $code => $messages ) { + $all_messages = array_merge( $all_messages, $messages ); + } + + return $all_messages; + } + + if ( isset( $this->errors[ $code ] ) ) { + return $this->errors[ $code ]; + } else { + return array(); + } + } + + /** + * Get single error message. + * + * This will get the first message available for the code. If no code is + * given then the first code available will be used. + * + * @since 2.1.0 + * + * @param string|int $code Optional. Error code to retrieve message. + * @return string + */ + public function get_error_message( $code = '' ) { + if ( empty( $code ) ) { + $code = $this->get_error_code(); + } + $messages = $this->get_error_messages( $code ); + if ( empty( $messages ) ) { + return ''; + } + return $messages[0]; + } + + /** + * Retrieve error data for error code. + * + * @since 2.1.0 + * + * @param string|int $code Optional. Error code. + * @return mixed Error data, if it exists. + */ + public function get_error_data( $code = '' ) { + if ( empty( $code ) ) { + $code = $this->get_error_code(); + } + + if ( isset( $this->error_data[ $code ] ) ) { + return $this->error_data[ $code ]; + } + } + + /** + * Verify if the instance contains errors. + * + * @since 5.1.0 + * + * @return bool + */ + public function has_errors() { + if ( ! empty( $this->errors ) ) { + return true; + } + return false; + } + + /** + * Add an error or append additional message to an existing error. + * + * @since 2.1.0 + * + * @param string|int $code Error code. + * @param string $message Error message. + * @param mixed $data Optional. Error data. + */ + public function add( $code, $message, $data = '' ) { + $this->errors[ $code ][] = $message; + if ( ! empty( $data ) ) { + $this->error_data[ $code ] = $data; + } + } + + /** + * Add data for error code. + * + * The error code can only contain one error data. + * + * @since 2.1.0 + * + * @param mixed $data Error data. + * @param string|int $code Error code. + */ + public function add_data( $data, $code = '' ) { + if ( empty( $code ) ) { + $code = $this->get_error_code(); + } + + $this->error_data[ $code ] = $data; + } + + /** + * Removes the specified error. + * + * This function removes all error messages associated with the specified + * error code, along with any error data for that code. + * + * @since 4.1.0 + * + * @param string|int $code Error code. + */ + public function remove( $code ) { + unset( $this->errors[ $code ] ); + unset( $this->error_data[ $code ] ); + } +} diff --git a/wp-includes/class-wp-fatal-error-handler.php b/wp-includes/class-wp-fatal-error-handler.php new file mode 100644 index 0000000..43135e7 --- /dev/null +++ b/wp-includes/class-wp-fatal-error-handler.php @@ -0,0 +1,230 @@ +<?php +/** + * Error Protection API: WP_Fatal_Error_Handler class + * + * @package WordPress + * @since 5.2.0 + */ + +/** + * Core class used as the default shutdown handler for fatal errors. + * + * A drop-in 'fatal-error-handler.php' can be used to override the instance of this class and use a custom + * implementation for the fatal error handler that WordPress registers. The custom class should extend this class and + * can override its methods individually as necessary. The file must return the instance of the class that should be + * registered. + * + * @since 5.2.0 + */ +class WP_Fatal_Error_Handler { + + /** + * Runs the shutdown handler. + * + * This method is registered via `register_shutdown_function()`. + * + * @since 5.2.0 + */ + public function handle() { + if ( defined( 'WP_SANDBOX_SCRAPING' ) && WP_SANDBOX_SCRAPING ) { + return; + } + + try { + // Bail if no error found. + $error = $this->detect_error(); + if ( ! $error ) { + return; + } + + if ( ! isset( $GLOBALS['wp_locale'] ) && function_exists( 'load_default_textdomain' ) ) { + load_default_textdomain(); + } + + $handled = false; + + if ( ! is_multisite() && wp_recovery_mode()->is_initialized() ) { + $handled = wp_recovery_mode()->handle_error( $error ); + } + + // Display the PHP error template if headers not sent. + if ( is_admin() || ! headers_sent() ) { + $this->display_error_template( $error, $handled ); + } + } catch ( Exception $e ) { + // Catch exceptions and remain silent. + } + } + + /** + * Detects the error causing the crash if it should be handled. + * + * @since 5.2.0 + * + * @return array|null Error that was triggered, or null if no error received or if the error should not be handled. + */ + protected function detect_error() { + $error = error_get_last(); + + // No error, just skip the error handling code. + if ( null === $error ) { + return null; + } + + // Bail if this error should not be handled. + if ( ! $this->should_handle_error( $error ) ) { + return null; + } + + return $error; + } + + /** + * Determines whether we are dealing with an error that WordPress should handle + * in order to protect the admin backend against WSODs. + * + * @since 5.2.0 + * + * @param array $error Error information retrieved from error_get_last(). + * @return bool Whether WordPress should handle this error. + */ + protected function should_handle_error( $error ) { + $error_types_to_handle = array( + E_ERROR, + E_PARSE, + E_USER_ERROR, + E_COMPILE_ERROR, + E_RECOVERABLE_ERROR, + ); + + if ( isset( $error['type'] ) && in_array( $error['type'], $error_types_to_handle, true ) ) { + return true; + } + + /** + * Filters whether a given thrown error should be handled by the fatal error handler. + * + * This filter is only fired if the error is not already configured to be handled by WordPress core. As such, + * it exclusively allows adding further rules for which errors should be handled, but not removing existing + * ones. + * + * @since 5.2.0 + * + * @param bool $should_handle_error Whether the error should be handled by the fatal error handler. + * @param array $error Error information retrieved from error_get_last(). + */ + return (bool) apply_filters( 'wp_should_handle_php_error', false, $error ); + } + + /** + * Displays the PHP error template and sends the HTTP status code, typically 500. + * + * A drop-in 'php-error.php' can be used as a custom template. This drop-in should control the HTTP status code and + * print the HTML markup indicating that a PHP error occurred. Note that this drop-in may potentially be executed + * very early in the WordPress bootstrap process, so any core functions used that are not part of + * `wp-includes/load.php` should be checked for before being called. + * + * If no such drop-in is available, this will call {@see WP_Fatal_Error_Handler::display_default_error_template()}. + * + * @since 5.2.0 + * @since 5.3.0 The `$handled` parameter was added. + * + * @param array $error Error information retrieved from `error_get_last()`. + * @param true|WP_Error $handled Whether Recovery Mode handled the fatal error. + */ + protected function display_error_template( $error, $handled ) { + if ( defined( 'WP_CONTENT_DIR' ) ) { + // Load custom PHP error template, if present. + $php_error_pluggable = WP_CONTENT_DIR . '/php-error.php'; + if ( is_readable( $php_error_pluggable ) ) { + require_once $php_error_pluggable; + + return; + } + } + + // Otherwise, display the default error template. + $this->display_default_error_template( $error, $handled ); + } + + /** + * Displays the default PHP error template. + * + * This method is called conditionally if no 'php-error.php' drop-in is available. + * + * It calls {@see wp_die()} with a message indicating that the site is experiencing technical difficulties and a + * login link to the admin backend. The {@see 'wp_php_error_message'} and {@see 'wp_php_error_args'} filters can + * be used to modify these parameters. + * + * @since 5.2.0 + * @since 5.3.0 The `$handled` parameter was added. + * + * @param array $error Error information retrieved from `error_get_last()`. + * @param true|WP_Error $handled Whether Recovery Mode handled the fatal error. + */ + protected function display_default_error_template( $error, $handled ) { + if ( ! function_exists( '__' ) ) { + wp_load_translations_early(); + } + + if ( ! function_exists( 'wp_die' ) ) { + require_once ABSPATH . WPINC . '/functions.php'; + } + + if ( ! class_exists( 'WP_Error' ) ) { + require_once ABSPATH . WPINC . '/class-wp-error.php'; + } + + if ( true === $handled && wp_is_recovery_mode() ) { + $message = __( 'There has been a critical error on your website, putting it in recovery mode. Please check the Themes and Plugins screens for more details. If you just installed or updated a theme or plugin, check the relevant page for that first.' ); + } elseif ( is_protected_endpoint() ) { + $message = __( 'There has been a critical error on your website. Please check your site admin email inbox for instructions.' ); + } else { + $message = __( 'There has been a critical error on your website.' ); + } + + $message = sprintf( + '<p>%s</p><p><a href="%s">%s</a></p>', + $message, + /* translators: Documentation explaining debugging in WordPress. */ + __( 'https://wordpress.org/support/article/debugging-in-wordpress/' ), + __( 'Learn more about debugging in WordPress.' ) + ); + + $args = array( + 'response' => 500, + 'exit' => false, + ); + + /** + * Filters the message that the default PHP error template displays. + * + * @since 5.2.0 + * + * @param string $message HTML error message to display. + * @param array $error Error information retrieved from `error_get_last()`. + */ + $message = apply_filters( 'wp_php_error_message', $message, $error ); + + /** + * Filters the arguments passed to {@see wp_die()} for the default PHP error template. + * + * @since 5.2.0 + * + * @param array $args Associative array of arguments passed to `wp_die()`. By default these contain a + * 'response' key, and optionally 'link_url' and 'link_text' keys. + * @param array $error Error information retrieved from `error_get_last()`. + */ + $args = apply_filters( 'wp_php_error_args', $args, $error ); + + $wp_error = new WP_Error( + 'internal_server_error', + $message, + array( + 'error' => $error, + ) + ); + + wp_die( $wp_error, '', $args ); + } +} diff --git a/wp-includes/class-wp-feed-cache-transient.php b/wp-includes/class-wp-feed-cache-transient.php new file mode 100644 index 0000000..f304ef8 --- /dev/null +++ b/wp-includes/class-wp-feed-cache-transient.php @@ -0,0 +1,132 @@ +<?php +/** + * Feed API: WP_Feed_Cache_Transient class + * + * @package WordPress + * @subpackage Feed + * @since 4.7.0 + */ + +/** + * Core class used to implement feed cache transients. + * + * @since 2.8.0 + */ +class WP_Feed_Cache_Transient { + + /** + * Holds the transient name. + * + * @since 2.8.0 + * @var string + */ + public $name; + + /** + * Holds the transient mod name. + * + * @since 2.8.0 + * @var string + */ + public $mod_name; + + /** + * Holds the cache duration in seconds. + * + * Defaults to 43200 seconds (12 hours). + * + * @since 2.8.0 + * @var int + */ + public $lifetime = 43200; + + /** + * Constructor. + * + * @since 2.8.0 + * @since 3.2.0 Updated to use a PHP5 constructor. + * + * @param string $location URL location (scheme is used to determine handler). + * @param string $filename Unique identifier for cache object. + * @param string $extension 'spi' or 'spc'. + */ + public function __construct( $location, $filename, $extension ) { + $this->name = 'feed_' . $filename; + $this->mod_name = 'feed_mod_' . $filename; + + $lifetime = $this->lifetime; + /** + * Filters the transient lifetime of the feed cache. + * + * @since 2.8.0 + * + * @param int $lifetime Cache duration in seconds. Default is 43200 seconds (12 hours). + * @param string $filename Unique identifier for the cache object. + */ + $this->lifetime = apply_filters( 'wp_feed_cache_transient_lifetime', $lifetime, $filename ); + } + + /** + * Sets the transient. + * + * @since 2.8.0 + * + * @param SimplePie $data Data to save. + * @return true Always true. + */ + public function save( $data ) { + if ( $data instanceof SimplePie ) { + $data = $data->data; + } + + set_transient( $this->name, $data, $this->lifetime ); + set_transient( $this->mod_name, time(), $this->lifetime ); + return true; + } + + /** + * Gets the transient. + * + * @since 2.8.0 + * + * @return mixed Transient value. + */ + public function load() { + return get_transient( $this->name ); + } + + /** + * Gets mod transient. + * + * @since 2.8.0 + * + * @return mixed Transient value. + */ + public function mtime() { + return get_transient( $this->mod_name ); + } + + /** + * Sets mod transient. + * + * @since 2.8.0 + * + * @return bool False if value was not set and true if value was set. + */ + public function touch() { + return set_transient( $this->mod_name, time(), $this->lifetime ); + } + + /** + * Deletes transients. + * + * @since 2.8.0 + * + * @return true Always true. + */ + public function unlink() { + delete_transient( $this->name ); + delete_transient( $this->mod_name ); + return true; + } +} diff --git a/wp-includes/class-wp-feed-cache.php b/wp-includes/class-wp-feed-cache.php new file mode 100644 index 0000000..2564dff --- /dev/null +++ b/wp-includes/class-wp-feed-cache.php @@ -0,0 +1,32 @@ +<?php +/** + * Feed API: WP_Feed_Cache class + * + * @package WordPress + * @subpackage Feed + * @since 4.7.0 + */ + +/** + * Core class used to implement a feed cache. + * + * @since 2.8.0 + * + * @see SimplePie_Cache + */ +class WP_Feed_Cache extends SimplePie_Cache { + + /** + * Creates a new SimplePie_Cache object. + * + * @since 2.8.0 + * + * @param string $location URL location (scheme is used to determine handler). + * @param string $filename Unique identifier for cache object. + * @param string $extension 'spi' or 'spc'. + * @return WP_Feed_Cache_Transient Feed cache handler object that uses transients. + */ + public function create( $location, $filename, $extension ) { + return new WP_Feed_Cache_Transient( $location, $filename, $extension ); + } +} diff --git a/wp-includes/class-wp-hook.php b/wp-includes/class-wp-hook.php new file mode 100644 index 0000000..f744622 --- /dev/null +++ b/wp-includes/class-wp-hook.php @@ -0,0 +1,510 @@ +<?php +/** + * Plugin API: WP_Hook class + * + * @package WordPress + * @subpackage Plugin + * @since 4.7.0 + */ + +/** + * Core class used to implement action and filter hook functionality. + * + * @since 4.7.0 + * + * @see Iterator + * @see ArrayAccess + */ +final class WP_Hook implements Iterator, ArrayAccess { + + /** + * Hook callbacks. + * + * @since 4.7.0 + * @var array + */ + public $callbacks = array(); + + /** + * The priority keys of actively running iterations of a hook. + * + * @since 4.7.0 + * @var array + */ + private $iterations = array(); + + /** + * The current priority of actively running iterations of a hook. + * + * @since 4.7.0 + * @var array + */ + private $current_priority = array(); + + /** + * Number of levels this hook can be recursively called. + * + * @since 4.7.0 + * @var int + */ + private $nesting_level = 0; + + /** + * Flag for if we're current doing an action, rather than a filter. + * + * @since 4.7.0 + * @var bool + */ + private $doing_action = false; + + /** + * Hooks a function or method to a specific filter action. + * + * @since 4.7.0 + * + * @param string $tag The name of the filter to hook the $function_to_add callback to. + * @param callable $function_to_add The callback to be run when the filter is applied. + * @param int $priority The order in which the functions associated with a particular action + * are executed. Lower numbers correspond with earlier execution, + * and functions with the same priority are executed in the order + * in which they were added to the action. + * @param int $accepted_args The number of arguments the function accepts. + */ + public function add_filter( $tag, $function_to_add, $priority, $accepted_args ) { + $idx = _wp_filter_build_unique_id( $tag, $function_to_add, $priority ); + + $priority_existed = isset( $this->callbacks[ $priority ] ); + + $this->callbacks[ $priority ][ $idx ] = array( + 'function' => $function_to_add, + 'accepted_args' => $accepted_args, + ); + + // If we're adding a new priority to the list, put them back in sorted order. + if ( ! $priority_existed && count( $this->callbacks ) > 1 ) { + ksort( $this->callbacks, SORT_NUMERIC ); + } + + if ( $this->nesting_level > 0 ) { + $this->resort_active_iterations( $priority, $priority_existed ); + } + } + + /** + * Handles resetting callback priority keys mid-iteration. + * + * @since 4.7.0 + * + * @param bool|int $new_priority Optional. The priority of the new filter being added. Default false, + * for no priority being added. + * @param bool $priority_existed Optional. Flag for whether the priority already existed before the new + * filter was added. Default false. + */ + private function resort_active_iterations( $new_priority = false, $priority_existed = false ) { + $new_priorities = array_keys( $this->callbacks ); + + // If there are no remaining hooks, clear out all running iterations. + if ( ! $new_priorities ) { + foreach ( $this->iterations as $index => $iteration ) { + $this->iterations[ $index ] = $new_priorities; + } + return; + } + + $min = min( $new_priorities ); + foreach ( $this->iterations as $index => &$iteration ) { + $current = current( $iteration ); + // If we're already at the end of this iteration, just leave the array pointer where it is. + if ( false === $current ) { + continue; + } + + $iteration = $new_priorities; + + if ( $current < $min ) { + array_unshift( $iteration, $current ); + continue; + } + + while ( current( $iteration ) < $current ) { + if ( false === next( $iteration ) ) { + break; + } + } + + // If we have a new priority that didn't exist, but ::apply_filters() or ::do_action() thinks it's the current priority... + if ( $new_priority === $this->current_priority[ $index ] && ! $priority_existed ) { + /* + * ...and the new priority is the same as what $this->iterations thinks is the previous + * priority, we need to move back to it. + */ + + if ( false === current( $iteration ) ) { + // If we've already moved off the end of the array, go back to the last element. + $prev = end( $iteration ); + } else { + // Otherwise, just go back to the previous element. + $prev = prev( $iteration ); + } + if ( false === $prev ) { + // Start of the array. Reset, and go about our day. + reset( $iteration ); + } elseif ( $new_priority !== $prev ) { + // Previous wasn't the same. Move forward again. + next( $iteration ); + } + } + } + unset( $iteration ); + } + + /** + * Unhooks a function or method from a specific filter action. + * + * @since 4.7.0 + * + * @param string $tag The filter hook to which the function to be removed is hooked. + * @param callable $function_to_remove The callback to be removed from running when the filter is applied. + * @param int $priority The exact priority used when adding the original filter callback. + * @return bool Whether the callback existed before it was removed. + */ + public function remove_filter( $tag, $function_to_remove, $priority ) { + $function_key = _wp_filter_build_unique_id( $tag, $function_to_remove, $priority ); + + $exists = isset( $this->callbacks[ $priority ][ $function_key ] ); + if ( $exists ) { + unset( $this->callbacks[ $priority ][ $function_key ] ); + if ( ! $this->callbacks[ $priority ] ) { + unset( $this->callbacks[ $priority ] ); + if ( $this->nesting_level > 0 ) { + $this->resort_active_iterations(); + } + } + } + return $exists; + } + + /** + * Checks if a specific action has been registered for this hook. + * + * @since 4.7.0 + * + * @param string $tag Optional. The name of the filter hook. Default empty. + * @param callable|bool $function_to_check Optional. The callback to check for. Default false. + * @return bool|int The priority of that hook is returned, or false if the function is not attached. + */ + public function has_filter( $tag = '', $function_to_check = false ) { + if ( false === $function_to_check ) { + return $this->has_filters(); + } + + $function_key = _wp_filter_build_unique_id( $tag, $function_to_check, false ); + if ( ! $function_key ) { + return false; + } + + foreach ( $this->callbacks as $priority => $callbacks ) { + if ( isset( $callbacks[ $function_key ] ) ) { + return $priority; + } + } + + return false; + } + + /** + * Checks if any callbacks have been registered for this hook. + * + * @since 4.7.0 + * + * @return bool True if callbacks have been registered for the current hook, otherwise false. + */ + public function has_filters() { + foreach ( $this->callbacks as $callbacks ) { + if ( $callbacks ) { + return true; + } + } + return false; + } + + /** + * Removes all callbacks from the current filter. + * + * @since 4.7.0 + * + * @param int|bool $priority Optional. The priority number to remove. Default false. + */ + public function remove_all_filters( $priority = false ) { + if ( ! $this->callbacks ) { + return; + } + + if ( false === $priority ) { + $this->callbacks = array(); + } elseif ( isset( $this->callbacks[ $priority ] ) ) { + unset( $this->callbacks[ $priority ] ); + } + + if ( $this->nesting_level > 0 ) { + $this->resort_active_iterations(); + } + } + + /** + * Calls the callback functions that have been added to a filter hook. + * + * @since 4.7.0 + * + * @param mixed $value The value to filter. + * @param array $args Additional parameters to pass to the callback functions. + * This array is expected to include $value at index 0. + * @return mixed The filtered value after all hooked functions are applied to it. + */ + public function apply_filters( $value, $args ) { + if ( ! $this->callbacks ) { + return $value; + } + + $nesting_level = $this->nesting_level++; + + $this->iterations[ $nesting_level ] = array_keys( $this->callbacks ); + $num_args = count( $args ); + + do { + $this->current_priority[ $nesting_level ] = current( $this->iterations[ $nesting_level ] ); + $priority = $this->current_priority[ $nesting_level ]; + + foreach ( $this->callbacks[ $priority ] as $the_ ) { + if ( ! $this->doing_action ) { + $args[0] = $value; + } + + // Avoid the array_slice() if possible. + if ( 0 == $the_['accepted_args'] ) { + $value = call_user_func( $the_['function'] ); + } elseif ( $the_['accepted_args'] >= $num_args ) { + $value = call_user_func_array( $the_['function'], $args ); + } else { + $value = call_user_func_array( $the_['function'], array_slice( $args, 0, (int) $the_['accepted_args'] ) ); + } + } + } while ( false !== next( $this->iterations[ $nesting_level ] ) ); + + unset( $this->iterations[ $nesting_level ] ); + unset( $this->current_priority[ $nesting_level ] ); + + $this->nesting_level--; + + return $value; + } + + /** + * Calls the callback functions that have been added to an action hook. + * + * @since 4.7.0 + * + * @param array $args Parameters to pass to the callback functions. + */ + public function do_action( $args ) { + $this->doing_action = true; + $this->apply_filters( '', $args ); + + // If there are recursive calls to the current action, we haven't finished it until we get to the last one. + if ( ! $this->nesting_level ) { + $this->doing_action = false; + } + } + + /** + * Processes the functions hooked into the 'all' hook. + * + * @since 4.7.0 + * + * @param array $args Arguments to pass to the hook callbacks. Passed by reference. + */ + public function do_all_hook( &$args ) { + $nesting_level = $this->nesting_level++; + $this->iterations[ $nesting_level ] = array_keys( $this->callbacks ); + + do { + $priority = current( $this->iterations[ $nesting_level ] ); + foreach ( $this->callbacks[ $priority ] as $the_ ) { + call_user_func_array( $the_['function'], $args ); + } + } while ( false !== next( $this->iterations[ $nesting_level ] ) ); + + unset( $this->iterations[ $nesting_level ] ); + $this->nesting_level--; + } + + /** + * Return the current priority level of the currently running iteration of the hook. + * + * @since 4.7.0 + * + * @return int|false If the hook is running, return the current priority level. If it isn't running, return false. + */ + public function current_priority() { + if ( false === current( $this->iterations ) ) { + return false; + } + + return current( current( $this->iterations ) ); + } + + /** + * Normalizes filters set up before WordPress has initialized to WP_Hook objects. + * + * @since 4.7.0 + * + * @param array $filters Filters to normalize. + * @return WP_Hook[] Array of normalized filters. + */ + public static function build_preinitialized_hooks( $filters ) { + /** @var WP_Hook[] $normalized */ + $normalized = array(); + + foreach ( $filters as $tag => $callback_groups ) { + if ( is_object( $callback_groups ) && $callback_groups instanceof WP_Hook ) { + $normalized[ $tag ] = $callback_groups; + continue; + } + $hook = new WP_Hook(); + + // Loop through callback groups. + foreach ( $callback_groups as $priority => $callbacks ) { + + // Loop through callbacks. + foreach ( $callbacks as $cb ) { + $hook->add_filter( $tag, $cb['function'], $priority, $cb['accepted_args'] ); + } + } + $normalized[ $tag ] = $hook; + } + return $normalized; + } + + /** + * Determines whether an offset value exists. + * + * @since 4.7.0 + * + * @link https://www.php.net/manual/en/arrayaccess.offsetexists.php + * + * @param mixed $offset An offset to check for. + * @return bool True if the offset exists, false otherwise. + */ + public function offsetExists( $offset ) { + return isset( $this->callbacks[ $offset ] ); + } + + /** + * Retrieves a value at a specified offset. + * + * @since 4.7.0 + * + * @link https://www.php.net/manual/en/arrayaccess.offsetget.php + * + * @param mixed $offset The offset to retrieve. + * @return mixed If set, the value at the specified offset, null otherwise. + */ + public function offsetGet( $offset ) { + return isset( $this->callbacks[ $offset ] ) ? $this->callbacks[ $offset ] : null; + } + + /** + * Sets a value at a specified offset. + * + * @since 4.7.0 + * + * @link https://www.php.net/manual/en/arrayaccess.offsetset.php + * + * @param mixed $offset The offset to assign the value to. + * @param mixed $value The value to set. + */ + public function offsetSet( $offset, $value ) { + if ( is_null( $offset ) ) { + $this->callbacks[] = $value; + } else { + $this->callbacks[ $offset ] = $value; + } + } + + /** + * Unsets a specified offset. + * + * @since 4.7.0 + * + * @link https://www.php.net/manual/en/arrayaccess.offsetunset.php + * + * @param mixed $offset The offset to unset. + */ + public function offsetUnset( $offset ) { + unset( $this->callbacks[ $offset ] ); + } + + /** + * Returns the current element. + * + * @since 4.7.0 + * + * @link https://www.php.net/manual/en/iterator.current.php + * + * @return array Of callbacks at current priority. + */ + public function current() { + return current( $this->callbacks ); + } + + /** + * Moves forward to the next element. + * + * @since 4.7.0 + * + * @link https://www.php.net/manual/en/iterator.next.php + * + * @return array Of callbacks at next priority. + */ + public function next() { + return next( $this->callbacks ); + } + + /** + * Returns the key of the current element. + * + * @since 4.7.0 + * + * @link https://www.php.net/manual/en/iterator.key.php + * + * @return mixed Returns current priority on success, or NULL on failure + */ + public function key() { + return key( $this->callbacks ); + } + + /** + * Checks if current position is valid. + * + * @since 4.7.0 + * + * @link https://www.php.net/manual/en/iterator.valid.php + * + * @return boolean + */ + public function valid() { + return key( $this->callbacks ) !== null; + } + + /** + * Rewinds the Iterator to the first element. + * + * @since 4.7.0 + * + * @link https://www.php.net/manual/en/iterator.rewind.php + */ + public function rewind() { + reset( $this->callbacks ); + } + +} diff --git a/wp-includes/class-wp-http-cookie.php b/wp-includes/class-wp-http-cookie.php new file mode 100644 index 0000000..24bfbba --- /dev/null +++ b/wp-includes/class-wp-http-cookie.php @@ -0,0 +1,261 @@ +<?php +/** + * HTTP API: WP_Http_Cookie class + * + * @package WordPress + * @subpackage HTTP + * @since 4.4.0 + */ + +/** + * Core class used to encapsulate a single cookie object for internal use. + * + * Returned cookies are represented using this class, and when cookies are set, if they are not + * already a WP_Http_Cookie() object, then they are turned into one. + * + * @todo The WordPress convention is to use underscores instead of camelCase for function and method + * names. Need to switch to use underscores instead for the methods. + * + * @since 2.8.0 + */ +class WP_Http_Cookie { + + /** + * Cookie name. + * + * @since 2.8.0 + * @var string + */ + public $name; + + /** + * Cookie value. + * + * @since 2.8.0 + * @var string + */ + public $value; + + /** + * When the cookie expires. Unix timestamp or formatted date. + * + * @since 2.8.0 + * @var string|int|null + */ + public $expires; + + /** + * Cookie URL path. + * + * @since 2.8.0 + * @var string + */ + public $path; + + /** + * Cookie Domain. + * + * @since 2.8.0 + * @var string + */ + public $domain; + + /** + * host-only flag. + * + * @since 5.2.0 + * @var bool + */ + public $host_only; + + /** + * Sets up this cookie object. + * + * The parameter $data should be either an associative array containing the indices names below + * or a header string detailing it. + * + * @since 2.8.0 + * @since 5.2.0 Added `host_only` to the `$data` parameter. + * + * @param string|array $data { + * Raw cookie data as header string or data array. + * + * @type string $name Cookie name. + * @type mixed $value Value. Should NOT already be urlencoded. + * @type string|int|null $expires Optional. Unix timestamp or formatted date. Default null. + * @type string $path Optional. Path. Default '/'. + * @type string $domain Optional. Domain. Default host of parsed $requested_url. + * @type int $port Optional. Port. Default null. + * @type bool $host_only Optional. host-only storage flag. Default true. + * } + * @param string $requested_url The URL which the cookie was set on, used for default $domain + * and $port values. + */ + public function __construct( $data, $requested_url = '' ) { + if ( $requested_url ) { + $arrURL = @parse_url( $requested_url ); + } + if ( isset( $arrURL['host'] ) ) { + $this->domain = $arrURL['host']; + } + $this->path = isset( $arrURL['path'] ) ? $arrURL['path'] : '/'; + if ( '/' != substr( $this->path, -1 ) ) { + $this->path = dirname( $this->path ) . '/'; + } + + if ( is_string( $data ) ) { + // Assume it's a header string direct from a previous request. + $pairs = explode( ';', $data ); + + // Special handling for first pair; name=value. Also be careful of "=" in value. + $name = trim( substr( $pairs[0], 0, strpos( $pairs[0], '=' ) ) ); + $value = substr( $pairs[0], strpos( $pairs[0], '=' ) + 1 ); + $this->name = $name; + $this->value = urldecode( $value ); + + // Removes name=value from items. + array_shift( $pairs ); + + // Set everything else as a property. + foreach ( $pairs as $pair ) { + $pair = rtrim( $pair ); + + // Handle the cookie ending in ; which results in a empty final pair. + if ( empty( $pair ) ) { + continue; + } + + list( $key, $val ) = strpos( $pair, '=' ) ? explode( '=', $pair ) : array( $pair, '' ); + $key = strtolower( trim( $key ) ); + if ( 'expires' == $key ) { + $val = strtotime( $val ); + } + $this->$key = $val; + } + } else { + if ( ! isset( $data['name'] ) ) { + return; + } + + // Set properties based directly on parameters. + foreach ( array( 'name', 'value', 'path', 'domain', 'port', 'host_only' ) as $field ) { + if ( isset( $data[ $field ] ) ) { + $this->$field = $data[ $field ]; + } + } + + if ( isset( $data['expires'] ) ) { + $this->expires = is_int( $data['expires'] ) ? $data['expires'] : strtotime( $data['expires'] ); + } else { + $this->expires = null; + } + } + } + + /** + * Confirms that it's OK to send this cookie to the URL checked against. + * + * Decision is based on RFC 2109/2965, so look there for details on validity. + * + * @since 2.8.0 + * + * @param string $url URL you intend to send this cookie to + * @return bool true if allowed, false otherwise. + */ + public function test( $url ) { + if ( is_null( $this->name ) ) { + return false; + } + + // Expires - if expired then nothing else matters. + if ( isset( $this->expires ) && time() > $this->expires ) { + return false; + } + + // Get details on the URL we're thinking about sending to. + $url = parse_url( $url ); + $url['port'] = isset( $url['port'] ) ? $url['port'] : ( 'https' == $url['scheme'] ? 443 : 80 ); + $url['path'] = isset( $url['path'] ) ? $url['path'] : '/'; + + // Values to use for comparison against the URL. + $path = isset( $this->path ) ? $this->path : '/'; + $port = isset( $this->port ) ? $this->port : null; + $domain = isset( $this->domain ) ? strtolower( $this->domain ) : strtolower( $url['host'] ); + if ( false === stripos( $domain, '.' ) ) { + $domain .= '.local'; + } + + // Host - very basic check that the request URL ends with the domain restriction (minus leading dot). + $domain = substr( $domain, 0, 1 ) == '.' ? substr( $domain, 1 ) : $domain; + if ( substr( $url['host'], -strlen( $domain ) ) != $domain ) { + return false; + } + + // Port - supports "port-lists" in the format: "80,8000,8080". + if ( ! empty( $port ) && ! in_array( $url['port'], explode( ',', $port ) ) ) { + return false; + } + + // Path - request path must start with path restriction. + if ( substr( $url['path'], 0, strlen( $path ) ) != $path ) { + return false; + } + + return true; + } + + /** + * Convert cookie name and value back to header string. + * + * @since 2.8.0 + * + * @return string Header encoded cookie name and value. + */ + public function getHeaderValue() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid + if ( ! isset( $this->name ) || ! isset( $this->value ) ) { + return ''; + } + + /** + * Filters the header-encoded cookie value. + * + * @since 3.4.0 + * + * @param string $value The cookie value. + * @param string $name The cookie name. + */ + return $this->name . '=' . apply_filters( 'wp_http_cookie_value', $this->value, $this->name ); + } + + /** + * Retrieve cookie header for usage in the rest of the WordPress HTTP API. + * + * @since 2.8.0 + * + * @return string + */ + public function getFullHeader() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid + return 'Cookie: ' . $this->getHeaderValue(); + } + + /** + * Retrieves cookie attributes. + * + * @since 4.6.0 + * + * @return array { + * List of attributes. + * + * @type string|int|null $expires When the cookie expires. Unix timestamp or formatted date. + * @type string $path Cookie URL path. + * @type string $domain Cookie domain. + * } + */ + public function get_attributes() { + return array( + 'expires' => $this->expires, + 'path' => $this->path, + 'domain' => $this->domain, + ); + } +} diff --git a/wp-includes/class-wp-http-curl.php b/wp-includes/class-wp-http-curl.php new file mode 100644 index 0000000..8225a29 --- /dev/null +++ b/wp-includes/class-wp-http-curl.php @@ -0,0 +1,408 @@ +<?php +/** + * HTTP API: WP_Http_Curl class + * + * @package WordPress + * @subpackage HTTP + * @since 4.4.0 + */ + +/** + * Core class used to integrate Curl as an HTTP transport. + * + * HTTP request method uses Curl extension to retrieve the url. + * + * Requires the Curl extension to be installed. + * + * @since 2.7.0 + */ +class WP_Http_Curl { + + /** + * Temporary header storage for during requests. + * + * @since 3.2.0 + * @var string + */ + private $headers = ''; + + /** + * Temporary body storage for during requests. + * + * @since 3.6.0 + * @var string + */ + private $body = ''; + + /** + * The maximum amount of data to receive from the remote server. + * + * @since 3.6.0 + * @var int|false + */ + private $max_body_length = false; + + /** + * The file resource used for streaming to file. + * + * @since 3.6.0 + * @var resource|false + */ + private $stream_handle = false; + + /** + * The total bytes written in the current request. + * + * @since 4.1.0 + * @var int + */ + private $bytes_written_total = 0; + + /** + * Send a HTTP request to a URI using cURL extension. + * + * @since 2.7.0 + * + * @param string $url The request URL. + * @param string|array $args Optional. Override the defaults. + * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error + */ + public function request( $url, $args = array() ) { + $defaults = array( + 'method' => 'GET', + 'timeout' => 5, + 'redirection' => 5, + 'httpversion' => '1.0', + 'blocking' => true, + 'headers' => array(), + 'body' => null, + 'cookies' => array(), + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + if ( isset( $parsed_args['headers']['User-Agent'] ) ) { + $parsed_args['user-agent'] = $parsed_args['headers']['User-Agent']; + unset( $parsed_args['headers']['User-Agent'] ); + } elseif ( isset( $parsed_args['headers']['user-agent'] ) ) { + $parsed_args['user-agent'] = $parsed_args['headers']['user-agent']; + unset( $parsed_args['headers']['user-agent'] ); + } + + // Construct Cookie: header if any cookies are set. + WP_Http::buildCookieHeader( $parsed_args ); + + $handle = curl_init(); + + // cURL offers really easy proxy support. + $proxy = new WP_HTTP_Proxy(); + + if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { + + curl_setopt( $handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP ); + curl_setopt( $handle, CURLOPT_PROXY, $proxy->host() ); + curl_setopt( $handle, CURLOPT_PROXYPORT, $proxy->port() ); + + if ( $proxy->use_authentication() ) { + curl_setopt( $handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY ); + curl_setopt( $handle, CURLOPT_PROXYUSERPWD, $proxy->authentication() ); + } + } + + $is_local = isset( $parsed_args['local'] ) && $parsed_args['local']; + $ssl_verify = isset( $parsed_args['sslverify'] ) && $parsed_args['sslverify']; + if ( $is_local ) { + /** This filter is documented in wp-includes/class-wp-http-streams.php */ + $ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify, $url ); + } elseif ( ! $is_local ) { + /** This filter is documented in wp-includes/class-http.php */ + $ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify, $url ); + } + + /* + * CURLOPT_TIMEOUT and CURLOPT_CONNECTTIMEOUT expect integers. Have to use ceil since. + * a value of 0 will allow an unlimited timeout. + */ + $timeout = (int) ceil( $parsed_args['timeout'] ); + curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, $timeout ); + curl_setopt( $handle, CURLOPT_TIMEOUT, $timeout ); + + curl_setopt( $handle, CURLOPT_URL, $url ); + curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true ); + curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, ( true === $ssl_verify ) ? 2 : false ); + curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify ); + + if ( $ssl_verify ) { + curl_setopt( $handle, CURLOPT_CAINFO, $parsed_args['sslcertificates'] ); + } + + curl_setopt( $handle, CURLOPT_USERAGENT, $parsed_args['user-agent'] ); + + /* + * The option doesn't work with safe mode or when open_basedir is set, and there's + * a bug #17490 with redirected POST requests, so handle redirections outside Curl. + */ + curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, false ); + curl_setopt( $handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS ); + + switch ( $parsed_args['method'] ) { + case 'HEAD': + curl_setopt( $handle, CURLOPT_NOBODY, true ); + break; + case 'POST': + curl_setopt( $handle, CURLOPT_POST, true ); + curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] ); + break; + case 'PUT': + curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, 'PUT' ); + curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] ); + break; + default: + curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, $parsed_args['method'] ); + if ( ! is_null( $parsed_args['body'] ) ) { + curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] ); + } + break; + } + + if ( true === $parsed_args['blocking'] ) { + curl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( $this, 'stream_headers' ) ); + curl_setopt( $handle, CURLOPT_WRITEFUNCTION, array( $this, 'stream_body' ) ); + } + + curl_setopt( $handle, CURLOPT_HEADER, false ); + + if ( isset( $parsed_args['limit_response_size'] ) ) { + $this->max_body_length = intval( $parsed_args['limit_response_size'] ); + } else { + $this->max_body_length = false; + } + + // If streaming to a file open a file handle, and setup our curl streaming handler. + if ( $parsed_args['stream'] ) { + if ( ! WP_DEBUG ) { + $this->stream_handle = @fopen( $parsed_args['filename'], 'w+' ); + } else { + $this->stream_handle = fopen( $parsed_args['filename'], 'w+' ); + } + if ( ! $this->stream_handle ) { + return new WP_Error( + 'http_request_failed', + sprintf( + /* translators: 1: fopen(), 2: File name. */ + __( 'Could not open handle for %1$s to %2$s.' ), + 'fopen()', + $parsed_args['filename'] + ) + ); + } + } else { + $this->stream_handle = false; + } + + if ( ! empty( $parsed_args['headers'] ) ) { + // cURL expects full header strings in each element. + $headers = array(); + foreach ( $parsed_args['headers'] as $name => $value ) { + $headers[] = "{$name}: $value"; + } + curl_setopt( $handle, CURLOPT_HTTPHEADER, $headers ); + } + + if ( '1.0' === $parsed_args['httpversion'] ) { + curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 ); + } else { + curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 ); + } + + /** + * Fires before the cURL request is executed. + * + * Cookies are not currently handled by the HTTP API. This action allows + * plugins to handle cookies themselves. + * + * @since 2.8.0 + * + * @param resource $handle The cURL handle returned by curl_init() (passed by reference). + * @param array $parsed_args The HTTP request arguments. + * @param string $url The request URL. + */ + do_action_ref_array( 'http_api_curl', array( &$handle, $parsed_args, $url ) ); + + // We don't need to return the body, so don't. Just execute request and return. + if ( ! $parsed_args['blocking'] ) { + curl_exec( $handle ); + + $curl_error = curl_error( $handle ); + if ( $curl_error ) { + curl_close( $handle ); + return new WP_Error( 'http_request_failed', $curl_error ); + } + if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ) ) ) { + curl_close( $handle ); + return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); + } + + curl_close( $handle ); + return array( + 'headers' => array(), + 'body' => '', + 'response' => array( + 'code' => false, + 'message' => false, + ), + 'cookies' => array(), + ); + } + + curl_exec( $handle ); + $theHeaders = WP_Http::processHeaders( $this->headers, $url ); + $theBody = $this->body; + $bytes_written_total = $this->bytes_written_total; + + $this->headers = ''; + $this->body = ''; + $this->bytes_written_total = 0; + + $curl_error = curl_errno( $handle ); + + // If an error occurred, or, no response. + if ( $curl_error || ( 0 == strlen( $theBody ) && empty( $theHeaders['headers'] ) ) ) { + if ( CURLE_WRITE_ERROR /* 23 */ == $curl_error ) { + if ( ! $this->max_body_length || $this->max_body_length != $bytes_written_total ) { + if ( $parsed_args['stream'] ) { + curl_close( $handle ); + fclose( $this->stream_handle ); + return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) ); + } else { + curl_close( $handle ); + return new WP_Error( 'http_request_failed', curl_error( $handle ) ); + } + } + } else { + $curl_error = curl_error( $handle ); + if ( $curl_error ) { + curl_close( $handle ); + return new WP_Error( 'http_request_failed', $curl_error ); + } + } + if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ) ) ) { + curl_close( $handle ); + return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); + } + } + + curl_close( $handle ); + + if ( $parsed_args['stream'] ) { + fclose( $this->stream_handle ); + } + + $response = array( + 'headers' => $theHeaders['headers'], + 'body' => null, + 'response' => $theHeaders['response'], + 'cookies' => $theHeaders['cookies'], + 'filename' => $parsed_args['filename'], + ); + + // Handle redirects. + $redirect_response = WP_HTTP::handle_redirects( $url, $parsed_args, $response ); + if ( false !== $redirect_response ) { + return $redirect_response; + } + + if ( true === $parsed_args['decompress'] && true === WP_Http_Encoding::should_decode( $theHeaders['headers'] ) ) { + $theBody = WP_Http_Encoding::decompress( $theBody ); + } + + $response['body'] = $theBody; + + return $response; + } + + /** + * Grabs the headers of the cURL request. + * + * Each header is sent individually to this callback, so we append to the `$header` property + * for temporary storage + * + * @since 3.2.0 + * + * @param resource $handle cURL handle. + * @param string $headers cURL request headers. + * @return int Length of the request headers. + */ + private function stream_headers( $handle, $headers ) { + $this->headers .= $headers; + return strlen( $headers ); + } + + /** + * Grabs the body of the cURL request. + * + * The contents of the document are passed in chunks, so we append to the `$body` + * property for temporary storage. Returning a length shorter than the length of + * `$data` passed in will cause cURL to abort the request with `CURLE_WRITE_ERROR`. + * + * @since 3.6.0 + * + * @param resource $handle cURL handle. + * @param string $data cURL request body. + * @return int Total bytes of data written. + */ + private function stream_body( $handle, $data ) { + $data_length = strlen( $data ); + + if ( $this->max_body_length && ( $this->bytes_written_total + $data_length ) > $this->max_body_length ) { + $data_length = ( $this->max_body_length - $this->bytes_written_total ); + $data = substr( $data, 0, $data_length ); + } + + if ( $this->stream_handle ) { + $bytes_written = fwrite( $this->stream_handle, $data ); + } else { + $this->body .= $data; + $bytes_written = $data_length; + } + + $this->bytes_written_total += $bytes_written; + + // Upon event of this function returning less than strlen( $data ) curl will error with CURLE_WRITE_ERROR. + return $bytes_written; + } + + /** + * Determines whether this class can be used for retrieving a URL. + * + * @since 2.7.0 + * + * @param array $args Optional. Array of request arguments. Default empty array. + * @return bool False means this class can not be used, true means it can. + */ + public static function test( $args = array() ) { + if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) { + return false; + } + + $is_ssl = isset( $args['ssl'] ) && $args['ssl']; + + if ( $is_ssl ) { + $curl_version = curl_version(); + // Check whether this cURL version support SSL requests. + if ( ! ( CURL_VERSION_SSL & $curl_version['features'] ) ) { + return false; + } + } + + /** + * Filters whether cURL can be used as a transport for retrieving a URL. + * + * @since 2.7.0 + * + * @param bool $use_class Whether the class can be used. Default true. + * @param array $args An array of request arguments. + */ + return apply_filters( 'use_curl_transport', true, $args ); + } +} diff --git a/wp-includes/class-wp-http-encoding.php b/wp-includes/class-wp-http-encoding.php new file mode 100644 index 0000000..ab92865 --- /dev/null +++ b/wp-includes/class-wp-http-encoding.php @@ -0,0 +1,231 @@ +<?php +/** + * HTTP API: WP_Http_Encoding class + * + * @package WordPress + * @subpackage HTTP + * @since 4.4.0 + */ + +/** + * Core class used to implement deflate and gzip transfer encoding support for HTTP requests. + * + * Includes RFC 1950, RFC 1951, and RFC 1952. + * + * @since 2.8.0 + */ +class WP_Http_Encoding { + + /** + * Compress raw string using the deflate format. + * + * Supports the RFC 1951 standard. + * + * @since 2.8.0 + * + * @param string $raw String to compress. + * @param int $level Optional, default is 9. Compression level, 9 is highest. + * @param string $supports Optional, not used. When implemented it will choose the right compression based on what the server supports. + * @return string|false False on failure. + */ + public static function compress( $raw, $level = 9, $supports = null ) { + return gzdeflate( $raw, $level ); + } + + /** + * Decompression of deflated string. + * + * Will attempt to decompress using the RFC 1950 standard, and if that fails + * then the RFC 1951 standard deflate will be attempted. Finally, the RFC + * 1952 standard gzip decode will be attempted. If all fail, then the + * original compressed string will be returned. + * + * @since 2.8.0 + * + * @param string $compressed String to decompress. + * @param int $length The optional length of the compressed data. + * @return string|bool False on failure. + */ + public static function decompress( $compressed, $length = null ) { + + if ( empty( $compressed ) ) { + return $compressed; + } + + $decompressed = @gzinflate( $compressed ); + if ( false !== $decompressed ) { + return $decompressed; + } + + $decompressed = self::compatible_gzinflate( $compressed ); + if ( false !== $decompressed ) { + return $decompressed; + } + + $decompressed = @gzuncompress( $compressed ); + if ( false !== $decompressed ) { + return $decompressed; + } + + if ( function_exists( 'gzdecode' ) ) { + $decompressed = @gzdecode( $compressed ); + + if ( false !== $decompressed ) { + return $decompressed; + } + } + + return $compressed; + } + + /** + * Decompression of deflated string while staying compatible with the majority of servers. + * + * Certain Servers will return deflated data with headers which PHP's gzinflate() + * function cannot handle out of the box. The following function has been created from + * various snippets on the gzinflate() PHP documentation. + * + * Warning: Magic numbers within. Due to the potential different formats that the compressed + * data may be returned in, some "magic offsets" are needed to ensure proper decompression + * takes place. For a simple progmatic way to determine the magic offset in use, see: + * https://core.trac.wordpress.org/ticket/18273 + * + * @since 2.8.1 + * @link https://core.trac.wordpress.org/ticket/18273 + * @link https://www.php.net/manual/en/function.gzinflate.php#70875 + * @link https://www.php.net/manual/en/function.gzinflate.php#77336 + * + * @param string $gzData String to decompress. + * @return string|bool False on failure. + */ + public static function compatible_gzinflate( $gzData ) { + + // Compressed data might contain a full header, if so strip it for gzinflate(). + if ( substr( $gzData, 0, 3 ) == "\x1f\x8b\x08" ) { + $i = 10; + $flg = ord( substr( $gzData, 3, 1 ) ); + if ( $flg > 0 ) { + if ( $flg & 4 ) { + list($xlen) = unpack( 'v', substr( $gzData, $i, 2 ) ); + $i = $i + 2 + $xlen; + } + if ( $flg & 8 ) { + $i = strpos( $gzData, "\0", $i ) + 1; + } + if ( $flg & 16 ) { + $i = strpos( $gzData, "\0", $i ) + 1; + } + if ( $flg & 2 ) { + $i = $i + 2; + } + } + $decompressed = @gzinflate( substr( $gzData, $i, -8 ) ); + if ( false !== $decompressed ) { + return $decompressed; + } + } + + // Compressed data from java.util.zip.Deflater amongst others. + $decompressed = @gzinflate( substr( $gzData, 2 ) ); + if ( false !== $decompressed ) { + return $decompressed; + } + + return false; + } + + /** + * What encoding types to accept and their priority values. + * + * @since 2.8.0 + * + * @param string $url + * @param array $args + * @return string Types of encoding to accept. + */ + public static function accept_encoding( $url, $args ) { + $type = array(); + $compression_enabled = self::is_available(); + + if ( ! $args['decompress'] ) { // Decompression specifically disabled. + $compression_enabled = false; + } elseif ( $args['stream'] ) { // Disable when streaming to file. + $compression_enabled = false; + } elseif ( isset( $args['limit_response_size'] ) ) { // If only partial content is being requested, we won't be able to decompress it. + $compression_enabled = false; + } + + if ( $compression_enabled ) { + if ( function_exists( 'gzinflate' ) ) { + $type[] = 'deflate;q=1.0'; + } + + if ( function_exists( 'gzuncompress' ) ) { + $type[] = 'compress;q=0.5'; + } + + if ( function_exists( 'gzdecode' ) ) { + $type[] = 'gzip;q=0.5'; + } + } + + /** + * Filters the allowed encoding types. + * + * @since 3.6.0 + * + * @param string[] $type Array of what encoding types to accept and their priority values. + * @param string $url URL of the HTTP request. + * @param array $args HTTP request arguments. + */ + $type = apply_filters( 'wp_http_accept_encoding', $type, $url, $args ); + + return implode( ', ', $type ); + } + + /** + * What encoding the content used when it was compressed to send in the headers. + * + * @since 2.8.0 + * + * @return string Content-Encoding string to send in the header. + */ + public static function content_encoding() { + return 'deflate'; + } + + /** + * Whether the content be decoded based on the headers. + * + * @since 2.8.0 + * + * @param array|string $headers All of the available headers. + * @return bool + */ + public static function should_decode( $headers ) { + if ( is_array( $headers ) ) { + if ( array_key_exists( 'content-encoding', $headers ) && ! empty( $headers['content-encoding'] ) ) { + return true; + } + } elseif ( is_string( $headers ) ) { + return ( stripos( $headers, 'content-encoding:' ) !== false ); + } + + return false; + } + + /** + * Whether decompression and compression are supported by the PHP version. + * + * Each function is tested instead of checking for the zlib extension, to + * ensure that the functions all exist in the PHP version and aren't + * disabled. + * + * @since 2.8.0 + * + * @return bool + */ + public static function is_available() { + return ( function_exists( 'gzuncompress' ) || function_exists( 'gzdeflate' ) || function_exists( 'gzinflate' ) ); + } +} diff --git a/wp-includes/class-wp-http-ixr-client.php b/wp-includes/class-wp-http-ixr-client.php new file mode 100644 index 0000000..f873e8f --- /dev/null +++ b/wp-includes/class-wp-http-ixr-client.php @@ -0,0 +1,123 @@ +<?php +/** + * WP_HTTP_IXR_Client + * + * @package WordPress + * @since 3.1.0 + */ +class WP_HTTP_IXR_Client extends IXR_Client { + public $scheme; + /** + * @var IXR_Error + */ + public $error; + + /** + * @param string $server + * @param string|bool $path + * @param int|bool $port + * @param int $timeout + */ + public function __construct( $server, $path = false, $port = false, $timeout = 15 ) { + if ( ! $path ) { + // Assume we have been given a URL instead. + $bits = parse_url( $server ); + $this->scheme = $bits['scheme']; + $this->server = $bits['host']; + $this->port = isset( $bits['port'] ) ? $bits['port'] : $port; + $this->path = ! empty( $bits['path'] ) ? $bits['path'] : '/'; + + // Make absolutely sure we have a path. + if ( ! $this->path ) { + $this->path = '/'; + } + + if ( ! empty( $bits['query'] ) ) { + $this->path .= '?' . $bits['query']; + } + } else { + $this->scheme = 'http'; + $this->server = $server; + $this->path = $path; + $this->port = $port; + } + $this->useragent = 'The Incutio XML-RPC PHP Library'; + $this->timeout = $timeout; + } + + /** + * @return bool + */ + public function query() { + $args = func_get_args(); + $method = array_shift( $args ); + $request = new IXR_Request( $method, $args ); + $xml = $request->getXml(); + + $port = $this->port ? ":$this->port" : ''; + $url = $this->scheme . '://' . $this->server . $port . $this->path; + $args = array( + 'headers' => array( 'Content-Type' => 'text/xml' ), + 'user-agent' => $this->useragent, + 'body' => $xml, + ); + + // Merge Custom headers ala #8145. + foreach ( $this->headers as $header => $value ) { + $args['headers'][ $header ] = $value; + } + + /** + * Filters the headers collection to be sent to the XML-RPC server. + * + * @since 4.4.0 + * + * @param string[] $headers Associative array of headers to be sent. + */ + $args['headers'] = apply_filters( 'wp_http_ixr_client_headers', $args['headers'] ); + + if ( false !== $this->timeout ) { + $args['timeout'] = $this->timeout; + } + + // Now send the request. + if ( $this->debug ) { + echo '<pre class="ixr_request">' . htmlspecialchars( $xml ) . "\n</pre>\n\n"; + } + + $response = wp_remote_post( $url, $args ); + + if ( is_wp_error( $response ) ) { + $errno = $response->get_error_code(); + $errorstr = $response->get_error_message(); + $this->error = new IXR_Error( -32300, "transport error: $errno $errorstr" ); + return false; + } + + if ( 200 != wp_remote_retrieve_response_code( $response ) ) { + $this->error = new IXR_Error( -32301, 'transport error - HTTP status code was not 200 (' . wp_remote_retrieve_response_code( $response ) . ')' ); + return false; + } + + if ( $this->debug ) { + echo '<pre class="ixr_response">' . htmlspecialchars( wp_remote_retrieve_body( $response ) ) . "\n</pre>\n\n"; + } + + // Now parse what we've got back. + $this->message = new IXR_Message( wp_remote_retrieve_body( $response ) ); + if ( ! $this->message->parse() ) { + // XML error. + $this->error = new IXR_Error( -32700, 'parse error. not well formed' ); + return false; + } + + // Is the message a fault? + if ( 'fault' === $this->message->messageType ) { + $this->error = new IXR_Error( $this->message->faultCode, $this->message->faultString ); + return false; + } + + // Message must be OK. + return true; + } +} diff --git a/wp-includes/class-wp-http-proxy.php b/wp-includes/class-wp-http-proxy.php new file mode 100644 index 0000000..f8d89ef --- /dev/null +++ b/wp-includes/class-wp-http-proxy.php @@ -0,0 +1,229 @@ +<?php +/** + * HTTP API: WP_HTTP_Proxy class + * + * @package WordPress + * @subpackage HTTP + * @since 4.4.0 + */ + +/** + * Core class used to implement HTTP API proxy support. + * + * There are caveats to proxy support. It requires that defines be made in the wp-config.php file to + * enable proxy support. There are also a few filters that plugins can hook into for some of the + * constants. + * + * Please note that only BASIC authentication is supported by most transports. + * cURL MAY support more methods (such as NTLM authentication) depending on your environment. + * + * The constants are as follows: + * <ol> + * <li>WP_PROXY_HOST - Enable proxy support and host for connecting.</li> + * <li>WP_PROXY_PORT - Proxy port for connection. No default, must be defined.</li> + * <li>WP_PROXY_USERNAME - Proxy username, if it requires authentication.</li> + * <li>WP_PROXY_PASSWORD - Proxy password, if it requires authentication.</li> + * <li>WP_PROXY_BYPASS_HOSTS - Will prevent the hosts in this list from going through the proxy. + * You do not need to have localhost and the site host in this list, because they will not be passed + * through the proxy. The list should be presented in a comma separated list, wildcards using * are supported, eg. *.wordpress.org</li> + * </ol> + * + * An example can be as seen below. + * + * define('WP_PROXY_HOST', '192.168.84.101'); + * define('WP_PROXY_PORT', '8080'); + * define('WP_PROXY_BYPASS_HOSTS', 'localhost, www.example.com, *.wordpress.org'); + * + * @link https://core.trac.wordpress.org/ticket/4011 Proxy support ticket in WordPress. + * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_PROXY_BYPASS_HOSTS + * + * @since 2.8.0 + */ +class WP_HTTP_Proxy { + + /** + * Whether proxy connection should be used. + * + * @since 2.8.0 + * + * @use WP_PROXY_HOST + * @use WP_PROXY_PORT + * + * @return bool + */ + public function is_enabled() { + return defined( 'WP_PROXY_HOST' ) && defined( 'WP_PROXY_PORT' ); + } + + /** + * Whether authentication should be used. + * + * @since 2.8.0 + * + * @use WP_PROXY_USERNAME + * @use WP_PROXY_PASSWORD + * + * @return bool + */ + public function use_authentication() { + return defined( 'WP_PROXY_USERNAME' ) && defined( 'WP_PROXY_PASSWORD' ); + } + + /** + * Retrieve the host for the proxy server. + * + * @since 2.8.0 + * + * @return string + */ + public function host() { + if ( defined( 'WP_PROXY_HOST' ) ) { + return WP_PROXY_HOST; + } + + return ''; + } + + /** + * Retrieve the port for the proxy server. + * + * @since 2.8.0 + * + * @return string + */ + public function port() { + if ( defined( 'WP_PROXY_PORT' ) ) { + return WP_PROXY_PORT; + } + + return ''; + } + + /** + * Retrieve the username for proxy authentication. + * + * @since 2.8.0 + * + * @return string + */ + public function username() { + if ( defined( 'WP_PROXY_USERNAME' ) ) { + return WP_PROXY_USERNAME; + } + + return ''; + } + + /** + * Retrieve the password for proxy authentication. + * + * @since 2.8.0 + * + * @return string + */ + public function password() { + if ( defined( 'WP_PROXY_PASSWORD' ) ) { + return WP_PROXY_PASSWORD; + } + + return ''; + } + + /** + * Retrieve authentication string for proxy authentication. + * + * @since 2.8.0 + * + * @return string + */ + public function authentication() { + return $this->username() . ':' . $this->password(); + } + + /** + * Retrieve header string for proxy authentication. + * + * @since 2.8.0 + * + * @return string + */ + public function authentication_header() { + return 'Proxy-Authorization: Basic ' . base64_encode( $this->authentication() ); + } + + /** + * Determines whether the request should be sent through a proxy. + * + * We want to keep localhost and the site URL from being sent through the proxy, because + * some proxies can not handle this. We also have the constant available for defining other + * hosts that won't be sent through the proxy. + * + * @since 2.8.0 + * + * @staticvar array|null $bypass_hosts + * @staticvar array $wildcard_regex + * + * @param string $uri URI to check. + * @return bool True, to send through the proxy and false if, the proxy should not be used. + */ + public function send_through_proxy( $uri ) { + /* + * parse_url() only handles http, https type URLs, and will emit E_WARNING on failure. + * This will be displayed on sites, which is not reasonable. + */ + $check = @parse_url( $uri ); + + // Malformed URL, can not process, but this could mean ssl, so let through anyway. + if ( false === $check ) { + return true; + } + + $home = parse_url( get_option( 'siteurl' ) ); + + /** + * Filters whether to preempt sending the request through the proxy. + * + * Returning false will bypass the proxy; returning true will send + * the request through the proxy. Returning null bypasses the filter. + * + * @since 3.5.0 + * + * @param bool|null $override Whether to override the request result. Default null. + * @param string $uri URL to check. + * @param array $check Associative array result of parsing the request URI. + * @param array $home Associative array result of parsing the site URL. + */ + $result = apply_filters( 'pre_http_send_through_proxy', null, $uri, $check, $home ); + if ( ! is_null( $result ) ) { + return $result; + } + + if ( 'localhost' == $check['host'] || ( isset( $home['host'] ) && $home['host'] == $check['host'] ) ) { + return false; + } + + if ( ! defined( 'WP_PROXY_BYPASS_HOSTS' ) ) { + return true; + } + + static $bypass_hosts = null; + static $wildcard_regex = array(); + if ( null === $bypass_hosts ) { + $bypass_hosts = preg_split( '|,\s*|', WP_PROXY_BYPASS_HOSTS ); + + if ( false !== strpos( WP_PROXY_BYPASS_HOSTS, '*' ) ) { + $wildcard_regex = array(); + foreach ( $bypass_hosts as $host ) { + $wildcard_regex[] = str_replace( '\*', '.+', preg_quote( $host, '/' ) ); + } + $wildcard_regex = '/^(' . implode( '|', $wildcard_regex ) . ')$/i'; + } + } + + if ( ! empty( $wildcard_regex ) ) { + return ! preg_match( $wildcard_regex, $check['host'] ); + } else { + return ! in_array( $check['host'], $bypass_hosts ); + } + } +} diff --git a/wp-includes/class-wp-http-requests-hooks.php b/wp-includes/class-wp-http-requests-hooks.php new file mode 100644 index 0000000..373778c --- /dev/null +++ b/wp-includes/class-wp-http-requests-hooks.php @@ -0,0 +1,76 @@ +<?php +/** + * HTTP API: Requests hook bridge class + * + * @package WordPress + * @subpackage HTTP + * @since 4.7.0 + */ + +/** + * Bridge to connect Requests internal hooks to WordPress actions. + * + * @since 4.7.0 + * + * @see Requests_Hooks + */ +class WP_HTTP_Requests_Hooks extends Requests_Hooks { + /** + * Requested URL. + * + * @var string Requested URL. + */ + protected $url; + + /** + * WordPress WP_HTTP request data. + * + * @var array Request data in WP_Http format. + */ + protected $request = array(); + + /** + * Constructor. + * + * @param string $url URL to request. + * @param array $request Request data in WP_Http format. + */ + public function __construct( $url, $request ) { + $this->url = $url; + $this->request = $request; + } + + /** + * Dispatch a Requests hook to a native WordPress action. + * + * @param string $hook Hook name. + * @param array $parameters Parameters to pass to callbacks. + * @return boolean True if hooks were run, false if nothing was hooked. + */ + public function dispatch( $hook, $parameters = array() ) { + $result = parent::dispatch( $hook, $parameters ); + + // Handle back-compat actions. + switch ( $hook ) { + case 'curl.before_send': + /** This action is documented in wp-includes/class-wp-http-curl.php */ + do_action_ref_array( 'http_api_curl', array( &$parameters[0], $this->request, $this->url ) ); + break; + } + + /** + * Transforms a native Request hook to a WordPress actions. + * + * This action maps Requests internal hook to a native WordPress action. + * + * @see https://github.com/rmccue/Requests/blob/master/docs/hooks.md + * + * @param array $parameters Parameters from Requests internal hook. + * @param array $request Request data in WP_Http format. + * @param string $url URL to request. + */ + do_action_ref_array( "requests-{$hook}", $parameters, $this->request, $this->url ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + return $result; + } +} diff --git a/wp-includes/class-wp-http-requests-response.php b/wp-includes/class-wp-http-requests-response.php new file mode 100644 index 0000000..45f83e2 --- /dev/null +++ b/wp-includes/class-wp-http-requests-response.php @@ -0,0 +1,197 @@ +<?php +/** + * HTTP API: WP_HTTP_Requests_Response class + * + * @package WordPress + * @subpackage HTTP + * @since 4.6.0 + */ + +/** + * Core wrapper object for a Requests_Response for standardisation. + * + * @since 4.6.0 + * + * @see WP_HTTP_Response + */ +class WP_HTTP_Requests_Response extends WP_HTTP_Response { + /** + * Requests Response object. + * + * @since 4.6.0 + * @var Requests_Response + */ + protected $response; + + /** + * Filename the response was saved to. + * + * @since 4.6.0 + * @var string|null + */ + protected $filename; + + /** + * Constructor. + * + * @since 4.6.0 + * + * @param Requests_Response $response HTTP response. + * @param string $filename Optional. File name. Default empty. + */ + public function __construct( Requests_Response $response, $filename = '' ) { + $this->response = $response; + $this->filename = $filename; + } + + /** + * Retrieves the response object for the request. + * + * @since 4.6.0 + * + * @return Requests_Response HTTP response. + */ + public function get_response_object() { + return $this->response; + } + + /** + * Retrieves headers associated with the response. + * + * @since 4.6.0 + * + * @return \Requests_Utility_CaseInsensitiveDictionary Map of header name to header value. + */ + public function get_headers() { + // Ensure headers remain case-insensitive. + $converted = new Requests_Utility_CaseInsensitiveDictionary(); + + foreach ( $this->response->headers->getAll() as $key => $value ) { + if ( count( $value ) === 1 ) { + $converted[ $key ] = $value[0]; + } else { + $converted[ $key ] = $value; + } + } + + return $converted; + } + + /** + * Sets all header values. + * + * @since 4.6.0 + * + * @param array $headers Map of header name to header value. + */ + public function set_headers( $headers ) { + $this->response->headers = new Requests_Response_Headers( $headers ); + } + + /** + * Sets a single HTTP header. + * + * @since 4.6.0 + * + * @param string $key Header name. + * @param string $value Header value. + * @param bool $replace Optional. Whether to replace an existing header of the same name. + * Default true. + */ + public function header( $key, $value, $replace = true ) { + if ( $replace ) { + unset( $this->response->headers[ $key ] ); + } + + $this->response->headers[ $key ] = $value; + } + + /** + * Retrieves the HTTP return code for the response. + * + * @since 4.6.0 + * + * @return int The 3-digit HTTP status code. + */ + public function get_status() { + return $this->response->status_code; + } + + /** + * Sets the 3-digit HTTP status code. + * + * @since 4.6.0 + * + * @param int $code HTTP status. + */ + public function set_status( $code ) { + $this->response->status_code = absint( $code ); + } + + /** + * Retrieves the response data. + * + * @since 4.6.0 + * + * @return string Response data. + */ + public function get_data() { + return $this->response->body; + } + + /** + * Sets the response data. + * + * @since 4.6.0 + * + * @param string $data Response data. + */ + public function set_data( $data ) { + $this->response->body = $data; + } + + /** + * Retrieves cookies from the response. + * + * @since 4.6.0 + * + * @return WP_HTTP_Cookie[] List of cookie objects. + */ + public function get_cookies() { + $cookies = array(); + foreach ( $this->response->cookies as $cookie ) { + $cookies[] = new WP_Http_Cookie( + array( + 'name' => $cookie->name, + 'value' => urldecode( $cookie->value ), + 'expires' => isset( $cookie->attributes['expires'] ) ? $cookie->attributes['expires'] : null, + 'path' => isset( $cookie->attributes['path'] ) ? $cookie->attributes['path'] : null, + 'domain' => isset( $cookie->attributes['domain'] ) ? $cookie->attributes['domain'] : null, + 'host_only' => isset( $cookie->flags['host-only'] ) ? $cookie->flags['host-only'] : null, + ) + ); + } + + return $cookies; + } + + /** + * Converts the object to a WP_Http response array. + * + * @since 4.6.0 + * + * @return array WP_Http response array, per WP_Http::request(). + */ + public function to_array() { + return array( + 'headers' => $this->get_headers(), + 'body' => $this->get_data(), + 'response' => array( + 'code' => $this->get_status(), + 'message' => get_status_header_desc( $this->get_status() ), + ), + 'cookies' => $this->get_cookies(), + 'filename' => $this->filename, + ); + } +} diff --git a/wp-includes/class-wp-http-response.php b/wp-includes/class-wp-http-response.php new file mode 100644 index 0000000..ae28d89 --- /dev/null +++ b/wp-includes/class-wp-http-response.php @@ -0,0 +1,153 @@ +<?php +/** + * HTTP API: WP_HTTP_Response class + * + * @package WordPress + * @subpackage HTTP + * @since 4.4.0 + */ + +/** + * Core class used to prepare HTTP responses. + * + * @since 4.4.0 + */ +class WP_HTTP_Response { + + /** + * Response data. + * + * @since 4.4.0 + * @var mixed + */ + public $data; + + /** + * Response headers. + * + * @since 4.4.0 + * @var array + */ + public $headers; + + /** + * Response status. + * + * @since 4.4.0 + * @var int + */ + public $status; + + /** + * Constructor. + * + * @since 4.4.0 + * + * @param mixed $data Response data. Default null. + * @param int $status Optional. HTTP status code. Default 200. + * @param array $headers Optional. HTTP header map. Default empty array. + */ + public function __construct( $data = null, $status = 200, $headers = array() ) { + $this->set_data( $data ); + $this->set_status( $status ); + $this->set_headers( $headers ); + } + + /** + * Retrieves headers associated with the response. + * + * @since 4.4.0 + * + * @return array Map of header name to header value. + */ + public function get_headers() { + return $this->headers; + } + + /** + * Sets all header values. + * + * @since 4.4.0 + * + * @param array $headers Map of header name to header value. + */ + public function set_headers( $headers ) { + $this->headers = $headers; + } + + /** + * Sets a single HTTP header. + * + * @since 4.4.0 + * + * @param string $key Header name. + * @param string $value Header value. + * @param bool $replace Optional. Whether to replace an existing header of the same name. + * Default true. + */ + public function header( $key, $value, $replace = true ) { + if ( $replace || ! isset( $this->headers[ $key ] ) ) { + $this->headers[ $key ] = $value; + } else { + $this->headers[ $key ] .= ', ' . $value; + } + } + + /** + * Retrieves the HTTP return code for the response. + * + * @since 4.4.0 + * + * @return int The 3-digit HTTP status code. + */ + public function get_status() { + return $this->status; + } + + /** + * Sets the 3-digit HTTP status code. + * + * @since 4.4.0 + * + * @param int $code HTTP status. + */ + public function set_status( $code ) { + $this->status = absint( $code ); + } + + /** + * Retrieves the response data. + * + * @since 4.4.0 + * + * @return mixed Response data. + */ + public function get_data() { + return $this->data; + } + + /** + * Sets the response data. + * + * @since 4.4.0 + * + * @param mixed $data Response data. + */ + public function set_data( $data ) { + $this->data = $data; + } + + /** + * Retrieves the response data for JSON serialization. + * + * It is expected that in most implementations, this will return the same as get_data(), + * however this may be different if you want to do custom JSON data handling. + * + * @since 4.4.0 + * + * @return mixed Any JSON-serializable value. + */ + public function jsonSerialize() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid + return $this->get_data(); + } +} diff --git a/wp-includes/class-wp-http-streams.php b/wp-includes/class-wp-http-streams.php new file mode 100644 index 0000000..f50053c --- /dev/null +++ b/wp-includes/class-wp-http-streams.php @@ -0,0 +1,473 @@ +<?php +/** + * HTTP API: WP_Http_Streams class + * + * @package WordPress + * @subpackage HTTP + * @since 4.4.0 + */ + +/** + * Core class used to integrate PHP Streams as an HTTP transport. + * + * @since 2.7.0 + * @since 3.7.0 Combined with the fsockopen transport and switched to `stream_socket_client()`. + */ +class WP_Http_Streams { + /** + * Send a HTTP request to a URI using PHP Streams. + * + * @see WP_Http::request For default options descriptions. + * + * @since 2.7.0 + * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client(). + * + * @param string $url The request URL. + * @param string|array $args Optional. Override the defaults. + * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error + */ + public function request( $url, $args = array() ) { + $defaults = array( + 'method' => 'GET', + 'timeout' => 5, + 'redirection' => 5, + 'httpversion' => '1.0', + 'blocking' => true, + 'headers' => array(), + 'body' => null, + 'cookies' => array(), + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + if ( isset( $parsed_args['headers']['User-Agent'] ) ) { + $parsed_args['user-agent'] = $parsed_args['headers']['User-Agent']; + unset( $parsed_args['headers']['User-Agent'] ); + } elseif ( isset( $parsed_args['headers']['user-agent'] ) ) { + $parsed_args['user-agent'] = $parsed_args['headers']['user-agent']; + unset( $parsed_args['headers']['user-agent'] ); + } + + // Construct Cookie: header if any cookies are set. + WP_Http::buildCookieHeader( $parsed_args ); + + $arrURL = parse_url( $url ); + + $connect_host = $arrURL['host']; + + $secure_transport = ( 'ssl' === $arrURL['scheme'] || 'https' === $arrURL['scheme'] ); + if ( ! isset( $arrURL['port'] ) ) { + if ( 'ssl' === $arrURL['scheme'] || 'https' === $arrURL['scheme'] ) { + $arrURL['port'] = 443; + $secure_transport = true; + } else { + $arrURL['port'] = 80; + } + } + + // Always pass a path, defaulting to the root in cases such as http://example.com. + if ( ! isset( $arrURL['path'] ) ) { + $arrURL['path'] = '/'; + } + + if ( isset( $parsed_args['headers']['Host'] ) || isset( $parsed_args['headers']['host'] ) ) { + if ( isset( $parsed_args['headers']['Host'] ) ) { + $arrURL['host'] = $parsed_args['headers']['Host']; + } else { + $arrURL['host'] = $parsed_args['headers']['host']; + } + unset( $parsed_args['headers']['Host'], $parsed_args['headers']['host'] ); + } + + /* + * Certain versions of PHP have issues with 'localhost' and IPv6, It attempts to connect + * to ::1, which fails when the server is not set up for it. For compatibility, always + * connect to the IPv4 address. + */ + if ( 'localhost' == strtolower( $connect_host ) ) { + $connect_host = '127.0.0.1'; + } + + $connect_host = $secure_transport ? 'ssl://' . $connect_host : 'tcp://' . $connect_host; + + $is_local = isset( $parsed_args['local'] ) && $parsed_args['local']; + $ssl_verify = isset( $parsed_args['sslverify'] ) && $parsed_args['sslverify']; + if ( $is_local ) { + /** + * Filters whether SSL should be verified for local requests. + * + * @since 2.8.0 + * @since 5.1.0 The `$url` parameter was added. + * + * @param bool $ssl_verify Whether to verify the SSL connection. Default true. + * @param string $url The request URL. + */ + $ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify, $url ); + } elseif ( ! $is_local ) { + /** This filter is documented in wp-includes/class-http.php */ + $ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify, $url ); + } + + $proxy = new WP_HTTP_Proxy(); + + $context = stream_context_create( + array( + 'ssl' => array( + 'verify_peer' => $ssl_verify, + // 'CN_match' => $arrURL['host'], // This is handled by self::verify_ssl_certificate(). + 'capture_peer_cert' => $ssl_verify, + 'SNI_enabled' => true, + 'cafile' => $parsed_args['sslcertificates'], + 'allow_self_signed' => ! $ssl_verify, + ), + ) + ); + + $timeout = (int) floor( $parsed_args['timeout'] ); + $utimeout = $timeout == $parsed_args['timeout'] ? 0 : 1000000 * $parsed_args['timeout'] % 1000000; + $connect_timeout = max( $timeout, 1 ); + + // Store error number. + $connection_error = null; + + // Store error string. + $connection_error_str = null; + + if ( ! WP_DEBUG ) { + // In the event that the SSL connection fails, silence the many PHP warnings. + if ( $secure_transport ) { + $error_reporting = error_reporting( 0 ); + } + + if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + $handle = @stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); + } else { + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + $handle = @stream_socket_client( $connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); + } + + if ( $secure_transport ) { + error_reporting( $error_reporting ); + } + } else { + if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { + $handle = stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); + } else { + $handle = stream_socket_client( $connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); + } + } + + if ( false === $handle ) { + // SSL connection failed due to expired/invalid cert, or, OpenSSL configuration is broken. + if ( $secure_transport && 0 === $connection_error && '' === $connection_error_str ) { + return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) ); + } + + return new WP_Error( 'http_request_failed', $connection_error . ': ' . $connection_error_str ); + } + + // Verify that the SSL certificate is valid for this request. + if ( $secure_transport && $ssl_verify && ! $proxy->is_enabled() ) { + if ( ! self::verify_ssl_certificate( $handle, $arrURL['host'] ) ) { + return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) ); + } + } + + stream_set_timeout( $handle, $timeout, $utimeout ); + + if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { // Some proxies require full URL in this field. + $requestPath = $url; + } else { + $requestPath = $arrURL['path'] . ( isset( $arrURL['query'] ) ? '?' . $arrURL['query'] : '' ); + } + + $strHeaders = strtoupper( $parsed_args['method'] ) . ' ' . $requestPath . ' HTTP/' . $parsed_args['httpversion'] . "\r\n"; + + $include_port_in_host_header = ( + ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) || + ( 'http' == $arrURL['scheme'] && 80 != $arrURL['port'] ) || + ( 'https' == $arrURL['scheme'] && 443 != $arrURL['port'] ) + ); + + if ( $include_port_in_host_header ) { + $strHeaders .= 'Host: ' . $arrURL['host'] . ':' . $arrURL['port'] . "\r\n"; + } else { + $strHeaders .= 'Host: ' . $arrURL['host'] . "\r\n"; + } + + if ( isset( $parsed_args['user-agent'] ) ) { + $strHeaders .= 'User-agent: ' . $parsed_args['user-agent'] . "\r\n"; + } + + if ( is_array( $parsed_args['headers'] ) ) { + foreach ( (array) $parsed_args['headers'] as $header => $headerValue ) { + $strHeaders .= $header . ': ' . $headerValue . "\r\n"; + } + } else { + $strHeaders .= $parsed_args['headers']; + } + + if ( $proxy->use_authentication() ) { + $strHeaders .= $proxy->authentication_header() . "\r\n"; + } + + $strHeaders .= "\r\n"; + + if ( ! is_null( $parsed_args['body'] ) ) { + $strHeaders .= $parsed_args['body']; + } + + fwrite( $handle, $strHeaders ); + + if ( ! $parsed_args['blocking'] ) { + stream_set_blocking( $handle, 0 ); + fclose( $handle ); + return array( + 'headers' => array(), + 'body' => '', + 'response' => array( + 'code' => false, + 'message' => false, + ), + 'cookies' => array(), + ); + } + + $strResponse = ''; + $bodyStarted = false; + $keep_reading = true; + $block_size = 4096; + if ( isset( $parsed_args['limit_response_size'] ) ) { + $block_size = min( $block_size, $parsed_args['limit_response_size'] ); + } + + // If streaming to a file setup the file handle. + if ( $parsed_args['stream'] ) { + if ( ! WP_DEBUG ) { + $stream_handle = @fopen( $parsed_args['filename'], 'w+' ); + } else { + $stream_handle = fopen( $parsed_args['filename'], 'w+' ); + } + if ( ! $stream_handle ) { + return new WP_Error( + 'http_request_failed', + sprintf( + /* translators: 1: fopen(), 2: File name. */ + __( 'Could not open handle for %1$s to %2$s.' ), + 'fopen()', + $parsed_args['filename'] + ) + ); + } + + $bytes_written = 0; + while ( ! feof( $handle ) && $keep_reading ) { + $block = fread( $handle, $block_size ); + if ( ! $bodyStarted ) { + $strResponse .= $block; + if ( strpos( $strResponse, "\r\n\r\n" ) ) { + $process = WP_Http::processResponse( $strResponse ); + $bodyStarted = true; + $block = $process['body']; + unset( $strResponse ); + $process['body'] = ''; + } + } + + $this_block_size = strlen( $block ); + + if ( isset( $parsed_args['limit_response_size'] ) && ( $bytes_written + $this_block_size ) > $parsed_args['limit_response_size'] ) { + $this_block_size = ( $parsed_args['limit_response_size'] - $bytes_written ); + $block = substr( $block, 0, $this_block_size ); + } + + $bytes_written_to_file = fwrite( $stream_handle, $block ); + + if ( $bytes_written_to_file != $this_block_size ) { + fclose( $handle ); + fclose( $stream_handle ); + return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) ); + } + + $bytes_written += $bytes_written_to_file; + + $keep_reading = ! isset( $parsed_args['limit_response_size'] ) || $bytes_written < $parsed_args['limit_response_size']; + } + + fclose( $stream_handle ); + + } else { + $header_length = 0; + while ( ! feof( $handle ) && $keep_reading ) { + $block = fread( $handle, $block_size ); + $strResponse .= $block; + if ( ! $bodyStarted && strpos( $strResponse, "\r\n\r\n" ) ) { + $header_length = strpos( $strResponse, "\r\n\r\n" ) + 4; + $bodyStarted = true; + } + $keep_reading = ( ! $bodyStarted || ! isset( $parsed_args['limit_response_size'] ) || strlen( $strResponse ) < ( $header_length + $parsed_args['limit_response_size'] ) ); + } + + $process = WP_Http::processResponse( $strResponse ); + unset( $strResponse ); + + } + + fclose( $handle ); + + $arrHeaders = WP_Http::processHeaders( $process['headers'], $url ); + + $response = array( + 'headers' => $arrHeaders['headers'], + // Not yet processed. + 'body' => null, + 'response' => $arrHeaders['response'], + 'cookies' => $arrHeaders['cookies'], + 'filename' => $parsed_args['filename'], + ); + + // Handle redirects. + $redirect_response = WP_Http::handle_redirects( $url, $parsed_args, $response ); + if ( false !== $redirect_response ) { + return $redirect_response; + } + + // If the body was chunk encoded, then decode it. + if ( ! empty( $process['body'] ) && isset( $arrHeaders['headers']['transfer-encoding'] ) && 'chunked' == $arrHeaders['headers']['transfer-encoding'] ) { + $process['body'] = WP_Http::chunkTransferDecode( $process['body'] ); + } + + if ( true === $parsed_args['decompress'] && true === WP_Http_Encoding::should_decode( $arrHeaders['headers'] ) ) { + $process['body'] = WP_Http_Encoding::decompress( $process['body'] ); + } + + if ( isset( $parsed_args['limit_response_size'] ) && strlen( $process['body'] ) > $parsed_args['limit_response_size'] ) { + $process['body'] = substr( $process['body'], 0, $parsed_args['limit_response_size'] ); + } + + $response['body'] = $process['body']; + + return $response; + } + + /** + * Verifies the received SSL certificate against its Common Names and subjectAltName fields. + * + * PHP's SSL verifications only verify that it's a valid Certificate, it doesn't verify if + * the certificate is valid for the hostname which was requested. + * This function verifies the requested hostname against certificate's subjectAltName field, + * if that is empty, or contains no DNS entries, a fallback to the Common Name field is used. + * + * IP Address support is included if the request is being made to an IP address. + * + * @since 3.7.0 + * + * @param stream $stream The PHP Stream which the SSL request is being made over + * @param string $host The hostname being requested + * @return bool If the cerficiate presented in $stream is valid for $host + */ + public static function verify_ssl_certificate( $stream, $host ) { + $context_options = stream_context_get_options( $stream ); + + if ( empty( $context_options['ssl']['peer_certificate'] ) ) { + return false; + } + + $cert = openssl_x509_parse( $context_options['ssl']['peer_certificate'] ); + if ( ! $cert ) { + return false; + } + + /* + * If the request is being made to an IP address, we'll validate against IP fields + * in the cert (if they exist) + */ + $host_type = ( WP_Http::is_ip_address( $host ) ? 'ip' : 'dns' ); + + $certificate_hostnames = array(); + if ( ! empty( $cert['extensions']['subjectAltName'] ) ) { + $match_against = preg_split( '/,\s*/', $cert['extensions']['subjectAltName'] ); + foreach ( $match_against as $match ) { + list( $match_type, $match_host ) = explode( ':', $match ); + if ( strtolower( trim( $match_type ) ) === $host_type ) { // IP: or DNS: + $certificate_hostnames[] = strtolower( trim( $match_host ) ); + } + } + } elseif ( ! empty( $cert['subject']['CN'] ) ) { + // Only use the CN when the certificate includes no subjectAltName extension. + $certificate_hostnames[] = strtolower( $cert['subject']['CN'] ); + } + + // Exact hostname/IP matches. + if ( in_array( strtolower( $host ), $certificate_hostnames ) ) { + return true; + } + + // IP's can't be wildcards, Stop processing. + if ( 'ip' == $host_type ) { + return false; + } + + // Test to see if the domain is at least 2 deep for wildcard support. + if ( substr_count( $host, '.' ) < 2 ) { + return false; + } + + // Wildcard subdomains certs (*.example.com) are valid for a.example.com but not a.b.example.com. + $wildcard_host = preg_replace( '/^[^.]+\./', '*.', $host ); + + return in_array( strtolower( $wildcard_host ), $certificate_hostnames ); + } + + /** + * Determines whether this class can be used for retrieving a URL. + * + * @since 2.7.0 + * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client(). + * + * @param array $args Optional. Array of request arguments. Default empty array. + * @return bool False means this class can not be used, true means it can. + */ + public static function test( $args = array() ) { + if ( ! function_exists( 'stream_socket_client' ) ) { + return false; + } + + $is_ssl = isset( $args['ssl'] ) && $args['ssl']; + + if ( $is_ssl ) { + if ( ! extension_loaded( 'openssl' ) ) { + return false; + } + if ( ! function_exists( 'openssl_x509_parse' ) ) { + return false; + } + } + + /** + * Filters whether streams can be used as a transport for retrieving a URL. + * + * @since 2.7.0 + * + * @param bool $use_class Whether the class can be used. Default true. + * @param array $args Request arguments. + */ + return apply_filters( 'use_streams_transport', true, $args ); + } +} + +/** + * Deprecated HTTP Transport method which used fsockopen. + * + * This class is not used, and is included for backward compatibility only. + * All code should make use of WP_Http directly through its API. + * + * @see WP_HTTP::request + * + * @since 2.7.0 + * @deprecated 3.7.0 Please use WP_HTTP::request() directly + */ +class WP_HTTP_Fsockopen extends WP_HTTP_Streams { + // For backward compatibility for users who are using the class directly. +} diff --git a/wp-includes/class-wp-image-editor-gd.php b/wp-includes/class-wp-image-editor-gd.php new file mode 100644 index 0000000..51313d4 --- /dev/null +++ b/wp-includes/class-wp-image-editor-gd.php @@ -0,0 +1,513 @@ +<?php +/** + * WordPress GD Image Editor + * + * @package WordPress + * @subpackage Image_Editor + */ + +/** + * WordPress Image Editor Class for Image Manipulation through GD + * + * @since 3.5.0 + * + * @see WP_Image_Editor + */ +class WP_Image_Editor_GD extends WP_Image_Editor { + /** + * GD Resource. + * + * @var resource + */ + protected $image; + + public function __destruct() { + if ( $this->image ) { + // We don't need the original in memory anymore. + imagedestroy( $this->image ); + } + } + + /** + * Checks to see if current environment supports GD. + * + * @since 3.5.0 + * + * @param array $args + * @return bool + */ + public static function test( $args = array() ) { + if ( ! extension_loaded( 'gd' ) || ! function_exists( 'gd_info' ) ) { + return false; + } + + // On some setups GD library does not provide imagerotate() - Ticket #11536. + if ( isset( $args['methods'] ) && + in_array( 'rotate', $args['methods'], true ) && + ! function_exists( 'imagerotate' ) ) { + + return false; + } + + return true; + } + + /** + * Checks to see if editor supports the mime-type specified. + * + * @since 3.5.0 + * + * @param string $mime_type + * @return bool + */ + public static function supports_mime_type( $mime_type ) { + $image_types = imagetypes(); + switch ( $mime_type ) { + case 'image/jpeg': + return ( $image_types & IMG_JPG ) != 0; + case 'image/png': + return ( $image_types & IMG_PNG ) != 0; + case 'image/gif': + return ( $image_types & IMG_GIF ) != 0; + } + + return false; + } + + /** + * Loads image from $this->file into new GD Resource. + * + * @since 3.5.0 + * + * @return bool|WP_Error True if loaded successfully; WP_Error on failure. + */ + public function load() { + if ( $this->image ) { + return true; + } + + if ( ! is_file( $this->file ) && ! preg_match( '|^https?://|', $this->file ) ) { + return new WP_Error( 'error_loading_image', __( 'File doesn’t exist?' ), $this->file ); + } + + // Set artificially high because GD uses uncompressed images in memory. + wp_raise_memory_limit( 'image' ); + + $this->image = @imagecreatefromstring( file_get_contents( $this->file ) ); + + if ( ! is_resource( $this->image ) ) { + return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file ); + } + + $size = @getimagesize( $this->file ); + if ( ! $size ) { + return new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file ); + } + + if ( function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) { + imagealphablending( $this->image, false ); + imagesavealpha( $this->image, true ); + } + + $this->update_size( $size[0], $size[1] ); + $this->mime_type = $size['mime']; + + return $this->set_quality(); + } + + /** + * Sets or updates current image size. + * + * @since 3.5.0 + * + * @param int $width + * @param int $height + * @return true + */ + protected function update_size( $width = false, $height = false ) { + if ( ! $width ) { + $width = imagesx( $this->image ); + } + + if ( ! $height ) { + $height = imagesy( $this->image ); + } + + return parent::update_size( $width, $height ); + } + + /** + * Resizes current image. + * Wraps _resize, since _resize returns a GD Resource. + * + * At minimum, either a height or width must be provided. + * If one of the two is set to null, the resize will + * maintain aspect ratio according to the provided dimension. + * + * @since 3.5.0 + * + * @param int|null $max_w Image width. + * @param int|null $max_h Image height. + * @param bool $crop + * @return true|WP_Error + */ + public function resize( $max_w, $max_h, $crop = false ) { + if ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) ) { + return true; + } + + $resized = $this->_resize( $max_w, $max_h, $crop ); + + if ( is_resource( $resized ) ) { + imagedestroy( $this->image ); + $this->image = $resized; + return true; + + } elseif ( is_wp_error( $resized ) ) { + return $resized; + } + + return new WP_Error( 'image_resize_error', __( 'Image resize failed.' ), $this->file ); + } + + /** + * @param int $max_w + * @param int $max_h + * @param bool|array $crop + * @return resource|WP_Error + */ + protected function _resize( $max_w, $max_h, $crop = false ) { + $dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop ); + + if ( ! $dims ) { + return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ), $this->file ); + } + + list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims; + + $resized = wp_imagecreatetruecolor( $dst_w, $dst_h ); + imagecopyresampled( $resized, $this->image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ); + + if ( is_resource( $resized ) ) { + $this->update_size( $dst_w, $dst_h ); + return $resized; + } + + return new WP_Error( 'image_resize_error', __( 'Image resize failed.' ), $this->file ); + } + + /** + * Create multiple smaller images from a single source. + * + * Attempts to create all sub-sizes and returns the meta data at the end. This + * may result in the server running out of resources. When it fails there may be few + * "orphaned" images left over as the meta data is never returned and saved. + * + * As of 5.3.0 the preferred way to do this is with `make_subsize()`. It creates + * the new images one at a time and allows for the meta data to be saved after + * each new image is created. + * + * @since 3.5.0 + * + * @param array $sizes { + * An array of image size data arrays. + * + * Either a height or width must be provided. + * If one of the two is set to null, the resize will + * maintain aspect ratio according to the source image. + * + * @type array $size { + * Array of height, width values, and whether to crop. + * + * @type int $width Image width. Optional if `$height` is specified. + * @type int $height Image height. Optional if `$width` is specified. + * @type bool $crop Optional. Whether to crop the image. Default false. + * } + * } + * @return array An array of resized images' metadata by size. + */ + public function multi_resize( $sizes ) { + $metadata = array(); + + foreach ( $sizes as $size => $size_data ) { + $meta = $this->make_subsize( $size_data ); + + if ( ! is_wp_error( $meta ) ) { + $metadata[ $size ] = $meta; + } + } + + return $metadata; + } + + /** + * Create an image sub-size and return the image meta data value for it. + * + * @since 5.3.0 + * + * @param array $size_data { + * Array of size data. + * + * @type int $width The maximum width in pixels. + * @type int $height The maximum height in pixels. + * @type bool $crop Whether to crop the image to exact dimensions. + * } + * @return array|WP_Error The image data array for inclusion in the `sizes` array in the image meta, + * WP_Error object on error. + */ + public function make_subsize( $size_data ) { + if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) { + return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) ); + } + + $orig_size = $this->size; + + if ( ! isset( $size_data['width'] ) ) { + $size_data['width'] = null; + } + + if ( ! isset( $size_data['height'] ) ) { + $size_data['height'] = null; + } + + if ( ! isset( $size_data['crop'] ) ) { + $size_data['crop'] = false; + } + + $resized = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] ); + + if ( is_wp_error( $resized ) ) { + $saved = $resized; + } else { + $saved = $this->_save( $resized ); + imagedestroy( $resized ); + } + + $this->size = $orig_size; + + if ( ! is_wp_error( $saved ) ) { + unset( $saved['path'] ); + } + + return $saved; + } + + /** + * Crops Image. + * + * @since 3.5.0 + * + * @param int $src_x The start x position to crop from. + * @param int $src_y The start y position to crop from. + * @param int $src_w The width to crop. + * @param int $src_h The height to crop. + * @param int $dst_w Optional. The destination width. + * @param int $dst_h Optional. The destination height. + * @param bool $src_abs Optional. If the source crop points are absolute. + * @return bool|WP_Error + */ + public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) { + // If destination width/height isn't specified, + // use same as width/height from source. + if ( ! $dst_w ) { + $dst_w = $src_w; + } + if ( ! $dst_h ) { + $dst_h = $src_h; + } + + $dst = wp_imagecreatetruecolor( $dst_w, $dst_h ); + + if ( $src_abs ) { + $src_w -= $src_x; + $src_h -= $src_y; + } + + if ( function_exists( 'imageantialias' ) ) { + imageantialias( $dst, true ); + } + + imagecopyresampled( $dst, $this->image, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ); + + if ( is_resource( $dst ) ) { + imagedestroy( $this->image ); + $this->image = $dst; + $this->update_size(); + return true; + } + + return new WP_Error( 'image_crop_error', __( 'Image crop failed.' ), $this->file ); + } + + /** + * Rotates current image counter-clockwise by $angle. + * Ported from image-edit.php + * + * @since 3.5.0 + * + * @param float $angle + * @return true|WP_Error + */ + public function rotate( $angle ) { + if ( function_exists( 'imagerotate' ) ) { + $transparency = imagecolorallocatealpha( $this->image, 255, 255, 255, 127 ); + $rotated = imagerotate( $this->image, $angle, $transparency ); + + if ( is_resource( $rotated ) ) { + imagealphablending( $rotated, true ); + imagesavealpha( $rotated, true ); + imagedestroy( $this->image ); + $this->image = $rotated; + $this->update_size(); + return true; + } + } + return new WP_Error( 'image_rotate_error', __( 'Image rotate failed.' ), $this->file ); + } + + /** + * Flips current image. + * + * @since 3.5.0 + * + * @param bool $horz Flip along Horizontal Axis. + * @param bool $vert Flip along Vertical Axis. + * @return true|WP_Error + */ + public function flip( $horz, $vert ) { + $w = $this->size['width']; + $h = $this->size['height']; + $dst = wp_imagecreatetruecolor( $w, $h ); + + if ( is_resource( $dst ) ) { + $sx = $vert ? ( $w - 1 ) : 0; + $sy = $horz ? ( $h - 1 ) : 0; + $sw = $vert ? -$w : $w; + $sh = $horz ? -$h : $h; + + if ( imagecopyresampled( $dst, $this->image, 0, 0, $sx, $sy, $w, $h, $sw, $sh ) ) { + imagedestroy( $this->image ); + $this->image = $dst; + return true; + } + } + return new WP_Error( 'image_flip_error', __( 'Image flip failed.' ), $this->file ); + } + + /** + * Saves current in-memory image to file. + * + * @since 3.5.0 + * + * @param string|null $filename + * @param string|null $mime_type + * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} + */ + public function save( $filename = null, $mime_type = null ) { + $saved = $this->_save( $this->image, $filename, $mime_type ); + + if ( ! is_wp_error( $saved ) ) { + $this->file = $saved['path']; + $this->mime_type = $saved['mime-type']; + } + + return $saved; + } + + /** + * @param resource $image + * @param string|null $filename + * @param string|null $mime_type + * @return array|WP_Error + */ + protected function _save( $image, $filename = null, $mime_type = null ) { + list( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type ); + + if ( ! $filename ) { + $filename = $this->generate_filename( null, null, $extension ); + } + + if ( 'image/gif' === $mime_type ) { + if ( ! $this->make_image( $filename, 'imagegif', array( $image, $filename ) ) ) { + return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) ); + } + } elseif ( 'image/png' === $mime_type ) { + // Convert from full colors to index colors, like original PNG. + if ( function_exists( 'imageistruecolor' ) && ! imageistruecolor( $image ) ) { + imagetruecolortopalette( $image, false, imagecolorstotal( $image ) ); + } + + if ( ! $this->make_image( $filename, 'imagepng', array( $image, $filename ) ) ) { + return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) ); + } + } elseif ( 'image/jpeg' === $mime_type ) { + if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->get_quality() ) ) ) { + return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) ); + } + } else { + return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) ); + } + + // Set correct file permissions. + $stat = stat( dirname( $filename ) ); + $perms = $stat['mode'] & 0000666; // Same permissions as parent folder, strip off the executable bits. + chmod( $filename, $perms ); + + /** + * Filters the name of the saved image file. + * + * @since 2.6.0 + * + * @param string $filename Name of the file. + */ + return array( + 'path' => $filename, + 'file' => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ), + 'width' => $this->size['width'], + 'height' => $this->size['height'], + 'mime-type' => $mime_type, + ); + } + + /** + * Returns stream of current image. + * + * @since 3.5.0 + * + * @param string $mime_type The mime type of the image. + * @return bool True on success, false on failure. + */ + public function stream( $mime_type = null ) { + list( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type ); + + switch ( $mime_type ) { + case 'image/png': + header( 'Content-Type: image/png' ); + return imagepng( $this->image ); + case 'image/gif': + header( 'Content-Type: image/gif' ); + return imagegif( $this->image ); + default: + header( 'Content-Type: image/jpeg' ); + return imagejpeg( $this->image, null, $this->get_quality() ); + } + } + + /** + * Either calls editor's save function or handles file as a stream. + * + * @since 3.5.0 + * + * @param string|stream $filename + * @param callable $function + * @param array $arguments + * @return bool + */ + protected function make_image( $filename, $function, $arguments ) { + if ( wp_is_stream( $filename ) ) { + $arguments[1] = null; + } + + return parent::make_image( $filename, $function, $arguments ); + } +} diff --git a/wp-includes/class-wp-image-editor-imagick.php b/wp-includes/class-wp-image-editor-imagick.php new file mode 100644 index 0000000..ea2c48e --- /dev/null +++ b/wp-includes/class-wp-image-editor-imagick.php @@ -0,0 +1,808 @@ +<?php +/** + * WordPress Imagick Image Editor + * + * @package WordPress + * @subpackage Image_Editor + */ + +/** + * WordPress Image Editor Class for Image Manipulation through Imagick PHP Module + * + * @since 3.5.0 + * + * @see WP_Image_Editor + */ +class WP_Image_Editor_Imagick extends WP_Image_Editor { + /** + * Imagick object. + * + * @var Imagick + */ + protected $image; + + public function __destruct() { + if ( $this->image instanceof Imagick ) { + // We don't need the original in memory anymore. + $this->image->clear(); + $this->image->destroy(); + } + } + + /** + * Checks to see if current environment supports Imagick. + * + * We require Imagick 2.2.0 or greater, based on whether the queryFormats() + * method can be called statically. + * + * @since 3.5.0 + * + * @param array $args + * @return bool + */ + public static function test( $args = array() ) { + + // First, test Imagick's extension and classes. + if ( ! extension_loaded( 'imagick' ) || ! class_exists( 'Imagick', false ) || ! class_exists( 'ImagickPixel', false ) ) { + return false; + } + + if ( version_compare( phpversion( 'imagick' ), '2.2.0', '<' ) ) { + return false; + } + + $required_methods = array( + 'clear', + 'destroy', + 'valid', + 'getimage', + 'writeimage', + 'getimageblob', + 'getimagegeometry', + 'getimageformat', + 'setimageformat', + 'setimagecompression', + 'setimagecompressionquality', + 'setimagepage', + 'setoption', + 'scaleimage', + 'cropimage', + 'rotateimage', + 'flipimage', + 'flopimage', + 'readimage', + ); + + // Now, test for deep requirements within Imagick. + if ( ! defined( 'imagick::COMPRESSION_JPEG' ) ) { + return false; + } + + $class_methods = array_map( 'strtolower', get_class_methods( 'Imagick' ) ); + if ( array_diff( $required_methods, $class_methods ) ) { + return false; + } + + return true; + } + + /** + * Checks to see if editor supports the mime-type specified. + * + * @since 3.5.0 + * + * @param string $mime_type + * @return bool + */ + public static function supports_mime_type( $mime_type ) { + $imagick_extension = strtoupper( self::get_extension( $mime_type ) ); + + if ( ! $imagick_extension ) { + return false; + } + + // setIteratorIndex is optional unless mime is an animated format. + // Here, we just say no if you are missing it and aren't loading a jpeg. + if ( ! method_exists( 'Imagick', 'setIteratorIndex' ) && 'image/jpeg' !== $mime_type ) { + return false; + } + + try { + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + return ( (bool) @Imagick::queryFormats( $imagick_extension ) ); + } catch ( Exception $e ) { + return false; + } + } + + /** + * Loads image from $this->file into new Imagick Object. + * + * @since 3.5.0 + * + * @return true|WP_Error True if loaded; WP_Error on failure. + */ + public function load() { + if ( $this->image instanceof Imagick ) { + return true; + } + + if ( ! is_file( $this->file ) && ! preg_match( '|^https?://|', $this->file ) ) { + return new WP_Error( 'error_loading_image', __( 'File doesn’t exist?' ), $this->file ); + } + + /* + * Even though Imagick uses less PHP memory than GD, set higher limit + * for users that have low PHP.ini limits. + */ + wp_raise_memory_limit( 'image' ); + + try { + $this->image = new Imagick(); + $file_extension = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) ); + $filename = $this->file; + + if ( 'pdf' === $file_extension ) { + $filename = $this->pdf_setup(); + } + + // Reading image after Imagick instantiation because `setResolution` + // only applies correctly before the image is read. + $this->image->readImage( $filename ); + + if ( ! $this->image->valid() ) { + return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file ); + } + + // Select the first frame to handle animated images properly. + if ( is_callable( array( $this->image, 'setIteratorIndex' ) ) ) { + $this->image->setIteratorIndex( 0 ); + } + + $this->mime_type = $this->get_mime_type( $this->image->getImageFormat() ); + } catch ( Exception $e ) { + return new WP_Error( 'invalid_image', $e->getMessage(), $this->file ); + } + + $updated_size = $this->update_size(); + if ( is_wp_error( $updated_size ) ) { + return $updated_size; + } + + return $this->set_quality(); + } + + /** + * Sets Image Compression quality on a 1-100% scale. + * + * @since 3.5.0 + * + * @param int $quality Compression Quality. Range: [1,100] + * @return true|WP_Error True if set successfully; WP_Error on failure. + */ + public function set_quality( $quality = null ) { + $quality_result = parent::set_quality( $quality ); + if ( is_wp_error( $quality_result ) ) { + return $quality_result; + } else { + $quality = $this->get_quality(); + } + + try { + if ( 'image/jpeg' === $this->mime_type ) { + $this->image->setImageCompressionQuality( $quality ); + $this->image->setImageCompression( imagick::COMPRESSION_JPEG ); + } else { + $this->image->setImageCompressionQuality( $quality ); + } + } catch ( Exception $e ) { + return new WP_Error( 'image_quality_error', $e->getMessage() ); + } + + return true; + } + + /** + * Sets or updates current image size. + * + * @since 3.5.0 + * + * @param int $width + * @param int $height + * + * @return true|WP_Error + */ + protected function update_size( $width = null, $height = null ) { + $size = null; + if ( ! $width || ! $height ) { + try { + $size = $this->image->getImageGeometry(); + } catch ( Exception $e ) { + return new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file ); + } + } + + if ( ! $width ) { + $width = $size['width']; + } + + if ( ! $height ) { + $height = $size['height']; + } + + return parent::update_size( $width, $height ); + } + + /** + * Resizes current image. + * + * At minimum, either a height or width must be provided. + * If one of the two is set to null, the resize will + * maintain aspect ratio according to the provided dimension. + * + * @since 3.5.0 + * + * @param int|null $max_w Image width. + * @param int|null $max_h Image height. + * @param bool $crop + * @return bool|WP_Error + */ + public function resize( $max_w, $max_h, $crop = false ) { + if ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) ) { + return true; + } + + $dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop ); + if ( ! $dims ) { + return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ) ); + } + + list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims; + + if ( $crop ) { + return $this->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h ); + } + + // Execute the resize. + $thumb_result = $this->thumbnail_image( $dst_w, $dst_h ); + if ( is_wp_error( $thumb_result ) ) { + return $thumb_result; + } + + return $this->update_size( $dst_w, $dst_h ); + } + + /** + * Efficiently resize the current image + * + * This is a WordPress specific implementation of Imagick::thumbnailImage(), + * which resizes an image to given dimensions and removes any associated profiles. + * + * @since 4.5.0 + * + * @param int $dst_w The destination width. + * @param int $dst_h The destination height. + * @param string $filter_name Optional. The Imagick filter to use when resizing. Default 'FILTER_TRIANGLE'. + * @param bool $strip_meta Optional. Strip all profiles, excluding color profiles, from the image. Default true. + * @return bool|WP_Error + */ + protected function thumbnail_image( $dst_w, $dst_h, $filter_name = 'FILTER_TRIANGLE', $strip_meta = true ) { + $allowed_filters = array( + 'FILTER_POINT', + 'FILTER_BOX', + 'FILTER_TRIANGLE', + 'FILTER_HERMITE', + 'FILTER_HANNING', + 'FILTER_HAMMING', + 'FILTER_BLACKMAN', + 'FILTER_GAUSSIAN', + 'FILTER_QUADRATIC', + 'FILTER_CUBIC', + 'FILTER_CATROM', + 'FILTER_MITCHELL', + 'FILTER_LANCZOS', + 'FILTER_BESSEL', + 'FILTER_SINC', + ); + + /** + * Set the filter value if '$filter_name' name is in our whitelist and the related + * Imagick constant is defined or fall back to our default filter. + */ + if ( in_array( $filter_name, $allowed_filters, true ) && defined( 'Imagick::' . $filter_name ) ) { + $filter = constant( 'Imagick::' . $filter_name ); + } else { + $filter = defined( 'Imagick::FILTER_TRIANGLE' ) ? Imagick::FILTER_TRIANGLE : false; + } + + /** + * Filters whether to strip metadata from images when they're resized. + * + * This filter only applies when resizing using the Imagick editor since GD + * always strips profiles by default. + * + * @since 4.5.0 + * + * @param bool $strip_meta Whether to strip image metadata during resizing. Default true. + */ + if ( apply_filters( 'image_strip_meta', $strip_meta ) ) { + $this->strip_meta(); // Fail silently if not supported. + } + + try { + /* + * To be more efficient, resample large images to 5x the destination size before resizing + * whenever the output size is less that 1/3 of the original image size (1/3^2 ~= .111), + * unless we would be resampling to a scale smaller than 128x128. + */ + if ( is_callable( array( $this->image, 'sampleImage' ) ) ) { + $resize_ratio = ( $dst_w / $this->size['width'] ) * ( $dst_h / $this->size['height'] ); + $sample_factor = 5; + + if ( $resize_ratio < .111 && ( $dst_w * $sample_factor > 128 && $dst_h * $sample_factor > 128 ) ) { + $this->image->sampleImage( $dst_w * $sample_factor, $dst_h * $sample_factor ); + } + } + + /* + * Use resizeImage() when it's available and a valid filter value is set. + * Otherwise, fall back to the scaleImage() method for resizing, which + * results in better image quality over resizeImage() with default filter + * settings and retains backward compatibility with pre 4.5 functionality. + */ + if ( is_callable( array( $this->image, 'resizeImage' ) ) && $filter ) { + $this->image->setOption( 'filter:support', '2.0' ); + $this->image->resizeImage( $dst_w, $dst_h, $filter, 1 ); + } else { + $this->image->scaleImage( $dst_w, $dst_h ); + } + + // Set appropriate quality settings after resizing. + if ( 'image/jpeg' === $this->mime_type ) { + if ( is_callable( array( $this->image, 'unsharpMaskImage' ) ) ) { + $this->image->unsharpMaskImage( 0.25, 0.25, 8, 0.065 ); + } + + $this->image->setOption( 'jpeg:fancy-upsampling', 'off' ); + } + + if ( 'image/png' === $this->mime_type ) { + $this->image->setOption( 'png:compression-filter', '5' ); + $this->image->setOption( 'png:compression-level', '9' ); + $this->image->setOption( 'png:compression-strategy', '1' ); + $this->image->setOption( 'png:exclude-chunk', 'all' ); + } + + /* + * If alpha channel is not defined, set it opaque. + * + * Note that Imagick::getImageAlphaChannel() is only available if Imagick + * has been compiled against ImageMagick version 6.4.0 or newer. + */ + if ( is_callable( array( $this->image, 'getImageAlphaChannel' ) ) + && is_callable( array( $this->image, 'setImageAlphaChannel' ) ) + && defined( 'Imagick::ALPHACHANNEL_UNDEFINED' ) + && defined( 'Imagick::ALPHACHANNEL_OPAQUE' ) + ) { + if ( $this->image->getImageAlphaChannel() === Imagick::ALPHACHANNEL_UNDEFINED ) { + $this->image->setImageAlphaChannel( Imagick::ALPHACHANNEL_OPAQUE ); + } + } + + // Limit the bit depth of resized images to 8 bits per channel. + if ( is_callable( array( $this->image, 'getImageDepth' ) ) && is_callable( array( $this->image, 'setImageDepth' ) ) ) { + if ( 8 < $this->image->getImageDepth() ) { + $this->image->setImageDepth( 8 ); + } + } + + if ( is_callable( array( $this->image, 'setInterlaceScheme' ) ) && defined( 'Imagick::INTERLACE_NO' ) ) { + $this->image->setInterlaceScheme( Imagick::INTERLACE_NO ); + } + } catch ( Exception $e ) { + return new WP_Error( 'image_resize_error', $e->getMessage() ); + } + } + + /** + * Create multiple smaller images from a single source. + * + * Attempts to create all sub-sizes and returns the meta data at the end. This + * may result in the server running out of resources. When it fails there may be few + * "orphaned" images left over as the meta data is never returned and saved. + * + * As of 5.3.0 the preferred way to do this is with `make_subsize()`. It creates + * the new images one at a time and allows for the meta data to be saved after + * each new image is created. + * + * @since 3.5.0 + * + * @param array $sizes { + * An array of image size data arrays. + * + * Either a height or width must be provided. + * If one of the two is set to null, the resize will + * maintain aspect ratio according to the provided dimension. + * + * @type array $size { + * Array of height, width values, and whether to crop. + * + * @type int $width Image width. Optional if `$height` is specified. + * @type int $height Image height. Optional if `$width` is specified. + * @type bool $crop Optional. Whether to crop the image. Default false. + * } + * } + * @return array An array of resized images' metadata by size. + */ + public function multi_resize( $sizes ) { + $metadata = array(); + + foreach ( $sizes as $size => $size_data ) { + $meta = $this->make_subsize( $size_data ); + + if ( ! is_wp_error( $meta ) ) { + $metadata[ $size ] = $meta; + } + } + + return $metadata; + } + + /** + * Create an image sub-size and return the image meta data value for it. + * + * @since 5.3.0 + * + * @param array $size_data { + * Array of size data. + * + * @type int $width The maximum width in pixels. + * @type int $height The maximum height in pixels. + * @type bool $crop Whether to crop the image to exact dimensions. + * } + * @return array|WP_Error The image data array for inclusion in the `sizes` array in the image meta, + * WP_Error object on error. + */ + public function make_subsize( $size_data ) { + if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) { + return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) ); + } + + $orig_size = $this->size; + $orig_image = $this->image->getImage(); + + if ( ! isset( $size_data['width'] ) ) { + $size_data['width'] = null; + } + + if ( ! isset( $size_data['height'] ) ) { + $size_data['height'] = null; + } + + if ( ! isset( $size_data['crop'] ) ) { + $size_data['crop'] = false; + } + + $resized = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] ); + + if ( is_wp_error( $resized ) ) { + $saved = $resized; + } else { + $saved = $this->_save( $this->image ); + + $this->image->clear(); + $this->image->destroy(); + $this->image = null; + } + + $this->size = $orig_size; + $this->image = $orig_image; + + if ( ! is_wp_error( $saved ) ) { + unset( $saved['path'] ); + } + + return $saved; + } + + /** + * Crops Image. + * + * @since 3.5.0 + * + * @param int $src_x The start x position to crop from. + * @param int $src_y The start y position to crop from. + * @param int $src_w The width to crop. + * @param int $src_h The height to crop. + * @param int $dst_w Optional. The destination width. + * @param int $dst_h Optional. The destination height. + * @param bool $src_abs Optional. If the source crop points are absolute. + * @return bool|WP_Error + */ + public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) { + if ( $src_abs ) { + $src_w -= $src_x; + $src_h -= $src_y; + } + + try { + $this->image->cropImage( $src_w, $src_h, $src_x, $src_y ); + $this->image->setImagePage( $src_w, $src_h, 0, 0 ); + + if ( $dst_w || $dst_h ) { + // If destination width/height isn't specified, + // use same as width/height from source. + if ( ! $dst_w ) { + $dst_w = $src_w; + } + if ( ! $dst_h ) { + $dst_h = $src_h; + } + + $thumb_result = $this->thumbnail_image( $dst_w, $dst_h ); + if ( is_wp_error( $thumb_result ) ) { + return $thumb_result; + } + + return $this->update_size(); + } + } catch ( Exception $e ) { + return new WP_Error( 'image_crop_error', $e->getMessage() ); + } + return $this->update_size(); + } + + /** + * Rotates current image counter-clockwise by $angle. + * + * @since 3.5.0 + * + * @param float $angle + * @return true|WP_Error + */ + public function rotate( $angle ) { + /** + * $angle is 360-$angle because Imagick rotates clockwise + * (GD rotates counter-clockwise) + */ + try { + $this->image->rotateImage( new ImagickPixel( 'none' ), 360 - $angle ); + + // Normalise EXIF orientation data so that display is consistent across devices. + if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { + $this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT ); + } + + // Since this changes the dimensions of the image, update the size. + $result = $this->update_size(); + if ( is_wp_error( $result ) ) { + return $result; + } + + $this->image->setImagePage( $this->size['width'], $this->size['height'], 0, 0 ); + } catch ( Exception $e ) { + return new WP_Error( 'image_rotate_error', $e->getMessage() ); + } + return true; + } + + /** + * Flips current image. + * + * @since 3.5.0 + * + * @param bool $horz Flip along Horizontal Axis + * @param bool $vert Flip along Vertical Axis + * @return true|WP_Error + */ + public function flip( $horz, $vert ) { + try { + if ( $horz ) { + $this->image->flipImage(); + } + + if ( $vert ) { + $this->image->flopImage(); + } + + // Normalise EXIF orientation data so that display is consistent across devices. + if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { + $this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT ); + } + } catch ( Exception $e ) { + return new WP_Error( 'image_flip_error', $e->getMessage() ); + } + + return true; + } + + /** + * Check if a JPEG image has EXIF Orientation tag and rotate it if needed. + * + * As ImageMagick copies the EXIF data to the flipped/rotated image, proceed only + * if EXIF Orientation can be reset afterwards. + * + * @since 5.3.0 + * + * @return bool|WP_Error True if the image was rotated. False if no EXIF data or if the image doesn't need rotation. + * WP_Error if error while rotating. + */ + public function maybe_exif_rotate() { + if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { + return parent::maybe_exif_rotate(); + } else { + return new WP_Error( 'write_exif_error', __( 'The image cannot be rotated because the embedded meta data cannot be updated.' ) ); + } + } + + /** + * Saves current image to file. + * + * @since 3.5.0 + * + * @param string $destfilename + * @param string $mime_type + * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} + */ + public function save( $destfilename = null, $mime_type = null ) { + $saved = $this->_save( $this->image, $destfilename, $mime_type ); + + if ( ! is_wp_error( $saved ) ) { + $this->file = $saved['path']; + $this->mime_type = $saved['mime-type']; + + try { + $this->image->setImageFormat( strtoupper( $this->get_extension( $this->mime_type ) ) ); + } catch ( Exception $e ) { + return new WP_Error( 'image_save_error', $e->getMessage(), $this->file ); + } + } + + return $saved; + } + + /** + * @param Imagick $image + * @param string $filename + * @param string $mime_type + * @return array|WP_Error + */ + protected function _save( $image, $filename = null, $mime_type = null ) { + list( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type ); + + if ( ! $filename ) { + $filename = $this->generate_filename( null, null, $extension ); + } + + try { + // Store initial format. + $orig_format = $this->image->getImageFormat(); + + $this->image->setImageFormat( strtoupper( $this->get_extension( $mime_type ) ) ); + $this->make_image( $filename, array( $image, 'writeImage' ), array( $filename ) ); + + // Reset original format. + $this->image->setImageFormat( $orig_format ); + } catch ( Exception $e ) { + return new WP_Error( 'image_save_error', $e->getMessage(), $filename ); + } + + // Set correct file permissions. + $stat = stat( dirname( $filename ) ); + $perms = $stat['mode'] & 0000666; // Same permissions as parent folder, strip off the executable bits. + chmod( $filename, $perms ); + + return array( + 'path' => $filename, + /** This filter is documented in wp-includes/class-wp-image-editor-gd.php */ + 'file' => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ), + 'width' => $this->size['width'], + 'height' => $this->size['height'], + 'mime-type' => $mime_type, + ); + } + + /** + * Streams current image to browser. + * + * @since 3.5.0 + * + * @param string $mime_type The mime type of the image. + * @return bool|WP_Error True on success, WP_Error object on failure. + */ + public function stream( $mime_type = null ) { + list( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type ); + + try { + // Temporarily change format for stream. + $this->image->setImageFormat( strtoupper( $extension ) ); + + // Output stream of image content. + header( "Content-Type: $mime_type" ); + print $this->image->getImageBlob(); + + // Reset image to original format. + $this->image->setImageFormat( $this->get_extension( $this->mime_type ) ); + } catch ( Exception $e ) { + return new WP_Error( 'image_stream_error', $e->getMessage() ); + } + + return true; + } + + /** + * Strips all image meta except color profiles from an image. + * + * @since 4.5.0 + * + * @return true|WP_Error True if stripping metadata was successful. WP_Error object on error. + */ + protected function strip_meta() { + + if ( ! is_callable( array( $this->image, 'getImageProfiles' ) ) ) { + /* translators: %s: ImageMagick method name. */ + return new WP_Error( 'image_strip_meta_error', sprintf( __( '%s is required to strip image meta.' ), '<code>Imagick::getImageProfiles()</code>' ) ); + } + + if ( ! is_callable( array( $this->image, 'removeImageProfile' ) ) ) { + /* translators: %s: ImageMagick method name. */ + return new WP_Error( 'image_strip_meta_error', sprintf( __( '%s is required to strip image meta.' ), '<code>Imagick::removeImageProfile()</code>' ) ); + } + + /* + * Protect a few profiles from being stripped for the following reasons: + * + * - icc: Color profile information + * - icm: Color profile information + * - iptc: Copyright data + * - exif: Orientation data + * - xmp: Rights usage data + */ + $protected_profiles = array( + 'icc', + 'icm', + 'iptc', + 'exif', + 'xmp', + ); + + try { + // Strip profiles. + foreach ( $this->image->getImageProfiles( '*', true ) as $key => $value ) { + if ( ! in_array( $key, $protected_profiles, true ) ) { + $this->image->removeImageProfile( $key ); + } + } + } catch ( Exception $e ) { + return new WP_Error( 'image_strip_meta_error', $e->getMessage() ); + } + + return true; + } + + /** + * Sets up Imagick for PDF processing. + * Increases rendering DPI and only loads first page. + * + * @since 4.7.0 + * + * @return string|WP_Error File to load or WP_Error on failure. + */ + protected function pdf_setup() { + try { + // By default, PDFs are rendered in a very low resolution. + // We want the thumbnail to be readable, so increase the rendering DPI. + $this->image->setResolution( 128, 128 ); + + // When generating thumbnails from cropped PDF pages, Imagemagick uses the uncropped + // area (resulting in unnecessary whitespace) unless the following option is set. + $this->image->setOption( 'pdf:use-cropbox', true ); + + // Only load the first page. + return $this->file . '[0]'; + } catch ( Exception $e ) { + return new WP_Error( 'pdf_setup_failed', $e->getMessage(), $this->file ); + } + } + +} diff --git a/wp-includes/class-wp-image-editor.php b/wp-includes/class-wp-image-editor.php new file mode 100644 index 0000000..82afc9c --- /dev/null +++ b/wp-includes/class-wp-image-editor.php @@ -0,0 +1,557 @@ +<?php +/** + * Base WordPress Image Editor + * + * @package WordPress + * @subpackage Image_Editor + */ + +/** + * Base image editor class from which implementations extend + * + * @since 3.5.0 + */ +abstract class WP_Image_Editor { + protected $file = null; + protected $size = null; + protected $mime_type = null; + protected $default_mime_type = 'image/jpeg'; + protected $quality = false; + protected $default_quality = 82; + + /** + * Each instance handles a single file. + * + * @param string $file Path to the file to load. + */ + public function __construct( $file ) { + $this->file = $file; + } + + /** + * Checks to see if current environment supports the editor chosen. + * Must be overridden in a subclass. + * + * @since 3.5.0 + * + * @abstract + * + * @param array $args + * @return bool + */ + public static function test( $args = array() ) { + return false; + } + + /** + * Checks to see if editor supports the mime-type specified. + * Must be overridden in a subclass. + * + * @since 3.5.0 + * + * @abstract + * + * @param string $mime_type + * @return bool + */ + public static function supports_mime_type( $mime_type ) { + return false; + } + + /** + * Loads image from $this->file into editor. + * + * @since 3.5.0 + * @abstract + * + * @return bool|WP_Error True if loaded; WP_Error on failure. + */ + abstract public function load(); + + /** + * Saves current image to file. + * + * @since 3.5.0 + * @abstract + * + * @param string $destfilename + * @param string $mime_type + * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} + */ + abstract public function save( $destfilename = null, $mime_type = null ); + + /** + * Resizes current image. + * + * At minimum, either a height or width must be provided. + * If one of the two is set to null, the resize will + * maintain aspect ratio according to the provided dimension. + * + * @since 3.5.0 + * @abstract + * + * @param int|null $max_w Image width. + * @param int|null $max_h Image height. + * @param bool $crop + * @return bool|WP_Error + */ + abstract public function resize( $max_w, $max_h, $crop = false ); + + /** + * Resize multiple images from a single source. + * + * @since 3.5.0 + * @abstract + * + * @param array $sizes { + * An array of image size arrays. Default sizes are 'small', 'medium', 'large'. + * + * @type array $size { + * @type int $width Image width. + * @type int $height Image height. + * @type bool $crop Optional. Whether to crop the image. Default false. + * } + * } + * @return array An array of resized images metadata by size. + */ + abstract public function multi_resize( $sizes ); + + /** + * Crops Image. + * + * @since 3.5.0 + * @abstract + * + * @param int $src_x The start x position to crop from. + * @param int $src_y The start y position to crop from. + * @param int $src_w The width to crop. + * @param int $src_h The height to crop. + * @param int $dst_w Optional. The destination width. + * @param int $dst_h Optional. The destination height. + * @param bool $src_abs Optional. If the source crop points are absolute. + * @return bool|WP_Error + */ + abstract public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ); + + /** + * Rotates current image counter-clockwise by $angle. + * + * @since 3.5.0 + * @abstract + * + * @param float $angle + * @return bool|WP_Error + */ + abstract public function rotate( $angle ); + + /** + * Flips current image. + * + * @since 3.5.0 + * @abstract + * + * @param bool $horz Flip along Horizontal Axis + * @param bool $vert Flip along Vertical Axis + * @return bool|WP_Error + */ + abstract public function flip( $horz, $vert ); + + /** + * Streams current image to browser. + * + * @since 3.5.0 + * @abstract + * + * @param string $mime_type The mime type of the image. + * @return bool|WP_Error True on success, WP_Error object or false on failure. + */ + abstract public function stream( $mime_type = null ); + + /** + * Gets dimensions of image. + * + * @since 3.5.0 + * + * @return array { + * Dimensions of the image. + * + * @type int $width The image width. + * @type int $height The image height. + * } + */ + public function get_size() { + return $this->size; + } + + /** + * Sets current image size. + * + * @since 3.5.0 + * + * @param int $width + * @param int $height + * @return true + */ + protected function update_size( $width = null, $height = null ) { + $this->size = array( + 'width' => (int) $width, + 'height' => (int) $height, + ); + return true; + } + + /** + * Gets the Image Compression quality on a 1-100% scale. + * + * @since 4.0.0 + * + * @return int $quality Compression Quality. Range: [1,100] + */ + public function get_quality() { + if ( ! $this->quality ) { + $this->set_quality(); + } + + return $this->quality; + } + + /** + * Sets Image Compression quality on a 1-100% scale. + * + * @since 3.5.0 + * + * @param int $quality Compression Quality. Range: [1,100] + * @return true|WP_Error True if set successfully; WP_Error on failure. + */ + public function set_quality( $quality = null ) { + if ( null === $quality ) { + /** + * Filters the default image compression quality setting. + * + * Applies only during initial editor instantiation, or when set_quality() is run + * manually without the `$quality` argument. + * + * set_quality() has priority over the filter. + * + * @since 3.5.0 + * + * @param int $quality Quality level between 1 (low) and 100 (high). + * @param string $mime_type Image mime type. + */ + $quality = apply_filters( 'wp_editor_set_quality', $this->default_quality, $this->mime_type ); + + if ( 'image/jpeg' == $this->mime_type ) { + /** + * Filters the JPEG compression quality for backward-compatibility. + * + * Applies only during initial editor instantiation, or when set_quality() is run + * manually without the `$quality` argument. + * + * set_quality() has priority over the filter. + * + * The filter is evaluated under two contexts: 'image_resize', and 'edit_image', + * (when a JPEG image is saved to file). + * + * @since 2.5.0 + * + * @param int $quality Quality level between 0 (low) and 100 (high) of the JPEG. + * @param string $context Context of the filter. + */ + $quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' ); + } + + if ( $quality < 0 || $quality > 100 ) { + $quality = $this->default_quality; + } + } + + // Allow 0, but squash to 1 due to identical images in GD, and for backward compatibility. + if ( 0 === $quality ) { + $quality = 1; + } + + if ( ( $quality >= 1 ) && ( $quality <= 100 ) ) { + $this->quality = $quality; + return true; + } else { + return new WP_Error( 'invalid_image_quality', __( 'Attempted to set image quality outside of the range [1,100].' ) ); + } + } + + /** + * Returns preferred mime-type and extension based on provided + * file's extension and mime, or current file's extension and mime. + * + * Will default to $this->default_mime_type if requested is not supported. + * + * Provides corrected filename only if filename is provided. + * + * @since 3.5.0 + * + * @param string $filename + * @param string $mime_type + * @return array { filename|null, extension, mime-type } + */ + protected function get_output_format( $filename = null, $mime_type = null ) { + $new_ext = null; + + // By default, assume specified type takes priority. + if ( $mime_type ) { + $new_ext = $this->get_extension( $mime_type ); + } + + if ( $filename ) { + $file_ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) ); + $file_mime = $this->get_mime_type( $file_ext ); + } else { + // If no file specified, grab editor's current extension and mime-type. + $file_ext = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) ); + $file_mime = $this->mime_type; + } + + // Check to see if specified mime-type is the same as type implied by + // file extension. If so, prefer extension from file. + if ( ! $mime_type || ( $file_mime == $mime_type ) ) { + $mime_type = $file_mime; + $new_ext = $file_ext; + } + + // Double-check that the mime-type selected is supported by the editor. + // If not, choose a default instead. + if ( ! $this->supports_mime_type( $mime_type ) ) { + /** + * Filters default mime type prior to getting the file extension. + * + * @see wp_get_mime_types() + * + * @since 3.5.0 + * + * @param string $mime_type Mime type string. + */ + $mime_type = apply_filters( 'image_editor_default_mime_type', $this->default_mime_type ); + $new_ext = $this->get_extension( $mime_type ); + } + + if ( $filename ) { + $dir = pathinfo( $filename, PATHINFO_DIRNAME ); + $ext = pathinfo( $filename, PATHINFO_EXTENSION ); + + $filename = trailingslashit( $dir ) . wp_basename( $filename, ".$ext" ) . ".{$new_ext}"; + } + + return array( $filename, $new_ext, $mime_type ); + } + + /** + * Builds an output filename based on current file, and adding proper suffix + * + * @since 3.5.0 + * + * @param string $suffix + * @param string $dest_path + * @param string $extension + * @return string filename + */ + public function generate_filename( $suffix = null, $dest_path = null, $extension = null ) { + // $suffix will be appended to the destination filename, just before the extension. + if ( ! $suffix ) { + $suffix = $this->get_suffix(); + } + + $dir = pathinfo( $this->file, PATHINFO_DIRNAME ); + $ext = pathinfo( $this->file, PATHINFO_EXTENSION ); + + $name = wp_basename( $this->file, ".$ext" ); + $new_ext = strtolower( $extension ? $extension : $ext ); + + if ( ! is_null( $dest_path ) ) { + $_dest_path = realpath( $dest_path ); + if ( $_dest_path ) { + $dir = $_dest_path; + } + } + + return trailingslashit( $dir ) . "{$name}-{$suffix}.{$new_ext}"; + } + + /** + * Builds and returns proper suffix for file based on height and width. + * + * @since 3.5.0 + * + * @return string|false suffix + */ + public function get_suffix() { + if ( ! $this->get_size() ) { + return false; + } + + return "{$this->size['width']}x{$this->size['height']}"; + } + + /** + * Check if a JPEG image has EXIF Orientation tag and rotate it if needed. + * + * @since 5.3.0 + * + * @return bool|WP_Error True if the image was rotated. False if not rotated (no EXIF data or the image doesn't need to be rotated). + * WP_Error if error while rotating. + */ + public function maybe_exif_rotate() { + $orientation = null; + + if ( is_callable( 'exif_read_data' ) && 'image/jpeg' === $this->mime_type ) { + $exif_data = @exif_read_data( $this->file ); + + if ( ! empty( $exif_data['Orientation'] ) ) { + $orientation = (int) $exif_data['Orientation']; + } + } + + /** + * Filters the `$orientation` value to correct it before rotating or to prevemnt rotating the image. + * + * @since 5.3.0 + * + * @param int $orientation EXIF Orientation value as retrieved from the image file. + * @param string $file Path to the image file. + */ + $orientation = apply_filters( 'wp_image_maybe_exif_rotate', $orientation, $this->file ); + + if ( ! $orientation || 1 === $orientation ) { + return false; + } + + switch ( $orientation ) { + case 2: + // Flip horizontally. + $result = $this->flip( true, false ); + break; + case 3: + // Rotate 180 degrees or flip horizontally and vertically. + // Flipping seems faster and uses less resources. + $result = $this->flip( true, true ); + break; + case 4: + // Flip vertically. + $result = $this->flip( false, true ); + break; + case 5: + // Rotate 90 degrees counter-clockwise and flip vertically. + $result = $this->rotate( 90 ); + + if ( ! is_wp_error( $result ) ) { + $result = $this->flip( false, true ); + } + + break; + case 6: + // Rotate 90 degrees clockwise (270 counter-clockwise). + $result = $this->rotate( 270 ); + break; + case 7: + // Rotate 90 degrees counter-clockwise and flip horizontally. + $result = $this->rotate( 90 ); + + if ( ! is_wp_error( $result ) ) { + $result = $this->flip( true, false ); + } + + break; + case 8: + // Rotate 90 degrees counter-clockwise. + $result = $this->rotate( 90 ); + break; + } + + return $result; + } + + /** + * Either calls editor's save function or handles file as a stream. + * + * @since 3.5.0 + * + * @param string|stream $filename + * @param callable $function + * @param array $arguments + * @return bool + */ + protected function make_image( $filename, $function, $arguments ) { + $stream = wp_is_stream( $filename ); + if ( $stream ) { + ob_start(); + } else { + // The directory containing the original file may no longer exist when using a replication plugin. + wp_mkdir_p( dirname( $filename ) ); + } + + $result = call_user_func_array( $function, $arguments ); + + if ( $result && $stream ) { + $contents = ob_get_contents(); + + $fp = fopen( $filename, 'w' ); + + if ( ! $fp ) { + ob_end_clean(); + return false; + } + + fwrite( $fp, $contents ); + fclose( $fp ); + } + + if ( $stream ) { + ob_end_clean(); + } + + return $result; + } + + /** + * Returns first matched mime-type from extension, + * as mapped from wp_get_mime_types() + * + * @since 3.5.0 + * + * @param string $extension + * @return string|false + */ + protected static function get_mime_type( $extension = null ) { + if ( ! $extension ) { + return false; + } + + $mime_types = wp_get_mime_types(); + $extensions = array_keys( $mime_types ); + + foreach ( $extensions as $_extension ) { + if ( preg_match( "/{$extension}/i", $_extension ) ) { + return $mime_types[ $_extension ]; + } + } + + return false; + } + + /** + * Returns first matched extension from Mime-type, + * as mapped from wp_get_mime_types() + * + * @since 3.5.0 + * + * @param string $mime_type + * @return string|false + */ + protected static function get_extension( $mime_type = null ) { + $extensions = explode( '|', array_search( $mime_type, wp_get_mime_types() ) ); + + if ( empty( $extensions[0] ) ) { + return false; + } + + return $extensions[0]; + } +} + diff --git a/wp-includes/class-wp-list-util.php b/wp-includes/class-wp-list-util.php new file mode 100644 index 0000000..3366af3 --- /dev/null +++ b/wp-includes/class-wp-list-util.php @@ -0,0 +1,266 @@ +<?php +/** + * WordPress List utility class + * + * @package WordPress + * @since 4.7.0 + */ + +/** + * List utility. + * + * Utility class to handle operations on an array of objects. + * + * @since 4.7.0 + */ +class WP_List_Util { + /** + * The input array. + * + * @since 4.7.0 + * @var array + */ + private $input = array(); + + /** + * The output array. + * + * @since 4.7.0 + * @var array + */ + private $output = array(); + + /** + * Temporary arguments for sorting. + * + * @since 4.7.0 + * @var array + */ + private $orderby = array(); + + /** + * Constructor. + * + * Sets the input array. + * + * @since 4.7.0 + * + * @param array $input Array to perform operations on. + */ + public function __construct( $input ) { + $this->output = $input; + $this->input = $input; + } + + /** + * Returns the original input array. + * + * @since 4.7.0 + * + * @return array The input array. + */ + public function get_input() { + return $this->input; + } + + /** + * Returns the output array. + * + * @since 4.7.0 + * + * @return array The output array. + */ + public function get_output() { + return $this->output; + } + + /** + * Filters the list, based on a set of key => value arguments. + * + * @since 4.7.0 + * + * @param array $args Optional. An array of key => value arguments to match + * against each object. Default empty array. + * @param string $operator Optional. The logical operation to perform. 'AND' means + * all elements from the array must match. 'OR' means only + * one element needs to match. 'NOT' means no elements may + * match. Default 'AND'. + * @return array Array of found values. + */ + public function filter( $args = array(), $operator = 'AND' ) { + if ( empty( $args ) ) { + return $this->output; + } + + $operator = strtoupper( $operator ); + + if ( ! in_array( $operator, array( 'AND', 'OR', 'NOT' ), true ) ) { + return array(); + } + + $count = count( $args ); + $filtered = array(); + + foreach ( $this->output as $key => $obj ) { + $to_match = (array) $obj; + + $matched = 0; + foreach ( $args as $m_key => $m_value ) { + if ( array_key_exists( $m_key, $to_match ) && $m_value == $to_match[ $m_key ] ) { + $matched++; + } + } + + if ( + ( 'AND' == $operator && $matched == $count ) || + ( 'OR' == $operator && $matched > 0 ) || + ( 'NOT' == $operator && 0 == $matched ) + ) { + $filtered[ $key ] = $obj; + } + } + + $this->output = $filtered; + + return $this->output; + } + + /** + * Plucks a certain field out of each object in the list. + * + * This has the same functionality and prototype of + * array_column() (PHP 5.5) but also supports objects. + * + * @since 4.7.0 + * + * @param int|string $field Field from the object to place instead of the entire object + * @param int|string $index_key Optional. Field from the object to use as keys for the new array. + * Default null. + * @return array Array of found values. If `$index_key` is set, an array of found values with keys + * corresponding to `$index_key`. If `$index_key` is null, array keys from the original + * `$list` will be preserved in the results. + */ + public function pluck( $field, $index_key = null ) { + $newlist = array(); + + if ( ! $index_key ) { + /* + * This is simple. Could at some point wrap array_column() + * if we knew we had an array of arrays. + */ + foreach ( $this->output as $key => $value ) { + if ( is_object( $value ) ) { + $newlist[ $key ] = $value->$field; + } else { + $newlist[ $key ] = $value[ $field ]; + } + } + + $this->output = $newlist; + + return $this->output; + } + + /* + * When index_key is not set for a particular item, push the value + * to the end of the stack. This is how array_column() behaves. + */ + foreach ( $this->output as $value ) { + if ( is_object( $value ) ) { + if ( isset( $value->$index_key ) ) { + $newlist[ $value->$index_key ] = $value->$field; + } else { + $newlist[] = $value->$field; + } + } else { + if ( isset( $value[ $index_key ] ) ) { + $newlist[ $value[ $index_key ] ] = $value[ $field ]; + } else { + $newlist[] = $value[ $field ]; + } + } + } + + $this->output = $newlist; + + return $this->output; + } + + /** + * Sorts the list, based on one or more orderby arguments. + * + * @since 4.7.0 + * + * @param string|array $orderby Optional. Either the field name to order by or an array + * of multiple orderby fields as $orderby => $order. + * @param string $order Optional. Either 'ASC' or 'DESC'. Only used if $orderby + * is a string. + * @param bool $preserve_keys Optional. Whether to preserve keys. Default false. + * @return array The sorted array. + */ + public function sort( $orderby = array(), $order = 'ASC', $preserve_keys = false ) { + if ( empty( $orderby ) ) { + return $this->output; + } + + if ( is_string( $orderby ) ) { + $orderby = array( $orderby => $order ); + } + + foreach ( $orderby as $field => $direction ) { + $orderby[ $field ] = 'DESC' === strtoupper( $direction ) ? 'DESC' : 'ASC'; + } + + $this->orderby = $orderby; + + if ( $preserve_keys ) { + uasort( $this->output, array( $this, 'sort_callback' ) ); + } else { + usort( $this->output, array( $this, 'sort_callback' ) ); + } + + $this->orderby = array(); + + return $this->output; + } + + /** + * Callback to sort the list by specific fields. + * + * @since 4.7.0 + * + * @see WP_List_Util::sort() + * + * @param object|array $a One object to compare. + * @param object|array $b The other object to compare. + * @return int 0 if both objects equal. -1 if second object should come first, 1 otherwise. + */ + private function sort_callback( $a, $b ) { + if ( empty( $this->orderby ) ) { + return 0; + } + + $a = (array) $a; + $b = (array) $b; + + foreach ( $this->orderby as $field => $direction ) { + if ( ! isset( $a[ $field ] ) || ! isset( $b[ $field ] ) ) { + continue; + } + + if ( $a[ $field ] == $b[ $field ] ) { + continue; + } + + $results = 'DESC' === $direction ? array( 1, -1 ) : array( -1, 1 ); + + if ( is_numeric( $a[ $field ] ) && is_numeric( $b[ $field ] ) ) { + return ( $a[ $field ] < $b[ $field ] ) ? $results[0] : $results[1]; + } + + return 0 > strcmp( $a[ $field ], $b[ $field ] ) ? $results[0] : $results[1]; + } + + return 0; + } +} diff --git a/wp-includes/class-wp-locale-switcher.php b/wp-includes/class-wp-locale-switcher.php new file mode 100644 index 0000000..7ec7622 --- /dev/null +++ b/wp-includes/class-wp-locale-switcher.php @@ -0,0 +1,237 @@ +<?php +/** + * Locale API: WP_Locale_Switcher class + * + * @package WordPress + * @subpackage i18n + * @since 4.7.0 + */ + +/** + * Core class used for switching locales. + * + * @since 4.7.0 + */ +class WP_Locale_Switcher { + /** + * Locale stack. + * + * @since 4.7.0 + * @var string[] + */ + private $locales = array(); + + /** + * Original locale. + * + * @since 4.7.0 + * @var string + */ + private $original_locale; + + /** + * Holds all available languages. + * + * @since 4.7.0 + * @var array An array of language codes (file names without the .mo extension). + */ + private $available_languages = array(); + + /** + * Constructor. + * + * Stores the original locale as well as a list of all available languages. + * + * @since 4.7.0 + */ + public function __construct() { + $this->original_locale = determine_locale(); + $this->available_languages = array_merge( array( 'en_US' ), get_available_languages() ); + } + + /** + * Initializes the locale switcher. + * + * Hooks into the {@see 'locale'} filter to change the locale on the fly. + * + * @since 4.7.0 + */ + public function init() { + add_filter( 'locale', array( $this, 'filter_locale' ) ); + } + + /** + * Switches the translations according to the given locale. + * + * @since 4.7.0 + * + * @param string $locale The locale to switch to. + * @return bool True on success, false on failure. + */ + public function switch_to_locale( $locale ) { + $current_locale = determine_locale(); + if ( $current_locale === $locale ) { + return false; + } + + if ( ! in_array( $locale, $this->available_languages, true ) ) { + return false; + } + + $this->locales[] = $locale; + + $this->change_locale( $locale ); + + /** + * Fires when the locale is switched. + * + * @since 4.7.0 + * + * @param string $locale The new locale. + */ + do_action( 'switch_locale', $locale ); + + return true; + } + + /** + * Restores the translations according to the previous locale. + * + * @since 4.7.0 + * + * @return string|false Locale on success, false on failure. + */ + public function restore_previous_locale() { + $previous_locale = array_pop( $this->locales ); + + if ( null === $previous_locale ) { + // The stack is empty, bail. + return false; + } + + $locale = end( $this->locales ); + + if ( ! $locale ) { + // There's nothing left in the stack: go back to the original locale. + $locale = $this->original_locale; + } + + $this->change_locale( $locale ); + + /** + * Fires when the locale is restored to the previous one. + * + * @since 4.7.0 + * + * @param string $locale The new locale. + * @param string $previous_locale The previous locale. + */ + do_action( 'restore_previous_locale', $locale, $previous_locale ); + + return $locale; + } + + /** + * Restores the translations according to the original locale. + * + * @since 4.7.0 + * + * @return string|false Locale on success, false on failure. + */ + public function restore_current_locale() { + if ( empty( $this->locales ) ) { + return false; + } + + $this->locales = array( $this->original_locale ); + + return $this->restore_previous_locale(); + } + + /** + * Whether switch_to_locale() is in effect. + * + * @since 4.7.0 + * + * @return bool True if the locale has been switched, false otherwise. + */ + public function is_switched() { + return ! empty( $this->locales ); + } + + /** + * Filters the locale of the WordPress installation. + * + * @since 4.7.0 + * + * @param string $locale The locale of the WordPress installation. + * @return string The locale currently being switched to. + */ + public function filter_locale( $locale ) { + $switched_locale = end( $this->locales ); + + if ( $switched_locale ) { + return $switched_locale; + } + + return $locale; + } + + /** + * Load translations for a given locale. + * + * When switching to a locale, translations for this locale must be loaded from scratch. + * + * @since 4.7.0 + * + * @global Mo[] $l10n An array of all currently loaded text domains. + * + * @param string $locale The locale to load translations for. + */ + private function load_translations( $locale ) { + global $l10n; + + $domains = $l10n ? array_keys( $l10n ) : array(); + + load_default_textdomain( $locale ); + + foreach ( $domains as $domain ) { + if ( 'default' === $domain ) { + continue; + } + + unload_textdomain( $domain ); + get_translations_for_domain( $domain ); + } + } + + /** + * Changes the site's locale to the given one. + * + * Loads the translations, changes the global `$wp_locale` object and updates + * all post type labels. + * + * @since 4.7.0 + * + * @global WP_Locale $wp_locale WordPress date and time locale object. + * + * @param string $locale The locale to change to. + */ + private function change_locale( $locale ) { + // Reset translation availability information. + _get_path_to_translation( null, true ); + + $this->load_translations( $locale ); + + $GLOBALS['wp_locale'] = new WP_Locale(); + + /** + * Fires when the locale is switched to or restored. + * + * @since 4.7.0 + * + * @param string $locale The new locale. + */ + do_action( 'change_locale', $locale ); + } +} diff --git a/wp-includes/class-wp-locale.php b/wp-includes/class-wp-locale.php new file mode 100644 index 0000000..de37457 --- /dev/null +++ b/wp-includes/class-wp-locale.php @@ -0,0 +1,369 @@ +<?php +/** + * Locale API: WP_Locale class + * + * @package WordPress + * @subpackage i18n + * @since 4.6.0 + */ + +/** + * Core class used to store translated data for a locale. + * + * @since 2.1.0 + * @since 4.6.0 Moved to its own file from wp-includes/locale.php. + */ +class WP_Locale { + /** + * Stores the translated strings for the full weekday names. + * + * @since 2.1.0 + * @var array + */ + public $weekday; + + /** + * Stores the translated strings for the one character weekday names. + * + * There is a hack to make sure that Tuesday and Thursday, as well + * as Sunday and Saturday, don't conflict. See init() method for more. + * + * @see WP_Locale::init() for how to handle the hack. + * + * @since 2.1.0 + * @var array + */ + public $weekday_initial; + + /** + * Stores the translated strings for the abbreviated weekday names. + * + * @since 2.1.0 + * @var array + */ + public $weekday_abbrev; + + /** + * Stores the translated strings for the full month names. + * + * @since 2.1.0 + * @var array + */ + public $month; + + /** + * Stores the translated strings for the month names in genitive case, if the locale specifies. + * + * @since 4.4.0 + * @var array + */ + public $month_genitive; + + /** + * Stores the translated strings for the abbreviated month names. + * + * @since 2.1.0 + * @var array + */ + public $month_abbrev; + + /** + * Stores the translated strings for 'am' and 'pm'. + * + * Also the capitalized versions. + * + * @since 2.1.0 + * @var array + */ + public $meridiem; + + /** + * The text direction of the locale language. + * + * Default is left to right 'ltr'. + * + * @since 2.1.0 + * @var string + */ + public $text_direction = 'ltr'; + + /** + * The thousands separator and decimal point values used for localizing numbers. + * + * @since 2.3.0 + * @var array + */ + public $number_format; + + /** + * Constructor which calls helper methods to set up object variables. + * + * @since 2.1.0 + */ + public function __construct() { + $this->init(); + $this->register_globals(); + } + + /** + * Sets up the translated strings and object properties. + * + * The method creates the translatable strings for various + * calendar elements. Which allows for specifying locale + * specific calendar names and text direction. + * + * @since 2.1.0 + * + * @global string $text_direction + * @global string $wp_version The WordPress version string. + */ + public function init() { + // The weekdays. + $this->weekday[0] = /* translators: Weekday. */ __( 'Sunday' ); + $this->weekday[1] = /* translators: Weekday. */ __( 'Monday' ); + $this->weekday[2] = /* translators: Weekday. */ __( 'Tuesday' ); + $this->weekday[3] = /* translators: Weekday. */ __( 'Wednesday' ); + $this->weekday[4] = /* translators: Weekday. */ __( 'Thursday' ); + $this->weekday[5] = /* translators: Weekday. */ __( 'Friday' ); + $this->weekday[6] = /* translators: Weekday. */ __( 'Saturday' ); + + // The first letter of each day. + $this->weekday_initial[ __( 'Sunday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'S', 'Sunday initial' ); + $this->weekday_initial[ __( 'Monday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'M', 'Monday initial' ); + $this->weekday_initial[ __( 'Tuesday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'T', 'Tuesday initial' ); + $this->weekday_initial[ __( 'Wednesday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'W', 'Wednesday initial' ); + $this->weekday_initial[ __( 'Thursday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'T', 'Thursday initial' ); + $this->weekday_initial[ __( 'Friday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'F', 'Friday initial' ); + $this->weekday_initial[ __( 'Saturday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'S', 'Saturday initial' ); + + // Abbreviations for each day. + $this->weekday_abbrev[ __( 'Sunday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Sun' ); + $this->weekday_abbrev[ __( 'Monday' ) ] = /* translators: Ttree-letter abbreviation of the weekday. */ __( 'Mon' ); + $this->weekday_abbrev[ __( 'Tuesday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Tue' ); + $this->weekday_abbrev[ __( 'Wednesday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Wed' ); + $this->weekday_abbrev[ __( 'Thursday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Thu' ); + $this->weekday_abbrev[ __( 'Friday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Fri' ); + $this->weekday_abbrev[ __( 'Saturday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Sat' ); + + // The months. + $this->month['01'] = /* translators: Month name. */ __( 'January' ); + $this->month['02'] = /* translators: Month name. */ __( 'February' ); + $this->month['03'] = /* translators: Month name. */ __( 'March' ); + $this->month['04'] = /* translators: Month name. */ __( 'April' ); + $this->month['05'] = /* translators: Month name. */ __( 'May' ); + $this->month['06'] = /* translators: Month name. */ __( 'June' ); + $this->month['07'] = /* translators: Month name. */ __( 'July' ); + $this->month['08'] = /* translators: Month name. */ __( 'August' ); + $this->month['09'] = /* translators: Month name. */ __( 'September' ); + $this->month['10'] = /* translators: Month name. */ __( 'October' ); + $this->month['11'] = /* translators: Month name. */ __( 'November' ); + $this->month['12'] = /* translators: Month name. */ __( 'December' ); + + // The months, genitive. + $this->month_genitive['01'] = /* translators: Month name, genitive. */ _x( 'January', 'genitive' ); + $this->month_genitive['02'] = /* translators: Month name, genitive. */ _x( 'February', 'genitive' ); + $this->month_genitive['03'] = /* translators: Month name, genitive. */ _x( 'March', 'genitive' ); + $this->month_genitive['04'] = /* translators: Month name, genitive. */ _x( 'April', 'genitive' ); + $this->month_genitive['05'] = /* translators: Month name, genitive. */ _x( 'May', 'genitive' ); + $this->month_genitive['06'] = /* translators: Month name, genitive. */ _x( 'June', 'genitive' ); + $this->month_genitive['07'] = /* translators: Month name, genitive. */ _x( 'July', 'genitive' ); + $this->month_genitive['08'] = /* translators: Month name, genitive. */ _x( 'August', 'genitive' ); + $this->month_genitive['09'] = /* translators: Month name, genitive. */ _x( 'September', 'genitive' ); + $this->month_genitive['10'] = /* translators: Month name, genitive. */ _x( 'October', 'genitive' ); + $this->month_genitive['11'] = /* translators: Month name, genitive. */ _x( 'November', 'genitive' ); + $this->month_genitive['12'] = /* translators: Month name, genitive. */ _x( 'December', 'genitive' ); + + // Abbreviations for each month. + $this->month_abbrev[ __( 'January' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Jan', 'January abbreviation' ); + $this->month_abbrev[ __( 'February' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Feb', 'February abbreviation' ); + $this->month_abbrev[ __( 'March' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Mar', 'March abbreviation' ); + $this->month_abbrev[ __( 'April' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Apr', 'April abbreviation' ); + $this->month_abbrev[ __( 'May' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'May', 'May abbreviation' ); + $this->month_abbrev[ __( 'June' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Jun', 'June abbreviation' ); + $this->month_abbrev[ __( 'July' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Jul', 'July abbreviation' ); + $this->month_abbrev[ __( 'August' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Aug', 'August abbreviation' ); + $this->month_abbrev[ __( 'September' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Sep', 'September abbreviation' ); + $this->month_abbrev[ __( 'October' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Oct', 'October abbreviation' ); + $this->month_abbrev[ __( 'November' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Nov', 'November abbreviation' ); + $this->month_abbrev[ __( 'December' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Dec', 'December abbreviation' ); + + // The meridiems. + $this->meridiem['am'] = __( 'am' ); + $this->meridiem['pm'] = __( 'pm' ); + $this->meridiem['AM'] = __( 'AM' ); + $this->meridiem['PM'] = __( 'PM' ); + + // Numbers formatting. + // See https://www.php.net/number_format + + /* translators: $thousands_sep argument for https://www.php.net/number_format, default is ',' */ + $thousands_sep = __( 'number_format_thousands_sep' ); + + // Replace space with a non-breaking space to avoid wrapping. + $thousands_sep = str_replace( ' ', ' ', $thousands_sep ); + + $this->number_format['thousands_sep'] = ( 'number_format_thousands_sep' === $thousands_sep ) ? ',' : $thousands_sep; + + /* translators: $dec_point argument for https://www.php.net/number_format, default is '.' */ + $decimal_point = __( 'number_format_decimal_point' ); + + $this->number_format['decimal_point'] = ( 'number_format_decimal_point' === $decimal_point ) ? '.' : $decimal_point; + + // Set text direction. + if ( isset( $GLOBALS['text_direction'] ) ) { + $this->text_direction = $GLOBALS['text_direction']; + + /* translators: 'rtl' or 'ltr'. This sets the text direction for WordPress. */ + } elseif ( 'rtl' == _x( 'ltr', 'text direction' ) ) { + $this->text_direction = 'rtl'; + } + } + + /** + * Retrieve the full translated weekday word. + * + * Week starts on translated Sunday and can be fetched + * by using 0 (zero). So the week starts with 0 (zero) + * and ends on Saturday with is fetched by using 6 (six). + * + * @since 2.1.0 + * + * @param int $weekday_number 0 for Sunday through 6 Saturday. + * @return string Full translated weekday. + */ + public function get_weekday( $weekday_number ) { + return $this->weekday[ $weekday_number ]; + } + + /** + * Retrieve the translated weekday initial. + * + * The weekday initial is retrieved by the translated + * full weekday word. When translating the weekday initial + * pay attention to make sure that the starting letter does + * not conflict. + * + * @since 2.1.0 + * + * @param string $weekday_name Full translated weekday word. + * @return string Translated weekday initial. + */ + public function get_weekday_initial( $weekday_name ) { + return $this->weekday_initial[ $weekday_name ]; + } + + /** + * Retrieve the translated weekday abbreviation. + * + * The weekday abbreviation is retrieved by the translated + * full weekday word. + * + * @since 2.1.0 + * + * @param string $weekday_name Full translated weekday word. + * @return string Translated weekday abbreviation. + */ + public function get_weekday_abbrev( $weekday_name ) { + return $this->weekday_abbrev[ $weekday_name ]; + } + + /** + * Retrieve the full translated month by month number. + * + * The $month_number parameter has to be a string + * because it must have the '0' in front of any number + * that is less than 10. Starts from '01' and ends at + * '12'. + * + * You can use an integer instead and it will add the + * '0' before the numbers less than 10 for you. + * + * @since 2.1.0 + * + * @param string|int $month_number '01' through '12'. + * @return string Translated full month name. + */ + public function get_month( $month_number ) { + return $this->month[ zeroise( $month_number, 2 ) ]; + } + + /** + * Retrieve translated version of month abbreviation string. + * + * The $month_name parameter is expected to be the translated or + * translatable version of the month. + * + * @since 2.1.0 + * + * @param string $month_name Translated month to get abbreviated version. + * @return string Translated abbreviated month. + */ + public function get_month_abbrev( $month_name ) { + return $this->month_abbrev[ $month_name ]; + } + + /** + * Retrieve translated version of meridiem string. + * + * The $meridiem parameter is expected to not be translated. + * + * @since 2.1.0 + * + * @param string $meridiem Either 'am', 'pm', 'AM', or 'PM'. Not translated version. + * @return string Translated version + */ + public function get_meridiem( $meridiem ) { + return $this->meridiem[ $meridiem ]; + } + + /** + * Global variables are deprecated. + * + * For backward compatibility only. + * + * @deprecated For backward compatibility only. + * + * @global array $weekday + * @global array $weekday_initial + * @global array $weekday_abbrev + * @global array $month + * @global array $month_abbrev + * + * @since 2.1.0 + */ + public function register_globals() { + $GLOBALS['weekday'] = $this->weekday; + $GLOBALS['weekday_initial'] = $this->weekday_initial; + $GLOBALS['weekday_abbrev'] = $this->weekday_abbrev; + $GLOBALS['month'] = $this->month; + $GLOBALS['month_abbrev'] = $this->month_abbrev; + } + + /** + * Checks if current locale is RTL. + * + * @since 3.0.0 + * @return bool Whether locale is RTL. + */ + public function is_rtl() { + return 'rtl' == $this->text_direction; + } + + /** + * Register date/time format strings for general POT. + * + * Private, unused method to add some date/time formats translated + * on wp-admin/options-general.php to the general POT that would + * otherwise be added to the admin POT. + * + * @since 3.6.0 + */ + public function _strings_for_pot() { + /* translators: Localized date format, see https://www.php.net/date */ + __( 'F j, Y' ); + /* translators: Localized time format, see https://www.php.net/date */ + __( 'g:i a' ); + /* translators: Localized date and time format, see https://www.php.net/date */ + __( 'F j, Y g:i a' ); + } +} diff --git a/wp-includes/class-wp-matchesmapregex.php b/wp-includes/class-wp-matchesmapregex.php new file mode 100644 index 0000000..7145c48 --- /dev/null +++ b/wp-includes/class-wp-matchesmapregex.php @@ -0,0 +1,89 @@ +<?php +/** + * WP_MatchesMapRegex helper class + * + * @package WordPress + * @since 4.7.0 + */ + +/** + * Helper class to remove the need to use eval to replace $matches[] in query strings. + * + * @since 2.9.0 + */ +class WP_MatchesMapRegex { + /** + * store for matches + * + * @var array + */ + private $_matches; + + /** + * store for mapping result + * + * @var string + */ + public $output; + + /** + * subject to perform mapping on (query string containing $matches[] references + * + * @var string + */ + private $_subject; + + /** + * regexp pattern to match $matches[] references + * + * @var string + */ + public $_pattern = '(\$matches\[[1-9]+[0-9]*\])'; // Magic number. + + /** + * constructor + * + * @param string $subject subject if regex + * @param array $matches data to use in map + */ + public function __construct( $subject, $matches ) { + $this->_subject = $subject; + $this->_matches = $matches; + $this->output = $this->_map(); + } + + /** + * Substitute substring matches in subject. + * + * static helper function to ease use + * + * @param string $subject subject + * @param array $matches data used for substitution + * @return string + */ + public static function apply( $subject, $matches ) { + $oSelf = new WP_MatchesMapRegex( $subject, $matches ); + return $oSelf->output; + } + + /** + * do the actual mapping + * + * @return string + */ + private function _map() { + $callback = array( $this, 'callback' ); + return preg_replace_callback( $this->_pattern, $callback, $this->_subject ); + } + + /** + * preg_replace_callback hook + * + * @param array $matches preg_replace regexp matches + * @return string + */ + public function callback( $matches ) { + $index = intval( substr( $matches[0], 9, -1 ) ); + return ( isset( $this->_matches[ $index ] ) ? urlencode( $this->_matches[ $index ] ) : '' ); + } +} diff --git a/wp-includes/class-wp-meta-query.php b/wp-includes/class-wp-meta-query.php new file mode 100644 index 0000000..ebe0377 --- /dev/null +++ b/wp-includes/class-wp-meta-query.php @@ -0,0 +1,847 @@ +<?php +/** + * Meta API: WP_Meta_Query class + * + * @package WordPress + * @subpackage Meta + * @since 4.4.0 + */ + +/** + * Core class used to implement meta queries for the Meta API. + * + * Used for generating SQL clauses that filter a primary query according to metadata keys and values. + * + * WP_Meta_Query is a helper that allows primary query classes, such as WP_Query and WP_User_Query, + * + * to filter their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be attached + * to the primary SQL query string. + * + * @since 3.2.0 + */ +class WP_Meta_Query { + /** + * Array of metadata queries. + * + * See WP_Meta_Query::__construct() for information on meta query arguments. + * + * @since 3.2.0 + * @var array + */ + public $queries = array(); + + /** + * The relation between the queries. Can be one of 'AND' or 'OR'. + * + * @since 3.2.0 + * @var string + */ + public $relation; + + /** + * Database table to query for the metadata. + * + * @since 4.1.0 + * @var string + */ + public $meta_table; + + /** + * Column in meta_table that represents the ID of the object the metadata belongs to. + * + * @since 4.1.0 + * @var string + */ + public $meta_id_column; + + /** + * Database table that where the metadata's objects are stored (eg $wpdb->users). + * + * @since 4.1.0 + * @var string + */ + public $primary_table; + + /** + * Column in primary_table that represents the ID of the object. + * + * @since 4.1.0 + * @var string + */ + public $primary_id_column; + + /** + * A flat list of table aliases used in JOIN clauses. + * + * @since 4.1.0 + * @var array + */ + protected $table_aliases = array(); + + /** + * A flat list of clauses, keyed by clause 'name'. + * + * @since 4.2.0 + * @var array + */ + protected $clauses = array(); + + /** + * Whether the query contains any OR relations. + * + * @since 4.3.0 + * @var bool + */ + protected $has_or_relation = false; + + /** + * Constructor. + * + * @since 3.2.0 + * @since 4.2.0 Introduced support for naming query clauses by associative array keys. + * @since 5.1.0 Introduced $compare_key clause parameter, which enables LIKE key matches. + * @since 5.3.0 Increased the number of operators available to $compare_key. Introduced $type_key, + * which enables the $key to be cast to a new data type for comparisons. + * + * @param array $meta_query { + * Array of meta query clauses. When first-order clauses or sub-clauses use strings as + * their array keys, they may be referenced in the 'orderby' parameter of the parent query. + * + * @type string $relation Optional. The MySQL keyword used to join + * the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'. + * @type array { + * Optional. An array of first-order clause parameters, or another fully-formed meta query. + * + * @type string $key Meta key to filter by. + * @type string $compare_key MySQL operator used for comparing the $key. Accepts '=', '!=' + * 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'REGEXP', 'NOT REGEXP', 'RLIKE', + * 'EXISTS' (alias of '=') or 'NOT EXISTS' (alias of '!='). + * Default is 'IN' when `$key` is an array, '=' otherwise. + * @type string $type_key MySQL data type that the meta_key column will be CAST to for + * comparisons. Accepts 'BINARY' for case-sensitive regular expression + * comparisons. Default is ''. + * @type string $value Meta value to filter by. + * @type string $compare MySQL operator used for comparing the $value. Accepts '=', + * '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', + * 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'REGEXP', + * 'NOT REGEXP', 'RLIKE', 'EXISTS' or 'NOT EXISTS'. + * Default is 'IN' when `$value` is an array, '=' otherwise. + * @type string $type MySQL data type that the meta_value column will be CAST to for + * comparisons. Accepts 'NUMERIC', 'BINARY', 'CHAR', 'DATE', + * 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', or 'UNSIGNED'. + * Default is 'CHAR'. + * } + * } + */ + public function __construct( $meta_query = false ) { + if ( ! $meta_query ) { + return; + } + + if ( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) { + $this->relation = 'OR'; + } else { + $this->relation = 'AND'; + } + + $this->queries = $this->sanitize_query( $meta_query ); + } + + /** + * Ensure the 'meta_query' argument passed to the class constructor is well-formed. + * + * Eliminates empty items and ensures that a 'relation' is set. + * + * @since 4.1.0 + * + * @param array $queries Array of query clauses. + * @return array Sanitized array of query clauses. + */ + public function sanitize_query( $queries ) { + $clean_queries = array(); + + if ( ! is_array( $queries ) ) { + return $clean_queries; + } + + foreach ( $queries as $key => $query ) { + if ( 'relation' === $key ) { + $relation = $query; + + } elseif ( ! is_array( $query ) ) { + continue; + + // First-order clause. + } elseif ( $this->is_first_order_clause( $query ) ) { + if ( isset( $query['value'] ) && array() === $query['value'] ) { + unset( $query['value'] ); + } + + $clean_queries[ $key ] = $query; + + // Otherwise, it's a nested query, so we recurse. + } else { + $cleaned_query = $this->sanitize_query( $query ); + + if ( ! empty( $cleaned_query ) ) { + $clean_queries[ $key ] = $cleaned_query; + } + } + } + + if ( empty( $clean_queries ) ) { + return $clean_queries; + } + + // Sanitize the 'relation' key provided in the query. + if ( isset( $relation ) && 'OR' === strtoupper( $relation ) ) { + $clean_queries['relation'] = 'OR'; + $this->has_or_relation = true; + + /* + * If there is only a single clause, call the relation 'OR'. + * This value will not actually be used to join clauses, but it + * simplifies the logic around combining key-only queries. + */ + } elseif ( 1 === count( $clean_queries ) ) { + $clean_queries['relation'] = 'OR'; + + // Default to AND. + } else { + $clean_queries['relation'] = 'AND'; + } + + return $clean_queries; + } + + /** + * Determine whether a query clause is first-order. + * + * A first-order meta query clause is one that has either a 'key' or + * a 'value' array key. + * + * @since 4.1.0 + * + * @param array $query Meta query arguments. + * @return bool Whether the query clause is a first-order clause. + */ + protected function is_first_order_clause( $query ) { + return isset( $query['key'] ) || isset( $query['value'] ); + } + + /** + * Constructs a meta query based on 'meta_*' query vars + * + * @since 3.2.0 + * + * @param array $qv The query variables + */ + public function parse_query_vars( $qv ) { + $meta_query = array(); + + /* + * For orderby=meta_value to work correctly, simple query needs to be + * first (so that its table join is against an unaliased meta table) and + * needs to be its own clause (so it doesn't interfere with the logic of + * the rest of the meta_query). + */ + $primary_meta_query = array(); + foreach ( array( 'key', 'compare', 'type', 'compare_key', 'type_key' ) as $key ) { + if ( ! empty( $qv[ "meta_$key" ] ) ) { + $primary_meta_query[ $key ] = $qv[ "meta_$key" ]; + } + } + + // WP_Query sets 'meta_value' = '' by default. + if ( isset( $qv['meta_value'] ) && '' !== $qv['meta_value'] && ( ! is_array( $qv['meta_value'] ) || $qv['meta_value'] ) ) { + $primary_meta_query['value'] = $qv['meta_value']; + } + + $existing_meta_query = isset( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ? $qv['meta_query'] : array(); + + if ( ! empty( $primary_meta_query ) && ! empty( $existing_meta_query ) ) { + $meta_query = array( + 'relation' => 'AND', + $primary_meta_query, + $existing_meta_query, + ); + } elseif ( ! empty( $primary_meta_query ) ) { + $meta_query = array( + $primary_meta_query, + ); + } elseif ( ! empty( $existing_meta_query ) ) { + $meta_query = $existing_meta_query; + } + + $this->__construct( $meta_query ); + } + + /** + * Return the appropriate alias for the given meta type if applicable. + * + * @since 3.7.0 + * + * @param string $type MySQL type to cast meta_value. + * @return string MySQL type. + */ + public function get_cast_for_type( $type = '' ) { + if ( empty( $type ) ) { + return 'CHAR'; + } + + $meta_type = strtoupper( $type ); + + if ( ! preg_match( '/^(?:BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|NUMERIC(?:\(\d+(?:,\s?\d+)?\))?|DECIMAL(?:\(\d+(?:,\s?\d+)?\))?)$/', $meta_type ) ) { + return 'CHAR'; + } + + if ( 'NUMERIC' == $meta_type ) { + $meta_type = 'SIGNED'; + } + + return $meta_type; + } + + /** + * Generates SQL clauses to be appended to a main query. + * + * @since 3.2.0 + * + * @param string $type Type of meta, eg 'user', 'post'. + * @param string $primary_table Database table where the object being filtered is stored (eg wp_users). + * @param string $primary_id_column ID column for the filtered object in $primary_table. + * @param object $context Optional. The main query object. + * @return array|false { + * Array containing JOIN and WHERE SQL clauses to append to the main query. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + public function get_sql( $type, $primary_table, $primary_id_column, $context = null ) { + $meta_table = _get_meta_table( $type ); + if ( ! $meta_table ) { + return false; + } + + $this->table_aliases = array(); + + $this->meta_table = $meta_table; + $this->meta_id_column = sanitize_key( $type . '_id' ); + + $this->primary_table = $primary_table; + $this->primary_id_column = $primary_id_column; + + $sql = $this->get_sql_clauses(); + + /* + * If any JOINs are LEFT JOINs (as in the case of NOT EXISTS), then all JOINs should + * be LEFT. Otherwise posts with no metadata will be excluded from results. + */ + if ( false !== strpos( $sql['join'], 'LEFT JOIN' ) ) { + $sql['join'] = str_replace( 'INNER JOIN', 'LEFT JOIN', $sql['join'] ); + } + + /** + * Filters the meta query's generated SQL. + * + * @since 3.1.0 + * + * @param array $sql Array containing the query's JOIN and WHERE clauses. + * @param array $queries Array of meta queries. + * @param string $type Type of meta. + * @param string $primary_table Primary table. + * @param string $primary_id_column Primary column ID. + * @param object $context The main query object. + */ + return apply_filters_ref_array( 'get_meta_sql', array( $sql, $this->queries, $type, $primary_table, $primary_id_column, $context ) ); + } + + /** + * Generate SQL clauses to be appended to a main query. + * + * Called by the public WP_Meta_Query::get_sql(), this method is abstracted + * out to maintain parity with the other Query classes. + * + * @since 4.1.0 + * + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to the main query. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + protected function get_sql_clauses() { + /* + * $queries are passed by reference to get_sql_for_query() for recursion. + * To keep $this->queries unaltered, pass a copy. + */ + $queries = $this->queries; + $sql = $this->get_sql_for_query( $queries ); + + if ( ! empty( $sql['where'] ) ) { + $sql['where'] = ' AND ' . $sql['where']; + } + + return $sql; + } + + /** + * Generate SQL clauses for a single query array. + * + * If nested subqueries are found, this method recurses the tree to + * produce the properly nested SQL. + * + * @since 4.1.0 + * + * @param array $query Query to parse (passed by reference). + * @param int $depth Optional. Number of tree levels deep we currently are. + * Used to calculate indentation. Default 0. + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to a single query array. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + protected function get_sql_for_query( &$query, $depth = 0 ) { + $sql_chunks = array( + 'join' => array(), + 'where' => array(), + ); + + $sql = array( + 'join' => '', + 'where' => '', + ); + + $indent = ''; + for ( $i = 0; $i < $depth; $i++ ) { + $indent .= ' '; + } + + foreach ( $query as $key => &$clause ) { + if ( 'relation' === $key ) { + $relation = $query['relation']; + } elseif ( is_array( $clause ) ) { + + // This is a first-order clause. + if ( $this->is_first_order_clause( $clause ) ) { + $clause_sql = $this->get_sql_for_clause( $clause, $query, $key ); + + $where_count = count( $clause_sql['where'] ); + if ( ! $where_count ) { + $sql_chunks['where'][] = ''; + } elseif ( 1 === $where_count ) { + $sql_chunks['where'][] = $clause_sql['where'][0]; + } else { + $sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )'; + } + + $sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] ); + // This is a subquery, so we recurse. + } else { + $clause_sql = $this->get_sql_for_query( $clause, $depth + 1 ); + + $sql_chunks['where'][] = $clause_sql['where']; + $sql_chunks['join'][] = $clause_sql['join']; + } + } + } + + // Filter to remove empties. + $sql_chunks['join'] = array_filter( $sql_chunks['join'] ); + $sql_chunks['where'] = array_filter( $sql_chunks['where'] ); + + if ( empty( $relation ) ) { + $relation = 'AND'; + } + + // Filter duplicate JOIN clauses and combine into a single string. + if ( ! empty( $sql_chunks['join'] ) ) { + $sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) ); + } + + // Generate a single WHERE clause with proper brackets and indentation. + if ( ! empty( $sql_chunks['where'] ) ) { + $sql['where'] = '( ' . "\n " . $indent . implode( ' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')'; + } + + return $sql; + } + + /** + * Generate SQL JOIN and WHERE clauses for a first-order query clause. + * + * "First-order" means that it's an array with a 'key' or 'value'. + * + * @since 4.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $clause Query clause (passed by reference). + * @param array $parent_query Parent query array. + * @param string $clause_key Optional. The array key used to name the clause in the original `$meta_query` + * parameters. If not provided, a key will be generated automatically. + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to a first-order query. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + public function get_sql_for_clause( &$clause, $parent_query, $clause_key = '' ) { + global $wpdb; + + $sql_chunks = array( + 'where' => array(), + 'join' => array(), + ); + + if ( isset( $clause['compare'] ) ) { + $clause['compare'] = strtoupper( $clause['compare'] ); + } else { + $clause['compare'] = isset( $clause['value'] ) && is_array( $clause['value'] ) ? 'IN' : '='; + } + + $non_numeric_operators = array( + '=', + '!=', + 'LIKE', + 'NOT LIKE', + 'IN', + 'NOT IN', + 'EXISTS', + 'NOT EXISTS', + 'RLIKE', + 'REGEXP', + 'NOT REGEXP', + ); + + $numeric_operators = array( + '>', + '>=', + '<', + '<=', + 'BETWEEN', + 'NOT BETWEEN', + ); + + if ( ! in_array( $clause['compare'], $non_numeric_operators, true ) && ! in_array( $clause['compare'], $numeric_operators, true ) ) { + $clause['compare'] = '='; + } + + if ( isset( $clause['compare_key'] ) ) { + $clause['compare_key'] = strtoupper( $clause['compare_key'] ); + } else { + $clause['compare_key'] = isset( $clause['key'] ) && is_array( $clause['key'] ) ? 'IN' : '='; + } + + if ( ! in_array( $clause['compare_key'], $non_numeric_operators, true ) ) { + $clause['compare_key'] = '='; + } + + $meta_compare = $clause['compare']; + $meta_compare_key = $clause['compare_key']; + + // First build the JOIN clause, if one is required. + $join = ''; + + // We prefer to avoid joins if possible. Look for an existing join compatible with this clause. + $alias = $this->find_compatible_table_alias( $clause, $parent_query ); + if ( false === $alias ) { + $i = count( $this->table_aliases ); + $alias = $i ? 'mt' . $i : $this->meta_table; + + // JOIN clauses for NOT EXISTS have their own syntax. + if ( 'NOT EXISTS' === $meta_compare ) { + $join .= " LEFT JOIN $this->meta_table"; + $join .= $i ? " AS $alias" : ''; + + if ( 'LIKE' === $meta_compare_key ) { + $join .= $wpdb->prepare( " ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key LIKE %s )", '%' . $wpdb->esc_like( $clause['key'] ) . '%' ); + } else { + $join .= $wpdb->prepare( " ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )", $clause['key'] ); + } + + // All other JOIN clauses. + } else { + $join .= " INNER JOIN $this->meta_table"; + $join .= $i ? " AS $alias" : ''; + $join .= " ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column )"; + } + + $this->table_aliases[] = $alias; + $sql_chunks['join'][] = $join; + } + + // Save the alias to this clause, for future siblings to find. + $clause['alias'] = $alias; + + // Determine the data type. + $_meta_type = isset( $clause['type'] ) ? $clause['type'] : ''; + $meta_type = $this->get_cast_for_type( $_meta_type ); + $clause['cast'] = $meta_type; + + // Fallback for clause keys is the table alias. Key must be a string. + if ( is_int( $clause_key ) || ! $clause_key ) { + $clause_key = $clause['alias']; + } + + // Ensure unique clause keys, so none are overwritten. + $iterator = 1; + $clause_key_base = $clause_key; + while ( isset( $this->clauses[ $clause_key ] ) ) { + $clause_key = $clause_key_base . '-' . $iterator; + $iterator++; + } + + // Store the clause in our flat array. + $this->clauses[ $clause_key ] =& $clause; + + // Next, build the WHERE clause. + + // meta_key. + if ( array_key_exists( 'key', $clause ) ) { + if ( 'NOT EXISTS' === $meta_compare ) { + $sql_chunks['where'][] = $alias . '.' . $this->meta_id_column . ' IS NULL'; + } else { + /** + * In joined clauses negative operators have to be nested into a + * NOT EXISTS clause and flipped, to avoid returning records with + * matching post IDs but different meta keys. Here we prepare the + * nested clause. + */ + if ( in_array( $meta_compare_key, array( '!=', 'NOT IN', 'NOT LIKE', 'NOT EXISTS', 'NOT REGEXP' ), true ) ) { + // Negative clauses may be reused. + $i = count( $this->table_aliases ); + $subquery_alias = $i ? 'mt' . $i : $this->meta_table; + $this->table_aliases[] = $subquery_alias; + + $meta_compare_string_start = 'NOT EXISTS ('; + $meta_compare_string_start .= "SELECT 1 FROM $wpdb->postmeta $subquery_alias "; + $meta_compare_string_start .= "WHERE $subquery_alias.post_ID = $alias.post_ID "; + $meta_compare_string_end = 'LIMIT 1'; + $meta_compare_string_end .= ')'; + } + + switch ( $meta_compare_key ) { + case '=': + case 'EXISTS': + $where = $wpdb->prepare( "$alias.meta_key = %s", trim( $clause['key'] ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + break; + case 'LIKE': + $meta_compare_value = '%' . $wpdb->esc_like( trim( $clause['key'] ) ) . '%'; + $where = $wpdb->prepare( "$alias.meta_key LIKE %s", $meta_compare_value ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + break; + case 'IN': + $meta_compare_string = "$alias.meta_key IN (" . substr( str_repeat( ',%s', count( $clause['key'] ) ), 1 ) . ')'; + $where = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + break; + case 'RLIKE': + case 'REGEXP': + $operator = $meta_compare_key; + if ( isset( $clause['type_key'] ) && 'BINARY' === strtoupper( $clause['type_key'] ) ) { + $cast = 'BINARY'; + } else { + $cast = ''; + } + $where = $wpdb->prepare( "$alias.meta_key $operator $cast %s", trim( $clause['key'] ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + break; + + case '!=': + case 'NOT EXISTS': + $meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key = %s " . $meta_compare_string_end; + $where = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + break; + case 'NOT LIKE': + $meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key LIKE %s " . $meta_compare_string_end; + + $meta_compare_value = '%' . $wpdb->esc_like( trim( $clause['key'] ) ) . '%'; + $where = $wpdb->prepare( $meta_compare_string, $meta_compare_value ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + break; + case 'NOT IN': + $array_subclause = '(' . substr( str_repeat( ',%s', count( $clause['key'] ) ), 1 ) . ') '; + $meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key IN " . $array_subclause . $meta_compare_string_end; + $where = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + break; + case 'NOT REGEXP': + $operator = $meta_compare_key; + if ( isset( $clause['type_key'] ) && 'BINARY' === strtoupper( $clause['type_key'] ) ) { + $cast = 'BINARY'; + } else { + $cast = ''; + } + + $meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key REGEXP $cast %s " . $meta_compare_string_end; + $where = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + break; + } + + $sql_chunks['where'][] = $where; + } + } + + // meta_value. + if ( array_key_exists( 'value', $clause ) ) { + $meta_value = $clause['value']; + + if ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) { + if ( ! is_array( $meta_value ) ) { + $meta_value = preg_split( '/[,\s]+/', $meta_value ); + } + } else { + $meta_value = trim( $meta_value ); + } + + switch ( $meta_compare ) { + case 'IN': + case 'NOT IN': + $meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')'; + $where = $wpdb->prepare( $meta_compare_string, $meta_value ); + break; + + case 'BETWEEN': + case 'NOT BETWEEN': + $where = $wpdb->prepare( '%s AND %s', $meta_value[0], $meta_value[1] ); + break; + + case 'LIKE': + case 'NOT LIKE': + $meta_value = '%' . $wpdb->esc_like( $meta_value ) . '%'; + $where = $wpdb->prepare( '%s', $meta_value ); + break; + + // EXISTS with a value is interpreted as '='. + case 'EXISTS': + $meta_compare = '='; + $where = $wpdb->prepare( '%s', $meta_value ); + break; + + // 'value' is ignored for NOT EXISTS. + case 'NOT EXISTS': + $where = ''; + break; + + default: + $where = $wpdb->prepare( '%s', $meta_value ); + break; + + } + + if ( $where ) { + if ( 'CHAR' === $meta_type ) { + $sql_chunks['where'][] = "$alias.meta_value {$meta_compare} {$where}"; + } else { + $sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}"; + } + } + } + + /* + * Multiple WHERE clauses (for meta_key and meta_value) should + * be joined in parentheses. + */ + if ( 1 < count( $sql_chunks['where'] ) ) { + $sql_chunks['where'] = array( '( ' . implode( ' AND ', $sql_chunks['where'] ) . ' )' ); + } + + return $sql_chunks; + } + + /** + * Get a flattened list of sanitized meta clauses. + * + * This array should be used for clause lookup, as when the table alias and CAST type must be determined for + * a value of 'orderby' corresponding to a meta clause. + * + * @since 4.2.0 + * + * @return array Meta clauses. + */ + public function get_clauses() { + return $this->clauses; + } + + /** + * Identify an existing table alias that is compatible with the current + * query clause. + * + * We avoid unnecessary table joins by allowing each clause to look for + * an existing table alias that is compatible with the query that it + * needs to perform. + * + * An existing alias is compatible if (a) it is a sibling of `$clause` + * (ie, it's under the scope of the same relation), and (b) the combination + * of operator and relation between the clauses allows for a shared table join. + * In the case of WP_Meta_Query, this only applies to 'IN' clauses that are + * connected by the relation 'OR'. + * + * @since 4.1.0 + * + * @param array $clause Query clause. + * @param array $parent_query Parent query of $clause. + * @return string|bool Table alias if found, otherwise false. + */ + protected function find_compatible_table_alias( $clause, $parent_query ) { + $alias = false; + + foreach ( $parent_query as $sibling ) { + // If the sibling has no alias yet, there's nothing to check. + if ( empty( $sibling['alias'] ) ) { + continue; + } + + // We're only interested in siblings that are first-order clauses. + if ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) { + continue; + } + + $compatible_compares = array(); + + // Clauses connected by OR can share joins as long as they have "positive" operators. + if ( 'OR' === $parent_query['relation'] ) { + $compatible_compares = array( '=', 'IN', 'BETWEEN', 'LIKE', 'REGEXP', 'RLIKE', '>', '>=', '<', '<=' ); + + // Clauses joined by AND with "negative" operators share a join only if they also share a key. + } elseif ( isset( $sibling['key'] ) && isset( $clause['key'] ) && $sibling['key'] === $clause['key'] ) { + $compatible_compares = array( '!=', 'NOT IN', 'NOT LIKE' ); + } + + $clause_compare = strtoupper( $clause['compare'] ); + $sibling_compare = strtoupper( $sibling['compare'] ); + if ( in_array( $clause_compare, $compatible_compares ) && in_array( $sibling_compare, $compatible_compares ) ) { + $alias = $sibling['alias']; + break; + } + } + + /** + * Filters the table alias identified as compatible with the current clause. + * + * @since 4.1.0 + * + * @param string|bool $alias Table alias, or false if none was found. + * @param array $clause First-order query clause. + * @param array $parent_query Parent of $clause. + * @param WP_Meta_Query $this WP_Meta_Query object. + */ + return apply_filters( 'meta_query_find_compatible_table_alias', $alias, $clause, $parent_query, $this ); + } + + /** + * Checks whether the current query has any OR relations. + * + * In some cases, the presence of an OR relation somewhere in the query will require + * the use of a `DISTINCT` or `GROUP BY` keyword in the `SELECT` clause. The current + * method can be used in these cases to determine whether such a clause is necessary. + * + * @since 4.3.0 + * + * @return bool True if the query contains any `OR` relations, otherwise false. + */ + public function has_or_relation() { + return $this->has_or_relation; + } +} diff --git a/wp-includes/class-wp-metadata-lazyloader.php b/wp-includes/class-wp-metadata-lazyloader.php new file mode 100644 index 0000000..0a1a512 --- /dev/null +++ b/wp-includes/class-wp-metadata-lazyloader.php @@ -0,0 +1,170 @@ +<?php +/** + * Meta API: WP_Metadata_Lazyloader class + * + * @package WordPress + * @subpackage Meta + * @since 4.5.0 + */ + +/** + * Core class used for lazy-loading object metadata. + * + * When loading many objects of a given type, such as posts in a WP_Query loop, it often makes + * sense to prime various metadata caches at the beginning of the loop. This means fetching all + * relevant metadata with a single database query, a technique that has the potential to improve + * performance dramatically in some cases. + * + * In cases where the given metadata may not even be used in the loop, we can improve performance + * even more by only priming the metadata cache for affected items the first time a piece of metadata + * is requested - ie, by lazy-loading it. So, for example, comment meta may not be loaded into the + * cache in the comments section of a post until the first time get_comment_meta() is called in the + * context of the comment loop. + * + * WP uses the WP_Metadata_Lazyloader class to queue objects for metadata cache priming. The class + * then detects the relevant get_*_meta() function call, and queries the metadata of all queued objects. + * + * Do not access this class directly. Use the wp_metadata_lazyloader() function. + * + * @since 4.5.0 + */ +class WP_Metadata_Lazyloader { + /** + * Pending objects queue. + * + * @since 4.5.0 + * @var array + */ + protected $pending_objects; + + /** + * Settings for supported object types. + * + * @since 4.5.0 + * @var array + */ + protected $settings = array(); + + /** + * Constructor. + * + * @since 4.5.0 + */ + public function __construct() { + $this->settings = array( + 'term' => array( + 'filter' => 'get_term_metadata', + 'callback' => array( $this, 'lazyload_term_meta' ), + ), + 'comment' => array( + 'filter' => 'get_comment_metadata', + 'callback' => array( $this, 'lazyload_comment_meta' ), + ), + ); + } + + /** + * Adds objects to the metadata lazy-load queue. + * + * @since 4.5.0 + * + * @param string $object_type Type of object whose meta is to be lazy-loaded. Accepts 'term' or 'comment'. + * @param array $object_ids Array of object IDs. + * @return bool|WP_Error True on success, WP_Error on failure. + */ + public function queue_objects( $object_type, $object_ids ) { + if ( ! isset( $this->settings[ $object_type ] ) ) { + return new WP_Error( 'invalid_object_type', __( 'Invalid object type.' ) ); + } + + $type_settings = $this->settings[ $object_type ]; + + if ( ! isset( $this->pending_objects[ $object_type ] ) ) { + $this->pending_objects[ $object_type ] = array(); + } + + foreach ( $object_ids as $object_id ) { + // Keyed by ID for faster lookup. + if ( ! isset( $this->pending_objects[ $object_type ][ $object_id ] ) ) { + $this->pending_objects[ $object_type ][ $object_id ] = 1; + } + } + + add_filter( $type_settings['filter'], $type_settings['callback'] ); + + /** + * Fires after objects are added to the metadata lazy-load queue. + * + * @since 4.5.0 + * + * @param array $object_ids Array of object IDs. + * @param string $object_type Type of object being queued. + * @param WP_Metadata_Lazyloader $lazyloader The lazy-loader object. + */ + do_action( 'metadata_lazyloader_queued_objects', $object_ids, $object_type, $this ); + } + + /** + * Resets lazy-load queue for a given object type. + * + * @since 4.5.0 + * + * @param string $object_type Object type. Accepts 'comment' or 'term'. + * @return bool|WP_Error True on success, WP_Error on failure. + */ + public function reset_queue( $object_type ) { + if ( ! isset( $this->settings[ $object_type ] ) ) { + return new WP_Error( 'invalid_object_type', __( 'Invalid object type.' ) ); + } + + $type_settings = $this->settings[ $object_type ]; + + $this->pending_objects[ $object_type ] = array(); + remove_filter( $type_settings['filter'], $type_settings['callback'] ); + } + + /** + * Lazy-loads term meta for queued terms. + * + * This method is public so that it can be used as a filter callback. As a rule, there + * is no need to invoke it directly. + * + * @since 4.5.0 + * + * @param mixed $check The `$check` param passed from the 'get_term_metadata' hook. + * @return mixed In order not to short-circuit `get_metadata()`. Generally, this is `null`, but it could be + * another value if filtered by a plugin. + */ + public function lazyload_term_meta( $check ) { + if ( ! empty( $this->pending_objects['term'] ) ) { + update_termmeta_cache( array_keys( $this->pending_objects['term'] ) ); + + // No need to run again for this set of terms. + $this->reset_queue( 'term' ); + } + + return $check; + } + + /** + * Lazy-loads comment meta for queued comments. + * + * This method is public so that it can be used as a filter callback. As a rule, there is no need to invoke it + * directly, from either inside or outside the `WP_Query` object. + * + * @since 4.5.0 + * + * @param mixed $check The `$check` param passed from the {@see 'get_comment_metadata'} hook. + * @return mixed The original value of `$check`, so as not to short-circuit `get_comment_metadata()`. + */ + public function lazyload_comment_meta( $check ) { + if ( ! empty( $this->pending_objects['comment'] ) ) { + update_meta_cache( 'comment', array_keys( $this->pending_objects['comment'] ) ); + + // No need to run again for this set of comments. + $this->reset_queue( 'comment' ); + } + + return $check; + } +} diff --git a/wp-includes/class-wp-network-query.php b/wp-includes/class-wp-network-query.php new file mode 100644 index 0000000..0bd06e3 --- /dev/null +++ b/wp-includes/class-wp-network-query.php @@ -0,0 +1,580 @@ +<?php +/** + * Network API: WP_Network_Query class + * + * @package WordPress + * @subpackage Multisite + * @since 4.6.0 + */ + +/** + * Core class used for querying networks. + * + * @since 4.6.0 + * + * @see WP_Network_Query::__construct() for accepted arguments. + */ +class WP_Network_Query { + + /** + * SQL for database query. + * + * @since 4.6.0 + * @var string + */ + public $request; + + /** + * SQL query clauses. + * + * @since 4.6.0 + * @var array + */ + protected $sql_clauses = array( + 'select' => '', + 'from' => '', + 'where' => array(), + 'groupby' => '', + 'orderby' => '', + 'limits' => '', + ); + + /** + * Query vars set by the user. + * + * @since 4.6.0 + * @var array + */ + public $query_vars; + + /** + * Default values for query vars. + * + * @since 4.6.0 + * @var array + */ + public $query_var_defaults; + + /** + * List of networks located by the query. + * + * @since 4.6.0 + * @var array + */ + public $networks; + + /** + * The amount of found networks for the current query. + * + * @since 4.6.0 + * @var int + */ + public $found_networks = 0; + + /** + * The number of pages. + * + * @since 4.6.0 + * @var int + */ + public $max_num_pages = 0; + + /** + * Constructor. + * + * Sets up the network query, based on the query vars passed. + * + * @since 4.6.0 + * + * @param string|array $query { + * Optional. Array or query string of network query parameters. Default empty. + * + * @type array $network__in Array of network IDs to include. Default empty. + * @type array $network__not_in Array of network IDs to exclude. Default empty. + * @type bool $count Whether to return a network count (true) or array of network objects. + * Default false. + * @type string $fields Network fields to return. Accepts 'ids' (returns an array of network IDs) + * or empty (returns an array of complete network objects). Default empty. + * @type int $number Maximum number of networks to retrieve. Default empty (no limit). + * @type int $offset Number of networks to offset the query. Used to build LIMIT clause. + * Default 0. + * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true. + * @type string|array $orderby Network status or array of statuses. Accepts 'id', 'domain', 'path', + * 'domain_length', 'path_length' and 'network__in'. Also accepts false, + * an empty array, or 'none' to disable `ORDER BY` clause. Default 'id'. + * @type string $order How to order retrieved networks. Accepts 'ASC', 'DESC'. Default 'ASC'. + * @type string $domain Limit results to those affiliated with a given domain. Default empty. + * @type array $domain__in Array of domains to include affiliated networks for. Default empty. + * @type array $domain__not_in Array of domains to exclude affiliated networks for. Default empty. + * @type string $path Limit results to those affiliated with a given path. Default empty. + * @type array $path__in Array of paths to include affiliated networks for. Default empty. + * @type array $path__not_in Array of paths to exclude affiliated networks for. Default empty. + * @type string $search Search term(s) to retrieve matching networks for. Default empty. + * @type bool $update_network_cache Whether to prime the cache for found networks. Default true. + * } + */ + public function __construct( $query = '' ) { + $this->query_var_defaults = array( + 'network__in' => '', + 'network__not_in' => '', + 'count' => false, + 'fields' => '', + 'number' => '', + 'offset' => '', + 'no_found_rows' => true, + 'orderby' => 'id', + 'order' => 'ASC', + 'domain' => '', + 'domain__in' => '', + 'domain__not_in' => '', + 'path' => '', + 'path__in' => '', + 'path__not_in' => '', + 'search' => '', + 'update_network_cache' => true, + ); + + if ( ! empty( $query ) ) { + $this->query( $query ); + } + } + + /** + * Parses arguments passed to the network query with default query parameters. + * + * @since 4.6.0 + * + * @param string|array $query WP_Network_Query arguments. See WP_Network_Query::__construct() + */ + public function parse_query( $query = '' ) { + if ( empty( $query ) ) { + $query = $this->query_vars; + } + + $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); + + /** + * Fires after the network query vars have been parsed. + * + * @since 4.6.0 + * + * @param WP_Network_Query $this The WP_Network_Query instance (passed by reference). + */ + do_action_ref_array( 'parse_network_query', array( &$this ) ); + } + + /** + * Sets up the WordPress query for retrieving networks. + * + * @since 4.6.0 + * + * @param string|array $query Array or URL query string of parameters. + * @return array|int List of WP_Network objects, a list of network ids when 'fields' is set to 'ids', + * or the number of networks when 'count' is passed as a query var. + */ + public function query( $query ) { + $this->query_vars = wp_parse_args( $query ); + return $this->get_networks(); + } + + /** + * Gets a list of networks matching the query vars. + * + * @since 4.6.0 + * + * @return array|int List of WP_Network objects, a list of network ids when 'fields' is set to 'ids', + * or the number of networks when 'count' is passed as a query var. + */ + public function get_networks() { + $this->parse_query(); + + /** + * Fires before networks are retrieved. + * + * @since 4.6.0 + * + * @param WP_Network_Query $this Current instance of WP_Network_Query (passed by reference). + */ + do_action_ref_array( 'pre_get_networks', array( &$this ) ); + + $network_data = null; + + /** + * Filter the network data before the query takes place. + * + * Return a non-null value to bypass WordPress's default network queries. + * + * The expected return type from this filter depends on the value passed in the request query_vars. + * When `$this->query_vars['count']` is set, the filter should return the network count as an int. + * When `'ids' === $this->query_vars['fields']`, the filter should return an array of network ids. + * Otherwise the filter should return an array of WP_Network objects. + * + * @since 5.2.0 + * + * @param array|null $network_data Return an array of network data to short-circuit WP's network query, + * the network count as an integer if `$this->query_vars['count']` is set, + * or null to allow WP to run its normal queries. + * @param WP_Network_Query $this The WP_Network_Query instance, passed by reference. + */ + $network_data = apply_filters_ref_array( 'networks_pre_query', array( $network_data, &$this ) ); + + if ( null !== $network_data ) { + return $network_data; + } + + // $args can include anything. Only use the args defined in the query_var_defaults to compute the key. + $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ); + + // Ignore the $fields argument as the queried result will be the same regardless. + unset( $_args['fields'] ); + + $key = md5( serialize( $_args ) ); + $last_changed = wp_cache_get_last_changed( 'networks' ); + + $cache_key = "get_network_ids:$key:$last_changed"; + $cache_value = wp_cache_get( $cache_key, 'networks' ); + + if ( false === $cache_value ) { + $network_ids = $this->get_network_ids(); + if ( $network_ids ) { + $this->set_found_networks(); + } + + $cache_value = array( + 'network_ids' => $network_ids, + 'found_networks' => $this->found_networks, + ); + wp_cache_add( $cache_key, $cache_value, 'networks' ); + } else { + $network_ids = $cache_value['network_ids']; + $this->found_networks = $cache_value['found_networks']; + } + + if ( $this->found_networks && $this->query_vars['number'] ) { + $this->max_num_pages = ceil( $this->found_networks / $this->query_vars['number'] ); + } + + // If querying for a count only, there's nothing more to do. + if ( $this->query_vars['count'] ) { + // $network_ids is actually a count in this case. + return intval( $network_ids ); + } + + $network_ids = array_map( 'intval', $network_ids ); + + if ( 'ids' == $this->query_vars['fields'] ) { + $this->networks = $network_ids; + return $this->networks; + } + + if ( $this->query_vars['update_network_cache'] ) { + _prime_network_caches( $network_ids ); + } + + // Fetch full network objects from the primed cache. + $_networks = array(); + foreach ( $network_ids as $network_id ) { + $_network = get_network( $network_id ); + if ( $_network ) { + $_networks[] = $_network; + } + } + + /** + * Filters the network query results. + * + * @since 4.6.0 + * + * @param WP_Network[] $_networks An array of WP_Network objects. + * @param WP_Network_Query $this Current instance of WP_Network_Query (passed by reference). + */ + $_networks = apply_filters_ref_array( 'the_networks', array( $_networks, &$this ) ); + + // Convert to WP_Network instances. + $this->networks = array_map( 'get_network', $_networks ); + + return $this->networks; + } + + /** + * Used internally to get a list of network IDs matching the query vars. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return int|array A single count of network IDs if a count query. An array of network IDs if a full query. + */ + protected function get_network_ids() { + global $wpdb; + + $order = $this->parse_order( $this->query_vars['order'] ); + + // Disable ORDER BY with 'none', an empty array, or boolean false. + if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { + $orderby = ''; + } elseif ( ! empty( $this->query_vars['orderby'] ) ) { + $ordersby = is_array( $this->query_vars['orderby'] ) ? + $this->query_vars['orderby'] : + preg_split( '/[,\s]/', $this->query_vars['orderby'] ); + + $orderby_array = array(); + foreach ( $ordersby as $_key => $_value ) { + if ( ! $_value ) { + continue; + } + + if ( is_int( $_key ) ) { + $_orderby = $_value; + $_order = $order; + } else { + $_orderby = $_key; + $_order = $_value; + } + + $parsed = $this->parse_orderby( $_orderby ); + + if ( ! $parsed ) { + continue; + } + + if ( 'network__in' === $_orderby ) { + $orderby_array[] = $parsed; + continue; + } + + $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); + } + + $orderby = implode( ', ', $orderby_array ); + } else { + $orderby = "$wpdb->site.id $order"; + } + + $number = absint( $this->query_vars['number'] ); + $offset = absint( $this->query_vars['offset'] ); + $limits = ''; + + if ( ! empty( $number ) ) { + if ( $offset ) { + $limits = 'LIMIT ' . $offset . ',' . $number; + } else { + $limits = 'LIMIT ' . $number; + } + } + + if ( $this->query_vars['count'] ) { + $fields = 'COUNT(*)'; + } else { + $fields = "$wpdb->site.id"; + } + + // Parse network IDs for an IN clause. + if ( ! empty( $this->query_vars['network__in'] ) ) { + $this->sql_clauses['where']['network__in'] = "$wpdb->site.id IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['network__in'] ) ) . ' )'; + } + + // Parse network IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['network__not_in'] ) ) { + $this->sql_clauses['where']['network__not_in'] = "$wpdb->site.id NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['network__not_in'] ) ) . ' )'; + } + + if ( ! empty( $this->query_vars['domain'] ) ) { + $this->sql_clauses['where']['domain'] = $wpdb->prepare( "$wpdb->site.domain = %s", $this->query_vars['domain'] ); + } + + // Parse network domain for an IN clause. + if ( is_array( $this->query_vars['domain__in'] ) ) { + $this->sql_clauses['where']['domain__in'] = "$wpdb->site.domain IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__in'] ) ) . "' )"; + } + + // Parse network domain for a NOT IN clause. + if ( is_array( $this->query_vars['domain__not_in'] ) ) { + $this->sql_clauses['where']['domain__not_in'] = "$wpdb->site.domain NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__not_in'] ) ) . "' )"; + } + + if ( ! empty( $this->query_vars['path'] ) ) { + $this->sql_clauses['where']['path'] = $wpdb->prepare( "$wpdb->site.path = %s", $this->query_vars['path'] ); + } + + // Parse network path for an IN clause. + if ( is_array( $this->query_vars['path__in'] ) ) { + $this->sql_clauses['where']['path__in'] = "$wpdb->site.path IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__in'] ) ) . "' )"; + } + + // Parse network path for a NOT IN clause. + if ( is_array( $this->query_vars['path__not_in'] ) ) { + $this->sql_clauses['where']['path__not_in'] = "$wpdb->site.path NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__not_in'] ) ) . "' )"; + } + + // Falsey search strings are ignored. + if ( strlen( $this->query_vars['search'] ) ) { + $this->sql_clauses['where']['search'] = $this->get_search_sql( + $this->query_vars['search'], + array( "$wpdb->site.domain", "$wpdb->site.path" ) + ); + } + + $join = ''; + + $where = implode( ' AND ', $this->sql_clauses['where'] ); + + $groupby = ''; + + $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); + + /** + * Filters the network query clauses. + * + * @since 4.6.0 + * + * @param string[] $pieces An associative array of network query clauses. + * @param WP_Network_Query $this Current instance of WP_Network_Query (passed by reference). + */ + $clauses = apply_filters_ref_array( 'networks_clauses', array( compact( $pieces ), &$this ) ); + + $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; + $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; + $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; + $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; + $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; + $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; + + if ( $where ) { + $where = 'WHERE ' . $where; + } + + if ( $groupby ) { + $groupby = 'GROUP BY ' . $groupby; + } + + if ( $orderby ) { + $orderby = "ORDER BY $orderby"; + } + + $found_rows = ''; + if ( ! $this->query_vars['no_found_rows'] ) { + $found_rows = 'SQL_CALC_FOUND_ROWS'; + } + + $this->sql_clauses['select'] = "SELECT $found_rows $fields"; + $this->sql_clauses['from'] = "FROM $wpdb->site $join"; + $this->sql_clauses['groupby'] = $groupby; + $this->sql_clauses['orderby'] = $orderby; + $this->sql_clauses['limits'] = $limits; + + $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; + + if ( $this->query_vars['count'] ) { + return intval( $wpdb->get_var( $this->request ) ); + } + + $network_ids = $wpdb->get_col( $this->request ); + + return array_map( 'intval', $network_ids ); + } + + /** + * Populates found_networks and max_num_pages properties for the current query + * if the limit clause was used. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ + private function set_found_networks() { + global $wpdb; + + if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { + /** + * Filters the query used to retrieve found network count. + * + * @since 4.6.0 + * + * @param string $found_networks_query SQL query. Default 'SELECT FOUND_ROWS()'. + * @param WP_Network_Query $network_query The `WP_Network_Query` instance. + */ + $found_networks_query = apply_filters( 'found_networks_query', 'SELECT FOUND_ROWS()', $this ); + + $this->found_networks = (int) $wpdb->get_var( $found_networks_query ); + } + } + + /** + * Used internally to generate an SQL string for searching across multiple columns. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $string Search string. + * @param string[] $columns Array of columns to search. + * + * @return string Search SQL. + */ + protected function get_search_sql( $string, $columns ) { + global $wpdb; + + $like = '%' . $wpdb->esc_like( $string ) . '%'; + + $searches = array(); + foreach ( $columns as $column ) { + $searches[] = $wpdb->prepare( "$column LIKE %s", $like ); + } + + return '(' . implode( ' OR ', $searches ) . ')'; + } + + /** + * Parses and sanitizes 'orderby' keys passed to the network query. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $orderby Alias for the field to order by. + * @return string|false Value to used in the ORDER clause. False otherwise. + */ + protected function parse_orderby( $orderby ) { + global $wpdb; + + $allowed_keys = array( + 'id', + 'domain', + 'path', + ); + + $parsed = false; + if ( 'network__in' === $orderby ) { + $network__in = implode( ',', array_map( 'absint', $this->query_vars['network__in'] ) ); + $parsed = "FIELD( {$wpdb->site}.id, $network__in )"; + } elseif ( 'domain_length' === $orderby || 'path_length' === $orderby ) { + $field = substr( $orderby, 0, -7 ); + $parsed = "CHAR_LENGTH($wpdb->site.$field)"; + } elseif ( in_array( $orderby, $allowed_keys ) ) { + $parsed = "$wpdb->site.$orderby"; + } + + return $parsed; + } + + /** + * Parses an 'order' query variable and cast it to 'ASC' or 'DESC' as necessary. + * + * @since 4.6.0 + * + * @param string $order The 'order' query variable. + * @return string The sanitized 'order' query variable. + */ + protected function parse_order( $order ) { + if ( ! is_string( $order ) || empty( $order ) ) { + return 'ASC'; + } + + if ( 'ASC' === strtoupper( $order ) ) { + return 'ASC'; + } else { + return 'DESC'; + } + } +} diff --git a/wp-includes/class-wp-network.php b/wp-includes/class-wp-network.php new file mode 100644 index 0000000..1addcdd --- /dev/null +++ b/wp-includes/class-wp-network.php @@ -0,0 +1,477 @@ +<?php +/** + * Network API: WP_Network class + * + * @package WordPress + * @subpackage Multisite + * @since 4.4.0 + */ + +/** + * Core class used for interacting with a multisite network. + * + * This class is used during load to populate the `$current_site` global and + * setup the current network. + * + * This class is most useful in WordPress multi-network installations where the + * ability to interact with any network of sites is required. + * + * @since 4.4.0 + * + * @property int $id + * @property int $site_id + */ +class WP_Network { + + /** + * Network ID. + * + * @since 4.4.0 + * @since 4.6.0 Converted from public to private to explicitly enable more intuitive + * access via magic methods. As part of the access change, the type was + * also changed from `string` to `int`. + * @var int + */ + private $id; + + /** + * Domain of the network. + * + * @since 4.4.0 + * @var string + */ + public $domain = ''; + + /** + * Path of the network. + * + * @since 4.4.0 + * @var string + */ + public $path = ''; + + /** + * The ID of the network's main site. + * + * Named "blog" vs. "site" for legacy reasons. A main site is mapped to + * the network when the network is created. + * + * A numeric string, for compatibility reasons. + * + * @since 4.4.0 + * @var string + */ + private $blog_id = '0'; + + /** + * Domain used to set cookies for this network. + * + * @since 4.4.0 + * @var string + */ + public $cookie_domain = ''; + + /** + * Name of this network. + * + * Named "site" vs. "network" for legacy reasons. + * + * @since 4.4.0 + * @var string + */ + public $site_name = ''; + + /** + * Retrieve a network from the database by its ID. + * + * @since 4.4.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $network_id The ID of the network to retrieve. + * @return WP_Network|bool The network's object if found. False if not. + */ + public static function get_instance( $network_id ) { + global $wpdb; + + $network_id = (int) $network_id; + if ( ! $network_id ) { + return false; + } + + $_network = wp_cache_get( $network_id, 'networks' ); + + if ( false === $_network ) { + $_network = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->site} WHERE id = %d LIMIT 1", $network_id ) ); + + if ( empty( $_network ) || is_wp_error( $_network ) ) { + $_network = -1; + } + + wp_cache_add( $network_id, $_network, 'networks' ); + } + + if ( is_numeric( $_network ) ) { + return false; + } + + return new WP_Network( $_network ); + } + + /** + * Create a new WP_Network object. + * + * Will populate object properties from the object provided and assign other + * default properties based on that information. + * + * @since 4.4.0 + * + * @param WP_Network|object $network A network object. + */ + public function __construct( $network ) { + foreach ( get_object_vars( $network ) as $key => $value ) { + $this->$key = $value; + } + + $this->_set_site_name(); + $this->_set_cookie_domain(); + } + + /** + * Getter. + * + * Allows current multisite naming conventions when getting properties. + * + * @since 4.6.0 + * + * @param string $key Property to get. + * @return mixed Value of the property. Null if not available. + */ + public function __get( $key ) { + switch ( $key ) { + case 'id': + return (int) $this->id; + case 'blog_id': + return (string) $this->get_main_site_id(); + case 'site_id': + return $this->get_main_site_id(); + } + + return null; + } + + /** + * Isset-er. + * + * Allows current multisite naming conventions when checking for properties. + * + * @since 4.6.0 + * + * @param string $key Property to check if set. + * @return bool Whether the property is set. + */ + public function __isset( $key ) { + switch ( $key ) { + case 'id': + case 'blog_id': + case 'site_id': + return true; + } + + return false; + } + + /** + * Setter. + * + * Allows current multisite naming conventions while setting properties. + * + * @since 4.6.0 + * + * @param string $key Property to set. + * @param mixed $value Value to assign to the property. + */ + public function __set( $key, $value ) { + switch ( $key ) { + case 'id': + $this->id = (int) $value; + break; + case 'blog_id': + case 'site_id': + $this->blog_id = (string) $value; + break; + default: + $this->$key = $value; + } + } + + /** + * Returns the main site ID for the network. + * + * Internal method used by the magic getter for the 'blog_id' and 'site_id' + * properties. + * + * @since 4.9.0 + * + * @return int The ID of the main site. + */ + private function get_main_site_id() { + /** + * Filters the main site ID. + * + * Returning a positive integer will effectively short-circuit the function. + * + * @since 4.9.0 + * + * @param int|null $main_site_id If a positive integer is returned, it is interpreted as the main site ID. + * @param WP_Network $network The network object for which the main site was detected. + */ + $main_site_id = (int) apply_filters( 'pre_get_main_site_id', null, $this ); + if ( 0 < $main_site_id ) { + return $main_site_id; + } + + if ( 0 < (int) $this->blog_id ) { + return (int) $this->blog_id; + } + + if ( ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) && DOMAIN_CURRENT_SITE === $this->domain && PATH_CURRENT_SITE === $this->path ) + || ( defined( 'SITE_ID_CURRENT_SITE' ) && SITE_ID_CURRENT_SITE == $this->id ) ) { + if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) { + $this->blog_id = (string) BLOG_ID_CURRENT_SITE; + + return (int) $this->blog_id; + } + + if ( defined( 'BLOGID_CURRENT_SITE' ) ) { // Deprecated. + $this->blog_id = (string) BLOGID_CURRENT_SITE; + + return (int) $this->blog_id; + } + } + + $site = get_site(); + if ( $site->domain === $this->domain && $site->path === $this->path ) { + $main_site_id = (int) $site->id; + } else { + $cache_key = 'network:' . $this->id . ':main_site'; + + $main_site_id = wp_cache_get( $cache_key, 'site-options' ); + if ( false === $main_site_id ) { + $_sites = get_sites( + array( + 'fields' => 'ids', + 'number' => 1, + 'domain' => $this->domain, + 'path' => $this->path, + 'network_id' => $this->id, + ) + ); + $main_site_id = ! empty( $_sites ) ? array_shift( $_sites ) : 0; + + wp_cache_add( $cache_key, $main_site_id, 'site-options' ); + } + } + + $this->blog_id = (string) $main_site_id; + + return (int) $this->blog_id; + } + + /** + * Set the site name assigned to the network if one has not been populated. + * + * @since 4.4.0 + */ + private function _set_site_name() { + if ( ! empty( $this->site_name ) ) { + return; + } + + $default = ucfirst( $this->domain ); + $this->site_name = get_network_option( $this->id, 'site_name', $default ); + } + + /** + * Set the cookie domain based on the network domain if one has + * not been populated. + * + * @todo What if the domain of the network doesn't match the current site? + * + * @since 4.4.0 + */ + private function _set_cookie_domain() { + if ( ! empty( $this->cookie_domain ) ) { + return; + } + + $this->cookie_domain = $this->domain; + if ( 'www.' === substr( $this->cookie_domain, 0, 4 ) ) { + $this->cookie_domain = substr( $this->cookie_domain, 4 ); + } + } + + /** + * Retrieve the closest matching network for a domain and path. + * + * This will not necessarily return an exact match for a domain and path. Instead, it + * breaks the domain and path into pieces that are then used to match the closest + * possibility from a query. + * + * The intent of this method is to match a network during bootstrap for a + * requested site address. + * + * @since 4.4.0 + * + * @param string $domain Domain to check. + * @param string $path Path to check. + * @param int|null $segments Path segments to use. Defaults to null, or the full path. + * @return WP_Network|bool Network object if successful. False when no network is found. + */ + public static function get_by_path( $domain = '', $path = '', $segments = null ) { + $domains = array( $domain ); + $pieces = explode( '.', $domain ); + + /* + * It's possible one domain to search is 'com', but it might as well + * be 'localhost' or some other locally mapped domain. + */ + while ( array_shift( $pieces ) ) { + if ( ! empty( $pieces ) ) { + $domains[] = implode( '.', $pieces ); + } + } + + /* + * If we've gotten to this function during normal execution, there is + * more than one network installed. At this point, who knows how many + * we have. Attempt to optimize for the situation where networks are + * only domains, thus meaning paths never need to be considered. + * + * This is a very basic optimization; anything further could have + * drawbacks depending on the setup, so this is best done per-installation. + */ + $using_paths = true; + if ( wp_using_ext_object_cache() ) { + $using_paths = wp_cache_get( 'networks_have_paths', 'site-options' ); + if ( false === $using_paths ) { + $using_paths = get_networks( + array( + 'number' => 1, + 'count' => true, + 'path__not_in' => '/', + ) + ); + wp_cache_add( 'networks_have_paths', $using_paths, 'site-options' ); + } + } + + $paths = array(); + if ( $using_paths ) { + $path_segments = array_filter( explode( '/', trim( $path, '/' ) ) ); + + /** + * Filters the number of path segments to consider when searching for a site. + * + * @since 3.9.0 + * + * @param int|null $segments The number of path segments to consider. WordPress by default looks at + * one path segment. The function default of null only makes sense when you + * know the requested path should match a network. + * @param string $domain The requested domain. + * @param string $path The requested path, in full. + */ + $segments = apply_filters( 'network_by_path_segments_count', $segments, $domain, $path ); + + if ( ( null !== $segments ) && count( $path_segments ) > $segments ) { + $path_segments = array_slice( $path_segments, 0, $segments ); + } + + while ( count( $path_segments ) ) { + $paths[] = '/' . implode( '/', $path_segments ) . '/'; + array_pop( $path_segments ); + } + + $paths[] = '/'; + } + + /** + * Determine a network by its domain and path. + * + * This allows one to short-circuit the default logic, perhaps by + * replacing it with a routine that is more optimal for your setup. + * + * Return null to avoid the short-circuit. Return false if no network + * can be found at the requested domain and path. Otherwise, return + * an object from wp_get_network(). + * + * @since 3.9.0 + * + * @param null|bool|WP_Network $network Network value to return by path. Default null + * to continue retrieving the network. + * @param string $domain The requested domain. + * @param string $path The requested path, in full. + * @param int|null $segments The suggested number of paths to consult. + * Default null, meaning the entire path was to be consulted. + * @param string[] $paths Array of paths to search for, based on `$path` and `$segments`. + */ + $pre = apply_filters( 'pre_get_network_by_path', null, $domain, $path, $segments, $paths ); + if ( null !== $pre ) { + return $pre; + } + + if ( ! $using_paths ) { + $networks = get_networks( + array( + 'number' => 1, + 'orderby' => array( + 'domain_length' => 'DESC', + ), + 'domain__in' => $domains, + ) + ); + + if ( ! empty( $networks ) ) { + return array_shift( $networks ); + } + + return false; + } + + $networks = get_networks( + array( + 'orderby' => array( + 'domain_length' => 'DESC', + 'path_length' => 'DESC', + ), + 'domain__in' => $domains, + 'path__in' => $paths, + ) + ); + + /* + * Domains are sorted by length of domain, then by length of path. + * The domain must match for the path to be considered. Otherwise, + * a network with the path of / will suffice. + */ + $found = false; + foreach ( $networks as $network ) { + if ( ( $network->domain === $domain ) || ( "www.{$network->domain}" === $domain ) ) { + if ( in_array( $network->path, $paths, true ) ) { + $found = true; + break; + } + } + if ( '/' === $network->path ) { + $found = true; + break; + } + } + + if ( true === $found ) { + return $network; + } + + return false; + } +} diff --git a/wp-includes/class-wp-object-cache.php b/wp-includes/class-wp-object-cache.php new file mode 100644 index 0000000..428e453 --- /dev/null +++ b/wp-includes/class-wp-object-cache.php @@ -0,0 +1,475 @@ +<?php +/** + * Object Cache API: WP_Object_Cache class + * + * @package WordPress + * @subpackage Cache + * @since 5.4.0 + */ + +/** + * Core class that implements an object cache. + * + * The WordPress Object Cache is used to save on trips to the database. The + * Object Cache stores all of the cache data to memory and makes the cache + * contents available by using a key, which is used to name and later retrieve + * the cache contents. + * + * The Object Cache can be replaced by other caching mechanisms by placing files + * in the wp-content folder which is looked at in wp-settings. If that file + * exists, then this file will not be included. + * + * @since 2.0.0 + */ +class WP_Object_Cache { + + /** + * Holds the cached objects. + * + * @since 2.0.0 + * @var array + */ + private $cache = array(); + + /** + * The amount of times the cache data was already stored in the cache. + * + * @since 2.5.0 + * @var int + */ + public $cache_hits = 0; + + /** + * Amount of times the cache did not have the request in cache. + * + * @since 2.0.0 + * @var int + */ + public $cache_misses = 0; + + /** + * List of global cache groups. + * + * @since 3.0.0 + * @var array + */ + protected $global_groups = array(); + + /** + * The blog prefix to prepend to keys in non-global groups. + * + * @since 3.5.0 + * @var string + */ + private $blog_prefix; + + /** + * Holds the value of is_multisite(). + * + * @since 3.5.0 + * @var bool + */ + private $multisite; + + /** + * Sets up object properties; PHP 5 style constructor. + * + * @since 2.0.8 + */ + public function __construct() { + $this->multisite = is_multisite(); + $this->blog_prefix = $this->multisite ? get_current_blog_id() . ':' : ''; + } + + /** + * Makes private properties readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to get. + * @return mixed Property. + */ + public function __get( $name ) { + return $this->$name; + } + + /** + * Makes private properties settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to set. + * @param mixed $value Property value. + * @return mixed Newly-set property. + */ + public function __set( $name, $value ) { + return $this->$name = $value; + } + + /** + * Makes private properties checkable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @return bool Whether the property is set. + */ + public function __isset( $name ) { + return isset( $this->$name ); + } + + /** + * Makes private properties un-settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to unset. + */ + public function __unset( $name ) { + unset( $this->$name ); + } + + /** + * Adds data to the cache if it doesn't already exist. + * + * @since 2.0.0 + * + * @uses WP_Object_Cache::_exists() Checks to see if the cache already has data. + * @uses WP_Object_Cache::set() Sets the data after the checking the cache + * contents existence. + * + * @param int|string $key What to call the contents in the cache. + * @param mixed $data The contents to store in the cache. + * @param string $group Optional. Where to group the cache contents. Default 'default'. + * @param int $expire Optional. When to expire the cache contents. Default 0 (no expiration). + * @return bool True on success, false if cache key and group already exist. + */ + public function add( $key, $data, $group = 'default', $expire = 0 ) { + if ( wp_suspend_cache_addition() ) { + return false; + } + + if ( empty( $group ) ) { + $group = 'default'; + } + + $id = $key; + if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { + $id = $this->blog_prefix . $key; + } + + if ( $this->_exists( $id, $group ) ) { + return false; + } + + return $this->set( $key, $data, $group, (int) $expire ); + } + + /** + * Sets the list of global cache groups. + * + * @since 3.0.0 + * + * @param array $groups List of groups that are global. + */ + public function add_global_groups( $groups ) { + $groups = (array) $groups; + + $groups = array_fill_keys( $groups, true ); + $this->global_groups = array_merge( $this->global_groups, $groups ); + } + + /** + * Decrements numeric cache item's value. + * + * @since 3.3.0 + * + * @param int|string $key The cache key to decrement. + * @param int $offset Optional. The amount by which to decrement the item's value. Default 1. + * @param string $group Optional. The group the key is in. Default 'default'. + * @return int|false The item's new value on success, false on failure. + */ + public function decr( $key, $offset = 1, $group = 'default' ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { + $key = $this->blog_prefix . $key; + } + + if ( ! $this->_exists( $key, $group ) ) { + return false; + } + + if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) { + $this->cache[ $group ][ $key ] = 0; + } + + $offset = (int) $offset; + + $this->cache[ $group ][ $key ] -= $offset; + + if ( $this->cache[ $group ][ $key ] < 0 ) { + $this->cache[ $group ][ $key ] = 0; + } + + return $this->cache[ $group ][ $key ]; + } + + /** + * Removes the contents of the cache key in the group. + * + * If the cache key does not exist in the group, then nothing will happen. + * + * @since 2.0.0 + * + * @param int|string $key What the contents in the cache are called. + * @param string $group Optional. Where the cache contents are grouped. Default 'default'. + * @param bool $deprecated Optional. Unused. Default false. + * @return bool False if the contents weren't deleted and true on success. + */ + public function delete( $key, $group = 'default', $deprecated = false ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { + $key = $this->blog_prefix . $key; + } + + if ( ! $this->_exists( $key, $group ) ) { + return false; + } + + unset( $this->cache[ $group ][ $key ] ); + return true; + } + + /** + * Clears the object cache of all data. + * + * @since 2.0.0 + * + * @return true Always returns true. + */ + public function flush() { + $this->cache = array(); + + return true; + } + + /** + * Retrieves the cache contents, if it exists. + * + * The contents will be first attempted to be retrieved by searching by the + * key in the cache group. If the cache is hit (success) then the contents + * are returned. + * + * On failure, the number of cache misses will be incremented. + * + * @since 2.0.0 + * + * @param int|string $key What the contents in the cache are called. + * @param string $group Optional. Where the cache contents are grouped. Default 'default'. + * @param bool $force Optional. Unused. Whether to force a refetch rather than relying on the local + * cache. Default false. + * @param bool $found Optional. Whether the key was found in the cache (passed by reference). + * Disambiguates a return of false, a storable value. Default null. + * @return mixed|false The cache contents on success, false on failure to retrieve contents. + */ + public function get( $key, $group = 'default', $force = false, &$found = null ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { + $key = $this->blog_prefix . $key; + } + + if ( $this->_exists( $key, $group ) ) { + $found = true; + $this->cache_hits += 1; + if ( is_object( $this->cache[ $group ][ $key ] ) ) { + return clone $this->cache[ $group ][ $key ]; + } else { + return $this->cache[ $group ][ $key ]; + } + } + + $found = false; + $this->cache_misses += 1; + return false; + } + + /** + * Increments numeric cache item's value. + * + * @since 3.3.0 + * + * @param int|string $key The cache key to increment + * @param int $offset Optional. The amount by which to increment the item's value. Default 1. + * @param string $group Optional. The group the key is in. Default 'default'. + * @return int|false The item's new value on success, false on failure. + */ + public function incr( $key, $offset = 1, $group = 'default' ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { + $key = $this->blog_prefix . $key; + } + + if ( ! $this->_exists( $key, $group ) ) { + return false; + } + + if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) { + $this->cache[ $group ][ $key ] = 0; + } + + $offset = (int) $offset; + + $this->cache[ $group ][ $key ] += $offset; + + if ( $this->cache[ $group ][ $key ] < 0 ) { + $this->cache[ $group ][ $key ] = 0; + } + + return $this->cache[ $group ][ $key ]; + } + + /** + * Replaces the contents in the cache, if contents already exist. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::set() + * + * @param int|string $key What to call the contents in the cache. + * @param mixed $data The contents to store in the cache. + * @param string $group Optional. Where to group the cache contents. Default 'default'. + * @param int $expire Optional. When to expire the cache contents. Default 0 (no expiration). + * @return bool False if not exists, true if contents were replaced. + */ + public function replace( $key, $data, $group = 'default', $expire = 0 ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + $id = $key; + if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { + $id = $this->blog_prefix . $key; + } + + if ( ! $this->_exists( $id, $group ) ) { + return false; + } + + return $this->set( $key, $data, $group, (int) $expire ); + } + + /** + * Resets cache keys. + * + * @since 3.0.0 + * + * @deprecated 3.5.0 Use switch_to_blog() + * @see switch_to_blog() + */ + public function reset() { + _deprecated_function( __FUNCTION__, '3.5.0', 'switch_to_blog()' ); + + // Clear out non-global caches since the blog ID has changed. + foreach ( array_keys( $this->cache ) as $group ) { + if ( ! isset( $this->global_groups[ $group ] ) ) { + unset( $this->cache[ $group ] ); + } + } + } + + /** + * Sets the data contents into the cache. + * + * The cache contents are grouped by the $group parameter followed by the + * $key. This allows for duplicate ids in unique groups. Therefore, naming of + * the group should be used with care and should follow normal function + * naming guidelines outside of core WordPress usage. + * + * The $expire parameter is not used, because the cache will automatically + * expire for each time a page is accessed and PHP finishes. The method is + * more for cache plugins which use files. + * + * @since 2.0.0 + * + * @param int|string $key What to call the contents in the cache. + * @param mixed $data The contents to store in the cache. + * @param string $group Optional. Where to group the cache contents. Default 'default'. + * @param int $expire Not Used. + * @return true Always returns true. + */ + public function set( $key, $data, $group = 'default', $expire = 0 ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { + $key = $this->blog_prefix . $key; + } + + if ( is_object( $data ) ) { + $data = clone $data; + } + + $this->cache[ $group ][ $key ] = $data; + return true; + } + + /** + * Echoes the stats of the caching. + * + * Gives the cache hits, and cache misses. Also prints every cached group, + * key and the data. + * + * @since 2.0.0 + */ + public function stats() { + echo '<p>'; + echo "<strong>Cache Hits:</strong> {$this->cache_hits}<br />"; + echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br />"; + echo '</p>'; + echo '<ul>'; + foreach ( $this->cache as $group => $cache ) { + echo '<li><strong>Group:</strong> ' . esc_html( $group ) . ' - ( ' . number_format( strlen( serialize( $cache ) ) / KB_IN_BYTES, 2 ) . 'k )</li>'; + } + echo '</ul>'; + } + + /** + * Switches the internal blog ID. + * + * This changes the blog ID used to create keys in blog specific groups. + * + * @since 3.5.0 + * + * @param int $blog_id Blog ID. + */ + public function switch_to_blog( $blog_id ) { + $blog_id = (int) $blog_id; + $this->blog_prefix = $this->multisite ? $blog_id . ':' : ''; + } + + /** + * Serves as a utility function to determine whether a key exists in the cache. + * + * @since 3.4.0 + * + * @param int|string $key Cache key to check for existence. + * @param string $group Cache group for the key existence check. + * @return bool Whether the key exists in the cache for the given group. + */ + protected function _exists( $key, $group ) { + return isset( $this->cache[ $group ] ) && ( isset( $this->cache[ $group ][ $key ] ) || array_key_exists( $key, $this->cache[ $group ] ) ); + } +} diff --git a/wp-includes/class-wp-oembed-controller.php b/wp-includes/class-wp-oembed-controller.php new file mode 100644 index 0000000..74b4000 --- /dev/null +++ b/wp-includes/class-wp-oembed-controller.php @@ -0,0 +1,218 @@ +<?php +/** + * WP_oEmbed_Controller class, used to provide an oEmbed endpoint. + * + * @package WordPress + * @subpackage Embeds + * @since 4.4.0 + */ + +/** + * oEmbed API endpoint controller. + * + * Registers the API route and delivers the response data. + * The output format (XML or JSON) is handled by the REST API. + * + * @since 4.4.0 + */ +final class WP_oEmbed_Controller { + /** + * Register the oEmbed REST API route. + * + * @since 4.4.0 + */ + public function register_routes() { + /** + * Filters the maxwidth oEmbed parameter. + * + * @since 4.4.0 + * + * @param int $maxwidth Maximum allowed width. Default 600. + */ + $maxwidth = apply_filters( 'oembed_default_width', 600 ); + + register_rest_route( + 'oembed/1.0', + '/embed', + array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'args' => array( + 'url' => array( + 'required' => true, + 'sanitize_callback' => 'esc_url_raw', + ), + 'format' => array( + 'default' => 'json', + 'sanitize_callback' => 'wp_oembed_ensure_format', + ), + 'maxwidth' => array( + 'default' => $maxwidth, + 'sanitize_callback' => 'absint', + ), + ), + ), + ) + ); + + register_rest_route( + 'oembed/1.0', + '/proxy', + array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_proxy_item' ), + 'permission_callback' => array( $this, 'get_proxy_item_permissions_check' ), + 'args' => array( + 'url' => array( + 'description' => __( 'The URL of the resource for which to fetch oEmbed data.' ), + 'type' => 'string', + 'required' => true, + 'sanitize_callback' => 'esc_url_raw', + ), + 'format' => array( + 'description' => __( 'The oEmbed format to use.' ), + 'type' => 'string', + 'default' => 'json', + 'enum' => array( + 'json', + 'xml', + ), + ), + 'maxwidth' => array( + 'description' => __( 'The maximum width of the embed frame in pixels.' ), + 'type' => 'integer', + 'default' => $maxwidth, + 'sanitize_callback' => 'absint', + ), + 'maxheight' => array( + 'description' => __( 'The maximum height of the embed frame in pixels.' ), + 'type' => 'integer', + 'sanitize_callback' => 'absint', + ), + 'discover' => array( + 'description' => __( 'Whether to perform an oEmbed discovery request for non-whitelisted providers.' ), + 'type' => 'boolean', + 'default' => true, + ), + ), + ), + ) + ); + } + + /** + * Callback for the embed API endpoint. + * + * Returns the JSON object for the post. + * + * @since 4.4.0 + * + * @param WP_REST_Request $request Full data about the request. + * @return array|WP_Error oEmbed response data or WP_Error on failure. + */ + public function get_item( $request ) { + $post_id = url_to_postid( $request['url'] ); + + /** + * Filters the determined post ID. + * + * @since 4.4.0 + * + * @param int $post_id The post ID. + * @param string $url The requested URL. + */ + $post_id = apply_filters( 'oembed_request_post_id', $post_id, $request['url'] ); + + $data = get_oembed_response_data( $post_id, $request['maxwidth'] ); + + if ( ! $data ) { + return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); + } + + return $data; + } + + /** + * Checks if current user can make a proxy oEmbed request. + * + * @since 4.8.0 + * + * @return true|WP_Error True if the request has read access, WP_Error object otherwise. + */ + public function get_proxy_item_permissions_check() { + if ( ! current_user_can( 'edit_posts' ) ) { + return new WP_Error( 'rest_forbidden', __( 'Sorry, you are not allowed to make proxied oEmbed requests.' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Callback for the proxy API endpoint. + * + * Returns the JSON object for the proxied item. + * + * @since 4.8.0 + * + * @see WP_oEmbed::get_html() + * @param WP_REST_Request $request Full data about the request. + * @return object|WP_Error oEmbed response data or WP_Error on failure. + */ + public function get_proxy_item( $request ) { + $args = $request->get_params(); + + // Serve oEmbed data from cache if set. + unset( $args['_wpnonce'] ); + $cache_key = 'oembed_' . md5( serialize( $args ) ); + $data = get_transient( $cache_key ); + if ( ! empty( $data ) ) { + return $data; + } + + $url = $request['url']; + unset( $args['url'] ); + + // Copy maxwidth/maxheight to width/height since WP_oEmbed::fetch() uses these arg names. + if ( isset( $args['maxwidth'] ) ) { + $args['width'] = $args['maxwidth']; + } + if ( isset( $args['maxheight'] ) ) { + $args['height'] = $args['maxheight']; + } + + // Short-circuit process for URLs belonging to the current site. + $data = get_oembed_response_data_for_url( $url, $args ); + + if ( $data ) { + return $data; + } + + $data = _wp_oembed_get_object()->get_data( $url, $args ); + + if ( false === $data ) { + return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); + } + + /** This filter is documented in wp-includes/class-wp-oembed.php */ + $data->html = apply_filters( 'oembed_result', _wp_oembed_get_object()->data2html( (object) $data, $url ), $url, $args ); + + /** + * Filters the oEmbed TTL value (time to live). + * + * Similar to the {@see 'oembed_ttl'} filter, but for the REST API + * oEmbed proxy endpoint. + * + * @since 4.8.0 + * + * @param int $time Time to live (in seconds). + * @param string $url The attempted embed URL. + * @param array $args An array of embed request arguments. + */ + $ttl = apply_filters( 'rest_oembed_ttl', DAY_IN_SECONDS, $url, $args ); + + set_transient( $cache_key, $data, $ttl ); + + return $data; + } +} diff --git a/wp-includes/class-wp-oembed.php b/wp-includes/class-wp-oembed.php new file mode 100644 index 0000000..93795c3 --- /dev/null +++ b/wp-includes/class-wp-oembed.php @@ -0,0 +1,753 @@ +<?php +/** + * API for fetching the HTML to embed remote content based on a provided URL + * + * Used internally by the WP_Embed class, but is designed to be generic. + * + * @link https://wordpress.org/support/article/embeds/ + * @link http://oembed.com/ + * + * @package WordPress + * @subpackage oEmbed + */ + +/** + * Core class used to implement oEmbed functionality. + * + * @since 2.9.0 + */ +class WP_oEmbed { + + /** + * A list of oEmbed providers. + * + * @since 2.9.0 + * @var array + */ + public $providers = array(); + + /** + * A list of an early oEmbed providers. + * + * @since 4.0.0 + * @var array + */ + public static $early_providers = array(); + + /** + * A list of private/protected methods, used for backward compatibility. + * + * @since 4.2.0 + * @var array + */ + private $compat_methods = array( '_fetch_with_format', '_parse_json', '_parse_xml', '_parse_xml_body' ); + + /** + * Constructor. + * + * @since 2.9.0 + */ + public function __construct() { + $host = urlencode( home_url() ); + $providers = array( + '#https?://((m|www)\.)?youtube\.com/watch.*#i' => array( 'https://www.youtube.com/oembed', true ), + '#https?://((m|www)\.)?youtube\.com/playlist.*#i' => array( 'https://www.youtube.com/oembed', true ), + '#https?://youtu\.be/.*#i' => array( 'https://www.youtube.com/oembed', true ), + '#https?://(.+\.)?vimeo\.com/.*#i' => array( 'https://vimeo.com/api/oembed.{format}', true ), + '#https?://(www\.)?dailymotion\.com/.*#i' => array( 'https://www.dailymotion.com/services/oembed', true ), + '#https?://dai\.ly/.*#i' => array( 'https://www.dailymotion.com/services/oembed', true ), + '#https?://(www\.)?flickr\.com/.*#i' => array( 'https://www.flickr.com/services/oembed/', true ), + '#https?://flic\.kr/.*#i' => array( 'https://www.flickr.com/services/oembed/', true ), + '#https?://(.+\.)?smugmug\.com/.*#i' => array( 'https://api.smugmug.com/services/oembed/', true ), + '#https?://(www\.)?hulu\.com/watch/.*#i' => array( 'https://www.hulu.com/api/oembed.{format}', true ), + '#https?://(www\.)?scribd\.com/(doc|document)/.*#i' => array( 'https://www.scribd.com/services/oembed', true ), + '#https?://wordpress\.tv/.*#i' => array( 'https://wordpress.tv/oembed/', true ), + '#https?://(.+\.)?polldaddy\.com/.*#i' => array( 'https://api.crowdsignal.com/oembed', true ), + '#https?://poll\.fm/.*#i' => array( 'https://api.crowdsignal.com/oembed', true ), + '#https?://(.+\.)?survey\.fm/.*#i' => array( 'https://api.crowdsignal.com/oembed', true ), + '#https?://(www\.)?twitter\.com/\w{1,15}/status(es)?/.*#i' => array( 'https://publish.twitter.com/oembed', true ), + '#https?://(www\.)?twitter\.com/\w{1,15}$#i' => array( 'https://publish.twitter.com/oembed', true ), + '#https?://(www\.)?twitter\.com/\w{1,15}/likes$#i' => array( 'https://publish.twitter.com/oembed', true ), + '#https?://(www\.)?twitter\.com/\w{1,15}/lists/.*#i' => array( 'https://publish.twitter.com/oembed', true ), + '#https?://(www\.)?twitter\.com/\w{1,15}/timelines/.*#i' => array( 'https://publish.twitter.com/oembed', true ), + '#https?://(www\.)?twitter\.com/i/moments/.*#i' => array( 'https://publish.twitter.com/oembed', true ), + '#https?://(www\.)?soundcloud\.com/.*#i' => array( 'https://soundcloud.com/oembed', true ), + '#https?://(.+?\.)?slideshare\.net/.*#i' => array( 'https://www.slideshare.net/api/oembed/2', true ), + '#https?://(www\.)?instagr(\.am|am\.com)/(p|tv)/.*#i' => array( 'https://api.instagram.com/oembed', true ), + '#https?://(open|play)\.spotify\.com/.*#i' => array( 'https://embed.spotify.com/oembed/', true ), + '#https?://(.+\.)?imgur\.com/.*#i' => array( 'https://api.imgur.com/oembed', true ), + '#https?://(www\.)?meetu(\.ps|p\.com)/.*#i' => array( 'https://api.meetup.com/oembed', true ), + '#https?://(www\.)?issuu\.com/.+/docs/.+#i' => array( 'https://issuu.com/oembed_wp', true ), + '#https?://(www\.)?mixcloud\.com/.*#i' => array( 'https://www.mixcloud.com/oembed', true ), + '#https?://(www\.|embed\.)?ted\.com/talks/.*#i' => array( 'https://www.ted.com/services/v1/oembed.{format}', true ), + '#https?://(www\.)?(animoto|video214)\.com/play/.*#i' => array( 'https://animoto.com/oembeds/create', true ), + '#https?://(.+)\.tumblr\.com/post/.*#i' => array( 'https://www.tumblr.com/oembed/1.0', true ), + '#https?://(www\.)?kickstarter\.com/projects/.*#i' => array( 'https://www.kickstarter.com/services/oembed', true ), + '#https?://kck\.st/.*#i' => array( 'https://www.kickstarter.com/services/oembed', true ), + '#https?://cloudup\.com/.*#i' => array( 'https://cloudup.com/oembed', true ), + '#https?://(www\.)?reverbnation\.com/.*#i' => array( 'https://www.reverbnation.com/oembed', true ), + '#https?://videopress\.com/v/.*#' => array( 'https://public-api.wordpress.com/oembed/?for=' . $host, true ), + '#https?://(www\.)?reddit\.com/r/[^/]+/comments/.*#i' => array( 'https://www.reddit.com/oembed', true ), + '#https?://(www\.)?speakerdeck\.com/.*#i' => array( 'https://speakerdeck.com/oembed.{format}', true ), + '#https?://www\.facebook\.com/.*/posts/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), + '#https?://www\.facebook\.com/.*/activity/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), + '#https?://www\.facebook\.com/.*/photos/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), + '#https?://www\.facebook\.com/photo(s/|\.php).*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), + '#https?://www\.facebook\.com/permalink\.php.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), + '#https?://www\.facebook\.com/media/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), + '#https?://www\.facebook\.com/questions/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), + '#https?://www\.facebook\.com/notes/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), + '#https?://www\.facebook\.com/.*/videos/.*#i' => array( 'https://www.facebook.com/plugins/video/oembed.json/', true ), + '#https?://www\.facebook\.com/video\.php.*#i' => array( 'https://www.facebook.com/plugins/video/oembed.json/', true ), + '#https?://(www\.)?screencast\.com/.*#i' => array( 'https://api.screencast.com/external/oembed', true ), + '#https?://([a-z0-9-]+\.)?amazon\.(com|com\.mx|com\.br|ca)/.*#i' => array( 'https://read.amazon.com/kp/api/oembed', true ), + '#https?://([a-z0-9-]+\.)?amazon\.(co\.uk|de|fr|it|es|in|nl|ru)/.*#i' => array( 'https://read.amazon.co.uk/kp/api/oembed', true ), + '#https?://([a-z0-9-]+\.)?amazon\.(co\.jp|com\.au)/.*#i' => array( 'https://read.amazon.com.au/kp/api/oembed', true ), + '#https?://([a-z0-9-]+\.)?amazon\.cn/.*#i' => array( 'https://read.amazon.cn/kp/api/oembed', true ), + '#https?://(www\.)?a\.co/.*#i' => array( 'https://read.amazon.com/kp/api/oembed', true ), + '#https?://(www\.)?amzn\.to/.*#i' => array( 'https://read.amazon.com/kp/api/oembed', true ), + '#https?://(www\.)?amzn\.eu/.*#i' => array( 'https://read.amazon.co.uk/kp/api/oembed', true ), + '#https?://(www\.)?amzn\.in/.*#i' => array( 'https://read.amazon.in/kp/api/oembed', true ), + '#https?://(www\.)?amzn\.asia/.*#i' => array( 'https://read.amazon.com.au/kp/api/oembed', true ), + '#https?://(www\.)?z\.cn/.*#i' => array( 'https://read.amazon.cn/kp/api/oembed', true ), + '#https?://www\.someecards\.com/.+-cards/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ), + '#https?://www\.someecards\.com/usercards/viewcard/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ), + '#https?://some\.ly\/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ), + '#https?://(www\.)?tiktok\.com/.*/video/.*#i' => array( 'https://www.tiktok.com/oembed', true ), + ); + + if ( ! empty( self::$early_providers['add'] ) ) { + foreach ( self::$early_providers['add'] as $format => $data ) { + $providers[ $format ] = $data; + } + } + + if ( ! empty( self::$early_providers['remove'] ) ) { + foreach ( self::$early_providers['remove'] as $format ) { + unset( $providers[ $format ] ); + } + } + + self::$early_providers = array(); + + /** + * Filters the list of whitelisted oEmbed providers. + * + * Since WordPress 4.4, oEmbed discovery is enabled for all users and allows embedding of sanitized + * iframes. The providers in this list are whitelisted, meaning they are trusted and allowed to + * embed any content, such as iframes, videos, JavaScript, and arbitrary HTML. + * + * Supported providers: + * + * | Provider | Flavor | Since | + * | ------------ | ----------------------------------------- | ------- | + * | Dailymotion | dailymotion.com | 2.9.0 | + * | Flickr | flickr.com | 2.9.0 | + * | Hulu | hulu.com | 2.9.0 | + * | Scribd | scribd.com | 2.9.0 | + * | Vimeo | vimeo.com | 2.9.0 | + * | WordPress.tv | wordpress.tv | 2.9.0 | + * | YouTube | youtube.com/watch | 2.9.0 | + * | Crowdsignal | polldaddy.com | 3.0.0 | + * | SmugMug | smugmug.com | 3.0.0 | + * | YouTube | youtu.be | 3.0.0 | + * | Twitter | twitter.com | 3.4.0 | + * | Instagram | instagram.com | 3.5.0 | + * | Instagram | instagr.am | 3.5.0 | + * | Slideshare | slideshare.net | 3.5.0 | + * | SoundCloud | soundcloud.com | 3.5.0 | + * | Dailymotion | dai.ly | 3.6.0 | + * | Flickr | flic.kr | 3.6.0 | + * | Spotify | spotify.com | 3.6.0 | + * | Imgur | imgur.com | 3.9.0 | + * | Meetup.com | meetup.com | 3.9.0 | + * | Meetup.com | meetu.ps | 3.9.0 | + * | Animoto | animoto.com | 4.0.0 | + * | Animoto | video214.com | 4.0.0 | + * | Issuu | issuu.com | 4.0.0 | + * | Mixcloud | mixcloud.com | 4.0.0 | + * | Crowdsignal | poll.fm | 4.0.0 | + * | TED | ted.com | 4.0.0 | + * | YouTube | youtube.com/playlist | 4.0.0 | + * | Tumblr | tumblr.com | 4.2.0 | + * | Kickstarter | kickstarter.com | 4.2.0 | + * | Kickstarter | kck.st | 4.2.0 | + * | Cloudup | cloudup.com | 4.3.0 | + * | ReverbNation | reverbnation.com | 4.4.0 | + * | VideoPress | videopress.com | 4.4.0 | + * | Reddit | reddit.com | 4.4.0 | + * | Speaker Deck | speakerdeck.com | 4.4.0 | + * | Twitter | twitter.com/timelines | 4.5.0 | + * | Twitter | twitter.com/moments | 4.5.0 | + * | Facebook | facebook.com | 4.7.0 | + * | Twitter | twitter.com/user | 4.7.0 | + * | Twitter | twitter.com/likes | 4.7.0 | + * | Twitter | twitter.com/lists | 4.7.0 | + * | Screencast | screencast.com | 4.8.0 | + * | Amazon | amazon.com (com.mx, com.br, ca) | 4.9.0 | + * | Amazon | amazon.de (fr, it, es, in, nl, ru, co.uk) | 4.9.0 | + * | Amazon | amazon.co.jp (com.au) | 4.9.0 | + * | Amazon | amazon.cn | 4.9.0 | + * | Amazon | a.co | 4.9.0 | + * | Amazon | amzn.to (eu, in, asia) | 4.9.0 | + * | Amazon | z.cn | 4.9.0 | + * | Someecards | someecards.com | 4.9.0 | + * | Someecards | some.ly | 4.9.0 | + * | Crowdsignal | survey.fm | 5.1.0 | + * | Instagram TV | instagram.com | 5.1.0 | + * | Instagram TV | instagr.am | 5.1.0 | + * | TikTok | tiktok.com | 5.4.0 | + * + * No longer supported providers: + * + * | Provider | Flavor | Since | Removed | + * | ------------ | -------------------- | --------- | --------- | + * | Qik | qik.com | 2.9.0 | 3.9.0 | + * | Viddler | viddler.com | 2.9.0 | 4.0.0 | + * | Revision3 | revision3.com | 2.9.0 | 4.2.0 | + * | Blip | blip.tv | 2.9.0 | 4.4.0 | + * | Rdio | rdio.com | 3.6.0 | 4.4.1 | + * | Rdio | rd.io | 3.6.0 | 4.4.1 | + * | Vine | vine.co | 4.1.0 | 4.9.0 | + * | Photobucket | photobucket.com | 2.9.0 | 5.1.0 | + * | Funny or Die | funnyordie.com | 3.0.0 | 5.1.0 | + * | CollegeHumor | collegehumor.com | 4.0.0 | 5.3.1 | + * + * @see wp_oembed_add_provider() + * + * @since 2.9.0 + * + * @param array[] $providers An array of arrays containing data about popular oEmbed providers. + */ + $this->providers = apply_filters( 'oembed_providers', $providers ); + + // Fix any embeds that contain new lines in the middle of the HTML which breaks wpautop(). + add_filter( 'oembed_dataparse', array( $this, '_strip_newlines' ), 10, 3 ); + } + + /** + * Exposes private/protected methods for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Method to call. + * @param array $arguments Arguments to pass when calling. + * @return mixed|bool Return value of the callback, false otherwise. + */ + public function __call( $name, $arguments ) { + if ( in_array( $name, $this->compat_methods ) ) { + return $this->$name( ...$arguments ); + } + return false; + } + + /** + * Takes a URL and returns the corresponding oEmbed provider's URL, if there is one. + * + * @since 4.0.0 + * + * @see WP_oEmbed::discover() + * + * @param string $url The URL to the content. + * @param string|array $args Optional provider arguments. + * @return string|false The oEmbed provider URL on success, false on failure. + */ + public function get_provider( $url, $args = '' ) { + $args = wp_parse_args( $args ); + + $provider = false; + + if ( ! isset( $args['discover'] ) ) { + $args['discover'] = true; + } + + foreach ( $this->providers as $matchmask => $data ) { + list( $providerurl, $regex ) = $data; + + // Turn the asterisk-type provider URLs into regex. + if ( ! $regex ) { + $matchmask = '#' . str_replace( '___wildcard___', '(.+)', preg_quote( str_replace( '*', '___wildcard___', $matchmask ), '#' ) ) . '#i'; + $matchmask = preg_replace( '|^#http\\\://|', '#https?\://', $matchmask ); + } + + if ( preg_match( $matchmask, $url ) ) { + $provider = str_replace( '{format}', 'json', $providerurl ); // JSON is easier to deal with than XML. + break; + } + } + + if ( ! $provider && $args['discover'] ) { + $provider = $this->discover( $url ); + } + + return $provider; + } + + /** + * Adds an oEmbed provider. + * + * The provider is added just-in-time when wp_oembed_add_provider() is called before + * the {@see 'plugins_loaded'} hook. + * + * The just-in-time addition is for the benefit of the {@see 'oembed_providers'} filter. + * + * @since 4.0.0 + * + * @see wp_oembed_add_provider() + * + * @param string $format Format of URL that this provider can handle. You can use + * asterisks as wildcards. + * @param string $provider The URL to the oEmbed provider.. + * @param bool $regex Optional. Whether the $format parameter is in a regex format. + * Default false. + */ + public static function _add_provider_early( $format, $provider, $regex = false ) { + if ( empty( self::$early_providers['add'] ) ) { + self::$early_providers['add'] = array(); + } + + self::$early_providers['add'][ $format ] = array( $provider, $regex ); + } + + /** + * Removes an oEmbed provider. + * + * The provider is removed just-in-time when wp_oembed_remove_provider() is called before + * the {@see 'plugins_loaded'} hook. + * + * The just-in-time removal is for the benefit of the {@see 'oembed_providers'} filter. + * + * @since 4.0.0 + * + * @see wp_oembed_remove_provider() + * + * @param string $format The format of URL that this provider can handle. You can use + * asterisks as wildcards. + */ + public static function _remove_provider_early( $format ) { + if ( empty( self::$early_providers['remove'] ) ) { + self::$early_providers['remove'] = array(); + } + + self::$early_providers['remove'][] = $format; + } + + /** + * Takes a URL and attempts to return the oEmbed data. + * + * @see WP_oEmbed::fetch() + * + * @since 4.8.0 + * + * @param string $url The URL to the content that should be attempted to be embedded. + * @param array|string $args Optional. Arguments, usually passed from a shortcode. Default empty. + * @return object|false The result in the form of an object on success, false on failure. + */ + public function get_data( $url, $args = '' ) { + $args = wp_parse_args( $args ); + + $provider = $this->get_provider( $url, $args ); + + if ( ! $provider ) { + return false; + } + + $data = $this->fetch( $provider, $url, $args ); + + if ( false === $data ) { + return false; + } + + return $data; + } + + /** + * The do-it-all function that takes a URL and attempts to return the HTML. + * + * @see WP_oEmbed::fetch() + * @see WP_oEmbed::data2html() + * + * @since 2.9.0 + * + * @param string $url The URL to the content that should be attempted to be embedded. + * @param array|string $args Optional. Arguments, usually passed from a shortcode. Default empty. + * @return string|false The UNSANITIZED (and potentially unsafe) HTML that should be used to embed on success, + * false on failure. + */ + public function get_html( $url, $args = '' ) { + /** + * Filters the oEmbed result before any HTTP requests are made. + * + * This allows one to short-circuit the default logic, perhaps by + * replacing it with a routine that is more optimal for your setup. + * + * Passing a non-null value to the filter will effectively short-circuit retrieval, + * returning the passed value instead. + * + * @since 4.5.3 + * + * @param null|string $result The UNSANITIZED (and potentially unsafe) HTML that should be used to embed. + * Default null to continue retrieving the result. + * @param string $url The URL to the content that should be attempted to be embedded. + * @param array $args Optional. Arguments, usually passed from a shortcode. Default empty. + */ + $pre = apply_filters( 'pre_oembed_result', null, $url, $args ); + + if ( null !== $pre ) { + return $pre; + } + + $data = $this->get_data( $url, $args ); + + if ( false === $data ) { + return false; + } + + /** + * Filters the HTML returned by the oEmbed provider. + * + * @since 2.9.0 + * + * @param string|false $data The returned oEmbed HTML (false if unsafe). + * @param string $url URL of the content to be embedded. + * @param array $args Optional arguments, usually passed from a shortcode. + */ + return apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args ); + } + + /** + * Attempts to discover link tags at the given URL for an oEmbed provider. + * + * @since 2.9.0 + * + * @param string $url The URL that should be inspected for discovery `<link>` tags. + * @return string|false The oEmbed provider URL on success, false on failure. + */ + public function discover( $url ) { + $providers = array(); + $args = array( + 'limit_response_size' => 153600, // 150 KB + ); + + /** + * Filters oEmbed remote get arguments. + * + * @since 4.0.0 + * + * @see WP_Http::request() + * + * @param array $args oEmbed remote get arguments. + * @param string $url URL to be inspected. + */ + $args = apply_filters( 'oembed_remote_get_args', $args, $url ); + + // Fetch URL content. + $request = wp_safe_remote_get( $url, $args ); + $html = wp_remote_retrieve_body( $request ); + if ( $html ) { + + /** + * Filters the link types that contain oEmbed provider URLs. + * + * @since 2.9.0 + * + * @param string[] $format Array of oEmbed link types. Accepts 'application/json+oembed', + * 'text/xml+oembed', and 'application/xml+oembed' (incorrect, + * used by at least Vimeo). + */ + $linktypes = apply_filters( + 'oembed_linktypes', + array( + 'application/json+oembed' => 'json', + 'text/xml+oembed' => 'xml', + 'application/xml+oembed' => 'xml', + ) + ); + + // Strip <body>. + $html_head_end = stripos( $html, '</head>' ); + if ( $html_head_end ) { + $html = substr( $html, 0, $html_head_end ); + } + + // Do a quick check. + $tagfound = false; + foreach ( $linktypes as $linktype => $format ) { + if ( stripos( $html, $linktype ) ) { + $tagfound = true; + break; + } + } + + if ( $tagfound && preg_match_all( '#<link([^<>]+)/?>#iU', $html, $links ) ) { + foreach ( $links[1] as $link ) { + $atts = shortcode_parse_atts( $link ); + + if ( ! empty( $atts['type'] ) && ! empty( $linktypes[ $atts['type'] ] ) && ! empty( $atts['href'] ) ) { + $providers[ $linktypes[ $atts['type'] ] ] = htmlspecialchars_decode( $atts['href'] ); + + // Stop here if it's JSON (that's all we need). + if ( 'json' == $linktypes[ $atts['type'] ] ) { + break; + } + } + } + } + } + + // JSON is preferred to XML. + if ( ! empty( $providers['json'] ) ) { + return $providers['json']; + } elseif ( ! empty( $providers['xml'] ) ) { + return $providers['xml']; + } else { + return false; + } + } + + /** + * Connects to a oEmbed provider and returns the result. + * + * @since 2.9.0 + * + * @param string $provider The URL to the oEmbed provider. + * @param string $url The URL to the content that is desired to be embedded. + * @param array|string $args Optional. Arguments, usually passed from a shortcode. Default empty. + * @return object|false The result in the form of an object on success, false on failure. + */ + public function fetch( $provider, $url, $args = '' ) { + $args = wp_parse_args( $args, wp_embed_defaults( $url ) ); + + $provider = add_query_arg( 'maxwidth', (int) $args['width'], $provider ); + $provider = add_query_arg( 'maxheight', (int) $args['height'], $provider ); + $provider = add_query_arg( 'url', urlencode( $url ), $provider ); + $provider = add_query_arg( 'dnt', 1, $provider ); + + /** + * Filters the oEmbed URL to be fetched. + * + * @since 2.9.0 + * @since 4.9.0 The `dnt` (Do Not Track) query parameter was added to all oEmbed provider URLs. + * + * @param string $provider URL of the oEmbed provider. + * @param string $url URL of the content to be embedded. + * @param array $args Optional arguments, usually passed from a shortcode. + */ + $provider = apply_filters( 'oembed_fetch_url', $provider, $url, $args ); + + foreach ( array( 'json', 'xml' ) as $format ) { + $result = $this->_fetch_with_format( $provider, $format ); + if ( is_wp_error( $result ) && 'not-implemented' == $result->get_error_code() ) { + continue; + } + return ( $result && ! is_wp_error( $result ) ) ? $result : false; + } + return false; + } + + /** + * Fetches result from an oEmbed provider for a specific format and complete provider URL + * + * @since 3.0.0 + * + * @param string $provider_url_with_args URL to the provider with full arguments list (url, maxheight, etc.) + * @param string $format Format to use. + * @return object|false|WP_Error The result in the form of an object on success, false on failure. + */ + private function _fetch_with_format( $provider_url_with_args, $format ) { + $provider_url_with_args = add_query_arg( 'format', $format, $provider_url_with_args ); + + /** This filter is documented in wp-includes/class-wp-oembed.php */ + $args = apply_filters( 'oembed_remote_get_args', array(), $provider_url_with_args ); + + $response = wp_safe_remote_get( $provider_url_with_args, $args ); + if ( 501 == wp_remote_retrieve_response_code( $response ) ) { + return new WP_Error( 'not-implemented' ); + } + $body = wp_remote_retrieve_body( $response ); + if ( ! $body ) { + return false; + } + $parse_method = "_parse_$format"; + return $this->$parse_method( $body ); + } + + /** + * Parses a json response body. + * + * @since 3.0.0 + * + * @param string $response_body + * @return object|false + */ + private function _parse_json( $response_body ) { + $data = json_decode( trim( $response_body ) ); + return ( $data && is_object( $data ) ) ? $data : false; + } + + /** + * Parses an XML response body. + * + * @since 3.0.0 + * + * @param string $response_body + * @return object|false + */ + private function _parse_xml( $response_body ) { + if ( ! function_exists( 'libxml_disable_entity_loader' ) ) { + return false; + } + + $loader = libxml_disable_entity_loader( true ); + $errors = libxml_use_internal_errors( true ); + + $return = $this->_parse_xml_body( $response_body ); + + libxml_use_internal_errors( $errors ); + libxml_disable_entity_loader( $loader ); + + return $return; + } + + /** + * Serves as a helper function for parsing an XML response body. + * + * @since 3.6.0 + * + * @param string $response_body + * @return stdClass|false + */ + private function _parse_xml_body( $response_body ) { + if ( ! function_exists( 'simplexml_import_dom' ) || ! class_exists( 'DOMDocument', false ) ) { + return false; + } + + $dom = new DOMDocument; + $success = $dom->loadXML( $response_body ); + if ( ! $success ) { + return false; + } + + if ( isset( $dom->doctype ) ) { + return false; + } + + foreach ( $dom->childNodes as $child ) { + if ( XML_DOCUMENT_TYPE_NODE === $child->nodeType ) { + return false; + } + } + + $xml = simplexml_import_dom( $dom ); + if ( ! $xml ) { + return false; + } + + $return = new stdClass; + foreach ( $xml as $key => $value ) { + $return->$key = (string) $value; + } + + return $return; + } + + /** + * Converts a data object from WP_oEmbed::fetch() and returns the HTML. + * + * @since 2.9.0 + * + * @param object $data A data object result from an oEmbed provider. + * @param string $url The URL to the content that is desired to be embedded. + * @return string|false The HTML needed to embed on success, false on failure. + */ + public function data2html( $data, $url ) { + if ( ! is_object( $data ) || empty( $data->type ) ) { + return false; + } + + $return = false; + + switch ( $data->type ) { + case 'photo': + if ( empty( $data->url ) || empty( $data->width ) || empty( $data->height ) ) { + break; + } + if ( ! is_string( $data->url ) || ! is_numeric( $data->width ) || ! is_numeric( $data->height ) ) { + break; + } + + $title = ! empty( $data->title ) && is_string( $data->title ) ? $data->title : ''; + $return = '<a href="' . esc_url( $url ) . '"><img src="' . esc_url( $data->url ) . '" alt="' . esc_attr( $title ) . '" width="' . esc_attr( $data->width ) . '" height="' . esc_attr( $data->height ) . '" /></a>'; + break; + + case 'video': + case 'rich': + if ( ! empty( $data->html ) && is_string( $data->html ) ) { + $return = $data->html; + } + break; + + case 'link': + if ( ! empty( $data->title ) && is_string( $data->title ) ) { + $return = '<a href="' . esc_url( $url ) . '">' . esc_html( $data->title ) . '</a>'; + } + break; + + default: + $return = false; + } + + /** + * Filters the returned oEmbed HTML. + * + * Use this filter to add support for custom data types, or to filter the result. + * + * @since 2.9.0 + * + * @param string $return The returned oEmbed HTML. + * @param object $data A data object result from an oEmbed provider. + * @param string $url The URL of the content to be embedded. + */ + return apply_filters( 'oembed_dataparse', $return, $data, $url ); + } + + /** + * Strips any new lines from the HTML. + * + * @since 2.9.0 as strip_scribd_newlines() + * @since 3.0.0 + * + * @param string $html Existing HTML. + * @param object $data Data object from WP_oEmbed::data2html() + * @param string $url The original URL passed to oEmbed. + * @return string Possibly modified $html + */ + public function _strip_newlines( $html, $data, $url ) { + if ( false === strpos( $html, "\n" ) ) { + return $html; + } + + $count = 1; + $found = array(); + $token = '__PRE__'; + $search = array( "\t", "\n", "\r", ' ' ); + $replace = array( '__TAB__', '__NL__', '__CR__', '__SPACE__' ); + $tokenized = str_replace( $search, $replace, $html ); + + preg_match_all( '#(<pre[^>]*>.+?</pre>)#i', $tokenized, $matches, PREG_SET_ORDER ); + foreach ( $matches as $i => $match ) { + $tag_html = str_replace( $replace, $search, $match[0] ); + $tag_token = $token . $i; + + $found[ $tag_token ] = $tag_html; + $html = str_replace( $tag_html, $tag_token, $html, $count ); + } + + $replaced = str_replace( $replace, $search, $html ); + $stripped = str_replace( array( "\r\n", "\n" ), '', $replaced ); + $pre = array_values( $found ); + $tokens = array_keys( $found ); + + return str_replace( $tokens, $pre, $stripped ); + } +} diff --git a/wp-includes/class-wp-paused-extensions-storage.php b/wp-includes/class-wp-paused-extensions-storage.php new file mode 100644 index 0000000..993ab06 --- /dev/null +++ b/wp-includes/class-wp-paused-extensions-storage.php @@ -0,0 +1,223 @@ +<?php +/** + * Error Protection API: WP_Paused_Extensions_Storage class + * + * @package WordPress + * @since 5.2.0 + */ + +/** + * Core class used for storing paused extensions. + * + * @since 5.2.0 + */ +class WP_Paused_Extensions_Storage { + + /** + * Type of extension. Used to key extension storage. + * + * @since 5.2.0 + * @var string + */ + protected $type; + + /** + * Constructor. + * + * @since 5.2.0 + * + * @param string $extension_type Extension type. Either 'plugin' or 'theme'. + */ + public function __construct( $extension_type ) { + $this->type = $extension_type; + } + + /** + * Records an extension error. + * + * Only one error is stored per extension, with subsequent errors for the same extension overriding the + * previously stored error. + * + * @since 5.2.0 + * + * @param string $extension Plugin or theme directory name. + * @param array $error { + * Error that was triggered. + * + * @type string $type The error type. + * @type string $file The name of the file in which the error occurred. + * @type string $line The line number in which the error occurred. + * @type string $message The error message. + * } + * @return bool True on success, false on failure. + */ + public function set( $extension, $error ) { + if ( ! $this->is_api_loaded() ) { + return false; + } + + $option_name = $this->get_option_name(); + + if ( ! $option_name ) { + return false; + } + + $paused_extensions = (array) get_option( $option_name, array() ); + + // Do not update if the error is already stored. + if ( isset( $paused_extensions[ $this->type ][ $extension ] ) && $paused_extensions[ $this->type ][ $extension ] === $error ) { + return true; + } + + $paused_extensions[ $this->type ][ $extension ] = $error; + + return update_option( $option_name, $paused_extensions ); + } + + /** + * Forgets a previously recorded extension error. + * + * @since 5.2.0 + * + * @param string $extension Plugin or theme directory name. + * + * @return bool True on success, false on failure. + */ + public function delete( $extension ) { + if ( ! $this->is_api_loaded() ) { + return false; + } + + $option_name = $this->get_option_name(); + + if ( ! $option_name ) { + return false; + } + + $paused_extensions = (array) get_option( $option_name, array() ); + + // Do not delete if no error is stored. + if ( ! isset( $paused_extensions[ $this->type ][ $extension ] ) ) { + return true; + } + + unset( $paused_extensions[ $this->type ][ $extension ] ); + + if ( empty( $paused_extensions[ $this->type ] ) ) { + unset( $paused_extensions[ $this->type ] ); + } + + // Clean up the entire option if we're removing the only error. + if ( ! $paused_extensions ) { + return delete_option( $option_name ); + } + + return update_option( $option_name, $paused_extensions ); + } + + /** + * Gets the error for an extension, if paused. + * + * @since 5.2.0 + * + * @param string $extension Plugin or theme directory name. + * + * @return array|null Error that is stored, or null if the extension is not paused. + */ + public function get( $extension ) { + if ( ! $this->is_api_loaded() ) { + return null; + } + + $paused_extensions = $this->get_all(); + + if ( ! isset( $paused_extensions[ $extension ] ) ) { + return null; + } + + return $paused_extensions[ $extension ]; + } + + /** + * Gets the paused extensions with their errors. + * + * @since 5.2.0 + * + * @return array Associative array of extension slugs to the error recorded. + */ + public function get_all() { + if ( ! $this->is_api_loaded() ) { + return array(); + } + + $option_name = $this->get_option_name(); + + if ( ! $option_name ) { + return array(); + } + + $paused_extensions = (array) get_option( $option_name, array() ); + + return isset( $paused_extensions[ $this->type ] ) ? $paused_extensions[ $this->type ] : array(); + } + + /** + * Remove all paused extensions. + * + * @since 5.2.0 + * + * @return bool + */ + public function delete_all() { + if ( ! $this->is_api_loaded() ) { + return false; + } + + $option_name = $this->get_option_name(); + + if ( ! $option_name ) { + return false; + } + + $paused_extensions = (array) get_option( $option_name, array() ); + + unset( $paused_extensions[ $this->type ] ); + + if ( ! $paused_extensions ) { + return delete_option( $option_name ); + } + + return update_option( $option_name, $paused_extensions ); + } + + /** + * Checks whether the underlying API to store paused extensions is loaded. + * + * @since 5.2.0 + * + * @return bool True if the API is loaded, false otherwise. + */ + protected function is_api_loaded() { + return function_exists( 'get_option' ); + } + + /** + * Get the option name for storing paused extensions. + * + * @since 5.2.0 + * + * @return string + */ + protected function get_option_name() { + if ( ! wp_recovery_mode()->is_active() ) { + return ''; + } + + $session_id = wp_recovery_mode()->get_session_id(); + if ( empty( $session_id ) ) { + return ''; + } + + return "{$session_id}_paused_extensions"; + } +} diff --git a/wp-includes/class-wp-post-type.php b/wp-includes/class-wp-post-type.php new file mode 100644 index 0000000..8ea1c28 --- /dev/null +++ b/wp-includes/class-wp-post-type.php @@ -0,0 +1,731 @@ +<?php +/** + * Post API: WP_Post_Type class + * + * @package WordPress + * @subpackage Post + * @since 4.6.0 + */ + +/** + * Core class used for interacting with post types. + * + * @since 4.6.0 + * + * @see register_post_type() + */ +final class WP_Post_Type { + /** + * Post type key. + * + * @since 4.6.0 + * @var string $name + */ + public $name; + + /** + * Name of the post type shown in the menu. Usually plural. + * + * @since 4.6.0 + * @var string $label + */ + public $label; + + /** + * Labels object for this post type. + * + * If not set, post labels are inherited for non-hierarchical types + * and page labels for hierarchical ones. + * + * @see get_post_type_labels() + * + * @since 4.6.0 + * @var object $labels + */ + public $labels; + + /** + * A short descriptive summary of what the post type is. + * + * Default empty. + * + * @since 4.6.0 + * @var string $description + */ + public $description = ''; + + /** + * Whether a post type is intended for use publicly either via the admin interface or by front-end users. + * + * While the default settings of $exclude_from_search, $publicly_queryable, $show_ui, and $show_in_nav_menus + * are inherited from public, each does not rely on this relationship and controls a very specific intention. + * + * Default false. + * + * @since 4.6.0 + * @var bool $public + */ + public $public = false; + + /** + * Whether the post type is hierarchical (e.g. page). + * + * Default false. + * + * @since 4.6.0 + * @var bool $hierarchical + */ + public $hierarchical = false; + + /** + * Whether to exclude posts with this post type from front end search + * results. + * + * Default is the opposite value of $public. + * + * @since 4.6.0 + * @var bool $exclude_from_search + */ + public $exclude_from_search = null; + + /** + * Whether queries can be performed on the front end for the post type as part of `parse_request()`. + * + * Endpoints would include: + * - `?post_type={post_type_key}` + * - `?{post_type_key}={single_post_slug}` + * - `?{post_type_query_var}={single_post_slug}` + * + * Default is the value of $public. + * + * @since 4.6.0 + * @var bool $publicly_queryable + */ + public $publicly_queryable = null; + + /** + * Whether to generate and allow a UI for managing this post type in the admin. + * + * Default is the value of $public. + * + * @since 4.6.0 + * @var bool $show_ui + */ + public $show_ui = null; + + /** + * Where to show the post type in the admin menu. + * + * To work, $show_ui must be true. If true, the post type is shown in its own top level menu. If false, no menu is + * shown. If a string of an existing top level menu (eg. 'tools.php' or 'edit.php?post_type=page'), the post type + * will be placed as a sub-menu of that. + * + * Default is the value of $show_ui. + * + * @since 4.6.0 + * @var bool $show_in_menu + */ + public $show_in_menu = null; + + /** + * Makes this post type available for selection in navigation menus. + * + * Default is the value $public. + * + * @since 4.6.0 + * @var bool $show_in_nav_menus + */ + public $show_in_nav_menus = null; + + /** + * Makes this post type available via the admin bar. + * + * Default is the value of $show_in_menu. + * + * @since 4.6.0 + * @var bool $show_in_admin_bar + */ + public $show_in_admin_bar = null; + + /** + * The position in the menu order the post type should appear. + * + * To work, $show_in_menu must be true. Default null (at the bottom). + * + * @since 4.6.0 + * @var int $menu_position + */ + public $menu_position = null; + + /** + * The URL to the icon to be used for this menu. + * + * Pass a base64-encoded SVG using a data URI, which will be colored to match the color scheme. + * This should begin with 'data:image/svg+xml;base64,'. Pass the name of a Dashicons helper class + * to use a font icon, e.g. 'dashicons-chart-pie'. Pass 'none' to leave div.wp-menu-image empty + * so an icon can be added via CSS. + * + * Defaults to use the posts icon. + * + * @since 4.6.0 + * @var string $menu_icon + */ + public $menu_icon = null; + + /** + * The string to use to build the read, edit, and delete capabilities. + * + * May be passed as an array to allow for alternative plurals when using + * this argument as a base to construct the capabilities, e.g. + * array( 'story', 'stories' ). Default 'post'. + * + * @since 4.6.0 + * @var string $capability_type + */ + public $capability_type = 'post'; + + /** + * Whether to use the internal default meta capability handling. + * + * Default false. + * + * @since 4.6.0 + * @var bool $map_meta_cap + */ + public $map_meta_cap = false; + + /** + * Provide a callback function that sets up the meta boxes for the edit form. + * + * Do `remove_meta_box()` and `add_meta_box()` calls in the callback. Default null. + * + * @since 4.6.0 + * @var string $register_meta_box_cb + */ + public $register_meta_box_cb = null; + + /** + * An array of taxonomy identifiers that will be registered for the post type. + * + * Taxonomies can be registered later with `register_taxonomy()` or `register_taxonomy_for_object_type()`. + * + * Default empty array. + * + * @since 4.6.0 + * @var array $taxonomies + */ + public $taxonomies = array(); + + /** + * Whether there should be post type archives, or if a string, the archive slug to use. + * + * Will generate the proper rewrite rules if $rewrite is enabled. Default false. + * + * @since 4.6.0 + * @var bool|string $has_archive + */ + public $has_archive = false; + + /** + * Sets the query_var key for this post type. + * + * Defaults to $post_type key. If false, a post type cannot be loaded at `?{query_var}={post_slug}`. + * If specified as a string, the query `?{query_var_string}={post_slug}` will be valid. + * + * @since 4.6.0 + * @var string|bool $query_var + */ + public $query_var; + + /** + * Whether to allow this post type to be exported. + * + * Default true. + * + * @since 4.6.0 + * @var bool $can_export + */ + public $can_export = true; + + /** + * Whether to delete posts of this type when deleting a user. + * + * If true, posts of this type belonging to the user will be moved to Trash when then user is deleted. + * If false, posts of this type belonging to the user will *not* be trashed or deleted. + * If not set (the default), posts are trashed if post_type_supports( 'author' ). + * Otherwise posts are not trashed or deleted. Default null. + * + * @since 4.6.0 + * @var bool $delete_with_user + */ + public $delete_with_user = null; + + /** + * Whether this post type is a native or "built-in" post_type. + * + * Default false. + * + * @since 4.6.0 + * @var bool $_builtin + */ + public $_builtin = false; + + /** + * URL segment to use for edit link of this post type. + * + * Default 'post.php?post=%d'. + * + * @since 4.6.0 + * @var string $_edit_link + */ + public $_edit_link = 'post.php?post=%d'; + + /** + * Post type capabilities. + * + * @since 4.6.0 + * @var object $cap + */ + public $cap; + + /** + * Triggers the handling of rewrites for this post type. + * + * Defaults to true, using $post_type as slug. + * + * @since 4.6.0 + * @var array|false $rewrite + */ + public $rewrite; + + /** + * The features supported by the post type. + * + * @since 4.6.0 + * @var array|bool $supports + */ + public $supports; + + /** + * Whether this post type should appear in the REST API. + * + * Default false. If true, standard endpoints will be registered with + * respect to $rest_base and $rest_controller_class. + * + * @since 4.7.4 + * @var bool $show_in_rest + */ + public $show_in_rest; + + /** + * The base path for this post type's REST API endpoints. + * + * @since 4.7.4 + * @var string|bool $rest_base + */ + public $rest_base; + + /** + * The controller for this post type's REST API endpoints. + * + * Custom controllers must extend WP_REST_Controller. + * + * @since 4.7.4 + * @var string|bool $rest_controller_class + */ + public $rest_controller_class; + + /** + * The controller instance for this post type's REST API endpoints. + * + * Lazily computed. Should be accessed using {@see WP_Post_Type::get_rest_controller()}. + * + * @since 5.3.0 + * @var WP_REST_Controller $rest_controller + */ + public $rest_controller; + + /** + * Constructor. + * + * Will populate object properties from the provided arguments and assign other + * default properties based on that information. + * + * @since 4.6.0 + * + * @see register_post_type() + * + * @param string $post_type Post type key. + * @param array|string $args Optional. Array or string of arguments for registering a post type. + * Default empty array. + */ + public function __construct( $post_type, $args = array() ) { + $this->name = $post_type; + + $this->set_props( $args ); + } + + /** + * Sets post type properties. + * + * @since 4.6.0 + * + * @param array|string $args Array or string of arguments for registering a post type. + */ + public function set_props( $args ) { + $args = wp_parse_args( $args ); + + /** + * Filters the arguments for registering a post type. + * + * @since 4.4.0 + * + * @param array $args Array of arguments for registering a post type. + * @param string $post_type Post type key. + */ + $args = apply_filters( 'register_post_type_args', $args, $this->name ); + + $has_edit_link = ! empty( $args['_edit_link'] ); + + // Args prefixed with an underscore are reserved for internal use. + $defaults = array( + 'labels' => array(), + 'description' => '', + 'public' => false, + 'hierarchical' => false, + 'exclude_from_search' => null, + 'publicly_queryable' => null, + 'show_ui' => null, + 'show_in_menu' => null, + 'show_in_nav_menus' => null, + 'show_in_admin_bar' => null, + 'menu_position' => null, + 'menu_icon' => null, + 'capability_type' => 'post', + 'capabilities' => array(), + 'map_meta_cap' => null, + 'supports' => array(), + 'register_meta_box_cb' => null, + 'taxonomies' => array(), + 'has_archive' => false, + 'rewrite' => true, + 'query_var' => true, + 'can_export' => true, + 'delete_with_user' => null, + 'show_in_rest' => false, + 'rest_base' => false, + 'rest_controller_class' => false, + '_builtin' => false, + '_edit_link' => 'post.php?post=%d', + ); + + $args = array_merge( $defaults, $args ); + + $args['name'] = $this->name; + + // If not set, default to the setting for 'public'. + if ( null === $args['publicly_queryable'] ) { + $args['publicly_queryable'] = $args['public']; + } + + // If not set, default to the setting for 'public'. + if ( null === $args['show_ui'] ) { + $args['show_ui'] = $args['public']; + } + + // If not set, default to the setting for 'show_ui'. + if ( null === $args['show_in_menu'] || ! $args['show_ui'] ) { + $args['show_in_menu'] = $args['show_ui']; + } + + // If not set, default to the setting for 'show_in_menu'. + if ( null === $args['show_in_admin_bar'] ) { + $args['show_in_admin_bar'] = (bool) $args['show_in_menu']; + } + + // If not set, default to the setting for 'public'. + if ( null === $args['show_in_nav_menus'] ) { + $args['show_in_nav_menus'] = $args['public']; + } + + // If not set, default to true if not public, false if public. + if ( null === $args['exclude_from_search'] ) { + $args['exclude_from_search'] = ! $args['public']; + } + + // Back compat with quirky handling in version 3.0. #14122. + if ( empty( $args['capabilities'] ) && null === $args['map_meta_cap'] && in_array( $args['capability_type'], array( 'post', 'page' ) ) ) { + $args['map_meta_cap'] = true; + } + + // If not set, default to false. + if ( null === $args['map_meta_cap'] ) { + $args['map_meta_cap'] = false; + } + + // If there's no specified edit link and no UI, remove the edit link. + if ( ! $args['show_ui'] && ! $has_edit_link ) { + $args['_edit_link'] = ''; + } + + $this->cap = get_post_type_capabilities( (object) $args ); + unset( $args['capabilities'] ); + + if ( is_array( $args['capability_type'] ) ) { + $args['capability_type'] = $args['capability_type'][0]; + } + + if ( false !== $args['query_var'] ) { + if ( true === $args['query_var'] ) { + $args['query_var'] = $this->name; + } else { + $args['query_var'] = sanitize_title_with_dashes( $args['query_var'] ); + } + } + + if ( false !== $args['rewrite'] && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { + if ( ! is_array( $args['rewrite'] ) ) { + $args['rewrite'] = array(); + } + if ( empty( $args['rewrite']['slug'] ) ) { + $args['rewrite']['slug'] = $this->name; + } + if ( ! isset( $args['rewrite']['with_front'] ) ) { + $args['rewrite']['with_front'] = true; + } + if ( ! isset( $args['rewrite']['pages'] ) ) { + $args['rewrite']['pages'] = true; + } + if ( ! isset( $args['rewrite']['feeds'] ) || ! $args['has_archive'] ) { + $args['rewrite']['feeds'] = (bool) $args['has_archive']; + } + if ( ! isset( $args['rewrite']['ep_mask'] ) ) { + if ( isset( $args['permalink_epmask'] ) ) { + $args['rewrite']['ep_mask'] = $args['permalink_epmask']; + } else { + $args['rewrite']['ep_mask'] = EP_PERMALINK; + } + } + } + + foreach ( $args as $property_name => $property_value ) { + $this->$property_name = $property_value; + } + + $this->labels = get_post_type_labels( $this ); + $this->label = $this->labels->name; + } + + /** + * Sets the features support for the post type. + * + * @since 4.6.0 + */ + public function add_supports() { + if ( ! empty( $this->supports ) ) { + foreach ( $this->supports as $feature => $args ) { + if ( is_array( $args ) ) { + add_post_type_support( $this->name, $feature, $args ); + } else { + add_post_type_support( $this->name, $args ); + } + } + unset( $this->supports ); + } elseif ( false !== $this->supports ) { + // Add default features. + add_post_type_support( $this->name, array( 'title', 'editor' ) ); + } + } + + /** + * Adds the necessary rewrite rules for the post type. + * + * @since 4.6.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * @global WP $wp Current WordPress environment instance. + */ + public function add_rewrite_rules() { + global $wp_rewrite, $wp; + + if ( false !== $this->query_var && $wp && is_post_type_viewable( $this ) ) { + $wp->add_query_var( $this->query_var ); + } + + if ( false !== $this->rewrite && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { + if ( $this->hierarchical ) { + add_rewrite_tag( "%$this->name%", '(.+?)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&pagename=" ); + } else { + add_rewrite_tag( "%$this->name%", '([^/]+)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&name=" ); + } + + if ( $this->has_archive ) { + $archive_slug = true === $this->has_archive ? $this->rewrite['slug'] : $this->has_archive; + if ( $this->rewrite['with_front'] ) { + $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; + } else { + $archive_slug = $wp_rewrite->root . $archive_slug; + } + + add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$this->name", 'top' ); + if ( $this->rewrite['feeds'] && $wp_rewrite->feeds ) { + $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; + add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' ); + add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' ); + } + if ( $this->rewrite['pages'] ) { + add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$this->name" . '&paged=$matches[1]', 'top' ); + } + } + + $permastruct_args = $this->rewrite; + $permastruct_args['feed'] = $permastruct_args['feeds']; + add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $permastruct_args ); + } + } + + /** + * Registers the post type meta box if a custom callback was specified. + * + * @since 4.6.0 + */ + public function register_meta_boxes() { + if ( $this->register_meta_box_cb ) { + add_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10, 1 ); + } + } + + /** + * Adds the future post hook action for the post type. + * + * @since 4.6.0 + */ + public function add_hooks() { + add_action( 'future_' . $this->name, '_future_post_hook', 5, 2 ); + } + + /** + * Registers the taxonomies for the post type. + * + * @since 4.6.0 + */ + public function register_taxonomies() { + foreach ( $this->taxonomies as $taxonomy ) { + register_taxonomy_for_object_type( $taxonomy, $this->name ); + } + } + + /** + * Removes the features support for the post type. + * + * @since 4.6.0 + * + * @global array $_wp_post_type_features Post type features. + */ + public function remove_supports() { + global $_wp_post_type_features; + + unset( $_wp_post_type_features[ $this->name ] ); + } + + /** + * Removes any rewrite rules, permastructs, and rules for the post type. + * + * @since 4.6.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * @global WP $wp Current WordPress environment instance. + * @global array $post_type_meta_caps Used to remove meta capabilities. + */ + public function remove_rewrite_rules() { + global $wp, $wp_rewrite, $post_type_meta_caps; + + // Remove query var. + if ( false !== $this->query_var ) { + $wp->remove_query_var( $this->query_var ); + } + + // Remove any rewrite rules, permastructs, and rules. + if ( false !== $this->rewrite ) { + remove_rewrite_tag( "%$this->name%" ); + remove_permastruct( $this->name ); + foreach ( $wp_rewrite->extra_rules_top as $regex => $query ) { + if ( false !== strpos( $query, "index.php?post_type=$this->name" ) ) { + unset( $wp_rewrite->extra_rules_top[ $regex ] ); + } + } + } + + // Remove registered custom meta capabilities. + foreach ( $this->cap as $cap ) { + unset( $post_type_meta_caps[ $cap ] ); + } + } + + /** + * Unregisters the post type meta box if a custom callback was specified. + * + * @since 4.6.0 + */ + public function unregister_meta_boxes() { + if ( $this->register_meta_box_cb ) { + remove_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10 ); + } + } + + /** + * Removes the post type from all taxonomies. + * + * @since 4.6.0 + */ + public function unregister_taxonomies() { + foreach ( get_object_taxonomies( $this->name ) as $taxonomy ) { + unregister_taxonomy_for_object_type( $taxonomy, $this->name ); + } + } + + /** + * Removes the future post hook action for the post type. + * + * @since 4.6.0 + */ + public function remove_hooks() { + remove_action( 'future_' . $this->name, '_future_post_hook', 5 ); + } + + /** + * Gets the REST API controller for this post type. + * + * Will only instantiate the controller class once per request. + * + * @since 5.3.0 + * + * @return WP_REST_Controller|null The controller instance, or null if the post type + * is set not to show in rest. + */ + public function get_rest_controller() { + if ( ! $this->show_in_rest ) { + return null; + } + + $class = $this->rest_controller_class ? $this->rest_controller_class : WP_REST_Posts_Controller::class; + + if ( ! class_exists( $class ) ) { + return null; + } + + if ( ! is_subclass_of( $class, WP_REST_Controller::class ) ) { + return null; + } + + if ( ! $this->rest_controller ) { + $this->rest_controller = new $class( $this->name ); + } + + if ( ! ( $this->rest_controller instanceof $class ) ) { + return null; + } + + return $this->rest_controller; + } +} diff --git a/wp-includes/class-wp-post.php b/wp-includes/class-wp-post.php new file mode 100644 index 0000000..a64a0d3 --- /dev/null +++ b/wp-includes/class-wp-post.php @@ -0,0 +1,387 @@ +<?php +/** + * Post API: WP_Post class + * + * @package WordPress + * @subpackage Post + * @since 4.4.0 + */ + +/** + * Core class used to implement the WP_Post object. + * + * @since 3.5.0 + * + * @property string $page_template + * + * @property-read array $ancestors + * @property-read int $post_category + * @property-read string $tag_input + */ +final class WP_Post { + + /** + * Post ID. + * + * @since 3.5.0 + * @var int + */ + public $ID; + + /** + * ID of post author. + * + * A numeric string, for compatibility reasons. + * + * @since 3.5.0 + * @var string + */ + public $post_author = 0; + + /** + * The post's local publication time. + * + * @since 3.5.0 + * @var string + */ + public $post_date = '0000-00-00 00:00:00'; + + /** + * The post's GMT publication time. + * + * @since 3.5.0 + * @var string + */ + public $post_date_gmt = '0000-00-00 00:00:00'; + + /** + * The post's content. + * + * @since 3.5.0 + * @var string + */ + public $post_content = ''; + + /** + * The post's title. + * + * @since 3.5.0 + * @var string + */ + public $post_title = ''; + + /** + * The post's excerpt. + * + * @since 3.5.0 + * @var string + */ + public $post_excerpt = ''; + + /** + * The post's status. + * + * @since 3.5.0 + * @var string + */ + public $post_status = 'publish'; + + /** + * Whether comments are allowed. + * + * @since 3.5.0 + * @var string + */ + public $comment_status = 'open'; + + /** + * Whether pings are allowed. + * + * @since 3.5.0 + * @var string + */ + public $ping_status = 'open'; + + /** + * The post's password in plain text. + * + * @since 3.5.0 + * @var string + */ + public $post_password = ''; + + /** + * The post's slug. + * + * @since 3.5.0 + * @var string + */ + public $post_name = ''; + + /** + * URLs queued to be pinged. + * + * @since 3.5.0 + * @var string + */ + public $to_ping = ''; + + /** + * URLs that have been pinged. + * + * @since 3.5.0 + * @var string + */ + public $pinged = ''; + + /** + * The post's local modified time. + * + * @since 3.5.0 + * @var string + */ + public $post_modified = '0000-00-00 00:00:00'; + + /** + * The post's GMT modified time. + * + * @since 3.5.0 + * @var string + */ + public $post_modified_gmt = '0000-00-00 00:00:00'; + + /** + * A utility DB field for post content. + * + * @since 3.5.0 + * @var string + */ + public $post_content_filtered = ''; + + /** + * ID of a post's parent post. + * + * @since 3.5.0 + * @var int + */ + public $post_parent = 0; + + /** + * The unique identifier for a post, not necessarily a URL, used as the feed GUID. + * + * @since 3.5.0 + * @var string + */ + public $guid = ''; + + /** + * A field used for ordering posts. + * + * @since 3.5.0 + * @var int + */ + public $menu_order = 0; + + /** + * The post's type, like post or page. + * + * @since 3.5.0 + * @var string + */ + public $post_type = 'post'; + + /** + * An attachment's mime type. + * + * @since 3.5.0 + * @var string + */ + public $post_mime_type = ''; + + /** + * Cached comment count. + * + * A numeric string, for compatibility reasons. + * + * @since 3.5.0 + * @var string + */ + public $comment_count = 0; + + /** + * Stores the post object's sanitization level. + * + * Does not correspond to a DB field. + * + * @since 3.5.0 + * @var string + */ + public $filter; + + /** + * Retrieve WP_Post instance. + * + * @since 3.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $post_id Post ID. + * @return WP_Post|false Post object, false otherwise. + */ + public static function get_instance( $post_id ) { + global $wpdb; + + $post_id = (int) $post_id; + if ( ! $post_id ) { + return false; + } + + $_post = wp_cache_get( $post_id, 'posts' ); + + if ( ! $_post ) { + $_post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id ) ); + + if ( ! $_post ) { + return false; + } + + $_post = sanitize_post( $_post, 'raw' ); + wp_cache_add( $_post->ID, $_post, 'posts' ); + } elseif ( empty( $_post->filter ) ) { + $_post = sanitize_post( $_post, 'raw' ); + } + + return new WP_Post( $_post ); + } + + /** + * Constructor. + * + * @since 3.5.0 + * + * @param WP_Post|object $post Post object. + */ + public function __construct( $post ) { + foreach ( get_object_vars( $post ) as $key => $value ) { + $this->$key = $value; + } + } + + /** + * Isset-er. + * + * @since 3.5.0 + * + * @param string $key Property to check if set. + * @return bool + */ + public function __isset( $key ) { + if ( 'ancestors' === $key ) { + return true; + } + + if ( 'page_template' === $key ) { + return true; + } + + if ( 'post_category' === $key ) { + return true; + } + + if ( 'tags_input' === $key ) { + return true; + } + + return metadata_exists( 'post', $this->ID, $key ); + } + + /** + * Getter. + * + * @since 3.5.0 + * + * @param string $key Key to get. + * @return mixed + */ + public function __get( $key ) { + if ( 'page_template' === $key && $this->__isset( $key ) ) { + return get_post_meta( $this->ID, '_wp_page_template', true ); + } + + if ( 'post_category' === $key ) { + if ( is_object_in_taxonomy( $this->post_type, 'category' ) ) { + $terms = get_the_terms( $this, 'category' ); + } + + if ( empty( $terms ) ) { + return array(); + } + + return wp_list_pluck( $terms, 'term_id' ); + } + + if ( 'tags_input' === $key ) { + if ( is_object_in_taxonomy( $this->post_type, 'post_tag' ) ) { + $terms = get_the_terms( $this, 'post_tag' ); + } + + if ( empty( $terms ) ) { + return array(); + } + + return wp_list_pluck( $terms, 'name' ); + } + + // Rest of the values need filtering. + if ( 'ancestors' === $key ) { + $value = get_post_ancestors( $this ); + } else { + $value = get_post_meta( $this->ID, $key, true ); + } + + if ( $this->filter ) { + $value = sanitize_post_field( $key, $value, $this->ID, $this->filter ); + } + + return $value; + } + + /** + * {@Missing Summary} + * + * @since 3.5.0 + * + * @param string $filter Filter. + * @return array|bool|object|WP_Post + */ + public function filter( $filter ) { + if ( $this->filter === $filter ) { + return $this; + } + + if ( 'raw' === $filter ) { + return self::get_instance( $this->ID ); + } + + return sanitize_post( $this, $filter ); + } + + /** + * Convert object to array. + * + * @since 3.5.0 + * + * @return array Object as array. + */ + public function to_array() { + $post = get_object_vars( $this ); + + foreach ( array( 'ancestors', 'page_template', 'post_category', 'tags_input' ) as $key ) { + if ( $this->__isset( $key ) ) { + $post[ $key ] = $this->__get( $key ); + } + } + + return $post; + } +} diff --git a/wp-includes/class-wp-query.php b/wp-includes/class-wp-query.php new file mode 100644 index 0000000..bd04e91 --- /dev/null +++ b/wp-includes/class-wp-query.php @@ -0,0 +1,4412 @@ +<?php +/** + * Query API: WP_Query class + * + * @package WordPress + * @subpackage Query + * @since 4.7.0 + */ + +/** + * The WordPress Query class. + * + * @link https://developer.wordpress.org/reference/classes/wp_query/ + * + * @since 1.5.0 + * @since 4.5.0 Removed the `$comments_popup` property. + */ +class WP_Query { + + /** + * Query vars set by the user + * + * @since 1.5.0 + * @var array + */ + public $query; + + /** + * Query vars, after parsing + * + * @since 1.5.0 + * @var array + */ + public $query_vars = array(); + + /** + * Taxonomy query, as passed to get_tax_sql() + * + * @since 3.1.0 + * @var object WP_Tax_Query + */ + public $tax_query; + + /** + * Metadata query container + * + * @since 3.2.0 + * @var object WP_Meta_Query + */ + public $meta_query = false; + + /** + * Date query container + * + * @since 3.7.0 + * @var object WP_Date_Query + */ + public $date_query = false; + + /** + * Holds the data for a single object that is queried. + * + * Holds the contents of a post, page, category, attachment. + * + * @since 1.5.0 + * @var object|array + */ + public $queried_object; + + /** + * The ID of the queried object. + * + * @since 1.5.0 + * @var int + */ + public $queried_object_id; + + /** + * Get post database query. + * + * @since 2.0.1 + * @var string + */ + public $request; + + /** + * List of posts. + * + * @since 1.5.0 + * @var array + */ + public $posts; + + /** + * The amount of posts for the current query. + * + * @since 1.5.0 + * @var int + */ + public $post_count = 0; + + /** + * Index of the current item in the loop. + * + * @since 1.5.0 + * @var int + */ + public $current_post = -1; + + /** + * Whether the loop has started and the caller is in the loop. + * + * @since 2.0.0 + * @var bool + */ + public $in_the_loop = false; + + /** + * The current post. + * + * @since 1.5.0 + * @var WP_Post + */ + public $post; + + /** + * The list of comments for current post. + * + * @since 2.2.0 + * @var array + */ + public $comments; + + /** + * The amount of comments for the posts. + * + * @since 2.2.0 + * @var int + */ + public $comment_count = 0; + + /** + * The index of the comment in the comment loop. + * + * @since 2.2.0 + * @var int + */ + public $current_comment = -1; + + /** + * Current comment ID. + * + * @since 2.2.0 + * @var int + */ + public $comment; + + /** + * The amount of found posts for the current query. + * + * If limit clause was not used, equals $post_count. + * + * @since 2.1.0 + * @var int + */ + public $found_posts = 0; + + /** + * The amount of pages. + * + * @since 2.1.0 + * @var int + */ + public $max_num_pages = 0; + + /** + * The amount of comment pages. + * + * @since 2.7.0 + * @var int + */ + public $max_num_comment_pages = 0; + + /** + * Signifies whether the current query is for a single post. + * + * @since 1.5.0 + * @var bool + */ + public $is_single = false; + + /** + * Signifies whether the current query is for a preview. + * + * @since 2.0.0 + * @var bool + */ + public $is_preview = false; + + /** + * Signifies whether the current query is for a page. + * + * @since 1.5.0 + * @var bool + */ + public $is_page = false; + + /** + * Signifies whether the current query is for an archive. + * + * @since 1.5.0 + * @var bool + */ + public $is_archive = false; + + /** + * Signifies whether the current query is for a date archive. + * + * @since 1.5.0 + * @var bool + */ + public $is_date = false; + + /** + * Signifies whether the current query is for a year archive. + * + * @since 1.5.0 + * @var bool + */ + public $is_year = false; + + /** + * Signifies whether the current query is for a month archive. + * + * @since 1.5.0 + * @var bool + */ + public $is_month = false; + + /** + * Signifies whether the current query is for a day archive. + * + * @since 1.5.0 + * @var bool + */ + public $is_day = false; + + /** + * Signifies whether the current query is for a specific time. + * + * @since 1.5.0 + * @var bool + */ + public $is_time = false; + + /** + * Signifies whether the current query is for an author archive. + * + * @since 1.5.0 + * @var bool + */ + public $is_author = false; + + /** + * Signifies whether the current query is for a category archive. + * + * @since 1.5.0 + * @var bool + */ + public $is_category = false; + + /** + * Signifies whether the current query is for a tag archive. + * + * @since 2.3.0 + * @var bool + */ + public $is_tag = false; + + /** + * Signifies whether the current query is for a taxonomy archive. + * + * @since 2.5.0 + * @var bool + */ + public $is_tax = false; + + /** + * Signifies whether the current query is for a search. + * + * @since 1.5.0 + * @var bool + */ + public $is_search = false; + + /** + * Signifies whether the current query is for a feed. + * + * @since 1.5.0 + * @var bool + */ + public $is_feed = false; + + /** + * Signifies whether the current query is for a comment feed. + * + * @since 2.2.0 + * @var bool + */ + public $is_comment_feed = false; + + /** + * Signifies whether the current query is for trackback endpoint call. + * + * @since 1.5.0 + * @var bool + */ + public $is_trackback = false; + + /** + * Signifies whether the current query is for the site homepage. + * + * @since 1.5.0 + * @var bool + */ + public $is_home = false; + + /** + * Signifies whether the current query is for the Privacy Policy page. + * + * @since 5.2.0 + * @var bool + */ + public $is_privacy_policy = false; + + /** + * Signifies whether the current query couldn't find anything. + * + * @since 1.5.0 + * @var bool + */ + public $is_404 = false; + + /** + * Signifies whether the current query is for an embed. + * + * @since 4.4.0 + * @var bool + */ + public $is_embed = false; + + /** + * Signifies whether the current query is for a paged result and not for the first page. + * + * @since 1.5.0 + * @var bool + */ + public $is_paged = false; + + /** + * Signifies whether the current query is for an administrative interface page. + * + * @since 1.5.0 + * @var bool + */ + public $is_admin = false; + + /** + * Signifies whether the current query is for an attachment page. + * + * @since 2.0.0 + * @var bool + */ + public $is_attachment = false; + + /** + * Signifies whether the current query is for an existing single post of any post type + * (post, attachment, page, custom post types). + * + * @since 2.1.0 + * @var bool + */ + public $is_singular = false; + + /** + * Signifies whether the current query is for the robots.txt file. + * + * @since 2.1.0 + * @var bool + */ + public $is_robots = false; + + /** + * Signifies whether the current query is for the favicon.ico file. + * + * @since 5.4.0 + * @var bool + */ + public $is_favicon = false; + + /** + * Signifies whether the current query is for the page_for_posts page. + * + * Basically, the homepage if the option isn't set for the static homepage. + * + * @since 2.1.0 + * @var bool + */ + public $is_posts_page = false; + + /** + * Signifies whether the current query is for a post type archive. + * + * @since 3.1.0 + * @var bool + */ + public $is_post_type_archive = false; + + /** + * Stores the ->query_vars state like md5(serialize( $this->query_vars ) ) so we know + * whether we have to re-parse because something has changed + * + * @since 3.1.0 + * @var bool|string + */ + private $query_vars_hash = false; + + /** + * Whether query vars have changed since the initial parse_query() call. Used to catch modifications to query vars made + * via pre_get_posts hooks. + * + * @since 3.1.1 + */ + private $query_vars_changed = true; + + /** + * Set if post thumbnails are cached + * + * @since 3.2.0 + * @var bool + */ + public $thumbnails_cached = false; + + /** + * Cached list of search stopwords. + * + * @since 3.7.0 + * @var array + */ + private $stopwords; + + private $compat_fields = array( 'query_vars_hash', 'query_vars_changed' ); + + private $compat_methods = array( 'init_query_flags', 'parse_tax_query' ); + + /** + * Resets query flags to false. + * + * The query flags are what page info WordPress was able to figure out. + * + * @since 2.0.0 + */ + private function init_query_flags() { + $this->is_single = false; + $this->is_preview = false; + $this->is_page = false; + $this->is_archive = false; + $this->is_date = false; + $this->is_year = false; + $this->is_month = false; + $this->is_day = false; + $this->is_time = false; + $this->is_author = false; + $this->is_category = false; + $this->is_tag = false; + $this->is_tax = false; + $this->is_search = false; + $this->is_feed = false; + $this->is_comment_feed = false; + $this->is_trackback = false; + $this->is_home = false; + $this->is_privacy_policy = false; + $this->is_404 = false; + $this->is_paged = false; + $this->is_admin = false; + $this->is_attachment = false; + $this->is_singular = false; + $this->is_robots = false; + $this->is_favicon = false; + $this->is_posts_page = false; + $this->is_post_type_archive = false; + } + + /** + * Initiates object properties and sets default values. + * + * @since 1.5.0 + */ + public function init() { + unset( $this->posts ); + unset( $this->query ); + $this->query_vars = array(); + unset( $this->queried_object ); + unset( $this->queried_object_id ); + $this->post_count = 0; + $this->current_post = -1; + $this->in_the_loop = false; + unset( $this->request ); + unset( $this->post ); + unset( $this->comments ); + unset( $this->comment ); + $this->comment_count = 0; + $this->current_comment = -1; + $this->found_posts = 0; + $this->max_num_pages = 0; + $this->max_num_comment_pages = 0; + + $this->init_query_flags(); + } + + /** + * Reparse the query vars. + * + * @since 1.5.0 + */ + public function parse_query_vars() { + $this->parse_query(); + } + + /** + * Fills in the query variables, which do not exist within the parameter. + * + * @since 2.1.0 + * @since 4.5.0 Removed the `comments_popup` public query variable. + * + * @param array $array Defined query variables. + * @return array Complete query variables with undefined ones filled in empty. + */ + public function fill_query_vars( $array ) { + $keys = array( + 'error', + 'm', + 'p', + 'post_parent', + 'subpost', + 'subpost_id', + 'attachment', + 'attachment_id', + 'name', + 'pagename', + 'page_id', + 'second', + 'minute', + 'hour', + 'day', + 'monthnum', + 'year', + 'w', + 'category_name', + 'tag', + 'cat', + 'tag_id', + 'author', + 'author_name', + 'feed', + 'tb', + 'paged', + 'meta_key', + 'meta_value', + 'preview', + 's', + 'sentence', + 'title', + 'fields', + 'menu_order', + 'embed', + ); + + foreach ( $keys as $key ) { + if ( ! isset( $array[ $key ] ) ) { + $array[ $key ] = ''; + } + } + + $array_keys = array( + 'category__in', + 'category__not_in', + 'category__and', + 'post__in', + 'post__not_in', + 'post_name__in', + 'tag__in', + 'tag__not_in', + 'tag__and', + 'tag_slug__in', + 'tag_slug__and', + 'post_parent__in', + 'post_parent__not_in', + 'author__in', + 'author__not_in', + ); + + foreach ( $array_keys as $key ) { + if ( ! isset( $array[ $key ] ) ) { + $array[ $key ] = array(); + } + } + return $array; + } + + /** + * Parse a query string and set query type booleans. + * + * @since 1.5.0 + * @since 4.2.0 Introduced the ability to order by specific clauses of a `$meta_query`, by passing the clause's + * array key to `$orderby`. + * @since 4.4.0 Introduced `$post_name__in` and `$title` parameters. `$s` was updated to support excluded + * search terms, by prepending a hyphen. + * @since 4.5.0 Removed the `$comments_popup` parameter. + * Introduced the `$comment_status` and `$ping_status` parameters. + * Introduced `RAND(x)` syntax for `$orderby`, which allows an integer seed value to random sorts. + * @since 4.6.0 Added 'post_name__in' support for `$orderby`. Introduced the `$lazy_load_term_meta` argument. + * @since 4.9.0 Introduced the `$comment_count` parameter. + * @since 5.1.0 Introduced the `$meta_compare_key` parameter. + * @since 5.3.0 Introduced the `$meta_type_key` parameter. + * + * @param string|array $query { + * Optional. Array or string of Query parameters. + * + * @type int $attachment_id Attachment post ID. Used for 'attachment' post_type. + * @type int|string $author Author ID, or comma-separated list of IDs. + * @type string $author_name User 'user_nicename'. + * @type array $author__in An array of author IDs to query from. + * @type array $author__not_in An array of author IDs not to query from. + * @type bool $cache_results Whether to cache post information. Default true. + * @type int|string $cat Category ID or comma-separated list of IDs (this or any children). + * @type array $category__and An array of category IDs (AND in). + * @type array $category__in An array of category IDs (OR in, no children). + * @type array $category__not_in An array of category IDs (NOT in). + * @type string $category_name Use category slug (not name, this or any children). + * @type array|int $comment_count Filter results by comment count. Provide an integer to match + * comment count exactly. Provide an array with integer 'value' + * and 'compare' operator ('=', '!=', '>', '>=', '<', '<=' ) to + * compare against comment_count in a specific way. + * @type string $comment_status Comment status. + * @type int $comments_per_page The number of comments to return per page. + * Default 'comments_per_page' option. + * @type array $date_query An associative array of WP_Date_Query arguments. + * See WP_Date_Query::__construct(). + * @type int $day Day of the month. Default empty. Accepts numbers 1-31. + * @type bool $exact Whether to search by exact keyword. Default false. + * @type string|array $fields Which fields to return. Single field or all fields (string), + * or array of fields. 'id=>parent' uses 'id' and 'post_parent'. + * Default all fields. Accepts 'ids', 'id=>parent'. + * @type int $hour Hour of the day. Default empty. Accepts numbers 0-23. + * @type int|bool $ignore_sticky_posts Whether to ignore sticky posts or not. Setting this to false + * excludes stickies from 'post__in'. Accepts 1|true, 0|false. + * Default 0|false. + * @type int $m Combination YearMonth. Accepts any four-digit year and month + * numbers 1-12. Default empty. + * @type string $meta_compare Comparison operator to test the 'meta_value'. + * @type string $meta_compare_key Comparison operator to test the 'meta_key'. + * @type string $meta_key Custom field key. + * @type array $meta_query An associative array of WP_Meta_Query arguments. See WP_Meta_Query. + * @type string $meta_value Custom field value. + * @type int $meta_value_num Custom field value number. + * @type string $meta_type_key Cast for 'meta_key'. See WP_Meta_Query::construct(). + * @type int $menu_order The menu order of the posts. + * @type int $monthnum The two-digit month. Default empty. Accepts numbers 1-12. + * @type string $name Post slug. + * @type bool $nopaging Show all posts (true) or paginate (false). Default false. + * @type bool $no_found_rows Whether to skip counting the total rows found. Enabling can improve + * performance. Default false. + * @type int $offset The number of posts to offset before retrieval. + * @type string $order Designates ascending or descending order of posts. Default 'DESC'. + * Accepts 'ASC', 'DESC'. + * @type string|array $orderby Sort retrieved posts by parameter. One or more options may be + * passed. To use 'meta_value', or 'meta_value_num', + * 'meta_key=keyname' must be also be defined. To sort by a + * specific `$meta_query` clause, use that clause's array key. + * Accepts 'none', 'name', 'author', 'date', 'title', + * 'modified', 'menu_order', 'parent', 'ID', 'rand', + * 'relevance', 'RAND(x)' (where 'x' is an integer seed value), + * 'comment_count', 'meta_value', 'meta_value_num', 'post__in', + * 'post_name__in', 'post_parent__in', and the array keys + * of `$meta_query`. Default is 'date', except when a search + * is being performed, when the default is 'relevance'. + * + * @type int $p Post ID. + * @type int $page Show the number of posts that would show up on page X of a + * static front page. + * @type int $paged The number of the current page. + * @type int $page_id Page ID. + * @type string $pagename Page slug. + * @type string $perm Show posts if user has the appropriate capability. + * @type string $ping_status Ping status. + * @type array $post__in An array of post IDs to retrieve, sticky posts will be included. + * @type array $post__not_in An array of post IDs not to retrieve. Note: a string of comma- + * separated IDs will NOT work. + * @type string $post_mime_type The mime type of the post. Used for 'attachment' post_type. + * @type array $post_name__in An array of post slugs that results must match. + * @type int $post_parent Page ID to retrieve child pages for. Use 0 to only retrieve + * top-level pages. + * @type array $post_parent__in An array containing parent page IDs to query child pages from. + * @type array $post_parent__not_in An array containing parent page IDs not to query child pages from. + * @type string|array $post_type A post type slug (string) or array of post type slugs. + * Default 'any' if using 'tax_query'. + * @type string|array $post_status A post status (string) or array of post statuses. + * @type int $posts_per_page The number of posts to query for. Use -1 to request all posts. + * @type int $posts_per_archive_page The number of posts to query for by archive page. Overrides + * 'posts_per_page' when is_archive(), or is_search() are true. + * @type string $s Search keyword(s). Prepending a term with a hyphen will + * exclude posts matching that term. Eg, 'pillow -sofa' will + * return posts containing 'pillow' but not 'sofa'. The + * character used for exclusion can be modified using the + * the 'wp_query_search_exclusion_prefix' filter. + * @type int $second Second of the minute. Default empty. Accepts numbers 0-60. + * @type bool $sentence Whether to search by phrase. Default false. + * @type bool $suppress_filters Whether to suppress filters. Default false. + * @type string $tag Tag slug. Comma-separated (either), Plus-separated (all). + * @type array $tag__and An array of tag ids (AND in). + * @type array $tag__in An array of tag ids (OR in). + * @type array $tag__not_in An array of tag ids (NOT in). + * @type int $tag_id Tag id or comma-separated list of IDs. + * @type array $tag_slug__and An array of tag slugs (AND in). + * @type array $tag_slug__in An array of tag slugs (OR in). unless 'ignore_sticky_posts' is + * true. Note: a string of comma-separated IDs will NOT work. + * @type array $tax_query An associative array of WP_Tax_Query arguments. + * See WP_Tax_Query->queries. + * @type string $title Post title. + * @type bool $update_post_meta_cache Whether to update the post meta cache. Default true. + * @type bool $update_post_term_cache Whether to update the post term cache. Default true. + * @type bool $lazy_load_term_meta Whether to lazy-load term meta. Setting to false will + * disable cache priming for term meta, so that each + * get_term_meta() call will hit the database. + * Defaults to the value of `$update_post_term_cache`. + * @type int $w The week number of the year. Default empty. Accepts numbers 0-53. + * @type int $year The four-digit year. Default empty. Accepts any four-digit year. + * } + */ + public function parse_query( $query = '' ) { + if ( ! empty( $query ) ) { + $this->init(); + $this->query = wp_parse_args( $query ); + $this->query_vars = $this->query; + } elseif ( ! isset( $this->query ) ) { + $this->query = $this->query_vars; + } + + $this->query_vars = $this->fill_query_vars( $this->query_vars ); + $qv = &$this->query_vars; + $this->query_vars_changed = true; + + if ( ! empty( $qv['robots'] ) ) { + $this->is_robots = true; + } elseif ( ! empty( $qv['favicon'] ) ) { + $this->is_favicon = true; + } + + if ( ! is_scalar( $qv['p'] ) || $qv['p'] < 0 ) { + $qv['p'] = 0; + $qv['error'] = '404'; + } else { + $qv['p'] = intval( $qv['p'] ); + } + + $qv['page_id'] = absint( $qv['page_id'] ); + $qv['year'] = absint( $qv['year'] ); + $qv['monthnum'] = absint( $qv['monthnum'] ); + $qv['day'] = absint( $qv['day'] ); + $qv['w'] = absint( $qv['w'] ); + $qv['m'] = is_scalar( $qv['m'] ) ? preg_replace( '|[^0-9]|', '', $qv['m'] ) : ''; + $qv['paged'] = absint( $qv['paged'] ); + $qv['cat'] = preg_replace( '|[^0-9,-]|', '', $qv['cat'] ); // Comma-separated list of positive or negative integers. + $qv['author'] = preg_replace( '|[^0-9,-]|', '', $qv['author'] ); // Comma-separated list of positive or negative integers. + $qv['pagename'] = trim( $qv['pagename'] ); + $qv['name'] = trim( $qv['name'] ); + $qv['title'] = trim( $qv['title'] ); + if ( '' !== $qv['hour'] ) { + $qv['hour'] = absint( $qv['hour'] ); + } + if ( '' !== $qv['minute'] ) { + $qv['minute'] = absint( $qv['minute'] ); + } + if ( '' !== $qv['second'] ) { + $qv['second'] = absint( $qv['second'] ); + } + if ( '' !== $qv['menu_order'] ) { + $qv['menu_order'] = absint( $qv['menu_order'] ); + } + + // Fairly insane upper bound for search string lengths. + if ( ! is_scalar( $qv['s'] ) || ( ! empty( $qv['s'] ) && strlen( $qv['s'] ) > 1600 ) ) { + $qv['s'] = ''; + } + + // Compat. Map subpost to attachment. + if ( '' != $qv['subpost'] ) { + $qv['attachment'] = $qv['subpost']; + } + if ( '' != $qv['subpost_id'] ) { + $qv['attachment_id'] = $qv['subpost_id']; + } + + $qv['attachment_id'] = absint( $qv['attachment_id'] ); + + if ( ( '' != $qv['attachment'] ) || ! empty( $qv['attachment_id'] ) ) { + $this->is_single = true; + $this->is_attachment = true; + } elseif ( '' != $qv['name'] ) { + $this->is_single = true; + } elseif ( $qv['p'] ) { + $this->is_single = true; + } elseif ( '' != $qv['pagename'] || ! empty( $qv['page_id'] ) ) { + $this->is_page = true; + $this->is_single = false; + } else { + // Look for archive queries. Dates, categories, authors, search, post type archives. + + if ( isset( $this->query['s'] ) ) { + $this->is_search = true; + } + + if ( '' !== $qv['second'] ) { + $this->is_time = true; + $this->is_date = true; + } + + if ( '' !== $qv['minute'] ) { + $this->is_time = true; + $this->is_date = true; + } + + if ( '' !== $qv['hour'] ) { + $this->is_time = true; + $this->is_date = true; + } + + if ( $qv['day'] ) { + if ( ! $this->is_date ) { + $date = sprintf( '%04d-%02d-%02d', $qv['year'], $qv['monthnum'], $qv['day'] ); + if ( $qv['monthnum'] && $qv['year'] && ! wp_checkdate( $qv['monthnum'], $qv['day'], $qv['year'], $date ) ) { + $qv['error'] = '404'; + } else { + $this->is_day = true; + $this->is_date = true; + } + } + } + + if ( $qv['monthnum'] ) { + if ( ! $this->is_date ) { + if ( 12 < $qv['monthnum'] ) { + $qv['error'] = '404'; + } else { + $this->is_month = true; + $this->is_date = true; + } + } + } + + if ( $qv['year'] ) { + if ( ! $this->is_date ) { + $this->is_year = true; + $this->is_date = true; + } + } + + if ( $qv['m'] ) { + $this->is_date = true; + if ( strlen( $qv['m'] ) > 9 ) { + $this->is_time = true; + } elseif ( strlen( $qv['m'] ) > 7 ) { + $this->is_day = true; + } elseif ( strlen( $qv['m'] ) > 5 ) { + $this->is_month = true; + } else { + $this->is_year = true; + } + } + + if ( '' != $qv['w'] ) { + $this->is_date = true; + } + + $this->query_vars_hash = false; + $this->parse_tax_query( $qv ); + + foreach ( $this->tax_query->queries as $tax_query ) { + if ( ! is_array( $tax_query ) ) { + continue; + } + + if ( isset( $tax_query['operator'] ) && 'NOT IN' != $tax_query['operator'] ) { + switch ( $tax_query['taxonomy'] ) { + case 'category': + $this->is_category = true; + break; + case 'post_tag': + $this->is_tag = true; + break; + default: + $this->is_tax = true; + } + } + } + unset( $tax_query ); + + if ( empty( $qv['author'] ) || ( '0' == $qv['author'] ) ) { + $this->is_author = false; + } else { + $this->is_author = true; + } + + if ( '' != $qv['author_name'] ) { + $this->is_author = true; + } + + if ( ! empty( $qv['post_type'] ) && ! is_array( $qv['post_type'] ) ) { + $post_type_obj = get_post_type_object( $qv['post_type'] ); + if ( ! empty( $post_type_obj->has_archive ) ) { + $this->is_post_type_archive = true; + } + } + + if ( $this->is_post_type_archive || $this->is_date || $this->is_author || $this->is_category || $this->is_tag || $this->is_tax ) { + $this->is_archive = true; + } + } + + if ( '' != $qv['feed'] ) { + $this->is_feed = true; + } + + if ( '' != $qv['embed'] ) { + $this->is_embed = true; + } + + if ( '' != $qv['tb'] ) { + $this->is_trackback = true; + } + + if ( '' != $qv['paged'] && ( intval( $qv['paged'] ) > 1 ) ) { + $this->is_paged = true; + } + + // If we're previewing inside the write screen. + if ( '' != $qv['preview'] ) { + $this->is_preview = true; + } + + if ( is_admin() ) { + $this->is_admin = true; + } + + if ( false !== strpos( $qv['feed'], 'comments-' ) ) { + $qv['feed'] = str_replace( 'comments-', '', $qv['feed'] ); + $qv['withcomments'] = 1; + } + + $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment; + + if ( $this->is_feed && ( ! empty( $qv['withcomments'] ) || ( empty( $qv['withoutcomments'] ) && $this->is_singular ) ) ) { + $this->is_comment_feed = true; + } + + if ( ! ( $this->is_singular || $this->is_archive || $this->is_search || $this->is_feed + || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) + || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_robots || $this->is_favicon ) ) { + $this->is_home = true; + } + + // Correct `is_*` for 'page_on_front' and 'page_for_posts'. + if ( $this->is_home && 'page' == get_option( 'show_on_front' ) && get_option( 'page_on_front' ) ) { + $_query = wp_parse_args( $this->query ); + // 'pagename' can be set and empty depending on matched rewrite rules. Ignore an empty 'pagename'. + if ( isset( $_query['pagename'] ) && '' == $_query['pagename'] ) { + unset( $_query['pagename'] ); + } + + unset( $_query['embed'] ); + + if ( empty( $_query ) || ! array_diff( array_keys( $_query ), array( 'preview', 'page', 'paged', 'cpage' ) ) ) { + $this->is_page = true; + $this->is_home = false; + $qv['page_id'] = get_option( 'page_on_front' ); + // Correct <!--nextpage--> for 'page_on_front'. + if ( ! empty( $qv['paged'] ) ) { + $qv['page'] = $qv['paged']; + unset( $qv['paged'] ); + } + } + } + + if ( '' != $qv['pagename'] ) { + $this->queried_object = get_page_by_path( $qv['pagename'] ); + + if ( $this->queried_object && 'attachment' == $this->queried_object->post_type ) { + if ( preg_match( '/^[^%]*%(?:postname)%/', get_option( 'permalink_structure' ) ) ) { + // See if we also have a post with the same slug. + $post = get_page_by_path( $qv['pagename'], OBJECT, 'post' ); + if ( $post ) { + $this->queried_object = $post; + $this->is_page = false; + $this->is_single = true; + } + } + } + + if ( ! empty( $this->queried_object ) ) { + $this->queried_object_id = (int) $this->queried_object->ID; + } else { + unset( $this->queried_object ); + } + + if ( 'page' === get_option( 'show_on_front' ) && isset( $this->queried_object_id ) && get_option( 'page_for_posts' ) == $this->queried_object_id ) { + $this->is_page = false; + $this->is_home = true; + $this->is_posts_page = true; + } + + if ( isset( $this->queried_object_id ) && get_option( 'wp_page_for_privacy_policy' ) == $this->queried_object_id ) { + $this->is_privacy_policy = true; + } + } + + if ( $qv['page_id'] ) { + if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) == $qv['page_id'] ) { + $this->is_page = false; + $this->is_home = true; + $this->is_posts_page = true; + } + + if ( get_option( 'wp_page_for_privacy_policy' ) == $qv['page_id'] ) { + $this->is_privacy_policy = true; + } + } + + if ( ! empty( $qv['post_type'] ) ) { + if ( is_array( $qv['post_type'] ) ) { + $qv['post_type'] = array_map( 'sanitize_key', $qv['post_type'] ); + } else { + $qv['post_type'] = sanitize_key( $qv['post_type'] ); + } + } + + if ( ! empty( $qv['post_status'] ) ) { + if ( is_array( $qv['post_status'] ) ) { + $qv['post_status'] = array_map( 'sanitize_key', $qv['post_status'] ); + } else { + $qv['post_status'] = preg_replace( '|[^a-z0-9_,-]|', '', $qv['post_status'] ); + } + } + + if ( $this->is_posts_page && ( ! isset( $qv['withcomments'] ) || ! $qv['withcomments'] ) ) { + $this->is_comment_feed = false; + } + + $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment; + // Done correcting `is_*` for 'page_on_front' and 'page_for_posts'. + + if ( '404' == $qv['error'] ) { + $this->set_404(); + } + + $this->is_embed = $this->is_embed && ( $this->is_singular || $this->is_404 ); + + $this->query_vars_hash = md5( serialize( $this->query_vars ) ); + $this->query_vars_changed = false; + + /** + * Fires after the main query vars have been parsed. + * + * @since 1.5.0 + * + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + do_action_ref_array( 'parse_query', array( &$this ) ); + } + + /** + * Parses various taxonomy related query vars. + * + * For BC, this method is not marked as protected. See [28987]. + * + * @since 3.1.0 + * + * @param array $q The query variables. Passed by reference. + */ + public function parse_tax_query( &$q ) { + if ( ! empty( $q['tax_query'] ) && is_array( $q['tax_query'] ) ) { + $tax_query = $q['tax_query']; + } else { + $tax_query = array(); + } + + if ( ! empty( $q['taxonomy'] ) && ! empty( $q['term'] ) ) { + $tax_query[] = array( + 'taxonomy' => $q['taxonomy'], + 'terms' => array( $q['term'] ), + 'field' => 'slug', + ); + } + + foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy => $t ) { + if ( 'post_tag' == $taxonomy ) { + continue; // Handled further down in the $q['tag'] block. + } + + if ( $t->query_var && ! empty( $q[ $t->query_var ] ) ) { + $tax_query_defaults = array( + 'taxonomy' => $taxonomy, + 'field' => 'slug', + ); + + if ( isset( $t->rewrite['hierarchical'] ) && $t->rewrite['hierarchical'] ) { + $q[ $t->query_var ] = wp_basename( $q[ $t->query_var ] ); + } + + $term = $q[ $t->query_var ]; + + if ( is_array( $term ) ) { + $term = implode( ',', $term ); + } + + if ( strpos( $term, '+' ) !== false ) { + $terms = preg_split( '/[+]+/', $term ); + foreach ( $terms as $term ) { + $tax_query[] = array_merge( + $tax_query_defaults, + array( + 'terms' => array( $term ), + ) + ); + } + } else { + $tax_query[] = array_merge( + $tax_query_defaults, + array( + 'terms' => preg_split( '/[,]+/', $term ), + ) + ); + } + } + } + + // If query string 'cat' is an array, implode it. + if ( is_array( $q['cat'] ) ) { + $q['cat'] = implode( ',', $q['cat'] ); + } + + // Category stuff. + + if ( ! empty( $q['cat'] ) && ! $this->is_singular ) { + $cat_in = array(); + $cat_not_in = array(); + + $cat_array = preg_split( '/[,\s]+/', urldecode( $q['cat'] ) ); + $cat_array = array_map( 'intval', $cat_array ); + $q['cat'] = implode( ',', $cat_array ); + + foreach ( $cat_array as $cat ) { + if ( $cat > 0 ) { + $cat_in[] = $cat; + } elseif ( $cat < 0 ) { + $cat_not_in[] = abs( $cat ); + } + } + + if ( ! empty( $cat_in ) ) { + $tax_query[] = array( + 'taxonomy' => 'category', + 'terms' => $cat_in, + 'field' => 'term_id', + 'include_children' => true, + ); + } + + if ( ! empty( $cat_not_in ) ) { + $tax_query[] = array( + 'taxonomy' => 'category', + 'terms' => $cat_not_in, + 'field' => 'term_id', + 'operator' => 'NOT IN', + 'include_children' => true, + ); + } + unset( $cat_array, $cat_in, $cat_not_in ); + } + + if ( ! empty( $q['category__and'] ) && 1 === count( (array) $q['category__and'] ) ) { + $q['category__and'] = (array) $q['category__and']; + if ( ! isset( $q['category__in'] ) ) { + $q['category__in'] = array(); + } + $q['category__in'][] = absint( reset( $q['category__and'] ) ); + unset( $q['category__and'] ); + } + + if ( ! empty( $q['category__in'] ) ) { + $q['category__in'] = array_map( 'absint', array_unique( (array) $q['category__in'] ) ); + $tax_query[] = array( + 'taxonomy' => 'category', + 'terms' => $q['category__in'], + 'field' => 'term_id', + 'include_children' => false, + ); + } + + if ( ! empty( $q['category__not_in'] ) ) { + $q['category__not_in'] = array_map( 'absint', array_unique( (array) $q['category__not_in'] ) ); + $tax_query[] = array( + 'taxonomy' => 'category', + 'terms' => $q['category__not_in'], + 'operator' => 'NOT IN', + 'include_children' => false, + ); + } + + if ( ! empty( $q['category__and'] ) ) { + $q['category__and'] = array_map( 'absint', array_unique( (array) $q['category__and'] ) ); + $tax_query[] = array( + 'taxonomy' => 'category', + 'terms' => $q['category__and'], + 'field' => 'term_id', + 'operator' => 'AND', + 'include_children' => false, + ); + } + + // If query string 'tag' is array, implode it. + if ( is_array( $q['tag'] ) ) { + $q['tag'] = implode( ',', $q['tag'] ); + } + + // Tag stuff. + + if ( '' != $q['tag'] && ! $this->is_singular && $this->query_vars_changed ) { + if ( strpos( $q['tag'], ',' ) !== false ) { + $tags = preg_split( '/[,\r\n\t ]+/', $q['tag'] ); + foreach ( (array) $tags as $tag ) { + $tag = sanitize_term_field( 'slug', $tag, 0, 'post_tag', 'db' ); + $q['tag_slug__in'][] = $tag; + } + } elseif ( preg_match( '/[+\r\n\t ]+/', $q['tag'] ) || ! empty( $q['cat'] ) ) { + $tags = preg_split( '/[+\r\n\t ]+/', $q['tag'] ); + foreach ( (array) $tags as $tag ) { + $tag = sanitize_term_field( 'slug', $tag, 0, 'post_tag', 'db' ); + $q['tag_slug__and'][] = $tag; + } + } else { + $q['tag'] = sanitize_term_field( 'slug', $q['tag'], 0, 'post_tag', 'db' ); + $q['tag_slug__in'][] = $q['tag']; + } + } + + if ( ! empty( $q['tag_id'] ) ) { + $q['tag_id'] = absint( $q['tag_id'] ); + $tax_query[] = array( + 'taxonomy' => 'post_tag', + 'terms' => $q['tag_id'], + ); + } + + if ( ! empty( $q['tag__in'] ) ) { + $q['tag__in'] = array_map( 'absint', array_unique( (array) $q['tag__in'] ) ); + $tax_query[] = array( + 'taxonomy' => 'post_tag', + 'terms' => $q['tag__in'], + ); + } + + if ( ! empty( $q['tag__not_in'] ) ) { + $q['tag__not_in'] = array_map( 'absint', array_unique( (array) $q['tag__not_in'] ) ); + $tax_query[] = array( + 'taxonomy' => 'post_tag', + 'terms' => $q['tag__not_in'], + 'operator' => 'NOT IN', + ); + } + + if ( ! empty( $q['tag__and'] ) ) { + $q['tag__and'] = array_map( 'absint', array_unique( (array) $q['tag__and'] ) ); + $tax_query[] = array( + 'taxonomy' => 'post_tag', + 'terms' => $q['tag__and'], + 'operator' => 'AND', + ); + } + + if ( ! empty( $q['tag_slug__in'] ) ) { + $q['tag_slug__in'] = array_map( 'sanitize_title_for_query', array_unique( (array) $q['tag_slug__in'] ) ); + $tax_query[] = array( + 'taxonomy' => 'post_tag', + 'terms' => $q['tag_slug__in'], + 'field' => 'slug', + ); + } + + if ( ! empty( $q['tag_slug__and'] ) ) { + $q['tag_slug__and'] = array_map( 'sanitize_title_for_query', array_unique( (array) $q['tag_slug__and'] ) ); + $tax_query[] = array( + 'taxonomy' => 'post_tag', + 'terms' => $q['tag_slug__and'], + 'field' => 'slug', + 'operator' => 'AND', + ); + } + + $this->tax_query = new WP_Tax_Query( $tax_query ); + + /** + * Fires after taxonomy-related query vars have been parsed. + * + * @since 3.7.0 + * + * @param WP_Query $this The WP_Query instance. + */ + do_action( 'parse_tax_query', $this ); + } + + /** + * Generates SQL for the WHERE clause based on passed search terms. + * + * @since 3.7.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $q Query variables. + * @return string WHERE clause. + */ + protected function parse_search( &$q ) { + global $wpdb; + + $search = ''; + + // Added slashes screw with quote grouping when done early, so done later. + $q['s'] = stripslashes( $q['s'] ); + if ( empty( $_GET['s'] ) && $this->is_main_query() ) { + $q['s'] = urldecode( $q['s'] ); + } + // There are no line breaks in <input /> fields. + $q['s'] = str_replace( array( "\r", "\n" ), '', $q['s'] ); + $q['search_terms_count'] = 1; + if ( ! empty( $q['sentence'] ) ) { + $q['search_terms'] = array( $q['s'] ); + } else { + if ( preg_match_all( '/".*?("|$)|((?<=[\t ",+])|^)[^\t ",+]+/', $q['s'], $matches ) ) { + $q['search_terms_count'] = count( $matches[0] ); + $q['search_terms'] = $this->parse_search_terms( $matches[0] ); + // If the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence. + if ( empty( $q['search_terms'] ) || count( $q['search_terms'] ) > 9 ) { + $q['search_terms'] = array( $q['s'] ); + } + } else { + $q['search_terms'] = array( $q['s'] ); + } + } + + $n = ! empty( $q['exact'] ) ? '' : '%'; + $searchand = ''; + $q['search_orderby_title'] = array(); + + /** + * Filters the prefix that indicates that a search term should be excluded from results. + * + * @since 4.7.0 + * + * @param string $exclusion_prefix The prefix. Default '-'. Returning + * an empty value disables exclusions. + */ + $exclusion_prefix = apply_filters( 'wp_query_search_exclusion_prefix', '-' ); + + foreach ( $q['search_terms'] as $term ) { + // If there is an $exclusion_prefix, terms prefixed with it should be excluded. + $exclude = $exclusion_prefix && ( substr( $term, 0, 1 ) === $exclusion_prefix ); + if ( $exclude ) { + $like_op = 'NOT LIKE'; + $andor_op = 'AND'; + $term = substr( $term, 1 ); + } else { + $like_op = 'LIKE'; + $andor_op = 'OR'; + } + + if ( $n && ! $exclude ) { + $like = '%' . $wpdb->esc_like( $term ) . '%'; + $q['search_orderby_title'][] = $wpdb->prepare( "{$wpdb->posts}.post_title LIKE %s", $like ); + } + + $like = $n . $wpdb->esc_like( $term ) . $n; + $search .= $wpdb->prepare( "{$searchand}(({$wpdb->posts}.post_title $like_op %s) $andor_op ({$wpdb->posts}.post_excerpt $like_op %s) $andor_op ({$wpdb->posts}.post_content $like_op %s))", $like, $like, $like ); + $searchand = ' AND '; + } + + if ( ! empty( $search ) ) { + $search = " AND ({$search}) "; + if ( ! is_user_logged_in() ) { + $search .= " AND ({$wpdb->posts}.post_password = '') "; + } + } + + return $search; + } + + /** + * Check if the terms are suitable for searching. + * + * Uses an array of stopwords (terms) that are excluded from the separate + * term matching when searching for posts. The list of English stopwords is + * the approximate search engines list, and is translatable. + * + * @since 3.7.0 + * + * @param string[] $terms Array of terms to check. + * @return string[] Terms that are not stopwords. + */ + protected function parse_search_terms( $terms ) { + $strtolower = function_exists( 'mb_strtolower' ) ? 'mb_strtolower' : 'strtolower'; + $checked = array(); + + $stopwords = $this->get_search_stopwords(); + + foreach ( $terms as $term ) { + // Keep before/after spaces when term is for exact match. + if ( preg_match( '/^".+"$/', $term ) ) { + $term = trim( $term, "\"'" ); + } else { + $term = trim( $term, "\"' " ); + } + + // Avoid single A-Z and single dashes. + if ( ! $term || ( 1 === strlen( $term ) && preg_match( '/^[a-z\-]$/i', $term ) ) ) { + continue; + } + + if ( in_array( call_user_func( $strtolower, $term ), $stopwords, true ) ) { + continue; + } + + $checked[] = $term; + } + + return $checked; + } + + /** + * Retrieve stopwords used when parsing search terms. + * + * @since 3.7.0 + * + * @return string[] Stopwords. + */ + protected function get_search_stopwords() { + if ( isset( $this->stopwords ) ) { + return $this->stopwords; + } + + /* + * translators: This is a comma-separated list of very common words that should be excluded from a search, + * like a, an, and the. These are usually called "stopwords". You should not simply translate these individual + * words into your language. Instead, look for and provide commonly accepted stopwords in your language. + */ + $words = explode( + ',', + _x( + 'about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www', + 'Comma-separated list of search stopwords in your language' + ) + ); + + $stopwords = array(); + foreach ( $words as $word ) { + $word = trim( $word, "\r\n\t " ); + if ( $word ) { + $stopwords[] = $word; + } + } + + /** + * Filters stopwords used when parsing search terms. + * + * @since 3.7.0 + * + * @param string[] $stopwords Array of stopwords. + */ + $this->stopwords = apply_filters( 'wp_search_stopwords', $stopwords ); + return $this->stopwords; + } + + /** + * Generates SQL for the ORDER BY condition based on passed search terms. + * + * @since 3.7.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $q Query variables. + * @return string ORDER BY clause. + */ + protected function parse_search_order( &$q ) { + global $wpdb; + + if ( $q['search_terms_count'] > 1 ) { + $num_terms = count( $q['search_orderby_title'] ); + + // If the search terms contain negative queries, don't bother ordering by sentence matches. + $like = ''; + if ( ! preg_match( '/(?:\s|^)\-/', $q['s'] ) ) { + $like = '%' . $wpdb->esc_like( $q['s'] ) . '%'; + } + + $search_orderby = ''; + + // Sentence match in 'post_title'. + if ( $like ) { + $search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_title LIKE %s THEN 1 ", $like ); + } + + // Sanity limit, sort as sentence when more than 6 terms + // (few searches are longer than 6 terms and most titles are not). + if ( $num_terms < 7 ) { + // All words in title. + $search_orderby .= 'WHEN ' . implode( ' AND ', $q['search_orderby_title'] ) . ' THEN 2 '; + // Any word in title, not needed when $num_terms == 1. + if ( $num_terms > 1 ) { + $search_orderby .= 'WHEN ' . implode( ' OR ', $q['search_orderby_title'] ) . ' THEN 3 '; + } + } + + // Sentence match in 'post_content' and 'post_excerpt'. + if ( $like ) { + $search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_excerpt LIKE %s THEN 4 ", $like ); + $search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_content LIKE %s THEN 5 ", $like ); + } + + if ( $search_orderby ) { + $search_orderby = '(CASE ' . $search_orderby . 'ELSE 6 END)'; + } + } else { + // Single word or sentence search. + $search_orderby = reset( $q['search_orderby_title'] ) . ' DESC'; + } + + return $search_orderby; + } + + /** + * Converts the given orderby alias (if allowed) to a properly-prefixed value. + * + * @since 4.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $orderby Alias for the field to order by. + * @return string|false Table-prefixed value to used in the ORDER clause. False otherwise. + */ + protected function parse_orderby( $orderby ) { + global $wpdb; + + // Used to filter values. + $allowed_keys = array( + 'post_name', + 'post_author', + 'post_date', + 'post_title', + 'post_modified', + 'post_parent', + 'post_type', + 'name', + 'author', + 'date', + 'title', + 'modified', + 'parent', + 'type', + 'ID', + 'menu_order', + 'comment_count', + 'rand', + 'post__in', + 'post_parent__in', + 'post_name__in', + ); + + $primary_meta_key = ''; + $primary_meta_query = false; + $meta_clauses = $this->meta_query->get_clauses(); + if ( ! empty( $meta_clauses ) ) { + $primary_meta_query = reset( $meta_clauses ); + + if ( ! empty( $primary_meta_query['key'] ) ) { + $primary_meta_key = $primary_meta_query['key']; + $allowed_keys[] = $primary_meta_key; + } + + $allowed_keys[] = 'meta_value'; + $allowed_keys[] = 'meta_value_num'; + $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) ); + } + + // If RAND() contains a seed value, sanitize and add to allowed keys. + $rand_with_seed = false; + if ( preg_match( '/RAND\(([0-9]+)\)/i', $orderby, $matches ) ) { + $orderby = sprintf( 'RAND(%s)', intval( $matches[1] ) ); + $allowed_keys[] = $orderby; + $rand_with_seed = true; + } + + if ( ! in_array( $orderby, $allowed_keys, true ) ) { + return false; + } + + $orderby_clause = ''; + + switch ( $orderby ) { + case 'post_name': + case 'post_author': + case 'post_date': + case 'post_title': + case 'post_modified': + case 'post_parent': + case 'post_type': + case 'ID': + case 'menu_order': + case 'comment_count': + $orderby_clause = "{$wpdb->posts}.{$orderby}"; + break; + case 'rand': + $orderby_clause = 'RAND()'; + break; + case $primary_meta_key: + case 'meta_value': + if ( ! empty( $primary_meta_query['type'] ) ) { + $orderby_clause = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; + } else { + $orderby_clause = "{$primary_meta_query['alias']}.meta_value"; + } + break; + case 'meta_value_num': + $orderby_clause = "{$primary_meta_query['alias']}.meta_value+0"; + break; + case 'post__in': + if ( ! empty( $this->query_vars['post__in'] ) ) { + $orderby_clause = "FIELD({$wpdb->posts}.ID," . implode( ',', array_map( 'absint', $this->query_vars['post__in'] ) ) . ')'; + } + break; + case 'post_parent__in': + if ( ! empty( $this->query_vars['post_parent__in'] ) ) { + $orderby_clause = "FIELD( {$wpdb->posts}.post_parent," . implode( ', ', array_map( 'absint', $this->query_vars['post_parent__in'] ) ) . ' )'; + } + break; + case 'post_name__in': + if ( ! empty( $this->query_vars['post_name__in'] ) ) { + $post_name__in = array_map( 'sanitize_title_for_query', $this->query_vars['post_name__in'] ); + $post_name__in_string = "'" . implode( "','", $post_name__in ) . "'"; + $orderby_clause = "FIELD( {$wpdb->posts}.post_name," . $post_name__in_string . ' )'; + } + break; + default: + if ( array_key_exists( $orderby, $meta_clauses ) ) { + // $orderby corresponds to a meta_query clause. + $meta_clause = $meta_clauses[ $orderby ]; + $orderby_clause = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; + } elseif ( $rand_with_seed ) { + $orderby_clause = $orderby; + } else { + // Default: order by post field. + $orderby_clause = "{$wpdb->posts}.post_" . sanitize_key( $orderby ); + } + + break; + } + + return $orderby_clause; + } + + /** + * Parse an 'order' query variable and cast it to ASC or DESC as necessary. + * + * @since 4.0.0 + * + * @param string $order The 'order' query variable. + * @return string The sanitized 'order' query variable. + */ + protected function parse_order( $order ) { + if ( ! is_string( $order ) || empty( $order ) ) { + return 'DESC'; + } + + if ( 'ASC' === strtoupper( $order ) ) { + return 'ASC'; + } else { + return 'DESC'; + } + } + + /** + * Sets the 404 property and saves whether query is feed. + * + * @since 2.0.0 + */ + public function set_404() { + $is_feed = $this->is_feed; + + $this->init_query_flags(); + $this->is_404 = true; + + $this->is_feed = $is_feed; + } + + /** + * Retrieve query variable. + * + * @since 1.5.0 + * @since 3.9.0 The `$default` argument was introduced. + * + * @param string $query_var Query variable key. + * @param mixed $default Optional. Value to return if the query variable is not set. Default empty. + * @return mixed Contents of the query variable. + */ + public function get( $query_var, $default = '' ) { + if ( isset( $this->query_vars[ $query_var ] ) ) { + return $this->query_vars[ $query_var ]; + } + + return $default; + } + + /** + * Set query variable. + * + * @since 1.5.0 + * + * @param string $query_var Query variable key. + * @param mixed $value Query variable value. + */ + public function set( $query_var, $value ) { + $this->query_vars[ $query_var ] = $value; + } + + /** + * Retrieves an array of posts based on query variables. + * + * There are a few filters and actions that can be used to modify the post + * database query. + * + * @since 1.5.0 + * + * @return WP_Post[]|int[] Array of post objects or post IDs. + */ + public function get_posts() { + global $wpdb; + + $this->parse_query(); + + /** + * Fires after the query variable object is created, but before the actual query is run. + * + * Note: If using conditional tags, use the method versions within the passed instance + * (e.g. $this->is_main_query() instead of is_main_query()). This is because the functions + * like is_main_query() test against the global $wp_query instance, not the passed one. + * + * @since 2.0.0 + * + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + do_action_ref_array( 'pre_get_posts', array( &$this ) ); + + // Shorthand. + $q = &$this->query_vars; + + // Fill again in case 'pre_get_posts' unset some vars. + $q = $this->fill_query_vars( $q ); + + // Parse meta query. + $this->meta_query = new WP_Meta_Query(); + $this->meta_query->parse_query_vars( $q ); + + // Set a flag if a 'pre_get_posts' hook changed the query vars. + $hash = md5( serialize( $this->query_vars ) ); + if ( $hash != $this->query_vars_hash ) { + $this->query_vars_changed = true; + $this->query_vars_hash = $hash; + } + unset( $hash ); + + // First let's clear some variables. + $distinct = ''; + $whichauthor = ''; + $whichmimetype = ''; + $where = ''; + $limits = ''; + $join = ''; + $search = ''; + $groupby = ''; + $post_status_join = false; + $page = 1; + + if ( isset( $q['caller_get_posts'] ) ) { + _deprecated_argument( + 'WP_Query', + '3.1.0', + sprintf( + /* translators: 1: caller_get_posts, 2: ignore_sticky_posts */ + __( '%1$s is deprecated. Use %2$s instead.' ), + '<code>caller_get_posts</code>', + '<code>ignore_sticky_posts</code>' + ) + ); + + if ( ! isset( $q['ignore_sticky_posts'] ) ) { + $q['ignore_sticky_posts'] = $q['caller_get_posts']; + } + } + + if ( ! isset( $q['ignore_sticky_posts'] ) ) { + $q['ignore_sticky_posts'] = false; + } + + if ( ! isset( $q['suppress_filters'] ) ) { + $q['suppress_filters'] = false; + } + + if ( ! isset( $q['cache_results'] ) ) { + if ( wp_using_ext_object_cache() ) { + $q['cache_results'] = false; + } else { + $q['cache_results'] = true; + } + } + + if ( ! isset( $q['update_post_term_cache'] ) ) { + $q['update_post_term_cache'] = true; + } + + if ( ! isset( $q['lazy_load_term_meta'] ) ) { + $q['lazy_load_term_meta'] = $q['update_post_term_cache']; + } + + if ( ! isset( $q['update_post_meta_cache'] ) ) { + $q['update_post_meta_cache'] = true; + } + + if ( ! isset( $q['post_type'] ) ) { + if ( $this->is_search ) { + $q['post_type'] = 'any'; + } else { + $q['post_type'] = ''; + } + } + $post_type = $q['post_type']; + if ( empty( $q['posts_per_page'] ) ) { + $q['posts_per_page'] = get_option( 'posts_per_page' ); + } + if ( isset( $q['showposts'] ) && $q['showposts'] ) { + $q['showposts'] = (int) $q['showposts']; + $q['posts_per_page'] = $q['showposts']; + } + if ( ( isset( $q['posts_per_archive_page'] ) && 0 != $q['posts_per_archive_page'] ) && ( $this->is_archive || $this->is_search ) ) { + $q['posts_per_page'] = $q['posts_per_archive_page']; + } + if ( ! isset( $q['nopaging'] ) ) { + if ( -1 == $q['posts_per_page'] ) { + $q['nopaging'] = true; + } else { + $q['nopaging'] = false; + } + } + + if ( $this->is_feed ) { + // This overrides 'posts_per_page'. + if ( ! empty( $q['posts_per_rss'] ) ) { + $q['posts_per_page'] = $q['posts_per_rss']; + } else { + $q['posts_per_page'] = get_option( 'posts_per_rss' ); + } + $q['nopaging'] = false; + } + $q['posts_per_page'] = (int) $q['posts_per_page']; + if ( $q['posts_per_page'] < -1 ) { + $q['posts_per_page'] = abs( $q['posts_per_page'] ); + } elseif ( 0 == $q['posts_per_page'] ) { + $q['posts_per_page'] = 1; + } + + if ( ! isset( $q['comments_per_page'] ) || 0 == $q['comments_per_page'] ) { + $q['comments_per_page'] = get_option( 'comments_per_page' ); + } + + if ( $this->is_home && ( empty( $this->query ) || 'true' === $q['preview'] ) && ( 'page' === get_option( 'show_on_front' ) ) && get_option( 'page_on_front' ) ) { + $this->is_page = true; + $this->is_home = false; + $q['page_id'] = get_option( 'page_on_front' ); + } + + if ( isset( $q['page'] ) ) { + $q['page'] = trim( $q['page'], '/' ); + $q['page'] = absint( $q['page'] ); + } + + // If true, forcibly turns off SQL_CALC_FOUND_ROWS even when limits are present. + if ( isset( $q['no_found_rows'] ) ) { + $q['no_found_rows'] = (bool) $q['no_found_rows']; + } else { + $q['no_found_rows'] = false; + } + + switch ( $q['fields'] ) { + case 'ids': + $fields = "{$wpdb->posts}.ID"; + break; + case 'id=>parent': + $fields = "{$wpdb->posts}.ID, {$wpdb->posts}.post_parent"; + break; + default: + $fields = "{$wpdb->posts}.*"; + } + + if ( '' !== $q['menu_order'] ) { + $where .= " AND {$wpdb->posts}.menu_order = " . $q['menu_order']; + } + // The "m" parameter is meant for months but accepts datetimes of varying specificity. + if ( $q['m'] ) { + $where .= " AND YEAR({$wpdb->posts}.post_date)=" . substr( $q['m'], 0, 4 ); + if ( strlen( $q['m'] ) > 5 ) { + $where .= " AND MONTH({$wpdb->posts}.post_date)=" . substr( $q['m'], 4, 2 ); + } + if ( strlen( $q['m'] ) > 7 ) { + $where .= " AND DAYOFMONTH({$wpdb->posts}.post_date)=" . substr( $q['m'], 6, 2 ); + } + if ( strlen( $q['m'] ) > 9 ) { + $where .= " AND HOUR({$wpdb->posts}.post_date)=" . substr( $q['m'], 8, 2 ); + } + if ( strlen( $q['m'] ) > 11 ) { + $where .= " AND MINUTE({$wpdb->posts}.post_date)=" . substr( $q['m'], 10, 2 ); + } + if ( strlen( $q['m'] ) > 13 ) { + $where .= " AND SECOND({$wpdb->posts}.post_date)=" . substr( $q['m'], 12, 2 ); + } + } + + // Handle the other individual date parameters. + $date_parameters = array(); + + if ( '' !== $q['hour'] ) { + $date_parameters['hour'] = $q['hour']; + } + + if ( '' !== $q['minute'] ) { + $date_parameters['minute'] = $q['minute']; + } + + if ( '' !== $q['second'] ) { + $date_parameters['second'] = $q['second']; + } + + if ( $q['year'] ) { + $date_parameters['year'] = $q['year']; + } + + if ( $q['monthnum'] ) { + $date_parameters['monthnum'] = $q['monthnum']; + } + + if ( $q['w'] ) { + $date_parameters['week'] = $q['w']; + } + + if ( $q['day'] ) { + $date_parameters['day'] = $q['day']; + } + + if ( $date_parameters ) { + $date_query = new WP_Date_Query( array( $date_parameters ) ); + $where .= $date_query->get_sql(); + } + unset( $date_parameters, $date_query ); + + // Handle complex date queries. + if ( ! empty( $q['date_query'] ) ) { + $this->date_query = new WP_Date_Query( $q['date_query'] ); + $where .= $this->date_query->get_sql(); + } + + // If we've got a post_type AND it's not "any" post_type. + if ( ! empty( $q['post_type'] ) && 'any' != $q['post_type'] ) { + foreach ( (array) $q['post_type'] as $_post_type ) { + $ptype_obj = get_post_type_object( $_post_type ); + if ( ! $ptype_obj || ! $ptype_obj->query_var || empty( $q[ $ptype_obj->query_var ] ) ) { + continue; + } + + if ( ! $ptype_obj->hierarchical ) { + // Non-hierarchical post types can directly use 'name'. + $q['name'] = $q[ $ptype_obj->query_var ]; + } else { + // Hierarchical post types will operate through 'pagename'. + $q['pagename'] = $q[ $ptype_obj->query_var ]; + $q['name'] = ''; + } + + // Only one request for a slug is possible, this is why name & pagename are overwritten above. + break; + } // End foreach. + unset( $ptype_obj ); + } + + if ( '' !== $q['title'] ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_title = %s", stripslashes( $q['title'] ) ); + } + + // Parameters related to 'post_name'. + if ( '' != $q['name'] ) { + $q['name'] = sanitize_title_for_query( $q['name'] ); + $where .= " AND {$wpdb->posts}.post_name = '" . $q['name'] . "'"; + } elseif ( '' != $q['pagename'] ) { + if ( isset( $this->queried_object_id ) ) { + $reqpage = $this->queried_object_id; + } else { + if ( 'page' != $q['post_type'] ) { + foreach ( (array) $q['post_type'] as $_post_type ) { + $ptype_obj = get_post_type_object( $_post_type ); + if ( ! $ptype_obj || ! $ptype_obj->hierarchical ) { + continue; + } + + $reqpage = get_page_by_path( $q['pagename'], OBJECT, $_post_type ); + if ( $reqpage ) { + break; + } + } + unset( $ptype_obj ); + } else { + $reqpage = get_page_by_path( $q['pagename'] ); + } + if ( ! empty( $reqpage ) ) { + $reqpage = $reqpage->ID; + } else { + $reqpage = 0; + } + } + + $page_for_posts = get_option( 'page_for_posts' ); + if ( ( 'page' != get_option( 'show_on_front' ) ) || empty( $page_for_posts ) || ( $reqpage != $page_for_posts ) ) { + $q['pagename'] = sanitize_title_for_query( wp_basename( $q['pagename'] ) ); + $q['name'] = $q['pagename']; + $where .= " AND ({$wpdb->posts}.ID = '$reqpage')"; + $reqpage_obj = get_post( $reqpage ); + if ( is_object( $reqpage_obj ) && 'attachment' == $reqpage_obj->post_type ) { + $this->is_attachment = true; + $post_type = 'attachment'; + $q['post_type'] = 'attachment'; + $this->is_page = true; + $q['attachment_id'] = $reqpage; + } + } + } elseif ( '' != $q['attachment'] ) { + $q['attachment'] = sanitize_title_for_query( wp_basename( $q['attachment'] ) ); + $q['name'] = $q['attachment']; + $where .= " AND {$wpdb->posts}.post_name = '" . $q['attachment'] . "'"; + } elseif ( is_array( $q['post_name__in'] ) && ! empty( $q['post_name__in'] ) ) { + $q['post_name__in'] = array_map( 'sanitize_title_for_query', $q['post_name__in'] ); + $post_name__in = "'" . implode( "','", $q['post_name__in'] ) . "'"; + $where .= " AND {$wpdb->posts}.post_name IN ($post_name__in)"; + } + + // If an attachment is requested by number, let it supersede any post number. + if ( $q['attachment_id'] ) { + $q['p'] = absint( $q['attachment_id'] ); + } + + // If a post number is specified, load that post. + if ( $q['p'] ) { + $where .= " AND {$wpdb->posts}.ID = " . $q['p']; + } elseif ( $q['post__in'] ) { + $post__in = implode( ',', array_map( 'absint', $q['post__in'] ) ); + $where .= " AND {$wpdb->posts}.ID IN ($post__in)"; + } elseif ( $q['post__not_in'] ) { + $post__not_in = implode( ',', array_map( 'absint', $q['post__not_in'] ) ); + $where .= " AND {$wpdb->posts}.ID NOT IN ($post__not_in)"; + } + + if ( is_numeric( $q['post_parent'] ) ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_parent = %d ", $q['post_parent'] ); + } elseif ( $q['post_parent__in'] ) { + $post_parent__in = implode( ',', array_map( 'absint', $q['post_parent__in'] ) ); + $where .= " AND {$wpdb->posts}.post_parent IN ($post_parent__in)"; + } elseif ( $q['post_parent__not_in'] ) { + $post_parent__not_in = implode( ',', array_map( 'absint', $q['post_parent__not_in'] ) ); + $where .= " AND {$wpdb->posts}.post_parent NOT IN ($post_parent__not_in)"; + } + + if ( $q['page_id'] ) { + if ( ( 'page' !== get_option( 'show_on_front' ) ) || ( get_option( 'page_for_posts' ) != $q['page_id'] ) ) { + $q['p'] = $q['page_id']; + $where = " AND {$wpdb->posts}.ID = " . $q['page_id']; + } + } + + // If a search pattern is specified, load the posts that match. + if ( strlen( $q['s'] ) ) { + $search = $this->parse_search( $q ); + } + + if ( ! $q['suppress_filters'] ) { + /** + * Filters the search SQL that is used in the WHERE clause of WP_Query. + * + * @since 3.0.0 + * + * @param string $search Search SQL for WHERE clause. + * @param WP_Query $this The current WP_Query object. + */ + $search = apply_filters_ref_array( 'posts_search', array( $search, &$this ) ); + } + + // Taxonomies. + if ( ! $this->is_singular ) { + $this->parse_tax_query( $q ); + + $clauses = $this->tax_query->get_sql( $wpdb->posts, 'ID' ); + + $join .= $clauses['join']; + $where .= $clauses['where']; + } + + if ( $this->is_tax ) { + if ( empty( $post_type ) ) { + // Do a fully inclusive search for currently registered post types of queried taxonomies. + $post_type = array(); + $taxonomies = array_keys( $this->tax_query->queried_terms ); + foreach ( get_post_types( array( 'exclude_from_search' => false ) ) as $pt ) { + $object_taxonomies = 'attachment' === $pt ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt ); + if ( array_intersect( $taxonomies, $object_taxonomies ) ) { + $post_type[] = $pt; + } + } + if ( ! $post_type ) { + $post_type = 'any'; + } elseif ( count( $post_type ) == 1 ) { + $post_type = $post_type[0]; + } + + $post_status_join = true; + } elseif ( in_array( 'attachment', (array) $post_type ) ) { + $post_status_join = true; + } + } + + /* + * Ensure that 'taxonomy', 'term', 'term_id', 'cat', and + * 'category_name' vars are set for backward compatibility. + */ + if ( ! empty( $this->tax_query->queried_terms ) ) { + + /* + * Set 'taxonomy', 'term', and 'term_id' to the + * first taxonomy other than 'post_tag' or 'category'. + */ + if ( ! isset( $q['taxonomy'] ) ) { + foreach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) { + if ( empty( $queried_items['terms'][0] ) ) { + continue; + } + + if ( ! in_array( $queried_taxonomy, array( 'category', 'post_tag' ) ) ) { + $q['taxonomy'] = $queried_taxonomy; + + if ( 'slug' === $queried_items['field'] ) { + $q['term'] = $queried_items['terms'][0]; + } else { + $q['term_id'] = $queried_items['terms'][0]; + } + + // Take the first one we find. + break; + } + } + } + + // 'cat', 'category_name', 'tag_id'. + foreach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) { + if ( empty( $queried_items['terms'][0] ) ) { + continue; + } + + if ( 'category' === $queried_taxonomy ) { + $the_cat = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'category' ); + if ( $the_cat ) { + $this->set( 'cat', $the_cat->term_id ); + $this->set( 'category_name', $the_cat->slug ); + } + unset( $the_cat ); + } + + if ( 'post_tag' === $queried_taxonomy ) { + $the_tag = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'post_tag' ); + if ( $the_tag ) { + $this->set( 'tag_id', $the_tag->term_id ); + } + unset( $the_tag ); + } + } + } + + if ( ! empty( $this->tax_query->queries ) || ! empty( $this->meta_query->queries ) ) { + $groupby = "{$wpdb->posts}.ID"; + } + + // Author/user stuff. + + if ( ! empty( $q['author'] ) && '0' != $q['author'] ) { + $q['author'] = addslashes_gpc( '' . urldecode( $q['author'] ) ); + $authors = array_unique( array_map( 'intval', preg_split( '/[,\s]+/', $q['author'] ) ) ); + foreach ( $authors as $author ) { + $key = $author > 0 ? 'author__in' : 'author__not_in'; + $q[ $key ][] = abs( $author ); + } + $q['author'] = implode( ',', $authors ); + } + + if ( ! empty( $q['author__not_in'] ) ) { + $author__not_in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__not_in'] ) ) ); + $where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) "; + } elseif ( ! empty( $q['author__in'] ) ) { + $author__in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__in'] ) ) ); + $where .= " AND {$wpdb->posts}.post_author IN ($author__in) "; + } + + // Author stuff for nice URLs. + + if ( '' != $q['author_name'] ) { + if ( strpos( $q['author_name'], '/' ) !== false ) { + $q['author_name'] = explode( '/', $q['author_name'] ); + if ( $q['author_name'][ count( $q['author_name'] ) - 1 ] ) { + $q['author_name'] = $q['author_name'][ count( $q['author_name'] ) - 1 ]; // No trailing slash. + } else { + $q['author_name'] = $q['author_name'][ count( $q['author_name'] ) - 2 ]; // There was a trailing slash. + } + } + $q['author_name'] = sanitize_title_for_query( $q['author_name'] ); + $q['author'] = get_user_by( 'slug', $q['author_name'] ); + if ( $q['author'] ) { + $q['author'] = $q['author']->ID; + } + $whichauthor .= " AND ({$wpdb->posts}.post_author = " . absint( $q['author'] ) . ')'; + } + + // Matching by comment count. + if ( isset( $q['comment_count'] ) ) { + // Numeric comment count is converted to array format. + if ( is_numeric( $q['comment_count'] ) ) { + $q['comment_count'] = array( + 'value' => intval( $q['comment_count'] ), + ); + } + + if ( isset( $q['comment_count']['value'] ) ) { + $q['comment_count'] = array_merge( + array( + 'compare' => '=', + ), + $q['comment_count'] + ); + + // Fallback for invalid compare operators is '='. + $compare_operators = array( '=', '!=', '>', '>=', '<', '<=' ); + if ( ! in_array( $q['comment_count']['compare'], $compare_operators, true ) ) { + $q['comment_count']['compare'] = '='; + } + + $where .= $wpdb->prepare( " AND {$wpdb->posts}.comment_count {$q['comment_count']['compare']} %d", $q['comment_count']['value'] ); + } + } + + // MIME-Type stuff for attachment browsing. + + if ( isset( $q['post_mime_type'] ) && '' != $q['post_mime_type'] ) { + $whichmimetype = wp_post_mime_type_where( $q['post_mime_type'], $wpdb->posts ); + } + $where .= $search . $whichauthor . $whichmimetype; + + if ( ! empty( $this->meta_query->queries ) ) { + $clauses = $this->meta_query->get_sql( 'post', $wpdb->posts, 'ID', $this ); + $join .= $clauses['join']; + $where .= $clauses['where']; + } + + $rand = ( isset( $q['orderby'] ) && 'rand' === $q['orderby'] ); + if ( ! isset( $q['order'] ) ) { + $q['order'] = $rand ? '' : 'DESC'; + } else { + $q['order'] = $rand ? '' : $this->parse_order( $q['order'] ); + } + + // These values of orderby should ignore the 'order' parameter. + $force_asc = array( 'post__in', 'post_name__in', 'post_parent__in' ); + if ( isset( $q['orderby'] ) && in_array( $q['orderby'], $force_asc, true ) ) { + $q['order'] = ''; + } + + // Order by. + if ( empty( $q['orderby'] ) ) { + /* + * Boolean false or empty array blanks out ORDER BY, + * while leaving the value unset or otherwise empty sets the default. + */ + if ( isset( $q['orderby'] ) && ( is_array( $q['orderby'] ) || false === $q['orderby'] ) ) { + $orderby = ''; + } else { + $orderby = "{$wpdb->posts}.post_date " . $q['order']; + } + } elseif ( 'none' == $q['orderby'] ) { + $orderby = ''; + } else { + $orderby_array = array(); + if ( is_array( $q['orderby'] ) ) { + foreach ( $q['orderby'] as $_orderby => $order ) { + $orderby = addslashes_gpc( urldecode( $_orderby ) ); + $parsed = $this->parse_orderby( $orderby ); + + if ( ! $parsed ) { + continue; + } + + $orderby_array[] = $parsed . ' ' . $this->parse_order( $order ); + } + $orderby = implode( ', ', $orderby_array ); + + } else { + $q['orderby'] = urldecode( $q['orderby'] ); + $q['orderby'] = addslashes_gpc( $q['orderby'] ); + + foreach ( explode( ' ', $q['orderby'] ) as $i => $orderby ) { + $parsed = $this->parse_orderby( $orderby ); + // Only allow certain values for safety. + if ( ! $parsed ) { + continue; + } + + $orderby_array[] = $parsed; + } + $orderby = implode( ' ' . $q['order'] . ', ', $orderby_array ); + + if ( empty( $orderby ) ) { + $orderby = "{$wpdb->posts}.post_date " . $q['order']; + } elseif ( ! empty( $q['order'] ) ) { + $orderby .= " {$q['order']}"; + } + } + } + + // Order search results by relevance only when another "orderby" is not specified in the query. + if ( ! empty( $q['s'] ) ) { + $search_orderby = ''; + if ( ! empty( $q['search_orderby_title'] ) && ( empty( $q['orderby'] ) && ! $this->is_feed ) || ( isset( $q['orderby'] ) && 'relevance' === $q['orderby'] ) ) { + $search_orderby = $this->parse_search_order( $q ); + } + + if ( ! $q['suppress_filters'] ) { + /** + * Filters the ORDER BY used when ordering search results. + * + * @since 3.7.0 + * + * @param string $search_orderby The ORDER BY clause. + * @param WP_Query $this The current WP_Query instance. + */ + $search_orderby = apply_filters( 'posts_search_orderby', $search_orderby, $this ); + } + + if ( $search_orderby ) { + $orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby; + } + } + + if ( is_array( $post_type ) && count( $post_type ) > 1 ) { + $post_type_cap = 'multiple_post_type'; + } else { + if ( is_array( $post_type ) ) { + $post_type = reset( $post_type ); + } + $post_type_object = get_post_type_object( $post_type ); + if ( empty( $post_type_object ) ) { + $post_type_cap = $post_type; + } + } + + if ( isset( $q['post_password'] ) ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_password = %s", $q['post_password'] ); + if ( empty( $q['perm'] ) ) { + $q['perm'] = 'readable'; + } + } elseif ( isset( $q['has_password'] ) ) { + $where .= sprintf( " AND {$wpdb->posts}.post_password %s ''", $q['has_password'] ? '!=' : '=' ); + } + + if ( ! empty( $q['comment_status'] ) ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.comment_status = %s ", $q['comment_status'] ); + } + + if ( ! empty( $q['ping_status'] ) ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.ping_status = %s ", $q['ping_status'] ); + } + + if ( 'any' == $post_type ) { + $in_search_post_types = get_post_types( array( 'exclude_from_search' => false ) ); + if ( empty( $in_search_post_types ) ) { + $where .= ' AND 1=0 '; + } else { + $where .= " AND {$wpdb->posts}.post_type IN ('" . join( "', '", array_map( 'esc_sql', $in_search_post_types ) ) . "')"; + } + } elseif ( ! empty( $post_type ) && is_array( $post_type ) ) { + $where .= " AND {$wpdb->posts}.post_type IN ('" . join( "', '", esc_sql( $post_type ) ) . "')"; + } elseif ( ! empty( $post_type ) ) { + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_type = %s", $post_type ); + $post_type_object = get_post_type_object( $post_type ); + } elseif ( $this->is_attachment ) { + $where .= " AND {$wpdb->posts}.post_type = 'attachment'"; + $post_type_object = get_post_type_object( 'attachment' ); + } elseif ( $this->is_page ) { + $where .= " AND {$wpdb->posts}.post_type = 'page'"; + $post_type_object = get_post_type_object( 'page' ); + } else { + $where .= " AND {$wpdb->posts}.post_type = 'post'"; + $post_type_object = get_post_type_object( 'post' ); + } + + $edit_cap = 'edit_post'; + $read_cap = 'read_post'; + + if ( ! empty( $post_type_object ) ) { + $edit_others_cap = $post_type_object->cap->edit_others_posts; + $read_private_cap = $post_type_object->cap->read_private_posts; + } else { + $edit_others_cap = 'edit_others_' . $post_type_cap . 's'; + $read_private_cap = 'read_private_' . $post_type_cap . 's'; + } + + $user_id = get_current_user_id(); + + $q_status = array(); + if ( ! empty( $q['post_status'] ) ) { + $statuswheres = array(); + $q_status = $q['post_status']; + if ( ! is_array( $q_status ) ) { + $q_status = explode( ',', $q_status ); + } + $r_status = array(); + $p_status = array(); + $e_status = array(); + if ( in_array( 'any', $q_status ) ) { + foreach ( get_post_stati( array( 'exclude_from_search' => true ) ) as $status ) { + if ( ! in_array( $status, $q_status ) ) { + $e_status[] = "{$wpdb->posts}.post_status <> '$status'"; + } + } + } else { + foreach ( get_post_stati() as $status ) { + if ( in_array( $status, $q_status ) ) { + if ( 'private' == $status ) { + $p_status[] = "{$wpdb->posts}.post_status = '$status'"; + } else { + $r_status[] = "{$wpdb->posts}.post_status = '$status'"; + } + } + } + } + + if ( empty( $q['perm'] ) || 'readable' != $q['perm'] ) { + $r_status = array_merge( $r_status, $p_status ); + unset( $p_status ); + } + + if ( ! empty( $e_status ) ) { + $statuswheres[] = '(' . join( ' AND ', $e_status ) . ')'; + } + if ( ! empty( $r_status ) ) { + if ( ! empty( $q['perm'] ) && 'editable' == $q['perm'] && ! current_user_can( $edit_others_cap ) ) { + $statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . 'AND (' . join( ' OR ', $r_status ) . '))'; + } else { + $statuswheres[] = '(' . join( ' OR ', $r_status ) . ')'; + } + } + if ( ! empty( $p_status ) ) { + if ( ! empty( $q['perm'] ) && 'readable' == $q['perm'] && ! current_user_can( $read_private_cap ) ) { + $statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . 'AND (' . join( ' OR ', $p_status ) . '))'; + } else { + $statuswheres[] = '(' . join( ' OR ', $p_status ) . ')'; + } + } + if ( $post_status_join ) { + $join .= " LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) "; + foreach ( $statuswheres as $index => $statuswhere ) { + $statuswheres[ $index ] = "($statuswhere OR ({$wpdb->posts}.post_status = 'inherit' AND " . str_replace( $wpdb->posts, 'p2', $statuswhere ) . '))'; + } + } + $where_status = implode( ' OR ', $statuswheres ); + if ( ! empty( $where_status ) ) { + $where .= " AND ($where_status)"; + } + } elseif ( ! $this->is_singular ) { + $where .= " AND ({$wpdb->posts}.post_status = 'publish'"; + + // Add public states. + $public_states = get_post_stati( array( 'public' => true ) ); + foreach ( (array) $public_states as $state ) { + if ( 'publish' == $state ) { // Publish is hard-coded above. + continue; + } + $where .= " OR {$wpdb->posts}.post_status = '$state'"; + } + + if ( $this->is_admin ) { + // Add protected states that should show in the admin all list. + $admin_all_states = get_post_stati( + array( + 'protected' => true, + 'show_in_admin_all_list' => true, + ) + ); + foreach ( (array) $admin_all_states as $state ) { + $where .= " OR {$wpdb->posts}.post_status = '$state'"; + } + } + + if ( is_user_logged_in() ) { + // Add private states that are limited to viewing by the author of a post or someone who has caps to read private states. + $private_states = get_post_stati( array( 'private' => true ) ); + foreach ( (array) $private_states as $state ) { + $where .= current_user_can( $read_private_cap ) ? " OR {$wpdb->posts}.post_status = '$state'" : " OR {$wpdb->posts}.post_author = $user_id AND {$wpdb->posts}.post_status = '$state'"; + } + } + + $where .= ')'; + } + + /* + * Apply filters on where and join prior to paging so that any + * manipulations to them are reflected in the paging by day queries. + */ + if ( ! $q['suppress_filters'] ) { + /** + * Filters the WHERE clause of the query. + * + * @since 1.5.0 + * + * @param string $where The WHERE clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $where = apply_filters_ref_array( 'posts_where', array( $where, &$this ) ); + + /** + * Filters the JOIN clause of the query. + * + * @since 1.5.0 + * + * @param string $join The JOIN clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $join = apply_filters_ref_array( 'posts_join', array( $join, &$this ) ); + } + + // Paging. + if ( empty( $q['nopaging'] ) && ! $this->is_singular ) { + $page = absint( $q['paged'] ); + if ( ! $page ) { + $page = 1; + } + + // If 'offset' is provided, it takes precedence over 'paged'. + if ( isset( $q['offset'] ) && is_numeric( $q['offset'] ) ) { + $q['offset'] = absint( $q['offset'] ); + $pgstrt = $q['offset'] . ', '; + } else { + $pgstrt = absint( ( $page - 1 ) * $q['posts_per_page'] ) . ', '; + } + $limits = 'LIMIT ' . $pgstrt . $q['posts_per_page']; + } + + // Comments feeds. + if ( $this->is_comment_feed && ! $this->is_singular ) { + if ( $this->is_archive || $this->is_search ) { + $cjoin = "JOIN {$wpdb->posts} ON ({$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID) $join "; + $cwhere = "WHERE comment_approved = '1' $where"; + $cgroupby = "{$wpdb->comments}.comment_id"; + } else { // Other non-singular, e.g. front. + $cjoin = "JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID )"; + $cwhere = "WHERE ( post_status = 'publish' OR ( post_status = 'inherit' AND post_type = 'attachment' ) ) AND comment_approved = '1'"; + $cgroupby = ''; + } + + if ( ! $q['suppress_filters'] ) { + /** + * Filters the JOIN clause of the comments feed query before sending. + * + * @since 2.2.0 + * + * @param string $cjoin The JOIN clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $cjoin = apply_filters_ref_array( 'comment_feed_join', array( $cjoin, &$this ) ); + + /** + * Filters the WHERE clause of the comments feed query before sending. + * + * @since 2.2.0 + * + * @param string $cwhere The WHERE clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $cwhere = apply_filters_ref_array( 'comment_feed_where', array( $cwhere, &$this ) ); + + /** + * Filters the GROUP BY clause of the comments feed query before sending. + * + * @since 2.2.0 + * + * @param string $cgroupby The GROUP BY clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( $cgroupby, &$this ) ); + + /** + * Filters the ORDER BY clause of the comments feed query before sending. + * + * @since 2.8.0 + * + * @param string $corderby The ORDER BY clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) ); + + /** + * Filters the LIMIT clause of the comments feed query before sending. + * + * @since 2.8.0 + * + * @param string $climits The JOIN clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option( 'posts_per_rss' ), &$this ) ); + } + + $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : ''; + $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : ''; + $climits = ( ! empty( $climits ) ) ? $climits : ''; + + $comments = (array) $wpdb->get_results( "SELECT $distinct {$wpdb->comments}.* FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits" ); + // Convert to WP_Comment. + $this->comments = array_map( 'get_comment', $comments ); + $this->comment_count = count( $this->comments ); + + $post_ids = array(); + + foreach ( $this->comments as $comment ) { + $post_ids[] = (int) $comment->comment_post_ID; + } + + $post_ids = join( ',', $post_ids ); + $join = ''; + if ( $post_ids ) { + $where = "AND {$wpdb->posts}.ID IN ($post_ids) "; + } else { + $where = 'AND 0'; + } + } + + $pieces = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' ); + + /* + * Apply post-paging filters on where and join. Only plugins that + * manipulate paging queries should use these hooks. + */ + if ( ! $q['suppress_filters'] ) { + /** + * Filters the WHERE clause of the query. + * + * Specifically for manipulating paging queries. + * + * @since 1.5.0 + * + * @param string $where The WHERE clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $where = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) ); + + /** + * Filters the GROUP BY clause of the query. + * + * @since 2.0.0 + * + * @param string $groupby The GROUP BY clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $groupby = apply_filters_ref_array( 'posts_groupby', array( $groupby, &$this ) ); + + /** + * Filters the JOIN clause of the query. + * + * Specifically for manipulating paging queries. + * + * @since 1.5.0 + * + * @param string $join The JOIN clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $join = apply_filters_ref_array( 'posts_join_paged', array( $join, &$this ) ); + + /** + * Filters the ORDER BY clause of the query. + * + * @since 1.5.1 + * + * @param string $orderby The ORDER BY clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $orderby = apply_filters_ref_array( 'posts_orderby', array( $orderby, &$this ) ); + + /** + * Filters the DISTINCT clause of the query. + * + * @since 2.1.0 + * + * @param string $distinct The DISTINCT clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $distinct = apply_filters_ref_array( 'posts_distinct', array( $distinct, &$this ) ); + + /** + * Filters the LIMIT clause of the query. + * + * @since 2.1.0 + * + * @param string $limits The LIMIT clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $limits = apply_filters_ref_array( 'post_limits', array( $limits, &$this ) ); + + /** + * Filters the SELECT clause of the query. + * + * @since 2.1.0 + * + * @param string $fields The SELECT clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $fields = apply_filters_ref_array( 'posts_fields', array( $fields, &$this ) ); + + /** + * Filters all query clauses at once, for convenience. + * + * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT, + * fields (SELECT), and LIMITS clauses. + * + * @since 3.1.0 + * + * @param string[] $clauses Associative array of the clauses for the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $clauses = (array) apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &$this ) ); + + $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; + $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; + $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; + $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; + $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; + $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; + $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; + } + + /** + * Fires to announce the query's current selection parameters. + * + * For use by caching plugins. + * + * @since 2.3.0 + * + * @param string $selection The assembled selection query. + */ + do_action( 'posts_selection', $where . $groupby . $orderby . $limits . $join ); + + /* + * Filters again for the benefit of caching plugins. + * Regular plugins should use the hooks above. + */ + if ( ! $q['suppress_filters'] ) { + /** + * Filters the WHERE clause of the query. + * + * For use by caching plugins. + * + * @since 2.5.0 + * + * @param string $where The WHERE clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $where = apply_filters_ref_array( 'posts_where_request', array( $where, &$this ) ); + + /** + * Filters the GROUP BY clause of the query. + * + * For use by caching plugins. + * + * @since 2.5.0 + * + * @param string $groupby The GROUP BY clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $groupby = apply_filters_ref_array( 'posts_groupby_request', array( $groupby, &$this ) ); + + /** + * Filters the JOIN clause of the query. + * + * For use by caching plugins. + * + * @since 2.5.0 + * + * @param string $join The JOIN clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $join = apply_filters_ref_array( 'posts_join_request', array( $join, &$this ) ); + + /** + * Filters the ORDER BY clause of the query. + * + * For use by caching plugins. + * + * @since 2.5.0 + * + * @param string $orderby The ORDER BY clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $orderby = apply_filters_ref_array( 'posts_orderby_request', array( $orderby, &$this ) ); + + /** + * Filters the DISTINCT clause of the query. + * + * For use by caching plugins. + * + * @since 2.5.0 + * + * @param string $distinct The DISTINCT clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $distinct = apply_filters_ref_array( 'posts_distinct_request', array( $distinct, &$this ) ); + + /** + * Filters the SELECT clause of the query. + * + * For use by caching plugins. + * + * @since 2.5.0 + * + * @param string $fields The SELECT clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $fields = apply_filters_ref_array( 'posts_fields_request', array( $fields, &$this ) ); + + /** + * Filters the LIMIT clause of the query. + * + * For use by caching plugins. + * + * @since 2.5.0 + * + * @param string $limits The LIMIT clause of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $limits = apply_filters_ref_array( 'post_limits_request', array( $limits, &$this ) ); + + /** + * Filters all query clauses at once, for convenience. + * + * For use by caching plugins. + * + * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT, + * fields (SELECT), and LIMITS clauses. + * + * @since 3.1.0 + * + * @param string[] $pieces Associative array of the pieces of the query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); + + $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; + $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; + $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; + $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; + $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; + $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; + $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; + } + + if ( ! empty( $groupby ) ) { + $groupby = 'GROUP BY ' . $groupby; + } + if ( ! empty( $orderby ) ) { + $orderby = 'ORDER BY ' . $orderby; + } + + $found_rows = ''; + if ( ! $q['no_found_rows'] && ! empty( $limits ) ) { + $found_rows = 'SQL_CALC_FOUND_ROWS'; + } + + $old_request = "SELECT $found_rows $distinct $fields FROM {$wpdb->posts} $join WHERE 1=1 $where $groupby $orderby $limits"; + $this->request = $old_request; + + if ( ! $q['suppress_filters'] ) { + /** + * Filters the completed SQL query before sending. + * + * @since 2.0.0 + * + * @param string $request The complete SQL query. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $this->request = apply_filters_ref_array( 'posts_request', array( $this->request, &$this ) ); + } + + /** + * Filters the posts array before the query takes place. + * + * Return a non-null value to bypass WordPress's default post queries. + * + * Filtering functions that require pagination information are encouraged to set + * the `found_posts` and `max_num_pages` properties of the WP_Query object, + * passed to the filter by reference. If WP_Query does not perform a database + * query, it will not have enough information to generate these values itself. + * + * @since 4.6.0 + * + * @param array|null $posts Return an array of post data to short-circuit WP's query, + * or null to allow WP to run its normal queries. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $this->posts = apply_filters_ref_array( 'posts_pre_query', array( null, &$this ) ); + + if ( 'ids' == $q['fields'] ) { + if ( null === $this->posts ) { + $this->posts = $wpdb->get_col( $this->request ); + } + + $this->posts = array_map( 'intval', $this->posts ); + $this->post_count = count( $this->posts ); + $this->set_found_posts( $q, $limits ); + + return $this->posts; + } + + if ( 'id=>parent' == $q['fields'] ) { + if ( null === $this->posts ) { + $this->posts = $wpdb->get_results( $this->request ); + } + + $this->post_count = count( $this->posts ); + $this->set_found_posts( $q, $limits ); + + $r = array(); + foreach ( $this->posts as $key => $post ) { + $this->posts[ $key ]->ID = (int) $post->ID; + $this->posts[ $key ]->post_parent = (int) $post->post_parent; + + $r[ (int) $post->ID ] = (int) $post->post_parent; + } + + return $r; + } + + if ( null === $this->posts ) { + $split_the_query = ( $old_request == $this->request && "{$wpdb->posts}.*" == $fields && ! empty( $limits ) && $q['posts_per_page'] < 500 ); + + /** + * Filters whether to split the query. + * + * Splitting the query will cause it to fetch just the IDs of the found posts + * (and then individually fetch each post by ID), rather than fetching every + * complete row at once. One massive result vs. many small results. + * + * @since 3.4.0 + * + * @param bool $split_the_query Whether or not to split the query. + * @param WP_Query $this The WP_Query instance. + */ + $split_the_query = apply_filters( 'split_the_query', $split_the_query, $this ); + + if ( $split_the_query ) { + // First get the IDs and then fill in the objects. + + $this->request = "SELECT $found_rows $distinct {$wpdb->posts}.ID FROM {$wpdb->posts} $join WHERE 1=1 $where $groupby $orderby $limits"; + + /** + * Filters the Post IDs SQL request before sending. + * + * @since 3.4.0 + * + * @param string $request The post ID request. + * @param WP_Query $this The WP_Query instance. + */ + $this->request = apply_filters( 'posts_request_ids', $this->request, $this ); + + $ids = $wpdb->get_col( $this->request ); + + if ( $ids ) { + $this->posts = $ids; + $this->set_found_posts( $q, $limits ); + _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); + } else { + $this->posts = array(); + } + } else { + $this->posts = $wpdb->get_results( $this->request ); + $this->set_found_posts( $q, $limits ); + } + } + + // Convert to WP_Post objects. + if ( $this->posts ) { + $this->posts = array_map( 'get_post', $this->posts ); + } + + if ( ! $q['suppress_filters'] ) { + /** + * Filters the raw post results array, prior to status checks. + * + * @since 2.3.0 + * + * @param WP_Post[] $posts Array of post objects. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $this->posts = apply_filters_ref_array( 'posts_results', array( $this->posts, &$this ) ); + } + + if ( ! empty( $this->posts ) && $this->is_comment_feed && $this->is_singular ) { + /** This filter is documented in wp-includes/query.php */ + $cjoin = apply_filters_ref_array( 'comment_feed_join', array( '', &$this ) ); + + /** This filter is documented in wp-includes/query.php */ + $cwhere = apply_filters_ref_array( 'comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'", &$this ) ); + + /** This filter is documented in wp-includes/query.php */ + $cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( '', &$this ) ); + $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : ''; + + /** This filter is documented in wp-includes/query.php */ + $corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) ); + $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : ''; + + /** This filter is documented in wp-includes/query.php */ + $climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option( 'posts_per_rss' ), &$this ) ); + + $comments_request = "SELECT {$wpdb->comments}.* FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits"; + $comments = $wpdb->get_results( $comments_request ); + // Convert to WP_Comment. + $this->comments = array_map( 'get_comment', $comments ); + $this->comment_count = count( $this->comments ); + } + + // Check post status to determine if post should be displayed. + if ( ! empty( $this->posts ) && ( $this->is_single || $this->is_page ) ) { + $status = get_post_status( $this->posts[0] ); + + if ( 'attachment' === $this->posts[0]->post_type && 0 === (int) $this->posts[0]->post_parent ) { + $this->is_page = false; + $this->is_single = true; + $this->is_attachment = true; + } + + // If the post_status was specifically requested, let it pass through. + if ( ! in_array( $status, $q_status ) ) { + $post_status_obj = get_post_status_object( $status ); + + if ( $post_status_obj && ! $post_status_obj->public ) { + if ( ! is_user_logged_in() ) { + // User must be logged in to view unpublished posts. + $this->posts = array(); + } else { + if ( $post_status_obj->protected ) { + // User must have edit permissions on the draft to preview. + if ( ! current_user_can( $edit_cap, $this->posts[0]->ID ) ) { + $this->posts = array(); + } else { + $this->is_preview = true; + if ( 'future' != $status ) { + $this->posts[0]->post_date = current_time( 'mysql' ); + } + } + } elseif ( $post_status_obj->private ) { + if ( ! current_user_can( $read_cap, $this->posts[0]->ID ) ) { + $this->posts = array(); + } + } else { + $this->posts = array(); + } + } + } elseif ( ! $post_status_obj ) { + // Post status is not registered, assume it's not public. + if ( ! current_user_can( $edit_cap, $this->posts[0]->ID ) ) { + $this->posts = array(); + } + } + } + + if ( $this->is_preview && $this->posts && current_user_can( $edit_cap, $this->posts[0]->ID ) ) { + /** + * Filters the single post for preview mode. + * + * @since 2.7.0 + * + * @param WP_Post $post_preview The Post object. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $this->posts[0] = get_post( apply_filters_ref_array( 'the_preview', array( $this->posts[0], &$this ) ) ); + } + } + + // Put sticky posts at the top of the posts array. + $sticky_posts = get_option( 'sticky_posts' ); + if ( $this->is_home && $page <= 1 && is_array( $sticky_posts ) && ! empty( $sticky_posts ) && ! $q['ignore_sticky_posts'] ) { + $num_posts = count( $this->posts ); + $sticky_offset = 0; + // Loop over posts and relocate stickies to the front. + for ( $i = 0; $i < $num_posts; $i++ ) { + if ( in_array( $this->posts[ $i ]->ID, $sticky_posts ) ) { + $sticky_post = $this->posts[ $i ]; + // Remove sticky from current position. + array_splice( $this->posts, $i, 1 ); + // Move to front, after other stickies. + array_splice( $this->posts, $sticky_offset, 0, array( $sticky_post ) ); + // Increment the sticky offset. The next sticky will be placed at this offset. + $sticky_offset++; + // Remove post from sticky posts array. + $offset = array_search( $sticky_post->ID, $sticky_posts ); + unset( $sticky_posts[ $offset ] ); + } + } + + // If any posts have been excluded specifically, Ignore those that are sticky. + if ( ! empty( $sticky_posts ) && ! empty( $q['post__not_in'] ) ) { + $sticky_posts = array_diff( $sticky_posts, $q['post__not_in'] ); + } + + // Fetch sticky posts that weren't in the query results. + if ( ! empty( $sticky_posts ) ) { + $stickies = get_posts( + array( + 'post__in' => $sticky_posts, + 'post_type' => $post_type, + 'post_status' => 'publish', + 'nopaging' => true, + ) + ); + + foreach ( $stickies as $sticky_post ) { + array_splice( $this->posts, $sticky_offset, 0, array( $sticky_post ) ); + $sticky_offset++; + } + } + } + + // If comments have been fetched as part of the query, make sure comment meta lazy-loading is set up. + if ( ! empty( $this->comments ) ) { + wp_queue_comments_for_comment_meta_lazyload( $this->comments ); + } + + if ( ! $q['suppress_filters'] ) { + /** + * Filters the array of retrieved posts after they've been fetched and + * internally processed. + * + * @since 1.5.0 + * + * @param WP_Post[] $posts Array of post objects. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $this->posts = apply_filters_ref_array( 'the_posts', array( $this->posts, &$this ) ); + } + + // Ensure that any posts added/modified via one of the filters above are + // of the type WP_Post and are filtered. + if ( $this->posts ) { + $this->post_count = count( $this->posts ); + + $this->posts = array_map( 'get_post', $this->posts ); + + if ( $q['cache_results'] ) { + update_post_caches( $this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); + } + + $this->post = reset( $this->posts ); + } else { + $this->post_count = 0; + $this->posts = array(); + } + + if ( $q['lazy_load_term_meta'] ) { + wp_queue_posts_for_term_meta_lazyload( $this->posts ); + } + + return $this->posts; + } + + /** + * Set up the amount of found posts and the number of pages (if limit clause was used) + * for the current query. + * + * @since 3.5.0 + * + * @param array $q Query variables. + * @param string $limits LIMIT clauses of the query. + */ + private function set_found_posts( $q, $limits ) { + global $wpdb; + // Bail if posts is an empty array. Continue if posts is an empty string, + // null, or false to accommodate caching plugins that fill posts later. + if ( $q['no_found_rows'] || ( is_array( $this->posts ) && ! $this->posts ) ) { + return; + } + + if ( ! empty( $limits ) ) { + /** + * Filters the query to run for retrieving the found posts. + * + * @since 2.1.0 + * + * @param string $found_posts The query to run to find the found posts. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $this->found_posts = $wpdb->get_var( apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) ) ); + } else { + if ( is_array( $this->posts ) ) { + $this->found_posts = count( $this->posts ); + } else { + if ( null === $this->posts ) { + $this->found_posts = 0; + } else { + $this->found_posts = 1; + } + } + } + + /** + * Filters the number of found posts for the query. + * + * @since 2.1.0 + * + * @param int $found_posts The number of posts found. + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + $this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) ); + + if ( ! empty( $limits ) ) { + $this->max_num_pages = ceil( $this->found_posts / $q['posts_per_page'] ); + } + } + + /** + * Set up the next post and iterate current post index. + * + * @since 1.5.0 + * + * @return WP_Post Next post. + */ + public function next_post() { + + $this->current_post++; + + $this->post = $this->posts[ $this->current_post ]; + return $this->post; + } + + /** + * Sets up the current post. + * + * Retrieves the next post, sets up the post, sets the 'in the loop' + * property to true. + * + * @since 1.5.0 + * + * @global WP_Post $post Global post object. + */ + public function the_post() { + global $post; + $this->in_the_loop = true; + + if ( -1 == $this->current_post ) { // Loop has just started. + /** + * Fires once the loop is started. + * + * @since 2.0.0 + * + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + do_action_ref_array( 'loop_start', array( &$this ) ); + } + + $post = $this->next_post(); + $this->setup_postdata( $post ); + } + + /** + * Determines whether there are more posts available in the loop. + * + * Calls the {@see 'loop_end'} action when the loop is complete. + * + * @since 1.5.0 + * + * @return bool True if posts are available, false if end of loop. + */ + public function have_posts() { + if ( $this->current_post + 1 < $this->post_count ) { + return true; + } elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) { + /** + * Fires once the loop has ended. + * + * @since 2.0.0 + * + * @param WP_Query $this The WP_Query instance (passed by reference). + */ + do_action_ref_array( 'loop_end', array( &$this ) ); + // Do some cleaning up after the loop. + $this->rewind_posts(); + } elseif ( 0 === $this->post_count ) { + /** + * Fires if no results are found in a post query. + * + * @since 4.9.0 + * + * @param WP_Query $this The WP_Query instance. + */ + do_action( 'loop_no_results', $this ); + } + + $this->in_the_loop = false; + return false; + } + + /** + * Rewind the posts and reset post index. + * + * @since 1.5.0 + */ + public function rewind_posts() { + $this->current_post = -1; + if ( $this->post_count > 0 ) { + $this->post = $this->posts[0]; + } + } + + /** + * Iterate current comment index and return WP_Comment object. + * + * @since 2.2.0 + * + * @return WP_Comment Comment object. + */ + public function next_comment() { + $this->current_comment++; + + $this->comment = $this->comments[ $this->current_comment ]; + return $this->comment; + } + + /** + * Sets up the current comment. + * + * @since 2.2.0 + * @global WP_Comment $comment Global comment object. + */ + public function the_comment() { + global $comment; + + $comment = $this->next_comment(); + + if ( 0 == $this->current_comment ) { + /** + * Fires once the comment loop is started. + * + * @since 2.2.0 + */ + do_action( 'comment_loop_start' ); + } + } + + /** + * Whether there are more comments available. + * + * Automatically rewinds comments when finished. + * + * @since 2.2.0 + * + * @return bool True, if more comments. False, if no more posts. + */ + public function have_comments() { + if ( $this->current_comment + 1 < $this->comment_count ) { + return true; + } elseif ( $this->current_comment + 1 == $this->comment_count ) { + $this->rewind_comments(); + } + + return false; + } + + /** + * Rewind the comments, resets the comment index and comment to first. + * + * @since 2.2.0 + */ + public function rewind_comments() { + $this->current_comment = -1; + if ( $this->comment_count > 0 ) { + $this->comment = $this->comments[0]; + } + } + + /** + * Sets up the WordPress query by parsing query string. + * + * @since 1.5.0 + * + * @param string|array $query URL query string or array of query arguments. + * @return WP_Post[]|int[] Array of post objects or post IDs. + */ + public function query( $query ) { + $this->init(); + $this->query = wp_parse_args( $query ); + $this->query_vars = $this->query; + return $this->get_posts(); + } + + /** + * Retrieve queried object. + * + * If queried object is not set, then the queried object will be set from + * the category, tag, taxonomy, posts page, single post, page, or author + * query variable. After it is set up, it will be returned. + * + * @since 1.5.0 + * + * @return object + */ + public function get_queried_object() { + if ( isset( $this->queried_object ) ) { + return $this->queried_object; + } + + $this->queried_object = null; + $this->queried_object_id = null; + + if ( $this->is_category || $this->is_tag || $this->is_tax ) { + if ( $this->is_category ) { + if ( $this->get( 'cat' ) ) { + $term = get_term( $this->get( 'cat' ), 'category' ); + } elseif ( $this->get( 'category_name' ) ) { + $term = get_term_by( 'slug', $this->get( 'category_name' ), 'category' ); + } + } elseif ( $this->is_tag ) { + if ( $this->get( 'tag_id' ) ) { + $term = get_term( $this->get( 'tag_id' ), 'post_tag' ); + } elseif ( $this->get( 'tag' ) ) { + $term = get_term_by( 'slug', $this->get( 'tag' ), 'post_tag' ); + } + } else { + // For other tax queries, grab the first term from the first clause. + if ( ! empty( $this->tax_query->queried_terms ) ) { + $queried_taxonomies = array_keys( $this->tax_query->queried_terms ); + $matched_taxonomy = reset( $queried_taxonomies ); + $query = $this->tax_query->queried_terms[ $matched_taxonomy ]; + + if ( ! empty( $query['terms'] ) ) { + if ( 'term_id' == $query['field'] ) { + $term = get_term( reset( $query['terms'] ), $matched_taxonomy ); + } else { + $term = get_term_by( $query['field'], reset( $query['terms'] ), $matched_taxonomy ); + } + } + } + } + + if ( ! empty( $term ) && ! is_wp_error( $term ) ) { + $this->queried_object = $term; + $this->queried_object_id = (int) $term->term_id; + + if ( $this->is_category && 'category' === $this->queried_object->taxonomy ) { + _make_cat_compat( $this->queried_object ); + } + } + } elseif ( $this->is_post_type_archive ) { + $post_type = $this->get( 'post_type' ); + if ( is_array( $post_type ) ) { + $post_type = reset( $post_type ); + } + $this->queried_object = get_post_type_object( $post_type ); + } elseif ( $this->is_posts_page ) { + $page_for_posts = get_option( 'page_for_posts' ); + $this->queried_object = get_post( $page_for_posts ); + $this->queried_object_id = (int) $this->queried_object->ID; + } elseif ( $this->is_singular && ! empty( $this->post ) ) { + $this->queried_object = $this->post; + $this->queried_object_id = (int) $this->post->ID; + } elseif ( $this->is_author ) { + $this->queried_object_id = (int) $this->get( 'author' ); + $this->queried_object = get_userdata( $this->queried_object_id ); + } + + return $this->queried_object; + } + + /** + * Retrieve ID of the current queried object. + * + * @since 1.5.0 + * + * @return int + */ + public function get_queried_object_id() { + $this->get_queried_object(); + + if ( isset( $this->queried_object_id ) ) { + return $this->queried_object_id; + } + + return 0; + } + + /** + * Constructor. + * + * Sets up the WordPress query, if parameter is not empty. + * + * @since 1.5.0 + * + * @param string|array $query URL query string or array of vars. + */ + public function __construct( $query = '' ) { + if ( ! empty( $query ) ) { + $this->query( $query ); + } + } + + /** + * Make private properties readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to get. + * @return mixed Property. + */ + public function __get( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + return $this->$name; + } + } + + /** + * Make private properties checkable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @return bool Whether the property is set. + */ + public function __isset( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + return isset( $this->$name ); + } + } + + /** + * Make private/protected methods readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Method to call. + * @param array $arguments Arguments to pass when calling. + * @return mixed|false Return value of the callback, false otherwise. + */ + public function __call( $name, $arguments ) { + if ( in_array( $name, $this->compat_methods ) ) { + return $this->$name( ...$arguments ); + } + return false; + } + + /** + * Is the query for an existing archive page? + * + * Month, Year, Category, Author, Post Type archive... + * + * @since 3.1.0 + * + * @return bool + */ + public function is_archive() { + return (bool) $this->is_archive; + } + + /** + * Is the query for an existing post type archive page? + * + * @since 3.1.0 + * + * @param string|string[] $post_types Optional. Post type or array of posts types + * to check against. Default empty. + * @return bool + */ + public function is_post_type_archive( $post_types = '' ) { + if ( empty( $post_types ) || ! $this->is_post_type_archive ) { + return (bool) $this->is_post_type_archive; + } + + $post_type = $this->get( 'post_type' ); + if ( is_array( $post_type ) ) { + $post_type = reset( $post_type ); + } + $post_type_object = get_post_type_object( $post_type ); + + return in_array( $post_type_object->name, (array) $post_types ); + } + + /** + * Is the query for an existing attachment page? + * + * @since 3.1.0 + * + * @param int|string|int[]|string[] $attachment Optional. Attachment ID, title, slug, or array of such + * to check against. Default empty. + * @return bool + */ + public function is_attachment( $attachment = '' ) { + if ( ! $this->is_attachment ) { + return false; + } + + if ( empty( $attachment ) ) { + return true; + } + + $attachment = array_map( 'strval', (array) $attachment ); + + $post_obj = $this->get_queried_object(); + + if ( in_array( (string) $post_obj->ID, $attachment ) ) { + return true; + } elseif ( in_array( $post_obj->post_title, $attachment ) ) { + return true; + } elseif ( in_array( $post_obj->post_name, $attachment ) ) { + return true; + } + return false; + } + + /** + * Is the query for an existing author archive page? + * + * If the $author parameter is specified, this function will additionally + * check if the query is for one of the authors specified. + * + * @since 3.1.0 + * + * @param int|string|int[]|string[] $author Optional. User ID, nickname, nicename, or array of such + * to check against. Default empty. + * @return bool + */ + public function is_author( $author = '' ) { + if ( ! $this->is_author ) { + return false; + } + + if ( empty( $author ) ) { + return true; + } + + $author_obj = $this->get_queried_object(); + + $author = array_map( 'strval', (array) $author ); + + if ( in_array( (string) $author_obj->ID, $author ) ) { + return true; + } elseif ( in_array( $author_obj->nickname, $author ) ) { + return true; + } elseif ( in_array( $author_obj->user_nicename, $author ) ) { + return true; + } + + return false; + } + + /** + * Is the query for an existing category archive page? + * + * If the $category parameter is specified, this function will additionally + * check if the query is for one of the categories specified. + * + * @since 3.1.0 + * + * @param int|string|int[]|string[] $category Optional. Category ID, name, slug, or array of such + * to check against. Default empty. + * @return bool + */ + public function is_category( $category = '' ) { + if ( ! $this->is_category ) { + return false; + } + + if ( empty( $category ) ) { + return true; + } + + $cat_obj = $this->get_queried_object(); + + $category = array_map( 'strval', (array) $category ); + + if ( in_array( (string) $cat_obj->term_id, $category ) ) { + return true; + } elseif ( in_array( $cat_obj->name, $category ) ) { + return true; + } elseif ( in_array( $cat_obj->slug, $category ) ) { + return true; + } + + return false; + } + + /** + * Is the query for an existing tag archive page? + * + * If the $tag parameter is specified, this function will additionally + * check if the query is for one of the tags specified. + * + * @since 3.1.0 + * + * @param int|string|int[]|string[] $tag Optional. Tag ID, name, slug, or array of such + * to check against. Default empty. + * @return bool + */ + public function is_tag( $tag = '' ) { + if ( ! $this->is_tag ) { + return false; + } + + if ( empty( $tag ) ) { + return true; + } + + $tag_obj = $this->get_queried_object(); + + $tag = array_map( 'strval', (array) $tag ); + + if ( in_array( (string) $tag_obj->term_id, $tag ) ) { + return true; + } elseif ( in_array( $tag_obj->name, $tag ) ) { + return true; + } elseif ( in_array( $tag_obj->slug, $tag ) ) { + return true; + } + + return false; + } + + /** + * Is the query for an existing custom taxonomy archive page? + * + * If the $taxonomy parameter is specified, this function will additionally + * check if the query is for that specific $taxonomy. + * + * If the $term parameter is specified in addition to the $taxonomy parameter, + * this function will additionally check if the query is for one of the terms + * specified. + * + * @since 3.1.0 + * + * @global array $wp_taxonomies + * + * @param string|string[] $taxonomy Optional. Taxonomy slug or slugs to check against. + * Default empty. + * @param int|string|int[]|string[] $term Optional. Term ID, name, slug, or array of such + * to check against. Default empty. + * @return bool True for custom taxonomy archive pages, false for built-in taxonomies + * (category and tag archives). + */ + public function is_tax( $taxonomy = '', $term = '' ) { + global $wp_taxonomies; + + if ( ! $this->is_tax ) { + return false; + } + + if ( empty( $taxonomy ) ) { + return true; + } + + $queried_object = $this->get_queried_object(); + $tax_array = array_intersect( array_keys( $wp_taxonomies ), (array) $taxonomy ); + $term_array = (array) $term; + + // Check that the taxonomy matches. + if ( ! ( isset( $queried_object->taxonomy ) && count( $tax_array ) && in_array( $queried_object->taxonomy, $tax_array ) ) ) { + return false; + } + + // Only a taxonomy provided. + if ( empty( $term ) ) { + return true; + } + + return isset( $queried_object->term_id ) && + count( + array_intersect( + array( $queried_object->term_id, $queried_object->name, $queried_object->slug ), + $term_array + ) + ); + } + + /** + * Whether the current URL is within the comments popup window. + * + * @since 3.1.0 + * @deprecated 4.5.0 + * + * @return bool + */ + public function is_comments_popup() { + _deprecated_function( __FUNCTION__, '4.5.0' ); + + return false; + } + + /** + * Is the query for an existing date archive? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_date() { + return (bool) $this->is_date; + } + + /** + * Is the query for an existing day archive? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_day() { + return (bool) $this->is_day; + } + + /** + * Is the query for a feed? + * + * @since 3.1.0 + * + * @param string|string[] $feeds Optional. Feed type or array of feed types + * to check against. Default empty. + * @return bool + */ + public function is_feed( $feeds = '' ) { + if ( empty( $feeds ) || ! $this->is_feed ) { + return (bool) $this->is_feed; + } + $qv = $this->get( 'feed' ); + if ( 'feed' == $qv ) { + $qv = get_default_feed(); + } + return in_array( $qv, (array) $feeds ); + } + + /** + * Is the query for a comments feed? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_comment_feed() { + return (bool) $this->is_comment_feed; + } + + /** + * Is the query for the front page of the site? + * + * This is for what is displayed at your site's main URL. + * + * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_on_front'. + * + * If you set a static page for the front page of your site, this function will return + * true when viewing that page. + * + * Otherwise the same as @see WP_Query::is_home() + * + * @since 3.1.0 + * + * @return bool True, if front of site. + */ + public function is_front_page() { + // Most likely case. + if ( 'posts' == get_option( 'show_on_front' ) && $this->is_home() ) { + return true; + } elseif ( 'page' == get_option( 'show_on_front' ) && get_option( 'page_on_front' ) && $this->is_page( get_option( 'page_on_front' ) ) ) { + return true; + } else { + return false; + } + } + + /** + * Is the query for the blog homepage? + * + * This is the page which shows the time based blog content of your site. + * + * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_for_posts'. + * + * If you set a static page for the front page of your site, this function will return + * true only on the page you set as the "Posts page". + * + * @see WP_Query::is_front_page() + * + * @since 3.1.0 + * + * @return bool True if blog view homepage. + */ + public function is_home() { + return (bool) $this->is_home; + } + + /** + * Is the query for the Privacy Policy page? + * + * This is the page which shows the Privacy Policy content of your site. + * + * Depends on the site's "Change your Privacy Policy page" Privacy Settings 'wp_page_for_privacy_policy'. + * + * This function will return true only on the page you set as the "Privacy Policy page". + * + * @since 5.2.0 + * + * @return bool True, if Privacy Policy page. + */ + public function is_privacy_policy() { + if ( get_option( 'wp_page_for_privacy_policy' ) && $this->is_page( get_option( 'wp_page_for_privacy_policy' ) ) ) { + return true; + } else { + return false; + } + } + + /** + * Is the query for an existing month archive? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_month() { + return (bool) $this->is_month; + } + + /** + * Is the query for an existing single page? + * + * If the $page parameter is specified, this function will additionally + * check if the query is for one of the pages specified. + * + * @see WP_Query::is_single() + * @see WP_Query::is_singular() + * + * @since 3.1.0 + * + * @param int|string|int[]|string[] $page Optional. Page ID, title, slug, path, or array of such + * to check against. Default empty. + * @return bool Whether the query is for an existing single page. + */ + public function is_page( $page = '' ) { + if ( ! $this->is_page ) { + return false; + } + + if ( empty( $page ) ) { + return true; + } + + $page_obj = $this->get_queried_object(); + + $page = array_map( 'strval', (array) $page ); + + if ( in_array( (string) $page_obj->ID, $page ) ) { + return true; + } elseif ( in_array( $page_obj->post_title, $page ) ) { + return true; + } elseif ( in_array( $page_obj->post_name, $page ) ) { + return true; + } else { + foreach ( $page as $pagepath ) { + if ( ! strpos( $pagepath, '/' ) ) { + continue; + } + $pagepath_obj = get_page_by_path( $pagepath ); + + if ( $pagepath_obj && ( $pagepath_obj->ID == $page_obj->ID ) ) { + return true; + } + } + } + + return false; + } + + /** + * Is the query for paged result and not for the first page? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_paged() { + return (bool) $this->is_paged; + } + + /** + * Is the query for a post or page preview? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_preview() { + return (bool) $this->is_preview; + } + + /** + * Is the query for the robots.txt file? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_robots() { + return (bool) $this->is_robots; + } + + /** + * Is the query for the favicon.ico file? + * + * @since 5.4.0 + * + * @return bool + */ + public function is_favicon() { + return (bool) $this->is_favicon; + } + + /** + * Is the query for a search? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_search() { + return (bool) $this->is_search; + } + + /** + * Is the query for an existing single post? + * + * Works for any post type excluding pages. + * + * If the $post parameter is specified, this function will additionally + * check if the query is for one of the Posts specified. + * + * @see WP_Query::is_page() + * @see WP_Query::is_singular() + * + * @since 3.1.0 + * + * @param int|string|int[]|string[] $post Optional. Post ID, title, slug, path, or array of such + * to check against. Default empty. + * @return bool Whether the query is for an existing single post. + */ + public function is_single( $post = '' ) { + if ( ! $this->is_single ) { + return false; + } + + if ( empty( $post ) ) { + return true; + } + + $post_obj = $this->get_queried_object(); + + $post = array_map( 'strval', (array) $post ); + + if ( in_array( (string) $post_obj->ID, $post ) ) { + return true; + } elseif ( in_array( $post_obj->post_title, $post ) ) { + return true; + } elseif ( in_array( $post_obj->post_name, $post ) ) { + return true; + } else { + foreach ( $post as $postpath ) { + if ( ! strpos( $postpath, '/' ) ) { + continue; + } + $postpath_obj = get_page_by_path( $postpath, OBJECT, $post_obj->post_type ); + + if ( $postpath_obj && ( $postpath_obj->ID == $post_obj->ID ) ) { + return true; + } + } + } + return false; + } + + /** + * Is the query for an existing single post of any post type (post, attachment, page, + * custom post types)? + * + * If the $post_types parameter is specified, this function will additionally + * check if the query is for one of the Posts Types specified. + * + * @see WP_Query::is_page() + * @see WP_Query::is_single() + * + * @since 3.1.0 + * + * @param string|string[] $post_types Optional. Post type or array of post types + * to check against. Default empty. + * @return bool Whether the query is for an existing single post + * or any of the given post types. + */ + public function is_singular( $post_types = '' ) { + if ( empty( $post_types ) || ! $this->is_singular ) { + return (bool) $this->is_singular; + } + + $post_obj = $this->get_queried_object(); + + return in_array( $post_obj->post_type, (array) $post_types ); + } + + /** + * Is the query for a specific time? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_time() { + return (bool) $this->is_time; + } + + /** + * Is the query for a trackback endpoint call? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_trackback() { + return (bool) $this->is_trackback; + } + + /** + * Is the query for an existing year archive? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_year() { + return (bool) $this->is_year; + } + + /** + * Is the query a 404 (returns no results)? + * + * @since 3.1.0 + * + * @return bool + */ + public function is_404() { + return (bool) $this->is_404; + } + + /** + * Is the query for an embedded post? + * + * @since 4.4.0 + * + * @return bool + */ + public function is_embed() { + return (bool) $this->is_embed; + } + + /** + * Is the query the main query? + * + * @since 3.3.0 + * + * @global WP_Query $wp_query WordPress Query object. + * + * @return bool + */ + public function is_main_query() { + global $wp_the_query; + return $wp_the_query === $this; + } + + /** + * Set up global post data. + * + * @since 4.1.0 + * @since 4.4.0 Added the ability to pass a post ID to `$post`. + * + * @global int $id + * @global WP_User $authordata + * @global string $currentday + * @global string $currentmonth + * @global int $page + * @global array $pages + * @global int $multipage + * @global int $more + * @global int $numpages + * + * @param WP_Post|object|int $post WP_Post instance or Post ID/object. + * @return true True when finished. + */ + public function setup_postdata( $post ) { + global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages; + + if ( ! ( $post instanceof WP_Post ) ) { + $post = get_post( $post ); + } + + if ( ! $post ) { + return; + } + + $elements = $this->generate_postdata( $post ); + if ( false === $elements ) { + return; + } + + $id = $elements['id']; + $authordata = $elements['authordata']; + $currentday = $elements['currentday']; + $currentmonth = $elements['currentmonth']; + $page = $elements['page']; + $pages = $elements['pages']; + $multipage = $elements['multipage']; + $more = $elements['more']; + $numpages = $elements['numpages']; + + /** + * Fires once the post data has been setup. + * + * @since 2.8.0 + * @since 4.1.0 Introduced `$this` parameter. + * + * @param WP_Post $post The Post object (passed by reference). + * @param WP_Query $this The current Query object (passed by reference). + */ + do_action_ref_array( 'the_post', array( &$post, &$this ) ); + + return true; + } + + /** + * Generate post data. + * + * @since 5.2.0 + * + * @param WP_Post|object|int $post WP_Post instance or Post ID/object. + * @return array|bool $elements Elements of post or false on failure. + */ + public function generate_postdata( $post ) { + + if ( ! ( $post instanceof WP_Post ) ) { + $post = get_post( $post ); + } + + if ( ! $post ) { + return false; + } + + $id = (int) $post->ID; + + $authordata = get_userdata( $post->post_author ); + + $currentday = mysql2date( 'd.m.y', $post->post_date, false ); + $currentmonth = mysql2date( 'm', $post->post_date, false ); + $numpages = 1; + $multipage = 0; + $page = $this->get( 'page' ); + if ( ! $page ) { + $page = 1; + } + + /* + * Force full post content when viewing the permalink for the $post, + * or when on an RSS feed. Otherwise respect the 'more' tag. + */ + if ( get_queried_object_id() === $post->ID && ( $this->is_page() || $this->is_single() ) ) { + $more = 1; + } elseif ( $this->is_feed() ) { + $more = 1; + } else { + $more = 0; + } + + $content = $post->post_content; + if ( false !== strpos( $content, '<!--nextpage-->' ) ) { + $content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content ); + $content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content ); + $content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content ); + + // Remove the nextpage block delimiters, to avoid invalid block structures in the split content. + $content = str_replace( '<!-- wp:nextpage -->', '', $content ); + $content = str_replace( '<!-- /wp:nextpage -->', '', $content ); + + // Ignore nextpage at the beginning of the content. + if ( 0 === strpos( $content, '<!--nextpage-->' ) ) { + $content = substr( $content, 15 ); + } + + $pages = explode( '<!--nextpage-->', $content ); + } else { + $pages = array( $post->post_content ); + } + + /** + * Filters the "pages" derived from splitting the post content. + * + * "Pages" are determined by splitting the post content based on the presence + * of `<!-- nextpage -->` tags. + * + * @since 4.4.0 + * + * @param string[] $pages Array of "pages" from the post content split by `<!-- nextpage -->` tags. + * @param WP_Post $post Current post object. + */ + $pages = apply_filters( 'content_pagination', $pages, $post ); + + $numpages = count( $pages ); + + if ( $numpages > 1 ) { + if ( $page > 1 ) { + $more = 1; + } + $multipage = 1; + } else { + $multipage = 0; + } + + $elements = compact( 'id', 'authordata', 'currentday', 'currentmonth', 'page', 'pages', 'multipage', 'more', 'numpages' ); + + return $elements; + } + /** + * After looping through a nested query, this function + * restores the $post global to the current post in this query. + * + * @since 3.7.0 + * + * @global WP_Post $post Global post object. + */ + public function reset_postdata() { + if ( ! empty( $this->post ) ) { + $GLOBALS['post'] = $this->post; + $this->setup_postdata( $this->post ); + } + } + + /** + * Lazyload term meta for posts in the loop. + * + * @since 4.4.0 + * @deprecated 4.5.0 See wp_queue_posts_for_term_meta_lazyload(). + * + * @param mixed $check + * @param int $term_id + * @return mixed + */ + public function lazyload_term_meta( $check, $term_id ) { + _deprecated_function( __METHOD__, '4.5.0' ); + return $check; + } + + /** + * Lazyload comment meta for comments in the loop. + * + * @since 4.4.0 + * @deprecated 4.5.0 See wp_queue_comments_for_comment_meta_lazyload(). + * + * @param mixed $check + * @param int $comment_id + * @return mixed + */ + public function lazyload_comment_meta( $check, $comment_id ) { + _deprecated_function( __METHOD__, '4.5.0' ); + return $check; + } +} diff --git a/wp-includes/class-wp-recovery-mode-cookie-service.php b/wp-includes/class-wp-recovery-mode-cookie-service.php new file mode 100644 index 0000000..6d38e1e --- /dev/null +++ b/wp-includes/class-wp-recovery-mode-cookie-service.php @@ -0,0 +1,233 @@ +<?php +/** + * Error Protection API: WP_Recovery_Mode_Cookie_Service class + * + * @package WordPress + * @since 5.2.0 + */ + +/** + * Core class used to set, validate, and clear cookies that identify a Recovery Mode session. + * + * @since 5.2.0 + */ +final class WP_Recovery_Mode_Cookie_Service { + + /** + * Checks whether the recovery mode cookie is set. + * + * @since 5.2.0 + * + * @return bool True if the cookie is set, false otherwise. + */ + public function is_cookie_set() { + return ! empty( $_COOKIE[ RECOVERY_MODE_COOKIE ] ); + } + + /** + * Sets the recovery mode cookie. + * + * This must be immediately followed by exiting the request. + * + * @since 5.2.0 + */ + public function set_cookie() { + + $value = $this->generate_cookie(); + + /** + * Filter the length of time a Recovery Mode cookie is valid for. + * + * @since 5.2.0 + * + * @param int $length Length in seconds. + */ + $length = apply_filters( 'recovery_mode_cookie_length', WEEK_IN_SECONDS ); + $expire = time() + $length; + + setcookie( RECOVERY_MODE_COOKIE, $value, $expire, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true ); + + if ( COOKIEPATH !== SITECOOKIEPATH ) { + setcookie( RECOVERY_MODE_COOKIE, $value, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, is_ssl(), true ); + } + } + + /** + * Clears the recovery mode cookie. + * + * @since 5.2.0 + */ + public function clear_cookie() { + setcookie( RECOVERY_MODE_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN ); + setcookie( RECOVERY_MODE_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN ); + } + + /** + * Validates the recovery mode cookie. + * + * @since 5.2.0 + * + * @param string $cookie Optionally specify the cookie string. + * If omitted, it will be retrieved from the super global. + * @return true|WP_Error True on success, error object on failure. + */ + public function validate_cookie( $cookie = '' ) { + + if ( ! $cookie ) { + if ( empty( $_COOKIE[ RECOVERY_MODE_COOKIE ] ) ) { + return new WP_Error( 'no_cookie', __( 'No cookie present.' ) ); + } + + $cookie = $_COOKIE[ RECOVERY_MODE_COOKIE ]; + } + + $parts = $this->parse_cookie( $cookie ); + + if ( is_wp_error( $parts ) ) { + return $parts; + } + + list( , $created_at, $random, $signature ) = $parts; + + if ( ! ctype_digit( $created_at ) ) { + return new WP_Error( 'invalid_created_at', __( 'Invalid cookie format.' ) ); + } + + /** This filter is documented in wp-includes/class-wp-recovery-mode-cookie-service.php */ + $length = apply_filters( 'recovery_mode_cookie_length', WEEK_IN_SECONDS ); + + if ( time() > $created_at + $length ) { + return new WP_Error( 'expired', __( 'Cookie expired.' ) ); + } + + $to_sign = sprintf( 'recovery_mode|%s|%s', $created_at, $random ); + $hashed = $this->recovery_mode_hash( $to_sign ); + + if ( ! hash_equals( $signature, $hashed ) ) { + return new WP_Error( 'signature_mismatch', __( 'Invalid cookie.' ) ); + } + + return true; + } + + /** + * Gets the session identifier from the cookie. + * + * The cookie should be validated before calling this API. + * + * @since 5.2.0 + * + * @param string $cookie Optionally specify the cookie string. + * If omitted, it will be retrieved from the super global. + * @return string|WP_Error Session ID on success, or error object on failure. + */ + public function get_session_id_from_cookie( $cookie = '' ) { + if ( ! $cookie ) { + if ( empty( $_COOKIE[ RECOVERY_MODE_COOKIE ] ) ) { + return new WP_Error( 'no_cookie', __( 'No cookie present.' ) ); + } + + $cookie = $_COOKIE[ RECOVERY_MODE_COOKIE ]; + } + + $parts = $this->parse_cookie( $cookie ); + if ( is_wp_error( $parts ) ) { + return $parts; + } + + list( , , $random ) = $parts; + + return sha1( $random ); + } + + /** + * Parses the cookie into its four parts. + * + * @since 5.2.0 + * + * @param string $cookie Cookie content. + * @return array|WP_Error Cookie parts array, or error object on failure. + */ + private function parse_cookie( $cookie ) { + $cookie = base64_decode( $cookie ); + $parts = explode( '|', $cookie ); + + if ( 4 !== count( $parts ) ) { + return new WP_Error( 'invalid_format', __( 'Invalid cookie format.' ) ); + } + + return $parts; + } + + /** + * Generates the recovery mode cookie value. + * + * The cookie is a base64 encoded string with the following format: + * + * recovery_mode|iat|rand|signature + * + * Where "recovery_mode" is a constant string, + * iat is the time the cookie was generated at, + * rand is a randomly generated password that is also used as a session identifier + * and signature is an hmac of the preceding 3 parts. + * + * @since 5.2.0 + * + * @return string Generated cookie content. + */ + private function generate_cookie() { + $to_sign = sprintf( 'recovery_mode|%s|%s', time(), wp_generate_password( 20, false ) ); + $signed = $this->recovery_mode_hash( $to_sign ); + + return base64_encode( sprintf( '%s|%s', $to_sign, $signed ) ); + } + + /** + * Gets a form of `wp_hash()` specific to Recovery Mode. + * + * We cannot use `wp_hash()` because it is defined in `pluggable.php` which is not loaded until after plugins are loaded, + * which is too late to verify the recovery mode cookie. + * + * This tries to use the `AUTH` salts first, but if they aren't valid specific salts will be generated and stored. + * + * @since 5.2.0 + * + * @param string $data Data to hash. + * @return string|false The hashed $data, or false on failure. + */ + private function recovery_mode_hash( $data ) { + if ( ! defined( 'AUTH_KEY' ) || AUTH_KEY === 'put your unique phrase here' ) { + $auth_key = get_site_option( 'recovery_mode_auth_key' ); + + if ( ! $auth_key ) { + if ( ! function_exists( 'wp_generate_password' ) ) { + require_once ABSPATH . WPINC . '/pluggable.php'; + } + + $auth_key = wp_generate_password( 64, true, true ); + update_site_option( 'recovery_mode_auth_key', $auth_key ); + } + } else { + $auth_key = AUTH_KEY; + } + + if ( ! defined( 'AUTH_SALT' ) || AUTH_SALT === 'put your unique phrase here' || AUTH_SALT === $auth_key ) { + $auth_salt = get_site_option( 'recovery_mode_auth_salt' ); + + if ( ! $auth_salt ) { + if ( ! function_exists( 'wp_generate_password' ) ) { + require_once ABSPATH . WPINC . '/pluggable.php'; + } + + $auth_salt = wp_generate_password( 64, true, true ); + update_site_option( 'recovery_mode_auth_salt', $auth_salt ); + } + } else { + $auth_salt = AUTH_SALT; + } + + $secret = $auth_key . $auth_salt; + + return hash_hmac( 'sha1', $data, $secret ); + } +} diff --git a/wp-includes/class-wp-recovery-mode-email-service.php b/wp-includes/class-wp-recovery-mode-email-service.php new file mode 100644 index 0000000..9ef9353 --- /dev/null +++ b/wp-includes/class-wp-recovery-mode-email-service.php @@ -0,0 +1,352 @@ +<?php +/** + * Error Protection API: WP_Recovery_Mode_Email_Link class + * + * @package WordPress + * @since 5.2.0 + */ + +/** + * Core class used to send an email with a link to begin Recovery Mode. + * + * @since 5.2.0 + */ +final class WP_Recovery_Mode_Email_Service { + + const RATE_LIMIT_OPTION = 'recovery_mode_email_last_sent'; + + /** + * Service to generate recovery mode URLs. + * + * @since 5.2.0 + * @var WP_Recovery_Mode_Link_Service + */ + private $link_service; + + /** + * WP_Recovery_Mode_Email_Service constructor. + * + * @since 5.2.0 + * + * @param WP_Recovery_Mode_Link_Service $link_service + */ + public function __construct( WP_Recovery_Mode_Link_Service $link_service ) { + $this->link_service = $link_service; + } + + /** + * Sends the recovery mode email if the rate limit has not been sent. + * + * @since 5.2.0 + * + * @param int $rate_limit Number of seconds before another email can be sent. + * @param array $error Error details from {@see error_get_last()} + * @param array $extension The extension that caused the error. { + * @type string $slug The extension slug. The plugin or theme's directory. + * @type string $type The extension type. Either 'plugin' or 'theme'. + * } + * @return true|WP_Error True if email sent, WP_Error otherwise. + */ + public function maybe_send_recovery_mode_email( $rate_limit, $error, $extension ) { + + $last_sent = get_option( self::RATE_LIMIT_OPTION ); + + if ( ! $last_sent || time() > $last_sent + $rate_limit ) { + if ( ! update_option( self::RATE_LIMIT_OPTION, time() ) ) { + return new WP_Error( 'storage_error', __( 'Could not update the email last sent time.' ) ); + } + + $sent = $this->send_recovery_mode_email( $rate_limit, $error, $extension ); + + if ( $sent ) { + return true; + } + + return new WP_Error( + 'email_failed', + sprintf( + /* translators: %s: mail() */ + __( 'The email could not be sent. Possible reason: your host may have disabled the %s function.' ), + 'mail()' + ) + ); + } + + $err_message = sprintf( + /* translators: 1. Last sent as a human time diff, 2. Wait time as a human time diff. */ + __( 'A recovery link was already sent %1$s ago. Please wait another %2$s before requesting a new email.' ), + human_time_diff( $last_sent ), + human_time_diff( $last_sent + $rate_limit ) + ); + + return new WP_Error( 'email_sent_already', $err_message ); + } + + /** + * Clears the rate limit, allowing a new recovery mode email to be sent immediately. + * + * @since 5.2.0 + * + * @return bool True on success, false on failure. + */ + public function clear_rate_limit() { + return delete_option( self::RATE_LIMIT_OPTION ); + } + + /** + * Sends the Recovery Mode email to the site admin email address. + * + * @since 5.2.0 + * + * @param int $rate_limit Number of seconds before another email can be sent. + * @param array $error Error details from {@see error_get_last()} + * @param array $extension Extension that caused the error. + * + * @return bool Whether the email was sent successfully. + */ + private function send_recovery_mode_email( $rate_limit, $error, $extension ) { + + $url = $this->link_service->generate_url(); + $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); + + $switched_locale = false; + + // The switch_to_locale() function is loaded before it can actually be used. + if ( function_exists( 'switch_to_locale' ) && isset( $GLOBALS['wp_locale_switcher'] ) ) { + $switched_locale = switch_to_locale( get_locale() ); + } + + if ( $extension ) { + $cause = $this->get_cause( $extension ); + $details = wp_strip_all_tags( wp_get_extension_error_description( $error ) ); + + if ( $details ) { + $header = __( 'Error Details' ); + $details = "\n\n" . $header . "\n" . str_pad( '', strlen( $header ), '=' ) . "\n" . $details; + } + } else { + $cause = ''; + $details = ''; + } + + /** + * Filters the support message sent with the the fatal error protection email. + * + * @since 5.2.0 + * + * @param $message string The Message to include in the email. + */ + $support = apply_filters( 'recovery_email_support_info', __( 'Please contact your host for assistance with investigating this issue further.' ) ); + + /** + * Filters the debug information included in the fatal error protection email. + * + * @since 5.3.0 + * + * @param $message array An associated array of debug information. + */ + $debug = apply_filters( 'recovery_email_debug_info', $this->get_debug( $extension ) ); + + /* translators: Do not translate LINK, EXPIRES, CAUSE, DETAILS, SITEURL, PAGEURL, SUPPORT. DEBUG: those are placeholders. */ + $message = __( + 'Howdy! + +Since WordPress 5.2 there is a built-in feature that detects when a plugin or theme causes a fatal error on your site, and notifies you with this automated email. +###CAUSE### +First, visit your website (###SITEURL###) and check for any visible issues. Next, visit the page where the error was caught (###PAGEURL###) and check for any visible issues. + +###SUPPORT### + +If your site appears broken and you can\'t access your dashboard normally, WordPress now has a special "recovery mode". This lets you safely login to your dashboard and investigate further. + +###LINK### + +To keep your site safe, this link will expire in ###EXPIRES###. Don\'t worry about that, though: a new link will be emailed to you if the error occurs again after it expires. + +When seeking help with this issue, you may be asked for some of the following information: +###DEBUG### + +###DETAILS###' + ); + $message = str_replace( + array( + '###LINK###', + '###EXPIRES###', + '###CAUSE###', + '###DETAILS###', + '###SITEURL###', + '###PAGEURL###', + '###SUPPORT###', + '###DEBUG###', + ), + array( + $url, + human_time_diff( time() + $rate_limit ), + $cause ? "\n{$cause}\n" : "\n", + $details, + home_url( '/' ), + home_url( $_SERVER['REQUEST_URI'] ), + $support, + implode( "\r\n", $debug ), + ), + $message + ); + + $email = array( + 'to' => $this->get_recovery_mode_email_address(), + /* translators: %s: Site title. */ + 'subject' => __( '[%s] Your Site is Experiencing a Technical Issue' ), + 'message' => $message, + 'headers' => '', + ); + + /** + * Filter the contents of the Recovery Mode email. + * + * @since 5.2.0 + * + * @param array $email Used to build wp_mail(). + * @param string $url URL to enter recovery mode. + */ + $email = apply_filters( 'recovery_mode_email', $email, $url ); + + $sent = wp_mail( + $email['to'], + wp_specialchars_decode( sprintf( $email['subject'], $blogname ) ), + $email['message'], + $email['headers'] + ); + + if ( $switched_locale ) { + restore_previous_locale(); + } + + return $sent; + } + + /** + * Gets the email address to send the recovery mode link to. + * + * @since 5.2.0 + * + * @return string Email address to send recovery mode link to. + */ + private function get_recovery_mode_email_address() { + if ( defined( 'RECOVERY_MODE_EMAIL' ) && is_email( RECOVERY_MODE_EMAIL ) ) { + return RECOVERY_MODE_EMAIL; + } + + return get_option( 'admin_email' ); + } + + /** + * Gets the description indicating the possible cause for the error. + * + * @since 5.2.0 + * + * @param array $extension The extension that caused the error. + * @return string Message about which extension caused the error. + */ + private function get_cause( $extension ) { + + if ( 'plugin' === $extension['type'] ) { + $plugin = $this->get_plugin( $extension ); + + if ( false === $plugin ) { + $name = $extension['slug']; + } else { + $name = $plugin['Name']; + } + + /* translators: %s: Plugin name. */ + $cause = sprintf( __( 'In this case, WordPress caught an error with one of your plugins, %s.' ), $name ); + } else { + $theme = wp_get_theme( $extension['slug'] ); + $name = $theme->exists() ? $theme->display( 'Name' ) : $extension['slug']; + + /* translators: %s: Theme name. */ + $cause = sprintf( __( 'In this case, WordPress caught an error with your theme, %s.' ), $name ); + } + + return $cause; + } + + /** + * Return the details for a single plugin based on the extension data from an error. + * + * @since 5.3.0 + * + * @param array $extension The extension that caused the error. + * @return bool|array A plugin array {@see get_plugins()} or `false` if no plugin was found. + */ + private function get_plugin( $extension ) { + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + $plugins = get_plugins(); + + // Assume plugin main file name first since it is a common convention. + if ( isset( $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ] ) ) { + return $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ]; + } else { + foreach ( $plugins as $file => $plugin_data ) { + if ( 0 === strpos( $file, "{$extension['slug']}/" ) || $file === $extension['slug'] ) { + return $plugin_data; + } + } + } + + return false; + } + + /** + * Return debug information in an easy to manipulate format. + * + * @since 5.3.0 + * + * @param array $extension The extension that caused the error. + * @return array An associative array of debug information. + */ + private function get_debug( $extension ) { + $theme = wp_get_theme(); + $wp_version = get_bloginfo( 'version' ); + + if ( $extension ) { + $plugin = $this->get_plugin( $extension ); + } else { + $plugin = null; + } + + $debug = array( + /* translators: %s: Current WordPress version number. */ + 'wp' => sprintf( + __( 'WordPress version %s' ), + $wp_version + ), + 'theme' => sprintf( + /* translators: 1: Current active theme name. 2: Current active theme version. */ + __( 'Current theme: %1$s (version %2$s)' ), + $theme->get( 'Name' ), + $theme->get( 'Version' ) + ), + ); + + if ( null !== $plugin ) { + $debug['plugin'] = sprintf( + /* translators: 1: The failing plugins name. 2: The failing plugins version. */ + __( 'Current plugin: %1$s (version %2$s)' ), + $plugin['Name'], + $plugin['Version'] + ); + } + + $debug['php'] = sprintf( + /* translators: %s: The currently used PHP version. */ + __( 'PHP version %s' ), + PHP_VERSION + ); + + return $debug; + } +} diff --git a/wp-includes/class-wp-recovery-mode-key-service.php b/wp-includes/class-wp-recovery-mode-key-service.php new file mode 100644 index 0000000..b33c4a1 --- /dev/null +++ b/wp-includes/class-wp-recovery-mode-key-service.php @@ -0,0 +1,183 @@ +<?php +/** + * Error Protection API: WP_Recovery_Mode_Key_Service class + * + * @package WordPress + * @since 5.2.0 + */ + +/** + * Core class used to generate and validate keys used to enter Recovery Mode. + * + * @since 5.2.0 + */ +final class WP_Recovery_Mode_Key_Service { + + /** + * The option name used to store the keys. + * + * @since 5.2.0 + * @var string + */ + private $option_name = 'recovery_keys'; + + /** + * Creates a recovery mode token. + * + * @since 5.2.0 + * + * @return string $token A random string to identify its associated key in storage. + */ + public function generate_recovery_mode_token() { + return wp_generate_password( 22, false ); + } + + /** + * Creates a recovery mode key. + * + * @since 5.2.0 + * + * @global PasswordHash $wp_hasher + * + * @param string $token A token generated by {@see generate_recovery_mode_token()}. + * @return string $key Recovery mode key. + */ + public function generate_and_store_recovery_mode_key( $token ) { + + global $wp_hasher; + + $key = wp_generate_password( 22, false ); + + if ( empty( $wp_hasher ) ) { + require_once ABSPATH . WPINC . '/class-phpass.php'; + $wp_hasher = new PasswordHash( 8, true ); + } + + $hashed = $wp_hasher->HashPassword( $key ); + + $records = $this->get_keys(); + + $records[ $token ] = array( + 'hashed_key' => $hashed, + 'created_at' => time(), + ); + + $this->update_keys( $records ); + + /** + * Fires when a recovery mode key is generated. + * + * @since 5.2.0 + * + * @param string $token The recovery data token. + * @param string $key The recovery mode key. + */ + do_action( 'generate_recovery_mode_key', $token, $key ); + + return $key; + } + + /** + * Verifies if the recovery mode key is correct. + * + * Recovery mode keys can only be used once; the key will be consumed in the process. + * + * @since 5.2.0 + * + * @param string $token The token used when generating the given key. + * @param string $key The unhashed key. + * @param int $ttl Time in seconds for the key to be valid for. + * @return true|WP_Error True on success, error object on failure. + */ + public function validate_recovery_mode_key( $token, $key, $ttl ) { + + $records = $this->get_keys(); + + if ( ! isset( $records[ $token ] ) ) { + return new WP_Error( 'token_not_found', __( 'Recovery Mode not initialized.' ) ); + } + + $record = $records[ $token ]; + + $this->remove_key( $token ); + + if ( ! is_array( $record ) || ! isset( $record['hashed_key'], $record['created_at'] ) ) { + return new WP_Error( 'invalid_recovery_key_format', __( 'Invalid recovery key format.' ) ); + } + + if ( ! wp_check_password( $key, $record['hashed_key'] ) ) { + return new WP_Error( 'hash_mismatch', __( 'Invalid recovery key.' ) ); + } + + if ( time() > $record['created_at'] + $ttl ) { + return new WP_Error( 'key_expired', __( 'Recovery key expired.' ) ); + } + + return true; + } + + /** + * Removes expired recovery mode keys. + * + * @since 5.2.0 + * + * @param int $ttl Time in seconds for the keys to be valid for. + */ + public function clean_expired_keys( $ttl ) { + + $records = $this->get_keys(); + + foreach ( $records as $key => $record ) { + if ( ! isset( $record['created_at'] ) || time() > $record['created_at'] + $ttl ) { + unset( $records[ $key ] ); + } + } + + $this->update_keys( $records ); + } + + /** + * Removes a used recovery key. + * + * @since 5.2.0 + * + * @param string $token The token used when generating a recovery mode key. + */ + private function remove_key( $token ) { + + $records = $this->get_keys(); + + if ( ! isset( $records[ $token ] ) ) { + return; + } + + unset( $records[ $token ] ); + + $this->update_keys( $records ); + } + + /** + * Gets the recovery key records. + * + * @since 5.2.0 + * + * @return array Associative array of $token => $data pairs, where $data has keys 'hashed_key' + * and 'created_at'. + */ + private function get_keys() { + return (array) get_option( $this->option_name, array() ); + } + + /** + * Updates the recovery key records. + * + * @since 5.2.0 + * + * @param array $keys Associative array of $token => $data pairs, where $data has keys 'hashed_key' + * and 'created_at'. + * @return bool True on success, false on failure. + */ + private function update_keys( array $keys ) { + return update_option( $this->option_name, $keys ); + } +} diff --git a/wp-includes/class-wp-recovery-mode-link-service.php b/wp-includes/class-wp-recovery-mode-link-service.php new file mode 100644 index 0000000..1344cb7 --- /dev/null +++ b/wp-includes/class-wp-recovery-mode-link-service.php @@ -0,0 +1,127 @@ +<?php +/** + * Error Protection API: WP_Recovery_Mode_Link_Handler class + * + * @package WordPress + * @since 5.2.0 + */ + +/** + * Core class used to generate and handle recovery mode links. + * + * @since 5.2.0 + */ +class WP_Recovery_Mode_Link_Service { + const LOGIN_ACTION_ENTER = 'enter_recovery_mode'; + const LOGIN_ACTION_ENTERED = 'entered_recovery_mode'; + + /** + * Service to generate and validate recovery mode keys. + * + * @since 5.2.0 + * @var WP_Recovery_Mode_Key_Service + */ + private $key_service; + + /** + * Service to handle cookies. + * + * @since 5.2.0 + * @var WP_Recovery_Mode_Cookie_Service + */ + private $cookie_service; + + /** + * WP_Recovery_Mode_Link_Service constructor. + * + * @since 5.2.0 + * + * @param WP_Recovery_Mode_Cookie_Service $cookie_service Service to handle setting the recovery mode cookie. + * @param WP_Recovery_Mode_Key_Service $key_service Service to handle generating recovery mode keys. + */ + public function __construct( WP_Recovery_Mode_Cookie_Service $cookie_service, WP_Recovery_Mode_Key_Service $key_service ) { + $this->cookie_service = $cookie_service; + $this->key_service = $key_service; + } + + /** + * Generates a URL to begin recovery mode. + * + * Only one recovery mode URL can may be valid at the same time. + * + * @since 5.2.0 + * + * @return string Generated URL. + */ + public function generate_url() { + $token = $this->key_service->generate_recovery_mode_token(); + $key = $this->key_service->generate_and_store_recovery_mode_key( $token ); + + return $this->get_recovery_mode_begin_url( $token, $key ); + } + + /** + * Enters recovery mode when the user hits wp-login.php with a valid recovery mode link. + * + * @since 5.2.0 + * + * @param int $ttl Number of seconds the link should be valid for. + */ + public function handle_begin_link( $ttl ) { + if ( ! isset( $GLOBALS['pagenow'] ) || 'wp-login.php' !== $GLOBALS['pagenow'] ) { + return; + } + + if ( ! isset( $_GET['action'], $_GET['rm_token'], $_GET['rm_key'] ) || self::LOGIN_ACTION_ENTER !== $_GET['action'] ) { + return; + } + + if ( ! function_exists( 'wp_generate_password' ) ) { + require_once ABSPATH . WPINC . '/pluggable.php'; + } + + $validated = $this->key_service->validate_recovery_mode_key( $_GET['rm_token'], $_GET['rm_key'], $ttl ); + + if ( is_wp_error( $validated ) ) { + wp_die( $validated, '' ); + } + + $this->cookie_service->set_cookie(); + + $url = add_query_arg( 'action', self::LOGIN_ACTION_ENTERED, wp_login_url() ); + wp_redirect( $url ); + die; + } + + /** + * Gets a URL to begin recovery mode. + * + * @since 5.2.0 + * + * @param string $token Recovery Mode token created by {@see generate_recovery_mode_token()}. + * @param string $key Recovery Mode key created by {@see generate_and_store_recovery_mode_key()}. + * @return string Recovery mode begin URL. + */ + private function get_recovery_mode_begin_url( $token, $key ) { + + $url = add_query_arg( + array( + 'action' => self::LOGIN_ACTION_ENTER, + 'rm_token' => $token, + 'rm_key' => $key, + ), + wp_login_url() + ); + + /** + * Filter the URL to begin recovery mode. + * + * @since 5.2.0 + * + * @param string $url The generated recovery mode begin URL. + * @param string $token The token used to identify the key. + * @param string $key The recovery mode key. + */ + return apply_filters( 'recovery_mode_begin_url', $url, $token, $key ); + } +} diff --git a/wp-includes/class-wp-recovery-mode.php b/wp-includes/class-wp-recovery-mode.php new file mode 100644 index 0000000..1ca9607 --- /dev/null +++ b/wp-includes/class-wp-recovery-mode.php @@ -0,0 +1,469 @@ +<?php +/** + * Error Protection API: WP_Recovery_Mode class + * + * @package WordPress + * @since 5.2.0 + */ + +/** + * Core class used to implement Recovery Mode. + * + * @since 5.2.0 + */ +class WP_Recovery_Mode { + + const EXIT_ACTION = 'exit_recovery_mode'; + + /** + * Service to handle cookies. + * + * @since 5.2.0 + * @var WP_Recovery_Mode_Cookie_Service + */ + private $cookie_service; + + /** + * Service to generate a recovery mode key. + * + * @since 5.2.0 + * @var WP_Recovery_Mode_Key_Service + */ + private $key_service; + + /** + * Service to generate and validate recovery mode links. + * + * @since 5.2.0 + * @var WP_Recovery_Mode_Link_Service + */ + private $link_service; + + /** + * Service to handle sending an email with a recovery mode link. + * + * @since 5.2.0 + * @var WP_Recovery_Mode_Email_Service + */ + private $email_service; + + /** + * Is recovery mode initialized. + * + * @since 5.2.0 + * @var bool + */ + private $is_initialized = false; + + /** + * Is recovery mode active in this session. + * + * @since 5.2.0 + * @var bool + */ + private $is_active = false; + + /** + * Get an ID representing the current recovery mode session. + * + * @since 5.2.0 + * @var string + */ + private $session_id = ''; + + /** + * WP_Recovery_Mode constructor. + * + * @since 5.2.0 + */ + public function __construct() { + $this->cookie_service = new WP_Recovery_Mode_Cookie_Service(); + $this->key_service = new WP_Recovery_Mode_Key_Service(); + $this->link_service = new WP_Recovery_Mode_Link_Service( $this->cookie_service, $this->key_service ); + $this->email_service = new WP_Recovery_Mode_Email_Service( $this->link_service ); + } + + /** + * Initialize recovery mode for the current request. + * + * @since 5.2.0 + */ + public function initialize() { + $this->is_initialized = true; + + add_action( 'wp_logout', array( $this, 'exit_recovery_mode' ) ); + add_action( 'login_form_' . self::EXIT_ACTION, array( $this, 'handle_exit_recovery_mode' ) ); + add_action( 'recovery_mode_clean_expired_keys', array( $this, 'clean_expired_keys' ) ); + + if ( ! wp_next_scheduled( 'recovery_mode_clean_expired_keys' ) && ! wp_installing() ) { + wp_schedule_event( time(), 'daily', 'recovery_mode_clean_expired_keys' ); + } + + if ( defined( 'WP_RECOVERY_MODE_SESSION_ID' ) ) { + $this->is_active = true; + $this->session_id = WP_RECOVERY_MODE_SESSION_ID; + + return; + } + + if ( $this->cookie_service->is_cookie_set() ) { + $this->handle_cookie(); + + return; + } + + $this->link_service->handle_begin_link( $this->get_link_ttl() ); + } + + /** + * Checks whether recovery mode is active. + * + * This will not change after recovery mode has been initialized. {@see WP_Recovery_Mode::run()}. + * + * @since 5.2.0 + * + * @return bool True if recovery mode is active, false otherwise. + */ + public function is_active() { + return $this->is_active; + } + + /** + * Gets the recovery mode session ID. + * + * @since 5.2.0 + * + * @return string The session ID if recovery mode is active, empty string otherwise. + */ + public function get_session_id() { + return $this->session_id; + } + + /** + * Checks whether recovery mode has been initialized. + * + * Recovery mode should not be used until this point. Initialization happens immediately before loading plugins. + * + * @since 5.2.0 + * + * @return bool + */ + public function is_initialized() { + return $this->is_initialized; + } + + /** + * Handles a fatal error occurring. + * + * The calling API should immediately die() after calling this function. + * + * @since 5.2.0 + * + * @param array $error Error details from {@see error_get_last()} + * @return true|WP_Error True if the error was handled and headers have already been sent. + * Or the request will exit to try and catch multiple errors at once. + * WP_Error if an error occurred preventing it from being handled. + */ + public function handle_error( array $error ) { + + $extension = $this->get_extension_for_error( $error ); + + if ( ! $extension || $this->is_network_plugin( $extension ) ) { + return new WP_Error( 'invalid_source', __( 'Error not caused by a plugin or theme.' ) ); + } + + if ( ! $this->is_active() ) { + if ( ! is_protected_endpoint() ) { + return new WP_Error( 'non_protected_endpoint', __( 'Error occurred on a non-protected endpoint.' ) ); + } + + if ( ! function_exists( 'wp_generate_password' ) ) { + require_once ABSPATH . WPINC . '/pluggable.php'; + } + + return $this->email_service->maybe_send_recovery_mode_email( $this->get_email_rate_limit(), $error, $extension ); + } + + if ( ! $this->store_error( $error ) ) { + return new WP_Error( 'storage_error', __( 'Failed to store the error.' ) ); + } + + if ( headers_sent() ) { + return true; + } + + $this->redirect_protected(); + } + + /** + * Ends the current recovery mode session. + * + * @since 5.2.0 + * + * @return bool True on success, false on failure. + */ + public function exit_recovery_mode() { + if ( ! $this->is_active() ) { + return false; + } + + $this->email_service->clear_rate_limit(); + $this->cookie_service->clear_cookie(); + + wp_paused_plugins()->delete_all(); + wp_paused_themes()->delete_all(); + + return true; + } + + /** + * Handles a request to exit Recovery Mode. + * + * @since 5.2.0 + */ + public function handle_exit_recovery_mode() { + $redirect_to = wp_get_referer(); + + // Safety check in case referrer returns false. + if ( ! $redirect_to ) { + $redirect_to = is_user_logged_in() ? admin_url() : home_url(); + } + + if ( ! $this->is_active() ) { + wp_safe_redirect( $redirect_to ); + die; + } + + if ( ! isset( $_GET['action'] ) || self::EXIT_ACTION !== $_GET['action'] ) { + return; + } + + if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], self::EXIT_ACTION ) ) { + wp_die( __( 'Exit recovery mode link expired.' ), 403 ); + } + + if ( ! $this->exit_recovery_mode() ) { + wp_die( __( 'Failed to exit recovery mode. Please try again later.' ) ); + } + + wp_safe_redirect( $redirect_to ); + die; + } + + /** + * Cleans any recovery mode keys that have expired according to the link TTL. + * + * Executes on a daily cron schedule. + * + * @since 5.2.0 + */ + public function clean_expired_keys() { + $this->key_service->clean_expired_keys( $this->get_link_ttl() ); + } + + /** + * Handles checking for the recovery mode cookie and validating it. + * + * @since 5.2.0 + */ + protected function handle_cookie() { + $validated = $this->cookie_service->validate_cookie(); + + if ( is_wp_error( $validated ) ) { + $this->cookie_service->clear_cookie(); + + $validated->add_data( array( 'status' => 403 ) ); + wp_die( $validated ); + } + + $session_id = $this->cookie_service->get_session_id_from_cookie(); + if ( is_wp_error( $session_id ) ) { + $this->cookie_service->clear_cookie(); + + $session_id->add_data( array( 'status' => 403 ) ); + wp_die( $session_id ); + } + + $this->is_active = true; + $this->session_id = $session_id; + } + + /** + * Gets the rate limit between sending new recovery mode email links. + * + * @since 5.2.0 + * + * @return int Rate limit in seconds. + */ + protected function get_email_rate_limit() { + /** + * Filter the rate limit between sending new recovery mode email links. + * + * @since 5.2.0 + * + * @param int $rate_limit Time to wait in seconds. Defaults to 1 day. + */ + return apply_filters( 'recovery_mode_email_rate_limit', DAY_IN_SECONDS ); + } + + /** + * Gets the number of seconds the recovery mode link is valid for. + * + * @since 5.2.0 + * + * @return int Interval in seconds. + */ + protected function get_link_ttl() { + + $rate_limit = $this->get_email_rate_limit(); + $valid_for = $rate_limit; + + /** + * Filter the amount of time the recovery mode email link is valid for. + * + * The ttl must be at least as long as the email rate limit. + * + * @since 5.2.0 + * + * @param int $valid_for The number of seconds the link is valid for. + */ + $valid_for = apply_filters( 'recovery_mode_email_link_ttl', $valid_for ); + + return max( $valid_for, $rate_limit ); + } + + /** + * Gets the extension that the error occurred in. + * + * @since 5.2.0 + * + * @global array $wp_theme_directories + * + * @param array $error Error that was triggered. + * + * @return array|false { + * @type string $slug The extension slug. This is the plugin or theme's directory. + * @type string $type The extension type. Either 'plugin' or 'theme'. + * } + */ + protected function get_extension_for_error( $error ) { + global $wp_theme_directories; + + if ( ! isset( $error['file'] ) ) { + return false; + } + + if ( ! defined( 'WP_PLUGIN_DIR' ) ) { + return false; + } + + $error_file = wp_normalize_path( $error['file'] ); + $wp_plugin_dir = wp_normalize_path( WP_PLUGIN_DIR ); + + if ( 0 === strpos( $error_file, $wp_plugin_dir ) ) { + $path = str_replace( $wp_plugin_dir . '/', '', $error_file ); + $parts = explode( '/', $path ); + + return array( + 'type' => 'plugin', + 'slug' => $parts[0], + ); + } + + if ( empty( $wp_theme_directories ) ) { + return false; + } + + foreach ( $wp_theme_directories as $theme_directory ) { + $theme_directory = wp_normalize_path( $theme_directory ); + + if ( 0 === strpos( $error_file, $theme_directory ) ) { + $path = str_replace( $theme_directory . '/', '', $error_file ); + $parts = explode( '/', $path ); + + return array( + 'type' => 'theme', + 'slug' => $parts[0], + ); + } + } + + return false; + } + + /** + * Checks whether the given extension a network activated plugin. + * + * @since 5.2.0 + * + * @param array $extension Extension data. + * @return bool True if network plugin, false otherwise. + */ + protected function is_network_plugin( $extension ) { + if ( 'plugin' !== $extension['type'] ) { + return false; + } + + if ( ! is_multisite() ) { + return false; + } + + $network_plugins = wp_get_active_network_plugins(); + + foreach ( $network_plugins as $plugin ) { + if ( 0 === strpos( $plugin, $extension['slug'] . '/' ) ) { + return true; + } + } + + return false; + } + + /** + * Stores the given error so that the extension causing it is paused. + * + * @since 5.2.0 + * + * @param array $error Error that was triggered. + * @return bool True if the error was stored successfully, false otherwise. + */ + protected function store_error( $error ) { + $extension = $this->get_extension_for_error( $error ); + + if ( ! $extension ) { + return false; + } + + switch ( $extension['type'] ) { + case 'plugin': + return wp_paused_plugins()->set( $extension['slug'], $error ); + case 'theme': + return wp_paused_themes()->set( $extension['slug'], $error ); + default: + return false; + } + } + + /** + * Redirects the current request to allow recovering multiple errors in one go. + * + * The redirection will only happen when on a protected endpoint. + * + * It must be ensured that this method is only called when an error actually occurred and will not occur on the + * next request again. Otherwise it will create a redirect loop. + * + * @since 5.2.0 + */ + protected function redirect_protected() { + // Pluggable is usually loaded after plugins, so we manually include it here for redirection functionality. + if ( ! function_exists( 'wp_safe_redirect' ) ) { + require_once ABSPATH . WPINC . '/pluggable.php'; + } + + $scheme = is_ssl() ? 'https://' : 'http://'; + + $url = "{$scheme}{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"; + wp_safe_redirect( $url ); + exit; + } +} diff --git a/wp-includes/class-wp-rewrite.php b/wp-includes/class-wp-rewrite.php new file mode 100644 index 0000000..9ac02d7 --- /dev/null +++ b/wp-includes/class-wp-rewrite.php @@ -0,0 +1,1944 @@ +<?php +/** + * Rewrite API: WP_Rewrite class + * + * @package WordPress + * @subpackage Rewrite + * @since 1.5.0 + */ + +/** + * Core class used to implement a rewrite component API. + * + * The WordPress Rewrite class writes the rewrite module rules to the .htaccess + * file. It also handles parsing the request to get the correct setup for the + * WordPress Query class. + * + * The Rewrite along with WP class function as a front controller for WordPress. + * You can add rules to trigger your page view and processing using this + * component. The full functionality of a front controller does not exist, + * meaning you can't define how the template files load based on the rewrite + * rules. + * + * @since 1.5.0 + */ +class WP_Rewrite { + /** + * Permalink structure for posts. + * + * @since 1.5.0 + * @var string + */ + public $permalink_structure; + + /** + * Whether to add trailing slashes. + * + * @since 2.2.0 + * @var bool + */ + public $use_trailing_slashes; + + /** + * Base for the author permalink structure (example.com/$author_base/authorname). + * + * @since 1.5.0 + * @var string + */ + var $author_base = 'author'; + + /** + * Permalink structure for author archives. + * + * @since 1.5.0 + * @var string + */ + var $author_structure; + + /** + * Permalink structure for date archives. + * + * @since 1.5.0 + * @var string + */ + var $date_structure; + + /** + * Permalink structure for pages. + * + * @since 1.5.0 + * @var string + */ + var $page_structure; + + /** + * Base of the search permalink structure (example.com/$search_base/query). + * + * @since 1.5.0 + * @var string + */ + var $search_base = 'search'; + + /** + * Permalink structure for searches. + * + * @since 1.5.0 + * @var string + */ + var $search_structure; + + /** + * Comments permalink base. + * + * @since 1.5.0 + * @var string + */ + var $comments_base = 'comments'; + + /** + * Pagination permalink base. + * + * @since 3.1.0 + * @var string + */ + public $pagination_base = 'page'; + + /** + * Comments pagination permalink base. + * + * @since 4.2.0 + * @var string + */ + var $comments_pagination_base = 'comment-page'; + + /** + * Feed permalink base. + * + * @since 1.5.0 + * @var string + */ + var $feed_base = 'feed'; + + /** + * Comments feed permalink structure. + * + * @since 1.5.0 + * @var string + */ + var $comment_feed_structure; + + /** + * Feed request permalink structure. + * + * @since 1.5.0 + * @var string + */ + var $feed_structure; + + /** + * The static portion of the post permalink structure. + * + * If the permalink structure is "/archive/%post_id%" then the front + * is "/archive/". If the permalink structure is "/%year%/%postname%/" + * then the front is "/". + * + * @since 1.5.0 + * @var string + * + * @see WP_Rewrite::init() + */ + public $front; + + /** + * The prefix for all permalink structures. + * + * If PATHINFO/index permalinks are in use then the root is the value of + * `WP_Rewrite::$index` with a trailing slash appended. Otherwise the root + * will be empty. + * + * @since 1.5.0 + * @var string + * + * @see WP_Rewrite::init() + * @see WP_Rewrite::using_index_permalinks() + */ + public $root = ''; + + /** + * The name of the index file which is the entry point to all requests. + * + * @since 1.5.0 + * @var string + */ + public $index = 'index.php'; + + /** + * Variable name to use for regex matches in the rewritten query. + * + * @since 1.5.0 + * @var string + */ + var $matches = ''; + + /** + * Rewrite rules to match against the request to find the redirect or query. + * + * @since 1.5.0 + * @var array + */ + var $rules; + + /** + * Additional rules added external to the rewrite class. + * + * Those not generated by the class, see add_rewrite_rule(). + * + * @since 2.1.0 + * @var array + */ + var $extra_rules = array(); + + /** + * Additional rules that belong at the beginning to match first. + * + * Those not generated by the class, see add_rewrite_rule(). + * + * @since 2.3.0 + * @var array + */ + var $extra_rules_top = array(); + + /** + * Rules that don't redirect to WordPress' index.php. + * + * These rules are written to the mod_rewrite portion of the .htaccess, + * and are added by add_external_rule(). + * + * @since 2.1.0 + * @var array + */ + var $non_wp_rules = array(); + + /** + * Extra permalink structures, e.g. categories, added by add_permastruct(). + * + * @since 2.1.0 + * @var array + */ + var $extra_permastructs = array(); + + /** + * Endpoints (like /trackback/) added by add_rewrite_endpoint(). + * + * @since 2.1.0 + * @var array + */ + var $endpoints; + + /** + * Whether to write every mod_rewrite rule for WordPress into the .htaccess file. + * + * This is off by default, turning it on might print a lot of rewrite rules + * to the .htaccess file. + * + * @since 2.0.0 + * @var bool + * + * @see WP_Rewrite::mod_rewrite_rules() + */ + public $use_verbose_rules = false; + + /** + * Could post permalinks be confused with those of pages? + * + * If the first rewrite tag in the post permalink structure is one that could + * also match a page name (e.g. %postname% or %author%) then this flag is + * set to true. Prior to WordPress 3.3 this flag indicated that every page + * would have a set of rules added to the top of the rewrite rules array. + * Now it tells WP::parse_request() to check if a URL matching the page + * permastruct is actually a page before accepting it. + * + * @since 2.5.0 + * @var bool + * + * @see WP_Rewrite::init() + */ + public $use_verbose_page_rules = true; + + /** + * Rewrite tags that can be used in permalink structures. + * + * These are translated into the regular expressions stored in + * `WP_Rewrite::$rewritereplace` and are rewritten to the query + * variables listed in WP_Rewrite::$queryreplace. + * + * Additional tags can be added with add_rewrite_tag(). + * + * @since 1.5.0 + * @var array + */ + var $rewritecode = array( + '%year%', + '%monthnum%', + '%day%', + '%hour%', + '%minute%', + '%second%', + '%postname%', + '%post_id%', + '%author%', + '%pagename%', + '%search%', + ); + + /** + * Regular expressions to be substituted into rewrite rules in place + * of rewrite tags, see WP_Rewrite::$rewritecode. + * + * @since 1.5.0 + * @var array + */ + var $rewritereplace = array( + '([0-9]{4})', + '([0-9]{1,2})', + '([0-9]{1,2})', + '([0-9]{1,2})', + '([0-9]{1,2})', + '([0-9]{1,2})', + '([^/]+)', + '([0-9]+)', + '([^/]+)', + '([^/]+?)', + '(.+)', + ); + + /** + * Query variables that rewrite tags map to, see WP_Rewrite::$rewritecode. + * + * @since 1.5.0 + * @var array + */ + var $queryreplace = array( + 'year=', + 'monthnum=', + 'day=', + 'hour=', + 'minute=', + 'second=', + 'name=', + 'p=', + 'author_name=', + 'pagename=', + 's=', + ); + + /** + * Supported default feeds. + * + * @since 1.5.0 + * @var array + */ + public $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom' ); + + /** + * Determines whether permalinks are being used. + * + * This can be either rewrite module or permalink in the HTTP query string. + * + * @since 1.5.0 + * + * @return bool True, if permalinks are enabled. + */ + public function using_permalinks() { + return ! empty( $this->permalink_structure ); + } + + /** + * Determines whether permalinks are being used and rewrite module is not enabled. + * + * Means that permalink links are enabled and index.php is in the URL. + * + * @since 1.5.0 + * + * @return bool Whether permalink links are enabled and index.php is in the URL. + */ + public function using_index_permalinks() { + if ( empty( $this->permalink_structure ) ) { + return false; + } + + // If the index is not in the permalink, we're using mod_rewrite. + return preg_match( '#^/*' . $this->index . '#', $this->permalink_structure ); + } + + /** + * Determines whether permalinks are being used and rewrite module is enabled. + * + * Using permalinks and index.php is not in the URL. + * + * @since 1.5.0 + * + * @return bool Whether permalink links are enabled and index.php is NOT in the URL. + */ + public function using_mod_rewrite_permalinks() { + return $this->using_permalinks() && ! $this->using_index_permalinks(); + } + + /** + * Indexes for matches for usage in preg_*() functions. + * + * The format of the string is, with empty matches property value, '$NUM'. + * The 'NUM' will be replaced with the value in the $number parameter. With + * the matches property not empty, the value of the returned string will + * contain that value of the matches property. The format then will be + * '$MATCHES[NUM]', with MATCHES as the value in the property and NUM the + * value of the $number parameter. + * + * @since 1.5.0 + * + * @param int $number Index number. + * @return string + */ + public function preg_index( $number ) { + $match_prefix = '$'; + $match_suffix = ''; + + if ( ! empty( $this->matches ) ) { + $match_prefix = '$' . $this->matches . '['; + $match_suffix = ']'; + } + + return "$match_prefix$number$match_suffix"; + } + + /** + * Retrieves all page and attachments for pages URIs. + * + * The attachments are for those that have pages as parents and will be + * retrieved. + * + * @since 2.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return array Array of page URIs as first element and attachment URIs as second element. + */ + public function page_uri_index() { + global $wpdb; + + // Get pages in order of hierarchy, i.e. children after parents. + $pages = $wpdb->get_results( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page' AND post_status != 'auto-draft'" ); + $posts = get_page_hierarchy( $pages ); + + // If we have no pages get out quick. + if ( ! $posts ) { + return array( array(), array() ); + } + + // Now reverse it, because we need parents after children for rewrite rules to work properly. + $posts = array_reverse( $posts, true ); + + $page_uris = array(); + $page_attachment_uris = array(); + + foreach ( $posts as $id => $post ) { + // URL => page name. + $uri = get_page_uri( $id ); + $attachments = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = %d", $id ) ); + if ( ! empty( $attachments ) ) { + foreach ( $attachments as $attachment ) { + $attach_uri = get_page_uri( $attachment->ID ); + $page_attachment_uris[ $attach_uri ] = $attachment->ID; + } + } + + $page_uris[ $uri ] = $id; + } + + return array( $page_uris, $page_attachment_uris ); + } + + /** + * Retrieves all of the rewrite rules for pages. + * + * @since 1.5.0 + * + * @return string[] Page rewrite rules. + */ + public function page_rewrite_rules() { + // The extra .? at the beginning prevents clashes with other regular expressions in the rules array. + $this->add_rewrite_tag( '%pagename%', '(.?.+?)', 'pagename=' ); + + return $this->generate_rewrite_rules( $this->get_page_permastruct(), EP_PAGES, true, true, false, false ); + } + + /** + * Retrieves date permalink structure, with year, month, and day. + * + * The permalink structure for the date, if not set already depends on the + * permalink structure. It can be one of three formats. The first is year, + * month, day; the second is day, month, year; and the last format is month, + * day, year. These are matched against the permalink structure for which + * one is used. If none matches, then the default will be used, which is + * year, month, day. + * + * Prevents post ID and date permalinks from overlapping. In the case of + * post_id, the date permalink will be prepended with front permalink with + * 'date/' before the actual permalink to form the complete date permalink + * structure. + * + * @since 1.5.0 + * + * @return string|false Date permalink structure on success, false on failure. + */ + public function get_date_permastruct() { + if ( isset( $this->date_structure ) ) { + return $this->date_structure; + } + + if ( empty( $this->permalink_structure ) ) { + $this->date_structure = ''; + return false; + } + + // The date permalink must have year, month, and day separated by slashes. + $endians = array( '%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%' ); + + $this->date_structure = ''; + $date_endian = ''; + + foreach ( $endians as $endian ) { + if ( false !== strpos( $this->permalink_structure, $endian ) ) { + $date_endian = $endian; + break; + } + } + + if ( empty( $date_endian ) ) { + $date_endian = '%year%/%monthnum%/%day%'; + } + + /* + * Do not allow the date tags and %post_id% to overlap in the permalink + * structure. If they do, move the date tags to $front/date/. + */ + $front = $this->front; + preg_match_all( '/%.+?%/', $this->permalink_structure, $tokens ); + $tok_index = 1; + foreach ( (array) $tokens[0] as $token ) { + if ( '%post_id%' == $token && ( $tok_index <= 3 ) ) { + $front = $front . 'date/'; + break; + } + $tok_index++; + } + + $this->date_structure = $front . $date_endian; + + return $this->date_structure; + } + + /** + * Retrieves the year permalink structure without month and day. + * + * Gets the date permalink structure and strips out the month and day + * permalink structures. + * + * @since 1.5.0 + * + * @return string|false Year permalink structure on success, false on failure. + */ + public function get_year_permastruct() { + $structure = $this->get_date_permastruct(); + + if ( empty( $structure ) ) { + return false; + } + + $structure = str_replace( '%monthnum%', '', $structure ); + $structure = str_replace( '%day%', '', $structure ); + $structure = preg_replace( '#/+#', '/', $structure ); + + return $structure; + } + + /** + * Retrieves the month permalink structure without day and with year. + * + * Gets the date permalink structure and strips out the day permalink + * structures. Keeps the year permalink structure. + * + * @since 1.5.0 + * + * @return string|false Year/Month permalink structure on success, false on failure. + */ + public function get_month_permastruct() { + $structure = $this->get_date_permastruct(); + + if ( empty( $structure ) ) { + return false; + } + + $structure = str_replace( '%day%', '', $structure ); + $structure = preg_replace( '#/+#', '/', $structure ); + + return $structure; + } + + /** + * Retrieves the day permalink structure with month and year. + * + * Keeps date permalink structure with all year, month, and day. + * + * @since 1.5.0 + * + * @return string|false Year/Month/Day permalink structure on success, false on failure. + */ + public function get_day_permastruct() { + return $this->get_date_permastruct(); + } + + /** + * Retrieves the permalink structure for categories. + * + * If the category_base property has no value, then the category structure + * will have the front property value, followed by 'category', and finally + * '%category%'. If it does, then the root property will be used, along with + * the category_base property value. + * + * @since 1.5.0 + * + * @return string|false Category permalink structure on success, false on failure. + */ + public function get_category_permastruct() { + return $this->get_extra_permastruct( 'category' ); + } + + /** + * Retrieve the permalink structure for tags. + * + * If the tag_base property has no value, then the tag structure will have + * the front property value, followed by 'tag', and finally '%tag%'. If it + * does, then the root property will be used, along with the tag_base + * property value. + * + * @since 2.3.0 + * + * @return string|false Tag permalink structure on success, false on failure. + */ + public function get_tag_permastruct() { + return $this->get_extra_permastruct( 'post_tag' ); + } + + /** + * Retrieves an extra permalink structure by name. + * + * @since 2.5.0 + * + * @param string $name Permalink structure name. + * @return string|false Permalink structure string on success, false on failure. + */ + public function get_extra_permastruct( $name ) { + if ( empty( $this->permalink_structure ) ) { + return false; + } + + if ( isset( $this->extra_permastructs[ $name ] ) ) { + return $this->extra_permastructs[ $name ]['struct']; + } + + return false; + } + + /** + * Retrieves the author permalink structure. + * + * The permalink structure is front property, author base, and finally + * '/%author%'. Will set the author_structure property and then return it + * without attempting to set the value again. + * + * @since 1.5.0 + * + * @return string|false Author permalink structure on success, false on failure. + */ + public function get_author_permastruct() { + if ( isset( $this->author_structure ) ) { + return $this->author_structure; + } + + if ( empty( $this->permalink_structure ) ) { + $this->author_structure = ''; + return false; + } + + $this->author_structure = $this->front . $this->author_base . '/%author%'; + + return $this->author_structure; + } + + /** + * Retrieves the search permalink structure. + * + * The permalink structure is root property, search base, and finally + * '/%search%'. Will set the search_structure property and then return it + * without attempting to set the value again. + * + * @since 1.5.0 + * + * @return string|false Search permalink structure on success, false on failure. + */ + public function get_search_permastruct() { + if ( isset( $this->search_structure ) ) { + return $this->search_structure; + } + + if ( empty( $this->permalink_structure ) ) { + $this->search_structure = ''; + return false; + } + + $this->search_structure = $this->root . $this->search_base . '/%search%'; + + return $this->search_structure; + } + + /** + * Retrieves the page permalink structure. + * + * The permalink structure is root property, and '%pagename%'. Will set the + * page_structure property and then return it without attempting to set the + * value again. + * + * @since 1.5.0 + * + * @return string|false Page permalink structure on success, false on failure. + */ + public function get_page_permastruct() { + if ( isset( $this->page_structure ) ) { + return $this->page_structure; + } + + if ( empty( $this->permalink_structure ) ) { + $this->page_structure = ''; + return false; + } + + $this->page_structure = $this->root . '%pagename%'; + + return $this->page_structure; + } + + /** + * Retrieves the feed permalink structure. + * + * The permalink structure is root property, feed base, and finally + * '/%feed%'. Will set the feed_structure property and then return it + * without attempting to set the value again. + * + * @since 1.5.0 + * + * @return string|false Feed permalink structure on success, false on failure. + */ + public function get_feed_permastruct() { + if ( isset( $this->feed_structure ) ) { + return $this->feed_structure; + } + + if ( empty( $this->permalink_structure ) ) { + $this->feed_structure = ''; + return false; + } + + $this->feed_structure = $this->root . $this->feed_base . '/%feed%'; + + return $this->feed_structure; + } + + /** + * Retrieves the comment feed permalink structure. + * + * The permalink structure is root property, comment base property, feed + * base and finally '/%feed%'. Will set the comment_feed_structure property + * and then return it without attempting to set the value again. + * + * @since 1.5.0 + * + * @return string|false Comment feed permalink structure on success, false on failure. + */ + public function get_comment_feed_permastruct() { + if ( isset( $this->comment_feed_structure ) ) { + return $this->comment_feed_structure; + } + + if ( empty( $this->permalink_structure ) ) { + $this->comment_feed_structure = ''; + return false; + } + + $this->comment_feed_structure = $this->root . $this->comments_base . '/' . $this->feed_base . '/%feed%'; + + return $this->comment_feed_structure; + } + + /** + * Adds or updates existing rewrite tags (e.g. %postname%). + * + * If the tag already exists, replace the existing pattern and query for + * that tag, otherwise add the new tag. + * + * @since 1.5.0 + * + * @see WP_Rewrite::$rewritecode + * @see WP_Rewrite::$rewritereplace + * @see WP_Rewrite::$queryreplace + * + * @param string $tag Name of the rewrite tag to add or update. + * @param string $regex Regular expression to substitute the tag for in rewrite rules. + * @param string $query String to append to the rewritten query. Must end in '='. + */ + public function add_rewrite_tag( $tag, $regex, $query ) { + $position = array_search( $tag, $this->rewritecode ); + if ( false !== $position && null !== $position ) { + $this->rewritereplace[ $position ] = $regex; + $this->queryreplace[ $position ] = $query; + } else { + $this->rewritecode[] = $tag; + $this->rewritereplace[] = $regex; + $this->queryreplace[] = $query; + } + } + + + /** + * Removes an existing rewrite tag. + * + * @since 4.5.0 + * + * @see WP_Rewrite::$rewritecode + * @see WP_Rewrite::$rewritereplace + * @see WP_Rewrite::$queryreplace + * + * @param string $tag Name of the rewrite tag to remove. + */ + public function remove_rewrite_tag( $tag ) { + $position = array_search( $tag, $this->rewritecode ); + if ( false !== $position && null !== $position ) { + unset( $this->rewritecode[ $position ] ); + unset( $this->rewritereplace[ $position ] ); + unset( $this->queryreplace[ $position ] ); + } + } + + /** + * Generates rewrite rules from a permalink structure. + * + * The main WP_Rewrite function for building the rewrite rule list. The + * contents of the function is a mix of black magic and regular expressions, + * so best just ignore the contents and move to the parameters. + * + * @since 1.5.0 + * + * @param string $permalink_structure The permalink structure. + * @param int $ep_mask Optional. Endpoint mask defining what endpoints are added to the structure. + * Accepts `EP_NONE`, `EP_PERMALINK`, `EP_ATTACHMENT`, `EP_DATE`, `EP_YEAR`, + * `EP_MONTH`, `EP_DAY`, `EP_ROOT`, `EP_COMMENTS`, `EP_SEARCH`, `EP_CATEGORIES`, + * `EP_TAGS`, `EP_AUTHORS`, `EP_PAGES`, `EP_ALL_ARCHIVES`, and `EP_ALL`. + * Default `EP_NONE`. + * @param bool $paged Optional. Whether archive pagination rules should be added for the structure. + * Default true. + * @param bool $feed Optional Whether feed rewrite rules should be added for the structure. + * Default true. + * @param bool $forcomments Optional. Whether the feed rules should be a query for a comments feed. + * Default false. + * @param bool $walk_dirs Optional. Whether the 'directories' making up the structure should be walked + * over and rewrite rules built for each in-turn. Default true. + * @param bool $endpoints Optional. Whether endpoints should be applied to the generated rewrite rules. + * Default true. + * @return string[] Array of rewrite rules keyed by their regex pattern. + */ + public function generate_rewrite_rules( $permalink_structure, $ep_mask = EP_NONE, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true ) { + // Build a regex to match the feed section of URLs, something like (feed|atom|rss|rss2)/? + $feedregex2 = ''; + foreach ( (array) $this->feeds as $feed_name ) { + $feedregex2 .= $feed_name . '|'; + } + $feedregex2 = '(' . trim( $feedregex2, '|' ) . ')/?$'; + + /* + * $feedregex is identical but with /feed/ added on as well, so URLs like <permalink>/feed/atom + * and <permalink>/atom are both possible + */ + $feedregex = $this->feed_base . '/' . $feedregex2; + + // Build a regex to match the trackback and page/xx parts of URLs. + $trackbackregex = 'trackback/?$'; + $pageregex = $this->pagination_base . '/?([0-9]{1,})/?$'; + $commentregex = $this->comments_pagination_base . '-([0-9]{1,})/?$'; + $embedregex = 'embed/?$'; + + // Build up an array of endpoint regexes to append => queries to append. + if ( $endpoints ) { + $ep_query_append = array(); + foreach ( (array) $this->endpoints as $endpoint ) { + // Match everything after the endpoint name, but allow for nothing to appear there. + $epmatch = $endpoint[1] . '(/(.*))?/?$'; + + // This will be appended on to the rest of the query for each dir. + $epquery = '&' . $endpoint[2] . '='; + $ep_query_append[ $epmatch ] = array( $endpoint[0], $epquery ); + } + } + + // Get everything up to the first rewrite tag. + $front = substr( $permalink_structure, 0, strpos( $permalink_structure, '%' ) ); + + // Build an array of the tags (note that said array ends up being in $tokens[0]). + preg_match_all( '/%.+?%/', $permalink_structure, $tokens ); + + $num_tokens = count( $tokens[0] ); + + $index = $this->index; // Probably 'index.php'. + $feedindex = $index; + $trackbackindex = $index; + $embedindex = $index; + + /* + * Build a list from the rewritecode and queryreplace arrays, that will look something + * like tagname=$matches[i] where i is the current $i. + */ + $queries = array(); + for ( $i = 0; $i < $num_tokens; ++$i ) { + if ( 0 < $i ) { + $queries[ $i ] = $queries[ $i - 1 ] . '&'; + } else { + $queries[ $i ] = ''; + } + + $query_token = str_replace( $this->rewritecode, $this->queryreplace, $tokens[0][ $i ] ) . $this->preg_index( $i + 1 ); + $queries[ $i ] .= $query_token; + } + + // Get the structure, minus any cruft (stuff that isn't tags) at the front. + $structure = $permalink_structure; + if ( '/' !== $front ) { + $structure = str_replace( $front, '', $structure ); + } + + /* + * Create a list of dirs to walk over, making rewrite rules for each level + * so for example, a $structure of /%year%/%monthnum%/%postname% would create + * rewrite rules for /%year%/, /%year%/%monthnum%/ and /%year%/%monthnum%/%postname% + */ + $structure = trim( $structure, '/' ); + $dirs = $walk_dirs ? explode( '/', $structure ) : array( $structure ); + $num_dirs = count( $dirs ); + + // Strip slashes from the front of $front. + $front = preg_replace( '|^/+|', '', $front ); + + // The main workhorse loop. + $post_rewrite = array(); + $struct = $front; + for ( $j = 0; $j < $num_dirs; ++$j ) { + // Get the struct for this dir, and trim slashes off the front. + $struct .= $dirs[ $j ] . '/'; // Accumulate. see comment near explode('/', $structure) above. + $struct = ltrim( $struct, '/' ); + + // Replace tags with regexes. + $match = str_replace( $this->rewritecode, $this->rewritereplace, $struct ); + + // Make a list of tags, and store how many there are in $num_toks. + $num_toks = preg_match_all( '/%.+?%/', $struct, $toks ); + + // Get the 'tagname=$matches[i]'. + $query = ( ! empty( $num_toks ) && isset( $queries[ $num_toks - 1 ] ) ) ? $queries[ $num_toks - 1 ] : ''; + + // Set up $ep_mask_specific which is used to match more specific URL types. + switch ( $dirs[ $j ] ) { + case '%year%': + $ep_mask_specific = EP_YEAR; + break; + case '%monthnum%': + $ep_mask_specific = EP_MONTH; + break; + case '%day%': + $ep_mask_specific = EP_DAY; + break; + default: + $ep_mask_specific = EP_NONE; + } + + // Create query for /page/xx. + $pagematch = $match . $pageregex; + $pagequery = $index . '?' . $query . '&paged=' . $this->preg_index( $num_toks + 1 ); + + // Create query for /comment-page-xx. + $commentmatch = $match . $commentregex; + $commentquery = $index . '?' . $query . '&cpage=' . $this->preg_index( $num_toks + 1 ); + + if ( get_option( 'page_on_front' ) ) { + // Create query for Root /comment-page-xx. + $rootcommentmatch = $match . $commentregex; + $rootcommentquery = $index . '?' . $query . '&page_id=' . get_option( 'page_on_front' ) . '&cpage=' . $this->preg_index( $num_toks + 1 ); + } + + // Create query for /feed/(feed|atom|rss|rss2|rdf). + $feedmatch = $match . $feedregex; + $feedquery = $feedindex . '?' . $query . '&feed=' . $this->preg_index( $num_toks + 1 ); + + // Create query for /(feed|atom|rss|rss2|rdf) (see comment near creation of $feedregex). + $feedmatch2 = $match . $feedregex2; + $feedquery2 = $feedindex . '?' . $query . '&feed=' . $this->preg_index( $num_toks + 1 ); + + // Create query and regex for embeds. + $embedmatch = $match . $embedregex; + $embedquery = $embedindex . '?' . $query . '&embed=true'; + + // If asked to, turn the feed queries into comment feed ones. + if ( $forcomments ) { + $feedquery .= '&withcomments=1'; + $feedquery2 .= '&withcomments=1'; + } + + // Start creating the array of rewrites for this dir. + $rewrite = array(); + + // ...adding on /feed/ regexes => queries. + if ( $feed ) { + $rewrite = array( + $feedmatch => $feedquery, + $feedmatch2 => $feedquery2, + $embedmatch => $embedquery, + ); + } + + // ...and /page/xx ones. + if ( $paged ) { + $rewrite = array_merge( $rewrite, array( $pagematch => $pagequery ) ); + } + + // Only on pages with comments add ../comment-page-xx/. + if ( EP_PAGES & $ep_mask || EP_PERMALINK & $ep_mask ) { + $rewrite = array_merge( $rewrite, array( $commentmatch => $commentquery ) ); + } elseif ( EP_ROOT & $ep_mask && get_option( 'page_on_front' ) ) { + $rewrite = array_merge( $rewrite, array( $rootcommentmatch => $rootcommentquery ) ); + } + + // Do endpoints. + if ( $endpoints ) { + foreach ( (array) $ep_query_append as $regex => $ep ) { + // Add the endpoints on if the mask fits. + if ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific ) { + $rewrite[ $match . $regex ] = $index . '?' . $query . $ep[1] . $this->preg_index( $num_toks + 2 ); + } + } + } + + // If we've got some tags in this dir. + if ( $num_toks ) { + $post = false; + $page = false; + + /* + * Check to see if this dir is permalink-level: i.e. the structure specifies an + * individual post. Do this by checking it contains at least one of 1) post name, + * 2) post ID, 3) page name, 4) timestamp (year, month, day, hour, second and + * minute all present). Set these flags now as we need them for the endpoints. + */ + if ( strpos( $struct, '%postname%' ) !== false + || strpos( $struct, '%post_id%' ) !== false + || strpos( $struct, '%pagename%' ) !== false + || ( strpos( $struct, '%year%' ) !== false && strpos( $struct, '%monthnum%' ) !== false && strpos( $struct, '%day%' ) !== false && strpos( $struct, '%hour%' ) !== false && strpos( $struct, '%minute%' ) !== false && strpos( $struct, '%second%' ) !== false ) + ) { + $post = true; + if ( strpos( $struct, '%pagename%' ) !== false ) { + $page = true; + } + } + + if ( ! $post ) { + // For custom post types, we need to add on endpoints as well. + foreach ( get_post_types( array( '_builtin' => false ) ) as $ptype ) { + if ( strpos( $struct, "%$ptype%" ) !== false ) { + $post = true; + + // This is for page style attachment URLs. + $page = is_post_type_hierarchical( $ptype ); + break; + } + } + } + + // If creating rules for a permalink, do all the endpoints like attachments etc. + if ( $post ) { + // Create query and regex for trackback. + $trackbackmatch = $match . $trackbackregex; + $trackbackquery = $trackbackindex . '?' . $query . '&tb=1'; + + // Create query and regex for embeds. + $embedmatch = $match . $embedregex; + $embedquery = $embedindex . '?' . $query . '&embed=true'; + + // Trim slashes from the end of the regex for this dir. + $match = rtrim( $match, '/' ); + + // Get rid of brackets. + $submatchbase = str_replace( array( '(', ')' ), '', $match ); + + // Add a rule for at attachments, which take the form of <permalink>/some-text. + $sub1 = $submatchbase . '/([^/]+)/'; + + // Add trackback regex <permalink>/trackback/... + $sub1tb = $sub1 . $trackbackregex; + + // And <permalink>/feed/(atom|...) + $sub1feed = $sub1 . $feedregex; + + // And <permalink>/(feed|atom...) + $sub1feed2 = $sub1 . $feedregex2; + + // And <permalink>/comment-page-xx + $sub1comment = $sub1 . $commentregex; + + // And <permalink>/embed/... + $sub1embed = $sub1 . $embedregex; + + /* + * Add another rule to match attachments in the explicit form: + * <permalink>/attachment/some-text + */ + $sub2 = $submatchbase . '/attachment/([^/]+)/'; + + // And add trackbacks <permalink>/attachment/trackback. + $sub2tb = $sub2 . $trackbackregex; + + // Feeds, <permalink>/attachment/feed/(atom|...) + $sub2feed = $sub2 . $feedregex; + + // And feeds again on to this <permalink>/attachment/(feed|atom...) + $sub2feed2 = $sub2 . $feedregex2; + + // And <permalink>/comment-page-xx + $sub2comment = $sub2 . $commentregex; + + // And <permalink>/embed/... + $sub2embed = $sub2 . $embedregex; + + // Create queries for these extra tag-ons we've just dealt with. + $subquery = $index . '?attachment=' . $this->preg_index( 1 ); + $subtbquery = $subquery . '&tb=1'; + $subfeedquery = $subquery . '&feed=' . $this->preg_index( 2 ); + $subcommentquery = $subquery . '&cpage=' . $this->preg_index( 2 ); + $subembedquery = $subquery . '&embed=true'; + + // Do endpoints for attachments. + if ( ! empty( $endpoints ) ) { + foreach ( (array) $ep_query_append as $regex => $ep ) { + if ( $ep[0] & EP_ATTACHMENT ) { + $rewrite[ $sub1 . $regex ] = $subquery . $ep[1] . $this->preg_index( 3 ); + $rewrite[ $sub2 . $regex ] = $subquery . $ep[1] . $this->preg_index( 3 ); + } + } + } + + /* + * Now we've finished with endpoints, finish off the $sub1 and $sub2 matches + * add a ? as we don't have to match that last slash, and finally a $ so we + * match to the end of the URL + */ + $sub1 .= '?$'; + $sub2 .= '?$'; + + /* + * Post pagination, e.g. <permalink>/2/ + * Previously: '(/[0-9]+)?/?$', which produced '/2' for page. + * When cast to int, returned 0. + */ + $match = $match . '(?:/([0-9]+))?/?$'; + $query = $index . '?' . $query . '&page=' . $this->preg_index( $num_toks + 1 ); + + // Not matching a permalink so this is a lot simpler. + } else { + // Close the match and finalise the query. + $match .= '?$'; + $query = $index . '?' . $query; + } + + /* + * Create the final array for this dir by joining the $rewrite array (which currently + * only contains rules/queries for trackback, pages etc) to the main regex/query for + * this dir + */ + $rewrite = array_merge( $rewrite, array( $match => $query ) ); + + // If we're matching a permalink, add those extras (attachments etc) on. + if ( $post ) { + // Add trackback. + $rewrite = array_merge( array( $trackbackmatch => $trackbackquery ), $rewrite ); + + // Add embed. + $rewrite = array_merge( array( $embedmatch => $embedquery ), $rewrite ); + + // Add regexes/queries for attachments, attachment trackbacks and so on. + if ( ! $page ) { + // Require <permalink>/attachment/stuff form for pages because of confusion with subpages. + $rewrite = array_merge( + $rewrite, + array( + $sub1 => $subquery, + $sub1tb => $subtbquery, + $sub1feed => $subfeedquery, + $sub1feed2 => $subfeedquery, + $sub1comment => $subcommentquery, + $sub1embed => $subembedquery, + ) + ); + } + + $rewrite = array_merge( + array( + $sub2 => $subquery, + $sub2tb => $subtbquery, + $sub2feed => $subfeedquery, + $sub2feed2 => $subfeedquery, + $sub2comment => $subcommentquery, + $sub2embed => $subembedquery, + ), + $rewrite + ); + } + } + // Add the rules for this dir to the accumulating $post_rewrite. + $post_rewrite = array_merge( $rewrite, $post_rewrite ); + } + + // The finished rules. phew! + return $post_rewrite; + } + + /** + * Generates rewrite rules with permalink structure and walking directory only. + * + * Shorten version of WP_Rewrite::generate_rewrite_rules() that allows for shorter + * list of parameters. See the method for longer description of what generating + * rewrite rules does. + * + * @since 1.5.0 + * + * @see WP_Rewrite::generate_rewrite_rules() See for long description and rest of parameters. + * + * @param string $permalink_structure The permalink structure to generate rules. + * @param bool $walk_dirs Optional, default is false. Whether to create list of directories to walk over. + * @return array + */ + public function generate_rewrite_rule( $permalink_structure, $walk_dirs = false ) { + return $this->generate_rewrite_rules( $permalink_structure, EP_NONE, false, false, false, $walk_dirs ); + } + + /** + * Constructs rewrite matches and queries from permalink structure. + * + * Runs the action {@see 'generate_rewrite_rules'} with the parameter that is an + * reference to the current WP_Rewrite instance to further manipulate the + * permalink structures and rewrite rules. Runs the {@see 'rewrite_rules_array'} + * filter on the full rewrite rule array. + * + * There are two ways to manipulate the rewrite rules, one by hooking into + * the {@see 'generate_rewrite_rules'} action and gaining full control of the + * object or just manipulating the rewrite rule array before it is passed + * from the function. + * + * @since 1.5.0 + * + * @return string[] An associative array of matches and queries. + */ + public function rewrite_rules() { + $rewrite = array(); + + if ( empty( $this->permalink_structure ) ) { + return $rewrite; + } + + // robots.txt -- only if installed at the root. + $home_path = parse_url( home_url() ); + $robots_rewrite = ( empty( $home_path['path'] ) || '/' == $home_path['path'] ) ? array( 'robots\.txt$' => $this->index . '?robots=1' ) : array(); + + // favicon.ico -- only if installed at the root. + $favicon_rewrite = ( empty( $home_path['path'] ) || '/' == $home_path['path'] ) ? array( 'favicon\.ico$' => $this->index . '?favicon=1' ) : array(); + + // Old feed and service files. + $deprecated_files = array( + '.*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\.php$' => $this->index . '?feed=old', + '.*wp-app\.php(/.*)?$' => $this->index . '?error=403', + ); + + // Registration rules. + $registration_pages = array(); + if ( is_multisite() && is_main_site() ) { + $registration_pages['.*wp-signup.php$'] = $this->index . '?signup=true'; + $registration_pages['.*wp-activate.php$'] = $this->index . '?activate=true'; + } + + // Deprecated. + $registration_pages['.*wp-register.php$'] = $this->index . '?register=true'; + + // Post rewrite rules. + $post_rewrite = $this->generate_rewrite_rules( $this->permalink_structure, EP_PERMALINK ); + + /** + * Filters rewrite rules used for "post" archives. + * + * @since 1.5.0 + * + * @param string[] $post_rewrite Array of rewrite rules for posts, keyed by their regex pattern. + */ + $post_rewrite = apply_filters( 'post_rewrite_rules', $post_rewrite ); + + // Date rewrite rules. + $date_rewrite = $this->generate_rewrite_rules( $this->get_date_permastruct(), EP_DATE ); + + /** + * Filters rewrite rules used for date archives. + * + * Likely date archives would include /yyyy/, /yyyy/mm/, and /yyyy/mm/dd/. + * + * @since 1.5.0 + * + * @param string[] $date_rewrite Array of rewrite rules for date archives, keyed by their regex pattern. + */ + $date_rewrite = apply_filters( 'date_rewrite_rules', $date_rewrite ); + + // Root-level rewrite rules. + $root_rewrite = $this->generate_rewrite_rules( $this->root . '/', EP_ROOT ); + + /** + * Filters rewrite rules used for root-level archives. + * + * Likely root-level archives would include pagination rules for the homepage + * as well as site-wide post feeds (e.g. /feed/, and /feed/atom/). + * + * @since 1.5.0 + * + * @param string[] $root_rewrite Array of root-level rewrite rules, keyed by their regex pattern. + */ + $root_rewrite = apply_filters( 'root_rewrite_rules', $root_rewrite ); + + // Comments rewrite rules. + $comments_rewrite = $this->generate_rewrite_rules( $this->root . $this->comments_base, EP_COMMENTS, false, true, true, false ); + + /** + * Filters rewrite rules used for comment feed archives. + * + * Likely comments feed archives include /comments/feed/, and /comments/feed/atom/. + * + * @since 1.5.0 + * + * @param string[] $comments_rewrite Array of rewrite rules for the site-wide comments feeds, keyed by their regex pattern. + */ + $comments_rewrite = apply_filters( 'comments_rewrite_rules', $comments_rewrite ); + + // Search rewrite rules. + $search_structure = $this->get_search_permastruct(); + $search_rewrite = $this->generate_rewrite_rules( $search_structure, EP_SEARCH ); + + /** + * Filters rewrite rules used for search archives. + * + * Likely search-related archives include /search/search+query/ as well as + * pagination and feed paths for a search. + * + * @since 1.5.0 + * + * @param string[] $search_rewrite Array of rewrite rules for search queries, keyed by their regex pattern. + */ + $search_rewrite = apply_filters( 'search_rewrite_rules', $search_rewrite ); + + // Author rewrite rules. + $author_rewrite = $this->generate_rewrite_rules( $this->get_author_permastruct(), EP_AUTHORS ); + + /** + * Filters rewrite rules used for author archives. + * + * Likely author archives would include /author/author-name/, as well as + * pagination and feed paths for author archives. + * + * @since 1.5.0 + * + * @param string[] $author_rewrite Array of rewrite rules for author archives, keyed by their regex pattern. + */ + $author_rewrite = apply_filters( 'author_rewrite_rules', $author_rewrite ); + + // Pages rewrite rules. + $page_rewrite = $this->page_rewrite_rules(); + + /** + * Filters rewrite rules used for "page" post type archives. + * + * @since 1.5.0 + * + * @param string[] $page_rewrite Array of rewrite rules for the "page" post type, keyed by their regex pattern. + */ + $page_rewrite = apply_filters( 'page_rewrite_rules', $page_rewrite ); + + // Extra permastructs. + foreach ( $this->extra_permastructs as $permastructname => $struct ) { + if ( is_array( $struct ) ) { + if ( count( $struct ) == 2 ) { + $rules = $this->generate_rewrite_rules( $struct[0], $struct[1] ); + } else { + $rules = $this->generate_rewrite_rules( $struct['struct'], $struct['ep_mask'], $struct['paged'], $struct['feed'], $struct['forcomments'], $struct['walk_dirs'], $struct['endpoints'] ); + } + } else { + $rules = $this->generate_rewrite_rules( $struct ); + } + + /** + * Filters rewrite rules used for individual permastructs. + * + * The dynamic portion of the hook name, `$permastructname`, refers + * to the name of the registered permastruct, e.g. 'post_tag' (tags), + * 'category' (categories), etc. + * + * @since 3.1.0 + * + * @param string[] $rules Array of rewrite rules generated for the current permastruct, keyed by their regex pattern. + */ + $rules = apply_filters( "{$permastructname}_rewrite_rules", $rules ); + if ( 'post_tag' == $permastructname ) { + + /** + * Filters rewrite rules used specifically for Tags. + * + * @since 2.3.0 + * @deprecated 3.1.0 Use {@see 'post_tag_rewrite_rules'} instead. + * + * @param string[] $rules Array of rewrite rules generated for tags, keyed by their regex pattern. + */ + $rules = apply_filters_deprecated( 'tag_rewrite_rules', array( $rules ), '3.1.0', 'post_tag_rewrite_rules' ); + } + + $this->extra_rules_top = array_merge( $this->extra_rules_top, $rules ); + } + + // Put them together. + if ( $this->use_verbose_page_rules ) { + $this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $page_rewrite, $post_rewrite, $this->extra_rules ); + } else { + $this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $page_rewrite, $this->extra_rules ); + } + + /** + * Fires after the rewrite rules are generated. + * + * @since 1.5.0 + * + * @param WP_Rewrite $this Current WP_Rewrite instance (passed by reference). + */ + do_action_ref_array( 'generate_rewrite_rules', array( &$this ) ); + + /** + * Filters the full set of generated rewrite rules. + * + * @since 1.5.0 + * + * @param string[] $this->rules The compiled array of rewrite rules, keyed by their regex pattern. + */ + $this->rules = apply_filters( 'rewrite_rules_array', $this->rules ); + + return $this->rules; + } + + /** + * Retrieves the rewrite rules. + * + * The difference between this method and WP_Rewrite::rewrite_rules() is that + * this method stores the rewrite rules in the 'rewrite_rules' option and retrieves + * it. This prevents having to process all of the permalinks to get the rewrite rules + * in the form of caching. + * + * @since 1.5.0 + * + * @return string[] Array of rewrite rules keyed by their regex pattern. + */ + public function wp_rewrite_rules() { + $this->rules = get_option( 'rewrite_rules' ); + if ( empty( $this->rules ) ) { + $this->matches = 'matches'; + $this->rewrite_rules(); + if ( ! did_action( 'wp_loaded' ) ) { + add_action( 'wp_loaded', array( $this, 'flush_rules' ) ); + return $this->rules; + } + update_option( 'rewrite_rules', $this->rules ); + } + + return $this->rules; + } + + /** + * Retrieves mod_rewrite-formatted rewrite rules to write to .htaccess. + * + * Does not actually write to the .htaccess file, but creates the rules for + * the process that will. + * + * Will add the non_wp_rules property rules to the .htaccess file before + * the WordPress rewrite rules one. + * + * @since 1.5.0 + * + * @return string + */ + public function mod_rewrite_rules() { + if ( ! $this->using_permalinks() ) { + return ''; + } + + $site_root = parse_url( site_url() ); + if ( isset( $site_root['path'] ) ) { + $site_root = trailingslashit( $site_root['path'] ); + } + + $home_root = parse_url( home_url() ); + if ( isset( $home_root['path'] ) ) { + $home_root = trailingslashit( $home_root['path'] ); + } else { + $home_root = '/'; + } + + $rules = "<IfModule mod_rewrite.c>\n"; + $rules .= "RewriteEngine On\n"; + $rules .= "RewriteBase $home_root\n"; + + // Prevent -f checks on index.php. + $rules .= "RewriteRule ^index\.php$ - [L]\n"; + + // Add in the rules that don't redirect to WP's index.php (and thus shouldn't be handled by WP at all). + foreach ( (array) $this->non_wp_rules as $match => $query ) { + // Apache 1.3 does not support the reluctant (non-greedy) modifier. + $match = str_replace( '.+?', '.+', $match ); + + $rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n"; + } + + if ( $this->use_verbose_rules ) { + $this->matches = ''; + $rewrite = $this->rewrite_rules(); + $num_rules = count( $rewrite ); + $rules .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n" . + "RewriteCond %{REQUEST_FILENAME} -d\n" . + "RewriteRule ^.*$ - [S=$num_rules]\n"; + + foreach ( (array) $rewrite as $match => $query ) { + // Apache 1.3 does not support the reluctant (non-greedy) modifier. + $match = str_replace( '.+?', '.+', $match ); + + if ( strpos( $query, $this->index ) !== false ) { + $rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n"; + } else { + $rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . " [QSA,L]\n"; + } + } + } else { + $rules .= "RewriteCond %{REQUEST_FILENAME} !-f\n" . + "RewriteCond %{REQUEST_FILENAME} !-d\n" . + "RewriteRule . {$home_root}{$this->index} [L]\n"; + } + + $rules .= "</IfModule>\n"; + + /** + * Filters the list of rewrite rules formatted for output to an .htaccess file. + * + * @since 1.5.0 + * + * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess. + */ + $rules = apply_filters( 'mod_rewrite_rules', $rules ); + + /** + * Filters the list of rewrite rules formatted for output to an .htaccess file. + * + * @since 1.5.0 + * @deprecated 1.5.0 Use the {@see 'mod_rewrite_rules'} filter instead. + * + * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess. + */ + return apply_filters_deprecated( 'rewrite_rules', array( $rules ), '1.5.0', 'mod_rewrite_rules' ); + } + + /** + * Retrieves IIS7 URL Rewrite formatted rewrite rules to write to web.config file. + * + * Does not actually write to the web.config file, but creates the rules for + * the process that will. + * + * @since 2.8.0 + * + * @param bool $add_parent_tags Optional. Whether to add parent tags to the rewrite rule sets. + * Default false. + * @return string IIS7 URL rewrite rule sets. + */ + public function iis7_url_rewrite_rules( $add_parent_tags = false ) { + if ( ! $this->using_permalinks() ) { + return ''; + } + $rules = ''; + if ( $add_parent_tags ) { + $rules .= '<configuration> + <system.webServer> + <rewrite> + <rules>'; + } + + $rules .= ' + <rule name="WordPress: ' . esc_attr( home_url() ) . '" patternSyntax="Wildcard"> + <match url="*" /> + <conditions> + <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> + <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> + </conditions> + <action type="Rewrite" url="index.php" /> + </rule>'; + + if ( $add_parent_tags ) { + $rules .= ' + </rules> + </rewrite> + </system.webServer> +</configuration>'; + } + + /** + * Filters the list of rewrite rules formatted for output to a web.config. + * + * @since 2.8.0 + * + * @param string $rules Rewrite rules formatted for IIS web.config. + */ + return apply_filters( 'iis7_url_rewrite_rules', $rules ); + } + + /** + * Adds a rewrite rule that transforms a URL structure to a set of query vars. + * + * Any value in the $after parameter that isn't 'bottom' will result in the rule + * being placed at the top of the rewrite rules. + * + * @since 2.1.0 + * @since 4.4.0 Array support was added to the `$query` parameter. + * + * @param string $regex Regular expression to match request against. + * @param string|array $query The corresponding query vars for this rewrite rule. + * @param string $after Optional. Priority of the new rule. Accepts 'top' + * or 'bottom'. Default 'bottom'. + */ + public function add_rule( $regex, $query, $after = 'bottom' ) { + if ( is_array( $query ) ) { + $external = false; + $query = add_query_arg( $query, 'index.php' ); + } else { + $index = false === strpos( $query, '?' ) ? strlen( $query ) : strpos( $query, '?' ); + $front = substr( $query, 0, $index ); + + $external = $front != $this->index; + } + + // "external" = it doesn't correspond to index.php. + if ( $external ) { + $this->add_external_rule( $regex, $query ); + } else { + if ( 'bottom' == $after ) { + $this->extra_rules = array_merge( $this->extra_rules, array( $regex => $query ) ); + } else { + $this->extra_rules_top = array_merge( $this->extra_rules_top, array( $regex => $query ) ); + } + } + } + + /** + * Adds a rewrite rule that doesn't correspond to index.php. + * + * @since 2.1.0 + * + * @param string $regex Regular expression to match request against. + * @param string $query The corresponding query vars for this rewrite rule. + */ + public function add_external_rule( $regex, $query ) { + $this->non_wp_rules[ $regex ] = $query; + } + + /** + * Adds an endpoint, like /trackback/. + * + * @since 2.1.0 + * @since 3.9.0 $query_var parameter added. + * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$query_var`. + * + * @see add_rewrite_endpoint() for full documentation. + * @global WP $wp Current WordPress environment instance. + * + * @param string $name Name of the endpoint. + * @param int $places Endpoint mask describing the places the endpoint should be added. + * @param string|bool $query_var Optional. Name of the corresponding query variable. Pass `false` to + * skip registering a query_var for this endpoint. Defaults to the + * value of `$name`. + */ + public function add_endpoint( $name, $places, $query_var = true ) { + global $wp; + + // For backward compatibility, if null has explicitly been passed as `$query_var`, assume `true`. + if ( true === $query_var || null === $query_var ) { + $query_var = $name; + } + $this->endpoints[] = array( $places, $name, $query_var ); + + if ( $query_var ) { + $wp->add_query_var( $query_var ); + } + } + + /** + * Adds a new permalink structure. + * + * A permalink structure (permastruct) is an abstract definition of a set of rewrite rules; + * it is an easy way of expressing a set of regular expressions that rewrite to a set of + * query strings. The new permastruct is added to the WP_Rewrite::$extra_permastructs array. + * + * When the rewrite rules are built by WP_Rewrite::rewrite_rules(), all of these extra + * permastructs are passed to WP_Rewrite::generate_rewrite_rules() which transforms them + * into the regular expressions that many love to hate. + * + * The `$args` parameter gives you control over how WP_Rewrite::generate_rewrite_rules() + * works on the new permastruct. + * + * @since 2.5.0 + * + * @param string $name Name for permalink structure. + * @param string $struct Permalink structure (e.g. category/%category%) + * @param array $args { + * Optional. Arguments for building rewrite rules based on the permalink structure. + * Default empty array. + * + * @type bool $with_front Whether the structure should be prepended with `WP_Rewrite::$front`. + * Default true. + * @type int $ep_mask The endpoint mask defining which endpoints are added to the structure. + * Accepts `EP_NONE`, `EP_PERMALINK`, `EP_ATTACHMENT`, `EP_DATE`, `EP_YEAR`, + * `EP_MONTH`, `EP_DAY`, `EP_ROOT`, `EP_COMMENTS`, `EP_SEARCH`, `EP_CATEGORIES`, + * `EP_TAGS`, `EP_AUTHORS`, `EP_PAGES`, `EP_ALL_ARCHIVES`, and `EP_ALL`. + * Default `EP_NONE`. + * @type bool $paged Whether archive pagination rules should be added for the structure. + * Default true. + * @type bool $feed Whether feed rewrite rules should be added for the structure. Default true. + * @type bool $forcomments Whether the feed rules should be a query for a comments feed. Default false. + * @type bool $walk_dirs Whether the 'directories' making up the structure should be walked over + * and rewrite rules built for each in-turn. Default true. + * @type bool $endpoints Whether endpoints should be applied to the generated rules. Default true. + * } + */ + public function add_permastruct( $name, $struct, $args = array() ) { + // Back-compat for the old parameters: $with_front and $ep_mask. + if ( ! is_array( $args ) ) { + $args = array( 'with_front' => $args ); + } + if ( func_num_args() == 4 ) { + $args['ep_mask'] = func_get_arg( 3 ); + } + + $defaults = array( + 'with_front' => true, + 'ep_mask' => EP_NONE, + 'paged' => true, + 'feed' => true, + 'forcomments' => false, + 'walk_dirs' => true, + 'endpoints' => true, + ); + $args = array_intersect_key( $args, $defaults ); + $args = wp_parse_args( $args, $defaults ); + + if ( $args['with_front'] ) { + $struct = $this->front . $struct; + } else { + $struct = $this->root . $struct; + } + $args['struct'] = $struct; + + $this->extra_permastructs[ $name ] = $args; + } + + /** + * Removes a permalink structure. + * + * @since 4.5.0 + * + * @param string $name Name for permalink structure. + */ + public function remove_permastruct( $name ) { + unset( $this->extra_permastructs[ $name ] ); + } + + /** + * Removes rewrite rules and then recreate rewrite rules. + * + * Calls WP_Rewrite::wp_rewrite_rules() after removing the 'rewrite_rules' option. + * If the function named 'save_mod_rewrite_rules' exists, it will be called. + * + * @since 2.0.1 + * + * @staticvar bool $do_hard_later + * + * @param bool $hard Whether to update .htaccess (hard flush) or just update rewrite_rules option (soft flush). Default is true (hard). + */ + public function flush_rules( $hard = true ) { + static $do_hard_later = null; + + // Prevent this action from running before everyone has registered their rewrites. + if ( ! did_action( 'wp_loaded' ) ) { + add_action( 'wp_loaded', array( $this, 'flush_rules' ) ); + $do_hard_later = ( isset( $do_hard_later ) ) ? $do_hard_later || $hard : $hard; + return; + } + + if ( isset( $do_hard_later ) ) { + $hard = $do_hard_later; + unset( $do_hard_later ); + } + + update_option( 'rewrite_rules', '' ); + $this->wp_rewrite_rules(); + + /** + * Filters whether a "hard" rewrite rule flush should be performed when requested. + * + * A "hard" flush updates .htaccess (Apache) or web.config (IIS). + * + * @since 3.7.0 + * + * @param bool $hard Whether to flush rewrite rules "hard". Default true. + */ + if ( ! $hard || ! apply_filters( 'flush_rewrite_rules_hard', true ) ) { + return; + } + if ( function_exists( 'save_mod_rewrite_rules' ) ) { + save_mod_rewrite_rules(); + } + if ( function_exists( 'iis7_save_url_rewrite_rules' ) ) { + iis7_save_url_rewrite_rules(); + } + } + + /** + * Sets up the object's properties. + * + * The 'use_verbose_page_rules' object property will be set to true if the + * permalink structure begins with one of the following: '%postname%', '%category%', + * '%tag%', or '%author%'. + * + * @since 1.5.0 + */ + public function init() { + $this->extra_rules = array(); + $this->non_wp_rules = array(); + $this->endpoints = array(); + $this->permalink_structure = get_option( 'permalink_structure' ); + $this->front = substr( $this->permalink_structure, 0, strpos( $this->permalink_structure, '%' ) ); + $this->root = ''; + + if ( $this->using_index_permalinks() ) { + $this->root = $this->index . '/'; + } + + unset( $this->author_structure ); + unset( $this->date_structure ); + unset( $this->page_structure ); + unset( $this->search_structure ); + unset( $this->feed_structure ); + unset( $this->comment_feed_structure ); + $this->use_trailing_slashes = ( '/' == substr( $this->permalink_structure, -1, 1 ) ); + + // Enable generic rules for pages if permalink structure doesn't begin with a wildcard. + if ( preg_match( '/^[^%]*%(?:postname|category|tag|author)%/', $this->permalink_structure ) ) { + $this->use_verbose_page_rules = true; + } else { + $this->use_verbose_page_rules = false; + } + } + + /** + * Sets the main permalink structure for the site. + * + * Will update the 'permalink_structure' option, if there is a difference + * between the current permalink structure and the parameter value. Calls + * WP_Rewrite::init() after the option is updated. + * + * Fires the {@see 'permalink_structure_changed'} action once the init call has + * processed passing the old and new values + * + * @since 1.5.0 + * + * @param string $permalink_structure Permalink structure. + */ + public function set_permalink_structure( $permalink_structure ) { + if ( $permalink_structure != $this->permalink_structure ) { + $old_permalink_structure = $this->permalink_structure; + update_option( 'permalink_structure', $permalink_structure ); + + $this->init(); + + /** + * Fires after the permalink structure is updated. + * + * @since 2.8.0 + * + * @param string $old_permalink_structure The previous permalink structure. + * @param string $permalink_structure The new permalink structure. + */ + do_action( 'permalink_structure_changed', $old_permalink_structure, $permalink_structure ); + } + } + + /** + * Sets the category base for the category permalink. + * + * Will update the 'category_base' option, if there is a difference between + * the current category base and the parameter value. Calls WP_Rewrite::init() + * after the option is updated. + * + * @since 1.5.0 + * + * @param string $category_base Category permalink structure base. + */ + public function set_category_base( $category_base ) { + if ( get_option( 'category_base' ) !== $category_base ) { + update_option( 'category_base', $category_base ); + $this->init(); + } + } + + /** + * Sets the tag base for the tag permalink. + * + * Will update the 'tag_base' option, if there is a difference between the + * current tag base and the parameter value. Calls WP_Rewrite::init() after + * the option is updated. + * + * @since 2.3.0 + * + * @param string $tag_base Tag permalink structure base. + */ + public function set_tag_base( $tag_base ) { + if ( get_option( 'tag_base' ) !== $tag_base ) { + update_option( 'tag_base', $tag_base ); + $this->init(); + } + } + + /** + * Constructor - Calls init(), which runs setup. + * + * @since 1.5.0 + */ + public function __construct() { + $this->init(); + } +} diff --git a/wp-includes/class-wp-role.php b/wp-includes/class-wp-role.php new file mode 100644 index 0000000..d7f121a --- /dev/null +++ b/wp-includes/class-wp-role.php @@ -0,0 +1,111 @@ +<?php +/** + * User API: WP_Role class + * + * @package WordPress + * @subpackage Users + * @since 4.4.0 + */ + +/** + * Core class used to extend the user roles API. + * + * @since 2.0.0 + */ +class WP_Role { + /** + * Role name. + * + * @since 2.0.0 + * @var string + */ + public $name; + + /** + * List of capabilities the role contains. + * + * @since 2.0.0 + * @var array + */ + public $capabilities; + + /** + * Constructor - Set up object properties. + * + * The list of capabilities, must have the key as the name of the capability + * and the value a boolean of whether it is granted to the role. + * + * @since 2.0.0 + * + * @param string $role Role name. + * @param bool[] $capabilities List of capabilities keyed by the capability name, + * e.g. array( 'edit_posts' => true, 'delete_posts' => false ). + */ + public function __construct( $role, $capabilities ) { + $this->name = $role; + $this->capabilities = $capabilities; + } + + /** + * Assign role a capability. + * + * @since 2.0.0 + * + * @param string $cap Capability name. + * @param bool $grant Whether role has capability privilege. + */ + public function add_cap( $cap, $grant = true ) { + $this->capabilities[ $cap ] = $grant; + wp_roles()->add_cap( $this->name, $cap, $grant ); + } + + /** + * Removes a capability from a role. + * + * This is a container for WP_Roles::remove_cap() to remove the + * capability from the role. That is to say, that WP_Roles::remove_cap() + * implements the functionality, but it also makes sense to use this class, + * because you don't need to enter the role name. + * + * @since 2.0.0 + * + * @param string $cap Capability name. + */ + public function remove_cap( $cap ) { + unset( $this->capabilities[ $cap ] ); + wp_roles()->remove_cap( $this->name, $cap ); + } + + /** + * Determines whether the role has the given capability. + * + * The capabilities is passed through the {@see 'role_has_cap'} filter. + * The first parameter for the hook is the list of capabilities the class + * has assigned. The second parameter is the capability name to look for. + * The third and final parameter for the hook is the role name. + * + * @since 2.0.0 + * + * @param string $cap Capability name. + * @return bool True if the role has the given capability. False otherwise. + */ + public function has_cap( $cap ) { + /** + * Filters which capabilities a role has. + * + * @since 2.0.0 + * + * @param bool[] $capabilities Associative array of capabilities for the role. + * @param string $cap Capability name. + * @param string $name Role name. + */ + $capabilities = apply_filters( 'role_has_cap', $this->capabilities, $cap, $this->name ); + + if ( ! empty( $capabilities[ $cap ] ) ) { + return $capabilities[ $cap ]; + } else { + return false; + } + } + +} diff --git a/wp-includes/class-wp-roles.php b/wp-includes/class-wp-roles.php new file mode 100644 index 0000000..769a5b3 --- /dev/null +++ b/wp-includes/class-wp-roles.php @@ -0,0 +1,371 @@ +<?php +/** + * User API: WP_Roles class + * + * @package WordPress + * @subpackage Users + * @since 4.4.0 + */ + +/** + * Core class used to implement a user roles API. + * + * The role option is simple, the structure is organized by role name that store + * the name in value of the 'name' key. The capabilities are stored as an array + * in the value of the 'capability' key. + * + * array ( + * 'rolename' => array ( + * 'name' => 'rolename', + * 'capabilities' => array() + * ) + * ) + * + * @since 2.0.0 + */ +class WP_Roles { + /** + * List of roles and capabilities. + * + * @since 2.0.0 + * @var array[] + */ + public $roles; + + /** + * List of the role objects. + * + * @since 2.0.0 + * @var WP_Role[] + */ + public $role_objects = array(); + + /** + * List of role names. + * + * @since 2.0.0 + * @var string[] + */ + public $role_names = array(); + + /** + * Option name for storing role list. + * + * @since 2.0.0 + * @var string + */ + public $role_key; + + /** + * Whether to use the database for retrieval and storage. + * + * @since 2.1.0 + * @var bool + */ + public $use_db = true; + + /** + * The site ID the roles are initialized for. + * + * @since 4.9.0 + * @var int + */ + protected $site_id = 0; + + /** + * Constructor + * + * @since 2.0.0 + * @since 4.9.0 The `$site_id` argument was added. + * + * @global array $wp_user_roles Used to set the 'roles' property value. + * + * @param int $site_id Site ID to initialize roles for. Default is the current site. + */ + public function __construct( $site_id = null ) { + global $wp_user_roles; + + $this->use_db = empty( $wp_user_roles ); + + $this->for_site( $site_id ); + } + + /** + * Make private/protected methods readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Method to call. + * @param array $arguments Arguments to pass when calling. + * @return mixed|false Return value of the callback, false otherwise. + */ + public function __call( $name, $arguments ) { + if ( '_init' === $name ) { + return $this->_init( ...$arguments ); + } + return false; + } + + /** + * Set up the object properties. + * + * The role key is set to the current prefix for the $wpdb object with + * 'user_roles' appended. If the $wp_user_roles global is set, then it will + * be used and the role option will not be updated or used. + * + * @since 2.1.0 + * @deprecated 4.9.0 Use WP_Roles::for_site() + */ + protected function _init() { + _deprecated_function( __METHOD__, '4.9.0', 'WP_Roles::for_site()' ); + + $this->for_site(); + } + + /** + * Reinitialize the object + * + * Recreates the role objects. This is typically called only by switch_to_blog() + * after switching wpdb to a new site ID. + * + * @since 3.5.0 + * @deprecated 4.7.0 Use WP_Roles::for_site() + */ + public function reinit() { + _deprecated_function( __METHOD__, '4.7.0', 'WP_Roles::for_site()' ); + + $this->for_site(); + } + + /** + * Add role name with capabilities to list. + * + * Updates the list of roles, if the role doesn't already exist. + * + * The capabilities are defined in the following format `array( 'read' => true );` + * To explicitly deny a role a capability you set the value for that capability to false. + * + * @since 2.0.0 + * + * @param string $role Role name. + * @param string $display_name Role display name. + * @param bool[] $capabilities List of capabilities keyed by the capability name, + * e.g. array( 'edit_posts' => true, 'delete_posts' => false ). + * @return WP_Role|void WP_Role object, if role is added. + */ + public function add_role( $role, $display_name, $capabilities = array() ) { + if ( empty( $role ) || isset( $this->roles[ $role ] ) ) { + return; + } + + $this->roles[ $role ] = array( + 'name' => $display_name, + 'capabilities' => $capabilities, + ); + if ( $this->use_db ) { + update_option( $this->role_key, $this->roles ); + } + $this->role_objects[ $role ] = new WP_Role( $role, $capabilities ); + $this->role_names[ $role ] = $display_name; + return $this->role_objects[ $role ]; + } + + /** + * Remove role by name. + * + * @since 2.0.0 + * + * @param string $role Role name. + */ + public function remove_role( $role ) { + if ( ! isset( $this->role_objects[ $role ] ) ) { + return; + } + + unset( $this->role_objects[ $role ] ); + unset( $this->role_names[ $role ] ); + unset( $this->roles[ $role ] ); + + if ( $this->use_db ) { + update_option( $this->role_key, $this->roles ); + } + + if ( get_option( 'default_role' ) == $role ) { + update_option( 'default_role', 'subscriber' ); + } + } + + /** + * Add capability to role. + * + * @since 2.0.0 + * + * @param string $role Role name. + * @param string $cap Capability name. + * @param bool $grant Optional, default is true. Whether role is capable of performing capability. + */ + public function add_cap( $role, $cap, $grant = true ) { + if ( ! isset( $this->roles[ $role ] ) ) { + return; + } + + $this->roles[ $role ]['capabilities'][ $cap ] = $grant; + if ( $this->use_db ) { + update_option( $this->role_key, $this->roles ); + } + } + + /** + * Remove capability from role. + * + * @since 2.0.0 + * + * @param string $role Role name. + * @param string $cap Capability name. + */ + public function remove_cap( $role, $cap ) { + if ( ! isset( $this->roles[ $role ] ) ) { + return; + } + + unset( $this->roles[ $role ]['capabilities'][ $cap ] ); + if ( $this->use_db ) { + update_option( $this->role_key, $this->roles ); + } + } + + /** + * Retrieve role object by name. + * + * @since 2.0.0 + * + * @param string $role Role name. + * @return WP_Role|null WP_Role object if found, null if the role does not exist. + */ + public function get_role( $role ) { + if ( isset( $this->role_objects[ $role ] ) ) { + return $this->role_objects[ $role ]; + } else { + return null; + } + } + + /** + * Retrieve list of role names. + * + * @since 2.0.0 + * + * @return string[] List of role names. + */ + public function get_names() { + return $this->role_names; + } + + /** + * Whether role name is currently in the list of available roles. + * + * @since 2.0.0 + * + * @param string $role Role name to look up. + * @return bool + */ + public function is_role( $role ) { + return isset( $this->role_names[ $role ] ); + } + + /** + * Initializes all of the available roles. + * + * @since 4.9.0 + */ + public function init_roles() { + if ( empty( $this->roles ) ) { + return; + } + + $this->role_objects = array(); + $this->role_names = array(); + foreach ( array_keys( $this->roles ) as $role ) { + $this->role_objects[ $role ] = new WP_Role( $role, $this->roles[ $role ]['capabilities'] ); + $this->role_names[ $role ] = $this->roles[ $role ]['name']; + } + + /** + * After the roles have been initialized, allow plugins to add their own roles. + * + * @since 4.7.0 + * + * @param WP_Roles $this A reference to the WP_Roles object. + */ + do_action( 'wp_roles_init', $this ); + } + + /** + * Sets the site to operate on. Defaults to the current site. + * + * @since 4.9.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $site_id Site ID to initialize roles for. Default is the current site. + */ + public function for_site( $site_id = null ) { + global $wpdb; + + if ( ! empty( $site_id ) ) { + $this->site_id = absint( $site_id ); + } else { + $this->site_id = get_current_blog_id(); + } + + $this->role_key = $wpdb->get_blog_prefix( $this->site_id ) . 'user_roles'; + + if ( ! empty( $this->roles ) && ! $this->use_db ) { + return; + } + + $this->roles = $this->get_roles_data(); + + $this->init_roles(); + } + + /** + * Gets the ID of the site for which roles are currently initialized. + * + * @since 4.9.0 + * + * @return int Site ID. + */ + public function get_site_id() { + return $this->site_id; + } + + /** + * Gets the available roles data. + * + * @since 4.9.0 + * + * @global array $wp_user_roles Used to set the 'roles' property value. + * + * @return array Roles array. + */ + protected function get_roles_data() { + global $wp_user_roles; + + if ( ! empty( $wp_user_roles ) ) { + return $wp_user_roles; + } + + if ( is_multisite() && get_current_blog_id() != $this->site_id ) { + remove_action( 'switch_blog', 'wp_switch_roles_and_user', 1 ); + + $roles = get_blog_option( $this->site_id, $this->role_key, array() ); + + add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 ); + + return $roles; + } + + return get_option( $this->role_key, array() ); + } +} diff --git a/wp-includes/class-wp-session-tokens.php b/wp-includes/class-wp-session-tokens.php new file mode 100644 index 0000000..033add3 --- /dev/null +++ b/wp-includes/class-wp-session-tokens.php @@ -0,0 +1,294 @@ +<?php +/** + * Session API: WP_Session_Tokens class + * + * @package WordPress + * @subpackage Session + * @since 4.7.0 + */ + +/** + * Abstract class for managing user session tokens. + * + * @since 4.0.0 + */ +abstract class WP_Session_Tokens { + + /** + * User ID. + * + * @since 4.0.0 + * @var int User ID. + */ + protected $user_id; + + /** + * Protected constructor. Use the `get_instance()` method to get the instance. + * + * @since 4.0.0 + * + * @param int $user_id User whose session to manage. + */ + protected function __construct( $user_id ) { + $this->user_id = $user_id; + } + + /** + * Retrieves a session manager instance for a user. + * + * This method contains a {@see 'session_token_manager'} filter, allowing a plugin to swap out + * the session manager for a subclass of `WP_Session_Tokens`. + * + * @since 4.0.0 + * + * @param int $user_id User whose session to manage. + * @return WP_Session_Tokens The session object, which is by default an instance of + * the `WP_User_Meta_Session_Tokens` class. + */ + final public static function get_instance( $user_id ) { + /** + * Filters the class name for the session token manager. + * + * @since 4.0.0 + * + * @param string $session Name of class to use as the manager. + * Default 'WP_User_Meta_Session_Tokens'. + */ + $manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' ); + return new $manager( $user_id ); + } + + /** + * Hashes the given session token for storage. + * + * @since 4.0.0 + * + * @param string $token Session token to hash. + * @return string A hash of the session token (a verifier). + */ + final private function hash_token( $token ) { + // If ext/hash is not present, use sha1() instead. + if ( function_exists( 'hash' ) ) { + return hash( 'sha256', $token ); + } else { + return sha1( $token ); + } + } + + /** + * Retrieves a user's session for the given token. + * + * @since 4.0.0 + * + * @param string $token Session token. + * @return array|null The session, or null if it does not exist. + */ + final public function get( $token ) { + $verifier = $this->hash_token( $token ); + return $this->get_session( $verifier ); + } + + /** + * Validates the given session token for authenticity and validity. + * + * Checks that the given token is present and hasn't expired. + * + * @since 4.0.0 + * + * @param string $token Token to verify. + * @return bool Whether the token is valid for the user. + */ + final public function verify( $token ) { + $verifier = $this->hash_token( $token ); + return (bool) $this->get_session( $verifier ); + } + + /** + * Generates a session token and attaches session information to it. + * + * A session token is a long, random string. It is used in a cookie + * to link that cookie to an expiration time and to ensure the cookie + * becomes invalidated when the user logs out. + * + * This function generates a token and stores it with the associated + * expiration time (and potentially other session information via the + * {@see 'attach_session_information'} filter). + * + * @since 4.0.0 + * + * @param int $expiration Session expiration timestamp. + * @return string Session token. + */ + final public function create( $expiration ) { + /** + * Filters the information attached to the newly created session. + * + * Can be used to attach further information to a session. + * + * @since 4.0.0 + * + * @param array $session Array of extra data. + * @param int $user_id User ID. + */ + $session = apply_filters( 'attach_session_information', array(), $this->user_id ); + $session['expiration'] = $expiration; + + // IP address. + if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) { + $session['ip'] = $_SERVER['REMOTE_ADDR']; + } + + // User-agent. + if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) { + $session['ua'] = wp_unslash( $_SERVER['HTTP_USER_AGENT'] ); + } + + // Timestamp. + $session['login'] = time(); + + $token = wp_generate_password( 43, false, false ); + + $this->update( $token, $session ); + + return $token; + } + + /** + * Updates the data for the session with the given token. + * + * @since 4.0.0 + * + * @param string $token Session token to update. + * @param array $session Session information. + */ + final public function update( $token, $session ) { + $verifier = $this->hash_token( $token ); + $this->update_session( $verifier, $session ); + } + + /** + * Destroys the session with the given token. + * + * @since 4.0.0 + * + * @param string $token Session token to destroy. + */ + final public function destroy( $token ) { + $verifier = $this->hash_token( $token ); + $this->update_session( $verifier, null ); + } + + /** + * Destroys all sessions for this user except the one with the given token (presumably the one in use). + * + * @since 4.0.0 + * + * @param string $token_to_keep Session token to keep. + */ + final public function destroy_others( $token_to_keep ) { + $verifier = $this->hash_token( $token_to_keep ); + $session = $this->get_session( $verifier ); + if ( $session ) { + $this->destroy_other_sessions( $verifier ); + } else { + $this->destroy_all_sessions(); + } + } + + /** + * Determines whether a session is still valid, based on its expiration timestamp. + * + * @since 4.0.0 + * + * @param array $session Session to check. + * @return bool Whether session is valid. + */ + final protected function is_still_valid( $session ) { + return $session['expiration'] >= time(); + } + + /** + * Destroys all sessions for a user. + * + * @since 4.0.0 + */ + final public function destroy_all() { + $this->destroy_all_sessions(); + } + + /** + * Destroys all sessions for all users. + * + * @since 4.0.0 + */ + final public static function destroy_all_for_all_users() { + /** This filter is documented in wp-includes/class-wp-session-tokens.php */ + $manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' ); + call_user_func( array( $manager, 'drop_sessions' ) ); + } + + /** + * Retrieves all sessions for a user. + * + * @since 4.0.0 + * + * @return array Sessions for a user. + */ + final public function get_all() { + return array_values( $this->get_sessions() ); + } + + /** + * Retrieves all sessions of the user. + * + * @since 4.0.0 + * + * @return array Sessions of the user. + */ + abstract protected function get_sessions(); + + /** + * Retrieves a session based on its verifier (token hash). + * + * @since 4.0.0 + * + * @param string $verifier Verifier for the session to retrieve. + * @return array|null The session, or null if it does not exist. + */ + abstract protected function get_session( $verifier ); + + /** + * Updates a session based on its verifier (token hash). + * + * Omitting the second argument destroys the session. + * + * @since 4.0.0 + * + * @param string $verifier Verifier for the session to update. + * @param array $session Optional. Session. Omitting this argument destroys the session. + */ + abstract protected function update_session( $verifier, $session = null ); + + /** + * Destroys all sessions for this user, except the single session with the given verifier. + * + * @since 4.0.0 + * + * @param string $verifier Verifier of the session to keep. + */ + abstract protected function destroy_other_sessions( $verifier ); + + /** + * Destroys all sessions for the user. + * + * @since 4.0.0 + */ + abstract protected function destroy_all_sessions(); + + /** + * Destroys all sessions for all users. + * + * @since 4.0.0 + */ + public static function drop_sessions() {} +} diff --git a/wp-includes/class-wp-simplepie-file.php b/wp-includes/class-wp-simplepie-file.php new file mode 100644 index 0000000..6d43a3b --- /dev/null +++ b/wp-includes/class-wp-simplepie-file.php @@ -0,0 +1,73 @@ +<?php +/** + * Feed API: WP_SimplePie_File class + * + * @package WordPress + * @subpackage Feed + * @since 4.7.0 + */ + +/** + * Core class for fetching remote files and reading local files with SimplePie. + * + * @since 2.8.0 + * + * @see SimplePie_File + */ +class WP_SimplePie_File extends SimplePie_File { + + /** + * Constructor. + * + * @since 2.8.0 + * @since 3.2.0 Updated to use a PHP5 constructor. + * + * @param string $url Remote file URL. + * @param integer $timeout Optional. How long the connection should stay open in seconds. + * Default 10. + * @param integer $redirects Optional. The number of allowed redirects. Default 5. + * @param string|array $headers Optional. Array or string of headers to send with the request. + * Default null. + * @param string $useragent Optional. User-agent value sent. Default null. + * @param boolean $force_fsockopen Optional. Whether to force opening internet or unix domain socket + * connection or not. Default false. + */ + public function __construct( $url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false ) { + $this->url = $url; + $this->timeout = $timeout; + $this->redirects = $redirects; + $this->headers = $headers; + $this->useragent = $useragent; + + $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE; + + if ( preg_match( '/^http(s)?:\/\//i', $url ) ) { + $args = array( + 'timeout' => $this->timeout, + 'redirection' => $this->redirects, + ); + + if ( ! empty( $this->headers ) ) { + $args['headers'] = $this->headers; + } + + if ( SIMPLEPIE_USERAGENT != $this->useragent ) { // Use default WP user agent unless custom has been specified. + $args['user-agent'] = $this->useragent; + } + + $res = wp_safe_remote_request( $url, $args ); + + if ( is_wp_error( $res ) ) { + $this->error = 'WP HTTP Error: ' . $res->get_error_message(); + $this->success = false; + } else { + $this->headers = wp_remote_retrieve_headers( $res ); + $this->body = wp_remote_retrieve_body( $res ); + $this->status_code = wp_remote_retrieve_response_code( $res ); + } + } else { + $this->error = ''; + $this->success = false; + } + } +} diff --git a/wp-includes/class-wp-simplepie-sanitize-kses.php b/wp-includes/class-wp-simplepie-sanitize-kses.php new file mode 100644 index 0000000..4a4fed6 --- /dev/null +++ b/wp-includes/class-wp-simplepie-sanitize-kses.php @@ -0,0 +1,57 @@ +<?php +/** + * Feed API: WP_SimplePie_Sanitize_KSES class + * + * @package WordPress + * @subpackage Feed + * @since 4.7.0 + */ + +/** + * Core class used to implement SimpliePie feed sanitization. + * + * Extends the SimplePie_Sanitize class to use KSES, because + * we cannot universally count on DOMDocument being available. + * + * @since 3.5.0 + * + * @see SimplePie_Sanitize + */ +class WP_SimplePie_Sanitize_KSES extends SimplePie_Sanitize { + + /** + * WordPress SimplePie sanitization using KSES. + * + * Sanitizes the incoming data, to ensure that it matches the type of data expected, using KSES. + * + * @since 3.5.0 + * + * @param mixed $data The data that needs to be sanitized. + * @param integer $type The type of data that it's supposed to be. + * @param string $base Optional. The `xml:base` value to use when converting relative + * URLs to absolute ones. Default empty. + * @return mixed Sanitized data. + */ + public function sanitize( $data, $type, $base = '' ) { + $data = trim( $data ); + if ( $type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML ) { + if ( preg_match( '/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data ) ) { + $type |= SIMPLEPIE_CONSTRUCT_HTML; + } else { + $type |= SIMPLEPIE_CONSTRUCT_TEXT; + } + } + if ( $type & SIMPLEPIE_CONSTRUCT_BASE64 ) { + $data = base64_decode( $data ); + } + if ( $type & ( SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML ) ) { + $data = wp_kses_post( $data ); + if ( 'UTF-8' !== $this->output_encoding ) { + $data = $this->registry->call( 'Misc', 'change_encoding', array( $data, 'UTF-8', $this->output_encoding ) ); + } + return $data; + } else { + return parent::sanitize( $data, $type, $base ); + } + } +} diff --git a/wp-includes/class-wp-site-query.php b/wp-includes/class-wp-site-query.php new file mode 100644 index 0000000..f2cc1b7 --- /dev/null +++ b/wp-includes/class-wp-site-query.php @@ -0,0 +1,820 @@ +<?php +/** + * Site API: WP_Site_Query class + * + * @package WordPress + * @subpackage Sites + * @since 4.6.0 + */ + +/** + * Core class used for querying sites. + * + * @since 4.6.0 + * + * @see WP_Site_Query::__construct() for accepted arguments. + */ +class WP_Site_Query { + + /** + * SQL for database query. + * + * @since 4.6.0 + * @var string + */ + public $request; + + /** + * SQL query clauses. + * + * @since 4.6.0 + * @var array + */ + protected $sql_clauses = array( + 'select' => '', + 'from' => '', + 'where' => array(), + 'groupby' => '', + 'orderby' => '', + 'limits' => '', + ); + + /** + * Metadata query container. + * + * @since 5.1.0 + * @var WP_Meta_Query + */ + public $meta_query = false; + + /** + * Metadata query clauses. + * + * @since 5.1.0 + * @var array + */ + protected $meta_query_clauses; + + /** + * Date query container. + * + * @since 4.6.0 + * @var object WP_Date_Query + */ + public $date_query = false; + + /** + * Query vars set by the user. + * + * @since 4.6.0 + * @var array + */ + public $query_vars; + + /** + * Default values for query vars. + * + * @since 4.6.0 + * @var array + */ + public $query_var_defaults; + + /** + * List of sites located by the query. + * + * @since 4.6.0 + * @var array + */ + public $sites; + + /** + * The amount of found sites for the current query. + * + * @since 4.6.0 + * @var int + */ + public $found_sites = 0; + + /** + * The number of pages. + * + * @since 4.6.0 + * @var int + */ + public $max_num_pages = 0; + + /** + * Sets up the site query, based on the query vars passed. + * + * @since 4.6.0 + * @since 4.8.0 Introduced the 'lang_id', 'lang__in', and 'lang__not_in' parameters. + * @since 5.1.0 Introduced the 'update_site_meta_cache', 'meta_query', 'meta_key', + * 'meta_value', 'meta_type' and 'meta_compare' parameters. + * + * @param string|array $query { + * Optional. Array or query string of site query parameters. Default empty. + * + * @type array $site__in Array of site IDs to include. Default empty. + * @type array $site__not_in Array of site IDs to exclude. Default empty. + * @type bool $count Whether to return a site count (true) or array of site objects. + * Default false. + * @type array $date_query Date query clauses to limit sites by. See WP_Date_Query. + * Default null. + * @type string $fields Site fields to return. Accepts 'ids' (returns an array of site IDs) + * or empty (returns an array of complete site objects). Default empty. + * @type int $ID A site ID to only return that site. Default empty. + * @type int $number Maximum number of sites to retrieve. Default 100. + * @type int $offset Number of sites to offset the query. Used to build LIMIT clause. + * Default 0. + * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true. + * @type string|array $orderby Site status or array of statuses. Accepts 'id', 'domain', 'path', + * 'network_id', 'last_updated', 'registered', 'domain_length', + * 'path_length', 'site__in' and 'network__in'. Also accepts false, + * an empty array, or 'none' to disable `ORDER BY` clause. + * Default 'id'. + * @type string $order How to order retrieved sites. Accepts 'ASC', 'DESC'. Default 'ASC'. + * @type int $network_id Limit results to those affiliated with a given network ID. If 0, + * include all networks. Default 0. + * @type array $network__in Array of network IDs to include affiliated sites for. Default empty. + * @type array $network__not_in Array of network IDs to exclude affiliated sites for. Default empty. + * @type string $domain Limit results to those affiliated with a given domain. Default empty. + * @type array $domain__in Array of domains to include affiliated sites for. Default empty. + * @type array $domain__not_in Array of domains to exclude affiliated sites for. Default empty. + * @type string $path Limit results to those affiliated with a given path. Default empty. + * @type array $path__in Array of paths to include affiliated sites for. Default empty. + * @type array $path__not_in Array of paths to exclude affiliated sites for. Default empty. + * @type int $public Limit results to public sites. Accepts '1' or '0'. Default empty. + * @type int $archived Limit results to archived sites. Accepts '1' or '0'. Default empty. + * @type int $mature Limit results to mature sites. Accepts '1' or '0'. Default empty. + * @type int $spam Limit results to spam sites. Accepts '1' or '0'. Default empty. + * @type int $deleted Limit results to deleted sites. Accepts '1' or '0'. Default empty. + * @type int $lang_id Limit results to a language ID. Default empty. + * @type array $lang__in Array of language IDs to include affiliated sites for. Default empty. + * @type array $lang__not_in Array of language IDs to exclude affiliated sites for. Default empty. + * @type string $search Search term(s) to retrieve matching sites for. Default empty. + * @type array $search_columns Array of column names to be searched. Accepts 'domain' and 'path'. + * Default empty array. + * @type bool $update_site_cache Whether to prime the cache for found sites. Default true. + * @type bool $update_site_meta_cache Whether to prime the metadata cache for found sites. Default true. + * @type array $meta_query Meta query clauses to limit retrieved sites by. See `WP_Meta_Query`. + * Default empty. + * @type string $meta_key Limit sites to those matching a specific metadata key. + * Can be used in conjunction with `$meta_value`. Default empty. + * @type string $meta_value Limit sites to those matching a specific metadata value. + * Usually used in conjunction with `$meta_key`. Default empty. + * @type string $meta_type Data type that the `$meta_value` column will be CAST to for + * comparisons. Default empty. + * @type string $meta_compare Comparison operator to test the `$meta_value`. Default empty. + * } + */ + public function __construct( $query = '' ) { + $this->query_var_defaults = array( + 'fields' => '', + 'ID' => '', + 'site__in' => '', + 'site__not_in' => '', + 'number' => 100, + 'offset' => '', + 'no_found_rows' => true, + 'orderby' => 'id', + 'order' => 'ASC', + 'network_id' => 0, + 'network__in' => '', + 'network__not_in' => '', + 'domain' => '', + 'domain__in' => '', + 'domain__not_in' => '', + 'path' => '', + 'path__in' => '', + 'path__not_in' => '', + 'public' => null, + 'archived' => null, + 'mature' => null, + 'spam' => null, + 'deleted' => null, + 'lang_id' => null, + 'lang__in' => '', + 'lang__not_in' => '', + 'search' => '', + 'search_columns' => array(), + 'count' => false, + 'date_query' => null, // See WP_Date_Query. + 'update_site_cache' => true, + 'update_site_meta_cache' => true, + 'meta_query' => '', + 'meta_key' => '', + 'meta_value' => '', + 'meta_type' => '', + 'meta_compare' => '', + ); + + if ( ! empty( $query ) ) { + $this->query( $query ); + } + } + + /** + * Parses arguments passed to the site query with default query parameters. + * + * @since 4.6.0 + * + * @see WP_Site_Query::__construct() + * + * @param string|array $query Array or string of WP_Site_Query arguments. See WP_Site_Query::__construct(). + */ + public function parse_query( $query = '' ) { + if ( empty( $query ) ) { + $query = $this->query_vars; + } + + $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); + + /** + * Fires after the site query vars have been parsed. + * + * @since 4.6.0 + * + * @param WP_Site_Query $this The WP_Site_Query instance (passed by reference). + */ + do_action_ref_array( 'parse_site_query', array( &$this ) ); + } + + /** + * Sets up the WordPress query for retrieving sites. + * + * @since 4.6.0 + * + * @param string|array $query Array or URL query string of parameters. + * @return array|int List of WP_Site objects, a list of site ids when 'fields' is set to 'ids', + * or the number of sites when 'count' is passed as a query var. + */ + public function query( $query ) { + $this->query_vars = wp_parse_args( $query ); + + return $this->get_sites(); + } + + /** + * Retrieves a list of sites matching the query vars. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return array|int List of WP_Site objects, a list of site ids when 'fields' is set to 'ids', + * or the number of sites when 'count' is passed as a query var. + */ + public function get_sites() { + global $wpdb; + + $this->parse_query(); + + // Parse meta query. + $this->meta_query = new WP_Meta_Query(); + $this->meta_query->parse_query_vars( $this->query_vars ); + + /** + * Fires before sites are retrieved. + * + * @since 4.6.0 + * + * @param WP_Site_Query $this Current instance of WP_Site_Query (passed by reference). + */ + do_action_ref_array( 'pre_get_sites', array( &$this ) ); + + // Reparse query vars, in case they were modified in a 'pre_get_sites' callback. + $this->meta_query->parse_query_vars( $this->query_vars ); + if ( ! empty( $this->meta_query->queries ) ) { + $this->meta_query_clauses = $this->meta_query->get_sql( 'blog', $wpdb->blogs, 'blog_id', $this ); + } + + $site_data = null; + + /** + * Filter the site data before the get_sites query takes place. + * + * Return a non-null value to bypass WordPress's default site queries. + * + * The expected return type from this filter depends on the value passed in the request query_vars: + * When `$this->query_vars['count']` is set, the filter should return the site count as an int. + * When `'ids' == $this->query_vars['fields']`, the filter should return an array of site ids. + * Otherwise the filter should return an array of WP_Site objects. + * + * @since 5.2.0 + * + * @param array|int|null $site_data Return an array of site data to short-circuit WP's site query, + * the site count as an integer if `$this->query_vars['count']` is set, + * or null to run the normal queries. + * @param WP_Site_Query $this The WP_Site_Query instance, passed by reference. + */ + $site_data = apply_filters_ref_array( 'sites_pre_query', array( $site_data, &$this ) ); + + if ( null !== $site_data ) { + return $site_data; + } + + // $args can include anything. Only use the args defined in the query_var_defaults to compute the key. + $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ); + + // Ignore the $fields argument as the queried result will be the same regardless. + unset( $_args['fields'] ); + + $key = md5( serialize( $_args ) ); + $last_changed = wp_cache_get_last_changed( 'sites' ); + + $cache_key = "get_sites:$key:$last_changed"; + $cache_value = wp_cache_get( $cache_key, 'sites' ); + + if ( false === $cache_value ) { + $site_ids = $this->get_site_ids(); + if ( $site_ids ) { + $this->set_found_sites(); + } + + $cache_value = array( + 'site_ids' => $site_ids, + 'found_sites' => $this->found_sites, + ); + wp_cache_add( $cache_key, $cache_value, 'sites' ); + } else { + $site_ids = $cache_value['site_ids']; + $this->found_sites = $cache_value['found_sites']; + } + + if ( $this->found_sites && $this->query_vars['number'] ) { + $this->max_num_pages = ceil( $this->found_sites / $this->query_vars['number'] ); + } + + // If querying for a count only, there's nothing more to do. + if ( $this->query_vars['count'] ) { + // $site_ids is actually a count in this case. + return intval( $site_ids ); + } + + $site_ids = array_map( 'intval', $site_ids ); + + if ( 'ids' == $this->query_vars['fields'] ) { + $this->sites = $site_ids; + + return $this->sites; + } + + // Prime site network caches. + if ( $this->query_vars['update_site_cache'] ) { + _prime_site_caches( $site_ids, $this->query_vars['update_site_meta_cache'] ); + } + + // Fetch full site objects from the primed cache. + $_sites = array(); + foreach ( $site_ids as $site_id ) { + $_site = get_site( $site_id ); + if ( $_site ) { + $_sites[] = $_site; + } + } + + /** + * Filters the site query results. + * + * @since 4.6.0 + * + * @param WP_Site[] $_sites An array of WP_Site objects. + * @param WP_Site_Query $this Current instance of WP_Site_Query (passed by reference). + */ + $_sites = apply_filters_ref_array( 'the_sites', array( $_sites, &$this ) ); + + // Convert to WP_Site instances. + $this->sites = array_map( 'get_site', $_sites ); + + return $this->sites; + } + + /** + * Used internally to get a list of site IDs matching the query vars. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return int|array A single count of site IDs if a count query. An array of site IDs if a full query. + */ + protected function get_site_ids() { + global $wpdb; + + $order = $this->parse_order( $this->query_vars['order'] ); + + // Disable ORDER BY with 'none', an empty array, or boolean false. + if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { + $orderby = ''; + } elseif ( ! empty( $this->query_vars['orderby'] ) ) { + $ordersby = is_array( $this->query_vars['orderby'] ) ? + $this->query_vars['orderby'] : + preg_split( '/[,\s]/', $this->query_vars['orderby'] ); + + $orderby_array = array(); + foreach ( $ordersby as $_key => $_value ) { + if ( ! $_value ) { + continue; + } + + if ( is_int( $_key ) ) { + $_orderby = $_value; + $_order = $order; + } else { + $_orderby = $_key; + $_order = $_value; + } + + $parsed = $this->parse_orderby( $_orderby ); + + if ( ! $parsed ) { + continue; + } + + if ( 'site__in' === $_orderby || 'network__in' === $_orderby ) { + $orderby_array[] = $parsed; + continue; + } + + $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); + } + + $orderby = implode( ', ', $orderby_array ); + } else { + $orderby = "{$wpdb->blogs}.blog_id $order"; + } + + $number = absint( $this->query_vars['number'] ); + $offset = absint( $this->query_vars['offset'] ); + $limits = ''; + + if ( ! empty( $number ) ) { + if ( $offset ) { + $limits = 'LIMIT ' . $offset . ',' . $number; + } else { + $limits = 'LIMIT ' . $number; + } + } + + if ( $this->query_vars['count'] ) { + $fields = 'COUNT(*)'; + } else { + $fields = "{$wpdb->blogs}.blog_id"; + } + + // Parse site IDs for an IN clause. + $site_id = absint( $this->query_vars['ID'] ); + if ( ! empty( $site_id ) ) { + $this->sql_clauses['where']['ID'] = $wpdb->prepare( "{$wpdb->blogs}.blog_id = %d", $site_id ); + } + + // Parse site IDs for an IN clause. + if ( ! empty( $this->query_vars['site__in'] ) ) { + $this->sql_clauses['where']['site__in'] = "{$wpdb->blogs}.blog_id IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__in'] ) ) . ' )'; + } + + // Parse site IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['site__not_in'] ) ) { + $this->sql_clauses['where']['site__not_in'] = "{$wpdb->blogs}.blog_id NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__not_in'] ) ) . ' )'; + } + + $network_id = absint( $this->query_vars['network_id'] ); + + if ( ! empty( $network_id ) ) { + $this->sql_clauses['where']['network_id'] = $wpdb->prepare( 'site_id = %d', $network_id ); + } + + // Parse site network IDs for an IN clause. + if ( ! empty( $this->query_vars['network__in'] ) ) { + $this->sql_clauses['where']['network__in'] = 'site_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__in'] ) ) . ' )'; + } + + // Parse site network IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['network__not_in'] ) ) { + $this->sql_clauses['where']['network__not_in'] = 'site_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__not_in'] ) ) . ' )'; + } + + if ( ! empty( $this->query_vars['domain'] ) ) { + $this->sql_clauses['where']['domain'] = $wpdb->prepare( 'domain = %s', $this->query_vars['domain'] ); + } + + // Parse site domain for an IN clause. + if ( is_array( $this->query_vars['domain__in'] ) ) { + $this->sql_clauses['where']['domain__in'] = "domain IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__in'] ) ) . "' )"; + } + + // Parse site domain for a NOT IN clause. + if ( is_array( $this->query_vars['domain__not_in'] ) ) { + $this->sql_clauses['where']['domain__not_in'] = "domain NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__not_in'] ) ) . "' )"; + } + + if ( ! empty( $this->query_vars['path'] ) ) { + $this->sql_clauses['where']['path'] = $wpdb->prepare( 'path = %s', $this->query_vars['path'] ); + } + + // Parse site path for an IN clause. + if ( is_array( $this->query_vars['path__in'] ) ) { + $this->sql_clauses['where']['path__in'] = "path IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__in'] ) ) . "' )"; + } + + // Parse site path for a NOT IN clause. + if ( is_array( $this->query_vars['path__not_in'] ) ) { + $this->sql_clauses['where']['path__not_in'] = "path NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__not_in'] ) ) . "' )"; + } + + if ( is_numeric( $this->query_vars['archived'] ) ) { + $archived = absint( $this->query_vars['archived'] ); + $this->sql_clauses['where']['archived'] = $wpdb->prepare( 'archived = %s ', absint( $archived ) ); + } + + if ( is_numeric( $this->query_vars['mature'] ) ) { + $mature = absint( $this->query_vars['mature'] ); + $this->sql_clauses['where']['mature'] = $wpdb->prepare( 'mature = %d ', $mature ); + } + + if ( is_numeric( $this->query_vars['spam'] ) ) { + $spam = absint( $this->query_vars['spam'] ); + $this->sql_clauses['where']['spam'] = $wpdb->prepare( 'spam = %d ', $spam ); + } + + if ( is_numeric( $this->query_vars['deleted'] ) ) { + $deleted = absint( $this->query_vars['deleted'] ); + $this->sql_clauses['where']['deleted'] = $wpdb->prepare( 'deleted = %d ', $deleted ); + } + + if ( is_numeric( $this->query_vars['public'] ) ) { + $public = absint( $this->query_vars['public'] ); + $this->sql_clauses['where']['public'] = $wpdb->prepare( 'public = %d ', $public ); + } + + if ( is_numeric( $this->query_vars['lang_id'] ) ) { + $lang_id = absint( $this->query_vars['lang_id'] ); + $this->sql_clauses['where']['lang_id'] = $wpdb->prepare( 'lang_id = %d ', $lang_id ); + } + + // Parse site language IDs for an IN clause. + if ( ! empty( $this->query_vars['lang__in'] ) ) { + $this->sql_clauses['where']['lang__in'] = 'lang_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['lang__in'] ) ) . ' )'; + } + + // Parse site language IDs for a NOT IN clause. + if ( ! empty( $this->query_vars['lang__not_in'] ) ) { + $this->sql_clauses['where']['lang__not_in'] = 'lang_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['lang__not_in'] ) ) . ' )'; + } + + // Falsey search strings are ignored. + if ( strlen( $this->query_vars['search'] ) ) { + $search_columns = array(); + + if ( $this->query_vars['search_columns'] ) { + $search_columns = array_intersect( $this->query_vars['search_columns'], array( 'domain', 'path' ) ); + } + + if ( ! $search_columns ) { + $search_columns = array( 'domain', 'path' ); + } + + /** + * Filters the columns to search in a WP_Site_Query search. + * + * The default columns include 'domain' and 'path. + * + * @since 4.6.0 + * + * @param string[] $search_columns Array of column names to be searched. + * @param string $search Text being searched. + * @param WP_Site_Query $this The current WP_Site_Query instance. + */ + $search_columns = apply_filters( 'site_search_columns', $search_columns, $this->query_vars['search'], $this ); + + $this->sql_clauses['where']['search'] = $this->get_search_sql( $this->query_vars['search'], $search_columns ); + } + + $date_query = $this->query_vars['date_query']; + if ( ! empty( $date_query ) && is_array( $date_query ) ) { + $this->date_query = new WP_Date_Query( $date_query, 'registered' ); + $this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() ); + } + + $join = ''; + $groupby = ''; + + if ( ! empty( $this->meta_query_clauses ) ) { + $join .= $this->meta_query_clauses['join']; + + // Strip leading 'AND'. + $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] ); + + if ( ! $this->query_vars['count'] ) { + $groupby = "{$wpdb->blogs}.blog_id"; + } + } + + $where = implode( ' AND ', $this->sql_clauses['where'] ); + + $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); + + /** + * Filters the site query clauses. + * + * @since 4.6.0 + * + * @param string[] $pieces An associative array of site query clauses. + * @param WP_Site_Query $this Current instance of WP_Site_Query (passed by reference). + */ + $clauses = apply_filters_ref_array( 'sites_clauses', array( compact( $pieces ), &$this ) ); + + $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; + $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; + $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; + $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; + $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; + $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; + + if ( $where ) { + $where = 'WHERE ' . $where; + } + + if ( $groupby ) { + $groupby = 'GROUP BY ' . $groupby; + } + + if ( $orderby ) { + $orderby = "ORDER BY $orderby"; + } + + $found_rows = ''; + if ( ! $this->query_vars['no_found_rows'] ) { + $found_rows = 'SQL_CALC_FOUND_ROWS'; + } + + $this->sql_clauses['select'] = "SELECT $found_rows $fields"; + $this->sql_clauses['from'] = "FROM $wpdb->blogs $join"; + $this->sql_clauses['groupby'] = $groupby; + $this->sql_clauses['orderby'] = $orderby; + $this->sql_clauses['limits'] = $limits; + + $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; + + if ( $this->query_vars['count'] ) { + return intval( $wpdb->get_var( $this->request ) ); + } + + $site_ids = $wpdb->get_col( $this->request ); + + return array_map( 'intval', $site_ids ); + } + + /** + * Populates found_sites and max_num_pages properties for the current query + * if the limit clause was used. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ + private function set_found_sites() { + global $wpdb; + + if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { + /** + * Filters the query used to retrieve found site count. + * + * @since 4.6.0 + * + * @param string $found_sites_query SQL query. Default 'SELECT FOUND_ROWS()'. + * @param WP_Site_Query $site_query The `WP_Site_Query` instance. + */ + $found_sites_query = apply_filters( 'found_sites_query', 'SELECT FOUND_ROWS()', $this ); + + $this->found_sites = (int) $wpdb->get_var( $found_sites_query ); + } + } + + /** + * Used internally to generate an SQL string for searching across multiple columns. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $string Search string. + * @param string[] $columns Array of columns to search. + * @return string Search SQL. + */ + protected function get_search_sql( $string, $columns ) { + global $wpdb; + + if ( false !== strpos( $string, '*' ) ) { + $like = '%' . implode( '%', array_map( array( $wpdb, 'esc_like' ), explode( '*', $string ) ) ) . '%'; + } else { + $like = '%' . $wpdb->esc_like( $string ) . '%'; + } + + $searches = array(); + foreach ( $columns as $column ) { + $searches[] = $wpdb->prepare( "$column LIKE %s", $like ); + } + + return '(' . implode( ' OR ', $searches ) . ')'; + } + + /** + * Parses and sanitizes 'orderby' keys passed to the site query. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $orderby Alias for the field to order by. + * @return string|false Value to used in the ORDER clause. False otherwise. + */ + protected function parse_orderby( $orderby ) { + global $wpdb; + + $parsed = false; + + switch ( $orderby ) { + case 'site__in': + $site__in = implode( ',', array_map( 'absint', $this->query_vars['site__in'] ) ); + $parsed = "FIELD( {$wpdb->blogs}.blog_id, $site__in )"; + break; + case 'network__in': + $network__in = implode( ',', array_map( 'absint', $this->query_vars['network__in'] ) ); + $parsed = "FIELD( {$wpdb->blogs}.site_id, $network__in )"; + break; + case 'domain': + case 'last_updated': + case 'path': + case 'registered': + $parsed = $orderby; + break; + case 'network_id': + $parsed = 'site_id'; + break; + case 'domain_length': + $parsed = 'CHAR_LENGTH(domain)'; + break; + case 'path_length': + $parsed = 'CHAR_LENGTH(path)'; + break; + case 'id': + $parsed = "{$wpdb->blogs}.blog_id"; + break; + } + + if ( ! empty( $parsed ) || empty( $this->meta_query_clauses ) ) { + return $parsed; + } + + $meta_clauses = $this->meta_query->get_clauses(); + if ( empty( $meta_clauses ) ) { + return $parsed; + } + + $primary_meta_query = reset( $meta_clauses ); + if ( ! empty( $primary_meta_query['key'] ) && $primary_meta_query['key'] === $orderby ) { + $orderby = 'meta_value'; + } + + switch ( $orderby ) { + case 'meta_value': + if ( ! empty( $primary_meta_query['type'] ) ) { + $parsed = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; + } else { + $parsed = "{$primary_meta_query['alias']}.meta_value"; + } + break; + case 'meta_value_num': + $parsed = "{$primary_meta_query['alias']}.meta_value+0"; + break; + default: + if ( isset( $meta_clauses[ $orderby ] ) ) { + $meta_clause = $meta_clauses[ $orderby ]; + $parsed = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; + } + } + + return $parsed; + } + + /** + * Parses an 'order' query variable and cast it to 'ASC' or 'DESC' as necessary. + * + * @since 4.6.0 + * + * @param string $order The 'order' query variable. + * @return string The sanitized 'order' query variable. + */ + protected function parse_order( $order ) { + if ( ! is_string( $order ) || empty( $order ) ) { + return 'ASC'; + } + + if ( 'ASC' === strtoupper( $order ) ) { + return 'ASC'; + } else { + return 'DESC'; + } + } +} diff --git a/wp-includes/class-wp-site.php b/wp-includes/class-wp-site.php new file mode 100644 index 0000000..e1839fe --- /dev/null +++ b/wp-includes/class-wp-site.php @@ -0,0 +1,350 @@ +<?php +/** + * Site API: WP_Site class + * + * @package WordPress + * @subpackage Multisite + * @since 4.5.0 + */ + +/** + * Core class used for interacting with a multisite site. + * + * This class is used during load to populate the `$current_blog` global and + * setup the current site. + * + * @since 4.5.0 + * + * @property int $id + * @property int $network_id + * @property string $blogname + * @property string $siteurl + * @property int $post_count + * @property string $home + */ +final class WP_Site { + + /** + * Site ID. + * + * A numeric string, for compatibility reasons. + * + * @since 4.5.0 + * @var string + */ + public $blog_id; + + /** + * Domain of the site. + * + * @since 4.5.0 + * @var string + */ + public $domain = ''; + + /** + * Path of the site. + * + * @since 4.5.0 + * @var string + */ + public $path = ''; + + /** + * The ID of the site's parent network. + * + * Named "site" vs. "network" for legacy reasons. An individual site's "site" is + * its network. + * + * A numeric string, for compatibility reasons. + * + * @since 4.5.0 + * @var string + */ + public $site_id = '0'; + + /** + * The date on which the site was created or registered. + * + * @since 4.5.0 + * @var string Date in MySQL's datetime format. + */ + public $registered = '0000-00-00 00:00:00'; + + /** + * The date and time on which site settings were last updated. + * + * @since 4.5.0 + * @var string Date in MySQL's datetime format. + */ + public $last_updated = '0000-00-00 00:00:00'; + + /** + * Whether the site should be treated as public. + * + * A numeric string, for compatibility reasons. + * + * @since 4.5.0 + * @var string + */ + public $public = '1'; + + /** + * Whether the site should be treated as archived. + * + * A numeric string, for compatibility reasons. + * + * @since 4.5.0 + * @var string + */ + public $archived = '0'; + + /** + * Whether the site should be treated as mature. + * + * Handling for this does not exist throughout WordPress core, but custom + * implementations exist that require the property to be present. + * + * A numeric string, for compatibility reasons. + * + * @since 4.5.0 + * @var string + */ + public $mature = '0'; + + /** + * Whether the site should be treated as spam. + * + * A numeric string, for compatibility reasons. + * + * @since 4.5.0 + * @var string + */ + public $spam = '0'; + + /** + * Whether the site should be treated as deleted. + * + * A numeric string, for compatibility reasons. + * + * @since 4.5.0 + * @var string + */ + public $deleted = '0'; + + /** + * The language pack associated with this site. + * + * A numeric string, for compatibility reasons. + * + * @since 4.5.0 + * @var string + */ + public $lang_id = '0'; + + /** + * Retrieves a site from the database by its ID. + * + * @since 4.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $site_id The ID of the site to retrieve. + * @return WP_Site|false The site's object if found. False if not. + */ + public static function get_instance( $site_id ) { + global $wpdb; + + $site_id = (int) $site_id; + if ( ! $site_id ) { + return false; + } + + $_site = wp_cache_get( $site_id, 'sites' ); + + if ( false === $_site ) { + $_site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = %d LIMIT 1", $site_id ) ); + + if ( empty( $_site ) || is_wp_error( $_site ) ) { + $_site = -1; + } + + wp_cache_add( $site_id, $_site, 'sites' ); + } + + if ( is_numeric( $_site ) ) { + return false; + } + + return new WP_Site( $_site ); + } + + /** + * Creates a new WP_Site object. + * + * Will populate object properties from the object provided and assign other + * default properties based on that information. + * + * @since 4.5.0 + * + * @param WP_Site|object $site A site object. + */ + public function __construct( $site ) { + foreach ( get_object_vars( $site ) as $key => $value ) { + $this->$key = $value; + } + } + + /** + * Converts an object to array. + * + * @since 4.6.0 + * + * @return array Object as array. + */ + public function to_array() { + return get_object_vars( $this ); + } + + /** + * Getter. + * + * Allows current multisite naming conventions when getting properties. + * Allows access to extended site properties. + * + * @since 4.6.0 + * + * @param string $key Property to get. + * @return mixed Value of the property. Null if not available. + */ + public function __get( $key ) { + switch ( $key ) { + case 'id': + return (int) $this->blog_id; + case 'network_id': + return (int) $this->site_id; + case 'blogname': + case 'siteurl': + case 'post_count': + case 'home': + default: // Custom properties added by 'site_details' filter. + if ( ! did_action( 'ms_loaded' ) ) { + return null; + } + + $details = $this->get_details(); + if ( isset( $details->$key ) ) { + return $details->$key; + } + } + + return null; + } + + /** + * Isset-er. + * + * Allows current multisite naming conventions when checking for properties. + * Checks for extended site properties. + * + * @since 4.6.0 + * + * @param string $key Property to check if set. + * @return bool Whether the property is set. + */ + public function __isset( $key ) { + switch ( $key ) { + case 'id': + case 'network_id': + return true; + case 'blogname': + case 'siteurl': + case 'post_count': + case 'home': + if ( ! did_action( 'ms_loaded' ) ) { + return false; + } + return true; + default: // Custom properties added by 'site_details' filter. + if ( ! did_action( 'ms_loaded' ) ) { + return false; + } + + $details = $this->get_details(); + if ( isset( $details->$key ) ) { + return true; + } + } + + return false; + } + + /** + * Setter. + * + * Allows current multisite naming conventions while setting properties. + * + * @since 4.6.0 + * + * @param string $key Property to set. + * @param mixed $value Value to assign to the property. + */ + public function __set( $key, $value ) { + switch ( $key ) { + case 'id': + $this->blog_id = (string) $value; + break; + case 'network_id': + $this->site_id = (string) $value; + break; + default: + $this->$key = $value; + } + } + + /** + * Retrieves the details for this site. + * + * This method is used internally to lazy-load the extended properties of a site. + * + * @since 4.6.0 + * + * @see WP_Site::__get() + * + * @return stdClass A raw site object with all details included. + */ + private function get_details() { + $details = wp_cache_get( $this->blog_id, 'site-details' ); + + if ( false === $details ) { + + switch_to_blog( $this->blog_id ); + // Create a raw copy of the object for backward compatibility with the filter below. + $details = new stdClass(); + foreach ( get_object_vars( $this ) as $key => $value ) { + $details->$key = $value; + } + $details->blogname = get_option( 'blogname' ); + $details->siteurl = get_option( 'siteurl' ); + $details->post_count = get_option( 'post_count' ); + $details->home = get_option( 'home' ); + restore_current_blog(); + + wp_cache_set( $this->blog_id, $details, 'site-details' ); + } + + /** This filter is documented in wp-includes/ms-blogs.php */ + $details = apply_filters_deprecated( 'blog_details', array( $details ), '4.7.0', 'site_details' ); + + /** + * Filters a site's extended properties. + * + * @since 4.6.0 + * + * @param stdClass $details The site details. + */ + $details = apply_filters( 'site_details', $details ); + + return $details; + } +} diff --git a/wp-includes/class-wp-tax-query.php b/wp-includes/class-wp-tax-query.php new file mode 100644 index 0000000..1c2907b --- /dev/null +++ b/wp-includes/class-wp-tax-query.php @@ -0,0 +1,652 @@ +<?php +/** + * Taxonomy API: WP_Tax_Query class + * + * @package WordPress + * @subpackage Taxonomy + * @since 4.4.0 + */ + +/** + * Core class used to implement taxonomy queries for the Taxonomy API. + * + * Used for generating SQL clauses that filter a primary query according to object + * taxonomy terms. + * + * WP_Tax_Query is a helper that allows primary query classes, such as WP_Query, to filter + * their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be + * attached to the primary SQL query string. + * + * @since 3.1.0 + */ +class WP_Tax_Query { + + /** + * Array of taxonomy queries. + * + * See WP_Tax_Query::__construct() for information on tax query arguments. + * + * @since 3.1.0 + * @var array + */ + public $queries = array(); + + /** + * The relation between the queries. Can be one of 'AND' or 'OR'. + * + * @since 3.1.0 + * @var string + */ + public $relation; + + /** + * Standard response when the query should not return any rows. + * + * @since 3.2.0 + * @var string + */ + private static $no_results = array( + 'join' => array( '' ), + 'where' => array( '0 = 1' ), + ); + + /** + * A flat list of table aliases used in the JOIN clauses. + * + * @since 4.1.0 + * @var array + */ + protected $table_aliases = array(); + + /** + * Terms and taxonomies fetched by this query. + * + * We store this data in a flat array because they are referenced in a + * number of places by WP_Query. + * + * @since 4.1.0 + * @var array + */ + public $queried_terms = array(); + + /** + * Database table that where the metadata's objects are stored (eg $wpdb->users). + * + * @since 4.1.0 + * @var string + */ + public $primary_table; + + /** + * Column in 'primary_table' that represents the ID of the object. + * + * @since 4.1.0 + * @var string + */ + public $primary_id_column; + + /** + * Constructor. + * + * @since 3.1.0 + * @since 4.1.0 Added support for `$operator` 'NOT EXISTS' and 'EXISTS' values. + * + * @param array $tax_query { + * Array of taxonomy query clauses. + * + * @type string $relation Optional. The MySQL keyword used to join + * the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'. + * @type array { + * Optional. An array of first-order clause parameters, or another fully-formed tax query. + * + * @type string $taxonomy Taxonomy being queried. Optional when field=term_taxonomy_id. + * @type string|int|array $terms Term or terms to filter by. + * @type string $field Field to match $terms against. Accepts 'term_id', 'slug', + * 'name', or 'term_taxonomy_id'. Default: 'term_id'. + * @type string $operator MySQL operator to be used with $terms in the WHERE clause. + * Accepts 'AND', 'IN', 'NOT IN', 'EXISTS', 'NOT EXISTS'. + * Default: 'IN'. + * @type bool $include_children Optional. Whether to include child terms. + * Requires a $taxonomy. Default: true. + * } + * } + */ + public function __construct( $tax_query ) { + if ( isset( $tax_query['relation'] ) ) { + $this->relation = $this->sanitize_relation( $tax_query['relation'] ); + } else { + $this->relation = 'AND'; + } + + $this->queries = $this->sanitize_query( $tax_query ); + } + + /** + * Ensure the 'tax_query' argument passed to the class constructor is well-formed. + * + * Ensures that each query-level clause has a 'relation' key, and that + * each first-order clause contains all the necessary keys from `$defaults`. + * + * @since 4.1.0 + * + * @param array $queries Array of queries clauses. + * @return array Sanitized array of query clauses. + */ + public function sanitize_query( $queries ) { + $cleaned_query = array(); + + $defaults = array( + 'taxonomy' => '', + 'terms' => array(), + 'field' => 'term_id', + 'operator' => 'IN', + 'include_children' => true, + ); + + foreach ( $queries as $key => $query ) { + if ( 'relation' === $key ) { + $cleaned_query['relation'] = $this->sanitize_relation( $query ); + + // First-order clause. + } elseif ( self::is_first_order_clause( $query ) ) { + + $cleaned_clause = array_merge( $defaults, $query ); + $cleaned_clause['terms'] = (array) $cleaned_clause['terms']; + $cleaned_query[] = $cleaned_clause; + + /* + * Keep a copy of the clause in the flate + * $queried_terms array, for use in WP_Query. + */ + if ( ! empty( $cleaned_clause['taxonomy'] ) && 'NOT IN' !== $cleaned_clause['operator'] ) { + $taxonomy = $cleaned_clause['taxonomy']; + if ( ! isset( $this->queried_terms[ $taxonomy ] ) ) { + $this->queried_terms[ $taxonomy ] = array(); + } + + /* + * Backward compatibility: Only store the first + * 'terms' and 'field' found for a given taxonomy. + */ + if ( ! empty( $cleaned_clause['terms'] ) && ! isset( $this->queried_terms[ $taxonomy ]['terms'] ) ) { + $this->queried_terms[ $taxonomy ]['terms'] = $cleaned_clause['terms']; + } + + if ( ! empty( $cleaned_clause['field'] ) && ! isset( $this->queried_terms[ $taxonomy ]['field'] ) ) { + $this->queried_terms[ $taxonomy ]['field'] = $cleaned_clause['field']; + } + } + + // Otherwise, it's a nested query, so we recurse. + } elseif ( is_array( $query ) ) { + $cleaned_subquery = $this->sanitize_query( $query ); + + if ( ! empty( $cleaned_subquery ) ) { + // All queries with children must have a relation. + if ( ! isset( $cleaned_subquery['relation'] ) ) { + $cleaned_subquery['relation'] = 'AND'; + } + + $cleaned_query[] = $cleaned_subquery; + } + } + } + + return $cleaned_query; + } + + /** + * Sanitize a 'relation' operator. + * + * @since 4.1.0 + * + * @param string $relation Raw relation key from the query argument. + * @return string Sanitized relation ('AND' or 'OR'). + */ + public function sanitize_relation( $relation ) { + if ( 'OR' === strtoupper( $relation ) ) { + return 'OR'; + } else { + return 'AND'; + } + } + + /** + * Determine whether a clause is first-order. + * + * A "first-order" clause is one that contains any of the first-order + * clause keys ('terms', 'taxonomy', 'include_children', 'field', + * 'operator'). An empty clause also counts as a first-order clause, + * for backward compatibility. Any clause that doesn't meet this is + * determined, by process of elimination, to be a higher-order query. + * + * @since 4.1.0 + * + * @param array $query Tax query arguments. + * @return bool Whether the query clause is a first-order clause. + */ + protected static function is_first_order_clause( $query ) { + return is_array( $query ) && ( empty( $query ) || array_key_exists( 'terms', $query ) || array_key_exists( 'taxonomy', $query ) || array_key_exists( 'include_children', $query ) || array_key_exists( 'field', $query ) || array_key_exists( 'operator', $query ) ); + } + + /** + * Generates SQL clauses to be appended to a main query. + * + * @since 3.1.0 + * + * @param string $primary_table Database table where the object being filtered is stored (eg wp_users). + * @param string $primary_id_column ID column for the filtered object in $primary_table. + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to the main query. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + public function get_sql( $primary_table, $primary_id_column ) { + $this->primary_table = $primary_table; + $this->primary_id_column = $primary_id_column; + + return $this->get_sql_clauses(); + } + + /** + * Generate SQL clauses to be appended to a main query. + * + * Called by the public WP_Tax_Query::get_sql(), this method + * is abstracted out to maintain parity with the other Query classes. + * + * @since 4.1.0 + * + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to the main query. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + protected function get_sql_clauses() { + /* + * $queries are passed by reference to get_sql_for_query() for recursion. + * To keep $this->queries unaltered, pass a copy. + */ + $queries = $this->queries; + $sql = $this->get_sql_for_query( $queries ); + + if ( ! empty( $sql['where'] ) ) { + $sql['where'] = ' AND ' . $sql['where']; + } + + return $sql; + } + + /** + * Generate SQL clauses for a single query array. + * + * If nested subqueries are found, this method recurses the tree to + * produce the properly nested SQL. + * + * @since 4.1.0 + * + * @param array $query Query to parse (passed by reference). + * @param int $depth Optional. Number of tree levels deep we currently are. + * Used to calculate indentation. Default 0. + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to a single query array. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + protected function get_sql_for_query( &$query, $depth = 0 ) { + $sql_chunks = array( + 'join' => array(), + 'where' => array(), + ); + + $sql = array( + 'join' => '', + 'where' => '', + ); + + $indent = ''; + for ( $i = 0; $i < $depth; $i++ ) { + $indent .= ' '; + } + + foreach ( $query as $key => &$clause ) { + if ( 'relation' === $key ) { + $relation = $query['relation']; + } elseif ( is_array( $clause ) ) { + + // This is a first-order clause. + if ( $this->is_first_order_clause( $clause ) ) { + $clause_sql = $this->get_sql_for_clause( $clause, $query ); + + $where_count = count( $clause_sql['where'] ); + if ( ! $where_count ) { + $sql_chunks['where'][] = ''; + } elseif ( 1 === $where_count ) { + $sql_chunks['where'][] = $clause_sql['where'][0]; + } else { + $sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )'; + } + + $sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] ); + // This is a subquery, so we recurse. + } else { + $clause_sql = $this->get_sql_for_query( $clause, $depth + 1 ); + + $sql_chunks['where'][] = $clause_sql['where']; + $sql_chunks['join'][] = $clause_sql['join']; + } + } + } + + // Filter to remove empties. + $sql_chunks['join'] = array_filter( $sql_chunks['join'] ); + $sql_chunks['where'] = array_filter( $sql_chunks['where'] ); + + if ( empty( $relation ) ) { + $relation = 'AND'; + } + + // Filter duplicate JOIN clauses and combine into a single string. + if ( ! empty( $sql_chunks['join'] ) ) { + $sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) ); + } + + // Generate a single WHERE clause with proper brackets and indentation. + if ( ! empty( $sql_chunks['where'] ) ) { + $sql['where'] = '( ' . "\n " . $indent . implode( ' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')'; + } + + return $sql; + } + + /** + * Generate SQL JOIN and WHERE clauses for a "first-order" query clause. + * + * @since 4.1.0 + * + * @global wpdb $wpdb The WordPress database abstraction object. + * + * @param array $clause Query clause (passed by reference). + * @param array $parent_query Parent query array. + * @return array { + * Array containing JOIN and WHERE SQL clauses to append to a first-order query. + * + * @type string $join SQL fragment to append to the main JOIN clause. + * @type string $where SQL fragment to append to the main WHERE clause. + * } + */ + public function get_sql_for_clause( &$clause, $parent_query ) { + global $wpdb; + + $sql = array( + 'where' => array(), + 'join' => array(), + ); + + $join = ''; + $where = ''; + + $this->clean_query( $clause ); + + if ( is_wp_error( $clause ) ) { + return self::$no_results; + } + + $terms = $clause['terms']; + $operator = strtoupper( $clause['operator'] ); + + if ( 'IN' == $operator ) { + + if ( empty( $terms ) ) { + return self::$no_results; + } + + $terms = implode( ',', $terms ); + + /* + * Before creating another table join, see if this clause has a + * sibling with an existing join that can be shared. + */ + $alias = $this->find_compatible_table_alias( $clause, $parent_query ); + if ( false === $alias ) { + $i = count( $this->table_aliases ); + $alias = $i ? 'tt' . $i : $wpdb->term_relationships; + + // Store the alias as part of a flat array to build future iterators. + $this->table_aliases[] = $alias; + + // Store the alias with this clause, so later siblings can use it. + $clause['alias'] = $alias; + + $join .= " LEFT JOIN $wpdb->term_relationships"; + $join .= $i ? " AS $alias" : ''; + $join .= " ON ($this->primary_table.$this->primary_id_column = $alias.object_id)"; + } + + $where = "$alias.term_taxonomy_id $operator ($terms)"; + + } elseif ( 'NOT IN' == $operator ) { + + if ( empty( $terms ) ) { + return $sql; + } + + $terms = implode( ',', $terms ); + + $where = "$this->primary_table.$this->primary_id_column NOT IN ( + SELECT object_id + FROM $wpdb->term_relationships + WHERE term_taxonomy_id IN ($terms) + )"; + + } elseif ( 'AND' == $operator ) { + + if ( empty( $terms ) ) { + return $sql; + } + + $num_terms = count( $terms ); + + $terms = implode( ',', $terms ); + + $where = "( + SELECT COUNT(1) + FROM $wpdb->term_relationships + WHERE term_taxonomy_id IN ($terms) + AND object_id = $this->primary_table.$this->primary_id_column + ) = $num_terms"; + + } elseif ( 'NOT EXISTS' === $operator || 'EXISTS' === $operator ) { + + $where = $wpdb->prepare( + "$operator ( + SELECT 1 + FROM $wpdb->term_relationships + INNER JOIN $wpdb->term_taxonomy + ON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id + WHERE $wpdb->term_taxonomy.taxonomy = %s + AND $wpdb->term_relationships.object_id = $this->primary_table.$this->primary_id_column + )", + $clause['taxonomy'] + ); + + } + + $sql['join'][] = $join; + $sql['where'][] = $where; + return $sql; + } + + /** + * Identify an existing table alias that is compatible with the current query clause. + * + * We avoid unnecessary table joins by allowing each clause to look for + * an existing table alias that is compatible with the query that it + * needs to perform. + * + * An existing alias is compatible if (a) it is a sibling of `$clause` + * (ie, it's under the scope of the same relation), and (b) the combination + * of operator and relation between the clauses allows for a shared table + * join. In the case of WP_Tax_Query, this only applies to 'IN' + * clauses that are connected by the relation 'OR'. + * + * @since 4.1.0 + * + * @param array $clause Query clause. + * @param array $parent_query Parent query of $clause. + * @return string|false Table alias if found, otherwise false. + */ + protected function find_compatible_table_alias( $clause, $parent_query ) { + $alias = false; + + // Sanity check. Only IN queries use the JOIN syntax. + if ( ! isset( $clause['operator'] ) || 'IN' !== $clause['operator'] ) { + return $alias; + } + + // Since we're only checking IN queries, we're only concerned with OR relations. + if ( ! isset( $parent_query['relation'] ) || 'OR' !== $parent_query['relation'] ) { + return $alias; + } + + $compatible_operators = array( 'IN' ); + + foreach ( $parent_query as $sibling ) { + if ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) { + continue; + } + + if ( empty( $sibling['alias'] ) || empty( $sibling['operator'] ) ) { + continue; + } + + // The sibling must both have compatible operator to share its alias. + if ( in_array( strtoupper( $sibling['operator'] ), $compatible_operators ) ) { + $alias = $sibling['alias']; + break; + } + } + + return $alias; + } + + /** + * Validates a single query. + * + * @since 3.2.0 + * + * @param array $query The single query. Passed by reference. + */ + private function clean_query( &$query ) { + if ( empty( $query['taxonomy'] ) ) { + if ( 'term_taxonomy_id' !== $query['field'] ) { + $query = new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); + return; + } + + // So long as there are shared terms, 'include_children' requires that a taxonomy is set. + $query['include_children'] = false; + } elseif ( ! taxonomy_exists( $query['taxonomy'] ) ) { + $query = new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); + return; + } + + $query['terms'] = array_unique( (array) $query['terms'] ); + + if ( is_taxonomy_hierarchical( $query['taxonomy'] ) && $query['include_children'] ) { + $this->transform_query( $query, 'term_id' ); + + if ( is_wp_error( $query ) ) { + return; + } + + $children = array(); + foreach ( $query['terms'] as $term ) { + $children = array_merge( $children, get_term_children( $term, $query['taxonomy'] ) ); + $children[] = $term; + } + $query['terms'] = $children; + } + + $this->transform_query( $query, 'term_taxonomy_id' ); + } + + /** + * Transforms a single query, from one field to another. + * + * Operates on the `$query` object by reference. In the case of error, + * `$query` is converted to a WP_Error object. + * + * @since 3.2.0 + * + * @global wpdb $wpdb The WordPress database abstraction object. + * + * @param array $query The single query. Passed by reference. + * @param string $resulting_field The resulting field. Accepts 'slug', 'name', 'term_taxonomy_id', + * or 'term_id'. Default 'term_id'. + */ + public function transform_query( &$query, $resulting_field ) { + if ( empty( $query['terms'] ) ) { + return; + } + + if ( $query['field'] == $resulting_field ) { + return; + } + + $resulting_field = sanitize_key( $resulting_field ); + + // Empty 'terms' always results in a null transformation. + $terms = array_filter( $query['terms'] ); + if ( empty( $terms ) ) { + $query['terms'] = array(); + $query['field'] = $resulting_field; + return; + } + + $args = array( + 'get' => 'all', + 'number' => 0, + 'taxonomy' => $query['taxonomy'], + 'update_term_meta_cache' => false, + 'orderby' => 'none', + ); + + // Term query parameter name depends on the 'field' being searched on. + switch ( $query['field'] ) { + case 'slug': + $args['slug'] = $terms; + break; + case 'name': + $args['name'] = $terms; + break; + case 'term_taxonomy_id': + $args['term_taxonomy_id'] = $terms; + break; + default: + $args['include'] = wp_parse_id_list( $terms ); + break; + } + + $term_query = new WP_Term_Query(); + $term_list = $term_query->query( $args ); + + if ( is_wp_error( $term_list ) ) { + $query = $term_list; + return; + } + + if ( 'AND' == $query['operator'] && count( $term_list ) < count( $query['terms'] ) ) { + $query = new WP_Error( 'inexistent_terms', __( 'Inexistent terms.' ) ); + return; + } + + $query['terms'] = wp_list_pluck( $term_list, $resulting_field ); + $query['field'] = $resulting_field; + } +} diff --git a/wp-includes/class-wp-taxonomy.php b/wp-includes/class-wp-taxonomy.php new file mode 100644 index 0000000..7cb35e9 --- /dev/null +++ b/wp-includes/class-wp-taxonomy.php @@ -0,0 +1,455 @@ +<?php +/** + * Taxonomy API: WP_Taxonomy class + * + * @package WordPress + * @subpackage Taxonomy + * @since 4.7.0 + */ + +/** + * Core class used for interacting with taxonomies. + * + * @since 4.7.0 + */ +final class WP_Taxonomy { + /** + * Taxonomy key. + * + * @since 4.7.0 + * @var string + */ + public $name; + + /** + * Name of the taxonomy shown in the menu. Usually plural. + * + * @since 4.7.0 + * @var string + */ + public $label; + + /** + * Labels object for this taxonomy. + * + * If not set, tag labels are inherited for non-hierarchical types + * and category labels for hierarchical ones. + * + * @see get_taxonomy_labels() + * + * @since 4.7.0 + * @var object + */ + public $labels; + + /** + * A short descriptive summary of what the taxonomy is for. + * + * @since 4.7.0 + * @var string + */ + public $description = ''; + + /** + * Whether a taxonomy is intended for use publicly either via the admin interface or by front-end users. + * + * @since 4.7.0 + * @var bool + */ + public $public = true; + + /** + * Whether the taxonomy is publicly queryable. + * + * @since 4.7.0 + * @var bool + */ + public $publicly_queryable = true; + + /** + * Whether the taxonomy is hierarchical. + * + * @since 4.7.0 + * @var bool + */ + public $hierarchical = false; + + /** + * Whether to generate and allow a UI for managing terms in this taxonomy in the admin. + * + * @since 4.7.0 + * @var bool + */ + public $show_ui = true; + + /** + * Whether to show the taxonomy in the admin menu. + * + * If true, the taxonomy is shown as a submenu of the object type menu. If false, no menu is shown. + * + * @since 4.7.0 + * @var bool + */ + public $show_in_menu = true; + + /** + * Whether the taxonomy is available for selection in navigation menus. + * + * @since 4.7.0 + * @var bool + */ + public $show_in_nav_menus = true; + + /** + * Whether to list the taxonomy in the tag cloud widget controls. + * + * @since 4.7.0 + * @var bool + */ + public $show_tagcloud = true; + + /** + * Whether to show the taxonomy in the quick/bulk edit panel. + * + * @since 4.7.0 + * @var bool + */ + public $show_in_quick_edit = true; + + /** + * Whether to display a column for the taxonomy on its post type listing screens. + * + * @since 4.7.0 + * @var bool + */ + public $show_admin_column = false; + + /** + * The callback function for the meta box display. + * + * @since 4.7.0 + * @var bool|callable + */ + public $meta_box_cb = null; + + /** + * The callback function for sanitizing taxonomy data saved from a meta box. + * + * @since 5.1.0 + * @var callable + */ + public $meta_box_sanitize_cb = null; + + /** + * An array of object types this taxonomy is registered for. + * + * @since 4.7.0 + * @var array + */ + public $object_type = null; + + /** + * Capabilities for this taxonomy. + * + * @since 4.7.0 + * @var object + */ + public $cap; + + /** + * Rewrites information for this taxonomy. + * + * @since 4.7.0 + * @var array|false + */ + public $rewrite; + + /** + * Query var string for this taxonomy. + * + * @since 4.7.0 + * @var string|false + */ + public $query_var; + + /** + * Function that will be called when the count is updated. + * + * @since 4.7.0 + * @var callable + */ + public $update_count_callback; + + /** + * Whether this taxonomy should appear in the REST API. + * + * Default false. If true, standard endpoints will be registered with + * respect to $rest_base and $rest_controller_class. + * + * @since 4.7.4 + * @var bool $show_in_rest + */ + public $show_in_rest; + + /** + * The base path for this taxonomy's REST API endpoints. + * + * @since 4.7.4 + * @var string|bool $rest_base + */ + public $rest_base; + + /** + * The controller for this taxonomy's REST API endpoints. + * + * Custom controllers must extend WP_REST_Controller. + * + * @since 4.7.4 + * @var string|bool $rest_controller_class + */ + public $rest_controller_class; + + /** + * Whether it is a built-in taxonomy. + * + * @since 4.7.0 + * @var bool + */ + public $_builtin; + + /** + * Constructor. + * + * @since 4.7.0 + * + * @global WP $wp Current WordPress environment instance. + * + * @param string $taxonomy Taxonomy key, must not exceed 32 characters. + * @param array|string $object_type Name of the object type for the taxonomy object. + * @param array|string $args Optional. Array or query string of arguments for registering a taxonomy. + * Default empty array. + */ + public function __construct( $taxonomy, $object_type, $args = array() ) { + $this->name = $taxonomy; + + $this->set_props( $object_type, $args ); + } + + /** + * Sets taxonomy properties. + * + * @since 4.7.0 + * + * @param array|string $object_type Name of the object type for the taxonomy object. + * @param array|string $args Array or query string of arguments for registering a taxonomy. + */ + public function set_props( $object_type, $args ) { + $args = wp_parse_args( $args ); + + /** + * Filters the arguments for registering a taxonomy. + * + * @since 4.4.0 + * + * @param array $args Array of arguments for registering a taxonomy. + * @param string $taxonomy Taxonomy key. + * @param string[] $object_type Array of names of object types for the taxonomy. + */ + $args = apply_filters( 'register_taxonomy_args', $args, $this->name, (array) $object_type ); + + $defaults = array( + 'labels' => array(), + 'description' => '', + 'public' => true, + 'publicly_queryable' => null, + 'hierarchical' => false, + 'show_ui' => null, + 'show_in_menu' => null, + 'show_in_nav_menus' => null, + 'show_tagcloud' => null, + 'show_in_quick_edit' => null, + 'show_admin_column' => false, + 'meta_box_cb' => null, + 'meta_box_sanitize_cb' => null, + 'capabilities' => array(), + 'rewrite' => true, + 'query_var' => $this->name, + 'update_count_callback' => '', + 'show_in_rest' => false, + 'rest_base' => false, + 'rest_controller_class' => false, + '_builtin' => false, + ); + + $args = array_merge( $defaults, $args ); + + // If not set, default to the setting for 'public'. + if ( null === $args['publicly_queryable'] ) { + $args['publicly_queryable'] = $args['public']; + } + + if ( false !== $args['query_var'] && ( is_admin() || false !== $args['publicly_queryable'] ) ) { + if ( true === $args['query_var'] ) { + $args['query_var'] = $this->name; + } else { + $args['query_var'] = sanitize_title_with_dashes( $args['query_var'] ); + } + } else { + // Force 'query_var' to false for non-public taxonomies. + $args['query_var'] = false; + } + + if ( false !== $args['rewrite'] && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { + $args['rewrite'] = wp_parse_args( + $args['rewrite'], + array( + 'with_front' => true, + 'hierarchical' => false, + 'ep_mask' => EP_NONE, + ) + ); + + if ( empty( $args['rewrite']['slug'] ) ) { + $args['rewrite']['slug'] = sanitize_title_with_dashes( $this->name ); + } + } + + // If not set, default to the setting for 'public'. + if ( null === $args['show_ui'] ) { + $args['show_ui'] = $args['public']; + } + + // If not set, default to the setting for 'show_ui'. + if ( null === $args['show_in_menu'] || ! $args['show_ui'] ) { + $args['show_in_menu'] = $args['show_ui']; + } + + // If not set, default to the setting for 'public'. + if ( null === $args['show_in_nav_menus'] ) { + $args['show_in_nav_menus'] = $args['public']; + } + + // If not set, default to the setting for 'show_ui'. + if ( null === $args['show_tagcloud'] ) { + $args['show_tagcloud'] = $args['show_ui']; + } + + // If not set, default to the setting for 'show_ui'. + if ( null === $args['show_in_quick_edit'] ) { + $args['show_in_quick_edit'] = $args['show_ui']; + } + + $default_caps = array( + 'manage_terms' => 'manage_categories', + 'edit_terms' => 'manage_categories', + 'delete_terms' => 'manage_categories', + 'assign_terms' => 'edit_posts', + ); + + $args['cap'] = (object) array_merge( $default_caps, $args['capabilities'] ); + unset( $args['capabilities'] ); + + $args['object_type'] = array_unique( (array) $object_type ); + + // If not set, use the default meta box. + if ( null === $args['meta_box_cb'] ) { + if ( $args['hierarchical'] ) { + $args['meta_box_cb'] = 'post_categories_meta_box'; + } else { + $args['meta_box_cb'] = 'post_tags_meta_box'; + } + } + + $args['name'] = $this->name; + + // Default meta box sanitization callback depends on the value of 'meta_box_cb'. + if ( null === $args['meta_box_sanitize_cb'] ) { + switch ( $args['meta_box_cb'] ) { + case 'post_categories_meta_box': + $args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_checkboxes'; + break; + + case 'post_tags_meta_box': + default: + $args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_input'; + break; + } + } + + foreach ( $args as $property_name => $property_value ) { + $this->$property_name = $property_value; + } + + $this->labels = get_taxonomy_labels( $this ); + $this->label = $this->labels->name; + } + + /** + * Adds the necessary rewrite rules for the taxonomy. + * + * @since 4.7.0 + * + * @global WP $wp Current WordPress environment instance. + */ + public function add_rewrite_rules() { + /* @var WP $wp */ + global $wp; + + // Non-publicly queryable taxonomies should not register query vars, except in the admin. + if ( false !== $this->query_var && $wp ) { + $wp->add_query_var( $this->query_var ); + } + + if ( false !== $this->rewrite && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { + if ( $this->hierarchical && $this->rewrite['hierarchical'] ) { + $tag = '(.+?)'; + } else { + $tag = '([^/]+)'; + } + + add_rewrite_tag( "%$this->name%", $tag, $this->query_var ? "{$this->query_var}=" : "taxonomy=$this->name&term=" ); + add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $this->rewrite ); + } + } + + /** + * Removes any rewrite rules, permastructs, and rules for the taxonomy. + * + * @since 4.7.0 + * + * @global WP $wp Current WordPress environment instance. + */ + public function remove_rewrite_rules() { + /* @var WP $wp */ + global $wp; + + // Remove query var. + if ( false !== $this->query_var ) { + $wp->remove_query_var( $this->query_var ); + } + + // Remove rewrite tags and permastructs. + if ( false !== $this->rewrite ) { + remove_rewrite_tag( "%$this->name%" ); + remove_permastruct( $this->name ); + } + } + + /** + * Registers the ajax callback for the meta box. + * + * @since 4.7.0 + */ + public function add_hooks() { + add_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' ); + } + + /** + * Removes the ajax callback for the meta box. + * + * @since 4.7.0 + */ + public function remove_hooks() { + remove_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' ); + } +} diff --git a/wp-includes/class-wp-term-query.php b/wp-includes/class-wp-term-query.php new file mode 100644 index 0000000..1ef802e --- /dev/null +++ b/wp-includes/class-wp-term-query.php @@ -0,0 +1,1027 @@ +<?php + +/** + * Taxonomy API: WP_Term_Query class. + * + * @package WordPress + * @subpackage Taxonomy + * @since 4.6.0 + */ + +/** + * Class used for querying terms. + * + * @since 4.6.0 + * + * @see WP_Term_Query::__construct() for accepted arguments. + */ +class WP_Term_Query { + + /** + * SQL string used to perform database query. + * + * @since 4.6.0 + * @var string + */ + public $request; + + /** + * Metadata query container. + * + * @since 4.6.0 + * @var object WP_Meta_Query + */ + public $meta_query = false; + + /** + * Metadata query clauses. + * + * @since 4.6.0 + * @var array + */ + protected $meta_query_clauses; + + /** + * SQL query clauses. + * + * @since 4.6.0 + * @var array + */ + protected $sql_clauses = array( + 'select' => '', + 'from' => '', + 'where' => array(), + 'orderby' => '', + 'limits' => '', + ); + + /** + * Query vars set by the user. + * + * @since 4.6.0 + * @var array + */ + public $query_vars; + + /** + * Default values for query vars. + * + * @since 4.6.0 + * @var array + */ + public $query_var_defaults; + + /** + * List of terms located by the query. + * + * @since 4.6.0 + * @var array + */ + public $terms; + + /** + * Constructor. + * + * Sets up the term query, based on the query vars passed. + * + * @since 4.6.0 + * @since 4.6.0 Introduced 'term_taxonomy_id' parameter. + * @since 4.7.0 Introduced 'object_ids' parameter. + * @since 4.9.0 Added 'slug__in' support for 'orderby'. + * + * @param string|array $query { + * Optional. Array or query string of term query parameters. Default empty. + * + * @type string|array $taxonomy Taxonomy name, or array of taxonomies, to which results should + * be limited. + * @type int|array $object_ids Optional. Object ID, or array of object IDs. Results will be + * limited to terms associated with these objects. + * @type string $orderby Field(s) to order terms by. Accepts term fields ('name', + * 'slug', 'term_group', 'term_id', 'id', 'description', 'parent'), + * 'count' for term taxonomy count, 'include' to match the + * 'order' of the $include param, 'slug__in' to match the + * 'order' of the $slug param, 'meta_value', 'meta_value_num', + * the value of `$meta_key`, the array keys of `$meta_query`, or + * 'none' to omit the ORDER BY clause. Defaults to 'name'. + * @type string $order Whether to order terms in ascending or descending order. + * Accepts 'ASC' (ascending) or 'DESC' (descending). + * Default 'ASC'. + * @type bool|int $hide_empty Whether to hide terms not assigned to any posts. Accepts + * 1|true or 0|false. Default 1|true. + * @type array|string $include Array or comma/space-separated string of term ids to include. + * Default empty array. + * @type array|string $exclude Array or comma/space-separated string of term ids to exclude. + * If $include is non-empty, $exclude is ignored. + * Default empty array. + * @type array|string $exclude_tree Array or comma/space-separated string of term ids to exclude + * along with all of their descendant terms. If $include is + * non-empty, $exclude_tree is ignored. Default empty array. + * @type int|string $number Maximum number of terms to return. Accepts ''|0 (all) or any + * positive number. Default ''|0 (all). Note that $number may + * not return accurate results when coupled with $object_ids. + * See #41796 for details. + * @type int $offset The number by which to offset the terms query. Default empty. + * @type string $fields Term fields to query for. Accepts: + * - 'all' Returns an array of complete term objects (`WP_Term[]`). + * - 'all_with_object_id' Returns an array of term objects with the 'object_id' + * param (`WP_Term[]`). Works only when the `$object_ids` parameter is populated. + * - 'ids' Returns an array of term IDs (`int[]`). + * - 'tt_ids' Returns an array of term taxonomy IDs (`int[]`). + * - 'names' Returns an array of term names (`string[]`). + * - 'slugs' Returns an array of term slugs (`string[]`). + * - 'count' Returns the number of matching terms (`int`). + * - 'id=>parent' Returns an associative array of parent term IDs, keyed by term ID (`int[]`). + * - 'id=>name' Returns an associative array of term names, keyed by term ID (`string[]`). + * - 'id=>slug' Returns an associative array of term slugs, keyed by term ID (`string[]`). + * Default 'all'. + * @type bool $count Whether to return a term count. Will take precedence over `$fields` if true. + * Default false. + * @type string|array $name Optional. Name or array of names to return term(s) for. + * Default empty. + * @type string|array $slug Optional. Slug or array of slugs to return term(s) for. + * Default empty. + * @type int|array $term_taxonomy_id Optional. Term taxonomy ID, or array of term taxonomy IDs, + * to match when querying terms. + * @type bool $hierarchical Whether to include terms that have non-empty descendants (even + * if $hide_empty is set to true). Default true. + * @type string $search Search criteria to match terms. Will be SQL-formatted with + * wildcards before and after. Default empty. + * @type string $name__like Retrieve terms with criteria by which a term is LIKE + * `$name__like`. Default empty. + * @type string $description__like Retrieve terms where the description is LIKE + * `$description__like`. Default empty. + * @type bool $pad_counts Whether to pad the quantity of a term's children in the + * quantity of each term's "count" object variable. + * Default false. + * @type string $get Whether to return terms regardless of ancestry or whether the + * terms are empty. Accepts 'all' or empty (disabled). + * Default empty. + * @type int $child_of Term ID to retrieve child terms of. If multiple taxonomies + * are passed, $child_of is ignored. Default 0. + * @type int|string $parent Parent term ID to retrieve direct-child terms of. + * Default empty. + * @type bool $childless True to limit results to terms that have no children. + * This parameter has no effect on non-hierarchical taxonomies. + * Default false. + * @type string $cache_domain Unique cache key to be produced when this query is stored in + * an object cache. Default is 'core'. + * @type bool $update_term_meta_cache Whether to prime meta caches for matched terms. Default true. + * @type array $meta_query Optional. Meta query clauses to limit retrieved terms by. + * See `WP_Meta_Query`. Default empty. + * @type string $meta_key Limit terms to those matching a specific metadata key. + * Can be used in conjunction with `$meta_value`. Default empty. + * @type string $meta_value Limit terms to those matching a specific metadata value. + * Usually used in conjunction with `$meta_key`. Default empty. + * @type string $meta_type MySQL data type that the `$meta_value` will be CAST to for + * comparisons. Default empty. + * @type string $meta_compare Comparison operator to test the 'meta_value'. Default empty. + * } + */ + public function __construct( $query = '' ) { + $this->query_var_defaults = array( + 'taxonomy' => null, + 'object_ids' => null, + 'orderby' => 'name', + 'order' => 'ASC', + 'hide_empty' => true, + 'include' => array(), + 'exclude' => array(), + 'exclude_tree' => array(), + 'number' => '', + 'offset' => '', + 'fields' => 'all', + 'count' => false, + 'name' => '', + 'slug' => '', + 'term_taxonomy_id' => '', + 'hierarchical' => true, + 'search' => '', + 'name__like' => '', + 'description__like' => '', + 'pad_counts' => false, + 'get' => '', + 'child_of' => 0, + 'parent' => '', + 'childless' => false, + 'cache_domain' => 'core', + 'update_term_meta_cache' => true, + 'meta_query' => '', + 'meta_key' => '', + 'meta_value' => '', + 'meta_type' => '', + 'meta_compare' => '', + ); + + if ( ! empty( $query ) ) { + $this->query( $query ); + } + } + + /** + * Parse arguments passed to the term query with default query parameters. + * + * @since 4.6.0 + * + * @param string|array $query WP_Term_Query arguments. See WP_Term_Query::__construct() + */ + public function parse_query( $query = '' ) { + if ( empty( $query ) ) { + $query = $this->query_vars; + } + + $taxonomies = isset( $query['taxonomy'] ) ? (array) $query['taxonomy'] : null; + + /** + * Filters the terms query default arguments. + * + * Use {@see 'get_terms_args'} to filter the passed arguments. + * + * @since 4.4.0 + * + * @param array $defaults An array of default get_terms() arguments. + * @param string[] $taxonomies An array of taxonomy names. + */ + $this->query_var_defaults = apply_filters( 'get_terms_defaults', $this->query_var_defaults, $taxonomies ); + + $query = wp_parse_args( $query, $this->query_var_defaults ); + + $query['number'] = absint( $query['number'] ); + $query['offset'] = absint( $query['offset'] ); + + // 'parent' overrides 'child_of'. + if ( 0 < intval( $query['parent'] ) ) { + $query['child_of'] = false; + } + + if ( 'all' == $query['get'] ) { + $query['childless'] = false; + $query['child_of'] = 0; + $query['hide_empty'] = 0; + $query['hierarchical'] = false; + $query['pad_counts'] = false; + } + + $query['taxonomy'] = $taxonomies; + + $this->query_vars = $query; + + /** + * Fires after term query vars have been parsed. + * + * @since 4.6.0 + * + * @param WP_Term_Query $this Current instance of WP_Term_Query. + */ + do_action( 'parse_term_query', $this ); + } + + /** + * Sets up the query for retrieving terms. + * + * @since 4.6.0 + * + * @param string|array $query Array or URL query string of parameters. + * @return array|int List of terms, or number of terms when 'count' is passed as a query var. + */ + public function query( $query ) { + $this->query_vars = wp_parse_args( $query ); + return $this->get_terms(); + } + + /** + * Get terms, based on query_vars. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return array List of terms. + */ + public function get_terms() { + global $wpdb; + + $this->parse_query( $this->query_vars ); + $args = &$this->query_vars; + + // Set up meta_query so it's available to 'pre_get_terms'. + $this->meta_query = new WP_Meta_Query(); + $this->meta_query->parse_query_vars( $args ); + + /** + * Fires before terms are retrieved. + * + * @since 4.6.0 + * + * @param WP_Term_Query $this Current instance of WP_Term_Query. + */ + do_action( 'pre_get_terms', $this ); + + $taxonomies = (array) $args['taxonomy']; + + // Save queries by not crawling the tree in the case of multiple taxes or a flat tax. + $has_hierarchical_tax = false; + if ( $taxonomies ) { + foreach ( $taxonomies as $_tax ) { + if ( is_taxonomy_hierarchical( $_tax ) ) { + $has_hierarchical_tax = true; + } + } + } else { + // When no taxonomies are provided, assume we have to descend the tree. + $has_hierarchical_tax = true; + } + + if ( ! $has_hierarchical_tax ) { + $args['hierarchical'] = false; + $args['pad_counts'] = false; + } + + // 'parent' overrides 'child_of'. + if ( 0 < intval( $args['parent'] ) ) { + $args['child_of'] = false; + } + + if ( 'all' == $args['get'] ) { + $args['childless'] = false; + $args['child_of'] = 0; + $args['hide_empty'] = 0; + $args['hierarchical'] = false; + $args['pad_counts'] = false; + } + + /** + * Filters the terms query arguments. + * + * @since 3.1.0 + * + * @param array $args An array of get_terms() arguments. + * @param string[] $taxonomies An array of taxonomy names. + */ + $args = apply_filters( 'get_terms_args', $args, $taxonomies ); + + // Avoid the query if the queried parent/child_of term has no descendants. + $child_of = $args['child_of']; + $parent = $args['parent']; + + if ( $child_of ) { + $_parent = $child_of; + } elseif ( $parent ) { + $_parent = $parent; + } else { + $_parent = false; + } + + if ( $_parent ) { + $in_hierarchy = false; + foreach ( $taxonomies as $_tax ) { + $hierarchy = _get_term_hierarchy( $_tax ); + + if ( isset( $hierarchy[ $_parent ] ) ) { + $in_hierarchy = true; + } + } + + if ( ! $in_hierarchy ) { + if ( 'count' == $args['fields'] ) { + return 0; + } else { + $this->terms = array(); + return $this->terms; + } + } + } + + // 'term_order' is a legal sort order only when joining the relationship table. + $_orderby = $this->query_vars['orderby']; + if ( 'term_order' === $_orderby && empty( $this->query_vars['object_ids'] ) ) { + $_orderby = 'term_id'; + } + $orderby = $this->parse_orderby( $_orderby ); + + if ( $orderby ) { + $orderby = "ORDER BY $orderby"; + } + + $order = $this->parse_order( $this->query_vars['order'] ); + + if ( $taxonomies ) { + $this->sql_clauses['where']['taxonomy'] = "tt.taxonomy IN ('" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "')"; + } + + $exclude = $args['exclude']; + $exclude_tree = $args['exclude_tree']; + $include = $args['include']; + + $inclusions = ''; + if ( ! empty( $include ) ) { + $exclude = ''; + $exclude_tree = ''; + $inclusions = implode( ',', wp_parse_id_list( $include ) ); + } + + if ( ! empty( $inclusions ) ) { + $this->sql_clauses['where']['inclusions'] = 't.term_id IN ( ' . $inclusions . ' )'; + } + + $exclusions = array(); + if ( ! empty( $exclude_tree ) ) { + $exclude_tree = wp_parse_id_list( $exclude_tree ); + $excluded_children = $exclude_tree; + foreach ( $exclude_tree as $extrunk ) { + $excluded_children = array_merge( + $excluded_children, + (array) get_terms( + array( + 'taxonomy' => reset( $taxonomies ), + 'child_of' => intval( $extrunk ), + 'fields' => 'ids', + 'hide_empty' => 0, + ) + ) + ); + } + $exclusions = array_merge( $excluded_children, $exclusions ); + } + + if ( ! empty( $exclude ) ) { + $exclusions = array_merge( wp_parse_id_list( $exclude ), $exclusions ); + } + + // 'childless' terms are those without an entry in the flattened term hierarchy. + $childless = (bool) $args['childless']; + if ( $childless ) { + foreach ( $taxonomies as $_tax ) { + $term_hierarchy = _get_term_hierarchy( $_tax ); + $exclusions = array_merge( array_keys( $term_hierarchy ), $exclusions ); + } + } + + if ( ! empty( $exclusions ) ) { + $exclusions = 't.term_id NOT IN (' . implode( ',', array_map( 'intval', $exclusions ) ) . ')'; + } else { + $exclusions = ''; + } + + /** + * Filters the terms to exclude from the terms query. + * + * @since 2.3.0 + * + * @param string $exclusions `NOT IN` clause of the terms query. + * @param array $args An array of terms query arguments. + * @param string[] $taxonomies An array of taxonomy names. + */ + $exclusions = apply_filters( 'list_terms_exclusions', $exclusions, $args, $taxonomies ); + + if ( ! empty( $exclusions ) ) { + // Must do string manipulation here for backward compatibility with filter. + $this->sql_clauses['where']['exclusions'] = preg_replace( '/^\s*AND\s*/', '', $exclusions ); + } + + if ( + ( ! empty( $args['name'] ) ) || + ( is_string( $args['name'] ) && 0 !== strlen( $args['name'] ) ) + ) { + $names = (array) $args['name']; + foreach ( $names as &$_name ) { + // `sanitize_term_field()` returns slashed data. + $_name = stripslashes( sanitize_term_field( 'name', $_name, 0, reset( $taxonomies ), 'db' ) ); + } + + $this->sql_clauses['where']['name'] = "t.name IN ('" . implode( "', '", array_map( 'esc_sql', $names ) ) . "')"; + } + + if ( + ( ! empty( $args['slug'] ) ) || + ( is_string( $args['slug'] ) && 0 !== strlen( $args['slug'] ) ) + ) { + if ( is_array( $args['slug'] ) ) { + $slug = array_map( 'sanitize_title', $args['slug'] ); + $this->sql_clauses['where']['slug'] = "t.slug IN ('" . implode( "', '", $slug ) . "')"; + } else { + $slug = sanitize_title( $args['slug'] ); + $this->sql_clauses['where']['slug'] = "t.slug = '$slug'"; + } + } + + if ( ! empty( $args['term_taxonomy_id'] ) ) { + if ( is_array( $args['term_taxonomy_id'] ) ) { + $tt_ids = implode( ',', array_map( 'intval', $args['term_taxonomy_id'] ) ); + $this->sql_clauses['where']['term_taxonomy_id'] = "tt.term_taxonomy_id IN ({$tt_ids})"; + } else { + $this->sql_clauses['where']['term_taxonomy_id'] = $wpdb->prepare( 'tt.term_taxonomy_id = %d', $args['term_taxonomy_id'] ); + } + } + + if ( ! empty( $args['name__like'] ) ) { + $this->sql_clauses['where']['name__like'] = $wpdb->prepare( 't.name LIKE %s', '%' . $wpdb->esc_like( $args['name__like'] ) . '%' ); + } + + if ( ! empty( $args['description__like'] ) ) { + $this->sql_clauses['where']['description__like'] = $wpdb->prepare( 'tt.description LIKE %s', '%' . $wpdb->esc_like( $args['description__like'] ) . '%' ); + } + + if ( ! empty( $args['object_ids'] ) ) { + $object_ids = $args['object_ids']; + if ( ! is_array( $object_ids ) ) { + $object_ids = array( $object_ids ); + } + + $object_ids = implode( ', ', array_map( 'intval', $object_ids ) ); + $this->sql_clauses['where']['object_ids'] = "tr.object_id IN ($object_ids)"; + } + + /* + * When querying for object relationships, the 'count > 0' check + * added by 'hide_empty' is superfluous. + */ + if ( ! empty( $args['object_ids'] ) ) { + $args['hide_empty'] = false; + } + + if ( '' !== $parent ) { + $parent = (int) $parent; + $this->sql_clauses['where']['parent'] = "tt.parent = '$parent'"; + } + + $hierarchical = $args['hierarchical']; + if ( 'count' == $args['fields'] ) { + $hierarchical = false; + } + if ( $args['hide_empty'] && ! $hierarchical ) { + $this->sql_clauses['where']['count'] = 'tt.count > 0'; + } + + $number = $args['number']; + $offset = $args['offset']; + + // Don't limit the query results when we have to descend the family tree. + if ( $number && ! $hierarchical && ! $child_of && '' === $parent ) { + if ( $offset ) { + $limits = 'LIMIT ' . $offset . ',' . $number; + } else { + $limits = 'LIMIT ' . $number; + } + } else { + $limits = ''; + } + + if ( ! empty( $args['search'] ) ) { + $this->sql_clauses['where']['search'] = $this->get_search_sql( $args['search'] ); + } + + // Meta query support. + $join = ''; + $distinct = ''; + + // Reparse meta_query query_vars, in case they were modified in a 'pre_get_terms' callback. + $this->meta_query->parse_query_vars( $this->query_vars ); + $mq_sql = $this->meta_query->get_sql( 'term', 't', 'term_id' ); + $meta_clauses = $this->meta_query->get_clauses(); + + if ( ! empty( $meta_clauses ) ) { + $join .= $mq_sql['join']; + $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $mq_sql['where'] ); + $distinct .= 'DISTINCT'; + + } + + $selects = array(); + switch ( $args['fields'] ) { + case 'all': + case 'all_with_object_id': + case 'tt_ids': + case 'slugs': + $selects = array( 't.*', 'tt.*' ); + if ( 'all_with_object_id' === $args['fields'] && ! empty( $args['object_ids'] ) ) { + $selects[] = 'tr.object_id'; + } + break; + case 'ids': + case 'id=>parent': + $selects = array( 't.term_id', 'tt.parent', 'tt.count', 'tt.taxonomy' ); + break; + case 'names': + $selects = array( 't.term_id', 'tt.parent', 'tt.count', 't.name', 'tt.taxonomy' ); + break; + case 'count': + $orderby = ''; + $order = ''; + $selects = array( 'COUNT(*)' ); + break; + case 'id=>name': + $selects = array( 't.term_id', 't.name', 'tt.count', 'tt.taxonomy' ); + break; + case 'id=>slug': + $selects = array( 't.term_id', 't.slug', 'tt.count', 'tt.taxonomy' ); + break; + } + + $_fields = $args['fields']; + + /** + * Filters the fields to select in the terms query. + * + * Field lists modified using this filter will only modify the term fields returned + * by the function when the `$fields` parameter set to 'count' or 'all'. In all other + * cases, the term fields in the results array will be determined by the `$fields` + * parameter alone. + * + * Use of this filter can result in unpredictable behavior, and is not recommended. + * + * @since 2.8.0 + * + * @param string[] $selects An array of fields to select for the terms query. + * @param array $args An array of term query arguments. + * @param string[] $taxonomies An array of taxonomy names. + */ + $fields = implode( ', ', apply_filters( 'get_terms_fields', $selects, $args, $taxonomies ) ); + + $join .= " INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"; + + if ( ! empty( $this->query_vars['object_ids'] ) ) { + $join .= " INNER JOIN {$wpdb->term_relationships} AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id"; + } + + $where = implode( ' AND ', $this->sql_clauses['where'] ); + + /** + * Filters the terms query SQL clauses. + * + * @since 3.1.0 + * + * @param string[] $pieces Array of query SQL clauses. + * @param string[] $taxonomies An array of taxonomy names. + * @param array $args An array of term query arguments. + */ + $clauses = apply_filters( 'terms_clauses', compact( 'fields', 'join', 'where', 'distinct', 'orderby', 'order', 'limits' ), $taxonomies, $args ); + + $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; + $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; + $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; + $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; + $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; + $order = isset( $clauses['order'] ) ? $clauses['order'] : ''; + $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; + + if ( $where ) { + $where = "WHERE $where"; + } + + $this->sql_clauses['select'] = "SELECT $distinct $fields"; + $this->sql_clauses['from'] = "FROM $wpdb->terms AS t $join"; + $this->sql_clauses['orderby'] = $orderby ? "$orderby $order" : ''; + $this->sql_clauses['limits'] = $limits; + + $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; + + $this->terms = null; + + /** + * Filter the terms array before the query takes place. + * + * Return a non-null value to bypass WordPress's default term queries. + * + * @since 5.3.0 + * + * @param array|null $terms Return an array of term data to short-circuit WP's term query, + * or null to allow WP queries to run normally. + * @param WP_Term_Query $this The WP_Term_Query instance, passed by reference. + * + */ + $this->terms = apply_filters_ref_array( 'terms_pre_query', array( $this->terms, &$this ) ); + + if ( null !== $this->terms ) { + return $this->terms; + } + + // $args can be anything. Only use the args defined in defaults to compute the key. + $key = md5( serialize( wp_array_slice_assoc( $args, array_keys( $this->query_var_defaults ) ) ) . serialize( $taxonomies ) . $this->request ); + $last_changed = wp_cache_get_last_changed( 'terms' ); + $cache_key = "get_terms:$key:$last_changed"; + $cache = wp_cache_get( $cache_key, 'terms' ); + if ( false !== $cache ) { + if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) { + $cache = $this->populate_terms( $cache ); + } + + $this->terms = $cache; + return $this->terms; + } + + if ( 'count' == $_fields ) { + $count = $wpdb->get_var( $this->request ); + wp_cache_set( $cache_key, $count, 'terms' ); + return $count; + } + + $terms = $wpdb->get_results( $this->request ); + if ( 'all' == $_fields || 'all_with_object_id' === $_fields ) { + update_term_cache( $terms ); + } + + // Prime termmeta cache. + if ( $args['update_term_meta_cache'] ) { + $term_ids = wp_list_pluck( $terms, 'term_id' ); + update_termmeta_cache( $term_ids ); + } + + if ( empty( $terms ) ) { + wp_cache_add( $cache_key, array(), 'terms', DAY_IN_SECONDS ); + return array(); + } + + if ( $child_of ) { + foreach ( $taxonomies as $_tax ) { + $children = _get_term_hierarchy( $_tax ); + if ( ! empty( $children ) ) { + $terms = _get_term_children( $child_of, $terms, $_tax ); + } + } + } + + // Update term counts to include children. + if ( $args['pad_counts'] && 'all' == $_fields ) { + foreach ( $taxonomies as $_tax ) { + _pad_term_counts( $terms, $_tax ); + } + } + + // Make sure we show empty categories that have children. + if ( $hierarchical && $args['hide_empty'] && is_array( $terms ) ) { + foreach ( $terms as $k => $term ) { + if ( ! $term->count ) { + $children = get_term_children( $term->term_id, $term->taxonomy ); + if ( is_array( $children ) ) { + foreach ( $children as $child_id ) { + $child = get_term( $child_id, $term->taxonomy ); + if ( $child->count ) { + continue 2; + } + } + } + + // It really is empty. + unset( $terms[ $k ] ); + } + } + } + + /* + * When querying for terms connected to objects, we may get + * duplicate results. The duplicates should be preserved if + * `$fields` is 'all_with_object_id', but should otherwise be + * removed. + */ + if ( ! empty( $args['object_ids'] ) && 'all_with_object_id' != $_fields ) { + $_tt_ids = array(); + $_terms = array(); + foreach ( $terms as $term ) { + if ( isset( $_tt_ids[ $term->term_id ] ) ) { + continue; + } + + $_tt_ids[ $term->term_id ] = 1; + $_terms[] = $term; + } + + $terms = $_terms; + } + + $_terms = array(); + if ( 'id=>parent' == $_fields ) { + foreach ( $terms as $term ) { + $_terms[ $term->term_id ] = $term->parent; + } + } elseif ( 'ids' == $_fields ) { + foreach ( $terms as $term ) { + $_terms[] = (int) $term->term_id; + } + } elseif ( 'tt_ids' == $_fields ) { + foreach ( $terms as $term ) { + $_terms[] = (int) $term->term_taxonomy_id; + } + } elseif ( 'names' == $_fields ) { + foreach ( $terms as $term ) { + $_terms[] = $term->name; + } + } elseif ( 'slugs' == $_fields ) { + foreach ( $terms as $term ) { + $_terms[] = $term->slug; + } + } elseif ( 'id=>name' == $_fields ) { + foreach ( $terms as $term ) { + $_terms[ $term->term_id ] = $term->name; + } + } elseif ( 'id=>slug' == $_fields ) { + foreach ( $terms as $term ) { + $_terms[ $term->term_id ] = $term->slug; + } + } + + if ( ! empty( $_terms ) ) { + $terms = $_terms; + } + + // Hierarchical queries are not limited, so 'offset' and 'number' must be handled now. + if ( $hierarchical && $number && is_array( $terms ) ) { + if ( $offset >= count( $terms ) ) { + $terms = array(); + } else { + $terms = array_slice( $terms, $offset, $number, true ); + } + } + + wp_cache_add( $cache_key, $terms, 'terms', DAY_IN_SECONDS ); + + if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) { + $terms = $this->populate_terms( $terms ); + } + + $this->terms = $terms; + return $this->terms; + } + + /** + * Parse and sanitize 'orderby' keys passed to the term query. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $orderby_raw Alias for the field to order by. + * @return string|false Value to used in the ORDER clause. False otherwise. + */ + protected function parse_orderby( $orderby_raw ) { + $_orderby = strtolower( $orderby_raw ); + $maybe_orderby_meta = false; + + if ( in_array( $_orderby, array( 'term_id', 'name', 'slug', 'term_group' ), true ) ) { + $orderby = "t.$_orderby"; + } elseif ( in_array( $_orderby, array( 'count', 'parent', 'taxonomy', 'term_taxonomy_id', 'description' ), true ) ) { + $orderby = "tt.$_orderby"; + } elseif ( 'term_order' === $_orderby ) { + $orderby = 'tr.term_order'; + } elseif ( 'include' == $_orderby && ! empty( $this->query_vars['include'] ) ) { + $include = implode( ',', wp_parse_id_list( $this->query_vars['include'] ) ); + $orderby = "FIELD( t.term_id, $include )"; + } elseif ( 'slug__in' == $_orderby && ! empty( $this->query_vars['slug'] ) && is_array( $this->query_vars['slug'] ) ) { + $slugs = implode( "', '", array_map( 'sanitize_title_for_query', $this->query_vars['slug'] ) ); + $orderby = "FIELD( t.slug, '" . $slugs . "')"; + } elseif ( 'none' == $_orderby ) { + $orderby = ''; + } elseif ( empty( $_orderby ) || 'id' == $_orderby || 'term_id' === $_orderby ) { + $orderby = 't.term_id'; + } else { + $orderby = 't.name'; + + // This may be a value of orderby related to meta. + $maybe_orderby_meta = true; + } + + /** + * Filters the ORDERBY clause of the terms query. + * + * @since 2.8.0 + * + * @param string $orderby `ORDERBY` clause of the terms query. + * @param array $args An array of term query arguments. + * @param string[] $taxonomies An array of taxonomy names. + */ + $orderby = apply_filters( 'get_terms_orderby', $orderby, $this->query_vars, $this->query_vars['taxonomy'] ); + + // Run after the 'get_terms_orderby' filter for backward compatibility. + if ( $maybe_orderby_meta ) { + $maybe_orderby_meta = $this->parse_orderby_meta( $_orderby ); + if ( $maybe_orderby_meta ) { + $orderby = $maybe_orderby_meta; + } + } + + return $orderby; + } + + /** + * Generate the ORDER BY clause for an 'orderby' param that is potentially related to a meta query. + * + * @since 4.6.0 + * + * @param string $orderby_raw Raw 'orderby' value passed to WP_Term_Query. + * @return string ORDER BY clause. + */ + protected function parse_orderby_meta( $orderby_raw ) { + $orderby = ''; + + // Tell the meta query to generate its SQL, so we have access to table aliases. + $this->meta_query->get_sql( 'term', 't', 'term_id' ); + $meta_clauses = $this->meta_query->get_clauses(); + if ( ! $meta_clauses || ! $orderby_raw ) { + return $orderby; + } + + $allowed_keys = array(); + $primary_meta_key = null; + $primary_meta_query = reset( $meta_clauses ); + if ( ! empty( $primary_meta_query['key'] ) ) { + $primary_meta_key = $primary_meta_query['key']; + $allowed_keys[] = $primary_meta_key; + } + $allowed_keys[] = 'meta_value'; + $allowed_keys[] = 'meta_value_num'; + $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) ); + + if ( ! in_array( $orderby_raw, $allowed_keys, true ) ) { + return $orderby; + } + + switch ( $orderby_raw ) { + case $primary_meta_key: + case 'meta_value': + if ( ! empty( $primary_meta_query['type'] ) ) { + $orderby = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; + } else { + $orderby = "{$primary_meta_query['alias']}.meta_value"; + } + break; + + case 'meta_value_num': + $orderby = "{$primary_meta_query['alias']}.meta_value+0"; + break; + + default: + if ( array_key_exists( $orderby_raw, $meta_clauses ) ) { + // $orderby corresponds to a meta_query clause. + $meta_clause = $meta_clauses[ $orderby_raw ]; + $orderby = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; + } + break; + } + + return $orderby; + } + + /** + * Parse an 'order' query variable and cast it to ASC or DESC as necessary. + * + * @since 4.6.0 + * + * @param string $order The 'order' query variable. + * @return string The sanitized 'order' query variable. + */ + protected function parse_order( $order ) { + if ( ! is_string( $order ) || empty( $order ) ) { + return 'DESC'; + } + + if ( 'ASC' === strtoupper( $order ) ) { + return 'ASC'; + } else { + return 'DESC'; + } + } + + /** + * Used internally to generate a SQL string related to the 'search' parameter. + * + * @since 4.6.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $string + * @return string + */ + protected function get_search_sql( $string ) { + global $wpdb; + + $like = '%' . $wpdb->esc_like( $string ) . '%'; + + return $wpdb->prepare( '((t.name LIKE %s) OR (t.slug LIKE %s))', $like, $like ); + } + + /** + * Creates an array of term objects from an array of term IDs. + * + * Also discards invalid term objects. + * + * @since 4.9.8 + * + * @param array $term_ids Term IDs. + * @return array + */ + protected function populate_terms( $term_ids ) { + $terms = array(); + + if ( ! is_array( $term_ids ) ) { + return $terms; + } + + foreach ( $term_ids as $key => $term_id ) { + $term = get_term( $term_id ); + if ( $term instanceof WP_Term ) { + $terms[ $key ] = $term; + } + } + + return $terms; + } +} diff --git a/wp-includes/class-wp-term.php b/wp-includes/class-wp-term.php new file mode 100644 index 0000000..df74705 --- /dev/null +++ b/wp-includes/class-wp-term.php @@ -0,0 +1,244 @@ +<?php +/** + * Taxonomy API: WP_Term class + * + * @package WordPress + * @subpackage Taxonomy + * @since 4.4.0 + */ + +/** + * Core class used to implement the WP_Term object. + * + * @since 4.4.0 + * + * @property-read object $data Sanitized term data. + */ +final class WP_Term { + + /** + * Term ID. + * + * @since 4.4.0 + * @var int + */ + public $term_id; + + /** + * The term's name. + * + * @since 4.4.0 + * @var string + */ + public $name = ''; + + /** + * The term's slug. + * + * @since 4.4.0 + * @var string + */ + public $slug = ''; + + /** + * The term's term_group. + * + * @since 4.4.0 + * @var string + */ + public $term_group = ''; + + /** + * Term Taxonomy ID. + * + * @since 4.4.0 + * @var int + */ + public $term_taxonomy_id = 0; + + /** + * The term's taxonomy name. + * + * @since 4.4.0 + * @var string + */ + public $taxonomy = ''; + + /** + * The term's description. + * + * @since 4.4.0 + * @var string + */ + public $description = ''; + + /** + * ID of a term's parent term. + * + * @since 4.4.0 + * @var int + */ + public $parent = 0; + + /** + * Cached object count for this term. + * + * @since 4.4.0 + * @var int + */ + public $count = 0; + + /** + * Stores the term object's sanitization level. + * + * Does not correspond to a database field. + * + * @since 4.4.0 + * @var string + */ + public $filter = 'raw'; + + /** + * Retrieve WP_Term instance. + * + * @since 4.4.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $term_id Term ID. + * @param string $taxonomy Optional. Limit matched terms to those matching `$taxonomy`. Only used for + * disambiguating potentially shared terms. + * @return WP_Term|WP_Error|false Term object, if found. WP_Error if `$term_id` is shared between taxonomies and + * there's insufficient data to distinguish which term is intended. + * False for other failures. + */ + public static function get_instance( $term_id, $taxonomy = null ) { + global $wpdb; + + $term_id = (int) $term_id; + if ( ! $term_id ) { + return false; + } + + $_term = wp_cache_get( $term_id, 'terms' ); + + // If there isn't a cached version, hit the database. + if ( ! $_term || ( $taxonomy && $taxonomy !== $_term->taxonomy ) ) { + // Any term found in the cache is not a match, so don't use it. + $_term = false; + + // Grab all matching terms, in case any are shared between taxonomies. + $terms = $wpdb->get_results( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id = %d", $term_id ) ); + if ( ! $terms ) { + return false; + } + + // If a taxonomy was specified, find a match. + if ( $taxonomy ) { + foreach ( $terms as $match ) { + if ( $taxonomy === $match->taxonomy ) { + $_term = $match; + break; + } + } + + // If only one match was found, it's the one we want. + } elseif ( 1 === count( $terms ) ) { + $_term = reset( $terms ); + + // Otherwise, the term must be shared between taxonomies. + } else { + // If the term is shared only with invalid taxonomies, return the one valid term. + foreach ( $terms as $t ) { + if ( ! taxonomy_exists( $t->taxonomy ) ) { + continue; + } + + // Only hit if we've already identified a term in a valid taxonomy. + if ( $_term ) { + return new WP_Error( 'ambiguous_term_id', __( 'Term ID is shared between multiple taxonomies' ), $term_id ); + } + + $_term = $t; + } + } + + if ( ! $_term ) { + return false; + } + + // Don't return terms from invalid taxonomies. + if ( ! taxonomy_exists( $_term->taxonomy ) ) { + return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); + } + + $_term = sanitize_term( $_term, $_term->taxonomy, 'raw' ); + + // Don't cache terms that are shared between taxonomies. + if ( 1 === count( $terms ) ) { + wp_cache_add( $term_id, $_term, 'terms' ); + } + } + + $term_obj = new WP_Term( $_term ); + $term_obj->filter( $term_obj->filter ); + + return $term_obj; + } + + /** + * Constructor. + * + * @since 4.4.0 + * + * @param WP_Term|object $term Term object. + */ + public function __construct( $term ) { + foreach ( get_object_vars( $term ) as $key => $value ) { + $this->$key = $value; + } + } + + /** + * Sanitizes term fields, according to the filter type provided. + * + * @since 4.4.0 + * + * @param string $filter Filter context. Accepts 'edit', 'db', 'display', 'attribute', 'js', 'raw'. + */ + public function filter( $filter ) { + sanitize_term( $this, $this->taxonomy, $filter ); + } + + /** + * Converts an object to array. + * + * @since 4.4.0 + * + * @return array Object as array. + */ + public function to_array() { + return get_object_vars( $this ); + } + + /** + * Getter. + * + * @since 4.4.0 + * + * @param string $key Property to get. + * @return mixed Property value. + */ + public function __get( $key ) { + switch ( $key ) { + case 'data': + $data = new stdClass(); + $columns = array( 'term_id', 'name', 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description', 'parent', 'count' ); + foreach ( $columns as $column ) { + $data->{$column} = isset( $this->{$column} ) ? $this->{$column} : null; + } + + return sanitize_term( $data, $data->taxonomy, 'raw' ); + } + } +} diff --git a/wp-includes/class-wp-text-diff-renderer-inline.php b/wp-includes/class-wp-text-diff-renderer-inline.php new file mode 100644 index 0000000..62a3303 --- /dev/null +++ b/wp-includes/class-wp-text-diff-renderer-inline.php @@ -0,0 +1,33 @@ +<?php +/** + * Diff API: WP_Text_Diff_Renderer_inline class + * + * @package WordPress + * @subpackage Diff + * @since 4.7.0 + */ + +/** + * Better word splitting than the PEAR package provides. + * + * @since 2.6.0 + * @uses Text_Diff_Renderer_inline Extends + */ +class WP_Text_Diff_Renderer_inline extends Text_Diff_Renderer_inline { + + /** + * @ignore + * @since 2.6.0 + * + * @param string $string + * @param string $newlineEscape + * @return string + */ + public function _splitOnWords( $string, $newlineEscape = "\n" ) { + $string = str_replace( "\0", '', $string ); + $words = preg_split( '/([^\w])/u', $string, -1, PREG_SPLIT_DELIM_CAPTURE ); + $words = str_replace( "\n", $newlineEscape, $words ); + return $words; + } + +} diff --git a/wp-includes/class-wp-text-diff-renderer-table.php b/wp-includes/class-wp-text-diff-renderer-table.php new file mode 100644 index 0000000..2116c1e --- /dev/null +++ b/wp-includes/class-wp-text-diff-renderer-table.php @@ -0,0 +1,551 @@ +<?php +/** + * Diff API: WP_Text_Diff_Renderer_Table class + * + * @package WordPress + * @subpackage Diff + * @since 4.7.0 + */ + +/** + * Table renderer to display the diff lines. + * + * @since 2.6.0 + * @uses Text_Diff_Renderer Extends + */ +class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { + + /** + * @see Text_Diff_Renderer::_leading_context_lines + * @var int + * @since 2.6.0 + */ + public $_leading_context_lines = 10000; + + /** + * @see Text_Diff_Renderer::_trailing_context_lines + * @var int + * @since 2.6.0 + */ + public $_trailing_context_lines = 10000; + + /** + * Threshold for when a diff should be saved or omitted. + * + * @var float + * @since 2.6.0 + */ + protected $_diff_threshold = 0.6; + + /** + * Inline display helper object name. + * + * @var string + * @since 2.6.0 + */ + protected $inline_diff_renderer = 'WP_Text_Diff_Renderer_inline'; + + /** + * Should we show the split view or not + * + * @var string + * @since 3.6.0 + */ + protected $_show_split_view = true; + + protected $compat_fields = array( '_show_split_view', 'inline_diff_renderer', '_diff_threshold' ); + + /** + * Caches the output of count_chars() in compute_string_distance() + * + * @var array + * @since 5.0.0 + */ + protected $count_cache = array(); + + /** + * Caches the difference calculation in compute_string_distance() + * + * @var array + * @since 5.0.0 + */ + protected $difference_cache = array(); + + /** + * Constructor - Call parent constructor with params array. + * + * This will set class properties based on the key value pairs in the array. + * + * @since 2.6.0 + * + * @param array $params + */ + public function __construct( $params = array() ) { + parent::__construct( $params ); + if ( isset( $params['show_split_view'] ) ) { + $this->_show_split_view = $params['show_split_view']; + } + } + + /** + * @ignore + * + * @param string $header + * @return string + */ + public function _startBlock( $header ) { + return ''; + } + + /** + * @ignore + * + * @param array $lines + * @param string $prefix + */ + public function _lines( $lines, $prefix = ' ' ) { + } + + /** + * @ignore + * + * @param string $line HTML-escape the value. + * @return string + */ + public function addedLine( $line ) { + return "<td class='diff-addedline'><span aria-hidden='true' class='dashicons dashicons-plus'></span><span class='screen-reader-text'>" . __( 'Added:' ) . " </span>{$line}</td>"; + + } + + /** + * @ignore + * + * @param string $line HTML-escape the value. + * @return string + */ + public function deletedLine( $line ) { + return "<td class='diff-deletedline'><span aria-hidden='true' class='dashicons dashicons-minus'></span><span class='screen-reader-text'>" . __( 'Deleted:' ) . " </span>{$line}</td>"; + } + + /** + * @ignore + * + * @param string $line HTML-escape the value. + * @return string + */ + public function contextLine( $line ) { + return "<td class='diff-context'><span class='screen-reader-text'>" . __( 'Unchanged:' ) . " </span>{$line}</td>"; + } + + /** + * @ignore + * + * @return string + */ + public function emptyLine() { + return '<td> </td>'; + } + + /** + * @ignore + * + * @param array $lines + * @param bool $encode + * @return string + */ + public function _added( $lines, $encode = true ) { + $r = ''; + foreach ( $lines as $line ) { + if ( $encode ) { + $processed_line = htmlspecialchars( $line ); + + /** + * Contextually filters a diffed line. + * + * Filters TextDiff processing of diffed line. By default, diffs are processed with + * htmlspecialchars. Use this filter to remove or change the processing. Passes a context + * indicating if the line is added, deleted or unchanged. + * + * @since 4.1.0 + * + * @param string $processed_line The processed diffed line. + * @param string $line The unprocessed diffed line. + * @param string $context The line context. Values are 'added', 'deleted' or 'unchanged'. + */ + $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'added' ); + } + + if ( $this->_show_split_view ) { + $r .= '<tr>' . $this->emptyLine() . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n"; + } else { + $r .= '<tr>' . $this->addedLine( $line ) . "</tr>\n"; + } + } + return $r; + } + + /** + * @ignore + * + * @param array $lines + * @param bool $encode + * @return string + */ + public function _deleted( $lines, $encode = true ) { + $r = ''; + foreach ( $lines as $line ) { + if ( $encode ) { + $processed_line = htmlspecialchars( $line ); + + /** This filter is documented in wp-includes/wp-diff.php */ + $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'deleted' ); + } + if ( $this->_show_split_view ) { + $r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . $this->emptyLine() . "</tr>\n"; + } else { + $r .= '<tr>' . $this->deletedLine( $line ) . "</tr>\n"; + } + } + return $r; + } + + /** + * @ignore + * + * @param array $lines + * @param bool $encode + * @return string + */ + public function _context( $lines, $encode = true ) { + $r = ''; + foreach ( $lines as $line ) { + if ( $encode ) { + $processed_line = htmlspecialchars( $line ); + + /** This filter is documented in wp-includes/wp-diff.php */ + $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'unchanged' ); + } + if ( $this->_show_split_view ) { + $r .= '<tr>' . $this->contextLine( $line ) . $this->emptyLine() . $this->contextLine( $line ) . "</tr>\n"; + } else { + $r .= '<tr>' . $this->contextLine( $line ) . "</tr>\n"; + } + } + return $r; + } + + /** + * Process changed lines to do word-by-word diffs for extra highlighting. + * + * (TRAC style) sometimes these lines can actually be deleted or added rows. + * We do additional processing to figure that out + * + * @since 2.6.0 + * + * @param array $orig + * @param array $final + * @return string + */ + public function _changed( $orig, $final ) { + $r = ''; + + /* + * Does the aforementioned additional processing: + * *_matches tell what rows are "the same" in orig and final. Those pairs will be diffed to get word changes. + * - match is numeric: an index in other column. + * - match is 'X': no match. It is a new row. + * *_rows are column vectors for the orig column and the final column. + * - row >= 0: an indix of the $orig or $final array. + * - row < 0: a blank row for that column. + */ + list($orig_matches, $final_matches, $orig_rows, $final_rows) = $this->interleave_changed_lines( $orig, $final ); + + // These will hold the word changes as determined by an inline diff. + $orig_diffs = array(); + $final_diffs = array(); + + // Compute word diffs for each matched pair using the inline diff. + foreach ( $orig_matches as $o => $f ) { + if ( is_numeric( $o ) && is_numeric( $f ) ) { + $text_diff = new Text_Diff( 'auto', array( array( $orig[ $o ] ), array( $final[ $f ] ) ) ); + $renderer = new $this->inline_diff_renderer; + $diff = $renderer->render( $text_diff ); + + // If they're too different, don't include any <ins> or <del>'s. + if ( preg_match_all( '!(<ins>.*?</ins>|<del>.*?</del>)!', $diff, $diff_matches ) ) { + // Length of all text between <ins> or <del>. + $stripped_matches = strlen( strip_tags( join( ' ', $diff_matches[0] ) ) ); + // Since we count length of text between <ins> or <del> (instead of picking just one), + // we double the length of chars not in those tags. + $stripped_diff = strlen( strip_tags( $diff ) ) * 2 - $stripped_matches; + $diff_ratio = $stripped_matches / $stripped_diff; + if ( $diff_ratio > $this->_diff_threshold ) { + continue; // Too different. Don't save diffs. + } + } + + // Un-inline the diffs by removing <del> or <ins>. + $orig_diffs[ $o ] = preg_replace( '|<ins>.*?</ins>|', '', $diff ); + $final_diffs[ $f ] = preg_replace( '|<del>.*?</del>|', '', $diff ); + } + } + + foreach ( array_keys( $orig_rows ) as $row ) { + // Both columns have blanks. Ignore them. + if ( $orig_rows[ $row ] < 0 && $final_rows[ $row ] < 0 ) { + continue; + } + + // If we have a word based diff, use it. Otherwise, use the normal line. + if ( isset( $orig_diffs[ $orig_rows[ $row ] ] ) ) { + $orig_line = $orig_diffs[ $orig_rows[ $row ] ]; + } elseif ( isset( $orig[ $orig_rows[ $row ] ] ) ) { + $orig_line = htmlspecialchars( $orig[ $orig_rows[ $row ] ] ); + } else { + $orig_line = ''; + } + + if ( isset( $final_diffs[ $final_rows[ $row ] ] ) ) { + $final_line = $final_diffs[ $final_rows[ $row ] ]; + } elseif ( isset( $final[ $final_rows[ $row ] ] ) ) { + $final_line = htmlspecialchars( $final[ $final_rows[ $row ] ] ); + } else { + $final_line = ''; + } + + if ( $orig_rows[ $row ] < 0 ) { // Orig is blank. This is really an added row. + $r .= $this->_added( array( $final_line ), false ); + } elseif ( $final_rows[ $row ] < 0 ) { // Final is blank. This is really a deleted row. + $r .= $this->_deleted( array( $orig_line ), false ); + } else { // A true changed row. + if ( $this->_show_split_view ) { + $r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->emptyLine() . $this->addedLine( $final_line ) . "</tr>\n"; + } else { + $r .= '<tr>' . $this->deletedLine( $orig_line ) . '</tr><tr>' . $this->addedLine( $final_line ) . "</tr>\n"; + } + } + } + + return $r; + } + + /** + * Takes changed blocks and matches which rows in orig turned into which rows in final. + * + * @since 2.6.0 + * + * @param array $orig Lines of the original version of the text. + * @param array $final Lines of the final version of the text. + * @return array { + * Array containing results of comparing the original text to the final text. + * + * @type array $orig_matches Associative array of original matches. Index == row + * number of `$orig`, value == corresponding row number + * of that same line in `$final` or 'x' if there is no + * corresponding row (indicating it is a deleted line). + * @type array $final_matches Associative array of final matches. Index == row + * number of `$final`, value == corresponding row number + * of that same line in `$orig` or 'x' if there is no + * corresponding row (indicating it is a new line). + * @type array $orig_rows Associative array of interleaved rows of `$orig` with + * blanks to keep matches aligned with side-by-side diff + * of `$final`. A value >= 0 corresponds to index of `$orig`. + * Value < 0 indicates a blank row. + * @type array $final_rows Associative array of interleaved rows of `$final` with + * blanks to keep matches aligned with side-by-side diff + * of `$orig`. A value >= 0 corresponds to index of `$final`. + * Value < 0 indicates a blank row. + * } + */ + public function interleave_changed_lines( $orig, $final ) { + + // Contains all pairwise string comparisons. Keys are such that this need only be a one dimensional array. + $matches = array(); + foreach ( array_keys( $orig ) as $o ) { + foreach ( array_keys( $final ) as $f ) { + $matches[ "$o,$f" ] = $this->compute_string_distance( $orig[ $o ], $final[ $f ] ); + } + } + asort( $matches ); // Order by string distance. + + $orig_matches = array(); + $final_matches = array(); + + foreach ( $matches as $keys => $difference ) { + list($o, $f) = explode( ',', $keys ); + $o = (int) $o; + $f = (int) $f; + + // Already have better matches for these guys. + if ( isset( $orig_matches[ $o ] ) && isset( $final_matches[ $f ] ) ) { + continue; + } + + // First match for these guys. Must be best match. + if ( ! isset( $orig_matches[ $o ] ) && ! isset( $final_matches[ $f ] ) ) { + $orig_matches[ $o ] = $f; + $final_matches[ $f ] = $o; + continue; + } + + // Best match of this final is already taken? Must mean this final is a new row. + if ( isset( $orig_matches[ $o ] ) ) { + $final_matches[ $f ] = 'x'; + } elseif ( isset( $final_matches[ $f ] ) ) { + // Best match of this orig is already taken? Must mean this orig is a deleted row. + $orig_matches[ $o ] = 'x'; + } + } + + // We read the text in this order. + ksort( $orig_matches ); + ksort( $final_matches ); + + // Stores rows and blanks for each column. + $orig_rows = array_keys( $orig_matches ); + $orig_rows_copy = $orig_rows; + $final_rows = array_keys( $final_matches ); + + // Interleaves rows with blanks to keep matches aligned. + // We may end up with some extraneous blank rows, but we'll just ignore them later. + foreach ( $orig_rows_copy as $orig_row ) { + $final_pos = array_search( $orig_matches[ $orig_row ], $final_rows, true ); + $orig_pos = (int) array_search( $orig_row, $orig_rows, true ); + + if ( false === $final_pos ) { // This orig is paired with a blank final. + array_splice( $final_rows, $orig_pos, 0, -1 ); + } elseif ( $final_pos < $orig_pos ) { // This orig's match is up a ways. Pad final with blank rows. + $diff_array = range( -1, $final_pos - $orig_pos ); + array_splice( $final_rows, $orig_pos, 0, $diff_array ); + } elseif ( $final_pos > $orig_pos ) { // This orig's match is down a ways. Pad orig with blank rows. + $diff_array = range( -1, $orig_pos - $final_pos ); + array_splice( $orig_rows, $orig_pos, 0, $diff_array ); + } + } + + // Pad the ends with blank rows if the columns aren't the same length. + $diff_count = count( $orig_rows ) - count( $final_rows ); + if ( $diff_count < 0 ) { + while ( $diff_count < 0 ) { + array_push( $orig_rows, $diff_count++ ); + } + } elseif ( $diff_count > 0 ) { + $diff_count = -1 * $diff_count; + while ( $diff_count < 0 ) { + array_push( $final_rows, $diff_count++ ); + } + } + + return array( $orig_matches, $final_matches, $orig_rows, $final_rows ); + } + + /** + * Computes a number that is intended to reflect the "distance" between two strings. + * + * @since 2.6.0 + * + * @param string $string1 + * @param string $string2 + * @return int + */ + public function compute_string_distance( $string1, $string2 ) { + // Use an md5 hash of the strings for a count cache, as it's fast to generate, and collisions aren't a concern. + $count_key1 = md5( $string1 ); + $count_key2 = md5( $string2 ); + + // Cache vectors containing character frequency for all chars in each string. + if ( ! isset( $this->count_cache[ $count_key1 ] ) ) { + $this->count_cache[ $count_key1 ] = count_chars( $string1 ); + } + if ( ! isset( $this->count_cache[ $count_key2 ] ) ) { + $this->count_cache[ $count_key2 ] = count_chars( $string2 ); + } + + $chars1 = $this->count_cache[ $count_key1 ]; + $chars2 = $this->count_cache[ $count_key2 ]; + + $difference_key = md5( implode( ',', $chars1 ) . ':' . implode( ',', $chars2 ) ); + if ( ! isset( $this->difference_cache[ $difference_key ] ) ) { + // L1-norm of difference vector. + $this->difference_cache[ $difference_key ] = array_sum( array_map( array( $this, 'difference' ), $chars1, $chars2 ) ); + } + + $difference = $this->difference_cache[ $difference_key ]; + + // $string1 has zero length? Odd. Give huge penalty by not dividing. + if ( ! $string1 ) { + return $difference; + } + + // Return distance per character (of string1). + return $difference / strlen( $string1 ); + } + + /** + * @ignore + * @since 2.6.0 + * + * @param int $a + * @param int $b + * @return int + */ + public function difference( $a, $b ) { + return abs( $a - $b ); + } + + /** + * Make private properties readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to get. + * @return mixed Property. + */ + public function __get( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + return $this->$name; + } + } + + /** + * Make private properties settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @param mixed $value Property value. + * @return mixed Newly-set property. + */ + public function __set( $name, $value ) { + if ( in_array( $name, $this->compat_fields ) ) { + return $this->$name = $value; + } + } + + /** + * Make private properties checkable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @return bool Whether the property is set. + */ + public function __isset( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + return isset( $this->$name ); + } + } + + /** + * Make private properties un-settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to unset. + */ + public function __unset( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + unset( $this->$name ); + } + } +} diff --git a/wp-includes/class-wp-theme.php b/wp-includes/class-wp-theme.php new file mode 100644 index 0000000..d74ce04 --- /dev/null +++ b/wp-includes/class-wp-theme.php @@ -0,0 +1,1670 @@ +<?php +/** + * WP_Theme Class + * + * @package WordPress + * @subpackage Theme + * @since 3.4.0 + */ +final class WP_Theme implements ArrayAccess { + + /** + * Whether the theme has been marked as updateable. + * + * @since 4.4.0 + * @var bool + * + * @see WP_MS_Themes_List_Table + */ + public $update = false; + + /** + * Headers for style.css files. + * + * @since 3.4.0 + * @since 5.4.0 Added `Requires at least` and `Requires PHP` headers. + * @var array + */ + private static $file_headers = array( + 'Name' => 'Theme Name', + 'ThemeURI' => 'Theme URI', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'Version' => 'Version', + 'Template' => 'Template', + 'Status' => 'Status', + 'Tags' => 'Tags', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + 'RequiresWP' => 'Requires at least', + 'RequiresPHP' => 'Requires PHP', + ); + + /** + * Default themes. + * + * @var array + */ + private static $default_themes = array( + 'classic' => 'WordPress Classic', + 'default' => 'WordPress Default', + 'twentyten' => 'Twenty Ten', + 'twentyeleven' => 'Twenty Eleven', + 'twentytwelve' => 'Twenty Twelve', + 'twentythirteen' => 'Twenty Thirteen', + 'twentyfourteen' => 'Twenty Fourteen', + 'twentyfifteen' => 'Twenty Fifteen', + 'twentysixteen' => 'Twenty Sixteen', + 'twentyseventeen' => 'Twenty Seventeen', + 'twentynineteen' => 'Twenty Nineteen', + 'twentytwenty' => 'Twenty Twenty', + ); + + /** + * Renamed theme tags. + * + * @var array + */ + private static $tag_map = array( + 'fixed-width' => 'fixed-layout', + 'flexible-width' => 'fluid-layout', + ); + + /** + * Absolute path to the theme root, usually wp-content/themes + * + * @var string + */ + private $theme_root; + + /** + * Header data from the theme's style.css file. + * + * @var array + */ + private $headers = array(); + + /** + * Header data from the theme's style.css file after being sanitized. + * + * @var array + */ + private $headers_sanitized; + + /** + * Header name from the theme's style.css after being translated. + * + * Cached due to sorting functions running over the translated name. + * + * @var string + */ + private $name_translated; + + /** + * Errors encountered when initializing the theme. + * + * @var WP_Error + */ + private $errors; + + /** + * The directory name of the theme's files, inside the theme root. + * + * In the case of a child theme, this is directory name of the child theme. + * Otherwise, 'stylesheet' is the same as 'template'. + * + * @var string + */ + private $stylesheet; + + /** + * The directory name of the theme's files, inside the theme root. + * + * In the case of a child theme, this is the directory name of the parent theme. + * Otherwise, 'template' is the same as 'stylesheet'. + * + * @var string + */ + private $template; + + /** + * A reference to the parent theme, in the case of a child theme. + * + * @var WP_Theme + */ + private $parent; + + /** + * URL to the theme root, usually an absolute URL to wp-content/themes + * + * @var string + */ + private $theme_root_uri; + + /** + * Flag for whether the theme's textdomain is loaded. + * + * @var bool + */ + private $textdomain_loaded; + + /** + * Stores an md5 hash of the theme root, to function as the cache key. + * + * @var string + */ + private $cache_hash; + + /** + * Flag for whether the themes cache bucket should be persistently cached. + * + * Default is false. Can be set with the {@see 'wp_cache_themes_persistently'} filter. + * + * @var bool + */ + private static $persistently_cache; + + /** + * Expiration time for the themes cache bucket. + * + * By default the bucket is not cached, so this value is useless. + * + * @var bool + */ + private static $cache_expiration = 1800; + + /** + * Constructor for WP_Theme. + * + * @since 3.4.0 + * + * @global array $wp_theme_directories + * + * @param string $theme_dir Directory of the theme within the theme_root. + * @param string $theme_root Theme root. + * @param WP_Theme|null $_child If this theme is a parent theme, the child may be passed for validation purposes. + */ + public function __construct( $theme_dir, $theme_root, $_child = null ) { + global $wp_theme_directories; + + // Initialize caching on first run. + if ( ! isset( self::$persistently_cache ) ) { + /** This action is documented in wp-includes/theme.php */ + self::$persistently_cache = apply_filters( 'wp_cache_themes_persistently', false, 'WP_Theme' ); + if ( self::$persistently_cache ) { + wp_cache_add_global_groups( 'themes' ); + if ( is_int( self::$persistently_cache ) ) { + self::$cache_expiration = self::$persistently_cache; + } + } else { + wp_cache_add_non_persistent_groups( 'themes' ); + } + } + + $this->theme_root = $theme_root; + $this->stylesheet = $theme_dir; + + // Correct a situation where the theme is 'some-directory/some-theme' but 'some-directory' was passed in as part of the theme root instead. + if ( ! in_array( $theme_root, (array) $wp_theme_directories ) && in_array( dirname( $theme_root ), (array) $wp_theme_directories ) ) { + $this->stylesheet = basename( $this->theme_root ) . '/' . $this->stylesheet; + $this->theme_root = dirname( $theme_root ); + } + + $this->cache_hash = md5( $this->theme_root . '/' . $this->stylesheet ); + $theme_file = $this->stylesheet . '/style.css'; + + $cache = $this->cache_get( 'theme' ); + + if ( is_array( $cache ) ) { + foreach ( array( 'errors', 'headers', 'template' ) as $key ) { + if ( isset( $cache[ $key ] ) ) { + $this->$key = $cache[ $key ]; + } + } + if ( $this->errors ) { + return; + } + if ( isset( $cache['theme_root_template'] ) ) { + $theme_root_template = $cache['theme_root_template']; + } + } elseif ( ! file_exists( $this->theme_root . '/' . $theme_file ) ) { + $this->headers['Name'] = $this->stylesheet; + if ( ! file_exists( $this->theme_root . '/' . $this->stylesheet ) ) { + $this->errors = new WP_Error( + 'theme_not_found', + sprintf( + /* translators: %s: Theme directory name. */ + __( 'The theme directory "%s" does not exist.' ), + esc_html( $this->stylesheet ) + ) + ); + } else { + $this->errors = new WP_Error( 'theme_no_stylesheet', __( 'Stylesheet is missing.' ) ); + } + $this->template = $this->stylesheet; + $this->cache_add( + 'theme', + array( + 'headers' => $this->headers, + 'errors' => $this->errors, + 'stylesheet' => $this->stylesheet, + 'template' => $this->template, + ) + ); + if ( ! file_exists( $this->theme_root ) ) { // Don't cache this one. + $this->errors->add( 'theme_root_missing', __( 'Error: The themes directory is either empty or doesn’t exist. Please check your installation.' ) ); + } + return; + } elseif ( ! is_readable( $this->theme_root . '/' . $theme_file ) ) { + $this->headers['Name'] = $this->stylesheet; + $this->errors = new WP_Error( 'theme_stylesheet_not_readable', __( 'Stylesheet is not readable.' ) ); + $this->template = $this->stylesheet; + $this->cache_add( + 'theme', + array( + 'headers' => $this->headers, + 'errors' => $this->errors, + 'stylesheet' => $this->stylesheet, + 'template' => $this->template, + ) + ); + return; + } else { + $this->headers = get_file_data( $this->theme_root . '/' . $theme_file, self::$file_headers, 'theme' ); + // Default themes always trump their pretenders. + // Properly identify default themes that are inside a directory within wp-content/themes. + $default_theme_slug = array_search( $this->headers['Name'], self::$default_themes ); + if ( $default_theme_slug ) { + if ( basename( $this->stylesheet ) != $default_theme_slug ) { + $this->headers['Name'] .= '/' . $this->stylesheet; + } + } + } + + if ( ! $this->template && $this->stylesheet === $this->headers['Template'] ) { + $this->errors = new WP_Error( + 'theme_child_invalid', + sprintf( + /* translators: %s: Template. */ + __( 'The theme defines itself as its parent theme. Please check the %s header.' ), + '<code>Template</code>' + ) + ); + $this->cache_add( + 'theme', + array( + 'headers' => $this->headers, + 'errors' => $this->errors, + 'stylesheet' => $this->stylesheet, + ) + ); + + return; + } + + // (If template is set from cache [and there are no errors], we know it's good.) + if ( ! $this->template ) { + $this->template = $this->headers['Template']; + } + + if ( ! $this->template ) { + $this->template = $this->stylesheet; + if ( ! file_exists( $this->theme_root . '/' . $this->stylesheet . '/index.php' ) ) { + $error_message = sprintf( + /* translators: 1: index.php, 2: Documentation URL, 3: style.css */ + __( 'Template is missing. Standalone themes need to have a %1$s template file. <a href="%2$s">Child themes</a> need to have a Template header in the %3$s stylesheet.' ), + '<code>index.php</code>', + __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ), + '<code>style.css</code>' + ); + $this->errors = new WP_Error( 'theme_no_index', $error_message ); + $this->cache_add( + 'theme', + array( + 'headers' => $this->headers, + 'errors' => $this->errors, + 'stylesheet' => $this->stylesheet, + 'template' => $this->template, + ) + ); + return; + } + } + + // If we got our data from cache, we can assume that 'template' is pointing to the right place. + if ( ! is_array( $cache ) && $this->template != $this->stylesheet && ! file_exists( $this->theme_root . '/' . $this->template . '/index.php' ) ) { + // If we're in a directory of themes inside /themes, look for the parent nearby. + // wp-content/themes/directory-of-themes/* + $parent_dir = dirname( $this->stylesheet ); + $directories = search_theme_directories(); + if ( '.' != $parent_dir && file_exists( $this->theme_root . '/' . $parent_dir . '/' . $this->template . '/index.php' ) ) { + $this->template = $parent_dir . '/' . $this->template; + } elseif ( $directories && isset( $directories[ $this->template ] ) ) { + // Look for the template in the search_theme_directories() results, in case it is in another theme root. + // We don't look into directories of themes, just the theme root. + $theme_root_template = $directories[ $this->template ]['theme_root']; + } else { + // Parent theme is missing. + $this->errors = new WP_Error( + 'theme_no_parent', + sprintf( + /* translators: %s: Theme directory name. */ + __( 'The parent theme is missing. Please install the "%s" parent theme.' ), + esc_html( $this->template ) + ) + ); + $this->cache_add( + 'theme', + array( + 'headers' => $this->headers, + 'errors' => $this->errors, + 'stylesheet' => $this->stylesheet, + 'template' => $this->template, + ) + ); + $this->parent = new WP_Theme( $this->template, $this->theme_root, $this ); + return; + } + } + + // Set the parent, if we're a child theme. + if ( $this->template != $this->stylesheet ) { + // If we are a parent, then there is a problem. Only two generations allowed! Cancel things out. + if ( $_child instanceof WP_Theme && $_child->template == $this->stylesheet ) { + $_child->parent = null; + $_child->errors = new WP_Error( + 'theme_parent_invalid', + sprintf( + /* translators: %s: Theme directory name. */ + __( 'The "%s" theme is not a valid parent theme.' ), + esc_html( $_child->template ) + ) + ); + $_child->cache_add( + 'theme', + array( + 'headers' => $_child->headers, + 'errors' => $_child->errors, + 'stylesheet' => $_child->stylesheet, + 'template' => $_child->template, + ) + ); + // The two themes actually reference each other with the Template header. + if ( $_child->stylesheet == $this->template ) { + $this->errors = new WP_Error( + 'theme_parent_invalid', + sprintf( + /* translators: %s: Theme directory name. */ + __( 'The "%s" theme is not a valid parent theme.' ), + esc_html( $this->template ) + ) + ); + $this->cache_add( + 'theme', + array( + 'headers' => $this->headers, + 'errors' => $this->errors, + 'stylesheet' => $this->stylesheet, + 'template' => $this->template, + ) + ); + } + return; + } + // Set the parent. Pass the current instance so we can do the crazy checks above and assess errors. + $this->parent = new WP_Theme( $this->template, isset( $theme_root_template ) ? $theme_root_template : $this->theme_root, $this ); + } + + if ( wp_paused_themes()->get( $this->stylesheet ) && ( ! is_wp_error( $this->errors ) || ! isset( $this->errors->errors['theme_paused'] ) ) ) { + $this->errors = new WP_Error( 'theme_paused', __( 'This theme failed to load properly and was paused within the admin backend.' ) ); + } + + // We're good. If we didn't retrieve from cache, set it. + if ( ! is_array( $cache ) ) { + $cache = array( + 'headers' => $this->headers, + 'errors' => $this->errors, + 'stylesheet' => $this->stylesheet, + 'template' => $this->template, + ); + // If the parent theme is in another root, we'll want to cache this. Avoids an entire branch of filesystem calls above. + if ( isset( $theme_root_template ) ) { + $cache['theme_root_template'] = $theme_root_template; + } + $this->cache_add( 'theme', $cache ); + } + } + + /** + * When converting the object to a string, the theme name is returned. + * + * @since 3.4.0 + * + * @return string Theme name, ready for display (translated) + */ + public function __toString() { + return (string) $this->display( 'Name' ); + } + + /** + * __isset() magic method for properties formerly returned by current_theme_info() + * + * @staticvar array $properties + * + * @since 3.4.0 + * + * @param string $offset Property to check if set. + * @return bool Whether the given property is set. + */ + public function __isset( $offset ) { + static $properties = array( + 'name', + 'title', + 'version', + 'parent_theme', + 'template_dir', + 'stylesheet_dir', + 'template', + 'stylesheet', + 'screenshot', + 'description', + 'author', + 'tags', + 'theme_root', + 'theme_root_uri', + ); + + return in_array( $offset, $properties ); + } + + /** + * __get() magic method for properties formerly returned by current_theme_info() + * + * @since 3.4.0 + * + * @param string $offset Property to get. + * @return mixed Property value. + */ + public function __get( $offset ) { + switch ( $offset ) { + case 'name': + case 'title': + return $this->get( 'Name' ); + case 'version': + return $this->get( 'Version' ); + case 'parent_theme': + return $this->parent() ? $this->parent()->get( 'Name' ) : ''; + case 'template_dir': + return $this->get_template_directory(); + case 'stylesheet_dir': + return $this->get_stylesheet_directory(); + case 'template': + return $this->get_template(); + case 'stylesheet': + return $this->get_stylesheet(); + case 'screenshot': + return $this->get_screenshot( 'relative' ); + // 'author' and 'description' did not previously return translated data. + case 'description': + return $this->display( 'Description' ); + case 'author': + return $this->display( 'Author' ); + case 'tags': + return $this->get( 'Tags' ); + case 'theme_root': + return $this->get_theme_root(); + case 'theme_root_uri': + return $this->get_theme_root_uri(); + // For cases where the array was converted to an object. + default: + return $this->offsetGet( $offset ); + } + } + + /** + * Method to implement ArrayAccess for keys formerly returned by get_themes() + * + * @since 3.4.0 + * + * @param mixed $offset + * @param mixed $value + */ + public function offsetSet( $offset, $value ) {} + + /** + * Method to implement ArrayAccess for keys formerly returned by get_themes() + * + * @since 3.4.0 + * + * @param mixed $offset + */ + public function offsetUnset( $offset ) {} + + /** + * Method to implement ArrayAccess for keys formerly returned by get_themes() + * + * @staticvar array $keys + * + * @since 3.4.0 + * + * @param mixed $offset + * @return bool + */ + public function offsetExists( $offset ) { + static $keys = array( + 'Name', + 'Version', + 'Status', + 'Title', + 'Author', + 'Author Name', + 'Author URI', + 'Description', + 'Template', + 'Stylesheet', + 'Template Files', + 'Stylesheet Files', + 'Template Dir', + 'Stylesheet Dir', + 'Screenshot', + 'Tags', + 'Theme Root', + 'Theme Root URI', + 'Parent Theme', + ); + + return in_array( $offset, $keys ); + } + + /** + * Method to implement ArrayAccess for keys formerly returned by get_themes(). + * + * Author, Author Name, Author URI, and Description did not previously return + * translated data. We are doing so now as it is safe to do. However, as + * Name and Title could have been used as the key for get_themes(), both remain + * untranslated for back compatibility. This means that ['Name'] is not ideal, + * and care should be taken to use `$theme::display( 'Name' )` to get a properly + * translated header. + * + * @since 3.4.0 + * + * @param mixed $offset + * @return mixed + */ + public function offsetGet( $offset ) { + switch ( $offset ) { + case 'Name': + case 'Title': + /* + * See note above about using translated data. get() is not ideal. + * It is only for backward compatibility. Use display(). + */ + return $this->get( 'Name' ); + case 'Author': + return $this->display( 'Author' ); + case 'Author Name': + return $this->display( 'Author', false ); + case 'Author URI': + return $this->display( 'AuthorURI' ); + case 'Description': + return $this->display( 'Description' ); + case 'Version': + case 'Status': + return $this->get( $offset ); + case 'Template': + return $this->get_template(); + case 'Stylesheet': + return $this->get_stylesheet(); + case 'Template Files': + return $this->get_files( 'php', 1, true ); + case 'Stylesheet Files': + return $this->get_files( 'css', 0, false ); + case 'Template Dir': + return $this->get_template_directory(); + case 'Stylesheet Dir': + return $this->get_stylesheet_directory(); + case 'Screenshot': + return $this->get_screenshot( 'relative' ); + case 'Tags': + return $this->get( 'Tags' ); + case 'Theme Root': + return $this->get_theme_root(); + case 'Theme Root URI': + return $this->get_theme_root_uri(); + case 'Parent Theme': + return $this->parent() ? $this->parent()->get( 'Name' ) : ''; + default: + return null; + } + } + + /** + * Returns errors property. + * + * @since 3.4.0 + * + * @return WP_Error|false WP_Error if there are errors, or false. + */ + public function errors() { + return is_wp_error( $this->errors ) ? $this->errors : false; + } + + /** + * Whether the theme exists. + * + * A theme with errors exists. A theme with the error of 'theme_not_found', + * meaning that the theme's directory was not found, does not exist. + * + * @since 3.4.0 + * + * @return bool Whether the theme exists. + */ + public function exists() { + return ! ( $this->errors() && in_array( 'theme_not_found', $this->errors()->get_error_codes() ) ); + } + + /** + * Returns reference to the parent theme. + * + * @since 3.4.0 + * + * @return WP_Theme|false Parent theme, or false if the current theme is not a child theme. + */ + public function parent() { + return isset( $this->parent ) ? $this->parent : false; + } + + /** + * Adds theme data to cache. + * + * Cache entries keyed by the theme and the type of data. + * + * @since 3.4.0 + * + * @param string $key Type of data to store (theme, screenshot, headers, post_templates) + * @param array|string $data Data to store + * @return bool Return value from wp_cache_add() + */ + private function cache_add( $key, $data ) { + return wp_cache_add( $key . '-' . $this->cache_hash, $data, 'themes', self::$cache_expiration ); + } + + /** + * Gets theme data from cache. + * + * Cache entries are keyed by the theme and the type of data. + * + * @since 3.4.0 + * + * @param string $key Type of data to retrieve (theme, screenshot, headers, post_templates) + * @return mixed Retrieved data + */ + private function cache_get( $key ) { + return wp_cache_get( $key . '-' . $this->cache_hash, 'themes' ); + } + + /** + * Clears the cache for the theme. + * + * @since 3.4.0 + */ + public function cache_delete() { + foreach ( array( 'theme', 'screenshot', 'headers', 'post_templates' ) as $key ) { + wp_cache_delete( $key . '-' . $this->cache_hash, 'themes' ); + } + $this->template = null; + $this->textdomain_loaded = null; + $this->theme_root_uri = null; + $this->parent = null; + $this->errors = null; + $this->headers_sanitized = null; + $this->name_translated = null; + $this->headers = array(); + $this->__construct( $this->stylesheet, $this->theme_root ); + } + + /** + * Get a raw, unformatted theme header. + * + * The header is sanitized, but is not translated, and is not marked up for display. + * To get a theme header for display, use the display() method. + * + * Use the get_template() method, not the 'Template' header, for finding the template. + * The 'Template' header is only good for what was written in the style.css, while + * get_template() takes into account where WordPress actually located the theme and + * whether it is actually valid. + * + * @since 3.4.0 + * + * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. + * @return string|array|false String or array (for Tags header) on success, false on failure. + */ + public function get( $header ) { + if ( ! isset( $this->headers[ $header ] ) ) { + return false; + } + + if ( ! isset( $this->headers_sanitized ) ) { + $this->headers_sanitized = $this->cache_get( 'headers' ); + if ( ! is_array( $this->headers_sanitized ) ) { + $this->headers_sanitized = array(); + } + } + + if ( isset( $this->headers_sanitized[ $header ] ) ) { + return $this->headers_sanitized[ $header ]; + } + + // If themes are a persistent group, sanitize everything and cache it. One cache add is better than many cache sets. + if ( self::$persistently_cache ) { + foreach ( array_keys( $this->headers ) as $_header ) { + $this->headers_sanitized[ $_header ] = $this->sanitize_header( $_header, $this->headers[ $_header ] ); + } + $this->cache_add( 'headers', $this->headers_sanitized ); + } else { + $this->headers_sanitized[ $header ] = $this->sanitize_header( $header, $this->headers[ $header ] ); + } + + return $this->headers_sanitized[ $header ]; + } + + /** + * Gets a theme header, formatted and translated for display. + * + * @since 3.4.0 + * + * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. + * @param bool $markup Optional. Whether to mark up the header. Defaults to true. + * @param bool $translate Optional. Whether to translate the header. Defaults to true. + * @return string|array|false Processed header. An array for Tags if `$markup` is false, string otherwise. + * False on failure. + */ + public function display( $header, $markup = true, $translate = true ) { + $value = $this->get( $header ); + if ( false === $value ) { + return false; + } + + if ( $translate && ( empty( $value ) || ! $this->load_textdomain() ) ) { + $translate = false; + } + + if ( $translate ) { + $value = $this->translate_header( $header, $value ); + } + + if ( $markup ) { + $value = $this->markup_header( $header, $value, $translate ); + } + + return $value; + } + + /** + * Sanitize a theme header. + * + * @since 3.4.0 + * @since 5.4.0 Added support for `Requires at least` and `Requires PHP` headers. + * + * @staticvar array $header_tags + * @staticvar array $header_tags_with_a + * + * @param string $header Theme header. Accepts 'Name', 'Description', 'Author', 'Version', + * 'ThemeURI', 'AuthorURI', 'Status', 'Tags', 'RequiresWP', 'RequiresPHP'. + * @param string $value Value to sanitize. + * @return string|array An array for Tags header, string otherwise. + */ + private function sanitize_header( $header, $value ) { + switch ( $header ) { + case 'Status': + if ( ! $value ) { + $value = 'publish'; + break; + } + // Fall through otherwise. + case 'Name': + static $header_tags = array( + 'abbr' => array( 'title' => true ), + 'acronym' => array( 'title' => true ), + 'code' => true, + 'em' => true, + 'strong' => true, + ); + + $value = wp_kses( $value, $header_tags ); + break; + case 'Author': + // There shouldn't be anchor tags in Author, but some themes like to be challenging. + case 'Description': + static $header_tags_with_a = array( + 'a' => array( + 'href' => true, + 'title' => true, + ), + 'abbr' => array( 'title' => true ), + 'acronym' => array( 'title' => true ), + 'code' => true, + 'em' => true, + 'strong' => true, + ); + + $value = wp_kses( $value, $header_tags_with_a ); + break; + case 'ThemeURI': + case 'AuthorURI': + $value = esc_url_raw( $value ); + break; + case 'Tags': + $value = array_filter( array_map( 'trim', explode( ',', strip_tags( $value ) ) ) ); + break; + case 'Version': + case 'RequiresWP': + case 'RequiresPHP': + $value = strip_tags( $value ); + break; + } + + return $value; + } + + /** + * Mark up a theme header. + * + * @since 3.4.0 + * + * @staticvar string $comma + * + * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. + * @param string|array $value Value to mark up. An array for Tags header, string otherwise. + * @param string $translate Whether the header has been translated. + * @return string Value, marked up. + */ + private function markup_header( $header, $value, $translate ) { + switch ( $header ) { + case 'Name': + if ( empty( $value ) ) { + $value = esc_html( $this->get_stylesheet() ); + } + break; + case 'Description': + $value = wptexturize( $value ); + break; + case 'Author': + if ( $this->get( 'AuthorURI' ) ) { + $value = sprintf( '<a href="%1$s">%2$s</a>', $this->display( 'AuthorURI', true, $translate ), $value ); + } elseif ( ! $value ) { + $value = __( 'Anonymous' ); + } + break; + case 'Tags': + static $comma = null; + if ( ! isset( $comma ) ) { + /* translators: Used between list items, there is a space after the comma. */ + $comma = __( ', ' ); + } + $value = implode( $comma, $value ); + break; + case 'ThemeURI': + case 'AuthorURI': + $value = esc_url( $value ); + break; + } + + return $value; + } + + /** + * Translate a theme header. + * + * @since 3.4.0 + * + * @staticvar array $tags_list + * + * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. + * @param string|array $value Value to translate. An array for Tags header, string otherwise. + * @return string|array Translated value. An array for Tags header, string otherwise. + */ + private function translate_header( $header, $value ) { + switch ( $header ) { + case 'Name': + // Cached for sorting reasons. + if ( isset( $this->name_translated ) ) { + return $this->name_translated; + } + // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain + $this->name_translated = translate( $value, $this->get( 'TextDomain' ) ); + return $this->name_translated; + case 'Tags': + if ( empty( $value ) || ! function_exists( 'get_theme_feature_list' ) ) { + return $value; + } + + static $tags_list; + if ( ! isset( $tags_list ) ) { + $tags_list = array( + // As of 4.6, deprecated tags which are only used to provide translation for older themes. + 'black' => __( 'Black' ), + 'blue' => __( 'Blue' ), + 'brown' => __( 'Brown' ), + 'gray' => __( 'Gray' ), + 'green' => __( 'Green' ), + 'orange' => __( 'Orange' ), + 'pink' => __( 'Pink' ), + 'purple' => __( 'Purple' ), + 'red' => __( 'Red' ), + 'silver' => __( 'Silver' ), + 'tan' => __( 'Tan' ), + 'white' => __( 'White' ), + 'yellow' => __( 'Yellow' ), + 'dark' => __( 'Dark' ), + 'light' => __( 'Light' ), + 'fixed-layout' => __( 'Fixed Layout' ), + 'fluid-layout' => __( 'Fluid Layout' ), + 'responsive-layout' => __( 'Responsive Layout' ), + 'blavatar' => __( 'Blavatar' ), + 'photoblogging' => __( 'Photoblogging' ), + 'seasonal' => __( 'Seasonal' ), + ); + + $feature_list = get_theme_feature_list( false ); // No API. + foreach ( $feature_list as $tags ) { + $tags_list += $tags; + } + } + + foreach ( $value as &$tag ) { + if ( isset( $tags_list[ $tag ] ) ) { + $tag = $tags_list[ $tag ]; + } elseif ( isset( self::$tag_map[ $tag ] ) ) { + $tag = $tags_list[ self::$tag_map[ $tag ] ]; + } + } + + return $value; + + default: + // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain + $value = translate( $value, $this->get( 'TextDomain' ) ); + } + return $value; + } + + /** + * The directory name of the theme's "stylesheet" files, inside the theme root. + * + * In the case of a child theme, this is directory name of the child theme. + * Otherwise, get_stylesheet() is the same as get_template(). + * + * @since 3.4.0 + * + * @return string Stylesheet + */ + public function get_stylesheet() { + return $this->stylesheet; + } + + /** + * The directory name of the theme's "template" files, inside the theme root. + * + * In the case of a child theme, this is the directory name of the parent theme. + * Otherwise, the get_template() is the same as get_stylesheet(). + * + * @since 3.4.0 + * + * @return string Template + */ + public function get_template() { + return $this->template; + } + + /** + * Returns the absolute path to the directory of a theme's "stylesheet" files. + * + * In the case of a child theme, this is the absolute path to the directory + * of the child theme's files. + * + * @since 3.4.0 + * + * @return string Absolute path of the stylesheet directory. + */ + public function get_stylesheet_directory() { + if ( $this->errors() && in_array( 'theme_root_missing', $this->errors()->get_error_codes() ) ) { + return ''; + } + + return $this->theme_root . '/' . $this->stylesheet; + } + + /** + * Returns the absolute path to the directory of a theme's "template" files. + * + * In the case of a child theme, this is the absolute path to the directory + * of the parent theme's files. + * + * @since 3.4.0 + * + * @return string Absolute path of the template directory. + */ + public function get_template_directory() { + if ( $this->parent() ) { + $theme_root = $this->parent()->theme_root; + } else { + $theme_root = $this->theme_root; + } + + return $theme_root . '/' . $this->template; + } + + /** + * Returns the URL to the directory of a theme's "stylesheet" files. + * + * In the case of a child theme, this is the URL to the directory of the + * child theme's files. + * + * @since 3.4.0 + * + * @return string URL to the stylesheet directory. + */ + public function get_stylesheet_directory_uri() { + return $this->get_theme_root_uri() . '/' . str_replace( '%2F', '/', rawurlencode( $this->stylesheet ) ); + } + + /** + * Returns the URL to the directory of a theme's "template" files. + * + * In the case of a child theme, this is the URL to the directory of the + * parent theme's files. + * + * @since 3.4.0 + * + * @return string URL to the template directory. + */ + public function get_template_directory_uri() { + if ( $this->parent() ) { + $theme_root_uri = $this->parent()->get_theme_root_uri(); + } else { + $theme_root_uri = $this->get_theme_root_uri(); + } + + return $theme_root_uri . '/' . str_replace( '%2F', '/', rawurlencode( $this->template ) ); + } + + /** + * The absolute path to the directory of the theme root. + * + * This is typically the absolute path to wp-content/themes. + * + * @since 3.4.0 + * + * @return string Theme root. + */ + public function get_theme_root() { + return $this->theme_root; + } + + /** + * Returns the URL to the directory of the theme root. + * + * This is typically the absolute URL to wp-content/themes. This forms the basis + * for all other URLs returned by WP_Theme, so we pass it to the public function + * get_theme_root_uri() and allow it to run the {@see 'theme_root_uri'} filter. + * + * @since 3.4.0 + * + * @return string Theme root URI. + */ + public function get_theme_root_uri() { + if ( ! isset( $this->theme_root_uri ) ) { + $this->theme_root_uri = get_theme_root_uri( $this->stylesheet, $this->theme_root ); + } + return $this->theme_root_uri; + } + + /** + * Returns the main screenshot file for the theme. + * + * The main screenshot is called screenshot.png. gif and jpg extensions are also allowed. + * + * Screenshots for a theme must be in the stylesheet directory. (In the case of child + * themes, parent theme screenshots are not inherited.) + * + * @since 3.4.0 + * + * @param string $uri Type of URL to return, either 'relative' or an absolute URI. Defaults to absolute URI. + * @return string|false Screenshot file. False if the theme does not have a screenshot. + */ + public function get_screenshot( $uri = 'uri' ) { + $screenshot = $this->cache_get( 'screenshot' ); + if ( $screenshot ) { + if ( 'relative' == $uri ) { + return $screenshot; + } + return $this->get_stylesheet_directory_uri() . '/' . $screenshot; + } elseif ( 0 === $screenshot ) { + return false; + } + + foreach ( array( 'png', 'gif', 'jpg', 'jpeg' ) as $ext ) { + if ( file_exists( $this->get_stylesheet_directory() . "/screenshot.$ext" ) ) { + $this->cache_add( 'screenshot', 'screenshot.' . $ext ); + if ( 'relative' == $uri ) { + return 'screenshot.' . $ext; + } + return $this->get_stylesheet_directory_uri() . '/' . 'screenshot.' . $ext; + } + } + + $this->cache_add( 'screenshot', 0 ); + return false; + } + + /** + * Return files in the theme's directory. + * + * @since 3.4.0 + * + * @param string[]|string $type Optional. Array of extensions to find, string of a single extension, + * or null for all extensions. Default null. + * @param int $depth Optional. How deep to search for files. Defaults to a flat scan (0 depth). + * -1 depth is infinite. + * @param bool $search_parent Optional. Whether to return parent files. Default false. + * @return string[] Array of files, keyed by the path to the file relative to the theme's directory, with the values + * being absolute paths. + */ + public function get_files( $type = null, $depth = 0, $search_parent = false ) { + $files = (array) self::scandir( $this->get_stylesheet_directory(), $type, $depth ); + + if ( $search_parent && $this->parent() ) { + $files += (array) self::scandir( $this->get_template_directory(), $type, $depth ); + } + + return $files; + } + + /** + * Returns the theme's post templates. + * + * @since 4.7.0 + * + * @return string Array of page templates, keyed by filename and post type, + * with the value of the translated header name. + */ + public function get_post_templates() { + // If you screw up your current theme and we invalidate your parent, most things still work. Let it slide. + if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) ) { + return array(); + } + + $post_templates = $this->cache_get( 'post_templates' ); + + if ( ! is_array( $post_templates ) ) { + $post_templates = array(); + + $files = (array) $this->get_files( 'php', 1, true ); + + foreach ( $files as $file => $full_path ) { + if ( ! preg_match( '|Template Name:(.*)$|mi', file_get_contents( $full_path ), $header ) ) { + continue; + } + + $types = array( 'page' ); + if ( preg_match( '|Template Post Type:(.*)$|mi', file_get_contents( $full_path ), $type ) ) { + $types = explode( ',', _cleanup_header_comment( $type[1] ) ); + } + + foreach ( $types as $type ) { + $type = sanitize_key( $type ); + if ( ! isset( $post_templates[ $type ] ) ) { + $post_templates[ $type ] = array(); + } + + $post_templates[ $type ][ $file ] = _cleanup_header_comment( $header[1] ); + } + } + + $this->cache_add( 'post_templates', $post_templates ); + } + + if ( $this->load_textdomain() ) { + foreach ( $post_templates as &$post_type ) { + foreach ( $post_type as &$post_template ) { + $post_template = $this->translate_header( 'Template Name', $post_template ); + } + } + } + + return $post_templates; + } + + /** + * Returns the theme's post templates for a given post type. + * + * @since 3.4.0 + * @since 4.7.0 Added the `$post_type` parameter. + * + * @param WP_Post|null $post Optional. The post being edited, provided for context. + * @param string $post_type Optional. Post type to get the templates for. Default 'page'. + * If a post is provided, its post type is used. + * @return string[] Array of template header names keyed by the template file name. + */ + public function get_page_templates( $post = null, $post_type = 'page' ) { + if ( $post ) { + $post_type = get_post_type( $post ); + } + + $post_templates = $this->get_post_templates(); + $post_templates = isset( $post_templates[ $post_type ] ) ? $post_templates[ $post_type ] : array(); + + /** + * Filters list of page templates for a theme. + * + * @since 4.9.6 + * + * @param string[] $post_templates Array of template header names keyed by the template file name. + * @param WP_Theme $this The theme object. + * @param WP_Post|null $post The post being edited, provided for context, or null. + * @param string $post_type Post type to get the templates for. + */ + $post_templates = (array) apply_filters( 'theme_templates', $post_templates, $this, $post, $post_type ); + + /** + * Filters list of page templates for a theme. + * + * The dynamic portion of the hook name, `$post_type`, refers to the post type. + * + * @since 3.9.0 + * @since 4.4.0 Converted to allow complete control over the `$page_templates` array. + * @since 4.7.0 Added the `$post_type` parameter. + * + * @param string[] $post_templates Array of template header names keyed by the template file name. + * @param WP_Theme $this The theme object. + * @param WP_Post|null $post The post being edited, provided for context, or null. + * @param string $post_type Post type to get the templates for. + */ + $post_templates = (array) apply_filters( "theme_{$post_type}_templates", $post_templates, $this, $post, $post_type ); + + return $post_templates; + } + + /** + * Scans a directory for files of a certain extension. + * + * @since 3.4.0 + * + * @param string $path Absolute path to search. + * @param array|string|null $extensions Optional. Array of extensions to find, string of a single extension, + * or null for all extensions. Default null. + * @param int $depth Optional. How many levels deep to search for files. Accepts 0, 1+, or + * -1 (infinite depth). Default 0. + * @param string $relative_path Optional. The basename of the absolute path. Used to control the + * returned path for the found files, particularly when this function + * recurses to lower depths. Default empty. + * @return string[]|false Array of files, keyed by the path to the file relative to the `$path` directory prepended + * with `$relative_path`, with the values being absolute paths. False otherwise. + */ + private static function scandir( $path, $extensions = null, $depth = 0, $relative_path = '' ) { + if ( ! is_dir( $path ) ) { + return false; + } + + if ( $extensions ) { + $extensions = (array) $extensions; + $_extensions = implode( '|', $extensions ); + } + + $relative_path = trailingslashit( $relative_path ); + if ( '/' == $relative_path ) { + $relative_path = ''; + } + + $results = scandir( $path ); + $files = array(); + + /** + * Filters the array of excluded directories and files while scanning theme folder. + * + * @since 4.7.4 + * + * @param string[] $exclusions Array of excluded directories and files. + */ + $exclusions = (array) apply_filters( 'theme_scandir_exclusions', array( 'CVS', 'node_modules', 'vendor', 'bower_components' ) ); + + foreach ( $results as $result ) { + if ( '.' == $result[0] || in_array( $result, $exclusions, true ) ) { + continue; + } + if ( is_dir( $path . '/' . $result ) ) { + if ( ! $depth ) { + continue; + } + $found = self::scandir( $path . '/' . $result, $extensions, $depth - 1, $relative_path . $result ); + $files = array_merge_recursive( $files, $found ); + } elseif ( ! $extensions || preg_match( '~\.(' . $_extensions . ')$~', $result ) ) { + $files[ $relative_path . $result ] = $path . '/' . $result; + } + } + + return $files; + } + + /** + * Loads the theme's textdomain. + * + * Translation files are not inherited from the parent theme. TODO: If this fails for the + * child theme, it should probably try to load the parent theme's translations. + * + * @since 3.4.0 + * + * @return bool True if the textdomain was successfully loaded or has already been loaded. + * False if no textdomain was specified in the file headers, or if the domain could not be loaded. + */ + public function load_textdomain() { + if ( isset( $this->textdomain_loaded ) ) { + return $this->textdomain_loaded; + } + + $textdomain = $this->get( 'TextDomain' ); + if ( ! $textdomain ) { + $this->textdomain_loaded = false; + return false; + } + + if ( is_textdomain_loaded( $textdomain ) ) { + $this->textdomain_loaded = true; + return true; + } + + $path = $this->get_stylesheet_directory(); + $domainpath = $this->get( 'DomainPath' ); + if ( $domainpath ) { + $path .= $domainpath; + } else { + $path .= '/languages'; + } + + $this->textdomain_loaded = load_theme_textdomain( $textdomain, $path ); + return $this->textdomain_loaded; + } + + /** + * Whether the theme is allowed (multisite only). + * + * @since 3.4.0 + * + * @param string $check Optional. Whether to check only the 'network'-wide settings, the 'site' + * settings, or 'both'. Defaults to 'both'. + * @param int $blog_id Optional. Ignored if only network-wide settings are checked. Defaults to current site. + * @return bool Whether the theme is allowed for the network. Returns true in single-site. + */ + public function is_allowed( $check = 'both', $blog_id = null ) { + if ( ! is_multisite() ) { + return true; + } + + if ( 'both' == $check || 'network' == $check ) { + $allowed = self::get_allowed_on_network(); + if ( ! empty( $allowed[ $this->get_stylesheet() ] ) ) { + return true; + } + } + + if ( 'both' == $check || 'site' == $check ) { + $allowed = self::get_allowed_on_site( $blog_id ); + if ( ! empty( $allowed[ $this->get_stylesheet() ] ) ) { + return true; + } + } + + return false; + } + + /** + * Determines the latest WordPress default theme that is installed. + * + * This hits the filesystem. + * + * @since 4.4.0 + * + * @return WP_Theme|false Object, or false if no theme is installed, which would be bad. + */ + public static function get_core_default_theme() { + foreach ( array_reverse( self::$default_themes ) as $slug => $name ) { + $theme = wp_get_theme( $slug ); + if ( $theme->exists() ) { + return $theme; + } + } + return false; + } + + /** + * Returns array of stylesheet names of themes allowed on the site or network. + * + * @since 3.4.0 + * + * @param int $blog_id Optional. ID of the site. Defaults to the current site. + * @return string[] Array of stylesheet names. + */ + public static function get_allowed( $blog_id = null ) { + /** + * Filters the array of themes allowed on the network. + * + * Site is provided as context so that a list of network allowed themes can + * be filtered further. + * + * @since 4.5.0 + * + * @param string[] $allowed_themes An array of theme stylesheet names. + * @param int $blog_id ID of the site. + */ + $network = (array) apply_filters( 'network_allowed_themes', self::get_allowed_on_network(), $blog_id ); + return $network + self::get_allowed_on_site( $blog_id ); + } + + /** + * Returns array of stylesheet names of themes allowed on the network. + * + * @since 3.4.0 + * + * @staticvar array $allowed_themes + * + * @return string[] Array of stylesheet names. + */ + public static function get_allowed_on_network() { + static $allowed_themes; + if ( ! isset( $allowed_themes ) ) { + $allowed_themes = (array) get_site_option( 'allowedthemes' ); + } + + /** + * Filters the array of themes allowed on the network. + * + * @since MU (3.0.0) + * + * @param string[] $allowed_themes An array of theme stylesheet names. + */ + $allowed_themes = apply_filters( 'allowed_themes', $allowed_themes ); + + return $allowed_themes; + } + + /** + * Returns array of stylesheet names of themes allowed on the site. + * + * @since 3.4.0 + * + * @staticvar array $allowed_themes + * + * @param int $blog_id Optional. ID of the site. Defaults to the current site. + * @return string[] Array of stylesheet names. + */ + public static function get_allowed_on_site( $blog_id = null ) { + static $allowed_themes = array(); + + if ( ! $blog_id || ! is_multisite() ) { + $blog_id = get_current_blog_id(); + } + + if ( isset( $allowed_themes[ $blog_id ] ) ) { + /** + * Filters the array of themes allowed on the site. + * + * @since 4.5.0 + * + * @param string[] $allowed_themes An array of theme stylesheet names. + * @param int $blog_id ID of the site. Defaults to current site. + */ + return (array) apply_filters( 'site_allowed_themes', $allowed_themes[ $blog_id ], $blog_id ); + } + + $current = get_current_blog_id() == $blog_id; + + if ( $current ) { + $allowed_themes[ $blog_id ] = get_option( 'allowedthemes' ); + } else { + switch_to_blog( $blog_id ); + $allowed_themes[ $blog_id ] = get_option( 'allowedthemes' ); + restore_current_blog(); + } + + // This is all super old MU back compat joy. + // 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name. + if ( false === $allowed_themes[ $blog_id ] ) { + if ( $current ) { + $allowed_themes[ $blog_id ] = get_option( 'allowed_themes' ); + } else { + switch_to_blog( $blog_id ); + $allowed_themes[ $blog_id ] = get_option( 'allowed_themes' ); + restore_current_blog(); + } + + if ( ! is_array( $allowed_themes[ $blog_id ] ) || empty( $allowed_themes[ $blog_id ] ) ) { + $allowed_themes[ $blog_id ] = array(); + } else { + $converted = array(); + $themes = wp_get_themes(); + foreach ( $themes as $stylesheet => $theme_data ) { + if ( isset( $allowed_themes[ $blog_id ][ $theme_data->get( 'Name' ) ] ) ) { + $converted[ $stylesheet ] = true; + } + } + $allowed_themes[ $blog_id ] = $converted; + } + // Set the option so we never have to go through this pain again. + if ( is_admin() && $allowed_themes[ $blog_id ] ) { + if ( $current ) { + update_option( 'allowedthemes', $allowed_themes[ $blog_id ] ); + delete_option( 'allowed_themes' ); + } else { + switch_to_blog( $blog_id ); + update_option( 'allowedthemes', $allowed_themes[ $blog_id ] ); + delete_option( 'allowed_themes' ); + restore_current_blog(); + } + } + } + + /** This filter is documented in wp-includes/class-wp-theme.php */ + return (array) apply_filters( 'site_allowed_themes', $allowed_themes[ $blog_id ], $blog_id ); + } + + /** + * Enables a theme for all sites on the current network. + * + * @since 4.6.0 + * + * @param string|string[] $stylesheets Stylesheet name or array of stylesheet names. + */ + public static function network_enable_theme( $stylesheets ) { + if ( ! is_multisite() ) { + return; + } + + if ( ! is_array( $stylesheets ) ) { + $stylesheets = array( $stylesheets ); + } + + $allowed_themes = get_site_option( 'allowedthemes' ); + foreach ( $stylesheets as $stylesheet ) { + $allowed_themes[ $stylesheet ] = true; + } + + update_site_option( 'allowedthemes', $allowed_themes ); + } + + /** + * Disables a theme for all sites on the current network. + * + * @since 4.6.0 + * + * @param string|string[] $stylesheets Stylesheet name or array of stylesheet names. + */ + public static function network_disable_theme( $stylesheets ) { + if ( ! is_multisite() ) { + return; + } + + if ( ! is_array( $stylesheets ) ) { + $stylesheets = array( $stylesheets ); + } + + $allowed_themes = get_site_option( 'allowedthemes' ); + foreach ( $stylesheets as $stylesheet ) { + if ( isset( $allowed_themes[ $stylesheet ] ) ) { + unset( $allowed_themes[ $stylesheet ] ); + } + } + + update_site_option( 'allowedthemes', $allowed_themes ); + } + + /** + * Sorts themes by name. + * + * @since 3.4.0 + * + * @param WP_Theme[] $themes Array of theme objects to sort (passed by reference). + */ + public static function sort_by_name( &$themes ) { + if ( 0 === strpos( get_user_locale(), 'en_' ) ) { + uasort( $themes, array( 'WP_Theme', '_name_sort' ) ); + } else { + foreach ( $themes as $key => $theme ) { + $theme->translate_header( 'Name', $theme->headers['Name'] ); + } + uasort( $themes, array( 'WP_Theme', '_name_sort_i18n' ) ); + } + } + + /** + * Callback function for usort() to naturally sort themes by name. + * + * Accesses the Name header directly from the class for maximum speed. + * Would choke on HTML but we don't care enough to slow it down with strip_tags(). + * + * @since 3.4.0 + * + * @param string $a First name. + * @param string $b Second name. + * @return int Negative if `$a` falls lower in the natural order than `$b`. Zero if they fall equally. + * Greater than 0 if `$a` falls higher in the natural order than `$b`. Used with usort(). + */ + private static function _name_sort( $a, $b ) { + return strnatcasecmp( $a->headers['Name'], $b->headers['Name'] ); + } + + /** + * Callback function for usort() to naturally sort themes by translated name. + * + * @since 3.4.0 + * + * @param string $a First name. + * @param string $b Second name. + * @return int Negative if `$a` falls lower in the natural order than `$b`. Zero if they fall equally. + * Greater than 0 if `$a` falls higher in the natural order than `$b`. Used with usort(). + */ + private static function _name_sort_i18n( $a, $b ) { + return strnatcasecmp( $a->name_translated, $b->name_translated ); + } +} diff --git a/wp-includes/class-wp-user-meta-session-tokens.php b/wp-includes/class-wp-user-meta-session-tokens.php new file mode 100644 index 0000000..d2e2726 --- /dev/null +++ b/wp-includes/class-wp-user-meta-session-tokens.php @@ -0,0 +1,133 @@ +<?php +/** + * Session API: WP_User_Meta_Session_Tokens class + * + * @package WordPress + * @subpackage Session + * @since 4.7.0 + */ + +/** + * Meta-based user sessions token manager. + * + * @since 4.0.0 + * + * @see WP_Session_Tokens + */ +class WP_User_Meta_Session_Tokens extends WP_Session_Tokens { + + /** + * Retrieves all sessions of the user. + * + * @since 4.0.0 + * + * @return array Sessions of the user. + */ + protected function get_sessions() { + $sessions = get_user_meta( $this->user_id, 'session_tokens', true ); + + if ( ! is_array( $sessions ) ) { + return array(); + } + + $sessions = array_map( array( $this, 'prepare_session' ), $sessions ); + return array_filter( $sessions, array( $this, 'is_still_valid' ) ); + } + + /** + * Converts an expiration to an array of session information. + * + * @param mixed $session Session or expiration. + * @return array Session. + */ + protected function prepare_session( $session ) { + if ( is_int( $session ) ) { + return array( 'expiration' => $session ); + } + + return $session; + } + + /** + * Retrieves a session based on its verifier (token hash). + * + * @since 4.0.0 + * + * @param string $verifier Verifier for the session to retrieve. + * @return array|null The session, or null if it does not exist + */ + protected function get_session( $verifier ) { + $sessions = $this->get_sessions(); + + if ( isset( $sessions[ $verifier ] ) ) { + return $sessions[ $verifier ]; + } + + return null; + } + + /** + * Updates a session based on its verifier (token hash). + * + * @since 4.0.0 + * + * @param string $verifier Verifier for the session to update. + * @param array $session Optional. Session. Omitting this argument destroys the session. + */ + protected function update_session( $verifier, $session = null ) { + $sessions = $this->get_sessions(); + + if ( $session ) { + $sessions[ $verifier ] = $session; + } else { + unset( $sessions[ $verifier ] ); + } + + $this->update_sessions( $sessions ); + } + + /** + * Updates the user's sessions in the usermeta table. + * + * @since 4.0.0 + * + * @param array $sessions Sessions. + */ + protected function update_sessions( $sessions ) { + if ( $sessions ) { + update_user_meta( $this->user_id, 'session_tokens', $sessions ); + } else { + delete_user_meta( $this->user_id, 'session_tokens' ); + } + } + + /** + * Destroys all sessions for this user, except the single session with the given verifier. + * + * @since 4.0.0 + * + * @param string $verifier Verifier of the session to keep. + */ + protected function destroy_other_sessions( $verifier ) { + $session = $this->get_session( $verifier ); + $this->update_sessions( array( $verifier => $session ) ); + } + + /** + * Destroys all session tokens for the user. + * + * @since 4.0.0 + */ + protected function destroy_all_sessions() { + $this->update_sessions( array() ); + } + + /** + * Destroys all sessions for all users. + * + * @since 4.0.0 + */ + public static function drop_sessions() { + delete_metadata( 'user', 0, 'session_tokens', false, true ); + } +} diff --git a/wp-includes/class-wp-user-query.php b/wp-includes/class-wp-user-query.php new file mode 100644 index 0000000..afee925 --- /dev/null +++ b/wp-includes/class-wp-user-query.php @@ -0,0 +1,893 @@ +<?php +/** + * User API: WP_User_Query class + * + * @package WordPress + * @subpackage Users + * @since 4.4.0 + */ + +/** + * Core class used for querying users. + * + * @since 3.1.0 + * + * @see WP_User_Query::prepare_query() for information on accepted arguments. + */ +class WP_User_Query { + + /** + * Query vars, after parsing + * + * @since 3.5.0 + * @var array + */ + public $query_vars = array(); + + /** + * List of found user ids + * + * @since 3.1.0 + * @var array + */ + private $results; + + /** + * Total number of found users for the current query + * + * @since 3.1.0 + * @var int + */ + private $total_users = 0; + + /** + * Metadata query container. + * + * @since 4.2.0 + * @var WP_Meta_Query + */ + public $meta_query = false; + + /** + * The SQL query used to fetch matching users. + * + * @since 4.4.0 + * @var string + */ + public $request; + + private $compat_fields = array( 'results', 'total_users' ); + + // SQL clauses. + public $query_fields; + public $query_from; + public $query_where; + public $query_orderby; + public $query_limit; + + /** + * PHP5 constructor. + * + * @since 3.1.0 + * + * @param null|string|array $query Optional. The query variables. + */ + public function __construct( $query = null ) { + if ( ! empty( $query ) ) { + $this->prepare_query( $query ); + $this->query(); + } + } + + /** + * Fills in missing query variables with default values. + * + * @since 4.4.0 + * + * @param array $args Query vars, as passed to `WP_User_Query`. + * @return array Complete query variables with undefined ones filled in with defaults. + */ + public static function fill_query_vars( $args ) { + $defaults = array( + 'blog_id' => get_current_blog_id(), + 'role' => '', + 'role__in' => array(), + 'role__not_in' => array(), + 'meta_key' => '', + 'meta_value' => '', + 'meta_compare' => '', + 'include' => array(), + 'exclude' => array(), + 'search' => '', + 'search_columns' => array(), + 'orderby' => 'login', + 'order' => 'ASC', + 'offset' => '', + 'number' => '', + 'paged' => 1, + 'count_total' => true, + 'fields' => 'all', + 'who' => '', + 'has_published_posts' => null, + 'nicename' => '', + 'nicename__in' => array(), + 'nicename__not_in' => array(), + 'login' => '', + 'login__in' => array(), + 'login__not_in' => array(), + ); + + return wp_parse_args( $args, $defaults ); + } + + /** + * Prepare the query variables. + * + * @since 3.1.0 + * @since 4.1.0 Added the ability to order by the `include` value. + * @since 4.2.0 Added 'meta_value_num' support for `$orderby` parameter. Added multi-dimensional array syntax + * for `$orderby` parameter. + * @since 4.3.0 Added 'has_published_posts' parameter. + * @since 4.4.0 Added 'paged', 'role__in', and 'role__not_in' parameters. The 'role' parameter was updated to + * permit an array or comma-separated list of values. The 'number' parameter was updated to support + * querying for all users with using -1. + * @since 4.7.0 Added 'nicename', 'nicename__in', 'nicename__not_in', 'login', 'login__in', + * and 'login__not_in' parameters. + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global int $blog_id + * + * @param string|array $query { + * Optional. Array or string of Query parameters. + * + * @type int $blog_id The site ID. Default is the current site. + * @type string|array $role An array or a comma-separated list of role names that users must match + * to be included in results. Note that this is an inclusive list: users + * must match *each* role. Default empty. + * @type array $role__in An array of role names. Matched users must have at least one of these + * roles. Default empty array. + * @type array $role__not_in An array of role names to exclude. Users matching one or more of these + * roles will not be included in results. Default empty array. + * @type string $meta_key User meta key. Default empty. + * @type string $meta_value User meta value. Default empty. + * @type string $meta_compare Comparison operator to test the `$meta_value`. Accepts '=', '!=', + * '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', + * 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP', + * 'NOT REGEXP', or 'RLIKE'. Default '='. + * @type array $include An array of user IDs to include. Default empty array. + * @type array $exclude An array of user IDs to exclude. Default empty array. + * @type string $search Search keyword. Searches for possible string matches on columns. + * When `$search_columns` is left empty, it tries to determine which + * column to search in based on search string. Default empty. + * @type array $search_columns Array of column names to be searched. Accepts 'ID', 'user_login', + * 'user_email', 'user_url', 'user_nicename', 'display_name'. + * Default empty array. + * @type string|array $orderby Field(s) to sort the retrieved users by. May be a single value, + * an array of values, or a multi-dimensional array with fields as + * keys and orders ('ASC' or 'DESC') as values. Accepted values are + * 'ID', 'display_name' (or 'name'), 'include', 'user_login' + * (or 'login'), 'login__in', 'user_nicename' (or 'nicename'), + * 'nicename__in', 'user_email (or 'email'), 'user_url' (or 'url'), + * 'user_registered' (or 'registered'), 'post_count', 'meta_value', + * 'meta_value_num', the value of `$meta_key`, or an array key of + * `$meta_query`. To use 'meta_value' or 'meta_value_num', `$meta_key` + * must be also be defined. Default 'user_login'. + * @type string $order Designates ascending or descending order of users. Order values + * passed as part of an `$orderby` array take precedence over this + * parameter. Accepts 'ASC', 'DESC'. Default 'ASC'. + * @type int $offset Number of users to offset in retrieved results. Can be used in + * conjunction with pagination. Default 0. + * @type int $number Number of users to limit the query for. Can be used in + * conjunction with pagination. Value -1 (all) is supported, but + * should be used with caution on larger sites. + * Default -1 (all users). + * @type int $paged When used with number, defines the page of results to return. + * Default 1. + * @type bool $count_total Whether to count the total number of users found. If pagination + * is not needed, setting this to false can improve performance. + * Default true. + * @type string|array $fields Which fields to return. Single or all fields (string), or array + * of fields. Accepts 'ID', 'display_name', 'user_login', + * 'user_nicename', 'user_email', 'user_url', 'user_registered'. + * Use 'all' for all fields and 'all_with_meta' to include + * meta fields. Default 'all'. + * @type string $who Type of users to query. Accepts 'authors'. + * Default empty (all users). + * @type bool|array $has_published_posts Pass an array of post types to filter results to users who have + * published posts in those post types. `true` is an alias for all + * public post types. + * @type string $nicename The user nicename. Default empty. + * @type array $nicename__in An array of nicenames to include. Users matching one of these + * nicenames will be included in results. Default empty array. + * @type array $nicename__not_in An array of nicenames to exclude. Users matching one of these + * nicenames will not be included in results. Default empty array. + * @type string $login The user login. Default empty. + * @type array $login__in An array of logins to include. Users matching one of these + * logins will be included in results. Default empty array. + * @type array $login__not_in An array of logins to exclude. Users matching one of these + * logins will not be included in results. Default empty array. + * } + */ + public function prepare_query( $query = array() ) { + global $wpdb; + + if ( empty( $this->query_vars ) || ! empty( $query ) ) { + $this->query_limit = null; + $this->query_vars = $this->fill_query_vars( $query ); + } + + /** + * Fires before the WP_User_Query has been parsed. + * + * The passed WP_User_Query object contains the query variables, not + * yet passed into SQL. + * + * @since 4.0.0 + * + * @param WP_User_Query $this The current WP_User_Query instance, + * passed by reference. + */ + do_action( 'pre_get_users', $this ); + + // Ensure that query vars are filled after 'pre_get_users'. + $qv =& $this->query_vars; + $qv = $this->fill_query_vars( $qv ); + + if ( is_array( $qv['fields'] ) ) { + $qv['fields'] = array_unique( $qv['fields'] ); + + $this->query_fields = array(); + foreach ( $qv['fields'] as $field ) { + $field = 'ID' === $field ? 'ID' : sanitize_key( $field ); + $this->query_fields[] = "$wpdb->users.$field"; + } + $this->query_fields = implode( ',', $this->query_fields ); + } elseif ( 'all' == $qv['fields'] ) { + $this->query_fields = "$wpdb->users.*"; + } else { + $this->query_fields = "$wpdb->users.ID"; + } + + if ( isset( $qv['count_total'] ) && $qv['count_total'] ) { + $this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields; + } + + $this->query_from = "FROM $wpdb->users"; + $this->query_where = 'WHERE 1=1'; + + // Parse and sanitize 'include', for use by 'orderby' as well as 'include' below. + if ( ! empty( $qv['include'] ) ) { + $include = wp_parse_id_list( $qv['include'] ); + } else { + $include = false; + } + + $blog_id = 0; + if ( isset( $qv['blog_id'] ) ) { + $blog_id = absint( $qv['blog_id'] ); + } + + if ( $qv['has_published_posts'] && $blog_id ) { + if ( true === $qv['has_published_posts'] ) { + $post_types = get_post_types( array( 'public' => true ) ); + } else { + $post_types = (array) $qv['has_published_posts']; + } + + foreach ( $post_types as &$post_type ) { + $post_type = $wpdb->prepare( '%s', $post_type ); + } + + $posts_table = $wpdb->get_blog_prefix( $blog_id ) . 'posts'; + $this->query_where .= " AND $wpdb->users.ID IN ( SELECT DISTINCT $posts_table.post_author FROM $posts_table WHERE $posts_table.post_status = 'publish' AND $posts_table.post_type IN ( " . join( ', ', $post_types ) . ' ) )'; + } + + // nicename + if ( '' !== $qv['nicename'] ) { + $this->query_where .= $wpdb->prepare( ' AND user_nicename = %s', $qv['nicename'] ); + } + + if ( ! empty( $qv['nicename__in'] ) ) { + $sanitized_nicename__in = array_map( 'esc_sql', $qv['nicename__in'] ); + $nicename__in = implode( "','", $sanitized_nicename__in ); + $this->query_where .= " AND user_nicename IN ( '$nicename__in' )"; + } + + if ( ! empty( $qv['nicename__not_in'] ) ) { + $sanitized_nicename__not_in = array_map( 'esc_sql', $qv['nicename__not_in'] ); + $nicename__not_in = implode( "','", $sanitized_nicename__not_in ); + $this->query_where .= " AND user_nicename NOT IN ( '$nicename__not_in' )"; + } + + // login + if ( '' !== $qv['login'] ) { + $this->query_where .= $wpdb->prepare( ' AND user_login = %s', $qv['login'] ); + } + + if ( ! empty( $qv['login__in'] ) ) { + $sanitized_login__in = array_map( 'esc_sql', $qv['login__in'] ); + $login__in = implode( "','", $sanitized_login__in ); + $this->query_where .= " AND user_login IN ( '$login__in' )"; + } + + if ( ! empty( $qv['login__not_in'] ) ) { + $sanitized_login__not_in = array_map( 'esc_sql', $qv['login__not_in'] ); + $login__not_in = implode( "','", $sanitized_login__not_in ); + $this->query_where .= " AND user_login NOT IN ( '$login__not_in' )"; + } + + // Meta query. + $this->meta_query = new WP_Meta_Query(); + $this->meta_query->parse_query_vars( $qv ); + + if ( isset( $qv['who'] ) && 'authors' == $qv['who'] && $blog_id ) { + $who_query = array( + 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'user_level', + 'value' => 0, + 'compare' => '!=', + ); + + // Prevent extra meta query. + $qv['blog_id'] = 0; + $blog_id = 0; + + if ( empty( $this->meta_query->queries ) ) { + $this->meta_query->queries = array( $who_query ); + } else { + // Append the cap query to the original queries and reparse the query. + $this->meta_query->queries = array( + 'relation' => 'AND', + array( $this->meta_query->queries, $who_query ), + ); + } + + $this->meta_query->parse_query_vars( $this->meta_query->queries ); + } + + $roles = array(); + if ( isset( $qv['role'] ) ) { + if ( is_array( $qv['role'] ) ) { + $roles = $qv['role']; + } elseif ( is_string( $qv['role'] ) && ! empty( $qv['role'] ) ) { + $roles = array_map( 'trim', explode( ',', $qv['role'] ) ); + } + } + + $role__in = array(); + if ( isset( $qv['role__in'] ) ) { + $role__in = (array) $qv['role__in']; + } + + $role__not_in = array(); + if ( isset( $qv['role__not_in'] ) ) { + $role__not_in = (array) $qv['role__not_in']; + } + + if ( $blog_id && ( ! empty( $roles ) || ! empty( $role__in ) || ! empty( $role__not_in ) || is_multisite() ) ) { + $role_queries = array(); + + $roles_clauses = array( 'relation' => 'AND' ); + if ( ! empty( $roles ) ) { + foreach ( $roles as $role ) { + $roles_clauses[] = array( + 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', + 'value' => '"' . $role . '"', + 'compare' => 'LIKE', + ); + } + + $role_queries[] = $roles_clauses; + } + + $role__in_clauses = array( 'relation' => 'OR' ); + if ( ! empty( $role__in ) ) { + foreach ( $role__in as $role ) { + $role__in_clauses[] = array( + 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', + 'value' => '"' . $role . '"', + 'compare' => 'LIKE', + ); + } + + $role_queries[] = $role__in_clauses; + } + + $role__not_in_clauses = array( 'relation' => 'AND' ); + if ( ! empty( $role__not_in ) ) { + foreach ( $role__not_in as $role ) { + $role__not_in_clauses[] = array( + 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', + 'value' => '"' . $role . '"', + 'compare' => 'NOT LIKE', + ); + } + + $role_queries[] = $role__not_in_clauses; + } + + // If there are no specific roles named, make sure the user is a member of the site. + if ( empty( $role_queries ) ) { + $role_queries[] = array( + 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', + 'compare' => 'EXISTS', + ); + } + + // Specify that role queries should be joined with AND. + $role_queries['relation'] = 'AND'; + + if ( empty( $this->meta_query->queries ) ) { + $this->meta_query->queries = $role_queries; + } else { + // Append the cap query to the original queries and reparse the query. + $this->meta_query->queries = array( + 'relation' => 'AND', + array( $this->meta_query->queries, $role_queries ), + ); + } + + $this->meta_query->parse_query_vars( $this->meta_query->queries ); + } + + if ( ! empty( $this->meta_query->queries ) ) { + $clauses = $this->meta_query->get_sql( 'user', $wpdb->users, 'ID', $this ); + $this->query_from .= $clauses['join']; + $this->query_where .= $clauses['where']; + + if ( $this->meta_query->has_or_relation() ) { + $this->query_fields = 'DISTINCT ' . $this->query_fields; + } + } + + // Sorting. + $qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : ''; + $order = $this->parse_order( $qv['order'] ); + + if ( empty( $qv['orderby'] ) ) { + // Default order is by 'user_login'. + $ordersby = array( 'user_login' => $order ); + } elseif ( is_array( $qv['orderby'] ) ) { + $ordersby = $qv['orderby']; + } else { + // 'orderby' values may be a comma- or space-separated list. + $ordersby = preg_split( '/[,\s]+/', $qv['orderby'] ); + } + + $orderby_array = array(); + foreach ( $ordersby as $_key => $_value ) { + if ( ! $_value ) { + continue; + } + + if ( is_int( $_key ) ) { + // Integer key means this is a flat array of 'orderby' fields. + $_orderby = $_value; + $_order = $order; + } else { + // Non-integer key means this the key is the field and the value is ASC/DESC. + $_orderby = $_key; + $_order = $_value; + } + + $parsed = $this->parse_orderby( $_orderby ); + + if ( ! $parsed ) { + continue; + } + + if ( 'nicename__in' === $_orderby || 'login__in' === $_orderby ) { + $orderby_array[] = $parsed; + } else { + $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); + } + } + + // If no valid clauses were found, order by user_login. + if ( empty( $orderby_array ) ) { + $orderby_array[] = "user_login $order"; + } + + $this->query_orderby = 'ORDER BY ' . implode( ', ', $orderby_array ); + + // Limit. + if ( isset( $qv['number'] ) && $qv['number'] > 0 ) { + if ( $qv['offset'] ) { + $this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['offset'], $qv['number'] ); + } else { + $this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['number'] * ( $qv['paged'] - 1 ), $qv['number'] ); + } + } + + $search = ''; + if ( isset( $qv['search'] ) ) { + $search = trim( $qv['search'] ); + } + + if ( $search ) { + $leading_wild = ( ltrim( $search, '*' ) != $search ); + $trailing_wild = ( rtrim( $search, '*' ) != $search ); + if ( $leading_wild && $trailing_wild ) { + $wild = 'both'; + } elseif ( $leading_wild ) { + $wild = 'leading'; + } elseif ( $trailing_wild ) { + $wild = 'trailing'; + } else { + $wild = false; + } + if ( $wild ) { + $search = trim( $search, '*' ); + } + + $search_columns = array(); + if ( $qv['search_columns'] ) { + $search_columns = array_intersect( $qv['search_columns'], array( 'ID', 'user_login', 'user_email', 'user_url', 'user_nicename', 'display_name' ) ); + } + if ( ! $search_columns ) { + if ( false !== strpos( $search, '@' ) ) { + $search_columns = array( 'user_email' ); + } elseif ( is_numeric( $search ) ) { + $search_columns = array( 'user_login', 'ID' ); + } elseif ( preg_match( '|^https?://|', $search ) && ! ( is_multisite() && wp_is_large_network( 'users' ) ) ) { + $search_columns = array( 'user_url' ); + } else { + $search_columns = array( 'user_login', 'user_url', 'user_email', 'user_nicename', 'display_name' ); + } + } + + /** + * Filters the columns to search in a WP_User_Query search. + * + * The default columns depend on the search term, and include 'ID', 'user_login', + * 'user_email', 'user_url', 'user_nicename', and 'display_name'. + * + * @since 3.6.0 + * + * @param string[] $search_columns Array of column names to be searched. + * @param string $search Text being searched. + * @param WP_User_Query $this The current WP_User_Query instance. + */ + $search_columns = apply_filters( 'user_search_columns', $search_columns, $search, $this ); + + $this->query_where .= $this->get_search_sql( $search, $search_columns, $wild ); + } + + if ( ! empty( $include ) ) { + // Sanitized earlier. + $ids = implode( ',', $include ); + $this->query_where .= " AND $wpdb->users.ID IN ($ids)"; + } elseif ( ! empty( $qv['exclude'] ) ) { + $ids = implode( ',', wp_parse_id_list( $qv['exclude'] ) ); + $this->query_where .= " AND $wpdb->users.ID NOT IN ($ids)"; + } + + // Date queries are allowed for the user_registered field. + if ( ! empty( $qv['date_query'] ) && is_array( $qv['date_query'] ) ) { + $date_query = new WP_Date_Query( $qv['date_query'], 'user_registered' ); + $this->query_where .= $date_query->get_sql(); + } + + /** + * Fires after the WP_User_Query has been parsed, and before + * the query is executed. + * + * The passed WP_User_Query object contains SQL parts formed + * from parsing the given query. + * + * @since 3.1.0 + * + * @param WP_User_Query $this The current WP_User_Query instance, + * passed by reference. + */ + do_action_ref_array( 'pre_user_query', array( &$this ) ); + } + + /** + * Execute the query, with the current variables. + * + * @since 3.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ + public function query() { + global $wpdb; + + $qv =& $this->query_vars; + + /** + * Filters the users array before the query takes place. + * + * Return a non-null value to bypass WordPress's default user queries. + * Filtering functions that require pagination information are encouraged to set + * the `total_users` property of the WP_User_Query object, passed to the filter + * by reference. If WP_User_Query does not perform a database query, it will not + * have enough information to generate these values itself. + * + * @since 5.1.0 + * + * @param array|null $results Return an array of user data to short-circuit WP's user query + * or null to allow WP to run its normal queries. + * @param WP_User_Query $this The WP_User_Query instance (passed by reference). + */ + $this->results = apply_filters_ref_array( 'users_pre_query', array( null, &$this ) ); + + if ( null === $this->results ) { + $this->request = "SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit"; + + if ( is_array( $qv['fields'] ) || 'all' == $qv['fields'] ) { + $this->results = $wpdb->get_results( $this->request ); + } else { + $this->results = $wpdb->get_col( $this->request ); + } + + if ( isset( $qv['count_total'] ) && $qv['count_total'] ) { + /** + * Filters SELECT FOUND_ROWS() query for the current WP_User_Query instance. + * + * @since 3.2.0 + * @since 5.1.0 Added the `$this` parameter. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $sql The SELECT FOUND_ROWS() query for the current WP_User_Query. + * @param WP_User_Query $this The current WP_User_Query instance. + */ + $found_users_query = apply_filters( 'found_users_query', 'SELECT FOUND_ROWS()', $this ); + + $this->total_users = (int) $wpdb->get_var( $found_users_query ); + } + } + + if ( ! $this->results ) { + return; + } + + if ( 'all_with_meta' == $qv['fields'] ) { + cache_users( $this->results ); + + $r = array(); + foreach ( $this->results as $userid ) { + $r[ $userid ] = new WP_User( $userid, '', $qv['blog_id'] ); + } + + $this->results = $r; + } elseif ( 'all' == $qv['fields'] ) { + foreach ( $this->results as $key => $user ) { + $this->results[ $key ] = new WP_User( $user, '', $qv['blog_id'] ); + } + } + } + + /** + * Retrieve query variable. + * + * @since 3.5.0 + * + * @param string $query_var Query variable key. + * @return mixed + */ + public function get( $query_var ) { + if ( isset( $this->query_vars[ $query_var ] ) ) { + return $this->query_vars[ $query_var ]; + } + + return null; + } + + /** + * Set query variable. + * + * @since 3.5.0 + * + * @param string $query_var Query variable key. + * @param mixed $value Query variable value. + */ + public function set( $query_var, $value ) { + $this->query_vars[ $query_var ] = $value; + } + + /** + * Used internally to generate an SQL string for searching across multiple columns + * + * @since 3.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $string + * @param array $cols + * @param bool $wild Whether to allow wildcard searches. Default is false for Network Admin, true for single site. + * Single site allows leading and trailing wildcards, Network Admin only trailing. + * @return string + */ + protected function get_search_sql( $string, $cols, $wild = false ) { + global $wpdb; + + $searches = array(); + $leading_wild = ( 'leading' == $wild || 'both' == $wild ) ? '%' : ''; + $trailing_wild = ( 'trailing' == $wild || 'both' == $wild ) ? '%' : ''; + $like = $leading_wild . $wpdb->esc_like( $string ) . $trailing_wild; + + foreach ( $cols as $col ) { + if ( 'ID' == $col ) { + $searches[] = $wpdb->prepare( "$col = %s", $string ); + } else { + $searches[] = $wpdb->prepare( "$col LIKE %s", $like ); + } + } + + return ' AND (' . implode( ' OR ', $searches ) . ')'; + } + + /** + * Return the list of users. + * + * @since 3.1.0 + * + * @return array Array of results. + */ + public function get_results() { + return $this->results; + } + + /** + * Return the total number of users for the current query. + * + * @since 3.1.0 + * + * @return int Number of total users. + */ + public function get_total() { + return $this->total_users; + } + + /** + * Parse and sanitize 'orderby' keys passed to the user query. + * + * @since 4.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $orderby Alias for the field to order by. + * @return string Value to used in the ORDER clause, if `$orderby` is valid. + */ + protected function parse_orderby( $orderby ) { + global $wpdb; + + $meta_query_clauses = $this->meta_query->get_clauses(); + + $_orderby = ''; + if ( in_array( $orderby, array( 'login', 'nicename', 'email', 'url', 'registered' ) ) ) { + $_orderby = 'user_' . $orderby; + } elseif ( in_array( $orderby, array( 'user_login', 'user_nicename', 'user_email', 'user_url', 'user_registered' ) ) ) { + $_orderby = $orderby; + } elseif ( 'name' == $orderby || 'display_name' == $orderby ) { + $_orderby = 'display_name'; + } elseif ( 'post_count' == $orderby ) { + // @todo Avoid the JOIN. + $where = get_posts_by_author_sql( 'post' ); + $this->query_from .= " LEFT OUTER JOIN ( + SELECT post_author, COUNT(*) as post_count + FROM $wpdb->posts + $where + GROUP BY post_author + ) p ON ({$wpdb->users}.ID = p.post_author) + "; + $_orderby = 'post_count'; + } elseif ( 'ID' == $orderby || 'id' == $orderby ) { + $_orderby = 'ID'; + } elseif ( 'meta_value' == $orderby || $this->get( 'meta_key' ) == $orderby ) { + $_orderby = "$wpdb->usermeta.meta_value"; + } elseif ( 'meta_value_num' == $orderby ) { + $_orderby = "$wpdb->usermeta.meta_value+0"; + } elseif ( 'include' === $orderby && ! empty( $this->query_vars['include'] ) ) { + $include = wp_parse_id_list( $this->query_vars['include'] ); + $include_sql = implode( ',', $include ); + $_orderby = "FIELD( $wpdb->users.ID, $include_sql )"; + } elseif ( 'nicename__in' === $orderby ) { + $sanitized_nicename__in = array_map( 'esc_sql', $this->query_vars['nicename__in'] ); + $nicename__in = implode( "','", $sanitized_nicename__in ); + $_orderby = "FIELD( user_nicename, '$nicename__in' )"; + } elseif ( 'login__in' === $orderby ) { + $sanitized_login__in = array_map( 'esc_sql', $this->query_vars['login__in'] ); + $login__in = implode( "','", $sanitized_login__in ); + $_orderby = "FIELD( user_login, '$login__in' )"; + } elseif ( isset( $meta_query_clauses[ $orderby ] ) ) { + $meta_clause = $meta_query_clauses[ $orderby ]; + $_orderby = sprintf( 'CAST(%s.meta_value AS %s)', esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) ); + } + + return $_orderby; + } + + /** + * Parse an 'order' query variable and cast it to ASC or DESC as necessary. + * + * @since 4.2.0 + * + * @param string $order The 'order' query variable. + * @return string The sanitized 'order' query variable. + */ + protected function parse_order( $order ) { + if ( ! is_string( $order ) || empty( $order ) ) { + return 'DESC'; + } + + if ( 'ASC' === strtoupper( $order ) ) { + return 'ASC'; + } else { + return 'DESC'; + } + } + + /** + * Make private properties readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to get. + * @return mixed Property. + */ + public function __get( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + return $this->$name; + } + } + + /** + * Make private properties settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @param mixed $value Property value. + * @return mixed Newly-set property. + */ + public function __set( $name, $value ) { + if ( in_array( $name, $this->compat_fields ) ) { + return $this->$name = $value; + } + } + + /** + * Make private properties checkable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to check if set. + * @return bool Whether the property is set. + */ + public function __isset( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + return isset( $this->$name ); + } + } + + /** + * Make private properties un-settable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Property to unset. + */ + public function __unset( $name ) { + if ( in_array( $name, $this->compat_fields ) ) { + unset( $this->$name ); + } + } + + /** + * Make private/protected methods readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Method to call. + * @param array $arguments Arguments to pass when calling. + * @return mixed Return value of the callback, false otherwise. + */ + public function __call( $name, $arguments ) { + if ( 'get_search_sql' === $name ) { + return $this->get_search_sql( ...$arguments ); + } + return false; + } +} diff --git a/wp-includes/class-wp-user-request.php b/wp-includes/class-wp-user-request.php new file mode 100644 index 0000000..a59c7ff --- /dev/null +++ b/wp-includes/class-wp-user-request.php @@ -0,0 +1,107 @@ +<?php +/** + * WP_User_Request class. + * + * Represents user request data loaded from a WP_Post object. + * + * @since 4.9.6 + */ +final class WP_User_Request { + /** + * Request ID. + * + * @var int + */ + public $ID = 0; + + /** + * User ID. + * + * @var int + */ + public $user_id = 0; + + /** + * User email. + * + * @var int + */ + public $email = ''; + + /** + * Action name. + * + * @var string + */ + public $action_name = ''; + + /** + * Current status. + * + * @var string + */ + public $status = ''; + + /** + * Timestamp this request was created. + * + * @var int|null + */ + public $created_timestamp = null; + + /** + * Timestamp this request was last modified. + * + * @var int|null + */ + public $modified_timestamp = null; + + /** + * Timestamp this request was confirmed. + * + * @var int + */ + public $confirmed_timestamp = null; + + /** + * Timestamp this request was completed. + * + * @var int + */ + public $completed_timestamp = null; + + /** + * Misc data assigned to this request. + * + * @var array + */ + public $request_data = array(); + + /** + * Key used to confirm this request. + * + * @var string + */ + public $confirm_key = ''; + + /** + * Constructor. + * + * @since 4.9.6 + * + * @param WP_Post|object $post Post object. + */ + public function __construct( $post ) { + $this->ID = $post->ID; + $this->user_id = $post->post_author; + $this->email = $post->post_title; + $this->action_name = $post->post_name; + $this->status = $post->post_status; + $this->created_timestamp = strtotime( $post->post_date_gmt ); + $this->modified_timestamp = strtotime( $post->post_modified_gmt ); + $this->confirmed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_confirmed_timestamp', true ); + $this->completed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_completed_timestamp', true ); + $this->request_data = json_decode( $post->post_content, true ); + $this->confirm_key = $post->post_password; + } +} diff --git a/wp-includes/class-wp-user.php b/wp-includes/class-wp-user.php new file mode 100644 index 0000000..a064c1f --- /dev/null +++ b/wp-includes/class-wp-user.php @@ -0,0 +1,879 @@ +<?php +/** + * User API: WP_User class + * + * @package WordPress + * @subpackage Users + * @since 4.4.0 + */ + +/** + * Core class used to implement the WP_User object. + * + * @since 2.0.0 + * + * @property string $nickname + * @property string $description + * @property string $user_description + * @property string $first_name + * @property string $user_firstname + * @property string $last_name + * @property string $user_lastname + * @property string $user_login + * @property string $user_pass + * @property string $user_nicename + * @property string $user_email + * @property string $user_url + * @property string $user_registered + * @property string $user_activation_key + * @property string $user_status + * @property int $user_level + * @property string $display_name + * @property string $spam + * @property string $deleted + * @property string $locale + * @property string $rich_editing + * @property string $syntax_highlighting + */ +class WP_User { + /** + * User data container. + * + * @since 2.0.0 + * @var object + */ + public $data; + + /** + * The user's ID. + * + * @since 2.1.0 + * @var int + */ + public $ID = 0; + + /** + * The individual capabilities the user has been given. + * + * @since 2.0.0 + * @var array + */ + public $caps = array(); + + /** + * User metadata option name. + * + * @since 2.0.0 + * @var string + */ + public $cap_key; + + /** + * The roles the user is part of. + * + * @since 2.0.0 + * @var array + */ + public $roles = array(); + + /** + * All capabilities the user has, including individual and role based. + * + * @since 2.0.0 + * @var bool[] Array of key/value pairs where keys represent a capability name and boolean values + * represent whether the user has that capability. + */ + public $allcaps = array(); + + /** + * The filter context applied to user data fields. + * + * @since 2.9.0 + * @var string + */ + public $filter = null; + + /** + * The site ID the capabilities of this user are initialized for. + * + * @since 4.9.0 + * @var int + */ + private $site_id = 0; + + /** + * @since 3.3.0 + * @var array + */ + private static $back_compat_keys; + + /** + * Constructor. + * + * Retrieves the userdata and passes it to WP_User::init(). + * + * @since 2.0.0 + * + * @param int|string|stdClass|WP_User $id User's ID, a WP_User object, or a user object from the DB. + * @param string $name Optional. User's username + * @param int $site_id Optional Site ID, defaults to current site. + */ + public function __construct( $id = 0, $name = '', $site_id = '' ) { + if ( ! isset( self::$back_compat_keys ) ) { + $prefix = $GLOBALS['wpdb']->prefix; + self::$back_compat_keys = array( + 'user_firstname' => 'first_name', + 'user_lastname' => 'last_name', + 'user_description' => 'description', + 'user_level' => $prefix . 'user_level', + $prefix . 'usersettings' => $prefix . 'user-settings', + $prefix . 'usersettingstime' => $prefix . 'user-settings-time', + ); + } + + if ( $id instanceof WP_User ) { + $this->init( $id->data, $site_id ); + return; + } elseif ( is_object( $id ) ) { + $this->init( $id, $site_id ); + return; + } + + if ( ! empty( $id ) && ! is_numeric( $id ) ) { + $name = $id; + $id = 0; + } + + if ( $id ) { + $data = self::get_data_by( 'id', $id ); + } else { + $data = self::get_data_by( 'login', $name ); + } + + if ( $data ) { + $this->init( $data, $site_id ); + } else { + $this->data = new stdClass; + } + } + + /** + * Sets up object properties, including capabilities. + * + * @since 3.3.0 + * + * @param object $data User DB row object. + * @param int $site_id Optional. The site ID to initialize for. + */ + public function init( $data, $site_id = '' ) { + $this->data = $data; + $this->ID = (int) $data->ID; + + $this->for_site( $site_id ); + } + + /** + * Return only the main user fields + * + * @since 3.3.0 + * @since 4.4.0 Added 'ID' as an alias of 'id' for the `$field` parameter. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $field The field to query against: 'id', 'ID', 'slug', 'email' or 'login'. + * @param string|int $value The field value + * @return object|false Raw user object + */ + public static function get_data_by( $field, $value ) { + global $wpdb; + + // 'ID' is an alias of 'id'. + if ( 'ID' === $field ) { + $field = 'id'; + } + + if ( 'id' == $field ) { + // Make sure the value is numeric to avoid casting objects, for example, + // to int 1. + if ( ! is_numeric( $value ) ) { + return false; + } + $value = intval( $value ); + if ( $value < 1 ) { + return false; + } + } else { + $value = trim( $value ); + } + + if ( ! $value ) { + return false; + } + + switch ( $field ) { + case 'id': + $user_id = $value; + $db_field = 'ID'; + break; + case 'slug': + $user_id = wp_cache_get( $value, 'userslugs' ); + $db_field = 'user_nicename'; + break; + case 'email': + $user_id = wp_cache_get( $value, 'useremail' ); + $db_field = 'user_email'; + break; + case 'login': + $value = sanitize_user( $value ); + $user_id = wp_cache_get( $value, 'userlogins' ); + $db_field = 'user_login'; + break; + default: + return false; + } + + if ( false !== $user_id ) { + $user = wp_cache_get( $user_id, 'users' ); + if ( $user ) { + return $user; + } + } + + $user = $wpdb->get_row( + $wpdb->prepare( + "SELECT * FROM $wpdb->users WHERE $db_field = %s LIMIT 1", + $value + ) + ); + if ( ! $user ) { + return false; + } + + update_user_caches( $user ); + + return $user; + } + + /** + * Magic method for checking the existence of a certain custom field. + * + * @since 3.3.0 + * + * @param string $key User meta key to check if set. + * @return bool Whether the given user meta key is set. + */ + public function __isset( $key ) { + if ( 'id' == $key ) { + _deprecated_argument( + 'WP_User->id', + '2.1.0', + sprintf( + /* translators: %s: WP_User->ID */ + __( 'Use %s instead.' ), + '<code>WP_User->ID</code>' + ) + ); + $key = 'ID'; + } + + if ( isset( $this->data->$key ) ) { + return true; + } + + if ( isset( self::$back_compat_keys[ $key ] ) ) { + $key = self::$back_compat_keys[ $key ]; + } + + return metadata_exists( 'user', $this->ID, $key ); + } + + /** + * Magic method for accessing custom fields. + * + * @since 3.3.0 + * + * @param string $key User meta key to retrieve. + * @return mixed Value of the given user meta key (if set). If `$key` is 'id', the user ID. + */ + public function __get( $key ) { + if ( 'id' == $key ) { + _deprecated_argument( + 'WP_User->id', + '2.1.0', + sprintf( + /* translators: %s: WP_User->ID */ + __( 'Use %s instead.' ), + '<code>WP_User->ID</code>' + ) + ); + return $this->ID; + } + + if ( isset( $this->data->$key ) ) { + $value = $this->data->$key; + } else { + if ( isset( self::$back_compat_keys[ $key ] ) ) { + $key = self::$back_compat_keys[ $key ]; + } + $value = get_user_meta( $this->ID, $key, true ); + } + + if ( $this->filter ) { + $value = sanitize_user_field( $key, $value, $this->ID, $this->filter ); + } + + return $value; + } + + /** + * Magic method for setting custom user fields. + * + * This method does not update custom fields in the database. It only stores + * the value on the WP_User instance. + * + * @since 3.3.0 + * + * @param string $key User meta key. + * @param mixed $value User meta value. + */ + public function __set( $key, $value ) { + if ( 'id' == $key ) { + _deprecated_argument( + 'WP_User->id', + '2.1.0', + sprintf( + /* translators: %s: WP_User->ID */ + __( 'Use %s instead.' ), + '<code>WP_User->ID</code>' + ) + ); + $this->ID = $value; + return; + } + + $this->data->$key = $value; + } + + /** + * Magic method for unsetting a certain custom field. + * + * @since 4.4.0 + * + * @param string $key User meta key to unset. + */ + public function __unset( $key ) { + if ( 'id' == $key ) { + _deprecated_argument( + 'WP_User->id', + '2.1.0', + sprintf( + /* translators: %s: WP_User->ID */ + __( 'Use %s instead.' ), + '<code>WP_User->ID</code>' + ) + ); + } + + if ( isset( $this->data->$key ) ) { + unset( $this->data->$key ); + } + + if ( isset( self::$back_compat_keys[ $key ] ) ) { + unset( self::$back_compat_keys[ $key ] ); + } + } + + /** + * Determine whether the user exists in the database. + * + * @since 3.4.0 + * + * @return bool True if user exists in the database, false if not. + */ + public function exists() { + return ! empty( $this->ID ); + } + + /** + * Retrieve the value of a property or meta key. + * + * Retrieves from the users and usermeta table. + * + * @since 3.3.0 + * + * @param string $key Property + * @return mixed + */ + public function get( $key ) { + return $this->__get( $key ); + } + + /** + * Determine whether a property or meta key is set + * + * Consults the users and usermeta tables. + * + * @since 3.3.0 + * + * @param string $key Property + * @return bool + */ + public function has_prop( $key ) { + return $this->__isset( $key ); + } + + /** + * Return an array representation. + * + * @since 3.5.0 + * + * @return array Array representation. + */ + public function to_array() { + return get_object_vars( $this->data ); + } + + /** + * Makes private/protected methods readable for backward compatibility. + * + * @since 4.3.0 + * + * @param string $name Method to call. + * @param array $arguments Arguments to pass when calling. + * @return mixed|false Return value of the callback, false otherwise. + */ + public function __call( $name, $arguments ) { + if ( '_init_caps' === $name ) { + return $this->_init_caps( ...$arguments ); + } + return false; + } + + /** + * Set up capability object properties. + * + * Will set the value for the 'cap_key' property to current database table + * prefix, followed by 'capabilities'. Will then check to see if the + * property matching the 'cap_key' exists and is an array. If so, it will be + * used. + * + * @since 2.1.0 + * @deprecated 4.9.0 Use WP_User::for_site() + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $cap_key Optional capability key + */ + protected function _init_caps( $cap_key = '' ) { + global $wpdb; + + _deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' ); + + if ( empty( $cap_key ) ) { + $this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities'; + } else { + $this->cap_key = $cap_key; + } + + $this->caps = $this->get_caps_data(); + + $this->get_role_caps(); + } + + /** + * Retrieves all of the capabilities of the roles of the user, and merges them with individual user capabilities. + * + * All of the capabilities of the roles of the user are merged with the user's individual capabilities. This means + * that the user can be denied specific capabilities that their role might have, but the user is specifically denied. + * + * @since 2.0.0 + * + * @return bool[] Array of key/value pairs where keys represent a capability name and boolean values + * represent whether the user has that capability. + */ + public function get_role_caps() { + $switch_site = false; + if ( is_multisite() && get_current_blog_id() != $this->site_id ) { + $switch_site = true; + + switch_to_blog( $this->site_id ); + } + + $wp_roles = wp_roles(); + + // Filter out caps that are not role names and assign to $this->roles. + if ( is_array( $this->caps ) ) { + $this->roles = array_filter( array_keys( $this->caps ), array( $wp_roles, 'is_role' ) ); + } + + // Build $allcaps from role caps, overlay user's $caps. + $this->allcaps = array(); + foreach ( (array) $this->roles as $role ) { + $the_role = $wp_roles->get_role( $role ); + $this->allcaps = array_merge( (array) $this->allcaps, (array) $the_role->capabilities ); + } + $this->allcaps = array_merge( (array) $this->allcaps, (array) $this->caps ); + + if ( $switch_site ) { + restore_current_blog(); + } + + return $this->allcaps; + } + + /** + * Add role to user. + * + * Updates the user's meta data option with capabilities and roles. + * + * @since 2.0.0 + * + * @param string $role Role name. + */ + public function add_role( $role ) { + if ( empty( $role ) ) { + return; + } + + $this->caps[ $role ] = true; + update_user_meta( $this->ID, $this->cap_key, $this->caps ); + $this->get_role_caps(); + $this->update_user_level_from_caps(); + + /** + * Fires immediately after the user has been given a new role. + * + * @since 4.3.0 + * + * @param int $user_id The user ID. + * @param string $role The new role. + */ + do_action( 'add_user_role', $this->ID, $role ); + } + + /** + * Remove role from user. + * + * @since 2.0.0 + * + * @param string $role Role name. + */ + public function remove_role( $role ) { + if ( ! in_array( $role, $this->roles ) ) { + return; + } + unset( $this->caps[ $role ] ); + update_user_meta( $this->ID, $this->cap_key, $this->caps ); + $this->get_role_caps(); + $this->update_user_level_from_caps(); + + /** + * Fires immediately after a role as been removed from a user. + * + * @since 4.3.0 + * + * @param int $user_id The user ID. + * @param string $role The removed role. + */ + do_action( 'remove_user_role', $this->ID, $role ); + } + + /** + * Set the role of the user. + * + * This will remove the previous roles of the user and assign the user the + * new one. You can set the role to an empty string and it will remove all + * of the roles from the user. + * + * @since 2.0.0 + * + * @param string $role Role name. + */ + public function set_role( $role ) { + if ( 1 == count( $this->roles ) && current( $this->roles ) == $role ) { + return; + } + + foreach ( (array) $this->roles as $oldrole ) { + unset( $this->caps[ $oldrole ] ); + } + + $old_roles = $this->roles; + if ( ! empty( $role ) ) { + $this->caps[ $role ] = true; + $this->roles = array( $role => true ); + } else { + $this->roles = false; + } + update_user_meta( $this->ID, $this->cap_key, $this->caps ); + $this->get_role_caps(); + $this->update_user_level_from_caps(); + + /** + * Fires after the user's role has changed. + * + * @since 2.9.0 + * @since 3.6.0 Added $old_roles to include an array of the user's previous roles. + * + * @param int $user_id The user ID. + * @param string $role The new role. + * @param string[] $old_roles An array of the user's previous roles. + */ + do_action( 'set_user_role', $this->ID, $role, $old_roles ); + } + + /** + * Choose the maximum level the user has. + * + * Will compare the level from the $item parameter against the $max + * parameter. If the item is incorrect, then just the $max parameter value + * will be returned. + * + * Used to get the max level based on the capabilities the user has. This + * is also based on roles, so if the user is assigned the Administrator role + * then the capability 'level_10' will exist and the user will get that + * value. + * + * @since 2.0.0 + * + * @param int $max Max level of user. + * @param string $item Level capability name. + * @return int Max Level. + */ + public function level_reduction( $max, $item ) { + if ( preg_match( '/^level_(10|[0-9])$/i', $item, $matches ) ) { + $level = intval( $matches[1] ); + return max( $max, $level ); + } else { + return $max; + } + } + + /** + * Update the maximum user level for the user. + * + * Updates the 'user_level' user metadata (includes prefix that is the + * database table prefix) with the maximum user level. Gets the value from + * the all of the capabilities that the user has. + * + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ + public function update_user_level_from_caps() { + global $wpdb; + $this->user_level = array_reduce( array_keys( $this->allcaps ), array( $this, 'level_reduction' ), 0 ); + update_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level', $this->user_level ); + } + + /** + * Add capability and grant or deny access to capability. + * + * @since 2.0.0 + * + * @param string $cap Capability name. + * @param bool $grant Whether to grant capability to user. + */ + public function add_cap( $cap, $grant = true ) { + $this->caps[ $cap ] = $grant; + update_user_meta( $this->ID, $this->cap_key, $this->caps ); + $this->get_role_caps(); + $this->update_user_level_from_caps(); + } + + /** + * Remove capability from user. + * + * @since 2.0.0 + * + * @param string $cap Capability name. + */ + public function remove_cap( $cap ) { + if ( ! isset( $this->caps[ $cap ] ) ) { + return; + } + unset( $this->caps[ $cap ] ); + update_user_meta( $this->ID, $this->cap_key, $this->caps ); + $this->get_role_caps(); + $this->update_user_level_from_caps(); + } + + /** + * Remove all of the capabilities of the user. + * + * @since 2.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ + public function remove_all_caps() { + global $wpdb; + $this->caps = array(); + delete_user_meta( $this->ID, $this->cap_key ); + delete_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level' ); + $this->get_role_caps(); + } + + /** + * Returns whether the user has the specified capability. + * + * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta + * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to + * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. + * + * Example usage: + * + * $user->has_cap( 'edit_posts' ); + * $user->has_cap( 'edit_post', $post->ID ); + * $user->has_cap( 'edit_post_meta', $post->ID, $meta_key ); + * + * While checking against a role in place of a capability is supported in part, this practice is discouraged as it + * may produce unreliable results. + * + * @since 2.0.0 + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @see map_meta_cap() + * + * @param string $cap Capability name. + * @param mixed ...$args Optional further parameters, typically starting with an object ID. + * @return bool Whether the user has the given capability, or, if an object ID is passed, whether the user has + * the given capability for that object. + */ + public function has_cap( $cap, ...$args ) { + if ( is_numeric( $cap ) ) { + _deprecated_argument( __FUNCTION__, '2.0.0', __( 'Usage of user levels is deprecated. Use capabilities instead.' ) ); + $cap = $this->translate_level_to_cap( $cap ); + } + + $caps = map_meta_cap( $cap, $this->ID, ...$args ); + + // Multisite super admin has all caps by definition, Unless specifically denied. + if ( is_multisite() && is_super_admin( $this->ID ) ) { + if ( in_array( 'do_not_allow', $caps ) ) { + return false; + } + return true; + } + + // Maintain BC for the argument passed to the "user_has_cap" filter. + $args = array_merge( array( $cap, $this->ID ), $args ); + + /** + * Dynamically filter a user's capabilities. + * + * @since 2.0.0 + * @since 3.7.0 Added the `$user` parameter. + * + * @param bool[] $allcaps Array of key/value pairs where keys represent a capability name and boolean values + * represent whether the user has that capability. + * @param string[] $caps Required primitive capabilities for the requested capability. + * @param array $args { + * Arguments that accompany the requested capability check. + * + * @type string $0 Requested capability. + * @type int $1 Concerned user ID. + * @type mixed ...$2 Optional second and further parameters, typically object ID. + * } + * @param WP_User $user The user object. + */ + $capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this ); + + // Everyone is allowed to exist. + $capabilities['exist'] = true; + + // Nobody is allowed to do things they are not allowed to do. + unset( $capabilities['do_not_allow'] ); + + // Must have ALL requested caps. + foreach ( (array) $caps as $cap ) { + if ( empty( $capabilities[ $cap ] ) ) { + return false; + } + } + + return true; + } + + /** + * Convert numeric level to level capability name. + * + * Prepends 'level_' to level number. + * + * @since 2.0.0 + * + * @param int $level Level number, 1 to 10. + * @return string + */ + public function translate_level_to_cap( $level ) { + return 'level_' . $level; + } + + /** + * Set the site to operate on. Defaults to the current site. + * + * @since 3.0.0 + * @deprecated 4.9.0 Use WP_User::for_site() + * + * @param int $blog_id Optional. Site ID, defaults to current site. + */ + public function for_blog( $blog_id = '' ) { + _deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' ); + + $this->for_site( $blog_id ); + } + + /** + * Sets the site to operate on. Defaults to the current site. + * + * @since 4.9.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $site_id Site ID to initialize user capabilities for. Default is the current site. + */ + public function for_site( $site_id = '' ) { + global $wpdb; + + if ( ! empty( $site_id ) ) { + $this->site_id = absint( $site_id ); + } else { + $this->site_id = get_current_blog_id(); + } + + $this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities'; + + $this->caps = $this->get_caps_data(); + + $this->get_role_caps(); + } + + /** + * Gets the ID of the site for which the user's capabilities are currently initialized. + * + * @since 4.9.0 + * + * @return int Site ID. + */ + public function get_site_id() { + return $this->site_id; + } + + /** + * Gets the available user capabilities data. + * + * @since 4.9.0 + * + * @return bool[] List of capabilities keyed by the capability name, + * e.g. array( 'edit_posts' => true, 'delete_posts' => false ). + */ + private function get_caps_data() { + $caps = get_user_meta( $this->ID, $this->cap_key, true ); + + if ( ! is_array( $caps ) ) { + return array(); + } + + return $caps; + } +} diff --git a/wp-includes/class-wp-walker.php b/wp-includes/class-wp-walker.php new file mode 100644 index 0000000..52deb2b --- /dev/null +++ b/wp-includes/class-wp-walker.php @@ -0,0 +1,447 @@ +<?php +/** + * A class for displaying various tree-like structures. + * + * Extend the Walker class to use it, see examples below. Child classes + * do not need to implement all of the abstract methods in the class. The child + * only needs to implement the methods that are needed. + * + * @since 2.1.0 + * + * @package WordPress + * @abstract + */ +class Walker { + /** + * What the class handles. + * + * @since 2.1.0 + * @var string + */ + public $tree_type; + + /** + * DB fields to use. + * + * @since 2.1.0 + * @var array + */ + public $db_fields; + + /** + * Max number of pages walked by the paged walker + * + * @since 2.7.0 + * @var int + */ + public $max_pages = 1; + + /** + * Whether the current element has children or not. + * + * To be used in start_el(). + * + * @since 4.0.0 + * @var bool + */ + public $has_children; + + /** + * Starts the list before the elements are added. + * + * The $args parameter holds additional values that may be used with the child + * class methods. This method is called at the start of the output list. + * + * @since 2.1.0 + * @abstract + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of the item. + * @param array $args An array of additional arguments. + */ + public function start_lvl( &$output, $depth = 0, $args = array() ) {} + + /** + * Ends the list of after the elements are added. + * + * The $args parameter holds additional values that may be used with the child + * class methods. This method finishes the list at the end of output of the elements. + * + * @since 2.1.0 + * @abstract + * + * @param string $output Used to append additional content (passed by reference). + * @param int $depth Depth of the item. + * @param array $args An array of additional arguments. + */ + public function end_lvl( &$output, $depth = 0, $args = array() ) {} + + /** + * Start the element output. + * + * The $args parameter holds additional values that may be used with the child + * class methods. Includes the element output also. + * + * @since 2.1.0 + * @abstract + * + * @param string $output Used to append additional content (passed by reference). + * @param object $object The data object. + * @param int $depth Depth of the item. + * @param array $args An array of additional arguments. + * @param int $current_object_id ID of the current item. + */ + public function start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0 ) {} + + /** + * Ends the element output, if needed. + * + * The $args parameter holds additional values that may be used with the child class methods. + * + * @since 2.1.0 + * @abstract + * + * @param string $output Used to append additional content (passed by reference). + * @param object $object The data object. + * @param int $depth Depth of the item. + * @param array $args An array of additional arguments. + */ + public function end_el( &$output, $object, $depth = 0, $args = array() ) {} + + /** + * Traverse elements to create list from elements. + * + * Display one element if the element doesn't have any children otherwise, + * display the element and its children. Will only traverse up to the max + * depth and no ignore elements under that depth. It is possible to set the + * max depth to include all depths, see walk() method. + * + * This method should not be called directly, use the walk() method instead. + * + * @since 2.5.0 + * + * @param object $element Data object. + * @param array $children_elements List of elements to continue traversing (passed by reference). + * @param int $max_depth Max depth to traverse. + * @param int $depth Depth of current element. + * @param array $args An array of arguments. + * @param string $output Used to append additional content (passed by reference). + */ + public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) { + if ( ! $element ) { + return; + } + + $id_field = $this->db_fields['id']; + $id = $element->$id_field; + + // Display this element. + $this->has_children = ! empty( $children_elements[ $id ] ); + if ( isset( $args[0] ) && is_array( $args[0] ) ) { + $args[0]['has_children'] = $this->has_children; // Back-compat. + } + + $this->start_el( $output, $element, $depth, ...array_values( $args ) ); + + // Descend only when the depth is right and there are childrens for this element. + if ( ( 0 == $max_depth || $max_depth > $depth + 1 ) && isset( $children_elements[ $id ] ) ) { + + foreach ( $children_elements[ $id ] as $child ) { + + if ( ! isset( $newlevel ) ) { + $newlevel = true; + // Start the child delimiter. + $this->start_lvl( $output, $depth, ...array_values( $args ) ); + } + $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output ); + } + unset( $children_elements[ $id ] ); + } + + if ( isset( $newlevel ) && $newlevel ) { + // End the child delimiter. + $this->end_lvl( $output, $depth, ...array_values( $args ) ); + } + + // End this element. + $this->end_el( $output, $element, $depth, ...array_values( $args ) ); + } + + /** + * Display array of elements hierarchically. + * + * Does not assume any existing order of elements. + * + * $max_depth = -1 means flatly display every element. + * $max_depth = 0 means display all levels. + * $max_depth > 0 specifies the number of display levels. + * + * @since 2.1.0 + * @since 5.3.0 Formalized the existing `...$args` parameter by adding it + * to the function signature. + * + * @param array $elements An array of elements. + * @param int $max_depth The maximum hierarchical depth. + * @param mixed ...$args Optional additional arguments. + * @return string The hierarchical item output. + */ + public function walk( $elements, $max_depth, ...$args ) { + $output = ''; + + // Invalid parameter or nothing to walk. + if ( $max_depth < -1 || empty( $elements ) ) { + return $output; + } + + $parent_field = $this->db_fields['parent']; + + // Flat display. + if ( -1 == $max_depth ) { + $empty_array = array(); + foreach ( $elements as $e ) { + $this->display_element( $e, $empty_array, 1, 0, $args, $output ); + } + return $output; + } + + /* + * Need to display in hierarchical order. + * Separate elements into two buckets: top level and children elements. + * Children_elements is two dimensional array, eg. + * Children_elements[10][] contains all sub-elements whose parent is 10. + */ + $top_level_elements = array(); + $children_elements = array(); + foreach ( $elements as $e ) { + if ( empty( $e->$parent_field ) ) { + $top_level_elements[] = $e; + } else { + $children_elements[ $e->$parent_field ][] = $e; + } + } + + /* + * When none of the elements is top level. + * Assume the first one must be root of the sub elements. + */ + if ( empty( $top_level_elements ) ) { + + $first = array_slice( $elements, 0, 1 ); + $root = $first[0]; + + $top_level_elements = array(); + $children_elements = array(); + foreach ( $elements as $e ) { + if ( $root->$parent_field == $e->$parent_field ) { + $top_level_elements[] = $e; + } else { + $children_elements[ $e->$parent_field ][] = $e; + } + } + } + + foreach ( $top_level_elements as $e ) { + $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output ); + } + + /* + * If we are displaying all levels, and remaining children_elements is not empty, + * then we got orphans, which should be displayed regardless. + */ + if ( ( 0 == $max_depth ) && count( $children_elements ) > 0 ) { + $empty_array = array(); + foreach ( $children_elements as $orphans ) { + foreach ( $orphans as $op ) { + $this->display_element( $op, $empty_array, 1, 0, $args, $output ); + } + } + } + + return $output; + } + + /** + * paged_walk() - produce a page of nested elements + * + * Given an array of hierarchical elements, the maximum depth, a specific page number, + * and number of elements per page, this function first determines all top level root elements + * belonging to that page, then lists them and all of their children in hierarchical order. + * + * $max_depth = 0 means display all levels. + * $max_depth > 0 specifies the number of display levels. + * + * @since 2.7.0 + * @since 5.3.0 Formalized the existing `...$args` parameter by adding it + * to the function signature. + * + * @param array $elements + * @param int $max_depth The maximum hierarchical depth. + * @param int $page_num The specific page number, beginning with 1. + * @param int $per_page + * @param mixed ...$args Optional additional arguments. + * @return string XHTML of the specified page of elements + */ + public function paged_walk( $elements, $max_depth, $page_num, $per_page, ...$args ) { + if ( empty( $elements ) || $max_depth < -1 ) { + return ''; + } + + $output = ''; + + $parent_field = $this->db_fields['parent']; + + $count = -1; + if ( -1 == $max_depth ) { + $total_top = count( $elements ); + } + if ( $page_num < 1 || $per_page < 0 ) { + // No paging. + $paging = false; + $start = 0; + if ( -1 == $max_depth ) { + $end = $total_top; + } + $this->max_pages = 1; + } else { + $paging = true; + $start = ( (int) $page_num - 1 ) * (int) $per_page; + $end = $start + $per_page; + if ( -1 == $max_depth ) { + $this->max_pages = ceil( $total_top / $per_page ); + } + } + + // Flat display. + if ( -1 == $max_depth ) { + if ( ! empty( $args[0]['reverse_top_level'] ) ) { + $elements = array_reverse( $elements ); + $oldstart = $start; + $start = $total_top - $end; + $end = $total_top - $oldstart; + } + + $empty_array = array(); + foreach ( $elements as $e ) { + $count++; + if ( $count < $start ) { + continue; + } + if ( $count >= $end ) { + break; + } + $this->display_element( $e, $empty_array, 1, 0, $args, $output ); + } + return $output; + } + + /* + * Separate elements into two buckets: top level and children elements. + * Children_elements is two dimensional array, e.g. + * $children_elements[10][] contains all sub-elements whose parent is 10. + */ + $top_level_elements = array(); + $children_elements = array(); + foreach ( $elements as $e ) { + if ( 0 == $e->$parent_field ) { + $top_level_elements[] = $e; + } else { + $children_elements[ $e->$parent_field ][] = $e; + } + } + + $total_top = count( $top_level_elements ); + if ( $paging ) { + $this->max_pages = ceil( $total_top / $per_page ); + } else { + $end = $total_top; + } + + if ( ! empty( $args[0]['reverse_top_level'] ) ) { + $top_level_elements = array_reverse( $top_level_elements ); + $oldstart = $start; + $start = $total_top - $end; + $end = $total_top - $oldstart; + } + if ( ! empty( $args[0]['reverse_children'] ) ) { + foreach ( $children_elements as $parent => $children ) { + $children_elements[ $parent ] = array_reverse( $children ); + } + } + + foreach ( $top_level_elements as $e ) { + $count++; + + // For the last page, need to unset earlier children in order to keep track of orphans. + if ( $end >= $total_top && $count < $start ) { + $this->unset_children( $e, $children_elements ); + } + + if ( $count < $start ) { + continue; + } + + if ( $count >= $end ) { + break; + } + + $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output ); + } + + if ( $end >= $total_top && count( $children_elements ) > 0 ) { + $empty_array = array(); + foreach ( $children_elements as $orphans ) { + foreach ( $orphans as $op ) { + $this->display_element( $op, $empty_array, 1, 0, $args, $output ); + } + } + } + + return $output; + } + + /** + * Calculates the total number of root elements. + * + * @since 2.7.0 + * + * @param array $elements Elements to list. + * @return int Number of root elements. + */ + public function get_number_of_root_elements( $elements ) { + $num = 0; + $parent_field = $this->db_fields['parent']; + + foreach ( $elements as $e ) { + if ( 0 == $e->$parent_field ) { + $num++; + } + } + return $num; + } + + /** + * Unset all the children for a given top level element. + * + * @since 2.7.0 + * + * @param object $e + * @param array $children_elements + */ + public function unset_children( $e, &$children_elements ) { + if ( ! $e || ! $children_elements ) { + return; + } + + $id_field = $this->db_fields['id']; + $id = $e->$id_field; + + if ( ! empty( $children_elements[ $id ] ) && is_array( $children_elements[ $id ] ) ) { + foreach ( (array) $children_elements[ $id ] as $child ) { + $this->unset_children( $child, $children_elements ); + } + } + + unset( $children_elements[ $id ] ); + } + +} diff --git a/wp-includes/class-wp-widget-factory.php b/wp-includes/class-wp-widget-factory.php new file mode 100644 index 0000000..588d6ca --- /dev/null +++ b/wp-includes/class-wp-widget-factory.php @@ -0,0 +1,105 @@ +<?php +/** + * Widget API: WP_Widget_Factory class + * + * @package WordPress + * @subpackage Widgets + * @since 4.4.0 + */ + +/** + * Singleton that registers and instantiates WP_Widget classes. + * + * @since 2.8.0 + * @since 4.4.0 Moved to its own file from wp-includes/widgets.php + */ +class WP_Widget_Factory { + + /** + * Widgets array. + * + * @since 2.8.0 + * @var array + */ + public $widgets = array(); + + /** + * PHP5 constructor. + * + * @since 4.3.0 + */ + public function __construct() { + add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 ); + } + + /** + * PHP4 constructor. + * + * @since 2.8.0 + * @deprecated 4.3.0 Use __construct() instead. + * + * @see WP_Widget_Factory::__construct() + */ + public function WP_Widget_Factory() { + _deprecated_constructor( 'WP_Widget_Factory', '4.3.0' ); + self::__construct(); + } + + /** + * Registers a widget subclass. + * + * @since 2.8.0 + * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object + * instead of simply a `WP_Widget` subclass name. + * + * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass. + */ + public function register( $widget ) { + if ( $widget instanceof WP_Widget ) { + $this->widgets[ spl_object_hash( $widget ) ] = $widget; + } else { + $this->widgets[ $widget ] = new $widget(); + } + } + + /** + * Un-registers a widget subclass. + * + * @since 2.8.0 + * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object + * instead of simply a `WP_Widget` subclass name. + * + * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass. + */ + public function unregister( $widget ) { + if ( $widget instanceof WP_Widget ) { + unset( $this->widgets[ spl_object_hash( $widget ) ] ); + } else { + unset( $this->widgets[ $widget ] ); + } + } + + /** + * Serves as a utility method for adding widgets to the registered widgets global. + * + * @since 2.8.0 + * + * @global array $wp_registered_widgets + */ + public function _register_widgets() { + global $wp_registered_widgets; + $keys = array_keys( $this->widgets ); + $registered = array_keys( $wp_registered_widgets ); + $registered = array_map( '_get_widget_id_base', $registered ); + + foreach ( $keys as $key ) { + // Don't register new widget if old widget with the same id is already registered. + if ( in_array( $this->widgets[ $key ]->id_base, $registered, true ) ) { + unset( $this->widgets[ $key ] ); + continue; + } + + $this->widgets[ $key ]->_register(); + } + } +} diff --git a/wp-includes/class-wp-widget.php b/wp-includes/class-wp-widget.php new file mode 100644 index 0000000..d6e939b --- /dev/null +++ b/wp-includes/class-wp-widget.php @@ -0,0 +1,600 @@ +<?php +/** + * Widget API: WP_Widget base class + * + * @package WordPress + * @subpackage Widgets + * @since 4.4.0 + */ + +/** + * Core base class extended to register widgets. + * + * This class must be extended for each widget, and WP_Widget::widget() must be overridden. + * + * If adding widget options, WP_Widget::update() and WP_Widget::form() should also be overridden. + * + * @since 2.8.0 + * @since 4.4.0 Moved to its own file from wp-includes/widgets.php + */ +class WP_Widget { + + /** + * Root ID for all widgets of this type. + * + * @since 2.8.0 + * @var mixed|string + */ + public $id_base; + + /** + * Name for this widget type. + * + * @since 2.8.0 + * @var string + */ + public $name; + + /** + * Option name for this widget type. + * + * @since 2.8.0 + * @var string + */ + public $option_name; + + /** + * Alt option name for this widget type. + * + * @since 2.8.0 + * @var string + */ + public $alt_option_name; + + /** + * Option array passed to wp_register_sidebar_widget(). + * + * @since 2.8.0 + * @var array + */ + public $widget_options; + + /** + * Option array passed to wp_register_widget_control(). + * + * @since 2.8.0 + * @var array + */ + public $control_options; + + /** + * Unique ID number of the current instance. + * + * @since 2.8.0 + * @var bool|int + */ + public $number = false; + + /** + * Unique ID string of the current instance (id_base-number). + * + * @since 2.8.0 + * @var bool|string + */ + public $id = false; + + /** + * Whether the widget data has been updated. + * + * Set to true when the data is updated after a POST submit - ensures it does + * not happen twice. + * + * @since 2.8.0 + * @var bool + */ + public $updated = false; + + // + // Member functions that must be overridden by subclasses. + // + + /** + * Echoes the widget content. + * + * Subclasses should override this function to generate their widget code. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance The settings for the particular instance of the widget. + */ + public function widget( $args, $instance ) { + die( 'function WP_Widget::widget() must be overridden in a subclass.' ); + } + + /** + * Updates a particular instance of a widget. + * + * This function should check that `$new_instance` is set correctly. The newly-calculated + * value of `$instance` should be returned. If false is returned, the instance won't be + * saved/updated. + * + * @since 2.8.0 + * + * @param array $new_instance New settings for this instance as input by the user via + * WP_Widget::form(). + * @param array $old_instance Old settings for this instance. + * @return array Settings to save or bool false to cancel saving. + */ + public function update( $new_instance, $old_instance ) { + return $new_instance; + } + + /** + * Outputs the settings update form. + * + * @since 2.8.0 + * + * @param array $instance Current settings. + * @return string Default return is 'noform'. + */ + public function form( $instance ) { + echo '<p class="no-options-widget">' . __( 'There are no options for this widget.' ) . '</p>'; + return 'noform'; + } + + // Functions you'll need to call. + + /** + * PHP5 constructor. + * + * @since 2.8.0 + * + * @param string $id_base Optional Base ID for the widget, lowercase and unique. If left empty, + * a portion of the widget's class name will be used Has to be unique. + * @param string $name Name for the widget displayed on the configuration page. + * @param array $widget_options Optional. Widget options. See wp_register_sidebar_widget() for information + * on accepted arguments. Default empty array. + * @param array $control_options Optional. Widget control options. See wp_register_widget_control() for + * information on accepted arguments. Default empty array. + */ + public function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) { + $this->id_base = empty( $id_base ) ? preg_replace( '/(wp_)?widget_/', '', strtolower( get_class( $this ) ) ) : strtolower( $id_base ); + $this->name = $name; + $this->option_name = 'widget_' . $this->id_base; + $this->widget_options = wp_parse_args( + $widget_options, + array( + 'classname' => $this->option_name, + 'customize_selective_refresh' => false, + ) + ); + $this->control_options = wp_parse_args( $control_options, array( 'id_base' => $this->id_base ) ); + } + + /** + * PHP4 constructor. + * + * @since 2.8.0 + * @deprecated 4.3.0 Use __construct() instead. + * + * @see WP_Widget::__construct() + * + * @param string $id_base Optional Base ID for the widget, lowercase and unique. If left empty, + * a portion of the widget's class name will be used Has to be unique. + * @param string $name Name for the widget displayed on the configuration page. + * @param array $widget_options Optional. Widget options. See wp_register_sidebar_widget() for information + * on accepted arguments. Default empty array. + * @param array $control_options Optional. Widget control options. See wp_register_widget_control() for + * information on accepted arguments. Default empty array. + */ + public function WP_Widget( $id_base, $name, $widget_options = array(), $control_options = array() ) { + _deprecated_constructor( 'WP_Widget', '4.3.0', get_class( $this ) ); + WP_Widget::__construct( $id_base, $name, $widget_options, $control_options ); + } + + /** + * Constructs name attributes for use in form() fields + * + * This function should be used in form() methods to create name attributes for fields + * to be saved by update() + * + * @since 2.8.0 + * @since 4.4.0 Array format field names are now accepted. + * + * @param string $field_name Field name + * @return string Name attribute for $field_name + */ + public function get_field_name( $field_name ) { + $pos = strpos( $field_name, '[' ); + if ( false === $pos ) { + return 'widget-' . $this->id_base . '[' . $this->number . '][' . $field_name . ']'; + } else { + return 'widget-' . $this->id_base . '[' . $this->number . '][' . substr_replace( $field_name, '][', $pos, strlen( '[' ) ); + } + } + + /** + * Constructs id attributes for use in WP_Widget::form() fields. + * + * This function should be used in form() methods to create id attributes + * for fields to be saved by WP_Widget::update(). + * + * @since 2.8.0 + * @since 4.4.0 Array format field IDs are now accepted. + * + * @param string $field_name Field name. + * @return string ID attribute for `$field_name`. + */ + public function get_field_id( $field_name ) { + return 'widget-' . $this->id_base . '-' . $this->number . '-' . trim( str_replace( array( '[]', '[', ']' ), array( '', '-', '' ), $field_name ), '-' ); + } + + /** + * Register all widget instances of this widget class. + * + * @since 2.8.0 + */ + public function _register() { + $settings = $this->get_settings(); + $empty = true; + + // When $settings is an array-like object, get an intrinsic array for use with array_keys(). + if ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) { + $settings = $settings->getArrayCopy(); + } + + if ( is_array( $settings ) ) { + foreach ( array_keys( $settings ) as $number ) { + if ( is_numeric( $number ) ) { + $this->_set( $number ); + $this->_register_one( $number ); + $empty = false; + } + } + } + + if ( $empty ) { + // If there are none, we register the widget's existence with a generic template. + $this->_set( 1 ); + $this->_register_one(); + } + } + + /** + * Sets the internal order number for the widget instance. + * + * @since 2.8.0 + * + * @param int $number The unique order number of this widget instance compared to other + * instances of the same class. + */ + public function _set( $number ) { + $this->number = $number; + $this->id = $this->id_base . '-' . $number; + } + + /** + * Retrieves the widget display callback. + * + * @since 2.8.0 + * + * @return callable Display callback. + */ + public function _get_display_callback() { + return array( $this, 'display_callback' ); + } + + /** + * Retrieves the widget update callback. + * + * @since 2.8.0 + * + * @return callable Update callback. + */ + public function _get_update_callback() { + return array( $this, 'update_callback' ); + } + + /** + * Retrieves the form callback. + * + * @since 2.8.0 + * + * @return callable Form callback. + */ + public function _get_form_callback() { + return array( $this, 'form_callback' ); + } + + /** + * Determines whether the current request is inside the Customizer preview. + * + * If true -- the current request is inside the Customizer preview, then + * the object cache gets suspended and widgets should check this to decide + * whether they should store anything persistently to the object cache, + * to transients, or anywhere else. + * + * @since 3.9.0 + * + * @global WP_Customize_Manager $wp_customize + * + * @return bool True if within the Customizer preview, false if not. + */ + public function is_preview() { + global $wp_customize; + return ( isset( $wp_customize ) && $wp_customize->is_preview() ); + } + + /** + * Generates the actual widget content (Do NOT override). + * + * Finds the instance and calls WP_Widget::widget(). + * + * @since 2.8.0 + * + * @param array $args Display arguments. See WP_Widget::widget() for information + * on accepted arguments. + * @param int|array $widget_args { + * Optional. Internal order number of the widget instance, or array of multi-widget arguments. + * Default 1. + * + * @type int $number Number increment used for multiples of the same widget. + * } + */ + public function display_callback( $args, $widget_args = 1 ) { + if ( is_numeric( $widget_args ) ) { + $widget_args = array( 'number' => $widget_args ); + } + + $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); + $this->_set( $widget_args['number'] ); + $instances = $this->get_settings(); + + if ( array_key_exists( $this->number, $instances ) ) { + $instance = $instances[ $this->number ]; + + /** + * Filters the settings for a particular widget instance. + * + * Returning false will effectively short-circuit display of the widget. + * + * @since 2.8.0 + * + * @param array $instance The current widget instance's settings. + * @param WP_Widget $this The current widget instance. + * @param array $args An array of default widget arguments. + */ + $instance = apply_filters( 'widget_display_callback', $instance, $this, $args ); + + if ( false === $instance ) { + return; + } + + $was_cache_addition_suspended = wp_suspend_cache_addition(); + if ( $this->is_preview() && ! $was_cache_addition_suspended ) { + wp_suspend_cache_addition( true ); + } + + $this->widget( $args, $instance ); + + if ( $this->is_preview() ) { + wp_suspend_cache_addition( $was_cache_addition_suspended ); + } + } + } + + /** + * Handles changed settings (Do NOT override). + * + * @since 2.8.0 + * + * @global array $wp_registered_widgets + * + * @param int $deprecated Not used. + */ + public function update_callback( $deprecated = 1 ) { + global $wp_registered_widgets; + + $all_instances = $this->get_settings(); + + // We need to update the data. + if ( $this->updated ) { + return; + } + + if ( isset( $_POST['delete_widget'] ) && $_POST['delete_widget'] ) { + // Delete the settings for this instance of the widget. + if ( isset( $_POST['the-widget-id'] ) ) { + $del_id = $_POST['the-widget-id']; + } else { + return; + } + + if ( isset( $wp_registered_widgets[ $del_id ]['params'][0]['number'] ) ) { + $number = $wp_registered_widgets[ $del_id ]['params'][0]['number']; + + if ( $this->id_base . '-' . $number == $del_id ) { + unset( $all_instances[ $number ] ); + } + } + } else { + if ( isset( $_POST[ 'widget-' . $this->id_base ] ) && is_array( $_POST[ 'widget-' . $this->id_base ] ) ) { + $settings = $_POST[ 'widget-' . $this->id_base ]; + } elseif ( isset( $_POST['id_base'] ) && $_POST['id_base'] == $this->id_base ) { + $num = $_POST['multi_number'] ? (int) $_POST['multi_number'] : (int) $_POST['widget_number']; + $settings = array( $num => array() ); + } else { + return; + } + + foreach ( $settings as $number => $new_instance ) { + $new_instance = stripslashes_deep( $new_instance ); + $this->_set( $number ); + + $old_instance = isset( $all_instances[ $number ] ) ? $all_instances[ $number ] : array(); + + $was_cache_addition_suspended = wp_suspend_cache_addition(); + if ( $this->is_preview() && ! $was_cache_addition_suspended ) { + wp_suspend_cache_addition( true ); + } + + $instance = $this->update( $new_instance, $old_instance ); + + if ( $this->is_preview() ) { + wp_suspend_cache_addition( $was_cache_addition_suspended ); + } + + /** + * Filters a widget's settings before saving. + * + * Returning false will effectively short-circuit the widget's ability + * to update settings. + * + * @since 2.8.0 + * + * @param array $instance The current widget instance's settings. + * @param array $new_instance Array of new widget settings. + * @param array $old_instance Array of old widget settings. + * @param WP_Widget $this The current widget instance. + */ + $instance = apply_filters( 'widget_update_callback', $instance, $new_instance, $old_instance, $this ); + if ( false !== $instance ) { + $all_instances[ $number ] = $instance; + } + + break; // Run only once. + } + } + + $this->save_settings( $all_instances ); + $this->updated = true; + } + + /** + * Generates the widget control form (Do NOT override). + * + * @since 2.8.0 + * + * @param int|array $widget_args { + * Optional. Internal order number of the widget instance, or array of multi-widget arguments. + * Default 1. + * + * @type int $number Number increment used for multiples of the same widget. + * } + * @return string|null + */ + public function form_callback( $widget_args = 1 ) { + if ( is_numeric( $widget_args ) ) { + $widget_args = array( 'number' => $widget_args ); + } + + $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); + $all_instances = $this->get_settings(); + + if ( -1 == $widget_args['number'] ) { + // We echo out a form where 'number' can be set later. + $this->_set( '__i__' ); + $instance = array(); + } else { + $this->_set( $widget_args['number'] ); + $instance = $all_instances[ $widget_args['number'] ]; + } + + /** + * Filters the widget instance's settings before displaying the control form. + * + * Returning false effectively short-circuits display of the control form. + * + * @since 2.8.0 + * + * @param array $instance The current widget instance's settings. + * @param WP_Widget $this The current widget instance. + */ + $instance = apply_filters( 'widget_form_callback', $instance, $this ); + + $return = null; + if ( false !== $instance ) { + $return = $this->form( $instance ); + + /** + * Fires at the end of the widget control form. + * + * Use this hook to add extra fields to the widget form. The hook + * is only fired if the value passed to the 'widget_form_callback' + * hook is not false. + * + * Note: If the widget has no form, the text echoed from the default + * form method can be hidden using CSS. + * + * @since 2.8.0 + * + * @param WP_Widget $this The widget instance (passed by reference). + * @param null $return Return null if new fields are added. + * @param array $instance An array of the widget's settings. + */ + do_action_ref_array( 'in_widget_form', array( &$this, &$return, $instance ) ); + } + return $return; + } + + /** + * Registers an instance of the widget class. + * + * @since 2.8.0 + * + * @param integer $number Optional. The unique order number of this widget instance + * compared to other instances of the same class. Default -1. + */ + public function _register_one( $number = -1 ) { + wp_register_sidebar_widget( $this->id, $this->name, $this->_get_display_callback(), $this->widget_options, array( 'number' => $number ) ); + _register_widget_update_callback( $this->id_base, $this->_get_update_callback(), $this->control_options, array( 'number' => -1 ) ); + _register_widget_form_callback( $this->id, $this->name, $this->_get_form_callback(), $this->control_options, array( 'number' => $number ) ); + } + + /** + * Saves the settings for all instances of the widget class. + * + * @since 2.8.0 + * + * @param array $settings Multi-dimensional array of widget instance settings. + */ + public function save_settings( $settings ) { + $settings['_multiwidget'] = 1; + update_option( $this->option_name, $settings ); + } + + /** + * Retrieves the settings for all instances of the widget class. + * + * @since 2.8.0 + * + * @return array Multi-dimensional array of widget instance settings. + */ + public function get_settings() { + + $settings = get_option( $this->option_name ); + + if ( false === $settings ) { + if ( isset( $this->alt_option_name ) ) { + $settings = get_option( $this->alt_option_name ); + } else { + // Save an option so it can be autoloaded next time. + $this->save_settings( array() ); + } + } + + if ( ! is_array( $settings ) && ! ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) ) { + $settings = array(); + } + + if ( ! empty( $settings ) && ! isset( $settings['_multiwidget'] ) ) { + // Old format, convert if single widget. + $settings = wp_convert_widget_settings( $this->id_base, $this->option_name, $settings ); + } + + unset( $settings['_multiwidget'], $settings['__i__'] ); + return $settings; + } +} diff --git a/wp-includes/class-wp-xmlrpc-server.php b/wp-includes/class-wp-xmlrpc-server.php new file mode 100644 index 0000000..8fce283 --- /dev/null +++ b/wp-includes/class-wp-xmlrpc-server.php @@ -0,0 +1,7058 @@ +<?php +/** + * XML-RPC protocol support for WordPress + * + * @package WordPress + * @subpackage Publishing + */ + +/** + * WordPress XMLRPC server implementation. + * + * Implements compatibility for Blogger API, MetaWeblog API, MovableType, and + * pingback. Additional WordPress API for managing comments, pages, posts, + * options, etc. + * + * As of WordPress 3.5.0, XML-RPC is enabled by default. It can be disabled + * via the {@see 'xmlrpc_enabled'} filter found in wp_xmlrpc_server::login(). + * + * @since 1.5.0 + * + * @see IXR_Server + */ +class wp_xmlrpc_server extends IXR_Server { + /** + * Methods. + * + * @var array + */ + public $methods; + + /** + * Blog options. + * + * @var array + */ + public $blog_options; + + /** + * IXR_Error instance. + * + * @var IXR_Error + */ + public $error; + + /** + * Flags that the user authentication has failed in this instance of wp_xmlrpc_server. + * + * @var bool + */ + protected $auth_failed = false; + + /** + * Registers all of the XMLRPC methods that XMLRPC server understands. + * + * Sets up server and method property. Passes XMLRPC + * methods through the {@see 'xmlrpc_methods'} filter to allow plugins to extend + * or replace XML-RPC methods. + * + * @since 1.5.0 + */ + public function __construct() { + $this->methods = array( + // WordPress API. + 'wp.getUsersBlogs' => 'this:wp_getUsersBlogs', + 'wp.newPost' => 'this:wp_newPost', + 'wp.editPost' => 'this:wp_editPost', + 'wp.deletePost' => 'this:wp_deletePost', + 'wp.getPost' => 'this:wp_getPost', + 'wp.getPosts' => 'this:wp_getPosts', + 'wp.newTerm' => 'this:wp_newTerm', + 'wp.editTerm' => 'this:wp_editTerm', + 'wp.deleteTerm' => 'this:wp_deleteTerm', + 'wp.getTerm' => 'this:wp_getTerm', + 'wp.getTerms' => 'this:wp_getTerms', + 'wp.getTaxonomy' => 'this:wp_getTaxonomy', + 'wp.getTaxonomies' => 'this:wp_getTaxonomies', + 'wp.getUser' => 'this:wp_getUser', + 'wp.getUsers' => 'this:wp_getUsers', + 'wp.getProfile' => 'this:wp_getProfile', + 'wp.editProfile' => 'this:wp_editProfile', + 'wp.getPage' => 'this:wp_getPage', + 'wp.getPages' => 'this:wp_getPages', + 'wp.newPage' => 'this:wp_newPage', + 'wp.deletePage' => 'this:wp_deletePage', + 'wp.editPage' => 'this:wp_editPage', + 'wp.getPageList' => 'this:wp_getPageList', + 'wp.getAuthors' => 'this:wp_getAuthors', + 'wp.getCategories' => 'this:mw_getCategories', // Alias. + 'wp.getTags' => 'this:wp_getTags', + 'wp.newCategory' => 'this:wp_newCategory', + 'wp.deleteCategory' => 'this:wp_deleteCategory', + 'wp.suggestCategories' => 'this:wp_suggestCategories', + 'wp.uploadFile' => 'this:mw_newMediaObject', // Alias. + 'wp.deleteFile' => 'this:wp_deletePost', // Alias. + 'wp.getCommentCount' => 'this:wp_getCommentCount', + 'wp.getPostStatusList' => 'this:wp_getPostStatusList', + 'wp.getPageStatusList' => 'this:wp_getPageStatusList', + 'wp.getPageTemplates' => 'this:wp_getPageTemplates', + 'wp.getOptions' => 'this:wp_getOptions', + 'wp.setOptions' => 'this:wp_setOptions', + 'wp.getComment' => 'this:wp_getComment', + 'wp.getComments' => 'this:wp_getComments', + 'wp.deleteComment' => 'this:wp_deleteComment', + 'wp.editComment' => 'this:wp_editComment', + 'wp.newComment' => 'this:wp_newComment', + 'wp.getCommentStatusList' => 'this:wp_getCommentStatusList', + 'wp.getMediaItem' => 'this:wp_getMediaItem', + 'wp.getMediaLibrary' => 'this:wp_getMediaLibrary', + 'wp.getPostFormats' => 'this:wp_getPostFormats', + 'wp.getPostType' => 'this:wp_getPostType', + 'wp.getPostTypes' => 'this:wp_getPostTypes', + 'wp.getRevisions' => 'this:wp_getRevisions', + 'wp.restoreRevision' => 'this:wp_restoreRevision', + + // Blogger API. + 'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs', + 'blogger.getUserInfo' => 'this:blogger_getUserInfo', + 'blogger.getPost' => 'this:blogger_getPost', + 'blogger.getRecentPosts' => 'this:blogger_getRecentPosts', + 'blogger.newPost' => 'this:blogger_newPost', + 'blogger.editPost' => 'this:blogger_editPost', + 'blogger.deletePost' => 'this:blogger_deletePost', + + // MetaWeblog API (with MT extensions to structs). + 'metaWeblog.newPost' => 'this:mw_newPost', + 'metaWeblog.editPost' => 'this:mw_editPost', + 'metaWeblog.getPost' => 'this:mw_getPost', + 'metaWeblog.getRecentPosts' => 'this:mw_getRecentPosts', + 'metaWeblog.getCategories' => 'this:mw_getCategories', + 'metaWeblog.newMediaObject' => 'this:mw_newMediaObject', + + // MetaWeblog API aliases for Blogger API. + // See http://www.xmlrpc.com/stories/storyReader$2460 + 'metaWeblog.deletePost' => 'this:blogger_deletePost', + 'metaWeblog.getUsersBlogs' => 'this:blogger_getUsersBlogs', + + // MovableType API. + 'mt.getCategoryList' => 'this:mt_getCategoryList', + 'mt.getRecentPostTitles' => 'this:mt_getRecentPostTitles', + 'mt.getPostCategories' => 'this:mt_getPostCategories', + 'mt.setPostCategories' => 'this:mt_setPostCategories', + 'mt.supportedMethods' => 'this:mt_supportedMethods', + 'mt.supportedTextFilters' => 'this:mt_supportedTextFilters', + 'mt.getTrackbackPings' => 'this:mt_getTrackbackPings', + 'mt.publishPost' => 'this:mt_publishPost', + + // Pingback. + 'pingback.ping' => 'this:pingback_ping', + 'pingback.extensions.getPingbacks' => 'this:pingback_extensions_getPingbacks', + + 'demo.sayHello' => 'this:sayHello', + 'demo.addTwoNumbers' => 'this:addTwoNumbers', + ); + + $this->initialise_blog_option_info(); + + /** + * Filters the methods exposed by the XML-RPC server. + * + * This filter can be used to add new methods, and remove built-in methods. + * + * @since 1.5.0 + * + * @param string[] $methods An array of XML-RPC methods, keyed by their methodName. + */ + $this->methods = apply_filters( 'xmlrpc_methods', $this->methods ); + } + + /** + * Make private/protected methods readable for backward compatibility. + * + * @since 4.0.0 + * + * @param string $name Method to call. + * @param array $arguments Arguments to pass when calling. + * @return array|IXR_Error|false Return value of the callback, false otherwise. + */ + public function __call( $name, $arguments ) { + if ( '_multisite_getUsersBlogs' === $name ) { + return $this->_multisite_getUsersBlogs( ...$arguments ); + } + return false; + } + + /** + * Serves the XML-RPC request. + * + * @since 2.9.0 + */ + public function serve_request() { + $this->IXR_Server( $this->methods ); + } + + /** + * Test XMLRPC API by saying, "Hello!" to client. + * + * @since 1.5.0 + * + * @return string Hello string response. + */ + public function sayHello() { + return 'Hello!'; + } + + /** + * Test XMLRPC API by adding two numbers for client. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $number1 A number to add. + * @type int $number2 A second number to add. + * } + * @return int Sum of the two given numbers. + */ + public function addTwoNumbers( $args ) { + $number1 = $args[0]; + $number2 = $args[1]; + return $number1 + $number2; + } + + /** + * Log user in. + * + * @since 2.8.0 + * + * @param string $username User's username. + * @param string $password User's password. + * @return WP_User|bool WP_User object if authentication passed, false otherwise + */ + public function login( $username, $password ) { + /* + * Respect old get_option() filters left for back-compat when the 'enable_xmlrpc' + * option was deprecated in 3.5.0. Use the 'xmlrpc_enabled' hook instead. + */ + $enabled = apply_filters( 'pre_option_enable_xmlrpc', false ); + if ( false === $enabled ) { + $enabled = apply_filters( 'option_enable_xmlrpc', true ); + } + + /** + * Filters whether XML-RPC methods requiring authentication are enabled. + * + * Contrary to the way it's named, this filter does not control whether XML-RPC is *fully* + * enabled, rather, it only controls whether XML-RPC methods requiring authentication - such + * as for publishing purposes - are enabled. + * + * Further, the filter does not control whether pingbacks or other custom endpoints that don't + * require authentication are enabled. This behavior is expected, and due to how parity was matched + * with the `enable_xmlrpc` UI option the filter replaced when it was introduced in 3.5. + * + * To disable XML-RPC methods that require authentication, use: + * + * add_filter( 'xmlrpc_enabled', '__return_false' ); + * + * For more granular control over all XML-RPC methods and requests, see the {@see 'xmlrpc_methods'} + * and {@see 'xmlrpc_element_limit'} hooks. + * + * @since 3.5.0 + * + * @param bool $enabled Whether XML-RPC is enabled. Default true. + */ + $enabled = apply_filters( 'xmlrpc_enabled', $enabled ); + + if ( ! $enabled ) { + $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site.' ) ) ); + return false; + } + + if ( $this->auth_failed ) { + $user = new WP_Error( 'login_prevented' ); + } else { + $user = wp_authenticate( $username, $password ); + } + + if ( is_wp_error( $user ) ) { + $this->error = new IXR_Error( 403, __( 'Incorrect username or password.' ) ); + + // Flag that authentication has failed once on this wp_xmlrpc_server instance. + $this->auth_failed = true; + + /** + * Filters the XML-RPC user login error message. + * + * @since 3.5.0 + * + * @param string $error The XML-RPC error message. + * @param WP_Error $user WP_Error object. + */ + $this->error = apply_filters( 'xmlrpc_login_error', $this->error, $user ); + return false; + } + + wp_set_current_user( $user->ID ); + return $user; + } + + /** + * Check user's credentials. Deprecated. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use wp_xmlrpc_server::login() + * @see wp_xmlrpc_server::login() + * + * @param string $username User's username. + * @param string $password User's password. + * @return bool Whether authentication passed. + */ + public function login_pass_ok( $username, $password ) { + return (bool) $this->login( $username, $password ); + } + + /** + * Escape string or array of strings for database. + * + * @since 1.5.2 + * + * @param string|array $data Escape single string or array of strings. + * @return string|void Returns with string is passed, alters by-reference + * when array is passed. + */ + public function escape( &$data ) { + if ( ! is_array( $data ) ) { + return wp_slash( $data ); + } + + foreach ( $data as &$v ) { + if ( is_array( $v ) ) { + $this->escape( $v ); + } elseif ( ! is_object( $v ) ) { + $v = wp_slash( $v ); + } + } + } + + /** + * Retrieve custom fields for post. + * + * @since 2.5.0 + * + * @param int $post_id Post ID. + * @return array Custom fields, if exist. + */ + public function get_custom_fields( $post_id ) { + $post_id = (int) $post_id; + + $custom_fields = array(); + + foreach ( (array) has_meta( $post_id ) as $meta ) { + // Don't expose protected fields. + if ( ! current_user_can( 'edit_post_meta', $post_id, $meta['meta_key'] ) ) { + continue; + } + + $custom_fields[] = array( + 'id' => $meta['meta_id'], + 'key' => $meta['meta_key'], + 'value' => $meta['meta_value'], + ); + } + + return $custom_fields; + } + + /** + * Set custom fields for post. + * + * @since 2.5.0 + * + * @param int $post_id Post ID. + * @param array $fields Custom fields. + */ + public function set_custom_fields( $post_id, $fields ) { + $post_id = (int) $post_id; + + foreach ( (array) $fields as $meta ) { + if ( isset( $meta['id'] ) ) { + $meta['id'] = (int) $meta['id']; + $pmeta = get_metadata_by_mid( 'post', $meta['id'] ); + + if ( ! $pmeta || $pmeta->post_id != $post_id ) { + continue; + } + + if ( isset( $meta['key'] ) ) { + $meta['key'] = wp_unslash( $meta['key'] ); + if ( $meta['key'] !== $pmeta->meta_key ) { + continue; + } + $meta['value'] = wp_unslash( $meta['value'] ); + if ( current_user_can( 'edit_post_meta', $post_id, $meta['key'] ) ) { + update_metadata_by_mid( 'post', $meta['id'], $meta['value'] ); + } + } elseif ( current_user_can( 'delete_post_meta', $post_id, $pmeta->meta_key ) ) { + delete_metadata_by_mid( 'post', $meta['id'] ); + } + } elseif ( current_user_can( 'add_post_meta', $post_id, wp_unslash( $meta['key'] ) ) ) { + add_post_meta( $post_id, $meta['key'], $meta['value'] ); + } + } + } + + /** + * Retrieve custom fields for a term. + * + * @since 4.9.0 + * + * @param int $term_id Term ID. + * @return array Array of custom fields, if they exist. + */ + public function get_term_custom_fields( $term_id ) { + $term_id = (int) $term_id; + + $custom_fields = array(); + + foreach ( (array) has_term_meta( $term_id ) as $meta ) { + + if ( ! current_user_can( 'edit_term_meta', $term_id ) ) { + continue; + } + + $custom_fields[] = array( + 'id' => $meta['meta_id'], + 'key' => $meta['meta_key'], + 'value' => $meta['meta_value'], + ); + } + + return $custom_fields; + } + + /** + * Set custom fields for a term. + * + * @since 4.9.0 + * + * @param int $term_id Term ID. + * @param array $fields Custom fields. + */ + public function set_term_custom_fields( $term_id, $fields ) { + $term_id = (int) $term_id; + + foreach ( (array) $fields as $meta ) { + if ( isset( $meta['id'] ) ) { + $meta['id'] = (int) $meta['id']; + $pmeta = get_metadata_by_mid( 'term', $meta['id'] ); + if ( isset( $meta['key'] ) ) { + $meta['key'] = wp_unslash( $meta['key'] ); + if ( $meta['key'] !== $pmeta->meta_key ) { + continue; + } + $meta['value'] = wp_unslash( $meta['value'] ); + if ( current_user_can( 'edit_term_meta', $term_id ) ) { + update_metadata_by_mid( 'term', $meta['id'], $meta['value'] ); + } + } elseif ( current_user_can( 'delete_term_meta', $term_id ) ) { + delete_metadata_by_mid( 'term', $meta['id'] ); + } + } elseif ( current_user_can( 'add_term_meta', $term_id ) ) { + add_term_meta( $term_id, $meta['key'], $meta['value'] ); + } + } + } + + /** + * Set up blog options property. + * + * Passes property through {@see 'xmlrpc_blog_options'} filter. + * + * @since 2.6.0 + */ + public function initialise_blog_option_info() { + $this->blog_options = array( + // Read-only options. + 'software_name' => array( + 'desc' => __( 'Software Name' ), + 'readonly' => true, + 'value' => 'WordPress', + ), + 'software_version' => array( + 'desc' => __( 'Software Version' ), + 'readonly' => true, + 'value' => get_bloginfo( 'version' ), + ), + 'blog_url' => array( + 'desc' => __( 'WordPress Address (URL)' ), + 'readonly' => true, + 'option' => 'siteurl', + ), + 'home_url' => array( + 'desc' => __( 'Site Address (URL)' ), + 'readonly' => true, + 'option' => 'home', + ), + 'login_url' => array( + 'desc' => __( 'Login Address (URL)' ), + 'readonly' => true, + 'value' => wp_login_url(), + ), + 'admin_url' => array( + 'desc' => __( 'The URL to the admin area' ), + 'readonly' => true, + 'value' => get_admin_url(), + ), + 'image_default_link_type' => array( + 'desc' => __( 'Image default link type' ), + 'readonly' => true, + 'option' => 'image_default_link_type', + ), + 'image_default_size' => array( + 'desc' => __( 'Image default size' ), + 'readonly' => true, + 'option' => 'image_default_size', + ), + 'image_default_align' => array( + 'desc' => __( 'Image default align' ), + 'readonly' => true, + 'option' => 'image_default_align', + ), + 'template' => array( + 'desc' => __( 'Template' ), + 'readonly' => true, + 'option' => 'template', + ), + 'stylesheet' => array( + 'desc' => __( 'Stylesheet' ), + 'readonly' => true, + 'option' => 'stylesheet', + ), + 'post_thumbnail' => array( + 'desc' => __( 'Post Thumbnail' ), + 'readonly' => true, + 'value' => current_theme_supports( 'post-thumbnails' ), + ), + + // Updatable options. + 'time_zone' => array( + 'desc' => __( 'Time Zone' ), + 'readonly' => false, + 'option' => 'gmt_offset', + ), + 'blog_title' => array( + 'desc' => __( 'Site Title' ), + 'readonly' => false, + 'option' => 'blogname', + ), + 'blog_tagline' => array( + 'desc' => __( 'Site Tagline' ), + 'readonly' => false, + 'option' => 'blogdescription', + ), + 'date_format' => array( + 'desc' => __( 'Date Format' ), + 'readonly' => false, + 'option' => 'date_format', + ), + 'time_format' => array( + 'desc' => __( 'Time Format' ), + 'readonly' => false, + 'option' => 'time_format', + ), + 'users_can_register' => array( + 'desc' => __( 'Allow new users to sign up' ), + 'readonly' => false, + 'option' => 'users_can_register', + ), + 'thumbnail_size_w' => array( + 'desc' => __( 'Thumbnail Width' ), + 'readonly' => false, + 'option' => 'thumbnail_size_w', + ), + 'thumbnail_size_h' => array( + 'desc' => __( 'Thumbnail Height' ), + 'readonly' => false, + 'option' => 'thumbnail_size_h', + ), + 'thumbnail_crop' => array( + 'desc' => __( 'Crop thumbnail to exact dimensions' ), + 'readonly' => false, + 'option' => 'thumbnail_crop', + ), + 'medium_size_w' => array( + 'desc' => __( 'Medium size image width' ), + 'readonly' => false, + 'option' => 'medium_size_w', + ), + 'medium_size_h' => array( + 'desc' => __( 'Medium size image height' ), + 'readonly' => false, + 'option' => 'medium_size_h', + ), + 'medium_large_size_w' => array( + 'desc' => __( 'Medium-Large size image width' ), + 'readonly' => false, + 'option' => 'medium_large_size_w', + ), + 'medium_large_size_h' => array( + 'desc' => __( 'Medium-Large size image height' ), + 'readonly' => false, + 'option' => 'medium_large_size_h', + ), + 'large_size_w' => array( + 'desc' => __( 'Large size image width' ), + 'readonly' => false, + 'option' => 'large_size_w', + ), + 'large_size_h' => array( + 'desc' => __( 'Large size image height' ), + 'readonly' => false, + 'option' => 'large_size_h', + ), + 'default_comment_status' => array( + 'desc' => __( 'Allow people to submit comments on new posts.' ), + 'readonly' => false, + 'option' => 'default_comment_status', + ), + 'default_ping_status' => array( + 'desc' => __( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new posts.' ), + 'readonly' => false, + 'option' => 'default_ping_status', + ), + ); + + /** + * Filters the XML-RPC blog options property. + * + * @since 2.6.0 + * + * @param array $blog_options An array of XML-RPC blog options. + */ + $this->blog_options = apply_filters( 'xmlrpc_blog_options', $this->blog_options ); + } + + /** + * Retrieve the blogs of the user. + * + * @since 2.6.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type string $username Username. + * @type string $password Password. + * } + * @return array|IXR_Error Array contains: + * - 'isAdmin' + * - 'isPrimary' - whether the blog is the user's primary blog + * - 'url' + * - 'blogid' + * - 'blogName' + * - 'xmlrpc' - url of xmlrpc endpoint + */ + public function wp_getUsersBlogs( $args ) { + if ( ! $this->minimum_args( $args, 2 ) ) { + return $this->error; + } + + // If this isn't on WPMU then just use blogger_getUsersBlogs(). + if ( ! is_multisite() ) { + array_unshift( $args, 1 ); + return $this->blogger_getUsersBlogs( $args ); + } + + $this->escape( $args ); + + $username = $args[0]; + $password = $args[1]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** + * Fires after the XML-RPC user has been authenticated but before the rest of + * the method logic begins. + * + * All built-in XML-RPC methods use the action xmlrpc_call, with a parameter + * equal to the method's name, e.g., wp.getUsersBlogs, wp.newPost, etc. + * + * @since 2.5.0 + * + * @param string $name The method name. + */ + do_action( 'xmlrpc_call', 'wp.getUsersBlogs' ); + + $blogs = (array) get_blogs_of_user( $user->ID ); + $struct = array(); + $primary_blog_id = 0; + $active_blog = get_active_blog_for_user( $user->ID ); + if ( $active_blog ) { + $primary_blog_id = (int) $active_blog->blog_id; + } + + foreach ( $blogs as $blog ) { + // Don't include blogs that aren't hosted at this site. + if ( get_current_network_id() != $blog->site_id ) { + continue; + } + + $blog_id = $blog->userblog_id; + + switch_to_blog( $blog_id ); + + $is_admin = current_user_can( 'manage_options' ); + $is_primary = ( (int) $blog_id === $primary_blog_id ); + + $struct[] = array( + 'isAdmin' => $is_admin, + 'isPrimary' => $is_primary, + 'url' => home_url( '/' ), + 'blogid' => (string) $blog_id, + 'blogName' => get_option( 'blogname' ), + 'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ), + ); + + restore_current_blog(); + } + + return $struct; + } + + /** + * Checks if the method received at least the minimum number of arguments. + * + * @since 3.4.0 + * + * @param array $args An array of arguments to check. + * @param int $count Minimum number of arguments. + * @return bool True if `$args` contains at least `$count` arguments, false otherwise. + */ + protected function minimum_args( $args, $count ) { + if ( ! is_array( $args ) || count( $args ) < $count ) { + $this->error = new IXR_Error( 400, __( 'Insufficient arguments passed to this XML-RPC method.' ) ); + return false; + } + + return true; + } + + /** + * Prepares taxonomy data for return in an XML-RPC object. + * + * @param object $taxonomy The unprepared taxonomy data. + * @param array $fields The subset of taxonomy fields to return. + * @return array The prepared taxonomy data. + */ + protected function _prepare_taxonomy( $taxonomy, $fields ) { + $_taxonomy = array( + 'name' => $taxonomy->name, + 'label' => $taxonomy->label, + 'hierarchical' => (bool) $taxonomy->hierarchical, + 'public' => (bool) $taxonomy->public, + 'show_ui' => (bool) $taxonomy->show_ui, + '_builtin' => (bool) $taxonomy->_builtin, + ); + + if ( in_array( 'labels', $fields ) ) { + $_taxonomy['labels'] = (array) $taxonomy->labels; + } + + if ( in_array( 'cap', $fields ) ) { + $_taxonomy['cap'] = (array) $taxonomy->cap; + } + + if ( in_array( 'menu', $fields ) ) { + $_taxonomy['show_in_menu'] = (bool) $_taxonomy->show_in_menu; + } + + if ( in_array( 'object_type', $fields ) ) { + $_taxonomy['object_type'] = array_unique( (array) $taxonomy->object_type ); + } + + /** + * Filters XML-RPC-prepared data for the given taxonomy. + * + * @since 3.4.0 + * + * @param array $_taxonomy An array of taxonomy data. + * @param WP_Taxonomy $taxonomy Taxonomy object. + * @param array $fields The subset of taxonomy fields to return. + */ + return apply_filters( 'xmlrpc_prepare_taxonomy', $_taxonomy, $taxonomy, $fields ); + } + + /** + * Prepares term data for return in an XML-RPC object. + * + * @param array|object $term The unprepared term data. + * @return array The prepared term data. + */ + protected function _prepare_term( $term ) { + $_term = $term; + if ( ! is_array( $_term ) ) { + $_term = get_object_vars( $_term ); + } + + // For integers which may be larger than XML-RPC supports ensure we return strings. + $_term['term_id'] = strval( $_term['term_id'] ); + $_term['term_group'] = strval( $_term['term_group'] ); + $_term['term_taxonomy_id'] = strval( $_term['term_taxonomy_id'] ); + $_term['parent'] = strval( $_term['parent'] ); + + // Count we are happy to return as an integer because people really shouldn't use terms that much. + $_term['count'] = intval( $_term['count'] ); + + // Get term meta. + $_term['custom_fields'] = $this->get_term_custom_fields( $_term['term_id'] ); + + /** + * Filters XML-RPC-prepared data for the given term. + * + * @since 3.4.0 + * + * @param array $_term An array of term data. + * @param array|object $term Term object or array. + */ + return apply_filters( 'xmlrpc_prepare_term', $_term, $term ); + } + + /** + * Convert a WordPress date string to an IXR_Date object. + * + * @param string $date Date string to convert. + * @return IXR_Date IXR_Date object. + */ + protected function _convert_date( $date ) { + if ( '0000-00-00 00:00:00' === $date ) { + return new IXR_Date( '00000000T00:00:00Z' ); + } + return new IXR_Date( mysql2date( 'Ymd\TH:i:s', $date, false ) ); + } + + /** + * Convert a WordPress GMT date string to an IXR_Date object. + * + * @param string $date_gmt WordPress GMT date string. + * @param string $date Date string. + * @return IXR_Date IXR_Date object. + */ + protected function _convert_date_gmt( $date_gmt, $date ) { + if ( '0000-00-00 00:00:00' !== $date && '0000-00-00 00:00:00' === $date_gmt ) { + return new IXR_Date( get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $date, false ), 'Ymd\TH:i:s' ) ); + } + return $this->_convert_date( $date_gmt ); + } + + /** + * Prepares post data for return in an XML-RPC object. + * + * @param array $post The unprepared post data. + * @param array $fields The subset of post type fields to return. + * @return array The prepared post data. + */ + protected function _prepare_post( $post, $fields ) { + // Holds the data for this post. built up based on $fields. + $_post = array( 'post_id' => strval( $post['ID'] ) ); + + // Prepare common post fields. + $post_fields = array( + 'post_title' => $post['post_title'], + 'post_date' => $this->_convert_date( $post['post_date'] ), + 'post_date_gmt' => $this->_convert_date_gmt( $post['post_date_gmt'], $post['post_date'] ), + 'post_modified' => $this->_convert_date( $post['post_modified'] ), + 'post_modified_gmt' => $this->_convert_date_gmt( $post['post_modified_gmt'], $post['post_modified'] ), + 'post_status' => $post['post_status'], + 'post_type' => $post['post_type'], + 'post_name' => $post['post_name'], + 'post_author' => $post['post_author'], + 'post_password' => $post['post_password'], + 'post_excerpt' => $post['post_excerpt'], + 'post_content' => $post['post_content'], + 'post_parent' => strval( $post['post_parent'] ), + 'post_mime_type' => $post['post_mime_type'], + 'link' => get_permalink( $post['ID'] ), + 'guid' => $post['guid'], + 'menu_order' => intval( $post['menu_order'] ), + 'comment_status' => $post['comment_status'], + 'ping_status' => $post['ping_status'], + 'sticky' => ( 'post' === $post['post_type'] && is_sticky( $post['ID'] ) ), + ); + + // Thumbnail. + $post_fields['post_thumbnail'] = array(); + $thumbnail_id = get_post_thumbnail_id( $post['ID'] ); + if ( $thumbnail_id ) { + $thumbnail_size = current_theme_supports( 'post-thumbnail' ) ? 'post-thumbnail' : 'thumbnail'; + $post_fields['post_thumbnail'] = $this->_prepare_media_item( get_post( $thumbnail_id ), $thumbnail_size ); + } + + // Consider future posts as published. + if ( 'future' === $post_fields['post_status'] ) { + $post_fields['post_status'] = 'publish'; + } + + // Fill in blank post format. + $post_fields['post_format'] = get_post_format( $post['ID'] ); + if ( empty( $post_fields['post_format'] ) ) { + $post_fields['post_format'] = 'standard'; + } + + // Merge requested $post_fields fields into $_post. + if ( in_array( 'post', $fields ) ) { + $_post = array_merge( $_post, $post_fields ); + } else { + $requested_fields = array_intersect_key( $post_fields, array_flip( $fields ) ); + $_post = array_merge( $_post, $requested_fields ); + } + + $all_taxonomy_fields = in_array( 'taxonomies', $fields ); + + if ( $all_taxonomy_fields || in_array( 'terms', $fields ) ) { + $post_type_taxonomies = get_object_taxonomies( $post['post_type'], 'names' ); + $terms = wp_get_object_terms( $post['ID'], $post_type_taxonomies ); + $_post['terms'] = array(); + foreach ( $terms as $term ) { + $_post['terms'][] = $this->_prepare_term( $term ); + } + } + + if ( in_array( 'custom_fields', $fields ) ) { + $_post['custom_fields'] = $this->get_custom_fields( $post['ID'] ); + } + + if ( in_array( 'enclosure', $fields ) ) { + $_post['enclosure'] = array(); + $enclosures = (array) get_post_meta( $post['ID'], 'enclosure' ); + if ( ! empty( $enclosures ) ) { + $encdata = explode( "\n", $enclosures[0] ); + $_post['enclosure']['url'] = trim( htmlspecialchars( $encdata[0] ) ); + $_post['enclosure']['length'] = (int) trim( $encdata[1] ); + $_post['enclosure']['type'] = trim( $encdata[2] ); + } + } + + /** + * Filters XML-RPC-prepared date for the given post. + * + * @since 3.4.0 + * + * @param array $_post An array of modified post data. + * @param array $post An array of post data. + * @param array $fields An array of post fields. + */ + return apply_filters( 'xmlrpc_prepare_post', $_post, $post, $fields ); + } + + /** + * Prepares post data for return in an XML-RPC object. + * + * @since 3.4.0 + * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object. + * + * @param WP_Post_Type $post_type Post type object. + * @param array $fields The subset of post fields to return. + * @return array The prepared post type data. + */ + protected function _prepare_post_type( $post_type, $fields ) { + $_post_type = array( + 'name' => $post_type->name, + 'label' => $post_type->label, + 'hierarchical' => (bool) $post_type->hierarchical, + 'public' => (bool) $post_type->public, + 'show_ui' => (bool) $post_type->show_ui, + '_builtin' => (bool) $post_type->_builtin, + 'has_archive' => (bool) $post_type->has_archive, + 'supports' => get_all_post_type_supports( $post_type->name ), + ); + + if ( in_array( 'labels', $fields ) ) { + $_post_type['labels'] = (array) $post_type->labels; + } + + if ( in_array( 'cap', $fields ) ) { + $_post_type['cap'] = (array) $post_type->cap; + $_post_type['map_meta_cap'] = (bool) $post_type->map_meta_cap; + } + + if ( in_array( 'menu', $fields ) ) { + $_post_type['menu_position'] = (int) $post_type->menu_position; + $_post_type['menu_icon'] = $post_type->menu_icon; + $_post_type['show_in_menu'] = (bool) $post_type->show_in_menu; + } + + if ( in_array( 'taxonomies', $fields ) ) { + $_post_type['taxonomies'] = get_object_taxonomies( $post_type->name, 'names' ); + } + + /** + * Filters XML-RPC-prepared date for the given post type. + * + * @since 3.4.0 + * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object. + * + * @param array $_post_type An array of post type data. + * @param WP_Post_Type $post_type Post type object. + */ + return apply_filters( 'xmlrpc_prepare_post_type', $_post_type, $post_type ); + } + + /** + * Prepares media item data for return in an XML-RPC object. + * + * @param object $media_item The unprepared media item data. + * @param string $thumbnail_size The image size to use for the thumbnail URL. + * @return array The prepared media item data. + */ + protected function _prepare_media_item( $media_item, $thumbnail_size = 'thumbnail' ) { + $_media_item = array( + 'attachment_id' => strval( $media_item->ID ), + 'date_created_gmt' => $this->_convert_date_gmt( $media_item->post_date_gmt, $media_item->post_date ), + 'parent' => $media_item->post_parent, + 'link' => wp_get_attachment_url( $media_item->ID ), + 'title' => $media_item->post_title, + 'caption' => $media_item->post_excerpt, + 'description' => $media_item->post_content, + 'metadata' => wp_get_attachment_metadata( $media_item->ID ), + 'type' => $media_item->post_mime_type, + ); + + $thumbnail_src = image_downsize( $media_item->ID, $thumbnail_size ); + if ( $thumbnail_src ) { + $_media_item['thumbnail'] = $thumbnail_src[0]; + } else { + $_media_item['thumbnail'] = $_media_item['link']; + } + + /** + * Filters XML-RPC-prepared data for the given media item. + * + * @since 3.4.0 + * + * @param array $_media_item An array of media item data. + * @param object $media_item Media item object. + * @param string $thumbnail_size Image size. + */ + return apply_filters( 'xmlrpc_prepare_media_item', $_media_item, $media_item, $thumbnail_size ); + } + + /** + * Prepares page data for return in an XML-RPC object. + * + * @param object $page The unprepared page data. + * @return array The prepared page data. + */ + protected function _prepare_page( $page ) { + // Get all of the page content and link. + $full_page = get_extended( $page->post_content ); + $link = get_permalink( $page->ID ); + + // Get info the page parent if there is one. + $parent_title = ''; + if ( ! empty( $page->post_parent ) ) { + $parent = get_post( $page->post_parent ); + $parent_title = $parent->post_title; + } + + // Determine comment and ping settings. + $allow_comments = comments_open( $page->ID ) ? 1 : 0; + $allow_pings = pings_open( $page->ID ) ? 1 : 0; + + // Format page date. + $page_date = $this->_convert_date( $page->post_date ); + $page_date_gmt = $this->_convert_date_gmt( $page->post_date_gmt, $page->post_date ); + + // Pull the categories info together. + $categories = array(); + if ( is_object_in_taxonomy( 'page', 'category' ) ) { + foreach ( wp_get_post_categories( $page->ID ) as $cat_id ) { + $categories[] = get_cat_name( $cat_id ); + } + } + + // Get the author info. + $author = get_userdata( $page->post_author ); + + $page_template = get_page_template_slug( $page->ID ); + if ( empty( $page_template ) ) { + $page_template = 'default'; + } + + $_page = array( + 'dateCreated' => $page_date, + 'userid' => $page->post_author, + 'page_id' => $page->ID, + 'page_status' => $page->post_status, + 'description' => $full_page['main'], + 'title' => $page->post_title, + 'link' => $link, + 'permaLink' => $link, + 'categories' => $categories, + 'excerpt' => $page->post_excerpt, + 'text_more' => $full_page['extended'], + 'mt_allow_comments' => $allow_comments, + 'mt_allow_pings' => $allow_pings, + 'wp_slug' => $page->post_name, + 'wp_password' => $page->post_password, + 'wp_author' => $author->display_name, + 'wp_page_parent_id' => $page->post_parent, + 'wp_page_parent_title' => $parent_title, + 'wp_page_order' => $page->menu_order, + 'wp_author_id' => (string) $author->ID, + 'wp_author_display_name' => $author->display_name, + 'date_created_gmt' => $page_date_gmt, + 'custom_fields' => $this->get_custom_fields( $page->ID ), + 'wp_page_template' => $page_template, + ); + + /** + * Filters XML-RPC-prepared data for the given page. + * + * @since 3.4.0 + * + * @param array $_page An array of page data. + * @param WP_Post $page Page object. + */ + return apply_filters( 'xmlrpc_prepare_page', $_page, $page ); + } + + /** + * Prepares comment data for return in an XML-RPC object. + * + * @param object $comment The unprepared comment data. + * @return array The prepared comment data. + */ + protected function _prepare_comment( $comment ) { + // Format page date. + $comment_date_gmt = $this->_convert_date_gmt( $comment->comment_date_gmt, $comment->comment_date ); + + if ( '0' == $comment->comment_approved ) { + $comment_status = 'hold'; + } elseif ( 'spam' == $comment->comment_approved ) { + $comment_status = 'spam'; + } elseif ( '1' == $comment->comment_approved ) { + $comment_status = 'approve'; + } else { + $comment_status = $comment->comment_approved; + } + $_comment = array( + 'date_created_gmt' => $comment_date_gmt, + 'user_id' => $comment->user_id, + 'comment_id' => $comment->comment_ID, + 'parent' => $comment->comment_parent, + 'status' => $comment_status, + 'content' => $comment->comment_content, + 'link' => get_comment_link( $comment ), + 'post_id' => $comment->comment_post_ID, + 'post_title' => get_the_title( $comment->comment_post_ID ), + 'author' => $comment->comment_author, + 'author_url' => $comment->comment_author_url, + 'author_email' => $comment->comment_author_email, + 'author_ip' => $comment->comment_author_IP, + 'type' => $comment->comment_type, + ); + + /** + * Filters XML-RPC-prepared data for the given comment. + * + * @since 3.4.0 + * + * @param array $_comment An array of prepared comment data. + * @param WP_Comment $comment Comment object. + */ + return apply_filters( 'xmlrpc_prepare_comment', $_comment, $comment ); + } + + /** + * Prepares user data for return in an XML-RPC object. + * + * @param WP_User $user The unprepared user object. + * @param array $fields The subset of user fields to return. + * @return array The prepared user data. + */ + protected function _prepare_user( $user, $fields ) { + $_user = array( 'user_id' => strval( $user->ID ) ); + + $user_fields = array( + 'username' => $user->user_login, + 'first_name' => $user->user_firstname, + 'last_name' => $user->user_lastname, + 'registered' => $this->_convert_date( $user->user_registered ), + 'bio' => $user->user_description, + 'email' => $user->user_email, + 'nickname' => $user->nickname, + 'nicename' => $user->user_nicename, + 'url' => $user->user_url, + 'display_name' => $user->display_name, + 'roles' => $user->roles, + ); + + if ( in_array( 'all', $fields ) ) { + $_user = array_merge( $_user, $user_fields ); + } else { + if ( in_array( 'basic', $fields ) ) { + $basic_fields = array( 'username', 'email', 'registered', 'display_name', 'nicename' ); + $fields = array_merge( $fields, $basic_fields ); + } + $requested_fields = array_intersect_key( $user_fields, array_flip( $fields ) ); + $_user = array_merge( $_user, $requested_fields ); + } + + /** + * Filters XML-RPC-prepared data for the given user. + * + * @since 3.5.0 + * + * @param array $_user An array of user data. + * @param WP_User $user User object. + * @param array $fields An array of user fields. + */ + return apply_filters( 'xmlrpc_prepare_user', $_user, $user, $fields ); + } + + /** + * Create a new post for any registered post type. + * + * @since 3.4.0 + * + * @link https://en.wikipedia.org/wiki/RSS_enclosure for information on RSS enclosures. + * + * @param array $args { + * Method arguments. Note: top-level arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type array $content_struct { + * Content struct for adding a new post. See wp_insert_post() for information on + * additional post fields + * + * @type string $post_type Post type. Default 'post'. + * @type string $post_status Post status. Default 'draft' + * @type string $post_title Post title. + * @type int $post_author Post author ID. + * @type string $post_excerpt Post excerpt. + * @type string $post_content Post content. + * @type string $post_date_gmt Post date in GMT. + * @type string $post_date Post date. + * @type string $post_password Post password (20-character limit). + * @type string $comment_status Post comment enabled status. Accepts 'open' or 'closed'. + * @type string $ping_status Post ping status. Accepts 'open' or 'closed'. + * @type bool $sticky Whether the post should be sticky. Automatically false if + * `$post_status` is 'private'. + * @type int $post_thumbnail ID of an image to use as the post thumbnail/featured image. + * @type array $custom_fields Array of meta key/value pairs to add to the post. + * @type array $terms Associative array with taxonomy names as keys and arrays + * of term IDs as values. + * @type array $terms_names Associative array with taxonomy names as keys and arrays + * of term names as values. + * @type array $enclosure { + * Array of feed enclosure data to add to post meta. + * + * @type string $url URL for the feed enclosure. + * @type int $length Size in bytes of the enclosure. + * @type string $type Mime-type for the enclosure. + * } + * } + * } + * @return int|IXR_Error Post ID on success, IXR_Error instance otherwise. + */ + public function wp_newPost( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $content_struct = $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + // Convert the date field back to IXR form. + if ( isset( $content_struct['post_date'] ) && ! ( $content_struct['post_date'] instanceof IXR_Date ) ) { + $content_struct['post_date'] = $this->_convert_date( $content_struct['post_date'] ); + } + + /* + * Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct, + * since _insert_post() will ignore the non-GMT date if the GMT date is set. + */ + if ( isset( $content_struct['post_date_gmt'] ) && ! ( $content_struct['post_date_gmt'] instanceof IXR_Date ) ) { + if ( '0000-00-00 00:00:00' === $content_struct['post_date_gmt'] || isset( $content_struct['post_date'] ) ) { + unset( $content_struct['post_date_gmt'] ); + } else { + $content_struct['post_date_gmt'] = $this->_convert_date( $content_struct['post_date_gmt'] ); + } + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.newPost' ); + + unset( $content_struct['ID'] ); + + return $this->_insert_post( $user, $content_struct ); + } + + /** + * Helper method for filtering out elements from an array. + * + * @since 3.4.0 + * + * @param int $count Number to compare to one. + */ + private function _is_greater_than_one( $count ) { + return $count > 1; + } + + /** + * Encapsulate the logic for sticking a post + * and determining if the user has permission to do so + * + * @since 4.3.0 + * + * @param array $post_data + * @param bool $update + * @return void|IXR_Error + */ + private function _toggle_sticky( $post_data, $update = false ) { + $post_type = get_post_type_object( $post_data['post_type'] ); + + // Private and password-protected posts cannot be stickied. + if ( 'private' === $post_data['post_status'] || ! empty( $post_data['post_password'] ) ) { + // Error if the client tried to stick the post, otherwise, silently unstick. + if ( ! empty( $post_data['sticky'] ) ) { + return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) ); + } + + if ( $update ) { + unstick_post( $post_data['ID'] ); + } + } elseif ( isset( $post_data['sticky'] ) ) { + if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to make posts sticky.' ) ); + } + + $sticky = wp_validate_boolean( $post_data['sticky'] ); + if ( $sticky ) { + stick_post( $post_data['ID'] ); + } else { + unstick_post( $post_data['ID'] ); + } + } + } + + /** + * Helper method for wp_newPost() and wp_editPost(), containing shared logic. + * + * @since 3.4.0 + * + * @see wp_insert_post() + * + * @param WP_User $user The post author if post_author isn't set in $content_struct. + * @param array|IXR_Error $content_struct Post data to insert. + * @return IXR_Error|string + */ + protected function _insert_post( $user, $content_struct ) { + $defaults = array( + 'post_status' => 'draft', + 'post_type' => 'post', + 'post_author' => null, + 'post_password' => null, + 'post_excerpt' => null, + 'post_content' => null, + 'post_title' => null, + 'post_date' => null, + 'post_date_gmt' => null, + 'post_format' => null, + 'post_name' => null, + 'post_thumbnail' => null, + 'post_parent' => null, + 'ping_status' => null, + 'comment_status' => null, + 'custom_fields' => null, + 'terms_names' => null, + 'terms' => null, + 'sticky' => null, + 'enclosure' => null, + 'ID' => null, + ); + + $post_data = wp_parse_args( array_intersect_key( $content_struct, $defaults ), $defaults ); + + $post_type = get_post_type_object( $post_data['post_type'] ); + if ( ! $post_type ) { + return new IXR_Error( 403, __( 'Invalid post type.' ) ); + } + + $update = ! empty( $post_data['ID'] ); + + if ( $update ) { + if ( ! get_post( $post_data['ID'] ) ) { + return new IXR_Error( 401, __( 'Invalid post ID.' ) ); + } + if ( ! current_user_can( 'edit_post', $post_data['ID'] ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + if ( get_post_type( $post_data['ID'] ) !== $post_data['post_type'] ) { + return new IXR_Error( 401, __( 'The post type may not be changed.' ) ); + } + } else { + if ( ! current_user_can( $post_type->cap->create_posts ) || ! current_user_can( $post_type->cap->edit_posts ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) ); + } + } + + switch ( $post_data['post_status'] ) { + case 'draft': + case 'pending': + break; + case 'private': + if ( ! current_user_can( $post_type->cap->publish_posts ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to create private posts in this post type.' ) ); + } + break; + case 'publish': + case 'future': + if ( ! current_user_can( $post_type->cap->publish_posts ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts in this post type.' ) ); + } + break; + default: + if ( ! get_post_status_object( $post_data['post_status'] ) ) { + $post_data['post_status'] = 'draft'; + } + break; + } + + if ( ! empty( $post_data['post_password'] ) && ! current_user_can( $post_type->cap->publish_posts ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to create password protected posts in this post type.' ) ); + } + + $post_data['post_author'] = absint( $post_data['post_author'] ); + if ( ! empty( $post_data['post_author'] ) && $post_data['post_author'] != $user->ID ) { + if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) ); + } + + $author = get_userdata( $post_data['post_author'] ); + + if ( ! $author ) { + return new IXR_Error( 404, __( 'Invalid author ID.' ) ); + } + } else { + $post_data['post_author'] = $user->ID; + } + + if ( isset( $post_data['comment_status'] ) && 'open' !== $post_data['comment_status'] && 'closed' !== $post_data['comment_status'] ) { + unset( $post_data['comment_status'] ); + } + + if ( isset( $post_data['ping_status'] ) && 'open' !== $post_data['ping_status'] && 'closed' !== $post_data['ping_status'] ) { + unset( $post_data['ping_status'] ); + } + + // Do some timestamp voodoo. + if ( ! empty( $post_data['post_date_gmt'] ) ) { + // We know this is supposed to be GMT, so we're going to slap that Z on there by force. + $dateCreated = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z'; + } elseif ( ! empty( $post_data['post_date'] ) ) { + $dateCreated = $post_data['post_date']->getIso(); + } + + // Default to not flagging the post date to be edited unless it's intentional. + $post_data['edit_date'] = false; + + if ( ! empty( $dateCreated ) ) { + $post_data['post_date'] = iso8601_to_datetime( $dateCreated ); + $post_data['post_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' ); + + // Flag the post date to be edited. + $post_data['edit_date'] = true; + } + + if ( ! isset( $post_data['ID'] ) ) { + $post_data['ID'] = get_default_post_to_edit( $post_data['post_type'], true )->ID; + } + $post_ID = $post_data['ID']; + + if ( 'post' === $post_data['post_type'] ) { + $error = $this->_toggle_sticky( $post_data, $update ); + if ( $error ) { + return $error; + } + } + + if ( isset( $post_data['post_thumbnail'] ) ) { + // Empty value deletes, non-empty value adds/updates. + if ( ! $post_data['post_thumbnail'] ) { + delete_post_thumbnail( $post_ID ); + } elseif ( ! get_post( absint( $post_data['post_thumbnail'] ) ) ) { + return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); + } + set_post_thumbnail( $post_ID, $post_data['post_thumbnail'] ); + unset( $content_struct['post_thumbnail'] ); + } + + if ( isset( $post_data['custom_fields'] ) ) { + $this->set_custom_fields( $post_ID, $post_data['custom_fields'] ); + } + + if ( isset( $post_data['terms'] ) || isset( $post_data['terms_names'] ) ) { + $post_type_taxonomies = get_object_taxonomies( $post_data['post_type'], 'objects' ); + + // Accumulate term IDs from terms and terms_names. + $terms = array(); + + // First validate the terms specified by ID. + if ( isset( $post_data['terms'] ) && is_array( $post_data['terms'] ) ) { + $taxonomies = array_keys( $post_data['terms'] ); + + // Validating term ids. + foreach ( $taxonomies as $taxonomy ) { + if ( ! array_key_exists( $taxonomy, $post_type_taxonomies ) ) { + return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) ); + } + + if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->assign_terms ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) ); + } + + $term_ids = $post_data['terms'][ $taxonomy ]; + $terms[ $taxonomy ] = array(); + foreach ( $term_ids as $term_id ) { + $term = get_term_by( 'id', $term_id, $taxonomy ); + + if ( ! $term ) { + return new IXR_Error( 403, __( 'Invalid term ID.' ) ); + } + + $terms[ $taxonomy ][] = (int) $term_id; + } + } + } + + // Now validate terms specified by name. + if ( isset( $post_data['terms_names'] ) && is_array( $post_data['terms_names'] ) ) { + $taxonomies = array_keys( $post_data['terms_names'] ); + + foreach ( $taxonomies as $taxonomy ) { + if ( ! array_key_exists( $taxonomy, $post_type_taxonomies ) ) { + return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) ); + } + + if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->assign_terms ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) ); + } + + /* + * For hierarchical taxonomies, we can't assign a term when multiple terms + * in the hierarchy share the same name. + */ + $ambiguous_terms = array(); + if ( is_taxonomy_hierarchical( $taxonomy ) ) { + $tax_term_names = get_terms( + array( + 'taxonomy' => $taxonomy, + 'fields' => 'names', + 'hide_empty' => false, + ) + ); + + // Count the number of terms with the same name. + $tax_term_names_count = array_count_values( $tax_term_names ); + + // Filter out non-ambiguous term names. + $ambiguous_tax_term_counts = array_filter( $tax_term_names_count, array( $this, '_is_greater_than_one' ) ); + + $ambiguous_terms = array_keys( $ambiguous_tax_term_counts ); + } + + $term_names = $post_data['terms_names'][ $taxonomy ]; + foreach ( $term_names as $term_name ) { + if ( in_array( $term_name, $ambiguous_terms ) ) { + return new IXR_Error( 401, __( 'Ambiguous term name used in a hierarchical taxonomy. Please use term ID instead.' ) ); + } + + $term = get_term_by( 'name', $term_name, $taxonomy ); + + if ( ! $term ) { + // Term doesn't exist, so check that the user is allowed to create new terms. + if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->edit_terms ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to add a term to one of the given taxonomies.' ) ); + } + + // Create the new term. + $term_info = wp_insert_term( $term_name, $taxonomy ); + if ( is_wp_error( $term_info ) ) { + return new IXR_Error( 500, $term_info->get_error_message() ); + } + + $terms[ $taxonomy ][] = (int) $term_info['term_id']; + } else { + $terms[ $taxonomy ][] = (int) $term->term_id; + } + } + } + } + + $post_data['tax_input'] = $terms; + unset( $post_data['terms'], $post_data['terms_names'] ); + } + + if ( isset( $post_data['post_format'] ) ) { + $format = set_post_format( $post_ID, $post_data['post_format'] ); + + if ( is_wp_error( $format ) ) { + return new IXR_Error( 500, $format->get_error_message() ); + } + + unset( $post_data['post_format'] ); + } + + // Handle enclosures. + $enclosure = isset( $post_data['enclosure'] ) ? $post_data['enclosure'] : null; + $this->add_enclosure_if_new( $post_ID, $enclosure ); + + $this->attach_uploads( $post_ID, $post_data['post_content'] ); + + /** + * Filters post data array to be inserted via XML-RPC. + * + * @since 3.4.0 + * + * @param array $post_data Parsed array of post data. + * @param array $content_struct Post data array. + */ + $post_data = apply_filters( 'xmlrpc_wp_insert_post_data', $post_data, $content_struct ); + + $post_ID = $update ? wp_update_post( $post_data, true ) : wp_insert_post( $post_data, true ); + if ( is_wp_error( $post_ID ) ) { + return new IXR_Error( 500, $post_ID->get_error_message() ); + } + + if ( ! $post_ID ) { + if ( $update ) { + return new IXR_Error( 401, __( 'Sorry, the post could not be updated.' ) ); + } else { + return new IXR_Error( 401, __( 'Sorry, the post could not be created.' ) ); + } + } + + return strval( $post_ID ); + } + + /** + * Edit a post for any registered post type. + * + * The $content_struct parameter only needs to contain fields that + * should be changed. All other fields will retain their existing values. + * + * @since 3.4.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type int $post_id Post ID. + * @type array $content_struct Extra content arguments. + * } + * @return true|IXR_Error True on success, IXR_Error on failure. + */ + public function wp_editPost( $args ) { + if ( ! $this->minimum_args( $args, 5 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $post_id = (int) $args[3]; + $content_struct = $args[4]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.editPost' ); + + $post = get_post( $post_id, ARRAY_A ); + + if ( empty( $post['ID'] ) ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( isset( $content_struct['if_not_modified_since'] ) ) { + // If the post has been modified since the date provided, return an error. + if ( mysql2date( 'U', $post['post_modified_gmt'] ) > $content_struct['if_not_modified_since']->getTimestamp() ) { + return new IXR_Error( 409, __( 'There is a revision of this post that is more recent.' ) ); + } + } + + // Convert the date field back to IXR form. + $post['post_date'] = $this->_convert_date( $post['post_date'] ); + + /* + * Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct, + * since _insert_post() will ignore the non-GMT date if the GMT date is set. + */ + if ( '0000-00-00 00:00:00' === $post['post_date_gmt'] || isset( $content_struct['post_date'] ) ) { + unset( $post['post_date_gmt'] ); + } else { + $post['post_date_gmt'] = $this->_convert_date( $post['post_date_gmt'] ); + } + + /* + * If the API client did not provide 'post_date', then we must not perpetuate the value that + * was stored in the database, or it will appear to be an intentional edit. Conveying it here + * as if it was coming from the API client will cause an otherwise zeroed out 'post_date_gmt' + * to get set with the value that was originally stored in the database when the draft was created. + */ + if ( ! isset( $content_struct['post_date'] ) ) { + unset( $post['post_date'] ); + } + + $this->escape( $post ); + $merged_content_struct = array_merge( $post, $content_struct ); + + $retval = $this->_insert_post( $user, $merged_content_struct ); + if ( $retval instanceof IXR_Error ) { + return $retval; + } + + return true; + } + + /** + * Delete a post for any registered post type. + * + * @since 3.4.0 + * + * @see wp_delete_post() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type int $post_id Post ID. + * } + * @return true|IXR_Error True on success, IXR_Error instance on failure. + */ + public function wp_deletePost( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $post_id = (int) $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.deletePost' ); + + $post = get_post( $post_id, ARRAY_A ); + if ( empty( $post['ID'] ) ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'delete_post', $post_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) ); + } + + $result = wp_delete_post( $post_id ); + + if ( ! $result ) { + return new IXR_Error( 500, __( 'Sorry, the post could not be deleted.' ) ); + } + + return true; + } + + /** + * Retrieve a post. + * + * @since 3.4.0 + * + * The optional $fields parameter specifies what fields will be included + * in the response array. This should be a list of field names. 'post_id' will + * always be included in the response regardless of the value of $fields. + * + * Instead of, or in addition to, individual field names, conceptual group + * names can be used to specify multiple fields. The available conceptual + * groups are 'post' (all basic fields), 'taxonomies', 'custom_fields', + * and 'enclosure'. + * + * @see get_post() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type int $post_id Post ID. + * @type array $fields The subset of post type fields to return. + * } + * @return array|IXR_Error Array contains (based on $fields parameter): + * - 'post_id' + * - 'post_title' + * - 'post_date' + * - 'post_date_gmt' + * - 'post_modified' + * - 'post_modified_gmt' + * - 'post_status' + * - 'post_type' + * - 'post_name' + * - 'post_author' + * - 'post_password' + * - 'post_excerpt' + * - 'post_content' + * - 'link' + * - 'comment_status' + * - 'ping_status' + * - 'sticky' + * - 'custom_fields' + * - 'terms' + * - 'categories' + * - 'tags' + * - 'enclosure' + */ + public function wp_getPost( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $post_id = (int) $args[3]; + + if ( isset( $args[4] ) ) { + $fields = $args[4]; + } else { + /** + * Filters the list of post query fields used by the given XML-RPC method. + * + * @since 3.4.0 + * + * @param array $fields Array of post fields. Default array contains 'post', 'terms', and 'custom_fields'. + * @param string $method Method name. + */ + $fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPost' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPost' ); + + $post = get_post( $post_id, ARRAY_A ); + + if ( empty( $post['ID'] ) ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + return $this->_prepare_post( $post, $fields ); + } + + /** + * Retrieve posts. + * + * @since 3.4.0 + * + * @see wp_get_recent_posts() + * @see wp_getPost() for more on `$fields` + * @see get_posts() for more on `$filter` values + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type array $filter Optional. Modifies the query used to retrieve posts. Accepts 'post_type', + * 'post_status', 'number', 'offset', 'orderby', 's', and 'order'. + * Default empty array. + * @type array $fields Optional. The subset of post type fields to return in the response array. + * } + * @return array|IXR_Error Array contains a collection of posts. + */ + public function wp_getPosts( $args ) { + if ( ! $this->minimum_args( $args, 3 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $filter = isset( $args[3] ) ? $args[3] : array(); + + if ( isset( $args[4] ) ) { + $fields = $args[4]; + } else { + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + $fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPosts' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPosts' ); + + $query = array(); + + if ( isset( $filter['post_type'] ) ) { + $post_type = get_post_type_object( $filter['post_type'] ); + if ( ! ( (bool) $post_type ) ) { + return new IXR_Error( 403, __( 'Invalid post type.' ) ); + } + } else { + $post_type = get_post_type_object( 'post' ); + } + + if ( ! current_user_can( $post_type->cap->edit_posts ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) ); + } + + $query['post_type'] = $post_type->name; + + if ( isset( $filter['post_status'] ) ) { + $query['post_status'] = $filter['post_status']; + } + + if ( isset( $filter['number'] ) ) { + $query['numberposts'] = absint( $filter['number'] ); + } + + if ( isset( $filter['offset'] ) ) { + $query['offset'] = absint( $filter['offset'] ); + } + + if ( isset( $filter['orderby'] ) ) { + $query['orderby'] = $filter['orderby']; + + if ( isset( $filter['order'] ) ) { + $query['order'] = $filter['order']; + } + } + + if ( isset( $filter['s'] ) ) { + $query['s'] = $filter['s']; + } + + $posts_list = wp_get_recent_posts( $query ); + + if ( ! $posts_list ) { + return array(); + } + + // Holds all the posts data. + $struct = array(); + + foreach ( $posts_list as $post ) { + if ( ! current_user_can( 'edit_post', $post['ID'] ) ) { + continue; + } + + $struct[] = $this->_prepare_post( $post, $fields ); + } + + return $struct; + } + + /** + * Create a new term. + * + * @since 3.4.0 + * + * @see wp_insert_term() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type array $content_struct Content struct for adding a new term. The struct must contain + * the term 'name' and 'taxonomy'. Optional accepted values include + * 'parent', 'description', and 'slug'. + * } + * @return int|IXR_Error The term ID on success, or an IXR_Error object on failure. + */ + public function wp_newTerm( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $content_struct = $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.newTerm' ); + + if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) { + return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); + } + + $taxonomy = get_taxonomy( $content_struct['taxonomy'] ); + + if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to create terms in this taxonomy.' ) ); + } + + $taxonomy = (array) $taxonomy; + + // Hold the data of the term. + $term_data = array(); + + $term_data['name'] = trim( $content_struct['name'] ); + if ( empty( $term_data['name'] ) ) { + return new IXR_Error( 403, __( 'The term name cannot be empty.' ) ); + } + + if ( isset( $content_struct['parent'] ) ) { + if ( ! $taxonomy['hierarchical'] ) { + return new IXR_Error( 403, __( 'This taxonomy is not hierarchical.' ) ); + } + + $parent_term_id = (int) $content_struct['parent']; + $parent_term = get_term( $parent_term_id, $taxonomy['name'] ); + + if ( is_wp_error( $parent_term ) ) { + return new IXR_Error( 500, $parent_term->get_error_message() ); + } + + if ( ! $parent_term ) { + return new IXR_Error( 403, __( 'Parent term does not exist.' ) ); + } + + $term_data['parent'] = $content_struct['parent']; + } + + if ( isset( $content_struct['description'] ) ) { + $term_data['description'] = $content_struct['description']; + } + + if ( isset( $content_struct['slug'] ) ) { + $term_data['slug'] = $content_struct['slug']; + } + + $term = wp_insert_term( $term_data['name'], $taxonomy['name'], $term_data ); + + if ( is_wp_error( $term ) ) { + return new IXR_Error( 500, $term->get_error_message() ); + } + + if ( ! $term ) { + return new IXR_Error( 500, __( 'Sorry, the term could not be created.' ) ); + } + + // Add term meta. + if ( isset( $content_struct['custom_fields'] ) ) { + $this->set_term_custom_fields( $term['term_id'], $content_struct['custom_fields'] ); + } + + return strval( $term['term_id'] ); + } + + /** + * Edit a term. + * + * @since 3.4.0 + * + * @see wp_update_term() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type int $term_id Term ID. + * @type array $content_struct Content struct for editing a term. The struct must contain the + * term ''taxonomy'. Optional accepted values include 'name', 'parent', + * 'description', and 'slug'. + * } + * @return true|IXR_Error True on success, IXR_Error instance on failure. + */ + public function wp_editTerm( $args ) { + if ( ! $this->minimum_args( $args, 5 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $term_id = (int) $args[3]; + $content_struct = $args[4]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.editTerm' ); + + if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) { + return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); + } + + $taxonomy = get_taxonomy( $content_struct['taxonomy'] ); + + $taxonomy = (array) $taxonomy; + + // Hold the data of the term. + $term_data = array(); + + $term = get_term( $term_id, $content_struct['taxonomy'] ); + + if ( is_wp_error( $term ) ) { + return new IXR_Error( 500, $term->get_error_message() ); + } + + if ( ! $term ) { + return new IXR_Error( 404, __( 'Invalid term ID.' ) ); + } + + if ( ! current_user_can( 'edit_term', $term_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this term.' ) ); + } + + if ( isset( $content_struct['name'] ) ) { + $term_data['name'] = trim( $content_struct['name'] ); + + if ( empty( $term_data['name'] ) ) { + return new IXR_Error( 403, __( 'The term name cannot be empty.' ) ); + } + } + + if ( ! empty( $content_struct['parent'] ) ) { + if ( ! $taxonomy['hierarchical'] ) { + return new IXR_Error( 403, __( 'Cannot set parent term, taxonomy is not hierarchical.' ) ); + } + + $parent_term_id = (int) $content_struct['parent']; + $parent_term = get_term( $parent_term_id, $taxonomy['name'] ); + + if ( is_wp_error( $parent_term ) ) { + return new IXR_Error( 500, $parent_term->get_error_message() ); + } + + if ( ! $parent_term ) { + return new IXR_Error( 403, __( 'Parent term does not exist.' ) ); + } + + $term_data['parent'] = $content_struct['parent']; + } + + if ( isset( $content_struct['description'] ) ) { + $term_data['description'] = $content_struct['description']; + } + + if ( isset( $content_struct['slug'] ) ) { + $term_data['slug'] = $content_struct['slug']; + } + + $term = wp_update_term( $term_id, $taxonomy['name'], $term_data ); + + if ( is_wp_error( $term ) ) { + return new IXR_Error( 500, $term->get_error_message() ); + } + + if ( ! $term ) { + return new IXR_Error( 500, __( 'Sorry, editing the term failed.' ) ); + } + + // Update term meta. + if ( isset( $content_struct['custom_fields'] ) ) { + $this->set_term_custom_fields( $term_id, $content_struct['custom_fields'] ); + } + + return true; + } + + /** + * Delete a term. + * + * @since 3.4.0 + * + * @see wp_delete_term() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type string $taxnomy_name Taxonomy name. + * @type int $term_id Term ID. + * } + * @return bool|IXR_Error True on success, IXR_Error instance on failure. + */ + public function wp_deleteTerm( $args ) { + if ( ! $this->minimum_args( $args, 5 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $taxonomy = $args[3]; + $term_id = (int) $args[4]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.deleteTerm' ); + + if ( ! taxonomy_exists( $taxonomy ) ) { + return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); + } + + $taxonomy = get_taxonomy( $taxonomy ); + $term = get_term( $term_id, $taxonomy->name ); + + if ( is_wp_error( $term ) ) { + return new IXR_Error( 500, $term->get_error_message() ); + } + + if ( ! $term ) { + return new IXR_Error( 404, __( 'Invalid term ID.' ) ); + } + + if ( ! current_user_can( 'delete_term', $term_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this term.' ) ); + } + + $result = wp_delete_term( $term_id, $taxonomy->name ); + + if ( is_wp_error( $result ) ) { + return new IXR_Error( 500, $term->get_error_message() ); + } + + if ( ! $result ) { + return new IXR_Error( 500, __( 'Sorry, deleting the term failed.' ) ); + } + + return $result; + } + + /** + * Retrieve a term. + * + * @since 3.4.0 + * + * @see get_term() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type string $taxnomy Taxonomy name. + * @type string $term_id Term ID. + * } + * @return array|IXR_Error IXR_Error on failure, array on success, containing: + * - 'term_id' + * - 'name' + * - 'slug' + * - 'term_group' + * - 'term_taxonomy_id' + * - 'taxonomy' + * - 'description' + * - 'parent' + * - 'count' + */ + public function wp_getTerm( $args ) { + if ( ! $this->minimum_args( $args, 5 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $taxonomy = $args[3]; + $term_id = (int) $args[4]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getTerm' ); + + if ( ! taxonomy_exists( $taxonomy ) ) { + return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); + } + + $taxonomy = get_taxonomy( $taxonomy ); + + $term = get_term( $term_id, $taxonomy->name, ARRAY_A ); + + if ( is_wp_error( $term ) ) { + return new IXR_Error( 500, $term->get_error_message() ); + } + + if ( ! $term ) { + return new IXR_Error( 404, __( 'Invalid term ID.' ) ); + } + + if ( ! current_user_can( 'assign_term', $term_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign this term.' ) ); + } + + return $this->_prepare_term( $term ); + } + + /** + * Retrieve all terms for a taxonomy. + * + * @since 3.4.0 + * + * The optional $filter parameter modifies the query used to retrieve terms. + * Accepted keys are 'number', 'offset', 'orderby', 'order', 'hide_empty', and 'search'. + * + * @see get_terms() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type string $taxnomy Taxonomy name. + * @type array $filter Optional. Modifies the query used to retrieve posts. Accepts 'number', + * 'offset', 'orderby', 'order', 'hide_empty', and 'search'. Default empty array. + * } + * @return array|IXR_Error An associative array of terms data on success, IXR_Error instance otherwise. + */ + public function wp_getTerms( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $taxonomy = $args[3]; + $filter = isset( $args[4] ) ? $args[4] : array(); + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getTerms' ); + + if ( ! taxonomy_exists( $taxonomy ) ) { + return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); + } + + $taxonomy = get_taxonomy( $taxonomy ); + + if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) ); + } + + $query = array( 'taxonomy' => $taxonomy->name ); + + if ( isset( $filter['number'] ) ) { + $query['number'] = absint( $filter['number'] ); + } + + if ( isset( $filter['offset'] ) ) { + $query['offset'] = absint( $filter['offset'] ); + } + + if ( isset( $filter['orderby'] ) ) { + $query['orderby'] = $filter['orderby']; + + if ( isset( $filter['order'] ) ) { + $query['order'] = $filter['order']; + } + } + + if ( isset( $filter['hide_empty'] ) ) { + $query['hide_empty'] = $filter['hide_empty']; + } else { + $query['get'] = 'all'; + } + + if ( isset( $filter['search'] ) ) { + $query['search'] = $filter['search']; + } + + $terms = get_terms( $query ); + + if ( is_wp_error( $terms ) ) { + return new IXR_Error( 500, $terms->get_error_message() ); + } + + $struct = array(); + + foreach ( $terms as $term ) { + $struct[] = $this->_prepare_term( $term ); + } + + return $struct; + } + + /** + * Retrieve a taxonomy. + * + * @since 3.4.0 + * + * @see get_taxonomy() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type string $taxnomy Taxonomy name. + * @type array $fields Optional. Array of taxonomy fields to limit to in the return. + * Accepts 'labels', 'cap', 'menu', and 'object_type'. + * Default empty array. + * } + * @return array|IXR_Error An array of taxonomy data on success, IXR_Error instance otherwise. + */ + public function wp_getTaxonomy( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $taxonomy = $args[3]; + + if ( isset( $args[4] ) ) { + $fields = $args[4]; + } else { + /** + * Filters the taxonomy query fields used by the given XML-RPC method. + * + * @since 3.4.0 + * + * @param array $fields An array of taxonomy fields to retrieve. + * @param string $method The method name. + */ + $fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomy' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getTaxonomy' ); + + if ( ! taxonomy_exists( $taxonomy ) ) { + return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); + } + + $taxonomy = get_taxonomy( $taxonomy ); + + if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) ); + } + + return $this->_prepare_taxonomy( $taxonomy, $fields ); + } + + /** + * Retrieve all taxonomies. + * + * @since 3.4.0 + * + * @see get_taxonomies() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id Blog ID (unused). + * @type string $username Username. + * @type string $password Password. + * @type array $filter Optional. An array of arguments for retrieving taxonomies. + * @type array $fields Optional. The subset of taxonomy fields to return. + * } + * @return array|IXR_Error An associative array of taxonomy data with returned fields determined + * by `$fields`, or an IXR_Error instance on failure. + */ + public function wp_getTaxonomies( $args ) { + if ( ! $this->minimum_args( $args, 3 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $filter = isset( $args[3] ) ? $args[3] : array( 'public' => true ); + + if ( isset( $args[4] ) ) { + $fields = $args[4]; + } else { + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + $fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomies' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getTaxonomies' ); + + $taxonomies = get_taxonomies( $filter, 'objects' ); + + // Holds all the taxonomy data. + $struct = array(); + + foreach ( $taxonomies as $taxonomy ) { + // Capability check for post types. + if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) { + continue; + } + + $struct[] = $this->_prepare_taxonomy( $taxonomy, $fields ); + } + + return $struct; + } + + /** + * Retrieve a user. + * + * The optional $fields parameter specifies what fields will be included + * in the response array. This should be a list of field names. 'user_id' will + * always be included in the response regardless of the value of $fields. + * + * Instead of, or in addition to, individual field names, conceptual group + * names can be used to specify multiple fields. The available conceptual + * groups are 'basic' and 'all'. + * + * @uses get_userdata() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $user_id + * @type array $fields (optional) + * } + * @return array|IXR_Error Array contains (based on $fields parameter): + * - 'user_id' + * - 'username' + * - 'first_name' + * - 'last_name' + * - 'registered' + * - 'bio' + * - 'email' + * - 'nickname' + * - 'nicename' + * - 'url' + * - 'display_name' + * - 'roles' + */ + public function wp_getUser( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $user_id = (int) $args[3]; + + if ( isset( $args[4] ) ) { + $fields = $args[4]; + } else { + /** + * Filters the default user query fields used by the given XML-RPC method. + * + * @since 3.5.0 + * + * @param array $fields User query fields for given method. Default 'all'. + * @param string $method The method name. + */ + $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUser' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getUser' ); + + if ( ! current_user_can( 'edit_user', $user_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this user.' ) ); + } + + $user_data = get_userdata( $user_id ); + + if ( ! $user_data ) { + return new IXR_Error( 404, __( 'Invalid user ID.' ) ); + } + + return $this->_prepare_user( $user_data, $fields ); + } + + /** + * Retrieve users. + * + * The optional $filter parameter modifies the query used to retrieve users. + * Accepted keys are 'number' (default: 50), 'offset' (default: 0), 'role', + * 'who', 'orderby', and 'order'. + * + * The optional $fields parameter specifies what fields will be included + * in the response array. + * + * @uses get_users() + * @see wp_getUser() for more on $fields and return values + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $filter (optional) + * @type array $fields (optional) + * } + * @return array|IXR_Error users data + */ + public function wp_getUsers( $args ) { + if ( ! $this->minimum_args( $args, 3 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $filter = isset( $args[3] ) ? $args[3] : array(); + + if ( isset( $args[4] ) ) { + $fields = $args[4]; + } else { + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUsers' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getUsers' ); + + if ( ! current_user_can( 'list_users' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to list users.' ) ); + } + + $query = array( 'fields' => 'all_with_meta' ); + + $query['number'] = ( isset( $filter['number'] ) ) ? absint( $filter['number'] ) : 50; + $query['offset'] = ( isset( $filter['offset'] ) ) ? absint( $filter['offset'] ) : 0; + + if ( isset( $filter['orderby'] ) ) { + $query['orderby'] = $filter['orderby']; + + if ( isset( $filter['order'] ) ) { + $query['order'] = $filter['order']; + } + } + + if ( isset( $filter['role'] ) ) { + if ( get_role( $filter['role'] ) === null ) { + return new IXR_Error( 403, __( 'Invalid role.' ) ); + } + + $query['role'] = $filter['role']; + } + + if ( isset( $filter['who'] ) ) { + $query['who'] = $filter['who']; + } + + $users = get_users( $query ); + + $_users = array(); + foreach ( $users as $user_data ) { + if ( current_user_can( 'edit_user', $user_data->ID ) ) { + $_users[] = $this->_prepare_user( $user_data, $fields ); + } + } + return $_users; + } + + /** + * Retrieve information about the requesting user. + * + * @uses get_userdata() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $fields (optional) + * } + * @return array|IXR_Error (@see wp_getUser) + */ + public function wp_getProfile( $args ) { + if ( ! $this->minimum_args( $args, 3 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + if ( isset( $args[3] ) ) { + $fields = $args[3]; + } else { + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getProfile' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getProfile' ); + + if ( ! current_user_can( 'edit_user', $user->ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) ); + } + + $user_data = get_userdata( $user->ID ); + + return $this->_prepare_user( $user_data, $fields ); + } + + /** + * Edit user's profile. + * + * @uses wp_update_user() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $content_struct It can optionally contain: + * - 'first_name' + * - 'last_name' + * - 'website' + * - 'display_name' + * - 'nickname' + * - 'nicename' + * - 'bio' + * } + * @return true|IXR_Error True, on success. + */ + public function wp_editProfile( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $content_struct = $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.editProfile' ); + + if ( ! current_user_can( 'edit_user', $user->ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) ); + } + + // Holds data of the user. + $user_data = array(); + $user_data['ID'] = $user->ID; + + // Only set the user details if they were given. + if ( isset( $content_struct['first_name'] ) ) { + $user_data['first_name'] = $content_struct['first_name']; + } + + if ( isset( $content_struct['last_name'] ) ) { + $user_data['last_name'] = $content_struct['last_name']; + } + + if ( isset( $content_struct['url'] ) ) { + $user_data['user_url'] = $content_struct['url']; + } + + if ( isset( $content_struct['display_name'] ) ) { + $user_data['display_name'] = $content_struct['display_name']; + } + + if ( isset( $content_struct['nickname'] ) ) { + $user_data['nickname'] = $content_struct['nickname']; + } + + if ( isset( $content_struct['nicename'] ) ) { + $user_data['user_nicename'] = $content_struct['nicename']; + } + + if ( isset( $content_struct['bio'] ) ) { + $user_data['description'] = $content_struct['bio']; + } + + $result = wp_update_user( $user_data ); + + if ( is_wp_error( $result ) ) { + return new IXR_Error( 500, $result->get_error_message() ); + } + + if ( ! $result ) { + return new IXR_Error( 500, __( 'Sorry, the user could not be updated.' ) ); + } + + return true; + } + + /** + * Retrieve page. + * + * @since 2.2.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type int $page_id + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function wp_getPage( $args ) { + $this->escape( $args ); + + $page_id = (int) $args[1]; + $username = $args[2]; + $password = $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + $page = get_post( $page_id ); + if ( ! $page ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_page', $page_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPage' ); + + // If we found the page then format the data. + if ( $page->ID && ( 'page' === $page->post_type ) ) { + return $this->_prepare_page( $page ); + } else { + // If the page doesn't exist, indicate that. + return new IXR_Error( 404, __( 'Sorry, no such page.' ) ); + } + } + + /** + * Retrieve Pages. + * + * @since 2.2.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $num_pages + * } + * @return array|IXR_Error + */ + public function wp_getPages( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $num_pages = isset( $args[3] ) ? (int) $args[3] : 10; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_pages' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPages' ); + + $pages = get_posts( + array( + 'post_type' => 'page', + 'post_status' => 'any', + 'numberposts' => $num_pages, + ) + ); + $num_pages = count( $pages ); + + // If we have pages, put together their info. + if ( $num_pages >= 1 ) { + $pages_struct = array(); + + foreach ( $pages as $page ) { + if ( current_user_can( 'edit_page', $page->ID ) ) { + $pages_struct[] = $this->_prepare_page( $page ); + } + } + + return $pages_struct; + } + + return array(); + } + + /** + * Create new page. + * + * @since 2.2.0 + * + * @see wp_xmlrpc_server::mw_newPost() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $content_struct + * } + * @return int|IXR_Error + */ + public function wp_newPage( $args ) { + // Items not escaped here will be escaped in wp_newPost(). + $username = $this->escape( $args[1] ); + $password = $this->escape( $args[2] ); + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.newPage' ); + + // Mark this as content for a page. + $args[3]['post_type'] = 'page'; + + // Let mw_newPost() do all of the heavy lifting. + return $this->mw_newPost( $args ); + } + + /** + * Delete page. + * + * @since 2.2.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $page_id + * } + * @return true|IXR_Error True, if success. + */ + public function wp_deletePage( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $page_id = (int) $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.deletePage' ); + + // Get the current page based on the 'page_id' and + // make sure it is a page and not a post. + $actual_page = get_post( $page_id, ARRAY_A ); + if ( ! $actual_page || ( 'page' !== $actual_page['post_type'] ) ) { + return new IXR_Error( 404, __( 'Sorry, no such page.' ) ); + } + + // Make sure the user can delete pages. + if ( ! current_user_can( 'delete_page', $page_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this page.' ) ); + } + + // Attempt to delete the page. + $result = wp_delete_post( $page_id ); + if ( ! $result ) { + return new IXR_Error( 500, __( 'Failed to delete the page.' ) ); + } + + /** + * Fires after a page has been successfully deleted via XML-RPC. + * + * @since 3.4.0 + * + * @param int $page_id ID of the deleted page. + * @param array $args An array of arguments to delete the page. + */ + do_action( 'xmlrpc_call_success_wp_deletePage', $page_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + return true; + } + + /** + * Edit page. + * + * @since 2.2.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type int $page_id + * @type string $username + * @type string $password + * @type string $content + * @type string $publish + * } + * @return array|IXR_Error + */ + public function wp_editPage( $args ) { + // Items will be escaped in mw_editPost(). + $page_id = (int) $args[1]; + $username = $args[2]; + $password = $args[3]; + $content = $args[4]; + $publish = $args[5]; + + $escaped_username = $this->escape( $username ); + $escaped_password = $this->escape( $password ); + + $user = $this->login( $escaped_username, $escaped_password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.editPage' ); + + // Get the page data and make sure it is a page. + $actual_page = get_post( $page_id, ARRAY_A ); + if ( ! $actual_page || ( 'page' !== $actual_page['post_type'] ) ) { + return new IXR_Error( 404, __( 'Sorry, no such page.' ) ); + } + + // Make sure the user is allowed to edit pages. + if ( ! current_user_can( 'edit_page', $page_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) ); + } + + // Mark this as content for a page. + $content['post_type'] = 'page'; + + // Arrange args in the way mw_editPost() understands. + $args = array( + $page_id, + $username, + $password, + $content, + $publish, + ); + + // Let mw_editPost() do all of the heavy lifting. + return $this->mw_editPost( $args ); + } + + /** + * Retrieve page list. + * + * @since 2.2.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function wp_getPageList( $args ) { + global $wpdb; + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_pages' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPageList' ); + + // Get list of page IDs and titles. + $page_list = $wpdb->get_results( + " + SELECT ID page_id, + post_title page_title, + post_parent page_parent_id, + post_date_gmt, + post_date, + post_status + FROM {$wpdb->posts} + WHERE post_type = 'page' + ORDER BY ID + " + ); + + // The date needs to be formatted properly. + $num_pages = count( $page_list ); + for ( $i = 0; $i < $num_pages; $i++ ) { + $page_list[ $i ]->dateCreated = $this->_convert_date( $page_list[ $i ]->post_date ); + $page_list[ $i ]->date_created_gmt = $this->_convert_date_gmt( $page_list[ $i ]->post_date_gmt, $page_list[ $i ]->post_date ); + + unset( $page_list[ $i ]->post_date_gmt ); + unset( $page_list[ $i ]->post_date ); + unset( $page_list[ $i ]->post_status ); + } + + return $page_list; + } + + /** + * Retrieve authors list. + * + * @since 2.2.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function wp_getAuthors( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getAuthors' ); + + $authors = array(); + foreach ( get_users( array( 'fields' => array( 'ID', 'user_login', 'display_name' ) ) ) as $user ) { + $authors[] = array( + 'user_id' => $user->ID, + 'user_login' => $user->user_login, + 'display_name' => $user->display_name, + ); + } + + return $authors; + } + + /** + * Get list of all tags + * + * @since 2.7.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function wp_getTags( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view tags.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getKeywords' ); + + $tags = array(); + + $all_tags = get_tags(); + if ( $all_tags ) { + foreach ( (array) $all_tags as $tag ) { + $struct = array(); + $struct['tag_id'] = $tag->term_id; + $struct['name'] = $tag->name; + $struct['count'] = $tag->count; + $struct['slug'] = $tag->slug; + $struct['html_url'] = esc_html( get_tag_link( $tag->term_id ) ); + $struct['rss_url'] = esc_html( get_tag_feed_link( $tag->term_id ) ); + + $tags[] = $struct; + } + } + + return $tags; + } + + /** + * Create new category. + * + * @since 2.2.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $category + * } + * @return int|IXR_Error Category ID. + */ + public function wp_newCategory( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $category = $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.newCategory' ); + + // Make sure the user is allowed to add a category. + if ( ! current_user_can( 'manage_categories' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to add a category.' ) ); + } + + // If no slug was provided, make it empty + // so that WordPress will generate one. + if ( empty( $category['slug'] ) ) { + $category['slug'] = ''; + } + + // If no parent_id was provided, make it empty + // so that it will be a top-level page (no parent). + if ( ! isset( $category['parent_id'] ) ) { + $category['parent_id'] = ''; + } + + // If no description was provided, make it empty. + if ( empty( $category['description'] ) ) { + $category['description'] = ''; + } + + $new_category = array( + 'cat_name' => $category['name'], + 'category_nicename' => $category['slug'], + 'category_parent' => $category['parent_id'], + 'category_description' => $category['description'], + ); + + $cat_id = wp_insert_category( $new_category, true ); + if ( is_wp_error( $cat_id ) ) { + if ( 'term_exists' == $cat_id->get_error_code() ) { + return (int) $cat_id->get_error_data(); + } else { + return new IXR_Error( 500, __( 'Sorry, the category could not be created.' ) ); + } + } elseif ( ! $cat_id ) { + return new IXR_Error( 500, __( 'Sorry, the category could not be created.' ) ); + } + + /** + * Fires after a new category has been successfully created via XML-RPC. + * + * @since 3.4.0 + * + * @param int $cat_id ID of the new category. + * @param array $args An array of new category arguments. + */ + do_action( 'xmlrpc_call_success_wp_newCategory', $cat_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + return $cat_id; + } + + /** + * Remove category. + * + * @since 2.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $category_id + * } + * @return bool|IXR_Error See wp_delete_term() for return info. + */ + public function wp_deleteCategory( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $category_id = (int) $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.deleteCategory' ); + + if ( ! current_user_can( 'delete_term', $category_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this category.' ) ); + } + + $status = wp_delete_term( $category_id, 'category' ); + + if ( true == $status ) { + /** + * Fires after a category has been successfully deleted via XML-RPC. + * + * @since 3.4.0 + * + * @param int $category_id ID of the deleted category. + * @param array $args An array of arguments to delete the category. + */ + do_action( 'xmlrpc_call_success_wp_deleteCategory', $category_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + } + + return $status; + } + + /** + * Retrieve category list. + * + * @since 2.2.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $category + * @type int $max_results + * } + * @return array|IXR_Error + */ + public function wp_suggestCategories( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $category = $args[3]; + $max_results = (int) $args[4]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.suggestCategories' ); + + $category_suggestions = array(); + $args = array( + 'get' => 'all', + 'number' => $max_results, + 'name__like' => $category, + ); + foreach ( (array) get_categories( $args ) as $cat ) { + $category_suggestions[] = array( + 'category_id' => $cat->term_id, + 'category_name' => $cat->name, + ); + } + + return $category_suggestions; + } + + /** + * Retrieve comment. + * + * @since 2.7.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $comment_id + * } + * @return array|IXR_Error + */ + public function wp_getComment( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $comment_id = (int) $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getComment' ); + + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); + } + + if ( ! current_user_can( 'edit_comment', $comment_id ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) ); + } + + return $this->_prepare_comment( $comment ); + } + + /** + * Retrieve comments. + * + * Besides the common blog_id (unused), username, and password arguments, it takes a filter + * array as last argument. + * + * Accepted 'filter' keys are 'status', 'post_id', 'offset', and 'number'. + * + * The defaults are as follows: + * - 'status' - Default is ''. Filter by status (e.g., 'approve', 'hold') + * - 'post_id' - Default is ''. The post where the comment is posted. Empty string shows all comments. + * - 'number' - Default is 10. Total number of media items to retrieve. + * - 'offset' - Default is 0. See WP_Query::query() for more. + * + * @since 2.7.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $struct + * } + * @return array|IXR_Error Contains a collection of comments. See wp_xmlrpc_server::wp_getComment() for a description of each item contents + */ + public function wp_getComments( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $struct = isset( $args[3] ) ? $args[3] : array(); + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getComments' ); + + if ( isset( $struct['status'] ) ) { + $status = $struct['status']; + } else { + $status = ''; + } + + if ( ! current_user_can( 'moderate_comments' ) && 'approve' !== $status ) { + return new IXR_Error( 401, __( 'Invalid comment status.' ) ); + } + + $post_id = ''; + if ( isset( $struct['post_id'] ) ) { + $post_id = absint( $struct['post_id'] ); + } + + $post_type = ''; + if ( isset( $struct['post_type'] ) ) { + $post_type_object = get_post_type_object( $struct['post_type'] ); + if ( ! $post_type_object || ! post_type_supports( $post_type_object->name, 'comments' ) ) { + return new IXR_Error( 404, __( 'Invalid post type.' ) ); + } + $post_type = $struct['post_type']; + } + + $offset = 0; + if ( isset( $struct['offset'] ) ) { + $offset = absint( $struct['offset'] ); + } + + $number = 10; + if ( isset( $struct['number'] ) ) { + $number = absint( $struct['number'] ); + } + + $comments = get_comments( + array( + 'status' => $status, + 'post_id' => $post_id, + 'offset' => $offset, + 'number' => $number, + 'post_type' => $post_type, + ) + ); + + $comments_struct = array(); + if ( is_array( $comments ) ) { + foreach ( $comments as $comment ) { + $comments_struct[] = $this->_prepare_comment( $comment ); + } + } + + return $comments_struct; + } + + /** + * Delete a comment. + * + * By default, the comment will be moved to the Trash instead of deleted. + * See wp_delete_comment() for more information on this behavior. + * + * @since 2.7.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $comment_ID + * } + * @return bool|IXR_Error See wp_delete_comment(). + */ + public function wp_deleteComment( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $comment_ID = (int) $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! get_comment( $comment_ID ) ) { + return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); + } + + if ( ! current_user_can( 'edit_comment', $comment_ID ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to delete this comment.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.deleteComment' ); + + $status = wp_delete_comment( $comment_ID ); + + if ( $status ) { + /** + * Fires after a comment has been successfully deleted via XML-RPC. + * + * @since 3.4.0 + * + * @param int $comment_ID ID of the deleted comment. + * @param array $args An array of arguments to delete the comment. + */ + do_action( 'xmlrpc_call_success_wp_deleteComment', $comment_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + } + + return $status; + } + + /** + * Edit comment. + * + * Besides the common blog_id (unused), username, and password arguments, it takes a + * comment_id integer and a content_struct array as last argument. + * + * The allowed keys in the content_struct array are: + * - 'author' + * - 'author_url' + * - 'author_email' + * - 'content' + * - 'date_created_gmt' + * - 'status'. Common statuses are 'approve', 'hold', 'spam'. See get_comment_statuses() for more details + * + * @since 2.7.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $comment_ID + * @type array $content_struct + * } + * @return true|IXR_Error True, on success. + */ + public function wp_editComment( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $comment_ID = (int) $args[3]; + $content_struct = $args[4]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! get_comment( $comment_ID ) ) { + return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); + } + + if ( ! current_user_can( 'edit_comment', $comment_ID ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.editComment' ); + $comment = array( + 'comment_ID' => $comment_ID, + ); + + if ( isset( $content_struct['status'] ) ) { + $statuses = get_comment_statuses(); + $statuses = array_keys( $statuses ); + + if ( ! in_array( $content_struct['status'], $statuses ) ) { + return new IXR_Error( 401, __( 'Invalid comment status.' ) ); + } + + $comment['comment_approved'] = $content_struct['status']; + } + + // Do some timestamp voodoo. + if ( ! empty( $content_struct['date_created_gmt'] ) ) { + // We know this is supposed to be GMT, so we're going to slap that Z on there by force. + $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; + $comment['comment_date'] = get_date_from_gmt( $dateCreated ); + $comment['comment_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' ); + } + + if ( isset( $content_struct['content'] ) ) { + $comment['comment_content'] = $content_struct['content']; + } + + if ( isset( $content_struct['author'] ) ) { + $comment['comment_author'] = $content_struct['author']; + } + + if ( isset( $content_struct['author_url'] ) ) { + $comment['comment_author_url'] = $content_struct['author_url']; + } + + if ( isset( $content_struct['author_email'] ) ) { + $comment['comment_author_email'] = $content_struct['author_email']; + } + + $result = wp_update_comment( $comment ); + if ( is_wp_error( $result ) ) { + return new IXR_Error( 500, $result->get_error_message() ); + } + + if ( ! $result ) { + return new IXR_Error( 500, __( 'Sorry, the comment could not be updated.' ) ); + } + + /** + * Fires after a comment has been successfully updated via XML-RPC. + * + * @since 3.4.0 + * + * @param int $comment_ID ID of the updated comment. + * @param array $args An array of arguments to update the comment. + */ + do_action( 'xmlrpc_call_success_wp_editComment', $comment_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + return true; + } + + /** + * Create new comment. + * + * @since 2.7.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type string|int $post + * @type array $content_struct + * } + * @return int|IXR_Error See wp_new_comment(). + */ + public function wp_newComment( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $post = $args[3]; + $content_struct = $args[4]; + + /** + * Filters whether to allow anonymous comments over XML-RPC. + * + * @since 2.7.0 + * + * @param bool $allow Whether to allow anonymous commenting via XML-RPC. + * Default false. + */ + $allow_anon = apply_filters( 'xmlrpc_allow_anonymous_comments', false ); + + $user = $this->login( $username, $password ); + + if ( ! $user ) { + $logged_in = false; + if ( $allow_anon && get_option( 'comment_registration' ) ) { + return new IXR_Error( 403, __( 'Sorry, you must be logged in to comment.' ) ); + } elseif ( ! $allow_anon ) { + return $this->error; + } + } else { + $logged_in = true; + } + + if ( is_numeric( $post ) ) { + $post_id = absint( $post ); + } else { + $post_id = url_to_postid( $post ); + } + + if ( ! $post_id ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! get_post( $post_id ) ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! comments_open( $post_id ) ) { + return new IXR_Error( 403, __( 'Sorry, comments are closed for this item.' ) ); + } + + if ( empty( $content_struct['content'] ) ) { + return new IXR_Error( 403, __( 'Comment is required.' ) ); + } + + $comment = array( + 'comment_post_ID' => $post_id, + 'comment_content' => $content_struct['content'], + ); + + if ( $logged_in ) { + $display_name = $user->display_name; + $user_email = $user->user_email; + $user_url = $user->user_url; + + $comment['comment_author'] = $this->escape( $display_name ); + $comment['comment_author_email'] = $this->escape( $user_email ); + $comment['comment_author_url'] = $this->escape( $user_url ); + $comment['user_ID'] = $user->ID; + } else { + $comment['comment_author'] = ''; + if ( isset( $content_struct['author'] ) ) { + $comment['comment_author'] = $content_struct['author']; + } + + $comment['comment_author_email'] = ''; + if ( isset( $content_struct['author_email'] ) ) { + $comment['comment_author_email'] = $content_struct['author_email']; + } + + $comment['comment_author_url'] = ''; + if ( isset( $content_struct['author_url'] ) ) { + $comment['comment_author_url'] = $content_struct['author_url']; + } + + $comment['user_ID'] = 0; + + if ( get_option( 'require_name_email' ) ) { + if ( 6 > strlen( $comment['comment_author_email'] ) || '' == $comment['comment_author'] ) { + return new IXR_Error( 403, __( 'Comment author name and email are required.' ) ); + } elseif ( ! is_email( $comment['comment_author_email'] ) ) { + return new IXR_Error( 403, __( 'A valid email address is required.' ) ); + } + } + } + + $comment['comment_parent'] = isset( $content_struct['comment_parent'] ) ? absint( $content_struct['comment_parent'] ) : 0; + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.newComment' ); + + $comment_ID = wp_new_comment( $comment, true ); + if ( is_wp_error( $comment_ID ) ) { + return new IXR_Error( 403, $comment_ID->get_error_message() ); + } + + if ( ! $comment_ID ) { + return new IXR_Error( 403, __( 'Something went wrong.' ) ); + } + + /** + * Fires after a new comment has been successfully created via XML-RPC. + * + * @since 3.4.0 + * + * @param int $comment_ID ID of the new comment. + * @param array $args An array of new comment arguments. + */ + do_action( 'xmlrpc_call_success_wp_newComment', $comment_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + return $comment_ID; + } + + /** + * Retrieve all of the comment status. + * + * @since 2.7.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function wp_getCommentStatusList( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'publish_posts' ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getCommentStatusList' ); + + return get_comment_statuses(); + } + + /** + * Retrieve comment count. + * + * @since 2.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $post_id + * } + * @return array|IXR_Error + */ + public function wp_getCommentCount( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $post_id = (int) $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + $post = get_post( $post_id, ARRAY_A ); + if ( empty( $post['ID'] ) ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details of this post.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getCommentCount' ); + + $count = wp_count_comments( $post_id ); + + return array( + 'approved' => $count->approved, + 'awaiting_moderation' => $count->moderated, + 'spam' => $count->spam, + 'total_comments' => $count->total_comments, + ); + } + + /** + * Retrieve post statuses. + * + * @since 2.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function wp_getPostStatusList( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPostStatusList' ); + + return get_post_statuses(); + } + + /** + * Retrieve page statuses. + * + * @since 2.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function wp_getPageStatusList( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_pages' ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPageStatusList' ); + + return get_page_statuses(); + } + + /** + * Retrieve page templates. + * + * @since 2.6.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function wp_getPageTemplates( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_pages' ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); + } + + $templates = get_page_templates(); + $templates['Default'] = 'default'; + + return $templates; + } + + /** + * Retrieve blog options. + * + * @since 2.6.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $options + * } + * @return array|IXR_Error + */ + public function wp_getOptions( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $options = isset( $args[3] ) ? (array) $args[3] : array(); + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + // If no specific options where asked for, return all of them. + if ( count( $options ) == 0 ) { + $options = array_keys( $this->blog_options ); + } + + return $this->_getOptions( $options ); + } + + /** + * Retrieve blog options value from list. + * + * @since 2.6.0 + * + * @param array $options Options to retrieve. + * @return array + */ + public function _getOptions( $options ) { + $data = array(); + $can_manage = current_user_can( 'manage_options' ); + foreach ( $options as $option ) { + if ( array_key_exists( $option, $this->blog_options ) ) { + $data[ $option ] = $this->blog_options[ $option ]; + // Is the value static or dynamic? + if ( isset( $data[ $option ]['option'] ) ) { + $data[ $option ]['value'] = get_option( $data[ $option ]['option'] ); + unset( $data[ $option ]['option'] ); + } + + if ( ! $can_manage ) { + $data[ $option ]['readonly'] = true; + } + } + } + + return $data; + } + + /** + * Update blog options. + * + * @since 2.6.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $options + * } + * @return array|IXR_Error + */ + public function wp_setOptions( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $options = (array) $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'manage_options' ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to update options.' ) ); + } + + $option_names = array(); + foreach ( $options as $o_name => $o_value ) { + $option_names[] = $o_name; + if ( ! array_key_exists( $o_name, $this->blog_options ) ) { + continue; + } + + if ( true == $this->blog_options[ $o_name ]['readonly'] ) { + continue; + } + + update_option( $this->blog_options[ $o_name ]['option'], wp_unslash( $o_value ) ); + } + + // Now return the updated values. + return $this->_getOptions( $option_names ); + } + + /** + * Retrieve a media item by ID + * + * @since 3.1.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $attachment_id + * } + * @return array|IXR_Error Associative array contains: + * - 'date_created_gmt' + * - 'parent' + * - 'link' + * - 'thumbnail' + * - 'title' + * - 'caption' + * - 'description' + * - 'metadata' + */ + public function wp_getMediaItem( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $attachment_id = (int) $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'upload_files' ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to upload files.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getMediaItem' ); + + $attachment = get_post( $attachment_id ); + if ( ! $attachment ) { + return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); + } + + return $this->_prepare_media_item( $attachment ); + } + + /** + * Retrieves a collection of media library items (or attachments) + * + * Besides the common blog_id (unused), username, and password arguments, it takes a filter + * array as last argument. + * + * Accepted 'filter' keys are 'parent_id', 'mime_type', 'offset', and 'number'. + * + * The defaults are as follows: + * - 'number' - Default is 5. Total number of media items to retrieve. + * - 'offset' - Default is 0. See WP_Query::query() for more. + * - 'parent_id' - Default is ''. The post where the media item is attached. Empty string shows all media items. 0 shows unattached media items. + * - 'mime_type' - Default is ''. Filter by mime type (e.g., 'image/jpeg', 'application/pdf') + * + * @since 3.1.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $struct + * } + * @return array|IXR_Error Contains a collection of media items. See wp_xmlrpc_server::wp_getMediaItem() for a description of each item contents + */ + public function wp_getMediaLibrary( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $struct = isset( $args[3] ) ? $args[3] : array(); + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'upload_files' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getMediaLibrary' ); + + $parent_id = ( isset( $struct['parent_id'] ) ) ? absint( $struct['parent_id'] ) : ''; + $mime_type = ( isset( $struct['mime_type'] ) ) ? $struct['mime_type'] : ''; + $offset = ( isset( $struct['offset'] ) ) ? absint( $struct['offset'] ) : 0; + $number = ( isset( $struct['number'] ) ) ? absint( $struct['number'] ) : -1; + + $attachments = get_posts( + array( + 'post_type' => 'attachment', + 'post_parent' => $parent_id, + 'offset' => $offset, + 'numberposts' => $number, + 'post_mime_type' => $mime_type, + ) + ); + + $attachments_struct = array(); + + foreach ( $attachments as $attachment ) { + $attachments_struct[] = $this->_prepare_media_item( $attachment ); + } + + return $attachments_struct; + } + + /** + * Retrieves a list of post formats used by the site. + * + * @since 3.1.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error List of post formats, otherwise IXR_Error object. + */ + public function wp_getPostFormats( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPostFormats' ); + + $formats = get_post_format_strings(); + + // Find out if they want a list of currently supports formats. + if ( isset( $args[3] ) && is_array( $args[3] ) ) { + if ( $args[3]['show-supported'] ) { + if ( current_theme_supports( 'post-formats' ) ) { + $supported = get_theme_support( 'post-formats' ); + + $data = array(); + $data['all'] = $formats; + $data['supported'] = $supported[0]; + + $formats = $data; + } + } + } + + return $formats; + } + + /** + * Retrieves a post type + * + * @since 3.4.0 + * + * @see get_post_type_object() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type string $post_type_name + * @type array $fields (optional) + * } + * @return array|IXR_Error Array contains: + * - 'labels' + * - 'description' + * - 'capability_type' + * - 'cap' + * - 'map_meta_cap' + * - 'hierarchical' + * - 'menu_position' + * - 'taxonomies' + * - 'supports' + */ + public function wp_getPostType( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $post_type_name = $args[3]; + + if ( isset( $args[4] ) ) { + $fields = $args[4]; + } else { + /** + * Filters the default query fields used by the given XML-RPC method. + * + * @since 3.4.0 + * + * @param array $fields An array of post type query fields for the given method. + * @param string $method The method name. + */ + $fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostType' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPostType' ); + + if ( ! post_type_exists( $post_type_name ) ) { + return new IXR_Error( 403, __( 'Invalid post type.' ) ); + } + + $post_type = get_post_type_object( $post_type_name ); + + if ( ! current_user_can( $post_type->cap->edit_posts ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) ); + } + + return $this->_prepare_post_type( $post_type, $fields ); + } + + /** + * Retrieves a post types + * + * @since 3.4.0 + * + * @see get_post_types() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $filter (optional) + * @type array $fields (optional) + * } + * @return array|IXR_Error + */ + public function wp_getPostTypes( $args ) { + if ( ! $this->minimum_args( $args, 3 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $filter = isset( $args[3] ) ? $args[3] : array( 'public' => true ); + + if ( isset( $args[4] ) ) { + $fields = $args[4]; + } else { + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + $fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostTypes' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getPostTypes' ); + + $post_types = get_post_types( $filter, 'objects' ); + + $struct = array(); + + foreach ( $post_types as $post_type ) { + if ( ! current_user_can( $post_type->cap->edit_posts ) ) { + continue; + } + + $struct[ $post_type->name ] = $this->_prepare_post_type( $post_type, $fields ); + } + + return $struct; + } + + /** + * Retrieve revisions for a specific post. + * + * @since 3.5.0 + * + * The optional $fields parameter specifies what fields will be included + * in the response array. + * + * @uses wp_get_post_revisions() + * @see wp_getPost() for more on $fields + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $post_id + * @type array $fields (optional) + * } + * @return array|IXR_Error contains a collection of posts. + */ + public function wp_getRevisions( $args ) { + if ( ! $this->minimum_args( $args, 4 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $post_id = (int) $args[3]; + + if ( isset( $args[4] ) ) { + $fields = $args[4]; + } else { + /** + * Filters the default revision query fields used by the given XML-RPC method. + * + * @since 3.5.0 + * + * @param array $field An array of revision query fields. + * @param string $method The method name. + */ + $fields = apply_filters( 'xmlrpc_default_revision_fields', array( 'post_date', 'post_date_gmt' ), 'wp.getRevisions' ); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.getRevisions' ); + + $post = get_post( $post_id ); + if ( ! $post ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); + } + + // Check if revisions are enabled. + if ( ! wp_revisions_enabled( $post ) ) { + return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) ); + } + + $revisions = wp_get_post_revisions( $post_id ); + + if ( ! $revisions ) { + return array(); + } + + $struct = array(); + + foreach ( $revisions as $revision ) { + if ( ! current_user_can( 'read_post', $revision->ID ) ) { + continue; + } + + // Skip autosaves. + if ( wp_is_post_autosave( $revision ) ) { + continue; + } + + $struct[] = $this->_prepare_post( get_object_vars( $revision ), $fields ); + } + + return $struct; + } + + /** + * Restore a post revision + * + * @since 3.5.0 + * + * @uses wp_restore_post_revision() + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $revision_id + * } + * @return bool|IXR_Error false if there was an error restoring, true if success. + */ + public function wp_restoreRevision( $args ) { + if ( ! $this->minimum_args( $args, 3 ) ) { + return $this->error; + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $revision_id = (int) $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'wp.restoreRevision' ); + + $revision = wp_get_post_revision( $revision_id ); + if ( ! $revision ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( wp_is_post_autosave( $revision ) ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + $post = get_post( $revision->post_parent ); + if ( ! $post ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + // Check if revisions are disabled. + if ( ! wp_revisions_enabled( $post ) ) { + return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) ); + } + + $post = wp_restore_post_revision( $revision_id ); + + return (bool) $post; + } + + /* + * Blogger API functions. + * Specs on http://plant.blogger.com/api and https://groups.yahoo.com/group/bloggerDev/ + */ + + /** + * Retrieve blogs that user owns. + * + * Will make more sense once we support multiple blogs. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function blogger_getUsersBlogs( $args ) { + if ( ! $this->minimum_args( $args, 3 ) ) { + return $this->error; + } + + if ( is_multisite() ) { + return $this->_multisite_getUsersBlogs( $args ); + } + + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'blogger.getUsersBlogs' ); + + $is_admin = current_user_can( 'manage_options' ); + + $struct = array( + 'isAdmin' => $is_admin, + 'url' => get_option( 'home' ) . '/', + 'blogid' => '1', + 'blogName' => get_option( 'blogname' ), + 'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ), + ); + + return array( $struct ); + } + + /** + * Private function for retrieving a users blogs for multisite setups + * + * @since 3.0.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type string $username Username. + * @type string $password Password. + * } + * @return array|IXR_Error + */ + protected function _multisite_getUsersBlogs( $args ) { + $current_blog = get_site(); + + $domain = $current_blog->domain; + $path = $current_blog->path . 'xmlrpc.php'; + + $rpc = new IXR_Client( set_url_scheme( "http://{$domain}{$path}" ) ); + $rpc->query( 'wp.getUsersBlogs', $args[1], $args[2] ); + $blogs = $rpc->getResponse(); + + if ( isset( $blogs['faultCode'] ) ) { + return new IXR_Error( $blogs['faultCode'], $blogs['faultString'] ); + } + + if ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) { + return $blogs; + } else { + foreach ( (array) $blogs as $blog ) { + if ( strpos( $blog['url'], $_SERVER['HTTP_HOST'] ) ) { + return array( $blog ); + } + } + return array(); + } + } + + /** + * Retrieve user's data. + * + * Gives your client some info about you, so you don't have to. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function blogger_getUserInfo( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to access user data on this site.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'blogger.getUserInfo' ); + + $struct = array( + 'nickname' => $user->nickname, + 'userid' => $user->ID, + 'url' => $user->user_url, + 'lastname' => $user->last_name, + 'firstname' => $user->first_name, + ); + + return $struct; + } + + /** + * Retrieve post. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type int $post_ID + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function blogger_getPost( $args ) { + $this->escape( $args ); + + $post_ID = (int) $args[1]; + $username = $args[2]; + $password = $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + $post_data = get_post( $post_ID, ARRAY_A ); + if ( ! $post_data ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'blogger.getPost' ); + + $categories = implode( ',', wp_get_post_categories( $post_ID ) ); + + $content = '<title>' . wp_unslash( $post_data['post_title'] ) . ''; + $content .= '' . $categories . ''; + $content .= wp_unslash( $post_data['post_content'] ); + + $struct = array( + 'userid' => $post_data['post_author'], + 'dateCreated' => $this->_convert_date( $post_data['post_date'] ), + 'content' => $content, + 'postid' => (string) $post_data['ID'], + ); + + return $struct; + } + + /** + * Retrieve list of recent posts. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type string $appkey (unused) + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $numberposts (optional) + * } + * @return array|IXR_Error + */ + public function blogger_getRecentPosts( $args ) { + + $this->escape( $args ); + + // $args[0] = appkey - ignored. + $username = $args[2]; + $password = $args[3]; + if ( isset( $args[4] ) ) { + $query = array( 'numberposts' => absint( $args[4] ) ); + } else { + $query = array(); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'blogger.getRecentPosts' ); + + $posts_list = wp_get_recent_posts( $query ); + + if ( ! $posts_list ) { + $this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) ); + return $this->error; + } + + $recent_posts = array(); + foreach ( $posts_list as $entry ) { + if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) { + continue; + } + + $post_date = $this->_convert_date( $entry['post_date'] ); + $categories = implode( ',', wp_get_post_categories( $entry['ID'] ) ); + + $content = '' . wp_unslash( $entry['post_title'] ) . ''; + $content .= '' . $categories . ''; + $content .= wp_unslash( $entry['post_content'] ); + + $recent_posts[] = array( + 'userid' => $entry['post_author'], + 'dateCreated' => $post_date, + 'content' => $content, + 'postid' => (string) $entry['ID'], + ); + } + + return $recent_posts; + } + + /** + * Deprecated. + * + * @since 1.5.0 + * @deprecated 3.5.0 + * + * @param array $args Unused. + * @return IXR_Error Error object. + */ + public function blogger_getTemplate( $args ) { + return new IXR_Error( 403, __( 'Sorry, this method is not supported.' ) ); + } + + /** + * Deprecated. + * + * @since 1.5.0 + * @deprecated 3.5.0 + * + * @param array $args Unused. + * @return IXR_Error Error object. + */ + public function blogger_setTemplate( $args ) { + return new IXR_Error( 403, __( 'Sorry, this method is not supported.' ) ); + } + + /** + * Creates new post. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type string $appkey (unused) + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type string $content + * @type string $publish + * } + * @return int|IXR_Error + */ + public function blogger_newPost( $args ) { + $this->escape( $args ); + + $username = $args[2]; + $password = $args[3]; + $content = $args[4]; + $publish = $args[5]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'blogger.newPost' ); + + $cap = ( $publish ) ? 'publish_posts' : 'edit_posts'; + if ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) || ! current_user_can( $cap ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) ); + } + + $post_status = ( $publish ) ? 'publish' : 'draft'; + + $post_author = $user->ID; + + $post_title = xmlrpc_getposttitle( $content ); + $post_category = xmlrpc_getpostcategory( $content ); + $post_content = xmlrpc_removepostdata( $content ); + + $post_date = current_time( 'mysql' ); + $post_date_gmt = current_time( 'mysql', 1 ); + + $post_data = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status' ); + + $post_ID = wp_insert_post( $post_data ); + if ( is_wp_error( $post_ID ) ) { + return new IXR_Error( 500, $post_ID->get_error_message() ); + } + + if ( ! $post_ID ) { + return new IXR_Error( 500, __( 'Sorry, the post could not be created.' ) ); + } + + $this->attach_uploads( $post_ID, $post_content ); + + /** + * Fires after a new post has been successfully created via the XML-RPC Blogger API. + * + * @since 3.4.0 + * + * @param int $post_ID ID of the new post. + * @param array $args An array of new post arguments. + */ + do_action( 'xmlrpc_call_success_blogger_newPost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + return $post_ID; + } + + /** + * Edit a post. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type int $post_ID + * @type string $username + * @type string $password + * @type string $content + * @type bool $publish + * } + * @return true|IXR_Error true when done. + */ + public function blogger_editPost( $args ) { + + $this->escape( $args ); + + $post_ID = (int) $args[1]; + $username = $args[2]; + $password = $args[3]; + $content = $args[4]; + $publish = $args[5]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'blogger.editPost' ); + + $actual_post = get_post( $post_ID, ARRAY_A ); + + if ( ! $actual_post || 'post' !== $actual_post['post_type'] ) { + return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); + } + + $this->escape( $actual_post ); + + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + if ( 'publish' === $actual_post['post_status'] && ! current_user_can( 'publish_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) ); + } + + $postdata = array(); + $postdata['ID'] = $actual_post['ID']; + $postdata['post_content'] = xmlrpc_removepostdata( $content ); + $postdata['post_title'] = xmlrpc_getposttitle( $content ); + $postdata['post_category'] = xmlrpc_getpostcategory( $content ); + $postdata['post_status'] = $actual_post['post_status']; + $postdata['post_excerpt'] = $actual_post['post_excerpt']; + $postdata['post_status'] = $publish ? 'publish' : 'draft'; + + $result = wp_update_post( $postdata ); + + if ( ! $result ) { + return new IXR_Error( 500, __( 'Sorry, the post could not be updated.' ) ); + } + $this->attach_uploads( $actual_post['ID'], $postdata['post_content'] ); + + /** + * Fires after a post has been successfully updated via the XML-RPC Blogger API. + * + * @since 3.4.0 + * + * @param int $post_ID ID of the updated post. + * @param array $args An array of arguments for the post to edit. + */ + do_action( 'xmlrpc_call_success_blogger_editPost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + return true; + } + + /** + * Remove a post. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type int $post_ID + * @type string $username + * @type string $password + * } + * @return true|IXR_Error True when post is deleted. + */ + public function blogger_deletePost( $args ) { + $this->escape( $args ); + + $post_ID = (int) $args[1]; + $username = $args[2]; + $password = $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'blogger.deletePost' ); + + $actual_post = get_post( $post_ID, ARRAY_A ); + + if ( ! $actual_post || 'post' !== $actual_post['post_type'] ) { + return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); + } + + if ( ! current_user_can( 'delete_post', $post_ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) ); + } + + $result = wp_delete_post( $post_ID ); + + if ( ! $result ) { + return new IXR_Error( 500, __( 'Sorry, the post could not be deleted.' ) ); + } + + /** + * Fires after a post has been successfully deleted via the XML-RPC Blogger API. + * + * @since 3.4.0 + * + * @param int $post_ID ID of the deleted post. + * @param array $args An array of arguments to delete the post. + */ + do_action( 'xmlrpc_call_success_blogger_deletePost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + return true; + } + + /* + * MetaWeblog API functions. + * Specs on wherever Dave Winer wants them to be. + */ + + /** + * Create a new post. + * + * The 'content_struct' argument must contain: + * - title + * - description + * - mt_excerpt + * - mt_text_more + * - mt_keywords + * - mt_tb_ping_urls + * - categories + * + * Also, it can optionally contain: + * - wp_slug + * - wp_password + * - wp_page_parent_id + * - wp_page_order + * - wp_author_id + * - post_status | page_status - can be 'draft', 'private', 'publish', or 'pending' + * - mt_allow_comments - can be 'open' or 'closed' + * - mt_allow_pings - can be 'open' or 'closed' + * - date_created_gmt + * - dateCreated + * - wp_post_thumbnail + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $content_struct + * @type int $publish + * } + * @return int|IXR_Error + */ + public function mw_newPost( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + $content_struct = $args[3]; + $publish = isset( $args[4] ) ? $args[4] : 0; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'metaWeblog.newPost' ); + + $page_template = ''; + if ( ! empty( $content_struct['post_type'] ) ) { + if ( 'page' === $content_struct['post_type'] ) { + if ( $publish ) { + $cap = 'publish_pages'; + } elseif ( isset( $content_struct['page_status'] ) && 'publish' === $content_struct['page_status'] ) { + $cap = 'publish_pages'; + } else { + $cap = 'edit_pages'; + } + $error_message = __( 'Sorry, you are not allowed to publish pages on this site.' ); + $post_type = 'page'; + if ( ! empty( $content_struct['wp_page_template'] ) ) { + $page_template = $content_struct['wp_page_template']; + } + } elseif ( 'post' === $content_struct['post_type'] ) { + if ( $publish ) { + $cap = 'publish_posts'; + } elseif ( isset( $content_struct['post_status'] ) && 'publish' === $content_struct['post_status'] ) { + $cap = 'publish_posts'; + } else { + $cap = 'edit_posts'; + } + $error_message = __( 'Sorry, you are not allowed to publish posts on this site.' ); + $post_type = 'post'; + } else { + // No other 'post_type' values are allowed here. + return new IXR_Error( 401, __( 'Invalid post type.' ) ); + } + } else { + if ( $publish ) { + $cap = 'publish_posts'; + } elseif ( isset( $content_struct['post_status'] ) && 'publish' === $content_struct['post_status'] ) { + $cap = 'publish_posts'; + } else { + $cap = 'edit_posts'; + } + $error_message = __( 'Sorry, you are not allowed to publish posts on this site.' ); + $post_type = 'post'; + } + + if ( ! current_user_can( get_post_type_object( $post_type )->cap->create_posts ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts on this site.' ) ); + } + if ( ! current_user_can( $cap ) ) { + return new IXR_Error( 401, $error_message ); + } + + // Check for a valid post format if one was given. + if ( isset( $content_struct['wp_post_format'] ) ) { + $content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] ); + if ( ! array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) { + return new IXR_Error( 404, __( 'Invalid post format.' ) ); + } + } + + // Let WordPress generate the 'post_name' (slug) unless + // one has been provided. + $post_name = ''; + if ( isset( $content_struct['wp_slug'] ) ) { + $post_name = $content_struct['wp_slug']; + } + + // Only use a password if one was given. + if ( isset( $content_struct['wp_password'] ) ) { + $post_password = $content_struct['wp_password']; + } else { + $post_password = ''; + } + + // Only set a post parent if one was given. + if ( isset( $content_struct['wp_page_parent_id'] ) ) { + $post_parent = $content_struct['wp_page_parent_id']; + } else { + $post_parent = 0; + } + + // Only set the 'menu_order' if it was given. + if ( isset( $content_struct['wp_page_order'] ) ) { + $menu_order = $content_struct['wp_page_order']; + } else { + $menu_order = 0; + } + + $post_author = $user->ID; + + // If an author id was provided then use it instead. + if ( isset( $content_struct['wp_author_id'] ) && ( $user->ID != $content_struct['wp_author_id'] ) ) { + switch ( $post_type ) { + case 'post': + if ( ! current_user_can( 'edit_others_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) ); + } + break; + case 'page': + if ( ! current_user_can( 'edit_others_pages' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to create pages as this user.' ) ); + } + break; + default: + return new IXR_Error( 401, __( 'Invalid post type.' ) ); + } + $author = get_userdata( $content_struct['wp_author_id'] ); + if ( ! $author ) { + return new IXR_Error( 404, __( 'Invalid author ID.' ) ); + } + $post_author = $content_struct['wp_author_id']; + } + + $post_title = isset( $content_struct['title'] ) ? $content_struct['title'] : null; + $post_content = isset( $content_struct['description'] ) ? $content_struct['description'] : null; + + $post_status = $publish ? 'publish' : 'draft'; + + if ( isset( $content_struct[ "{$post_type}_status" ] ) ) { + switch ( $content_struct[ "{$post_type}_status" ] ) { + case 'draft': + case 'pending': + case 'private': + case 'publish': + $post_status = $content_struct[ "{$post_type}_status" ]; + break; + default: + $post_status = $publish ? 'publish' : 'draft'; + break; + } + } + + $post_excerpt = isset( $content_struct['mt_excerpt'] ) ? $content_struct['mt_excerpt'] : null; + $post_more = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : null; + + $tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : null; + + if ( isset( $content_struct['mt_allow_comments'] ) ) { + if ( ! is_numeric( $content_struct['mt_allow_comments'] ) ) { + switch ( $content_struct['mt_allow_comments'] ) { + case 'closed': + $comment_status = 'closed'; + break; + case 'open': + $comment_status = 'open'; + break; + default: + $comment_status = get_default_comment_status( $post_type ); + break; + } + } else { + switch ( (int) $content_struct['mt_allow_comments'] ) { + case 0: + case 2: + $comment_status = 'closed'; + break; + case 1: + $comment_status = 'open'; + break; + default: + $comment_status = get_default_comment_status( $post_type ); + break; + } + } + } else { + $comment_status = get_default_comment_status( $post_type ); + } + + if ( isset( $content_struct['mt_allow_pings'] ) ) { + if ( ! is_numeric( $content_struct['mt_allow_pings'] ) ) { + switch ( $content_struct['mt_allow_pings'] ) { + case 'closed': + $ping_status = 'closed'; + break; + case 'open': + $ping_status = 'open'; + break; + default: + $ping_status = get_default_comment_status( $post_type, 'pingback' ); + break; + } + } else { + switch ( (int) $content_struct['mt_allow_pings'] ) { + case 0: + $ping_status = 'closed'; + break; + case 1: + $ping_status = 'open'; + break; + default: + $ping_status = get_default_comment_status( $post_type, 'pingback' ); + break; + } + } + } else { + $ping_status = get_default_comment_status( $post_type, 'pingback' ); + } + + if ( $post_more ) { + $post_content = $post_content . '' . $post_more; + } + + $to_ping = null; + if ( isset( $content_struct['mt_tb_ping_urls'] ) ) { + $to_ping = $content_struct['mt_tb_ping_urls']; + if ( is_array( $to_ping ) ) { + $to_ping = implode( ' ', $to_ping ); + } + } + + // Do some timestamp voodoo. + if ( ! empty( $content_struct['date_created_gmt'] ) ) { + // We know this is supposed to be GMT, so we're going to slap that Z on there by force. + $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; + } elseif ( ! empty( $content_struct['dateCreated'] ) ) { + $dateCreated = $content_struct['dateCreated']->getIso(); + } + + if ( ! empty( $dateCreated ) ) { + $post_date = iso8601_to_datetime( $dateCreated ); + $post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' ); + } else { + $post_date = ''; + $post_date_gmt = ''; + } + + $post_category = array(); + if ( isset( $content_struct['categories'] ) ) { + $catnames = $content_struct['categories']; + + if ( is_array( $catnames ) ) { + foreach ( $catnames as $cat ) { + $post_category[] = get_cat_ID( $cat ); + } + } + } + + $postdata = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'to_ping', 'post_type', 'post_name', 'post_password', 'post_parent', 'menu_order', 'tags_input', 'page_template' ); + + $post_ID = get_default_post_to_edit( $post_type, true )->ID; + $postdata['ID'] = $post_ID; + + // Only posts can be sticky. + if ( 'post' === $post_type && isset( $content_struct['sticky'] ) ) { + $data = $postdata; + $data['sticky'] = $content_struct['sticky']; + $error = $this->_toggle_sticky( $data ); + if ( $error ) { + return $error; + } + } + + if ( isset( $content_struct['custom_fields'] ) ) { + $this->set_custom_fields( $post_ID, $content_struct['custom_fields'] ); + } + + if ( isset( $content_struct['wp_post_thumbnail'] ) ) { + if ( set_post_thumbnail( $post_ID, $content_struct['wp_post_thumbnail'] ) === false ) { + return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); + } + + unset( $content_struct['wp_post_thumbnail'] ); + } + + // Handle enclosures. + $thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null; + $this->add_enclosure_if_new( $post_ID, $thisEnclosure ); + + $this->attach_uploads( $post_ID, $post_content ); + + // Handle post formats if assigned, value is validated earlier + // in this function. + if ( isset( $content_struct['wp_post_format'] ) ) { + set_post_format( $post_ID, $content_struct['wp_post_format'] ); + } + + $post_ID = wp_insert_post( $postdata, true ); + if ( is_wp_error( $post_ID ) ) { + return new IXR_Error( 500, $post_ID->get_error_message() ); + } + + if ( ! $post_ID ) { + return new IXR_Error( 500, __( 'Sorry, the post could not be created.' ) ); + } + + /** + * Fires after a new post has been successfully created via the XML-RPC MovableType API. + * + * @since 3.4.0 + * + * @param int $post_ID ID of the new post. + * @param array $args An array of arguments to create the new post. + */ + do_action( 'xmlrpc_call_success_mw_newPost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + return strval( $post_ID ); + } + + /** + * Adds an enclosure to a post if it's new. + * + * @since 2.8.0 + * + * @param integer $post_ID Post ID. + * @param array $enclosure Enclosure data. + */ + public function add_enclosure_if_new( $post_ID, $enclosure ) { + if ( is_array( $enclosure ) && isset( $enclosure['url'] ) && isset( $enclosure['length'] ) && isset( $enclosure['type'] ) ) { + $encstring = $enclosure['url'] . "\n" . $enclosure['length'] . "\n" . $enclosure['type'] . "\n"; + $found = false; + $enclosures = get_post_meta( $post_ID, 'enclosure' ); + if ( $enclosures ) { + foreach ( $enclosures as $enc ) { + // This method used to omit the trailing new line. #23219 + if ( rtrim( $enc, "\n" ) == rtrim( $encstring, "\n" ) ) { + $found = true; + break; + } + } + } + if ( ! $found ) { + add_post_meta( $post_ID, 'enclosure', $encstring ); + } + } + } + + /** + * Attach upload to a post. + * + * @since 2.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $post_ID Post ID. + * @param string $post_content Post Content for attachment. + */ + public function attach_uploads( $post_ID, $post_content ) { + global $wpdb; + + // Find any unattached files. + $attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_parent = '0' AND post_type = 'attachment'" ); + if ( is_array( $attachments ) ) { + foreach ( $attachments as $file ) { + if ( ! empty( $file->guid ) && strpos( $post_content, $file->guid ) !== false ) { + $wpdb->update( $wpdb->posts, array( 'post_parent' => $post_ID ), array( 'ID' => $file->ID ) ); + } + } + } + } + + /** + * Edit a post. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $content_struct + * @type int $publish + * } + * @return bool|IXR_Error True on success. + */ + public function mw_editPost( $args ) { + $this->escape( $args ); + + $post_ID = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $content_struct = $args[3]; + $publish = isset( $args[4] ) ? $args[4] : 0; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'metaWeblog.editPost' ); + + $postdata = get_post( $post_ID, ARRAY_A ); + + /* + * If there is no post data for the give post id, stop now and return an error. + * Otherwise a new post will be created (which was the old behavior). + */ + if ( ! $postdata || empty( $postdata['ID'] ) ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + // Use wp.editPost to edit post types other than post and page. + if ( ! in_array( $postdata['post_type'], array( 'post', 'page' ) ) ) { + return new IXR_Error( 401, __( 'Invalid post type.' ) ); + } + + // Thwart attempt to change the post type. + if ( ! empty( $content_struct['post_type'] ) && ( $content_struct['post_type'] != $postdata['post_type'] ) ) { + return new IXR_Error( 401, __( 'The post type may not be changed.' ) ); + } + + // Check for a valid post format if one was given. + if ( isset( $content_struct['wp_post_format'] ) ) { + $content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] ); + if ( ! array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) { + return new IXR_Error( 404, __( 'Invalid post format.' ) ); + } + } + + $this->escape( $postdata ); + + $ID = $postdata['ID']; + $post_content = $postdata['post_content']; + $post_title = $postdata['post_title']; + $post_excerpt = $postdata['post_excerpt']; + $post_password = $postdata['post_password']; + $post_parent = $postdata['post_parent']; + $post_type = $postdata['post_type']; + $menu_order = $postdata['menu_order']; + $ping_status = $postdata['ping_status']; + $comment_status = $postdata['comment_status']; + + // Let WordPress manage slug if none was provided. + $post_name = $postdata['post_name']; + if ( isset( $content_struct['wp_slug'] ) ) { + $post_name = $content_struct['wp_slug']; + } + + // Only use a password if one was given. + if ( isset( $content_struct['wp_password'] ) ) { + $post_password = $content_struct['wp_password']; + } + + // Only set a post parent if one was given. + if ( isset( $content_struct['wp_page_parent_id'] ) ) { + $post_parent = $content_struct['wp_page_parent_id']; + } + + // Only set the 'menu_order' if it was given. + if ( isset( $content_struct['wp_page_order'] ) ) { + $menu_order = $content_struct['wp_page_order']; + } + + $page_template = null; + if ( ! empty( $content_struct['wp_page_template'] ) && 'page' == $post_type ) { + $page_template = $content_struct['wp_page_template']; + } + + $post_author = $postdata['post_author']; + + // If an author id was provided then use it instead. + if ( isset( $content_struct['wp_author_id'] ) ) { + // Check permissions if attempting to switch author to or from another user. + if ( $user->ID != $content_struct['wp_author_id'] || $user->ID != $post_author ) { + switch ( $post_type ) { + case 'post': + if ( ! current_user_can( 'edit_others_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the post author as this user.' ) ); + } + break; + case 'page': + if ( ! current_user_can( 'edit_others_pages' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the page author as this user.' ) ); + } + break; + default: + return new IXR_Error( 401, __( 'Invalid post type.' ) ); + } + $post_author = $content_struct['wp_author_id']; + } + } + + if ( isset( $content_struct['mt_allow_comments'] ) ) { + if ( ! is_numeric( $content_struct['mt_allow_comments'] ) ) { + switch ( $content_struct['mt_allow_comments'] ) { + case 'closed': + $comment_status = 'closed'; + break; + case 'open': + $comment_status = 'open'; + break; + default: + $comment_status = get_default_comment_status( $post_type ); + break; + } + } else { + switch ( (int) $content_struct['mt_allow_comments'] ) { + case 0: + case 2: + $comment_status = 'closed'; + break; + case 1: + $comment_status = 'open'; + break; + default: + $comment_status = get_default_comment_status( $post_type ); + break; + } + } + } + + if ( isset( $content_struct['mt_allow_pings'] ) ) { + if ( ! is_numeric( $content_struct['mt_allow_pings'] ) ) { + switch ( $content_struct['mt_allow_pings'] ) { + case 'closed': + $ping_status = 'closed'; + break; + case 'open': + $ping_status = 'open'; + break; + default: + $ping_status = get_default_comment_status( $post_type, 'pingback' ); + break; + } + } else { + switch ( (int) $content_struct['mt_allow_pings'] ) { + case 0: + $ping_status = 'closed'; + break; + case 1: + $ping_status = 'open'; + break; + default: + $ping_status = get_default_comment_status( $post_type, 'pingback' ); + break; + } + } + } + + if ( isset( $content_struct['title'] ) ) { + $post_title = $content_struct['title']; + } + + if ( isset( $content_struct['description'] ) ) { + $post_content = $content_struct['description']; + } + + $post_category = array(); + if ( isset( $content_struct['categories'] ) ) { + $catnames = $content_struct['categories']; + if ( is_array( $catnames ) ) { + foreach ( $catnames as $cat ) { + $post_category[] = get_cat_ID( $cat ); + } + } + } + + if ( isset( $content_struct['mt_excerpt'] ) ) { + $post_excerpt = $content_struct['mt_excerpt']; + } + + $post_more = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : null; + + $post_status = $publish ? 'publish' : 'draft'; + if ( isset( $content_struct[ "{$post_type}_status" ] ) ) { + switch ( $content_struct[ "{$post_type}_status" ] ) { + case 'draft': + case 'pending': + case 'private': + case 'publish': + $post_status = $content_struct[ "{$post_type}_status" ]; + break; + default: + $post_status = $publish ? 'publish' : 'draft'; + break; + } + } + + $tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : null; + + if ( 'publish' === $post_status || 'private' === $post_status ) { + if ( 'page' == $post_type && ! current_user_can( 'publish_pages' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this page.' ) ); + } elseif ( ! current_user_can( 'publish_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) ); + } + } + + if ( $post_more ) { + $post_content = $post_content . '' . $post_more; + } + + $to_ping = null; + if ( isset( $content_struct['mt_tb_ping_urls'] ) ) { + $to_ping = $content_struct['mt_tb_ping_urls']; + if ( is_array( $to_ping ) ) { + $to_ping = implode( ' ', $to_ping ); + } + } + + // Do some timestamp voodoo. + if ( ! empty( $content_struct['date_created_gmt'] ) ) { + // We know this is supposed to be GMT, so we're going to slap that Z on there by force. + $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; + } elseif ( ! empty( $content_struct['dateCreated'] ) ) { + $dateCreated = $content_struct['dateCreated']->getIso(); + } + + // Default to not flagging the post date to be edited unless it's intentional. + $edit_date = false; + + if ( ! empty( $dateCreated ) ) { + $post_date = iso8601_to_datetime( $dateCreated ); + $post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' ); + + // Flag the post date to be edited. + $edit_date = true; + } else { + $post_date = $postdata['post_date']; + $post_date_gmt = $postdata['post_date_gmt']; + } + + // We've got all the data -- post it. + $newpost = compact( 'ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'edit_date', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input', 'page_template' ); + + $result = wp_update_post( $newpost, true ); + if ( is_wp_error( $result ) ) { + return new IXR_Error( 500, $result->get_error_message() ); + } + + if ( ! $result ) { + return new IXR_Error( 500, __( 'Sorry, the post could not be updated.' ) ); + } + + // Only posts can be sticky. + if ( 'post' === $post_type && isset( $content_struct['sticky'] ) ) { + $data = $newpost; + $data['sticky'] = $content_struct['sticky']; + $data['post_type'] = 'post'; + $error = $this->_toggle_sticky( $data, true ); + if ( $error ) { + return $error; + } + } + + if ( isset( $content_struct['custom_fields'] ) ) { + $this->set_custom_fields( $post_ID, $content_struct['custom_fields'] ); + } + + if ( isset( $content_struct['wp_post_thumbnail'] ) ) { + + // Empty value deletes, non-empty value adds/updates. + if ( empty( $content_struct['wp_post_thumbnail'] ) ) { + delete_post_thumbnail( $post_ID ); + } else { + if ( set_post_thumbnail( $post_ID, $content_struct['wp_post_thumbnail'] ) === false ) { + return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); + } + } + unset( $content_struct['wp_post_thumbnail'] ); + } + + // Handle enclosures. + $thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null; + $this->add_enclosure_if_new( $post_ID, $thisEnclosure ); + + $this->attach_uploads( $ID, $post_content ); + + // Handle post formats if assigned, validation is handled earlier in this function. + if ( isset( $content_struct['wp_post_format'] ) ) { + set_post_format( $post_ID, $content_struct['wp_post_format'] ); + } + + /** + * Fires after a post has been successfully updated via the XML-RPC MovableType API. + * + * @since 3.4.0 + * + * @param int $post_ID ID of the updated post. + * @param array $args An array of arguments to update the post. + */ + do_action( 'xmlrpc_call_success_mw_editPost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + return true; + } + + /** + * Retrieve post. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type int $post_ID + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function mw_getPost( $args ) { + $this->escape( $args ); + + $post_ID = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + $postdata = get_post( $post_ID, ARRAY_A ); + if ( ! $postdata ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'metaWeblog.getPost' ); + + if ( '' != $postdata['post_date'] ) { + $post_date = $this->_convert_date( $postdata['post_date'] ); + $post_date_gmt = $this->_convert_date_gmt( $postdata['post_date_gmt'], $postdata['post_date'] ); + $post_modified = $this->_convert_date( $postdata['post_modified'] ); + $post_modified_gmt = $this->_convert_date_gmt( $postdata['post_modified_gmt'], $postdata['post_modified'] ); + + $categories = array(); + $catids = wp_get_post_categories( $post_ID ); + foreach ( $catids as $catid ) { + $categories[] = get_cat_name( $catid ); + } + + $tagnames = array(); + $tags = wp_get_post_tags( $post_ID ); + if ( ! empty( $tags ) ) { + foreach ( $tags as $tag ) { + $tagnames[] = $tag->name; + } + $tagnames = implode( ', ', $tagnames ); + } else { + $tagnames = ''; + } + + $post = get_extended( $postdata['post_content'] ); + $link = get_permalink( $postdata['ID'] ); + + // Get the author info. + $author = get_userdata( $postdata['post_author'] ); + + $allow_comments = ( 'open' == $postdata['comment_status'] ) ? 1 : 0; + $allow_pings = ( 'open' == $postdata['ping_status'] ) ? 1 : 0; + + // Consider future posts as published. + if ( 'future' === $postdata['post_status'] ) { + $postdata['post_status'] = 'publish'; + } + + // Get post format. + $post_format = get_post_format( $post_ID ); + if ( empty( $post_format ) ) { + $post_format = 'standard'; + } + + $sticky = false; + if ( is_sticky( $post_ID ) ) { + $sticky = true; + } + + $enclosure = array(); + foreach ( (array) get_post_custom( $post_ID ) as $key => $val ) { + if ( 'enclosure' === $key ) { + foreach ( (array) $val as $enc ) { + $encdata = explode( "\n", $enc ); + $enclosure['url'] = trim( htmlspecialchars( $encdata[0] ) ); + $enclosure['length'] = (int) trim( $encdata[1] ); + $enclosure['type'] = trim( $encdata[2] ); + break 2; + } + } + } + + $resp = array( + 'dateCreated' => $post_date, + 'userid' => $postdata['post_author'], + 'postid' => $postdata['ID'], + 'description' => $post['main'], + 'title' => $postdata['post_title'], + 'link' => $link, + 'permaLink' => $link, + // Commented out because no other tool seems to use this. + // 'content' => $entry['post_content'], + 'categories' => $categories, + 'mt_excerpt' => $postdata['post_excerpt'], + 'mt_text_more' => $post['extended'], + 'wp_more_text' => $post['more_text'], + 'mt_allow_comments' => $allow_comments, + 'mt_allow_pings' => $allow_pings, + 'mt_keywords' => $tagnames, + 'wp_slug' => $postdata['post_name'], + 'wp_password' => $postdata['post_password'], + 'wp_author_id' => (string) $author->ID, + 'wp_author_display_name' => $author->display_name, + 'date_created_gmt' => $post_date_gmt, + 'post_status' => $postdata['post_status'], + 'custom_fields' => $this->get_custom_fields( $post_ID ), + 'wp_post_format' => $post_format, + 'sticky' => $sticky, + 'date_modified' => $post_modified, + 'date_modified_gmt' => $post_modified_gmt, + ); + + if ( ! empty( $enclosure ) ) { + $resp['enclosure'] = $enclosure; + } + + $resp['wp_post_thumbnail'] = get_post_thumbnail_id( $postdata['ID'] ); + + return $resp; + } else { + return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); + } + } + + /** + * Retrieve list of recent posts. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $numberposts + * } + * @return array|IXR_Error + */ + public function mw_getRecentPosts( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + if ( isset( $args[3] ) ) { + $query = array( 'numberposts' => absint( $args[3] ) ); + } else { + $query = array(); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'metaWeblog.getRecentPosts' ); + + $posts_list = wp_get_recent_posts( $query ); + + if ( ! $posts_list ) { + return array(); + } + + $recent_posts = array(); + foreach ( $posts_list as $entry ) { + if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) { + continue; + } + + $post_date = $this->_convert_date( $entry['post_date'] ); + $post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] ); + $post_modified = $this->_convert_date( $entry['post_modified'] ); + $post_modified_gmt = $this->_convert_date_gmt( $entry['post_modified_gmt'], $entry['post_modified'] ); + + $categories = array(); + $catids = wp_get_post_categories( $entry['ID'] ); + foreach ( $catids as $catid ) { + $categories[] = get_cat_name( $catid ); + } + + $tagnames = array(); + $tags = wp_get_post_tags( $entry['ID'] ); + if ( ! empty( $tags ) ) { + foreach ( $tags as $tag ) { + $tagnames[] = $tag->name; + } + $tagnames = implode( ', ', $tagnames ); + } else { + $tagnames = ''; + } + + $post = get_extended( $entry['post_content'] ); + $link = get_permalink( $entry['ID'] ); + + // Get the post author info. + $author = get_userdata( $entry['post_author'] ); + + $allow_comments = ( 'open' == $entry['comment_status'] ) ? 1 : 0; + $allow_pings = ( 'open' == $entry['ping_status'] ) ? 1 : 0; + + // Consider future posts as published. + if ( 'future' === $entry['post_status'] ) { + $entry['post_status'] = 'publish'; + } + + // Get post format. + $post_format = get_post_format( $entry['ID'] ); + if ( empty( $post_format ) ) { + $post_format = 'standard'; + } + + $recent_posts[] = array( + 'dateCreated' => $post_date, + 'userid' => $entry['post_author'], + 'postid' => (string) $entry['ID'], + 'description' => $post['main'], + 'title' => $entry['post_title'], + 'link' => $link, + 'permaLink' => $link, + // Commented out because no other tool seems to use this. + // 'content' => $entry['post_content'], + 'categories' => $categories, + 'mt_excerpt' => $entry['post_excerpt'], + 'mt_text_more' => $post['extended'], + 'wp_more_text' => $post['more_text'], + 'mt_allow_comments' => $allow_comments, + 'mt_allow_pings' => $allow_pings, + 'mt_keywords' => $tagnames, + 'wp_slug' => $entry['post_name'], + 'wp_password' => $entry['post_password'], + 'wp_author_id' => (string) $author->ID, + 'wp_author_display_name' => $author->display_name, + 'date_created_gmt' => $post_date_gmt, + 'post_status' => $entry['post_status'], + 'custom_fields' => $this->get_custom_fields( $entry['ID'] ), + 'wp_post_format' => $post_format, + 'date_modified' => $post_modified, + 'date_modified_gmt' => $post_modified_gmt, + 'sticky' => ( 'post' === $entry['post_type'] && is_sticky( $entry['ID'] ) ), + 'wp_post_thumbnail' => get_post_thumbnail_id( $entry['ID'] ), + ); + } + + return $recent_posts; + } + + /** + * Retrieve the list of categories on a given blog. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function mw_getCategories( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'metaWeblog.getCategories' ); + + $categories_struct = array(); + + $cats = get_categories( array( 'get' => 'all' ) ); + if ( $cats ) { + foreach ( $cats as $cat ) { + $struct = array(); + $struct['categoryId'] = $cat->term_id; + $struct['parentId'] = $cat->parent; + $struct['description'] = $cat->name; + $struct['categoryDescription'] = $cat->description; + $struct['categoryName'] = $cat->name; + $struct['htmlUrl'] = esc_html( get_category_link( $cat->term_id ) ); + $struct['rssUrl'] = esc_html( get_category_feed_link( $cat->term_id, 'rss2' ) ); + + $categories_struct[] = $struct; + } + } + + return $categories_struct; + } + + /** + * Uploads a file, following your settings. + * + * Adapted from a patch by Johann Richard. + * + * @link http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/ + * + * @since 1.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type array $data + * } + * @return array|IXR_Error + */ + public function mw_newMediaObject( $args ) { + global $wpdb; + + $username = $this->escape( $args[1] ); + $password = $this->escape( $args[2] ); + $data = $args[3]; + + $name = sanitize_file_name( $data['name'] ); + $type = $data['type']; + $bits = $data['bits']; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'metaWeblog.newMediaObject' ); + + if ( ! current_user_can( 'upload_files' ) ) { + $this->error = new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) ); + return $this->error; + } + + if ( is_multisite() && upload_is_user_over_quota( false ) ) { + $this->error = new IXR_Error( + 401, + sprintf( + /* translators: %s: Allowed space allocation. */ + __( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ), + size_format( get_space_allowed() * MB_IN_BYTES ) + ) + ); + return $this->error; + } + + /** + * Filters whether to preempt the XML-RPC media upload. + * + * Passing a truthy value will effectively short-circuit the media upload, + * returning that value as a 500 error instead. + * + * @since 2.1.0 + * + * @param bool $error Whether to pre-empt the media upload. Default false. + */ + $upload_err = apply_filters( 'pre_upload_error', false ); + if ( $upload_err ) { + return new IXR_Error( 500, $upload_err ); + } + + $upload = wp_upload_bits( $name, null, $bits ); + if ( ! empty( $upload['error'] ) ) { + /* translators: 1: File name, 2: Error message. */ + $errorString = sprintf( __( 'Could not write file %1$s (%2$s).' ), $name, $upload['error'] ); + return new IXR_Error( 500, $errorString ); + } + // Construct the attachment array. + $post_id = 0; + if ( ! empty( $data['post_id'] ) ) { + $post_id = (int) $data['post_id']; + + if ( ! current_user_can( 'edit_post', $post_id ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + } + $attachment = array( + 'post_title' => $name, + 'post_content' => '', + 'post_type' => 'attachment', + 'post_parent' => $post_id, + 'post_mime_type' => $type, + 'guid' => $upload['url'], + ); + + // Save the data. + $id = wp_insert_attachment( $attachment, $upload['file'], $post_id ); + wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) ); + + /** + * Fires after a new attachment has been added via the XML-RPC MovableType API. + * + * @since 3.4.0 + * + * @param int $id ID of the new attachment. + * @param array $args An array of arguments to add the attachment. + */ + do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase + + $struct = $this->_prepare_media_item( get_post( $id ) ); + + // Deprecated values. + $struct['id'] = $struct['attachment_id']; + $struct['file'] = $struct['title']; + $struct['url'] = $struct['link']; + + return $struct; + } + + /* + * MovableType API functions. + * Specs on http://www.movabletype.org/docs/mtmanual_programmatic.html + */ + + /** + * Retrieve the post titles of recent posts. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * @type int $numberposts + * } + * @return array|IXR_Error + */ + public function mt_getRecentPostTitles( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + if ( isset( $args[3] ) ) { + $query = array( 'numberposts' => absint( $args[3] ) ); + } else { + $query = array(); + } + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'mt.getRecentPostTitles' ); + + $posts_list = wp_get_recent_posts( $query ); + + if ( ! $posts_list ) { + $this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) ); + return $this->error; + } + + $recent_posts = array(); + + foreach ( $posts_list as $entry ) { + if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) { + continue; + } + + $post_date = $this->_convert_date( $entry['post_date'] ); + $post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] ); + + $recent_posts[] = array( + 'dateCreated' => $post_date, + 'userid' => $entry['post_author'], + 'postid' => (string) $entry['ID'], + 'title' => $entry['post_title'], + 'post_status' => $entry['post_status'], + 'date_created_gmt' => $post_date_gmt, + ); + } + + return $recent_posts; + } + + /** + * Retrieve list of all categories on blog. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $blog_id (unused) + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function mt_getCategoryList( $args ) { + $this->escape( $args ); + + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! current_user_can( 'edit_posts' ) ) { + return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'mt.getCategoryList' ); + + $categories_struct = array(); + + $cats = get_categories( + array( + 'hide_empty' => 0, + 'hierarchical' => 0, + ) + ); + if ( $cats ) { + foreach ( $cats as $cat ) { + $struct = array(); + $struct['categoryId'] = $cat->term_id; + $struct['categoryName'] = $cat->name; + + $categories_struct[] = $struct; + } + } + + return $categories_struct; + } + + /** + * Retrieve post categories. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $post_ID + * @type string $username + * @type string $password + * } + * @return array|IXR_Error + */ + public function mt_getPostCategories( $args ) { + $this->escape( $args ); + + $post_ID = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + if ( ! get_post( $post_ID ) ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'mt.getPostCategories' ); + + $categories = array(); + $catids = wp_get_post_categories( intval( $post_ID ) ); + // First listed category will be the primary category. + $isPrimary = true; + foreach ( $catids as $catid ) { + $categories[] = array( + 'categoryName' => get_cat_name( $catid ), + 'categoryId' => (string) $catid, + 'isPrimary' => $isPrimary, + ); + $isPrimary = false; + } + + return $categories; + } + + /** + * Sets categories for a post. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $post_ID + * @type string $username + * @type string $password + * @type array $categories + * } + * @return true|IXR_Error True on success. + */ + public function mt_setPostCategories( $args ) { + $this->escape( $args ); + + $post_ID = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $categories = $args[3]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'mt.setPostCategories' ); + + if ( ! get_post( $post_ID ) ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); + } + + $catids = array(); + foreach ( $categories as $cat ) { + $catids[] = $cat['categoryId']; + } + + wp_set_post_categories( $post_ID, $catids ); + + return true; + } + + /** + * Retrieve an array of methods supported by this server. + * + * @since 1.5.0 + * + * @return array + */ + public function mt_supportedMethods() { + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'mt.supportedMethods' ); + + return array_keys( $this->methods ); + } + + /** + * Retrieve an empty array because we don't support per-post text filters. + * + * @since 1.5.0 + */ + public function mt_supportedTextFilters() { + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'mt.supportedTextFilters' ); + + /** + * Filters the MoveableType text filters list for XML-RPC. + * + * @since 2.2.0 + * + * @param array $filters An array of text filters. + */ + return apply_filters( 'xmlrpc_text_filters', array() ); + } + + /** + * Retrieve trackbacks sent to a given post. + * + * @since 1.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $post_ID + * @return array|IXR_Error + */ + public function mt_getTrackbackPings( $post_ID ) { + global $wpdb; + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'mt.getTrackbackPings' ); + + $actual_post = get_post( $post_ID, ARRAY_A ); + + if ( ! $actual_post ) { + return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); + } + + $comments = $wpdb->get_results( $wpdb->prepare( "SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID ) ); + + if ( ! $comments ) { + return array(); + } + + $trackback_pings = array(); + foreach ( $comments as $comment ) { + if ( 'trackback' == $comment->comment_type ) { + $content = $comment->comment_content; + $title = substr( $content, 8, ( strpos( $content, '' ) - 8 ) ); + $trackback_pings[] = array( + 'pingTitle' => $title, + 'pingURL' => $comment->comment_author_url, + 'pingIP' => $comment->comment_author_IP, + ); + } + } + + return $trackback_pings; + } + + /** + * Sets a post's publish status to 'publish'. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type int $post_ID + * @type string $username + * @type string $password + * } + * @return int|IXR_Error + */ + public function mt_publishPost( $args ) { + $this->escape( $args ); + + $post_ID = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + + $user = $this->login( $username, $password ); + if ( ! $user ) { + return $this->error; + } + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'mt.publishPost' ); + + $postdata = get_post( $post_ID, ARRAY_A ); + if ( ! $postdata ) { + return new IXR_Error( 404, __( 'Invalid post ID.' ) ); + } + + if ( ! current_user_can( 'publish_posts' ) || ! current_user_can( 'edit_post', $post_ID ) ) { + return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) ); + } + + $postdata['post_status'] = 'publish'; + + // Retain old categories. + $postdata['post_category'] = wp_get_post_categories( $post_ID ); + $this->escape( $postdata ); + + return wp_update_post( $postdata ); + } + + /* + * Pingback functions. + * Specs on www.hixie.ch/specs/pingback/pingback + */ + + /** + * Retrieves a pingback and registers it. + * + * @since 1.5.0 + * + * @param array $args { + * Method arguments. Note: arguments must be ordered as documented. + * + * @type string $pagelinkedfrom + * @type string $pagelinkedto + * } + * @return string|IXR_Error + */ + public function pingback_ping( $args ) { + global $wpdb; + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'pingback.ping' ); + + $this->escape( $args ); + + $pagelinkedfrom = str_replace( '&', '&', $args[0] ); + $pagelinkedto = str_replace( '&', '&', $args[1] ); + $pagelinkedto = str_replace( '&', '&', $pagelinkedto ); + + /** + * Filters the pingback source URI. + * + * @since 3.6.0 + * + * @param string $pagelinkedfrom URI of the page linked from. + * @param string $pagelinkedto URI of the page linked to. + */ + $pagelinkedfrom = apply_filters( 'pingback_ping_source_uri', $pagelinkedfrom, $pagelinkedto ); + + if ( ! $pagelinkedfrom ) { + return $this->pingback_error( 0, __( 'A valid URL was not provided.' ) ); + } + + // Check if the page linked to is on our site. + $pos1 = strpos( $pagelinkedto, str_replace( array( 'http://www.', 'http://', 'https://www.', 'https://' ), '', get_option( 'home' ) ) ); + if ( ! $pos1 ) { + return $this->pingback_error( 0, __( 'Is there no link to us?' ) ); + } + + /* + * Let's find which post is linked to. + * FIXME: Does url_to_postid() cover all these cases already? + * If so, then let's use it and drop the old code. + */ + $urltest = parse_url( $pagelinkedto ); + $post_ID = url_to_postid( $pagelinkedto ); + if ( $post_ID ) { + // $way + } elseif ( isset( $urltest['path'] ) && preg_match( '#p/[0-9]{1,}#', $urltest['path'], $match ) ) { + // The path defines the post_ID (archives/p/XXXX). + $blah = explode( '/', $match[0] ); + $post_ID = (int) $blah[1]; + } elseif ( isset( $urltest['query'] ) && preg_match( '#p=[0-9]{1,}#', $urltest['query'], $match ) ) { + // The query string defines the post_ID (?p=XXXX). + $blah = explode( '=', $match[0] ); + $post_ID = (int) $blah[1]; + } elseif ( isset( $urltest['fragment'] ) ) { + // An #anchor is there, it's either... + if ( intval( $urltest['fragment'] ) ) { + // ...an integer #XXXX (simplest case), + $post_ID = (int) $urltest['fragment']; + } elseif ( preg_match( '/post-[0-9]+/', $urltest['fragment'] ) ) { + // ...a post ID in the form 'post-###', + $post_ID = preg_replace( '/[^0-9]+/', '', $urltest['fragment'] ); + } elseif ( is_string( $urltest['fragment'] ) ) { + // ...or a string #title, a little more complicated. + $title = preg_replace( '/[^a-z0-9]/i', '.', $urltest['fragment'] ); + $sql = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s", $title ); + $post_ID = $wpdb->get_var( $sql ); + if ( ! $post_ID ) { + // Returning unknown error '0' is better than die()'ing. + return $this->pingback_error( 0, '' ); + } + } + } else { + // TODO: Attempt to extract a post ID from the given URL. + return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); + } + $post_ID = (int) $post_ID; + + $post = get_post( $post_ID ); + + if ( ! $post ) { // Post not found. + return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); + } + + if ( url_to_postid( $pagelinkedfrom ) == $post_ID ) { + return $this->pingback_error( 0, __( 'The source URL and the target URL cannot both point to the same resource.' ) ); + } + + // Check if pings are on. + if ( ! pings_open( $post ) ) { + return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); + } + + // Let's check that the remote site didn't already pingback this entry. + if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $post_ID, $pagelinkedfrom ) ) ) { + return $this->pingback_error( 48, __( 'The pingback has already been registered.' ) ); + } + + // Very stupid, but gives time to the 'from' server to publish! + sleep( 1 ); + + $remote_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $_SERVER['REMOTE_ADDR'] ); + + /** This filter is documented in wp-includes/class-http.php */ + $user_agent = apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ), $pagelinkedfrom ); + + // Let's check the remote site. + $http_api_args = array( + 'timeout' => 10, + 'redirection' => 0, + 'limit_response_size' => 153600, // 150 KB + 'user-agent' => "$user_agent; verifying pingback from $remote_ip", + 'headers' => array( + 'X-Pingback-Forwarded-For' => $remote_ip, + ), + ); + + $request = wp_safe_remote_get( $pagelinkedfrom, $http_api_args ); + $remote_source = wp_remote_retrieve_body( $request ); + $remote_source_original = $remote_source; + + if ( ! $remote_source ) { + return $this->pingback_error( 16, __( 'The source URL does not exist.' ) ); + } + + /** + * Filters the pingback remote source. + * + * @since 2.5.0 + * + * @param string $remote_source Response source for the page linked from. + * @param string $pagelinkedto URL of the page linked to. + */ + $remote_source = apply_filters( 'pre_remote_source', $remote_source, $pagelinkedto ); + + // Work around bug in strip_tags(): + $remote_source = str_replace( ']*>/', "\n\n", $remote_source ); + + preg_match( '|([^<]*?)|is', $remote_source, $matchtitle ); + $title = isset( $matchtitle[1] ) ? $matchtitle[1] : ''; + if ( empty( $title ) ) { + return $this->pingback_error( 32, __( 'We cannot find a title on that page.' ) ); + } + + // Remove all script and style tags including their content. + $remote_source = preg_replace( '@<(script|style)[^>]*?>.*?@si', '', $remote_source ); + // Just keep the tag we need. + $remote_source = strip_tags( $remote_source, '' ); + + $p = explode( "\n\n", $remote_source ); + + $preg_target = preg_quote( $pagelinkedto, '|' ); + + foreach ( $p as $para ) { + if ( strpos( $para, $pagelinkedto ) !== false ) { // It exists, but is it a link? + preg_match( '|]+?' . $preg_target . '[^>]*>([^>]+?)|', $para, $context ); + + // If the URL isn't in a link context, keep looking. + if ( empty( $context ) ) { + continue; + } + + // We're going to use this fake tag to mark the context in a bit. + // The marker is needed in case the link text appears more than once in the paragraph. + $excerpt = preg_replace( '|\|', '', $para ); + + // prevent really long link text + if ( strlen( $context[1] ) > 100 ) { + $context[1] = substr( $context[1], 0, 100 ) . '…'; + } + + $marker = '' . $context[1] . ''; // Set up our marker. + $excerpt = str_replace( $context[0], $marker, $excerpt ); // Swap out the link for our marker. + $excerpt = strip_tags( $excerpt, '' ); // Strip all tags but our context marker. + $excerpt = trim( $excerpt ); + $preg_marker = preg_quote( $marker, '|' ); + $excerpt = preg_replace( "|.*?\s(.{0,100}$preg_marker.{0,100})\s.*|s", '$1', $excerpt ); + $excerpt = strip_tags( $excerpt ); // YES, again, to remove the marker wrapper. + break; + } + } + + if ( empty( $context ) ) { // Link to target not found. + return $this->pingback_error( 17, __( 'The source URL does not contain a link to the target URL, and so cannot be used as a source.' ) ); + } + + $pagelinkedfrom = str_replace( '&', '&', $pagelinkedfrom ); + + $context = '[…] ' . esc_html( $excerpt ) . ' […]'; + $pagelinkedfrom = $this->escape( $pagelinkedfrom ); + + $comment_post_ID = (int) $post_ID; + $comment_author = $title; + $comment_author_email = ''; + $this->escape( $comment_author ); + $comment_author_url = $pagelinkedfrom; + $comment_content = $context; + $this->escape( $comment_content ); + $comment_type = 'pingback'; + + $commentdata = compact( + 'comment_post_ID', + 'comment_author', + 'comment_author_url', + 'comment_author_email', + 'comment_content', + 'comment_type', + 'remote_source', + 'remote_source_original' + ); + + $comment_ID = wp_new_comment( $commentdata ); + + if ( is_wp_error( $comment_ID ) ) { + return $this->pingback_error( 0, $comment_ID->get_error_message() ); + } + + /** + * Fires after a post pingback has been sent. + * + * @since 0.71 + * + * @param int $comment_ID Comment ID. + */ + do_action( 'pingback_post', $comment_ID ); + + /* translators: 1: URL of the page linked from, 2: URL of the page linked to. */ + return sprintf( __( 'Pingback from %1$s to %2$s registered. Keep the web talking! :-)' ), $pagelinkedfrom, $pagelinkedto ); + } + + /** + * Retrieve array of URLs that pingbacked the given URL. + * + * Specs on http://www.aquarionics.com/misc/archives/blogite/0198.html + * + * @since 1.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $url + * @return array|IXR_Error + */ + public function pingback_extensions_getPingbacks( $url ) { + global $wpdb; + + /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ + do_action( 'xmlrpc_call', 'pingback.extensions.getPingbacks' ); + + $url = $this->escape( $url ); + + $post_ID = url_to_postid( $url ); + if ( ! $post_ID ) { + // We aren't sure that the resource is available and/or pingback enabled. + return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); + } + + $actual_post = get_post( $post_ID, ARRAY_A ); + + if ( ! $actual_post ) { + // No such post = resource not found. + return $this->pingback_error( 32, __( 'The specified target URL does not exist.' ) ); + } + + $comments = $wpdb->get_results( $wpdb->prepare( "SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID ) ); + + if ( ! $comments ) { + return array(); + } + + $pingbacks = array(); + foreach ( $comments as $comment ) { + if ( 'pingback' == $comment->comment_type ) { + $pingbacks[] = $comment->comment_author_url; + } + } + + return $pingbacks; + } + + /** + * Sends a pingback error based on the given error code and message. + * + * @since 3.6.0 + * + * @param int $code Error code. + * @param string $message Error message. + * @return IXR_Error Error object. + */ + protected function pingback_error( $code, $message ) { + /** + * Filters the XML-RPC pingback error return. + * + * @since 3.5.1 + * + * @param IXR_Error $error An IXR_Error object containing the error code and message. + */ + return apply_filters( 'xmlrpc_pingback_error', new IXR_Error( $code, $message ) ); + } +} diff --git a/wp-includes/class-wp.php b/wp-includes/class-wp.php new file mode 100644 index 0000000..c2a6302 --- /dev/null +++ b/wp-includes/class-wp.php @@ -0,0 +1,754 @@ +public_query_vars ) ) { + $this->public_query_vars[] = $qv; + } + } + + /** + * Removes a query variable from a list of public query variables. + * + * @since 4.5.0 + * + * @param string $name Query variable name. + */ + public function remove_query_var( $name ) { + $this->public_query_vars = array_diff( $this->public_query_vars, array( $name ) ); + } + + /** + * Set the value of a query variable. + * + * @since 2.3.0 + * + * @param string $key Query variable name. + * @param mixed $value Query variable value. + */ + public function set_query_var( $key, $value ) { + $this->query_vars[ $key ] = $value; + } + + /** + * Parse request to find correct WordPress query. + * + * Sets up the query variables based on the request. There are also many + * filters and actions that can be used to further manipulate the result. + * + * @since 2.0.0 + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * + * @param array|string $extra_query_vars Set the extra query variables. + */ + public function parse_request( $extra_query_vars = '' ) { + global $wp_rewrite; + + /** + * Filters whether to parse the request. + * + * @since 3.5.0 + * + * @param bool $bool Whether or not to parse the request. Default true. + * @param WP $this Current WordPress environment instance. + * @param array|string $extra_query_vars Extra passed query variables. + */ + if ( ! apply_filters( 'do_parse_request', true, $this, $extra_query_vars ) ) { + return; + } + + $this->query_vars = array(); + $post_type_query_vars = array(); + + if ( is_array( $extra_query_vars ) ) { + $this->extra_query_vars = & $extra_query_vars; + } elseif ( ! empty( $extra_query_vars ) ) { + parse_str( $extra_query_vars, $this->extra_query_vars ); + } + // Process PATH_INFO, REQUEST_URI, and 404 for permalinks. + + // Fetch the rewrite rules. + $rewrite = $wp_rewrite->wp_rewrite_rules(); + + if ( ! empty( $rewrite ) ) { + // If we match a rewrite rule, this will be cleared. + $error = '404'; + $this->did_permalink = true; + + $pathinfo = isset( $_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : ''; + list( $pathinfo ) = explode( '?', $pathinfo ); + $pathinfo = str_replace( '%', '%25', $pathinfo ); + + list( $req_uri ) = explode( '?', $_SERVER['REQUEST_URI'] ); + $self = $_SERVER['PHP_SELF']; + $home_path = trim( parse_url( home_url(), PHP_URL_PATH ), '/' ); + $home_path_regex = sprintf( '|^%s|i', preg_quote( $home_path, '|' ) ); + + /* + * Trim path info from the end and the leading home path from the front. + * For path info requests, this leaves us with the requesting filename, if any. + * For 404 requests, this leaves us with the requested permalink. + */ + $req_uri = str_replace( $pathinfo, '', $req_uri ); + $req_uri = trim( $req_uri, '/' ); + $req_uri = preg_replace( $home_path_regex, '', $req_uri ); + $req_uri = trim( $req_uri, '/' ); + $pathinfo = trim( $pathinfo, '/' ); + $pathinfo = preg_replace( $home_path_regex, '', $pathinfo ); + $pathinfo = trim( $pathinfo, '/' ); + $self = trim( $self, '/' ); + $self = preg_replace( $home_path_regex, '', $self ); + $self = trim( $self, '/' ); + + // The requested permalink is in $pathinfo for path info requests and + // $req_uri for other requests. + if ( ! empty( $pathinfo ) && ! preg_match( '|^.*' . $wp_rewrite->index . '$|', $pathinfo ) ) { + $requested_path = $pathinfo; + } else { + // If the request uri is the index, blank it out so that we don't try to match it against a rule. + if ( $req_uri == $wp_rewrite->index ) { + $req_uri = ''; + } + $requested_path = $req_uri; + } + $requested_file = $req_uri; + + $this->request = $requested_path; + + // Look for matches. + $request_match = $requested_path; + if ( empty( $request_match ) ) { + // An empty request could only match against ^$ regex. + if ( isset( $rewrite['$'] ) ) { + $this->matched_rule = '$'; + $query = $rewrite['$']; + $matches = array( '' ); + } + } else { + foreach ( (array) $rewrite as $match => $query ) { + // If the requested file is the anchor of the match, prepend it to the path info. + if ( ! empty( $requested_file ) && strpos( $match, $requested_file ) === 0 && $requested_file != $requested_path ) { + $request_match = $requested_file . '/' . $requested_path; + } + + if ( preg_match( "#^$match#", $request_match, $matches ) || + preg_match( "#^$match#", urldecode( $request_match ), $matches ) ) { + + if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) { + // This is a verbose page match, let's check to be sure about it. + $page = get_page_by_path( $matches[ $varmatch[1] ] ); + if ( ! $page ) { + continue; + } + + $post_status_obj = get_post_status_object( $page->post_status ); + if ( ! $post_status_obj->public && ! $post_status_obj->protected + && ! $post_status_obj->private && $post_status_obj->exclude_from_search ) { + continue; + } + } + + // Got a match. + $this->matched_rule = $match; + break; + } + } + } + + if ( isset( $this->matched_rule ) ) { + // Trim the query of everything up to the '?'. + $query = preg_replace( '!^.+\?!', '', $query ); + + // Substitute the substring matches into the query. + $query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) ); + + $this->matched_query = $query; + + // Parse the query. + parse_str( $query, $perma_query_vars ); + + // If we're processing a 404 request, clear the error var since we found something. + if ( '404' == $error ) { + unset( $error, $_GET['error'] ); + } + } + + // If req_uri is empty or if it is a request for ourself, unset error. + if ( empty( $requested_path ) || $requested_file == $self || strpos( $_SERVER['PHP_SELF'], 'wp-admin/' ) !== false ) { + unset( $error, $_GET['error'] ); + + if ( isset( $perma_query_vars ) && strpos( $_SERVER['PHP_SELF'], 'wp-admin/' ) !== false ) { + unset( $perma_query_vars ); + } + + $this->did_permalink = false; + } + } + + /** + * Filters the query variables whitelist before processing. + * + * Allows (publicly allowed) query vars to be added, removed, or changed prior + * to executing the query. Needed to allow custom rewrite rules using your own arguments + * to work, or any other custom query variables you want to be publicly available. + * + * @since 1.5.0 + * + * @param string[] $public_query_vars The array of whitelisted query variable names. + */ + $this->public_query_vars = apply_filters( 'query_vars', $this->public_query_vars ); + + foreach ( get_post_types( array(), 'objects' ) as $post_type => $t ) { + if ( is_post_type_viewable( $t ) && $t->query_var ) { + $post_type_query_vars[ $t->query_var ] = $post_type; + } + } + + foreach ( $this->public_query_vars as $wpvar ) { + if ( isset( $this->extra_query_vars[ $wpvar ] ) ) { + $this->query_vars[ $wpvar ] = $this->extra_query_vars[ $wpvar ]; + } elseif ( isset( $_GET[ $wpvar ] ) && isset( $_POST[ $wpvar ] ) && $_GET[ $wpvar ] !== $_POST[ $wpvar ] ) { + wp_die( __( 'A variable mismatch has been detected.' ), __( 'Sorry, you are not allowed to view this item.' ), 400 ); + } elseif ( isset( $_POST[ $wpvar ] ) ) { + $this->query_vars[ $wpvar ] = $_POST[ $wpvar ]; + } elseif ( isset( $_GET[ $wpvar ] ) ) { + $this->query_vars[ $wpvar ] = $_GET[ $wpvar ]; + } elseif ( isset( $perma_query_vars[ $wpvar ] ) ) { + $this->query_vars[ $wpvar ] = $perma_query_vars[ $wpvar ]; + } + + if ( ! empty( $this->query_vars[ $wpvar ] ) ) { + if ( ! is_array( $this->query_vars[ $wpvar ] ) ) { + $this->query_vars[ $wpvar ] = (string) $this->query_vars[ $wpvar ]; + } else { + foreach ( $this->query_vars[ $wpvar ] as $vkey => $v ) { + if ( is_scalar( $v ) ) { + $this->query_vars[ $wpvar ][ $vkey ] = (string) $v; + } + } + } + + if ( isset( $post_type_query_vars[ $wpvar ] ) ) { + $this->query_vars['post_type'] = $post_type_query_vars[ $wpvar ]; + $this->query_vars['name'] = $this->query_vars[ $wpvar ]; + } + } + } + + // Convert urldecoded spaces back into '+'. + foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy => $t ) { + if ( $t->query_var && isset( $this->query_vars[ $t->query_var ] ) ) { + $this->query_vars[ $t->query_var ] = str_replace( ' ', '+', $this->query_vars[ $t->query_var ] ); + } + } + + // Don't allow non-publicly queryable taxonomies to be queried from the front end. + if ( ! is_admin() ) { + foreach ( get_taxonomies( array( 'publicly_queryable' => false ), 'objects' ) as $taxonomy => $t ) { + /* + * Disallow when set to the 'taxonomy' query var. + * Non-publicly queryable taxonomies cannot register custom query vars. See register_taxonomy(). + */ + if ( isset( $this->query_vars['taxonomy'] ) && $taxonomy === $this->query_vars['taxonomy'] ) { + unset( $this->query_vars['taxonomy'], $this->query_vars['term'] ); + } + } + } + + // Limit publicly queried post_types to those that are 'publicly_queryable'. + if ( isset( $this->query_vars['post_type'] ) ) { + $queryable_post_types = get_post_types( array( 'publicly_queryable' => true ) ); + if ( ! is_array( $this->query_vars['post_type'] ) ) { + if ( ! in_array( $this->query_vars['post_type'], $queryable_post_types ) ) { + unset( $this->query_vars['post_type'] ); + } + } else { + $this->query_vars['post_type'] = array_intersect( $this->query_vars['post_type'], $queryable_post_types ); + } + } + + // Resolve conflicts between posts with numeric slugs and date archive queries. + $this->query_vars = wp_resolve_numeric_slug_conflicts( $this->query_vars ); + + foreach ( (array) $this->private_query_vars as $var ) { + if ( isset( $this->extra_query_vars[ $var ] ) ) { + $this->query_vars[ $var ] = $this->extra_query_vars[ $var ]; + } + } + + if ( isset( $error ) ) { + $this->query_vars['error'] = $error; + } + + /** + * Filters the array of parsed query variables. + * + * @since 2.1.0 + * + * @param array $query_vars The array of requested query variables. + */ + $this->query_vars = apply_filters( 'request', $this->query_vars ); + + /** + * Fires once all query variables for the current request have been parsed. + * + * @since 2.1.0 + * + * @param WP $this Current WordPress environment instance (passed by reference). + */ + do_action_ref_array( 'parse_request', array( &$this ) ); + } + + /** + * Sends additional HTTP headers for caching, content type, etc. + * + * Sets the Content-Type header. Sets the 'error' status (if passed) and optionally exits. + * If showing a feed, it will also send Last-Modified, ETag, and 304 status if needed. + * + * @since 2.0.0 + * @since 4.4.0 `X-Pingback` header is added conditionally after posts have been queried in handle_404(). + */ + public function send_headers() { + $headers = array(); + $status = null; + $exit_required = false; + + if ( is_user_logged_in() ) { + $headers = array_merge( $headers, wp_get_nocache_headers() ); + } elseif ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) { + // Unmoderated comments are only visible for one minute via the moderation hash. + $headers['Expires'] = gmdate( 'D, d M Y H:i:s', time() + MINUTE_IN_SECONDS ); + $headers['Cache-Control'] = 'max-age=60, must-revalidate'; + } + if ( ! empty( $this->query_vars['error'] ) ) { + $status = (int) $this->query_vars['error']; + if ( 404 === $status ) { + if ( ! is_user_logged_in() ) { + $headers = array_merge( $headers, wp_get_nocache_headers() ); + } + $headers['Content-Type'] = get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ); + } elseif ( in_array( $status, array( 403, 500, 502, 503 ) ) ) { + $exit_required = true; + } + } elseif ( empty( $this->query_vars['feed'] ) ) { + $headers['Content-Type'] = get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ); + } else { + // Set the correct content type for feeds. + $type = $this->query_vars['feed']; + if ( 'feed' == $this->query_vars['feed'] ) { + $type = get_default_feed(); + } + $headers['Content-Type'] = feed_content_type( $type ) . '; charset=' . get_option( 'blog_charset' ); + + // We're showing a feed, so WP is indeed the only thing that last changed. + if ( ! empty( $this->query_vars['withcomments'] ) + || false !== strpos( $this->query_vars['feed'], 'comments-' ) + || ( empty( $this->query_vars['withoutcomments'] ) + && ( ! empty( $this->query_vars['p'] ) + || ! empty( $this->query_vars['name'] ) + || ! empty( $this->query_vars['page_id'] ) + || ! empty( $this->query_vars['pagename'] ) + || ! empty( $this->query_vars['attachment'] ) + || ! empty( $this->query_vars['attachment_id'] ) + ) + ) + ) { + $wp_last_modified = mysql2date( 'D, d M Y H:i:s', get_lastcommentmodified( 'GMT' ), false ); + } else { + $wp_last_modified = mysql2date( 'D, d M Y H:i:s', get_lastpostmodified( 'GMT' ), false ); + } + + if ( ! $wp_last_modified ) { + $wp_last_modified = gmdate( 'D, d M Y H:i:s' ); + } + + $wp_last_modified .= ' GMT'; + + $wp_etag = '"' . md5( $wp_last_modified ) . '"'; + $headers['Last-Modified'] = $wp_last_modified; + $headers['ETag'] = $wp_etag; + + // Support for conditional GET. + if ( isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ) { + $client_etag = wp_unslash( $_SERVER['HTTP_IF_NONE_MATCH'] ); + } else { + $client_etag = false; + } + + $client_last_modified = empty( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ? '' : trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ); + // If string is empty, return 0. If not, attempt to parse into a timestamp. + $client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0; + + // Make a timestamp for our most recent modification.. + $wp_modified_timestamp = strtotime( $wp_last_modified ); + + if ( ( $client_last_modified && $client_etag ) ? + ( ( $client_modified_timestamp >= $wp_modified_timestamp ) && ( $client_etag == $wp_etag ) ) : + ( ( $client_modified_timestamp >= $wp_modified_timestamp ) || ( $client_etag == $wp_etag ) ) ) { + $status = 304; + $exit_required = true; + } + } + + /** + * Filters the HTTP headers before they're sent to the browser. + * + * @since 2.8.0 + * + * @param string[] $headers Associative array of headers to be sent. + * @param WP $this Current WordPress environment instance. + */ + $headers = apply_filters( 'wp_headers', $headers, $this ); + + if ( ! empty( $status ) ) { + status_header( $status ); + } + + // If Last-Modified is set to false, it should not be sent (no-cache situation). + if ( isset( $headers['Last-Modified'] ) && false === $headers['Last-Modified'] ) { + unset( $headers['Last-Modified'] ); + + if ( ! headers_sent() ) { + header_remove( 'Last-Modified' ); + } + } + + if ( ! headers_sent() ) { + foreach ( (array) $headers as $name => $field_value ) { + header( "{$name}: {$field_value}" ); + } + } + + if ( $exit_required ) { + exit(); + } + + /** + * Fires once the requested HTTP headers for caching, content type, etc. have been sent. + * + * @since 2.1.0 + * + * @param WP $this Current WordPress environment instance (passed by reference). + */ + do_action_ref_array( 'send_headers', array( &$this ) ); + } + + /** + * Sets the query string property based off of the query variable property. + * + * The {@see 'query_string'} filter is deprecated, but still works. Plugins should + * use the {@see 'request'} filter instead. + * + * @since 2.0.0 + */ + public function build_query_string() { + $this->query_string = ''; + foreach ( (array) array_keys( $this->query_vars ) as $wpvar ) { + if ( '' != $this->query_vars[ $wpvar ] ) { + $this->query_string .= ( strlen( $this->query_string ) < 1 ) ? '' : '&'; + if ( ! is_scalar( $this->query_vars[ $wpvar ] ) ) { // Discard non-scalars. + continue; + } + $this->query_string .= $wpvar . '=' . rawurlencode( $this->query_vars[ $wpvar ] ); + } + } + + if ( has_filter( 'query_string' ) ) { // Don't bother filtering and parsing if no plugins are hooked in. + /** + * Filters the query string before parsing. + * + * @since 1.5.0 + * @deprecated 2.1.0 Use {@see 'query_vars'} or {@see 'request'} filters instead. + * + * @param string $query_string The query string to modify. + */ + $this->query_string = apply_filters_deprecated( + 'query_string', + array( $this->query_string ), + '2.1.0', + 'query_vars, request' + ); + parse_str( $this->query_string, $this->query_vars ); + } + } + + /** + * Set up the WordPress Globals. + * + * The query_vars property will be extracted to the GLOBALS. So care should + * be taken when naming global variables that might interfere with the + * WordPress environment. + * + * @since 2.0.0 + * + * @global WP_Query $wp_query WordPress Query object. + * @global string $query_string Query string for the loop. + * @global array $posts The found posts. + * @global WP_Post|null $post The current post, if available. + * @global string $request The SQL statement for the request. + * @global int $more Only set, if single page or post. + * @global int $single If single page or post. Only set, if single page or post. + * @global WP_User $authordata Only set, if author archive. + */ + public function register_globals() { + global $wp_query; + + // Extract updated query vars back into global namespace. + foreach ( (array) $wp_query->query_vars as $key => $value ) { + $GLOBALS[ $key ] = $value; + } + + $GLOBALS['query_string'] = $this->query_string; + $GLOBALS['posts'] = & $wp_query->posts; + $GLOBALS['post'] = isset( $wp_query->post ) ? $wp_query->post : null; + $GLOBALS['request'] = $wp_query->request; + + if ( $wp_query->is_single() || $wp_query->is_page() ) { + $GLOBALS['more'] = 1; + $GLOBALS['single'] = 1; + } + + if ( $wp_query->is_author() && isset( $wp_query->post ) ) { + $GLOBALS['authordata'] = get_userdata( $wp_query->post->post_author ); + } + } + + /** + * Set up the current user. + * + * @since 2.0.0 + */ + public function init() { + wp_get_current_user(); + } + + /** + * Set up the Loop based on the query variables. + * + * @since 2.0.0 + * + * @global WP_Query $wp_the_query WordPress Query object. + */ + public function query_posts() { + global $wp_the_query; + $this->build_query_string(); + $wp_the_query->query( $this->query_vars ); + } + + /** + * Set the Headers for 404, if nothing is found for requested URL. + * + * Issue a 404 if a request doesn't match any posts and doesn't match + * any object (e.g. an existing-but-empty category, tag, author) and a 404 was not already + * issued, and if the request was not a search or the homepage. + * + * Otherwise, issue a 200. + * + * This sets headers after posts have been queried. handle_404() really means "handle status." + * By inspecting the result of querying posts, seemingly successful requests can be switched to + * a 404 so that canonical redirection logic can kick in. + * + * @since 2.0.0 + * + * @global WP_Query $wp_query WordPress Query object. + */ + public function handle_404() { + global $wp_query; + + /** + * Filters whether to short-circuit default header status handling. + * + * Returning a non-false value from the filter will short-circuit the handling + * and return early. + * + * @since 4.5.0 + * + * @param bool $preempt Whether to short-circuit default header status handling. Default false. + * @param WP_Query $wp_query WordPress Query object. + */ + if ( false !== apply_filters( 'pre_handle_404', false, $wp_query ) ) { + return; + } + + // If we've already issued a 404, bail. + if ( is_404() ) { + return; + } + + // Never 404 for the admin, robots, favicon, or if we found posts. + if ( is_admin() || is_robots() || is_favicon() || $wp_query->posts ) { + + $success = true; + if ( is_singular() ) { + $p = false; + + if ( $wp_query->post instanceof WP_Post ) { + $p = clone $wp_query->post; + } + + // Only set X-Pingback for single posts that allow pings. + if ( $p && pings_open( $p ) && ! headers_sent() ) { + header( 'X-Pingback: ' . get_bloginfo( 'pingback_url', 'display' ) ); + } + + // Check for paged content that exceeds the max number of pages. + $next = ''; + if ( $p && false !== strpos( $p->post_content, $next ) && ! empty( $this->query_vars['page'] ) ) { + $page = trim( $this->query_vars['page'], '/' ); + $success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 ); + } + } + + if ( $success ) { + status_header( 200 ); + return; + } + } + + // We will 404 for paged queries, as no posts were found. + if ( ! is_paged() ) { + + // Don't 404 for authors without posts as long as they matched an author on this site. + $author = get_query_var( 'author' ); + if ( is_author() && is_numeric( $author ) && $author > 0 && is_user_member_of_blog( $author ) ) { + status_header( 200 ); + return; + } + + // Don't 404 for these queries if they matched an object. + if ( ( is_tag() || is_category() || is_tax() || is_post_type_archive() ) && get_queried_object() ) { + status_header( 200 ); + return; + } + + // Don't 404 for these queries either. + if ( is_home() || is_search() || is_feed() ) { + status_header( 200 ); + return; + } + } + + // Guess it's time to 404. + $wp_query->set_404(); + status_header( 404 ); + nocache_headers(); + } + + /** + * Sets up all of the variables required by the WordPress environment. + * + * The action {@see 'wp'} has one parameter that references the WP object. It + * allows for accessing the properties and methods to further manipulate the + * object. + * + * @since 2.0.0 + * + * @param string|array $query_args Passed to parse_request(). + */ + public function main( $query_args = '' ) { + $this->init(); + $this->parse_request( $query_args ); + $this->send_headers(); + $this->query_posts(); + $this->handle_404(); + $this->register_globals(); + + /** + * Fires once the WordPress environment has been set up. + * + * @since 2.1.0 + * + * @param WP $this Current WordPress environment instance (passed by reference). + */ + do_action_ref_array( 'wp', array( &$this ) ); + } +} diff --git a/wp-includes/class.wp-dependencies.php b/wp-includes/class.wp-dependencies.php new file mode 100644 index 0000000..313faa1 --- /dev/null +++ b/wp-includes/class.wp-dependencies.php @@ -0,0 +1,449 @@ +queue : (array) $handles; + $this->all_deps( $handles ); + + foreach ( $this->to_do as $key => $handle ) { + if ( ! in_array( $handle, $this->done, true ) && isset( $this->registered[ $handle ] ) ) { + /* + * Attempt to process the item. If successful, + * add the handle to the done array. + * + * Unset the item from the to_do array. + */ + if ( $this->do_item( $handle, $group ) ) { + $this->done[] = $handle; + } + + unset( $this->to_do[ $key ] ); + } + } + + return $this->done; + } + + /** + * Processes a dependency. + * + * @since 2.6.0 + * + * @param string $handle Name of the item. Should be unique. + * @return bool True on success, false if not set. + */ + public function do_item( $handle ) { + return isset( $this->registered[ $handle ] ); + } + + /** + * Determines dependencies. + * + * Recursively builds an array of items to process taking + * dependencies into account. Does NOT catch infinite loops. + * + * @since 2.1.0 + * @since 2.6.0 Moved from `WP_Scripts`. + * @since 2.8.0 Added the `$group` parameter. + * + * @param string|string[] $handles Item handle (string) or item handles (array of strings). + * @param bool $recursion Optional. Internal flag that function is calling itself. + * Default false. + * @param int|false $group Optional. Group level: level (int), no groups (false). + * Default false. + * @return bool True on success, false on failure. + */ + public function all_deps( $handles, $recursion = false, $group = false ) { + $handles = (array) $handles; + if ( ! $handles ) { + return false; + } + + foreach ( $handles as $handle ) { + $handle_parts = explode( '?', $handle ); + $handle = $handle_parts[0]; + $queued = in_array( $handle, $this->to_do, true ); + + if ( in_array( $handle, $this->done, true ) ) { // Already done. + continue; + } + + $moved = $this->set_group( $handle, $recursion, $group ); + $new_group = $this->groups[ $handle ]; + + if ( $queued && ! $moved ) { // Already queued and in the right group. + continue; + } + + $keep_going = true; + if ( ! isset( $this->registered[ $handle ] ) ) { + $keep_going = false; // Item doesn't exist. + } elseif ( $this->registered[ $handle ]->deps && array_diff( $this->registered[ $handle ]->deps, array_keys( $this->registered ) ) ) { + $keep_going = false; // Item requires dependencies that don't exist. + } elseif ( $this->registered[ $handle ]->deps && ! $this->all_deps( $this->registered[ $handle ]->deps, true, $new_group ) ) { + $keep_going = false; // Item requires dependencies that don't exist. + } + + if ( ! $keep_going ) { // Either item or its dependencies don't exist. + if ( $recursion ) { + return false; // Abort this branch. + } else { + continue; // We're at the top level. Move on to the next one. + } + } + + if ( $queued ) { // Already grabbed it and its dependencies. + continue; + } + + if ( isset( $handle_parts[1] ) ) { + $this->args[ $handle ] = $handle_parts[1]; + } + + $this->to_do[] = $handle; + } + + return true; + } + + /** + * Register an item. + * + * Registers the item if no item of that name already exists. + * + * @since 2.1.0 + * @since 2.6.0 Moved from `WP_Scripts`. + * + * @param string $handle Name of the item. Should be unique. + * @param string|bool $src Full URL of the item, or path of the item relative + * to the WordPress root directory. If source is set to false, + * item is an alias of other items it depends on. + * @param string[] $deps Optional. An array of registered item handles this item depends on. + * Default empty array. + * @param string|bool|null $ver Optional. String specifying item version number, if it has one, + * which is added to the URL as a query string for cache busting purposes. + * If version is set to false, a version number is automatically added + * equal to current installed WordPress version. + * If set to null, no version is added. + * @param mixed $args Optional. Custom property of the item. NOT the class property $args. + * Examples: $media, $in_footer. + * @return bool Whether the item has been registered. True on success, false on failure. + */ + public function add( $handle, $src, $deps = array(), $ver = false, $args = null ) { + if ( isset( $this->registered[ $handle ] ) ) { + return false; + } + $this->registered[ $handle ] = new _WP_Dependency( $handle, $src, $deps, $ver, $args ); + return true; + } + + /** + * Add extra item data. + * + * Adds data to a registered item. + * + * @since 2.6.0 + * + * @param string $handle Name of the item. Should be unique. + * @param string $key The data key. + * @param mixed $value The data value. + * @return bool True on success, false on failure. + */ + public function add_data( $handle, $key, $value ) { + if ( ! isset( $this->registered[ $handle ] ) ) { + return false; + } + + return $this->registered[ $handle ]->add_data( $key, $value ); + } + + /** + * Get extra item data. + * + * Gets data associated with a registered item. + * + * @since 3.3.0 + * + * @param string $handle Name of the item. Should be unique. + * @param string $key The data key. + * @return mixed Extra item data (string), false otherwise. + */ + public function get_data( $handle, $key ) { + if ( ! isset( $this->registered[ $handle ] ) ) { + return false; + } + + if ( ! isset( $this->registered[ $handle ]->extra[ $key ] ) ) { + return false; + } + + return $this->registered[ $handle ]->extra[ $key ]; + } + + /** + * Un-register an item or items. + * + * @since 2.1.0 + * @since 2.6.0 Moved from `WP_Scripts`. + * + * @param string|string[] $handles Item handle (string) or item handles (array of strings). + */ + public function remove( $handles ) { + foreach ( (array) $handles as $handle ) { + unset( $this->registered[ $handle ] ); + } + } + + /** + * Queue an item or items. + * + * Decodes handles and arguments, then queues handles and stores + * arguments in the class property $args. For example in extending + * classes, $args is appended to the item url as a query string. + * Note $args is NOT the $args property of items in the $registered array. + * + * @since 2.1.0 + * @since 2.6.0 Moved from `WP_Scripts`. + * + * @param string|string[] $handles Item handle (string) or item handles (array of strings). + */ + public function enqueue( $handles ) { + foreach ( (array) $handles as $handle ) { + $handle = explode( '?', $handle ); + + if ( ! in_array( $handle[0], $this->queue, true ) && isset( $this->registered[ $handle[0] ] ) ) { + $this->queue[] = $handle[0]; + + // Reset all dependencies so they must be recalculated in recurse_deps(). + $this->all_queued_deps = null; + + if ( isset( $handle[1] ) ) { + $this->args[ $handle[0] ] = $handle[1]; + } + } + } + } + + /** + * Dequeue an item or items. + * + * Decodes handles and arguments, then dequeues handles + * and removes arguments from the class property $args. + * + * @since 2.1.0 + * @since 2.6.0 Moved from `WP_Scripts`. + * + * @param string|string[] $handles Item handle (string) or item handles (array of strings). + */ + public function dequeue( $handles ) { + foreach ( (array) $handles as $handle ) { + $handle = explode( '?', $handle ); + $key = array_search( $handle[0], $this->queue, true ); + + if ( false !== $key ) { + // Reset all dependencies so they must be recalculated in recurse_deps(). + $this->all_queued_deps = null; + + unset( $this->queue[ $key ] ); + unset( $this->args[ $handle[0] ] ); + } + } + } + + /** + * Recursively search the passed dependency tree for $handle. + * + * @since 4.0.0 + * + * @param string[] $queue An array of queued _WP_Dependency handles. + * @param string $handle Name of the item. Should be unique. + * @return bool Whether the handle is found after recursively searching the dependency tree. + */ + protected function recurse_deps( $queue, $handle ) { + if ( isset( $this->all_queued_deps ) ) { + return isset( $this->all_queued_deps[ $handle ] ); + } + + $all_deps = array_fill_keys( $queue, true ); + $queues = array(); + $done = array(); + + while ( $queue ) { + foreach ( $queue as $queued ) { + if ( ! isset( $done[ $queued ] ) && isset( $this->registered[ $queued ] ) ) { + $deps = $this->registered[ $queued ]->deps; + if ( $deps ) { + $all_deps += array_fill_keys( $deps, true ); + array_push( $queues, $deps ); + } + $done[ $queued ] = true; + } + } + $queue = array_pop( $queues ); + } + + $this->all_queued_deps = $all_deps; + + return isset( $this->all_queued_deps[ $handle ] ); + } + + /** + * Query list for an item. + * + * @since 2.1.0 + * @since 2.6.0 Moved from `WP_Scripts`. + * + * @param string $handle Name of the item. Should be unique. + * @param string $list Optional. Property name of list array. Default 'registered'. + * @return bool|_WP_Dependency Found, or object Item data. + */ + public function query( $handle, $list = 'registered' ) { + switch ( $list ) { + case 'registered': + case 'scripts': // Back compat. + if ( isset( $this->registered[ $handle ] ) ) { + return $this->registered[ $handle ]; + } + return false; + + case 'enqueued': + case 'queue': + if ( in_array( $handle, $this->queue, true ) ) { + return true; + } + return $this->recurse_deps( $this->queue, $handle ); + + case 'to_do': + case 'to_print': // Back compat. + return in_array( $handle, $this->to_do, true ); + + case 'done': + case 'printed': // Back compat. + return in_array( $handle, $this->done, true ); + } + return false; + } + + /** + * Set item group, unless already in a lower group. + * + * @since 2.8.0 + * + * @param string $handle Name of the item. Should be unique. + * @param bool $recursion Internal flag that calling function was called recursively. + * @param int|false $group Group level: level (int), no groups (false). + * @return bool Not already in the group or a lower group. + */ + public function set_group( $handle, $recursion, $group ) { + $group = (int) $group; + + if ( isset( $this->groups[ $handle ] ) && $this->groups[ $handle ] <= $group ) { + return false; + } + + $this->groups[ $handle ] = $group; + + return true; + } + +} diff --git a/wp-includes/class.wp-scripts.php b/wp-includes/class.wp-scripts.php new file mode 100644 index 0000000..cc88455 --- /dev/null +++ b/wp-includes/class.wp-scripts.php @@ -0,0 +1,700 @@ +init(); + add_action( 'init', array( $this, 'init' ), 0 ); + } + + /** + * Initialize the class. + * + * @since 3.4.0 + */ + public function init() { + if ( + function_exists( 'is_admin' ) && ! is_admin() + && + function_exists( 'current_theme_supports' ) && ! current_theme_supports( 'html5', 'script' ) + ) { + $this->type_attr = " type='text/javascript'"; + } + + /** + * Fires when the WP_Scripts instance is initialized. + * + * @since 2.6.0 + * + * @param WP_Scripts $this WP_Scripts instance (passed by reference). + */ + do_action_ref_array( 'wp_default_scripts', array( &$this ) ); + } + + /** + * Prints scripts. + * + * Prints the scripts passed to it or the print queue. Also prints all necessary dependencies. + * + * @since 2.1.0 + * @since 2.8.0 Added the `$group` parameter. + * + * @param string|string[]|false $handles Optional. Scripts to be printed: queue (false), + * single script (string), or multiple scripts (array of strings). + * Default false. + * @param int|false $group Optional. Group level: level (int), no groups (false). + * Default false. + * @return string[] Handles of scripts that have been printed. + */ + public function print_scripts( $handles = false, $group = false ) { + return $this->do_items( $handles, $group ); + } + + /** + * Prints extra scripts of a registered script. + * + * @since 2.1.0 + * @since 2.8.0 Added the `$echo` parameter. + * @deprecated 3.3.0 + * + * @see print_extra_script() + * + * @param string $handle The script's registered handle. + * @param bool $echo Optional. Whether to echo the extra script + * instead of just returning it. Default true. + * @return bool|string|void Void if no data exists, extra scripts if `$echo` is true, + * true otherwise. + */ + public function print_scripts_l10n( $handle, $echo = true ) { + _deprecated_function( __FUNCTION__, '3.3.0', 'WP_Scripts::print_extra_script()' ); + return $this->print_extra_script( $handle, $echo ); + } + + /** + * Prints extra scripts of a registered script. + * + * @since 3.3.0 + * + * @param string $handle The script's registered handle. + * @param bool $echo Optional. Whether to echo the extra script + * instead of just returning it. Default true. + * @return bool|string|void Void if no data exists, extra scripts if `$echo` is true, + * true otherwise. + */ + public function print_extra_script( $handle, $echo = true ) { + $output = $this->get_data( $handle, 'data' ); + if ( ! $output ) { + return; + } + + if ( ! $echo ) { + return $output; + } + + echo "type_attr}>\n"; + + // CDATA is not needed for HTML 5. + if ( $this->type_attr ) { + echo "/* type_attr ) { + echo "/* ]]> */\n"; + } + + echo "\n"; + + return true; + } + + /** + * Processes a script dependency. + * + * @since 2.6.0 + * @since 2.8.0 Added the `$group` parameter. + * + * @see WP_Dependencies::do_item() + * + * @param string $handle The script's registered handle. + * @param int|false $group Optional. Group level: level (int), no groups (false). + * Default false. + * @return bool True on success, false on failure. + */ + public function do_item( $handle, $group = false ) { + if ( ! parent::do_item( $handle ) ) { + return false; + } + + if ( 0 === $group && $this->groups[ $handle ] > 0 ) { + $this->in_footer[] = $handle; + return false; + } + + if ( false === $group && in_array( $handle, $this->in_footer, true ) ) { + $this->in_footer = array_diff( $this->in_footer, (array) $handle ); + } + + $obj = $this->registered[ $handle ]; + + if ( null === $obj->ver ) { + $ver = ''; + } else { + $ver = $obj->ver ? $obj->ver : $this->default_version; + } + + if ( isset( $this->args[ $handle ] ) ) { + $ver = $ver ? $ver . '&' . $this->args[ $handle ] : $this->args[ $handle ]; + } + + $src = $obj->src; + $cond_before = ''; + $cond_after = ''; + $conditional = isset( $obj->extra['conditional'] ) ? $obj->extra['conditional'] : ''; + + if ( $conditional ) { + $cond_before = "\n"; + } + + $before_handle = $this->print_inline_script( $handle, 'before', false ); + $after_handle = $this->print_inline_script( $handle, 'after', false ); + + if ( $before_handle ) { + $before_handle = sprintf( "\n%s\n\n", $this->type_attr, $before_handle ); + } + + if ( $after_handle ) { + $after_handle = sprintf( "\n%s\n\n", $this->type_attr, $after_handle ); + } + + if ( $before_handle || $after_handle ) { + $inline_script_tag = $cond_before . $before_handle . $after_handle . $cond_after; + } else { + $inline_script_tag = ''; + } + + if ( $this->do_concat ) { + /** + * Filters the script loader source. + * + * @since 2.2.0 + * + * @param string $src Script loader source path. + * @param string $handle Script handle. + */ + $srce = apply_filters( 'script_loader_src', $src, $handle ); + + if ( $this->in_default_dir( $srce ) && ( $before_handle || $after_handle ) ) { + $this->do_concat = false; + + // Have to print the so-far concatenated scripts right away to maintain the right order. + _print_scripts(); + $this->reset(); + } elseif ( $this->in_default_dir( $srce ) && ! $conditional ) { + $this->print_code .= $this->print_extra_script( $handle, false ); + $this->concat .= "$handle,"; + $this->concat_version .= "$handle$ver"; + return true; + } else { + $this->ext_handles .= "$handle,"; + $this->ext_version .= "$handle$ver"; + } + } + + $has_conditional_data = $conditional && $this->get_data( $handle, 'data' ); + + if ( $has_conditional_data ) { + echo $cond_before; + } + + $this->print_extra_script( $handle ); + + if ( $has_conditional_data ) { + echo $cond_after; + } + + // A single item may alias a set of items, by having dependencies, but no source. + if ( ! $src ) { + if ( $inline_script_tag ) { + if ( $this->do_concat ) { + $this->print_html .= $inline_script_tag; + } else { + echo $inline_script_tag; + } + } + + return true; + } + + $translations = $this->print_translations( $handle, false ); + if ( $translations ) { + $translations = sprintf( "\n%s\n\n", $this->type_attr, $translations ); + } + + if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && 0 === strpos( $src, $this->content_url ) ) ) { + $src = $this->base_url . $src; + } + + if ( ! empty( $ver ) ) { + $src = add_query_arg( 'ver', $ver, $src ); + } + + /** This filter is documented in wp-includes/class.wp-scripts.php */ + $src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) ); + + if ( ! $src ) { + return true; + } + + $tag = $translations . $cond_before . $before_handle; + $tag .= sprintf( "\n", $this->type_attr, $src ); + $tag .= $after_handle . $cond_after; + + /** + * Filters the HTML script tag of an enqueued script. + * + * @since 4.1.0 + * + * @param string $tag The `\n", $this->type_attr, $output ); + } + + return $output; + } + + /** + * Localizes a script, only if the script has already been added. + * + * @since 2.1.0 + * + * @param string $handle Name of the script to attach data to. + * @param string $object_name Name of the variable that will contain the data. + * @param array $l10n Array of data to localize. + * @return bool True on success, false on failure. + */ + public function localize( $handle, $object_name, $l10n ) { + if ( 'jquery' === $handle ) { + $handle = 'jquery-core'; + } + + if ( is_array( $l10n ) && isset( $l10n['l10n_print_after'] ) ) { // back compat, preserve the code in 'l10n_print_after' if present. + $after = $l10n['l10n_print_after']; + unset( $l10n['l10n_print_after'] ); + } + + foreach ( (array) $l10n as $key => $value ) { + if ( ! is_scalar( $value ) ) { + continue; + } + + $l10n[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' ); + } + + $script = "var $object_name = " . wp_json_encode( $l10n ) . ';'; + + if ( ! empty( $after ) ) { + $script .= "\n$after;"; + } + + $data = $this->get_data( $handle, 'data' ); + + if ( ! empty( $data ) ) { + $script = "$data\n$script"; + } + + return $this->add_data( $handle, 'data', $script ); + } + + /** + * Sets handle group. + * + * @since 2.8.0 + * + * @see WP_Dependencies::set_group() + * + * @param string $handle Name of the item. Should be unique. + * @param bool $recursion Internal flag that calling function was called recursively. + * @param int|false $group Optional. Group level: level (int), no groups (false). + * Default false. + * @return bool Not already in the group or a lower group. + */ + public function set_group( $handle, $recursion, $group = false ) { + if ( isset( $this->registered[ $handle ]->args ) && 1 === $this->registered[ $handle ]->args ) { + $grp = 1; + } else { + $grp = (int) $this->get_data( $handle, 'group' ); + } + + if ( false !== $group && $grp > $group ) { + $grp = $group; + } + + return parent::set_group( $handle, $recursion, $grp ); + } + + /** + * Sets a translation textdomain. + * + * @since 5.0.0 + * @since 5.1.0 The `$domain` parameter was made optional. + * + * @param string $handle Name of the script to register a translation domain to. + * @param string $domain Optional. Text domain. Default 'default'. + * @param string $path Optional. The full file path to the directory containing translation files. + * @return bool True if the text domain was registered, false if not. + */ + public function set_translations( $handle, $domain = 'default', $path = null ) { + if ( ! isset( $this->registered[ $handle ] ) ) { + return false; + } + + /** @var \_WP_Dependency $obj */ + $obj = $this->registered[ $handle ]; + + if ( ! in_array( 'wp-i18n', $obj->deps, true ) ) { + $obj->deps[] = 'wp-i18n'; + } + + return $obj->set_translations( $domain, $path ); + } + + /** + * Prints translations set for a specific handle. + * + * @since 5.0.0 + * + * @param string $handle Name of the script to add the inline script to. + * Must be lowercase. + * @param bool $echo Optional. Whether to echo the script + * instead of just returning it. Default true. + * @return string|false Script on success, false otherwise. + */ + public function print_translations( $handle, $echo = true ) { + if ( ! isset( $this->registered[ $handle ] ) || empty( $this->registered[ $handle ]->textdomain ) ) { + return false; + } + + $domain = $this->registered[ $handle ]->textdomain; + $path = $this->registered[ $handle ]->translations_path; + + $json_translations = load_script_textdomain( $handle, $domain, $path ); + + if ( ! $json_translations ) { + // Register empty locale data object to ensure the domain still exists. + $json_translations = '{ "locale_data": { "messages": { "": {} } } }'; + } + + $output = <<\n%s\n\n", $this->type_attr, $output ); + } + + return $output; + } + + /** + * Determines script dependencies. + * + * @since 2.1.0 + * + * @see WP_Dependencies::all_deps() + * + * @param string|string[] $handles Item handle (string) or item handles (array of strings). + * @param bool $recursion Optional. Internal flag that function is calling itself. + * Default false. + * @param int|false $group Optional. Group level: level (int), no groups (false). + * Default false. + * @return bool True on success, false on failure. + */ + public function all_deps( $handles, $recursion = false, $group = false ) { + $r = parent::all_deps( $handles, $recursion, $group ); + if ( ! $recursion ) { + /** + * Filters the list of script dependencies left to print. + * + * @since 2.3.0 + * + * @param string[] $to_do An array of script dependency handles. + */ + $this->to_do = apply_filters( 'print_scripts_array', $this->to_do ); + } + return $r; + } + + /** + * Processes items and dependencies for the head group. + * + * @since 2.8.0 + * + * @see WP_Dependencies::do_items() + * + * @return string[] Handles of items that have been processed. + */ + public function do_head_items() { + $this->do_items( false, 0 ); + return $this->done; + } + + /** + * Processes items and dependencies for the footer group. + * + * @since 2.8.0 + * + * @see WP_Dependencies::do_items() + * + * @return string[] Handles of items that have been processed. + */ + public function do_footer_items() { + $this->do_items( false, 1 ); + return $this->done; + } + + /** + * Whether a handle's source is in a default directory. + * + * @since 2.8.0 + * + * @param string $src The source of the enqueued script. + * @return bool True if found, false if not. + */ + public function in_default_dir( $src ) { + if ( ! $this->default_dirs ) { + return true; + } + + if ( 0 === strpos( $src, '/' . WPINC . '/js/l10n' ) ) { + return false; + } + + foreach ( (array) $this->default_dirs as $test ) { + if ( 0 === strpos( $src, $test ) ) { + return true; + } + } + return false; + } + + /** + * Resets class properties. + * + * @since 2.8.0 + */ + public function reset() { + $this->do_concat = false; + $this->print_code = ''; + $this->concat = ''; + $this->concat_version = ''; + $this->print_html = ''; + $this->ext_version = ''; + $this->ext_handles = ''; + } +} diff --git a/wp-includes/class.wp-styles.php b/wp-includes/class.wp-styles.php new file mode 100644 index 0000000..a84efb2 --- /dev/null +++ b/wp-includes/class.wp-styles.php @@ -0,0 +1,461 @@ +type_attr = " type='text/css'"; + } + + /** + * Fires when the WP_Styles instance is initialized. + * + * @since 2.6.0 + * + * @param WP_Styles $this WP_Styles instance (passed by reference). + */ + do_action_ref_array( 'wp_default_styles', array( &$this ) ); + } + + /** + * Processes a style dependency. + * + * @since 2.6.0 + * + * @see WP_Dependencies::do_item() + * + * @param string $handle The style's registered handle. + * @return bool True on success, false on failure. + */ + public function do_item( $handle ) { + if ( ! parent::do_item( $handle ) ) { + return false; + } + + $obj = $this->registered[ $handle ]; + + if ( null === $obj->ver ) { + $ver = ''; + } else { + $ver = $obj->ver ? $obj->ver : $this->default_version; + } + + if ( isset( $this->args[ $handle ] ) ) { + $ver = $ver ? $ver . '&' . $this->args[ $handle ] : $this->args[ $handle ]; + } + + $src = $obj->src; + $cond_before = ''; + $cond_after = ''; + $conditional = isset( $obj->extra['conditional'] ) ? $obj->extra['conditional'] : ''; + + if ( $conditional ) { + $cond_before = "\n"; + } + + $inline_style = $this->print_inline_style( $handle, false ); + + if ( $inline_style ) { + $inline_style_tag = sprintf( + "\n", + esc_attr( $handle ), + $this->type_attr, + $inline_style + ); + } else { + $inline_style_tag = ''; + } + + if ( $this->do_concat ) { + if ( $this->in_default_dir( $src ) && ! $conditional && ! isset( $obj->extra['alt'] ) ) { + $this->concat .= "$handle,"; + $this->concat_version .= "$handle$ver"; + + $this->print_code .= $inline_style; + + return true; + } + } + + if ( isset( $obj->args ) ) { + $media = esc_attr( $obj->args ); + } else { + $media = 'all'; + } + + // A single item may alias a set of items, by having dependencies, but no source. + if ( ! $src ) { + if ( $inline_style_tag ) { + if ( $this->do_concat ) { + $this->print_html .= $inline_style_tag; + } else { + echo $inline_style_tag; + } + } + + return true; + } + + $href = $this->_css_href( $src, $ver, $handle ); + if ( ! $href ) { + return true; + } + + $rel = isset( $obj->extra['alt'] ) && $obj->extra['alt'] ? 'alternate stylesheet' : 'stylesheet'; + $title = isset( $obj->extra['title'] ) ? sprintf( "title='%s'", esc_attr( $obj->extra['title'] ) ) : ''; + + $tag = sprintf( + "\n", + $rel, + $handle, + $title, + $href, + $this->type_attr, + $media + ); + + /** + * Filters the HTML link tag of an enqueued style. + * + * @since 2.6.0 + * @since 4.3.0 Introduced the `$href` parameter. + * @since 4.5.0 Introduced the `$media` parameter. + * + * @param string $html The link tag for the enqueued style. + * @param string $handle The style's registered handle. + * @param string $href The stylesheet's source URL. + * @param string $media The stylesheet's media attribute. + */ + $tag = apply_filters( 'style_loader_tag', $tag, $handle, $href, $media ); + + if ( 'rtl' === $this->text_direction && isset( $obj->extra['rtl'] ) && $obj->extra['rtl'] ) { + if ( is_bool( $obj->extra['rtl'] ) || 'replace' === $obj->extra['rtl'] ) { + $suffix = isset( $obj->extra['suffix'] ) ? $obj->extra['suffix'] : ''; + $rtl_href = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $this->_css_href( $src, $ver, "$handle-rtl" ) ); + } else { + $rtl_href = $this->_css_href( $obj->extra['rtl'], $ver, "$handle-rtl" ); + } + + $rtl_tag = sprintf( + "\n", + $rel, + $handle, + $title, + $rtl_href, + $this->type_attr, + $media + ); + + /** This filter is documented in wp-includes/class.wp-styles.php */ + $rtl_tag = apply_filters( 'style_loader_tag', $rtl_tag, $handle, $rtl_href, $media ); + + if ( 'replace' === $obj->extra['rtl'] ) { + $tag = $rtl_tag; + } else { + $tag .= $rtl_tag; + } + } + + if ( $this->do_concat ) { + $this->print_html .= $cond_before; + $this->print_html .= $tag; + if ( $inline_style_tag ) { + $this->print_html .= $inline_style_tag; + } + $this->print_html .= $cond_after; + } else { + echo $cond_before; + echo $tag; + $this->print_inline_style( $handle ); + echo $cond_after; + } + + return true; + } + + /** + * Adds extra CSS styles to a registered stylesheet. + * + * @since 3.3.0 + * + * @param string $handle The style's registered handle. + * @param string $code String containing the CSS styles to be added. + * @return bool True on success, false on failure. + */ + public function add_inline_style( $handle, $code ) { + if ( ! $code ) { + return false; + } + + $after = $this->get_data( $handle, 'after' ); + if ( ! $after ) { + $after = array(); + } + + $after[] = $code; + + return $this->add_data( $handle, 'after', $after ); + } + + /** + * Prints extra CSS styles of a registered stylesheet. + * + * @since 3.3.0 + * + * @param string $handle The style's registered handle. + * @param bool $echo Optional. Whether to echo the inline style + * instead of just returning it. Default true. + * @return string|bool False if no data exists, inline styles if `$echo` is true, + * true otherwise. + */ + public function print_inline_style( $handle, $echo = true ) { + $output = $this->get_data( $handle, 'after' ); + + if ( empty( $output ) ) { + return false; + } + + $output = implode( "\n", $output ); + + if ( ! $echo ) { + return $output; + } + + printf( + "\n", + esc_attr( $handle ), + $this->type_attr, + $output + ); + + return true; + } + + /** + * Determines style dependencies. + * + * @since 2.6.0 + * + * @see WP_Dependencies::all_deps() + * + * @param string|string[] $handles Item handle (string) or item handles (array of strings). + * @param bool $recursion Optional. Internal flag that function is calling itself. + * Default false. + * @param int|false $group Optional. Group level: level (int), no groups (false). + * Default false. + * @return bool True on success, false on failure. + */ + public function all_deps( $handles, $recursion = false, $group = false ) { + $r = parent::all_deps( $handles, $recursion, $group ); + if ( ! $recursion ) { + /** + * Filters the array of enqueued styles before processing for output. + * + * @since 2.6.0 + * + * @param string[] $to_do The list of enqueued style handles about to be processed. + */ + $this->to_do = apply_filters( 'print_styles_array', $this->to_do ); + } + return $r; + } + + /** + * Generates an enqueued style's fully-qualified URL. + * + * @since 2.6.0 + * + * @param string $src The source of the enqueued style. + * @param string $ver The version of the enqueued style. + * @param string $handle The style's registered handle. + * @return string Style's fully-qualified URL. + */ + public function _css_href( $src, $ver, $handle ) { + if ( ! is_bool( $src ) && ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && 0 === strpos( $src, $this->content_url ) ) ) { + $src = $this->base_url . $src; + } + + if ( ! empty( $ver ) ) { + $src = add_query_arg( 'ver', $ver, $src ); + } + + /** + * Filters an enqueued style's fully-qualified URL. + * + * @since 2.6.0 + * + * @param string $src The source URL of the enqueued style. + * @param string $handle The style's registered handle. + */ + $src = apply_filters( 'style_loader_src', $src, $handle ); + return esc_url( $src ); + } + + /** + * Whether a handle's source is in a default directory. + * + * @since 2.8.0 + * + * @param string $src The source of the enqueued style. + * @return bool True if found, false if not. + */ + public function in_default_dir( $src ) { + if ( ! $this->default_dirs ) { + return true; + } + + foreach ( (array) $this->default_dirs as $test ) { + if ( 0 === strpos( $src, $test ) ) { + return true; + } + } + return false; + } + + /** + * Processes items and dependencies for the footer group. + * + * HTML 5 allows styles in the body, grab late enqueued items and output them in the footer. + * + * @since 3.3.0 + * + * @see WP_Dependencies::do_items() + * + * @return string[] Handles of items that have been processed. + */ + public function do_footer_items() { + $this->do_items( false, 1 ); + return $this->done; + } + + /** + * Resets class properties. + * + * @since 3.3.0 + */ + public function reset() { + $this->do_concat = false; + $this->concat = ''; + $this->concat_version = ''; + $this->print_html = ''; + } +} diff --git a/wp-includes/comment-template.php b/wp-includes/comment-template.php new file mode 100644 index 0000000..5cd34cc --- /dev/null +++ b/wp-includes/comment-template.php @@ -0,0 +1,2678 @@ +comment_author ) ) { + $user = $comment->user_id ? get_userdata( $comment->user_id ) : false; + if ( $user ) { + $author = $user->display_name; + } else { + $author = __( 'Anonymous' ); + } + } else { + $author = $comment->comment_author; + } + + /** + * Filters the returned comment author name. + * + * @since 1.5.0 + * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. + * + * @param string $author The comment author's username. + * @param int $comment_ID The comment ID. + * @param WP_Comment $comment The comment object. + */ + return apply_filters( 'get_comment_author', $author, $comment->comment_ID, $comment ); +} + +/** + * Displays the author of the current comment. + * + * @since 0.71 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author. + * Default current comment. + */ +function comment_author( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + $author = get_comment_author( $comment ); + + /** + * Filters the comment author's name for display. + * + * @since 1.2.0 + * @since 4.1.0 The `$comment_ID` parameter was added. + * + * @param string $author The comment author's username. + * @param int $comment_ID The comment ID. + */ + echo apply_filters( 'comment_author', $author, $comment->comment_ID ); +} + +/** + * Retrieves the email of the author of the current comment. + * + * @since 1.5.0 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's email. + * Default current comment. + * @return string The current comment author's email + */ +function get_comment_author_email( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + + /** + * Filters the comment author's returned email address. + * + * @since 1.5.0 + * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. + * + * @param string $comment_author_email The comment author's email address. + * @param int $comment_ID The comment ID. + * @param WP_Comment $comment The comment object. + */ + return apply_filters( 'get_comment_author_email', $comment->comment_author_email, $comment->comment_ID, $comment ); +} + +/** + * Displays the email of the author of the current global $comment. + * + * Care should be taken to protect the email address and assure that email + * harvesters do not capture your commenter's email address. Most assume that + * their email address will not appear in raw form on the site. Doing so will + * enable anyone, including those that people don't want to get the email + * address and use it for their own means good and bad. + * + * @since 0.71 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's email. + * Default current comment. + */ +function comment_author_email( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + $author_email = get_comment_author_email( $comment ); + + /** + * Filters the comment author's email for display. + * + * @since 1.2.0 + * @since 4.1.0 The `$comment_ID` parameter was added. + * + * @param string $author_email The comment author's email address. + * @param int $comment_ID The comment ID. + */ + echo apply_filters( 'author_email', $author_email, $comment->comment_ID ); +} + +/** + * Displays the HTML email link to the author of the current comment. + * + * Care should be taken to protect the email address and assure that email + * harvesters do not capture your commenter's email address. Most assume that + * their email address will not appear in raw form on the site. Doing so will + * enable anyone, including those that people don't want to get the email + * address and use it for their own means good and bad. + * + * @since 0.71 + * @since 4.6.0 Added the `$comment` parameter. + * + * @param string $linktext Optional. Text to display instead of the comment author's email address. + * Default empty. + * @param string $before Optional. Text or HTML to display before the email link. Default empty. + * @param string $after Optional. Text or HTML to display after the email link. Default empty. + * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. Default is the current comment. + */ +function comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) { + $link = get_comment_author_email_link( $linktext, $before, $after, $comment ); + if ( $link ) { + echo $link; + } +} + +/** + * Returns the HTML email link to the author of the current comment. + * + * Care should be taken to protect the email address and assure that email + * harvesters do not capture your commenter's email address. Most assume that + * their email address will not appear in raw form on the site. Doing so will + * enable anyone, including those that people don't want to get the email + * address and use it for their own means good and bad. + * + * @since 2.7.0 + * @since 4.6.0 Added the `$comment` parameter. + * + * @param string $linktext Optional. Text to display instead of the comment author's email address. + * Default empty. + * @param string $before Optional. Text or HTML to display before the email link. Default empty. + * @param string $after Optional. Text or HTML to display after the email link. Default empty. + * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. Default is the current comment. + * @return string HTML markup for the comment author email link. By default, the email address is obfuscated + * via the {@see 'comment_email'} filter with antispambot(). + */ +function get_comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) { + $comment = get_comment( $comment ); + + /** + * Filters the comment author's email for display. + * + * Care should be taken to protect the email address and assure that email + * harvesters do not capture your commenter's email address. + * + * @since 1.2.0 + * @since 4.1.0 The `$comment` parameter was added. + * + * @param string $comment_author_email The comment author's email address. + * @param WP_Comment $comment The comment object. + */ + $email = apply_filters( 'comment_email', $comment->comment_author_email, $comment ); + + if ( ( ! empty( $email ) ) && ( '@' !== $email ) ) { + $display = ( '' != $linktext ) ? $linktext : $email; + $return = $before; + $return .= sprintf( '%2$s', esc_url( 'mailto:' . $email ), esc_html( $display ) ); + $return .= $after; + return $return; + } else { + return ''; + } +} + +/** + * Retrieves the HTML link to the URL of the author of the current comment. + * + * Both get_comment_author_url() and get_comment_author() rely on get_comment(), + * which falls back to the global comment variable if the $comment_ID argument is empty. + * + * @since 1.5.0 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's link. + * Default current comment. + * @return string The comment author name or HTML link for author's URL. + */ +function get_comment_author_link( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + $url = get_comment_author_url( $comment ); + $author = get_comment_author( $comment ); + + if ( empty( $url ) || 'http://' == $url ) { + $return = $author; + } else { + $return = "$author"; + } + + /** + * Filters the comment author's link for display. + * + * @since 1.5.0 + * @since 4.1.0 The `$author` and `$comment_ID` parameters were added. + * + * @param string $return The HTML-formatted comment author link. + * Empty for an invalid URL. + * @param string $author The comment author's username. + * @param int $comment_ID The comment ID. + */ + return apply_filters( 'get_comment_author_link', $return, $author, $comment->comment_ID ); +} + +/** + * Displays the HTML link to the URL of the author of the current comment. + * + * @since 0.71 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's link. + * Default current comment. + */ +function comment_author_link( $comment_ID = 0 ) { + echo get_comment_author_link( $comment_ID ); +} + +/** + * Retrieve the IP address of the author of the current comment. + * + * @since 1.5.0 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's IP address. + * Default current comment. + * @return string Comment author's IP address. + */ +function get_comment_author_IP( $comment_ID = 0 ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + $comment = get_comment( $comment_ID ); + + /** + * Filters the comment author's returned IP address. + * + * @since 1.5.0 + * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. + * + * @param string $comment_author_IP The comment author's IP address. + * @param int $comment_ID The comment ID. + * @param WP_Comment $comment The comment object. + */ + return apply_filters( 'get_comment_author_IP', $comment->comment_author_IP, $comment->comment_ID, $comment ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase +} + +/** + * Displays the IP address of the author of the current comment. + * + * @since 0.71 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's IP address. + * Default current comment. + */ +function comment_author_IP( $comment_ID = 0 ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + echo esc_html( get_comment_author_IP( $comment_ID ) ); +} + +/** + * Retrieves the URL of the author of the current comment, not linked. + * + * @since 1.5.0 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's URL. + * Default current comment. + * @return string Comment author URL, if provided, an empty string otherwise. + */ +function get_comment_author_url( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + $url = ''; + $id = 0; + if ( ! empty( $comment ) ) { + $author_url = ( 'http://' == $comment->comment_author_url ) ? '' : $comment->comment_author_url; + $url = esc_url( $author_url, array( 'http', 'https' ) ); + $id = $comment->comment_ID; + } + + /** + * Filters the comment author's URL. + * + * @since 1.5.0 + * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. + * + * @param string $url The comment author's URL. + * @param int $comment_ID The comment ID. + * @param WP_Comment $comment The comment object. + */ + return apply_filters( 'get_comment_author_url', $url, $id, $comment ); +} + +/** + * Displays the URL of the author of the current comment, not linked. + * + * @since 0.71 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's URL. + * Default current comment. + */ +function comment_author_url( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + $author_url = get_comment_author_url( $comment ); + + /** + * Filters the comment author's URL for display. + * + * @since 1.2.0 + * @since 4.1.0 The `$comment_ID` parameter was added. + * + * @param string $author_url The comment author's URL. + * @param int $comment_ID The comment ID. + */ + echo apply_filters( 'comment_url', $author_url, $comment->comment_ID ); +} + +/** + * Retrieves the HTML link of the URL of the author of the current comment. + * + * $linktext parameter is only used if the URL does not exist for the comment + * author. If the URL does exist then the URL will be used and the $linktext + * will be ignored. + * + * Encapsulate the HTML link between the $before and $after. So it will appear + * in the order of $before, link, and finally $after. + * + * @since 1.5.0 + * @since 4.6.0 Added the `$comment` parameter. + * + * @param string $linktext Optional. The text to display instead of the comment + * author's email address. Default empty. + * @param string $before Optional. The text or HTML to display before the email link. + * Default empty. + * @param string $after Optional. The text or HTML to display after the email link. + * Default empty. + * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. + * Default is the current comment. + * @return string The HTML link between the $before and $after parameters. + */ +function get_comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) { + $url = get_comment_author_url( $comment ); + $display = ( '' != $linktext ) ? $linktext : $url; + $display = str_replace( 'http://www.', '', $display ); + $display = str_replace( 'http://', '', $display ); + + if ( '/' == substr( $display, -1 ) ) { + $display = substr( $display, 0, -1 ); + } + + $return = "$before$display$after"; + + /** + * Filters the comment author's returned URL link. + * + * @since 1.5.0 + * + * @param string $return The HTML-formatted comment author URL link. + */ + return apply_filters( 'get_comment_author_url_link', $return ); +} + +/** + * Displays the HTML link of the URL of the author of the current comment. + * + * @since 0.71 + * @since 4.6.0 Added the `$comment` parameter. + * + * @param string $linktext Optional. Text to display instead of the comment author's + * email address. Default empty. + * @param string $before Optional. Text or HTML to display before the email link. + * Default empty. + * @param string $after Optional. Text or HTML to display after the email link. + * Default empty. + * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. + * Default is the current comment. + */ +function comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) { + echo get_comment_author_url_link( $linktext, $before, $after, $comment ); +} + +/** + * Generates semantic classes for each comment element. + * + * @since 2.7.0 + * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. + * + * @param string|array $class Optional. One or more classes to add to the class list. + * Default empty. + * @param int|WP_Comment $comment Comment ID or WP_Comment object. Default current comment. + * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. + * @param bool $echo Optional. Whether to echo or return the output. + * Default true. + * @return void|string Void if `$echo` argument is true, comment classes if `$echo` is false. + */ +function comment_class( $class = '', $comment = null, $post_id = null, $echo = true ) { + // Separates classes with a single space, collates classes for comment DIV. + $class = 'class="' . join( ' ', get_comment_class( $class, $comment, $post_id ) ) . '"'; + + if ( $echo ) { + echo $class; + } else { + return $class; + } +} + +/** + * Returns the classes for the comment div as an array. + * + * @since 2.7.0 + * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object. + * + * @global int $comment_alt + * @global int $comment_depth + * @global int $comment_thread_alt + * + * @param string|array $class Optional. One or more classes to add to the class list. Default empty. + * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. Default current comment. + * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. + * @return string[] An array of classes. + */ +function get_comment_class( $class = '', $comment_id = null, $post_id = null ) { + global $comment_alt, $comment_depth, $comment_thread_alt; + + $classes = array(); + + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + return $classes; + } + + // Get the comment type (comment, trackback). + $classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type; + + // Add classes for comment authors that are registered users. + $user = $comment->user_id ? get_userdata( $comment->user_id ) : false; + if ( $user ) { + $classes[] = 'byuser'; + $classes[] = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id ); + // For comment authors who are the author of the post. + $post = get_post( $post_id ); + if ( $post ) { + if ( $comment->user_id === $post->post_author ) { + $classes[] = 'bypostauthor'; + } + } + } + + if ( empty( $comment_alt ) ) { + $comment_alt = 0; + } + if ( empty( $comment_depth ) ) { + $comment_depth = 1; + } + if ( empty( $comment_thread_alt ) ) { + $comment_thread_alt = 0; + } + + if ( $comment_alt % 2 ) { + $classes[] = 'odd'; + $classes[] = 'alt'; + } else { + $classes[] = 'even'; + } + + $comment_alt++; + + // Alt for top-level comments. + if ( 1 == $comment_depth ) { + if ( $comment_thread_alt % 2 ) { + $classes[] = 'thread-odd'; + $classes[] = 'thread-alt'; + } else { + $classes[] = 'thread-even'; + } + $comment_thread_alt++; + } + + $classes[] = "depth-$comment_depth"; + + if ( ! empty( $class ) ) { + if ( ! is_array( $class ) ) { + $class = preg_split( '#\s+#', $class ); + } + $classes = array_merge( $classes, $class ); + } + + $classes = array_map( 'esc_attr', $classes ); + + /** + * Filters the returned CSS classes for the current comment. + * + * @since 2.7.0 + * + * @param string[] $classes An array of comment classes. + * @param string $class A comma-separated list of additional classes added to the list. + * @param int $comment_id The comment id. + * @param WP_Comment $comment The comment object. + * @param int|WP_Post $post_id The post ID or WP_Post object. + */ + return apply_filters( 'comment_class', $classes, $class, $comment->comment_ID, $comment, $post_id ); +} + +/** + * Retrieves the comment date of the current comment. + * + * @since 1.5.0 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param string $format Optional. The format of the date. Default user's setting. + * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to get the date. + * Default current comment. + * @return string The comment's date. + */ +function get_comment_date( $format = '', $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + if ( '' == $format ) { + $date = mysql2date( get_option( 'date_format' ), $comment->comment_date ); + } else { + $date = mysql2date( $format, $comment->comment_date ); + } + /** + * Filters the returned comment date. + * + * @since 1.5.0 + * + * @param string|int $date Formatted date string or Unix timestamp. + * @param string $format The format of the date. + * @param WP_Comment $comment The comment object. + */ + return apply_filters( 'get_comment_date', $date, $format, $comment ); +} + +/** + * Displays the comment date of the current comment. + * + * @since 0.71 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param string $format Optional. The format of the date. Default user's settings. + * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the date. + * Default current comment. + */ +function comment_date( $format = '', $comment_ID = 0 ) { + echo get_comment_date( $format, $comment_ID ); +} + +/** + * Retrieves the excerpt of the given comment. + * + * Returns a maximum of 20 words with an ellipsis appended if necessary. + * + * @since 1.5.0 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to get the excerpt. + * Default current comment. + * @return string The possibly truncated comment excerpt. + */ +function get_comment_excerpt( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + + if ( ! post_password_required( $comment->comment_post_ID ) ) { + $comment_text = strip_tags( str_replace( array( "\n", "\r" ), ' ', $comment->comment_content ) ); + } else { + $comment_text = __( 'Password protected' ); + } + + /* translators: Maximum number of words used in a comment excerpt. */ + $comment_excerpt_length = intval( _x( '20', 'comment_excerpt_length' ) ); + + /** + * Filters the maximum number of words used in the comment excerpt. + * + * @since 4.4.0 + * + * @param int $comment_excerpt_length The amount of words you want to display in the comment excerpt. + */ + $comment_excerpt_length = apply_filters( 'comment_excerpt_length', $comment_excerpt_length ); + + $excerpt = wp_trim_words( $comment_text, $comment_excerpt_length, '…' ); + + /** + * Filters the retrieved comment excerpt. + * + * @since 1.5.0 + * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. + * + * @param string $excerpt The comment excerpt text. + * @param int $comment_ID The comment ID. + * @param WP_Comment $comment The comment object. + */ + return apply_filters( 'get_comment_excerpt', $excerpt, $comment->comment_ID, $comment ); +} + +/** + * Displays the excerpt of the current comment. + * + * @since 1.2.0 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the excerpt. + * Default current comment. + */ +function comment_excerpt( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + $comment_excerpt = get_comment_excerpt( $comment ); + + /** + * Filters the comment excerpt for display. + * + * @since 1.2.0 + * @since 4.1.0 The `$comment_ID` parameter was added. + * + * @param string $comment_excerpt The comment excerpt text. + * @param int $comment_ID The comment ID. + */ + echo apply_filters( 'comment_excerpt', $comment_excerpt, $comment->comment_ID ); +} + +/** + * Retrieves the comment id of the current comment. + * + * @since 1.5.0 + * + * @return int The comment ID. + */ +function get_comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + $comment = get_comment(); + + /** + * Filters the returned comment ID. + * + * @since 1.5.0 + * @since 4.1.0 The `$comment_ID` parameter was added. + * + * @param int $comment_ID The current comment ID. + * @param WP_Comment $comment The comment object. + */ + return apply_filters( 'get_comment_ID', $comment->comment_ID, $comment ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase +} + +/** + * Displays the comment id of the current comment. + * + * @since 0.71 + */ +function comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + echo get_comment_ID(); +} + +/** + * Retrieves the link to a given comment. + * + * @since 1.5.0 + * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. Added `$cpage` argument. + * + * @see get_page_of_comment() + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * @global bool $in_comment_loop + * + * @param WP_Comment|int|null $comment Comment to retrieve. Default current comment. + * @param array $args { + * An array of optional arguments to override the defaults. + * + * @type string $type Passed to get_page_of_comment(). + * @type int $page Current page of comments, for calculating comment pagination. + * @type int $per_page Per-page value for comment pagination. + * @type int $max_depth Passed to get_page_of_comment(). + * @type int|string $cpage Value to use for the comment's "comment-page" or "cpage" value. + * If provided, this value overrides any value calculated from `$page` + * and `$per_page`. + * } + * @return string The permalink to the given comment. + */ +function get_comment_link( $comment = null, $args = array() ) { + global $wp_rewrite, $in_comment_loop; + + $comment = get_comment( $comment ); + + // Back-compat. + if ( ! is_array( $args ) ) { + $args = array( 'page' => $args ); + } + + $defaults = array( + 'type' => 'all', + 'page' => '', + 'per_page' => '', + 'max_depth' => '', + 'cpage' => null, + ); + $args = wp_parse_args( $args, $defaults ); + + $link = get_permalink( $comment->comment_post_ID ); + + // The 'cpage' param takes precedence. + if ( ! is_null( $args['cpage'] ) ) { + $cpage = $args['cpage']; + + // No 'cpage' is provided, so we calculate one. + } else { + if ( '' === $args['per_page'] && get_option( 'page_comments' ) ) { + $args['per_page'] = get_option( 'comments_per_page' ); + } + + if ( empty( $args['per_page'] ) ) { + $args['per_page'] = 0; + $args['page'] = 0; + } + + $cpage = $args['page']; + + if ( '' == $cpage ) { + if ( ! empty( $in_comment_loop ) ) { + $cpage = get_query_var( 'cpage' ); + } else { + // Requires a database hit, so we only do it when we can't figure out from context. + $cpage = get_page_of_comment( $comment->comment_ID, $args ); + } + } + + /* + * If the default page displays the oldest comments, the permalinks for comments on the default page + * do not need a 'cpage' query var. + */ + if ( 'oldest' === get_option( 'default_comments_page' ) && 1 === $cpage ) { + $cpage = ''; + } + } + + if ( $cpage && get_option( 'page_comments' ) ) { + if ( $wp_rewrite->using_permalinks() ) { + if ( $cpage ) { + $link = trailingslashit( $link ) . $wp_rewrite->comments_pagination_base . '-' . $cpage; + } + + $link = user_trailingslashit( $link, 'comment' ); + } elseif ( $cpage ) { + $link = add_query_arg( 'cpage', $cpage, $link ); + } + } + + if ( $wp_rewrite->using_permalinks() ) { + $link = user_trailingslashit( $link, 'comment' ); + } + + $link = $link . '#comment-' . $comment->comment_ID; + + /** + * Filters the returned single comment permalink. + * + * @since 2.8.0 + * @since 4.4.0 Added the `$cpage` parameter. + * + * @see get_page_of_comment() + * + * @param string $link The comment permalink with '#comment-$id' appended. + * @param WP_Comment $comment The current comment object. + * @param array $args An array of arguments to override the defaults. + * @param int $cpage The calculated 'cpage' value. + */ + return apply_filters( 'get_comment_link', $link, $comment, $args, $cpage ); +} + +/** + * Retrieves the link to the current post comments. + * + * @since 1.5.0 + * + * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post. + * @return string The link to the comments. + */ +function get_comments_link( $post_id = 0 ) { + $hash = get_comments_number( $post_id ) ? '#comments' : '#respond'; + $comments_link = get_permalink( $post_id ) . $hash; + + /** + * Filters the returned post comments permalink. + * + * @since 3.6.0 + * + * @param string $comments_link Post comments permalink with '#comments' appended. + * @param int|WP_Post $post_id Post ID or WP_Post object. + */ + return apply_filters( 'get_comments_link', $comments_link, $post_id ); +} + +/** + * Displays the link to the current post comments. + * + * @since 0.71 + * + * @param string $deprecated Not Used. + * @param string $deprecated_2 Not Used. + */ +function comments_link( $deprecated = '', $deprecated_2 = '' ) { + if ( ! empty( $deprecated ) ) { + _deprecated_argument( __FUNCTION__, '0.72' ); + } + if ( ! empty( $deprecated_2 ) ) { + _deprecated_argument( __FUNCTION__, '1.3.0' ); + } + echo esc_url( get_comments_link() ); +} + +/** + * Retrieves the amount of comments a post has. + * + * @since 1.5.0 + * + * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is the global `$post`. + * @return string|int If the post exists, a numeric string representing the number of comments + * the post has, otherwise 0. + */ +function get_comments_number( $post_id = 0 ) { + $post = get_post( $post_id ); + + if ( ! $post ) { + $count = 0; + } else { + $count = $post->comment_count; + $post_id = $post->ID; + } + + /** + * Filters the returned comment count for a post. + * + * @since 1.5.0 + * + * @param string|int $count A string representing the number of comments a post has, otherwise 0. + * @param int $post_id Post ID. + */ + return apply_filters( 'get_comments_number', $count, $post_id ); +} + +/** + * Displays the language string for the number of comments the current post has. + * + * @since 0.71 + * @since 5.4.0 The `$deprecated` parameter was changed to `$post_id`. + * + * @param string $zero Optional. Text for no comments. Default false. + * @param string $one Optional. Text for one comment. Default false. + * @param string $more Optional. Text for more than one comment. Default false. + * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is the global `$post`. + */ +function comments_number( $zero = false, $one = false, $more = false, $post_id = 0 ) { + echo get_comments_number_text( $zero, $one, $more, $post_id ); +} + +/** + * Displays the language string for the number of comments the current post has. + * + * @since 4.0.0 + * @since 5.4.0 Added the `$post_id` parameter to allow using the function outside of the loop. + * + * @param string $zero Optional. Text for no comments. Default false. + * @param string $one Optional. Text for one comment. Default false. + * @param string $more Optional. Text for more than one comment. Default false. + * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is the global `$post`. + * @return string Language string for the number of comments a post has. + */ +function get_comments_number_text( $zero = false, $one = false, $more = false, $post_id = 0 ) { + $number = get_comments_number( $post_id ); + + if ( $number > 1 ) { + if ( false === $more ) { + /* translators: %s: Number of comments. */ + $output = sprintf( _n( '%s Comment', '%s Comments', $number ), number_format_i18n( $number ) ); + } else { + // % Comments + /* + * translators: If comment number in your language requires declension, + * translate this to 'on'. Do not translate into your own language. + */ + if ( 'on' === _x( 'off', 'Comment number declension: on or off' ) ) { + $text = preg_replace( '#.+?#', '', $more ); + $text = preg_replace( '/&.+?;/', '', $text ); // Kill entities. + $text = trim( strip_tags( $text ), '% ' ); + + // Replace '% Comments' with a proper plural form. + if ( $text && ! preg_match( '/[0-9]+/', $text ) && false !== strpos( $more, '%' ) ) { + /* translators: %s: Number of comments. */ + $new_text = _n( '%s Comment', '%s Comments', $number ); + $new_text = trim( sprintf( $new_text, '' ) ); + + $more = str_replace( $text, $new_text, $more ); + if ( false === strpos( $more, '%' ) ) { + $more = '% ' . $more; + } + } + } + + $output = str_replace( '%', number_format_i18n( $number ), $more ); + } + } elseif ( 0 == $number ) { + $output = ( false === $zero ) ? __( 'No Comments' ) : $zero; + } else { // Must be one. + $output = ( false === $one ) ? __( '1 Comment' ) : $one; + } + /** + * Filters the comments count for display. + * + * @since 1.5.0 + * + * @see _n() + * + * @param string $output A translatable string formatted based on whether the count + * is equal to 0, 1, or 1+. + * @param int $number The number of post comments. + */ + return apply_filters( 'comments_number', $output, $number ); +} + +/** + * Retrieves the text of the current comment. + * + * @since 1.5.0 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * @since 5.4.0 Added 'In reply to %s.' prefix to child comments in comments feed. + * + * @see Walker_Comment::comment() + * + * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to get the text. + * Default current comment. + * @param array $args Optional. An array of arguments. Default empty array. + * @return string The comment content. + */ +function get_comment_text( $comment_ID = 0, $args = array() ) { + $comment = get_comment( $comment_ID ); + + $comment_content = $comment->comment_content; + + if ( is_comment_feed() && $comment->comment_parent ) { + $parent = get_comment( $comment->comment_parent ); + if ( $parent ) { + $parent_link = esc_url( get_comment_link( $parent ) ); + $name = get_comment_author( $parent ); + + $comment_content = sprintf( + /* translators: %s: Comment link. */ + ent2ncr( __( 'In reply to %s.' ) ), + '' . $name . '' + ) . "\n\n" . $comment_content; + } + } + + /** + * Filters the text of a comment. + * + * @since 1.5.0 + * + * @see Walker_Comment::comment() + * + * @param string $comment_content Text of the comment. + * @param WP_Comment $comment The comment object. + * @param array $args An array of arguments. + */ + return apply_filters( 'get_comment_text', $comment_content, $comment, $args ); +} + +/** + * Displays the text of the current comment. + * + * @since 0.71 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @see Walker_Comment::comment() + * + * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the text. + * Default current comment. + * @param array $args Optional. An array of arguments. Default empty array. + */ +function comment_text( $comment_ID = 0, $args = array() ) { + $comment = get_comment( $comment_ID ); + + $comment_text = get_comment_text( $comment, $args ); + /** + * Filters the text of a comment to be displayed. + * + * @since 1.2.0 + * + * @see Walker_Comment::comment() + * + * @param string $comment_text Text of the current comment. + * @param WP_Comment|null $comment The comment object. Null if not found. + * @param array $args An array of arguments. + */ + echo apply_filters( 'comment_text', $comment_text, $comment, $args ); +} + +/** + * Retrieves the comment time of the current comment. + * + * @since 1.5.0 + * + * @param string $format Optional. The format of the time. Default user's settings. + * @param bool $gmt Optional. Whether to use the GMT date. Default false. + * @param bool $translate Optional. Whether to translate the time (for use in feeds). + * Default true. + * @return string The formatted time. + */ +function get_comment_time( $format = '', $gmt = false, $translate = true ) { + $comment = get_comment(); + + $comment_date = $gmt ? $comment->comment_date_gmt : $comment->comment_date; + if ( '' == $format ) { + $date = mysql2date( get_option( 'time_format' ), $comment_date, $translate ); + } else { + $date = mysql2date( $format, $comment_date, $translate ); + } + + /** + * Filters the returned comment time. + * + * @since 1.5.0 + * + * @param string|int $date The comment time, formatted as a date string or Unix timestamp. + * @param string $format Date format. + * @param bool $gmt Whether the GMT date is in use. + * @param bool $translate Whether the time is translated. + * @param WP_Comment $comment The comment object. + */ + return apply_filters( 'get_comment_time', $date, $format, $gmt, $translate, $comment ); +} + +/** + * Displays the comment time of the current comment. + * + * @since 0.71 + * + * @param string $format Optional. The format of the time. Default user's settings. + */ +function comment_time( $format = '' ) { + echo get_comment_time( $format ); +} + +/** + * Retrieves the comment type of the current comment. + * + * @since 1.5.0 + * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. + * + * @param int|WP_Comment $comment_ID Optional. WP_Comment or ID of the comment for which to get the type. + * Default current comment. + * @return string The comment type. + */ +function get_comment_type( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + if ( '' == $comment->comment_type ) { + $comment->comment_type = 'comment'; + } + + /** + * Filters the returned comment type. + * + * @since 1.5.0 + * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. + * + * @param string $comment_type The type of comment, such as 'comment', 'pingback', or 'trackback'. + * @param int $comment_ID The comment ID. + * @param WP_Comment $comment The comment object. + */ + return apply_filters( 'get_comment_type', $comment->comment_type, $comment->comment_ID, $comment ); +} + +/** + * Displays the comment type of the current comment. + * + * @since 0.71 + * + * @param string $commenttxt Optional. String to display for comment type. Default false. + * @param string $trackbacktxt Optional. String to display for trackback type. Default false. + * @param string $pingbacktxt Optional. String to display for pingback type. Default false. + */ +function comment_type( $commenttxt = false, $trackbacktxt = false, $pingbacktxt = false ) { + if ( false === $commenttxt ) { + $commenttxt = _x( 'Comment', 'noun' ); + } + if ( false === $trackbacktxt ) { + $trackbacktxt = __( 'Trackback' ); + } + if ( false === $pingbacktxt ) { + $pingbacktxt = __( 'Pingback' ); + } + $type = get_comment_type(); + switch ( $type ) { + case 'trackback': + echo $trackbacktxt; + break; + case 'pingback': + echo $pingbacktxt; + break; + default: + echo $commenttxt; + } +} + +/** + * Retrieves the current post's trackback URL. + * + * There is a check to see if permalink's have been enabled and if so, will + * retrieve the pretty path. If permalinks weren't enabled, the ID of the + * current post is used and appended to the correct page to go to. + * + * @since 1.5.0 + * + * @return string The trackback URL after being filtered. + */ +function get_trackback_url() { + if ( '' != get_option( 'permalink_structure' ) ) { + $tb_url = trailingslashit( get_permalink() ) . user_trailingslashit( 'trackback', 'single_trackback' ); + } else { + $tb_url = get_option( 'siteurl' ) . '/wp-trackback.php?p=' . get_the_ID(); + } + + /** + * Filters the returned trackback URL. + * + * @since 2.2.0 + * + * @param string $tb_url The trackback URL. + */ + return apply_filters( 'trackback_url', $tb_url ); +} + +/** + * Displays the current post's trackback URL. + * + * @since 0.71 + * + * @param bool $deprecated_echo Not used. + * @return void|string Should only be used to echo the trackback URL, use get_trackback_url() + * for the result instead. + */ +function trackback_url( $deprecated_echo = true ) { + if ( true !== $deprecated_echo ) { + _deprecated_argument( + __FUNCTION__, + '2.5.0', + sprintf( + /* translators: %s: get_trackback_url() */ + __( 'Use %s instead if you do not want the value echoed.' ), + 'get_trackback_url()' + ) + ); + } + + if ( $deprecated_echo ) { + echo get_trackback_url(); + } else { + return get_trackback_url(); + } +} + +/** + * Generates and displays the RDF for the trackback information of current post. + * + * Deprecated in 3.0.0, and restored in 3.0.1. + * + * @since 0.71 + * + * @param int $deprecated Not used (Was $timezone = 0). + */ +function trackback_rdf( $deprecated = '' ) { + if ( ! empty( $deprecated ) ) { + _deprecated_argument( __FUNCTION__, '2.5.0' ); + } + + if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && false !== stripos( $_SERVER['HTTP_USER_AGENT'], 'W3C_Validator' ) ) { + return; + } + + echo ' + \n"; + echo ''; +} + +/** + * Determines whether the current post is open for comments. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 1.5.0 + * + * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. + * @return bool True if the comments are open. + */ +function comments_open( $post_id = null ) { + + $_post = get_post( $post_id ); + + $post_id = $_post ? $_post->ID : 0; + $open = ( 'open' == $_post->comment_status ); + + /** + * Filters whether the current post is open for comments. + * + * @since 2.5.0 + * + * @param bool $open Whether the current post is open for comments. + * @param int $post_id The post ID. + */ + return apply_filters( 'comments_open', $open, $post_id ); +} + +/** + * Determines whether the current post is open for pings. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 1.5.0 + * + * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. + * @return bool True if pings are accepted + */ +function pings_open( $post_id = null ) { + + $_post = get_post( $post_id ); + + $post_id = $_post ? $_post->ID : 0; + $open = ( 'open' == $_post->ping_status ); + + /** + * Filters whether the current post is open for pings. + * + * @since 2.5.0 + * + * @param bool $open Whether the current post is open for pings. + * @param int $post_id The post ID. + */ + return apply_filters( 'pings_open', $open, $post_id ); +} + +/** + * Displays form token for unfiltered comments. + * + * Will only display nonce token if the current user has permissions for + * unfiltered html. Won't display the token for other users. + * + * The function was backported to 2.0.10 and was added to versions 2.1.3 and + * above. Does not exist in versions prior to 2.0.10 in the 2.0 branch and in + * the 2.1 branch, prior to 2.1.3. Technically added in 2.2.0. + * + * Backported to 2.0.10. + * + * @since 2.1.3 + */ +function wp_comment_form_unfiltered_html_nonce() { + $post = get_post(); + $post_id = $post ? $post->ID : 0; + + if ( current_user_can( 'unfiltered_html' ) ) { + wp_nonce_field( 'unfiltered-html-comment_' . $post_id, '_wp_unfiltered_html_comment_disabled', false ); + echo "\n"; + } +} + +/** + * Loads the comment template specified in $file. + * + * Will not display the comments template if not on single post or page, or if + * the post does not have comments. + * + * Uses the WordPress database object to query for the comments. The comments + * are passed through the {@see 'comments_array'} filter hook with the list of comments + * and the post ID respectively. + * + * The `$file` path is passed through a filter hook called {@see 'comments_template'}, + * which includes the TEMPLATEPATH and $file combined. Tries the $filtered path + * first and if it fails it will require the default comment template from the + * default theme. If either does not exist, then the WordPress process will be + * halted. It is advised for that reason, that the default theme is not deleted. + * + * Will not try to get the comments if the post has none. + * + * @since 1.5.0 + * + * @global WP_Query $wp_query WordPress Query object. + * @global WP_Post $post Global post object. + * @global wpdb $wpdb WordPress database abstraction object. + * @global int $id + * @global WP_Comment $comment Global comment object. + * @global string $user_login + * @global int $user_ID + * @global string $user_identity + * @global bool $overridden_cpage + * @global bool $withcomments + * + * @param string $file Optional. The file to load. Default '/comments.php'. + * @param bool $separate_comments Optional. Whether to separate the comments by comment type. + * Default false. + */ +function comments_template( $file = '/comments.php', $separate_comments = false ) { + global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_ID, $user_identity, $overridden_cpage; + + if ( ! ( is_single() || is_page() || $withcomments ) || empty( $post ) ) { + return; + } + + if ( empty( $file ) ) { + $file = '/comments.php'; + } + + $req = get_option( 'require_name_email' ); + + /* + * Comment author information fetched from the comment cookies. + */ + $commenter = wp_get_current_commenter(); + + /* + * The name of the current comment author escaped for use in attributes. + * Escaped by sanitize_comment_cookies(). + */ + $comment_author = $commenter['comment_author']; + + /* + * The email address of the current comment author escaped for use in attributes. + * Escaped by sanitize_comment_cookies(). + */ + $comment_author_email = $commenter['comment_author_email']; + + /* + * The URL of the current comment author escaped for use in attributes. + */ + $comment_author_url = esc_url( $commenter['comment_author_url'] ); + + $comment_args = array( + 'orderby' => 'comment_date_gmt', + 'order' => 'ASC', + 'status' => 'approve', + 'post_id' => $post->ID, + 'no_found_rows' => false, + 'update_comment_meta_cache' => false, // We lazy-load comment meta for performance. + ); + + if ( get_option( 'thread_comments' ) ) { + $comment_args['hierarchical'] = 'threaded'; + } else { + $comment_args['hierarchical'] = false; + } + + if ( $user_ID ) { + $comment_args['include_unapproved'] = array( $user_ID ); + } else { + $unapproved_email = wp_get_unapproved_comment_author_email(); + + if ( $unapproved_email ) { + $comment_args['include_unapproved'] = array( $unapproved_email ); + } + } + + $per_page = 0; + if ( get_option( 'page_comments' ) ) { + $per_page = (int) get_query_var( 'comments_per_page' ); + if ( 0 === $per_page ) { + $per_page = (int) get_option( 'comments_per_page' ); + } + + $comment_args['number'] = $per_page; + $page = (int) get_query_var( 'cpage' ); + + if ( $page ) { + $comment_args['offset'] = ( $page - 1 ) * $per_page; + } elseif ( 'oldest' === get_option( 'default_comments_page' ) ) { + $comment_args['offset'] = 0; + } else { + // If fetching the first page of 'newest', we need a top-level comment count. + $top_level_query = new WP_Comment_Query(); + $top_level_args = array( + 'count' => true, + 'orderby' => false, + 'post_id' => $post->ID, + 'status' => 'approve', + ); + + if ( $comment_args['hierarchical'] ) { + $top_level_args['parent'] = 0; + } + + if ( isset( $comment_args['include_unapproved'] ) ) { + $top_level_args['include_unapproved'] = $comment_args['include_unapproved']; + } + + $top_level_count = $top_level_query->query( $top_level_args ); + + $comment_args['offset'] = ( ceil( $top_level_count / $per_page ) - 1 ) * $per_page; + } + } + + /** + * Filters the arguments used to query comments in comments_template(). + * + * @since 4.5.0 + * + * @see WP_Comment_Query::__construct() + * + * @param array $comment_args { + * Array of WP_Comment_Query arguments. + * + * @type string|array $orderby Field(s) to order by. + * @type string $order Order of results. Accepts 'ASC' or 'DESC'. + * @type string $status Comment status. + * @type array $include_unapproved Array of IDs or email addresses whose unapproved comments + * will be included in results. + * @type int $post_id ID of the post. + * @type bool $no_found_rows Whether to refrain from querying for found rows. + * @type bool $update_comment_meta_cache Whether to prime cache for comment meta. + * @type bool|string $hierarchical Whether to query for comments hierarchically. + * @type int $offset Comment offset. + * @type int $number Number of comments to fetch. + * } + */ + $comment_args = apply_filters( 'comments_template_query_args', $comment_args ); + $comment_query = new WP_Comment_Query( $comment_args ); + $_comments = $comment_query->comments; + + // Trees must be flattened before they're passed to the walker. + if ( $comment_args['hierarchical'] ) { + $comments_flat = array(); + foreach ( $_comments as $_comment ) { + $comments_flat[] = $_comment; + $comment_children = $_comment->get_children( + array( + 'format' => 'flat', + 'status' => $comment_args['status'], + 'orderby' => $comment_args['orderby'], + ) + ); + + foreach ( $comment_children as $comment_child ) { + $comments_flat[] = $comment_child; + } + } + } else { + $comments_flat = $_comments; + } + + /** + * Filters the comments array. + * + * @since 2.1.0 + * + * @param array $comments Array of comments supplied to the comments template. + * @param int $post_ID Post ID. + */ + $wp_query->comments = apply_filters( 'comments_array', $comments_flat, $post->ID ); + + $comments = &$wp_query->comments; + $wp_query->comment_count = count( $wp_query->comments ); + $wp_query->max_num_comment_pages = $comment_query->max_num_pages; + + if ( $separate_comments ) { + $wp_query->comments_by_type = separate_comments( $comments ); + $comments_by_type = &$wp_query->comments_by_type; + } else { + $wp_query->comments_by_type = array(); + } + + $overridden_cpage = false; + if ( '' == get_query_var( 'cpage' ) && $wp_query->max_num_comment_pages > 1 ) { + set_query_var( 'cpage', 'newest' == get_option( 'default_comments_page' ) ? get_comment_pages_count() : 1 ); + $overridden_cpage = true; + } + + if ( ! defined( 'COMMENTS_TEMPLATE' ) ) { + define( 'COMMENTS_TEMPLATE', true ); + } + + $theme_template = STYLESHEETPATH . $file; + /** + * Filters the path to the theme template file used for the comments template. + * + * @since 1.5.1 + * + * @param string $theme_template The path to the theme template file. + */ + $include = apply_filters( 'comments_template', $theme_template ); + if ( file_exists( $include ) ) { + require $include; + } elseif ( file_exists( TEMPLATEPATH . $file ) ) { + require TEMPLATEPATH . $file; + } else { // Backward compat code will be removed in a future release. + require ABSPATH . WPINC . '/theme-compat/comments.php'; + } +} + +/** + * Displays the link to the comments for the current post ID. + * + * @since 0.71 + * + * @param false|string $zero Optional. String to display when no comments. Default false. + * @param false|string $one Optional. String to display when only one comment is available. Default false. + * @param false|string $more Optional. String to display when there are more than one comment. Default false. + * @param string $css_class Optional. CSS class to use for comments. Default empty. + * @param false|string $none Optional. String to display when comments have been turned off. Default false. + */ +function comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) { + $id = get_the_ID(); + $title = get_the_title(); + $number = get_comments_number( $id ); + + if ( false === $zero ) { + /* translators: %s: Post title. */ + $zero = sprintf( __( 'No Comments on %s' ), $title ); + } + + if ( false === $one ) { + /* translators: %s: Post title. */ + $one = sprintf( __( '1 Comment on %s' ), $title ); + } + + if ( false === $more ) { + /* translators: 1: Number of comments, 2: Post title. */ + $more = _n( '%1$s Comment on %2$s', '%1$s Comments on %2$s', $number ); + $more = sprintf( $more, number_format_i18n( $number ), $title ); + } + + if ( false === $none ) { + /* translators: %s: Post title. */ + $none = sprintf( __( 'Comments Off on %s' ), $title ); + } + + if ( 0 == $number && ! comments_open() && ! pings_open() ) { + echo '' . $none . ''; + return; + } + + if ( post_password_required() ) { + _e( 'Enter your password to view comments.' ); + return; + } + + echo ''; + comments_number( $zero, $one, $more ); + echo ''; +} + +/** + * Retrieves HTML content for reply to comment link. + * + * @since 2.7.0 + * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. + * + * @param array $args { + * Optional. Override default arguments. + * + * @type string $add_below The first part of the selector used to identify the comment to respond below. + * The resulting value is passed as the first parameter to addComment.moveForm(), + * concatenated as $add_below-$comment->comment_ID. Default 'comment'. + * @type string $respond_id The selector identifying the responding comment. Passed as the third parameter + * to addComment.moveForm(), and appended to the link URL as a hash value. + * Default 'respond'. + * @type string $reply_text The text of the Reply link. Default 'Reply'. + * @type string $login_text The text of the link to reply if logged out. Default 'Log in to Reply'. + * @type int $max_depth The max depth of the comment tree. Default 0. + * @type int $depth The depth of the new comment. Must be greater than 0 and less than the value + * of the 'thread_comments_depth' option set in Settings > Discussion. Default 0. + * @type string $before The text or HTML to add before the reply link. Default empty. + * @type string $after The text or HTML to add after the reply link. Default empty. + * } + * @param int|WP_Comment $comment Comment being replied to. Default current comment. + * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. + * Default current post. + * @return string|false|null Link to show comment form, if successful. False, if comments are closed. + */ +function get_comment_reply_link( $args = array(), $comment = null, $post = null ) { + $defaults = array( + 'add_below' => 'comment', + 'respond_id' => 'respond', + 'reply_text' => __( 'Reply' ), + /* translators: Comment reply button text. %s: Comment author name. */ + 'reply_to_text' => __( 'Reply to %s' ), + 'login_text' => __( 'Log in to Reply' ), + 'max_depth' => 0, + 'depth' => 0, + 'before' => '', + 'after' => '', + ); + + $args = wp_parse_args( $args, $defaults ); + + if ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] ) { + return; + } + + $comment = get_comment( $comment ); + + if ( empty( $comment ) ) { + return; + } + + if ( empty( $post ) ) { + $post = $comment->comment_post_ID; + } + + $post = get_post( $post ); + + if ( ! comments_open( $post->ID ) ) { + return false; + } + + /** + * Filters the comment reply link arguments. + * + * @since 4.1.0 + * + * @param array $args Comment reply link arguments. See get_comment_reply_link() + * for more information on accepted arguments. + * @param WP_Comment $comment The object of the comment being replied to. + * @param WP_Post $post The WP_Post object. + */ + $args = apply_filters( 'comment_reply_link_args', $args, $comment, $post ); + + if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) { + $link = sprintf( + '', + esc_url( wp_login_url( get_permalink() ) ), + $args['login_text'] + ); + } else { + $data_attributes = array( + 'commentid' => $comment->comment_ID, + 'postid' => $post->ID, + 'belowelement' => $args['add_below'] . '-' . $comment->comment_ID, + 'respondelement' => $args['respond_id'], + ); + + $data_attribute_string = ''; + + foreach ( $data_attributes as $name => $value ) { + $data_attribute_string .= " data-${name}=\"" . esc_attr( $value ) . '"'; + } + + $data_attribute_string = trim( $data_attribute_string ); + + $link = sprintf( + "%s", + esc_url( + add_query_arg( + array( + 'replytocom' => $comment->comment_ID, + 'unapproved' => false, + 'moderation-hash' => false, + ), + get_permalink( $post->ID ) + ) + ) . '#' . $args['respond_id'], + $data_attribute_string, + esc_attr( sprintf( $args['reply_to_text'], $comment->comment_author ) ), + $args['reply_text'] + ); + } + + /** + * Filters the comment reply link. + * + * @since 2.7.0 + * + * @param string $link The HTML markup for the comment reply link. + * @param array $args An array of arguments overriding the defaults. + * @param WP_Comment $comment The object of the comment being replied. + * @param WP_Post $post The WP_Post object. + */ + return apply_filters( 'comment_reply_link', $args['before'] . $link . $args['after'], $args, $comment, $post ); +} + +/** + * Displays the HTML content for reply to comment link. + * + * @since 2.7.0 + * + * @see get_comment_reply_link() + * + * @param array $args Optional. Override default options. Default empty array. + * @param int|WP_Comment $comment Comment being replied to. Default current comment. + * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. + * Default current post. + */ +function comment_reply_link( $args = array(), $comment = null, $post = null ) { + echo get_comment_reply_link( $args, $comment, $post ); +} + +/** + * Retrieves HTML content for reply to post link. + * + * @since 2.7.0 + * + * @param array $args { + * Optional. Override default arguments. + * + * @type string $add_below The first part of the selector used to identify the comment to respond below. + * The resulting value is passed as the first parameter to addComment.moveForm(), + * concatenated as $add_below-$comment->comment_ID. Default is 'post'. + * @type string $respond_id The selector identifying the responding comment. Passed as the third parameter + * to addComment.moveForm(), and appended to the link URL as a hash value. + * Default 'respond'. + * @type string $reply_text Text of the Reply link. Default is 'Leave a Comment'. + * @type string $login_text Text of the link to reply if logged out. Default is 'Log in to leave a Comment'. + * @type string $before Text or HTML to add before the reply link. Default empty. + * @type string $after Text or HTML to add after the reply link. Default empty. + * } + * @param int|WP_Post $post Optional. Post ID or WP_Post object the comment is going to be displayed on. + * Default current post. + * @return string|false|null Link to show comment form, if successful. False, if comments are closed. + */ +function get_post_reply_link( $args = array(), $post = null ) { + $defaults = array( + 'add_below' => 'post', + 'respond_id' => 'respond', + 'reply_text' => __( 'Leave a Comment' ), + 'login_text' => __( 'Log in to leave a Comment' ), + 'before' => '', + 'after' => '', + ); + + $args = wp_parse_args( $args, $defaults ); + + $post = get_post( $post ); + + if ( ! comments_open( $post->ID ) ) { + return false; + } + + if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) { + $link = sprintf( + '', + wp_login_url( get_permalink() ), + $args['login_text'] + ); + } else { + $onclick = sprintf( + 'return addComment.moveForm( "%1$s-%2$s", "0", "%3$s", "%2$s" )', + $args['add_below'], + $post->ID, + $args['respond_id'] + ); + + $link = sprintf( + "%s", + get_permalink( $post->ID ) . '#' . $args['respond_id'], + $onclick, + $args['reply_text'] + ); + } + $formatted_link = $args['before'] . $link . $args['after']; + + /** + * Filters the formatted post comments link HTML. + * + * @since 2.7.0 + * + * @param string $formatted The HTML-formatted post comments link. + * @param int|WP_Post $post The post ID or WP_Post object. + */ + return apply_filters( 'post_comments_link', $formatted_link, $post ); +} + +/** + * Displays the HTML content for reply to post link. + * + * @since 2.7.0 + * + * @see get_post_reply_link() + * + * @param array $args Optional. Override default options. Default empty array. + * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. + * Default current post. + */ +function post_reply_link( $args = array(), $post = null ) { + echo get_post_reply_link( $args, $post ); +} + +/** + * Retrieves HTML content for cancel comment reply link. + * + * @since 2.7.0 + * + * @param string $text Optional. Text to display for cancel reply link. Default empty. + * @return string + */ +function get_cancel_comment_reply_link( $text = '' ) { + if ( empty( $text ) ) { + $text = __( 'Click here to cancel reply.' ); + } + + $style = isset( $_GET['replytocom'] ) ? '' : ' style="display:none;"'; + $link = esc_html( remove_query_arg( array( 'replytocom', 'unapproved', 'moderation-hash' ) ) ) . '#respond'; + + $formatted_link = '' . $text . ''; + + /** + * Filters the cancel comment reply link HTML. + * + * @since 2.7.0 + * + * @param string $formatted_link The HTML-formatted cancel comment reply link. + * @param string $link Cancel comment reply link URL. + * @param string $text Cancel comment reply link text. + */ + return apply_filters( 'cancel_comment_reply_link', $formatted_link, $link, $text ); +} + +/** + * Displays HTML content for cancel comment reply link. + * + * @since 2.7.0 + * + * @param string $text Optional. Text to display for cancel reply link. Default empty. + */ +function cancel_comment_reply_link( $text = '' ) { + echo get_cancel_comment_reply_link( $text ); +} + +/** + * Retrieves hidden input HTML for replying to comments. + * + * @since 3.0.0 + * + * @param int $id Optional. Post ID. Default current post ID. + * @return string Hidden input HTML for replying to comments + */ +function get_comment_id_fields( $id = 0 ) { + if ( empty( $id ) ) { + $id = get_the_ID(); + } + + $replytoid = isset( $_GET['replytocom'] ) ? (int) $_GET['replytocom'] : 0; + $result = "\n"; + $result .= "\n"; + + /** + * Filters the returned comment id fields. + * + * @since 3.0.0 + * + * @param string $result The HTML-formatted hidden id field comment elements. + * @param int $id The post ID. + * @param int $replytoid The id of the comment being replied to. + */ + return apply_filters( 'comment_id_fields', $result, $id, $replytoid ); +} + +/** + * Outputs hidden input HTML for replying to comments. + * + * @since 2.7.0 + * + * @param int $id Optional. Post ID. Default current post ID. + */ +function comment_id_fields( $id = 0 ) { + echo get_comment_id_fields( $id ); +} + +/** + * Displays text based on comment reply status. + * + * Only affects users with JavaScript disabled. + * + * @internal The $comment global must be present to allow template tags access to the current + * comment. See https://core.trac.wordpress.org/changeset/36512. + * + * @since 2.7.0 + * + * @global WP_Comment $comment Global comment object. + * + * @param string $noreplytext Optional. Text to display when not replying to a comment. + * Default false. + * @param string $replytext Optional. Text to display when replying to a comment. + * Default false. Accepts "%s" for the author of the comment + * being replied to. + * @param string $linktoparent Optional. Boolean to control making the author's name a link + * to their comment. Default true. + */ +function comment_form_title( $noreplytext = false, $replytext = false, $linktoparent = true ) { + global $comment; + + if ( false === $noreplytext ) { + $noreplytext = __( 'Leave a Reply' ); + } + if ( false === $replytext ) { + /* translators: %s: Author of the comment being replied to. */ + $replytext = __( 'Leave a Reply to %s' ); + } + + $replytoid = isset( $_GET['replytocom'] ) ? (int) $_GET['replytocom'] : 0; + + if ( 0 == $replytoid ) { + echo $noreplytext; + } else { + // Sets the global so that template tags can be used in the comment form. + $comment = get_comment( $replytoid ); + $author = ( $linktoparent ) ? '' . get_comment_author( $comment ) . '' : get_comment_author( $comment ); + printf( $replytext, $author ); + } +} + +/** + * Displays a list of comments. + * + * Used in the comments.php template to list comments for a particular post. + * + * @since 2.7.0 + * + * @see WP_Query->comments + * + * @global WP_Query $wp_query WordPress Query object. + * @global int $comment_alt + * @global int $comment_depth + * @global int $comment_thread_alt + * @global bool $overridden_cpage + * @global bool $in_comment_loop + * + * @param string|array $args { + * Optional. Formatting options. + * + * @type object $walker Instance of a Walker class to list comments. Default null. + * @type int $max_depth The maximum comments depth. Default empty. + * @type string $style The style of list ordering. Default 'ul'. Accepts 'ul', 'ol'. + * @type string $callback Callback function to use. Default null. + * @type string $end-callback Callback function to use at the end. Default null. + * @type string $type Type of comments to list. + * Default 'all'. Accepts 'all', 'comment', 'pingback', 'trackback', 'pings'. + * @type int $page Page ID to list comments for. Default empty. + * @type int $per_page Number of comments to list per page. Default empty. + * @type int $avatar_size Height and width dimensions of the avatar size. Default 32. + * @type bool $reverse_top_level Ordering of the listed comments. If true, will display newest comments first. + * @type bool $reverse_children Whether to reverse child comments in the list. Default null. + * @type string $format How to format the comments list. + * Default 'html5' if the theme supports it. Accepts 'html5', 'xhtml'. + * @type bool $short_ping Whether to output short pings. Default false. + * @type bool $echo Whether to echo the output or return it. Default true. + * } + * @param WP_Comment[] $comments Optional. Array of WP_Comment objects. + * @return void|string Void if 'echo' argument is true, or no comments to list. + * Otherwise, HTML list of comments. + */ +function wp_list_comments( $args = array(), $comments = null ) { + global $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage, $in_comment_loop; + + $in_comment_loop = true; + + $comment_alt = 0; + $comment_thread_alt = 0; + $comment_depth = 1; + + $defaults = array( + 'walker' => null, + 'max_depth' => '', + 'style' => 'ul', + 'callback' => null, + 'end-callback' => null, + 'type' => 'all', + 'page' => '', + 'per_page' => '', + 'avatar_size' => 32, + 'reverse_top_level' => null, + 'reverse_children' => '', + 'format' => current_theme_supports( 'html5', 'comment-list' ) ? 'html5' : 'xhtml', + 'short_ping' => false, + 'echo' => true, + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + /** + * Filters the arguments used in retrieving the comment list. + * + * @since 4.0.0 + * + * @see wp_list_comments() + * + * @param array $parsed_args An array of arguments for displaying comments. + */ + $parsed_args = apply_filters( 'wp_list_comments_args', $parsed_args ); + + // Figure out what comments we'll be looping through ($_comments). + if ( null !== $comments ) { + $comments = (array) $comments; + if ( empty( $comments ) ) { + return; + } + if ( 'all' != $parsed_args['type'] ) { + $comments_by_type = separate_comments( $comments ); + if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) { + return; + } + $_comments = $comments_by_type[ $parsed_args['type'] ]; + } else { + $_comments = $comments; + } + } else { + /* + * If 'page' or 'per_page' has been passed, and does not match what's in $wp_query, + * perform a separate comment query and allow Walker_Comment to paginate. + */ + if ( $parsed_args['page'] || $parsed_args['per_page'] ) { + $current_cpage = get_query_var( 'cpage' ); + if ( ! $current_cpage ) { + $current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages; + } + + $current_per_page = get_query_var( 'comments_per_page' ); + if ( $parsed_args['page'] != $current_cpage || $parsed_args['per_page'] != $current_per_page ) { + $comment_args = array( + 'post_id' => get_the_ID(), + 'orderby' => 'comment_date_gmt', + 'order' => 'ASC', + 'status' => 'approve', + ); + + if ( is_user_logged_in() ) { + $comment_args['include_unapproved'] = get_current_user_id(); + } else { + $unapproved_email = wp_get_unapproved_comment_author_email(); + + if ( $unapproved_email ) { + $comment_args['include_unapproved'] = array( $unapproved_email ); + } + } + + $comments = get_comments( $comment_args ); + + if ( 'all' != $parsed_args['type'] ) { + $comments_by_type = separate_comments( $comments ); + if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) { + return; + } + + $_comments = $comments_by_type[ $parsed_args['type'] ]; + } else { + $_comments = $comments; + } + } + + // Otherwise, fall back on the comments from `$wp_query->comments`. + } else { + if ( empty( $wp_query->comments ) ) { + return; + } + if ( 'all' != $parsed_args['type'] ) { + if ( empty( $wp_query->comments_by_type ) ) { + $wp_query->comments_by_type = separate_comments( $wp_query->comments ); + } + if ( empty( $wp_query->comments_by_type[ $parsed_args['type'] ] ) ) { + return; + } + $_comments = $wp_query->comments_by_type[ $parsed_args['type'] ]; + } else { + $_comments = $wp_query->comments; + } + + if ( $wp_query->max_num_comment_pages ) { + $default_comments_page = get_option( 'default_comments_page' ); + $cpage = get_query_var( 'cpage' ); + if ( 'newest' === $default_comments_page ) { + $parsed_args['cpage'] = $cpage; + + /* + * When first page shows oldest comments, post permalink is the same as + * the comment permalink. + */ + } elseif ( 1 == $cpage ) { + $parsed_args['cpage'] = ''; + } else { + $parsed_args['cpage'] = $cpage; + } + + $parsed_args['page'] = 0; + $parsed_args['per_page'] = 0; + } + } + } + + if ( '' === $parsed_args['per_page'] && get_option( 'page_comments' ) ) { + $parsed_args['per_page'] = get_query_var( 'comments_per_page' ); + } + + if ( empty( $parsed_args['per_page'] ) ) { + $parsed_args['per_page'] = 0; + $parsed_args['page'] = 0; + } + + if ( '' === $parsed_args['max_depth'] ) { + if ( get_option( 'thread_comments' ) ) { + $parsed_args['max_depth'] = get_option( 'thread_comments_depth' ); + } else { + $parsed_args['max_depth'] = -1; + } + } + + if ( '' === $parsed_args['page'] ) { + if ( empty( $overridden_cpage ) ) { + $parsed_args['page'] = get_query_var( 'cpage' ); + } else { + $threaded = ( -1 != $parsed_args['max_depth'] ); + $parsed_args['page'] = ( 'newest' == get_option( 'default_comments_page' ) ) ? get_comment_pages_count( $_comments, $parsed_args['per_page'], $threaded ) : 1; + set_query_var( 'cpage', $parsed_args['page'] ); + } + } + // Validation check. + $parsed_args['page'] = intval( $parsed_args['page'] ); + if ( 0 == $parsed_args['page'] && 0 != $parsed_args['per_page'] ) { + $parsed_args['page'] = 1; + } + + if ( null === $parsed_args['reverse_top_level'] ) { + $parsed_args['reverse_top_level'] = ( 'desc' == get_option( 'comment_order' ) ); + } + + wp_queue_comments_for_comment_meta_lazyload( $_comments ); + + if ( empty( $parsed_args['walker'] ) ) { + $walker = new Walker_Comment; + } else { + $walker = $parsed_args['walker']; + } + + $output = $walker->paged_walk( $_comments, $parsed_args['max_depth'], $parsed_args['page'], $parsed_args['per_page'], $parsed_args ); + + $in_comment_loop = false; + + if ( $parsed_args['echo'] ) { + echo $output; + } else { + return $output; + } +} + +/** + * Outputs a complete commenting form for use within a template. + * + * Most strings and form fields may be controlled through the $args array passed + * into the function, while you may also choose to use the {@see 'comment_form_default_fields'} + * filter to modify the array of default fields if you'd just like to add a new + * one or remove a single field. All fields are also individually passed through + * a filter of the {@see 'comment_form_field_$name'} where $name is the key used + * in the array of fields. + * + * @since 3.0.0 + * @since 4.1.0 Introduced the 'class_submit' argument. + * @since 4.2.0 Introduced the 'submit_button' and 'submit_fields' arguments. + * @since 4.4.0 Introduced the 'class_form', 'title_reply_before', 'title_reply_after', + * 'cancel_reply_before', and 'cancel_reply_after' arguments. + * @since 4.5.0 The 'author', 'email', and 'url' form fields are limited to 245, 100, + * and 200 characters, respectively. + * @since 4.6.0 Introduced the 'action' argument. + * @since 4.9.6 Introduced the 'cookies' default comment field. + * + * @param array $args { + * Optional. Default arguments and form fields to override. + * + * @type array $fields { + * Default comment fields, filterable by default via the {@see 'comment_form_default_fields'} hook. + * + * @type string $author Comment author field HTML. + * @type string $email Comment author email field HTML. + * @type string $url Comment author URL field HTML. + * @type string $cookies Comment cookie opt-in field HTML. + * } + * @type string $comment_field The comment textarea field HTML. + * @type string $must_log_in HTML element for a 'must be logged in to comment' message. + * @type string $logged_in_as HTML element for a 'logged in as [user]' message. + * @type string $comment_notes_before HTML element for a message displayed before the comment fields + * if the user is not logged in. + * Default 'Your email address will not be published.'. + * @type string $comment_notes_after HTML element for a message displayed after the textarea field. + * @type string $action The comment form element action attribute. Default '/wp-comments-post.php'. + * @type string $id_form The comment form element id attribute. Default 'commentform'. + * @type string $id_submit The comment submit element id attribute. Default 'submit'. + * @type string $class_form The comment form element class attribute. Default 'comment-form'. + * @type string $class_submit The comment submit element class attribute. Default 'submit'. + * @type string $name_submit The comment submit element name attribute. Default 'submit'. + * @type string $title_reply The translatable 'reply' button label. Default 'Leave a Reply'. + * @type string $title_reply_to The translatable 'reply-to' button label. Default 'Leave a Reply to %s', + * where %s is the author of the comment being replied to. + * @type string $title_reply_before HTML displayed before the comment form title. + * Default: '

            '. + * @type string $title_reply_after HTML displayed after the comment form title. + * Default: '

            '. + * @type string $cancel_reply_before HTML displayed before the cancel reply link. + * @type string $cancel_reply_after HTML displayed after the cancel reply link. + * @type string $cancel_reply_link The translatable 'cancel reply' button label. Default 'Cancel reply'. + * @type string $label_submit The translatable 'submit' button label. Default 'Post a comment'. + * @type string $submit_button HTML format for the Submit button. + * Default: ''. + * @type string $submit_field HTML format for the markup surrounding the Submit button and comment hidden + * fields. Default: '

            %1$s %2$s

            ', where %1$s is the + * submit button markup and %2$s is the comment hidden fields. + * @type string $format The comment form format. Default 'xhtml'. Accepts 'xhtml', 'html5'. + * } + * @param int|WP_Post $post_id Post ID or WP_Post object to generate the form for. Default current post. + */ +function comment_form( $args = array(), $post_id = null ) { + if ( null === $post_id ) { + $post_id = get_the_ID(); + } + + // Exit the function when comments for the post are closed. + if ( ! comments_open( $post_id ) ) { + /** + * Fires after the comment form if comments are closed. + * + * @since 3.0.0 + */ + do_action( 'comment_form_comments_closed' ); + + return; + } + + $commenter = wp_get_current_commenter(); + $user = wp_get_current_user(); + $user_identity = $user->exists() ? $user->display_name : ''; + + $args = wp_parse_args( $args ); + if ( ! isset( $args['format'] ) ) { + $args['format'] = current_theme_supports( 'html5', 'comment-form' ) ? 'html5' : 'xhtml'; + } + + $req = get_option( 'require_name_email' ); + $html_req = ( $req ? " required='required'" : '' ); + $html5 = 'html5' === $args['format']; + + $fields = array( + 'author' => sprintf( + '

            %s %s

            ', + sprintf( + '', + __( 'Name' ), + ( $req ? ' *' : '' ) + ), + sprintf( + '', + esc_attr( $commenter['comment_author'] ), + $html_req + ) + ), + 'email' => sprintf( + '', + sprintf( + '', + __( 'Email' ), + ( $req ? ' *' : '' ) + ), + sprintf( + '', + ( $html5 ? 'type="email"' : 'type="text"' ), + esc_attr( $commenter['comment_author_email'] ), + $html_req + ) + ), + 'url' => sprintf( + '

            %s %s

            ', + sprintf( + '', + __( 'Website' ) + ), + sprintf( + '', + ( $html5 ? 'type="url"' : 'type="text"' ), + esc_attr( $commenter['comment_author_url'] ) + ) + ), + ); + + if ( has_action( 'set_comment_cookies', 'wp_set_comment_cookies' ) && get_option( 'show_comments_cookies_opt_in' ) ) { + $consent = empty( $commenter['comment_author_email'] ) ? '' : ' checked="checked"'; + + $fields['cookies'] = sprintf( + '', + sprintf( + '', + $consent + ), + sprintf( + '', + __( 'Save my name, email, and website in this browser for the next time I comment.' ) + ) + ); + + // Ensure that the passed fields include cookies consent. + if ( isset( $args['fields'] ) && ! isset( $args['fields']['cookies'] ) ) { + $args['fields']['cookies'] = $fields['cookies']; + } + } + + $required_text = sprintf( + /* translators: %s: Asterisk symbol (*). */ + ' ' . __( 'Required fields are marked %s' ), + '*' + ); + + /** + * Filters the default comment form fields. + * + * @since 3.0.0 + * + * @param string[] $fields Array of the default comment fields. + */ + $fields = apply_filters( 'comment_form_default_fields', $fields ); + + $defaults = array( + 'fields' => $fields, + 'comment_field' => sprintf( + '

            %s %s

            ', + sprintf( + '', + _x( 'Comment', 'noun' ) + ), + '' + ), + 'must_log_in' => sprintf( + '', + sprintf( + /* translators: %s: Login URL. */ + __( 'You must be logged in to post a comment.' ), + /** This filter is documented in wp-includes/link-template.php */ + wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ), $post_id ) ) + ) + ), + 'logged_in_as' => sprintf( + '

            %s

            ', + sprintf( + /* translators: 1: Edit user link, 2: Accessibility text, 3: User name, 4: Logout URL. */ + __( 'Logged in as %3$s. Log out?' ), + get_edit_user_link(), + /* translators: %s: User name. */ + esc_attr( sprintf( __( 'Logged in as %s. Edit your profile.' ), $user_identity ) ), + $user_identity, + /** This filter is documented in wp-includes/link-template.php */ + wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ), $post_id ) ) + ) + ), + 'comment_notes_before' => sprintf( + '

            %s%s

            ', + sprintf( + '%s', + __( 'Your email address will not be published.' ) + ), + ( $req ? $required_text : '' ) + ), + 'comment_notes_after' => '', + 'action' => site_url( '/wp-comments-post.php' ), + 'id_form' => 'commentform', + 'id_submit' => 'submit', + 'class_form' => 'comment-form', + 'class_submit' => 'submit', + 'name_submit' => 'submit', + 'title_reply' => __( 'Leave a Reply' ), + /* translators: %s: Author of the comment being replied to. */ + 'title_reply_to' => __( 'Leave a Reply to %s' ), + 'title_reply_before' => '

            ', + 'title_reply_after' => '

            ', + 'cancel_reply_before' => ' ', + 'cancel_reply_after' => '', + 'cancel_reply_link' => __( 'Cancel reply' ), + 'label_submit' => __( 'Post Comment' ), + 'submit_button' => '', + 'submit_field' => '

            %1$s %2$s

            ', + 'format' => 'xhtml', + ); + + /** + * Filters the comment form default arguments. + * + * Use {@see 'comment_form_default_fields'} to filter the comment fields. + * + * @since 3.0.0 + * + * @param array $defaults The default comment form arguments. + */ + $args = wp_parse_args( $args, apply_filters( 'comment_form_defaults', $defaults ) ); + + // Ensure that the filtered args contain all required default values. + $args = array_merge( $defaults, $args ); + + // Remove `aria-describedby` from the email field if there's no associated description. + if ( isset( $args['fields']['email'] ) && false === strpos( $args['comment_notes_before'], 'id="email-notes"' ) ) { + $args['fields']['email'] = str_replace( + ' aria-describedby="email-notes"', + '', + $args['fields']['email'] + ); + } + + /** + * Fires before the comment form. + * + * @since 3.0.0 + */ + do_action( 'comment_form_before' ); + ?> +
            + ', + esc_url( $args['action'] ), + esc_attr( $args['id_form'] ), + esc_attr( $args['class_form'] ), + ( $html5 ? ' novalidate' : '' ) + ); + + /** + * Fires at the top of the comment form, inside the form tag. + * + * @since 3.0.0 + */ + do_action( 'comment_form_top' ); + + if ( is_user_logged_in() ) : + + /** + * Filters the 'logged in' message for the comment form for display. + * + * @since 3.0.0 + * + * @param string $args_logged_in The logged-in-as HTML-formatted message. + * @param array $commenter An array containing the comment author's + * username, email, and URL. + * @param string $user_identity If the commenter is a registered user, + * the display name, blank otherwise. + */ + echo apply_filters( 'comment_form_logged_in', $args['logged_in_as'], $commenter, $user_identity ); + + /** + * Fires after the is_user_logged_in() check in the comment form. + * + * @since 3.0.0 + * + * @param array $commenter An array containing the comment author's + * username, email, and URL. + * @param string $user_identity If the commenter is a registered user, + * the display name, blank otherwise. + */ + do_action( 'comment_form_logged_in_after', $commenter, $user_identity ); + + else : + + echo $args['comment_notes_before']; + + endif; + + // Prepare an array of all fields, including the textarea. + $comment_fields = array( 'comment' => $args['comment_field'] ) + (array) $args['fields']; + + /** + * Filters the comment form fields, including the textarea. + * + * @since 4.4.0 + * + * @param array $comment_fields The comment fields. + */ + $comment_fields = apply_filters( 'comment_form_fields', $comment_fields ); + + // Get an array of field names, excluding the textarea. + $comment_field_keys = array_diff( array_keys( $comment_fields ), array( 'comment' ) ); + + // Get the first and the last field name, excluding the textarea. + $first_field = reset( $comment_field_keys ); + $last_field = end( $comment_field_keys ); + + foreach ( $comment_fields as $name => $field ) { + + if ( 'comment' === $name ) { + + /** + * Filters the content of the comment textarea field for display. + * + * @since 3.0.0 + * + * @param string $args_comment_field The content of the comment textarea field. + */ + echo apply_filters( 'comment_form_field_comment', $field ); + + echo $args['comment_notes_after']; + + } elseif ( ! is_user_logged_in() ) { + + if ( $first_field === $name ) { + /** + * Fires before the comment fields in the comment form, excluding the textarea. + * + * @since 3.0.0 + */ + do_action( 'comment_form_before_fields' ); + } + + /** + * Filters a comment form field for display. + * + * The dynamic portion of the filter hook, `$name`, refers to the name + * of the comment form field. Such as 'author', 'email', or 'url'. + * + * @since 3.0.0 + * + * @param string $field The HTML-formatted output of the comment form field. + */ + echo apply_filters( "comment_form_field_{$name}", $field ) . "\n"; + + if ( $last_field === $name ) { + /** + * Fires after the comment fields in the comment form, excluding the textarea. + * + * @since 3.0.0 + */ + do_action( 'comment_form_after_fields' ); + } + } + } + + $submit_button = sprintf( + $args['submit_button'], + esc_attr( $args['name_submit'] ), + esc_attr( $args['id_submit'] ), + esc_attr( $args['class_submit'] ), + esc_attr( $args['label_submit'] ) + ); + + /** + * Filters the submit button for the comment form to display. + * + * @since 4.2.0 + * + * @param string $submit_button HTML markup for the submit button. + * @param array $args Arguments passed to comment_form(). + */ + $submit_button = apply_filters( 'comment_form_submit_button', $submit_button, $args ); + + $submit_field = sprintf( + $args['submit_field'], + $submit_button, + get_comment_id_fields( $post_id ) + ); + + /** + * Filters the submit field for the comment form to display. + * + * The submit field includes the submit button, hidden fields for the + * comment form, and any wrapper markup. + * + * @since 4.2.0 + * + * @param string $submit_field HTML markup for the submit field. + * @param array $args Arguments passed to comment_form(). + */ + echo apply_filters( 'comment_form_submit_field', $submit_field, $args ); + + /** + * Fires at the bottom of the comment form, inside the closing form tag. + * + * @since 1.5.0 + * + * @param int $post_id The post ID. + */ + do_action( 'comment_form', $post_id ); + + echo ''; + + endif; + ?> +
            + ]*href/i', $comment, $out ); + + /** + * Filters the number of links found in a comment. + * + * @since 3.0.0 + * @since 4.7.0 Added the `$comment` parameter. + * + * @param int $num_links The number of links found. + * @param string $url Comment author's URL. Included in allowed links total. + * @param string $comment Content of the comment. + */ + $num_links = apply_filters( 'comment_max_links_url', $num_links, $url, $comment ); + + /* + * If the number of links in the comment exceeds the allowed amount, + * fail the check by returning false. + */ + if ( $num_links >= $max_links ) { + return false; + } + } + + $mod_keys = trim( get_option( 'moderation_keys' ) ); + + // If moderation 'keys' (keywords) are set, process them. + if ( ! empty( $mod_keys ) ) { + $words = explode( "\n", $mod_keys ); + + foreach ( (array) $words as $word ) { + $word = trim( $word ); + + // Skip empty lines. + if ( empty( $word ) ) { + continue; + } + + /* + * Do some escaping magic so that '#' (number of) characters in the spam + * words don't break things: + */ + $word = preg_quote( $word, '#' ); + + /* + * Check the comment fields for moderation keywords. If any are found, + * fail the check for the given field by returning false. + */ + $pattern = "#$word#i"; + if ( preg_match( $pattern, $author ) ) { + return false; + } + if ( preg_match( $pattern, $email ) ) { + return false; + } + if ( preg_match( $pattern, $url ) ) { + return false; + } + if ( preg_match( $pattern, $comment ) ) { + return false; + } + if ( preg_match( $pattern, $user_ip ) ) { + return false; + } + if ( preg_match( $pattern, $user_agent ) ) { + return false; + } + } + } + + /* + * Check if the option to approve comments by previously-approved authors is enabled. + * + * If it is enabled, check whether the comment author has a previously-approved comment, + * as well as whether there are any moderation keywords (if set) present in the author + * email address. If both checks pass, return true. Otherwise, return false. + */ + if ( 1 == get_option( 'comment_whitelist' ) ) { + if ( 'trackback' !== $comment_type && 'pingback' !== $comment_type && '' != $author && '' != $email ) { + $comment_user = get_user_by( 'email', wp_unslash( $email ) ); + if ( ! empty( $comment_user->ID ) ) { + $ok_to_comment = $wpdb->get_var( $wpdb->prepare( "SELECT comment_approved FROM $wpdb->comments WHERE user_id = %d AND comment_approved = '1' LIMIT 1", $comment_user->ID ) ); + } else { + // expected_slashed ($author, $email) + $ok_to_comment = $wpdb->get_var( $wpdb->prepare( "SELECT comment_approved FROM $wpdb->comments WHERE comment_author = %s AND comment_author_email = %s and comment_approved = '1' LIMIT 1", $author, $email ) ); + } + if ( ( 1 == $ok_to_comment ) && + ( empty( $mod_keys ) || false === strpos( $email, $mod_keys ) ) ) { + return true; + } else { + return false; + } + } else { + return false; + } + } + return true; +} + +/** + * Retrieve the approved comments for post $post_id. + * + * @since 2.0.0 + * @since 4.1.0 Refactored to leverage WP_Comment_Query over a direct query. + * + * @param int $post_id The ID of the post. + * @param array $args Optional. See WP_Comment_Query::__construct() for information on accepted arguments. + * @return int|array $comments The approved comments, or number of comments if `$count` + * argument is true. + */ +function get_approved_comments( $post_id, $args = array() ) { + if ( ! $post_id ) { + return array(); + } + + $defaults = array( + 'status' => 1, + 'post_id' => $post_id, + 'order' => 'ASC', + ); + $parsed_args = wp_parse_args( $args, $defaults ); + + $query = new WP_Comment_Query; + return $query->query( $parsed_args ); +} + +/** + * Retrieves comment data given a comment ID or comment object. + * + * If an object is passed then the comment data will be cached and then returned + * after being passed through a filter. If the comment is empty, then the global + * comment variable will be used, if it is set. + * + * @since 2.0.0 + * + * @global WP_Comment $comment Global comment object. + * + * @param WP_Comment|string|int $comment Comment to retrieve. + * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to + * a WP_Comment object, an associative array, or a numeric array, respectively. Default OBJECT. + * @return WP_Comment|array|null Depends on $output value. + */ +function get_comment( &$comment = null, $output = OBJECT ) { + if ( empty( $comment ) && isset( $GLOBALS['comment'] ) ) { + $comment = $GLOBALS['comment']; + } + + if ( $comment instanceof WP_Comment ) { + $_comment = $comment; + } elseif ( is_object( $comment ) ) { + $_comment = new WP_Comment( $comment ); + } else { + $_comment = WP_Comment::get_instance( $comment ); + } + + if ( ! $_comment ) { + return null; + } + + /** + * Fires after a comment is retrieved. + * + * @since 2.3.0 + * + * @param WP_Comment $_comment Comment data. + */ + $_comment = apply_filters( 'get_comment', $_comment ); + + if ( OBJECT == $output ) { + return $_comment; + } elseif ( ARRAY_A == $output ) { + return $_comment->to_array(); + } elseif ( ARRAY_N == $output ) { + return array_values( $_comment->to_array() ); + } + return $_comment; +} + +/** + * Retrieve a list of comments. + * + * The comment list can be for the blog as a whole or for an individual post. + * + * @since 2.7.0 + * + * @param string|array $args Optional. Array or string of arguments. See WP_Comment_Query::__construct() + * for information on accepted arguments. Default empty. + * @return int|array List of comments or number of found comments if `$count` argument is true. + */ +function get_comments( $args = '' ) { + $query = new WP_Comment_Query; + return $query->query( $args ); +} + +/** + * Retrieve all of the WordPress supported comment statuses. + * + * Comments have a limited set of valid status values, this provides the comment + * status values and descriptions. + * + * @since 2.7.0 + * + * @return string[] List of comment status labels keyed by status. + */ +function get_comment_statuses() { + $status = array( + 'hold' => __( 'Unapproved' ), + 'approve' => _x( 'Approved', 'comment status' ), + 'spam' => _x( 'Spam', 'comment status' ), + 'trash' => _x( 'Trash', 'comment status' ), + ); + + return $status; +} + +/** + * Gets the default comment status for a post type. + * + * @since 4.3.0 + * + * @param string $post_type Optional. Post type. Default 'post'. + * @param string $comment_type Optional. Comment type. Default 'comment'. + * @return string Expected return value is 'open' or 'closed'. + */ +function get_default_comment_status( $post_type = 'post', $comment_type = 'comment' ) { + switch ( $comment_type ) { + case 'pingback': + case 'trackback': + $supports = 'trackbacks'; + $option = 'ping'; + break; + default: + $supports = 'comments'; + $option = 'comment'; + break; + } + + // Set the status. + if ( 'page' === $post_type ) { + $status = 'closed'; + } elseif ( post_type_supports( $post_type, $supports ) ) { + $status = get_option( "default_{$option}_status" ); + } else { + $status = 'closed'; + } + + /** + * Filters the default comment status for the given post type. + * + * @since 4.3.0 + * + * @param string $status Default status for the given post type, + * either 'open' or 'closed'. + * @param string $post_type Post type. Default is `post`. + * @param string $comment_type Type of comment. Default is `comment`. + */ + return apply_filters( 'get_default_comment_status', $status, $post_type, $comment_type ); +} + +/** + * The date the last comment was modified. + * + * @since 1.5.0 + * @since 4.7.0 Replaced caching the modified date in a local static variable + * with the Object Cache API. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $timezone Which timezone to use in reference to 'gmt', 'blog', or 'server' locations. + * @return string|false Last comment modified date on success, false on failure. + */ +function get_lastcommentmodified( $timezone = 'server' ) { + global $wpdb; + + $timezone = strtolower( $timezone ); + $key = "lastcommentmodified:$timezone"; + + $comment_modified_date = wp_cache_get( $key, 'timeinfo' ); + if ( false !== $comment_modified_date ) { + return $comment_modified_date; + } + + switch ( $timezone ) { + case 'gmt': + $comment_modified_date = $wpdb->get_var( "SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1" ); + break; + case 'blog': + $comment_modified_date = $wpdb->get_var( "SELECT comment_date FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1" ); + break; + case 'server': + $add_seconds_server = gmdate( 'Z' ); + + $comment_modified_date = $wpdb->get_var( $wpdb->prepare( "SELECT DATE_ADD(comment_date_gmt, INTERVAL %s SECOND) FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1", $add_seconds_server ) ); + break; + } + + if ( $comment_modified_date ) { + wp_cache_set( $key, $comment_modified_date, 'timeinfo' ); + + return $comment_modified_date; + } + + return false; +} + +/** + * Retrieves the total comment counts for the whole site or a single post. + * + * Unlike wp_count_comments(), this function always returns the live comment counts without caching. + * + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $post_id Optional. Restrict the comment counts to the given post. Default 0, which indicates that + * comment counts for the whole site will be retrieved. + * @return array() { + * The number of comments keyed by their status. + * + * @type int|string $approved The number of approved comments. + * @type int|string $awaiting_moderation The number of comments awaiting moderation (a.k.a. pending). + * @type int|string $spam The number of spam comments. + * @type int|string $trash The number of trashed comments. + * @type int|string $post-trashed The number of comments for posts that are in the trash. + * @type int $total_comments The total number of non-trashed comments, including spam. + * @type int $all The total number of pending or approved comments. + * } + */ +function get_comment_count( $post_id = 0 ) { + global $wpdb; + + $post_id = (int) $post_id; + + $where = ''; + if ( $post_id > 0 ) { + $where = $wpdb->prepare( 'WHERE comment_post_ID = %d', $post_id ); + } + + $totals = (array) $wpdb->get_results( + " + SELECT comment_approved, COUNT( * ) AS total + FROM {$wpdb->comments} + {$where} + GROUP BY comment_approved + ", + ARRAY_A + ); + + $comment_count = array( + 'approved' => 0, + 'awaiting_moderation' => 0, + 'spam' => 0, + 'trash' => 0, + 'post-trashed' => 0, + 'total_comments' => 0, + 'all' => 0, + ); + + foreach ( $totals as $row ) { + switch ( $row['comment_approved'] ) { + case 'trash': + $comment_count['trash'] = $row['total']; + break; + case 'post-trashed': + $comment_count['post-trashed'] = $row['total']; + break; + case 'spam': + $comment_count['spam'] = $row['total']; + $comment_count['total_comments'] += $row['total']; + break; + case '1': + $comment_count['approved'] = $row['total']; + $comment_count['total_comments'] += $row['total']; + $comment_count['all'] += $row['total']; + break; + case '0': + $comment_count['awaiting_moderation'] = $row['total']; + $comment_count['total_comments'] += $row['total']; + $comment_count['all'] += $row['total']; + break; + default: + break; + } + } + + return $comment_count; +} + +// +// Comment meta functions. +// + +/** + * Add meta data field to a comment. + * + * @since 2.9.0 + * @link https://developer.wordpress.org/reference/functions/add_comment_meta/ + * + * @param int $comment_id Comment ID. + * @param string $meta_key Metadata name. + * @param mixed $meta_value Metadata value. + * @param bool $unique Optional, default is false. Whether the same key should not be added. + * @return int|bool Meta ID on success, false on failure. + */ +function add_comment_meta( $comment_id, $meta_key, $meta_value, $unique = false ) { + return add_metadata( 'comment', $comment_id, $meta_key, $meta_value, $unique ); +} + +/** + * Remove metadata matching criteria from a comment. + * + * You can match based on the key, or key and value. Removing based on key and + * value, will keep from removing duplicate metadata with the same key. It also + * allows removing all metadata matching key, if needed. + * + * @since 2.9.0 + * @link https://developer.wordpress.org/reference/functions/delete_comment_meta/ + * + * @param int $comment_id comment ID + * @param string $meta_key Metadata name. + * @param mixed $meta_value Optional. Metadata value. + * @return bool True on success, false on failure. + */ +function delete_comment_meta( $comment_id, $meta_key, $meta_value = '' ) { + return delete_metadata( 'comment', $comment_id, $meta_key, $meta_value ); +} + +/** + * Retrieve comment meta field for a comment. + * + * @since 2.9.0 + * @link https://developer.wordpress.org/reference/functions/get_comment_meta/ + * + * @param int $comment_id Comment ID. + * @param string $key Optional. The meta key to retrieve. By default, returns data for all keys. + * @param bool $single Whether to return a single value. + * @return mixed Will be an array if $single is false. Will be value of meta data field if $single + * is true. + */ +function get_comment_meta( $comment_id, $key = '', $single = false ) { + return get_metadata( 'comment', $comment_id, $key, $single ); +} + +/** + * Update comment meta field based on comment ID. + * + * Use the $prev_value parameter to differentiate between meta fields with the + * same key and comment ID. + * + * If the meta field for the comment does not exist, it will be added. + * + * @since 2.9.0 + * @link https://developer.wordpress.org/reference/functions/update_comment_meta/ + * + * @param int $comment_id Comment ID. + * @param string $meta_key Metadata key. + * @param mixed $meta_value Metadata value. + * @param mixed $prev_value Optional. Previous value to check before removing. + * @return int|bool Meta ID if the key didn't exist, true on successful update, false on failure. + */ +function update_comment_meta( $comment_id, $meta_key, $meta_value, $prev_value = '' ) { + return update_metadata( 'comment', $comment_id, $meta_key, $meta_value, $prev_value ); +} + +/** + * Queues comments for metadata lazy-loading. + * + * @since 4.5.0 + * + * @param WP_Comment[] $comments Array of comment objects. + */ +function wp_queue_comments_for_comment_meta_lazyload( $comments ) { + // Don't use `wp_list_pluck()` to avoid by-reference manipulation. + $comment_ids = array(); + if ( is_array( $comments ) ) { + foreach ( $comments as $comment ) { + if ( $comment instanceof WP_Comment ) { + $comment_ids[] = $comment->comment_ID; + } + } + } + + if ( $comment_ids ) { + $lazyloader = wp_metadata_lazyloader(); + $lazyloader->queue_objects( 'comment', $comment_ids ); + } +} + +/** + * Sets the cookies used to store an unauthenticated commentator's identity. Typically used + * to recall previous comments by this commentator that are still held in moderation. + * + * @since 3.4.0 + * @since 4.9.6 The `$cookies_consent` parameter was added. + * + * @param WP_Comment $comment Comment object. + * @param WP_User $user Comment author's user object. The user may not exist. + * @param boolean $cookies_consent Optional. Comment author's consent to store cookies. Default true. + */ +function wp_set_comment_cookies( $comment, $user, $cookies_consent = true ) { + // If the user already exists, or the user opted out of cookies, don't set cookies. + if ( $user->exists() ) { + return; + } + + if ( false === $cookies_consent ) { + // Remove any existing cookies. + $past = time() - YEAR_IN_SECONDS; + setcookie( 'comment_author_' . COOKIEHASH, ' ', $past, COOKIEPATH, COOKIE_DOMAIN ); + setcookie( 'comment_author_email_' . COOKIEHASH, ' ', $past, COOKIEPATH, COOKIE_DOMAIN ); + setcookie( 'comment_author_url_' . COOKIEHASH, ' ', $past, COOKIEPATH, COOKIE_DOMAIN ); + + return; + } + + /** + * Filters the lifetime of the comment cookie in seconds. + * + * @since 2.8.0 + * + * @param int $seconds Comment cookie lifetime. Default 30000000. + */ + $comment_cookie_lifetime = time() + apply_filters( 'comment_cookie_lifetime', 30000000 ); + $secure = ( 'https' === parse_url( home_url(), PHP_URL_SCHEME ) ); + setcookie( 'comment_author_' . COOKIEHASH, $comment->comment_author, $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure ); + setcookie( 'comment_author_email_' . COOKIEHASH, $comment->comment_author_email, $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure ); + setcookie( 'comment_author_url_' . COOKIEHASH, esc_url( $comment->comment_author_url ), $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure ); +} + +/** + * Sanitizes the cookies sent to the user already. + * + * Will only do anything if the cookies have already been created for the user. + * Mostly used after cookies had been sent to use elsewhere. + * + * @since 2.0.4 + */ +function sanitize_comment_cookies() { + if ( isset( $_COOKIE[ 'comment_author_' . COOKIEHASH ] ) ) { + /** + * Filters the comment author's name cookie before it is set. + * + * When this filter hook is evaluated in wp_filter_comment(), + * the comment author's name string is passed. + * + * @since 1.5.0 + * + * @param string $author_cookie The comment author name cookie. + */ + $comment_author = apply_filters( 'pre_comment_author_name', $_COOKIE[ 'comment_author_' . COOKIEHASH ] ); + $comment_author = wp_unslash( $comment_author ); + $comment_author = esc_attr( $comment_author ); + $_COOKIE[ 'comment_author_' . COOKIEHASH ] = $comment_author; + } + + if ( isset( $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ) ) { + /** + * Filters the comment author's email cookie before it is set. + * + * When this filter hook is evaluated in wp_filter_comment(), + * the comment author's email string is passed. + * + * @since 1.5.0 + * + * @param string $author_email_cookie The comment author email cookie. + */ + $comment_author_email = apply_filters( 'pre_comment_author_email', $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ); + $comment_author_email = wp_unslash( $comment_author_email ); + $comment_author_email = esc_attr( $comment_author_email ); + $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] = $comment_author_email; + } + + if ( isset( $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] ) ) { + /** + * Filters the comment author's URL cookie before it is set. + * + * When this filter hook is evaluated in wp_filter_comment(), + * the comment author's URL string is passed. + * + * @since 1.5.0 + * + * @param string $author_url_cookie The comment author URL cookie. + */ + $comment_author_url = apply_filters( 'pre_comment_author_url', $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] ); + $comment_author_url = wp_unslash( $comment_author_url ); + $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] = $comment_author_url; + } +} + +/** + * Validates whether this comment is allowed to be made. + * + * @since 2.0.0 + * @since 4.7.0 The `$avoid_die` parameter was added, allowing the function to + * return a WP_Error object instead of dying. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $commentdata Contains information on the comment. + * @param bool $avoid_die When true, a disallowed comment will result in the function + * returning a WP_Error object, rather than executing wp_die(). + * Default false. + * @return int|string|WP_Error Allowed comments return the approval status (0|1|'spam'|'trash'). + * If `$avoid_die` is true, disallowed comments return a WP_Error. + */ +function wp_allow_comment( $commentdata, $avoid_die = false ) { + global $wpdb; + + // Simple duplicate check. + // expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content) + $dupe = $wpdb->prepare( + "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = %s AND comment_approved != 'trash' AND ( comment_author = %s ", + wp_unslash( $commentdata['comment_post_ID'] ), + wp_unslash( $commentdata['comment_parent'] ), + wp_unslash( $commentdata['comment_author'] ) + ); + if ( $commentdata['comment_author_email'] ) { + $dupe .= $wpdb->prepare( + 'AND comment_author_email = %s ', + wp_unslash( $commentdata['comment_author_email'] ) + ); + } + $dupe .= $wpdb->prepare( + ') AND comment_content = %s LIMIT 1', + wp_unslash( $commentdata['comment_content'] ) + ); + + $dupe_id = $wpdb->get_var( $dupe ); + + /** + * Filters the ID, if any, of the duplicate comment found when creating a new comment. + * + * Return an empty value from this filter to allow what WP considers a duplicate comment. + * + * @since 4.4.0 + * + * @param int $dupe_id ID of the comment identified as a duplicate. + * @param array $commentdata Data for the comment being created. + */ + $dupe_id = apply_filters( 'duplicate_comment_id', $dupe_id, $commentdata ); + + if ( $dupe_id ) { + /** + * Fires immediately after a duplicate comment is detected. + * + * @since 3.0.0 + * + * @param array $commentdata Comment data. + */ + do_action( 'comment_duplicate_trigger', $commentdata ); + + /** + * Filters duplicate comment error message. + * + * @since 5.2.0 + * + * @param string $comment_duplicate_message Duplicate comment error message. + */ + $comment_duplicate_message = apply_filters( 'comment_duplicate_message', __( 'Duplicate comment detected; it looks as though you’ve already said that!' ) ); + + if ( true === $avoid_die ) { + return new WP_Error( 'comment_duplicate', $comment_duplicate_message, 409 ); + } else { + if ( wp_doing_ajax() ) { + die( $comment_duplicate_message ); + } + + wp_die( $comment_duplicate_message, 409 ); + } + } + + /** + * Fires immediately before a comment is marked approved. + * + * Allows checking for comment flooding. + * + * @since 2.3.0 + * @since 4.7.0 The `$avoid_die` parameter was added. + * + * @param string $comment_author_IP Comment author's IP address. + * @param string $comment_author_email Comment author's email. + * @param string $comment_date_gmt GMT date the comment was posted. + * @param bool $avoid_die Whether to prevent executing wp_die() + * or die() if a comment flood is occurring. + */ + do_action( + 'check_comment_flood', + $commentdata['comment_author_IP'], + $commentdata['comment_author_email'], + $commentdata['comment_date_gmt'], + $avoid_die + ); + + /** + * Filters whether a comment is part of a comment flood. + * + * The default check is wp_check_comment_flood(). See check_comment_flood_db(). + * + * @since 4.7.0 + * + * @param bool $is_flood Is a comment flooding occurring? Default false. + * @param string $comment_author_IP Comment author's IP address. + * @param string $comment_author_email Comment author's email. + * @param string $comment_date_gmt GMT date the comment was posted. + * @param bool $avoid_die Whether to prevent executing wp_die() + * or die() if a comment flood is occurring. + */ + $is_flood = apply_filters( + 'wp_is_comment_flood', + false, + $commentdata['comment_author_IP'], + $commentdata['comment_author_email'], + $commentdata['comment_date_gmt'], + $avoid_die + ); + + if ( $is_flood ) { + /** This filter is documented in wp-includes/comment-template.php */ + $comment_flood_message = apply_filters( 'comment_flood_message', __( 'You are posting comments too quickly. Slow down.' ) ); + + return new WP_Error( 'comment_flood', $comment_flood_message, 429 ); + } + + if ( ! empty( $commentdata['user_id'] ) ) { + $user = get_userdata( $commentdata['user_id'] ); + $post_author = $wpdb->get_var( + $wpdb->prepare( + "SELECT post_author FROM $wpdb->posts WHERE ID = %d LIMIT 1", + $commentdata['comment_post_ID'] + ) + ); + } + + if ( isset( $user ) && ( $commentdata['user_id'] == $post_author || $user->has_cap( 'moderate_comments' ) ) ) { + // The author and the admins get respect. + $approved = 1; + } else { + // Everyone else's comments will be checked. + if ( check_comment( + $commentdata['comment_author'], + $commentdata['comment_author_email'], + $commentdata['comment_author_url'], + $commentdata['comment_content'], + $commentdata['comment_author_IP'], + $commentdata['comment_agent'], + $commentdata['comment_type'] + ) ) { + $approved = 1; + } else { + $approved = 0; + } + + if ( wp_blacklist_check( + $commentdata['comment_author'], + $commentdata['comment_author_email'], + $commentdata['comment_author_url'], + $commentdata['comment_content'], + $commentdata['comment_author_IP'], + $commentdata['comment_agent'] + ) ) { + $approved = EMPTY_TRASH_DAYS ? 'trash' : 'spam'; + } + } + + /** + * Filters a comment's approval status before it is set. + * + * @since 2.1.0 + * @since 4.9.0 Returning a WP_Error value from the filter will shortcircuit comment insertion + * and allow skipping further processing. + * + * @param int|string|WP_Error $approved The approval status. Accepts 1, 0, 'spam', 'trash', + * or WP_Error. + * @param array $commentdata Comment data. + */ + return apply_filters( 'pre_comment_approved', $approved, $commentdata ); +} + +/** + * Hooks WP's native database-based comment-flood check. + * + * This wrapper maintains backward compatibility with plugins that expect to + * be able to unhook the legacy check_comment_flood_db() function from + * 'check_comment_flood' using remove_action(). + * + * @since 2.3.0 + * @since 4.7.0 Converted to be an add_filter() wrapper. + */ +function check_comment_flood_db() { + add_filter( 'wp_is_comment_flood', 'wp_check_comment_flood', 10, 5 ); +} + +/** + * Checks whether comment flooding is occurring. + * + * Won't run, if current user can manage options, so to not block + * administrators. + * + * @since 4.7.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param bool $is_flood Is a comment flooding occurring? + * @param string $ip Comment author's IP address. + * @param string $email Comment author's email address. + * @param string $date MySQL time string. + * @param bool $avoid_die When true, a disallowed comment will result in the function + * returning a WP_Error object, rather than executing wp_die(). + * Default false. + * @return bool Whether comment flooding is occurring. + */ +function wp_check_comment_flood( $is_flood, $ip, $email, $date, $avoid_die = false ) { + + global $wpdb; + + // Another callback has declared a flood. Trust it. + if ( true === $is_flood ) { + return $is_flood; + } + + // Don't throttle admins or moderators. + if ( current_user_can( 'manage_options' ) || current_user_can( 'moderate_comments' ) ) { + return false; + } + $hour_ago = gmdate( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS ); + + if ( is_user_logged_in() ) { + $user = get_current_user_id(); + $check_column = '`user_id`'; + } else { + $user = $ip; + $check_column = '`comment_author_IP`'; + } + + $sql = $wpdb->prepare( + "SELECT `comment_date_gmt` FROM `$wpdb->comments` WHERE `comment_date_gmt` >= %s AND ( $check_column = %s OR `comment_author_email` = %s ) ORDER BY `comment_date_gmt` DESC LIMIT 1", + $hour_ago, + $user, + $email + ); + $lasttime = $wpdb->get_var( $sql ); + if ( $lasttime ) { + $time_lastcomment = mysql2date( 'U', $lasttime, false ); + $time_newcomment = mysql2date( 'U', $date, false ); + /** + * Filters the comment flood status. + * + * @since 2.1.0 + * + * @param bool $bool Whether a comment flood is occurring. Default false. + * @param int $time_lastcomment Timestamp of when the last comment was posted. + * @param int $time_newcomment Timestamp of when the new comment was posted. + */ + $flood_die = apply_filters( 'comment_flood_filter', false, $time_lastcomment, $time_newcomment ); + if ( $flood_die ) { + /** + * Fires before the comment flood message is triggered. + * + * @since 1.5.0 + * + * @param int $time_lastcomment Timestamp of when the last comment was posted. + * @param int $time_newcomment Timestamp of when the new comment was posted. + */ + do_action( 'comment_flood_trigger', $time_lastcomment, $time_newcomment ); + + if ( true === $avoid_die ) { + return true; + } else { + /** + * Filters the comment flood error message. + * + * @since 5.2.0 + * + * @param string $comment_flood_message Comment flood error message. + */ + $comment_flood_message = apply_filters( 'comment_flood_message', __( 'You are posting comments too quickly. Slow down.' ) ); + + if ( wp_doing_ajax() ) { + die( $comment_flood_message ); + } + + wp_die( $comment_flood_message, 429 ); + } + } + } + + return false; +} + +/** + * Separates an array of comments into an array keyed by comment_type. + * + * @since 2.7.0 + * + * @param WP_Comment[] $comments Array of comments + * @return WP_Comment[] Array of comments keyed by comment_type. + */ +function separate_comments( &$comments ) { + $comments_by_type = array( + 'comment' => array(), + 'trackback' => array(), + 'pingback' => array(), + 'pings' => array(), + ); + $count = count( $comments ); + for ( $i = 0; $i < $count; $i++ ) { + $type = $comments[ $i ]->comment_type; + if ( empty( $type ) ) { + $type = 'comment'; + } + $comments_by_type[ $type ][] = &$comments[ $i ]; + if ( 'trackback' == $type || 'pingback' == $type ) { + $comments_by_type['pings'][] = &$comments[ $i ]; + } + } + + return $comments_by_type; +} + +/** + * Calculate the total number of comment pages. + * + * @since 2.7.0 + * + * @uses Walker_Comment + * + * @global WP_Query $wp_query WordPress Query object. + * + * @param WP_Comment[] $comments Optional. Array of WP_Comment objects. Defaults to $wp_query->comments. + * @param int $per_page Optional. Comments per page. + * @param bool $threaded Optional. Control over flat or threaded comments. + * @return int Number of comment pages. + */ +function get_comment_pages_count( $comments = null, $per_page = null, $threaded = null ) { + global $wp_query; + + if ( null === $comments && null === $per_page && null === $threaded && ! empty( $wp_query->max_num_comment_pages ) ) { + return $wp_query->max_num_comment_pages; + } + + if ( ( ! $comments || ! is_array( $comments ) ) && ! empty( $wp_query->comments ) ) { + $comments = $wp_query->comments; + } + + if ( empty( $comments ) ) { + return 0; + } + + if ( ! get_option( 'page_comments' ) ) { + return 1; + } + + if ( ! isset( $per_page ) ) { + $per_page = (int) get_query_var( 'comments_per_page' ); + } + if ( 0 === $per_page ) { + $per_page = (int) get_option( 'comments_per_page' ); + } + if ( 0 === $per_page ) { + return 1; + } + + if ( ! isset( $threaded ) ) { + $threaded = get_option( 'thread_comments' ); + } + + if ( $threaded ) { + $walker = new Walker_Comment; + $count = ceil( $walker->get_number_of_root_elements( $comments ) / $per_page ); + } else { + $count = ceil( count( $comments ) / $per_page ); + } + + return $count; +} + +/** + * Calculate what page number a comment will appear on for comment paging. + * + * @since 2.7.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $comment_ID Comment ID. + * @param array $args { + * Array of optional arguments. + * @type string $type Limit paginated comments to those matching a given type. Accepts 'comment', + * 'trackback', 'pingback', 'pings' (trackbacks and pingbacks), or 'all'. + * Default is 'all'. + * @type int $per_page Per-page count to use when calculating pagination. Defaults to the value of the + * 'comments_per_page' option. + * @type int|string $max_depth If greater than 1, comment page will be determined for the top-level parent of + * `$comment_ID`. Defaults to the value of the 'thread_comments_depth' option. + * } * + * @return int|null Comment page number or null on error. + */ +function get_page_of_comment( $comment_ID, $args = array() ) { + global $wpdb; + + $page = null; + + $comment = get_comment( $comment_ID ); + if ( ! $comment ) { + return; + } + + $defaults = array( + 'type' => 'all', + 'page' => '', + 'per_page' => '', + 'max_depth' => '', + ); + $args = wp_parse_args( $args, $defaults ); + $original_args = $args; + + // Order of precedence: 1. `$args['per_page']`, 2. 'comments_per_page' query_var, 3. 'comments_per_page' option. + if ( get_option( 'page_comments' ) ) { + if ( '' === $args['per_page'] ) { + $args['per_page'] = get_query_var( 'comments_per_page' ); + } + + if ( '' === $args['per_page'] ) { + $args['per_page'] = get_option( 'comments_per_page' ); + } + } + + if ( empty( $args['per_page'] ) ) { + $args['per_page'] = 0; + $args['page'] = 0; + } + + if ( $args['per_page'] < 1 ) { + $page = 1; + } + + if ( null === $page ) { + if ( '' === $args['max_depth'] ) { + if ( get_option( 'thread_comments' ) ) { + $args['max_depth'] = get_option( 'thread_comments_depth' ); + } else { + $args['max_depth'] = -1; + } + } + + // Find this comment's top-level parent if threading is enabled. + if ( $args['max_depth'] > 1 && 0 != $comment->comment_parent ) { + return get_page_of_comment( $comment->comment_parent, $args ); + } + + $comment_args = array( + 'type' => $args['type'], + 'post_id' => $comment->comment_post_ID, + 'fields' => 'ids', + 'count' => true, + 'status' => 'approve', + 'parent' => 0, + 'date_query' => array( + array( + 'column' => "$wpdb->comments.comment_date_gmt", + 'before' => $comment->comment_date_gmt, + ), + ), + ); + + $comment_query = new WP_Comment_Query(); + $older_comment_count = $comment_query->query( $comment_args ); + + // No older comments? Then it's page #1. + if ( 0 == $older_comment_count ) { + $page = 1; + + // Divide comments older than this one by comments per page to get this comment's page number. + } else { + $page = ceil( ( $older_comment_count + 1 ) / $args['per_page'] ); + } + } + + /** + * Filters the calculated page on which a comment appears. + * + * @since 4.4.0 + * @since 4.7.0 Introduced the `$comment_ID` parameter. + * + * @param int $page Comment page. + * @param array $args { + * Arguments used to calculate pagination. These include arguments auto-detected by the function, + * based on query vars, system settings, etc. For pristine arguments passed to the function, + * see `$original_args`. + * + * @type string $type Type of comments to count. + * @type int $page Calculated current page. + * @type int $per_page Calculated number of comments per page. + * @type int $max_depth Maximum comment threading depth allowed. + * } + * @param array $original_args { + * Array of arguments passed to the function. Some or all of these may not be set. + * + * @type string $type Type of comments to count. + * @type int $page Current comment page. + * @type int $per_page Number of comments per page. + * @type int $max_depth Maximum comment threading depth allowed. + * } + * @param int $comment_ID ID of the comment. + */ + return apply_filters( 'get_page_of_comment', (int) $page, $args, $original_args, $comment_ID ); +} + +/** + * Retrieves the maximum character lengths for the comment form fields. + * + * @since 4.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @return int[] Array of maximum lengths keyed by field name. + */ +function wp_get_comment_fields_max_lengths() { + global $wpdb; + + $lengths = array( + 'comment_author' => 245, + 'comment_author_email' => 100, + 'comment_author_url' => 200, + 'comment_content' => 65525, + ); + + if ( $wpdb->is_mysql ) { + foreach ( $lengths as $column => $length ) { + $col_length = $wpdb->get_col_length( $wpdb->comments, $column ); + $max_length = 0; + + // No point if we can't get the DB column lengths. + if ( is_wp_error( $col_length ) ) { + break; + } + + if ( ! is_array( $col_length ) && (int) $col_length > 0 ) { + $max_length = (int) $col_length; + } elseif ( is_array( $col_length ) && isset( $col_length['length'] ) && intval( $col_length['length'] ) > 0 ) { + $max_length = (int) $col_length['length']; + + if ( ! empty( $col_length['type'] ) && 'byte' === $col_length['type'] ) { + $max_length = $max_length - 10; + } + } + + if ( $max_length > 0 ) { + $lengths[ $column ] = $max_length; + } + } + } + + /** + * Filters the lengths for the comment form fields. + * + * @since 4.5.0 + * + * @param int[] $lengths Array of maximum lengths keyed by field name. + */ + return apply_filters( 'wp_get_comment_fields_max_lengths', $lengths ); +} + +/** + * Compares the lengths of comment data against the maximum character limits. + * + * @since 4.7.0 + * + * @param array $comment_data Array of arguments for inserting a comment. + * @return WP_Error|true WP_Error when a comment field exceeds the limit, + * otherwise true. + */ +function wp_check_comment_data_max_lengths( $comment_data ) { + $max_lengths = wp_get_comment_fields_max_lengths(); + + if ( isset( $comment_data['comment_author'] ) && mb_strlen( $comment_data['comment_author'], '8bit' ) > $max_lengths['comment_author'] ) { + return new WP_Error( 'comment_author_column_length', __( 'Error: Your name is too long.' ), 200 ); + } + + if ( isset( $comment_data['comment_author_email'] ) && strlen( $comment_data['comment_author_email'] ) > $max_lengths['comment_author_email'] ) { + return new WP_Error( 'comment_author_email_column_length', __( 'Error: Your email address is too long.' ), 200 ); + } + + if ( isset( $comment_data['comment_author_url'] ) && strlen( $comment_data['comment_author_url'] ) > $max_lengths['comment_author_url'] ) { + return new WP_Error( 'comment_author_url_column_length', __( 'Error: Your URL is too long.' ), 200 ); + } + + if ( isset( $comment_data['comment_content'] ) && mb_strlen( $comment_data['comment_content'], '8bit' ) > $max_lengths['comment_content'] ) { + return new WP_Error( 'comment_content_column_length', __( 'Error: Your comment is too long.' ), 200 ); + } + + return true; +} + +/** + * Does comment contain blacklisted characters or words. + * + * @since 1.5.0 + * + * @param string $author The author of the comment + * @param string $email The email of the comment + * @param string $url The url used in the comment + * @param string $comment The comment content + * @param string $user_ip The comment author's IP address + * @param string $user_agent The author's browser user agent + * @return bool True if comment contains blacklisted content, false if comment does not + */ +function wp_blacklist_check( $author, $email, $url, $comment, $user_ip, $user_agent ) { + /** + * Fires before the comment is tested for blacklisted characters or words. + * + * @since 1.5.0 + * + * @param string $author Comment author. + * @param string $email Comment author's email. + * @param string $url Comment author's URL. + * @param string $comment Comment content. + * @param string $user_ip Comment author's IP address. + * @param string $user_agent Comment author's browser user agent. + */ + do_action( 'wp_blacklist_check', $author, $email, $url, $comment, $user_ip, $user_agent ); + + $mod_keys = trim( get_option( 'blacklist_keys' ) ); + if ( '' == $mod_keys ) { + return false; // If moderation keys are empty. + } + + // Ensure HTML tags are not being used to bypass the blacklist. + $comment_without_html = wp_strip_all_tags( $comment ); + + $words = explode( "\n", $mod_keys ); + + foreach ( (array) $words as $word ) { + $word = trim( $word ); + + // Skip empty lines. + if ( empty( $word ) ) { + continue; } + + // Do some escaping magic so that '#' chars + // in the spam words don't break things: + $word = preg_quote( $word, '#' ); + + $pattern = "#$word#i"; + if ( preg_match( $pattern, $author ) + || preg_match( $pattern, $email ) + || preg_match( $pattern, $url ) + || preg_match( $pattern, $comment ) + || preg_match( $pattern, $comment_without_html ) + || preg_match( $pattern, $user_ip ) + || preg_match( $pattern, $user_agent ) + ) { + return true; + } + } + return false; +} + +/** + * Retrieves the total comment counts for the whole site or a single post. + * + * The comment stats are cached and then retrieved, if they already exist in the + * cache. + * + * @see get_comment_count() Which handles fetching the live comment counts. + * + * @since 2.5.0 + * + * @param int $post_id Optional. Restrict the comment counts to the given post. Default 0, which indicates that + * comment counts for the whole site will be retrieved. + * @return stdClass { + * The number of comments keyed by their status. + * + * @type int|string $approved The number of approved comments. + * @type int|string $moderated The number of comments awaiting moderation (a.k.a. pending). + * @type int|string $spam The number of spam comments. + * @type int|string $trash The number of trashed comments. + * @type int|string $post-trashed The number of comments for posts that are in the trash. + * @type int $total_comments The total number of non-trashed comments, including spam. + * @type int $all The total number of pending or approved comments. + * } + */ +function wp_count_comments( $post_id = 0 ) { + $post_id = (int) $post_id; + + /** + * Filters the comments count for a given post or the whole site. + * + * @since 2.7.0 + * + * @param array|stdClass $count An empty array or an object containing comment counts. + * @param int $post_id The post ID. Can be 0 to represent the whole site. + */ + $filtered = apply_filters( 'wp_count_comments', array(), $post_id ); + if ( ! empty( $filtered ) ) { + return $filtered; + } + + $count = wp_cache_get( "comments-{$post_id}", 'counts' ); + if ( false !== $count ) { + return $count; + } + + $stats = get_comment_count( $post_id ); + $stats['moderated'] = $stats['awaiting_moderation']; + unset( $stats['awaiting_moderation'] ); + + $stats_object = (object) $stats; + wp_cache_set( "comments-{$post_id}", $stats_object, 'counts' ); + + return $stats_object; +} + +/** + * Trashes or deletes a comment. + * + * The comment is moved to Trash instead of permanently deleted unless Trash is + * disabled, item is already in the Trash, or $force_delete is true. + * + * The post comment count will be updated if the comment was approved and has a + * post ID available. + * + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. + * @param bool $force_delete Whether to bypass Trash and force deletion. Default is false. + * @return bool True on success, false on failure. + */ +function wp_delete_comment( $comment_id, $force_delete = false ) { + global $wpdb; + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + return false; + } + + if ( ! $force_delete && EMPTY_TRASH_DAYS && ! in_array( wp_get_comment_status( $comment ), array( 'trash', 'spam' ) ) ) { + return wp_trash_comment( $comment_id ); + } + + /** + * Fires immediately before a comment is deleted from the database. + * + * @since 1.2.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The comment to be deleted. + */ + do_action( 'delete_comment', $comment->comment_ID, $comment ); + + // Move children up a level. + $children = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_parent = %d", $comment->comment_ID ) ); + if ( ! empty( $children ) ) { + $wpdb->update( $wpdb->comments, array( 'comment_parent' => $comment->comment_parent ), array( 'comment_parent' => $comment->comment_ID ) ); + clean_comment_cache( $children ); + } + + // Delete metadata. + $meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->commentmeta WHERE comment_id = %d", $comment->comment_ID ) ); + foreach ( $meta_ids as $mid ) { + delete_metadata_by_mid( 'comment', $mid ); + } + + if ( ! $wpdb->delete( $wpdb->comments, array( 'comment_ID' => $comment->comment_ID ) ) ) { + return false; + } + + /** + * Fires immediately after a comment is deleted from the database. + * + * @since 2.9.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The deleted comment. + */ + do_action( 'deleted_comment', $comment->comment_ID, $comment ); + + $post_id = $comment->comment_post_ID; + if ( $post_id && 1 == $comment->comment_approved ) { + wp_update_comment_count( $post_id ); + } + + clean_comment_cache( $comment->comment_ID ); + + /** This action is documented in wp-includes/comment.php */ + do_action( 'wp_set_comment_status', $comment->comment_ID, 'delete' ); + + wp_transition_comment_status( 'delete', $comment->comment_approved, $comment ); + return true; +} + +/** + * Moves a comment to the Trash + * + * If Trash is disabled, comment is permanently deleted. + * + * @since 2.9.0 + * + * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. + * @return bool True on success, false on failure. + */ +function wp_trash_comment( $comment_id ) { + if ( ! EMPTY_TRASH_DAYS ) { + return wp_delete_comment( $comment_id, true ); + } + + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + return false; + } + + /** + * Fires immediately before a comment is sent to the Trash. + * + * @since 2.9.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The comment to be trashed. + */ + do_action( 'trash_comment', $comment->comment_ID, $comment ); + + if ( wp_set_comment_status( $comment, 'trash' ) ) { + delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); + delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); + add_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved ); + add_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() ); + + /** + * Fires immediately after a comment is sent to Trash. + * + * @since 2.9.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The trashed comment. + */ + do_action( 'trashed_comment', $comment->comment_ID, $comment ); + return true; + } + + return false; +} + +/** + * Removes a comment from the Trash + * + * @since 2.9.0 + * + * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. + * @return bool True on success, false on failure. + */ +function wp_untrash_comment( $comment_id ) { + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + return false; + } + + /** + * Fires immediately before a comment is restored from the Trash. + * + * @since 2.9.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The comment to be untrashed. + */ + do_action( 'untrash_comment', $comment->comment_ID, $comment ); + + $status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ); + if ( empty( $status ) ) { + $status = '0'; + } + + if ( wp_set_comment_status( $comment, $status ) ) { + delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); + delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); + /** + * Fires immediately after a comment is restored from the Trash. + * + * @since 2.9.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The untrashed comment. + */ + do_action( 'untrashed_comment', $comment->comment_ID, $comment ); + return true; + } + + return false; +} + +/** + * Marks a comment as Spam + * + * @since 2.9.0 + * + * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. + * @return bool True on success, false on failure. + */ +function wp_spam_comment( $comment_id ) { + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + return false; + } + + /** + * Fires immediately before a comment is marked as Spam. + * + * @since 2.9.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The comment to be marked as spam. + */ + do_action( 'spam_comment', $comment->comment_ID, $comment ); + + if ( wp_set_comment_status( $comment, 'spam' ) ) { + delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); + delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); + add_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved ); + add_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() ); + /** + * Fires immediately after a comment is marked as Spam. + * + * @since 2.9.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The comment marked as spam. + */ + do_action( 'spammed_comment', $comment->comment_ID, $comment ); + return true; + } + + return false; +} + +/** + * Removes a comment from the Spam + * + * @since 2.9.0 + * + * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. + * @return bool True on success, false on failure. + */ +function wp_unspam_comment( $comment_id ) { + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + return false; + } + + /** + * Fires immediately before a comment is unmarked as Spam. + * + * @since 2.9.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The comment to be unmarked as spam. + */ + do_action( 'unspam_comment', $comment->comment_ID, $comment ); + + $status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ); + if ( empty( $status ) ) { + $status = '0'; + } + + if ( wp_set_comment_status( $comment, $status ) ) { + delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); + delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); + /** + * Fires immediately after a comment is unmarked as Spam. + * + * @since 2.9.0 + * @since 4.9.0 Added the `$comment` parameter. + * + * @param int $comment_id The comment ID. + * @param WP_Comment $comment The comment unmarked as spam. + */ + do_action( 'unspammed_comment', $comment->comment_ID, $comment ); + return true; + } + + return false; +} + +/** + * The status of a comment by ID. + * + * @since 1.0.0 + * + * @param int|WP_Comment $comment_id Comment ID or WP_Comment object + * @return string|false Status might be 'trash', 'approved', 'unapproved', 'spam'. False on failure. + */ +function wp_get_comment_status( $comment_id ) { + $comment = get_comment( $comment_id ); + if ( ! $comment ) { + return false; + } + + $approved = $comment->comment_approved; + + if ( null == $approved ) { + return false; + } elseif ( '1' == $approved ) { + return 'approved'; + } elseif ( '0' == $approved ) { + return 'unapproved'; + } elseif ( 'spam' == $approved ) { + return 'spam'; + } elseif ( 'trash' == $approved ) { + return 'trash'; + } else { + return false; + } +} + +/** + * Call hooks for when a comment status transition occurs. + * + * Calls hooks for comment status transitions. If the new comment status is not the same + * as the previous comment status, then two hooks will be ran, the first is + * {@see 'transition_comment_status'} with new status, old status, and comment data. + * The next action called is {@see 'comment_$old_status_to_$new_status'}. It has + * the comment data. + * + * The final action will run whether or not the comment statuses are the same. + * The action is named {@see 'comment_$new_status_$comment->comment_type'}. + * + * @since 2.7.0 + * + * @param string $new_status New comment status. + * @param string $old_status Previous comment status. + * @param WP_Comment $comment Comment object. + */ +function wp_transition_comment_status( $new_status, $old_status, $comment ) { + /* + * Translate raw statuses to human-readable formats for the hooks. + * This is not a complete list of comment status, it's only the ones + * that need to be renamed. + */ + $comment_statuses = array( + 0 => 'unapproved', + 'hold' => 'unapproved', // wp_set_comment_status() uses "hold". + 1 => 'approved', + 'approve' => 'approved', // wp_set_comment_status() uses "approve". + ); + if ( isset( $comment_statuses[ $new_status ] ) ) { + $new_status = $comment_statuses[ $new_status ]; + } + if ( isset( $comment_statuses[ $old_status ] ) ) { + $old_status = $comment_statuses[ $old_status ]; + } + + // Call the hooks. + if ( $new_status != $old_status ) { + /** + * Fires when the comment status is in transition. + * + * @since 2.7.0 + * + * @param int|string $new_status The new comment status. + * @param int|string $old_status The old comment status. + * @param WP_Comment $comment Comment object. + */ + do_action( 'transition_comment_status', $new_status, $old_status, $comment ); + /** + * Fires when the comment status is in transition from one specific status to another. + * + * The dynamic portions of the hook name, `$old_status`, and `$new_status`, + * refer to the old and new comment statuses, respectively. + * + * @since 2.7.0 + * + * @param WP_Comment $comment Comment object. + */ + do_action( "comment_{$old_status}_to_{$new_status}", $comment ); + } + /** + * Fires when the status of a specific comment type is in transition. + * + * The dynamic portions of the hook name, `$new_status`, and `$comment->comment_type`, + * refer to the new comment status, and the type of comment, respectively. + * + * Typical comment types include an empty string (standard comment), 'pingback', + * or 'trackback'. + * + * @since 2.7.0 + * + * @param int $comment_ID The comment ID. + * @param WP_Comment $comment Comment object. + */ + do_action( "comment_{$new_status}_{$comment->comment_type}", $comment->comment_ID, $comment ); +} + +/** + * Clear the lastcommentmodified cached value when a comment status is changed. + * + * Deletes the lastcommentmodified cache key when a comment enters or leaves + * 'approved' status. + * + * @since 4.7.0 + * @access private + * + * @param string $new_status The new comment status. + * @param string $old_status The old comment status. + */ +function _clear_modified_cache_on_transition_comment_status( $new_status, $old_status ) { + if ( 'approved' === $new_status || 'approved' === $old_status ) { + foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) { + wp_cache_delete( "lastcommentmodified:$timezone", 'timeinfo' ); + } + } +} + +/** + * Get current commenter's name, email, and URL. + * + * Expects cookies content to already be sanitized. User of this function might + * wish to recheck the returned array for validity. + * + * @see sanitize_comment_cookies() Use to sanitize cookies + * + * @since 2.0.4 + * + * @return array { + * An array of current commenter variables. + * + * @type string $comment_author The name of the current commenter, or an empty string. + * @type string $comment_author_email The email address of the current commenter, or an empty string. + * @type string $comment_author_url The URL address of the current commenter, or an empty string. + * } + */ +function wp_get_current_commenter() { + // Cookies should already be sanitized. + + $comment_author = ''; + if ( isset( $_COOKIE[ 'comment_author_' . COOKIEHASH ] ) ) { + $comment_author = $_COOKIE[ 'comment_author_' . COOKIEHASH ]; + } + + $comment_author_email = ''; + if ( isset( $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ) ) { + $comment_author_email = $_COOKIE[ 'comment_author_email_' . COOKIEHASH ]; + } + + $comment_author_url = ''; + if ( isset( $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] ) ) { + $comment_author_url = $_COOKIE[ 'comment_author_url_' . COOKIEHASH ]; + } + + /** + * Filters the current commenter's name, email, and URL. + * + * @since 3.1.0 + * + * @param array $comment_author_data { + * An array of current commenter variables. + * + * @type string $comment_author The name of the current commenter, or an empty string. + * @type string $comment_author_email The email address of the current commenter, or an empty string. + * @type string $comment_author_url The URL address of the current commenter, or an empty string. + * } + */ + return apply_filters( 'wp_get_current_commenter', compact( 'comment_author', 'comment_author_email', 'comment_author_url' ) ); +} + +/** + * Get unapproved comment author's email. + * + * Used to allow the commenter to see their pending comment. + * + * @since 5.1.0 + * + * @return string The unapproved comment author's email (when supplied). + */ +function wp_get_unapproved_comment_author_email() { + $commenter_email = ''; + + if ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) { + $comment_id = (int) $_GET['unapproved']; + $comment = get_comment( $comment_id ); + + if ( $comment && hash_equals( $_GET['moderation-hash'], wp_hash( $comment->comment_date_gmt ) ) ) { + // The comment will only be viewable by the comment author for 1 minute. + $comment_preview_expires = strtotime( $comment->comment_date_gmt . '+1 minute' ); + + if ( time() < $comment_preview_expires ) { + $commenter_email = $comment->comment_author_email; + } + } + } + + if ( ! $commenter_email ) { + $commenter = wp_get_current_commenter(); + $commenter_email = $commenter['comment_author_email']; + } + + return $commenter_email; +} + +/** + * Inserts a comment into the database. + * + * @since 2.0.0 + * @since 4.4.0 Introduced `$comment_meta` argument. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $commentdata { + * Array of arguments for inserting a new comment. + * + * @type string $comment_agent The HTTP user agent of the `$comment_author` when + * the comment was submitted. Default empty. + * @type int|string $comment_approved Whether the comment has been approved. Default 1. + * @type string $comment_author The name of the author of the comment. Default empty. + * @type string $comment_author_email The email address of the `$comment_author`. Default empty. + * @type string $comment_author_IP The IP address of the `$comment_author`. Default empty. + * @type string $comment_author_url The URL address of the `$comment_author`. Default empty. + * @type string $comment_content The content of the comment. Default empty. + * @type string $comment_date The date the comment was submitted. To set the date + * manually, `$comment_date_gmt` must also be specified. + * Default is the current time. + * @type string $comment_date_gmt The date the comment was submitted in the GMT timezone. + * Default is `$comment_date` in the site's GMT timezone. + * @type int $comment_karma The karma of the comment. Default 0. + * @type int $comment_parent ID of this comment's parent, if any. Default 0. + * @type int $comment_post_ID ID of the post that relates to the comment, if any. + * Default 0. + * @type string $comment_type Comment type. Default empty. + * @type array $comment_meta Optional. Array of key/value pairs to be stored in commentmeta for the + * new comment. + * @type int $user_id ID of the user who submitted the comment. Default 0. + * } + * @return int|false The new comment's ID on success, false on failure. + */ +function wp_insert_comment( $commentdata ) { + global $wpdb; + $data = wp_unslash( $commentdata ); + + $comment_author = ! isset( $data['comment_author'] ) ? '' : $data['comment_author']; + $comment_author_email = ! isset( $data['comment_author_email'] ) ? '' : $data['comment_author_email']; + $comment_author_url = ! isset( $data['comment_author_url'] ) ? '' : $data['comment_author_url']; + $comment_author_IP = ! isset( $data['comment_author_IP'] ) ? '' : $data['comment_author_IP']; + + $comment_date = ! isset( $data['comment_date'] ) ? current_time( 'mysql' ) : $data['comment_date']; + $comment_date_gmt = ! isset( $data['comment_date_gmt'] ) ? get_gmt_from_date( $comment_date ) : $data['comment_date_gmt']; + + $comment_post_ID = ! isset( $data['comment_post_ID'] ) ? 0 : $data['comment_post_ID']; + $comment_content = ! isset( $data['comment_content'] ) ? '' : $data['comment_content']; + $comment_karma = ! isset( $data['comment_karma'] ) ? 0 : $data['comment_karma']; + $comment_approved = ! isset( $data['comment_approved'] ) ? 1 : $data['comment_approved']; + $comment_agent = ! isset( $data['comment_agent'] ) ? '' : $data['comment_agent']; + $comment_type = ! isset( $data['comment_type'] ) ? '' : $data['comment_type']; + $comment_parent = ! isset( $data['comment_parent'] ) ? 0 : $data['comment_parent']; + + $user_id = ! isset( $data['user_id'] ) ? 0 : $data['user_id']; + + $compacted = compact( 'comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_date', 'comment_date_gmt', 'comment_content', 'comment_karma', 'comment_approved', 'comment_agent', 'comment_type', 'comment_parent', 'user_id' ); + if ( ! $wpdb->insert( $wpdb->comments, $compacted ) ) { + return false; + } + + $id = (int) $wpdb->insert_id; + + if ( 1 == $comment_approved ) { + wp_update_comment_count( $comment_post_ID ); + + foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) { + wp_cache_delete( "lastcommentmodified:$timezone", 'timeinfo' ); + } + } + + clean_comment_cache( $id ); + + $comment = get_comment( $id ); + + // If metadata is provided, store it. + if ( isset( $commentdata['comment_meta'] ) && is_array( $commentdata['comment_meta'] ) ) { + foreach ( $commentdata['comment_meta'] as $meta_key => $meta_value ) { + add_comment_meta( $comment->comment_ID, $meta_key, $meta_value, true ); + } + } + + /** + * Fires immediately after a comment is inserted into the database. + * + * @since 2.8.0 + * + * @param int $id The comment ID. + * @param WP_Comment $comment Comment object. + */ + do_action( 'wp_insert_comment', $id, $comment ); + + return $id; +} + +/** + * Filters and sanitizes comment data. + * + * Sets the comment data 'filtered' field to true when finished. This can be + * checked as to whether the comment should be filtered and to keep from + * filtering the same comment more than once. + * + * @since 2.0.0 + * + * @param array $commentdata Contains information on the comment. + * @return array Parsed comment information. + */ +function wp_filter_comment( $commentdata ) { + if ( isset( $commentdata['user_ID'] ) ) { + /** + * Filters the comment author's user id before it is set. + * + * The first time this filter is evaluated, 'user_ID' is checked + * (for back-compat), followed by the standard 'user_id' value. + * + * @since 1.5.0 + * + * @param int $user_ID The comment author's user ID. + */ + $commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_ID'] ); + } elseif ( isset( $commentdata['user_id'] ) ) { + /** This filter is documented in wp-includes/comment.php */ + $commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_id'] ); + } + + /** + * Filters the comment author's browser user agent before it is set. + * + * @since 1.5.0 + * + * @param string $comment_agent The comment author's browser user agent. + */ + $commentdata['comment_agent'] = apply_filters( 'pre_comment_user_agent', ( isset( $commentdata['comment_agent'] ) ? $commentdata['comment_agent'] : '' ) ); + /** This filter is documented in wp-includes/comment.php */ + $commentdata['comment_author'] = apply_filters( 'pre_comment_author_name', $commentdata['comment_author'] ); + /** + * Filters the comment content before it is set. + * + * @since 1.5.0 + * + * @param string $comment_content The comment content. + */ + $commentdata['comment_content'] = apply_filters( 'pre_comment_content', $commentdata['comment_content'] ); + /** + * Filters the comment author's IP address before it is set. + * + * @since 1.5.0 + * + * @param string $comment_author_ip The comment author's IP address. + */ + $commentdata['comment_author_IP'] = apply_filters( 'pre_comment_user_ip', $commentdata['comment_author_IP'] ); + /** This filter is documented in wp-includes/comment.php */ + $commentdata['comment_author_url'] = apply_filters( 'pre_comment_author_url', $commentdata['comment_author_url'] ); + /** This filter is documented in wp-includes/comment.php */ + $commentdata['comment_author_email'] = apply_filters( 'pre_comment_author_email', $commentdata['comment_author_email'] ); + $commentdata['filtered'] = true; + return $commentdata; +} + +/** + * Whether a comment should be blocked because of comment flood. + * + * @since 2.1.0 + * + * @param bool $block Whether plugin has already blocked comment. + * @param int $time_lastcomment Timestamp for last comment. + * @param int $time_newcomment Timestamp for new comment. + * @return bool Whether comment should be blocked. + */ +function wp_throttle_comment_flood( $block, $time_lastcomment, $time_newcomment ) { + if ( $block ) { // A plugin has already blocked... we'll let that decision stand. + return $block; + } + if ( ( $time_newcomment - $time_lastcomment ) < 15 ) { + return true; + } + return false; +} + +/** + * Adds a new comment to the database. + * + * Filters new comment to ensure that the fields are sanitized and valid before + * inserting comment into database. Calls {@see 'comment_post'} action with comment ID + * and whether comment is approved by WordPress. Also has {@see 'preprocess_comment'} + * filter for processing the comment data before the function handles it. + * + * We use `REMOTE_ADDR` here directly. If you are behind a proxy, you should ensure + * that it is properly set, such as in wp-config.php, for your environment. + * + * See {@link https://core.trac.wordpress.org/ticket/9235} + * + * @since 1.5.0 + * @since 4.3.0 'comment_agent' and 'comment_author_IP' can be set via `$commentdata`. + * @since 4.7.0 The `$avoid_die` parameter was added, allowing the function to + * return a WP_Error object instead of dying. + * + * @see wp_insert_comment() + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $commentdata { + * Comment data. + * + * @type string $comment_author The name of the comment author. + * @type string $comment_author_email The comment author email address. + * @type string $comment_author_url The comment author URL. + * @type string $comment_content The content of the comment. + * @type string $comment_date The date the comment was submitted. Default is the current time. + * @type string $comment_date_gmt The date the comment was submitted in the GMT timezone. + * Default is `$comment_date` in the GMT timezone. + * @type int $comment_parent The ID of this comment's parent, if any. Default 0. + * @type int $comment_post_ID The ID of the post that relates to the comment. + * @type int $user_id The ID of the user who submitted the comment. Default 0. + * @type int $user_ID Kept for backward-compatibility. Use `$user_id` instead. + * @type string $comment_agent Comment author user agent. Default is the value of 'HTTP_USER_AGENT' + * in the `$_SERVER` superglobal sent in the original request. + * @type string $comment_author_IP Comment author IP address in IPv4 format. Default is the value of + * 'REMOTE_ADDR' in the `$_SERVER` superglobal sent in the original request. + * } + * @param bool $avoid_die Should errors be returned as WP_Error objects instead of + * executing wp_die()? Default false. + * @return int|false|WP_Error The ID of the comment on success, false or WP_Error on failure. + */ +function wp_new_comment( $commentdata, $avoid_die = false ) { + global $wpdb; + + if ( isset( $commentdata['user_ID'] ) ) { + $commentdata['user_ID'] = (int) $commentdata['user_ID']; + $commentdata['user_id'] = $commentdata['user_ID']; + } + + $prefiltered_user_id = ( isset( $commentdata['user_id'] ) ) ? (int) $commentdata['user_id'] : 0; + + /** + * Filters a comment's data before it is sanitized and inserted into the database. + * + * @since 1.5.0 + * + * @param array $commentdata Comment data. + */ + $commentdata = apply_filters( 'preprocess_comment', $commentdata ); + + $commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID']; + if ( isset( $commentdata['user_ID'] ) && $prefiltered_user_id !== (int) $commentdata['user_ID'] ) { + $commentdata['user_ID'] = (int) $commentdata['user_ID']; + $commentdata['user_id'] = $commentdata['user_ID']; + } elseif ( isset( $commentdata['user_id'] ) ) { + $commentdata['user_id'] = (int) $commentdata['user_id']; + } + + $commentdata['comment_parent'] = isset( $commentdata['comment_parent'] ) ? absint( $commentdata['comment_parent'] ) : 0; + $parent_status = ( 0 < $commentdata['comment_parent'] ) ? wp_get_comment_status( $commentdata['comment_parent'] ) : ''; + $commentdata['comment_parent'] = ( 'approved' == $parent_status || 'unapproved' == $parent_status ) ? $commentdata['comment_parent'] : 0; + + if ( ! isset( $commentdata['comment_author_IP'] ) ) { + $commentdata['comment_author_IP'] = $_SERVER['REMOTE_ADDR']; + } + $commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '', $commentdata['comment_author_IP'] ); + + if ( ! isset( $commentdata['comment_agent'] ) ) { + $commentdata['comment_agent'] = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : ''; + } + $commentdata['comment_agent'] = substr( $commentdata['comment_agent'], 0, 254 ); + + if ( empty( $commentdata['comment_date'] ) ) { + $commentdata['comment_date'] = current_time( 'mysql' ); + } + + if ( empty( $commentdata['comment_date_gmt'] ) ) { + $commentdata['comment_date_gmt'] = current_time( 'mysql', 1 ); + } + + $commentdata = wp_filter_comment( $commentdata ); + + $commentdata['comment_approved'] = wp_allow_comment( $commentdata, $avoid_die ); + if ( is_wp_error( $commentdata['comment_approved'] ) ) { + return $commentdata['comment_approved']; + } + + $comment_ID = wp_insert_comment( $commentdata ); + if ( ! $comment_ID ) { + $fields = array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content' ); + + foreach ( $fields as $field ) { + if ( isset( $commentdata[ $field ] ) ) { + $commentdata[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->comments, $field, $commentdata[ $field ] ); + } + } + + $commentdata = wp_filter_comment( $commentdata ); + + $commentdata['comment_approved'] = wp_allow_comment( $commentdata, $avoid_die ); + if ( is_wp_error( $commentdata['comment_approved'] ) ) { + return $commentdata['comment_approved']; + } + + $comment_ID = wp_insert_comment( $commentdata ); + if ( ! $comment_ID ) { + return false; + } + } + + /** + * Fires immediately after a comment is inserted into the database. + * + * @since 1.2.0 + * @since 4.5.0 The `$commentdata` parameter was added. + * + * @param int $comment_ID The comment ID. + * @param int|string $comment_approved 1 if the comment is approved, 0 if not, 'spam' if spam. + * @param array $commentdata Comment data. + */ + do_action( 'comment_post', $comment_ID, $commentdata['comment_approved'], $commentdata ); + + return $comment_ID; +} + +/** + * Send a comment moderation notification to the comment moderator. + * + * @since 4.4.0 + * + * @param int $comment_ID ID of the comment. + * @return bool True on success, false on failure. + */ +function wp_new_comment_notify_moderator( $comment_ID ) { + $comment = get_comment( $comment_ID ); + + // Only send notifications for pending comments. + $maybe_notify = ( '0' == $comment->comment_approved ); + + /** This filter is documented in wp-includes/comment.php */ + $maybe_notify = apply_filters( 'notify_moderator', $maybe_notify, $comment_ID ); + + if ( ! $maybe_notify ) { + return false; + } + + return wp_notify_moderator( $comment_ID ); +} + +/** + * Send a notification of a new comment to the post author. + * + * @since 4.4.0 + * + * Uses the {@see 'notify_post_author'} filter to determine whether the post author + * should be notified when a new comment is added, overriding site setting. + * + * @param int $comment_ID Comment ID. + * @return bool True on success, false on failure. + */ +function wp_new_comment_notify_postauthor( $comment_ID ) { + $comment = get_comment( $comment_ID ); + + $maybe_notify = get_option( 'comments_notify' ); + + /** + * Filters whether to send the post author new comment notification emails, + * overriding the site setting. + * + * @since 4.4.0 + * + * @param bool $maybe_notify Whether to notify the post author about the new comment. + * @param int $comment_ID The ID of the comment for the notification. + */ + $maybe_notify = apply_filters( 'notify_post_author', $maybe_notify, $comment_ID ); + + /* + * wp_notify_postauthor() checks if notifying the author of their own comment. + * By default, it won't, but filters can override this. + */ + if ( ! $maybe_notify ) { + return false; + } + + // Only send notifications for approved comments. + if ( ! isset( $comment->comment_approved ) || '1' != $comment->comment_approved ) { + return false; + } + + return wp_notify_postauthor( $comment_ID ); +} + +/** + * Sets the status of a comment. + * + * The {@see 'wp_set_comment_status'} action is called after the comment is handled. + * If the comment status is not in the list, then false is returned. + * + * @since 1.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. + * @param string $comment_status New comment status, either 'hold', 'approve', 'spam', or 'trash'. + * @param bool $wp_error Whether to return a WP_Error object if there is a failure. Default is false. + * @return bool|WP_Error True on success, false or WP_Error on failure. + */ +function wp_set_comment_status( $comment_id, $comment_status, $wp_error = false ) { + global $wpdb; + + switch ( $comment_status ) { + case 'hold': + case '0': + $status = '0'; + break; + case 'approve': + case '1': + $status = '1'; + add_action( 'wp_set_comment_status', 'wp_new_comment_notify_postauthor' ); + break; + case 'spam': + $status = 'spam'; + break; + case 'trash': + $status = 'trash'; + break; + default: + return false; + } + + $comment_old = clone get_comment( $comment_id ); + + if ( ! $wpdb->update( $wpdb->comments, array( 'comment_approved' => $status ), array( 'comment_ID' => $comment_old->comment_ID ) ) ) { + if ( $wp_error ) { + return new WP_Error( 'db_update_error', __( 'Could not update comment status' ), $wpdb->last_error ); + } else { + return false; + } + } + + clean_comment_cache( $comment_old->comment_ID ); + + $comment = get_comment( $comment_old->comment_ID ); + + /** + * Fires immediately before transitioning a comment's status from one to another + * in the database. + * + * @since 1.5.0 + * + * @param int $comment_id Comment ID. + * @param string|bool $comment_status Current comment status. Possible values include + * 'hold', 'approve', 'spam', 'trash', or false. + */ + do_action( 'wp_set_comment_status', $comment->comment_ID, $comment_status ); + + wp_transition_comment_status( $comment_status, $comment_old->comment_approved, $comment ); + + wp_update_comment_count( $comment->comment_post_ID ); + + return true; +} + +/** + * Updates an existing comment in the database. + * + * Filters the comment and makes sure certain fields are valid before updating. + * + * @since 2.0.0 + * @since 4.9.0 Add updating comment meta during comment update. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array $commentarr Contains information on the comment. + * @return int The value 1 if the comment was updated, 0 if not updated. + */ +function wp_update_comment( $commentarr ) { + global $wpdb; + + // First, get all of the original fields. + $comment = get_comment( $commentarr['comment_ID'], ARRAY_A ); + if ( empty( $comment ) ) { + return 0; + } + + // Make sure that the comment post ID is valid (if specified). + if ( ! empty( $commentarr['comment_post_ID'] ) && ! get_post( $commentarr['comment_post_ID'] ) ) { + return 0; + } + + // Escape data pulled from DB. + $comment = wp_slash( $comment ); + + $old_status = $comment['comment_approved']; + + // Merge old and new fields with new fields overwriting old ones. + $commentarr = array_merge( $comment, $commentarr ); + + $commentarr = wp_filter_comment( $commentarr ); + + // Now extract the merged array. + $data = wp_unslash( $commentarr ); + + /** + * Filters the comment content before it is updated in the database. + * + * @since 1.5.0 + * + * @param string $comment_content The comment data. + */ + $data['comment_content'] = apply_filters( 'comment_save_pre', $data['comment_content'] ); + + $data['comment_date_gmt'] = get_gmt_from_date( $data['comment_date'] ); + + if ( ! isset( $data['comment_approved'] ) ) { + $data['comment_approved'] = 1; + } elseif ( 'hold' == $data['comment_approved'] ) { + $data['comment_approved'] = 0; + } elseif ( 'approve' == $data['comment_approved'] ) { + $data['comment_approved'] = 1; + } + + $comment_ID = $data['comment_ID']; + $comment_post_ID = $data['comment_post_ID']; + + /** + * Filters the comment data immediately before it is updated in the database. + * + * Note: data being passed to the filter is already unslashed. + * + * @since 4.7.0 + * + * @param array $data The new, processed comment data. + * @param array $comment The old, unslashed comment data. + * @param array $commentarr The new, raw comment data. + */ + $data = apply_filters( 'wp_update_comment_data', $data, $comment, $commentarr ); + + $keys = array( 'comment_post_ID', 'comment_content', 'comment_author', 'comment_author_email', 'comment_approved', 'comment_karma', 'comment_author_url', 'comment_date', 'comment_date_gmt', 'comment_type', 'comment_parent', 'user_id', 'comment_agent', 'comment_author_IP' ); + $data = wp_array_slice_assoc( $data, $keys ); + + $rval = $wpdb->update( $wpdb->comments, $data, compact( 'comment_ID' ) ); + + // If metadata is provided, store it. + if ( isset( $commentarr['comment_meta'] ) && is_array( $commentarr['comment_meta'] ) ) { + foreach ( $commentarr['comment_meta'] as $meta_key => $meta_value ) { + update_comment_meta( $comment_ID, $meta_key, $meta_value ); + } + } + + clean_comment_cache( $comment_ID ); + wp_update_comment_count( $comment_post_ID ); + /** + * Fires immediately after a comment is updated in the database. + * + * The hook also fires immediately before comment status transition hooks are fired. + * + * @since 1.2.0 + * @since 4.6.0 Added the `$data` parameter. + * + * @param int $comment_ID The comment ID. + * @param array $data Comment data. + */ + do_action( 'edit_comment', $comment_ID, $data ); + $comment = get_comment( $comment_ID ); + wp_transition_comment_status( $comment->comment_approved, $old_status, $comment ); + return $rval; +} + +/** + * Whether to defer comment counting. + * + * When setting $defer to true, all post comment counts will not be updated + * until $defer is set to false. When $defer is set to false, then all + * previously deferred updated post comment counts will then be automatically + * updated without having to call wp_update_comment_count() after. + * + * @since 2.5.0 + * @staticvar bool $_defer + * + * @param bool $defer + * @return bool + */ +function wp_defer_comment_counting( $defer = null ) { + static $_defer = false; + + if ( is_bool( $defer ) ) { + $_defer = $defer; + // Flush any deferred counts. + if ( ! $defer ) { + wp_update_comment_count( null, true ); + } + } + + return $_defer; +} + +/** + * Updates the comment count for post(s). + * + * When $do_deferred is false (is by default) and the comments have been set to + * be deferred, the post_id will be added to a queue, which will be updated at a + * later date and only updated once per post ID. + * + * If the comments have not be set up to be deferred, then the post will be + * updated. When $do_deferred is set to true, then all previous deferred post + * IDs will be updated along with the current $post_id. + * + * @since 2.1.0 + * @see wp_update_comment_count_now() For what could cause a false return value + * + * @staticvar array $_deferred + * + * @param int|null $post_id Post ID. + * @param bool $do_deferred Optional. Whether to process previously deferred + * post comment counts. Default false. + * @return bool|void True on success, false on failure or if post with ID does + * not exist. + */ +function wp_update_comment_count( $post_id, $do_deferred = false ) { + static $_deferred = array(); + + if ( empty( $post_id ) && ! $do_deferred ) { + return false; + } + + if ( $do_deferred ) { + $_deferred = array_unique( $_deferred ); + foreach ( $_deferred as $i => $_post_id ) { + wp_update_comment_count_now( $_post_id ); + unset( $_deferred[ $i ] ); + /** @todo Move this outside of the foreach and reset $_deferred to an array instead */ + } + } + + if ( wp_defer_comment_counting() ) { + $_deferred[] = $post_id; + return true; + } elseif ( $post_id ) { + return wp_update_comment_count_now( $post_id ); + } + +} + +/** + * Updates the comment count for the post. + * + * @since 2.5.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $post_id Post ID + * @return bool True on success, false if the post does not exist. + */ +function wp_update_comment_count_now( $post_id ) { + global $wpdb; + $post_id = (int) $post_id; + if ( ! $post_id ) { + return false; + } + + wp_cache_delete( 'comments-0', 'counts' ); + wp_cache_delete( "comments-{$post_id}", 'counts' ); + + $post = get_post( $post_id ); + if ( ! $post ) { + return false; + } + + $old = (int) $post->comment_count; + + /** + * Filters a post's comment count before it is updated in the database. + * + * @since 4.5.0 + * + * @param int|null $new The new comment count. Default null. + * @param int $old The old comment count. + * @param int $post_id Post ID. + */ + $new = apply_filters( 'pre_wp_update_comment_count_now', null, $old, $post_id ); + + if ( is_null( $new ) ) { + $new = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1'", $post_id ) ); + } else { + $new = (int) $new; + } + + $wpdb->update( $wpdb->posts, array( 'comment_count' => $new ), array( 'ID' => $post_id ) ); + + clean_post_cache( $post ); + + /** + * Fires immediately after a post's comment count is updated in the database. + * + * @since 2.3.0 + * + * @param int $post_id Post ID. + * @param int $new The new comment count. + * @param int $old The old comment count. + */ + do_action( 'wp_update_comment_count', $post_id, $new, $old ); + + /** This action is documented in wp-includes/post.php */ + do_action( "edit_post_{$post->post_type}", $post_id, $post ); + + /** This action is documented in wp-includes/post.php */ + do_action( 'edit_post', $post_id, $post ); + + return true; +} + +// +// Ping and trackback functions. +// + +/** + * Finds a pingback server URI based on the given URL. + * + * Checks the HTML for the rel="pingback" link and x-pingback headers. It does + * a check for the x-pingback headers first and returns that, if available. The + * check for the rel="pingback" has more overhead than just the header. + * + * @since 1.5.0 + * + * @param string $url URL to ping. + * @param int $deprecated Not Used. + * @return string|false String containing URI on success, false on failure. + */ +function discover_pingback_server_uri( $url, $deprecated = '' ) { + if ( ! empty( $deprecated ) ) { + _deprecated_argument( __FUNCTION__, '2.7.0' ); + } + + $pingback_str_dquote = 'rel="pingback"'; + $pingback_str_squote = 'rel=\'pingback\''; + + /** @todo Should use Filter Extension or custom preg_match instead. */ + $parsed_url = parse_url( $url ); + + if ( ! isset( $parsed_url['host'] ) ) { // Not a URL. This should never happen. + return false; + } + + // Do not search for a pingback server on our own uploads. + $uploads_dir = wp_get_upload_dir(); + if ( 0 === strpos( $url, $uploads_dir['baseurl'] ) ) { + return false; + } + + $response = wp_safe_remote_head( + $url, + array( + 'timeout' => 2, + 'httpversion' => '1.0', + ) + ); + + if ( is_wp_error( $response ) ) { + return false; + } + + if ( wp_remote_retrieve_header( $response, 'x-pingback' ) ) { + return wp_remote_retrieve_header( $response, 'x-pingback' ); + } + + // Not an (x)html, sgml, or xml page, no use going further. + if ( preg_match( '#(image|audio|video|model)/#is', wp_remote_retrieve_header( $response, 'content-type' ) ) ) { + return false; + } + + // Now do a GET since we're going to look in the html headers (and we're sure it's not a binary file). + $response = wp_safe_remote_get( + $url, + array( + 'timeout' => 2, + 'httpversion' => '1.0', + ) + ); + + if ( is_wp_error( $response ) ) { + return false; + } + + $contents = wp_remote_retrieve_body( $response ); + + $pingback_link_offset_dquote = strpos( $contents, $pingback_str_dquote ); + $pingback_link_offset_squote = strpos( $contents, $pingback_str_squote ); + if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) { + $quote = ( $pingback_link_offset_dquote ) ? '"' : '\''; + $pingback_link_offset = ( '"' === $quote ) ? $pingback_link_offset_dquote : $pingback_link_offset_squote; + $pingback_href_pos = strpos( $contents, 'href=', $pingback_link_offset ); + $pingback_href_start = $pingback_href_pos + 6; + $pingback_href_end = strpos( $contents, $quote, $pingback_href_start ); + $pingback_server_url_len = $pingback_href_end - $pingback_href_start; + $pingback_server_url = substr( $contents, $pingback_href_start, $pingback_server_url_len ); + + // We may find rel="pingback" but an incomplete pingback URL. + if ( $pingback_server_url_len > 0 ) { // We got it! + return $pingback_server_url; + } + } + + return false; +} + +/** + * Perform all pingbacks, enclosures, trackbacks, and send to pingback services. + * + * @since 2.1.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function do_all_pings() { + global $wpdb; + + // Do pingbacks. + $pings = get_posts( + array( + 'post_type' => get_post_types(), + 'suppress_filters' => false, + 'nopaging' => true, + 'meta_key' => '_pingme', + 'fields' => 'ids', + ) + ); + + foreach ( $pings as $ping ) { + delete_post_meta( $ping, '_pingme' ); + pingback( null, $ping ); + } + + // Do enclosures. + $enclosures = get_posts( + array( + 'post_type' => get_post_types(), + 'suppress_filters' => false, + 'nopaging' => true, + 'meta_key' => '_encloseme', + 'fields' => 'ids', + ) + ); + + foreach ( $enclosures as $enclosure ) { + delete_post_meta( $enclosure, '_encloseme' ); + do_enclose( null, $enclosure ); + } + + // Do trackbacks. + $trackbacks = get_posts( + array( + 'post_type' => get_post_types(), + 'suppress_filters' => false, + 'nopaging' => true, + 'meta_key' => '_trackbackme', + 'fields' => 'ids', + ) + ); + + foreach ( $trackbacks as $trackback ) { + delete_post_meta( $trackback, '_trackbackme' ); + do_trackbacks( $trackback ); + } + + // Do Update Services/Generic Pings. + generic_ping(); +} + +/** + * Perform trackbacks. + * + * @since 1.5.0 + * @since 4.7.0 `$post_id` can be a WP_Post object. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int|WP_Post $post_id Post object or ID to do trackbacks on. + */ +function do_trackbacks( $post_id ) { + global $wpdb; + $post = get_post( $post_id ); + if ( ! $post ) { + return false; + } + + $to_ping = get_to_ping( $post ); + $pinged = get_pung( $post ); + if ( empty( $to_ping ) ) { + $wpdb->update( $wpdb->posts, array( 'to_ping' => '' ), array( 'ID' => $post->ID ) ); + return; + } + + if ( empty( $post->post_excerpt ) ) { + /** This filter is documented in wp-includes/post-template.php */ + $excerpt = apply_filters( 'the_content', $post->post_content, $post->ID ); + } else { + /** This filter is documented in wp-includes/post-template.php */ + $excerpt = apply_filters( 'the_excerpt', $post->post_excerpt ); + } + + $excerpt = str_replace( ']]>', ']]>', $excerpt ); + $excerpt = wp_html_excerpt( $excerpt, 252, '…' ); + + /** This filter is documented in wp-includes/post-template.php */ + $post_title = apply_filters( 'the_title', $post->post_title, $post->ID ); + $post_title = strip_tags( $post_title ); + + if ( $to_ping ) { + foreach ( (array) $to_ping as $tb_ping ) { + $tb_ping = trim( $tb_ping ); + if ( ! in_array( $tb_ping, $pinged ) ) { + trackback( $tb_ping, $post_title, $excerpt, $post->ID ); + $pinged[] = $tb_ping; + } else { + $wpdb->query( + $wpdb->prepare( + "UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, + '')) WHERE ID = %d", + $tb_ping, + $post->ID + ) + ); + } + } + } +} + +/** + * Sends pings to all of the ping site services. + * + * @since 1.2.0 + * + * @param int $post_id Post ID. + * @return int Same as Post ID from parameter + */ +function generic_ping( $post_id = 0 ) { + $services = get_option( 'ping_sites' ); + + $services = explode( "\n", $services ); + foreach ( (array) $services as $service ) { + $service = trim( $service ); + if ( '' != $service ) { + weblog_ping( $service ); + } + } + + return $post_id; +} + +/** + * Pings back the links found in a post. + * + * @since 0.71 + * @since 4.7.0 `$post_id` can be a WP_Post object. + * + * @param string $content Post content to check for links. If empty will retrieve from post. + * @param int|WP_Post $post_id Post Object or ID. + */ +function pingback( $content, $post_id ) { + include_once ABSPATH . WPINC . '/class-IXR.php'; + include_once ABSPATH . WPINC . '/class-wp-http-ixr-client.php'; + + // Original code by Mort (http://mort.mine.nu:8080). + $post_links = array(); + + $post = get_post( $post_id ); + if ( ! $post ) { + return; + } + + $pung = get_pung( $post ); + + if ( empty( $content ) ) { + $content = $post->post_content; + } + + /* + * Step 1. + * Parsing the post, external links (if any) are stored in the $post_links array. + */ + $post_links_temp = wp_extract_urls( $content ); + + /* + * Step 2. + * Walking through the links array. + * First we get rid of links pointing to sites, not to specific files. + * Example: + * http://dummy-weblog.org + * http://dummy-weblog.org/ + * http://dummy-weblog.org/post.php + * We don't wanna ping first and second types, even if they have a valid . + */ + foreach ( (array) $post_links_temp as $link_test ) { + // If we haven't pung it already and it isn't a link to itself. + if ( ! in_array( $link_test, $pung ) && ( url_to_postid( $link_test ) != $post->ID ) + // Also, let's never ping local attachments. + && ! is_local_attachment( $link_test ) ) { + $test = @parse_url( $link_test ); + if ( $test ) { + if ( isset( $test['query'] ) ) { + $post_links[] = $link_test; + } elseif ( isset( $test['path'] ) && ( '/' !== $test['path'] ) && ( '' !== $test['path'] ) ) { + $post_links[] = $link_test; + } + } + } + } + + $post_links = array_unique( $post_links ); + + /** + * Fires just before pinging back links found in a post. + * + * @since 2.0.0 + * + * @param string[] $post_links Array of link URLs to be checked (passed by reference). + * @param string[] $pung Array of link URLs already pinged (passed by reference). + * @param int $post_ID The post ID. + */ + do_action_ref_array( 'pre_ping', array( &$post_links, &$pung, $post->ID ) ); + + foreach ( (array) $post_links as $pagelinkedto ) { + $pingback_server_url = discover_pingback_server_uri( $pagelinkedto ); + + if ( $pingback_server_url ) { + set_time_limit( 60 ); + // Now, the RPC call. + $pagelinkedfrom = get_permalink( $post ); + + // Using a timeout of 3 seconds should be enough to cover slow servers. + $client = new WP_HTTP_IXR_Client( $pingback_server_url ); + $client->timeout = 3; + /** + * Filters the user agent sent when pinging-back a URL. + * + * @since 2.9.0 + * + * @param string $concat_useragent The user agent concatenated with ' -- WordPress/' + * and the WordPress version. + * @param string $useragent The useragent. + * @param string $pingback_server_url The server URL being linked to. + * @param string $pagelinkedto URL of page linked to. + * @param string $pagelinkedfrom URL of page linked from. + */ + $client->useragent = apply_filters( 'pingback_useragent', $client->useragent . ' -- WordPress/' . get_bloginfo( 'version' ), $client->useragent, $pingback_server_url, $pagelinkedto, $pagelinkedfrom ); + // When set to true, this outputs debug messages by itself. + $client->debug = false; + + if ( $client->query( 'pingback.ping', $pagelinkedfrom, $pagelinkedto ) || ( isset( $client->error->code ) && 48 == $client->error->code ) ) { // Already registered. + add_ping( $post, $pagelinkedto ); + } + } + } +} + +/** + * Check whether blog is public before returning sites. + * + * @since 2.1.0 + * + * @param mixed $sites Will return if blog is public, will not return if not public. + * @return mixed Empty string if blog is not public, returns $sites, if site is public. + */ +function privacy_ping_filter( $sites ) { + if ( '0' != get_option( 'blog_public' ) ) { + return $sites; + } else { + return ''; + } +} + +/** + * Send a Trackback. + * + * Updates database when sending trackback to prevent duplicates. + * + * @since 0.71 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $trackback_url URL to send trackbacks. + * @param string $title Title of post. + * @param string $excerpt Excerpt of post. + * @param int $ID Post ID. + * @return int|false|void Database query from update. + */ +function trackback( $trackback_url, $title, $excerpt, $ID ) { + global $wpdb; + + if ( empty( $trackback_url ) ) { + return; + } + + $options = array(); + $options['timeout'] = 10; + $options['body'] = array( + 'title' => $title, + 'url' => get_permalink( $ID ), + 'blog_name' => get_option( 'blogname' ), + 'excerpt' => $excerpt, + ); + + $response = wp_safe_remote_post( $trackback_url, $options ); + + if ( is_wp_error( $response ) ) { + return; + } + + $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET pinged = CONCAT(pinged, '\n', %s) WHERE ID = %d", $trackback_url, $ID ) ); + return $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d", $trackback_url, $ID ) ); +} + +/** + * Send a pingback. + * + * @since 1.2.0 + * + * @param string $server Host of blog to connect to. + * @param string $path Path to send the ping. + */ +function weblog_ping( $server = '', $path = '' ) { + include_once ABSPATH . WPINC . '/class-IXR.php'; + include_once ABSPATH . WPINC . '/class-wp-http-ixr-client.php'; + + // Using a timeout of 3 seconds should be enough to cover slow servers. + $client = new WP_HTTP_IXR_Client( $server, ( ( ! strlen( trim( $path ) ) || ( '/' == $path ) ) ? false : $path ) ); + $client->timeout = 3; + $client->useragent .= ' -- WordPress/' . get_bloginfo( 'version' ); + + // When set to true, this outputs debug messages by itself. + $client->debug = false; + $home = trailingslashit( home_url() ); + if ( ! $client->query( 'weblogUpdates.extendedPing', get_option( 'blogname' ), $home, get_bloginfo( 'rss2_url' ) ) ) { // Then try a normal ping. + $client->query( 'weblogUpdates.ping', get_option( 'blogname' ), $home ); + } +} + +/** + * Default filter attached to pingback_ping_source_uri to validate the pingback's Source URI + * + * @since 3.5.1 + * @see wp_http_validate_url() + * + * @param string $source_uri + * @return string + */ +function pingback_ping_source_uri( $source_uri ) { + return (string) wp_http_validate_url( $source_uri ); +} + +/** + * Default filter attached to xmlrpc_pingback_error. + * + * Returns a generic pingback error code unless the error code is 48, + * which reports that the pingback is already registered. + * + * @since 3.5.1 + * @link https://www.hixie.ch/specs/pingback/pingback#TOC3 + * + * @param IXR_Error $ixr_error + * @return IXR_Error + */ +function xmlrpc_pingback_error( $ixr_error ) { + if ( 48 === $ixr_error->code ) { + return $ixr_error; + } + return new IXR_Error( 0, '' ); +} + +// +// Cache. +// + +/** + * Removes a comment from the object cache. + * + * @since 2.3.0 + * + * @param int|array $ids Comment ID or an array of comment IDs to remove from cache. + */ +function clean_comment_cache( $ids ) { + foreach ( (array) $ids as $id ) { + wp_cache_delete( $id, 'comment' ); + + /** + * Fires immediately after a comment has been removed from the object cache. + * + * @since 4.5.0 + * + * @param int $id Comment ID. + */ + do_action( 'clean_comment_cache', $id ); + } + + wp_cache_set( 'last_changed', microtime(), 'comment' ); +} + +/** + * Updates the comment cache of given comments. + * + * Will add the comments in $comments to the cache. If comment ID already exists + * in the comment cache then it will not be updated. The comment is added to the + * cache using the comment group with the key using the ID of the comments. + * + * @since 2.3.0 + * @since 4.4.0 Introduced the `$update_meta_cache` parameter. + * + * @param WP_Comment[] $comments Array of comment objects + * @param bool $update_meta_cache Whether to update commentmeta cache. Default true. + */ +function update_comment_cache( $comments, $update_meta_cache = true ) { + foreach ( (array) $comments as $comment ) { + wp_cache_add( $comment->comment_ID, $comment, 'comment' ); + } + + if ( $update_meta_cache ) { + // Avoid `wp_list_pluck()` in case `$comments` is passed by reference. + $comment_ids = array(); + foreach ( $comments as $comment ) { + $comment_ids[] = $comment->comment_ID; + } + update_meta_cache( 'comment', $comment_ids ); + } +} + +/** + * Adds any comments from the given IDs to the cache that do not already exist in cache. + * + * @since 4.4.0 + * @access private + * + * @see update_comment_cache() + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int[] $comment_ids Array of comment IDs. + * @param bool $update_meta_cache Optional. Whether to update the meta cache. Default true. + */ +function _prime_comment_caches( $comment_ids, $update_meta_cache = true ) { + global $wpdb; + + $non_cached_ids = _get_non_cached_ids( $comment_ids, 'comment' ); + if ( ! empty( $non_cached_ids ) ) { + $fresh_comments = $wpdb->get_results( sprintf( "SELECT $wpdb->comments.* FROM $wpdb->comments WHERE comment_ID IN (%s)", join( ',', array_map( 'intval', $non_cached_ids ) ) ) ); + + update_comment_cache( $fresh_comments, $update_meta_cache ); + } +} + +// +// Internal. +// + +/** + * Close comments on old posts on the fly, without any extra DB queries. Hooked to the_posts. + * + * @access private + * @since 2.7.0 + * + * @param WP_Post $posts Post data object. + * @param WP_Query $query Query object. + * @return array + */ +function _close_comments_for_old_posts( $posts, $query ) { + if ( empty( $posts ) || ! $query->is_singular() || ! get_option( 'close_comments_for_old_posts' ) ) { + return $posts; + } + + /** + * Filters the list of post types to automatically close comments for. + * + * @since 3.2.0 + * + * @param string[] $post_types An array of post type names. + */ + $post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) ); + if ( ! in_array( $posts[0]->post_type, $post_types ) ) { + return $posts; + } + + $days_old = (int) get_option( 'close_comments_days_old' ); + if ( ! $days_old ) { + return $posts; + } + + if ( time() - strtotime( $posts[0]->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) { + $posts[0]->comment_status = 'closed'; + $posts[0]->ping_status = 'closed'; + } + + return $posts; +} + +/** + * Close comments on an old post. Hooked to comments_open and pings_open. + * + * @access private + * @since 2.7.0 + * + * @param bool $open Comments open or closed + * @param int $post_id Post ID + * @return bool $open + */ +function _close_comments_for_old_post( $open, $post_id ) { + if ( ! $open ) { + return $open; + } + + if ( ! get_option( 'close_comments_for_old_posts' ) ) { + return $open; + } + + $days_old = (int) get_option( 'close_comments_days_old' ); + if ( ! $days_old ) { + return $open; + } + + $post = get_post( $post_id ); + + /** This filter is documented in wp-includes/comment.php */ + $post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) ); + if ( ! in_array( $post->post_type, $post_types ) ) { + return $open; + } + + // Undated drafts should not show up as comments closed. + if ( '0000-00-00 00:00:00' === $post->post_date_gmt ) { + return $open; + } + + if ( time() - strtotime( $post->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) { + return false; + } + + return $open; +} + +/** + * Handles the submission of a comment, usually posted to wp-comments-post.php via a comment form. + * + * This function expects unslashed data, as opposed to functions such as `wp_new_comment()` which + * expect slashed data. + * + * @since 4.4.0 + * + * @param array $comment_data { + * Comment data. + * + * @type string|int $comment_post_ID The ID of the post that relates to the comment. + * @type string $author The name of the comment author. + * @type string $email The comment author email address. + * @type string $url The comment author URL. + * @type string $comment The content of the comment. + * @type string|int $comment_parent The ID of this comment's parent, if any. Default 0. + * @type string $_wp_unfiltered_html_comment The nonce value for allowing unfiltered HTML. + * } + * @return WP_Comment|WP_Error A WP_Comment object on success, a WP_Error object on failure. + */ +function wp_handle_comment_submission( $comment_data ) { + + $comment_post_ID = 0; + $comment_parent = 0; + $user_ID = 0; + $comment_author = null; + $comment_author_email = null; + $comment_author_url = null; + $comment_content = null; + + if ( isset( $comment_data['comment_post_ID'] ) ) { + $comment_post_ID = (int) $comment_data['comment_post_ID']; + } + if ( isset( $comment_data['author'] ) && is_string( $comment_data['author'] ) ) { + $comment_author = trim( strip_tags( $comment_data['author'] ) ); + } + if ( isset( $comment_data['email'] ) && is_string( $comment_data['email'] ) ) { + $comment_author_email = trim( $comment_data['email'] ); + } + if ( isset( $comment_data['url'] ) && is_string( $comment_data['url'] ) ) { + $comment_author_url = trim( $comment_data['url'] ); + } + if ( isset( $comment_data['comment'] ) && is_string( $comment_data['comment'] ) ) { + $comment_content = trim( $comment_data['comment'] ); + } + if ( isset( $comment_data['comment_parent'] ) ) { + $comment_parent = absint( $comment_data['comment_parent'] ); + } + + $post = get_post( $comment_post_ID ); + + if ( empty( $post->comment_status ) ) { + + /** + * Fires when a comment is attempted on a post that does not exist. + * + * @since 1.5.0 + * + * @param int $comment_post_ID Post ID. + */ + do_action( 'comment_id_not_found', $comment_post_ID ); + + return new WP_Error( 'comment_id_not_found' ); + + } + + // get_post_status() will get the parent status for attachments. + $status = get_post_status( $post ); + + if ( ( 'private' == $status ) && ! current_user_can( 'read_post', $comment_post_ID ) ) { + return new WP_Error( 'comment_id_not_found' ); + } + + $status_obj = get_post_status_object( $status ); + + if ( ! comments_open( $comment_post_ID ) ) { + + /** + * Fires when a comment is attempted on a post that has comments closed. + * + * @since 1.5.0 + * + * @param int $comment_post_ID Post ID. + */ + do_action( 'comment_closed', $comment_post_ID ); + + return new WP_Error( 'comment_closed', __( 'Sorry, comments are closed for this item.' ), 403 ); + + } elseif ( 'trash' == $status ) { + + /** + * Fires when a comment is attempted on a trashed post. + * + * @since 2.9.0 + * + * @param int $comment_post_ID Post ID. + */ + do_action( 'comment_on_trash', $comment_post_ID ); + + return new WP_Error( 'comment_on_trash' ); + + } elseif ( ! $status_obj->public && ! $status_obj->private ) { + + /** + * Fires when a comment is attempted on a post in draft mode. + * + * @since 1.5.1 + * + * @param int $comment_post_ID Post ID. + */ + do_action( 'comment_on_draft', $comment_post_ID ); + + if ( current_user_can( 'read_post', $comment_post_ID ) ) { + return new WP_Error( 'comment_on_draft', __( 'Sorry, comments are not allowed for this item.' ), 403 ); + } else { + return new WP_Error( 'comment_on_draft' ); + } + } elseif ( post_password_required( $comment_post_ID ) ) { + + /** + * Fires when a comment is attempted on a password-protected post. + * + * @since 2.9.0 + * + * @param int $comment_post_ID Post ID. + */ + do_action( 'comment_on_password_protected', $comment_post_ID ); + + return new WP_Error( 'comment_on_password_protected' ); + + } else { + + /** + * Fires before a comment is posted. + * + * @since 2.8.0 + * + * @param int $comment_post_ID Post ID. + */ + do_action( 'pre_comment_on_post', $comment_post_ID ); + + } + + // If the user is logged in. + $user = wp_get_current_user(); + if ( $user->exists() ) { + if ( empty( $user->display_name ) ) { + $user->display_name = $user->user_login; + } + $comment_author = $user->display_name; + $comment_author_email = $user->user_email; + $comment_author_url = $user->user_url; + $user_ID = $user->ID; + if ( current_user_can( 'unfiltered_html' ) ) { + if ( ! isset( $comment_data['_wp_unfiltered_html_comment'] ) + || ! wp_verify_nonce( $comment_data['_wp_unfiltered_html_comment'], 'unfiltered-html-comment_' . $comment_post_ID ) + ) { + kses_remove_filters(); // Start with a clean slate. + kses_init_filters(); // Set up the filters. + remove_filter( 'pre_comment_content', 'wp_filter_post_kses' ); + add_filter( 'pre_comment_content', 'wp_filter_kses' ); + } + } + } else { + if ( get_option( 'comment_registration' ) ) { + return new WP_Error( 'not_logged_in', __( 'Sorry, you must be logged in to comment.' ), 403 ); + } + } + + $comment_type = ''; + + if ( get_option( 'require_name_email' ) && ! $user->exists() ) { + if ( '' == $comment_author_email || '' == $comment_author ) { + return new WP_Error( 'require_name_email', __( 'Error: Please fill the required fields (name, email).' ), 200 ); + } elseif ( ! is_email( $comment_author_email ) ) { + return new WP_Error( 'require_valid_email', __( 'Error: Please enter a valid email address.' ), 200 ); + } + } + + $commentdata = compact( + 'comment_post_ID', + 'comment_author', + 'comment_author_email', + 'comment_author_url', + 'comment_content', + 'comment_type', + 'comment_parent', + 'user_ID' + ); + + /** + * Filters whether an empty comment should be allowed. + * + * @since 5.1.0 + * + * @param bool $allow_empty_comment Whether to allow empty comments. Default false. + * @param array $commentdata Array of comment data to be sent to wp_insert_comment(). + */ + $allow_empty_comment = apply_filters( 'allow_empty_comment', false, $commentdata ); + if ( '' === $comment_content && ! $allow_empty_comment ) { + return new WP_Error( 'require_valid_comment', __( 'Error: Please type a comment.' ), 200 ); + } + + $check_max_lengths = wp_check_comment_data_max_lengths( $commentdata ); + if ( is_wp_error( $check_max_lengths ) ) { + return $check_max_lengths; + } + + $comment_id = wp_new_comment( wp_slash( $commentdata ), true ); + if ( is_wp_error( $comment_id ) ) { + return $comment_id; + } + + if ( ! $comment_id ) { + return new WP_Error( 'comment_save_error', __( 'Error: The comment could not be saved. Please try again later.' ), 500 ); + } + + return get_comment( $comment_id ); +} + +/** + * Registers the personal data exporter for comments. + * + * @since 4.9.6 + * + * @param array $exporters An array of personal data exporters. + * @return array An array of personal data exporters. + */ +function wp_register_comment_personal_data_exporter( $exporters ) { + $exporters['wordpress-comments'] = array( + 'exporter_friendly_name' => __( 'WordPress Comments' ), + 'callback' => 'wp_comments_personal_data_exporter', + ); + + return $exporters; +} + +/** + * Finds and exports personal data associated with an email address from the comments table. + * + * @since 4.9.6 + * + * @param string $email_address The comment author email address. + * @param int $page Comment page. + * @return array An array of personal data. + */ +function wp_comments_personal_data_exporter( $email_address, $page = 1 ) { + // Limit us to 500 comments at a time to avoid timing out. + $number = 500; + $page = (int) $page; + + $data_to_export = array(); + + $comments = get_comments( + array( + 'author_email' => $email_address, + 'number' => $number, + 'paged' => $page, + 'order_by' => 'comment_ID', + 'order' => 'ASC', + 'update_comment_meta_cache' => false, + ) + ); + + $comment_prop_to_export = array( + 'comment_author' => __( 'Comment Author' ), + 'comment_author_email' => __( 'Comment Author Email' ), + 'comment_author_url' => __( 'Comment Author URL' ), + 'comment_author_IP' => __( 'Comment Author IP' ), + 'comment_agent' => __( 'Comment Author User Agent' ), + 'comment_date' => __( 'Comment Date' ), + 'comment_content' => __( 'Comment Content' ), + 'comment_link' => __( 'Comment URL' ), + ); + + foreach ( (array) $comments as $comment ) { + $comment_data_to_export = array(); + + foreach ( $comment_prop_to_export as $key => $name ) { + $value = ''; + + switch ( $key ) { + case 'comment_author': + case 'comment_author_email': + case 'comment_author_url': + case 'comment_author_IP': + case 'comment_agent': + case 'comment_date': + $value = $comment->{$key}; + break; + + case 'comment_content': + $value = get_comment_text( $comment->comment_ID ); + break; + + case 'comment_link': + $value = get_comment_link( $comment->comment_ID ); + $value = sprintf( + '%s', + esc_url( $value ), + esc_html( $value ) + ); + break; + } + + if ( ! empty( $value ) ) { + $comment_data_to_export[] = array( + 'name' => $name, + 'value' => $value, + ); + } + } + + $data_to_export[] = array( + 'group_id' => 'comments', + 'group_label' => __( 'Comments' ), + 'group_description' => __( 'User’s comment data.' ), + 'item_id' => "comment-{$comment->comment_ID}", + 'data' => $comment_data_to_export, + ); + } + + $done = count( $comments ) < $number; + + return array( + 'data' => $data_to_export, + 'done' => $done, + ); +} + +/** + * Registers the personal data eraser for comments. + * + * @since 4.9.6 + * + * @param array $erasers An array of personal data erasers. + * @return array An array of personal data erasers. + */ +function wp_register_comment_personal_data_eraser( $erasers ) { + $erasers['wordpress-comments'] = array( + 'eraser_friendly_name' => __( 'WordPress Comments' ), + 'callback' => 'wp_comments_personal_data_eraser', + ); + + return $erasers; +} + +/** + * Erases personal data associated with an email address from the comments table. + * + * @since 4.9.6 + * + * @param string $email_address The comment author email address. + * @param int $page Comment page. + * @return array + */ +function wp_comments_personal_data_eraser( $email_address, $page = 1 ) { + global $wpdb; + + if ( empty( $email_address ) ) { + return array( + 'items_removed' => false, + 'items_retained' => false, + 'messages' => array(), + 'done' => true, + ); + } + + // Limit us to 500 comments at a time to avoid timing out. + $number = 500; + $page = (int) $page; + $items_removed = false; + $items_retained = false; + + $comments = get_comments( + array( + 'author_email' => $email_address, + 'number' => $number, + 'paged' => $page, + 'order_by' => 'comment_ID', + 'order' => 'ASC', + 'include_unapproved' => true, + ) + ); + + /* translators: Name of a comment's author after being anonymized. */ + $anon_author = __( 'Anonymous' ); + $messages = array(); + + foreach ( (array) $comments as $comment ) { + $anonymized_comment = array(); + $anonymized_comment['comment_agent'] = ''; + $anonymized_comment['comment_author'] = $anon_author; + $anonymized_comment['comment_author_email'] = ''; + $anonymized_comment['comment_author_IP'] = wp_privacy_anonymize_data( 'ip', $comment->comment_author_IP ); + $anonymized_comment['comment_author_url'] = ''; + $anonymized_comment['user_id'] = 0; + + $comment_id = (int) $comment->comment_ID; + + /** + * Filters whether to anonymize the comment. + * + * @since 4.9.6 + * + * @param bool|string $anon_message Whether to apply the comment anonymization (bool) or a custom + * message (string). Default true. + * @param WP_Comment $comment WP_Comment object. + * @param array $anonymized_comment Anonymized comment data. + */ + $anon_message = apply_filters( 'wp_anonymize_comment', true, $comment, $anonymized_comment ); + + if ( true !== $anon_message ) { + if ( $anon_message && is_string( $anon_message ) ) { + $messages[] = esc_html( $anon_message ); + } else { + /* translators: %d: Comment ID. */ + $messages[] = sprintf( __( 'Comment %d contains personal data but could not be anonymized.' ), $comment_id ); + } + + $items_retained = true; + + continue; + } + + $args = array( + 'comment_ID' => $comment_id, + ); + + $updated = $wpdb->update( $wpdb->comments, $anonymized_comment, $args ); + + if ( $updated ) { + $items_removed = true; + clean_comment_cache( $comment_id ); + } else { + $items_retained = true; + } + } + + $done = count( $comments ) < $number; + + return array( + 'items_removed' => $items_removed, + 'items_retained' => $items_retained, + 'messages' => $messages, + 'done' => $done, + ); +} + +/** + * Sets the last changed time for the 'comment' cache group. + * + * @since 5.0.0 + */ +function wp_cache_set_comments_last_changed() { + wp_cache_set( 'last_changed', microtime(), 'comment' ); +} diff --git a/wp-includes/compat.php b/wp-includes/compat.php new file mode 100644 index 0000000..2e258a8 --- /dev/null +++ b/wp-includes/compat.php @@ -0,0 +1,376 @@ + 1 && $str = array_pop( $pieces ) ); + + return join( '', array_slice( $chars, $start, $length ) ); +} + +if ( ! function_exists( 'mb_strlen' ) ) : + /** + * Compat function to mimic mb_strlen(). + * + * @ignore + * @since 4.2.0 + * + * @see _mb_strlen() + * + * @param string $str The string to retrieve the character length from. + * @param string|null $encoding Optional. Character encoding to use. Default null. + * @return int String length of `$str`. + */ + function mb_strlen( $str, $encoding = null ) { + return _mb_strlen( $str, $encoding ); + } +endif; + +/** + * Internal compat function to mimic mb_strlen(). + * + * Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit. + * For $encoding === UTF-8, the `$str` input is expected to be a valid UTF-8 byte + * sequence. The behavior of this function for invalid inputs is undefined. + * + * @ignore + * @since 4.2.0 + * + * @param string $str The string to retrieve the character length from. + * @param string|null $encoding Optional. Character encoding to use. Default null. + * @return int String length of `$str`. + */ +function _mb_strlen( $str, $encoding = null ) { + if ( null === $encoding ) { + $encoding = get_option( 'blog_charset' ); + } + + /* + * The solution below works only for UTF-8, so in case of a different charset + * just use built-in strlen(). + */ + if ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) ) { + return strlen( $str ); + } + + if ( _wp_can_use_pcre_u() ) { + // Use the regex unicode support to separate the UTF-8 characters into an array. + preg_match_all( '/./us', $str, $match ); + return count( $match[0] ); + } + + $regex = '/(?: + [\x00-\x7F] # single-byte sequences 0xxxxxxx + | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx + | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2 + | [\xE1-\xEC][\x80-\xBF]{2} + | \xED[\x80-\x9F][\x80-\xBF] + | [\xEE-\xEF][\x80-\xBF]{2} + | \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3 + | [\xF1-\xF3][\x80-\xBF]{3} + | \xF4[\x80-\x8F][\x80-\xBF]{2} + )/x'; + + // Start at 1 instead of 0 since the first thing we do is decrement. + $count = 1; + do { + // We had some string left over from the last round, but we counted it in that last round. + $count--; + + /* + * Split by UTF-8 character, limit to 1000 characters (last array element will contain + * the rest of the string). + */ + $pieces = preg_split( $regex, $str, 1000 ); + + // Increment. + $count += count( $pieces ); + + // If there's anything left over, repeat the loop. + } while ( $str = array_pop( $pieces ) ); + + // Fencepost: preg_split() always returns one extra item in the array. + return --$count; +} + +if ( ! function_exists( 'hash_hmac' ) ) : + /** + * Compat function to mimic hash_hmac(). + * + * The Hash extension is bundled with PHP by default since PHP 5.1.2. + * However, the extension may be explicitly disabled on select servers. + * As of PHP 7.4.0, the Hash extension is a core PHP extension and can no + * longer be disabled. + * I.e. when PHP 7.4.0 becomes the minimum requirement, this polyfill + * and the associated `_hash_hmac()` function can be safely removed. + * + * @ignore + * @since 3.2.0 + * + * @see _hash_hmac() + * + * @param string $algo Hash algorithm. Accepts 'md5' or 'sha1'. + * @param string $data Data to be hashed. + * @param string $key Secret key to use for generating the hash. + * @param bool $raw_output Optional. Whether to output raw binary data (true), + * or lowercase hexits (false). Default false. + * @return string|false The hash in output determined by `$raw_output`. False if `$algo` + * is unknown or invalid. + */ + function hash_hmac( $algo, $data, $key, $raw_output = false ) { + return _hash_hmac( $algo, $data, $key, $raw_output ); + } +endif; + +/** + * Internal compat function to mimic hash_hmac(). + * + * @ignore + * @since 3.2.0 + * + * @param string $algo Hash algorithm. Accepts 'md5' or 'sha1'. + * @param string $data Data to be hashed. + * @param string $key Secret key to use for generating the hash. + * @param bool $raw_output Optional. Whether to output raw binary data (true), + * or lowercase hexits (false). Default false. + * @return string|false The hash in output determined by `$raw_output`. False if `$algo` + * is unknown or invalid. + */ +function _hash_hmac( $algo, $data, $key, $raw_output = false ) { + $packs = array( + 'md5' => 'H32', + 'sha1' => 'H40', + ); + + if ( ! isset( $packs[ $algo ] ) ) { + return false; + } + + $pack = $packs[ $algo ]; + + if ( strlen( $key ) > 64 ) { + $key = pack( $pack, $algo( $key ) ); + } + + $key = str_pad( $key, 64, chr( 0 ) ); + + $ipad = ( substr( $key, 0, 64 ) ^ str_repeat( chr( 0x36 ), 64 ) ); + $opad = ( substr( $key, 0, 64 ) ^ str_repeat( chr( 0x5C ), 64 ) ); + + $hmac = $algo( $opad . pack( $pack, $algo( $ipad . $data ) ) ); + + if ( $raw_output ) { + return pack( $pack, $hmac ); + } + return $hmac; +} + +if ( ! function_exists( 'hash_equals' ) ) : + /** + * Timing attack safe string comparison + * + * Compares two strings using the same time whether they're equal or not. + * + * Note: It can leak the length of a string when arguments of differing length are supplied. + * + * This function was added in PHP 5.6. + * However, the Hash extension may be explicitly disabled on select servers. + * As of PHP 7.4.0, the Hash extension is a core PHP extension and can no + * longer be disabled. + * I.e. when PHP 7.4.0 becomes the minimum requirement, this polyfill + * can be safely removed. + * + * @since 3.9.2 + * + * @param string $a Expected string. + * @param string $b Actual, user supplied, string. + * @return bool Whether strings are equal. + */ + function hash_equals( $a, $b ) { + $a_length = strlen( $a ); + if ( strlen( $b ) !== $a_length ) { + return false; + } + $result = 0; + + // Do not attempt to "optimize" this. + for ( $i = 0; $i < $a_length; $i++ ) { + $result |= ord( $a[ $i ] ) ^ ord( $b[ $i ] ); + } + + return 0 === $result; + } +endif; + +// random_int() was introduced in PHP 7.0. +if ( ! function_exists( 'random_int' ) ) { + require ABSPATH . WPINC . '/random_compat/random.php'; +} +// sodium_crypto_box() was introduced in PHP 7.2. +if ( ! function_exists( 'sodium_crypto_box' ) ) { + require ABSPATH . WPINC . '/sodium_compat/autoload.php'; +} + +if ( ! function_exists( 'is_countable' ) ) { + /** + * Polyfill for is_countable() function added in PHP 7.3. + * + * Verify that the content of a variable is an array or an object + * implementing the Countable interface. + * + * @since 4.9.6 + * + * @param mixed $var The value to check. + * + * @return bool True if `$var` is countable, false otherwise. + */ + function is_countable( $var ) { + return ( is_array( $var ) + || $var instanceof Countable + || $var instanceof SimpleXMLElement + || $var instanceof ResourceBundle + ); + } +} + +if ( ! function_exists( 'is_iterable' ) ) { + /** + * Polyfill for is_iterable() function added in PHP 7.1. + * + * Verify that the content of a variable is an array or an object + * implementing the Traversable interface. + * + * @since 4.9.6 + * + * @param mixed $var The value to check. + * + * @return bool True if `$var` is iterable, false otherwise. + */ + function is_iterable( $var ) { + return ( is_array( $var ) || $var instanceof Traversable ); + } +} diff --git a/wp-includes/cron.php b/wp-includes/cron.php new file mode 100644 index 0000000..e6957c3 --- /dev/null +++ b/wp-includes/cron.php @@ -0,0 +1,998 @@ + $hook, + 'timestamp' => $timestamp, + 'schedule' => false, + 'args' => $args, + ); + + /** + * Filter to preflight or hijack scheduling an event. + * + * Returning a non-null value will short-circuit adding the event to the + * cron array, causing the function to return the filtered value instead. + * + * Both single events and recurring events are passed through this filter; + * single events have `$event->schedule` as false, whereas recurring events + * have this set to a recurrence from wp_get_schedules(). Recurring + * events also have the integer recurrence interval set as `$event->interval`. + * + * For plugins replacing wp-cron, it is recommended you check for an + * identical event within ten minutes and apply the {@see 'schedule_event'} + * filter to check if another plugin has disallowed the event before scheduling. + * + * Return true if the event was scheduled, false if not. + * + * @since 5.1.0 + * + * @param null|bool $pre Value to return instead. Default null to continue adding the event. + * @param stdClass $event { + * An object containing an event's data. + * + * @type string $hook Action hook to execute when the event is run. + * @type int $timestamp Unix timestamp (UTC) for when to next run the event. + * @type string|false $schedule How often the event should subsequently recur. + * @type array $args Array containing each separate argument to pass to the hook's callback function. + * @type int $interval The interval time in seconds for the schedule. Only present for recurring events. + * } + */ + $pre = apply_filters( 'pre_schedule_event', null, $event ); + if ( null !== $pre ) { + return $pre; + } + + /* + * Check for a duplicated event. + * + * Don't schedule an event if there's already an identical event + * within 10 minutes. + * + * When scheduling events within ten minutes of the current time, + * all past identical events are considered duplicates. + * + * When scheduling an event with a past timestamp (ie, before the + * current time) all events scheduled within the next ten minutes + * are considered duplicates. + */ + $crons = (array) _get_cron_array(); + $key = md5( serialize( $event->args ) ); + $duplicate = false; + + if ( $event->timestamp < time() + 10 * MINUTE_IN_SECONDS ) { + $min_timestamp = 0; + } else { + $min_timestamp = $event->timestamp - 10 * MINUTE_IN_SECONDS; + } + + if ( $event->timestamp < time() ) { + $max_timestamp = time() + 10 * MINUTE_IN_SECONDS; + } else { + $max_timestamp = $event->timestamp + 10 * MINUTE_IN_SECONDS; + } + + foreach ( $crons as $event_timestamp => $cron ) { + if ( $event_timestamp < $min_timestamp ) { + continue; + } + if ( $event_timestamp > $max_timestamp ) { + break; + } + if ( isset( $cron[ $event->hook ][ $key ] ) ) { + $duplicate = true; + break; + } + } + + if ( $duplicate ) { + return false; + } + + /** + * Modify an event before it is scheduled. + * + * @since 3.1.0 + * + * @param stdClass $event { + * An object containing an event's data. + * + * @type string $hook Action hook to execute when the event is run. + * @type int $timestamp Unix timestamp (UTC) for when to next run the event. + * @type string|false $schedule How often the event should subsequently recur. + * @type array $args Array containing each separate argument to pass to the hook's callback function. + * @type int $interval The interval time in seconds for the schedule. Only present for recurring events. + * } + */ + $event = apply_filters( 'schedule_event', $event ); + + // A plugin disallowed this event. + if ( ! $event ) { + return false; + } + + $crons[ $event->timestamp ][ $event->hook ][ $key ] = array( + 'schedule' => $event->schedule, + 'args' => $event->args, + ); + uksort( $crons, 'strnatcasecmp' ); + return _set_cron_array( $crons ); +} + +/** + * Schedules a recurring event. + * + * Schedules a hook which will be triggered by WordPress at the specified interval. + * The action will trigger when someone visits your WordPress site if the scheduled + * time has passed. + * + * Valid values for the recurrence are 'hourly', 'daily', and 'twicedaily'. These can + * be extended using the {@see 'cron_schedules'} filter in wp_get_schedules(). + * + * Note that scheduling an event to occur within 10 minutes of an existing event + * with the same action hook will be ignored unless you pass unique `$args` values + * for each scheduled event. + * + * Use wp_next_scheduled() to prevent duplicate events. + * + * Use wp_schedule_single_event() to schedule a non-recurring event. + * + * @since 2.1.0 + * @since 5.1.0 Return value modified to boolean indicating success or failure, + * {@see 'pre_schedule_event'} filter added to short-circuit the function. + * + * @link https://developer.wordpress.org/reference/functions/wp_schedule_event/ + * + * @param int $timestamp Unix timestamp (UTC) for when to next run the event. + * @param string $recurrence How often the event should subsequently recur. See wp_get_schedules() for accepted values. + * @param string $hook Action hook to execute when the event is run. + * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. + * @return bool True if event successfully scheduled. False for failure. + */ +function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array() ) { + // Make sure timestamp is a positive integer. + if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { + return false; + } + + $schedules = wp_get_schedules(); + + if ( ! isset( $schedules[ $recurrence ] ) ) { + return false; + } + + $event = (object) array( + 'hook' => $hook, + 'timestamp' => $timestamp, + 'schedule' => $recurrence, + 'args' => $args, + 'interval' => $schedules[ $recurrence ]['interval'], + ); + + /** This filter is documented in wp-includes/cron.php */ + $pre = apply_filters( 'pre_schedule_event', null, $event ); + if ( null !== $pre ) { + return $pre; + } + + /** This filter is documented in wp-includes/cron.php */ + $event = apply_filters( 'schedule_event', $event ); + + // A plugin disallowed this event. + if ( ! $event ) { + return false; + } + + $key = md5( serialize( $event->args ) ); + + $crons = _get_cron_array(); + $crons[ $event->timestamp ][ $event->hook ][ $key ] = array( + 'schedule' => $event->schedule, + 'args' => $event->args, + 'interval' => $event->interval, + ); + uksort( $crons, 'strnatcasecmp' ); + return _set_cron_array( $crons ); +} + +/** + * Reschedules a recurring event. + * + * Mainly for internal use, this takes the time stamp of a previously run + * recurring event and reschedules it for its next run. + * + * To change upcoming scheduled events, use wp_schedule_event() to + * change the recurrence frequency. + * + * @since 2.1.0 + * @since 5.1.0 Return value modified to boolean indicating success or failure, + * {@see 'pre_reschedule_event'} filter added to short-circuit the function. + * + * @param int $timestamp Unix timestamp (UTC) for when the event was scheduled. + * @param string $recurrence How often the event should subsequently recur. See wp_get_schedules() for accepted values. + * @param string $hook Action hook to execute when the event is run. + * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. + * @return bool True if event successfully rescheduled. False for failure. + */ +function wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array() ) { + // Make sure timestamp is a positive integer. + if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { + return false; + } + + $schedules = wp_get_schedules(); + $interval = 0; + + // First we try to get the interval from the schedule. + if ( isset( $schedules[ $recurrence ] ) ) { + $interval = $schedules[ $recurrence ]['interval']; + } + + // Now we try to get it from the saved interval in case the schedule disappears. + if ( 0 === $interval ) { + $scheduled_event = wp_get_scheduled_event( $hook, $args, $timestamp ); + if ( $scheduled_event && isset( $scheduled_event->interval ) ) { + $interval = $scheduled_event->interval; + } + } + + $event = (object) array( + 'hook' => $hook, + 'timestamp' => $timestamp, + 'schedule' => $recurrence, + 'args' => $args, + 'interval' => $interval, + ); + + /** + * Filter to preflight or hijack rescheduling of events. + * + * Returning a non-null value will short-circuit the normal rescheduling + * process, causing the function to return the filtered value instead. + * + * For plugins replacing wp-cron, return true if the event was successfully + * rescheduled, false if not. + * + * @since 5.1.0 + * + * @param null|bool $pre Value to return instead. Default null to continue adding the event. + * @param stdClass $event { + * An object containing an event's data. + * + * @type string $hook Action hook to execute when the event is run. + * @type int $timestamp Unix timestamp (UTC) for when to next run the event. + * @type string|false $schedule How often the event should subsequently recur. + * @type array $args Array containing each separate argument to pass to the hook's callback function. + * @type int $interval The interval time in seconds for the schedule. Only present for recurring events. + * } + */ + $pre = apply_filters( 'pre_reschedule_event', null, $event ); + if ( null !== $pre ) { + return $pre; + } + + // Now we assume something is wrong and fail to schedule. + if ( 0 == $interval ) { + return false; + } + + $now = time(); + + if ( $timestamp >= $now ) { + $timestamp = $now + $interval; + } else { + $timestamp = $now + ( $interval - ( ( $now - $timestamp ) % $interval ) ); + } + + return wp_schedule_event( $timestamp, $recurrence, $hook, $args ); +} + +/** + * Unschedule a previously scheduled event. + * + * The $timestamp and $hook parameters are required so that the event can be + * identified. + * + * @since 2.1.0 + * @since 5.1.0 Return value modified to boolean indicating success or failure, + * {@see 'pre_unschedule_event'} filter added to short-circuit the function. + * + * @param int $timestamp Unix timestamp (UTC) of the event. + * @param string $hook Action hook of the event. + * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. + * Although not passed to a callback, these arguments are used to uniquely identify the + * event, so they should be the same as those used when originally scheduling the event. + * @return bool True if event successfully unscheduled. False for failure. + */ +function wp_unschedule_event( $timestamp, $hook, $args = array() ) { + // Make sure timestamp is a positive integer. + if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { + return false; + } + + /** + * Filter to preflight or hijack unscheduling of events. + * + * Returning a non-null value will short-circuit the normal unscheduling + * process, causing the function to return the filtered value instead. + * + * For plugins replacing wp-cron, return true if the event was successfully + * unscheduled, false if not. + * + * @since 5.1.0 + * + * @param null|bool $pre Value to return instead. Default null to continue unscheduling the event. + * @param int $timestamp Timestamp for when to run the event. + * @param string $hook Action hook, the execution of which will be unscheduled. + * @param array $args Arguments to pass to the hook's callback function. + */ + $pre = apply_filters( 'pre_unschedule_event', null, $timestamp, $hook, $args ); + if ( null !== $pre ) { + return $pre; + } + + $crons = _get_cron_array(); + $key = md5( serialize( $args ) ); + unset( $crons[ $timestamp ][ $hook ][ $key ] ); + if ( empty( $crons[ $timestamp ][ $hook ] ) ) { + unset( $crons[ $timestamp ][ $hook ] ); + } + if ( empty( $crons[ $timestamp ] ) ) { + unset( $crons[ $timestamp ] ); + } + return _set_cron_array( $crons ); +} + +/** + * Unschedules all events attached to the hook with the specified arguments. + * + * Warning: This function may return Boolean FALSE, but may also return a non-Boolean + * value which evaluates to FALSE. For information about casting to booleans see the + * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use + * the `===` operator for testing the return value of this function. + * + * @since 2.1.0 + * @since 5.1.0 Return value modified to indicate success or failure, + * {@see 'pre_clear_scheduled_hook'} filter added to short-circuit the function. + * + * @param string $hook Action hook, the execution of which will be unscheduled. + * @param array $args Optional. Arguments that were to be passed to the hook's callback function. + * @return int|false On success an integer indicating number of events unscheduled (0 indicates no + * events were registered with the hook and arguments combination), false if + * unscheduling one or more events fail. + */ +function wp_clear_scheduled_hook( $hook, $args = array() ) { + // Backward compatibility. + // Previously, this function took the arguments as discrete vars rather than an array like the rest of the API. + if ( ! is_array( $args ) ) { + _deprecated_argument( __FUNCTION__, '3.0.0', __( 'This argument has changed to an array to match the behavior of the other cron functions.' ) ); + $args = array_slice( func_get_args(), 1 ); + } + + /** + * Filter to preflight or hijack clearing a scheduled hook. + * + * Returning a non-null value will short-circuit the normal unscheduling + * process, causing the function to return the filtered value instead. + * + * For plugins replacing wp-cron, return the number of events successfully + * unscheduled (zero if no events were registered with the hook) or false + * if unscheduling one or more events fails. + * + * @since 5.1.0 + * + * @param null|int|false $pre Value to return instead. Default null to continue unscheduling the event. + * @param string $hook Action hook, the execution of which will be unscheduled. + * @param array $args Arguments to pass to the hook's callback function. + */ + $pre = apply_filters( 'pre_clear_scheduled_hook', null, $hook, $args ); + if ( null !== $pre ) { + return $pre; + } + + /* + * This logic duplicates wp_next_scheduled(). + * It's required due to a scenario where wp_unschedule_event() fails due to update_option() failing, + * and, wp_next_scheduled() returns the same schedule in an infinite loop. + */ + $crons = _get_cron_array(); + if ( empty( $crons ) ) { + return 0; + } + + $results = array(); + $key = md5( serialize( $args ) ); + foreach ( $crons as $timestamp => $cron ) { + if ( isset( $cron[ $hook ][ $key ] ) ) { + $results[] = wp_unschedule_event( $timestamp, $hook, $args ); + } + } + if ( in_array( false, $results, true ) ) { + return false; + } + return count( $results ); +} + +/** + * Unschedules all events attached to the hook. + * + * Can be useful for plugins when deactivating to clean up the cron queue. + * + * Warning: This function may return Boolean FALSE, but may also return a non-Boolean + * value which evaluates to FALSE. For information about casting to booleans see the + * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use + * the `===` operator for testing the return value of this function. + * + * @since 4.9.0 + * @since 5.1.0 Return value added to indicate success or failure. + * + * @param string $hook Action hook, the execution of which will be unscheduled. + * @return int|false On success an integer indicating number of events unscheduled (0 indicates no + * events were registered on the hook), false if unscheduling fails. + */ +function wp_unschedule_hook( $hook ) { + /** + * Filter to preflight or hijack clearing all events attached to the hook. + * + * Returning a non-null value will short-circuit the normal unscheduling + * process, causing the function to return the filtered value instead. + * + * For plugins replacing wp-cron, return the number of events successfully + * unscheduled (zero if no events were registered with the hook) or false + * if unscheduling one or more events fails. + * + * @since 5.1.0 + * + * @param null|int|false $pre Value to return instead. Default null to continue unscheduling the hook. + * @param string $hook Action hook, the execution of which will be unscheduled. + */ + $pre = apply_filters( 'pre_unschedule_hook', null, $hook ); + if ( null !== $pre ) { + return $pre; + } + + $crons = _get_cron_array(); + if ( empty( $crons ) ) { + return 0; + } + + $results = array(); + foreach ( $crons as $timestamp => $args ) { + if ( ! empty( $crons[ $timestamp ][ $hook ] ) ) { + $results[] = count( $crons[ $timestamp ][ $hook ] ); + } + unset( $crons[ $timestamp ][ $hook ] ); + + if ( empty( $crons[ $timestamp ] ) ) { + unset( $crons[ $timestamp ] ); + } + } + + /* + * If the results are empty (zero events to unschedule), no attempt + * to update the cron array is required. + */ + if ( empty( $results ) ) { + return 0; + } + if ( _set_cron_array( $crons ) ) { + return array_sum( $results ); + } + return false; +} + +/** + * Retrieve a scheduled event. + * + * Retrieve the full event object for a given event, if no timestamp is specified the next + * scheduled event is returned. + * + * @since 5.1.0 + * + * @param string $hook Action hook of the event. + * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. + * Although not passed to a callback, these arguments are used to uniquely identify the + * event, so they should be the same as those used when originally scheduling the event. + * @param int|null $timestamp Optional. Unix timestamp (UTC) of the event. If not specified, the next scheduled event is returned. + * @return object|false The event object. False if the event does not exist. + */ +function wp_get_scheduled_event( $hook, $args = array(), $timestamp = null ) { + /** + * Filter to preflight or hijack retrieving a scheduled event. + * + * Returning a non-null value will short-circuit the normal process, + * returning the filtered value instead. + * + * Return false if the event does not exist, otherwise an event object + * should be returned. + * + * @since 5.1.0 + * + * @param null|false|object $pre Value to return instead. Default null to continue retrieving the event. + * @param string $hook Action hook of the event. + * @param array $args Array containing each separate argument to pass to the hook's callback function. + * Although not passed to a callback, these arguments are used to uniquely identify + * the event. + * @param int|null $timestamp Unix timestamp (UTC) of the event. Null to retrieve next scheduled event. + */ + $pre = apply_filters( 'pre_get_scheduled_event', null, $hook, $args, $timestamp ); + if ( null !== $pre ) { + return $pre; + } + + if ( null !== $timestamp && ! is_numeric( $timestamp ) ) { + return false; + } + + $crons = _get_cron_array(); + if ( empty( $crons ) ) { + return false; + } + + $key = md5( serialize( $args ) ); + + if ( ! $timestamp ) { + // Get next event. + $next = false; + foreach ( $crons as $timestamp => $cron ) { + if ( isset( $cron[ $hook ][ $key ] ) ) { + $next = $timestamp; + break; + } + } + if ( ! $next ) { + return false; + } + + $timestamp = $next; + } elseif ( ! isset( $crons[ $timestamp ][ $hook ][ $key ] ) ) { + return false; + } + + $event = (object) array( + 'hook' => $hook, + 'timestamp' => $timestamp, + 'schedule' => $crons[ $timestamp ][ $hook ][ $key ]['schedule'], + 'args' => $args, + ); + + if ( isset( $crons[ $timestamp ][ $hook ][ $key ]['interval'] ) ) { + $event->interval = $crons[ $timestamp ][ $hook ][ $key ]['interval']; + } + + return $event; +} + +/** + * Retrieve the next timestamp for an event. + * + * @since 2.1.0 + * + * @param string $hook Action hook of the event. + * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. + * Although not passed to a callback, these arguments are used to uniquely identify the + * event, so they should be the same as those used when originally scheduling the event. + * @return int|false The Unix timestamp of the next time the event will occur. False if the event doesn't exist. + */ +function wp_next_scheduled( $hook, $args = array() ) { + $next_event = wp_get_scheduled_event( $hook, $args ); + if ( ! $next_event ) { + return false; + } + + return $next_event->timestamp; +} + +/** + * Sends a request to run cron through HTTP request that doesn't halt page loading. + * + * @since 2.1.0 + * @since 5.1.0 Return values added. + * + * @param int $gmt_time Optional. Unix timestamp (UTC). Default 0 (current time is used). + * @return bool True if spawned, false if no events spawned. + */ +function spawn_cron( $gmt_time = 0 ) { + if ( ! $gmt_time ) { + $gmt_time = microtime( true ); + } + + if ( defined( 'DOING_CRON' ) || isset( $_GET['doing_wp_cron'] ) ) { + return false; + } + + /* + * Get the cron lock, which is a Unix timestamp of when the last cron was spawned + * and has not finished running. + * + * Multiple processes on multiple web servers can run this code concurrently, + * this lock attempts to make spawning as atomic as possible. + */ + $lock = get_transient( 'doing_cron' ); + + if ( $lock > $gmt_time + 10 * MINUTE_IN_SECONDS ) { + $lock = 0; + } + + // Don't run if another process is currently running it or more than once every 60 sec. + if ( $lock + WP_CRON_LOCK_TIMEOUT > $gmt_time ) { + return false; + } + + // Sanity check. + $crons = wp_get_ready_cron_jobs(); + if ( empty( $crons ) ) { + return false; + } + + $keys = array_keys( $crons ); + if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { + return false; + } + + if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) { + if ( 'GET' !== $_SERVER['REQUEST_METHOD'] || defined( 'DOING_AJAX' ) || defined( 'XMLRPC_REQUEST' ) ) { + return false; + } + + $doing_wp_cron = sprintf( '%.22F', $gmt_time ); + set_transient( 'doing_cron', $doing_wp_cron ); + + ob_start(); + wp_redirect( add_query_arg( 'doing_wp_cron', $doing_wp_cron, wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); + echo ' '; + + // Flush any buffers and send the headers. + wp_ob_end_flush_all(); + flush(); + + include_once ABSPATH . 'wp-cron.php'; + return true; + } + + // Set the cron lock with the current unix timestamp, when the cron is being spawned. + $doing_wp_cron = sprintf( '%.22F', $gmt_time ); + set_transient( 'doing_cron', $doing_wp_cron ); + + /** + * Filters the cron request arguments. + * + * @since 3.5.0 + * @since 4.5.0 The `$doing_wp_cron` parameter was added. + * + * @param array $cron_request_array { + * An array of cron request URL arguments. + * + * @type string $url The cron request URL. + * @type int $key The 22 digit GMT microtime. + * @type array $args { + * An array of cron request arguments. + * + * @type int $timeout The request timeout in seconds. Default .01 seconds. + * @type bool $blocking Whether to set blocking for the request. Default false. + * @type bool $sslverify Whether SSL should be verified for the request. Default false. + * } + * } + * @param string $doing_wp_cron The unix timestamp of the cron lock. + */ + $cron_request = apply_filters( + 'cron_request', + array( + 'url' => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ), + 'key' => $doing_wp_cron, + 'args' => array( + 'timeout' => 0.01, + 'blocking' => false, + /** This filter is documented in wp-includes/class-wp-http-streams.php */ + 'sslverify' => apply_filters( 'https_local_ssl_verify', false ), + ), + ), + $doing_wp_cron + ); + + $result = wp_remote_post( $cron_request['url'], $cron_request['args'] ); + return ! is_wp_error( $result ); +} + +/** + * Run scheduled callbacks or spawn cron for all scheduled events. + * + * Warning: This function may return Boolean FALSE, but may also return a non-Boolean + * value which evaluates to FALSE. For information about casting to booleans see the + * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use + * the `===` operator for testing the return value of this function. + * + * @since 2.1.0 + * @since 5.1.0 Return value added to indicate success or failure. + * + * @return bool|int On success an integer indicating number of events spawned (0 indicates no + * events needed to be spawned), false if spawning fails for one or more events. + */ +function wp_cron() { + // Prevent infinite loops caused by lack of wp-cron.php. + if ( strpos( $_SERVER['REQUEST_URI'], '/wp-cron.php' ) !== false || ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) ) { + return 0; + } + + $crons = wp_get_ready_cron_jobs(); + if ( empty( $crons ) ) { + return 0; + } + + $gmt_time = microtime( true ); + $keys = array_keys( $crons ); + if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { + return 0; + } + + $schedules = wp_get_schedules(); + $results = array(); + foreach ( $crons as $timestamp => $cronhooks ) { + if ( $timestamp > $gmt_time ) { + break; + } + foreach ( (array) $cronhooks as $hook => $args ) { + if ( isset( $schedules[ $hook ]['callback'] ) && ! call_user_func( $schedules[ $hook ]['callback'] ) ) { + continue; + } + $results[] = spawn_cron( $gmt_time ); + break 2; + } + } + + if ( in_array( false, $results, true ) ) { + return false; + } + return count( $results ); +} + +/** + * Retrieve supported event recurrence schedules. + * + * The default supported recurrences are 'hourly', 'twicedaily', 'daily', and 'weekly'. + * A plugin may add more by hooking into the {@see 'cron_schedules'} filter. + * The filter accepts an array of arrays. The outer array has a key that is the name + * of the schedule, for example 'monthly'. The value is an array with two keys, + * one is 'interval' and the other is 'display'. + * + * The 'interval' is a number in seconds of when the cron job should run. + * So for 'hourly' the time is `HOUR_IN_SECONDS` (60 * 60 or 3600). For 'monthly', + * the value would be `MONTH_IN_SECONDS` (30 * 24 * 60 * 60 or 2592000). + * + * The 'display' is the description. For the 'monthly' key, the 'display' + * would be `__( 'Once Monthly' )`. + * + * For your plugin, you will be passed an array. You can easily add your + * schedule by doing the following. + * + * // Filter parameter variable name is 'array'. + * $array['monthly'] = array( + * 'interval' => MONTH_IN_SECONDS, + * 'display' => __( 'Once Monthly' ) + * ); + * + * @since 2.1.0 + * @since 5.4.0 The 'weekly' schedule was added. + * + * @return array + */ +function wp_get_schedules() { + $schedules = array( + 'hourly' => array( + 'interval' => HOUR_IN_SECONDS, + 'display' => __( 'Once Hourly' ), + ), + 'twicedaily' => array( + 'interval' => 12 * HOUR_IN_SECONDS, + 'display' => __( 'Twice Daily' ), + ), + 'daily' => array( + 'interval' => DAY_IN_SECONDS, + 'display' => __( 'Once Daily' ), + ), + 'weekly' => array( + 'interval' => WEEK_IN_SECONDS, + 'display' => __( 'Once Weekly' ), + ), + ); + + /** + * Filters the non-default cron schedules. + * + * @since 2.1.0 + * + * @param array $new_schedules An array of non-default cron schedules. Default empty. + */ + return array_merge( apply_filters( 'cron_schedules', array() ), $schedules ); +} + +/** + * Retrieve the recurrence schedule for an event. + * + * @see wp_get_schedules() for available schedules. + * + * @since 2.1.0 + * @since 5.1.0 {@see 'get_schedule'} filter added. + * + * @param string $hook Action hook to identify the event. + * @param array $args Optional. Arguments passed to the event's callback function. + * @return string|false False, if no schedule. Schedule name on success. + */ +function wp_get_schedule( $hook, $args = array() ) { + $schedule = false; + $event = wp_get_scheduled_event( $hook, $args ); + + if ( $event ) { + $schedule = $event->schedule; + } + + /** + * Filter the schedule for a hook. + * + * @since 5.1.0 + * + * @param string|bool $schedule Schedule for the hook. False if not found. + * @param string $hook Action hook to execute when cron is run. + * @param array $args Optional. Arguments to pass to the hook's callback function. + */ + return apply_filters( 'get_schedule', $schedule, $hook, $args ); +} + +/** + * Retrieve cron jobs ready to be run. + * + * Returns the results of _get_cron_array() limited to events ready to be run, + * ie, with a timestamp in the past. + * + * @since 5.1.0 + * + * @return array Cron jobs ready to be run. + */ +function wp_get_ready_cron_jobs() { + /** + * Filter to preflight or hijack retrieving ready cron jobs. + * + * Returning an array will short-circuit the normal retrieval of ready + * cron jobs, causing the function to return the filtered value instead. + * + * @since 5.1.0 + * + * @param null|array $pre Array of ready cron tasks to return instead. Default null + * to continue using results from _get_cron_array(). + */ + $pre = apply_filters( 'pre_get_ready_cron_jobs', null ); + if ( null !== $pre ) { + return $pre; + } + + $crons = _get_cron_array(); + + if ( false === $crons ) { + return array(); + } + + $gmt_time = microtime( true ); + $keys = array_keys( $crons ); + if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { + return array(); + } + + $results = array(); + foreach ( $crons as $timestamp => $cronhooks ) { + if ( $timestamp > $gmt_time ) { + break; + } + $results[ $timestamp ] = $cronhooks; + } + + return $results; +} + +// +// Private functions. +// + +/** + * Retrieve cron info array option. + * + * @since 2.1.0 + * @access private + * + * @return array|false CRON info array. + */ +function _get_cron_array() { + $cron = get_option( 'cron' ); + if ( ! is_array( $cron ) ) { + return false; + } + + if ( ! isset( $cron['version'] ) ) { + $cron = _upgrade_cron_array( $cron ); + } + + unset( $cron['version'] ); + + return $cron; +} + +/** + * Updates the CRON option with the new CRON array. + * + * @since 2.1.0 + * @since 5.1.0 Return value modified to outcome of update_option(). + * + * @access private + * + * @param array $cron Cron info array from _get_cron_array(). + * @return bool True if cron array updated, false on failure. + */ +function _set_cron_array( $cron ) { + $cron['version'] = 2; + return update_option( 'cron', $cron ); +} + +/** + * Upgrade a Cron info array. + * + * This function upgrades the Cron info array to version 2. + * + * @since 2.1.0 + * @access private + * + * @param array $cron Cron info array from _get_cron_array(). + * @return array An upgraded Cron info array. + */ +function _upgrade_cron_array( $cron ) { + if ( isset( $cron['version'] ) && 2 == $cron['version'] ) { + return $cron; + } + + $new_cron = array(); + + foreach ( (array) $cron as $timestamp => $hooks ) { + foreach ( (array) $hooks as $hook => $args ) { + $key = md5( serialize( $args['args'] ) ); + $new_cron[ $timestamp ][ $hook ][ $key ] = $args; + } + } + + $new_cron['version'] = 2; + update_option( 'cron', $new_cron ); + return $new_cron; +} diff --git a/wp-includes/css/admin-bar-rtl.css b/wp-includes/css/admin-bar-rtl.css new file mode 100644 index 0000000..b91928c --- /dev/null +++ b/wp-includes/css/admin-bar-rtl.css @@ -0,0 +1,1169 @@ +/*! This file is auto-generated */ +#wpadminbar * { + height: auto; + width: auto; + margin: 0; + padding: 0; + position: static; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + font-size: 13px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 2.46153846; + border-radius: 0; + box-sizing: content-box; + transition: none; + -webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */ + -moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */ +} + +.rtl #wpadminbar * { + font-family: Tahoma, sans-serif; +} + +html:lang(he-il) .rtl #wpadminbar * { + font-family: Arial, sans-serif; +} + +#wpadminbar .ab-empty-item { + cursor: default; +} + +#wpadminbar .ab-empty-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #eee; +} + +#wpadminbar #wp-admin-bar-site-name a.ab-item, +#wpadminbar #wp-admin-bar-my-sites a.ab-item { + white-space: nowrap; +} + +#wpadminbar ul li:before, +#wpadminbar ul li:after { + content: normal; +} + +#wpadminbar a, +#wpadminbar a:hover, +#wpadminbar a img, +#wpadminbar a img:hover { + border: none; + text-decoration: none; + background: none; +} + +#wpadminbar a:focus, +#wpadminbar a:active, +#wpadminbar input[type="text"], +#wpadminbar input[type="password"], +#wpadminbar input[type="number"], +#wpadminbar input[type="search"], +#wpadminbar input[type="email"], +#wpadminbar input[type="url"], +#wpadminbar select, +#wpadminbar textarea, +#wpadminbar div { + box-shadow: none; +} + +#wpadminbar a:focus { + /* Inherits transparent outline only visible in Windows High Contrast mode */ + outline-offset: -1px; +} + +#wpadminbar { + direction: rtl; + color: #ccc; + font-size: 13px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 2.46153846; + height: 32px; + position: fixed; + top: 0; + right: 0; + width: 100%; + min-width: 600px; /* match the min-width of the body in wp-admin/css/common.css */ + z-index: 99999; + background: #23282d; +} + +#wpadminbar .ab-sub-wrapper, +#wpadminbar ul, +#wpadminbar ul li { + background: none; + clear: none; + list-style: none; + margin: 0; + padding: 0; + position: relative; + text-indent: 0; + z-index: 99999; +} + +#wpadminbar ul#wp-admin-bar-root-default>li { + margin-left: 0; +} + +#wpadminbar .quicklinks ul { + text-align: right; +} + +#wpadminbar li { + float: right; +} + +#wpadminbar .ab-empty-item { + outline: none; +} + +#wpadminbar .quicklinks .ab-top-secondary > li { + float: left; +} + +#wpadminbar .quicklinks a, +#wpadminbar .quicklinks .ab-empty-item, +#wpadminbar .shortlink-input { + height: 32px; + display: block; + padding: 0 10px; + margin: 0; +} + +#wpadminbar .quicklinks > ul > li > a { + padding: 0 7px 0 8px; +} + +#wpadminbar .menupop .ab-sub-wrapper, +#wpadminbar .shortlink-input { + margin: 0; + padding: 0; + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); + background: #32373c; + display: none; + position: absolute; + float: none; +} + +#wpadminbar.ie7 .menupop .ab-sub-wrapper, +#wpadminbar.ie7 .shortlink-input { + top: 32px; + right: 0; +} + +#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { + min-width: 100%; +} + +#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper { + left: 0; + right: auto; +} + +#wpadminbar .ab-submenu { + padding: 6px 0; +} + +#wpadminbar .selected .shortlink-input { + display: block; +} + +#wpadminbar .quicklinks .menupop ul li { + float: none; +} + +#wpadminbar .quicklinks .menupop ul li a strong { + font-weight: 600; +} + +#wpadminbar .quicklinks .menupop ul li .ab-item, +#wpadminbar .quicklinks .menupop ul li a strong, +#wpadminbar .quicklinks .menupop.hover ul li .ab-item, +#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, +#wpadminbar .shortlink-input { + line-height: 2; + height: 26px; + white-space: nowrap; + min-width: 140px; +} + +#wpadminbar .shortlink-input { + width: 200px; +} + +#wpadminbar.nojs li:hover > .ab-sub-wrapper, +#wpadminbar li.hover > .ab-sub-wrapper { + display: block; +} + +#wpadminbar .menupop li:hover > .ab-sub-wrapper, +#wpadminbar .menupop li.hover > .ab-sub-wrapper { + margin-right: 100%; + margin-top: -32px; +} + +#wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper, +#wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper { + margin-right: 0; + right: inherit; + left: 100%; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar .ab-top-menu > li.hover > .ab-item { + background: #32373c; + color: #00b9eb; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #00b9eb; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, +#wpadminbar .ab-icon, +#wpadminbar .ab-item:before, +.wp-admin-bar-arrow { + position: relative; + float: right; + font: normal 20px/1 dashicons; + speak: none; + padding: 4px 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-image: none !important; + margin-left: 6px; +} + +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar #adminbarsearch:before { + color: #a0a5aa; + color: rgba(240, 245, 250, 0.6); +} + +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar #adminbarsearch:before { + position: relative; + transition: all .1s ease-in-out; +} + +#wpadminbar .ab-label { + display: inline-block; + height: 32px; +} + +#wpadminbar .ab-submenu .ab-item { + color: #b4b9be; + color: rgba(240, 245, 250, 0.7); +} + +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop ul li a strong, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #b4b9be; + color: rgba(240, 245, 250, 0.7); +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover, +#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #00b9eb; +} + +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #b4b9be; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #00b9eb; +} + +#wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before, +#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { + position: absolute; + font: normal 17px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#wpadminbar .menupop .menupop > .ab-item { + display: block; + padding-left: 2em; +} + +#wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before { + top: 1px; + left: 10px; + padding: 4px 0; + content: "\f141"; + color: inherit; +} + +#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item { + padding-right: 2em; + padding-left: 1em; +} + +#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item .wp-admin-bar-arrow:before { + top: 1px; + right: 6px; + content: "\f139"; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary { + display: block; + position: relative; + left: auto; + margin: 0; + box-shadow: none; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #464b50; +} + +#wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover, +#wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a { + color: #00b9eb; +} + +#wpadminbar .quicklinks a span#ab-updates { + background: #eee; + color: #32373c; + display: inline; + padding: 2px 5px; + font-size: 10px; + font-weight: 600; + border-radius: 10px; +} + +#wpadminbar .quicklinks a:hover span#ab-updates { + background: #fff; + color: #000; +} + +#wpadminbar .ab-top-secondary { + float: left; +} + +#wpadminbar ul li:last-child, +#wpadminbar ul li:last-child .ab-item { + box-shadow: none; +} + +/** + * Recovery Mode + */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #ca4a1f; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #c0461e; +} + +/** + * My Account + */ +#wp-admin-bar-my-account > ul { + min-width: 198px; +} + +#wp-admin-bar-my-account > .ab-item:before { + content: "\f110"; + top: 2px; + float: left; + margin-right: 6px; + margin-left: 0; +} + +#wp-admin-bar-my-account.with-avatar > .ab-item:before { + display: none; + content: none; +} + +#wp-admin-bar-my-account.with-avatar > ul { + min-width: 270px; +} + +#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item { + white-space: nowrap; +} + +#wpadminbar #wp-admin-bar-user-actions > li { + margin-right: 16px; + margin-left: 16px; +} + +#wpadminbar #wp-admin-bar-user-actions.ab-submenu { + padding: 6px 0 12px; +} + +#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { + margin-right: 88px; +} + +#wpadminbar #wp-admin-bar-user-info { + margin-top: 6px; + margin-bottom: 15px; + height: auto; + background: none; +} + +#wp-admin-bar-user-info .avatar { + position: absolute; + right: -72px; + top: 4px; + width: 64px; + height: 64px; +} + +#wpadminbar #wp-admin-bar-user-info a { + background: none; + height: auto; +} + +#wpadminbar #wp-admin-bar-user-info span { + background: none; + padding: 0; + height: 18px; +} + +#wpadminbar #wp-admin-bar-user-info .display-name, +#wpadminbar #wp-admin-bar-user-info .username { + display: block; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #a0a5aa; + font-size: 11px; +} + +#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, +#wpadminbar #wp-admin-bar-my-account.with-avatar > a img { + width: auto; + height: 16px; + padding: 0; + border: 1px solid #82878c; + background: #eee; + line-height: 1.84615384; + vertical-align: middle; + margin: -4px 6px 0 0; + float: none; + display: inline; +} + +#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, +#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > a img { + width: auto; +} + +/** + * WP Logo + */ +#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { + width: 15px; + height: 20px; + margin-left: 0; + padding: 6px 0 5px; +} + +#wpadminbar #wp-admin-bar-wp-logo > .ab-item { + padding: 0 7px; +} + +#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { + content: "\f120"; + top: 2px; +} + +/* + * My Sites & Site Title + */ +#wpadminbar .quicklinks li .blavatar { + display: inline-block; + vertical-align: middle; + font: normal 16px/1 dashicons !important; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #eee; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar { + color: #00b9eb; +} + +#wpadminbar .quicklinks li .blavatar:before { + content: "\f120"; + height: 16px; + width: 16px; + display: inline-block; + margin: 0 -2px 2px 8px; +} + +#wpadminbar #wp-admin-bar-appearance { + margin-top: -12px; +} + +#wpadminbar #wp-admin-bar-my-sites > .ab-item:before, +#wpadminbar #wp-admin-bar-site-name > .ab-item:before { + content: "\f541"; + top: 2px; +} + +#wpadminbar #wp-admin-bar-customize > .ab-item:before { + content: "\f540"; + top: 2px; +} + + +#wpadminbar #wp-admin-bar-edit > .ab-item:before { + content: "\f464"; + top: 2px; +} + +#wpadminbar #wp-admin-bar-site-name > .ab-item:before { + content: "\f226"; +} + +.wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before { + content: "\f102"; +} + + + +/** + * Comments + */ +#wpadminbar #wp-admin-bar-comments .ab-icon { + margin-left: 6px; +} + +#wpadminbar #wp-admin-bar-comments .ab-icon:before { + content: "\f101"; + top: 3px; +} + +#wpadminbar #wp-admin-bar-comments .count-0 { + opacity: .5; +} + +/** + * New Content + */ +#wpadminbar #wp-admin-bar-new-content .ab-icon:before { + content: "\f132"; + top: 4px; +} + +/** + * Updates + */ +#wpadminbar #wp-admin-bar-updates .ab-icon:before { + content: "\f463"; + top: 2px; +} + +/** + * Search + */ +#wpadminbar.ie8 #wp-admin-bar-search { + display: block; + min-width: 32px; +} +#wpadminbar #wp-admin-bar-search .ab-item { + padding: 0; + background: transparent; +} + +#wpadminbar #adminbarsearch { + position: relative; + height: 32px; + padding: 0 2px; + z-index: 1; +} + +#wpadminbar #adminbarsearch:before { + position: absolute; + top: 6px; + right: 5px; + z-index: 20; + font: normal 20px/1 dashicons !important; + content: "\f179"; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* The admin bar search field needs to reset many styles that might be inherited from the active Theme CSS. See ticket #40313. */ +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { + display: inline-block; + float: none; + position: relative; + z-index: 30; + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 1.84615384; + text-indent: 0; + height: 24px; + width: 24px; + max-width: none; + padding: 0 24px 0 3px; + margin: 0; + color: #ccc; + background-color: rgba(255, 255, 255, 0); + border: none; + outline: none; + cursor: pointer; + box-shadow: none; + box-sizing: border-box; + transition-duration: 400ms; + transition-property: width, background; + transition-timing-function: ease; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + z-index: 10; + color: #000; + width: 200px; + background-color: rgba(255, 255, 255, 0.9); + cursor: text; + border: 0; +} + +#wpadminbar.ie7 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { + margin-top: 3px; + width: 120px; +} + +#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { + /* IE8 z-index bug with transparent / empty elements - fill in with an encoded transparent GIF */ + background: transparent 100% 0 repeat scroll url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} + +/* IE8 doesn't redraw the pseudo elements unless you make a change to the content */ +#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before { + content: "\f179 "; /* extra space */ +} + +#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + background: #fff; + z-index: -1; +} + +#wpadminbar #adminbarsearch .adminbar-button { + display: none; +} + +/** + * Customize support classes + */ +.no-customize-support .hide-if-no-customize, +.customize-support .hide-if-customize, +.no-customize-support #wpadminbar .hide-if-no-customize, +.no-customize-support.wp-core-ui .hide-if-no-customize, +.no-customize-support .wp-core-ui .hide-if-no-customize, +.customize-support #wpadminbar .hide-if-customize, +.customize-support.wp-core-ui .hide-if-customize, +.customize-support .wp-core-ui .hide-if-customize { + display: none; +} + +/* Skip link */ +#wpadminbar .screen-reader-text, +#wpadminbar .screen-reader-text span { + 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; + width: 1px; + word-wrap: normal !important; +} + +#wpadminbar .screen-reader-shortcut { + position: absolute; + top: -1000em; +} + +#wpadminbar .screen-reader-shortcut:focus { + right: 6px; + top: 7px; + height: auto; + width: auto; + display: block; + font-size: 14px; + font-weight: 600; + padding: 15px 23px 14px; + background: #f1f1f1; + color: #0073aa; + z-index: 100000; + line-height: normal; + text-decoration: none; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); +} + +/** + * IE 6-targeted rules + */ +* html #wpadminbar { + overflow: hidden; + position: absolute; +} + +* html #wpadminbar .quicklinks ul li a { + float: right; +} + +* html #wpadminbar .menupop a span { + background-image: none; +} + +/* No @font-face support */ +.no-font-face #wpadminbar ul.ab-top-menu > li > a.ab-item { + display: block; + width: 45px; + text-align: center; + overflow: hidden; + margin: 0 3px; +} + +.no-font-face #wpadminbar #wp-admin-bar-my-sites > .ab-item, +.no-font-face #wpadminbar #wp-admin-bar-site-name > .ab-item, +.no-font-face #wpadminbar #wp-admin-bar-edit > .ab-item { + text-indent: 0; +} + +.no-font-face #wpadminbar .ab-icon, +.no-font-face #wpadminbar .ab-icon:before, +.no-font-face #wpadminbar a.ab-item:before, +.no-font-face #wpadminbar #wp-admin-bar-wp-logo > .ab-item { + display: none !important; +} + +.no-font-face #wpadminbar ul.ab-top-menu > li > a > span.ab-label { + display: inline; +} + +.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon { + display: inline !important; +} + +.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before { + content: "Menu"; + font: 14px/45px sans-serif !important; + display: inline-block !important; + color: #fff; +} + +.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item { + color: #fff; +} +/* End no @font-face */ + +@media screen and (max-width: 782px) { + /* Toolbar Touchification*/ + html #wpadminbar { + height: 46px; + min-width: 240px; /* match the min-width of the body in wp-admin/css/common.css */ + } + + #wpadminbar * { + font-size: 14px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 2.28571428; + } + + #wpadminbar .quicklinks > ul > li > a, + #wpadminbar .quicklinks .ab-empty-item { + padding: 0; + height: 46px; + line-height: 3.28571428; + width: auto; + } + + #wpadminbar .ab-icon { + font: 40px/1 dashicons !important; + margin: 0; + padding: 0; + width: 52px; + height: 46px; + text-align: center; + } + + #wpadminbar .ab-icon:before { + text-align: center; + } + + #wpadminbar .ab-submenu { + padding: 0; + } + + #wpadminbar #wp-admin-bar-site-name a.ab-item, + #wpadminbar #wp-admin-bar-my-sites a.ab-item, + #wpadminbar #wp-admin-bar-my-account a.ab-item { + text-overflow: clip; + } + + #wpadminbar .quicklinks .menupop ul li .ab-item, + #wpadminbar .quicklinks .menupop ul li a strong, + #wpadminbar .quicklinks .menupop.hover ul li .ab-item, + #wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, + #wpadminbar .shortlink-input { + line-height: 1.6; + } + + #wpadminbar .ab-label { + display: none; + } + + #wpadminbar .menupop li:hover > .ab-sub-wrapper, + #wpadminbar .menupop li.hover > .ab-sub-wrapper { + margin-top: -46px; + } + + #wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item { + padding-left: 30px; + } + + #wpadminbar .menupop .menupop > .ab-item:before { + top: 10px; + left: 6px; + } + + #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item { + font-size: 16px; + padding: 8px 16px; + } + + #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty { + display: none; + } + + /* WP logo */ + #wpadminbar #wp-admin-bar-wp-logo > .ab-item { + padding: 0; + } + + #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { + padding: 0; + width: 52px; + height: 46px; + text-align: center; + vertical-align: top; + } + + #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { + font: 28px/1 dashicons !important; + top: -3px; + } + + #wpadminbar .ab-icon, + #wpadminbar .ab-item:before { + padding: 0; + } + + /* My Sites and "Site Title" menu */ + #wpadminbar #wp-admin-bar-my-sites > .ab-item, + #wpadminbar #wp-admin-bar-site-name > .ab-item, + #wpadminbar #wp-admin-bar-customize > .ab-item, + #wpadminbar #wp-admin-bar-edit > .ab-item, + #wpadminbar #wp-admin-bar-my-account > .ab-item { + text-indent: 100%; + white-space: nowrap; + overflow: hidden; + width: 52px; + padding: 0; + color: #a0a5aa; /* @todo not needed? this text is hidden */ + position: relative; + } + + #wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, + #wpadminbar .ab-icon, + #wpadminbar .ab-item:before { + padding: 0; + margin-left: 0; + } + + #wpadminbar #wp-admin-bar-edit > .ab-item:before, + #wpadminbar #wp-admin-bar-my-sites > .ab-item:before, + #wpadminbar #wp-admin-bar-site-name > .ab-item:before, + #wpadminbar #wp-admin-bar-customize > .ab-item:before, + #wpadminbar #wp-admin-bar-my-account > .ab-item:before { + display: block; + text-indent: 0; + font: normal 32px/1 dashicons; + speak: none; + top: 7px; + width: 52px; + text-align: center; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + #wpadminbar #wp-admin-bar-appearance { + margin-top: 0; + } + + #wpadminbar .quicklinks li .blavatar:before { + display: none; + } + + /* Search */ + #wpadminbar #wp-admin-bar-search { + display: none; + } + + /* New Content */ + #wpadminbar #wp-admin-bar-new-content .ab-icon:before { + top: 0; + line-height: 1.33333333; + height: 46px !important; + text-align: center; + width: 52px; + display: block; + } + + /* Updates */ + #wpadminbar #wp-admin-bar-updates { + text-align: center; + } + + #wpadminbar #wp-admin-bar-updates .ab-icon:before { + top: 3px; + } + + /* Comments */ + #wpadminbar #wp-admin-bar-comments .ab-icon { + margin: 0; + } + + #wpadminbar #wp-admin-bar-comments .ab-icon:before { + display: block; + font-size: 34px; + height: 46px; + line-height: 1.38235294; + top: 0; + } + + /* My Account */ + #wpadminbar #wp-admin-bar-my-account > a { + position: relative; + white-space: nowrap; + text-indent: 150%; /* More than 100% indention is needed since this element has padding */ + width: 28px; + padding: 0 10px; + overflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */ + } + + #wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + position: absolute; + top: 13px; + left: 10px; + width: 26px; + height: 26px; + } + + #wpadminbar #wp-admin-bar-user-actions.ab-submenu { + padding: 0; + } + + #wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar { + display: none; + } + + #wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { + margin: 0; + } + + #wpadminbar #wp-admin-bar-user-info .display-name { + height: auto; + font-size: 16px; + line-height: 1.5; + color: #eee; + } + + #wpadminbar #wp-admin-bar-user-info a { + padding-top: 4px; + } + + #wpadminbar #wp-admin-bar-user-info .username { + line-height: 0.8 !important; + margin-bottom: -2px; + } + + /* Show only default top level items */ + #wp-toolbar > ul > li { + display: none; + } + + #wpadminbar li#wp-admin-bar-menu-toggle, + #wpadminbar li#wp-admin-bar-wp-logo, + #wpadminbar li#wp-admin-bar-my-sites, + #wpadminbar li#wp-admin-bar-updates, + #wpadminbar li#wp-admin-bar-site-name, + #wpadminbar li#wp-admin-bar-customize, + #wpadminbar li#wp-admin-bar-new-content, + #wpadminbar li#wp-admin-bar-edit, + #wpadminbar li#wp-admin-bar-comments, + #wpadminbar li#wp-admin-bar-my-account { + display: block; + } + + /* Allow dropdown list items to appear normally */ + #wpadminbar li:hover ul li, + #wpadminbar li.hover ul li, + #wpadminbar li:hover ul li:hover ul li { + display: list-item; + } + + /* Override default min-width so dropdown lists aren't stretched + to 100% viewport width at responsive sizes. */ + #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { + min-width: -webkit-fit-content; + min-width: fit-content; + } + + #wpadminbar ul#wp-admin-bar-root-default > li { + margin-left: 0; + } + + /* Experimental fix for touch toolbar dropdown positioning */ + #wpadminbar .ab-top-menu, + #wpadminbar .ab-top-secondary, + #wpadminbar #wp-admin-bar-wp-logo, + #wpadminbar #wp-admin-bar-my-sites, + #wpadminbar #wp-admin-bar-site-name, + #wpadminbar #wp-admin-bar-updates, + #wpadminbar #wp-admin-bar-comments, + #wpadminbar #wp-admin-bar-new-content, + #wpadminbar #wp-admin-bar-edit, + #wpadminbar #wp-admin-bar-my-account { + position: static; + } + + #wpadminbar #wp-admin-bar-my-account { + float: left; + } + + .network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account { + margin-left: 0; + } + + /* Realign arrows on taller responsive submenus */ + + #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { + top: 10px; + right: 0; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + #wpadminbar { + position: absolute; + } + + #wp-responsive-overlay { + position: fixed; + top: 0; + right: 0; + width: 100%; + height: 100%; + z-index: 400; + } + + #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { + width: 100%; + right: 0; + } + + #wpadminbar .menupop .menupop > .ab-item:before { + display: none; + } + + #wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper { + margin-right: 0; + } + + #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { + margin: 0; + width: 100%; + top: auto; + right: auto; + position: relative; + } + + #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item { + font-size: 16px; + padding: 6px 30px 19px 15px; + } + + #wpadminbar li:hover ul li ul li { + display: list-item; + } + + #wpadminbar li#wp-admin-bar-wp-logo, + #wpadminbar li#wp-admin-bar-updates { + display: none; + } + + /* Make submenus full-width at this size */ + + #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { + position: static; + box-shadow: none; + } +} + +/* Very narrow screens */ +@media screen and (max-width: 400px) { + #wpadminbar li#wp-admin-bar-comments { + display: none; + } +} diff --git a/wp-includes/css/admin-bar-rtl.min.css b/wp-includes/css/admin-bar-rtl.min.css new file mode 100644 index 0000000..25b7704 --- /dev/null +++ b/wp-includes/css/admin-bar-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#wpadminbar *{height:auto;width:auto;margin:0;padding:0;position:static;text-shadow:none;text-transform:none;letter-spacing:normal;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;border-radius:0;box-sizing:content-box;transition:none;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:auto}.rtl #wpadminbar *{font-family:Tahoma,sans-serif}html:lang(he-il) .rtl #wpadminbar *{font-family:Arial,sans-serif}#wpadminbar .ab-empty-item{cursor:default}#wpadminbar .ab-empty-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#eee}#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{white-space:nowrap}#wpadminbar ul li:after,#wpadminbar ul li:before{content:normal}#wpadminbar a,#wpadminbar a img,#wpadminbar a img:hover,#wpadminbar a:hover{border:none;text-decoration:none;background:0 0}#wpadminbar a:active,#wpadminbar a:focus,#wpadminbar div,#wpadminbar input[type=email],#wpadminbar input[type=number],#wpadminbar input[type=password],#wpadminbar input[type=search],#wpadminbar input[type=text],#wpadminbar input[type=url],#wpadminbar select,#wpadminbar textarea{box-shadow:none}#wpadminbar a:focus{outline-offset:-1px}#wpadminbar{direction:rtl;color:#ccc;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;height:32px;position:fixed;top:0;right:0;width:100%;min-width:600px;z-index:99999;background:#23282d}#wpadminbar .ab-sub-wrapper,#wpadminbar ul,#wpadminbar ul li{background:0 0;clear:none;list-style:none;margin:0;padding:0;position:relative;text-indent:0;z-index:99999}#wpadminbar ul#wp-admin-bar-root-default>li{margin-left:0}#wpadminbar .quicklinks ul{text-align:right}#wpadminbar li{float:right}#wpadminbar .ab-empty-item{outline:0}#wpadminbar .quicklinks .ab-top-secondary>li{float:left}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks a,#wpadminbar .shortlink-input{height:32px;display:block;padding:0 10px;margin:0}#wpadminbar .quicklinks>ul>li>a{padding:0 7px 0 8px}#wpadminbar .menupop .ab-sub-wrapper,#wpadminbar .shortlink-input{margin:0;padding:0;box-shadow:0 3px 5px rgba(0,0,0,.2);background:#32373c;display:none;position:absolute;float:none}#wpadminbar.ie7 .menupop .ab-sub-wrapper,#wpadminbar.ie7 .shortlink-input{top:32px;right:0}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:100%}#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper{left:0;right:auto}#wpadminbar .ab-submenu{padding:6px 0}#wpadminbar .selected .shortlink-input{display:block}#wpadminbar .quicklinks .menupop ul li{float:none}#wpadminbar .quicklinks .menupop ul li a strong{font-weight:600}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:2;height:26px;white-space:nowrap;min-width:140px}#wpadminbar .shortlink-input{width:200px}#wpadminbar li.hover>.ab-sub-wrapper,#wpadminbar.nojs li:hover>.ab-sub-wrapper{display:block}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-right:100%;margin-top:-32px}#wpadminbar .ab-top-secondary .menupop li.hover>.ab-sub-wrapper,#wpadminbar .ab-top-secondary .menupop li:hover>.ab-sub-wrapper{margin-right:0;right:inherit;left:100%}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{background:#32373c;color:#00b9eb}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label,#wpadminbar>#wp-toolbar li.hover span.ab-label{color:#00b9eb}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon,.wp-admin-bar-arrow{position:relative;float:right;font:normal 20px/1 dashicons;speak:none;padding:4px 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:none!important;margin-left:6px}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{color:#a0a5aa;color:rgba(240,245,250,.6)}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{position:relative;transition:all .1s ease-in-out}#wpadminbar .ab-label{display:inline-block;height:32px}#wpadminbar .ab-submenu .ab-item{color:#b4b9be;color:rgba(240,245,250,.7)}#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#b4b9be;color:rgba(240,245,250,.7)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#00b9eb}#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#b4b9be}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#00b9eb}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before,#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{position:absolute;font:normal 17px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar .menupop .menupop>.ab-item{display:block;padding-left:2em}#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;left:10px;padding:4px 0;content:"\f141";color:inherit}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item{padding-right:2em;padding-left:1em}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;right:6px;content:"\f139"}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary{display:block;position:relative;left:auto;margin:0;box-shadow:none}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#464b50}#wpadminbar .quicklinks .menupop .ab-sub-secondary>li .ab-item:focus a,#wpadminbar .quicklinks .menupop .ab-sub-secondary>li>a:hover{color:#00b9eb}#wpadminbar .quicklinks a span#ab-updates{background:#eee;color:#32373c;display:inline;padding:2px 5px;font-size:10px;font-weight:600;border-radius:10px}#wpadminbar .quicklinks a:hover span#ab-updates{background:#fff;color:#000}#wpadminbar .ab-top-secondary{float:left}#wpadminbar ul li:last-child,#wpadminbar ul li:last-child .ab-item{box-shadow:none}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#ca4a1f}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#c0461e}#wp-admin-bar-my-account>ul{min-width:198px}#wp-admin-bar-my-account>.ab-item:before{content:"\f110";top:2px;float:left;margin-right:6px;margin-left:0}#wp-admin-bar-my-account.with-avatar>.ab-item:before{display:none;content:none}#wp-admin-bar-my-account.with-avatar>ul{min-width:270px}#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item{white-space:nowrap}#wpadminbar #wp-admin-bar-user-actions>li{margin-right:16px;margin-left:16px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:6px 0 12px}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin-right:88px}#wpadminbar #wp-admin-bar-user-info{margin-top:6px;margin-bottom:15px;height:auto;background:0 0}#wp-admin-bar-user-info .avatar{position:absolute;right:-72px;top:4px;width:64px;height:64px}#wpadminbar #wp-admin-bar-user-info a{background:0 0;height:auto}#wpadminbar #wp-admin-bar-user-info span{background:0 0;padding:0;height:18px}#wpadminbar #wp-admin-bar-user-info .display-name,#wpadminbar #wp-admin-bar-user-info .username{display:block}#wpadminbar #wp-admin-bar-user-info .username{color:#a0a5aa;font-size:11px}#wpadminbar #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar #wp-admin-bar-my-account.with-avatar>a img{width:auto;height:16px;padding:0;border:1px solid #82878c;background:#eee;line-height:1.84615384;vertical-align:middle;margin:-4px 6px 0 0;float:none;display:inline}#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar>a img{width:auto}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{width:15px;height:20px;margin-left:0;padding:6px 0 5px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0 7px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{content:"\f120";top:2px}#wpadminbar .quicklinks li .blavatar{display:inline-block;vertical-align:middle;font:normal 16px/1 dashicons!important;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#eee}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar{color:#00b9eb}#wpadminbar .quicklinks li .blavatar:before{content:"\f120";height:16px;width:16px;display:inline-block;margin:0 -2px 2px 8px}#wpadminbar #wp-admin-bar-appearance{margin-top:-12px}#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f541";top:2px}#wpadminbar #wp-admin-bar-customize>.ab-item:before{content:"\f540";top:2px}#wpadminbar #wp-admin-bar-edit>.ab-item:before{content:"\f464";top:2px}#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f226"}.wp-admin #wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f102"}#wpadminbar #wp-admin-bar-comments .ab-icon{margin-left:6px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{content:"\f101";top:3px}#wpadminbar #wp-admin-bar-comments .count-0{opacity:.5}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{content:"\f132";top:4px}#wpadminbar #wp-admin-bar-updates .ab-icon:before{content:"\f463";top:2px}#wpadminbar.ie8 #wp-admin-bar-search{display:block;min-width:32px}#wpadminbar #wp-admin-bar-search .ab-item{padding:0;background:0 0}#wpadminbar #adminbarsearch{position:relative;height:32px;padding:0 2px;z-index:1}#wpadminbar #adminbarsearch:before{position:absolute;top:6px;right:5px;z-index:20;font:normal 20px/1 dashicons!important;content:"\f179";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{display:inline-block;float:none;position:relative;z-index:30;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.84615384;text-indent:0;height:24px;width:24px;max-width:none;padding:0 24px 0 3px;margin:0;color:#ccc;background-color:rgba(255,255,255,0);border:none;outline:0;cursor:pointer;box-shadow:none;box-sizing:border-box;transition-duration:.4s;transition-property:width,background;transition-timing-function:ease}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{z-index:10;color:#000;width:200px;background-color:rgba(255,255,255,.9);cursor:text;border:0}#wpadminbar.ie7>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{margin-top:3px;width:120px}#wpadminbar.ie8>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{background:transparent 100% 0 repeat scroll url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before{content:"\f179 "}#wpadminbar.ie8>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{background:#fff;z-index:-1}#wpadminbar #adminbarsearch .adminbar-button{display:none}.customize-support #wpadminbar .hide-if-customize,.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support #wpadminbar .hide-if-no-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#wpadminbar .screen-reader-text,#wpadminbar .screen-reader-text span{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;width:1px;word-wrap:normal!important}#wpadminbar .screen-reader-shortcut{position:absolute;top:-1000em}#wpadminbar .screen-reader-shortcut:focus{right:6px;top:7px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#0073aa;z-index:100000;line-height:normal;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}* html #wpadminbar{overflow:hidden;position:absolute}* html #wpadminbar .quicklinks ul li a{float:right}* html #wpadminbar .menupop a span{background-image:none}.no-font-face #wpadminbar ul.ab-top-menu>li>a.ab-item{display:block;width:45px;text-align:center;overflow:hidden;margin:0 3px}.no-font-face #wpadminbar #wp-admin-bar-edit>.ab-item,.no-font-face #wpadminbar #wp-admin-bar-my-sites>.ab-item,.no-font-face #wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:0}.no-font-face #wpadminbar #wp-admin-bar-wp-logo>.ab-item,.no-font-face #wpadminbar .ab-icon,.no-font-face #wpadminbar .ab-icon:before,.no-font-face #wpadminbar a.ab-item:before{display:none!important}.no-font-face #wpadminbar ul.ab-top-menu>li>a>span.ab-label{display:inline}.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon{display:inline!important}.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before{content:"Menu";font:14px/45px sans-serif!important;display:inline-block!important;color:#fff}.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item{color:#fff}@media screen and (max-width:782px){html #wpadminbar{height:46px;min-width:240px}#wpadminbar *{font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.28571428}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks>ul>li>a{padding:0;height:46px;line-height:3.28571428;width:auto}#wpadminbar .ab-icon{font:40px/1 dashicons!important;margin:0;padding:0;width:52px;height:46px;text-align:center}#wpadminbar .ab-icon:before{text-align:center}#wpadminbar .ab-submenu{padding:0}#wpadminbar #wp-admin-bar-my-account a.ab-item,#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{text-overflow:clip}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:1.6}#wpadminbar .ab-label{display:none}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-top:-46px}#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop>.ab-item{padding-left:30px}#wpadminbar .menupop .menupop>.ab-item:before{top:10px;left:6px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper .ab-item{font-size:16px;padding:8px 16px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper a:empty{display:none}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{padding:0;width:52px;height:46px;text-align:center;vertical-align:top}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{font:28px/1 dashicons!important;top:-3px}#wpadminbar .ab-icon,#wpadminbar .ab-item:before{padding:0}#wpadminbar #wp-admin-bar-customize>.ab-item,#wpadminbar #wp-admin-bar-edit>.ab-item,#wpadminbar #wp-admin-bar-my-account>.ab-item,#wpadminbar #wp-admin-bar-my-sites>.ab-item,#wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:100%;white-space:nowrap;overflow:hidden;width:52px;padding:0;color:#a0a5aa;position:relative}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{padding:0;margin-left:0}#wpadminbar #wp-admin-bar-customize>.ab-item:before,#wpadminbar #wp-admin-bar-edit>.ab-item:before,#wpadminbar #wp-admin-bar-my-account>.ab-item:before,#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{display:block;text-indent:0;font:normal 32px/1 dashicons;speak:none;top:7px;width:52px;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar #wp-admin-bar-appearance{margin-top:0}#wpadminbar .quicklinks li .blavatar:before{display:none}#wpadminbar #wp-admin-bar-search{display:none}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{top:0;line-height:1.33333333;height:46px!important;text-align:center;width:52px;display:block}#wpadminbar #wp-admin-bar-updates{text-align:center}#wpadminbar #wp-admin-bar-updates .ab-icon:before{top:3px}#wpadminbar #wp-admin-bar-comments .ab-icon{margin:0}#wpadminbar #wp-admin-bar-comments .ab-icon:before{display:block;font-size:34px;height:46px;line-height:1.38235294;top:0}#wpadminbar #wp-admin-bar-my-account>a{position:relative;white-space:nowrap;text-indent:150%;width:28px;padding:0 10px;overflow:hidden}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{position:absolute;top:13px;left:10px;width:26px;height:26px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:0}#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar{display:none}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin:0}#wpadminbar #wp-admin-bar-user-info .display-name{height:auto;font-size:16px;line-height:1.5;color:#eee}#wpadminbar #wp-admin-bar-user-info a{padding-top:4px}#wpadminbar #wp-admin-bar-user-info .username{line-height:.8!important;margin-bottom:-2px}#wp-toolbar>ul>li{display:none}#wpadminbar li#wp-admin-bar-comments,#wpadminbar li#wp-admin-bar-customize,#wpadminbar li#wp-admin-bar-edit,#wpadminbar li#wp-admin-bar-menu-toggle,#wpadminbar li#wp-admin-bar-my-account,#wpadminbar li#wp-admin-bar-my-sites,#wpadminbar li#wp-admin-bar-new-content,#wpadminbar li#wp-admin-bar-site-name,#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:block}#wpadminbar li.hover ul li,#wpadminbar li:hover ul li,#wpadminbar li:hover ul li:hover ul li{display:list-item}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:-webkit-fit-content;min-width:fit-content}#wpadminbar ul#wp-admin-bar-root-default>li{margin-left:0}#wpadminbar #wp-admin-bar-comments,#wpadminbar #wp-admin-bar-edit,#wpadminbar #wp-admin-bar-my-account,#wpadminbar #wp-admin-bar-my-sites,#wpadminbar #wp-admin-bar-new-content,#wpadminbar #wp-admin-bar-site-name,#wpadminbar #wp-admin-bar-updates,#wpadminbar #wp-admin-bar-wp-logo,#wpadminbar .ab-top-menu,#wpadminbar .ab-top-secondary{position:static}#wpadminbar #wp-admin-bar-my-account{float:left}.network-admin #wpadminbar ul#wp-admin-bar-top-secondary>li#wp-admin-bar-my-account{margin-left:0}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:10px;right:0}}@media screen and (max-width:600px){#wpadminbar{position:absolute}#wp-responsive-overlay{position:fixed;top:0;right:0;width:100%;height:100%;z-index:400}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{width:100%;right:0}#wpadminbar .menupop .menupop>.ab-item:before{display:none}#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper{margin-right:0}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{margin:0;width:100%;top:auto;right:auto;position:relative}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper .ab-item{font-size:16px;padding:6px 30px 19px 15px}#wpadminbar li:hover ul li ul li{display:list-item}#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:none}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{position:static;box-shadow:none}}@media screen and (max-width:400px){#wpadminbar li#wp-admin-bar-comments{display:none}} \ No newline at end of file diff --git a/wp-includes/css/admin-bar.css b/wp-includes/css/admin-bar.css new file mode 100644 index 0000000..d0f4457 --- /dev/null +++ b/wp-includes/css/admin-bar.css @@ -0,0 +1,1168 @@ +#wpadminbar * { + height: auto; + width: auto; + margin: 0; + padding: 0; + position: static; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + font-size: 13px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 2.46153846; + border-radius: 0; + box-sizing: content-box; + transition: none; + -webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */ + -moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */ +} + +.rtl #wpadminbar * { + font-family: Tahoma, sans-serif; +} + +html:lang(he-il) .rtl #wpadminbar * { + font-family: Arial, sans-serif; +} + +#wpadminbar .ab-empty-item { + cursor: default; +} + +#wpadminbar .ab-empty-item, +#wpadminbar a.ab-item, +#wpadminbar > #wp-toolbar span.ab-label, +#wpadminbar > #wp-toolbar span.noticon { + color: #eee; +} + +#wpadminbar #wp-admin-bar-site-name a.ab-item, +#wpadminbar #wp-admin-bar-my-sites a.ab-item { + white-space: nowrap; +} + +#wpadminbar ul li:before, +#wpadminbar ul li:after { + content: normal; +} + +#wpadminbar a, +#wpadminbar a:hover, +#wpadminbar a img, +#wpadminbar a img:hover { + border: none; + text-decoration: none; + background: none; +} + +#wpadminbar a:focus, +#wpadminbar a:active, +#wpadminbar input[type="text"], +#wpadminbar input[type="password"], +#wpadminbar input[type="number"], +#wpadminbar input[type="search"], +#wpadminbar input[type="email"], +#wpadminbar input[type="url"], +#wpadminbar select, +#wpadminbar textarea, +#wpadminbar div { + box-shadow: none; +} + +#wpadminbar a:focus { + /* Inherits transparent outline only visible in Windows High Contrast mode */ + outline-offset: -1px; +} + +#wpadminbar { + direction: ltr; + color: #ccc; + font-size: 13px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 2.46153846; + height: 32px; + position: fixed; + top: 0; + left: 0; + width: 100%; + min-width: 600px; /* match the min-width of the body in wp-admin/css/common.css */ + z-index: 99999; + background: #23282d; +} + +#wpadminbar .ab-sub-wrapper, +#wpadminbar ul, +#wpadminbar ul li { + background: none; + clear: none; + list-style: none; + margin: 0; + padding: 0; + position: relative; + text-indent: 0; + z-index: 99999; +} + +#wpadminbar ul#wp-admin-bar-root-default>li { + margin-right: 0; +} + +#wpadminbar .quicklinks ul { + text-align: left; +} + +#wpadminbar li { + float: left; +} + +#wpadminbar .ab-empty-item { + outline: none; +} + +#wpadminbar .quicklinks .ab-top-secondary > li { + float: right; +} + +#wpadminbar .quicklinks a, +#wpadminbar .quicklinks .ab-empty-item, +#wpadminbar .shortlink-input { + height: 32px; + display: block; + padding: 0 10px; + margin: 0; +} + +#wpadminbar .quicklinks > ul > li > a { + padding: 0 8px 0 7px; +} + +#wpadminbar .menupop .ab-sub-wrapper, +#wpadminbar .shortlink-input { + margin: 0; + padding: 0; + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); + background: #32373c; + display: none; + position: absolute; + float: none; +} + +#wpadminbar.ie7 .menupop .ab-sub-wrapper, +#wpadminbar.ie7 .shortlink-input { + top: 32px; + left: 0; +} + +#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { + min-width: 100%; +} + +#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper { + right: 0; + left: auto; +} + +#wpadminbar .ab-submenu { + padding: 6px 0; +} + +#wpadminbar .selected .shortlink-input { + display: block; +} + +#wpadminbar .quicklinks .menupop ul li { + float: none; +} + +#wpadminbar .quicklinks .menupop ul li a strong { + font-weight: 600; +} + +#wpadminbar .quicklinks .menupop ul li .ab-item, +#wpadminbar .quicklinks .menupop ul li a strong, +#wpadminbar .quicklinks .menupop.hover ul li .ab-item, +#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, +#wpadminbar .shortlink-input { + line-height: 2; + height: 26px; + white-space: nowrap; + min-width: 140px; +} + +#wpadminbar .shortlink-input { + width: 200px; +} + +#wpadminbar.nojs li:hover > .ab-sub-wrapper, +#wpadminbar li.hover > .ab-sub-wrapper { + display: block; +} + +#wpadminbar .menupop li:hover > .ab-sub-wrapper, +#wpadminbar .menupop li.hover > .ab-sub-wrapper { + margin-left: 100%; + margin-top: -32px; +} + +#wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper, +#wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper { + margin-left: 0; + left: inherit; + right: 100%; +} + +#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, +#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, +#wpadminbar .ab-top-menu > li.hover > .ab-item { + background: #32373c; + color: #00b9eb; +} + +#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, +#wpadminbar > #wp-toolbar li.hover span.ab-label, +#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { + color: #00b9eb; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, +#wpadminbar .ab-icon, +#wpadminbar .ab-item:before, +.wp-admin-bar-arrow { + position: relative; + float: left; + font: normal 20px/1 dashicons; + speak: none; + padding: 4px 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-image: none !important; + margin-right: 6px; +} + +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar #adminbarsearch:before { + color: #a0a5aa; + color: rgba(240, 245, 250, 0.6); +} + +#wpadminbar .ab-icon:before, +#wpadminbar .ab-item:before, +#wpadminbar #adminbarsearch:before { + position: relative; + transition: all .1s ease-in-out; +} + +#wpadminbar .ab-label { + display: inline-block; + height: 32px; +} + +#wpadminbar .ab-submenu .ab-item { + color: #b4b9be; + color: rgba(240, 245, 250, 0.7); +} + +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop ul li a strong, +#wpadminbar .quicklinks .menupop.hover ul li a, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a { + color: #b4b9be; + color: rgba(240, 245, 250, 0.7); +} + +#wpadminbar .quicklinks .menupop ul li a:hover, +#wpadminbar .quicklinks .menupop ul li a:focus, +#wpadminbar .quicklinks .menupop ul li a:hover strong, +#wpadminbar .quicklinks .menupop ul li a:focus strong, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, +#wpadminbar .quicklinks .menupop.hover ul li a:hover, +#wpadminbar .quicklinks .menupop.hover ul li a:focus, +#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover, +#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, +#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, +#wpadminbar li:hover .ab-icon:before, +#wpadminbar li:hover .ab-item:before, +#wpadminbar li a:focus .ab-icon:before, +#wpadminbar li .ab-item:focus:before, +#wpadminbar li .ab-item:focus .ab-icon:before, +#wpadminbar li.hover .ab-icon:before, +#wpadminbar li.hover .ab-item:before, +#wpadminbar li:hover #adminbarsearch:before, +#wpadminbar li #adminbarsearch.adminbar-focused:before { + color: #00b9eb; +} + +#wpadminbar.mobile .quicklinks .ab-icon:before, +#wpadminbar.mobile .quicklinks .ab-item:before { + color: #b4b9be; +} + +#wpadminbar.mobile .quicklinks .hover .ab-icon:before, +#wpadminbar.mobile .quicklinks .hover .ab-item:before { + color: #00b9eb; +} + +#wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before, +#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { + position: absolute; + font: normal 17px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#wpadminbar .menupop .menupop > .ab-item { + display: block; + padding-right: 2em; +} + +#wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before { + top: 1px; + right: 10px; + padding: 4px 0; + content: "\f139"; + color: inherit; +} + +#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item { + padding-left: 2em; + padding-right: 1em; +} + +#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item .wp-admin-bar-arrow:before { + top: 1px; + left: 6px; + content: "\f141"; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary { + display: block; + position: relative; + right: auto; + margin: 0; + box-shadow: none; +} + +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, +#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { + background: #464b50; +} + +#wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover, +#wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a { + color: #00b9eb; +} + +#wpadminbar .quicklinks a span#ab-updates { + background: #eee; + color: #32373c; + display: inline; + padding: 2px 5px; + font-size: 10px; + font-weight: 600; + border-radius: 10px; +} + +#wpadminbar .quicklinks a:hover span#ab-updates { + background: #fff; + color: #000; +} + +#wpadminbar .ab-top-secondary { + float: right; +} + +#wpadminbar ul li:last-child, +#wpadminbar ul li:last-child .ab-item { + box-shadow: none; +} + +/** + * Recovery Mode + */ +#wpadminbar #wp-admin-bar-recovery-mode { + color: #fff; + background-color: #ca4a1f; +} + +#wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item, +#wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, +#wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { + color: #fff; + background-color: #c0461e; +} + +/** + * My Account + */ +#wp-admin-bar-my-account > ul { + min-width: 198px; +} + +#wp-admin-bar-my-account > .ab-item:before { + content: "\f110"; + top: 2px; + float: right; + margin-left: 6px; + margin-right: 0; +} + +#wp-admin-bar-my-account.with-avatar > .ab-item:before { + display: none; + content: none; +} + +#wp-admin-bar-my-account.with-avatar > ul { + min-width: 270px; +} + +#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item { + white-space: nowrap; +} + +#wpadminbar #wp-admin-bar-user-actions > li { + margin-left: 16px; + margin-right: 16px; +} + +#wpadminbar #wp-admin-bar-user-actions.ab-submenu { + padding: 6px 0 12px; +} + +#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { + margin-left: 88px; +} + +#wpadminbar #wp-admin-bar-user-info { + margin-top: 6px; + margin-bottom: 15px; + height: auto; + background: none; +} + +#wp-admin-bar-user-info .avatar { + position: absolute; + left: -72px; + top: 4px; + width: 64px; + height: 64px; +} + +#wpadminbar #wp-admin-bar-user-info a { + background: none; + height: auto; +} + +#wpadminbar #wp-admin-bar-user-info span { + background: none; + padding: 0; + height: 18px; +} + +#wpadminbar #wp-admin-bar-user-info .display-name, +#wpadminbar #wp-admin-bar-user-info .username { + display: block; +} + +#wpadminbar #wp-admin-bar-user-info .username { + color: #a0a5aa; + font-size: 11px; +} + +#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, +#wpadminbar #wp-admin-bar-my-account.with-avatar > a img { + width: auto; + height: 16px; + padding: 0; + border: 1px solid #82878c; + background: #eee; + line-height: 1.84615384; + vertical-align: middle; + margin: -4px 0 0 6px; + float: none; + display: inline; +} + +#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, +#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > a img { + width: auto; +} + +/** + * WP Logo + */ +#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { + width: 15px; + height: 20px; + margin-right: 0; + padding: 6px 0 5px; +} + +#wpadminbar #wp-admin-bar-wp-logo > .ab-item { + padding: 0 7px; +} + +#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { + content: "\f120"; + top: 2px; +} + +/* + * My Sites & Site Title + */ +#wpadminbar .quicklinks li .blavatar { + display: inline-block; + vertical-align: middle; + font: normal 16px/1 dashicons !important; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #eee; +} + +#wpadminbar .quicklinks li a:hover .blavatar, +#wpadminbar .quicklinks li a:focus .blavatar, +#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar { + color: #00b9eb; +} + +#wpadminbar .quicklinks li .blavatar:before { + content: "\f120"; + height: 16px; + width: 16px; + display: inline-block; + margin: 0 8px 2px -2px; +} + +#wpadminbar #wp-admin-bar-appearance { + margin-top: -12px; +} + +#wpadminbar #wp-admin-bar-my-sites > .ab-item:before, +#wpadminbar #wp-admin-bar-site-name > .ab-item:before { + content: "\f541"; + top: 2px; +} + +#wpadminbar #wp-admin-bar-customize > .ab-item:before { + content: "\f540"; + top: 2px; +} + + +#wpadminbar #wp-admin-bar-edit > .ab-item:before { + content: "\f464"; + top: 2px; +} + +#wpadminbar #wp-admin-bar-site-name > .ab-item:before { + content: "\f226"; +} + +.wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before { + content: "\f102"; +} + + + +/** + * Comments + */ +#wpadminbar #wp-admin-bar-comments .ab-icon { + margin-right: 6px; +} + +#wpadminbar #wp-admin-bar-comments .ab-icon:before { + content: "\f101"; + top: 3px; +} + +#wpadminbar #wp-admin-bar-comments .count-0 { + opacity: .5; +} + +/** + * New Content + */ +#wpadminbar #wp-admin-bar-new-content .ab-icon:before { + content: "\f132"; + top: 4px; +} + +/** + * Updates + */ +#wpadminbar #wp-admin-bar-updates .ab-icon:before { + content: "\f463"; + top: 2px; +} + +/** + * Search + */ +#wpadminbar.ie8 #wp-admin-bar-search { + display: block; + min-width: 32px; +} +#wpadminbar #wp-admin-bar-search .ab-item { + padding: 0; + background: transparent; +} + +#wpadminbar #adminbarsearch { + position: relative; + height: 32px; + padding: 0 2px; + z-index: 1; +} + +#wpadminbar #adminbarsearch:before { + position: absolute; + top: 6px; + left: 5px; + z-index: 20; + font: normal 20px/1 dashicons !important; + content: "\f179"; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* The admin bar search field needs to reset many styles that might be inherited from the active Theme CSS. See ticket #40313. */ +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { + display: inline-block; + float: none; + position: relative; + z-index: 30; + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 1.84615384; + text-indent: 0; + height: 24px; + width: 24px; + max-width: none; + padding: 0 3px 0 24px; + margin: 0; + color: #ccc; + background-color: rgba(255, 255, 255, 0); + border: none; + outline: none; + cursor: pointer; + box-shadow: none; + box-sizing: border-box; + transition-duration: 400ms; + transition-property: width, background; + transition-timing-function: ease; +} + +#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + z-index: 10; + color: #000; + width: 200px; + background-color: rgba(255, 255, 255, 0.9); + cursor: text; + border: 0; +} + +#wpadminbar.ie7 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { + margin-top: 3px; + width: 120px; +} + +#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { + /* IE8 z-index bug with transparent / empty elements - fill in with an encoded transparent GIF */ + background: transparent 0 0 repeat scroll url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} + +/* IE8 doesn't redraw the pseudo elements unless you make a change to the content */ +#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before { + content: "\f179 "; /* extra space */ +} + +#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { + background: #fff; + z-index: -1; +} + +#wpadminbar #adminbarsearch .adminbar-button { + display: none; +} + +/** + * Customize support classes + */ +.no-customize-support .hide-if-no-customize, +.customize-support .hide-if-customize, +.no-customize-support #wpadminbar .hide-if-no-customize, +.no-customize-support.wp-core-ui .hide-if-no-customize, +.no-customize-support .wp-core-ui .hide-if-no-customize, +.customize-support #wpadminbar .hide-if-customize, +.customize-support.wp-core-ui .hide-if-customize, +.customize-support .wp-core-ui .hide-if-customize { + display: none; +} + +/* Skip link */ +#wpadminbar .screen-reader-text, +#wpadminbar .screen-reader-text span { + 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; + width: 1px; + word-wrap: normal !important; +} + +#wpadminbar .screen-reader-shortcut { + position: absolute; + top: -1000em; +} + +#wpadminbar .screen-reader-shortcut:focus { + left: 6px; + top: 7px; + height: auto; + width: auto; + display: block; + font-size: 14px; + font-weight: 600; + padding: 15px 23px 14px; + background: #f1f1f1; + color: #0073aa; + z-index: 100000; + line-height: normal; + text-decoration: none; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); +} + +/** + * IE 6-targeted rules + */ +* html #wpadminbar { + overflow: hidden; + position: absolute; +} + +* html #wpadminbar .quicklinks ul li a { + float: left; +} + +* html #wpadminbar .menupop a span { + background-image: none; +} + +/* No @font-face support */ +.no-font-face #wpadminbar ul.ab-top-menu > li > a.ab-item { + display: block; + width: 45px; + text-align: center; + overflow: hidden; + margin: 0 3px; +} + +.no-font-face #wpadminbar #wp-admin-bar-my-sites > .ab-item, +.no-font-face #wpadminbar #wp-admin-bar-site-name > .ab-item, +.no-font-face #wpadminbar #wp-admin-bar-edit > .ab-item { + text-indent: 0; +} + +.no-font-face #wpadminbar .ab-icon, +.no-font-face #wpadminbar .ab-icon:before, +.no-font-face #wpadminbar a.ab-item:before, +.no-font-face #wpadminbar #wp-admin-bar-wp-logo > .ab-item { + display: none !important; +} + +.no-font-face #wpadminbar ul.ab-top-menu > li > a > span.ab-label { + display: inline; +} + +.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon { + display: inline !important; +} + +.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before { + content: "Menu"; + font: 14px/45px sans-serif !important; + display: inline-block !important; + color: #fff; +} + +.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item { + color: #fff; +} +/* End no @font-face */ + +@media screen and (max-width: 782px) { + /* Toolbar Touchification*/ + html #wpadminbar { + height: 46px; + min-width: 240px; /* match the min-width of the body in wp-admin/css/common.css */ + } + + #wpadminbar * { + font-size: 14px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 2.28571428; + } + + #wpadminbar .quicklinks > ul > li > a, + #wpadminbar .quicklinks .ab-empty-item { + padding: 0; + height: 46px; + line-height: 3.28571428; + width: auto; + } + + #wpadminbar .ab-icon { + font: 40px/1 dashicons !important; + margin: 0; + padding: 0; + width: 52px; + height: 46px; + text-align: center; + } + + #wpadminbar .ab-icon:before { + text-align: center; + } + + #wpadminbar .ab-submenu { + padding: 0; + } + + #wpadminbar #wp-admin-bar-site-name a.ab-item, + #wpadminbar #wp-admin-bar-my-sites a.ab-item, + #wpadminbar #wp-admin-bar-my-account a.ab-item { + text-overflow: clip; + } + + #wpadminbar .quicklinks .menupop ul li .ab-item, + #wpadminbar .quicklinks .menupop ul li a strong, + #wpadminbar .quicklinks .menupop.hover ul li .ab-item, + #wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, + #wpadminbar .shortlink-input { + line-height: 1.6; + } + + #wpadminbar .ab-label { + display: none; + } + + #wpadminbar .menupop li:hover > .ab-sub-wrapper, + #wpadminbar .menupop li.hover > .ab-sub-wrapper { + margin-top: -46px; + } + + #wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item { + padding-right: 30px; + } + + #wpadminbar .menupop .menupop > .ab-item:before { + top: 10px; + right: 6px; + } + + #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item { + font-size: 16px; + padding: 8px 16px; + } + + #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty { + display: none; + } + + /* WP logo */ + #wpadminbar #wp-admin-bar-wp-logo > .ab-item { + padding: 0; + } + + #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { + padding: 0; + width: 52px; + height: 46px; + text-align: center; + vertical-align: top; + } + + #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { + font: 28px/1 dashicons !important; + top: -3px; + } + + #wpadminbar .ab-icon, + #wpadminbar .ab-item:before { + padding: 0; + } + + /* My Sites and "Site Title" menu */ + #wpadminbar #wp-admin-bar-my-sites > .ab-item, + #wpadminbar #wp-admin-bar-site-name > .ab-item, + #wpadminbar #wp-admin-bar-customize > .ab-item, + #wpadminbar #wp-admin-bar-edit > .ab-item, + #wpadminbar #wp-admin-bar-my-account > .ab-item { + text-indent: 100%; + white-space: nowrap; + overflow: hidden; + width: 52px; + padding: 0; + color: #a0a5aa; /* @todo not needed? this text is hidden */ + position: relative; + } + + #wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, + #wpadminbar .ab-icon, + #wpadminbar .ab-item:before { + padding: 0; + margin-right: 0; + } + + #wpadminbar #wp-admin-bar-edit > .ab-item:before, + #wpadminbar #wp-admin-bar-my-sites > .ab-item:before, + #wpadminbar #wp-admin-bar-site-name > .ab-item:before, + #wpadminbar #wp-admin-bar-customize > .ab-item:before, + #wpadminbar #wp-admin-bar-my-account > .ab-item:before { + display: block; + text-indent: 0; + font: normal 32px/1 dashicons; + speak: none; + top: 7px; + width: 52px; + text-align: center; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + #wpadminbar #wp-admin-bar-appearance { + margin-top: 0; + } + + #wpadminbar .quicklinks li .blavatar:before { + display: none; + } + + /* Search */ + #wpadminbar #wp-admin-bar-search { + display: none; + } + + /* New Content */ + #wpadminbar #wp-admin-bar-new-content .ab-icon:before { + top: 0; + line-height: 1.33333333; + height: 46px !important; + text-align: center; + width: 52px; + display: block; + } + + /* Updates */ + #wpadminbar #wp-admin-bar-updates { + text-align: center; + } + + #wpadminbar #wp-admin-bar-updates .ab-icon:before { + top: 3px; + } + + /* Comments */ + #wpadminbar #wp-admin-bar-comments .ab-icon { + margin: 0; + } + + #wpadminbar #wp-admin-bar-comments .ab-icon:before { + display: block; + font-size: 34px; + height: 46px; + line-height: 1.38235294; + top: 0; + } + + /* My Account */ + #wpadminbar #wp-admin-bar-my-account > a { + position: relative; + white-space: nowrap; + text-indent: 150%; /* More than 100% indention is needed since this element has padding */ + width: 28px; + padding: 0 10px; + overflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */ + } + + #wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { + position: absolute; + top: 13px; + right: 10px; + width: 26px; + height: 26px; + } + + #wpadminbar #wp-admin-bar-user-actions.ab-submenu { + padding: 0; + } + + #wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar { + display: none; + } + + #wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { + margin: 0; + } + + #wpadminbar #wp-admin-bar-user-info .display-name { + height: auto; + font-size: 16px; + line-height: 1.5; + color: #eee; + } + + #wpadminbar #wp-admin-bar-user-info a { + padding-top: 4px; + } + + #wpadminbar #wp-admin-bar-user-info .username { + line-height: 0.8 !important; + margin-bottom: -2px; + } + + /* Show only default top level items */ + #wp-toolbar > ul > li { + display: none; + } + + #wpadminbar li#wp-admin-bar-menu-toggle, + #wpadminbar li#wp-admin-bar-wp-logo, + #wpadminbar li#wp-admin-bar-my-sites, + #wpadminbar li#wp-admin-bar-updates, + #wpadminbar li#wp-admin-bar-site-name, + #wpadminbar li#wp-admin-bar-customize, + #wpadminbar li#wp-admin-bar-new-content, + #wpadminbar li#wp-admin-bar-edit, + #wpadminbar li#wp-admin-bar-comments, + #wpadminbar li#wp-admin-bar-my-account { + display: block; + } + + /* Allow dropdown list items to appear normally */ + #wpadminbar li:hover ul li, + #wpadminbar li.hover ul li, + #wpadminbar li:hover ul li:hover ul li { + display: list-item; + } + + /* Override default min-width so dropdown lists aren't stretched + to 100% viewport width at responsive sizes. */ + #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { + min-width: -webkit-fit-content; + min-width: fit-content; + } + + #wpadminbar ul#wp-admin-bar-root-default > li { + margin-right: 0; + } + + /* Experimental fix for touch toolbar dropdown positioning */ + #wpadminbar .ab-top-menu, + #wpadminbar .ab-top-secondary, + #wpadminbar #wp-admin-bar-wp-logo, + #wpadminbar #wp-admin-bar-my-sites, + #wpadminbar #wp-admin-bar-site-name, + #wpadminbar #wp-admin-bar-updates, + #wpadminbar #wp-admin-bar-comments, + #wpadminbar #wp-admin-bar-new-content, + #wpadminbar #wp-admin-bar-edit, + #wpadminbar #wp-admin-bar-my-account { + position: static; + } + + #wpadminbar #wp-admin-bar-my-account { + float: right; + } + + .network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account { + margin-right: 0; + } + + /* Realign arrows on taller responsive submenus */ + + #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { + top: 10px; + left: 0; + } +} + +/* Smartphone */ +@media screen and (max-width: 600px) { + #wpadminbar { + position: absolute; + } + + #wp-responsive-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 400; + } + + #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { + width: 100%; + left: 0; + } + + #wpadminbar .menupop .menupop > .ab-item:before { + display: none; + } + + #wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper { + margin-left: 0; + } + + #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { + margin: 0; + width: 100%; + top: auto; + left: auto; + position: relative; + } + + #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item { + font-size: 16px; + padding: 6px 15px 19px 30px; + } + + #wpadminbar li:hover ul li ul li { + display: list-item; + } + + #wpadminbar li#wp-admin-bar-wp-logo, + #wpadminbar li#wp-admin-bar-updates { + display: none; + } + + /* Make submenus full-width at this size */ + + #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { + position: static; + box-shadow: none; + } +} + +/* Very narrow screens */ +@media screen and (max-width: 400px) { + #wpadminbar li#wp-admin-bar-comments { + display: none; + } +} diff --git a/wp-includes/css/admin-bar.min.css b/wp-includes/css/admin-bar.min.css new file mode 100644 index 0000000..af61b4f --- /dev/null +++ b/wp-includes/css/admin-bar.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#wpadminbar *{height:auto;width:auto;margin:0;padding:0;position:static;text-shadow:none;text-transform:none;letter-spacing:normal;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;border-radius:0;box-sizing:content-box;transition:none;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:auto}.rtl #wpadminbar *{font-family:Tahoma,sans-serif}html:lang(he-il) .rtl #wpadminbar *{font-family:Arial,sans-serif}#wpadminbar .ab-empty-item{cursor:default}#wpadminbar .ab-empty-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#eee}#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{white-space:nowrap}#wpadminbar ul li:after,#wpadminbar ul li:before{content:normal}#wpadminbar a,#wpadminbar a img,#wpadminbar a img:hover,#wpadminbar a:hover{border:none;text-decoration:none;background:0 0}#wpadminbar a:active,#wpadminbar a:focus,#wpadminbar div,#wpadminbar input[type=email],#wpadminbar input[type=number],#wpadminbar input[type=password],#wpadminbar input[type=search],#wpadminbar input[type=text],#wpadminbar input[type=url],#wpadminbar select,#wpadminbar textarea{box-shadow:none}#wpadminbar a:focus{outline-offset:-1px}#wpadminbar{direction:ltr;color:#ccc;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;height:32px;position:fixed;top:0;left:0;width:100%;min-width:600px;z-index:99999;background:#23282d}#wpadminbar .ab-sub-wrapper,#wpadminbar ul,#wpadminbar ul li{background:0 0;clear:none;list-style:none;margin:0;padding:0;position:relative;text-indent:0;z-index:99999}#wpadminbar ul#wp-admin-bar-root-default>li{margin-right:0}#wpadminbar .quicklinks ul{text-align:left}#wpadminbar li{float:left}#wpadminbar .ab-empty-item{outline:0}#wpadminbar .quicklinks .ab-top-secondary>li{float:right}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks a,#wpadminbar .shortlink-input{height:32px;display:block;padding:0 10px;margin:0}#wpadminbar .quicklinks>ul>li>a{padding:0 8px 0 7px}#wpadminbar .menupop .ab-sub-wrapper,#wpadminbar .shortlink-input{margin:0;padding:0;box-shadow:0 3px 5px rgba(0,0,0,.2);background:#32373c;display:none;position:absolute;float:none}#wpadminbar.ie7 .menupop .ab-sub-wrapper,#wpadminbar.ie7 .shortlink-input{top:32px;left:0}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:100%}#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper{right:0;left:auto}#wpadminbar .ab-submenu{padding:6px 0}#wpadminbar .selected .shortlink-input{display:block}#wpadminbar .quicklinks .menupop ul li{float:none}#wpadminbar .quicklinks .menupop ul li a strong{font-weight:600}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:2;height:26px;white-space:nowrap;min-width:140px}#wpadminbar .shortlink-input{width:200px}#wpadminbar li.hover>.ab-sub-wrapper,#wpadminbar.nojs li:hover>.ab-sub-wrapper{display:block}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-left:100%;margin-top:-32px}#wpadminbar .ab-top-secondary .menupop li.hover>.ab-sub-wrapper,#wpadminbar .ab-top-secondary .menupop li:hover>.ab-sub-wrapper{margin-left:0;left:inherit;right:100%}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{background:#32373c;color:#00b9eb}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label,#wpadminbar>#wp-toolbar li.hover span.ab-label{color:#00b9eb}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon,.wp-admin-bar-arrow{position:relative;float:left;font:normal 20px/1 dashicons;speak:none;padding:4px 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:none!important;margin-right:6px}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{color:#a0a5aa;color:rgba(240,245,250,.6)}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{position:relative;transition:all .1s ease-in-out}#wpadminbar .ab-label{display:inline-block;height:32px}#wpadminbar .ab-submenu .ab-item{color:#b4b9be;color:rgba(240,245,250,.7)}#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#b4b9be;color:rgba(240,245,250,.7)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#00b9eb}#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#b4b9be}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#00b9eb}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before,#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{position:absolute;font:normal 17px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar .menupop .menupop>.ab-item{display:block;padding-right:2em}#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;right:10px;padding:4px 0;content:"\f139";color:inherit}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item{padding-left:2em;padding-right:1em}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;left:6px;content:"\f141"}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary{display:block;position:relative;right:auto;margin:0;box-shadow:none}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#464b50}#wpadminbar .quicklinks .menupop .ab-sub-secondary>li .ab-item:focus a,#wpadminbar .quicklinks .menupop .ab-sub-secondary>li>a:hover{color:#00b9eb}#wpadminbar .quicklinks a span#ab-updates{background:#eee;color:#32373c;display:inline;padding:2px 5px;font-size:10px;font-weight:600;border-radius:10px}#wpadminbar .quicklinks a:hover span#ab-updates{background:#fff;color:#000}#wpadminbar .ab-top-secondary{float:right}#wpadminbar ul li:last-child,#wpadminbar ul li:last-child .ab-item{box-shadow:none}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#ca4a1f}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#c0461e}#wp-admin-bar-my-account>ul{min-width:198px}#wp-admin-bar-my-account>.ab-item:before{content:"\f110";top:2px;float:right;margin-left:6px;margin-right:0}#wp-admin-bar-my-account.with-avatar>.ab-item:before{display:none;content:none}#wp-admin-bar-my-account.with-avatar>ul{min-width:270px}#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item{white-space:nowrap}#wpadminbar #wp-admin-bar-user-actions>li{margin-left:16px;margin-right:16px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:6px 0 12px}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin-left:88px}#wpadminbar #wp-admin-bar-user-info{margin-top:6px;margin-bottom:15px;height:auto;background:0 0}#wp-admin-bar-user-info .avatar{position:absolute;left:-72px;top:4px;width:64px;height:64px}#wpadminbar #wp-admin-bar-user-info a{background:0 0;height:auto}#wpadminbar #wp-admin-bar-user-info span{background:0 0;padding:0;height:18px}#wpadminbar #wp-admin-bar-user-info .display-name,#wpadminbar #wp-admin-bar-user-info .username{display:block}#wpadminbar #wp-admin-bar-user-info .username{color:#a0a5aa;font-size:11px}#wpadminbar #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar #wp-admin-bar-my-account.with-avatar>a img{width:auto;height:16px;padding:0;border:1px solid #82878c;background:#eee;line-height:1.84615384;vertical-align:middle;margin:-4px 0 0 6px;float:none;display:inline}#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar>a img{width:auto}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{width:15px;height:20px;margin-right:0;padding:6px 0 5px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0 7px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{content:"\f120";top:2px}#wpadminbar .quicklinks li .blavatar{display:inline-block;vertical-align:middle;font:normal 16px/1 dashicons!important;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#eee}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar{color:#00b9eb}#wpadminbar .quicklinks li .blavatar:before{content:"\f120";height:16px;width:16px;display:inline-block;margin:0 8px 2px -2px}#wpadminbar #wp-admin-bar-appearance{margin-top:-12px}#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f541";top:2px}#wpadminbar #wp-admin-bar-customize>.ab-item:before{content:"\f540";top:2px}#wpadminbar #wp-admin-bar-edit>.ab-item:before{content:"\f464";top:2px}#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f226"}.wp-admin #wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f102"}#wpadminbar #wp-admin-bar-comments .ab-icon{margin-right:6px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{content:"\f101";top:3px}#wpadminbar #wp-admin-bar-comments .count-0{opacity:.5}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{content:"\f132";top:4px}#wpadminbar #wp-admin-bar-updates .ab-icon:before{content:"\f463";top:2px}#wpadminbar.ie8 #wp-admin-bar-search{display:block;min-width:32px}#wpadminbar #wp-admin-bar-search .ab-item{padding:0;background:0 0}#wpadminbar #adminbarsearch{position:relative;height:32px;padding:0 2px;z-index:1}#wpadminbar #adminbarsearch:before{position:absolute;top:6px;left:5px;z-index:20;font:normal 20px/1 dashicons!important;content:"\f179";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{display:inline-block;float:none;position:relative;z-index:30;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.84615384;text-indent:0;height:24px;width:24px;max-width:none;padding:0 3px 0 24px;margin:0;color:#ccc;background-color:rgba(255,255,255,0);border:none;outline:0;cursor:pointer;box-shadow:none;box-sizing:border-box;transition-duration:.4s;transition-property:width,background;transition-timing-function:ease}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{z-index:10;color:#000;width:200px;background-color:rgba(255,255,255,.9);cursor:text;border:0}#wpadminbar.ie7>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{margin-top:3px;width:120px}#wpadminbar.ie8>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{background:transparent 0 0 repeat scroll url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before{content:"\f179 "}#wpadminbar.ie8>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{background:#fff;z-index:-1}#wpadminbar #adminbarsearch .adminbar-button{display:none}.customize-support #wpadminbar .hide-if-customize,.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support #wpadminbar .hide-if-no-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#wpadminbar .screen-reader-text,#wpadminbar .screen-reader-text span{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;width:1px;word-wrap:normal!important}#wpadminbar .screen-reader-shortcut{position:absolute;top:-1000em}#wpadminbar .screen-reader-shortcut:focus{left:6px;top:7px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#0073aa;z-index:100000;line-height:normal;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}* html #wpadminbar{overflow:hidden;position:absolute}* html #wpadminbar .quicklinks ul li a{float:left}* html #wpadminbar .menupop a span{background-image:none}.no-font-face #wpadminbar ul.ab-top-menu>li>a.ab-item{display:block;width:45px;text-align:center;overflow:hidden;margin:0 3px}.no-font-face #wpadminbar #wp-admin-bar-edit>.ab-item,.no-font-face #wpadminbar #wp-admin-bar-my-sites>.ab-item,.no-font-face #wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:0}.no-font-face #wpadminbar #wp-admin-bar-wp-logo>.ab-item,.no-font-face #wpadminbar .ab-icon,.no-font-face #wpadminbar .ab-icon:before,.no-font-face #wpadminbar a.ab-item:before{display:none!important}.no-font-face #wpadminbar ul.ab-top-menu>li>a>span.ab-label{display:inline}.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon{display:inline!important}.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before{content:"Menu";font:14px/45px sans-serif!important;display:inline-block!important;color:#fff}.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item{color:#fff}@media screen and (max-width:782px){html #wpadminbar{height:46px;min-width:240px}#wpadminbar *{font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.28571428}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks>ul>li>a{padding:0;height:46px;line-height:3.28571428;width:auto}#wpadminbar .ab-icon{font:40px/1 dashicons!important;margin:0;padding:0;width:52px;height:46px;text-align:center}#wpadminbar .ab-icon:before{text-align:center}#wpadminbar .ab-submenu{padding:0}#wpadminbar #wp-admin-bar-my-account a.ab-item,#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{text-overflow:clip}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:1.6}#wpadminbar .ab-label{display:none}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-top:-46px}#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop>.ab-item{padding-right:30px}#wpadminbar .menupop .menupop>.ab-item:before{top:10px;right:6px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper .ab-item{font-size:16px;padding:8px 16px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper a:empty{display:none}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{padding:0;width:52px;height:46px;text-align:center;vertical-align:top}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{font:28px/1 dashicons!important;top:-3px}#wpadminbar .ab-icon,#wpadminbar .ab-item:before{padding:0}#wpadminbar #wp-admin-bar-customize>.ab-item,#wpadminbar #wp-admin-bar-edit>.ab-item,#wpadminbar #wp-admin-bar-my-account>.ab-item,#wpadminbar #wp-admin-bar-my-sites>.ab-item,#wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:100%;white-space:nowrap;overflow:hidden;width:52px;padding:0;color:#a0a5aa;position:relative}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{padding:0;margin-right:0}#wpadminbar #wp-admin-bar-customize>.ab-item:before,#wpadminbar #wp-admin-bar-edit>.ab-item:before,#wpadminbar #wp-admin-bar-my-account>.ab-item:before,#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{display:block;text-indent:0;font:normal 32px/1 dashicons;speak:none;top:7px;width:52px;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar #wp-admin-bar-appearance{margin-top:0}#wpadminbar .quicklinks li .blavatar:before{display:none}#wpadminbar #wp-admin-bar-search{display:none}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{top:0;line-height:1.33333333;height:46px!important;text-align:center;width:52px;display:block}#wpadminbar #wp-admin-bar-updates{text-align:center}#wpadminbar #wp-admin-bar-updates .ab-icon:before{top:3px}#wpadminbar #wp-admin-bar-comments .ab-icon{margin:0}#wpadminbar #wp-admin-bar-comments .ab-icon:before{display:block;font-size:34px;height:46px;line-height:1.38235294;top:0}#wpadminbar #wp-admin-bar-my-account>a{position:relative;white-space:nowrap;text-indent:150%;width:28px;padding:0 10px;overflow:hidden}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{position:absolute;top:13px;right:10px;width:26px;height:26px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:0}#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar{display:none}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin:0}#wpadminbar #wp-admin-bar-user-info .display-name{height:auto;font-size:16px;line-height:1.5;color:#eee}#wpadminbar #wp-admin-bar-user-info a{padding-top:4px}#wpadminbar #wp-admin-bar-user-info .username{line-height:.8!important;margin-bottom:-2px}#wp-toolbar>ul>li{display:none}#wpadminbar li#wp-admin-bar-comments,#wpadminbar li#wp-admin-bar-customize,#wpadminbar li#wp-admin-bar-edit,#wpadminbar li#wp-admin-bar-menu-toggle,#wpadminbar li#wp-admin-bar-my-account,#wpadminbar li#wp-admin-bar-my-sites,#wpadminbar li#wp-admin-bar-new-content,#wpadminbar li#wp-admin-bar-site-name,#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:block}#wpadminbar li.hover ul li,#wpadminbar li:hover ul li,#wpadminbar li:hover ul li:hover ul li{display:list-item}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:-webkit-fit-content;min-width:fit-content}#wpadminbar ul#wp-admin-bar-root-default>li{margin-right:0}#wpadminbar #wp-admin-bar-comments,#wpadminbar #wp-admin-bar-edit,#wpadminbar #wp-admin-bar-my-account,#wpadminbar #wp-admin-bar-my-sites,#wpadminbar #wp-admin-bar-new-content,#wpadminbar #wp-admin-bar-site-name,#wpadminbar #wp-admin-bar-updates,#wpadminbar #wp-admin-bar-wp-logo,#wpadminbar .ab-top-menu,#wpadminbar .ab-top-secondary{position:static}#wpadminbar #wp-admin-bar-my-account{float:right}.network-admin #wpadminbar ul#wp-admin-bar-top-secondary>li#wp-admin-bar-my-account{margin-right:0}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:10px;left:0}}@media screen and (max-width:600px){#wpadminbar{position:absolute}#wp-responsive-overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:400}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{width:100%;left:0}#wpadminbar .menupop .menupop>.ab-item:before{display:none}#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper{margin-left:0}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{margin:0;width:100%;top:auto;left:auto;position:relative}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper .ab-item{font-size:16px;padding:6px 15px 19px 30px}#wpadminbar li:hover ul li ul li{display:list-item}#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:none}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{position:static;box-shadow:none}}@media screen and (max-width:400px){#wpadminbar li#wp-admin-bar-comments{display:none}} \ No newline at end of file diff --git a/wp-includes/css/buttons-rtl.css b/wp-includes/css/buttons-rtl.css new file mode 100644 index 0000000..071b898 --- /dev/null +++ b/wp-includes/css/buttons-rtl.css @@ -0,0 +1,401 @@ +/*! This file is auto-generated */ +/* ---------------------------------------------------------------------------- + +NOTE: If you edit this file, you should make sure that the CSS rules for +buttons in the following files are updated. + +* jquery-ui-dialog.css +* editor.css + +WordPress-style Buttons +======================= +Create a button by adding the `.button` class to an element. For backward +compatibility, we support several other classes (such as `.button-secondary`), +but these will *not* work with the stackable classes described below. + +Button Styles +------------- +To display a primary button style, add the `.button-primary` class to a button. + +Button Sizes +------------ +Adjust a button's size by adding the `.button-large` or `.button-small` class. + +Button States +------------- +Lock the state of a button by adding the name of the pseudoclass as +an actual class (e.g. `.hover` for `:hover`). + + +TABLE OF CONTENTS: +------------------ + 1.0 - Button Layouts + 2.0 - Default Button Style + 3.0 - Primary Button Style + 4.0 - Button Groups + 5.0 - Responsive Button Styles + +---------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------------- + 1.0 - Button Layouts +---------------------------------------------------------------------------- */ + +.wp-core-ui .button, +.wp-core-ui .button-primary, +.wp-core-ui .button-secondary { + display: inline-block; + text-decoration: none; + font-size: 13px; + line-height: 2.15384615; /* 28px */ + min-height: 30px; + margin: 0; + padding: 0 10px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-sizing: border-box; +} + +/* Remove the dotted border on :focus and the extra padding in Firefox */ +.wp-core-ui button::-moz-focus-inner, +.wp-core-ui input[type="reset"]::-moz-focus-inner, +.wp-core-ui input[type="button"]::-moz-focus-inner, +.wp-core-ui input[type="submit"]::-moz-focus-inner { + border-width: 0; + border-style: none; + padding: 0; +} + +.wp-core-ui .button.button-large, +.wp-core-ui .button-group.button-large .button { + min-height: 32px; + line-height: 2.30769231; /* 30px */ + padding: 0 12px; +} + +.wp-core-ui .button.button-small, +.wp-core-ui .button-group.button-small .button { + min-height: 26px; + line-height: 2.18181818; /* 24px */ + padding: 0 8px; + font-size: 11px; +} + +.wp-core-ui .button.button-hero, +.wp-core-ui .button-group.button-hero .button { + font-size: 14px; + min-height: 46px; + line-height: 3.14285714; + padding: 0 36px; +} + +.wp-core-ui .button.hidden { + display: none; +} + +/* Style Reset buttons as simple text links */ + +.wp-core-ui input[type="reset"], +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active, +.wp-core-ui input[type="reset"]:focus { + background: none; + border: none; + box-shadow: none; + padding: 0 2px 1px; + width: auto; +} + +/* ---------------------------------------------------------------------------- + 2.0 - Default Button Style +---------------------------------------------------------------------------- */ + +.wp-core-ui .button, +.wp-core-ui .button-secondary { + color: #0071a1; + border-color: #0071a1; + background: #f3f5f6; + vertical-align: top; +} + +.wp-core-ui p .button { + vertical-align: baseline; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button-secondary:hover{ + background: #f1f1f1; + border-color: #016087; + color: #016087; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus, +.wp-core-ui .button-secondary:focus { + background: #f3f5f6; + border-color: #007cba; + color: #016087; + box-shadow: 0 0 0 1px #007cba; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + /* Reset inherited offset from Gutenberg */ + outline-offset: 0; +} + +/* :active state */ +.wp-core-ui .button:active, +.wp-core-ui .button-secondary:active { + background: #f3f5f6; + border-color: #7e8993; + box-shadow: none; +} + +/* pressed state e.g. a selected setting */ +.wp-core-ui .button.active, +.wp-core-ui .button.active:hover { + background-color: #e2e4e7; + color: #00669b; + border-color: #016087; + box-shadow: inset 0 2px 5px -3px #016087; +} + +.wp-core-ui .button.active:focus { + border-color: #007cba; + box-shadow: + inset 0 2px 5px -3px #016087, + 0 0 0 1px #007cba; +} + +.wp-core-ui .button[disabled], +.wp-core-ui .button:disabled, +.wp-core-ui .button.disabled, +.wp-core-ui .button-secondary[disabled], +.wp-core-ui .button-secondary:disabled, +.wp-core-ui .button-secondary.disabled, +.wp-core-ui .button-disabled { + color: #a0a5aa !important; + border-color: #ddd !important; + background: #f7f7f7 !important; + box-shadow: none !important; + text-shadow: 0 1px 0 #fff !important; + cursor: default; + transform: none !important; +} + +/* Buttons that look like links, for a cross of good semantics with the visual */ +.wp-core-ui .button-link { + margin: 0; + padding: 0; + box-shadow: none; + border: 0; + border-radius: 0; + background: none; + cursor: pointer; + text-align: right; + /* Mimics the default link style in common.css */ + color: #0073aa; + text-decoration: underline; + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; +} + +.wp-core-ui .button-link:hover, +.wp-core-ui .button-link:active { + color: #00a0d2; +} + +.wp-core-ui .button-link:focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.wp-core-ui .button-link-delete { + color: #a00; +} + +.wp-core-ui .button-link-delete:hover, +.wp-core-ui .button-link-delete:focus { + color: #dc3232; + background: transparent; +} + +.wp-core-ui .button-link-delete:disabled { + /* overrides the default buttons disabled background */ + background: transparent !important; +} + +.ie8 .wp-core-ui .button-link:focus { + outline: #5b9dd9 solid 1px; +} + +/* ---------------------------------------------------------------------------- + 3.0 - Primary Button Style +---------------------------------------------------------------------------- */ + +.wp-core-ui .button-primary { + background: #007cba; + border-color: #007cba; + color: #fff; + text-decoration: none; + text-shadow: none; +} + +.wp-core-ui .button-primary.hover, +.wp-core-ui .button-primary:hover, +.wp-core-ui .button-primary.focus, +.wp-core-ui .button-primary:focus { + background: #0071a1; + border-color: #0071a1; + color: #fff; +} + +.wp-core-ui .button-primary.focus, +.wp-core-ui .button-primary:focus { + box-shadow: + 0 0 0 1px #fff, + 0 0 0 3px #007cba; +} + +.wp-core-ui .button-primary.active, +.wp-core-ui .button-primary.active:hover, +.wp-core-ui .button-primary.active:focus, +.wp-core-ui .button-primary:active { + background: #00669b; + border-color: #00669b; + box-shadow: none; + color: #fff; +} + +.wp-core-ui .button-primary[disabled], +.wp-core-ui .button-primary:disabled, +.wp-core-ui .button-primary-disabled, +.wp-core-ui .button-primary.disabled { + color: #66c6e4 !important; + background: #008ec2 !important; + border-color: #008ec2 !important; + box-shadow: none !important; + text-shadow: none !important; + cursor: default; +} + +/* ---------------------------------------------------------------------------- + 4.0 - Button Groups +---------------------------------------------------------------------------- */ + +.wp-core-ui .button-group { + position: relative; + display: inline-block; + white-space: nowrap; + font-size: 0; + vertical-align: middle; +} + +.wp-core-ui .button-group > .button { + display: inline-block; + border-radius: 0; + margin-left: -1px; +} + +.wp-core-ui .button-group > .button:first-child { + border-radius: 0 3px 3px 0; +} + +.wp-core-ui .button-group > .button:last-child { + border-radius: 3px 0 0 3px; +} + +.wp-core-ui .button-group > .button-primary + .button { + border-right: 0; +} + +.wp-core-ui .button-group > .button:focus { + position: relative; + z-index: 1; +} + +/* pressed state e.g. a selected setting */ +.wp-core-ui .button-group > .button.active { + background-color: #e2e4e7; + color: #00669b; + border-color: #016087; + box-shadow: inset 0 2px 5px -3px #016087; +} + +.wp-core-ui .button-group > .button.active:focus { + border-color: #007cba; + box-shadow: + inset 0 2px 5px -3px #016087, + 0 0 0 1px #007cba; +} + +/* ---------------------------------------------------------------------------- + 5.0 - Responsive Button Styles +---------------------------------------------------------------------------- */ + +@media screen and (max-width: 782px) { + + .wp-core-ui .button, + .wp-core-ui .button.button-large, + .wp-core-ui .button.button-small, + input#publish, + input#save-post, + a.preview { + padding: 0 14px; + line-height: 2.71428571; /* 38px */ + font-size: 14px; + vertical-align: middle; + min-height: 40px; + margin-bottom: 4px; + } + + #media-upload.wp-core-ui .button { + padding: 0 10px 1px; + min-height: 24px; + line-height: 22px; + font-size: 13px; + } + + .media-frame.mode-grid .bulk-select .button { + margin-bottom: 0; + } + + /* Publish Metabox Options */ + .wp-core-ui .save-post-status.button { + position: relative; + margin: 0 10px 0 14px; /* 14px right margin to match all other buttons */ + } + + /* Reset responsive styles in Press This, Customizer */ + + .wp-core-ui.wp-customizer .button { + font-size: 13px; + line-height: 2.15384615; /* 28px */ + min-height: 30px; + margin: 0; + vertical-align: inherit; + } + + .media-modal-content .media-toolbar-primary .media-button { + margin-top: 10px; + margin-right: 5px; + } + + /* Reset responsive styles on Log in button on iframed login form */ + + .interim-login .button.button-large { + min-height: 30px; + line-height: 2; + padding: 0 12px 2px; + } + +} diff --git a/wp-includes/css/buttons-rtl.min.css b/wp-includes/css/buttons-rtl.min.css new file mode 100644 index 0000000..2b03720 --- /dev/null +++ b/wp-includes/css/buttons-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:2.15384615;min-height:30px;margin:0;padding:0 10px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box}.wp-core-ui button::-moz-focus-inner,.wp-core-ui input[type=button]::-moz-focus-inner,.wp-core-ui input[type=reset]::-moz-focus-inner,.wp-core-ui input[type=submit]::-moz-focus-inner{border-width:0;border-style:none;padding:0}.wp-core-ui .button-group.button-large .button,.wp-core-ui .button.button-large{min-height:32px;line-height:2.30769231;padding:0 12px}.wp-core-ui .button-group.button-small .button,.wp-core-ui .button.button-small{min-height:26px;line-height:2.18181818;padding:0 8px;font-size:11px}.wp-core-ui .button-group.button-hero .button,.wp-core-ui .button.button-hero{font-size:14px;min-height:46px;line-height:3.14285714;padding:0 36px}.wp-core-ui .button.hidden{display:none}.wp-core-ui input[type=reset],.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:focus,.wp-core-ui input[type=reset]:hover{background:0 0;border:none;box-shadow:none;padding:0 2px 1px;width:auto}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#0071a1;border-color:#0071a1;background:#f3f5f6;vertical-align:top}.wp-core-ui p .button{vertical-align:baseline}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{background:#f1f1f1;border-color:#016087;color:#016087}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{background:#f3f5f6;border-color:#007cba;color:#016087;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent;outline-offset:0}.wp-core-ui .button-secondary:active,.wp-core-ui .button:active{background:#f3f5f6;border-color:#7e8993;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:hover{background-color:#e2e4e7;color:#00669b;border-color:#016087;box-shadow:inset 0 2px 5px -3px #016087}.wp-core-ui .button.active:focus{border-color:#007cba;box-shadow:inset 0 2px 5px -3px #016087,0 0 0 1px #007cba}.wp-core-ui .button-disabled,.wp-core-ui .button-secondary.disabled,.wp-core-ui .button-secondary:disabled,.wp-core-ui .button-secondary[disabled],.wp-core-ui .button.disabled,.wp-core-ui .button:disabled,.wp-core-ui .button[disabled]{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}.wp-core-ui .button-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:0 0;cursor:pointer;text-align:right;color:#0073aa;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}.wp-core-ui .button-link:active,.wp-core-ui .button-link:hover{color:#00a0d2}.wp-core-ui .button-link:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:1px solid transparent}.wp-core-ui .button-link-delete{color:#a00}.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232;background:0 0}.wp-core-ui .button-link-delete:disabled{background:0 0!important}.ie8 .wp-core-ui .button-link:focus{outline:#5b9dd9 solid 1px}.wp-core-ui .button-primary{background:#007cba;border-color:#007cba;color:#fff;text-decoration:none;text-shadow:none}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary.hover,.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#0071a1;border-color:#0071a1;color:#fff}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover,.wp-core-ui .button-primary:active{background:#00669b;border-color:#00669b;box-shadow:none;color:#fff}.wp-core-ui .button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#66c6e4!important;background:#008ec2!important;border-color:#008ec2!important;box-shadow:none!important;text-shadow:none!important;cursor:default}.wp-core-ui .button-group{position:relative;display:inline-block;white-space:nowrap;font-size:0;vertical-align:middle}.wp-core-ui .button-group>.button{display:inline-block;border-radius:0;margin-left:-1px}.wp-core-ui .button-group>.button:first-child{border-radius:0 3px 3px 0}.wp-core-ui .button-group>.button:last-child{border-radius:3px 0 0 3px}.wp-core-ui .button-group>.button-primary+.button{border-right:0}.wp-core-ui .button-group>.button:focus{position:relative;z-index:1}.wp-core-ui .button-group>.button.active{background-color:#e2e4e7;color:#00669b;border-color:#016087;box-shadow:inset 0 2px 5px -3px #016087}.wp-core-ui .button-group>.button.active:focus{border-color:#007cba;box-shadow:inset 0 2px 5px -3px #016087,0 0 0 1px #007cba}@media screen and (max-width:782px){.wp-core-ui .button,.wp-core-ui .button.button-large,.wp-core-ui .button.button-small,a.preview,input#publish,input#save-post{padding:0 14px;line-height:2.71428571;font-size:14px;vertical-align:middle;min-height:40px;margin-bottom:4px}#media-upload.wp-core-ui .button{padding:0 10px 1px;min-height:24px;line-height:22px;font-size:13px}.media-frame.mode-grid .bulk-select .button{margin-bottom:0}.wp-core-ui .save-post-status.button{position:relative;margin:0 10px 0 14px}.wp-core-ui.wp-customizer .button{font-size:13px;line-height:2.15384615;min-height:30px;margin:0;vertical-align:inherit}.media-modal-content .media-toolbar-primary .media-button{margin-top:10px;margin-right:5px}.interim-login .button.button-large{min-height:30px;line-height:2;padding:0 12px 2px}} \ No newline at end of file diff --git a/wp-includes/css/buttons.css b/wp-includes/css/buttons.css new file mode 100644 index 0000000..86844dd --- /dev/null +++ b/wp-includes/css/buttons.css @@ -0,0 +1,400 @@ +/* ---------------------------------------------------------------------------- + +NOTE: If you edit this file, you should make sure that the CSS rules for +buttons in the following files are updated. + +* jquery-ui-dialog.css +* editor.css + +WordPress-style Buttons +======================= +Create a button by adding the `.button` class to an element. For backward +compatibility, we support several other classes (such as `.button-secondary`), +but these will *not* work with the stackable classes described below. + +Button Styles +------------- +To display a primary button style, add the `.button-primary` class to a button. + +Button Sizes +------------ +Adjust a button's size by adding the `.button-large` or `.button-small` class. + +Button States +------------- +Lock the state of a button by adding the name of the pseudoclass as +an actual class (e.g. `.hover` for `:hover`). + + +TABLE OF CONTENTS: +------------------ + 1.0 - Button Layouts + 2.0 - Default Button Style + 3.0 - Primary Button Style + 4.0 - Button Groups + 5.0 - Responsive Button Styles + +---------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------------- + 1.0 - Button Layouts +---------------------------------------------------------------------------- */ + +.wp-core-ui .button, +.wp-core-ui .button-primary, +.wp-core-ui .button-secondary { + display: inline-block; + text-decoration: none; + font-size: 13px; + line-height: 2.15384615; /* 28px */ + min-height: 30px; + margin: 0; + padding: 0 10px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-sizing: border-box; +} + +/* Remove the dotted border on :focus and the extra padding in Firefox */ +.wp-core-ui button::-moz-focus-inner, +.wp-core-ui input[type="reset"]::-moz-focus-inner, +.wp-core-ui input[type="button"]::-moz-focus-inner, +.wp-core-ui input[type="submit"]::-moz-focus-inner { + border-width: 0; + border-style: none; + padding: 0; +} + +.wp-core-ui .button.button-large, +.wp-core-ui .button-group.button-large .button { + min-height: 32px; + line-height: 2.30769231; /* 30px */ + padding: 0 12px; +} + +.wp-core-ui .button.button-small, +.wp-core-ui .button-group.button-small .button { + min-height: 26px; + line-height: 2.18181818; /* 24px */ + padding: 0 8px; + font-size: 11px; +} + +.wp-core-ui .button.button-hero, +.wp-core-ui .button-group.button-hero .button { + font-size: 14px; + min-height: 46px; + line-height: 3.14285714; + padding: 0 36px; +} + +.wp-core-ui .button.hidden { + display: none; +} + +/* Style Reset buttons as simple text links */ + +.wp-core-ui input[type="reset"], +.wp-core-ui input[type="reset"]:hover, +.wp-core-ui input[type="reset"]:active, +.wp-core-ui input[type="reset"]:focus { + background: none; + border: none; + box-shadow: none; + padding: 0 2px 1px; + width: auto; +} + +/* ---------------------------------------------------------------------------- + 2.0 - Default Button Style +---------------------------------------------------------------------------- */ + +.wp-core-ui .button, +.wp-core-ui .button-secondary { + color: #0071a1; + border-color: #0071a1; + background: #f3f5f6; + vertical-align: top; +} + +.wp-core-ui p .button { + vertical-align: baseline; +} + +.wp-core-ui .button.hover, +.wp-core-ui .button:hover, +.wp-core-ui .button-secondary:hover{ + background: #f1f1f1; + border-color: #016087; + color: #016087; +} + +.wp-core-ui .button.focus, +.wp-core-ui .button:focus, +.wp-core-ui .button-secondary:focus { + background: #f3f5f6; + border-color: #007cba; + color: #016087; + box-shadow: 0 0 0 1px #007cba; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + /* Reset inherited offset from Gutenberg */ + outline-offset: 0; +} + +/* :active state */ +.wp-core-ui .button:active, +.wp-core-ui .button-secondary:active { + background: #f3f5f6; + border-color: #7e8993; + box-shadow: none; +} + +/* pressed state e.g. a selected setting */ +.wp-core-ui .button.active, +.wp-core-ui .button.active:hover { + background-color: #e2e4e7; + color: #00669b; + border-color: #016087; + box-shadow: inset 0 2px 5px -3px #016087; +} + +.wp-core-ui .button.active:focus { + border-color: #007cba; + box-shadow: + inset 0 2px 5px -3px #016087, + 0 0 0 1px #007cba; +} + +.wp-core-ui .button[disabled], +.wp-core-ui .button:disabled, +.wp-core-ui .button.disabled, +.wp-core-ui .button-secondary[disabled], +.wp-core-ui .button-secondary:disabled, +.wp-core-ui .button-secondary.disabled, +.wp-core-ui .button-disabled { + color: #a0a5aa !important; + border-color: #ddd !important; + background: #f7f7f7 !important; + box-shadow: none !important; + text-shadow: 0 1px 0 #fff !important; + cursor: default; + transform: none !important; +} + +/* Buttons that look like links, for a cross of good semantics with the visual */ +.wp-core-ui .button-link { + margin: 0; + padding: 0; + box-shadow: none; + border: 0; + border-radius: 0; + background: none; + cursor: pointer; + text-align: left; + /* Mimics the default link style in common.css */ + color: #0073aa; + text-decoration: underline; + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; +} + +.wp-core-ui .button-link:hover, +.wp-core-ui .button-link:active { + color: #00a0d2; +} + +.wp-core-ui .button-link:focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.wp-core-ui .button-link-delete { + color: #a00; +} + +.wp-core-ui .button-link-delete:hover, +.wp-core-ui .button-link-delete:focus { + color: #dc3232; + background: transparent; +} + +.wp-core-ui .button-link-delete:disabled { + /* overrides the default buttons disabled background */ + background: transparent !important; +} + +.ie8 .wp-core-ui .button-link:focus { + outline: #5b9dd9 solid 1px; +} + +/* ---------------------------------------------------------------------------- + 3.0 - Primary Button Style +---------------------------------------------------------------------------- */ + +.wp-core-ui .button-primary { + background: #007cba; + border-color: #007cba; + color: #fff; + text-decoration: none; + text-shadow: none; +} + +.wp-core-ui .button-primary.hover, +.wp-core-ui .button-primary:hover, +.wp-core-ui .button-primary.focus, +.wp-core-ui .button-primary:focus { + background: #0071a1; + border-color: #0071a1; + color: #fff; +} + +.wp-core-ui .button-primary.focus, +.wp-core-ui .button-primary:focus { + box-shadow: + 0 0 0 1px #fff, + 0 0 0 3px #007cba; +} + +.wp-core-ui .button-primary.active, +.wp-core-ui .button-primary.active:hover, +.wp-core-ui .button-primary.active:focus, +.wp-core-ui .button-primary:active { + background: #00669b; + border-color: #00669b; + box-shadow: none; + color: #fff; +} + +.wp-core-ui .button-primary[disabled], +.wp-core-ui .button-primary:disabled, +.wp-core-ui .button-primary-disabled, +.wp-core-ui .button-primary.disabled { + color: #66c6e4 !important; + background: #008ec2 !important; + border-color: #008ec2 !important; + box-shadow: none !important; + text-shadow: none !important; + cursor: default; +} + +/* ---------------------------------------------------------------------------- + 4.0 - Button Groups +---------------------------------------------------------------------------- */ + +.wp-core-ui .button-group { + position: relative; + display: inline-block; + white-space: nowrap; + font-size: 0; + vertical-align: middle; +} + +.wp-core-ui .button-group > .button { + display: inline-block; + border-radius: 0; + margin-right: -1px; +} + +.wp-core-ui .button-group > .button:first-child { + border-radius: 3px 0 0 3px; +} + +.wp-core-ui .button-group > .button:last-child { + border-radius: 0 3px 3px 0; +} + +.wp-core-ui .button-group > .button-primary + .button { + border-left: 0; +} + +.wp-core-ui .button-group > .button:focus { + position: relative; + z-index: 1; +} + +/* pressed state e.g. a selected setting */ +.wp-core-ui .button-group > .button.active { + background-color: #e2e4e7; + color: #00669b; + border-color: #016087; + box-shadow: inset 0 2px 5px -3px #016087; +} + +.wp-core-ui .button-group > .button.active:focus { + border-color: #007cba; + box-shadow: + inset 0 2px 5px -3px #016087, + 0 0 0 1px #007cba; +} + +/* ---------------------------------------------------------------------------- + 5.0 - Responsive Button Styles +---------------------------------------------------------------------------- */ + +@media screen and (max-width: 782px) { + + .wp-core-ui .button, + .wp-core-ui .button.button-large, + .wp-core-ui .button.button-small, + input#publish, + input#save-post, + a.preview { + padding: 0 14px; + line-height: 2.71428571; /* 38px */ + font-size: 14px; + vertical-align: middle; + min-height: 40px; + margin-bottom: 4px; + } + + #media-upload.wp-core-ui .button { + padding: 0 10px 1px; + min-height: 24px; + line-height: 22px; + font-size: 13px; + } + + .media-frame.mode-grid .bulk-select .button { + margin-bottom: 0; + } + + /* Publish Metabox Options */ + .wp-core-ui .save-post-status.button { + position: relative; + margin: 0 14px 0 10px; /* 14px right margin to match all other buttons */ + } + + /* Reset responsive styles in Press This, Customizer */ + + .wp-core-ui.wp-customizer .button { + font-size: 13px; + line-height: 2.15384615; /* 28px */ + min-height: 30px; + margin: 0; + vertical-align: inherit; + } + + .media-modal-content .media-toolbar-primary .media-button { + margin-top: 10px; + margin-left: 5px; + } + + /* Reset responsive styles on Log in button on iframed login form */ + + .interim-login .button.button-large { + min-height: 30px; + line-height: 2; + padding: 0 12px 2px; + } + +} diff --git a/wp-includes/css/buttons.min.css b/wp-includes/css/buttons.min.css new file mode 100644 index 0000000..3e73e03 --- /dev/null +++ b/wp-includes/css/buttons.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:2.15384615;min-height:30px;margin:0;padding:0 10px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box}.wp-core-ui button::-moz-focus-inner,.wp-core-ui input[type=button]::-moz-focus-inner,.wp-core-ui input[type=reset]::-moz-focus-inner,.wp-core-ui input[type=submit]::-moz-focus-inner{border-width:0;border-style:none;padding:0}.wp-core-ui .button-group.button-large .button,.wp-core-ui .button.button-large{min-height:32px;line-height:2.30769231;padding:0 12px}.wp-core-ui .button-group.button-small .button,.wp-core-ui .button.button-small{min-height:26px;line-height:2.18181818;padding:0 8px;font-size:11px}.wp-core-ui .button-group.button-hero .button,.wp-core-ui .button.button-hero{font-size:14px;min-height:46px;line-height:3.14285714;padding:0 36px}.wp-core-ui .button.hidden{display:none}.wp-core-ui input[type=reset],.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:focus,.wp-core-ui input[type=reset]:hover{background:0 0;border:none;box-shadow:none;padding:0 2px 1px;width:auto}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#0071a1;border-color:#0071a1;background:#f3f5f6;vertical-align:top}.wp-core-ui p .button{vertical-align:baseline}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{background:#f1f1f1;border-color:#016087;color:#016087}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{background:#f3f5f6;border-color:#007cba;color:#016087;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent;outline-offset:0}.wp-core-ui .button-secondary:active,.wp-core-ui .button:active{background:#f3f5f6;border-color:#7e8993;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:hover{background-color:#e2e4e7;color:#00669b;border-color:#016087;box-shadow:inset 0 2px 5px -3px #016087}.wp-core-ui .button.active:focus{border-color:#007cba;box-shadow:inset 0 2px 5px -3px #016087,0 0 0 1px #007cba}.wp-core-ui .button-disabled,.wp-core-ui .button-secondary.disabled,.wp-core-ui .button-secondary:disabled,.wp-core-ui .button-secondary[disabled],.wp-core-ui .button.disabled,.wp-core-ui .button:disabled,.wp-core-ui .button[disabled]{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}.wp-core-ui .button-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:0 0;cursor:pointer;text-align:left;color:#0073aa;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}.wp-core-ui .button-link:active,.wp-core-ui .button-link:hover{color:#00a0d2}.wp-core-ui .button-link:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:1px solid transparent}.wp-core-ui .button-link-delete{color:#a00}.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#dc3232;background:0 0}.wp-core-ui .button-link-delete:disabled{background:0 0!important}.ie8 .wp-core-ui .button-link:focus{outline:#5b9dd9 solid 1px}.wp-core-ui .button-primary{background:#007cba;border-color:#007cba;color:#fff;text-decoration:none;text-shadow:none}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary.hover,.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#0071a1;border-color:#0071a1;color:#fff}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover,.wp-core-ui .button-primary:active{background:#00669b;border-color:#00669b;box-shadow:none;color:#fff}.wp-core-ui .button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#66c6e4!important;background:#008ec2!important;border-color:#008ec2!important;box-shadow:none!important;text-shadow:none!important;cursor:default}.wp-core-ui .button-group{position:relative;display:inline-block;white-space:nowrap;font-size:0;vertical-align:middle}.wp-core-ui .button-group>.button{display:inline-block;border-radius:0;margin-right:-1px}.wp-core-ui .button-group>.button:first-child{border-radius:3px 0 0 3px}.wp-core-ui .button-group>.button:last-child{border-radius:0 3px 3px 0}.wp-core-ui .button-group>.button-primary+.button{border-left:0}.wp-core-ui .button-group>.button:focus{position:relative;z-index:1}.wp-core-ui .button-group>.button.active{background-color:#e2e4e7;color:#00669b;border-color:#016087;box-shadow:inset 0 2px 5px -3px #016087}.wp-core-ui .button-group>.button.active:focus{border-color:#007cba;box-shadow:inset 0 2px 5px -3px #016087,0 0 0 1px #007cba}@media screen and (max-width:782px){.wp-core-ui .button,.wp-core-ui .button.button-large,.wp-core-ui .button.button-small,a.preview,input#publish,input#save-post{padding:0 14px;line-height:2.71428571;font-size:14px;vertical-align:middle;min-height:40px;margin-bottom:4px}#media-upload.wp-core-ui .button{padding:0 10px 1px;min-height:24px;line-height:22px;font-size:13px}.media-frame.mode-grid .bulk-select .button{margin-bottom:0}.wp-core-ui .save-post-status.button{position:relative;margin:0 14px 0 10px}.wp-core-ui.wp-customizer .button{font-size:13px;line-height:2.15384615;min-height:30px;margin:0;vertical-align:inherit}.media-modal-content .media-toolbar-primary .media-button{margin-top:10px;margin-left:5px}.interim-login .button.button-large{min-height:30px;line-height:2;padding:0 12px 2px}} \ No newline at end of file diff --git a/wp-includes/css/customize-preview-rtl.css b/wp-includes/css/customize-preview-rtl.css new file mode 100644 index 0000000..742a1f4 --- /dev/null +++ b/wp-includes/css/customize-preview-rtl.css @@ -0,0 +1,167 @@ +/*! This file is auto-generated */ +.customize-partial-refreshing { + opacity: 0.25; + transition: opacity 0.25s; + cursor: progress; +} + +/* Override highlight when refreshing */ +.customize-partial-refreshing.widget-customizer-highlighted-widget { + box-shadow: none; +} + +/* Make shortcut buttons essentially invisible */ +.widget .customize-partial-edit-shortcut, +.customize-partial-edit-shortcut { + position: absolute; + float: right; + width: 1px; /* required to have a size to be focusable in Safari */ + height: 1px; + padding: 0; + margin: -1px -1px 0 0; + border: 0; + background: transparent; + color: transparent; + box-shadow: none; + outline: none; + z-index: 5; +} + +/** + * Styles for the actual shortcut + * + * Note that some properties are overly verbose to prevent theme interference. + */ +.widget .customize-partial-edit-shortcut button, +.customize-partial-edit-shortcut button { + position: absolute; + right: -30px; + top: 2px; + color: #fff; + width: 30px; + height: 30px; + min-width: 30px; + min-height: 30px; + line-height: 1 !important; + font-size: 18px; + z-index: 5; + background: #0085ba !important; + border-radius: 50%; + border: 2px solid #fff; + box-shadow: 0 2px 1px rgba(46, 68, 83, 0.15); + text-align: center; + cursor: pointer; + box-sizing: border-box; + padding: 3px; + animation-fill-mode: both; + animation-duration: .4s; + opacity: 0; + pointer-events: none; + text-shadow: + 0 -1px 1px #006799, + -1px 0 1px #006799, + 0 1px 1px #006799, + 1px 0 1px #006799; +} +.wp-custom-header .customize-partial-edit-shortcut button { + right: 2px +} + +.customize-partial-edit-shortcut button svg { + fill: #fff; + min-width: 20px; + min-height: 20px; + width: 20px; + height: 20px; + margin: auto; +} + +.customize-partial-edit-shortcut button:hover { + background: #008ec2 !important; /* matches primary buttons */ +} + +.customize-partial-edit-shortcut button:focus { + box-shadow: 0 0 0 2px #008ec2; +} + +body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button { + animation-name: customize-partial-edit-shortcut-bounce-appear; + pointer-events: auto; +} +body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button { + animation-name: customize-partial-edit-shortcut-bounce-disappear; + pointer-events: none; +} + +.page-sidebar-collapsed .customize-partial-edit-shortcut button, +.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button { + visibility: hidden; +} + +@keyframes customize-partial-edit-shortcut-bounce-appear { + from, 20%, 40%, 60%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + 0% { + opacity: 0; + transform: scale3d(.3, .3, .3); + } + 20% { + transform: scale3d(1.1, 1.1, 1.1); + } + 40% { + transform: scale3d(.9, .9, .9); + } + 60% { + opacity: 1; + transform: scale3d(1.03, 1.03, 1.03); + } + 80% { + transform: scale3d(.97, .97, .97); + } + to { + opacity: 1; + transform: scale3d(1, 1, 1); + } +} + +@keyframes customize-partial-edit-shortcut-bounce-disappear { + from, 20%, 40%, 60%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + 0% { + opacity: 1; + transform: scale3d(1, 1, 1); + } + 20% { + transform: scale3d(.97, .97, .97); + } + 40% { + opacity: 1; + transform: scale3d(1.03, 1.03, 1.03); + } + 60% { + transform: scale3d(.9, .9, .9); + } + 80% { + transform: scale3d(1.1, 1.1, 1.1); + } + to { + opacity: 0; + transform: scale3d(.3, .3, .3); + } +} + +@media screen and (max-width: 800px) { + .widget .customize-partial-edit-shortcut button, + .customize-partial-edit-shortcut button { + right: -32px; + } +} + +@media screen and (max-width: 320px) { + .widget .customize-partial-edit-shortcut button, + .customize-partial-edit-shortcut button { + right: -30px; + } +} diff --git a/wp-includes/css/customize-preview-rtl.min.css b/wp-includes/css/customize-preview-rtl.min.css new file mode 100644 index 0000000..3331e98 --- /dev/null +++ b/wp-includes/css/customize-preview-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.customize-partial-refreshing{opacity:.25;transition:opacity .25s;cursor:progress}.customize-partial-refreshing.widget-customizer-highlighted-widget{box-shadow:none}.customize-partial-edit-shortcut,.widget .customize-partial-edit-shortcut{position:absolute;float:right;width:1px;height:1px;padding:0;margin:-1px -1px 0 0;border:0;background:0 0;color:transparent;box-shadow:none;outline:0;z-index:5}.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{position:absolute;right:-30px;top:2px;color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;line-height:1!important;font-size:18px;z-index:5;background:#0085ba!important;border-radius:50%;border:2px solid #fff;box-shadow:0 2px 1px rgba(46,68,83,.15);text-align:center;cursor:pointer;box-sizing:border-box;padding:3px;animation-fill-mode:both;animation-duration:.4s;opacity:0;pointer-events:none;text-shadow:0 -1px 1px #006799,-1px 0 1px #006799,0 1px 1px #006799,1px 0 1px #006799}.wp-custom-header .customize-partial-edit-shortcut button{right:2px}.customize-partial-edit-shortcut button svg{fill:#fff;min-width:20px;min-height:20px;width:20px;height:20px;margin:auto}.customize-partial-edit-shortcut button:hover{background:#008ec2!important}.customize-partial-edit-shortcut button:focus{box-shadow:0 0 0 2px #008ec2}body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-appear;pointer-events:auto}body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-disappear;pointer-events:none}.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button,.page-sidebar-collapsed .customize-partial-edit-shortcut button{visibility:hidden}@keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scale3d(1,1,1)}}@keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:1;transform:scale3d(1,1,1)}20%{transform:scale3d(.97,.97,.97)}40%{opacity:1;transform:scale3d(1.03,1.03,1.03)}60%{transform:scale3d(.9,.9,.9)}80%{transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}@media screen and (max-width:800px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{right:-32px}}@media screen and (max-width:320px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{right:-30px}} \ No newline at end of file diff --git a/wp-includes/css/customize-preview.css b/wp-includes/css/customize-preview.css new file mode 100644 index 0000000..84da653 --- /dev/null +++ b/wp-includes/css/customize-preview.css @@ -0,0 +1,166 @@ +.customize-partial-refreshing { + opacity: 0.25; + transition: opacity 0.25s; + cursor: progress; +} + +/* Override highlight when refreshing */ +.customize-partial-refreshing.widget-customizer-highlighted-widget { + box-shadow: none; +} + +/* Make shortcut buttons essentially invisible */ +.widget .customize-partial-edit-shortcut, +.customize-partial-edit-shortcut { + position: absolute; + float: left; + width: 1px; /* required to have a size to be focusable in Safari */ + height: 1px; + padding: 0; + margin: -1px 0 0 -1px; + border: 0; + background: transparent; + color: transparent; + box-shadow: none; + outline: none; + z-index: 5; +} + +/** + * Styles for the actual shortcut + * + * Note that some properties are overly verbose to prevent theme interference. + */ +.widget .customize-partial-edit-shortcut button, +.customize-partial-edit-shortcut button { + position: absolute; + left: -30px; + top: 2px; + color: #fff; + width: 30px; + height: 30px; + min-width: 30px; + min-height: 30px; + line-height: 1 !important; + font-size: 18px; + z-index: 5; + background: #0085ba !important; + border-radius: 50%; + border: 2px solid #fff; + box-shadow: 0 2px 1px rgba(46, 68, 83, 0.15); + text-align: center; + cursor: pointer; + box-sizing: border-box; + padding: 3px; + animation-fill-mode: both; + animation-duration: .4s; + opacity: 0; + pointer-events: none; + text-shadow: + 0 -1px 1px #006799, + 1px 0 1px #006799, + 0 1px 1px #006799, + -1px 0 1px #006799; +} +.wp-custom-header .customize-partial-edit-shortcut button { + left: 2px +} + +.customize-partial-edit-shortcut button svg { + fill: #fff; + min-width: 20px; + min-height: 20px; + width: 20px; + height: 20px; + margin: auto; +} + +.customize-partial-edit-shortcut button:hover { + background: #008ec2 !important; /* matches primary buttons */ +} + +.customize-partial-edit-shortcut button:focus { + box-shadow: 0 0 0 2px #008ec2; +} + +body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button { + animation-name: customize-partial-edit-shortcut-bounce-appear; + pointer-events: auto; +} +body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button { + animation-name: customize-partial-edit-shortcut-bounce-disappear; + pointer-events: none; +} + +.page-sidebar-collapsed .customize-partial-edit-shortcut button, +.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button { + visibility: hidden; +} + +@keyframes customize-partial-edit-shortcut-bounce-appear { + from, 20%, 40%, 60%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + 0% { + opacity: 0; + transform: scale3d(.3, .3, .3); + } + 20% { + transform: scale3d(1.1, 1.1, 1.1); + } + 40% { + transform: scale3d(.9, .9, .9); + } + 60% { + opacity: 1; + transform: scale3d(1.03, 1.03, 1.03); + } + 80% { + transform: scale3d(.97, .97, .97); + } + to { + opacity: 1; + transform: scale3d(1, 1, 1); + } +} + +@keyframes customize-partial-edit-shortcut-bounce-disappear { + from, 20%, 40%, 60%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + 0% { + opacity: 1; + transform: scale3d(1, 1, 1); + } + 20% { + transform: scale3d(.97, .97, .97); + } + 40% { + opacity: 1; + transform: scale3d(1.03, 1.03, 1.03); + } + 60% { + transform: scale3d(.9, .9, .9); + } + 80% { + transform: scale3d(1.1, 1.1, 1.1); + } + to { + opacity: 0; + transform: scale3d(.3, .3, .3); + } +} + +@media screen and (max-width: 800px) { + .widget .customize-partial-edit-shortcut button, + .customize-partial-edit-shortcut button { + left: -32px; + } +} + +@media screen and (max-width: 320px) { + .widget .customize-partial-edit-shortcut button, + .customize-partial-edit-shortcut button { + left: -30px; + } +} diff --git a/wp-includes/css/customize-preview.min.css b/wp-includes/css/customize-preview.min.css new file mode 100644 index 0000000..28f2dc8 --- /dev/null +++ b/wp-includes/css/customize-preview.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.customize-partial-refreshing{opacity:.25;transition:opacity .25s;cursor:progress}.customize-partial-refreshing.widget-customizer-highlighted-widget{box-shadow:none}.customize-partial-edit-shortcut,.widget .customize-partial-edit-shortcut{position:absolute;float:left;width:1px;height:1px;padding:0;margin:-1px 0 0 -1px;border:0;background:0 0;color:transparent;box-shadow:none;outline:0;z-index:5}.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{position:absolute;left:-30px;top:2px;color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;line-height:1!important;font-size:18px;z-index:5;background:#0085ba!important;border-radius:50%;border:2px solid #fff;box-shadow:0 2px 1px rgba(46,68,83,.15);text-align:center;cursor:pointer;box-sizing:border-box;padding:3px;animation-fill-mode:both;animation-duration:.4s;opacity:0;pointer-events:none;text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799,-1px 0 1px #006799}.wp-custom-header .customize-partial-edit-shortcut button{left:2px}.customize-partial-edit-shortcut button svg{fill:#fff;min-width:20px;min-height:20px;width:20px;height:20px;margin:auto}.customize-partial-edit-shortcut button:hover{background:#008ec2!important}.customize-partial-edit-shortcut button:focus{box-shadow:0 0 0 2px #008ec2}body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-appear;pointer-events:auto}body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-disappear;pointer-events:none}.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button,.page-sidebar-collapsed .customize-partial-edit-shortcut button{visibility:hidden}@keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scale3d(1,1,1)}}@keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:1;transform:scale3d(1,1,1)}20%{transform:scale3d(.97,.97,.97)}40%{opacity:1;transform:scale3d(1.03,1.03,1.03)}60%{transform:scale3d(.9,.9,.9)}80%{transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}@media screen and (max-width:800px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{left:-32px}}@media screen and (max-width:320px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{left:-30px}} \ No newline at end of file diff --git a/wp-includes/css/dashicons.css b/wp-includes/css/dashicons.css new file mode 100644 index 0000000..3f5bbc8 --- /dev/null +++ b/wp-includes/css/dashicons.css @@ -0,0 +1,1156 @@ +/** + * DO NOT EDIT THIS FILE DIRECTLY + * This file is automatically built using a build process + * If you need to fix errors, see https://github.com/WordPress/dashicons + */ + +/* stylelint-disable function-url-quotes, declaration-colon-newline-after */ +@font-face { + font-family: dashicons; + src: url("../fonts/dashicons.eot?50db0456fde2a241f005968eede3f987"); + src: url("../fonts/dashicons.eot?50db0456fde2a241f005968eede3f987#iefix") format("embedded-opentype"), + url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff"), + url("../fonts/dashicons.ttf?50db0456fde2a241f005968eede3f987") format("truetype"); + font-weight: 400; + font-style: normal; +} +/* stylelint-enable */ + + +.dashicons, +.dashicons-before:before { + font-family: dashicons; + display: inline-block; + line-height: 1; + font-weight: 400; + font-style: normal; + speak: none; + text-decoration: inherit; + text-transform: none; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 20px; + height: 20px; + font-size: 20px; + vertical-align: top; + text-align: center; + transition: color 0.1s ease-in; +} + +/* Icons */ + +.dashicons-admin-appearance:before { + content: "\f100"; +} + +.dashicons-admin-collapse:before { + content: "\f148"; +} + +.dashicons-admin-comments:before { + content: "\f101"; +} + +.dashicons-admin-customizer:before { + content: "\f540"; +} + +.dashicons-admin-generic:before { + content: "\f111"; +} + +.dashicons-admin-home:before { + content: "\f102"; +} + +.dashicons-admin-links:before { + content: "\f103"; +} + +.dashicons-admin-media:before { + content: "\f104"; +} + +.dashicons-admin-multisite:before { + content: "\f541"; +} + +.dashicons-admin-network:before { + content: "\f112"; +} + +.dashicons-admin-page:before { + content: "\f105"; +} + +.dashicons-admin-plugins:before { + content: "\f106"; +} + +.dashicons-admin-post:before { + content: "\f109"; +} + +.dashicons-admin-settings:before { + content: "\f108"; +} + +.dashicons-admin-site-alt:before { + content: "\f11d"; +} + +.dashicons-admin-site-alt2:before { + content: "\f11e"; +} + +.dashicons-admin-site-alt3:before { + content: "\f11f"; +} + +.dashicons-admin-site:before { + content: "\f319"; +} + +.dashicons-admin-tools:before { + content: "\f107"; +} + +.dashicons-admin-users:before { + content: "\f110"; +} + +.dashicons-album:before { + content: "\f514"; +} + +.dashicons-align-center:before { + content: "\f134"; +} + +.dashicons-align-left:before { + content: "\f135"; +} + +.dashicons-align-none:before { + content: "\f138"; +} + +.dashicons-align-right:before { + content: "\f136"; +} + +.dashicons-analytics:before { + content: "\f183"; +} + +.dashicons-archive:before { + content: "\f480"; +} + +.dashicons-arrow-down-alt:before { + content: "\f346"; +} + +.dashicons-arrow-down-alt2:before { + content: "\f347"; +} + +.dashicons-arrow-down:before { + content: "\f140"; +} + +.dashicons-arrow-left-alt:before { + content: "\f340"; +} + +.dashicons-arrow-left-alt2:before { + content: "\f341"; +} + +.dashicons-arrow-left:before { + content: "\f141"; +} + +.dashicons-arrow-right-alt:before { + content: "\f344"; +} + +.dashicons-arrow-right-alt2:before { + content: "\f345"; +} + +.dashicons-arrow-right:before { + content: "\f139"; +} + +.dashicons-arrow-up-alt:before { + content: "\f342"; +} + +.dashicons-arrow-up-alt2:before { + content: "\f343"; +} + +.dashicons-arrow-up-duplicate:before { + content: "\f143"; +} + +.dashicons-arrow-up:before { + content: "\f142"; +} + +.dashicons-art:before { + content: "\f309"; +} + +.dashicons-awards:before { + content: "\f313"; +} + +.dashicons-backup:before { + content: "\f321"; +} + +.dashicons-book-alt:before { + content: "\f331"; +} + +.dashicons-book:before { + content: "\f330"; +} + +.dashicons-buddicons-activity:before { + content: "\f452"; +} + +.dashicons-buddicons-bbpress-logo:before { + content: "\f477"; +} + +.dashicons-buddicons-buddypress-logo:before { + content: "\f448"; +} + +.dashicons-buddicons-community:before { + content: "\f453"; +} + +.dashicons-buddicons-forums:before { + content: "\f449"; +} + +.dashicons-buddicons-friends:before { + content: "\f454"; +} + +.dashicons-buddicons-groups:before { + content: "\f456"; +} + +.dashicons-buddicons-pm:before { + content: "\f457"; +} + +.dashicons-buddicons-replies:before { + content: "\f451"; +} + +.dashicons-buddicons-topics:before { + content: "\f450"; +} + +.dashicons-buddicons-tracking:before { + content: "\f455"; +} + +.dashicons-building:before { + content: "\f512"; +} + +.dashicons-businessman:before { + content: "\f338"; +} + +.dashicons-businessperson:before { + content: "\f12e"; +} + +.dashicons-businesswoman:before { + content: "\f12f"; +} + +.dashicons-calendar-alt:before { + content: "\f508"; +} + +.dashicons-calendar:before { + content: "\f145"; +} + +.dashicons-camera-alt:before { + content: "\f129"; +} + +.dashicons-camera:before { + content: "\f306"; +} + +.dashicons-carrot:before { + content: "\f511"; +} + +.dashicons-cart:before { + content: "\f174"; +} + +.dashicons-category:before { + content: "\f318"; +} + +.dashicons-chart-area:before { + content: "\f239"; +} + +.dashicons-chart-bar:before { + content: "\f185"; +} + +.dashicons-chart-line:before { + content: "\f238"; +} + +.dashicons-chart-pie:before { + content: "\f184"; +} + +.dashicons-clipboard:before { + content: "\f481"; +} + +.dashicons-clock:before { + content: "\f469"; +} + +.dashicons-cloud:before { + content: "\f176"; +} + +.dashicons-code-standards:before { + content: "\f13a"; +} + +.dashicons-color-picker:before { + content: "\f131"; +} + +.dashicons-controls-back:before { + content: "\f518"; +} + +.dashicons-controls-forward:before { + content: "\f519"; +} + +.dashicons-controls-pause:before { + content: "\f523"; +} + +.dashicons-controls-play:before { + content: "\f522"; +} + +.dashicons-controls-repeat:before { + content: "\f515"; +} + +.dashicons-controls-skipback:before { + content: "\f516"; +} + +.dashicons-controls-skipforward:before { + content: "\f517"; +} + +.dashicons-controls-volumeoff:before { + content: "\f520"; +} + +.dashicons-controls-volumeon:before { + content: "\f521"; +} + +.dashicons-dashboard:before { + content: "\f226"; +} + +.dashicons-desktop:before { + content: "\f472"; +} + +.dashicons-dismiss:before { + content: "\f153"; +} + +.dashicons-download:before { + content: "\f316"; +} + +.dashicons-edit-large:before { + content: "\f327"; +} + +.dashicons-edit:before { + content: "\f464"; +} + +.dashicons-editor-aligncenter:before { + content: "\f207"; +} + +.dashicons-editor-alignleft:before { + content: "\f206"; +} + +.dashicons-editor-alignright:before { + content: "\f208"; +} + +.dashicons-editor-bold:before { + content: "\f200"; +} + +.dashicons-editor-break:before { + content: "\f474"; +} + +.dashicons-editor-code-duplicate:before { + content: "\f494"; +} + +.dashicons-editor-code:before { + content: "\f475"; +} + +.dashicons-editor-contract:before { + content: "\f506"; +} + +.dashicons-editor-customchar:before { + content: "\f220"; +} + +.dashicons-editor-expand:before { + content: "\f211"; +} + +.dashicons-editor-help:before { + content: "\f223"; +} + +.dashicons-editor-indent:before { + content: "\f222"; +} + +.dashicons-editor-insertmore:before { + content: "\f209"; +} + +.dashicons-editor-italic:before { + content: "\f201"; +} + +.dashicons-editor-justify:before { + content: "\f214"; +} + +.dashicons-editor-kitchensink:before { + content: "\f212"; +} + +.dashicons-editor-ltr:before { + content: "\f10c"; +} + +.dashicons-editor-ol-rtl:before { + content: "\f12c"; +} + +.dashicons-editor-ol:before { + content: "\f204"; +} + +.dashicons-editor-outdent:before { + content: "\f221"; +} + +.dashicons-editor-paragraph:before { + content: "\f476"; +} + +.dashicons-editor-paste-text:before { + content: "\f217"; +} + +.dashicons-editor-paste-word:before { + content: "\f216"; +} + +.dashicons-editor-quote:before { + content: "\f205"; +} + +.dashicons-editor-removeformatting:before { + content: "\f218"; +} + +.dashicons-editor-rtl:before { + content: "\f320"; +} + +.dashicons-editor-spellcheck:before { + content: "\f210"; +} + +.dashicons-editor-strikethrough:before { + content: "\f224"; +} + +.dashicons-editor-table:before { + content: "\f535"; +} + +.dashicons-editor-textcolor:before { + content: "\f215"; +} + +.dashicons-editor-ul:before { + content: "\f203"; +} + +.dashicons-editor-underline:before { + content: "\f213"; +} + +.dashicons-editor-unlink:before { + content: "\f225"; +} + +.dashicons-editor-video:before { + content: "\f219"; +} + +.dashicons-email-alt:before { + content: "\f466"; +} + +.dashicons-email-alt2:before { + content: "\f467"; +} + +.dashicons-email:before { + content: "\f465"; +} + +.dashicons-excerpt-view:before { + content: "\f164"; +} + +.dashicons-external:before { + content: "\f504"; +} + +.dashicons-facebook-alt:before { + content: "\f305"; +} + +.dashicons-facebook:before { + content: "\f304"; +} + +.dashicons-feedback:before { + content: "\f175"; +} + +.dashicons-filter:before { + content: "\f536"; +} + +.dashicons-flag:before { + content: "\f227"; +} + +.dashicons-format-aside:before { + content: "\f123"; +} + +.dashicons-format-audio:before { + content: "\f127"; +} + +.dashicons-format-chat:before { + content: "\f125"; +} + +.dashicons-format-gallery:before { + content: "\f161"; +} + +.dashicons-format-image:before { + content: "\f128"; +} + +.dashicons-format-quote:before { + content: "\f122"; +} + +.dashicons-format-status:before { + content: "\f130"; +} + +.dashicons-format-video:before { + content: "\f126"; +} + +.dashicons-forms:before { + content: "\f314"; +} + +.dashicons-googleplus:before { + content: "\f462"; +} + +.dashicons-grid-view:before { + content: "\f509"; +} + +.dashicons-groups:before { + content: "\f307"; +} + +.dashicons-hammer:before { + content: "\f308"; +} + +.dashicons-heart:before { + content: "\f487"; +} + +.dashicons-hidden:before { + content: "\f530"; +} + +.dashicons-id-alt:before { + content: "\f337"; +} + +.dashicons-id:before { + content: "\f336"; +} + +.dashicons-image-crop:before { + content: "\f165"; +} + +.dashicons-image-filter:before { + content: "\f533"; +} + +.dashicons-image-flip-horizontal:before { + content: "\f169"; +} + +.dashicons-image-flip-vertical:before { + content: "\f168"; +} + +.dashicons-image-rotate-left:before { + content: "\f166"; +} + +.dashicons-image-rotate-right:before { + content: "\f167"; +} + +.dashicons-image-rotate:before { + content: "\f531"; +} + +.dashicons-images-alt:before { + content: "\f232"; +} + +.dashicons-images-alt2:before { + content: "\f233"; +} + +.dashicons-index-card:before { + content: "\f510"; +} + +.dashicons-info:before { + content: "\f348"; +} + +.dashicons-instagram:before { + content: "\f12d"; +} + +.dashicons-laptop:before { + content: "\f547"; +} + +.dashicons-layout:before { + content: "\f538"; +} + +.dashicons-leftright:before { + content: "\f229"; +} + +.dashicons-lightbulb:before { + content: "\f339"; +} + +.dashicons-list-view:before { + content: "\f163"; +} + +.dashicons-location-alt:before { + content: "\f231"; +} + +.dashicons-location:before { + content: "\f230"; +} + +.dashicons-lock-duplicate:before { + content: "\f315"; +} + +.dashicons-lock:before { + content: "\f160"; +} + +.dashicons-marker:before { + content: "\f159"; +} + +.dashicons-media-archive:before { + content: "\f501"; +} + +.dashicons-media-audio:before { + content: "\f500"; +} + +.dashicons-media-code:before { + content: "\f499"; +} + +.dashicons-media-default:before { + content: "\f498"; +} + +.dashicons-media-document:before { + content: "\f497"; +} + +.dashicons-media-interactive:before { + content: "\f496"; +} + +.dashicons-media-spreadsheet:before { + content: "\f495"; +} + +.dashicons-media-text:before { + content: "\f491"; +} + +.dashicons-media-video:before { + content: "\f490"; +} + +.dashicons-megaphone:before { + content: "\f488"; +} + +.dashicons-menu-alt:before { + content: "\f228"; +} + +.dashicons-menu-alt2:before { + content: "\f329"; +} + +.dashicons-menu-alt3:before { + content: "\f349"; +} + +.dashicons-menu:before { + content: "\f333"; +} + +.dashicons-microphone:before { + content: "\f482"; +} + +.dashicons-migrate:before { + content: "\f310"; +} + +.dashicons-minus:before { + content: "\f460"; +} + +.dashicons-money:before { + content: "\f526"; +} + +.dashicons-move:before { + content: "\f545"; +} + +.dashicons-nametag:before { + content: "\f484"; +} + +.dashicons-networking:before { + content: "\f325"; +} + +.dashicons-no-alt:before { + content: "\f335"; +} + +.dashicons-no:before { + content: "\f158"; +} + +.dashicons-palmtree:before { + content: "\f527"; +} + +.dashicons-paperclip:before { + content: "\f546"; +} + +.dashicons-performance:before { + content: "\f311"; +} + +.dashicons-phone:before { + content: "\f525"; +} + +.dashicons-playlist-audio:before { + content: "\f492"; +} + +.dashicons-playlist-video:before { + content: "\f493"; +} + +.dashicons-plugins-checked:before { + content: "\f485"; +} + +.dashicons-plus-alt:before { + content: "\f502"; +} + +.dashicons-plus-alt2:before { + content: "\f543"; +} + +.dashicons-plus:before { + content: "\f132"; +} + +.dashicons-portfolio:before { + content: "\f322"; +} + +.dashicons-post-status:before { + content: "\f173"; +} + +.dashicons-pressthis:before { + content: "\f157"; +} + +.dashicons-products:before { + content: "\f312"; +} + +.dashicons-randomize:before { + content: "\f503"; +} + +.dashicons-redo:before { + content: "\f172"; +} + +.dashicons-rest-api:before { + content: "\f124"; +} + +.dashicons-rss:before { + content: "\f303"; +} + +.dashicons-schedule:before { + content: "\f489"; +} + +.dashicons-screenoptions:before { + content: "\f180"; +} + +.dashicons-search:before { + content: "\f179"; +} + +.dashicons-share-alt:before { + content: "\f240"; +} + +.dashicons-share-alt2:before { + content: "\f242"; +} + +.dashicons-share:before { + content: "\f237"; +} + +.dashicons-shield-alt:before { + content: "\f334"; +} + +.dashicons-shield:before { + content: "\f332"; +} + +.dashicons-slides:before { + content: "\f181"; +} + +.dashicons-smartphone:before { + content: "\f470"; +} + +.dashicons-smiley:before { + content: "\f328"; +} + +.dashicons-sort:before { + content: "\f156"; +} + +.dashicons-sos:before { + content: "\f468"; +} + +.dashicons-star-empty:before { + content: "\f154"; +} + +.dashicons-star-filled:before { + content: "\f155"; +} + +.dashicons-star-half:before { + content: "\f459"; +} + +.dashicons-sticky:before { + content: "\f537"; +} + +.dashicons-store:before { + content: "\f513"; +} + +.dashicons-tablet:before { + content: "\f471"; +} + +.dashicons-tag:before { + content: "\f323"; +} + +.dashicons-tagcloud:before { + content: "\f479"; +} + +.dashicons-testimonial:before { + content: "\f473"; +} + +.dashicons-text-page:before { + content: "\f121"; +} + +.dashicons-text:before { + content: "\f478"; +} + +.dashicons-thumbs-down:before { + content: "\f542"; +} + +.dashicons-thumbs-up:before { + content: "\f529"; +} + +.dashicons-tickets-alt:before { + content: "\f524"; +} + +.dashicons-tickets:before { + content: "\f486"; +} + +.dashicons-tide:before { + content: "\f10d"; +} + +.dashicons-translation:before { + content: "\f326"; +} + +.dashicons-trash:before { + content: "\f182"; +} + +.dashicons-twitter-alt:before { + content: "\f302"; +} + +.dashicons-twitter:before { + content: "\f301"; +} + +.dashicons-undo:before { + content: "\f171"; +} + +.dashicons-universal-access-alt:before { + content: "\f507"; +} + +.dashicons-universal-access:before { + content: "\f483"; +} + +.dashicons-unlock:before { + content: "\f528"; +} + +.dashicons-update-alt:before { + content: "\f113"; +} + +.dashicons-update:before { + content: "\f463"; +} + +.dashicons-upload:before { + content: "\f317"; +} + +.dashicons-vault:before { + content: "\f178"; +} + +.dashicons-video-alt:before { + content: "\f234"; +} + +.dashicons-video-alt2:before { + content: "\f235"; +} + +.dashicons-video-alt3:before { + content: "\f236"; +} + +.dashicons-visibility:before { + content: "\f177"; +} + +.dashicons-warning:before { + content: "\f534"; +} + +.dashicons-welcome-add-page:before { + content: "\f133"; +} + +.dashicons-welcome-comments:before { + content: "\f117"; +} + +.dashicons-welcome-learn-more:before { + content: "\f118"; +} + +.dashicons-welcome-view-site:before { + content: "\f115"; +} + +.dashicons-welcome-widgets-menus:before { + content: "\f116"; +} + +.dashicons-welcome-write-blog:before { + content: "\f119"; +} + +.dashicons-wordpress-alt:before { + content: "\f324"; +} + +.dashicons-wordpress:before { + content: "\f120"; +} + +.dashicons-yes-alt:before { + content: "\f12a"; +} + +.dashicons-yes:before { + content: "\f147"; +} + +/* Additional CSS classes, manually added to the CSS template file */ + +.dashicons-editor-distractionfree:before { + content: "\f211"; +} + +/* This is a typo, but was previously released. It should remain for backward compatibility. See https://core.trac.wordpress.org/ticket/30832. */ +.dashicons-exerpt-view:before { + content: "\f164"; +} + +.dashicons-format-links:before { + content: "\f103"; +} + +.dashicons-format-standard:before { + content: "\f109"; +} + +.dashicons-post-trash:before { + content: "\f182"; +} + +.dashicons-share1:before { + content: "\f237"; +} + +.dashicons-welcome-edit-page:before { + content: "\f119"; +} diff --git a/wp-includes/css/dashicons.min.css b/wp-includes/css/dashicons.min.css new file mode 100644 index 0000000..26925af --- /dev/null +++ b/wp-includes/css/dashicons.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +@font-face{font-family:dashicons;src:url(../fonts/dashicons.eot?50db0456fde2a241f005968eede3f987);src:url(../fonts/dashicons.eot?50db0456fde2a241f005968eede3f987#iefix) format("embedded-opentype"),url("data:application/x-font-woff;charset=utf-8;base64,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") format("woff"),url(../fonts/dashicons.ttf?50db0456fde2a241f005968eede3f987) format("truetype");font-weight:400;font-style:normal}.dashicons,.dashicons-before:before{font-family:dashicons;display:inline-block;line-height:1;font-weight:400;font-style:normal;speak:none;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:20px;height:20px;font-size:20px;vertical-align:top;text-align:center;transition:color .1s ease-in}.dashicons-admin-appearance:before{content:"\f100"}.dashicons-admin-collapse:before{content:"\f148"}.dashicons-admin-comments:before{content:"\f101"}.dashicons-admin-customizer:before{content:"\f540"}.dashicons-admin-generic:before{content:"\f111"}.dashicons-admin-home:before{content:"\f102"}.dashicons-admin-links:before{content:"\f103"}.dashicons-admin-media:before{content:"\f104"}.dashicons-admin-multisite:before{content:"\f541"}.dashicons-admin-network:before{content:"\f112"}.dashicons-admin-page:before{content:"\f105"}.dashicons-admin-plugins:before{content:"\f106"}.dashicons-admin-post:before{content:"\f109"}.dashicons-admin-settings:before{content:"\f108"}.dashicons-admin-site-alt:before{content:"\f11d"}.dashicons-admin-site-alt2:before{content:"\f11e"}.dashicons-admin-site-alt3:before{content:"\f11f"}.dashicons-admin-site:before{content:"\f319"}.dashicons-admin-tools:before{content:"\f107"}.dashicons-admin-users:before{content:"\f110"}.dashicons-album:before{content:"\f514"}.dashicons-align-center:before{content:"\f134"}.dashicons-align-left:before{content:"\f135"}.dashicons-align-none:before{content:"\f138"}.dashicons-align-right:before{content:"\f136"}.dashicons-analytics:before{content:"\f183"}.dashicons-archive:before{content:"\f480"}.dashicons-arrow-down-alt:before{content:"\f346"}.dashicons-arrow-down-alt2:before{content:"\f347"}.dashicons-arrow-down:before{content:"\f140"}.dashicons-arrow-left-alt:before{content:"\f340"}.dashicons-arrow-left-alt2:before{content:"\f341"}.dashicons-arrow-left:before{content:"\f141"}.dashicons-arrow-right-alt:before{content:"\f344"}.dashicons-arrow-right-alt2:before{content:"\f345"}.dashicons-arrow-right:before{content:"\f139"}.dashicons-arrow-up-alt:before{content:"\f342"}.dashicons-arrow-up-alt2:before{content:"\f343"}.dashicons-arrow-up-duplicate:before{content:"\f143"}.dashicons-arrow-up:before{content:"\f142"}.dashicons-art:before{content:"\f309"}.dashicons-awards:before{content:"\f313"}.dashicons-backup:before{content:"\f321"}.dashicons-book-alt:before{content:"\f331"}.dashicons-book:before{content:"\f330"}.dashicons-buddicons-activity:before{content:"\f452"}.dashicons-buddicons-bbpress-logo:before{content:"\f477"}.dashicons-buddicons-buddypress-logo:before{content:"\f448"}.dashicons-buddicons-community:before{content:"\f453"}.dashicons-buddicons-forums:before{content:"\f449"}.dashicons-buddicons-friends:before{content:"\f454"}.dashicons-buddicons-groups:before{content:"\f456"}.dashicons-buddicons-pm:before{content:"\f457"}.dashicons-buddicons-replies:before{content:"\f451"}.dashicons-buddicons-topics:before{content:"\f450"}.dashicons-buddicons-tracking:before{content:"\f455"}.dashicons-building:before{content:"\f512"}.dashicons-businessman:before{content:"\f338"}.dashicons-businessperson:before{content:"\f12e"}.dashicons-businesswoman:before{content:"\f12f"}.dashicons-calendar-alt:before{content:"\f508"}.dashicons-calendar:before{content:"\f145"}.dashicons-camera-alt:before{content:"\f129"}.dashicons-camera:before{content:"\f306"}.dashicons-carrot:before{content:"\f511"}.dashicons-cart:before{content:"\f174"}.dashicons-category:before{content:"\f318"}.dashicons-chart-area:before{content:"\f239"}.dashicons-chart-bar:before{content:"\f185"}.dashicons-chart-line:before{content:"\f238"}.dashicons-chart-pie:before{content:"\f184"}.dashicons-clipboard:before{content:"\f481"}.dashicons-clock:before{content:"\f469"}.dashicons-cloud:before{content:"\f176"}.dashicons-code-standards:before{content:"\f13a"}.dashicons-color-picker:before{content:"\f131"}.dashicons-controls-back:before{content:"\f518"}.dashicons-controls-forward:before{content:"\f519"}.dashicons-controls-pause:before{content:"\f523"}.dashicons-controls-play:before{content:"\f522"}.dashicons-controls-repeat:before{content:"\f515"}.dashicons-controls-skipback:before{content:"\f516"}.dashicons-controls-skipforward:before{content:"\f517"}.dashicons-controls-volumeoff:before{content:"\f520"}.dashicons-controls-volumeon:before{content:"\f521"}.dashicons-dashboard:before{content:"\f226"}.dashicons-desktop:before{content:"\f472"}.dashicons-dismiss:before{content:"\f153"}.dashicons-download:before{content:"\f316"}.dashicons-edit-large:before{content:"\f327"}.dashicons-edit:before{content:"\f464"}.dashicons-editor-aligncenter:before{content:"\f207"}.dashicons-editor-alignleft:before{content:"\f206"}.dashicons-editor-alignright:before{content:"\f208"}.dashicons-editor-bold:before{content:"\f200"}.dashicons-editor-break:before{content:"\f474"}.dashicons-editor-code-duplicate:before{content:"\f494"}.dashicons-editor-code:before{content:"\f475"}.dashicons-editor-contract:before{content:"\f506"}.dashicons-editor-customchar:before{content:"\f220"}.dashicons-editor-expand:before{content:"\f211"}.dashicons-editor-help:before{content:"\f223"}.dashicons-editor-indent:before{content:"\f222"}.dashicons-editor-insertmore:before{content:"\f209"}.dashicons-editor-italic:before{content:"\f201"}.dashicons-editor-justify:before{content:"\f214"}.dashicons-editor-kitchensink:before{content:"\f212"}.dashicons-editor-ltr:before{content:"\f10c"}.dashicons-editor-ol-rtl:before{content:"\f12c"}.dashicons-editor-ol:before{content:"\f204"}.dashicons-editor-outdent:before{content:"\f221"}.dashicons-editor-paragraph:before{content:"\f476"}.dashicons-editor-paste-text:before{content:"\f217"}.dashicons-editor-paste-word:before{content:"\f216"}.dashicons-editor-quote:before{content:"\f205"}.dashicons-editor-removeformatting:before{content:"\f218"}.dashicons-editor-rtl:before{content:"\f320"}.dashicons-editor-spellcheck:before{content:"\f210"}.dashicons-editor-strikethrough:before{content:"\f224"}.dashicons-editor-table:before{content:"\f535"}.dashicons-editor-textcolor:before{content:"\f215"}.dashicons-editor-ul:before{content:"\f203"}.dashicons-editor-underline:before{content:"\f213"}.dashicons-editor-unlink:before{content:"\f225"}.dashicons-editor-video:before{content:"\f219"}.dashicons-email-alt:before{content:"\f466"}.dashicons-email-alt2:before{content:"\f467"}.dashicons-email:before{content:"\f465"}.dashicons-excerpt-view:before{content:"\f164"}.dashicons-external:before{content:"\f504"}.dashicons-facebook-alt:before{content:"\f305"}.dashicons-facebook:before{content:"\f304"}.dashicons-feedback:before{content:"\f175"}.dashicons-filter:before{content:"\f536"}.dashicons-flag:before{content:"\f227"}.dashicons-format-aside:before{content:"\f123"}.dashicons-format-audio:before{content:"\f127"}.dashicons-format-chat:before{content:"\f125"}.dashicons-format-gallery:before{content:"\f161"}.dashicons-format-image:before{content:"\f128"}.dashicons-format-quote:before{content:"\f122"}.dashicons-format-status:before{content:"\f130"}.dashicons-format-video:before{content:"\f126"}.dashicons-forms:before{content:"\f314"}.dashicons-googleplus:before{content:"\f462"}.dashicons-grid-view:before{content:"\f509"}.dashicons-groups:before{content:"\f307"}.dashicons-hammer:before{content:"\f308"}.dashicons-heart:before{content:"\f487"}.dashicons-hidden:before{content:"\f530"}.dashicons-id-alt:before{content:"\f337"}.dashicons-id:before{content:"\f336"}.dashicons-image-crop:before{content:"\f165"}.dashicons-image-filter:before{content:"\f533"}.dashicons-image-flip-horizontal:before{content:"\f169"}.dashicons-image-flip-vertical:before{content:"\f168"}.dashicons-image-rotate-left:before{content:"\f166"}.dashicons-image-rotate-right:before{content:"\f167"}.dashicons-image-rotate:before{content:"\f531"}.dashicons-images-alt:before{content:"\f232"}.dashicons-images-alt2:before{content:"\f233"}.dashicons-index-card:before{content:"\f510"}.dashicons-info:before{content:"\f348"}.dashicons-instagram:before{content:"\f12d"}.dashicons-laptop:before{content:"\f547"}.dashicons-layout:before{content:"\f538"}.dashicons-leftright:before{content:"\f229"}.dashicons-lightbulb:before{content:"\f339"}.dashicons-list-view:before{content:"\f163"}.dashicons-location-alt:before{content:"\f231"}.dashicons-location:before{content:"\f230"}.dashicons-lock-duplicate:before{content:"\f315"}.dashicons-lock:before{content:"\f160"}.dashicons-marker:before{content:"\f159"}.dashicons-media-archive:before{content:"\f501"}.dashicons-media-audio:before{content:"\f500"}.dashicons-media-code:before{content:"\f499"}.dashicons-media-default:before{content:"\f498"}.dashicons-media-document:before{content:"\f497"}.dashicons-media-interactive:before{content:"\f496"}.dashicons-media-spreadsheet:before{content:"\f495"}.dashicons-media-text:before{content:"\f491"}.dashicons-media-video:before{content:"\f490"}.dashicons-megaphone:before{content:"\f488"}.dashicons-menu-alt:before{content:"\f228"}.dashicons-menu-alt2:before{content:"\f329"}.dashicons-menu-alt3:before{content:"\f349"}.dashicons-menu:before{content:"\f333"}.dashicons-microphone:before{content:"\f482"}.dashicons-migrate:before{content:"\f310"}.dashicons-minus:before{content:"\f460"}.dashicons-money:before{content:"\f526"}.dashicons-move:before{content:"\f545"}.dashicons-nametag:before{content:"\f484"}.dashicons-networking:before{content:"\f325"}.dashicons-no-alt:before{content:"\f335"}.dashicons-no:before{content:"\f158"}.dashicons-palmtree:before{content:"\f527"}.dashicons-paperclip:before{content:"\f546"}.dashicons-performance:before{content:"\f311"}.dashicons-phone:before{content:"\f525"}.dashicons-playlist-audio:before{content:"\f492"}.dashicons-playlist-video:before{content:"\f493"}.dashicons-plugins-checked:before{content:"\f485"}.dashicons-plus-alt:before{content:"\f502"}.dashicons-plus-alt2:before{content:"\f543"}.dashicons-plus:before{content:"\f132"}.dashicons-portfolio:before{content:"\f322"}.dashicons-post-status:before{content:"\f173"}.dashicons-pressthis:before{content:"\f157"}.dashicons-products:before{content:"\f312"}.dashicons-randomize:before{content:"\f503"}.dashicons-redo:before{content:"\f172"}.dashicons-rest-api:before{content:"\f124"}.dashicons-rss:before{content:"\f303"}.dashicons-schedule:before{content:"\f489"}.dashicons-screenoptions:before{content:"\f180"}.dashicons-search:before{content:"\f179"}.dashicons-share-alt:before{content:"\f240"}.dashicons-share-alt2:before{content:"\f242"}.dashicons-share:before{content:"\f237"}.dashicons-shield-alt:before{content:"\f334"}.dashicons-shield:before{content:"\f332"}.dashicons-slides:before{content:"\f181"}.dashicons-smartphone:before{content:"\f470"}.dashicons-smiley:before{content:"\f328"}.dashicons-sort:before{content:"\f156"}.dashicons-sos:before{content:"\f468"}.dashicons-star-empty:before{content:"\f154"}.dashicons-star-filled:before{content:"\f155"}.dashicons-star-half:before{content:"\f459"}.dashicons-sticky:before{content:"\f537"}.dashicons-store:before{content:"\f513"}.dashicons-tablet:before{content:"\f471"}.dashicons-tag:before{content:"\f323"}.dashicons-tagcloud:before{content:"\f479"}.dashicons-testimonial:before{content:"\f473"}.dashicons-text-page:before{content:"\f121"}.dashicons-text:before{content:"\f478"}.dashicons-thumbs-down:before{content:"\f542"}.dashicons-thumbs-up:before{content:"\f529"}.dashicons-tickets-alt:before{content:"\f524"}.dashicons-tickets:before{content:"\f486"}.dashicons-tide:before{content:"\f10d"}.dashicons-translation:before{content:"\f326"}.dashicons-trash:before{content:"\f182"}.dashicons-twitter-alt:before{content:"\f302"}.dashicons-twitter:before{content:"\f301"}.dashicons-undo:before{content:"\f171"}.dashicons-universal-access-alt:before{content:"\f507"}.dashicons-universal-access:before{content:"\f483"}.dashicons-unlock:before{content:"\f528"}.dashicons-update-alt:before{content:"\f113"}.dashicons-update:before{content:"\f463"}.dashicons-upload:before{content:"\f317"}.dashicons-vault:before{content:"\f178"}.dashicons-video-alt:before{content:"\f234"}.dashicons-video-alt2:before{content:"\f235"}.dashicons-video-alt3:before{content:"\f236"}.dashicons-visibility:before{content:"\f177"}.dashicons-warning:before{content:"\f534"}.dashicons-welcome-add-page:before{content:"\f133"}.dashicons-welcome-comments:before{content:"\f117"}.dashicons-welcome-learn-more:before{content:"\f118"}.dashicons-welcome-view-site:before{content:"\f115"}.dashicons-welcome-widgets-menus:before{content:"\f116"}.dashicons-welcome-write-blog:before{content:"\f119"}.dashicons-wordpress-alt:before{content:"\f324"}.dashicons-wordpress:before{content:"\f120"}.dashicons-yes-alt:before{content:"\f12a"}.dashicons-yes:before{content:"\f147"}.dashicons-editor-distractionfree:before{content:"\f211"}.dashicons-exerpt-view:before{content:"\f164"}.dashicons-format-links:before{content:"\f103"}.dashicons-format-standard:before{content:"\f109"}.dashicons-post-trash:before{content:"\f182"}.dashicons-share1:before{content:"\f237"}.dashicons-welcome-edit-page:before{content:"\f119"} \ No newline at end of file diff --git a/wp-includes/css/dist/block-directory/style-rtl.css b/wp-includes/css/dist/block-directory/style-rtl.css new file mode 100644 index 0000000..13e64e2 --- /dev/null +++ b/wp-includes/css/dist/block-directory/style-rtl.css @@ -0,0 +1,171 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.block-directory-downloadable-block-header__row { + display: flex; + flex-grow: 1; } + .block-directory-downloadable-block-header__row .block-editor-block-icon { + width: 36px; + height: 36px; + font-size: 36px; + background-color: #edeff0; } + .block-directory-downloadable-block-header__row img { + width: 36px; + height: 36px; } + .block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column { + display: flex; + flex-direction: column; + flex-grow: 1; } + .block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column .block-directory-downloadable-block-header__title { + font-weight: 600; + margin-right: 12px; } + .block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column .block-directory-block-ratings { + margin-right: 12px; } + +.block-directory-downloadable-block-info__content { + font-size: 13px; } + +.block-directory-downloadable-block-info__row { + display: flex; + justify-content: space-between; + color: #606a73; + margin-top: 8px; + font-size: 12px; } + .block-directory-downloadable-block-info__row .block-directory-downloadable-block-info__column { + display: flex; + align-items: center; } + .block-directory-downloadable-block-info__row .block-directory-downloadable-block-info__column .dashicon { + font-size: 16px; + margin-left: 4px; } + +.block-directory-downloadable-block-author-info__content { + color: #606a73; + margin-bottom: 4px; } + +.block-directory-downloadable-block-author-info__content-author { + margin-bottom: 4px; + font-size: 14px; } + +.block-directory-downloadable-block-list-item { + width: 100%; + padding: 0; + margin: 0 0 12px; + display: flex; + flex-direction: row; + font-size: 13px; + color: #32373c; + align-items: flex-start; + justify-content: center; + background: transparent; + word-break: break-word; + border-radius: 4px; + border: 1px solid #e2e4e7; + transition: all 0.05s ease-in-out; + position: relative; + text-align: right; + overflow: hidden; } + @media (prefers-reduced-motion: reduce) { + .block-directory-downloadable-block-list-item { + transition-duration: 0s; } } + +.block-directory-downloadable-block-list-item__panel { + display: flex; + flex-grow: 1; + flex-direction: column; } + +.block-directory-downloadable-block-list-item__header { + display: flex; + flex-direction: column; + padding: 12px 12px 0; } + +.block-directory-downloadable-block-list-item__body { + display: flex; + flex-direction: column; + padding: 12px; } + +.block-directory-downloadable-block-list-item__footer { + display: flex; + flex-direction: column; + padding: 12px; + background-color: #f3f4f5; } + +.block-directory-downloadable-block-list-item__content { + color: #606a73; } + +.block-directory-downloadable-blocks-list { + list-style: none; + padding: 2px 0; + overflow: hidden; + display: flex; + flex-wrap: wrap; } + +.block-directory-downloadable-blocks-panel__description { + font-style: italic; + padding: 0; + margin-top: 0; + text-align: right; + color: #606a73; } + +.block-directory-downloadable-blocks-panel__description.has-no-results { + font-style: normal; + padding: 0; + margin-top: 100px; + text-align: center; + color: #606a73; } + .block-directory-downloadable-blocks-panel__description.has-no-results .components-spinner { + float: inherit; } + +.block-directory-block-ratings { + display: flex; } + .block-directory-block-ratings > div { + line-height: 1; + display: flex; } + .block-directory-block-ratings .dashicons { + font-size: ms(-2); + width: 1.1em; } + .block-directory-block-ratings .block-directory-block-ratings__rating-count { + color: #606a73; + font-size: ms(-2); } + .block-directory-block-ratings [class*="dashicons-star-"] { + color: #ffb900; } diff --git a/wp-includes/css/dist/block-directory/style-rtl.min.css b/wp-includes/css/dist/block-directory/style-rtl.min.css new file mode 100644 index 0000000..aa57e87 --- /dev/null +++ b/wp-includes/css/dist/block-directory/style-rtl.min.css @@ -0,0 +1 @@ +.block-directory-downloadable-block-header__row{display:flex;flex-grow:1}.block-directory-downloadable-block-header__row .block-editor-block-icon{width:36px;height:36px;font-size:36px;background-color:#edeff0}.block-directory-downloadable-block-header__row img{width:36px;height:36px}.block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column{display:flex;flex-direction:column;flex-grow:1}.block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column .block-directory-downloadable-block-header__title{font-weight:600;margin-right:12px}.block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column .block-directory-block-ratings{margin-right:12px}.block-directory-downloadable-block-info__content{font-size:13px}.block-directory-downloadable-block-info__row{display:flex;justify-content:space-between;color:#606a73;margin-top:8px;font-size:12px}.block-directory-downloadable-block-info__row .block-directory-downloadable-block-info__column{display:flex;align-items:center}.block-directory-downloadable-block-info__row .block-directory-downloadable-block-info__column .dashicon{font-size:16px;margin-left:4px}.block-directory-downloadable-block-author-info__content{color:#606a73;margin-bottom:4px}.block-directory-downloadable-block-author-info__content-author{margin-bottom:4px;font-size:14px}.block-directory-downloadable-block-list-item{width:100%;padding:0;margin:0 0 12px;display:flex;flex-direction:row;font-size:13px;color:#32373c;align-items:flex-start;justify-content:center;background:transparent;word-break:break-word;border-radius:4px;border:1px solid #e2e4e7;transition:all .05s ease-in-out;position:relative;text-align:right;overflow:hidden}@media (prefers-reduced-motion:reduce){.block-directory-downloadable-block-list-item{transition-duration:0s}}.block-directory-downloadable-block-list-item__panel{display:flex;flex-grow:1;flex-direction:column}.block-directory-downloadable-block-list-item__header{display:flex;flex-direction:column;padding:12px 12px 0}.block-directory-downloadable-block-list-item__body{display:flex;flex-direction:column;padding:12px}.block-directory-downloadable-block-list-item__footer{display:flex;flex-direction:column;padding:12px;background-color:#f3f4f5}.block-directory-downloadable-block-list-item__content{color:#606a73}.block-directory-downloadable-blocks-list{list-style:none;padding:2px 0;overflow:hidden;display:flex;flex-wrap:wrap}.block-directory-downloadable-blocks-panel__description{font-style:italic;padding:0;margin-top:0;text-align:right;color:#606a73}.block-directory-downloadable-blocks-panel__description.has-no-results{font-style:normal;padding:0;margin-top:100px;text-align:center;color:#606a73}.block-directory-downloadable-blocks-panel__description.has-no-results .components-spinner{float:inherit}.block-directory-block-ratings{display:flex}.block-directory-block-ratings>div{line-height:1;display:flex}.block-directory-block-ratings .dashicons{font-size:ms(-2);width:1.1em}.block-directory-block-ratings .block-directory-block-ratings__rating-count{color:#606a73;font-size:ms(-2)}.block-directory-block-ratings [class*=dashicons-star-]{color:#ffb900} \ No newline at end of file diff --git a/wp-includes/css/dist/block-directory/style.css b/wp-includes/css/dist/block-directory/style.css new file mode 100644 index 0000000..9a2d49e --- /dev/null +++ b/wp-includes/css/dist/block-directory/style.css @@ -0,0 +1,171 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.block-directory-downloadable-block-header__row { + display: flex; + flex-grow: 1; } + .block-directory-downloadable-block-header__row .block-editor-block-icon { + width: 36px; + height: 36px; + font-size: 36px; + background-color: #edeff0; } + .block-directory-downloadable-block-header__row img { + width: 36px; + height: 36px; } + .block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column { + display: flex; + flex-direction: column; + flex-grow: 1; } + .block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column .block-directory-downloadable-block-header__title { + font-weight: 600; + margin-left: 12px; } + .block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column .block-directory-block-ratings { + margin-left: 12px; } + +.block-directory-downloadable-block-info__content { + font-size: 13px; } + +.block-directory-downloadable-block-info__row { + display: flex; + justify-content: space-between; + color: #606a73; + margin-top: 8px; + font-size: 12px; } + .block-directory-downloadable-block-info__row .block-directory-downloadable-block-info__column { + display: flex; + align-items: center; } + .block-directory-downloadable-block-info__row .block-directory-downloadable-block-info__column .dashicon { + font-size: 16px; + margin-right: 4px; } + +.block-directory-downloadable-block-author-info__content { + color: #606a73; + margin-bottom: 4px; } + +.block-directory-downloadable-block-author-info__content-author { + margin-bottom: 4px; + font-size: 14px; } + +.block-directory-downloadable-block-list-item { + width: 100%; + padding: 0; + margin: 0 0 12px; + display: flex; + flex-direction: row; + font-size: 13px; + color: #32373c; + align-items: flex-start; + justify-content: center; + background: transparent; + word-break: break-word; + border-radius: 4px; + border: 1px solid #e2e4e7; + transition: all 0.05s ease-in-out; + position: relative; + text-align: left; + overflow: hidden; } + @media (prefers-reduced-motion: reduce) { + .block-directory-downloadable-block-list-item { + transition-duration: 0s; } } + +.block-directory-downloadable-block-list-item__panel { + display: flex; + flex-grow: 1; + flex-direction: column; } + +.block-directory-downloadable-block-list-item__header { + display: flex; + flex-direction: column; + padding: 12px 12px 0; } + +.block-directory-downloadable-block-list-item__body { + display: flex; + flex-direction: column; + padding: 12px; } + +.block-directory-downloadable-block-list-item__footer { + display: flex; + flex-direction: column; + padding: 12px; + background-color: #f3f4f5; } + +.block-directory-downloadable-block-list-item__content { + color: #606a73; } + +.block-directory-downloadable-blocks-list { + list-style: none; + padding: 2px 0; + overflow: hidden; + display: flex; + flex-wrap: wrap; } + +.block-directory-downloadable-blocks-panel__description { + font-style: italic; + padding: 0; + margin-top: 0; + text-align: left; + color: #606a73; } + +.block-directory-downloadable-blocks-panel__description.has-no-results { + font-style: normal; + padding: 0; + margin-top: 100px; + text-align: center; + color: #606a73; } + .block-directory-downloadable-blocks-panel__description.has-no-results .components-spinner { + float: inherit; } + +.block-directory-block-ratings { + display: flex; } + .block-directory-block-ratings > div { + line-height: 1; + display: flex; } + .block-directory-block-ratings .dashicons { + font-size: ms(-2); + width: 1.1em; } + .block-directory-block-ratings .block-directory-block-ratings__rating-count { + color: #606a73; + font-size: ms(-2); } + .block-directory-block-ratings [class*="dashicons-star-"] { + color: #ffb900; } diff --git a/wp-includes/css/dist/block-directory/style.min.css b/wp-includes/css/dist/block-directory/style.min.css new file mode 100644 index 0000000..14d3746 --- /dev/null +++ b/wp-includes/css/dist/block-directory/style.min.css @@ -0,0 +1 @@ +.block-directory-downloadable-block-header__row{display:flex;flex-grow:1}.block-directory-downloadable-block-header__row .block-editor-block-icon{width:36px;height:36px;font-size:36px;background-color:#edeff0}.block-directory-downloadable-block-header__row img{width:36px;height:36px}.block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column{display:flex;flex-direction:column;flex-grow:1}.block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column .block-directory-downloadable-block-header__title{font-weight:600;margin-left:12px}.block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column .block-directory-block-ratings{margin-left:12px}.block-directory-downloadable-block-info__content{font-size:13px}.block-directory-downloadable-block-info__row{display:flex;justify-content:space-between;color:#606a73;margin-top:8px;font-size:12px}.block-directory-downloadable-block-info__row .block-directory-downloadable-block-info__column{display:flex;align-items:center}.block-directory-downloadable-block-info__row .block-directory-downloadable-block-info__column .dashicon{font-size:16px;margin-right:4px}.block-directory-downloadable-block-author-info__content{color:#606a73;margin-bottom:4px}.block-directory-downloadable-block-author-info__content-author{margin-bottom:4px;font-size:14px}.block-directory-downloadable-block-list-item{width:100%;padding:0;margin:0 0 12px;display:flex;flex-direction:row;font-size:13px;color:#32373c;align-items:flex-start;justify-content:center;background:transparent;word-break:break-word;border-radius:4px;border:1px solid #e2e4e7;transition:all .05s ease-in-out;position:relative;text-align:left;overflow:hidden}@media (prefers-reduced-motion:reduce){.block-directory-downloadable-block-list-item{transition-duration:0s}}.block-directory-downloadable-block-list-item__panel{display:flex;flex-grow:1;flex-direction:column}.block-directory-downloadable-block-list-item__header{display:flex;flex-direction:column;padding:12px 12px 0}.block-directory-downloadable-block-list-item__body{display:flex;flex-direction:column;padding:12px}.block-directory-downloadable-block-list-item__footer{display:flex;flex-direction:column;padding:12px;background-color:#f3f4f5}.block-directory-downloadable-block-list-item__content{color:#606a73}.block-directory-downloadable-blocks-list{list-style:none;padding:2px 0;overflow:hidden;display:flex;flex-wrap:wrap}.block-directory-downloadable-blocks-panel__description{font-style:italic;padding:0;margin-top:0;text-align:left;color:#606a73}.block-directory-downloadable-blocks-panel__description.has-no-results{font-style:normal;padding:0;margin-top:100px;text-align:center;color:#606a73}.block-directory-downloadable-blocks-panel__description.has-no-results .components-spinner{float:inherit}.block-directory-block-ratings{display:flex}.block-directory-block-ratings>div{line-height:1;display:flex}.block-directory-block-ratings .dashicons{font-size:ms(-2);width:1.1em}.block-directory-block-ratings .block-directory-block-ratings__rating-count{color:#606a73;font-size:ms(-2)}.block-directory-block-ratings [class*=dashicons-star-]{color:#ffb900} \ No newline at end of file diff --git a/wp-includes/css/dist/block-editor/style-rtl.css b/wp-includes/css/dist/block-editor/style-rtl.css new file mode 100644 index 0000000..5d4f708 --- /dev/null +++ b/wp-includes/css/dist/block-editor/style-rtl.css @@ -0,0 +1,2350 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.block-editor-block-icon { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + margin: 0; + border-radius: 4px; } + .block-editor-block-icon.has-colors svg { + fill: currentColor; } + .block-editor-block-icon svg { + min-width: 20px; + min-height: 20px; + max-width: 24px; + max-height: 24px; } + +.block-editor-block-inspector .components-base-control { + margin-bottom: 24px; } + .block-editor-block-inspector .components-base-control:last-child { + margin-bottom: 8px; } + +.block-editor-block-inspector .components-panel__body { + border: none; + border-top: 1px solid #e2e4e7; } + +.block-editor-block-inspector .block-editor-block-card { + padding: 16px; } + +.block-editor-block-inspector__no-blocks { + display: block; + font-size: 13px; + background: #fff; + padding: 32px 16px; + text-align: center; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging::before { + border: none; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging > * { + background: #f8f9f9; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging > * > * { + visibility: hidden; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-selected .reusable-block-edit-panel * { + z-index: 1; } + +/** + * General Post Content Layout + */ +.block-editor-block-list__layout { + padding-right: 14px; + padding-left: 14px; + position: relative; } + @media (min-width: 600px) { + .block-editor-block-list__layout { + padding-right: 58px; + padding-left: 58px; } } + .block-editor-block-list__layout .block-editor-block-list__layout { + padding-right: 0; + padding-left: 0; } + +/** + * Notices & Block Selected/Hover Styles. + */ +.block-editor-block-list__layout .block-editor-block-list__block { + position: relative; + overflow-wrap: break-word; + /** + * Notices + */ + /** + * Block border layout + */ } + .block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui { + margin: -10px 0 12px 0; } + .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui { + margin: 0 0 12px 0; + width: 100%; } + .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice { + margin-right: 0; + margin-left: 0; } + .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content { + font-size: 13px; } + .block-editor-block-list__layout .block-editor-block-list__block::before { + z-index: 0; + content: ""; + position: absolute; + border: 1px solid transparent; + border-right: none; + box-shadow: none; + pointer-events: none; + transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; + outline: 1px solid transparent; + left: -14px; + right: -14px; + top: -14px; + bottom: -14px; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-list__layout .block-editor-block-list__block::before { + transition-duration: 0s; } } + .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + border-color: rgba(66, 88, 99, 0.4); + box-shadow: inset -3px 0 0 0 #555d66; } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + border-color: rgba(255, 255, 255, 0.45); + box-shadow: inset -3px 0 0 0 #d7dade; } + @media (min-width: 600px) { + .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + box-shadow: 3px 0 0 0 #555d66; } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + box-shadow: 3px 0 0 0 #d7dade; } } + .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + border-color: #007cba; + box-shadow: inset -3px 0 0 0 #007cba; } + @media (min-width: 600px) { + .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + box-shadow: 3px 0 0 0 #007cba; } } + .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected) { + opacity: 0.5; + transition: opacity 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected) { + transition-duration: 0s; } } + .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected):not(.is-focused) .block-editor-block-list__block, .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected).is-focused { + opacity: 1; } + .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #0085ba; } + body.admin-color-sunrise .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #d1864a; } + body.admin-color-ocean .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #a3b9a2; } + body.admin-color-midnight .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #e14d43; } + body.admin-color-ectoplasm .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #a7b656; } + body.admin-color-coffee .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #c2a68c; } + body.admin-color-blue .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #82b4cb; } + body.admin-color-light .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #0085ba; } + +/** + * Cross-Block Selection + */ +.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-block-collapsed), +.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .is-block-content { + box-shadow: 0 0 0 2px #007cba; + border-radius: 1px; + outline: 2px solid transparent; } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-block-collapsed), .is-dark-theme + .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .is-block-content { + box-shadow: 0 0 0 2px #fff; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .components-placeholder ::selection { + background: transparent; } + +/** + * Block styles and alignments + */ +.block-editor-block-list__layout .block-editor-block-list__block.has-warning { + min-height: 36px; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning > * { + pointer-events: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning { + pointer-events: all; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning::before { + border-color: rgba(145, 151, 162, 0.25); + border-right: 1px solid rgba(145, 151, 162, 0.25); } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.has-warning::before { + border-color: rgba(255, 255, 255, 0.35); } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected::before { + border-color: rgba(66, 88, 99, 0.4); + border-right-color: transparent; } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected::before { + border-color: rgba(255, 255, 255, 0.45); } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning::after { + content: ""; + position: absolute; + background-color: rgba(248, 249, 249, 0.4); + top: -14px; + bottom: -14px; + left: -14px; + right: -14px; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected::after { + background-color: transparent; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected::after { + bottom: 22px; } + @media (min-width: 600px) { + .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected::after { + bottom: -14px; } } + +.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.is-selected::before { + border-right-color: transparent; + border-style: dashed; + border-width: 1px; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-reusable > .block-editor-inner-blocks.has-overlay::after { + display: none; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-reusable > .block-editor-inner-blocks.has-overlay .block-editor-inner-blocks.has-overlay::after { + display: block; } + +.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block { + cursor: default; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="left"], .block-editor-block-list__layout .block-editor-block-list__block[data-align="right"] { + z-index: 21; + width: 100%; + height: 0; } + .block-editor-block-list__layout .block-editor-block-list__block[data-align="left"]::before, .block-editor-block-list__layout .block-editor-block-list__block[data-align="right"]::before { + content: none; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="left"] > .is-block-content { + float: left; + margin-right: 2em; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="right"] > .is-block-content { + float: right; + margin-left: 2em; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="full"], .block-editor-block-list__layout .block-editor-block-list__block[data-align="wide"] { + clear: both; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="full"] { + margin-right: -14px; + margin-left: -14px; } + @media (min-width: 600px) { + .block-editor-block-list__layout .block-editor-block-list__block[data-align="full"] { + margin-right: -58px; + margin-left: -58px; } } + .block-editor-block-list__layout .block-editor-block-list__block[data-align="full"]::before { + right: 0; + left: 0; + border-right-width: 0; + border-left-width: 0; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-clear="true"] { + float: none; } + +.block-editor-block-list__layout .block-editor-block-list__block .block-editor-block-list__layout .block-editor-default-block-appender .block-editor-inserter { + right: auto; + left: 8px; } + +/** + * In-Canvas Inserter + */ +.block-editor-block-list .block-editor-inserter { + margin: 8px; + cursor: move; + cursor: grab; } + +.block-editor-block-list__insertion-point { + position: relative; + z-index: 6; + margin-top: -14px; } + +.block-editor-block-list__insertion-point-indicator { + position: absolute; + top: calc(50% - 1px); + height: 2px; + right: 0; + left: 0; + background: #0085ba; } + +body.admin-color-sunrise .block-editor-block-list__insertion-point-indicator { + background: #d1864a; } + +body.admin-color-ocean .block-editor-block-list__insertion-point-indicator { + background: #a3b9a2; } + +body.admin-color-midnight .block-editor-block-list__insertion-point-indicator { + background: #e14d43; } + +body.admin-color-ectoplasm .block-editor-block-list__insertion-point-indicator { + background: #a7b656; } + +body.admin-color-coffee .block-editor-block-list__insertion-point-indicator { + background: #c2a68c; } + +body.admin-color-blue .block-editor-block-list__insertion-point-indicator { + background: #82b4cb; } + +body.admin-color-light .block-editor-block-list__insertion-point-indicator { + background: #0085ba; } + +.block-editor-block-list__insertion-point-inserter { + display: none; + justify-content: center; + cursor: text; } + @media (min-width: 480px) { + .block-editor-block-list__insertion-point-inserter { + display: flex; } } + .block-editor-block-list__insertion-point-inserter.is-inserter-hidden .block-editor-inserter__toggle { + opacity: 0; + pointer-events: none; } + +.block-editor-block-list__block-popover-inserter { + position: absolute; + top: -9999em; + margin-bottom: 14px; } + .block-editor-block-list__block-popover-inserter.is-visible { + position: static; } + +.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle, +.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle { + border-radius: 50%; + color: #007cba; + background: #fff; + height: 28px; + width: 28px; + padding: 0; + justify-content: center; } + .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled="true"]):hover, + .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled="true"]):hover { + box-shadow: none; } + +.block-editor-block-list__block > .block-editor-block-list__insertion-point { + position: absolute; + top: -16px; + height: 28px; + bottom: auto; + right: 14px; + left: 14px; } + +.block-editor-block-list__block[data-align="full"] > .block-editor-block-list__insertion-point { + right: 0; + left: 0; } + +.block-editor-block-list__block .block-editor-block-list__block-html-textarea { + display: block; + margin: 0; + width: 100%; + border: none; + outline: none; + box-shadow: none; + resize: none; + overflow: hidden; + font-family: Menlo, Consolas, monaco, monospace; + font-size: 14px; + line-height: 150%; + transition: padding 0.2s linear; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-list__block .block-editor-block-list__block-html-textarea { + transition-duration: 0s; } } + .block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus { + box-shadow: none; } + +/** + * Block Toolbar when contextual. + */ +.block-editor-block-contextual-toolbar .block-editor-block-toolbar { + width: 100%; } + @media (min-width: 600px) { + .block-editor-block-contextual-toolbar .block-editor-block-toolbar { + width: auto; + border-left: none; } } + +/** + * Block Label for Navigation/Selection Mode + */ +.block-editor-block-list__breadcrumb { + display: block; + line-height: 1; + z-index: 22; } + .block-editor-block-list__breadcrumb .components-toolbar { + display: flex; + background: #fff; + border: 1px solid #007cba; + border-right: none; + box-shadow: inset -3px 0 0 0 #007cba; + height: 38px; + font-size: 13px; + line-height: 29px; + padding-right: 8px; + padding-left: 8px; } + .block-editor-block-list__breadcrumb .components-toolbar .components-button { + box-shadow: none; } + .is-dark-theme .block-editor-block-list__breadcrumb .components-toolbar { + border-color: rgba(255, 255, 255, 0.45); } + @media (min-width: 600px) { + .block-editor-block-list__breadcrumb .components-toolbar { + box-shadow: 3px 0 0 0 #007cba; } } + +.block-editor-block-list__block .block-editor-warning { + z-index: 5; + position: relative; + margin-left: -14px; + margin-right: -14px; + margin-bottom: -14px; + transform: translateY(-14px); } + .block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning { + margin-bottom: auto; } + +.block-editor-block-list__insertion-point-popover { + z-index: 28; } + .block-editor-block-list__insertion-point-popover .components-popover__content { + background: none; + border: none; + box-shadow: none; + overflow-y: visible; } + +.components-popover.block-editor-block-list__block-popover { + z-index: 29; } + .components-popover.block-editor-block-list__block-popover .components-popover__content { + margin: 0 !important; + min-width: auto; + background: none; + border: none; + box-shadow: none; + overflow-y: visible; + pointer-events: none; } + .components-popover.block-editor-block-list__block-popover .components-popover__content > * { + pointer-events: all; } + .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar, + .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__breadcrumb { + margin-bottom: 13px; + margin-right: -14px; } + .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar[data-align="full"], + .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__breadcrumb[data-align="full"] { + margin-right: 0; } + .is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover { + opacity: 0; } + +.block-editor-block-list__block .block-list-appender { + margin: 14px 0; } + .has-background .block-editor-block-list__block .block-list-appender { + margin: 32px 14px; } + +.block-list-appender.is-drop-target > div::before { + content: ""; + position: absolute; + left: -14px; + right: -14px; + top: -14px; + bottom: -14px; + border: 3px solid #0085ba; } + +body.admin-color-sunrise .block-list-appender.is-drop-target > div::before { + border: 3px solid #d1864a; } + +body.admin-color-ocean .block-list-appender.is-drop-target > div::before { + border: 3px solid #a3b9a2; } + +body.admin-color-midnight .block-list-appender.is-drop-target > div::before { + border: 3px solid #e14d43; } + +body.admin-color-ectoplasm .block-list-appender.is-drop-target > div::before { + border: 3px solid #a7b656; } + +body.admin-color-coffee .block-list-appender.is-drop-target > div::before { + border: 3px solid #c2a68c; } + +body.admin-color-blue .block-list-appender.is-drop-target > div::before { + border: 3px solid #82b4cb; } + +body.admin-color-light .block-list-appender.is-drop-target > div::before { + border: 3px solid #0085ba; } + +.block-list-appender > .block-editor-inserter { + display: block; } + +.block-editor-block-breadcrumb { + list-style: none; + padding: 0; + margin: 0; } + .block-editor-block-breadcrumb li { + display: inline-block; + margin: 0; } + .block-editor-block-breadcrumb li:not(:last-child)::after { + content: "\2192"; } + +.block-editor-block-breadcrumb__button.components-button { + height: 24px; + line-height: 24px; + padding: 0; } + .block-editor-block-breadcrumb__button.components-button:hover { + text-decoration: underline; } + .block-editor-block-breadcrumb__button.components-button:focus { + color: #191e23; + outline-offset: -1px; + outline: 1px dotted #555d66; + outline-offset: -2px; + box-shadow: none; } + +.block-editor-block-breadcrumb__current { + cursor: default; } + +.block-editor-block-breadcrumb__button.components-button, +.block-editor-block-breadcrumb__current { + color: #555d66; + padding: 0 8px; + font-size: inherit; } + +.block-editor-block-card { + display: flex; + align-items: flex-start; } + +.block-editor-block-card__icon { + border: 1px solid #ccd0d4; + padding: 7px; + margin-left: 10px; + height: 36px; + width: 36px; } + +.block-editor-block-card__content { + flex-grow: 1; } + +.block-editor-block-card__title { + font-weight: 500; + margin-bottom: 5px; } + +.block-editor-block-card__description { + font-size: 13px; } + +.block-editor-block-card .block-editor-block-icon { + margin-right: -2px; + margin-left: 10px; + padding: 0 3px; + width: 36px; + height: 24px; } + +/** + * Invalid block comparison + */ +.block-editor-block-compare { + overflow: auto; + height: auto; } + @media (min-width: 600px) { + .block-editor-block-compare { + max-height: 70%; } } + +.block-editor-block-compare__wrapper { + display: flex; + padding-bottom: 16px; } + .block-editor-block-compare__wrapper > div { + display: flex; + justify-content: space-between; + flex-direction: column; + width: 50%; + padding: 0 0 0 16px; + min-width: 200px; } + .block-editor-block-compare__wrapper > div button { + float: left; } + .block-editor-block-compare__wrapper .block-editor-block-compare__converted { + border-right: 1px solid #ddd; + padding-right: 15px; + padding-left: 0; } + .block-editor-block-compare__wrapper .block-editor-block-compare__html { + font-family: Menlo, Consolas, monaco, monospace; + font-size: 12px; + color: #23282d; + border-bottom: 1px solid #ddd; + padding-bottom: 15px; + line-height: 1.7; } + .block-editor-block-compare__wrapper .block-editor-block-compare__html span { + background-color: #e6ffed; + padding-top: 3px; + padding-bottom: 3px; } + .block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added { + background-color: #acf2bd; } + .block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed { + background-color: #d94f4f; } + .block-editor-block-compare__wrapper .block-editor-block-compare__preview { + padding: 0; + padding-top: 14px; } + .block-editor-block-compare__wrapper .block-editor-block-compare__preview p { + font-size: 12px; + margin-top: 0; } + .block-editor-block-compare__wrapper .block-editor-block-compare__action { + margin-top: 14px; } + .block-editor-block-compare__wrapper .block-editor-block-compare__heading { + font-size: 1em; + font-weight: 400; + margin: 0.67em 0; } + +.block-editor-block-mobile-toolbar { + display: flex; + flex-direction: row; + border-left: 1px solid #e2e4e7; } + .block-editor-block-mobile-toolbar .block-editor-block-mover__control { + width: 36px; + height: 36px; + border-radius: 4px; + padding: 3px; + margin: 0; + justify-content: center; + align-items: center; } + .block-editor-block-mobile-toolbar .block-editor-block-mover__control .dashicon { + margin: auto; } + .block-editor-block-mobile-toolbar .block-editor-block-mover { + display: flex; + margin-left: auto; } + .block-editor-block-mobile-toolbar .block-editor-block-mover .block-editor-block-mover__control { + float: right; } + +@media (min-width: 600px) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) { + display: block; + position: absolute; + top: 37px; + right: -38px; + opacity: 0; + background: #fff; + border: 1px solid rgba(66, 88, 99, 0.4); + border-radius: 4px; + transition: box-shadow 0.2s ease-out; } } + @media (min-width: 600px) and (prefers-reduced-motion: reduce) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) { + transition-duration: 0s; } } + +@media (min-width: 600px) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal).is-visible { + animation: edit-post__fade-in-animation 0.2s ease-out 0s; + animation-fill-mode: forwards; } } + @media (min-width: 600px) and (prefers-reduced-motion: reduce) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal).is-visible { + animation-duration: 1ms; } } + +@media (min-width: 600px) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control { + display: flex; + align-items: center; + justify-content: center; + padding: 0; + border: none; + width: 28px; + height: 24px; + color: rgba(14, 28, 46, 0.62); } + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control svg { + width: 28px; + height: 24px; + padding: 2px 5px; } + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control[aria-disabled="true"] { + cursor: default; + pointer-events: none; + color: rgba(14, 28, 46, 0.62); } + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control:focus:not(:disabled) { + background-color: transparent; } } + +@media (min-width: 600px) { + .block-editor-block-list__block:not([data-align="wide"]):not([data-align="full"]) .block-editor-block-mover:not(.is-horizontal) { + margin-top: 0; } } + +.block-editor-block-mover__control-drag-handle { + cursor: move; + cursor: grab; + fill: currentColor; } + .block-editor-block-mover__control-drag-handle, .block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover, .block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):active, .block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):focus { + box-shadow: none; + background: none; + color: rgba(10, 24, 41, 0.7); } + .block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):active { + cursor: grabbing; } + +.block-editor-block-mover__description { + display: none; } + +.block-editor-block-mover.is-horizontal .block-editor-block-mover__control-drag-handle { + display: none; } + +.block-editor-block-navigation__container { + padding: 7px; } + +.block-editor-block-navigation__label { + margin: 0 0 8px; + color: #6c7781; } + +.block-editor-block-navigation__list, +.block-editor-block-navigation__paragraph { + padding: 0; + margin: 0; } + +.block-editor-block-navigation__list .block-editor-button-block-appender { + outline: none; + background: none; + padding: 8px; + margin-right: 0.8em; + width: 36px; + border-radius: 4px; } + .block-editor-block-navigation__list .block-editor-button-block-appender:hover:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; + outline: none; } + .block-editor-block-navigation__list .block-editor-button-block-appender:focus:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + +.block-editor-block-navigation__list .block-editor-block-navigation__list { + margin-top: 2px; + border-right: 2px solid #a2aab2; + margin-right: 1em; } + .block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__list { + margin-right: 1.5em; } + .block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item { + position: relative; } + .block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item::before { + position: absolute; + right: 0; + background: #a2aab2; + width: 0.5em; + height: 2px; + content: ""; + top: calc(50% - 1px); } + .block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item-button { + margin-right: 0.8em; + width: calc(100% - 0.8em); } + .block-editor-block-navigation__list .block-editor-block-navigation__list > li:last-child { + position: relative; } + .block-editor-block-navigation__list .block-editor-block-navigation__list > li:last-child::after { + position: absolute; + content: ""; + background: #fff; + top: 19px; + bottom: 0; + right: -2px; + width: 2px; } + +.block-editor-block-navigation__item-button { + display: flex; + align-items: center; + width: 100%; + padding: 6px; + text-align: right; + color: #40464d; + border-radius: 4px; } + .block-editor-block-navigation__item-button .block-editor-block-icon { + margin-left: 6px; } + .block-editor-block-navigation__item-button:hover:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; } + .block-editor-block-navigation__item-button:focus:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + .block-editor-block-navigation__item-button.is-selected, .block-editor-block-navigation__item-button.is-selected:focus { + color: #32373c; + background: #edeff0; } + +.components-popover.block-editor-block-navigation__popover { + z-index: 99998; } + +.block-editor-block-preview__container { + position: relative; + width: 100%; + overflow: hidden; } + .block-editor-block-preview__container.is-ready { + overflow: visible; } + +.block-editor-block-preview__content { + position: absolute; + top: 0; + right: 0; + transform-origin: top right; + text-align: initial; + margin: 0; + overflow: visible; + min-height: auto; } + .block-editor-block-preview__content .block-editor-block-list__layout, + .block-editor-block-preview__content .block-editor-block-list__block { + padding: 0; } + .block-editor-block-preview__content > div section { + height: auto; } + .block-editor-block-preview__content .block-editor-block-list__insertion-point, + .block-editor-block-preview__content .block-editor-block-drop-zone, + .block-editor-block-preview__content .reusable-block-indicator, + .block-editor-block-preview__content .block-list-appender { + display: none; } + +.block-editor-block-settings-menu .components-dropdown-menu__toggle svg { + transform: rotate(-90deg); } + +.block-editor-block-settings-menu__popover .components-dropdown-menu__menu { + padding: 0; } + +.block-editor-block-styles { + display: flex; + flex-wrap: wrap; + justify-content: space-between; } + +.block-editor-block-styles__item { + width: calc(50% - 4px); + margin: 4px 0; + flex-shrink: 0; + cursor: pointer; + overflow: hidden; + border-radius: 4px; + padding: 6px; + padding-top: calc(50% * 0.75 - 4px * 1.5); } + .block-editor-block-styles__item:focus { + color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2; + outline: 2px solid transparent; } + .block-editor-block-styles__item:hover { + background: #f3f4f5; + color: #191e23; } + .block-editor-block-styles__item.is-active { + color: #191e23; + box-shadow: inset 0 0 0 2px #555d66; + outline: 2px solid transparent; + outline-offset: -2px; } + .block-editor-block-styles__item.is-active:focus { + color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2, inset 0 0 0 2px #555d66; + outline: 4px solid transparent; + outline-offset: -4px; } + +.block-editor-block-styles__item-preview { + outline: 1px solid transparent; + padding: 0; + border: 1px solid rgba(25, 30, 35, 0.2); + border-radius: 4px; + display: flex; + overflow: hidden; + background: #fff; + padding-top: 75%; + margin-top: -75%; } + .block-editor-block-styles__item-preview .block-editor-block-preview__container { + padding-top: 0; + margin: 0; + margin-top: -75%; } + +.block-editor-block-styles__item-label { + text-align: center; + padding: 4px 2px; } + +.block-editor-block-switcher { + position: relative; + height: 36px; } + +.components-button.block-editor-block-switcher__toggle, +.components-button.block-editor-block-switcher__no-switcher-icon { + margin: 0; + display: block; + height: 36px; + padding: 3px; } + +.components-button.block-editor-block-switcher__no-switcher-icon { + width: 48px; } + .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon { + margin-left: auto; + margin-right: auto; } + +.components-button.block-editor-block-switcher__no-switcher-icon:disabled { + border-radius: 0; + opacity: 0.84; } + .components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors { + color: #555d66 !important; + background: #f3f4f5 !important; } + +.components-button.block-editor-block-switcher__toggle { + width: auto; } + .components-button.block-editor-block-switcher__toggle:active, .components-button.block-editor-block-switcher__toggle:not(:disabled):not([aria-disabled="true"]):hover, .components-button.block-editor-block-switcher__toggle:not([aria-disabled="true"]):focus { + outline: none; + box-shadow: none; + background: none; + border: none; } + .components-button.block-editor-block-switcher__toggle .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { + width: 42px; + height: 30px; + position: relative; + margin: 0 auto; + padding: 3px; + display: flex; + align-items: center; + transition: all 0.1s cubic-bezier(0.165, 0.84, 0.44, 1); } + @media (prefers-reduced-motion: reduce) { + .components-button.block-editor-block-switcher__toggle .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { + transition-duration: 0s; } } + .components-button.block-editor-block-switcher__toggle .block-editor-block-icon::after { + content: ""; + pointer-events: none; + display: block; + width: 0; + height: 0; + border-right: 3px solid transparent; + border-left: 3px solid transparent; + border-top: 5px solid; + margin-right: 4px; + margin-left: 2px; } + .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { + margin-top: 6px; + border-radius: 4px; } + .components-button.block-editor-block-switcher__toggle[aria-expanded="true"] .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle[aria-expanded="true"] .block-editor-block-switcher__transform, + .components-button.block-editor-block-switcher__toggle:not(:disabled):hover .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle:not(:disabled):hover .block-editor-block-switcher__transform, + .components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-switcher__transform { + transform: translateY(-36px); } + .components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-switcher__transform { + box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + +.components-popover.block-editor-block-switcher__popover .components-popover__content { + min-width: 300px; + max-width: calc(340px * 2); + display: flex; + background: #fff; + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1); } + +.block-editor-block-switcher__popover .components-popover__content .block-editor-block-switcher__container { + min-width: 300px; + max-width: 340px; + width: 50%; } + +@media (min-width: 782px) { + .block-editor-block-switcher__popover .components-popover__content { + position: relative; } + .block-editor-block-switcher__popover .components-popover__content .block-editor-block-switcher__preview { + border-right: 1px solid #e2e4e7; + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1); + background: #fff; + width: 300px; + height: auto; + position: -webkit-sticky; + position: sticky; + -ms-grid-row-align: stretch; + align-self: stretch; + top: 0; + padding: 10px; } } + +.block-editor-block-switcher__popover .components-popover__content .components-panel__body { + border: 0; + position: relative; + z-index: 1; } + +.block-editor-block-switcher__popover .components-popover__content .components-panel__body + .components-panel__body { + border-top: 1px solid #e2e4e7; } + +.block-editor-block-switcher__popover .block-editor-block-styles { + margin: 0 -3px; } + +.block-editor-block-switcher__popover .block-editor-block-types-list { + margin: 8px -8px -8px; } + +.block-editor-block-switcher__preview-title { + margin-bottom: 10px; + color: #6c7781; } + +.block-editor-block-toolbar { + display: flex; + flex-grow: 1; + width: 100%; + overflow: auto; + position: relative; + border-right: 1px solid #b5bcc2; + transition: border-color 0.1s linear, box-shadow 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-toolbar { + transition-duration: 0s; } } + @media (min-width: 600px) { + .block-editor-block-toolbar { + overflow: inherit; + border-right: none; + box-shadow: 3px 0 0 0 #555d66; } + .is-dark-theme .block-editor-block-toolbar { + box-shadow: 3px 0 0 0 #d7dade; } } + .block-editor-block-toolbar .components-toolbar { + border: 0; + border-top: 1px solid #b5bcc2; + border-bottom: 1px solid #b5bcc2; + border-left: 1px solid #b5bcc2; + line-height: 0; } + .has-fixed-toolbar .block-editor-block-toolbar { + box-shadow: none; + border-right: 1px solid #e2e4e7; } + .has-fixed-toolbar .block-editor-block-toolbar .components-toolbar { + border-color: #e2e4e7; } + +.block-editor-block-toolbar__slot { + display: inline-block; + line-height: 0; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .block-editor-block-toolbar__slot { + display: inline-flex; } } + +.block-editor-block-types-list { + list-style: none; + padding: 4px; + margin-right: -4px; + margin-left: -4px; + overflow: hidden; + display: flex; + flex-wrap: wrap; } + +.block-editor-block-variation-picker .components-placeholder__instructions { + margin-bottom: 0; } + +.block-editor-block-variation-picker .components-placeholder__fieldset { + flex-direction: column; } + +.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset { + max-width: 90%; } + +.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations { + display: flex; + justify-content: flex-start; + flex-direction: row; + flex-wrap: wrap; + width: 100%; + margin: 16px 0; + padding: 0; + list-style: none; } + .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations > li { + list-style: none; + margin: 4px 0 4px 8px; + flex-shrink: 1; + max-width: 100px; } + .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation { + padding: 8px; } + +.block-editor-block-variation-picker__variation { + width: 100%; } + .block-editor-block-variation-picker__variation.components-button.has-icon { + justify-content: center; } + .block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary { + background-color: #fff; } + .block-editor-block-variation-picker__variation.components-button { + height: auto; + padding: 0; } + .block-editor-block-variation-picker__variation::before { + content: ""; + padding-bottom: 100%; } + .block-editor-block-variation-picker__variation:first-child { + margin-right: 0; } + .block-editor-block-variation-picker__variation:last-child { + margin-left: 0; } + +.block-editor-button-block-appender { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 14px; + outline: 1px dashed #8d96a0; + width: 100%; + height: auto; + color: #555d66; + background: rgba(237, 239, 240, 0.8); } + .block-editor-button-block-appender:hover, .block-editor-button-block-appender:focus { + outline: 1px dashed #555d66; + color: #191e23; } + .block-editor-button-block-appender:active { + outline: 1px dashed #191e23; + color: #191e23; } + .is-dark-theme .block-editor-button-block-appender { + background: rgba(50, 55, 60, 0.7); + color: #f8f9f9; } + .is-dark-theme .block-editor-button-block-appender:hover, .is-dark-theme .block-editor-button-block-appender:focus { + outline: 1px dashed #fff; } + +.block-editor-color-gradient-control__color-indicator { + margin-bottom: 8px; } + +.block-editor-color-gradient-control__button-tabs { + display: block; + margin-bottom: 8px; } + +.block-editor-panel-color-gradient-settings .component-color-indicator { + vertical-align: text-bottom; } + +.block-editor-panel-color-gradient-settings__panel-title .component-color-indicator { + display: inline-block; } + +.block-editor-panel-color-gradient-settings.is-opened .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator { + display: none; } + +.block-editor-contrast-checker > .components-notice { + margin: 0; } + +.block-editor-default-block-appender { + clear: both; + margin-right: auto; + margin-left: auto; + position: relative; } + .block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover { + outline: 1px solid transparent; } + .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + font-family: "Noto Serif", serif; + font-size: 16px; + border: none; + background: none; + box-shadow: none; + display: block; + cursor: text; + width: 100%; + outline: 1px solid transparent; + transition: 0.2s outline; + resize: none; + margin-top: 28px; + margin-bottom: 28px; + padding: 0 14px 0 50px; + color: rgba(14, 28, 46, 0.62); } + @media (prefers-reduced-motion: reduce) { + .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + transition-duration: 0s; } } + .is-dark-theme .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + color: rgba(255, 255, 255, 0.65); } + .block-editor-default-block-appender .components-drop-zone__content-icon { + display: none; } + +.block-editor-default-block-appender__content { + min-height: 28px; + line-height: 1.8; } + +.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter, +.block-editor-default-block-appender .block-editor-inserter { + position: absolute; + top: 0; + height: 28px; } + .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .components-button.has-icon, + .block-editor-default-block-appender .block-editor-inserter .components-button.has-icon { + width: 28px; + height: 28px; + padding: 0; } + .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .components-button svg, + .block-editor-default-block-appender .block-editor-inserter .components-button svg { + display: block; + margin: auto; } + .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle, + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle { + margin-left: 0; } + .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover, + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + box-shadow: none; } + +.block-editor-block-list__empty-block-inserter, +.block-editor-default-block-appender .block-editor-inserter { + left: 8px; } + @media (min-width: 600px) { + .block-editor-block-list__empty-block-inserter, + .block-editor-default-block-appender .block-editor-inserter { + display: flex; + height: 100%; } } + .block-editor-block-list__empty-block-inserter:disabled, + .block-editor-default-block-appender .block-editor-inserter:disabled { + display: none; } + .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle, + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle { + border-radius: 50%; + width: 28px; + height: 28px; + padding: 0; } + .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover), + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover) { + color: rgba(10, 24, 41, 0.7); } + .is-dark-theme .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover), .is-dark-theme + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover) { + color: rgba(255, 255, 255, 0.75); } + +@media (min-width: 600px) { + .block-editor-default-block-appender .block-editor-inserter { + align-items: center; } } + +html.block-editor-editor-skeleton__html-container { + position: fixed; + width: 100%; } + @media (min-width: 782px) { + html.block-editor-editor-skeleton__html-container { + position: initial; + width: initial; } } + +.block-editor-editor-skeleton { + display: flex; + flex-direction: column; + height: auto; + max-height: 100%; + position: fixed; + top: 46px; + right: 0; + left: 0; + bottom: 0; } + @media (min-width: 782px) { + .block-editor-editor-skeleton { + top: 32px; } + .is-fullscreen-mode .block-editor-editor-skeleton { + top: 0; } } + +.block-editor-editor-skeleton { + /* Set left position when auto-fold is not on the body element. */ + right: 0; } + @media (min-width: 782px) { + .block-editor-editor-skeleton { + right: 160px; } } + +.auto-fold .block-editor-editor-skeleton { + /* Auto fold is when on smaller breakpoints, nav menu auto collapses. */ } + @media (min-width: 782px) { + .auto-fold .block-editor-editor-skeleton { + right: 36px; } } + @media (min-width: 961px) { + .auto-fold .block-editor-editor-skeleton { + right: 160px; } } + +/* Sidebar manually collapsed. */ +.folded .block-editor-editor-skeleton { + right: 0; } + @media (min-width: 782px) { + .folded .block-editor-editor-skeleton { + right: 36px; } } + +/* Mobile menu opened. */ +@media (max-width: 782px) { + .auto-fold .wp-responsive-open .block-editor-editor-skeleton { + right: 190px; } } + +/* In small screens with responsive menu expanded there is small white space. */ +@media (max-width: 600px) { + .auto-fold .wp-responsive-open .block-editor-editor-skeleton { + margin-right: -18px; } } + +body.is-fullscreen-mode .block-editor-editor-skeleton { + right: 0 !important; } + +.block-editor-editor-skeleton__body { + flex-grow: 1; + display: flex; + overflow: auto; + overscroll-behavior-y: none; } + +.block-editor-editor-skeleton__content { + flex-grow: 1; + display: flex; + flex-direction: column; } + @media (min-width: 782px) { + .block-editor-editor-skeleton__content { + overflow: auto; } } + +.block-editor-editor-skeleton__sidebar { + display: none; } + @media (min-width: 782px) { + .block-editor-editor-skeleton__sidebar { + display: block; + z-index: 100000; + position: fixed !important; + top: -9999em; + bottom: auto; + right: auto; + left: 0; + width: 280px; } + .block-editor-editor-skeleton__sidebar:focus { + top: auto; + bottom: 0; } } + +.is-sidebar-opened .block-editor-editor-skeleton__sidebar { + display: block; + width: auto; + flex-shrink: 0; + position: absolute; + z-index: 100000; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: #fff; } + @media (min-width: 782px) { + .is-sidebar-opened .block-editor-editor-skeleton__sidebar { + overflow: auto; + border-right: 1px solid #e2e4e7; + position: relative !important; + z-index: 90; } } + +.block-editor-editor-skeleton__header { + flex-shrink: 0; + height: auto; + border-bottom: 1px solid #e2e4e7; + z-index: 30; + position: -webkit-sticky; + position: sticky; + top: 0; } + @media (min-width: 600px) { + .block-editor-editor-skeleton__header { + position: initial; + top: 0; } } + +.block-editor-editor-skeleton__footer { + height: auto; + flex-shrink: 0; + overflow: auto; + border-top: 1px solid #e2e4e7; + display: none; } + @media (min-width: 782px) { + .block-editor-editor-skeleton__footer { + display: block; } } + +.block-editor-editor-skeleton__publish { + z-index: 100000; + position: fixed !important; + top: -9999em; + bottom: auto; + right: auto; + left: 0; + width: 280px; } + .block-editor-editor-skeleton__publish:focus { + top: auto; + bottom: 0; } + +.block-editor-link-control { + position: relative; + min-width: 360px; } + +.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type="text"] { + width: calc(100% - 32px); + display: block; + padding: 11px 16px; + margin: 16px; + padding-left: 36px; + position: relative; + border: 1px solid #e1e1e1; + border-radius: 4px; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type="text"] { + font-size: 13px; } } + .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type="text"]:focus { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + +.block-editor-link-control__search-actions { + position: absolute; + /* + * Actions must be positioned on top of URLInput, since the input will grow + * when suggestions are rendered. + * + * Compensate for: + * - Input margin ($grid-size-large) + * - Border (1px) + * - Vertically, for the difference in height between the input (40px) and + * the icon buttons. + * - Horizontally, pad to the minimum of: default input padding, or the + * equivalent of the vertical padding. + */ + top: 19px; + left: 19px; } + +.block-editor-link-control__search-results-wrapper { + position: relative; + margin-top: -15px; } + .block-editor-link-control__search-results-wrapper::before, .block-editor-link-control__search-results-wrapper::after { + content: ""; + position: absolute; + right: -1px; + left: 16px; + display: block; + pointer-events: none; + z-index: 100; } + .block-editor-link-control__search-results-wrapper::before { + height: 8px; + top: 0; + bottom: auto; + background: linear-gradient(to bottom, white 0%, rgba(255, 255, 255, 0) 100%); } + .block-editor-link-control__search-results-wrapper::after { + height: 16px; + bottom: 0; + top: auto; + background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, white 100%); } + +.block-editor-link-control__search-results-label { + padding: 15px 30px 0 30px; + display: block; + font-size: 1.1em; } + +.block-editor-link-control__search-results { + margin: 0; + padding: 8px 16px 16px; + max-height: 200px; + overflow-y: auto; } + .block-editor-link-control__search-results.is-loading { + opacity: 0.2; } + +.block-editor-link-control__search-item { + position: relative; + display: flex; + align-items: center; + font-size: 13px; + cursor: pointer; + background: #fff; + width: 100%; + border: none; + text-align: right; + padding: 10px 15px; + border-radius: 5px; + height: auto; } + .block-editor-link-control__search-item:hover, .block-editor-link-control__search-item:focus { + background-color: #e9e9e9; } + .block-editor-link-control__search-item.is-selected { + background: #f2f2f2; } + .block-editor-link-control__search-item.is-selected .block-editor-link-control__search-item-type { + background: #fff; } + .block-editor-link-control__search-item.is-current { + background: transparent; + border: 0; + width: 100%; + cursor: default; + padding: 16px; + padding-right: 24px; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-header { + display: block; + margin-left: 24px; + overflow: hidden; + white-space: nowrap; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-icon { + margin-left: 1em; + min-width: 24px; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-info, + .block-editor-link-control__search-item .block-editor-link-control__search-item-title { + max-width: 230px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-title { + display: block; + margin-bottom: 0.2em; + font-weight: 500; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-title mark { + font-weight: 700; + color: #000; + background-color: transparent; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-title span { + font-weight: normal; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-info { + display: block; + color: #999; + font-size: 0.9em; + line-height: 1.3; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-type { + display: block; + padding: 3px 8px; + margin-right: auto; + font-size: 0.9em; + background-color: #f3f4f5; + border-radius: 2px; } + +.block-editor-link-control__search-results div[role="menu"] > .block-editor-link-control__search-item.block-editor-link-control__search-item { + padding: 10px; } + +.block-editor-link-control__settings { + border-top: 1px solid #e1e1e1; + margin: 0; + padding: 16px 24px; } + .block-editor-link-control__settings :last-child { + margin-bottom: 0; } + +.block-editor-link-control__setting { + margin-bottom: 16px; } + .block-editor-link-control__setting :last-child { + margin-bottom: 0; } + +.block-editor-link-control .block-editor-link-control__search-input .components-spinner { + display: block; } + .block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner { + position: absolute; + right: auto; + bottom: auto; + /* + * Position spinner to the left of the actions. + * + * Compensate for: + * - Input margin ($grid-size-large) + * - Border (1px) + * - Vertically, for the difference in height between the input (40px) + * and the spinner. + * - Horizontally, adjust for the width occupied by the icon buttons, + * then artificially create spacing that mimics as if the spinner + * were center-padded to the same width as an icon button. + */ + top: 28px; + left: 62px; } + +.block-editor-link-control__search-item-action { + margin-right: auto; + flex-shrink: 0; } + +.block-editor-image-size-control { + margin-bottom: 1em; } + .block-editor-image-size-control .block-editor-image-size-control__row { + display: flex; + justify-content: space-between; } + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width, + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height { + margin-bottom: 0.5em; } + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width input, + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height input { + line-height: 1.25; } + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width { + margin-left: 5px; } + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height { + margin-right: 5px; } + +.block-editor-inner-blocks.has-overlay::after { + content: ""; + position: absolute; + top: -14px; + left: -14px; + bottom: -14px; + right: -14px; + z-index: 60; } + +[data-align="full"] .has-overlay::after { + left: 0; + right: 0; } + +.block-editor-inserter { + display: inline-block; + background: none; + border: none; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + line-height: 1.4; } + @media (min-width: 782px) { + .block-editor-inserter { + position: relative; } } + +@media (min-width: 782px) { + .block-editor-inserter__popover > .components-popover__content { + overflow-y: visible; + height: 432px; } } + +.block-editor-inserter__toggle { + transition: color 0.2s ease; } + @media (prefers-reduced-motion: reduce) { + .block-editor-inserter__toggle { + transition-duration: 0s; } } + +.block-editor-inserter__menu { + height: 100%; + display: flex; + width: auto; } + @media (min-width: 782px) { + .block-editor-inserter__menu { + width: 400px; + position: relative; } + .block-editor-inserter__menu.has-help-panel { + width: 700px; } } + +.block-editor-inserter__main-area { + width: auto; + display: flex; + flex-direction: column; + height: 100%; } + @media (min-width: 782px) { + .block-editor-inserter__main-area { + width: 400px; + position: relative; } } + +.block-editor-inserter__inline-elements { + margin-top: -1px; } + +.block-editor-inserter__menu.is-bottom::after { + border-bottom-color: #fff; } + +.components-popover.block-editor-inserter__popover { + z-index: 99998; } + +.components-popover input[type="search"].block-editor-inserter__search { + display: block; + margin: 16px; + padding: 11px 16px; + position: relative; + z-index: 1; + border-radius: 4px; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .components-popover input[type="search"].block-editor-inserter__search { + font-size: 13px; } } + .components-popover input[type="search"].block-editor-inserter__search:focus { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + +.block-editor-inserter__results { + flex-grow: 1; + overflow: auto; + position: relative; + z-index: 1; + padding: 0 16px 16px 16px; } + .block-editor-inserter__results:focus { + outline: 1px dotted #555d66; } + @media (min-width: 782px) { + .block-editor-inserter__results { + height: 394px; } } + .block-editor-inserter__results [role="presentation"] + .components-panel__body { + border-top: none; } + +.block-editor-inserter__popover .block-editor-block-types-list { + margin: 0 -8px; } + +.block-editor-inserter__reusable-blocks-panel { + position: relative; + text-align: left; } + +.block-editor-inserter__manage-reusable-blocks { + margin: 16px 16px 0 0; } + +.block-editor-inserter__no-results { + font-style: italic; + padding: 24px; + text-align: center; } + +.block-editor-inserter__child-blocks { + padding: 0 16px; } + +.block-editor-inserter__parent-block-header { + display: flex; + align-items: center; } + .block-editor-inserter__parent-block-header h2 { + font-size: 13px; } + .block-editor-inserter__parent-block-header .block-editor-block-icon { + margin-left: 8px; } + +.block-editor-inserter__menu-help-panel { + display: none; + border-right: 1px solid #e2e4e7; + width: 300px; + height: 100%; + padding: 20px; + overflow-y: auto; } + @media (min-width: 782px) { + .block-editor-inserter__menu-help-panel { + display: flex; + flex-direction: column; } } + .block-editor-inserter__menu-help-panel .block-editor-block-card { + padding-bottom: 20px; + margin-bottom: 20px; + border-bottom: 1px solid #e2e4e7; + animation: edit-post__fade-in-animation 0.2s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .block-editor-inserter__menu-help-panel .block-editor-block-card { + animation-duration: 1ms; } } + .block-editor-inserter__menu-help-panel .block-editor-inserter__preview { + display: flex; + flex-grow: 2; } + +.block-editor-inserter__menu-help-panel-no-block { + display: flex; + height: 100%; + flex-direction: column; + animation: edit-post__fade-in-animation 0.2s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .block-editor-inserter__menu-help-panel-no-block { + animation-duration: 1ms; } } + .block-editor-inserter__menu-help-panel-no-block .block-editor-inserter__menu-help-panel-no-block-text { + flex-grow: 1; } + .block-editor-inserter__menu-help-panel-no-block .block-editor-inserter__menu-help-panel-no-block-text h4 { + font-size: 18px; } + .block-editor-inserter__menu-help-panel-no-block .components-notice { + margin: 0; } + .block-editor-inserter__menu-help-panel-no-block h4 { + margin-top: 0; } + +.block-editor-inserter__menu-help-panel-hover-area { + flex-grow: 1; + margin-top: 20px; + padding: 20px; + border: 1px dotted #e2e4e7; + display: flex; + align-items: center; + text-align: center; } + +.block-editor-inserter__menu-help-panel-title { + font-size: 18px; + font-weight: 600; + margin-bottom: 20px; } + +.block-editor-inserter__preview-content { + border: 1px solid #e2e4e7; + border-radius: 4px; + min-height: 150px; + display: -ms-grid; + display: grid; + flex-grow: 2; } + .block-editor-inserter__preview-content .block-editor-block-preview__container { + margin-left: 0; + margin-right: 0; + padding: 10px; } + +.block-editor-inserter__preview-content-missing { + flex: 1; + display: flex; + justify-content: center; + color: #606a73; + border: 1px solid #e2e4e7; + border-radius: 4px; + align-items: center; } + +.block-editor-block-types-list__list-item { + display: block; + width: 33.33%; + padding: 0; + margin: 0 0 12px; } + +.components-button.block-editor-block-types-list__item { + display: flex; + flex-direction: column; + width: 100%; + font-size: 13px; + color: #32373c; + padding: 0 4px; + align-items: stretch; + justify-content: center; + cursor: pointer; + background: transparent; + word-break: break-word; + border-radius: 4px; + border: 1px solid transparent; + transition: all 0.05s ease-in-out; + position: relative; + height: auto; } + @media (prefers-reduced-motion: reduce) { + .components-button.block-editor-block-types-list__item { + transition-duration: 0s; } } + .components-button.block-editor-block-types-list__item:disabled { + opacity: 0.6; + cursor: default; } + .components-button.block-editor-block-types-list__item:not(:disabled):hover::before { + content: ""; + display: block; + background: #f3f4f5; + color: #191e23; + position: absolute; + z-index: -1; + border-radius: 4px; + top: 0; + left: 0; + bottom: 0; + right: 0; } + .components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-icon, + .components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title { + color: inherit; } + .components-button.block-editor-block-types-list__item:not(:disabled):active, .components-button.block-editor-block-types-list__item:not(:disabled):focus { + position: relative; + color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2; + outline: 2px solid transparent; + background: transparent; } + .components-button.block-editor-block-types-list__item:not(:disabled):active .block-editor-block-types-list__item-icon, + .components-button.block-editor-block-types-list__item:not(:disabled):active .block-editor-block-types-list__item-title, .components-button.block-editor-block-types-list__item:not(:disabled):focus .block-editor-block-types-list__item-icon, + .components-button.block-editor-block-types-list__item:not(:disabled):focus .block-editor-block-types-list__item-title { + color: inherit; } + .components-button.block-editor-block-types-list__item:not(:disabled).is-active { + color: #191e23; + box-shadow: inset 0 0 0 2px #555d66; + outline: 2px solid transparent; + outline-offset: -2px; } + .components-button.block-editor-block-types-list__item:not(:disabled).is-active:focus { + color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2, inset 0 0 0 2px #555d66; + outline: 4px solid transparent; + outline-offset: -4px; } + +.block-editor-block-types-list__item-icon { + padding: 12px 20px; + border-radius: 4px; + color: #555d66; + transition: all 0.05s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-types-list__item-icon { + transition-duration: 0s; } } + .block-editor-block-types-list__item-icon .block-editor-block-icon { + margin-right: auto; + margin-left: auto; } + .block-editor-block-types-list__item-icon svg { + transition: all 0.15s ease-out; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-types-list__item-icon svg { + transition-duration: 0s; } } + +.block-editor-block-types-list__item-title { + padding: 4px 2px 8px; } + +.modal-open .block-editor-media-replace-flow__options { + display: none; } + +.block-editor-media-replace-flow__indicator { + margin-right: 4px; } + .block-editor-media-replace-flow__indicator::after { + content: ""; + pointer-events: none; + display: block; + width: 0; + height: 0; + border-right: 3px solid transparent; + border-left: 3px solid transparent; + border-top: 5px solid; + margin-right: 4px; + margin-left: 2px; } + +.block-editor-media-flow__url-input { + padding: 0 15px; + max-width: 255px; + padding-bottom: 10px; } + .block-editor-media-flow__url-input input { + max-width: 180px; } + +.block-editor-media-replace-flow__link-viewer .components-external-link__icon { + display: none; } + +.block-editor-media-replace-flow__link-viewer .components-visually-hidden { + position: initial; } + +.block-editor-media-replace-flow__link-viewer .components-button { + flex-shrink: 0; } + +.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button { + margin-bottom: 0; } + +.block-editor-media-placeholder__url-input-form { + display: flex; } + .block-editor-media-placeholder__url-input-form input[type="url"].block-editor-media-placeholder__url-input-field { + width: 100%; + flex-grow: 1; + border: none; + border-radius: 0; + margin: 2px; } + @media (min-width: 600px) { + .block-editor-media-placeholder__url-input-form input[type="url"].block-editor-media-placeholder__url-input-field { + width: 300px; } } + +.block-editor-media-placeholder__url-input-submit-button { + flex-shrink: 1; } + +.block-editor-media-placeholder__button { + margin-bottom: 0.5rem; } + .block-editor-media-placeholder__button .dashicon { + vertical-align: middle; + margin-bottom: 3px; } + .block-editor-media-placeholder__button:hover { + color: #23282d; } + +.block-editor-media-placeholder__cancel-button.is-link { + margin: 1em; + display: block; } + +.block-editor-media-placeholder.is-appender { + min-height: 100px; + outline: 1px dashed #8d96a0; } + .block-editor-media-placeholder.is-appender:hover { + outline: 1px dashed #555d66; + cursor: pointer; } + .is-dark-theme .block-editor-media-placeholder.is-appender:hover { + outline: 1px dashed #fff; } + .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button { + margin-left: 4px; } + .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button.components-button:hover, .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button.components-button:focus { + box-shadow: none; + border: 1px solid #555d66; } + +.block-editor-multi-selection-inspector__card { + display: flex; + align-items: flex-start; + padding: 16px; } + +.block-editor-multi-selection-inspector__card-content { + flex-grow: 1; } + +.block-editor-multi-selection-inspector__card-title { + font-weight: 500; + margin-bottom: 5px; } + +.block-editor-multi-selection-inspector__card-description { + font-size: 13px; } + +.block-editor-multi-selection-inspector__card .block-editor-block-icon { + margin-right: -2px; + margin-left: 10px; + padding: 0 3px; + width: 36px; + height: 24px; } + +.block-editor .block-editor-plain-text { + box-shadow: none; + font-family: inherit; + font-size: inherit; + color: inherit; + line-height: inherit; + border: none; + padding: 0; + margin: 0; + width: 100%; } + +.block-editor-responsive-block-control { + margin-bottom: 28px; + border-bottom: 1px solid #d7dade; + padding-bottom: 14px; } + .block-editor-responsive-block-control:last-child { + padding-bottom: 0; + border-bottom: 0; } + +.block-editor-responsive-block-control__title { + margin: 0; + margin-bottom: 0.6em; + margin-right: -3px; } + +.block-editor-responsive-block-control__label { + font-weight: 600; + margin-bottom: 0.6em; + margin-right: -3px; } + +.block-editor-responsive-block-control__inner { + margin-right: -1px; } + +.block-editor-responsive-block-control__toggle { + margin-right: 1px; } + +.block-editor-responsive-block-control .components-base-control__help { + 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; + width: 1px; + word-wrap: normal !important; } + +.block-editor-format-toolbar .components-dropdown-menu__toggle .components-dropdown-menu__indicator::after { + margin: 7px; } + +.block-editor-rich-text__editable > p:first-child { + margin-top: 0; } + +.block-editor-rich-text__editable a { + color: #007fac; } + +.block-editor-rich-text__editable code { + padding: 2px; + border-radius: 2px; + color: #23282d; + background: #f3f4f5; + font-family: Menlo, Consolas, monaco, monospace; + font-size: inherit; } + +.block-editor-rich-text__editable [data-rich-text-placeholder] { + pointer-events: none; } + +.block-editor-rich-text__editable [data-rich-text-placeholder]::after { + content: attr(data-rich-text-placeholder); + opacity: 0.62; } + +.block-editor-rich-text__editable:focus { + outline: none; } + .block-editor-rich-text__editable:focus [data-rich-text-format-boundary] { + border-radius: 2px; } + .block-editor-rich-text__editable:focus:not(.keep-placeholder-on-focus) [data-rich-text-placeholder]::after { + display: none; } + +figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]::before { + opacity: 0.8; } + +.components-popover.block-editor-rich-text__inline-format-toolbar { + z-index: 99998; } + .components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content { + min-width: auto; + margin-bottom: 6px; } + .components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar { + border: none; } + +.block-editor-skip-to-selected-block { + position: absolute; + top: -9999em; } + .block-editor-skip-to-selected-block:focus { + height: auto; + width: auto; + display: block; + font-size: 14px; + font-weight: 600; + padding: 15px 23px 14px; + background: #f1f1f1; + color: #11a0d2; + line-height: normal; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + text-decoration: none; + outline: none; + z-index: 100000; } + body.admin-color-sunrise .block-editor-skip-to-selected-block:focus { + color: #c8b03c; } + body.admin-color-ocean .block-editor-skip-to-selected-block:focus { + color: #a89d8a; } + body.admin-color-midnight .block-editor-skip-to-selected-block:focus { + color: #77a6b9; } + body.admin-color-ectoplasm .block-editor-skip-to-selected-block:focus { + color: #c77430; } + body.admin-color-coffee .block-editor-skip-to-selected-block:focus { + color: #9fa47b; } + body.admin-color-blue .block-editor-skip-to-selected-block:focus { + color: #d9ab59; } + body.admin-color-light .block-editor-skip-to-selected-block:focus { + color: #c75726; } + +.block-editor-tool-selector__help { + padding: 16px; + border-top: 1px solid #e2e4e7; + color: #6c7781; } + +.block-editor-block-list__block .block-editor-url-input, +.components-popover .block-editor-url-input, +.block-editor-url-input { + flex-grow: 1; + position: relative; + padding: 1px; } + .block-editor-block-list__block .block-editor-url-input input[type="text"], + .components-popover .block-editor-url-input input[type="text"], + .block-editor-url-input input[type="text"] { + width: 100%; + padding: 8px; + border: none; + border-radius: 0; + margin-right: 0; + margin-left: 0; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .block-editor-block-list__block .block-editor-url-input input[type="text"], + .components-popover .block-editor-url-input input[type="text"], + .block-editor-url-input input[type="text"] { + width: 300px; } } + @media (min-width: 600px) { + .block-editor-block-list__block .block-editor-url-input input[type="text"], + .components-popover .block-editor-url-input input[type="text"], + .block-editor-url-input input[type="text"] { + font-size: 13px; } } + .block-editor-block-list__block .block-editor-url-input input[type="text"]::-ms-clear, + .components-popover .block-editor-url-input input[type="text"]::-ms-clear, + .block-editor-url-input input[type="text"]::-ms-clear { + display: none; } + .block-editor-block-list__block .block-editor-url-input.has-border input[type="text"], + .components-popover .block-editor-url-input.has-border input[type="text"], + .block-editor-url-input.has-border input[type="text"] { + border: 1px solid #555d66; + border-radius: 4px; } + .block-editor-block-list__block .block-editor-url-input.is-full-width, + .components-popover .block-editor-url-input.is-full-width, + .block-editor-url-input.is-full-width { + width: 100%; } + .block-editor-block-list__block .block-editor-url-input.is-full-width input[type="text"], + .components-popover .block-editor-url-input.is-full-width input[type="text"], + .block-editor-url-input.is-full-width input[type="text"] { + width: 100%; } + .block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions, + .components-popover .block-editor-url-input.is-full-width__suggestions, + .block-editor-url-input.is-full-width__suggestions { + width: 100%; } + .block-editor-block-list__block .block-editor-url-input .components-spinner, + .components-popover .block-editor-url-input .components-spinner, + .block-editor-url-input .components-spinner { + position: absolute; + left: 8px; + bottom: 17px; + margin: 0; } + +.block-editor-url-input__suggestions { + max-height: 200px; + transition: all 0.15s ease-in-out; + padding: 4px 0; + width: 302px; + overflow-y: auto; } + @media (prefers-reduced-motion: reduce) { + .block-editor-url-input__suggestions { + transition-duration: 0s; } } + +.block-editor-url-input__suggestions, +.block-editor-url-input .components-spinner { + display: none; } + @media (min-width: 600px) { + .block-editor-url-input__suggestions, + .block-editor-url-input .components-spinner { + display: inherit; } } + +.block-editor-url-input__suggestion { + padding: 4px 8px; + color: #6c7781; + display: block; + font-size: 13px; + cursor: pointer; + background: #fff; + width: 100%; + border: none; + text-align: right; + border: none; + box-shadow: none; } + .block-editor-url-input__suggestion:hover { + background: #e2e4e7; } + .block-editor-url-input__suggestion:focus, .block-editor-url-input__suggestion.is-selected { + background: rgb(0, 113, 158); + color: #fff; + outline: none; } + body.admin-color-sunrise .block-editor-url-input__suggestion:focus, body.admin-color-sunrise .block-editor-url-input__suggestion.is-selected { + background: rgb(178, 114, 63); } + body.admin-color-ocean .block-editor-url-input__suggestion:focus, body.admin-color-ocean .block-editor-url-input__suggestion.is-selected { + background: rgb(139, 157, 138); } + body.admin-color-midnight .block-editor-url-input__suggestion:focus, body.admin-color-midnight .block-editor-url-input__suggestion.is-selected { + background: rgb(191, 65, 57); } + body.admin-color-ectoplasm .block-editor-url-input__suggestion:focus, body.admin-color-ectoplasm .block-editor-url-input__suggestion.is-selected { + background: rgb(142, 155, 73); } + body.admin-color-coffee .block-editor-url-input__suggestion:focus, body.admin-color-coffee .block-editor-url-input__suggestion.is-selected { + background: rgb(165, 141, 119); } + body.admin-color-blue .block-editor-url-input__suggestion:focus, body.admin-color-blue .block-editor-url-input__suggestion.is-selected { + background: rgb(111, 153, 173); } + body.admin-color-light .block-editor-url-input__suggestion:focus, body.admin-color-light .block-editor-url-input__suggestion.is-selected { + background: rgb(0, 113, 158); } + +.components-toolbar > .block-editor-url-input__button { + position: inherit; } + +.block-editor-url-input__button .block-editor-url-input__back { + margin-left: 4px; + overflow: visible; } + .block-editor-url-input__button .block-editor-url-input__back::after { + content: ""; + position: absolute; + display: block; + width: 1px; + height: 24px; + left: -1px; + background: #e2e4e7; } + +.block-editor-url-input__button-modal { + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1); + border: 1px solid #e2e4e7; + background: #fff; } + +.block-editor-url-input__button-modal-line { + display: flex; + flex-direction: row; + flex-grow: 1; + flex-shrink: 1; + min-width: 0; + align-items: flex-start; } + .block-editor-url-input__button-modal-line .components-button { + flex-shrink: 0; + width: 36px; + height: 36px; } + +.block-editor-url-popover__additional-controls { + border-top: 1px solid #e2e4e7; } + +.block-editor-url-popover__additional-controls > div[role="menu"] .components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary) > svg { + box-shadow: none; } + +.block-editor-url-popover__additional-controls div[role="menu"] > .components-button { + padding-right: 2px; } + +.block-editor-url-popover__row { + display: flex; } + +.block-editor-url-popover__row > :not(.block-editor-url-popover__settings-toggle) { + flex-grow: 1; } + +.block-editor-url-popover .components-button.has-icon { + padding: 3px; } + .block-editor-url-popover .components-button.has-icon > svg { + padding: 5px; + border-radius: 4px; + height: 30px; + width: 30px; } + .block-editor-url-popover .components-button.has-icon:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + box-shadow: none; } + .block-editor-url-popover .components-button.has-icon:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover > svg { + color: #555d66; + box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; } + .block-editor-url-popover .components-button.has-icon:not(:disabled):focus { + box-shadow: none; } + .block-editor-url-popover .components-button.has-icon:not(:disabled):focus > svg { + box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + +.block-editor-url-popover__settings-toggle { + flex-shrink: 0; + border-radius: 0; + border-right: 1px solid #e2e4e7; + margin-right: 1px; } + .block-editor-url-popover__settings-toggle[aria-expanded="true"] .dashicon { + transform: rotate(-180deg); } + +.block-editor-url-popover__input-container .components-base-control:last-child, +.block-editor-url-popover__input-container .components-base-control:last-child .components-base-control__field { + margin-bottom: 0; } + +.block-editor-url-popover__settings { + display: block; + padding: 16px; + border-top: 1px solid #e2e4e7; } + +.block-editor-url-popover__link-editor, +.block-editor-url-popover__link-viewer { + display: flex; } + .block-editor-url-popover__link-editor .block-editor-url-input .components-base-control__field, + .block-editor-url-popover__link-viewer .block-editor-url-input .components-base-control__field { + margin-bottom: 0; } + .block-editor-url-popover__link-editor .block-editor-url-input .components-spinner, + .block-editor-url-popover__link-viewer .block-editor-url-input .components-spinner { + bottom: 9px; } + +.block-editor-url-popover__link-viewer-url { + margin: 7px; + flex-grow: 1; + flex-shrink: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 150px; + max-width: 500px; } + .block-editor-url-popover__link-viewer-url.has-invalid-link { + color: #d94f4f; } + +.block-editor-warning { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: nowrap; + background-color: #fff; + border: 1px solid #e2e4e7; + text-align: right; + padding: 10px 14px 14px; } + .is-selected .block-editor-warning { + border-color: rgba(66, 88, 99, 0.4); } + @media (min-width: 600px) { + .is-selected .block-editor-warning { + border-right-color: transparent; } } + .is-dark-theme .is-selected .block-editor-warning { + border-color: rgba(255, 255, 255, 0.45); } + .block-editor-warning .block-editor-warning__message { + line-height: 1.4; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + margin: 1em 0; } + .block-editor-warning p.block-editor-warning__message.block-editor-warning__message { + min-height: auto; } + .block-editor-warning .block-editor-warning__contents { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + align-items: baseline; + width: 100%; } + .block-editor-warning .block-editor-warning__actions { + display: flex; } + .block-editor-warning .block-editor-warning__action { + margin: 0 0 0 6px; } + +.block-editor-warning__secondary { + margin: 5px -4px 0 0; + height: 36px; } + .block-editor-warning__secondary .components-button.has-icon { + width: auto; + padding: 0 2px; } + @media (min-width: 600px) { + .block-editor-warning__secondary { + margin-right: 4px; } + .block-editor-warning__secondary .components-button.has-icon { + padding: 0 4px; } } + .block-editor-warning__secondary .components-button svg { + transform: rotate(-90deg); } + +.block-editor-writing-flow { + display: flex; + flex-direction: column; } + +.block-editor-writing-flow__click-redirect { + cursor: text; } + +.html-anchor-control .components-external-link { + display: block; + margin-top: 8px; } diff --git a/wp-includes/css/dist/block-editor/style-rtl.min.css b/wp-includes/css/dist/block-editor/style-rtl.min.css new file mode 100644 index 0000000..f7df0b3 --- /dev/null +++ b/wp-includes/css/dist/block-editor/style-rtl.min.css @@ -0,0 +1 @@ +.block-editor-block-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px;margin:0;border-radius:4px}.block-editor-block-icon.has-colors svg{fill:currentColor}.block-editor-block-icon svg{min-width:20px;min-height:20px;max-width:24px;max-height:24px}.block-editor-block-inspector .components-base-control{margin-bottom:24px}.block-editor-block-inspector .components-base-control:last-child{margin-bottom:8px}.block-editor-block-inspector .components-panel__body{border:none;border-top:1px solid #e2e4e7}.block-editor-block-inspector .block-editor-block-card{padding:16px}.block-editor-block-inspector__no-blocks{display:block;font-size:13px;background:#fff;padding:32px 16px;text-align:center}.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging:before{border:none}.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging>*{background:#f8f9f9}.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging>*>*{visibility:hidden}.block-editor-block-list__layout .block-editor-block-list__block.is-selected .reusable-block-edit-panel *{z-index:1}.block-editor-block-list__layout{padding-right:14px;padding-left:14px;position:relative}@media (min-width:600px){.block-editor-block-list__layout{padding-right:58px;padding-left:58px}}.block-editor-block-list__layout .block-editor-block-list__layout{padding-right:0;padding-left:0}.block-editor-block-list__layout .block-editor-block-list__block{position:relative;overflow-wrap:break-word}.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{margin:-10px 0 12px}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{margin:0 0 12px;width:100%}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice{margin-right:0;margin-left:0}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{font-size:13px}.block-editor-block-list__layout .block-editor-block-list__block:before{z-index:0;content:"";position:absolute;border:1px solid transparent;border-right:none;box-shadow:none;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;outline:1px solid transparent;left:-14px;right:-14px;top:-14px;bottom:-14px}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block:before{transition-duration:0s}}.block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{border-color:rgba(66,88,99,.4);box-shadow:inset -3px 0 0 0 #555d66}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{border-color:hsla(0,0%,100%,.45);box-shadow:inset -3px 0 0 0 #d7dade}@media (min-width:600px){.block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{box-shadow:3px 0 0 0 #555d66}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{box-shadow:3px 0 0 0 #d7dade}}.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{border-color:#007cba;box-shadow:inset -3px 0 0 0 #007cba}@media (min-width:600px){.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{box-shadow:3px 0 0 0 #007cba}}.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected){opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected){transition-duration:0s}}.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected).is-focused,.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected):not(.is-focused) .block-editor-block-list__block{opacity:1}.block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #0085ba}body.admin-color-sunrise .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #d1864a}body.admin-color-ocean .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #a3b9a2}body.admin-color-midnight .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #e14d43}body.admin-color-ectoplasm .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #a7b656}body.admin-color-coffee .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #c2a68c}body.admin-color-blue .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #82b4cb}body.admin-color-light .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #0085ba}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .is-block-content,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-block-collapsed){box-shadow:0 0 0 2px #007cba;border-radius:1px;outline:2px solid transparent}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .is-block-content,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-block-collapsed){box-shadow:0 0 0 2px #fff}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .components-placeholder ::selection{background:transparent}.block-editor-block-list__layout .block-editor-block-list__block.has-warning{min-height:36px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{pointer-events:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{pointer-events:all}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:before{border-color:rgba(145,151,162,.25);border-right:1px solid rgba(145,151,162,.25)}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.has-warning:before{border-color:hsla(0,0%,100%,.35)}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected:before{border-color:rgba(66,88,99,.4) transparent rgba(66,88,99,.4) rgba(66,88,99,.4)}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected:before{border-color:hsla(0,0%,100%,.45)}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{content:"";position:absolute;background-color:rgba(248,249,249,.4);top:-14px;bottom:-14px;left:-14px;right:-14px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{background-color:transparent}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected:after{bottom:22px}@media (min-width:600px){.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected:after{bottom:-14px}}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.is-selected:before{border-right:transparent;border-width:1px;border-style:dashed}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks.has-overlay:after{display:none}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks.has-overlay .block-editor-inner-blocks.has-overlay:after{display:block}.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block{cursor:default}.block-editor-block-list__layout .block-editor-block-list__block[data-align=left],.block-editor-block-list__layout .block-editor-block-list__block[data-align=right]{z-index:21;width:100%;height:0}.block-editor-block-list__layout .block-editor-block-list__block[data-align=left]:before,.block-editor-block-list__layout .block-editor-block-list__block[data-align=right]:before{content:none}.block-editor-block-list__layout .block-editor-block-list__block[data-align=left]>.is-block-content{float:left;margin-right:2em}.block-editor-block-list__layout .block-editor-block-list__block[data-align=right]>.is-block-content{float:right;margin-left:2em}.block-editor-block-list__layout .block-editor-block-list__block[data-align=full],.block-editor-block-list__layout .block-editor-block-list__block[data-align=wide]{clear:both}.block-editor-block-list__layout .block-editor-block-list__block[data-align=full]{margin-right:-14px;margin-left:-14px}@media (min-width:600px){.block-editor-block-list__layout .block-editor-block-list__block[data-align=full]{margin-right:-58px;margin-left:-58px}}.block-editor-block-list__layout .block-editor-block-list__block[data-align=full]:before{right:0;left:0;border-right-width:0;border-left-width:0}.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{float:none}.block-editor-block-list__layout .block-editor-block-list__block .block-editor-block-list__layout .block-editor-default-block-appender .block-editor-inserter{right:auto;left:8px}.block-editor-block-list .block-editor-inserter{margin:8px;cursor:move;cursor:grab}.block-editor-block-list__insertion-point{position:relative;z-index:6;margin-top:-14px}.block-editor-block-list__insertion-point-indicator{position:absolute;top:calc(50% - 1px);height:2px;right:0;left:0;background:#0085ba}body.admin-color-sunrise .block-editor-block-list__insertion-point-indicator{background:#d1864a}body.admin-color-ocean .block-editor-block-list__insertion-point-indicator{background:#a3b9a2}body.admin-color-midnight .block-editor-block-list__insertion-point-indicator{background:#e14d43}body.admin-color-ectoplasm .block-editor-block-list__insertion-point-indicator{background:#a7b656}body.admin-color-coffee .block-editor-block-list__insertion-point-indicator{background:#c2a68c}body.admin-color-blue .block-editor-block-list__insertion-point-indicator{background:#82b4cb}body.admin-color-light .block-editor-block-list__insertion-point-indicator{background:#0085ba}.block-editor-block-list__insertion-point-inserter{display:none;justify-content:center;cursor:text}@media (min-width:480px){.block-editor-block-list__insertion-point-inserter{display:flex}}.block-editor-block-list__insertion-point-inserter.is-inserter-hidden .block-editor-inserter__toggle{opacity:0;pointer-events:none}.block-editor-block-list__block-popover-inserter{position:absolute;top:-9999em;margin-bottom:14px}.block-editor-block-list__block-popover-inserter.is-visible{position:static}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle{border-radius:50%;color:#007cba;background:#fff;height:28px;width:28px;padding:0;justify-content:center}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled=true]):hover,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled=true]):hover{box-shadow:none}.block-editor-block-list__block>.block-editor-block-list__insertion-point{position:absolute;top:-16px;height:28px;bottom:auto;right:14px;left:14px}.block-editor-block-list__block[data-align=full]>.block-editor-block-list__insertion-point{right:0;left:0}.block-editor-block-list__block .block-editor-block-list__block-html-textarea{display:block;margin:0;width:100%;border:none;outline:none;box-shadow:none;resize:none;overflow:hidden;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;line-height:150%;transition:padding .2s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-editor-block-list__block-html-textarea{transition-duration:0s}}.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{box-shadow:none}.block-editor-block-contextual-toolbar .block-editor-block-toolbar{width:100%}@media (min-width:600px){.block-editor-block-contextual-toolbar .block-editor-block-toolbar{width:auto;border-left:none}}.block-editor-block-list__breadcrumb{display:block;line-height:1;z-index:22}.block-editor-block-list__breadcrumb .components-toolbar{display:flex;background:#fff;border:1px solid #007cba;border-right:none;box-shadow:inset -3px 0 0 0 #007cba;height:38px;font-size:13px;line-height:29px;padding-right:8px;padding-left:8px}.block-editor-block-list__breadcrumb .components-toolbar .components-button{box-shadow:none}.is-dark-theme .block-editor-block-list__breadcrumb .components-toolbar{border-color:hsla(0,0%,100%,.45)}@media (min-width:600px){.block-editor-block-list__breadcrumb .components-toolbar{box-shadow:3px 0 0 0 #007cba}}.block-editor-block-list__block .block-editor-warning{z-index:5;position:relative;margin-left:-14px;margin-right:-14px;margin-bottom:-14px;transform:translateY(-14px)}.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{margin-bottom:auto}.block-editor-block-list__insertion-point-popover{z-index:28}.block-editor-block-list__insertion-point-popover .components-popover__content{background:none;border:none;box-shadow:none;overflow-y:visible}.components-popover.block-editor-block-list__block-popover{z-index:29}.components-popover.block-editor-block-list__block-popover .components-popover__content{margin:0!important;min-width:auto;background:none;border:none;box-shadow:none;overflow-y:visible;pointer-events:none}.components-popover.block-editor-block-list__block-popover .components-popover__content>*{pointer-events:all}.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar,.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__breadcrumb{margin-bottom:13px;margin-right:-14px}.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar[data-align=full],.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__breadcrumb[data-align=full]{margin-right:0}.is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover{opacity:0}.block-editor-block-list__block .block-list-appender{margin:14px 0}.has-background .block-editor-block-list__block .block-list-appender{margin:32px 14px}.block-list-appender.is-drop-target>div:before{content:"";position:absolute;left:-14px;right:-14px;top:-14px;bottom:-14px;border:3px solid #0085ba}body.admin-color-sunrise .block-list-appender.is-drop-target>div:before{border:3px solid #d1864a}body.admin-color-ocean .block-list-appender.is-drop-target>div:before{border:3px solid #a3b9a2}body.admin-color-midnight .block-list-appender.is-drop-target>div:before{border:3px solid #e14d43}body.admin-color-ectoplasm .block-list-appender.is-drop-target>div:before{border:3px solid #a7b656}body.admin-color-coffee .block-list-appender.is-drop-target>div:before{border:3px solid #c2a68c}body.admin-color-blue .block-list-appender.is-drop-target>div:before{border:3px solid #82b4cb}body.admin-color-light .block-list-appender.is-drop-target>div:before{border:3px solid #0085ba}.block-list-appender>.block-editor-inserter{display:block}.block-editor-block-breadcrumb{list-style:none;padding:0;margin:0}.block-editor-block-breadcrumb li{display:inline-block;margin:0}.block-editor-block-breadcrumb li:not(:last-child):after{content:"\2192"}.block-editor-block-breadcrumb__button.components-button{height:24px;line-height:24px;padding:0}.block-editor-block-breadcrumb__button.components-button:hover{text-decoration:underline}.block-editor-block-breadcrumb__button.components-button:focus{color:#191e23;outline-offset:-1px;outline:1px dotted #555d66;outline-offset:-2px;box-shadow:none}.block-editor-block-breadcrumb__current{cursor:default}.block-editor-block-breadcrumb__button.components-button,.block-editor-block-breadcrumb__current{color:#555d66;padding:0 8px;font-size:inherit}.block-editor-block-card{display:flex;align-items:flex-start}.block-editor-block-card__icon{border:1px solid #ccd0d4;padding:7px;margin-left:10px;height:36px;width:36px}.block-editor-block-card__content{flex-grow:1}.block-editor-block-card__title{font-weight:500;margin-bottom:5px}.block-editor-block-card__description{font-size:13px}.block-editor-block-card .block-editor-block-icon{margin-right:-2px;margin-left:10px;padding:0 3px;width:36px;height:24px}.block-editor-block-compare{overflow:auto;height:auto}@media (min-width:600px){.block-editor-block-compare{max-height:70%}}.block-editor-block-compare__wrapper{display:flex;padding-bottom:16px}.block-editor-block-compare__wrapper>div{display:flex;justify-content:space-between;flex-direction:column;width:50%;padding:0 0 0 16px;min-width:200px}.block-editor-block-compare__wrapper>div button{float:left}.block-editor-block-compare__wrapper .block-editor-block-compare__converted{border-right:1px solid #ddd;padding-right:15px;padding-left:0}.block-editor-block-compare__wrapper .block-editor-block-compare__html{font-family:Menlo,Consolas,monaco,monospace;font-size:12px;color:#23282d;border-bottom:1px solid #ddd;padding-bottom:15px;line-height:1.7}.block-editor-block-compare__wrapper .block-editor-block-compare__html span{background-color:#e6ffed;padding-top:3px;padding-bottom:3px}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added{background-color:#acf2bd}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed{background-color:#d94f4f}.block-editor-block-compare__wrapper .block-editor-block-compare__preview{padding:14px 0 0}.block-editor-block-compare__wrapper .block-editor-block-compare__preview p{font-size:12px;margin-top:0}.block-editor-block-compare__wrapper .block-editor-block-compare__action{margin-top:14px}.block-editor-block-compare__wrapper .block-editor-block-compare__heading{font-size:1em;font-weight:400;margin:.67em 0}.block-editor-block-mobile-toolbar{display:flex;flex-direction:row;border-left:1px solid #e2e4e7}.block-editor-block-mobile-toolbar .block-editor-block-mover__control{width:36px;height:36px;border-radius:4px;padding:3px;margin:0;justify-content:center;align-items:center}.block-editor-block-mobile-toolbar .block-editor-block-mover__control .dashicon{margin:auto}.block-editor-block-mobile-toolbar .block-editor-block-mover{display:flex;margin-left:auto}.block-editor-block-mobile-toolbar .block-editor-block-mover .block-editor-block-mover__control{float:right}@media (min-width:600px){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal){display:block;position:absolute;top:37px;right:-38px;opacity:0;background:#fff;border:1px solid rgba(66,88,99,.4);border-radius:4px;transition:box-shadow .2s ease-out}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal){transition-duration:0s}}@media (min-width:600px){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal).is-visible{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal).is-visible{animation-duration:1ms}}@media (min-width:600px){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control{display:flex;align-items:center;justify-content:center;padding:0;border:none;width:28px;height:24px;color:rgba(14,28,46,.62)}.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control svg{width:28px;height:24px;padding:2px 5px}.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control[aria-disabled=true]{cursor:default;pointer-events:none;color:rgba(14,28,46,.62)}.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control:focus:not(:disabled){background-color:transparent}}@media (min-width:600px){.block-editor-block-list__block:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal){margin-top:0}}.block-editor-block-mover__control-drag-handle{cursor:move;cursor:grab;fill:currentColor}.block-editor-block-mover__control-drag-handle,.block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus,.block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none;background:none;color:rgba(10,24,41,.7)}.block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active{cursor:grabbing}.block-editor-block-mover.is-horizontal .block-editor-block-mover__control-drag-handle,.block-editor-block-mover__description{display:none}.block-editor-block-navigation__container{padding:7px}.block-editor-block-navigation__label{margin:0 0 8px;color:#6c7781}.block-editor-block-navigation__list,.block-editor-block-navigation__paragraph{padding:0;margin:0}.block-editor-block-navigation__list .block-editor-button-block-appender{outline:none;background:none;padding:8px;margin-right:.8em;width:36px;border-radius:4px}.block-editor-block-navigation__list .block-editor-button-block-appender:hover:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;background:#f3f4f5;outline:none}.block-editor-block-navigation__list .block-editor-button-block-appender:focus:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.block-editor-block-navigation__list .block-editor-block-navigation__list{margin-top:2px;border-right:2px solid #a2aab2;margin-right:1em}.block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__list{margin-right:1.5em}.block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item{position:relative}.block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item:before{position:absolute;right:0;background:#a2aab2;width:.5em;height:2px;content:"";top:calc(50% - 1px)}.block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item-button{margin-right:.8em;width:calc(100% - .8em)}.block-editor-block-navigation__list .block-editor-block-navigation__list>li:last-child{position:relative}.block-editor-block-navigation__list .block-editor-block-navigation__list>li:last-child:after{position:absolute;content:"";background:#fff;top:19px;bottom:0;right:-2px;width:2px}.block-editor-block-navigation__item-button{display:flex;align-items:center;width:100%;padding:6px;text-align:right;color:#40464d;border-radius:4px}.block-editor-block-navigation__item-button .block-editor-block-icon{margin-left:6px}.block-editor-block-navigation__item-button:hover:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;background:#f3f4f5}.block-editor-block-navigation__item-button:focus:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.block-editor-block-navigation__item-button.is-selected,.block-editor-block-navigation__item-button.is-selected:focus{color:#32373c;background:#edeff0}.components-popover.block-editor-block-navigation__popover{z-index:99998}.block-editor-block-preview__container{position:relative;width:100%;overflow:hidden}.block-editor-block-preview__container.is-ready{overflow:visible}.block-editor-block-preview__content{position:absolute;top:0;right:0;transform-origin:top right;text-align:initial;margin:0;overflow:visible;min-height:auto}.block-editor-block-preview__content .block-editor-block-list__block,.block-editor-block-preview__content .block-editor-block-list__layout{padding:0}.block-editor-block-preview__content>div section{height:auto}.block-editor-block-preview__content .block-editor-block-drop-zone,.block-editor-block-preview__content .block-editor-block-list__insertion-point,.block-editor-block-preview__content .block-list-appender,.block-editor-block-preview__content .reusable-block-indicator{display:none}.block-editor-block-settings-menu .components-dropdown-menu__toggle svg{transform:rotate(-90deg)}.block-editor-block-settings-menu__popover .components-dropdown-menu__menu{padding:0}.block-editor-block-styles{display:flex;flex-wrap:wrap;justify-content:space-between}.block-editor-block-styles__item{width:calc(50% - 4px);margin:4px 0;flex-shrink:0;cursor:pointer;overflow:hidden;border-radius:4px;padding:calc(37.5% - 6px) 6px 6px}.block-editor-block-styles__item:focus{color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2;outline:2px solid transparent}.block-editor-block-styles__item:hover{background:#f3f4f5;color:#191e23}.block-editor-block-styles__item.is-active{color:#191e23;box-shadow:inset 0 0 0 2px #555d66;outline:2px solid transparent;outline-offset:-2px}.block-editor-block-styles__item.is-active:focus{color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2,inset 0 0 0 2px #555d66;outline:4px solid transparent;outline-offset:-4px}.block-editor-block-styles__item-preview{outline:1px solid transparent;border:1px solid rgba(25,30,35,.2);border-radius:4px;display:flex;overflow:hidden;background:#fff;padding:75% 0 0;margin-top:-75%}.block-editor-block-styles__item-preview .block-editor-block-preview__container{padding-top:0;margin:-75% 0 0}.block-editor-block-styles__item-label{text-align:center;padding:4px 2px}.block-editor-block-switcher{position:relative;height:36px}.components-button.block-editor-block-switcher__no-switcher-icon,.components-button.block-editor-block-switcher__toggle{margin:0;display:block;height:36px;padding:3px}.components-button.block-editor-block-switcher__no-switcher-icon{width:48px}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{margin-left:auto;margin-right:auto}.components-button.block-editor-block-switcher__no-switcher-icon:disabled{border-radius:0;opacity:.84}.components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{color:#555d66!important;background:#f3f4f5!important}.components-button.block-editor-block-switcher__toggle{width:auto}.components-button.block-editor-block-switcher__toggle:active,.components-button.block-editor-block-switcher__toggle:not(:disabled):not([aria-disabled=true]):hover,.components-button.block-editor-block-switcher__toggle:not([aria-disabled=true]):focus{outline:none;box-shadow:none;background:none;border:none}.components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{width:42px;height:30px;position:relative;margin:0 auto;padding:3px;display:flex;align-items:center;transition:all .1s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{transition-duration:0s}}.components-button.block-editor-block-switcher__toggle .block-editor-block-icon:after{content:"";pointer-events:none;display:block;width:0;height:0;border-right:3px solid transparent;border-left:3px solid transparent;border-top:5px solid;margin-right:4px;margin-left:2px}.components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{margin-top:6px;border-radius:4px}.components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-switcher__transform,.components-button.block-editor-block-switcher__toggle:not(:disabled):hover .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle:not(:disabled):hover .block-editor-block-switcher__transform,.components-button.block-editor-block-switcher__toggle[aria-expanded=true] .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle[aria-expanded=true] .block-editor-block-switcher__transform{transform:translateY(-36px)}.components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-switcher__transform{box-shadow:inset 0 0 0 1px #555d66,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-popover.block-editor-block-switcher__popover .components-popover__content{min-width:300px;max-width:680px;display:flex;background:#fff;box-shadow:0 3px 30px rgba(25,30,35,.1)}.block-editor-block-switcher__popover .components-popover__content .block-editor-block-switcher__container{min-width:300px;max-width:340px;width:50%}@media (min-width:782px){.block-editor-block-switcher__popover .components-popover__content{position:relative}.block-editor-block-switcher__popover .components-popover__content .block-editor-block-switcher__preview{border-right:1px solid #e2e4e7;box-shadow:0 3px 30px rgba(25,30,35,.1);background:#fff;width:300px;height:auto;position:-webkit-sticky;position:sticky;-ms-grid-row-align:stretch;align-self:stretch;top:0;padding:10px}}.block-editor-block-switcher__popover .components-popover__content .components-panel__body{border:0;position:relative;z-index:1}.block-editor-block-switcher__popover .components-popover__content .components-panel__body+.components-panel__body{border-top:1px solid #e2e4e7}.block-editor-block-switcher__popover .block-editor-block-styles{margin:0 -3px}.block-editor-block-switcher__popover .block-editor-block-types-list{margin:8px -8px -8px}.block-editor-block-switcher__preview-title{margin-bottom:10px;color:#6c7781}.block-editor-block-toolbar{display:flex;flex-grow:1;width:100%;overflow:auto;position:relative;border-right:1px solid #b5bcc2;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-toolbar{transition-duration:0s}}@media (min-width:600px){.block-editor-block-toolbar{overflow:inherit;border-right:none;box-shadow:3px 0 0 0 #555d66}.is-dark-theme .block-editor-block-toolbar{box-shadow:3px 0 0 0 #d7dade}}.block-editor-block-toolbar .components-toolbar{border:0;border-top:1px solid #b5bcc2;border-bottom:1px solid #b5bcc2;border-left:1px solid #b5bcc2;line-height:0}.has-fixed-toolbar .block-editor-block-toolbar{box-shadow:none;border-right:1px solid #e2e4e7}.has-fixed-toolbar .block-editor-block-toolbar .components-toolbar{border-color:#e2e4e7}.block-editor-block-toolbar__slot{display:inline-block;line-height:0}@supports ((position:-webkit-sticky) or (position:sticky)){.block-editor-block-toolbar__slot{display:inline-flex}}.block-editor-block-types-list{list-style:none;padding:4px;margin-right:-4px;margin-left:-4px;overflow:hidden;display:flex;flex-wrap:wrap}.block-editor-block-variation-picker .components-placeholder__instructions{margin-bottom:0}.block-editor-block-variation-picker .components-placeholder__fieldset{flex-direction:column}.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{max-width:90%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{display:flex;justify-content:flex-start;flex-direction:row;flex-wrap:wrap;width:100%;margin:16px 0;padding:0;list-style:none}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{list-style:none;margin:4px 0 4px 8px;flex-shrink:1;max-width:100px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{padding:8px}.block-editor-block-variation-picker__variation{width:100%}.block-editor-block-variation-picker__variation.components-button.has-icon{justify-content:center}.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{background-color:#fff}.block-editor-block-variation-picker__variation.components-button{height:auto;padding:0}.block-editor-block-variation-picker__variation:before{content:"";padding-bottom:100%}.block-editor-block-variation-picker__variation:first-child{margin-right:0}.block-editor-block-variation-picker__variation:last-child{margin-left:0}.block-editor-button-block-appender{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:14px;outline:1px dashed #8d96a0;width:100%;height:auto;color:#555d66;background:rgba(237,239,240,.8)}.block-editor-button-block-appender:focus,.block-editor-button-block-appender:hover{outline:1px dashed #555d66;color:#191e23}.block-editor-button-block-appender:active{outline:1px dashed #191e23;color:#191e23}.is-dark-theme .block-editor-button-block-appender{background:rgba(50,55,60,.7);color:#f8f9f9}.is-dark-theme .block-editor-button-block-appender:focus,.is-dark-theme .block-editor-button-block-appender:hover{outline:1px dashed #fff}.block-editor-color-gradient-control__color-indicator{margin-bottom:8px}.block-editor-color-gradient-control__button-tabs{display:block;margin-bottom:8px}.block-editor-panel-color-gradient-settings .component-color-indicator{vertical-align:text-bottom}.block-editor-panel-color-gradient-settings__panel-title .component-color-indicator{display:inline-block}.block-editor-panel-color-gradient-settings.is-opened .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator{display:none}.block-editor-contrast-checker>.components-notice{margin:0}.block-editor-default-block-appender{clear:both;margin-right:auto;margin-left:auto;position:relative}.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{outline:1px solid transparent}.block-editor-default-block-appender textarea.block-editor-default-block-appender__content{font-family:"Noto Serif",serif;font-size:16px;border:none;background:none;box-shadow:none;display:block;cursor:text;width:100%;outline:1px solid transparent;transition:outline .2s;resize:none;margin-top:28px;margin-bottom:28px;padding:0 14px 0 50px;color:rgba(14,28,46,.62)}@media (prefers-reduced-motion:reduce){.block-editor-default-block-appender textarea.block-editor-default-block-appender__content{transition-duration:0s}}.is-dark-theme .block-editor-default-block-appender textarea.block-editor-default-block-appender__content{color:hsla(0,0%,100%,.65)}.block-editor-default-block-appender .components-drop-zone__content-icon{display:none}.block-editor-default-block-appender__content{min-height:28px;line-height:1.8}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{position:absolute;top:0;height:28px}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .components-button.has-icon,.block-editor-default-block-appender .block-editor-inserter .components-button.has-icon{width:28px;height:28px;padding:0}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .components-button svg,.block-editor-default-block-appender .block-editor-inserter .components-button svg{display:block;margin:auto}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle,.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle{margin-left:0}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover,.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{left:8px}@media (min-width:600px){.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{display:flex;height:100%}}.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{display:none}.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle,.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle{border-radius:50%;width:28px;height:28px;padding:0}.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover),.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover){color:rgba(10,24,41,.7)}.is-dark-theme .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover),.is-dark-theme .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover){color:hsla(0,0%,100%,.75)}@media (min-width:600px){.block-editor-default-block-appender .block-editor-inserter{align-items:center}}html.block-editor-editor-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.block-editor-editor-skeleton__html-container{position:static;width:auto}}.block-editor-editor-skeleton{display:flex;flex-direction:column;height:auto;max-height:100%;position:fixed;top:46px;left:0;bottom:0}@media (min-width:782px){.block-editor-editor-skeleton{top:32px}.is-fullscreen-mode .block-editor-editor-skeleton{top:0}}.block-editor-editor-skeleton{right:0}@media (min-width:782px){.block-editor-editor-skeleton{right:160px}}@media (min-width:782px){.auto-fold .block-editor-editor-skeleton{right:36px}}@media (min-width:961px){.auto-fold .block-editor-editor-skeleton{right:160px}}.folded .block-editor-editor-skeleton{right:0}@media (min-width:782px){.folded .block-editor-editor-skeleton{right:36px}}@media (max-width:782px){.auto-fold .wp-responsive-open .block-editor-editor-skeleton{right:190px}}@media (max-width:600px){.auto-fold .wp-responsive-open .block-editor-editor-skeleton{margin-right:-18px}}body.is-fullscreen-mode .block-editor-editor-skeleton{right:0!important}.block-editor-editor-skeleton__body{flex-grow:1;display:flex;overflow:auto;overscroll-behavior-y:none}.block-editor-editor-skeleton__content{flex-grow:1;display:flex;flex-direction:column}@media (min-width:782px){.block-editor-editor-skeleton__content{overflow:auto}}.block-editor-editor-skeleton__sidebar{display:none}@media (min-width:782px){.block-editor-editor-skeleton__sidebar{display:block;z-index:100000;position:fixed!important;top:-9999em;bottom:auto;right:auto;left:0;width:280px}.block-editor-editor-skeleton__sidebar:focus{top:auto;bottom:0}}.is-sidebar-opened .block-editor-editor-skeleton__sidebar{display:block;width:auto;flex-shrink:0;position:absolute;z-index:100000;top:0;left:0;bottom:0;right:0;background:#fff}@media (min-width:782px){.is-sidebar-opened .block-editor-editor-skeleton__sidebar{overflow:auto;border-right:1px solid #e2e4e7;position:relative!important;z-index:90}}.block-editor-editor-skeleton__header{flex-shrink:0;height:auto;border-bottom:1px solid #e2e4e7;z-index:30;position:-webkit-sticky;position:sticky;top:0}@media (min-width:600px){.block-editor-editor-skeleton__header{position:static;top:0}}.block-editor-editor-skeleton__footer{height:auto;flex-shrink:0;overflow:auto;border-top:1px solid #e2e4e7;display:none}@media (min-width:782px){.block-editor-editor-skeleton__footer{display:block}}.block-editor-editor-skeleton__publish{z-index:100000;position:fixed!important;top:-9999em;bottom:auto;right:auto;left:0;width:280px}.block-editor-editor-skeleton__publish:focus{top:auto;bottom:0}.block-editor-link-control{position:relative;min-width:360px}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{width:calc(100% - 32px);display:block;margin:16px;padding:11px 16px 11px 36px;position:relative;border:1px solid #e1e1e1;border-radius:4px;font-size:16px}@media (min-width:600px){.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{font-size:13px}}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:focus{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.block-editor-link-control__search-actions{position:absolute;top:19px;left:19px}.block-editor-link-control__search-results-wrapper{position:relative;margin-top:-15px}.block-editor-link-control__search-results-wrapper:after,.block-editor-link-control__search-results-wrapper:before{content:"";position:absolute;right:-1px;left:16px;display:block;pointer-events:none;z-index:100}.block-editor-link-control__search-results-wrapper:before{height:8px;top:0;bottom:auto;background:linear-gradient(180deg,#fff 0,hsla(0,0%,100%,0))}.block-editor-link-control__search-results-wrapper:after{height:16px;bottom:0;top:auto;background:linear-gradient(180deg,hsla(0,0%,100%,0) 0,#fff)}.block-editor-link-control__search-results-label{padding:15px 30px 0;display:block;font-size:1.1em}.block-editor-link-control__search-results{margin:0;padding:8px 16px 16px;max-height:200px;overflow-y:auto}.block-editor-link-control__search-results.is-loading{opacity:.2}.block-editor-link-control__search-item{position:relative;display:flex;align-items:center;font-size:13px;cursor:pointer;background:#fff;width:100%;border:none;text-align:right;padding:10px 15px;border-radius:5px;height:auto}.block-editor-link-control__search-item:focus,.block-editor-link-control__search-item:hover{background-color:#e9e9e9}.block-editor-link-control__search-item.is-selected{background:#f2f2f2}.block-editor-link-control__search-item.is-selected .block-editor-link-control__search-item-type{background:#fff}.block-editor-link-control__search-item.is-current{background:transparent;border:0;width:100%;cursor:default;padding:16px 24px 16px 16px}.block-editor-link-control__search-item .block-editor-link-control__search-item-header{display:block;margin-left:24px;overflow:hidden;white-space:nowrap}.block-editor-link-control__search-item .block-editor-link-control__search-item-icon{margin-left:1em;min-width:24px}.block-editor-link-control__search-item .block-editor-link-control__search-item-info,.block-editor-link-control__search-item .block-editor-link-control__search-item-title{max-width:230px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.block-editor-link-control__search-item .block-editor-link-control__search-item-title{display:block;margin-bottom:.2em;font-weight:500}.block-editor-link-control__search-item .block-editor-link-control__search-item-title mark{font-weight:700;color:#000;background-color:transparent}.block-editor-link-control__search-item .block-editor-link-control__search-item-title span{font-weight:400}.block-editor-link-control__search-item .block-editor-link-control__search-item-info{display:block;color:#999;font-size:.9em;line-height:1.3}.block-editor-link-control__search-item .block-editor-link-control__search-item-type{display:block;padding:3px 8px;margin-right:auto;font-size:.9em;background-color:#f3f4f5;border-radius:2px}.block-editor-link-control__search-results div[role=menu]>.block-editor-link-control__search-item.block-editor-link-control__search-item{padding:10px}.block-editor-link-control__settings{border-top:1px solid #e1e1e1;margin:0;padding:16px 24px}.block-editor-link-control__settings :last-child{margin-bottom:0}.block-editor-link-control__setting{margin-bottom:16px}.block-editor-link-control__setting :last-child{margin-bottom:0}.block-editor-link-control .block-editor-link-control__search-input .components-spinner{display:block}.block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner{position:absolute;right:auto;bottom:auto;top:28px;left:62px}.block-editor-link-control__search-item-action{margin-right:auto;flex-shrink:0}.block-editor-image-size-control{margin-bottom:1em}.block-editor-image-size-control .block-editor-image-size-control__row{display:flex;justify-content:space-between}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height,.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width{margin-bottom:.5em}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height input,.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width input{line-height:1.25}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width{margin-left:5px}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height{margin-right:5px}.block-editor-inner-blocks.has-overlay:after{content:"";position:absolute;top:-14px;left:-14px;bottom:-14px;right:-14px;z-index:60}[data-align=full] .has-overlay:after{left:0;right:0}.block-editor-inserter{display:inline-block;background:none;border:none;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.4}@media (min-width:782px){.block-editor-inserter{position:relative}}@media (min-width:782px){.block-editor-inserter__popover>.components-popover__content{overflow-y:visible;height:432px}}.block-editor-inserter__toggle{transition:color .2s ease}@media (prefers-reduced-motion:reduce){.block-editor-inserter__toggle{transition-duration:0s}}.block-editor-inserter__menu{height:100%;display:flex;width:auto}@media (min-width:782px){.block-editor-inserter__menu{width:400px;position:relative}.block-editor-inserter__menu.has-help-panel{width:700px}}.block-editor-inserter__main-area{width:auto;display:flex;flex-direction:column;height:100%}@media (min-width:782px){.block-editor-inserter__main-area{width:400px;position:relative}}.block-editor-inserter__inline-elements{margin-top:-1px}.block-editor-inserter__menu.is-bottom:after{border-bottom-color:#fff}.components-popover.block-editor-inserter__popover{z-index:99998}.components-popover input[type=search].block-editor-inserter__search{display:block;margin:16px;padding:11px 16px;position:relative;z-index:1;border-radius:4px;font-size:16px}@media (min-width:600px){.components-popover input[type=search].block-editor-inserter__search{font-size:13px}}.components-popover input[type=search].block-editor-inserter__search:focus{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.block-editor-inserter__results{flex-grow:1;overflow:auto;position:relative;z-index:1;padding:0 16px 16px}.block-editor-inserter__results:focus{outline:1px dotted #555d66}@media (min-width:782px){.block-editor-inserter__results{height:394px}}.block-editor-inserter__results [role=presentation]+.components-panel__body{border-top:none}.block-editor-inserter__popover .block-editor-block-types-list{margin:0 -8px}.block-editor-inserter__reusable-blocks-panel{position:relative;text-align:left}.block-editor-inserter__manage-reusable-blocks{margin:16px 16px 0 0}.block-editor-inserter__no-results{font-style:italic;padding:24px;text-align:center}.block-editor-inserter__child-blocks{padding:0 16px}.block-editor-inserter__parent-block-header{display:flex;align-items:center}.block-editor-inserter__parent-block-header h2{font-size:13px}.block-editor-inserter__parent-block-header .block-editor-block-icon{margin-left:8px}.block-editor-inserter__menu-help-panel{display:none;border-right:1px solid #e2e4e7;width:300px;height:100%;padding:20px;overflow-y:auto}@media (min-width:782px){.block-editor-inserter__menu-help-panel{display:flex;flex-direction:column}}.block-editor-inserter__menu-help-panel .block-editor-block-card{padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid #e2e4e7;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-inserter__menu-help-panel .block-editor-block-card{animation-duration:1ms}}.block-editor-inserter__menu-help-panel .block-editor-inserter__preview{display:flex;flex-grow:2}.block-editor-inserter__menu-help-panel-no-block{display:flex;height:100%;flex-direction:column;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-inserter__menu-help-panel-no-block{animation-duration:1ms}}.block-editor-inserter__menu-help-panel-no-block .block-editor-inserter__menu-help-panel-no-block-text{flex-grow:1}.block-editor-inserter__menu-help-panel-no-block .block-editor-inserter__menu-help-panel-no-block-text h4{font-size:18px}.block-editor-inserter__menu-help-panel-no-block .components-notice{margin:0}.block-editor-inserter__menu-help-panel-no-block h4{margin-top:0}.block-editor-inserter__menu-help-panel-hover-area{flex-grow:1;margin-top:20px;padding:20px;border:1px dotted #e2e4e7;display:flex;align-items:center;text-align:center}.block-editor-inserter__menu-help-panel-title{font-size:18px;font-weight:600;margin-bottom:20px}.block-editor-inserter__preview-content{border:1px solid #e2e4e7;border-radius:4px;min-height:150px;display:-ms-grid;display:grid;flex-grow:2}.block-editor-inserter__preview-content .block-editor-block-preview__container{margin-left:0;margin-right:0;padding:10px}.block-editor-inserter__preview-content-missing{flex:1;display:flex;justify-content:center;color:#606a73;border:1px solid #e2e4e7;border-radius:4px;align-items:center}.block-editor-block-types-list__list-item{display:block;width:33.33%;padding:0;margin:0 0 12px}.components-button.block-editor-block-types-list__item{display:flex;flex-direction:column;width:100%;font-size:13px;color:#32373c;padding:0 4px;align-items:stretch;justify-content:center;cursor:pointer;background:transparent;word-break:break-word;border-radius:4px;border:1px solid transparent;transition:all .05s ease-in-out;position:relative;height:auto}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-types-list__item{transition-duration:0s}}.components-button.block-editor-block-types-list__item:disabled{opacity:.6;cursor:default}.components-button.block-editor-block-types-list__item:not(:disabled):hover:before{content:"";display:block;background:#f3f4f5;color:#191e23;position:absolute;z-index:-1;border-radius:4px;top:0;left:0;bottom:0;right:0}.components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-icon,.components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{color:inherit}.components-button.block-editor-block-types-list__item:not(:disabled):active,.components-button.block-editor-block-types-list__item:not(:disabled):focus{position:relative;color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2;outline:2px solid transparent;background:transparent}.components-button.block-editor-block-types-list__item:not(:disabled):active .block-editor-block-types-list__item-icon,.components-button.block-editor-block-types-list__item:not(:disabled):active .block-editor-block-types-list__item-title,.components-button.block-editor-block-types-list__item:not(:disabled):focus .block-editor-block-types-list__item-icon,.components-button.block-editor-block-types-list__item:not(:disabled):focus .block-editor-block-types-list__item-title{color:inherit}.components-button.block-editor-block-types-list__item:not(:disabled).is-active{color:#191e23;box-shadow:inset 0 0 0 2px #555d66;outline:2px solid transparent;outline-offset:-2px}.components-button.block-editor-block-types-list__item:not(:disabled).is-active:focus{color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2,inset 0 0 0 2px #555d66;outline:4px solid transparent;outline-offset:-4px}.block-editor-block-types-list__item-icon{padding:12px 20px;border-radius:4px;color:#555d66;transition:all .05s ease-in-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon{transition-duration:0s}}.block-editor-block-types-list__item-icon .block-editor-block-icon{margin-right:auto;margin-left:auto}.block-editor-block-types-list__item-icon svg{transition:all .15s ease-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon svg{transition-duration:0s}}.block-editor-block-types-list__item-title{padding:4px 2px 8px}.modal-open .block-editor-media-replace-flow__options{display:none}.block-editor-media-replace-flow__indicator{margin-right:4px}.block-editor-media-replace-flow__indicator:after{content:"";pointer-events:none;display:block;width:0;height:0;border-right:3px solid transparent;border-left:3px solid transparent;border-top:5px solid;margin-right:4px;margin-left:2px}.block-editor-media-flow__url-input{max-width:255px;padding:0 15px 10px}.block-editor-media-flow__url-input input{max-width:180px}.block-editor-media-replace-flow__link-viewer .components-external-link__icon{display:none}.block-editor-media-replace-flow__link-viewer .components-visually-hidden{position:static}.block-editor-media-replace-flow__link-viewer .components-button{flex-shrink:0}.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{margin-bottom:0}.block-editor-media-placeholder__url-input-form{display:flex}.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:100%;flex-grow:1;border:none;border-radius:0;margin:2px}@media (min-width:600px){.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:300px}}.block-editor-media-placeholder__url-input-submit-button{flex-shrink:1}.block-editor-media-placeholder__button{margin-bottom:.5rem}.block-editor-media-placeholder__button .dashicon{vertical-align:middle;margin-bottom:3px}.block-editor-media-placeholder__button:hover{color:#23282d}.block-editor-media-placeholder__cancel-button.is-link{margin:1em;display:block}.block-editor-media-placeholder.is-appender{min-height:100px;outline:1px dashed #8d96a0}.block-editor-media-placeholder.is-appender:hover{outline:1px dashed #555d66;cursor:pointer}.is-dark-theme .block-editor-media-placeholder.is-appender:hover{outline:1px dashed #fff}.block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button{margin-left:4px}.block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button.components-button:focus,.block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button.components-button:hover{box-shadow:none;border:1px solid #555d66}.block-editor-multi-selection-inspector__card{display:flex;align-items:flex-start;padding:16px}.block-editor-multi-selection-inspector__card-content{flex-grow:1}.block-editor-multi-selection-inspector__card-title{font-weight:500;margin-bottom:5px}.block-editor-multi-selection-inspector__card-description{font-size:13px}.block-editor-multi-selection-inspector__card .block-editor-block-icon{margin-right:-2px;margin-left:10px;padding:0 3px;width:36px;height:24px}.block-editor .block-editor-plain-text{box-shadow:none;font-family:inherit;font-size:inherit;color:inherit;line-height:inherit;border:none;padding:0;margin:0;width:100%}.block-editor-responsive-block-control{margin-bottom:28px;border-bottom:1px solid #d7dade;padding-bottom:14px}.block-editor-responsive-block-control:last-child{padding-bottom:0;border-bottom:0}.block-editor-responsive-block-control__title{margin:0 -3px .6em 0}.block-editor-responsive-block-control__label{font-weight:600;margin-bottom:.6em;margin-right:-3px}.block-editor-responsive-block-control__inner{margin-right:-1px}.block-editor-responsive-block-control__toggle{margin-right:1px}.block-editor-responsive-block-control .components-base-control__help{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;width:1px;word-wrap:normal!important}.block-editor-format-toolbar .components-dropdown-menu__toggle .components-dropdown-menu__indicator:after{margin:7px}.block-editor-rich-text__editable>p:first-child{margin-top:0}.block-editor-rich-text__editable a{color:#007fac}.block-editor-rich-text__editable code{padding:2px;border-radius:2px;color:#23282d;background:#f3f4f5;font-family:Menlo,Consolas,monaco,monospace;font-size:inherit}.block-editor-rich-text__editable [data-rich-text-placeholder]{pointer-events:none}.block-editor-rich-text__editable [data-rich-text-placeholder]:after{content:attr(data-rich-text-placeholder);opacity:.62}.block-editor-rich-text__editable:focus{outline:none}.block-editor-rich-text__editable:focus [data-rich-text-format-boundary]{border-radius:2px}.block-editor-rich-text__editable:focus:not(.keep-placeholder-on-focus) [data-rich-text-placeholder]:after{display:none}figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{opacity:.8}.components-popover.block-editor-rich-text__inline-format-toolbar{z-index:99998}.components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content{min-width:auto;margin-bottom:6px}.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar{border:none}.block-editor-skip-to-selected-block{position:absolute;top:-9999em}.block-editor-skip-to-selected-block:focus{height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#11a0d2;line-height:normal;box-shadow:0 0 2px 2px rgba(0,0,0,.6);text-decoration:none;outline:none;z-index:100000}body.admin-color-sunrise .block-editor-skip-to-selected-block:focus{color:#c8b03c}body.admin-color-ocean .block-editor-skip-to-selected-block:focus{color:#a89d8a}body.admin-color-midnight .block-editor-skip-to-selected-block:focus{color:#77a6b9}body.admin-color-ectoplasm .block-editor-skip-to-selected-block:focus{color:#c77430}body.admin-color-coffee .block-editor-skip-to-selected-block:focus{color:#9fa47b}body.admin-color-blue .block-editor-skip-to-selected-block:focus{color:#d9ab59}body.admin-color-light .block-editor-skip-to-selected-block:focus{color:#c75726}.block-editor-tool-selector__help{padding:16px;border-top:1px solid #e2e4e7;color:#6c7781}.block-editor-block-list__block .block-editor-url-input,.block-editor-url-input,.components-popover .block-editor-url-input{flex-grow:1;position:relative;padding:1px}.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{width:100%;padding:8px;border:none;border-radius:0;margin-right:0;margin-left:0;font-size:16px}@media (min-width:600px){.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{width:300px}}@media (min-width:600px){.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{font-size:13px}}.block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear,.block-editor-url-input input[type=text]::-ms-clear,.components-popover .block-editor-url-input input[type=text]::-ms-clear{display:none}.block-editor-block-list__block .block-editor-url-input.has-border input[type=text],.block-editor-url-input.has-border input[type=text],.components-popover .block-editor-url-input.has-border input[type=text]{border:1px solid #555d66;border-radius:4px}.block-editor-block-list__block .block-editor-url-input.is-full-width,.block-editor-url-input.is-full-width,.components-popover .block-editor-url-input.is-full-width{width:100%}.block-editor-block-list__block .block-editor-url-input.is-full-width input[type=text],.block-editor-url-input.is-full-width input[type=text],.components-popover .block-editor-url-input.is-full-width input[type=text]{width:100%}.block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions,.block-editor-url-input.is-full-width__suggestions,.components-popover .block-editor-url-input.is-full-width__suggestions{width:100%}.block-editor-block-list__block .block-editor-url-input .components-spinner,.block-editor-url-input .components-spinner,.components-popover .block-editor-url-input .components-spinner{position:absolute;left:8px;bottom:17px;margin:0}.block-editor-url-input__suggestions{max-height:200px;transition:all .15s ease-in-out;padding:4px 0;width:302px;overflow-y:auto}@media (prefers-reduced-motion:reduce){.block-editor-url-input__suggestions{transition-duration:0s}}.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:none}@media (min-width:600px){.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:inherit}}.block-editor-url-input__suggestion{padding:4px 8px;color:#6c7781;display:block;font-size:13px;cursor:pointer;background:#fff;width:100%;text-align:right;border:none;box-shadow:none}.block-editor-url-input__suggestion:hover{background:#e2e4e7}.block-editor-url-input__suggestion.is-selected,.block-editor-url-input__suggestion:focus{background:#00719e;color:#fff;outline:none}body.admin-color-sunrise .block-editor-url-input__suggestion.is-selected,body.admin-color-sunrise .block-editor-url-input__suggestion:focus{background:#b2723f}body.admin-color-ocean .block-editor-url-input__suggestion.is-selected,body.admin-color-ocean .block-editor-url-input__suggestion:focus{background:#8b9d8a}body.admin-color-midnight .block-editor-url-input__suggestion.is-selected,body.admin-color-midnight .block-editor-url-input__suggestion:focus{background:#bf4139}body.admin-color-ectoplasm .block-editor-url-input__suggestion.is-selected,body.admin-color-ectoplasm .block-editor-url-input__suggestion:focus{background:#8e9b49}body.admin-color-coffee .block-editor-url-input__suggestion.is-selected,body.admin-color-coffee .block-editor-url-input__suggestion:focus{background:#a58d77}body.admin-color-blue .block-editor-url-input__suggestion.is-selected,body.admin-color-blue .block-editor-url-input__suggestion:focus{background:#6f99ad}body.admin-color-light .block-editor-url-input__suggestion.is-selected,body.admin-color-light .block-editor-url-input__suggestion:focus{background:#00719e}.components-toolbar>.block-editor-url-input__button{position:inherit}.block-editor-url-input__button .block-editor-url-input__back{margin-left:4px;overflow:visible}.block-editor-url-input__button .block-editor-url-input__back:after{content:"";position:absolute;display:block;width:1px;height:24px;left:-1px;background:#e2e4e7}.block-editor-url-input__button-modal{box-shadow:0 3px 30px rgba(25,30,35,.1);border:1px solid #e2e4e7;background:#fff}.block-editor-url-input__button-modal-line{display:flex;flex-direction:row;flex-grow:1;flex-shrink:1;min-width:0;align-items:flex-start}.block-editor-url-input__button-modal-line .components-button{flex-shrink:0;width:36px;height:36px}.block-editor-url-popover__additional-controls{border-top:1px solid #e2e4e7}.block-editor-url-popover__additional-controls>div[role=menu] .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary)>svg{box-shadow:none}.block-editor-url-popover__additional-controls div[role=menu]>.components-button{padding-right:2px}.block-editor-url-popover__row{display:flex}.block-editor-url-popover__row>:not(.block-editor-url-popover__settings-toggle){flex-grow:1}.block-editor-url-popover .components-button.has-icon{padding:3px}.block-editor-url-popover .components-button.has-icon>svg{padding:5px;border-radius:4px;height:30px;width:30px}.block-editor-url-popover .components-button.has-icon:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.block-editor-url-popover .components-button.has-icon:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover>svg{color:#555d66;box-shadow:inset 0 0 0 1px #555d66,inset 0 0 0 2px #fff}.block-editor-url-popover .components-button.has-icon:not(:disabled):focus{box-shadow:none}.block-editor-url-popover .components-button.has-icon:not(:disabled):focus>svg{box-shadow:inset 0 0 0 1px #555d66,inset 0 0 0 2px #fff;outline:2px solid transparent}.block-editor-url-popover__settings-toggle{flex-shrink:0;border-radius:0;border-right:1px solid #e2e4e7;margin-right:1px}.block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon{transform:rotate(-180deg)}.block-editor-url-popover__input-container .components-base-control:last-child,.block-editor-url-popover__input-container .components-base-control:last-child .components-base-control__field{margin-bottom:0}.block-editor-url-popover__settings{display:block;padding:16px;border-top:1px solid #e2e4e7}.block-editor-url-popover__link-editor,.block-editor-url-popover__link-viewer{display:flex}.block-editor-url-popover__link-editor .block-editor-url-input .components-base-control__field,.block-editor-url-popover__link-viewer .block-editor-url-input .components-base-control__field{margin-bottom:0}.block-editor-url-popover__link-editor .block-editor-url-input .components-spinner,.block-editor-url-popover__link-viewer .block-editor-url-input .components-spinner{bottom:9px}.block-editor-url-popover__link-viewer-url{margin:7px;flex-grow:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-url-popover__link-viewer-url.has-invalid-link{color:#d94f4f}.block-editor-warning{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:nowrap;background-color:#fff;border:1px solid #e2e4e7;text-align:right;padding:10px 14px 14px}.is-selected .block-editor-warning{border-color:rgba(66,88,99,.4)}@media (min-width:600px){.is-selected .block-editor-warning{border-right-color:transparent}}.is-dark-theme .is-selected .block-editor-warning{border-color:hsla(0,0%,100%,.45)}.block-editor-warning .block-editor-warning__message{line-height:1.4;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;margin:1em 0}.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{min-height:auto}.block-editor-warning .block-editor-warning__contents{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap;align-items:baseline;width:100%}.block-editor-warning .block-editor-warning__actions{display:flex}.block-editor-warning .block-editor-warning__action{margin:0 0 0 6px}.block-editor-warning__secondary{margin:5px -4px 0 0;height:36px}.block-editor-warning__secondary .components-button.has-icon{width:auto;padding:0 2px}@media (min-width:600px){.block-editor-warning__secondary{margin-right:4px}.block-editor-warning__secondary .components-button.has-icon{padding:0 4px}}.block-editor-warning__secondary .components-button svg{transform:rotate(-90deg)}.block-editor-writing-flow{display:flex;flex-direction:column}.block-editor-writing-flow__click-redirect{cursor:text}.html-anchor-control .components-external-link{display:block;margin-top:8px} \ No newline at end of file diff --git a/wp-includes/css/dist/block-editor/style.css b/wp-includes/css/dist/block-editor/style.css new file mode 100644 index 0000000..096692d --- /dev/null +++ b/wp-includes/css/dist/block-editor/style.css @@ -0,0 +1,2354 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.block-editor-block-icon { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + margin: 0; + border-radius: 4px; } + .block-editor-block-icon.has-colors svg { + fill: currentColor; } + .block-editor-block-icon svg { + min-width: 20px; + min-height: 20px; + max-width: 24px; + max-height: 24px; } + +.block-editor-block-inspector .components-base-control { + margin-bottom: 24px; } + .block-editor-block-inspector .components-base-control:last-child { + margin-bottom: 8px; } + +.block-editor-block-inspector .components-panel__body { + border: none; + border-top: 1px solid #e2e4e7; } + +.block-editor-block-inspector .block-editor-block-card { + padding: 16px; } + +.block-editor-block-inspector__no-blocks { + display: block; + font-size: 13px; + background: #fff; + padding: 32px 16px; + text-align: center; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging::before { + border: none; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging > * { + background: #f8f9f9; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging > * > * { + visibility: hidden; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-selected .reusable-block-edit-panel * { + z-index: 1; } + +/** + * General Post Content Layout + */ +.block-editor-block-list__layout { + padding-left: 14px; + padding-right: 14px; + position: relative; } + @media (min-width: 600px) { + .block-editor-block-list__layout { + padding-left: 58px; + padding-right: 58px; } } + .block-editor-block-list__layout .block-editor-block-list__layout { + padding-left: 0; + padding-right: 0; } + +/** + * Notices & Block Selected/Hover Styles. + */ +.block-editor-block-list__layout .block-editor-block-list__block { + position: relative; + overflow-wrap: break-word; + /** + * Notices + */ + /** + * Block border layout + */ } + .block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui { + margin: -10px 0 12px 0; } + .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui { + margin: 0 0 12px 0; + width: 100%; } + .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice { + margin-left: 0; + margin-right: 0; } + .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content { + font-size: 13px; } + .block-editor-block-list__layout .block-editor-block-list__block::before { + z-index: 0; + content: ""; + position: absolute; + border: 1px solid transparent; + border-left: none; + box-shadow: none; + pointer-events: none; + transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; + outline: 1px solid transparent; + right: -14px; + left: -14px; + top: -14px; + bottom: -14px; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-list__layout .block-editor-block-list__block::before { + transition-duration: 0s; } } + .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + border-color: rgba(66, 88, 99, 0.4); + box-shadow: inset 3px 0 0 0 #555d66; } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + border-color: rgba(255, 255, 255, 0.45); + box-shadow: inset 3px 0 0 0 #d7dade; } + @media (min-width: 600px) { + .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + box-shadow: -3px 0 0 0 #555d66; } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + box-shadow: -3px 0 0 0 #d7dade; } } + .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + border-color: #007cba; + box-shadow: inset 3px 0 0 0 #007cba; } + @media (min-width: 600px) { + .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected::before { + box-shadow: -3px 0 0 0 #007cba; } } + .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected) { + opacity: 0.5; + transition: opacity 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected) { + transition-duration: 0s; } } + .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected):not(.is-focused) .block-editor-block-list__block, .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected).is-focused { + opacity: 1; } + .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #0085ba; } + body.admin-color-sunrise .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #d1864a; } + body.admin-color-ocean .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #a3b9a2; } + body.admin-color-midnight .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #e14d43; } + body.admin-color-ectoplasm .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #a7b656; } + body.admin-color-coffee .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #c2a68c; } + body.admin-color-blue .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #82b4cb; } + body.admin-color-light .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before { + border-top: 3px solid #0085ba; } + +/** + * Cross-Block Selection + */ +.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-block-collapsed), +.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .is-block-content { + box-shadow: 0 0 0 2px #007cba; + border-radius: 1px; + outline: 2px solid transparent; } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-block-collapsed), .is-dark-theme + .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .is-block-content { + box-shadow: 0 0 0 2px #fff; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .components-placeholder ::selection { + background: transparent; } + +/** + * Block styles and alignments + */ +.block-editor-block-list__layout .block-editor-block-list__block.has-warning { + min-height: 36px; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning > * { + pointer-events: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning { + pointer-events: all; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning::before { + border-color: rgba(145, 151, 162, 0.25); + border-left: 1px solid rgba(145, 151, 162, 0.25); } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.has-warning::before { + border-color: rgba(255, 255, 255, 0.35); } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected::before { + border-color: rgba(66, 88, 99, 0.4); + border-left-color: transparent; } + .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected::before { + border-color: rgba(255, 255, 255, 0.45); } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning::after { + content: ""; + position: absolute; + background-color: rgba(248, 249, 249, 0.4); + top: -14px; + bottom: -14px; + right: -14px; + left: -14px; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected::after { + background-color: transparent; } + +.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected::after { + bottom: 22px; } + @media (min-width: 600px) { + .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected::after { + bottom: -14px; } } + +.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.is-selected::before { + border-left-color: transparent; + border-style: dashed; + border-width: 1px; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-reusable > .block-editor-inner-blocks.has-overlay::after { + display: none; } + +.block-editor-block-list__layout .block-editor-block-list__block.is-reusable > .block-editor-inner-blocks.has-overlay .block-editor-inner-blocks.has-overlay::after { + display: block; } + +.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block { + cursor: default; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="left"], .block-editor-block-list__layout .block-editor-block-list__block[data-align="right"] { + z-index: 21; + width: 100%; + height: 0; } + .block-editor-block-list__layout .block-editor-block-list__block[data-align="left"]::before, .block-editor-block-list__layout .block-editor-block-list__block[data-align="right"]::before { + content: none; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="left"] > .is-block-content { + /*!rtl:begin:ignore*/ + float: left; + margin-right: 2em; + /*!rtl:end:ignore*/ } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="right"] > .is-block-content { + /*!rtl:begin:ignore*/ + float: right; + margin-left: 2em; + /*!rtl:end:ignore*/ } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="full"], .block-editor-block-list__layout .block-editor-block-list__block[data-align="wide"] { + clear: both; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-align="full"] { + margin-left: -14px; + margin-right: -14px; } + @media (min-width: 600px) { + .block-editor-block-list__layout .block-editor-block-list__block[data-align="full"] { + margin-left: -58px; + margin-right: -58px; } } + .block-editor-block-list__layout .block-editor-block-list__block[data-align="full"]::before { + left: 0; + right: 0; + border-left-width: 0; + border-right-width: 0; } + +.block-editor-block-list__layout .block-editor-block-list__block[data-clear="true"] { + float: none; } + +.block-editor-block-list__layout .block-editor-block-list__block .block-editor-block-list__layout .block-editor-default-block-appender .block-editor-inserter { + left: auto; + right: 8px; } + +/** + * In-Canvas Inserter + */ +.block-editor-block-list .block-editor-inserter { + margin: 8px; + cursor: move; + cursor: grab; } + +.block-editor-block-list__insertion-point { + position: relative; + z-index: 6; + margin-top: -14px; } + +.block-editor-block-list__insertion-point-indicator { + position: absolute; + top: calc(50% - 1px); + height: 2px; + left: 0; + right: 0; + background: #0085ba; } + +body.admin-color-sunrise .block-editor-block-list__insertion-point-indicator { + background: #d1864a; } + +body.admin-color-ocean .block-editor-block-list__insertion-point-indicator { + background: #a3b9a2; } + +body.admin-color-midnight .block-editor-block-list__insertion-point-indicator { + background: #e14d43; } + +body.admin-color-ectoplasm .block-editor-block-list__insertion-point-indicator { + background: #a7b656; } + +body.admin-color-coffee .block-editor-block-list__insertion-point-indicator { + background: #c2a68c; } + +body.admin-color-blue .block-editor-block-list__insertion-point-indicator { + background: #82b4cb; } + +body.admin-color-light .block-editor-block-list__insertion-point-indicator { + background: #0085ba; } + +.block-editor-block-list__insertion-point-inserter { + display: none; + justify-content: center; + cursor: text; } + @media (min-width: 480px) { + .block-editor-block-list__insertion-point-inserter { + display: flex; } } + .block-editor-block-list__insertion-point-inserter.is-inserter-hidden .block-editor-inserter__toggle { + opacity: 0; + pointer-events: none; } + +.block-editor-block-list__block-popover-inserter { + position: absolute; + top: -9999em; + margin-bottom: 14px; } + .block-editor-block-list__block-popover-inserter.is-visible { + position: static; } + +.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle, +.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle { + border-radius: 50%; + color: #007cba; + background: #fff; + height: 28px; + width: 28px; + padding: 0; + justify-content: center; } + .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled="true"]):hover, + .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled="true"]):hover { + box-shadow: none; } + +.block-editor-block-list__block > .block-editor-block-list__insertion-point { + position: absolute; + top: -16px; + height: 28px; + bottom: auto; + left: 14px; + right: 14px; } + +.block-editor-block-list__block[data-align="full"] > .block-editor-block-list__insertion-point { + left: 0; + right: 0; } + +.block-editor-block-list__block .block-editor-block-list__block-html-textarea { + display: block; + margin: 0; + width: 100%; + border: none; + outline: none; + box-shadow: none; + resize: none; + overflow: hidden; + font-family: Menlo, Consolas, monaco, monospace; + font-size: 14px; + line-height: 150%; + transition: padding 0.2s linear; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-list__block .block-editor-block-list__block-html-textarea { + transition-duration: 0s; } } + .block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus { + box-shadow: none; } + +/** + * Block Toolbar when contextual. + */ +.block-editor-block-contextual-toolbar .block-editor-block-toolbar { + width: 100%; } + @media (min-width: 600px) { + .block-editor-block-contextual-toolbar .block-editor-block-toolbar { + width: auto; + border-right: none; } } + +/** + * Block Label for Navigation/Selection Mode + */ +.block-editor-block-list__breadcrumb { + display: block; + line-height: 1; + z-index: 22; } + .block-editor-block-list__breadcrumb .components-toolbar { + display: flex; + background: #fff; + border: 1px solid #007cba; + border-left: none; + box-shadow: inset 3px 0 0 0 #007cba; + height: 38px; + font-size: 13px; + line-height: 29px; + padding-left: 8px; + padding-right: 8px; } + .block-editor-block-list__breadcrumb .components-toolbar .components-button { + box-shadow: none; } + .is-dark-theme .block-editor-block-list__breadcrumb .components-toolbar { + border-color: rgba(255, 255, 255, 0.45); } + @media (min-width: 600px) { + .block-editor-block-list__breadcrumb .components-toolbar { + box-shadow: -3px 0 0 0 #007cba; } } + +.block-editor-block-list__block .block-editor-warning { + z-index: 5; + position: relative; + margin-right: -14px; + margin-left: -14px; + margin-bottom: -14px; + transform: translateY(-14px); } + .block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning { + margin-bottom: auto; } + +.block-editor-block-list__insertion-point-popover { + z-index: 28; } + .block-editor-block-list__insertion-point-popover .components-popover__content { + background: none; + border: none; + box-shadow: none; + overflow-y: visible; } + +.components-popover.block-editor-block-list__block-popover { + z-index: 29; } + .components-popover.block-editor-block-list__block-popover .components-popover__content { + margin: 0 !important; + min-width: auto; + background: none; + border: none; + box-shadow: none; + overflow-y: visible; + pointer-events: none; } + .components-popover.block-editor-block-list__block-popover .components-popover__content > * { + pointer-events: all; } + .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar, + .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__breadcrumb { + margin-bottom: 13px; + margin-left: -14px; } + .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar[data-align="full"], + .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__breadcrumb[data-align="full"] { + margin-left: 0; } + .is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover { + opacity: 0; } + +.block-editor-block-list__block .block-list-appender { + margin: 14px 0; } + .has-background .block-editor-block-list__block .block-list-appender { + margin: 32px 14px; } + +.block-list-appender.is-drop-target > div::before { + content: ""; + position: absolute; + right: -14px; + left: -14px; + top: -14px; + bottom: -14px; + border: 3px solid #0085ba; } + +body.admin-color-sunrise .block-list-appender.is-drop-target > div::before { + border: 3px solid #d1864a; } + +body.admin-color-ocean .block-list-appender.is-drop-target > div::before { + border: 3px solid #a3b9a2; } + +body.admin-color-midnight .block-list-appender.is-drop-target > div::before { + border: 3px solid #e14d43; } + +body.admin-color-ectoplasm .block-list-appender.is-drop-target > div::before { + border: 3px solid #a7b656; } + +body.admin-color-coffee .block-list-appender.is-drop-target > div::before { + border: 3px solid #c2a68c; } + +body.admin-color-blue .block-list-appender.is-drop-target > div::before { + border: 3px solid #82b4cb; } + +body.admin-color-light .block-list-appender.is-drop-target > div::before { + border: 3px solid #0085ba; } + +.block-list-appender > .block-editor-inserter { + display: block; } + +.block-editor-block-breadcrumb { + list-style: none; + padding: 0; + margin: 0; } + .block-editor-block-breadcrumb li { + display: inline-block; + margin: 0; } + .block-editor-block-breadcrumb li:not(:last-child)::after { + content: "\2192"; } + +.block-editor-block-breadcrumb__button.components-button { + height: 24px; + line-height: 24px; + padding: 0; } + .block-editor-block-breadcrumb__button.components-button:hover { + text-decoration: underline; } + .block-editor-block-breadcrumb__button.components-button:focus { + color: #191e23; + outline-offset: -1px; + outline: 1px dotted #555d66; + outline-offset: -2px; + box-shadow: none; } + +.block-editor-block-breadcrumb__current { + cursor: default; } + +.block-editor-block-breadcrumb__button.components-button, +.block-editor-block-breadcrumb__current { + color: #555d66; + padding: 0 8px; + font-size: inherit; } + +.block-editor-block-card { + display: flex; + align-items: flex-start; } + +.block-editor-block-card__icon { + border: 1px solid #ccd0d4; + padding: 7px; + margin-right: 10px; + height: 36px; + width: 36px; } + +.block-editor-block-card__content { + flex-grow: 1; } + +.block-editor-block-card__title { + font-weight: 500; + margin-bottom: 5px; } + +.block-editor-block-card__description { + font-size: 13px; } + +.block-editor-block-card .block-editor-block-icon { + margin-left: -2px; + margin-right: 10px; + padding: 0 3px; + width: 36px; + height: 24px; } + +/** + * Invalid block comparison + */ +.block-editor-block-compare { + overflow: auto; + height: auto; } + @media (min-width: 600px) { + .block-editor-block-compare { + max-height: 70%; } } + +.block-editor-block-compare__wrapper { + display: flex; + padding-bottom: 16px; } + .block-editor-block-compare__wrapper > div { + display: flex; + justify-content: space-between; + flex-direction: column; + width: 50%; + padding: 0 16px 0 0; + min-width: 200px; } + .block-editor-block-compare__wrapper > div button { + float: right; } + .block-editor-block-compare__wrapper .block-editor-block-compare__converted { + border-left: 1px solid #ddd; + padding-left: 15px; + padding-right: 0; } + .block-editor-block-compare__wrapper .block-editor-block-compare__html { + font-family: Menlo, Consolas, monaco, monospace; + font-size: 12px; + color: #23282d; + border-bottom: 1px solid #ddd; + padding-bottom: 15px; + line-height: 1.7; } + .block-editor-block-compare__wrapper .block-editor-block-compare__html span { + background-color: #e6ffed; + padding-top: 3px; + padding-bottom: 3px; } + .block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added { + background-color: #acf2bd; } + .block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed { + background-color: #d94f4f; } + .block-editor-block-compare__wrapper .block-editor-block-compare__preview { + padding: 0; + padding-top: 14px; } + .block-editor-block-compare__wrapper .block-editor-block-compare__preview p { + font-size: 12px; + margin-top: 0; } + .block-editor-block-compare__wrapper .block-editor-block-compare__action { + margin-top: 14px; } + .block-editor-block-compare__wrapper .block-editor-block-compare__heading { + font-size: 1em; + font-weight: 400; + margin: 0.67em 0; } + +.block-editor-block-mobile-toolbar { + display: flex; + flex-direction: row; + border-right: 1px solid #e2e4e7; } + .block-editor-block-mobile-toolbar .block-editor-block-mover__control { + width: 36px; + height: 36px; + border-radius: 4px; + padding: 3px; + margin: 0; + justify-content: center; + align-items: center; } + .block-editor-block-mobile-toolbar .block-editor-block-mover__control .dashicon { + margin: auto; } + .block-editor-block-mobile-toolbar .block-editor-block-mover { + display: flex; + margin-right: auto; } + .block-editor-block-mobile-toolbar .block-editor-block-mover .block-editor-block-mover__control { + float: left; } + +@media (min-width: 600px) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) { + display: block; + position: absolute; + top: 37px; + left: -38px; + opacity: 0; + background: #fff; + border: 1px solid rgba(66, 88, 99, 0.4); + border-radius: 4px; + transition: box-shadow 0.2s ease-out; } } + @media (min-width: 600px) and (prefers-reduced-motion: reduce) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) { + transition-duration: 0s; } } + +@media (min-width: 600px) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal).is-visible { + animation: edit-post__fade-in-animation 0.2s ease-out 0s; + animation-fill-mode: forwards; } } + @media (min-width: 600px) and (prefers-reduced-motion: reduce) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal).is-visible { + animation-duration: 1ms; } } + +@media (min-width: 600px) { + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control { + display: flex; + align-items: center; + justify-content: center; + padding: 0; + border: none; + width: 28px; + height: 24px; + color: rgba(14, 28, 46, 0.62); } + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control svg { + width: 28px; + height: 24px; + padding: 2px 5px; } + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control[aria-disabled="true"] { + cursor: default; + pointer-events: none; + color: rgba(14, 28, 46, 0.62); } + .block-editor-block-contextual-toolbar:not([data-align="wide"]):not([data-align="full"]) +.block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control:focus:not(:disabled) { + background-color: transparent; } } + +@media (min-width: 600px) { + .block-editor-block-list__block:not([data-align="wide"]):not([data-align="full"]) .block-editor-block-mover:not(.is-horizontal) { + margin-top: 0; } } + +.block-editor-block-mover__control-drag-handle { + cursor: move; + cursor: grab; + fill: currentColor; } + .block-editor-block-mover__control-drag-handle, .block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover, .block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):active, .block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):focus { + box-shadow: none; + background: none; + color: rgba(10, 24, 41, 0.7); } + .block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):active { + cursor: grabbing; } + +.block-editor-block-mover__description { + display: none; } + +.block-editor-block-mover.is-horizontal .block-editor-block-mover__control-drag-handle { + display: none; } + +.block-editor-block-navigation__container { + padding: 7px; } + +.block-editor-block-navigation__label { + margin: 0 0 8px; + color: #6c7781; } + +.block-editor-block-navigation__list, +.block-editor-block-navigation__paragraph { + padding: 0; + margin: 0; } + +.block-editor-block-navigation__list .block-editor-button-block-appender { + outline: none; + background: none; + padding: 8px; + margin-left: 0.8em; + width: 36px; + border-radius: 4px; } + .block-editor-block-navigation__list .block-editor-button-block-appender:hover:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; + outline: none; } + .block-editor-block-navigation__list .block-editor-button-block-appender:focus:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + +.block-editor-block-navigation__list .block-editor-block-navigation__list { + margin-top: 2px; + border-left: 2px solid #a2aab2; + margin-left: 1em; } + .block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__list { + margin-left: 1.5em; } + .block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item { + position: relative; } + .block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item::before { + position: absolute; + left: 0; + background: #a2aab2; + width: 0.5em; + height: 2px; + content: ""; + top: calc(50% - 1px); } + .block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item-button { + margin-left: 0.8em; + width: calc(100% - 0.8em); } + .block-editor-block-navigation__list .block-editor-block-navigation__list > li:last-child { + position: relative; } + .block-editor-block-navigation__list .block-editor-block-navigation__list > li:last-child::after { + position: absolute; + content: ""; + background: #fff; + top: 19px; + bottom: 0; + left: -2px; + width: 2px; } + +.block-editor-block-navigation__item-button { + display: flex; + align-items: center; + width: 100%; + padding: 6px; + text-align: left; + color: #40464d; + border-radius: 4px; } + .block-editor-block-navigation__item-button .block-editor-block-icon { + margin-right: 6px; } + .block-editor-block-navigation__item-button:hover:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; } + .block-editor-block-navigation__item-button:focus:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + .block-editor-block-navigation__item-button.is-selected, .block-editor-block-navigation__item-button.is-selected:focus { + color: #32373c; + background: #edeff0; } + +.components-popover.block-editor-block-navigation__popover { + z-index: 99998; } + +.block-editor-block-preview__container { + position: relative; + width: 100%; + overflow: hidden; } + .block-editor-block-preview__container.is-ready { + overflow: visible; } + +.block-editor-block-preview__content { + position: absolute; + top: 0; + left: 0; + transform-origin: top left; + text-align: initial; + margin: 0; + overflow: visible; + min-height: auto; } + .block-editor-block-preview__content .block-editor-block-list__layout, + .block-editor-block-preview__content .block-editor-block-list__block { + padding: 0; } + .block-editor-block-preview__content > div section { + height: auto; } + .block-editor-block-preview__content .block-editor-block-list__insertion-point, + .block-editor-block-preview__content .block-editor-block-drop-zone, + .block-editor-block-preview__content .reusable-block-indicator, + .block-editor-block-preview__content .block-list-appender { + display: none; } + +.block-editor-block-settings-menu .components-dropdown-menu__toggle svg { + transform: rotate(90deg); } + +.block-editor-block-settings-menu__popover .components-dropdown-menu__menu { + padding: 0; } + +.block-editor-block-styles { + display: flex; + flex-wrap: wrap; + justify-content: space-between; } + +.block-editor-block-styles__item { + width: calc(50% - 4px); + margin: 4px 0; + flex-shrink: 0; + cursor: pointer; + overflow: hidden; + border-radius: 4px; + padding: 6px; + padding-top: calc(50% * 0.75 - 4px * 1.5); } + .block-editor-block-styles__item:focus { + color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2; + outline: 2px solid transparent; } + .block-editor-block-styles__item:hover { + background: #f3f4f5; + color: #191e23; } + .block-editor-block-styles__item.is-active { + color: #191e23; + box-shadow: inset 0 0 0 2px #555d66; + outline: 2px solid transparent; + outline-offset: -2px; } + .block-editor-block-styles__item.is-active:focus { + color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2, inset 0 0 0 2px #555d66; + outline: 4px solid transparent; + outline-offset: -4px; } + +.block-editor-block-styles__item-preview { + outline: 1px solid transparent; + padding: 0; + border: 1px solid rgba(25, 30, 35, 0.2); + border-radius: 4px; + display: flex; + overflow: hidden; + background: #fff; + padding-top: 75%; + margin-top: -75%; } + .block-editor-block-styles__item-preview .block-editor-block-preview__container { + padding-top: 0; + margin: 0; + margin-top: -75%; } + +.block-editor-block-styles__item-label { + text-align: center; + padding: 4px 2px; } + +.block-editor-block-switcher { + position: relative; + height: 36px; } + +.components-button.block-editor-block-switcher__toggle, +.components-button.block-editor-block-switcher__no-switcher-icon { + margin: 0; + display: block; + height: 36px; + padding: 3px; } + +.components-button.block-editor-block-switcher__no-switcher-icon { + width: 48px; } + .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon { + margin-right: auto; + margin-left: auto; } + +.components-button.block-editor-block-switcher__no-switcher-icon:disabled { + border-radius: 0; + opacity: 0.84; } + .components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors { + color: #555d66 !important; + background: #f3f4f5 !important; } + +.components-button.block-editor-block-switcher__toggle { + width: auto; } + .components-button.block-editor-block-switcher__toggle:active, .components-button.block-editor-block-switcher__toggle:not(:disabled):not([aria-disabled="true"]):hover, .components-button.block-editor-block-switcher__toggle:not([aria-disabled="true"]):focus { + outline: none; + box-shadow: none; + background: none; + border: none; } + .components-button.block-editor-block-switcher__toggle .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { + width: 42px; + height: 30px; + position: relative; + margin: 0 auto; + padding: 3px; + display: flex; + align-items: center; + transition: all 0.1s cubic-bezier(0.165, 0.84, 0.44, 1); } + @media (prefers-reduced-motion: reduce) { + .components-button.block-editor-block-switcher__toggle .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { + transition-duration: 0s; } } + .components-button.block-editor-block-switcher__toggle .block-editor-block-icon::after { + content: ""; + pointer-events: none; + display: block; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 5px solid; + margin-left: 4px; + margin-right: 2px; } + .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { + margin-top: 6px; + border-radius: 4px; } + .components-button.block-editor-block-switcher__toggle[aria-expanded="true"] .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle[aria-expanded="true"] .block-editor-block-switcher__transform, + .components-button.block-editor-block-switcher__toggle:not(:disabled):hover .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle:not(:disabled):hover .block-editor-block-switcher__transform, + .components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-switcher__transform { + transform: translateY(-36px); } + .components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-icon, + .components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-switcher__transform { + box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + +.components-popover.block-editor-block-switcher__popover .components-popover__content { + min-width: 300px; + max-width: calc(340px * 2); + display: flex; + background: #fff; + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1); } + +.block-editor-block-switcher__popover .components-popover__content .block-editor-block-switcher__container { + min-width: 300px; + max-width: 340px; + width: 50%; } + +@media (min-width: 782px) { + .block-editor-block-switcher__popover .components-popover__content { + position: relative; } + .block-editor-block-switcher__popover .components-popover__content .block-editor-block-switcher__preview { + border-left: 1px solid #e2e4e7; + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1); + background: #fff; + width: 300px; + height: auto; + position: -webkit-sticky; + position: sticky; + -ms-grid-row-align: stretch; + align-self: stretch; + top: 0; + padding: 10px; } } + +.block-editor-block-switcher__popover .components-popover__content .components-panel__body { + border: 0; + position: relative; + z-index: 1; } + +.block-editor-block-switcher__popover .components-popover__content .components-panel__body + .components-panel__body { + border-top: 1px solid #e2e4e7; } + +.block-editor-block-switcher__popover .block-editor-block-styles { + margin: 0 -3px; } + +.block-editor-block-switcher__popover .block-editor-block-types-list { + margin: 8px -8px -8px; } + +.block-editor-block-switcher__preview-title { + margin-bottom: 10px; + color: #6c7781; } + +.block-editor-block-toolbar { + display: flex; + flex-grow: 1; + width: 100%; + overflow: auto; + position: relative; + border-left: 1px solid #b5bcc2; + transition: border-color 0.1s linear, box-shadow 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-toolbar { + transition-duration: 0s; } } + @media (min-width: 600px) { + .block-editor-block-toolbar { + overflow: inherit; + border-left: none; + box-shadow: -3px 0 0 0 #555d66; } + .is-dark-theme .block-editor-block-toolbar { + box-shadow: -3px 0 0 0 #d7dade; } } + .block-editor-block-toolbar .components-toolbar { + border: 0; + border-top: 1px solid #b5bcc2; + border-bottom: 1px solid #b5bcc2; + border-right: 1px solid #b5bcc2; + line-height: 0; } + .has-fixed-toolbar .block-editor-block-toolbar { + box-shadow: none; + border-left: 1px solid #e2e4e7; } + .has-fixed-toolbar .block-editor-block-toolbar .components-toolbar { + border-color: #e2e4e7; } + +.block-editor-block-toolbar__slot { + display: inline-block; + line-height: 0; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .block-editor-block-toolbar__slot { + display: inline-flex; } } + +.block-editor-block-types-list { + list-style: none; + padding: 4px; + margin-left: -4px; + margin-right: -4px; + overflow: hidden; + display: flex; + flex-wrap: wrap; } + +.block-editor-block-variation-picker .components-placeholder__instructions { + margin-bottom: 0; } + +.block-editor-block-variation-picker .components-placeholder__fieldset { + flex-direction: column; } + +.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset { + max-width: 90%; } + +.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations { + display: flex; + justify-content: flex-start; + flex-direction: row; + flex-wrap: wrap; + width: 100%; + margin: 16px 0; + padding: 0; + list-style: none; } + .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations > li { + list-style: none; + margin: 4px 8px 4px 0; + flex-shrink: 1; + max-width: 100px; } + .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation { + padding: 8px; } + +.block-editor-block-variation-picker__variation { + width: 100%; } + .block-editor-block-variation-picker__variation.components-button.has-icon { + justify-content: center; } + .block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary { + background-color: #fff; } + .block-editor-block-variation-picker__variation.components-button { + height: auto; + padding: 0; } + .block-editor-block-variation-picker__variation::before { + content: ""; + padding-bottom: 100%; } + .block-editor-block-variation-picker__variation:first-child { + margin-left: 0; } + .block-editor-block-variation-picker__variation:last-child { + margin-right: 0; } + +.block-editor-button-block-appender { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 14px; + outline: 1px dashed #8d96a0; + width: 100%; + height: auto; + color: #555d66; + background: rgba(237, 239, 240, 0.8); } + .block-editor-button-block-appender:hover, .block-editor-button-block-appender:focus { + outline: 1px dashed #555d66; + color: #191e23; } + .block-editor-button-block-appender:active { + outline: 1px dashed #191e23; + color: #191e23; } + .is-dark-theme .block-editor-button-block-appender { + background: rgba(50, 55, 60, 0.7); + color: #f8f9f9; } + .is-dark-theme .block-editor-button-block-appender:hover, .is-dark-theme .block-editor-button-block-appender:focus { + outline: 1px dashed #fff; } + +.block-editor-color-gradient-control__color-indicator { + margin-bottom: 8px; } + +.block-editor-color-gradient-control__button-tabs { + display: block; + margin-bottom: 8px; } + +.block-editor-panel-color-gradient-settings .component-color-indicator { + vertical-align: text-bottom; } + +.block-editor-panel-color-gradient-settings__panel-title .component-color-indicator { + display: inline-block; } + +.block-editor-panel-color-gradient-settings.is-opened .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator { + display: none; } + +.block-editor-contrast-checker > .components-notice { + margin: 0; } + +.block-editor-default-block-appender { + clear: both; + margin-left: auto; + margin-right: auto; + position: relative; } + .block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover { + outline: 1px solid transparent; } + .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + font-family: "Noto Serif", serif; + font-size: 16px; + border: none; + background: none; + box-shadow: none; + display: block; + cursor: text; + width: 100%; + outline: 1px solid transparent; + transition: 0.2s outline; + resize: none; + margin-top: 28px; + margin-bottom: 28px; + padding: 0 50px 0 14px; + color: rgba(14, 28, 46, 0.62); } + @media (prefers-reduced-motion: reduce) { + .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + transition-duration: 0s; } } + .is-dark-theme .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { + color: rgba(255, 255, 255, 0.65); } + .block-editor-default-block-appender .components-drop-zone__content-icon { + display: none; } + +.block-editor-default-block-appender__content { + min-height: 28px; + line-height: 1.8; } + +.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter, +.block-editor-default-block-appender .block-editor-inserter { + position: absolute; + top: 0; + height: 28px; } + .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .components-button.has-icon, + .block-editor-default-block-appender .block-editor-inserter .components-button.has-icon { + width: 28px; + height: 28px; + padding: 0; } + .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .components-button svg, + .block-editor-default-block-appender .block-editor-inserter .components-button svg { + display: block; + margin: auto; } + .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle, + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle { + margin-right: 0; } + .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover, + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + box-shadow: none; } + +.block-editor-block-list__empty-block-inserter, +.block-editor-default-block-appender .block-editor-inserter { + right: 8px; } + @media (min-width: 600px) { + .block-editor-block-list__empty-block-inserter, + .block-editor-default-block-appender .block-editor-inserter { + display: flex; + height: 100%; } } + .block-editor-block-list__empty-block-inserter:disabled, + .block-editor-default-block-appender .block-editor-inserter:disabled { + display: none; } + .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle, + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle { + border-radius: 50%; + width: 28px; + height: 28px; + padding: 0; } + .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover), + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover) { + color: rgba(10, 24, 41, 0.7); } + .is-dark-theme .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover), .is-dark-theme + .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover) { + color: rgba(255, 255, 255, 0.75); } + +@media (min-width: 600px) { + .block-editor-default-block-appender .block-editor-inserter { + align-items: center; } } + +html.block-editor-editor-skeleton__html-container { + position: fixed; + width: 100%; } + @media (min-width: 782px) { + html.block-editor-editor-skeleton__html-container { + position: initial; + width: initial; } } + +.block-editor-editor-skeleton { + display: flex; + flex-direction: column; + height: auto; + max-height: 100%; + position: fixed; + top: 46px; + left: 0; + right: 0; + bottom: 0; } + @media (min-width: 782px) { + .block-editor-editor-skeleton { + top: 32px; } + .is-fullscreen-mode .block-editor-editor-skeleton { + top: 0; } } + +.block-editor-editor-skeleton { + /* Set left position when auto-fold is not on the body element. */ + left: 0; } + @media (min-width: 782px) { + .block-editor-editor-skeleton { + left: 160px; } } + +.auto-fold .block-editor-editor-skeleton { + /* Auto fold is when on smaller breakpoints, nav menu auto collapses. */ } + @media (min-width: 782px) { + .auto-fold .block-editor-editor-skeleton { + left: 36px; } } + @media (min-width: 961px) { + .auto-fold .block-editor-editor-skeleton { + left: 160px; } } + +/* Sidebar manually collapsed. */ +.folded .block-editor-editor-skeleton { + left: 0; } + @media (min-width: 782px) { + .folded .block-editor-editor-skeleton { + left: 36px; } } + +/* Mobile menu opened. */ +@media (max-width: 782px) { + .auto-fold .wp-responsive-open .block-editor-editor-skeleton { + left: 190px; } } + +/* In small screens with responsive menu expanded there is small white space. */ +@media (max-width: 600px) { + .auto-fold .wp-responsive-open .block-editor-editor-skeleton { + margin-left: -18px; } } + +body.is-fullscreen-mode .block-editor-editor-skeleton { + left: 0 !important; } + +.block-editor-editor-skeleton__body { + flex-grow: 1; + display: flex; + overflow: auto; + overscroll-behavior-y: none; } + +.block-editor-editor-skeleton__content { + flex-grow: 1; + display: flex; + flex-direction: column; } + @media (min-width: 782px) { + .block-editor-editor-skeleton__content { + overflow: auto; } } + +.block-editor-editor-skeleton__sidebar { + display: none; } + @media (min-width: 782px) { + .block-editor-editor-skeleton__sidebar { + display: block; + z-index: 100000; + position: fixed !important; + top: -9999em; + bottom: auto; + left: auto; + right: 0; + width: 280px; } + .block-editor-editor-skeleton__sidebar:focus { + top: auto; + bottom: 0; } } + +.is-sidebar-opened .block-editor-editor-skeleton__sidebar { + display: block; + width: auto; + flex-shrink: 0; + position: absolute; + z-index: 100000; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: #fff; } + @media (min-width: 782px) { + .is-sidebar-opened .block-editor-editor-skeleton__sidebar { + overflow: auto; + border-left: 1px solid #e2e4e7; + position: relative !important; + z-index: 90; } } + +.block-editor-editor-skeleton__header { + flex-shrink: 0; + height: auto; + border-bottom: 1px solid #e2e4e7; + z-index: 30; + position: -webkit-sticky; + position: sticky; + top: 0; } + @media (min-width: 600px) { + .block-editor-editor-skeleton__header { + position: initial; + top: 0; } } + +.block-editor-editor-skeleton__footer { + height: auto; + flex-shrink: 0; + overflow: auto; + border-top: 1px solid #e2e4e7; + display: none; } + @media (min-width: 782px) { + .block-editor-editor-skeleton__footer { + display: block; } } + +.block-editor-editor-skeleton__publish { + z-index: 100000; + position: fixed !important; + top: -9999em; + bottom: auto; + left: auto; + right: 0; + width: 280px; } + .block-editor-editor-skeleton__publish:focus { + top: auto; + bottom: 0; } + +.block-editor-link-control { + position: relative; + min-width: 360px; } + +.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type="text"] { + width: calc(100% - 32px); + display: block; + padding: 11px 16px; + margin: 16px; + padding-right: 36px; + position: relative; + border: 1px solid #e1e1e1; + border-radius: 4px; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type="text"] { + font-size: 13px; } } + .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type="text"]:focus { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + +.block-editor-link-control__search-actions { + position: absolute; + /* + * Actions must be positioned on top of URLInput, since the input will grow + * when suggestions are rendered. + * + * Compensate for: + * - Input margin ($grid-size-large) + * - Border (1px) + * - Vertically, for the difference in height between the input (40px) and + * the icon buttons. + * - Horizontally, pad to the minimum of: default input padding, or the + * equivalent of the vertical padding. + */ + top: 19px; + right: 19px; } + +.block-editor-link-control__search-results-wrapper { + position: relative; + margin-top: -15px; } + .block-editor-link-control__search-results-wrapper::before, .block-editor-link-control__search-results-wrapper::after { + content: ""; + position: absolute; + left: -1px; + right: 16px; + display: block; + pointer-events: none; + z-index: 100; } + .block-editor-link-control__search-results-wrapper::before { + height: 8px; + top: 0; + bottom: auto; + background: linear-gradient(to bottom, white 0%, rgba(255, 255, 255, 0) 100%); } + .block-editor-link-control__search-results-wrapper::after { + height: 16px; + bottom: 0; + top: auto; + background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, white 100%); } + +.block-editor-link-control__search-results-label { + padding: 15px 30px 0 30px; + display: block; + font-size: 1.1em; } + +.block-editor-link-control__search-results { + margin: 0; + padding: 8px 16px 16px; + max-height: 200px; + overflow-y: auto; } + .block-editor-link-control__search-results.is-loading { + opacity: 0.2; } + +.block-editor-link-control__search-item { + position: relative; + display: flex; + align-items: center; + font-size: 13px; + cursor: pointer; + background: #fff; + width: 100%; + border: none; + text-align: left; + padding: 10px 15px; + border-radius: 5px; + height: auto; } + .block-editor-link-control__search-item:hover, .block-editor-link-control__search-item:focus { + background-color: #e9e9e9; } + .block-editor-link-control__search-item.is-selected { + background: #f2f2f2; } + .block-editor-link-control__search-item.is-selected .block-editor-link-control__search-item-type { + background: #fff; } + .block-editor-link-control__search-item.is-current { + background: transparent; + border: 0; + width: 100%; + cursor: default; + padding: 16px; + padding-left: 24px; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-header { + display: block; + margin-right: 24px; + overflow: hidden; + white-space: nowrap; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-icon { + margin-right: 1em; + min-width: 24px; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-info, + .block-editor-link-control__search-item .block-editor-link-control__search-item-title { + max-width: 230px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-title { + display: block; + margin-bottom: 0.2em; + font-weight: 500; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-title mark { + font-weight: 700; + color: #000; + background-color: transparent; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-title span { + font-weight: normal; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-info { + display: block; + color: #999; + font-size: 0.9em; + line-height: 1.3; } + .block-editor-link-control__search-item .block-editor-link-control__search-item-type { + display: block; + padding: 3px 8px; + margin-left: auto; + font-size: 0.9em; + background-color: #f3f4f5; + border-radius: 2px; } + +.block-editor-link-control__search-results div[role="menu"] > .block-editor-link-control__search-item.block-editor-link-control__search-item { + padding: 10px; } + +.block-editor-link-control__settings { + border-top: 1px solid #e1e1e1; + margin: 0; + padding: 16px 24px; } + .block-editor-link-control__settings :last-child { + margin-bottom: 0; } + +.block-editor-link-control__setting { + margin-bottom: 16px; } + .block-editor-link-control__setting :last-child { + margin-bottom: 0; } + +.block-editor-link-control .block-editor-link-control__search-input .components-spinner { + display: block; } + .block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner { + position: absolute; + left: auto; + bottom: auto; + /* + * Position spinner to the left of the actions. + * + * Compensate for: + * - Input margin ($grid-size-large) + * - Border (1px) + * - Vertically, for the difference in height between the input (40px) + * and the spinner. + * - Horizontally, adjust for the width occupied by the icon buttons, + * then artificially create spacing that mimics as if the spinner + * were center-padded to the same width as an icon button. + */ + top: 28px; + right: 62px; } + +.block-editor-link-control__search-item-action { + margin-left: auto; + flex-shrink: 0; } + +.block-editor-image-size-control { + margin-bottom: 1em; } + .block-editor-image-size-control .block-editor-image-size-control__row { + display: flex; + justify-content: space-between; } + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width, + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height { + margin-bottom: 0.5em; } + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width input, + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height input { + line-height: 1.25; } + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width { + margin-right: 5px; } + .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height { + margin-left: 5px; } + +.block-editor-inner-blocks.has-overlay::after { + content: ""; + position: absolute; + top: -14px; + right: -14px; + bottom: -14px; + left: -14px; + z-index: 60; } + +[data-align="full"] .has-overlay::after { + right: 0; + left: 0; } + +.block-editor-inserter { + display: inline-block; + background: none; + border: none; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + line-height: 1.4; } + @media (min-width: 782px) { + .block-editor-inserter { + position: relative; } } + +@media (min-width: 782px) { + .block-editor-inserter__popover > .components-popover__content { + overflow-y: visible; + height: 432px; } } + +.block-editor-inserter__toggle { + transition: color 0.2s ease; } + @media (prefers-reduced-motion: reduce) { + .block-editor-inserter__toggle { + transition-duration: 0s; } } + +.block-editor-inserter__menu { + height: 100%; + display: flex; + width: auto; } + @media (min-width: 782px) { + .block-editor-inserter__menu { + width: 400px; + position: relative; } + .block-editor-inserter__menu.has-help-panel { + width: 700px; } } + +.block-editor-inserter__main-area { + width: auto; + display: flex; + flex-direction: column; + height: 100%; } + @media (min-width: 782px) { + .block-editor-inserter__main-area { + width: 400px; + position: relative; } } + +.block-editor-inserter__inline-elements { + margin-top: -1px; } + +.block-editor-inserter__menu.is-bottom::after { + border-bottom-color: #fff; } + +.components-popover.block-editor-inserter__popover { + z-index: 99998; } + +.components-popover input[type="search"].block-editor-inserter__search { + display: block; + margin: 16px; + padding: 11px 16px; + position: relative; + z-index: 1; + border-radius: 4px; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .components-popover input[type="search"].block-editor-inserter__search { + font-size: 13px; } } + .components-popover input[type="search"].block-editor-inserter__search:focus { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + +.block-editor-inserter__results { + flex-grow: 1; + overflow: auto; + position: relative; + z-index: 1; + padding: 0 16px 16px 16px; } + .block-editor-inserter__results:focus { + outline: 1px dotted #555d66; } + @media (min-width: 782px) { + .block-editor-inserter__results { + height: 394px; } } + .block-editor-inserter__results [role="presentation"] + .components-panel__body { + border-top: none; } + +.block-editor-inserter__popover .block-editor-block-types-list { + margin: 0 -8px; } + +.block-editor-inserter__reusable-blocks-panel { + position: relative; + text-align: right; } + +.block-editor-inserter__manage-reusable-blocks { + margin: 16px 0 0 16px; } + +.block-editor-inserter__no-results { + font-style: italic; + padding: 24px; + text-align: center; } + +.block-editor-inserter__child-blocks { + padding: 0 16px; } + +.block-editor-inserter__parent-block-header { + display: flex; + align-items: center; } + .block-editor-inserter__parent-block-header h2 { + font-size: 13px; } + .block-editor-inserter__parent-block-header .block-editor-block-icon { + margin-right: 8px; } + +.block-editor-inserter__menu-help-panel { + display: none; + border-left: 1px solid #e2e4e7; + width: 300px; + height: 100%; + padding: 20px; + overflow-y: auto; } + @media (min-width: 782px) { + .block-editor-inserter__menu-help-panel { + display: flex; + flex-direction: column; } } + .block-editor-inserter__menu-help-panel .block-editor-block-card { + padding-bottom: 20px; + margin-bottom: 20px; + border-bottom: 1px solid #e2e4e7; + animation: edit-post__fade-in-animation 0.2s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .block-editor-inserter__menu-help-panel .block-editor-block-card { + animation-duration: 1ms; } } + .block-editor-inserter__menu-help-panel .block-editor-inserter__preview { + display: flex; + flex-grow: 2; } + +.block-editor-inserter__menu-help-panel-no-block { + display: flex; + height: 100%; + flex-direction: column; + animation: edit-post__fade-in-animation 0.2s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .block-editor-inserter__menu-help-panel-no-block { + animation-duration: 1ms; } } + .block-editor-inserter__menu-help-panel-no-block .block-editor-inserter__menu-help-panel-no-block-text { + flex-grow: 1; } + .block-editor-inserter__menu-help-panel-no-block .block-editor-inserter__menu-help-panel-no-block-text h4 { + font-size: 18px; } + .block-editor-inserter__menu-help-panel-no-block .components-notice { + margin: 0; } + .block-editor-inserter__menu-help-panel-no-block h4 { + margin-top: 0; } + +.block-editor-inserter__menu-help-panel-hover-area { + flex-grow: 1; + margin-top: 20px; + padding: 20px; + border: 1px dotted #e2e4e7; + display: flex; + align-items: center; + text-align: center; } + +.block-editor-inserter__menu-help-panel-title { + font-size: 18px; + font-weight: 600; + margin-bottom: 20px; } + +.block-editor-inserter__preview-content { + border: 1px solid #e2e4e7; + border-radius: 4px; + min-height: 150px; + display: -ms-grid; + display: grid; + flex-grow: 2; } + .block-editor-inserter__preview-content .block-editor-block-preview__container { + margin-right: 0; + margin-left: 0; + padding: 10px; } + +.block-editor-inserter__preview-content-missing { + flex: 1; + display: flex; + justify-content: center; + color: #606a73; + border: 1px solid #e2e4e7; + border-radius: 4px; + align-items: center; } + +.block-editor-block-types-list__list-item { + display: block; + width: 33.33%; + padding: 0; + margin: 0 0 12px; } + +.components-button.block-editor-block-types-list__item { + display: flex; + flex-direction: column; + width: 100%; + font-size: 13px; + color: #32373c; + padding: 0 4px; + align-items: stretch; + justify-content: center; + cursor: pointer; + background: transparent; + word-break: break-word; + border-radius: 4px; + border: 1px solid transparent; + transition: all 0.05s ease-in-out; + position: relative; + height: auto; } + @media (prefers-reduced-motion: reduce) { + .components-button.block-editor-block-types-list__item { + transition-duration: 0s; } } + .components-button.block-editor-block-types-list__item:disabled { + opacity: 0.6; + cursor: default; } + .components-button.block-editor-block-types-list__item:not(:disabled):hover::before { + content: ""; + display: block; + background: #f3f4f5; + color: #191e23; + position: absolute; + z-index: -1; + border-radius: 4px; + top: 0; + right: 0; + bottom: 0; + left: 0; } + .components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-icon, + .components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title { + color: inherit; } + .components-button.block-editor-block-types-list__item:not(:disabled):active, .components-button.block-editor-block-types-list__item:not(:disabled):focus { + position: relative; + color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2; + outline: 2px solid transparent; + background: transparent; } + .components-button.block-editor-block-types-list__item:not(:disabled):active .block-editor-block-types-list__item-icon, + .components-button.block-editor-block-types-list__item:not(:disabled):active .block-editor-block-types-list__item-title, .components-button.block-editor-block-types-list__item:not(:disabled):focus .block-editor-block-types-list__item-icon, + .components-button.block-editor-block-types-list__item:not(:disabled):focus .block-editor-block-types-list__item-title { + color: inherit; } + .components-button.block-editor-block-types-list__item:not(:disabled).is-active { + color: #191e23; + box-shadow: inset 0 0 0 2px #555d66; + outline: 2px solid transparent; + outline-offset: -2px; } + .components-button.block-editor-block-types-list__item:not(:disabled).is-active:focus { + color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2, inset 0 0 0 2px #555d66; + outline: 4px solid transparent; + outline-offset: -4px; } + +.block-editor-block-types-list__item-icon { + padding: 12px 20px; + border-radius: 4px; + color: #555d66; + transition: all 0.05s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-types-list__item-icon { + transition-duration: 0s; } } + .block-editor-block-types-list__item-icon .block-editor-block-icon { + margin-left: auto; + margin-right: auto; } + .block-editor-block-types-list__item-icon svg { + transition: all 0.15s ease-out; } + @media (prefers-reduced-motion: reduce) { + .block-editor-block-types-list__item-icon svg { + transition-duration: 0s; } } + +.block-editor-block-types-list__item-title { + padding: 4px 2px 8px; } + +.modal-open .block-editor-media-replace-flow__options { + display: none; } + +.block-editor-media-replace-flow__indicator { + margin-left: 4px; } + .block-editor-media-replace-flow__indicator::after { + content: ""; + pointer-events: none; + display: block; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 5px solid; + margin-left: 4px; + margin-right: 2px; } + +.block-editor-media-flow__url-input { + padding: 0 15px; + max-width: 255px; + padding-bottom: 10px; } + .block-editor-media-flow__url-input input { + max-width: 180px; } + +.block-editor-media-replace-flow__link-viewer .components-external-link__icon { + display: none; } + +.block-editor-media-replace-flow__link-viewer .components-visually-hidden { + position: initial; } + +.block-editor-media-replace-flow__link-viewer .components-button { + flex-shrink: 0; } + +.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button { + margin-bottom: 0; } + +.block-editor-media-placeholder__url-input-form { + display: flex; } + .block-editor-media-placeholder__url-input-form input[type="url"].block-editor-media-placeholder__url-input-field { + width: 100%; + flex-grow: 1; + border: none; + border-radius: 0; + margin: 2px; } + @media (min-width: 600px) { + .block-editor-media-placeholder__url-input-form input[type="url"].block-editor-media-placeholder__url-input-field { + width: 300px; } } + +.block-editor-media-placeholder__url-input-submit-button { + flex-shrink: 1; } + +.block-editor-media-placeholder__button { + margin-bottom: 0.5rem; } + .block-editor-media-placeholder__button .dashicon { + vertical-align: middle; + margin-bottom: 3px; } + .block-editor-media-placeholder__button:hover { + color: #23282d; } + +.block-editor-media-placeholder__cancel-button.is-link { + margin: 1em; + display: block; } + +.block-editor-media-placeholder.is-appender { + min-height: 100px; + outline: 1px dashed #8d96a0; } + .block-editor-media-placeholder.is-appender:hover { + outline: 1px dashed #555d66; + cursor: pointer; } + .is-dark-theme .block-editor-media-placeholder.is-appender:hover { + outline: 1px dashed #fff; } + .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button { + margin-right: 4px; } + .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button.components-button:hover, .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button.components-button:focus { + box-shadow: none; + border: 1px solid #555d66; } + +.block-editor-multi-selection-inspector__card { + display: flex; + align-items: flex-start; + padding: 16px; } + +.block-editor-multi-selection-inspector__card-content { + flex-grow: 1; } + +.block-editor-multi-selection-inspector__card-title { + font-weight: 500; + margin-bottom: 5px; } + +.block-editor-multi-selection-inspector__card-description { + font-size: 13px; } + +.block-editor-multi-selection-inspector__card .block-editor-block-icon { + margin-left: -2px; + margin-right: 10px; + padding: 0 3px; + width: 36px; + height: 24px; } + +.block-editor .block-editor-plain-text { + box-shadow: none; + font-family: inherit; + font-size: inherit; + color: inherit; + line-height: inherit; + border: none; + padding: 0; + margin: 0; + width: 100%; } + +.block-editor-responsive-block-control { + margin-bottom: 28px; + border-bottom: 1px solid #d7dade; + padding-bottom: 14px; } + .block-editor-responsive-block-control:last-child { + padding-bottom: 0; + border-bottom: 0; } + +.block-editor-responsive-block-control__title { + margin: 0; + margin-bottom: 0.6em; + margin-left: -3px; } + +.block-editor-responsive-block-control__label { + font-weight: 600; + margin-bottom: 0.6em; + margin-left: -3px; } + +.block-editor-responsive-block-control__inner { + margin-left: -1px; } + +.block-editor-responsive-block-control__toggle { + margin-left: 1px; } + +.block-editor-responsive-block-control .components-base-control__help { + 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; + width: 1px; + word-wrap: normal !important; } + +.block-editor-format-toolbar .components-dropdown-menu__toggle .components-dropdown-menu__indicator::after { + margin: 7px; } + +.block-editor-rich-text__editable > p:first-child { + margin-top: 0; } + +.block-editor-rich-text__editable a { + color: #007fac; } + +.block-editor-rich-text__editable code { + padding: 2px; + border-radius: 2px; + color: #23282d; + background: #f3f4f5; + font-family: Menlo, Consolas, monaco, monospace; + font-size: inherit; } + +.block-editor-rich-text__editable [data-rich-text-placeholder] { + pointer-events: none; } + +.block-editor-rich-text__editable [data-rich-text-placeholder]::after { + content: attr(data-rich-text-placeholder); + opacity: 0.62; } + +.block-editor-rich-text__editable:focus { + outline: none; } + .block-editor-rich-text__editable:focus [data-rich-text-format-boundary] { + border-radius: 2px; } + .block-editor-rich-text__editable:focus:not(.keep-placeholder-on-focus) [data-rich-text-placeholder]::after { + display: none; } + +figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]::before { + opacity: 0.8; } + +.components-popover.block-editor-rich-text__inline-format-toolbar { + z-index: 99998; } + .components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content { + min-width: auto; + margin-bottom: 6px; } + .components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar { + border: none; } + +.block-editor-skip-to-selected-block { + position: absolute; + top: -9999em; } + .block-editor-skip-to-selected-block:focus { + height: auto; + width: auto; + display: block; + font-size: 14px; + font-weight: 600; + padding: 15px 23px 14px; + background: #f1f1f1; + color: #11a0d2; + line-height: normal; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + text-decoration: none; + outline: none; + z-index: 100000; } + body.admin-color-sunrise .block-editor-skip-to-selected-block:focus { + color: #c8b03c; } + body.admin-color-ocean .block-editor-skip-to-selected-block:focus { + color: #a89d8a; } + body.admin-color-midnight .block-editor-skip-to-selected-block:focus { + color: #77a6b9; } + body.admin-color-ectoplasm .block-editor-skip-to-selected-block:focus { + color: #c77430; } + body.admin-color-coffee .block-editor-skip-to-selected-block:focus { + color: #9fa47b; } + body.admin-color-blue .block-editor-skip-to-selected-block:focus { + color: #d9ab59; } + body.admin-color-light .block-editor-skip-to-selected-block:focus { + color: #c75726; } + +.block-editor-tool-selector__help { + padding: 16px; + border-top: 1px solid #e2e4e7; + color: #6c7781; } + +.block-editor-block-list__block .block-editor-url-input, +.components-popover .block-editor-url-input, +.block-editor-url-input { + flex-grow: 1; + position: relative; + padding: 1px; } + .block-editor-block-list__block .block-editor-url-input input[type="text"], + .components-popover .block-editor-url-input input[type="text"], + .block-editor-url-input input[type="text"] { + width: 100%; + padding: 8px; + border: none; + border-radius: 0; + margin-left: 0; + margin-right: 0; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .block-editor-block-list__block .block-editor-url-input input[type="text"], + .components-popover .block-editor-url-input input[type="text"], + .block-editor-url-input input[type="text"] { + width: 300px; } } + @media (min-width: 600px) { + .block-editor-block-list__block .block-editor-url-input input[type="text"], + .components-popover .block-editor-url-input input[type="text"], + .block-editor-url-input input[type="text"] { + font-size: 13px; } } + .block-editor-block-list__block .block-editor-url-input input[type="text"]::-ms-clear, + .components-popover .block-editor-url-input input[type="text"]::-ms-clear, + .block-editor-url-input input[type="text"]::-ms-clear { + display: none; } + .block-editor-block-list__block .block-editor-url-input.has-border input[type="text"], + .components-popover .block-editor-url-input.has-border input[type="text"], + .block-editor-url-input.has-border input[type="text"] { + border: 1px solid #555d66; + border-radius: 4px; } + .block-editor-block-list__block .block-editor-url-input.is-full-width, + .components-popover .block-editor-url-input.is-full-width, + .block-editor-url-input.is-full-width { + width: 100%; } + .block-editor-block-list__block .block-editor-url-input.is-full-width input[type="text"], + .components-popover .block-editor-url-input.is-full-width input[type="text"], + .block-editor-url-input.is-full-width input[type="text"] { + width: 100%; } + .block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions, + .components-popover .block-editor-url-input.is-full-width__suggestions, + .block-editor-url-input.is-full-width__suggestions { + width: 100%; } + .block-editor-block-list__block .block-editor-url-input .components-spinner, + .components-popover .block-editor-url-input .components-spinner, + .block-editor-url-input .components-spinner { + position: absolute; + right: 8px; + bottom: 17px; + margin: 0; } + +.block-editor-url-input__suggestions { + max-height: 200px; + transition: all 0.15s ease-in-out; + padding: 4px 0; + width: 302px; + overflow-y: auto; } + @media (prefers-reduced-motion: reduce) { + .block-editor-url-input__suggestions { + transition-duration: 0s; } } + +.block-editor-url-input__suggestions, +.block-editor-url-input .components-spinner { + display: none; } + @media (min-width: 600px) { + .block-editor-url-input__suggestions, + .block-editor-url-input .components-spinner { + display: inherit; } } + +.block-editor-url-input__suggestion { + padding: 4px 8px; + color: #6c7781; + display: block; + font-size: 13px; + cursor: pointer; + background: #fff; + width: 100%; + border: none; + text-align: left; + border: none; + box-shadow: none; } + .block-editor-url-input__suggestion:hover { + background: #e2e4e7; } + .block-editor-url-input__suggestion:focus, .block-editor-url-input__suggestion.is-selected { + background: rgb(0, 113, 158); + color: #fff; + outline: none; } + body.admin-color-sunrise .block-editor-url-input__suggestion:focus, body.admin-color-sunrise .block-editor-url-input__suggestion.is-selected { + background: rgb(178, 114, 63); } + body.admin-color-ocean .block-editor-url-input__suggestion:focus, body.admin-color-ocean .block-editor-url-input__suggestion.is-selected { + background: rgb(139, 157, 138); } + body.admin-color-midnight .block-editor-url-input__suggestion:focus, body.admin-color-midnight .block-editor-url-input__suggestion.is-selected { + background: rgb(191, 65, 57); } + body.admin-color-ectoplasm .block-editor-url-input__suggestion:focus, body.admin-color-ectoplasm .block-editor-url-input__suggestion.is-selected { + background: rgb(142, 155, 73); } + body.admin-color-coffee .block-editor-url-input__suggestion:focus, body.admin-color-coffee .block-editor-url-input__suggestion.is-selected { + background: rgb(165, 141, 119); } + body.admin-color-blue .block-editor-url-input__suggestion:focus, body.admin-color-blue .block-editor-url-input__suggestion.is-selected { + background: rgb(111, 153, 173); } + body.admin-color-light .block-editor-url-input__suggestion:focus, body.admin-color-light .block-editor-url-input__suggestion.is-selected { + background: rgb(0, 113, 158); } + +.components-toolbar > .block-editor-url-input__button { + position: inherit; } + +.block-editor-url-input__button .block-editor-url-input__back { + margin-right: 4px; + overflow: visible; } + .block-editor-url-input__button .block-editor-url-input__back::after { + content: ""; + position: absolute; + display: block; + width: 1px; + height: 24px; + right: -1px; + background: #e2e4e7; } + +.block-editor-url-input__button-modal { + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1); + border: 1px solid #e2e4e7; + background: #fff; } + +.block-editor-url-input__button-modal-line { + display: flex; + flex-direction: row; + flex-grow: 1; + flex-shrink: 1; + min-width: 0; + align-items: flex-start; } + .block-editor-url-input__button-modal-line .components-button { + flex-shrink: 0; + width: 36px; + height: 36px; } + +.block-editor-url-popover__additional-controls { + border-top: 1px solid #e2e4e7; } + +.block-editor-url-popover__additional-controls > div[role="menu"] .components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary) > svg { + box-shadow: none; } + +.block-editor-url-popover__additional-controls div[role="menu"] > .components-button { + padding-left: 2px; } + +.block-editor-url-popover__row { + display: flex; } + +.block-editor-url-popover__row > :not(.block-editor-url-popover__settings-toggle) { + flex-grow: 1; } + +.block-editor-url-popover .components-button.has-icon { + padding: 3px; } + .block-editor-url-popover .components-button.has-icon > svg { + padding: 5px; + border-radius: 4px; + height: 30px; + width: 30px; } + .block-editor-url-popover .components-button.has-icon:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + box-shadow: none; } + .block-editor-url-popover .components-button.has-icon:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover > svg { + color: #555d66; + box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; } + .block-editor-url-popover .components-button.has-icon:not(:disabled):focus { + box-shadow: none; } + .block-editor-url-popover .components-button.has-icon:not(:disabled):focus > svg { + box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + +.block-editor-url-popover__settings-toggle { + flex-shrink: 0; + border-radius: 0; + border-left: 1px solid #e2e4e7; + margin-left: 1px; } + .block-editor-url-popover__settings-toggle[aria-expanded="true"] .dashicon { + transform: rotate(180deg); } + +.block-editor-url-popover__input-container .components-base-control:last-child, +.block-editor-url-popover__input-container .components-base-control:last-child .components-base-control__field { + margin-bottom: 0; } + +.block-editor-url-popover__settings { + display: block; + padding: 16px; + border-top: 1px solid #e2e4e7; } + +.block-editor-url-popover__link-editor, +.block-editor-url-popover__link-viewer { + display: flex; } + .block-editor-url-popover__link-editor .block-editor-url-input .components-base-control__field, + .block-editor-url-popover__link-viewer .block-editor-url-input .components-base-control__field { + margin-bottom: 0; } + .block-editor-url-popover__link-editor .block-editor-url-input .components-spinner, + .block-editor-url-popover__link-viewer .block-editor-url-input .components-spinner { + bottom: 9px; } + +.block-editor-url-popover__link-viewer-url { + margin: 7px; + flex-grow: 1; + flex-shrink: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 150px; + max-width: 500px; } + .block-editor-url-popover__link-viewer-url.has-invalid-link { + color: #d94f4f; } + +.block-editor-warning { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: nowrap; + background-color: #fff; + border: 1px solid #e2e4e7; + text-align: left; + padding: 10px 14px 14px; } + .is-selected .block-editor-warning { + border-color: rgba(66, 88, 99, 0.4); } + @media (min-width: 600px) { + .is-selected .block-editor-warning { + border-left-color: transparent; } } + .is-dark-theme .is-selected .block-editor-warning { + border-color: rgba(255, 255, 255, 0.45); } + .block-editor-warning .block-editor-warning__message { + line-height: 1.4; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + margin: 1em 0; } + .block-editor-warning p.block-editor-warning__message.block-editor-warning__message { + min-height: auto; } + .block-editor-warning .block-editor-warning__contents { + display: flex; + flex-direction: row; + justify-content: space-between; + flex-wrap: wrap; + align-items: baseline; + width: 100%; } + .block-editor-warning .block-editor-warning__actions { + display: flex; } + .block-editor-warning .block-editor-warning__action { + margin: 0 6px 0 0; } + +.block-editor-warning__secondary { + margin: 5px 0 0 -4px; + height: 36px; } + .block-editor-warning__secondary .components-button.has-icon { + width: auto; + padding: 0 2px; } + @media (min-width: 600px) { + .block-editor-warning__secondary { + margin-left: 4px; } + .block-editor-warning__secondary .components-button.has-icon { + padding: 0 4px; } } + .block-editor-warning__secondary .components-button svg { + transform: rotate(90deg); } + +.block-editor-writing-flow { + display: flex; + flex-direction: column; } + +.block-editor-writing-flow__click-redirect { + cursor: text; } + +.html-anchor-control .components-external-link { + display: block; + margin-top: 8px; } diff --git a/wp-includes/css/dist/block-editor/style.min.css b/wp-includes/css/dist/block-editor/style.min.css new file mode 100644 index 0000000..bb6f567 --- /dev/null +++ b/wp-includes/css/dist/block-editor/style.min.css @@ -0,0 +1,5 @@ +.block-editor-block-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px;margin:0;border-radius:4px}.block-editor-block-icon.has-colors svg{fill:currentColor}.block-editor-block-icon svg{min-width:20px;min-height:20px;max-width:24px;max-height:24px}.block-editor-block-inspector .components-base-control{margin-bottom:24px}.block-editor-block-inspector .components-base-control:last-child{margin-bottom:8px}.block-editor-block-inspector .components-panel__body{border:none;border-top:1px solid #e2e4e7}.block-editor-block-inspector .block-editor-block-card{padding:16px}.block-editor-block-inspector__no-blocks{display:block;font-size:13px;background:#fff;padding:32px 16px;text-align:center}.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging:before{border:none}.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging>*{background:#f8f9f9}.block-editor-block-list__layout .block-editor-block-list__block.is-selected.is-dragging>*>*{visibility:hidden}.block-editor-block-list__layout .block-editor-block-list__block.is-selected .reusable-block-edit-panel *{z-index:1}.block-editor-block-list__layout{padding-left:14px;padding-right:14px;position:relative}@media (min-width:600px){.block-editor-block-list__layout{padding-left:58px;padding-right:58px}}.block-editor-block-list__layout .block-editor-block-list__layout{padding-left:0;padding-right:0}.block-editor-block-list__layout .block-editor-block-list__block{position:relative;overflow-wrap:break-word}.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{margin:-10px 0 12px}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{margin:0 0 12px;width:100%}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice{margin-left:0;margin-right:0}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{font-size:13px}.block-editor-block-list__layout .block-editor-block-list__block:before{z-index:0;content:"";position:absolute;border:1px solid transparent;border-left:none;box-shadow:none;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;outline:1px solid transparent;right:-14px;left:-14px;top:-14px;bottom:-14px}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block:before{transition-duration:0s}}.block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{border-color:rgba(66,88,99,.4);box-shadow:inset 3px 0 0 0 #555d66}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{border-color:hsla(0,0%,100%,.45);box-shadow:inset 3px 0 0 0 #d7dade}@media (min-width:600px){.block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{box-shadow:-3px 0 0 0 #555d66}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{box-shadow:-3px 0 0 0 #d7dade}}.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{border-color:#007cba;box-shadow:inset 3px 0 0 0 #007cba}@media (min-width:600px){.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected:before{box-shadow:-3px 0 0 0 #007cba}}.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected){opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected){transition-duration:0s}}.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected).is-focused,.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected):not(.is-focused) .block-editor-block-list__block{opacity:1}.block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #0085ba}body.admin-color-sunrise .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #d1864a}body.admin-color-ocean .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #a3b9a2}body.admin-color-midnight .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #e14d43}body.admin-color-ectoplasm .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #a7b656}body.admin-color-coffee .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #c2a68c}body.admin-color-blue .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #82b4cb}body.admin-color-light .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before{border-top:3px solid #0085ba}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .is-block-content,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-block-collapsed){box-shadow:0 0 0 2px #007cba;border-radius:1px;outline:2px solid transparent}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .is-block-content,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-block-collapsed){box-shadow:0 0 0 2px #fff}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .components-placeholder ::selection{background:transparent}.block-editor-block-list__layout .block-editor-block-list__block.has-warning{min-height:36px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{pointer-events:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{pointer-events:all}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:before{border-color:rgba(145,151,162,.25);border-left:1px solid rgba(145,151,162,.25)}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.has-warning:before{border-color:hsla(0,0%,100%,.35)}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected:before{border-color:rgba(66,88,99,.4) rgba(66,88,99,.4) rgba(66,88,99,.4) transparent}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected:before{border-color:hsla(0,0%,100%,.45)}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{content:"";position:absolute;background-color:rgba(248,249,249,.4);top:-14px;bottom:-14px;right:-14px;left:-14px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{background-color:transparent}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected:after{bottom:22px}@media (min-width:600px){.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-selected:after{bottom:-14px}}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.is-selected:before{border-left:transparent;border-width:1px;border-style:dashed}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks.has-overlay:after{display:none}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks.has-overlay .block-editor-inner-blocks.has-overlay:after{display:block}.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block{cursor:default}.block-editor-block-list__layout .block-editor-block-list__block[data-align=left],.block-editor-block-list__layout .block-editor-block-list__block[data-align=right]{z-index:21;width:100%;height:0}.block-editor-block-list__layout .block-editor-block-list__block[data-align=left]:before,.block-editor-block-list__layout .block-editor-block-list__block[data-align=right]:before{content:none}.block-editor-block-list__layout .block-editor-block-list__block[data-align=left]>.is-block-content{ + /*!rtl:begin:ignore*/float:left;margin-right:2em + /*!rtl:end:ignore*/}.block-editor-block-list__layout .block-editor-block-list__block[data-align=right]>.is-block-content{ + /*!rtl:begin:ignore*/float:right;margin-left:2em + /*!rtl:end:ignore*/}.block-editor-block-list__layout .block-editor-block-list__block[data-align=full],.block-editor-block-list__layout .block-editor-block-list__block[data-align=wide]{clear:both}.block-editor-block-list__layout .block-editor-block-list__block[data-align=full]{margin-left:-14px;margin-right:-14px}@media (min-width:600px){.block-editor-block-list__layout .block-editor-block-list__block[data-align=full]{margin-left:-58px;margin-right:-58px}}.block-editor-block-list__layout .block-editor-block-list__block[data-align=full]:before{left:0;right:0;border-left-width:0;border-right-width:0}.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{float:none}.block-editor-block-list__layout .block-editor-block-list__block .block-editor-block-list__layout .block-editor-default-block-appender .block-editor-inserter{left:auto;right:8px}.block-editor-block-list .block-editor-inserter{margin:8px;cursor:move;cursor:grab}.block-editor-block-list__insertion-point{position:relative;z-index:6;margin-top:-14px}.block-editor-block-list__insertion-point-indicator{position:absolute;top:calc(50% - 1px);height:2px;left:0;right:0;background:#0085ba}body.admin-color-sunrise .block-editor-block-list__insertion-point-indicator{background:#d1864a}body.admin-color-ocean .block-editor-block-list__insertion-point-indicator{background:#a3b9a2}body.admin-color-midnight .block-editor-block-list__insertion-point-indicator{background:#e14d43}body.admin-color-ectoplasm .block-editor-block-list__insertion-point-indicator{background:#a7b656}body.admin-color-coffee .block-editor-block-list__insertion-point-indicator{background:#c2a68c}body.admin-color-blue .block-editor-block-list__insertion-point-indicator{background:#82b4cb}body.admin-color-light .block-editor-block-list__insertion-point-indicator{background:#0085ba}.block-editor-block-list__insertion-point-inserter{display:none;justify-content:center;cursor:text}@media (min-width:480px){.block-editor-block-list__insertion-point-inserter{display:flex}}.block-editor-block-list__insertion-point-inserter.is-inserter-hidden .block-editor-inserter__toggle{opacity:0;pointer-events:none}.block-editor-block-list__block-popover-inserter{position:absolute;top:-9999em;margin-bottom:14px}.block-editor-block-list__block-popover-inserter.is-visible{position:static}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle{border-radius:50%;color:#007cba;background:#fff;height:28px;width:28px;padding:0;justify-content:center}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled=true]):hover,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled=true]):hover{box-shadow:none}.block-editor-block-list__block>.block-editor-block-list__insertion-point{position:absolute;top:-16px;height:28px;bottom:auto;left:14px;right:14px}.block-editor-block-list__block[data-align=full]>.block-editor-block-list__insertion-point{left:0;right:0}.block-editor-block-list__block .block-editor-block-list__block-html-textarea{display:block;margin:0;width:100%;border:none;outline:none;box-shadow:none;resize:none;overflow:hidden;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;line-height:150%;transition:padding .2s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-editor-block-list__block-html-textarea{transition-duration:0s}}.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{box-shadow:none}.block-editor-block-contextual-toolbar .block-editor-block-toolbar{width:100%}@media (min-width:600px){.block-editor-block-contextual-toolbar .block-editor-block-toolbar{width:auto;border-right:none}}.block-editor-block-list__breadcrumb{display:block;line-height:1;z-index:22}.block-editor-block-list__breadcrumb .components-toolbar{display:flex;background:#fff;border:1px solid #007cba;border-left:none;box-shadow:inset 3px 0 0 0 #007cba;height:38px;font-size:13px;line-height:29px;padding-left:8px;padding-right:8px}.block-editor-block-list__breadcrumb .components-toolbar .components-button{box-shadow:none}.is-dark-theme .block-editor-block-list__breadcrumb .components-toolbar{border-color:hsla(0,0%,100%,.45)}@media (min-width:600px){.block-editor-block-list__breadcrumb .components-toolbar{box-shadow:-3px 0 0 0 #007cba}}.block-editor-block-list__block .block-editor-warning{z-index:5;position:relative;margin-right:-14px;margin-left:-14px;margin-bottom:-14px;transform:translateY(-14px)}.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{margin-bottom:auto}.block-editor-block-list__insertion-point-popover{z-index:28}.block-editor-block-list__insertion-point-popover .components-popover__content{background:none;border:none;box-shadow:none;overflow-y:visible}.components-popover.block-editor-block-list__block-popover{z-index:29}.components-popover.block-editor-block-list__block-popover .components-popover__content{margin:0!important;min-width:auto;background:none;border:none;box-shadow:none;overflow-y:visible;pointer-events:none}.components-popover.block-editor-block-list__block-popover .components-popover__content>*{pointer-events:all}.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar,.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__breadcrumb{margin-bottom:13px;margin-left:-14px}.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar[data-align=full],.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__breadcrumb[data-align=full]{margin-left:0}.is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover{opacity:0}.block-editor-block-list__block .block-list-appender{margin:14px 0}.has-background .block-editor-block-list__block .block-list-appender{margin:32px 14px}.block-list-appender.is-drop-target>div:before{content:"";position:absolute;right:-14px;left:-14px;top:-14px;bottom:-14px;border:3px solid #0085ba}body.admin-color-sunrise .block-list-appender.is-drop-target>div:before{border:3px solid #d1864a}body.admin-color-ocean .block-list-appender.is-drop-target>div:before{border:3px solid #a3b9a2}body.admin-color-midnight .block-list-appender.is-drop-target>div:before{border:3px solid #e14d43}body.admin-color-ectoplasm .block-list-appender.is-drop-target>div:before{border:3px solid #a7b656}body.admin-color-coffee .block-list-appender.is-drop-target>div:before{border:3px solid #c2a68c}body.admin-color-blue .block-list-appender.is-drop-target>div:before{border:3px solid #82b4cb}body.admin-color-light .block-list-appender.is-drop-target>div:before{border:3px solid #0085ba}.block-list-appender>.block-editor-inserter{display:block}.block-editor-block-breadcrumb{list-style:none;padding:0;margin:0}.block-editor-block-breadcrumb li{display:inline-block;margin:0}.block-editor-block-breadcrumb li:not(:last-child):after{content:"\2192"}.block-editor-block-breadcrumb__button.components-button{height:24px;line-height:24px;padding:0}.block-editor-block-breadcrumb__button.components-button:hover{text-decoration:underline}.block-editor-block-breadcrumb__button.components-button:focus{color:#191e23;outline-offset:-1px;outline:1px dotted #555d66;outline-offset:-2px;box-shadow:none}.block-editor-block-breadcrumb__current{cursor:default}.block-editor-block-breadcrumb__button.components-button,.block-editor-block-breadcrumb__current{color:#555d66;padding:0 8px;font-size:inherit}.block-editor-block-card{display:flex;align-items:flex-start}.block-editor-block-card__icon{border:1px solid #ccd0d4;padding:7px;margin-right:10px;height:36px;width:36px}.block-editor-block-card__content{flex-grow:1}.block-editor-block-card__title{font-weight:500;margin-bottom:5px}.block-editor-block-card__description{font-size:13px}.block-editor-block-card .block-editor-block-icon{margin-left:-2px;margin-right:10px;padding:0 3px;width:36px;height:24px}.block-editor-block-compare{overflow:auto;height:auto}@media (min-width:600px){.block-editor-block-compare{max-height:70%}}.block-editor-block-compare__wrapper{display:flex;padding-bottom:16px}.block-editor-block-compare__wrapper>div{display:flex;justify-content:space-between;flex-direction:column;width:50%;padding:0 16px 0 0;min-width:200px}.block-editor-block-compare__wrapper>div button{float:right}.block-editor-block-compare__wrapper .block-editor-block-compare__converted{border-left:1px solid #ddd;padding-left:15px;padding-right:0}.block-editor-block-compare__wrapper .block-editor-block-compare__html{font-family:Menlo,Consolas,monaco,monospace;font-size:12px;color:#23282d;border-bottom:1px solid #ddd;padding-bottom:15px;line-height:1.7}.block-editor-block-compare__wrapper .block-editor-block-compare__html span{background-color:#e6ffed;padding-top:3px;padding-bottom:3px}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added{background-color:#acf2bd}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed{background-color:#d94f4f}.block-editor-block-compare__wrapper .block-editor-block-compare__preview{padding:14px 0 0}.block-editor-block-compare__wrapper .block-editor-block-compare__preview p{font-size:12px;margin-top:0}.block-editor-block-compare__wrapper .block-editor-block-compare__action{margin-top:14px}.block-editor-block-compare__wrapper .block-editor-block-compare__heading{font-size:1em;font-weight:400;margin:.67em 0}.block-editor-block-mobile-toolbar{display:flex;flex-direction:row;border-right:1px solid #e2e4e7}.block-editor-block-mobile-toolbar .block-editor-block-mover__control{width:36px;height:36px;border-radius:4px;padding:3px;margin:0;justify-content:center;align-items:center}.block-editor-block-mobile-toolbar .block-editor-block-mover__control .dashicon{margin:auto}.block-editor-block-mobile-toolbar .block-editor-block-mover{display:flex;margin-right:auto}.block-editor-block-mobile-toolbar .block-editor-block-mover .block-editor-block-mover__control{float:left}@media (min-width:600px){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal){display:block;position:absolute;top:37px;left:-38px;opacity:0;background:#fff;border:1px solid rgba(66,88,99,.4);border-radius:4px;transition:box-shadow .2s ease-out}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal){transition-duration:0s}}@media (min-width:600px){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal).is-visible{animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal).is-visible{animation-duration:1ms}}@media (min-width:600px){.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control{display:flex;align-items:center;justify-content:center;padding:0;border:none;width:28px;height:24px;color:rgba(14,28,46,.62)}.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control svg{width:28px;height:24px;padding:2px 5px}.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control[aria-disabled=true]{cursor:default;pointer-events:none;color:rgba(14,28,46,.62)}.block-editor-block-contextual-toolbar:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__control:focus:not(:disabled){background-color:transparent}}@media (min-width:600px){.block-editor-block-list__block:not([data-align=wide]):not([data-align=full]) .block-editor-block-mover:not(.is-horizontal){margin-top:0}}.block-editor-block-mover__control-drag-handle{cursor:move;cursor:grab;fill:currentColor}.block-editor-block-mover__control-drag-handle,.block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus,.block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none;background:none;color:rgba(10,24,41,.7)}.block-editor-block-mover__control-drag-handle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active{cursor:grabbing}.block-editor-block-mover.is-horizontal .block-editor-block-mover__control-drag-handle,.block-editor-block-mover__description{display:none}.block-editor-block-navigation__container{padding:7px}.block-editor-block-navigation__label{margin:0 0 8px;color:#6c7781}.block-editor-block-navigation__list,.block-editor-block-navigation__paragraph{padding:0;margin:0}.block-editor-block-navigation__list .block-editor-button-block-appender{outline:none;background:none;padding:8px;margin-left:.8em;width:36px;border-radius:4px}.block-editor-block-navigation__list .block-editor-button-block-appender:hover:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;background:#f3f4f5;outline:none}.block-editor-block-navigation__list .block-editor-button-block-appender:focus:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.block-editor-block-navigation__list .block-editor-block-navigation__list{margin-top:2px;border-left:2px solid #a2aab2;margin-left:1em}.block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__list{margin-left:1.5em}.block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item{position:relative}.block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item:before{position:absolute;left:0;background:#a2aab2;width:.5em;height:2px;content:"";top:calc(50% - 1px)}.block-editor-block-navigation__list .block-editor-block-navigation__list .block-editor-block-navigation__item-button{margin-left:.8em;width:calc(100% - .8em)}.block-editor-block-navigation__list .block-editor-block-navigation__list>li:last-child{position:relative}.block-editor-block-navigation__list .block-editor-block-navigation__list>li:last-child:after{position:absolute;content:"";background:#fff;top:19px;bottom:0;left:-2px;width:2px}.block-editor-block-navigation__item-button{display:flex;align-items:center;width:100%;padding:6px;text-align:left;color:#40464d;border-radius:4px}.block-editor-block-navigation__item-button .block-editor-block-icon{margin-right:6px}.block-editor-block-navigation__item-button:hover:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;background:#f3f4f5}.block-editor-block-navigation__item-button:focus:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.block-editor-block-navigation__item-button.is-selected,.block-editor-block-navigation__item-button.is-selected:focus{color:#32373c;background:#edeff0}.components-popover.block-editor-block-navigation__popover{z-index:99998}.block-editor-block-preview__container{position:relative;width:100%;overflow:hidden}.block-editor-block-preview__container.is-ready{overflow:visible}.block-editor-block-preview__content{position:absolute;top:0;left:0;transform-origin:top left;text-align:initial;margin:0;overflow:visible;min-height:auto}.block-editor-block-preview__content .block-editor-block-list__block,.block-editor-block-preview__content .block-editor-block-list__layout{padding:0}.block-editor-block-preview__content>div section{height:auto}.block-editor-block-preview__content .block-editor-block-drop-zone,.block-editor-block-preview__content .block-editor-block-list__insertion-point,.block-editor-block-preview__content .block-list-appender,.block-editor-block-preview__content .reusable-block-indicator{display:none}.block-editor-block-settings-menu .components-dropdown-menu__toggle svg{transform:rotate(90deg)}.block-editor-block-settings-menu__popover .components-dropdown-menu__menu{padding:0}.block-editor-block-styles{display:flex;flex-wrap:wrap;justify-content:space-between}.block-editor-block-styles__item{width:calc(50% - 4px);margin:4px 0;flex-shrink:0;cursor:pointer;overflow:hidden;border-radius:4px;padding:calc(37.5% - 6px) 6px 6px}.block-editor-block-styles__item:focus{color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2;outline:2px solid transparent}.block-editor-block-styles__item:hover{background:#f3f4f5;color:#191e23}.block-editor-block-styles__item.is-active{color:#191e23;box-shadow:inset 0 0 0 2px #555d66;outline:2px solid transparent;outline-offset:-2px}.block-editor-block-styles__item.is-active:focus{color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2,inset 0 0 0 2px #555d66;outline:4px solid transparent;outline-offset:-4px}.block-editor-block-styles__item-preview{outline:1px solid transparent;border:1px solid rgba(25,30,35,.2);border-radius:4px;display:flex;overflow:hidden;background:#fff;padding:75% 0 0;margin-top:-75%}.block-editor-block-styles__item-preview .block-editor-block-preview__container{padding-top:0;margin:-75% 0 0}.block-editor-block-styles__item-label{text-align:center;padding:4px 2px}.block-editor-block-switcher{position:relative;height:36px}.components-button.block-editor-block-switcher__no-switcher-icon,.components-button.block-editor-block-switcher__toggle{margin:0;display:block;height:36px;padding:3px}.components-button.block-editor-block-switcher__no-switcher-icon{width:48px}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{margin-right:auto;margin-left:auto}.components-button.block-editor-block-switcher__no-switcher-icon:disabled{border-radius:0;opacity:.84}.components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{color:#555d66!important;background:#f3f4f5!important}.components-button.block-editor-block-switcher__toggle{width:auto}.components-button.block-editor-block-switcher__toggle:active,.components-button.block-editor-block-switcher__toggle:not(:disabled):not([aria-disabled=true]):hover,.components-button.block-editor-block-switcher__toggle:not([aria-disabled=true]):focus{outline:none;box-shadow:none;background:none;border:none}.components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{width:42px;height:30px;position:relative;margin:0 auto;padding:3px;display:flex;align-items:center;transition:all .1s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{transition-duration:0s}}.components-button.block-editor-block-switcher__toggle .block-editor-block-icon:after{content:"";pointer-events:none;display:block;width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:5px solid;margin-left:4px;margin-right:2px}.components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{margin-top:6px;border-radius:4px}.components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-switcher__transform,.components-button.block-editor-block-switcher__toggle:not(:disabled):hover .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle:not(:disabled):hover .block-editor-block-switcher__transform,.components-button.block-editor-block-switcher__toggle[aria-expanded=true] .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle[aria-expanded=true] .block-editor-block-switcher__transform{transform:translateY(-36px)}.components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle:not(:disabled):focus .block-editor-block-switcher__transform{box-shadow:inset 0 0 0 1px #555d66,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-popover.block-editor-block-switcher__popover .components-popover__content{min-width:300px;max-width:680px;display:flex;background:#fff;box-shadow:0 3px 30px rgba(25,30,35,.1)}.block-editor-block-switcher__popover .components-popover__content .block-editor-block-switcher__container{min-width:300px;max-width:340px;width:50%}@media (min-width:782px){.block-editor-block-switcher__popover .components-popover__content{position:relative}.block-editor-block-switcher__popover .components-popover__content .block-editor-block-switcher__preview{border-left:1px solid #e2e4e7;box-shadow:0 3px 30px rgba(25,30,35,.1);background:#fff;width:300px;height:auto;position:-webkit-sticky;position:sticky;-ms-grid-row-align:stretch;align-self:stretch;top:0;padding:10px}}.block-editor-block-switcher__popover .components-popover__content .components-panel__body{border:0;position:relative;z-index:1}.block-editor-block-switcher__popover .components-popover__content .components-panel__body+.components-panel__body{border-top:1px solid #e2e4e7}.block-editor-block-switcher__popover .block-editor-block-styles{margin:0 -3px}.block-editor-block-switcher__popover .block-editor-block-types-list{margin:8px -8px -8px}.block-editor-block-switcher__preview-title{margin-bottom:10px;color:#6c7781}.block-editor-block-toolbar{display:flex;flex-grow:1;width:100%;overflow:auto;position:relative;border-left:1px solid #b5bcc2;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-toolbar{transition-duration:0s}}@media (min-width:600px){.block-editor-block-toolbar{overflow:inherit;border-left:none;box-shadow:-3px 0 0 0 #555d66}.is-dark-theme .block-editor-block-toolbar{box-shadow:-3px 0 0 0 #d7dade}}.block-editor-block-toolbar .components-toolbar{border:0;border-top:1px solid #b5bcc2;border-bottom:1px solid #b5bcc2;border-right:1px solid #b5bcc2;line-height:0}.has-fixed-toolbar .block-editor-block-toolbar{box-shadow:none;border-left:1px solid #e2e4e7}.has-fixed-toolbar .block-editor-block-toolbar .components-toolbar{border-color:#e2e4e7}.block-editor-block-toolbar__slot{display:inline-block;line-height:0}@supports ((position:-webkit-sticky) or (position:sticky)){.block-editor-block-toolbar__slot{display:inline-flex}}.block-editor-block-types-list{list-style:none;padding:4px;margin-left:-4px;margin-right:-4px;overflow:hidden;display:flex;flex-wrap:wrap}.block-editor-block-variation-picker .components-placeholder__instructions{margin-bottom:0}.block-editor-block-variation-picker .components-placeholder__fieldset{flex-direction:column}.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{max-width:90%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{display:flex;justify-content:flex-start;flex-direction:row;flex-wrap:wrap;width:100%;margin:16px 0;padding:0;list-style:none}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{list-style:none;margin:4px 8px 4px 0;flex-shrink:1;max-width:100px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{padding:8px}.block-editor-block-variation-picker__variation{width:100%}.block-editor-block-variation-picker__variation.components-button.has-icon{justify-content:center}.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{background-color:#fff}.block-editor-block-variation-picker__variation.components-button{height:auto;padding:0}.block-editor-block-variation-picker__variation:before{content:"";padding-bottom:100%}.block-editor-block-variation-picker__variation:first-child{margin-left:0}.block-editor-block-variation-picker__variation:last-child{margin-right:0}.block-editor-button-block-appender{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:14px;outline:1px dashed #8d96a0;width:100%;height:auto;color:#555d66;background:rgba(237,239,240,.8)}.block-editor-button-block-appender:focus,.block-editor-button-block-appender:hover{outline:1px dashed #555d66;color:#191e23}.block-editor-button-block-appender:active{outline:1px dashed #191e23;color:#191e23}.is-dark-theme .block-editor-button-block-appender{background:rgba(50,55,60,.7);color:#f8f9f9}.is-dark-theme .block-editor-button-block-appender:focus,.is-dark-theme .block-editor-button-block-appender:hover{outline:1px dashed #fff}.block-editor-color-gradient-control__color-indicator{margin-bottom:8px}.block-editor-color-gradient-control__button-tabs{display:block;margin-bottom:8px}.block-editor-panel-color-gradient-settings .component-color-indicator{vertical-align:text-bottom}.block-editor-panel-color-gradient-settings__panel-title .component-color-indicator{display:inline-block}.block-editor-panel-color-gradient-settings.is-opened .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator{display:none}.block-editor-contrast-checker>.components-notice{margin:0}.block-editor-default-block-appender{clear:both;margin-left:auto;margin-right:auto;position:relative}.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{outline:1px solid transparent}.block-editor-default-block-appender textarea.block-editor-default-block-appender__content{font-family:"Noto Serif",serif;font-size:16px;border:none;background:none;box-shadow:none;display:block;cursor:text;width:100%;outline:1px solid transparent;transition:outline .2s;resize:none;margin-top:28px;margin-bottom:28px;padding:0 50px 0 14px;color:rgba(14,28,46,.62)}@media (prefers-reduced-motion:reduce){.block-editor-default-block-appender textarea.block-editor-default-block-appender__content{transition-duration:0s}}.is-dark-theme .block-editor-default-block-appender textarea.block-editor-default-block-appender__content{color:hsla(0,0%,100%,.65)}.block-editor-default-block-appender .components-drop-zone__content-icon{display:none}.block-editor-default-block-appender__content{min-height:28px;line-height:1.8}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{position:absolute;top:0;height:28px}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .components-button.has-icon,.block-editor-default-block-appender .block-editor-inserter .components-button.has-icon{width:28px;height:28px;padding:0}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .components-button svg,.block-editor-default-block-appender .block-editor-inserter .components-button svg{display:block;margin:auto}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle,.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle{margin-right:0}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover,.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{right:8px}@media (min-width:600px){.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{display:flex;height:100%}}.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{display:none}.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle,.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle{border-radius:50%;width:28px;height:28px;padding:0}.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover),.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover){color:rgba(10,24,41,.7)}.is-dark-theme .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle:not(:hover),.is-dark-theme .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle:not(:hover){color:hsla(0,0%,100%,.75)}@media (min-width:600px){.block-editor-default-block-appender .block-editor-inserter{align-items:center}}html.block-editor-editor-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.block-editor-editor-skeleton__html-container{position:static;width:auto}}.block-editor-editor-skeleton{display:flex;flex-direction:column;height:auto;max-height:100%;position:fixed;top:46px;right:0;bottom:0}@media (min-width:782px){.block-editor-editor-skeleton{top:32px}.is-fullscreen-mode .block-editor-editor-skeleton{top:0}}.block-editor-editor-skeleton{left:0}@media (min-width:782px){.block-editor-editor-skeleton{left:160px}}@media (min-width:782px){.auto-fold .block-editor-editor-skeleton{left:36px}}@media (min-width:961px){.auto-fold .block-editor-editor-skeleton{left:160px}}.folded .block-editor-editor-skeleton{left:0}@media (min-width:782px){.folded .block-editor-editor-skeleton{left:36px}}@media (max-width:782px){.auto-fold .wp-responsive-open .block-editor-editor-skeleton{left:190px}}@media (max-width:600px){.auto-fold .wp-responsive-open .block-editor-editor-skeleton{margin-left:-18px}}body.is-fullscreen-mode .block-editor-editor-skeleton{left:0!important}.block-editor-editor-skeleton__body{flex-grow:1;display:flex;overflow:auto;overscroll-behavior-y:none}.block-editor-editor-skeleton__content{flex-grow:1;display:flex;flex-direction:column}@media (min-width:782px){.block-editor-editor-skeleton__content{overflow:auto}}.block-editor-editor-skeleton__sidebar{display:none}@media (min-width:782px){.block-editor-editor-skeleton__sidebar{display:block;z-index:100000;position:fixed!important;top:-9999em;bottom:auto;left:auto;right:0;width:280px}.block-editor-editor-skeleton__sidebar:focus{top:auto;bottom:0}}.is-sidebar-opened .block-editor-editor-skeleton__sidebar{display:block;width:auto;flex-shrink:0;position:absolute;z-index:100000;top:0;right:0;bottom:0;left:0;background:#fff}@media (min-width:782px){.is-sidebar-opened .block-editor-editor-skeleton__sidebar{overflow:auto;border-left:1px solid #e2e4e7;position:relative!important;z-index:90}}.block-editor-editor-skeleton__header{flex-shrink:0;height:auto;border-bottom:1px solid #e2e4e7;z-index:30;position:-webkit-sticky;position:sticky;top:0}@media (min-width:600px){.block-editor-editor-skeleton__header{position:static;top:0}}.block-editor-editor-skeleton__footer{height:auto;flex-shrink:0;overflow:auto;border-top:1px solid #e2e4e7;display:none}@media (min-width:782px){.block-editor-editor-skeleton__footer{display:block}}.block-editor-editor-skeleton__publish{z-index:100000;position:fixed!important;top:-9999em;bottom:auto;left:auto;right:0;width:280px}.block-editor-editor-skeleton__publish:focus{top:auto;bottom:0}.block-editor-link-control{position:relative;min-width:360px}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{width:calc(100% - 32px);display:block;margin:16px;padding:11px 36px 11px 16px;position:relative;border:1px solid #e1e1e1;border-radius:4px;font-size:16px}@media (min-width:600px){.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{font-size:13px}}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:focus{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.block-editor-link-control__search-actions{position:absolute;top:19px;right:19px}.block-editor-link-control__search-results-wrapper{position:relative;margin-top:-15px}.block-editor-link-control__search-results-wrapper:after,.block-editor-link-control__search-results-wrapper:before{content:"";position:absolute;left:-1px;right:16px;display:block;pointer-events:none;z-index:100}.block-editor-link-control__search-results-wrapper:before{height:8px;top:0;bottom:auto;background:linear-gradient(180deg,#fff 0,hsla(0,0%,100%,0))}.block-editor-link-control__search-results-wrapper:after{height:16px;bottom:0;top:auto;background:linear-gradient(180deg,hsla(0,0%,100%,0) 0,#fff)}.block-editor-link-control__search-results-label{padding:15px 30px 0;display:block;font-size:1.1em}.block-editor-link-control__search-results{margin:0;padding:8px 16px 16px;max-height:200px;overflow-y:auto}.block-editor-link-control__search-results.is-loading{opacity:.2}.block-editor-link-control__search-item{position:relative;display:flex;align-items:center;font-size:13px;cursor:pointer;background:#fff;width:100%;border:none;text-align:left;padding:10px 15px;border-radius:5px;height:auto}.block-editor-link-control__search-item:focus,.block-editor-link-control__search-item:hover{background-color:#e9e9e9}.block-editor-link-control__search-item.is-selected{background:#f2f2f2}.block-editor-link-control__search-item.is-selected .block-editor-link-control__search-item-type{background:#fff}.block-editor-link-control__search-item.is-current{background:transparent;border:0;width:100%;cursor:default;padding:16px 16px 16px 24px}.block-editor-link-control__search-item .block-editor-link-control__search-item-header{display:block;margin-right:24px;overflow:hidden;white-space:nowrap}.block-editor-link-control__search-item .block-editor-link-control__search-item-icon{margin-right:1em;min-width:24px}.block-editor-link-control__search-item .block-editor-link-control__search-item-info,.block-editor-link-control__search-item .block-editor-link-control__search-item-title{max-width:230px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.block-editor-link-control__search-item .block-editor-link-control__search-item-title{display:block;margin-bottom:.2em;font-weight:500}.block-editor-link-control__search-item .block-editor-link-control__search-item-title mark{font-weight:700;color:#000;background-color:transparent}.block-editor-link-control__search-item .block-editor-link-control__search-item-title span{font-weight:400}.block-editor-link-control__search-item .block-editor-link-control__search-item-info{display:block;color:#999;font-size:.9em;line-height:1.3}.block-editor-link-control__search-item .block-editor-link-control__search-item-type{display:block;padding:3px 8px;margin-left:auto;font-size:.9em;background-color:#f3f4f5;border-radius:2px}.block-editor-link-control__search-results div[role=menu]>.block-editor-link-control__search-item.block-editor-link-control__search-item{padding:10px}.block-editor-link-control__settings{border-top:1px solid #e1e1e1;margin:0;padding:16px 24px}.block-editor-link-control__settings :last-child{margin-bottom:0}.block-editor-link-control__setting{margin-bottom:16px}.block-editor-link-control__setting :last-child{margin-bottom:0}.block-editor-link-control .block-editor-link-control__search-input .components-spinner{display:block}.block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner{position:absolute;left:auto;bottom:auto;top:28px;right:62px}.block-editor-link-control__search-item-action{margin-left:auto;flex-shrink:0}.block-editor-image-size-control{margin-bottom:1em}.block-editor-image-size-control .block-editor-image-size-control__row{display:flex;justify-content:space-between}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height,.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width{margin-bottom:.5em}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height input,.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width input{line-height:1.25}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width{margin-right:5px}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height{margin-left:5px}.block-editor-inner-blocks.has-overlay:after{content:"";position:absolute;top:-14px;right:-14px;bottom:-14px;left:-14px;z-index:60}[data-align=full] .has-overlay:after{right:0;left:0}.block-editor-inserter{display:inline-block;background:none;border:none;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.4}@media (min-width:782px){.block-editor-inserter{position:relative}}@media (min-width:782px){.block-editor-inserter__popover>.components-popover__content{overflow-y:visible;height:432px}}.block-editor-inserter__toggle{transition:color .2s ease}@media (prefers-reduced-motion:reduce){.block-editor-inserter__toggle{transition-duration:0s}}.block-editor-inserter__menu{height:100%;display:flex;width:auto}@media (min-width:782px){.block-editor-inserter__menu{width:400px;position:relative}.block-editor-inserter__menu.has-help-panel{width:700px}}.block-editor-inserter__main-area{width:auto;display:flex;flex-direction:column;height:100%}@media (min-width:782px){.block-editor-inserter__main-area{width:400px;position:relative}}.block-editor-inserter__inline-elements{margin-top:-1px}.block-editor-inserter__menu.is-bottom:after{border-bottom-color:#fff}.components-popover.block-editor-inserter__popover{z-index:99998}.components-popover input[type=search].block-editor-inserter__search{display:block;margin:16px;padding:11px 16px;position:relative;z-index:1;border-radius:4px;font-size:16px}@media (min-width:600px){.components-popover input[type=search].block-editor-inserter__search{font-size:13px}}.components-popover input[type=search].block-editor-inserter__search:focus{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.block-editor-inserter__results{flex-grow:1;overflow:auto;position:relative;z-index:1;padding:0 16px 16px}.block-editor-inserter__results:focus{outline:1px dotted #555d66}@media (min-width:782px){.block-editor-inserter__results{height:394px}}.block-editor-inserter__results [role=presentation]+.components-panel__body{border-top:none}.block-editor-inserter__popover .block-editor-block-types-list{margin:0 -8px}.block-editor-inserter__reusable-blocks-panel{position:relative;text-align:right}.block-editor-inserter__manage-reusable-blocks{margin:16px 0 0 16px}.block-editor-inserter__no-results{font-style:italic;padding:24px;text-align:center}.block-editor-inserter__child-blocks{padding:0 16px}.block-editor-inserter__parent-block-header{display:flex;align-items:center}.block-editor-inserter__parent-block-header h2{font-size:13px}.block-editor-inserter__parent-block-header .block-editor-block-icon{margin-right:8px}.block-editor-inserter__menu-help-panel{display:none;border-left:1px solid #e2e4e7;width:300px;height:100%;padding:20px;overflow-y:auto}@media (min-width:782px){.block-editor-inserter__menu-help-panel{display:flex;flex-direction:column}}.block-editor-inserter__menu-help-panel .block-editor-block-card{padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid #e2e4e7;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-inserter__menu-help-panel .block-editor-block-card{animation-duration:1ms}}.block-editor-inserter__menu-help-panel .block-editor-inserter__preview{display:flex;flex-grow:2}.block-editor-inserter__menu-help-panel-no-block{display:flex;height:100%;flex-direction:column;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-inserter__menu-help-panel-no-block{animation-duration:1ms}}.block-editor-inserter__menu-help-panel-no-block .block-editor-inserter__menu-help-panel-no-block-text{flex-grow:1}.block-editor-inserter__menu-help-panel-no-block .block-editor-inserter__menu-help-panel-no-block-text h4{font-size:18px}.block-editor-inserter__menu-help-panel-no-block .components-notice{margin:0}.block-editor-inserter__menu-help-panel-no-block h4{margin-top:0}.block-editor-inserter__menu-help-panel-hover-area{flex-grow:1;margin-top:20px;padding:20px;border:1px dotted #e2e4e7;display:flex;align-items:center;text-align:center}.block-editor-inserter__menu-help-panel-title{font-size:18px;font-weight:600;margin-bottom:20px}.block-editor-inserter__preview-content{border:1px solid #e2e4e7;border-radius:4px;min-height:150px;display:-ms-grid;display:grid;flex-grow:2}.block-editor-inserter__preview-content .block-editor-block-preview__container{margin-right:0;margin-left:0;padding:10px}.block-editor-inserter__preview-content-missing{flex:1;display:flex;justify-content:center;color:#606a73;border:1px solid #e2e4e7;border-radius:4px;align-items:center}.block-editor-block-types-list__list-item{display:block;width:33.33%;padding:0;margin:0 0 12px}.components-button.block-editor-block-types-list__item{display:flex;flex-direction:column;width:100%;font-size:13px;color:#32373c;padding:0 4px;align-items:stretch;justify-content:center;cursor:pointer;background:transparent;word-break:break-word;border-radius:4px;border:1px solid transparent;transition:all .05s ease-in-out;position:relative;height:auto}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-types-list__item{transition-duration:0s}}.components-button.block-editor-block-types-list__item:disabled{opacity:.6;cursor:default}.components-button.block-editor-block-types-list__item:not(:disabled):hover:before{content:"";display:block;background:#f3f4f5;color:#191e23;position:absolute;z-index:-1;border-radius:4px;top:0;right:0;bottom:0;left:0}.components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-icon,.components-button.block-editor-block-types-list__item:not(:disabled):hover .block-editor-block-types-list__item-title{color:inherit}.components-button.block-editor-block-types-list__item:not(:disabled):active,.components-button.block-editor-block-types-list__item:not(:disabled):focus{position:relative;color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2;outline:2px solid transparent;background:transparent}.components-button.block-editor-block-types-list__item:not(:disabled):active .block-editor-block-types-list__item-icon,.components-button.block-editor-block-types-list__item:not(:disabled):active .block-editor-block-types-list__item-title,.components-button.block-editor-block-types-list__item:not(:disabled):focus .block-editor-block-types-list__item-icon,.components-button.block-editor-block-types-list__item:not(:disabled):focus .block-editor-block-types-list__item-title{color:inherit}.components-button.block-editor-block-types-list__item:not(:disabled).is-active{color:#191e23;box-shadow:inset 0 0 0 2px #555d66;outline:2px solid transparent;outline-offset:-2px}.components-button.block-editor-block-types-list__item:not(:disabled).is-active:focus{color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2,inset 0 0 0 2px #555d66;outline:4px solid transparent;outline-offset:-4px}.block-editor-block-types-list__item-icon{padding:12px 20px;border-radius:4px;color:#555d66;transition:all .05s ease-in-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon{transition-duration:0s}}.block-editor-block-types-list__item-icon .block-editor-block-icon{margin-left:auto;margin-right:auto}.block-editor-block-types-list__item-icon svg{transition:all .15s ease-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon svg{transition-duration:0s}}.block-editor-block-types-list__item-title{padding:4px 2px 8px}.modal-open .block-editor-media-replace-flow__options{display:none}.block-editor-media-replace-flow__indicator{margin-left:4px}.block-editor-media-replace-flow__indicator:after{content:"";pointer-events:none;display:block;width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:5px solid;margin-left:4px;margin-right:2px}.block-editor-media-flow__url-input{max-width:255px;padding:0 15px 10px}.block-editor-media-flow__url-input input{max-width:180px}.block-editor-media-replace-flow__link-viewer .components-external-link__icon{display:none}.block-editor-media-replace-flow__link-viewer .components-visually-hidden{position:static}.block-editor-media-replace-flow__link-viewer .components-button{flex-shrink:0}.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{margin-bottom:0}.block-editor-media-placeholder__url-input-form{display:flex}.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:100%;flex-grow:1;border:none;border-radius:0;margin:2px}@media (min-width:600px){.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:300px}}.block-editor-media-placeholder__url-input-submit-button{flex-shrink:1}.block-editor-media-placeholder__button{margin-bottom:.5rem}.block-editor-media-placeholder__button .dashicon{vertical-align:middle;margin-bottom:3px}.block-editor-media-placeholder__button:hover{color:#23282d}.block-editor-media-placeholder__cancel-button.is-link{margin:1em;display:block}.block-editor-media-placeholder.is-appender{min-height:100px;outline:1px dashed #8d96a0}.block-editor-media-placeholder.is-appender:hover{outline:1px dashed #555d66;cursor:pointer}.is-dark-theme .block-editor-media-placeholder.is-appender:hover{outline:1px dashed #fff}.block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button{margin-right:4px}.block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button.components-button:focus,.block-editor-media-placeholder.is-appender .block-editor-media-placeholder__upload-button.components-button:hover{box-shadow:none;border:1px solid #555d66}.block-editor-multi-selection-inspector__card{display:flex;align-items:flex-start;padding:16px}.block-editor-multi-selection-inspector__card-content{flex-grow:1}.block-editor-multi-selection-inspector__card-title{font-weight:500;margin-bottom:5px}.block-editor-multi-selection-inspector__card-description{font-size:13px}.block-editor-multi-selection-inspector__card .block-editor-block-icon{margin-left:-2px;margin-right:10px;padding:0 3px;width:36px;height:24px}.block-editor .block-editor-plain-text{box-shadow:none;font-family:inherit;font-size:inherit;color:inherit;line-height:inherit;border:none;padding:0;margin:0;width:100%}.block-editor-responsive-block-control{margin-bottom:28px;border-bottom:1px solid #d7dade;padding-bottom:14px}.block-editor-responsive-block-control:last-child{padding-bottom:0;border-bottom:0}.block-editor-responsive-block-control__title{margin:0 0 .6em -3px}.block-editor-responsive-block-control__label{font-weight:600;margin-bottom:.6em;margin-left:-3px}.block-editor-responsive-block-control__inner{margin-left:-1px}.block-editor-responsive-block-control__toggle{margin-left:1px}.block-editor-responsive-block-control .components-base-control__help{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;width:1px;word-wrap:normal!important}.block-editor-format-toolbar .components-dropdown-menu__toggle .components-dropdown-menu__indicator:after{margin:7px}.block-editor-rich-text__editable>p:first-child{margin-top:0}.block-editor-rich-text__editable a{color:#007fac}.block-editor-rich-text__editable code{padding:2px;border-radius:2px;color:#23282d;background:#f3f4f5;font-family:Menlo,Consolas,monaco,monospace;font-size:inherit}.block-editor-rich-text__editable [data-rich-text-placeholder]{pointer-events:none}.block-editor-rich-text__editable [data-rich-text-placeholder]:after{content:attr(data-rich-text-placeholder);opacity:.62}.block-editor-rich-text__editable:focus{outline:none}.block-editor-rich-text__editable:focus [data-rich-text-format-boundary]{border-radius:2px}.block-editor-rich-text__editable:focus:not(.keep-placeholder-on-focus) [data-rich-text-placeholder]:after{display:none}figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{opacity:.8}.components-popover.block-editor-rich-text__inline-format-toolbar{z-index:99998}.components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content{min-width:auto;margin-bottom:6px}.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar{border:none}.block-editor-skip-to-selected-block{position:absolute;top:-9999em}.block-editor-skip-to-selected-block:focus{height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#11a0d2;line-height:normal;box-shadow:0 0 2px 2px rgba(0,0,0,.6);text-decoration:none;outline:none;z-index:100000}body.admin-color-sunrise .block-editor-skip-to-selected-block:focus{color:#c8b03c}body.admin-color-ocean .block-editor-skip-to-selected-block:focus{color:#a89d8a}body.admin-color-midnight .block-editor-skip-to-selected-block:focus{color:#77a6b9}body.admin-color-ectoplasm .block-editor-skip-to-selected-block:focus{color:#c77430}body.admin-color-coffee .block-editor-skip-to-selected-block:focus{color:#9fa47b}body.admin-color-blue .block-editor-skip-to-selected-block:focus{color:#d9ab59}body.admin-color-light .block-editor-skip-to-selected-block:focus{color:#c75726}.block-editor-tool-selector__help{padding:16px;border-top:1px solid #e2e4e7;color:#6c7781}.block-editor-block-list__block .block-editor-url-input,.block-editor-url-input,.components-popover .block-editor-url-input{flex-grow:1;position:relative;padding:1px}.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{width:100%;padding:8px;border:none;border-radius:0;margin-left:0;margin-right:0;font-size:16px}@media (min-width:600px){.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{width:300px}}@media (min-width:600px){.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{font-size:13px}}.block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear,.block-editor-url-input input[type=text]::-ms-clear,.components-popover .block-editor-url-input input[type=text]::-ms-clear{display:none}.block-editor-block-list__block .block-editor-url-input.has-border input[type=text],.block-editor-url-input.has-border input[type=text],.components-popover .block-editor-url-input.has-border input[type=text]{border:1px solid #555d66;border-radius:4px}.block-editor-block-list__block .block-editor-url-input.is-full-width,.block-editor-url-input.is-full-width,.components-popover .block-editor-url-input.is-full-width{width:100%}.block-editor-block-list__block .block-editor-url-input.is-full-width input[type=text],.block-editor-url-input.is-full-width input[type=text],.components-popover .block-editor-url-input.is-full-width input[type=text]{width:100%}.block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions,.block-editor-url-input.is-full-width__suggestions,.components-popover .block-editor-url-input.is-full-width__suggestions{width:100%}.block-editor-block-list__block .block-editor-url-input .components-spinner,.block-editor-url-input .components-spinner,.components-popover .block-editor-url-input .components-spinner{position:absolute;right:8px;bottom:17px;margin:0}.block-editor-url-input__suggestions{max-height:200px;transition:all .15s ease-in-out;padding:4px 0;width:302px;overflow-y:auto}@media (prefers-reduced-motion:reduce){.block-editor-url-input__suggestions{transition-duration:0s}}.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:none}@media (min-width:600px){.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:inherit}}.block-editor-url-input__suggestion{padding:4px 8px;color:#6c7781;display:block;font-size:13px;cursor:pointer;background:#fff;width:100%;text-align:left;border:none;box-shadow:none}.block-editor-url-input__suggestion:hover{background:#e2e4e7}.block-editor-url-input__suggestion.is-selected,.block-editor-url-input__suggestion:focus{background:#00719e;color:#fff;outline:none}body.admin-color-sunrise .block-editor-url-input__suggestion.is-selected,body.admin-color-sunrise .block-editor-url-input__suggestion:focus{background:#b2723f}body.admin-color-ocean .block-editor-url-input__suggestion.is-selected,body.admin-color-ocean .block-editor-url-input__suggestion:focus{background:#8b9d8a}body.admin-color-midnight .block-editor-url-input__suggestion.is-selected,body.admin-color-midnight .block-editor-url-input__suggestion:focus{background:#bf4139}body.admin-color-ectoplasm .block-editor-url-input__suggestion.is-selected,body.admin-color-ectoplasm .block-editor-url-input__suggestion:focus{background:#8e9b49}body.admin-color-coffee .block-editor-url-input__suggestion.is-selected,body.admin-color-coffee .block-editor-url-input__suggestion:focus{background:#a58d77}body.admin-color-blue .block-editor-url-input__suggestion.is-selected,body.admin-color-blue .block-editor-url-input__suggestion:focus{background:#6f99ad}body.admin-color-light .block-editor-url-input__suggestion.is-selected,body.admin-color-light .block-editor-url-input__suggestion:focus{background:#00719e}.components-toolbar>.block-editor-url-input__button{position:inherit}.block-editor-url-input__button .block-editor-url-input__back{margin-right:4px;overflow:visible}.block-editor-url-input__button .block-editor-url-input__back:after{content:"";position:absolute;display:block;width:1px;height:24px;right:-1px;background:#e2e4e7}.block-editor-url-input__button-modal{box-shadow:0 3px 30px rgba(25,30,35,.1);border:1px solid #e2e4e7;background:#fff}.block-editor-url-input__button-modal-line{display:flex;flex-direction:row;flex-grow:1;flex-shrink:1;min-width:0;align-items:flex-start}.block-editor-url-input__button-modal-line .components-button{flex-shrink:0;width:36px;height:36px}.block-editor-url-popover__additional-controls{border-top:1px solid #e2e4e7}.block-editor-url-popover__additional-controls>div[role=menu] .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary)>svg{box-shadow:none}.block-editor-url-popover__additional-controls div[role=menu]>.components-button{padding-left:2px}.block-editor-url-popover__row{display:flex}.block-editor-url-popover__row>:not(.block-editor-url-popover__settings-toggle){flex-grow:1}.block-editor-url-popover .components-button.has-icon{padding:3px}.block-editor-url-popover .components-button.has-icon>svg{padding:5px;border-radius:4px;height:30px;width:30px}.block-editor-url-popover .components-button.has-icon:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.block-editor-url-popover .components-button.has-icon:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover>svg{color:#555d66;box-shadow:inset 0 0 0 1px #555d66,inset 0 0 0 2px #fff}.block-editor-url-popover .components-button.has-icon:not(:disabled):focus{box-shadow:none}.block-editor-url-popover .components-button.has-icon:not(:disabled):focus>svg{box-shadow:inset 0 0 0 1px #555d66,inset 0 0 0 2px #fff;outline:2px solid transparent}.block-editor-url-popover__settings-toggle{flex-shrink:0;border-radius:0;border-left:1px solid #e2e4e7;margin-left:1px}.block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon{transform:rotate(180deg)}.block-editor-url-popover__input-container .components-base-control:last-child,.block-editor-url-popover__input-container .components-base-control:last-child .components-base-control__field{margin-bottom:0}.block-editor-url-popover__settings{display:block;padding:16px;border-top:1px solid #e2e4e7}.block-editor-url-popover__link-editor,.block-editor-url-popover__link-viewer{display:flex}.block-editor-url-popover__link-editor .block-editor-url-input .components-base-control__field,.block-editor-url-popover__link-viewer .block-editor-url-input .components-base-control__field{margin-bottom:0}.block-editor-url-popover__link-editor .block-editor-url-input .components-spinner,.block-editor-url-popover__link-viewer .block-editor-url-input .components-spinner{bottom:9px}.block-editor-url-popover__link-viewer-url{margin:7px;flex-grow:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-url-popover__link-viewer-url.has-invalid-link{color:#d94f4f}.block-editor-warning{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:nowrap;background-color:#fff;border:1px solid #e2e4e7;text-align:left;padding:10px 14px 14px}.is-selected .block-editor-warning{border-color:rgba(66,88,99,.4)}@media (min-width:600px){.is-selected .block-editor-warning{border-left-color:transparent}}.is-dark-theme .is-selected .block-editor-warning{border-color:hsla(0,0%,100%,.45)}.block-editor-warning .block-editor-warning__message{line-height:1.4;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;margin:1em 0}.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{min-height:auto}.block-editor-warning .block-editor-warning__contents{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap;align-items:baseline;width:100%}.block-editor-warning .block-editor-warning__actions{display:flex}.block-editor-warning .block-editor-warning__action{margin:0 6px 0 0}.block-editor-warning__secondary{margin:5px 0 0 -4px;height:36px}.block-editor-warning__secondary .components-button.has-icon{width:auto;padding:0 2px}@media (min-width:600px){.block-editor-warning__secondary{margin-left:4px}.block-editor-warning__secondary .components-button.has-icon{padding:0 4px}}.block-editor-warning__secondary .components-button svg{transform:rotate(90deg)}.block-editor-writing-flow{display:flex;flex-direction:column}.block-editor-writing-flow__click-redirect{cursor:text}.html-anchor-control .components-external-link{display:block;margin-top:8px} \ No newline at end of file diff --git a/wp-includes/css/dist/block-library/editor-rtl.css b/wp-includes/css/dist/block-library/editor-rtl.css new file mode 100644 index 0000000..493c8e8 --- /dev/null +++ b/wp-includes/css/dist/block-library/editor-rtl.css @@ -0,0 +1,1535 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.block-editor ul.wp-block-archives { + padding-right: 2.5em; } + +.wp-block-audio { + margin-right: 0; + margin-left: 0; } + +.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow__click-redirect { + min-height: auto; } + +.block-editor-block-list__block[data-type="core/button"][data-align="center"] { + text-align: center; + margin-right: auto; + margin-left: auto; } + +.block-editor-block-list__block[data-type="core/button"][data-align="right"] { + text-align: right; } + +.wp-block-button { + position: relative; } + .wp-block-button [contenteditable] { + cursor: text; } + .wp-block-button:not(.has-text-color):not(.is-style-outline) [data-rich-text-placeholder]::after { + color: #fff; } + .wp-block-button .block-editor-rich-text__editable:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2; + outline: 2px solid transparent; + outline-offset: -2px; } + .wp-block-button [data-rich-text-placeholder]::after { + opacity: 0.8; } + +.wp-block-button__inline-link { + color: #555d66; + height: 0; + overflow: hidden; + max-width: 290px; } + .wp-block-button__inline-link-input__suggestions { + max-width: 290px; } + @media (min-width: 782px) { + .wp-block-button__inline-link { + max-width: 260px; } + .wp-block-button__inline-link-input__suggestions { + max-width: 260px; } } + @media (min-width: 960px) { + .wp-block-button__inline-link { + max-width: 290px; } + .wp-block-button__inline-link-input__suggestions { + max-width: 290px; } } + .is-selected .wp-block-button__inline-link, + .is-typing .wp-block-button__inline-link { + height: auto; + overflow: visible; + margin-top: 16px; } + +div[data-type="core/button"] { + display: table; } + +.wp-block-buttons .wp-block.block-editor-block-list__block[data-type="core/button"] { + display: inline-block; + width: auto; } + +.wp-block-buttons[data-align="center"] .block-editor-block-list__layout { + display: flex; + align-items: center; + flex-wrap: wrap; + justify-content: center; } + +.wp-block-buttons[data-align="right"] .block-editor-block-list__layout { + display: flex; + justify-content: flex-end; } + +.wp-block-buttons .block-list-appender { + display: inline-block; + margin: 0; } + +.wp-block-buttons .block-editor-block-list__layout > div:last-child { + display: inline-block; } + +.wp-block-buttons .block-editor-button-block-appender { + background: none; + outline: none; } + +.block-editor .wp-block-categories ul { + padding-right: 2.5em; } + .block-editor .wp-block-categories ul ul { + margin-top: 6px; } + +.wp-block-code .block-editor-plain-text { + font-family: Menlo, Consolas, monaco, monospace; + color: #23282d; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .wp-block-code .block-editor-plain-text { + font-size: 13px; } } + .wp-block-code .block-editor-plain-text:focus { + box-shadow: none; } + +.wp-block-columns .block-editor-block-list__layout .block-editor-block-list__block { + max-width: none; } + +.components-popover.block-editor-block-list__block-popover +.components-popover__content +.block-editor-block-contextual-toolbar[data-type="core/column"] { + margin-right: 0; } + +.wp-block-columns { + display: block; } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout { + display: flex; + flex-wrap: wrap; } + @media (min-width: 782px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout { + flex-wrap: nowrap; } } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"], + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] .block-core-columns { + display: flex; + flex-direction: column; + flex: 1 1 auto; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"], + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] .block-core-columns { + flex: 1; } } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] { + padding-right: 0; + padding-left: 0; + margin-right: -14px; + margin-left: -14px; + margin-top: 0; + margin-bottom: 0; + min-width: 0; + word-break: break-word; + overflow-wrap: break-word; + flex-basis: 100%; } + @media (min-width: 600px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] { + flex-basis: calc(50% - (16px)); + flex-grow: 0; + margin-right: 0; + margin-left: 0; } } + @media (min-width: 782px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] { + flex-basis: 0; + flex-grow: 1; } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"][data-has-explicit-width] { + flex-grow: 0; } } + @media (min-width: 600px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"]:nth-child(even) { + margin-right: calc(32px); } } + @media (min-width: 782px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"]:not(:first-child) { + margin-right: calc(32px); } } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"]::before { + right: 0; + left: 0; } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] > .block-core-columns > .block-editor-inner-blocks { + margin-top: -28px; + margin-bottom: -28px; } + +/** + * Columns act as as a "passthrough container" + * and therefore has its vertical margins/padding removed via negative margins + * therefore we need to compensate for this here by doubling the spacing on the + * vertical to ensure there is equal visual spacing around the inserter. Note there + * is no formal API for a "passthrough" Block so this is an edge case overide + */ +[data-type="core/columns"] .block-list-appender { + margin-top: 28px; + margin-bottom: 28px; } + +/** + * Vertical Alignment Preview + * note: specificity is important here to ensure individual + * * columns alignment is prioritised over parent column alignment + * + */ +.are-vertically-aligned-top .block-core-columns, +div.block-core-columns.is-vertically-aligned-top { + justify-content: flex-start; } + +.are-vertically-aligned-center .block-core-columns, +div.block-core-columns.is-vertically-aligned-center { + justify-content: center; } + +.are-vertically-aligned-bottom .block-core-columns, +div.block-core-columns.is-vertically-aligned-bottom { + justify-content: flex-end; } + +/** + * Fixes single Column breadcrumb position. + */ +[data-type="core/column"] > .editor-block-list__breadcrumb { + right: -3px; } + +/** + * Make single Column overlay not extend past boundaries of parent + */ +.block-core-columns > .block-editor-inner-blocks.has-overlay::after { + right: 0; + left: 0; } + +[data-type="core/columns"][data-align="full"] .wp-block-columns { + padding-right: 14px; + padding-left: 14px; } + @media (min-width: 600px) { + [data-type="core/columns"][data-align="full"] .wp-block-columns { + padding-right: 46px; + padding-left: 46px; } } + +.wp-block-cover-image.components-placeholder h2, +.wp-block-cover.components-placeholder h2 { + color: inherit; } + +.wp-block-cover-image .block-editor-block-list__layout, +.wp-block-cover .block-editor-block-list__layout { + width: 100%; } + +.wp-block-cover-image .block-editor-block-list__block, +.wp-block-cover .block-editor-block-list__block { + color: #f8f9f9; } + +.wp-block-cover-image .wp-block-cover__inner-container, +.wp-block-cover .wp-block-cover__inner-container { + text-align: right; } + +.wp-block-cover-image .wp-block-cover__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout, +.wp-block-cover .wp-block-cover__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + margin-right: 0; + margin-left: 0; } + +.wp-block-cover-image .wp-block-cover__placeholder-background-options, +.wp-block-cover .wp-block-cover__placeholder-background-options { + margin-top: 1em; + width: 100%; } + +[data-align="left"] .wp-block-cover-image, +[data-align="right"] .wp-block-cover-image, [data-align="left"] +.wp-block-cover, +[data-align="right"] +.wp-block-cover { + max-width: 290px; + width: 100%; } + +.block-library-cover__reset-button { + margin-right: auto; } + +.block-library-cover__resize-container:not(.is-resizing) { + height: auto !important; } + +.wp-block-embed { + margin-right: 0; + margin-left: 0; + clear: both; } + @media (min-width: 600px) { + .wp-block-embed { + min-width: 360px; } + .wp-block-embed.components-placeholder { + min-width: 0; } } + .wp-block-embed.is-loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 1em; + min-height: 200px; + text-align: center; + background: #f8f9f9; } + .wp-block-embed.is-loading p { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; } + .wp-block-embed .components-placeholder__error { + word-break: break-word; } + .wp-block-embed .components-placeholder__learn-more { + margin-top: 1em; } + +.block-library-embed__interactive-overlay { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + opacity: 0; } + +.wp-block-file { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0; } + .wp-block-file .wp-block-file__content-wrapper { + flex-grow: 1; } + .wp-block-file .wp-block-file__textlink { + display: inline-block; + min-width: 1em; } + .wp-block-file .wp-block-file__textlink:focus { + box-shadow: none; } + .wp-block-file .wp-block-file__button-richtext-wrapper { + display: inline-block; + margin-right: 0.75em; } + .wp-block-file .wp-block-file__copy-url-button { + margin-right: 1em; } + +.wp-block-freeform.block-library-rich-text__tinymce { + /* Remove blue highlighting of selected images in WebKit */ + /* Image captions */ + /* WP Views */ } + .wp-block-freeform.block-library-rich-text__tinymce p, + .wp-block-freeform.block-library-rich-text__tinymce li { + line-height: 1.8; } + .wp-block-freeform.block-library-rich-text__tinymce ul, + .wp-block-freeform.block-library-rich-text__tinymce ol { + padding-right: 2.5em; + margin-right: 0; } + .wp-block-freeform.block-library-rich-text__tinymce blockquote { + margin: 0; + box-shadow: inset 0 0 0 0 #e2e4e7; + border-right: 4px solid #000; + padding-right: 1em; } + .wp-block-freeform.block-library-rich-text__tinymce pre { + white-space: pre-wrap; + font-family: Menlo, Consolas, monaco, monospace; + font-size: 14px; + color: #23282d; } + .wp-block-freeform.block-library-rich-text__tinymce > *:first-child { + margin-top: 0; } + .wp-block-freeform.block-library-rich-text__tinymce > *:last-child { + margin-bottom: 0; } + .wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus { + outline: none; } + .wp-block-freeform.block-library-rich-text__tinymce a { + color: #007fac; } + .wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected] { + padding: 0 2px; + margin: 0 -2px; + border-radius: 2px; + box-shadow: 0 0 0 1px #e5f5fa; + background: #e5f5fa; } + .wp-block-freeform.block-library-rich-text__tinymce code { + padding: 2px; + border-radius: 2px; + color: #23282d; + background: #f3f4f5; + font-family: Menlo, Consolas, monaco, monospace; + font-size: 14px; } + .wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected] { + background: #e8eaeb; } + .wp-block-freeform.block-library-rich-text__tinymce .alignright { + float: right; + margin: 0.5em 0 0.5em 1em; } + .wp-block-freeform.block-library-rich-text__tinymce .alignleft { + float: left; + margin: 0.5em 1em 0.5em 0; } + .wp-block-freeform.block-library-rich-text__tinymce .aligncenter { + display: block; + margin-right: auto; + margin-left: auto; } + .wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag { + width: 96%; + height: 20px; + display: block; + margin: 15px auto; + outline: 0; + cursor: default; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC); + background-size: 1900px 20px; + background-repeat: no-repeat; + background-position: center; } + .wp-block-freeform.block-library-rich-text__tinymce img::selection { + background-color: transparent; } + .wp-block-freeform.block-library-rich-text__tinymce div.mceTemp { + -ms-user-select: element; } + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption { + margin: 0; + /* dl browser reset */ + max-width: 100%; } + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a, + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img { + display: block; } + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption, + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption * { + -webkit-user-drag: none; } + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd { + padding-top: 0.5em; + margin: 0; + /* browser dd reset */ } + .wp-block-freeform.block-library-rich-text__tinymce .wpview { + width: 99.99%; + /* All IE need hasLayout, incl. 11 (ugh, not again!!) */ + position: relative; + clear: both; + margin-bottom: 16px; + border: 1px solid transparent; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview iframe { + display: block; + max-width: 100%; + background: transparent; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim { + display: none; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder { + border: 1px dashed #e8eaeb; + padding: 10px; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error { + border: 1px solid #e8eaeb; + padding: 1em 0; + margin: 0; + word-wrap: break-word; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p { + margin: 0; + text-align: center; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder, + .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error { + border-color: transparent; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons { + display: block; + margin: 0 auto; + width: 32px; + height: 32px; + font-size: 32px; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery::after { + content: ""; + display: table; + clear: both; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus { + outline: none; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery a { + cursor: default; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery { + margin: auto -6px; + padding: 6px 0; + line-height: 1; + overflow-x: hidden; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item { + float: right; + margin: 0; + text-align: center; + padding: 6px; + box-sizing: border-box; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption, + .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon { + margin: 0; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption { + font-size: 13px; + margin: 4px 0; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item { + width: 100%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item { + width: 50%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item { + width: 33.33333%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item { + width: 25%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item { + width: 20%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item { + width: 16.66667%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item { + width: 14.28571%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item { + width: 12.5%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item { + width: 11.11111%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery img { + max-width: 100%; + height: auto; + border: none; + padding: 0; } + +div[data-type="core/freeform"]::before { + transition: border-color 0.1s linear, box-shadow 0.1s linear; + border: 1px solid #e2e4e7; + outline: 1px solid transparent; } + @media (prefers-reduced-motion: reduce) { + div[data-type="core/freeform"]::before { + transition-duration: 0s; } } + +div[data-type="core/freeform"].is-selected::before { + border-color: #b5bcc2; + border-right-color: transparent; } + +div[data-type="core/freeform"] .block-editor-block-contextual-toolbar + div { + margin-top: 0; + padding-top: 0; } + +div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce::after { + content: ""; + display: table; + clear: both; } + +.mce-toolbar-grp .mce-btn.mce-active button, +.mce-toolbar-grp .mce-btn.mce-active:hover button, +.mce-toolbar-grp .mce-btn.mce-active i, +.mce-toolbar-grp .mce-btn.mce-active:hover i { + color: #23282d; } + +.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last { + margin-left: 0; + margin-right: 8px; } + +.mce-toolbar-grp .mce-btn i { + font-style: normal; } + +.block-library-classic__toolbar { + display: none; + width: auto; + margin: 0 -14px; + position: -webkit-sticky; + position: sticky; + z-index: 10; + top: 14px; + transform: translateY(-14px); + border: 1px solid #e2e4e7; + border-bottom: none; + padding: 0; } + div[data-type="core/freeform"].is-selected .block-library-classic__toolbar, + div[data-type="core/freeform"].is-typing .block-library-classic__toolbar { + display: block; + border-color: #b5bcc2; } + .block-library-classic__toolbar .mce-tinymce { + box-shadow: none; } + @media (min-width: 600px) { + .block-library-classic__toolbar { + padding: 0; } } + .block-library-classic__toolbar:empty { + display: block; + background: #f5f5f5; + border-bottom: 1px solid #e2e4e7; } + .block-library-classic__toolbar:empty::before { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + content: attr(data-placeholder); + color: #555d66; + line-height: 37px; + padding: 14px; } + .block-library-classic__toolbar .mce-tinymce-inline, + .block-library-classic__toolbar .mce-tinymce-inline > div, + .block-library-classic__toolbar div.mce-toolbar-grp, + .block-library-classic__toolbar div.mce-toolbar-grp > div, + .block-library-classic__toolbar .mce-menubar, + .block-library-classic__toolbar .mce-menubar > div { + height: auto !important; + width: 100% !important; } + .block-library-classic__toolbar .mce-container-body.mce-abs-layout { + overflow: visible; } + .block-library-classic__toolbar .mce-menubar, + .block-library-classic__toolbar div.mce-toolbar-grp { + position: static; } + .block-library-classic__toolbar .mce-toolbar-grp > div { + padding: 1px 3px; } + .block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) { + display: none; } + .block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar { + display: block; } + +.wp-block-gallery li { + list-style-type: none; } + +.is-selected .wp-block-gallery { + margin-bottom: 0; } + +figure.wp-block-gallery { + display: block; + margin: 0; } + +.blocks-gallery-grid.blocks-gallery-grid { + padding-right: 0; + margin-right: 0; + margin-bottom: 0; } + +.blocks-gallery-item figure:not(.is-selected):focus { + outline: none; } + +.blocks-gallery-item figure.is-selected { + outline: 4px solid #0085ba; } + +body.admin-color-sunrise .blocks-gallery-item figure.is-selected { + outline: 4px solid #d1864a; } + +body.admin-color-ocean .blocks-gallery-item figure.is-selected { + outline: 4px solid #a3b9a2; } + +body.admin-color-midnight .blocks-gallery-item figure.is-selected { + outline: 4px solid #e14d43; } + +body.admin-color-ectoplasm .blocks-gallery-item figure.is-selected { + outline: 4px solid #a7b656; } + +body.admin-color-coffee .blocks-gallery-item figure.is-selected { + outline: 4px solid #c2a68c; } + +body.admin-color-blue .blocks-gallery-item figure.is-selected { + outline: 4px solid #82b4cb; } + +body.admin-color-light .blocks-gallery-item figure.is-selected { + outline: 4px solid #0085ba; } + +.blocks-gallery-item figure.is-transient img { + opacity: 0.3; } + +.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu, +.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu { + background: #fff; + border: 1px solid rgba(66, 88, 99, 0.4); + border-radius: 4px; + transition: box-shadow 0.2s ease-out; } + @media (prefers-reduced-motion: reduce) { + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu { + transition-duration: 0s; } } + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu:hover, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu:hover { + box-shadow: 0 2px 10px rgba(25, 30, 35, 0.1), 0 0 2px rgba(25, 30, 35, 0.1); } + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button { + color: rgba(14, 28, 46, 0.62); + padding: 2px; + height: 24px; } + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + box-shadow: none; } + @media (min-width: 600px) { + .columns-7 .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button, + .columns-8 .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button, .columns-7 + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button, + .columns-8 + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button { + padding: 0; + width: inherit; + height: inherit; } } + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button:focus, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button:focus { + color: inherit; } + +.block-library-gallery-item__move-menu, +.block-library-gallery-item__inline-menu { + margin: 8px; + display: inline-flex; + z-index: 20; } + .block-library-gallery-item__move-menu .components-button, + .block-library-gallery-item__inline-menu .components-button { + color: transparent; } + @media (min-width: 600px) { + .columns-7 .block-library-gallery-item__move-menu, + .columns-8 .block-library-gallery-item__move-menu, .columns-7 + .block-library-gallery-item__inline-menu, + .columns-8 + .block-library-gallery-item__inline-menu { + padding: 2px; } } + +.block-library-gallery-item__inline-menu { + position: absolute; + top: -2px; + left: -2px; } + +.block-library-gallery-item__move-menu { + position: absolute; + top: -2px; + right: -2px; } + +.blocks-gallery-item__move-backward, +.blocks-gallery-item__move-forward, +.blocks-gallery-item__remove { + padding: 0; } + +.blocks-gallery-item .components-spinner { + position: absolute; + top: 50%; + right: 50%; + margin-top: -9px; + margin-right: -9px; } + +/** + * Group: All Alignment Settings + */ +.wp-block[data-type="core/group"] .block-editor-block-list__insertion-point { + right: 0; + left: 0; } + +.wp-block[data-type="core/group"] > div > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks { + margin-top: -32px; + margin-bottom: -32px; } + +.wp-block[data-type="core/group"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-right: auto; + margin-left: auto; + padding-right: 28px; + padding-left: 28px; } + @media (min-width: 600px) { + .wp-block[data-type="core/group"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + padding-right: 58px; + padding-left: 58px; } } + +.wp-block[data-type="core/group"] > div > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-right: -30px; + width: calc(100% + 60px); } + +/** + * Group: Full Width Alignment + */ +.wp-block[data-type="core/group"][data-align="full"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks { + margin-right: auto; + margin-left: auto; + padding-right: 0; + padding-left: 0; } + .wp-block[data-type="core/group"][data-align="full"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + margin-right: 0; + margin-left: 0; } + +.wp-block[data-type="core/group"][data-align="full"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + padding-left: 0; + padding-right: 0; + right: 0; + width: 100%; + max-width: none; } + +.wp-block[data-type="core/group"][data-align="full"] > div > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + width: calc(100% + 60px); } + +[data-type="core/group"].is-selected .block-list-appender { + margin-right: 0; + margin-left: 0; } + +[data-type="core/group"].is-selected .has-background .block-list-appender { + margin-top: 18px; + margin-bottom: 18px; } + +.wp-block-html { + margin-bottom: 28px; } + .wp-block-html .block-editor-plain-text { + font-family: Menlo, Consolas, monaco, monospace; + color: #23282d; + padding: 0.8em 1em; + border: 1px solid #e2e4e7; + border-radius: 4px; + max-height: 250px; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .wp-block-html .block-editor-plain-text { + font-size: 13px; } } + .wp-block-html .block-editor-plain-text:focus { + box-shadow: none; } + +.wp-block-image { + position: relative; + margin-right: 0; + margin-left: 0; } + .wp-block-image.is-transient img { + opacity: 0.3; } + .wp-block-image figcaption img { + display: inline; } + .wp-block-image .components-spinner { + position: absolute; + top: 50%; + right: 50%; + margin-top: -9px; + margin-right: -9px; } + +.wp-block-image .components-resizable-box__container { + display: inline-block; } + .wp-block-image .components-resizable-box__container img { + display: block; + width: inherit; + height: inherit; } + +.wp-block-image.is-focused .components-resizable-box__handle { + display: block; + z-index: 1; } + +.block-editor-block-list__block[data-type="core/image"][data-align="center"] .wp-block-image { + margin-right: auto; + margin-left: auto; } + +.block-editor-block-list__block[data-type="core/image"][data-align="center"][data-resized="false"] .wp-block-image > div { + margin-right: auto; + margin-left: auto; } + +.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal { + position: absolute; + right: 0; + left: 0; + margin: -1px 0; } + @media (min-width: 600px) { + .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal { + margin: -1px; } } + +[data-type="core/image"][data-align="center"] figure, +[data-type="core/image"][data-align="left"] figure, +[data-type="core/image"][data-align="right"] figure { + margin: 0; } + +[data-type="core/image"][data-align="wide"] figure img, +[data-type="core/image"][data-align="full"] figure img { + width: 100%; } + +[data-type="core/image"] figure.is-resized { + margin: 0; } + +.wp-block-latest-comments.has-avatars .avatar { + margin-left: 10px; } + +.wp-block-latest-comments__comment-excerpt p { + font-size: 14px; + line-height: 1.8; + margin: 5px 0 20px; + padding-top: 0; } + +.wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment { + min-height: 36px; } + +.block-editor .wp-block-latest-posts { + padding-right: 2.5em; } + .block-editor .wp-block-latest-posts.is-grid { + padding-right: 0; } + +.wp-block-latest-posts li a > div { + display: inline; } + +.wp-block-legacy-widget__edit-container, +.wp-block-legacy-widget__preview { + padding-right: 2.5em; + padding-left: 2.5em; } + +.wp-block-legacy-widget__edit-container .widget-inside { + border: none; + display: block; + box-shadow: none; } + +.wp-block-legacy-widget__update-button { + margin-right: auto; + display: block; } + +.wp-block-legacy-widget__preview { + overflow: auto; } + +.wp-block-legacy-widget__edit-widget-title { + margin: -14px -13px 0; + background: #f8f9f9; + color: #555d66; + top: -13px; + position: relative; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + padding: 8px 14px; + font-weight: 600; } + +.wp-block-media-text .__resizable_base__ { + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1 / span 2; + -ms-grid-row: 2; + grid-row: 2; } + +.wp-block-media-text.is-vertically-aligned-top .block-editor-inner-blocks, +.wp-block-media-text.is-vertically-aligned-top .editor-media-container__resizer { + -ms-grid-row-align: start; + align-self: start; } + +.wp-block-media-text .block-editor-inner-blocks, +.wp-block-media-text .editor-media-container__resizer, +.wp-block-media-text.is-vertically-aligned-center .block-editor-inner-blocks, +.wp-block-media-text.is-vertically-aligned-center .editor-media-container__resizer { + -ms-grid-row-align: center; + align-self: center; } + +.wp-block-media-text.is-vertically-aligned-bottom .block-editor-inner-blocks, +.wp-block-media-text.is-vertically-aligned-bottom .editor-media-container__resizer { + -ms-grid-row-align: end; + align-self: end; } + +.wp-block-media-text .editor-media-container__resizer { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; + width: 100% !important; } + +.wp-block-media-text.is-image-fill .editor-media-container__resizer { + height: 100% !important; } + +.wp-block-media-text.has-media-on-the-right .editor-media-container__resizer { + -ms-grid-column: 2; + grid-column: 2; + -ms-grid-row: 1; + grid-row: 1; } + +.wp-block-media-text .block-editor-inner-blocks { + word-break: break-word; + -ms-grid-column: 2; + grid-column: 2; + -ms-grid-row: 1; + grid-row: 1; + text-align: initial; + padding: 0 8% 0 8%; } + +.wp-block-media-text.has-media-on-the-right .block-editor-inner-blocks { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } + +.wp-block-media-text > .block-editor-inner-blocks > .block-editor-block-list__layout > .block-editor-block-list__block { + max-width: unset; } + +.editor-media-container__resizer .components-resizable-box__handle { + display: none; } + +.wp-block-media-text.is-selected:not(.is-stacked-on-mobile) .editor-media-container__resizer .components-resizable-box__handle { + display: block; } + +@media (min-width: 600px) { + .wp-block-media-text.is-selected.is-stacked-on-mobile .editor-media-container__resizer .components-resizable-box__handle { + display: block; } } + +@media (max-width: 600px) { + .wp-block-media-text.is-stacked-on-mobile .block-editor-inner-blocks { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 2; + grid-row: 2; } + .wp-block-media-text.is-stacked-on-mobile .editor-media-container__resizer { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } + .wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .block-editor-inner-blocks { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } + .wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .editor-media-container__resizer { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 2; + grid-row: 2; } } + +.block-editor-block-list__block[data-type="core/more"] { + max-width: 100%; + text-align: center; + margin-top: 28px; + margin-bottom: 28px; } + +.block-editor .wp-block-more { + display: block; + text-align: center; + white-space: nowrap; } + .block-editor .wp-block-more input[type="text"] { + position: relative; + font-size: 13px; + text-transform: uppercase; + font-weight: 600; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + color: #6c7781; + border: none; + box-shadow: none; + white-space: nowrap; + text-align: center; + margin: 0; + border-radius: 4px; + background: #fff; + padding: 6px 8px; + height: 24px; + max-width: 100%; } + .block-editor .wp-block-more input[type="text"]:focus { + box-shadow: none; } + .block-editor .wp-block-more::before { + content: ""; + position: absolute; + top: calc(50%); + right: 0; + left: 0; + border-top: 3px dashed #ccd0d4; } + +[data-type="core/navigation"] .wp-block-navigation .block-editor-inner-blocks { + flex: 1; } + +[data-type="core/navigation"] .wp-block-navigation .block-editor-inner-blocks > .block-editor-block-list__layout { + margin-right: 0; + margin-left: 0; } + +[data-type="core/navigation"] .wp-block-navigation.items-justification-left .block-editor-inner-blocks > .block-editor-block-list__layout { + justify-content: flex-start; } + +[data-type="core/navigation"] .wp-block-navigation.items-justification-center .block-editor-inner-blocks > .block-editor-block-list__layout { + justify-content: center; } + +[data-type="core/navigation"] .wp-block-navigation.items-justification-right .block-editor-inner-blocks > .block-editor-block-list__layout { + justify-content: flex-end; } + +[data-type="core/navigation"] .wp-block-navigation .block-editor-block-list__block::before { + right: 0; + left: 0; } + +[data-type="core/navigation"].is-selected .wp-block-navigation .block-editor-block-list__block::before, +[data-type="core/navigation"].has-child-selected .wp-block-navigation .block-editor-block-list__block::before { + border-color: transparent !important; } + +[data-type="core/navigation"] .wp-block-navigation .block-editor-block-list__insertion-point { + display: none; } + +[data-type="core/navigation"] .wp-block-navigation .block-list-appender { + width: 28px; + height: 28px; } + [data-type="core/navigation"] .wp-block-navigation .block-list-appender .block-editor-button-block-appender { + padding: 8px; + padding-bottom: 4px; + padding-top: 4px; + outline: none; + background: none; } + +[data-type="core/navigation"] .wp-block-navigation .wp-block-navigation-link.is-selected .block-editor-rich-text__editable:focus { + min-width: 20px; } + +.wp-block-navigation__inserter-content { + padding: 16px; } + +/** + * Colors Selector component + */ +.block-library-colors-selector { + width: auto; } + .block-library-colors-selector .block-library-colors-selector__toggle { + display: block; + margin: 0 auto; + padding: 3px; + width: auto; } + .block-library-colors-selector .block-library-colors-selector__icon-container { + width: 42px; + height: 30px; + position: relative; + margin: 0 auto; + padding: 3px; + display: flex; + align-items: center; + border-radius: 4px; } + .block-library-colors-selector .block-library-colors-selector__icon-container::after { + content: ""; + pointer-events: none; + display: block; + width: 0; + height: 0; + border-right: 3px solid transparent; + border-left: 3px solid transparent; + border-top: 5px solid; + margin-right: 4px; + margin-left: 2px; } + .block-library-colors-selector .block-library-colors-selector__state-selection { + border-radius: 11px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); + width: 22px; + min-width: 22px; + height: 22px; + min-height: 22px; + line-height: 20px; + padding: 2px; } + .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color > svg, + .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color > svg path { + color: inherit; } + +.block-library-colors-selector__popover .color-palette-controller-container { + padding: 16px; } + +.block-library-colors-selector__popover .components-base-control__label { + height: 20px; + line-height: 20px; } + +.block-library-colors-selector__popover .component-color-indicator { + float: left; + margin-top: 2px; } + +.block-library-colors-selector__popover .components-panel__body-title { + display: none; } + +.wp-block-navigation-link__field .components-text-control__input.components-text-control__input, +.wp-block-navigation-link__container { + border-radius: 0; + line-height: 36px; + min-height: 36px; } + +/* + * Adjust Navigation Item. + */ +.wp-block-navigation-link .block-editor-block-list__layout { + display: block; } + +.wp-block-navigation-link.is-editing, .wp-block-navigation-link.is-selected { + min-width: 20px; } + +.wp-block-navigation-link.has-link .wp-block-navigation-link__label { + text-decoration: underline; } + +.wp-block-navigation-link .block-editor-rich-text__editable.is-selected:not(.keep-placeholder-on-focus):not(:focus) [data-rich-text-placeholder]::after { + display: inline-block; } + +.wp-block-navigation-link .block-list-appender { + margin: 16px; + margin-right: 10px; + margin-top: 10px; } + +[data-type="core/navigation-link"] .block-editor-block-toolbar { + right: 14px; } + +[data-type="core/navigation-link"] .block-editor-block-toolbar .components-toolbar.block-editor-block-mover .components-button.block-editor-block-mover__control-drag-handle { + display: none; } + +.wp-block-navigation-link__nofollow-external-link { + display: block; } + +.wp-block-navigation-link__separator { + margin: 8px 0 8px; + border-top: 1px solid #e2e4e7; } + +.components-popover.wp-block-navigation-link__dropdown-content { + margin-top: -1px; + margin-right: -4px; } + +.wp-block-navigation-link__dropdown-content .components-popover__content { + padding: 8px 0; } + +.wp-block-navigation .block-editor-block-list__block[data-type="core/navigation-link"] > .block-editor-block-list__insertion-point { + display: none; } + +.block-editor-block-list__block[data-type="core/nextpage"] { + max-width: 100%; + margin-top: 28px; + margin-bottom: 28px; } + +.wp-block-nextpage { + display: block; + text-align: center; + white-space: nowrap; } + .wp-block-nextpage > span { + font-size: 13px; + position: relative; + display: inline-block; + text-transform: uppercase; + font-weight: 600; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + color: #6c7781; + border-radius: 4px; + background: #fff; + padding: 6px 8px; + height: 24px; } + .wp-block-nextpage::before { + content: ""; + position: absolute; + top: calc(50%); + right: 0; + left: 0; + border-top: 3px dashed #ccd0d4; } + +.block-editor-block-list__block[data-type="core/paragraph"] .has-drop-cap:focus { + min-height: auto !important; } + +.block-editor-block-list__block[data-type="core/pullquote"][data-align="left"] p, .block-editor-block-list__block[data-type="core/pullquote"][data-align="right"] p { + font-size: 20px; } + +.wp-block-pullquote blockquote p { + font-size: 28px; + line-height: 1.6; } + +.wp-block-pullquote.is-style-solid-color { + margin-right: 0; + margin-left: 0; } + .wp-block-pullquote.is-style-solid-color blockquote p { + font-size: 32px; } + .wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation { + text-transform: none; + font-style: normal; } + +.wp-block-pullquote .wp-block-pullquote__citation { + color: inherit; } + +.wp-block-quote__citation { + font-size: 13px; } + +.block-editor .wp-block-rss { + padding-right: 2.5em; } + .block-editor .wp-block-rss.is-grid { + padding-right: 0; } + +.wp-block-rss li a > div { + display: inline; } + +.wp-block-search__input { + border-radius: 4px; + border: 1px solid #7e8993; + color: rgba(14, 28, 46, 0.62); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + padding: 8px; } + .wp-block-search__input:focus { + outline: none; } + +.wp-block-search__button { + background: #f7f7f7; + border-radius: 4px; + border: 1px solid #ccc; + box-shadow: inset 0 -1px 0 #ccc; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + padding: 6px 10px; } + +.wp-block-shortcode { + display: flex; + flex-direction: column; + padding: 14px; + background-color: rgba(139, 139, 150, 0.1); + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + margin-bottom: 28px; } + .wp-block-shortcode label { + display: flex; + align-items: center; + white-space: nowrap; + font-weight: 600; + flex-shrink: 0; } + .wp-block-shortcode .block-editor-plain-text { + width: 80%; + max-height: 250px; } + .wp-block-shortcode .dashicon { + margin-left: 8px; } + +.wp-social-link { + padding: 6px; } + +.wp-block-social-links.is-style-pill-shape .wp-social-link { + padding-right: 16px; + padding-left: 16px; } + +.wp-block-social-links div.block-editor-url-input { + display: inline-block; + margin-right: 8px; } + +.wp-block-social-links .block-editor-block-list__layout { + display: flex; + justify-content: flex-start; } + +[data-type="core/social-links"] .wp-block-social-links > .block-editor-inner-blocks > .block-editor-block-list__layout { + margin-right: 0; + margin-left: 0; } + +[data-type="core/social-links"] .wp-block-social-links > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block { + width: auto; + padding-right: 0; + padding-left: 0; + margin-right: 0; + margin-left: 0; + margin-top: 0; + margin-bottom: 0; } + +[data-type="core/social-links"] .wp-block-social-links > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block::before { + border-left: none; + border-top: none; + border-bottom: none; } + +[data-type="core/social-links"].is-selected .wp-block-social-links .block-editor-block-list__block::before, +[data-type="core/social-links"].has-child-selected .wp-block-social-links .block-editor-block-list__block::before { + border-color: transparent !important; } + +[data-type="core/social-links"] .wp-block-social-links .block-editor-block-list__insertion-point { + display: none; } + +.wp-block-social-links .block-list-appender { + margin: 0; } + .wp-block-social-links .block-list-appender .block-editor-button-block-appender { + padding: 8px; + outline: none; + background: none; } + +[data-type="core/social-links"][data-align="center"] .wp-block-social-links { + justify-content: center; } + +.block-editor-block-preview__content .wp-social-link:disabled { + opacity: 1; } + +.block-editor-block-preview__content [data-type="core/social-links"] { + width: auto !important; + display: inline-block; } + +[data-type="core/social-links"]:not(.is-selected):not(.has-child-selected) .wp-block-social-links { + min-height: 36px; } + +[data-type="core/social-links"] .wp-social-link__is-incomplete { + transition: transform 0.1s ease; + transform-origin: center center; } + +[data-type="core/social-links"]:not(.is-selected):not(.has-child-selected) .wp-social-link__is-incomplete { + opacity: 0; + transform: scale(0); + width: 0; + padding: 0; + margin-left: 0; } + +.wp-social-link.wp-social-link__is-incomplete { + opacity: 0.5; } + @media (prefers-reduced-motion: reduce) { + .wp-social-link.wp-social-link__is-incomplete { + transition-duration: 0s; } } + +.wp-block-social-links .is-selected .wp-social-link__is-incomplete, +.wp-social-link.wp-social-link__is-incomplete:hover, +.wp-social-link.wp-social-link__is-incomplete:focus { + opacity: 1; } + +[data-type="core/social-links"] .wp-social-link:focus { + opacity: 1; + box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; + outline: 2px solid transparent; } + +.block-library-spacer__resize-container.is-selected { + background: #f3f4f5; } + +.block-library-spacer__resize-container { + clear: both; + margin-bottom: 28px; } + +.edit-post-visual-editor p.wp-block-subhead { + color: #6c7781; + font-size: 1.1em; + font-style: italic; } + +.block-editor-block-list__block[data-type="core/table"][data-align="left"], .block-editor-block-list__block[data-type="core/table"][data-align="right"], .block-editor-block-list__block[data-type="core/table"][data-align="center"] { + height: auto; } + .block-editor-block-list__block[data-type="core/table"][data-align="left"] table, .block-editor-block-list__block[data-type="core/table"][data-align="right"] table, .block-editor-block-list__block[data-type="core/table"][data-align="center"] table { + width: auto; } + .block-editor-block-list__block[data-type="core/table"][data-align="left"] td, + .block-editor-block-list__block[data-type="core/table"][data-align="left"] th, .block-editor-block-list__block[data-type="core/table"][data-align="right"] td, + .block-editor-block-list__block[data-type="core/table"][data-align="right"] th, .block-editor-block-list__block[data-type="core/table"][data-align="center"] td, + .block-editor-block-list__block[data-type="core/table"][data-align="center"] th { + word-break: break-word; } + +.block-editor-block-list__block[data-type="core/table"][data-align="center"] { + text-align: initial; } + .block-editor-block-list__block[data-type="core/table"][data-align="center"] table { + margin: 0 auto; } + +.wp-block-table { + margin: 0; } + .wp-block-table table { + border-collapse: collapse; } + .wp-block-table td, + .wp-block-table th { + border: 1px solid; } + .wp-block-table td.is-selected, + .wp-block-table th.is-selected { + border-color: #00a0d2; + box-shadow: inset 0 0 0 1px #00a0d2; + border-style: double; } + .wp-block-table figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-input { + width: 112px; + margin-left: 8px; + margin-bottom: 0; } + .wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-input input { + height: 36px; } + +.wp-block-table__placeholder-form.wp-block-table__placeholder-form .components-base-control__field { + margin-bottom: 0; } + +.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-button { + margin-top: auto; + margin-left: auto; } + +.block-editor .wp-block-tag-cloud a { + display: inline-block; + margin-left: 5px; } + +.block-editor .wp-block-tag-cloud span { + display: inline-block; + margin-right: 5px; + color: #8f98a1; + text-decoration: none; } + +.wp-block-template-part__placeholder-input-container { + display: flex; + flex-wrap: wrap; + width: 100%; } + +.wp-block-template-part__placeholder-input { + margin: 5px; } + +.wp-block-template-part__placeholder-preview { + margin-bottom: 15px; + width: 100%; } + .wp-block-template-part__placeholder-preview .block-editor-block-preview__container { + padding: 1px; } + .wp-block-template-part__placeholder-preview .block-editor-block-preview__content { + position: initial; } + +.wp-block-template-part__placeholder-preview-title { + font-size: 15px; + font-weight: 600; + margin-bottom: 4px; } + +.wp-block-text-columns .block-editor-rich-text__editable:focus { + outline: 1px solid #e2e4e7; } + +pre.wp-block-verse { + color: #191e23; + white-space: nowrap; + font-family: inherit; + font-size: inherit; + padding: 1em; + overflow: auto; } + +.block-editor-block-list__block[data-align="center"] { + text-align: center; } + +.editor-video-poster-control .components-button { + display: block; + margin-left: 8px; } + +.editor-video-poster-control .components-button + .components-button { + margin-top: 1em; } + +/** + * Import styles from internal editor components used by the blocks. + */ +.block-editor-block-list__layout .reusable-block-edit-panel { + align-items: center; + background: #f8f9f9; + color: #555d66; + display: flex; + flex-wrap: wrap; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + position: relative; + top: -14px; + margin: 0 -14px; + padding: 8px 14px; + z-index: 61; + border: 1px dashed rgba(145, 151, 162, 0.25); + border-bottom: none; } + .block-editor-block-list__layout .block-editor-block-list__layout .reusable-block-edit-panel { + margin: 0 -14px; + padding: 8px 14px; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__spinner { + margin: 0 5px; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__info { + margin-left: auto; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__label { + margin-left: 8px; + white-space: nowrap; + font-weight: 600; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__title { + flex: 1 1 100%; + font-size: 14px; + height: 30px; + margin: 4px 0 8px; } + .block-editor-block-list__layout .reusable-block-edit-panel .components-button.reusable-block-edit-panel__button { + flex-shrink: 0; } + @media (min-width: 960px) { + .block-editor-block-list__layout .reusable-block-edit-panel { + flex-wrap: nowrap; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__title { + margin: 0; } + .block-editor-block-list__layout .reusable-block-edit-panel .components-button.reusable-block-edit-panel__button { + margin: 0 5px 0 0; } } + +.block-editor-block-list__layout .is-selected .reusable-block-edit-panel { + border-color: rgba(66, 88, 99, 0.4); + border-right-color: transparent; } + .is-dark-theme .block-editor-block-list__layout .is-selected .reusable-block-edit-panel { + border-color: rgba(255, 255, 255, 0.45); + border-right-color: transparent; } + +.is-navigate-mode .is-selected .reusable-block-edit-panel { + border-color: #007cba; + border-right-color: transparent; } + .is-dark-theme .is-navigate-mode .is-selected .reusable-block-edit-panel { + border-color: #007cba; + border-right-color: transparent; } + +/** + * Editor Normalization Styles + * + * These are only output in the editor, but styles here are NOT prefixed .editor-styles-wrapper. + * This allows us to create normalization styles that are easily overridden by editor styles. + */ +.editor-styles-wrapper .block-editor-block-list__block { + margin-top: 28px; + margin-bottom: 28px; } diff --git a/wp-includes/css/dist/block-library/editor-rtl.min.css b/wp-includes/css/dist/block-library/editor-rtl.min.css new file mode 100644 index 0000000..b64facf --- /dev/null +++ b/wp-includes/css/dist/block-library/editor-rtl.min.css @@ -0,0 +1 @@ +.block-editor ul.wp-block-archives{padding-right:2.5em}.wp-block-audio{margin-right:0;margin-left:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow__click-redirect{min-height:auto}.block-editor-block-list__block[data-type="core/button"][data-align=center]{text-align:center;margin-right:auto;margin-left:auto}.block-editor-block-list__block[data-type="core/button"][data-align=right]{text-align:right}.wp-block-button{position:relative}.wp-block-button [contenteditable]{cursor:text}.wp-block-button:not(.has-text-color):not(.is-style-outline) [data-rich-text-placeholder]:after{color:#fff}.wp-block-button .block-editor-rich-text__editable:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2;outline:2px solid transparent;outline-offset:-2px}.wp-block-button [data-rich-text-placeholder]:after{opacity:.8}.wp-block-button__inline-link{color:#555d66;height:0;overflow:hidden;max-width:290px}.wp-block-button__inline-link-input__suggestions{max-width:290px}@media (min-width:782px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:260px}}@media (min-width:960px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:290px}}.is-selected .wp-block-button__inline-link,.is-typing .wp-block-button__inline-link{height:auto;overflow:visible;margin-top:16px}div[data-type="core/button"]{display:table}.wp-block-buttons .wp-block.block-editor-block-list__block[data-type="core/button"]{display:inline-block;width:auto}.wp-block-buttons[data-align=center] .block-editor-block-list__layout{display:flex;align-items:center;flex-wrap:wrap;justify-content:center}.wp-block-buttons[data-align=right] .block-editor-block-list__layout{display:flex;justify-content:flex-end}.wp-block-buttons .block-list-appender{display:inline-block;margin:0}.wp-block-buttons .block-editor-block-list__layout>div:last-child{display:inline-block}.wp-block-buttons .block-editor-button-block-appender{background:none;outline:none}.block-editor .wp-block-categories ul{padding-right:2.5em}.block-editor .wp-block-categories ul ul{margin-top:6px}.wp-block-code .block-editor-plain-text{font-family:Menlo,Consolas,monaco,monospace;color:#23282d;font-size:16px}@media (min-width:600px){.wp-block-code .block-editor-plain-text{font-size:13px}}.wp-block-code .block-editor-plain-text:focus{box-shadow:none}.wp-block-columns .block-editor-block-list__layout .block-editor-block-list__block{max-width:none}.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar[data-type="core/column"]{margin-right:0}.wp-block-columns{display:block}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout{display:flex;flex-wrap:wrap}@media (min-width:782px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout{flex-wrap:nowrap}}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"],.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"] .block-core-columns{display:flex;flex-direction:column;flex:1 1 auto}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"],.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"] .block-core-columns{flex:1}}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]{padding-right:0;padding-left:0;margin:0 -14px;min-width:0;word-break:break-word;overflow-wrap:break-word;flex-basis:100%}@media (min-width:600px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]{flex-basis:calc(50% - 16px);flex-grow:0;margin-right:0;margin-left:0}}@media (min-width:782px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]{flex-basis:0;flex-grow:1}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"][data-has-explicit-width]{flex-grow:0}}@media (min-width:600px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]:nth-child(2n){margin-right:32px}}@media (min-width:782px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]:not(:first-child){margin-right:32px}}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]:before{right:0;left:0}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]>.block-core-columns>.block-editor-inner-blocks{margin-top:-28px;margin-bottom:-28px}[data-type="core/columns"] .block-list-appender{margin-top:28px;margin-bottom:28px}.are-vertically-aligned-top .block-core-columns,div.block-core-columns.is-vertically-aligned-top{justify-content:flex-start}.are-vertically-aligned-center .block-core-columns,div.block-core-columns.is-vertically-aligned-center{justify-content:center}.are-vertically-aligned-bottom .block-core-columns,div.block-core-columns.is-vertically-aligned-bottom{justify-content:flex-end}[data-type="core/column"]>.editor-block-list__breadcrumb{right:-3px}.block-core-columns>.block-editor-inner-blocks.has-overlay:after{right:0;left:0}[data-type="core/columns"][data-align=full] .wp-block-columns{padding-right:14px;padding-left:14px}@media (min-width:600px){[data-type="core/columns"][data-align=full] .wp-block-columns{padding-right:46px;padding-left:46px}}.wp-block-cover-image.components-placeholder h2,.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover-image .block-editor-block-list__layout,.wp-block-cover .block-editor-block-list__layout{width:100%}.wp-block-cover-image .block-editor-block-list__block,.wp-block-cover .block-editor-block-list__block{color:#f8f9f9}.wp-block-cover-image .wp-block-cover__inner-container,.wp-block-cover .wp-block-cover__inner-container{text-align:right}.wp-block-cover-image .wp-block-cover__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout,.wp-block-cover .wp-block-cover__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout{margin-right:0;margin-left:0}.wp-block-cover-image .wp-block-cover__placeholder-background-options,.wp-block-cover .wp-block-cover__placeholder-background-options{margin-top:1em;width:100%}[data-align=left] .wp-block-cover,[data-align=left] .wp-block-cover-image,[data-align=right] .wp-block-cover,[data-align=right] .wp-block-cover-image{max-width:290px;width:100%}.block-library-cover__reset-button{margin-right:auto}.block-library-cover__resize-container:not(.is-resizing){height:auto!important}.wp-block-embed{margin-right:0;margin-left:0;clear:both}@media (min-width:600px){.wp-block-embed{min-width:360px}.wp-block-embed.components-placeholder{min-width:0}}.wp-block-embed.is-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:1em;min-height:200px;text-align:center;background:#f8f9f9}.wp-block-embed.is-loading p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed .components-placeholder__learn-more{margin-top:1em}.block-library-embed__interactive-overlay{position:absolute;top:0;right:0;left:0;bottom:0;opacity:0}.wp-block-file{display:flex;justify-content:space-between;align-items:center;margin-bottom:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file .wp-block-file__textlink{display:inline-block;min-width:1em}.wp-block-file .wp-block-file__textlink:focus{box-shadow:none}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-right:.75em}.wp-block-file .wp-block-file__copy-url-button{margin-right:1em}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{padding-right:2.5em;margin-right:0}.wp-block-freeform.block-library-rich-text__tinymce blockquote{margin:0;box-shadow:inset 0 0 0 0 #e2e4e7;border-right:4px solid #000;padding-right:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{white-space:pre-wrap;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;color:#23282d}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:#007fac}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{padding:0 2px;margin:0 -2px;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;background:#e5f5fa}.wp-block-freeform.block-library-rich-text__tinymce code{padding:2px;border-radius:2px;color:#23282d;background:#f3f4f5;font-family:Menlo,Consolas,monaco,monospace;font-size:14px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#e8eaeb}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-right:auto;margin-left:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{width:96%;height:20px;display:block;margin:15px auto;outline:0;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-size:1900px 20px;background-repeat:no-repeat;background-position:50%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{padding-top:.5em;margin:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview{width:99.99%;position:relative;clear:both;margin-bottom:16px;border:1px solid transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{display:block;max-width:100%;background:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{position:absolute;top:0;left:0;bottom:0;right:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #e8eaeb;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{border:1px solid #e8eaeb;padding:1em 0;margin:0;word-wrap:break-word}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;margin:0 auto;width:32px;height:32px;font-size:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{content:"";display:table;clear:both}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{margin:auto -6px;padding:6px 0;line-height:1;overflow-x:hidden}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{float:right;margin:0;text-align:center;padding:6px;box-sizing:border-box}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.33333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.66667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.28571%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.11111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{max-width:100%;height:auto;border:none;padding:0}div[data-type="core/freeform"]:before{transition:border-color .1s linear,box-shadow .1s linear;border:1px solid #e2e4e7;outline:1px solid transparent}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#b5bcc2 transparent #b5bcc2 #b5bcc2}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{content:"";display:table;clear:both}.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i,.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i{color:#23282d}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-left:0;margin-right:8px}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{display:none;width:auto;margin:0 -14px;position:-webkit-sticky;position:sticky;z-index:10;top:14px;transform:translateY(-14px);border:1px solid #e2e4e7;border-bottom:none;padding:0}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar,div[data-type="core/freeform"].is-typing .block-library-classic__toolbar{display:block;border-color:#b5bcc2}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{display:block;background:#f5f5f5;border-bottom:1px solid #e2e4e7}.block-library-classic__toolbar:empty:before{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;content:attr(data-placeholder);color:#555d66;line-height:37px;padding:14px}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.wp-block-gallery li{list-style-type:none}.is-selected .wp-block-gallery{margin-bottom:0}figure.wp-block-gallery{display:block;margin:0}.blocks-gallery-grid.blocks-gallery-grid{padding-right:0;margin-right:0;margin-bottom:0}.blocks-gallery-item figure:not(.is-selected):focus{outline:none}.blocks-gallery-item figure.is-selected{outline:4px solid #0085ba}body.admin-color-sunrise .blocks-gallery-item figure.is-selected{outline:4px solid #d1864a}body.admin-color-ocean .blocks-gallery-item figure.is-selected{outline:4px solid #a3b9a2}body.admin-color-midnight .blocks-gallery-item figure.is-selected{outline:4px solid #e14d43}body.admin-color-ectoplasm .blocks-gallery-item figure.is-selected{outline:4px solid #a7b656}body.admin-color-coffee .blocks-gallery-item figure.is-selected{outline:4px solid #c2a68c}body.admin-color-blue .blocks-gallery-item figure.is-selected{outline:4px solid #82b4cb}body.admin-color-light .blocks-gallery-item figure.is-selected{outline:4px solid #0085ba}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu{background:#fff;border:1px solid rgba(66,88,99,.4);border-radius:4px;transition:box-shadow .2s ease-out}@media (prefers-reduced-motion:reduce){.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu{transition-duration:0s}}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu:hover,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu:hover{box-shadow:0 2px 10px rgba(25,30,35,.1),0 0 2px rgba(25,30,35,.1)}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button{color:rgba(14,28,46,.62);padding:2px;height:24px}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}@media (min-width:600px){.columns-7 .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button,.columns-7 .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button,.columns-8 .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button,.columns-8 .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button{padding:0;width:inherit;height:inherit}}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button:focus,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button:focus{color:inherit}.block-library-gallery-item__inline-menu,.block-library-gallery-item__move-menu{margin:8px;display:inline-flex;z-index:20}.block-library-gallery-item__inline-menu .components-button,.block-library-gallery-item__move-menu .components-button{color:transparent}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-7 .block-library-gallery-item__move-menu,.columns-8 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__move-menu{padding:2px}}.block-library-gallery-item__inline-menu{position:absolute;top:-2px;left:-2px}.block-library-gallery-item__move-menu{position:absolute;top:-2px;right:-2px}.blocks-gallery-item__move-backward,.blocks-gallery-item__move-forward,.blocks-gallery-item__remove{padding:0}.blocks-gallery-item .components-spinner{position:absolute;top:50%;right:50%;margin-top:-9px;margin-right:-9px}.wp-block[data-type="core/group"] .block-editor-block-list__insertion-point{right:0;left:0}.wp-block[data-type="core/group"]>div>.wp-block-group.has-background>.wp-block-group__inner-container>.block-editor-inner-blocks{margin-top:-32px;margin-bottom:-32px}.wp-block[data-type="core/group"]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{margin-right:auto;margin-left:auto;padding-right:28px;padding-left:28px}@media (min-width:600px){.wp-block[data-type="core/group"]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{padding-right:58px;padding-left:58px}}.wp-block[data-type="core/group"]>div>.wp-block-group.has-background>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{margin-right:-30px;width:calc(100% + 60px)}.wp-block[data-type="core/group"][data-align=full]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks{margin-right:auto;margin-left:auto;padding-right:0;padding-left:0}.wp-block[data-type="core/group"][data-align=full]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout{margin-right:0;margin-left:0}.wp-block[data-type="core/group"][data-align=full]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{padding-left:0;padding-right:0;right:0;width:100%;max-width:none}.wp-block[data-type="core/group"][data-align=full]>div>.wp-block-group.has-background>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{width:calc(100% + 60px)}[data-type="core/group"].is-selected .block-list-appender{margin-right:0;margin-left:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-top:18px;margin-bottom:18px}.wp-block-html{margin-bottom:28px}.wp-block-html .block-editor-plain-text{font-family:Menlo,Consolas,monaco,monospace;color:#23282d;padding:.8em 1em;border:1px solid #e2e4e7;border-radius:4px;max-height:250px;font-size:16px}@media (min-width:600px){.wp-block-html .block-editor-plain-text{font-size:13px}}.wp-block-html .block-editor-plain-text:focus{box-shadow:none}.wp-block-image{position:relative;margin-right:0;margin-left:0}.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{position:absolute;top:50%;right:50%;margin-top:-9px;margin-right:-9px}.wp-block-image .components-resizable-box__container{display:inline-block}.wp-block-image .components-resizable-box__container img{display:block;width:inherit;height:inherit}.wp-block-image.is-focused .components-resizable-box__handle{display:block;z-index:1}.block-editor-block-list__block[data-type="core/image"][data-align=center] .wp-block-image{margin-right:auto;margin-left:auto}.block-editor-block-list__block[data-type="core/image"][data-align=center][data-resized=false] .wp-block-image>div{margin-right:auto;margin-left:auto}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{position:absolute;right:0;left:0;margin:-1px 0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-type="core/image"][data-align=center] figure,[data-type="core/image"][data-align=left] figure,[data-type="core/image"][data-align=right] figure{margin:0}[data-type="core/image"][data-align=full] figure img,[data-type="core/image"][data-align=wide] figure img{width:100%}[data-type="core/image"] figure.is-resized{margin:0}.wp-block-latest-comments.has-avatars .avatar{margin-left:10px}.wp-block-latest-comments__comment-excerpt p{font-size:14px;line-height:1.8;margin:5px 0 20px;padding-top:0}.wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment{min-height:36px}.block-editor .wp-block-latest-posts{padding-right:2.5em}.block-editor .wp-block-latest-posts.is-grid{padding-right:0}.wp-block-latest-posts li a>div{display:inline}.wp-block-legacy-widget__edit-container,.wp-block-legacy-widget__preview{padding-right:2.5em;padding-left:2.5em}.wp-block-legacy-widget__edit-container .widget-inside{border:none;display:block;box-shadow:none}.wp-block-legacy-widget__update-button{margin-right:auto;display:block}.wp-block-legacy-widget__preview{overflow:auto}.wp-block-legacy-widget__edit-widget-title{margin:-14px -13px 0;background:#f8f9f9;color:#555d66;top:-13px;position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:8px 14px;font-weight:600}.wp-block-media-text .__resizable_base__{-ms-grid-column:1;-ms-grid-column-span:2;grid-column:1/span 2;-ms-grid-row:2;grid-row:2}.wp-block-media-text.is-vertically-aligned-top .block-editor-inner-blocks,.wp-block-media-text.is-vertically-aligned-top .editor-media-container__resizer{-ms-grid-row-align:start;align-self:start}.wp-block-media-text .block-editor-inner-blocks,.wp-block-media-text .editor-media-container__resizer,.wp-block-media-text.is-vertically-aligned-center .block-editor-inner-blocks,.wp-block-media-text.is-vertically-aligned-center .editor-media-container__resizer{-ms-grid-row-align:center;align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .block-editor-inner-blocks,.wp-block-media-text.is-vertically-aligned-bottom .editor-media-container__resizer{-ms-grid-row-align:end;align-self:end}.wp-block-media-text .editor-media-container__resizer{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1;width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text .block-editor-inner-blocks,.wp-block-media-text.has-media-on-the-right .editor-media-container__resizer{-ms-grid-column:2;grid-column:2;-ms-grid-row:1;grid-row:1}.wp-block-media-text .block-editor-inner-blocks{word-break:break-word;text-align:initial;padding:0 8%}.wp-block-media-text.has-media-on-the-right .block-editor-inner-blocks{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text>.block-editor-inner-blocks>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}.editor-media-container__resizer .components-resizable-box__handle{display:none}.wp-block-media-text.is-selected:not(.is-stacked-on-mobile) .editor-media-container__resizer .components-resizable-box__handle{display:block}@media (min-width:600px){.wp-block-media-text.is-selected.is-stacked-on-mobile .editor-media-container__resizer .components-resizable-box__handle{display:block}}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile .block-editor-inner-blocks{-ms-grid-column:1;grid-column:1;-ms-grid-row:2;grid-row:2}.wp-block-media-text.is-stacked-on-mobile .editor-media-container__resizer,.wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .block-editor-inner-blocks{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .editor-media-container__resizer{-ms-grid-column:1;grid-column:1;-ms-grid-row:2;grid-row:2}}.block-editor-block-list__block[data-type="core/more"]{max-width:100%;text-align:center;margin-top:28px;margin-bottom:28px}.block-editor .wp-block-more{display:block;text-align:center;white-space:nowrap}.block-editor .wp-block-more input[type=text]{position:relative;font-size:13px;text-transform:uppercase;font-weight:600;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;color:#6c7781;border:none;box-shadow:none;white-space:nowrap;text-align:center;margin:0;border-radius:4px;background:#fff;padding:6px 8px;height:24px;max-width:100%}.block-editor .wp-block-more input[type=text]:focus{box-shadow:none}.block-editor .wp-block-more:before{content:"";position:absolute;top:50%;right:0;left:0;border-top:3px dashed #ccd0d4}[data-type="core/navigation"] .wp-block-navigation .block-editor-inner-blocks{flex:1}[data-type="core/navigation"] .wp-block-navigation .block-editor-inner-blocks>.block-editor-block-list__layout{margin-right:0;margin-left:0}[data-type="core/navigation"] .wp-block-navigation.items-justification-left .block-editor-inner-blocks>.block-editor-block-list__layout{justify-content:flex-start}[data-type="core/navigation"] .wp-block-navigation.items-justification-center .block-editor-inner-blocks>.block-editor-block-list__layout{justify-content:center}[data-type="core/navigation"] .wp-block-navigation.items-justification-right .block-editor-inner-blocks>.block-editor-block-list__layout{justify-content:flex-end}[data-type="core/navigation"] .wp-block-navigation .block-editor-block-list__block:before{right:0;left:0}[data-type="core/navigation"].has-child-selected .wp-block-navigation .block-editor-block-list__block:before,[data-type="core/navigation"].is-selected .wp-block-navigation .block-editor-block-list__block:before{border-color:transparent!important}[data-type="core/navigation"] .wp-block-navigation .block-editor-block-list__insertion-point{display:none}[data-type="core/navigation"] .wp-block-navigation .block-list-appender{width:28px;height:28px}[data-type="core/navigation"] .wp-block-navigation .block-list-appender .block-editor-button-block-appender{padding:4px 8px;outline:none;background:none}[data-type="core/navigation"] .wp-block-navigation .wp-block-navigation-link.is-selected .block-editor-rich-text__editable:focus{min-width:20px}.wp-block-navigation__inserter-content{padding:16px}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{width:42px;height:30px;position:relative;margin:0 auto;padding:3px;display:flex;align-items:center;border-radius:4px}.block-library-colors-selector .block-library-colors-selector__icon-container:after{content:"";pointer-events:none;display:block;width:0;height:0;border-right:3px solid transparent;border-left:3px solid transparent;border-top:5px solid;margin-right:4px;margin-left:2px}.block-library-colors-selector .block-library-colors-selector__state-selection{border-radius:11px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);width:22px;min-width:22px;height:22px;min-height:22px;line-height:20px;padding:2px}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:left;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.wp-block-navigation-link__container,.wp-block-navigation-link__field .components-text-control__input.components-text-control__input{border-radius:0;line-height:36px;min-height:36px}.wp-block-navigation-link .block-editor-block-list__layout{display:block}.wp-block-navigation-link.is-editing,.wp-block-navigation-link.is-selected{min-width:20px}.wp-block-navigation-link.has-link .wp-block-navigation-link__label{text-decoration:underline}.wp-block-navigation-link .block-editor-rich-text__editable.is-selected:not(.keep-placeholder-on-focus):not(:focus) [data-rich-text-placeholder]:after{display:inline-block}.wp-block-navigation-link .block-list-appender{margin:10px 10px 16px 16px}[data-type="core/navigation-link"] .block-editor-block-toolbar{right:14px}[data-type="core/navigation-link"] .block-editor-block-toolbar .components-toolbar.block-editor-block-mover .components-button.block-editor-block-mover__control-drag-handle{display:none}.wp-block-navigation-link__nofollow-external-link{display:block}.wp-block-navigation-link__separator{margin:8px 0;border-top:1px solid #e2e4e7}.components-popover.wp-block-navigation-link__dropdown-content{margin-top:-1px;margin-right:-4px}.wp-block-navigation-link__dropdown-content .components-popover__content{padding:8px 0}.wp-block-navigation .block-editor-block-list__block[data-type="core/navigation-link"]>.block-editor-block-list__insertion-point{display:none}.block-editor-block-list__block[data-type="core/nextpage"]{max-width:100%;margin-top:28px;margin-bottom:28px}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{font-size:13px;position:relative;display:inline-block;text-transform:uppercase;font-weight:600;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;color:#6c7781;border-radius:4px;background:#fff;padding:6px 8px;height:24px}.wp-block-nextpage:before{content:"";position:absolute;top:50%;right:0;left:0;border-top:3px dashed #ccd0d4}.block-editor-block-list__block[data-type="core/paragraph"] .has-drop-cap:focus{min-height:auto!important}.block-editor-block-list__block[data-type="core/pullquote"][data-align=left] p,.block-editor-block-list__block[data-type="core/pullquote"][data-align=right] p{font-size:20px}.wp-block-pullquote blockquote p{font-size:28px;line-height:1.6}.wp-block-pullquote.is-style-solid-color{margin-right:0;margin-left:0}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{text-transform:none;font-style:normal}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}.wp-block-quote__citation{font-size:13px}.block-editor .wp-block-rss{padding-right:2.5em}.block-editor .wp-block-rss.is-grid{padding-right:0}.wp-block-rss li a>div{display:inline}.wp-block-search__input{border-radius:4px;border:1px solid #7e8993;color:rgba(14,28,46,.62);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:8px}.wp-block-search__input:focus{outline:none}.wp-block-search__button{background:#f7f7f7;border-radius:4px;border:1px solid #ccc;box-shadow:inset 0 -1px 0 #ccc;padding:6px 10px}.wp-block-search__button,.wp-block-shortcode{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-shortcode{display:flex;flex-direction:column;padding:14px;background-color:rgba(139,139,150,.1);margin-bottom:28px}.wp-block-shortcode label{display:flex;align-items:center;white-space:nowrap;font-weight:600;flex-shrink:0}.wp-block-shortcode .block-editor-plain-text{width:80%;max-height:250px}.wp-block-shortcode .dashicon{margin-left:8px}.wp-social-link{padding:6px}.wp-block-social-links.is-style-pill-shape .wp-social-link{padding-right:16px;padding-left:16px}.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-right:8px}.wp-block-social-links .block-editor-block-list__layout{display:flex;justify-content:flex-start}[data-type="core/social-links"] .wp-block-social-links>.block-editor-inner-blocks>.block-editor-block-list__layout{margin-right:0;margin-left:0}[data-type="core/social-links"] .wp-block-social-links>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block{width:auto;padding-right:0;padding-left:0;margin:0}[data-type="core/social-links"] .wp-block-social-links>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block:before{border-left:none;border-top:none;border-bottom:none}[data-type="core/social-links"].has-child-selected .wp-block-social-links .block-editor-block-list__block:before,[data-type="core/social-links"].is-selected .wp-block-social-links .block-editor-block-list__block:before{border-color:transparent!important}[data-type="core/social-links"] .wp-block-social-links .block-editor-block-list__insertion-point{display:none}.wp-block-social-links .block-list-appender{margin:0}.wp-block-social-links .block-list-appender .block-editor-button-block-appender{padding:8px;outline:none;background:none}[data-type="core/social-links"][data-align=center] .wp-block-social-links{justify-content:center}.block-editor-block-preview__content .wp-social-link:disabled{opacity:1}.block-editor-block-preview__content [data-type="core/social-links"]{width:auto!important;display:inline-block}[data-type="core/social-links"]:not(.is-selected):not(.has-child-selected) .wp-block-social-links{min-height:36px}[data-type="core/social-links"] .wp-social-link__is-incomplete{transition:transform .1s ease;transform-origin:center center}[data-type="core/social-links"]:not(.is-selected):not(.has-child-selected) .wp-social-link__is-incomplete{opacity:0;transform:scale(0);width:0;padding:0;margin-left:0}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}[data-type="core/social-links"] .wp-social-link:focus{opacity:1;box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;outline:2px solid transparent}.block-library-spacer__resize-container.is-selected{background:#f3f4f5}.block-library-spacer__resize-container{clear:both;margin-bottom:28px}.edit-post-visual-editor p.wp-block-subhead{color:#6c7781;font-size:1.1em;font-style:italic}.block-editor-block-list__block[data-type="core/table"][data-align=center],.block-editor-block-list__block[data-type="core/table"][data-align=left],.block-editor-block-list__block[data-type="core/table"][data-align=right]{height:auto}.block-editor-block-list__block[data-type="core/table"][data-align=center] table,.block-editor-block-list__block[data-type="core/table"][data-align=left] table,.block-editor-block-list__block[data-type="core/table"][data-align=right] table{width:auto}.block-editor-block-list__block[data-type="core/table"][data-align=center] td,.block-editor-block-list__block[data-type="core/table"][data-align=center] th,.block-editor-block-list__block[data-type="core/table"][data-align=left] td,.block-editor-block-list__block[data-type="core/table"][data-align=left] th,.block-editor-block-list__block[data-type="core/table"][data-align=right] td,.block-editor-block-list__block[data-type="core/table"][data-align=right] th{word-break:break-word}.block-editor-block-list__block[data-type="core/table"][data-align=center]{text-align:initial}.block-editor-block-list__block[data-type="core/table"][data-align=center] table{margin:0 auto}.wp-block-table{margin:0}.wp-block-table table{border-collapse:collapse}.wp-block-table td,.wp-block-table th{border:1px solid}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:#00a0d2;box-shadow:inset 0 0 0 1px #00a0d2;border-style:double}.wp-block-table figcaption{color:#555d66;font-size:13px;text-align:center}.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-input{width:112px;margin-left:8px;margin-bottom:0}.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-input input{height:36px}.wp-block-table__placeholder-form.wp-block-table__placeholder-form .components-base-control__field{margin-bottom:0}.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-button{margin-top:auto;margin-left:auto}.block-editor .wp-block-tag-cloud a{display:inline-block;margin-left:5px}.block-editor .wp-block-tag-cloud span{display:inline-block;margin-right:5px;color:#8f98a1;text-decoration:none}.wp-block-template-part__placeholder-input-container{display:flex;flex-wrap:wrap;width:100%}.wp-block-template-part__placeholder-input{margin:5px}.wp-block-template-part__placeholder-preview{margin-bottom:15px;width:100%}.wp-block-template-part__placeholder-preview .block-editor-block-preview__container{padding:1px}.wp-block-template-part__placeholder-preview .block-editor-block-preview__content{position:static}.wp-block-template-part__placeholder-preview-title{font-size:15px;font-weight:600;margin-bottom:4px}.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #e2e4e7}pre.wp-block-verse{color:#191e23;white-space:nowrap;font-family:inherit;font-size:inherit;padding:1em;overflow:auto}.block-editor-block-list__block[data-align=center]{text-align:center}.editor-video-poster-control .components-button{display:block;margin-left:8px}.editor-video-poster-control .components-button+.components-button{margin-top:1em}.block-editor-block-list__layout .reusable-block-edit-panel{align-items:center;background:#f8f9f9;color:#555d66;display:flex;flex-wrap:wrap;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;position:relative;top:-14px;margin:0 -14px;padding:8px 14px;z-index:61;border:1px dashed rgba(145,151,162,.25);border-bottom:none}.block-editor-block-list__layout .block-editor-block-list__layout .reusable-block-edit-panel{margin:0 -14px;padding:8px 14px}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__spinner{margin:0 5px}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__info{margin-left:auto}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__label{margin-left:8px;white-space:nowrap;font-weight:600}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__title{flex:1 1 100%;font-size:14px;height:30px;margin:4px 0 8px}.block-editor-block-list__layout .reusable-block-edit-panel .components-button.reusable-block-edit-panel__button{flex-shrink:0}@media (min-width:960px){.block-editor-block-list__layout .reusable-block-edit-panel{flex-wrap:nowrap}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__title{margin:0}.block-editor-block-list__layout .reusable-block-edit-panel .components-button.reusable-block-edit-panel__button{margin:0 5px 0 0}}.block-editor-block-list__layout .is-selected .reusable-block-edit-panel{border-color:rgba(66,88,99,.4) transparent rgba(66,88,99,.4) rgba(66,88,99,.4)}.is-dark-theme .block-editor-block-list__layout .is-selected .reusable-block-edit-panel{border-color:hsla(0,0%,100%,.45) transparent hsla(0,0%,100%,.45) hsla(0,0%,100%,.45)}.is-dark-theme .is-navigate-mode .is-selected .reusable-block-edit-panel,.is-navigate-mode .is-selected .reusable-block-edit-panel{border-color:#007cba transparent #007cba #007cba}.editor-styles-wrapper .block-editor-block-list__block{margin-top:28px;margin-bottom:28px} \ No newline at end of file diff --git a/wp-includes/css/dist/block-library/editor.css b/wp-includes/css/dist/block-library/editor.css new file mode 100644 index 0000000..9314c34 --- /dev/null +++ b/wp-includes/css/dist/block-library/editor.css @@ -0,0 +1,1540 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.block-editor ul.wp-block-archives { + padding-left: 2.5em; } + +.wp-block-audio { + margin-left: 0; + margin-right: 0; } + +.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow__click-redirect { + min-height: auto; } + +.block-editor-block-list__block[data-type="core/button"][data-align="center"] { + text-align: center; + margin-left: auto; + margin-right: auto; } + +.block-editor-block-list__block[data-type="core/button"][data-align="right"] { + /*!rtl:ignore*/ + text-align: right; } + +.wp-block-button { + position: relative; } + .wp-block-button [contenteditable] { + cursor: text; } + .wp-block-button:not(.has-text-color):not(.is-style-outline) [data-rich-text-placeholder]::after { + color: #fff; } + .wp-block-button .block-editor-rich-text__editable:focus { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00a0d2; + outline: 2px solid transparent; + outline-offset: -2px; } + .wp-block-button [data-rich-text-placeholder]::after { + opacity: 0.8; } + +.wp-block-button__inline-link { + color: #555d66; + height: 0; + overflow: hidden; + max-width: 290px; } + .wp-block-button__inline-link-input__suggestions { + max-width: 290px; } + @media (min-width: 782px) { + .wp-block-button__inline-link { + max-width: 260px; } + .wp-block-button__inline-link-input__suggestions { + max-width: 260px; } } + @media (min-width: 960px) { + .wp-block-button__inline-link { + max-width: 290px; } + .wp-block-button__inline-link-input__suggestions { + max-width: 290px; } } + .is-selected .wp-block-button__inline-link, + .is-typing .wp-block-button__inline-link { + height: auto; + overflow: visible; + margin-top: 16px; } + +div[data-type="core/button"] { + display: table; } + +.wp-block-buttons .wp-block.block-editor-block-list__block[data-type="core/button"] { + display: inline-block; + width: auto; } + +.wp-block-buttons[data-align="center"] .block-editor-block-list__layout { + display: flex; + align-items: center; + flex-wrap: wrap; + justify-content: center; } + +.wp-block-buttons[data-align="right"] .block-editor-block-list__layout { + display: flex; + justify-content: flex-end; } + +.wp-block-buttons .block-list-appender { + display: inline-block; + margin: 0; } + +.wp-block-buttons .block-editor-block-list__layout > div:last-child { + display: inline-block; } + +.wp-block-buttons .block-editor-button-block-appender { + background: none; + outline: none; } + +.block-editor .wp-block-categories ul { + padding-left: 2.5em; } + .block-editor .wp-block-categories ul ul { + margin-top: 6px; } + +.wp-block-code .block-editor-plain-text { + font-family: Menlo, Consolas, monaco, monospace; + color: #23282d; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .wp-block-code .block-editor-plain-text { + font-size: 13px; } } + .wp-block-code .block-editor-plain-text:focus { + box-shadow: none; } + +.wp-block-columns .block-editor-block-list__layout .block-editor-block-list__block { + max-width: none; } + +.components-popover.block-editor-block-list__block-popover +.components-popover__content +.block-editor-block-contextual-toolbar[data-type="core/column"] { + margin-left: 0; } + +.wp-block-columns { + display: block; } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout { + display: flex; + flex-wrap: wrap; } + @media (min-width: 782px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout { + flex-wrap: nowrap; } } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"], + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] .block-core-columns { + display: flex; + flex-direction: column; + flex: 1 1 auto; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"], + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] .block-core-columns { + flex: 1; } } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] { + padding-left: 0; + padding-right: 0; + margin-left: -14px; + margin-right: -14px; + margin-top: 0; + margin-bottom: 0; + min-width: 0; + word-break: break-word; + overflow-wrap: break-word; + flex-basis: 100%; } + @media (min-width: 600px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] { + flex-basis: calc(50% - (16px)); + flex-grow: 0; + margin-left: 0; + margin-right: 0; } } + @media (min-width: 782px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] { + flex-basis: 0; + flex-grow: 1; } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"][data-has-explicit-width] { + flex-grow: 0; } } + @media (min-width: 600px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"]:nth-child(even) { + margin-left: calc(32px); } } + @media (min-width: 782px) { + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"]:not(:first-child) { + margin-left: calc(32px); } } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"]::before { + left: 0; + right: 0; } + .wp-block-columns > .block-editor-inner-blocks > .block-editor-block-list__layout > [data-type="core/column"] > .block-core-columns > .block-editor-inner-blocks { + margin-top: -28px; + margin-bottom: -28px; } + +/** + * Columns act as as a "passthrough container" + * and therefore has its vertical margins/padding removed via negative margins + * therefore we need to compensate for this here by doubling the spacing on the + * vertical to ensure there is equal visual spacing around the inserter. Note there + * is no formal API for a "passthrough" Block so this is an edge case overide + */ +[data-type="core/columns"] .block-list-appender { + margin-top: 28px; + margin-bottom: 28px; } + +/** + * Vertical Alignment Preview + * note: specificity is important here to ensure individual + * * columns alignment is prioritised over parent column alignment + * + */ +.are-vertically-aligned-top .block-core-columns, +div.block-core-columns.is-vertically-aligned-top { + justify-content: flex-start; } + +.are-vertically-aligned-center .block-core-columns, +div.block-core-columns.is-vertically-aligned-center { + justify-content: center; } + +.are-vertically-aligned-bottom .block-core-columns, +div.block-core-columns.is-vertically-aligned-bottom { + justify-content: flex-end; } + +/** + * Fixes single Column breadcrumb position. + */ +[data-type="core/column"] > .editor-block-list__breadcrumb { + left: -3px; } + +/** + * Make single Column overlay not extend past boundaries of parent + */ +.block-core-columns > .block-editor-inner-blocks.has-overlay::after { + left: 0; + right: 0; } + +[data-type="core/columns"][data-align="full"] .wp-block-columns { + padding-left: 14px; + padding-right: 14px; } + @media (min-width: 600px) { + [data-type="core/columns"][data-align="full"] .wp-block-columns { + padding-left: 46px; + padding-right: 46px; } } + +.wp-block-cover-image.components-placeholder h2, +.wp-block-cover.components-placeholder h2 { + color: inherit; } + +.wp-block-cover-image .block-editor-block-list__layout, +.wp-block-cover .block-editor-block-list__layout { + width: 100%; } + +.wp-block-cover-image .block-editor-block-list__block, +.wp-block-cover .block-editor-block-list__block { + color: #f8f9f9; } + +.wp-block-cover-image .wp-block-cover__inner-container, +.wp-block-cover .wp-block-cover__inner-container { + text-align: left; } + +.wp-block-cover-image .wp-block-cover__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout, +.wp-block-cover .wp-block-cover__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + margin-left: 0; + margin-right: 0; } + +.wp-block-cover-image .wp-block-cover__placeholder-background-options, +.wp-block-cover .wp-block-cover__placeholder-background-options { + margin-top: 1em; + width: 100%; } + +[data-align="left"] .wp-block-cover-image, +[data-align="right"] .wp-block-cover-image, [data-align="left"] +.wp-block-cover, +[data-align="right"] +.wp-block-cover { + max-width: 290px; + width: 100%; } + +.block-library-cover__reset-button { + margin-left: auto; } + +.block-library-cover__resize-container:not(.is-resizing) { + height: auto !important; } + +.wp-block-embed { + margin-left: 0; + margin-right: 0; + clear: both; } + @media (min-width: 600px) { + .wp-block-embed { + min-width: 360px; } + .wp-block-embed.components-placeholder { + min-width: 0; } } + .wp-block-embed.is-loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 1em; + min-height: 200px; + text-align: center; + background: #f8f9f9; } + .wp-block-embed.is-loading p { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; } + .wp-block-embed .components-placeholder__error { + word-break: break-word; } + .wp-block-embed .components-placeholder__learn-more { + margin-top: 1em; } + +.block-library-embed__interactive-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + opacity: 0; } + +.wp-block-file { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0; } + .wp-block-file .wp-block-file__content-wrapper { + flex-grow: 1; } + .wp-block-file .wp-block-file__textlink { + display: inline-block; + min-width: 1em; } + .wp-block-file .wp-block-file__textlink:focus { + box-shadow: none; } + .wp-block-file .wp-block-file__button-richtext-wrapper { + display: inline-block; + margin-left: 0.75em; } + .wp-block-file .wp-block-file__copy-url-button { + margin-left: 1em; } + +.wp-block-freeform.block-library-rich-text__tinymce { + /* Remove blue highlighting of selected images in WebKit */ + /* Image captions */ + /* WP Views */ } + .wp-block-freeform.block-library-rich-text__tinymce p, + .wp-block-freeform.block-library-rich-text__tinymce li { + line-height: 1.8; } + .wp-block-freeform.block-library-rich-text__tinymce ul, + .wp-block-freeform.block-library-rich-text__tinymce ol { + padding-left: 2.5em; + margin-left: 0; } + .wp-block-freeform.block-library-rich-text__tinymce blockquote { + margin: 0; + box-shadow: inset 0 0 0 0 #e2e4e7; + border-left: 4px solid #000; + padding-left: 1em; } + .wp-block-freeform.block-library-rich-text__tinymce pre { + white-space: pre-wrap; + font-family: Menlo, Consolas, monaco, monospace; + font-size: 14px; + color: #23282d; } + .wp-block-freeform.block-library-rich-text__tinymce > *:first-child { + margin-top: 0; } + .wp-block-freeform.block-library-rich-text__tinymce > *:last-child { + margin-bottom: 0; } + .wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus { + outline: none; } + .wp-block-freeform.block-library-rich-text__tinymce a { + color: #007fac; } + .wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected] { + padding: 0 2px; + margin: 0 -2px; + border-radius: 2px; + box-shadow: 0 0 0 1px #e5f5fa; + background: #e5f5fa; } + .wp-block-freeform.block-library-rich-text__tinymce code { + padding: 2px; + border-radius: 2px; + color: #23282d; + background: #f3f4f5; + font-family: Menlo, Consolas, monaco, monospace; + font-size: 14px; } + .wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected] { + background: #e8eaeb; } + .wp-block-freeform.block-library-rich-text__tinymce .alignright { + /*rtl:ignore*/ + float: right; + /*rtl:ignore*/ + margin: 0.5em 0 0.5em 1em; } + .wp-block-freeform.block-library-rich-text__tinymce .alignleft { + /*rtl:ignore*/ + float: left; + /*rtl:ignore*/ + margin: 0.5em 1em 0.5em 0; } + .wp-block-freeform.block-library-rich-text__tinymce .aligncenter { + display: block; + margin-left: auto; + margin-right: auto; } + .wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag { + width: 96%; + height: 20px; + display: block; + margin: 15px auto; + outline: 0; + cursor: default; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC); + background-size: 1900px 20px; + background-repeat: no-repeat; + background-position: center; } + .wp-block-freeform.block-library-rich-text__tinymce img::selection { + background-color: transparent; } + .wp-block-freeform.block-library-rich-text__tinymce div.mceTemp { + -ms-user-select: element; } + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption { + margin: 0; + /* dl browser reset */ + max-width: 100%; } + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a, + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img { + display: block; } + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption, + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption * { + -webkit-user-drag: none; } + .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd { + padding-top: 0.5em; + margin: 0; + /* browser dd reset */ } + .wp-block-freeform.block-library-rich-text__tinymce .wpview { + width: 99.99%; + /* All IE need hasLayout, incl. 11 (ugh, not again!!) */ + position: relative; + clear: both; + margin-bottom: 16px; + border: 1px solid transparent; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview iframe { + display: block; + max-width: 100%; + background: transparent; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim { + display: none; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder { + border: 1px dashed #e8eaeb; + padding: 10px; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error { + border: 1px solid #e8eaeb; + padding: 1em 0; + margin: 0; + word-wrap: break-word; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p { + margin: 0; + text-align: center; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder, + .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error { + border-color: transparent; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons { + display: block; + margin: 0 auto; + width: 32px; + height: 32px; + font-size: 32px; } + .wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery::after { + content: ""; + display: table; + clear: both; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus { + outline: none; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery a { + cursor: default; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery { + margin: auto -6px; + padding: 6px 0; + line-height: 1; + overflow-x: hidden; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item { + float: left; + margin: 0; + text-align: center; + padding: 6px; + box-sizing: border-box; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption, + .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon { + margin: 0; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption { + font-size: 13px; + margin: 4px 0; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item { + width: 100%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item { + width: 50%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item { + width: 33.33333%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item { + width: 25%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item { + width: 20%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item { + width: 16.66667%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item { + width: 14.28571%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item { + width: 12.5%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item { + width: 11.11111%; } + .wp-block-freeform.block-library-rich-text__tinymce .gallery img { + max-width: 100%; + height: auto; + border: none; + padding: 0; } + +div[data-type="core/freeform"]::before { + transition: border-color 0.1s linear, box-shadow 0.1s linear; + border: 1px solid #e2e4e7; + outline: 1px solid transparent; } + @media (prefers-reduced-motion: reduce) { + div[data-type="core/freeform"]::before { + transition-duration: 0s; } } + +div[data-type="core/freeform"].is-selected::before { + border-color: #b5bcc2; + border-left-color: transparent; } + +div[data-type="core/freeform"] .block-editor-block-contextual-toolbar + div { + margin-top: 0; + padding-top: 0; } + +div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce::after { + content: ""; + display: table; + clear: both; } + +.mce-toolbar-grp .mce-btn.mce-active button, +.mce-toolbar-grp .mce-btn.mce-active:hover button, +.mce-toolbar-grp .mce-btn.mce-active i, +.mce-toolbar-grp .mce-btn.mce-active:hover i { + color: #23282d; } + +.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last { + margin-right: 0; + margin-left: 8px; } + +.mce-toolbar-grp .mce-btn i { + font-style: normal; } + +.block-library-classic__toolbar { + display: none; + width: auto; + margin: 0 -14px; + position: -webkit-sticky; + position: sticky; + z-index: 10; + top: 14px; + transform: translateY(-14px); + border: 1px solid #e2e4e7; + border-bottom: none; + padding: 0; } + div[data-type="core/freeform"].is-selected .block-library-classic__toolbar, + div[data-type="core/freeform"].is-typing .block-library-classic__toolbar { + display: block; + border-color: #b5bcc2; } + .block-library-classic__toolbar .mce-tinymce { + box-shadow: none; } + @media (min-width: 600px) { + .block-library-classic__toolbar { + padding: 0; } } + .block-library-classic__toolbar:empty { + display: block; + background: #f5f5f5; + border-bottom: 1px solid #e2e4e7; } + .block-library-classic__toolbar:empty::before { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + content: attr(data-placeholder); + color: #555d66; + line-height: 37px; + padding: 14px; } + .block-library-classic__toolbar .mce-tinymce-inline, + .block-library-classic__toolbar .mce-tinymce-inline > div, + .block-library-classic__toolbar div.mce-toolbar-grp, + .block-library-classic__toolbar div.mce-toolbar-grp > div, + .block-library-classic__toolbar .mce-menubar, + .block-library-classic__toolbar .mce-menubar > div { + height: auto !important; + width: 100% !important; } + .block-library-classic__toolbar .mce-container-body.mce-abs-layout { + overflow: visible; } + .block-library-classic__toolbar .mce-menubar, + .block-library-classic__toolbar div.mce-toolbar-grp { + position: static; } + .block-library-classic__toolbar .mce-toolbar-grp > div { + padding: 1px 3px; } + .block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) { + display: none; } + .block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar { + display: block; } + +.wp-block-gallery li { + list-style-type: none; } + +.is-selected .wp-block-gallery { + margin-bottom: 0; } + +figure.wp-block-gallery { + display: block; + margin: 0; } + +.blocks-gallery-grid.blocks-gallery-grid { + padding-left: 0; + margin-left: 0; + margin-bottom: 0; } + +.blocks-gallery-item figure:not(.is-selected):focus { + outline: none; } + +.blocks-gallery-item figure.is-selected { + outline: 4px solid #0085ba; } + +body.admin-color-sunrise .blocks-gallery-item figure.is-selected { + outline: 4px solid #d1864a; } + +body.admin-color-ocean .blocks-gallery-item figure.is-selected { + outline: 4px solid #a3b9a2; } + +body.admin-color-midnight .blocks-gallery-item figure.is-selected { + outline: 4px solid #e14d43; } + +body.admin-color-ectoplasm .blocks-gallery-item figure.is-selected { + outline: 4px solid #a7b656; } + +body.admin-color-coffee .blocks-gallery-item figure.is-selected { + outline: 4px solid #c2a68c; } + +body.admin-color-blue .blocks-gallery-item figure.is-selected { + outline: 4px solid #82b4cb; } + +body.admin-color-light .blocks-gallery-item figure.is-selected { + outline: 4px solid #0085ba; } + +.blocks-gallery-item figure.is-transient img { + opacity: 0.3; } + +.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu, +.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu { + background: #fff; + border: 1px solid rgba(66, 88, 99, 0.4); + border-radius: 4px; + transition: box-shadow 0.2s ease-out; } + @media (prefers-reduced-motion: reduce) { + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu { + transition-duration: 0s; } } + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu:hover, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu:hover { + box-shadow: 0 2px 10px rgba(25, 30, 35, 0.1), 0 0 2px rgba(25, 30, 35, 0.1); } + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button { + color: rgba(14, 28, 46, 0.62); + padding: 2px; + height: 24px; } + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + box-shadow: none; } + @media (min-width: 600px) { + .columns-7 .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button, + .columns-8 .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button, .columns-7 + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button, + .columns-8 + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button { + padding: 0; + width: inherit; + height: inherit; } } + .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button:focus, + .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button:focus { + color: inherit; } + +.block-library-gallery-item__move-menu, +.block-library-gallery-item__inline-menu { + margin: 8px; + display: inline-flex; + z-index: 20; } + .block-library-gallery-item__move-menu .components-button, + .block-library-gallery-item__inline-menu .components-button { + color: transparent; } + @media (min-width: 600px) { + .columns-7 .block-library-gallery-item__move-menu, + .columns-8 .block-library-gallery-item__move-menu, .columns-7 + .block-library-gallery-item__inline-menu, + .columns-8 + .block-library-gallery-item__inline-menu { + padding: 2px; } } + +.block-library-gallery-item__inline-menu { + position: absolute; + top: -2px; + right: -2px; } + +.block-library-gallery-item__move-menu { + position: absolute; + top: -2px; + left: -2px; } + +.blocks-gallery-item__move-backward, +.blocks-gallery-item__move-forward, +.blocks-gallery-item__remove { + padding: 0; } + +.blocks-gallery-item .components-spinner { + position: absolute; + top: 50%; + left: 50%; + margin-top: -9px; + margin-left: -9px; } + +/** + * Group: All Alignment Settings + */ +.wp-block[data-type="core/group"] .block-editor-block-list__insertion-point { + left: 0; + right: 0; } + +.wp-block[data-type="core/group"] > div > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks { + margin-top: -32px; + margin-bottom: -32px; } + +.wp-block[data-type="core/group"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: auto; + margin-right: auto; + padding-left: 28px; + padding-right: 28px; } + @media (min-width: 600px) { + .wp-block[data-type="core/group"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + padding-left: 58px; + padding-right: 58px; } } + +.wp-block[data-type="core/group"] > div > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + margin-left: -30px; + width: calc(100% + 60px); } + +/** + * Group: Full Width Alignment + */ +.wp-block[data-type="core/group"][data-align="full"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks { + margin-left: auto; + margin-right: auto; + padding-left: 0; + padding-right: 0; } + .wp-block[data-type="core/group"][data-align="full"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout { + margin-left: 0; + margin-right: 0; } + +.wp-block[data-type="core/group"][data-align="full"] > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + padding-right: 0; + padding-left: 0; + left: 0; + width: 100%; + max-width: none; } + +.wp-block[data-type="core/group"][data-align="full"] > div > .wp-block-group.has-background > .wp-block-group__inner-container > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block[data-align="full"] { + width: calc(100% + 60px); } + +[data-type="core/group"].is-selected .block-list-appender { + margin-left: 0; + margin-right: 0; } + +[data-type="core/group"].is-selected .has-background .block-list-appender { + margin-top: 18px; + margin-bottom: 18px; } + +.wp-block-html { + margin-bottom: 28px; } + .wp-block-html .block-editor-plain-text { + font-family: Menlo, Consolas, monaco, monospace; + color: #23282d; + padding: 0.8em 1em; + border: 1px solid #e2e4e7; + border-radius: 4px; + max-height: 250px; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; } + @media (min-width: 600px) { + .wp-block-html .block-editor-plain-text { + font-size: 13px; } } + .wp-block-html .block-editor-plain-text:focus { + box-shadow: none; } + +.wp-block-image { + position: relative; + margin-left: 0; + margin-right: 0; } + .wp-block-image.is-transient img { + opacity: 0.3; } + .wp-block-image figcaption img { + display: inline; } + .wp-block-image .components-spinner { + position: absolute; + top: 50%; + left: 50%; + margin-top: -9px; + margin-left: -9px; } + +.wp-block-image .components-resizable-box__container { + display: inline-block; } + .wp-block-image .components-resizable-box__container img { + display: block; + width: inherit; + height: inherit; } + +.wp-block-image.is-focused .components-resizable-box__handle { + display: block; + z-index: 1; } + +.block-editor-block-list__block[data-type="core/image"][data-align="center"] .wp-block-image { + margin-left: auto; + margin-right: auto; } + +.block-editor-block-list__block[data-type="core/image"][data-align="center"][data-resized="false"] .wp-block-image > div { + margin-left: auto; + margin-right: auto; } + +.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal { + position: absolute; + left: 0; + right: 0; + margin: -1px 0; } + @media (min-width: 600px) { + .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal { + margin: -1px; } } + +[data-type="core/image"][data-align="center"] figure, +[data-type="core/image"][data-align="left"] figure, +[data-type="core/image"][data-align="right"] figure { + margin: 0; } + +[data-type="core/image"][data-align="wide"] figure img, +[data-type="core/image"][data-align="full"] figure img { + width: 100%; } + +[data-type="core/image"] figure.is-resized { + margin: 0; } + +.wp-block-latest-comments.has-avatars .avatar { + margin-right: 10px; } + +.wp-block-latest-comments__comment-excerpt p { + font-size: 14px; + line-height: 1.8; + margin: 5px 0 20px; + padding-top: 0; } + +.wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment { + min-height: 36px; } + +.block-editor .wp-block-latest-posts { + padding-left: 2.5em; } + .block-editor .wp-block-latest-posts.is-grid { + padding-left: 0; } + +.wp-block-latest-posts li a > div { + display: inline; } + +.wp-block-legacy-widget__edit-container, +.wp-block-legacy-widget__preview { + padding-left: 2.5em; + padding-right: 2.5em; } + +.wp-block-legacy-widget__edit-container .widget-inside { + border: none; + display: block; + box-shadow: none; } + +.wp-block-legacy-widget__update-button { + margin-left: auto; + display: block; } + +.wp-block-legacy-widget__preview { + overflow: auto; } + +.wp-block-legacy-widget__edit-widget-title { + margin: -14px -13px 0; + background: #f8f9f9; + color: #555d66; + top: -13px; + position: relative; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + padding: 8px 14px; + font-weight: 600; } + +.wp-block-media-text .__resizable_base__ { + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1 / span 2; + -ms-grid-row: 2; + grid-row: 2; } + +.wp-block-media-text.is-vertically-aligned-top .block-editor-inner-blocks, +.wp-block-media-text.is-vertically-aligned-top .editor-media-container__resizer { + -ms-grid-row-align: start; + align-self: start; } + +.wp-block-media-text .block-editor-inner-blocks, +.wp-block-media-text .editor-media-container__resizer, +.wp-block-media-text.is-vertically-aligned-center .block-editor-inner-blocks, +.wp-block-media-text.is-vertically-aligned-center .editor-media-container__resizer { + -ms-grid-row-align: center; + align-self: center; } + +.wp-block-media-text.is-vertically-aligned-bottom .block-editor-inner-blocks, +.wp-block-media-text.is-vertically-aligned-bottom .editor-media-container__resizer { + -ms-grid-row-align: end; + align-self: end; } + +.wp-block-media-text .editor-media-container__resizer { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; + width: 100% !important; } + +.wp-block-media-text.is-image-fill .editor-media-container__resizer { + height: 100% !important; } + +.wp-block-media-text.has-media-on-the-right .editor-media-container__resizer { + -ms-grid-column: 2; + grid-column: 2; + -ms-grid-row: 1; + grid-row: 1; } + +.wp-block-media-text .block-editor-inner-blocks { + word-break: break-word; + -ms-grid-column: 2; + grid-column: 2; + -ms-grid-row: 1; + grid-row: 1; + text-align: initial; + padding: 0 8% 0 8%; } + +.wp-block-media-text.has-media-on-the-right .block-editor-inner-blocks { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } + +.wp-block-media-text > .block-editor-inner-blocks > .block-editor-block-list__layout > .block-editor-block-list__block { + max-width: unset; } + +.editor-media-container__resizer .components-resizable-box__handle { + display: none; } + +.wp-block-media-text.is-selected:not(.is-stacked-on-mobile) .editor-media-container__resizer .components-resizable-box__handle { + display: block; } + +@media (min-width: 600px) { + .wp-block-media-text.is-selected.is-stacked-on-mobile .editor-media-container__resizer .components-resizable-box__handle { + display: block; } } + +@media (max-width: 600px) { + .wp-block-media-text.is-stacked-on-mobile .block-editor-inner-blocks { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 2; + grid-row: 2; } + .wp-block-media-text.is-stacked-on-mobile .editor-media-container__resizer { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } + .wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .block-editor-inner-blocks { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } + .wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .editor-media-container__resizer { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 2; + grid-row: 2; } } + +.block-editor-block-list__block[data-type="core/more"] { + max-width: 100%; + text-align: center; + margin-top: 28px; + margin-bottom: 28px; } + +.block-editor .wp-block-more { + display: block; + text-align: center; + white-space: nowrap; } + .block-editor .wp-block-more input[type="text"] { + position: relative; + font-size: 13px; + text-transform: uppercase; + font-weight: 600; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + color: #6c7781; + border: none; + box-shadow: none; + white-space: nowrap; + text-align: center; + margin: 0; + border-radius: 4px; + background: #fff; + padding: 6px 8px; + height: 24px; + max-width: 100%; } + .block-editor .wp-block-more input[type="text"]:focus { + box-shadow: none; } + .block-editor .wp-block-more::before { + content: ""; + position: absolute; + top: calc(50%); + left: 0; + right: 0; + border-top: 3px dashed #ccd0d4; } + +[data-type="core/navigation"] .wp-block-navigation .block-editor-inner-blocks { + flex: 1; } + +[data-type="core/navigation"] .wp-block-navigation .block-editor-inner-blocks > .block-editor-block-list__layout { + margin-left: 0; + margin-right: 0; } + +[data-type="core/navigation"] .wp-block-navigation.items-justification-left .block-editor-inner-blocks > .block-editor-block-list__layout { + justify-content: flex-start; } + +[data-type="core/navigation"] .wp-block-navigation.items-justification-center .block-editor-inner-blocks > .block-editor-block-list__layout { + justify-content: center; } + +[data-type="core/navigation"] .wp-block-navigation.items-justification-right .block-editor-inner-blocks > .block-editor-block-list__layout { + justify-content: flex-end; } + +[data-type="core/navigation"] .wp-block-navigation .block-editor-block-list__block::before { + left: 0; + right: 0; } + +[data-type="core/navigation"].is-selected .wp-block-navigation .block-editor-block-list__block::before, +[data-type="core/navigation"].has-child-selected .wp-block-navigation .block-editor-block-list__block::before { + border-color: transparent !important; } + +[data-type="core/navigation"] .wp-block-navigation .block-editor-block-list__insertion-point { + display: none; } + +[data-type="core/navigation"] .wp-block-navigation .block-list-appender { + width: 28px; + height: 28px; } + [data-type="core/navigation"] .wp-block-navigation .block-list-appender .block-editor-button-block-appender { + padding: 8px; + padding-bottom: 4px; + padding-top: 4px; + outline: none; + background: none; } + +[data-type="core/navigation"] .wp-block-navigation .wp-block-navigation-link.is-selected .block-editor-rich-text__editable:focus { + min-width: 20px; } + +.wp-block-navigation__inserter-content { + padding: 16px; } + +/** + * Colors Selector component + */ +.block-library-colors-selector { + width: auto; } + .block-library-colors-selector .block-library-colors-selector__toggle { + display: block; + margin: 0 auto; + padding: 3px; + width: auto; } + .block-library-colors-selector .block-library-colors-selector__icon-container { + width: 42px; + height: 30px; + position: relative; + margin: 0 auto; + padding: 3px; + display: flex; + align-items: center; + border-radius: 4px; } + .block-library-colors-selector .block-library-colors-selector__icon-container::after { + content: ""; + pointer-events: none; + display: block; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 5px solid; + margin-left: 4px; + margin-right: 2px; } + .block-library-colors-selector .block-library-colors-selector__state-selection { + border-radius: 11px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); + width: 22px; + min-width: 22px; + height: 22px; + min-height: 22px; + line-height: 20px; + padding: 2px; } + .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color > svg, + .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color > svg path { + color: inherit; } + +.block-library-colors-selector__popover .color-palette-controller-container { + padding: 16px; } + +.block-library-colors-selector__popover .components-base-control__label { + height: 20px; + line-height: 20px; } + +.block-library-colors-selector__popover .component-color-indicator { + float: right; + margin-top: 2px; } + +.block-library-colors-selector__popover .components-panel__body-title { + display: none; } + +.wp-block-navigation-link__field .components-text-control__input.components-text-control__input, +.wp-block-navigation-link__container { + border-radius: 0; + line-height: 36px; + min-height: 36px; } + +/* + * Adjust Navigation Item. + */ +.wp-block-navigation-link .block-editor-block-list__layout { + display: block; } + +.wp-block-navigation-link.is-editing, .wp-block-navigation-link.is-selected { + min-width: 20px; } + +.wp-block-navigation-link.has-link .wp-block-navigation-link__label { + text-decoration: underline; } + +.wp-block-navigation-link .block-editor-rich-text__editable.is-selected:not(.keep-placeholder-on-focus):not(:focus) [data-rich-text-placeholder]::after { + display: inline-block; } + +.wp-block-navigation-link .block-list-appender { + margin: 16px; + margin-left: 10px; + margin-top: 10px; } + +[data-type="core/navigation-link"] .block-editor-block-toolbar { + left: 14px; } + +[data-type="core/navigation-link"] .block-editor-block-toolbar .components-toolbar.block-editor-block-mover .components-button.block-editor-block-mover__control-drag-handle { + display: none; } + +.wp-block-navigation-link__nofollow-external-link { + display: block; } + +.wp-block-navigation-link__separator { + margin: 8px 0 8px; + border-top: 1px solid #e2e4e7; } + +.components-popover.wp-block-navigation-link__dropdown-content { + margin-top: -1px; + margin-left: -4px; } + +.wp-block-navigation-link__dropdown-content .components-popover__content { + padding: 8px 0; } + +.wp-block-navigation .block-editor-block-list__block[data-type="core/navigation-link"] > .block-editor-block-list__insertion-point { + display: none; } + +.block-editor-block-list__block[data-type="core/nextpage"] { + max-width: 100%; + margin-top: 28px; + margin-bottom: 28px; } + +.wp-block-nextpage { + display: block; + text-align: center; + white-space: nowrap; } + .wp-block-nextpage > span { + font-size: 13px; + position: relative; + display: inline-block; + text-transform: uppercase; + font-weight: 600; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + color: #6c7781; + border-radius: 4px; + background: #fff; + padding: 6px 8px; + height: 24px; } + .wp-block-nextpage::before { + content: ""; + position: absolute; + top: calc(50%); + left: 0; + right: 0; + border-top: 3px dashed #ccd0d4; } + +.block-editor-block-list__block[data-type="core/paragraph"] .has-drop-cap:focus { + min-height: auto !important; } + +.block-editor-block-list__block[data-type="core/pullquote"][data-align="left"] p, .block-editor-block-list__block[data-type="core/pullquote"][data-align="right"] p { + font-size: 20px; } + +.wp-block-pullquote blockquote p { + font-size: 28px; + line-height: 1.6; } + +.wp-block-pullquote.is-style-solid-color { + margin-left: 0; + margin-right: 0; } + .wp-block-pullquote.is-style-solid-color blockquote p { + font-size: 32px; } + .wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation { + text-transform: none; + font-style: normal; } + +.wp-block-pullquote .wp-block-pullquote__citation { + color: inherit; } + +.wp-block-quote__citation { + font-size: 13px; } + +.block-editor .wp-block-rss { + padding-left: 2.5em; } + .block-editor .wp-block-rss.is-grid { + padding-left: 0; } + +.wp-block-rss li a > div { + display: inline; } + +.wp-block-search__input { + border-radius: 4px; + border: 1px solid #7e8993; + color: rgba(14, 28, 46, 0.62); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + padding: 8px; } + .wp-block-search__input:focus { + outline: none; } + +.wp-block-search__button { + background: #f7f7f7; + border-radius: 4px; + border: 1px solid #ccc; + box-shadow: inset 0 -1px 0 #ccc; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + padding: 6px 10px; } + +.wp-block-shortcode { + display: flex; + flex-direction: column; + padding: 14px; + background-color: rgba(139, 139, 150, 0.1); + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + margin-bottom: 28px; } + .wp-block-shortcode label { + display: flex; + align-items: center; + white-space: nowrap; + font-weight: 600; + flex-shrink: 0; } + .wp-block-shortcode .block-editor-plain-text { + width: 80%; + max-height: 250px; } + .wp-block-shortcode .dashicon { + margin-right: 8px; } + +.wp-social-link { + padding: 6px; } + +.wp-block-social-links.is-style-pill-shape .wp-social-link { + padding-left: 16px; + padding-right: 16px; } + +.wp-block-social-links div.block-editor-url-input { + display: inline-block; + margin-left: 8px; } + +.wp-block-social-links .block-editor-block-list__layout { + display: flex; + justify-content: flex-start; } + +[data-type="core/social-links"] .wp-block-social-links > .block-editor-inner-blocks > .block-editor-block-list__layout { + margin-left: 0; + margin-right: 0; } + +[data-type="core/social-links"] .wp-block-social-links > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block { + width: auto; + padding-left: 0; + padding-right: 0; + margin-left: 0; + margin-right: 0; + margin-top: 0; + margin-bottom: 0; } + +[data-type="core/social-links"] .wp-block-social-links > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block::before { + border-right: none; + border-top: none; + border-bottom: none; } + +[data-type="core/social-links"].is-selected .wp-block-social-links .block-editor-block-list__block::before, +[data-type="core/social-links"].has-child-selected .wp-block-social-links .block-editor-block-list__block::before { + border-color: transparent !important; } + +[data-type="core/social-links"] .wp-block-social-links .block-editor-block-list__insertion-point { + display: none; } + +.wp-block-social-links .block-list-appender { + margin: 0; } + .wp-block-social-links .block-list-appender .block-editor-button-block-appender { + padding: 8px; + outline: none; + background: none; } + +[data-type="core/social-links"][data-align="center"] .wp-block-social-links { + justify-content: center; } + +.block-editor-block-preview__content .wp-social-link:disabled { + opacity: 1; } + +.block-editor-block-preview__content [data-type="core/social-links"] { + width: auto !important; + display: inline-block; } + +[data-type="core/social-links"]:not(.is-selected):not(.has-child-selected) .wp-block-social-links { + min-height: 36px; } + +[data-type="core/social-links"] .wp-social-link__is-incomplete { + transition: transform 0.1s ease; + transform-origin: center center; } + +[data-type="core/social-links"]:not(.is-selected):not(.has-child-selected) .wp-social-link__is-incomplete { + opacity: 0; + transform: scale(0); + width: 0; + padding: 0; + margin-right: 0; } + +.wp-social-link.wp-social-link__is-incomplete { + opacity: 0.5; } + @media (prefers-reduced-motion: reduce) { + .wp-social-link.wp-social-link__is-incomplete { + transition-duration: 0s; } } + +.wp-block-social-links .is-selected .wp-social-link__is-incomplete, +.wp-social-link.wp-social-link__is-incomplete:hover, +.wp-social-link.wp-social-link__is-incomplete:focus { + opacity: 1; } + +[data-type="core/social-links"] .wp-social-link:focus { + opacity: 1; + box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; + outline: 2px solid transparent; } + +.block-library-spacer__resize-container.is-selected { + background: #f3f4f5; } + +.block-library-spacer__resize-container { + clear: both; + margin-bottom: 28px; } + +.edit-post-visual-editor p.wp-block-subhead { + color: #6c7781; + font-size: 1.1em; + font-style: italic; } + +.block-editor-block-list__block[data-type="core/table"][data-align="left"], .block-editor-block-list__block[data-type="core/table"][data-align="right"], .block-editor-block-list__block[data-type="core/table"][data-align="center"] { + height: auto; } + .block-editor-block-list__block[data-type="core/table"][data-align="left"] table, .block-editor-block-list__block[data-type="core/table"][data-align="right"] table, .block-editor-block-list__block[data-type="core/table"][data-align="center"] table { + width: auto; } + .block-editor-block-list__block[data-type="core/table"][data-align="left"] td, + .block-editor-block-list__block[data-type="core/table"][data-align="left"] th, .block-editor-block-list__block[data-type="core/table"][data-align="right"] td, + .block-editor-block-list__block[data-type="core/table"][data-align="right"] th, .block-editor-block-list__block[data-type="core/table"][data-align="center"] td, + .block-editor-block-list__block[data-type="core/table"][data-align="center"] th { + word-break: break-word; } + +.block-editor-block-list__block[data-type="core/table"][data-align="center"] { + text-align: initial; } + .block-editor-block-list__block[data-type="core/table"][data-align="center"] table { + margin: 0 auto; } + +.wp-block-table { + margin: 0; } + .wp-block-table table { + border-collapse: collapse; } + .wp-block-table td, + .wp-block-table th { + border: 1px solid; } + .wp-block-table td.is-selected, + .wp-block-table th.is-selected { + border-color: #00a0d2; + box-shadow: inset 0 0 0 1px #00a0d2; + border-style: double; } + .wp-block-table figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-input { + width: 112px; + margin-right: 8px; + margin-bottom: 0; } + .wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-input input { + height: 36px; } + +.wp-block-table__placeholder-form.wp-block-table__placeholder-form .components-base-control__field { + margin-bottom: 0; } + +.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-button { + margin-top: auto; + margin-right: auto; } + +.block-editor .wp-block-tag-cloud a { + display: inline-block; + margin-right: 5px; } + +.block-editor .wp-block-tag-cloud span { + display: inline-block; + margin-left: 5px; + color: #8f98a1; + text-decoration: none; } + +.wp-block-template-part__placeholder-input-container { + display: flex; + flex-wrap: wrap; + width: 100%; } + +.wp-block-template-part__placeholder-input { + margin: 5px; } + +.wp-block-template-part__placeholder-preview { + margin-bottom: 15px; + width: 100%; } + .wp-block-template-part__placeholder-preview .block-editor-block-preview__container { + padding: 1px; } + .wp-block-template-part__placeholder-preview .block-editor-block-preview__content { + position: initial; } + +.wp-block-template-part__placeholder-preview-title { + font-size: 15px; + font-weight: 600; + margin-bottom: 4px; } + +.wp-block-text-columns .block-editor-rich-text__editable:focus { + outline: 1px solid #e2e4e7; } + +pre.wp-block-verse { + color: #191e23; + white-space: nowrap; + font-family: inherit; + font-size: inherit; + padding: 1em; + overflow: auto; } + +.block-editor-block-list__block[data-align="center"] { + text-align: center; } + +.editor-video-poster-control .components-button { + display: block; + margin-right: 8px; } + +.editor-video-poster-control .components-button + .components-button { + margin-top: 1em; } + +/** + * Import styles from internal editor components used by the blocks. + */ +.block-editor-block-list__layout .reusable-block-edit-panel { + align-items: center; + background: #f8f9f9; + color: #555d66; + display: flex; + flex-wrap: wrap; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + position: relative; + top: -14px; + margin: 0 -14px; + padding: 8px 14px; + z-index: 61; + border: 1px dashed rgba(145, 151, 162, 0.25); + border-bottom: none; } + .block-editor-block-list__layout .block-editor-block-list__layout .reusable-block-edit-panel { + margin: 0 -14px; + padding: 8px 14px; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__spinner { + margin: 0 5px; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__info { + margin-right: auto; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__label { + margin-right: 8px; + white-space: nowrap; + font-weight: 600; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__title { + flex: 1 1 100%; + font-size: 14px; + height: 30px; + margin: 4px 0 8px; } + .block-editor-block-list__layout .reusable-block-edit-panel .components-button.reusable-block-edit-panel__button { + flex-shrink: 0; } + @media (min-width: 960px) { + .block-editor-block-list__layout .reusable-block-edit-panel { + flex-wrap: nowrap; } + .block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__title { + margin: 0; } + .block-editor-block-list__layout .reusable-block-edit-panel .components-button.reusable-block-edit-panel__button { + margin: 0 0 0 5px; } } + +.block-editor-block-list__layout .is-selected .reusable-block-edit-panel { + border-color: rgba(66, 88, 99, 0.4); + border-left-color: transparent; } + .is-dark-theme .block-editor-block-list__layout .is-selected .reusable-block-edit-panel { + border-color: rgba(255, 255, 255, 0.45); + border-left-color: transparent; } + +.is-navigate-mode .is-selected .reusable-block-edit-panel { + border-color: #007cba; + border-left-color: transparent; } + .is-dark-theme .is-navigate-mode .is-selected .reusable-block-edit-panel { + border-color: #007cba; + border-left-color: transparent; } + +/** + * Editor Normalization Styles + * + * These are only output in the editor, but styles here are NOT prefixed .editor-styles-wrapper. + * This allows us to create normalization styles that are easily overridden by editor styles. + */ +.editor-styles-wrapper .block-editor-block-list__block { + margin-top: 28px; + margin-bottom: 28px; } diff --git a/wp-includes/css/dist/block-library/editor.min.css b/wp-includes/css/dist/block-library/editor.min.css new file mode 100644 index 0000000..cfd90a4 --- /dev/null +++ b/wp-includes/css/dist/block-library/editor.min.css @@ -0,0 +1,2 @@ +.block-editor ul.wp-block-archives{padding-left:2.5em}.wp-block-audio{margin-left:0;margin-right:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow__click-redirect{min-height:auto}.block-editor-block-list__block[data-type="core/button"][data-align=center]{text-align:center;margin-left:auto;margin-right:auto}.block-editor-block-list__block[data-type="core/button"][data-align=right]{ + /*!rtl:ignore*/text-align:right}.wp-block-button{position:relative}.wp-block-button [contenteditable]{cursor:text}.wp-block-button:not(.has-text-color):not(.is-style-outline) [data-rich-text-placeholder]:after{color:#fff}.wp-block-button .block-editor-rich-text__editable:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #00a0d2;outline:2px solid transparent;outline-offset:-2px}.wp-block-button [data-rich-text-placeholder]:after{opacity:.8}.wp-block-button__inline-link{color:#555d66;height:0;overflow:hidden;max-width:290px}.wp-block-button__inline-link-input__suggestions{max-width:290px}@media (min-width:782px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:260px}}@media (min-width:960px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:290px}}.is-selected .wp-block-button__inline-link,.is-typing .wp-block-button__inline-link{height:auto;overflow:visible;margin-top:16px}div[data-type="core/button"]{display:table}.wp-block-buttons .wp-block.block-editor-block-list__block[data-type="core/button"]{display:inline-block;width:auto}.wp-block-buttons[data-align=center] .block-editor-block-list__layout{display:flex;align-items:center;flex-wrap:wrap;justify-content:center}.wp-block-buttons[data-align=right] .block-editor-block-list__layout{display:flex;justify-content:flex-end}.wp-block-buttons .block-list-appender{display:inline-block;margin:0}.wp-block-buttons .block-editor-block-list__layout>div:last-child{display:inline-block}.wp-block-buttons .block-editor-button-block-appender{background:none;outline:none}.block-editor .wp-block-categories ul{padding-left:2.5em}.block-editor .wp-block-categories ul ul{margin-top:6px}.wp-block-code .block-editor-plain-text{font-family:Menlo,Consolas,monaco,monospace;color:#23282d;font-size:16px}@media (min-width:600px){.wp-block-code .block-editor-plain-text{font-size:13px}}.wp-block-code .block-editor-plain-text:focus{box-shadow:none}.wp-block-columns .block-editor-block-list__layout .block-editor-block-list__block{max-width:none}.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar[data-type="core/column"]{margin-left:0}.wp-block-columns{display:block}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout{display:flex;flex-wrap:wrap}@media (min-width:782px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout{flex-wrap:nowrap}}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"],.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"] .block-core-columns{display:flex;flex-direction:column;flex:1 1 auto}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"],.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"] .block-core-columns{flex:1}}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]{padding-left:0;padding-right:0;margin:0 -14px;min-width:0;word-break:break-word;overflow-wrap:break-word;flex-basis:100%}@media (min-width:600px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]{flex-basis:calc(50% - 16px);flex-grow:0;margin-left:0;margin-right:0}}@media (min-width:782px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]{flex-basis:0;flex-grow:1}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"][data-has-explicit-width]{flex-grow:0}}@media (min-width:600px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]:nth-child(2n){margin-left:32px}}@media (min-width:782px){.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]:not(:first-child){margin-left:32px}}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]:before{left:0;right:0}.wp-block-columns>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-type="core/column"]>.block-core-columns>.block-editor-inner-blocks{margin-top:-28px;margin-bottom:-28px}[data-type="core/columns"] .block-list-appender{margin-top:28px;margin-bottom:28px}.are-vertically-aligned-top .block-core-columns,div.block-core-columns.is-vertically-aligned-top{justify-content:flex-start}.are-vertically-aligned-center .block-core-columns,div.block-core-columns.is-vertically-aligned-center{justify-content:center}.are-vertically-aligned-bottom .block-core-columns,div.block-core-columns.is-vertically-aligned-bottom{justify-content:flex-end}[data-type="core/column"]>.editor-block-list__breadcrumb{left:-3px}.block-core-columns>.block-editor-inner-blocks.has-overlay:after{left:0;right:0}[data-type="core/columns"][data-align=full] .wp-block-columns{padding-left:14px;padding-right:14px}@media (min-width:600px){[data-type="core/columns"][data-align=full] .wp-block-columns{padding-left:46px;padding-right:46px}}.wp-block-cover-image.components-placeholder h2,.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover-image .block-editor-block-list__layout,.wp-block-cover .block-editor-block-list__layout{width:100%}.wp-block-cover-image .block-editor-block-list__block,.wp-block-cover .block-editor-block-list__block{color:#f8f9f9}.wp-block-cover-image .wp-block-cover__inner-container,.wp-block-cover .wp-block-cover__inner-container{text-align:left}.wp-block-cover-image .wp-block-cover__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout,.wp-block-cover .wp-block-cover__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout{margin-left:0;margin-right:0}.wp-block-cover-image .wp-block-cover__placeholder-background-options,.wp-block-cover .wp-block-cover__placeholder-background-options{margin-top:1em;width:100%}[data-align=left] .wp-block-cover,[data-align=left] .wp-block-cover-image,[data-align=right] .wp-block-cover,[data-align=right] .wp-block-cover-image{max-width:290px;width:100%}.block-library-cover__reset-button{margin-left:auto}.block-library-cover__resize-container:not(.is-resizing){height:auto!important}.wp-block-embed{margin-left:0;margin-right:0;clear:both}@media (min-width:600px){.wp-block-embed{min-width:360px}.wp-block-embed.components-placeholder{min-width:0}}.wp-block-embed.is-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:1em;min-height:200px;text-align:center;background:#f8f9f9}.wp-block-embed.is-loading p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed .components-placeholder__learn-more{margin-top:1em}.block-library-embed__interactive-overlay{position:absolute;top:0;left:0;right:0;bottom:0;opacity:0}.wp-block-file{display:flex;justify-content:space-between;align-items:center;margin-bottom:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file .wp-block-file__textlink{display:inline-block;min-width:1em}.wp-block-file .wp-block-file__textlink:focus{box-shadow:none}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-left:.75em}.wp-block-file .wp-block-file__copy-url-button{margin-left:1em}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{padding-left:2.5em;margin-left:0}.wp-block-freeform.block-library-rich-text__tinymce blockquote{margin:0;box-shadow:inset 0 0 0 0 #e2e4e7;border-left:4px solid #000;padding-left:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{white-space:pre-wrap;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;color:#23282d}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:#007fac}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{padding:0 2px;margin:0 -2px;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;background:#e5f5fa}.wp-block-freeform.block-library-rich-text__tinymce code{padding:2px;border-radius:2px;color:#23282d;background:#f3f4f5;font-family:Menlo,Consolas,monaco,monospace;font-size:14px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#e8eaeb}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{width:96%;height:20px;display:block;margin:15px auto;outline:0;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-size:1900px 20px;background-repeat:no-repeat;background-position:50%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{padding-top:.5em;margin:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview{width:99.99%;position:relative;clear:both;margin-bottom:16px;border:1px solid transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{display:block;max-width:100%;background:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{position:absolute;top:0;right:0;bottom:0;left:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #e8eaeb;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{border:1px solid #e8eaeb;padding:1em 0;margin:0;word-wrap:break-word}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;margin:0 auto;width:32px;height:32px;font-size:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{content:"";display:table;clear:both}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{margin:auto -6px;padding:6px 0;line-height:1;overflow-x:hidden}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{float:left;margin:0;text-align:center;padding:6px;box-sizing:border-box}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.33333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.66667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.28571%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.11111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{max-width:100%;height:auto;border:none;padding:0}div[data-type="core/freeform"]:before{transition:border-color .1s linear,box-shadow .1s linear;border:1px solid #e2e4e7;outline:1px solid transparent}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#b5bcc2 #b5bcc2 #b5bcc2 transparent}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{content:"";display:table;clear:both}.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i,.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i{color:#23282d}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-right:0;margin-left:8px}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{display:none;width:auto;margin:0 -14px;position:-webkit-sticky;position:sticky;z-index:10;top:14px;transform:translateY(-14px);border:1px solid #e2e4e7;border-bottom:none;padding:0}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar,div[data-type="core/freeform"].is-typing .block-library-classic__toolbar{display:block;border-color:#b5bcc2}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{display:block;background:#f5f5f5;border-bottom:1px solid #e2e4e7}.block-library-classic__toolbar:empty:before{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;content:attr(data-placeholder);color:#555d66;line-height:37px;padding:14px}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.wp-block-gallery li{list-style-type:none}.is-selected .wp-block-gallery{margin-bottom:0}figure.wp-block-gallery{display:block;margin:0}.blocks-gallery-grid.blocks-gallery-grid{padding-left:0;margin-left:0;margin-bottom:0}.blocks-gallery-item figure:not(.is-selected):focus{outline:none}.blocks-gallery-item figure.is-selected{outline:4px solid #0085ba}body.admin-color-sunrise .blocks-gallery-item figure.is-selected{outline:4px solid #d1864a}body.admin-color-ocean .blocks-gallery-item figure.is-selected{outline:4px solid #a3b9a2}body.admin-color-midnight .blocks-gallery-item figure.is-selected{outline:4px solid #e14d43}body.admin-color-ectoplasm .blocks-gallery-item figure.is-selected{outline:4px solid #a7b656}body.admin-color-coffee .blocks-gallery-item figure.is-selected{outline:4px solid #c2a68c}body.admin-color-blue .blocks-gallery-item figure.is-selected{outline:4px solid #82b4cb}body.admin-color-light .blocks-gallery-item figure.is-selected{outline:4px solid #0085ba}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu{background:#fff;border:1px solid rgba(66,88,99,.4);border-radius:4px;transition:box-shadow .2s ease-out}@media (prefers-reduced-motion:reduce){.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu{transition-duration:0s}}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu:hover,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu:hover{box-shadow:0 2px 10px rgba(25,30,35,.1),0 0 2px rgba(25,30,35,.1)}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button{color:rgba(14,28,46,.62);padding:2px;height:24px}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}@media (min-width:600px){.columns-7 .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button,.columns-7 .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button,.columns-8 .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button,.columns-8 .blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button{padding:0;width:inherit;height:inherit}}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu .components-button:focus,.blocks-gallery-item .is-selected .block-library-gallery-item__move-menu .components-button:focus{color:inherit}.block-library-gallery-item__inline-menu,.block-library-gallery-item__move-menu{margin:8px;display:inline-flex;z-index:20}.block-library-gallery-item__inline-menu .components-button,.block-library-gallery-item__move-menu .components-button{color:transparent}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-7 .block-library-gallery-item__move-menu,.columns-8 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__move-menu{padding:2px}}.block-library-gallery-item__inline-menu{position:absolute;top:-2px;right:-2px}.block-library-gallery-item__move-menu{position:absolute;top:-2px;left:-2px}.blocks-gallery-item__move-backward,.blocks-gallery-item__move-forward,.blocks-gallery-item__remove{padding:0}.blocks-gallery-item .components-spinner{position:absolute;top:50%;left:50%;margin-top:-9px;margin-left:-9px}.wp-block[data-type="core/group"] .block-editor-block-list__insertion-point{left:0;right:0}.wp-block[data-type="core/group"]>div>.wp-block-group.has-background>.wp-block-group__inner-container>.block-editor-inner-blocks{margin-top:-32px;margin-bottom:-32px}.wp-block[data-type="core/group"]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{margin-left:auto;margin-right:auto;padding-left:28px;padding-right:28px}@media (min-width:600px){.wp-block[data-type="core/group"]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{padding-left:58px;padding-right:58px}}.wp-block[data-type="core/group"]>div>.wp-block-group.has-background>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{margin-left:-30px;width:calc(100% + 60px)}.wp-block[data-type="core/group"][data-align=full]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks{margin-left:auto;margin-right:auto;padding-left:0;padding-right:0}.wp-block[data-type="core/group"][data-align=full]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout{margin-left:0;margin-right:0}.wp-block[data-type="core/group"][data-align=full]>div>.wp-block-group>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{padding-right:0;padding-left:0;left:0;width:100%;max-width:none}.wp-block[data-type="core/group"][data-align=full]>div>.wp-block-group.has-background>.wp-block-group__inner-container>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block[data-align=full]{width:calc(100% + 60px)}[data-type="core/group"].is-selected .block-list-appender{margin-left:0;margin-right:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-top:18px;margin-bottom:18px}.wp-block-html{margin-bottom:28px}.wp-block-html .block-editor-plain-text{font-family:Menlo,Consolas,monaco,monospace;color:#23282d;padding:.8em 1em;border:1px solid #e2e4e7;border-radius:4px;max-height:250px;font-size:16px}@media (min-width:600px){.wp-block-html .block-editor-plain-text{font-size:13px}}.wp-block-html .block-editor-plain-text:focus{box-shadow:none}.wp-block-image{position:relative;margin-left:0;margin-right:0}.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{position:absolute;top:50%;left:50%;margin-top:-9px;margin-left:-9px}.wp-block-image .components-resizable-box__container{display:inline-block}.wp-block-image .components-resizable-box__container img{display:block;width:inherit;height:inherit}.wp-block-image.is-focused .components-resizable-box__handle{display:block;z-index:1}.block-editor-block-list__block[data-type="core/image"][data-align=center] .wp-block-image{margin-left:auto;margin-right:auto}.block-editor-block-list__block[data-type="core/image"][data-align=center][data-resized=false] .wp-block-image>div{margin-left:auto;margin-right:auto}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{position:absolute;left:0;right:0;margin:-1px 0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-type="core/image"][data-align=center] figure,[data-type="core/image"][data-align=left] figure,[data-type="core/image"][data-align=right] figure{margin:0}[data-type="core/image"][data-align=full] figure img,[data-type="core/image"][data-align=wide] figure img{width:100%}[data-type="core/image"] figure.is-resized{margin:0}.wp-block-latest-comments.has-avatars .avatar{margin-right:10px}.wp-block-latest-comments__comment-excerpt p{font-size:14px;line-height:1.8;margin:5px 0 20px;padding-top:0}.wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment{min-height:36px}.block-editor .wp-block-latest-posts{padding-left:2.5em}.block-editor .wp-block-latest-posts.is-grid{padding-left:0}.wp-block-latest-posts li a>div{display:inline}.wp-block-legacy-widget__edit-container,.wp-block-legacy-widget__preview{padding-left:2.5em;padding-right:2.5em}.wp-block-legacy-widget__edit-container .widget-inside{border:none;display:block;box-shadow:none}.wp-block-legacy-widget__update-button{margin-left:auto;display:block}.wp-block-legacy-widget__preview{overflow:auto}.wp-block-legacy-widget__edit-widget-title{margin:-14px -13px 0;background:#f8f9f9;color:#555d66;top:-13px;position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:8px 14px;font-weight:600}.wp-block-media-text .__resizable_base__{-ms-grid-column:1;-ms-grid-column-span:2;grid-column:1/span 2;-ms-grid-row:2;grid-row:2}.wp-block-media-text.is-vertically-aligned-top .block-editor-inner-blocks,.wp-block-media-text.is-vertically-aligned-top .editor-media-container__resizer{-ms-grid-row-align:start;align-self:start}.wp-block-media-text .block-editor-inner-blocks,.wp-block-media-text .editor-media-container__resizer,.wp-block-media-text.is-vertically-aligned-center .block-editor-inner-blocks,.wp-block-media-text.is-vertically-aligned-center .editor-media-container__resizer{-ms-grid-row-align:center;align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .block-editor-inner-blocks,.wp-block-media-text.is-vertically-aligned-bottom .editor-media-container__resizer{-ms-grid-row-align:end;align-self:end}.wp-block-media-text .editor-media-container__resizer{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1;width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text .block-editor-inner-blocks,.wp-block-media-text.has-media-on-the-right .editor-media-container__resizer{-ms-grid-column:2;grid-column:2;-ms-grid-row:1;grid-row:1}.wp-block-media-text .block-editor-inner-blocks{word-break:break-word;text-align:initial;padding:0 8%}.wp-block-media-text.has-media-on-the-right .block-editor-inner-blocks{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text>.block-editor-inner-blocks>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}.editor-media-container__resizer .components-resizable-box__handle{display:none}.wp-block-media-text.is-selected:not(.is-stacked-on-mobile) .editor-media-container__resizer .components-resizable-box__handle{display:block}@media (min-width:600px){.wp-block-media-text.is-selected.is-stacked-on-mobile .editor-media-container__resizer .components-resizable-box__handle{display:block}}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile .block-editor-inner-blocks{-ms-grid-column:1;grid-column:1;-ms-grid-row:2;grid-row:2}.wp-block-media-text.is-stacked-on-mobile .editor-media-container__resizer,.wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .block-editor-inner-blocks{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .editor-media-container__resizer{-ms-grid-column:1;grid-column:1;-ms-grid-row:2;grid-row:2}}.block-editor-block-list__block[data-type="core/more"]{max-width:100%;text-align:center;margin-top:28px;margin-bottom:28px}.block-editor .wp-block-more{display:block;text-align:center;white-space:nowrap}.block-editor .wp-block-more input[type=text]{position:relative;font-size:13px;text-transform:uppercase;font-weight:600;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;color:#6c7781;border:none;box-shadow:none;white-space:nowrap;text-align:center;margin:0;border-radius:4px;background:#fff;padding:6px 8px;height:24px;max-width:100%}.block-editor .wp-block-more input[type=text]:focus{box-shadow:none}.block-editor .wp-block-more:before{content:"";position:absolute;top:50%;left:0;right:0;border-top:3px dashed #ccd0d4}[data-type="core/navigation"] .wp-block-navigation .block-editor-inner-blocks{flex:1}[data-type="core/navigation"] .wp-block-navigation .block-editor-inner-blocks>.block-editor-block-list__layout{margin-left:0;margin-right:0}[data-type="core/navigation"] .wp-block-navigation.items-justification-left .block-editor-inner-blocks>.block-editor-block-list__layout{justify-content:flex-start}[data-type="core/navigation"] .wp-block-navigation.items-justification-center .block-editor-inner-blocks>.block-editor-block-list__layout{justify-content:center}[data-type="core/navigation"] .wp-block-navigation.items-justification-right .block-editor-inner-blocks>.block-editor-block-list__layout{justify-content:flex-end}[data-type="core/navigation"] .wp-block-navigation .block-editor-block-list__block:before{left:0;right:0}[data-type="core/navigation"].has-child-selected .wp-block-navigation .block-editor-block-list__block:before,[data-type="core/navigation"].is-selected .wp-block-navigation .block-editor-block-list__block:before{border-color:transparent!important}[data-type="core/navigation"] .wp-block-navigation .block-editor-block-list__insertion-point{display:none}[data-type="core/navigation"] .wp-block-navigation .block-list-appender{width:28px;height:28px}[data-type="core/navigation"] .wp-block-navigation .block-list-appender .block-editor-button-block-appender{padding:4px 8px;outline:none;background:none}[data-type="core/navigation"] .wp-block-navigation .wp-block-navigation-link.is-selected .block-editor-rich-text__editable:focus{min-width:20px}.wp-block-navigation__inserter-content{padding:16px}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{width:42px;height:30px;position:relative;margin:0 auto;padding:3px;display:flex;align-items:center;border-radius:4px}.block-library-colors-selector .block-library-colors-selector__icon-container:after{content:"";pointer-events:none;display:block;width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:5px solid;margin-left:4px;margin-right:2px}.block-library-colors-selector .block-library-colors-selector__state-selection{border-radius:11px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);width:22px;min-width:22px;height:22px;min-height:22px;line-height:20px;padding:2px}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:right;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.wp-block-navigation-link__container,.wp-block-navigation-link__field .components-text-control__input.components-text-control__input{border-radius:0;line-height:36px;min-height:36px}.wp-block-navigation-link .block-editor-block-list__layout{display:block}.wp-block-navigation-link.is-editing,.wp-block-navigation-link.is-selected{min-width:20px}.wp-block-navigation-link.has-link .wp-block-navigation-link__label{text-decoration:underline}.wp-block-navigation-link .block-editor-rich-text__editable.is-selected:not(.keep-placeholder-on-focus):not(:focus) [data-rich-text-placeholder]:after{display:inline-block}.wp-block-navigation-link .block-list-appender{margin:10px 16px 16px 10px}[data-type="core/navigation-link"] .block-editor-block-toolbar{left:14px}[data-type="core/navigation-link"] .block-editor-block-toolbar .components-toolbar.block-editor-block-mover .components-button.block-editor-block-mover__control-drag-handle{display:none}.wp-block-navigation-link__nofollow-external-link{display:block}.wp-block-navigation-link__separator{margin:8px 0;border-top:1px solid #e2e4e7}.components-popover.wp-block-navigation-link__dropdown-content{margin-top:-1px;margin-left:-4px}.wp-block-navigation-link__dropdown-content .components-popover__content{padding:8px 0}.wp-block-navigation .block-editor-block-list__block[data-type="core/navigation-link"]>.block-editor-block-list__insertion-point{display:none}.block-editor-block-list__block[data-type="core/nextpage"]{max-width:100%;margin-top:28px;margin-bottom:28px}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{font-size:13px;position:relative;display:inline-block;text-transform:uppercase;font-weight:600;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;color:#6c7781;border-radius:4px;background:#fff;padding:6px 8px;height:24px}.wp-block-nextpage:before{content:"";position:absolute;top:50%;left:0;right:0;border-top:3px dashed #ccd0d4}.block-editor-block-list__block[data-type="core/paragraph"] .has-drop-cap:focus{min-height:auto!important}.block-editor-block-list__block[data-type="core/pullquote"][data-align=left] p,.block-editor-block-list__block[data-type="core/pullquote"][data-align=right] p{font-size:20px}.wp-block-pullquote blockquote p{font-size:28px;line-height:1.6}.wp-block-pullquote.is-style-solid-color{margin-left:0;margin-right:0}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{text-transform:none;font-style:normal}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}.wp-block-quote__citation{font-size:13px}.block-editor .wp-block-rss{padding-left:2.5em}.block-editor .wp-block-rss.is-grid{padding-left:0}.wp-block-rss li a>div{display:inline}.wp-block-search__input{border-radius:4px;border:1px solid #7e8993;color:rgba(14,28,46,.62);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:8px}.wp-block-search__input:focus{outline:none}.wp-block-search__button{background:#f7f7f7;border-radius:4px;border:1px solid #ccc;box-shadow:inset 0 -1px 0 #ccc;padding:6px 10px}.wp-block-search__button,.wp-block-shortcode{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-shortcode{display:flex;flex-direction:column;padding:14px;background-color:rgba(139,139,150,.1);margin-bottom:28px}.wp-block-shortcode label{display:flex;align-items:center;white-space:nowrap;font-weight:600;flex-shrink:0}.wp-block-shortcode .block-editor-plain-text{width:80%;max-height:250px}.wp-block-shortcode .dashicon{margin-right:8px}.wp-social-link{padding:6px}.wp-block-social-links.is-style-pill-shape .wp-social-link{padding-left:16px;padding-right:16px}.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-left:8px}.wp-block-social-links .block-editor-block-list__layout{display:flex;justify-content:flex-start}[data-type="core/social-links"] .wp-block-social-links>.block-editor-inner-blocks>.block-editor-block-list__layout{margin-left:0;margin-right:0}[data-type="core/social-links"] .wp-block-social-links>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block{width:auto;padding-left:0;padding-right:0;margin:0}[data-type="core/social-links"] .wp-block-social-links>.block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block:before{border-right:none;border-top:none;border-bottom:none}[data-type="core/social-links"].has-child-selected .wp-block-social-links .block-editor-block-list__block:before,[data-type="core/social-links"].is-selected .wp-block-social-links .block-editor-block-list__block:before{border-color:transparent!important}[data-type="core/social-links"] .wp-block-social-links .block-editor-block-list__insertion-point{display:none}.wp-block-social-links .block-list-appender{margin:0}.wp-block-social-links .block-list-appender .block-editor-button-block-appender{padding:8px;outline:none;background:none}[data-type="core/social-links"][data-align=center] .wp-block-social-links{justify-content:center}.block-editor-block-preview__content .wp-social-link:disabled{opacity:1}.block-editor-block-preview__content [data-type="core/social-links"]{width:auto!important;display:inline-block}[data-type="core/social-links"]:not(.is-selected):not(.has-child-selected) .wp-block-social-links{min-height:36px}[data-type="core/social-links"] .wp-social-link__is-incomplete{transition:transform .1s ease;transform-origin:center center}[data-type="core/social-links"]:not(.is-selected):not(.has-child-selected) .wp-social-link__is-incomplete{opacity:0;transform:scale(0);width:0;padding:0;margin-right:0}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}[data-type="core/social-links"] .wp-social-link:focus{opacity:1;box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;outline:2px solid transparent}.block-library-spacer__resize-container.is-selected{background:#f3f4f5}.block-library-spacer__resize-container{clear:both;margin-bottom:28px}.edit-post-visual-editor p.wp-block-subhead{color:#6c7781;font-size:1.1em;font-style:italic}.block-editor-block-list__block[data-type="core/table"][data-align=center],.block-editor-block-list__block[data-type="core/table"][data-align=left],.block-editor-block-list__block[data-type="core/table"][data-align=right]{height:auto}.block-editor-block-list__block[data-type="core/table"][data-align=center] table,.block-editor-block-list__block[data-type="core/table"][data-align=left] table,.block-editor-block-list__block[data-type="core/table"][data-align=right] table{width:auto}.block-editor-block-list__block[data-type="core/table"][data-align=center] td,.block-editor-block-list__block[data-type="core/table"][data-align=center] th,.block-editor-block-list__block[data-type="core/table"][data-align=left] td,.block-editor-block-list__block[data-type="core/table"][data-align=left] th,.block-editor-block-list__block[data-type="core/table"][data-align=right] td,.block-editor-block-list__block[data-type="core/table"][data-align=right] th{word-break:break-word}.block-editor-block-list__block[data-type="core/table"][data-align=center]{text-align:initial}.block-editor-block-list__block[data-type="core/table"][data-align=center] table{margin:0 auto}.wp-block-table{margin:0}.wp-block-table table{border-collapse:collapse}.wp-block-table td,.wp-block-table th{border:1px solid}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:#00a0d2;box-shadow:inset 0 0 0 1px #00a0d2;border-style:double}.wp-block-table figcaption{color:#555d66;font-size:13px;text-align:center}.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-input{width:112px;margin-right:8px;margin-bottom:0}.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-input input{height:36px}.wp-block-table__placeholder-form.wp-block-table__placeholder-form .components-base-control__field{margin-bottom:0}.wp-block-table__placeholder-form.wp-block-table__placeholder-form .wp-block-table__placeholder-button{margin-top:auto;margin-right:auto}.block-editor .wp-block-tag-cloud a{display:inline-block;margin-right:5px}.block-editor .wp-block-tag-cloud span{display:inline-block;margin-left:5px;color:#8f98a1;text-decoration:none}.wp-block-template-part__placeholder-input-container{display:flex;flex-wrap:wrap;width:100%}.wp-block-template-part__placeholder-input{margin:5px}.wp-block-template-part__placeholder-preview{margin-bottom:15px;width:100%}.wp-block-template-part__placeholder-preview .block-editor-block-preview__container{padding:1px}.wp-block-template-part__placeholder-preview .block-editor-block-preview__content{position:static}.wp-block-template-part__placeholder-preview-title{font-size:15px;font-weight:600;margin-bottom:4px}.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #e2e4e7}pre.wp-block-verse{color:#191e23;white-space:nowrap;font-family:inherit;font-size:inherit;padding:1em;overflow:auto}.block-editor-block-list__block[data-align=center]{text-align:center}.editor-video-poster-control .components-button{display:block;margin-right:8px}.editor-video-poster-control .components-button+.components-button{margin-top:1em}.block-editor-block-list__layout .reusable-block-edit-panel{align-items:center;background:#f8f9f9;color:#555d66;display:flex;flex-wrap:wrap;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;position:relative;top:-14px;margin:0 -14px;padding:8px 14px;z-index:61;border:1px dashed rgba(145,151,162,.25);border-bottom:none}.block-editor-block-list__layout .block-editor-block-list__layout .reusable-block-edit-panel{margin:0 -14px;padding:8px 14px}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__spinner{margin:0 5px}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__info{margin-right:auto}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__label{margin-right:8px;white-space:nowrap;font-weight:600}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__title{flex:1 1 100%;font-size:14px;height:30px;margin:4px 0 8px}.block-editor-block-list__layout .reusable-block-edit-panel .components-button.reusable-block-edit-panel__button{flex-shrink:0}@media (min-width:960px){.block-editor-block-list__layout .reusable-block-edit-panel{flex-wrap:nowrap}.block-editor-block-list__layout .reusable-block-edit-panel .reusable-block-edit-panel__title{margin:0}.block-editor-block-list__layout .reusable-block-edit-panel .components-button.reusable-block-edit-panel__button{margin:0 0 0 5px}}.block-editor-block-list__layout .is-selected .reusable-block-edit-panel{border-color:rgba(66,88,99,.4) rgba(66,88,99,.4) rgba(66,88,99,.4) transparent}.is-dark-theme .block-editor-block-list__layout .is-selected .reusable-block-edit-panel{border-color:hsla(0,0%,100%,.45) hsla(0,0%,100%,.45) hsla(0,0%,100%,.45) transparent}.is-dark-theme .is-navigate-mode .is-selected .reusable-block-edit-panel,.is-navigate-mode .is-selected .reusable-block-edit-panel{border-color:#007cba #007cba #007cba transparent}.editor-styles-wrapper .block-editor-block-list__block{margin-top:28px;margin-bottom:28px} \ No newline at end of file diff --git a/wp-includes/css/dist/block-library/style-rtl.css b/wp-includes/css/dist/block-library/style-rtl.css new file mode 100644 index 0000000..b8d7bbb --- /dev/null +++ b/wp-includes/css/dist/block-library/style-rtl.css @@ -0,0 +1,1800 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.wp-block-audio figcaption { + margin-top: 0.5em; + margin-bottom: 1em; } + +.wp-block-audio audio { + width: 100%; + min-width: 300px; } + +.wp-block-button { + color: #fff; } + .wp-block-button.aligncenter { + text-align: center; } + .wp-block-button.alignright { + text-align: right; } + +.wp-block-button__link { + background-color: #32373c; + border: none; + border-radius: 28px; + box-shadow: none; + color: inherit; + cursor: pointer; + display: inline-block; + font-size: 18px; + margin: 0; + padding: 12px 24px; + text-align: center; + text-decoration: none; + overflow-wrap: break-word; } + .wp-block-button__link:hover, .wp-block-button__link:focus, .wp-block-button__link:active, .wp-block-button__link:visited { + color: inherit; } + +.wp-gs .wp-block-button__link:not(.has-background) { + background-color: var(--wp-block-core-button--color--background, var(--wp-color--primary, #32373c)); } + +.is-style-squared .wp-block-button__link { + border-radius: 0; } + +.no-border-radius.wp-block-button__link { + border-radius: 0 !important; } + +.is-style-outline { + color: #32373c; } + .is-style-outline .wp-block-button__link { + background-color: transparent; + border: 2px solid; } + +.wp-block-buttons .wp-block-button { + display: inline-block; + margin-left: 8px; + margin-bottom: 8px; } + +.wp-block-buttons.alignright .wp-block-button { + margin-left: none; + margin-right: 8px; } + +.wp-block-buttons.aligncenter { + text-align: center; } + +.wp-block-calendar { + text-align: center; } + .wp-block-calendar th, + .wp-block-calendar tbody td { + padding: 4px; + border: 1px solid #e2e4e7; } + .wp-block-calendar tfoot td { + border: none; } + .wp-block-calendar table { + width: 100%; + border-collapse: collapse; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } + .wp-block-calendar table th { + font-weight: 400; + background: #edeff0; } + .wp-block-calendar a { + text-decoration: underline; } + .wp-block-calendar tfoot a { + color: #00739c; } + .wp-block-calendar table tbody, + .wp-block-calendar table caption { + color: #40464d; } + +.wp-block-categories.alignleft { + margin-right: 2em; } + +.wp-block-categories.alignright { + margin-left: 2em; } + +.wp-block-columns { + display: flex; + margin-bottom: 28px; + flex-wrap: wrap; } + @media (min-width: 782px) { + .wp-block-columns { + flex-wrap: nowrap; } } + .wp-block-columns.has-background { + padding: 20px 30px; } + +.wp-block-column { + flex-grow: 1; + min-width: 0; + word-break: break-word; + overflow-wrap: break-word; } + @media (max-width: 599px) { + .wp-block-column { + flex-basis: 100% !important; } } + @media (min-width: 600px) and (max-width: 781px) { + .wp-block-column { + flex-basis: calc(50% - 16px) !important; + flex-grow: 0; } + .wp-block-column:nth-child(even) { + margin-right: 32px; } } + @media (min-width: 782px) { + .wp-block-column { + flex-basis: 0; + flex-grow: 1; } + .wp-block-column[style] { + flex-grow: 0; } + .wp-block-column:not(:first-child) { + margin-right: 32px; } } + +/** + * All Columns Alignment + */ +.wp-block-columns.are-vertically-aligned-top { + align-items: flex-start; } + +.wp-block-columns.are-vertically-aligned-center { + align-items: center; } + +.wp-block-columns.are-vertically-aligned-bottom { + align-items: flex-end; } + +/** + * Individual Column Alignment + */ +.wp-block-column.is-vertically-aligned-top { + align-self: flex-start; } + +.wp-block-column.is-vertically-aligned-center { + -ms-grid-row-align: center; + align-self: center; } + +.wp-block-column.is-vertically-aligned-bottom { + align-self: flex-end; } + +.wp-block-column.is-vertically-aligned-top, .wp-block-column.is-vertically-aligned-center, .wp-block-column.is-vertically-aligned-bottom { + width: 100%; } + +.wp-block-cover-image, +.wp-block-cover { + position: relative; + background-color: #000; + background-size: cover; + background-position: center center; + min-height: 430px; + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; } + .wp-block-cover-image.has-parallax, + .wp-block-cover.has-parallax { + background-attachment: fixed; } + @supports (-webkit-overflow-scrolling: touch) { + .wp-block-cover-image.has-parallax, + .wp-block-cover.has-parallax { + background-attachment: scroll; } } + @media (prefers-reduced-motion: reduce) { + .wp-block-cover-image.has-parallax, + .wp-block-cover.has-parallax { + background-attachment: scroll; } } + .wp-block-cover-image.has-background-dim::before, + .wp-block-cover.has-background-dim::before { + content: ""; + background-color: inherit; } + .wp-block-cover-image.has-background-dim:not(.has-background-gradient)::before, + .wp-block-cover-image .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim:not(.has-background-gradient)::before, + .wp-block-cover .wp-block-cover__gradient-background { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; } + .wp-block-cover-image.has-background-dim:not(.has-background-gradient)::before, + .wp-block-cover-image .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim:not(.has-background-gradient)::before, + .wp-block-cover .wp-block-cover__gradient-background { + opacity: 0.5; } + .wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient)::before { + opacity: 0.1; } + .wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background { + opacity: 0.1; } + .wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient)::before { + opacity: 0.2; } + .wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background { + opacity: 0.2; } + .wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient)::before { + opacity: 0.3; } + .wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background { + opacity: 0.3; } + .wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient)::before { + opacity: 0.4; } + .wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background { + opacity: 0.4; } + .wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient)::before { + opacity: 0.5; } + .wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background { + opacity: 0.5; } + .wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient)::before { + opacity: 0.6; } + .wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background { + opacity: 0.6; } + .wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient)::before { + opacity: 0.7; } + .wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background { + opacity: 0.7; } + .wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient)::before { + opacity: 0.8; } + .wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background { + opacity: 0.8; } + .wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient)::before { + opacity: 0.9; } + .wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background { + opacity: 0.9; } + .wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient)::before { + opacity: 1; } + .wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background { + opacity: 1; } + .wp-block-cover-image.alignleft, .wp-block-cover-image.alignright, + .wp-block-cover.alignleft, + .wp-block-cover.alignright { + max-width: 290px; + width: 100%; } + .wp-block-cover-image::after, + .wp-block-cover::after { + display: block; + content: ""; + font-size: 0; + min-height: inherit; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-cover-image::after, + .wp-block-cover::after { + content: none; } } + .wp-block-cover-image.aligncenter, .wp-block-cover-image.alignleft, .wp-block-cover-image.alignright, + .wp-block-cover.aligncenter, + .wp-block-cover.alignleft, + .wp-block-cover.alignright { + display: flex; } + .wp-block-cover-image .wp-block-cover__inner-container, + .wp-block-cover .wp-block-cover__inner-container { + width: calc(100% - 70px); + z-index: 1; + color: #f8f9f9; } + .wp-block-cover-image p:not(.has-text-color), + .wp-block-cover-image h1:not(.has-text-color), + .wp-block-cover-image h2:not(.has-text-color), + .wp-block-cover-image h3:not(.has-text-color), + .wp-block-cover-image h4:not(.has-text-color), + .wp-block-cover-image h5:not(.has-text-color), + .wp-block-cover-image h6:not(.has-text-color), + .wp-block-cover-image .wp-block-subhead:not(.has-text-color), + .wp-block-cover p:not(.has-text-color), + .wp-block-cover h1:not(.has-text-color), + .wp-block-cover h2:not(.has-text-color), + .wp-block-cover h3:not(.has-text-color), + .wp-block-cover h4:not(.has-text-color), + .wp-block-cover h5:not(.has-text-color), + .wp-block-cover h6:not(.has-text-color), + .wp-block-cover .wp-block-subhead:not(.has-text-color) { + color: inherit; } + +.wp-block-cover__video-background { + position: absolute; + top: 50%; + right: 50%; + transform: translateX(50%) translateY(-50%); + width: 100%; + height: 100%; + z-index: 0; + object-fit: cover; } + +section.wp-block-cover-image h2, +.wp-block-cover-image-text, +.wp-block-cover-text { + color: #fff; } + section.wp-block-cover-image h2 a, + section.wp-block-cover-image h2 a:hover, + section.wp-block-cover-image h2 a:focus, + section.wp-block-cover-image h2 a:active, + .wp-block-cover-image-text a, + .wp-block-cover-image-text a:hover, + .wp-block-cover-image-text a:focus, + .wp-block-cover-image-text a:active, + .wp-block-cover-text a, + .wp-block-cover-text a:hover, + .wp-block-cover-text a:focus, + .wp-block-cover-text a:active { + color: #fff; } + +.wp-block-cover-image +.wp-block-cover.has-left-content { + justify-content: flex-start; } + +.wp-block-cover-image +.wp-block-cover.has-right-content { + justify-content: flex-end; } + +section.wp-block-cover-image.has-left-content > h2, +.wp-block-cover-image.has-left-content .wp-block-cover-image-text, +.wp-block-cover.has-left-content .wp-block-cover-text { + margin-right: 0; + text-align: right; } + +section.wp-block-cover-image.has-right-content > h2, +.wp-block-cover-image.has-right-content .wp-block-cover-image-text, +.wp-block-cover.has-right-content .wp-block-cover-text { + margin-left: 0; + text-align: left; } + +section.wp-block-cover-image > h2, +.wp-block-cover-image .wp-block-cover-image-text, +.wp-block-cover .wp-block-cover-text { + font-size: 2em; + line-height: 1.25; + z-index: 1; + margin-bottom: 0; + max-width: 580px; + padding: 14px; + text-align: center; } + +.block-editor-block-list__block[data-type="core/embed"][data-align="left"], +.block-editor-block-list__block[data-type="core/embed"][data-align="right"], +.wp-block-embed.alignleft, +.wp-block-embed.alignright { + max-width: 360px; + width: 100%; } + +.wp-block-embed { + margin-bottom: 1em; } + .wp-block-embed figcaption { + margin-top: 0.5em; + margin-bottom: 1em; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper { + position: relative; } + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper::before { + content: ""; + display: block; + padding-top: 50%; } + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper iframe { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + width: 100%; + height: 100%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper::before { + padding-top: 42.85%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper::before { + padding-top: 50%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper::before { + padding-top: 56.25%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper::before { + padding-top: 75%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper::before { + padding-top: 100%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper::before { + padding-top: 177.78%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper::before { + padding-top: 200%; } + +.wp-block-file { + margin-bottom: 1.5em; } + .wp-block-file.aligncenter { + text-align: center; } + .wp-block-file.alignright { + text-align: right; } + .wp-block-file .wp-block-file__button { + background: #32373c; + border-radius: 2em; + color: #fff; + font-size: 13px; + padding: 0.5em 1em; } + .wp-block-file a.wp-block-file__button { + text-decoration: none; } + .wp-block-file a.wp-block-file__button:hover, .wp-block-file a.wp-block-file__button:visited, .wp-block-file a.wp-block-file__button:focus, .wp-block-file a.wp-block-file__button:active { + box-shadow: none; + color: #fff; + opacity: 0.85; + text-decoration: none; } + .wp-block-file * + .wp-block-file__button { + margin-right: 0.75em; } + +.wp-block-gallery, +.blocks-gallery-grid { + display: flex; + flex-wrap: wrap; + list-style-type: none; + padding: 0; + margin: 0; } + .wp-block-gallery .blocks-gallery-image, + .wp-block-gallery .blocks-gallery-item, + .blocks-gallery-grid .blocks-gallery-image, + .blocks-gallery-grid .blocks-gallery-item { + margin: 0 0 16px 16px; + display: flex; + flex-grow: 1; + flex-direction: column; + justify-content: center; + position: relative; } + .wp-block-gallery .blocks-gallery-image figure, + .wp-block-gallery .blocks-gallery-item figure, + .blocks-gallery-grid .blocks-gallery-image figure, + .blocks-gallery-grid .blocks-gallery-item figure { + margin: 0; + height: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-gallery .blocks-gallery-image figure, + .wp-block-gallery .blocks-gallery-item figure, + .blocks-gallery-grid .blocks-gallery-image figure, + .blocks-gallery-grid .blocks-gallery-item figure { + display: flex; + align-items: flex-end; + justify-content: flex-start; } } + .wp-block-gallery .blocks-gallery-image img, + .wp-block-gallery .blocks-gallery-item img, + .blocks-gallery-grid .blocks-gallery-image img, + .blocks-gallery-grid .blocks-gallery-item img { + display: block; + max-width: 100%; + height: auto; } + .wp-block-gallery .blocks-gallery-image img, + .wp-block-gallery .blocks-gallery-item img, + .blocks-gallery-grid .blocks-gallery-image img, + .blocks-gallery-grid .blocks-gallery-item img { + width: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-gallery .blocks-gallery-image img, + .wp-block-gallery .blocks-gallery-item img, + .blocks-gallery-grid .blocks-gallery-image img, + .blocks-gallery-grid .blocks-gallery-item img { + width: auto; } } + .wp-block-gallery .blocks-gallery-image figcaption, + .wp-block-gallery .blocks-gallery-item figcaption, + .blocks-gallery-grid .blocks-gallery-image figcaption, + .blocks-gallery-grid .blocks-gallery-item figcaption { + position: absolute; + bottom: 0; + width: 100%; + max-height: 100%; + overflow: auto; + padding: 40px 10px 9px; + color: #fff; + text-align: center; + font-size: 13px; + background: linear-gradient(0deg, rgba(0, 0, 0, 0.7) 0, rgba(0, 0, 0, 0.3) 70%, transparent); } + .wp-block-gallery .blocks-gallery-image figcaption img, + .wp-block-gallery .blocks-gallery-item figcaption img, + .blocks-gallery-grid .blocks-gallery-image figcaption img, + .blocks-gallery-grid .blocks-gallery-item figcaption img { + display: inline; } + .wp-block-gallery.is-cropped .blocks-gallery-image a, + .wp-block-gallery.is-cropped .blocks-gallery-image img, + .wp-block-gallery.is-cropped .blocks-gallery-item a, + .wp-block-gallery.is-cropped .blocks-gallery-item img, + .blocks-gallery-grid.is-cropped .blocks-gallery-image a, + .blocks-gallery-grid.is-cropped .blocks-gallery-image img, + .blocks-gallery-grid.is-cropped .blocks-gallery-item a, + .blocks-gallery-grid.is-cropped .blocks-gallery-item img { + width: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-gallery.is-cropped .blocks-gallery-image a, + .wp-block-gallery.is-cropped .blocks-gallery-image img, + .wp-block-gallery.is-cropped .blocks-gallery-item a, + .wp-block-gallery.is-cropped .blocks-gallery-item img, + .blocks-gallery-grid.is-cropped .blocks-gallery-image a, + .blocks-gallery-grid.is-cropped .blocks-gallery-image img, + .blocks-gallery-grid.is-cropped .blocks-gallery-item a, + .blocks-gallery-grid.is-cropped .blocks-gallery-item img { + height: 100%; + flex: 1; + object-fit: cover; } } + .wp-block-gallery .blocks-gallery-image, + .wp-block-gallery .blocks-gallery-item, + .blocks-gallery-grid .blocks-gallery-image, + .blocks-gallery-grid .blocks-gallery-item { + width: calc((100% - 16px) / 2); } + .wp-block-gallery .blocks-gallery-image:nth-of-type(even), + .wp-block-gallery .blocks-gallery-item:nth-of-type(even), + .blocks-gallery-grid .blocks-gallery-image:nth-of-type(even), + .blocks-gallery-grid .blocks-gallery-item:nth-of-type(even) { + margin-left: 0; } + .wp-block-gallery.columns-1 .blocks-gallery-image, + .wp-block-gallery.columns-1 .blocks-gallery-item, + .blocks-gallery-grid.columns-1 .blocks-gallery-image, + .blocks-gallery-grid.columns-1 .blocks-gallery-item { + width: 100%; + margin-left: 0; } + @media (min-width: 600px) { + .wp-block-gallery.columns-3 .blocks-gallery-image, + .wp-block-gallery.columns-3 .blocks-gallery-item, + .blocks-gallery-grid.columns-3 .blocks-gallery-image, + .blocks-gallery-grid.columns-3 .blocks-gallery-item { + width: calc((100% - 16px * 2) / 3); + margin-left: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-3 .blocks-gallery-image, + .wp-block-gallery.columns-3 .blocks-gallery-item, + .blocks-gallery-grid.columns-3 .blocks-gallery-image, + .blocks-gallery-grid.columns-3 .blocks-gallery-item { + width: calc((100% - 16px * 2) / 3 - 1px); } } + .wp-block-gallery.columns-4 .blocks-gallery-image, + .wp-block-gallery.columns-4 .blocks-gallery-item, + .blocks-gallery-grid.columns-4 .blocks-gallery-image, + .blocks-gallery-grid.columns-4 .blocks-gallery-item { + width: calc((100% - 16px * 3) / 4); + margin-left: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-4 .blocks-gallery-image, + .wp-block-gallery.columns-4 .blocks-gallery-item, + .blocks-gallery-grid.columns-4 .blocks-gallery-image, + .blocks-gallery-grid.columns-4 .blocks-gallery-item { + width: calc((100% - 16px * 3) / 4 - 1px); } } + .wp-block-gallery.columns-5 .blocks-gallery-image, + .wp-block-gallery.columns-5 .blocks-gallery-item, + .blocks-gallery-grid.columns-5 .blocks-gallery-image, + .blocks-gallery-grid.columns-5 .blocks-gallery-item { + width: calc((100% - 16px * 4) / 5); + margin-left: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-5 .blocks-gallery-image, + .wp-block-gallery.columns-5 .blocks-gallery-item, + .blocks-gallery-grid.columns-5 .blocks-gallery-image, + .blocks-gallery-grid.columns-5 .blocks-gallery-item { + width: calc((100% - 16px * 4) / 5 - 1px); } } + .wp-block-gallery.columns-6 .blocks-gallery-image, + .wp-block-gallery.columns-6 .blocks-gallery-item, + .blocks-gallery-grid.columns-6 .blocks-gallery-image, + .blocks-gallery-grid.columns-6 .blocks-gallery-item { + width: calc((100% - 16px * 5) / 6); + margin-left: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-6 .blocks-gallery-image, + .wp-block-gallery.columns-6 .blocks-gallery-item, + .blocks-gallery-grid.columns-6 .blocks-gallery-image, + .blocks-gallery-grid.columns-6 .blocks-gallery-item { + width: calc((100% - 16px * 5) / 6 - 1px); } } + .wp-block-gallery.columns-7 .blocks-gallery-image, + .wp-block-gallery.columns-7 .blocks-gallery-item, + .blocks-gallery-grid.columns-7 .blocks-gallery-image, + .blocks-gallery-grid.columns-7 .blocks-gallery-item { + width: calc((100% - 16px * 6) / 7); + margin-left: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-7 .blocks-gallery-image, + .wp-block-gallery.columns-7 .blocks-gallery-item, + .blocks-gallery-grid.columns-7 .blocks-gallery-image, + .blocks-gallery-grid.columns-7 .blocks-gallery-item { + width: calc((100% - 16px * 6) / 7 - 1px); } } + .wp-block-gallery.columns-8 .blocks-gallery-image, + .wp-block-gallery.columns-8 .blocks-gallery-item, + .blocks-gallery-grid.columns-8 .blocks-gallery-image, + .blocks-gallery-grid.columns-8 .blocks-gallery-item { + width: calc((100% - 16px * 7) / 8); + margin-left: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-8 .blocks-gallery-image, + .wp-block-gallery.columns-8 .blocks-gallery-item, + .blocks-gallery-grid.columns-8 .blocks-gallery-image, + .blocks-gallery-grid.columns-8 .blocks-gallery-item { + width: calc((100% - 16px * 7) / 8 - 1px); } } + .wp-block-gallery.columns-1 .blocks-gallery-image:nth-of-type(1n), + .wp-block-gallery.columns-1 .blocks-gallery-item:nth-of-type(1n), + .blocks-gallery-grid.columns-1 .blocks-gallery-image:nth-of-type(1n), + .blocks-gallery-grid.columns-1 .blocks-gallery-item:nth-of-type(1n) { + margin-left: 0; } + .wp-block-gallery.columns-2 .blocks-gallery-image:nth-of-type(2n), + .wp-block-gallery.columns-2 .blocks-gallery-item:nth-of-type(2n), + .blocks-gallery-grid.columns-2 .blocks-gallery-image:nth-of-type(2n), + .blocks-gallery-grid.columns-2 .blocks-gallery-item:nth-of-type(2n) { + margin-left: 0; } + .wp-block-gallery.columns-3 .blocks-gallery-image:nth-of-type(3n), + .wp-block-gallery.columns-3 .blocks-gallery-item:nth-of-type(3n), + .blocks-gallery-grid.columns-3 .blocks-gallery-image:nth-of-type(3n), + .blocks-gallery-grid.columns-3 .blocks-gallery-item:nth-of-type(3n) { + margin-left: 0; } + .wp-block-gallery.columns-4 .blocks-gallery-image:nth-of-type(4n), + .wp-block-gallery.columns-4 .blocks-gallery-item:nth-of-type(4n), + .blocks-gallery-grid.columns-4 .blocks-gallery-image:nth-of-type(4n), + .blocks-gallery-grid.columns-4 .blocks-gallery-item:nth-of-type(4n) { + margin-left: 0; } + .wp-block-gallery.columns-5 .blocks-gallery-image:nth-of-type(5n), + .wp-block-gallery.columns-5 .blocks-gallery-item:nth-of-type(5n), + .blocks-gallery-grid.columns-5 .blocks-gallery-image:nth-of-type(5n), + .blocks-gallery-grid.columns-5 .blocks-gallery-item:nth-of-type(5n) { + margin-left: 0; } + .wp-block-gallery.columns-6 .blocks-gallery-image:nth-of-type(6n), + .wp-block-gallery.columns-6 .blocks-gallery-item:nth-of-type(6n), + .blocks-gallery-grid.columns-6 .blocks-gallery-image:nth-of-type(6n), + .blocks-gallery-grid.columns-6 .blocks-gallery-item:nth-of-type(6n) { + margin-left: 0; } + .wp-block-gallery.columns-7 .blocks-gallery-image:nth-of-type(7n), + .wp-block-gallery.columns-7 .blocks-gallery-item:nth-of-type(7n), + .blocks-gallery-grid.columns-7 .blocks-gallery-image:nth-of-type(7n), + .blocks-gallery-grid.columns-7 .blocks-gallery-item:nth-of-type(7n) { + margin-left: 0; } + .wp-block-gallery.columns-8 .blocks-gallery-image:nth-of-type(8n), + .wp-block-gallery.columns-8 .blocks-gallery-item:nth-of-type(8n), + .blocks-gallery-grid.columns-8 .blocks-gallery-image:nth-of-type(8n), + .blocks-gallery-grid.columns-8 .blocks-gallery-item:nth-of-type(8n) { + margin-left: 0; } } + .wp-block-gallery .blocks-gallery-image:last-child, + .wp-block-gallery .blocks-gallery-item:last-child, + .blocks-gallery-grid .blocks-gallery-image:last-child, + .blocks-gallery-grid .blocks-gallery-item:last-child { + margin-left: 0; } + .wp-block-gallery.alignleft, .wp-block-gallery.alignright, + .blocks-gallery-grid.alignleft, + .blocks-gallery-grid.alignright { + max-width: 290px; + width: 100%; } + .wp-block-gallery.aligncenter .blocks-gallery-item figure, + .blocks-gallery-grid.aligncenter .blocks-gallery-item figure { + justify-content: center; } + +.wp-block-image { + margin-bottom: 1em; } + .wp-block-image img { + max-width: 100%; } + .wp-block-image.aligncenter { + text-align: center; } + .wp-block-image.alignfull img, + .wp-block-image.alignwide img { + width: 100%; } + .wp-block-image .alignleft, + .wp-block-image .alignright, + .wp-block-image .aligncenter, .wp-block-image.is-resized { + display: table; + margin-right: 0; + margin-left: 0; } + .wp-block-image .alignleft > figcaption, + .wp-block-image .alignright > figcaption, + .wp-block-image .aligncenter > figcaption, .wp-block-image.is-resized > figcaption { + display: table-caption; + caption-side: bottom; } + .wp-block-image .alignleft { + float: left; + margin-right: 1em; } + .wp-block-image .alignright { + float: right; + margin-left: 1em; } + .wp-block-image .aligncenter { + margin-right: auto; + margin-left: auto; } + .wp-block-image figcaption { + margin-top: 0.5em; + margin-bottom: 1em; } + +.is-style-rounded img { + border-radius: 9999px; } + +.is-style-circle-mask img { + border-radius: 9999px; } + @supports ((-webkit-mask-image: none) or (mask-image: none)) or (-webkit-mask-image: none) { + .is-style-circle-mask img { + /* stylelint-disable */ + -webkit-mask-image: url('data:image/svg+xml;utf8,'); + mask-image: url('data:image/svg+xml;utf8,'); + /* stylelint-enable */ + mask-mode: alpha; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-size: contain; + mask-size: contain; + -webkit-mask-position: center; + mask-position: center; + border-radius: 0; } } + +.wp-block-latest-comments__comment { + font-size: 15px; + line-height: 1.1; + list-style: none; + margin-bottom: 1em; } + .has-avatars .wp-block-latest-comments__comment { + min-height: 36px; + list-style: none; } + .has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta, + .has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt { + margin-right: 52px; } + .has-dates .wp-block-latest-comments__comment, + .has-excerpts .wp-block-latest-comments__comment { + line-height: 1.5; } + +.wp-block-latest-comments__comment-excerpt p { + font-size: 14px; + line-height: 1.8; + margin: 5px 0 20px; } + +.wp-block-latest-comments__comment-date { + color: #8f98a1; + display: block; + font-size: 12px; } + +.wp-block-latest-comments .avatar, +.wp-block-latest-comments__comment-avatar { + border-radius: 24px; + display: block; + float: right; + height: 40px; + margin-left: 12px; + width: 40px; } + +.wp-block-latest-posts.alignleft { + margin-right: 2em; } + +.wp-block-latest-posts.alignright { + margin-left: 2em; } + +.wp-block-latest-posts.wp-block-latest-posts__list { + list-style: none; } + .wp-block-latest-posts.wp-block-latest-posts__list li { + clear: both; } + +.wp-block-latest-posts.is-grid { + display: flex; + flex-wrap: wrap; + padding: 0; } + .wp-block-latest-posts.is-grid li { + margin: 0 0 16px 16px; + width: 100%; } + +@media (min-width: 600px) { + .wp-block-latest-posts.columns-2 li { + width: calc((100% / 2) - 16px); } + .wp-block-latest-posts.columns-3 li { + width: calc((100% / 3) - 16px); } + .wp-block-latest-posts.columns-4 li { + width: calc((100% / 4) - 16px); } + .wp-block-latest-posts.columns-5 li { + width: calc((100% / 5) - 16px); } + .wp-block-latest-posts.columns-6 li { + width: calc((100% / 6) - 16px); } } + +.wp-block-latest-posts__post-date { + display: block; + color: #6c7781; + font-size: 13px; } + +.wp-block-latest-posts__post-excerpt { + margin-top: 8px; + margin-bottom: 16px; } + +.wp-block-latest-posts__featured-image img { + height: auto; + width: auto; } + +.wp-block-latest-posts__featured-image.alignleft { + margin-right: 1em; } + +.wp-block-latest-posts__featured-image.alignright { + margin-left: 1em; } + +.wp-block-latest-posts__featured-image.aligncenter { + margin-bottom: 1em; + text-align: center; } + +.wp-block-media-text { + direction: ltr; + display: -ms-grid; + display: grid; + -ms-grid-columns: 50% 1fr; + grid-template-columns: 50% 1fr; + -ms-grid-rows: auto; + grid-template-rows: auto; } + .wp-block-media-text.has-media-on-the-right { + -ms-grid-columns: 1fr 50%; + grid-template-columns: 1fr 50%; } + +.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content, +.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media { + -ms-grid-row-align: start; + align-self: start; } + +.wp-block-media-text .wp-block-media-text__content, +.wp-block-media-text .wp-block-media-text__media, +.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content, +.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media { + -ms-grid-row-align: center; + align-self: center; } + +.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content, +.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media { + -ms-grid-row-align: end; + align-self: end; } + +.wp-block-media-text .wp-block-media-text__media { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; + margin: 0; } + +.wp-block-media-text .wp-block-media-text__content { + direction: rtl; + -ms-grid-column: 2; + grid-column: 2; + -ms-grid-row: 1; + grid-row: 1; + padding: 0 8% 0 8%; + word-break: break-word; } + +.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media { + -ms-grid-column: 2; + grid-column: 2; + -ms-grid-row: 1; + grid-row: 1; } + +.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } + +.wp-block-media-text > figure > img, +.wp-block-media-text > figure > video { + max-width: unset; + width: 100%; + vertical-align: middle; } + +.wp-block-media-text.is-image-fill figure.wp-block-media-text__media { + height: 100%; + min-height: 250px; + background-size: cover; } + +.wp-block-media-text.is-image-fill figure.wp-block-media-text__media > img { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +/* +* Here we here not able to use a mobile first CSS approach. +* Custom widths are set using inline styles, and on mobile, +* we need 100% width, so we use important to overwrite the inline style. +* If the style were set on mobile first, on desktop styles, +* we would have no way of setting the style again to the inline style. +*/ +@media (max-width: 600px) { + .wp-block-media-text.is-stacked-on-mobile { + -ms-grid-columns: 100% !important; + grid-template-columns: 100% !important; } + .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } + .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 2; + grid-row: 2; } + .wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .wp-block-media-text__media { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 2; + grid-row: 2; } + .wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .wp-block-media-text__content { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } } + +/* +* Frontend: reset the default list styles +*/ +.wp-block-navigation > ul { + display: block; + list-style: none; + margin: 0; + padding-right: 0; } + @media (min-width: 600px) { + .wp-block-navigation > ul { + display: flex; + flex-wrap: wrap; } } + .wp-block-navigation > ul ul { + list-style: none; + padding-right: 0; + margin-top: 0; + margin-right: 0; } + .wp-block-navigation > ul ul li { + margin: 0; } + +/* +* Frontend: styles for submenu flyout +*/ +.wp-block-navigation > ul li { + z-index: 1; } + .wp-block-navigation > ul li:hover, .wp-block-navigation > ul li:focus-within { + cursor: pointer; + z-index: 99999; } + .wp-block-navigation > ul li:hover > ul, + .wp-block-navigation > ul li:focus-within > ul, + .wp-block-navigation > ul li ul:hover, + .wp-block-navigation > ul li ul:focus { + visibility: visible; + opacity: 1; + display: flex; + flex-direction: column; } + +.wp-block-navigation > ul > li ul { + position: absolute; + right: 0; + top: 100%; + min-width: 200px; + max-width: 200px; + opacity: 0; + transition: opacity 0.1s linear; + visibility: hidden; } + +/* +* Styles shared between editor and frontend +*/ +.wp-block-navigation, +.wp-block-navigation .block-editor-block-list__layout { + display: flex; + flex-wrap: wrap; } + +.wp-block-navigation .block-editor-block-list__layout .block-editor-block-list__layout { + width: 200px; } + +.wp-block-navigation .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block { + margin: 0; + width: auto; } + +.wp-block-navigation, +.wp-block-navigation > .wp-block-navigation__container { + align-items: center; + width: 100%; } + .wp-block-navigation > .wp-block-navigation-link, + .wp-block-navigation > .wp-block-navigation__container > .wp-block-navigation-link { + display: flex; + margin-top: 0; + margin-bottom: 0; } + +.wp-block-navigation .wp-block-navigation-link { + position: relative; + margin: 0; + min-height: 56px; + display: flex; + line-height: 1.4; } + .wp-block-navigation .wp-block-navigation-link .wp-block, + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link { + min-height: auto; + padding: 0; } + .wp-block-navigation .wp-block-navigation-link .wp-block .wp-block-navigation-link { + margin: 0; } + .wp-block-navigation .wp-block-navigation-link > .block-editor-inner-blocks { + display: none; } + .wp-block-navigation .wp-block-navigation-link.has-child > .wp-block-navigation__container, + .wp-block-navigation .wp-block-navigation-link.is-editing.has-child > .block-editor-inner-blocks { + display: flex; + border: 1px solid rgba(0, 0, 0, 0.15); + position: absolute; + z-index: 1; + top: 100%; + right: 0; } + .wp-block-navigation .wp-block-navigation-link.has-child > .wp-block-navigation__container .block-editor-inner-blocks, + .wp-block-navigation .wp-block-navigation-link.has-child > .wp-block-navigation__container .wp-block-navigation__container, + .wp-block-navigation .wp-block-navigation-link.is-editing.has-child > .block-editor-inner-blocks .block-editor-inner-blocks, + .wp-block-navigation .wp-block-navigation-link.is-editing.has-child > .block-editor-inner-blocks .wp-block-navigation__container { + right: 100%; + top: -1px; } + .wp-block-navigation .wp-block-navigation-link .block-editor-inner-blocks, + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation__container { + background-color: inherit; + color: inherit; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__content { + display: flex; + align-items: center; + width: max-content; + padding: 6px 16px; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link:first-child:not(:only-child) .wp-block-navigation-link__content { + padding-top: 8px; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link:last-child .wp-block-navigation-link__content { + padding-bottom: 8px; } + .wp-block-navigation .wp-block-navigation-link.has-child .wp-block-navigation-link__content { + min-width: 100%; + padding-left: 32px; + position: relative; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__submenu-icon { + position: absolute; + left: 16px; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__submenu-icon svg { + fill: currentColor; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link svg { + transform: rotate(0); } + .wp-block-navigation .wp-block-navigation-link.has-text-color .wp-block-navigation-link__content { + color: inherit; } + +.wp-block-navigation .wp-block-navigation-link:not(.has-text-color) > .block-editor-inner-blocks, +.wp-block-navigation .wp-block-navigation-link:not(.has-text-color) > .wp-block-navigation__container, +.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-text-color) > .block-editor-inner-blocks, +.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-text-color) > .wp-block-navigation__container { + color: #111; } + +.wp-block-navigation .wp-block-navigation-link:not(.has-background) > .block-editor-inner-blocks, +.wp-block-navigation .wp-block-navigation-link:not(.has-background) > .wp-block-navigation__container, +.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-background) > .block-editor-inner-blocks, +.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-background) > .wp-block-navigation__container { + background-color: #fff; } + +.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-text-color) > .block-editor-inner-blocks, +.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-text-color) > .wp-block-navigation__container { + color: #fff; } + +.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-background) > .block-editor-inner-blocks, +.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-background) > .wp-block-navigation__container { + background-color: #333; } + +/* +* Frontend: non-shared styles & overrides +*/ +.wp-block-navigation .wp-block-navigation-link.has-child > .wp-block-navigation__container { + display: flex; + flex-direction: column; + padding: 0; } + +/* +* TODO: organize/untangle styles below this line +*/ +.wp-block-navigation > ul > li > a { + display: flex; + align-items: center; } + +.wp-block-navigation > ul > li:first-of-type > a { + padding-right: 0; } + +.wp-block-navigation > ul > li:last-of-type > a { + padding-left: 0; } + +.wp-block-navigation.items-justified-left > ul { + justify-content: flex-start; } + +.wp-block-navigation.items-justified-center > ul { + justify-content: center; } + +.wp-block-navigation.items-justified-right > ul { + justify-content: flex-end; } + +.is-small-text { + font-size: 14px; } + +.is-regular-text { + font-size: 16px; } + +.is-large-text { + font-size: 36px; } + +.is-larger-text { + font-size: 48px; } + +.has-drop-cap:not(:focus)::first-letter { + float: right; + font-size: 8.4em; + line-height: 0.68; + font-weight: 100; + margin: 0.05em 0 0 0.1em; + text-transform: uppercase; + font-style: normal; } + +p.has-background { + padding: 20px 30px; } + +p.has-text-color a { + color: inherit; } + +.wp-block-pullquote { + padding: 3em 0; + margin-right: 0; + margin-left: 0; + text-align: center; } + .wp-block-pullquote.alignleft, .wp-block-pullquote.alignright { + max-width: 290px; } + .wp-block-pullquote.alignleft p, .wp-block-pullquote.alignright p { + font-size: 20px; } + .wp-block-pullquote p { + font-size: 28px; + line-height: 1.6; } + .wp-block-pullquote cite, + .wp-block-pullquote footer { + position: relative; } + .wp-block-pullquote .has-text-color a { + color: inherit; } + +.wp-block-pullquote:not(.is-style-solid-color) { + background: none; } + +.wp-block-pullquote.is-style-solid-color { + border: none; } + .wp-block-pullquote.is-style-solid-color blockquote { + margin-right: auto; + margin-left: auto; + text-align: right; + max-width: 60%; } + .wp-block-pullquote.is-style-solid-color blockquote p { + margin-top: 0; + margin-bottom: 0; + font-size: 32px; } + .wp-block-pullquote.is-style-solid-color blockquote cite { + text-transform: none; + font-style: normal; } + +.wp-block-pullquote cite { + color: inherit; } + +.wp-block-quote.is-style-large, .wp-block-quote.is-large { + margin: 0 0 16px; + padding: 0 1em; } + .wp-block-quote.is-style-large p, .wp-block-quote.is-large p { + font-size: 24px; + font-style: italic; + line-height: 1.6; } + .wp-block-quote.is-style-large cite, + .wp-block-quote.is-style-large footer, .wp-block-quote.is-large cite, + .wp-block-quote.is-large footer { + font-size: 18px; + text-align: left; } + +.wp-block-rss.alignleft { + margin-right: 2em; } + +.wp-block-rss.alignright { + margin-left: 2em; } + +.wp-block-rss.is-grid { + display: flex; + flex-wrap: wrap; + padding: 0; + list-style: none; } + .wp-block-rss.is-grid li { + margin: 0 0 16px 16px; + width: 100%; } + +@media (min-width: 600px) { + .wp-block-rss.columns-2 li { + width: calc(( 100% / 2 ) - 16px); } + .wp-block-rss.columns-3 li { + width: calc(( 100% / 3 ) - 16px); } + .wp-block-rss.columns-4 li { + width: calc(( 100% / 4 ) - 16px); } + .wp-block-rss.columns-5 li { + width: calc(( 100% / 5 ) - 16px); } + .wp-block-rss.columns-6 li { + width: calc(( 100% / 6 ) - 16px); } } + +.wp-block-rss__item-publish-date, +.wp-block-rss__item-author { + display: block; + color: #6c7781; + font-size: 13px; } + +.wp-block-search { + display: flex; + flex-wrap: wrap; } + .wp-block-search .wp-block-search__label { + width: 100%; } + .wp-block-search .wp-block-search__input { + flex-grow: 1; + max-width: 360px; } + .wp-block-search .wp-block-search__button { + margin-right: 10px; } + +.wp-block-separator.is-style-wide { + border-bottom-width: 1px; } + +.wp-block-separator.is-style-dots { + background: none !important; + border: none; + text-align: center; + max-width: none; + line-height: 1; + height: auto; } + .wp-block-separator.is-style-dots::before { + content: "\00b7 \00b7 \00b7"; + color: currentColor; + font-size: 20px; + letter-spacing: 2em; + padding-right: 2em; + font-family: serif; } + +.wp-block-social-links { + display: flex; + justify-content: flex-start; + padding-right: 0; + padding-left: 0; + margin-right: 0; } + .wp-block-social-links .wp-social-link a, + .wp-block-social-links .wp-social-link a:hover { + text-decoration: none; + border-bottom: 0; + box-shadow: none; } + +.wp-social-link { + display: block; + width: 36px; + height: 36px; + border-radius: 36px; + margin-left: 8px; + transition: transform 0.1s ease; } + @media (prefers-reduced-motion: reduce) { + .wp-social-link { + transition-duration: 0s; } } + .wp-social-link a { + padding: 6px; + display: block; + line-height: 0; + transition: transform 0.1s ease; } + .wp-social-link a, + .wp-social-link a:hover, + .wp-social-link a:active, + .wp-social-link a:visited, + .wp-social-link svg { + color: currentColor; + fill: currentColor; } + .wp-social-link:hover { + transform: scale(1.1); } + +.wp-block-social-links.aligncenter { + justify-content: center; + display: flex; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link { + background-color: #f0f0f0; + color: #444; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon { + background-color: #f90; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp { + background-color: #1ea0c3; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance { + background-color: #0757fe; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen { + background-color: #1e1f26; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart { + background-color: #02e49b; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble { + background-color: #e94c89; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox { + background-color: #4280ff; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy { + background-color: #f45800; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook { + background-color: #1977f2; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx { + background-color: #000; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr { + background-color: #0461dd; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare { + background-color: #e65678; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github { + background-color: #24292d; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads { + background-color: #eceadd; + color: #382110; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google { + background-color: #ea4434; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram { + background-color: #f00075; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm { + background-color: #e21b24; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin { + background-color: #0577b5; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon { + background-color: #3288d4; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium { + background-color: #02ab6c; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup { + background-color: #f6405f; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest { + background-color: #e60122; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket { + background-color: #ef4155; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit { + background-color: #fe4500; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype { + background-color: #0478d7; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat { + background-color: #fefc00; + color: #fff; + stroke: #000; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud { + background-color: #ff5600; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify { + background-color: #1bd760; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr { + background-color: #011835; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch { + background-color: #6440a4; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter { + background-color: #21a1f3; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo { + background-color: #1eb7ea; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk { + background-color: #4680c2; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress { + background-color: #3499cd; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp { + background-color: #d32422; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube { + background-color: #ff0100; + color: #fff; } + +.wp-block-social-links.is-style-logos-only .wp-social-link { + background: none; + padding: 4px; } + .wp-block-social-links.is-style-logos-only .wp-social-link svg { + width: 28px; + height: 28px; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-amazon { + color: #f90; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp { + color: #1ea0c3; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-behance { + color: #0757fe; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-codepen { + color: #1e1f26; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart { + color: #02e49b; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble { + color: #e94c89; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox { + color: #4280ff; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-etsy { + color: #f45800; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-facebook { + color: #1977f2; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx { + color: #000; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-flickr { + color: #0461dd; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare { + color: #e65678; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-github { + color: #24292d; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads { + color: #382110; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-google { + color: #ea4434; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-instagram { + color: #f00075; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm { + color: #e21b24; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin { + color: #0577b5; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon { + color: #3288d4; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-medium { + color: #02ab6c; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-meetup { + color: #f6405f; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest { + color: #e60122; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-pocket { + color: #ef4155; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-reddit { + color: #fe4500; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-skype { + color: #0478d7; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat { + color: #fff; + stroke: #000; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud { + color: #ff5600; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-spotify { + color: #1bd760; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr { + color: #011835; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-twitch { + color: #6440a4; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-twitter { + color: #21a1f3; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo { + color: #1eb7ea; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-vk { + color: #4680c2; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress { + color: #3499cd; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-yelp { + background-color: #d32422; + color: #fff; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-youtube { + color: #ff0100; } + +.wp-block-social-links.is-style-pill-shape .wp-social-link { + width: auto; } + +.wp-block-social-links.is-style-pill-shape .wp-social-link a { + padding-right: 16px; + padding-left: 16px; } + +.wp-block-spacer { + clear: both; } + +p.wp-block-subhead { + font-size: 1.1em; + font-style: italic; + opacity: 0.75; } + +.wp-block-table { + overflow-x: auto; } + .wp-block-table table { + width: 100%; } + .wp-block-table .has-fixed-layout { + table-layout: fixed; + width: 100%; } + .wp-block-table .has-fixed-layout td, + .wp-block-table .has-fixed-layout th { + word-break: break-word; } + .wp-block-table.alignleft, .wp-block-table.aligncenter, .wp-block-table.alignright { + display: table; + width: auto; } + .wp-block-table.alignleft td, + .wp-block-table.alignleft th, .wp-block-table.aligncenter td, + .wp-block-table.aligncenter th, .wp-block-table.alignright td, + .wp-block-table.alignright th { + word-break: break-word; } + .wp-block-table .has-subtle-light-gray-background-color { + background-color: #f3f4f5; } + .wp-block-table .has-subtle-pale-green-background-color { + background-color: #e9fbe5; } + .wp-block-table .has-subtle-pale-blue-background-color { + background-color: #e7f5fe; } + .wp-block-table .has-subtle-pale-pink-background-color { + background-color: #fcf0ef; } + .wp-block-table.is-style-stripes { + border-spacing: 0; + border-collapse: inherit; + background-color: transparent; + border-bottom: 1px solid #f3f4f5; } + .wp-block-table.is-style-stripes tbody tr:nth-child(odd) { + background-color: #f3f4f5; } + .wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd) { + background-color: #f3f4f5; } + .wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd) { + background-color: #e9fbe5; } + .wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd) { + background-color: #e7f5fe; } + .wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd) { + background-color: #fcf0ef; } + .wp-block-table.is-style-stripes th, + .wp-block-table.is-style-stripes td { + border-color: transparent; } + +.wp-block-text-columns { + display: flex; } + .wp-block-text-columns.aligncenter { + display: flex; } + .wp-block-text-columns .wp-block-column { + margin: 0 16px; + padding: 0; } + .wp-block-text-columns .wp-block-column:first-child { + margin-right: 0; } + .wp-block-text-columns .wp-block-column:last-child { + margin-left: 0; } + .wp-block-text-columns.columns-2 .wp-block-column { + width: calc(100% / 2); } + .wp-block-text-columns.columns-3 .wp-block-column { + width: calc(100% / 3); } + .wp-block-text-columns.columns-4 .wp-block-column { + width: calc(100% / 4); } + +.wp-block-video { + margin-right: 0; + margin-left: 0; } + .wp-block-video video { + max-width: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-video [poster] { + object-fit: cover; } } + .wp-block-video.aligncenter { + text-align: center; } + .wp-block-video figcaption { + margin-top: 0.5em; + margin-bottom: 1em; } + +:root { + /* stylelint-disable function-comma-space-after */ + /* stylelint-enable function-comma-space-after */ } + :root .has-pale-pink-background-color { + background-color: #f78da7; } + :root .has-vivid-red-background-color { + background-color: #cf2e2e; } + :root .has-luminous-vivid-orange-background-color { + background-color: #ff6900; } + :root .has-luminous-vivid-amber-background-color { + background-color: #fcb900; } + :root .has-light-green-cyan-background-color { + background-color: #7bdcb5; } + :root .has-vivid-green-cyan-background-color { + background-color: #00d084; } + :root .has-pale-cyan-blue-background-color { + background-color: #8ed1fc; } + :root .has-vivid-cyan-blue-background-color { + background-color: #0693e3; } + :root .has-vivid-purple-background-color { + background-color: #9b51e0; } + :root .has-very-light-gray-background-color { + background-color: #eee; } + :root .has-cyan-bluish-gray-background-color { + background-color: #abb8c3; } + :root .has-very-dark-gray-background-color { + background-color: #313131; } + :root .has-pale-pink-color { + color: #f78da7; } + :root .has-vivid-red-color { + color: #cf2e2e; } + :root .has-luminous-vivid-orange-color { + color: #ff6900; } + :root .has-luminous-vivid-amber-color { + color: #fcb900; } + :root .has-light-green-cyan-color { + color: #7bdcb5; } + :root .has-vivid-green-cyan-color { + color: #00d084; } + :root .has-pale-cyan-blue-color { + color: #8ed1fc; } + :root .has-vivid-cyan-blue-color { + color: #0693e3; } + :root .has-vivid-purple-color { + color: #9b51e0; } + :root .has-very-light-gray-color { + color: #eee; } + :root .has-cyan-bluish-gray-color { + color: #abb8c3; } + :root .has-very-dark-gray-color { + color: #313131; } + :root .has-vivid-cyan-blue-to-vivid-purple-gradient-background { + background: linear-gradient(-135deg, #0693e3 0%, #9b51e0 100%); } + :root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { + background: linear-gradient(-135deg, #00d084 0%, #0693e3 100%); } + :root .has-light-green-cyan-to-vivid-green-cyan-gradient-background { + background: linear-gradient(-135deg, #7adcb4 0%, #00d082 100%); } + :root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background { + background: linear-gradient(-135deg, #fcb900 0%, #ff6900 100%); } + :root .has-luminous-vivid-orange-to-vivid-red-gradient-background { + background: linear-gradient(-135deg, #ff6900 0%, #cf2e2e 100%); } + :root .has-very-light-gray-to-cyan-bluish-gray-gradient-background { + background: linear-gradient(-135deg, #eeeeee 0%, #a9b8c3 100%); } + :root .has-cool-to-warm-spectrum-gradient-background { + background: linear-gradient(-135deg, #4aeadc 0%, #9778d1 20%, #cf2aba 40%, #ee2c82 60%, #fb6962 80%, #fef84c 100%); } + :root .has-blush-light-purple-gradient-background { + background: linear-gradient(-135deg, #ffceec 0%, #9896f0 100%); } + :root .has-blush-bordeaux-gradient-background { + background: linear-gradient(-135deg, #fecda5 0%, #fe2d2d 50%, #6b003e 100%); } + :root .has-purple-crush-gradient-background { + background: linear-gradient(-135deg, #34e2e4 0%, #4721fb 50%, #ab1dfe 100%); } + :root .has-luminous-dusk-gradient-background { + background: linear-gradient(-135deg, #ffcb70 0%, #c751c0 50%, #4158d0 100%); } + :root .has-hazy-dawn-gradient-background { + background: linear-gradient(-135deg, #faaca8 0%, #dad0ec 100%); } + :root .has-pale-ocean-gradient-background { + background: linear-gradient(-135deg, #fff5cb 0%, #b6e3d4 50%, #33a7b5 100%); } + :root .has-electric-grass-gradient-background { + background: linear-gradient(-135deg, #caf880 0%, #71ce7e 100%); } + :root .has-subdued-olive-gradient-background { + background: linear-gradient(-135deg, #fafae1 0%, #67a671 100%); } + :root .has-atomic-cream-gradient-background { + background: linear-gradient(-135deg, #fdd79a 0%, #004a59 100%); } + :root .has-nightshade-gradient-background { + background: linear-gradient(-135deg, #330968 0%, #31cdcf 100%); } + :root .has-midnight-gradient-background { + background: linear-gradient(-135deg, #020381 0%, #2874fc 100%); } + +.has-small-font-size { + font-size: 13px; } + +.has-regular-font-size, +.has-normal-font-size { + font-size: 16px; } + +.has-medium-font-size { + font-size: 20px; } + +.has-large-font-size { + font-size: 36px; } + +.has-larger-font-size, +.has-huge-font-size { + font-size: 42px; } + +.has-text-align-center { + text-align: center; } + +.has-text-align-left { + text-align: left; } + +.has-text-align-right { + text-align: right; } diff --git a/wp-includes/css/dist/block-library/style-rtl.min.css b/wp-includes/css/dist/block-library/style-rtl.min.css new file mode 100644 index 0000000..abf8cd7 --- /dev/null +++ b/wp-includes/css/dist/block-library/style-rtl.min.css @@ -0,0 +1 @@ +.wp-block-audio figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-audio audio{width:100%;min-width:300px}.wp-block-button{color:#fff}.wp-block-button.aligncenter{text-align:center}.wp-block-button.alignright{text-align:right}.wp-block-button__link{background-color:#32373c;border:none;border-radius:28px;box-shadow:none;color:inherit;cursor:pointer;display:inline-block;font-size:18px;margin:0;padding:12px 24px;text-align:center;text-decoration:none;overflow-wrap:break-word}.wp-block-button__link:active,.wp-block-button__link:focus,.wp-block-button__link:hover,.wp-block-button__link:visited{color:inherit}.wp-gs .wp-block-button__link:not(.has-background){background-color:var(--wp-block-core-button--color--background,var(--wp-color--primary,#32373c))}.is-style-squared .wp-block-button__link{border-radius:0}.no-border-radius.wp-block-button__link{border-radius:0!important}.is-style-outline{color:#32373c}.is-style-outline .wp-block-button__link{background-color:transparent;border:2px solid}.wp-block-buttons .wp-block-button{display:inline-block;margin-left:8px;margin-bottom:8px}.wp-block-buttons.alignright .wp-block-button{margin-left:none;margin-right:8px}.wp-block-buttons.aligncenter,.wp-block-calendar{text-align:center}.wp-block-calendar tbody td,.wp-block-calendar th{padding:4px;border:1px solid #e2e4e7}.wp-block-calendar tfoot td{border:none}.wp-block-calendar table{width:100%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.wp-block-calendar table th{font-weight:400;background:#edeff0}.wp-block-calendar a{text-decoration:underline}.wp-block-calendar tfoot a{color:#00739c}.wp-block-calendar table caption,.wp-block-calendar table tbody{color:#40464d}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-columns{display:flex;margin-bottom:28px;flex-wrap:wrap}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap}}.wp-block-columns.has-background{padding:20px 30px}.wp-block-column{flex-grow:1;min-width:0;word-break:break-word;overflow-wrap:break-word}@media (max-width:599px){.wp-block-column{flex-basis:100%!important}}@media (min-width:600px) and (max-width:781px){.wp-block-column{flex-basis:calc(50% - 16px)!important;flex-grow:0}.wp-block-column:nth-child(2n){margin-right:32px}}@media (min-width:782px){.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-column[style]{flex-grow:0}.wp-block-column:not(:first-child){margin-right:32px}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{-ms-grid-row-align:center;align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}.wp-block-cover,.wp-block-cover-image{position:relative;background-color:#000;background-size:cover;background-position:50%;min-height:430px;height:100%;width:100%;display:flex;justify-content:center;align-items:center;overflow:hidden}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:fixed}@supports (-webkit-overflow-scrolling:touch){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:scroll}}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{content:"";background-color:inherit}.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim:not(.has-background-gradient):before,.wp-block-cover .wp-block-cover__gradient-background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1}.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim:not(.has-background-gradient):before,.wp-block-cover .wp-block-cover__gradient-background{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:290px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{display:block;content:"";font-size:0;min-height:inherit}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover-image .wp-block-cover__inner-container,.wp-block-cover .wp-block-cover__inner-container{width:calc(100% - 70px);z-index:1;color:#f8f9f9}.wp-block-cover-image .wp-block-subhead:not(.has-text-color),.wp-block-cover-image h1:not(.has-text-color),.wp-block-cover-image h2:not(.has-text-color),.wp-block-cover-image h3:not(.has-text-color),.wp-block-cover-image h4:not(.has-text-color),.wp-block-cover-image h5:not(.has-text-color),.wp-block-cover-image h6:not(.has-text-color),.wp-block-cover-image p:not(.has-text-color),.wp-block-cover .wp-block-subhead:not(.has-text-color),.wp-block-cover h1:not(.has-text-color),.wp-block-cover h2:not(.has-text-color),.wp-block-cover h3:not(.has-text-color),.wp-block-cover h4:not(.has-text-color),.wp-block-cover h5:not(.has-text-color),.wp-block-cover h6:not(.has-text-color),.wp-block-cover p:not(.has-text-color){color:inherit}.wp-block-cover__video-background{position:absolute;top:50%;right:50%;transform:translateX(50%) translateY(-50%);width:100%;height:100%;z-index:0;object-fit:cover}.wp-block-cover-image-text,.wp-block-cover-text,section.wp-block-cover-image h2{color:#fff}.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-right:0;text-align:right}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-left:0;text-align:left}.wp-block-cover-image .wp-block-cover-image-text,.wp-block-cover .wp-block-cover-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;z-index:1;margin-bottom:0;max-width:580px;padding:14px;text-align:center}.block-editor-block-list__block[data-type="core/embed"][data-align=left],.block-editor-block-list__block[data-type="core/embed"][data-align=right],.wp-block-embed.alignleft,.wp-block-embed.alignright{max-width:360px;width:100%}.wp-block-embed{margin-bottom:1em}.wp-block-embed figcaption{margin-top:.5em;margin-bottom:1em}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper iframe{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.78%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}.wp-block-file{margin-bottom:1.5em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file .wp-block-file__button{background:#32373c;border-radius:2em;color:#fff;font-size:13px;padding:.5em 1em}.wp-block-file a.wp-block-file__button{text-decoration:none}.wp-block-file a.wp-block-file__button:active,.wp-block-file a.wp-block-file__button:focus,.wp-block-file a.wp-block-file__button:hover,.wp-block-file a.wp-block-file__button:visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}.wp-block-file *+.wp-block-file__button{margin-right:.75em}.blocks-gallery-grid,.wp-block-gallery{display:flex;flex-wrap:wrap;list-style-type:none;padding:0;margin:0}.blocks-gallery-grid .blocks-gallery-image,.blocks-gallery-grid .blocks-gallery-item,.wp-block-gallery .blocks-gallery-image,.wp-block-gallery .blocks-gallery-item{margin:0 0 16px 16px;display:flex;flex-grow:1;flex-direction:column;justify-content:center;position:relative}.blocks-gallery-grid .blocks-gallery-image figure,.blocks-gallery-grid .blocks-gallery-item figure,.wp-block-gallery .blocks-gallery-image figure,.wp-block-gallery .blocks-gallery-item figure{margin:0;height:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid .blocks-gallery-image figure,.blocks-gallery-grid .blocks-gallery-item figure,.wp-block-gallery .blocks-gallery-image figure,.wp-block-gallery .blocks-gallery-item figure{display:flex;align-items:flex-end;justify-content:flex-start}}.blocks-gallery-grid .blocks-gallery-image img,.blocks-gallery-grid .blocks-gallery-item img,.wp-block-gallery .blocks-gallery-image img,.wp-block-gallery .blocks-gallery-item img{display:block;max-width:100%;height:auto;width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid .blocks-gallery-image img,.blocks-gallery-grid .blocks-gallery-item img,.wp-block-gallery .blocks-gallery-image img,.wp-block-gallery .blocks-gallery-item img{width:auto}}.blocks-gallery-grid .blocks-gallery-image figcaption,.blocks-gallery-grid .blocks-gallery-item figcaption,.wp-block-gallery .blocks-gallery-image figcaption,.wp-block-gallery .blocks-gallery-item figcaption{position:absolute;bottom:0;width:100%;max-height:100%;overflow:auto;padding:40px 10px 9px;color:#fff;text-align:center;font-size:13px;background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent)}.blocks-gallery-grid .blocks-gallery-image figcaption img,.blocks-gallery-grid .blocks-gallery-item figcaption img,.wp-block-gallery .blocks-gallery-image figcaption img,.wp-block-gallery .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid.is-cropped .blocks-gallery-image a,.blocks-gallery-grid.is-cropped .blocks-gallery-image img,.blocks-gallery-grid.is-cropped .blocks-gallery-item a,.blocks-gallery-grid.is-cropped .blocks-gallery-item img,.wp-block-gallery.is-cropped .blocks-gallery-image a,.wp-block-gallery.is-cropped .blocks-gallery-image img,.wp-block-gallery.is-cropped .blocks-gallery-item a,.wp-block-gallery.is-cropped .blocks-gallery-item img{width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid.is-cropped .blocks-gallery-image a,.blocks-gallery-grid.is-cropped .blocks-gallery-image img,.blocks-gallery-grid.is-cropped .blocks-gallery-item a,.blocks-gallery-grid.is-cropped .blocks-gallery-item img,.wp-block-gallery.is-cropped .blocks-gallery-image a,.wp-block-gallery.is-cropped .blocks-gallery-image img,.wp-block-gallery.is-cropped .blocks-gallery-item a,.wp-block-gallery.is-cropped .blocks-gallery-item img{height:100%;flex:1;object-fit:cover}}.blocks-gallery-grid .blocks-gallery-image,.blocks-gallery-grid .blocks-gallery-item,.wp-block-gallery .blocks-gallery-image,.wp-block-gallery .blocks-gallery-item{width:calc((100% - 16px)/2)}.blocks-gallery-grid .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery .blocks-gallery-item:nth-of-type(2n){margin-left:0}.blocks-gallery-grid.columns-1 .blocks-gallery-image,.blocks-gallery-grid.columns-1 .blocks-gallery-item,.wp-block-gallery.columns-1 .blocks-gallery-image,.wp-block-gallery.columns-1 .blocks-gallery-item{width:100%;margin-left:0}@media (min-width:600px){.blocks-gallery-grid.columns-3 .blocks-gallery-image,.blocks-gallery-grid.columns-3 .blocks-gallery-item,.wp-block-gallery.columns-3 .blocks-gallery-image,.wp-block-gallery.columns-3 .blocks-gallery-item{width:calc((100% - 32px)/3);margin-left:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-3 .blocks-gallery-image,.blocks-gallery-grid.columns-3 .blocks-gallery-item,.wp-block-gallery.columns-3 .blocks-gallery-image,.wp-block-gallery.columns-3 .blocks-gallery-item{width:calc((100% - 32px)/3 - 1px)}}.blocks-gallery-grid.columns-4 .blocks-gallery-image,.blocks-gallery-grid.columns-4 .blocks-gallery-item,.wp-block-gallery.columns-4 .blocks-gallery-image,.wp-block-gallery.columns-4 .blocks-gallery-item{width:calc((100% - 48px)/4);margin-left:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-4 .blocks-gallery-image,.blocks-gallery-grid.columns-4 .blocks-gallery-item,.wp-block-gallery.columns-4 .blocks-gallery-image,.wp-block-gallery.columns-4 .blocks-gallery-item{width:calc((100% - 48px)/4 - 1px)}}.blocks-gallery-grid.columns-5 .blocks-gallery-image,.blocks-gallery-grid.columns-5 .blocks-gallery-item,.wp-block-gallery.columns-5 .blocks-gallery-image,.wp-block-gallery.columns-5 .blocks-gallery-item{width:calc((100% - 64px)/5);margin-left:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-5 .blocks-gallery-image,.blocks-gallery-grid.columns-5 .blocks-gallery-item,.wp-block-gallery.columns-5 .blocks-gallery-image,.wp-block-gallery.columns-5 .blocks-gallery-item{width:calc((100% - 64px)/5 - 1px)}}.blocks-gallery-grid.columns-6 .blocks-gallery-image,.blocks-gallery-grid.columns-6 .blocks-gallery-item,.wp-block-gallery.columns-6 .blocks-gallery-image,.wp-block-gallery.columns-6 .blocks-gallery-item{width:calc((100% - 80px)/6);margin-left:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-6 .blocks-gallery-image,.blocks-gallery-grid.columns-6 .blocks-gallery-item,.wp-block-gallery.columns-6 .blocks-gallery-image,.wp-block-gallery.columns-6 .blocks-gallery-item{width:calc((100% - 80px)/6 - 1px)}}.blocks-gallery-grid.columns-7 .blocks-gallery-image,.blocks-gallery-grid.columns-7 .blocks-gallery-item,.wp-block-gallery.columns-7 .blocks-gallery-image,.wp-block-gallery.columns-7 .blocks-gallery-item{width:calc((100% - 96px)/7);margin-left:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-7 .blocks-gallery-image,.blocks-gallery-grid.columns-7 .blocks-gallery-item,.wp-block-gallery.columns-7 .blocks-gallery-image,.wp-block-gallery.columns-7 .blocks-gallery-item{width:calc((100% - 96px)/7 - 1px)}}.blocks-gallery-grid.columns-8 .blocks-gallery-image,.blocks-gallery-grid.columns-8 .blocks-gallery-item,.wp-block-gallery.columns-8 .blocks-gallery-image,.wp-block-gallery.columns-8 .blocks-gallery-item{width:calc((100% - 112px)/8);margin-left:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-8 .blocks-gallery-image,.blocks-gallery-grid.columns-8 .blocks-gallery-item,.wp-block-gallery.columns-8 .blocks-gallery-image,.wp-block-gallery.columns-8 .blocks-gallery-item{width:calc((100% - 112px)/8 - 1px)}}.blocks-gallery-grid.columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid.columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery.columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery.columns-1 .blocks-gallery-item:nth-of-type(1n){margin-left:0}.blocks-gallery-grid.columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid.columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery.columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery.columns-2 .blocks-gallery-item:nth-of-type(2n){margin-left:0}.blocks-gallery-grid.columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid.columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery.columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery.columns-3 .blocks-gallery-item:nth-of-type(3n){margin-left:0}.blocks-gallery-grid.columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid.columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery.columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery.columns-4 .blocks-gallery-item:nth-of-type(4n){margin-left:0}.blocks-gallery-grid.columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid.columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery.columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery.columns-5 .blocks-gallery-item:nth-of-type(5n){margin-left:0}.blocks-gallery-grid.columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid.columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery.columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery.columns-6 .blocks-gallery-item:nth-of-type(6n){margin-left:0}.blocks-gallery-grid.columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid.columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery.columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery.columns-7 .blocks-gallery-item:nth-of-type(7n){margin-left:0}.blocks-gallery-grid.columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid.columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery.columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery.columns-8 .blocks-gallery-item:nth-of-type(8n){margin-left:0}}.blocks-gallery-grid .blocks-gallery-image:last-child,.blocks-gallery-grid .blocks-gallery-item:last-child,.wp-block-gallery .blocks-gallery-image:last-child,.wp-block-gallery .blocks-gallery-item:last-child{margin-left:0}.blocks-gallery-grid.alignleft,.blocks-gallery-grid.alignright,.wp-block-gallery.alignleft,.wp-block-gallery.alignright{max-width:290px;width:100%}.blocks-gallery-grid.aligncenter .blocks-gallery-item figure,.wp-block-gallery.aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-image{margin-bottom:1em}.wp-block-image img{max-width:100%}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.is-resized{display:table;margin-right:0;margin-left:0}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.is-resized>figcaption{display:table-caption;caption-side:bottom}.wp-block-image .alignleft{float:left;margin-right:1em}.wp-block-image .alignright{float:right;margin-left:1em}.wp-block-image .aligncenter{margin-right:auto;margin-left:auto}.wp-block-image figcaption{margin-top:.5em;margin-bottom:1em}.is-style-circle-mask img,.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.is-style-circle-mask img{-webkit-mask-image:url('data:image/svg+xml;utf8,');mask-image:url('data:image/svg+xml;utf8,');mask-mode:alpha;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center;mask-position:center;border-radius:0}}.wp-block-latest-comments__comment{font-size:15px;line-height:1.1;list-style:none;margin-bottom:1em}.has-avatars .wp-block-latest-comments__comment{min-height:36px;list-style:none}.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{margin-right:52px}.has-dates .wp-block-latest-comments__comment,.has-excerpts .wp-block-latest-comments__comment{line-height:1.5}.wp-block-latest-comments__comment-excerpt p{font-size:14px;line-height:1.8;margin:5px 0 20px}.wp-block-latest-comments__comment-date{color:#8f98a1;display:block;font-size:12px}.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{border-radius:24px;display:block;float:right;height:40px;margin-left:12px;width:40px}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 0 16px 16px;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - 16px)}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - 16px)}.wp-block-latest-posts.columns-4 li{width:calc(25% - 16px)}.wp-block-latest-posts.columns-5 li{width:calc(20% - 16px)}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 16px)}}.wp-block-latest-posts__post-date{display:block;color:#6c7781;font-size:13px}.wp-block-latest-posts__post-excerpt{margin-top:8px;margin-bottom:16px}.wp-block-latest-posts__featured-image img{height:auto;width:auto}.wp-block-latest-posts__featured-image.alignleft{margin-right:1em}.wp-block-latest-posts__featured-image.alignright{margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}.wp-block-media-text{direction:ltr;display:-ms-grid;display:grid;-ms-grid-columns:50% 1fr;grid-template-columns:50% 1fr;-ms-grid-rows:auto;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{-ms-grid-columns:1fr 50%;grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{-ms-grid-row-align:start;align-self:start}.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media,.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media{-ms-grid-row-align:center;align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{-ms-grid-row-align:end;align-self:end}.wp-block-media-text .wp-block-media-text__media{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1;margin:0}.wp-block-media-text .wp-block-media-text__content{direction:rtl;padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media,.wp-block-media-text .wp-block-media-text__content{-ms-grid-column:2;grid-column:2;-ms-grid-row:1;grid-row:1}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text>figure>img,.wp-block-media-text>figure>video{max-width:unset;width:100%;vertical-align:middle}.wp-block-media-text.is-image-fill figure.wp-block-media-text__media{height:100%;min-height:250px;background-size:cover}.wp-block-media-text.is-image-fill figure.wp-block-media-text__media>img{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{-ms-grid-columns:100%!important;grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .wp-block-media-text__media,.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{-ms-grid-column:1;grid-column:1;-ms-grid-row:2;grid-row:2}.wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .wp-block-media-text__content{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}}.wp-block-navigation>ul{display:block;list-style:none;margin:0;padding-right:0}@media (min-width:600px){.wp-block-navigation>ul{display:flex;flex-wrap:wrap}}.wp-block-navigation>ul ul{list-style:none;padding-right:0;margin-top:0;margin-right:0}.wp-block-navigation>ul ul li{margin:0}.wp-block-navigation>ul li{z-index:1}.wp-block-navigation>ul li:focus-within,.wp-block-navigation>ul li:hover{cursor:pointer;z-index:99999}.wp-block-navigation>ul li:focus-within>ul,.wp-block-navigation>ul li:hover>ul,.wp-block-navigation>ul li ul:focus,.wp-block-navigation>ul li ul:hover{visibility:visible;opacity:1;display:flex;flex-direction:column}.wp-block-navigation>ul>li ul{position:absolute;right:0;top:100%;min-width:200px;max-width:200px;opacity:0;transition:opacity .1s linear;visibility:hidden}.wp-block-navigation,.wp-block-navigation .block-editor-block-list__layout{display:flex;flex-wrap:wrap}.wp-block-navigation .block-editor-block-list__layout .block-editor-block-list__layout{width:200px}.wp-block-navigation .block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block{margin:0;width:auto}.wp-block-navigation,.wp-block-navigation>.wp-block-navigation__container{align-items:center;width:100%}.wp-block-navigation>.wp-block-navigation-link,.wp-block-navigation>.wp-block-navigation__container>.wp-block-navigation-link{display:flex;margin-top:0;margin-bottom:0}.wp-block-navigation .wp-block-navigation-link{position:relative;margin:0;min-height:56px;display:flex;line-height:1.4}.wp-block-navigation .wp-block-navigation-link .wp-block,.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link{min-height:auto;padding:0}.wp-block-navigation .wp-block-navigation-link .wp-block .wp-block-navigation-link{margin:0}.wp-block-navigation .wp-block-navigation-link>.block-editor-inner-blocks{display:none}.wp-block-navigation .wp-block-navigation-link.has-child>.wp-block-navigation__container,.wp-block-navigation .wp-block-navigation-link.is-editing.has-child>.block-editor-inner-blocks{display:flex;border:1px solid rgba(0,0,0,.15);position:absolute;z-index:1;top:100%;right:0}.wp-block-navigation .wp-block-navigation-link.has-child>.wp-block-navigation__container .block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link.has-child>.wp-block-navigation__container .wp-block-navigation__container,.wp-block-navigation .wp-block-navigation-link.is-editing.has-child>.block-editor-inner-blocks .block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link.is-editing.has-child>.block-editor-inner-blocks .wp-block-navigation__container{right:100%;top:-1px}.wp-block-navigation .wp-block-navigation-link .block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link .wp-block-navigation__container{background-color:inherit;color:inherit}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__content{display:flex;align-items:center;width:max-content;padding:6px 16px}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link:first-child:not(:only-child) .wp-block-navigation-link__content{padding-top:8px}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link:last-child .wp-block-navigation-link__content{padding-bottom:8px}.wp-block-navigation .wp-block-navigation-link.has-child .wp-block-navigation-link__content{min-width:100%;padding-left:32px;position:relative}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__submenu-icon{position:absolute;left:16px}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__submenu-icon svg{fill:currentColor}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link svg{transform:rotate(0)}.wp-block-navigation .wp-block-navigation-link.has-text-color .wp-block-navigation-link__content{color:inherit}.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-text-color)>.block-editor-inner-blocks,.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-text-color)>.wp-block-navigation__container,.wp-block-navigation .wp-block-navigation-link:not(.has-text-color)>.block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link:not(.has-text-color)>.wp-block-navigation__container{color:#111}.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-background)>.block-editor-inner-blocks,.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-background)>.wp-block-navigation__container,.wp-block-navigation .wp-block-navigation-link:not(.has-background)>.block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link:not(.has-background)>.wp-block-navigation__container{background-color:#fff}.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-text-color)>.block-editor-inner-blocks,.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-text-color)>.wp-block-navigation__container{color:#fff}.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-background)>.block-editor-inner-blocks,.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-background)>.wp-block-navigation__container{background-color:#333}.wp-block-navigation .wp-block-navigation-link.has-child>.wp-block-navigation__container{display:flex;flex-direction:column;padding:0}.wp-block-navigation>ul>li>a{display:flex;align-items:center}.wp-block-navigation>ul>li:first-of-type>a{padding-right:0}.wp-block-navigation>ul>li:last-of-type>a{padding-left:0}.wp-block-navigation.items-justified-left>ul{justify-content:flex-start}.wp-block-navigation.items-justified-center>ul{justify-content:center}.wp-block-navigation.items-justified-right>ul{justify-content:flex-end}.is-small-text{font-size:14px}.is-regular-text{font-size:16px}.is-large-text{font-size:36px}.is-larger-text{font-size:48px}.has-drop-cap:not(:focus):first-letter{float:right;font-size:8.4em;line-height:.68;font-weight:100;margin:.05em 0 0 .1em;text-transform:uppercase;font-style:normal}p.has-background{padding:20px 30px}p.has-text-color a{color:inherit}.wp-block-pullquote{padding:3em 0;margin-right:0;margin-left:0;text-align:center}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:290px}.wp-block-pullquote.alignleft p,.wp-block-pullquote.alignright p{font-size:20px}.wp-block-pullquote p{font-size:28px;line-height:1.6}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}.wp-block-pullquote:not(.is-style-solid-color){background:none}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-right:auto;margin-left:auto;text-align:right;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{margin-top:0;margin-bottom:0;font-size:32px}.wp-block-pullquote.is-style-solid-color blockquote cite{text-transform:none;font-style:normal}.wp-block-pullquote cite{color:inherit}.wp-block-quote.is-large,.wp-block-quote.is-style-large{margin:0 0 16px;padding:0 1em}.wp-block-quote.is-large p,.wp-block-quote.is-style-large p{font-size:24px;font-style:italic;line-height:1.6}.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:18px;text-align:left}.wp-block-rss.alignleft{margin-right:2em}.wp-block-rss.alignright{margin-left:2em}.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;padding:0;list-style:none}.wp-block-rss.is-grid li{margin:0 0 16px 16px;width:100%}@media (min-width:600px){.wp-block-rss.columns-2 li{width:calc(50% - 16px)}.wp-block-rss.columns-3 li{width:calc(33.33333% - 16px)}.wp-block-rss.columns-4 li{width:calc(25% - 16px)}.wp-block-rss.columns-5 li{width:calc(20% - 16px)}.wp-block-rss.columns-6 li{width:calc(16.66667% - 16px)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;color:#6c7781;font-size:13px}.wp-block-search{display:flex;flex-wrap:wrap}.wp-block-search .wp-block-search__label{width:100%}.wp-block-search .wp-block-search__input{flex-grow:1;max-width:360px}.wp-block-search .wp-block-search__button{margin-right:10px}.wp-block-separator.is-style-wide{border-bottom-width:1px}.wp-block-separator.is-style-dots{background:none!important;border:none;text-align:center;max-width:none;line-height:1;height:auto}.wp-block-separator.is-style-dots:before{content:"\00b7 \00b7 \00b7";color:currentColor;font-size:20px;letter-spacing:2em;padding-right:2em;font-family:serif}.wp-block-social-links{display:flex;justify-content:flex-start;padding-right:0;padding-left:0;margin-right:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{text-decoration:none;border-bottom:0;box-shadow:none}.wp-social-link{display:block;width:36px;height:36px;border-radius:36px;margin-left:8px;transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.wp-social-link{transition-duration:0s}}.wp-social-link a{padding:6px;display:block;line-height:0;transition:transform .1s ease}.wp-social-link a,.wp-social-link a:active,.wp-social-link a:hover,.wp-social-link a:visited,.wp-social-link svg{color:currentColor;fill:currentColor}.wp-social-link:hover{transform:scale(1.1)}.wp-block-social-links.aligncenter{justify-content:center;display:flex}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1977f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0577b5;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#fe4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{background-color:#fefc00;color:#fff;stroke:#000}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#21a1f3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:#ff0100;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none;padding:4px}.wp-block-social-links.is-style-logos-only .wp-social-link svg{width:28px;height:28px}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1977f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0577b5}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#fe4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{color:#fff;stroke:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#21a1f3}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:#ff0100}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-right:16px;padding-left:16px}.wp-block-spacer{clear:both}p.wp-block-subhead{font-size:1.1em;font-style:italic;opacity:.75}.wp-block-table{overflow-x:auto}.wp-block-table table{width:100%}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{border-spacing:0;border-collapse:inherit;background-color:transparent;border-bottom:1px solid #f3f4f5}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:transparent}.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 16px;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-right:0}.wp-block-text-columns .wp-block-column:last-child{margin-left:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}.wp-block-video{margin-right:0;margin-left:0}.wp-block-video video{max-width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-video [poster]{object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-top:.5em;margin-bottom:1em}:root .has-pale-pink-background-color{background-color:#f78da7}:root .has-vivid-red-background-color{background-color:#cf2e2e}:root .has-luminous-vivid-orange-background-color{background-color:#ff6900}:root .has-luminous-vivid-amber-background-color{background-color:#fcb900}:root .has-light-green-cyan-background-color{background-color:#7bdcb5}:root .has-vivid-green-cyan-background-color{background-color:#00d084}:root .has-pale-cyan-blue-background-color{background-color:#8ed1fc}:root .has-vivid-cyan-blue-background-color{background-color:#0693e3}:root .has-vivid-purple-background-color{background-color:#9b51e0}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-cyan-bluish-gray-background-color{background-color:#abb8c3}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-pale-pink-color{color:#f78da7}:root .has-vivid-red-color{color:#cf2e2e}:root .has-luminous-vivid-orange-color{color:#ff6900}:root .has-luminous-vivid-amber-color{color:#fcb900}:root .has-light-green-cyan-color{color:#7bdcb5}:root .has-vivid-green-cyan-color{color:#00d084}:root .has-pale-cyan-blue-color{color:#8ed1fc}:root .has-vivid-cyan-blue-color{color:#0693e3}:root .has-vivid-purple-color{color:#9b51e0}:root .has-very-light-gray-color{color:#eee}:root .has-cyan-bluish-gray-color{color:#abb8c3}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:linear-gradient(-135deg,#0693e3,#9b51e0)}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(-135deg,#00d084,#0693e3)}:root .has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:linear-gradient(-135deg,#7adcb4,#00d082)}:root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:linear-gradient(-135deg,#fcb900,#ff6900)}:root .has-luminous-vivid-orange-to-vivid-red-gradient-background{background:linear-gradient(-135deg,#ff6900,#cf2e2e)}:root .has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:linear-gradient(-135deg,#eee,#a9b8c3)}:root .has-cool-to-warm-spectrum-gradient-background{background:linear-gradient(-135deg,#4aeadc,#9778d1 20%,#cf2aba 40%,#ee2c82 60%,#fb6962 80%,#fef84c)}:root .has-blush-light-purple-gradient-background{background:linear-gradient(-135deg,#ffceec,#9896f0)}:root .has-blush-bordeaux-gradient-background{background:linear-gradient(-135deg,#fecda5,#fe2d2d 50%,#6b003e)}:root .has-purple-crush-gradient-background{background:linear-gradient(-135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-luminous-dusk-gradient-background{background:linear-gradient(-135deg,#ffcb70,#c751c0 50%,#4158d0)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(-135deg,#faaca8,#dad0ec)}:root .has-pale-ocean-gradient-background{background:linear-gradient(-135deg,#fff5cb,#b6e3d4 50%,#33a7b5)}:root .has-electric-grass-gradient-background{background:linear-gradient(-135deg,#caf880,#71ce7e)}:root .has-subdued-olive-gradient-background{background:linear-gradient(-135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(-135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(-135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(-135deg,#020381,#2874fc)}.has-small-font-size{font-size:13px}.has-normal-font-size,.has-regular-font-size{font-size:16px}.has-medium-font-size{font-size:20px}.has-large-font-size{font-size:36px}.has-huge-font-size,.has-larger-font-size{font-size:42px}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right} \ No newline at end of file diff --git a/wp-includes/css/dist/block-library/style.css b/wp-includes/css/dist/block-library/style.css new file mode 100644 index 0000000..3e36f36 --- /dev/null +++ b/wp-includes/css/dist/block-library/style.css @@ -0,0 +1,1826 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.wp-block-audio figcaption { + margin-top: 0.5em; + margin-bottom: 1em; } + +.wp-block-audio audio { + width: 100%; + min-width: 300px; } + +.wp-block-button { + color: #fff; } + .wp-block-button.aligncenter { + text-align: center; } + .wp-block-button.alignright { + /*rtl:ignore*/ + text-align: right; } + +.wp-block-button__link { + background-color: #32373c; + border: none; + border-radius: 28px; + box-shadow: none; + color: inherit; + cursor: pointer; + display: inline-block; + font-size: 18px; + margin: 0; + padding: 12px 24px; + text-align: center; + text-decoration: none; + overflow-wrap: break-word; } + .wp-block-button__link:hover, .wp-block-button__link:focus, .wp-block-button__link:active, .wp-block-button__link:visited { + color: inherit; } + +.wp-gs .wp-block-button__link:not(.has-background) { + background-color: var(--wp-block-core-button--color--background, var(--wp-color--primary, #32373c)); } + +.is-style-squared .wp-block-button__link { + border-radius: 0; } + +.no-border-radius.wp-block-button__link { + border-radius: 0 !important; } + +.is-style-outline { + color: #32373c; } + .is-style-outline .wp-block-button__link { + background-color: transparent; + border: 2px solid; } + +.wp-block-buttons .wp-block-button { + display: inline-block; + margin-right: 8px; + margin-bottom: 8px; } + +.wp-block-buttons.alignright .wp-block-button { + margin-right: none; + margin-left: 8px; } + +.wp-block-buttons.aligncenter { + text-align: center; } + +.wp-block-calendar { + text-align: center; } + .wp-block-calendar th, + .wp-block-calendar tbody td { + padding: 4px; + border: 1px solid #e2e4e7; } + .wp-block-calendar tfoot td { + border: none; } + .wp-block-calendar table { + width: 100%; + border-collapse: collapse; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } + .wp-block-calendar table th { + font-weight: 400; + background: #edeff0; } + .wp-block-calendar a { + text-decoration: underline; } + .wp-block-calendar tfoot a { + color: #00739c; } + .wp-block-calendar table tbody, + .wp-block-calendar table caption { + color: #40464d; } + +.wp-block-categories.alignleft { + /*rtl:ignore*/ + margin-right: 2em; } + +.wp-block-categories.alignright { + /*rtl:ignore*/ + margin-left: 2em; } + +.wp-block-columns { + display: flex; + margin-bottom: 28px; + flex-wrap: wrap; } + @media (min-width: 782px) { + .wp-block-columns { + flex-wrap: nowrap; } } + .wp-block-columns.has-background { + padding: 20px 30px; } + +.wp-block-column { + flex-grow: 1; + min-width: 0; + word-break: break-word; + overflow-wrap: break-word; } + @media (max-width: 599px) { + .wp-block-column { + flex-basis: 100% !important; } } + @media (min-width: 600px) and (max-width: 781px) { + .wp-block-column { + flex-basis: calc(50% - 16px) !important; + flex-grow: 0; } + .wp-block-column:nth-child(even) { + margin-left: 32px; } } + @media (min-width: 782px) { + .wp-block-column { + flex-basis: 0; + flex-grow: 1; } + .wp-block-column[style] { + flex-grow: 0; } + .wp-block-column:not(:first-child) { + margin-left: 32px; } } + +/** + * All Columns Alignment + */ +.wp-block-columns.are-vertically-aligned-top { + align-items: flex-start; } + +.wp-block-columns.are-vertically-aligned-center { + align-items: center; } + +.wp-block-columns.are-vertically-aligned-bottom { + align-items: flex-end; } + +/** + * Individual Column Alignment + */ +.wp-block-column.is-vertically-aligned-top { + align-self: flex-start; } + +.wp-block-column.is-vertically-aligned-center { + -ms-grid-row-align: center; + align-self: center; } + +.wp-block-column.is-vertically-aligned-bottom { + align-self: flex-end; } + +.wp-block-column.is-vertically-aligned-top, .wp-block-column.is-vertically-aligned-center, .wp-block-column.is-vertically-aligned-bottom { + width: 100%; } + +.wp-block-cover-image, +.wp-block-cover { + position: relative; + background-color: #000; + background-size: cover; + background-position: center center; + min-height: 430px; + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; } + .wp-block-cover-image.has-parallax, + .wp-block-cover.has-parallax { + background-attachment: fixed; } + @supports (-webkit-overflow-scrolling: touch) { + .wp-block-cover-image.has-parallax, + .wp-block-cover.has-parallax { + background-attachment: scroll; } } + @media (prefers-reduced-motion: reduce) { + .wp-block-cover-image.has-parallax, + .wp-block-cover.has-parallax { + background-attachment: scroll; } } + .wp-block-cover-image.has-background-dim::before, + .wp-block-cover.has-background-dim::before { + content: ""; + background-color: inherit; } + .wp-block-cover-image.has-background-dim:not(.has-background-gradient)::before, + .wp-block-cover-image .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim:not(.has-background-gradient)::before, + .wp-block-cover .wp-block-cover__gradient-background { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 1; } + .wp-block-cover-image.has-background-dim:not(.has-background-gradient)::before, + .wp-block-cover-image .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim:not(.has-background-gradient)::before, + .wp-block-cover .wp-block-cover__gradient-background { + opacity: 0.5; } + .wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient)::before { + opacity: 0.1; } + .wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background { + opacity: 0.1; } + .wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient)::before { + opacity: 0.2; } + .wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background { + opacity: 0.2; } + .wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient)::before { + opacity: 0.3; } + .wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background { + opacity: 0.3; } + .wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient)::before { + opacity: 0.4; } + .wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background { + opacity: 0.4; } + .wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient)::before { + opacity: 0.5; } + .wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background { + opacity: 0.5; } + .wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient)::before { + opacity: 0.6; } + .wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background { + opacity: 0.6; } + .wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient)::before { + opacity: 0.7; } + .wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background { + opacity: 0.7; } + .wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient)::before { + opacity: 0.8; } + .wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background { + opacity: 0.8; } + .wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient)::before { + opacity: 0.9; } + .wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background { + opacity: 0.9; } + .wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient)::before, + .wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient)::before { + opacity: 1; } + .wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background, + .wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background { + opacity: 1; } + .wp-block-cover-image.alignleft, .wp-block-cover-image.alignright, + .wp-block-cover.alignleft, + .wp-block-cover.alignright { + max-width: 290px; + width: 100%; } + .wp-block-cover-image::after, + .wp-block-cover::after { + display: block; + content: ""; + font-size: 0; + min-height: inherit; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-cover-image::after, + .wp-block-cover::after { + content: none; } } + .wp-block-cover-image.aligncenter, .wp-block-cover-image.alignleft, .wp-block-cover-image.alignright, + .wp-block-cover.aligncenter, + .wp-block-cover.alignleft, + .wp-block-cover.alignright { + display: flex; } + .wp-block-cover-image .wp-block-cover__inner-container, + .wp-block-cover .wp-block-cover__inner-container { + width: calc(100% - 70px); + z-index: 1; + color: #f8f9f9; } + .wp-block-cover-image p:not(.has-text-color), + .wp-block-cover-image h1:not(.has-text-color), + .wp-block-cover-image h2:not(.has-text-color), + .wp-block-cover-image h3:not(.has-text-color), + .wp-block-cover-image h4:not(.has-text-color), + .wp-block-cover-image h5:not(.has-text-color), + .wp-block-cover-image h6:not(.has-text-color), + .wp-block-cover-image .wp-block-subhead:not(.has-text-color), + .wp-block-cover p:not(.has-text-color), + .wp-block-cover h1:not(.has-text-color), + .wp-block-cover h2:not(.has-text-color), + .wp-block-cover h3:not(.has-text-color), + .wp-block-cover h4:not(.has-text-color), + .wp-block-cover h5:not(.has-text-color), + .wp-block-cover h6:not(.has-text-color), + .wp-block-cover .wp-block-subhead:not(.has-text-color) { + color: inherit; } + +.wp-block-cover__video-background { + position: absolute; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); + width: 100%; + height: 100%; + z-index: 0; + object-fit: cover; } + +section.wp-block-cover-image h2, +.wp-block-cover-image-text, +.wp-block-cover-text { + color: #fff; } + section.wp-block-cover-image h2 a, + section.wp-block-cover-image h2 a:hover, + section.wp-block-cover-image h2 a:focus, + section.wp-block-cover-image h2 a:active, + .wp-block-cover-image-text a, + .wp-block-cover-image-text a:hover, + .wp-block-cover-image-text a:focus, + .wp-block-cover-image-text a:active, + .wp-block-cover-text a, + .wp-block-cover-text a:hover, + .wp-block-cover-text a:focus, + .wp-block-cover-text a:active { + color: #fff; } + +.wp-block-cover-image +.wp-block-cover.has-left-content { + justify-content: flex-start; } + +.wp-block-cover-image +.wp-block-cover.has-right-content { + justify-content: flex-end; } + +section.wp-block-cover-image.has-left-content > h2, +.wp-block-cover-image.has-left-content .wp-block-cover-image-text, +.wp-block-cover.has-left-content .wp-block-cover-text { + margin-left: 0; + text-align: left; } + +section.wp-block-cover-image.has-right-content > h2, +.wp-block-cover-image.has-right-content .wp-block-cover-image-text, +.wp-block-cover.has-right-content .wp-block-cover-text { + margin-right: 0; + text-align: right; } + +section.wp-block-cover-image > h2, +.wp-block-cover-image .wp-block-cover-image-text, +.wp-block-cover .wp-block-cover-text { + font-size: 2em; + line-height: 1.25; + z-index: 1; + margin-bottom: 0; + max-width: 580px; + padding: 14px; + text-align: center; } + +.block-editor-block-list__block[data-type="core/embed"][data-align="left"], +.block-editor-block-list__block[data-type="core/embed"][data-align="right"], +.wp-block-embed.alignleft, +.wp-block-embed.alignright { + max-width: 360px; + width: 100%; } + +.wp-block-embed { + margin-bottom: 1em; } + .wp-block-embed figcaption { + margin-top: 0.5em; + margin-bottom: 1em; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper, +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper { + position: relative; } + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper::before, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper::before { + content: ""; + display: block; + padding-top: 50%; } + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper iframe, + .wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper iframe { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper::before { + padding-top: 42.85%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper::before { + padding-top: 50%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper::before { + padding-top: 56.25%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper::before { + padding-top: 75%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper::before { + padding-top: 100%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper::before { + padding-top: 177.78%; } + +.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper::before { + padding-top: 200%; } + +.wp-block-file { + margin-bottom: 1.5em; } + .wp-block-file.aligncenter { + text-align: center; } + .wp-block-file.alignright { + /*rtl:ignore*/ + text-align: right; } + .wp-block-file .wp-block-file__button { + background: #32373c; + border-radius: 2em; + color: #fff; + font-size: 13px; + padding: 0.5em 1em; } + .wp-block-file a.wp-block-file__button { + text-decoration: none; } + .wp-block-file a.wp-block-file__button:hover, .wp-block-file a.wp-block-file__button:visited, .wp-block-file a.wp-block-file__button:focus, .wp-block-file a.wp-block-file__button:active { + box-shadow: none; + color: #fff; + opacity: 0.85; + text-decoration: none; } + .wp-block-file * + .wp-block-file__button { + margin-left: 0.75em; } + +.wp-block-gallery, +.blocks-gallery-grid { + display: flex; + flex-wrap: wrap; + list-style-type: none; + padding: 0; + margin: 0; } + .wp-block-gallery .blocks-gallery-image, + .wp-block-gallery .blocks-gallery-item, + .blocks-gallery-grid .blocks-gallery-image, + .blocks-gallery-grid .blocks-gallery-item { + margin: 0 16px 16px 0; + display: flex; + flex-grow: 1; + flex-direction: column; + justify-content: center; + position: relative; } + .wp-block-gallery .blocks-gallery-image figure, + .wp-block-gallery .blocks-gallery-item figure, + .blocks-gallery-grid .blocks-gallery-image figure, + .blocks-gallery-grid .blocks-gallery-item figure { + margin: 0; + height: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-gallery .blocks-gallery-image figure, + .wp-block-gallery .blocks-gallery-item figure, + .blocks-gallery-grid .blocks-gallery-image figure, + .blocks-gallery-grid .blocks-gallery-item figure { + display: flex; + align-items: flex-end; + justify-content: flex-start; } } + .wp-block-gallery .blocks-gallery-image img, + .wp-block-gallery .blocks-gallery-item img, + .blocks-gallery-grid .blocks-gallery-image img, + .blocks-gallery-grid .blocks-gallery-item img { + display: block; + max-width: 100%; + height: auto; } + .wp-block-gallery .blocks-gallery-image img, + .wp-block-gallery .blocks-gallery-item img, + .blocks-gallery-grid .blocks-gallery-image img, + .blocks-gallery-grid .blocks-gallery-item img { + width: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-gallery .blocks-gallery-image img, + .wp-block-gallery .blocks-gallery-item img, + .blocks-gallery-grid .blocks-gallery-image img, + .blocks-gallery-grid .blocks-gallery-item img { + width: auto; } } + .wp-block-gallery .blocks-gallery-image figcaption, + .wp-block-gallery .blocks-gallery-item figcaption, + .blocks-gallery-grid .blocks-gallery-image figcaption, + .blocks-gallery-grid .blocks-gallery-item figcaption { + position: absolute; + bottom: 0; + width: 100%; + max-height: 100%; + overflow: auto; + padding: 40px 10px 9px; + color: #fff; + text-align: center; + font-size: 13px; + background: linear-gradient(0deg, rgba(0, 0, 0, 0.7) 0, rgba(0, 0, 0, 0.3) 70%, transparent); } + .wp-block-gallery .blocks-gallery-image figcaption img, + .wp-block-gallery .blocks-gallery-item figcaption img, + .blocks-gallery-grid .blocks-gallery-image figcaption img, + .blocks-gallery-grid .blocks-gallery-item figcaption img { + display: inline; } + .wp-block-gallery.is-cropped .blocks-gallery-image a, + .wp-block-gallery.is-cropped .blocks-gallery-image img, + .wp-block-gallery.is-cropped .blocks-gallery-item a, + .wp-block-gallery.is-cropped .blocks-gallery-item img, + .blocks-gallery-grid.is-cropped .blocks-gallery-image a, + .blocks-gallery-grid.is-cropped .blocks-gallery-image img, + .blocks-gallery-grid.is-cropped .blocks-gallery-item a, + .blocks-gallery-grid.is-cropped .blocks-gallery-item img { + width: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-gallery.is-cropped .blocks-gallery-image a, + .wp-block-gallery.is-cropped .blocks-gallery-image img, + .wp-block-gallery.is-cropped .blocks-gallery-item a, + .wp-block-gallery.is-cropped .blocks-gallery-item img, + .blocks-gallery-grid.is-cropped .blocks-gallery-image a, + .blocks-gallery-grid.is-cropped .blocks-gallery-image img, + .blocks-gallery-grid.is-cropped .blocks-gallery-item a, + .blocks-gallery-grid.is-cropped .blocks-gallery-item img { + height: 100%; + flex: 1; + object-fit: cover; } } + .wp-block-gallery .blocks-gallery-image, + .wp-block-gallery .blocks-gallery-item, + .blocks-gallery-grid .blocks-gallery-image, + .blocks-gallery-grid .blocks-gallery-item { + width: calc((100% - 16px) / 2); } + .wp-block-gallery .blocks-gallery-image:nth-of-type(even), + .wp-block-gallery .blocks-gallery-item:nth-of-type(even), + .blocks-gallery-grid .blocks-gallery-image:nth-of-type(even), + .blocks-gallery-grid .blocks-gallery-item:nth-of-type(even) { + margin-right: 0; } + .wp-block-gallery.columns-1 .blocks-gallery-image, + .wp-block-gallery.columns-1 .blocks-gallery-item, + .blocks-gallery-grid.columns-1 .blocks-gallery-image, + .blocks-gallery-grid.columns-1 .blocks-gallery-item { + width: 100%; + margin-right: 0; } + @media (min-width: 600px) { + .wp-block-gallery.columns-3 .blocks-gallery-image, + .wp-block-gallery.columns-3 .blocks-gallery-item, + .blocks-gallery-grid.columns-3 .blocks-gallery-image, + .blocks-gallery-grid.columns-3 .blocks-gallery-item { + width: calc((100% - 16px * 2) / 3); + margin-right: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-3 .blocks-gallery-image, + .wp-block-gallery.columns-3 .blocks-gallery-item, + .blocks-gallery-grid.columns-3 .blocks-gallery-image, + .blocks-gallery-grid.columns-3 .blocks-gallery-item { + width: calc((100% - 16px * 2) / 3 - 1px); } } + .wp-block-gallery.columns-4 .blocks-gallery-image, + .wp-block-gallery.columns-4 .blocks-gallery-item, + .blocks-gallery-grid.columns-4 .blocks-gallery-image, + .blocks-gallery-grid.columns-4 .blocks-gallery-item { + width: calc((100% - 16px * 3) / 4); + margin-right: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-4 .blocks-gallery-image, + .wp-block-gallery.columns-4 .blocks-gallery-item, + .blocks-gallery-grid.columns-4 .blocks-gallery-image, + .blocks-gallery-grid.columns-4 .blocks-gallery-item { + width: calc((100% - 16px * 3) / 4 - 1px); } } + .wp-block-gallery.columns-5 .blocks-gallery-image, + .wp-block-gallery.columns-5 .blocks-gallery-item, + .blocks-gallery-grid.columns-5 .blocks-gallery-image, + .blocks-gallery-grid.columns-5 .blocks-gallery-item { + width: calc((100% - 16px * 4) / 5); + margin-right: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-5 .blocks-gallery-image, + .wp-block-gallery.columns-5 .blocks-gallery-item, + .blocks-gallery-grid.columns-5 .blocks-gallery-image, + .blocks-gallery-grid.columns-5 .blocks-gallery-item { + width: calc((100% - 16px * 4) / 5 - 1px); } } + .wp-block-gallery.columns-6 .blocks-gallery-image, + .wp-block-gallery.columns-6 .blocks-gallery-item, + .blocks-gallery-grid.columns-6 .blocks-gallery-image, + .blocks-gallery-grid.columns-6 .blocks-gallery-item { + width: calc((100% - 16px * 5) / 6); + margin-right: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-6 .blocks-gallery-image, + .wp-block-gallery.columns-6 .blocks-gallery-item, + .blocks-gallery-grid.columns-6 .blocks-gallery-image, + .blocks-gallery-grid.columns-6 .blocks-gallery-item { + width: calc((100% - 16px * 5) / 6 - 1px); } } + .wp-block-gallery.columns-7 .blocks-gallery-image, + .wp-block-gallery.columns-7 .blocks-gallery-item, + .blocks-gallery-grid.columns-7 .blocks-gallery-image, + .blocks-gallery-grid.columns-7 .blocks-gallery-item { + width: calc((100% - 16px * 6) / 7); + margin-right: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-7 .blocks-gallery-image, + .wp-block-gallery.columns-7 .blocks-gallery-item, + .blocks-gallery-grid.columns-7 .blocks-gallery-image, + .blocks-gallery-grid.columns-7 .blocks-gallery-item { + width: calc((100% - 16px * 6) / 7 - 1px); } } + .wp-block-gallery.columns-8 .blocks-gallery-image, + .wp-block-gallery.columns-8 .blocks-gallery-item, + .blocks-gallery-grid.columns-8 .blocks-gallery-image, + .blocks-gallery-grid.columns-8 .blocks-gallery-item { + width: calc((100% - 16px * 7) / 8); + margin-right: 16px; } + @supports (-ms-ime-align: auto) { + .wp-block-gallery.columns-8 .blocks-gallery-image, + .wp-block-gallery.columns-8 .blocks-gallery-item, + .blocks-gallery-grid.columns-8 .blocks-gallery-image, + .blocks-gallery-grid.columns-8 .blocks-gallery-item { + width: calc((100% - 16px * 7) / 8 - 1px); } } + .wp-block-gallery.columns-1 .blocks-gallery-image:nth-of-type(1n), + .wp-block-gallery.columns-1 .blocks-gallery-item:nth-of-type(1n), + .blocks-gallery-grid.columns-1 .blocks-gallery-image:nth-of-type(1n), + .blocks-gallery-grid.columns-1 .blocks-gallery-item:nth-of-type(1n) { + margin-right: 0; } + .wp-block-gallery.columns-2 .blocks-gallery-image:nth-of-type(2n), + .wp-block-gallery.columns-2 .blocks-gallery-item:nth-of-type(2n), + .blocks-gallery-grid.columns-2 .blocks-gallery-image:nth-of-type(2n), + .blocks-gallery-grid.columns-2 .blocks-gallery-item:nth-of-type(2n) { + margin-right: 0; } + .wp-block-gallery.columns-3 .blocks-gallery-image:nth-of-type(3n), + .wp-block-gallery.columns-3 .blocks-gallery-item:nth-of-type(3n), + .blocks-gallery-grid.columns-3 .blocks-gallery-image:nth-of-type(3n), + .blocks-gallery-grid.columns-3 .blocks-gallery-item:nth-of-type(3n) { + margin-right: 0; } + .wp-block-gallery.columns-4 .blocks-gallery-image:nth-of-type(4n), + .wp-block-gallery.columns-4 .blocks-gallery-item:nth-of-type(4n), + .blocks-gallery-grid.columns-4 .blocks-gallery-image:nth-of-type(4n), + .blocks-gallery-grid.columns-4 .blocks-gallery-item:nth-of-type(4n) { + margin-right: 0; } + .wp-block-gallery.columns-5 .blocks-gallery-image:nth-of-type(5n), + .wp-block-gallery.columns-5 .blocks-gallery-item:nth-of-type(5n), + .blocks-gallery-grid.columns-5 .blocks-gallery-image:nth-of-type(5n), + .blocks-gallery-grid.columns-5 .blocks-gallery-item:nth-of-type(5n) { + margin-right: 0; } + .wp-block-gallery.columns-6 .blocks-gallery-image:nth-of-type(6n), + .wp-block-gallery.columns-6 .blocks-gallery-item:nth-of-type(6n), + .blocks-gallery-grid.columns-6 .blocks-gallery-image:nth-of-type(6n), + .blocks-gallery-grid.columns-6 .blocks-gallery-item:nth-of-type(6n) { + margin-right: 0; } + .wp-block-gallery.columns-7 .blocks-gallery-image:nth-of-type(7n), + .wp-block-gallery.columns-7 .blocks-gallery-item:nth-of-type(7n), + .blocks-gallery-grid.columns-7 .blocks-gallery-image:nth-of-type(7n), + .blocks-gallery-grid.columns-7 .blocks-gallery-item:nth-of-type(7n) { + margin-right: 0; } + .wp-block-gallery.columns-8 .blocks-gallery-image:nth-of-type(8n), + .wp-block-gallery.columns-8 .blocks-gallery-item:nth-of-type(8n), + .blocks-gallery-grid.columns-8 .blocks-gallery-image:nth-of-type(8n), + .blocks-gallery-grid.columns-8 .blocks-gallery-item:nth-of-type(8n) { + margin-right: 0; } } + .wp-block-gallery .blocks-gallery-image:last-child, + .wp-block-gallery .blocks-gallery-item:last-child, + .blocks-gallery-grid .blocks-gallery-image:last-child, + .blocks-gallery-grid .blocks-gallery-item:last-child { + margin-right: 0; } + .wp-block-gallery.alignleft, .wp-block-gallery.alignright, + .blocks-gallery-grid.alignleft, + .blocks-gallery-grid.alignright { + max-width: 290px; + width: 100%; } + .wp-block-gallery.aligncenter .blocks-gallery-item figure, + .blocks-gallery-grid.aligncenter .blocks-gallery-item figure { + justify-content: center; } + +.wp-block-image { + margin-bottom: 1em; } + .wp-block-image img { + max-width: 100%; } + .wp-block-image.aligncenter { + text-align: center; } + .wp-block-image.alignfull img, + .wp-block-image.alignwide img { + width: 100%; } + .wp-block-image .alignleft, + .wp-block-image .alignright, + .wp-block-image .aligncenter, .wp-block-image.is-resized { + display: table; + margin-left: 0; + margin-right: 0; } + .wp-block-image .alignleft > figcaption, + .wp-block-image .alignright > figcaption, + .wp-block-image .aligncenter > figcaption, .wp-block-image.is-resized > figcaption { + display: table-caption; + caption-side: bottom; } + .wp-block-image .alignleft { + /*rtl:ignore*/ + float: left; + /*rtl:ignore*/ + margin-right: 1em; } + .wp-block-image .alignright { + /*rtl:ignore*/ + float: right; + /*rtl:ignore*/ + margin-left: 1em; } + .wp-block-image .aligncenter { + margin-left: auto; + margin-right: auto; } + .wp-block-image figcaption { + margin-top: 0.5em; + margin-bottom: 1em; } + +.is-style-rounded img { + border-radius: 9999px; } + +.is-style-circle-mask img { + border-radius: 9999px; } + @supports ((-webkit-mask-image: none) or (mask-image: none)) or (-webkit-mask-image: none) { + .is-style-circle-mask img { + /* stylelint-disable */ + -webkit-mask-image: url('data:image/svg+xml;utf8,'); + mask-image: url('data:image/svg+xml;utf8,'); + /* stylelint-enable */ + mask-mode: alpha; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-size: contain; + mask-size: contain; + -webkit-mask-position: center; + mask-position: center; + border-radius: 0; } } + +.wp-block-latest-comments__comment { + font-size: 15px; + line-height: 1.1; + list-style: none; + margin-bottom: 1em; } + .has-avatars .wp-block-latest-comments__comment { + min-height: 36px; + list-style: none; } + .has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta, + .has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt { + margin-left: 52px; } + .has-dates .wp-block-latest-comments__comment, + .has-excerpts .wp-block-latest-comments__comment { + line-height: 1.5; } + +.wp-block-latest-comments__comment-excerpt p { + font-size: 14px; + line-height: 1.8; + margin: 5px 0 20px; } + +.wp-block-latest-comments__comment-date { + color: #8f98a1; + display: block; + font-size: 12px; } + +.wp-block-latest-comments .avatar, +.wp-block-latest-comments__comment-avatar { + border-radius: 24px; + display: block; + float: left; + height: 40px; + margin-right: 12px; + width: 40px; } + +.wp-block-latest-posts.alignleft { + /*rtl:ignore*/ + margin-right: 2em; } + +.wp-block-latest-posts.alignright { + /*rtl:ignore*/ + margin-left: 2em; } + +.wp-block-latest-posts.wp-block-latest-posts__list { + list-style: none; } + .wp-block-latest-posts.wp-block-latest-posts__list li { + clear: both; } + +.wp-block-latest-posts.is-grid { + display: flex; + flex-wrap: wrap; + padding: 0; } + .wp-block-latest-posts.is-grid li { + margin: 0 16px 16px 0; + width: 100%; } + +@media (min-width: 600px) { + .wp-block-latest-posts.columns-2 li { + width: calc((100% / 2) - 16px); } + .wp-block-latest-posts.columns-3 li { + width: calc((100% / 3) - 16px); } + .wp-block-latest-posts.columns-4 li { + width: calc((100% / 4) - 16px); } + .wp-block-latest-posts.columns-5 li { + width: calc((100% / 5) - 16px); } + .wp-block-latest-posts.columns-6 li { + width: calc((100% / 6) - 16px); } } + +.wp-block-latest-posts__post-date { + display: block; + color: #6c7781; + font-size: 13px; } + +.wp-block-latest-posts__post-excerpt { + margin-top: 8px; + margin-bottom: 16px; } + +.wp-block-latest-posts__featured-image img { + height: auto; + width: auto; } + +.wp-block-latest-posts__featured-image.alignleft { + /*rtl:ignore*/ + margin-right: 1em; } + +.wp-block-latest-posts__featured-image.alignright { + /*rtl:ignore*/ + margin-left: 1em; } + +.wp-block-latest-posts__featured-image.aligncenter { + margin-bottom: 1em; + text-align: center; } + +.wp-block-media-text { + /*!rtl:begin:ignore*/ + direction: ltr; + /*!rtl:end:ignore*/ + display: -ms-grid; + display: grid; + -ms-grid-columns: 50% 1fr; + grid-template-columns: 50% 1fr; + -ms-grid-rows: auto; + grid-template-rows: auto; } + .wp-block-media-text.has-media-on-the-right { + -ms-grid-columns: 1fr 50%; + grid-template-columns: 1fr 50%; } + +.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content, +.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media { + -ms-grid-row-align: start; + align-self: start; } + +.wp-block-media-text .wp-block-media-text__content, +.wp-block-media-text .wp-block-media-text__media, +.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content, +.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media { + -ms-grid-row-align: center; + align-self: center; } + +.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content, +.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media { + -ms-grid-row-align: end; + align-self: end; } + +.wp-block-media-text .wp-block-media-text__media { + /*!rtl:begin:ignore*/ + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; + /*!rtl:end:ignore*/ + margin: 0; } + +.wp-block-media-text .wp-block-media-text__content { + direction: ltr; + /*!rtl:begin:ignore*/ + -ms-grid-column: 2; + grid-column: 2; + -ms-grid-row: 1; + grid-row: 1; + /*!rtl:end:ignore*/ + padding: 0 8% 0 8%; + word-break: break-word; } + +.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media { + /*!rtl:begin:ignore*/ + -ms-grid-column: 2; + grid-column: 2; + -ms-grid-row: 1; + grid-row: 1; + /*!rtl:end:ignore*/ } + +.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content { + /*!rtl:begin:ignore*/ + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; + /*!rtl:end:ignore*/ } + +.wp-block-media-text > figure > img, +.wp-block-media-text > figure > video { + max-width: unset; + width: 100%; + vertical-align: middle; } + +.wp-block-media-text.is-image-fill figure.wp-block-media-text__media { + height: 100%; + min-height: 250px; + background-size: cover; } + +.wp-block-media-text.is-image-fill figure.wp-block-media-text__media > img { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +/* +* Here we here not able to use a mobile first CSS approach. +* Custom widths are set using inline styles, and on mobile, +* we need 100% width, so we use important to overwrite the inline style. +* If the style were set on mobile first, on desktop styles, +* we would have no way of setting the style again to the inline style. +*/ +@media (max-width: 600px) { + .wp-block-media-text.is-stacked-on-mobile { + -ms-grid-columns: 100% !important; + grid-template-columns: 100% !important; } + .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } + .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 2; + grid-row: 2; } + .wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .wp-block-media-text__media { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 2; + grid-row: 2; } + .wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .wp-block-media-text__content { + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 1; + grid-row: 1; } } + +/* +* Frontend: reset the default list styles +*/ +.wp-block-navigation > ul { + display: block; + list-style: none; + margin: 0; + padding-left: 0; } + @media (min-width: 600px) { + .wp-block-navigation > ul { + display: flex; + flex-wrap: wrap; } } + .wp-block-navigation > ul ul { + list-style: none; + padding-left: 0; + margin-top: 0; + margin-left: 0; } + .wp-block-navigation > ul ul li { + margin: 0; } + +/* +* Frontend: styles for submenu flyout +*/ +.wp-block-navigation > ul li { + z-index: 1; } + .wp-block-navigation > ul li:hover, .wp-block-navigation > ul li:focus-within { + cursor: pointer; + z-index: 99999; } + .wp-block-navigation > ul li:hover > ul, + .wp-block-navigation > ul li:focus-within > ul, + .wp-block-navigation > ul li ul:hover, + .wp-block-navigation > ul li ul:focus { + visibility: visible; + opacity: 1; + display: flex; + flex-direction: column; } + +.wp-block-navigation > ul > li ul { + position: absolute; + left: 0; + top: 100%; + min-width: 200px; + max-width: 200px; + opacity: 0; + transition: opacity 0.1s linear; + visibility: hidden; } + +/* +* Styles shared between editor and frontend +*/ +.wp-block-navigation, +.wp-block-navigation .block-editor-block-list__layout { + display: flex; + flex-wrap: wrap; } + +.wp-block-navigation .block-editor-block-list__layout .block-editor-block-list__layout { + width: 200px; } + +.wp-block-navigation .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block { + margin: 0; + width: auto; } + +.wp-block-navigation, +.wp-block-navigation > .wp-block-navigation__container { + align-items: center; + width: 100%; } + .wp-block-navigation > .wp-block-navigation-link, + .wp-block-navigation > .wp-block-navigation__container > .wp-block-navigation-link { + display: flex; + margin-top: 0; + margin-bottom: 0; } + +.wp-block-navigation .wp-block-navigation-link { + position: relative; + margin: 0; + min-height: 56px; + display: flex; + line-height: 1.4; } + .wp-block-navigation .wp-block-navigation-link .wp-block, + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link { + min-height: auto; + padding: 0; } + .wp-block-navigation .wp-block-navigation-link .wp-block .wp-block-navigation-link { + margin: 0; } + .wp-block-navigation .wp-block-navigation-link > .block-editor-inner-blocks { + display: none; } + .wp-block-navigation .wp-block-navigation-link.has-child > .wp-block-navigation__container, + .wp-block-navigation .wp-block-navigation-link.is-editing.has-child > .block-editor-inner-blocks { + display: flex; + border: 1px solid rgba(0, 0, 0, 0.15); + position: absolute; + z-index: 1; + top: 100%; + left: 0; } + .wp-block-navigation .wp-block-navigation-link.has-child > .wp-block-navigation__container .block-editor-inner-blocks, + .wp-block-navigation .wp-block-navigation-link.has-child > .wp-block-navigation__container .wp-block-navigation__container, + .wp-block-navigation .wp-block-navigation-link.is-editing.has-child > .block-editor-inner-blocks .block-editor-inner-blocks, + .wp-block-navigation .wp-block-navigation-link.is-editing.has-child > .block-editor-inner-blocks .wp-block-navigation__container { + left: 100%; + top: -1px; } + .wp-block-navigation .wp-block-navigation-link .block-editor-inner-blocks, + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation__container { + background-color: inherit; + color: inherit; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__content { + display: flex; + align-items: center; + width: max-content; + padding: 6px 16px; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link:first-child:not(:only-child) .wp-block-navigation-link__content { + padding-top: 8px; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link:last-child .wp-block-navigation-link__content { + padding-bottom: 8px; } + .wp-block-navigation .wp-block-navigation-link.has-child .wp-block-navigation-link__content { + min-width: 100%; + padding-right: 32px; + position: relative; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__submenu-icon { + position: absolute; + right: 16px; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__submenu-icon svg { + fill: currentColor; } + .wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link svg { + transform: rotate(0); } + .wp-block-navigation .wp-block-navigation-link.has-text-color .wp-block-navigation-link__content { + color: inherit; } + +.wp-block-navigation .wp-block-navigation-link:not(.has-text-color) > .block-editor-inner-blocks, +.wp-block-navigation .wp-block-navigation-link:not(.has-text-color) > .wp-block-navigation__container, +.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-text-color) > .block-editor-inner-blocks, +.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-text-color) > .wp-block-navigation__container { + color: #111; } + +.wp-block-navigation .wp-block-navigation-link:not(.has-background) > .block-editor-inner-blocks, +.wp-block-navigation .wp-block-navigation-link:not(.has-background) > .wp-block-navigation__container, +.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-background) > .block-editor-inner-blocks, +.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-background) > .wp-block-navigation__container { + background-color: #fff; } + +.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-text-color) > .block-editor-inner-blocks, +.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-text-color) > .wp-block-navigation__container { + color: #fff; } + +.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-background) > .block-editor-inner-blocks, +.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-background) > .wp-block-navigation__container { + background-color: #333; } + +/* +* Frontend: non-shared styles & overrides +*/ +.wp-block-navigation .wp-block-navigation-link.has-child > .wp-block-navigation__container { + display: flex; + flex-direction: column; + padding: 0; } + +/* +* TODO: organize/untangle styles below this line +*/ +.wp-block-navigation > ul > li > a { + display: flex; + align-items: center; } + +.wp-block-navigation > ul > li:first-of-type > a { + padding-left: 0; } + +.wp-block-navigation > ul > li:last-of-type > a { + padding-right: 0; } + +.wp-block-navigation.items-justified-left > ul { + justify-content: flex-start; } + +.wp-block-navigation.items-justified-center > ul { + justify-content: center; } + +.wp-block-navigation.items-justified-right > ul { + justify-content: flex-end; } + +.is-small-text { + font-size: 14px; } + +.is-regular-text { + font-size: 16px; } + +.is-large-text { + font-size: 36px; } + +.is-larger-text { + font-size: 48px; } + +.has-drop-cap:not(:focus)::first-letter { + float: left; + font-size: 8.4em; + line-height: 0.68; + font-weight: 100; + margin: 0.05em 0.1em 0 0; + text-transform: uppercase; + font-style: normal; } + +p.has-background { + padding: 20px 30px; } + +p.has-text-color a { + color: inherit; } + +.wp-block-pullquote { + padding: 3em 0; + margin-left: 0; + margin-right: 0; + text-align: center; } + .wp-block-pullquote.alignleft, .wp-block-pullquote.alignright { + max-width: 290px; } + .wp-block-pullquote.alignleft p, .wp-block-pullquote.alignright p { + font-size: 20px; } + .wp-block-pullquote p { + font-size: 28px; + line-height: 1.6; } + .wp-block-pullquote cite, + .wp-block-pullquote footer { + position: relative; } + .wp-block-pullquote .has-text-color a { + color: inherit; } + +.wp-block-pullquote:not(.is-style-solid-color) { + background: none; } + +.wp-block-pullquote.is-style-solid-color { + border: none; } + .wp-block-pullquote.is-style-solid-color blockquote { + margin-left: auto; + margin-right: auto; + text-align: left; + max-width: 60%; } + .wp-block-pullquote.is-style-solid-color blockquote p { + margin-top: 0; + margin-bottom: 0; + font-size: 32px; } + .wp-block-pullquote.is-style-solid-color blockquote cite { + text-transform: none; + font-style: normal; } + +.wp-block-pullquote cite { + color: inherit; } + +.wp-block-quote.is-style-large, .wp-block-quote.is-large { + margin: 0 0 16px; + padding: 0 1em; } + .wp-block-quote.is-style-large p, .wp-block-quote.is-large p { + font-size: 24px; + font-style: italic; + line-height: 1.6; } + .wp-block-quote.is-style-large cite, + .wp-block-quote.is-style-large footer, .wp-block-quote.is-large cite, + .wp-block-quote.is-large footer { + font-size: 18px; + text-align: right; } + +.wp-block-rss.alignleft { + /*rtl:ignore*/ + margin-right: 2em; } + +.wp-block-rss.alignright { + /*rtl:ignore*/ + margin-left: 2em; } + +.wp-block-rss.is-grid { + display: flex; + flex-wrap: wrap; + padding: 0; + list-style: none; } + .wp-block-rss.is-grid li { + margin: 0 16px 16px 0; + width: 100%; } + +@media (min-width: 600px) { + .wp-block-rss.columns-2 li { + width: calc(( 100% / 2 ) - 16px); } + .wp-block-rss.columns-3 li { + width: calc(( 100% / 3 ) - 16px); } + .wp-block-rss.columns-4 li { + width: calc(( 100% / 4 ) - 16px); } + .wp-block-rss.columns-5 li { + width: calc(( 100% / 5 ) - 16px); } + .wp-block-rss.columns-6 li { + width: calc(( 100% / 6 ) - 16px); } } + +.wp-block-rss__item-publish-date, +.wp-block-rss__item-author { + display: block; + color: #6c7781; + font-size: 13px; } + +.wp-block-search { + display: flex; + flex-wrap: wrap; } + .wp-block-search .wp-block-search__label { + width: 100%; } + .wp-block-search .wp-block-search__input { + flex-grow: 1; + max-width: 360px; } + .wp-block-search .wp-block-search__button { + margin-left: 10px; } + +.wp-block-separator.is-style-wide { + border-bottom-width: 1px; } + +.wp-block-separator.is-style-dots { + background: none !important; + border: none; + text-align: center; + max-width: none; + line-height: 1; + height: auto; } + .wp-block-separator.is-style-dots::before { + content: "\00b7 \00b7 \00b7"; + color: currentColor; + font-size: 20px; + letter-spacing: 2em; + padding-left: 2em; + font-family: serif; } + +.wp-block-social-links { + display: flex; + justify-content: flex-start; + padding-left: 0; + padding-right: 0; + margin-left: 0; } + .wp-block-social-links .wp-social-link a, + .wp-block-social-links .wp-social-link a:hover { + text-decoration: none; + border-bottom: 0; + box-shadow: none; } + +.wp-social-link { + display: block; + width: 36px; + height: 36px; + border-radius: 36px; + margin-right: 8px; + transition: transform 0.1s ease; } + @media (prefers-reduced-motion: reduce) { + .wp-social-link { + transition-duration: 0s; } } + .wp-social-link a { + padding: 6px; + display: block; + line-height: 0; + transition: transform 0.1s ease; } + .wp-social-link a, + .wp-social-link a:hover, + .wp-social-link a:active, + .wp-social-link a:visited, + .wp-social-link svg { + color: currentColor; + fill: currentColor; } + .wp-social-link:hover { + transform: scale(1.1); } + +.wp-block-social-links.aligncenter { + justify-content: center; + display: flex; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link { + background-color: #f0f0f0; + color: #444; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon { + background-color: #f90; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp { + background-color: #1ea0c3; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance { + background-color: #0757fe; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen { + background-color: #1e1f26; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart { + background-color: #02e49b; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble { + background-color: #e94c89; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox { + background-color: #4280ff; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy { + background-color: #f45800; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook { + background-color: #1977f2; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx { + background-color: #000; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr { + background-color: #0461dd; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare { + background-color: #e65678; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github { + background-color: #24292d; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads { + background-color: #eceadd; + color: #382110; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google { + background-color: #ea4434; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram { + background-color: #f00075; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm { + background-color: #e21b24; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin { + background-color: #0577b5; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon { + background-color: #3288d4; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium { + background-color: #02ab6c; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup { + background-color: #f6405f; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest { + background-color: #e60122; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket { + background-color: #ef4155; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit { + background-color: #fe4500; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype { + background-color: #0478d7; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat { + background-color: #fefc00; + color: #fff; + stroke: #000; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud { + background-color: #ff5600; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify { + background-color: #1bd760; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr { + background-color: #011835; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch { + background-color: #6440a4; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter { + background-color: #21a1f3; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo { + background-color: #1eb7ea; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk { + background-color: #4680c2; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress { + background-color: #3499cd; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp { + background-color: #d32422; + color: #fff; } + +.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube { + background-color: #ff0100; + color: #fff; } + +.wp-block-social-links.is-style-logos-only .wp-social-link { + background: none; + padding: 4px; } + .wp-block-social-links.is-style-logos-only .wp-social-link svg { + width: 28px; + height: 28px; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-amazon { + color: #f90; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp { + color: #1ea0c3; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-behance { + color: #0757fe; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-codepen { + color: #1e1f26; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart { + color: #02e49b; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble { + color: #e94c89; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox { + color: #4280ff; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-etsy { + color: #f45800; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-facebook { + color: #1977f2; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx { + color: #000; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-flickr { + color: #0461dd; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare { + color: #e65678; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-github { + color: #24292d; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads { + color: #382110; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-google { + color: #ea4434; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-instagram { + color: #f00075; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm { + color: #e21b24; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin { + color: #0577b5; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon { + color: #3288d4; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-medium { + color: #02ab6c; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-meetup { + color: #f6405f; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest { + color: #e60122; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-pocket { + color: #ef4155; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-reddit { + color: #fe4500; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-skype { + color: #0478d7; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat { + color: #fff; + stroke: #000; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud { + color: #ff5600; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-spotify { + color: #1bd760; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr { + color: #011835; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-twitch { + color: #6440a4; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-twitter { + color: #21a1f3; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo { + color: #1eb7ea; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-vk { + color: #4680c2; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress { + color: #3499cd; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-yelp { + background-color: #d32422; + color: #fff; } + +.wp-block-social-links.is-style-logos-only .wp-social-link-youtube { + color: #ff0100; } + +.wp-block-social-links.is-style-pill-shape .wp-social-link { + width: auto; } + +.wp-block-social-links.is-style-pill-shape .wp-social-link a { + padding-left: 16px; + padding-right: 16px; } + +.wp-block-spacer { + clear: both; } + +p.wp-block-subhead { + font-size: 1.1em; + font-style: italic; + opacity: 0.75; } + +.wp-block-table { + overflow-x: auto; } + .wp-block-table table { + width: 100%; } + .wp-block-table .has-fixed-layout { + table-layout: fixed; + width: 100%; } + .wp-block-table .has-fixed-layout td, + .wp-block-table .has-fixed-layout th { + word-break: break-word; } + .wp-block-table.alignleft, .wp-block-table.aligncenter, .wp-block-table.alignright { + display: table; + width: auto; } + .wp-block-table.alignleft td, + .wp-block-table.alignleft th, .wp-block-table.aligncenter td, + .wp-block-table.aligncenter th, .wp-block-table.alignright td, + .wp-block-table.alignright th { + word-break: break-word; } + .wp-block-table .has-subtle-light-gray-background-color { + background-color: #f3f4f5; } + .wp-block-table .has-subtle-pale-green-background-color { + background-color: #e9fbe5; } + .wp-block-table .has-subtle-pale-blue-background-color { + background-color: #e7f5fe; } + .wp-block-table .has-subtle-pale-pink-background-color { + background-color: #fcf0ef; } + .wp-block-table.is-style-stripes { + border-spacing: 0; + border-collapse: inherit; + background-color: transparent; + border-bottom: 1px solid #f3f4f5; } + .wp-block-table.is-style-stripes tbody tr:nth-child(odd) { + background-color: #f3f4f5; } + .wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd) { + background-color: #f3f4f5; } + .wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd) { + background-color: #e9fbe5; } + .wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd) { + background-color: #e7f5fe; } + .wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd) { + background-color: #fcf0ef; } + .wp-block-table.is-style-stripes th, + .wp-block-table.is-style-stripes td { + border-color: transparent; } + +.wp-block-text-columns { + display: flex; } + .wp-block-text-columns.aligncenter { + display: flex; } + .wp-block-text-columns .wp-block-column { + margin: 0 16px; + padding: 0; } + .wp-block-text-columns .wp-block-column:first-child { + margin-left: 0; } + .wp-block-text-columns .wp-block-column:last-child { + margin-right: 0; } + .wp-block-text-columns.columns-2 .wp-block-column { + width: calc(100% / 2); } + .wp-block-text-columns.columns-3 .wp-block-column { + width: calc(100% / 3); } + .wp-block-text-columns.columns-4 .wp-block-column { + width: calc(100% / 4); } + +.wp-block-video { + margin-left: 0; + margin-right: 0; } + .wp-block-video video { + max-width: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .wp-block-video [poster] { + object-fit: cover; } } + .wp-block-video.aligncenter { + text-align: center; } + .wp-block-video figcaption { + margin-top: 0.5em; + margin-bottom: 1em; } + +:root { + /* stylelint-disable function-comma-space-after */ + /* stylelint-enable function-comma-space-after */ } + :root .has-pale-pink-background-color { + background-color: #f78da7; } + :root .has-vivid-red-background-color { + background-color: #cf2e2e; } + :root .has-luminous-vivid-orange-background-color { + background-color: #ff6900; } + :root .has-luminous-vivid-amber-background-color { + background-color: #fcb900; } + :root .has-light-green-cyan-background-color { + background-color: #7bdcb5; } + :root .has-vivid-green-cyan-background-color { + background-color: #00d084; } + :root .has-pale-cyan-blue-background-color { + background-color: #8ed1fc; } + :root .has-vivid-cyan-blue-background-color { + background-color: #0693e3; } + :root .has-vivid-purple-background-color { + background-color: #9b51e0; } + :root .has-very-light-gray-background-color { + background-color: #eee; } + :root .has-cyan-bluish-gray-background-color { + background-color: #abb8c3; } + :root .has-very-dark-gray-background-color { + background-color: #313131; } + :root .has-pale-pink-color { + color: #f78da7; } + :root .has-vivid-red-color { + color: #cf2e2e; } + :root .has-luminous-vivid-orange-color { + color: #ff6900; } + :root .has-luminous-vivid-amber-color { + color: #fcb900; } + :root .has-light-green-cyan-color { + color: #7bdcb5; } + :root .has-vivid-green-cyan-color { + color: #00d084; } + :root .has-pale-cyan-blue-color { + color: #8ed1fc; } + :root .has-vivid-cyan-blue-color { + color: #0693e3; } + :root .has-vivid-purple-color { + color: #9b51e0; } + :root .has-very-light-gray-color { + color: #eee; } + :root .has-cyan-bluish-gray-color { + color: #abb8c3; } + :root .has-very-dark-gray-color { + color: #313131; } + :root .has-vivid-cyan-blue-to-vivid-purple-gradient-background { + background: linear-gradient(135deg, #0693e3 0%, #9b51e0 100%); } + :root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { + background: linear-gradient(135deg, #00d084 0%, #0693e3 100%); } + :root .has-light-green-cyan-to-vivid-green-cyan-gradient-background { + background: linear-gradient(135deg, #7adcb4 0%, #00d082 100%); } + :root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background { + background: linear-gradient(135deg, #fcb900 0%, #ff6900 100%); } + :root .has-luminous-vivid-orange-to-vivid-red-gradient-background { + background: linear-gradient(135deg, #ff6900 0%, #cf2e2e 100%); } + :root .has-very-light-gray-to-cyan-bluish-gray-gradient-background { + background: linear-gradient(135deg, #eeeeee 0%, #a9b8c3 100%); } + :root .has-cool-to-warm-spectrum-gradient-background { + background: linear-gradient(135deg, #4aeadc 0%, #9778d1 20%, #cf2aba 40%, #ee2c82 60%, #fb6962 80%, #fef84c 100%); } + :root .has-blush-light-purple-gradient-background { + background: linear-gradient(135deg, #ffceec 0%, #9896f0 100%); } + :root .has-blush-bordeaux-gradient-background { + background: linear-gradient(135deg, #fecda5 0%, #fe2d2d 50%, #6b003e 100%); } + :root .has-purple-crush-gradient-background { + background: linear-gradient(135deg, #34e2e4 0%, #4721fb 50%, #ab1dfe 100%); } + :root .has-luminous-dusk-gradient-background { + background: linear-gradient(135deg, #ffcb70 0%, #c751c0 50%, #4158d0 100%); } + :root .has-hazy-dawn-gradient-background { + background: linear-gradient(135deg, #faaca8 0%, #dad0ec 100%); } + :root .has-pale-ocean-gradient-background { + background: linear-gradient(135deg, #fff5cb 0%, #b6e3d4 50%, #33a7b5 100%); } + :root .has-electric-grass-gradient-background { + background: linear-gradient(135deg, #caf880 0%, #71ce7e 100%); } + :root .has-subdued-olive-gradient-background { + background: linear-gradient(135deg, #fafae1 0%, #67a671 100%); } + :root .has-atomic-cream-gradient-background { + background: linear-gradient(135deg, #fdd79a 0%, #004a59 100%); } + :root .has-nightshade-gradient-background { + background: linear-gradient(135deg, #330968 0%, #31cdcf 100%); } + :root .has-midnight-gradient-background { + background: linear-gradient(135deg, #020381 0%, #2874fc 100%); } + +.has-small-font-size { + font-size: 13px; } + +.has-regular-font-size, +.has-normal-font-size { + font-size: 16px; } + +.has-medium-font-size { + font-size: 20px; } + +.has-large-font-size { + font-size: 36px; } + +.has-larger-font-size, +.has-huge-font-size { + font-size: 42px; } + +.has-text-align-center { + text-align: center; } + +.has-text-align-left { + /*rtl:ignore*/ + text-align: left; } + +.has-text-align-right { + /*rtl:ignore*/ + text-align: right; } diff --git a/wp-includes/css/dist/block-library/style.min.css b/wp-includes/css/dist/block-library/style.min.css new file mode 100644 index 0000000..f047ccc --- /dev/null +++ b/wp-includes/css/dist/block-library/style.min.css @@ -0,0 +1,11 @@ +.wp-block-audio figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-audio audio{width:100%;min-width:300px}.wp-block-button{color:#fff}.wp-block-button.aligncenter{text-align:center}.wp-block-button.alignright{text-align:right}.wp-block-button__link{background-color:#32373c;border:none;border-radius:28px;box-shadow:none;color:inherit;cursor:pointer;display:inline-block;font-size:18px;margin:0;padding:12px 24px;text-align:center;text-decoration:none;overflow-wrap:break-word}.wp-block-button__link:active,.wp-block-button__link:focus,.wp-block-button__link:hover,.wp-block-button__link:visited{color:inherit}.wp-gs .wp-block-button__link:not(.has-background){background-color:var(--wp-block-core-button--color--background,var(--wp-color--primary,#32373c))}.is-style-squared .wp-block-button__link{border-radius:0}.no-border-radius.wp-block-button__link{border-radius:0!important}.is-style-outline{color:#32373c}.is-style-outline .wp-block-button__link{background-color:transparent;border:2px solid}.wp-block-buttons .wp-block-button{display:inline-block;margin-right:8px;margin-bottom:8px}.wp-block-buttons.alignright .wp-block-button{margin-right:none;margin-left:8px}.wp-block-buttons.aligncenter,.wp-block-calendar{text-align:center}.wp-block-calendar tbody td,.wp-block-calendar th{padding:4px;border:1px solid #e2e4e7}.wp-block-calendar tfoot td{border:none}.wp-block-calendar table{width:100%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.wp-block-calendar table th{font-weight:400;background:#edeff0}.wp-block-calendar a{text-decoration:underline}.wp-block-calendar tfoot a{color:#00739c}.wp-block-calendar table caption,.wp-block-calendar table tbody{color:#40464d}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-columns{display:flex;margin-bottom:28px;flex-wrap:wrap}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap}}.wp-block-columns.has-background{padding:20px 30px}.wp-block-column{flex-grow:1;min-width:0;word-break:break-word;overflow-wrap:break-word}@media (max-width:599px){.wp-block-column{flex-basis:100%!important}}@media (min-width:600px) and (max-width:781px){.wp-block-column{flex-basis:calc(50% - 16px)!important;flex-grow:0}.wp-block-column:nth-child(2n){margin-left:32px}}@media (min-width:782px){.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-column[style]{flex-grow:0}.wp-block-column:not(:first-child){margin-left:32px}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{-ms-grid-row-align:center;align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}.wp-block-cover,.wp-block-cover-image{position:relative;background-color:#000;background-size:cover;background-position:50%;min-height:430px;height:100%;width:100%;display:flex;justify-content:center;align-items:center;overflow:hidden}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:fixed}@supports (-webkit-overflow-scrolling:touch){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:scroll}}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{content:"";background-color:inherit}.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim:not(.has-background-gradient):before,.wp-block-cover .wp-block-cover__gradient-background{position:absolute;top:0;left:0;bottom:0;right:0;z-index:1}.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim:not(.has-background-gradient):before,.wp-block-cover .wp-block-cover__gradient-background{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:290px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{display:block;content:"";font-size:0;min-height:inherit}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover-image .wp-block-cover__inner-container,.wp-block-cover .wp-block-cover__inner-container{width:calc(100% - 70px);z-index:1;color:#f8f9f9}.wp-block-cover-image .wp-block-subhead:not(.has-text-color),.wp-block-cover-image h1:not(.has-text-color),.wp-block-cover-image h2:not(.has-text-color),.wp-block-cover-image h3:not(.has-text-color),.wp-block-cover-image h4:not(.has-text-color),.wp-block-cover-image h5:not(.has-text-color),.wp-block-cover-image h6:not(.has-text-color),.wp-block-cover-image p:not(.has-text-color),.wp-block-cover .wp-block-subhead:not(.has-text-color),.wp-block-cover h1:not(.has-text-color),.wp-block-cover h2:not(.has-text-color),.wp-block-cover h3:not(.has-text-color),.wp-block-cover h4:not(.has-text-color),.wp-block-cover h5:not(.has-text-color),.wp-block-cover h6:not(.has-text-color),.wp-block-cover p:not(.has-text-color){color:inherit}.wp-block-cover__video-background{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%);width:100%;height:100%;z-index:0;object-fit:cover}.wp-block-cover-image-text,.wp-block-cover-text,section.wp-block-cover-image h2{color:#fff}.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-left:0;text-align:left}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-right:0;text-align:right}.wp-block-cover-image .wp-block-cover-image-text,.wp-block-cover .wp-block-cover-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;z-index:1;margin-bottom:0;max-width:580px;padding:14px;text-align:center}.block-editor-block-list__block[data-type="core/embed"][data-align=left],.block-editor-block-list__block[data-type="core/embed"][data-align=right],.wp-block-embed.alignleft,.wp-block-embed.alignright{max-width:360px;width:100%}.wp-block-embed{margin-bottom:1em}.wp-block-embed figcaption{margin-top:.5em;margin-bottom:1em}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper:before,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper iframe,.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper iframe{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.78%}.wp-embed-responsive .wp-block-embed.wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}.wp-block-file{margin-bottom:1.5em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file .wp-block-file__button{background:#32373c;border-radius:2em;color:#fff;font-size:13px;padding:.5em 1em}.wp-block-file a.wp-block-file__button{text-decoration:none}.wp-block-file a.wp-block-file__button:active,.wp-block-file a.wp-block-file__button:focus,.wp-block-file a.wp-block-file__button:hover,.wp-block-file a.wp-block-file__button:visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}.wp-block-file *+.wp-block-file__button{margin-left:.75em}.blocks-gallery-grid,.wp-block-gallery{display:flex;flex-wrap:wrap;list-style-type:none;padding:0;margin:0}.blocks-gallery-grid .blocks-gallery-image,.blocks-gallery-grid .blocks-gallery-item,.wp-block-gallery .blocks-gallery-image,.wp-block-gallery .blocks-gallery-item{margin:0 16px 16px 0;display:flex;flex-grow:1;flex-direction:column;justify-content:center;position:relative}.blocks-gallery-grid .blocks-gallery-image figure,.blocks-gallery-grid .blocks-gallery-item figure,.wp-block-gallery .blocks-gallery-image figure,.wp-block-gallery .blocks-gallery-item figure{margin:0;height:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid .blocks-gallery-image figure,.blocks-gallery-grid .blocks-gallery-item figure,.wp-block-gallery .blocks-gallery-image figure,.wp-block-gallery .blocks-gallery-item figure{display:flex;align-items:flex-end;justify-content:flex-start}}.blocks-gallery-grid .blocks-gallery-image img,.blocks-gallery-grid .blocks-gallery-item img,.wp-block-gallery .blocks-gallery-image img,.wp-block-gallery .blocks-gallery-item img{display:block;max-width:100%;height:auto;width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid .blocks-gallery-image img,.blocks-gallery-grid .blocks-gallery-item img,.wp-block-gallery .blocks-gallery-image img,.wp-block-gallery .blocks-gallery-item img{width:auto}}.blocks-gallery-grid .blocks-gallery-image figcaption,.blocks-gallery-grid .blocks-gallery-item figcaption,.wp-block-gallery .blocks-gallery-image figcaption,.wp-block-gallery .blocks-gallery-item figcaption{position:absolute;bottom:0;width:100%;max-height:100%;overflow:auto;padding:40px 10px 9px;color:#fff;text-align:center;font-size:13px;background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent)}.blocks-gallery-grid .blocks-gallery-image figcaption img,.blocks-gallery-grid .blocks-gallery-item figcaption img,.wp-block-gallery .blocks-gallery-image figcaption img,.wp-block-gallery .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid.is-cropped .blocks-gallery-image a,.blocks-gallery-grid.is-cropped .blocks-gallery-image img,.blocks-gallery-grid.is-cropped .blocks-gallery-item a,.blocks-gallery-grid.is-cropped .blocks-gallery-item img,.wp-block-gallery.is-cropped .blocks-gallery-image a,.wp-block-gallery.is-cropped .blocks-gallery-image img,.wp-block-gallery.is-cropped .blocks-gallery-item a,.wp-block-gallery.is-cropped .blocks-gallery-item img{width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid.is-cropped .blocks-gallery-image a,.blocks-gallery-grid.is-cropped .blocks-gallery-image img,.blocks-gallery-grid.is-cropped .blocks-gallery-item a,.blocks-gallery-grid.is-cropped .blocks-gallery-item img,.wp-block-gallery.is-cropped .blocks-gallery-image a,.wp-block-gallery.is-cropped .blocks-gallery-image img,.wp-block-gallery.is-cropped .blocks-gallery-item a,.wp-block-gallery.is-cropped .blocks-gallery-item img{height:100%;flex:1;object-fit:cover}}.blocks-gallery-grid .blocks-gallery-image,.blocks-gallery-grid .blocks-gallery-item,.wp-block-gallery .blocks-gallery-image,.wp-block-gallery .blocks-gallery-item{width:calc((100% - 16px)/2)}.blocks-gallery-grid .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery .blocks-gallery-item:nth-of-type(2n){margin-right:0}.blocks-gallery-grid.columns-1 .blocks-gallery-image,.blocks-gallery-grid.columns-1 .blocks-gallery-item,.wp-block-gallery.columns-1 .blocks-gallery-image,.wp-block-gallery.columns-1 .blocks-gallery-item{width:100%;margin-right:0}@media (min-width:600px){.blocks-gallery-grid.columns-3 .blocks-gallery-image,.blocks-gallery-grid.columns-3 .blocks-gallery-item,.wp-block-gallery.columns-3 .blocks-gallery-image,.wp-block-gallery.columns-3 .blocks-gallery-item{width:calc((100% - 32px)/3);margin-right:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-3 .blocks-gallery-image,.blocks-gallery-grid.columns-3 .blocks-gallery-item,.wp-block-gallery.columns-3 .blocks-gallery-image,.wp-block-gallery.columns-3 .blocks-gallery-item{width:calc((100% - 32px)/3 - 1px)}}.blocks-gallery-grid.columns-4 .blocks-gallery-image,.blocks-gallery-grid.columns-4 .blocks-gallery-item,.wp-block-gallery.columns-4 .blocks-gallery-image,.wp-block-gallery.columns-4 .blocks-gallery-item{width:calc((100% - 48px)/4);margin-right:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-4 .blocks-gallery-image,.blocks-gallery-grid.columns-4 .blocks-gallery-item,.wp-block-gallery.columns-4 .blocks-gallery-image,.wp-block-gallery.columns-4 .blocks-gallery-item{width:calc((100% - 48px)/4 - 1px)}}.blocks-gallery-grid.columns-5 .blocks-gallery-image,.blocks-gallery-grid.columns-5 .blocks-gallery-item,.wp-block-gallery.columns-5 .blocks-gallery-image,.wp-block-gallery.columns-5 .blocks-gallery-item{width:calc((100% - 64px)/5);margin-right:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-5 .blocks-gallery-image,.blocks-gallery-grid.columns-5 .blocks-gallery-item,.wp-block-gallery.columns-5 .blocks-gallery-image,.wp-block-gallery.columns-5 .blocks-gallery-item{width:calc((100% - 64px)/5 - 1px)}}.blocks-gallery-grid.columns-6 .blocks-gallery-image,.blocks-gallery-grid.columns-6 .blocks-gallery-item,.wp-block-gallery.columns-6 .blocks-gallery-image,.wp-block-gallery.columns-6 .blocks-gallery-item{width:calc((100% - 80px)/6);margin-right:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-6 .blocks-gallery-image,.blocks-gallery-grid.columns-6 .blocks-gallery-item,.wp-block-gallery.columns-6 .blocks-gallery-image,.wp-block-gallery.columns-6 .blocks-gallery-item{width:calc((100% - 80px)/6 - 1px)}}.blocks-gallery-grid.columns-7 .blocks-gallery-image,.blocks-gallery-grid.columns-7 .blocks-gallery-item,.wp-block-gallery.columns-7 .blocks-gallery-image,.wp-block-gallery.columns-7 .blocks-gallery-item{width:calc((100% - 96px)/7);margin-right:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-7 .blocks-gallery-image,.blocks-gallery-grid.columns-7 .blocks-gallery-item,.wp-block-gallery.columns-7 .blocks-gallery-image,.wp-block-gallery.columns-7 .blocks-gallery-item{width:calc((100% - 96px)/7 - 1px)}}.blocks-gallery-grid.columns-8 .blocks-gallery-image,.blocks-gallery-grid.columns-8 .blocks-gallery-item,.wp-block-gallery.columns-8 .blocks-gallery-image,.wp-block-gallery.columns-8 .blocks-gallery-item{width:calc((100% - 112px)/8);margin-right:16px}@supports (-ms-ime-align:auto){.blocks-gallery-grid.columns-8 .blocks-gallery-image,.blocks-gallery-grid.columns-8 .blocks-gallery-item,.wp-block-gallery.columns-8 .blocks-gallery-image,.wp-block-gallery.columns-8 .blocks-gallery-item{width:calc((100% - 112px)/8 - 1px)}}.blocks-gallery-grid.columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid.columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery.columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery.columns-1 .blocks-gallery-item:nth-of-type(1n){margin-right:0}.blocks-gallery-grid.columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid.columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery.columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery.columns-2 .blocks-gallery-item:nth-of-type(2n){margin-right:0}.blocks-gallery-grid.columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid.columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery.columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery.columns-3 .blocks-gallery-item:nth-of-type(3n){margin-right:0}.blocks-gallery-grid.columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid.columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery.columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery.columns-4 .blocks-gallery-item:nth-of-type(4n){margin-right:0}.blocks-gallery-grid.columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid.columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery.columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery.columns-5 .blocks-gallery-item:nth-of-type(5n){margin-right:0}.blocks-gallery-grid.columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid.columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery.columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery.columns-6 .blocks-gallery-item:nth-of-type(6n){margin-right:0}.blocks-gallery-grid.columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid.columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery.columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery.columns-7 .blocks-gallery-item:nth-of-type(7n){margin-right:0}.blocks-gallery-grid.columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid.columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery.columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery.columns-8 .blocks-gallery-item:nth-of-type(8n){margin-right:0}}.blocks-gallery-grid .blocks-gallery-image:last-child,.blocks-gallery-grid .blocks-gallery-item:last-child,.wp-block-gallery .blocks-gallery-image:last-child,.wp-block-gallery .blocks-gallery-item:last-child{margin-right:0}.blocks-gallery-grid.alignleft,.blocks-gallery-grid.alignright,.wp-block-gallery.alignleft,.wp-block-gallery.alignright{max-width:290px;width:100%}.blocks-gallery-grid.aligncenter .blocks-gallery-item figure,.wp-block-gallery.aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-image{margin-bottom:1em}.wp-block-image img{max-width:100%}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.is-resized{display:table;margin-left:0;margin-right:0}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.is-resized>figcaption{display:table-caption;caption-side:bottom}.wp-block-image .alignleft{float:left;margin-right:1em}.wp-block-image .alignright{float:right;margin-left:1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image figcaption{margin-top:.5em;margin-bottom:1em}.is-style-circle-mask img,.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.is-style-circle-mask img{-webkit-mask-image:url('data:image/svg+xml;utf8,');mask-image:url('data:image/svg+xml;utf8,');mask-mode:alpha;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center;mask-position:center;border-radius:0}}.wp-block-latest-comments__comment{font-size:15px;line-height:1.1;list-style:none;margin-bottom:1em}.has-avatars .wp-block-latest-comments__comment{min-height:36px;list-style:none}.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{margin-left:52px}.has-dates .wp-block-latest-comments__comment,.has-excerpts .wp-block-latest-comments__comment{line-height:1.5}.wp-block-latest-comments__comment-excerpt p{font-size:14px;line-height:1.8;margin:5px 0 20px}.wp-block-latest-comments__comment-date{color:#8f98a1;display:block;font-size:12px}.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{border-radius:24px;display:block;float:left;height:40px;margin-right:12px;width:40px}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 16px 16px 0;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - 16px)}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - 16px)}.wp-block-latest-posts.columns-4 li{width:calc(25% - 16px)}.wp-block-latest-posts.columns-5 li{width:calc(20% - 16px)}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 16px)}}.wp-block-latest-posts__post-date{display:block;color:#6c7781;font-size:13px}.wp-block-latest-posts__post-excerpt{margin-top:8px;margin-bottom:16px}.wp-block-latest-posts__featured-image img{height:auto;width:auto}.wp-block-latest-posts__featured-image.alignleft{margin-right:1em}.wp-block-latest-posts__featured-image.alignright{margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}.wp-block-media-text{ + /*!rtl:begin:ignore*/direction:ltr; + /*!rtl:end:ignore*/display:-ms-grid;display:grid;-ms-grid-columns:50% 1fr;grid-template-columns:50% 1fr;-ms-grid-rows:auto;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{-ms-grid-columns:1fr 50%;grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{-ms-grid-row-align:start;align-self:start}.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media,.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media{-ms-grid-row-align:center;align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{-ms-grid-row-align:end;align-self:end}.wp-block-media-text .wp-block-media-text__media{ + /*!rtl:begin:ignore*/-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1; + /*!rtl:end:ignore*/margin:0}.wp-block-media-text .wp-block-media-text__content{direction:ltr; + /*!rtl:begin:ignore*/-ms-grid-column:2;grid-column:2;-ms-grid-row:1;grid-row:1; + /*!rtl:end:ignore*/padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{ + /*!rtl:begin:ignore*/-ms-grid-column:2;grid-column:2;-ms-grid-row:1;grid-row:1 + /*!rtl:end:ignore*/}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{ + /*!rtl:begin:ignore*/-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1 + /*!rtl:end:ignore*/}.wp-block-media-text>figure>img,.wp-block-media-text>figure>video{max-width:unset;width:100%;vertical-align:middle}.wp-block-media-text.is-image-fill figure.wp-block-media-text__media{height:100%;min-height:250px;background-size:cover}.wp-block-media-text.is-image-fill figure.wp-block-media-text__media>img{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{-ms-grid-columns:100%!important;grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .wp-block-media-text__media,.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{-ms-grid-column:1;grid-column:1;-ms-grid-row:2;grid-row:2}.wp-block-media-text.is-stacked-on-mobile.has-media-on-the-right .wp-block-media-text__content{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}}.wp-block-navigation>ul{display:block;list-style:none;margin:0;padding-left:0}@media (min-width:600px){.wp-block-navigation>ul{display:flex;flex-wrap:wrap}}.wp-block-navigation>ul ul{list-style:none;padding-left:0;margin-top:0;margin-left:0}.wp-block-navigation>ul ul li{margin:0}.wp-block-navigation>ul li{z-index:1}.wp-block-navigation>ul li:focus-within,.wp-block-navigation>ul li:hover{cursor:pointer;z-index:99999}.wp-block-navigation>ul li:focus-within>ul,.wp-block-navigation>ul li:hover>ul,.wp-block-navigation>ul li ul:focus,.wp-block-navigation>ul li ul:hover{visibility:visible;opacity:1;display:flex;flex-direction:column}.wp-block-navigation>ul>li ul{position:absolute;left:0;top:100%;min-width:200px;max-width:200px;opacity:0;transition:opacity .1s linear;visibility:hidden}.wp-block-navigation,.wp-block-navigation .block-editor-block-list__layout{display:flex;flex-wrap:wrap}.wp-block-navigation .block-editor-block-list__layout .block-editor-block-list__layout{width:200px}.wp-block-navigation .block-editor-inner-blocks>.block-editor-block-list__layout>.wp-block{margin:0;width:auto}.wp-block-navigation,.wp-block-navigation>.wp-block-navigation__container{align-items:center;width:100%}.wp-block-navigation>.wp-block-navigation-link,.wp-block-navigation>.wp-block-navigation__container>.wp-block-navigation-link{display:flex;margin-top:0;margin-bottom:0}.wp-block-navigation .wp-block-navigation-link{position:relative;margin:0;min-height:56px;display:flex;line-height:1.4}.wp-block-navigation .wp-block-navigation-link .wp-block,.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link{min-height:auto;padding:0}.wp-block-navigation .wp-block-navigation-link .wp-block .wp-block-navigation-link{margin:0}.wp-block-navigation .wp-block-navigation-link>.block-editor-inner-blocks{display:none}.wp-block-navigation .wp-block-navigation-link.has-child>.wp-block-navigation__container,.wp-block-navigation .wp-block-navigation-link.is-editing.has-child>.block-editor-inner-blocks{display:flex;border:1px solid rgba(0,0,0,.15);position:absolute;z-index:1;top:100%;left:0}.wp-block-navigation .wp-block-navigation-link.has-child>.wp-block-navigation__container .block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link.has-child>.wp-block-navigation__container .wp-block-navigation__container,.wp-block-navigation .wp-block-navigation-link.is-editing.has-child>.block-editor-inner-blocks .block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link.is-editing.has-child>.block-editor-inner-blocks .wp-block-navigation__container{left:100%;top:-1px}.wp-block-navigation .wp-block-navigation-link .block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link .wp-block-navigation__container{background-color:inherit;color:inherit}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__content{display:flex;align-items:center;width:max-content;padding:6px 16px}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link:first-child:not(:only-child) .wp-block-navigation-link__content{padding-top:8px}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link:last-child .wp-block-navigation-link__content{padding-bottom:8px}.wp-block-navigation .wp-block-navigation-link.has-child .wp-block-navigation-link__content{min-width:100%;padding-right:32px;position:relative}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__submenu-icon{position:absolute;right:16px}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link__submenu-icon svg{fill:currentColor}.wp-block-navigation .wp-block-navigation-link .wp-block-navigation-link svg{transform:rotate(0)}.wp-block-navigation .wp-block-navigation-link.has-text-color .wp-block-navigation-link__content{color:inherit}.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-text-color)>.block-editor-inner-blocks,.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-text-color)>.wp-block-navigation__container,.wp-block-navigation .wp-block-navigation-link:not(.has-text-color)>.block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link:not(.has-text-color)>.wp-block-navigation__container{color:#111}.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-background)>.block-editor-inner-blocks,.wp-block-navigation.is-style-light .wp-block-navigation-link:not(.has-background)>.wp-block-navigation__container,.wp-block-navigation .wp-block-navigation-link:not(.has-background)>.block-editor-inner-blocks,.wp-block-navigation .wp-block-navigation-link:not(.has-background)>.wp-block-navigation__container{background-color:#fff}.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-text-color)>.block-editor-inner-blocks,.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-text-color)>.wp-block-navigation__container{color:#fff}.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-background)>.block-editor-inner-blocks,.wp-block-navigation.is-style-dark .wp-block-navigation-link:not(.has-background)>.wp-block-navigation__container{background-color:#333}.wp-block-navigation .wp-block-navigation-link.has-child>.wp-block-navigation__container{display:flex;flex-direction:column;padding:0}.wp-block-navigation>ul>li>a{display:flex;align-items:center}.wp-block-navigation>ul>li:first-of-type>a{padding-left:0}.wp-block-navigation>ul>li:last-of-type>a{padding-right:0}.wp-block-navigation.items-justified-left>ul{justify-content:flex-start}.wp-block-navigation.items-justified-center>ul{justify-content:center}.wp-block-navigation.items-justified-right>ul{justify-content:flex-end}.is-small-text{font-size:14px}.is-regular-text{font-size:16px}.is-large-text{font-size:36px}.is-larger-text{font-size:48px}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;line-height:.68;font-weight:100;margin:.05em .1em 0 0;text-transform:uppercase;font-style:normal}p.has-background{padding:20px 30px}p.has-text-color a{color:inherit}.wp-block-pullquote{padding:3em 0;margin-left:0;margin-right:0;text-align:center}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:290px}.wp-block-pullquote.alignleft p,.wp-block-pullquote.alignright p{font-size:20px}.wp-block-pullquote p{font-size:28px;line-height:1.6}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}.wp-block-pullquote:not(.is-style-solid-color){background:none}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-left:auto;margin-right:auto;text-align:left;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{margin-top:0;margin-bottom:0;font-size:32px}.wp-block-pullquote.is-style-solid-color blockquote cite{text-transform:none;font-style:normal}.wp-block-pullquote cite{color:inherit}.wp-block-quote.is-large,.wp-block-quote.is-style-large{margin:0 0 16px;padding:0 1em}.wp-block-quote.is-large p,.wp-block-quote.is-style-large p{font-size:24px;font-style:italic;line-height:1.6}.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:18px;text-align:right}.wp-block-rss.alignleft{margin-right:2em}.wp-block-rss.alignright{margin-left:2em}.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;padding:0;list-style:none}.wp-block-rss.is-grid li{margin:0 16px 16px 0;width:100%}@media (min-width:600px){.wp-block-rss.columns-2 li{width:calc(50% - 16px)}.wp-block-rss.columns-3 li{width:calc(33.33333% - 16px)}.wp-block-rss.columns-4 li{width:calc(25% - 16px)}.wp-block-rss.columns-5 li{width:calc(20% - 16px)}.wp-block-rss.columns-6 li{width:calc(16.66667% - 16px)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;color:#6c7781;font-size:13px}.wp-block-search{display:flex;flex-wrap:wrap}.wp-block-search .wp-block-search__label{width:100%}.wp-block-search .wp-block-search__input{flex-grow:1;max-width:360px}.wp-block-search .wp-block-search__button{margin-left:10px}.wp-block-separator.is-style-wide{border-bottom-width:1px}.wp-block-separator.is-style-dots{background:none!important;border:none;text-align:center;max-width:none;line-height:1;height:auto}.wp-block-separator.is-style-dots:before{content:"\00b7 \00b7 \00b7";color:currentColor;font-size:20px;letter-spacing:2em;padding-left:2em;font-family:serif}.wp-block-social-links{display:flex;justify-content:flex-start;padding-left:0;padding-right:0;margin-left:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{text-decoration:none;border-bottom:0;box-shadow:none}.wp-social-link{display:block;width:36px;height:36px;border-radius:36px;margin-right:8px;transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.wp-social-link{transition-duration:0s}}.wp-social-link a{padding:6px;display:block;line-height:0;transition:transform .1s ease}.wp-social-link a,.wp-social-link a:active,.wp-social-link a:hover,.wp-social-link a:visited,.wp-social-link svg{color:currentColor;fill:currentColor}.wp-social-link:hover{transform:scale(1.1)}.wp-block-social-links.aligncenter{justify-content:center;display:flex}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1977f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0577b5;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#fe4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{background-color:#fefc00;color:#fff;stroke:#000}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#21a1f3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:#ff0100;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none;padding:4px}.wp-block-social-links.is-style-logos-only .wp-social-link svg{width:28px;height:28px}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1977f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0577b5}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#fe4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{color:#fff;stroke:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#21a1f3}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:#ff0100}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-left:16px;padding-right:16px}.wp-block-spacer{clear:both}p.wp-block-subhead{font-size:1.1em;font-style:italic;opacity:.75}.wp-block-table{overflow-x:auto}.wp-block-table table{width:100%}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{border-spacing:0;border-collapse:inherit;background-color:transparent;border-bottom:1px solid #f3f4f5}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:transparent}.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 16px;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-left:0}.wp-block-text-columns .wp-block-column:last-child{margin-right:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}.wp-block-video{margin-left:0;margin-right:0}.wp-block-video video{max-width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-video [poster]{object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-top:.5em;margin-bottom:1em}:root .has-pale-pink-background-color{background-color:#f78da7}:root .has-vivid-red-background-color{background-color:#cf2e2e}:root .has-luminous-vivid-orange-background-color{background-color:#ff6900}:root .has-luminous-vivid-amber-background-color{background-color:#fcb900}:root .has-light-green-cyan-background-color{background-color:#7bdcb5}:root .has-vivid-green-cyan-background-color{background-color:#00d084}:root .has-pale-cyan-blue-background-color{background-color:#8ed1fc}:root .has-vivid-cyan-blue-background-color{background-color:#0693e3}:root .has-vivid-purple-background-color{background-color:#9b51e0}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-cyan-bluish-gray-background-color{background-color:#abb8c3}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-pale-pink-color{color:#f78da7}:root .has-vivid-red-color{color:#cf2e2e}:root .has-luminous-vivid-orange-color{color:#ff6900}:root .has-luminous-vivid-amber-color{color:#fcb900}:root .has-light-green-cyan-color{color:#7bdcb5}:root .has-vivid-green-cyan-color{color:#00d084}:root .has-pale-cyan-blue-color{color:#8ed1fc}:root .has-vivid-cyan-blue-color{color:#0693e3}:root .has-vivid-purple-color{color:#9b51e0}:root .has-very-light-gray-color{color:#eee}:root .has-cyan-bluish-gray-color{color:#abb8c3}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:linear-gradient(135deg,#0693e3,#9b51e0)}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:linear-gradient(135deg,#7adcb4,#00d082)}:root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:linear-gradient(135deg,#fcb900,#ff6900)}:root .has-luminous-vivid-orange-to-vivid-red-gradient-background{background:linear-gradient(135deg,#ff6900,#cf2e2e)}:root .has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:linear-gradient(135deg,#eee,#a9b8c3)}:root .has-cool-to-warm-spectrum-gradient-background{background:linear-gradient(135deg,#4aeadc,#9778d1 20%,#cf2aba 40%,#ee2c82 60%,#fb6962 80%,#fef84c)}:root .has-blush-light-purple-gradient-background{background:linear-gradient(135deg,#ffceec,#9896f0)}:root .has-blush-bordeaux-gradient-background{background:linear-gradient(135deg,#fecda5,#fe2d2d 50%,#6b003e)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-luminous-dusk-gradient-background{background:linear-gradient(135deg,#ffcb70,#c751c0 50%,#4158d0)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-pale-ocean-gradient-background{background:linear-gradient(135deg,#fff5cb,#b6e3d4 50%,#33a7b5)}:root .has-electric-grass-gradient-background{background:linear-gradient(135deg,#caf880,#71ce7e)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}.has-small-font-size{font-size:13px}.has-normal-font-size,.has-regular-font-size{font-size:16px}.has-medium-font-size{font-size:20px}.has-large-font-size{font-size:36px}.has-huge-font-size,.has-larger-font-size{font-size:42px}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right} \ No newline at end of file diff --git a/wp-includes/css/dist/block-library/theme-rtl.css b/wp-includes/css/dist/block-library/theme-rtl.css new file mode 100644 index 0000000..f0511b1 --- /dev/null +++ b/wp-includes/css/dist/block-library/theme-rtl.css @@ -0,0 +1,151 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.wp-block-audio figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-code { + font-family: Menlo, Consolas, monaco, monospace; + font-size: 14px; + color: #23282d; + padding: 0.8em 1em; + border: 1px solid #e2e4e7; + border-radius: 4px; } + +.wp-block-embed figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.blocks-gallery-caption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-image figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-pullquote { + border-top: 4px solid #555d66; + border-bottom: 4px solid #555d66; + margin-bottom: 28px; + color: #40464d; } + .wp-block-pullquote cite, + .wp-block-pullquote footer, .wp-block-pullquote__citation { + color: #40464d; + text-transform: uppercase; + font-size: 13px; + font-style: normal; } + +.wp-block-navigation ul, +.wp-block-navigation ul li { + list-style: none; } + +.wp-block-quote { + border-right: 4px solid #000; + margin: 0 0 28px 0; + padding-right: 1em; } + .wp-block-quote cite, + .wp-block-quote footer, .wp-block-quote__citation { + color: #6c7781; + font-size: 13px; + margin-top: 1em; + position: relative; + font-style: normal; } + .wp-block-quote.has-text-align-right, .wp-block-quote.has-text-align-right { + border-right: none; + border-left: 4px solid #000; + padding-right: 0; + padding-left: 1em; } + .wp-block-quote.has-text-align-center, .wp-block-quote.has-text-align-center { + border: none; + padding-right: 0; } + .wp-block-quote.is-style-large, .wp-block-quote.is-large { + border: none; } + +.wp-block-search .wp-block-search__label { + font-weight: bold; } + +.wp-block-group.has-background { + padding: 20px 30px; + margin-top: 0; + margin-bottom: 0; } + +.wp-block-separator { + border: none; + border-bottom: 2px solid #8f98a1; + margin-right: auto; + margin-left: auto; } + .wp-block-separator:not(.is-style-wide):not(.is-style-dots) { + max-width: 100px; } + .wp-block-separator.has-background:not(.is-style-dots) { + border-bottom: none; + height: 1px; } + .wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots) { + height: 2px; } + +.wp-block-table { + border-collapse: collapse; } + .wp-block-table thead { + border-bottom: 3px solid; } + .wp-block-table tfoot { + border-top: 3px solid; } + .wp-block-table td, + .wp-block-table th { + padding: 0.5em; + border: 1px solid; + word-break: normal; } + .wp-block-table figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-video figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } diff --git a/wp-includes/css/dist/block-library/theme-rtl.min.css b/wp-includes/css/dist/block-library/theme-rtl.min.css new file mode 100644 index 0000000..8738e0f --- /dev/null +++ b/wp-includes/css/dist/block-library/theme-rtl.min.css @@ -0,0 +1 @@ +.wp-block-audio figcaption{color:#555d66;font-size:13px;text-align:center}.wp-block-code{font-family:Menlo,Consolas,monaco,monospace;font-size:14px;color:#23282d;padding:.8em 1em;border:1px solid #e2e4e7;border-radius:4px}.blocks-gallery-caption,.wp-block-embed figcaption,.wp-block-image figcaption{color:#555d66;font-size:13px;text-align:center}.wp-block-pullquote{border-top:4px solid #555d66;border-bottom:4px solid #555d66;margin-bottom:28px;color:#40464d}.wp-block-pullquote__citation,.wp-block-pullquote cite,.wp-block-pullquote footer{color:#40464d;text-transform:uppercase;font-size:13px;font-style:normal}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none}.wp-block-quote{border-right:4px solid #000;margin:0 0 28px;padding-right:1em}.wp-block-quote__citation,.wp-block-quote cite,.wp-block-quote footer{color:#6c7781;font-size:13px;margin-top:1em;position:relative;font-style:normal}.wp-block-quote.has-text-align-right{border-right:none;border-left:4px solid #000;padding-right:0;padding-left:1em}.wp-block-quote.has-text-align-center{border:none;padding-right:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-group.has-background{padding:20px 30px;margin-top:0;margin-bottom:0}.wp-block-separator{border:none;border-bottom:2px solid #8f98a1;margin-right:auto;margin-left:auto}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){max-width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{border-collapse:collapse}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{padding:.5em;border:1px solid;word-break:normal}.wp-block-table figcaption,.wp-block-video figcaption{color:#555d66;font-size:13px;text-align:center} \ No newline at end of file diff --git a/wp-includes/css/dist/block-library/theme.css b/wp-includes/css/dist/block-library/theme.css new file mode 100644 index 0000000..312011a --- /dev/null +++ b/wp-includes/css/dist/block-library/theme.css @@ -0,0 +1,151 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.wp-block-audio figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-code { + font-family: Menlo, Consolas, monaco, monospace; + font-size: 14px; + color: #23282d; + padding: 0.8em 1em; + border: 1px solid #e2e4e7; + border-radius: 4px; } + +.wp-block-embed figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.blocks-gallery-caption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-image figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-pullquote { + border-top: 4px solid #555d66; + border-bottom: 4px solid #555d66; + margin-bottom: 28px; + color: #40464d; } + .wp-block-pullquote cite, + .wp-block-pullquote footer, .wp-block-pullquote__citation { + color: #40464d; + text-transform: uppercase; + font-size: 13px; + font-style: normal; } + +.wp-block-navigation ul, +.wp-block-navigation ul li { + list-style: none; } + +.wp-block-quote { + border-left: 4px solid #000; + margin: 0 0 28px 0; + padding-left: 1em; } + .wp-block-quote cite, + .wp-block-quote footer, .wp-block-quote__citation { + color: #6c7781; + font-size: 13px; + margin-top: 1em; + position: relative; + font-style: normal; } + .wp-block-quote.has-text-align-right, .wp-block-quote.has-text-align-right { + border-left: none; + border-right: 4px solid #000; + padding-left: 0; + padding-right: 1em; } + .wp-block-quote.has-text-align-center, .wp-block-quote.has-text-align-center { + border: none; + padding-left: 0; } + .wp-block-quote.is-style-large, .wp-block-quote.is-large { + border: none; } + +.wp-block-search .wp-block-search__label { + font-weight: bold; } + +.wp-block-group.has-background { + padding: 20px 30px; + margin-top: 0; + margin-bottom: 0; } + +.wp-block-separator { + border: none; + border-bottom: 2px solid #8f98a1; + margin-left: auto; + margin-right: auto; } + .wp-block-separator:not(.is-style-wide):not(.is-style-dots) { + max-width: 100px; } + .wp-block-separator.has-background:not(.is-style-dots) { + border-bottom: none; + height: 1px; } + .wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots) { + height: 2px; } + +.wp-block-table { + border-collapse: collapse; } + .wp-block-table thead { + border-bottom: 3px solid; } + .wp-block-table tfoot { + border-top: 3px solid; } + .wp-block-table td, + .wp-block-table th { + padding: 0.5em; + border: 1px solid; + word-break: normal; } + .wp-block-table figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } + +.wp-block-video figcaption { + color: #555d66; + font-size: 13px; + text-align: center; } diff --git a/wp-includes/css/dist/block-library/theme.min.css b/wp-includes/css/dist/block-library/theme.min.css new file mode 100644 index 0000000..ae92047 --- /dev/null +++ b/wp-includes/css/dist/block-library/theme.min.css @@ -0,0 +1 @@ +.wp-block-audio figcaption{color:#555d66;font-size:13px;text-align:center}.wp-block-code{font-family:Menlo,Consolas,monaco,monospace;font-size:14px;color:#23282d;padding:.8em 1em;border:1px solid #e2e4e7;border-radius:4px}.blocks-gallery-caption,.wp-block-embed figcaption,.wp-block-image figcaption{color:#555d66;font-size:13px;text-align:center}.wp-block-pullquote{border-top:4px solid #555d66;border-bottom:4px solid #555d66;margin-bottom:28px;color:#40464d}.wp-block-pullquote__citation,.wp-block-pullquote cite,.wp-block-pullquote footer{color:#40464d;text-transform:uppercase;font-size:13px;font-style:normal}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none}.wp-block-quote{border-left:4px solid #000;margin:0 0 28px;padding-left:1em}.wp-block-quote__citation,.wp-block-quote cite,.wp-block-quote footer{color:#6c7781;font-size:13px;margin-top:1em;position:relative;font-style:normal}.wp-block-quote.has-text-align-right{border-left:none;border-right:4px solid #000;padding-left:0;padding-right:1em}.wp-block-quote.has-text-align-center{border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-group.has-background{padding:20px 30px;margin-top:0;margin-bottom:0}.wp-block-separator{border:none;border-bottom:2px solid #8f98a1;margin-left:auto;margin-right:auto}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){max-width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{border-collapse:collapse}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{padding:.5em;border:1px solid;word-break:normal}.wp-block-table figcaption,.wp-block-video figcaption{color:#555d66;font-size:13px;text-align:center} \ No newline at end of file diff --git a/wp-includes/css/dist/components/style-rtl.css b/wp-includes/css/dist/components/style-rtl.css new file mode 100644 index 0000000..30dcd31 --- /dev/null +++ b/wp-includes/css/dist/components/style-rtl.css @@ -0,0 +1,3981 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.components-animate__appear { + animation: components-animate__appear-animation 0.1s cubic-bezier(0, 0, 0.2, 1) 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-animate__appear { + animation-duration: 1ms; } } + .components-animate__appear.is-from-top, .components-animate__appear.is-from-top.is-from-left { + transform-origin: top right; } + .components-animate__appear.is-from-top.is-from-right { + transform-origin: top left; } + .components-animate__appear.is-from-bottom, .components-animate__appear.is-from-bottom.is-from-left { + transform-origin: bottom right; } + .components-animate__appear.is-from-bottom.is-from-right { + transform-origin: bottom left; } + +@keyframes components-animate__appear-animation { + from { + transform: translateY(-2em) scaleY(0) scaleX(0); } + to { + transform: translateY(0%) scaleY(1) scaleX(1); } } + +.components-animate__slide-in { + animation: components-animate__slide-in-animation 0.1s cubic-bezier(0, 0, 0.2, 1); + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-animate__slide-in { + animation-duration: 1ms; } } + .components-animate__slide-in.is-from-left { + transform: translateX(-100%); } + +@keyframes components-animate__slide-in-animation { + 100% { + transform: translateX(0%); } } + +.components-animate__loading { + animation: components-animate__loading 1.6s ease-in-out infinite; } + +@keyframes components-animate__loading { + 0% { + opacity: 0.5; } + 50% { + opacity: 1; } + 100% { + opacity: 0.5; } } + +.components-angle-picker-control { + width: 50%; } + .components-angle-picker-control.components-base-control .components-base-control__label { + display: block; } + +.components-angle-picker-control__input-field { + width: calc(100% - 36px); + max-width: 100px; } + +.components-angle-picker-control__angle-circle { + width: 28px; + height: 28px; + border: 2px solid #555d66; + border-radius: 50%; + float: right; + margin-left: 4px; + cursor: grab; } + +.components-angle-picker-control__angle-circle-indicator-wrapper { + position: relative; + width: 100%; + height: 100%; } + +.components-angle-picker-control__angle-circle-indicator { + width: 1px; + height: 1px; + border-radius: 50%; + border: 3px solid #555d66; + display: block; + position: absolute; + top: -14px; + bottom: 0; + right: 0; + left: 0; + margin: auto; + background: #555d66; } + +.components-autocomplete__popover .components-popover__content { + min-width: 200px; } + +.components-autocomplete__popover .components-autocomplete__results { + padding: 3px; + display: flex; + flex-direction: column; + align-items: stretch; } + .components-autocomplete__popover .components-autocomplete__results:empty { + display: none; } + +.components-autocomplete__result.components-button { + margin-bottom: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + color: #555d66; + display: flex; + flex-direction: row; + flex-grow: 1; + flex-shrink: 0; + align-items: center; + padding: 6px 8px; + margin-right: -3px; + margin-left: -3px; + text-align: right; } + .components-autocomplete__result.components-button.is-selected { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + .components-autocomplete__result.components-button:hover { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; } + +.components-base-control { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; } + .components-base-control .components-base-control__field { + margin-bottom: 8px; } + .components-panel__row .components-base-control .components-base-control__field { + margin-bottom: inherit; } + .components-base-control .components-base-control__label { + display: inline-block; + margin-bottom: 4px; } + .components-base-control .components-base-control__help { + margin-top: -8px; + font-style: italic; } + +.components-base-control + .components-base-control { + margin-bottom: 16px; } + +.components-button-group { + display: inline-block; } + .components-button-group .components-button { + border-radius: 0; + display: inline-flex; } + .components-button-group .components-button + .components-button { + margin-right: -1px; } + .components-button-group .components-button:first-child { + border-radius: 0 3px 3px 0; } + .components-button-group .components-button:last-child { + border-radius: 3px 0 0 3px; } + .components-button-group .components-button:focus, .components-button-group .components-button.is-primary { + position: relative; + z-index: 1; } + .components-button-group .components-button.is-primary { + box-shadow: none; } + +.components-button { + display: inline-flex; + text-decoration: none; + font-size: 13px; + margin: 0; + border: 0; + cursor: pointer; + -webkit-appearance: none; + background: none; + transition: box-shadow 0.1s linear; + height: 36px; + align-items: center; + box-sizing: border-box; + padding: 0 8px; + overflow: hidden; + border-radius: 3px; + color: #555d66; + /* Buttons that look like links, for a cross of good semantics with the visual */ + /* Link buttons that are red to indicate destructive behavior. */ } + @media (prefers-reduced-motion: reduce) { + .components-button { + transition-duration: 0s; } } + .components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-primary):not(.is-tertiary):not(.is-link):hover { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; } + .components-button.is-secondary { + border-width: 1px; + border-style: solid; + white-space: nowrap; + color: rgb(0, 117, 175); + border-color: rgb(0, 117, 175); + background: #f3f5f6; } + body.admin-color-sunrise .components-button.is-secondary { + color: rgb(196, 126, 70); + border-color: rgb(196, 126, 70); } + body.admin-color-ocean .components-button.is-secondary { + color: rgb(153, 174, 152); + border-color: rgb(153, 174, 152); } + body.admin-color-midnight .components-button.is-secondary { + color: rgb(212, 72, 63); + border-color: rgb(212, 72, 63); } + body.admin-color-ectoplasm .components-button.is-secondary { + color: rgb(157, 171, 81); + border-color: rgb(157, 171, 81); } + body.admin-color-coffee .components-button.is-secondary { + color: rgb(182, 156, 132); + border-color: rgb(182, 156, 132); } + body.admin-color-blue .components-button.is-secondary { + color: rgb(204, 161, 84); + border-color: rgb(204, 161, 84); } + body.admin-color-light .components-button.is-secondary { + color: rgb(0, 125, 175); + border-color: rgb(0, 125, 175); } + .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + background: #f1f1f1; + border-color: rgb(0, 93, 140); + color: rgb(0, 93, 140); + text-decoration: none; } + body.admin-color-sunrise .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(157, 101, 56); + color: rgb(157, 101, 56); } + body.admin-color-ocean .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(122, 139, 122); + color: rgb(122, 139, 122); } + body.admin-color-midnight .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(169, 58, 50); + color: rgb(169, 58, 50); } + body.admin-color-ectoplasm .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(125, 137, 65); + color: rgb(125, 137, 65); } + body.admin-color-coffee .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(146, 125, 105); + color: rgb(146, 125, 105); } + body.admin-color-blue .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(163, 128, 67); + color: rgb(163, 128, 67); } + body.admin-color-light .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(0, 100, 140); + color: rgb(0, 100, 140); } + .components-button.is-secondary:focus:enabled { + background: #f3f5f6; + color: rgb(0, 93, 140); + border-color: rgb(0, 118, 177); + box-shadow: 0 0 0 1px rgb(0, 118, 177); + text-decoration: none; } + body.admin-color-sunrise .components-button.is-secondary:focus:enabled { + color: rgb(157, 101, 56); + border-color: rgb(199, 127, 70); + box-shadow: 0 0 0 1px rgb(199, 127, 70); } + body.admin-color-ocean .components-button.is-secondary:focus:enabled { + color: rgb(122, 139, 122); + border-color: rgb(155, 176, 154); + box-shadow: 0 0 0 1px rgb(155, 176, 154); } + body.admin-color-midnight .components-button.is-secondary:focus:enabled { + color: rgb(169, 58, 50); + border-color: rgb(214, 73, 64); + box-shadow: 0 0 0 1px rgb(214, 73, 64); } + body.admin-color-ectoplasm .components-button.is-secondary:focus:enabled { + color: rgb(125, 137, 65); + border-color: rgb(159, 173, 82); + box-shadow: 0 0 0 1px rgb(159, 173, 82); } + body.admin-color-coffee .components-button.is-secondary:focus:enabled { + color: rgb(146, 125, 105); + border-color: rgb(184, 158, 133); + box-shadow: 0 0 0 1px rgb(184, 158, 133); } + body.admin-color-blue .components-button.is-secondary:focus:enabled { + color: rgb(163, 128, 67); + border-color: rgb(206, 162, 85); + box-shadow: 0 0 0 1px rgb(206, 162, 85); } + body.admin-color-light .components-button.is-secondary:focus:enabled { + color: rgb(0, 100, 140); + border-color: rgb(0, 126, 177); + box-shadow: 0 0 0 1px rgb(0, 126, 177); } + .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + background: #f3f5f6; + color: rgb(0, 118, 177); + border-color: #7e8993; + box-shadow: none; } + body.admin-color-sunrise .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(199, 127, 70); } + body.admin-color-ocean .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(155, 176, 154); } + body.admin-color-midnight .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(214, 73, 64); } + body.admin-color-ectoplasm .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(159, 173, 82); } + body.admin-color-coffee .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(184, 158, 133); } + body.admin-color-blue .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(206, 162, 85); } + body.admin-color-light .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(0, 126, 177); } + .components-button.is-secondary:disabled, .components-button.is-secondary[aria-disabled="true"] { + color: #a0a5aa; + border-color: #ddd; + background: #f7f7f7; + text-shadow: 0 1px 0 #fff; + transform: none; + opacity: 1; } + .components-button.is-primary { + border-width: 1px; + border-style: solid; + white-space: nowrap; + background: rgb(0, 124, 186); + border-color: rgb(0, 124, 186); + color: #fff; + text-decoration: none; + text-shadow: none; } + body.admin-color-sunrise .components-button.is-primary { + background: rgb(209, 134, 74); + border-color: rgb(209, 134, 74); } + body.admin-color-ocean .components-button.is-primary { + background: rgb(163, 185, 162); + border-color: rgb(163, 185, 162); } + body.admin-color-midnight .components-button.is-primary { + background: rgb(225, 77, 67); + border-color: rgb(225, 77, 67); } + body.admin-color-ectoplasm .components-button.is-primary { + background: rgb(167, 182, 86); + border-color: rgb(167, 182, 86); } + body.admin-color-coffee .components-button.is-primary { + background: rgb(194, 166, 140); + border-color: rgb(194, 166, 140); } + body.admin-color-blue .components-button.is-primary { + background: rgb(217, 171, 89); + border-color: rgb(217, 171, 89); } + body.admin-color-light .components-button.is-primary { + background: rgb(0, 133, 186); + border-color: rgb(0, 133, 186); } + .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, .components-button.is-primary:focus:enabled { + background: rgb(0, 112, 167); + border-color: rgb(0, 112, 167); + color: #fff; } + body.admin-color-sunrise .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-sunrise .components-button.is-primary:focus:enabled { + background: rgb(188, 121, 67); + border-color: rgb(188, 121, 67); } + body.admin-color-ocean .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-ocean .components-button.is-primary:focus:enabled { + background: rgb(147, 167, 146); + border-color: rgb(147, 167, 146); } + body.admin-color-midnight .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-midnight .components-button.is-primary:focus:enabled { + background: rgb(203, 69, 60); + border-color: rgb(203, 69, 60); } + body.admin-color-ectoplasm .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-ectoplasm .components-button.is-primary:focus:enabled { + background: rgb(150, 164, 77); + border-color: rgb(150, 164, 77); } + body.admin-color-coffee .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-coffee .components-button.is-primary:focus:enabled { + background: rgb(175, 149, 126); + border-color: rgb(175, 149, 126); } + body.admin-color-blue .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-blue .components-button.is-primary:focus:enabled { + background: rgb(195, 154, 80); + border-color: rgb(195, 154, 80); } + body.admin-color-light .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-light .components-button.is-primary:focus:enabled { + background: rgb(0, 120, 167); + border-color: rgb(0, 120, 167); } + .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(0, 124, 186); } + body.admin-color-sunrise .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(209, 134, 74); } + body.admin-color-ocean .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(163, 185, 162); } + body.admin-color-midnight .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(225, 77, 67); } + body.admin-color-ectoplasm .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(167, 182, 86); } + body.admin-color-coffee .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(194, 166, 140); } + body.admin-color-blue .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(217, 171, 89); } + body.admin-color-light .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(0, 133, 186); } + .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(0, 99, 149); + border-color: rgb(0, 99, 149); + color: #fff; } + body.admin-color-sunrise .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(167, 107, 59); + border-color: rgb(167, 107, 59); } + body.admin-color-ocean .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(130, 148, 130); + border-color: rgb(130, 148, 130); } + body.admin-color-midnight .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(180, 62, 54); + border-color: rgb(180, 62, 54); } + body.admin-color-ectoplasm .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(134, 146, 69); + border-color: rgb(134, 146, 69); } + body.admin-color-coffee .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(155, 133, 112); + border-color: rgb(155, 133, 112); } + body.admin-color-blue .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(174, 137, 71); + border-color: rgb(174, 137, 71); } + body.admin-color-light .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(0, 106, 149); + border-color: rgb(0, 106, 149); } + .components-button.is-primary:disabled, .components-button.is-primary:disabled:active:enabled, .components-button.is-primary[aria-disabled="true"], .components-button.is-primary[aria-disabled="true"]:enabled, .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(102, 176, 214); + background: rgb(25, 137, 193); + border-color: rgb(25, 137, 193); + opacity: 1; } + body.admin-color-sunrise .components-button.is-primary:disabled, body.admin-color-sunrise .components-button.is-primary:disabled:active:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"], body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(227, 182, 146); + background: rgb(214, 146, 92); + border-color: rgb(214, 146, 92); } + body.admin-color-ocean .components-button.is-primary:disabled, body.admin-color-ocean .components-button.is-primary:disabled:active:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"], body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(200, 213, 199); + background: rgb(172, 192, 171); + border-color: rgb(172, 192, 171); } + body.admin-color-midnight .components-button.is-primary:disabled, body.admin-color-midnight .components-button.is-primary:disabled:active:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"], body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(237, 148, 142); + background: rgb(228, 95, 86); + border-color: rgb(228, 95, 86); } + body.admin-color-ectoplasm .components-button.is-primary:disabled, body.admin-color-ectoplasm .components-button.is-primary:disabled:active:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"], body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(202, 211, 154); + background: rgb(176, 189, 103); + border-color: rgb(176, 189, 103); } + body.admin-color-coffee .components-button.is-primary:disabled, body.admin-color-coffee .components-button.is-primary:disabled:active:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"], body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(218, 202, 186); + background: rgb(200, 175, 152); + border-color: rgb(200, 175, 152); } + body.admin-color-blue .components-button.is-primary:disabled, body.admin-color-blue .components-button.is-primary:disabled:active:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"], body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(232, 205, 155); + background: rgb(221, 179, 106); + border-color: rgb(221, 179, 106); } + body.admin-color-light .components-button.is-primary:disabled, body.admin-color-light .components-button.is-primary:disabled:active:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"], body.admin-color-light .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(102, 182, 214); + background: rgb(25, 145, 193); + border-color: rgb(25, 145, 193); } + .components-button.is-primary:disabled:focus:enabled, .components-button.is-primary:disabled:active:enabled:focus:enabled, .components-button.is-primary[aria-disabled="true"]:focus:enabled, .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(0, 124, 186); } + body.admin-color-sunrise .components-button.is-primary:disabled:focus:enabled, body.admin-color-sunrise .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(209, 134, 74); } + body.admin-color-ocean .components-button.is-primary:disabled:focus:enabled, body.admin-color-ocean .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(163, 185, 162); } + body.admin-color-midnight .components-button.is-primary:disabled:focus:enabled, body.admin-color-midnight .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(225, 77, 67); } + body.admin-color-ectoplasm .components-button.is-primary:disabled:focus:enabled, body.admin-color-ectoplasm .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(167, 182, 86); } + body.admin-color-coffee .components-button.is-primary:disabled:focus:enabled, body.admin-color-coffee .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(194, 166, 140); } + body.admin-color-blue .components-button.is-primary:disabled:focus:enabled, body.admin-color-blue .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(217, 171, 89); } + body.admin-color-light .components-button.is-primary:disabled:focus:enabled, body.admin-color-light .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(0, 133, 186); } + .components-button.is-primary.is-busy, .components-button.is-primary.is-busy:disabled, .components-button.is-primary.is-busy[aria-disabled="true"] { + color: #fff; + background-size: 100px 100%; + /* stylelint-disable */ + background-image: linear-gradient(45deg, #007cba 28%, rgb(0, 99, 149) 28%, rgb(0, 99, 149) 72%, #007cba 72%); + /* stylelint-enable */ + border-color: rgb(0, 124, 186); } + body.admin-color-sunrise .components-button.is-primary.is-busy, body.admin-color-sunrise .components-button.is-primary.is-busy:disabled, body.admin-color-sunrise .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(45deg, #d1864a 28%, rgb(167, 107, 59) 28%, rgb(167, 107, 59) 72%, #d1864a 72%); + border-color: rgb(209, 134, 74); } + body.admin-color-ocean .components-button.is-primary.is-busy, body.admin-color-ocean .components-button.is-primary.is-busy:disabled, body.admin-color-ocean .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(45deg, #a3b9a2 28%, rgb(130, 148, 130) 28%, rgb(130, 148, 130) 72%, #a3b9a2 72%); + border-color: rgb(163, 185, 162); } + body.admin-color-midnight .components-button.is-primary.is-busy, body.admin-color-midnight .components-button.is-primary.is-busy:disabled, body.admin-color-midnight .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(45deg, #e14d43 28%, rgb(180, 62, 54) 28%, rgb(180, 62, 54) 72%, #e14d43 72%); + border-color: rgb(225, 77, 67); } + body.admin-color-ectoplasm .components-button.is-primary.is-busy, body.admin-color-ectoplasm .components-button.is-primary.is-busy:disabled, body.admin-color-ectoplasm .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(45deg, #a7b656 28%, rgb(134, 146, 69) 28%, rgb(134, 146, 69) 72%, #a7b656 72%); + border-color: rgb(167, 182, 86); } + body.admin-color-coffee .components-button.is-primary.is-busy, body.admin-color-coffee .components-button.is-primary.is-busy:disabled, body.admin-color-coffee .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(45deg, #c2a68c 28%, rgb(155, 133, 112) 28%, rgb(155, 133, 112) 72%, #c2a68c 72%); + border-color: rgb(194, 166, 140); } + body.admin-color-blue .components-button.is-primary.is-busy, body.admin-color-blue .components-button.is-primary.is-busy:disabled, body.admin-color-blue .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(45deg, #d9ab59 28%, rgb(174, 137, 71) 28%, rgb(174, 137, 71) 72%, #d9ab59 72%); + border-color: rgb(217, 171, 89); } + body.admin-color-light .components-button.is-primary.is-busy, body.admin-color-light .components-button.is-primary.is-busy:disabled, body.admin-color-light .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(45deg, #0085ba 28%, rgb(0, 106, 149) 28%, rgb(0, 106, 149) 72%, #0085ba 72%); + border-color: rgb(0, 133, 186); } + .components-button.is-link { + margin: 0; + padding: 0; + box-shadow: none; + border: 0; + border-radius: 0; + background: none; + outline: none; + text-align: right; + /* Mimics the default link style in common.css */ + color: #0073aa; + text-decoration: underline; + transition-property: border, background, color; + transition-duration: 0.05s; + transition-timing-function: ease-in-out; + height: auto; } + @media (prefers-reduced-motion: reduce) { + .components-button.is-link { + transition-duration: 0s; } } + .components-button.is-link:not(:disabled):not([aria-disabled="true"]):hover, .components-button.is-link:not([aria-disabled="true"]):active { + color: #00a0d2; } + .components-button.is-link:focus { + color: #124964; + box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, 0.8); } + .components-button.is-link.is-destructive { + color: #d94f4f; } + .components-button:not([aria-disabled="true"]):active { + color: inherit; } + .components-button:disabled, .components-button[aria-disabled="true"] { + cursor: default; + opacity: 0.3; } + .components-button:focus:not(:disabled) { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + .components-button.is-busy, .components-button.is-secondary.is-busy, .components-button.is-secondary.is-busy:disabled, .components-button.is-secondary.is-busy[aria-disabled="true"] { + animation: components-button__busy-animation 2500ms infinite linear; + background-size: 100px 100%; + background-image: repeating-linear-gradient(45deg, #e2e4e7, #fff 11px, #fff 10px, #e2e4e7 20px); + opacity: 1; } + .components-button.is-small { + height: 24px; + line-height: 22px; + padding: 0 8px; + font-size: 11px; } + .components-button.is-tertiary { + color: #007cba; } + body.admin-color-sunrise .components-button.is-tertiary { + color: #837425; } + body.admin-color-ocean .components-button.is-tertiary { + color: #5e7d5e; } + body.admin-color-midnight .components-button.is-tertiary { + color: #497b8d; } + body.admin-color-ectoplasm .components-button.is-tertiary { + color: #523f6d; } + body.admin-color-coffee .components-button.is-tertiary { + color: #59524c; } + body.admin-color-blue .components-button.is-tertiary { + color: #417e9B; } + body.admin-color-light .components-button.is-tertiary { + color: #007cba; } + .components-button.is-tertiary .dashicon { + display: inline-block; + flex: 0 0 auto; } + .components-button.is-tertiary:not([aria-disabled="true"]):active:focus:enabled { + box-shadow: none; } + .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(0, 93, 140); } + body.admin-color-sunrise .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(98, 87, 28); } + body.admin-color-ocean .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(71, 94, 71); } + body.admin-color-midnight .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(55, 92, 106); } + body.admin-color-ectoplasm .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(62, 47, 82); } + body.admin-color-coffee .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(67, 62, 57); } + body.admin-color-blue .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(49, 95, 116); } + body.admin-color-light .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(0, 93, 140); } + .components-button.has-icon .dashicon { + display: inline-block; + flex: 0 0 auto; } + .components-button.has-icon.has-text svg { + margin-left: 8px; } + .components-button svg { + fill: currentColor; + outline: none; } + .components-button .screen-reader-text { + height: auto; } + +@keyframes components-button__busy-animation { + 0% { + background-position: 200px 0; } } + +.components-checkbox-control__input[type="checkbox"] { + border: 1px solid #b4b9be; + background: #fff; + color: #555; + clear: none; + cursor: pointer; + display: inline-block; + line-height: 0; + margin: 0 0 0 4px; + outline: 0; + padding: 0 !important; + text-align: center; + vertical-align: top; + width: 25px; + height: 25px; + -webkit-appearance: none; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + transition: 0.05s border-color ease-in-out; } + @media (min-width: 600px) { + .components-checkbox-control__input[type="checkbox"] { + height: 16px; + width: 16px; } } + .components-checkbox-control__input[type="checkbox"]:focus { + border-color: #5b9dd9; + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); + outline: 2px solid transparent; } + .components-checkbox-control__input[type="checkbox"]:checked { + background: #11a0d2; + border-color: #11a0d2; } + .components-checkbox-control__input[type="checkbox"]:checked::-ms-check { + opacity: 0; } + .components-checkbox-control__input[type="checkbox"]:focus:checked { + border: none; } + .components-checkbox-control__input[type="checkbox"]:checked::before { + content: none; } + +.components-checkbox-control__input-container { + position: relative; + display: inline-block; + margin-left: 12px; + vertical-align: middle; + width: 25px; + height: 25px; } + @media (min-width: 600px) { + .components-checkbox-control__input-container { + width: 16px; + height: 16px; } } + +svg.components-checkbox-control__checked { + fill: #fff; + cursor: pointer; + position: absolute; + right: -4px; + top: -2px; + width: 31px; + height: 31px; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; } + @media (min-width: 600px) { + svg.components-checkbox-control__checked { + width: 21px; + height: 21px; + right: -3px; } } + +.components-circular-option-picker { + display: inline-block; + margin-top: 0.6rem; + width: 100%; } + .components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper { + display: flex; + justify-content: flex-end; } + +.components-circular-option-picker__option-wrapper { + display: inline-block; + height: 28px; + width: 28px; + margin-left: 12px; + margin-bottom: 12px; + vertical-align: top; + transform: scale(1); + transition: 100ms transform ease; } + @media (prefers-reduced-motion: reduce) { + .components-circular-option-picker__option-wrapper { + transition-duration: 0s; } } + .components-circular-option-picker__option-wrapper:hover { + transform: scale(1.2); } + .components-circular-option-picker__option-wrapper > div { + height: 100%; + width: 100%; } + +.components-circular-option-picker__option-wrapper::before { + content: ""; + position: absolute; + top: 1px; + right: 1px; + bottom: 1px; + left: 1px; + border-radius: 50%; + z-index: -1; + /* stylelint-disable-next-line function-url-quotes */ + background: url('data:image/svg+xml,%3Csvg width="28" height="28" fill="none" xmlns="http://www.w3.org/2000/svg"%3E%3Cpath d="M6 8V6H4v2h2zM8 8V6h2v2H8zM10 16H8v-2h2v2zM12 16v-2h2v2h-2zM12 18v-2h-2v2H8v2h2v-2h2zM14 18v2h-2v-2h2zM16 18h-2v-2h2v2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2v2zm-2-4v-2h2v2h-2z" fill="%23555D65"/%3E%3Cpath d="M18 18v2h-2v-2h2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2H8zm0 2v-2H6v2h2zm2 0v-2h2v2h-2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2h-2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4V0zm0 4V2H2v2h2zm2 0V2h2v2H6zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2H6z" fill="%23555D65"/%3E%3C/svg%3E'); } + +.components-circular-option-picker__option { + display: inline-block; + vertical-align: top; + height: 100%; + width: 100%; + border: none; + border-radius: 50%; + background: transparent; + box-shadow: inset 0 0 0 14px; + transition: 100ms box-shadow ease; + cursor: pointer; } + @media (prefers-reduced-motion: reduce) { + .components-circular-option-picker__option { + transition-duration: 0s; } } + .components-circular-option-picker__option:hover { + box-shadow: inset 0 0 0 14px !important; } + .components-circular-option-picker__option.is-pressed { + box-shadow: inset 0 0 0 4px; + position: relative; + z-index: 1; } + .components-circular-option-picker__option.is-pressed + svg { + position: absolute; + right: 2px; + top: 2px; + border-radius: 50%; + z-index: 2; + background: #fff; + pointer-events: none; } + .components-circular-option-picker__option::after { + content: ""; + position: absolute; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; + border-radius: 50%; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); + border: 1px solid transparent; } + .components-circular-option-picker__option:focus::after { + content: ""; + border: 2px solid #606a73; + width: 32px; + height: 32px; + position: absolute; + top: -2px; + right: -2px; + border-radius: 50%; + box-shadow: inset 0 0 0 2px #fff; } + .components-circular-option-picker__option.components-button:focus { + background-color: transparent; + box-shadow: inset 0 0 0 14px; + outline: none; } + +.components-circular-option-picker__button-action .components-circular-option-picker__option { + color: #fff; + background: #fff; } + +.components-circular-option-picker__dropdown-link-action { + margin-left: 16px; } + .components-circular-option-picker__dropdown-link-action .components-button { + line-height: 22px; } + +.component-color-indicator { + width: 25px; + height: 16px; + margin-right: 0.8rem; + border: 1px solid #dadada; + display: inline-block; } + .component-color-indicator + .component-color-indicator { + margin-right: 0.5rem; } + +/** + * Parts of this source were derived and modified from react-color, + * released under the MIT license. + * + * https://github.com/casesandberg/react-color/ + * + * Copyright (c) 2015 Case Sandberg + * + * 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. + */ +.components-color-picker { + width: 100%; + overflow: hidden; } + .components-color-picker * { + box-sizing: border-box; } + +.components-color-picker__saturation { + width: 100%; + padding-bottom: 55%; + position: relative; } + +.components-color-picker__body { + padding: 16px 16px 12px; } + +.components-color-picker__controls { + display: flex; } + +.components-color-picker__saturation-pointer, +.components-color-picker__hue-pointer, +.components-color-picker__alpha-pointer { + padding: 0; + position: absolute; + cursor: pointer; + box-shadow: none; + border: none; } + +/* CURRENT COLOR COMPONENT */ +.components-color-picker__swatch { + margin-left: 8px; + width: 32px; + height: 32px; + border-radius: 50%; + position: relative; + overflow: hidden; + background-image: linear-gradient(-45deg, #ddd 25%, transparent 25%), linear-gradient(45deg, #ddd 25%, transparent 25%), linear-gradient(-45deg, transparent 75%, #ddd 75%), linear-gradient(45deg, transparent 75%, #ddd 75%); + background-size: 10px 10px; + background-position: 100% 0, 100% 5px, 5px -5px, -5px 0; } + .is-alpha-disabled .components-color-picker__swatch { + width: 12px; + height: 12px; + margin-top: 0; } + +.components-color-picker__active { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + border-radius: 50%; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + z-index: 2; } + +/* SATURATION COMPONENT */ +.components-color-picker__saturation-color, +.components-color-picker__saturation-white, +.components-color-picker__saturation-black { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; } + +.components-color-picker__saturation-color { + overflow: hidden; } + +.components-color-picker__saturation-white { + background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0)); } + +.components-color-picker__saturation-black { + background: linear-gradient(to top, #000, rgba(0, 0, 0, 0)); } + +.components-color-picker__saturation-pointer { + width: 14px; + height: 14px; + padding: 0; + box-shadow: 0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 1px 2px rgba(0, 0, 0, 0.4); + border-radius: 50%; + background-color: transparent; + transform: translate(4px, -4px); } + +/* HUE & ALPHA BARS */ +.components-color-picker__toggles { + flex: 1; } + +.components-color-picker__alpha { + background-image: linear-gradient(-45deg, #ddd 25%, transparent 25%), linear-gradient(45deg, #ddd 25%, transparent 25%), linear-gradient(-45deg, transparent 75%, #ddd 75%), linear-gradient(45deg, transparent 75%, #ddd 75%); + background-size: 10px 10px; + background-position: 100% 0, 100% 5px, 5px -5px, -5px 0; } + +.components-color-picker__hue-gradient, +.components-color-picker__alpha-gradient { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; } + +.components-color-picker__hue, +.components-color-picker__alpha { + height: 12px; + position: relative; } + +.is-alpha-enabled .components-color-picker__hue { + margin-bottom: 8px; } + +.components-color-picker__hue-bar, +.components-color-picker__alpha-bar { + position: relative; + margin: 0 3px; + height: 100%; + padding: 0 2px; } + +.components-color-picker__hue-gradient { + background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%); } + +.components-color-picker__hue-pointer, +.components-color-picker__alpha-pointer { + left: 0; + width: 14px; + height: 14px; + border-radius: 50%; + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37); + background: #fff; + transform: translate(7px, -1px); } + +.components-color-picker__hue-pointer, +.components-color-picker__saturation-pointer { + transition: box-shadow 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .components-color-picker__hue-pointer, + .components-color-picker__saturation-pointer { + transition-duration: 0s; } } + +.components-color-picker__saturation-pointer:focus { + box-shadow: 0 0 0 2px #fff, 0 0 0 4px #00a0d2, 0 0 5px 0 #00a0d2, inset 0 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 1px 2px rgba(0, 0, 0, 0.4); } + +.components-color-picker__hue-pointer:focus, +.components-color-picker__alpha-pointer:focus { + border-color: #00a0d2; + box-shadow: 0 0 0 2px #00a0d2, 0 0 3px 0 #00a0d2; + outline: 2px solid transparent; + outline-offset: -2px; } + +/* INPUTS COMPONENT */ +.components-color-picker__inputs-wrapper { + margin: 0 -4px; + padding-top: 16px; + display: flex; + align-items: flex-end; } + .components-color-picker__inputs-wrapper fieldset { + flex: 1; + border: none; + margin: 0; + padding: 0; } + .components-color-picker__inputs-wrapper .components-color-picker__inputs-fields .components-text-control__input[type="number"] { + padding: 6px 8px; } + +.components-color-picker__inputs-field { + width: 100%; } + +.components-color-picker__inputs-fields { + display: flex; + direction: ltr; + flex-grow: 1; + margin-left: 4px; } + .components-color-picker__inputs-fields .components-base-control + .components-base-control { + margin-bottom: 0; } + .components-color-picker__inputs-fields .components-base-control__field { + margin: 0 4px; } + +.components-color-picker__inputs-toggle { + height: 30px; + padding: 0 5px; } + +.components-custom-gradient-picker { + margin-top: 8px; } + +.components-custom-gradient-picker__gradient-bar:not(.has-gradient) { + opacity: 0.4; } + +.components-custom-gradient-picker__gradient-bar { + width: 100%; + height: 24px; + border-radius: 24px; + margin-bottom: 16px; + padding-right: 3px; + padding-left: 21px; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container { + position: relative; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point { + border-radius: 50%; + background: #fff; + padding: 2px; + min-width: 24px; + width: 24px; + height: 24px; + position: relative; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point svg { + height: 100%; + width: 100%; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button { + border: 2px solid #fff; + border-radius: 50%; + height: 18px; + padding: 0; + position: absolute; + width: 18px; + top: 3px; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active { + background: #fafafa; + color: #23282d; + border-color: #999; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007cba; } + +.components-custom-gradient-picker__color-picker-popover .components-custom-gradient-picker__remove-control-point { + margin-right: auto; + margin-left: auto; + display: block; + margin-bottom: 8px; } + +.components-custom-gradient-picker__inserter { + width: 100%; } + +.components-custom-gradient-picker__liner-gradient-indicator { + display: inline-block; + flex: 0 auto; + width: 20px; + height: 20px; } + +.components-custom-gradient-picker__ui-line { + display: flex; + justify-content: space-between; } + +.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-angle-picker, +.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-custom-gradient-picker__type-picker { + margin-bottom: 0; } + +.components-custom-gradient-picker .components-custom-gradient-picker__toolbar { + border: none; } + .components-custom-gradient-picker .components-custom-gradient-picker__toolbar > div + div { + margin-right: 1px; } + .components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed > svg { + background: #fff; + border: 1px solid #7e8993; + border-radius: 2px; } + +.components-custom-select-control { + color: #555d66; + position: relative; } + +.components-custom-select-control__label { + display: block; + margin-bottom: 5px; } + +.components-custom-select-control__button { + border: 1px solid #7e8993; + border-radius: 4px; + color: #555d66; + display: inline; + min-height: 30px; + min-width: 130px; + position: relative; + text-align: right; } + .components-custom-select-control__button:focus { + border-color: #00a0d2; } + .components-custom-select-control__button-icon { + height: 100%; + padding: 0 4px; + position: absolute; + left: 0; + top: 0; } + +.components-custom-select-control__menu { + background: #fff; + max-height: 400px; + min-width: 100%; + overflow: auto; + padding: 0; + position: absolute; + z-index: 1000000; } + +.components-custom-select-control__item { + align-items: center; + display: flex; + list-style-type: none; + padding: 10px 25px 10px 5px; } + .components-custom-select-control__item.is-highlighted { + background: #e2e4e7; } + .components-custom-select-control__item-icon { + margin-right: -20px; + margin-left: 0; } + +svg.dashicon { + fill: currentColor; + outline: none; } +.PresetDateRangePicker_panel { + padding: 0 22px 11px; } + +.PresetDateRangePicker_button { + position: relative; + height: 100%; + text-align: center; + background: 0 0; + border: 2px solid #00a699; + color: #00a699; + padding: 4px 12px; + margin-right: 8px; + font: inherit; + font-weight: 700; + line-height: normal; + overflow: visible; + box-sizing: border-box; + cursor: pointer; } + +.PresetDateRangePicker_button:active { + outline: 0; } + +.PresetDateRangePicker_button__selected { + color: #fff; + background: #00a699; } + +.SingleDatePickerInput { + display: inline-block; + background-color: #fff; } + +.SingleDatePickerInput__withBorder { + border-radius: 2px; + border: 1px solid #dbdbdb; } + +.SingleDatePickerInput__rtl { + direction: rtl; } + +.SingleDatePickerInput__disabled { + background-color: #f2f2f2; } + +.SingleDatePickerInput__block { + display: block; } + +.SingleDatePickerInput__showClearDate { + padding-right: 30px; } + +.SingleDatePickerInput_clearDate { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + padding: 10px; + margin: 0 10px 0 5px; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); } + +.SingleDatePickerInput_clearDate__default:focus, +.SingleDatePickerInput_clearDate__default:hover { + background: #dbdbdb; + border-radius: 50%; } + +.SingleDatePickerInput_clearDate__small { + padding: 6px; } + +.SingleDatePickerInput_clearDate__hide { + visibility: hidden; } + +.SingleDatePickerInput_clearDate_svg { + fill: #82888a; + height: 12px; + width: 15px; + vertical-align: middle; } + +.SingleDatePickerInput_clearDate_svg__small { + height: 9px; } + +.SingleDatePickerInput_calendarIcon { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + display: inline-block; + vertical-align: middle; + padding: 10px; + margin: 0 5px 0 10px; } + +.SingleDatePickerInput_calendarIcon_svg { + fill: #82888a; + height: 15px; + width: 14px; + vertical-align: middle; } + +.SingleDatePicker { + position: relative; + display: inline-block; } + +.SingleDatePicker__block { + display: block; } + +.SingleDatePicker_picker { + z-index: 1; + background-color: #fff; + position: absolute; } + +.SingleDatePicker_picker__rtl { + direction: rtl; } + +.SingleDatePicker_picker__directionLeft { + left: 0; } + +.SingleDatePicker_picker__directionRight { + right: 0; } + +.SingleDatePicker_picker__portal { + background-color: rgba(0, 0, 0, 0.3); + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; } + +.SingleDatePicker_picker__fullScreenPortal { + background-color: #fff; } + +.SingleDatePicker_closeButton { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + position: absolute; + top: 0; + right: 0; + padding: 15px; + z-index: 2; } + +.SingleDatePicker_closeButton:focus, +.SingleDatePicker_closeButton:hover { + color: #b0b3b4; + text-decoration: none; } + +.SingleDatePicker_closeButton_svg { + height: 15px; + width: 15px; + fill: #cacccd; } + +.DayPickerKeyboardShortcuts_buttonReset { + background: 0 0; + border: 0; + border-radius: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + cursor: pointer; + font-size: 14px; } + +.DayPickerKeyboardShortcuts_buttonReset:active { + outline: 0; } + +.DayPickerKeyboardShortcuts_show { + width: 22px; + position: absolute; + z-index: 2; } + +.DayPickerKeyboardShortcuts_show__bottomRight { + border-top: 26px solid transparent; + border-right: 33px solid #00a699; + bottom: 0; + right: 0; } + +.DayPickerKeyboardShortcuts_show__bottomRight:hover { + border-right: 33px solid #008489; } + +.DayPickerKeyboardShortcuts_show__topRight { + border-bottom: 26px solid transparent; + border-right: 33px solid #00a699; + top: 0; + right: 0; } + +.DayPickerKeyboardShortcuts_show__topRight:hover { + border-right: 33px solid #008489; } + +.DayPickerKeyboardShortcuts_show__topLeft { + border-bottom: 26px solid transparent; + border-left: 33px solid #00a699; + top: 0; + left: 0; } + +.DayPickerKeyboardShortcuts_show__topLeft:hover { + border-left: 33px solid #008489; } + +.DayPickerKeyboardShortcuts_showSpan { + color: #fff; + position: absolute; } + +.DayPickerKeyboardShortcuts_showSpan__bottomRight { + bottom: 0; + right: -28px; } + +.DayPickerKeyboardShortcuts_showSpan__topRight { + top: 1px; + right: -28px; } + +.DayPickerKeyboardShortcuts_showSpan__topLeft { + top: 1px; + left: -28px; } + +.DayPickerKeyboardShortcuts_panel { + overflow: auto; + background: #fff; + border: 1px solid #dbdbdb; + border-radius: 2px; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 0; + z-index: 2; + padding: 22px; + margin: 33px; } + +.DayPickerKeyboardShortcuts_title { + font-size: 16px; + font-weight: 700; + margin: 0; } + +.DayPickerKeyboardShortcuts_list { + list-style: none; + padding: 0; + font-size: 14px; } + +.DayPickerKeyboardShortcuts_close { + position: absolute; + right: 22px; + top: 22px; + z-index: 2; } + +.DayPickerKeyboardShortcuts_close:active { + outline: 0; } + +.DayPickerKeyboardShortcuts_closeSvg { + height: 15px; + width: 15px; + fill: #cacccd; } + +.DayPickerKeyboardShortcuts_closeSvg:focus, +.DayPickerKeyboardShortcuts_closeSvg:hover { + fill: #82888a; } + +.CalendarDay { + box-sizing: border-box; + cursor: pointer; + font-size: 14px; + text-align: center; } + +.CalendarDay:active { + outline: 0; } + +.CalendarDay__defaultCursor { + cursor: default; } + +.CalendarDay__default { + border: 1px solid #e4e7e7; + color: #484848; + background: #fff; } + +.CalendarDay__default:hover { + background: #e4e7e7; + border: 1px double #e4e7e7; + color: inherit; } + +.CalendarDay__hovered_offset { + background: #f4f5f5; + border: 1px double #e4e7e7; + color: inherit; } + +.CalendarDay__outside { + border: 0; + background: #fff; + color: #484848; } + +.CalendarDay__outside:hover { + border: 0; } + +.CalendarDay__blocked_minimum_nights { + background: #fff; + border: 1px solid #eceeee; + color: #cacccd; } + +.CalendarDay__blocked_minimum_nights:active, +.CalendarDay__blocked_minimum_nights:hover { + background: #fff; + color: #cacccd; } + +.CalendarDay__highlighted_calendar { + background: #ffe8bc; + color: #484848; } + +.CalendarDay__highlighted_calendar:active, +.CalendarDay__highlighted_calendar:hover { + background: #ffce71; + color: #484848; } + +.CalendarDay__selected_span { + background: #66e2da; + border: 1px solid #33dacd; + color: #fff; } + +.CalendarDay__selected_span:active, +.CalendarDay__selected_span:hover { + background: #33dacd; + border: 1px solid #33dacd; + color: #fff; } + +.CalendarDay__last_in_range { + border-right: #00a699; } + +.CalendarDay__selected, +.CalendarDay__selected:active, +.CalendarDay__selected:hover { + background: #00a699; + border: 1px solid #00a699; + color: #fff; } + +.CalendarDay__hovered_span, +.CalendarDay__hovered_span:hover { + background: #b2f1ec; + border: 1px solid #80e8e0; + color: #007a87; } + +.CalendarDay__hovered_span:active { + background: #80e8e0; + border: 1px solid #80e8e0; + color: #007a87; } + +.CalendarDay__blocked_calendar, +.CalendarDay__blocked_calendar:active, +.CalendarDay__blocked_calendar:hover { + background: #cacccd; + border: 1px solid #cacccd; + color: #82888a; } + +.CalendarDay__blocked_out_of_range, +.CalendarDay__blocked_out_of_range:active, +.CalendarDay__blocked_out_of_range:hover { + background: #fff; + border: 1px solid #e4e7e7; + color: #cacccd; } + +.CalendarMonth { + background: #fff; + text-align: center; + vertical-align: top; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.CalendarMonth_table { + border-collapse: collapse; + border-spacing: 0; } + +.CalendarMonth_verticalSpacing { + border-collapse: separate; } + +.CalendarMonth_caption { + color: #484848; + font-size: 18px; + text-align: center; + padding-top: 22px; + padding-bottom: 37px; + caption-side: initial; } + +.CalendarMonth_caption__verticalScrollable { + padding-top: 12px; + padding-bottom: 7px; } + +.CalendarMonthGrid { + background: #fff; + text-align: left; + z-index: 0; } + +.CalendarMonthGrid__animating { + z-index: 1; } + +.CalendarMonthGrid__horizontal { + position: absolute; + left: 9px; } + +.CalendarMonthGrid__vertical { + margin: 0 auto; } + +.CalendarMonthGrid__vertical_scrollable { + margin: 0 auto; + overflow-y: scroll; } + +.CalendarMonthGrid_month__horizontal { + display: inline-block; + vertical-align: top; + min-height: 100%; } + +.CalendarMonthGrid_month__hideForAnimation { + position: absolute; + z-index: -1; + opacity: 0; + pointer-events: none; } + +.CalendarMonthGrid_month__hidden { + visibility: hidden; } + +.DayPickerNavigation { + position: relative; + z-index: 2; } + +.DayPickerNavigation__horizontal { + height: 0; } + +.DayPickerNavigation__verticalDefault { + position: absolute; + width: 100%; + height: 52px; + bottom: 0; + left: 0; } + +.DayPickerNavigation__verticalScrollableDefault { + position: relative; } + +.DayPickerNavigation_button { + cursor: pointer; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + border: 0; + padding: 0; + margin: 0; } + +.DayPickerNavigation_button__default { + border: 1px solid #e4e7e7; + background-color: #fff; + color: #757575; } + +.DayPickerNavigation_button__default:focus, +.DayPickerNavigation_button__default:hover { + border: 1px solid #c4c4c4; } + +.DayPickerNavigation_button__default:active { + background: #f2f2f2; } + +.DayPickerNavigation_button__horizontalDefault { + position: absolute; + top: 18px; + line-height: .78; + border-radius: 3px; + padding: 6px 9px; } + +.DayPickerNavigation_leftButton__horizontalDefault { + left: 22px; } + +.DayPickerNavigation_rightButton__horizontalDefault { + right: 22px; } + +.DayPickerNavigation_button__verticalDefault { + padding: 5px; + background: #fff; + box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + position: relative; + display: inline-block; + height: 100%; + width: 50%; } + +.DayPickerNavigation_nextButton__verticalDefault { + border-left: 0; } + +.DayPickerNavigation_nextButton__verticalScrollableDefault { + width: 100%; } + +.DayPickerNavigation_svg__horizontal { + height: 19px; + width: 19px; + fill: #82888a; + display: block; } + +.DayPickerNavigation_svg__vertical { + height: 42px; + width: 42px; + fill: #484848; + display: block; } + +.DayPicker { + background: #fff; + position: relative; + text-align: left; } + +.DayPicker__horizontal { + background: #fff; } + +.DayPicker__verticalScrollable { + height: 100%; } + +.DayPicker__hidden { + visibility: hidden; } + +.DayPicker__withBorder { + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.07); + border-radius: 3px; } + +.DayPicker_portal__horizontal { + box-shadow: none; + position: absolute; + left: 50%; + top: 50%; } + +.DayPicker_portal__vertical { + position: initial; } + +.DayPicker_focusRegion { + outline: 0; } + +.DayPicker_calendarInfo__horizontal, +.DayPicker_wrapper__horizontal { + display: inline-block; + vertical-align: top; } + +.DayPicker_weekHeaders { + position: relative; } + +.DayPicker_weekHeaders__horizontal { + margin-left: 9px; } + +.DayPicker_weekHeader { + color: #757575; + position: absolute; + top: 62px; + z-index: 2; + text-align: left; } + +.DayPicker_weekHeader__vertical { + left: 50%; } + +.DayPicker_weekHeader__verticalScrollable { + top: 0; + display: table-row; + border-bottom: 1px solid #dbdbdb; + background: #fff; + margin-left: 0; + left: 0; + width: 100%; + text-align: center; } + +.DayPicker_weekHeader_ul { + list-style: none; + margin: 1px 0; + padding-left: 0; + padding-right: 0; + font-size: 14px; } + +.DayPicker_weekHeader_li { + display: inline-block; + text-align: center; } + +.DayPicker_transitionContainer { + position: relative; + overflow: hidden; + border-radius: 3px; } + +.DayPicker_transitionContainer__horizontal { + transition: height .2s ease-in-out; } + +.DayPicker_transitionContainer__vertical { + width: 100%; } + +.DayPicker_transitionContainer__verticalScrollable { + padding-top: 20px; + height: 100%; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 0; + overflow-y: scroll; } + +.DateInput { + margin: 0; + padding: 0; + background: #fff; + position: relative; + display: inline-block; + width: 130px; + vertical-align: middle; } + +.DateInput__small { + width: 97px; } + +.DateInput__block { + width: 100%; } + +.DateInput__disabled { + background: #f2f2f2; + color: #dbdbdb; } + +.DateInput_input { + font-weight: 200; + font-size: 19px; + line-height: 24px; + color: #484848; + background-color: #fff; + width: 100%; + padding: 11px 11px 9px; + border: 0; + border-top: 0; + border-right: 0; + border-bottom: 2px solid transparent; + border-left: 0; + border-radius: 0; } + +.DateInput_input__small { + font-size: 15px; + line-height: 18px; + letter-spacing: .2px; + padding: 7px 7px 5px; } + +.DateInput_input__regular { + font-weight: auto; } + +.DateInput_input__readOnly { + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.DateInput_input__focused { + outline: 0; + background: #fff; + border: 0; + border-top: 0; + border-right: 0; + border-bottom: 2px solid #008489; + border-left: 0; } + +.DateInput_input__disabled { + background: #f2f2f2; + font-style: italic; } + +.DateInput_screenReaderMessage { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.DateInput_fang { + position: absolute; + width: 20px; + height: 10px; + left: 22px; + z-index: 2; } + +.DateInput_fangShape { + fill: #fff; } + +.DateInput_fangStroke { + stroke: #dbdbdb; + fill: transparent; } + +.DateRangePickerInput { + background-color: #fff; + display: inline-block; } + +.DateRangePickerInput__disabled { + background: #f2f2f2; } + +.DateRangePickerInput__withBorder { + border-radius: 2px; + border: 1px solid #dbdbdb; } + +.DateRangePickerInput__rtl { + direction: rtl; } + +.DateRangePickerInput__block { + display: block; } + +.DateRangePickerInput__showClearDates { + padding-right: 30px; } + +.DateRangePickerInput_arrow { + display: inline-block; + vertical-align: middle; + color: #484848; } + +.DateRangePickerInput_arrow_svg { + vertical-align: middle; + fill: #484848; + height: 24px; + width: 24px; } + +.DateRangePickerInput_clearDates { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + padding: 10px; + margin: 0 10px 0 5px; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); } + +.DateRangePickerInput_clearDates__small { + padding: 6px; } + +.DateRangePickerInput_clearDates_default:focus, +.DateRangePickerInput_clearDates_default:hover { + background: #dbdbdb; + border-radius: 50%; } + +.DateRangePickerInput_clearDates__hide { + visibility: hidden; } + +.DateRangePickerInput_clearDates_svg { + fill: #82888a; + height: 12px; + width: 15px; + vertical-align: middle; } + +.DateRangePickerInput_clearDates_svg__small { + height: 9px; } + +.DateRangePickerInput_calendarIcon { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + display: inline-block; + vertical-align: middle; + padding: 10px; + margin: 0 5px 0 10px; } + +.DateRangePickerInput_calendarIcon_svg { + fill: #82888a; + height: 15px; + width: 14px; + vertical-align: middle; } + +.DateRangePicker { + position: relative; + display: inline-block; } + +.DateRangePicker__block { + display: block; } + +.DateRangePicker_picker { + z-index: 1; + background-color: #fff; + position: absolute; } + +.DateRangePicker_picker__rtl { + direction: rtl; } + +.DateRangePicker_picker__directionLeft { + left: 0; } + +.DateRangePicker_picker__directionRight { + right: 0; } + +.DateRangePicker_picker__portal { + background-color: rgba(0, 0, 0, 0.3); + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; } + +.DateRangePicker_picker__fullScreenPortal { + background-color: #fff; } + +.DateRangePicker_closeButton { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + position: absolute; + top: 0; + right: 0; + padding: 15px; + z-index: 2; } + +.DateRangePicker_closeButton:focus, +.DateRangePicker_closeButton:hover { + color: #b0b3b4; + text-decoration: none; } + +.DateRangePicker_closeButton_svg { + height: 15px; + width: 15px; + fill: #cacccd; } +.components-datetime { + padding: 16px; } + .components-datetime .components-datetime__calendar-help { + padding: 16px; } + .components-datetime .components-datetime__calendar-help h4 { + margin: 0; } + .components-datetime .components-datetime__date-help-button { + display: block; + margin-right: auto; } + .components-datetime fieldset { + border: 0; + padding: 0; + margin: 0; } + .components-datetime select, + .components-datetime input { + box-shadow: 0 0 0 transparent; + transition: box-shadow 0.1s linear; + border-radius: 4px; + border: 1px solid #7e8993; } + @media (prefers-reduced-motion: reduce) { + .components-datetime select, + .components-datetime input { + transition-duration: 0s; } } + .components-datetime select, + .components-datetime input[type="number"], + .components-datetime .components-button { + height: 30px; + margin-top: 0; + margin-bottom: 0; } + +.components-datetime__date { + min-height: 236px; + border-top: 1px solid #e2e4e7; } + .components-datetime__date .DayPickerNavigation_leftButton__horizontalDefault { + right: 0; } + .components-datetime__date .CalendarMonth_caption { + font-size: 13px; } + .components-datetime__date .CalendarDay { + font-size: 13px; + border: 1px solid transparent; + border-radius: 50%; + text-align: center; } + .components-datetime__date .CalendarDay__selected { + background: #0085ba; } + body.admin-color-sunrise .components-datetime__date .CalendarDay__selected { + background: #d1864a; } + body.admin-color-ocean .components-datetime__date .CalendarDay__selected { + background: #a3b9a2; } + body.admin-color-midnight .components-datetime__date .CalendarDay__selected { + background: #e14d43; } + body.admin-color-ectoplasm .components-datetime__date .CalendarDay__selected { + background: #a7b656; } + body.admin-color-coffee .components-datetime__date .CalendarDay__selected { + background: #c2a68c; } + body.admin-color-blue .components-datetime__date .CalendarDay__selected { + background: #82b4cb; } + body.admin-color-light .components-datetime__date .CalendarDay__selected { + background: #0085ba; } + .components-datetime__date .CalendarDay__selected:hover { + background: rgb(0, 113, 158); } + body.admin-color-sunrise .components-datetime__date .CalendarDay__selected:hover { + background: rgb(178, 114, 63); } + body.admin-color-ocean .components-datetime__date .CalendarDay__selected:hover { + background: rgb(139, 157, 138); } + body.admin-color-midnight .components-datetime__date .CalendarDay__selected:hover { + background: rgb(191, 65, 57); } + body.admin-color-ectoplasm .components-datetime__date .CalendarDay__selected:hover { + background: rgb(142, 155, 73); } + body.admin-color-coffee .components-datetime__date .CalendarDay__selected:hover { + background: rgb(165, 141, 119); } + body.admin-color-blue .components-datetime__date .CalendarDay__selected:hover { + background: rgb(111, 153, 173); } + body.admin-color-light .components-datetime__date .CalendarDay__selected:hover { + background: rgb(0, 113, 158); } + .components-datetime__date .DayPickerNavigation_button__horizontalDefault { + padding: 2px 8px; + top: 20px; } + .components-datetime__date .DayPickerNavigation_button__horizontalDefault:focus { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + .components-datetime__date .DayPicker_weekHeader { + top: 50px; } + .components-datetime__date .DayPicker_weekHeader .DayPicker_weekHeader_ul { + margin: 1px 0; + padding-right: 0; + padding-left: 0; } + .components-datetime__date.is-description-visible .DayPicker, + .components-datetime__date.is-description-visible .components-datetime__date-help-button { + visibility: hidden; } + +.components-datetime__time { + padding-bottom: 16px; } + .components-datetime__time fieldset { + position: relative; + margin-bottom: 0.5em; } + .components-datetime__time fieldset + fieldset { + margin-bottom: 0; } + .components-datetime__time .components-datetime__time-field-am-pm fieldset { + margin-top: 0; } + .components-datetime__time .components-datetime__time-wrapper { + display: flex; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-separator { + display: inline-block; + padding: 0 0 0 3px; + color: #555d66; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button { + margin-right: 8px; + margin-left: -1px; + border-radius: 0 3px 3px 0; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button { + margin-right: -1px; + border-radius: 3px 0 0 3px; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button:focus, + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button:focus { + position: relative; + z-index: 1; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button.is-pressed, + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button.is-pressed { + background: #edeff0; + border-color: #8f98a1; + box-shadow: inset 0 2px 5px -3px #555d66; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button.is-pressed:focus, + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button.is-pressed:focus { + box-shadow: inset 0 2px 5px -3px #555d66, 0 0 0 1px #fff, 0 0 0 3px #007cba; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field-time { + direction: ltr; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field.am-pm button { + font-size: 11px; + font-weight: 600; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select { + margin-left: 4px; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select:focus { + position: relative; + z-index: 1; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type="number"] { + padding: 2px; + margin-left: 4px; + text-align: center; + -moz-appearance: textfield; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type="number"]:focus { + position: relative; + z-index: 1; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; } + .components-datetime__time.is-12-hour .components-datetime__time-field-day input { + margin: 0 0 0 -4px !important; + border-radius: 0 4px 4px 0 !important; } + .components-datetime__time.is-12-hour .components-datetime__time-field-year input { + border-radius: 4px 0 0 4px !important; } + +.components-datetime__time-legend { + font-weight: 600; + margin-top: 0.5em; } + .components-datetime__time-legend.invisible { + position: absolute; + top: -999em; + right: -999em; } + +.components-datetime__time-field-hours-input, +.components-datetime__time-field-minutes-input, +.components-datetime__time-field-day-input { + width: 35px; } + +.components-datetime__time-field-year-input { + width: 55px; } + +.components-datetime__time-field-month-select { + max-width: 145px; } + +.components-popover .components-datetime__date { + padding-right: 4px; } + +.block-editor-dimension-control .components-base-control__field { + display: flex; + align-items: center; } + +.block-editor-dimension-control .components-base-control__label { + display: flex; + align-items: center; + margin-left: 1em; + margin-bottom: 0; } + .block-editor-dimension-control .components-base-control__label .dashicon { + margin-left: 0.5em; } + +.block-editor-dimension-control.is-manual .components-base-control__label { + width: 10em; } + +.components-disabled { + position: relative; + pointer-events: none; } + .components-disabled::after { + content: ""; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; } + .components-disabled * { + pointer-events: none; } + +body.is-dragging-components-draggable { + cursor: move; + /* Fallback for IE/Edge < 14 */ + cursor: grabbing !important; } + +.components-draggable__invisible-drag-image { + position: fixed; + right: -1000px; + height: 50px; + width: 50px; } + +.components-draggable__clone { + position: fixed; + padding: 20px; + background: transparent; + pointer-events: none; + z-index: 1000000000; + opacity: 0.8; } + +.components-drop-zone { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 40; + visibility: hidden; + opacity: 0; + transition: 0.3s opacity, 0.3s background-color, 0s visibility 0.3s; + border: 2px solid #0071a1; + border-radius: 2px; } + @media (prefers-reduced-motion: reduce) { + .components-drop-zone { + transition-duration: 0s; } } + .components-drop-zone.is-active { + opacity: 1; + visibility: visible; + transition: 0.3s opacity, 0.3s background-color; } + @media (prefers-reduced-motion: reduce) { + .components-drop-zone.is-active { + transition-duration: 0s; } } + .components-drop-zone.is-dragging-over-element { + background-color: rgba(0, 113, 161, 0.8); } + +.components-drop-zone__content { + position: absolute; + top: 50%; + right: 0; + left: 0; + z-index: 50; + transform: translateY(-50%); + width: 100%; + text-align: center; + color: #fff; + transition: transform 0.2s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .components-drop-zone__content { + transition-duration: 0s; } } + +.components-drop-zone.is-dragging-over-element .components-drop-zone__content { + transform: translateY(-50%) scale(1.05); } + +.components-drop-zone__content-icon, +.components-drop-zone__content-text { + display: block; } + +.components-drop-zone__content-icon { + margin: 0 auto; + line-height: 0; + fill: currentColor; } + +.components-drop-zone__content-text { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } + +.components-drop-zone__provider { + height: 100%; } + +.components-dropdown { + display: inline-block; } + +.components-dropdown-menu__indicator::after { + content: ""; + pointer-events: none; + display: block; + width: 0; + height: 0; + border-right: 3px solid transparent; + border-left: 3px solid transparent; + border-top: 5px solid; + margin-right: 4px; + margin-left: 2px; } + +.components-dropdown-menu__popover .components-popover__content { + width: 200px; } + +.components-dropdown-menu__menu { + width: 100%; + padding: 7px 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + line-height: 1.4; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item, + .components-dropdown-menu__menu .components-menu-item { + width: 100%; + padding: 6px; + outline: none; + cursor: pointer; + margin-bottom: 4px; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator, + .components-dropdown-menu__menu .components-menu-item.has-separator { + margin-top: 6px; + position: relative; + overflow: visible; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator::before, + .components-dropdown-menu__menu .components-menu-item.has-separator::before { + display: block; + content: ""; + box-sizing: content-box; + background-color: #e2e4e7; + position: absolute; + top: -3px; + right: 0; + left: 0; + height: 1px; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item:focus:not(:disabled):not([aria-disabled="true"]):not(.is-secondary), + .components-dropdown-menu__menu .components-menu-item:focus:not(:disabled):not([aria-disabled="true"]):not(.is-secondary) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item:hover, .components-dropdown-menu__menu .components-dropdown-menu__menu-item:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover, + .components-dropdown-menu__menu .components-menu-item:hover, + .components-dropdown-menu__menu .components-menu-item:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; + box-shadow: none; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item > svg, + .components-dropdown-menu__menu .components-menu-item > svg { + border-radius: 4px; + padding: 2px; + width: 24px; + height: 24px; + margin: -1px 0 -1px 8px; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item:not(:disabled):not([aria-disabled="true"]):not(.is-secondary).is-active > svg, + .components-dropdown-menu__menu .components-menu-item:not(:disabled):not([aria-disabled="true"]):not(.is-secondary).is-active > svg { + outline: none; + color: #fff; + box-shadow: none; + background: #555d66; } + .components-dropdown-menu__menu .components-menu-group:not(:last-child) { + border-bottom: 1px solid #e2e4e7; } + .components-dropdown-menu__menu .components-menu-item__button, + .components-dropdown-menu__menu .components-menu-item__button.components-button { + height: auto; + padding-right: 2rem; } + .components-dropdown-menu__menu .components-menu-item__button.has-icon, + .components-dropdown-menu__menu .components-menu-item__button.components-button.has-icon { + padding-right: 0.5rem; } + .components-dropdown-menu__menu .components-menu-item__button .dashicon, + .components-dropdown-menu__menu .components-menu-item__button.components-button .dashicon { + margin-left: 4px; } + +.components-external-link__icon { + width: 1.4em; + height: 1.4em; + margin: -0.2em 0.1em 0; + vertical-align: middle; } + +.components-focal-point-picker-wrapper { + background-color: transparent; + border: 1px solid #e2e4e7; + height: 200px; + width: 100%; + padding: 14px; } + +.components-focal-point-picker { + align-items: center; + cursor: pointer; + display: flex; + height: 100%; + justify-content: center; + position: relative; + width: 100%; } + .components-focal-point-picker img { + height: auto; + max-height: 100%; + max-width: 100%; + width: auto; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.components-focal-point-picker__icon_container { + background-color: transparent; + cursor: grab; + height: 30px; + opacity: 0.8; + position: absolute; + will-change: transform; + width: 30px; + z-index: 10000; } + .components-focal-point-picker__icon_container.is-dragging { + cursor: grabbing; } + +.components-focal-point-picker__icon { + display: block; + height: 100%; + right: -15px; + position: absolute; + top: -15px; + width: 100%; } + .components-focal-point-picker__icon .components-focal-point-picker__icon-outline { + fill: #fff; } + .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #0085ba; } + body.admin-color-sunrise .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #d1864a; } + body.admin-color-ocean .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #a3b9a2; } + body.admin-color-midnight .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #e14d43; } + body.admin-color-ectoplasm .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #a7b656; } + body.admin-color-coffee .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #c2a68c; } + body.admin-color-blue .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #82b4cb; } + body.admin-color-light .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #0085ba; } + +.components-focal-point-picker_position-display-container { + margin: 1em 0; + display: flex; } + .components-focal-point-picker_position-display-container .components-base-control__field { + margin: 0 0 0 1em; } + .components-focal-point-picker_position-display-container input[type="number"].components-text-control__input { + max-width: 4em; + padding: 6px 4px; } + .components-focal-point-picker_position-display-container span { + margin: 0 0.2em 0 0; } + +.components-font-size-picker__controls { + max-width: 248px; + display: flex; + align-items: center; + margin-bottom: 24px; } + .components-font-size-picker__controls .components-range-control__number { + height: 30px; + margin-bottom: 0; + margin-top: 5px; + margin-right: 0; + margin-left: 8px; } + .components-font-size-picker__controls .components-range-control__number[value=""] + .components-button { + cursor: default; + opacity: 0.3; + pointer-events: none; } + .components-font-size-picker__controls .components-range-control__number-container { + display: flex; + flex-direction: column; } + .components-font-size-picker__controls .components-font-size-picker__select { + margin-left: 8px; + flex-grow: 1; } + .components-font-size-picker__controls .components-color-palette__clear { + height: 30px; + margin-top: 23px; } + +.components-font-size-picker__custom-input .components-range-control__slider + .dashicon { + width: 30px; + height: 30px; } + +.components-font-size-picker { + border: 0; + padding: 0; + margin: 0; } + +.components-form-toggle { + position: relative; + display: inline-block; } + .components-form-toggle .components-form-toggle__on, + .components-form-toggle .components-form-toggle__off { + position: absolute; + top: 6px; + box-sizing: border-box; } + .components-form-toggle .components-form-toggle__off { + color: #6c7781; + fill: currentColor; + left: 6px; } + .components-form-toggle .components-form-toggle__on { + right: 8px; } + .components-form-toggle .components-form-toggle__track { + content: ""; + display: inline-block; + box-sizing: border-box; + vertical-align: top; + background-color: #fff; + border: 2px solid #6c7781; + width: 36px; + height: 18px; + border-radius: 9px; + transition: 0.2s background ease; } + @media (prefers-reduced-motion: reduce) { + .components-form-toggle .components-form-toggle__track { + transition-duration: 0s; } } + .components-form-toggle .components-form-toggle__thumb { + display: block; + position: absolute; + box-sizing: border-box; + top: 4px; + right: 4px; + width: 10px; + height: 10px; + border-radius: 50%; + transition: 0.1s transform ease; + background-color: #6c7781; + border: 5px solid #6c7781; } + @media (prefers-reduced-motion: reduce) { + .components-form-toggle .components-form-toggle__thumb { + transition-duration: 0s; } } + .components-form-toggle:hover .components-form-toggle__track { + border: 2px solid #555d66; } + .components-form-toggle:hover .components-form-toggle__thumb { + background-color: #555d66; + border: 5px solid #6c7781; } + .components-form-toggle:hover .components-form-toggle__off { + color: #555d66; } + .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #11a0d2; + border: 2px solid #11a0d2; + border: 9px solid transparent; } + body.admin-color-sunrise .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #c8b03c; + border: 2px solid #c8b03c; } + body.admin-color-ocean .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #a3b9a2; + border: 2px solid #a3b9a2; } + body.admin-color-midnight .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #77a6b9; + border: 2px solid #77a6b9; } + body.admin-color-ectoplasm .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #a7b656; + border: 2px solid #a7b656; } + body.admin-color-coffee .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #c2a68c; + border: 2px solid #c2a68c; } + body.admin-color-blue .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #82b4cb; + border: 2px solid #82b4cb; } + body.admin-color-light .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #11a0d2; + border: 2px solid #11a0d2; } + .components-form-toggle__input:focus + .components-form-toggle__track { + box-shadow: 0 0 0 2px #fff, 0 0 0 3px #6c7781; + outline: 2px solid transparent; + outline-offset: 2px; } + .components-form-toggle.is-checked .components-form-toggle__thumb { + background-color: #fff; + border-width: 0; + transform: translateX(-18px); } + .components-form-toggle.is-checked::before { + background-color: #11a0d2; + border: 2px solid #11a0d2; } + body.admin-color-sunrise .components-form-toggle.is-checked::before { + background-color: #c8b03c; + border: 2px solid #c8b03c; } + body.admin-color-ocean .components-form-toggle.is-checked::before { + background-color: #a3b9a2; + border: 2px solid #a3b9a2; } + body.admin-color-midnight .components-form-toggle.is-checked::before { + background-color: #77a6b9; + border: 2px solid #77a6b9; } + body.admin-color-ectoplasm .components-form-toggle.is-checked::before { + background-color: #a7b656; + border: 2px solid #a7b656; } + body.admin-color-coffee .components-form-toggle.is-checked::before { + background-color: #c2a68c; + border: 2px solid #c2a68c; } + body.admin-color-blue .components-form-toggle.is-checked::before { + background-color: #82b4cb; + border: 2px solid #82b4cb; } + body.admin-color-light .components-form-toggle.is-checked::before { + background-color: #11a0d2; + border: 2px solid #11a0d2; } + .components-disabled .components-form-toggle { + opacity: 0.3; } + +.components-form-toggle input.components-form-toggle__input[type="checkbox"] { + position: absolute; + top: 0; + right: 0; + width: 100%; + height: 100%; + opacity: 0; + margin: 0; + padding: 0; + z-index: 1; + border: none; } + .components-form-toggle input.components-form-toggle__input[type="checkbox"]:checked { + background: none; } + .components-form-toggle input.components-form-toggle__input[type="checkbox"]::before { + content: ""; } + +.components-form-toggle .components-form-toggle__on { + outline: 1px solid transparent; + outline-offset: -1px; + border: 1px solid #000; + filter: invert(100%) contrast(500%); } + +@supports (-ms-high-contrast-adjust: auto) { + .components-form-toggle .components-form-toggle__on { + filter: none; + border: 1px solid #fff; } } + +.components-form-token-field__input-container { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + width: 100%; + margin: 0 0 8px 0; + padding: 4px; + background-color: #fff; + border: 1px solid #ccd0d4; + color: #32373c; + cursor: text; + box-shadow: 0 0 0 transparent; + transition: box-shadow 0.1s linear; + border-radius: 4px; + border: 1px solid #7e8993; } + @media (prefers-reduced-motion: reduce) { + .components-form-token-field__input-container { + transition-duration: 0s; } } + .components-form-token-field__input-container.is-disabled { + background: #e2e4e7; + border-color: #ccd0d4; } + .components-form-token-field__input-container.is-active { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + .components-form-token-field__input-container input[type="text"].components-form-token-field__input { + display: inline-block; + width: 100%; + max-width: 100%; + margin: 2px 8px 2px 0; + padding: 0; + min-height: 24px; + background: inherit; + border: 0; + color: #23282d; + box-shadow: none; } + .components-form-token-field__input-container input[type="text"].components-form-token-field__input:focus, + .components-form-token-field.is-active .components-form-token-field__input-container input[type="text"].components-form-token-field__input { + outline: none; + box-shadow: none; } + .components-form-token-field__input-container .components-form-token-field__token + input[type="text"].components-form-token-field__input { + width: auto; } + +.components-form-token-field__label { + display: inline-block; + margin-bottom: 4px; } + +.components-form-token-field__help { + font-style: italic; } + +.components-form-token-field__token { + font-size: 13px; + display: flex; + margin: 2px 0 2px 4px; + color: #32373c; + overflow: hidden; } + .components-form-token-field__token.is-success .components-form-token-field__token-text, + .components-form-token-field__token.is-success .components-form-token-field__remove-token { + background: #4ab866; } + .components-form-token-field__token.is-error .components-form-token-field__token-text, + .components-form-token-field__token.is-error .components-form-token-field__remove-token { + background: #d94f4f; } + .components-form-token-field__token.is-validating .components-form-token-field__token-text, + .components-form-token-field__token.is-validating .components-form-token-field__remove-token { + color: #555d66; } + .components-form-token-field__token.is-borderless { + position: relative; + padding: 0 0 0 16px; } + .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + background: transparent; + color: #11a0d2; } + body.admin-color-sunrise .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #c8b03c; } + body.admin-color-ocean .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #a89d8a; } + body.admin-color-midnight .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #77a6b9; } + body.admin-color-ectoplasm .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #c77430; } + body.admin-color-coffee .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #9fa47b; } + body.admin-color-blue .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #d9ab59; } + body.admin-color-light .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #c75726; } + .components-form-token-field__token.is-borderless .components-form-token-field__remove-token { + background: transparent; + color: #555d66; + position: absolute; + top: 1px; + left: 0; } + .components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text { + color: #4ab866; } + .components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text { + color: #d94f4f; + border-radius: 0 4px 4px 0; + padding: 0 6px 0 4px; } + .components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text { + color: #23282d; } + .components-form-token-field__token.is-disabled .components-form-token-field__remove-token { + cursor: default; } + +.components-form-token-field__token-text, +.components-form-token-field__remove-token.components-button { + display: inline-block; + line-height: 24px; + height: auto; + background: #e2e4e7; + transition: all 0.2s cubic-bezier(0.4, 1, 0.4, 1); } + @media (prefers-reduced-motion: reduce) { + .components-form-token-field__token-text, + .components-form-token-field__remove-token.components-button { + transition-duration: 0s; + animation-duration: 1ms; } } + +.components-form-token-field__token-text { + border-radius: 0 12px 12px 0; + padding: 0 8px 0 4px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + +.components-form-token-field__remove-token.components-button { + cursor: pointer; + border-radius: 12px 0 0 12px; + padding: 0 2px; + color: #555d66; + line-height: 10px; + overflow: initial; } + .components-form-token-field__remove-token.components-button:hover { + color: #32373c; } + +.components-form-token-field__suggestions-list { + flex: 1 0 100%; + min-width: 100%; + max-height: 9em; + overflow-y: scroll; + transition: all 0.15s ease-in-out; + list-style: none; + border-top: 1px solid #6c7781; + margin: 4px -4px -4px; + padding-top: 3px; } + @media (prefers-reduced-motion: reduce) { + .components-form-token-field__suggestions-list { + transition-duration: 0s; } } + +.components-form-token-field__suggestion { + color: #555d66; + display: block; + font-size: 13px; + padding: 4px 8px; + cursor: pointer; } + .components-form-token-field__suggestion.is-selected { + background: #0071a1; + color: #fff; } + +.components-form-token-field__suggestion-match { + text-decoration: underline; } + +.components-guide .components-modal__header { + background: none; + border-bottom: none; } + .components-guide .components-modal__header .components-button { + align-self: flex-start; + margin-top: 24px; + position: static; } + +.components-guide__container { + display: flex; + flex-direction: column; + margin-top: -56px; + min-height: 100%; } + +.components-guide__footer { + align-content: center; + display: flex; + height: 30px; + justify-content: center; + margin: auto 0 24px 0; + position: relative; + width: 100%; } + @media (min-width: 600px) { + .components-guide__footer { + margin: 24px 0 0; } } + +.components-guide__page-control { + margin: 0; } + .components-guide__page-control li { + display: inline-block; + margin: 0 2px; } + .components-guide__page-control .components-button { + height: 30px; } + +@media (max-width: 600px) { + .components-modal__frame.components-guide { + bottom: 15%; + right: 24px; + left: 24px; + top: 15%; } } + +.components-button.components-guide__back-button, .components-button.components-guide__forward-button, .components-button.components-guide__finish-button { + height: 30px; + position: absolute; } + +.components-button.components-guide__back-button, .components-button.components-guide__forward-button { + font-size: 0; + padding: 4px 2px; } + .components-button.components-guide__back-button.has-text svg, .components-button.components-guide__forward-button.has-text svg { + margin: 0; } + @media (min-width: 600px) { + .components-button.components-guide__back-button, .components-button.components-guide__forward-button { + font-size: 13px; } } + +.components-button.components-guide__back-button { + right: 0; } + @media (min-width: 600px) { + .components-button.components-guide__back-button { + padding: 4px 2px 4px 8px; } + .components-button.components-guide__back-button.has-text svg { + margin-left: 4px; } } + +.components-button.components-guide__forward-button { + left: 0; } + @media (min-width: 600px) { + .components-button.components-guide__forward-button { + padding: 4px 8px 4px 2px; } + .components-button.components-guide__forward-button.has-text svg { + margin-right: 4px; + order: 1; } } + +.components-button.components-guide__finish-button { + display: none; + left: 0; } + @media (min-width: 600px) { + .components-button.components-guide__finish-button { + display: block; } } + +@media (min-width: 600px) { + .components-button.components-guide__inline-finish-button { + display: none; } } + +.components-navigate-regions.is-focusing-regions [role="region"] { + position: relative; } + .components-navigate-regions.is-focusing-regions [role="region"]:focus::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 0; + pointer-events: none; + outline: 4px solid transparent; + box-shadow: inset 0 0 0 4px #33b3db; } + @supports (outline-offset: 1px) { + .components-navigate-regions.is-focusing-regions [role="region"]:focus::after { + content: none; } + .components-navigate-regions.is-focusing-regions [role="region"]:focus { + outline-style: solid; + outline-color: #33b3db; + outline-width: 4px; + outline-offset: -4px; } } + +.components-menu-group { + width: 100%; + padding: 7px 0; } + +.components-menu-group__label { + margin-bottom: 8px; + color: #6c7781; + padding: 0 7px; } + +.components-menu-item__button, +.components-menu-item__button.components-button { + width: 100%; + padding: 8px 15px; + text-align: right; + color: #40464d; + border: none; + box-shadow: none; } + .components-menu-item__button .dashicon, + .components-menu-item__button .components-menu-items__item-icon, + .components-menu-item__button svg.components-menu-items__item-icon, + .components-menu-item__button > span > svg, + .components-menu-item__button.components-button .dashicon, + .components-menu-item__button.components-button .components-menu-items__item-icon, + .components-menu-item__button.components-button svg.components-menu-items__item-icon, + .components-menu-item__button.components-button > span > svg { + margin-left: 4px; } + .components-menu-item__button .components-menu-items__item-icon, + .components-menu-item__button.components-button .components-menu-items__item-icon { + display: inline-block; + flex: 0 0 auto; } + .components-menu-item__button.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover, + .components-menu-item__button.components-button.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; } + .components-menu-item__button.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover .components-menu-item__shortcut, + .components-menu-item__button.components-button.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover .components-menu-item__shortcut { + color: #40464d; } + .components-menu-item__button:focus:not(:disabled):not([aria-disabled="true"]), + .components-menu-item__button.components-button:focus:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + +.components-menu-item__info-wrapper { + display: flex; + flex-direction: column; } + +.components-menu-item__info { + margin-top: 4px; + font-size: 12px; + color: #6c7781; } + +.components-menu-item__shortcut { + -ms-grid-row-align: center; + align-self: center; + color: #6c7781; + margin-left: 0; + margin-right: auto; + padding-right: 8px; + display: none; } + @media (min-width: 480px) { + .components-menu-item__shortcut { + display: inline; } } + +.components-menu-items-choice, +.components-menu-items-choice.components-button { + padding-right: 2rem; } + .components-menu-items-choice.has-icon, + .components-menu-items-choice.components-button.has-icon { + padding-right: 0.5rem; } + +.components-modal__screen-overlay { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-color: rgba(0, 0, 0, 0.7); + z-index: 100000; + animation: edit-post__fade-in-animation 0.2s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-modal__screen-overlay { + animation-duration: 1ms; } } + +.components-modal__frame { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + box-sizing: border-box; + margin: 0; + border: 1px solid #e2e4e7; + background: #fff; + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.2); + overflow: auto; } + @media (min-width: 600px) { + .components-modal__frame { + top: 50%; + left: auto; + bottom: auto; + right: 50%; + min-width: 360px; + max-width: calc(100% - 16px - 16px); + max-height: calc(100% - 56px - 56px); + transform: translate(50%, -50%); + animation: components-modal__appear-animation 0.1s ease-out; + animation-fill-mode: forwards; } } + @media (min-width: 600px) and (prefers-reduced-motion: reduce) { + .components-modal__frame { + animation-duration: 1ms; } } + +@keyframes components-modal__appear-animation { + from { + margin-top: 32px; } + to { + margin-top: 0; } } + +.components-modal__header { + box-sizing: border-box; + border-bottom: 1px solid #e2e4e7; + padding: 0 24px; + display: flex; + flex-direction: row; + justify-content: space-between; + background: #fff; + align-items: center; + height: 56px; + z-index: 10; + position: relative; + position: -webkit-sticky; + position: sticky; + top: 0; + margin: 0 -24px 24px; } + @supports (-ms-ime-align: auto) { + .components-modal__header { + position: fixed; + width: 100%; } } + .components-modal__header .components-modal__header-heading { + font-size: 1rem; + font-weight: 600; } + .components-modal__header h1 { + line-height: 1; + margin: 0; } + .components-modal__header .components-button { + position: relative; + right: 8px; } + +.components-modal__header-heading-container { + align-items: center; + flex-grow: 1; + display: flex; + flex-direction: row; + justify-content: left; } + +.components-modal__header-icon-container { + display: inline-block; } + .components-modal__header-icon-container svg { + max-width: 36px; + max-height: 36px; + padding: 8px; } + +.components-modal__content { + box-sizing: border-box; + height: 100%; + padding: 0 24px 24px; } + @supports (-ms-ime-align: auto) { + .components-modal__content { + padding-top: 56px; } } + +.components-notice { + display: flex; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + background-color: #e5f5fa; + border-right: 4px solid #00a0d2; + margin: 5px 15px 2px; + padding: 8px 12px; + align-items: center; } + .components-notice.is-dismissible { + padding-left: 36px; + position: relative; } + .components-notice.is-success { + border-right-color: #4ab866; + background-color: #eff9f1; } + .components-notice.is-warning { + border-right-color: #f0b849; + background-color: #fef8ee; } + .components-notice.is-error { + border-right-color: #d94f4f; + background-color: #f9e2e2; } + +.components-notice__content { + flex-grow: 1; + margin: 4px 0 4px 25px; } + +.components-notice__action.components-button, .components-notice__action.components-button.is-link { + margin-right: 4px; } + +.components-notice__action.components-button.is-secondary { + vertical-align: initial; } + +.components-notice__dismiss { + color: #6c7781; + align-self: flex-start; + flex-shrink: 0; } + .components-notice__dismiss:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover, .components-notice__dismiss:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):active, .components-notice__dismiss:not(:disabled):not([aria-disabled="true"]):focus { + color: #191e23; + background-color: transparent; } + .components-notice__dismiss:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + box-shadow: none; } + +.components-notice-list { + max-width: 100vw; + box-sizing: border-box; + z-index: 29; } + .components-notice-list .components-notice__content { + margin-top: 12px; + margin-bottom: 12px; + line-height: 1.6; } + .components-notice-list .components-notice__action.components-button { + margin-top: -2px; + margin-bottom: -2px; } + +.components-panel { + background: #fff; + border: 1px solid #e2e4e7; } + .components-panel > .components-panel__header:first-child, + .components-panel > .components-panel__body:first-child { + margin-top: -1px; } + .components-panel > .components-panel__header:last-child, + .components-panel > .components-panel__body:last-child { + border-bottom-width: 0; } + +.components-panel + .components-panel { + margin-top: -1px; } + +.components-panel__body { + border-top: 1px solid #e2e4e7; + border-bottom: 1px solid #e2e4e7; } + .components-panel__body h3 { + margin: 0 0 0.5em; } + .components-panel__body.is-opened { + padding: 16px; } + +.components-panel__header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 16px; + height: 50px; + border-top: 1px solid #e2e4e7; + border-bottom: 1px solid #e2e4e7; } + .components-panel__header h2 { + margin: 0; + font-size: inherit; + color: inherit; } + +.components-panel__body + .components-panel__body, +.components-panel__body + .components-panel__header, +.components-panel__header + .components-panel__body, +.components-panel__header + .components-panel__header { + margin-top: -1px; } + +.components-panel__body > .components-panel__body-title { + display: block; + padding: 0; + font-size: inherit; + margin-top: 0; + margin-bottom: 0; + transition: 0.1s background ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .components-panel__body > .components-panel__body-title { + transition-duration: 0s; } } + +.components-panel__body.is-opened > .components-panel__body-title { + margin: -16px; + margin-bottom: 5px; } + +.components-panel__body > .components-panel__body-title:hover { + background: #f3f4f5 !important; + border: none !important; } + +.components-panel__body-toggle.components-button { + position: relative; + padding: 15px; + outline: none; + width: 100%; + font-weight: 600; + text-align: right; + color: #191e23; + border: none; + box-shadow: none; + transition: 0.1s background ease-in-out; + height: auto; } + @media (prefers-reduced-motion: reduce) { + .components-panel__body-toggle.components-button { + transition-duration: 0s; } } + .components-panel__body-toggle.components-button:focus:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + .components-panel__body-toggle.components-button:hover { + background: transparent !important; + border: none !important; + box-shadow: none !important; } + .components-panel__body-toggle.components-button .components-panel__arrow { + position: absolute; + left: 10px; + top: 50%; + transform: translateY(-50%); + color: #191e23; + fill: currentColor; + transition: 0.1s color ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .components-panel__body-toggle.components-button .components-panel__arrow { + transition-duration: 0s; } } + body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right { + transform: scaleX(-1); + -ms-filter: fliph; + filter: FlipH; + margin-top: -10px; } + +.components-panel__icon { + color: #555d66; + margin: -2px 6px -2px 0; } + +.components-panel__body-toggle-icon { + margin-left: -5px; } + +.components-panel__color-title { + float: right; + height: 19px; } + +.components-panel__row { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 20px; } + .components-panel__row select { + min-width: 0; } + .components-panel__row label { + margin-left: 10px; + flex-shrink: 0; + max-width: 75%; } + .components-panel__row:empty, .components-panel__row:first-of-type { + margin-top: 0; } + +.components-panel .circle-picker { + padding-bottom: 20px; } + +.components-placeholder.components-placeholder { + position: relative; + margin-bottom: 28px; + padding: 1em; + min-height: 200px; + width: 100%; + text-align: right; + background: rgba(139, 139, 150, 0.1); } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .components-placeholder.components-placeholder { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; } } + .is-dark-theme .components-placeholder.components-placeholder { + background: rgba(255, 255, 255, 0.15); } + .components-placeholder.components-placeholder .components-base-control__label { + font-size: 13px; } + +.components-placeholder__error, +.components-placeholder__instructions, +.components-placeholder__label, +.components-placeholder__fieldset { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; } + +.components-placeholder__label { + display: flex; + font-weight: 600; + margin-bottom: 1em; } + .components-placeholder__label > svg, + .components-placeholder__label .dashicon, + .components-placeholder__label .block-editor-block-icon { + fill: currentColor; + margin-left: 1ch; } + +.components-placeholder__fieldset, +.components-placeholder__fieldset form { + display: flex; + flex-direction: row; + width: 100%; + flex-wrap: wrap; + z-index: 1; } + .components-placeholder__fieldset p, + .components-placeholder__fieldset form p { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; } + +.components-placeholder__fieldset.is-column-layout, +.components-placeholder__fieldset.is-column-layout form { + flex-direction: column; } + +.components-placeholder__input { + margin: 0 0 0 8px; + flex: 1 1 auto; } + +.components-placeholder__instructions { + margin-bottom: 1em; } + +.components-placeholder__error { + margin-top: 1em; + width: 100%; } + +.components-placeholder__preview img { + margin: 3%; + width: 50%; } + +.components-placeholder__fieldset .components-button { + margin-left: 8px; + margin-bottom: 8px; } + .components-placeholder__fieldset .components-button:last-child { + margin-bottom: 0; + margin-left: 0; } + +.components-placeholder__fieldset .components-button:not(.is-link) ~ .components-button.is-link { + margin-right: 10px; + margin-left: 10px; } + .components-placeholder__fieldset .components-button:not(.is-link) ~ .components-button.is-link:last-child { + margin-left: 0; } + +.components-placeholder.is-medium .components-placeholder__instructions, .components-placeholder.is-small .components-placeholder__instructions { + display: none; } + +.components-placeholder.is-medium .components-placeholder__fieldset, +.components-placeholder.is-medium .components-placeholder__fieldset form, .components-placeholder.is-small .components-placeholder__fieldset, +.components-placeholder.is-small .components-placeholder__fieldset form { + flex-direction: column; } + +.components-placeholder.is-medium .components-placeholder__fieldset .components-button, .components-placeholder.is-small .components-placeholder__fieldset .components-button { + margin-left: auto; } + +.components-placeholder.is-small .block-editor-block-icon { + display: none; } + +.components-placeholder.is-small .components-button { + padding: 0 8px 2px; } +.components-popover { + position: fixed; + z-index: 1000000; + top: 0; + left: 0; + opacity: 0; } + .components-popover.is-expanded, .components-popover[data-x-axis][data-y-axis] { + opacity: 1; } + .components-popover.is-expanded { + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1000000 !important; } + .components-popover:not(.is-without-arrow) { + margin-left: 2px; } + .components-popover:not(.is-without-arrow)::before { + border: 8px solid #e2e4e7; } + .components-popover:not(.is-without-arrow)::after { + border: 8px solid #fff; } + .components-popover:not(.is-without-arrow)::before, .components-popover:not(.is-without-arrow)::after { + content: ""; + position: absolute; + height: 0; + width: 0; + line-height: 0; } + .components-popover:not(.is-without-arrow)[data-y-axis="top"] { + margin-top: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="top"]::before { + bottom: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="top"]::after { + bottom: -6px; } + .components-popover:not(.is-without-arrow)[data-y-axis="top"]::before, .components-popover:not(.is-without-arrow)[data-y-axis="top"]::after { + border-bottom: none; + border-left-color: transparent; + border-right-color: transparent; + border-top-style: solid; + margin-left: -10px; } + .components-popover:not(.is-without-arrow)[data-y-axis="bottom"] { + margin-top: 8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="bottom"]::before { + top: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="bottom"]::after { + top: -6px; } + .components-popover:not(.is-without-arrow)[data-y-axis="bottom"]::before, .components-popover:not(.is-without-arrow)[data-y-axis="bottom"]::after { + border-bottom-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-top: none; + margin-left: -10px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"] { + margin-left: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"]::before { + right: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"]::after { + right: -6px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"]::before, .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"]::after { + border-bottom-color: transparent; + border-left-style: solid; + border-right: none; + border-top-color: transparent; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"] { + margin-left: 8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"]::before { + left: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"]::after { + left: -6px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"]::before, .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"]::after { + border-bottom-color: transparent; + border-left: none; + border-right-style: solid; + border-top-color: transparent; } + .components-popover[data-y-axis="top"] { + bottom: 100%; } + .components-popover[data-y-axis="bottom"] { + top: 100%; } + .components-popover[data-y-axis="middle"] { + align-items: center; + display: flex; } + +.components-popover__content { + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1); + border: 1px solid #e2e4e7; + background: #fff; + height: 100%; } + .components-popover .components-popover__content { + position: absolute; + height: auto; + overflow-y: auto; + min-width: 260px; } + .components-popover.is-expanded .components-popover__content { + position: static; + height: calc(100% - 50px); + overflow-y: visible; + min-width: auto; + border: none; + border-top: 1px solid #e2e4e7; } + .components-popover[data-y-axis="top"] .components-popover__content { + bottom: 100%; } + .components-popover[data-x-axis="center"] .components-popover__content { + left: 50%; + transform: translateX(-50%); } + .components-popover[data-x-axis="right"] .components-popover__content { + position: absolute; + left: 100%; } + .components-popover:not([data-y-axis="middle"])[data-x-axis="right"] .components-popover__content { + margin-left: -24px; } + .components-popover[data-x-axis="left"] .components-popover__content { + position: absolute; + right: 100%; } + .components-popover:not([data-y-axis="middle"])[data-x-axis="left"] .components-popover__content { + margin-right: -24px; } + +.components-popover__content > div { + height: 100%; } + +.components-popover__header { + align-items: center; + background: #fff; + display: flex; + height: 50px; + justify-content: space-between; + padding: 0 8px 0 16px; } + +.components-popover__header-title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; } + +.components-popover__close.components-button { + z-index: 5; } +.components-radio-control { + display: flex; + flex-direction: column; } + .components-radio-control .components-base-control__help { + margin-top: 0; } + .components-radio-control .components-base-control__field { + margin-bottom: 0; } + +.components-radio-control__option:not(:last-child) { + margin-bottom: 4px; } + +.components-radio-control__input[type="radio"] { + margin-top: 0; + margin-left: 6px; } + +.components-range-control .components-base-control__field { + display: flex; + justify-content: center; + flex-wrap: wrap; + align-items: center; } + +.components-range-control .dashicon { + flex-shrink: 0; + margin-left: 10px; } + +.components-range-control .components-base-control__label { + width: 100%; } + +.components-range-control .components-range-control__slider { + margin-right: 0; + flex: 1; } + +.components-range-control__reset { + margin-right: 8px; } + +.components-range-control__slider { + width: 100%; + margin-right: 8px; + padding: 0; + -webkit-appearance: none; + background: transparent; + /** + * Thumb + */ + /** + * Track + */ } + .components-range-control__slider::-webkit-slider-thumb { + -webkit-appearance: none; + height: 18px; + width: 18px; + border-radius: 50%; + cursor: pointer; + background: #555d66; + border: 4px solid transparent; + background-clip: padding-box; + box-sizing: border-box; + margin-top: -7px; } + .components-range-control__slider::-moz-range-thumb { + height: 18px; + width: 18px; + border-radius: 50%; + cursor: pointer; + background: #555d66; + border: 4px solid transparent; + background-clip: padding-box; + box-sizing: border-box; } + .components-range-control__slider::-ms-thumb { + height: 18px; + width: 18px; + border-radius: 50%; + cursor: pointer; + background: #555d66; + border: 4px solid transparent; + background-clip: padding-box; + box-sizing: border-box; + margin-top: 0; + height: 14px; + width: 14px; + border: 2px solid transparent; } + .components-range-control__slider:focus { + outline: none; } + .components-range-control__slider:focus::-webkit-slider-thumb { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + .components-range-control__slider:focus::-moz-range-thumb { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + .components-range-control__slider:focus::-ms-thumb { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + .components-range-control__slider::-webkit-slider-runnable-track { + height: 3px; + cursor: pointer; + background: #e2e4e7; + border-radius: 1.5px; + margin-top: -4px; } + .components-range-control__slider::-moz-range-track { + height: 3px; + cursor: pointer; + background: #e2e4e7; + border-radius: 1.5px; } + .components-range-control__slider::-ms-track { + margin-top: -4px; + background: transparent; + border-color: transparent; + color: transparent; + height: 3px; + cursor: pointer; + background: #e2e4e7; + border-radius: 1.5px; } + +.components-range-control__number { + display: inline-block; + margin-right: 8px; + font-weight: 500; + width: 54px; } + +.components-resizable-box__handle { + display: none; + width: 23px; + height: 23px; } + .components-resizable-box__container.is-selected .components-resizable-box__handle, + .components-resizable-box__container.has-show-handle .components-resizable-box__handle { + display: block; } + +.components-resizable-box__handle::after { + display: block; + content: ""; + width: 15px; + height: 15px; + border: 2px solid #fff; + border-radius: 50%; + background: #0085ba; + cursor: inherit; + position: absolute; + top: calc(50% - 8px); + left: calc(50% - 8px); } + +body.admin-color-sunrise .components-resizable-box__handle::after { + background: #d1864a; } + +body.admin-color-ocean .components-resizable-box__handle::after { + background: #a3b9a2; } + +body.admin-color-midnight .components-resizable-box__handle::after { + background: #e14d43; } + +body.admin-color-ectoplasm .components-resizable-box__handle::after { + background: #a7b656; } + +body.admin-color-coffee .components-resizable-box__handle::after { + background: #c2a68c; } + +body.admin-color-blue .components-resizable-box__handle::after { + background: #82b4cb; } + +body.admin-color-light .components-resizable-box__handle::after { + background: #0085ba; } + +.components-resizable-box__side-handle::before { + display: block; + content: ""; + width: 7px; + height: 7px; + border: 2px solid #fff; + background: #0085ba; + cursor: inherit; + position: absolute; + top: calc(50% - 4px); + left: calc(50% - 4px); + transition: transform 0.1s ease-in; + opacity: 0; } + +body.admin-color-sunrise .components-resizable-box__side-handle::before { + background: #d1864a; } + +body.admin-color-ocean .components-resizable-box__side-handle::before { + background: #a3b9a2; } + +body.admin-color-midnight .components-resizable-box__side-handle::before { + background: #e14d43; } + +body.admin-color-ectoplasm .components-resizable-box__side-handle::before { + background: #a7b656; } + +body.admin-color-coffee .components-resizable-box__side-handle::before { + background: #c2a68c; } + +body.admin-color-blue .components-resizable-box__side-handle::before { + background: #82b4cb; } + +body.admin-color-light .components-resizable-box__side-handle::before { + background: #0085ba; } + @media (prefers-reduced-motion: reduce) { + .components-resizable-box__side-handle::before { + transition-duration: 0s; } } + +.is-dark-theme .components-resizable-box__side-handle::before, +.is-dark-theme .components-resizable-box__handle::after { + border-color: #d7dade; } + +.components-resizable-box__side-handle { + z-index: 1; } + +.components-resizable-box__corner-handle { + z-index: 2; } + +.components-resizable-box__side-handle.components-resizable-box__handle-top, +.components-resizable-box__side-handle.components-resizable-box__handle-bottom, +.components-resizable-box__side-handle.components-resizable-box__handle-top::before, +.components-resizable-box__side-handle.components-resizable-box__handle-bottom::before { + width: 100%; + right: 0; + border-right: 0; + border-left: 0; } + +.components-resizable-box__side-handle.components-resizable-box__handle-left, +.components-resizable-box__side-handle.components-resizable-box__handle-right, +.components-resizable-box__side-handle.components-resizable-box__handle-left::before, +.components-resizable-box__side-handle.components-resizable-box__handle-right::before { + height: 100%; + top: 0; + border-top: 0; + border-bottom: 0; } + +.components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, +.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, +.components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, +.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { + animation: components-resizable-box__top-bottom-animation 0.1s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, + .components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, + .components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, + .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { + animation-duration: 1ms; } } + +.components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, +.components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, +.components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, +.components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { + animation: components-resizable-box__left-right-animation 0.1s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, + .components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, + .components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, + .components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { + animation-duration: 1ms; } } + +@keyframes components-resizable-box__top-bottom-animation { + from { + transform: scaleX(0); + opacity: 0; } + to { + transform: scaleX(1); + opacity: 1; } } + +@keyframes components-resizable-box__left-right-animation { + from { + transform: scaleY(0); + opacity: 0; } + to { + transform: scaleY(1); + opacity: 1; } } +.components-resizable-box__handle-right { + right: calc(11.5px * -1); } + +.components-resizable-box__handle-left { + left: calc(11.5px * -1); } + +.components-resizable-box__handle-top { + top: calc(11.5px * -1); } + +.components-resizable-box__handle-bottom { + bottom: calc(11.5px * -1); } +.components-responsive-wrapper { + position: relative; + max-width: 100%; } + .components-responsive-wrapper, + .components-responsive-wrapper > span { + display: block; } + +.components-responsive-wrapper__content { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + width: 100%; + height: 100%; + margin: auto; } + +.components-sandbox { + overflow: hidden; } + +iframe.components-sandbox { + width: 100%; } + +html.lockscroll, +body.lockscroll { + overflow: hidden; } + +.components-select-control__input { + background: #fff; + height: 36px; + line-height: 36px; + margin: 1px; + outline: 0; + width: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important; } + @media (min-width: 782px) { + .components-select-control__input { + height: 28px; + line-height: 28px; } } + +@media (max-width: 782px) { + .components-base-control .components-base-control__field .components-select-control__input { + font-size: 16px; } } + +.components-snackbar { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + background-color: #32373c; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + color: #fff; + padding: 16px 24px; + width: 100%; + max-width: 600px; + box-sizing: border-box; + cursor: pointer; } + @media (min-width: 600px) { + .components-snackbar { + width: fit-content; } } + .components-snackbar:hover { + background-color: #191e23; } + .components-snackbar:focus { + background-color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007cba; } + +.components-snackbar__action.components-button { + margin-right: 32px; + color: #fff; + height: auto; + flex-shrink: 0; + line-height: 1.4; + padding: 0; } + .components-snackbar__action.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary) { + text-decoration: underline; + background-color: transparent; } + .components-snackbar__action.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):focus { + color: #fff; + box-shadow: none; + outline: 1px dotted #fff; } + .components-snackbar__action.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + color: #33b3db; } + +.components-snackbar__content { + display: flex; + align-items: baseline; + justify-content: space-between; + line-height: 1.4; } + +.components-snackbar-list { + position: absolute; + z-index: 100000; + width: 100%; + box-sizing: border-box; } + +.components-snackbar-list__notice-container { + position: relative; + padding-top: 8px; } + +.components-spinner { + display: inline-block; + background-color: #7e8993; + width: 18px; + height: 18px; + opacity: 0.7; + margin: 5px 11px 0; + border-radius: 100%; + position: relative; } + .components-spinner::before { + content: ""; + position: absolute; + background-color: #fff; + top: 3px; + left: 3px; + width: 4px; + height: 4px; + border-radius: 100%; + transform-origin: 6px 6px; + animation: components-spinner__animation 1s infinite linear; } + +@keyframes components-spinner__animation { + from { + transform: rotate(0deg); } + to { + transform: rotate(-360deg); } } + +.components-text-control__input { + width: 100%; + padding: 6px 8px; } + +.components-textarea-control__input { + width: 100%; + padding: 6px 8px; } + +.components-tip { + display: flex; + color: #555d66; } + .components-tip svg { + -ms-grid-row-align: center; + align-self: center; + fill: #f0b849; + flex-shrink: 0; + margin-left: 16px; } + .components-tip p { + margin: 0; } + +.components-toggle-control .components-base-control__field { + display: flex; + margin-bottom: 12px; + line-height: initial; + align-items: center; } + .components-toggle-control .components-base-control__field .components-form-toggle { + margin-left: 16px; } + .components-toggle-control .components-base-control__field .components-toggle-control__label { + display: block; } + +.components-accessible-toolbar { + display: inline-flex; + flex-shrink: 0; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .components-accessible-toolbar { + display: flex; } } + +.components-tab-button { + padding: 3px; + color: #555d66; + height: 36px; + font-weight: 500; } + .components-tab-button.is-pressed, .components-tab-button.is-pressed:hover { + color: #fff; } + .components-tab-button:disabled { + cursor: default; } + .components-tab-button > span { + border: 1px solid transparent; + padding: 0 6px; + box-sizing: content-box; + height: 28px; + line-height: 28px; } + .components-tab-button:hover > span, + .components-tab-button:focus > span { + color: #555d66; } + .components-tab-button:not(:disabled).is-pressed > span, + .components-tab-button:not(:disabled):hover > span, + .components-tab-button:not(:disabled):focus > span { + border: 1px solid #555d66; } + .components-tab-button.is-pressed > span, + .components-tab-button.is-pressed:hover > span { + background-color: #555d66; + color: #fff; } + +.components-toolbar__control.components-button { + width: 36px; + height: 36px; } + .components-toolbar__control.components-button[data-subscript] svg { + padding: 5px 0 5px 10px; } + .components-toolbar__control.components-button[data-subscript]::after { + content: attr(data-subscript); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + font-weight: 600; + line-height: 12px; + position: absolute; + left: 8px; + bottom: 10px; } + .components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]::after { + color: #fff; } + .components-toolbar__control.components-button.is-pressed { + padding: 3px; + outline: none; } + .components-toolbar__control.components-button.is-pressed > svg { + padding: 5px; + border-radius: 4px; + height: 30px; + width: 30px; + box-sizing: border-box; + outline: none; + color: #fff; + box-shadow: none; + background: #555d66; } + +.components-toolbar-group { + border: 1px solid #e2e4e7; + background-color: #fff; + display: flex; + flex-shrink: 0; + margin-left: -1px; + line-height: 0; } + .components-toolbar-group .components-toolbar-group { + border-width: 0; + margin: 0; } + +.components-toolbar { + margin: 0; + border: 1px solid #e2e4e7; + background-color: #fff; + display: flex; + flex-shrink: 0; } + +div.components-toolbar > div { + display: block; + margin: 0; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + div.components-toolbar > div { + display: flex; } } + +div.components-toolbar > div + div { + margin-right: -3px; } + div.components-toolbar > div + div.has-left-divider { + margin-right: 6px; + position: relative; + overflow: visible; } + div.components-toolbar > div + div.has-left-divider::before { + display: inline-block; + content: ""; + box-sizing: content-box; + background-color: #e2e4e7; + position: absolute; + top: 8px; + right: -3px; + width: 1px; + height: 20px; } + +.components-tooltip.components-popover { + z-index: 1000002; } + .components-tooltip.components-popover::before { + border-color: transparent; } + .components-tooltip.components-popover[data-y-axis="top"]::after { + border-top-color: #191e23; } + .components-tooltip.components-popover[data-y-axis="bottom"]::after { + border-bottom-color: #191e23; } + .components-tooltip.components-popover .components-popover__content { + min-width: 0; } + +.components-tooltip .components-popover__content { + padding: 4px 12px; + background: #191e23; + border-width: 0; + color: #fff; + white-space: nowrap; + text-align: center; } + +.components-tooltip__shortcut { + display: block; + color: #7e8993; } + +.components-visually-hidden { + 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; + width: 1px; + word-wrap: normal !important; } + +.components-visually-hidden:focus { + background-color: #e2e4e7; + clip: auto !important; + -webkit-clip-path: none; + clip-path: none; + color: #444; + display: block; + font-size: 1em; + height: auto; + right: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; } diff --git a/wp-includes/css/dist/components/style-rtl.min.css b/wp-includes/css/dist/components/style-rtl.min.css new file mode 100644 index 0000000..4e986e4 --- /dev/null +++ b/wp-includes/css/dist/components/style-rtl.min.css @@ -0,0 +1 @@ +.components-animate__appear{animation:components-animate__appear-animation .1s cubic-bezier(0,0,.2,1) 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__appear{animation-duration:1ms}}.components-animate__appear.is-from-top,.components-animate__appear.is-from-top.is-from-left{transform-origin:top right}.components-animate__appear.is-from-top.is-from-right{transform-origin:top left}.components-animate__appear.is-from-bottom,.components-animate__appear.is-from-bottom.is-from-left{transform-origin:bottom right}.components-animate__appear.is-from-bottom.is-from-right{transform-origin:bottom left}@keyframes components-animate__appear-animation{0%{transform:translateY(-2em) scaleY(0) scaleX(0)}to{transform:translateY(0) scaleY(1) scaleX(1)}}.components-animate__slide-in{animation:components-animate__slide-in-animation .1s cubic-bezier(0,0,.2,1);animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__slide-in{animation-duration:1ms}}.components-animate__slide-in.is-from-left{transform:translateX(-100%)}@keyframes components-animate__slide-in-animation{to{transform:translateX(0)}}.components-animate__loading{animation:components-animate__loading 1.6s ease-in-out infinite}@keyframes components-animate__loading{0%{opacity:.5}50%{opacity:1}to{opacity:.5}}.components-angle-picker-control{width:50%}.components-angle-picker-control.components-base-control .components-base-control__label{display:block}.components-angle-picker-control__input-field{width:calc(100% - 36px);max-width:100px}.components-angle-picker-control__angle-circle{width:28px;height:28px;border:2px solid #555d66;border-radius:50%;float:right;margin-left:4px;cursor:grab}.components-angle-picker-control__angle-circle-indicator-wrapper{position:relative;width:100%;height:100%}.components-angle-picker-control__angle-circle-indicator{width:1px;height:1px;border-radius:50%;border:3px solid #555d66;display:block;position:absolute;top:-14px;bottom:0;right:0;left:0;margin:auto;background:#555d66}.components-autocomplete__popover .components-popover__content{min-width:200px}.components-autocomplete__popover .components-autocomplete__results{padding:3px;display:flex;flex-direction:column;align-items:stretch}.components-autocomplete__popover .components-autocomplete__results:empty{display:none}.components-autocomplete__result.components-button{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;color:#555d66;display:flex;flex-direction:row;flex-grow:1;flex-shrink:0;align-items:center;padding:6px 8px;margin-right:-3px;margin-left:-3px;text-align:right}.components-autocomplete__result.components-button.is-selected{color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.components-autocomplete__result.components-button:hover{color:#191e23;border:none;box-shadow:none;background:#f3f4f5}.components-base-control{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-base-control .components-base-control__field{margin-bottom:8px}.components-panel__row .components-base-control .components-base-control__field{margin-bottom:inherit}.components-base-control .components-base-control__label{display:inline-block;margin-bottom:4px}.components-base-control .components-base-control__help{margin-top:-8px;font-style:italic}.components-base-control+.components-base-control{margin-bottom:16px}.components-button-group{display:inline-block}.components-button-group .components-button{border-radius:0;display:inline-flex}.components-button-group .components-button+.components-button{margin-right:-1px}.components-button-group .components-button:first-child{border-radius:0 3px 3px 0}.components-button-group .components-button:last-child{border-radius:3px 0 0 3px}.components-button-group .components-button.is-primary,.components-button-group .components-button:focus{position:relative;z-index:1}.components-button-group .components-button.is-primary{box-shadow:none}.components-button{display:inline-flex;text-decoration:none;font-size:13px;margin:0;border:0;cursor:pointer;-webkit-appearance:none;background:none;transition:box-shadow .1s linear;height:36px;align-items:center;box-sizing:border-box;padding:0 8px;overflow:hidden;border-radius:3px;color:#555d66}@media (prefers-reduced-motion:reduce){.components-button{transition-duration:0s}}.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-primary):not(.is-tertiary):not(.is-link):hover{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #555d66,inset 0 0 0 2px #fff}.components-button.is-secondary{white-space:nowrap;color:#0075af;border:1px solid #0075af;background:#f3f5f6}body.admin-color-sunrise .components-button.is-secondary{color:#c47e46;border-color:#c47e46}body.admin-color-ocean .components-button.is-secondary{color:#99ae98;border-color:#99ae98}body.admin-color-midnight .components-button.is-secondary{color:#d4483f;border-color:#d4483f}body.admin-color-ectoplasm .components-button.is-secondary{color:#9dab51;border-color:#9dab51}body.admin-color-coffee .components-button.is-secondary{color:#b69c84;border-color:#b69c84}body.admin-color-blue .components-button.is-secondary{color:#cca154;border-color:#cca154}body.admin-color-light .components-button.is-secondary{color:#007daf;border-color:#007daf}.components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{background:#f1f1f1;border-color:#005d8c;color:#005d8c;text-decoration:none}body.admin-color-sunrise .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#9d6538;color:#9d6538}body.admin-color-ocean .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#7a8b7a;color:#7a8b7a}body.admin-color-midnight .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#a93a32;color:#a93a32}body.admin-color-ectoplasm .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#7d8941;color:#7d8941}body.admin-color-coffee .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#927d69;color:#927d69}body.admin-color-blue .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#a38043;color:#a38043}body.admin-color-light .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#00648c;color:#00648c}.components-button.is-secondary:focus:enabled{background:#f3f5f6;color:#005d8c;border-color:#0076b1;box-shadow:0 0 0 1px #0076b1;text-decoration:none}body.admin-color-sunrise .components-button.is-secondary:focus:enabled{color:#9d6538;border-color:#c77f46;box-shadow:0 0 0 1px #c77f46}body.admin-color-ocean .components-button.is-secondary:focus:enabled{color:#7a8b7a;border-color:#9bb09a;box-shadow:0 0 0 1px #9bb09a}body.admin-color-midnight .components-button.is-secondary:focus:enabled{color:#a93a32;border-color:#d64940;box-shadow:0 0 0 1px #d64940}body.admin-color-ectoplasm .components-button.is-secondary:focus:enabled{color:#7d8941;border-color:#9fad52;box-shadow:0 0 0 1px #9fad52}body.admin-color-coffee .components-button.is-secondary:focus:enabled{color:#927d69;border-color:#b89e85;box-shadow:0 0 0 1px #b89e85}body.admin-color-blue .components-button.is-secondary:focus:enabled{color:#a38043;border-color:#cea255;box-shadow:0 0 0 1px #cea255}body.admin-color-light .components-button.is-secondary:focus:enabled{color:#00648c;border-color:#007eb1;box-shadow:0 0 0 1px #007eb1}.components-button.is-secondary:not([aria-disabled=true]):active:enabled{background:#f3f5f6;color:#0076b1;border-color:#7e8993;box-shadow:none}body.admin-color-sunrise .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#c77f46}body.admin-color-ocean .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#9bb09a}body.admin-color-midnight .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#d64940}body.admin-color-ectoplasm .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#9fad52}body.admin-color-coffee .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#b89e85}body.admin-color-blue .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#cea255}body.admin-color-light .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#007eb1}.components-button.is-secondary:disabled,.components-button.is-secondary[aria-disabled=true]{color:#a0a5aa;border-color:#ddd;background:#f7f7f7;text-shadow:0 1px 0 #fff;transform:none;opacity:1}.components-button.is-primary{white-space:nowrap;background:#007cba;border:1px solid #007cba;color:#fff;text-decoration:none;text-shadow:none}body.admin-color-sunrise .components-button.is-primary{background:#d1864a;border-color:#d1864a}body.admin-color-ocean .components-button.is-primary{background:#a3b9a2;border-color:#a3b9a2}body.admin-color-midnight .components-button.is-primary{background:#e14d43;border-color:#e14d43}body.admin-color-ectoplasm .components-button.is-primary{background:#a7b656;border-color:#a7b656}body.admin-color-coffee .components-button.is-primary{background:#c2a68c;border-color:#c2a68c}body.admin-color-blue .components-button.is-primary{background:#d9ab59;border-color:#d9ab59}body.admin-color-light .components-button.is-primary{background:#0085ba;border-color:#0085ba}.components-button.is-primary:focus:enabled,.components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#0070a7;border-color:#0070a7;color:#fff}body.admin-color-sunrise .components-button.is-primary:focus:enabled,body.admin-color-sunrise .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#bc7943;border-color:#bc7943}body.admin-color-ocean .components-button.is-primary:focus:enabled,body.admin-color-ocean .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#93a792;border-color:#93a792}body.admin-color-midnight .components-button.is-primary:focus:enabled,body.admin-color-midnight .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#cb453c;border-color:#cb453c}body.admin-color-ectoplasm .components-button.is-primary:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#96a44d;border-color:#96a44d}body.admin-color-coffee .components-button.is-primary:focus:enabled,body.admin-color-coffee .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#af957e;border-color:#af957e}body.admin-color-blue .components-button.is-primary:focus:enabled,body.admin-color-blue .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#c39a50;border-color:#c39a50}body.admin-color-light .components-button.is-primary:focus:enabled,body.admin-color-light .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#0078a7;border-color:#0078a7}.components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}body.admin-color-sunrise .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #d1864a}body.admin-color-ocean .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b9a2}body.admin-color-midnight .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}body.admin-color-ectoplasm .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #a7b656}body.admin-color-coffee .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #c2a68c}body.admin-color-blue .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #d9ab59}body.admin-color-light .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #0085ba}.components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#006395;border-color:#006395;color:#fff}body.admin-color-sunrise .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#a76b3b;border-color:#a76b3b}body.admin-color-ocean .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#829482;border-color:#829482}body.admin-color-midnight .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#b43e36;border-color:#b43e36}body.admin-color-ectoplasm .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#869245;border-color:#869245}body.admin-color-coffee .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#9b8570;border-color:#9b8570}body.admin-color-blue .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#ae8947;border-color:#ae8947}body.admin-color-light .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#006a95;border-color:#006a95}.components-button.is-primary:disabled,.components-button.is-primary:disabled:active:enabled,.components-button.is-primary[aria-disabled=true],.components-button.is-primary[aria-disabled=true]:active:enabled,.components-button.is-primary[aria-disabled=true]:enabled{color:#66b0d6;background:#1989c1;border-color:#1989c1;opacity:1}body.admin-color-sunrise .components-button.is-primary:disabled,body.admin-color-sunrise .components-button.is-primary:disabled:active:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true],body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:enabled{color:#e3b692;background:#d6925c;border-color:#d6925c}body.admin-color-ocean .components-button.is-primary:disabled,body.admin-color-ocean .components-button.is-primary:disabled:active:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true],body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:enabled{color:#c8d5c7;background:#acc0ab;border-color:#acc0ab}body.admin-color-midnight .components-button.is-primary:disabled,body.admin-color-midnight .components-button.is-primary:disabled:active:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true],body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:enabled{color:#ed948e;background:#e45f56;border-color:#e45f56}body.admin-color-ectoplasm .components-button.is-primary:disabled,body.admin-color-ectoplasm .components-button.is-primary:disabled:active:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true],body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:enabled{color:#cad39a;background:#b0bd67;border-color:#b0bd67}body.admin-color-coffee .components-button.is-primary:disabled,body.admin-color-coffee .components-button.is-primary:disabled:active:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true],body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:enabled{color:#dacaba;background:#c8af98;border-color:#c8af98}body.admin-color-blue .components-button.is-primary:disabled,body.admin-color-blue .components-button.is-primary:disabled:active:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true],body.admin-color-blue .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true]:enabled{color:#e8cd9b;background:#ddb36a;border-color:#ddb36a}body.admin-color-light .components-button.is-primary:disabled,body.admin-color-light .components-button.is-primary:disabled:active:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true],body.admin-color-light .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true]:enabled{color:#66b6d6;background:#1991c1;border-color:#1991c1}.components-button.is-primary:disabled:active:enabled:focus:enabled,.components-button.is-primary:disabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}body.admin-color-sunrise .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-sunrise .components-button.is-primary:disabled:focus:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #d1864a}body.admin-color-ocean .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-ocean .components-button.is-primary:disabled:focus:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b9a2}body.admin-color-midnight .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-midnight .components-button.is-primary:disabled:focus:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}body.admin-color-ectoplasm .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary:disabled:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #a7b656}body.admin-color-coffee .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-coffee .components-button.is-primary:disabled:focus:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #c2a68c}body.admin-color-blue .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-blue .components-button.is-primary:disabled:focus:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #d9ab59}body.admin-color-light .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-light .components-button.is-primary:disabled:focus:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #0085ba}.components-button.is-primary.is-busy,.components-button.is-primary.is-busy:disabled,.components-button.is-primary.is-busy[aria-disabled=true]{color:#fff;background-size:100px 100%;background-image:linear-gradient(45deg,#007cba 28%,#006395 0,#006395 72%,#007cba 0);border-color:#007cba}body.admin-color-sunrise .components-button.is-primary.is-busy,body.admin-color-sunrise .components-button.is-primary.is-busy:disabled,body.admin-color-sunrise .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(45deg,#d1864a 28%,#a76b3b 0,#a76b3b 72%,#d1864a 0);border-color:#d1864a}body.admin-color-ocean .components-button.is-primary.is-busy,body.admin-color-ocean .components-button.is-primary.is-busy:disabled,body.admin-color-ocean .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(45deg,#a3b9a2 28%,#829482 0,#829482 72%,#a3b9a2 0);border-color:#a3b9a2}body.admin-color-midnight .components-button.is-primary.is-busy,body.admin-color-midnight .components-button.is-primary.is-busy:disabled,body.admin-color-midnight .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(45deg,#e14d43 28%,#b43e36 0,#b43e36 72%,#e14d43 0);border-color:#e14d43}body.admin-color-ectoplasm .components-button.is-primary.is-busy,body.admin-color-ectoplasm .components-button.is-primary.is-busy:disabled,body.admin-color-ectoplasm .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(45deg,#a7b656 28%,#869245 0,#869245 72%,#a7b656 0);border-color:#a7b656}body.admin-color-coffee .components-button.is-primary.is-busy,body.admin-color-coffee .components-button.is-primary.is-busy:disabled,body.admin-color-coffee .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(45deg,#c2a68c 28%,#9b8570 0,#9b8570 72%,#c2a68c 0);border-color:#c2a68c}body.admin-color-blue .components-button.is-primary.is-busy,body.admin-color-blue .components-button.is-primary.is-busy:disabled,body.admin-color-blue .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(45deg,#d9ab59 28%,#ae8947 0,#ae8947 72%,#d9ab59 0);border-color:#d9ab59}body.admin-color-light .components-button.is-primary.is-busy,body.admin-color-light .components-button.is-primary.is-busy:disabled,body.admin-color-light .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(45deg,#0085ba 28%,#006a95 0,#006a95 72%,#0085ba 0);border-color:#0085ba}.components-button.is-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:none;outline:none;text-align:right;color:#0073aa;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out;height:auto}@media (prefers-reduced-motion:reduce){.components-button.is-link{transition-duration:0s}}.components-button.is-link:not(:disabled):not([aria-disabled=true]):hover,.components-button.is-link:not([aria-disabled=true]):active{color:#00a0d2}.components-button.is-link:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.components-button.is-link.is-destructive{color:#d94f4f}.components-button:not([aria-disabled=true]):active{color:inherit}.components-button:disabled,.components-button[aria-disabled=true]{cursor:default;opacity:.3}.components-button:focus:not(:disabled){background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{animation:components-button__busy-animation 2.5s linear infinite;background-size:100px 100%;background-image:repeating-linear-gradient(45deg,#e2e4e7,#fff 11px,#fff 0,#e2e4e7 20px);opacity:1}.components-button.is-small{height:24px;line-height:22px;padding:0 8px;font-size:11px}.components-button.is-tertiary{color:#007cba}body.admin-color-sunrise .components-button.is-tertiary{color:#837425}body.admin-color-ocean .components-button.is-tertiary{color:#5e7d5e}body.admin-color-midnight .components-button.is-tertiary{color:#497b8d}body.admin-color-ectoplasm .components-button.is-tertiary{color:#523f6d}body.admin-color-coffee .components-button.is-tertiary{color:#59524c}body.admin-color-blue .components-button.is-tertiary{color:#417e9b}body.admin-color-light .components-button.is-tertiary{color:#007cba}.components-button.is-tertiary .dashicon{display:inline-block;flex:0 0 auto}.components-button.is-tertiary:not([aria-disabled=true]):active:focus:enabled{box-shadow:none}.components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#005d8c}body.admin-color-sunrise .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#62571c}body.admin-color-ocean .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#475e47}body.admin-color-midnight .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#375c6a}body.admin-color-ectoplasm .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#3e2f52}body.admin-color-coffee .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#433e39}body.admin-color-blue .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#315f74}body.admin-color-light .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#005d8c}.components-button.has-icon .dashicon{display:inline-block;flex:0 0 auto}.components-button.has-icon.has-text svg{margin-left:8px}.components-button svg{fill:currentColor;outline:none}.components-button .screen-reader-text{height:auto}@keyframes components-button__busy-animation{0%{background-position:200px 0}}.components-checkbox-control__input[type=checkbox]{border:1px solid #b4b9be;background:#fff;color:#555;clear:none;cursor:pointer;display:inline-block;line-height:0;margin:0 0 0 4px;outline:0;padding:0!important;text-align:center;vertical-align:top;width:25px;height:25px;-webkit-appearance:none;box-shadow:inset 0 1px 2px rgba(0,0,0,.1);transition:border-color .05s ease-in-out}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{height:16px;width:16px}}.components-checkbox-control__input[type=checkbox]:focus{border-color:#5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8);outline:2px solid transparent}.components-checkbox-control__input[type=checkbox]:checked{background:#11a0d2;border-color:#11a0d2}.components-checkbox-control__input[type=checkbox]:checked::-ms-check{opacity:0}.components-checkbox-control__input[type=checkbox]:focus:checked{border:none}.components-checkbox-control__input[type=checkbox]:checked:before{content:none}.components-checkbox-control__input-container{position:relative;display:inline-block;margin-left:12px;vertical-align:middle;width:25px;height:25px}@media (min-width:600px){.components-checkbox-control__input-container{width:16px;height:16px}}svg.components-checkbox-control__checked{fill:#fff;cursor:pointer;position:absolute;right:-4px;top:-2px;width:31px;height:31px;-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}@media (min-width:600px){svg.components-checkbox-control__checked{width:21px;height:21px;right:-3px}}.components-circular-option-picker{display:inline-block;margin-top:.6rem;width:100%}.components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper{display:flex;justify-content:flex-end}.components-circular-option-picker__option-wrapper{display:inline-block;height:28px;width:28px;margin-left:12px;margin-bottom:12px;vertical-align:top;transform:scale(1);transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option-wrapper{transition-duration:0s}}.components-circular-option-picker__option-wrapper:hover{transform:scale(1.2)}.components-circular-option-picker__option-wrapper>div{height:100%;width:100%}.components-circular-option-picker__option-wrapper:before{content:"";position:absolute;top:1px;right:1px;bottom:1px;left:1px;border-radius:50%;z-index:-1;background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='28' height='28' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 8V6H4v2h2zm2 0V6h2v2H8zm2 8H8v-2h2v2zm2 0v-2h2v2h-2zm0 2v-2h-2v2H8v2h2v-2h2zm2 0v2h-2v-2h2zm2 0h-2v-2h2v2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2v2zm-2-4v-2h2v2h-2z' fill='%23555D65'/%3E%3Cpath d='M18 18v2h-2v-2h2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2H8zm0 2v-2H6v2h2zm2 0v-2h2v2h-2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2h-2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4V0zm0 4V2H2v2h2zm2 0V2h2v2H6zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2H6z' fill='%23555D65'/%3E%3C/svg%3E")}.components-circular-option-picker__option{display:inline-block;vertical-align:top;height:100%;width:100%;border:none;border-radius:50%;background:transparent;box-shadow:inset 0 0 0 14px;transition:box-shadow .1s ease;cursor:pointer}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option{transition-duration:0s}}.components-circular-option-picker__option:hover{box-shadow:inset 0 0 0 14px!important}.components-circular-option-picker__option.is-pressed{box-shadow:inset 0 0 0 4px;position:relative;z-index:1}.components-circular-option-picker__option.is-pressed+svg{position:absolute;right:2px;top:2px;border-radius:50%;z-index:2;background:#fff;pointer-events:none}.components-circular-option-picker__option:after{content:"";position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);border:1px solid transparent}.components-circular-option-picker__option:focus:after{content:"";border:2px solid #606a73;width:32px;height:32px;position:absolute;top:-2px;right:-2px;border-radius:50%;box-shadow:inset 0 0 0 2px #fff}.components-circular-option-picker__option.components-button:focus{background-color:transparent;box-shadow:inset 0 0 0 14px;outline:none}.components-circular-option-picker__button-action .components-circular-option-picker__option{color:#fff;background:#fff}.components-circular-option-picker__dropdown-link-action{margin-left:16px}.components-circular-option-picker__dropdown-link-action .components-button{line-height:22px}.component-color-indicator{width:25px;height:16px;margin-right:.8rem;border:1px solid #dadada;display:inline-block}.component-color-indicator+.component-color-indicator{margin-right:.5rem}.components-color-picker{width:100%;overflow:hidden}.components-color-picker *{box-sizing:border-box}.components-color-picker__saturation{width:100%;padding-bottom:55%;position:relative}.components-color-picker__body{padding:16px 16px 12px}.components-color-picker__controls{display:flex}.components-color-picker__alpha-pointer,.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{padding:0;position:absolute;cursor:pointer;box-shadow:none;border:none}.components-color-picker__swatch{margin-left:8px;width:32px;height:32px;border-radius:50%;position:relative;overflow:hidden;background-image:linear-gradient(-45deg,#ddd 25%,transparent 0),linear-gradient(45deg,#ddd 25%,transparent 0),linear-gradient(-45deg,transparent 75%,#ddd 0),linear-gradient(45deg,transparent 75%,#ddd 0);background-size:10px 10px;background-position:100% 0,100% 5px,5px -5px,-5px 0}.is-alpha-disabled .components-color-picker__swatch{width:12px;height:12px;margin-top:0}.components-color-picker__active{border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);z-index:2}.components-color-picker__active,.components-color-picker__saturation-black,.components-color-picker__saturation-color,.components-color-picker__saturation-white{position:absolute;top:0;right:0;left:0;bottom:0}.components-color-picker__saturation-color{overflow:hidden}.components-color-picker__saturation-white{background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.components-color-picker__saturation-black{background:linear-gradient(0deg,#000,transparent)}.components-color-picker__saturation-pointer{width:14px;height:14px;padding:0;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;background-color:transparent;transform:translate(4px,-4px)}.components-color-picker__toggles{flex:1}.components-color-picker__alpha{background-image:linear-gradient(-45deg,#ddd 25%,transparent 0),linear-gradient(45deg,#ddd 25%,transparent 0),linear-gradient(-45deg,transparent 75%,#ddd 0),linear-gradient(45deg,transparent 75%,#ddd 0);background-size:10px 10px;background-position:100% 0,100% 5px,5px -5px,-5px 0}.components-color-picker__alpha-gradient,.components-color-picker__hue-gradient{position:absolute;top:0;right:0;left:0;bottom:0}.components-color-picker__alpha,.components-color-picker__hue{height:12px;position:relative}.is-alpha-enabled .components-color-picker__hue{margin-bottom:8px}.components-color-picker__alpha-bar,.components-color-picker__hue-bar{position:relative;margin:0 3px;height:100%;padding:0 2px}.components-color-picker__hue-gradient{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.components-color-picker__alpha-pointer,.components-color-picker__hue-pointer{left:0;width:14px;height:14px;border-radius:50%;box-shadow:0 1px 4px 0 rgba(0,0,0,.37);background:#fff;transform:translate(7px,-1px)}.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{transition-duration:0s}}.components-color-picker__saturation-pointer:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #00a0d2,0 0 5px 0 #00a0d2,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4)}.components-color-picker__alpha-pointer:focus,.components-color-picker__hue-pointer:focus{border-color:#00a0d2;box-shadow:0 0 0 2px #00a0d2,0 0 3px 0 #00a0d2;outline:2px solid transparent;outline-offset:-2px}.components-color-picker__inputs-wrapper{margin:0 -4px;padding-top:16px;display:flex;align-items:flex-end}.components-color-picker__inputs-wrapper fieldset{flex:1;border:none;margin:0;padding:0}.components-color-picker__inputs-wrapper .components-color-picker__inputs-fields .components-text-control__input[type=number]{padding:6px 8px}.components-color-picker__inputs-field{width:100%}.components-color-picker__inputs-fields{display:flex;direction:ltr;flex-grow:1;margin-left:4px}.components-color-picker__inputs-fields .components-base-control+.components-base-control{margin-bottom:0}.components-color-picker__inputs-fields .components-base-control__field{margin:0 4px}.components-color-picker__inputs-toggle{height:30px;padding:0 5px}.components-custom-gradient-picker{margin-top:8px}.components-custom-gradient-picker__gradient-bar:not(.has-gradient){opacity:.4}.components-custom-gradient-picker__gradient-bar{width:100%;height:24px;border-radius:24px;margin-bottom:16px;padding-right:3px;padding-left:21px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container{position:relative}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point{border-radius:50%;background:#fff;padding:2px;min-width:24px;width:24px;height:24px;position:relative}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point svg{height:100%;width:100%}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button{border:2px solid #fff;border-radius:50%;height:18px;padding:0;position:absolute;width:18px;top:3px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active{background:#fafafa;color:#23282d;border-color:#999;box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}.components-custom-gradient-picker__color-picker-popover .components-custom-gradient-picker__remove-control-point{margin-right:auto;margin-left:auto;display:block;margin-bottom:8px}.components-custom-gradient-picker__inserter{width:100%}.components-custom-gradient-picker__liner-gradient-indicator{display:inline-block;flex:0 auto;width:20px;height:20px}.components-custom-gradient-picker__ui-line{display:flex;justify-content:space-between}.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-angle-picker,.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-custom-gradient-picker__type-picker{margin-bottom:0}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar{border:none}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar>div+div{margin-right:1px}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed>svg{background:#fff;border:1px solid #7e8993;border-radius:2px}.components-custom-select-control{color:#555d66;position:relative}.components-custom-select-control__label{display:block;margin-bottom:5px}.components-custom-select-control__button{border:1px solid #7e8993;border-radius:4px;color:#555d66;display:inline;min-height:30px;min-width:130px;position:relative;text-align:right}.components-custom-select-control__button:focus{border-color:#00a0d2}.components-custom-select-control__button-icon{height:100%;padding:0 4px;position:absolute;left:0;top:0}.components-custom-select-control__menu{background:#fff;max-height:400px;min-width:100%;overflow:auto;padding:0;position:absolute;z-index:1000000}.components-custom-select-control__item{align-items:center;display:flex;list-style-type:none;padding:10px 25px 10px 5px}.components-custom-select-control__item.is-highlighted{background:#e2e4e7}.components-custom-select-control__item-icon{margin-right:-20px;margin-left:0}svg.dashicon{fill:currentColor;outline:none}.PresetDateRangePicker_panel{padding:0 22px 11px}.PresetDateRangePicker_button{position:relative;height:100%;text-align:center;background:0 0;border:2px solid #00a699;color:#00a699;padding:4px 12px;margin-right:8px;font:inherit;font-weight:700;line-height:normal;overflow:visible;box-sizing:border-box;cursor:pointer}.PresetDateRangePicker_button:active{outline:0}.PresetDateRangePicker_button__selected{color:#fff;background:#00a699}.SingleDatePickerInput{display:inline-block;background-color:#fff}.SingleDatePickerInput__withBorder{border-radius:2px;border:1px solid #dbdbdb}.SingleDatePickerInput__rtl{direction:rtl}.SingleDatePickerInput__disabled{background-color:#f2f2f2}.SingleDatePickerInput__block{display:block}.SingleDatePickerInput__showClearDate{padding-right:30px}.SingleDatePickerInput_clearDate{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;padding:10px;margin:0 10px 0 5px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.SingleDatePickerInput_clearDate__default:focus,.SingleDatePickerInput_clearDate__default:hover{background:#dbdbdb;border-radius:50%}.SingleDatePickerInput_clearDate__small{padding:6px}.SingleDatePickerInput_clearDate__hide{visibility:hidden}.SingleDatePickerInput_clearDate_svg{fill:#82888a;height:12px;width:15px;vertical-align:middle}.SingleDatePickerInput_clearDate_svg__small{height:9px}.SingleDatePickerInput_calendarIcon{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;display:inline-block;vertical-align:middle;padding:10px;margin:0 5px 0 10px}.SingleDatePickerInput_calendarIcon_svg{fill:#82888a;height:15px;width:14px;vertical-align:middle}.SingleDatePicker{position:relative;display:inline-block}.SingleDatePicker__block{display:block}.SingleDatePicker_picker{z-index:1;background-color:#fff;position:absolute}.SingleDatePicker_picker__rtl{direction:rtl}.SingleDatePicker_picker__directionLeft{left:0}.SingleDatePicker_picker__directionRight{right:0}.SingleDatePicker_picker__portal{background-color:rgba(0,0,0,.3);position:fixed;top:0;left:0;height:100%;width:100%}.SingleDatePicker_picker__fullScreenPortal{background-color:#fff}.SingleDatePicker_closeButton{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;position:absolute;top:0;right:0;padding:15px;z-index:2}.SingleDatePicker_closeButton:focus,.SingleDatePicker_closeButton:hover{color:#b0b3b4;text-decoration:none}.SingleDatePicker_closeButton_svg{height:15px;width:15px;fill:#cacccd}.DayPickerKeyboardShortcuts_buttonReset{background:0 0;border:0;border-radius:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;cursor:pointer;font-size:14px}.DayPickerKeyboardShortcuts_buttonReset:active{outline:0}.DayPickerKeyboardShortcuts_show{width:22px;position:absolute;z-index:2}.DayPickerKeyboardShortcuts_show__bottomRight{border-top:26px solid transparent;border-right:33px solid #00a699;bottom:0;right:0}.DayPickerKeyboardShortcuts_show__bottomRight:hover{border-right:33px solid #008489}.DayPickerKeyboardShortcuts_show__topRight{border-bottom:26px solid transparent;border-right:33px solid #00a699;top:0;right:0}.DayPickerKeyboardShortcuts_show__topRight:hover{border-right:33px solid #008489}.DayPickerKeyboardShortcuts_show__topLeft{border-bottom:26px solid transparent;border-left:33px solid #00a699;top:0;left:0}.DayPickerKeyboardShortcuts_show__topLeft:hover{border-left:33px solid #008489}.DayPickerKeyboardShortcuts_showSpan{color:#fff;position:absolute}.DayPickerKeyboardShortcuts_showSpan__bottomRight{bottom:0;right:-28px}.DayPickerKeyboardShortcuts_showSpan__topRight{top:1px;right:-28px}.DayPickerKeyboardShortcuts_showSpan__topLeft{top:1px;left:-28px}.DayPickerKeyboardShortcuts_panel{overflow:auto;background:#fff;border:1px solid #dbdbdb;border-radius:2px;position:absolute;top:0;bottom:0;right:0;left:0;z-index:2;padding:22px;margin:33px}.DayPickerKeyboardShortcuts_title{font-size:16px;font-weight:700;margin:0}.DayPickerKeyboardShortcuts_list{list-style:none;padding:0;font-size:14px}.DayPickerKeyboardShortcuts_close{position:absolute;right:22px;top:22px;z-index:2}.DayPickerKeyboardShortcuts_close:active{outline:0}.DayPickerKeyboardShortcuts_closeSvg{height:15px;width:15px;fill:#cacccd}.DayPickerKeyboardShortcuts_closeSvg:focus,.DayPickerKeyboardShortcuts_closeSvg:hover{fill:#82888a}.CalendarDay{box-sizing:border-box;cursor:pointer;font-size:14px;text-align:center}.CalendarDay:active{outline:0}.CalendarDay__defaultCursor{cursor:default}.CalendarDay__default{border:1px solid #e4e7e7;color:#484848;background:#fff}.CalendarDay__default:hover{background:#e4e7e7;border:1px double #e4e7e7;color:inherit}.CalendarDay__hovered_offset{background:#f4f5f5;border:1px double #e4e7e7;color:inherit}.CalendarDay__outside{border:0;background:#fff;color:#484848}.CalendarDay__outside:hover{border:0}.CalendarDay__blocked_minimum_nights{background:#fff;border:1px solid #eceeee;color:#cacccd}.CalendarDay__blocked_minimum_nights:active,.CalendarDay__blocked_minimum_nights:hover{background:#fff;color:#cacccd}.CalendarDay__highlighted_calendar{background:#ffe8bc;color:#484848}.CalendarDay__highlighted_calendar:active,.CalendarDay__highlighted_calendar:hover{background:#ffce71;color:#484848}.CalendarDay__selected_span{background:#66e2da;border:1px solid #33dacd;color:#fff}.CalendarDay__selected_span:active,.CalendarDay__selected_span:hover{background:#33dacd;border:1px solid #33dacd;color:#fff}.CalendarDay__last_in_range{border-right:#00a699}.CalendarDay__selected,.CalendarDay__selected:active,.CalendarDay__selected:hover{background:#00a699;border:1px solid #00a699;color:#fff}.CalendarDay__hovered_span,.CalendarDay__hovered_span:hover{background:#b2f1ec;border:1px solid #80e8e0;color:#007a87}.CalendarDay__hovered_span:active{background:#80e8e0;border:1px solid #80e8e0;color:#007a87}.CalendarDay__blocked_calendar,.CalendarDay__blocked_calendar:active,.CalendarDay__blocked_calendar:hover{background:#cacccd;border:1px solid #cacccd;color:#82888a}.CalendarDay__blocked_out_of_range,.CalendarDay__blocked_out_of_range:active,.CalendarDay__blocked_out_of_range:hover{background:#fff;border:1px solid #e4e7e7;color:#cacccd}.CalendarMonth{background:#fff;text-align:center;vertical-align:top;-webkit-user-select:none;-ms-user-select:none;user-select:none}.CalendarMonth_table{border-collapse:collapse;border-spacing:0}.CalendarMonth_verticalSpacing{border-collapse:separate}.CalendarMonth_caption{color:#484848;font-size:18px;text-align:center;padding-top:22px;padding-bottom:37px;caption-side:top}.CalendarMonth_caption__verticalScrollable{padding-top:12px;padding-bottom:7px}.CalendarMonthGrid{background:#fff;text-align:left;z-index:0}.CalendarMonthGrid__animating{z-index:1}.CalendarMonthGrid__horizontal{position:absolute;left:9px}.CalendarMonthGrid__vertical{margin:0 auto}.CalendarMonthGrid__vertical_scrollable{margin:0 auto;overflow-y:scroll}.CalendarMonthGrid_month__horizontal{display:inline-block;vertical-align:top;min-height:100%}.CalendarMonthGrid_month__hideForAnimation{position:absolute;z-index:-1;opacity:0;pointer-events:none}.CalendarMonthGrid_month__hidden{visibility:hidden}.DayPickerNavigation{position:relative;z-index:2}.DayPickerNavigation__horizontal{height:0}.DayPickerNavigation__verticalDefault{position:absolute;width:100%;height:52px;bottom:0;left:0}.DayPickerNavigation__verticalScrollableDefault{position:relative}.DayPickerNavigation_button{cursor:pointer;-webkit-user-select:none;-ms-user-select:none;user-select:none;border:0;padding:0;margin:0}.DayPickerNavigation_button__default{border:1px solid #e4e7e7;background-color:#fff;color:#757575}.DayPickerNavigation_button__default:focus,.DayPickerNavigation_button__default:hover{border:1px solid #c4c4c4}.DayPickerNavigation_button__default:active{background:#f2f2f2}.DayPickerNavigation_button__horizontalDefault{position:absolute;top:18px;line-height:.78;border-radius:3px;padding:6px 9px}.DayPickerNavigation_leftButton__horizontalDefault{left:22px}.DayPickerNavigation_rightButton__horizontalDefault{right:22px}.DayPickerNavigation_button__verticalDefault{padding:5px;background:#fff;box-shadow:0 0 5px 2px rgba(0,0,0,.1);position:relative;display:inline-block;height:100%;width:50%}.DayPickerNavigation_nextButton__verticalDefault{border-left:0}.DayPickerNavigation_nextButton__verticalScrollableDefault{width:100%}.DayPickerNavigation_svg__horizontal{height:19px;width:19px;fill:#82888a;display:block}.DayPickerNavigation_svg__vertical{height:42px;width:42px;fill:#484848;display:block}.DayPicker{position:relative;text-align:left}.DayPicker,.DayPicker__horizontal{background:#fff}.DayPicker__verticalScrollable{height:100%}.DayPicker__hidden{visibility:hidden}.DayPicker__withBorder{box-shadow:0 2px 6px rgba(0,0,0,.05),0 0 0 1px rgba(0,0,0,.07);border-radius:3px}.DayPicker_portal__horizontal{box-shadow:none;position:absolute;left:50%;top:50%}.DayPicker_portal__vertical{position:static}.DayPicker_focusRegion{outline:0}.DayPicker_calendarInfo__horizontal,.DayPicker_wrapper__horizontal{display:inline-block;vertical-align:top}.DayPicker_weekHeaders{position:relative}.DayPicker_weekHeaders__horizontal{margin-left:9px}.DayPicker_weekHeader{color:#757575;position:absolute;top:62px;z-index:2;text-align:left}.DayPicker_weekHeader__vertical{left:50%}.DayPicker_weekHeader__verticalScrollable{top:0;display:table-row;border-bottom:1px solid #dbdbdb;background:#fff;margin-left:0;left:0;width:100%;text-align:center}.DayPicker_weekHeader_ul{list-style:none;margin:1px 0;padding-left:0;padding-right:0;font-size:14px}.DayPicker_weekHeader_li{display:inline-block;text-align:center}.DayPicker_transitionContainer{position:relative;overflow:hidden;border-radius:3px}.DayPicker_transitionContainer__horizontal{transition:height .2s ease-in-out}.DayPicker_transitionContainer__vertical{width:100%}.DayPicker_transitionContainer__verticalScrollable{padding-top:20px;height:100%;position:absolute;top:0;bottom:0;right:0;left:0;overflow-y:scroll}.DateInput{margin:0;padding:0;background:#fff;position:relative;display:inline-block;width:130px;vertical-align:middle}.DateInput__small{width:97px}.DateInput__block{width:100%}.DateInput__disabled{background:#f2f2f2;color:#dbdbdb}.DateInput_input{font-weight:200;font-size:19px;line-height:24px;color:#484848;background-color:#fff;width:100%;padding:11px 11px 9px;border:0;border-bottom:2px solid transparent;border-radius:0}.DateInput_input__small{font-size:15px;line-height:18px;letter-spacing:.2px;padding:7px 7px 5px}.DateInput_input__regular{font-weight:auto}.DateInput_input__readOnly{-webkit-user-select:none;-ms-user-select:none;user-select:none}.DateInput_input__focused{outline:0;background:#fff;border:0;border-bottom:2px solid #008489}.DateInput_input__disabled{background:#f2f2f2;font-style:italic}.DateInput_screenReaderMessage{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.DateInput_fang{position:absolute;width:20px;height:10px;left:22px;z-index:2}.DateInput_fangShape{fill:#fff}.DateInput_fangStroke{stroke:#dbdbdb;fill:transparent}.DateRangePickerInput{background-color:#fff;display:inline-block}.DateRangePickerInput__disabled{background:#f2f2f2}.DateRangePickerInput__withBorder{border-radius:2px;border:1px solid #dbdbdb}.DateRangePickerInput__rtl{direction:rtl}.DateRangePickerInput__block{display:block}.DateRangePickerInput__showClearDates{padding-right:30px}.DateRangePickerInput_arrow{display:inline-block;vertical-align:middle;color:#484848}.DateRangePickerInput_arrow_svg{vertical-align:middle;fill:#484848;height:24px;width:24px}.DateRangePickerInput_clearDates{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;padding:10px;margin:0 10px 0 5px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.DateRangePickerInput_clearDates__small{padding:6px}.DateRangePickerInput_clearDates_default:focus,.DateRangePickerInput_clearDates_default:hover{background:#dbdbdb;border-radius:50%}.DateRangePickerInput_clearDates__hide{visibility:hidden}.DateRangePickerInput_clearDates_svg{fill:#82888a;height:12px;width:15px;vertical-align:middle}.DateRangePickerInput_clearDates_svg__small{height:9px}.DateRangePickerInput_calendarIcon{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;display:inline-block;vertical-align:middle;padding:10px;margin:0 5px 0 10px}.DateRangePickerInput_calendarIcon_svg{fill:#82888a;height:15px;width:14px;vertical-align:middle}.DateRangePicker{position:relative;display:inline-block}.DateRangePicker__block{display:block}.DateRangePicker_picker{z-index:1;background-color:#fff;position:absolute}.DateRangePicker_picker__rtl{direction:rtl}.DateRangePicker_picker__directionLeft{left:0}.DateRangePicker_picker__directionRight{right:0}.DateRangePicker_picker__portal{background-color:rgba(0,0,0,.3);position:fixed;top:0;left:0;height:100%;width:100%}.DateRangePicker_picker__fullScreenPortal{background-color:#fff}.DateRangePicker_closeButton{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;position:absolute;top:0;right:0;padding:15px;z-index:2}.DateRangePicker_closeButton:focus,.DateRangePicker_closeButton:hover{color:#b0b3b4;text-decoration:none}.DateRangePicker_closeButton_svg{height:15px;width:15px;fill:#cacccd}.components-datetime,.components-datetime .components-datetime__calendar-help{padding:16px}.components-datetime .components-datetime__calendar-help h4{margin:0}.components-datetime .components-datetime__date-help-button{display:block;margin-right:auto}.components-datetime fieldset{border:0;padding:0;margin:0}.components-datetime input,.components-datetime select{box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:4px;border:1px solid #7e8993}@media (prefers-reduced-motion:reduce){.components-datetime input,.components-datetime select{transition-duration:0s}}.components-datetime .components-button,.components-datetime input[type=number],.components-datetime select{height:30px;margin-top:0;margin-bottom:0}.components-datetime__date{min-height:236px;border-top:1px solid #e2e4e7}.components-datetime__date .DayPickerNavigation_leftButton__horizontalDefault{right:0}.components-datetime__date .CalendarMonth_caption{font-size:13px}.components-datetime__date .CalendarDay{font-size:13px;border:1px solid transparent;border-radius:50%;text-align:center}.components-datetime__date .CalendarDay__selected{background:#0085ba}body.admin-color-sunrise .components-datetime__date .CalendarDay__selected{background:#d1864a}body.admin-color-ocean .components-datetime__date .CalendarDay__selected{background:#a3b9a2}body.admin-color-midnight .components-datetime__date .CalendarDay__selected{background:#e14d43}body.admin-color-ectoplasm .components-datetime__date .CalendarDay__selected{background:#a7b656}body.admin-color-coffee .components-datetime__date .CalendarDay__selected{background:#c2a68c}body.admin-color-blue .components-datetime__date .CalendarDay__selected{background:#82b4cb}body.admin-color-light .components-datetime__date .CalendarDay__selected{background:#0085ba}.components-datetime__date .CalendarDay__selected:hover{background:#00719e}body.admin-color-sunrise .components-datetime__date .CalendarDay__selected:hover{background:#b2723f}body.admin-color-ocean .components-datetime__date .CalendarDay__selected:hover{background:#8b9d8a}body.admin-color-midnight .components-datetime__date .CalendarDay__selected:hover{background:#bf4139}body.admin-color-ectoplasm .components-datetime__date .CalendarDay__selected:hover{background:#8e9b49}body.admin-color-coffee .components-datetime__date .CalendarDay__selected:hover{background:#a58d77}body.admin-color-blue .components-datetime__date .CalendarDay__selected:hover{background:#6f99ad}body.admin-color-light .components-datetime__date .CalendarDay__selected:hover{background:#00719e}.components-datetime__date .DayPickerNavigation_button__horizontalDefault{padding:2px 8px;top:20px}.components-datetime__date .DayPickerNavigation_button__horizontalDefault:focus{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.components-datetime__date .DayPicker_weekHeader{top:50px}.components-datetime__date .DayPicker_weekHeader .DayPicker_weekHeader_ul{margin:1px 0;padding-right:0;padding-left:0}.components-datetime__date.is-description-visible .components-datetime__date-help-button,.components-datetime__date.is-description-visible .DayPicker{visibility:hidden}.components-datetime__time{padding-bottom:16px}.components-datetime__time fieldset{position:relative;margin-bottom:.5em}.components-datetime__time fieldset+fieldset{margin-bottom:0}.components-datetime__time .components-datetime__time-field-am-pm fieldset{margin-top:0}.components-datetime__time .components-datetime__time-wrapper{display:flex}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-separator{display:inline-block;padding:0 0 0 3px;color:#555d66}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button{margin-right:8px;margin-left:-1px;border-radius:0 3px 3px 0}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button{margin-right:-1px;border-radius:3px 0 0 3px}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button:focus,.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button.is-pressed,.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button.is-pressed{background:#edeff0;border-color:#8f98a1;box-shadow:inset 0 2px 5px -3px #555d66}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button.is-pressed:focus,.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button.is-pressed:focus{box-shadow:inset 0 2px 5px -3px #555d66,0 0 0 1px #fff,0 0 0 3px #007cba}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field-time{direction:ltr}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field.am-pm button{font-size:11px;font-weight:600}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select{margin-left:4px}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]{padding:2px;margin-left:4px;text-align:center;-moz-appearance:textfield}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.components-datetime__time.is-12-hour .components-datetime__time-field-day input{margin:0 0 0 -4px!important;border-radius:0 4px 4px 0!important}.components-datetime__time.is-12-hour .components-datetime__time-field-year input{border-radius:4px 0 0 4px!important}.components-datetime__time-legend{font-weight:600;margin-top:.5em}.components-datetime__time-legend.invisible{position:absolute;top:-999em;right:-999em}.components-datetime__time-field-day-input,.components-datetime__time-field-hours-input,.components-datetime__time-field-minutes-input{width:35px}.components-datetime__time-field-year-input{width:55px}.components-datetime__time-field-month-select{max-width:145px}.components-popover .components-datetime__date{padding-right:4px}.block-editor-dimension-control .components-base-control__field{display:flex;align-items:center}.block-editor-dimension-control .components-base-control__label{display:flex;align-items:center;margin-left:1em;margin-bottom:0}.block-editor-dimension-control .components-base-control__label .dashicon{margin-left:.5em}.block-editor-dimension-control.is-manual .components-base-control__label{width:10em}.components-disabled{position:relative;pointer-events:none}.components-disabled:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0}.components-disabled *{pointer-events:none}body.is-dragging-components-draggable{cursor:move;cursor:grabbing!important}.components-draggable__invisible-drag-image{position:fixed;right:-1000px;height:50px;width:50px}.components-draggable__clone{position:fixed;padding:20px;background:transparent;pointer-events:none;z-index:1000000000;opacity:.8}.components-drop-zone{position:absolute;top:0;left:0;bottom:0;right:0;z-index:40;visibility:hidden;opacity:0;transition:opacity .3s,background-color .3s,visibility 0s .3s;border:2px solid #0071a1;border-radius:2px}@media (prefers-reduced-motion:reduce){.components-drop-zone{transition-duration:0s}}.components-drop-zone.is-active{opacity:1;visibility:visible;transition:opacity .3s,background-color .3s}@media (prefers-reduced-motion:reduce){.components-drop-zone.is-active{transition-duration:0s}}.components-drop-zone.is-dragging-over-element{background-color:rgba(0,113,161,.8)}.components-drop-zone__content{position:absolute;top:50%;right:0;left:0;z-index:50;transform:translateY(-50%);width:100%;text-align:center;color:#fff;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.components-drop-zone__content{transition-duration:0s}}.components-drop-zone.is-dragging-over-element .components-drop-zone__content{transform:translateY(-50%) scale(1.05)}.components-drop-zone__content-icon,.components-drop-zone__content-text{display:block}.components-drop-zone__content-icon{margin:0 auto;line-height:0;fill:currentColor}.components-drop-zone__content-text{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.components-drop-zone__provider{height:100%}.components-dropdown{display:inline-block}.components-dropdown-menu__indicator:after{content:"";pointer-events:none;display:block;width:0;height:0;border-right:3px solid transparent;border-left:3px solid transparent;border-top:5px solid;margin-right:4px;margin-left:2px}.components-dropdown-menu__popover .components-popover__content{width:200px}.components-dropdown-menu__menu{width:100%;padding:7px 0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.4}.components-dropdown-menu__menu .components-dropdown-menu__menu-item,.components-dropdown-menu__menu .components-menu-item{width:100%;padding:6px;outline:none;cursor:pointer;margin-bottom:4px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator,.components-dropdown-menu__menu .components-menu-item.has-separator{margin-top:6px;position:relative;overflow:visible}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator:before,.components-dropdown-menu__menu .components-menu-item.has-separator:before{display:block;content:"";box-sizing:content-box;background-color:#e2e4e7;position:absolute;top:-3px;right:0;left:0;height:1px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item:focus:not(:disabled):not([aria-disabled=true]):not(.is-secondary),.components-dropdown-menu__menu .components-menu-item:focus:not(:disabled):not([aria-disabled=true]):not(.is-secondary){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.components-dropdown-menu__menu .components-dropdown-menu__menu-item:hover,.components-dropdown-menu__menu .components-dropdown-menu__menu-item:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover,.components-dropdown-menu__menu .components-menu-item:hover,.components-dropdown-menu__menu .components-menu-item:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover{color:#191e23;border:none;background:#f3f4f5;box-shadow:none}.components-dropdown-menu__menu .components-dropdown-menu__menu-item>svg,.components-dropdown-menu__menu .components-menu-item>svg{border-radius:4px;padding:2px;width:24px;height:24px;margin:-1px 0 -1px 8px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item:not(:disabled):not([aria-disabled=true]):not(.is-secondary).is-active>svg,.components-dropdown-menu__menu .components-menu-item:not(:disabled):not([aria-disabled=true]):not(.is-secondary).is-active>svg{outline:none;color:#fff;box-shadow:none;background:#555d66}.components-dropdown-menu__menu .components-menu-group:not(:last-child){border-bottom:1px solid #e2e4e7}.components-dropdown-menu__menu .components-menu-item__button,.components-dropdown-menu__menu .components-menu-item__button.components-button{height:auto;padding-right:2rem}.components-dropdown-menu__menu .components-menu-item__button.components-button.has-icon,.components-dropdown-menu__menu .components-menu-item__button.has-icon{padding-right:.5rem}.components-dropdown-menu__menu .components-menu-item__button.components-button .dashicon,.components-dropdown-menu__menu .components-menu-item__button .dashicon{margin-left:4px}.components-external-link__icon{width:1.4em;height:1.4em;margin:-.2em .1em 0;vertical-align:middle}.components-focal-point-picker-wrapper{background-color:transparent;border:1px solid #e2e4e7;height:200px;width:100%;padding:14px}.components-focal-point-picker{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;position:relative;width:100%}.components-focal-point-picker img{height:auto;max-height:100%;max-width:100%;width:auto;-webkit-user-select:none;-ms-user-select:none;user-select:none}.components-focal-point-picker__icon_container{background-color:transparent;cursor:grab;height:30px;opacity:.8;position:absolute;will-change:transform;width:30px;z-index:10000}.components-focal-point-picker__icon_container.is-dragging{cursor:grabbing}.components-focal-point-picker__icon{display:block;height:100%;right:-15px;position:absolute;top:-15px;width:100%}.components-focal-point-picker__icon .components-focal-point-picker__icon-outline{fill:#fff}.components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#0085ba}body.admin-color-sunrise .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#d1864a}body.admin-color-ocean .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#a3b9a2}body.admin-color-midnight .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#e14d43}body.admin-color-ectoplasm .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#a7b656}body.admin-color-coffee .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#c2a68c}body.admin-color-blue .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#82b4cb}body.admin-color-light .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#0085ba}.components-focal-point-picker_position-display-container{margin:1em 0;display:flex}.components-focal-point-picker_position-display-container .components-base-control__field{margin:0 0 0 1em}.components-focal-point-picker_position-display-container input[type=number].components-text-control__input{max-width:4em;padding:6px 4px}.components-focal-point-picker_position-display-container span{margin:0 .2em 0 0}.components-font-size-picker__controls{max-width:248px;display:flex;align-items:center;margin-bottom:24px}.components-font-size-picker__controls .components-range-control__number{height:30px;margin:5px 0 0 8px}.components-font-size-picker__controls .components-range-control__number[value=""]+.components-button{cursor:default;opacity:.3;pointer-events:none}.components-font-size-picker__controls .components-range-control__number-container{display:flex;flex-direction:column}.components-font-size-picker__controls .components-font-size-picker__select{margin-left:8px;flex-grow:1}.components-font-size-picker__controls .components-color-palette__clear{height:30px;margin-top:23px}.components-font-size-picker__custom-input .components-range-control__slider+.dashicon{width:30px;height:30px}.components-font-size-picker{border:0;padding:0;margin:0}.components-form-toggle{position:relative;display:inline-block}.components-form-toggle .components-form-toggle__off,.components-form-toggle .components-form-toggle__on{position:absolute;top:6px;box-sizing:border-box}.components-form-toggle .components-form-toggle__off{color:#6c7781;fill:currentColor;left:6px}.components-form-toggle .components-form-toggle__on{right:8px}.components-form-toggle .components-form-toggle__track{content:"";display:inline-block;box-sizing:border-box;vertical-align:top;background-color:#fff;border:2px solid #6c7781;width:36px;height:18px;border-radius:9px;transition:background .2s ease}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__track{transition-duration:0s}}.components-form-toggle .components-form-toggle__thumb{display:block;position:absolute;box-sizing:border-box;top:4px;right:4px;width:10px;height:10px;border-radius:50%;transition:transform .1s ease;background-color:#6c7781;border:5px solid #6c7781}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__thumb{transition-duration:0s}}.components-form-toggle:hover .components-form-toggle__track{border:2px solid #555d66}.components-form-toggle:hover .components-form-toggle__thumb{background-color:#555d66;border:5px solid #6c7781}.components-form-toggle:hover .components-form-toggle__off{color:#555d66}.components-form-toggle.is-checked .components-form-toggle__track{background-color:#11a0d2;border:9px solid transparent}body.admin-color-sunrise .components-form-toggle.is-checked .components-form-toggle__track{background-color:#c8b03c;border:2px solid #c8b03c}body.admin-color-ocean .components-form-toggle.is-checked .components-form-toggle__track{background-color:#a3b9a2;border:2px solid #a3b9a2}body.admin-color-midnight .components-form-toggle.is-checked .components-form-toggle__track{background-color:#77a6b9;border:2px solid #77a6b9}body.admin-color-ectoplasm .components-form-toggle.is-checked .components-form-toggle__track{background-color:#a7b656;border:2px solid #a7b656}body.admin-color-coffee .components-form-toggle.is-checked .components-form-toggle__track{background-color:#c2a68c;border:2px solid #c2a68c}body.admin-color-blue .components-form-toggle.is-checked .components-form-toggle__track{background-color:#82b4cb;border:2px solid #82b4cb}body.admin-color-light .components-form-toggle.is-checked .components-form-toggle__track{background-color:#11a0d2;border:2px solid #11a0d2}.components-form-toggle__input:focus+.components-form-toggle__track{box-shadow:0 0 0 2px #fff,0 0 0 3px #6c7781;outline:2px solid transparent;outline-offset:2px}.components-form-toggle.is-checked .components-form-toggle__thumb{background-color:#fff;border-width:0;transform:translateX(-18px)}.components-form-toggle.is-checked:before{background-color:#11a0d2;border:2px solid #11a0d2}body.admin-color-sunrise .components-form-toggle.is-checked:before{background-color:#c8b03c;border:2px solid #c8b03c}body.admin-color-ocean .components-form-toggle.is-checked:before{background-color:#a3b9a2;border:2px solid #a3b9a2}body.admin-color-midnight .components-form-toggle.is-checked:before{background-color:#77a6b9;border:2px solid #77a6b9}body.admin-color-ectoplasm .components-form-toggle.is-checked:before{background-color:#a7b656;border:2px solid #a7b656}body.admin-color-coffee .components-form-toggle.is-checked:before{background-color:#c2a68c;border:2px solid #c2a68c}body.admin-color-blue .components-form-toggle.is-checked:before{background-color:#82b4cb;border:2px solid #82b4cb}body.admin-color-light .components-form-toggle.is-checked:before{background-color:#11a0d2;border:2px solid #11a0d2}.components-disabled .components-form-toggle{opacity:.3}.components-form-toggle input.components-form-toggle__input[type=checkbox]{position:absolute;top:0;right:0;width:100%;height:100%;opacity:0;margin:0;padding:0;z-index:1;border:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:checked{background:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:before{content:""}.components-form-toggle .components-form-toggle__on{outline:1px solid transparent;outline-offset:-1px;border:1px solid #000;filter:invert(100%) contrast(500%)}@supports (-ms-high-contrast-adjust:auto){.components-form-toggle .components-form-toggle__on{filter:none;border:1px solid #fff}}.components-form-token-field__input-container{display:flex;flex-wrap:wrap;align-items:flex-start;width:100%;margin:0 0 8px;padding:4px;background-color:#fff;color:#32373c;cursor:text;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:4px;border:1px solid #7e8993}@media (prefers-reduced-motion:reduce){.components-form-token-field__input-container{transition-duration:0s}}.components-form-token-field__input-container.is-disabled{background:#e2e4e7;border-color:#ccd0d4}.components-form-token-field__input-container.is-active{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.components-form-token-field__input-container input[type=text].components-form-token-field__input{display:inline-block;width:100%;max-width:100%;margin:2px 8px 2px 0;padding:0;min-height:24px;background:inherit;border:0;color:#23282d;box-shadow:none}.components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input,.components-form-token-field__input-container input[type=text].components-form-token-field__input:focus{outline:none;box-shadow:none}.components-form-token-field__input-container .components-form-token-field__token+input[type=text].components-form-token-field__input{width:auto}.components-form-token-field__label{display:inline-block;margin-bottom:4px}.components-form-token-field__help{font-style:italic}.components-form-token-field__token{font-size:13px;display:flex;margin:2px 0 2px 4px;color:#32373c;overflow:hidden}.components-form-token-field__token.is-success .components-form-token-field__remove-token,.components-form-token-field__token.is-success .components-form-token-field__token-text{background:#4ab866}.components-form-token-field__token.is-error .components-form-token-field__remove-token,.components-form-token-field__token.is-error .components-form-token-field__token-text{background:#d94f4f}.components-form-token-field__token.is-validating .components-form-token-field__remove-token,.components-form-token-field__token.is-validating .components-form-token-field__token-text{color:#555d66}.components-form-token-field__token.is-borderless{position:relative;padding:0 0 0 16px}.components-form-token-field__token.is-borderless .components-form-token-field__token-text{background:transparent;color:#11a0d2}body.admin-color-sunrise .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#c8b03c}body.admin-color-ocean .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#a89d8a}body.admin-color-midnight .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#77a6b9}body.admin-color-ectoplasm .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#c77430}body.admin-color-coffee .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#9fa47b}body.admin-color-blue .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#d9ab59}body.admin-color-light .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#c75726}.components-form-token-field__token.is-borderless .components-form-token-field__remove-token{background:transparent;color:#555d66;position:absolute;top:1px;left:0}.components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text{color:#4ab866}.components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text{color:#d94f4f;border-radius:0 4px 4px 0;padding:0 6px 0 4px}.components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text{color:#23282d}.components-form-token-field__token.is-disabled .components-form-token-field__remove-token{cursor:default}.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{display:inline-block;line-height:24px;height:auto;background:#e2e4e7;transition:all .2s cubic-bezier(.4,1,.4,1)}@media (prefers-reduced-motion:reduce){.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{transition-duration:0s;animation-duration:1ms}}.components-form-token-field__token-text{border-radius:0 12px 12px 0;padding:0 8px 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.components-form-token-field__remove-token.components-button{cursor:pointer;border-radius:12px 0 0 12px;padding:0 2px;color:#555d66;line-height:10px;overflow:initial}.components-form-token-field__remove-token.components-button:hover{color:#32373c}.components-form-token-field__suggestions-list{flex:1 0 100%;min-width:100%;max-height:9em;overflow-y:scroll;transition:all .15s ease-in-out;list-style:none;border-top:1px solid #6c7781;margin:4px -4px -4px;padding-top:3px}@media (prefers-reduced-motion:reduce){.components-form-token-field__suggestions-list{transition-duration:0s}}.components-form-token-field__suggestion{color:#555d66;display:block;font-size:13px;padding:4px 8px;cursor:pointer}.components-form-token-field__suggestion.is-selected{background:#0071a1;color:#fff}.components-form-token-field__suggestion-match{text-decoration:underline}.components-guide .components-modal__header{background:none;border-bottom:none}.components-guide .components-modal__header .components-button{align-self:flex-start;margin-top:24px;position:static}.components-guide__container{display:flex;flex-direction:column;margin-top:-56px;min-height:100%}.components-guide__footer{align-content:center;display:flex;height:30px;justify-content:center;margin:auto 0 24px;position:relative;width:100%}@media (min-width:600px){.components-guide__footer{margin:24px 0 0}}.components-guide__page-control{margin:0}.components-guide__page-control li{display:inline-block;margin:0 2px}.components-guide__page-control .components-button{height:30px}@media (max-width:600px){.components-modal__frame.components-guide{bottom:15%;right:24px;left:24px;top:15%}}.components-button.components-guide__back-button,.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{height:30px;position:absolute}.components-button.components-guide__back-button,.components-button.components-guide__forward-button{font-size:0;padding:4px 2px}.components-button.components-guide__back-button.has-text svg,.components-button.components-guide__forward-button.has-text svg{margin:0}@media (min-width:600px){.components-button.components-guide__back-button,.components-button.components-guide__forward-button{font-size:13px}}.components-button.components-guide__back-button{right:0}@media (min-width:600px){.components-button.components-guide__back-button{padding:4px 2px 4px 8px}.components-button.components-guide__back-button.has-text svg{margin-left:4px}}.components-button.components-guide__forward-button{left:0}@media (min-width:600px){.components-button.components-guide__forward-button{padding:4px 8px 4px 2px}.components-button.components-guide__forward-button.has-text svg{margin-right:4px;order:1}}.components-button.components-guide__finish-button{display:none;left:0}@media (min-width:600px){.components-button.components-guide__finish-button{display:block}}@media (min-width:600px){.components-button.components-guide__inline-finish-button{display:none}}.components-navigate-regions.is-focusing-regions [role=region]{position:relative}.components-navigate-regions.is-focusing-regions [role=region]:focus:after{content:"";position:absolute;top:0;bottom:0;right:0;left:0;pointer-events:none;outline:4px solid transparent;box-shadow:inset 0 0 0 4px #33b3db}@supports (outline-offset:1px){.components-navigate-regions.is-focusing-regions [role=region]:focus:after{content:none}.components-navigate-regions.is-focusing-regions [role=region]:focus{outline-style:solid;outline-color:#33b3db;outline-width:4px;outline-offset:-4px}}.components-menu-group{width:100%;padding:7px 0}.components-menu-group__label{margin-bottom:8px;color:#6c7781;padding:0 7px}.components-menu-item__button,.components-menu-item__button.components-button{width:100%;padding:8px 15px;text-align:right;color:#40464d;border:none;box-shadow:none}.components-menu-item__button.components-button .components-menu-items__item-icon,.components-menu-item__button.components-button .dashicon,.components-menu-item__button.components-button>span>svg,.components-menu-item__button.components-button svg.components-menu-items__item-icon,.components-menu-item__button .components-menu-items__item-icon,.components-menu-item__button .dashicon,.components-menu-item__button>span>svg,.components-menu-item__button svg.components-menu-items__item-icon{margin-left:4px}.components-menu-item__button.components-button .components-menu-items__item-icon,.components-menu-item__button .components-menu-items__item-icon{display:inline-block;flex:0 0 auto}.components-menu-item__button.components-button.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover,.components-menu-item__button.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover{color:#191e23;border:none;box-shadow:none;background:#f3f4f5}.components-menu-item__button.components-button.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover .components-menu-item__shortcut,.components-menu-item__button.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover .components-menu-item__shortcut{color:#40464d}.components-menu-item__button.components-button:focus:not(:disabled):not([aria-disabled=true]),.components-menu-item__button:focus:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.components-menu-item__info-wrapper{display:flex;flex-direction:column}.components-menu-item__info{margin-top:4px;font-size:12px;color:#6c7781}.components-menu-item__shortcut{-ms-grid-row-align:center;align-self:center;color:#6c7781;margin-left:0;margin-right:auto;padding-right:8px;display:none}@media (min-width:480px){.components-menu-item__shortcut{display:inline}}.components-menu-items-choice,.components-menu-items-choice.components-button{padding-right:2rem}.components-menu-items-choice.components-button.has-icon,.components-menu-items-choice.has-icon{padding-right:.5rem}.components-modal__screen-overlay{position:fixed;top:0;left:0;bottom:0;right:0;background-color:rgba(0,0,0,.7);z-index:100000;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-duration:1ms}}.components-modal__frame{position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;margin:0;border:1px solid #e2e4e7;background:#fff;box-shadow:0 3px 30px rgba(25,30,35,.2);overflow:auto}@media (min-width:600px){.components-modal__frame{top:50%;left:auto;bottom:auto;right:50%;min-width:360px;max-width:calc(100% - 32px);max-height:calc(100% - 112px);transform:translate(50%,-50%);animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{box-sizing:border-box;border-bottom:1px solid #e2e4e7;padding:0 24px;display:flex;flex-direction:row;justify-content:space-between;background:#fff;align-items:center;height:56px;z-index:10;position:relative;position:-webkit-sticky;position:sticky;top:0;margin:0 -24px 24px}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{position:relative;right:8px}.components-modal__header-heading-container{align-items:center;flex-grow:1;display:flex;flex-direction:row;justify-content:left}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-width:36px;max-height:36px;padding:8px}.components-modal__content{box-sizing:border-box;height:100%;padding:0 24px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:56px}}.components-notice{display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;background-color:#e5f5fa;border-right:4px solid #00a0d2;margin:5px 15px 2px;padding:8px 12px;align-items:center}.components-notice.is-dismissible{padding-left:36px;position:relative}.components-notice.is-success{border-right-color:#4ab866;background-color:#eff9f1}.components-notice.is-warning{border-right-color:#f0b849;background-color:#fef8ee}.components-notice.is-error{border-right-color:#d94f4f;background-color:#f9e2e2}.components-notice__content{flex-grow:1;margin:4px 0 4px 25px}.components-notice__action.components-button,.components-notice__action.components-button.is-link{margin-right:4px}.components-notice__action.components-button.is-secondary{vertical-align:initial}.components-notice__dismiss{color:#6c7781;align-self:flex-start;flex-shrink:0}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#191e23;background-color:transparent}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.components-notice-list{max-width:100vw;box-sizing:border-box;z-index:29}.components-notice-list .components-notice__content{margin-top:12px;margin-bottom:12px;line-height:1.6}.components-notice-list .components-notice__action.components-button{margin-top:-2px;margin-bottom:-2px}.components-panel{background:#fff;border:1px solid #e2e4e7}.components-panel>.components-panel__body:first-child,.components-panel>.components-panel__header:first-child{margin-top:-1px}.components-panel>.components-panel__body:last-child,.components-panel>.components-panel__header:last-child{border-bottom-width:0}.components-panel+.components-panel{margin-top:-1px}.components-panel__body{border-top:1px solid #e2e4e7;border-bottom:1px solid #e2e4e7}.components-panel__body h3{margin:0 0 .5em}.components-panel__body.is-opened{padding:16px}.components-panel__header{display:flex;justify-content:space-between;align-items:center;padding:0 16px;height:50px;border-top:1px solid #e2e4e7;border-bottom:1px solid #e2e4e7}.components-panel__header h2{margin:0;font-size:inherit;color:inherit}.components-panel__body+.components-panel__body,.components-panel__body+.components-panel__header,.components-panel__header+.components-panel__body,.components-panel__header+.components-panel__header{margin-top:-1px}.components-panel__body>.components-panel__body-title{display:block;padding:0;font-size:inherit;margin-top:0;margin-bottom:0;transition:background .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body>.components-panel__body-title{transition-duration:0s}}.components-panel__body.is-opened>.components-panel__body-title{margin:-16px -16px 5px}.components-panel__body>.components-panel__body-title:hover{background:#f3f4f5!important;border:none!important}.components-panel__body-toggle.components-button{position:relative;padding:15px;outline:none;width:100%;font-weight:600;text-align:right;color:#191e23;border:none;box-shadow:none;transition:background .1s ease-in-out;height:auto}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button{transition-duration:0s}}.components-panel__body-toggle.components-button:focus:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.components-panel__body-toggle.components-button:hover{background:transparent!important;border:none!important;box-shadow:none!important}.components-panel__body-toggle.components-button .components-panel__arrow{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:#191e23;fill:currentColor;transition:color .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button .components-panel__arrow{transition-duration:0s}}body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right{transform:scaleX(-1);-ms-filter:fliph;filter:FlipH;margin-top:-10px}.components-panel__icon{color:#555d66;margin:-2px 6px -2px 0}.components-panel__body-toggle-icon{margin-left:-5px}.components-panel__color-title{float:right;height:19px}.components-panel__row{display:flex;justify-content:space-between;align-items:center;margin-top:20px}.components-panel__row select{min-width:0}.components-panel__row label{margin-left:10px;flex-shrink:0;max-width:75%}.components-panel__row:empty,.components-panel__row:first-of-type{margin-top:0}.components-panel .circle-picker{padding-bottom:20px}.components-placeholder.components-placeholder{position:relative;margin-bottom:28px;padding:1em;min-height:200px;width:100%;text-align:right;background:rgba(139,139,150,.1)}@supports ((position:-webkit-sticky) or (position:sticky)){.components-placeholder.components-placeholder{display:flex;flex-direction:column;justify-content:center;align-items:flex-start}}.is-dark-theme .components-placeholder.components-placeholder{background:hsla(0,0%,100%,.15)}.components-placeholder.components-placeholder .components-base-control__label{font-size:13px}.components-placeholder__error,.components-placeholder__fieldset,.components-placeholder__instructions,.components-placeholder__label{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__label{display:flex;font-weight:600;margin-bottom:1em}.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{fill:currentColor;margin-left:1ch}.components-placeholder__fieldset,.components-placeholder__fieldset form{display:flex;flex-direction:row;width:100%;flex-wrap:wrap;z-index:1}.components-placeholder__fieldset form p,.components-placeholder__fieldset p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__fieldset.is-column-layout,.components-placeholder__fieldset.is-column-layout form{flex-direction:column}.components-placeholder__input{margin:0 0 0 8px;flex:1 1 auto}.components-placeholder__instructions{margin-bottom:1em}.components-placeholder__error{margin-top:1em;width:100%}.components-placeholder__preview img{margin:3%;width:50%}.components-placeholder__fieldset .components-button{margin-left:8px;margin-bottom:8px}.components-placeholder__fieldset .components-button:last-child{margin-bottom:0;margin-left:0}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link{margin-right:10px;margin-left:10px}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link:last-child{margin-left:0}.components-placeholder.is-medium .components-placeholder__instructions,.components-placeholder.is-small .components-placeholder__instructions{display:none}.components-placeholder.is-medium .components-placeholder__fieldset,.components-placeholder.is-medium .components-placeholder__fieldset form,.components-placeholder.is-small .components-placeholder__fieldset,.components-placeholder.is-small .components-placeholder__fieldset form{flex-direction:column}.components-placeholder.is-medium .components-placeholder__fieldset .components-button,.components-placeholder.is-small .components-placeholder__fieldset .components-button{margin-left:auto}.components-placeholder.is-small .block-editor-block-icon{display:none}.components-placeholder.is-small .components-button{padding:0 8px 2px}.components-popover{position:fixed;z-index:1000000;top:0;left:0;opacity:0}.components-popover.is-expanded,.components-popover[data-x-axis][data-y-axis]{opacity:1}.components-popover.is-expanded{top:0;left:0;right:0;bottom:0;z-index:1000000!important}.components-popover:not(.is-without-arrow){margin-left:2px}.components-popover:not(.is-without-arrow):before{border:8px solid #e2e4e7}.components-popover:not(.is-without-arrow):after{border:8px solid #fff}.components-popover:not(.is-without-arrow):after,.components-popover:not(.is-without-arrow):before{content:"";position:absolute;height:0;width:0;line-height:0}.components-popover:not(.is-without-arrow)[data-y-axis=top]{margin-top:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:before{bottom:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:after{bottom:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:after,.components-popover:not(.is-without-arrow)[data-y-axis=top]:before{border-bottom:none;border-left-color:transparent;border-right-color:transparent;border-top-style:solid;margin-left:-10px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]{margin-top:8px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:before{top:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:after{top:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:after,.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:before{border-bottom-style:solid;border-left-color:transparent;border-right-color:transparent;border-top:none;margin-left:-10px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]{margin-left:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:before{right:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:after{right:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:after,.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:before{border-bottom-color:transparent;border-left-style:solid;border-right:none;border-top-color:transparent}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]{margin-left:8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:before{left:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:after{left:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:after,.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:before{border-bottom-color:transparent;border-left:none;border-right-style:solid;border-top-color:transparent}.components-popover[data-y-axis=top]{bottom:100%}.components-popover[data-y-axis=bottom]{top:100%}.components-popover[data-y-axis=middle]{align-items:center;display:flex}.components-popover__content{box-shadow:0 3px 30px rgba(25,30,35,.1);border:1px solid #e2e4e7;background:#fff;height:100%}.components-popover .components-popover__content{position:absolute;height:auto;overflow-y:auto;min-width:260px}.components-popover.is-expanded .components-popover__content{position:static;height:calc(100% - 50px);overflow-y:visible;min-width:auto;border:none;border-top:1px solid #e2e4e7}.components-popover[data-y-axis=top] .components-popover__content{bottom:100%}.components-popover[data-x-axis=center] .components-popover__content{left:50%;transform:translateX(-50%)}.components-popover[data-x-axis=right] .components-popover__content{position:absolute;left:100%}.components-popover:not([data-y-axis=middle])[data-x-axis=right] .components-popover__content{margin-left:-24px}.components-popover[data-x-axis=left] .components-popover__content{position:absolute;right:100%}.components-popover:not([data-y-axis=middle])[data-x-axis=left] .components-popover__content{margin-right:-24px}.components-popover__content>div{height:100%}.components-popover__header{align-items:center;background:#fff;display:flex;height:50px;justify-content:space-between;padding:0 8px 0 16px}.components-popover__header-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.components-popover__close.components-button{z-index:5}.components-radio-control{display:flex;flex-direction:column}.components-radio-control .components-base-control__help{margin-top:0}.components-radio-control .components-base-control__field{margin-bottom:0}.components-radio-control__option:not(:last-child){margin-bottom:4px}.components-radio-control__input[type=radio]{margin-top:0;margin-left:6px}.components-range-control .components-base-control__field{display:flex;justify-content:center;flex-wrap:wrap;align-items:center}.components-range-control .dashicon{flex-shrink:0;margin-left:10px}.components-range-control .components-base-control__label{width:100%}.components-range-control .components-range-control__slider{margin-right:0;flex:1}.components-range-control__reset{margin-right:8px}.components-range-control__slider{width:100%;margin-right:8px;padding:0;-webkit-appearance:none;background:transparent}.components-range-control__slider::-webkit-slider-thumb{-webkit-appearance:none;height:18px;width:18px;border-radius:50%;cursor:pointer;background:#555d66;border:4px solid transparent;background-clip:padding-box;box-sizing:border-box;margin-top:-7px}.components-range-control__slider::-moz-range-thumb{height:18px;width:18px;border-radius:50%;cursor:pointer;background:#555d66;border:4px solid transparent;background-clip:padding-box;box-sizing:border-box}.components-range-control__slider::-ms-thumb{height:18px;width:18px;border-radius:50%;cursor:pointer;background:#555d66;background-clip:padding-box;box-sizing:border-box;margin-top:0;height:14px;width:14px;border:2px solid transparent}.components-range-control__slider:focus{outline:none}.components-range-control__slider:focus::-webkit-slider-thumb{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-range-control__slider:focus::-moz-range-thumb{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-range-control__slider:focus::-ms-thumb{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-range-control__slider::-webkit-slider-runnable-track{height:3px;cursor:pointer;background:#e2e4e7;border-radius:1.5px;margin-top:-4px}.components-range-control__slider::-moz-range-track{height:3px;cursor:pointer;background:#e2e4e7;border-radius:1.5px}.components-range-control__slider::-ms-track{margin-top:-4px;background:transparent;border-color:transparent;color:transparent;height:3px;cursor:pointer;background:#e2e4e7;border-radius:1.5px}.components-range-control__number{display:inline-block;margin-right:8px;font-weight:500;width:54px}.components-resizable-box__handle{display:none;width:23px;height:23px}.components-resizable-box__container.has-show-handle .components-resizable-box__handle,.components-resizable-box__container.is-selected .components-resizable-box__handle{display:block}.components-resizable-box__handle:after{display:block;content:"";width:15px;height:15px;border:2px solid #fff;border-radius:50%;background:#0085ba;cursor:inherit;position:absolute;top:calc(50% - 8px);left:calc(50% - 8px)}body.admin-color-sunrise .components-resizable-box__handle:after{background:#d1864a}body.admin-color-ocean .components-resizable-box__handle:after{background:#a3b9a2}body.admin-color-midnight .components-resizable-box__handle:after{background:#e14d43}body.admin-color-ectoplasm .components-resizable-box__handle:after{background:#a7b656}body.admin-color-coffee .components-resizable-box__handle:after{background:#c2a68c}body.admin-color-blue .components-resizable-box__handle:after{background:#82b4cb}body.admin-color-light .components-resizable-box__handle:after{background:#0085ba}.components-resizable-box__side-handle:before{display:block;content:"";width:7px;height:7px;border:2px solid #fff;background:#0085ba;cursor:inherit;position:absolute;top:calc(50% - 4px);left:calc(50% - 4px);transition:transform .1s ease-in;opacity:0}body.admin-color-sunrise .components-resizable-box__side-handle:before{background:#d1864a}body.admin-color-ocean .components-resizable-box__side-handle:before{background:#a3b9a2}body.admin-color-midnight .components-resizable-box__side-handle:before{background:#e14d43}body.admin-color-ectoplasm .components-resizable-box__side-handle:before{background:#a7b656}body.admin-color-coffee .components-resizable-box__side-handle:before{background:#c2a68c}body.admin-color-blue .components-resizable-box__side-handle:before{background:#82b4cb}body.admin-color-light .components-resizable-box__side-handle:before{background:#0085ba}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle:before{transition-duration:0s}}.is-dark-theme .components-resizable-box__handle:after,.is-dark-theme .components-resizable-box__side-handle:before{border-color:#d7dade}.components-resizable-box__side-handle{z-index:1}.components-resizable-box__corner-handle{z-index:2}.components-resizable-box__side-handle.components-resizable-box__handle-bottom,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:before,.components-resizable-box__side-handle.components-resizable-box__handle-top,.components-resizable-box__side-handle.components-resizable-box__handle-top:before{width:100%;right:0;border-right:0;border-left:0}.components-resizable-box__side-handle.components-resizable-box__handle-left,.components-resizable-box__side-handle.components-resizable-box__handle-left:before,.components-resizable-box__side-handle.components-resizable-box__handle-right,.components-resizable-box__side-handle.components-resizable-box__handle-right:before{height:100%;top:0;border-top:0;border-bottom:0}.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:components-resizable-box__top-bottom-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation-duration:1ms}}.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation:components-resizable-box__left-right-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation-duration:1ms}}@keyframes components-resizable-box__top-bottom-animation{0%{transform:scaleX(0);opacity:0}to{transform:scaleX(1);opacity:1}}@keyframes components-resizable-box__left-right-animation{0%{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}}.components-resizable-box__handle-right{right:-11.5px}.components-resizable-box__handle-left{left:-11.5px}.components-resizable-box__handle-top{top:-11.5px}.components-resizable-box__handle-bottom{bottom:-11.5px}.components-responsive-wrapper{position:relative;max-width:100%}.components-responsive-wrapper,.components-responsive-wrapper>span{display:block}.components-responsive-wrapper__content{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%;margin:auto}.components-sandbox{overflow:hidden}iframe.components-sandbox{width:100%}body.lockscroll,html.lockscroll{overflow:hidden}.components-select-control__input{background:#fff;height:36px;line-height:36px;margin:1px;outline:0;width:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)!important}@media (min-width:782px){.components-select-control__input{height:28px;line-height:28px}}@media (max-width:782px){.components-base-control .components-base-control__field .components-select-control__input{font-size:16px}}.components-snackbar{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;background-color:#32373c;border-radius:4px;box-shadow:0 2px 4px rgba(0,0,0,.3);color:#fff;padding:16px 24px;width:100%;max-width:600px;box-sizing:border-box;cursor:pointer}@media (min-width:600px){.components-snackbar{width:fit-content}}.components-snackbar:hover{background-color:#191e23}.components-snackbar:focus{background-color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}.components-snackbar__action.components-button{margin-right:32px;color:#fff;height:auto;flex-shrink:0;line-height:1.4;padding:0}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary){text-decoration:underline;background-color:transparent}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus{color:#fff;box-shadow:none;outline:1px dotted #fff}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#33b3db}.components-snackbar__content{display:flex;align-items:baseline;justify-content:space-between;line-height:1.4}.components-snackbar-list{position:absolute;z-index:100000;width:100%;box-sizing:border-box}.components-snackbar-list__notice-container{position:relative;padding-top:8px}.components-spinner{display:inline-block;background-color:#7e8993;width:18px;height:18px;opacity:.7;margin:5px 11px 0;border-radius:100%;position:relative}.components-spinner:before{content:"";position:absolute;background-color:#fff;top:3px;left:3px;width:4px;height:4px;border-radius:100%;transform-origin:6px 6px;animation:components-spinner__animation 1s linear infinite}@keyframes components-spinner__animation{0%{transform:rotate(0deg)}to{transform:rotate(-1turn)}}.components-text-control__input,.components-textarea-control__input{width:100%;padding:6px 8px}.components-tip{display:flex;color:#555d66}.components-tip svg{-ms-grid-row-align:center;align-self:center;fill:#f0b849;flex-shrink:0;margin-left:16px}.components-tip p{margin:0}.components-toggle-control .components-base-control__field{display:flex;margin-bottom:12px;line-height:normal;align-items:center}.components-toggle-control .components-base-control__field .components-form-toggle{margin-left:16px}.components-toggle-control .components-base-control__field .components-toggle-control__label{display:block}.components-accessible-toolbar{display:inline-flex;flex-shrink:0}@supports ((position:-webkit-sticky) or (position:sticky)){.components-accessible-toolbar{display:flex}}.components-tab-button{padding:3px;color:#555d66;height:36px;font-weight:500}.components-tab-button.is-pressed,.components-tab-button.is-pressed:hover{color:#fff}.components-tab-button:disabled{cursor:default}.components-tab-button>span{border:1px solid transparent;padding:0 6px;box-sizing:content-box;height:28px;line-height:28px}.components-tab-button:focus>span,.components-tab-button:hover>span{color:#555d66}.components-tab-button:not(:disabled).is-pressed>span,.components-tab-button:not(:disabled):focus>span,.components-tab-button:not(:disabled):hover>span{border:1px solid #555d66}.components-tab-button.is-pressed:hover>span,.components-tab-button.is-pressed>span{background-color:#555d66;color:#fff}.components-toolbar__control.components-button{width:36px;height:36px}.components-toolbar__control.components-button[data-subscript] svg{padding:5px 0 5px 10px}.components-toolbar__control.components-button[data-subscript]:after{content:attr(data-subscript);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;line-height:12px;position:absolute;left:8px;bottom:10px}.components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]:after{color:#fff}.components-toolbar__control.components-button.is-pressed{padding:3px;outline:none}.components-toolbar__control.components-button.is-pressed>svg{padding:5px;border-radius:4px;height:30px;width:30px;box-sizing:border-box;outline:none;color:#fff;box-shadow:none;background:#555d66}.components-toolbar-group{border:1px solid #e2e4e7;background-color:#fff;display:flex;flex-shrink:0;margin-left:-1px;line-height:0}.components-toolbar-group .components-toolbar-group{border-width:0;margin:0}.components-toolbar{margin:0;border:1px solid #e2e4e7;background-color:#fff;display:flex;flex-shrink:0}div.components-toolbar>div{display:block;margin:0}@supports ((position:-webkit-sticky) or (position:sticky)){div.components-toolbar>div{display:flex}}div.components-toolbar>div+div{margin-right:-3px}div.components-toolbar>div+div.has-left-divider{margin-right:6px;position:relative;overflow:visible}div.components-toolbar>div+div.has-left-divider:before{display:inline-block;content:"";box-sizing:content-box;background-color:#e2e4e7;position:absolute;top:8px;right:-3px;width:1px;height:20px}.components-tooltip.components-popover{z-index:1000002}.components-tooltip.components-popover:before{border-color:transparent}.components-tooltip.components-popover[data-y-axis=top]:after{border-top-color:#191e23}.components-tooltip.components-popover[data-y-axis=bottom]:after{border-bottom-color:#191e23}.components-tooltip.components-popover .components-popover__content{min-width:0}.components-tooltip .components-popover__content{padding:4px 12px;background:#191e23;border-width:0;color:#fff;white-space:nowrap;text-align:center}.components-tooltip__shortcut{display:block;color:#7e8993}.components-visually-hidden{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;width:1px;word-wrap:normal!important}.components-visually-hidden:focus{background-color:#e2e4e7;clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#444;display:block;font-size:1em;height:auto;right:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000} \ No newline at end of file diff --git a/wp-includes/css/dist/components/style.css b/wp-includes/css/dist/components/style.css new file mode 100644 index 0000000..b8ae500 --- /dev/null +++ b/wp-includes/css/dist/components/style.css @@ -0,0 +1,4002 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.components-animate__appear { + animation: components-animate__appear-animation 0.1s cubic-bezier(0, 0, 0.2, 1) 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-animate__appear { + animation-duration: 1ms; } } + .components-animate__appear.is-from-top, .components-animate__appear.is-from-top.is-from-left { + transform-origin: top left; } + .components-animate__appear.is-from-top.is-from-right { + transform-origin: top right; } + .components-animate__appear.is-from-bottom, .components-animate__appear.is-from-bottom.is-from-left { + transform-origin: bottom left; } + .components-animate__appear.is-from-bottom.is-from-right { + transform-origin: bottom right; } + +@keyframes components-animate__appear-animation { + from { + transform: translateY(-2em) scaleY(0) scaleX(0); } + to { + transform: translateY(0%) scaleY(1) scaleX(1); } } + +.components-animate__slide-in { + animation: components-animate__slide-in-animation 0.1s cubic-bezier(0, 0, 0.2, 1); + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-animate__slide-in { + animation-duration: 1ms; } } + .components-animate__slide-in.is-from-left { + transform: translateX(100%); } + +@keyframes components-animate__slide-in-animation { + 100% { + transform: translateX(0%); } } + +.components-animate__loading { + animation: components-animate__loading 1.6s ease-in-out infinite; } + +@keyframes components-animate__loading { + 0% { + opacity: 0.5; } + 50% { + opacity: 1; } + 100% { + opacity: 0.5; } } + +.components-angle-picker-control { + width: 50%; } + .components-angle-picker-control.components-base-control .components-base-control__label { + display: block; } + +.components-angle-picker-control__input-field { + width: calc(100% - 36px); + max-width: 100px; } + +.components-angle-picker-control__angle-circle { + width: 28px; + height: 28px; + border: 2px solid #555d66; + border-radius: 50%; + float: left; + margin-right: 4px; + cursor: grab; } + +.components-angle-picker-control__angle-circle-indicator-wrapper { + position: relative; + width: 100%; + height: 100%; } + +.components-angle-picker-control__angle-circle-indicator { + width: 1px; + height: 1px; + border-radius: 50%; + border: 3px solid #555d66; + display: block; + position: absolute; + top: -14px; + bottom: 0; + left: 0; + right: 0; + margin: auto; + background: #555d66; } + +.components-autocomplete__popover .components-popover__content { + min-width: 200px; } + +.components-autocomplete__popover .components-autocomplete__results { + padding: 3px; + display: flex; + flex-direction: column; + align-items: stretch; } + .components-autocomplete__popover .components-autocomplete__results:empty { + display: none; } + +.components-autocomplete__result.components-button { + margin-bottom: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + color: #555d66; + display: flex; + flex-direction: row; + flex-grow: 1; + flex-shrink: 0; + align-items: center; + padding: 6px 8px; + margin-left: -3px; + margin-right: -3px; + text-align: left; } + .components-autocomplete__result.components-button.is-selected { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + .components-autocomplete__result.components-button:hover { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; } + +.components-base-control { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; } + .components-base-control .components-base-control__field { + margin-bottom: 8px; } + .components-panel__row .components-base-control .components-base-control__field { + margin-bottom: inherit; } + .components-base-control .components-base-control__label { + display: inline-block; + margin-bottom: 4px; } + .components-base-control .components-base-control__help { + margin-top: -8px; + font-style: italic; } + +.components-base-control + .components-base-control { + margin-bottom: 16px; } + +.components-button-group { + display: inline-block; } + .components-button-group .components-button { + border-radius: 0; + display: inline-flex; } + .components-button-group .components-button + .components-button { + margin-left: -1px; } + .components-button-group .components-button:first-child { + border-radius: 3px 0 0 3px; } + .components-button-group .components-button:last-child { + border-radius: 0 3px 3px 0; } + .components-button-group .components-button:focus, .components-button-group .components-button.is-primary { + position: relative; + z-index: 1; } + .components-button-group .components-button.is-primary { + box-shadow: none; } + +.components-button { + display: inline-flex; + text-decoration: none; + font-size: 13px; + margin: 0; + border: 0; + cursor: pointer; + -webkit-appearance: none; + background: none; + transition: box-shadow 0.1s linear; + height: 36px; + align-items: center; + box-sizing: border-box; + padding: 0 8px; + overflow: hidden; + border-radius: 3px; + color: #555d66; + /* Buttons that look like links, for a cross of good semantics with the visual */ + /* Link buttons that are red to indicate destructive behavior. */ } + @media (prefers-reduced-motion: reduce) { + .components-button { + transition-duration: 0s; } } + .components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-primary):not(.is-tertiary):not(.is-link):hover { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #555d66, inset 0 0 0 2px #fff; } + .components-button.is-secondary { + border-width: 1px; + border-style: solid; + white-space: nowrap; + color: rgb(0, 117, 175); + border-color: rgb(0, 117, 175); + background: #f3f5f6; } + body.admin-color-sunrise .components-button.is-secondary { + color: rgb(196, 126, 70); + border-color: rgb(196, 126, 70); } + body.admin-color-ocean .components-button.is-secondary { + color: rgb(153, 174, 152); + border-color: rgb(153, 174, 152); } + body.admin-color-midnight .components-button.is-secondary { + color: rgb(212, 72, 63); + border-color: rgb(212, 72, 63); } + body.admin-color-ectoplasm .components-button.is-secondary { + color: rgb(157, 171, 81); + border-color: rgb(157, 171, 81); } + body.admin-color-coffee .components-button.is-secondary { + color: rgb(182, 156, 132); + border-color: rgb(182, 156, 132); } + body.admin-color-blue .components-button.is-secondary { + color: rgb(204, 161, 84); + border-color: rgb(204, 161, 84); } + body.admin-color-light .components-button.is-secondary { + color: rgb(0, 125, 175); + border-color: rgb(0, 125, 175); } + .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + background: #f1f1f1; + border-color: rgb(0, 93, 140); + color: rgb(0, 93, 140); + text-decoration: none; } + body.admin-color-sunrise .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(157, 101, 56); + color: rgb(157, 101, 56); } + body.admin-color-ocean .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(122, 139, 122); + color: rgb(122, 139, 122); } + body.admin-color-midnight .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(169, 58, 50); + color: rgb(169, 58, 50); } + body.admin-color-ectoplasm .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(125, 137, 65); + color: rgb(125, 137, 65); } + body.admin-color-coffee .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(146, 125, 105); + color: rgb(146, 125, 105); } + body.admin-color-blue .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(163, 128, 67); + color: rgb(163, 128, 67); } + body.admin-color-light .components-button.is-secondary:not(:disabled):not([aria-disabled="true"]):hover { + border-color: rgb(0, 100, 140); + color: rgb(0, 100, 140); } + .components-button.is-secondary:focus:enabled { + background: #f3f5f6; + color: rgb(0, 93, 140); + border-color: rgb(0, 118, 177); + box-shadow: 0 0 0 1px rgb(0, 118, 177); + text-decoration: none; } + body.admin-color-sunrise .components-button.is-secondary:focus:enabled { + color: rgb(157, 101, 56); + border-color: rgb(199, 127, 70); + box-shadow: 0 0 0 1px rgb(199, 127, 70); } + body.admin-color-ocean .components-button.is-secondary:focus:enabled { + color: rgb(122, 139, 122); + border-color: rgb(155, 176, 154); + box-shadow: 0 0 0 1px rgb(155, 176, 154); } + body.admin-color-midnight .components-button.is-secondary:focus:enabled { + color: rgb(169, 58, 50); + border-color: rgb(214, 73, 64); + box-shadow: 0 0 0 1px rgb(214, 73, 64); } + body.admin-color-ectoplasm .components-button.is-secondary:focus:enabled { + color: rgb(125, 137, 65); + border-color: rgb(159, 173, 82); + box-shadow: 0 0 0 1px rgb(159, 173, 82); } + body.admin-color-coffee .components-button.is-secondary:focus:enabled { + color: rgb(146, 125, 105); + border-color: rgb(184, 158, 133); + box-shadow: 0 0 0 1px rgb(184, 158, 133); } + body.admin-color-blue .components-button.is-secondary:focus:enabled { + color: rgb(163, 128, 67); + border-color: rgb(206, 162, 85); + box-shadow: 0 0 0 1px rgb(206, 162, 85); } + body.admin-color-light .components-button.is-secondary:focus:enabled { + color: rgb(0, 100, 140); + border-color: rgb(0, 126, 177); + box-shadow: 0 0 0 1px rgb(0, 126, 177); } + .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + background: #f3f5f6; + color: rgb(0, 118, 177); + border-color: #7e8993; + box-shadow: none; } + body.admin-color-sunrise .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(199, 127, 70); } + body.admin-color-ocean .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(155, 176, 154); } + body.admin-color-midnight .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(214, 73, 64); } + body.admin-color-ectoplasm .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(159, 173, 82); } + body.admin-color-coffee .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(184, 158, 133); } + body.admin-color-blue .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(206, 162, 85); } + body.admin-color-light .components-button.is-secondary:not([aria-disabled="true"]):active:enabled { + color: rgb(0, 126, 177); } + .components-button.is-secondary:disabled, .components-button.is-secondary[aria-disabled="true"] { + color: #a0a5aa; + border-color: #ddd; + background: #f7f7f7; + text-shadow: 0 1px 0 #fff; + transform: none; + opacity: 1; } + .components-button.is-primary { + border-width: 1px; + border-style: solid; + white-space: nowrap; + background: rgb(0, 124, 186); + border-color: rgb(0, 124, 186); + color: #fff; + text-decoration: none; + text-shadow: none; } + body.admin-color-sunrise .components-button.is-primary { + background: rgb(209, 134, 74); + border-color: rgb(209, 134, 74); } + body.admin-color-ocean .components-button.is-primary { + background: rgb(163, 185, 162); + border-color: rgb(163, 185, 162); } + body.admin-color-midnight .components-button.is-primary { + background: rgb(225, 77, 67); + border-color: rgb(225, 77, 67); } + body.admin-color-ectoplasm .components-button.is-primary { + background: rgb(167, 182, 86); + border-color: rgb(167, 182, 86); } + body.admin-color-coffee .components-button.is-primary { + background: rgb(194, 166, 140); + border-color: rgb(194, 166, 140); } + body.admin-color-blue .components-button.is-primary { + background: rgb(217, 171, 89); + border-color: rgb(217, 171, 89); } + body.admin-color-light .components-button.is-primary { + background: rgb(0, 133, 186); + border-color: rgb(0, 133, 186); } + .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, .components-button.is-primary:focus:enabled { + background: rgb(0, 112, 167); + border-color: rgb(0, 112, 167); + color: #fff; } + body.admin-color-sunrise .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-sunrise .components-button.is-primary:focus:enabled { + background: rgb(188, 121, 67); + border-color: rgb(188, 121, 67); } + body.admin-color-ocean .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-ocean .components-button.is-primary:focus:enabled { + background: rgb(147, 167, 146); + border-color: rgb(147, 167, 146); } + body.admin-color-midnight .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-midnight .components-button.is-primary:focus:enabled { + background: rgb(203, 69, 60); + border-color: rgb(203, 69, 60); } + body.admin-color-ectoplasm .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-ectoplasm .components-button.is-primary:focus:enabled { + background: rgb(150, 164, 77); + border-color: rgb(150, 164, 77); } + body.admin-color-coffee .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-coffee .components-button.is-primary:focus:enabled { + background: rgb(175, 149, 126); + border-color: rgb(175, 149, 126); } + body.admin-color-blue .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-blue .components-button.is-primary:focus:enabled { + background: rgb(195, 154, 80); + border-color: rgb(195, 154, 80); } + body.admin-color-light .components-button.is-primary:not(:disabled):not([aria-disabled="true"]):hover, body.admin-color-light .components-button.is-primary:focus:enabled { + background: rgb(0, 120, 167); + border-color: rgb(0, 120, 167); } + .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(0, 124, 186); } + body.admin-color-sunrise .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(209, 134, 74); } + body.admin-color-ocean .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(163, 185, 162); } + body.admin-color-midnight .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(225, 77, 67); } + body.admin-color-ectoplasm .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(167, 182, 86); } + body.admin-color-coffee .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(194, 166, 140); } + body.admin-color-blue .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(217, 171, 89); } + body.admin-color-light .components-button.is-primary:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(0, 133, 186); } + .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(0, 99, 149); + border-color: rgb(0, 99, 149); + color: #fff; } + body.admin-color-sunrise .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(167, 107, 59); + border-color: rgb(167, 107, 59); } + body.admin-color-ocean .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(130, 148, 130); + border-color: rgb(130, 148, 130); } + body.admin-color-midnight .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(180, 62, 54); + border-color: rgb(180, 62, 54); } + body.admin-color-ectoplasm .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(134, 146, 69); + border-color: rgb(134, 146, 69); } + body.admin-color-coffee .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(155, 133, 112); + border-color: rgb(155, 133, 112); } + body.admin-color-blue .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(174, 137, 71); + border-color: rgb(174, 137, 71); } + body.admin-color-light .components-button.is-primary:not([aria-disabled="true"]):active:enabled { + background: rgb(0, 106, 149); + border-color: rgb(0, 106, 149); } + .components-button.is-primary:disabled, .components-button.is-primary:disabled:active:enabled, .components-button.is-primary[aria-disabled="true"], .components-button.is-primary[aria-disabled="true"]:enabled, .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(102, 176, 214); + background: rgb(25, 137, 193); + border-color: rgb(25, 137, 193); + opacity: 1; } + body.admin-color-sunrise .components-button.is-primary:disabled, body.admin-color-sunrise .components-button.is-primary:disabled:active:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"], body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(227, 182, 146); + background: rgb(214, 146, 92); + border-color: rgb(214, 146, 92); } + body.admin-color-ocean .components-button.is-primary:disabled, body.admin-color-ocean .components-button.is-primary:disabled:active:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"], body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(200, 213, 199); + background: rgb(172, 192, 171); + border-color: rgb(172, 192, 171); } + body.admin-color-midnight .components-button.is-primary:disabled, body.admin-color-midnight .components-button.is-primary:disabled:active:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"], body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(237, 148, 142); + background: rgb(228, 95, 86); + border-color: rgb(228, 95, 86); } + body.admin-color-ectoplasm .components-button.is-primary:disabled, body.admin-color-ectoplasm .components-button.is-primary:disabled:active:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"], body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(202, 211, 154); + background: rgb(176, 189, 103); + border-color: rgb(176, 189, 103); } + body.admin-color-coffee .components-button.is-primary:disabled, body.admin-color-coffee .components-button.is-primary:disabled:active:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"], body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(218, 202, 186); + background: rgb(200, 175, 152); + border-color: rgb(200, 175, 152); } + body.admin-color-blue .components-button.is-primary:disabled, body.admin-color-blue .components-button.is-primary:disabled:active:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"], body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(232, 205, 155); + background: rgb(221, 179, 106); + border-color: rgb(221, 179, 106); } + body.admin-color-light .components-button.is-primary:disabled, body.admin-color-light .components-button.is-primary:disabled:active:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"], body.admin-color-light .components-button.is-primary[aria-disabled="true"]:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"]:active:enabled { + color: rgb(102, 182, 214); + background: rgb(25, 145, 193); + border-color: rgb(25, 145, 193); } + .components-button.is-primary:disabled:focus:enabled, .components-button.is-primary:disabled:active:enabled:focus:enabled, .components-button.is-primary[aria-disabled="true"]:focus:enabled, .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(0, 124, 186); } + body.admin-color-sunrise .components-button.is-primary:disabled:focus:enabled, body.admin-color-sunrise .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-sunrise .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(209, 134, 74); } + body.admin-color-ocean .components-button.is-primary:disabled:focus:enabled, body.admin-color-ocean .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-ocean .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(163, 185, 162); } + body.admin-color-midnight .components-button.is-primary:disabled:focus:enabled, body.admin-color-midnight .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-midnight .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(225, 77, 67); } + body.admin-color-ectoplasm .components-button.is-primary:disabled:focus:enabled, body.admin-color-ectoplasm .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-ectoplasm .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(167, 182, 86); } + body.admin-color-coffee .components-button.is-primary:disabled:focus:enabled, body.admin-color-coffee .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-coffee .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(194, 166, 140); } + body.admin-color-blue .components-button.is-primary:disabled:focus:enabled, body.admin-color-blue .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-blue .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(217, 171, 89); } + body.admin-color-light .components-button.is-primary:disabled:focus:enabled, body.admin-color-light .components-button.is-primary:disabled:active:enabled:focus:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"]:focus:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"]:enabled:focus:enabled, body.admin-color-light .components-button.is-primary[aria-disabled="true"]:active:enabled:focus:enabled { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px rgb(0, 133, 186); } + .components-button.is-primary.is-busy, .components-button.is-primary.is-busy:disabled, .components-button.is-primary.is-busy[aria-disabled="true"] { + color: #fff; + background-size: 100px 100%; + /* stylelint-disable */ + background-image: linear-gradient(-45deg, #007cba 28%, rgb(0, 99, 149) 28%, rgb(0, 99, 149) 72%, #007cba 72%); + /* stylelint-enable */ + border-color: rgb(0, 124, 186); } + body.admin-color-sunrise .components-button.is-primary.is-busy, body.admin-color-sunrise .components-button.is-primary.is-busy:disabled, body.admin-color-sunrise .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(-45deg, #d1864a 28%, rgb(167, 107, 59) 28%, rgb(167, 107, 59) 72%, #d1864a 72%); + border-color: rgb(209, 134, 74); } + body.admin-color-ocean .components-button.is-primary.is-busy, body.admin-color-ocean .components-button.is-primary.is-busy:disabled, body.admin-color-ocean .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(-45deg, #a3b9a2 28%, rgb(130, 148, 130) 28%, rgb(130, 148, 130) 72%, #a3b9a2 72%); + border-color: rgb(163, 185, 162); } + body.admin-color-midnight .components-button.is-primary.is-busy, body.admin-color-midnight .components-button.is-primary.is-busy:disabled, body.admin-color-midnight .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(-45deg, #e14d43 28%, rgb(180, 62, 54) 28%, rgb(180, 62, 54) 72%, #e14d43 72%); + border-color: rgb(225, 77, 67); } + body.admin-color-ectoplasm .components-button.is-primary.is-busy, body.admin-color-ectoplasm .components-button.is-primary.is-busy:disabled, body.admin-color-ectoplasm .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(-45deg, #a7b656 28%, rgb(134, 146, 69) 28%, rgb(134, 146, 69) 72%, #a7b656 72%); + border-color: rgb(167, 182, 86); } + body.admin-color-coffee .components-button.is-primary.is-busy, body.admin-color-coffee .components-button.is-primary.is-busy:disabled, body.admin-color-coffee .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(-45deg, #c2a68c 28%, rgb(155, 133, 112) 28%, rgb(155, 133, 112) 72%, #c2a68c 72%); + border-color: rgb(194, 166, 140); } + body.admin-color-blue .components-button.is-primary.is-busy, body.admin-color-blue .components-button.is-primary.is-busy:disabled, body.admin-color-blue .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(-45deg, #d9ab59 28%, rgb(174, 137, 71) 28%, rgb(174, 137, 71) 72%, #d9ab59 72%); + border-color: rgb(217, 171, 89); } + body.admin-color-light .components-button.is-primary.is-busy, body.admin-color-light .components-button.is-primary.is-busy:disabled, body.admin-color-light .components-button.is-primary.is-busy[aria-disabled="true"] { + background-image: linear-gradient(-45deg, #0085ba 28%, rgb(0, 106, 149) 28%, rgb(0, 106, 149) 72%, #0085ba 72%); + border-color: rgb(0, 133, 186); } + .components-button.is-link { + margin: 0; + padding: 0; + box-shadow: none; + border: 0; + border-radius: 0; + background: none; + outline: none; + text-align: left; + /* Mimics the default link style in common.css */ + color: #0073aa; + text-decoration: underline; + transition-property: border, background, color; + transition-duration: 0.05s; + transition-timing-function: ease-in-out; + height: auto; } + @media (prefers-reduced-motion: reduce) { + .components-button.is-link { + transition-duration: 0s; } } + .components-button.is-link:not(:disabled):not([aria-disabled="true"]):hover, .components-button.is-link:not([aria-disabled="true"]):active { + color: #00a0d2; } + .components-button.is-link:focus { + color: #124964; + box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, 0.8); } + .components-button.is-link.is-destructive { + color: #d94f4f; } + .components-button:not([aria-disabled="true"]):active { + color: inherit; } + .components-button:disabled, .components-button[aria-disabled="true"] { + cursor: default; + opacity: 0.3; } + .components-button:focus:not(:disabled) { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + .components-button.is-busy, .components-button.is-secondary.is-busy, .components-button.is-secondary.is-busy:disabled, .components-button.is-secondary.is-busy[aria-disabled="true"] { + animation: components-button__busy-animation 2500ms infinite linear; + background-size: 100px 100%; + background-image: repeating-linear-gradient(-45deg, #e2e4e7, #fff 11px, #fff 10px, #e2e4e7 20px); + opacity: 1; } + .components-button.is-small { + height: 24px; + line-height: 22px; + padding: 0 8px; + font-size: 11px; } + .components-button.is-tertiary { + color: #007cba; } + body.admin-color-sunrise .components-button.is-tertiary { + color: #837425; } + body.admin-color-ocean .components-button.is-tertiary { + color: #5e7d5e; } + body.admin-color-midnight .components-button.is-tertiary { + color: #497b8d; } + body.admin-color-ectoplasm .components-button.is-tertiary { + color: #523f6d; } + body.admin-color-coffee .components-button.is-tertiary { + color: #59524c; } + body.admin-color-blue .components-button.is-tertiary { + color: #417e9B; } + body.admin-color-light .components-button.is-tertiary { + color: #007cba; } + .components-button.is-tertiary .dashicon { + display: inline-block; + flex: 0 0 auto; } + .components-button.is-tertiary:not([aria-disabled="true"]):active:focus:enabled { + box-shadow: none; } + .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(0, 93, 140); } + body.admin-color-sunrise .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(98, 87, 28); } + body.admin-color-ocean .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(71, 94, 71); } + body.admin-color-midnight .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(55, 92, 106); } + body.admin-color-ectoplasm .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(62, 47, 82); } + body.admin-color-coffee .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(67, 62, 57); } + body.admin-color-blue .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(49, 95, 116); } + body.admin-color-light .components-button.is-tertiary:not(:disabled):not([aria-disabled="true"]):hover { + color: rgb(0, 93, 140); } + .components-button.has-icon .dashicon { + display: inline-block; + flex: 0 0 auto; } + .components-button.has-icon.has-text svg { + margin-right: 8px; } + .components-button svg { + fill: currentColor; + outline: none; } + .components-button .screen-reader-text { + height: auto; } + +@keyframes components-button__busy-animation { + 0% { + background-position: 200px 0; } } + +.components-checkbox-control__input[type="checkbox"] { + border: 1px solid #b4b9be; + background: #fff; + color: #555; + clear: none; + cursor: pointer; + display: inline-block; + line-height: 0; + margin: 0 4px 0 0; + outline: 0; + padding: 0 !important; + text-align: center; + vertical-align: top; + width: 25px; + height: 25px; + -webkit-appearance: none; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + transition: 0.05s border-color ease-in-out; } + @media (min-width: 600px) { + .components-checkbox-control__input[type="checkbox"] { + height: 16px; + width: 16px; } } + .components-checkbox-control__input[type="checkbox"]:focus { + border-color: #5b9dd9; + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); + outline: 2px solid transparent; } + .components-checkbox-control__input[type="checkbox"]:checked { + background: #11a0d2; + border-color: #11a0d2; } + .components-checkbox-control__input[type="checkbox"]:checked::-ms-check { + opacity: 0; } + .components-checkbox-control__input[type="checkbox"]:focus:checked { + border: none; } + .components-checkbox-control__input[type="checkbox"]:checked::before { + content: none; } + +.components-checkbox-control__input-container { + position: relative; + display: inline-block; + margin-right: 12px; + vertical-align: middle; + width: 25px; + height: 25px; } + @media (min-width: 600px) { + .components-checkbox-control__input-container { + width: 16px; + height: 16px; } } + +svg.components-checkbox-control__checked { + fill: #fff; + cursor: pointer; + position: absolute; + left: -4px; + top: -2px; + width: 31px; + height: 31px; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; } + @media (min-width: 600px) { + svg.components-checkbox-control__checked { + width: 21px; + height: 21px; + left: -3px; } } + +.components-circular-option-picker { + display: inline-block; + margin-top: 0.6rem; + width: 100%; } + .components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper { + display: flex; + justify-content: flex-end; } + +.components-circular-option-picker__option-wrapper { + display: inline-block; + height: 28px; + width: 28px; + margin-right: 12px; + margin-bottom: 12px; + vertical-align: top; + transform: scale(1); + transition: 100ms transform ease; } + @media (prefers-reduced-motion: reduce) { + .components-circular-option-picker__option-wrapper { + transition-duration: 0s; } } + .components-circular-option-picker__option-wrapper:hover { + transform: scale(1.2); } + .components-circular-option-picker__option-wrapper > div { + height: 100%; + width: 100%; } + +.components-circular-option-picker__option-wrapper::before { + content: ""; + position: absolute; + top: 1px; + left: 1px; + bottom: 1px; + right: 1px; + border-radius: 50%; + z-index: -1; + /* stylelint-disable-next-line function-url-quotes */ + background: url('data:image/svg+xml,%3Csvg width="28" height="28" fill="none" xmlns="http://www.w3.org/2000/svg"%3E%3Cpath d="M6 8V6H4v2h2zM8 8V6h2v2H8zM10 16H8v-2h2v2zM12 16v-2h2v2h-2zM12 18v-2h-2v2H8v2h2v-2h2zM14 18v2h-2v-2h2zM16 18h-2v-2h2v2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2v2zm-2-4v-2h2v2h-2z" fill="%23555D65"/%3E%3Cpath d="M18 18v2h-2v-2h2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2H8zm0 2v-2H6v2h2zm2 0v-2h2v2h-2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2h-2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4V0zm0 4V2H2v2h2zm2 0V2h2v2H6zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2H6z" fill="%23555D65"/%3E%3C/svg%3E'); } + +.components-circular-option-picker__option { + display: inline-block; + vertical-align: top; + height: 100%; + width: 100%; + border: none; + border-radius: 50%; + background: transparent; + box-shadow: inset 0 0 0 14px; + transition: 100ms box-shadow ease; + cursor: pointer; } + @media (prefers-reduced-motion: reduce) { + .components-circular-option-picker__option { + transition-duration: 0s; } } + .components-circular-option-picker__option:hover { + box-shadow: inset 0 0 0 14px !important; } + .components-circular-option-picker__option.is-pressed { + box-shadow: inset 0 0 0 4px; + position: relative; + z-index: 1; } + .components-circular-option-picker__option.is-pressed + svg { + position: absolute; + left: 2px; + top: 2px; + border-radius: 50%; + z-index: 2; + background: #fff; + pointer-events: none; } + .components-circular-option-picker__option::after { + content: ""; + position: absolute; + top: -1px; + left: -1px; + bottom: -1px; + right: -1px; + border-radius: 50%; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); + border: 1px solid transparent; } + .components-circular-option-picker__option:focus::after { + content: ""; + border: 2px solid #606a73; + width: 32px; + height: 32px; + position: absolute; + top: -2px; + left: -2px; + border-radius: 50%; + box-shadow: inset 0 0 0 2px #fff; } + .components-circular-option-picker__option.components-button:focus { + background-color: transparent; + box-shadow: inset 0 0 0 14px; + outline: none; } + +.components-circular-option-picker__button-action .components-circular-option-picker__option { + color: #fff; + background: #fff; } + +.components-circular-option-picker__dropdown-link-action { + margin-right: 16px; } + .components-circular-option-picker__dropdown-link-action .components-button { + line-height: 22px; } + +.component-color-indicator { + width: 25px; + height: 16px; + margin-left: 0.8rem; + border: 1px solid #dadada; + display: inline-block; } + .component-color-indicator + .component-color-indicator { + margin-left: 0.5rem; } + +/** + * Parts of this source were derived and modified from react-color, + * released under the MIT license. + * + * https://github.com/casesandberg/react-color/ + * + * Copyright (c) 2015 Case Sandberg + * + * 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. + */ +.components-color-picker { + width: 100%; + overflow: hidden; } + .components-color-picker * { + box-sizing: border-box; } + +.components-color-picker__saturation { + width: 100%; + padding-bottom: 55%; + position: relative; } + +.components-color-picker__body { + padding: 16px 16px 12px; } + +.components-color-picker__controls { + display: flex; } + +.components-color-picker__saturation-pointer, +.components-color-picker__hue-pointer, +.components-color-picker__alpha-pointer { + padding: 0; + position: absolute; + cursor: pointer; + box-shadow: none; + border: none; } + +/* CURRENT COLOR COMPONENT */ +.components-color-picker__swatch { + margin-right: 8px; + width: 32px; + height: 32px; + border-radius: 50%; + position: relative; + overflow: hidden; + background-image: linear-gradient(45deg, #ddd 25%, transparent 25%), linear-gradient(-45deg, #ddd 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #ddd 75%), linear-gradient(-45deg, transparent 75%, #ddd 75%); + background-size: 10px 10px; + background-position: 0 0, 0 5px, 5px -5px, -5px 0; } + .is-alpha-disabled .components-color-picker__swatch { + width: 12px; + height: 12px; + margin-top: 0; } + +.components-color-picker__active { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: 50%; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + z-index: 2; } + +/* SATURATION COMPONENT */ +.components-color-picker__saturation-color, +.components-color-picker__saturation-white, +.components-color-picker__saturation-black { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; } + +.components-color-picker__saturation-color { + overflow: hidden; } + +.components-color-picker__saturation-white { + /*rtl:ignore*/ + background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0)); } + +.components-color-picker__saturation-black { + background: linear-gradient(to top, #000, rgba(0, 0, 0, 0)); } + +.components-color-picker__saturation-pointer { + width: 14px; + height: 14px; + padding: 0; + box-shadow: 0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 1px 2px rgba(0, 0, 0, 0.4); + border-radius: 50%; + background-color: transparent; + transform: translate(-4px, -4px); } + +/* HUE & ALPHA BARS */ +.components-color-picker__toggles { + flex: 1; } + +.components-color-picker__alpha { + background-image: linear-gradient(45deg, #ddd 25%, transparent 25%), linear-gradient(-45deg, #ddd 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #ddd 75%), linear-gradient(-45deg, transparent 75%, #ddd 75%); + background-size: 10px 10px; + background-position: 0 0, 0 5px, 5px -5px, -5px 0; } + +.components-color-picker__hue-gradient, +.components-color-picker__alpha-gradient { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; } + +.components-color-picker__hue, +.components-color-picker__alpha { + height: 12px; + position: relative; } + +.is-alpha-enabled .components-color-picker__hue { + margin-bottom: 8px; } + +.components-color-picker__hue-bar, +.components-color-picker__alpha-bar { + position: relative; + margin: 0 3px; + height: 100%; + padding: 0 2px; } + +.components-color-picker__hue-gradient { + /*rtl:ignore*/ + background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%); } + +.components-color-picker__hue-pointer, +.components-color-picker__alpha-pointer { + /*rtl:ignore*/ + left: 0; + width: 14px; + height: 14px; + border-radius: 50%; + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37); + background: #fff; + transform: translate(-7px, -1px); } + +.components-color-picker__hue-pointer, +.components-color-picker__saturation-pointer { + transition: box-shadow 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .components-color-picker__hue-pointer, + .components-color-picker__saturation-pointer { + transition-duration: 0s; } } + +.components-color-picker__saturation-pointer:focus { + box-shadow: 0 0 0 2px #fff, 0 0 0 4px #00a0d2, 0 0 5px 0 #00a0d2, inset 0 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 1px 2px rgba(0, 0, 0, 0.4); } + +.components-color-picker__hue-pointer:focus, +.components-color-picker__alpha-pointer:focus { + border-color: #00a0d2; + box-shadow: 0 0 0 2px #00a0d2, 0 0 3px 0 #00a0d2; + outline: 2px solid transparent; + outline-offset: -2px; } + +/* INPUTS COMPONENT */ +.components-color-picker__inputs-wrapper { + margin: 0 -4px; + padding-top: 16px; + display: flex; + align-items: flex-end; } + .components-color-picker__inputs-wrapper fieldset { + flex: 1; + border: none; + margin: 0; + padding: 0; } + .components-color-picker__inputs-wrapper .components-color-picker__inputs-fields .components-text-control__input[type="number"] { + padding: 6px 8px; } + +.components-color-picker__inputs-field { + width: 100%; } + +.components-color-picker__inputs-fields { + display: flex; + /*rtl:ignore*/ + direction: ltr; + flex-grow: 1; + margin-right: 4px; } + .components-color-picker__inputs-fields .components-base-control + .components-base-control { + margin-bottom: 0; } + .components-color-picker__inputs-fields .components-base-control__field { + margin: 0 4px; } + +.components-color-picker__inputs-toggle { + height: 30px; + padding: 0 5px; } + +.components-custom-gradient-picker { + margin-top: 8px; } + +.components-custom-gradient-picker__gradient-bar:not(.has-gradient) { + opacity: 0.4; } + +.components-custom-gradient-picker__gradient-bar { + width: 100%; + height: 24px; + border-radius: 24px; + margin-bottom: 16px; + padding-left: 3px; + padding-right: 21px; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container { + position: relative; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point { + border-radius: 50%; + background: #fff; + padding: 2px; + min-width: 24px; + width: 24px; + height: 24px; + position: relative; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point svg { + height: 100%; + width: 100%; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button { + border: 2px solid #fff; + border-radius: 50%; + height: 18px; + padding: 0; + position: absolute; + width: 18px; + top: 3px; } + .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active { + background: #fafafa; + color: #23282d; + border-color: #999; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007cba; } + +.components-custom-gradient-picker__color-picker-popover .components-custom-gradient-picker__remove-control-point { + margin-left: auto; + margin-right: auto; + display: block; + margin-bottom: 8px; } + +.components-custom-gradient-picker__inserter { + width: 100%; } + +.components-custom-gradient-picker__liner-gradient-indicator { + display: inline-block; + flex: 0 auto; + width: 20px; + height: 20px; } + +.components-custom-gradient-picker__ui-line { + display: flex; + justify-content: space-between; } + +.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-angle-picker, +.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-custom-gradient-picker__type-picker { + margin-bottom: 0; } + +.components-custom-gradient-picker .components-custom-gradient-picker__toolbar { + border: none; } + .components-custom-gradient-picker .components-custom-gradient-picker__toolbar > div + div { + margin-left: 1px; } + .components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed > svg { + background: #fff; + border: 1px solid #7e8993; + border-radius: 2px; } + +.components-custom-select-control { + color: #555d66; + position: relative; } + +.components-custom-select-control__label { + display: block; + margin-bottom: 5px; } + +.components-custom-select-control__button { + border: 1px solid #7e8993; + border-radius: 4px; + color: #555d66; + display: inline; + min-height: 30px; + min-width: 130px; + position: relative; + text-align: left; } + .components-custom-select-control__button:focus { + border-color: #00a0d2; } + .components-custom-select-control__button-icon { + height: 100%; + padding: 0 4px; + position: absolute; + right: 0; + top: 0; } + +.components-custom-select-control__menu { + background: #fff; + max-height: 400px; + min-width: 100%; + overflow: auto; + padding: 0; + position: absolute; + z-index: 1000000; } + +.components-custom-select-control__item { + align-items: center; + display: flex; + list-style-type: none; + padding: 10px 5px 10px 25px; } + .components-custom-select-control__item.is-highlighted { + background: #e2e4e7; } + .components-custom-select-control__item-icon { + margin-left: -20px; + margin-right: 0; } + +svg.dashicon { + fill: currentColor; + outline: none; } + +/*rtl:begin:ignore*/ +.PresetDateRangePicker_panel { + padding: 0 22px 11px; } + +.PresetDateRangePicker_button { + position: relative; + height: 100%; + text-align: center; + background: 0 0; + border: 2px solid #00a699; + color: #00a699; + padding: 4px 12px; + margin-right: 8px; + font: inherit; + font-weight: 700; + line-height: normal; + overflow: visible; + box-sizing: border-box; + cursor: pointer; } + +.PresetDateRangePicker_button:active { + outline: 0; } + +.PresetDateRangePicker_button__selected { + color: #fff; + background: #00a699; } + +.SingleDatePickerInput { + display: inline-block; + background-color: #fff; } + +.SingleDatePickerInput__withBorder { + border-radius: 2px; + border: 1px solid #dbdbdb; } + +.SingleDatePickerInput__rtl { + direction: rtl; } + +.SingleDatePickerInput__disabled { + background-color: #f2f2f2; } + +.SingleDatePickerInput__block { + display: block; } + +.SingleDatePickerInput__showClearDate { + padding-right: 30px; } + +.SingleDatePickerInput_clearDate { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + padding: 10px; + margin: 0 10px 0 5px; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); } + +.SingleDatePickerInput_clearDate__default:focus, +.SingleDatePickerInput_clearDate__default:hover { + background: #dbdbdb; + border-radius: 50%; } + +.SingleDatePickerInput_clearDate__small { + padding: 6px; } + +.SingleDatePickerInput_clearDate__hide { + visibility: hidden; } + +.SingleDatePickerInput_clearDate_svg { + fill: #82888a; + height: 12px; + width: 15px; + vertical-align: middle; } + +.SingleDatePickerInput_clearDate_svg__small { + height: 9px; } + +.SingleDatePickerInput_calendarIcon { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + display: inline-block; + vertical-align: middle; + padding: 10px; + margin: 0 5px 0 10px; } + +.SingleDatePickerInput_calendarIcon_svg { + fill: #82888a; + height: 15px; + width: 14px; + vertical-align: middle; } + +.SingleDatePicker { + position: relative; + display: inline-block; } + +.SingleDatePicker__block { + display: block; } + +.SingleDatePicker_picker { + z-index: 1; + background-color: #fff; + position: absolute; } + +.SingleDatePicker_picker__rtl { + direction: rtl; } + +.SingleDatePicker_picker__directionLeft { + left: 0; } + +.SingleDatePicker_picker__directionRight { + right: 0; } + +.SingleDatePicker_picker__portal { + background-color: rgba(0, 0, 0, 0.3); + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; } + +.SingleDatePicker_picker__fullScreenPortal { + background-color: #fff; } + +.SingleDatePicker_closeButton { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + position: absolute; + top: 0; + right: 0; + padding: 15px; + z-index: 2; } + +.SingleDatePicker_closeButton:focus, +.SingleDatePicker_closeButton:hover { + color: #b0b3b4; + text-decoration: none; } + +.SingleDatePicker_closeButton_svg { + height: 15px; + width: 15px; + fill: #cacccd; } + +.DayPickerKeyboardShortcuts_buttonReset { + background: 0 0; + border: 0; + border-radius: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + cursor: pointer; + font-size: 14px; } + +.DayPickerKeyboardShortcuts_buttonReset:active { + outline: 0; } + +.DayPickerKeyboardShortcuts_show { + width: 22px; + position: absolute; + z-index: 2; } + +.DayPickerKeyboardShortcuts_show__bottomRight { + border-top: 26px solid transparent; + border-right: 33px solid #00a699; + bottom: 0; + right: 0; } + +.DayPickerKeyboardShortcuts_show__bottomRight:hover { + border-right: 33px solid #008489; } + +.DayPickerKeyboardShortcuts_show__topRight { + border-bottom: 26px solid transparent; + border-right: 33px solid #00a699; + top: 0; + right: 0; } + +.DayPickerKeyboardShortcuts_show__topRight:hover { + border-right: 33px solid #008489; } + +.DayPickerKeyboardShortcuts_show__topLeft { + border-bottom: 26px solid transparent; + border-left: 33px solid #00a699; + top: 0; + left: 0; } + +.DayPickerKeyboardShortcuts_show__topLeft:hover { + border-left: 33px solid #008489; } + +.DayPickerKeyboardShortcuts_showSpan { + color: #fff; + position: absolute; } + +.DayPickerKeyboardShortcuts_showSpan__bottomRight { + bottom: 0; + right: -28px; } + +.DayPickerKeyboardShortcuts_showSpan__topRight { + top: 1px; + right: -28px; } + +.DayPickerKeyboardShortcuts_showSpan__topLeft { + top: 1px; + left: -28px; } + +.DayPickerKeyboardShortcuts_panel { + overflow: auto; + background: #fff; + border: 1px solid #dbdbdb; + border-radius: 2px; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 0; + z-index: 2; + padding: 22px; + margin: 33px; } + +.DayPickerKeyboardShortcuts_title { + font-size: 16px; + font-weight: 700; + margin: 0; } + +.DayPickerKeyboardShortcuts_list { + list-style: none; + padding: 0; + font-size: 14px; } + +.DayPickerKeyboardShortcuts_close { + position: absolute; + right: 22px; + top: 22px; + z-index: 2; } + +.DayPickerKeyboardShortcuts_close:active { + outline: 0; } + +.DayPickerKeyboardShortcuts_closeSvg { + height: 15px; + width: 15px; + fill: #cacccd; } + +.DayPickerKeyboardShortcuts_closeSvg:focus, +.DayPickerKeyboardShortcuts_closeSvg:hover { + fill: #82888a; } + +.CalendarDay { + box-sizing: border-box; + cursor: pointer; + font-size: 14px; + text-align: center; } + +.CalendarDay:active { + outline: 0; } + +.CalendarDay__defaultCursor { + cursor: default; } + +.CalendarDay__default { + border: 1px solid #e4e7e7; + color: #484848; + background: #fff; } + +.CalendarDay__default:hover { + background: #e4e7e7; + border: 1px double #e4e7e7; + color: inherit; } + +.CalendarDay__hovered_offset { + background: #f4f5f5; + border: 1px double #e4e7e7; + color: inherit; } + +.CalendarDay__outside { + border: 0; + background: #fff; + color: #484848; } + +.CalendarDay__outside:hover { + border: 0; } + +.CalendarDay__blocked_minimum_nights { + background: #fff; + border: 1px solid #eceeee; + color: #cacccd; } + +.CalendarDay__blocked_minimum_nights:active, +.CalendarDay__blocked_minimum_nights:hover { + background: #fff; + color: #cacccd; } + +.CalendarDay__highlighted_calendar { + background: #ffe8bc; + color: #484848; } + +.CalendarDay__highlighted_calendar:active, +.CalendarDay__highlighted_calendar:hover { + background: #ffce71; + color: #484848; } + +.CalendarDay__selected_span { + background: #66e2da; + border: 1px solid #33dacd; + color: #fff; } + +.CalendarDay__selected_span:active, +.CalendarDay__selected_span:hover { + background: #33dacd; + border: 1px solid #33dacd; + color: #fff; } + +.CalendarDay__last_in_range { + border-right: #00a699; } + +.CalendarDay__selected, +.CalendarDay__selected:active, +.CalendarDay__selected:hover { + background: #00a699; + border: 1px solid #00a699; + color: #fff; } + +.CalendarDay__hovered_span, +.CalendarDay__hovered_span:hover { + background: #b2f1ec; + border: 1px solid #80e8e0; + color: #007a87; } + +.CalendarDay__hovered_span:active { + background: #80e8e0; + border: 1px solid #80e8e0; + color: #007a87; } + +.CalendarDay__blocked_calendar, +.CalendarDay__blocked_calendar:active, +.CalendarDay__blocked_calendar:hover { + background: #cacccd; + border: 1px solid #cacccd; + color: #82888a; } + +.CalendarDay__blocked_out_of_range, +.CalendarDay__blocked_out_of_range:active, +.CalendarDay__blocked_out_of_range:hover { + background: #fff; + border: 1px solid #e4e7e7; + color: #cacccd; } + +.CalendarMonth { + background: #fff; + text-align: center; + vertical-align: top; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.CalendarMonth_table { + border-collapse: collapse; + border-spacing: 0; } + +.CalendarMonth_verticalSpacing { + border-collapse: separate; } + +.CalendarMonth_caption { + color: #484848; + font-size: 18px; + text-align: center; + padding-top: 22px; + padding-bottom: 37px; + caption-side: initial; } + +.CalendarMonth_caption__verticalScrollable { + padding-top: 12px; + padding-bottom: 7px; } + +.CalendarMonthGrid { + background: #fff; + text-align: left; + z-index: 0; } + +.CalendarMonthGrid__animating { + z-index: 1; } + +.CalendarMonthGrid__horizontal { + position: absolute; + left: 9px; } + +.CalendarMonthGrid__vertical { + margin: 0 auto; } + +.CalendarMonthGrid__vertical_scrollable { + margin: 0 auto; + overflow-y: scroll; } + +.CalendarMonthGrid_month__horizontal { + display: inline-block; + vertical-align: top; + min-height: 100%; } + +.CalendarMonthGrid_month__hideForAnimation { + position: absolute; + z-index: -1; + opacity: 0; + pointer-events: none; } + +.CalendarMonthGrid_month__hidden { + visibility: hidden; } + +.DayPickerNavigation { + position: relative; + z-index: 2; } + +.DayPickerNavigation__horizontal { + height: 0; } + +.DayPickerNavigation__verticalDefault { + position: absolute; + width: 100%; + height: 52px; + bottom: 0; + left: 0; } + +.DayPickerNavigation__verticalScrollableDefault { + position: relative; } + +.DayPickerNavigation_button { + cursor: pointer; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + border: 0; + padding: 0; + margin: 0; } + +.DayPickerNavigation_button__default { + border: 1px solid #e4e7e7; + background-color: #fff; + color: #757575; } + +.DayPickerNavigation_button__default:focus, +.DayPickerNavigation_button__default:hover { + border: 1px solid #c4c4c4; } + +.DayPickerNavigation_button__default:active { + background: #f2f2f2; } + +.DayPickerNavigation_button__horizontalDefault { + position: absolute; + top: 18px; + line-height: .78; + border-radius: 3px; + padding: 6px 9px; } + +.DayPickerNavigation_leftButton__horizontalDefault { + left: 22px; } + +.DayPickerNavigation_rightButton__horizontalDefault { + right: 22px; } + +.DayPickerNavigation_button__verticalDefault { + padding: 5px; + background: #fff; + box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + position: relative; + display: inline-block; + height: 100%; + width: 50%; } + +.DayPickerNavigation_nextButton__verticalDefault { + border-left: 0; } + +.DayPickerNavigation_nextButton__verticalScrollableDefault { + width: 100%; } + +.DayPickerNavigation_svg__horizontal { + height: 19px; + width: 19px; + fill: #82888a; + display: block; } + +.DayPickerNavigation_svg__vertical { + height: 42px; + width: 42px; + fill: #484848; + display: block; } + +.DayPicker { + background: #fff; + position: relative; + text-align: left; } + +.DayPicker__horizontal { + background: #fff; } + +.DayPicker__verticalScrollable { + height: 100%; } + +.DayPicker__hidden { + visibility: hidden; } + +.DayPicker__withBorder { + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.07); + border-radius: 3px; } + +.DayPicker_portal__horizontal { + box-shadow: none; + position: absolute; + left: 50%; + top: 50%; } + +.DayPicker_portal__vertical { + position: initial; } + +.DayPicker_focusRegion { + outline: 0; } + +.DayPicker_calendarInfo__horizontal, +.DayPicker_wrapper__horizontal { + display: inline-block; + vertical-align: top; } + +.DayPicker_weekHeaders { + position: relative; } + +.DayPicker_weekHeaders__horizontal { + margin-left: 9px; } + +.DayPicker_weekHeader { + color: #757575; + position: absolute; + top: 62px; + z-index: 2; + text-align: left; } + +.DayPicker_weekHeader__vertical { + left: 50%; } + +.DayPicker_weekHeader__verticalScrollable { + top: 0; + display: table-row; + border-bottom: 1px solid #dbdbdb; + background: #fff; + margin-left: 0; + left: 0; + width: 100%; + text-align: center; } + +.DayPicker_weekHeader_ul { + list-style: none; + margin: 1px 0; + padding-left: 0; + padding-right: 0; + font-size: 14px; } + +.DayPicker_weekHeader_li { + display: inline-block; + text-align: center; } + +.DayPicker_transitionContainer { + position: relative; + overflow: hidden; + border-radius: 3px; } + +.DayPicker_transitionContainer__horizontal { + transition: height .2s ease-in-out; } + +.DayPicker_transitionContainer__vertical { + width: 100%; } + +.DayPicker_transitionContainer__verticalScrollable { + padding-top: 20px; + height: 100%; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 0; + overflow-y: scroll; } + +.DateInput { + margin: 0; + padding: 0; + background: #fff; + position: relative; + display: inline-block; + width: 130px; + vertical-align: middle; } + +.DateInput__small { + width: 97px; } + +.DateInput__block { + width: 100%; } + +.DateInput__disabled { + background: #f2f2f2; + color: #dbdbdb; } + +.DateInput_input { + font-weight: 200; + font-size: 19px; + line-height: 24px; + color: #484848; + background-color: #fff; + width: 100%; + padding: 11px 11px 9px; + border: 0; + border-top: 0; + border-right: 0; + border-bottom: 2px solid transparent; + border-left: 0; + border-radius: 0; } + +.DateInput_input__small { + font-size: 15px; + line-height: 18px; + letter-spacing: .2px; + padding: 7px 7px 5px; } + +.DateInput_input__regular { + font-weight: auto; } + +.DateInput_input__readOnly { + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.DateInput_input__focused { + outline: 0; + background: #fff; + border: 0; + border-top: 0; + border-right: 0; + border-bottom: 2px solid #008489; + border-left: 0; } + +.DateInput_input__disabled { + background: #f2f2f2; + font-style: italic; } + +.DateInput_screenReaderMessage { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.DateInput_fang { + position: absolute; + width: 20px; + height: 10px; + left: 22px; + z-index: 2; } + +.DateInput_fangShape { + fill: #fff; } + +.DateInput_fangStroke { + stroke: #dbdbdb; + fill: transparent; } + +.DateRangePickerInput { + background-color: #fff; + display: inline-block; } + +.DateRangePickerInput__disabled { + background: #f2f2f2; } + +.DateRangePickerInput__withBorder { + border-radius: 2px; + border: 1px solid #dbdbdb; } + +.DateRangePickerInput__rtl { + direction: rtl; } + +.DateRangePickerInput__block { + display: block; } + +.DateRangePickerInput__showClearDates { + padding-right: 30px; } + +.DateRangePickerInput_arrow { + display: inline-block; + vertical-align: middle; + color: #484848; } + +.DateRangePickerInput_arrow_svg { + vertical-align: middle; + fill: #484848; + height: 24px; + width: 24px; } + +.DateRangePickerInput_clearDates { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + padding: 10px; + margin: 0 10px 0 5px; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); } + +.DateRangePickerInput_clearDates__small { + padding: 6px; } + +.DateRangePickerInput_clearDates_default:focus, +.DateRangePickerInput_clearDates_default:hover { + background: #dbdbdb; + border-radius: 50%; } + +.DateRangePickerInput_clearDates__hide { + visibility: hidden; } + +.DateRangePickerInput_clearDates_svg { + fill: #82888a; + height: 12px; + width: 15px; + vertical-align: middle; } + +.DateRangePickerInput_clearDates_svg__small { + height: 9px; } + +.DateRangePickerInput_calendarIcon { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + display: inline-block; + vertical-align: middle; + padding: 10px; + margin: 0 5px 0 10px; } + +.DateRangePickerInput_calendarIcon_svg { + fill: #82888a; + height: 15px; + width: 14px; + vertical-align: middle; } + +.DateRangePicker { + position: relative; + display: inline-block; } + +.DateRangePicker__block { + display: block; } + +.DateRangePicker_picker { + z-index: 1; + background-color: #fff; + position: absolute; } + +.DateRangePicker_picker__rtl { + direction: rtl; } + +.DateRangePicker_picker__directionLeft { + left: 0; } + +.DateRangePicker_picker__directionRight { + right: 0; } + +.DateRangePicker_picker__portal { + background-color: rgba(0, 0, 0, 0.3); + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; } + +.DateRangePicker_picker__fullScreenPortal { + background-color: #fff; } + +.DateRangePicker_closeButton { + background: 0 0; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + cursor: pointer; + position: absolute; + top: 0; + right: 0; + padding: 15px; + z-index: 2; } + +.DateRangePicker_closeButton:focus, +.DateRangePicker_closeButton:hover { + color: #b0b3b4; + text-decoration: none; } + +.DateRangePicker_closeButton_svg { + height: 15px; + width: 15px; + fill: #cacccd; } + +/*rtl:end:ignore*/ +.components-datetime { + padding: 16px; } + .components-datetime .components-datetime__calendar-help { + padding: 16px; } + .components-datetime .components-datetime__calendar-help h4 { + margin: 0; } + .components-datetime .components-datetime__date-help-button { + display: block; + margin-left: auto; } + .components-datetime fieldset { + border: 0; + padding: 0; + margin: 0; } + .components-datetime select, + .components-datetime input { + box-shadow: 0 0 0 transparent; + transition: box-shadow 0.1s linear; + border-radius: 4px; + border: 1px solid #7e8993; } + @media (prefers-reduced-motion: reduce) { + .components-datetime select, + .components-datetime input { + transition-duration: 0s; } } + .components-datetime select, + .components-datetime input[type="number"], + .components-datetime .components-button { + height: 30px; + margin-top: 0; + margin-bottom: 0; } + +.components-datetime__date { + min-height: 236px; + border-top: 1px solid #e2e4e7; } + .components-datetime__date .DayPickerNavigation_leftButton__horizontalDefault { + left: 0; } + .components-datetime__date .CalendarMonth_caption { + font-size: 13px; } + .components-datetime__date .CalendarDay { + font-size: 13px; + border: 1px solid transparent; + border-radius: 50%; + text-align: center; } + .components-datetime__date .CalendarDay__selected { + background: #0085ba; } + body.admin-color-sunrise .components-datetime__date .CalendarDay__selected { + background: #d1864a; } + body.admin-color-ocean .components-datetime__date .CalendarDay__selected { + background: #a3b9a2; } + body.admin-color-midnight .components-datetime__date .CalendarDay__selected { + background: #e14d43; } + body.admin-color-ectoplasm .components-datetime__date .CalendarDay__selected { + background: #a7b656; } + body.admin-color-coffee .components-datetime__date .CalendarDay__selected { + background: #c2a68c; } + body.admin-color-blue .components-datetime__date .CalendarDay__selected { + background: #82b4cb; } + body.admin-color-light .components-datetime__date .CalendarDay__selected { + background: #0085ba; } + .components-datetime__date .CalendarDay__selected:hover { + background: rgb(0, 113, 158); } + body.admin-color-sunrise .components-datetime__date .CalendarDay__selected:hover { + background: rgb(178, 114, 63); } + body.admin-color-ocean .components-datetime__date .CalendarDay__selected:hover { + background: rgb(139, 157, 138); } + body.admin-color-midnight .components-datetime__date .CalendarDay__selected:hover { + background: rgb(191, 65, 57); } + body.admin-color-ectoplasm .components-datetime__date .CalendarDay__selected:hover { + background: rgb(142, 155, 73); } + body.admin-color-coffee .components-datetime__date .CalendarDay__selected:hover { + background: rgb(165, 141, 119); } + body.admin-color-blue .components-datetime__date .CalendarDay__selected:hover { + background: rgb(111, 153, 173); } + body.admin-color-light .components-datetime__date .CalendarDay__selected:hover { + background: rgb(0, 113, 158); } + .components-datetime__date .DayPickerNavigation_button__horizontalDefault { + padding: 2px 8px; + top: 20px; } + .components-datetime__date .DayPickerNavigation_button__horizontalDefault:focus { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + .components-datetime__date .DayPicker_weekHeader { + top: 50px; } + .components-datetime__date .DayPicker_weekHeader .DayPicker_weekHeader_ul { + margin: 1px 0; + padding-left: 0; + padding-right: 0; } + .components-datetime__date.is-description-visible .DayPicker, + .components-datetime__date.is-description-visible .components-datetime__date-help-button { + visibility: hidden; } + +.components-datetime__time { + padding-bottom: 16px; } + .components-datetime__time fieldset { + position: relative; + margin-bottom: 0.5em; } + .components-datetime__time fieldset + fieldset { + margin-bottom: 0; } + .components-datetime__time .components-datetime__time-field-am-pm fieldset { + margin-top: 0; } + .components-datetime__time .components-datetime__time-wrapper { + display: flex; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-separator { + display: inline-block; + padding: 0 3px 0 0; + color: #555d66; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button { + margin-left: 8px; + margin-right: -1px; + border-radius: 3px 0 0 3px; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button { + margin-left: -1px; + border-radius: 0 3px 3px 0; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button:focus, + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button:focus { + position: relative; + z-index: 1; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button.is-pressed, + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button.is-pressed { + background: #edeff0; + border-color: #8f98a1; + box-shadow: inset 0 2px 5px -3px #555d66; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button.is-pressed:focus, + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button.is-pressed:focus { + box-shadow: inset 0 2px 5px -3px #555d66, 0 0 0 1px #fff, 0 0 0 3px #007cba; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field-time { + /*rtl:ignore*/ + direction: ltr; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field.am-pm button { + font-size: 11px; + font-weight: 600; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select { + margin-right: 4px; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select:focus { + position: relative; + z-index: 1; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type="number"] { + padding: 2px; + margin-right: 4px; + text-align: center; + -moz-appearance: textfield; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type="number"]:focus { + position: relative; + z-index: 1; } + .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; } + .components-datetime__time.is-12-hour .components-datetime__time-field-day input { + margin: 0 -4px 0 0 !important; + border-radius: 4px 0 0 4px !important; } + .components-datetime__time.is-12-hour .components-datetime__time-field-year input { + border-radius: 0 4px 4px 0 !important; } + +.components-datetime__time-legend { + font-weight: 600; + margin-top: 0.5em; } + .components-datetime__time-legend.invisible { + position: absolute; + top: -999em; + left: -999em; } + +.components-datetime__time-field-hours-input, +.components-datetime__time-field-minutes-input, +.components-datetime__time-field-day-input { + width: 35px; } + +.components-datetime__time-field-year-input { + width: 55px; } + +.components-datetime__time-field-month-select { + max-width: 145px; } + +.components-popover .components-datetime__date { + padding-left: 4px; } + +.block-editor-dimension-control .components-base-control__field { + display: flex; + align-items: center; } + +.block-editor-dimension-control .components-base-control__label { + display: flex; + align-items: center; + margin-right: 1em; + margin-bottom: 0; } + .block-editor-dimension-control .components-base-control__label .dashicon { + margin-right: 0.5em; } + +.block-editor-dimension-control.is-manual .components-base-control__label { + width: 10em; } + +.components-disabled { + position: relative; + pointer-events: none; } + .components-disabled::after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; } + .components-disabled * { + pointer-events: none; } + +body.is-dragging-components-draggable { + cursor: move; + /* Fallback for IE/Edge < 14 */ + cursor: grabbing !important; } + +.components-draggable__invisible-drag-image { + position: fixed; + left: -1000px; + height: 50px; + width: 50px; } + +.components-draggable__clone { + position: fixed; + padding: 20px; + background: transparent; + pointer-events: none; + z-index: 1000000000; + opacity: 0.8; } + +.components-drop-zone { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 40; + visibility: hidden; + opacity: 0; + transition: 0.3s opacity, 0.3s background-color, 0s visibility 0.3s; + border: 2px solid #0071a1; + border-radius: 2px; } + @media (prefers-reduced-motion: reduce) { + .components-drop-zone { + transition-duration: 0s; } } + .components-drop-zone.is-active { + opacity: 1; + visibility: visible; + transition: 0.3s opacity, 0.3s background-color; } + @media (prefers-reduced-motion: reduce) { + .components-drop-zone.is-active { + transition-duration: 0s; } } + .components-drop-zone.is-dragging-over-element { + background-color: rgba(0, 113, 161, 0.8); } + +.components-drop-zone__content { + position: absolute; + top: 50%; + left: 0; + right: 0; + z-index: 50; + transform: translateY(-50%); + width: 100%; + text-align: center; + color: #fff; + transition: transform 0.2s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .components-drop-zone__content { + transition-duration: 0s; } } + +.components-drop-zone.is-dragging-over-element .components-drop-zone__content { + transform: translateY(-50%) scale(1.05); } + +.components-drop-zone__content-icon, +.components-drop-zone__content-text { + display: block; } + +.components-drop-zone__content-icon { + margin: 0 auto; + line-height: 0; + fill: currentColor; } + +.components-drop-zone__content-text { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } + +.components-drop-zone__provider { + height: 100%; } + +.components-dropdown { + display: inline-block; } + +.components-dropdown-menu__indicator::after { + content: ""; + pointer-events: none; + display: block; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 5px solid; + margin-left: 4px; + margin-right: 2px; } + +.components-dropdown-menu__popover .components-popover__content { + width: 200px; } + +.components-dropdown-menu__menu { + width: 100%; + padding: 7px 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + line-height: 1.4; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item, + .components-dropdown-menu__menu .components-menu-item { + width: 100%; + padding: 6px; + outline: none; + cursor: pointer; + margin-bottom: 4px; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator, + .components-dropdown-menu__menu .components-menu-item.has-separator { + margin-top: 6px; + position: relative; + overflow: visible; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator::before, + .components-dropdown-menu__menu .components-menu-item.has-separator::before { + display: block; + content: ""; + box-sizing: content-box; + background-color: #e2e4e7; + position: absolute; + top: -3px; + left: 0; + right: 0; + height: 1px; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item:focus:not(:disabled):not([aria-disabled="true"]):not(.is-secondary), + .components-dropdown-menu__menu .components-menu-item:focus:not(:disabled):not([aria-disabled="true"]):not(.is-secondary) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item:hover, .components-dropdown-menu__menu .components-dropdown-menu__menu-item:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover, + .components-dropdown-menu__menu .components-menu-item:hover, + .components-dropdown-menu__menu .components-menu-item:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; + box-shadow: none; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item > svg, + .components-dropdown-menu__menu .components-menu-item > svg { + border-radius: 4px; + padding: 2px; + width: 24px; + height: 24px; + margin: -1px 8px -1px 0; } + .components-dropdown-menu__menu .components-dropdown-menu__menu-item:not(:disabled):not([aria-disabled="true"]):not(.is-secondary).is-active > svg, + .components-dropdown-menu__menu .components-menu-item:not(:disabled):not([aria-disabled="true"]):not(.is-secondary).is-active > svg { + outline: none; + color: #fff; + box-shadow: none; + background: #555d66; } + .components-dropdown-menu__menu .components-menu-group:not(:last-child) { + border-bottom: 1px solid #e2e4e7; } + .components-dropdown-menu__menu .components-menu-item__button, + .components-dropdown-menu__menu .components-menu-item__button.components-button { + height: auto; + padding-left: 2rem; } + .components-dropdown-menu__menu .components-menu-item__button.has-icon, + .components-dropdown-menu__menu .components-menu-item__button.components-button.has-icon { + padding-left: 0.5rem; } + .components-dropdown-menu__menu .components-menu-item__button .dashicon, + .components-dropdown-menu__menu .components-menu-item__button.components-button .dashicon { + margin-right: 4px; } + +.components-external-link__icon { + width: 1.4em; + height: 1.4em; + margin: -0.2em 0.1em 0; + vertical-align: middle; } + +.components-focal-point-picker-wrapper { + background-color: transparent; + border: 1px solid #e2e4e7; + height: 200px; + width: 100%; + padding: 14px; } + +.components-focal-point-picker { + align-items: center; + cursor: pointer; + display: flex; + height: 100%; + justify-content: center; + position: relative; + width: 100%; } + .components-focal-point-picker img { + height: auto; + max-height: 100%; + max-width: 100%; + width: auto; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.components-focal-point-picker__icon_container { + background-color: transparent; + cursor: grab; + height: 30px; + opacity: 0.8; + position: absolute; + will-change: transform; + width: 30px; + z-index: 10000; } + .components-focal-point-picker__icon_container.is-dragging { + cursor: grabbing; } + +.components-focal-point-picker__icon { + display: block; + height: 100%; + left: -15px; + position: absolute; + top: -15px; + width: 100%; } + .components-focal-point-picker__icon .components-focal-point-picker__icon-outline { + fill: #fff; } + .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #0085ba; } + body.admin-color-sunrise .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #d1864a; } + body.admin-color-ocean .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #a3b9a2; } + body.admin-color-midnight .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #e14d43; } + body.admin-color-ectoplasm .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #a7b656; } + body.admin-color-coffee .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #c2a68c; } + body.admin-color-blue .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #82b4cb; } + body.admin-color-light .components-focal-point-picker__icon .components-focal-point-picker__icon-fill { + fill: #0085ba; } + +.components-focal-point-picker_position-display-container { + margin: 1em 0; + display: flex; } + .components-focal-point-picker_position-display-container .components-base-control__field { + margin: 0 1em 0 0; } + .components-focal-point-picker_position-display-container input[type="number"].components-text-control__input { + max-width: 4em; + padding: 6px 4px; } + .components-focal-point-picker_position-display-container span { + margin: 0 0 0 0.2em; } + +.components-font-size-picker__controls { + max-width: 248px; + display: flex; + align-items: center; + margin-bottom: 24px; } + .components-font-size-picker__controls .components-range-control__number { + height: 30px; + margin-bottom: 0; + margin-top: 5px; + margin-left: 0; + margin-right: 8px; } + .components-font-size-picker__controls .components-range-control__number[value=""] + .components-button { + cursor: default; + opacity: 0.3; + pointer-events: none; } + .components-font-size-picker__controls .components-range-control__number-container { + display: flex; + flex-direction: column; } + .components-font-size-picker__controls .components-font-size-picker__select { + margin-right: 8px; + flex-grow: 1; } + .components-font-size-picker__controls .components-color-palette__clear { + height: 30px; + margin-top: 23px; } + +.components-font-size-picker__custom-input .components-range-control__slider + .dashicon { + width: 30px; + height: 30px; } + +.components-font-size-picker { + border: 0; + padding: 0; + margin: 0; } + +.components-form-toggle { + position: relative; + display: inline-block; } + .components-form-toggle .components-form-toggle__on, + .components-form-toggle .components-form-toggle__off { + position: absolute; + top: 6px; + box-sizing: border-box; } + .components-form-toggle .components-form-toggle__off { + color: #6c7781; + fill: currentColor; + right: 6px; } + .components-form-toggle .components-form-toggle__on { + left: 8px; } + .components-form-toggle .components-form-toggle__track { + content: ""; + display: inline-block; + box-sizing: border-box; + vertical-align: top; + background-color: #fff; + border: 2px solid #6c7781; + width: 36px; + height: 18px; + border-radius: 9px; + transition: 0.2s background ease; } + @media (prefers-reduced-motion: reduce) { + .components-form-toggle .components-form-toggle__track { + transition-duration: 0s; } } + .components-form-toggle .components-form-toggle__thumb { + display: block; + position: absolute; + box-sizing: border-box; + top: 4px; + left: 4px; + width: 10px; + height: 10px; + border-radius: 50%; + transition: 0.1s transform ease; + background-color: #6c7781; + border: 5px solid #6c7781; } + @media (prefers-reduced-motion: reduce) { + .components-form-toggle .components-form-toggle__thumb { + transition-duration: 0s; } } + .components-form-toggle:hover .components-form-toggle__track { + border: 2px solid #555d66; } + .components-form-toggle:hover .components-form-toggle__thumb { + background-color: #555d66; + border: 5px solid #6c7781; } + .components-form-toggle:hover .components-form-toggle__off { + color: #555d66; } + .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #11a0d2; + border: 2px solid #11a0d2; + border: 9px solid transparent; } + body.admin-color-sunrise .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #c8b03c; + border: 2px solid #c8b03c; } + body.admin-color-ocean .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #a3b9a2; + border: 2px solid #a3b9a2; } + body.admin-color-midnight .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #77a6b9; + border: 2px solid #77a6b9; } + body.admin-color-ectoplasm .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #a7b656; + border: 2px solid #a7b656; } + body.admin-color-coffee .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #c2a68c; + border: 2px solid #c2a68c; } + body.admin-color-blue .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #82b4cb; + border: 2px solid #82b4cb; } + body.admin-color-light .components-form-toggle.is-checked .components-form-toggle__track { + background-color: #11a0d2; + border: 2px solid #11a0d2; } + .components-form-toggle__input:focus + .components-form-toggle__track { + box-shadow: 0 0 0 2px #fff, 0 0 0 3px #6c7781; + outline: 2px solid transparent; + outline-offset: 2px; } + .components-form-toggle.is-checked .components-form-toggle__thumb { + background-color: #fff; + border-width: 0; + transform: translateX(18px); } + .components-form-toggle.is-checked::before { + background-color: #11a0d2; + border: 2px solid #11a0d2; } + body.admin-color-sunrise .components-form-toggle.is-checked::before { + background-color: #c8b03c; + border: 2px solid #c8b03c; } + body.admin-color-ocean .components-form-toggle.is-checked::before { + background-color: #a3b9a2; + border: 2px solid #a3b9a2; } + body.admin-color-midnight .components-form-toggle.is-checked::before { + background-color: #77a6b9; + border: 2px solid #77a6b9; } + body.admin-color-ectoplasm .components-form-toggle.is-checked::before { + background-color: #a7b656; + border: 2px solid #a7b656; } + body.admin-color-coffee .components-form-toggle.is-checked::before { + background-color: #c2a68c; + border: 2px solid #c2a68c; } + body.admin-color-blue .components-form-toggle.is-checked::before { + background-color: #82b4cb; + border: 2px solid #82b4cb; } + body.admin-color-light .components-form-toggle.is-checked::before { + background-color: #11a0d2; + border: 2px solid #11a0d2; } + .components-disabled .components-form-toggle { + opacity: 0.3; } + +.components-form-toggle input.components-form-toggle__input[type="checkbox"] { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0; + margin: 0; + padding: 0; + z-index: 1; + border: none; } + .components-form-toggle input.components-form-toggle__input[type="checkbox"]:checked { + background: none; } + .components-form-toggle input.components-form-toggle__input[type="checkbox"]::before { + content: ""; } + +.components-form-toggle .components-form-toggle__on { + outline: 1px solid transparent; + outline-offset: -1px; + border: 1px solid #000; + filter: invert(100%) contrast(500%); } + +@supports (-ms-high-contrast-adjust: auto) { + .components-form-toggle .components-form-toggle__on { + filter: none; + border: 1px solid #fff; } } + +.components-form-token-field__input-container { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + width: 100%; + margin: 0 0 8px 0; + padding: 4px; + background-color: #fff; + border: 1px solid #ccd0d4; + color: #32373c; + cursor: text; + box-shadow: 0 0 0 transparent; + transition: box-shadow 0.1s linear; + border-radius: 4px; + border: 1px solid #7e8993; } + @media (prefers-reduced-motion: reduce) { + .components-form-token-field__input-container { + transition-duration: 0s; } } + .components-form-token-field__input-container.is-disabled { + background: #e2e4e7; + border-color: #ccd0d4; } + .components-form-token-field__input-container.is-active { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + .components-form-token-field__input-container input[type="text"].components-form-token-field__input { + display: inline-block; + width: 100%; + max-width: 100%; + margin: 2px 0 2px 8px; + padding: 0; + min-height: 24px; + background: inherit; + border: 0; + color: #23282d; + box-shadow: none; } + .components-form-token-field__input-container input[type="text"].components-form-token-field__input:focus, + .components-form-token-field.is-active .components-form-token-field__input-container input[type="text"].components-form-token-field__input { + outline: none; + box-shadow: none; } + .components-form-token-field__input-container .components-form-token-field__token + input[type="text"].components-form-token-field__input { + width: auto; } + +.components-form-token-field__label { + display: inline-block; + margin-bottom: 4px; } + +.components-form-token-field__help { + font-style: italic; } + +.components-form-token-field__token { + font-size: 13px; + display: flex; + margin: 2px 4px 2px 0; + color: #32373c; + overflow: hidden; } + .components-form-token-field__token.is-success .components-form-token-field__token-text, + .components-form-token-field__token.is-success .components-form-token-field__remove-token { + background: #4ab866; } + .components-form-token-field__token.is-error .components-form-token-field__token-text, + .components-form-token-field__token.is-error .components-form-token-field__remove-token { + background: #d94f4f; } + .components-form-token-field__token.is-validating .components-form-token-field__token-text, + .components-form-token-field__token.is-validating .components-form-token-field__remove-token { + color: #555d66; } + .components-form-token-field__token.is-borderless { + position: relative; + padding: 0 16px 0 0; } + .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + background: transparent; + color: #11a0d2; } + body.admin-color-sunrise .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #c8b03c; } + body.admin-color-ocean .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #a89d8a; } + body.admin-color-midnight .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #77a6b9; } + body.admin-color-ectoplasm .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #c77430; } + body.admin-color-coffee .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #9fa47b; } + body.admin-color-blue .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #d9ab59; } + body.admin-color-light .components-form-token-field__token.is-borderless .components-form-token-field__token-text { + color: #c75726; } + .components-form-token-field__token.is-borderless .components-form-token-field__remove-token { + background: transparent; + color: #555d66; + position: absolute; + top: 1px; + right: 0; } + .components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text { + color: #4ab866; } + .components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text { + color: #d94f4f; + border-radius: 4px 0 0 4px; + padding: 0 4px 0 6px; } + .components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text { + color: #23282d; } + .components-form-token-field__token.is-disabled .components-form-token-field__remove-token { + cursor: default; } + +.components-form-token-field__token-text, +.components-form-token-field__remove-token.components-button { + display: inline-block; + line-height: 24px; + height: auto; + background: #e2e4e7; + transition: all 0.2s cubic-bezier(0.4, 1, 0.4, 1); } + @media (prefers-reduced-motion: reduce) { + .components-form-token-field__token-text, + .components-form-token-field__remove-token.components-button { + transition-duration: 0s; + animation-duration: 1ms; } } + +.components-form-token-field__token-text { + border-radius: 12px 0 0 12px; + padding: 0 4px 0 8px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + +.components-form-token-field__remove-token.components-button { + cursor: pointer; + border-radius: 0 12px 12px 0; + padding: 0 2px; + color: #555d66; + line-height: 10px; + overflow: initial; } + .components-form-token-field__remove-token.components-button:hover { + color: #32373c; } + +.components-form-token-field__suggestions-list { + flex: 1 0 100%; + min-width: 100%; + max-height: 9em; + overflow-y: scroll; + transition: all 0.15s ease-in-out; + list-style: none; + border-top: 1px solid #6c7781; + margin: 4px -4px -4px; + padding-top: 3px; } + @media (prefers-reduced-motion: reduce) { + .components-form-token-field__suggestions-list { + transition-duration: 0s; } } + +.components-form-token-field__suggestion { + color: #555d66; + display: block; + font-size: 13px; + padding: 4px 8px; + cursor: pointer; } + .components-form-token-field__suggestion.is-selected { + background: #0071a1; + color: #fff; } + +.components-form-token-field__suggestion-match { + text-decoration: underline; } + +.components-guide .components-modal__header { + background: none; + border-bottom: none; } + .components-guide .components-modal__header .components-button { + align-self: flex-start; + margin-top: 24px; + position: static; } + +.components-guide__container { + display: flex; + flex-direction: column; + margin-top: -56px; + min-height: 100%; } + +.components-guide__footer { + align-content: center; + display: flex; + height: 30px; + justify-content: center; + margin: auto 0 24px 0; + position: relative; + width: 100%; } + @media (min-width: 600px) { + .components-guide__footer { + margin: 24px 0 0; } } + +.components-guide__page-control { + margin: 0; } + .components-guide__page-control li { + display: inline-block; + margin: 0 2px; } + .components-guide__page-control .components-button { + height: 30px; } + +@media (max-width: 600px) { + .components-modal__frame.components-guide { + bottom: 15%; + left: 24px; + right: 24px; + top: 15%; } } + +.components-button.components-guide__back-button, .components-button.components-guide__forward-button, .components-button.components-guide__finish-button { + height: 30px; + position: absolute; } + +.components-button.components-guide__back-button, .components-button.components-guide__forward-button { + font-size: 0; + padding: 4px 2px; } + .components-button.components-guide__back-button.has-text svg, .components-button.components-guide__forward-button.has-text svg { + margin: 0; } + @media (min-width: 600px) { + .components-button.components-guide__back-button, .components-button.components-guide__forward-button { + font-size: 13px; } } + +.components-button.components-guide__back-button { + left: 0; } + @media (min-width: 600px) { + .components-button.components-guide__back-button { + padding: 4px 8px 4px 2px; } + .components-button.components-guide__back-button.has-text svg { + margin-right: 4px; } } + +.components-button.components-guide__forward-button { + right: 0; } + @media (min-width: 600px) { + .components-button.components-guide__forward-button { + padding: 4px 2px 4px 8px; } + .components-button.components-guide__forward-button.has-text svg { + margin-left: 4px; + order: 1; } } + +.components-button.components-guide__finish-button { + display: none; + right: 0; } + @media (min-width: 600px) { + .components-button.components-guide__finish-button { + display: block; } } + +@media (min-width: 600px) { + .components-button.components-guide__inline-finish-button { + display: none; } } + +.components-navigate-regions.is-focusing-regions [role="region"] { + position: relative; } + .components-navigate-regions.is-focusing-regions [role="region"]:focus::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + pointer-events: none; + outline: 4px solid transparent; + box-shadow: inset 0 0 0 4px #33b3db; } + @supports (outline-offset: 1px) { + .components-navigate-regions.is-focusing-regions [role="region"]:focus::after { + content: none; } + .components-navigate-regions.is-focusing-regions [role="region"]:focus { + outline-style: solid; + outline-color: #33b3db; + outline-width: 4px; + outline-offset: -4px; } } + +.components-menu-group { + width: 100%; + padding: 7px 0; } + +.components-menu-group__label { + margin-bottom: 8px; + color: #6c7781; + padding: 0 7px; } + +.components-menu-item__button, +.components-menu-item__button.components-button { + width: 100%; + padding: 8px 15px; + text-align: left; + color: #40464d; + border: none; + box-shadow: none; } + .components-menu-item__button .dashicon, + .components-menu-item__button .components-menu-items__item-icon, + .components-menu-item__button svg.components-menu-items__item-icon, + .components-menu-item__button > span > svg, + .components-menu-item__button.components-button .dashicon, + .components-menu-item__button.components-button .components-menu-items__item-icon, + .components-menu-item__button.components-button svg.components-menu-items__item-icon, + .components-menu-item__button.components-button > span > svg { + margin-right: 4px; } + .components-menu-item__button .components-menu-items__item-icon, + .components-menu-item__button.components-button .components-menu-items__item-icon { + display: inline-block; + flex: 0 0 auto; } + .components-menu-item__button.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover, + .components-menu-item__button.components-button.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover { + color: #191e23; + border: none; + box-shadow: none; + background: #f3f4f5; } + .components-menu-item__button.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover .components-menu-item__shortcut, + .components-menu-item__button.components-button.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover .components-menu-item__shortcut { + color: #40464d; } + .components-menu-item__button:focus:not(:disabled):not([aria-disabled="true"]), + .components-menu-item__button.components-button:focus:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + +.components-menu-item__info-wrapper { + display: flex; + flex-direction: column; } + +.components-menu-item__info { + margin-top: 4px; + font-size: 12px; + color: #6c7781; } + +.components-menu-item__shortcut { + -ms-grid-row-align: center; + align-self: center; + color: #6c7781; + margin-right: 0; + margin-left: auto; + padding-left: 8px; + display: none; } + @media (min-width: 480px) { + .components-menu-item__shortcut { + display: inline; } } + +.components-menu-items-choice, +.components-menu-items-choice.components-button { + padding-left: 2rem; } + .components-menu-items-choice.has-icon, + .components-menu-items-choice.components-button.has-icon { + padding-left: 0.5rem; } + +.components-modal__screen-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.7); + z-index: 100000; + animation: edit-post__fade-in-animation 0.2s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-modal__screen-overlay { + animation-duration: 1ms; } } + +.components-modal__frame { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + box-sizing: border-box; + margin: 0; + border: 1px solid #e2e4e7; + background: #fff; + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.2); + overflow: auto; } + @media (min-width: 600px) { + .components-modal__frame { + top: 50%; + right: auto; + bottom: auto; + left: 50%; + min-width: 360px; + max-width: calc(100% - 16px - 16px); + max-height: calc(100% - 56px - 56px); + transform: translate(-50%, -50%); + animation: components-modal__appear-animation 0.1s ease-out; + animation-fill-mode: forwards; } } + @media (min-width: 600px) and (prefers-reduced-motion: reduce) { + .components-modal__frame { + animation-duration: 1ms; } } + +@keyframes components-modal__appear-animation { + from { + margin-top: 32px; } + to { + margin-top: 0; } } + +.components-modal__header { + box-sizing: border-box; + border-bottom: 1px solid #e2e4e7; + padding: 0 24px; + display: flex; + flex-direction: row; + justify-content: space-between; + background: #fff; + align-items: center; + height: 56px; + z-index: 10; + position: relative; + position: -webkit-sticky; + position: sticky; + top: 0; + margin: 0 -24px 24px; } + @supports (-ms-ime-align: auto) { + .components-modal__header { + position: fixed; + width: 100%; } } + .components-modal__header .components-modal__header-heading { + font-size: 1rem; + font-weight: 600; } + .components-modal__header h1 { + line-height: 1; + margin: 0; } + .components-modal__header .components-button { + position: relative; + left: 8px; } + +.components-modal__header-heading-container { + align-items: center; + flex-grow: 1; + display: flex; + flex-direction: row; + justify-content: left; } + +.components-modal__header-icon-container { + display: inline-block; } + .components-modal__header-icon-container svg { + max-width: 36px; + max-height: 36px; + padding: 8px; } + +.components-modal__content { + box-sizing: border-box; + height: 100%; + padding: 0 24px 24px; } + @supports (-ms-ime-align: auto) { + .components-modal__content { + padding-top: 56px; } } + +.components-notice { + display: flex; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + background-color: #e5f5fa; + border-left: 4px solid #00a0d2; + margin: 5px 15px 2px; + padding: 8px 12px; + align-items: center; } + .components-notice.is-dismissible { + padding-right: 36px; + position: relative; } + .components-notice.is-success { + border-left-color: #4ab866; + background-color: #eff9f1; } + .components-notice.is-warning { + border-left-color: #f0b849; + background-color: #fef8ee; } + .components-notice.is-error { + border-left-color: #d94f4f; + background-color: #f9e2e2; } + +.components-notice__content { + flex-grow: 1; + margin: 4px 25px 4px 0; } + +.components-notice__action.components-button, .components-notice__action.components-button.is-link { + margin-left: 4px; } + +.components-notice__action.components-button.is-secondary { + vertical-align: initial; } + +.components-notice__dismiss { + color: #6c7781; + align-self: flex-start; + flex-shrink: 0; } + .components-notice__dismiss:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover, .components-notice__dismiss:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):active, .components-notice__dismiss:not(:disabled):not([aria-disabled="true"]):focus { + color: #191e23; + background-color: transparent; } + .components-notice__dismiss:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + box-shadow: none; } + +.components-notice-list { + max-width: 100vw; + box-sizing: border-box; + z-index: 29; } + .components-notice-list .components-notice__content { + margin-top: 12px; + margin-bottom: 12px; + line-height: 1.6; } + .components-notice-list .components-notice__action.components-button { + margin-top: -2px; + margin-bottom: -2px; } + +.components-panel { + background: #fff; + border: 1px solid #e2e4e7; } + .components-panel > .components-panel__header:first-child, + .components-panel > .components-panel__body:first-child { + margin-top: -1px; } + .components-panel > .components-panel__header:last-child, + .components-panel > .components-panel__body:last-child { + border-bottom-width: 0; } + +.components-panel + .components-panel { + margin-top: -1px; } + +.components-panel__body { + border-top: 1px solid #e2e4e7; + border-bottom: 1px solid #e2e4e7; } + .components-panel__body h3 { + margin: 0 0 0.5em; } + .components-panel__body.is-opened { + padding: 16px; } + +.components-panel__header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 16px; + height: 50px; + border-top: 1px solid #e2e4e7; + border-bottom: 1px solid #e2e4e7; } + .components-panel__header h2 { + margin: 0; + font-size: inherit; + color: inherit; } + +.components-panel__body + .components-panel__body, +.components-panel__body + .components-panel__header, +.components-panel__header + .components-panel__body, +.components-panel__header + .components-panel__header { + margin-top: -1px; } + +.components-panel__body > .components-panel__body-title { + display: block; + padding: 0; + font-size: inherit; + margin-top: 0; + margin-bottom: 0; + transition: 0.1s background ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .components-panel__body > .components-panel__body-title { + transition-duration: 0s; } } + +.components-panel__body.is-opened > .components-panel__body-title { + margin: -16px; + margin-bottom: 5px; } + +.components-panel__body > .components-panel__body-title:hover { + background: #f3f4f5 !important; + border: none !important; } + +.components-panel__body-toggle.components-button { + position: relative; + padding: 15px; + outline: none; + width: 100%; + font-weight: 600; + text-align: left; + color: #191e23; + border: none; + box-shadow: none; + transition: 0.1s background ease-in-out; + height: auto; + /* rtl:begin:ignore */ + /* rtl:end:ignore */ } + @media (prefers-reduced-motion: reduce) { + .components-panel__body-toggle.components-button { + transition-duration: 0s; } } + .components-panel__body-toggle.components-button:focus:not(:disabled):not([aria-disabled="true"]) { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + .components-panel__body-toggle.components-button:hover { + background: transparent !important; + border: none !important; + box-shadow: none !important; } + .components-panel__body-toggle.components-button .components-panel__arrow { + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + color: #191e23; + fill: currentColor; + transition: 0.1s color ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .components-panel__body-toggle.components-button .components-panel__arrow { + transition-duration: 0s; } } + body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right { + transform: scaleX(-1); + -ms-filter: fliph; + filter: FlipH; + margin-top: -10px; } + +.components-panel__icon { + color: #555d66; + margin: -2px 0 -2px 6px; } + +.components-panel__body-toggle-icon { + margin-right: -5px; } + +.components-panel__color-title { + float: left; + height: 19px; } + +.components-panel__row { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 20px; } + .components-panel__row select { + min-width: 0; } + .components-panel__row label { + margin-right: 10px; + flex-shrink: 0; + max-width: 75%; } + .components-panel__row:empty, .components-panel__row:first-of-type { + margin-top: 0; } + +.components-panel .circle-picker { + padding-bottom: 20px; } + +.components-placeholder.components-placeholder { + position: relative; + margin-bottom: 28px; + padding: 1em; + min-height: 200px; + width: 100%; + text-align: left; + background: rgba(139, 139, 150, 0.1); } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .components-placeholder.components-placeholder { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; } } + .is-dark-theme .components-placeholder.components-placeholder { + background: rgba(255, 255, 255, 0.15); } + .components-placeholder.components-placeholder .components-base-control__label { + font-size: 13px; } + +.components-placeholder__error, +.components-placeholder__instructions, +.components-placeholder__label, +.components-placeholder__fieldset { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; } + +.components-placeholder__label { + display: flex; + font-weight: 600; + margin-bottom: 1em; } + .components-placeholder__label > svg, + .components-placeholder__label .dashicon, + .components-placeholder__label .block-editor-block-icon { + fill: currentColor; + margin-right: 1ch; } + +.components-placeholder__fieldset, +.components-placeholder__fieldset form { + display: flex; + flex-direction: row; + width: 100%; + flex-wrap: wrap; + z-index: 1; } + .components-placeholder__fieldset p, + .components-placeholder__fieldset form p { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; } + +.components-placeholder__fieldset.is-column-layout, +.components-placeholder__fieldset.is-column-layout form { + flex-direction: column; } + +.components-placeholder__input { + margin: 0 8px 0 0; + flex: 1 1 auto; } + +.components-placeholder__instructions { + margin-bottom: 1em; } + +.components-placeholder__error { + margin-top: 1em; + width: 100%; } + +.components-placeholder__preview img { + margin: 3%; + width: 50%; } + +.components-placeholder__fieldset .components-button { + margin-right: 8px; + margin-bottom: 8px; } + .components-placeholder__fieldset .components-button:last-child { + margin-bottom: 0; + margin-right: 0; } + +.components-placeholder__fieldset .components-button:not(.is-link) ~ .components-button.is-link { + margin-left: 10px; + margin-right: 10px; } + .components-placeholder__fieldset .components-button:not(.is-link) ~ .components-button.is-link:last-child { + margin-right: 0; } + +.components-placeholder.is-medium .components-placeholder__instructions, .components-placeholder.is-small .components-placeholder__instructions { + display: none; } + +.components-placeholder.is-medium .components-placeholder__fieldset, +.components-placeholder.is-medium .components-placeholder__fieldset form, .components-placeholder.is-small .components-placeholder__fieldset, +.components-placeholder.is-small .components-placeholder__fieldset form { + flex-direction: column; } + +.components-placeholder.is-medium .components-placeholder__fieldset .components-button, .components-placeholder.is-small .components-placeholder__fieldset .components-button { + margin-right: auto; } + +.components-placeholder.is-small .block-editor-block-icon { + display: none; } + +.components-placeholder.is-small .components-button { + padding: 0 8px 2px; } + +/*!rtl:begin:ignore*/ +.components-popover { + position: fixed; + z-index: 1000000; + top: 0; + left: 0; + opacity: 0; } + .components-popover.is-expanded, .components-popover[data-x-axis][data-y-axis] { + opacity: 1; } + .components-popover.is-expanded { + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1000000 !important; } + .components-popover:not(.is-without-arrow) { + margin-left: 2px; } + .components-popover:not(.is-without-arrow)::before { + border: 8px solid #e2e4e7; } + .components-popover:not(.is-without-arrow)::after { + border: 8px solid #fff; } + .components-popover:not(.is-without-arrow)::before, .components-popover:not(.is-without-arrow)::after { + content: ""; + position: absolute; + height: 0; + width: 0; + line-height: 0; } + .components-popover:not(.is-without-arrow)[data-y-axis="top"] { + margin-top: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="top"]::before { + bottom: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="top"]::after { + bottom: -6px; } + .components-popover:not(.is-without-arrow)[data-y-axis="top"]::before, .components-popover:not(.is-without-arrow)[data-y-axis="top"]::after { + border-bottom: none; + border-left-color: transparent; + border-right-color: transparent; + border-top-style: solid; + margin-left: -10px; } + .components-popover:not(.is-without-arrow)[data-y-axis="bottom"] { + margin-top: 8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="bottom"]::before { + top: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="bottom"]::after { + top: -6px; } + .components-popover:not(.is-without-arrow)[data-y-axis="bottom"]::before, .components-popover:not(.is-without-arrow)[data-y-axis="bottom"]::after { + border-bottom-style: solid; + border-left-color: transparent; + border-right-color: transparent; + border-top: none; + margin-left: -10px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"] { + margin-left: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"]::before { + right: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"]::after { + right: -6px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"]::before, .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="left"]::after { + border-bottom-color: transparent; + border-left-style: solid; + border-right: none; + border-top-color: transparent; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"] { + margin-left: 8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"]::before { + left: -8px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"]::after { + left: -6px; } + .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"]::before, .components-popover:not(.is-without-arrow)[data-y-axis="middle"][data-x-axis="right"]::after { + border-bottom-color: transparent; + border-left: none; + border-right-style: solid; + border-top-color: transparent; } + .components-popover[data-y-axis="top"] { + bottom: 100%; } + .components-popover[data-y-axis="bottom"] { + top: 100%; } + .components-popover[data-y-axis="middle"] { + align-items: center; + display: flex; } + +.components-popover__content { + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.1); + border: 1px solid #e2e4e7; + background: #fff; + height: 100%; } + .components-popover .components-popover__content { + position: absolute; + height: auto; + overflow-y: auto; + min-width: 260px; } + .components-popover.is-expanded .components-popover__content { + position: static; + height: calc(100% - 50px); + overflow-y: visible; + min-width: auto; + border: none; + border-top: 1px solid #e2e4e7; } + .components-popover[data-y-axis="top"] .components-popover__content { + bottom: 100%; } + .components-popover[data-x-axis="center"] .components-popover__content { + left: 50%; + transform: translateX(-50%); } + .components-popover[data-x-axis="right"] .components-popover__content { + position: absolute; + left: 100%; } + .components-popover:not([data-y-axis="middle"])[data-x-axis="right"] .components-popover__content { + margin-left: -24px; } + .components-popover[data-x-axis="left"] .components-popover__content { + position: absolute; + right: 100%; } + .components-popover:not([data-y-axis="middle"])[data-x-axis="left"] .components-popover__content { + margin-right: -24px; } + +.components-popover__content > div { + height: 100%; } + +.components-popover__header { + align-items: center; + background: #fff; + display: flex; + height: 50px; + justify-content: space-between; + padding: 0 8px 0 16px; } + +.components-popover__header-title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; } + +.components-popover__close.components-button { + z-index: 5; } + +/*!rtl:end:ignore*/ +.components-radio-control { + display: flex; + flex-direction: column; } + .components-radio-control .components-base-control__help { + margin-top: 0; } + .components-radio-control .components-base-control__field { + margin-bottom: 0; } + +.components-radio-control__option:not(:last-child) { + margin-bottom: 4px; } + +.components-radio-control__input[type="radio"] { + margin-top: 0; + margin-right: 6px; } + +.components-range-control .components-base-control__field { + display: flex; + justify-content: center; + flex-wrap: wrap; + align-items: center; } + +.components-range-control .dashicon { + flex-shrink: 0; + margin-right: 10px; } + +.components-range-control .components-base-control__label { + width: 100%; } + +.components-range-control .components-range-control__slider { + margin-left: 0; + flex: 1; } + +.components-range-control__reset { + margin-left: 8px; } + +.components-range-control__slider { + width: 100%; + margin-left: 8px; + padding: 0; + -webkit-appearance: none; + background: transparent; + /** + * Thumb + */ + /** + * Track + */ } + .components-range-control__slider::-webkit-slider-thumb { + -webkit-appearance: none; + height: 18px; + width: 18px; + border-radius: 50%; + cursor: pointer; + background: #555d66; + border: 4px solid transparent; + background-clip: padding-box; + box-sizing: border-box; + margin-top: -7px; } + .components-range-control__slider::-moz-range-thumb { + height: 18px; + width: 18px; + border-radius: 50%; + cursor: pointer; + background: #555d66; + border: 4px solid transparent; + background-clip: padding-box; + box-sizing: border-box; } + .components-range-control__slider::-ms-thumb { + height: 18px; + width: 18px; + border-radius: 50%; + cursor: pointer; + background: #555d66; + border: 4px solid transparent; + background-clip: padding-box; + box-sizing: border-box; + margin-top: 0; + height: 14px; + width: 14px; + border: 2px solid transparent; } + .components-range-control__slider:focus { + outline: none; } + .components-range-control__slider:focus::-webkit-slider-thumb { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + .components-range-control__slider:focus::-moz-range-thumb { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + .components-range-control__slider:focus::-ms-thumb { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + .components-range-control__slider::-webkit-slider-runnable-track { + height: 3px; + cursor: pointer; + background: #e2e4e7; + border-radius: 1.5px; + margin-top: -4px; } + .components-range-control__slider::-moz-range-track { + height: 3px; + cursor: pointer; + background: #e2e4e7; + border-radius: 1.5px; } + .components-range-control__slider::-ms-track { + margin-top: -4px; + background: transparent; + border-color: transparent; + color: transparent; + height: 3px; + cursor: pointer; + background: #e2e4e7; + border-radius: 1.5px; } + +.components-range-control__number { + display: inline-block; + margin-left: 8px; + font-weight: 500; + width: 54px; } + +.components-resizable-box__handle { + display: none; + width: 23px; + height: 23px; } + .components-resizable-box__container.is-selected .components-resizable-box__handle, + .components-resizable-box__container.has-show-handle .components-resizable-box__handle { + display: block; } + +.components-resizable-box__handle::after { + display: block; + content: ""; + width: 15px; + height: 15px; + border: 2px solid #fff; + border-radius: 50%; + background: #0085ba; + cursor: inherit; + position: absolute; + top: calc(50% - 8px); + right: calc(50% - 8px); } + +body.admin-color-sunrise .components-resizable-box__handle::after { + background: #d1864a; } + +body.admin-color-ocean .components-resizable-box__handle::after { + background: #a3b9a2; } + +body.admin-color-midnight .components-resizable-box__handle::after { + background: #e14d43; } + +body.admin-color-ectoplasm .components-resizable-box__handle::after { + background: #a7b656; } + +body.admin-color-coffee .components-resizable-box__handle::after { + background: #c2a68c; } + +body.admin-color-blue .components-resizable-box__handle::after { + background: #82b4cb; } + +body.admin-color-light .components-resizable-box__handle::after { + background: #0085ba; } + +.components-resizable-box__side-handle::before { + display: block; + content: ""; + width: 7px; + height: 7px; + border: 2px solid #fff; + background: #0085ba; + cursor: inherit; + position: absolute; + top: calc(50% - 4px); + right: calc(50% - 4px); + transition: transform 0.1s ease-in; + opacity: 0; } + +body.admin-color-sunrise .components-resizable-box__side-handle::before { + background: #d1864a; } + +body.admin-color-ocean .components-resizable-box__side-handle::before { + background: #a3b9a2; } + +body.admin-color-midnight .components-resizable-box__side-handle::before { + background: #e14d43; } + +body.admin-color-ectoplasm .components-resizable-box__side-handle::before { + background: #a7b656; } + +body.admin-color-coffee .components-resizable-box__side-handle::before { + background: #c2a68c; } + +body.admin-color-blue .components-resizable-box__side-handle::before { + background: #82b4cb; } + +body.admin-color-light .components-resizable-box__side-handle::before { + background: #0085ba; } + @media (prefers-reduced-motion: reduce) { + .components-resizable-box__side-handle::before { + transition-duration: 0s; } } + +.is-dark-theme .components-resizable-box__side-handle::before, +.is-dark-theme .components-resizable-box__handle::after { + border-color: #d7dade; } + +.components-resizable-box__side-handle { + z-index: 1; } + +.components-resizable-box__corner-handle { + z-index: 2; } + +.components-resizable-box__side-handle.components-resizable-box__handle-top, +.components-resizable-box__side-handle.components-resizable-box__handle-bottom, +.components-resizable-box__side-handle.components-resizable-box__handle-top::before, +.components-resizable-box__side-handle.components-resizable-box__handle-bottom::before { + width: 100%; + left: 0; + border-left: 0; + border-right: 0; } + +.components-resizable-box__side-handle.components-resizable-box__handle-left, +.components-resizable-box__side-handle.components-resizable-box__handle-right, +.components-resizable-box__side-handle.components-resizable-box__handle-left::before, +.components-resizable-box__side-handle.components-resizable-box__handle-right::before { + height: 100%; + top: 0; + border-top: 0; + border-bottom: 0; } + +.components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, +.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, +.components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, +.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { + animation: components-resizable-box__top-bottom-animation 0.1s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, + .components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, + .components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, + .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { + animation-duration: 1ms; } } + +.components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, +.components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, +.components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, +.components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { + animation: components-resizable-box__left-right-animation 0.1s ease-out 0s; + animation-fill-mode: forwards; } + @media (prefers-reduced-motion: reduce) { + .components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, + .components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, + .components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, + .components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { + animation-duration: 1ms; } } + +@keyframes components-resizable-box__top-bottom-animation { + from { + transform: scaleX(0); + opacity: 0; } + to { + transform: scaleX(1); + opacity: 1; } } + +@keyframes components-resizable-box__left-right-animation { + from { + transform: scaleY(0); + opacity: 0; } + to { + transform: scaleY(1); + opacity: 1; } } + +/*!rtl:begin:ignore*/ +.components-resizable-box__handle-right { + right: calc(11.5px * -1); } + +.components-resizable-box__handle-left { + left: calc(11.5px * -1); } + +.components-resizable-box__handle-top { + top: calc(11.5px * -1); } + +.components-resizable-box__handle-bottom { + bottom: calc(11.5px * -1); } + +/*!rtl:end:ignore*/ +.components-responsive-wrapper { + position: relative; + max-width: 100%; } + .components-responsive-wrapper, + .components-responsive-wrapper > span { + display: block; } + +.components-responsive-wrapper__content { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + margin: auto; } + +.components-sandbox { + overflow: hidden; } + +iframe.components-sandbox { + width: 100%; } + +html.lockscroll, +body.lockscroll { + overflow: hidden; } + +.components-select-control__input { + background: #fff; + height: 36px; + line-height: 36px; + margin: 1px; + outline: 0; + width: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important; } + @media (min-width: 782px) { + .components-select-control__input { + height: 28px; + line-height: 28px; } } + +@media (max-width: 782px) { + .components-base-control .components-base-control__field .components-select-control__input { + font-size: 16px; } } + +.components-snackbar { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + background-color: #32373c; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + color: #fff; + padding: 16px 24px; + width: 100%; + max-width: 600px; + box-sizing: border-box; + cursor: pointer; } + @media (min-width: 600px) { + .components-snackbar { + width: fit-content; } } + .components-snackbar:hover { + background-color: #191e23; } + .components-snackbar:focus { + background-color: #191e23; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007cba; } + +.components-snackbar__action.components-button { + margin-left: 32px; + color: #fff; + height: auto; + flex-shrink: 0; + line-height: 1.4; + padding: 0; } + .components-snackbar__action.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary) { + text-decoration: underline; + background-color: transparent; } + .components-snackbar__action.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):focus { + color: #fff; + box-shadow: none; + outline: 1px dotted #fff; } + .components-snackbar__action.components-button:not(:disabled):not([aria-disabled="true"]):not(.is-secondary):hover { + color: #33b3db; } + +.components-snackbar__content { + display: flex; + align-items: baseline; + justify-content: space-between; + line-height: 1.4; } + +.components-snackbar-list { + position: absolute; + z-index: 100000; + width: 100%; + box-sizing: border-box; } + +.components-snackbar-list__notice-container { + position: relative; + padding-top: 8px; } + +.components-spinner { + display: inline-block; + background-color: #7e8993; + width: 18px; + height: 18px; + opacity: 0.7; + margin: 5px 11px 0; + border-radius: 100%; + position: relative; } + .components-spinner::before { + /* rtl:begin:ignore */ + content: ""; + position: absolute; + background-color: #fff; + top: 3px; + left: 3px; + width: 4px; + height: 4px; + border-radius: 100%; + transform-origin: 6px 6px; + animation: components-spinner__animation 1s infinite linear; + /* rtl:end:ignore */ } + +@keyframes components-spinner__animation { + from { + transform: rotate(0deg); } + to { + transform: rotate(360deg); } } + +.components-text-control__input { + width: 100%; + padding: 6px 8px; } + +.components-textarea-control__input { + width: 100%; + padding: 6px 8px; } + +.components-tip { + display: flex; + color: #555d66; } + .components-tip svg { + -ms-grid-row-align: center; + align-self: center; + fill: #f0b849; + flex-shrink: 0; + margin-right: 16px; } + .components-tip p { + margin: 0; } + +.components-toggle-control .components-base-control__field { + display: flex; + margin-bottom: 12px; + line-height: initial; + align-items: center; } + .components-toggle-control .components-base-control__field .components-form-toggle { + margin-right: 16px; } + .components-toggle-control .components-base-control__field .components-toggle-control__label { + display: block; } + +.components-accessible-toolbar { + display: inline-flex; + flex-shrink: 0; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .components-accessible-toolbar { + display: flex; } } + +.components-tab-button { + padding: 3px; + color: #555d66; + height: 36px; + font-weight: 500; } + .components-tab-button.is-pressed, .components-tab-button.is-pressed:hover { + color: #fff; } + .components-tab-button:disabled { + cursor: default; } + .components-tab-button > span { + border: 1px solid transparent; + padding: 0 6px; + box-sizing: content-box; + height: 28px; + line-height: 28px; } + .components-tab-button:hover > span, + .components-tab-button:focus > span { + color: #555d66; } + .components-tab-button:not(:disabled).is-pressed > span, + .components-tab-button:not(:disabled):hover > span, + .components-tab-button:not(:disabled):focus > span { + border: 1px solid #555d66; } + .components-tab-button.is-pressed > span, + .components-tab-button.is-pressed:hover > span { + background-color: #555d66; + color: #fff; } + +.components-toolbar__control.components-button { + width: 36px; + height: 36px; } + .components-toolbar__control.components-button[data-subscript] svg { + padding: 5px 10px 5px 0; } + .components-toolbar__control.components-button[data-subscript]::after { + content: attr(data-subscript); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + font-weight: 600; + line-height: 12px; + position: absolute; + right: 8px; + bottom: 10px; } + .components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]::after { + color: #fff; } + .components-toolbar__control.components-button.is-pressed { + padding: 3px; + outline: none; } + .components-toolbar__control.components-button.is-pressed > svg { + padding: 5px; + border-radius: 4px; + height: 30px; + width: 30px; + box-sizing: border-box; + outline: none; + color: #fff; + box-shadow: none; + background: #555d66; } + +.components-toolbar-group { + border: 1px solid #e2e4e7; + background-color: #fff; + display: flex; + flex-shrink: 0; + margin-right: -1px; + line-height: 0; } + .components-toolbar-group .components-toolbar-group { + border-width: 0; + margin: 0; } + +.components-toolbar { + margin: 0; + border: 1px solid #e2e4e7; + background-color: #fff; + display: flex; + flex-shrink: 0; } + +div.components-toolbar > div { + display: block; + margin: 0; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + div.components-toolbar > div { + display: flex; } } + +div.components-toolbar > div + div { + margin-left: -3px; } + div.components-toolbar > div + div.has-left-divider { + margin-left: 6px; + position: relative; + overflow: visible; } + div.components-toolbar > div + div.has-left-divider::before { + display: inline-block; + content: ""; + box-sizing: content-box; + background-color: #e2e4e7; + position: absolute; + top: 8px; + left: -3px; + width: 1px; + height: 20px; } + +.components-tooltip.components-popover { + z-index: 1000002; } + .components-tooltip.components-popover::before { + border-color: transparent; } + .components-tooltip.components-popover[data-y-axis="top"]::after { + border-top-color: #191e23; } + .components-tooltip.components-popover[data-y-axis="bottom"]::after { + border-bottom-color: #191e23; } + .components-tooltip.components-popover .components-popover__content { + min-width: 0; } + +.components-tooltip .components-popover__content { + padding: 4px 12px; + background: #191e23; + border-width: 0; + color: #fff; + white-space: nowrap; + text-align: center; } + +.components-tooltip__shortcut { + display: block; + color: #7e8993; } + +.components-visually-hidden { + 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; + width: 1px; + word-wrap: normal !important; } + +.components-visually-hidden:focus { + background-color: #e2e4e7; + clip: auto !important; + -webkit-clip-path: none; + clip-path: none; + color: #444; + display: block; + font-size: 1em; + height: auto; + left: 5px; + line-height: normal; + padding: 15px 23px 14px; + text-decoration: none; + top: 5px; + width: auto; + z-index: 100000; } diff --git a/wp-includes/css/dist/components/style.min.css b/wp-includes/css/dist/components/style.min.css new file mode 100644 index 0000000..794fc12 --- /dev/null +++ b/wp-includes/css/dist/components/style.min.css @@ -0,0 +1,9 @@ +.components-animate__appear{animation:components-animate__appear-animation .1s cubic-bezier(0,0,.2,1) 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__appear{animation-duration:1ms}}.components-animate__appear.is-from-top,.components-animate__appear.is-from-top.is-from-left{transform-origin:top left}.components-animate__appear.is-from-top.is-from-right{transform-origin:top right}.components-animate__appear.is-from-bottom,.components-animate__appear.is-from-bottom.is-from-left{transform-origin:bottom left}.components-animate__appear.is-from-bottom.is-from-right{transform-origin:bottom right}@keyframes components-animate__appear-animation{0%{transform:translateY(-2em) scaleY(0) scaleX(0)}to{transform:translateY(0) scaleY(1) scaleX(1)}}.components-animate__slide-in{animation:components-animate__slide-in-animation .1s cubic-bezier(0,0,.2,1);animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__slide-in{animation-duration:1ms}}.components-animate__slide-in.is-from-left{transform:translateX(100%)}@keyframes components-animate__slide-in-animation{to{transform:translateX(0)}}.components-animate__loading{animation:components-animate__loading 1.6s ease-in-out infinite}@keyframes components-animate__loading{0%{opacity:.5}50%{opacity:1}to{opacity:.5}}.components-angle-picker-control{width:50%}.components-angle-picker-control.components-base-control .components-base-control__label{display:block}.components-angle-picker-control__input-field{width:calc(100% - 36px);max-width:100px}.components-angle-picker-control__angle-circle{width:28px;height:28px;border:2px solid #555d66;border-radius:50%;float:left;margin-right:4px;cursor:grab}.components-angle-picker-control__angle-circle-indicator-wrapper{position:relative;width:100%;height:100%}.components-angle-picker-control__angle-circle-indicator{width:1px;height:1px;border-radius:50%;border:3px solid #555d66;display:block;position:absolute;top:-14px;bottom:0;left:0;right:0;margin:auto;background:#555d66}.components-autocomplete__popover .components-popover__content{min-width:200px}.components-autocomplete__popover .components-autocomplete__results{padding:3px;display:flex;flex-direction:column;align-items:stretch}.components-autocomplete__popover .components-autocomplete__results:empty{display:none}.components-autocomplete__result.components-button{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;color:#555d66;display:flex;flex-direction:row;flex-grow:1;flex-shrink:0;align-items:center;padding:6px 8px;margin-left:-3px;margin-right:-3px;text-align:left}.components-autocomplete__result.components-button.is-selected{color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.components-autocomplete__result.components-button:hover{color:#191e23;border:none;box-shadow:none;background:#f3f4f5}.components-base-control{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-base-control .components-base-control__field{margin-bottom:8px}.components-panel__row .components-base-control .components-base-control__field{margin-bottom:inherit}.components-base-control .components-base-control__label{display:inline-block;margin-bottom:4px}.components-base-control .components-base-control__help{margin-top:-8px;font-style:italic}.components-base-control+.components-base-control{margin-bottom:16px}.components-button-group{display:inline-block}.components-button-group .components-button{border-radius:0;display:inline-flex}.components-button-group .components-button+.components-button{margin-left:-1px}.components-button-group .components-button:first-child{border-radius:3px 0 0 3px}.components-button-group .components-button:last-child{border-radius:0 3px 3px 0}.components-button-group .components-button.is-primary,.components-button-group .components-button:focus{position:relative;z-index:1}.components-button-group .components-button.is-primary{box-shadow:none}.components-button{display:inline-flex;text-decoration:none;font-size:13px;margin:0;border:0;cursor:pointer;-webkit-appearance:none;background:none;transition:box-shadow .1s linear;height:36px;align-items:center;box-sizing:border-box;padding:0 8px;overflow:hidden;border-radius:3px;color:#555d66}@media (prefers-reduced-motion:reduce){.components-button{transition-duration:0s}}.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-primary):not(.is-tertiary):not(.is-link):hover{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #555d66,inset 0 0 0 2px #fff}.components-button.is-secondary{white-space:nowrap;color:#0075af;border:1px solid #0075af;background:#f3f5f6}body.admin-color-sunrise .components-button.is-secondary{color:#c47e46;border-color:#c47e46}body.admin-color-ocean .components-button.is-secondary{color:#99ae98;border-color:#99ae98}body.admin-color-midnight .components-button.is-secondary{color:#d4483f;border-color:#d4483f}body.admin-color-ectoplasm .components-button.is-secondary{color:#9dab51;border-color:#9dab51}body.admin-color-coffee .components-button.is-secondary{color:#b69c84;border-color:#b69c84}body.admin-color-blue .components-button.is-secondary{color:#cca154;border-color:#cca154}body.admin-color-light .components-button.is-secondary{color:#007daf;border-color:#007daf}.components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{background:#f1f1f1;border-color:#005d8c;color:#005d8c;text-decoration:none}body.admin-color-sunrise .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#9d6538;color:#9d6538}body.admin-color-ocean .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#7a8b7a;color:#7a8b7a}body.admin-color-midnight .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#a93a32;color:#a93a32}body.admin-color-ectoplasm .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#7d8941;color:#7d8941}body.admin-color-coffee .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#927d69;color:#927d69}body.admin-color-blue .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#a38043;color:#a38043}body.admin-color-light .components-button.is-secondary:not(:disabled):not([aria-disabled=true]):hover{border-color:#00648c;color:#00648c}.components-button.is-secondary:focus:enabled{background:#f3f5f6;color:#005d8c;border-color:#0076b1;box-shadow:0 0 0 1px #0076b1;text-decoration:none}body.admin-color-sunrise .components-button.is-secondary:focus:enabled{color:#9d6538;border-color:#c77f46;box-shadow:0 0 0 1px #c77f46}body.admin-color-ocean .components-button.is-secondary:focus:enabled{color:#7a8b7a;border-color:#9bb09a;box-shadow:0 0 0 1px #9bb09a}body.admin-color-midnight .components-button.is-secondary:focus:enabled{color:#a93a32;border-color:#d64940;box-shadow:0 0 0 1px #d64940}body.admin-color-ectoplasm .components-button.is-secondary:focus:enabled{color:#7d8941;border-color:#9fad52;box-shadow:0 0 0 1px #9fad52}body.admin-color-coffee .components-button.is-secondary:focus:enabled{color:#927d69;border-color:#b89e85;box-shadow:0 0 0 1px #b89e85}body.admin-color-blue .components-button.is-secondary:focus:enabled{color:#a38043;border-color:#cea255;box-shadow:0 0 0 1px #cea255}body.admin-color-light .components-button.is-secondary:focus:enabled{color:#00648c;border-color:#007eb1;box-shadow:0 0 0 1px #007eb1}.components-button.is-secondary:not([aria-disabled=true]):active:enabled{background:#f3f5f6;color:#0076b1;border-color:#7e8993;box-shadow:none}body.admin-color-sunrise .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#c77f46}body.admin-color-ocean .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#9bb09a}body.admin-color-midnight .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#d64940}body.admin-color-ectoplasm .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#9fad52}body.admin-color-coffee .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#b89e85}body.admin-color-blue .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#cea255}body.admin-color-light .components-button.is-secondary:not([aria-disabled=true]):active:enabled{color:#007eb1}.components-button.is-secondary:disabled,.components-button.is-secondary[aria-disabled=true]{color:#a0a5aa;border-color:#ddd;background:#f7f7f7;text-shadow:0 1px 0 #fff;transform:none;opacity:1}.components-button.is-primary{white-space:nowrap;background:#007cba;border:1px solid #007cba;color:#fff;text-decoration:none;text-shadow:none}body.admin-color-sunrise .components-button.is-primary{background:#d1864a;border-color:#d1864a}body.admin-color-ocean .components-button.is-primary{background:#a3b9a2;border-color:#a3b9a2}body.admin-color-midnight .components-button.is-primary{background:#e14d43;border-color:#e14d43}body.admin-color-ectoplasm .components-button.is-primary{background:#a7b656;border-color:#a7b656}body.admin-color-coffee .components-button.is-primary{background:#c2a68c;border-color:#c2a68c}body.admin-color-blue .components-button.is-primary{background:#d9ab59;border-color:#d9ab59}body.admin-color-light .components-button.is-primary{background:#0085ba;border-color:#0085ba}.components-button.is-primary:focus:enabled,.components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#0070a7;border-color:#0070a7;color:#fff}body.admin-color-sunrise .components-button.is-primary:focus:enabled,body.admin-color-sunrise .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#bc7943;border-color:#bc7943}body.admin-color-ocean .components-button.is-primary:focus:enabled,body.admin-color-ocean .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#93a792;border-color:#93a792}body.admin-color-midnight .components-button.is-primary:focus:enabled,body.admin-color-midnight .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#cb453c;border-color:#cb453c}body.admin-color-ectoplasm .components-button.is-primary:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#96a44d;border-color:#96a44d}body.admin-color-coffee .components-button.is-primary:focus:enabled,body.admin-color-coffee .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#af957e;border-color:#af957e}body.admin-color-blue .components-button.is-primary:focus:enabled,body.admin-color-blue .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#c39a50;border-color:#c39a50}body.admin-color-light .components-button.is-primary:focus:enabled,body.admin-color-light .components-button.is-primary:not(:disabled):not([aria-disabled=true]):hover{background:#0078a7;border-color:#0078a7}.components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}body.admin-color-sunrise .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #d1864a}body.admin-color-ocean .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b9a2}body.admin-color-midnight .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}body.admin-color-ectoplasm .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #a7b656}body.admin-color-coffee .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #c2a68c}body.admin-color-blue .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #d9ab59}body.admin-color-light .components-button.is-primary:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #0085ba}.components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#006395;border-color:#006395;color:#fff}body.admin-color-sunrise .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#a76b3b;border-color:#a76b3b}body.admin-color-ocean .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#829482;border-color:#829482}body.admin-color-midnight .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#b43e36;border-color:#b43e36}body.admin-color-ectoplasm .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#869245;border-color:#869245}body.admin-color-coffee .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#9b8570;border-color:#9b8570}body.admin-color-blue .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#ae8947;border-color:#ae8947}body.admin-color-light .components-button.is-primary:not([aria-disabled=true]):active:enabled{background:#006a95;border-color:#006a95}.components-button.is-primary:disabled,.components-button.is-primary:disabled:active:enabled,.components-button.is-primary[aria-disabled=true],.components-button.is-primary[aria-disabled=true]:active:enabled,.components-button.is-primary[aria-disabled=true]:enabled{color:#66b0d6;background:#1989c1;border-color:#1989c1;opacity:1}body.admin-color-sunrise .components-button.is-primary:disabled,body.admin-color-sunrise .components-button.is-primary:disabled:active:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true],body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:enabled{color:#e3b692;background:#d6925c;border-color:#d6925c}body.admin-color-ocean .components-button.is-primary:disabled,body.admin-color-ocean .components-button.is-primary:disabled:active:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true],body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:enabled{color:#c8d5c7;background:#acc0ab;border-color:#acc0ab}body.admin-color-midnight .components-button.is-primary:disabled,body.admin-color-midnight .components-button.is-primary:disabled:active:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true],body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:enabled{color:#ed948e;background:#e45f56;border-color:#e45f56}body.admin-color-ectoplasm .components-button.is-primary:disabled,body.admin-color-ectoplasm .components-button.is-primary:disabled:active:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true],body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:enabled{color:#cad39a;background:#b0bd67;border-color:#b0bd67}body.admin-color-coffee .components-button.is-primary:disabled,body.admin-color-coffee .components-button.is-primary:disabled:active:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true],body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:enabled{color:#dacaba;background:#c8af98;border-color:#c8af98}body.admin-color-blue .components-button.is-primary:disabled,body.admin-color-blue .components-button.is-primary:disabled:active:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true],body.admin-color-blue .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true]:enabled{color:#e8cd9b;background:#ddb36a;border-color:#ddb36a}body.admin-color-light .components-button.is-primary:disabled,body.admin-color-light .components-button.is-primary:disabled:active:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true],body.admin-color-light .components-button.is-primary[aria-disabled=true]:active:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true]:enabled{color:#66b6d6;background:#1991c1;border-color:#1991c1}.components-button.is-primary:disabled:active:enabled:focus:enabled,.components-button.is-primary:disabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}body.admin-color-sunrise .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-sunrise .components-button.is-primary:disabled:focus:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-sunrise .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #d1864a}body.admin-color-ocean .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-ocean .components-button.is-primary:disabled:focus:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-ocean .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #a3b9a2}body.admin-color-midnight .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-midnight .components-button.is-primary:disabled:focus:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-midnight .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #e14d43}body.admin-color-ectoplasm .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary:disabled:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-ectoplasm .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #a7b656}body.admin-color-coffee .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-coffee .components-button.is-primary:disabled:focus:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-coffee .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #c2a68c}body.admin-color-blue .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-blue .components-button.is-primary:disabled:focus:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-blue .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #d9ab59}body.admin-color-light .components-button.is-primary:disabled:active:enabled:focus:enabled,body.admin-color-light .components-button.is-primary:disabled:focus:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,body.admin-color-light .components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #0085ba}.components-button.is-primary.is-busy,.components-button.is-primary.is-busy:disabled,.components-button.is-primary.is-busy[aria-disabled=true]{color:#fff;background-size:100px 100%;background-image:linear-gradient(-45deg,#007cba 28%,#006395 0,#006395 72%,#007cba 0);border-color:#007cba}body.admin-color-sunrise .components-button.is-primary.is-busy,body.admin-color-sunrise .components-button.is-primary.is-busy:disabled,body.admin-color-sunrise .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(-45deg,#d1864a 28%,#a76b3b 0,#a76b3b 72%,#d1864a 0);border-color:#d1864a}body.admin-color-ocean .components-button.is-primary.is-busy,body.admin-color-ocean .components-button.is-primary.is-busy:disabled,body.admin-color-ocean .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(-45deg,#a3b9a2 28%,#829482 0,#829482 72%,#a3b9a2 0);border-color:#a3b9a2}body.admin-color-midnight .components-button.is-primary.is-busy,body.admin-color-midnight .components-button.is-primary.is-busy:disabled,body.admin-color-midnight .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(-45deg,#e14d43 28%,#b43e36 0,#b43e36 72%,#e14d43 0);border-color:#e14d43}body.admin-color-ectoplasm .components-button.is-primary.is-busy,body.admin-color-ectoplasm .components-button.is-primary.is-busy:disabled,body.admin-color-ectoplasm .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(-45deg,#a7b656 28%,#869245 0,#869245 72%,#a7b656 0);border-color:#a7b656}body.admin-color-coffee .components-button.is-primary.is-busy,body.admin-color-coffee .components-button.is-primary.is-busy:disabled,body.admin-color-coffee .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(-45deg,#c2a68c 28%,#9b8570 0,#9b8570 72%,#c2a68c 0);border-color:#c2a68c}body.admin-color-blue .components-button.is-primary.is-busy,body.admin-color-blue .components-button.is-primary.is-busy:disabled,body.admin-color-blue .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(-45deg,#d9ab59 28%,#ae8947 0,#ae8947 72%,#d9ab59 0);border-color:#d9ab59}body.admin-color-light .components-button.is-primary.is-busy,body.admin-color-light .components-button.is-primary.is-busy:disabled,body.admin-color-light .components-button.is-primary.is-busy[aria-disabled=true]{background-image:linear-gradient(-45deg,#0085ba 28%,#006a95 0,#006a95 72%,#0085ba 0);border-color:#0085ba}.components-button.is-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:none;outline:none;text-align:left;color:#0073aa;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out;height:auto}@media (prefers-reduced-motion:reduce){.components-button.is-link{transition-duration:0s}}.components-button.is-link:not(:disabled):not([aria-disabled=true]):hover,.components-button.is-link:not([aria-disabled=true]):active{color:#00a0d2}.components-button.is-link:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.components-button.is-link.is-destructive{color:#d94f4f}.components-button:not([aria-disabled=true]):active{color:inherit}.components-button:disabled,.components-button[aria-disabled=true]{cursor:default;opacity:.3}.components-button:focus:not(:disabled){background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{animation:components-button__busy-animation 2.5s linear infinite;background-size:100px 100%;background-image:repeating-linear-gradient(-45deg,#e2e4e7,#fff 11px,#fff 0,#e2e4e7 20px);opacity:1}.components-button.is-small{height:24px;line-height:22px;padding:0 8px;font-size:11px}.components-button.is-tertiary{color:#007cba}body.admin-color-sunrise .components-button.is-tertiary{color:#837425}body.admin-color-ocean .components-button.is-tertiary{color:#5e7d5e}body.admin-color-midnight .components-button.is-tertiary{color:#497b8d}body.admin-color-ectoplasm .components-button.is-tertiary{color:#523f6d}body.admin-color-coffee .components-button.is-tertiary{color:#59524c}body.admin-color-blue .components-button.is-tertiary{color:#417e9b}body.admin-color-light .components-button.is-tertiary{color:#007cba}.components-button.is-tertiary .dashicon{display:inline-block;flex:0 0 auto}.components-button.is-tertiary:not([aria-disabled=true]):active:focus:enabled{box-shadow:none}.components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#005d8c}body.admin-color-sunrise .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#62571c}body.admin-color-ocean .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#475e47}body.admin-color-midnight .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#375c6a}body.admin-color-ectoplasm .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#3e2f52}body.admin-color-coffee .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#433e39}body.admin-color-blue .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#315f74}body.admin-color-light .components-button.is-tertiary:not(:disabled):not([aria-disabled=true]):hover{color:#005d8c}.components-button.has-icon .dashicon{display:inline-block;flex:0 0 auto}.components-button.has-icon.has-text svg{margin-right:8px}.components-button svg{fill:currentColor;outline:none}.components-button .screen-reader-text{height:auto}@keyframes components-button__busy-animation{0%{background-position:200px 0}}.components-checkbox-control__input[type=checkbox]{border:1px solid #b4b9be;background:#fff;color:#555;clear:none;cursor:pointer;display:inline-block;line-height:0;margin:0 4px 0 0;outline:0;padding:0!important;text-align:center;vertical-align:top;width:25px;height:25px;-webkit-appearance:none;box-shadow:inset 0 1px 2px rgba(0,0,0,.1);transition:border-color .05s ease-in-out}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{height:16px;width:16px}}.components-checkbox-control__input[type=checkbox]:focus{border-color:#5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8);outline:2px solid transparent}.components-checkbox-control__input[type=checkbox]:checked{background:#11a0d2;border-color:#11a0d2}.components-checkbox-control__input[type=checkbox]:checked::-ms-check{opacity:0}.components-checkbox-control__input[type=checkbox]:focus:checked{border:none}.components-checkbox-control__input[type=checkbox]:checked:before{content:none}.components-checkbox-control__input-container{position:relative;display:inline-block;margin-right:12px;vertical-align:middle;width:25px;height:25px}@media (min-width:600px){.components-checkbox-control__input-container{width:16px;height:16px}}svg.components-checkbox-control__checked{fill:#fff;cursor:pointer;position:absolute;left:-4px;top:-2px;width:31px;height:31px;-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}@media (min-width:600px){svg.components-checkbox-control__checked{width:21px;height:21px;left:-3px}}.components-circular-option-picker{display:inline-block;margin-top:.6rem;width:100%}.components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper{display:flex;justify-content:flex-end}.components-circular-option-picker__option-wrapper{display:inline-block;height:28px;width:28px;margin-right:12px;margin-bottom:12px;vertical-align:top;transform:scale(1);transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option-wrapper{transition-duration:0s}}.components-circular-option-picker__option-wrapper:hover{transform:scale(1.2)}.components-circular-option-picker__option-wrapper>div{height:100%;width:100%}.components-circular-option-picker__option-wrapper:before{content:"";position:absolute;top:1px;left:1px;bottom:1px;right:1px;border-radius:50%;z-index:-1;background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='28' height='28' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 8V6H4v2h2zm2 0V6h2v2H8zm2 8H8v-2h2v2zm2 0v-2h2v2h-2zm0 2v-2h-2v2H8v2h2v-2h2zm2 0v2h-2v-2h2zm2 0h-2v-2h2v2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2v2zm-2-4v-2h2v2h-2z' fill='%23555D65'/%3E%3Cpath d='M18 18v2h-2v-2h2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2H8zm0 2v-2H6v2h2zm2 0v-2h2v2h-2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2h-2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4V0zm0 4V2H2v2h2zm2 0V2h2v2H6zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2H6z' fill='%23555D65'/%3E%3C/svg%3E")}.components-circular-option-picker__option{display:inline-block;vertical-align:top;height:100%;width:100%;border:none;border-radius:50%;background:transparent;box-shadow:inset 0 0 0 14px;transition:box-shadow .1s ease;cursor:pointer}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option{transition-duration:0s}}.components-circular-option-picker__option:hover{box-shadow:inset 0 0 0 14px!important}.components-circular-option-picker__option.is-pressed{box-shadow:inset 0 0 0 4px;position:relative;z-index:1}.components-circular-option-picker__option.is-pressed+svg{position:absolute;left:2px;top:2px;border-radius:50%;z-index:2;background:#fff;pointer-events:none}.components-circular-option-picker__option:after{content:"";position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);border:1px solid transparent}.components-circular-option-picker__option:focus:after{content:"";border:2px solid #606a73;width:32px;height:32px;position:absolute;top:-2px;left:-2px;border-radius:50%;box-shadow:inset 0 0 0 2px #fff}.components-circular-option-picker__option.components-button:focus{background-color:transparent;box-shadow:inset 0 0 0 14px;outline:none}.components-circular-option-picker__button-action .components-circular-option-picker__option{color:#fff;background:#fff}.components-circular-option-picker__dropdown-link-action{margin-right:16px}.components-circular-option-picker__dropdown-link-action .components-button{line-height:22px}.component-color-indicator{width:25px;height:16px;margin-left:.8rem;border:1px solid #dadada;display:inline-block}.component-color-indicator+.component-color-indicator{margin-left:.5rem}.components-color-picker{width:100%;overflow:hidden}.components-color-picker *{box-sizing:border-box}.components-color-picker__saturation{width:100%;padding-bottom:55%;position:relative}.components-color-picker__body{padding:16px 16px 12px}.components-color-picker__controls{display:flex}.components-color-picker__alpha-pointer,.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{padding:0;position:absolute;cursor:pointer;box-shadow:none;border:none}.components-color-picker__swatch{margin-right:8px;width:32px;height:32px;border-radius:50%;position:relative;overflow:hidden;background-image:linear-gradient(45deg,#ddd 25%,transparent 0),linear-gradient(-45deg,#ddd 25%,transparent 0),linear-gradient(45deg,transparent 75%,#ddd 0),linear-gradient(-45deg,transparent 75%,#ddd 0);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0}.is-alpha-disabled .components-color-picker__swatch{width:12px;height:12px;margin-top:0}.components-color-picker__active{border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);z-index:2}.components-color-picker__active,.components-color-picker__saturation-black,.components-color-picker__saturation-color,.components-color-picker__saturation-white{position:absolute;top:0;left:0;right:0;bottom:0}.components-color-picker__saturation-color{overflow:hidden}.components-color-picker__saturation-white{background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.components-color-picker__saturation-black{background:linear-gradient(0deg,#000,transparent)}.components-color-picker__saturation-pointer{width:14px;height:14px;padding:0;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;background-color:transparent;transform:translate(-4px,-4px)}.components-color-picker__toggles{flex:1}.components-color-picker__alpha{background-image:linear-gradient(45deg,#ddd 25%,transparent 0),linear-gradient(-45deg,#ddd 25%,transparent 0),linear-gradient(45deg,transparent 75%,#ddd 0),linear-gradient(-45deg,transparent 75%,#ddd 0);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0}.components-color-picker__alpha-gradient,.components-color-picker__hue-gradient{position:absolute;top:0;left:0;right:0;bottom:0}.components-color-picker__alpha,.components-color-picker__hue{height:12px;position:relative}.is-alpha-enabled .components-color-picker__hue{margin-bottom:8px}.components-color-picker__alpha-bar,.components-color-picker__hue-bar{position:relative;margin:0 3px;height:100%;padding:0 2px}.components-color-picker__hue-gradient{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.components-color-picker__alpha-pointer,.components-color-picker__hue-pointer{left:0;width:14px;height:14px;border-radius:50%;box-shadow:0 1px 4px 0 rgba(0,0,0,.37);background:#fff;transform:translate(-7px,-1px)}.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{transition-duration:0s}}.components-color-picker__saturation-pointer:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #00a0d2,0 0 5px 0 #00a0d2,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4)}.components-color-picker__alpha-pointer:focus,.components-color-picker__hue-pointer:focus{border-color:#00a0d2;box-shadow:0 0 0 2px #00a0d2,0 0 3px 0 #00a0d2;outline:2px solid transparent;outline-offset:-2px}.components-color-picker__inputs-wrapper{margin:0 -4px;padding-top:16px;display:flex;align-items:flex-end}.components-color-picker__inputs-wrapper fieldset{flex:1;border:none;margin:0;padding:0}.components-color-picker__inputs-wrapper .components-color-picker__inputs-fields .components-text-control__input[type=number]{padding:6px 8px}.components-color-picker__inputs-field{width:100%}.components-color-picker__inputs-fields{display:flex;direction:ltr;flex-grow:1;margin-right:4px}.components-color-picker__inputs-fields .components-base-control+.components-base-control{margin-bottom:0}.components-color-picker__inputs-fields .components-base-control__field{margin:0 4px}.components-color-picker__inputs-toggle{height:30px;padding:0 5px}.components-custom-gradient-picker{margin-top:8px}.components-custom-gradient-picker__gradient-bar:not(.has-gradient){opacity:.4}.components-custom-gradient-picker__gradient-bar{width:100%;height:24px;border-radius:24px;margin-bottom:16px;padding-left:3px;padding-right:21px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container{position:relative}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point{border-radius:50%;background:#fff;padding:2px;min-width:24px;width:24px;height:24px;position:relative}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point svg{height:100%;width:100%}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button{border:2px solid #fff;border-radius:50%;height:18px;padding:0;position:absolute;width:18px;top:3px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active{background:#fafafa;color:#23282d;border-color:#999;box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}.components-custom-gradient-picker__color-picker-popover .components-custom-gradient-picker__remove-control-point{margin-left:auto;margin-right:auto;display:block;margin-bottom:8px}.components-custom-gradient-picker__inserter{width:100%}.components-custom-gradient-picker__liner-gradient-indicator{display:inline-block;flex:0 auto;width:20px;height:20px}.components-custom-gradient-picker__ui-line{display:flex;justify-content:space-between}.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-angle-picker,.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-custom-gradient-picker__type-picker{margin-bottom:0}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar{border:none}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar>div+div{margin-left:1px}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed>svg{background:#fff;border:1px solid #7e8993;border-radius:2px}.components-custom-select-control{color:#555d66;position:relative}.components-custom-select-control__label{display:block;margin-bottom:5px}.components-custom-select-control__button{border:1px solid #7e8993;border-radius:4px;color:#555d66;display:inline;min-height:30px;min-width:130px;position:relative;text-align:left}.components-custom-select-control__button:focus{border-color:#00a0d2}.components-custom-select-control__button-icon{height:100%;padding:0 4px;position:absolute;right:0;top:0}.components-custom-select-control__menu{background:#fff;max-height:400px;min-width:100%;overflow:auto;padding:0;position:absolute;z-index:1000000}.components-custom-select-control__item{align-items:center;display:flex;list-style-type:none;padding:10px 5px 10px 25px}.components-custom-select-control__item.is-highlighted{background:#e2e4e7}.components-custom-select-control__item-icon{margin-left:-20px;margin-right:0}svg.dashicon{fill:currentColor;outline:none}.PresetDateRangePicker_panel{padding:0 22px 11px}.PresetDateRangePicker_button{position:relative;height:100%;text-align:center;background:0 0;border:2px solid #00a699;color:#00a699;padding:4px 12px;margin-right:8px;font:inherit;font-weight:700;line-height:normal;overflow:visible;box-sizing:border-box;cursor:pointer}.PresetDateRangePicker_button:active{outline:0}.PresetDateRangePicker_button__selected{color:#fff;background:#00a699}.SingleDatePickerInput{display:inline-block;background-color:#fff}.SingleDatePickerInput__withBorder{border-radius:2px;border:1px solid #dbdbdb}.SingleDatePickerInput__rtl{direction:rtl}.SingleDatePickerInput__disabled{background-color:#f2f2f2}.SingleDatePickerInput__block{display:block}.SingleDatePickerInput__showClearDate{padding-right:30px}.SingleDatePickerInput_clearDate{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;padding:10px;margin:0 10px 0 5px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.SingleDatePickerInput_clearDate__default:focus,.SingleDatePickerInput_clearDate__default:hover{background:#dbdbdb;border-radius:50%}.SingleDatePickerInput_clearDate__small{padding:6px}.SingleDatePickerInput_clearDate__hide{visibility:hidden}.SingleDatePickerInput_clearDate_svg{fill:#82888a;height:12px;width:15px;vertical-align:middle}.SingleDatePickerInput_clearDate_svg__small{height:9px}.SingleDatePickerInput_calendarIcon{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;display:inline-block;vertical-align:middle;padding:10px;margin:0 5px 0 10px}.SingleDatePickerInput_calendarIcon_svg{fill:#82888a;height:15px;width:14px;vertical-align:middle}.SingleDatePicker{position:relative;display:inline-block}.SingleDatePicker__block{display:block}.SingleDatePicker_picker{z-index:1;background-color:#fff;position:absolute}.SingleDatePicker_picker__rtl{direction:rtl}.SingleDatePicker_picker__directionLeft{left:0}.SingleDatePicker_picker__directionRight{right:0}.SingleDatePicker_picker__portal{background-color:rgba(0,0,0,.3);position:fixed;top:0;left:0;height:100%;width:100%}.SingleDatePicker_picker__fullScreenPortal{background-color:#fff}.SingleDatePicker_closeButton{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;position:absolute;top:0;right:0;padding:15px;z-index:2}.SingleDatePicker_closeButton:focus,.SingleDatePicker_closeButton:hover{color:#b0b3b4;text-decoration:none}.SingleDatePicker_closeButton_svg{height:15px;width:15px;fill:#cacccd}.DayPickerKeyboardShortcuts_buttonReset{background:0 0;border:0;border-radius:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;cursor:pointer;font-size:14px}.DayPickerKeyboardShortcuts_buttonReset:active{outline:0}.DayPickerKeyboardShortcuts_show{width:22px;position:absolute;z-index:2}.DayPickerKeyboardShortcuts_show__bottomRight{border-top:26px solid transparent;border-right:33px solid #00a699;bottom:0;right:0}.DayPickerKeyboardShortcuts_show__bottomRight:hover{border-right:33px solid #008489}.DayPickerKeyboardShortcuts_show__topRight{border-bottom:26px solid transparent;border-right:33px solid #00a699;top:0;right:0}.DayPickerKeyboardShortcuts_show__topRight:hover{border-right:33px solid #008489}.DayPickerKeyboardShortcuts_show__topLeft{border-bottom:26px solid transparent;border-left:33px solid #00a699;top:0;left:0}.DayPickerKeyboardShortcuts_show__topLeft:hover{border-left:33px solid #008489}.DayPickerKeyboardShortcuts_showSpan{color:#fff;position:absolute}.DayPickerKeyboardShortcuts_showSpan__bottomRight{bottom:0;right:-28px}.DayPickerKeyboardShortcuts_showSpan__topRight{top:1px;right:-28px}.DayPickerKeyboardShortcuts_showSpan__topLeft{top:1px;left:-28px}.DayPickerKeyboardShortcuts_panel{overflow:auto;background:#fff;border:1px solid #dbdbdb;border-radius:2px;position:absolute;top:0;bottom:0;right:0;left:0;z-index:2;padding:22px;margin:33px}.DayPickerKeyboardShortcuts_title{font-size:16px;font-weight:700;margin:0}.DayPickerKeyboardShortcuts_list{list-style:none;padding:0;font-size:14px}.DayPickerKeyboardShortcuts_close{position:absolute;right:22px;top:22px;z-index:2}.DayPickerKeyboardShortcuts_close:active{outline:0}.DayPickerKeyboardShortcuts_closeSvg{height:15px;width:15px;fill:#cacccd}.DayPickerKeyboardShortcuts_closeSvg:focus,.DayPickerKeyboardShortcuts_closeSvg:hover{fill:#82888a}.CalendarDay{box-sizing:border-box;cursor:pointer;font-size:14px;text-align:center}.CalendarDay:active{outline:0}.CalendarDay__defaultCursor{cursor:default}.CalendarDay__default{border:1px solid #e4e7e7;color:#484848;background:#fff}.CalendarDay__default:hover{background:#e4e7e7;border:1px double #e4e7e7;color:inherit}.CalendarDay__hovered_offset{background:#f4f5f5;border:1px double #e4e7e7;color:inherit}.CalendarDay__outside{border:0;background:#fff;color:#484848}.CalendarDay__outside:hover{border:0}.CalendarDay__blocked_minimum_nights{background:#fff;border:1px solid #eceeee;color:#cacccd}.CalendarDay__blocked_minimum_nights:active,.CalendarDay__blocked_minimum_nights:hover{background:#fff;color:#cacccd}.CalendarDay__highlighted_calendar{background:#ffe8bc;color:#484848}.CalendarDay__highlighted_calendar:active,.CalendarDay__highlighted_calendar:hover{background:#ffce71;color:#484848}.CalendarDay__selected_span{background:#66e2da;border:1px solid #33dacd;color:#fff}.CalendarDay__selected_span:active,.CalendarDay__selected_span:hover{background:#33dacd;border:1px solid #33dacd;color:#fff}.CalendarDay__last_in_range{border-right:#00a699}.CalendarDay__selected,.CalendarDay__selected:active,.CalendarDay__selected:hover{background:#00a699;border:1px solid #00a699;color:#fff}.CalendarDay__hovered_span,.CalendarDay__hovered_span:hover{background:#b2f1ec;border:1px solid #80e8e0;color:#007a87}.CalendarDay__hovered_span:active{background:#80e8e0;border:1px solid #80e8e0;color:#007a87}.CalendarDay__blocked_calendar,.CalendarDay__blocked_calendar:active,.CalendarDay__blocked_calendar:hover{background:#cacccd;border:1px solid #cacccd;color:#82888a}.CalendarDay__blocked_out_of_range,.CalendarDay__blocked_out_of_range:active,.CalendarDay__blocked_out_of_range:hover{background:#fff;border:1px solid #e4e7e7;color:#cacccd}.CalendarMonth{background:#fff;text-align:center;vertical-align:top;-webkit-user-select:none;-ms-user-select:none;user-select:none}.CalendarMonth_table{border-collapse:collapse;border-spacing:0}.CalendarMonth_verticalSpacing{border-collapse:separate}.CalendarMonth_caption{color:#484848;font-size:18px;text-align:center;padding-top:22px;padding-bottom:37px;caption-side:top}.CalendarMonth_caption__verticalScrollable{padding-top:12px;padding-bottom:7px}.CalendarMonthGrid{background:#fff;text-align:left;z-index:0}.CalendarMonthGrid__animating{z-index:1}.CalendarMonthGrid__horizontal{position:absolute;left:9px}.CalendarMonthGrid__vertical{margin:0 auto}.CalendarMonthGrid__vertical_scrollable{margin:0 auto;overflow-y:scroll}.CalendarMonthGrid_month__horizontal{display:inline-block;vertical-align:top;min-height:100%}.CalendarMonthGrid_month__hideForAnimation{position:absolute;z-index:-1;opacity:0;pointer-events:none}.CalendarMonthGrid_month__hidden{visibility:hidden}.DayPickerNavigation{position:relative;z-index:2}.DayPickerNavigation__horizontal{height:0}.DayPickerNavigation__verticalDefault{position:absolute;width:100%;height:52px;bottom:0;left:0}.DayPickerNavigation__verticalScrollableDefault{position:relative}.DayPickerNavigation_button{cursor:pointer;-webkit-user-select:none;-ms-user-select:none;user-select:none;border:0;padding:0;margin:0}.DayPickerNavigation_button__default{border:1px solid #e4e7e7;background-color:#fff;color:#757575}.DayPickerNavigation_button__default:focus,.DayPickerNavigation_button__default:hover{border:1px solid #c4c4c4}.DayPickerNavigation_button__default:active{background:#f2f2f2}.DayPickerNavigation_button__horizontalDefault{position:absolute;top:18px;line-height:.78;border-radius:3px;padding:6px 9px}.DayPickerNavigation_leftButton__horizontalDefault{left:22px}.DayPickerNavigation_rightButton__horizontalDefault{right:22px}.DayPickerNavigation_button__verticalDefault{padding:5px;background:#fff;box-shadow:0 0 5px 2px rgba(0,0,0,.1);position:relative;display:inline-block;height:100%;width:50%}.DayPickerNavigation_nextButton__verticalDefault{border-left:0}.DayPickerNavigation_nextButton__verticalScrollableDefault{width:100%}.DayPickerNavigation_svg__horizontal{height:19px;width:19px;fill:#82888a;display:block}.DayPickerNavigation_svg__vertical{height:42px;width:42px;fill:#484848;display:block}.DayPicker{position:relative;text-align:left}.DayPicker,.DayPicker__horizontal{background:#fff}.DayPicker__verticalScrollable{height:100%}.DayPicker__hidden{visibility:hidden}.DayPicker__withBorder{box-shadow:0 2px 6px rgba(0,0,0,.05),0 0 0 1px rgba(0,0,0,.07);border-radius:3px}.DayPicker_portal__horizontal{box-shadow:none;position:absolute;left:50%;top:50%}.DayPicker_portal__vertical{position:static}.DayPicker_focusRegion{outline:0}.DayPicker_calendarInfo__horizontal,.DayPicker_wrapper__horizontal{display:inline-block;vertical-align:top}.DayPicker_weekHeaders{position:relative}.DayPicker_weekHeaders__horizontal{margin-left:9px}.DayPicker_weekHeader{color:#757575;position:absolute;top:62px;z-index:2;text-align:left}.DayPicker_weekHeader__vertical{left:50%}.DayPicker_weekHeader__verticalScrollable{top:0;display:table-row;border-bottom:1px solid #dbdbdb;background:#fff;margin-left:0;left:0;width:100%;text-align:center}.DayPicker_weekHeader_ul{list-style:none;margin:1px 0;padding-left:0;padding-right:0;font-size:14px}.DayPicker_weekHeader_li{display:inline-block;text-align:center}.DayPicker_transitionContainer{position:relative;overflow:hidden;border-radius:3px}.DayPicker_transitionContainer__horizontal{transition:height .2s ease-in-out}.DayPicker_transitionContainer__vertical{width:100%}.DayPicker_transitionContainer__verticalScrollable{padding-top:20px;height:100%;position:absolute;top:0;bottom:0;right:0;left:0;overflow-y:scroll}.DateInput{margin:0;padding:0;background:#fff;position:relative;display:inline-block;width:130px;vertical-align:middle}.DateInput__small{width:97px}.DateInput__block{width:100%}.DateInput__disabled{background:#f2f2f2;color:#dbdbdb}.DateInput_input{font-weight:200;font-size:19px;line-height:24px;color:#484848;background-color:#fff;width:100%;padding:11px 11px 9px;border:0;border-bottom:2px solid transparent;border-radius:0}.DateInput_input__small{font-size:15px;line-height:18px;letter-spacing:.2px;padding:7px 7px 5px}.DateInput_input__regular{font-weight:auto}.DateInput_input__readOnly{-webkit-user-select:none;-ms-user-select:none;user-select:none}.DateInput_input__focused{outline:0;background:#fff;border:0;border-bottom:2px solid #008489}.DateInput_input__disabled{background:#f2f2f2;font-style:italic}.DateInput_screenReaderMessage{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.DateInput_fang{position:absolute;width:20px;height:10px;left:22px;z-index:2}.DateInput_fangShape{fill:#fff}.DateInput_fangStroke{stroke:#dbdbdb;fill:transparent}.DateRangePickerInput{background-color:#fff;display:inline-block}.DateRangePickerInput__disabled{background:#f2f2f2}.DateRangePickerInput__withBorder{border-radius:2px;border:1px solid #dbdbdb}.DateRangePickerInput__rtl{direction:rtl}.DateRangePickerInput__block{display:block}.DateRangePickerInput__showClearDates{padding-right:30px}.DateRangePickerInput_arrow{display:inline-block;vertical-align:middle;color:#484848}.DateRangePickerInput_arrow_svg{vertical-align:middle;fill:#484848;height:24px;width:24px}.DateRangePickerInput_clearDates{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;padding:10px;margin:0 10px 0 5px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.DateRangePickerInput_clearDates__small{padding:6px}.DateRangePickerInput_clearDates_default:focus,.DateRangePickerInput_clearDates_default:hover{background:#dbdbdb;border-radius:50%}.DateRangePickerInput_clearDates__hide{visibility:hidden}.DateRangePickerInput_clearDates_svg{fill:#82888a;height:12px;width:15px;vertical-align:middle}.DateRangePickerInput_clearDates_svg__small{height:9px}.DateRangePickerInput_calendarIcon{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;display:inline-block;vertical-align:middle;padding:10px;margin:0 5px 0 10px}.DateRangePickerInput_calendarIcon_svg{fill:#82888a;height:15px;width:14px;vertical-align:middle}.DateRangePicker{position:relative;display:inline-block}.DateRangePicker__block{display:block}.DateRangePicker_picker{z-index:1;background-color:#fff;position:absolute}.DateRangePicker_picker__rtl{direction:rtl}.DateRangePicker_picker__directionLeft{left:0}.DateRangePicker_picker__directionRight{right:0}.DateRangePicker_picker__portal{background-color:rgba(0,0,0,.3);position:fixed;top:0;left:0;height:100%;width:100%}.DateRangePicker_picker__fullScreenPortal{background-color:#fff}.DateRangePicker_closeButton{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;position:absolute;top:0;right:0;padding:15px;z-index:2}.DateRangePicker_closeButton:focus,.DateRangePicker_closeButton:hover{color:#b0b3b4;text-decoration:none}.DateRangePicker_closeButton_svg{height:15px;width:15px;fill:#cacccd}.components-datetime,.components-datetime .components-datetime__calendar-help{padding:16px}.components-datetime .components-datetime__calendar-help h4{margin:0}.components-datetime .components-datetime__date-help-button{display:block;margin-left:auto}.components-datetime fieldset{border:0;padding:0;margin:0}.components-datetime input,.components-datetime select{box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:4px;border:1px solid #7e8993}@media (prefers-reduced-motion:reduce){.components-datetime input,.components-datetime select{transition-duration:0s}}.components-datetime .components-button,.components-datetime input[type=number],.components-datetime select{height:30px;margin-top:0;margin-bottom:0}.components-datetime__date{min-height:236px;border-top:1px solid #e2e4e7}.components-datetime__date .DayPickerNavigation_leftButton__horizontalDefault{left:0}.components-datetime__date .CalendarMonth_caption{font-size:13px}.components-datetime__date .CalendarDay{font-size:13px;border:1px solid transparent;border-radius:50%;text-align:center}.components-datetime__date .CalendarDay__selected{background:#0085ba}body.admin-color-sunrise .components-datetime__date .CalendarDay__selected{background:#d1864a}body.admin-color-ocean .components-datetime__date .CalendarDay__selected{background:#a3b9a2}body.admin-color-midnight .components-datetime__date .CalendarDay__selected{background:#e14d43}body.admin-color-ectoplasm .components-datetime__date .CalendarDay__selected{background:#a7b656}body.admin-color-coffee .components-datetime__date .CalendarDay__selected{background:#c2a68c}body.admin-color-blue .components-datetime__date .CalendarDay__selected{background:#82b4cb}body.admin-color-light .components-datetime__date .CalendarDay__selected{background:#0085ba}.components-datetime__date .CalendarDay__selected:hover{background:#00719e}body.admin-color-sunrise .components-datetime__date .CalendarDay__selected:hover{background:#b2723f}body.admin-color-ocean .components-datetime__date .CalendarDay__selected:hover{background:#8b9d8a}body.admin-color-midnight .components-datetime__date .CalendarDay__selected:hover{background:#bf4139}body.admin-color-ectoplasm .components-datetime__date .CalendarDay__selected:hover{background:#8e9b49}body.admin-color-coffee .components-datetime__date .CalendarDay__selected:hover{background:#a58d77}body.admin-color-blue .components-datetime__date .CalendarDay__selected:hover{background:#6f99ad}body.admin-color-light .components-datetime__date .CalendarDay__selected:hover{background:#00719e}.components-datetime__date .DayPickerNavigation_button__horizontalDefault{padding:2px 8px;top:20px}.components-datetime__date .DayPickerNavigation_button__horizontalDefault:focus{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.components-datetime__date .DayPicker_weekHeader{top:50px}.components-datetime__date .DayPicker_weekHeader .DayPicker_weekHeader_ul{margin:1px 0;padding-left:0;padding-right:0}.components-datetime__date.is-description-visible .components-datetime__date-help-button,.components-datetime__date.is-description-visible .DayPicker{visibility:hidden}.components-datetime__time{padding-bottom:16px}.components-datetime__time fieldset{position:relative;margin-bottom:.5em}.components-datetime__time fieldset+fieldset{margin-bottom:0}.components-datetime__time .components-datetime__time-field-am-pm fieldset{margin-top:0}.components-datetime__time .components-datetime__time-wrapper{display:flex}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-separator{display:inline-block;padding:0 3px 0 0;color:#555d66}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button{margin-left:8px;margin-right:-1px;border-radius:3px 0 0 3px}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button{margin-left:-1px;border-radius:0 3px 3px 0}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button:focus,.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button.is-pressed,.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button.is-pressed{background:#edeff0;border-color:#8f98a1;box-shadow:inset 0 2px 5px -3px #555d66}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-am-button.is-pressed:focus,.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-pm-button.is-pressed:focus{box-shadow:inset 0 2px 5px -3px #555d66,0 0 0 1px #fff,0 0 0 3px #007cba}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field-time{direction:ltr}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field.am-pm button{font-size:11px;font-weight:600}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select{margin-right:4px}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]{padding:2px;margin-right:4px;text-align:center;-moz-appearance:textfield}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.components-datetime__time.is-12-hour .components-datetime__time-field-day input{margin:0 -4px 0 0!important;border-radius:4px 0 0 4px!important}.components-datetime__time.is-12-hour .components-datetime__time-field-year input{border-radius:0 4px 4px 0!important}.components-datetime__time-legend{font-weight:600;margin-top:.5em}.components-datetime__time-legend.invisible{position:absolute;top:-999em;left:-999em}.components-datetime__time-field-day-input,.components-datetime__time-field-hours-input,.components-datetime__time-field-minutes-input{width:35px}.components-datetime__time-field-year-input{width:55px}.components-datetime__time-field-month-select{max-width:145px}.components-popover .components-datetime__date{padding-left:4px}.block-editor-dimension-control .components-base-control__field{display:flex;align-items:center}.block-editor-dimension-control .components-base-control__label{display:flex;align-items:center;margin-right:1em;margin-bottom:0}.block-editor-dimension-control .components-base-control__label .dashicon{margin-right:.5em}.block-editor-dimension-control.is-manual .components-base-control__label{width:10em}.components-disabled{position:relative;pointer-events:none}.components-disabled:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.components-disabled *{pointer-events:none}body.is-dragging-components-draggable{cursor:move;cursor:grabbing!important}.components-draggable__invisible-drag-image{position:fixed;left:-1000px;height:50px;width:50px}.components-draggable__clone{position:fixed;padding:20px;background:transparent;pointer-events:none;z-index:1000000000;opacity:.8}.components-drop-zone{position:absolute;top:0;right:0;bottom:0;left:0;z-index:40;visibility:hidden;opacity:0;transition:opacity .3s,background-color .3s,visibility 0s .3s;border:2px solid #0071a1;border-radius:2px}@media (prefers-reduced-motion:reduce){.components-drop-zone{transition-duration:0s}}.components-drop-zone.is-active{opacity:1;visibility:visible;transition:opacity .3s,background-color .3s}@media (prefers-reduced-motion:reduce){.components-drop-zone.is-active{transition-duration:0s}}.components-drop-zone.is-dragging-over-element{background-color:rgba(0,113,161,.8)}.components-drop-zone__content{position:absolute;top:50%;left:0;right:0;z-index:50;transform:translateY(-50%);width:100%;text-align:center;color:#fff;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.components-drop-zone__content{transition-duration:0s}}.components-drop-zone.is-dragging-over-element .components-drop-zone__content{transform:translateY(-50%) scale(1.05)}.components-drop-zone__content-icon,.components-drop-zone__content-text{display:block}.components-drop-zone__content-icon{margin:0 auto;line-height:0;fill:currentColor}.components-drop-zone__content-text{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.components-drop-zone__provider{height:100%}.components-dropdown{display:inline-block}.components-dropdown-menu__indicator:after{content:"";pointer-events:none;display:block;width:0;height:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:5px solid;margin-left:4px;margin-right:2px}.components-dropdown-menu__popover .components-popover__content{width:200px}.components-dropdown-menu__menu{width:100%;padding:7px 0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.4}.components-dropdown-menu__menu .components-dropdown-menu__menu-item,.components-dropdown-menu__menu .components-menu-item{width:100%;padding:6px;outline:none;cursor:pointer;margin-bottom:4px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator,.components-dropdown-menu__menu .components-menu-item.has-separator{margin-top:6px;position:relative;overflow:visible}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator:before,.components-dropdown-menu__menu .components-menu-item.has-separator:before{display:block;content:"";box-sizing:content-box;background-color:#e2e4e7;position:absolute;top:-3px;left:0;right:0;height:1px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item:focus:not(:disabled):not([aria-disabled=true]):not(.is-secondary),.components-dropdown-menu__menu .components-menu-item:focus:not(:disabled):not([aria-disabled=true]):not(.is-secondary){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.components-dropdown-menu__menu .components-dropdown-menu__menu-item:hover,.components-dropdown-menu__menu .components-dropdown-menu__menu-item:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover,.components-dropdown-menu__menu .components-menu-item:hover,.components-dropdown-menu__menu .components-menu-item:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover{color:#191e23;border:none;background:#f3f4f5;box-shadow:none}.components-dropdown-menu__menu .components-dropdown-menu__menu-item>svg,.components-dropdown-menu__menu .components-menu-item>svg{border-radius:4px;padding:2px;width:24px;height:24px;margin:-1px 8px -1px 0}.components-dropdown-menu__menu .components-dropdown-menu__menu-item:not(:disabled):not([aria-disabled=true]):not(.is-secondary).is-active>svg,.components-dropdown-menu__menu .components-menu-item:not(:disabled):not([aria-disabled=true]):not(.is-secondary).is-active>svg{outline:none;color:#fff;box-shadow:none;background:#555d66}.components-dropdown-menu__menu .components-menu-group:not(:last-child){border-bottom:1px solid #e2e4e7}.components-dropdown-menu__menu .components-menu-item__button,.components-dropdown-menu__menu .components-menu-item__button.components-button{height:auto;padding-left:2rem}.components-dropdown-menu__menu .components-menu-item__button.components-button.has-icon,.components-dropdown-menu__menu .components-menu-item__button.has-icon{padding-left:.5rem}.components-dropdown-menu__menu .components-menu-item__button.components-button .dashicon,.components-dropdown-menu__menu .components-menu-item__button .dashicon{margin-right:4px}.components-external-link__icon{width:1.4em;height:1.4em;margin:-.2em .1em 0;vertical-align:middle}.components-focal-point-picker-wrapper{background-color:transparent;border:1px solid #e2e4e7;height:200px;width:100%;padding:14px}.components-focal-point-picker{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;position:relative;width:100%}.components-focal-point-picker img{height:auto;max-height:100%;max-width:100%;width:auto;-webkit-user-select:none;-ms-user-select:none;user-select:none}.components-focal-point-picker__icon_container{background-color:transparent;cursor:grab;height:30px;opacity:.8;position:absolute;will-change:transform;width:30px;z-index:10000}.components-focal-point-picker__icon_container.is-dragging{cursor:grabbing}.components-focal-point-picker__icon{display:block;height:100%;left:-15px;position:absolute;top:-15px;width:100%}.components-focal-point-picker__icon .components-focal-point-picker__icon-outline{fill:#fff}.components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#0085ba}body.admin-color-sunrise .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#d1864a}body.admin-color-ocean .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#a3b9a2}body.admin-color-midnight .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#e14d43}body.admin-color-ectoplasm .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#a7b656}body.admin-color-coffee .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#c2a68c}body.admin-color-blue .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#82b4cb}body.admin-color-light .components-focal-point-picker__icon .components-focal-point-picker__icon-fill{fill:#0085ba}.components-focal-point-picker_position-display-container{margin:1em 0;display:flex}.components-focal-point-picker_position-display-container .components-base-control__field{margin:0 1em 0 0}.components-focal-point-picker_position-display-container input[type=number].components-text-control__input{max-width:4em;padding:6px 4px}.components-focal-point-picker_position-display-container span{margin:0 0 0 .2em}.components-font-size-picker__controls{max-width:248px;display:flex;align-items:center;margin-bottom:24px}.components-font-size-picker__controls .components-range-control__number{height:30px;margin:5px 8px 0 0}.components-font-size-picker__controls .components-range-control__number[value=""]+.components-button{cursor:default;opacity:.3;pointer-events:none}.components-font-size-picker__controls .components-range-control__number-container{display:flex;flex-direction:column}.components-font-size-picker__controls .components-font-size-picker__select{margin-right:8px;flex-grow:1}.components-font-size-picker__controls .components-color-palette__clear{height:30px;margin-top:23px}.components-font-size-picker__custom-input .components-range-control__slider+.dashicon{width:30px;height:30px}.components-font-size-picker{border:0;padding:0;margin:0}.components-form-toggle{position:relative;display:inline-block}.components-form-toggle .components-form-toggle__off,.components-form-toggle .components-form-toggle__on{position:absolute;top:6px;box-sizing:border-box}.components-form-toggle .components-form-toggle__off{color:#6c7781;fill:currentColor;right:6px}.components-form-toggle .components-form-toggle__on{left:8px}.components-form-toggle .components-form-toggle__track{content:"";display:inline-block;box-sizing:border-box;vertical-align:top;background-color:#fff;border:2px solid #6c7781;width:36px;height:18px;border-radius:9px;transition:background .2s ease}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__track{transition-duration:0s}}.components-form-toggle .components-form-toggle__thumb{display:block;position:absolute;box-sizing:border-box;top:4px;left:4px;width:10px;height:10px;border-radius:50%;transition:transform .1s ease;background-color:#6c7781;border:5px solid #6c7781}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__thumb{transition-duration:0s}}.components-form-toggle:hover .components-form-toggle__track{border:2px solid #555d66}.components-form-toggle:hover .components-form-toggle__thumb{background-color:#555d66;border:5px solid #6c7781}.components-form-toggle:hover .components-form-toggle__off{color:#555d66}.components-form-toggle.is-checked .components-form-toggle__track{background-color:#11a0d2;border:9px solid transparent}body.admin-color-sunrise .components-form-toggle.is-checked .components-form-toggle__track{background-color:#c8b03c;border:2px solid #c8b03c}body.admin-color-ocean .components-form-toggle.is-checked .components-form-toggle__track{background-color:#a3b9a2;border:2px solid #a3b9a2}body.admin-color-midnight .components-form-toggle.is-checked .components-form-toggle__track{background-color:#77a6b9;border:2px solid #77a6b9}body.admin-color-ectoplasm .components-form-toggle.is-checked .components-form-toggle__track{background-color:#a7b656;border:2px solid #a7b656}body.admin-color-coffee .components-form-toggle.is-checked .components-form-toggle__track{background-color:#c2a68c;border:2px solid #c2a68c}body.admin-color-blue .components-form-toggle.is-checked .components-form-toggle__track{background-color:#82b4cb;border:2px solid #82b4cb}body.admin-color-light .components-form-toggle.is-checked .components-form-toggle__track{background-color:#11a0d2;border:2px solid #11a0d2}.components-form-toggle__input:focus+.components-form-toggle__track{box-shadow:0 0 0 2px #fff,0 0 0 3px #6c7781;outline:2px solid transparent;outline-offset:2px}.components-form-toggle.is-checked .components-form-toggle__thumb{background-color:#fff;border-width:0;transform:translateX(18px)}.components-form-toggle.is-checked:before{background-color:#11a0d2;border:2px solid #11a0d2}body.admin-color-sunrise .components-form-toggle.is-checked:before{background-color:#c8b03c;border:2px solid #c8b03c}body.admin-color-ocean .components-form-toggle.is-checked:before{background-color:#a3b9a2;border:2px solid #a3b9a2}body.admin-color-midnight .components-form-toggle.is-checked:before{background-color:#77a6b9;border:2px solid #77a6b9}body.admin-color-ectoplasm .components-form-toggle.is-checked:before{background-color:#a7b656;border:2px solid #a7b656}body.admin-color-coffee .components-form-toggle.is-checked:before{background-color:#c2a68c;border:2px solid #c2a68c}body.admin-color-blue .components-form-toggle.is-checked:before{background-color:#82b4cb;border:2px solid #82b4cb}body.admin-color-light .components-form-toggle.is-checked:before{background-color:#11a0d2;border:2px solid #11a0d2}.components-disabled .components-form-toggle{opacity:.3}.components-form-toggle input.components-form-toggle__input[type=checkbox]{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;margin:0;padding:0;z-index:1;border:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:checked{background:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:before{content:""}.components-form-toggle .components-form-toggle__on{outline:1px solid transparent;outline-offset:-1px;border:1px solid #000;filter:invert(100%) contrast(500%)}@supports (-ms-high-contrast-adjust:auto){.components-form-toggle .components-form-toggle__on{filter:none;border:1px solid #fff}}.components-form-token-field__input-container{display:flex;flex-wrap:wrap;align-items:flex-start;width:100%;margin:0 0 8px;padding:4px;background-color:#fff;color:#32373c;cursor:text;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:4px;border:1px solid #7e8993}@media (prefers-reduced-motion:reduce){.components-form-token-field__input-container{transition-duration:0s}}.components-form-token-field__input-container.is-disabled{background:#e2e4e7;border-color:#ccd0d4}.components-form-token-field__input-container.is-active{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.components-form-token-field__input-container input[type=text].components-form-token-field__input{display:inline-block;width:100%;max-width:100%;margin:2px 0 2px 8px;padding:0;min-height:24px;background:inherit;border:0;color:#23282d;box-shadow:none}.components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input,.components-form-token-field__input-container input[type=text].components-form-token-field__input:focus{outline:none;box-shadow:none}.components-form-token-field__input-container .components-form-token-field__token+input[type=text].components-form-token-field__input{width:auto}.components-form-token-field__label{display:inline-block;margin-bottom:4px}.components-form-token-field__help{font-style:italic}.components-form-token-field__token{font-size:13px;display:flex;margin:2px 4px 2px 0;color:#32373c;overflow:hidden}.components-form-token-field__token.is-success .components-form-token-field__remove-token,.components-form-token-field__token.is-success .components-form-token-field__token-text{background:#4ab866}.components-form-token-field__token.is-error .components-form-token-field__remove-token,.components-form-token-field__token.is-error .components-form-token-field__token-text{background:#d94f4f}.components-form-token-field__token.is-validating .components-form-token-field__remove-token,.components-form-token-field__token.is-validating .components-form-token-field__token-text{color:#555d66}.components-form-token-field__token.is-borderless{position:relative;padding:0 16px 0 0}.components-form-token-field__token.is-borderless .components-form-token-field__token-text{background:transparent;color:#11a0d2}body.admin-color-sunrise .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#c8b03c}body.admin-color-ocean .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#a89d8a}body.admin-color-midnight .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#77a6b9}body.admin-color-ectoplasm .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#c77430}body.admin-color-coffee .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#9fa47b}body.admin-color-blue .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#d9ab59}body.admin-color-light .components-form-token-field__token.is-borderless .components-form-token-field__token-text{color:#c75726}.components-form-token-field__token.is-borderless .components-form-token-field__remove-token{background:transparent;color:#555d66;position:absolute;top:1px;right:0}.components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text{color:#4ab866}.components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text{color:#d94f4f;border-radius:4px 0 0 4px;padding:0 4px 0 6px}.components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text{color:#23282d}.components-form-token-field__token.is-disabled .components-form-token-field__remove-token{cursor:default}.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{display:inline-block;line-height:24px;height:auto;background:#e2e4e7;transition:all .2s cubic-bezier(.4,1,.4,1)}@media (prefers-reduced-motion:reduce){.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{transition-duration:0s;animation-duration:1ms}}.components-form-token-field__token-text{border-radius:12px 0 0 12px;padding:0 4px 0 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.components-form-token-field__remove-token.components-button{cursor:pointer;border-radius:0 12px 12px 0;padding:0 2px;color:#555d66;line-height:10px;overflow:initial}.components-form-token-field__remove-token.components-button:hover{color:#32373c}.components-form-token-field__suggestions-list{flex:1 0 100%;min-width:100%;max-height:9em;overflow-y:scroll;transition:all .15s ease-in-out;list-style:none;border-top:1px solid #6c7781;margin:4px -4px -4px;padding-top:3px}@media (prefers-reduced-motion:reduce){.components-form-token-field__suggestions-list{transition-duration:0s}}.components-form-token-field__suggestion{color:#555d66;display:block;font-size:13px;padding:4px 8px;cursor:pointer}.components-form-token-field__suggestion.is-selected{background:#0071a1;color:#fff}.components-form-token-field__suggestion-match{text-decoration:underline}.components-guide .components-modal__header{background:none;border-bottom:none}.components-guide .components-modal__header .components-button{align-self:flex-start;margin-top:24px;position:static}.components-guide__container{display:flex;flex-direction:column;margin-top:-56px;min-height:100%}.components-guide__footer{align-content:center;display:flex;height:30px;justify-content:center;margin:auto 0 24px;position:relative;width:100%}@media (min-width:600px){.components-guide__footer{margin:24px 0 0}}.components-guide__page-control{margin:0}.components-guide__page-control li{display:inline-block;margin:0 2px}.components-guide__page-control .components-button{height:30px}@media (max-width:600px){.components-modal__frame.components-guide{bottom:15%;left:24px;right:24px;top:15%}}.components-button.components-guide__back-button,.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{height:30px;position:absolute}.components-button.components-guide__back-button,.components-button.components-guide__forward-button{font-size:0;padding:4px 2px}.components-button.components-guide__back-button.has-text svg,.components-button.components-guide__forward-button.has-text svg{margin:0}@media (min-width:600px){.components-button.components-guide__back-button,.components-button.components-guide__forward-button{font-size:13px}}.components-button.components-guide__back-button{left:0}@media (min-width:600px){.components-button.components-guide__back-button{padding:4px 8px 4px 2px}.components-button.components-guide__back-button.has-text svg{margin-right:4px}}.components-button.components-guide__forward-button{right:0}@media (min-width:600px){.components-button.components-guide__forward-button{padding:4px 2px 4px 8px}.components-button.components-guide__forward-button.has-text svg{margin-left:4px;order:1}}.components-button.components-guide__finish-button{display:none;right:0}@media (min-width:600px){.components-button.components-guide__finish-button{display:block}}@media (min-width:600px){.components-button.components-guide__inline-finish-button{display:none}}.components-navigate-regions.is-focusing-regions [role=region]{position:relative}.components-navigate-regions.is-focusing-regions [role=region]:focus:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none;outline:4px solid transparent;box-shadow:inset 0 0 0 4px #33b3db}@supports (outline-offset:1px){.components-navigate-regions.is-focusing-regions [role=region]:focus:after{content:none}.components-navigate-regions.is-focusing-regions [role=region]:focus{outline-style:solid;outline-color:#33b3db;outline-width:4px;outline-offset:-4px}}.components-menu-group{width:100%;padding:7px 0}.components-menu-group__label{margin-bottom:8px;color:#6c7781;padding:0 7px}.components-menu-item__button,.components-menu-item__button.components-button{width:100%;padding:8px 15px;text-align:left;color:#40464d;border:none;box-shadow:none}.components-menu-item__button.components-button .components-menu-items__item-icon,.components-menu-item__button.components-button .dashicon,.components-menu-item__button.components-button>span>svg,.components-menu-item__button.components-button svg.components-menu-items__item-icon,.components-menu-item__button .components-menu-items__item-icon,.components-menu-item__button .dashicon,.components-menu-item__button>span>svg,.components-menu-item__button svg.components-menu-items__item-icon{margin-right:4px}.components-menu-item__button.components-button .components-menu-items__item-icon,.components-menu-item__button .components-menu-items__item-icon{display:inline-block;flex:0 0 auto}.components-menu-item__button.components-button.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover,.components-menu-item__button.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover{color:#191e23;border:none;box-shadow:none;background:#f3f4f5}.components-menu-item__button.components-button.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover .components-menu-item__shortcut,.components-menu-item__button.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):not(.is-tertiary):not(.is-primary):hover .components-menu-item__shortcut{color:#40464d}.components-menu-item__button.components-button:focus:not(:disabled):not([aria-disabled=true]),.components-menu-item__button:focus:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.components-menu-item__info-wrapper{display:flex;flex-direction:column}.components-menu-item__info{margin-top:4px;font-size:12px;color:#6c7781}.components-menu-item__shortcut{-ms-grid-row-align:center;align-self:center;color:#6c7781;margin-right:0;margin-left:auto;padding-left:8px;display:none}@media (min-width:480px){.components-menu-item__shortcut{display:inline}}.components-menu-items-choice,.components-menu-items-choice.components-button{padding-left:2rem}.components-menu-items-choice.components-button.has-icon,.components-menu-items-choice.has-icon{padding-left:.5rem}.components-modal__screen-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.7);z-index:100000;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-duration:1ms}}.components-modal__frame{position:absolute;top:0;right:0;bottom:0;left:0;box-sizing:border-box;margin:0;border:1px solid #e2e4e7;background:#fff;box-shadow:0 3px 30px rgba(25,30,35,.2);overflow:auto}@media (min-width:600px){.components-modal__frame{top:50%;right:auto;bottom:auto;left:50%;min-width:360px;max-width:calc(100% - 32px);max-height:calc(100% - 112px);transform:translate(-50%,-50%);animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{box-sizing:border-box;border-bottom:1px solid #e2e4e7;padding:0 24px;display:flex;flex-direction:row;justify-content:space-between;background:#fff;align-items:center;height:56px;z-index:10;position:relative;position:-webkit-sticky;position:sticky;top:0;margin:0 -24px 24px}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{position:relative;left:8px}.components-modal__header-heading-container{align-items:center;flex-grow:1;display:flex;flex-direction:row;justify-content:left}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-width:36px;max-height:36px;padding:8px}.components-modal__content{box-sizing:border-box;height:100%;padding:0 24px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:56px}}.components-notice{display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;background-color:#e5f5fa;border-left:4px solid #00a0d2;margin:5px 15px 2px;padding:8px 12px;align-items:center}.components-notice.is-dismissible{padding-right:36px;position:relative}.components-notice.is-success{border-left-color:#4ab866;background-color:#eff9f1}.components-notice.is-warning{border-left-color:#f0b849;background-color:#fef8ee}.components-notice.is-error{border-left-color:#d94f4f;background-color:#f9e2e2}.components-notice__content{flex-grow:1;margin:4px 25px 4px 0}.components-notice__action.components-button,.components-notice__action.components-button.is-link{margin-left:4px}.components-notice__action.components-button.is-secondary{vertical-align:initial}.components-notice__dismiss{color:#6c7781;align-self:flex-start;flex-shrink:0}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#191e23;background-color:transparent}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.components-notice-list{max-width:100vw;box-sizing:border-box;z-index:29}.components-notice-list .components-notice__content{margin-top:12px;margin-bottom:12px;line-height:1.6}.components-notice-list .components-notice__action.components-button{margin-top:-2px;margin-bottom:-2px}.components-panel{background:#fff;border:1px solid #e2e4e7}.components-panel>.components-panel__body:first-child,.components-panel>.components-panel__header:first-child{margin-top:-1px}.components-panel>.components-panel__body:last-child,.components-panel>.components-panel__header:last-child{border-bottom-width:0}.components-panel+.components-panel{margin-top:-1px}.components-panel__body{border-top:1px solid #e2e4e7;border-bottom:1px solid #e2e4e7}.components-panel__body h3{margin:0 0 .5em}.components-panel__body.is-opened{padding:16px}.components-panel__header{display:flex;justify-content:space-between;align-items:center;padding:0 16px;height:50px;border-top:1px solid #e2e4e7;border-bottom:1px solid #e2e4e7}.components-panel__header h2{margin:0;font-size:inherit;color:inherit}.components-panel__body+.components-panel__body,.components-panel__body+.components-panel__header,.components-panel__header+.components-panel__body,.components-panel__header+.components-panel__header{margin-top:-1px}.components-panel__body>.components-panel__body-title{display:block;padding:0;font-size:inherit;margin-top:0;margin-bottom:0;transition:background .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body>.components-panel__body-title{transition-duration:0s}}.components-panel__body.is-opened>.components-panel__body-title{margin:-16px -16px 5px}.components-panel__body>.components-panel__body-title:hover{background:#f3f4f5!important;border:none!important}.components-panel__body-toggle.components-button{position:relative;padding:15px;outline:none;width:100%;font-weight:600;text-align:left;color:#191e23;border:none;box-shadow:none;transition:background .1s ease-in-out;height:auto}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button{transition-duration:0s}}.components-panel__body-toggle.components-button:focus:not(:disabled):not([aria-disabled=true]){color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.components-panel__body-toggle.components-button:hover{background:transparent!important;border:none!important;box-shadow:none!important}.components-panel__body-toggle.components-button .components-panel__arrow{position:absolute;right:10px;top:50%;transform:translateY(-50%);color:#191e23;fill:currentColor;transition:color .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button .components-panel__arrow{transition-duration:0s}}body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right{transform:scaleX(-1);-ms-filter:fliph;filter:FlipH;margin-top:-10px}.components-panel__icon{color:#555d66;margin:-2px 0 -2px 6px}.components-panel__body-toggle-icon{margin-right:-5px}.components-panel__color-title{float:left;height:19px}.components-panel__row{display:flex;justify-content:space-between;align-items:center;margin-top:20px}.components-panel__row select{min-width:0}.components-panel__row label{margin-right:10px;flex-shrink:0;max-width:75%}.components-panel__row:empty,.components-panel__row:first-of-type{margin-top:0}.components-panel .circle-picker{padding-bottom:20px}.components-placeholder.components-placeholder{position:relative;margin-bottom:28px;padding:1em;min-height:200px;width:100%;text-align:left;background:rgba(139,139,150,.1)}@supports ((position:-webkit-sticky) or (position:sticky)){.components-placeholder.components-placeholder{display:flex;flex-direction:column;justify-content:center;align-items:flex-start}}.is-dark-theme .components-placeholder.components-placeholder{background:hsla(0,0%,100%,.15)}.components-placeholder.components-placeholder .components-base-control__label{font-size:13px}.components-placeholder__error,.components-placeholder__fieldset,.components-placeholder__instructions,.components-placeholder__label{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__label{display:flex;font-weight:600;margin-bottom:1em}.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{fill:currentColor;margin-right:1ch}.components-placeholder__fieldset,.components-placeholder__fieldset form{display:flex;flex-direction:row;width:100%;flex-wrap:wrap;z-index:1}.components-placeholder__fieldset form p,.components-placeholder__fieldset p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__fieldset.is-column-layout,.components-placeholder__fieldset.is-column-layout form{flex-direction:column}.components-placeholder__input{margin:0 8px 0 0;flex:1 1 auto}.components-placeholder__instructions{margin-bottom:1em}.components-placeholder__error{margin-top:1em;width:100%}.components-placeholder__preview img{margin:3%;width:50%}.components-placeholder__fieldset .components-button{margin-right:8px;margin-bottom:8px}.components-placeholder__fieldset .components-button:last-child{margin-bottom:0;margin-right:0}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link{margin-left:10px;margin-right:10px}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link:last-child{margin-right:0}.components-placeholder.is-medium .components-placeholder__instructions,.components-placeholder.is-small .components-placeholder__instructions{display:none}.components-placeholder.is-medium .components-placeholder__fieldset,.components-placeholder.is-medium .components-placeholder__fieldset form,.components-placeholder.is-small .components-placeholder__fieldset,.components-placeholder.is-small .components-placeholder__fieldset form{flex-direction:column}.components-placeholder.is-medium .components-placeholder__fieldset .components-button,.components-placeholder.is-small .components-placeholder__fieldset .components-button{margin-right:auto}.components-placeholder.is-small .block-editor-block-icon{display:none}.components-placeholder.is-small .components-button{padding:0 8px 2px} + +/*!rtl:begin:ignore*/.components-popover{position:fixed;z-index:1000000;top:0;left:0;opacity:0}.components-popover.is-expanded,.components-popover[data-x-axis][data-y-axis]{opacity:1}.components-popover.is-expanded{top:0;left:0;right:0;bottom:0;z-index:1000000!important}.components-popover:not(.is-without-arrow){margin-left:2px}.components-popover:not(.is-without-arrow):before{border:8px solid #e2e4e7}.components-popover:not(.is-without-arrow):after{border:8px solid #fff}.components-popover:not(.is-without-arrow):after,.components-popover:not(.is-without-arrow):before{content:"";position:absolute;height:0;width:0;line-height:0}.components-popover:not(.is-without-arrow)[data-y-axis=top]{margin-top:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:before{bottom:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:after{bottom:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:after,.components-popover:not(.is-without-arrow)[data-y-axis=top]:before{border-bottom:none;border-left-color:transparent;border-right-color:transparent;border-top-style:solid;margin-left:-10px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]{margin-top:8px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:before{top:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:after{top:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:after,.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:before{border-bottom-style:solid;border-left-color:transparent;border-right-color:transparent;border-top:none;margin-left:-10px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]{margin-left:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:before{right:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:after{right:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:after,.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:before{border-bottom-color:transparent;border-left-style:solid;border-right:none;border-top-color:transparent}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]{margin-left:8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:before{left:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:after{left:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:after,.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:before{border-bottom-color:transparent;border-left:none;border-right-style:solid;border-top-color:transparent}.components-popover[data-y-axis=top]{bottom:100%}.components-popover[data-y-axis=bottom]{top:100%}.components-popover[data-y-axis=middle]{align-items:center;display:flex}.components-popover__content{box-shadow:0 3px 30px rgba(25,30,35,.1);border:1px solid #e2e4e7;background:#fff;height:100%}.components-popover .components-popover__content{position:absolute;height:auto;overflow-y:auto;min-width:260px}.components-popover.is-expanded .components-popover__content{position:static;height:calc(100% - 50px);overflow-y:visible;min-width:auto;border:none;border-top:1px solid #e2e4e7}.components-popover[data-y-axis=top] .components-popover__content{bottom:100%}.components-popover[data-x-axis=center] .components-popover__content{left:50%;transform:translateX(-50%)}.components-popover[data-x-axis=right] .components-popover__content{position:absolute;left:100%}.components-popover:not([data-y-axis=middle])[data-x-axis=right] .components-popover__content{margin-left:-24px}.components-popover[data-x-axis=left] .components-popover__content{position:absolute;right:100%}.components-popover:not([data-y-axis=middle])[data-x-axis=left] .components-popover__content{margin-right:-24px}.components-popover__content>div{height:100%}.components-popover__header{align-items:center;background:#fff;display:flex;height:50px;justify-content:space-between;padding:0 8px 0 16px}.components-popover__header-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.components-popover__close.components-button{z-index:5} + +/*!rtl:end:ignore*/.components-radio-control{display:flex;flex-direction:column}.components-radio-control .components-base-control__help{margin-top:0}.components-radio-control .components-base-control__field{margin-bottom:0}.components-radio-control__option:not(:last-child){margin-bottom:4px}.components-radio-control__input[type=radio]{margin-top:0;margin-right:6px}.components-range-control .components-base-control__field{display:flex;justify-content:center;flex-wrap:wrap;align-items:center}.components-range-control .dashicon{flex-shrink:0;margin-right:10px}.components-range-control .components-base-control__label{width:100%}.components-range-control .components-range-control__slider{margin-left:0;flex:1}.components-range-control__reset{margin-left:8px}.components-range-control__slider{width:100%;margin-left:8px;padding:0;-webkit-appearance:none;background:transparent}.components-range-control__slider::-webkit-slider-thumb{-webkit-appearance:none;height:18px;width:18px;border-radius:50%;cursor:pointer;background:#555d66;border:4px solid transparent;background-clip:padding-box;box-sizing:border-box;margin-top:-7px}.components-range-control__slider::-moz-range-thumb{height:18px;width:18px;border-radius:50%;cursor:pointer;background:#555d66;border:4px solid transparent;background-clip:padding-box;box-sizing:border-box}.components-range-control__slider::-ms-thumb{height:18px;width:18px;border-radius:50%;cursor:pointer;background:#555d66;background-clip:padding-box;box-sizing:border-box;margin-top:0;height:14px;width:14px;border:2px solid transparent}.components-range-control__slider:focus{outline:none}.components-range-control__slider:focus::-webkit-slider-thumb{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-range-control__slider:focus::-moz-range-thumb{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-range-control__slider:focus::-ms-thumb{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.components-range-control__slider::-webkit-slider-runnable-track{height:3px;cursor:pointer;background:#e2e4e7;border-radius:1.5px;margin-top:-4px}.components-range-control__slider::-moz-range-track{height:3px;cursor:pointer;background:#e2e4e7;border-radius:1.5px}.components-range-control__slider::-ms-track{margin-top:-4px;background:transparent;border-color:transparent;color:transparent;height:3px;cursor:pointer;background:#e2e4e7;border-radius:1.5px}.components-range-control__number{display:inline-block;margin-left:8px;font-weight:500;width:54px}.components-resizable-box__handle{display:none;width:23px;height:23px}.components-resizable-box__container.has-show-handle .components-resizable-box__handle,.components-resizable-box__container.is-selected .components-resizable-box__handle{display:block}.components-resizable-box__handle:after{display:block;content:"";width:15px;height:15px;border:2px solid #fff;border-radius:50%;background:#0085ba;cursor:inherit;position:absolute;top:calc(50% - 8px);right:calc(50% - 8px)}body.admin-color-sunrise .components-resizable-box__handle:after{background:#d1864a}body.admin-color-ocean .components-resizable-box__handle:after{background:#a3b9a2}body.admin-color-midnight .components-resizable-box__handle:after{background:#e14d43}body.admin-color-ectoplasm .components-resizable-box__handle:after{background:#a7b656}body.admin-color-coffee .components-resizable-box__handle:after{background:#c2a68c}body.admin-color-blue .components-resizable-box__handle:after{background:#82b4cb}body.admin-color-light .components-resizable-box__handle:after{background:#0085ba}.components-resizable-box__side-handle:before{display:block;content:"";width:7px;height:7px;border:2px solid #fff;background:#0085ba;cursor:inherit;position:absolute;top:calc(50% - 4px);right:calc(50% - 4px);transition:transform .1s ease-in;opacity:0}body.admin-color-sunrise .components-resizable-box__side-handle:before{background:#d1864a}body.admin-color-ocean .components-resizable-box__side-handle:before{background:#a3b9a2}body.admin-color-midnight .components-resizable-box__side-handle:before{background:#e14d43}body.admin-color-ectoplasm .components-resizable-box__side-handle:before{background:#a7b656}body.admin-color-coffee .components-resizable-box__side-handle:before{background:#c2a68c}body.admin-color-blue .components-resizable-box__side-handle:before{background:#82b4cb}body.admin-color-light .components-resizable-box__side-handle:before{background:#0085ba}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle:before{transition-duration:0s}}.is-dark-theme .components-resizable-box__handle:after,.is-dark-theme .components-resizable-box__side-handle:before{border-color:#d7dade}.components-resizable-box__side-handle{z-index:1}.components-resizable-box__corner-handle{z-index:2}.components-resizable-box__side-handle.components-resizable-box__handle-bottom,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:before,.components-resizable-box__side-handle.components-resizable-box__handle-top,.components-resizable-box__side-handle.components-resizable-box__handle-top:before{width:100%;left:0;border-left:0;border-right:0}.components-resizable-box__side-handle.components-resizable-box__handle-left,.components-resizable-box__side-handle.components-resizable-box__handle-left:before,.components-resizable-box__side-handle.components-resizable-box__handle-right,.components-resizable-box__side-handle.components-resizable-box__handle-right:before{height:100%;top:0;border-top:0;border-bottom:0}.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:components-resizable-box__top-bottom-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation-duration:1ms}}.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation:components-resizable-box__left-right-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation-duration:1ms}}@keyframes components-resizable-box__top-bottom-animation{0%{transform:scaleX(0);opacity:0}to{transform:scaleX(1);opacity:1}}@keyframes components-resizable-box__left-right-animation{0%{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}} + +/*!rtl:begin:ignore*/.components-resizable-box__handle-right{right:-11.5px}.components-resizable-box__handle-left{left:-11.5px}.components-resizable-box__handle-top{top:-11.5px}.components-resizable-box__handle-bottom{bottom:-11.5px} + +/*!rtl:end:ignore*/.components-responsive-wrapper{position:relative;max-width:100%}.components-responsive-wrapper,.components-responsive-wrapper>span{display:block}.components-responsive-wrapper__content{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;margin:auto}.components-sandbox{overflow:hidden}iframe.components-sandbox{width:100%}body.lockscroll,html.lockscroll{overflow:hidden}.components-select-control__input{background:#fff;height:36px;line-height:36px;margin:1px;outline:0;width:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)!important}@media (min-width:782px){.components-select-control__input{height:28px;line-height:28px}}@media (max-width:782px){.components-base-control .components-base-control__field .components-select-control__input{font-size:16px}}.components-snackbar{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;background-color:#32373c;border-radius:4px;box-shadow:0 2px 4px rgba(0,0,0,.3);color:#fff;padding:16px 24px;width:100%;max-width:600px;box-sizing:border-box;cursor:pointer}@media (min-width:600px){.components-snackbar{width:fit-content}}.components-snackbar:hover{background-color:#191e23}.components-snackbar:focus{background-color:#191e23;box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba}.components-snackbar__action.components-button{margin-left:32px;color:#fff;height:auto;flex-shrink:0;line-height:1.4;padding:0}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary){text-decoration:underline;background-color:transparent}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus{color:#fff;box-shadow:none;outline:1px dotted #fff}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#33b3db}.components-snackbar__content{display:flex;align-items:baseline;justify-content:space-between;line-height:1.4}.components-snackbar-list{position:absolute;z-index:100000;width:100%;box-sizing:border-box}.components-snackbar-list__notice-container{position:relative;padding-top:8px}.components-spinner{display:inline-block;background-color:#7e8993;width:18px;height:18px;opacity:.7;margin:5px 11px 0;border-radius:100%;position:relative}.components-spinner:before{content:"";position:absolute;background-color:#fff;top:3px;left:3px;width:4px;height:4px;border-radius:100%;transform-origin:6px 6px;animation:components-spinner__animation 1s linear infinite}@keyframes components-spinner__animation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.components-text-control__input,.components-textarea-control__input{width:100%;padding:6px 8px}.components-tip{display:flex;color:#555d66}.components-tip svg{-ms-grid-row-align:center;align-self:center;fill:#f0b849;flex-shrink:0;margin-right:16px}.components-tip p{margin:0}.components-toggle-control .components-base-control__field{display:flex;margin-bottom:12px;line-height:normal;align-items:center}.components-toggle-control .components-base-control__field .components-form-toggle{margin-right:16px}.components-toggle-control .components-base-control__field .components-toggle-control__label{display:block}.components-accessible-toolbar{display:inline-flex;flex-shrink:0}@supports ((position:-webkit-sticky) or (position:sticky)){.components-accessible-toolbar{display:flex}}.components-tab-button{padding:3px;color:#555d66;height:36px;font-weight:500}.components-tab-button.is-pressed,.components-tab-button.is-pressed:hover{color:#fff}.components-tab-button:disabled{cursor:default}.components-tab-button>span{border:1px solid transparent;padding:0 6px;box-sizing:content-box;height:28px;line-height:28px}.components-tab-button:focus>span,.components-tab-button:hover>span{color:#555d66}.components-tab-button:not(:disabled).is-pressed>span,.components-tab-button:not(:disabled):focus>span,.components-tab-button:not(:disabled):hover>span{border:1px solid #555d66}.components-tab-button.is-pressed:hover>span,.components-tab-button.is-pressed>span{background-color:#555d66;color:#fff}.components-toolbar__control.components-button{width:36px;height:36px}.components-toolbar__control.components-button[data-subscript] svg{padding:5px 10px 5px 0}.components-toolbar__control.components-button[data-subscript]:after{content:attr(data-subscript);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;line-height:12px;position:absolute;right:8px;bottom:10px}.components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]:after{color:#fff}.components-toolbar__control.components-button.is-pressed{padding:3px;outline:none}.components-toolbar__control.components-button.is-pressed>svg{padding:5px;border-radius:4px;height:30px;width:30px;box-sizing:border-box;outline:none;color:#fff;box-shadow:none;background:#555d66}.components-toolbar-group{border:1px solid #e2e4e7;background-color:#fff;display:flex;flex-shrink:0;margin-right:-1px;line-height:0}.components-toolbar-group .components-toolbar-group{border-width:0;margin:0}.components-toolbar{margin:0;border:1px solid #e2e4e7;background-color:#fff;display:flex;flex-shrink:0}div.components-toolbar>div{display:block;margin:0}@supports ((position:-webkit-sticky) or (position:sticky)){div.components-toolbar>div{display:flex}}div.components-toolbar>div+div{margin-left:-3px}div.components-toolbar>div+div.has-left-divider{margin-left:6px;position:relative;overflow:visible}div.components-toolbar>div+div.has-left-divider:before{display:inline-block;content:"";box-sizing:content-box;background-color:#e2e4e7;position:absolute;top:8px;left:-3px;width:1px;height:20px}.components-tooltip.components-popover{z-index:1000002}.components-tooltip.components-popover:before{border-color:transparent}.components-tooltip.components-popover[data-y-axis=top]:after{border-top-color:#191e23}.components-tooltip.components-popover[data-y-axis=bottom]:after{border-bottom-color:#191e23}.components-tooltip.components-popover .components-popover__content{min-width:0}.components-tooltip .components-popover__content{padding:4px 12px;background:#191e23;border-width:0;color:#fff;white-space:nowrap;text-align:center}.components-tooltip__shortcut{display:block;color:#7e8993}.components-visually-hidden{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;width:1px;word-wrap:normal!important}.components-visually-hidden:focus{background-color:#e2e4e7;clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000} \ No newline at end of file diff --git a/wp-includes/css/dist/edit-post/style-rtl.css b/wp-includes/css/dist/edit-post/style-rtl.css new file mode 100644 index 0000000..db49a8a --- /dev/null +++ b/wp-includes/css/dist/edit-post/style-rtl.css @@ -0,0 +1,2083 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +@media (min-width: 782px) { + body.js.is-fullscreen-mode { + margin-top: -46px; + height: calc(100% + 46px); } } + @media (min-width: 782px) and (min-width: 782px) { + body.js.is-fullscreen-mode { + margin-top: -32px; + height: calc(100% + 32px); } } + +@media (min-width: 782px) { + body.js.is-fullscreen-mode #adminmenumain, + body.js.is-fullscreen-mode #wpadminbar { + display: none; } + body.js.is-fullscreen-mode #wpcontent, + body.js.is-fullscreen-mode #wpfooter { + margin-right: 0; } + body.js.is-fullscreen-mode .edit-post-header { + transform: translateY(-100%); + animation: edit-post-fullscreen-mode__slide-in-animation 0.1s forwards; } } + @media (min-width: 782px) and (prefers-reduced-motion: reduce) { + body.js.is-fullscreen-mode .edit-post-header { + animation-duration: 1ms; } } + +@keyframes edit-post-fullscreen-mode__slide-in-animation { + 100% { + transform: translateY(0%); } } + +.edit-post-header { + height: 56px; + background: #fff; + display: flex; + flex-wrap: wrap; + align-items: center; + max-width: 100vw; } + @media (min-width: 280px) { + .edit-post-header { + flex-wrap: nowrap; } } + .edit-post-header > .edit-post-header__settings { + order: 1; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .edit-post-header > .edit-post-header__settings { + order: initial; } } + +.edit-post-header__toolbar { + display: flex; + flex-grow: 1; + padding-right: 16px; } + +.edit-post-header__settings { + display: inline-flex; + align-items: center; + flex-wrap: wrap; + padding-left: 8px; } + +.edit-post-header .components-button.is-pressed { + color: #fff; + background: #555d66; } + +.edit-post-header .components-button.is-pressed:hover, .edit-post-header .components-button.is-pressed:focus { + box-shadow: 0 0 0 1px #555d66, inset 0 0 0 1px #fff !important; + color: #fff !important; + background: #555d66 !important; } + +.edit-post-header .components-button.editor-post-save-draft, .edit-post-header .components-button.editor-post-switch-to-draft, .edit-post-header .components-button.editor-post-preview, .edit-post-header .components-button.editor-post-publish-button, .edit-post-header .components-button.editor-post-publish-panel__toggle { + margin: 2px; + font-size: 13px; } + +.edit-post-header .components-button.editor-post-save-draft, .edit-post-header .components-button.editor-post-switch-to-draft { + padding: 0 5px; } + @media (min-width: 600px) { + .edit-post-header .components-button.editor-post-save-draft, .edit-post-header .components-button.editor-post-switch-to-draft { + padding: 0 12px; } } + +.edit-post-header .components-button.editor-post-preview, .edit-post-header .components-button.editor-post-publish-button, .edit-post-header .components-button.editor-post-publish-panel__toggle { + padding-right: 5px; + padding-left: 5px; } + @media (min-width: 600px) { + .edit-post-header .components-button.editor-post-preview, .edit-post-header .components-button.editor-post-publish-button, .edit-post-header .components-button.editor-post-publish-panel__toggle { + padding-right: 12px; + padding-left: 12px; } } + +@media (min-width: 782px) { + .edit-post-header .components-button.editor-post-preview { + margin: 0 12px 0 3px; } + .edit-post-header .components-button.editor-post-publish-button, .edit-post-header .components-button.editor-post-publish-panel__toggle { + margin: 0 3px 0 12px; } } + +.edit-post-fullscreen-mode-close.has-icon { + display: none; } + @media (min-width: 782px) { + .edit-post-fullscreen-mode-close.has-icon { + display: flex; + align-items: center; + align-self: stretch; + border: none; + background: #23282e; + color: #fff; + border-radius: 0; + height: auto; + width: 56px; } + .edit-post-fullscreen-mode-close.has-icon:hover { + background: #32373d !important; + color: #fff !important; + box-shadow: none !important; } + .edit-post-fullscreen-mode-close.has-icon:active { + color: #fff; } } + .edit-post-fullscreen-mode-close.has-icon svg { + margin-right: auto; + margin-left: auto; } + +.edit-post-header-toolbar { + display: inline-flex; + align-items: center; } + .edit-post-header-toolbar > .components-button { + display: none; } + @media (min-width: 600px) { + .edit-post-header-toolbar > .components-button { + display: inline-flex; } } + .edit-post-header-toolbar .block-editor-block-navigation, + .edit-post-header-toolbar .table-of-contents { + display: none; } + @media (min-width: 600px) { + .edit-post-header-toolbar .block-editor-block-navigation, + .edit-post-header-toolbar .table-of-contents { + display: flex; } } + +.edit-post-header-toolbar__block-toolbar { + position: absolute; + top: 57px; + right: 0; + left: 0; + background: #fff; + min-height: 37px; + border-bottom: 1px solid #e2e4e7; } + .edit-post-header-toolbar__block-toolbar:empty { + display: none; } + .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar { + border-top: none; + border-bottom: none; } + .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { + display: none; } + @media (min-width: 782px) { + .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { + display: block; + left: 280px; } } + @media (min-width: 1280px) { + .edit-post-header-toolbar__block-toolbar { + padding-right: 8px; + position: static; + right: auto; + left: auto; + background: none; + border-bottom: none; + min-height: auto; } + .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { + left: auto; } + .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar { + margin: -9px 0; } + .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar { + padding: 10px 4px 9px; } } + +.edit-post-more-menu { + margin-right: -4px; } + .edit-post-more-menu .components-button { + width: auto; + padding: 0 2px; } + @media (min-width: 600px) { + .edit-post-more-menu { + margin-right: 4px; } + .edit-post-more-menu .components-button { + padding: 0 4px; } } + .edit-post-more-menu .components-button svg { + transform: rotate(-90deg); } + +.edit-post-more-menu__content .components-popover__content { + min-width: 260px; } + @media (min-width: 480px) { + .edit-post-more-menu__content .components-popover__content { + width: auto; + max-width: 480px; } } + .edit-post-more-menu__content .components-popover__content .components-dropdown-menu__menu { + padding: 0; } + +.components-popover.edit-post-more-menu__content { + z-index: 99998; } + +.edit-post-pinned-plugins { + display: none; } + @media (min-width: 600px) { + .edit-post-pinned-plugins { + display: flex; } } + .edit-post-pinned-plugins .components-button { + margin-right: 4px; } + .edit-post-pinned-plugins .components-button.is-pressed { + margin-right: 5px; } + .edit-post-pinned-plugins .components-button svg { + max-width: 24px; + max-height: 24px; } + .edit-post-pinned-plugins .components-button:not(.is-pressed) svg, + .edit-post-pinned-plugins .components-button:not(.is-pressed) svg * { + stroke: #555d66; + fill: #555d66; + stroke-width: 0; } + .edit-post-pinned-plugins .components-button.is-pressed svg, + .edit-post-pinned-plugins .components-button.is-pressed svg *, + .edit-post-pinned-plugins .components-button.is-pressed:hover svg, + .edit-post-pinned-plugins .components-button.is-pressed:hover svg * { + stroke: #fff !important; + fill: #fff !important; + stroke-width: 0; } + .edit-post-pinned-plugins .components-button:hover svg, + .edit-post-pinned-plugins .components-button:hover svg * { + stroke: #191e23 !important; + fill: #191e23 !important; + stroke-width: 0; } + +.edit-post-keyboard-shortcut-help-modal__section { + margin: 0 0 2rem 0; } + +.edit-post-keyboard-shortcut-help-modal__main-shortcuts .edit-post-keyboard-shortcut-help-modal__shortcut-list { + margin-top: -25px; } + +.edit-post-keyboard-shortcut-help-modal__section-title { + font-size: 0.9rem; + font-weight: 600; } + +.edit-post-keyboard-shortcut-help-modal__shortcut { + display: flex; + align-items: baseline; + padding: 0.6rem 0; + border-top: 1px solid #e2e4e7; + margin-bottom: 0; } + .edit-post-keyboard-shortcut-help-modal__shortcut:last-child { + border-bottom: 1px solid #e2e4e7; } + .edit-post-keyboard-shortcut-help-modal__shortcut:empty { + display: none; } + +.edit-post-keyboard-shortcut-help-modal__shortcut-term { + font-weight: 600; + margin: 0 1rem 0 0; + text-align: left; } + +.edit-post-keyboard-shortcut-help-modal__shortcut-description { + flex: 1; + margin: 0; + flex-basis: auto; } + +.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination { + display: block; + background: none; + margin: 0; + padding: 0; } + .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination + .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination { + margin-top: 10px; } + +.edit-post-keyboard-shortcut-help-modal__shortcut-key { + padding: 0.25rem 0.5rem; + border-radius: 8%; + margin: 0 0.2rem 0 0.2rem; } + .edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child { + margin: 0 0.2rem 0 0; } + +.edit-post-layout__metaboxes { + flex-shrink: 0; } + +.edit-post-layout__metaboxes:not(:empty) { + border-top: 1px solid #e2e4e7; + padding: 10px 0 10px; + clear: both; } + .edit-post-layout__metaboxes:not(:empty) .edit-post-meta-boxes-area { + margin: auto 20px; } + +.edit-post-layout .components-editor-notices__snackbar { + position: fixed; + left: 0; + bottom: 20px; + padding-right: 16px; + padding-left: 16px; } + +.edit-post-layout .components-editor-notices__snackbar { + /* Set left position when auto-fold is not on the body element. */ + right: 0; } + @media (min-width: 782px) { + .edit-post-layout .components-editor-notices__snackbar { + right: 160px; } } + +.auto-fold .edit-post-layout .components-editor-notices__snackbar { + /* Auto fold is when on smaller breakpoints, nav menu auto collapses. */ } + @media (min-width: 782px) { + .auto-fold .edit-post-layout .components-editor-notices__snackbar { + right: 36px; } } + @media (min-width: 961px) { + .auto-fold .edit-post-layout .components-editor-notices__snackbar { + right: 160px; } } + +/* Sidebar manually collapsed. */ +.folded .edit-post-layout .components-editor-notices__snackbar { + right: 0; } + @media (min-width: 782px) { + .folded .edit-post-layout .components-editor-notices__snackbar { + right: 36px; } } + +/* Mobile menu opened. */ +@media (max-width: 782px) { + .auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar { + right: 190px; } } + +/* In small screens with responsive menu expanded there is small white space. */ +@media (max-width: 600px) { + .auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar { + margin-right: -18px; } } + +body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar { + right: 0 !important; } + +.edit-post-layout .editor-post-publish-panel { + position: fixed; + z-index: 100001; + top: 46px; + bottom: 0; + left: 0; + right: 0; + overflow: auto; } + @media (min-width: 782px) { + .edit-post-layout .editor-post-publish-panel { + z-index: 99998; + top: 32px; + right: auto; + width: 280px; + border-right: 1px solid #e2e4e7; + transform: translateX(-100%); + animation: edit-post-post-publish-panel__slide-in-animation 0.1s forwards; } } + @media (min-width: 782px) and (prefers-reduced-motion: reduce) { + .edit-post-layout .editor-post-publish-panel { + animation-duration: 1ms; } } + @media (min-width: 782px) { + body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel { + top: 0; } + .is-focusing-regions .edit-post-layout .editor-post-publish-panel { + transform: translateX(0%); } } + +@keyframes edit-post-post-publish-panel__slide-in-animation { + 100% { + transform: translateX(0%); } } + +.block-editor-editor-skeleton__sidebar > div { + height: 100%; } + +.edit-post-layout .editor-post-publish-panel__header-publish-button { + justify-content: center; } + +.edit-post-layout__toogle-publish-panel, +.edit-post-layout__toogle-sidebar-panel { + background-color: #fff; + padding: 10px 0 10px 10px; } + +.edit-post-layout__toogle-publish-panel-button, +.edit-post-layout__toogle-sidebar-panel-button { + width: auto; + height: auto; + display: block; + font-size: 14px; + font-weight: 600; + margin: 0 auto 0 0; + padding: 15px 23px 14px; + line-height: normal; + text-decoration: none; + outline: none; + background: #f1f1f1; + color: #11a0d2; } + +body.admin-color-sunrise .edit-post-layout__toogle-publish-panel-button, body.admin-color-sunrise .edit-post-layout__toogle-sidebar-panel-button { + color: #c8b03c; } + +body.admin-color-ocean .edit-post-layout__toogle-publish-panel-button, body.admin-color-ocean .edit-post-layout__toogle-sidebar-panel-button { + color: #a89d8a; } + +body.admin-color-midnight .edit-post-layout__toogle-publish-panel-button, body.admin-color-midnight .edit-post-layout__toogle-sidebar-panel-button { + color: #77a6b9; } + +body.admin-color-ectoplasm .edit-post-layout__toogle-publish-panel-button, body.admin-color-ectoplasm .edit-post-layout__toogle-sidebar-panel-button { + color: #c77430; } + +body.admin-color-coffee .edit-post-layout__toogle-publish-panel-button, body.admin-color-coffee .edit-post-layout__toogle-sidebar-panel-button { + color: #9fa47b; } + +body.admin-color-blue .edit-post-layout__toogle-publish-panel-button, body.admin-color-blue .edit-post-layout__toogle-sidebar-panel-button { + color: #d9ab59; } + +body.admin-color-light .edit-post-layout__toogle-publish-panel-button, body.admin-color-light .edit-post-layout__toogle-sidebar-panel-button { + color: #c75726; } + .edit-post-layout__toogle-publish-panel-button:focus, + .edit-post-layout__toogle-sidebar-panel-button:focus { + position: fixed; + top: auto; + left: 10px; + bottom: 10px; + right: auto; } + +.edit-post-layout__footer { + display: none; + z-index: 30; } + @media (min-width: 782px) { + .edit-post-layout__footer { + display: flex; + background: #fff; + height: 24px; + padding: 0 8px; + align-items: center; + font-size: 13px; } } + +@media (min-width: 600px) { + .edit-post-manage-blocks-modal { + height: calc(100% - 56px - 56px); } } + +.edit-post-manage-blocks-modal .components-modal__content { + padding-bottom: 0; + display: flex; + flex-direction: column; } + +.edit-post-manage-blocks-modal .components-modal__header { + flex-shrink: 0; + margin-bottom: 0; } + +.edit-post-manage-blocks-modal__content { + display: flex; + flex-direction: column; + flex: 0 1 100%; + min-height: 0; } + +.edit-post-manage-blocks-modal__no-results { + font-style: italic; + padding: 24px 0; + text-align: center; } + +.edit-post-manage-blocks-modal__search { + margin: 16px 0; } + .edit-post-manage-blocks-modal__search .components-base-control__field { + margin-bottom: 0; } + .edit-post-manage-blocks-modal__search .components-base-control__label { + margin-top: -4px; } + .edit-post-manage-blocks-modal__search input[type="search"].components-text-control__input { + padding: 12px; + border-radius: 4px; } + +.edit-post-manage-blocks-modal__disabled-blocks-count { + border-top: 1px solid #e2e4e7; + margin-right: -24px; + margin-left: -24px; + padding-top: 0.6rem; + padding-bottom: 0.6rem; + padding-right: 24px; + padding-left: 24px; + background-color: #f3f4f5; } + +.edit-post-manage-blocks-modal__category { + margin: 0 0 2rem 0; } + +.edit-post-manage-blocks-modal__category-title { + position: -webkit-sticky; + position: sticky; + top: 0; + padding: 16px 0; + background-color: #fff; + z-index: 1; } + .edit-post-manage-blocks-modal__category-title .components-base-control__field { + margin-bottom: 0; } + .edit-post-manage-blocks-modal__category-title .components-checkbox-control__label { + font-size: 0.9rem; + font-weight: 600; } + +.edit-post-manage-blocks-modal__show-all { + margin-left: 8px; } + +.edit-post-manage-blocks-modal__checklist { + margin-top: 0; } + +.edit-post-manage-blocks-modal__checklist-item { + margin-bottom: 0; + padding-right: 16px; + border-top: 1px solid #e2e4e7; } + .edit-post-manage-blocks-modal__checklist-item:last-child { + border-bottom: 1px solid #e2e4e7; } + .edit-post-manage-blocks-modal__checklist-item .components-base-control__field { + align-items: center; + display: flex; + margin: 0; } + .components-modal__content .edit-post-manage-blocks-modal__checklist-item.components-checkbox-control__input-container { + margin: 0 8px; } + .edit-post-manage-blocks-modal__checklist-item .components-checkbox-control__label { + display: flex; + align-items: center; + justify-content: space-between; + flex-grow: 1; + padding: 0.6rem 10px 0.6rem 0; } + .edit-post-manage-blocks-modal__checklist-item .block-editor-block-icon { + margin-left: 10px; + fill: #555d66; } + +.edit-post-manage-blocks-modal__results { + height: 100%; + overflow: auto; + margin-right: -24px; + margin-left: -24px; + padding-right: 24px; + padding-left: 24px; + border-top: 1px solid #e2e4e7; } + +.edit-post-meta-boxes-area { + position: relative; + /** + * The wordpress default for most meta-box elements is content-box. Some + * elements such as textarea and input are set to border-box in forms.css. + * These elements therefore specifically set back to border-box here, while + * other elements (such as .button) are unaffected by Gutenberg's style + * because of their higher specificity. + */ + /* Match width and positioning of the meta boxes. Override default styles. */ + /* Override Default meta box stylings */ } + .edit-post-meta-boxes-area__container, + .edit-post-meta-boxes-area .inside { + box-sizing: content-box; } + .edit-post-meta-boxes-area textarea, + .edit-post-meta-boxes-area input { + box-sizing: border-box; } + .edit-post-meta-boxes-area #poststuff { + margin: 0 auto; + padding-top: 0; + min-width: auto; } + .edit-post-meta-boxes-area #poststuff h3.hndle, + .edit-post-meta-boxes-area #poststuff .stuffbox > h3, + .edit-post-meta-boxes-area #poststuff h2.hndle { + /* WordPress selectors yolo */ + border-bottom: 1px solid #e2e4e7; + box-sizing: border-box; + color: inherit; + font-weight: 600; + outline: none; + padding: 15px; + position: relative; + width: 100%; } + .edit-post-meta-boxes-area .postbox { + border: 0; + color: inherit; + margin-bottom: 0; } + .edit-post-meta-boxes-area .postbox > .inside { + border-bottom: 1px solid #e2e4e7; + color: inherit; + padding: 0 14px 14px; + margin: 0; } + .edit-post-meta-boxes-area .postbox .handlediv { + height: 44px; + width: 44px; } + .edit-post-meta-boxes-area.is-loading::before { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + content: ""; + background: transparent; + z-index: 1; } + .edit-post-meta-boxes-area .components-spinner { + position: absolute; + top: 10px; + left: 20px; + z-index: 5; } + .edit-post-meta-boxes-area .is-hidden { + display: none; } + .edit-post-meta-boxes-area .metabox-location-side .postbox input[type="checkbox"] { + border: 1px solid #6c7781; } + .edit-post-meta-boxes-area .metabox-location-side .postbox input[type="checkbox"]:checked { + background: #fff; + border-color: #6c7781; } + .edit-post-meta-boxes-area .metabox-location-side .postbox input[type="checkbox"]::before { + margin: -3px -4px; } + +.edit-post-meta-boxes-area__clear { + clear: both; } + +.edit-post-sidebar { + background: #fff; + color: #555d66; + overflow: visible; } + @media (min-width: 600px) { + .edit-post-sidebar { + z-index: auto; + height: 100%; + overflow: auto; + -webkit-overflow-scrolling: touch; } } + @media (min-width: 782px) { + .edit-post-sidebar { + width: 280px; } } + .edit-post-sidebar > .components-panel { + border-right: none; + border-left: none; + overflow: auto; + -webkit-overflow-scrolling: touch; + height: auto; + max-height: calc(100vh - 96px); + margin-top: -1px; + margin-bottom: -1px; + position: relative; } + @media (min-width: 600px) { + .edit-post-sidebar > .components-panel { + overflow: visible; + height: auto; + max-height: none; } } + .edit-post-sidebar > .components-panel .components-panel__header { + position: fixed; + z-index: 1; + top: 0; + right: 0; + left: 0; + height: 50px; } + @media (min-width: 600px) { + .edit-post-sidebar > .components-panel .components-panel__header { + position: inherit; + top: auto; + right: auto; + left: auto; } } + .edit-post-sidebar p { + margin-top: 0; } + .edit-post-sidebar h2, + .edit-post-sidebar h3 { + font-size: 13px; + color: #555d66; + margin-bottom: 1.5em; } + .edit-post-sidebar hr { + border-top: none; + border-bottom: 1px solid #e2e4e7; + margin: 1.5em 0; } + .edit-post-sidebar div.components-toolbar { + box-shadow: none; + margin-bottom: 1.5em; } + .edit-post-sidebar div.components-toolbar:last-child { + margin-bottom: 0; } + .edit-post-sidebar p + div.components-toolbar { + margin-top: -1em; } + .edit-post-sidebar .block-editor-skip-to-selected-block:focus { + top: auto; + left: 10px; + bottom: 10px; + right: auto; } + +/* Text Editor specific */ +.components-panel__header.edit-post-sidebar__header { + background: #fff; + padding-left: 8px; } + .components-panel__header.edit-post-sidebar__header .edit-post-sidebar__title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; } + @media (min-width: 782px) { + .components-panel__header.edit-post-sidebar__header { + display: none; } } + +.components-panel__header.edit-post-sidebar__panel-tabs { + justify-content: flex-start; + padding-right: 0; + padding-left: 4px; + border-top: 0; + margin-top: 0; } + .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon { + display: none; + margin-right: auto; } + @media (min-width: 782px) { + .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon { + display: flex; } } + +.edit-post-sidebar__panel-tab { + background: transparent; + border: none; + border-radius: 0; + box-shadow: none; + cursor: pointer; + height: 50px; + padding: 3px 15px; + margin-right: 0; + font-weight: 400; + outline-offset: -1px; + transition: box-shadow 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .edit-post-sidebar__panel-tab { + transition-duration: 0s; } } + .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #007cba; + font-weight: 600; + position: relative; } + body.admin-color-sunrise .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #837425; } + body.admin-color-ocean .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #5e7d5e; } + body.admin-color-midnight .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #497b8d; } + body.admin-color-ectoplasm .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #523f6d; } + body.admin-color-coffee .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #59524c; } + body.admin-color-blue .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #417e9B; } + body.admin-color-light .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #007cba; } + .edit-post-sidebar__panel-tab.is-active::before { + content: ""; + position: absolute; + top: 0; + bottom: 1px; + left: 0; + right: 0; + border-bottom: 3px solid transparent; } + .edit-post-sidebar__panel-tab:focus:not(:disabled) { + color: #191e23; + outline-offset: -1px; + outline: 1px dotted #555d66; + box-shadow: none; } + +.components-panel__body.is-opened.edit-post-last-revision__panel { + padding: 0; } + +.editor-post-last-revision__title { + padding: 13px 16px; } + +.editor-post-author__select { + margin: -5px 0; + width: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .editor-post-author__select { + width: auto; } } + +.edit-post-post-link__link-post-name { + font-weight: 600; } + +.edit-post-post-link__preview-label { + margin: 0; } + +.edit-post-post-link__link { + text-align: right; + word-wrap: break-word; + display: block; } +.edit-post-post-link__preview-link-container { + direction: ltr; } +.edit-post-post-schedule { + width: 100%; + position: relative; } + +.components-button.edit-post-post-schedule__toggle { + text-align: left; } + +.editor-post-slug__input { + margin: -5px 0; + padding: 2px; } + +.edit-post-post-status .edit-post-post-publish-dropdown__switch-to-draft { + margin-top: 15px; + width: 100%; + text-align: center; } + +.edit-post-post-visibility { + width: 100%; } + +.edit-post-post-visibility__dialog .components-popover__content { + padding: 10px; } + @media (min-width: 782px) { + .edit-post-post-visibility__dialog .components-popover__content { + width: 257px; } } + +.edit-post-post-visibility__dialog-legend { + font-weight: 600; } + +.edit-post-post-visibility__choice { + margin: 10px 0; } + +.edit-post-post-visibility__dialog-radio, +.edit-post-post-visibility__dialog-label { + vertical-align: top; } + +.edit-post-post-visibility__dialog-password-input { + width: calc(100% - 20px); + margin-right: 20px; } + +.edit-post-post-visibility__dialog-info { + color: #7e8993; + padding-right: 20px; + font-style: italic; + margin: 4px 0 0; + line-height: 1.4; } + +.components-panel__header.edit-post-sidebar__panel-tabs { + justify-content: flex-start; + padding-right: 0; + padding-left: 4px; + border-top: 0; } + .components-panel__header.edit-post-sidebar__panel-tabs ul { + display: flex; } + .components-panel__header.edit-post-sidebar__panel-tabs li { + margin: 0; } + +.components-button.edit-post-sidebar__panel-tab { + background: transparent; + border: none; + box-shadow: none; + cursor: pointer; + display: inline-block; + padding: 3px 15px; + margin-right: 0; + font-weight: 400; + color: #191e23; + outline-offset: -1px; + transition: box-shadow 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .components-button.edit-post-sidebar__panel-tab { + transition-duration: 0s; } } + .components-button.edit-post-sidebar__panel-tab::after { + content: attr(data-label); + display: block; + font-weight: 600; + height: 0; + overflow: hidden; + speak: none; + visibility: hidden; } + .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #007cba; + font-weight: 600; + position: relative; } + body.admin-color-sunrise .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #837425; } + body.admin-color-ocean .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #5e7d5e; } + body.admin-color-midnight .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #497b8d; } + body.admin-color-ectoplasm .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #523f6d; } + body.admin-color-coffee .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #59524c; } + body.admin-color-blue .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #417e9B; } + body.admin-color-light .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #007cba; } + .components-button.edit-post-sidebar__panel-tab.is-active::before { + content: ""; + position: absolute; + top: 0; + bottom: 1px; + left: 0; + right: 0; + border-bottom: 3px solid transparent; } + .components-button.edit-post-sidebar__panel-tab:focus { + background-color: transparent; + color: #191e23; + outline-offset: -1px; + outline: 1px dotted #555d66; } + +/* Text Editor specific */ +.components-panel__header.edit-post-sidebar-header__small { + background: #fff; + padding-left: 4px; } + .components-panel__header.edit-post-sidebar-header__small .edit-post-sidebar__title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; } + @media (min-width: 782px) { + .components-panel__header.edit-post-sidebar-header__small { + display: none; } } + +.components-panel__header.edit-post-sidebar-header { + padding-left: 4px; + background: #f3f4f5; } + .components-panel__header.edit-post-sidebar-header .components-button.has-icon { + display: none; + margin-right: auto; } + .components-panel__header.edit-post-sidebar-header .components-button.has-icon ~ .components-button { + margin-right: 0; } + @media (min-width: 782px) { + .components-panel__header.edit-post-sidebar-header .components-button.has-icon { + display: flex; } } + +.edit-post-text-editor { + position: relative; + width: 100%; + padding-top: 44px; } + .edit-post-text-editor .editor-post-title__block textarea { + border: 1px solid #e2e4e7; + margin-bottom: 4px; + padding: 14px; } + .edit-post-text-editor .editor-post-title__block textarea:focus { + border: 1px solid #e2e4e7; } + .edit-post-text-editor .editor-post-title__block:not(.is-focus-mode):not(.has-fixed-toolbar):not(.is-selected) .editor-post-title__input:hover, + .edit-post-text-editor .editor-post-title__block:not(.is-focus-mode):not(.has-fixed-toolbar).is-selected .editor-post-title__input { + box-shadow: none; + border-right-width: 1px; } + .edit-post-text-editor .editor-post-title__block textarea:hover, + .edit-post-text-editor .editor-post-title__block.is-selected textarea { + box-shadow: 0 0 0 1px #e2e4e7; } + .edit-post-text-editor .editor-post-permalink { + margin-top: -6px; + box-shadow: none; + border: none; + outline: 1px solid #b5bcc2; } + @media (min-width: 600px) { + .edit-post-text-editor .editor-post-title, + .edit-post-text-editor .editor-post-title__block { + padding: 0; } } + +.edit-post-text-editor__toolbar { + position: absolute; + top: 8px; + right: 0; + left: 0; + height: 36px; + line-height: 36px; + padding: 0 16px 0 8px; + display: flex; } + .edit-post-text-editor__toolbar h2 { + margin: 0 0 0 auto; + font-size: 13px; + color: #555d66; } + .edit-post-text-editor__toolbar .components-button svg { + order: 1; } + +.edit-post-text-editor__body { + max-width: calc(100% - 32px); + margin-right: 16px; + margin-left: 16px; + padding-top: 40px; } + @media (min-width: 600px) { + .edit-post-text-editor__body { + max-width: 580px; + margin-right: auto; + margin-left: auto; } } + +.edit-post-visual-editor { + position: relative; + padding-top: 50px; + flex: 1 1 auto; } + .edit-post-visual-editor .components-button { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .edit-post-visual-editor { + flex-basis: 100%; } } + +.edit-post-visual-editor > .block-editor__typewriter, +.edit-post-visual-editor > .block-editor__typewriter > div, +.edit-post-visual-editor > .block-editor__typewriter > div > .block-editor-writing-flow, +.edit-post-visual-editor > .block-editor__typewriter > div > .block-editor-writing-flow > .block-editor-writing-flow__click-redirect { + height: 100%; } + +.edit-post-visual-editor .block-editor-writing-flow__click-redirect { + min-height: 40vh; + width: 100%; } + +.has-metaboxes .edit-post-visual-editor .block-editor-writing-flow__click-redirect { + height: 0; } + +.edit-post-visual-editor .block-editor-block-list__block { + margin-right: auto; + margin-left: auto; } + +@media (min-width: 600px) { + .editor-post-title { + padding-right: 58px; + padding-left: 58px; } } + +.edit-post-visual-editor .editor-post-title__block { + margin-right: auto; + margin-left: auto; + margin-bottom: 32px; } + .edit-post-visual-editor .editor-post-title__block > div { + margin-right: 0; + margin-left: 0; } + @media (min-width: 600px) { + .edit-post-visual-editor .editor-post-title__block > div { + margin-right: -16px; + margin-left: -16px; } } + +.edit-post-visual-editor .block-editor-block-list__layout > .block-editor-block-list__block[data-align="left"]:first-child, +.edit-post-visual-editor .block-editor-block-list__layout > .block-editor-block-list__block[data-align="right"]:first-child { + margin-top: 34px; } + +.edit-post-options-modal__section { + margin: 0 0 2rem 0; } + +.edit-post-options-modal__section-title { + font-size: 0.9rem; + font-weight: 600; } + +.edit-post-options-modal__option { + border-top: 1px solid #e2e4e7; } + .edit-post-options-modal__option:last-child { + border-bottom: 1px solid #e2e4e7; } + .edit-post-options-modal__option .components-base-control__field { + align-items: center; + display: flex; + margin: 0; } + .edit-post-options-modal__option .components-checkbox-control__label { + flex-grow: 1; + padding: 0.6rem 10px 0.6rem 0; } + +.edit-post-options-modal__custom-fields-confirmation-message, .edit-post-options-modal__custom-fields-confirmation-button { + margin: 0 48px 0.6rem 0; } + @media (min-width: 782px) { + .edit-post-options-modal__custom-fields-confirmation-message, .edit-post-options-modal__custom-fields-confirmation-button { + margin-right: 38px; } } + @media (min-width: 600px) { + .edit-post-options-modal__custom-fields-confirmation-message, .edit-post-options-modal__custom-fields-confirmation-button { + max-width: 300px; } } + +.edit-post-welcome-guide__page { + display: flex; + flex-direction: column; + justify-content: center; + position: relative; } + @media (min-width: 600px) { + .edit-post-welcome-guide__page { + min-height: 300px; + padding-right: 344px; } } + +.edit-post-welcome-guide__heading { + font-family: "Noto Serif", serif; + font-size: 21px; + line-height: 1.4; + margin: 8px 0; } + +.edit-post-welcome-guide__image { + background: #66c6e4; + border-radius: 4px; + height: 200px; + margin: 8px 0; } + @media (min-width: 600px) { + .edit-post-welcome-guide__image { + position: absolute; + right: 0; + top: 50%; + height: 300px; + width: 320px; + margin-top: -150px; } } + +.edit-post-welcome-guide__text { + font-size: 16px; + line-height: 1.4; + margin: 8px 0; } + +.edit-post-welcome-guide__inserter-icon { + margin: 0 4px; + position: relative; + top: 4px; } + +@media (min-width: 600px) { + .edit-post-welcome-guide { + width: 600px; } } + +/** + * Animations + */ +@keyframes edit-post__fade-in-animation { + from { + opacity: 0; } + to { + opacity: 1; } } + +html.wp-toolbar { + background: #fff; } + +body.block-editor-page { + background: #fff; + /* We hide legacy notices in Gutenberg Based Pages, because they were not designed in a way that scaled well. + Plugins can use Gutenberg notices if they need to pass on information to the user when they are editing. */ } + body.block-editor-page #wpcontent { + padding-right: 0; } + body.block-editor-page #wpbody-content { + padding-bottom: 0; } + body.block-editor-page #wpbody-content > div:not(.block-editor):not(#screen-meta) { + display: none; } + body.block-editor-page #wpfooter { + display: none; } + body.block-editor-page .a11y-speak-region { + right: -1px; + top: -1px; } + body.block-editor-page ul#adminmenu a.wp-has-current-submenu::after, + body.block-editor-page ul#adminmenu > li.current > a.current::after { + border-left-color: #fff; } + body.block-editor-page .media-frame select.attachment-filters:last-of-type { + width: auto; + max-width: 100%; } + +.edit-post-header, +.edit-post-visual-editor, +.edit-post-text-editor, +.edit-post-sidebar, +.editor-post-publish-panel, +.components-popover, +.components-modal__frame { + box-sizing: border-box; } + .edit-post-header *, + .edit-post-header *::before, + .edit-post-header *::after, + .edit-post-visual-editor *, + .edit-post-visual-editor *::before, + .edit-post-visual-editor *::after, + .edit-post-text-editor *, + .edit-post-text-editor *::before, + .edit-post-text-editor *::after, + .edit-post-sidebar *, + .edit-post-sidebar *::before, + .edit-post-sidebar *::after, + .editor-post-publish-panel *, + .editor-post-publish-panel *::before, + .editor-post-publish-panel *::after, + .components-popover *, + .components-popover *::before, + .components-popover *::after, + .components-modal__frame *, + .components-modal__frame *::before, + .components-modal__frame *::after { + box-sizing: inherit; } + .edit-post-header .input-control, + .edit-post-header input[type="text"], + .edit-post-header input[type="search"], + .edit-post-header input[type="radio"], + .edit-post-header input[type="tel"], + .edit-post-header input[type="time"], + .edit-post-header input[type="url"], + .edit-post-header input[type="week"], + .edit-post-header input[type="password"], + .edit-post-header input[type="checkbox"], + .edit-post-header input[type="color"], + .edit-post-header input[type="date"], + .edit-post-header input[type="datetime"], + .edit-post-header input[type="datetime-local"], + .edit-post-header input[type="email"], + .edit-post-header input[type="month"], + .edit-post-header input[type="number"], + .edit-post-header select, + .edit-post-header textarea, + .edit-post-visual-editor .input-control, + .edit-post-visual-editor input[type="text"], + .edit-post-visual-editor input[type="search"], + .edit-post-visual-editor input[type="radio"], + .edit-post-visual-editor input[type="tel"], + .edit-post-visual-editor input[type="time"], + .edit-post-visual-editor input[type="url"], + .edit-post-visual-editor input[type="week"], + .edit-post-visual-editor input[type="password"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-visual-editor input[type="color"], + .edit-post-visual-editor input[type="date"], + .edit-post-visual-editor input[type="datetime"], + .edit-post-visual-editor input[type="datetime-local"], + .edit-post-visual-editor input[type="email"], + .edit-post-visual-editor input[type="month"], + .edit-post-visual-editor input[type="number"], + .edit-post-visual-editor select, + .edit-post-visual-editor textarea, + .edit-post-text-editor .input-control, + .edit-post-text-editor input[type="text"], + .edit-post-text-editor input[type="search"], + .edit-post-text-editor input[type="radio"], + .edit-post-text-editor input[type="tel"], + .edit-post-text-editor input[type="time"], + .edit-post-text-editor input[type="url"], + .edit-post-text-editor input[type="week"], + .edit-post-text-editor input[type="password"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-text-editor input[type="color"], + .edit-post-text-editor input[type="date"], + .edit-post-text-editor input[type="datetime"], + .edit-post-text-editor input[type="datetime-local"], + .edit-post-text-editor input[type="email"], + .edit-post-text-editor input[type="month"], + .edit-post-text-editor input[type="number"], + .edit-post-text-editor select, + .edit-post-text-editor textarea, + .edit-post-sidebar .input-control, + .edit-post-sidebar input[type="text"], + .edit-post-sidebar input[type="search"], + .edit-post-sidebar input[type="radio"], + .edit-post-sidebar input[type="tel"], + .edit-post-sidebar input[type="time"], + .edit-post-sidebar input[type="url"], + .edit-post-sidebar input[type="week"], + .edit-post-sidebar input[type="password"], + .edit-post-sidebar input[type="checkbox"], + .edit-post-sidebar input[type="color"], + .edit-post-sidebar input[type="date"], + .edit-post-sidebar input[type="datetime"], + .edit-post-sidebar input[type="datetime-local"], + .edit-post-sidebar input[type="email"], + .edit-post-sidebar input[type="month"], + .edit-post-sidebar input[type="number"], + .edit-post-sidebar select, + .edit-post-sidebar textarea, + .editor-post-publish-panel .input-control, + .editor-post-publish-panel input[type="text"], + .editor-post-publish-panel input[type="search"], + .editor-post-publish-panel input[type="radio"], + .editor-post-publish-panel input[type="tel"], + .editor-post-publish-panel input[type="time"], + .editor-post-publish-panel input[type="url"], + .editor-post-publish-panel input[type="week"], + .editor-post-publish-panel input[type="password"], + .editor-post-publish-panel input[type="checkbox"], + .editor-post-publish-panel input[type="color"], + .editor-post-publish-panel input[type="date"], + .editor-post-publish-panel input[type="datetime"], + .editor-post-publish-panel input[type="datetime-local"], + .editor-post-publish-panel input[type="email"], + .editor-post-publish-panel input[type="month"], + .editor-post-publish-panel input[type="number"], + .editor-post-publish-panel select, + .editor-post-publish-panel textarea, + .components-popover .input-control, + .components-popover input[type="text"], + .components-popover input[type="search"], + .components-popover input[type="radio"], + .components-popover input[type="tel"], + .components-popover input[type="time"], + .components-popover input[type="url"], + .components-popover input[type="week"], + .components-popover input[type="password"], + .components-popover input[type="checkbox"], + .components-popover input[type="color"], + .components-popover input[type="date"], + .components-popover input[type="datetime"], + .components-popover input[type="datetime-local"], + .components-popover input[type="email"], + .components-popover input[type="month"], + .components-popover input[type="number"], + .components-popover select, + .components-popover textarea, + .components-modal__frame .input-control, + .components-modal__frame input[type="text"], + .components-modal__frame input[type="search"], + .components-modal__frame input[type="radio"], + .components-modal__frame input[type="tel"], + .components-modal__frame input[type="time"], + .components-modal__frame input[type="url"], + .components-modal__frame input[type="week"], + .components-modal__frame input[type="password"], + .components-modal__frame input[type="checkbox"], + .components-modal__frame input[type="color"], + .components-modal__frame input[type="date"], + .components-modal__frame input[type="datetime"], + .components-modal__frame input[type="datetime-local"], + .components-modal__frame input[type="email"], + .components-modal__frame input[type="month"], + .components-modal__frame input[type="number"], + .components-modal__frame select, + .components-modal__frame textarea { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + padding: 6px 8px; + box-shadow: 0 0 0 transparent; + transition: box-shadow 0.1s linear; + border-radius: 4px; + border: 1px solid #7e8993; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; + /* Override core line-height. To be reviewed. */ + line-height: normal; } + @media (prefers-reduced-motion: reduce) { + .edit-post-header .input-control, + .edit-post-header input[type="text"], + .edit-post-header input[type="search"], + .edit-post-header input[type="radio"], + .edit-post-header input[type="tel"], + .edit-post-header input[type="time"], + .edit-post-header input[type="url"], + .edit-post-header input[type="week"], + .edit-post-header input[type="password"], + .edit-post-header input[type="checkbox"], + .edit-post-header input[type="color"], + .edit-post-header input[type="date"], + .edit-post-header input[type="datetime"], + .edit-post-header input[type="datetime-local"], + .edit-post-header input[type="email"], + .edit-post-header input[type="month"], + .edit-post-header input[type="number"], + .edit-post-header select, + .edit-post-header textarea, + .edit-post-visual-editor .input-control, + .edit-post-visual-editor input[type="text"], + .edit-post-visual-editor input[type="search"], + .edit-post-visual-editor input[type="radio"], + .edit-post-visual-editor input[type="tel"], + .edit-post-visual-editor input[type="time"], + .edit-post-visual-editor input[type="url"], + .edit-post-visual-editor input[type="week"], + .edit-post-visual-editor input[type="password"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-visual-editor input[type="color"], + .edit-post-visual-editor input[type="date"], + .edit-post-visual-editor input[type="datetime"], + .edit-post-visual-editor input[type="datetime-local"], + .edit-post-visual-editor input[type="email"], + .edit-post-visual-editor input[type="month"], + .edit-post-visual-editor input[type="number"], + .edit-post-visual-editor select, + .edit-post-visual-editor textarea, + .edit-post-text-editor .input-control, + .edit-post-text-editor input[type="text"], + .edit-post-text-editor input[type="search"], + .edit-post-text-editor input[type="radio"], + .edit-post-text-editor input[type="tel"], + .edit-post-text-editor input[type="time"], + .edit-post-text-editor input[type="url"], + .edit-post-text-editor input[type="week"], + .edit-post-text-editor input[type="password"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-text-editor input[type="color"], + .edit-post-text-editor input[type="date"], + .edit-post-text-editor input[type="datetime"], + .edit-post-text-editor input[type="datetime-local"], + .edit-post-text-editor input[type="email"], + .edit-post-text-editor input[type="month"], + .edit-post-text-editor input[type="number"], + .edit-post-text-editor select, + .edit-post-text-editor textarea, + .edit-post-sidebar .input-control, + .edit-post-sidebar input[type="text"], + .edit-post-sidebar input[type="search"], + .edit-post-sidebar input[type="radio"], + .edit-post-sidebar input[type="tel"], + .edit-post-sidebar input[type="time"], + .edit-post-sidebar input[type="url"], + .edit-post-sidebar input[type="week"], + .edit-post-sidebar input[type="password"], + .edit-post-sidebar input[type="checkbox"], + .edit-post-sidebar input[type="color"], + .edit-post-sidebar input[type="date"], + .edit-post-sidebar input[type="datetime"], + .edit-post-sidebar input[type="datetime-local"], + .edit-post-sidebar input[type="email"], + .edit-post-sidebar input[type="month"], + .edit-post-sidebar input[type="number"], + .edit-post-sidebar select, + .edit-post-sidebar textarea, + .editor-post-publish-panel .input-control, + .editor-post-publish-panel input[type="text"], + .editor-post-publish-panel input[type="search"], + .editor-post-publish-panel input[type="radio"], + .editor-post-publish-panel input[type="tel"], + .editor-post-publish-panel input[type="time"], + .editor-post-publish-panel input[type="url"], + .editor-post-publish-panel input[type="week"], + .editor-post-publish-panel input[type="password"], + .editor-post-publish-panel input[type="checkbox"], + .editor-post-publish-panel input[type="color"], + .editor-post-publish-panel input[type="date"], + .editor-post-publish-panel input[type="datetime"], + .editor-post-publish-panel input[type="datetime-local"], + .editor-post-publish-panel input[type="email"], + .editor-post-publish-panel input[type="month"], + .editor-post-publish-panel input[type="number"], + .editor-post-publish-panel select, + .editor-post-publish-panel textarea, + .components-popover .input-control, + .components-popover input[type="text"], + .components-popover input[type="search"], + .components-popover input[type="radio"], + .components-popover input[type="tel"], + .components-popover input[type="time"], + .components-popover input[type="url"], + .components-popover input[type="week"], + .components-popover input[type="password"], + .components-popover input[type="checkbox"], + .components-popover input[type="color"], + .components-popover input[type="date"], + .components-popover input[type="datetime"], + .components-popover input[type="datetime-local"], + .components-popover input[type="email"], + .components-popover input[type="month"], + .components-popover input[type="number"], + .components-popover select, + .components-popover textarea, + .components-modal__frame .input-control, + .components-modal__frame input[type="text"], + .components-modal__frame input[type="search"], + .components-modal__frame input[type="radio"], + .components-modal__frame input[type="tel"], + .components-modal__frame input[type="time"], + .components-modal__frame input[type="url"], + .components-modal__frame input[type="week"], + .components-modal__frame input[type="password"], + .components-modal__frame input[type="checkbox"], + .components-modal__frame input[type="color"], + .components-modal__frame input[type="date"], + .components-modal__frame input[type="datetime"], + .components-modal__frame input[type="datetime-local"], + .components-modal__frame input[type="email"], + .components-modal__frame input[type="month"], + .components-modal__frame input[type="number"], + .components-modal__frame select, + .components-modal__frame textarea { + transition-duration: 0s; } } + @media (min-width: 600px) { + .edit-post-header .input-control, + .edit-post-header input[type="text"], + .edit-post-header input[type="search"], + .edit-post-header input[type="radio"], + .edit-post-header input[type="tel"], + .edit-post-header input[type="time"], + .edit-post-header input[type="url"], + .edit-post-header input[type="week"], + .edit-post-header input[type="password"], + .edit-post-header input[type="checkbox"], + .edit-post-header input[type="color"], + .edit-post-header input[type="date"], + .edit-post-header input[type="datetime"], + .edit-post-header input[type="datetime-local"], + .edit-post-header input[type="email"], + .edit-post-header input[type="month"], + .edit-post-header input[type="number"], + .edit-post-header select, + .edit-post-header textarea, + .edit-post-visual-editor .input-control, + .edit-post-visual-editor input[type="text"], + .edit-post-visual-editor input[type="search"], + .edit-post-visual-editor input[type="radio"], + .edit-post-visual-editor input[type="tel"], + .edit-post-visual-editor input[type="time"], + .edit-post-visual-editor input[type="url"], + .edit-post-visual-editor input[type="week"], + .edit-post-visual-editor input[type="password"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-visual-editor input[type="color"], + .edit-post-visual-editor input[type="date"], + .edit-post-visual-editor input[type="datetime"], + .edit-post-visual-editor input[type="datetime-local"], + .edit-post-visual-editor input[type="email"], + .edit-post-visual-editor input[type="month"], + .edit-post-visual-editor input[type="number"], + .edit-post-visual-editor select, + .edit-post-visual-editor textarea, + .edit-post-text-editor .input-control, + .edit-post-text-editor input[type="text"], + .edit-post-text-editor input[type="search"], + .edit-post-text-editor input[type="radio"], + .edit-post-text-editor input[type="tel"], + .edit-post-text-editor input[type="time"], + .edit-post-text-editor input[type="url"], + .edit-post-text-editor input[type="week"], + .edit-post-text-editor input[type="password"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-text-editor input[type="color"], + .edit-post-text-editor input[type="date"], + .edit-post-text-editor input[type="datetime"], + .edit-post-text-editor input[type="datetime-local"], + .edit-post-text-editor input[type="email"], + .edit-post-text-editor input[type="month"], + .edit-post-text-editor input[type="number"], + .edit-post-text-editor select, + .edit-post-text-editor textarea, + .edit-post-sidebar .input-control, + .edit-post-sidebar input[type="text"], + .edit-post-sidebar input[type="search"], + .edit-post-sidebar input[type="radio"], + .edit-post-sidebar input[type="tel"], + .edit-post-sidebar input[type="time"], + .edit-post-sidebar input[type="url"], + .edit-post-sidebar input[type="week"], + .edit-post-sidebar input[type="password"], + .edit-post-sidebar input[type="checkbox"], + .edit-post-sidebar input[type="color"], + .edit-post-sidebar input[type="date"], + .edit-post-sidebar input[type="datetime"], + .edit-post-sidebar input[type="datetime-local"], + .edit-post-sidebar input[type="email"], + .edit-post-sidebar input[type="month"], + .edit-post-sidebar input[type="number"], + .edit-post-sidebar select, + .edit-post-sidebar textarea, + .editor-post-publish-panel .input-control, + .editor-post-publish-panel input[type="text"], + .editor-post-publish-panel input[type="search"], + .editor-post-publish-panel input[type="radio"], + .editor-post-publish-panel input[type="tel"], + .editor-post-publish-panel input[type="time"], + .editor-post-publish-panel input[type="url"], + .editor-post-publish-panel input[type="week"], + .editor-post-publish-panel input[type="password"], + .editor-post-publish-panel input[type="checkbox"], + .editor-post-publish-panel input[type="color"], + .editor-post-publish-panel input[type="date"], + .editor-post-publish-panel input[type="datetime"], + .editor-post-publish-panel input[type="datetime-local"], + .editor-post-publish-panel input[type="email"], + .editor-post-publish-panel input[type="month"], + .editor-post-publish-panel input[type="number"], + .editor-post-publish-panel select, + .editor-post-publish-panel textarea, + .components-popover .input-control, + .components-popover input[type="text"], + .components-popover input[type="search"], + .components-popover input[type="radio"], + .components-popover input[type="tel"], + .components-popover input[type="time"], + .components-popover input[type="url"], + .components-popover input[type="week"], + .components-popover input[type="password"], + .components-popover input[type="checkbox"], + .components-popover input[type="color"], + .components-popover input[type="date"], + .components-popover input[type="datetime"], + .components-popover input[type="datetime-local"], + .components-popover input[type="email"], + .components-popover input[type="month"], + .components-popover input[type="number"], + .components-popover select, + .components-popover textarea, + .components-modal__frame .input-control, + .components-modal__frame input[type="text"], + .components-modal__frame input[type="search"], + .components-modal__frame input[type="radio"], + .components-modal__frame input[type="tel"], + .components-modal__frame input[type="time"], + .components-modal__frame input[type="url"], + .components-modal__frame input[type="week"], + .components-modal__frame input[type="password"], + .components-modal__frame input[type="checkbox"], + .components-modal__frame input[type="color"], + .components-modal__frame input[type="date"], + .components-modal__frame input[type="datetime"], + .components-modal__frame input[type="datetime-local"], + .components-modal__frame input[type="email"], + .components-modal__frame input[type="month"], + .components-modal__frame input[type="number"], + .components-modal__frame select, + .components-modal__frame textarea { + font-size: 13px; + /* Override core line-height. To be reviewed. */ + line-height: normal; } } + .edit-post-header .input-control:focus, + .edit-post-header input[type="text"]:focus, + .edit-post-header input[type="search"]:focus, + .edit-post-header input[type="radio"]:focus, + .edit-post-header input[type="tel"]:focus, + .edit-post-header input[type="time"]:focus, + .edit-post-header input[type="url"]:focus, + .edit-post-header input[type="week"]:focus, + .edit-post-header input[type="password"]:focus, + .edit-post-header input[type="checkbox"]:focus, + .edit-post-header input[type="color"]:focus, + .edit-post-header input[type="date"]:focus, + .edit-post-header input[type="datetime"]:focus, + .edit-post-header input[type="datetime-local"]:focus, + .edit-post-header input[type="email"]:focus, + .edit-post-header input[type="month"]:focus, + .edit-post-header input[type="number"]:focus, + .edit-post-header select:focus, + .edit-post-header textarea:focus, + .edit-post-visual-editor .input-control:focus, + .edit-post-visual-editor input[type="text"]:focus, + .edit-post-visual-editor input[type="search"]:focus, + .edit-post-visual-editor input[type="radio"]:focus, + .edit-post-visual-editor input[type="tel"]:focus, + .edit-post-visual-editor input[type="time"]:focus, + .edit-post-visual-editor input[type="url"]:focus, + .edit-post-visual-editor input[type="week"]:focus, + .edit-post-visual-editor input[type="password"]:focus, + .edit-post-visual-editor input[type="checkbox"]:focus, + .edit-post-visual-editor input[type="color"]:focus, + .edit-post-visual-editor input[type="date"]:focus, + .edit-post-visual-editor input[type="datetime"]:focus, + .edit-post-visual-editor input[type="datetime-local"]:focus, + .edit-post-visual-editor input[type="email"]:focus, + .edit-post-visual-editor input[type="month"]:focus, + .edit-post-visual-editor input[type="number"]:focus, + .edit-post-visual-editor select:focus, + .edit-post-visual-editor textarea:focus, + .edit-post-text-editor .input-control:focus, + .edit-post-text-editor input[type="text"]:focus, + .edit-post-text-editor input[type="search"]:focus, + .edit-post-text-editor input[type="radio"]:focus, + .edit-post-text-editor input[type="tel"]:focus, + .edit-post-text-editor input[type="time"]:focus, + .edit-post-text-editor input[type="url"]:focus, + .edit-post-text-editor input[type="week"]:focus, + .edit-post-text-editor input[type="password"]:focus, + .edit-post-text-editor input[type="checkbox"]:focus, + .edit-post-text-editor input[type="color"]:focus, + .edit-post-text-editor input[type="date"]:focus, + .edit-post-text-editor input[type="datetime"]:focus, + .edit-post-text-editor input[type="datetime-local"]:focus, + .edit-post-text-editor input[type="email"]:focus, + .edit-post-text-editor input[type="month"]:focus, + .edit-post-text-editor input[type="number"]:focus, + .edit-post-text-editor select:focus, + .edit-post-text-editor textarea:focus, + .edit-post-sidebar .input-control:focus, + .edit-post-sidebar input[type="text"]:focus, + .edit-post-sidebar input[type="search"]:focus, + .edit-post-sidebar input[type="radio"]:focus, + .edit-post-sidebar input[type="tel"]:focus, + .edit-post-sidebar input[type="time"]:focus, + .edit-post-sidebar input[type="url"]:focus, + .edit-post-sidebar input[type="week"]:focus, + .edit-post-sidebar input[type="password"]:focus, + .edit-post-sidebar input[type="checkbox"]:focus, + .edit-post-sidebar input[type="color"]:focus, + .edit-post-sidebar input[type="date"]:focus, + .edit-post-sidebar input[type="datetime"]:focus, + .edit-post-sidebar input[type="datetime-local"]:focus, + .edit-post-sidebar input[type="email"]:focus, + .edit-post-sidebar input[type="month"]:focus, + .edit-post-sidebar input[type="number"]:focus, + .edit-post-sidebar select:focus, + .edit-post-sidebar textarea:focus, + .editor-post-publish-panel .input-control:focus, + .editor-post-publish-panel input[type="text"]:focus, + .editor-post-publish-panel input[type="search"]:focus, + .editor-post-publish-panel input[type="radio"]:focus, + .editor-post-publish-panel input[type="tel"]:focus, + .editor-post-publish-panel input[type="time"]:focus, + .editor-post-publish-panel input[type="url"]:focus, + .editor-post-publish-panel input[type="week"]:focus, + .editor-post-publish-panel input[type="password"]:focus, + .editor-post-publish-panel input[type="checkbox"]:focus, + .editor-post-publish-panel input[type="color"]:focus, + .editor-post-publish-panel input[type="date"]:focus, + .editor-post-publish-panel input[type="datetime"]:focus, + .editor-post-publish-panel input[type="datetime-local"]:focus, + .editor-post-publish-panel input[type="email"]:focus, + .editor-post-publish-panel input[type="month"]:focus, + .editor-post-publish-panel input[type="number"]:focus, + .editor-post-publish-panel select:focus, + .editor-post-publish-panel textarea:focus, + .components-popover .input-control:focus, + .components-popover input[type="text"]:focus, + .components-popover input[type="search"]:focus, + .components-popover input[type="radio"]:focus, + .components-popover input[type="tel"]:focus, + .components-popover input[type="time"]:focus, + .components-popover input[type="url"]:focus, + .components-popover input[type="week"]:focus, + .components-popover input[type="password"]:focus, + .components-popover input[type="checkbox"]:focus, + .components-popover input[type="color"]:focus, + .components-popover input[type="date"]:focus, + .components-popover input[type="datetime"]:focus, + .components-popover input[type="datetime-local"]:focus, + .components-popover input[type="email"]:focus, + .components-popover input[type="month"]:focus, + .components-popover input[type="number"]:focus, + .components-popover select:focus, + .components-popover textarea:focus, + .components-modal__frame .input-control:focus, + .components-modal__frame input[type="text"]:focus, + .components-modal__frame input[type="search"]:focus, + .components-modal__frame input[type="radio"]:focus, + .components-modal__frame input[type="tel"]:focus, + .components-modal__frame input[type="time"]:focus, + .components-modal__frame input[type="url"]:focus, + .components-modal__frame input[type="week"]:focus, + .components-modal__frame input[type="password"]:focus, + .components-modal__frame input[type="checkbox"]:focus, + .components-modal__frame input[type="color"]:focus, + .components-modal__frame input[type="date"]:focus, + .components-modal__frame input[type="datetime"]:focus, + .components-modal__frame input[type="datetime-local"]:focus, + .components-modal__frame input[type="email"]:focus, + .components-modal__frame input[type="month"]:focus, + .components-modal__frame input[type="number"]:focus, + .components-modal__frame select:focus, + .components-modal__frame textarea:focus { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + .edit-post-header input[type="number"], + .edit-post-visual-editor input[type="number"], + .edit-post-text-editor input[type="number"], + .edit-post-sidebar input[type="number"], + .editor-post-publish-panel input[type="number"], + .components-popover input[type="number"], + .components-modal__frame input[type="number"] { + padding-right: 4px; + padding-left: 4px; } + .edit-post-header select, + .edit-post-visual-editor select, + .edit-post-text-editor select, + .edit-post-sidebar select, + .editor-post-publish-panel select, + .components-popover select, + .components-modal__frame select { + padding: 3px 8px 3px 24px; + font-size: 13px; + color: #555d66; } + .edit-post-header select:focus, + .edit-post-visual-editor select:focus, + .edit-post-text-editor select:focus, + .edit-post-sidebar select:focus, + .editor-post-publish-panel select:focus, + .components-popover select:focus, + .components-modal__frame select:focus { + border-color: #008dbe; + outline: 2px solid transparent; + outline-offset: 0; } + .edit-post-header input[type="checkbox"], + .edit-post-header input[type="radio"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-visual-editor input[type="radio"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-text-editor input[type="radio"], + .edit-post-sidebar input[type="checkbox"], + .edit-post-sidebar input[type="radio"], + .editor-post-publish-panel input[type="checkbox"], + .editor-post-publish-panel input[type="radio"], + .components-popover input[type="checkbox"], + .components-popover input[type="radio"], + .components-modal__frame input[type="checkbox"], + .components-modal__frame input[type="radio"] { + border: 2px solid #6c7781; + margin-left: 12px; + transition: none; } + .edit-post-header input[type="checkbox"]:focus, + .edit-post-header input[type="radio"]:focus, + .edit-post-visual-editor input[type="checkbox"]:focus, + .edit-post-visual-editor input[type="radio"]:focus, + .edit-post-text-editor input[type="checkbox"]:focus, + .edit-post-text-editor input[type="radio"]:focus, + .edit-post-sidebar input[type="checkbox"]:focus, + .edit-post-sidebar input[type="radio"]:focus, + .editor-post-publish-panel input[type="checkbox"]:focus, + .editor-post-publish-panel input[type="radio"]:focus, + .components-popover input[type="checkbox"]:focus, + .components-popover input[type="radio"]:focus, + .components-modal__frame input[type="checkbox"]:focus, + .components-modal__frame input[type="radio"]:focus { + border-color: #6c7781; + box-shadow: 0 0 0 1px #6c7781; } + .edit-post-header input[type="checkbox"]:checked, + .edit-post-header input[type="radio"]:checked, + .edit-post-visual-editor input[type="checkbox"]:checked, + .edit-post-visual-editor input[type="radio"]:checked, + .edit-post-text-editor input[type="checkbox"]:checked, + .edit-post-text-editor input[type="radio"]:checked, + .edit-post-sidebar input[type="checkbox"]:checked, + .edit-post-sidebar input[type="radio"]:checked, + .editor-post-publish-panel input[type="checkbox"]:checked, + .editor-post-publish-panel input[type="radio"]:checked, + .components-popover input[type="checkbox"]:checked, + .components-popover input[type="radio"]:checked, + .components-modal__frame input[type="checkbox"]:checked, + .components-modal__frame input[type="radio"]:checked { + background: #11a0d2; + border-color: #11a0d2; } + body.admin-color-sunrise .edit-post-header input[type="checkbox"]:checked, body.admin-color-sunrise .edit-post-header input[type="radio"]:checked, body.admin-color-sunrise .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-sunrise .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-sunrise .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-sunrise .edit-post-text-editor input[type="radio"]:checked, body.admin-color-sunrise .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-sunrise .edit-post-sidebar input[type="radio"]:checked, body.admin-color-sunrise .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-sunrise .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-sunrise .components-popover input[type="checkbox"]:checked, body.admin-color-sunrise .components-popover input[type="radio"]:checked, body.admin-color-sunrise .components-modal__frame input[type="checkbox"]:checked, body.admin-color-sunrise .components-modal__frame input[type="radio"]:checked { + background: #c8b03c; + border-color: #c8b03c; } + body.admin-color-ocean .edit-post-header input[type="checkbox"]:checked, body.admin-color-ocean .edit-post-header input[type="radio"]:checked, body.admin-color-ocean .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-ocean .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-ocean .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-ocean .edit-post-text-editor input[type="radio"]:checked, body.admin-color-ocean .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-ocean .edit-post-sidebar input[type="radio"]:checked, body.admin-color-ocean .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-ocean .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-ocean .components-popover input[type="checkbox"]:checked, body.admin-color-ocean .components-popover input[type="radio"]:checked, body.admin-color-ocean .components-modal__frame input[type="checkbox"]:checked, body.admin-color-ocean .components-modal__frame input[type="radio"]:checked { + background: #a3b9a2; + border-color: #a3b9a2; } + body.admin-color-midnight .edit-post-header input[type="checkbox"]:checked, body.admin-color-midnight .edit-post-header input[type="radio"]:checked, body.admin-color-midnight .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-midnight .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-midnight .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-midnight .edit-post-text-editor input[type="radio"]:checked, body.admin-color-midnight .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-midnight .edit-post-sidebar input[type="radio"]:checked, body.admin-color-midnight .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-midnight .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-midnight .components-popover input[type="checkbox"]:checked, body.admin-color-midnight .components-popover input[type="radio"]:checked, body.admin-color-midnight .components-modal__frame input[type="checkbox"]:checked, body.admin-color-midnight .components-modal__frame input[type="radio"]:checked { + background: #77a6b9; + border-color: #77a6b9; } + body.admin-color-ectoplasm .edit-post-header input[type="checkbox"]:checked, body.admin-color-ectoplasm .edit-post-header input[type="radio"]:checked, body.admin-color-ectoplasm .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-ectoplasm .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-ectoplasm .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-ectoplasm .edit-post-text-editor input[type="radio"]:checked, body.admin-color-ectoplasm .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-ectoplasm .edit-post-sidebar input[type="radio"]:checked, body.admin-color-ectoplasm .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-ectoplasm .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-ectoplasm .components-popover input[type="checkbox"]:checked, body.admin-color-ectoplasm .components-popover input[type="radio"]:checked, body.admin-color-ectoplasm .components-modal__frame input[type="checkbox"]:checked, body.admin-color-ectoplasm .components-modal__frame input[type="radio"]:checked { + background: #a7b656; + border-color: #a7b656; } + body.admin-color-coffee .edit-post-header input[type="checkbox"]:checked, body.admin-color-coffee .edit-post-header input[type="radio"]:checked, body.admin-color-coffee .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-coffee .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-coffee .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-coffee .edit-post-text-editor input[type="radio"]:checked, body.admin-color-coffee .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-coffee .edit-post-sidebar input[type="radio"]:checked, body.admin-color-coffee .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-coffee .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-coffee .components-popover input[type="checkbox"]:checked, body.admin-color-coffee .components-popover input[type="radio"]:checked, body.admin-color-coffee .components-modal__frame input[type="checkbox"]:checked, body.admin-color-coffee .components-modal__frame input[type="radio"]:checked { + background: #c2a68c; + border-color: #c2a68c; } + body.admin-color-blue .edit-post-header input[type="checkbox"]:checked, body.admin-color-blue .edit-post-header input[type="radio"]:checked, body.admin-color-blue .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-blue .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-blue .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-blue .edit-post-text-editor input[type="radio"]:checked, body.admin-color-blue .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-blue .edit-post-sidebar input[type="radio"]:checked, body.admin-color-blue .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-blue .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-blue .components-popover input[type="checkbox"]:checked, body.admin-color-blue .components-popover input[type="radio"]:checked, body.admin-color-blue .components-modal__frame input[type="checkbox"]:checked, body.admin-color-blue .components-modal__frame input[type="radio"]:checked { + background: #82b4cb; + border-color: #82b4cb; } + body.admin-color-light .edit-post-header input[type="checkbox"]:checked, body.admin-color-light .edit-post-header input[type="radio"]:checked, body.admin-color-light .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-light .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-light .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-light .edit-post-text-editor input[type="radio"]:checked, body.admin-color-light .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-light .edit-post-sidebar input[type="radio"]:checked, body.admin-color-light .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-light .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-light .components-popover input[type="checkbox"]:checked, body.admin-color-light .components-popover input[type="radio"]:checked, body.admin-color-light .components-modal__frame input[type="checkbox"]:checked, body.admin-color-light .components-modal__frame input[type="radio"]:checked { + background: #11a0d2; + border-color: #11a0d2; } + .edit-post-header input[type="checkbox"]:checked:focus, + .edit-post-header input[type="radio"]:checked:focus, + .edit-post-visual-editor input[type="checkbox"]:checked:focus, + .edit-post-visual-editor input[type="radio"]:checked:focus, + .edit-post-text-editor input[type="checkbox"]:checked:focus, + .edit-post-text-editor input[type="radio"]:checked:focus, + .edit-post-sidebar input[type="checkbox"]:checked:focus, + .edit-post-sidebar input[type="radio"]:checked:focus, + .editor-post-publish-panel input[type="checkbox"]:checked:focus, + .editor-post-publish-panel input[type="radio"]:checked:focus, + .components-popover input[type="checkbox"]:checked:focus, + .components-popover input[type="radio"]:checked:focus, + .components-modal__frame input[type="checkbox"]:checked:focus, + .components-modal__frame input[type="radio"]:checked:focus { + box-shadow: 0 0 0 2px #555d66; } + .edit-post-header input[type="checkbox"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-sidebar input[type="checkbox"], + .editor-post-publish-panel input[type="checkbox"], + .components-popover input[type="checkbox"], + .components-modal__frame input[type="checkbox"] { + border-radius: 2px; } + .edit-post-header input[type="checkbox"]:checked::before, .edit-post-header input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-visual-editor input[type="checkbox"]:checked::before, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-text-editor input[type="checkbox"]:checked::before, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-sidebar input[type="checkbox"]:checked::before, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]::before, + .editor-post-publish-panel input[type="checkbox"]:checked::before, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]::before, + .components-popover input[type="checkbox"]:checked::before, + .components-popover input[type="checkbox"][aria-checked="mixed"]::before, + .components-modal__frame input[type="checkbox"]:checked::before, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]::before { + margin: -3px -5px; + color: #fff; } + @media (min-width: 782px) { + .edit-post-header input[type="checkbox"]:checked::before, .edit-post-header input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-visual-editor input[type="checkbox"]:checked::before, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-text-editor input[type="checkbox"]:checked::before, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-sidebar input[type="checkbox"]:checked::before, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]::before, + .editor-post-publish-panel input[type="checkbox"]:checked::before, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]::before, + .components-popover input[type="checkbox"]:checked::before, + .components-popover input[type="checkbox"][aria-checked="mixed"]::before, + .components-modal__frame input[type="checkbox"]:checked::before, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]::before { + margin: -4px -5px 0 0; } } + .edit-post-header input[type="checkbox"][aria-checked="mixed"], + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], + .components-popover input[type="checkbox"][aria-checked="mixed"], + .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #11a0d2; + border-color: #11a0d2; } + body.admin-color-sunrise .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #c8b03c; + border-color: #c8b03c; } + body.admin-color-ocean .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #a3b9a2; + border-color: #a3b9a2; } + body.admin-color-midnight .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #77a6b9; + border-color: #77a6b9; } + body.admin-color-ectoplasm .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #a7b656; + border-color: #a7b656; } + body.admin-color-coffee .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #c2a68c; + border-color: #c2a68c; } + body.admin-color-blue .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #82b4cb; + border-color: #82b4cb; } + body.admin-color-light .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #11a0d2; + border-color: #11a0d2; } + .edit-post-header input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]::before, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]::before, + .components-popover input[type="checkbox"][aria-checked="mixed"]::before, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]::before { + content: "\f460"; + float: right; + display: inline-block; + vertical-align: middle; + width: 16px; + /* stylelint-disable */ + font: normal 30px/1 dashicons; + /* stylelint-enable */ + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + @media (min-width: 782px) { + .edit-post-header input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]::before, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]::before, + .components-popover input[type="checkbox"][aria-checked="mixed"]::before, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]::before { + float: none; + font-size: 21px; } } + .edit-post-header input[type="checkbox"][aria-checked="mixed"]:focus, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]:focus, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]:focus, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]:focus, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]:focus, + .components-popover input[type="checkbox"][aria-checked="mixed"]:focus, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]:focus { + box-shadow: 0 0 0 2px #555d66; } + .edit-post-header input[type="radio"], + .edit-post-visual-editor input[type="radio"], + .edit-post-text-editor input[type="radio"], + .edit-post-sidebar input[type="radio"], + .editor-post-publish-panel input[type="radio"], + .components-popover input[type="radio"], + .components-modal__frame input[type="radio"] { + border-radius: 50%; } + .edit-post-header input[type="radio"]:checked::before, + .edit-post-visual-editor input[type="radio"]:checked::before, + .edit-post-text-editor input[type="radio"]:checked::before, + .edit-post-sidebar input[type="radio"]:checked::before, + .editor-post-publish-panel input[type="radio"]:checked::before, + .components-popover input[type="radio"]:checked::before, + .components-modal__frame input[type="radio"]:checked::before { + width: 6px; + height: 6px; + margin: 6px 6px 0 0; + background-color: #fff; } + @media (min-width: 782px) { + .edit-post-header input[type="radio"]:checked::before, + .edit-post-visual-editor input[type="radio"]:checked::before, + .edit-post-text-editor input[type="radio"]:checked::before, + .edit-post-sidebar input[type="radio"]:checked::before, + .editor-post-publish-panel input[type="radio"]:checked::before, + .components-popover input[type="radio"]:checked::before, + .components-modal__frame input[type="radio"]:checked::before { + margin: 3px 3px 0 0; } } + .edit-post-header input::-webkit-input-placeholder, + .edit-post-header textarea::-webkit-input-placeholder, + .edit-post-visual-editor input::-webkit-input-placeholder, + .edit-post-visual-editor textarea::-webkit-input-placeholder, + .edit-post-text-editor input::-webkit-input-placeholder, + .edit-post-text-editor textarea::-webkit-input-placeholder, + .edit-post-sidebar input::-webkit-input-placeholder, + .edit-post-sidebar textarea::-webkit-input-placeholder, + .editor-post-publish-panel input::-webkit-input-placeholder, + .editor-post-publish-panel textarea::-webkit-input-placeholder, + .components-popover input::-webkit-input-placeholder, + .components-popover textarea::-webkit-input-placeholder, + .components-modal__frame input::-webkit-input-placeholder, + .components-modal__frame textarea::-webkit-input-placeholder { + color: rgba(14, 28, 46, 0.62); } + .edit-post-header input::-moz-placeholder, + .edit-post-header textarea::-moz-placeholder, + .edit-post-visual-editor input::-moz-placeholder, + .edit-post-visual-editor textarea::-moz-placeholder, + .edit-post-text-editor input::-moz-placeholder, + .edit-post-text-editor textarea::-moz-placeholder, + .edit-post-sidebar input::-moz-placeholder, + .edit-post-sidebar textarea::-moz-placeholder, + .editor-post-publish-panel input::-moz-placeholder, + .editor-post-publish-panel textarea::-moz-placeholder, + .components-popover input::-moz-placeholder, + .components-popover textarea::-moz-placeholder, + .components-modal__frame input::-moz-placeholder, + .components-modal__frame textarea::-moz-placeholder { + opacity: 1; + color: rgba(14, 28, 46, 0.62); } + .edit-post-header input:-ms-input-placeholder, + .edit-post-header textarea:-ms-input-placeholder, + .edit-post-visual-editor input:-ms-input-placeholder, + .edit-post-visual-editor textarea:-ms-input-placeholder, + .edit-post-text-editor input:-ms-input-placeholder, + .edit-post-text-editor textarea:-ms-input-placeholder, + .edit-post-sidebar input:-ms-input-placeholder, + .edit-post-sidebar textarea:-ms-input-placeholder, + .editor-post-publish-panel input:-ms-input-placeholder, + .editor-post-publish-panel textarea:-ms-input-placeholder, + .components-popover input:-ms-input-placeholder, + .components-popover textarea:-ms-input-placeholder, + .components-modal__frame input:-ms-input-placeholder, + .components-modal__frame textarea:-ms-input-placeholder { + color: rgba(14, 28, 46, 0.62); } + .is-dark-theme .edit-post-header input::-webkit-input-placeholder, .is-dark-theme + .edit-post-header textarea::-webkit-input-placeholder, .is-dark-theme + .edit-post-visual-editor input::-webkit-input-placeholder, .is-dark-theme + .edit-post-visual-editor textarea::-webkit-input-placeholder, .is-dark-theme + .edit-post-text-editor input::-webkit-input-placeholder, .is-dark-theme + .edit-post-text-editor textarea::-webkit-input-placeholder, .is-dark-theme + .edit-post-sidebar input::-webkit-input-placeholder, .is-dark-theme + .edit-post-sidebar textarea::-webkit-input-placeholder, .is-dark-theme + .editor-post-publish-panel input::-webkit-input-placeholder, .is-dark-theme + .editor-post-publish-panel textarea::-webkit-input-placeholder, .is-dark-theme + .components-popover input::-webkit-input-placeholder, .is-dark-theme + .components-popover textarea::-webkit-input-placeholder, .is-dark-theme + .components-modal__frame input::-webkit-input-placeholder, .is-dark-theme + .components-modal__frame textarea::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.65); } + .is-dark-theme .edit-post-header input::-moz-placeholder, .is-dark-theme + .edit-post-header textarea::-moz-placeholder, .is-dark-theme + .edit-post-visual-editor input::-moz-placeholder, .is-dark-theme + .edit-post-visual-editor textarea::-moz-placeholder, .is-dark-theme + .edit-post-text-editor input::-moz-placeholder, .is-dark-theme + .edit-post-text-editor textarea::-moz-placeholder, .is-dark-theme + .edit-post-sidebar input::-moz-placeholder, .is-dark-theme + .edit-post-sidebar textarea::-moz-placeholder, .is-dark-theme + .editor-post-publish-panel input::-moz-placeholder, .is-dark-theme + .editor-post-publish-panel textarea::-moz-placeholder, .is-dark-theme + .components-popover input::-moz-placeholder, .is-dark-theme + .components-popover textarea::-moz-placeholder, .is-dark-theme + .components-modal__frame input::-moz-placeholder, .is-dark-theme + .components-modal__frame textarea::-moz-placeholder { + opacity: 1; + color: rgba(255, 255, 255, 0.65); } + .is-dark-theme .edit-post-header input:-ms-input-placeholder, .is-dark-theme + .edit-post-header textarea:-ms-input-placeholder, .is-dark-theme + .edit-post-visual-editor input:-ms-input-placeholder, .is-dark-theme + .edit-post-visual-editor textarea:-ms-input-placeholder, .is-dark-theme + .edit-post-text-editor input:-ms-input-placeholder, .is-dark-theme + .edit-post-text-editor textarea:-ms-input-placeholder, .is-dark-theme + .edit-post-sidebar input:-ms-input-placeholder, .is-dark-theme + .edit-post-sidebar textarea:-ms-input-placeholder, .is-dark-theme + .editor-post-publish-panel input:-ms-input-placeholder, .is-dark-theme + .editor-post-publish-panel textarea:-ms-input-placeholder, .is-dark-theme + .components-popover input:-ms-input-placeholder, .is-dark-theme + .components-popover textarea:-ms-input-placeholder, .is-dark-theme + .components-modal__frame input:-ms-input-placeholder, .is-dark-theme + .components-modal__frame textarea:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.65); } + +@media (min-width: 600px) { + .block-editor__container { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + min-height: calc(100vh - 46px); } } + +@media (min-width: 782px) { + .block-editor__container { + min-height: calc(100vh - 32px); } + body.is-fullscreen-mode .block-editor__container { + min-height: 100vh; } } + +.block-editor__container img { + max-width: 100%; + height: auto; } + +.block-editor__container iframe { + width: 100%; } + +.block-editor__container .components-navigate-regions { + height: 100%; } + +.wp-block { + max-width: 580px; } + .wp-block[data-align="wide"] { + max-width: 1100px; } + .wp-block[data-align="full"] { + max-width: none; } diff --git a/wp-includes/css/dist/edit-post/style-rtl.min.css b/wp-includes/css/dist/edit-post/style-rtl.min.css new file mode 100644 index 0000000..c9b596e --- /dev/null +++ b/wp-includes/css/dist/edit-post/style-rtl.min.css @@ -0,0 +1 @@ +@media (min-width:782px){body.js.is-fullscreen-mode{margin-top:-46px;height:calc(100% + 46px)}}@media (min-width:782px) and (min-width:782px){body.js.is-fullscreen-mode{margin-top:-32px;height:calc(100% + 32px)}}@media (min-width:782px){body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-right:0}body.js.is-fullscreen-mode .edit-post-header{transform:translateY(-100%);animation:edit-post-fullscreen-mode__slide-in-animation .1s forwards}}@media (min-width:782px) and (prefers-reduced-motion:reduce){body.js.is-fullscreen-mode .edit-post-header{animation-duration:1ms}}@keyframes edit-post-fullscreen-mode__slide-in-animation{to{transform:translateY(0)}}.edit-post-header{height:56px;background:#fff;display:flex;flex-wrap:wrap;align-items:center;max-width:100vw}@media (min-width:280px){.edit-post-header{flex-wrap:nowrap}}.edit-post-header>.edit-post-header__settings{order:1}@supports ((position:-webkit-sticky) or (position:sticky)){.edit-post-header>.edit-post-header__settings{order:0}}.edit-post-header__toolbar{display:flex;flex-grow:1;padding-right:16px}.edit-post-header__settings{display:inline-flex;align-items:center;flex-wrap:wrap;padding-left:8px}.edit-post-header .components-button.is-pressed{color:#fff;background:#555d66}.edit-post-header .components-button.is-pressed:focus,.edit-post-header .components-button.is-pressed:hover{box-shadow:0 0 0 1px #555d66,inset 0 0 0 1px #fff!important;color:#fff!important;background:#555d66!important}.edit-post-header .components-button.editor-post-preview,.edit-post-header .components-button.editor-post-publish-button,.edit-post-header .components-button.editor-post-publish-panel__toggle,.edit-post-header .components-button.editor-post-save-draft,.edit-post-header .components-button.editor-post-switch-to-draft{margin:2px;font-size:13px}.edit-post-header .components-button.editor-post-save-draft,.edit-post-header .components-button.editor-post-switch-to-draft{padding:0 5px}@media (min-width:600px){.edit-post-header .components-button.editor-post-save-draft,.edit-post-header .components-button.editor-post-switch-to-draft{padding:0 12px}}.edit-post-header .components-button.editor-post-preview,.edit-post-header .components-button.editor-post-publish-button,.edit-post-header .components-button.editor-post-publish-panel__toggle{padding-right:5px;padding-left:5px}@media (min-width:600px){.edit-post-header .components-button.editor-post-preview,.edit-post-header .components-button.editor-post-publish-button,.edit-post-header .components-button.editor-post-publish-panel__toggle{padding-right:12px;padding-left:12px}}@media (min-width:782px){.edit-post-header .components-button.editor-post-preview{margin:0 12px 0 3px}.edit-post-header .components-button.editor-post-publish-button,.edit-post-header .components-button.editor-post-publish-panel__toggle{margin:0 3px 0 12px}}.edit-post-fullscreen-mode-close.has-icon{display:none}@media (min-width:782px){.edit-post-fullscreen-mode-close.has-icon{display:flex;align-items:center;align-self:stretch;border:none;background:#23282e;color:#fff;border-radius:0;height:auto;width:56px}.edit-post-fullscreen-mode-close.has-icon:hover{background:#32373d!important;color:#fff!important;box-shadow:none!important}.edit-post-fullscreen-mode-close.has-icon:active{color:#fff}}.edit-post-fullscreen-mode-close.has-icon svg{margin-right:auto;margin-left:auto}.edit-post-header-toolbar{display:inline-flex;align-items:center}.edit-post-header-toolbar>.components-button{display:none}@media (min-width:600px){.edit-post-header-toolbar>.components-button{display:inline-flex}}.edit-post-header-toolbar .block-editor-block-navigation,.edit-post-header-toolbar .table-of-contents{display:none}@media (min-width:600px){.edit-post-header-toolbar .block-editor-block-navigation,.edit-post-header-toolbar .table-of-contents{display:flex}}.edit-post-header-toolbar__block-toolbar{position:absolute;top:57px;right:0;left:0;background:#fff;min-height:37px;border-bottom:1px solid #e2e4e7}.edit-post-header-toolbar__block-toolbar:empty{display:none}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar{border-top:none;border-bottom:none}.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{display:none}@media (min-width:782px){.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{display:block;left:280px}}@media (min-width:1280px){.edit-post-header-toolbar__block-toolbar{padding-right:8px;position:static;right:auto;left:auto;background:none;border-bottom:none;min-height:auto}.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{left:auto}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar{margin:-9px 0}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar{padding:10px 4px 9px}}.edit-post-more-menu{margin-right:-4px}.edit-post-more-menu .components-button{width:auto;padding:0 2px}@media (min-width:600px){.edit-post-more-menu{margin-right:4px}.edit-post-more-menu .components-button{padding:0 4px}}.edit-post-more-menu .components-button svg{transform:rotate(-90deg)}.edit-post-more-menu__content .components-popover__content{min-width:260px}@media (min-width:480px){.edit-post-more-menu__content .components-popover__content{width:auto;max-width:480px}}.edit-post-more-menu__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.edit-post-more-menu__content{z-index:99998}.edit-post-pinned-plugins{display:none}@media (min-width:600px){.edit-post-pinned-plugins{display:flex}}.edit-post-pinned-plugins .components-button{margin-right:4px}.edit-post-pinned-plugins .components-button.is-pressed{margin-right:5px}.edit-post-pinned-plugins .components-button svg{max-width:24px;max-height:24px}.edit-post-pinned-plugins .components-button:not(.is-pressed) svg,.edit-post-pinned-plugins .components-button:not(.is-pressed) svg *{stroke:#555d66;fill:#555d66;stroke-width:0}.edit-post-pinned-plugins .components-button.is-pressed:hover svg,.edit-post-pinned-plugins .components-button.is-pressed:hover svg *,.edit-post-pinned-plugins .components-button.is-pressed svg,.edit-post-pinned-plugins .components-button.is-pressed svg *{stroke:#fff!important;fill:#fff!important;stroke-width:0}.edit-post-pinned-plugins .components-button:hover svg,.edit-post-pinned-plugins .components-button:hover svg *{stroke:#191e23!important;fill:#191e23!important;stroke-width:0}.edit-post-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-post-keyboard-shortcut-help-modal__main-shortcuts .edit-post-keyboard-shortcut-help-modal__shortcut-list{margin-top:-25px}.edit-post-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-keyboard-shortcut-help-modal__shortcut{display:flex;align-items:baseline;padding:.6rem 0;border-top:1px solid #e2e4e7;margin-bottom:0}.edit-post-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #e2e4e7}.edit-post-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-post-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 1rem 0 0;text-align:left}.edit-post-keyboard-shortcut-help-modal__shortcut-description{flex:1;margin:0;flex-basis:auto}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{display:block;background:none;margin:0;padding:0}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-post-keyboard-shortcut-help-modal__shortcut-key{padding:.25rem .5rem;border-radius:8%;margin:0 .2rem}.edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 .2rem 0 0}.edit-post-layout__metaboxes{flex-shrink:0}.edit-post-layout__metaboxes:not(:empty){border-top:1px solid #e2e4e7;padding:10px 0;clear:both}.edit-post-layout__metaboxes:not(:empty) .edit-post-meta-boxes-area{margin:auto 20px}.edit-post-layout .components-editor-notices__snackbar{position:fixed;left:0;bottom:20px;padding-right:16px;padding-left:16px;right:0}@media (min-width:782px){.edit-post-layout .components-editor-notices__snackbar{right:160px}}@media (min-width:782px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{right:36px}}@media (min-width:961px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{right:160px}}.folded .edit-post-layout .components-editor-notices__snackbar{right:0}@media (min-width:782px){.folded .edit-post-layout .components-editor-notices__snackbar{right:36px}}@media (max-width:782px){.auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar{right:190px}}@media (max-width:600px){.auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar{margin-right:-18px}}body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar{right:0!important}.edit-post-layout .editor-post-publish-panel{position:fixed;z-index:100001;top:46px;bottom:0;left:0;right:0;overflow:auto}@media (min-width:782px){.edit-post-layout .editor-post-publish-panel{z-index:99998;top:32px;right:auto;width:280px;border-right:1px solid #e2e4e7;transform:translateX(-100%);animation:edit-post-post-publish-panel__slide-in-animation .1s forwards}}@media (min-width:782px) and (prefers-reduced-motion:reduce){.edit-post-layout .editor-post-publish-panel{animation-duration:1ms}}@media (min-width:782px){body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel{top:0}.is-focusing-regions .edit-post-layout .editor-post-publish-panel{transform:translateX(0)}}@keyframes edit-post-post-publish-panel__slide-in-animation{to{transform:translateX(0)}}.block-editor-editor-skeleton__sidebar>div{height:100%}.edit-post-layout .editor-post-publish-panel__header-publish-button{justify-content:center}.edit-post-layout__toogle-publish-panel,.edit-post-layout__toogle-sidebar-panel{background-color:#fff;padding:10px 0 10px 10px}.edit-post-layout__toogle-publish-panel-button,.edit-post-layout__toogle-sidebar-panel-button{width:auto;height:auto;display:block;font-size:14px;font-weight:600;margin:0 auto 0 0;padding:15px 23px 14px;line-height:normal;text-decoration:none;outline:none;background:#f1f1f1;color:#11a0d2}body.admin-color-sunrise .edit-post-layout__toogle-publish-panel-button,body.admin-color-sunrise .edit-post-layout__toogle-sidebar-panel-button{color:#c8b03c}body.admin-color-ocean .edit-post-layout__toogle-publish-panel-button,body.admin-color-ocean .edit-post-layout__toogle-sidebar-panel-button{color:#a89d8a}body.admin-color-midnight .edit-post-layout__toogle-publish-panel-button,body.admin-color-midnight .edit-post-layout__toogle-sidebar-panel-button{color:#77a6b9}body.admin-color-ectoplasm .edit-post-layout__toogle-publish-panel-button,body.admin-color-ectoplasm .edit-post-layout__toogle-sidebar-panel-button{color:#c77430}body.admin-color-coffee .edit-post-layout__toogle-publish-panel-button,body.admin-color-coffee .edit-post-layout__toogle-sidebar-panel-button{color:#9fa47b}body.admin-color-blue .edit-post-layout__toogle-publish-panel-button,body.admin-color-blue .edit-post-layout__toogle-sidebar-panel-button{color:#d9ab59}body.admin-color-light .edit-post-layout__toogle-publish-panel-button,body.admin-color-light .edit-post-layout__toogle-sidebar-panel-button{color:#c75726}.edit-post-layout__toogle-publish-panel-button:focus,.edit-post-layout__toogle-sidebar-panel-button:focus{position:fixed;top:auto;left:10px;bottom:10px;right:auto}.edit-post-layout__footer{display:none;z-index:30}@media (min-width:782px){.edit-post-layout__footer{display:flex;background:#fff;height:24px;padding:0 8px;align-items:center;font-size:13px}}@media (min-width:600px){.edit-post-manage-blocks-modal{height:calc(100% - 112px)}}.edit-post-manage-blocks-modal .components-modal__content{padding-bottom:0;display:flex;flex-direction:column}.edit-post-manage-blocks-modal .components-modal__header{flex-shrink:0;margin-bottom:0}.edit-post-manage-blocks-modal__content{display:flex;flex-direction:column;flex:0 1 100%;min-height:0}.edit-post-manage-blocks-modal__no-results{font-style:italic;padding:24px 0;text-align:center}.edit-post-manage-blocks-modal__search{margin:16px 0}.edit-post-manage-blocks-modal__search .components-base-control__field{margin-bottom:0}.edit-post-manage-blocks-modal__search .components-base-control__label{margin-top:-4px}.edit-post-manage-blocks-modal__search input[type=search].components-text-control__input{padding:12px;border-radius:4px}.edit-post-manage-blocks-modal__disabled-blocks-count{border-top:1px solid #e2e4e7;margin-right:-24px;margin-left:-24px;padding:.6rem 24px;background-color:#f3f4f5}.edit-post-manage-blocks-modal__category{margin:0 0 2rem}.edit-post-manage-blocks-modal__category-title{position:-webkit-sticky;position:sticky;top:0;padding:16px 0;background-color:#fff;z-index:1}.edit-post-manage-blocks-modal__category-title .components-base-control__field{margin-bottom:0}.edit-post-manage-blocks-modal__category-title .components-checkbox-control__label{font-size:.9rem;font-weight:600}.edit-post-manage-blocks-modal__show-all{margin-left:8px}.edit-post-manage-blocks-modal__checklist{margin-top:0}.edit-post-manage-blocks-modal__checklist-item{margin-bottom:0;padding-right:16px;border-top:1px solid #e2e4e7}.edit-post-manage-blocks-modal__checklist-item:last-child{border-bottom:1px solid #e2e4e7}.edit-post-manage-blocks-modal__checklist-item .components-base-control__field{align-items:center;display:flex;margin:0}.components-modal__content .edit-post-manage-blocks-modal__checklist-item.components-checkbox-control__input-container{margin:0 8px}.edit-post-manage-blocks-modal__checklist-item .components-checkbox-control__label{display:flex;align-items:center;justify-content:space-between;flex-grow:1;padding:.6rem 10px .6rem 0}.edit-post-manage-blocks-modal__checklist-item .block-editor-block-icon{margin-left:10px;fill:#555d66}.edit-post-manage-blocks-modal__results{height:100%;overflow:auto;margin-right:-24px;margin-left:-24px;padding-right:24px;padding-left:24px;border-top:1px solid #e2e4e7}.edit-post-meta-boxes-area{position:relative}.edit-post-meta-boxes-area .inside,.edit-post-meta-boxes-area__container{box-sizing:content-box}.edit-post-meta-boxes-area input,.edit-post-meta-boxes-area textarea{box-sizing:border-box}.edit-post-meta-boxes-area #poststuff{margin:0 auto;padding-top:0;min-width:auto}.edit-post-meta-boxes-area #poststuff .stuffbox>h3,.edit-post-meta-boxes-area #poststuff h2.hndle,.edit-post-meta-boxes-area #poststuff h3.hndle{border-bottom:1px solid #e2e4e7;box-sizing:border-box;color:inherit;font-weight:600;outline:none;padding:15px;position:relative;width:100%}.edit-post-meta-boxes-area .postbox{border:0;color:inherit;margin-bottom:0}.edit-post-meta-boxes-area .postbox>.inside{border-bottom:1px solid #e2e4e7;color:inherit;padding:0 14px 14px;margin:0}.edit-post-meta-boxes-area .postbox .handlediv{height:44px;width:44px}.edit-post-meta-boxes-area.is-loading:before{position:absolute;top:0;right:0;left:0;bottom:0;content:"";background:transparent;z-index:1}.edit-post-meta-boxes-area .components-spinner{position:absolute;top:10px;left:20px;z-index:5}.edit-post-meta-boxes-area .is-hidden{display:none}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]{border:1px solid #6c7781}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked{background:#fff;border-color:#6c7781}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:before{margin:-3px -4px}.edit-post-meta-boxes-area__clear{clear:both}.edit-post-sidebar{background:#fff;color:#555d66;overflow:visible}@media (min-width:600px){.edit-post-sidebar{z-index:auto;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}}@media (min-width:782px){.edit-post-sidebar{width:280px}}.edit-post-sidebar>.components-panel{border-right:none;border-left:none;overflow:auto;-webkit-overflow-scrolling:touch;height:auto;max-height:calc(100vh - 96px);margin-top:-1px;margin-bottom:-1px;position:relative}@media (min-width:600px){.edit-post-sidebar>.components-panel{overflow:visible;height:auto;max-height:none}}.edit-post-sidebar>.components-panel .components-panel__header{position:fixed;z-index:1;top:0;right:0;left:0;height:50px}@media (min-width:600px){.edit-post-sidebar>.components-panel .components-panel__header{position:inherit;top:auto;right:auto;left:auto}}.edit-post-sidebar p{margin-top:0}.edit-post-sidebar h2,.edit-post-sidebar h3{font-size:13px;color:#555d66;margin-bottom:1.5em}.edit-post-sidebar hr{border-top:none;border-bottom:1px solid #e2e4e7;margin:1.5em 0}.edit-post-sidebar div.components-toolbar{box-shadow:none;margin-bottom:1.5em}.edit-post-sidebar div.components-toolbar:last-child{margin-bottom:0}.edit-post-sidebar p+div.components-toolbar{margin-top:-1em}.edit-post-sidebar .block-editor-skip-to-selected-block:focus{top:auto;left:10px;bottom:10px;right:auto}.components-panel__header.edit-post-sidebar__header{background:#fff;padding-left:8px}.components-panel__header.edit-post-sidebar__header .edit-post-sidebar__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.edit-post-sidebar__header{display:none}}.components-panel__header.edit-post-sidebar__panel-tabs{margin-top:0}.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:none;margin-right:auto}@media (min-width:782px){.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:flex}}.edit-post-sidebar__panel-tab{background:transparent;border:none;border-radius:0;box-shadow:none;cursor:pointer;height:50px;padding:3px 15px;margin-right:0;font-weight:400;outline-offset:-1px;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.edit-post-sidebar__panel-tab{transition-duration:0s}}.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #007cba;font-weight:600;position:relative}body.admin-color-sunrise .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #837425}body.admin-color-ocean .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #5e7d5e}body.admin-color-midnight .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #497b8d}body.admin-color-ectoplasm .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #523f6d}body.admin-color-coffee .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #59524c}body.admin-color-blue .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #417e9b}body.admin-color-light .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #007cba}.edit-post-sidebar__panel-tab.is-active:before{content:"";position:absolute;top:0;bottom:1px;left:0;right:0;border-bottom:3px solid transparent}.edit-post-sidebar__panel-tab:focus:not(:disabled){color:#191e23;outline-offset:-1px;outline:1px dotted #555d66;box-shadow:none}.components-panel__body.is-opened.edit-post-last-revision__panel{padding:0}.editor-post-last-revision__title{padding:13px 16px}.editor-post-author__select{margin:-5px 0;width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.editor-post-author__select{width:auto}}.edit-post-post-link__link-post-name{font-weight:600}.edit-post-post-link__preview-label{margin:0}.edit-post-post-link__link{text-align:right;word-wrap:break-word;display:block}.edit-post-post-link__preview-link-container{direction:ltr}.edit-post-post-schedule{width:100%;position:relative}.components-button.edit-post-post-schedule__toggle{text-align:left}.editor-post-slug__input{margin:-5px 0;padding:2px}.edit-post-post-status .edit-post-post-publish-dropdown__switch-to-draft{margin-top:15px;width:100%;text-align:center}.edit-post-post-visibility{width:100%}.edit-post-post-visibility__dialog .components-popover__content{padding:10px}@media (min-width:782px){.edit-post-post-visibility__dialog .components-popover__content{width:257px}}.edit-post-post-visibility__dialog-legend{font-weight:600}.edit-post-post-visibility__choice{margin:10px 0}.edit-post-post-visibility__dialog-label,.edit-post-post-visibility__dialog-radio{vertical-align:top}.edit-post-post-visibility__dialog-password-input{width:calc(100% - 20px);margin-right:20px}.edit-post-post-visibility__dialog-info{color:#7e8993;padding-right:20px;font-style:italic;margin:4px 0 0;line-height:1.4}.components-panel__header.edit-post-sidebar__panel-tabs{justify-content:flex-start;padding-right:0;padding-left:4px;border-top:0}.components-panel__header.edit-post-sidebar__panel-tabs ul{display:flex}.components-panel__header.edit-post-sidebar__panel-tabs li{margin:0}.components-button.edit-post-sidebar__panel-tab{background:transparent;border:none;box-shadow:none;cursor:pointer;display:inline-block;padding:3px 15px;margin-right:0;font-weight:400;color:#191e23;outline-offset:-1px;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-post-sidebar__panel-tab{transition-duration:0s}}.components-button.edit-post-sidebar__panel-tab:after{content:attr(data-label);display:block;font-weight:600;height:0;overflow:hidden;speak:none;visibility:hidden}.components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #007cba;font-weight:600;position:relative}body.admin-color-sunrise .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #837425}body.admin-color-ocean .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #5e7d5e}body.admin-color-midnight .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #497b8d}body.admin-color-ectoplasm .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #523f6d}body.admin-color-coffee .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #59524c}body.admin-color-blue .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #417e9b}body.admin-color-light .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #007cba}.components-button.edit-post-sidebar__panel-tab.is-active:before{content:"";position:absolute;top:0;bottom:1px;left:0;right:0;border-bottom:3px solid transparent}.components-button.edit-post-sidebar__panel-tab:focus{background-color:transparent;color:#191e23;outline-offset:-1px;outline:1px dotted #555d66}.components-panel__header.edit-post-sidebar-header__small{background:#fff;padding-left:4px}.components-panel__header.edit-post-sidebar-header__small .edit-post-sidebar__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.edit-post-sidebar-header__small{display:none}}.components-panel__header.edit-post-sidebar-header{padding-left:4px;background:#f3f4f5}.components-panel__header.edit-post-sidebar-header .components-button.has-icon{display:none;margin-right:auto}.components-panel__header.edit-post-sidebar-header .components-button.has-icon~.components-button{margin-right:0}@media (min-width:782px){.components-panel__header.edit-post-sidebar-header .components-button.has-icon{display:flex}}.edit-post-text-editor{position:relative;width:100%;padding-top:44px}.edit-post-text-editor .editor-post-title__block textarea{border:1px solid #e2e4e7;margin-bottom:4px;padding:14px}.edit-post-text-editor .editor-post-title__block textarea:focus{border:1px solid #e2e4e7}.edit-post-text-editor .editor-post-title__block:not(.is-focus-mode):not(.has-fixed-toolbar).is-selected .editor-post-title__input,.edit-post-text-editor .editor-post-title__block:not(.is-focus-mode):not(.has-fixed-toolbar):not(.is-selected) .editor-post-title__input:hover{box-shadow:none;border-right-width:1px}.edit-post-text-editor .editor-post-title__block.is-selected textarea,.edit-post-text-editor .editor-post-title__block textarea:hover{box-shadow:0 0 0 1px #e2e4e7}.edit-post-text-editor .editor-post-permalink{margin-top:-6px;box-shadow:none;border:none;outline:1px solid #b5bcc2}@media (min-width:600px){.edit-post-text-editor .editor-post-title,.edit-post-text-editor .editor-post-title__block{padding:0}}.edit-post-text-editor__toolbar{position:absolute;top:8px;right:0;left:0;height:36px;line-height:36px;padding:0 16px 0 8px;display:flex}.edit-post-text-editor__toolbar h2{margin:0 0 0 auto;font-size:13px;color:#555d66}.edit-post-text-editor__toolbar .components-button svg{order:1}.edit-post-text-editor__body{max-width:calc(100% - 32px);margin-right:16px;margin-left:16px;padding-top:40px}@media (min-width:600px){.edit-post-text-editor__body{max-width:580px;margin-right:auto;margin-left:auto}}.edit-post-visual-editor{position:relative;padding-top:50px;flex:1 1 auto}.edit-post-visual-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}@supports ((position:-webkit-sticky) or (position:sticky)){.edit-post-visual-editor{flex-basis:100%}}.edit-post-visual-editor>.block-editor__typewriter,.edit-post-visual-editor>.block-editor__typewriter>div,.edit-post-visual-editor>.block-editor__typewriter>div>.block-editor-writing-flow,.edit-post-visual-editor>.block-editor__typewriter>div>.block-editor-writing-flow>.block-editor-writing-flow__click-redirect{height:100%}.edit-post-visual-editor .block-editor-writing-flow__click-redirect{min-height:40vh;width:100%}.has-metaboxes .edit-post-visual-editor .block-editor-writing-flow__click-redirect{height:0}.edit-post-visual-editor .block-editor-block-list__block{margin-right:auto;margin-left:auto}@media (min-width:600px){.editor-post-title{padding-right:58px;padding-left:58px}}.edit-post-visual-editor .editor-post-title__block{margin-right:auto;margin-left:auto;margin-bottom:32px}.edit-post-visual-editor .editor-post-title__block>div{margin-right:0;margin-left:0}@media (min-width:600px){.edit-post-visual-editor .editor-post-title__block>div{margin-right:-16px;margin-left:-16px}}.edit-post-visual-editor .block-editor-block-list__layout>.block-editor-block-list__block[data-align=left]:first-child,.edit-post-visual-editor .block-editor-block-list__layout>.block-editor-block-list__block[data-align=right]:first-child{margin-top:34px}.edit-post-options-modal__section{margin:0 0 2rem}.edit-post-options-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-options-modal__option{border-top:1px solid #e2e4e7}.edit-post-options-modal__option:last-child{border-bottom:1px solid #e2e4e7}.edit-post-options-modal__option .components-base-control__field{align-items:center;display:flex;margin:0}.edit-post-options-modal__option .components-checkbox-control__label{flex-grow:1;padding:.6rem 10px .6rem 0}.edit-post-options-modal__custom-fields-confirmation-button,.edit-post-options-modal__custom-fields-confirmation-message{margin:0 48px .6rem 0}@media (min-width:782px){.edit-post-options-modal__custom-fields-confirmation-button,.edit-post-options-modal__custom-fields-confirmation-message{margin-right:38px}}@media (min-width:600px){.edit-post-options-modal__custom-fields-confirmation-button,.edit-post-options-modal__custom-fields-confirmation-message{max-width:300px}}.edit-post-welcome-guide__page{display:flex;flex-direction:column;justify-content:center;position:relative}@media (min-width:600px){.edit-post-welcome-guide__page{min-height:300px;padding-right:344px}}.edit-post-welcome-guide__heading{font-family:"Noto Serif",serif;font-size:21px;line-height:1.4;margin:8px 0}.edit-post-welcome-guide__image{background:#66c6e4;border-radius:4px;height:200px;margin:8px 0}@media (min-width:600px){.edit-post-welcome-guide__image{position:absolute;right:0;top:50%;height:300px;width:320px;margin-top:-150px}}.edit-post-welcome-guide__text{font-size:16px;line-height:1.4;margin:8px 0}.edit-post-welcome-guide__inserter-icon{margin:0 4px;position:relative;top:4px}@media (min-width:600px){.edit-post-welcome-guide{width:600px}}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.block-editor-page,html.wp-toolbar{background:#fff}body.block-editor-page #wpcontent{padding-right:0}body.block-editor-page #wpbody-content{padding-bottom:0}body.block-editor-page #wpbody-content>div:not(.block-editor):not(#screen-meta){display:none}body.block-editor-page #wpfooter{display:none}body.block-editor-page .a11y-speak-region{right:-1px;top:-1px}body.block-editor-page ul#adminmenu>li.current>a.current:after,body.block-editor-page ul#adminmenu a.wp-has-current-submenu:after{border-left-color:#fff}body.block-editor-page .media-frame select.attachment-filters:last-of-type{width:auto;max-width:100%}.components-modal__frame,.components-popover,.edit-post-header,.edit-post-sidebar,.edit-post-text-editor,.edit-post-visual-editor,.editor-post-publish-panel{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.components-popover *,.components-popover :after,.components-popover :before,.edit-post-header *,.edit-post-header :after,.edit-post-header :before,.edit-post-sidebar *,.edit-post-sidebar :after,.edit-post-sidebar :before,.edit-post-text-editor *,.edit-post-text-editor :after,.edit-post-text-editor :before,.edit-post-visual-editor *,.edit-post-visual-editor :after,.edit-post-visual-editor :before,.editor-post-publish-panel *,.editor-post-publish-panel :after,.editor-post-publish-panel :before{box-sizing:inherit}.components-modal__frame .input-control,.components-modal__frame input[type=checkbox],.components-modal__frame input[type=color],.components-modal__frame input[type=date],.components-modal__frame input[type=datetime-local],.components-modal__frame input[type=datetime],.components-modal__frame input[type=email],.components-modal__frame input[type=month],.components-modal__frame input[type=number],.components-modal__frame input[type=password],.components-modal__frame input[type=radio],.components-modal__frame input[type=search],.components-modal__frame input[type=tel],.components-modal__frame input[type=text],.components-modal__frame input[type=time],.components-modal__frame input[type=url],.components-modal__frame input[type=week],.components-modal__frame select,.components-modal__frame textarea,.components-popover .input-control,.components-popover input[type=checkbox],.components-popover input[type=color],.components-popover input[type=date],.components-popover input[type=datetime-local],.components-popover input[type=datetime],.components-popover input[type=email],.components-popover input[type=month],.components-popover input[type=number],.components-popover input[type=password],.components-popover input[type=radio],.components-popover input[type=search],.components-popover input[type=tel],.components-popover input[type=text],.components-popover input[type=time],.components-popover input[type=url],.components-popover input[type=week],.components-popover select,.components-popover textarea,.edit-post-header .input-control,.edit-post-header input[type=checkbox],.edit-post-header input[type=color],.edit-post-header input[type=date],.edit-post-header input[type=datetime-local],.edit-post-header input[type=datetime],.edit-post-header input[type=email],.edit-post-header input[type=month],.edit-post-header input[type=number],.edit-post-header input[type=password],.edit-post-header input[type=radio],.edit-post-header input[type=search],.edit-post-header input[type=tel],.edit-post-header input[type=text],.edit-post-header input[type=time],.edit-post-header input[type=url],.edit-post-header input[type=week],.edit-post-header select,.edit-post-header textarea,.edit-post-sidebar .input-control,.edit-post-sidebar input[type=checkbox],.edit-post-sidebar input[type=color],.edit-post-sidebar input[type=date],.edit-post-sidebar input[type=datetime-local],.edit-post-sidebar input[type=datetime],.edit-post-sidebar input[type=email],.edit-post-sidebar input[type=month],.edit-post-sidebar input[type=number],.edit-post-sidebar input[type=password],.edit-post-sidebar input[type=radio],.edit-post-sidebar input[type=search],.edit-post-sidebar input[type=tel],.edit-post-sidebar input[type=text],.edit-post-sidebar input[type=time],.edit-post-sidebar input[type=url],.edit-post-sidebar input[type=week],.edit-post-sidebar select,.edit-post-sidebar textarea,.edit-post-text-editor .input-control,.edit-post-text-editor input[type=checkbox],.edit-post-text-editor input[type=color],.edit-post-text-editor input[type=date],.edit-post-text-editor input[type=datetime-local],.edit-post-text-editor input[type=datetime],.edit-post-text-editor input[type=email],.edit-post-text-editor input[type=month],.edit-post-text-editor input[type=number],.edit-post-text-editor input[type=password],.edit-post-text-editor input[type=radio],.edit-post-text-editor input[type=search],.edit-post-text-editor input[type=tel],.edit-post-text-editor input[type=text],.edit-post-text-editor input[type=time],.edit-post-text-editor input[type=url],.edit-post-text-editor input[type=week],.edit-post-text-editor select,.edit-post-text-editor textarea,.edit-post-visual-editor .input-control,.edit-post-visual-editor input[type=checkbox],.edit-post-visual-editor input[type=color],.edit-post-visual-editor input[type=date],.edit-post-visual-editor input[type=datetime-local],.edit-post-visual-editor input[type=datetime],.edit-post-visual-editor input[type=email],.edit-post-visual-editor input[type=month],.edit-post-visual-editor input[type=number],.edit-post-visual-editor input[type=password],.edit-post-visual-editor input[type=radio],.edit-post-visual-editor input[type=search],.edit-post-visual-editor input[type=tel],.edit-post-visual-editor input[type=text],.edit-post-visual-editor input[type=time],.edit-post-visual-editor input[type=url],.edit-post-visual-editor input[type=week],.edit-post-visual-editor select,.edit-post-visual-editor textarea,.editor-post-publish-panel .input-control,.editor-post-publish-panel input[type=checkbox],.editor-post-publish-panel input[type=color],.editor-post-publish-panel input[type=date],.editor-post-publish-panel input[type=datetime-local],.editor-post-publish-panel input[type=datetime],.editor-post-publish-panel input[type=email],.editor-post-publish-panel input[type=month],.editor-post-publish-panel input[type=number],.editor-post-publish-panel input[type=password],.editor-post-publish-panel input[type=radio],.editor-post-publish-panel input[type=search],.editor-post-publish-panel input[type=tel],.editor-post-publish-panel input[type=text],.editor-post-publish-panel input[type=time],.editor-post-publish-panel input[type=url],.editor-post-publish-panel input[type=week],.editor-post-publish-panel select,.editor-post-publish-panel textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:4px;border:1px solid #7e8993;font-size:16px;line-height:normal}@media (prefers-reduced-motion:reduce){.components-modal__frame .input-control,.components-modal__frame input[type=checkbox],.components-modal__frame input[type=color],.components-modal__frame input[type=date],.components-modal__frame input[type=datetime-local],.components-modal__frame input[type=datetime],.components-modal__frame input[type=email],.components-modal__frame input[type=month],.components-modal__frame input[type=number],.components-modal__frame input[type=password],.components-modal__frame input[type=radio],.components-modal__frame input[type=search],.components-modal__frame input[type=tel],.components-modal__frame input[type=text],.components-modal__frame input[type=time],.components-modal__frame input[type=url],.components-modal__frame input[type=week],.components-modal__frame select,.components-modal__frame textarea,.components-popover .input-control,.components-popover input[type=checkbox],.components-popover input[type=color],.components-popover input[type=date],.components-popover input[type=datetime-local],.components-popover input[type=datetime],.components-popover input[type=email],.components-popover input[type=month],.components-popover input[type=number],.components-popover input[type=password],.components-popover input[type=radio],.components-popover input[type=search],.components-popover input[type=tel],.components-popover input[type=text],.components-popover input[type=time],.components-popover input[type=url],.components-popover input[type=week],.components-popover select,.components-popover textarea,.edit-post-header .input-control,.edit-post-header input[type=checkbox],.edit-post-header input[type=color],.edit-post-header input[type=date],.edit-post-header input[type=datetime-local],.edit-post-header input[type=datetime],.edit-post-header input[type=email],.edit-post-header input[type=month],.edit-post-header input[type=number],.edit-post-header input[type=password],.edit-post-header input[type=radio],.edit-post-header input[type=search],.edit-post-header input[type=tel],.edit-post-header input[type=text],.edit-post-header input[type=time],.edit-post-header input[type=url],.edit-post-header input[type=week],.edit-post-header select,.edit-post-header textarea,.edit-post-sidebar .input-control,.edit-post-sidebar input[type=checkbox],.edit-post-sidebar input[type=color],.edit-post-sidebar input[type=date],.edit-post-sidebar input[type=datetime-local],.edit-post-sidebar input[type=datetime],.edit-post-sidebar input[type=email],.edit-post-sidebar input[type=month],.edit-post-sidebar input[type=number],.edit-post-sidebar input[type=password],.edit-post-sidebar input[type=radio],.edit-post-sidebar input[type=search],.edit-post-sidebar input[type=tel],.edit-post-sidebar input[type=text],.edit-post-sidebar input[type=time],.edit-post-sidebar input[type=url],.edit-post-sidebar input[type=week],.edit-post-sidebar select,.edit-post-sidebar textarea,.edit-post-text-editor .input-control,.edit-post-text-editor input[type=checkbox],.edit-post-text-editor input[type=color],.edit-post-text-editor input[type=date],.edit-post-text-editor input[type=datetime-local],.edit-post-text-editor input[type=datetime],.edit-post-text-editor input[type=email],.edit-post-text-editor input[type=month],.edit-post-text-editor input[type=number],.edit-post-text-editor input[type=password],.edit-post-text-editor input[type=radio],.edit-post-text-editor input[type=search],.edit-post-text-editor input[type=tel],.edit-post-text-editor input[type=text],.edit-post-text-editor input[type=time],.edit-post-text-editor input[type=url],.edit-post-text-editor input[type=week],.edit-post-text-editor select,.edit-post-text-editor textarea,.edit-post-visual-editor .input-control,.edit-post-visual-editor input[type=checkbox],.edit-post-visual-editor input[type=color],.edit-post-visual-editor input[type=date],.edit-post-visual-editor input[type=datetime-local],.edit-post-visual-editor input[type=datetime],.edit-post-visual-editor input[type=email],.edit-post-visual-editor input[type=month],.edit-post-visual-editor input[type=number],.edit-post-visual-editor input[type=password],.edit-post-visual-editor input[type=radio],.edit-post-visual-editor input[type=search],.edit-post-visual-editor input[type=tel],.edit-post-visual-editor input[type=text],.edit-post-visual-editor input[type=time],.edit-post-visual-editor input[type=url],.edit-post-visual-editor input[type=week],.edit-post-visual-editor select,.edit-post-visual-editor textarea,.editor-post-publish-panel .input-control,.editor-post-publish-panel input[type=checkbox],.editor-post-publish-panel input[type=color],.editor-post-publish-panel input[type=date],.editor-post-publish-panel input[type=datetime-local],.editor-post-publish-panel input[type=datetime],.editor-post-publish-panel input[type=email],.editor-post-publish-panel input[type=month],.editor-post-publish-panel input[type=number],.editor-post-publish-panel input[type=password],.editor-post-publish-panel input[type=radio],.editor-post-publish-panel input[type=search],.editor-post-publish-panel input[type=tel],.editor-post-publish-panel input[type=text],.editor-post-publish-panel input[type=time],.editor-post-publish-panel input[type=url],.editor-post-publish-panel input[type=week],.editor-post-publish-panel select,.editor-post-publish-panel textarea{transition-duration:0s}}@media (min-width:600px){.components-modal__frame .input-control,.components-modal__frame input[type=checkbox],.components-modal__frame input[type=color],.components-modal__frame input[type=date],.components-modal__frame input[type=datetime-local],.components-modal__frame input[type=datetime],.components-modal__frame input[type=email],.components-modal__frame input[type=month],.components-modal__frame input[type=number],.components-modal__frame input[type=password],.components-modal__frame input[type=radio],.components-modal__frame input[type=search],.components-modal__frame input[type=tel],.components-modal__frame input[type=text],.components-modal__frame input[type=time],.components-modal__frame input[type=url],.components-modal__frame input[type=week],.components-modal__frame select,.components-modal__frame textarea,.components-popover .input-control,.components-popover input[type=checkbox],.components-popover input[type=color],.components-popover input[type=date],.components-popover input[type=datetime-local],.components-popover input[type=datetime],.components-popover input[type=email],.components-popover input[type=month],.components-popover input[type=number],.components-popover input[type=password],.components-popover input[type=radio],.components-popover input[type=search],.components-popover input[type=tel],.components-popover input[type=text],.components-popover input[type=time],.components-popover input[type=url],.components-popover input[type=week],.components-popover select,.components-popover textarea,.edit-post-header .input-control,.edit-post-header input[type=checkbox],.edit-post-header input[type=color],.edit-post-header input[type=date],.edit-post-header input[type=datetime-local],.edit-post-header input[type=datetime],.edit-post-header input[type=email],.edit-post-header input[type=month],.edit-post-header input[type=number],.edit-post-header input[type=password],.edit-post-header input[type=radio],.edit-post-header input[type=search],.edit-post-header input[type=tel],.edit-post-header input[type=text],.edit-post-header input[type=time],.edit-post-header input[type=url],.edit-post-header input[type=week],.edit-post-header select,.edit-post-header textarea,.edit-post-sidebar .input-control,.edit-post-sidebar input[type=checkbox],.edit-post-sidebar input[type=color],.edit-post-sidebar input[type=date],.edit-post-sidebar input[type=datetime-local],.edit-post-sidebar input[type=datetime],.edit-post-sidebar input[type=email],.edit-post-sidebar input[type=month],.edit-post-sidebar input[type=number],.edit-post-sidebar input[type=password],.edit-post-sidebar input[type=radio],.edit-post-sidebar input[type=search],.edit-post-sidebar input[type=tel],.edit-post-sidebar input[type=text],.edit-post-sidebar input[type=time],.edit-post-sidebar input[type=url],.edit-post-sidebar input[type=week],.edit-post-sidebar select,.edit-post-sidebar textarea,.edit-post-text-editor .input-control,.edit-post-text-editor input[type=checkbox],.edit-post-text-editor input[type=color],.edit-post-text-editor input[type=date],.edit-post-text-editor input[type=datetime-local],.edit-post-text-editor input[type=datetime],.edit-post-text-editor input[type=email],.edit-post-text-editor input[type=month],.edit-post-text-editor input[type=number],.edit-post-text-editor input[type=password],.edit-post-text-editor input[type=radio],.edit-post-text-editor input[type=search],.edit-post-text-editor input[type=tel],.edit-post-text-editor input[type=text],.edit-post-text-editor input[type=time],.edit-post-text-editor input[type=url],.edit-post-text-editor input[type=week],.edit-post-text-editor select,.edit-post-text-editor textarea,.edit-post-visual-editor .input-control,.edit-post-visual-editor input[type=checkbox],.edit-post-visual-editor input[type=color],.edit-post-visual-editor input[type=date],.edit-post-visual-editor input[type=datetime-local],.edit-post-visual-editor input[type=datetime],.edit-post-visual-editor input[type=email],.edit-post-visual-editor input[type=month],.edit-post-visual-editor input[type=number],.edit-post-visual-editor input[type=password],.edit-post-visual-editor input[type=radio],.edit-post-visual-editor input[type=search],.edit-post-visual-editor input[type=tel],.edit-post-visual-editor input[type=text],.edit-post-visual-editor input[type=time],.edit-post-visual-editor input[type=url],.edit-post-visual-editor input[type=week],.edit-post-visual-editor select,.edit-post-visual-editor textarea,.editor-post-publish-panel .input-control,.editor-post-publish-panel input[type=checkbox],.editor-post-publish-panel input[type=color],.editor-post-publish-panel input[type=date],.editor-post-publish-panel input[type=datetime-local],.editor-post-publish-panel input[type=datetime],.editor-post-publish-panel input[type=email],.editor-post-publish-panel input[type=month],.editor-post-publish-panel input[type=number],.editor-post-publish-panel input[type=password],.editor-post-publish-panel input[type=radio],.editor-post-publish-panel input[type=search],.editor-post-publish-panel input[type=tel],.editor-post-publish-panel input[type=text],.editor-post-publish-panel input[type=time],.editor-post-publish-panel input[type=url],.editor-post-publish-panel input[type=week],.editor-post-publish-panel select,.editor-post-publish-panel textarea{font-size:13px;line-height:normal}}.components-modal__frame .input-control:focus,.components-modal__frame input[type=checkbox]:focus,.components-modal__frame input[type=color]:focus,.components-modal__frame input[type=date]:focus,.components-modal__frame input[type=datetime-local]:focus,.components-modal__frame input[type=datetime]:focus,.components-modal__frame input[type=email]:focus,.components-modal__frame input[type=month]:focus,.components-modal__frame input[type=number]:focus,.components-modal__frame input[type=password]:focus,.components-modal__frame input[type=radio]:focus,.components-modal__frame input[type=search]:focus,.components-modal__frame input[type=tel]:focus,.components-modal__frame input[type=text]:focus,.components-modal__frame input[type=time]:focus,.components-modal__frame input[type=url]:focus,.components-modal__frame input[type=week]:focus,.components-modal__frame select:focus,.components-modal__frame textarea:focus,.components-popover .input-control:focus,.components-popover input[type=checkbox]:focus,.components-popover input[type=color]:focus,.components-popover input[type=date]:focus,.components-popover input[type=datetime-local]:focus,.components-popover input[type=datetime]:focus,.components-popover input[type=email]:focus,.components-popover input[type=month]:focus,.components-popover input[type=number]:focus,.components-popover input[type=password]:focus,.components-popover input[type=radio]:focus,.components-popover input[type=search]:focus,.components-popover input[type=tel]:focus,.components-popover input[type=text]:focus,.components-popover input[type=time]:focus,.components-popover input[type=url]:focus,.components-popover input[type=week]:focus,.components-popover select:focus,.components-popover textarea:focus,.edit-post-header .input-control:focus,.edit-post-header input[type=checkbox]:focus,.edit-post-header input[type=color]:focus,.edit-post-header input[type=date]:focus,.edit-post-header input[type=datetime-local]:focus,.edit-post-header input[type=datetime]:focus,.edit-post-header input[type=email]:focus,.edit-post-header input[type=month]:focus,.edit-post-header input[type=number]:focus,.edit-post-header input[type=password]:focus,.edit-post-header input[type=radio]:focus,.edit-post-header input[type=search]:focus,.edit-post-header input[type=tel]:focus,.edit-post-header input[type=text]:focus,.edit-post-header input[type=time]:focus,.edit-post-header input[type=url]:focus,.edit-post-header input[type=week]:focus,.edit-post-header select:focus,.edit-post-header textarea:focus,.edit-post-sidebar .input-control:focus,.edit-post-sidebar input[type=checkbox]:focus,.edit-post-sidebar input[type=color]:focus,.edit-post-sidebar input[type=date]:focus,.edit-post-sidebar input[type=datetime-local]:focus,.edit-post-sidebar input[type=datetime]:focus,.edit-post-sidebar input[type=email]:focus,.edit-post-sidebar input[type=month]:focus,.edit-post-sidebar input[type=number]:focus,.edit-post-sidebar input[type=password]:focus,.edit-post-sidebar input[type=radio]:focus,.edit-post-sidebar input[type=search]:focus,.edit-post-sidebar input[type=tel]:focus,.edit-post-sidebar input[type=text]:focus,.edit-post-sidebar input[type=time]:focus,.edit-post-sidebar input[type=url]:focus,.edit-post-sidebar input[type=week]:focus,.edit-post-sidebar select:focus,.edit-post-sidebar textarea:focus,.edit-post-text-editor .input-control:focus,.edit-post-text-editor input[type=checkbox]:focus,.edit-post-text-editor input[type=color]:focus,.edit-post-text-editor input[type=date]:focus,.edit-post-text-editor input[type=datetime-local]:focus,.edit-post-text-editor input[type=datetime]:focus,.edit-post-text-editor input[type=email]:focus,.edit-post-text-editor input[type=month]:focus,.edit-post-text-editor input[type=number]:focus,.edit-post-text-editor input[type=password]:focus,.edit-post-text-editor input[type=radio]:focus,.edit-post-text-editor input[type=search]:focus,.edit-post-text-editor input[type=tel]:focus,.edit-post-text-editor input[type=text]:focus,.edit-post-text-editor input[type=time]:focus,.edit-post-text-editor input[type=url]:focus,.edit-post-text-editor input[type=week]:focus,.edit-post-text-editor select:focus,.edit-post-text-editor textarea:focus,.edit-post-visual-editor .input-control:focus,.edit-post-visual-editor input[type=checkbox]:focus,.edit-post-visual-editor input[type=color]:focus,.edit-post-visual-editor input[type=date]:focus,.edit-post-visual-editor input[type=datetime-local]:focus,.edit-post-visual-editor input[type=datetime]:focus,.edit-post-visual-editor input[type=email]:focus,.edit-post-visual-editor input[type=month]:focus,.edit-post-visual-editor input[type=number]:focus,.edit-post-visual-editor input[type=password]:focus,.edit-post-visual-editor input[type=radio]:focus,.edit-post-visual-editor input[type=search]:focus,.edit-post-visual-editor input[type=tel]:focus,.edit-post-visual-editor input[type=text]:focus,.edit-post-visual-editor input[type=time]:focus,.edit-post-visual-editor input[type=url]:focus,.edit-post-visual-editor input[type=week]:focus,.edit-post-visual-editor select:focus,.edit-post-visual-editor textarea:focus,.editor-post-publish-panel .input-control:focus,.editor-post-publish-panel input[type=checkbox]:focus,.editor-post-publish-panel input[type=color]:focus,.editor-post-publish-panel input[type=date]:focus,.editor-post-publish-panel input[type=datetime-local]:focus,.editor-post-publish-panel input[type=datetime]:focus,.editor-post-publish-panel input[type=email]:focus,.editor-post-publish-panel input[type=month]:focus,.editor-post-publish-panel input[type=number]:focus,.editor-post-publish-panel input[type=password]:focus,.editor-post-publish-panel input[type=radio]:focus,.editor-post-publish-panel input[type=search]:focus,.editor-post-publish-panel input[type=tel]:focus,.editor-post-publish-panel input[type=text]:focus,.editor-post-publish-panel input[type=time]:focus,.editor-post-publish-panel input[type=url]:focus,.editor-post-publish-panel input[type=week]:focus,.editor-post-publish-panel select:focus,.editor-post-publish-panel textarea:focus{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.components-modal__frame input[type=number],.components-popover input[type=number],.edit-post-header input[type=number],.edit-post-sidebar input[type=number],.edit-post-text-editor input[type=number],.edit-post-visual-editor input[type=number],.editor-post-publish-panel input[type=number]{padding-right:4px;padding-left:4px}.components-modal__frame select,.components-popover select,.edit-post-header select,.edit-post-sidebar select,.edit-post-text-editor select,.edit-post-visual-editor select,.editor-post-publish-panel select{padding:3px 8px 3px 24px;font-size:13px;color:#555d66}.components-modal__frame select:focus,.components-popover select:focus,.edit-post-header select:focus,.edit-post-sidebar select:focus,.edit-post-text-editor select:focus,.edit-post-visual-editor select:focus,.editor-post-publish-panel select:focus{border-color:#008dbe;outline:2px solid transparent;outline-offset:0}.components-modal__frame input[type=checkbox],.components-modal__frame input[type=radio],.components-popover input[type=checkbox],.components-popover input[type=radio],.edit-post-header input[type=checkbox],.edit-post-header input[type=radio],.edit-post-sidebar input[type=checkbox],.edit-post-sidebar input[type=radio],.edit-post-text-editor input[type=checkbox],.edit-post-text-editor input[type=radio],.edit-post-visual-editor input[type=checkbox],.edit-post-visual-editor input[type=radio],.editor-post-publish-panel input[type=checkbox],.editor-post-publish-panel input[type=radio]{border:2px solid #6c7781;margin-left:12px;transition:none}.components-modal__frame input[type=checkbox]:focus,.components-modal__frame input[type=radio]:focus,.components-popover input[type=checkbox]:focus,.components-popover input[type=radio]:focus,.edit-post-header input[type=checkbox]:focus,.edit-post-header input[type=radio]:focus,.edit-post-sidebar input[type=checkbox]:focus,.edit-post-sidebar input[type=radio]:focus,.edit-post-text-editor input[type=checkbox]:focus,.edit-post-text-editor input[type=radio]:focus,.edit-post-visual-editor input[type=checkbox]:focus,.edit-post-visual-editor input[type=radio]:focus,.editor-post-publish-panel input[type=checkbox]:focus,.editor-post-publish-panel input[type=radio]:focus{border-color:#6c7781;box-shadow:0 0 0 1px #6c7781}.components-modal__frame input[type=checkbox]:checked,.components-modal__frame input[type=radio]:checked,.components-popover input[type=checkbox]:checked,.components-popover input[type=radio]:checked,.edit-post-header input[type=checkbox]:checked,.edit-post-header input[type=radio]:checked,.edit-post-sidebar input[type=checkbox]:checked,.edit-post-sidebar input[type=radio]:checked,.edit-post-text-editor input[type=checkbox]:checked,.edit-post-text-editor input[type=radio]:checked,.edit-post-visual-editor input[type=checkbox]:checked,.edit-post-visual-editor input[type=radio]:checked,.editor-post-publish-panel input[type=checkbox]:checked,.editor-post-publish-panel input[type=radio]:checked{background:#11a0d2;border-color:#11a0d2}body.admin-color-sunrise .components-modal__frame input[type=checkbox]:checked,body.admin-color-sunrise .components-modal__frame input[type=radio]:checked,body.admin-color-sunrise .components-popover input[type=checkbox]:checked,body.admin-color-sunrise .components-popover input[type=radio]:checked,body.admin-color-sunrise .edit-post-header input[type=checkbox]:checked,body.admin-color-sunrise .edit-post-header input[type=radio]:checked,body.admin-color-sunrise .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-sunrise .edit-post-sidebar input[type=radio]:checked,body.admin-color-sunrise .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-sunrise .edit-post-text-editor input[type=radio]:checked,body.admin-color-sunrise .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-sunrise .edit-post-visual-editor input[type=radio]:checked,body.admin-color-sunrise .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-sunrise .editor-post-publish-panel input[type=radio]:checked{background:#c8b03c;border-color:#c8b03c}body.admin-color-ocean .components-modal__frame input[type=checkbox]:checked,body.admin-color-ocean .components-modal__frame input[type=radio]:checked,body.admin-color-ocean .components-popover input[type=checkbox]:checked,body.admin-color-ocean .components-popover input[type=radio]:checked,body.admin-color-ocean .edit-post-header input[type=checkbox]:checked,body.admin-color-ocean .edit-post-header input[type=radio]:checked,body.admin-color-ocean .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-ocean .edit-post-sidebar input[type=radio]:checked,body.admin-color-ocean .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-ocean .edit-post-text-editor input[type=radio]:checked,body.admin-color-ocean .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-ocean .edit-post-visual-editor input[type=radio]:checked,body.admin-color-ocean .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-ocean .editor-post-publish-panel input[type=radio]:checked{background:#a3b9a2;border-color:#a3b9a2}body.admin-color-midnight .components-modal__frame input[type=checkbox]:checked,body.admin-color-midnight .components-modal__frame input[type=radio]:checked,body.admin-color-midnight .components-popover input[type=checkbox]:checked,body.admin-color-midnight .components-popover input[type=radio]:checked,body.admin-color-midnight .edit-post-header input[type=checkbox]:checked,body.admin-color-midnight .edit-post-header input[type=radio]:checked,body.admin-color-midnight .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-midnight .edit-post-sidebar input[type=radio]:checked,body.admin-color-midnight .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-midnight .edit-post-text-editor input[type=radio]:checked,body.admin-color-midnight .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-midnight .edit-post-visual-editor input[type=radio]:checked,body.admin-color-midnight .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-midnight .editor-post-publish-panel input[type=radio]:checked{background:#77a6b9;border-color:#77a6b9}body.admin-color-ectoplasm .components-modal__frame input[type=checkbox]:checked,body.admin-color-ectoplasm .components-modal__frame input[type=radio]:checked,body.admin-color-ectoplasm .components-popover input[type=checkbox]:checked,body.admin-color-ectoplasm .components-popover input[type=radio]:checked,body.admin-color-ectoplasm .edit-post-header input[type=checkbox]:checked,body.admin-color-ectoplasm .edit-post-header input[type=radio]:checked,body.admin-color-ectoplasm .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-ectoplasm .edit-post-sidebar input[type=radio]:checked,body.admin-color-ectoplasm .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-ectoplasm .edit-post-text-editor input[type=radio]:checked,body.admin-color-ectoplasm .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-ectoplasm .edit-post-visual-editor input[type=radio]:checked,body.admin-color-ectoplasm .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-ectoplasm .editor-post-publish-panel input[type=radio]:checked{background:#a7b656;border-color:#a7b656}body.admin-color-coffee .components-modal__frame input[type=checkbox]:checked,body.admin-color-coffee .components-modal__frame input[type=radio]:checked,body.admin-color-coffee .components-popover input[type=checkbox]:checked,body.admin-color-coffee .components-popover input[type=radio]:checked,body.admin-color-coffee .edit-post-header input[type=checkbox]:checked,body.admin-color-coffee .edit-post-header input[type=radio]:checked,body.admin-color-coffee .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-coffee .edit-post-sidebar input[type=radio]:checked,body.admin-color-coffee .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-coffee .edit-post-text-editor input[type=radio]:checked,body.admin-color-coffee .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-coffee .edit-post-visual-editor input[type=radio]:checked,body.admin-color-coffee .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-coffee .editor-post-publish-panel input[type=radio]:checked{background:#c2a68c;border-color:#c2a68c}body.admin-color-blue .components-modal__frame input[type=checkbox]:checked,body.admin-color-blue .components-modal__frame input[type=radio]:checked,body.admin-color-blue .components-popover input[type=checkbox]:checked,body.admin-color-blue .components-popover input[type=radio]:checked,body.admin-color-blue .edit-post-header input[type=checkbox]:checked,body.admin-color-blue .edit-post-header input[type=radio]:checked,body.admin-color-blue .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-blue .edit-post-sidebar input[type=radio]:checked,body.admin-color-blue .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-blue .edit-post-text-editor input[type=radio]:checked,body.admin-color-blue .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-blue .edit-post-visual-editor input[type=radio]:checked,body.admin-color-blue .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-blue .editor-post-publish-panel input[type=radio]:checked{background:#82b4cb;border-color:#82b4cb}body.admin-color-light .components-modal__frame input[type=checkbox]:checked,body.admin-color-light .components-modal__frame input[type=radio]:checked,body.admin-color-light .components-popover input[type=checkbox]:checked,body.admin-color-light .components-popover input[type=radio]:checked,body.admin-color-light .edit-post-header input[type=checkbox]:checked,body.admin-color-light .edit-post-header input[type=radio]:checked,body.admin-color-light .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-light .edit-post-sidebar input[type=radio]:checked,body.admin-color-light .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-light .edit-post-text-editor input[type=radio]:checked,body.admin-color-light .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-light .edit-post-visual-editor input[type=radio]:checked,body.admin-color-light .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-light .editor-post-publish-panel input[type=radio]:checked{background:#11a0d2;border-color:#11a0d2}.components-modal__frame input[type=checkbox]:checked:focus,.components-modal__frame input[type=radio]:checked:focus,.components-popover input[type=checkbox]:checked:focus,.components-popover input[type=radio]:checked:focus,.edit-post-header input[type=checkbox]:checked:focus,.edit-post-header input[type=radio]:checked:focus,.edit-post-sidebar input[type=checkbox]:checked:focus,.edit-post-sidebar input[type=radio]:checked:focus,.edit-post-text-editor input[type=checkbox]:checked:focus,.edit-post-text-editor input[type=radio]:checked:focus,.edit-post-visual-editor input[type=checkbox]:checked:focus,.edit-post-visual-editor input[type=radio]:checked:focus,.editor-post-publish-panel input[type=checkbox]:checked:focus,.editor-post-publish-panel input[type=radio]:checked:focus{box-shadow:0 0 0 2px #555d66}.components-modal__frame input[type=checkbox],.components-popover input[type=checkbox],.edit-post-header input[type=checkbox],.edit-post-sidebar input[type=checkbox],.edit-post-text-editor input[type=checkbox],.edit-post-visual-editor input[type=checkbox],.editor-post-publish-panel input[type=checkbox]{border-radius:2px}.components-modal__frame input[type=checkbox]:checked:before,.components-modal__frame input[type=checkbox][aria-checked=mixed]:before,.components-popover input[type=checkbox]:checked:before,.components-popover input[type=checkbox][aria-checked=mixed]:before,.edit-post-header input[type=checkbox]:checked:before,.edit-post-header input[type=checkbox][aria-checked=mixed]:before,.edit-post-sidebar input[type=checkbox]:checked:before,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:before,.edit-post-text-editor input[type=checkbox]:checked:before,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:before,.edit-post-visual-editor input[type=checkbox]:checked:before,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:before,.editor-post-publish-panel input[type=checkbox]:checked:before,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:before{margin:-3px -5px;color:#fff}@media (min-width:782px){.components-modal__frame input[type=checkbox]:checked:before,.components-modal__frame input[type=checkbox][aria-checked=mixed]:before,.components-popover input[type=checkbox]:checked:before,.components-popover input[type=checkbox][aria-checked=mixed]:before,.edit-post-header input[type=checkbox]:checked:before,.edit-post-header input[type=checkbox][aria-checked=mixed]:before,.edit-post-sidebar input[type=checkbox]:checked:before,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:before,.edit-post-text-editor input[type=checkbox]:checked:before,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:before,.edit-post-visual-editor input[type=checkbox]:checked:before,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:before,.editor-post-publish-panel input[type=checkbox]:checked:before,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:before{margin:-4px -5px 0 0}}.components-modal__frame input[type=checkbox][aria-checked=mixed],.components-popover input[type=checkbox][aria-checked=mixed],.edit-post-header input[type=checkbox][aria-checked=mixed],.edit-post-sidebar input[type=checkbox][aria-checked=mixed],.edit-post-text-editor input[type=checkbox][aria-checked=mixed],.edit-post-visual-editor input[type=checkbox][aria-checked=mixed],.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#11a0d2;border-color:#11a0d2}body.admin-color-sunrise .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#c8b03c;border-color:#c8b03c}body.admin-color-ocean .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#a3b9a2;border-color:#a3b9a2}body.admin-color-midnight .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#77a6b9;border-color:#77a6b9}body.admin-color-ectoplasm .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#a7b656;border-color:#a7b656}body.admin-color-coffee .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#c2a68c;border-color:#c2a68c}body.admin-color-blue .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-blue .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-blue .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-blue .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-blue .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-blue .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-blue .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#82b4cb;border-color:#82b4cb}body.admin-color-light .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-light .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-light .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-light .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-light .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-light .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-light .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#11a0d2;border-color:#11a0d2}.components-modal__frame input[type=checkbox][aria-checked=mixed]:before,.components-popover input[type=checkbox][aria-checked=mixed]:before,.edit-post-header input[type=checkbox][aria-checked=mixed]:before,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:before,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:before,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:before,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:before{content:"\f460";float:right;display:inline-block;vertical-align:middle;width:16px;font:normal 30px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.components-modal__frame input[type=checkbox][aria-checked=mixed]:before,.components-popover input[type=checkbox][aria-checked=mixed]:before,.edit-post-header input[type=checkbox][aria-checked=mixed]:before,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:before,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:before,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:before,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:before{float:none;font-size:21px}}.components-modal__frame input[type=checkbox][aria-checked=mixed]:focus,.components-popover input[type=checkbox][aria-checked=mixed]:focus,.edit-post-header input[type=checkbox][aria-checked=mixed]:focus,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:focus,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:focus,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:focus,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:focus{box-shadow:0 0 0 2px #555d66}.components-modal__frame input[type=radio],.components-popover input[type=radio],.edit-post-header input[type=radio],.edit-post-sidebar input[type=radio],.edit-post-text-editor input[type=radio],.edit-post-visual-editor input[type=radio],.editor-post-publish-panel input[type=radio]{border-radius:50%}.components-modal__frame input[type=radio]:checked:before,.components-popover input[type=radio]:checked:before,.edit-post-header input[type=radio]:checked:before,.edit-post-sidebar input[type=radio]:checked:before,.edit-post-text-editor input[type=radio]:checked:before,.edit-post-visual-editor input[type=radio]:checked:before,.editor-post-publish-panel input[type=radio]:checked:before{width:6px;height:6px;margin:6px 6px 0 0;background-color:#fff}@media (min-width:782px){.components-modal__frame input[type=radio]:checked:before,.components-popover input[type=radio]:checked:before,.edit-post-header input[type=radio]:checked:before,.edit-post-sidebar input[type=radio]:checked:before,.edit-post-text-editor input[type=radio]:checked:before,.edit-post-visual-editor input[type=radio]:checked:before,.editor-post-publish-panel input[type=radio]:checked:before{margin:3px 3px 0 0}}.components-modal__frame input::-webkit-input-placeholder,.components-modal__frame textarea::-webkit-input-placeholder,.components-popover input::-webkit-input-placeholder,.components-popover textarea::-webkit-input-placeholder,.edit-post-header input::-webkit-input-placeholder,.edit-post-header textarea::-webkit-input-placeholder,.edit-post-sidebar input::-webkit-input-placeholder,.edit-post-sidebar textarea::-webkit-input-placeholder,.edit-post-text-editor input::-webkit-input-placeholder,.edit-post-text-editor textarea::-webkit-input-placeholder,.edit-post-visual-editor input::-webkit-input-placeholder,.edit-post-visual-editor textarea::-webkit-input-placeholder,.editor-post-publish-panel input::-webkit-input-placeholder,.editor-post-publish-panel textarea::-webkit-input-placeholder{color:rgba(14,28,46,.62)}.components-modal__frame input::-moz-placeholder,.components-modal__frame textarea::-moz-placeholder,.components-popover input::-moz-placeholder,.components-popover textarea::-moz-placeholder,.edit-post-header input::-moz-placeholder,.edit-post-header textarea::-moz-placeholder,.edit-post-sidebar input::-moz-placeholder,.edit-post-sidebar textarea::-moz-placeholder,.edit-post-text-editor input::-moz-placeholder,.edit-post-text-editor textarea::-moz-placeholder,.edit-post-visual-editor input::-moz-placeholder,.edit-post-visual-editor textarea::-moz-placeholder,.editor-post-publish-panel input::-moz-placeholder,.editor-post-publish-panel textarea::-moz-placeholder{opacity:1;color:rgba(14,28,46,.62)}.components-modal__frame input:-ms-input-placeholder,.components-modal__frame textarea:-ms-input-placeholder,.components-popover input:-ms-input-placeholder,.components-popover textarea:-ms-input-placeholder,.edit-post-header input:-ms-input-placeholder,.edit-post-header textarea:-ms-input-placeholder,.edit-post-sidebar input:-ms-input-placeholder,.edit-post-sidebar textarea:-ms-input-placeholder,.edit-post-text-editor input:-ms-input-placeholder,.edit-post-text-editor textarea:-ms-input-placeholder,.edit-post-visual-editor input:-ms-input-placeholder,.edit-post-visual-editor textarea:-ms-input-placeholder,.editor-post-publish-panel input:-ms-input-placeholder,.editor-post-publish-panel textarea:-ms-input-placeholder{color:rgba(14,28,46,.62)}.is-dark-theme .components-modal__frame input::-webkit-input-placeholder,.is-dark-theme .components-modal__frame textarea::-webkit-input-placeholder,.is-dark-theme .components-popover input::-webkit-input-placeholder,.is-dark-theme .components-popover textarea::-webkit-input-placeholder,.is-dark-theme .edit-post-header input::-webkit-input-placeholder,.is-dark-theme .edit-post-header textarea::-webkit-input-placeholder,.is-dark-theme .edit-post-sidebar input::-webkit-input-placeholder,.is-dark-theme .edit-post-sidebar textarea::-webkit-input-placeholder,.is-dark-theme .edit-post-text-editor input::-webkit-input-placeholder,.is-dark-theme .edit-post-text-editor textarea::-webkit-input-placeholder,.is-dark-theme .edit-post-visual-editor input::-webkit-input-placeholder,.is-dark-theme .edit-post-visual-editor textarea::-webkit-input-placeholder,.is-dark-theme .editor-post-publish-panel input::-webkit-input-placeholder,.is-dark-theme .editor-post-publish-panel textarea::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-modal__frame input::-moz-placeholder,.is-dark-theme .components-modal__frame textarea::-moz-placeholder,.is-dark-theme .components-popover input::-moz-placeholder,.is-dark-theme .components-popover textarea::-moz-placeholder,.is-dark-theme .edit-post-header input::-moz-placeholder,.is-dark-theme .edit-post-header textarea::-moz-placeholder,.is-dark-theme .edit-post-sidebar input::-moz-placeholder,.is-dark-theme .edit-post-sidebar textarea::-moz-placeholder,.is-dark-theme .edit-post-text-editor input::-moz-placeholder,.is-dark-theme .edit-post-text-editor textarea::-moz-placeholder,.is-dark-theme .edit-post-visual-editor input::-moz-placeholder,.is-dark-theme .edit-post-visual-editor textarea::-moz-placeholder,.is-dark-theme .editor-post-publish-panel input::-moz-placeholder,.is-dark-theme .editor-post-publish-panel textarea::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-modal__frame input:-ms-input-placeholder,.is-dark-theme .components-modal__frame textarea:-ms-input-placeholder,.is-dark-theme .components-popover input:-ms-input-placeholder,.is-dark-theme .components-popover textarea:-ms-input-placeholder,.is-dark-theme .edit-post-header input:-ms-input-placeholder,.is-dark-theme .edit-post-header textarea:-ms-input-placeholder,.is-dark-theme .edit-post-sidebar input:-ms-input-placeholder,.is-dark-theme .edit-post-sidebar textarea:-ms-input-placeholder,.is-dark-theme .edit-post-text-editor input:-ms-input-placeholder,.is-dark-theme .edit-post-text-editor textarea:-ms-input-placeholder,.is-dark-theme .edit-post-visual-editor input:-ms-input-placeholder,.is-dark-theme .edit-post-visual-editor textarea:-ms-input-placeholder,.is-dark-theme .editor-post-publish-panel input:-ms-input-placeholder,.is-dark-theme .editor-post-publish-panel textarea:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}@media (min-width:600px){.block-editor__container{position:absolute;top:0;left:0;bottom:0;right:0;min-height:calc(100vh - 46px)}}@media (min-width:782px){.block-editor__container{min-height:calc(100vh - 32px)}body.is-fullscreen-mode .block-editor__container{min-height:100vh}}.block-editor__container img{max-width:100%;height:auto}.block-editor__container iframe{width:100%}.block-editor__container .components-navigate-regions{height:100%}.wp-block{max-width:580px}.wp-block[data-align=wide]{max-width:1100px}.wp-block[data-align=full]{max-width:none} \ No newline at end of file diff --git a/wp-includes/css/dist/edit-post/style.css b/wp-includes/css/dist/edit-post/style.css new file mode 100644 index 0000000..23f5448 --- /dev/null +++ b/wp-includes/css/dist/edit-post/style.css @@ -0,0 +1,2087 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +@media (min-width: 782px) { + body.js.is-fullscreen-mode { + margin-top: -46px; + height: calc(100% + 46px); } } + @media (min-width: 782px) and (min-width: 782px) { + body.js.is-fullscreen-mode { + margin-top: -32px; + height: calc(100% + 32px); } } + +@media (min-width: 782px) { + body.js.is-fullscreen-mode #adminmenumain, + body.js.is-fullscreen-mode #wpadminbar { + display: none; } + body.js.is-fullscreen-mode #wpcontent, + body.js.is-fullscreen-mode #wpfooter { + margin-left: 0; } + body.js.is-fullscreen-mode .edit-post-header { + transform: translateY(-100%); + animation: edit-post-fullscreen-mode__slide-in-animation 0.1s forwards; } } + @media (min-width: 782px) and (prefers-reduced-motion: reduce) { + body.js.is-fullscreen-mode .edit-post-header { + animation-duration: 1ms; } } + +@keyframes edit-post-fullscreen-mode__slide-in-animation { + 100% { + transform: translateY(0%); } } + +.edit-post-header { + height: 56px; + background: #fff; + display: flex; + flex-wrap: wrap; + align-items: center; + max-width: 100vw; } + @media (min-width: 280px) { + .edit-post-header { + flex-wrap: nowrap; } } + .edit-post-header > .edit-post-header__settings { + order: 1; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .edit-post-header > .edit-post-header__settings { + order: initial; } } + +.edit-post-header__toolbar { + display: flex; + flex-grow: 1; + padding-left: 16px; } + +.edit-post-header__settings { + display: inline-flex; + align-items: center; + flex-wrap: wrap; + padding-right: 8px; } + +.edit-post-header .components-button.is-pressed { + color: #fff; + background: #555d66; } + +.edit-post-header .components-button.is-pressed:hover, .edit-post-header .components-button.is-pressed:focus { + box-shadow: 0 0 0 1px #555d66, inset 0 0 0 1px #fff !important; + color: #fff !important; + background: #555d66 !important; } + +.edit-post-header .components-button.editor-post-save-draft, .edit-post-header .components-button.editor-post-switch-to-draft, .edit-post-header .components-button.editor-post-preview, .edit-post-header .components-button.editor-post-publish-button, .edit-post-header .components-button.editor-post-publish-panel__toggle { + margin: 2px; + font-size: 13px; } + +.edit-post-header .components-button.editor-post-save-draft, .edit-post-header .components-button.editor-post-switch-to-draft { + padding: 0 5px; } + @media (min-width: 600px) { + .edit-post-header .components-button.editor-post-save-draft, .edit-post-header .components-button.editor-post-switch-to-draft { + padding: 0 12px; } } + +.edit-post-header .components-button.editor-post-preview, .edit-post-header .components-button.editor-post-publish-button, .edit-post-header .components-button.editor-post-publish-panel__toggle { + padding-left: 5px; + padding-right: 5px; } + @media (min-width: 600px) { + .edit-post-header .components-button.editor-post-preview, .edit-post-header .components-button.editor-post-publish-button, .edit-post-header .components-button.editor-post-publish-panel__toggle { + padding-left: 12px; + padding-right: 12px; } } + +@media (min-width: 782px) { + .edit-post-header .components-button.editor-post-preview { + margin: 0 3px 0 12px; } + .edit-post-header .components-button.editor-post-publish-button, .edit-post-header .components-button.editor-post-publish-panel__toggle { + margin: 0 12px 0 3px; } } + +.edit-post-fullscreen-mode-close.has-icon { + display: none; } + @media (min-width: 782px) { + .edit-post-fullscreen-mode-close.has-icon { + display: flex; + align-items: center; + align-self: stretch; + border: none; + background: #23282e; + color: #fff; + border-radius: 0; + height: auto; + width: 56px; } + .edit-post-fullscreen-mode-close.has-icon:hover { + background: #32373d !important; + color: #fff !important; + box-shadow: none !important; } + .edit-post-fullscreen-mode-close.has-icon:active { + color: #fff; } } + .edit-post-fullscreen-mode-close.has-icon svg { + margin-left: auto; + margin-right: auto; } + +.edit-post-header-toolbar { + display: inline-flex; + align-items: center; } + .edit-post-header-toolbar > .components-button { + display: none; } + @media (min-width: 600px) { + .edit-post-header-toolbar > .components-button { + display: inline-flex; } } + .edit-post-header-toolbar .block-editor-block-navigation, + .edit-post-header-toolbar .table-of-contents { + display: none; } + @media (min-width: 600px) { + .edit-post-header-toolbar .block-editor-block-navigation, + .edit-post-header-toolbar .table-of-contents { + display: flex; } } + +.edit-post-header-toolbar__block-toolbar { + position: absolute; + top: 57px; + left: 0; + right: 0; + background: #fff; + min-height: 37px; + border-bottom: 1px solid #e2e4e7; } + .edit-post-header-toolbar__block-toolbar:empty { + display: none; } + .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar { + border-top: none; + border-bottom: none; } + .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { + display: none; } + @media (min-width: 782px) { + .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { + display: block; + right: 280px; } } + @media (min-width: 1280px) { + .edit-post-header-toolbar__block-toolbar { + padding-left: 8px; + position: static; + left: auto; + right: auto; + background: none; + border-bottom: none; + min-height: auto; } + .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { + right: auto; } + .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar { + margin: -9px 0; } + .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar { + padding: 10px 4px 9px; } } + +.edit-post-more-menu { + margin-left: -4px; } + .edit-post-more-menu .components-button { + width: auto; + padding: 0 2px; } + @media (min-width: 600px) { + .edit-post-more-menu { + margin-left: 4px; } + .edit-post-more-menu .components-button { + padding: 0 4px; } } + .edit-post-more-menu .components-button svg { + transform: rotate(90deg); } + +.edit-post-more-menu__content .components-popover__content { + min-width: 260px; } + @media (min-width: 480px) { + .edit-post-more-menu__content .components-popover__content { + width: auto; + max-width: 480px; } } + .edit-post-more-menu__content .components-popover__content .components-dropdown-menu__menu { + padding: 0; } + +.components-popover.edit-post-more-menu__content { + z-index: 99998; } + +.edit-post-pinned-plugins { + display: none; } + @media (min-width: 600px) { + .edit-post-pinned-plugins { + display: flex; } } + .edit-post-pinned-plugins .components-button { + margin-left: 4px; } + .edit-post-pinned-plugins .components-button.is-pressed { + margin-left: 5px; } + .edit-post-pinned-plugins .components-button svg { + max-width: 24px; + max-height: 24px; } + .edit-post-pinned-plugins .components-button:not(.is-pressed) svg, + .edit-post-pinned-plugins .components-button:not(.is-pressed) svg * { + stroke: #555d66; + fill: #555d66; + stroke-width: 0; } + .edit-post-pinned-plugins .components-button.is-pressed svg, + .edit-post-pinned-plugins .components-button.is-pressed svg *, + .edit-post-pinned-plugins .components-button.is-pressed:hover svg, + .edit-post-pinned-plugins .components-button.is-pressed:hover svg * { + stroke: #fff !important; + fill: #fff !important; + stroke-width: 0; } + .edit-post-pinned-plugins .components-button:hover svg, + .edit-post-pinned-plugins .components-button:hover svg * { + stroke: #191e23 !important; + fill: #191e23 !important; + stroke-width: 0; } + +.edit-post-keyboard-shortcut-help-modal__section { + margin: 0 0 2rem 0; } + +.edit-post-keyboard-shortcut-help-modal__main-shortcuts .edit-post-keyboard-shortcut-help-modal__shortcut-list { + margin-top: -25px; } + +.edit-post-keyboard-shortcut-help-modal__section-title { + font-size: 0.9rem; + font-weight: 600; } + +.edit-post-keyboard-shortcut-help-modal__shortcut { + display: flex; + align-items: baseline; + padding: 0.6rem 0; + border-top: 1px solid #e2e4e7; + margin-bottom: 0; } + .edit-post-keyboard-shortcut-help-modal__shortcut:last-child { + border-bottom: 1px solid #e2e4e7; } + .edit-post-keyboard-shortcut-help-modal__shortcut:empty { + display: none; } + +.edit-post-keyboard-shortcut-help-modal__shortcut-term { + font-weight: 600; + margin: 0 0 0 1rem; + text-align: right; } + +.edit-post-keyboard-shortcut-help-modal__shortcut-description { + flex: 1; + margin: 0; + flex-basis: auto; } + +.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination { + display: block; + background: none; + margin: 0; + padding: 0; } + .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination + .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination { + margin-top: 10px; } + +.edit-post-keyboard-shortcut-help-modal__shortcut-key { + padding: 0.25rem 0.5rem; + border-radius: 8%; + margin: 0 0.2rem 0 0.2rem; } + .edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child { + margin: 0 0 0 0.2rem; } + +.edit-post-layout__metaboxes { + flex-shrink: 0; } + +.edit-post-layout__metaboxes:not(:empty) { + border-top: 1px solid #e2e4e7; + padding: 10px 0 10px; + clear: both; } + .edit-post-layout__metaboxes:not(:empty) .edit-post-meta-boxes-area { + margin: auto 20px; } + +.edit-post-layout .components-editor-notices__snackbar { + position: fixed; + right: 0; + bottom: 20px; + padding-left: 16px; + padding-right: 16px; } + +.edit-post-layout .components-editor-notices__snackbar { + /* Set left position when auto-fold is not on the body element. */ + left: 0; } + @media (min-width: 782px) { + .edit-post-layout .components-editor-notices__snackbar { + left: 160px; } } + +.auto-fold .edit-post-layout .components-editor-notices__snackbar { + /* Auto fold is when on smaller breakpoints, nav menu auto collapses. */ } + @media (min-width: 782px) { + .auto-fold .edit-post-layout .components-editor-notices__snackbar { + left: 36px; } } + @media (min-width: 961px) { + .auto-fold .edit-post-layout .components-editor-notices__snackbar { + left: 160px; } } + +/* Sidebar manually collapsed. */ +.folded .edit-post-layout .components-editor-notices__snackbar { + left: 0; } + @media (min-width: 782px) { + .folded .edit-post-layout .components-editor-notices__snackbar { + left: 36px; } } + +/* Mobile menu opened. */ +@media (max-width: 782px) { + .auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar { + left: 190px; } } + +/* In small screens with responsive menu expanded there is small white space. */ +@media (max-width: 600px) { + .auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar { + margin-left: -18px; } } + +body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar { + left: 0 !important; } + +.edit-post-layout .editor-post-publish-panel { + position: fixed; + z-index: 100001; + top: 46px; + bottom: 0; + right: 0; + left: 0; + overflow: auto; } + @media (min-width: 782px) { + .edit-post-layout .editor-post-publish-panel { + z-index: 99998; + top: 32px; + left: auto; + width: 280px; + border-left: 1px solid #e2e4e7; + transform: translateX(100%); + animation: edit-post-post-publish-panel__slide-in-animation 0.1s forwards; } } + @media (min-width: 782px) and (prefers-reduced-motion: reduce) { + .edit-post-layout .editor-post-publish-panel { + animation-duration: 1ms; } } + @media (min-width: 782px) { + body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel { + top: 0; } + .is-focusing-regions .edit-post-layout .editor-post-publish-panel { + transform: translateX(0%); } } + +@keyframes edit-post-post-publish-panel__slide-in-animation { + 100% { + transform: translateX(0%); } } + +.block-editor-editor-skeleton__sidebar > div { + height: 100%; } + +.edit-post-layout .editor-post-publish-panel__header-publish-button { + justify-content: center; } + +.edit-post-layout__toogle-publish-panel, +.edit-post-layout__toogle-sidebar-panel { + background-color: #fff; + padding: 10px 10px 10px 0; } + +.edit-post-layout__toogle-publish-panel-button, +.edit-post-layout__toogle-sidebar-panel-button { + width: auto; + height: auto; + display: block; + font-size: 14px; + font-weight: 600; + margin: 0 0 0 auto; + padding: 15px 23px 14px; + line-height: normal; + text-decoration: none; + outline: none; + background: #f1f1f1; + color: #11a0d2; } + +body.admin-color-sunrise .edit-post-layout__toogle-publish-panel-button, body.admin-color-sunrise .edit-post-layout__toogle-sidebar-panel-button { + color: #c8b03c; } + +body.admin-color-ocean .edit-post-layout__toogle-publish-panel-button, body.admin-color-ocean .edit-post-layout__toogle-sidebar-panel-button { + color: #a89d8a; } + +body.admin-color-midnight .edit-post-layout__toogle-publish-panel-button, body.admin-color-midnight .edit-post-layout__toogle-sidebar-panel-button { + color: #77a6b9; } + +body.admin-color-ectoplasm .edit-post-layout__toogle-publish-panel-button, body.admin-color-ectoplasm .edit-post-layout__toogle-sidebar-panel-button { + color: #c77430; } + +body.admin-color-coffee .edit-post-layout__toogle-publish-panel-button, body.admin-color-coffee .edit-post-layout__toogle-sidebar-panel-button { + color: #9fa47b; } + +body.admin-color-blue .edit-post-layout__toogle-publish-panel-button, body.admin-color-blue .edit-post-layout__toogle-sidebar-panel-button { + color: #d9ab59; } + +body.admin-color-light .edit-post-layout__toogle-publish-panel-button, body.admin-color-light .edit-post-layout__toogle-sidebar-panel-button { + color: #c75726; } + .edit-post-layout__toogle-publish-panel-button:focus, + .edit-post-layout__toogle-sidebar-panel-button:focus { + position: fixed; + top: auto; + right: 10px; + bottom: 10px; + left: auto; } + +.edit-post-layout__footer { + display: none; + z-index: 30; } + @media (min-width: 782px) { + .edit-post-layout__footer { + display: flex; + background: #fff; + height: 24px; + padding: 0 8px; + align-items: center; + font-size: 13px; } } + +@media (min-width: 600px) { + .edit-post-manage-blocks-modal { + height: calc(100% - 56px - 56px); } } + +.edit-post-manage-blocks-modal .components-modal__content { + padding-bottom: 0; + display: flex; + flex-direction: column; } + +.edit-post-manage-blocks-modal .components-modal__header { + flex-shrink: 0; + margin-bottom: 0; } + +.edit-post-manage-blocks-modal__content { + display: flex; + flex-direction: column; + flex: 0 1 100%; + min-height: 0; } + +.edit-post-manage-blocks-modal__no-results { + font-style: italic; + padding: 24px 0; + text-align: center; } + +.edit-post-manage-blocks-modal__search { + margin: 16px 0; } + .edit-post-manage-blocks-modal__search .components-base-control__field { + margin-bottom: 0; } + .edit-post-manage-blocks-modal__search .components-base-control__label { + margin-top: -4px; } + .edit-post-manage-blocks-modal__search input[type="search"].components-text-control__input { + padding: 12px; + border-radius: 4px; } + +.edit-post-manage-blocks-modal__disabled-blocks-count { + border-top: 1px solid #e2e4e7; + margin-left: -24px; + margin-right: -24px; + padding-top: 0.6rem; + padding-bottom: 0.6rem; + padding-left: 24px; + padding-right: 24px; + background-color: #f3f4f5; } + +.edit-post-manage-blocks-modal__category { + margin: 0 0 2rem 0; } + +.edit-post-manage-blocks-modal__category-title { + position: -webkit-sticky; + position: sticky; + top: 0; + padding: 16px 0; + background-color: #fff; + z-index: 1; } + .edit-post-manage-blocks-modal__category-title .components-base-control__field { + margin-bottom: 0; } + .edit-post-manage-blocks-modal__category-title .components-checkbox-control__label { + font-size: 0.9rem; + font-weight: 600; } + +.edit-post-manage-blocks-modal__show-all { + margin-right: 8px; } + +.edit-post-manage-blocks-modal__checklist { + margin-top: 0; } + +.edit-post-manage-blocks-modal__checklist-item { + margin-bottom: 0; + padding-left: 16px; + border-top: 1px solid #e2e4e7; } + .edit-post-manage-blocks-modal__checklist-item:last-child { + border-bottom: 1px solid #e2e4e7; } + .edit-post-manage-blocks-modal__checklist-item .components-base-control__field { + align-items: center; + display: flex; + margin: 0; } + .components-modal__content .edit-post-manage-blocks-modal__checklist-item.components-checkbox-control__input-container { + margin: 0 8px; } + .edit-post-manage-blocks-modal__checklist-item .components-checkbox-control__label { + display: flex; + align-items: center; + justify-content: space-between; + flex-grow: 1; + padding: 0.6rem 0 0.6rem 10px; } + .edit-post-manage-blocks-modal__checklist-item .block-editor-block-icon { + margin-right: 10px; + fill: #555d66; } + +.edit-post-manage-blocks-modal__results { + height: 100%; + overflow: auto; + margin-left: -24px; + margin-right: -24px; + padding-left: 24px; + padding-right: 24px; + border-top: 1px solid #e2e4e7; } + +.edit-post-meta-boxes-area { + position: relative; + /** + * The wordpress default for most meta-box elements is content-box. Some + * elements such as textarea and input are set to border-box in forms.css. + * These elements therefore specifically set back to border-box here, while + * other elements (such as .button) are unaffected by Gutenberg's style + * because of their higher specificity. + */ + /* Match width and positioning of the meta boxes. Override default styles. */ + /* Override Default meta box stylings */ } + .edit-post-meta-boxes-area__container, + .edit-post-meta-boxes-area .inside { + box-sizing: content-box; } + .edit-post-meta-boxes-area textarea, + .edit-post-meta-boxes-area input { + box-sizing: border-box; } + .edit-post-meta-boxes-area #poststuff { + margin: 0 auto; + padding-top: 0; + min-width: auto; } + .edit-post-meta-boxes-area #poststuff h3.hndle, + .edit-post-meta-boxes-area #poststuff .stuffbox > h3, + .edit-post-meta-boxes-area #poststuff h2.hndle { + /* WordPress selectors yolo */ + border-bottom: 1px solid #e2e4e7; + box-sizing: border-box; + color: inherit; + font-weight: 600; + outline: none; + padding: 15px; + position: relative; + width: 100%; } + .edit-post-meta-boxes-area .postbox { + border: 0; + color: inherit; + margin-bottom: 0; } + .edit-post-meta-boxes-area .postbox > .inside { + border-bottom: 1px solid #e2e4e7; + color: inherit; + padding: 0 14px 14px; + margin: 0; } + .edit-post-meta-boxes-area .postbox .handlediv { + height: 44px; + width: 44px; } + .edit-post-meta-boxes-area.is-loading::before { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + content: ""; + background: transparent; + z-index: 1; } + .edit-post-meta-boxes-area .components-spinner { + position: absolute; + top: 10px; + right: 20px; + z-index: 5; } + .edit-post-meta-boxes-area .is-hidden { + display: none; } + .edit-post-meta-boxes-area .metabox-location-side .postbox input[type="checkbox"] { + border: 1px solid #6c7781; } + .edit-post-meta-boxes-area .metabox-location-side .postbox input[type="checkbox"]:checked { + background: #fff; + border-color: #6c7781; } + .edit-post-meta-boxes-area .metabox-location-side .postbox input[type="checkbox"]::before { + margin: -3px -4px; } + +.edit-post-meta-boxes-area__clear { + clear: both; } + +.edit-post-sidebar { + background: #fff; + color: #555d66; + overflow: visible; } + @media (min-width: 600px) { + .edit-post-sidebar { + z-index: auto; + height: 100%; + overflow: auto; + -webkit-overflow-scrolling: touch; } } + @media (min-width: 782px) { + .edit-post-sidebar { + width: 280px; } } + .edit-post-sidebar > .components-panel { + border-left: none; + border-right: none; + overflow: auto; + -webkit-overflow-scrolling: touch; + height: auto; + max-height: calc(100vh - 96px); + margin-top: -1px; + margin-bottom: -1px; + position: relative; } + @media (min-width: 600px) { + .edit-post-sidebar > .components-panel { + overflow: visible; + height: auto; + max-height: none; } } + .edit-post-sidebar > .components-panel .components-panel__header { + position: fixed; + z-index: 1; + top: 0; + left: 0; + right: 0; + height: 50px; } + @media (min-width: 600px) { + .edit-post-sidebar > .components-panel .components-panel__header { + position: inherit; + top: auto; + left: auto; + right: auto; } } + .edit-post-sidebar p { + margin-top: 0; } + .edit-post-sidebar h2, + .edit-post-sidebar h3 { + font-size: 13px; + color: #555d66; + margin-bottom: 1.5em; } + .edit-post-sidebar hr { + border-top: none; + border-bottom: 1px solid #e2e4e7; + margin: 1.5em 0; } + .edit-post-sidebar div.components-toolbar { + box-shadow: none; + margin-bottom: 1.5em; } + .edit-post-sidebar div.components-toolbar:last-child { + margin-bottom: 0; } + .edit-post-sidebar p + div.components-toolbar { + margin-top: -1em; } + .edit-post-sidebar .block-editor-skip-to-selected-block:focus { + top: auto; + right: 10px; + bottom: 10px; + left: auto; } + +/* Text Editor specific */ +.components-panel__header.edit-post-sidebar__header { + background: #fff; + padding-right: 8px; } + .components-panel__header.edit-post-sidebar__header .edit-post-sidebar__title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; } + @media (min-width: 782px) { + .components-panel__header.edit-post-sidebar__header { + display: none; } } + +.components-panel__header.edit-post-sidebar__panel-tabs { + justify-content: flex-start; + padding-left: 0; + padding-right: 4px; + border-top: 0; + margin-top: 0; } + .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon { + display: none; + margin-left: auto; } + @media (min-width: 782px) { + .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon { + display: flex; } } + +.edit-post-sidebar__panel-tab { + background: transparent; + border: none; + border-radius: 0; + box-shadow: none; + cursor: pointer; + height: 50px; + padding: 3px 15px; + margin-left: 0; + font-weight: 400; + outline-offset: -1px; + transition: box-shadow 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .edit-post-sidebar__panel-tab { + transition-duration: 0s; } } + .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #007cba; + font-weight: 600; + position: relative; } + body.admin-color-sunrise .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #837425; } + body.admin-color-ocean .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #5e7d5e; } + body.admin-color-midnight .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #497b8d; } + body.admin-color-ectoplasm .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #523f6d; } + body.admin-color-coffee .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #59524c; } + body.admin-color-blue .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #417e9B; } + body.admin-color-light .edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #007cba; } + .edit-post-sidebar__panel-tab.is-active::before { + content: ""; + position: absolute; + top: 0; + bottom: 1px; + right: 0; + left: 0; + border-bottom: 3px solid transparent; } + .edit-post-sidebar__panel-tab:focus:not(:disabled) { + color: #191e23; + outline-offset: -1px; + outline: 1px dotted #555d66; + box-shadow: none; } + +.components-panel__body.is-opened.edit-post-last-revision__panel { + padding: 0; } + +.editor-post-last-revision__title { + padding: 13px 16px; } + +.editor-post-author__select { + margin: -5px 0; + width: 100%; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .editor-post-author__select { + width: auto; } } + +.edit-post-post-link__link-post-name { + font-weight: 600; } + +.edit-post-post-link__preview-label { + margin: 0; } + +.edit-post-post-link__link { + text-align: left; + word-wrap: break-word; + display: block; } + +/* rtl:begin:ignore */ +.edit-post-post-link__preview-link-container { + direction: ltr; } + +/* rtl:end:ignore */ +.edit-post-post-schedule { + width: 100%; + position: relative; } + +.components-button.edit-post-post-schedule__toggle { + text-align: right; } + +.editor-post-slug__input { + margin: -5px 0; + padding: 2px; } + +.edit-post-post-status .edit-post-post-publish-dropdown__switch-to-draft { + margin-top: 15px; + width: 100%; + text-align: center; } + +.edit-post-post-visibility { + width: 100%; } + +.edit-post-post-visibility__dialog .components-popover__content { + padding: 10px; } + @media (min-width: 782px) { + .edit-post-post-visibility__dialog .components-popover__content { + width: 257px; } } + +.edit-post-post-visibility__dialog-legend { + font-weight: 600; } + +.edit-post-post-visibility__choice { + margin: 10px 0; } + +.edit-post-post-visibility__dialog-radio, +.edit-post-post-visibility__dialog-label { + vertical-align: top; } + +.edit-post-post-visibility__dialog-password-input { + width: calc(100% - 20px); + margin-left: 20px; } + +.edit-post-post-visibility__dialog-info { + color: #7e8993; + padding-left: 20px; + font-style: italic; + margin: 4px 0 0; + line-height: 1.4; } + +.components-panel__header.edit-post-sidebar__panel-tabs { + justify-content: flex-start; + padding-left: 0; + padding-right: 4px; + border-top: 0; } + .components-panel__header.edit-post-sidebar__panel-tabs ul { + display: flex; } + .components-panel__header.edit-post-sidebar__panel-tabs li { + margin: 0; } + +.components-button.edit-post-sidebar__panel-tab { + background: transparent; + border: none; + box-shadow: none; + cursor: pointer; + display: inline-block; + padding: 3px 15px; + margin-left: 0; + font-weight: 400; + color: #191e23; + outline-offset: -1px; + transition: box-shadow 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .components-button.edit-post-sidebar__panel-tab { + transition-duration: 0s; } } + .components-button.edit-post-sidebar__panel-tab::after { + content: attr(data-label); + display: block; + font-weight: 600; + height: 0; + overflow: hidden; + speak: none; + visibility: hidden; } + .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #007cba; + font-weight: 600; + position: relative; } + body.admin-color-sunrise .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #837425; } + body.admin-color-ocean .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #5e7d5e; } + body.admin-color-midnight .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #497b8d; } + body.admin-color-ectoplasm .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #523f6d; } + body.admin-color-coffee .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #59524c; } + body.admin-color-blue .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #417e9B; } + body.admin-color-light .components-button.edit-post-sidebar__panel-tab.is-active { + box-shadow: inset 0 -3px #007cba; } + .components-button.edit-post-sidebar__panel-tab.is-active::before { + content: ""; + position: absolute; + top: 0; + bottom: 1px; + right: 0; + left: 0; + border-bottom: 3px solid transparent; } + .components-button.edit-post-sidebar__panel-tab:focus { + background-color: transparent; + color: #191e23; + outline-offset: -1px; + outline: 1px dotted #555d66; } + +/* Text Editor specific */ +.components-panel__header.edit-post-sidebar-header__small { + background: #fff; + padding-right: 4px; } + .components-panel__header.edit-post-sidebar-header__small .edit-post-sidebar__title { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; } + @media (min-width: 782px) { + .components-panel__header.edit-post-sidebar-header__small { + display: none; } } + +.components-panel__header.edit-post-sidebar-header { + padding-right: 4px; + background: #f3f4f5; } + .components-panel__header.edit-post-sidebar-header .components-button.has-icon { + display: none; + margin-left: auto; } + .components-panel__header.edit-post-sidebar-header .components-button.has-icon ~ .components-button { + margin-left: 0; } + @media (min-width: 782px) { + .components-panel__header.edit-post-sidebar-header .components-button.has-icon { + display: flex; } } + +.edit-post-text-editor { + position: relative; + width: 100%; + padding-top: 44px; } + .edit-post-text-editor .editor-post-title__block textarea { + border: 1px solid #e2e4e7; + margin-bottom: 4px; + padding: 14px; } + .edit-post-text-editor .editor-post-title__block textarea:focus { + border: 1px solid #e2e4e7; } + .edit-post-text-editor .editor-post-title__block:not(.is-focus-mode):not(.has-fixed-toolbar):not(.is-selected) .editor-post-title__input:hover, + .edit-post-text-editor .editor-post-title__block:not(.is-focus-mode):not(.has-fixed-toolbar).is-selected .editor-post-title__input { + box-shadow: none; + border-left-width: 1px; } + .edit-post-text-editor .editor-post-title__block textarea:hover, + .edit-post-text-editor .editor-post-title__block.is-selected textarea { + box-shadow: 0 0 0 1px #e2e4e7; } + .edit-post-text-editor .editor-post-permalink { + margin-top: -6px; + box-shadow: none; + border: none; + outline: 1px solid #b5bcc2; } + @media (min-width: 600px) { + .edit-post-text-editor .editor-post-title, + .edit-post-text-editor .editor-post-title__block { + padding: 0; } } + +.edit-post-text-editor__toolbar { + position: absolute; + top: 8px; + left: 0; + right: 0; + height: 36px; + line-height: 36px; + padding: 0 8px 0 16px; + display: flex; } + .edit-post-text-editor__toolbar h2 { + margin: 0 auto 0 0; + font-size: 13px; + color: #555d66; } + .edit-post-text-editor__toolbar .components-button svg { + order: 1; } + +.edit-post-text-editor__body { + max-width: calc(100% - 32px); + margin-left: 16px; + margin-right: 16px; + padding-top: 40px; } + @media (min-width: 600px) { + .edit-post-text-editor__body { + max-width: 580px; + margin-left: auto; + margin-right: auto; } } + +.edit-post-visual-editor { + position: relative; + padding-top: 50px; + flex: 1 1 auto; } + .edit-post-visual-editor .components-button { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } + @supports ((position: -webkit-sticky) or (position: sticky)) { + .edit-post-visual-editor { + flex-basis: 100%; } } + +.edit-post-visual-editor > .block-editor__typewriter, +.edit-post-visual-editor > .block-editor__typewriter > div, +.edit-post-visual-editor > .block-editor__typewriter > div > .block-editor-writing-flow, +.edit-post-visual-editor > .block-editor__typewriter > div > .block-editor-writing-flow > .block-editor-writing-flow__click-redirect { + height: 100%; } + +.edit-post-visual-editor .block-editor-writing-flow__click-redirect { + min-height: 40vh; + width: 100%; } + +.has-metaboxes .edit-post-visual-editor .block-editor-writing-flow__click-redirect { + height: 0; } + +.edit-post-visual-editor .block-editor-block-list__block { + margin-left: auto; + margin-right: auto; } + +@media (min-width: 600px) { + .editor-post-title { + padding-left: 58px; + padding-right: 58px; } } + +.edit-post-visual-editor .editor-post-title__block { + margin-left: auto; + margin-right: auto; + margin-bottom: 32px; } + .edit-post-visual-editor .editor-post-title__block > div { + margin-left: 0; + margin-right: 0; } + @media (min-width: 600px) { + .edit-post-visual-editor .editor-post-title__block > div { + margin-left: -16px; + margin-right: -16px; } } + +.edit-post-visual-editor .block-editor-block-list__layout > .block-editor-block-list__block[data-align="left"]:first-child, +.edit-post-visual-editor .block-editor-block-list__layout > .block-editor-block-list__block[data-align="right"]:first-child { + margin-top: 34px; } + +.edit-post-options-modal__section { + margin: 0 0 2rem 0; } + +.edit-post-options-modal__section-title { + font-size: 0.9rem; + font-weight: 600; } + +.edit-post-options-modal__option { + border-top: 1px solid #e2e4e7; } + .edit-post-options-modal__option:last-child { + border-bottom: 1px solid #e2e4e7; } + .edit-post-options-modal__option .components-base-control__field { + align-items: center; + display: flex; + margin: 0; } + .edit-post-options-modal__option .components-checkbox-control__label { + flex-grow: 1; + padding: 0.6rem 0 0.6rem 10px; } + +.edit-post-options-modal__custom-fields-confirmation-message, .edit-post-options-modal__custom-fields-confirmation-button { + margin: 0 0 0.6rem 48px; } + @media (min-width: 782px) { + .edit-post-options-modal__custom-fields-confirmation-message, .edit-post-options-modal__custom-fields-confirmation-button { + margin-left: 38px; } } + @media (min-width: 600px) { + .edit-post-options-modal__custom-fields-confirmation-message, .edit-post-options-modal__custom-fields-confirmation-button { + max-width: 300px; } } + +.edit-post-welcome-guide__page { + display: flex; + flex-direction: column; + justify-content: center; + position: relative; } + @media (min-width: 600px) { + .edit-post-welcome-guide__page { + min-height: 300px; + padding-left: 344px; } } + +.edit-post-welcome-guide__heading { + font-family: "Noto Serif", serif; + font-size: 21px; + line-height: 1.4; + margin: 8px 0; } + +.edit-post-welcome-guide__image { + background: #66c6e4; + border-radius: 4px; + height: 200px; + margin: 8px 0; } + @media (min-width: 600px) { + .edit-post-welcome-guide__image { + position: absolute; + left: 0; + top: 50%; + height: 300px; + width: 320px; + margin-top: -150px; } } + +.edit-post-welcome-guide__text { + font-size: 16px; + line-height: 1.4; + margin: 8px 0; } + +.edit-post-welcome-guide__inserter-icon { + margin: 0 4px; + position: relative; + top: 4px; } + +@media (min-width: 600px) { + .edit-post-welcome-guide { + width: 600px; } } + +/** + * Animations + */ +@keyframes edit-post__fade-in-animation { + from { + opacity: 0; } + to { + opacity: 1; } } + +html.wp-toolbar { + background: #fff; } + +body.block-editor-page { + background: #fff; + /* We hide legacy notices in Gutenberg Based Pages, because they were not designed in a way that scaled well. + Plugins can use Gutenberg notices if they need to pass on information to the user when they are editing. */ } + body.block-editor-page #wpcontent { + padding-left: 0; } + body.block-editor-page #wpbody-content { + padding-bottom: 0; } + body.block-editor-page #wpbody-content > div:not(.block-editor):not(#screen-meta) { + display: none; } + body.block-editor-page #wpfooter { + display: none; } + body.block-editor-page .a11y-speak-region { + left: -1px; + top: -1px; } + body.block-editor-page ul#adminmenu a.wp-has-current-submenu::after, + body.block-editor-page ul#adminmenu > li.current > a.current::after { + border-right-color: #fff; } + body.block-editor-page .media-frame select.attachment-filters:last-of-type { + width: auto; + max-width: 100%; } + +.edit-post-header, +.edit-post-visual-editor, +.edit-post-text-editor, +.edit-post-sidebar, +.editor-post-publish-panel, +.components-popover, +.components-modal__frame { + box-sizing: border-box; } + .edit-post-header *, + .edit-post-header *::before, + .edit-post-header *::after, + .edit-post-visual-editor *, + .edit-post-visual-editor *::before, + .edit-post-visual-editor *::after, + .edit-post-text-editor *, + .edit-post-text-editor *::before, + .edit-post-text-editor *::after, + .edit-post-sidebar *, + .edit-post-sidebar *::before, + .edit-post-sidebar *::after, + .editor-post-publish-panel *, + .editor-post-publish-panel *::before, + .editor-post-publish-panel *::after, + .components-popover *, + .components-popover *::before, + .components-popover *::after, + .components-modal__frame *, + .components-modal__frame *::before, + .components-modal__frame *::after { + box-sizing: inherit; } + .edit-post-header .input-control, + .edit-post-header input[type="text"], + .edit-post-header input[type="search"], + .edit-post-header input[type="radio"], + .edit-post-header input[type="tel"], + .edit-post-header input[type="time"], + .edit-post-header input[type="url"], + .edit-post-header input[type="week"], + .edit-post-header input[type="password"], + .edit-post-header input[type="checkbox"], + .edit-post-header input[type="color"], + .edit-post-header input[type="date"], + .edit-post-header input[type="datetime"], + .edit-post-header input[type="datetime-local"], + .edit-post-header input[type="email"], + .edit-post-header input[type="month"], + .edit-post-header input[type="number"], + .edit-post-header select, + .edit-post-header textarea, + .edit-post-visual-editor .input-control, + .edit-post-visual-editor input[type="text"], + .edit-post-visual-editor input[type="search"], + .edit-post-visual-editor input[type="radio"], + .edit-post-visual-editor input[type="tel"], + .edit-post-visual-editor input[type="time"], + .edit-post-visual-editor input[type="url"], + .edit-post-visual-editor input[type="week"], + .edit-post-visual-editor input[type="password"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-visual-editor input[type="color"], + .edit-post-visual-editor input[type="date"], + .edit-post-visual-editor input[type="datetime"], + .edit-post-visual-editor input[type="datetime-local"], + .edit-post-visual-editor input[type="email"], + .edit-post-visual-editor input[type="month"], + .edit-post-visual-editor input[type="number"], + .edit-post-visual-editor select, + .edit-post-visual-editor textarea, + .edit-post-text-editor .input-control, + .edit-post-text-editor input[type="text"], + .edit-post-text-editor input[type="search"], + .edit-post-text-editor input[type="radio"], + .edit-post-text-editor input[type="tel"], + .edit-post-text-editor input[type="time"], + .edit-post-text-editor input[type="url"], + .edit-post-text-editor input[type="week"], + .edit-post-text-editor input[type="password"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-text-editor input[type="color"], + .edit-post-text-editor input[type="date"], + .edit-post-text-editor input[type="datetime"], + .edit-post-text-editor input[type="datetime-local"], + .edit-post-text-editor input[type="email"], + .edit-post-text-editor input[type="month"], + .edit-post-text-editor input[type="number"], + .edit-post-text-editor select, + .edit-post-text-editor textarea, + .edit-post-sidebar .input-control, + .edit-post-sidebar input[type="text"], + .edit-post-sidebar input[type="search"], + .edit-post-sidebar input[type="radio"], + .edit-post-sidebar input[type="tel"], + .edit-post-sidebar input[type="time"], + .edit-post-sidebar input[type="url"], + .edit-post-sidebar input[type="week"], + .edit-post-sidebar input[type="password"], + .edit-post-sidebar input[type="checkbox"], + .edit-post-sidebar input[type="color"], + .edit-post-sidebar input[type="date"], + .edit-post-sidebar input[type="datetime"], + .edit-post-sidebar input[type="datetime-local"], + .edit-post-sidebar input[type="email"], + .edit-post-sidebar input[type="month"], + .edit-post-sidebar input[type="number"], + .edit-post-sidebar select, + .edit-post-sidebar textarea, + .editor-post-publish-panel .input-control, + .editor-post-publish-panel input[type="text"], + .editor-post-publish-panel input[type="search"], + .editor-post-publish-panel input[type="radio"], + .editor-post-publish-panel input[type="tel"], + .editor-post-publish-panel input[type="time"], + .editor-post-publish-panel input[type="url"], + .editor-post-publish-panel input[type="week"], + .editor-post-publish-panel input[type="password"], + .editor-post-publish-panel input[type="checkbox"], + .editor-post-publish-panel input[type="color"], + .editor-post-publish-panel input[type="date"], + .editor-post-publish-panel input[type="datetime"], + .editor-post-publish-panel input[type="datetime-local"], + .editor-post-publish-panel input[type="email"], + .editor-post-publish-panel input[type="month"], + .editor-post-publish-panel input[type="number"], + .editor-post-publish-panel select, + .editor-post-publish-panel textarea, + .components-popover .input-control, + .components-popover input[type="text"], + .components-popover input[type="search"], + .components-popover input[type="radio"], + .components-popover input[type="tel"], + .components-popover input[type="time"], + .components-popover input[type="url"], + .components-popover input[type="week"], + .components-popover input[type="password"], + .components-popover input[type="checkbox"], + .components-popover input[type="color"], + .components-popover input[type="date"], + .components-popover input[type="datetime"], + .components-popover input[type="datetime-local"], + .components-popover input[type="email"], + .components-popover input[type="month"], + .components-popover input[type="number"], + .components-popover select, + .components-popover textarea, + .components-modal__frame .input-control, + .components-modal__frame input[type="text"], + .components-modal__frame input[type="search"], + .components-modal__frame input[type="radio"], + .components-modal__frame input[type="tel"], + .components-modal__frame input[type="time"], + .components-modal__frame input[type="url"], + .components-modal__frame input[type="week"], + .components-modal__frame input[type="password"], + .components-modal__frame input[type="checkbox"], + .components-modal__frame input[type="color"], + .components-modal__frame input[type="date"], + .components-modal__frame input[type="datetime"], + .components-modal__frame input[type="datetime-local"], + .components-modal__frame input[type="email"], + .components-modal__frame input[type="month"], + .components-modal__frame input[type="number"], + .components-modal__frame select, + .components-modal__frame textarea { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + padding: 6px 8px; + box-shadow: 0 0 0 transparent; + transition: box-shadow 0.1s linear; + border-radius: 4px; + border: 1px solid #7e8993; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px; + /* Override core line-height. To be reviewed. */ + line-height: normal; } + @media (prefers-reduced-motion: reduce) { + .edit-post-header .input-control, + .edit-post-header input[type="text"], + .edit-post-header input[type="search"], + .edit-post-header input[type="radio"], + .edit-post-header input[type="tel"], + .edit-post-header input[type="time"], + .edit-post-header input[type="url"], + .edit-post-header input[type="week"], + .edit-post-header input[type="password"], + .edit-post-header input[type="checkbox"], + .edit-post-header input[type="color"], + .edit-post-header input[type="date"], + .edit-post-header input[type="datetime"], + .edit-post-header input[type="datetime-local"], + .edit-post-header input[type="email"], + .edit-post-header input[type="month"], + .edit-post-header input[type="number"], + .edit-post-header select, + .edit-post-header textarea, + .edit-post-visual-editor .input-control, + .edit-post-visual-editor input[type="text"], + .edit-post-visual-editor input[type="search"], + .edit-post-visual-editor input[type="radio"], + .edit-post-visual-editor input[type="tel"], + .edit-post-visual-editor input[type="time"], + .edit-post-visual-editor input[type="url"], + .edit-post-visual-editor input[type="week"], + .edit-post-visual-editor input[type="password"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-visual-editor input[type="color"], + .edit-post-visual-editor input[type="date"], + .edit-post-visual-editor input[type="datetime"], + .edit-post-visual-editor input[type="datetime-local"], + .edit-post-visual-editor input[type="email"], + .edit-post-visual-editor input[type="month"], + .edit-post-visual-editor input[type="number"], + .edit-post-visual-editor select, + .edit-post-visual-editor textarea, + .edit-post-text-editor .input-control, + .edit-post-text-editor input[type="text"], + .edit-post-text-editor input[type="search"], + .edit-post-text-editor input[type="radio"], + .edit-post-text-editor input[type="tel"], + .edit-post-text-editor input[type="time"], + .edit-post-text-editor input[type="url"], + .edit-post-text-editor input[type="week"], + .edit-post-text-editor input[type="password"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-text-editor input[type="color"], + .edit-post-text-editor input[type="date"], + .edit-post-text-editor input[type="datetime"], + .edit-post-text-editor input[type="datetime-local"], + .edit-post-text-editor input[type="email"], + .edit-post-text-editor input[type="month"], + .edit-post-text-editor input[type="number"], + .edit-post-text-editor select, + .edit-post-text-editor textarea, + .edit-post-sidebar .input-control, + .edit-post-sidebar input[type="text"], + .edit-post-sidebar input[type="search"], + .edit-post-sidebar input[type="radio"], + .edit-post-sidebar input[type="tel"], + .edit-post-sidebar input[type="time"], + .edit-post-sidebar input[type="url"], + .edit-post-sidebar input[type="week"], + .edit-post-sidebar input[type="password"], + .edit-post-sidebar input[type="checkbox"], + .edit-post-sidebar input[type="color"], + .edit-post-sidebar input[type="date"], + .edit-post-sidebar input[type="datetime"], + .edit-post-sidebar input[type="datetime-local"], + .edit-post-sidebar input[type="email"], + .edit-post-sidebar input[type="month"], + .edit-post-sidebar input[type="number"], + .edit-post-sidebar select, + .edit-post-sidebar textarea, + .editor-post-publish-panel .input-control, + .editor-post-publish-panel input[type="text"], + .editor-post-publish-panel input[type="search"], + .editor-post-publish-panel input[type="radio"], + .editor-post-publish-panel input[type="tel"], + .editor-post-publish-panel input[type="time"], + .editor-post-publish-panel input[type="url"], + .editor-post-publish-panel input[type="week"], + .editor-post-publish-panel input[type="password"], + .editor-post-publish-panel input[type="checkbox"], + .editor-post-publish-panel input[type="color"], + .editor-post-publish-panel input[type="date"], + .editor-post-publish-panel input[type="datetime"], + .editor-post-publish-panel input[type="datetime-local"], + .editor-post-publish-panel input[type="email"], + .editor-post-publish-panel input[type="month"], + .editor-post-publish-panel input[type="number"], + .editor-post-publish-panel select, + .editor-post-publish-panel textarea, + .components-popover .input-control, + .components-popover input[type="text"], + .components-popover input[type="search"], + .components-popover input[type="radio"], + .components-popover input[type="tel"], + .components-popover input[type="time"], + .components-popover input[type="url"], + .components-popover input[type="week"], + .components-popover input[type="password"], + .components-popover input[type="checkbox"], + .components-popover input[type="color"], + .components-popover input[type="date"], + .components-popover input[type="datetime"], + .components-popover input[type="datetime-local"], + .components-popover input[type="email"], + .components-popover input[type="month"], + .components-popover input[type="number"], + .components-popover select, + .components-popover textarea, + .components-modal__frame .input-control, + .components-modal__frame input[type="text"], + .components-modal__frame input[type="search"], + .components-modal__frame input[type="radio"], + .components-modal__frame input[type="tel"], + .components-modal__frame input[type="time"], + .components-modal__frame input[type="url"], + .components-modal__frame input[type="week"], + .components-modal__frame input[type="password"], + .components-modal__frame input[type="checkbox"], + .components-modal__frame input[type="color"], + .components-modal__frame input[type="date"], + .components-modal__frame input[type="datetime"], + .components-modal__frame input[type="datetime-local"], + .components-modal__frame input[type="email"], + .components-modal__frame input[type="month"], + .components-modal__frame input[type="number"], + .components-modal__frame select, + .components-modal__frame textarea { + transition-duration: 0s; } } + @media (min-width: 600px) { + .edit-post-header .input-control, + .edit-post-header input[type="text"], + .edit-post-header input[type="search"], + .edit-post-header input[type="radio"], + .edit-post-header input[type="tel"], + .edit-post-header input[type="time"], + .edit-post-header input[type="url"], + .edit-post-header input[type="week"], + .edit-post-header input[type="password"], + .edit-post-header input[type="checkbox"], + .edit-post-header input[type="color"], + .edit-post-header input[type="date"], + .edit-post-header input[type="datetime"], + .edit-post-header input[type="datetime-local"], + .edit-post-header input[type="email"], + .edit-post-header input[type="month"], + .edit-post-header input[type="number"], + .edit-post-header select, + .edit-post-header textarea, + .edit-post-visual-editor .input-control, + .edit-post-visual-editor input[type="text"], + .edit-post-visual-editor input[type="search"], + .edit-post-visual-editor input[type="radio"], + .edit-post-visual-editor input[type="tel"], + .edit-post-visual-editor input[type="time"], + .edit-post-visual-editor input[type="url"], + .edit-post-visual-editor input[type="week"], + .edit-post-visual-editor input[type="password"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-visual-editor input[type="color"], + .edit-post-visual-editor input[type="date"], + .edit-post-visual-editor input[type="datetime"], + .edit-post-visual-editor input[type="datetime-local"], + .edit-post-visual-editor input[type="email"], + .edit-post-visual-editor input[type="month"], + .edit-post-visual-editor input[type="number"], + .edit-post-visual-editor select, + .edit-post-visual-editor textarea, + .edit-post-text-editor .input-control, + .edit-post-text-editor input[type="text"], + .edit-post-text-editor input[type="search"], + .edit-post-text-editor input[type="radio"], + .edit-post-text-editor input[type="tel"], + .edit-post-text-editor input[type="time"], + .edit-post-text-editor input[type="url"], + .edit-post-text-editor input[type="week"], + .edit-post-text-editor input[type="password"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-text-editor input[type="color"], + .edit-post-text-editor input[type="date"], + .edit-post-text-editor input[type="datetime"], + .edit-post-text-editor input[type="datetime-local"], + .edit-post-text-editor input[type="email"], + .edit-post-text-editor input[type="month"], + .edit-post-text-editor input[type="number"], + .edit-post-text-editor select, + .edit-post-text-editor textarea, + .edit-post-sidebar .input-control, + .edit-post-sidebar input[type="text"], + .edit-post-sidebar input[type="search"], + .edit-post-sidebar input[type="radio"], + .edit-post-sidebar input[type="tel"], + .edit-post-sidebar input[type="time"], + .edit-post-sidebar input[type="url"], + .edit-post-sidebar input[type="week"], + .edit-post-sidebar input[type="password"], + .edit-post-sidebar input[type="checkbox"], + .edit-post-sidebar input[type="color"], + .edit-post-sidebar input[type="date"], + .edit-post-sidebar input[type="datetime"], + .edit-post-sidebar input[type="datetime-local"], + .edit-post-sidebar input[type="email"], + .edit-post-sidebar input[type="month"], + .edit-post-sidebar input[type="number"], + .edit-post-sidebar select, + .edit-post-sidebar textarea, + .editor-post-publish-panel .input-control, + .editor-post-publish-panel input[type="text"], + .editor-post-publish-panel input[type="search"], + .editor-post-publish-panel input[type="radio"], + .editor-post-publish-panel input[type="tel"], + .editor-post-publish-panel input[type="time"], + .editor-post-publish-panel input[type="url"], + .editor-post-publish-panel input[type="week"], + .editor-post-publish-panel input[type="password"], + .editor-post-publish-panel input[type="checkbox"], + .editor-post-publish-panel input[type="color"], + .editor-post-publish-panel input[type="date"], + .editor-post-publish-panel input[type="datetime"], + .editor-post-publish-panel input[type="datetime-local"], + .editor-post-publish-panel input[type="email"], + .editor-post-publish-panel input[type="month"], + .editor-post-publish-panel input[type="number"], + .editor-post-publish-panel select, + .editor-post-publish-panel textarea, + .components-popover .input-control, + .components-popover input[type="text"], + .components-popover input[type="search"], + .components-popover input[type="radio"], + .components-popover input[type="tel"], + .components-popover input[type="time"], + .components-popover input[type="url"], + .components-popover input[type="week"], + .components-popover input[type="password"], + .components-popover input[type="checkbox"], + .components-popover input[type="color"], + .components-popover input[type="date"], + .components-popover input[type="datetime"], + .components-popover input[type="datetime-local"], + .components-popover input[type="email"], + .components-popover input[type="month"], + .components-popover input[type="number"], + .components-popover select, + .components-popover textarea, + .components-modal__frame .input-control, + .components-modal__frame input[type="text"], + .components-modal__frame input[type="search"], + .components-modal__frame input[type="radio"], + .components-modal__frame input[type="tel"], + .components-modal__frame input[type="time"], + .components-modal__frame input[type="url"], + .components-modal__frame input[type="week"], + .components-modal__frame input[type="password"], + .components-modal__frame input[type="checkbox"], + .components-modal__frame input[type="color"], + .components-modal__frame input[type="date"], + .components-modal__frame input[type="datetime"], + .components-modal__frame input[type="datetime-local"], + .components-modal__frame input[type="email"], + .components-modal__frame input[type="month"], + .components-modal__frame input[type="number"], + .components-modal__frame select, + .components-modal__frame textarea { + font-size: 13px; + /* Override core line-height. To be reviewed. */ + line-height: normal; } } + .edit-post-header .input-control:focus, + .edit-post-header input[type="text"]:focus, + .edit-post-header input[type="search"]:focus, + .edit-post-header input[type="radio"]:focus, + .edit-post-header input[type="tel"]:focus, + .edit-post-header input[type="time"]:focus, + .edit-post-header input[type="url"]:focus, + .edit-post-header input[type="week"]:focus, + .edit-post-header input[type="password"]:focus, + .edit-post-header input[type="checkbox"]:focus, + .edit-post-header input[type="color"]:focus, + .edit-post-header input[type="date"]:focus, + .edit-post-header input[type="datetime"]:focus, + .edit-post-header input[type="datetime-local"]:focus, + .edit-post-header input[type="email"]:focus, + .edit-post-header input[type="month"]:focus, + .edit-post-header input[type="number"]:focus, + .edit-post-header select:focus, + .edit-post-header textarea:focus, + .edit-post-visual-editor .input-control:focus, + .edit-post-visual-editor input[type="text"]:focus, + .edit-post-visual-editor input[type="search"]:focus, + .edit-post-visual-editor input[type="radio"]:focus, + .edit-post-visual-editor input[type="tel"]:focus, + .edit-post-visual-editor input[type="time"]:focus, + .edit-post-visual-editor input[type="url"]:focus, + .edit-post-visual-editor input[type="week"]:focus, + .edit-post-visual-editor input[type="password"]:focus, + .edit-post-visual-editor input[type="checkbox"]:focus, + .edit-post-visual-editor input[type="color"]:focus, + .edit-post-visual-editor input[type="date"]:focus, + .edit-post-visual-editor input[type="datetime"]:focus, + .edit-post-visual-editor input[type="datetime-local"]:focus, + .edit-post-visual-editor input[type="email"]:focus, + .edit-post-visual-editor input[type="month"]:focus, + .edit-post-visual-editor input[type="number"]:focus, + .edit-post-visual-editor select:focus, + .edit-post-visual-editor textarea:focus, + .edit-post-text-editor .input-control:focus, + .edit-post-text-editor input[type="text"]:focus, + .edit-post-text-editor input[type="search"]:focus, + .edit-post-text-editor input[type="radio"]:focus, + .edit-post-text-editor input[type="tel"]:focus, + .edit-post-text-editor input[type="time"]:focus, + .edit-post-text-editor input[type="url"]:focus, + .edit-post-text-editor input[type="week"]:focus, + .edit-post-text-editor input[type="password"]:focus, + .edit-post-text-editor input[type="checkbox"]:focus, + .edit-post-text-editor input[type="color"]:focus, + .edit-post-text-editor input[type="date"]:focus, + .edit-post-text-editor input[type="datetime"]:focus, + .edit-post-text-editor input[type="datetime-local"]:focus, + .edit-post-text-editor input[type="email"]:focus, + .edit-post-text-editor input[type="month"]:focus, + .edit-post-text-editor input[type="number"]:focus, + .edit-post-text-editor select:focus, + .edit-post-text-editor textarea:focus, + .edit-post-sidebar .input-control:focus, + .edit-post-sidebar input[type="text"]:focus, + .edit-post-sidebar input[type="search"]:focus, + .edit-post-sidebar input[type="radio"]:focus, + .edit-post-sidebar input[type="tel"]:focus, + .edit-post-sidebar input[type="time"]:focus, + .edit-post-sidebar input[type="url"]:focus, + .edit-post-sidebar input[type="week"]:focus, + .edit-post-sidebar input[type="password"]:focus, + .edit-post-sidebar input[type="checkbox"]:focus, + .edit-post-sidebar input[type="color"]:focus, + .edit-post-sidebar input[type="date"]:focus, + .edit-post-sidebar input[type="datetime"]:focus, + .edit-post-sidebar input[type="datetime-local"]:focus, + .edit-post-sidebar input[type="email"]:focus, + .edit-post-sidebar input[type="month"]:focus, + .edit-post-sidebar input[type="number"]:focus, + .edit-post-sidebar select:focus, + .edit-post-sidebar textarea:focus, + .editor-post-publish-panel .input-control:focus, + .editor-post-publish-panel input[type="text"]:focus, + .editor-post-publish-panel input[type="search"]:focus, + .editor-post-publish-panel input[type="radio"]:focus, + .editor-post-publish-panel input[type="tel"]:focus, + .editor-post-publish-panel input[type="time"]:focus, + .editor-post-publish-panel input[type="url"]:focus, + .editor-post-publish-panel input[type="week"]:focus, + .editor-post-publish-panel input[type="password"]:focus, + .editor-post-publish-panel input[type="checkbox"]:focus, + .editor-post-publish-panel input[type="color"]:focus, + .editor-post-publish-panel input[type="date"]:focus, + .editor-post-publish-panel input[type="datetime"]:focus, + .editor-post-publish-panel input[type="datetime-local"]:focus, + .editor-post-publish-panel input[type="email"]:focus, + .editor-post-publish-panel input[type="month"]:focus, + .editor-post-publish-panel input[type="number"]:focus, + .editor-post-publish-panel select:focus, + .editor-post-publish-panel textarea:focus, + .components-popover .input-control:focus, + .components-popover input[type="text"]:focus, + .components-popover input[type="search"]:focus, + .components-popover input[type="radio"]:focus, + .components-popover input[type="tel"]:focus, + .components-popover input[type="time"]:focus, + .components-popover input[type="url"]:focus, + .components-popover input[type="week"]:focus, + .components-popover input[type="password"]:focus, + .components-popover input[type="checkbox"]:focus, + .components-popover input[type="color"]:focus, + .components-popover input[type="date"]:focus, + .components-popover input[type="datetime"]:focus, + .components-popover input[type="datetime-local"]:focus, + .components-popover input[type="email"]:focus, + .components-popover input[type="month"]:focus, + .components-popover input[type="number"]:focus, + .components-popover select:focus, + .components-popover textarea:focus, + .components-modal__frame .input-control:focus, + .components-modal__frame input[type="text"]:focus, + .components-modal__frame input[type="search"]:focus, + .components-modal__frame input[type="radio"]:focus, + .components-modal__frame input[type="tel"]:focus, + .components-modal__frame input[type="time"]:focus, + .components-modal__frame input[type="url"]:focus, + .components-modal__frame input[type="week"]:focus, + .components-modal__frame input[type="password"]:focus, + .components-modal__frame input[type="checkbox"]:focus, + .components-modal__frame input[type="color"]:focus, + .components-modal__frame input[type="date"]:focus, + .components-modal__frame input[type="datetime"]:focus, + .components-modal__frame input[type="datetime-local"]:focus, + .components-modal__frame input[type="email"]:focus, + .components-modal__frame input[type="month"]:focus, + .components-modal__frame input[type="number"]:focus, + .components-modal__frame select:focus, + .components-modal__frame textarea:focus { + color: #191e23; + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; } + .edit-post-header input[type="number"], + .edit-post-visual-editor input[type="number"], + .edit-post-text-editor input[type="number"], + .edit-post-sidebar input[type="number"], + .editor-post-publish-panel input[type="number"], + .components-popover input[type="number"], + .components-modal__frame input[type="number"] { + padding-left: 4px; + padding-right: 4px; } + .edit-post-header select, + .edit-post-visual-editor select, + .edit-post-text-editor select, + .edit-post-sidebar select, + .editor-post-publish-panel select, + .components-popover select, + .components-modal__frame select { + padding: 3px 24px 3px 8px; + font-size: 13px; + color: #555d66; } + .edit-post-header select:focus, + .edit-post-visual-editor select:focus, + .edit-post-text-editor select:focus, + .edit-post-sidebar select:focus, + .editor-post-publish-panel select:focus, + .components-popover select:focus, + .components-modal__frame select:focus { + border-color: #008dbe; + outline: 2px solid transparent; + outline-offset: 0; } + .edit-post-header input[type="checkbox"], + .edit-post-header input[type="radio"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-visual-editor input[type="radio"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-text-editor input[type="radio"], + .edit-post-sidebar input[type="checkbox"], + .edit-post-sidebar input[type="radio"], + .editor-post-publish-panel input[type="checkbox"], + .editor-post-publish-panel input[type="radio"], + .components-popover input[type="checkbox"], + .components-popover input[type="radio"], + .components-modal__frame input[type="checkbox"], + .components-modal__frame input[type="radio"] { + border: 2px solid #6c7781; + margin-right: 12px; + transition: none; } + .edit-post-header input[type="checkbox"]:focus, + .edit-post-header input[type="radio"]:focus, + .edit-post-visual-editor input[type="checkbox"]:focus, + .edit-post-visual-editor input[type="radio"]:focus, + .edit-post-text-editor input[type="checkbox"]:focus, + .edit-post-text-editor input[type="radio"]:focus, + .edit-post-sidebar input[type="checkbox"]:focus, + .edit-post-sidebar input[type="radio"]:focus, + .editor-post-publish-panel input[type="checkbox"]:focus, + .editor-post-publish-panel input[type="radio"]:focus, + .components-popover input[type="checkbox"]:focus, + .components-popover input[type="radio"]:focus, + .components-modal__frame input[type="checkbox"]:focus, + .components-modal__frame input[type="radio"]:focus { + border-color: #6c7781; + box-shadow: 0 0 0 1px #6c7781; } + .edit-post-header input[type="checkbox"]:checked, + .edit-post-header input[type="radio"]:checked, + .edit-post-visual-editor input[type="checkbox"]:checked, + .edit-post-visual-editor input[type="radio"]:checked, + .edit-post-text-editor input[type="checkbox"]:checked, + .edit-post-text-editor input[type="radio"]:checked, + .edit-post-sidebar input[type="checkbox"]:checked, + .edit-post-sidebar input[type="radio"]:checked, + .editor-post-publish-panel input[type="checkbox"]:checked, + .editor-post-publish-panel input[type="radio"]:checked, + .components-popover input[type="checkbox"]:checked, + .components-popover input[type="radio"]:checked, + .components-modal__frame input[type="checkbox"]:checked, + .components-modal__frame input[type="radio"]:checked { + background: #11a0d2; + border-color: #11a0d2; } + body.admin-color-sunrise .edit-post-header input[type="checkbox"]:checked, body.admin-color-sunrise .edit-post-header input[type="radio"]:checked, body.admin-color-sunrise .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-sunrise .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-sunrise .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-sunrise .edit-post-text-editor input[type="radio"]:checked, body.admin-color-sunrise .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-sunrise .edit-post-sidebar input[type="radio"]:checked, body.admin-color-sunrise .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-sunrise .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-sunrise .components-popover input[type="checkbox"]:checked, body.admin-color-sunrise .components-popover input[type="radio"]:checked, body.admin-color-sunrise .components-modal__frame input[type="checkbox"]:checked, body.admin-color-sunrise .components-modal__frame input[type="radio"]:checked { + background: #c8b03c; + border-color: #c8b03c; } + body.admin-color-ocean .edit-post-header input[type="checkbox"]:checked, body.admin-color-ocean .edit-post-header input[type="radio"]:checked, body.admin-color-ocean .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-ocean .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-ocean .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-ocean .edit-post-text-editor input[type="radio"]:checked, body.admin-color-ocean .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-ocean .edit-post-sidebar input[type="radio"]:checked, body.admin-color-ocean .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-ocean .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-ocean .components-popover input[type="checkbox"]:checked, body.admin-color-ocean .components-popover input[type="radio"]:checked, body.admin-color-ocean .components-modal__frame input[type="checkbox"]:checked, body.admin-color-ocean .components-modal__frame input[type="radio"]:checked { + background: #a3b9a2; + border-color: #a3b9a2; } + body.admin-color-midnight .edit-post-header input[type="checkbox"]:checked, body.admin-color-midnight .edit-post-header input[type="radio"]:checked, body.admin-color-midnight .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-midnight .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-midnight .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-midnight .edit-post-text-editor input[type="radio"]:checked, body.admin-color-midnight .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-midnight .edit-post-sidebar input[type="radio"]:checked, body.admin-color-midnight .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-midnight .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-midnight .components-popover input[type="checkbox"]:checked, body.admin-color-midnight .components-popover input[type="radio"]:checked, body.admin-color-midnight .components-modal__frame input[type="checkbox"]:checked, body.admin-color-midnight .components-modal__frame input[type="radio"]:checked { + background: #77a6b9; + border-color: #77a6b9; } + body.admin-color-ectoplasm .edit-post-header input[type="checkbox"]:checked, body.admin-color-ectoplasm .edit-post-header input[type="radio"]:checked, body.admin-color-ectoplasm .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-ectoplasm .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-ectoplasm .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-ectoplasm .edit-post-text-editor input[type="radio"]:checked, body.admin-color-ectoplasm .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-ectoplasm .edit-post-sidebar input[type="radio"]:checked, body.admin-color-ectoplasm .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-ectoplasm .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-ectoplasm .components-popover input[type="checkbox"]:checked, body.admin-color-ectoplasm .components-popover input[type="radio"]:checked, body.admin-color-ectoplasm .components-modal__frame input[type="checkbox"]:checked, body.admin-color-ectoplasm .components-modal__frame input[type="radio"]:checked { + background: #a7b656; + border-color: #a7b656; } + body.admin-color-coffee .edit-post-header input[type="checkbox"]:checked, body.admin-color-coffee .edit-post-header input[type="radio"]:checked, body.admin-color-coffee .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-coffee .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-coffee .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-coffee .edit-post-text-editor input[type="radio"]:checked, body.admin-color-coffee .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-coffee .edit-post-sidebar input[type="radio"]:checked, body.admin-color-coffee .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-coffee .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-coffee .components-popover input[type="checkbox"]:checked, body.admin-color-coffee .components-popover input[type="radio"]:checked, body.admin-color-coffee .components-modal__frame input[type="checkbox"]:checked, body.admin-color-coffee .components-modal__frame input[type="radio"]:checked { + background: #c2a68c; + border-color: #c2a68c; } + body.admin-color-blue .edit-post-header input[type="checkbox"]:checked, body.admin-color-blue .edit-post-header input[type="radio"]:checked, body.admin-color-blue .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-blue .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-blue .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-blue .edit-post-text-editor input[type="radio"]:checked, body.admin-color-blue .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-blue .edit-post-sidebar input[type="radio"]:checked, body.admin-color-blue .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-blue .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-blue .components-popover input[type="checkbox"]:checked, body.admin-color-blue .components-popover input[type="radio"]:checked, body.admin-color-blue .components-modal__frame input[type="checkbox"]:checked, body.admin-color-blue .components-modal__frame input[type="radio"]:checked { + background: #82b4cb; + border-color: #82b4cb; } + body.admin-color-light .edit-post-header input[type="checkbox"]:checked, body.admin-color-light .edit-post-header input[type="radio"]:checked, body.admin-color-light .edit-post-visual-editor input[type="checkbox"]:checked, body.admin-color-light .edit-post-visual-editor input[type="radio"]:checked, body.admin-color-light .edit-post-text-editor input[type="checkbox"]:checked, body.admin-color-light .edit-post-text-editor input[type="radio"]:checked, body.admin-color-light .edit-post-sidebar input[type="checkbox"]:checked, body.admin-color-light .edit-post-sidebar input[type="radio"]:checked, body.admin-color-light .editor-post-publish-panel input[type="checkbox"]:checked, body.admin-color-light .editor-post-publish-panel input[type="radio"]:checked, body.admin-color-light .components-popover input[type="checkbox"]:checked, body.admin-color-light .components-popover input[type="radio"]:checked, body.admin-color-light .components-modal__frame input[type="checkbox"]:checked, body.admin-color-light .components-modal__frame input[type="radio"]:checked { + background: #11a0d2; + border-color: #11a0d2; } + .edit-post-header input[type="checkbox"]:checked:focus, + .edit-post-header input[type="radio"]:checked:focus, + .edit-post-visual-editor input[type="checkbox"]:checked:focus, + .edit-post-visual-editor input[type="radio"]:checked:focus, + .edit-post-text-editor input[type="checkbox"]:checked:focus, + .edit-post-text-editor input[type="radio"]:checked:focus, + .edit-post-sidebar input[type="checkbox"]:checked:focus, + .edit-post-sidebar input[type="radio"]:checked:focus, + .editor-post-publish-panel input[type="checkbox"]:checked:focus, + .editor-post-publish-panel input[type="radio"]:checked:focus, + .components-popover input[type="checkbox"]:checked:focus, + .components-popover input[type="radio"]:checked:focus, + .components-modal__frame input[type="checkbox"]:checked:focus, + .components-modal__frame input[type="radio"]:checked:focus { + box-shadow: 0 0 0 2px #555d66; } + .edit-post-header input[type="checkbox"], + .edit-post-visual-editor input[type="checkbox"], + .edit-post-text-editor input[type="checkbox"], + .edit-post-sidebar input[type="checkbox"], + .editor-post-publish-panel input[type="checkbox"], + .components-popover input[type="checkbox"], + .components-modal__frame input[type="checkbox"] { + border-radius: 2px; } + .edit-post-header input[type="checkbox"]:checked::before, .edit-post-header input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-visual-editor input[type="checkbox"]:checked::before, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-text-editor input[type="checkbox"]:checked::before, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-sidebar input[type="checkbox"]:checked::before, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]::before, + .editor-post-publish-panel input[type="checkbox"]:checked::before, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]::before, + .components-popover input[type="checkbox"]:checked::before, + .components-popover input[type="checkbox"][aria-checked="mixed"]::before, + .components-modal__frame input[type="checkbox"]:checked::before, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]::before { + margin: -3px -5px; + color: #fff; } + @media (min-width: 782px) { + .edit-post-header input[type="checkbox"]:checked::before, .edit-post-header input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-visual-editor input[type="checkbox"]:checked::before, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-text-editor input[type="checkbox"]:checked::before, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-sidebar input[type="checkbox"]:checked::before, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]::before, + .editor-post-publish-panel input[type="checkbox"]:checked::before, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]::before, + .components-popover input[type="checkbox"]:checked::before, + .components-popover input[type="checkbox"][aria-checked="mixed"]::before, + .components-modal__frame input[type="checkbox"]:checked::before, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]::before { + margin: -4px 0 0 -5px; } } + .edit-post-header input[type="checkbox"][aria-checked="mixed"], + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], + .components-popover input[type="checkbox"][aria-checked="mixed"], + .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #11a0d2; + border-color: #11a0d2; } + body.admin-color-sunrise .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-sunrise .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #c8b03c; + border-color: #c8b03c; } + body.admin-color-ocean .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-ocean .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #a3b9a2; + border-color: #a3b9a2; } + body.admin-color-midnight .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-midnight .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #77a6b9; + border-color: #77a6b9; } + body.admin-color-ectoplasm .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-ectoplasm .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #a7b656; + border-color: #a7b656; } + body.admin-color-coffee .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-coffee .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #c2a68c; + border-color: #c2a68c; } + body.admin-color-blue .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-blue .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #82b4cb; + border-color: #82b4cb; } + body.admin-color-light .edit-post-header input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .components-popover input[type="checkbox"][aria-checked="mixed"], body.admin-color-light .components-modal__frame input[type="checkbox"][aria-checked="mixed"] { + background: #11a0d2; + border-color: #11a0d2; } + .edit-post-header input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]::before, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]::before, + .components-popover input[type="checkbox"][aria-checked="mixed"]::before, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]::before { + content: "\f460"; + float: left; + display: inline-block; + vertical-align: middle; + width: 16px; + /* stylelint-disable */ + font: normal 30px/1 dashicons; + /* stylelint-enable */ + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + @media (min-width: 782px) { + .edit-post-header input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]::before, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]::before, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]::before, + .components-popover input[type="checkbox"][aria-checked="mixed"]::before, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]::before { + float: none; + font-size: 21px; } } + .edit-post-header input[type="checkbox"][aria-checked="mixed"]:focus, + .edit-post-visual-editor input[type="checkbox"][aria-checked="mixed"]:focus, + .edit-post-text-editor input[type="checkbox"][aria-checked="mixed"]:focus, + .edit-post-sidebar input[type="checkbox"][aria-checked="mixed"]:focus, + .editor-post-publish-panel input[type="checkbox"][aria-checked="mixed"]:focus, + .components-popover input[type="checkbox"][aria-checked="mixed"]:focus, + .components-modal__frame input[type="checkbox"][aria-checked="mixed"]:focus { + box-shadow: 0 0 0 2px #555d66; } + .edit-post-header input[type="radio"], + .edit-post-visual-editor input[type="radio"], + .edit-post-text-editor input[type="radio"], + .edit-post-sidebar input[type="radio"], + .editor-post-publish-panel input[type="radio"], + .components-popover input[type="radio"], + .components-modal__frame input[type="radio"] { + border-radius: 50%; } + .edit-post-header input[type="radio"]:checked::before, + .edit-post-visual-editor input[type="radio"]:checked::before, + .edit-post-text-editor input[type="radio"]:checked::before, + .edit-post-sidebar input[type="radio"]:checked::before, + .editor-post-publish-panel input[type="radio"]:checked::before, + .components-popover input[type="radio"]:checked::before, + .components-modal__frame input[type="radio"]:checked::before { + width: 6px; + height: 6px; + margin: 6px 0 0 6px; + background-color: #fff; } + @media (min-width: 782px) { + .edit-post-header input[type="radio"]:checked::before, + .edit-post-visual-editor input[type="radio"]:checked::before, + .edit-post-text-editor input[type="radio"]:checked::before, + .edit-post-sidebar input[type="radio"]:checked::before, + .editor-post-publish-panel input[type="radio"]:checked::before, + .components-popover input[type="radio"]:checked::before, + .components-modal__frame input[type="radio"]:checked::before { + margin: 3px 0 0 3px; } } + .edit-post-header input::-webkit-input-placeholder, + .edit-post-header textarea::-webkit-input-placeholder, + .edit-post-visual-editor input::-webkit-input-placeholder, + .edit-post-visual-editor textarea::-webkit-input-placeholder, + .edit-post-text-editor input::-webkit-input-placeholder, + .edit-post-text-editor textarea::-webkit-input-placeholder, + .edit-post-sidebar input::-webkit-input-placeholder, + .edit-post-sidebar textarea::-webkit-input-placeholder, + .editor-post-publish-panel input::-webkit-input-placeholder, + .editor-post-publish-panel textarea::-webkit-input-placeholder, + .components-popover input::-webkit-input-placeholder, + .components-popover textarea::-webkit-input-placeholder, + .components-modal__frame input::-webkit-input-placeholder, + .components-modal__frame textarea::-webkit-input-placeholder { + color: rgba(14, 28, 46, 0.62); } + .edit-post-header input::-moz-placeholder, + .edit-post-header textarea::-moz-placeholder, + .edit-post-visual-editor input::-moz-placeholder, + .edit-post-visual-editor textarea::-moz-placeholder, + .edit-post-text-editor input::-moz-placeholder, + .edit-post-text-editor textarea::-moz-placeholder, + .edit-post-sidebar input::-moz-placeholder, + .edit-post-sidebar textarea::-moz-placeholder, + .editor-post-publish-panel input::-moz-placeholder, + .editor-post-publish-panel textarea::-moz-placeholder, + .components-popover input::-moz-placeholder, + .components-popover textarea::-moz-placeholder, + .components-modal__frame input::-moz-placeholder, + .components-modal__frame textarea::-moz-placeholder { + opacity: 1; + color: rgba(14, 28, 46, 0.62); } + .edit-post-header input:-ms-input-placeholder, + .edit-post-header textarea:-ms-input-placeholder, + .edit-post-visual-editor input:-ms-input-placeholder, + .edit-post-visual-editor textarea:-ms-input-placeholder, + .edit-post-text-editor input:-ms-input-placeholder, + .edit-post-text-editor textarea:-ms-input-placeholder, + .edit-post-sidebar input:-ms-input-placeholder, + .edit-post-sidebar textarea:-ms-input-placeholder, + .editor-post-publish-panel input:-ms-input-placeholder, + .editor-post-publish-panel textarea:-ms-input-placeholder, + .components-popover input:-ms-input-placeholder, + .components-popover textarea:-ms-input-placeholder, + .components-modal__frame input:-ms-input-placeholder, + .components-modal__frame textarea:-ms-input-placeholder { + color: rgba(14, 28, 46, 0.62); } + .is-dark-theme .edit-post-header input::-webkit-input-placeholder, .is-dark-theme + .edit-post-header textarea::-webkit-input-placeholder, .is-dark-theme + .edit-post-visual-editor input::-webkit-input-placeholder, .is-dark-theme + .edit-post-visual-editor textarea::-webkit-input-placeholder, .is-dark-theme + .edit-post-text-editor input::-webkit-input-placeholder, .is-dark-theme + .edit-post-text-editor textarea::-webkit-input-placeholder, .is-dark-theme + .edit-post-sidebar input::-webkit-input-placeholder, .is-dark-theme + .edit-post-sidebar textarea::-webkit-input-placeholder, .is-dark-theme + .editor-post-publish-panel input::-webkit-input-placeholder, .is-dark-theme + .editor-post-publish-panel textarea::-webkit-input-placeholder, .is-dark-theme + .components-popover input::-webkit-input-placeholder, .is-dark-theme + .components-popover textarea::-webkit-input-placeholder, .is-dark-theme + .components-modal__frame input::-webkit-input-placeholder, .is-dark-theme + .components-modal__frame textarea::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.65); } + .is-dark-theme .edit-post-header input::-moz-placeholder, .is-dark-theme + .edit-post-header textarea::-moz-placeholder, .is-dark-theme + .edit-post-visual-editor input::-moz-placeholder, .is-dark-theme + .edit-post-visual-editor textarea::-moz-placeholder, .is-dark-theme + .edit-post-text-editor input::-moz-placeholder, .is-dark-theme + .edit-post-text-editor textarea::-moz-placeholder, .is-dark-theme + .edit-post-sidebar input::-moz-placeholder, .is-dark-theme + .edit-post-sidebar textarea::-moz-placeholder, .is-dark-theme + .editor-post-publish-panel input::-moz-placeholder, .is-dark-theme + .editor-post-publish-panel textarea::-moz-placeholder, .is-dark-theme + .components-popover input::-moz-placeholder, .is-dark-theme + .components-popover textarea::-moz-placeholder, .is-dark-theme + .components-modal__frame input::-moz-placeholder, .is-dark-theme + .components-modal__frame textarea::-moz-placeholder { + opacity: 1; + color: rgba(255, 255, 255, 0.65); } + .is-dark-theme .edit-post-header input:-ms-input-placeholder, .is-dark-theme + .edit-post-header textarea:-ms-input-placeholder, .is-dark-theme + .edit-post-visual-editor input:-ms-input-placeholder, .is-dark-theme + .edit-post-visual-editor textarea:-ms-input-placeholder, .is-dark-theme + .edit-post-text-editor input:-ms-input-placeholder, .is-dark-theme + .edit-post-text-editor textarea:-ms-input-placeholder, .is-dark-theme + .edit-post-sidebar input:-ms-input-placeholder, .is-dark-theme + .edit-post-sidebar textarea:-ms-input-placeholder, .is-dark-theme + .editor-post-publish-panel input:-ms-input-placeholder, .is-dark-theme + .editor-post-publish-panel textarea:-ms-input-placeholder, .is-dark-theme + .components-popover input:-ms-input-placeholder, .is-dark-theme + .components-popover textarea:-ms-input-placeholder, .is-dark-theme + .components-modal__frame input:-ms-input-placeholder, .is-dark-theme + .components-modal__frame textarea:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.65); } + +@media (min-width: 600px) { + .block-editor__container { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + min-height: calc(100vh - 46px); } } + +@media (min-width: 782px) { + .block-editor__container { + min-height: calc(100vh - 32px); } + body.is-fullscreen-mode .block-editor__container { + min-height: 100vh; } } + +.block-editor__container img { + max-width: 100%; + height: auto; } + +.block-editor__container iframe { + width: 100%; } + +.block-editor__container .components-navigate-regions { + height: 100%; } + +.wp-block { + max-width: 580px; } + .wp-block[data-align="wide"] { + max-width: 1100px; } + .wp-block[data-align="full"] { + max-width: none; } diff --git a/wp-includes/css/dist/edit-post/style.min.css b/wp-includes/css/dist/edit-post/style.min.css new file mode 100644 index 0000000..e60f984 --- /dev/null +++ b/wp-includes/css/dist/edit-post/style.min.css @@ -0,0 +1 @@ +@media (min-width:782px){body.js.is-fullscreen-mode{margin-top:-46px;height:calc(100% + 46px)}}@media (min-width:782px) and (min-width:782px){body.js.is-fullscreen-mode{margin-top:-32px;height:calc(100% + 32px)}}@media (min-width:782px){body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-left:0}body.js.is-fullscreen-mode .edit-post-header{transform:translateY(-100%);animation:edit-post-fullscreen-mode__slide-in-animation .1s forwards}}@media (min-width:782px) and (prefers-reduced-motion:reduce){body.js.is-fullscreen-mode .edit-post-header{animation-duration:1ms}}@keyframes edit-post-fullscreen-mode__slide-in-animation{to{transform:translateY(0)}}.edit-post-header{height:56px;background:#fff;display:flex;flex-wrap:wrap;align-items:center;max-width:100vw}@media (min-width:280px){.edit-post-header{flex-wrap:nowrap}}.edit-post-header>.edit-post-header__settings{order:1}@supports ((position:-webkit-sticky) or (position:sticky)){.edit-post-header>.edit-post-header__settings{order:0}}.edit-post-header__toolbar{display:flex;flex-grow:1;padding-left:16px}.edit-post-header__settings{display:inline-flex;align-items:center;flex-wrap:wrap;padding-right:8px}.edit-post-header .components-button.is-pressed{color:#fff;background:#555d66}.edit-post-header .components-button.is-pressed:focus,.edit-post-header .components-button.is-pressed:hover{box-shadow:0 0 0 1px #555d66,inset 0 0 0 1px #fff!important;color:#fff!important;background:#555d66!important}.edit-post-header .components-button.editor-post-preview,.edit-post-header .components-button.editor-post-publish-button,.edit-post-header .components-button.editor-post-publish-panel__toggle,.edit-post-header .components-button.editor-post-save-draft,.edit-post-header .components-button.editor-post-switch-to-draft{margin:2px;font-size:13px}.edit-post-header .components-button.editor-post-save-draft,.edit-post-header .components-button.editor-post-switch-to-draft{padding:0 5px}@media (min-width:600px){.edit-post-header .components-button.editor-post-save-draft,.edit-post-header .components-button.editor-post-switch-to-draft{padding:0 12px}}.edit-post-header .components-button.editor-post-preview,.edit-post-header .components-button.editor-post-publish-button,.edit-post-header .components-button.editor-post-publish-panel__toggle{padding-left:5px;padding-right:5px}@media (min-width:600px){.edit-post-header .components-button.editor-post-preview,.edit-post-header .components-button.editor-post-publish-button,.edit-post-header .components-button.editor-post-publish-panel__toggle{padding-left:12px;padding-right:12px}}@media (min-width:782px){.edit-post-header .components-button.editor-post-preview{margin:0 3px 0 12px}.edit-post-header .components-button.editor-post-publish-button,.edit-post-header .components-button.editor-post-publish-panel__toggle{margin:0 12px 0 3px}}.edit-post-fullscreen-mode-close.has-icon{display:none}@media (min-width:782px){.edit-post-fullscreen-mode-close.has-icon{display:flex;align-items:center;align-self:stretch;border:none;background:#23282e;color:#fff;border-radius:0;height:auto;width:56px}.edit-post-fullscreen-mode-close.has-icon:hover{background:#32373d!important;color:#fff!important;box-shadow:none!important}.edit-post-fullscreen-mode-close.has-icon:active{color:#fff}}.edit-post-fullscreen-mode-close.has-icon svg{margin-left:auto;margin-right:auto}.edit-post-header-toolbar{display:inline-flex;align-items:center}.edit-post-header-toolbar>.components-button{display:none}@media (min-width:600px){.edit-post-header-toolbar>.components-button{display:inline-flex}}.edit-post-header-toolbar .block-editor-block-navigation,.edit-post-header-toolbar .table-of-contents{display:none}@media (min-width:600px){.edit-post-header-toolbar .block-editor-block-navigation,.edit-post-header-toolbar .table-of-contents{display:flex}}.edit-post-header-toolbar__block-toolbar{position:absolute;top:57px;left:0;right:0;background:#fff;min-height:37px;border-bottom:1px solid #e2e4e7}.edit-post-header-toolbar__block-toolbar:empty{display:none}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar{border-top:none;border-bottom:none}.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{display:none}@media (min-width:782px){.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{display:block;right:280px}}@media (min-width:1280px){.edit-post-header-toolbar__block-toolbar{padding-left:8px;position:static;left:auto;right:auto;background:none;border-bottom:none;min-height:auto}.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{right:auto}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar{margin:-9px 0}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar{padding:10px 4px 9px}}.edit-post-more-menu{margin-left:-4px}.edit-post-more-menu .components-button{width:auto;padding:0 2px}@media (min-width:600px){.edit-post-more-menu{margin-left:4px}.edit-post-more-menu .components-button{padding:0 4px}}.edit-post-more-menu .components-button svg{transform:rotate(90deg)}.edit-post-more-menu__content .components-popover__content{min-width:260px}@media (min-width:480px){.edit-post-more-menu__content .components-popover__content{width:auto;max-width:480px}}.edit-post-more-menu__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.edit-post-more-menu__content{z-index:99998}.edit-post-pinned-plugins{display:none}@media (min-width:600px){.edit-post-pinned-plugins{display:flex}}.edit-post-pinned-plugins .components-button{margin-left:4px}.edit-post-pinned-plugins .components-button.is-pressed{margin-left:5px}.edit-post-pinned-plugins .components-button svg{max-width:24px;max-height:24px}.edit-post-pinned-plugins .components-button:not(.is-pressed) svg,.edit-post-pinned-plugins .components-button:not(.is-pressed) svg *{stroke:#555d66;fill:#555d66;stroke-width:0}.edit-post-pinned-plugins .components-button.is-pressed:hover svg,.edit-post-pinned-plugins .components-button.is-pressed:hover svg *,.edit-post-pinned-plugins .components-button.is-pressed svg,.edit-post-pinned-plugins .components-button.is-pressed svg *{stroke:#fff!important;fill:#fff!important;stroke-width:0}.edit-post-pinned-plugins .components-button:hover svg,.edit-post-pinned-plugins .components-button:hover svg *{stroke:#191e23!important;fill:#191e23!important;stroke-width:0}.edit-post-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-post-keyboard-shortcut-help-modal__main-shortcuts .edit-post-keyboard-shortcut-help-modal__shortcut-list{margin-top:-25px}.edit-post-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-keyboard-shortcut-help-modal__shortcut{display:flex;align-items:baseline;padding:.6rem 0;border-top:1px solid #e2e4e7;margin-bottom:0}.edit-post-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #e2e4e7}.edit-post-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-post-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 0 0 1rem;text-align:right}.edit-post-keyboard-shortcut-help-modal__shortcut-description{flex:1;margin:0;flex-basis:auto}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{display:block;background:none;margin:0;padding:0}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-post-keyboard-shortcut-help-modal__shortcut-key{padding:.25rem .5rem;border-radius:8%;margin:0 .2rem}.edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 0 0 .2rem}.edit-post-layout__metaboxes{flex-shrink:0}.edit-post-layout__metaboxes:not(:empty){border-top:1px solid #e2e4e7;padding:10px 0;clear:both}.edit-post-layout__metaboxes:not(:empty) .edit-post-meta-boxes-area{margin:auto 20px}.edit-post-layout .components-editor-notices__snackbar{position:fixed;right:0;bottom:20px;padding-left:16px;padding-right:16px;left:0}@media (min-width:782px){.edit-post-layout .components-editor-notices__snackbar{left:160px}}@media (min-width:782px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{left:36px}}@media (min-width:961px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{left:160px}}.folded .edit-post-layout .components-editor-notices__snackbar{left:0}@media (min-width:782px){.folded .edit-post-layout .components-editor-notices__snackbar{left:36px}}@media (max-width:782px){.auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar{left:190px}}@media (max-width:600px){.auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar{margin-left:-18px}}body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar{left:0!important}.edit-post-layout .editor-post-publish-panel{position:fixed;z-index:100001;top:46px;bottom:0;right:0;left:0;overflow:auto}@media (min-width:782px){.edit-post-layout .editor-post-publish-panel{z-index:99998;top:32px;left:auto;width:280px;border-left:1px solid #e2e4e7;transform:translateX(100%);animation:edit-post-post-publish-panel__slide-in-animation .1s forwards}}@media (min-width:782px) and (prefers-reduced-motion:reduce){.edit-post-layout .editor-post-publish-panel{animation-duration:1ms}}@media (min-width:782px){body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel{top:0}.is-focusing-regions .edit-post-layout .editor-post-publish-panel{transform:translateX(0)}}@keyframes edit-post-post-publish-panel__slide-in-animation{to{transform:translateX(0)}}.block-editor-editor-skeleton__sidebar>div{height:100%}.edit-post-layout .editor-post-publish-panel__header-publish-button{justify-content:center}.edit-post-layout__toogle-publish-panel,.edit-post-layout__toogle-sidebar-panel{background-color:#fff;padding:10px 10px 10px 0}.edit-post-layout__toogle-publish-panel-button,.edit-post-layout__toogle-sidebar-panel-button{width:auto;height:auto;display:block;font-size:14px;font-weight:600;margin:0 0 0 auto;padding:15px 23px 14px;line-height:normal;text-decoration:none;outline:none;background:#f1f1f1;color:#11a0d2}body.admin-color-sunrise .edit-post-layout__toogle-publish-panel-button,body.admin-color-sunrise .edit-post-layout__toogle-sidebar-panel-button{color:#c8b03c}body.admin-color-ocean .edit-post-layout__toogle-publish-panel-button,body.admin-color-ocean .edit-post-layout__toogle-sidebar-panel-button{color:#a89d8a}body.admin-color-midnight .edit-post-layout__toogle-publish-panel-button,body.admin-color-midnight .edit-post-layout__toogle-sidebar-panel-button{color:#77a6b9}body.admin-color-ectoplasm .edit-post-layout__toogle-publish-panel-button,body.admin-color-ectoplasm .edit-post-layout__toogle-sidebar-panel-button{color:#c77430}body.admin-color-coffee .edit-post-layout__toogle-publish-panel-button,body.admin-color-coffee .edit-post-layout__toogle-sidebar-panel-button{color:#9fa47b}body.admin-color-blue .edit-post-layout__toogle-publish-panel-button,body.admin-color-blue .edit-post-layout__toogle-sidebar-panel-button{color:#d9ab59}body.admin-color-light .edit-post-layout__toogle-publish-panel-button,body.admin-color-light .edit-post-layout__toogle-sidebar-panel-button{color:#c75726}.edit-post-layout__toogle-publish-panel-button:focus,.edit-post-layout__toogle-sidebar-panel-button:focus{position:fixed;top:auto;right:10px;bottom:10px;left:auto}.edit-post-layout__footer{display:none;z-index:30}@media (min-width:782px){.edit-post-layout__footer{display:flex;background:#fff;height:24px;padding:0 8px;align-items:center;font-size:13px}}@media (min-width:600px){.edit-post-manage-blocks-modal{height:calc(100% - 112px)}}.edit-post-manage-blocks-modal .components-modal__content{padding-bottom:0;display:flex;flex-direction:column}.edit-post-manage-blocks-modal .components-modal__header{flex-shrink:0;margin-bottom:0}.edit-post-manage-blocks-modal__content{display:flex;flex-direction:column;flex:0 1 100%;min-height:0}.edit-post-manage-blocks-modal__no-results{font-style:italic;padding:24px 0;text-align:center}.edit-post-manage-blocks-modal__search{margin:16px 0}.edit-post-manage-blocks-modal__search .components-base-control__field{margin-bottom:0}.edit-post-manage-blocks-modal__search .components-base-control__label{margin-top:-4px}.edit-post-manage-blocks-modal__search input[type=search].components-text-control__input{padding:12px;border-radius:4px}.edit-post-manage-blocks-modal__disabled-blocks-count{border-top:1px solid #e2e4e7;margin-left:-24px;margin-right:-24px;padding:.6rem 24px;background-color:#f3f4f5}.edit-post-manage-blocks-modal__category{margin:0 0 2rem}.edit-post-manage-blocks-modal__category-title{position:-webkit-sticky;position:sticky;top:0;padding:16px 0;background-color:#fff;z-index:1}.edit-post-manage-blocks-modal__category-title .components-base-control__field{margin-bottom:0}.edit-post-manage-blocks-modal__category-title .components-checkbox-control__label{font-size:.9rem;font-weight:600}.edit-post-manage-blocks-modal__show-all{margin-right:8px}.edit-post-manage-blocks-modal__checklist{margin-top:0}.edit-post-manage-blocks-modal__checklist-item{margin-bottom:0;padding-left:16px;border-top:1px solid #e2e4e7}.edit-post-manage-blocks-modal__checklist-item:last-child{border-bottom:1px solid #e2e4e7}.edit-post-manage-blocks-modal__checklist-item .components-base-control__field{align-items:center;display:flex;margin:0}.components-modal__content .edit-post-manage-blocks-modal__checklist-item.components-checkbox-control__input-container{margin:0 8px}.edit-post-manage-blocks-modal__checklist-item .components-checkbox-control__label{display:flex;align-items:center;justify-content:space-between;flex-grow:1;padding:.6rem 0 .6rem 10px}.edit-post-manage-blocks-modal__checklist-item .block-editor-block-icon{margin-right:10px;fill:#555d66}.edit-post-manage-blocks-modal__results{height:100%;overflow:auto;margin-left:-24px;margin-right:-24px;padding-left:24px;padding-right:24px;border-top:1px solid #e2e4e7}.edit-post-meta-boxes-area{position:relative}.edit-post-meta-boxes-area .inside,.edit-post-meta-boxes-area__container{box-sizing:content-box}.edit-post-meta-boxes-area input,.edit-post-meta-boxes-area textarea{box-sizing:border-box}.edit-post-meta-boxes-area #poststuff{margin:0 auto;padding-top:0;min-width:auto}.edit-post-meta-boxes-area #poststuff .stuffbox>h3,.edit-post-meta-boxes-area #poststuff h2.hndle,.edit-post-meta-boxes-area #poststuff h3.hndle{border-bottom:1px solid #e2e4e7;box-sizing:border-box;color:inherit;font-weight:600;outline:none;padding:15px;position:relative;width:100%}.edit-post-meta-boxes-area .postbox{border:0;color:inherit;margin-bottom:0}.edit-post-meta-boxes-area .postbox>.inside{border-bottom:1px solid #e2e4e7;color:inherit;padding:0 14px 14px;margin:0}.edit-post-meta-boxes-area .postbox .handlediv{height:44px;width:44px}.edit-post-meta-boxes-area.is-loading:before{position:absolute;top:0;left:0;right:0;bottom:0;content:"";background:transparent;z-index:1}.edit-post-meta-boxes-area .components-spinner{position:absolute;top:10px;right:20px;z-index:5}.edit-post-meta-boxes-area .is-hidden{display:none}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]{border:1px solid #6c7781}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked{background:#fff;border-color:#6c7781}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:before{margin:-3px -4px}.edit-post-meta-boxes-area__clear{clear:both}.edit-post-sidebar{background:#fff;color:#555d66;overflow:visible}@media (min-width:600px){.edit-post-sidebar{z-index:auto;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}}@media (min-width:782px){.edit-post-sidebar{width:280px}}.edit-post-sidebar>.components-panel{border-left:none;border-right:none;overflow:auto;-webkit-overflow-scrolling:touch;height:auto;max-height:calc(100vh - 96px);margin-top:-1px;margin-bottom:-1px;position:relative}@media (min-width:600px){.edit-post-sidebar>.components-panel{overflow:visible;height:auto;max-height:none}}.edit-post-sidebar>.components-panel .components-panel__header{position:fixed;z-index:1;top:0;left:0;right:0;height:50px}@media (min-width:600px){.edit-post-sidebar>.components-panel .components-panel__header{position:inherit;top:auto;left:auto;right:auto}}.edit-post-sidebar p{margin-top:0}.edit-post-sidebar h2,.edit-post-sidebar h3{font-size:13px;color:#555d66;margin-bottom:1.5em}.edit-post-sidebar hr{border-top:none;border-bottom:1px solid #e2e4e7;margin:1.5em 0}.edit-post-sidebar div.components-toolbar{box-shadow:none;margin-bottom:1.5em}.edit-post-sidebar div.components-toolbar:last-child{margin-bottom:0}.edit-post-sidebar p+div.components-toolbar{margin-top:-1em}.edit-post-sidebar .block-editor-skip-to-selected-block:focus{top:auto;right:10px;bottom:10px;left:auto}.components-panel__header.edit-post-sidebar__header{background:#fff;padding-right:8px}.components-panel__header.edit-post-sidebar__header .edit-post-sidebar__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.edit-post-sidebar__header{display:none}}.components-panel__header.edit-post-sidebar__panel-tabs{margin-top:0}.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:none;margin-left:auto}@media (min-width:782px){.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:flex}}.edit-post-sidebar__panel-tab{background:transparent;border:none;border-radius:0;box-shadow:none;cursor:pointer;height:50px;padding:3px 15px;margin-left:0;font-weight:400;outline-offset:-1px;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.edit-post-sidebar__panel-tab{transition-duration:0s}}.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #007cba;font-weight:600;position:relative}body.admin-color-sunrise .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #837425}body.admin-color-ocean .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #5e7d5e}body.admin-color-midnight .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #497b8d}body.admin-color-ectoplasm .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #523f6d}body.admin-color-coffee .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #59524c}body.admin-color-blue .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #417e9b}body.admin-color-light .edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #007cba}.edit-post-sidebar__panel-tab.is-active:before{content:"";position:absolute;top:0;bottom:1px;right:0;left:0;border-bottom:3px solid transparent}.edit-post-sidebar__panel-tab:focus:not(:disabled){color:#191e23;outline-offset:-1px;outline:1px dotted #555d66;box-shadow:none}.components-panel__body.is-opened.edit-post-last-revision__panel{padding:0}.editor-post-last-revision__title{padding:13px 16px}.editor-post-author__select{margin:-5px 0;width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.editor-post-author__select{width:auto}}.edit-post-post-link__link-post-name{font-weight:600}.edit-post-post-link__preview-label{margin:0}.edit-post-post-link__link{text-align:left;word-wrap:break-word;display:block}.edit-post-post-link__preview-link-container{direction:ltr}.edit-post-post-schedule{width:100%;position:relative}.components-button.edit-post-post-schedule__toggle{text-align:right}.editor-post-slug__input{margin:-5px 0;padding:2px}.edit-post-post-status .edit-post-post-publish-dropdown__switch-to-draft{margin-top:15px;width:100%;text-align:center}.edit-post-post-visibility{width:100%}.edit-post-post-visibility__dialog .components-popover__content{padding:10px}@media (min-width:782px){.edit-post-post-visibility__dialog .components-popover__content{width:257px}}.edit-post-post-visibility__dialog-legend{font-weight:600}.edit-post-post-visibility__choice{margin:10px 0}.edit-post-post-visibility__dialog-label,.edit-post-post-visibility__dialog-radio{vertical-align:top}.edit-post-post-visibility__dialog-password-input{width:calc(100% - 20px);margin-left:20px}.edit-post-post-visibility__dialog-info{color:#7e8993;padding-left:20px;font-style:italic;margin:4px 0 0;line-height:1.4}.components-panel__header.edit-post-sidebar__panel-tabs{justify-content:flex-start;padding-left:0;padding-right:4px;border-top:0}.components-panel__header.edit-post-sidebar__panel-tabs ul{display:flex}.components-panel__header.edit-post-sidebar__panel-tabs li{margin:0}.components-button.edit-post-sidebar__panel-tab{background:transparent;border:none;box-shadow:none;cursor:pointer;display:inline-block;padding:3px 15px;margin-left:0;font-weight:400;color:#191e23;outline-offset:-1px;transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-post-sidebar__panel-tab{transition-duration:0s}}.components-button.edit-post-sidebar__panel-tab:after{content:attr(data-label);display:block;font-weight:600;height:0;overflow:hidden;speak:none;visibility:hidden}.components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #007cba;font-weight:600;position:relative}body.admin-color-sunrise .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #837425}body.admin-color-ocean .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #5e7d5e}body.admin-color-midnight .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #497b8d}body.admin-color-ectoplasm .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #523f6d}body.admin-color-coffee .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #59524c}body.admin-color-blue .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #417e9b}body.admin-color-light .components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 -3px #007cba}.components-button.edit-post-sidebar__panel-tab.is-active:before{content:"";position:absolute;top:0;bottom:1px;right:0;left:0;border-bottom:3px solid transparent}.components-button.edit-post-sidebar__panel-tab:focus{background-color:transparent;color:#191e23;outline-offset:-1px;outline:1px dotted #555d66}.components-panel__header.edit-post-sidebar-header__small{background:#fff;padding-right:4px}.components-panel__header.edit-post-sidebar-header__small .edit-post-sidebar__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.edit-post-sidebar-header__small{display:none}}.components-panel__header.edit-post-sidebar-header{padding-right:4px;background:#f3f4f5}.components-panel__header.edit-post-sidebar-header .components-button.has-icon{display:none;margin-left:auto}.components-panel__header.edit-post-sidebar-header .components-button.has-icon~.components-button{margin-left:0}@media (min-width:782px){.components-panel__header.edit-post-sidebar-header .components-button.has-icon{display:flex}}.edit-post-text-editor{position:relative;width:100%;padding-top:44px}.edit-post-text-editor .editor-post-title__block textarea{border:1px solid #e2e4e7;margin-bottom:4px;padding:14px}.edit-post-text-editor .editor-post-title__block textarea:focus{border:1px solid #e2e4e7}.edit-post-text-editor .editor-post-title__block:not(.is-focus-mode):not(.has-fixed-toolbar).is-selected .editor-post-title__input,.edit-post-text-editor .editor-post-title__block:not(.is-focus-mode):not(.has-fixed-toolbar):not(.is-selected) .editor-post-title__input:hover{box-shadow:none;border-left-width:1px}.edit-post-text-editor .editor-post-title__block.is-selected textarea,.edit-post-text-editor .editor-post-title__block textarea:hover{box-shadow:0 0 0 1px #e2e4e7}.edit-post-text-editor .editor-post-permalink{margin-top:-6px;box-shadow:none;border:none;outline:1px solid #b5bcc2}@media (min-width:600px){.edit-post-text-editor .editor-post-title,.edit-post-text-editor .editor-post-title__block{padding:0}}.edit-post-text-editor__toolbar{position:absolute;top:8px;left:0;right:0;height:36px;line-height:36px;padding:0 8px 0 16px;display:flex}.edit-post-text-editor__toolbar h2{margin:0 auto 0 0;font-size:13px;color:#555d66}.edit-post-text-editor__toolbar .components-button svg{order:1}.edit-post-text-editor__body{max-width:calc(100% - 32px);margin-left:16px;margin-right:16px;padding-top:40px}@media (min-width:600px){.edit-post-text-editor__body{max-width:580px;margin-left:auto;margin-right:auto}}.edit-post-visual-editor{position:relative;padding-top:50px;flex:1 1 auto}.edit-post-visual-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}@supports ((position:-webkit-sticky) or (position:sticky)){.edit-post-visual-editor{flex-basis:100%}}.edit-post-visual-editor>.block-editor__typewriter,.edit-post-visual-editor>.block-editor__typewriter>div,.edit-post-visual-editor>.block-editor__typewriter>div>.block-editor-writing-flow,.edit-post-visual-editor>.block-editor__typewriter>div>.block-editor-writing-flow>.block-editor-writing-flow__click-redirect{height:100%}.edit-post-visual-editor .block-editor-writing-flow__click-redirect{min-height:40vh;width:100%}.has-metaboxes .edit-post-visual-editor .block-editor-writing-flow__click-redirect{height:0}.edit-post-visual-editor .block-editor-block-list__block{margin-left:auto;margin-right:auto}@media (min-width:600px){.editor-post-title{padding-left:58px;padding-right:58px}}.edit-post-visual-editor .editor-post-title__block{margin-left:auto;margin-right:auto;margin-bottom:32px}.edit-post-visual-editor .editor-post-title__block>div{margin-left:0;margin-right:0}@media (min-width:600px){.edit-post-visual-editor .editor-post-title__block>div{margin-left:-16px;margin-right:-16px}}.edit-post-visual-editor .block-editor-block-list__layout>.block-editor-block-list__block[data-align=left]:first-child,.edit-post-visual-editor .block-editor-block-list__layout>.block-editor-block-list__block[data-align=right]:first-child{margin-top:34px}.edit-post-options-modal__section{margin:0 0 2rem}.edit-post-options-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-options-modal__option{border-top:1px solid #e2e4e7}.edit-post-options-modal__option:last-child{border-bottom:1px solid #e2e4e7}.edit-post-options-modal__option .components-base-control__field{align-items:center;display:flex;margin:0}.edit-post-options-modal__option .components-checkbox-control__label{flex-grow:1;padding:.6rem 0 .6rem 10px}.edit-post-options-modal__custom-fields-confirmation-button,.edit-post-options-modal__custom-fields-confirmation-message{margin:0 0 .6rem 48px}@media (min-width:782px){.edit-post-options-modal__custom-fields-confirmation-button,.edit-post-options-modal__custom-fields-confirmation-message{margin-left:38px}}@media (min-width:600px){.edit-post-options-modal__custom-fields-confirmation-button,.edit-post-options-modal__custom-fields-confirmation-message{max-width:300px}}.edit-post-welcome-guide__page{display:flex;flex-direction:column;justify-content:center;position:relative}@media (min-width:600px){.edit-post-welcome-guide__page{min-height:300px;padding-left:344px}}.edit-post-welcome-guide__heading{font-family:"Noto Serif",serif;font-size:21px;line-height:1.4;margin:8px 0}.edit-post-welcome-guide__image{background:#66c6e4;border-radius:4px;height:200px;margin:8px 0}@media (min-width:600px){.edit-post-welcome-guide__image{position:absolute;left:0;top:50%;height:300px;width:320px;margin-top:-150px}}.edit-post-welcome-guide__text{font-size:16px;line-height:1.4;margin:8px 0}.edit-post-welcome-guide__inserter-icon{margin:0 4px;position:relative;top:4px}@media (min-width:600px){.edit-post-welcome-guide{width:600px}}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.block-editor-page,html.wp-toolbar{background:#fff}body.block-editor-page #wpcontent{padding-left:0}body.block-editor-page #wpbody-content{padding-bottom:0}body.block-editor-page #wpbody-content>div:not(.block-editor):not(#screen-meta){display:none}body.block-editor-page #wpfooter{display:none}body.block-editor-page .a11y-speak-region{left:-1px;top:-1px}body.block-editor-page ul#adminmenu>li.current>a.current:after,body.block-editor-page ul#adminmenu a.wp-has-current-submenu:after{border-right-color:#fff}body.block-editor-page .media-frame select.attachment-filters:last-of-type{width:auto;max-width:100%}.components-modal__frame,.components-popover,.edit-post-header,.edit-post-sidebar,.edit-post-text-editor,.edit-post-visual-editor,.editor-post-publish-panel{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.components-popover *,.components-popover :after,.components-popover :before,.edit-post-header *,.edit-post-header :after,.edit-post-header :before,.edit-post-sidebar *,.edit-post-sidebar :after,.edit-post-sidebar :before,.edit-post-text-editor *,.edit-post-text-editor :after,.edit-post-text-editor :before,.edit-post-visual-editor *,.edit-post-visual-editor :after,.edit-post-visual-editor :before,.editor-post-publish-panel *,.editor-post-publish-panel :after,.editor-post-publish-panel :before{box-sizing:inherit}.components-modal__frame .input-control,.components-modal__frame input[type=checkbox],.components-modal__frame input[type=color],.components-modal__frame input[type=date],.components-modal__frame input[type=datetime-local],.components-modal__frame input[type=datetime],.components-modal__frame input[type=email],.components-modal__frame input[type=month],.components-modal__frame input[type=number],.components-modal__frame input[type=password],.components-modal__frame input[type=radio],.components-modal__frame input[type=search],.components-modal__frame input[type=tel],.components-modal__frame input[type=text],.components-modal__frame input[type=time],.components-modal__frame input[type=url],.components-modal__frame input[type=week],.components-modal__frame select,.components-modal__frame textarea,.components-popover .input-control,.components-popover input[type=checkbox],.components-popover input[type=color],.components-popover input[type=date],.components-popover input[type=datetime-local],.components-popover input[type=datetime],.components-popover input[type=email],.components-popover input[type=month],.components-popover input[type=number],.components-popover input[type=password],.components-popover input[type=radio],.components-popover input[type=search],.components-popover input[type=tel],.components-popover input[type=text],.components-popover input[type=time],.components-popover input[type=url],.components-popover input[type=week],.components-popover select,.components-popover textarea,.edit-post-header .input-control,.edit-post-header input[type=checkbox],.edit-post-header input[type=color],.edit-post-header input[type=date],.edit-post-header input[type=datetime-local],.edit-post-header input[type=datetime],.edit-post-header input[type=email],.edit-post-header input[type=month],.edit-post-header input[type=number],.edit-post-header input[type=password],.edit-post-header input[type=radio],.edit-post-header input[type=search],.edit-post-header input[type=tel],.edit-post-header input[type=text],.edit-post-header input[type=time],.edit-post-header input[type=url],.edit-post-header input[type=week],.edit-post-header select,.edit-post-header textarea,.edit-post-sidebar .input-control,.edit-post-sidebar input[type=checkbox],.edit-post-sidebar input[type=color],.edit-post-sidebar input[type=date],.edit-post-sidebar input[type=datetime-local],.edit-post-sidebar input[type=datetime],.edit-post-sidebar input[type=email],.edit-post-sidebar input[type=month],.edit-post-sidebar input[type=number],.edit-post-sidebar input[type=password],.edit-post-sidebar input[type=radio],.edit-post-sidebar input[type=search],.edit-post-sidebar input[type=tel],.edit-post-sidebar input[type=text],.edit-post-sidebar input[type=time],.edit-post-sidebar input[type=url],.edit-post-sidebar input[type=week],.edit-post-sidebar select,.edit-post-sidebar textarea,.edit-post-text-editor .input-control,.edit-post-text-editor input[type=checkbox],.edit-post-text-editor input[type=color],.edit-post-text-editor input[type=date],.edit-post-text-editor input[type=datetime-local],.edit-post-text-editor input[type=datetime],.edit-post-text-editor input[type=email],.edit-post-text-editor input[type=month],.edit-post-text-editor input[type=number],.edit-post-text-editor input[type=password],.edit-post-text-editor input[type=radio],.edit-post-text-editor input[type=search],.edit-post-text-editor input[type=tel],.edit-post-text-editor input[type=text],.edit-post-text-editor input[type=time],.edit-post-text-editor input[type=url],.edit-post-text-editor input[type=week],.edit-post-text-editor select,.edit-post-text-editor textarea,.edit-post-visual-editor .input-control,.edit-post-visual-editor input[type=checkbox],.edit-post-visual-editor input[type=color],.edit-post-visual-editor input[type=date],.edit-post-visual-editor input[type=datetime-local],.edit-post-visual-editor input[type=datetime],.edit-post-visual-editor input[type=email],.edit-post-visual-editor input[type=month],.edit-post-visual-editor input[type=number],.edit-post-visual-editor input[type=password],.edit-post-visual-editor input[type=radio],.edit-post-visual-editor input[type=search],.edit-post-visual-editor input[type=tel],.edit-post-visual-editor input[type=text],.edit-post-visual-editor input[type=time],.edit-post-visual-editor input[type=url],.edit-post-visual-editor input[type=week],.edit-post-visual-editor select,.edit-post-visual-editor textarea,.editor-post-publish-panel .input-control,.editor-post-publish-panel input[type=checkbox],.editor-post-publish-panel input[type=color],.editor-post-publish-panel input[type=date],.editor-post-publish-panel input[type=datetime-local],.editor-post-publish-panel input[type=datetime],.editor-post-publish-panel input[type=email],.editor-post-publish-panel input[type=month],.editor-post-publish-panel input[type=number],.editor-post-publish-panel input[type=password],.editor-post-publish-panel input[type=radio],.editor-post-publish-panel input[type=search],.editor-post-publish-panel input[type=tel],.editor-post-publish-panel input[type=text],.editor-post-publish-panel input[type=time],.editor-post-publish-panel input[type=url],.editor-post-publish-panel input[type=week],.editor-post-publish-panel select,.editor-post-publish-panel textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:4px;border:1px solid #7e8993;font-size:16px;line-height:normal}@media (prefers-reduced-motion:reduce){.components-modal__frame .input-control,.components-modal__frame input[type=checkbox],.components-modal__frame input[type=color],.components-modal__frame input[type=date],.components-modal__frame input[type=datetime-local],.components-modal__frame input[type=datetime],.components-modal__frame input[type=email],.components-modal__frame input[type=month],.components-modal__frame input[type=number],.components-modal__frame input[type=password],.components-modal__frame input[type=radio],.components-modal__frame input[type=search],.components-modal__frame input[type=tel],.components-modal__frame input[type=text],.components-modal__frame input[type=time],.components-modal__frame input[type=url],.components-modal__frame input[type=week],.components-modal__frame select,.components-modal__frame textarea,.components-popover .input-control,.components-popover input[type=checkbox],.components-popover input[type=color],.components-popover input[type=date],.components-popover input[type=datetime-local],.components-popover input[type=datetime],.components-popover input[type=email],.components-popover input[type=month],.components-popover input[type=number],.components-popover input[type=password],.components-popover input[type=radio],.components-popover input[type=search],.components-popover input[type=tel],.components-popover input[type=text],.components-popover input[type=time],.components-popover input[type=url],.components-popover input[type=week],.components-popover select,.components-popover textarea,.edit-post-header .input-control,.edit-post-header input[type=checkbox],.edit-post-header input[type=color],.edit-post-header input[type=date],.edit-post-header input[type=datetime-local],.edit-post-header input[type=datetime],.edit-post-header input[type=email],.edit-post-header input[type=month],.edit-post-header input[type=number],.edit-post-header input[type=password],.edit-post-header input[type=radio],.edit-post-header input[type=search],.edit-post-header input[type=tel],.edit-post-header input[type=text],.edit-post-header input[type=time],.edit-post-header input[type=url],.edit-post-header input[type=week],.edit-post-header select,.edit-post-header textarea,.edit-post-sidebar .input-control,.edit-post-sidebar input[type=checkbox],.edit-post-sidebar input[type=color],.edit-post-sidebar input[type=date],.edit-post-sidebar input[type=datetime-local],.edit-post-sidebar input[type=datetime],.edit-post-sidebar input[type=email],.edit-post-sidebar input[type=month],.edit-post-sidebar input[type=number],.edit-post-sidebar input[type=password],.edit-post-sidebar input[type=radio],.edit-post-sidebar input[type=search],.edit-post-sidebar input[type=tel],.edit-post-sidebar input[type=text],.edit-post-sidebar input[type=time],.edit-post-sidebar input[type=url],.edit-post-sidebar input[type=week],.edit-post-sidebar select,.edit-post-sidebar textarea,.edit-post-text-editor .input-control,.edit-post-text-editor input[type=checkbox],.edit-post-text-editor input[type=color],.edit-post-text-editor input[type=date],.edit-post-text-editor input[type=datetime-local],.edit-post-text-editor input[type=datetime],.edit-post-text-editor input[type=email],.edit-post-text-editor input[type=month],.edit-post-text-editor input[type=number],.edit-post-text-editor input[type=password],.edit-post-text-editor input[type=radio],.edit-post-text-editor input[type=search],.edit-post-text-editor input[type=tel],.edit-post-text-editor input[type=text],.edit-post-text-editor input[type=time],.edit-post-text-editor input[type=url],.edit-post-text-editor input[type=week],.edit-post-text-editor select,.edit-post-text-editor textarea,.edit-post-visual-editor .input-control,.edit-post-visual-editor input[type=checkbox],.edit-post-visual-editor input[type=color],.edit-post-visual-editor input[type=date],.edit-post-visual-editor input[type=datetime-local],.edit-post-visual-editor input[type=datetime],.edit-post-visual-editor input[type=email],.edit-post-visual-editor input[type=month],.edit-post-visual-editor input[type=number],.edit-post-visual-editor input[type=password],.edit-post-visual-editor input[type=radio],.edit-post-visual-editor input[type=search],.edit-post-visual-editor input[type=tel],.edit-post-visual-editor input[type=text],.edit-post-visual-editor input[type=time],.edit-post-visual-editor input[type=url],.edit-post-visual-editor input[type=week],.edit-post-visual-editor select,.edit-post-visual-editor textarea,.editor-post-publish-panel .input-control,.editor-post-publish-panel input[type=checkbox],.editor-post-publish-panel input[type=color],.editor-post-publish-panel input[type=date],.editor-post-publish-panel input[type=datetime-local],.editor-post-publish-panel input[type=datetime],.editor-post-publish-panel input[type=email],.editor-post-publish-panel input[type=month],.editor-post-publish-panel input[type=number],.editor-post-publish-panel input[type=password],.editor-post-publish-panel input[type=radio],.editor-post-publish-panel input[type=search],.editor-post-publish-panel input[type=tel],.editor-post-publish-panel input[type=text],.editor-post-publish-panel input[type=time],.editor-post-publish-panel input[type=url],.editor-post-publish-panel input[type=week],.editor-post-publish-panel select,.editor-post-publish-panel textarea{transition-duration:0s}}@media (min-width:600px){.components-modal__frame .input-control,.components-modal__frame input[type=checkbox],.components-modal__frame input[type=color],.components-modal__frame input[type=date],.components-modal__frame input[type=datetime-local],.components-modal__frame input[type=datetime],.components-modal__frame input[type=email],.components-modal__frame input[type=month],.components-modal__frame input[type=number],.components-modal__frame input[type=password],.components-modal__frame input[type=radio],.components-modal__frame input[type=search],.components-modal__frame input[type=tel],.components-modal__frame input[type=text],.components-modal__frame input[type=time],.components-modal__frame input[type=url],.components-modal__frame input[type=week],.components-modal__frame select,.components-modal__frame textarea,.components-popover .input-control,.components-popover input[type=checkbox],.components-popover input[type=color],.components-popover input[type=date],.components-popover input[type=datetime-local],.components-popover input[type=datetime],.components-popover input[type=email],.components-popover input[type=month],.components-popover input[type=number],.components-popover input[type=password],.components-popover input[type=radio],.components-popover input[type=search],.components-popover input[type=tel],.components-popover input[type=text],.components-popover input[type=time],.components-popover input[type=url],.components-popover input[type=week],.components-popover select,.components-popover textarea,.edit-post-header .input-control,.edit-post-header input[type=checkbox],.edit-post-header input[type=color],.edit-post-header input[type=date],.edit-post-header input[type=datetime-local],.edit-post-header input[type=datetime],.edit-post-header input[type=email],.edit-post-header input[type=month],.edit-post-header input[type=number],.edit-post-header input[type=password],.edit-post-header input[type=radio],.edit-post-header input[type=search],.edit-post-header input[type=tel],.edit-post-header input[type=text],.edit-post-header input[type=time],.edit-post-header input[type=url],.edit-post-header input[type=week],.edit-post-header select,.edit-post-header textarea,.edit-post-sidebar .input-control,.edit-post-sidebar input[type=checkbox],.edit-post-sidebar input[type=color],.edit-post-sidebar input[type=date],.edit-post-sidebar input[type=datetime-local],.edit-post-sidebar input[type=datetime],.edit-post-sidebar input[type=email],.edit-post-sidebar input[type=month],.edit-post-sidebar input[type=number],.edit-post-sidebar input[type=password],.edit-post-sidebar input[type=radio],.edit-post-sidebar input[type=search],.edit-post-sidebar input[type=tel],.edit-post-sidebar input[type=text],.edit-post-sidebar input[type=time],.edit-post-sidebar input[type=url],.edit-post-sidebar input[type=week],.edit-post-sidebar select,.edit-post-sidebar textarea,.edit-post-text-editor .input-control,.edit-post-text-editor input[type=checkbox],.edit-post-text-editor input[type=color],.edit-post-text-editor input[type=date],.edit-post-text-editor input[type=datetime-local],.edit-post-text-editor input[type=datetime],.edit-post-text-editor input[type=email],.edit-post-text-editor input[type=month],.edit-post-text-editor input[type=number],.edit-post-text-editor input[type=password],.edit-post-text-editor input[type=radio],.edit-post-text-editor input[type=search],.edit-post-text-editor input[type=tel],.edit-post-text-editor input[type=text],.edit-post-text-editor input[type=time],.edit-post-text-editor input[type=url],.edit-post-text-editor input[type=week],.edit-post-text-editor select,.edit-post-text-editor textarea,.edit-post-visual-editor .input-control,.edit-post-visual-editor input[type=checkbox],.edit-post-visual-editor input[type=color],.edit-post-visual-editor input[type=date],.edit-post-visual-editor input[type=datetime-local],.edit-post-visual-editor input[type=datetime],.edit-post-visual-editor input[type=email],.edit-post-visual-editor input[type=month],.edit-post-visual-editor input[type=number],.edit-post-visual-editor input[type=password],.edit-post-visual-editor input[type=radio],.edit-post-visual-editor input[type=search],.edit-post-visual-editor input[type=tel],.edit-post-visual-editor input[type=text],.edit-post-visual-editor input[type=time],.edit-post-visual-editor input[type=url],.edit-post-visual-editor input[type=week],.edit-post-visual-editor select,.edit-post-visual-editor textarea,.editor-post-publish-panel .input-control,.editor-post-publish-panel input[type=checkbox],.editor-post-publish-panel input[type=color],.editor-post-publish-panel input[type=date],.editor-post-publish-panel input[type=datetime-local],.editor-post-publish-panel input[type=datetime],.editor-post-publish-panel input[type=email],.editor-post-publish-panel input[type=month],.editor-post-publish-panel input[type=number],.editor-post-publish-panel input[type=password],.editor-post-publish-panel input[type=radio],.editor-post-publish-panel input[type=search],.editor-post-publish-panel input[type=tel],.editor-post-publish-panel input[type=text],.editor-post-publish-panel input[type=time],.editor-post-publish-panel input[type=url],.editor-post-publish-panel input[type=week],.editor-post-publish-panel select,.editor-post-publish-panel textarea{font-size:13px;line-height:normal}}.components-modal__frame .input-control:focus,.components-modal__frame input[type=checkbox]:focus,.components-modal__frame input[type=color]:focus,.components-modal__frame input[type=date]:focus,.components-modal__frame input[type=datetime-local]:focus,.components-modal__frame input[type=datetime]:focus,.components-modal__frame input[type=email]:focus,.components-modal__frame input[type=month]:focus,.components-modal__frame input[type=number]:focus,.components-modal__frame input[type=password]:focus,.components-modal__frame input[type=radio]:focus,.components-modal__frame input[type=search]:focus,.components-modal__frame input[type=tel]:focus,.components-modal__frame input[type=text]:focus,.components-modal__frame input[type=time]:focus,.components-modal__frame input[type=url]:focus,.components-modal__frame input[type=week]:focus,.components-modal__frame select:focus,.components-modal__frame textarea:focus,.components-popover .input-control:focus,.components-popover input[type=checkbox]:focus,.components-popover input[type=color]:focus,.components-popover input[type=date]:focus,.components-popover input[type=datetime-local]:focus,.components-popover input[type=datetime]:focus,.components-popover input[type=email]:focus,.components-popover input[type=month]:focus,.components-popover input[type=number]:focus,.components-popover input[type=password]:focus,.components-popover input[type=radio]:focus,.components-popover input[type=search]:focus,.components-popover input[type=tel]:focus,.components-popover input[type=text]:focus,.components-popover input[type=time]:focus,.components-popover input[type=url]:focus,.components-popover input[type=week]:focus,.components-popover select:focus,.components-popover textarea:focus,.edit-post-header .input-control:focus,.edit-post-header input[type=checkbox]:focus,.edit-post-header input[type=color]:focus,.edit-post-header input[type=date]:focus,.edit-post-header input[type=datetime-local]:focus,.edit-post-header input[type=datetime]:focus,.edit-post-header input[type=email]:focus,.edit-post-header input[type=month]:focus,.edit-post-header input[type=number]:focus,.edit-post-header input[type=password]:focus,.edit-post-header input[type=radio]:focus,.edit-post-header input[type=search]:focus,.edit-post-header input[type=tel]:focus,.edit-post-header input[type=text]:focus,.edit-post-header input[type=time]:focus,.edit-post-header input[type=url]:focus,.edit-post-header input[type=week]:focus,.edit-post-header select:focus,.edit-post-header textarea:focus,.edit-post-sidebar .input-control:focus,.edit-post-sidebar input[type=checkbox]:focus,.edit-post-sidebar input[type=color]:focus,.edit-post-sidebar input[type=date]:focus,.edit-post-sidebar input[type=datetime-local]:focus,.edit-post-sidebar input[type=datetime]:focus,.edit-post-sidebar input[type=email]:focus,.edit-post-sidebar input[type=month]:focus,.edit-post-sidebar input[type=number]:focus,.edit-post-sidebar input[type=password]:focus,.edit-post-sidebar input[type=radio]:focus,.edit-post-sidebar input[type=search]:focus,.edit-post-sidebar input[type=tel]:focus,.edit-post-sidebar input[type=text]:focus,.edit-post-sidebar input[type=time]:focus,.edit-post-sidebar input[type=url]:focus,.edit-post-sidebar input[type=week]:focus,.edit-post-sidebar select:focus,.edit-post-sidebar textarea:focus,.edit-post-text-editor .input-control:focus,.edit-post-text-editor input[type=checkbox]:focus,.edit-post-text-editor input[type=color]:focus,.edit-post-text-editor input[type=date]:focus,.edit-post-text-editor input[type=datetime-local]:focus,.edit-post-text-editor input[type=datetime]:focus,.edit-post-text-editor input[type=email]:focus,.edit-post-text-editor input[type=month]:focus,.edit-post-text-editor input[type=number]:focus,.edit-post-text-editor input[type=password]:focus,.edit-post-text-editor input[type=radio]:focus,.edit-post-text-editor input[type=search]:focus,.edit-post-text-editor input[type=tel]:focus,.edit-post-text-editor input[type=text]:focus,.edit-post-text-editor input[type=time]:focus,.edit-post-text-editor input[type=url]:focus,.edit-post-text-editor input[type=week]:focus,.edit-post-text-editor select:focus,.edit-post-text-editor textarea:focus,.edit-post-visual-editor .input-control:focus,.edit-post-visual-editor input[type=checkbox]:focus,.edit-post-visual-editor input[type=color]:focus,.edit-post-visual-editor input[type=date]:focus,.edit-post-visual-editor input[type=datetime-local]:focus,.edit-post-visual-editor input[type=datetime]:focus,.edit-post-visual-editor input[type=email]:focus,.edit-post-visual-editor input[type=month]:focus,.edit-post-visual-editor input[type=number]:focus,.edit-post-visual-editor input[type=password]:focus,.edit-post-visual-editor input[type=radio]:focus,.edit-post-visual-editor input[type=search]:focus,.edit-post-visual-editor input[type=tel]:focus,.edit-post-visual-editor input[type=text]:focus,.edit-post-visual-editor input[type=time]:focus,.edit-post-visual-editor input[type=url]:focus,.edit-post-visual-editor input[type=week]:focus,.edit-post-visual-editor select:focus,.edit-post-visual-editor textarea:focus,.editor-post-publish-panel .input-control:focus,.editor-post-publish-panel input[type=checkbox]:focus,.editor-post-publish-panel input[type=color]:focus,.editor-post-publish-panel input[type=date]:focus,.editor-post-publish-panel input[type=datetime-local]:focus,.editor-post-publish-panel input[type=datetime]:focus,.editor-post-publish-panel input[type=email]:focus,.editor-post-publish-panel input[type=month]:focus,.editor-post-publish-panel input[type=number]:focus,.editor-post-publish-panel input[type=password]:focus,.editor-post-publish-panel input[type=radio]:focus,.editor-post-publish-panel input[type=search]:focus,.editor-post-publish-panel input[type=tel]:focus,.editor-post-publish-panel input[type=text]:focus,.editor-post-publish-panel input[type=time]:focus,.editor-post-publish-panel input[type=url]:focus,.editor-post-publish-panel input[type=week]:focus,.editor-post-publish-panel select:focus,.editor-post-publish-panel textarea:focus{color:#191e23;border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.components-modal__frame input[type=number],.components-popover input[type=number],.edit-post-header input[type=number],.edit-post-sidebar input[type=number],.edit-post-text-editor input[type=number],.edit-post-visual-editor input[type=number],.editor-post-publish-panel input[type=number]{padding-left:4px;padding-right:4px}.components-modal__frame select,.components-popover select,.edit-post-header select,.edit-post-sidebar select,.edit-post-text-editor select,.edit-post-visual-editor select,.editor-post-publish-panel select{padding:3px 24px 3px 8px;font-size:13px;color:#555d66}.components-modal__frame select:focus,.components-popover select:focus,.edit-post-header select:focus,.edit-post-sidebar select:focus,.edit-post-text-editor select:focus,.edit-post-visual-editor select:focus,.editor-post-publish-panel select:focus{border-color:#008dbe;outline:2px solid transparent;outline-offset:0}.components-modal__frame input[type=checkbox],.components-modal__frame input[type=radio],.components-popover input[type=checkbox],.components-popover input[type=radio],.edit-post-header input[type=checkbox],.edit-post-header input[type=radio],.edit-post-sidebar input[type=checkbox],.edit-post-sidebar input[type=radio],.edit-post-text-editor input[type=checkbox],.edit-post-text-editor input[type=radio],.edit-post-visual-editor input[type=checkbox],.edit-post-visual-editor input[type=radio],.editor-post-publish-panel input[type=checkbox],.editor-post-publish-panel input[type=radio]{border:2px solid #6c7781;margin-right:12px;transition:none}.components-modal__frame input[type=checkbox]:focus,.components-modal__frame input[type=radio]:focus,.components-popover input[type=checkbox]:focus,.components-popover input[type=radio]:focus,.edit-post-header input[type=checkbox]:focus,.edit-post-header input[type=radio]:focus,.edit-post-sidebar input[type=checkbox]:focus,.edit-post-sidebar input[type=radio]:focus,.edit-post-text-editor input[type=checkbox]:focus,.edit-post-text-editor input[type=radio]:focus,.edit-post-visual-editor input[type=checkbox]:focus,.edit-post-visual-editor input[type=radio]:focus,.editor-post-publish-panel input[type=checkbox]:focus,.editor-post-publish-panel input[type=radio]:focus{border-color:#6c7781;box-shadow:0 0 0 1px #6c7781}.components-modal__frame input[type=checkbox]:checked,.components-modal__frame input[type=radio]:checked,.components-popover input[type=checkbox]:checked,.components-popover input[type=radio]:checked,.edit-post-header input[type=checkbox]:checked,.edit-post-header input[type=radio]:checked,.edit-post-sidebar input[type=checkbox]:checked,.edit-post-sidebar input[type=radio]:checked,.edit-post-text-editor input[type=checkbox]:checked,.edit-post-text-editor input[type=radio]:checked,.edit-post-visual-editor input[type=checkbox]:checked,.edit-post-visual-editor input[type=radio]:checked,.editor-post-publish-panel input[type=checkbox]:checked,.editor-post-publish-panel input[type=radio]:checked{background:#11a0d2;border-color:#11a0d2}body.admin-color-sunrise .components-modal__frame input[type=checkbox]:checked,body.admin-color-sunrise .components-modal__frame input[type=radio]:checked,body.admin-color-sunrise .components-popover input[type=checkbox]:checked,body.admin-color-sunrise .components-popover input[type=radio]:checked,body.admin-color-sunrise .edit-post-header input[type=checkbox]:checked,body.admin-color-sunrise .edit-post-header input[type=radio]:checked,body.admin-color-sunrise .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-sunrise .edit-post-sidebar input[type=radio]:checked,body.admin-color-sunrise .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-sunrise .edit-post-text-editor input[type=radio]:checked,body.admin-color-sunrise .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-sunrise .edit-post-visual-editor input[type=radio]:checked,body.admin-color-sunrise .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-sunrise .editor-post-publish-panel input[type=radio]:checked{background:#c8b03c;border-color:#c8b03c}body.admin-color-ocean .components-modal__frame input[type=checkbox]:checked,body.admin-color-ocean .components-modal__frame input[type=radio]:checked,body.admin-color-ocean .components-popover input[type=checkbox]:checked,body.admin-color-ocean .components-popover input[type=radio]:checked,body.admin-color-ocean .edit-post-header input[type=checkbox]:checked,body.admin-color-ocean .edit-post-header input[type=radio]:checked,body.admin-color-ocean .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-ocean .edit-post-sidebar input[type=radio]:checked,body.admin-color-ocean .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-ocean .edit-post-text-editor input[type=radio]:checked,body.admin-color-ocean .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-ocean .edit-post-visual-editor input[type=radio]:checked,body.admin-color-ocean .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-ocean .editor-post-publish-panel input[type=radio]:checked{background:#a3b9a2;border-color:#a3b9a2}body.admin-color-midnight .components-modal__frame input[type=checkbox]:checked,body.admin-color-midnight .components-modal__frame input[type=radio]:checked,body.admin-color-midnight .components-popover input[type=checkbox]:checked,body.admin-color-midnight .components-popover input[type=radio]:checked,body.admin-color-midnight .edit-post-header input[type=checkbox]:checked,body.admin-color-midnight .edit-post-header input[type=radio]:checked,body.admin-color-midnight .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-midnight .edit-post-sidebar input[type=radio]:checked,body.admin-color-midnight .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-midnight .edit-post-text-editor input[type=radio]:checked,body.admin-color-midnight .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-midnight .edit-post-visual-editor input[type=radio]:checked,body.admin-color-midnight .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-midnight .editor-post-publish-panel input[type=radio]:checked{background:#77a6b9;border-color:#77a6b9}body.admin-color-ectoplasm .components-modal__frame input[type=checkbox]:checked,body.admin-color-ectoplasm .components-modal__frame input[type=radio]:checked,body.admin-color-ectoplasm .components-popover input[type=checkbox]:checked,body.admin-color-ectoplasm .components-popover input[type=radio]:checked,body.admin-color-ectoplasm .edit-post-header input[type=checkbox]:checked,body.admin-color-ectoplasm .edit-post-header input[type=radio]:checked,body.admin-color-ectoplasm .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-ectoplasm .edit-post-sidebar input[type=radio]:checked,body.admin-color-ectoplasm .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-ectoplasm .edit-post-text-editor input[type=radio]:checked,body.admin-color-ectoplasm .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-ectoplasm .edit-post-visual-editor input[type=radio]:checked,body.admin-color-ectoplasm .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-ectoplasm .editor-post-publish-panel input[type=radio]:checked{background:#a7b656;border-color:#a7b656}body.admin-color-coffee .components-modal__frame input[type=checkbox]:checked,body.admin-color-coffee .components-modal__frame input[type=radio]:checked,body.admin-color-coffee .components-popover input[type=checkbox]:checked,body.admin-color-coffee .components-popover input[type=radio]:checked,body.admin-color-coffee .edit-post-header input[type=checkbox]:checked,body.admin-color-coffee .edit-post-header input[type=radio]:checked,body.admin-color-coffee .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-coffee .edit-post-sidebar input[type=radio]:checked,body.admin-color-coffee .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-coffee .edit-post-text-editor input[type=radio]:checked,body.admin-color-coffee .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-coffee .edit-post-visual-editor input[type=radio]:checked,body.admin-color-coffee .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-coffee .editor-post-publish-panel input[type=radio]:checked{background:#c2a68c;border-color:#c2a68c}body.admin-color-blue .components-modal__frame input[type=checkbox]:checked,body.admin-color-blue .components-modal__frame input[type=radio]:checked,body.admin-color-blue .components-popover input[type=checkbox]:checked,body.admin-color-blue .components-popover input[type=radio]:checked,body.admin-color-blue .edit-post-header input[type=checkbox]:checked,body.admin-color-blue .edit-post-header input[type=radio]:checked,body.admin-color-blue .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-blue .edit-post-sidebar input[type=radio]:checked,body.admin-color-blue .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-blue .edit-post-text-editor input[type=radio]:checked,body.admin-color-blue .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-blue .edit-post-visual-editor input[type=radio]:checked,body.admin-color-blue .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-blue .editor-post-publish-panel input[type=radio]:checked{background:#82b4cb;border-color:#82b4cb}body.admin-color-light .components-modal__frame input[type=checkbox]:checked,body.admin-color-light .components-modal__frame input[type=radio]:checked,body.admin-color-light .components-popover input[type=checkbox]:checked,body.admin-color-light .components-popover input[type=radio]:checked,body.admin-color-light .edit-post-header input[type=checkbox]:checked,body.admin-color-light .edit-post-header input[type=radio]:checked,body.admin-color-light .edit-post-sidebar input[type=checkbox]:checked,body.admin-color-light .edit-post-sidebar input[type=radio]:checked,body.admin-color-light .edit-post-text-editor input[type=checkbox]:checked,body.admin-color-light .edit-post-text-editor input[type=radio]:checked,body.admin-color-light .edit-post-visual-editor input[type=checkbox]:checked,body.admin-color-light .edit-post-visual-editor input[type=radio]:checked,body.admin-color-light .editor-post-publish-panel input[type=checkbox]:checked,body.admin-color-light .editor-post-publish-panel input[type=radio]:checked{background:#11a0d2;border-color:#11a0d2}.components-modal__frame input[type=checkbox]:checked:focus,.components-modal__frame input[type=radio]:checked:focus,.components-popover input[type=checkbox]:checked:focus,.components-popover input[type=radio]:checked:focus,.edit-post-header input[type=checkbox]:checked:focus,.edit-post-header input[type=radio]:checked:focus,.edit-post-sidebar input[type=checkbox]:checked:focus,.edit-post-sidebar input[type=radio]:checked:focus,.edit-post-text-editor input[type=checkbox]:checked:focus,.edit-post-text-editor input[type=radio]:checked:focus,.edit-post-visual-editor input[type=checkbox]:checked:focus,.edit-post-visual-editor input[type=radio]:checked:focus,.editor-post-publish-panel input[type=checkbox]:checked:focus,.editor-post-publish-panel input[type=radio]:checked:focus{box-shadow:0 0 0 2px #555d66}.components-modal__frame input[type=checkbox],.components-popover input[type=checkbox],.edit-post-header input[type=checkbox],.edit-post-sidebar input[type=checkbox],.edit-post-text-editor input[type=checkbox],.edit-post-visual-editor input[type=checkbox],.editor-post-publish-panel input[type=checkbox]{border-radius:2px}.components-modal__frame input[type=checkbox]:checked:before,.components-modal__frame input[type=checkbox][aria-checked=mixed]:before,.components-popover input[type=checkbox]:checked:before,.components-popover input[type=checkbox][aria-checked=mixed]:before,.edit-post-header input[type=checkbox]:checked:before,.edit-post-header input[type=checkbox][aria-checked=mixed]:before,.edit-post-sidebar input[type=checkbox]:checked:before,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:before,.edit-post-text-editor input[type=checkbox]:checked:before,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:before,.edit-post-visual-editor input[type=checkbox]:checked:before,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:before,.editor-post-publish-panel input[type=checkbox]:checked:before,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:before{margin:-3px -5px;color:#fff}@media (min-width:782px){.components-modal__frame input[type=checkbox]:checked:before,.components-modal__frame input[type=checkbox][aria-checked=mixed]:before,.components-popover input[type=checkbox]:checked:before,.components-popover input[type=checkbox][aria-checked=mixed]:before,.edit-post-header input[type=checkbox]:checked:before,.edit-post-header input[type=checkbox][aria-checked=mixed]:before,.edit-post-sidebar input[type=checkbox]:checked:before,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:before,.edit-post-text-editor input[type=checkbox]:checked:before,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:before,.edit-post-visual-editor input[type=checkbox]:checked:before,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:before,.editor-post-publish-panel input[type=checkbox]:checked:before,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:before{margin:-4px 0 0 -5px}}.components-modal__frame input[type=checkbox][aria-checked=mixed],.components-popover input[type=checkbox][aria-checked=mixed],.edit-post-header input[type=checkbox][aria-checked=mixed],.edit-post-sidebar input[type=checkbox][aria-checked=mixed],.edit-post-text-editor input[type=checkbox][aria-checked=mixed],.edit-post-visual-editor input[type=checkbox][aria-checked=mixed],.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#11a0d2;border-color:#11a0d2}body.admin-color-sunrise .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-sunrise .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#c8b03c;border-color:#c8b03c}body.admin-color-ocean .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-ocean .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#a3b9a2;border-color:#a3b9a2}body.admin-color-midnight .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-midnight .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#77a6b9;border-color:#77a6b9}body.admin-color-ectoplasm .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-ectoplasm .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#a7b656;border-color:#a7b656}body.admin-color-coffee .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-coffee .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#c2a68c;border-color:#c2a68c}body.admin-color-blue .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-blue .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-blue .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-blue .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-blue .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-blue .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-blue .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#82b4cb;border-color:#82b4cb}body.admin-color-light .components-modal__frame input[type=checkbox][aria-checked=mixed],body.admin-color-light .components-popover input[type=checkbox][aria-checked=mixed],body.admin-color-light .edit-post-header input[type=checkbox][aria-checked=mixed],body.admin-color-light .edit-post-sidebar input[type=checkbox][aria-checked=mixed],body.admin-color-light .edit-post-text-editor input[type=checkbox][aria-checked=mixed],body.admin-color-light .edit-post-visual-editor input[type=checkbox][aria-checked=mixed],body.admin-color-light .editor-post-publish-panel input[type=checkbox][aria-checked=mixed]{background:#11a0d2;border-color:#11a0d2}.components-modal__frame input[type=checkbox][aria-checked=mixed]:before,.components-popover input[type=checkbox][aria-checked=mixed]:before,.edit-post-header input[type=checkbox][aria-checked=mixed]:before,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:before,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:before,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:before,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:before{content:"\f460";float:left;display:inline-block;vertical-align:middle;width:16px;font:normal 30px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.components-modal__frame input[type=checkbox][aria-checked=mixed]:before,.components-popover input[type=checkbox][aria-checked=mixed]:before,.edit-post-header input[type=checkbox][aria-checked=mixed]:before,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:before,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:before,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:before,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:before{float:none;font-size:21px}}.components-modal__frame input[type=checkbox][aria-checked=mixed]:focus,.components-popover input[type=checkbox][aria-checked=mixed]:focus,.edit-post-header input[type=checkbox][aria-checked=mixed]:focus,.edit-post-sidebar input[type=checkbox][aria-checked=mixed]:focus,.edit-post-text-editor input[type=checkbox][aria-checked=mixed]:focus,.edit-post-visual-editor input[type=checkbox][aria-checked=mixed]:focus,.editor-post-publish-panel input[type=checkbox][aria-checked=mixed]:focus{box-shadow:0 0 0 2px #555d66}.components-modal__frame input[type=radio],.components-popover input[type=radio],.edit-post-header input[type=radio],.edit-post-sidebar input[type=radio],.edit-post-text-editor input[type=radio],.edit-post-visual-editor input[type=radio],.editor-post-publish-panel input[type=radio]{border-radius:50%}.components-modal__frame input[type=radio]:checked:before,.components-popover input[type=radio]:checked:before,.edit-post-header input[type=radio]:checked:before,.edit-post-sidebar input[type=radio]:checked:before,.edit-post-text-editor input[type=radio]:checked:before,.edit-post-visual-editor input[type=radio]:checked:before,.editor-post-publish-panel input[type=radio]:checked:before{width:6px;height:6px;margin:6px 0 0 6px;background-color:#fff}@media (min-width:782px){.components-modal__frame input[type=radio]:checked:before,.components-popover input[type=radio]:checked:before,.edit-post-header input[type=radio]:checked:before,.edit-post-sidebar input[type=radio]:checked:before,.edit-post-text-editor input[type=radio]:checked:before,.edit-post-visual-editor input[type=radio]:checked:before,.editor-post-publish-panel input[type=radio]:checked:before{margin:3px 0 0 3px}}.components-modal__frame input::-webkit-input-placeholder,.components-modal__frame textarea::-webkit-input-placeholder,.components-popover input::-webkit-input-placeholder,.components-popover textarea::-webkit-input-placeholder,.edit-post-header input::-webkit-input-placeholder,.edit-post-header textarea::-webkit-input-placeholder,.edit-post-sidebar input::-webkit-input-placeholder,.edit-post-sidebar textarea::-webkit-input-placeholder,.edit-post-text-editor input::-webkit-input-placeholder,.edit-post-text-editor textarea::-webkit-input-placeholder,.edit-post-visual-editor input::-webkit-input-placeholder,.edit-post-visual-editor textarea::-webkit-input-placeholder,.editor-post-publish-panel input::-webkit-input-placeholder,.editor-post-publish-panel textarea::-webkit-input-placeholder{color:rgba(14,28,46,.62)}.components-modal__frame input::-moz-placeholder,.components-modal__frame textarea::-moz-placeholder,.components-popover input::-moz-placeholder,.components-popover textarea::-moz-placeholder,.edit-post-header input::-moz-placeholder,.edit-post-header textarea::-moz-placeholder,.edit-post-sidebar input::-moz-placeholder,.edit-post-sidebar textarea::-moz-placeholder,.edit-post-text-editor input::-moz-placeholder,.edit-post-text-editor textarea::-moz-placeholder,.edit-post-visual-editor input::-moz-placeholder,.edit-post-visual-editor textarea::-moz-placeholder,.editor-post-publish-panel input::-moz-placeholder,.editor-post-publish-panel textarea::-moz-placeholder{opacity:1;color:rgba(14,28,46,.62)}.components-modal__frame input:-ms-input-placeholder,.components-modal__frame textarea:-ms-input-placeholder,.components-popover input:-ms-input-placeholder,.components-popover textarea:-ms-input-placeholder,.edit-post-header input:-ms-input-placeholder,.edit-post-header textarea:-ms-input-placeholder,.edit-post-sidebar input:-ms-input-placeholder,.edit-post-sidebar textarea:-ms-input-placeholder,.edit-post-text-editor input:-ms-input-placeholder,.edit-post-text-editor textarea:-ms-input-placeholder,.edit-post-visual-editor input:-ms-input-placeholder,.edit-post-visual-editor textarea:-ms-input-placeholder,.editor-post-publish-panel input:-ms-input-placeholder,.editor-post-publish-panel textarea:-ms-input-placeholder{color:rgba(14,28,46,.62)}.is-dark-theme .components-modal__frame input::-webkit-input-placeholder,.is-dark-theme .components-modal__frame textarea::-webkit-input-placeholder,.is-dark-theme .components-popover input::-webkit-input-placeholder,.is-dark-theme .components-popover textarea::-webkit-input-placeholder,.is-dark-theme .edit-post-header input::-webkit-input-placeholder,.is-dark-theme .edit-post-header textarea::-webkit-input-placeholder,.is-dark-theme .edit-post-sidebar input::-webkit-input-placeholder,.is-dark-theme .edit-post-sidebar textarea::-webkit-input-placeholder,.is-dark-theme .edit-post-text-editor input::-webkit-input-placeholder,.is-dark-theme .edit-post-text-editor textarea::-webkit-input-placeholder,.is-dark-theme .edit-post-visual-editor input::-webkit-input-placeholder,.is-dark-theme .edit-post-visual-editor textarea::-webkit-input-placeholder,.is-dark-theme .editor-post-publish-panel input::-webkit-input-placeholder,.is-dark-theme .editor-post-publish-panel textarea::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-modal__frame input::-moz-placeholder,.is-dark-theme .components-modal__frame textarea::-moz-placeholder,.is-dark-theme .components-popover input::-moz-placeholder,.is-dark-theme .components-popover textarea::-moz-placeholder,.is-dark-theme .edit-post-header input::-moz-placeholder,.is-dark-theme .edit-post-header textarea::-moz-placeholder,.is-dark-theme .edit-post-sidebar input::-moz-placeholder,.is-dark-theme .edit-post-sidebar textarea::-moz-placeholder,.is-dark-theme .edit-post-text-editor input::-moz-placeholder,.is-dark-theme .edit-post-text-editor textarea::-moz-placeholder,.is-dark-theme .edit-post-visual-editor input::-moz-placeholder,.is-dark-theme .edit-post-visual-editor textarea::-moz-placeholder,.is-dark-theme .editor-post-publish-panel input::-moz-placeholder,.is-dark-theme .editor-post-publish-panel textarea::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-modal__frame input:-ms-input-placeholder,.is-dark-theme .components-modal__frame textarea:-ms-input-placeholder,.is-dark-theme .components-popover input:-ms-input-placeholder,.is-dark-theme .components-popover textarea:-ms-input-placeholder,.is-dark-theme .edit-post-header input:-ms-input-placeholder,.is-dark-theme .edit-post-header textarea:-ms-input-placeholder,.is-dark-theme .edit-post-sidebar input:-ms-input-placeholder,.is-dark-theme .edit-post-sidebar textarea:-ms-input-placeholder,.is-dark-theme .edit-post-text-editor input:-ms-input-placeholder,.is-dark-theme .edit-post-text-editor textarea:-ms-input-placeholder,.is-dark-theme .edit-post-visual-editor input:-ms-input-placeholder,.is-dark-theme .edit-post-visual-editor textarea:-ms-input-placeholder,.is-dark-theme .editor-post-publish-panel input:-ms-input-placeholder,.is-dark-theme .editor-post-publish-panel textarea:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}@media (min-width:600px){.block-editor__container{position:absolute;top:0;right:0;bottom:0;left:0;min-height:calc(100vh - 46px)}}@media (min-width:782px){.block-editor__container{min-height:calc(100vh - 32px)}body.is-fullscreen-mode .block-editor__container{min-height:100vh}}.block-editor__container img{max-width:100%;height:auto}.block-editor__container iframe{width:100%}.block-editor__container .components-navigate-regions{height:100%}.wp-block{max-width:580px}.wp-block[data-align=wide]{max-width:1100px}.wp-block[data-align=full]{max-width:none} \ No newline at end of file diff --git a/wp-includes/css/dist/editor/editor-styles-rtl.css b/wp-includes/css/dist/editor/editor-styles-rtl.css new file mode 100644 index 0000000..d24b8f9 --- /dev/null +++ b/wp-includes/css/dist/editor/editor-styles-rtl.css @@ -0,0 +1,148 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +/** + * Editor Normalization Styles + * + * These are only output in the editor, but styles here are prefixed .editor-styles-wrapper and affect the theming + * of the editor by themes. + * Why do these exist? Why not rely on browser defaults? + * These styles are necessary so long as CSS can bleed from the wp-admin into the editing canvas itself. + * Let's continue working to refactor these away, whether through Shadow DOM or better scoping of upstream styles. + */ +body { + font-family: "Noto Serif", serif; + font-size: 16px; + line-height: 1.8; + color: #191e23; } + +/* Headings */ +h1 { + font-size: 2.44em; } + +h2 { + font-size: 1.95em; } + +h3 { + font-size: 1.56em; } + +h4 { + font-size: 1.25em; } + +h5 { + font-size: 1em; } + +h6 { + font-size: 0.8em; } + +h1, +h2, +h3 { + line-height: 1.4; } + +h4 { + line-height: 1.5; } + +h1 { + margin-top: 0.67em; + margin-bottom: 0.67em; } + +h2 { + margin-top: 0.83em; + margin-bottom: 0.83em; } + +h3 { + margin-top: 1em; + margin-bottom: 1em; } + +h4 { + margin-top: 1.33em; + margin-bottom: 1.33em; } + +h5 { + margin-top: 1.67em; + margin-bottom: 1.67em; } + +h6 { + margin-top: 2.33em; + margin-bottom: 2.33em; } + +h1, +h2, +h3, +h4, +h5, +h6 { + color: inherit; } + +p { + font-size: inherit; + line-height: inherit; + margin-top: 28px; + margin-bottom: 28px; } + +ul, +ol { + margin-bottom: 28px; + padding: inherit; + padding-right: 1.3em; + margin-right: 1.3em; } + ul ul, + ul ol, + ol ul, + ol ol { + margin-bottom: 0; } + ul li, + ol li { + margin-bottom: initial; } + +ul { + list-style-type: disc; } + +ol { + list-style-type: decimal; } + +ul ul, +ol ul { + list-style-type: circle; } diff --git a/wp-includes/css/dist/editor/editor-styles-rtl.min.css b/wp-includes/css/dist/editor/editor-styles-rtl.min.css new file mode 100644 index 0000000..5d2d764 --- /dev/null +++ b/wp-includes/css/dist/editor/editor-styles-rtl.min.css @@ -0,0 +1 @@ +body{font-family:"Noto Serif",serif;font-size:16px;line-height:1.8;color:#191e23}h1{font-size:2.44em}h2{font-size:1.95em}h3{font-size:1.56em}h4{font-size:1.25em}h5{font-size:1em}h6{font-size:.8em}h1,h2,h3{line-height:1.4}h4{line-height:1.5}h1{margin-top:.67em;margin-bottom:.67em}h2{margin-top:.83em;margin-bottom:.83em}h3{margin-top:1em;margin-bottom:1em}h4{margin-top:1.33em;margin-bottom:1.33em}h5{margin-top:1.67em;margin-bottom:1.67em}h6{margin-top:2.33em;margin-bottom:2.33em}h1,h2,h3,h4,h5,h6{color:inherit}p{font-size:inherit;line-height:inherit;margin-top:28px}ol,p,ul{margin-bottom:28px}ol,ul{padding:inherit;padding-right:1.3em;margin-right:1.3em}ol li,ol ol,ol ul,ul li,ul ol,ul ul{margin-bottom:0}ul{list-style-type:disc}ol{list-style-type:decimal}ol ul,ul ul{list-style-type:circle} \ No newline at end of file diff --git a/wp-includes/css/dist/editor/editor-styles.css b/wp-includes/css/dist/editor/editor-styles.css new file mode 100644 index 0000000..dd90efe --- /dev/null +++ b/wp-includes/css/dist/editor/editor-styles.css @@ -0,0 +1,148 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +/** + * Editor Normalization Styles + * + * These are only output in the editor, but styles here are prefixed .editor-styles-wrapper and affect the theming + * of the editor by themes. + * Why do these exist? Why not rely on browser defaults? + * These styles are necessary so long as CSS can bleed from the wp-admin into the editing canvas itself. + * Let's continue working to refactor these away, whether through Shadow DOM or better scoping of upstream styles. + */ +body { + font-family: "Noto Serif", serif; + font-size: 16px; + line-height: 1.8; + color: #191e23; } + +/* Headings */ +h1 { + font-size: 2.44em; } + +h2 { + font-size: 1.95em; } + +h3 { + font-size: 1.56em; } + +h4 { + font-size: 1.25em; } + +h5 { + font-size: 1em; } + +h6 { + font-size: 0.8em; } + +h1, +h2, +h3 { + line-height: 1.4; } + +h4 { + line-height: 1.5; } + +h1 { + margin-top: 0.67em; + margin-bottom: 0.67em; } + +h2 { + margin-top: 0.83em; + margin-bottom: 0.83em; } + +h3 { + margin-top: 1em; + margin-bottom: 1em; } + +h4 { + margin-top: 1.33em; + margin-bottom: 1.33em; } + +h5 { + margin-top: 1.67em; + margin-bottom: 1.67em; } + +h6 { + margin-top: 2.33em; + margin-bottom: 2.33em; } + +h1, +h2, +h3, +h4, +h5, +h6 { + color: inherit; } + +p { + font-size: inherit; + line-height: inherit; + margin-top: 28px; + margin-bottom: 28px; } + +ul, +ol { + margin-bottom: 28px; + padding: inherit; + padding-left: 1.3em; + margin-left: 1.3em; } + ul ul, + ul ol, + ol ul, + ol ol { + margin-bottom: 0; } + ul li, + ol li { + margin-bottom: initial; } + +ul { + list-style-type: disc; } + +ol { + list-style-type: decimal; } + +ul ul, +ol ul { + list-style-type: circle; } diff --git a/wp-includes/css/dist/editor/editor-styles.min.css b/wp-includes/css/dist/editor/editor-styles.min.css new file mode 100644 index 0000000..2a7e1cb --- /dev/null +++ b/wp-includes/css/dist/editor/editor-styles.min.css @@ -0,0 +1 @@ +body{font-family:"Noto Serif",serif;font-size:16px;line-height:1.8;color:#191e23}h1{font-size:2.44em}h2{font-size:1.95em}h3{font-size:1.56em}h4{font-size:1.25em}h5{font-size:1em}h6{font-size:.8em}h1,h2,h3{line-height:1.4}h4{line-height:1.5}h1{margin-top:.67em;margin-bottom:.67em}h2{margin-top:.83em;margin-bottom:.83em}h3{margin-top:1em;margin-bottom:1em}h4{margin-top:1.33em;margin-bottom:1.33em}h5{margin-top:1.67em;margin-bottom:1.67em}h6{margin-top:2.33em;margin-bottom:2.33em}h1,h2,h3,h4,h5,h6{color:inherit}p{font-size:inherit;line-height:inherit;margin-top:28px}ol,p,ul{margin-bottom:28px}ol,ul{padding:inherit;padding-left:1.3em;margin-left:1.3em}ol li,ol ol,ol ul,ul li,ul ol,ul ul{margin-bottom:0}ul{list-style-type:disc}ol{list-style-type:decimal}ol ul,ul ul{list-style-type:circle} \ No newline at end of file diff --git a/wp-includes/css/dist/editor/style-rtl.css b/wp-includes/css/dist/editor/style-rtl.css new file mode 100644 index 0000000..0b435d1 --- /dev/null +++ b/wp-includes/css/dist/editor/style-rtl.css @@ -0,0 +1,833 @@ +@charset "UTF-8"; +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.editor-autocompleters__block .block-editor-block-icon { + margin-left: 8px; } + +.editor-autocompleters__user .editor-autocompleters__no-avatar::before { + /* stylelint-disable */ + font: normal 20px/1 dashicons; + /* stylelint-enable */ + content: "\f110"; + margin-left: 5px; + vertical-align: middle; } + +.editor-autocompleters__user .editor-autocompleters__user-avatar { + margin-left: 8px; + flex-grow: 0; + flex-shrink: 0; + max-width: none; + width: 24px; + height: 24px; } + +.editor-autocompleters__user .editor-autocompleters__user-name { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + max-width: 200px; + flex-shrink: 0; + flex-grow: 1; } + +.editor-autocompleters__user .editor-autocompleters__user-slug { + margin-right: 8px; + color: #8f98a1; + white-space: nowrap; + text-overflow: ellipsis; + overflow: none; + max-width: 100px; + flex-grow: 0; + flex-shrink: 0; } + +.editor-autocompleters__user:hover .editor-autocompleters__user-slug { + color: #66c6e4; } + +.document-outline { + margin: 20px 0; } + .document-outline ul { + margin: 0; + padding: 0; } + +.document-outline__item { + display: flex; + margin: 4px 0; } + .document-outline__item a { + text-decoration: none; } + .document-outline__item .document-outline__emdash::before { + color: #e2e4e7; + margin-left: 4px; } + .document-outline__item.is-h2 .document-outline__emdash::before { + content: "—"; } + .document-outline__item.is-h3 .document-outline__emdash::before { + content: "——"; } + .document-outline__item.is-h4 .document-outline__emdash::before { + content: "———"; } + .document-outline__item.is-h5 .document-outline__emdash::before { + content: "————"; } + .document-outline__item.is-h6 .document-outline__emdash::before { + content: "—————"; } + +.document-outline__button { + cursor: pointer; + background: none; + border: none; + display: flex; + align-items: flex-start; + margin: 0 -1px 0 0; + padding: 2px 1px 2px 5px; + color: #23282d; + text-align: right; } + .document-outline__button:disabled { + cursor: default; } + .document-outline__button:focus { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + +.document-outline__level { + background: #e2e4e7; + color: #23282d; + border-radius: 3px; + font-size: 13px; + padding: 1px 6px; + margin-left: 4px; } + .is-invalid .document-outline__level { + background: #f0b849; } + +.document-outline__item-content { + padding: 1px 0; } + +.components-editor-notices__dismissible { + position: -webkit-sticky; + position: sticky; + top: 56px; + left: 0; + color: #191e23; } + @media (min-width: 600px) { + .components-editor-notices__dismissible { + top: 0; } } + +.components-editor-notices__pinned { + position: relative; + right: 0; + top: 0; + left: 0; + color: #191e23; } + +.components-editor-notices__dismissible .components-notice, +.components-editor-notices__pinned .components-notice { + box-sizing: border-box; + margin: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding: 6px 12px; + min-height: 60px; } + .components-editor-notices__dismissible .components-notice .components-notice__dismiss, + .components-editor-notices__pinned .components-notice .components-notice__dismiss { + margin: 6px 5px 6px -5px; } + +.components-editor-notices__snackbar { + width: 100%; } + +.editor-entities-saved-states__save-button { + display: block; + margin-right: auto; + margin-left: 0; } + +.editor-error-boundary { + margin: auto; + max-width: 780px; + padding: 20px; + margin-top: 60px; + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.2); } + +.editor-page-attributes__template { + margin-bottom: 10px; } + .editor-page-attributes__template label, + .editor-page-attributes__template select { + width: 100%; } + +.editor-page-attributes__order { + width: 100%; } + .editor-page-attributes__order .components-base-control__field { + display: flex; + justify-content: space-between; + align-items: center; } + .editor-page-attributes__order input { + width: 66px; } + +.editor-post-excerpt__textarea { + width: 100%; + margin-bottom: 10px; } + +.editor-post-featured-image { + padding: 0; } + .editor-post-featured-image__container { + margin-bottom: 1em; + position: relative; } + .editor-post-featured-image .components-spinner { + position: absolute; + top: 50%; + right: 50%; + margin-top: -9px; + margin-right: -9px; } + .editor-post-featured-image .components-button + .components-button { + display: block; + margin-top: 1em; } + .editor-post-featured-image .components-responsive-wrapper__content { + max-width: 100%; + width: auto; } + +.editor-post-featured-image__toggle, +.editor-post-featured-image__preview { + display: block; + width: 100%; + padding: 0; + transition: all 0.1s ease-out; + box-shadow: 0 0 0 0 #00a0d2; } + @media (prefers-reduced-motion: reduce) { + .editor-post-featured-image__toggle, + .editor-post-featured-image__preview { + transition-duration: 0s; } } + +.editor-post-featured-image__preview { + height: auto; } + +.editor-post-featured-image__preview:not(:disabled):not([aria-disabled="true"]):focus { + box-shadow: 0 0 0 4px #00a0d2; } + +.editor-post-featured-image__toggle { + border: 1px dashed #a2aab2; + background-color: #edeff0; + min-height: 90px; + line-height: 20px; + padding: 8px 0; + text-align: center; } + .editor-post-featured-image__toggle:hover { + background-color: #f8f9f9; } + +.editor-post-format { + flex-direction: column; + align-items: stretch; + width: 100%; } + +.editor-post-format__content { + display: inline-flex; + justify-content: space-between; + align-items: center; + width: 100%; } + +.editor-post-format__suggestion { + text-align: left; + font-size: 13px; } + +.editor-post-last-revision__title { + width: 100%; + font-weight: 600; } + .editor-post-last-revision__title .dashicon { + margin-left: 5px; } + +.components-button:not(:disabled):not([aria-disabled="true"]).editor-post-last-revision__title { + height: auto; } + .components-button:not(:disabled):not([aria-disabled="true"]).editor-post-last-revision__title:hover, .components-button:not(:disabled):not([aria-disabled="true"]).editor-post-last-revision__title:active { + background: #f3f4f5 !important; + border: none !important; + box-shadow: none !important; } + .components-button:not(:disabled):not([aria-disabled="true"]).editor-post-last-revision__title:focus { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + +.editor-post-locked-modal { + height: auto; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; + max-width: 480px; } + .editor-post-locked-modal .components-modal__header { + height: 36px; } + .editor-post-locked-modal .components-modal__content { + height: auto; } + +.editor-post-locked-modal__buttons { + margin-top: 10px; } + .editor-post-locked-modal__buttons .components-button { + margin-left: 5px; } + +.editor-post-locked-modal__avatar { + float: right; + margin: 5px; + margin-left: 15px; } + +.editor-post-permalink { + display: inline-flex; + align-items: center; + flex-wrap: wrap; + background: #fff; + padding: 8px 8px 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + height: 40px; + white-space: nowrap; + border: 1px solid #b5bcc2; + background-clip: padding-box; + border-right: 0; + box-shadow: 3px 0 0 0 #555d66; + outline: 1px solid transparent; + margin-right: -15px; + margin-left: -15px; } + .is-dark-theme .editor-post-permalink { + box-shadow: 3px 0 0 0 #d7dade; } + @media (min-width: 480px) { + .editor-post-permalink { + padding: 4px; } } + @media (min-width: 600px) { + .editor-post-permalink { + margin-right: -1px; + margin-left: -1px; } } + .editor-post-permalink.editor-post-permalink > * { + margin-bottom: 8px; } + @media (min-width: 480px) { + .editor-post-permalink.editor-post-permalink > * { + margin-bottom: 0; } } + .editor-post-permalink button { + flex-shrink: 0; } + +.editor-post-permalink__copy { + border-radius: 4px; + padding: 6px; } + +.editor-post-permalink__copy.is-copied { + opacity: 0.3; } + +.editor-post-permalink__label { + margin: 0 5px 0 10px; + font-weight: 600; } + +.editor-post-permalink__link { + color: #7e8993; + text-decoration: underline; + margin-left: 10px; + flex-grow: 1; + overflow: hidden; + position: relative; + white-space: nowrap; + text-align: right; } + +.editor-post-permalink-editor { + width: 100%; + min-width: 20%; + display: inline-flex; + align-items: center; } + .editor-post-permalink-editor .editor-post-permalink__editor-container { + flex: 0 1 100%; + display: flex; + overflow: hidden; + padding: 1px 0; } + .editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__prefix { + flex: 1 1 auto; } + @media (min-width: 600px) { + .editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__prefix { + flex: 1 0 auto; } } + .editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__edit { + flex: 1 1 100%; } + .editor-post-permalink-editor .editor-post-permalink-editor__save { + margin-right: auto; } + +.editor-post-permalink-editor__prefix { + color: #6c7781; + min-width: 20%; + overflow: hidden; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; } + +.editor-post-permalink input[type="text"].editor-post-permalink-editor__edit { + min-width: 10%; + width: 100%; + margin: 0 3px; + padding: 2px 4px; } + +.editor-post-permalink-editor__suffix { + color: #6c7781; + margin-left: 6px; + flex: 0 0 0%; } + +.editor-post-permalink-editor__prefix { + text-align: right; } +.editor-post-permalink__link { + text-align: left; } + +.editor-post-permalink__editor-container, +.editor-post-permalink__link { + direction: ltr; } + +.editor-post-permalink__link::after { + content: ""; + display: block; + position: absolute; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + background: linear-gradient(to right, rgba(255, 255, 255, 0), #fff 90%); + top: 0; + bottom: 0; + right: 0; + left: auto; + width: 20%; + height: auto; } +.editor-post-publish-button__button.has-changes-dot::before { + background: currentcolor; + border-radius: 4px; + content: ""; + height: 8px; + margin: auto -3px auto 5px; + width: 8px; } + +.editor-post-publish-panel { + background: #fff; } + +.editor-post-publish-panel__content { + min-height: calc(100% - 140px); } + .editor-post-publish-panel__content .components-spinner { + display: block; + margin: 100px auto 0; } + +.editor-post-publish-panel__header { + background: #fff; + padding-right: 8px; + padding-left: 8px; + height: 56px; + border-bottom: 1px solid #e2e4e7; + display: flex; + align-items: center; + align-content: space-between; } + .editor-post-publish-panel__header .components-button.has-icon { + position: absolute; + left: 8px; } + +.editor-post-publish-panel__header-publish-button { + display: flex; + justify-content: flex-end; + flex-grow: 1; + text-align: left; + flex-wrap: nowrap; } + +.editor-post-publish-panel__header-published { + flex-grow: 1; } + +.editor-post-publish-panel__footer { + padding: 16px; } + +.components-button.editor-post-publish-panel__toggle.is-primary { + display: inline-flex; + align-items: center; } + .components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon { + display: none; } + .components-button.editor-post-publish-panel__toggle.is-primary .dashicon { + margin-left: -4px; } + +.editor-post-publish-panel__link { + font-weight: 400; + padding-right: 4px; } + +.editor-post-publish-panel__prepublish { + padding: 16px; } + .editor-post-publish-panel__prepublish strong { + color: #191e23; } + .editor-post-publish-panel__prepublish .components-panel__body { + background: #fff; + margin-right: -16px; + margin-left: -16px; } + .editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend { + display: none; } + .editor-post-publish-panel__prepublish .components-datetime { + padding: 0; } + +.post-publish-panel__postpublish .components-panel__body { + border-bottom: 1px solid #e2e4e7; + border-top: none; } + +.post-publish-panel__postpublish-buttons { + display: flex; + align-content: space-between; + flex-wrap: wrap; + margin: -5px; } + .post-publish-panel__postpublish-buttons > * { + flex-grow: 1; + margin: 5px; } + .post-publish-panel__postpublish-buttons .components-button { + height: auto; + justify-content: center; + padding: 3px 10px 4px; + line-height: 1.6; + text-align: center; + white-space: normal; } + .post-publish-panel__postpublish-buttons .components-clipboard-button { + width: 100%; } + +.post-publish-panel__postpublish-post-address { + margin-bottom: 16px; } + .post-publish-panel__postpublish-post-address input[readonly] { + padding: 10px; + background: #e8eaeb; + overflow: hidden; + text-overflow: ellipsis; } + +.post-publish-panel__postpublish-header { + font-weight: 500; } + +.post-publish-panel__postpublish-subheader { + margin: 0 0 8px; } + +.post-publish-panel__tip { + color: #f0b849; } + +.editor-post-saved-state { + display: flex; + align-items: center; + width: 28px; + padding: 12px 4px; + color: #555d66; + overflow: hidden; + white-space: nowrap; } + .editor-post-saved-state svg { + display: inline-block; + flex: 0 0 auto; + margin-left: 4px; + fill: currentColor; } + @media (min-width: 600px) { + .editor-post-saved-state { + width: auto; + padding: 8px 12px; + text-indent: inherit; } + .editor-post-saved-state .dashicon { + margin-left: 4px; } } + +.edit-post-header .edit-post-header__settings .components-button.editor-post-save-draft { + margin: 0; } + +.editor-post-taxonomies__hierarchical-terms-list { + max-height: 14em; + overflow: auto; + padding-right: 2px; } + +.editor-post-taxonomies__hierarchical-terms-choice { + margin-bottom: 8px; } + +.editor-post-taxonomies__hierarchical-terms-subchoices { + margin-top: 8px; + margin-right: 16px; } + +.components-button.editor-post-taxonomies__hierarchical-terms-submit, +.components-button.editor-post-taxonomies__hierarchical-terms-add { + margin-top: 12px; } + +.editor-post-taxonomies__hierarchical-terms-label { + display: inline-block; + margin-top: 12px; } + +.editor-post-taxonomies__hierarchical-terms-input { + margin-top: 8px; + width: 100%; } + +.editor-post-taxonomies__hierarchical-terms-filter { + margin-bottom: 8px; + width: 100%; } + +.editor-post-text-editor { + border: 1px solid #e2e4e7 !important; + display: block; + margin: 0 0 2em; + width: 100%; + box-shadow: none; + resize: none; + overflow: hidden; + font-family: Menlo, Consolas, monaco, monospace !important; + line-height: 150%; + border-radius: 0 !important; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px !important; } + @media (min-width: 600px) { + .editor-post-text-editor { + font-size: 14px !important; } } + .editor-post-text-editor:hover, .editor-post-text-editor:focus { + border: 1px solid #b5bcc2 !important; + box-shadow: none !important; + outline-offset: -2px !important; } + +.editor-post-text-editor__toolbar { + display: flex; + flex-direction: row; + flex-wrap: wrap; } + .editor-post-text-editor__toolbar button { + height: 30px; + background: none; + padding: 0 8px; + margin: 3px 4px; + text-align: center; + cursor: pointer; + font-family: Menlo, Consolas, monaco, monospace; + color: #555d66; + border: 1px solid transparent; } + .editor-post-text-editor__toolbar button:first-child { + margin-right: 0; } + .editor-post-text-editor__toolbar button:hover, .editor-post-text-editor__toolbar button:focus { + outline: none; + border: 1px solid #555d66; } + +.editor-post-text-editor__bold { + font-weight: 600; } + +.editor-post-text-editor__italic { + font-style: italic; } + +.editor-post-text-editor__link { + text-decoration: underline; + color: #0085ba; } + +body.admin-color-sunrise .editor-post-text-editor__link{ + color: #d1864a; } + +body.admin-color-ocean .editor-post-text-editor__link{ + color: #a3b9a2; } + +body.admin-color-midnight .editor-post-text-editor__link{ + color: #e14d43; } + +body.admin-color-ectoplasm .editor-post-text-editor__link{ + color: #a7b656; } + +body.admin-color-coffee .editor-post-text-editor__link{ + color: #c2a68c; } + +body.admin-color-blue .editor-post-text-editor__link{ + color: #82b4cb; } + +body.admin-color-light .editor-post-text-editor__link{ + color: #0085ba; } + +.editor-post-text-editor__del { + text-decoration: line-through; } + +.edit-post-post-visibility__dialog, +.editor-post-visibility__dialog-fieldset { + padding: 4px; + padding-top: 0; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-legend, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-legend { + font-weight: 600; + margin-bottom: 1em; + margin-top: 0.5em; + padding: 0; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio { + margin-top: 2px; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-label, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-label { + font-weight: 600; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-info, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-info { + margin-top: 0; + margin-right: 28px; } + .edit-post-post-visibility__dialog .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info { + margin-bottom: 0; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-password-input, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-password-input { + margin-right: 28px; } + +.editor-post-title__block { + position: relative; + padding: 5px 0; + font-size: 16px; } + @media (min-width: 600px) { + .editor-post-title__block { + padding: 5px 2px; } } + .editor-post-title__block .editor-post-title__input { + display: block; + width: 100%; + margin: 0; + box-shadow: none; + background: transparent; + font-family: "Noto Serif", serif; + line-height: 1.4; + color: #191e23; + transition: border 0.1s ease-out, box-shadow 0.1s linear; + padding: 19px 14px; + word-break: keep-all; + border: 1px solid transparent; + border-right-width: 0; + border-left-width: 0; + border-radius: 0; + outline: 1px solid transparent; + font-size: 2.44em; + font-weight: 600; } + @media (prefers-reduced-motion: reduce) { + .editor-post-title__block .editor-post-title__input { + transition-duration: 0s; } } + @media (min-width: 600px) { + .editor-post-title__block .editor-post-title__input { + border-width: 1px; + border-right-width: 0; } } + .editor-post-title__block .editor-post-title__input::-webkit-input-placeholder { + color: rgba(22, 36, 53, 0.55); } + .editor-post-title__block .editor-post-title__input::-moz-placeholder { + color: rgba(22, 36, 53, 0.55); } + .editor-post-title__block .editor-post-title__input:-ms-input-placeholder { + color: rgba(22, 36, 53, 0.55); } + .editor-post-title__block .editor-post-title__input:focus { + border: 1px solid transparent; + border-right-width: 0; + outline: 1px solid transparent; + box-shadow: none; } + .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input { + border-color: rgba(66, 88, 99, 0.4); + box-shadow: inset -3px 0 0 0 #555d66; } + .is-dark-theme .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input { + border-color: rgba(255, 255, 255, 0.45); + box-shadow: inset -3px 0 0 0 #d7dade; } + @media (min-width: 600px) { + .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input { + box-shadow: 3px 0 0 0 #555d66; } + .is-dark-theme .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input { + box-shadow: 3px 0 0 0 #d7dade; } } + .editor-post-title__block.is-focus-mode .editor-post-title__input { + opacity: 0.5; + transition: opacity 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .editor-post-title__block.is-focus-mode .editor-post-title__input { + transition-duration: 0s; } } + .editor-post-title__block.is-focus-mode .editor-post-title__input:focus { + opacity: 1; } + +.editor-post-title .editor-post-permalink { + font-size: 13px; + color: #191e23; + height: auto; + position: relative; + right: 3px; + top: -2px; + width: calc(100% - 3px); } + @media (min-width: 480px) { + .editor-post-title .editor-post-permalink { + position: absolute; + top: -34px; + left: 0; + flex-wrap: nowrap; + width: auto; } } + @media (min-width: 600px) { + .editor-post-title .editor-post-permalink { + right: 2px; + left: 2px; } } + +.editor-post-trash.components-button { + color: #b52727; + border-color: #b52727; + justify-content: center; } + .editor-post-trash.components-button:not(:disabled):not([aria-disabled="true"]):hover, .editor-post-trash.components-button:not([aria-disabled="true"]):focus { + color: #a02222; + border-color: #a02222; } + +.table-of-contents__popover.components-popover .components-popover__content { + min-width: 380px; } + +.components-popover.table-of-contents__popover { + z-index: 99998; } + +.table-of-contents__popover .components-popover__content { + padding: 16px; } + @media (min-width: 600px) { + .table-of-contents__popover .components-popover__content { + max-height: calc(100vh - 120px); + overflow-y: auto; } } + +.table-of-contents__popover hr { + margin: 10px -16px 0; } + +.table-of-contents__wrapper:focus { + color: #191e23; + outline-offset: -1px; + outline: 1px dotted #555d66; + outline-offset: 8px; } + +.table-of-contents__counts { + display: flex; + flex-wrap: wrap; + margin: 0; } + +.table-of-contents__count { + flex-basis: 25%; + display: flex; + flex-direction: column; + font-size: 13px; + color: #6c7781; + padding-left: 8px; + margin-bottom: 0; } + .table-of-contents__count:last-child { + padding-left: 0; } + +.table-of-contents__number, +.table-of-contents__popover .word-count { + font-size: 21px; + font-weight: 400; + line-height: 30px; + color: #555d66; } + +.table-of-contents__title { + display: block; + margin-top: 20px; + font-size: 15px; + font-weight: 600; } + +.editor-template-validation-notice { + display: flex; + justify-content: space-between; + align-items: center; } + .editor-template-validation-notice .components-button { + margin-right: 5px; } diff --git a/wp-includes/css/dist/editor/style-rtl.min.css b/wp-includes/css/dist/editor/style-rtl.min.css new file mode 100644 index 0000000..0a17b67 --- /dev/null +++ b/wp-includes/css/dist/editor/style-rtl.min.css @@ -0,0 +1 @@ +@charset "UTF-8";.editor-autocompleters__block .block-editor-block-icon{margin-left:8px}.editor-autocompleters__user .editor-autocompleters__no-avatar:before{font:normal 20px/1 dashicons;content:"\f110";margin-left:5px;vertical-align:middle}.editor-autocompleters__user .editor-autocompleters__user-avatar{margin-left:8px;flex-grow:0;flex-shrink:0;max-width:none;width:24px;height:24px}.editor-autocompleters__user .editor-autocompleters__user-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;max-width:200px;flex-shrink:0;flex-grow:1}.editor-autocompleters__user .editor-autocompleters__user-slug{margin-right:8px;color:#8f98a1;white-space:nowrap;text-overflow:ellipsis;overflow:none;max-width:100px;flex-grow:0;flex-shrink:0}.editor-autocompleters__user:hover .editor-autocompleters__user-slug{color:#66c6e4}.document-outline{margin:20px 0}.document-outline ul{margin:0;padding:0}.document-outline__item{display:flex;margin:4px 0}.document-outline__item a{text-decoration:none}.document-outline__item .document-outline__emdash:before{color:#e2e4e7;margin-left:4px}.document-outline__item.is-h2 .document-outline__emdash:before{content:"—"}.document-outline__item.is-h3 .document-outline__emdash:before{content:"——"}.document-outline__item.is-h4 .document-outline__emdash:before{content:"———"}.document-outline__item.is-h5 .document-outline__emdash:before{content:"————"}.document-outline__item.is-h6 .document-outline__emdash:before{content:"—————"}.document-outline__button{cursor:pointer;background:none;border:none;display:flex;align-items:flex-start;margin:0 -1px 0 0;padding:2px 1px 2px 5px;color:#23282d;text-align:right}.document-outline__button:disabled{cursor:default}.document-outline__button:focus{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.document-outline__level{background:#e2e4e7;color:#23282d;border-radius:3px;font-size:13px;padding:1px 6px;margin-left:4px}.is-invalid .document-outline__level{background:#f0b849}.document-outline__item-content{padding:1px 0}.components-editor-notices__dismissible{position:-webkit-sticky;position:sticky;top:56px;left:0;color:#191e23}@media (min-width:600px){.components-editor-notices__dismissible{top:0}}.components-editor-notices__pinned{position:relative;right:0;top:0;left:0;color:#191e23}.components-editor-notices__dismissible .components-notice,.components-editor-notices__pinned .components-notice{box-sizing:border-box;margin:0;border-bottom:1px solid rgba(0,0,0,.2);padding:6px 12px;min-height:60px}.components-editor-notices__dismissible .components-notice .components-notice__dismiss,.components-editor-notices__pinned .components-notice .components-notice__dismiss{margin:6px 5px 6px -5px}.components-editor-notices__snackbar{width:100%}.editor-entities-saved-states__save-button{display:block;margin-right:auto;margin-left:0}.editor-error-boundary{max-width:780px;padding:20px;margin:60px auto auto;box-shadow:0 3px 30px rgba(25,30,35,.2)}.editor-page-attributes__template{margin-bottom:10px}.editor-page-attributes__order,.editor-page-attributes__template label,.editor-page-attributes__template select{width:100%}.editor-page-attributes__order .components-base-control__field{display:flex;justify-content:space-between;align-items:center}.editor-page-attributes__order input{width:66px}.editor-post-excerpt__textarea{width:100%;margin-bottom:10px}.editor-post-featured-image{padding:0}.editor-post-featured-image__container{margin-bottom:1em;position:relative}.editor-post-featured-image .components-spinner{position:absolute;top:50%;right:50%;margin-top:-9px;margin-right:-9px}.editor-post-featured-image .components-button+.components-button{display:block;margin-top:1em}.editor-post-featured-image .components-responsive-wrapper__content{max-width:100%;width:auto}.editor-post-featured-image__preview,.editor-post-featured-image__toggle{display:block;width:100%;padding:0;transition:all .1s ease-out;box-shadow:0 0 0 0 #00a0d2}@media (prefers-reduced-motion:reduce){.editor-post-featured-image__preview,.editor-post-featured-image__toggle{transition-duration:0s}}.editor-post-featured-image__preview{height:auto}.editor-post-featured-image__preview:not(:disabled):not([aria-disabled=true]):focus{box-shadow:0 0 0 4px #00a0d2}.editor-post-featured-image__toggle{border:1px dashed #a2aab2;background-color:#edeff0;min-height:90px;line-height:20px;padding:8px 0;text-align:center}.editor-post-featured-image__toggle:hover{background-color:#f8f9f9}.editor-post-format{flex-direction:column;align-items:stretch;width:100%}.editor-post-format__content{display:inline-flex;justify-content:space-between;align-items:center;width:100%}.editor-post-format__suggestion{text-align:left;font-size:13px}.editor-post-last-revision__title{width:100%;font-weight:600}.editor-post-last-revision__title .dashicon{margin-left:5px}.components-button:not(:disabled):not([aria-disabled=true]).editor-post-last-revision__title{height:auto}.components-button:not(:disabled):not([aria-disabled=true]).editor-post-last-revision__title:active,.components-button:not(:disabled):not([aria-disabled=true]).editor-post-last-revision__title:hover{background:#f3f4f5!important;border:none!important;box-shadow:none!important}.components-button:not(:disabled):not([aria-disabled=true]).editor-post-last-revision__title:focus{color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.editor-post-locked-modal{height:auto;padding-left:10px;padding-right:10px;padding-top:10px;max-width:480px}.editor-post-locked-modal .components-modal__header{height:36px}.editor-post-locked-modal .components-modal__content{height:auto}.editor-post-locked-modal__buttons{margin-top:10px}.editor-post-locked-modal__buttons .components-button{margin-left:5px}.editor-post-locked-modal__avatar{float:right;margin:5px 5px 5px 15px}.editor-post-permalink{display:inline-flex;align-items:center;flex-wrap:wrap;background:#fff;padding:8px 8px 0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;height:40px;white-space:nowrap;border:1px solid #b5bcc2;background-clip:padding-box;border-right:0;box-shadow:3px 0 0 0 #555d66;outline:1px solid transparent;margin-right:-15px;margin-left:-15px}.is-dark-theme .editor-post-permalink{box-shadow:3px 0 0 0 #d7dade}@media (min-width:480px){.editor-post-permalink{padding:4px}}@media (min-width:600px){.editor-post-permalink{margin-right:-1px;margin-left:-1px}}.editor-post-permalink.editor-post-permalink>*{margin-bottom:8px}@media (min-width:480px){.editor-post-permalink.editor-post-permalink>*{margin-bottom:0}}.editor-post-permalink button{flex-shrink:0}.editor-post-permalink__copy{border-radius:4px;padding:6px}.editor-post-permalink__copy.is-copied{opacity:.3}.editor-post-permalink__label{margin:0 5px 0 10px;font-weight:600}.editor-post-permalink__link{color:#7e8993;text-decoration:underline;margin-left:10px;flex-grow:1;overflow:hidden;position:relative;white-space:nowrap;text-align:right}.editor-post-permalink-editor{width:100%;min-width:20%;display:inline-flex;align-items:center}.editor-post-permalink-editor .editor-post-permalink__editor-container{flex:0 1 100%;display:flex;overflow:hidden;padding:1px 0}.editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__prefix{flex:1 1 auto}@media (min-width:600px){.editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__prefix{flex:1 0 auto}}.editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__edit{flex:1 1 100%}.editor-post-permalink-editor .editor-post-permalink-editor__save{margin-right:auto}.editor-post-permalink-editor__prefix{color:#6c7781;min-width:20%;overflow:hidden;position:relative;white-space:nowrap;text-overflow:ellipsis}.editor-post-permalink input[type=text].editor-post-permalink-editor__edit{min-width:10%;width:100%;margin:0 3px;padding:2px 4px}.editor-post-permalink-editor__suffix{color:#6c7781;margin-left:6px;flex:0 0 0%}.editor-post-permalink-editor__prefix{text-align:right}.editor-post-permalink__link{text-align:left}.editor-post-permalink__editor-container,.editor-post-permalink__link{direction:ltr}.editor-post-permalink__link:after{content:"";display:block;position:absolute;-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;background:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 90%);top:0;bottom:0;right:0;left:auto;width:20%;height:auto}.editor-post-publish-button__button.has-changes-dot:before{background:currentcolor;border-radius:4px;content:"";height:8px;margin:auto -3px auto 5px;width:8px}.editor-post-publish-panel{background:#fff}.editor-post-publish-panel__content{min-height:calc(100% - 140px)}.editor-post-publish-panel__content .components-spinner{display:block;margin:100px auto 0}.editor-post-publish-panel__header{background:#fff;padding-right:8px;padding-left:8px;height:56px;border-bottom:1px solid #e2e4e7;display:flex;align-items:center;align-content:space-between}.editor-post-publish-panel__header .components-button.has-icon{position:absolute;left:8px}.editor-post-publish-panel__header-publish-button{display:flex;justify-content:flex-end;flex-grow:1;text-align:left;flex-wrap:nowrap}.editor-post-publish-panel__header-published{flex-grow:1}.editor-post-publish-panel__footer{padding:16px}.components-button.editor-post-publish-panel__toggle.is-primary{display:inline-flex;align-items:center}.components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon{display:none}.components-button.editor-post-publish-panel__toggle.is-primary .dashicon{margin-left:-4px}.editor-post-publish-panel__link{font-weight:400;padding-right:4px}.editor-post-publish-panel__prepublish{padding:16px}.editor-post-publish-panel__prepublish strong{color:#191e23}.editor-post-publish-panel__prepublish .components-panel__body{background:#fff;margin-right:-16px;margin-left:-16px}.editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend{display:none}.editor-post-publish-panel__prepublish .components-datetime{padding:0}.post-publish-panel__postpublish .components-panel__body{border-bottom:1px solid #e2e4e7;border-top:none}.post-publish-panel__postpublish-buttons{display:flex;align-content:space-between;flex-wrap:wrap;margin:-5px}.post-publish-panel__postpublish-buttons>*{flex-grow:1;margin:5px}.post-publish-panel__postpublish-buttons .components-button{height:auto;justify-content:center;padding:3px 10px 4px;line-height:1.6;text-align:center;white-space:normal}.post-publish-panel__postpublish-buttons .components-clipboard-button{width:100%}.post-publish-panel__postpublish-post-address{margin-bottom:16px}.post-publish-panel__postpublish-post-address input[readonly]{padding:10px;background:#e8eaeb;overflow:hidden;text-overflow:ellipsis}.post-publish-panel__postpublish-header{font-weight:500}.post-publish-panel__postpublish-subheader{margin:0 0 8px}.post-publish-panel__tip{color:#f0b849}.editor-post-saved-state{display:flex;align-items:center;width:28px;padding:12px 4px;color:#555d66;overflow:hidden;white-space:nowrap}.editor-post-saved-state svg{display:inline-block;flex:0 0 auto;margin-left:4px;fill:currentColor}@media (min-width:600px){.editor-post-saved-state{width:auto;padding:8px 12px;text-indent:inherit}.editor-post-saved-state .dashicon{margin-left:4px}}.edit-post-header .edit-post-header__settings .components-button.editor-post-save-draft{margin:0}.editor-post-taxonomies__hierarchical-terms-list{max-height:14em;overflow:auto;padding-right:2px}.editor-post-taxonomies__hierarchical-terms-choice{margin-bottom:8px}.editor-post-taxonomies__hierarchical-terms-subchoices{margin-top:8px;margin-right:16px}.components-button.editor-post-taxonomies__hierarchical-terms-add,.components-button.editor-post-taxonomies__hierarchical-terms-submit{margin-top:12px}.editor-post-taxonomies__hierarchical-terms-label{display:inline-block;margin-top:12px}.editor-post-taxonomies__hierarchical-terms-input{margin-top:8px;width:100%}.editor-post-taxonomies__hierarchical-terms-filter{margin-bottom:8px;width:100%}.editor-post-text-editor{border:1px solid #e2e4e7!important;display:block;margin:0 0 2em;width:100%;box-shadow:none;resize:none;overflow:hidden;font-family:Menlo,Consolas,monaco,monospace!important;line-height:150%;border-radius:0!important;font-size:16px!important}@media (min-width:600px){.editor-post-text-editor{font-size:14px!important}}.editor-post-text-editor:focus,.editor-post-text-editor:hover{border:1px solid #b5bcc2!important;box-shadow:none!important;outline-offset:-2px!important}.editor-post-text-editor__toolbar{display:flex;flex-direction:row;flex-wrap:wrap}.editor-post-text-editor__toolbar button{height:30px;background:none;padding:0 8px;margin:3px 4px;text-align:center;cursor:pointer;font-family:Menlo,Consolas,monaco,monospace;color:#555d66;border:1px solid transparent}.editor-post-text-editor__toolbar button:first-child{margin-right:0}.editor-post-text-editor__toolbar button:focus,.editor-post-text-editor__toolbar button:hover{outline:none;border:1px solid #555d66}.editor-post-text-editor__bold{font-weight:600}.editor-post-text-editor__italic{font-style:italic}.editor-post-text-editor__link{text-decoration:underline;color:#0085ba}body.admin-color-sunrise .editor-post-text-editor__link{color:#d1864a}body.admin-color-ocean .editor-post-text-editor__link{color:#a3b9a2}body.admin-color-midnight .editor-post-text-editor__link{color:#e14d43}body.admin-color-ectoplasm .editor-post-text-editor__link{color:#a7b656}body.admin-color-coffee .editor-post-text-editor__link{color:#c2a68c}body.admin-color-blue .editor-post-text-editor__link{color:#82b4cb}body.admin-color-light .editor-post-text-editor__link{color:#0085ba}.editor-post-text-editor__del{text-decoration:line-through}.edit-post-post-visibility__dialog,.editor-post-visibility__dialog-fieldset{padding:0 4px 4px}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-legend,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-legend{font-weight:600;margin-bottom:1em;margin-top:.5em;padding:0}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio{margin-top:2px}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-label,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-label{font-weight:600}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-info,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-info{margin-top:0;margin-right:28px}.edit-post-post-visibility__dialog .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info,.editor-post-visibility__dialog-fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info{margin-bottom:0}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-password-input,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-password-input{margin-right:28px}.editor-post-title__block{position:relative;padding:5px 0;font-size:16px}@media (min-width:600px){.editor-post-title__block{padding:5px 2px}}.editor-post-title__block .editor-post-title__input{display:block;width:100%;margin:0;box-shadow:none;background:transparent;font-family:"Noto Serif",serif;line-height:1.4;color:#191e23;transition:border .1s ease-out,box-shadow .1s linear;padding:19px 14px;word-break:keep-all;border-color:transparent;border-style:solid;border-width:1px 0;border-radius:0;outline:1px solid transparent;font-size:2.44em;font-weight:600}@media (prefers-reduced-motion:reduce){.editor-post-title__block .editor-post-title__input{transition-duration:0s}}@media (min-width:600px){.editor-post-title__block .editor-post-title__input{border-width:1px 0 1px 1px}}.editor-post-title__block .editor-post-title__input::-webkit-input-placeholder{color:rgba(22,36,53,.55)}.editor-post-title__block .editor-post-title__input::-moz-placeholder{color:rgba(22,36,53,.55)}.editor-post-title__block .editor-post-title__input:-ms-input-placeholder{color:rgba(22,36,53,.55)}.editor-post-title__block .editor-post-title__input:focus{border:1px solid transparent;border-right-width:0;outline:1px solid transparent;box-shadow:none}.editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input{border-color:rgba(66,88,99,.4);box-shadow:inset -3px 0 0 0 #555d66}.is-dark-theme .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input{border-color:hsla(0,0%,100%,.45);box-shadow:inset -3px 0 0 0 #d7dade}@media (min-width:600px){.editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input{box-shadow:3px 0 0 0 #555d66}.is-dark-theme .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input{box-shadow:3px 0 0 0 #d7dade}}.editor-post-title__block.is-focus-mode .editor-post-title__input{opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.editor-post-title__block.is-focus-mode .editor-post-title__input{transition-duration:0s}}.editor-post-title__block.is-focus-mode .editor-post-title__input:focus{opacity:1}.editor-post-title .editor-post-permalink{font-size:13px;color:#191e23;height:auto;position:relative;right:3px;top:-2px;width:calc(100% - 3px)}@media (min-width:480px){.editor-post-title .editor-post-permalink{position:absolute;top:-34px;left:0;flex-wrap:nowrap;width:auto}}@media (min-width:600px){.editor-post-title .editor-post-permalink{right:2px;left:2px}}.editor-post-trash.components-button{color:#b52727;border-color:#b52727;justify-content:center}.editor-post-trash.components-button:not(:disabled):not([aria-disabled=true]):hover,.editor-post-trash.components-button:not([aria-disabled=true]):focus{color:#a02222;border-color:#a02222}.table-of-contents__popover.components-popover .components-popover__content{min-width:380px}.components-popover.table-of-contents__popover{z-index:99998}.table-of-contents__popover .components-popover__content{padding:16px}@media (min-width:600px){.table-of-contents__popover .components-popover__content{max-height:calc(100vh - 120px);overflow-y:auto}}.table-of-contents__popover hr{margin:10px -16px 0}.table-of-contents__wrapper:focus{color:#191e23;outline-offset:-1px;outline:1px dotted #555d66;outline-offset:8px}.table-of-contents__counts{display:flex;flex-wrap:wrap;margin:0}.table-of-contents__count{flex-basis:25%;display:flex;flex-direction:column;font-size:13px;color:#6c7781;padding-left:8px;margin-bottom:0}.table-of-contents__count:last-child{padding-left:0}.table-of-contents__number,.table-of-contents__popover .word-count{font-size:21px;font-weight:400;line-height:30px;color:#555d66}.table-of-contents__title{display:block;margin-top:20px;font-size:15px;font-weight:600}.editor-template-validation-notice{display:flex;justify-content:space-between;align-items:center}.editor-template-validation-notice .components-button{margin-right:5px} \ No newline at end of file diff --git a/wp-includes/css/dist/editor/style.css b/wp-includes/css/dist/editor/style.css new file mode 100644 index 0000000..b231a61 --- /dev/null +++ b/wp-includes/css/dist/editor/style.css @@ -0,0 +1,837 @@ +@charset "UTF-8"; +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.editor-autocompleters__block .block-editor-block-icon { + margin-right: 8px; } + +.editor-autocompleters__user .editor-autocompleters__no-avatar::before { + /* stylelint-disable */ + font: normal 20px/1 dashicons; + /* stylelint-enable */ + content: "\f110"; + margin-right: 5px; + vertical-align: middle; } + +.editor-autocompleters__user .editor-autocompleters__user-avatar { + margin-right: 8px; + flex-grow: 0; + flex-shrink: 0; + max-width: none; + width: 24px; + height: 24px; } + +.editor-autocompleters__user .editor-autocompleters__user-name { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + max-width: 200px; + flex-shrink: 0; + flex-grow: 1; } + +.editor-autocompleters__user .editor-autocompleters__user-slug { + margin-left: 8px; + color: #8f98a1; + white-space: nowrap; + text-overflow: ellipsis; + overflow: none; + max-width: 100px; + flex-grow: 0; + flex-shrink: 0; } + +.editor-autocompleters__user:hover .editor-autocompleters__user-slug { + color: #66c6e4; } + +.document-outline { + margin: 20px 0; } + .document-outline ul { + margin: 0; + padding: 0; } + +.document-outline__item { + display: flex; + margin: 4px 0; } + .document-outline__item a { + text-decoration: none; } + .document-outline__item .document-outline__emdash::before { + color: #e2e4e7; + margin-right: 4px; } + .document-outline__item.is-h2 .document-outline__emdash::before { + content: "—"; } + .document-outline__item.is-h3 .document-outline__emdash::before { + content: "——"; } + .document-outline__item.is-h4 .document-outline__emdash::before { + content: "———"; } + .document-outline__item.is-h5 .document-outline__emdash::before { + content: "————"; } + .document-outline__item.is-h6 .document-outline__emdash::before { + content: "—————"; } + +.document-outline__button { + cursor: pointer; + background: none; + border: none; + display: flex; + align-items: flex-start; + margin: 0 0 0 -1px; + padding: 2px 5px 2px 1px; + color: #23282d; + text-align: left; } + .document-outline__button:disabled { + cursor: default; } + .document-outline__button:focus { + background-color: #fff; + color: #191e23; + box-shadow: inset 0 0 0 1px #6c7781, inset 0 0 0 2px #fff; + outline: 2px solid transparent; } + +.document-outline__level { + background: #e2e4e7; + color: #23282d; + border-radius: 3px; + font-size: 13px; + padding: 1px 6px; + margin-right: 4px; } + .is-invalid .document-outline__level { + background: #f0b849; } + +.document-outline__item-content { + padding: 1px 0; } + +.components-editor-notices__dismissible { + position: -webkit-sticky; + position: sticky; + top: 56px; + right: 0; + color: #191e23; } + @media (min-width: 600px) { + .components-editor-notices__dismissible { + top: 0; } } + +.components-editor-notices__pinned { + position: relative; + left: 0; + top: 0; + right: 0; + color: #191e23; } + +.components-editor-notices__dismissible .components-notice, +.components-editor-notices__pinned .components-notice { + box-sizing: border-box; + margin: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding: 6px 12px; + min-height: 60px; } + .components-editor-notices__dismissible .components-notice .components-notice__dismiss, + .components-editor-notices__pinned .components-notice .components-notice__dismiss { + margin: 6px -5px 6px 5px; } + +.components-editor-notices__snackbar { + width: 100%; } + +.editor-entities-saved-states__save-button { + display: block; + margin-left: auto; + margin-right: 0; } + +.editor-error-boundary { + margin: auto; + max-width: 780px; + padding: 20px; + margin-top: 60px; + box-shadow: 0 3px 30px rgba(25, 30, 35, 0.2); } + +.editor-page-attributes__template { + margin-bottom: 10px; } + .editor-page-attributes__template label, + .editor-page-attributes__template select { + width: 100%; } + +.editor-page-attributes__order { + width: 100%; } + .editor-page-attributes__order .components-base-control__field { + display: flex; + justify-content: space-between; + align-items: center; } + .editor-page-attributes__order input { + width: 66px; } + +.editor-post-excerpt__textarea { + width: 100%; + margin-bottom: 10px; } + +.editor-post-featured-image { + padding: 0; } + .editor-post-featured-image__container { + margin-bottom: 1em; + position: relative; } + .editor-post-featured-image .components-spinner { + position: absolute; + top: 50%; + left: 50%; + margin-top: -9px; + margin-left: -9px; } + .editor-post-featured-image .components-button + .components-button { + display: block; + margin-top: 1em; } + .editor-post-featured-image .components-responsive-wrapper__content { + max-width: 100%; + width: auto; } + +.editor-post-featured-image__toggle, +.editor-post-featured-image__preview { + display: block; + width: 100%; + padding: 0; + transition: all 0.1s ease-out; + box-shadow: 0 0 0 0 #00a0d2; } + @media (prefers-reduced-motion: reduce) { + .editor-post-featured-image__toggle, + .editor-post-featured-image__preview { + transition-duration: 0s; } } + +.editor-post-featured-image__preview { + height: auto; } + +.editor-post-featured-image__preview:not(:disabled):not([aria-disabled="true"]):focus { + box-shadow: 0 0 0 4px #00a0d2; } + +.editor-post-featured-image__toggle { + border: 1px dashed #a2aab2; + background-color: #edeff0; + min-height: 90px; + line-height: 20px; + padding: 8px 0; + text-align: center; } + .editor-post-featured-image__toggle:hover { + background-color: #f8f9f9; } + +.editor-post-format { + flex-direction: column; + align-items: stretch; + width: 100%; } + +.editor-post-format__content { + display: inline-flex; + justify-content: space-between; + align-items: center; + width: 100%; } + +.editor-post-format__suggestion { + text-align: right; + font-size: 13px; } + +.editor-post-last-revision__title { + width: 100%; + font-weight: 600; } + .editor-post-last-revision__title .dashicon { + margin-right: 5px; } + +.components-button:not(:disabled):not([aria-disabled="true"]).editor-post-last-revision__title { + height: auto; } + .components-button:not(:disabled):not([aria-disabled="true"]).editor-post-last-revision__title:hover, .components-button:not(:disabled):not([aria-disabled="true"]).editor-post-last-revision__title:active { + background: #f3f4f5 !important; + border: none !important; + box-shadow: none !important; } + .components-button:not(:disabled):not([aria-disabled="true"]).editor-post-last-revision__title:focus { + color: #191e23; + border: none; + box-shadow: none; + outline-offset: -2px; + outline: 1px dotted #555d66; } + +.editor-post-locked-modal { + height: auto; + padding-right: 10px; + padding-left: 10px; + padding-top: 10px; + max-width: 480px; } + .editor-post-locked-modal .components-modal__header { + height: 36px; } + .editor-post-locked-modal .components-modal__content { + height: auto; } + +.editor-post-locked-modal__buttons { + margin-top: 10px; } + .editor-post-locked-modal__buttons .components-button { + margin-right: 5px; } + +.editor-post-locked-modal__avatar { + float: left; + margin: 5px; + margin-right: 15px; } + +.editor-post-permalink { + display: inline-flex; + align-items: center; + flex-wrap: wrap; + background: #fff; + padding: 8px 8px 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; + height: 40px; + white-space: nowrap; + border: 1px solid #b5bcc2; + background-clip: padding-box; + border-left: 0; + box-shadow: -3px 0 0 0 #555d66; + outline: 1px solid transparent; + margin-left: -15px; + margin-right: -15px; } + .is-dark-theme .editor-post-permalink { + box-shadow: -3px 0 0 0 #d7dade; } + @media (min-width: 480px) { + .editor-post-permalink { + padding: 4px; } } + @media (min-width: 600px) { + .editor-post-permalink { + margin-left: -1px; + margin-right: -1px; } } + .editor-post-permalink.editor-post-permalink > * { + margin-bottom: 8px; } + @media (min-width: 480px) { + .editor-post-permalink.editor-post-permalink > * { + margin-bottom: 0; } } + .editor-post-permalink button { + flex-shrink: 0; } + +.editor-post-permalink__copy { + border-radius: 4px; + padding: 6px; } + +.editor-post-permalink__copy.is-copied { + opacity: 0.3; } + +.editor-post-permalink__label { + margin: 0 10px 0 5px; + font-weight: 600; } + +.editor-post-permalink__link { + color: #7e8993; + text-decoration: underline; + margin-right: 10px; + flex-grow: 1; + overflow: hidden; + position: relative; + white-space: nowrap; + text-align: left; } + +.editor-post-permalink-editor { + width: 100%; + min-width: 20%; + display: inline-flex; + align-items: center; } + .editor-post-permalink-editor .editor-post-permalink__editor-container { + flex: 0 1 100%; + display: flex; + overflow: hidden; + padding: 1px 0; } + .editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__prefix { + flex: 1 1 auto; } + @media (min-width: 600px) { + .editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__prefix { + flex: 1 0 auto; } } + .editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__edit { + flex: 1 1 100%; } + .editor-post-permalink-editor .editor-post-permalink-editor__save { + margin-left: auto; } + +.editor-post-permalink-editor__prefix { + color: #6c7781; + min-width: 20%; + overflow: hidden; + position: relative; + white-space: nowrap; + text-overflow: ellipsis; } + +.editor-post-permalink input[type="text"].editor-post-permalink-editor__edit { + min-width: 10%; + width: 100%; + margin: 0 3px; + padding: 2px 4px; } + +.editor-post-permalink-editor__suffix { + color: #6c7781; + margin-right: 6px; + flex: 0 0 0%; } + +.editor-post-permalink-editor__prefix { + text-align: left; } + +/* rtl:begin:ignore */ +.editor-post-permalink__link { + text-align: left; } + +.editor-post-permalink__editor-container, +.editor-post-permalink__link { + direction: ltr; } + +.editor-post-permalink__link::after { + content: ""; + display: block; + position: absolute; + -webkit-touch-callout: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + background: linear-gradient(to right, rgba(255, 255, 255, 0), #fff 90%); + top: 0; + bottom: 0; + right: 0; + left: auto; + width: 20%; + height: auto; } + +/* rtl:end:ignore */ +.editor-post-publish-button__button.has-changes-dot::before { + background: currentcolor; + border-radius: 4px; + content: ""; + height: 8px; + margin: auto 5px auto -3px; + width: 8px; } + +.editor-post-publish-panel { + background: #fff; } + +.editor-post-publish-panel__content { + min-height: calc(100% - 140px); } + .editor-post-publish-panel__content .components-spinner { + display: block; + margin: 100px auto 0; } + +.editor-post-publish-panel__header { + background: #fff; + padding-left: 8px; + padding-right: 8px; + height: 56px; + border-bottom: 1px solid #e2e4e7; + display: flex; + align-items: center; + align-content: space-between; } + .editor-post-publish-panel__header .components-button.has-icon { + position: absolute; + right: 8px; } + +.editor-post-publish-panel__header-publish-button { + display: flex; + justify-content: flex-end; + flex-grow: 1; + text-align: right; + flex-wrap: nowrap; } + +.editor-post-publish-panel__header-published { + flex-grow: 1; } + +.editor-post-publish-panel__footer { + padding: 16px; } + +.components-button.editor-post-publish-panel__toggle.is-primary { + display: inline-flex; + align-items: center; } + .components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon { + display: none; } + .components-button.editor-post-publish-panel__toggle.is-primary .dashicon { + margin-right: -4px; } + +.editor-post-publish-panel__link { + font-weight: 400; + padding-left: 4px; } + +.editor-post-publish-panel__prepublish { + padding: 16px; } + .editor-post-publish-panel__prepublish strong { + color: #191e23; } + .editor-post-publish-panel__prepublish .components-panel__body { + background: #fff; + margin-left: -16px; + margin-right: -16px; } + .editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend { + display: none; } + .editor-post-publish-panel__prepublish .components-datetime { + padding: 0; } + +.post-publish-panel__postpublish .components-panel__body { + border-bottom: 1px solid #e2e4e7; + border-top: none; } + +.post-publish-panel__postpublish-buttons { + display: flex; + align-content: space-between; + flex-wrap: wrap; + margin: -5px; } + .post-publish-panel__postpublish-buttons > * { + flex-grow: 1; + margin: 5px; } + .post-publish-panel__postpublish-buttons .components-button { + height: auto; + justify-content: center; + padding: 3px 10px 4px; + line-height: 1.6; + text-align: center; + white-space: normal; } + .post-publish-panel__postpublish-buttons .components-clipboard-button { + width: 100%; } + +.post-publish-panel__postpublish-post-address { + margin-bottom: 16px; } + .post-publish-panel__postpublish-post-address input[readonly] { + padding: 10px; + background: #e8eaeb; + overflow: hidden; + text-overflow: ellipsis; } + +.post-publish-panel__postpublish-header { + font-weight: 500; } + +.post-publish-panel__postpublish-subheader { + margin: 0 0 8px; } + +.post-publish-panel__tip { + color: #f0b849; } + +.editor-post-saved-state { + display: flex; + align-items: center; + width: 28px; + padding: 12px 4px; + color: #555d66; + overflow: hidden; + white-space: nowrap; } + .editor-post-saved-state svg { + display: inline-block; + flex: 0 0 auto; + margin-right: 4px; + fill: currentColor; } + @media (min-width: 600px) { + .editor-post-saved-state { + width: auto; + padding: 8px 12px; + text-indent: inherit; } + .editor-post-saved-state .dashicon { + margin-right: 4px; } } + +.edit-post-header .edit-post-header__settings .components-button.editor-post-save-draft { + margin: 0; } + +.editor-post-taxonomies__hierarchical-terms-list { + max-height: 14em; + overflow: auto; + padding-left: 2px; } + +.editor-post-taxonomies__hierarchical-terms-choice { + margin-bottom: 8px; } + +.editor-post-taxonomies__hierarchical-terms-subchoices { + margin-top: 8px; + margin-left: 16px; } + +.components-button.editor-post-taxonomies__hierarchical-terms-submit, +.components-button.editor-post-taxonomies__hierarchical-terms-add { + margin-top: 12px; } + +.editor-post-taxonomies__hierarchical-terms-label { + display: inline-block; + margin-top: 12px; } + +.editor-post-taxonomies__hierarchical-terms-input { + margin-top: 8px; + width: 100%; } + +.editor-post-taxonomies__hierarchical-terms-filter { + margin-bottom: 8px; + width: 100%; } + +.editor-post-text-editor { + border: 1px solid #e2e4e7 !important; + display: block; + margin: 0 0 2em; + width: 100%; + box-shadow: none; + resize: none; + overflow: hidden; + font-family: Menlo, Consolas, monaco, monospace !important; + line-height: 150%; + border-radius: 0 !important; + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: 16px !important; } + @media (min-width: 600px) { + .editor-post-text-editor { + font-size: 14px !important; } } + .editor-post-text-editor:hover, .editor-post-text-editor:focus { + border: 1px solid #b5bcc2 !important; + box-shadow: none !important; + outline-offset: -2px !important; } + +.editor-post-text-editor__toolbar { + display: flex; + flex-direction: row; + flex-wrap: wrap; } + .editor-post-text-editor__toolbar button { + height: 30px; + background: none; + padding: 0 8px; + margin: 3px 4px; + text-align: center; + cursor: pointer; + font-family: Menlo, Consolas, monaco, monospace; + color: #555d66; + border: 1px solid transparent; } + .editor-post-text-editor__toolbar button:first-child { + margin-left: 0; } + .editor-post-text-editor__toolbar button:hover, .editor-post-text-editor__toolbar button:focus { + outline: none; + border: 1px solid #555d66; } + +.editor-post-text-editor__bold { + font-weight: 600; } + +.editor-post-text-editor__italic { + font-style: italic; } + +.editor-post-text-editor__link { + text-decoration: underline; + color: #0085ba; } + +body.admin-color-sunrise .editor-post-text-editor__link{ + color: #d1864a; } + +body.admin-color-ocean .editor-post-text-editor__link{ + color: #a3b9a2; } + +body.admin-color-midnight .editor-post-text-editor__link{ + color: #e14d43; } + +body.admin-color-ectoplasm .editor-post-text-editor__link{ + color: #a7b656; } + +body.admin-color-coffee .editor-post-text-editor__link{ + color: #c2a68c; } + +body.admin-color-blue .editor-post-text-editor__link{ + color: #82b4cb; } + +body.admin-color-light .editor-post-text-editor__link{ + color: #0085ba; } + +.editor-post-text-editor__del { + text-decoration: line-through; } + +.edit-post-post-visibility__dialog, +.editor-post-visibility__dialog-fieldset { + padding: 4px; + padding-top: 0; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-legend, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-legend { + font-weight: 600; + margin-bottom: 1em; + margin-top: 0.5em; + padding: 0; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio { + margin-top: 2px; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-label, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-label { + font-weight: 600; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-info, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-info { + margin-top: 0; + margin-left: 28px; } + .edit-post-post-visibility__dialog .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info { + margin-bottom: 0; } + .edit-post-post-visibility__dialog .editor-post-visibility__dialog-password-input, + .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-password-input { + margin-left: 28px; } + +.editor-post-title__block { + position: relative; + padding: 5px 0; + font-size: 16px; } + @media (min-width: 600px) { + .editor-post-title__block { + padding: 5px 2px; } } + .editor-post-title__block .editor-post-title__input { + display: block; + width: 100%; + margin: 0; + box-shadow: none; + background: transparent; + font-family: "Noto Serif", serif; + line-height: 1.4; + color: #191e23; + transition: border 0.1s ease-out, box-shadow 0.1s linear; + padding: 19px 14px; + word-break: keep-all; + border: 1px solid transparent; + border-left-width: 0; + border-right-width: 0; + border-radius: 0; + outline: 1px solid transparent; + font-size: 2.44em; + font-weight: 600; } + @media (prefers-reduced-motion: reduce) { + .editor-post-title__block .editor-post-title__input { + transition-duration: 0s; } } + @media (min-width: 600px) { + .editor-post-title__block .editor-post-title__input { + border-width: 1px; + border-left-width: 0; } } + .editor-post-title__block .editor-post-title__input::-webkit-input-placeholder { + color: rgba(22, 36, 53, 0.55); } + .editor-post-title__block .editor-post-title__input::-moz-placeholder { + color: rgba(22, 36, 53, 0.55); } + .editor-post-title__block .editor-post-title__input:-ms-input-placeholder { + color: rgba(22, 36, 53, 0.55); } + .editor-post-title__block .editor-post-title__input:focus { + border: 1px solid transparent; + border-left-width: 0; + outline: 1px solid transparent; + box-shadow: none; } + .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input { + border-color: rgba(66, 88, 99, 0.4); + box-shadow: inset 3px 0 0 0 #555d66; } + .is-dark-theme .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input { + border-color: rgba(255, 255, 255, 0.45); + box-shadow: inset 3px 0 0 0 #d7dade; } + @media (min-width: 600px) { + .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input { + box-shadow: -3px 0 0 0 #555d66; } + .is-dark-theme .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input { + box-shadow: -3px 0 0 0 #d7dade; } } + .editor-post-title__block.is-focus-mode .editor-post-title__input { + opacity: 0.5; + transition: opacity 0.1s linear; } + @media (prefers-reduced-motion: reduce) { + .editor-post-title__block.is-focus-mode .editor-post-title__input { + transition-duration: 0s; } } + .editor-post-title__block.is-focus-mode .editor-post-title__input:focus { + opacity: 1; } + +.editor-post-title .editor-post-permalink { + font-size: 13px; + color: #191e23; + height: auto; + position: relative; + left: 3px; + top: -2px; + width: calc(100% - 3px); } + @media (min-width: 480px) { + .editor-post-title .editor-post-permalink { + position: absolute; + top: -34px; + right: 0; + flex-wrap: nowrap; + width: auto; } } + @media (min-width: 600px) { + .editor-post-title .editor-post-permalink { + left: 2px; + right: 2px; } } + +.editor-post-trash.components-button { + color: #b52727; + border-color: #b52727; + justify-content: center; } + .editor-post-trash.components-button:not(:disabled):not([aria-disabled="true"]):hover, .editor-post-trash.components-button:not([aria-disabled="true"]):focus { + color: #a02222; + border-color: #a02222; } + +.table-of-contents__popover.components-popover .components-popover__content { + min-width: 380px; } + +.components-popover.table-of-contents__popover { + z-index: 99998; } + +.table-of-contents__popover .components-popover__content { + padding: 16px; } + @media (min-width: 600px) { + .table-of-contents__popover .components-popover__content { + max-height: calc(100vh - 120px); + overflow-y: auto; } } + +.table-of-contents__popover hr { + margin: 10px -16px 0; } + +.table-of-contents__wrapper:focus { + color: #191e23; + outline-offset: -1px; + outline: 1px dotted #555d66; + outline-offset: 8px; } + +.table-of-contents__counts { + display: flex; + flex-wrap: wrap; + margin: 0; } + +.table-of-contents__count { + flex-basis: 25%; + display: flex; + flex-direction: column; + font-size: 13px; + color: #6c7781; + padding-right: 8px; + margin-bottom: 0; } + .table-of-contents__count:last-child { + padding-right: 0; } + +.table-of-contents__number, +.table-of-contents__popover .word-count { + font-size: 21px; + font-weight: 400; + line-height: 30px; + color: #555d66; } + +.table-of-contents__title { + display: block; + margin-top: 20px; + font-size: 15px; + font-weight: 600; } + +.editor-template-validation-notice { + display: flex; + justify-content: space-between; + align-items: center; } + .editor-template-validation-notice .components-button { + margin-left: 5px; } diff --git a/wp-includes/css/dist/editor/style.min.css b/wp-includes/css/dist/editor/style.min.css new file mode 100644 index 0000000..67967fb --- /dev/null +++ b/wp-includes/css/dist/editor/style.min.css @@ -0,0 +1 @@ +@charset "UTF-8";.editor-autocompleters__block .block-editor-block-icon{margin-right:8px}.editor-autocompleters__user .editor-autocompleters__no-avatar:before{font:normal 20px/1 dashicons;content:"\f110";margin-right:5px;vertical-align:middle}.editor-autocompleters__user .editor-autocompleters__user-avatar{margin-right:8px;flex-grow:0;flex-shrink:0;max-width:none;width:24px;height:24px}.editor-autocompleters__user .editor-autocompleters__user-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;max-width:200px;flex-shrink:0;flex-grow:1}.editor-autocompleters__user .editor-autocompleters__user-slug{margin-left:8px;color:#8f98a1;white-space:nowrap;text-overflow:ellipsis;overflow:none;max-width:100px;flex-grow:0;flex-shrink:0}.editor-autocompleters__user:hover .editor-autocompleters__user-slug{color:#66c6e4}.document-outline{margin:20px 0}.document-outline ul{margin:0;padding:0}.document-outline__item{display:flex;margin:4px 0}.document-outline__item a{text-decoration:none}.document-outline__item .document-outline__emdash:before{color:#e2e4e7;margin-right:4px}.document-outline__item.is-h2 .document-outline__emdash:before{content:"—"}.document-outline__item.is-h3 .document-outline__emdash:before{content:"——"}.document-outline__item.is-h4 .document-outline__emdash:before{content:"———"}.document-outline__item.is-h5 .document-outline__emdash:before{content:"————"}.document-outline__item.is-h6 .document-outline__emdash:before{content:"—————"}.document-outline__button{cursor:pointer;background:none;border:none;display:flex;align-items:flex-start;margin:0 0 0 -1px;padding:2px 5px 2px 1px;color:#23282d;text-align:left}.document-outline__button:disabled{cursor:default}.document-outline__button:focus{background-color:#fff;color:#191e23;box-shadow:inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;outline:2px solid transparent}.document-outline__level{background:#e2e4e7;color:#23282d;border-radius:3px;font-size:13px;padding:1px 6px;margin-right:4px}.is-invalid .document-outline__level{background:#f0b849}.document-outline__item-content{padding:1px 0}.components-editor-notices__dismissible{position:-webkit-sticky;position:sticky;top:56px;right:0;color:#191e23}@media (min-width:600px){.components-editor-notices__dismissible{top:0}}.components-editor-notices__pinned{position:relative;left:0;top:0;right:0;color:#191e23}.components-editor-notices__dismissible .components-notice,.components-editor-notices__pinned .components-notice{box-sizing:border-box;margin:0;border-bottom:1px solid rgba(0,0,0,.2);padding:6px 12px;min-height:60px}.components-editor-notices__dismissible .components-notice .components-notice__dismiss,.components-editor-notices__pinned .components-notice .components-notice__dismiss{margin:6px -5px 6px 5px}.components-editor-notices__snackbar{width:100%}.editor-entities-saved-states__save-button{display:block;margin-left:auto;margin-right:0}.editor-error-boundary{max-width:780px;padding:20px;margin:60px auto auto;box-shadow:0 3px 30px rgba(25,30,35,.2)}.editor-page-attributes__template{margin-bottom:10px}.editor-page-attributes__order,.editor-page-attributes__template label,.editor-page-attributes__template select{width:100%}.editor-page-attributes__order .components-base-control__field{display:flex;justify-content:space-between;align-items:center}.editor-page-attributes__order input{width:66px}.editor-post-excerpt__textarea{width:100%;margin-bottom:10px}.editor-post-featured-image{padding:0}.editor-post-featured-image__container{margin-bottom:1em;position:relative}.editor-post-featured-image .components-spinner{position:absolute;top:50%;left:50%;margin-top:-9px;margin-left:-9px}.editor-post-featured-image .components-button+.components-button{display:block;margin-top:1em}.editor-post-featured-image .components-responsive-wrapper__content{max-width:100%;width:auto}.editor-post-featured-image__preview,.editor-post-featured-image__toggle{display:block;width:100%;padding:0;transition:all .1s ease-out;box-shadow:0 0 0 0 #00a0d2}@media (prefers-reduced-motion:reduce){.editor-post-featured-image__preview,.editor-post-featured-image__toggle{transition-duration:0s}}.editor-post-featured-image__preview{height:auto}.editor-post-featured-image__preview:not(:disabled):not([aria-disabled=true]):focus{box-shadow:0 0 0 4px #00a0d2}.editor-post-featured-image__toggle{border:1px dashed #a2aab2;background-color:#edeff0;min-height:90px;line-height:20px;padding:8px 0;text-align:center}.editor-post-featured-image__toggle:hover{background-color:#f8f9f9}.editor-post-format{flex-direction:column;align-items:stretch;width:100%}.editor-post-format__content{display:inline-flex;justify-content:space-between;align-items:center;width:100%}.editor-post-format__suggestion{text-align:right;font-size:13px}.editor-post-last-revision__title{width:100%;font-weight:600}.editor-post-last-revision__title .dashicon{margin-right:5px}.components-button:not(:disabled):not([aria-disabled=true]).editor-post-last-revision__title{height:auto}.components-button:not(:disabled):not([aria-disabled=true]).editor-post-last-revision__title:active,.components-button:not(:disabled):not([aria-disabled=true]).editor-post-last-revision__title:hover{background:#f3f4f5!important;border:none!important;box-shadow:none!important}.components-button:not(:disabled):not([aria-disabled=true]).editor-post-last-revision__title:focus{color:#191e23;border:none;box-shadow:none;outline-offset:-2px;outline:1px dotted #555d66}.editor-post-locked-modal{height:auto;padding-right:10px;padding-left:10px;padding-top:10px;max-width:480px}.editor-post-locked-modal .components-modal__header{height:36px}.editor-post-locked-modal .components-modal__content{height:auto}.editor-post-locked-modal__buttons{margin-top:10px}.editor-post-locked-modal__buttons .components-button{margin-right:5px}.editor-post-locked-modal__avatar{float:left;margin:5px 15px 5px 5px}.editor-post-permalink{display:inline-flex;align-items:center;flex-wrap:wrap;background:#fff;padding:8px 8px 0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;height:40px;white-space:nowrap;border:1px solid #b5bcc2;background-clip:padding-box;border-left:0;box-shadow:-3px 0 0 0 #555d66;outline:1px solid transparent;margin-left:-15px;margin-right:-15px}.is-dark-theme .editor-post-permalink{box-shadow:-3px 0 0 0 #d7dade}@media (min-width:480px){.editor-post-permalink{padding:4px}}@media (min-width:600px){.editor-post-permalink{margin-left:-1px;margin-right:-1px}}.editor-post-permalink.editor-post-permalink>*{margin-bottom:8px}@media (min-width:480px){.editor-post-permalink.editor-post-permalink>*{margin-bottom:0}}.editor-post-permalink button{flex-shrink:0}.editor-post-permalink__copy{border-radius:4px;padding:6px}.editor-post-permalink__copy.is-copied{opacity:.3}.editor-post-permalink__label{margin:0 10px 0 5px;font-weight:600}.editor-post-permalink__link{color:#7e8993;text-decoration:underline;margin-right:10px;flex-grow:1;overflow:hidden;position:relative;white-space:nowrap}.editor-post-permalink-editor{width:100%;min-width:20%;display:inline-flex;align-items:center}.editor-post-permalink-editor .editor-post-permalink__editor-container{flex:0 1 100%;display:flex;overflow:hidden;padding:1px 0}.editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__prefix{flex:1 1 auto}@media (min-width:600px){.editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__prefix{flex:1 0 auto}}.editor-post-permalink-editor .editor-post-permalink__editor-container .editor-post-permalink-editor__edit{flex:1 1 100%}.editor-post-permalink-editor .editor-post-permalink-editor__save{margin-left:auto}.editor-post-permalink-editor__prefix{color:#6c7781;min-width:20%;overflow:hidden;position:relative;white-space:nowrap;text-overflow:ellipsis}.editor-post-permalink input[type=text].editor-post-permalink-editor__edit{min-width:10%;width:100%;margin:0 3px;padding:2px 4px}.editor-post-permalink-editor__suffix{color:#6c7781;margin-right:6px;flex:0 0 0%}.editor-post-permalink-editor__prefix,.editor-post-permalink__link{text-align:left}.editor-post-permalink__editor-container,.editor-post-permalink__link{direction:ltr}.editor-post-permalink__link:after{content:"";display:block;position:absolute;-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;background:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 90%);top:0;bottom:0;right:0;left:auto;width:20%;height:auto}.editor-post-publish-button__button.has-changes-dot:before{background:currentcolor;border-radius:4px;content:"";height:8px;margin:auto 5px auto -3px;width:8px}.editor-post-publish-panel{background:#fff}.editor-post-publish-panel__content{min-height:calc(100% - 140px)}.editor-post-publish-panel__content .components-spinner{display:block;margin:100px auto 0}.editor-post-publish-panel__header{background:#fff;padding-left:8px;padding-right:8px;height:56px;border-bottom:1px solid #e2e4e7;display:flex;align-items:center;align-content:space-between}.editor-post-publish-panel__header .components-button.has-icon{position:absolute;right:8px}.editor-post-publish-panel__header-publish-button{display:flex;justify-content:flex-end;flex-grow:1;text-align:right;flex-wrap:nowrap}.editor-post-publish-panel__header-published{flex-grow:1}.editor-post-publish-panel__footer{padding:16px}.components-button.editor-post-publish-panel__toggle.is-primary{display:inline-flex;align-items:center}.components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon{display:none}.components-button.editor-post-publish-panel__toggle.is-primary .dashicon{margin-right:-4px}.editor-post-publish-panel__link{font-weight:400;padding-left:4px}.editor-post-publish-panel__prepublish{padding:16px}.editor-post-publish-panel__prepublish strong{color:#191e23}.editor-post-publish-panel__prepublish .components-panel__body{background:#fff;margin-left:-16px;margin-right:-16px}.editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend{display:none}.editor-post-publish-panel__prepublish .components-datetime{padding:0}.post-publish-panel__postpublish .components-panel__body{border-bottom:1px solid #e2e4e7;border-top:none}.post-publish-panel__postpublish-buttons{display:flex;align-content:space-between;flex-wrap:wrap;margin:-5px}.post-publish-panel__postpublish-buttons>*{flex-grow:1;margin:5px}.post-publish-panel__postpublish-buttons .components-button{height:auto;justify-content:center;padding:3px 10px 4px;line-height:1.6;text-align:center;white-space:normal}.post-publish-panel__postpublish-buttons .components-clipboard-button{width:100%}.post-publish-panel__postpublish-post-address{margin-bottom:16px}.post-publish-panel__postpublish-post-address input[readonly]{padding:10px;background:#e8eaeb;overflow:hidden;text-overflow:ellipsis}.post-publish-panel__postpublish-header{font-weight:500}.post-publish-panel__postpublish-subheader{margin:0 0 8px}.post-publish-panel__tip{color:#f0b849}.editor-post-saved-state{display:flex;align-items:center;width:28px;padding:12px 4px;color:#555d66;overflow:hidden;white-space:nowrap}.editor-post-saved-state svg{display:inline-block;flex:0 0 auto;margin-right:4px;fill:currentColor}@media (min-width:600px){.editor-post-saved-state{width:auto;padding:8px 12px;text-indent:inherit}.editor-post-saved-state .dashicon{margin-right:4px}}.edit-post-header .edit-post-header__settings .components-button.editor-post-save-draft{margin:0}.editor-post-taxonomies__hierarchical-terms-list{max-height:14em;overflow:auto;padding-left:2px}.editor-post-taxonomies__hierarchical-terms-choice{margin-bottom:8px}.editor-post-taxonomies__hierarchical-terms-subchoices{margin-top:8px;margin-left:16px}.components-button.editor-post-taxonomies__hierarchical-terms-add,.components-button.editor-post-taxonomies__hierarchical-terms-submit{margin-top:12px}.editor-post-taxonomies__hierarchical-terms-label{display:inline-block;margin-top:12px}.editor-post-taxonomies__hierarchical-terms-input{margin-top:8px;width:100%}.editor-post-taxonomies__hierarchical-terms-filter{margin-bottom:8px;width:100%}.editor-post-text-editor{border:1px solid #e2e4e7!important;display:block;margin:0 0 2em;width:100%;box-shadow:none;resize:none;overflow:hidden;font-family:Menlo,Consolas,monaco,monospace!important;line-height:150%;border-radius:0!important;font-size:16px!important}@media (min-width:600px){.editor-post-text-editor{font-size:14px!important}}.editor-post-text-editor:focus,.editor-post-text-editor:hover{border:1px solid #b5bcc2!important;box-shadow:none!important;outline-offset:-2px!important}.editor-post-text-editor__toolbar{display:flex;flex-direction:row;flex-wrap:wrap}.editor-post-text-editor__toolbar button{height:30px;background:none;padding:0 8px;margin:3px 4px;text-align:center;cursor:pointer;font-family:Menlo,Consolas,monaco,monospace;color:#555d66;border:1px solid transparent}.editor-post-text-editor__toolbar button:first-child{margin-left:0}.editor-post-text-editor__toolbar button:focus,.editor-post-text-editor__toolbar button:hover{outline:none;border:1px solid #555d66}.editor-post-text-editor__bold{font-weight:600}.editor-post-text-editor__italic{font-style:italic}.editor-post-text-editor__link{text-decoration:underline;color:#0085ba}body.admin-color-sunrise .editor-post-text-editor__link{color:#d1864a}body.admin-color-ocean .editor-post-text-editor__link{color:#a3b9a2}body.admin-color-midnight .editor-post-text-editor__link{color:#e14d43}body.admin-color-ectoplasm .editor-post-text-editor__link{color:#a7b656}body.admin-color-coffee .editor-post-text-editor__link{color:#c2a68c}body.admin-color-blue .editor-post-text-editor__link{color:#82b4cb}body.admin-color-light .editor-post-text-editor__link{color:#0085ba}.editor-post-text-editor__del{text-decoration:line-through}.edit-post-post-visibility__dialog,.editor-post-visibility__dialog-fieldset{padding:0 4px 4px}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-legend,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-legend{font-weight:600;margin-bottom:1em;margin-top:.5em;padding:0}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio{margin-top:2px}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-label,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-label{font-weight:600}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-info,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-info{margin-top:0;margin-left:28px}.edit-post-post-visibility__dialog .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info,.editor-post-visibility__dialog-fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info{margin-bottom:0}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-password-input,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-password-input{margin-left:28px}.editor-post-title__block{position:relative;padding:5px 0;font-size:16px}@media (min-width:600px){.editor-post-title__block{padding:5px 2px}}.editor-post-title__block .editor-post-title__input{display:block;width:100%;margin:0;box-shadow:none;background:transparent;font-family:"Noto Serif",serif;line-height:1.4;color:#191e23;transition:border .1s ease-out,box-shadow .1s linear;padding:19px 14px;word-break:keep-all;border-color:transparent;border-style:solid;border-width:1px 0;border-radius:0;outline:1px solid transparent;font-size:2.44em;font-weight:600}@media (prefers-reduced-motion:reduce){.editor-post-title__block .editor-post-title__input{transition-duration:0s}}@media (min-width:600px){.editor-post-title__block .editor-post-title__input{border-width:1px 1px 1px 0}}.editor-post-title__block .editor-post-title__input::-webkit-input-placeholder{color:rgba(22,36,53,.55)}.editor-post-title__block .editor-post-title__input::-moz-placeholder{color:rgba(22,36,53,.55)}.editor-post-title__block .editor-post-title__input:-ms-input-placeholder{color:rgba(22,36,53,.55)}.editor-post-title__block .editor-post-title__input:focus{border:1px solid transparent;border-left-width:0;outline:1px solid transparent;box-shadow:none}.editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input{border-color:rgba(66,88,99,.4);box-shadow:inset 3px 0 0 0 #555d66}.is-dark-theme .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input{border-color:hsla(0,0%,100%,.45);box-shadow:inset 3px 0 0 0 #d7dade}@media (min-width:600px){.editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input{box-shadow:-3px 0 0 0 #555d66}.is-dark-theme .editor-post-title__block:not(.is-focus-mode).is-selected .editor-post-title__input{box-shadow:-3px 0 0 0 #d7dade}}.editor-post-title__block.is-focus-mode .editor-post-title__input{opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.editor-post-title__block.is-focus-mode .editor-post-title__input{transition-duration:0s}}.editor-post-title__block.is-focus-mode .editor-post-title__input:focus{opacity:1}.editor-post-title .editor-post-permalink{font-size:13px;color:#191e23;height:auto;position:relative;left:3px;top:-2px;width:calc(100% - 3px)}@media (min-width:480px){.editor-post-title .editor-post-permalink{position:absolute;top:-34px;right:0;flex-wrap:nowrap;width:auto}}@media (min-width:600px){.editor-post-title .editor-post-permalink{left:2px;right:2px}}.editor-post-trash.components-button{color:#b52727;border-color:#b52727;justify-content:center}.editor-post-trash.components-button:not(:disabled):not([aria-disabled=true]):hover,.editor-post-trash.components-button:not([aria-disabled=true]):focus{color:#a02222;border-color:#a02222}.table-of-contents__popover.components-popover .components-popover__content{min-width:380px}.components-popover.table-of-contents__popover{z-index:99998}.table-of-contents__popover .components-popover__content{padding:16px}@media (min-width:600px){.table-of-contents__popover .components-popover__content{max-height:calc(100vh - 120px);overflow-y:auto}}.table-of-contents__popover hr{margin:10px -16px 0}.table-of-contents__wrapper:focus{color:#191e23;outline-offset:-1px;outline:1px dotted #555d66;outline-offset:8px}.table-of-contents__counts{display:flex;flex-wrap:wrap;margin:0}.table-of-contents__count{flex-basis:25%;display:flex;flex-direction:column;font-size:13px;color:#6c7781;padding-right:8px;margin-bottom:0}.table-of-contents__count:last-child{padding-right:0}.table-of-contents__number,.table-of-contents__popover .word-count{font-size:21px;font-weight:400;line-height:30px;color:#555d66}.table-of-contents__title{display:block;margin-top:20px;font-size:15px;font-weight:600}.editor-template-validation-notice{display:flex;justify-content:space-between;align-items:center}.editor-template-validation-notice .components-button{margin-left:5px} \ No newline at end of file diff --git a/wp-includes/css/dist/format-library/style-rtl.css b/wp-includes/css/dist/format-library/style-rtl.css new file mode 100644 index 0000000..4e0e359 --- /dev/null +++ b/wp-includes/css/dist/format-library/style-rtl.css @@ -0,0 +1,111 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.block-editor-format-toolbar__image-container-content { + display: flex; } + .block-editor-format-toolbar__image-container-content .components-button { + align-self: flex-end; + height: 30px; + margin-bottom: 8px; + margin-left: 8px; + padding: 0 6px; } + +.block-editor-format-toolbar__image-container-value { + margin: 7px; + flex-grow: 1; + flex-shrink: 1; + white-space: nowrap; + min-width: 150px; + max-width: 500px; } + .block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__field { + margin-bottom: 0; } + .block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__label { + display: block; } + +.block-editor-format-toolbar__link-container-content { + display: flex; } + +.block-editor-format-toolbar__link-container-value { + margin: 7px; + flex-grow: 1; + flex-shrink: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 150px; + max-width: 500px; } + .block-editor-format-toolbar__link-container-value.has-invalid-link { + color: #d94f4f; } + +.components-inline-color__indicator { + position: absolute; + background: #000; + height: 3px; + width: 20px; + bottom: 6px; + right: auto; + left: auto; + margin: 0 5px; } + +.components-inline-color-popover .components-popover__content { + padding: 20px 18px; } + .components-inline-color-popover .components-popover__content .components-color-palette { + margin-top: 0.6rem; } + .components-inline-color-popover .components-popover__content .components-base-control__title { + display: block; + margin-bottom: 16px; + font-weight: 600; + color: #191e23; } + .components-inline-color-popover .components-popover__content .component-color-indicator { + vertical-align: text-bottom; } + +.format-library-text-color-button { + position: relative; } + +.format-library-text-color-button__indicator { + height: 4px; + width: 20px; + position: absolute; + bottom: 6px; + right: 8px; } diff --git a/wp-includes/css/dist/format-library/style-rtl.min.css b/wp-includes/css/dist/format-library/style-rtl.min.css new file mode 100644 index 0000000..012771a --- /dev/null +++ b/wp-includes/css/dist/format-library/style-rtl.min.css @@ -0,0 +1 @@ +.block-editor-format-toolbar__image-container-content{display:flex}.block-editor-format-toolbar__image-container-content .components-button{align-self:flex-end;height:30px;margin-bottom:8px;margin-left:8px;padding:0 6px}.block-editor-format-toolbar__image-container-value{margin:7px;flex-grow:1;flex-shrink:1;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__field{margin-bottom:0}.block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__label{display:block}.block-editor-format-toolbar__link-container-content{display:flex}.block-editor-format-toolbar__link-container-value{margin:7px;flex-grow:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-format-toolbar__link-container-value.has-invalid-link{color:#d94f4f}.components-inline-color__indicator{position:absolute;background:#000;height:3px;width:20px;bottom:6px;right:auto;left:auto;margin:0 5px}.components-inline-color-popover .components-popover__content{padding:20px 18px}.components-inline-color-popover .components-popover__content .components-color-palette{margin-top:.6rem}.components-inline-color-popover .components-popover__content .components-base-control__title{display:block;margin-bottom:16px;font-weight:600;color:#191e23}.components-inline-color-popover .components-popover__content .component-color-indicator{vertical-align:text-bottom}.format-library-text-color-button{position:relative}.format-library-text-color-button__indicator{height:4px;width:20px;position:absolute;bottom:6px;right:8px} \ No newline at end of file diff --git a/wp-includes/css/dist/format-library/style.css b/wp-includes/css/dist/format-library/style.css new file mode 100644 index 0000000..6b64b92 --- /dev/null +++ b/wp-includes/css/dist/format-library/style.css @@ -0,0 +1,111 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Grid System. + * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.block-editor-format-toolbar__image-container-content { + display: flex; } + .block-editor-format-toolbar__image-container-content .components-button { + align-self: flex-end; + height: 30px; + margin-bottom: 8px; + margin-right: 8px; + padding: 0 6px; } + +.block-editor-format-toolbar__image-container-value { + margin: 7px; + flex-grow: 1; + flex-shrink: 1; + white-space: nowrap; + min-width: 150px; + max-width: 500px; } + .block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__field { + margin-bottom: 0; } + .block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__label { + display: block; } + +.block-editor-format-toolbar__link-container-content { + display: flex; } + +.block-editor-format-toolbar__link-container-value { + margin: 7px; + flex-grow: 1; + flex-shrink: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 150px; + max-width: 500px; } + .block-editor-format-toolbar__link-container-value.has-invalid-link { + color: #d94f4f; } + +.components-inline-color__indicator { + position: absolute; + background: #000; + height: 3px; + width: 20px; + bottom: 6px; + left: auto; + right: auto; + margin: 0 5px; } + +.components-inline-color-popover .components-popover__content { + padding: 20px 18px; } + .components-inline-color-popover .components-popover__content .components-color-palette { + margin-top: 0.6rem; } + .components-inline-color-popover .components-popover__content .components-base-control__title { + display: block; + margin-bottom: 16px; + font-weight: 600; + color: #191e23; } + .components-inline-color-popover .components-popover__content .component-color-indicator { + vertical-align: text-bottom; } + +.format-library-text-color-button { + position: relative; } + +.format-library-text-color-button__indicator { + height: 4px; + width: 20px; + position: absolute; + bottom: 6px; + left: 8px; } diff --git a/wp-includes/css/dist/format-library/style.min.css b/wp-includes/css/dist/format-library/style.min.css new file mode 100644 index 0000000..d5f0c2a --- /dev/null +++ b/wp-includes/css/dist/format-library/style.min.css @@ -0,0 +1 @@ +.block-editor-format-toolbar__image-container-content{display:flex}.block-editor-format-toolbar__image-container-content .components-button{align-self:flex-end;height:30px;margin-bottom:8px;margin-right:8px;padding:0 6px}.block-editor-format-toolbar__image-container-value{margin:7px;flex-grow:1;flex-shrink:1;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__field{margin-bottom:0}.block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__label{display:block}.block-editor-format-toolbar__link-container-content{display:flex}.block-editor-format-toolbar__link-container-value{margin:7px;flex-grow:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-format-toolbar__link-container-value.has-invalid-link{color:#d94f4f}.components-inline-color__indicator{position:absolute;background:#000;height:3px;width:20px;bottom:6px;left:auto;right:auto;margin:0 5px}.components-inline-color-popover .components-popover__content{padding:20px 18px}.components-inline-color-popover .components-popover__content .components-color-palette{margin-top:.6rem}.components-inline-color-popover .components-popover__content .components-base-control__title{display:block;margin-bottom:16px;font-weight:600;color:#191e23}.components-inline-color-popover .components-popover__content .component-color-indicator{vertical-align:text-bottom}.format-library-text-color-button{position:relative}.format-library-text-color-button__indicator{height:4px;width:20px;position:absolute;bottom:6px;left:8px} \ No newline at end of file diff --git a/wp-includes/css/dist/list-reusable-blocks/style-rtl.css b/wp-includes/css/dist/list-reusable-blocks/style-rtl.css new file mode 100644 index 0000000..98085c7 --- /dev/null +++ b/wp-includes/css/dist/list-reusable-blocks/style-rtl.css @@ -0,0 +1,61 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.list-reusable-blocks-import-dropdown__content .components-popover__content { + padding: 10px; } + +.list-reusable-blocks-import-form__label { + display: block; + margin-bottom: 10px; } + +.list-reusable-blocks-import-form__button { + margin-top: 20px; + float: left; } + +.list-reusable-blocks-import-form .components-notice__content { + margin: 0; } + +.list-reusable-blocks__container { + display: inline-flex; + align-items: center; + position: relative; + top: -3px; } + .list-reusable-blocks__container .components-button { + height: 26px; } diff --git a/wp-includes/css/dist/list-reusable-blocks/style-rtl.min.css b/wp-includes/css/dist/list-reusable-blocks/style-rtl.min.css new file mode 100644 index 0000000..de1b122 --- /dev/null +++ b/wp-includes/css/dist/list-reusable-blocks/style-rtl.min.css @@ -0,0 +1 @@ +.list-reusable-blocks-import-dropdown__content .components-popover__content{padding:10px}.list-reusable-blocks-import-form__label{display:block;margin-bottom:10px}.list-reusable-blocks-import-form__button{margin-top:20px;float:left}.list-reusable-blocks-import-form .components-notice__content{margin:0}.list-reusable-blocks__container{display:inline-flex;align-items:center;position:relative;top:-3px}.list-reusable-blocks__container .components-button{height:26px} \ No newline at end of file diff --git a/wp-includes/css/dist/list-reusable-blocks/style.css b/wp-includes/css/dist/list-reusable-blocks/style.css new file mode 100644 index 0000000..288ae67 --- /dev/null +++ b/wp-includes/css/dist/list-reusable-blocks/style.css @@ -0,0 +1,61 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.list-reusable-blocks-import-dropdown__content .components-popover__content { + padding: 10px; } + +.list-reusable-blocks-import-form__label { + display: block; + margin-bottom: 10px; } + +.list-reusable-blocks-import-form__button { + margin-top: 20px; + float: right; } + +.list-reusable-blocks-import-form .components-notice__content { + margin: 0; } + +.list-reusable-blocks__container { + display: inline-flex; + align-items: center; + position: relative; + top: -3px; } + .list-reusable-blocks__container .components-button { + height: 26px; } diff --git a/wp-includes/css/dist/list-reusable-blocks/style.min.css b/wp-includes/css/dist/list-reusable-blocks/style.min.css new file mode 100644 index 0000000..0d913f5 --- /dev/null +++ b/wp-includes/css/dist/list-reusable-blocks/style.min.css @@ -0,0 +1 @@ +.list-reusable-blocks-import-dropdown__content .components-popover__content{padding:10px}.list-reusable-blocks-import-form__label{display:block;margin-bottom:10px}.list-reusable-blocks-import-form__button{margin-top:20px;float:right}.list-reusable-blocks-import-form .components-notice__content{margin:0}.list-reusable-blocks__container{display:inline-flex;align-items:center;position:relative;top:-3px}.list-reusable-blocks__container .components-button{height:26px} \ No newline at end of file diff --git a/wp-includes/css/dist/nux/style-rtl.css b/wp-includes/css/dist/nux/style-rtl.css new file mode 100644 index 0000000..5c40f21 --- /dev/null +++ b/wp-includes/css/dist/nux/style-rtl.css @@ -0,0 +1,126 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.nux-dot-tip::before, .nux-dot-tip::after { + border-radius: 100%; + content: " "; + pointer-events: none; + position: absolute; } + +.nux-dot-tip::before { + animation: nux-pulse 1.6s infinite cubic-bezier(0.17, 0.67, 0.92, 0.62); + background: rgba(0, 115, 156, 0.9); + height: 24px; + right: -12px; + top: -12px; + transform: scale(0.33333); + width: 24px; } + +.nux-dot-tip::after { + background: #00739c; + height: 8px; + right: -4px; + top: -4px; + width: 8px; } + +@keyframes nux-pulse { + 100% { + background: rgba(0, 115, 156, 0); + transform: scale(1); } } + +.nux-dot-tip .components-popover__content { + padding: 5px 20px 5px 41px; + width: 350px; } + @media (min-width: 600px) { + .nux-dot-tip .components-popover__content { + width: 450px; } } + .nux-dot-tip .components-popover__content .nux-dot-tip__disable { + position: absolute; + left: 0; + top: 0; } + +.nux-dot-tip[data-y-axis="top"] { + margin-top: -4px; } + +.nux-dot-tip[data-y-axis="bottom"] { + margin-top: 4px; } + +.nux-dot-tip[data-y-axis="middle"][data-y-axis="left"] { + margin-right: -4px; } + +.nux-dot-tip[data-y-axis="middle"][data-y-axis="right"] { + margin-right: 4px; } + +.nux-dot-tip[data-y-axis="top"] .components-popover__content { + margin-bottom: 20px; } + +.nux-dot-tip[data-y-axis="bottom"] .components-popover__content { + margin-top: 20px; } + +.nux-dot-tip[data-y-axis="middle"][data-y-axis="left"] .components-popover__content { + margin-left: 20px; } + +.nux-dot-tip[data-y-axis="middle"][data-y-axis="right"] .components-popover__content { + margin-right: 20px; } + +.nux-dot-tip[data-y-axis="left"], .nux-dot-tip[data-y-axis="center"], .nux-dot-tip[data-y-axis="right"] { + z-index: 1000001; } + @media (max-width: 600px) { + .nux-dot-tip[data-y-axis="left"] .components-popover__content, .nux-dot-tip[data-y-axis="center"] .components-popover__content, .nux-dot-tip[data-y-axis="right"] .components-popover__content { + -ms-grid-row-align: end; + align-self: end; + right: 5px; + margin: 20px 0 0 0; + max-width: none !important; + position: fixed; + left: 5px; + width: auto; } } + +.nux-dot-tip.components-popover:not([data-y-axis="middle"])[data-y-axis="right"] .components-popover__content { + margin-left: 0; } + +.nux-dot-tip.components-popover:not([data-y-axis="middle"])[data-y-axis="left"] .components-popover__content { + margin-right: 0; } + +.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis="middle"])[data-y-axis="right"] .components-popover__content { + margin-left: -12px; } + +.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis="middle"])[data-y-axis="left"] .components-popover__content { + margin-right: -12px; } diff --git a/wp-includes/css/dist/nux/style-rtl.min.css b/wp-includes/css/dist/nux/style-rtl.min.css new file mode 100644 index 0000000..1814f27 --- /dev/null +++ b/wp-includes/css/dist/nux/style-rtl.min.css @@ -0,0 +1 @@ +.nux-dot-tip:after,.nux-dot-tip:before{border-radius:100%;content:" ";pointer-events:none;position:absolute}.nux-dot-tip:before{animation:nux-pulse 1.6s cubic-bezier(.17,.67,.92,.62) infinite;background:rgba(0,115,156,.9);height:24px;right:-12px;top:-12px;transform:scale(.33333);width:24px}.nux-dot-tip:after{background:#00739c;height:8px;right:-4px;top:-4px;width:8px}@keyframes nux-pulse{to{background:rgba(0,115,156,0);transform:scale(1)}}.nux-dot-tip .components-popover__content{padding:5px 20px 5px 41px;width:350px}@media (min-width:600px){.nux-dot-tip .components-popover__content{width:450px}}.nux-dot-tip .components-popover__content .nux-dot-tip__disable{position:absolute;left:0;top:0}.nux-dot-tip[data-y-axis=top]{margin-top:-4px}.nux-dot-tip[data-y-axis=bottom]{margin-top:4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left]{margin-right:-4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right]{margin-right:4px}.nux-dot-tip[data-y-axis=top] .components-popover__content{margin-bottom:20px}.nux-dot-tip[data-y-axis=bottom] .components-popover__content{margin-top:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content{margin-left:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content{margin-right:20px}.nux-dot-tip[data-y-axis=center],.nux-dot-tip[data-y-axis=left],.nux-dot-tip[data-y-axis=right]{z-index:1000001}@media (max-width:600px){.nux-dot-tip[data-y-axis=center] .components-popover__content,.nux-dot-tip[data-y-axis=left] .components-popover__content,.nux-dot-tip[data-y-axis=right] .components-popover__content{-ms-grid-row-align:end;align-self:end;right:5px;margin:20px 0 0;max-width:none!important;position:fixed;left:5px;width:auto}}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{margin-left:0}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{margin-right:0}.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{margin-left:-12px}.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{margin-right:-12px} \ No newline at end of file diff --git a/wp-includes/css/dist/nux/style.css b/wp-includes/css/dist/nux/style.css new file mode 100644 index 0000000..96b7cc3 --- /dev/null +++ b/wp-includes/css/dist/nux/style.css @@ -0,0 +1,130 @@ +/** + * Colors + */ +/** + * Breakpoints & Media Queries + */ +/** + * Colors + */ +/** + * Often re-used variables + */ +/** + * Breakpoint mixins + */ +/** + * Long content fade mixin + * + * Creates a fading overlay to signify that the content is longer + * than the space allows. + */ +/** + * Button states and focus styles + */ +/** + * Applies editor left position to the selector passed as argument + */ +/** + * Styles that are reused verbatim in a few places + */ +/** + * Allows users to opt-out of animations via OS-level preferences. + */ +/** + * Reset default styles for JavaScript UI based pages. + * This is a WP-admin agnostic reset + */ +/** + * Reset the WP Admin page styles for Gutenberg-like pages. + */ +.nux-dot-tip::before, .nux-dot-tip::after { + border-radius: 100%; + content: " "; + pointer-events: none; + position: absolute; } + +.nux-dot-tip::before { + animation: nux-pulse 1.6s infinite cubic-bezier(0.17, 0.67, 0.92, 0.62); + background: rgba(0, 115, 156, 0.9); + height: 24px; + left: -12px; + top: -12px; + transform: scale(0.33333); + width: 24px; } + +.nux-dot-tip::after { + background: #00739c; + height: 8px; + left: -4px; + top: -4px; + width: 8px; } + +@keyframes nux-pulse { + 100% { + background: rgba(0, 115, 156, 0); + transform: scale(1); } } + +.nux-dot-tip .components-popover__content { + padding: 5px 41px 5px 20px; + width: 350px; } + @media (min-width: 600px) { + .nux-dot-tip .components-popover__content { + width: 450px; } } + .nux-dot-tip .components-popover__content .nux-dot-tip__disable { + position: absolute; + right: 0; + top: 0; } + +.nux-dot-tip[data-y-axis="top"] { + margin-top: -4px; } + +.nux-dot-tip[data-y-axis="bottom"] { + margin-top: 4px; } + +.nux-dot-tip[data-y-axis="middle"][data-y-axis="left"] { + margin-left: -4px; } + +.nux-dot-tip[data-y-axis="middle"][data-y-axis="right"] { + margin-left: 4px; } + +.nux-dot-tip[data-y-axis="top"] .components-popover__content { + margin-bottom: 20px; } + +.nux-dot-tip[data-y-axis="bottom"] .components-popover__content { + margin-top: 20px; } + +.nux-dot-tip[data-y-axis="middle"][data-y-axis="left"] .components-popover__content { + margin-right: 20px; } + +.nux-dot-tip[data-y-axis="middle"][data-y-axis="right"] .components-popover__content { + margin-left: 20px; } + +.nux-dot-tip[data-y-axis="left"], .nux-dot-tip[data-y-axis="center"], .nux-dot-tip[data-y-axis="right"] { + z-index: 1000001; } + @media (max-width: 600px) { + .nux-dot-tip[data-y-axis="left"] .components-popover__content, .nux-dot-tip[data-y-axis="center"] .components-popover__content, .nux-dot-tip[data-y-axis="right"] .components-popover__content { + -ms-grid-row-align: end; + align-self: end; + left: 5px; + margin: 20px 0 0 0; + max-width: none !important; + position: fixed; + right: 5px; + width: auto; } } + +.nux-dot-tip.components-popover:not([data-y-axis="middle"])[data-y-axis="right"] .components-popover__content { + /*!rtl:ignore*/ + margin-left: 0; } + +.nux-dot-tip.components-popover:not([data-y-axis="middle"])[data-y-axis="left"] .components-popover__content { + /*!rtl:ignore*/ + margin-right: 0; } + +.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis="middle"])[data-y-axis="right"] .components-popover__content { + /*!rtl:ignore*/ + margin-left: -12px; } + +.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis="middle"])[data-y-axis="left"] .components-popover__content { + /*!rtl:ignore*/ + margin-right: -12px; } diff --git a/wp-includes/css/dist/nux/style.min.css b/wp-includes/css/dist/nux/style.min.css new file mode 100644 index 0000000..6d80289 --- /dev/null +++ b/wp-includes/css/dist/nux/style.min.css @@ -0,0 +1,5 @@ +.nux-dot-tip:after,.nux-dot-tip:before{border-radius:100%;content:" ";pointer-events:none;position:absolute}.nux-dot-tip:before{animation:nux-pulse 1.6s cubic-bezier(.17,.67,.92,.62) infinite;background:rgba(0,115,156,.9);height:24px;left:-12px;top:-12px;transform:scale(.33333);width:24px}.nux-dot-tip:after{background:#00739c;height:8px;left:-4px;top:-4px;width:8px}@keyframes nux-pulse{to{background:rgba(0,115,156,0);transform:scale(1)}}.nux-dot-tip .components-popover__content{padding:5px 41px 5px 20px;width:350px}@media (min-width:600px){.nux-dot-tip .components-popover__content{width:450px}}.nux-dot-tip .components-popover__content .nux-dot-tip__disable{position:absolute;right:0;top:0}.nux-dot-tip[data-y-axis=top]{margin-top:-4px}.nux-dot-tip[data-y-axis=bottom]{margin-top:4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left]{margin-left:-4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right]{margin-left:4px}.nux-dot-tip[data-y-axis=top] .components-popover__content{margin-bottom:20px}.nux-dot-tip[data-y-axis=bottom] .components-popover__content{margin-top:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content{margin-right:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content{margin-left:20px}.nux-dot-tip[data-y-axis=center],.nux-dot-tip[data-y-axis=left],.nux-dot-tip[data-y-axis=right]{z-index:1000001}@media (max-width:600px){.nux-dot-tip[data-y-axis=center] .components-popover__content,.nux-dot-tip[data-y-axis=left] .components-popover__content,.nux-dot-tip[data-y-axis=right] .components-popover__content{-ms-grid-row-align:end;align-self:end;left:5px;margin:20px 0 0;max-width:none!important;position:fixed;right:5px;width:auto}}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{ + /*!rtl:ignore*/margin-left:0}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{ + /*!rtl:ignore*/margin-right:0}.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{ + /*!rtl:ignore*/margin-left:-12px}.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{ + /*!rtl:ignore*/margin-right:-12px} \ No newline at end of file diff --git a/wp-includes/css/editor-rtl.css b/wp-includes/css/editor-rtl.css new file mode 100644 index 0000000..73d65b8 --- /dev/null +++ b/wp-includes/css/editor-rtl.css @@ -0,0 +1,1883 @@ +/*! This file is auto-generated */ +/*------------------------------------------------------------------------------ + TinyMCE and Quicklinks toolbars +------------------------------------------------------------------------------*/ + +/* TinyMCE widgets/containers */ + +.mce-tinymce { + box-shadow: none; +} + +.mce-container, +.mce-container *, +.mce-widget, +.mce-widget * { + color: inherit; + font-family: inherit; +} + +.mce-container .mce-monospace, +.mce-widget .mce-monospace { + font-family: Consolas, Monaco, monospace; + font-size: 13px; + line-height: 150%; +} + +/* TinyMCE windows */ +#mce-modal-block, +#mce-modal-block.mce-fade { + opacity: 0.7; + filter: alpha(opacity=70); + transition: none; + background: #000; +} + +.mce-window { + border-radius: 0; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + -webkit-font-smoothing: subpixel-antialiased; + transition: none; +} + +.mce-window .mce-container-body.mce-abs-layout { + overflow: visible; +} + +.mce-window .mce-window-head { + background: #fcfcfc; + border-bottom: 1px solid #ddd; + padding: 0; + min-height: 36px; +} + +.mce-window .mce-window-head .mce-title { + color: #444; + font-size: 18px; + font-weight: 600; + line-height: 36px; + margin: 0; + padding: 0 16px 0 36px; +} + +.mce-window .mce-window-head .mce-close, +.mce-window-head .mce-close .mce-i-remove { + color: transparent; + top: 0; + left: 0; + width: 36px; + height: 36px; + padding: 0; + line-height: 36px; + text-align: center; +} + +.mce-window-head .mce-close .mce-i-remove:before { + font: normal 20px/36px dashicons; + text-align: center; + color: #666; + width: 36px; + height: 36px; + display: block; +} + +.mce-window-head .mce-close:hover .mce-i-remove:before, +.mce-window-head .mce-close:focus .mce-i-remove:before { + color: #00a0d2; +} + +.mce-window-head .mce-close:focus .mce-i-remove, +div.mce-tab:focus { + box-shadow: 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.mce-window .mce-window-head .mce-dragh { + width: calc( 100% - 36px ); +} + +.mce-window .mce-foot { + border-top: 1px solid #ddd; +} + +.mce-textbox, +.mce-checkbox i.mce-i-checkbox, +#wp-link .query-results { + border: 1px solid #ddd; + border-radius: 0; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07); + transition: .05s all ease-in-out; +} + +.mce-textbox:focus, +.mce-textbox.mce-focus, +.mce-checkbox:focus i.mce-i-checkbox, +#wp-link .query-results:focus { + border-color: #5b9dd9; + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); +} + +.mce-window .mce-wp-help { + height: 360px; + width: 460px; + overflow: auto; +} + +.mce-window .mce-wp-help * { + box-sizing: border-box; +} + +.mce-window .mce-wp-help > .mce-container-body { + width: auto !important; +} + +.mce-window .wp-editor-help { + padding: 10px 20px 0 10px; +} + +.mce-window .wp-editor-help h2, +.mce-window .wp-editor-help p { + margin: 8px 0; + white-space: normal; + font-size: 14px; + font-weight: 400; +} + +.mce-window .wp-editor-help table { + width: 100%; + margin-bottom: 20px; +} + +.mce-window .wp-editor-help table.wp-help-single { + margin: 0 8px 20px; +} + +.mce-window .wp-editor-help table.fixed { + table-layout: fixed; +} + +.mce-window .wp-editor-help table.fixed th:nth-child(odd), +.mce-window .wp-editor-help table.fixed td:nth-child(odd) { + width: 12%; +} + +.mce-window .wp-editor-help table.fixed th:nth-child(even), +.mce-window .wp-editor-help table.fixed td:nth-child(even) { + width: 38%; +} + +.mce-window .wp-editor-help table.fixed th:nth-child(odd) { + padding: 5px 0 0; +} + +.mce-window .wp-editor-help td, +.mce-window .wp-editor-help th { + font-size: 13px; + padding: 5px; + vertical-align: middle; + word-wrap: break-word; + white-space: normal; +} + +.mce-window .wp-editor-help th { + font-weight: 600; + padding-bottom: 0; +} + +.mce-window .wp-editor-help kbd { + font-family: monospace; + padding: 2px 7px 3px; + font-weight: 600; + margin: 0; + background: #eaeaea; + background: rgba(0, 0, 0, 0.08); +} + +.mce-window .wp-help-th-center td:nth-child(odd), +.mce-window .wp-help-th-center th:nth-child(odd) { + text-align: center; +} + +/* TinyMCE menus */ +.mce-menu, +.mce-floatpanel.mce-popover { + border-color: rgba(0, 0, 0, 0.15); + border-radius: 0; + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); +} + +.mce-menu, +.mce-floatpanel.mce-popover.mce-bottom { + margin-top: 2px; +} + +.mce-floatpanel .mce-arrow { + display: none; +} + +.mce-menu .mce-container-body { + min-width: 160px; +} + +.mce-menu-item { + border: none; + margin-bottom: 2px; + padding: 6px 12px 6px 15px; +} + +.mce-menu-has-icons i.mce-ico { + line-height: 20px; +} + +/* TinyMCE panel */ +div.mce-panel { + border: 0; + background: #fff; +} + +.mce-panel.mce-menu { + border: 1px solid #ddd; +} + +div.mce-tab { + line-height: 13px; +} + +/* TinyMCE toolbars */ +div.mce-toolbar-grp { + border-bottom: 1px solid #ddd; + background: #f5f5f5; + padding: 0; + position: relative; +} + +div.mce-inline-toolbar-grp { + border: 1px solid #a0a5aa; + border-radius: 2px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + box-sizing: border-box; + margin-bottom: 8px; + position: absolute; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + max-width: 98%; + z-index: 100100; /* Same as the other TinyMCE "panels" */ +} + +div.mce-inline-toolbar-grp > div.mce-stack-layout { + padding: 1px; +} + +div.mce-inline-toolbar-grp.mce-arrow-up { + margin-bottom: 0; + margin-top: 8px; +} + +div.mce-inline-toolbar-grp:before, +div.mce-inline-toolbar-grp:after { + position: absolute; + right: 50%; + display: block; + width: 0; + height: 0; + border-style: solid; + border-color: transparent; + content: ""; +} + +div.mce-inline-toolbar-grp.mce-arrow-up:before { + top: -9px; + border-bottom-color: #a0a5aa; + border-width: 0 9px 9px; + margin-right: -9px; +} + +div.mce-inline-toolbar-grp.mce-arrow-down:before { + bottom: -9px; + border-top-color: #a0a5aa; + border-width: 9px 9px 0; + margin-right: -9px; +} + +div.mce-inline-toolbar-grp.mce-arrow-up:after { + top: -8px; + border-bottom-color: #f5f5f5; + border-width: 0 8px 8px; + margin-right: -8px; +} + +div.mce-inline-toolbar-grp.mce-arrow-down:after { + bottom: -8px; + border-top-color: #f5f5f5; + border-width: 8px 8px 0; + margin-right: -8px; +} + +div.mce-inline-toolbar-grp.mce-arrow-left:before, +div.mce-inline-toolbar-grp.mce-arrow-left:after { + margin: 0; +} + +div.mce-inline-toolbar-grp.mce-arrow-left:before { + right: 20px; +} +div.mce-inline-toolbar-grp.mce-arrow-left:after { + right: 21px; +} + +div.mce-inline-toolbar-grp.mce-arrow-right:before, +div.mce-inline-toolbar-grp.mce-arrow-right:after { + right: auto; + margin: 0; +} + +div.mce-inline-toolbar-grp.mce-arrow-right:before { + left: 20px; +} + +div.mce-inline-toolbar-grp.mce-arrow-right:after { + left: 21px; +} + +div.mce-inline-toolbar-grp.mce-arrow-full { + left: 0; +} + +div.mce-inline-toolbar-grp.mce-arrow-full > div { + width: 100%; + overflow-x: auto; +} + +div.mce-toolbar-grp > div { + padding: 3px; +} + +.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first { + padding-left: 32px; +} + +.mce-toolbar .mce-btn-group { + margin: 0; +} + +/* Classic block hide/show toolbars */ +.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) { + display: none; +} + +.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar { + display: block; +} + +div.mce-statusbar { + border-top: 1px solid #e5e5e5; +} + +div.mce-path { + padding: 2px 10px; + margin: 0; +} + +.mce-path, +.mce-path-item, +.mce-path .mce-divider { + font-size: 12px; +} + +.mce-toolbar .mce-btn, +.qt-dfw { + border-color: transparent; + background: transparent; + box-shadow: none; + text-shadow: none; + cursor: pointer; +} + +.mce-btn .mce-txt { + direction: inherit; + text-align: inherit; +} + +.mce-toolbar .mce-btn-group .mce-btn, +.qt-dfw { + border: 1px solid transparent; + margin: 2px; + border-radius: 2px; +} + +.mce-toolbar .mce-btn-group .mce-btn:hover, +.mce-toolbar .mce-btn-group .mce-btn:focus, +.qt-dfw:hover, +.qt-dfw:focus { + background: #fafafa; + border-color: #555d66; + color: #23282d; + box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0, 0, 0, 0.08); + outline: none; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-active, +.mce-toolbar .mce-btn-group .mce-btn:active, +.qt-dfw.active { + background: #ebebeb; + border-color: #555d66; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.3); +} + +.mce-btn.mce-active, +.mce-btn.mce-active button, +.mce-btn.mce-active:hover button, +.mce-btn.mce-active i, +.mce-btn.mce-active:hover i { + color: inherit; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover, +.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus { + border-color: #23282d; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover, +.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus { + color: #a0a5aa; + background: none; + border-color: #ddd; + text-shadow: 0 1px 0 #fff; + box-shadow: none; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus { + border-color: #555d66; +} + +.mce-toolbar .mce-btn-group .mce-first, +.mce-toolbar .mce-btn-group .mce-last { + border-color: transparent; +} + +.mce-toolbar .mce-btn button, +.qt-dfw { + padding: 2px 3px; + line-height: normal; +} + +.mce-toolbar .mce-listbox button { + font-size: 13px; + line-height: 1.53846153; + padding-right: 6px; + padding-left: 20px; +} + +.mce-toolbar .mce-btn i { + text-shadow: none; +} + +.mce-toolbar .mce-btn-group > div { + white-space: normal; +} + +.mce-toolbar .mce-colorbutton .mce-open { + border-left: 0; +} + +.mce-toolbar .mce-colorbutton .mce-preview { + margin: 0; + padding: 0; + top: auto; + bottom: 2px; + right: 3px; + height: 3px; + width: 20px; + background: #555d66; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary { + min-width: 0; + background: #0085ba; + border-color: #0073aa #006799 #006799; + box-shadow: 0 1px 0 #006799; + color: #fff; + text-decoration: none; + text-shadow: none; +} + +/* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */ +.mce-toolbar .mce-btn-group .mce-btn.mce-primary button { + padding: 2px 3px 1px; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico { + color: #fff; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover, +.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus { + background: #008ec2; + border-color: #006799; + color: #fff; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus { + box-shadow: 0 0 1px 1px #33b3db; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active { + background: #0073aa; + border-color: #006799; + box-shadow: inset 0 2px 0 #006799; +} + +/* mce listbox */ +.mce-toolbar .mce-btn-group .mce-btn.mce-listbox { + border-radius: 0; + direction: rtl; + background: #fff; + border: 1px solid #ddd; + box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, 0.2); +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover, +.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus { + border-color: #b4b9be; +} + +.mce-panel .mce-btn i.mce-caret { + border-top: 6px solid #555d66; + margin-right: 2px; + margin-left: 2px; +} + +.mce-listbox i.mce-caret { + left: 4px; +} + +.mce-panel .mce-btn:hover i.mce-caret, +.mce-panel .mce-btn:focus i.mce-caret { + border-top-color: #23282d; +} + +.mce-panel .mce-active i.mce-caret { + border-top: 0; + border-bottom: 6px solid #23282d; + margin-top: 7px; +} + +.mce-listbox.mce-active i.mce-caret { + margin-top: -3px; +} + +.mce-toolbar .mce-splitbtn:hover .mce-open { + border-left-color: transparent; +} + +.mce-toolbar .mce-splitbtn .mce-open.mce-active { + background: transparent; + outline: none; +} + +.mce-menu .mce-menu-item:hover, +.mce-menu .mce-menu-item.mce-selected, +.mce-menu .mce-menu-item:focus, +.mce-menu .mce-menu-item.mce-active.mce-menu-item-normal, +.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview { + background: #0073aa; /* See color scheme. */ + color: #fff; +} + +.mce-menu .mce-menu-item:hover .mce-caret, +.mce-menu .mce-menu-item:focus .mce-caret, +.mce-menu .mce-menu-item.mce-selected .mce-caret { + border-right-color: #fff; +} + +/* rtl:ignore */ +.rtl .mce-menu .mce-menu-item:hover .mce-caret, +.rtl .mce-menu .mce-menu-item:focus .mce-caret, +.rtl .mce-menu .mce-menu-item.mce-selected .mce-caret { + border-left-color: inherit; + border-right-color: #fff; +} + +.mce-menu .mce-menu-item:hover .mce-text, +.mce-menu .mce-menu-item:focus .mce-text, +.mce-menu .mce-menu-item:hover .mce-ico, +.mce-menu .mce-menu-item:focus .mce-ico, +.mce-menu .mce-menu-item.mce-selected .mce-text, +.mce-menu .mce-menu-item.mce-selected .mce-ico, +.mce-menu .mce-menu-item:hover .mce-menu-shortcut, +.mce-menu .mce-menu-item:focus .mce-menu-shortcut, +.mce-menu .mce-menu-item.mce-active .mce-menu-shortcut, +.mce-menu .mce-menu-item.mce-disabled:hover .mce-text, +.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico { + color: inherit; +} + +.mce-menu .mce-menu-item.mce-disabled { + cursor: default; +} + +.mce-menu .mce-menu-item.mce-disabled:hover { + background: #ccc; +} + +/* Menubar */ +div.mce-menubar { + border-color: #e5e5e5; + background: #fff; + border-width: 0px 0px 1px; +} + +.mce-menubar .mce-menubtn:hover, +.mce-menubar .mce-menubtn.mce-active, +.mce-menubar .mce-menubtn:focus { + border-color: transparent; + background: transparent; +} + +.mce-menubar .mce-menubtn:focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +div.mce-menu .mce-menu-item-sep, +.mce-menu-item-sep:hover { + border-bottom: 1px solid #ddd; + height: 0px; + margin: 5px 0; +} + +.mce-menubtn span { + margin-left: 0; + padding-right: 3px; +} + +.mce-menu-has-icons i.mce-ico:before { + margin-right: -2px; +} + +/* Keyboard shortcuts position */ +.mce-menu.mce-menu-align .mce-menu-item-normal { + position: relative; +} + +.mce-menu.mce-menu-align .mce-menu-shortcut { + bottom: 0.6em; + font-size: 0.9em; +} + +/* Buttons in modals */ +.mce-primary button, +.mce-primary button i { + text-align: center; + color: #fff; + text-shadow: none; + padding: 0; + line-height: 1.85714285; +} + +.mce-window .mce-btn { + color: #555; + background: #f7f7f7; + text-decoration: none; + font-size: 13px; + line-height: 26px; + height: 28px; + margin: 0; + padding: 0; + cursor: pointer; + border: 1px solid #cccccc; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-shadow: 0 1px 0 #cccccc; +} + +/* Remove the dotted border on :focus and the extra padding in Firefox */ +.mce-window .mce-btn::-moz-focus-inner { + border-width: 0; + border-style: none; + padding: 0; +} + +.mce-window .mce-btn:hover, +.mce-window .mce-btn:focus { + background: #fafafa; + border-color: #999; + color: #23282d; +} + +.mce-window .mce-btn:focus { + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +.mce-window .mce-btn:active { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); + transform: translateY(1px); +} + +.mce-window .mce-btn.mce-disabled { + color: #a0a5aa !important; + border-color: #ddd !important; + background: #f7f7f7 !important; + box-shadow: none !important; + text-shadow: 0 1px 0 #fff !important; + cursor: default; + transform: none !important; +} + +.mce-window .mce-btn.mce-primary { + background: #0085ba; + border-color: #0073aa #006799 #006799; + box-shadow: 0 1px 0 #006799; + color: #fff; + text-decoration: none; + text-shadow: 0 -1px 1px #006799, + -1px 0 1px #006799, + 0 1px 1px #006799, + 1px 0 1px #006799; +} + +.mce-window .mce-btn.mce-primary:hover, +.mce-window .mce-btn.mce-primary:focus { + background: #008ec2; + border-color: #006799; + color: #fff; +} + +.mce-window .mce-btn.mce-primary:focus { + box-shadow: 0 1px 0 #0073aa, + 0 0 2px 1px #33b3db; +} + +.mce-window .mce-btn.mce-primary:active { + background: #0073aa; + border-color: #006799; + box-shadow: inset 0 2px 0 #006799; + vertical-align: top; +} + +.mce-window .mce-btn.mce-primary.mce-disabled { + color: #66c6e4 !important; + background: #008ec2 !important; + border-color: #007cb2 !important; + box-shadow: none !important; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1) !important; + cursor: default; +} + +.mce-menubtn.mce-fixed-width span { + overflow-x: hidden; + text-overflow: ellipsis; + width: 82px; +} + +/* Charmap modal */ +.mce-charmap { + margin: 3px; +} + +.mce-charmap td { + padding: 0; + border-color: #ddd; + cursor: pointer; +} + +.mce-charmap td:hover { + background: #f3f3f3; +} + +.mce-charmap td div { + width: 18px; + height: 22px; + line-height: 1.57142857; +} + +/* TinyMCE tooltips */ +.mce-tooltip { + margin-top: 2px; +} + +.mce-tooltip-inner { + border-radius: 3px; + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); + color: #fff; + font-size: 12px; +} + +/* TinyMCE icons */ +.mce-ico { + font-family: tinymce, Arial; +} + +.mce-btn-small .mce-ico { + font-family: tinymce-small, Arial; +} + +.mce-toolbar .mce-ico { + color: #555d66; + line-height: 1; + width: 20px; + height: 20px; + text-align: center; + text-shadow: none; + margin: 0; + padding: 0; +} + +.qt-dfw { + color: #555d66; + line-height: 1; + width: 28px; + height: 26px; + text-align: center; + text-shadow: none; +} + +.mce-toolbar .mce-btn .mce-open { + line-height: 20px; +} + +.mce-toolbar .mce-btn:hover .mce-open, +.mce-toolbar .mce-btn:focus .mce-open, +.mce-toolbar .mce-btn.mce-active .mce-open { + border-right-color: #23282d; +} + +div.mce-notification { + right: 10% !important; + left: 10%; +} + +.mce-notification button.mce-close { + left: 6px; + top: 3px; + font-weight: 400; + color: #555d66; +} + +.mce-notification button.mce-close:hover, +.mce-notification button.mce-close:focus { + color: #000; +} + +i.mce-i-bold, +i.mce-i-italic, +i.mce-i-bullist, +i.mce-i-numlist, +i.mce-i-blockquote, +i.mce-i-alignleft, +i.mce-i-aligncenter, +i.mce-i-alignright, +i.mce-i-link, +i.mce-i-unlink, +i.mce-i-wp_more, +i.mce-i-strikethrough, +i.mce-i-spellchecker, +i.mce-i-fullscreen, +i.mce-i-wp_fullscreen, +i.mce-i-dfw, +i.mce-i-wp_adv, +i.mce-i-underline, +i.mce-i-alignjustify, +i.mce-i-forecolor, +i.mce-i-backcolor, +i.mce-i-pastetext, +i.mce-i-pasteword, +i.mce-i-removeformat, +i.mce-i-charmap, +i.mce-i-outdent, +i.mce-i-indent, +i.mce-i-undo, +i.mce-i-redo, +i.mce-i-help, +i.mce-i-wp_help, +i.mce-i-wp-media-library, +i.mce-i-ltr, +i.mce-i-wp_page, +i.mce-i-hr, +i.mce-i-wp_code, +i.mce-i-dashicon, +i.mce-i-remove { + font: normal 20px/1 dashicons; + padding: 0; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + margin-right: -2px; + padding-left: 2px; +} + +.qt-dfw { + font: normal 20px/1 dashicons; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +i.mce-i-bold:before { + content: "\f200"; +} + +i.mce-i-italic:before { + content: "\f201"; +} + +i.mce-i-bullist:before { + content: "\f203"; +} + +i.mce-i-numlist:before { + content: "\f204"; +} + +i.mce-i-blockquote:before { + content: "\f205"; +} + +i.mce-i-alignleft:before { + content: "\f206"; +} + +i.mce-i-aligncenter:before { + content: "\f207"; +} + +i.mce-i-alignright:before { + content: "\f208"; +} + +i.mce-i-link:before { + content: "\f103"; +} + +i.mce-i-unlink:before { + content: "\f225"; +} + +i.mce-i-wp_more:before { + content: "\f209"; +} + +i.mce-i-strikethrough:before { + content: "\f224"; +} + +i.mce-i-spellchecker:before { + content: "\f210"; +} + +i.mce-i-fullscreen:before, +i.mce-i-wp_fullscreen:before, +i.mce-i-dfw:before, +.qt-dfw:before { + content: "\f211"; +} + +i.mce-i-wp_adv:before { + content: "\f212"; +} + +i.mce-i-underline:before { + content: "\f213"; +} + +i.mce-i-alignjustify:before { + content: "\f214"; +} + +i.mce-i-forecolor:before, +i.mce-i-backcolor:before { + content: "\f215"; +} + +i.mce-i-pastetext:before { + content: "\f217"; +} + +i.mce-i-removeformat:before { + content: "\f218"; +} + +i.mce-i-charmap:before { + content: "\f220"; +} + +i.mce-i-outdent:before { + content: "\f221"; +} + +i.mce-i-indent:before { + content: "\f222"; +} + +i.mce-i-undo:before { + content: "\f171"; +} + +i.mce-i-redo:before { + content: "\f172"; +} + +i.mce-i-help:before, +i.mce-i-wp_help:before { + content: "\f223"; +} + +i.mce-i-wp-media-library:before { + content: "\f104"; +} + +i.mce-i-ltr:before { + content: "\f320"; +} + +i.mce-i-wp_page:before { + content: "\f105"; +} + +i.mce-i-hr:before { + content: "\f460"; +} + +i.mce-i-remove:before { + content: "\f158"; +} + +i.mce-i-wp_code:before { + content: "\f475"; +} + +/* RTL button icons */ +.rtl i.mce-i-outdent:before { + content: "\f222"; +} + +.rtl i.mce-i-indent:before { + content: "\f221"; +} + +/* Editors */ +.wp-editor-wrap { + position: relative; +} + +.wp-editor-tools { + position: relative; + z-index: 1; +} + +.wp-editor-tools:after { + clear: both; + content: ""; + display: table; +} + +.wp-editor-container { + clear: both; + border: 1px solid #e5e5e5; +} + +.wp-editor-area { + font-family: Consolas, Monaco, monospace; + font-size: 13px; + padding: 10px; + margin: 1px 0 0; + line-height: 150%; + border: 0; + outline: none; + display: block; + resize: vertical; + box-sizing: border-box; +} + +.rtl .wp-editor-area { + font-family: Tahoma, Monaco, monospace; +} + +.locale-he-il .wp-editor-area { + font-family: Arial, Monaco, monospace; +} + +.wp-editor-container textarea.wp-editor-area { + width: 100%; + margin: 0; + box-shadow: none; +} + +.wp-editor-tabs { + float: left; +} + +.wp-switch-editor { + float: right; + box-sizing: content-box; + position: relative; + top: 1px; + background: #ebebeb; + color: #666; + cursor: pointer; + font-size: 13px; + line-height: 1.46153846; + height: 20px; + margin: 5px 5px 0 0; + padding: 3px 8px 4px; + border: 1px solid #e5e5e5; +} + +.wp-switch-editor:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + outline: none; + color: #23282d; +} + +.wp-switch-editor:active, +.html-active .switch-html:focus, +.tmce-active .switch-tmce:focus { + box-shadow: none; +} + +.wp-switch-editor:active { + background-color: #f5f5f5; + box-shadow: none; +} + +.js .tmce-active .wp-editor-area { + color: #fff; +} + +.tmce-active .quicktags-toolbar { + display: none; +} + +.tmce-active .switch-tmce, +.html-active .switch-html { + background: #f5f5f5; + color: #555; + border-bottom-color: #f5f5f5; +} + +.wp-media-buttons { + float: right; +} + +.wp-media-buttons .button { + margin-left: 5px; + margin-bottom: 4px; + padding-right: 7px; + padding-left: 7px; +} + +.wp-media-buttons .button:active { + position: relative; + top: 1px; + margin-top: -1px; + margin-bottom: 1px; +} + +.wp-media-buttons .insert-media { + padding-right: 5px; +} + +.wp-media-buttons a { + text-decoration: none; + color: #444; + font-size: 12px; +} + +.wp-media-buttons img { + padding: 0 4px; + vertical-align: middle; +} + +.wp-media-buttons span.wp-media-buttons-icon { + display: inline-block; + width: 20px; + height: 20px; + line-height: 1; + vertical-align: middle; + margin: 0 2px; +} + +.wp-media-buttons .add_media span.wp-media-buttons-icon { + background: none; +} + +.wp-media-buttons .add_media span.wp-media-buttons-icon:before { + font: normal 18px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-media-buttons .add_media span.wp-media-buttons-icon:before { + content: "\f104"; +} + +.mce-content-body dl.wp-caption { + max-width: 100%; +} + +/* Quicktags */ +.quicktags-toolbar { + padding: 3px; + position: relative; + border-bottom: 1px solid #ddd; + background: #f5f5f5; + min-height: 30px; +} + +.has-dfw .quicktags-toolbar { + padding-left: 35px; +} + +.wp-core-ui .quicktags-toolbar input.button.button-small { + margin: 2px; +} + +.quicktags-toolbar input[value="link"] { + text-decoration: underline; +} + +.quicktags-toolbar input[value="del"] { + text-decoration: line-through; +} + +.quicktags-toolbar input[value="i"] { + font-style: italic; +} + +.quicktags-toolbar input[value="b"] { + font-weight: 600; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw, +.qt-dfw { + position: absolute; + top: 0; + left: 0; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw { + margin: 7px 0 0 7px; +} + +.qt-dfw { + margin: 5px 0 0 5px; +} + +.qt-fullscreen { + position: static; + margin: 2px; +} + +@media screen and (max-width: 782px) { + .mce-toolbar .mce-btn button, + .qt-dfw { + padding: 6px 7px; + } + + /* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */ + .mce-toolbar .mce-btn-group .mce-btn.mce-primary button { + padding: 6px 7px 5px; + } + + .mce-toolbar .mce-btn-group .mce-btn { + margin: 1px; + } + + .qt-dfw { + width: 36px; + height: 34px; + } + + .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw { + margin: 4px 0 0 4px; + } + + .mce-toolbar .mce-colorbutton .mce-preview { + right: 8px; + bottom: 6px; + } + + .mce-window .mce-btn { + padding: 2px 0; + } + + .has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first, + .has-dfw .quicktags-toolbar { + padding-left: 40px; + } +} + +@media screen and (min-width: 782px) { + .wp-core-ui .quicktags-toolbar input.button.button-small { + /* .button-small is normally 11px, but a bit too small for these buttons. */ + font-size: 12px; + min-height: 26px; + line-height: 2; + } +} + +#wp_editbtns, +#wp_gallerybtns { + padding: 2px; + position: absolute; + display: none; + z-index: 100020; +} + +#wp_editimgbtn, +#wp_delimgbtn, +#wp_editgallery, +#wp_delgallery { + border-color: #999; + background-color: #eee; + margin: 2px; + padding: 2px; + border-width: 1px; + border-style: solid; + border-radius: 3px; +} + +#wp_editimgbtn:hover, +#wp_delimgbtn:hover, +#wp_editgallery:hover, +#wp_delgallery:hover { + border-color: #555; + background-color: #ccc; +} + +/*------------------------------------------------------------------------------ + wp-link +------------------------------------------------------------------------------*/ + +#wp-link-wrap { + display: none; + background-color: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + width: 500px; + overflow: hidden; + margin-right: -250px; + margin-top: -125px; + position: fixed; + top: 50%; + right: 50%; + z-index: 100105; + transition: height 0.2s, margin-top 0.2s; +} + +#wp-link-backdrop { + display: none; + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + min-height: 360px; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 100100; +} + +#wp-link { + position: relative; + height: 100%; +} + +#wp-link-wrap { + height: 500px; + margin-top: -250px; +} + +#wp-link-wrap .wp-link-text-field { + display: none; +} + +#wp-link-wrap.has-text-field .wp-link-text-field { + display: block; +} + +#link-modal-title { + background: #fcfcfc; + border-bottom: 1px solid #ddd; + height: 36px; + font-size: 18px; + font-weight: 600; + line-height: 2; + margin: 0; + padding: 0 16px 0 36px; +} + +#wp-link-close { + color: #666; + padding: 0; + position: absolute; + top: 0; + left: 0; + width: 36px; + height: 36px; + text-align: center; + background: none; + border: none; + cursor: pointer; +} + +#wp-link-close:before { + font: normal 20px/36px dashicons; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 36px; + height: 36px; + content: "\f158"; +} + +#wp-link-close:hover, +#wp-link-close:focus { + color: #00a0d2; +} + +#wp-link-close:focus { + outline: none; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +#wp-link-wrap #link-selector { + -webkit-overflow-scrolling: touch; + padding: 0 16px; + position: absolute; + top: 37px; + right: 0; + left: 0; + bottom: 44px; +} + +#wp-link ol, +#wp-link ul { + list-style: none; + margin: 0; + padding: 0; +} + +#wp-link input[type="text"] { + box-sizing: border-box; +} + +#wp-link #link-options { + padding: 8px 0 12px; +} + +#wp-link p.howto { + margin: 3px 0; +} + +#wp-link p.howto a { + text-decoration: none; + color: inherit; +} + +#wp-link label input[type="text"] { + margin-top: 5px; + width: 70%; +} + +#wp-link #link-options label span, +#wp-link #search-panel label span.search-label { + display: inline-block; + width: 80px; + text-align: left; + padding-left: 5px; + max-width: 24%; + vertical-align: middle; + word-wrap: break-word; +} + +#wp-link .link-search-field { + width: 250px; + max-width: 70%; +} + +#wp-link .link-search-wrapper { + margin: 5px 0 9px; + display: block; + overflow: hidden; +} + +#wp-link .link-search-wrapper .spinner { + float: none; + margin: -3px 4px 0 0; +} + +#wp-link .link-target { + padding: 3px 0 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#wp-link .link-target label { + max-width: 70%; +} + +#wp-link .query-results { + border: 1px #dfdfdf solid; + margin: 0 0 12px; + background: #fff; + overflow: auto; + position: absolute; + right: 16px; + left: 16px; + bottom: 0; + top: 166px; +} + +.has-text-field #wp-link .query-results { + top: 210px; +} + +#wp-link li { + clear: both; + margin-bottom: 0; + border-bottom: 1px solid #f1f1f1; + color: #32373c; + padding: 4px 10px 4px 6px; + cursor: pointer; + position: relative; +} + +#wp-link .query-notice { + padding: 0; + border-bottom: 1px solid #dfdfdf; + background-color: #f7fcfe; + color: #000; +} + +#wp-link .query-notice .query-notice-default, +#wp-link .query-notice .query-notice-hint { + display: block; + padding: 6px; + border-right: 4px solid #00a0d2; +} + +#wp-link .unselectable.no-matches-found { + padding: 0; + border-bottom: 1px solid #dfdfdf; + background-color: #fef7f1; +} + +#wp-link .no-matches-found .item-title { + display: block; + padding: 6px; + border-right: 4px solid #d54e21; +} + +#wp-link .query-results em { + font-style: normal; +} + +#wp-link li:hover { + background: #eaf2fa; + color: #151515; +} + +#wp-link li.unselectable { + border-bottom: 1px solid #dfdfdf; +} + +#wp-link li.unselectable:hover { + background: #fff; + cursor: auto; + color: #32373c; +} + +#wp-link li.selected { + background: #ddd; + color: #32373c; +} + +#wp-link li.selected .item-title { + font-weight: 600; +} + +#wp-link li:last-child { + border: none; +} + +#wp-link .item-title { + display: inline-block; + width: 80%; + width: calc(100% - 68px); + word-wrap: break-word; +} + +#wp-link .item-info { + text-transform: uppercase; + color: #666; + font-size: 11px; + position: absolute; + left: 5px; + top: 5px; +} + +#wp-link .river-waiting { + display: none; + padding: 10px 0; +} + +#wp-link .submitbox { + padding: 8px 16px; + background: #fcfcfc; + border-top: 1px solid #ddd; + position: absolute; + bottom: 0; + right: 0; + left: 0; +} + +#wp-link-cancel { + line-height: 1.92307692; + float: right; +} + +#wp-link-update { + line-height: 1.76923076; + float: left; +} + +#wp-link-submit { + float: left; +} + +@media screen and (max-width: 782px) { + #wp-link-wrap { + margin-top: -140px; + } + + #wp-link-wrap .query-results { + top: 195px; + } + + #wp-link-wrap.has-text-field .query-results { + top: 235px; + } + + #link-selector { + padding: 0 16px 60px; + } + + #wp-link-wrap #link-selector { + bottom: 52px; + } + + #wp-link-cancel { + line-height: 2.46153846; + } + + #wp-link .link-target { + padding-top: 10px; + } + + #wp-link .submitbox .button { + margin-bottom: 0; + } +} + +@media screen and (max-width: 520px) { + #wp-link-wrap { + width: auto; + margin-right: 0; + right: 10px; + left: 10px; + max-width: 500px; + } +} + +@media screen and (max-height: 520px) { + #wp-link-wrap { + transition: none; + height: auto; + margin-top: 0; + top: 10px; + bottom: 10px; + } + + #link-selector { + overflow: auto; + } + + #search-panel .query-results { + position: static; + } +} + +@media screen and (max-height: 290px) { + #wp-link-wrap { + height: auto; + margin-top: 0; + top: 10px; + bottom: 10px; + } + + #link-selector { + overflow: auto; + height: calc(100% - 92px); + padding-bottom: 2px; + } + + #search-panel .query-results { + position: static; + } +} + +div.wp-link-preview { + float: right; + margin: 5px; + max-width: 694px; + overflow: hidden; + text-overflow: ellipsis; +} + +div.wp-link-preview a { + color: #0073aa; + text-decoration: underline; + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; + cursor: pointer; +} + +div.wp-link-preview a.wplink-url-error { + color: #dc3232; +} + +div.wp-link-input { + float: right; + margin: 2px; + max-width: 694px; +} + +div.wp-link-input input { + width: 300px; + padding: 3px; + box-sizing: border-box; + line-height: 1.28571429; /* 18px */ + /* Override value inherited from default input fields. */ + min-height: 26px; +} + +.mce-toolbar div.wp-link-preview ~ .mce-btn, +.mce-toolbar div.wp-link-input ~ .mce-btn { + margin: 2px 1px; +} + +.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child { + margin-left: 2px; +} + +.ui-autocomplete.wplink-autocomplete { + z-index: 100110; + max-height: 200px; + overflow-y: auto; + padding: 0; + margin: 0; + list-style: none; + position: absolute; + border: 1px solid #5b9dd9; + box-shadow: 0 1px 2px rgba(30, 140, 190, 0.8); + background-color: #fff; +} + +.ui-autocomplete.wplink-autocomplete li { + margin-bottom: 0; + padding: 4px 10px; + clear: both; + white-space: normal; + text-align: right; +} + +.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right { + float: left; +} + +.ui-autocomplete.wplink-autocomplete li.ui-state-focus { + background-color: #ddd; + cursor: pointer; +} + +@media screen and (max-width: 782px) { + div.wp-link-preview, + div.wp-link-input { + max-width: 70%; + max-width: calc(100% - 86px); + } + + div.wp-link-preview { + margin: 8px 5px 8px 0; + } + + div.wp-link-input { + width: 300px; + } + + div.wp-link-input input { + width: 100%; + font-size: 16px; + padding: 5px; + } +} + +/* =Overlay Body +-------------------------------------------------------------- */ + +.mce-fullscreen { + z-index: 100010; +} + +/* =Localization +-------------------------------------------------------------- */ +.rtl .wp-switch-editor, +.rtl .quicktags-toolbar input { + font-family: Tahoma, sans-serif; +} + +/* rtl:ignore */ +.mce-rtl .mce-flow-layout .mce-flow-layout-item > div { + direction: rtl; +} + +/* rtl:ignore */ +.mce-rtl .mce-listbox i.mce-caret { + left: 6px; +} + +html:lang(he-il) .rtl .wp-switch-editor, +html:lang(he-il) .rtl .quicktags-toolbar input { + font-family: Arial, sans-serif; +} + +/* HiDPI */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + .wp-media-buttons .add_media span.wp-media-buttons-icon { + background: none; + } +} diff --git a/wp-includes/css/editor-rtl.min.css b/wp-includes/css/editor-rtl.min.css new file mode 100644 index 0000000..cf51def --- /dev/null +++ b/wp-includes/css/editor-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.mce-tinymce{box-shadow:none}.mce-container,.mce-container *,.mce-widget,.mce-widget *{color:inherit;font-family:inherit}.mce-container .mce-monospace,.mce-widget .mce-monospace{font-family:Consolas,Monaco,monospace;font-size:13px;line-height:150%}#mce-modal-block,#mce-modal-block.mce-fade{opacity:.7;filter:alpha(opacity=70);transition:none;background:#000}.mce-window{border-radius:0;box-shadow:0 3px 6px rgba(0,0,0,.3);-webkit-font-smoothing:subpixel-antialiased;transition:none}.mce-window .mce-container-body.mce-abs-layout{overflow:visible}.mce-window .mce-window-head{background:#fcfcfc;border-bottom:1px solid #ddd;padding:0;min-height:36px}.mce-window .mce-window-head .mce-title{color:#444;font-size:18px;font-weight:600;line-height:36px;margin:0;padding:0 16px 0 36px}.mce-window .mce-window-head .mce-close,.mce-window-head .mce-close .mce-i-remove{color:transparent;top:0;left:0;width:36px;height:36px;padding:0;line-height:36px;text-align:center}.mce-window-head .mce-close .mce-i-remove:before{font:normal 20px/36px dashicons;text-align:center;color:#666;width:36px;height:36px;display:block}.mce-window-head .mce-close:focus .mce-i-remove:before,.mce-window-head .mce-close:hover .mce-i-remove:before{color:#00a0d2}.mce-window-head .mce-close:focus .mce-i-remove,div.mce-tab:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.mce-window .mce-window-head .mce-dragh{width:calc(100% - 36px)}.mce-window .mce-foot{border-top:1px solid #ddd}#wp-link .query-results,.mce-checkbox i.mce-i-checkbox,.mce-textbox{border:1px solid #ddd;border-radius:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);transition:.05s all ease-in-out}#wp-link .query-results:focus,.mce-checkbox:focus i.mce-i-checkbox,.mce-textbox.mce-focus,.mce-textbox:focus{border-color:#5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8)}.mce-window .mce-wp-help{height:360px;width:460px;overflow:auto}.mce-window .mce-wp-help *{box-sizing:border-box}.mce-window .mce-wp-help>.mce-container-body{width:auto!important}.mce-window .wp-editor-help{padding:10px 20px 0 10px}.mce-window .wp-editor-help h2,.mce-window .wp-editor-help p{margin:8px 0;white-space:normal;font-size:14px;font-weight:400}.mce-window .wp-editor-help table{width:100%;margin-bottom:20px}.mce-window .wp-editor-help table.wp-help-single{margin:0 8px 20px}.mce-window .wp-editor-help table.fixed{table-layout:fixed}.mce-window .wp-editor-help table.fixed td:nth-child(odd),.mce-window .wp-editor-help table.fixed th:nth-child(odd){width:12%}.mce-window .wp-editor-help table.fixed td:nth-child(even),.mce-window .wp-editor-help table.fixed th:nth-child(even){width:38%}.mce-window .wp-editor-help table.fixed th:nth-child(odd){padding:5px 0 0}.mce-window .wp-editor-help td,.mce-window .wp-editor-help th{font-size:13px;padding:5px;vertical-align:middle;word-wrap:break-word;white-space:normal}.mce-window .wp-editor-help th{font-weight:600;padding-bottom:0}.mce-window .wp-editor-help kbd{font-family:monospace;padding:2px 7px 3px;font-weight:600;margin:0;background:#eaeaea;background:rgba(0,0,0,.08)}.mce-window .wp-help-th-center td:nth-child(odd),.mce-window .wp-help-th-center th:nth-child(odd){text-align:center}.mce-floatpanel.mce-popover,.mce-menu{border-color:rgba(0,0,0,.15);border-radius:0;box-shadow:0 3px 5px rgba(0,0,0,.2)}.mce-floatpanel.mce-popover.mce-bottom,.mce-menu{margin-top:2px}.mce-floatpanel .mce-arrow{display:none}.mce-menu .mce-container-body{min-width:160px}.mce-menu-item{border:none;margin-bottom:2px;padding:6px 12px 6px 15px}.mce-menu-has-icons i.mce-ico{line-height:20px}div.mce-panel{border:0;background:#fff}.mce-panel.mce-menu{border:1px solid #ddd}div.mce-tab{line-height:13px}div.mce-toolbar-grp{border-bottom:1px solid #ddd;background:#f5f5f5;padding:0;position:relative}div.mce-inline-toolbar-grp{border:1px solid #a0a5aa;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15);box-sizing:border-box;margin-bottom:8px;position:absolute;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;max-width:98%;z-index:100100}div.mce-inline-toolbar-grp>div.mce-stack-layout{padding:1px}div.mce-inline-toolbar-grp.mce-arrow-up{margin-bottom:0;margin-top:8px}div.mce-inline-toolbar-grp:after,div.mce-inline-toolbar-grp:before{position:absolute;right:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}div.mce-inline-toolbar-grp.mce-arrow-up:before{top:-9px;border-bottom-color:#a0a5aa;border-width:0 9px 9px;margin-right:-9px}div.mce-inline-toolbar-grp.mce-arrow-down:before{bottom:-9px;border-top-color:#a0a5aa;border-width:9px 9px 0;margin-right:-9px}div.mce-inline-toolbar-grp.mce-arrow-up:after{top:-8px;border-bottom-color:#f5f5f5;border-width:0 8px 8px;margin-right:-8px}div.mce-inline-toolbar-grp.mce-arrow-down:after{bottom:-8px;border-top-color:#f5f5f5;border-width:8px 8px 0;margin-right:-8px}div.mce-inline-toolbar-grp.mce-arrow-left:after,div.mce-inline-toolbar-grp.mce-arrow-left:before{margin:0}div.mce-inline-toolbar-grp.mce-arrow-left:before{right:20px}div.mce-inline-toolbar-grp.mce-arrow-left:after{right:21px}div.mce-inline-toolbar-grp.mce-arrow-right:after,div.mce-inline-toolbar-grp.mce-arrow-right:before{right:auto;margin:0}div.mce-inline-toolbar-grp.mce-arrow-right:before{left:20px}div.mce-inline-toolbar-grp.mce-arrow-right:after{left:21px}div.mce-inline-toolbar-grp.mce-arrow-full{left:0}div.mce-inline-toolbar-grp.mce-arrow-full>div{width:100%;overflow-x:auto}div.mce-toolbar-grp>div{padding:3px}.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-left:32px}.mce-toolbar .mce-btn-group{margin:0}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}div.mce-statusbar{border-top:1px solid #e5e5e5}div.mce-path{padding:2px 10px;margin:0}.mce-path,.mce-path .mce-divider,.mce-path-item{font-size:12px}.mce-toolbar .mce-btn,.qt-dfw{border-color:transparent;background:0 0;box-shadow:none;text-shadow:none;cursor:pointer}.mce-btn .mce-txt{direction:inherit;text-align:inherit}.mce-toolbar .mce-btn-group .mce-btn,.qt-dfw{border:1px solid transparent;margin:2px;border-radius:2px}.mce-toolbar .mce-btn-group .mce-btn:focus,.mce-toolbar .mce-btn-group .mce-btn:hover,.qt-dfw:focus,.qt-dfw:hover{background:#fafafa;border-color:#555d66;color:#23282d;box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);outline:0}.mce-toolbar .mce-btn-group .mce-btn.mce-active,.mce-toolbar .mce-btn-group .mce-btn:active,.qt-dfw.active{background:#ebebeb;border-color:#555d66;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.3)}.mce-btn.mce-active,.mce-btn.mce-active button,.mce-btn.mce-active i,.mce-btn.mce-active:hover button,.mce-btn.mce-active:hover i{color:inherit}.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover{border-color:#23282d}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover{color:#a0a5aa;background:0 0;border-color:#ddd;text-shadow:0 1px 0 #fff;box-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus{border-color:#555d66}.mce-toolbar .mce-btn-group .mce-first,.mce-toolbar .mce-btn-group .mce-last{border-color:transparent}.mce-toolbar .mce-btn button,.qt-dfw{padding:2px 3px;line-height:normal}.mce-toolbar .mce-listbox button{font-size:13px;line-height:1.53846153;padding-right:6px;padding-left:20px}.mce-toolbar .mce-btn i{text-shadow:none}.mce-toolbar .mce-btn-group>div{white-space:normal}.mce-toolbar .mce-colorbutton .mce-open{border-left:0}.mce-toolbar .mce-colorbutton .mce-preview{margin:0;padding:0;top:auto;bottom:2px;right:3px;height:3px;width:20px;background:#555d66}.mce-toolbar .mce-btn-group .mce-btn.mce-primary{min-width:0;background:#0085ba;border-color:#0073aa #006799 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:2px 3px 1px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico{color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus{box-shadow:0 0 1px 1px #33b3db}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active{background:#0073aa;border-color:#006799;box-shadow:inset 0 2px 0 #006799}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox{border-radius:0;direction:rtl;background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 1px -1px rgba(0,0,0,.2)}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover{border-color:#b4b9be}.mce-panel .mce-btn i.mce-caret{border-top:6px solid #555d66;margin-right:2px;margin-left:2px}.mce-listbox i.mce-caret{left:4px}.mce-panel .mce-btn:focus i.mce-caret,.mce-panel .mce-btn:hover i.mce-caret{border-top-color:#23282d}.mce-panel .mce-active i.mce-caret{border-top:0;border-bottom:6px solid #23282d;margin-top:7px}.mce-listbox.mce-active i.mce-caret{margin-top:-3px}.mce-toolbar .mce-splitbtn:hover .mce-open{border-left-color:transparent}.mce-toolbar .mce-splitbtn .mce-open.mce-active{background:0 0;outline:0}.mce-menu .mce-menu-item.mce-active.mce-menu-item-normal,.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview,.mce-menu .mce-menu-item.mce-selected,.mce-menu .mce-menu-item:focus,.mce-menu .mce-menu-item:hover{background:#0073aa;color:#fff}.mce-menu .mce-menu-item.mce-selected .mce-caret,.mce-menu .mce-menu-item:focus .mce-caret,.mce-menu .mce-menu-item:hover .mce-caret{border-right-color:#fff}.rtl .mce-menu .mce-menu-item.mce-selected .mce-caret,.rtl .mce-menu .mce-menu-item:focus .mce-caret,.rtl .mce-menu .mce-menu-item:hover .mce-caret{border-left-color:inherit;border-right-color:#fff}.mce-menu .mce-menu-item.mce-active .mce-menu-shortcut,.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico,.mce-menu .mce-menu-item.mce-disabled:hover .mce-text,.mce-menu .mce-menu-item.mce-selected .mce-ico,.mce-menu .mce-menu-item.mce-selected .mce-text,.mce-menu .mce-menu-item:focus .mce-ico,.mce-menu .mce-menu-item:focus .mce-menu-shortcut,.mce-menu .mce-menu-item:focus .mce-text,.mce-menu .mce-menu-item:hover .mce-ico,.mce-menu .mce-menu-item:hover .mce-menu-shortcut,.mce-menu .mce-menu-item:hover .mce-text{color:inherit}.mce-menu .mce-menu-item.mce-disabled{cursor:default}.mce-menu .mce-menu-item.mce-disabled:hover{background:#ccc}div.mce-menubar{border-color:#e5e5e5;background:#fff;border-width:0 0 1px}.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus,.mce-menubar .mce-menubtn:hover{border-color:transparent;background:0 0}.mce-menubar .mce-menubtn:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.mce-menu-item-sep:hover,div.mce-menu .mce-menu-item-sep{border-bottom:1px solid #ddd;height:0;margin:5px 0}.mce-menubtn span{margin-left:0;padding-right:3px}.mce-menu-has-icons i.mce-ico:before{margin-right:-2px}.mce-menu.mce-menu-align .mce-menu-item-normal{position:relative}.mce-menu.mce-menu-align .mce-menu-shortcut{bottom:.6em;font-size:.9em}.mce-primary button,.mce-primary button i{text-align:center;color:#fff;text-shadow:none;padding:0;line-height:1.85714285}.mce-window .mce-btn{color:#555;background:#f7f7f7;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0;cursor:pointer;border:1px solid #ccc;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-shadow:0 1px 0 #ccc}.mce-window .mce-btn::-moz-focus-inner{border-width:0;border-style:none;padding:0}.mce-window .mce-btn:focus,.mce-window .mce-btn:hover{background:#fafafa;border-color:#999;color:#23282d}.mce-window .mce-btn:focus{border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}.mce-window .mce-btn:active{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);transform:translateY(1px)}.mce-window .mce-btn.mce-disabled{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}.mce-window .mce-btn.mce-primary{background:#0085ba;border-color:#0073aa #006799 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799,-1px 0 1px #006799,0 1px 1px #006799,1px 0 1px #006799}.mce-window .mce-btn.mce-primary:focus,.mce-window .mce-btn.mce-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.mce-window .mce-btn.mce-primary:focus{box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db}.mce-window .mce-btn.mce-primary:active{background:#0073aa;border-color:#006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.mce-window .mce-btn.mce-primary.mce-disabled{color:#66c6e4!important;background:#008ec2!important;border-color:#007cb2!important;box-shadow:none!important;text-shadow:0 -1px 0 rgba(0,0,0,.1)!important;cursor:default}.mce-menubtn.mce-fixed-width span{overflow-x:hidden;text-overflow:ellipsis;width:82px}.mce-charmap{margin:3px}.mce-charmap td{padding:0;border-color:#ddd;cursor:pointer}.mce-charmap td:hover{background:#f3f3f3}.mce-charmap td div{width:18px;height:22px;line-height:1.57142857}.mce-tooltip{margin-top:2px}.mce-tooltip-inner{border-radius:3px;box-shadow:0 3px 5px rgba(0,0,0,.2);color:#fff;font-size:12px}.mce-ico{font-family:tinymce,Arial}.mce-btn-small .mce-ico{font-family:tinymce-small,Arial}.mce-toolbar .mce-ico{color:#555d66;line-height:1;width:20px;height:20px;text-align:center;text-shadow:none;margin:0;padding:0}.qt-dfw{color:#555d66;line-height:1;width:28px;height:26px;text-align:center;text-shadow:none}.mce-toolbar .mce-btn .mce-open{line-height:20px}.mce-toolbar .mce-btn.mce-active .mce-open,.mce-toolbar .mce-btn:focus .mce-open,.mce-toolbar .mce-btn:hover .mce-open{border-right-color:#23282d}div.mce-notification{right:10%!important;left:10%}.mce-notification button.mce-close{left:6px;top:3px;font-weight:400;color:#555d66}.mce-notification button.mce-close:focus,.mce-notification button.mce-close:hover{color:#000}i.mce-i-aligncenter,i.mce-i-alignjustify,i.mce-i-alignleft,i.mce-i-alignright,i.mce-i-backcolor,i.mce-i-blockquote,i.mce-i-bold,i.mce-i-bullist,i.mce-i-charmap,i.mce-i-dashicon,i.mce-i-dfw,i.mce-i-forecolor,i.mce-i-fullscreen,i.mce-i-help,i.mce-i-hr,i.mce-i-indent,i.mce-i-italic,i.mce-i-link,i.mce-i-ltr,i.mce-i-numlist,i.mce-i-outdent,i.mce-i-pastetext,i.mce-i-pasteword,i.mce-i-redo,i.mce-i-remove,i.mce-i-removeformat,i.mce-i-spellchecker,i.mce-i-strikethrough,i.mce-i-underline,i.mce-i-undo,i.mce-i-unlink,i.mce-i-wp-media-library,i.mce-i-wp_adv,i.mce-i-wp_code,i.mce-i-wp_fullscreen,i.mce-i-wp_help,i.mce-i-wp_more,i.mce-i-wp_page{font:normal 20px/1 dashicons;padding:0;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin-right:-2px;padding-left:2px}.qt-dfw{font:normal 20px/1 dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}i.mce-i-bold:before{content:"\f200"}i.mce-i-italic:before{content:"\f201"}i.mce-i-bullist:before{content:"\f203"}i.mce-i-numlist:before{content:"\f204"}i.mce-i-blockquote:before{content:"\f205"}i.mce-i-alignleft:before{content:"\f206"}i.mce-i-aligncenter:before{content:"\f207"}i.mce-i-alignright:before{content:"\f208"}i.mce-i-link:before{content:"\f103"}i.mce-i-unlink:before{content:"\f225"}i.mce-i-wp_more:before{content:"\f209"}i.mce-i-strikethrough:before{content:"\f224"}i.mce-i-spellchecker:before{content:"\f210"}.qt-dfw:before,i.mce-i-dfw:before,i.mce-i-fullscreen:before,i.mce-i-wp_fullscreen:before{content:"\f211"}i.mce-i-wp_adv:before{content:"\f212"}i.mce-i-underline:before{content:"\f213"}i.mce-i-alignjustify:before{content:"\f214"}i.mce-i-backcolor:before,i.mce-i-forecolor:before{content:"\f215"}i.mce-i-pastetext:before{content:"\f217"}i.mce-i-removeformat:before{content:"\f218"}i.mce-i-charmap:before{content:"\f220"}i.mce-i-outdent:before{content:"\f221"}i.mce-i-indent:before{content:"\f222"}i.mce-i-undo:before{content:"\f171"}i.mce-i-redo:before{content:"\f172"}i.mce-i-help:before,i.mce-i-wp_help:before{content:"\f223"}i.mce-i-wp-media-library:before{content:"\f104"}i.mce-i-ltr:before{content:"\f320"}i.mce-i-wp_page:before{content:"\f105"}i.mce-i-hr:before{content:"\f460"}i.mce-i-remove:before{content:"\f158"}i.mce-i-wp_code:before{content:"\f475"}.rtl i.mce-i-outdent:before{content:"\f222"}.rtl i.mce-i-indent:before{content:"\f221"}.wp-editor-wrap{position:relative}.wp-editor-tools{position:relative;z-index:1}.wp-editor-tools:after{clear:both;content:"";display:table}.wp-editor-container{clear:both;border:1px solid #e5e5e5}.wp-editor-area{font-family:Consolas,Monaco,monospace;font-size:13px;padding:10px;margin:1px 0 0;line-height:150%;border:0;outline:0;display:block;resize:vertical;box-sizing:border-box}.rtl .wp-editor-area{font-family:Tahoma,Monaco,monospace}.locale-he-il .wp-editor-area{font-family:Arial,Monaco,monospace}.wp-editor-container textarea.wp-editor-area{width:100%;margin:0;box-shadow:none}.wp-editor-tabs{float:left}.wp-switch-editor{float:right;box-sizing:content-box;position:relative;top:1px;background:#ebebeb;color:#666;cursor:pointer;font-size:13px;line-height:1.46153846;height:20px;margin:5px 5px 0 0;padding:3px 8px 4px;border:1px solid #e5e5e5}.wp-switch-editor:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:0;color:#23282d}.html-active .switch-html:focus,.tmce-active .switch-tmce:focus,.wp-switch-editor:active{box-shadow:none}.wp-switch-editor:active{background-color:#f5f5f5;box-shadow:none}.js .tmce-active .wp-editor-area{color:#fff}.tmce-active .quicktags-toolbar{display:none}.html-active .switch-html,.tmce-active .switch-tmce{background:#f5f5f5;color:#555;border-bottom-color:#f5f5f5}.wp-media-buttons{float:right}.wp-media-buttons .button{margin-left:5px;margin-bottom:4px;padding-right:7px;padding-left:7px}.wp-media-buttons .button:active{position:relative;top:1px;margin-top:-1px;margin-bottom:1px}.wp-media-buttons .insert-media{padding-right:5px}.wp-media-buttons a{text-decoration:none;color:#444;font-size:12px}.wp-media-buttons img{padding:0 4px;vertical-align:middle}.wp-media-buttons span.wp-media-buttons-icon{display:inline-block;width:20px;height:20px;line-height:1;vertical-align:middle;margin:0 2px}.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font:normal 18px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{content:"\f104"}.mce-content-body dl.wp-caption{max-width:100%}.quicktags-toolbar{padding:3px;position:relative;border-bottom:1px solid #ddd;background:#f5f5f5;min-height:30px}.has-dfw .quicktags-toolbar{padding-left:35px}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:2px}.quicktags-toolbar input[value=link]{text-decoration:underline}.quicktags-toolbar input[value=del]{text-decoration:line-through}.quicktags-toolbar input[value="i"]{font-style:italic}.quicktags-toolbar input[value="b"]{font-weight:600}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,.qt-dfw{position:absolute;top:0;left:0}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:7px 0 0 7px}.qt-dfw{margin:5px 0 0 5px}.qt-fullscreen{position:static;margin:2px}@media screen and (max-width:782px){.mce-toolbar .mce-btn button,.qt-dfw{padding:6px 7px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:6px 7px 5px}.mce-toolbar .mce-btn-group .mce-btn{margin:1px}.qt-dfw{width:36px;height:34px}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:4px 0 0 4px}.mce-toolbar .mce-colorbutton .mce-preview{right:8px;bottom:6px}.mce-window .mce-btn{padding:2px 0}.has-dfw .quicktags-toolbar,.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-left:40px}}@media screen and (min-width:782px){.wp-core-ui .quicktags-toolbar input.button.button-small{font-size:12px;min-height:26px;line-height:2}}#wp_editbtns,#wp_gallerybtns{padding:2px;position:absolute;display:none;z-index:100020}#wp_delgallery,#wp_delimgbtn,#wp_editgallery,#wp_editimgbtn{border-color:#999;background-color:#eee;margin:2px;padding:2px;border-width:1px;border-style:solid;border-radius:3px}#wp_delgallery:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_editimgbtn:hover{border-color:#555;background-color:#ccc}#wp-link-wrap{display:none;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:500px;overflow:hidden;margin-right:-250px;margin-top:-125px;position:fixed;top:50%;right:50%;z-index:100105;transition:height .2s,margin-top .2s}#wp-link-backdrop{display:none;position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100100}#wp-link{position:relative;height:100%}#wp-link-wrap{height:500px;margin-top:-250px}#wp-link-wrap .wp-link-text-field{display:none}#wp-link-wrap.has-text-field .wp-link-text-field{display:block}#link-modal-title{background:#fcfcfc;border-bottom:1px solid #ddd;height:36px;font-size:18px;font-weight:600;line-height:2;margin:0;padding:0 16px 0 36px}#wp-link-close{color:#666;padding:0;position:absolute;top:0;left:0;width:36px;height:36px;text-align:center;background:0 0;border:none;cursor:pointer}#wp-link-close:before{font:normal 20px/36px dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:36px;height:36px;content:"\f158"}#wp-link-close:focus,#wp-link-close:hover{color:#00a0d2}#wp-link-close:focus{outline:0;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:2px solid transparent;outline-offset:-2px}#wp-link-wrap #link-selector{-webkit-overflow-scrolling:touch;padding:0 16px;position:absolute;top:37px;right:0;left:0;bottom:44px}#wp-link ol,#wp-link ul{list-style:none;margin:0;padding:0}#wp-link input[type=text]{box-sizing:border-box}#wp-link #link-options{padding:8px 0 12px}#wp-link p.howto{margin:3px 0}#wp-link p.howto a{text-decoration:none;color:inherit}#wp-link label input[type=text]{margin-top:5px;width:70%}#wp-link #link-options label span,#wp-link #search-panel label span.search-label{display:inline-block;width:80px;text-align:left;padding-left:5px;max-width:24%;vertical-align:middle;word-wrap:break-word}#wp-link .link-search-field{width:250px;max-width:70%}#wp-link .link-search-wrapper{margin:5px 0 9px;display:block;overflow:hidden}#wp-link .link-search-wrapper .spinner{float:none;margin:-3px 4px 0 0}#wp-link .link-target{padding:3px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#wp-link .link-target label{max-width:70%}#wp-link .query-results{border:1px #dfdfdf solid;margin:0 0 12px;background:#fff;overflow:auto;position:absolute;right:16px;left:16px;bottom:0;top:166px}.has-text-field #wp-link .query-results{top:210px}#wp-link li{clear:both;margin-bottom:0;border-bottom:1px solid #f1f1f1;color:#32373c;padding:4px 10px 4px 6px;cursor:pointer;position:relative}#wp-link .query-notice{padding:0;border-bottom:1px solid #dfdfdf;background-color:#f7fcfe;color:#000}#wp-link .query-notice .query-notice-default,#wp-link .query-notice .query-notice-hint{display:block;padding:6px;border-right:4px solid #00a0d2}#wp-link .unselectable.no-matches-found{padding:0;border-bottom:1px solid #dfdfdf;background-color:#fef7f1}#wp-link .no-matches-found .item-title{display:block;padding:6px;border-right:4px solid #d54e21}#wp-link .query-results em{font-style:normal}#wp-link li:hover{background:#eaf2fa;color:#151515}#wp-link li.unselectable{border-bottom:1px solid #dfdfdf}#wp-link li.unselectable:hover{background:#fff;cursor:auto;color:#32373c}#wp-link li.selected{background:#ddd;color:#32373c}#wp-link li.selected .item-title{font-weight:600}#wp-link li:last-child{border:none}#wp-link .item-title{display:inline-block;width:80%;width:calc(100% - 68px);word-wrap:break-word}#wp-link .item-info{text-transform:uppercase;color:#666;font-size:11px;position:absolute;left:5px;top:5px}#wp-link .river-waiting{display:none;padding:10px 0}#wp-link .submitbox{padding:8px 16px;background:#fcfcfc;border-top:1px solid #ddd;position:absolute;bottom:0;right:0;left:0}#wp-link-cancel{line-height:1.92307692;float:right}#wp-link-update{line-height:1.76923076;float:left}#wp-link-submit{float:left}@media screen and (max-width:782px){#wp-link-wrap{margin-top:-140px}#wp-link-wrap .query-results{top:195px}#wp-link-wrap.has-text-field .query-results{top:235px}#link-selector{padding:0 16px 60px}#wp-link-wrap #link-selector{bottom:52px}#wp-link-cancel{line-height:2.46153846}#wp-link .link-target{padding-top:10px}#wp-link .submitbox .button{margin-bottom:0}}@media screen and (max-width:520px){#wp-link-wrap{width:auto;margin-right:0;right:10px;left:10px;max-width:500px}}@media screen and (max-height:520px){#wp-link-wrap{transition:none;height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto}#search-panel .query-results{position:static}}@media screen and (max-height:290px){#wp-link-wrap{height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto;height:calc(100% - 92px);padding-bottom:2px}#search-panel .query-results{position:static}}div.wp-link-preview{float:right;margin:5px;max-width:694px;overflow:hidden;text-overflow:ellipsis}div.wp-link-preview a{color:#0073aa;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out;cursor:pointer}div.wp-link-preview a.wplink-url-error{color:#dc3232}div.wp-link-input{float:right;margin:2px;max-width:694px}div.wp-link-input input{width:300px;padding:3px;box-sizing:border-box;line-height:1.28571429;min-height:26px}.mce-toolbar div.wp-link-input~.mce-btn,.mce-toolbar div.wp-link-preview~.mce-btn{margin:2px 1px}.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child{margin-left:2px}.ui-autocomplete.wplink-autocomplete{z-index:100110;max-height:200px;overflow-y:auto;padding:0;margin:0;list-style:none;position:absolute;border:1px solid #5b9dd9;box-shadow:0 1px 2px rgba(30,140,190,.8);background-color:#fff}.ui-autocomplete.wplink-autocomplete li{margin-bottom:0;padding:4px 10px;clear:both;white-space:normal;text-align:right}.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right{float:left}.ui-autocomplete.wplink-autocomplete li.ui-state-focus{background-color:#ddd;cursor:pointer}@media screen and (max-width:782px){div.wp-link-input,div.wp-link-preview{max-width:70%;max-width:calc(100% - 86px)}div.wp-link-preview{margin:8px 5px 8px 0}div.wp-link-input{width:300px}div.wp-link-input input{width:100%;font-size:16px;padding:5px}}.mce-fullscreen{z-index:100010}.rtl .quicktags-toolbar input,.rtl .wp-switch-editor{font-family:Tahoma,sans-serif}.mce-rtl .mce-flow-layout .mce-flow-layout-item>div{direction:rtl}.mce-rtl .mce-listbox i.mce-caret{left:6px}html:lang(he-il) .rtl .quicktags-toolbar input,html:lang(he-il) .rtl .wp-switch-editor{font-family:Arial,sans-serif}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}} \ No newline at end of file diff --git a/wp-includes/css/editor.css b/wp-includes/css/editor.css new file mode 100644 index 0000000..fe3bd10 --- /dev/null +++ b/wp-includes/css/editor.css @@ -0,0 +1,1882 @@ +/*------------------------------------------------------------------------------ + TinyMCE and Quicklinks toolbars +------------------------------------------------------------------------------*/ + +/* TinyMCE widgets/containers */ + +.mce-tinymce { + box-shadow: none; +} + +.mce-container, +.mce-container *, +.mce-widget, +.mce-widget * { + color: inherit; + font-family: inherit; +} + +.mce-container .mce-monospace, +.mce-widget .mce-monospace { + font-family: Consolas, Monaco, monospace; + font-size: 13px; + line-height: 150%; +} + +/* TinyMCE windows */ +#mce-modal-block, +#mce-modal-block.mce-fade { + opacity: 0.7; + filter: alpha(opacity=70); + transition: none; + background: #000; +} + +.mce-window { + border-radius: 0; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + -webkit-font-smoothing: subpixel-antialiased; + transition: none; +} + +.mce-window .mce-container-body.mce-abs-layout { + overflow: visible; +} + +.mce-window .mce-window-head { + background: #fcfcfc; + border-bottom: 1px solid #ddd; + padding: 0; + min-height: 36px; +} + +.mce-window .mce-window-head .mce-title { + color: #444; + font-size: 18px; + font-weight: 600; + line-height: 36px; + margin: 0; + padding: 0 36px 0 16px; +} + +.mce-window .mce-window-head .mce-close, +.mce-window-head .mce-close .mce-i-remove { + color: transparent; + top: 0; + right: 0; + width: 36px; + height: 36px; + padding: 0; + line-height: 36px; + text-align: center; +} + +.mce-window-head .mce-close .mce-i-remove:before { + font: normal 20px/36px dashicons; + text-align: center; + color: #666; + width: 36px; + height: 36px; + display: block; +} + +.mce-window-head .mce-close:hover .mce-i-remove:before, +.mce-window-head .mce-close:focus .mce-i-remove:before { + color: #00a0d2; +} + +.mce-window-head .mce-close:focus .mce-i-remove, +div.mce-tab:focus { + box-shadow: 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.mce-window .mce-window-head .mce-dragh { + width: calc( 100% - 36px ); +} + +.mce-window .mce-foot { + border-top: 1px solid #ddd; +} + +.mce-textbox, +.mce-checkbox i.mce-i-checkbox, +#wp-link .query-results { + border: 1px solid #ddd; + border-radius: 0; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07); + transition: .05s all ease-in-out; +} + +.mce-textbox:focus, +.mce-textbox.mce-focus, +.mce-checkbox:focus i.mce-i-checkbox, +#wp-link .query-results:focus { + border-color: #5b9dd9; + box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); +} + +.mce-window .mce-wp-help { + height: 360px; + width: 460px; + overflow: auto; +} + +.mce-window .mce-wp-help * { + box-sizing: border-box; +} + +.mce-window .mce-wp-help > .mce-container-body { + width: auto !important; +} + +.mce-window .wp-editor-help { + padding: 10px 10px 0 20px; +} + +.mce-window .wp-editor-help h2, +.mce-window .wp-editor-help p { + margin: 8px 0; + white-space: normal; + font-size: 14px; + font-weight: 400; +} + +.mce-window .wp-editor-help table { + width: 100%; + margin-bottom: 20px; +} + +.mce-window .wp-editor-help table.wp-help-single { + margin: 0 8px 20px; +} + +.mce-window .wp-editor-help table.fixed { + table-layout: fixed; +} + +.mce-window .wp-editor-help table.fixed th:nth-child(odd), +.mce-window .wp-editor-help table.fixed td:nth-child(odd) { + width: 12%; +} + +.mce-window .wp-editor-help table.fixed th:nth-child(even), +.mce-window .wp-editor-help table.fixed td:nth-child(even) { + width: 38%; +} + +.mce-window .wp-editor-help table.fixed th:nth-child(odd) { + padding: 5px 0 0; +} + +.mce-window .wp-editor-help td, +.mce-window .wp-editor-help th { + font-size: 13px; + padding: 5px; + vertical-align: middle; + word-wrap: break-word; + white-space: normal; +} + +.mce-window .wp-editor-help th { + font-weight: 600; + padding-bottom: 0; +} + +.mce-window .wp-editor-help kbd { + font-family: monospace; + padding: 2px 7px 3px; + font-weight: 600; + margin: 0; + background: #eaeaea; + background: rgba(0, 0, 0, 0.08); +} + +.mce-window .wp-help-th-center td:nth-child(odd), +.mce-window .wp-help-th-center th:nth-child(odd) { + text-align: center; +} + +/* TinyMCE menus */ +.mce-menu, +.mce-floatpanel.mce-popover { + border-color: rgba(0, 0, 0, 0.15); + border-radius: 0; + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); +} + +.mce-menu, +.mce-floatpanel.mce-popover.mce-bottom { + margin-top: 2px; +} + +.mce-floatpanel .mce-arrow { + display: none; +} + +.mce-menu .mce-container-body { + min-width: 160px; +} + +.mce-menu-item { + border: none; + margin-bottom: 2px; + padding: 6px 15px 6px 12px; +} + +.mce-menu-has-icons i.mce-ico { + line-height: 20px; +} + +/* TinyMCE panel */ +div.mce-panel { + border: 0; + background: #fff; +} + +.mce-panel.mce-menu { + border: 1px solid #ddd; +} + +div.mce-tab { + line-height: 13px; +} + +/* TinyMCE toolbars */ +div.mce-toolbar-grp { + border-bottom: 1px solid #ddd; + background: #f5f5f5; + padding: 0; + position: relative; +} + +div.mce-inline-toolbar-grp { + border: 1px solid #a0a5aa; + border-radius: 2px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + box-sizing: border-box; + margin-bottom: 8px; + position: absolute; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + max-width: 98%; + z-index: 100100; /* Same as the other TinyMCE "panels" */ +} + +div.mce-inline-toolbar-grp > div.mce-stack-layout { + padding: 1px; +} + +div.mce-inline-toolbar-grp.mce-arrow-up { + margin-bottom: 0; + margin-top: 8px; +} + +div.mce-inline-toolbar-grp:before, +div.mce-inline-toolbar-grp:after { + position: absolute; + left: 50%; + display: block; + width: 0; + height: 0; + border-style: solid; + border-color: transparent; + content: ""; +} + +div.mce-inline-toolbar-grp.mce-arrow-up:before { + top: -9px; + border-bottom-color: #a0a5aa; + border-width: 0 9px 9px; + margin-left: -9px; +} + +div.mce-inline-toolbar-grp.mce-arrow-down:before { + bottom: -9px; + border-top-color: #a0a5aa; + border-width: 9px 9px 0; + margin-left: -9px; +} + +div.mce-inline-toolbar-grp.mce-arrow-up:after { + top: -8px; + border-bottom-color: #f5f5f5; + border-width: 0 8px 8px; + margin-left: -8px; +} + +div.mce-inline-toolbar-grp.mce-arrow-down:after { + bottom: -8px; + border-top-color: #f5f5f5; + border-width: 8px 8px 0; + margin-left: -8px; +} + +div.mce-inline-toolbar-grp.mce-arrow-left:before, +div.mce-inline-toolbar-grp.mce-arrow-left:after { + margin: 0; +} + +div.mce-inline-toolbar-grp.mce-arrow-left:before { + left: 20px; +} +div.mce-inline-toolbar-grp.mce-arrow-left:after { + left: 21px; +} + +div.mce-inline-toolbar-grp.mce-arrow-right:before, +div.mce-inline-toolbar-grp.mce-arrow-right:after { + left: auto; + margin: 0; +} + +div.mce-inline-toolbar-grp.mce-arrow-right:before { + right: 20px; +} + +div.mce-inline-toolbar-grp.mce-arrow-right:after { + right: 21px; +} + +div.mce-inline-toolbar-grp.mce-arrow-full { + right: 0; +} + +div.mce-inline-toolbar-grp.mce-arrow-full > div { + width: 100%; + overflow-x: auto; +} + +div.mce-toolbar-grp > div { + padding: 3px; +} + +.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first { + padding-right: 32px; +} + +.mce-toolbar .mce-btn-group { + margin: 0; +} + +/* Classic block hide/show toolbars */ +.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) { + display: none; +} + +.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar { + display: block; +} + +div.mce-statusbar { + border-top: 1px solid #e5e5e5; +} + +div.mce-path { + padding: 2px 10px; + margin: 0; +} + +.mce-path, +.mce-path-item, +.mce-path .mce-divider { + font-size: 12px; +} + +.mce-toolbar .mce-btn, +.qt-dfw { + border-color: transparent; + background: transparent; + box-shadow: none; + text-shadow: none; + cursor: pointer; +} + +.mce-btn .mce-txt { + direction: inherit; + text-align: inherit; +} + +.mce-toolbar .mce-btn-group .mce-btn, +.qt-dfw { + border: 1px solid transparent; + margin: 2px; + border-radius: 2px; +} + +.mce-toolbar .mce-btn-group .mce-btn:hover, +.mce-toolbar .mce-btn-group .mce-btn:focus, +.qt-dfw:hover, +.qt-dfw:focus { + background: #fafafa; + border-color: #555d66; + color: #23282d; + box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba(0, 0, 0, 0.08); + outline: none; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-active, +.mce-toolbar .mce-btn-group .mce-btn:active, +.qt-dfw.active { + background: #ebebeb; + border-color: #555d66; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.3); +} + +.mce-btn.mce-active, +.mce-btn.mce-active button, +.mce-btn.mce-active:hover button, +.mce-btn.mce-active i, +.mce-btn.mce-active:hover i { + color: inherit; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover, +.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus { + border-color: #23282d; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover, +.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus { + color: #a0a5aa; + background: none; + border-color: #ddd; + text-shadow: 0 1px 0 #fff; + box-shadow: none; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus { + border-color: #555d66; +} + +.mce-toolbar .mce-btn-group .mce-first, +.mce-toolbar .mce-btn-group .mce-last { + border-color: transparent; +} + +.mce-toolbar .mce-btn button, +.qt-dfw { + padding: 2px 3px; + line-height: normal; +} + +.mce-toolbar .mce-listbox button { + font-size: 13px; + line-height: 1.53846153; + padding-left: 6px; + padding-right: 20px; +} + +.mce-toolbar .mce-btn i { + text-shadow: none; +} + +.mce-toolbar .mce-btn-group > div { + white-space: normal; +} + +.mce-toolbar .mce-colorbutton .mce-open { + border-right: 0; +} + +.mce-toolbar .mce-colorbutton .mce-preview { + margin: 0; + padding: 0; + top: auto; + bottom: 2px; + left: 3px; + height: 3px; + width: 20px; + background: #555d66; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary { + min-width: 0; + background: #0085ba; + border-color: #0073aa #006799 #006799; + box-shadow: 0 1px 0 #006799; + color: #fff; + text-decoration: none; + text-shadow: none; +} + +/* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */ +.mce-toolbar .mce-btn-group .mce-btn.mce-primary button { + padding: 2px 3px 1px; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico { + color: #fff; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover, +.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus { + background: #008ec2; + border-color: #006799; + color: #fff; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus { + box-shadow: 0 0 1px 1px #33b3db; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active { + background: #0073aa; + border-color: #006799; + box-shadow: inset 0 2px 0 #006799; +} + +/* mce listbox */ +.mce-toolbar .mce-btn-group .mce-btn.mce-listbox { + border-radius: 0; + direction: ltr; + background: #fff; + border: 1px solid #ddd; + box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, 0.2); +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover, +.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus { + border-color: #b4b9be; +} + +.mce-panel .mce-btn i.mce-caret { + border-top: 6px solid #555d66; + margin-left: 2px; + margin-right: 2px; +} + +.mce-listbox i.mce-caret { + right: 4px; +} + +.mce-panel .mce-btn:hover i.mce-caret, +.mce-panel .mce-btn:focus i.mce-caret { + border-top-color: #23282d; +} + +.mce-panel .mce-active i.mce-caret { + border-top: 0; + border-bottom: 6px solid #23282d; + margin-top: 7px; +} + +.mce-listbox.mce-active i.mce-caret { + margin-top: -3px; +} + +.mce-toolbar .mce-splitbtn:hover .mce-open { + border-right-color: transparent; +} + +.mce-toolbar .mce-splitbtn .mce-open.mce-active { + background: transparent; + outline: none; +} + +.mce-menu .mce-menu-item:hover, +.mce-menu .mce-menu-item.mce-selected, +.mce-menu .mce-menu-item:focus, +.mce-menu .mce-menu-item.mce-active.mce-menu-item-normal, +.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview { + background: #0073aa; /* See color scheme. */ + color: #fff; +} + +.mce-menu .mce-menu-item:hover .mce-caret, +.mce-menu .mce-menu-item:focus .mce-caret, +.mce-menu .mce-menu-item.mce-selected .mce-caret { + border-left-color: #fff; +} + +/* rtl:ignore */ +.rtl .mce-menu .mce-menu-item:hover .mce-caret, +.rtl .mce-menu .mce-menu-item:focus .mce-caret, +.rtl .mce-menu .mce-menu-item.mce-selected .mce-caret { + border-left-color: inherit; + border-right-color: #fff; +} + +.mce-menu .mce-menu-item:hover .mce-text, +.mce-menu .mce-menu-item:focus .mce-text, +.mce-menu .mce-menu-item:hover .mce-ico, +.mce-menu .mce-menu-item:focus .mce-ico, +.mce-menu .mce-menu-item.mce-selected .mce-text, +.mce-menu .mce-menu-item.mce-selected .mce-ico, +.mce-menu .mce-menu-item:hover .mce-menu-shortcut, +.mce-menu .mce-menu-item:focus .mce-menu-shortcut, +.mce-menu .mce-menu-item.mce-active .mce-menu-shortcut, +.mce-menu .mce-menu-item.mce-disabled:hover .mce-text, +.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico { + color: inherit; +} + +.mce-menu .mce-menu-item.mce-disabled { + cursor: default; +} + +.mce-menu .mce-menu-item.mce-disabled:hover { + background: #ccc; +} + +/* Menubar */ +div.mce-menubar { + border-color: #e5e5e5; + background: #fff; + border-width: 0px 0px 1px; +} + +.mce-menubar .mce-menubtn:hover, +.mce-menubar .mce-menubtn.mce-active, +.mce-menubar .mce-menubtn:focus { + border-color: transparent; + background: transparent; +} + +.mce-menubar .mce-menubtn:focus { + color: #124964; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +div.mce-menu .mce-menu-item-sep, +.mce-menu-item-sep:hover { + border-bottom: 1px solid #ddd; + height: 0px; + margin: 5px 0; +} + +.mce-menubtn span { + margin-right: 0; + padding-left: 3px; +} + +.mce-menu-has-icons i.mce-ico:before { + margin-left: -2px; +} + +/* Keyboard shortcuts position */ +.mce-menu.mce-menu-align .mce-menu-item-normal { + position: relative; +} + +.mce-menu.mce-menu-align .mce-menu-shortcut { + bottom: 0.6em; + font-size: 0.9em; +} + +/* Buttons in modals */ +.mce-primary button, +.mce-primary button i { + text-align: center; + color: #fff; + text-shadow: none; + padding: 0; + line-height: 1.85714285; +} + +.mce-window .mce-btn { + color: #555; + background: #f7f7f7; + text-decoration: none; + font-size: 13px; + line-height: 26px; + height: 28px; + margin: 0; + padding: 0; + cursor: pointer; + border: 1px solid #cccccc; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-shadow: 0 1px 0 #cccccc; +} + +/* Remove the dotted border on :focus and the extra padding in Firefox */ +.mce-window .mce-btn::-moz-focus-inner { + border-width: 0; + border-style: none; + padding: 0; +} + +.mce-window .mce-btn:hover, +.mce-window .mce-btn:focus { + background: #fafafa; + border-color: #999; + color: #23282d; +} + +.mce-window .mce-btn:focus { + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +.mce-window .mce-btn:active { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); + transform: translateY(1px); +} + +.mce-window .mce-btn.mce-disabled { + color: #a0a5aa !important; + border-color: #ddd !important; + background: #f7f7f7 !important; + box-shadow: none !important; + text-shadow: 0 1px 0 #fff !important; + cursor: default; + transform: none !important; +} + +.mce-window .mce-btn.mce-primary { + background: #0085ba; + border-color: #0073aa #006799 #006799; + box-shadow: 0 1px 0 #006799; + color: #fff; + text-decoration: none; + text-shadow: 0 -1px 1px #006799, + 1px 0 1px #006799, + 0 1px 1px #006799, + -1px 0 1px #006799; +} + +.mce-window .mce-btn.mce-primary:hover, +.mce-window .mce-btn.mce-primary:focus { + background: #008ec2; + border-color: #006799; + color: #fff; +} + +.mce-window .mce-btn.mce-primary:focus { + box-shadow: 0 1px 0 #0073aa, + 0 0 2px 1px #33b3db; +} + +.mce-window .mce-btn.mce-primary:active { + background: #0073aa; + border-color: #006799; + box-shadow: inset 0 2px 0 #006799; + vertical-align: top; +} + +.mce-window .mce-btn.mce-primary.mce-disabled { + color: #66c6e4 !important; + background: #008ec2 !important; + border-color: #007cb2 !important; + box-shadow: none !important; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1) !important; + cursor: default; +} + +.mce-menubtn.mce-fixed-width span { + overflow-x: hidden; + text-overflow: ellipsis; + width: 82px; +} + +/* Charmap modal */ +.mce-charmap { + margin: 3px; +} + +.mce-charmap td { + padding: 0; + border-color: #ddd; + cursor: pointer; +} + +.mce-charmap td:hover { + background: #f3f3f3; +} + +.mce-charmap td div { + width: 18px; + height: 22px; + line-height: 1.57142857; +} + +/* TinyMCE tooltips */ +.mce-tooltip { + margin-top: 2px; +} + +.mce-tooltip-inner { + border-radius: 3px; + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); + color: #fff; + font-size: 12px; +} + +/* TinyMCE icons */ +.mce-ico { + font-family: tinymce, Arial; +} + +.mce-btn-small .mce-ico { + font-family: tinymce-small, Arial; +} + +.mce-toolbar .mce-ico { + color: #555d66; + line-height: 1; + width: 20px; + height: 20px; + text-align: center; + text-shadow: none; + margin: 0; + padding: 0; +} + +.qt-dfw { + color: #555d66; + line-height: 1; + width: 28px; + height: 26px; + text-align: center; + text-shadow: none; +} + +.mce-toolbar .mce-btn .mce-open { + line-height: 20px; +} + +.mce-toolbar .mce-btn:hover .mce-open, +.mce-toolbar .mce-btn:focus .mce-open, +.mce-toolbar .mce-btn.mce-active .mce-open { + border-left-color: #23282d; +} + +div.mce-notification { + left: 10% !important; + right: 10%; +} + +.mce-notification button.mce-close { + right: 6px; + top: 3px; + font-weight: 400; + color: #555d66; +} + +.mce-notification button.mce-close:hover, +.mce-notification button.mce-close:focus { + color: #000; +} + +i.mce-i-bold, +i.mce-i-italic, +i.mce-i-bullist, +i.mce-i-numlist, +i.mce-i-blockquote, +i.mce-i-alignleft, +i.mce-i-aligncenter, +i.mce-i-alignright, +i.mce-i-link, +i.mce-i-unlink, +i.mce-i-wp_more, +i.mce-i-strikethrough, +i.mce-i-spellchecker, +i.mce-i-fullscreen, +i.mce-i-wp_fullscreen, +i.mce-i-dfw, +i.mce-i-wp_adv, +i.mce-i-underline, +i.mce-i-alignjustify, +i.mce-i-forecolor, +i.mce-i-backcolor, +i.mce-i-pastetext, +i.mce-i-pasteword, +i.mce-i-removeformat, +i.mce-i-charmap, +i.mce-i-outdent, +i.mce-i-indent, +i.mce-i-undo, +i.mce-i-redo, +i.mce-i-help, +i.mce-i-wp_help, +i.mce-i-wp-media-library, +i.mce-i-ltr, +i.mce-i-wp_page, +i.mce-i-hr, +i.mce-i-wp_code, +i.mce-i-dashicon, +i.mce-i-remove { + font: normal 20px/1 dashicons; + padding: 0; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + margin-left: -2px; + padding-right: 2px; +} + +.qt-dfw { + font: normal 20px/1 dashicons; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +i.mce-i-bold:before { + content: "\f200"; +} + +i.mce-i-italic:before { + content: "\f201"; +} + +i.mce-i-bullist:before { + content: "\f203"; +} + +i.mce-i-numlist:before { + content: "\f204"; +} + +i.mce-i-blockquote:before { + content: "\f205"; +} + +i.mce-i-alignleft:before { + content: "\f206"; +} + +i.mce-i-aligncenter:before { + content: "\f207"; +} + +i.mce-i-alignright:before { + content: "\f208"; +} + +i.mce-i-link:before { + content: "\f103"; +} + +i.mce-i-unlink:before { + content: "\f225"; +} + +i.mce-i-wp_more:before { + content: "\f209"; +} + +i.mce-i-strikethrough:before { + content: "\f224"; +} + +i.mce-i-spellchecker:before { + content: "\f210"; +} + +i.mce-i-fullscreen:before, +i.mce-i-wp_fullscreen:before, +i.mce-i-dfw:before, +.qt-dfw:before { + content: "\f211"; +} + +i.mce-i-wp_adv:before { + content: "\f212"; +} + +i.mce-i-underline:before { + content: "\f213"; +} + +i.mce-i-alignjustify:before { + content: "\f214"; +} + +i.mce-i-forecolor:before, +i.mce-i-backcolor:before { + content: "\f215"; +} + +i.mce-i-pastetext:before { + content: "\f217"; +} + +i.mce-i-removeformat:before { + content: "\f218"; +} + +i.mce-i-charmap:before { + content: "\f220"; +} + +i.mce-i-outdent:before { + content: "\f221"; +} + +i.mce-i-indent:before { + content: "\f222"; +} + +i.mce-i-undo:before { + content: "\f171"; +} + +i.mce-i-redo:before { + content: "\f172"; +} + +i.mce-i-help:before, +i.mce-i-wp_help:before { + content: "\f223"; +} + +i.mce-i-wp-media-library:before { + content: "\f104"; +} + +i.mce-i-ltr:before { + content: "\f320"; +} + +i.mce-i-wp_page:before { + content: "\f105"; +} + +i.mce-i-hr:before { + content: "\f460"; +} + +i.mce-i-remove:before { + content: "\f158"; +} + +i.mce-i-wp_code:before { + content: "\f475"; +} + +/* RTL button icons */ +.rtl i.mce-i-outdent:before { + content: "\f222"; +} + +.rtl i.mce-i-indent:before { + content: "\f221"; +} + +/* Editors */ +.wp-editor-wrap { + position: relative; +} + +.wp-editor-tools { + position: relative; + z-index: 1; +} + +.wp-editor-tools:after { + clear: both; + content: ""; + display: table; +} + +.wp-editor-container { + clear: both; + border: 1px solid #e5e5e5; +} + +.wp-editor-area { + font-family: Consolas, Monaco, monospace; + font-size: 13px; + padding: 10px; + margin: 1px 0 0; + line-height: 150%; + border: 0; + outline: none; + display: block; + resize: vertical; + box-sizing: border-box; +} + +.rtl .wp-editor-area { + font-family: Tahoma, Monaco, monospace; +} + +.locale-he-il .wp-editor-area { + font-family: Arial, Monaco, monospace; +} + +.wp-editor-container textarea.wp-editor-area { + width: 100%; + margin: 0; + box-shadow: none; +} + +.wp-editor-tabs { + float: right; +} + +.wp-switch-editor { + float: left; + box-sizing: content-box; + position: relative; + top: 1px; + background: #ebebeb; + color: #666; + cursor: pointer; + font-size: 13px; + line-height: 1.46153846; + height: 20px; + margin: 5px 0 0 5px; + padding: 3px 8px 4px; + border: 1px solid #e5e5e5; +} + +.wp-switch-editor:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + outline: none; + color: #23282d; +} + +.wp-switch-editor:active, +.html-active .switch-html:focus, +.tmce-active .switch-tmce:focus { + box-shadow: none; +} + +.wp-switch-editor:active { + background-color: #f5f5f5; + box-shadow: none; +} + +.js .tmce-active .wp-editor-area { + color: #fff; +} + +.tmce-active .quicktags-toolbar { + display: none; +} + +.tmce-active .switch-tmce, +.html-active .switch-html { + background: #f5f5f5; + color: #555; + border-bottom-color: #f5f5f5; +} + +.wp-media-buttons { + float: left; +} + +.wp-media-buttons .button { + margin-right: 5px; + margin-bottom: 4px; + padding-left: 7px; + padding-right: 7px; +} + +.wp-media-buttons .button:active { + position: relative; + top: 1px; + margin-top: -1px; + margin-bottom: 1px; +} + +.wp-media-buttons .insert-media { + padding-left: 5px; +} + +.wp-media-buttons a { + text-decoration: none; + color: #444; + font-size: 12px; +} + +.wp-media-buttons img { + padding: 0 4px; + vertical-align: middle; +} + +.wp-media-buttons span.wp-media-buttons-icon { + display: inline-block; + width: 20px; + height: 20px; + line-height: 1; + vertical-align: middle; + margin: 0 2px; +} + +.wp-media-buttons .add_media span.wp-media-buttons-icon { + background: none; +} + +.wp-media-buttons .add_media span.wp-media-buttons-icon:before { + font: normal 18px/1 dashicons; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-media-buttons .add_media span.wp-media-buttons-icon:before { + content: "\f104"; +} + +.mce-content-body dl.wp-caption { + max-width: 100%; +} + +/* Quicktags */ +.quicktags-toolbar { + padding: 3px; + position: relative; + border-bottom: 1px solid #ddd; + background: #f5f5f5; + min-height: 30px; +} + +.has-dfw .quicktags-toolbar { + padding-right: 35px; +} + +.wp-core-ui .quicktags-toolbar input.button.button-small { + margin: 2px; +} + +.quicktags-toolbar input[value="link"] { + text-decoration: underline; +} + +.quicktags-toolbar input[value="del"] { + text-decoration: line-through; +} + +.quicktags-toolbar input[value="i"] { + font-style: italic; +} + +.quicktags-toolbar input[value="b"] { + font-weight: 600; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw, +.qt-dfw { + position: absolute; + top: 0; + right: 0; +} + +.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw { + margin: 7px 7px 0 0; +} + +.qt-dfw { + margin: 5px 5px 0 0; +} + +.qt-fullscreen { + position: static; + margin: 2px; +} + +@media screen and (max-width: 782px) { + .mce-toolbar .mce-btn button, + .qt-dfw { + padding: 6px 7px; + } + + /* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */ + .mce-toolbar .mce-btn-group .mce-btn.mce-primary button { + padding: 6px 7px 5px; + } + + .mce-toolbar .mce-btn-group .mce-btn { + margin: 1px; + } + + .qt-dfw { + width: 36px; + height: 34px; + } + + .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw { + margin: 4px 4px 0 0; + } + + .mce-toolbar .mce-colorbutton .mce-preview { + left: 8px; + bottom: 6px; + } + + .mce-window .mce-btn { + padding: 2px 0; + } + + .has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first, + .has-dfw .quicktags-toolbar { + padding-right: 40px; + } +} + +@media screen and (min-width: 782px) { + .wp-core-ui .quicktags-toolbar input.button.button-small { + /* .button-small is normally 11px, but a bit too small for these buttons. */ + font-size: 12px; + min-height: 26px; + line-height: 2; + } +} + +#wp_editbtns, +#wp_gallerybtns { + padding: 2px; + position: absolute; + display: none; + z-index: 100020; +} + +#wp_editimgbtn, +#wp_delimgbtn, +#wp_editgallery, +#wp_delgallery { + border-color: #999; + background-color: #eee; + margin: 2px; + padding: 2px; + border-width: 1px; + border-style: solid; + border-radius: 3px; +} + +#wp_editimgbtn:hover, +#wp_delimgbtn:hover, +#wp_editgallery:hover, +#wp_delgallery:hover { + border-color: #555; + background-color: #ccc; +} + +/*------------------------------------------------------------------------------ + wp-link +------------------------------------------------------------------------------*/ + +#wp-link-wrap { + display: none; + background-color: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + width: 500px; + overflow: hidden; + margin-left: -250px; + margin-top: -125px; + position: fixed; + top: 50%; + left: 50%; + z-index: 100105; + transition: height 0.2s, margin-top 0.2s; +} + +#wp-link-backdrop { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + min-height: 360px; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 100100; +} + +#wp-link { + position: relative; + height: 100%; +} + +#wp-link-wrap { + height: 500px; + margin-top: -250px; +} + +#wp-link-wrap .wp-link-text-field { + display: none; +} + +#wp-link-wrap.has-text-field .wp-link-text-field { + display: block; +} + +#link-modal-title { + background: #fcfcfc; + border-bottom: 1px solid #ddd; + height: 36px; + font-size: 18px; + font-weight: 600; + line-height: 2; + margin: 0; + padding: 0 36px 0 16px; +} + +#wp-link-close { + color: #666; + padding: 0; + position: absolute; + top: 0; + right: 0; + width: 36px; + height: 36px; + text-align: center; + background: none; + border: none; + cursor: pointer; +} + +#wp-link-close:before { + font: normal 20px/36px dashicons; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 36px; + height: 36px; + content: "\f158"; +} + +#wp-link-close:hover, +#wp-link-close:focus { + color: #00a0d2; +} + +#wp-link-close:focus { + outline: none; + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +#wp-link-wrap #link-selector { + -webkit-overflow-scrolling: touch; + padding: 0 16px; + position: absolute; + top: 37px; + left: 0; + right: 0; + bottom: 44px; +} + +#wp-link ol, +#wp-link ul { + list-style: none; + margin: 0; + padding: 0; +} + +#wp-link input[type="text"] { + box-sizing: border-box; +} + +#wp-link #link-options { + padding: 8px 0 12px; +} + +#wp-link p.howto { + margin: 3px 0; +} + +#wp-link p.howto a { + text-decoration: none; + color: inherit; +} + +#wp-link label input[type="text"] { + margin-top: 5px; + width: 70%; +} + +#wp-link #link-options label span, +#wp-link #search-panel label span.search-label { + display: inline-block; + width: 80px; + text-align: right; + padding-right: 5px; + max-width: 24%; + vertical-align: middle; + word-wrap: break-word; +} + +#wp-link .link-search-field { + width: 250px; + max-width: 70%; +} + +#wp-link .link-search-wrapper { + margin: 5px 0 9px; + display: block; + overflow: hidden; +} + +#wp-link .link-search-wrapper .spinner { + float: none; + margin: -3px 0 0 4px; +} + +#wp-link .link-target { + padding: 3px 0 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#wp-link .link-target label { + max-width: 70%; +} + +#wp-link .query-results { + border: 1px #dfdfdf solid; + margin: 0 0 12px; + background: #fff; + overflow: auto; + position: absolute; + left: 16px; + right: 16px; + bottom: 0; + top: 166px; +} + +.has-text-field #wp-link .query-results { + top: 210px; +} + +#wp-link li { + clear: both; + margin-bottom: 0; + border-bottom: 1px solid #f1f1f1; + color: #32373c; + padding: 4px 6px 4px 10px; + cursor: pointer; + position: relative; +} + +#wp-link .query-notice { + padding: 0; + border-bottom: 1px solid #dfdfdf; + background-color: #f7fcfe; + color: #000; +} + +#wp-link .query-notice .query-notice-default, +#wp-link .query-notice .query-notice-hint { + display: block; + padding: 6px; + border-left: 4px solid #00a0d2; +} + +#wp-link .unselectable.no-matches-found { + padding: 0; + border-bottom: 1px solid #dfdfdf; + background-color: #fef7f1; +} + +#wp-link .no-matches-found .item-title { + display: block; + padding: 6px; + border-left: 4px solid #d54e21; +} + +#wp-link .query-results em { + font-style: normal; +} + +#wp-link li:hover { + background: #eaf2fa; + color: #151515; +} + +#wp-link li.unselectable { + border-bottom: 1px solid #dfdfdf; +} + +#wp-link li.unselectable:hover { + background: #fff; + cursor: auto; + color: #32373c; +} + +#wp-link li.selected { + background: #ddd; + color: #32373c; +} + +#wp-link li.selected .item-title { + font-weight: 600; +} + +#wp-link li:last-child { + border: none; +} + +#wp-link .item-title { + display: inline-block; + width: 80%; + width: calc(100% - 68px); + word-wrap: break-word; +} + +#wp-link .item-info { + text-transform: uppercase; + color: #666; + font-size: 11px; + position: absolute; + right: 5px; + top: 5px; +} + +#wp-link .river-waiting { + display: none; + padding: 10px 0; +} + +#wp-link .submitbox { + padding: 8px 16px; + background: #fcfcfc; + border-top: 1px solid #ddd; + position: absolute; + bottom: 0; + left: 0; + right: 0; +} + +#wp-link-cancel { + line-height: 1.92307692; + float: left; +} + +#wp-link-update { + line-height: 1.76923076; + float: right; +} + +#wp-link-submit { + float: right; +} + +@media screen and (max-width: 782px) { + #wp-link-wrap { + margin-top: -140px; + } + + #wp-link-wrap .query-results { + top: 195px; + } + + #wp-link-wrap.has-text-field .query-results { + top: 235px; + } + + #link-selector { + padding: 0 16px 60px; + } + + #wp-link-wrap #link-selector { + bottom: 52px; + } + + #wp-link-cancel { + line-height: 2.46153846; + } + + #wp-link .link-target { + padding-top: 10px; + } + + #wp-link .submitbox .button { + margin-bottom: 0; + } +} + +@media screen and (max-width: 520px) { + #wp-link-wrap { + width: auto; + margin-left: 0; + left: 10px; + right: 10px; + max-width: 500px; + } +} + +@media screen and (max-height: 520px) { + #wp-link-wrap { + transition: none; + height: auto; + margin-top: 0; + top: 10px; + bottom: 10px; + } + + #link-selector { + overflow: auto; + } + + #search-panel .query-results { + position: static; + } +} + +@media screen and (max-height: 290px) { + #wp-link-wrap { + height: auto; + margin-top: 0; + top: 10px; + bottom: 10px; + } + + #link-selector { + overflow: auto; + height: calc(100% - 92px); + padding-bottom: 2px; + } + + #search-panel .query-results { + position: static; + } +} + +div.wp-link-preview { + float: left; + margin: 5px; + max-width: 694px; + overflow: hidden; + text-overflow: ellipsis; +} + +div.wp-link-preview a { + color: #0073aa; + text-decoration: underline; + transition-property: border, background, color; + transition-duration: .05s; + transition-timing-function: ease-in-out; + cursor: pointer; +} + +div.wp-link-preview a.wplink-url-error { + color: #dc3232; +} + +div.wp-link-input { + float: left; + margin: 2px; + max-width: 694px; +} + +div.wp-link-input input { + width: 300px; + padding: 3px; + box-sizing: border-box; + line-height: 1.28571429; /* 18px */ + /* Override value inherited from default input fields. */ + min-height: 26px; +} + +.mce-toolbar div.wp-link-preview ~ .mce-btn, +.mce-toolbar div.wp-link-input ~ .mce-btn { + margin: 2px 1px; +} + +.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child { + margin-right: 2px; +} + +.ui-autocomplete.wplink-autocomplete { + z-index: 100110; + max-height: 200px; + overflow-y: auto; + padding: 0; + margin: 0; + list-style: none; + position: absolute; + border: 1px solid #5b9dd9; + box-shadow: 0 1px 2px rgba(30, 140, 190, 0.8); + background-color: #fff; +} + +.ui-autocomplete.wplink-autocomplete li { + margin-bottom: 0; + padding: 4px 10px; + clear: both; + white-space: normal; + text-align: left; +} + +.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right { + float: right; +} + +.ui-autocomplete.wplink-autocomplete li.ui-state-focus { + background-color: #ddd; + cursor: pointer; +} + +@media screen and (max-width: 782px) { + div.wp-link-preview, + div.wp-link-input { + max-width: 70%; + max-width: calc(100% - 86px); + } + + div.wp-link-preview { + margin: 8px 0 8px 5px; + } + + div.wp-link-input { + width: 300px; + } + + div.wp-link-input input { + width: 100%; + font-size: 16px; + padding: 5px; + } +} + +/* =Overlay Body +-------------------------------------------------------------- */ + +.mce-fullscreen { + z-index: 100010; +} + +/* =Localization +-------------------------------------------------------------- */ +.rtl .wp-switch-editor, +.rtl .quicktags-toolbar input { + font-family: Tahoma, sans-serif; +} + +/* rtl:ignore */ +.mce-rtl .mce-flow-layout .mce-flow-layout-item > div { + direction: rtl; +} + +/* rtl:ignore */ +.mce-rtl .mce-listbox i.mce-caret { + left: 6px; +} + +html:lang(he-il) .rtl .wp-switch-editor, +html:lang(he-il) .rtl .quicktags-toolbar input { + font-family: Arial, sans-serif; +} + +/* HiDPI */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + .wp-media-buttons .add_media span.wp-media-buttons-icon { + background: none; + } +} diff --git a/wp-includes/css/editor.min.css b/wp-includes/css/editor.min.css new file mode 100644 index 0000000..72daca3 --- /dev/null +++ b/wp-includes/css/editor.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.mce-tinymce{box-shadow:none}.mce-container,.mce-container *,.mce-widget,.mce-widget *{color:inherit;font-family:inherit}.mce-container .mce-monospace,.mce-widget .mce-monospace{font-family:Consolas,Monaco,monospace;font-size:13px;line-height:150%}#mce-modal-block,#mce-modal-block.mce-fade{opacity:.7;filter:alpha(opacity=70);transition:none;background:#000}.mce-window{border-radius:0;box-shadow:0 3px 6px rgba(0,0,0,.3);-webkit-font-smoothing:subpixel-antialiased;transition:none}.mce-window .mce-container-body.mce-abs-layout{overflow:visible}.mce-window .mce-window-head{background:#fcfcfc;border-bottom:1px solid #ddd;padding:0;min-height:36px}.mce-window .mce-window-head .mce-title{color:#444;font-size:18px;font-weight:600;line-height:36px;margin:0;padding:0 36px 0 16px}.mce-window .mce-window-head .mce-close,.mce-window-head .mce-close .mce-i-remove{color:transparent;top:0;right:0;width:36px;height:36px;padding:0;line-height:36px;text-align:center}.mce-window-head .mce-close .mce-i-remove:before{font:normal 20px/36px dashicons;text-align:center;color:#666;width:36px;height:36px;display:block}.mce-window-head .mce-close:focus .mce-i-remove:before,.mce-window-head .mce-close:hover .mce-i-remove:before{color:#00a0d2}.mce-window-head .mce-close:focus .mce-i-remove,div.mce-tab:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.mce-window .mce-window-head .mce-dragh{width:calc(100% - 36px)}.mce-window .mce-foot{border-top:1px solid #ddd}#wp-link .query-results,.mce-checkbox i.mce-i-checkbox,.mce-textbox{border:1px solid #ddd;border-radius:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);transition:.05s all ease-in-out}#wp-link .query-results:focus,.mce-checkbox:focus i.mce-i-checkbox,.mce-textbox.mce-focus,.mce-textbox:focus{border-color:#5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8)}.mce-window .mce-wp-help{height:360px;width:460px;overflow:auto}.mce-window .mce-wp-help *{box-sizing:border-box}.mce-window .mce-wp-help>.mce-container-body{width:auto!important}.mce-window .wp-editor-help{padding:10px 10px 0 20px}.mce-window .wp-editor-help h2,.mce-window .wp-editor-help p{margin:8px 0;white-space:normal;font-size:14px;font-weight:400}.mce-window .wp-editor-help table{width:100%;margin-bottom:20px}.mce-window .wp-editor-help table.wp-help-single{margin:0 8px 20px}.mce-window .wp-editor-help table.fixed{table-layout:fixed}.mce-window .wp-editor-help table.fixed td:nth-child(odd),.mce-window .wp-editor-help table.fixed th:nth-child(odd){width:12%}.mce-window .wp-editor-help table.fixed td:nth-child(even),.mce-window .wp-editor-help table.fixed th:nth-child(even){width:38%}.mce-window .wp-editor-help table.fixed th:nth-child(odd){padding:5px 0 0}.mce-window .wp-editor-help td,.mce-window .wp-editor-help th{font-size:13px;padding:5px;vertical-align:middle;word-wrap:break-word;white-space:normal}.mce-window .wp-editor-help th{font-weight:600;padding-bottom:0}.mce-window .wp-editor-help kbd{font-family:monospace;padding:2px 7px 3px;font-weight:600;margin:0;background:#eaeaea;background:rgba(0,0,0,.08)}.mce-window .wp-help-th-center td:nth-child(odd),.mce-window .wp-help-th-center th:nth-child(odd){text-align:center}.mce-floatpanel.mce-popover,.mce-menu{border-color:rgba(0,0,0,.15);border-radius:0;box-shadow:0 3px 5px rgba(0,0,0,.2)}.mce-floatpanel.mce-popover.mce-bottom,.mce-menu{margin-top:2px}.mce-floatpanel .mce-arrow{display:none}.mce-menu .mce-container-body{min-width:160px}.mce-menu-item{border:none;margin-bottom:2px;padding:6px 15px 6px 12px}.mce-menu-has-icons i.mce-ico{line-height:20px}div.mce-panel{border:0;background:#fff}.mce-panel.mce-menu{border:1px solid #ddd}div.mce-tab{line-height:13px}div.mce-toolbar-grp{border-bottom:1px solid #ddd;background:#f5f5f5;padding:0;position:relative}div.mce-inline-toolbar-grp{border:1px solid #a0a5aa;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15);box-sizing:border-box;margin-bottom:8px;position:absolute;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;max-width:98%;z-index:100100}div.mce-inline-toolbar-grp>div.mce-stack-layout{padding:1px}div.mce-inline-toolbar-grp.mce-arrow-up{margin-bottom:0;margin-top:8px}div.mce-inline-toolbar-grp:after,div.mce-inline-toolbar-grp:before{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}div.mce-inline-toolbar-grp.mce-arrow-up:before{top:-9px;border-bottom-color:#a0a5aa;border-width:0 9px 9px;margin-left:-9px}div.mce-inline-toolbar-grp.mce-arrow-down:before{bottom:-9px;border-top-color:#a0a5aa;border-width:9px 9px 0;margin-left:-9px}div.mce-inline-toolbar-grp.mce-arrow-up:after{top:-8px;border-bottom-color:#f5f5f5;border-width:0 8px 8px;margin-left:-8px}div.mce-inline-toolbar-grp.mce-arrow-down:after{bottom:-8px;border-top-color:#f5f5f5;border-width:8px 8px 0;margin-left:-8px}div.mce-inline-toolbar-grp.mce-arrow-left:after,div.mce-inline-toolbar-grp.mce-arrow-left:before{margin:0}div.mce-inline-toolbar-grp.mce-arrow-left:before{left:20px}div.mce-inline-toolbar-grp.mce-arrow-left:after{left:21px}div.mce-inline-toolbar-grp.mce-arrow-right:after,div.mce-inline-toolbar-grp.mce-arrow-right:before{left:auto;margin:0}div.mce-inline-toolbar-grp.mce-arrow-right:before{right:20px}div.mce-inline-toolbar-grp.mce-arrow-right:after{right:21px}div.mce-inline-toolbar-grp.mce-arrow-full{right:0}div.mce-inline-toolbar-grp.mce-arrow-full>div{width:100%;overflow-x:auto}div.mce-toolbar-grp>div{padding:3px}.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-right:32px}.mce-toolbar .mce-btn-group{margin:0}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}div.mce-statusbar{border-top:1px solid #e5e5e5}div.mce-path{padding:2px 10px;margin:0}.mce-path,.mce-path .mce-divider,.mce-path-item{font-size:12px}.mce-toolbar .mce-btn,.qt-dfw{border-color:transparent;background:0 0;box-shadow:none;text-shadow:none;cursor:pointer}.mce-btn .mce-txt{direction:inherit;text-align:inherit}.mce-toolbar .mce-btn-group .mce-btn,.qt-dfw{border:1px solid transparent;margin:2px;border-radius:2px}.mce-toolbar .mce-btn-group .mce-btn:focus,.mce-toolbar .mce-btn-group .mce-btn:hover,.qt-dfw:focus,.qt-dfw:hover{background:#fafafa;border-color:#555d66;color:#23282d;box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);outline:0}.mce-toolbar .mce-btn-group .mce-btn.mce-active,.mce-toolbar .mce-btn-group .mce-btn:active,.qt-dfw.active{background:#ebebeb;border-color:#555d66;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.3)}.mce-btn.mce-active,.mce-btn.mce-active button,.mce-btn.mce-active i,.mce-btn.mce-active:hover button,.mce-btn.mce-active:hover i{color:inherit}.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover{border-color:#23282d}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover{color:#a0a5aa;background:0 0;border-color:#ddd;text-shadow:0 1px 0 #fff;box-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus{border-color:#555d66}.mce-toolbar .mce-btn-group .mce-first,.mce-toolbar .mce-btn-group .mce-last{border-color:transparent}.mce-toolbar .mce-btn button,.qt-dfw{padding:2px 3px;line-height:normal}.mce-toolbar .mce-listbox button{font-size:13px;line-height:1.53846153;padding-left:6px;padding-right:20px}.mce-toolbar .mce-btn i{text-shadow:none}.mce-toolbar .mce-btn-group>div{white-space:normal}.mce-toolbar .mce-colorbutton .mce-open{border-right:0}.mce-toolbar .mce-colorbutton .mce-preview{margin:0;padding:0;top:auto;bottom:2px;left:3px;height:3px;width:20px;background:#555d66}.mce-toolbar .mce-btn-group .mce-btn.mce-primary{min-width:0;background:#0085ba;border-color:#0073aa #006799 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:2px 3px 1px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico{color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus{box-shadow:0 0 1px 1px #33b3db}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active{background:#0073aa;border-color:#006799;box-shadow:inset 0 2px 0 #006799}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox{border-radius:0;direction:ltr;background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 1px -1px rgba(0,0,0,.2)}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover{border-color:#b4b9be}.mce-panel .mce-btn i.mce-caret{border-top:6px solid #555d66;margin-left:2px;margin-right:2px}.mce-listbox i.mce-caret{right:4px}.mce-panel .mce-btn:focus i.mce-caret,.mce-panel .mce-btn:hover i.mce-caret{border-top-color:#23282d}.mce-panel .mce-active i.mce-caret{border-top:0;border-bottom:6px solid #23282d;margin-top:7px}.mce-listbox.mce-active i.mce-caret{margin-top:-3px}.mce-toolbar .mce-splitbtn:hover .mce-open{border-right-color:transparent}.mce-toolbar .mce-splitbtn .mce-open.mce-active{background:0 0;outline:0}.mce-menu .mce-menu-item.mce-active.mce-menu-item-normal,.mce-menu .mce-menu-item.mce-active.mce-menu-item-preview,.mce-menu .mce-menu-item.mce-selected,.mce-menu .mce-menu-item:focus,.mce-menu .mce-menu-item:hover{background:#0073aa;color:#fff}.mce-menu .mce-menu-item.mce-selected .mce-caret,.mce-menu .mce-menu-item:focus .mce-caret,.mce-menu .mce-menu-item:hover .mce-caret{border-left-color:#fff}.rtl .mce-menu .mce-menu-item.mce-selected .mce-caret,.rtl .mce-menu .mce-menu-item:focus .mce-caret,.rtl .mce-menu .mce-menu-item:hover .mce-caret{border-left-color:inherit;border-right-color:#fff}.mce-menu .mce-menu-item.mce-active .mce-menu-shortcut,.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico,.mce-menu .mce-menu-item.mce-disabled:hover .mce-text,.mce-menu .mce-menu-item.mce-selected .mce-ico,.mce-menu .mce-menu-item.mce-selected .mce-text,.mce-menu .mce-menu-item:focus .mce-ico,.mce-menu .mce-menu-item:focus .mce-menu-shortcut,.mce-menu .mce-menu-item:focus .mce-text,.mce-menu .mce-menu-item:hover .mce-ico,.mce-menu .mce-menu-item:hover .mce-menu-shortcut,.mce-menu .mce-menu-item:hover .mce-text{color:inherit}.mce-menu .mce-menu-item.mce-disabled{cursor:default}.mce-menu .mce-menu-item.mce-disabled:hover{background:#ccc}div.mce-menubar{border-color:#e5e5e5;background:#fff;border-width:0 0 1px}.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus,.mce-menubar .mce-menubtn:hover{border-color:transparent;background:0 0}.mce-menubar .mce-menubtn:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.mce-menu-item-sep:hover,div.mce-menu .mce-menu-item-sep{border-bottom:1px solid #ddd;height:0;margin:5px 0}.mce-menubtn span{margin-right:0;padding-left:3px}.mce-menu-has-icons i.mce-ico:before{margin-left:-2px}.mce-menu.mce-menu-align .mce-menu-item-normal{position:relative}.mce-menu.mce-menu-align .mce-menu-shortcut{bottom:.6em;font-size:.9em}.mce-primary button,.mce-primary button i{text-align:center;color:#fff;text-shadow:none;padding:0;line-height:1.85714285}.mce-window .mce-btn{color:#555;background:#f7f7f7;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0;cursor:pointer;border:1px solid #ccc;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-shadow:0 1px 0 #ccc}.mce-window .mce-btn::-moz-focus-inner{border-width:0;border-style:none;padding:0}.mce-window .mce-btn:focus,.mce-window .mce-btn:hover{background:#fafafa;border-color:#999;color:#23282d}.mce-window .mce-btn:focus{border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}.mce-window .mce-btn:active{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);transform:translateY(1px)}.mce-window .mce-btn.mce-disabled{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}.mce-window .mce-btn.mce-primary{background:#0085ba;border-color:#0073aa #006799 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799,-1px 0 1px #006799}.mce-window .mce-btn.mce-primary:focus,.mce-window .mce-btn.mce-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.mce-window .mce-btn.mce-primary:focus{box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db}.mce-window .mce-btn.mce-primary:active{background:#0073aa;border-color:#006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.mce-window .mce-btn.mce-primary.mce-disabled{color:#66c6e4!important;background:#008ec2!important;border-color:#007cb2!important;box-shadow:none!important;text-shadow:0 -1px 0 rgba(0,0,0,.1)!important;cursor:default}.mce-menubtn.mce-fixed-width span{overflow-x:hidden;text-overflow:ellipsis;width:82px}.mce-charmap{margin:3px}.mce-charmap td{padding:0;border-color:#ddd;cursor:pointer}.mce-charmap td:hover{background:#f3f3f3}.mce-charmap td div{width:18px;height:22px;line-height:1.57142857}.mce-tooltip{margin-top:2px}.mce-tooltip-inner{border-radius:3px;box-shadow:0 3px 5px rgba(0,0,0,.2);color:#fff;font-size:12px}.mce-ico{font-family:tinymce,Arial}.mce-btn-small .mce-ico{font-family:tinymce-small,Arial}.mce-toolbar .mce-ico{color:#555d66;line-height:1;width:20px;height:20px;text-align:center;text-shadow:none;margin:0;padding:0}.qt-dfw{color:#555d66;line-height:1;width:28px;height:26px;text-align:center;text-shadow:none}.mce-toolbar .mce-btn .mce-open{line-height:20px}.mce-toolbar .mce-btn.mce-active .mce-open,.mce-toolbar .mce-btn:focus .mce-open,.mce-toolbar .mce-btn:hover .mce-open{border-left-color:#23282d}div.mce-notification{left:10%!important;right:10%}.mce-notification button.mce-close{right:6px;top:3px;font-weight:400;color:#555d66}.mce-notification button.mce-close:focus,.mce-notification button.mce-close:hover{color:#000}i.mce-i-aligncenter,i.mce-i-alignjustify,i.mce-i-alignleft,i.mce-i-alignright,i.mce-i-backcolor,i.mce-i-blockquote,i.mce-i-bold,i.mce-i-bullist,i.mce-i-charmap,i.mce-i-dashicon,i.mce-i-dfw,i.mce-i-forecolor,i.mce-i-fullscreen,i.mce-i-help,i.mce-i-hr,i.mce-i-indent,i.mce-i-italic,i.mce-i-link,i.mce-i-ltr,i.mce-i-numlist,i.mce-i-outdent,i.mce-i-pastetext,i.mce-i-pasteword,i.mce-i-redo,i.mce-i-remove,i.mce-i-removeformat,i.mce-i-spellchecker,i.mce-i-strikethrough,i.mce-i-underline,i.mce-i-undo,i.mce-i-unlink,i.mce-i-wp-media-library,i.mce-i-wp_adv,i.mce-i-wp_code,i.mce-i-wp_fullscreen,i.mce-i-wp_help,i.mce-i-wp_more,i.mce-i-wp_page{font:normal 20px/1 dashicons;padding:0;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin-left:-2px;padding-right:2px}.qt-dfw{font:normal 20px/1 dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}i.mce-i-bold:before{content:"\f200"}i.mce-i-italic:before{content:"\f201"}i.mce-i-bullist:before{content:"\f203"}i.mce-i-numlist:before{content:"\f204"}i.mce-i-blockquote:before{content:"\f205"}i.mce-i-alignleft:before{content:"\f206"}i.mce-i-aligncenter:before{content:"\f207"}i.mce-i-alignright:before{content:"\f208"}i.mce-i-link:before{content:"\f103"}i.mce-i-unlink:before{content:"\f225"}i.mce-i-wp_more:before{content:"\f209"}i.mce-i-strikethrough:before{content:"\f224"}i.mce-i-spellchecker:before{content:"\f210"}.qt-dfw:before,i.mce-i-dfw:before,i.mce-i-fullscreen:before,i.mce-i-wp_fullscreen:before{content:"\f211"}i.mce-i-wp_adv:before{content:"\f212"}i.mce-i-underline:before{content:"\f213"}i.mce-i-alignjustify:before{content:"\f214"}i.mce-i-backcolor:before,i.mce-i-forecolor:before{content:"\f215"}i.mce-i-pastetext:before{content:"\f217"}i.mce-i-removeformat:before{content:"\f218"}i.mce-i-charmap:before{content:"\f220"}i.mce-i-outdent:before{content:"\f221"}i.mce-i-indent:before{content:"\f222"}i.mce-i-undo:before{content:"\f171"}i.mce-i-redo:before{content:"\f172"}i.mce-i-help:before,i.mce-i-wp_help:before{content:"\f223"}i.mce-i-wp-media-library:before{content:"\f104"}i.mce-i-ltr:before{content:"\f320"}i.mce-i-wp_page:before{content:"\f105"}i.mce-i-hr:before{content:"\f460"}i.mce-i-remove:before{content:"\f158"}i.mce-i-wp_code:before{content:"\f475"}.rtl i.mce-i-outdent:before{content:"\f222"}.rtl i.mce-i-indent:before{content:"\f221"}.wp-editor-wrap{position:relative}.wp-editor-tools{position:relative;z-index:1}.wp-editor-tools:after{clear:both;content:"";display:table}.wp-editor-container{clear:both;border:1px solid #e5e5e5}.wp-editor-area{font-family:Consolas,Monaco,monospace;font-size:13px;padding:10px;margin:1px 0 0;line-height:150%;border:0;outline:0;display:block;resize:vertical;box-sizing:border-box}.rtl .wp-editor-area{font-family:Tahoma,Monaco,monospace}.locale-he-il .wp-editor-area{font-family:Arial,Monaco,monospace}.wp-editor-container textarea.wp-editor-area{width:100%;margin:0;box-shadow:none}.wp-editor-tabs{float:right}.wp-switch-editor{float:left;box-sizing:content-box;position:relative;top:1px;background:#ebebeb;color:#666;cursor:pointer;font-size:13px;line-height:1.46153846;height:20px;margin:5px 0 0 5px;padding:3px 8px 4px;border:1px solid #e5e5e5}.wp-switch-editor:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:0;color:#23282d}.html-active .switch-html:focus,.tmce-active .switch-tmce:focus,.wp-switch-editor:active{box-shadow:none}.wp-switch-editor:active{background-color:#f5f5f5;box-shadow:none}.js .tmce-active .wp-editor-area{color:#fff}.tmce-active .quicktags-toolbar{display:none}.html-active .switch-html,.tmce-active .switch-tmce{background:#f5f5f5;color:#555;border-bottom-color:#f5f5f5}.wp-media-buttons{float:left}.wp-media-buttons .button{margin-right:5px;margin-bottom:4px;padding-left:7px;padding-right:7px}.wp-media-buttons .button:active{position:relative;top:1px;margin-top:-1px;margin-bottom:1px}.wp-media-buttons .insert-media{padding-left:5px}.wp-media-buttons a{text-decoration:none;color:#444;font-size:12px}.wp-media-buttons img{padding:0 4px;vertical-align:middle}.wp-media-buttons span.wp-media-buttons-icon{display:inline-block;width:20px;height:20px;line-height:1;vertical-align:middle;margin:0 2px}.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font:normal 18px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{content:"\f104"}.mce-content-body dl.wp-caption{max-width:100%}.quicktags-toolbar{padding:3px;position:relative;border-bottom:1px solid #ddd;background:#f5f5f5;min-height:30px}.has-dfw .quicktags-toolbar{padding-right:35px}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:2px}.quicktags-toolbar input[value=link]{text-decoration:underline}.quicktags-toolbar input[value=del]{text-decoration:line-through}.quicktags-toolbar input[value="i"]{font-style:italic}.quicktags-toolbar input[value="b"]{font-weight:600}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,.qt-dfw{position:absolute;top:0;right:0}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:7px 7px 0 0}.qt-dfw{margin:5px 5px 0 0}.qt-fullscreen{position:static;margin:2px}@media screen and (max-width:782px){.mce-toolbar .mce-btn button,.qt-dfw{padding:6px 7px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:6px 7px 5px}.mce-toolbar .mce-btn-group .mce-btn{margin:1px}.qt-dfw{width:36px;height:34px}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:4px 4px 0 0}.mce-toolbar .mce-colorbutton .mce-preview{left:8px;bottom:6px}.mce-window .mce-btn{padding:2px 0}.has-dfw .quicktags-toolbar,.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-right:40px}}@media screen and (min-width:782px){.wp-core-ui .quicktags-toolbar input.button.button-small{font-size:12px;min-height:26px;line-height:2}}#wp_editbtns,#wp_gallerybtns{padding:2px;position:absolute;display:none;z-index:100020}#wp_delgallery,#wp_delimgbtn,#wp_editgallery,#wp_editimgbtn{border-color:#999;background-color:#eee;margin:2px;padding:2px;border-width:1px;border-style:solid;border-radius:3px}#wp_delgallery:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_editimgbtn:hover{border-color:#555;background-color:#ccc}#wp-link-wrap{display:none;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:500px;overflow:hidden;margin-left:-250px;margin-top:-125px;position:fixed;top:50%;left:50%;z-index:100105;transition:height .2s,margin-top .2s}#wp-link-backdrop{display:none;position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100100}#wp-link{position:relative;height:100%}#wp-link-wrap{height:500px;margin-top:-250px}#wp-link-wrap .wp-link-text-field{display:none}#wp-link-wrap.has-text-field .wp-link-text-field{display:block}#link-modal-title{background:#fcfcfc;border-bottom:1px solid #ddd;height:36px;font-size:18px;font-weight:600;line-height:2;margin:0;padding:0 36px 0 16px}#wp-link-close{color:#666;padding:0;position:absolute;top:0;right:0;width:36px;height:36px;text-align:center;background:0 0;border:none;cursor:pointer}#wp-link-close:before{font:normal 20px/36px dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:36px;height:36px;content:"\f158"}#wp-link-close:focus,#wp-link-close:hover{color:#00a0d2}#wp-link-close:focus{outline:0;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:2px solid transparent;outline-offset:-2px}#wp-link-wrap #link-selector{-webkit-overflow-scrolling:touch;padding:0 16px;position:absolute;top:37px;left:0;right:0;bottom:44px}#wp-link ol,#wp-link ul{list-style:none;margin:0;padding:0}#wp-link input[type=text]{box-sizing:border-box}#wp-link #link-options{padding:8px 0 12px}#wp-link p.howto{margin:3px 0}#wp-link p.howto a{text-decoration:none;color:inherit}#wp-link label input[type=text]{margin-top:5px;width:70%}#wp-link #link-options label span,#wp-link #search-panel label span.search-label{display:inline-block;width:80px;text-align:right;padding-right:5px;max-width:24%;vertical-align:middle;word-wrap:break-word}#wp-link .link-search-field{width:250px;max-width:70%}#wp-link .link-search-wrapper{margin:5px 0 9px;display:block;overflow:hidden}#wp-link .link-search-wrapper .spinner{float:none;margin:-3px 0 0 4px}#wp-link .link-target{padding:3px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#wp-link .link-target label{max-width:70%}#wp-link .query-results{border:1px #dfdfdf solid;margin:0 0 12px;background:#fff;overflow:auto;position:absolute;left:16px;right:16px;bottom:0;top:166px}.has-text-field #wp-link .query-results{top:210px}#wp-link li{clear:both;margin-bottom:0;border-bottom:1px solid #f1f1f1;color:#32373c;padding:4px 6px 4px 10px;cursor:pointer;position:relative}#wp-link .query-notice{padding:0;border-bottom:1px solid #dfdfdf;background-color:#f7fcfe;color:#000}#wp-link .query-notice .query-notice-default,#wp-link .query-notice .query-notice-hint{display:block;padding:6px;border-left:4px solid #00a0d2}#wp-link .unselectable.no-matches-found{padding:0;border-bottom:1px solid #dfdfdf;background-color:#fef7f1}#wp-link .no-matches-found .item-title{display:block;padding:6px;border-left:4px solid #d54e21}#wp-link .query-results em{font-style:normal}#wp-link li:hover{background:#eaf2fa;color:#151515}#wp-link li.unselectable{border-bottom:1px solid #dfdfdf}#wp-link li.unselectable:hover{background:#fff;cursor:auto;color:#32373c}#wp-link li.selected{background:#ddd;color:#32373c}#wp-link li.selected .item-title{font-weight:600}#wp-link li:last-child{border:none}#wp-link .item-title{display:inline-block;width:80%;width:calc(100% - 68px);word-wrap:break-word}#wp-link .item-info{text-transform:uppercase;color:#666;font-size:11px;position:absolute;right:5px;top:5px}#wp-link .river-waiting{display:none;padding:10px 0}#wp-link .submitbox{padding:8px 16px;background:#fcfcfc;border-top:1px solid #ddd;position:absolute;bottom:0;left:0;right:0}#wp-link-cancel{line-height:1.92307692;float:left}#wp-link-update{line-height:1.76923076;float:right}#wp-link-submit{float:right}@media screen and (max-width:782px){#wp-link-wrap{margin-top:-140px}#wp-link-wrap .query-results{top:195px}#wp-link-wrap.has-text-field .query-results{top:235px}#link-selector{padding:0 16px 60px}#wp-link-wrap #link-selector{bottom:52px}#wp-link-cancel{line-height:2.46153846}#wp-link .link-target{padding-top:10px}#wp-link .submitbox .button{margin-bottom:0}}@media screen and (max-width:520px){#wp-link-wrap{width:auto;margin-left:0;left:10px;right:10px;max-width:500px}}@media screen and (max-height:520px){#wp-link-wrap{transition:none;height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto}#search-panel .query-results{position:static}}@media screen and (max-height:290px){#wp-link-wrap{height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto;height:calc(100% - 92px);padding-bottom:2px}#search-panel .query-results{position:static}}div.wp-link-preview{float:left;margin:5px;max-width:694px;overflow:hidden;text-overflow:ellipsis}div.wp-link-preview a{color:#0073aa;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out;cursor:pointer}div.wp-link-preview a.wplink-url-error{color:#dc3232}div.wp-link-input{float:left;margin:2px;max-width:694px}div.wp-link-input input{width:300px;padding:3px;box-sizing:border-box;line-height:1.28571429;min-height:26px}.mce-toolbar div.wp-link-input~.mce-btn,.mce-toolbar div.wp-link-preview~.mce-btn{margin:2px 1px}.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child{margin-right:2px}.ui-autocomplete.wplink-autocomplete{z-index:100110;max-height:200px;overflow-y:auto;padding:0;margin:0;list-style:none;position:absolute;border:1px solid #5b9dd9;box-shadow:0 1px 2px rgba(30,140,190,.8);background-color:#fff}.ui-autocomplete.wplink-autocomplete li{margin-bottom:0;padding:4px 10px;clear:both;white-space:normal;text-align:left}.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right{float:right}.ui-autocomplete.wplink-autocomplete li.ui-state-focus{background-color:#ddd;cursor:pointer}@media screen and (max-width:782px){div.wp-link-input,div.wp-link-preview{max-width:70%;max-width:calc(100% - 86px)}div.wp-link-preview{margin:8px 0 8px 5px}div.wp-link-input{width:300px}div.wp-link-input input{width:100%;font-size:16px;padding:5px}}.mce-fullscreen{z-index:100010}.rtl .quicktags-toolbar input,.rtl .wp-switch-editor{font-family:Tahoma,sans-serif}.mce-rtl .mce-flow-layout .mce-flow-layout-item>div{direction:rtl}.mce-rtl .mce-listbox i.mce-caret{left:6px}html:lang(he-il) .rtl .quicktags-toolbar input,html:lang(he-il) .rtl .wp-switch-editor{font-family:Arial,sans-serif}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}} \ No newline at end of file diff --git a/wp-includes/css/jquery-ui-dialog-rtl.css b/wp-includes/css/jquery-ui-dialog-rtl.css new file mode 100644 index 0000000..470598a --- /dev/null +++ b/wp-includes/css/jquery-ui-dialog-rtl.css @@ -0,0 +1,361 @@ +/*! This file is auto-generated */ +/*! + * jQuery UI CSS Framework 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/category/theming/ + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-clearfix { + min-height: 0; /* support: IE7 */ +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + right: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; +} + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + right: 0; + width: 100%; + height: 100%; +} + +/*! + * jQuery UI Resizable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + right: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + right: 0; +} +/* rtl:ignore */ +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +/* rtl:ignore */ +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +/* rtl:ignore */ +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +/* rtl:ignore */ +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +/* rtl:ignore */ +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +/* rtl:ignore */ +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} + +/* WP buttons: see buttons.css. */ + +.ui-button { + display: inline-block; + text-decoration: none; + font-size: 13px; + line-height: 2; + height: 28px; + margin: 0; + padding: 0 10px 1px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-sizing: border-box; + color: #555; + border-color: #cccccc; + background: #f7f7f7; + box-shadow: 0 1px 0 #cccccc; + vertical-align: top; +} + +.ui-button:active, +.ui-button:focus { + outline: none; +} + +/* Remove the dotted border on :focus and the extra padding in Firefox */ +.ui-button::-moz-focus-inner { + border-width: 0; + border-style: none; + padding: 0; +} + +.ui-button:hover, +.ui-button:focus { + background: #fafafa; + border-color: #999; + color: #23282d; +} + +.ui-button:focus { + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +.ui-button:active { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); +} + +.ui-button[disabled], +.ui-button:disabled { + color: #a0a5aa !important; + border-color: #ddd !important; + background: #f7f7f7 !important; + box-shadow: none !important; + text-shadow: 0 1px 0 #fff !important; + cursor: default; + transform: none !important; +} + +@media screen and (max-width: 782px) { + + .ui-button { + padding: 6px 14px; + line-height: normal; + font-size: 14px; + vertical-align: middle; + height: auto; + margin-bottom: 4px; + } + +} + +/* WP Theme */ + +.ui-dialog { + position: absolute; + top: 0; + right: 0; + z-index: 100102; + background-color: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + overflow: hidden; +} + +.ui-dialog-titlebar { + background: #fcfcfc; + border-bottom: 1px solid #dfdfdf; + height: 36px; + font-size: 18px; + font-weight: 600; + line-height: 2; + padding: 0 16px 0 36px; +} + +.ui-button.ui-dialog-titlebar-close { + background: none; + border: none; + box-shadow: none; + color: #666; + cursor: pointer; + display: block; + padding: 0; + position: absolute; + top: 0; + left: 0; + width: 36px; + height: 36px; + text-align: center; + border-radius: 0; +} + +.ui-dialog-titlebar-close:before { + font: normal 20px/1 dashicons; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + line-height: 1.8; + width: 36px; + height: 36px; + content: "\f158"; +} + +.ui-button.ui-dialog-titlebar-close:hover, +.ui-button.ui-dialog-titlebar-close:focus { + color: #00a0d2; +} + +.ui-button.ui-dialog-titlebar-close:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +.ui-dialog-titlebar-close .ui-button-text { + display: none; +} + +.ui-dialog-content { + padding: 16px; + overflow: auto; +} + +.ui-dialog-buttonpane { + background: #fcfcfc; + border-top: 1px solid #dfdfdf; + padding: 16px; +} + +.ui-dialog-buttonpane .ui-button { + margin-right: 16px; +} + +.ui-dialog-buttonpane .ui-dialog-buttonset { + float: left; +} + +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} + +.ui-widget-overlay { + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + min-height: 360px; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 100101; +} diff --git a/wp-includes/css/jquery-ui-dialog-rtl.min.css b/wp-includes/css/jquery-ui-dialog-rtl.min.css new file mode 100644 index 0000000..b0b09e4 --- /dev/null +++ b/wp-includes/css/jquery-ui-dialog-rtl.min.css @@ -0,0 +1,18 @@ +/*! This file is auto-generated */ +/*! + * jQuery UI CSS Framework 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/category/theming/ + */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;right:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;right:0;width:100%;height:100%}/*! + * jQuery UI Resizable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;right:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;right:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-button{display:inline-block;text-decoration:none;font-size:13px;line-height:2;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box;color:#555;border-color:#ccc;background:#f7f7f7;box-shadow:0 1px 0 #ccc;vertical-align:top}.ui-button:active,.ui-button:focus{outline:0}.ui-button::-moz-focus-inner{border-width:0;border-style:none;padding:0}.ui-button:focus,.ui-button:hover{background:#fafafa;border-color:#999;color:#23282d}.ui-button:focus{border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}.ui-button:active{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.ui-button:disabled,.ui-button[disabled]{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}@media screen and (max-width:782px){.ui-button{padding:6px 14px;line-height:normal;font-size:14px;vertical-align:middle;height:auto;margin-bottom:4px}}.ui-dialog{position:absolute;top:0;right:0;z-index:100102;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);overflow:hidden}.ui-dialog-titlebar{background:#fcfcfc;border-bottom:1px solid #dfdfdf;height:36px;font-size:18px;font-weight:600;line-height:2;padding:0 16px 0 36px}.ui-button.ui-dialog-titlebar-close{background:0 0;border:none;box-shadow:none;color:#666;cursor:pointer;display:block;padding:0;position:absolute;top:0;left:0;width:36px;height:36px;text-align:center;border-radius:0}.ui-dialog-titlebar-close:before{font:normal 20px/1 dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.8;width:36px;height:36px;content:"\f158"}.ui-button.ui-dialog-titlebar-close:focus,.ui-button.ui-dialog-titlebar-close:hover{color:#00a0d2}.ui-button.ui-dialog-titlebar-close:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:2px solid transparent;outline-offset:-2px}.ui-dialog-titlebar-close .ui-button-text{display:none}.ui-dialog-content{padding:16px;overflow:auto}.ui-dialog-buttonpane{background:#fcfcfc;border-top:1px solid #dfdfdf;padding:16px}.ui-dialog-buttonpane .ui-button{margin-right:16px}.ui-dialog-buttonpane .ui-dialog-buttonset{float:left}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-widget-overlay{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100101} \ No newline at end of file diff --git a/wp-includes/css/jquery-ui-dialog.css b/wp-includes/css/jquery-ui-dialog.css new file mode 100644 index 0000000..5992d79 --- /dev/null +++ b/wp-includes/css/jquery-ui-dialog.css @@ -0,0 +1,360 @@ +/*! + * jQuery UI CSS Framework 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/category/theming/ + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-clearfix { + min-height: 0; /* support: IE7 */ +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; +} + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +/*! + * jQuery UI Resizable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +/* rtl:ignore */ +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +/* rtl:ignore */ +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +/* rtl:ignore */ +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +/* rtl:ignore */ +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +/* rtl:ignore */ +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +/* rtl:ignore */ +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} + +/* WP buttons: see buttons.css. */ + +.ui-button { + display: inline-block; + text-decoration: none; + font-size: 13px; + line-height: 2; + height: 28px; + margin: 0; + padding: 0 10px 1px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-sizing: border-box; + color: #555; + border-color: #cccccc; + background: #f7f7f7; + box-shadow: 0 1px 0 #cccccc; + vertical-align: top; +} + +.ui-button:active, +.ui-button:focus { + outline: none; +} + +/* Remove the dotted border on :focus and the extra padding in Firefox */ +.ui-button::-moz-focus-inner { + border-width: 0; + border-style: none; + padding: 0; +} + +.ui-button:hover, +.ui-button:focus { + background: #fafafa; + border-color: #999; + color: #23282d; +} + +.ui-button:focus { + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +.ui-button:active { + background: #eee; + border-color: #999; + box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5); +} + +.ui-button[disabled], +.ui-button:disabled { + color: #a0a5aa !important; + border-color: #ddd !important; + background: #f7f7f7 !important; + box-shadow: none !important; + text-shadow: 0 1px 0 #fff !important; + cursor: default; + transform: none !important; +} + +@media screen and (max-width: 782px) { + + .ui-button { + padding: 6px 14px; + line-height: normal; + font-size: 14px; + vertical-align: middle; + height: auto; + margin-bottom: 4px; + } + +} + +/* WP Theme */ + +.ui-dialog { + position: absolute; + top: 0; + left: 0; + z-index: 100102; + background-color: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); + overflow: hidden; +} + +.ui-dialog-titlebar { + background: #fcfcfc; + border-bottom: 1px solid #dfdfdf; + height: 36px; + font-size: 18px; + font-weight: 600; + line-height: 2; + padding: 0 36px 0 16px; +} + +.ui-button.ui-dialog-titlebar-close { + background: none; + border: none; + box-shadow: none; + color: #666; + cursor: pointer; + display: block; + padding: 0; + position: absolute; + top: 0; + right: 0; + width: 36px; + height: 36px; + text-align: center; + border-radius: 0; +} + +.ui-dialog-titlebar-close:before { + font: normal 20px/1 dashicons; + vertical-align: top; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + line-height: 1.8; + width: 36px; + height: 36px; + content: "\f158"; +} + +.ui-button.ui-dialog-titlebar-close:hover, +.ui-button.ui-dialog-titlebar-close:focus { + color: #00a0d2; +} + +.ui-button.ui-dialog-titlebar-close:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -2px; +} + +.ui-dialog-titlebar-close .ui-button-text { + display: none; +} + +.ui-dialog-content { + padding: 16px; + overflow: auto; +} + +.ui-dialog-buttonpane { + background: #fcfcfc; + border-top: 1px solid #dfdfdf; + padding: 16px; +} + +.ui-dialog-buttonpane .ui-button { + margin-left: 16px; +} + +.ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} + +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} + +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + min-height: 360px; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 100101; +} diff --git a/wp-includes/css/jquery-ui-dialog.min.css b/wp-includes/css/jquery-ui-dialog.min.css new file mode 100644 index 0000000..75fa498 --- /dev/null +++ b/wp-includes/css/jquery-ui-dialog.min.css @@ -0,0 +1,18 @@ +/*! This file is auto-generated */ +/*! + * jQuery UI CSS Framework 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/category/theming/ + */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}/*! + * jQuery UI Resizable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-button{display:inline-block;text-decoration:none;font-size:13px;line-height:2;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box;color:#555;border-color:#ccc;background:#f7f7f7;box-shadow:0 1px 0 #ccc;vertical-align:top}.ui-button:active,.ui-button:focus{outline:0}.ui-button::-moz-focus-inner{border-width:0;border-style:none;padding:0}.ui-button:focus,.ui-button:hover{background:#fafafa;border-color:#999;color:#23282d}.ui-button:focus{border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}.ui-button:active{background:#eee;border-color:#999;box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.ui-button:disabled,.ui-button[disabled]{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;transform:none!important}@media screen and (max-width:782px){.ui-button{padding:6px 14px;line-height:normal;font-size:14px;vertical-align:middle;height:auto;margin-bottom:4px}}.ui-dialog{position:absolute;top:0;left:0;z-index:100102;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);overflow:hidden}.ui-dialog-titlebar{background:#fcfcfc;border-bottom:1px solid #dfdfdf;height:36px;font-size:18px;font-weight:600;line-height:2;padding:0 36px 0 16px}.ui-button.ui-dialog-titlebar-close{background:0 0;border:none;box-shadow:none;color:#666;cursor:pointer;display:block;padding:0;position:absolute;top:0;right:0;width:36px;height:36px;text-align:center;border-radius:0}.ui-dialog-titlebar-close:before{font:normal 20px/1 dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.8;width:36px;height:36px;content:"\f158"}.ui-button.ui-dialog-titlebar-close:focus,.ui-button.ui-dialog-titlebar-close:hover{color:#00a0d2}.ui-button.ui-dialog-titlebar-close:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:2px solid transparent;outline-offset:-2px}.ui-dialog-titlebar-close .ui-button-text{display:none}.ui-dialog-content{padding:16px;overflow:auto}.ui-dialog-buttonpane{background:#fcfcfc;border-top:1px solid #dfdfdf;padding:16px}.ui-dialog-buttonpane .ui-button{margin-left:16px}.ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-widget-overlay{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100101} \ No newline at end of file diff --git a/wp-includes/css/media-views-rtl.css b/wp-includes/css/media-views-rtl.css new file mode 100644 index 0000000..b5493b1 --- /dev/null +++ b/wp-includes/css/media-views-rtl.css @@ -0,0 +1,2858 @@ +/*! This file is auto-generated */ +/** + * Base Styles + */ +.media-modal * { + box-sizing: content-box; +} + +.media-modal input, +.media-modal select, +.media-modal textarea { + box-sizing: border-box; +} + +.media-modal, +.media-frame { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 12px; + -webkit-overflow-scrolling: touch; +} + +.media-modal legend { + padding: 0; + font-size: 13px; +} + +.media-modal label { + font-size: 13px; +} + +.media-modal .legend-inline { + position: absolute; + transform: translate(100%, 50%); + margin-right: -1%; + line-height: 1.2; +} + +.media-frame a { + border-bottom: none; + color: #0073aa; +} + +.media-frame a:hover, +.media-frame a:active { + color: #00a0d2; +} + +.media-frame a:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + color: #124964; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.media-frame a.button { + color: #32373c; +} + +.media-frame a.button:hover { + color: #23282d; +} + +.media-frame a.button-primary, +.media-frame a.button-primary:hover { + color: #fff; +} + +.media-frame input, +.media-frame textarea { + padding: 6px 8px; +} + +.media-frame select, +.wp-admin .media-frame select { + min-height: 30px; + vertical-align: middle; +} + +.media-frame input[type="text"], +.media-frame input[type="password"], +.media-frame input[type="color"], +.media-frame input[type="date"], +.media-frame input[type="datetime"], +.media-frame input[type="datetime-local"], +.media-frame input[type="email"], +.media-frame input[type="month"], +.media-frame input[type="number"], +.media-frame input[type="search"], +.media-frame input[type="tel"], +.media-frame input[type="time"], +.media-frame input[type="url"], +.media-frame input[type="week"], +.media-frame textarea, +.media-frame select { + box-shadow: 0 0 0 transparent; + border-radius: 4px; + border: 1px solid #7e8993; + background-color: #fff; + color: #32373c; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; +} + +.media-frame input[type="text"], +.media-frame input[type="password"], +.media-frame input[type="date"], +.media-frame input[type="datetime"], +.media-frame input[type="datetime-local"], +.media-frame input[type="email"], +.media-frame input[type="month"], +.media-frame input[type="number"], +.media-frame input[type="search"], +.media-frame input[type="tel"], +.media-frame input[type="time"], +.media-frame input[type="url"], +.media-frame input[type="week"] { + padding: 0 8px; + /* inherits font size 13px */ + line-height: 2.15384615; /* 28px */ +} + +/* Search field in the Media Library toolbar */ +.media-frame.mode-grid .wp-filter input[type="search"] { + font-size: 14px; + line-height: 2; +} + +.media-frame input[type="text"]:focus, +.media-frame input[type="password"]:focus, +.media-frame input[type="number"]:focus, +.media-frame input[type="search"]:focus, +.media-frame input[type="email"]:focus, +.media-frame input[type="url"]:focus, +.media-frame textarea:focus, +.media-frame select:focus { + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; +} + +.media-frame input:disabled, +.media-frame textarea:disabled, +.media-frame input[readonly], +.media-frame textarea[readonly] { + background-color: #eee; +} + +.media-frame input[type="search"] { + -webkit-appearance: textfield; +} + +.media-frame ::-webkit-input-placeholder { + color: #72777c; +} + +.media-frame ::-moz-placeholder { + color: #72777c; + opacity: 1; +} + +.media-frame :-ms-input-placeholder { + color: #72777c; +} + +/* + * In some cases there's the need of higher specificity, + * for example higher than `.media-embed .setting`. + */ +.media-frame .hidden, +.media-frame .setting.hidden { + display: none; +} + +/*! + * jQuery UI Draggable/Sortable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ +.ui-draggable-handle, +.ui-sortable-handle { + touch-action: none; +} + +/** + * Modal + */ +.media-modal { + position: fixed; + top: 30px; + right: 30px; + left: 30px; + bottom: 30px; + z-index: 160000; +} + +.wp-customizer .media-modal { + z-index: 560000; +} + +.media-modal-backdrop { + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + min-height: 360px; + background: #000; + opacity: 0.7; + z-index: 159900; +} + +.wp-customizer .media-modal-backdrop { + z-index: 559900; +} + +.media-modal-close { + position: absolute; + top: 0; + left: 0; + width: 50px; + height: 50px; + margin: 0; + padding: 0; + border: 1px solid transparent; + background: none; + color: #666; + z-index: 1000; + cursor: pointer; + outline: none; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.media-modal-close:hover, +.media-modal-close:active { + color: #00a0d2; +} + +.media-modal-close:focus { + color: #00a0d2; + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.media-modal-close span.media-modal-icon { + background-image: none; +} + +.media-modal-close .media-modal-icon:before { + content: "\f158"; + font: normal 20px/1 dashicons; + speak: none; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.media-modal-content { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + overflow: auto; + min-height: 300px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.7); + background: #fcfcfc; + -webkit-font-smoothing: subpixel-antialiased; +} + +.media-modal-content .media-frame select.attachment-filters { + margin-top: 32px; + margin-left: 2%; + width: 42%; + width: calc(48% - 12px); +} + +.media-modal-content .attachments-browser .search { + width: 100%; +} + +/* higher specificity */ +.wp-core-ui .media-modal-icon { + background-image: url(../images/uploader-icons.png); + background-repeat: no-repeat; +} + +/** + * Toolbar + */ +.media-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 100; + height: 60px; + padding: 0 16px; + border: 0 solid #ddd; + overflow: hidden; +} + +.media-frame-toolbar .media-toolbar { + top: auto; + bottom: -47px; + height: auto; + overflow: visible; + border-top: 1px solid #ddd; +} + +.media-toolbar-primary { + float: left; + height: 100%; + position: relative; +} + +.media-toolbar-secondary { + float: right; + height: 100%; +} + +.media-toolbar-primary > .media-button, +.media-toolbar-primary > .media-button-group { + margin-right: 10px; + float: right; + margin-top: 15px; +} + +.media-toolbar-secondary > .media-button, +.media-toolbar-secondary > .media-button-group { + margin-left: 10px; + margin-top: 15px; +} + +/** + * Sidebar + */ +.media-sidebar { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 267px; + padding: 0 16px; + z-index: 75; + background: #f3f3f3; + border-right: 1px solid #ddd; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +/* + * Implementation of bottom padding in overflow content differs across browsers. + * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129 + */ +.media-sidebar::after { + content: ""; + display: flex; + clear: both; + height: 24px; +} + +.hide-toolbar .media-sidebar { + bottom: 0; +} + +.media-sidebar h2, +.image-details h2 { + position: relative; + font-weight: 600; + text-transform: uppercase; + font-size: 12px; + color: #666; + margin: 24px 0 8px; +} + +.media-sidebar .setting, +.attachment-details .setting { + display: block; + float: right; + width: 100%; + margin: 0 0 10px; +} + +.media-sidebar .collection-settings .setting { + margin: 1px 0; +} + +.media-sidebar .setting.has-description, +.attachment-details .setting.has-description { + margin-bottom: 5px; +} + +.media-sidebar .setting .link-to-custom { + margin: 3px 2px 0; +} + +.media-sidebar .setting span, /* Back-compat for pre-5.3 */ +.attachment-details .setting span, /* Back-compat for pre-5.3 */ +.media-sidebar .setting .name, +.media-sidebar .setting .value, +.attachment-details .setting .name { + min-width: 30%; + margin-left: 4%; + font-size: 12px; + text-align: left; + word-wrap: break-word; +} + +.media-sidebar .setting .name { + max-width: 80px; +} + +.media-sidebar .setting .value { + text-align: right; +} + +.media-sidebar .setting select { + max-width: 65%; +} + +.media-sidebar .setting input[type="checkbox"], +.media-sidebar .field input[type="checkbox"], +.media-sidebar .setting input[type="radio"], +.media-sidebar .field input[type="radio"], +.attachment-details .setting input[type="checkbox"], +.attachment-details .field input[type="checkbox"], +.attachment-details .setting input[type="radio"], +.attachment-details .field input[type="radio"] { + float: none; + margin: 8px 3px 0; + padding: 0; +} + +.media-sidebar .setting span, /* Back-compat for pre-5.3 */ +.attachment-details .setting span, /* Back-compat for pre-5.3 */ +.media-sidebar .setting .name, +.media-sidebar .setting .value, +.media-sidebar .checkbox-label-inline, +.attachment-details .setting .name, +.attachment-details .setting .value, +.compat-item label span { + float: right; + min-height: 22px; + padding-top: 8px; + line-height: 1.33333333; + font-weight: 400; + color: #666; +} + +.media-sidebar .checkbox-label-inline { + font-size: 12px; +} + +.compat-item label span { + text-align: left; +} + +.media-sidebar .setting input[type="text"], +.media-sidebar .setting input[type="password"], +.media-sidebar .setting input[type="email"], +.media-sidebar .setting input[type="number"], +.media-sidebar .setting input[type="search"], +.media-sidebar .setting input[type="tel"], +.media-sidebar .setting input[type="url"], +.media-sidebar .setting textarea, +.media-sidebar .setting .value, +.attachment-details .setting input[type="text"], +.attachment-details .setting input[type="password"], +.attachment-details .setting input[type="email"], +.attachment-details .setting input[type="number"], +.attachment-details .setting input[type="search"], +.attachment-details .setting input[type="tel"], +.attachment-details .setting input[type="url"], +.attachment-details .setting textarea, +.attachment-details .setting .value, +.attachment-details .setting + .description { + box-sizing: border-box; + margin: 1px; + width: 65%; + float: left; +} + +.media-sidebar .setting .value, +.attachment-details .setting .value, +.attachment-details .setting + .description { + margin: 0 1px; + text-align: right; +} + +.attachment-details .setting + .description { + clear: both; + font-size: 12px; + font-style: normal; + margin-bottom: 10px; +} + +.media-sidebar .setting textarea, +.attachment-details .setting textarea, +.compat-item .field textarea { + height: 62px; + resize: vertical; +} + +.compat-item { + float: right; + width: 100%; + overflow: hidden; +} + +.compat-item table { + width: 100%; + table-layout: fixed; + border-spacing: 0; + border: 0; +} + +.compat-item tr { + padding: 2px 0; + display: block; + overflow: hidden; +} + +.compat-item .label, +.compat-item .field { + display: block; + margin: 0; + padding: 0; +} + +.compat-item .label { + min-width: 30%; + margin-left: 4%; + float: right; + text-align: left; +} + +.compat-item .label span { + display: block; + width: 100%; +} + +.compat-item .field { + float: left; + width: 65%; + margin: 1px; +} + +.compat-item .field input[type="text"], +.compat-item .field input[type="password"], +.compat-item .field input[type="email"], +.compat-item .field input[type="number"], +.compat-item .field input[type="search"], +.compat-item .field input[type="tel"], +.compat-item .field input[type="url"], +.compat-item .field textarea { + width: 100%; + margin: 0; + box-sizing: border-box; +} + +.sidebar-for-errors .attachment-details, +.sidebar-for-errors .compat-item, +.sidebar-for-errors .media-sidebar .media-progress-bar, +.sidebar-for-errors .upload-details { + display: none !important; +} + +/** + * Menu + */ +.media-menu { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + margin: 0; + padding: 50px 0 10px; + background: #f3f3f3; + border-left-width: 1px; + border-left-style: solid; + border-left-color: #ccc; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.media-menu .media-menu-item { + display: block; + box-sizing: border-box; + width: 100%; + position: relative; + border: 0; + margin: 0; + padding: 8px 20px; + font-size: 14px; + line-height: 1.28571428; + background: transparent; + color: #0073aa; + text-align: right; + text-decoration: none; + cursor: pointer; +} + +.media-menu .media-menu-item:hover { + background: rgba(0, 0, 0, 0.04); +} + +.media-menu .media-menu-item:active { + color: #0073aa; + outline: none; +} + +.media-menu .active, +.media-menu .active:hover { + color: #23282d; + font-weight: 600; +} + +.media-menu .media-menu-item:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + color: #124964; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.media-menu .separator { + height: 0; + margin: 12px 20px; + padding: 0; + border-top: 1px solid #ddd; +} + +/** + * Menu + */ +.media-router { + position: relative; + padding: 0 6px; + margin: 0; + clear: both; +} + +.media-router .media-menu-item { + position: relative; + float: right; + border: 0; + margin: 0; + padding: 8px 10px 9px; + height: 18px; + line-height: 1.28571428; + font-size: 14px; + text-decoration: none; + background: transparent; + cursor: pointer; + transition: none; +} + +.media-router .media-menu-item:last-child { + border-left: 0; +} + +.media-router .media-menu-item:hover, +.media-router .media-menu-item:active { + color: #0073aa; +} + +.media-router .active, +.media-router .active:hover { + color: #23282d; +} + +.media-router .media-menu-item:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + color: #124964; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.media-router .active, +.media-router .media-menu-item.active:last-child { + margin: -1px -1px 0; + background: #fff; + border: 1px solid #ddd; + border-bottom: none; +} + +.media-router .active:after { + display: none; +} + +/** + * Frame + */ +.media-frame { + overflow: hidden; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; +} + +.media-frame-menu { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 200px; + z-index: 150; +} + +.media-frame-title { + position: absolute; + top: 0; + right: 200px; + left: 0; + height: 50px; + z-index: 200; +} + +.media-frame-router { + position: absolute; + top: 50px; + right: 200px; + left: 0; + height: 36px; + z-index: 200; +} + +.media-frame-content { + position: absolute; + top: 84px; + right: 200px; + left: 0; + bottom: 61px; + height: auto; + width: auto; + margin: 0; + overflow: auto; + background: #fff; + border-top: 1px solid #ddd; +} + +.media-frame-toolbar { + position: absolute; + right: 200px; + left: 0; + z-index: 100; + bottom: 60px; + height: auto; +} + +.media-frame.hide-menu .media-frame-title, +.media-frame.hide-menu .media-frame-router, +.media-frame.hide-menu .media-frame-toolbar, +.media-frame.hide-menu .media-frame-content { + right: 0; +} + +.media-frame.hide-toolbar .media-frame-content { + bottom: 0; +} + +.media-frame.hide-router .media-frame-content { + top: 50px; +} + +.media-frame.hide-menu .media-frame-menu, +.media-frame.hide-menu .media-frame-menu-heading, +.media-frame.hide-router .media-frame-router, +.media-frame.hide-toolbar .media-frame-toolbar { + display: none; +} + +.media-frame-title h1 { + padding: 0 16px; + font-size: 22px; + line-height: 2.27272727; + margin: 0; +} + +.media-frame-menu-heading, +.media-attachments-filter-heading { + position: absolute; + right: 20px; + top: 22px; + margin: 0; + font-size: 13px; + line-height: 1; + /* Above the media-frame-menu. */ + z-index: 151; +} + +.media-attachments-filter-heading { + top: 10px; + right: 16px; +} + +.mode-grid .media-attachments-filter-heading { + top: 0; + right: -9999px; +} + +.mode-grid .media-frame-actions-heading { + display: none; +} + +.wp-core-ui .button.media-frame-menu-toggle { + display: none; +} + +.media-frame-title .suggested-dimensions { + font-size: 14px; + float: left; + margin-left: 20px; +} + +.media-frame-content .crop-content { + height: 100%; +} + +.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon { + margin-left: 300px; +} + +.media-frame-content .crop-content .crop-image { + display: block; + margin: auto; + max-width: 100%; + max-height: 100%; +} + +.media-frame-content .crop-content .upload-errors { + position: absolute; + width: 300px; + top: 50%; + right: 50%; + margin-right: -150px; + margin-left: -150px; + z-index: 600000; +} + +/** + * Iframes + */ +.media-frame .media-iframe { + overflow: hidden; +} + +.media-frame .media-iframe, +.media-frame .media-iframe iframe { + height: 100%; + width: 100%; + border: 0; +} + +/** + * Attachment Browser Filters + */ +.media-frame select.attachment-filters { + margin-top: 11px; + margin-left: 2%; + max-width: 42%; + max-width: calc(48% - 12px); +} + +.media-frame select.attachment-filters:last-of-type { + margin-left: 0; + width: auto; + max-width: 100%; +} + +/** + * Search + */ +.media-frame .search { + margin: 32px 0 0; + padding: 4px; + font-size: 13px; + color: #444; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + -webkit-appearance: none; +} + +.media-toolbar-primary .search { + max-width: 100%; +} + +.media-frame .media-search-input-label { + position: absolute; + right: 0; + top: 10px; + margin: 0; + line-height: 1; +} + +/** + * Attachments + */ +.wp-core-ui .attachments { + margin: 0; + -webkit-overflow-scrolling: touch; +} + +/** + * Attachment + */ +.wp-core-ui .attachment { + position: relative; + float: right; + padding: 8px; + margin: 0; + color: #444; + cursor: pointer; + list-style: none; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 25%; + box-sizing: border-box; +} + +.wp-core-ui .attachment:focus, +.wp-core-ui .selected.attachment:focus, +.wp-core-ui .attachment.details:focus { + box-shadow: + inset 0 0 2px 3px #fff, + inset 0 0 0 7px #5b9dd9; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -6px; +} + +.wp-core-ui .selected.attachment { + box-shadow: + inset 0 0 0 5px #fff, + inset 0 0 0 7px #ccc; +} + +.wp-core-ui .attachment.details { + box-shadow: + inset 0 0 0 3px #fff, + inset 0 0 0 7px #0073aa; +} + +.wp-core-ui .attachment-preview { + position: relative; + box-shadow: + inset 0 0 15px rgba(0, 0, 0, 0.1), + inset 0 0 0 1px rgba(0, 0, 0, 0.05); + background: #eee; + cursor: pointer; +} + +.wp-core-ui .attachment-preview:before { + content: ""; + display: block; + padding-top: 100%; +} + +.wp-core-ui .attachment .icon { + margin: 0 auto; + overflow: hidden; +} + +.wp-core-ui .attachment .thumbnail { + overflow: hidden; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + opacity: 1; + transition: opacity .1s; +} + +.wp-core-ui .attachment .portrait img { + max-width: 100%; +} + +.wp-core-ui .attachment .landscape img { + max-height: 100%; +} + +.wp-core-ui .attachment .thumbnail:after { + content: ""; + display: block; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.wp-core-ui .attachment .thumbnail img { + top: 0; + right: 0; +} + +.wp-core-ui .attachment .thumbnail .centered { + position: absolute; + top: 0; + right: 0; + width: 100%; + height: 100%; + transform: translate( -50%, 50% ); +} + +.wp-core-ui .attachment .thumbnail .centered img { + transform: translate( 50%, -50% ); +} + +.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon { + transform: translate( 50%, -70% ); +} + +.wp-core-ui .attachment .filename { + position: absolute; + right: 0; + left: 0; + bottom: 0; + overflow: hidden; + max-height: 100%; + word-wrap: break-word; + text-align: center; + font-weight: 600; + background: rgba(255, 255, 255, 0.8); + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15); +} + +.wp-core-ui .attachment .filename div { + padding: 5px 10px; +} + +.wp-core-ui .attachment .thumbnail img { + position: absolute; +} + +.wp-core-ui .attachment-close { + display: block; + position: absolute; + top: 5px; + left: 5px; + height: 22px; + width: 22px; + padding: 0; + background-color: #fff; + background-position: -96px 4px; + border-radius: 3px; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3); + transition: none; +} + +.wp-core-ui .attachment-close:hover, +.wp-core-ui .attachment-close:focus { + background-position: -36px 4px; +} + +.wp-core-ui .attachment .check { + display: none; + height: 24px; + width: 24px; + padding: 0; + border: 0; + position: absolute; + z-index: 10; + top: 0; + left: 0; + outline: none; + background: #eee; + cursor: pointer; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba(0, 0, 0, 0.15); +} + +.wp-core-ui .attachment .check .media-modal-icon { + display: block; + background-position: -1px 0; + height: 15px; + width: 15px; + margin: 5px; +} + +.wp-core-ui .attachment .check:hover .media-modal-icon { + background-position: -40px 0; +} + +.wp-core-ui .attachment.selected .check { + display: block; +} + +.wp-core-ui .attachment.details .check, +.wp-core-ui .attachment.selected .check:focus, +.wp-core-ui .media-frame.mode-grid .attachment.selected .check { + background-color: #0073aa; + box-shadow: + 0 0 0 1px #fff, + 0 0 0 2px #0073aa; +} + +.wp-core-ui .attachment.selected .check:focus { + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.wp-core-ui .attachment.details .check .media-modal-icon, +.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon { + background-position: -21px 0; +} + +.wp-core-ui .attachment.details .check:hover .media-modal-icon, +.wp-core-ui .attachment.selected .check:focus .media-modal-icon, +.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon { + background-position: -60px 0; +} + +.wp-core-ui .media-frame .attachment .describe { + position: relative; + display: block; + width: 100%; + margin: 0; + padding: 0 8px; + font-size: 12px; + border-radius: 0; +} + +/** + * Attachments Browser + */ +.media-frame .attachments-browser { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; +} + +.attachments-browser .media-toolbar { + left: 300px; + height: 72px; + background: #fff; +} + +.attachments-browser.hide-sidebar .media-toolbar { + left: 0; +} + +.attachments-browser .media-toolbar-primary > .media-button, +.attachments-browser .media-toolbar-primary > .media-button-group, +.attachments-browser .media-toolbar-secondary > .media-button, +.attachments-browser .media-toolbar-secondary > .media-button-group { + margin: 10px 0; +} + +.attachments-browser .attachments { + padding: 2px 8px 8px; +} + +.attachments-browser .attachments, +.attachments-browser .uploader-inline { + position: absolute; + top: 72px; + right: 0; + left: 300px; + bottom: 0; + overflow: auto; + outline: none; +} + +.attachments-browser .uploader-inline.hidden { + display: none; +} + +.attachments-browser .media-toolbar-primary { + max-width: 33%; +} + +.mode-grid .attachments-browser .media-toolbar-primary { + display: flex; + align-items: center; +} + +.mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary { + display: none; +} + +.attachments-browser .media-toolbar-secondary { + max-width: 66%; +} + +.uploader-inline .close { + background-color: transparent; + border: 0; + cursor: pointer; + height: 48px; + outline: none; + padding: 0; + position: absolute; + left: 2px; + text-align: center; + top: 2px; + width: 48px; + z-index: 1; +} + +.uploader-inline .close:before { + font: normal 30px/1 dashicons !important; + color: #555d66; + display: inline-block; + content: "\f335"; + font-weight: 300; + margin-top: 1px; +} + +.uploader-inline .close:focus { + outline: 1px solid #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +.attachments-browser.hide-sidebar .attachments, +.attachments-browser.hide-sidebar .uploader-inline { + left: 0; + margin-left: 0; +} + +.attachments-browser .instructions { + display: inline-block; + margin-top: 16px; + line-height: 1.38461538; + font-size: 13px; + color: #666; +} + +.attachments-browser .no-media { + padding: 2em 2em 0 0; +} + +/** + * Progress Bar + */ +.media-progress-bar { + position: relative; + height: 10px; + width: 70%; + margin: 10px auto; + border-radius: 10px; + background: #ddd; + background: rgba(0, 0, 0, 0.1); +} + +.media-progress-bar div { + height: 10px; + min-width: 20px; + width: 0; + background: #0073aa; + border-radius: 10px; + transition: width 300ms; +} + +.media-uploader-status .media-progress-bar { + display: none; + width: 100%; +} + +.uploading.media-uploader-status .media-progress-bar { + display: block; +} + +.attachment-preview .media-progress-bar { + position: absolute; + top: 50%; + right: 15%; + width: 70%; + margin: -5px 0 0 0; +} + +.media-uploader-status { + position: relative; + margin: 0 auto; + padding-bottom: 10px; + max-width: 400px; +} + +.uploader-inline .media-uploader-status h2 { + display: none; +} + +.media-uploader-status .upload-details { + display: none; + font-size: 12px; + color: #666; +} + +.uploading.media-uploader-status .upload-details { + display: block; +} + +.media-uploader-status .upload-detail-separator { + padding: 0 4px; +} + +.media-uploader-status .upload-count { + color: #444; +} + +.media-uploader-status .upload-dismiss-errors, +.media-uploader-status .upload-errors { + display: none; +} + +.errors.media-uploader-status .upload-dismiss-errors, +.errors.media-uploader-status .upload-errors { + display: block; +} + +.media-uploader-status .upload-dismiss-errors { + position: absolute; + top: -3px; + left: -5px; + padding: 5px; + border-radius: 50%; + transition: none; + text-decoration: none; +} + +.uploader-inline .media-uploader-status .upload-dismiss-errors { + top: 2px; + left: 2px; +} + +.media-uploader-status .upload-dismiss-errors::before { + content: "\f153"; + display: block; + font: normal 16px/1 dashicons; + color: #72777c; +} + +.uploader-inline .errors.media-uploader-status .upload-dismiss-errors::before { + color: #606a73; +} + +.errors.media-uploader-status .upload-dismiss-errors:hover::before, +.errors.media-uploader-status .upload-dismiss-errors:focus::before { + color: #c00; +} + +.upload-errors .upload-error { + padding: 12px; + margin-bottom: 12px; + background: #fff; + border-right: 4px solid #dc3232; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); +} + +.uploader-inline .upload-errors .upload-error { + padding: 12px 30px; + background-color: #fbeaea; + box-shadow: none; +} + +.upload-errors .upload-error-filename { + font-weight: 600; +} + +.upload-errors .upload-error-message { + display: block; + padding-top: 8px; + word-wrap: break-word; +} + +/** + * Window and Editor uploaders used to display "drop zones" + */ +.uploader-window, +.wp-editor-wrap .uploader-editor { + top: 0; + right: 0; + left: 0; + bottom: 0; + text-align: center; + display: none; +} + +.uploader-window { + position: fixed; + z-index: 250000; + opacity: 0; /* Only the inline uploader is animated with JS, the editor one isn't */ + transition: opacity 250ms; +} + +.wp-editor-wrap .uploader-editor { + position: absolute; + z-index: 99998; /* under the toolbar */ + background: rgba(150, 150, 150, 0.9); +} + +.uploader-window, +.wp-editor-wrap .uploader-editor.droppable { + background: rgba(0, 86, 132, 0.9); +} + +.uploader-window-content, +.wp-editor-wrap .uploader-editor-content { + position: absolute; + top: 10px; + right: 10px; + left: 10px; + bottom: 10px; + border: 1px dashed #fff; +} + +/* uploader drop-zone title */ +.uploader-window h1, /* Back-compat for pre-5.3 */ +.uploader-window .uploader-editor-title, +.wp-editor-wrap .uploader-editor .uploader-editor-title { + position: absolute; + top: 50%; + right: 0; + left: 0; + transform: translateY(-50%); + font-size: 3em; + line-height: 1.3; + font-weight: 600; + color: #fff; + margin: 0; + padding: 0 10px; +} + +.wp-editor-wrap .uploader-editor .uploader-editor-title { + display: none; +} + +.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title { + display: block; +} + +.uploader-window .media-progress-bar { + margin-top: 20px; + max-width: 300px; + background: transparent; + border-color: #fff; + display: none; +} + +.uploader-window .media-progress-bar div { + background: #fff; +} + +.uploading .uploader-window .media-progress-bar { + display: block; +} + +.media-frame .uploader-inline { + margin-bottom: 20px; + padding: 0; + text-align: center; +} + +.uploader-inline-content { + position: absolute; + top: 30%; + right: 0; + left: 0; +} + +.uploader-inline-content .upload-ui { + margin: 2em 0; +} + +.uploader-inline-content .post-upload-ui { + margin-bottom: 2em; +} + +.uploader-inline .has-upload-message .upload-ui { + margin: 0 0 4em; +} + +.uploader-inline h2 { + font-size: 20px; + line-height: 1.4; + font-weight: 400; + margin: 0; +} + +.uploader-inline .has-upload-message .upload-instructions { + font-size: 14px; + color: #444; + font-weight: 400; +} + +.uploader-inline .drop-instructions { + display: none; +} + +.supports-drag-drop .uploader-inline .drop-instructions { + display: block; +} + +.uploader-inline p { + margin: 0.5em 0; +} + +.uploader-inline .media-progress-bar { + display: none; +} + +.uploading.uploader-inline .media-progress-bar { + display: block; +} + +.uploader-inline .browser { + display: inline-block !important; +} + +/** + * Selection + */ +.media-selection { + position: absolute; + top: 0; + right: 0; + left: 350px; + height: 60px; + padding: 0 16px 0 0; + overflow: hidden; + white-space: nowrap; +} + +.media-selection .selection-info { + display: inline-block; + font-size: 12px; + height: 60px; + margin-left: 10px; + vertical-align: top; +} + +.media-selection.empty, +.media-selection.editing { + display: none; +} + +.media-selection.one .edit-selection { + display: none; +} + +.media-selection .count { + display: block; + padding-top: 12px; + font-size: 14px; + line-height: 1.42857142; + font-weight: 600; +} + +.media-selection .button-link { + float: right; + padding: 1px 8px; + margin: 1px -8px 1px 8px; + line-height: 1.4; + border-left: 1px solid #ddd; + color: #0073aa; + text-decoration: none; +} + +.media-selection .button-link:hover, +.media-selection .button-link:focus { + color: #00a0d2; +} + +.media-selection .button-link:last-child { + border-left: 0; + margin-left: 0; +} + +.selection-info .clear-selection { + color: #bc0b0b; +} + +.selection-info .clear-selection:hover, +.selection-info .clear-selection:focus { + color: #dc3232; +} + +.media-selection .selection-view { + display: inline-block; + vertical-align: top; +} + +.media-selection .attachments { + display: inline-block; + height: 48px; + margin: 6px; + padding: 0; + overflow: hidden; + vertical-align: top; +} + +.media-selection .attachment { + width: 40px; + padding: 0; + margin: 4px; +} + +.media-selection .attachment .thumbnail { + top: 0; + left: 0; + bottom: 0; + right: 0; +} + +.media-selection .attachment .icon { + width: 50%; +} + +.media-selection .attachment-preview { + box-shadow: none; + background: none; +} + +.wp-core-ui .media-selection .attachment:focus, +.wp-core-ui .media-selection .selected.attachment:focus, +.wp-core-ui .media-selection .attachment.details:focus { + box-shadow: + 0 0 0 1px #fff, + 0 0 2px 3px #5b9dd9; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.wp-core-ui .media-selection .selected.attachment { + box-shadow: none; +} + +.wp-core-ui .media-selection .attachment.details { + box-shadow: + 0 0 0 1px #fff, + 0 0 0 3px #0073aa; +} + +.media-selection:after { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 25px; + background-image: linear-gradient(to right, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)); +} + +.media-selection .attachment .filename { + display: none; +} + +/** + * Spinner + */ +.media-frame .spinner { + background: url(../images/spinner.gif) no-repeat; + background-size: 20px 20px; + float: left; + display: inline-block; + visibility: hidden; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 0; + vertical-align: middle; +} + +.media-frame.mode-grid .spinner { + margin: 0; + float: none; + vertical-align: middle; +} + +.media-modal .media-toolbar .spinner { + float: none; + vertical-align: bottom; + margin: 0 5px 5px 0; +} + +.media-frame .instructions + .spinner.is-active { + vertical-align: middle; +} + +.media-frame .spinner.is-active { + visibility: visible; +} + +/** + * Attachment Details + */ +.attachment-details { + position: relative; + overflow: auto; +} + +.attachment-details .settings-save-status { + float: left; + text-transform: none; + font-weight: 400; +} + +.attachment-details .settings-save-status .spinner { + float: none; + margin-right: 5px; +} + +.attachment-details .settings-save-status .saved { + display: none; +} + +.attachment-details.save-waiting .settings-save-status .spinner { + visibility: visible; +} + +.attachment-details.save-complete .settings-save-status .saved { + display: inline-block; +} + +.attachment-info { + overflow: hidden; + min-height: 60px; + margin-bottom: 16px; + line-height: 1.5; + color: #666; + border-bottom: 1px solid #ddd; + padding-bottom: 11px; +} + +.attachment-info .filename { + font-weight: 600; + color: #444; + word-wrap: break-word; +} + +.attachment-info .thumbnail { + position: relative; + float: right; + max-width: 120px; + max-height: 120px; + margin-top: 5px; + margin-left: 10px; + margin-bottom: 5px; +} + +.uploading .attachment-info .thumbnail { + width: 120px; + height: 80px; + box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1); +} + +.uploading .attachment-info .media-progress-bar { + margin-top: 35px; +} + +.attachment-info .thumbnail-image:after { + content: ""; + display: block; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15); + overflow: hidden; +} + +.attachment-info .thumbnail img { + display: block; + max-width: 120px; + max-height: 120px; + margin: 0 auto; +} + +.attachment-info .details { + float: right; + font-size: 12px; + max-width: 100%; +} + +.attachment-info .edit-attachment, +.attachment-info .delete-attachment, +.attachment-info .trash-attachment, +.attachment-info .untrash-attachment { + display: block; + text-decoration: none; + white-space: nowrap; +} + +.attachment-details.needs-refresh .attachment-info .edit-attachment { + display: none; +} + +.attachment-info .edit-attachment { + display: block; +} + +.media-modal .delete-attachment, +.media-modal .trash-attachment, +.media-modal .untrash-attachment { + display: inline; + padding: 0; + color: #bc0b0b; +} + +.media-modal .delete-attachment:hover, +.media-modal .delete-attachment:focus, +.media-modal .trash-attachment:hover, +.media-modal .trash-attachment:focus, +.media-modal .untrash-attachment:hover, +.media-modal .untrash-attachment:focus { + color: #dc3232; +} + +/** + * Attachment Display Settings + */ +.attachment-display-settings { + width: 100%; + float: right; + overflow: hidden; +} + +.collection-settings { + overflow: hidden; +} + +.collection-settings .setting input[type="checkbox"] { + float: right; + margin-left: 8px; +} + +.collection-settings .setting span, /* Back-compat for pre-5.3 */ +.collection-settings .setting .name { + min-width: inherit; +} + +/** + * Image Editor + */ +.media-modal .imgedit-wrap { + position: static; +} + +.media-modal .imgedit-wrap .imgedit-panel-content { + padding: 16px 16px 0 16px; + position: absolute; + top: 0; + left: 282px; + bottom: 0; + right: 0; + overflow: auto; +} + +/* + * Implementation of bottom padding in overflow content differs across browsers. + * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129 + */ +.media-modal .imgedit-wrap .imgedit-submit { + margin-bottom: 16px; +} + +.media-modal .imgedit-wrap .imgedit-settings { + background: #f3f3f3; + border-right: 1px solid #ddd; + padding: 20px 16px 0; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 250px; + overflow: auto; +} + +/* + * Implementation of bottom padding in overflow content differs across browsers. + * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129 + */ +.media-modal .imgedit-wrap .imgedit-save-target { + margin: 8px 0 24px; +} + +.media-modal .imgedit-group { + background: none; + border: none; + border-bottom: 1px solid #ddd; + box-shadow: none; + margin: 0; + margin-bottom: 16px; + padding: 0; + padding-bottom: 16px; + position: relative; /* RTL fix, #WP29352 */ +} + +.media-modal .imgedit-group:last-of-type { + border: none; + margin: 0; + padding: 0; +} + +.media-modal .imgedit-group-top { + margin: 0; +} + +.media-modal .imgedit-group-top h2, +.media-modal .imgedit-group-top h2 .button-link { + display: inline-block; + text-transform: uppercase; + font-size: 12px; + color: #666; + margin: 0; + margin-top: 3px; +} + +.media-modal .imgedit-group-top h2 a, +.media-modal .imgedit-group-top h2 .button-link { + text-decoration: none; + color: #666; +} + +/* higher specificity than media.css */ +.wp-core-ui.media-modal .image-editor .imgedit-help-toggle, +.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover, +.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active { + border: 1px solid transparent; + margin: 0; + padding: 0; + background: transparent; + color: #0074a2; + font-size: 20px; + line-height: 1; + cursor: pointer; + box-sizing: content-box; + box-shadow: none; +} + +.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus { + color: #0074a2; + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle { + margin-top: -3px; +} + +.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle { + margin-top: -2px; +} + +.media-modal .imgedit-help-toggled span.dashicons:before { + content: "\f142"; +} + +.media-modal .imgedit-thumbnail-preview { + margin: 10px 0 0 8px; +} + +.imgedit-thumbnail-preview-caption { + display: block; +} + +.media-modal .imgedit-wrap div.updated { + margin: 0; + margin-bottom: 16px; +} + +/** + * Embed from URL and Image Details + */ +.embed-url { + display: block; + position: relative; + padding: 16px; + margin: 0; + z-index: 250; + background: #fff; + font-size: 18px; +} + +.media-frame .embed-url input { + font-size: 18px; + line-height: 1.22222222; /* 22px */ + padding: 12px 14px 12px 40px; /* right padding to leave room for the spinner */ + width: 100%; + min-width: 200px; + box-shadow: inset -2px 2px 4px -2px rgba(0, 0, 0, 0.1); +} + +.media-frame .embed-url input::-ms-clear { + display: none; /* the "x" in IE 11 conflicts with the spinner */ +} + +.media-frame .embed-url .spinner { + position: absolute; + top: 32px; + left: 26px; +} + +.media-frame .embed-loading .embed-url .spinner { + visibility: visible; +} + +.embed-link-settings, +.embed-media-settings { + position: absolute; + top: 70px; + right: 0; + left: 0; + bottom: 0; + padding: 0 16px; + overflow: auto; +} + +/* + * Implementation of bottom padding in overflow content differs across browsers. + * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129 + */ +.embed-link-settings::after, +.embed-media-settings::after { + content: ""; + display: flex; + clear: both; + height: 24px; +} + +.media-embed .embed-link-settings { + /* avoid Firefox to give focus to the embed preview container parent */ + overflow: visible; +} + +.embed-preview img, +.embed-preview iframe, +.embed-preview embed, +.mejs-container video { + max-width: 100%; + vertical-align: middle; +} + +.embed-preview a { + display: inline-block; +} + +.embed-preview img { + display: block; + height: auto; +} + +.mejs-container:focus { + outline: 1px solid #5b9dd9; + box-shadow: 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.image-details .media-modal { + right: 140px; + left: 140px; +} + +.image-details .media-frame-title, +.image-details .media-frame-content, +.image-details .media-frame-router { + right: 0; +} + +.image-details .embed-media-settings { + top: 0; + overflow: visible; + padding: 0; +} + +.image-details .embed-media-settings::after { + content: none; +} + +.image-details .embed-media-settings, +.image-details .embed-media-settings div { + box-sizing: border-box; +} + +.image-details .column-settings { + background: #f3f3f3; + border-left: 1px solid #ddd; + min-height: 100%; + width: 55%; + position: absolute; + top: 0; + right: 0; +} + +.image-details .column-settings h2 { + margin: 20px; + padding-top: 20px; + border-top: 1px solid #ddd; + color: #23282d; +} + +.image-details .column-image { + width: 45%; + position: absolute; + right: 55%; + top: 0; +} + +.image-details .image { + margin: 20px; +} + +.image-details .image img { + max-width: 100%; + max-height: 500px; +} + +.image-details .advanced-toggle { + padding: 0; + color: #666; + text-transform: uppercase; + text-decoration: none; +} + +.image-details .advanced-toggle:hover, +.image-details .advanced-toggle:active { + color: #666; +} + +.image-details .advanced-toggle:after { + font: normal 20px/1 dashicons; + speak: none; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\f140"; + display: inline-block; + margin-top: -2px; +} + +.image-details .advanced-visible .advanced-toggle:after { + content: "\f142"; +} + +.image-details .custom-size label, /* Back-compat for pre-5.3 */ +.image-details .custom-size .custom-size-setting { + display: block; + float: right; +} + +.image-details .custom-size .custom-size-setting label { + float: none; +} + +.image-details .custom-size input { + width: 5em; +} + +.image-details .custom-size .sep { + float: right; + margin: 26px 6px 0 6px; +} + +.image-details .custom-size .description { + margin-right: 0; +} + +.media-embed .thumbnail { + max-width: 100%; + max-height: 200px; + position: relative; + float: right; +} + +.media-embed .thumbnail img { + max-height: 200px; + display: block; +} + +.media-embed .thumbnail:after { + content: ""; + display: block; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.media-embed .setting, +.media-embed .setting-group { + width: 100%; + margin: 10px 0; + float: right; + display: block; + clear: both; +} + +.media-embed .setting-group .setting:not(.checkbox-setting) { + margin: 0; +} + +.media-embed .setting.has-description { + margin-bottom: 5px; +} + +.media-embed .description { + clear: both; + font-style: normal; +} + +.media-embed .content-track + .description { + line-height: 1.4; + /* The !important needs to override a high specificity selector from wp-medialement.css */ + max-width: none !important; +} + +.media-embed .remove-track { + margin-bottom: 10px; +} + +.image-details .embed-media-settings .setting, +.image-details .embed-media-settings .setting-group { + float: none; + width: auto; +} + +.image-details .actions { + margin: 10px 0; +} + +.image-details .hidden { + display: none; +} + +.media-embed .setting input[type="text"], +.media-embed .setting textarea, +.media-embed fieldset { + display: block; + width: 100%; + max-width: 400px; +} + +.image-details .embed-media-settings .setting input[type="text"], +.image-details .embed-media-settings .setting textarea { + max-width: inherit; + width: 70%; +} + +.image-details .embed-media-settings .setting input.link-to-custom, +.image-details .embed-media-settings .link-target, +.image-details .embed-media-settings .custom-size, +.image-details .embed-media-settings .setting-group, +.image-details .description { + margin-right: 27%; + width: 70%; +} + +.image-details .description { + font-style: normal; + margin-top: 0; +} + +.image-details .embed-media-settings .link-target { + margin-top: 16px; +} + +.image-details .checkbox-label, +.audio-details .checkbox-label, +.video-details .checkbox-label { + vertical-align: baseline; +} + +.media-embed .setting input.hidden, +.media-embed .setting textarea.hidden { + display: none; +} + +.media-embed .setting span, /* Back-compat for pre-5.3 */ +.media-embed .setting .name, +.media-embed .setting-group .name { + display: inline-block; + font-size: 13px; + line-height: 1.84615384; + color: #666; +} + +.media-embed .setting span { + display: block; /* Back-compat for pre-5.3 */ + width: 200px; /* Back-compat for pre-5.3 */ +} + +.image-details .embed-media-settings .setting span, /* Back-compat for pre-5.3 */ +.image-details .embed-media-settings .setting .name { + float: right; + width: 25%; + text-align: left; + margin: 8px 1% 0 1%; + line-height: 1.1; +} + +/* Buttons group in IE 11. */ +.media-frame .setting-group .button-group, +.image-details .embed-media-settings .setting .button-group { + width: auto; +} + +.media-embed-sidebar { + position: absolute; + top: 0; + right: 440px; +} + +.advanced-section, +.link-settings { + margin-top: 10px; +} + +/** + * Button groups fix: can be removed together with the Back-compat for pre-5.3 + */ + .media-frame .setting .button-group { + display: flex; + margin: 0 !important; + max-width: none !important; + } + +/** + * Localization + */ +.rtl .media-modal, +.rtl .media-frame, +.rtl .media-frame .search, +.rtl .media-frame input[type="text"], +.rtl .media-frame input[type="password"], +.rtl .media-frame input[type="number"], +.rtl .media-frame input[type="search"], +.rtl .media-frame input[type="email"], +.rtl .media-frame input[type="url"], +.rtl .media-frame input[type="tel"], +.rtl .media-frame textarea, +.rtl .media-frame select { + font-family: Tahoma, sans-serif; +} + +:lang(he-il) .rtl .media-modal, +:lang(he-il) .rtl .media-frame, +:lang(he-il) .rtl .media-frame .search, +:lang(he-il) .rtl .media-frame input[type="text"], +:lang(he-il) .rtl .media-frame input[type="password"], +:lang(he-il) .rtl .media-frame input[type="number"], +:lang(he-il) .rtl .media-frame input[type="search"], +:lang(he-il) .rtl .media-frame input[type="email"], +:lang(he-il) .rtl .media-frame input[type="url"], +:lang(he-il) .rtl .media-frame textarea, +:lang(he-il) .rtl .media-frame select { + font-family: Arial, sans-serif; +} + +/** + * Responsive layout + */ +@media only screen and (max-width: 900px) { + .media-modal .media-frame-title { + height: 40px; + } + + .media-modal .media-frame-title h1 { + line-height: 2.22222222; + font-size: 18px; + } + + .media-modal-close { + width: 42px; + height: 42px; + } + + /* Drop-down menu */ + .media-frame .media-frame-title { + position: static; + padding: 0 44px; + text-align: center; + } + + .media-frame:not(.hide-menu) .media-frame-router, + .media-frame:not(.hide-menu) .media-frame-content, + .media-frame:not(.hide-menu) .media-frame-toolbar { + right: 0; + } + + .media-frame:not(.hide-menu) .media-frame-router { + /* 40 title + (40 - 6) menu toggle button + 6 spacing */ + top: 80px; + } + + .media-frame:not(.hide-menu) .media-frame-content { + /* 80 + room for the tabs */ + top: 114px; + } + + .media-frame.hide-router .media-frame-content { + top: 80px; + } + + .media-frame:not(.hide-menu) .media-frame-menu { + position: static; + width: 0; + } + + .media-frame:not(.hide-menu) .media-menu { + display: none; + width: auto; + max-width: 80%; + overflow: auto; + z-index: 2000; + top: 75px; + right: 50%; + transform: translateX(50%); + left: auto; + bottom: auto; + padding: 5px 0; + border: 1px solid #ccc; + } + + .media-frame:not(.hide-menu) .media-menu.visible { + display: block; + } + + .media-frame:not(.hide-menu) .media-menu > a { + padding: 12px 16px; + font-size: 16px; + } + + .media-frame:not(.hide-menu) .media-menu .separator { + margin: 5px 10px; + } + + /* Visually hide the menu heading keeping it available to assistive technologies. */ + .media-frame-menu-heading { + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + height: 1px; + overflow: hidden; + padding: 0; + width: 1px; + word-wrap: normal !important; + } + + /* Reveal the menu toggle button. */ + .wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle { + display: inline-flex; + align-items: center; + position: absolute; + right: 50%; + transform: translateX(50%); + margin: -6px 0 0; + padding: 0 12px 0 2px; + font-size: 0.875rem; + font-weight: 600; + text-decoration: none; + background: transparent; + /* Only for IE11 to vertically align text within the inline-flex button */ + height: 0.1%; + /* Modern browsers */ + min-height: 40px; + } + + .wp-core-ui .button.media-frame-menu-toggle:hover, + .wp-core-ui .button.media-frame-menu-toggle:active { + background: transparent; + transform: none; + } + + .wp-core-ui .button.media-frame-menu-toggle:focus { + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; + } + /* End drop-down menu */ + + .media-sidebar { + width: 230px; + } + + .attachments-browser .attachments, + .attachments-browser .uploader-inline, + .attachments-browser .media-toolbar { + left: 262px; + } + + .media-sidebar .setting, + .attachment-details .setting { + margin: 6px 0px; + } + + .media-sidebar .setting input, + .media-sidebar .setting textarea, + .media-sidebar .setting .name, + .attachment-details .setting input, + .attachment-details .setting textarea, + .attachment-details .setting .name, + .compat-item label span { + float: none; + display: inline-block; + } + + .media-sidebar .setting span, /* Back-compat for pre-5.3 */ + .attachment-details .setting span, /* Back-compat for pre-5.3 */ + .media-sidebar .checkbox-label-inline { + float: none; + } + + .media-sidebar .setting .select-label-inline { + display: inline; + } + + .media-sidebar .setting .name, + .media-sidebar .checkbox-label-inline, + .attachment-details .setting .name, + .compat-item label span { + text-align: inherit; + min-height: 16px; + margin: 0; + padding: 8px 2px 2px; + } + + .media-sidebar .setting .value, + .attachment-details .setting .value { + float: none; + width: auto; + } + + .media-sidebar .setting input[type="text"], + .media-sidebar .setting input[type="password"], + .media-sidebar .setting input[type="email"], + .media-sidebar .setting input[type="number"], + .media-sidebar .setting input[type="search"], + .media-sidebar .setting input[type="tel"], + .media-sidebar .setting input[type="url"], + .media-sidebar .setting textarea, + .media-sidebar .setting select, + .attachment-details .setting input[type="text"], + .attachment-details .setting input[type="password"], + .attachment-details .setting input[type="email"], + .attachment-details .setting input[type="number"], + .attachment-details .setting input[type="search"], + .attachment-details .setting input[type="tel"], + .attachment-details .setting input[type="url"], + .attachment-details .setting textarea, + .attachment-details .setting select, + .attachment-details .setting + .description { + float: none; + width: 98%; + max-width: none; + height: auto; + } + + .media-frame .media-toolbar input[type="search"] { + line-height: 2.25; /* 36px */ + } + + .media-sidebar .setting select.columns, + .attachment-details .setting select.columns { + width: auto; + } + + .media-frame input, + .media-frame textarea, + .media-frame .search { + padding: 3px 6px; + } + + .wp-admin .media-frame select { + min-height: 40px; + font-size: 16px; + line-height: 1.625; + padding: 5px 8px 5px 24px; + } + + .image-details .column-image { + width: 30%; + right: 70%; + } + + .image-details .column-settings { + width: 70%; + } + + .image-details .media-modal { + right: 30px; + left: 30px; + } + + .image-details .embed-media-settings .setting, + .image-details .embed-media-settings .setting-group { + margin: 20px; + } + + .image-details .embed-media-settings .setting span, /* Back-compat for pre-5.3 */ + .image-details .embed-media-settings .setting .name { + float: none; + text-align: right; + width: 100%; + margin-bottom: 4px; + margin-right: 0; + } + + .media-modal .legend-inline { + position: static; + transform: none; + margin-right: 0; + margin-bottom: 6px; + } + + .image-details .embed-media-settings .setting-group .setting { + margin-bottom: 0; + } + + .image-details .embed-media-settings .setting input.link-to-custom, + .image-details .embed-media-settings .setting input[type="text"], + .image-details .embed-media-settings .setting textarea { + width: 100%; + margin-right: 0; + } + + .image-details .embed-media-settings .setting.has-description { + margin-bottom: 5px; + } + + .image-details .description { + width: auto; + margin: 0 20px; + } + + .image-details .embed-media-settings .custom-size { + margin-right: 20px; + } + + .collection-settings .setting input[type="checkbox"] { + float: none; + margin-top: 0; + } + + .media-selection { + min-width: 120px; + } + + .media-selection:after { + background: none; + } + + .media-selection .attachments { + display: none; + } + + .media-modal .attachments-browser .media-toolbar .search { + max-width: 100%; + height: auto; + float: left; + } + + .media-modal .attachments-browser .media-toolbar .attachment-filters { + height: auto; + } + + /* Text inputs need to be 16px, or they force zooming on iOS */ + .media-frame input[type="text"], + .media-frame input[type="password"], + .media-frame input[type="number"], + .media-frame input[type="search"], + .media-frame input[type="email"], + .media-frame input[type="url"], + .media-frame textarea, + .media-frame select { + font-size: 16px; + } + + .media-frame .media-toolbar input[type="search"] { + line-height: 2.3755; /* 38px */ + } + + .media-modal .media-toolbar .spinner { + margin-bottom: 10px; + } +} + +@media screen and (max-width: 782px) { + .attachments-browser .media-toolbar { + height: 82px; + } + + .attachments-browser .attachments, + .attachments-browser .uploader-inline { + top: 82px; + } + + .media-frame-toolbar .media-toolbar { + bottom: -54px; + } +} + +@media screen and (max-width: 782px) { + .mode-grid .attachments-browser .media-toolbar-primary { + display: block; + } +} + +/* Responsive on portrait and landscape */ +@media only screen and (max-width: 640px), screen and (max-height: 400px) { + /* Full-bleed modal */ + .media-modal, + .image-details .media-modal { + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + } + + .media-modal-backdrop { + position: fixed; + } + + .media-sidebar { + z-index: 1900; + max-width: 70%; + bottom: 120%; + box-sizing: border-box; + padding-bottom: 0; + } + + .media-sidebar.visible { + bottom: 0; + } + + .attachments-browser .attachments, + .attachments-browser .uploader-inline, + .attachments-browser .media-toolbar { + left: 0; + } + + .image-details .media-frame-title { + display: block; + top: 0; + font-size: 14px; + } + + .image-details .column-image, + .image-details .column-settings { + width: 100%; + position: relative; + right: 0; + } + + .image-details .column-settings { + padding: 4px 0; + } + + /* Media tabs on the top */ + .media-frame-content .media-toolbar .instructions { + display: none; + } +} + +@media only screen and (min-width: 901px) and (max-height: 400px) { + .media-menu, + .media-frame:not(.hide-menu) .media-menu { + top: 0; + padding-top: 44px; + } +} + +@media only screen and (max-width: 480px) { + .wp-core-ui.wp-customizer .media-button { + margin-top: 13px; + } +} + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + .wp-core-ui .media-modal-icon { + background-image: url(../images/uploader-icons-2x.png); + background-size: 134px 15px; + } + + .media-frame .spinner { + background-image: url(../images/spinner-2x.gif); + } +} + +.media-frame-content[data-columns="1"] .attachment { + width: 100%; +} + +.media-frame-content[data-columns="2"] .attachment { + width: 50%; +} + +.media-frame-content[data-columns="3"] .attachment { + width: 33.33%; +} + +.media-frame-content[data-columns="4"] .attachment { + width: 25%; +} + +.media-frame-content[data-columns="5"] .attachment { + width: 20%; +} + +.media-frame-content[data-columns="6"] .attachment { + width: 16.66%; +} + +.media-frame-content[data-columns="7"] .attachment { + width: 14.28%; +} + +.media-frame-content[data-columns="8"] .attachment { + width: 12.5%; +} + +.media-frame-content[data-columns="9"] .attachment { + width: 11.11%; +} + +.media-frame-content[data-columns="10"] .attachment { + width: 10%; +} + +.media-frame-content[data-columns="11"] .attachment { + width: 9.09%; +} + +.media-frame-content[data-columns="12"] .attachment { + width: 8.33%; +} diff --git a/wp-includes/css/media-views-rtl.min.css b/wp-includes/css/media-views-rtl.min.css new file mode 100644 index 0000000..ab54f71 --- /dev/null +++ b/wp-includes/css/media-views-rtl.min.css @@ -0,0 +1,9 @@ +/*! This file is auto-generated */ +.media-modal *{box-sizing:content-box}.media-modal input,.media-modal select,.media-modal textarea{box-sizing:border-box}.media-frame,.media-modal{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;-webkit-overflow-scrolling:touch}.media-modal legend{padding:0;font-size:13px}.media-modal label{font-size:13px}.media-modal .legend-inline{position:absolute;transform:translate(100%,50%);margin-right:-1%;line-height:1.2}.media-frame a{border-bottom:none;color:#0073aa}.media-frame a:active,.media-frame a:hover{color:#00a0d2}.media-frame a:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);color:#124964;outline:1px solid transparent}.media-frame a.button{color:#32373c}.media-frame a.button:hover{color:#23282d}.media-frame a.button-primary,.media-frame a.button-primary:hover{color:#fff}.media-frame input,.media-frame textarea{padding:6px 8px}.media-frame select,.wp-admin .media-frame select{min-height:30px;vertical-align:middle}.media-frame input[type=color],.media-frame input[type=date],.media-frame input[type=datetime-local],.media-frame input[type=datetime],.media-frame input[type=email],.media-frame input[type=month],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=tel],.media-frame input[type=text],.media-frame input[type=time],.media-frame input[type=url],.media-frame input[type=week],.media-frame select,.media-frame textarea{box-shadow:0 0 0 transparent;border-radius:4px;border:1px solid #7e8993;background-color:#fff;color:#32373c;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px}.media-frame input[type=date],.media-frame input[type=datetime-local],.media-frame input[type=datetime],.media-frame input[type=email],.media-frame input[type=month],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=tel],.media-frame input[type=text],.media-frame input[type=time],.media-frame input[type=url],.media-frame input[type=week]{padding:0 8px;line-height:2.15384615}.media-frame.mode-grid .wp-filter input[type=search]{font-size:14px;line-height:2}.media-frame input[type=email]:focus,.media-frame input[type=number]:focus,.media-frame input[type=password]:focus,.media-frame input[type=search]:focus,.media-frame input[type=text]:focus,.media-frame input[type=url]:focus,.media-frame select:focus,.media-frame textarea:focus{border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.media-frame input:disabled,.media-frame input[readonly],.media-frame textarea:disabled,.media-frame textarea[readonly]{background-color:#eee}.media-frame input[type=search]{-webkit-appearance:textfield}.media-frame ::-webkit-input-placeholder{color:#72777c}.media-frame ::-moz-placeholder{color:#72777c;opacity:1}.media-frame :-ms-input-placeholder{color:#72777c}.media-frame .hidden,.media-frame .setting.hidden{display:none}/*! + * jQuery UI Draggable/Sortable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */.ui-draggable-handle,.ui-sortable-handle{touch-action:none}.media-modal{position:fixed;top:30px;right:30px;left:30px;bottom:30px;z-index:160000}.wp-customizer .media-modal{z-index:560000}.media-modal-backdrop{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:159900}.wp-customizer .media-modal-backdrop{z-index:559900}.media-modal-close{position:absolute;top:0;left:0;width:50px;height:50px;margin:0;padding:0;border:1px solid transparent;background:0 0;color:#666;z-index:1000;cursor:pointer;outline:0;transition:color .1s ease-in-out,background .1s ease-in-out}.media-modal-close:active,.media-modal-close:hover{color:#00a0d2}.media-modal-close:focus{color:#00a0d2;border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8);outline:2px solid transparent}.media-modal-close span.media-modal-icon{background-image:none}.media-modal-close .media-modal-icon:before{content:"\f158";font:normal 20px/1 dashicons;speak:none;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.media-modal-content{position:absolute;top:0;right:0;left:0;bottom:0;overflow:auto;min-height:300px;box-shadow:0 5px 15px rgba(0,0,0,.7);background:#fcfcfc;-webkit-font-smoothing:subpixel-antialiased}.media-modal-content .media-frame select.attachment-filters{margin-top:32px;margin-left:2%;width:42%;width:calc(48% - 12px)}.media-modal-content .attachments-browser .search{width:100%}.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons.png);background-repeat:no-repeat}.media-toolbar{position:absolute;top:0;right:0;left:0;z-index:100;height:60px;padding:0 16px;border:0 solid #ddd;overflow:hidden}.media-frame-toolbar .media-toolbar{top:auto;bottom:-47px;height:auto;overflow:visible;border-top:1px solid #ddd}.media-toolbar-primary{float:left;height:100%;position:relative}.media-toolbar-secondary{float:right;height:100%}.media-toolbar-primary>.media-button,.media-toolbar-primary>.media-button-group{margin-right:10px;float:right;margin-top:15px}.media-toolbar-secondary>.media-button,.media-toolbar-secondary>.media-button-group{margin-left:10px;margin-top:15px}.media-sidebar{position:absolute;top:0;left:0;bottom:0;width:267px;padding:0 16px;z-index:75;background:#f3f3f3;border-right:1px solid #ddd;overflow:auto;-webkit-overflow-scrolling:touch}.media-sidebar::after{content:"";display:flex;clear:both;height:24px}.hide-toolbar .media-sidebar{bottom:0}.image-details h2,.media-sidebar h2{position:relative;font-weight:600;text-transform:uppercase;font-size:12px;color:#666;margin:24px 0 8px}.attachment-details .setting,.media-sidebar .setting{display:block;float:right;width:100%;margin:0 0 10px}.media-sidebar .collection-settings .setting{margin:1px 0}.attachment-details .setting.has-description,.media-sidebar .setting.has-description{margin-bottom:5px}.media-sidebar .setting .link-to-custom{margin:3px 2px 0}.attachment-details .setting .name,.attachment-details .setting span,.media-sidebar .setting .name,.media-sidebar .setting .value,.media-sidebar .setting span{min-width:30%;margin-left:4%;font-size:12px;text-align:left;word-wrap:break-word}.media-sidebar .setting .name{max-width:80px}.media-sidebar .setting .value{text-align:right}.media-sidebar .setting select{max-width:65%}.attachment-details .field input[type=checkbox],.attachment-details .field input[type=radio],.attachment-details .setting input[type=checkbox],.attachment-details .setting input[type=radio],.media-sidebar .field input[type=checkbox],.media-sidebar .field input[type=radio],.media-sidebar .setting input[type=checkbox],.media-sidebar .setting input[type=radio]{float:none;margin:8px 3px 0;padding:0}.attachment-details .setting .name,.attachment-details .setting .value,.attachment-details .setting span,.compat-item label span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting .name,.media-sidebar .setting .value,.media-sidebar .setting span{float:right;min-height:22px;padding-top:8px;line-height:1.33333333;font-weight:400;color:#666}.media-sidebar .checkbox-label-inline{font-size:12px}.compat-item label span{text-align:left}.attachment-details .setting .value,.attachment-details .setting input[type=email],.attachment-details .setting input[type=number],.attachment-details .setting input[type=password],.attachment-details .setting input[type=search],.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=url],.attachment-details .setting textarea,.attachment-details .setting+.description,.media-sidebar .setting .value,.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=url],.media-sidebar .setting textarea{box-sizing:border-box;margin:1px;width:65%;float:left}.attachment-details .setting .value,.attachment-details .setting+.description,.media-sidebar .setting .value{margin:0 1px;text-align:right}.attachment-details .setting+.description{clear:both;font-size:12px;font-style:normal;margin-bottom:10px}.attachment-details .setting textarea,.compat-item .field textarea,.media-sidebar .setting textarea{height:62px;resize:vertical}.compat-item{float:right;width:100%;overflow:hidden}.compat-item table{width:100%;table-layout:fixed;border-spacing:0;border:0}.compat-item tr{padding:2px 0;display:block;overflow:hidden}.compat-item .field,.compat-item .label{display:block;margin:0;padding:0}.compat-item .label{min-width:30%;margin-left:4%;float:right;text-align:left}.compat-item .label span{display:block;width:100%}.compat-item .field{float:left;width:65%;margin:1px}.compat-item .field input[type=email],.compat-item .field input[type=number],.compat-item .field input[type=password],.compat-item .field input[type=search],.compat-item .field input[type=tel],.compat-item .field input[type=text],.compat-item .field input[type=url],.compat-item .field textarea{width:100%;margin:0;box-sizing:border-box}.sidebar-for-errors .attachment-details,.sidebar-for-errors .compat-item,.sidebar-for-errors .media-sidebar .media-progress-bar,.sidebar-for-errors .upload-details{display:none!important}.media-menu{position:absolute;top:0;right:0;left:0;bottom:0;margin:0;padding:50px 0 10px;background:#f3f3f3;border-left-width:1px;border-left-style:solid;border-left-color:#ccc;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-menu .media-menu-item{display:block;box-sizing:border-box;width:100%;position:relative;border:0;margin:0;padding:8px 20px;font-size:14px;line-height:1.28571428;background:0 0;color:#0073aa;text-align:right;text-decoration:none;cursor:pointer}.media-menu .media-menu-item:hover{background:rgba(0,0,0,.04)}.media-menu .media-menu-item:active{color:#0073aa;outline:0}.media-menu .active,.media-menu .active:hover{color:#23282d;font-weight:600}.media-menu .media-menu-item:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);color:#124964;outline:1px solid transparent}.media-menu .separator{height:0;margin:12px 20px;padding:0;border-top:1px solid #ddd}.media-router{position:relative;padding:0 6px;margin:0;clear:both}.media-router .media-menu-item{position:relative;float:right;border:0;margin:0;padding:8px 10px 9px;height:18px;line-height:1.28571428;font-size:14px;text-decoration:none;background:0 0;cursor:pointer;transition:none}.media-router .media-menu-item:last-child{border-left:0}.media-router .media-menu-item:active,.media-router .media-menu-item:hover{color:#0073aa}.media-router .active,.media-router .active:hover{color:#23282d}.media-router .media-menu-item:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);color:#124964;outline:1px solid transparent}.media-router .active,.media-router .media-menu-item.active:last-child{margin:-1px -1px 0;background:#fff;border:1px solid #ddd;border-bottom:none}.media-router .active:after{display:none}.media-frame{overflow:hidden;position:absolute;top:0;right:0;left:0;bottom:0}.media-frame-menu{position:absolute;top:0;right:0;bottom:0;width:200px;z-index:150}.media-frame-title{position:absolute;top:0;right:200px;left:0;height:50px;z-index:200}.media-frame-router{position:absolute;top:50px;right:200px;left:0;height:36px;z-index:200}.media-frame-content{position:absolute;top:84px;right:200px;left:0;bottom:61px;height:auto;width:auto;margin:0;overflow:auto;background:#fff;border-top:1px solid #ddd}.media-frame-toolbar{position:absolute;right:200px;left:0;z-index:100;bottom:60px;height:auto}.media-frame.hide-menu .media-frame-content,.media-frame.hide-menu .media-frame-router,.media-frame.hide-menu .media-frame-title,.media-frame.hide-menu .media-frame-toolbar{right:0}.media-frame.hide-toolbar .media-frame-content{bottom:0}.media-frame.hide-router .media-frame-content{top:50px}.media-frame.hide-menu .media-frame-menu,.media-frame.hide-menu .media-frame-menu-heading,.media-frame.hide-router .media-frame-router,.media-frame.hide-toolbar .media-frame-toolbar{display:none}.media-frame-title h1{padding:0 16px;font-size:22px;line-height:2.27272727;margin:0}.media-attachments-filter-heading,.media-frame-menu-heading{position:absolute;right:20px;top:22px;margin:0;font-size:13px;line-height:1;z-index:151}.media-attachments-filter-heading{top:10px;right:16px}.mode-grid .media-attachments-filter-heading{top:0;right:-9999px}.mode-grid .media-frame-actions-heading{display:none}.wp-core-ui .button.media-frame-menu-toggle{display:none}.media-frame-title .suggested-dimensions{font-size:14px;float:left;margin-left:20px}.media-frame-content .crop-content{height:100%}.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon{margin-left:300px}.media-frame-content .crop-content .crop-image{display:block;margin:auto;max-width:100%;max-height:100%}.media-frame-content .crop-content .upload-errors{position:absolute;width:300px;top:50%;right:50%;margin-right:-150px;margin-left:-150px;z-index:600000}.media-frame .media-iframe{overflow:hidden}.media-frame .media-iframe,.media-frame .media-iframe iframe{height:100%;width:100%;border:0}.media-frame select.attachment-filters{margin-top:11px;margin-left:2%;max-width:42%;max-width:calc(48% - 12px)}.media-frame select.attachment-filters:last-of-type{margin-left:0;width:auto;max-width:100%}.media-frame .search{margin:32px 0 0;padding:4px;font-size:13px;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;-webkit-appearance:none}.media-toolbar-primary .search{max-width:100%}.media-frame .media-search-input-label{position:absolute;right:0;top:10px;margin:0;line-height:1}.wp-core-ui .attachments{margin:0;-webkit-overflow-scrolling:touch}.wp-core-ui .attachment{position:relative;float:right;padding:8px;margin:0;color:#444;cursor:pointer;list-style:none;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:25%;box-sizing:border-box}.wp-core-ui .attachment.details:focus,.wp-core-ui .attachment:focus,.wp-core-ui .selected.attachment:focus{box-shadow:inset 0 0 2px 3px #fff,inset 0 0 0 7px #5b9dd9;outline:2px solid transparent;outline-offset:-6px}.wp-core-ui .selected.attachment{box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 7px #ccc}.wp-core-ui .attachment.details{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #0073aa}.wp-core-ui .attachment-preview{position:relative;box-shadow:inset 0 0 15px rgba(0,0,0,.1),inset 0 0 0 1px rgba(0,0,0,.05);background:#eee;cursor:pointer}.wp-core-ui .attachment-preview:before{content:"";display:block;padding-top:100%}.wp-core-ui .attachment .icon{margin:0 auto;overflow:hidden}.wp-core-ui .attachment .thumbnail{overflow:hidden;position:absolute;top:0;left:0;bottom:0;right:0;opacity:1;transition:opacity .1s}.wp-core-ui .attachment .portrait img{max-width:100%}.wp-core-ui .attachment .landscape img{max-height:100%}.wp-core-ui .attachment .thumbnail:after{content:"";display:block;position:absolute;top:0;right:0;left:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.wp-core-ui .attachment .thumbnail img{top:0;right:0}.wp-core-ui .attachment .thumbnail .centered{position:absolute;top:0;right:0;width:100%;height:100%;transform:translate(-50%,50%)}.wp-core-ui .attachment .thumbnail .centered img{transform:translate(50%,-50%)}.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon{transform:translate(50%,-70%)}.wp-core-ui .attachment .filename{position:absolute;right:0;left:0;bottom:0;overflow:hidden;max-height:100%;word-wrap:break-word;text-align:center;font-weight:600;background:rgba(255,255,255,.8);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.wp-core-ui .attachment .filename div{padding:5px 10px}.wp-core-ui .attachment .thumbnail img{position:absolute}.wp-core-ui .attachment-close{display:block;position:absolute;top:5px;left:5px;height:22px;width:22px;padding:0;background-color:#fff;background-position:-96px 4px;border-radius:3px;box-shadow:0 0 0 1px rgba(0,0,0,.3);transition:none}.wp-core-ui .attachment-close:focus,.wp-core-ui .attachment-close:hover{background-position:-36px 4px}.wp-core-ui .attachment .check{display:none;height:24px;width:24px;padding:0;border:0;position:absolute;z-index:10;top:0;left:0;outline:0;background:#eee;cursor:pointer;box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,0,0,.15)}.wp-core-ui .attachment .check .media-modal-icon{display:block;background-position:-1px 0;height:15px;width:15px;margin:5px}.wp-core-ui .attachment .check:hover .media-modal-icon{background-position:-40px 0}.wp-core-ui .attachment.selected .check{display:block}.wp-core-ui .attachment.details .check,.wp-core-ui .attachment.selected .check:focus,.wp-core-ui .media-frame.mode-grid .attachment.selected .check{background-color:#0073aa;box-shadow:0 0 0 1px #fff,0 0 0 2px #0073aa}.wp-core-ui .attachment.selected .check:focus{outline:2px solid transparent}.wp-core-ui .attachment.details .check .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon{background-position:-21px 0}.wp-core-ui .attachment.details .check:hover .media-modal-icon,.wp-core-ui .attachment.selected .check:focus .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon{background-position:-60px 0}.wp-core-ui .media-frame .attachment .describe{position:relative;display:block;width:100%;margin:0;padding:0 8px;font-size:12px;border-radius:0}.media-frame .attachments-browser{position:relative;width:100%;height:100%;overflow:hidden}.attachments-browser .media-toolbar{left:300px;height:72px;background:#fff}.attachments-browser.hide-sidebar .media-toolbar{left:0}.attachments-browser .media-toolbar-primary>.media-button,.attachments-browser .media-toolbar-primary>.media-button-group,.attachments-browser .media-toolbar-secondary>.media-button,.attachments-browser .media-toolbar-secondary>.media-button-group{margin:10px 0}.attachments-browser .attachments{padding:2px 8px 8px}.attachments-browser .attachments,.attachments-browser .uploader-inline{position:absolute;top:72px;right:0;left:300px;bottom:0;overflow:auto;outline:0}.attachments-browser .uploader-inline.hidden{display:none}.attachments-browser .media-toolbar-primary{max-width:33%}.mode-grid .attachments-browser .media-toolbar-primary{display:flex;align-items:center}.mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary{display:none}.attachments-browser .media-toolbar-secondary{max-width:66%}.uploader-inline .close{background-color:transparent;border:0;cursor:pointer;height:48px;outline:0;padding:0;position:absolute;left:2px;text-align:center;top:2px;width:48px;z-index:1}.uploader-inline .close:before{font:normal 30px/1 dashicons!important;color:#555d66;display:inline-block;content:"\f335";font-weight:300;margin-top:1px}.uploader-inline .close:focus{outline:1px solid #5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}.attachments-browser.hide-sidebar .attachments,.attachments-browser.hide-sidebar .uploader-inline{left:0;margin-left:0}.attachments-browser .instructions{display:inline-block;margin-top:16px;line-height:1.38461538;font-size:13px;color:#666}.attachments-browser .no-media{padding:2em 2em 0 0}.media-progress-bar{position:relative;height:10px;width:70%;margin:10px auto;border-radius:10px;background:#ddd;background:rgba(0,0,0,.1)}.media-progress-bar div{height:10px;min-width:20px;width:0;background:#0073aa;border-radius:10px;transition:width .3s}.media-uploader-status .media-progress-bar{display:none;width:100%}.uploading.media-uploader-status .media-progress-bar{display:block}.attachment-preview .media-progress-bar{position:absolute;top:50%;right:15%;width:70%;margin:-5px 0 0 0}.media-uploader-status{position:relative;margin:0 auto;padding-bottom:10px;max-width:400px}.uploader-inline .media-uploader-status h2{display:none}.media-uploader-status .upload-details{display:none;font-size:12px;color:#666}.uploading.media-uploader-status .upload-details{display:block}.media-uploader-status .upload-detail-separator{padding:0 4px}.media-uploader-status .upload-count{color:#444}.media-uploader-status .upload-dismiss-errors,.media-uploader-status .upload-errors{display:none}.errors.media-uploader-status .upload-dismiss-errors,.errors.media-uploader-status .upload-errors{display:block}.media-uploader-status .upload-dismiss-errors{position:absolute;top:-3px;left:-5px;padding:5px;border-radius:50%;transition:none;text-decoration:none}.uploader-inline .media-uploader-status .upload-dismiss-errors{top:2px;left:2px}.media-uploader-status .upload-dismiss-errors::before{content:"\f153";display:block;font:normal 16px/1 dashicons;color:#72777c}.uploader-inline .errors.media-uploader-status .upload-dismiss-errors::before{color:#606a73}.errors.media-uploader-status .upload-dismiss-errors:focus::before,.errors.media-uploader-status .upload-dismiss-errors:hover::before{color:#c00}.upload-errors .upload-error{padding:12px;margin-bottom:12px;background:#fff;border-right:4px solid #dc3232;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.uploader-inline .upload-errors .upload-error{padding:12px 30px;background-color:#fbeaea;box-shadow:none}.upload-errors .upload-error-filename{font-weight:600}.upload-errors .upload-error-message{display:block;padding-top:8px;word-wrap:break-word}.uploader-window,.wp-editor-wrap .uploader-editor{top:0;right:0;left:0;bottom:0;text-align:center;display:none}.uploader-window{position:fixed;z-index:250000;opacity:0;transition:opacity 250ms}.wp-editor-wrap .uploader-editor{position:absolute;z-index:99998;background:rgba(150,150,150,.9)}.uploader-window,.wp-editor-wrap .uploader-editor.droppable{background:rgba(0,86,132,.9)}.uploader-window-content,.wp-editor-wrap .uploader-editor-content{position:absolute;top:10px;right:10px;left:10px;bottom:10px;border:1px dashed #fff}.uploader-window .uploader-editor-title,.uploader-window h1,.wp-editor-wrap .uploader-editor .uploader-editor-title{position:absolute;top:50%;right:0;left:0;transform:translateY(-50%);font-size:3em;line-height:1.3;font-weight:600;color:#fff;margin:0;padding:0 10px}.wp-editor-wrap .uploader-editor .uploader-editor-title{display:none}.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title{display:block}.uploader-window .media-progress-bar{margin-top:20px;max-width:300px;background:0 0;border-color:#fff;display:none}.uploader-window .media-progress-bar div{background:#fff}.uploading .uploader-window .media-progress-bar{display:block}.media-frame .uploader-inline{margin-bottom:20px;padding:0;text-align:center}.uploader-inline-content{position:absolute;top:30%;right:0;left:0}.uploader-inline-content .upload-ui{margin:2em 0}.uploader-inline-content .post-upload-ui{margin-bottom:2em}.uploader-inline .has-upload-message .upload-ui{margin:0 0 4em}.uploader-inline h2{font-size:20px;line-height:1.4;font-weight:400;margin:0}.uploader-inline .has-upload-message .upload-instructions{font-size:14px;color:#444;font-weight:400}.uploader-inline .drop-instructions{display:none}.supports-drag-drop .uploader-inline .drop-instructions{display:block}.uploader-inline p{margin:.5em 0}.uploader-inline .media-progress-bar{display:none}.uploading.uploader-inline .media-progress-bar{display:block}.uploader-inline .browser{display:inline-block!important}.media-selection{position:absolute;top:0;right:0;left:350px;height:60px;padding:0 16px 0 0;overflow:hidden;white-space:nowrap}.media-selection .selection-info{display:inline-block;font-size:12px;height:60px;margin-left:10px;vertical-align:top}.media-selection.editing,.media-selection.empty{display:none}.media-selection.one .edit-selection{display:none}.media-selection .count{display:block;padding-top:12px;font-size:14px;line-height:1.42857142;font-weight:600}.media-selection .button-link{float:right;padding:1px 8px;margin:1px -8px 1px 8px;line-height:1.4;border-left:1px solid #ddd;color:#0073aa;text-decoration:none}.media-selection .button-link:focus,.media-selection .button-link:hover{color:#00a0d2}.media-selection .button-link:last-child{border-left:0;margin-left:0}.selection-info .clear-selection{color:#bc0b0b}.selection-info .clear-selection:focus,.selection-info .clear-selection:hover{color:#dc3232}.media-selection .selection-view{display:inline-block;vertical-align:top}.media-selection .attachments{display:inline-block;height:48px;margin:6px;padding:0;overflow:hidden;vertical-align:top}.media-selection .attachment{width:40px;padding:0;margin:4px}.media-selection .attachment .thumbnail{top:0;left:0;bottom:0;right:0}.media-selection .attachment .icon{width:50%}.media-selection .attachment-preview{box-shadow:none;background:0 0}.wp-core-ui .media-selection .attachment.details:focus,.wp-core-ui .media-selection .attachment:focus,.wp-core-ui .media-selection .selected.attachment:focus{box-shadow:0 0 0 1px #fff,0 0 2px 3px #5b9dd9;outline:2px solid transparent}.wp-core-ui .media-selection .selected.attachment{box-shadow:none}.wp-core-ui .media-selection .attachment.details{box-shadow:0 0 0 1px #fff,0 0 0 3px #0073aa}.media-selection:after{content:"";display:block;position:absolute;top:0;left:0;bottom:0;width:25px;background-image:linear-gradient(to right,rgba(255,255,255,1),rgba(255,255,255,0))}.media-selection .attachment .filename{display:none}.media-frame .spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;float:left;display:inline-block;visibility:hidden;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:0;vertical-align:middle}.media-frame.mode-grid .spinner{margin:0;float:none;vertical-align:middle}.media-modal .media-toolbar .spinner{float:none;vertical-align:bottom;margin:0 5px 5px 0}.media-frame .instructions+.spinner.is-active{vertical-align:middle}.media-frame .spinner.is-active{visibility:visible}.attachment-details{position:relative;overflow:auto}.attachment-details .settings-save-status{float:left;text-transform:none;font-weight:400}.attachment-details .settings-save-status .spinner{float:none;margin-right:5px}.attachment-details .settings-save-status .saved{display:none}.attachment-details.save-waiting .settings-save-status .spinner{visibility:visible}.attachment-details.save-complete .settings-save-status .saved{display:inline-block}.attachment-info{overflow:hidden;min-height:60px;margin-bottom:16px;line-height:1.5;color:#666;border-bottom:1px solid #ddd;padding-bottom:11px}.attachment-info .filename{font-weight:600;color:#444;word-wrap:break-word}.attachment-info .thumbnail{position:relative;float:right;max-width:120px;max-height:120px;margin-top:5px;margin-left:10px;margin-bottom:5px}.uploading .attachment-info .thumbnail{width:120px;height:80px;box-shadow:inset 0 0 15px rgba(0,0,0,.1)}.uploading .attachment-info .media-progress-bar{margin-top:35px}.attachment-info .thumbnail-image:after{content:"";display:block;position:absolute;top:0;right:0;left:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);overflow:hidden}.attachment-info .thumbnail img{display:block;max-width:120px;max-height:120px;margin:0 auto}.attachment-info .details{float:right;font-size:12px;max-width:100%}.attachment-info .delete-attachment,.attachment-info .edit-attachment,.attachment-info .trash-attachment,.attachment-info .untrash-attachment{display:block;text-decoration:none;white-space:nowrap}.attachment-details.needs-refresh .attachment-info .edit-attachment{display:none}.attachment-info .edit-attachment{display:block}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment{display:inline;padding:0;color:#bc0b0b}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover{color:#dc3232}.attachment-display-settings{width:100%;float:right;overflow:hidden}.collection-settings{overflow:hidden}.collection-settings .setting input[type=checkbox]{float:right;margin-left:8px}.collection-settings .setting .name,.collection-settings .setting span{min-width:inherit}.media-modal .imgedit-wrap{position:static}.media-modal .imgedit-wrap .imgedit-panel-content{padding:16px 16px 0 16px;position:absolute;top:0;left:282px;bottom:0;right:0;overflow:auto}.media-modal .imgedit-wrap .imgedit-submit{margin-bottom:16px}.media-modal .imgedit-wrap .imgedit-settings{background:#f3f3f3;border-right:1px solid #ddd;padding:20px 16px 0;position:absolute;top:0;left:0;bottom:0;width:250px;overflow:auto}.media-modal .imgedit-wrap .imgedit-save-target{margin:8px 0 24px}.media-modal .imgedit-group{background:0 0;border:none;border-bottom:1px solid #ddd;box-shadow:none;margin:0;margin-bottom:16px;padding:0;padding-bottom:16px;position:relative}.media-modal .imgedit-group:last-of-type{border:none;margin:0;padding:0}.media-modal .imgedit-group-top{margin:0}.media-modal .imgedit-group-top h2,.media-modal .imgedit-group-top h2 .button-link{display:inline-block;text-transform:uppercase;font-size:12px;color:#666;margin:0;margin-top:3px}.media-modal .imgedit-group-top h2 .button-link,.media-modal .imgedit-group-top h2 a{text-decoration:none;color:#666}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover{border:1px solid transparent;margin:0;padding:0;background:0 0;color:#0074a2;font-size:20px;line-height:1;cursor:pointer;box-sizing:content-box;box-shadow:none}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus{color:#0074a2;border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8);outline:2px solid transparent}.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle{margin-top:-3px}.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle{margin-top:-2px}.media-modal .imgedit-help-toggled span.dashicons:before{content:"\f142"}.media-modal .imgedit-thumbnail-preview{margin:10px 0 0 8px}.imgedit-thumbnail-preview-caption{display:block}.media-modal .imgedit-wrap div.updated{margin:0;margin-bottom:16px}.embed-url{display:block;position:relative;padding:16px;margin:0;z-index:250;background:#fff;font-size:18px}.media-frame .embed-url input{font-size:18px;line-height:1.22222222;padding:12px 14px 12px 40px;width:100%;min-width:200px;box-shadow:inset -2px 2px 4px -2px rgba(0,0,0,.1)}.media-frame .embed-url input::-ms-clear{display:none}.media-frame .embed-url .spinner{position:absolute;top:32px;left:26px}.media-frame .embed-loading .embed-url .spinner{visibility:visible}.embed-link-settings,.embed-media-settings{position:absolute;top:70px;right:0;left:0;bottom:0;padding:0 16px;overflow:auto}.embed-link-settings::after,.embed-media-settings::after{content:"";display:flex;clear:both;height:24px}.media-embed .embed-link-settings{overflow:visible}.embed-preview embed,.embed-preview iframe,.embed-preview img,.mejs-container video{max-width:100%;vertical-align:middle}.embed-preview a{display:inline-block}.embed-preview img{display:block;height:auto}.mejs-container:focus{outline:1px solid #5b9dd9;box-shadow:0 0 2px 1px rgba(30,140,190,.8)}.image-details .media-modal{right:140px;left:140px}.image-details .media-frame-content,.image-details .media-frame-router,.image-details .media-frame-title{right:0}.image-details .embed-media-settings{top:0;overflow:visible;padding:0}.image-details .embed-media-settings::after{content:none}.image-details .embed-media-settings,.image-details .embed-media-settings div{box-sizing:border-box}.image-details .column-settings{background:#f3f3f3;border-left:1px solid #ddd;min-height:100%;width:55%;position:absolute;top:0;right:0}.image-details .column-settings h2{margin:20px;padding-top:20px;border-top:1px solid #ddd;color:#23282d}.image-details .column-image{width:45%;position:absolute;right:55%;top:0}.image-details .image{margin:20px}.image-details .image img{max-width:100%;max-height:500px}.image-details .advanced-toggle{padding:0;color:#666;text-transform:uppercase;text-decoration:none}.image-details .advanced-toggle:active,.image-details .advanced-toggle:hover{color:#666}.image-details .advanced-toggle:after{font:normal 20px/1 dashicons;speak:none;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f140";display:inline-block;margin-top:-2px}.image-details .advanced-visible .advanced-toggle:after{content:"\f142"}.image-details .custom-size .custom-size-setting,.image-details .custom-size label{display:block;float:right}.image-details .custom-size .custom-size-setting label{float:none}.image-details .custom-size input{width:5em}.image-details .custom-size .sep{float:right;margin:26px 6px 0 6px}.image-details .custom-size .description{margin-right:0}.media-embed .thumbnail{max-width:100%;max-height:200px;position:relative;float:right}.media-embed .thumbnail img{max-height:200px;display:block}.media-embed .thumbnail:after{content:"";display:block;position:absolute;top:0;right:0;left:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.media-embed .setting,.media-embed .setting-group{width:100%;margin:10px 0;float:right;display:block;clear:both}.media-embed .setting-group .setting:not(.checkbox-setting){margin:0}.media-embed .setting.has-description{margin-bottom:5px}.media-embed .description{clear:both;font-style:normal}.media-embed .content-track+.description{line-height:1.4;max-width:none!important}.media-embed .remove-track{margin-bottom:10px}.image-details .embed-media-settings .setting,.image-details .embed-media-settings .setting-group{float:none;width:auto}.image-details .actions{margin:10px 0}.image-details .hidden{display:none}.media-embed .setting input[type=text],.media-embed .setting textarea,.media-embed fieldset{display:block;width:100%;max-width:400px}.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{max-width:inherit;width:70%}.image-details .description,.image-details .embed-media-settings .custom-size,.image-details .embed-media-settings .link-target,.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting-group{margin-right:27%;width:70%}.image-details .description{font-style:normal;margin-top:0}.image-details .embed-media-settings .link-target{margin-top:16px}.audio-details .checkbox-label,.image-details .checkbox-label,.video-details .checkbox-label{vertical-align:baseline}.media-embed .setting input.hidden,.media-embed .setting textarea.hidden{display:none}.media-embed .setting .name,.media-embed .setting span,.media-embed .setting-group .name{display:inline-block;font-size:13px;line-height:1.84615384;color:#666}.media-embed .setting span{display:block;width:200px}.image-details .embed-media-settings .setting .name,.image-details .embed-media-settings .setting span{float:right;width:25%;text-align:left;margin:8px 1% 0 1%;line-height:1.1}.image-details .embed-media-settings .setting .button-group,.media-frame .setting-group .button-group{width:auto}.media-embed-sidebar{position:absolute;top:0;right:440px}.advanced-section,.link-settings{margin-top:10px}.media-frame .setting .button-group{display:flex;margin:0!important;max-width:none!important}.rtl .media-frame,.rtl .media-frame .search,.rtl .media-frame input[type=email],.rtl .media-frame input[type=number],.rtl .media-frame input[type=password],.rtl .media-frame input[type=search],.rtl .media-frame input[type=tel],.rtl .media-frame input[type=text],.rtl .media-frame input[type=url],.rtl .media-frame select,.rtl .media-frame textarea,.rtl .media-modal{font-family:Tahoma,sans-serif}:lang(he-il) .rtl .media-frame,:lang(he-il) .rtl .media-frame .search,:lang(he-il) .rtl .media-frame input[type=email],:lang(he-il) .rtl .media-frame input[type=number],:lang(he-il) .rtl .media-frame input[type=password],:lang(he-il) .rtl .media-frame input[type=search],:lang(he-il) .rtl .media-frame input[type=text],:lang(he-il) .rtl .media-frame input[type=url],:lang(he-il) .rtl .media-frame select,:lang(he-il) .rtl .media-frame textarea,:lang(he-il) .rtl .media-modal{font-family:Arial,sans-serif}@media only screen and (max-width:900px){.media-modal .media-frame-title{height:40px}.media-modal .media-frame-title h1{line-height:2.22222222;font-size:18px}.media-modal-close{width:42px;height:42px}.media-frame .media-frame-title{position:static;padding:0 44px;text-align:center}.media-frame:not(.hide-menu) .media-frame-content,.media-frame:not(.hide-menu) .media-frame-router,.media-frame:not(.hide-menu) .media-frame-toolbar{right:0}.media-frame:not(.hide-menu) .media-frame-router{top:80px}.media-frame:not(.hide-menu) .media-frame-content{top:114px}.media-frame.hide-router .media-frame-content{top:80px}.media-frame:not(.hide-menu) .media-frame-menu{position:static;width:0}.media-frame:not(.hide-menu) .media-menu{display:none;width:auto;max-width:80%;overflow:auto;z-index:2000;top:75px;right:50%;transform:translateX(50%);left:auto;bottom:auto;padding:5px 0;border:1px solid #ccc}.media-frame:not(.hide-menu) .media-menu.visible{display:block}.media-frame:not(.hide-menu) .media-menu>a{padding:12px 16px;font-size:16px}.media-frame:not(.hide-menu) .media-menu .separator{margin:5px 10px}.media-frame-menu-heading{clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;width:1px;word-wrap:normal!important}.wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle{display:inline-flex;align-items:center;position:absolute;right:50%;transform:translateX(50%);margin:-6px 0 0;padding:0 12px 0 2px;font-size:.875rem;font-weight:600;text-decoration:none;background:0 0;height:.1%;min-height:40px}.wp-core-ui .button.media-frame-menu-toggle:active,.wp-core-ui .button.media-frame-menu-toggle:hover{background:0 0;transform:none}.wp-core-ui .button.media-frame-menu-toggle:focus{outline:1px solid transparent}.media-sidebar{width:230px}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline{left:262px}.attachment-details .setting,.media-sidebar .setting{margin:6px 0}.attachment-details .setting .name,.attachment-details .setting input,.attachment-details .setting textarea,.compat-item label span,.media-sidebar .setting .name,.media-sidebar .setting input,.media-sidebar .setting textarea{float:none;display:inline-block}.attachment-details .setting span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting span{float:none}.media-sidebar .setting .select-label-inline{display:inline}.attachment-details .setting .name,.compat-item label span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting .name{text-align:inherit;min-height:16px;margin:0;padding:8px 2px 2px}.attachment-details .setting .value,.media-sidebar .setting .value{float:none;width:auto}.attachment-details .setting input[type=email],.attachment-details .setting input[type=number],.attachment-details .setting input[type=password],.attachment-details .setting input[type=search],.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=url],.attachment-details .setting select,.attachment-details .setting textarea,.attachment-details .setting+.description,.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=url],.media-sidebar .setting select,.media-sidebar .setting textarea{float:none;width:98%;max-width:none;height:auto}.media-frame .media-toolbar input[type=search]{line-height:2.25}.attachment-details .setting select.columns,.media-sidebar .setting select.columns{width:auto}.media-frame .search,.media-frame input,.media-frame textarea{padding:3px 6px}.wp-admin .media-frame select{min-height:40px;font-size:16px;line-height:1.625;padding:5px 8px 5px 24px}.image-details .column-image{width:30%;right:70%}.image-details .column-settings{width:70%}.image-details .media-modal{right:30px;left:30px}.image-details .embed-media-settings .setting,.image-details .embed-media-settings .setting-group{margin:20px}.image-details .embed-media-settings .setting .name,.image-details .embed-media-settings .setting span{float:none;text-align:right;width:100%;margin-bottom:4px;margin-right:0}.media-modal .legend-inline{position:static;transform:none;margin-right:0;margin-bottom:6px}.image-details .embed-media-settings .setting-group .setting{margin-bottom:0}.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{width:100%;margin-right:0}.image-details .embed-media-settings .setting.has-description{margin-bottom:5px}.image-details .description{width:auto;margin:0 20px}.image-details .embed-media-settings .custom-size{margin-right:20px}.collection-settings .setting input[type=checkbox]{float:none;margin-top:0}.media-selection{min-width:120px}.media-selection:after{background:0 0}.media-selection .attachments{display:none}.media-modal .attachments-browser .media-toolbar .search{max-width:100%;height:auto;float:left}.media-modal .attachments-browser .media-toolbar .attachment-filters{height:auto}.media-frame input[type=email],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=text],.media-frame input[type=url],.media-frame select,.media-frame textarea{font-size:16px}.media-frame .media-toolbar input[type=search]{line-height:2.3755}.media-modal .media-toolbar .spinner{margin-bottom:10px}}@media screen and (max-width:782px){.attachments-browser .media-toolbar{height:82px}.attachments-browser .attachments,.attachments-browser .uploader-inline{top:82px}.media-frame-toolbar .media-toolbar{bottom:-54px}}@media screen and (max-width:782px){.mode-grid .attachments-browser .media-toolbar-primary{display:block}}@media only screen and (max-width:640px),screen and (max-height:400px){.image-details .media-modal,.media-modal{position:fixed;top:0;right:0;left:0;bottom:0}.media-modal-backdrop{position:fixed}.media-sidebar{z-index:1900;max-width:70%;bottom:120%;box-sizing:border-box;padding-bottom:0}.media-sidebar.visible{bottom:0}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline{left:0}.image-details .media-frame-title{display:block;top:0;font-size:14px}.image-details .column-image,.image-details .column-settings{width:100%;position:relative;right:0}.image-details .column-settings{padding:4px 0}.media-frame-content .media-toolbar .instructions{display:none}}@media only screen and (min-width:901px) and (max-height:400px){.media-frame:not(.hide-menu) .media-menu,.media-menu{top:0;padding-top:44px}}@media only screen and (max-width:480px){.wp-core-ui.wp-customizer .media-button{margin-top:13px}}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons-2x.png);background-size:134px 15px}.media-frame .spinner{background-image:url(../images/spinner-2x.gif)}}.media-frame-content[data-columns="1"] .attachment{width:100%}.media-frame-content[data-columns="2"] .attachment{width:50%}.media-frame-content[data-columns="3"] .attachment{width:33.33%}.media-frame-content[data-columns="4"] .attachment{width:25%}.media-frame-content[data-columns="5"] .attachment{width:20%}.media-frame-content[data-columns="6"] .attachment{width:16.66%}.media-frame-content[data-columns="7"] .attachment{width:14.28%}.media-frame-content[data-columns="8"] .attachment{width:12.5%}.media-frame-content[data-columns="9"] .attachment{width:11.11%}.media-frame-content[data-columns="10"] .attachment{width:10%}.media-frame-content[data-columns="11"] .attachment{width:9.09%}.media-frame-content[data-columns="12"] .attachment{width:8.33%} \ No newline at end of file diff --git a/wp-includes/css/media-views.css b/wp-includes/css/media-views.css new file mode 100644 index 0000000..d782905 --- /dev/null +++ b/wp-includes/css/media-views.css @@ -0,0 +1,2857 @@ +/** + * Base Styles + */ +.media-modal * { + box-sizing: content-box; +} + +.media-modal input, +.media-modal select, +.media-modal textarea { + box-sizing: border-box; +} + +.media-modal, +.media-frame { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 12px; + -webkit-overflow-scrolling: touch; +} + +.media-modal legend { + padding: 0; + font-size: 13px; +} + +.media-modal label { + font-size: 13px; +} + +.media-modal .legend-inline { + position: absolute; + transform: translate(-100%, 50%); + margin-left: -1%; + line-height: 1.2; +} + +.media-frame a { + border-bottom: none; + color: #0073aa; +} + +.media-frame a:hover, +.media-frame a:active { + color: #00a0d2; +} + +.media-frame a:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + color: #124964; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.media-frame a.button { + color: #32373c; +} + +.media-frame a.button:hover { + color: #23282d; +} + +.media-frame a.button-primary, +.media-frame a.button-primary:hover { + color: #fff; +} + +.media-frame input, +.media-frame textarea { + padding: 6px 8px; +} + +.media-frame select, +.wp-admin .media-frame select { + min-height: 30px; + vertical-align: middle; +} + +.media-frame input[type="text"], +.media-frame input[type="password"], +.media-frame input[type="color"], +.media-frame input[type="date"], +.media-frame input[type="datetime"], +.media-frame input[type="datetime-local"], +.media-frame input[type="email"], +.media-frame input[type="month"], +.media-frame input[type="number"], +.media-frame input[type="search"], +.media-frame input[type="tel"], +.media-frame input[type="time"], +.media-frame input[type="url"], +.media-frame input[type="week"], +.media-frame textarea, +.media-frame select { + box-shadow: 0 0 0 transparent; + border-radius: 4px; + border: 1px solid #7e8993; + background-color: #fff; + color: #32373c; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 13px; +} + +.media-frame input[type="text"], +.media-frame input[type="password"], +.media-frame input[type="date"], +.media-frame input[type="datetime"], +.media-frame input[type="datetime-local"], +.media-frame input[type="email"], +.media-frame input[type="month"], +.media-frame input[type="number"], +.media-frame input[type="search"], +.media-frame input[type="tel"], +.media-frame input[type="time"], +.media-frame input[type="url"], +.media-frame input[type="week"] { + padding: 0 8px; + /* inherits font size 13px */ + line-height: 2.15384615; /* 28px */ +} + +/* Search field in the Media Library toolbar */ +.media-frame.mode-grid .wp-filter input[type="search"] { + font-size: 14px; + line-height: 2; +} + +.media-frame input[type="text"]:focus, +.media-frame input[type="password"]:focus, +.media-frame input[type="number"]:focus, +.media-frame input[type="search"]:focus, +.media-frame input[type="email"]:focus, +.media-frame input[type="url"]:focus, +.media-frame textarea:focus, +.media-frame select:focus { + border-color: #007cba; + box-shadow: 0 0 0 1px #007cba; + outline: 2px solid transparent; +} + +.media-frame input:disabled, +.media-frame textarea:disabled, +.media-frame input[readonly], +.media-frame textarea[readonly] { + background-color: #eee; +} + +.media-frame input[type="search"] { + -webkit-appearance: textfield; +} + +.media-frame ::-webkit-input-placeholder { + color: #72777c; +} + +.media-frame ::-moz-placeholder { + color: #72777c; + opacity: 1; +} + +.media-frame :-ms-input-placeholder { + color: #72777c; +} + +/* + * In some cases there's the need of higher specificity, + * for example higher than `.media-embed .setting`. + */ +.media-frame .hidden, +.media-frame .setting.hidden { + display: none; +} + +/*! + * jQuery UI Draggable/Sortable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ +.ui-draggable-handle, +.ui-sortable-handle { + touch-action: none; +} + +/** + * Modal + */ +.media-modal { + position: fixed; + top: 30px; + left: 30px; + right: 30px; + bottom: 30px; + z-index: 160000; +} + +.wp-customizer .media-modal { + z-index: 560000; +} + +.media-modal-backdrop { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + min-height: 360px; + background: #000; + opacity: 0.7; + z-index: 159900; +} + +.wp-customizer .media-modal-backdrop { + z-index: 559900; +} + +.media-modal-close { + position: absolute; + top: 0; + right: 0; + width: 50px; + height: 50px; + margin: 0; + padding: 0; + border: 1px solid transparent; + background: none; + color: #666; + z-index: 1000; + cursor: pointer; + outline: none; + transition: color .1s ease-in-out, background .1s ease-in-out; +} + +.media-modal-close:hover, +.media-modal-close:active { + color: #00a0d2; +} + +.media-modal-close:focus { + color: #00a0d2; + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.media-modal-close span.media-modal-icon { + background-image: none; +} + +.media-modal-close .media-modal-icon:before { + content: "\f158"; + font: normal 20px/1 dashicons; + speak: none; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.media-modal-content { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow: auto; + min-height: 300px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.7); + background: #fcfcfc; + -webkit-font-smoothing: subpixel-antialiased; +} + +.media-modal-content .media-frame select.attachment-filters { + margin-top: 32px; + margin-right: 2%; + width: 42%; + width: calc(48% - 12px); +} + +.media-modal-content .attachments-browser .search { + width: 100%; +} + +/* higher specificity */ +.wp-core-ui .media-modal-icon { + background-image: url(../images/uploader-icons.png); + background-repeat: no-repeat; +} + +/** + * Toolbar + */ +.media-toolbar { + position: absolute; + top: 0; + left: 0; + right: 0; + z-index: 100; + height: 60px; + padding: 0 16px; + border: 0 solid #ddd; + overflow: hidden; +} + +.media-frame-toolbar .media-toolbar { + top: auto; + bottom: -47px; + height: auto; + overflow: visible; + border-top: 1px solid #ddd; +} + +.media-toolbar-primary { + float: right; + height: 100%; + position: relative; +} + +.media-toolbar-secondary { + float: left; + height: 100%; +} + +.media-toolbar-primary > .media-button, +.media-toolbar-primary > .media-button-group { + margin-left: 10px; + float: left; + margin-top: 15px; +} + +.media-toolbar-secondary > .media-button, +.media-toolbar-secondary > .media-button-group { + margin-right: 10px; + margin-top: 15px; +} + +/** + * Sidebar + */ +.media-sidebar { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 267px; + padding: 0 16px; + z-index: 75; + background: #f3f3f3; + border-left: 1px solid #ddd; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +/* + * Implementation of bottom padding in overflow content differs across browsers. + * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129 + */ +.media-sidebar::after { + content: ""; + display: flex; + clear: both; + height: 24px; +} + +.hide-toolbar .media-sidebar { + bottom: 0; +} + +.media-sidebar h2, +.image-details h2 { + position: relative; + font-weight: 600; + text-transform: uppercase; + font-size: 12px; + color: #666; + margin: 24px 0 8px; +} + +.media-sidebar .setting, +.attachment-details .setting { + display: block; + float: left; + width: 100%; + margin: 0 0 10px; +} + +.media-sidebar .collection-settings .setting { + margin: 1px 0; +} + +.media-sidebar .setting.has-description, +.attachment-details .setting.has-description { + margin-bottom: 5px; +} + +.media-sidebar .setting .link-to-custom { + margin: 3px 2px 0; +} + +.media-sidebar .setting span, /* Back-compat for pre-5.3 */ +.attachment-details .setting span, /* Back-compat for pre-5.3 */ +.media-sidebar .setting .name, +.media-sidebar .setting .value, +.attachment-details .setting .name { + min-width: 30%; + margin-right: 4%; + font-size: 12px; + text-align: right; + word-wrap: break-word; +} + +.media-sidebar .setting .name { + max-width: 80px; +} + +.media-sidebar .setting .value { + text-align: left; +} + +.media-sidebar .setting select { + max-width: 65%; +} + +.media-sidebar .setting input[type="checkbox"], +.media-sidebar .field input[type="checkbox"], +.media-sidebar .setting input[type="radio"], +.media-sidebar .field input[type="radio"], +.attachment-details .setting input[type="checkbox"], +.attachment-details .field input[type="checkbox"], +.attachment-details .setting input[type="radio"], +.attachment-details .field input[type="radio"] { + float: none; + margin: 8px 3px 0; + padding: 0; +} + +.media-sidebar .setting span, /* Back-compat for pre-5.3 */ +.attachment-details .setting span, /* Back-compat for pre-5.3 */ +.media-sidebar .setting .name, +.media-sidebar .setting .value, +.media-sidebar .checkbox-label-inline, +.attachment-details .setting .name, +.attachment-details .setting .value, +.compat-item label span { + float: left; + min-height: 22px; + padding-top: 8px; + line-height: 1.33333333; + font-weight: 400; + color: #666; +} + +.media-sidebar .checkbox-label-inline { + font-size: 12px; +} + +.compat-item label span { + text-align: right; +} + +.media-sidebar .setting input[type="text"], +.media-sidebar .setting input[type="password"], +.media-sidebar .setting input[type="email"], +.media-sidebar .setting input[type="number"], +.media-sidebar .setting input[type="search"], +.media-sidebar .setting input[type="tel"], +.media-sidebar .setting input[type="url"], +.media-sidebar .setting textarea, +.media-sidebar .setting .value, +.attachment-details .setting input[type="text"], +.attachment-details .setting input[type="password"], +.attachment-details .setting input[type="email"], +.attachment-details .setting input[type="number"], +.attachment-details .setting input[type="search"], +.attachment-details .setting input[type="tel"], +.attachment-details .setting input[type="url"], +.attachment-details .setting textarea, +.attachment-details .setting .value, +.attachment-details .setting + .description { + box-sizing: border-box; + margin: 1px; + width: 65%; + float: right; +} + +.media-sidebar .setting .value, +.attachment-details .setting .value, +.attachment-details .setting + .description { + margin: 0 1px; + text-align: left; +} + +.attachment-details .setting + .description { + clear: both; + font-size: 12px; + font-style: normal; + margin-bottom: 10px; +} + +.media-sidebar .setting textarea, +.attachment-details .setting textarea, +.compat-item .field textarea { + height: 62px; + resize: vertical; +} + +.compat-item { + float: left; + width: 100%; + overflow: hidden; +} + +.compat-item table { + width: 100%; + table-layout: fixed; + border-spacing: 0; + border: 0; +} + +.compat-item tr { + padding: 2px 0; + display: block; + overflow: hidden; +} + +.compat-item .label, +.compat-item .field { + display: block; + margin: 0; + padding: 0; +} + +.compat-item .label { + min-width: 30%; + margin-right: 4%; + float: left; + text-align: right; +} + +.compat-item .label span { + display: block; + width: 100%; +} + +.compat-item .field { + float: right; + width: 65%; + margin: 1px; +} + +.compat-item .field input[type="text"], +.compat-item .field input[type="password"], +.compat-item .field input[type="email"], +.compat-item .field input[type="number"], +.compat-item .field input[type="search"], +.compat-item .field input[type="tel"], +.compat-item .field input[type="url"], +.compat-item .field textarea { + width: 100%; + margin: 0; + box-sizing: border-box; +} + +.sidebar-for-errors .attachment-details, +.sidebar-for-errors .compat-item, +.sidebar-for-errors .media-sidebar .media-progress-bar, +.sidebar-for-errors .upload-details { + display: none !important; +} + +/** + * Menu + */ +.media-menu { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: 0; + padding: 50px 0 10px; + background: #f3f3f3; + border-right-width: 1px; + border-right-style: solid; + border-right-color: #ccc; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.media-menu .media-menu-item { + display: block; + box-sizing: border-box; + width: 100%; + position: relative; + border: 0; + margin: 0; + padding: 8px 20px; + font-size: 14px; + line-height: 1.28571428; + background: transparent; + color: #0073aa; + text-align: left; + text-decoration: none; + cursor: pointer; +} + +.media-menu .media-menu-item:hover { + background: rgba(0, 0, 0, 0.04); +} + +.media-menu .media-menu-item:active { + color: #0073aa; + outline: none; +} + +.media-menu .active, +.media-menu .active:hover { + color: #23282d; + font-weight: 600; +} + +.media-menu .media-menu-item:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + color: #124964; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.media-menu .separator { + height: 0; + margin: 12px 20px; + padding: 0; + border-top: 1px solid #ddd; +} + +/** + * Menu + */ +.media-router { + position: relative; + padding: 0 6px; + margin: 0; + clear: both; +} + +.media-router .media-menu-item { + position: relative; + float: left; + border: 0; + margin: 0; + padding: 8px 10px 9px; + height: 18px; + line-height: 1.28571428; + font-size: 14px; + text-decoration: none; + background: transparent; + cursor: pointer; + transition: none; +} + +.media-router .media-menu-item:last-child { + border-right: 0; +} + +.media-router .media-menu-item:hover, +.media-router .media-menu-item:active { + color: #0073aa; +} + +.media-router .active, +.media-router .active:hover { + color: #23282d; +} + +.media-router .media-menu-item:focus { + box-shadow: + 0 0 0 1px #5b9dd9, + 0 0 2px 1px rgba(30, 140, 190, 0.8); + color: #124964; + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; +} + +.media-router .active, +.media-router .media-menu-item.active:last-child { + margin: -1px -1px 0; + background: #fff; + border: 1px solid #ddd; + border-bottom: none; +} + +.media-router .active:after { + display: none; +} + +/** + * Frame + */ +.media-frame { + overflow: hidden; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.media-frame-menu { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 200px; + z-index: 150; +} + +.media-frame-title { + position: absolute; + top: 0; + left: 200px; + right: 0; + height: 50px; + z-index: 200; +} + +.media-frame-router { + position: absolute; + top: 50px; + left: 200px; + right: 0; + height: 36px; + z-index: 200; +} + +.media-frame-content { + position: absolute; + top: 84px; + left: 200px; + right: 0; + bottom: 61px; + height: auto; + width: auto; + margin: 0; + overflow: auto; + background: #fff; + border-top: 1px solid #ddd; +} + +.media-frame-toolbar { + position: absolute; + left: 200px; + right: 0; + z-index: 100; + bottom: 60px; + height: auto; +} + +.media-frame.hide-menu .media-frame-title, +.media-frame.hide-menu .media-frame-router, +.media-frame.hide-menu .media-frame-toolbar, +.media-frame.hide-menu .media-frame-content { + left: 0; +} + +.media-frame.hide-toolbar .media-frame-content { + bottom: 0; +} + +.media-frame.hide-router .media-frame-content { + top: 50px; +} + +.media-frame.hide-menu .media-frame-menu, +.media-frame.hide-menu .media-frame-menu-heading, +.media-frame.hide-router .media-frame-router, +.media-frame.hide-toolbar .media-frame-toolbar { + display: none; +} + +.media-frame-title h1 { + padding: 0 16px; + font-size: 22px; + line-height: 2.27272727; + margin: 0; +} + +.media-frame-menu-heading, +.media-attachments-filter-heading { + position: absolute; + left: 20px; + top: 22px; + margin: 0; + font-size: 13px; + line-height: 1; + /* Above the media-frame-menu. */ + z-index: 151; +} + +.media-attachments-filter-heading { + top: 10px; + left: 16px; +} + +.mode-grid .media-attachments-filter-heading { + top: 0; + left: -9999px; +} + +.mode-grid .media-frame-actions-heading { + display: none; +} + +.wp-core-ui .button.media-frame-menu-toggle { + display: none; +} + +.media-frame-title .suggested-dimensions { + font-size: 14px; + float: right; + margin-right: 20px; +} + +.media-frame-content .crop-content { + height: 100%; +} + +.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon { + margin-right: 300px; +} + +.media-frame-content .crop-content .crop-image { + display: block; + margin: auto; + max-width: 100%; + max-height: 100%; +} + +.media-frame-content .crop-content .upload-errors { + position: absolute; + width: 300px; + top: 50%; + left: 50%; + margin-left: -150px; + margin-right: -150px; + z-index: 600000; +} + +/** + * Iframes + */ +.media-frame .media-iframe { + overflow: hidden; +} + +.media-frame .media-iframe, +.media-frame .media-iframe iframe { + height: 100%; + width: 100%; + border: 0; +} + +/** + * Attachment Browser Filters + */ +.media-frame select.attachment-filters { + margin-top: 11px; + margin-right: 2%; + max-width: 42%; + max-width: calc(48% - 12px); +} + +.media-frame select.attachment-filters:last-of-type { + margin-right: 0; + width: auto; + max-width: 100%; +} + +/** + * Search + */ +.media-frame .search { + margin: 32px 0 0; + padding: 4px; + font-size: 13px; + color: #444; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + -webkit-appearance: none; +} + +.media-toolbar-primary .search { + max-width: 100%; +} + +.media-frame .media-search-input-label { + position: absolute; + left: 0; + top: 10px; + margin: 0; + line-height: 1; +} + +/** + * Attachments + */ +.wp-core-ui .attachments { + margin: 0; + -webkit-overflow-scrolling: touch; +} + +/** + * Attachment + */ +.wp-core-ui .attachment { + position: relative; + float: left; + padding: 8px; + margin: 0; + color: #444; + cursor: pointer; + list-style: none; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 25%; + box-sizing: border-box; +} + +.wp-core-ui .attachment:focus, +.wp-core-ui .selected.attachment:focus, +.wp-core-ui .attachment.details:focus { + box-shadow: + inset 0 0 2px 3px #fff, + inset 0 0 0 7px #5b9dd9; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; + outline-offset: -6px; +} + +.wp-core-ui .selected.attachment { + box-shadow: + inset 0 0 0 5px #fff, + inset 0 0 0 7px #ccc; +} + +.wp-core-ui .attachment.details { + box-shadow: + inset 0 0 0 3px #fff, + inset 0 0 0 7px #0073aa; +} + +.wp-core-ui .attachment-preview { + position: relative; + box-shadow: + inset 0 0 15px rgba(0, 0, 0, 0.1), + inset 0 0 0 1px rgba(0, 0, 0, 0.05); + background: #eee; + cursor: pointer; +} + +.wp-core-ui .attachment-preview:before { + content: ""; + display: block; + padding-top: 100%; +} + +.wp-core-ui .attachment .icon { + margin: 0 auto; + overflow: hidden; +} + +.wp-core-ui .attachment .thumbnail { + overflow: hidden; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: 1; + transition: opacity .1s; +} + +.wp-core-ui .attachment .portrait img { + max-width: 100%; +} + +.wp-core-ui .attachment .landscape img { + max-height: 100%; +} + +.wp-core-ui .attachment .thumbnail:after { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.wp-core-ui .attachment .thumbnail img { + top: 0; + left: 0; +} + +.wp-core-ui .attachment .thumbnail .centered { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + transform: translate( 50%, 50% ); +} + +.wp-core-ui .attachment .thumbnail .centered img { + transform: translate( -50%, -50% ); +} + +.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon { + transform: translate( -50%, -70% ); +} + +.wp-core-ui .attachment .filename { + position: absolute; + left: 0; + right: 0; + bottom: 0; + overflow: hidden; + max-height: 100%; + word-wrap: break-word; + text-align: center; + font-weight: 600; + background: rgba(255, 255, 255, 0.8); + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15); +} + +.wp-core-ui .attachment .filename div { + padding: 5px 10px; +} + +.wp-core-ui .attachment .thumbnail img { + position: absolute; +} + +.wp-core-ui .attachment-close { + display: block; + position: absolute; + top: 5px; + right: 5px; + height: 22px; + width: 22px; + padding: 0; + background-color: #fff; + background-position: -96px 4px; + border-radius: 3px; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3); + transition: none; +} + +.wp-core-ui .attachment-close:hover, +.wp-core-ui .attachment-close:focus { + background-position: -36px 4px; +} + +.wp-core-ui .attachment .check { + display: none; + height: 24px; + width: 24px; + padding: 0; + border: 0; + position: absolute; + z-index: 10; + top: 0; + right: 0; + outline: none; + background: #eee; + cursor: pointer; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba(0, 0, 0, 0.15); +} + +.wp-core-ui .attachment .check .media-modal-icon { + display: block; + background-position: -1px 0; + height: 15px; + width: 15px; + margin: 5px; +} + +.wp-core-ui .attachment .check:hover .media-modal-icon { + background-position: -40px 0; +} + +.wp-core-ui .attachment.selected .check { + display: block; +} + +.wp-core-ui .attachment.details .check, +.wp-core-ui .attachment.selected .check:focus, +.wp-core-ui .media-frame.mode-grid .attachment.selected .check { + background-color: #0073aa; + box-shadow: + 0 0 0 1px #fff, + 0 0 0 2px #0073aa; +} + +.wp-core-ui .attachment.selected .check:focus { + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.wp-core-ui .attachment.details .check .media-modal-icon, +.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon { + background-position: -21px 0; +} + +.wp-core-ui .attachment.details .check:hover .media-modal-icon, +.wp-core-ui .attachment.selected .check:focus .media-modal-icon, +.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon { + background-position: -60px 0; +} + +.wp-core-ui .media-frame .attachment .describe { + position: relative; + display: block; + width: 100%; + margin: 0; + padding: 0 8px; + font-size: 12px; + border-radius: 0; +} + +/** + * Attachments Browser + */ +.media-frame .attachments-browser { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; +} + +.attachments-browser .media-toolbar { + right: 300px; + height: 72px; + background: #fff; +} + +.attachments-browser.hide-sidebar .media-toolbar { + right: 0; +} + +.attachments-browser .media-toolbar-primary > .media-button, +.attachments-browser .media-toolbar-primary > .media-button-group, +.attachments-browser .media-toolbar-secondary > .media-button, +.attachments-browser .media-toolbar-secondary > .media-button-group { + margin: 10px 0; +} + +.attachments-browser .attachments { + padding: 2px 8px 8px; +} + +.attachments-browser .attachments, +.attachments-browser .uploader-inline { + position: absolute; + top: 72px; + left: 0; + right: 300px; + bottom: 0; + overflow: auto; + outline: none; +} + +.attachments-browser .uploader-inline.hidden { + display: none; +} + +.attachments-browser .media-toolbar-primary { + max-width: 33%; +} + +.mode-grid .attachments-browser .media-toolbar-primary { + display: flex; + align-items: center; +} + +.mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary { + display: none; +} + +.attachments-browser .media-toolbar-secondary { + max-width: 66%; +} + +.uploader-inline .close { + background-color: transparent; + border: 0; + cursor: pointer; + height: 48px; + outline: none; + padding: 0; + position: absolute; + right: 2px; + text-align: center; + top: 2px; + width: 48px; + z-index: 1; +} + +.uploader-inline .close:before { + font: normal 30px/1 dashicons !important; + color: #555d66; + display: inline-block; + content: "\f335"; + font-weight: 300; + margin-top: 1px; +} + +.uploader-inline .close:focus { + outline: 1px solid #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); +} + +.attachments-browser.hide-sidebar .attachments, +.attachments-browser.hide-sidebar .uploader-inline { + right: 0; + margin-right: 0; +} + +.attachments-browser .instructions { + display: inline-block; + margin-top: 16px; + line-height: 1.38461538; + font-size: 13px; + color: #666; +} + +.attachments-browser .no-media { + padding: 2em 0 0 2em; +} + +/** + * Progress Bar + */ +.media-progress-bar { + position: relative; + height: 10px; + width: 70%; + margin: 10px auto; + border-radius: 10px; + background: #ddd; + background: rgba(0, 0, 0, 0.1); +} + +.media-progress-bar div { + height: 10px; + min-width: 20px; + width: 0; + background: #0073aa; + border-radius: 10px; + transition: width 300ms; +} + +.media-uploader-status .media-progress-bar { + display: none; + width: 100%; +} + +.uploading.media-uploader-status .media-progress-bar { + display: block; +} + +.attachment-preview .media-progress-bar { + position: absolute; + top: 50%; + left: 15%; + width: 70%; + margin: -5px 0 0 0; +} + +.media-uploader-status { + position: relative; + margin: 0 auto; + padding-bottom: 10px; + max-width: 400px; +} + +.uploader-inline .media-uploader-status h2 { + display: none; +} + +.media-uploader-status .upload-details { + display: none; + font-size: 12px; + color: #666; +} + +.uploading.media-uploader-status .upload-details { + display: block; +} + +.media-uploader-status .upload-detail-separator { + padding: 0 4px; +} + +.media-uploader-status .upload-count { + color: #444; +} + +.media-uploader-status .upload-dismiss-errors, +.media-uploader-status .upload-errors { + display: none; +} + +.errors.media-uploader-status .upload-dismiss-errors, +.errors.media-uploader-status .upload-errors { + display: block; +} + +.media-uploader-status .upload-dismiss-errors { + position: absolute; + top: -3px; + right: -5px; + padding: 5px; + border-radius: 50%; + transition: none; + text-decoration: none; +} + +.uploader-inline .media-uploader-status .upload-dismiss-errors { + top: 2px; + right: 2px; +} + +.media-uploader-status .upload-dismiss-errors::before { + content: "\f153"; + display: block; + font: normal 16px/1 dashicons; + color: #72777c; +} + +.uploader-inline .errors.media-uploader-status .upload-dismiss-errors::before { + color: #606a73; +} + +.errors.media-uploader-status .upload-dismiss-errors:hover::before, +.errors.media-uploader-status .upload-dismiss-errors:focus::before { + color: #c00; +} + +.upload-errors .upload-error { + padding: 12px; + margin-bottom: 12px; + background: #fff; + border-left: 4px solid #dc3232; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); +} + +.uploader-inline .upload-errors .upload-error { + padding: 12px 30px; + background-color: #fbeaea; + box-shadow: none; +} + +.upload-errors .upload-error-filename { + font-weight: 600; +} + +.upload-errors .upload-error-message { + display: block; + padding-top: 8px; + word-wrap: break-word; +} + +/** + * Window and Editor uploaders used to display "drop zones" + */ +.uploader-window, +.wp-editor-wrap .uploader-editor { + top: 0; + left: 0; + right: 0; + bottom: 0; + text-align: center; + display: none; +} + +.uploader-window { + position: fixed; + z-index: 250000; + opacity: 0; /* Only the inline uploader is animated with JS, the editor one isn't */ + transition: opacity 250ms; +} + +.wp-editor-wrap .uploader-editor { + position: absolute; + z-index: 99998; /* under the toolbar */ + background: rgba(150, 150, 150, 0.9); +} + +.uploader-window, +.wp-editor-wrap .uploader-editor.droppable { + background: rgba(0, 86, 132, 0.9); +} + +.uploader-window-content, +.wp-editor-wrap .uploader-editor-content { + position: absolute; + top: 10px; + left: 10px; + right: 10px; + bottom: 10px; + border: 1px dashed #fff; +} + +/* uploader drop-zone title */ +.uploader-window h1, /* Back-compat for pre-5.3 */ +.uploader-window .uploader-editor-title, +.wp-editor-wrap .uploader-editor .uploader-editor-title { + position: absolute; + top: 50%; + left: 0; + right: 0; + transform: translateY(-50%); + font-size: 3em; + line-height: 1.3; + font-weight: 600; + color: #fff; + margin: 0; + padding: 0 10px; +} + +.wp-editor-wrap .uploader-editor .uploader-editor-title { + display: none; +} + +.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title { + display: block; +} + +.uploader-window .media-progress-bar { + margin-top: 20px; + max-width: 300px; + background: transparent; + border-color: #fff; + display: none; +} + +.uploader-window .media-progress-bar div { + background: #fff; +} + +.uploading .uploader-window .media-progress-bar { + display: block; +} + +.media-frame .uploader-inline { + margin-bottom: 20px; + padding: 0; + text-align: center; +} + +.uploader-inline-content { + position: absolute; + top: 30%; + left: 0; + right: 0; +} + +.uploader-inline-content .upload-ui { + margin: 2em 0; +} + +.uploader-inline-content .post-upload-ui { + margin-bottom: 2em; +} + +.uploader-inline .has-upload-message .upload-ui { + margin: 0 0 4em; +} + +.uploader-inline h2 { + font-size: 20px; + line-height: 1.4; + font-weight: 400; + margin: 0; +} + +.uploader-inline .has-upload-message .upload-instructions { + font-size: 14px; + color: #444; + font-weight: 400; +} + +.uploader-inline .drop-instructions { + display: none; +} + +.supports-drag-drop .uploader-inline .drop-instructions { + display: block; +} + +.uploader-inline p { + margin: 0.5em 0; +} + +.uploader-inline .media-progress-bar { + display: none; +} + +.uploading.uploader-inline .media-progress-bar { + display: block; +} + +.uploader-inline .browser { + display: inline-block !important; +} + +/** + * Selection + */ +.media-selection { + position: absolute; + top: 0; + left: 0; + right: 350px; + height: 60px; + padding: 0 0 0 16px; + overflow: hidden; + white-space: nowrap; +} + +.media-selection .selection-info { + display: inline-block; + font-size: 12px; + height: 60px; + margin-right: 10px; + vertical-align: top; +} + +.media-selection.empty, +.media-selection.editing { + display: none; +} + +.media-selection.one .edit-selection { + display: none; +} + +.media-selection .count { + display: block; + padding-top: 12px; + font-size: 14px; + line-height: 1.42857142; + font-weight: 600; +} + +.media-selection .button-link { + float: left; + padding: 1px 8px; + margin: 1px 8px 1px -8px; + line-height: 1.4; + border-right: 1px solid #ddd; + color: #0073aa; + text-decoration: none; +} + +.media-selection .button-link:hover, +.media-selection .button-link:focus { + color: #00a0d2; +} + +.media-selection .button-link:last-child { + border-right: 0; + margin-right: 0; +} + +.selection-info .clear-selection { + color: #bc0b0b; +} + +.selection-info .clear-selection:hover, +.selection-info .clear-selection:focus { + color: #dc3232; +} + +.media-selection .selection-view { + display: inline-block; + vertical-align: top; +} + +.media-selection .attachments { + display: inline-block; + height: 48px; + margin: 6px; + padding: 0; + overflow: hidden; + vertical-align: top; +} + +.media-selection .attachment { + width: 40px; + padding: 0; + margin: 4px; +} + +.media-selection .attachment .thumbnail { + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.media-selection .attachment .icon { + width: 50%; +} + +.media-selection .attachment-preview { + box-shadow: none; + background: none; +} + +.wp-core-ui .media-selection .attachment:focus, +.wp-core-ui .media-selection .selected.attachment:focus, +.wp-core-ui .media-selection .attachment.details:focus { + box-shadow: + 0 0 0 1px #fff, + 0 0 2px 3px #5b9dd9; + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.wp-core-ui .media-selection .selected.attachment { + box-shadow: none; +} + +.wp-core-ui .media-selection .attachment.details { + box-shadow: + 0 0 0 1px #fff, + 0 0 0 3px #0073aa; +} + +.media-selection:after { + content: ""; + display: block; + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 25px; + background-image: linear-gradient(to left, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)); +} + +.media-selection .attachment .filename { + display: none; +} + +/** + * Spinner + */ +.media-frame .spinner { + background: url(../images/spinner.gif) no-repeat; + background-size: 20px 20px; + float: right; + display: inline-block; + visibility: hidden; + opacity: 0.7; + filter: alpha(opacity=70); + width: 20px; + height: 20px; + margin: 0; + vertical-align: middle; +} + +.media-frame.mode-grid .spinner { + margin: 0; + float: none; + vertical-align: middle; +} + +.media-modal .media-toolbar .spinner { + float: none; + vertical-align: bottom; + margin: 0 0 5px 5px; +} + +.media-frame .instructions + .spinner.is-active { + vertical-align: middle; +} + +.media-frame .spinner.is-active { + visibility: visible; +} + +/** + * Attachment Details + */ +.attachment-details { + position: relative; + overflow: auto; +} + +.attachment-details .settings-save-status { + float: right; + text-transform: none; + font-weight: 400; +} + +.attachment-details .settings-save-status .spinner { + float: none; + margin-left: 5px; +} + +.attachment-details .settings-save-status .saved { + display: none; +} + +.attachment-details.save-waiting .settings-save-status .spinner { + visibility: visible; +} + +.attachment-details.save-complete .settings-save-status .saved { + display: inline-block; +} + +.attachment-info { + overflow: hidden; + min-height: 60px; + margin-bottom: 16px; + line-height: 1.5; + color: #666; + border-bottom: 1px solid #ddd; + padding-bottom: 11px; +} + +.attachment-info .filename { + font-weight: 600; + color: #444; + word-wrap: break-word; +} + +.attachment-info .thumbnail { + position: relative; + float: left; + max-width: 120px; + max-height: 120px; + margin-top: 5px; + margin-right: 10px; + margin-bottom: 5px; +} + +.uploading .attachment-info .thumbnail { + width: 120px; + height: 80px; + box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.1); +} + +.uploading .attachment-info .media-progress-bar { + margin-top: 35px; +} + +.attachment-info .thumbnail-image:after { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15); + overflow: hidden; +} + +.attachment-info .thumbnail img { + display: block; + max-width: 120px; + max-height: 120px; + margin: 0 auto; +} + +.attachment-info .details { + float: left; + font-size: 12px; + max-width: 100%; +} + +.attachment-info .edit-attachment, +.attachment-info .delete-attachment, +.attachment-info .trash-attachment, +.attachment-info .untrash-attachment { + display: block; + text-decoration: none; + white-space: nowrap; +} + +.attachment-details.needs-refresh .attachment-info .edit-attachment { + display: none; +} + +.attachment-info .edit-attachment { + display: block; +} + +.media-modal .delete-attachment, +.media-modal .trash-attachment, +.media-modal .untrash-attachment { + display: inline; + padding: 0; + color: #bc0b0b; +} + +.media-modal .delete-attachment:hover, +.media-modal .delete-attachment:focus, +.media-modal .trash-attachment:hover, +.media-modal .trash-attachment:focus, +.media-modal .untrash-attachment:hover, +.media-modal .untrash-attachment:focus { + color: #dc3232; +} + +/** + * Attachment Display Settings + */ +.attachment-display-settings { + width: 100%; + float: left; + overflow: hidden; +} + +.collection-settings { + overflow: hidden; +} + +.collection-settings .setting input[type="checkbox"] { + float: left; + margin-right: 8px; +} + +.collection-settings .setting span, /* Back-compat for pre-5.3 */ +.collection-settings .setting .name { + min-width: inherit; +} + +/** + * Image Editor + */ +.media-modal .imgedit-wrap { + position: static; +} + +.media-modal .imgedit-wrap .imgedit-panel-content { + padding: 16px 16px 0 16px; + position: absolute; + top: 0; + right: 282px; + bottom: 0; + left: 0; + overflow: auto; +} + +/* + * Implementation of bottom padding in overflow content differs across browsers. + * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129 + */ +.media-modal .imgedit-wrap .imgedit-submit { + margin-bottom: 16px; +} + +.media-modal .imgedit-wrap .imgedit-settings { + background: #f3f3f3; + border-left: 1px solid #ddd; + padding: 20px 16px 0; + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 250px; + overflow: auto; +} + +/* + * Implementation of bottom padding in overflow content differs across browsers. + * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129 + */ +.media-modal .imgedit-wrap .imgedit-save-target { + margin: 8px 0 24px; +} + +.media-modal .imgedit-group { + background: none; + border: none; + border-bottom: 1px solid #ddd; + box-shadow: none; + margin: 0; + margin-bottom: 16px; + padding: 0; + padding-bottom: 16px; + position: relative; /* RTL fix, #WP29352 */ +} + +.media-modal .imgedit-group:last-of-type { + border: none; + margin: 0; + padding: 0; +} + +.media-modal .imgedit-group-top { + margin: 0; +} + +.media-modal .imgedit-group-top h2, +.media-modal .imgedit-group-top h2 .button-link { + display: inline-block; + text-transform: uppercase; + font-size: 12px; + color: #666; + margin: 0; + margin-top: 3px; +} + +.media-modal .imgedit-group-top h2 a, +.media-modal .imgedit-group-top h2 .button-link { + text-decoration: none; + color: #666; +} + +/* higher specificity than media.css */ +.wp-core-ui.media-modal .image-editor .imgedit-help-toggle, +.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover, +.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active { + border: 1px solid transparent; + margin: 0; + padding: 0; + background: transparent; + color: #0074a2; + font-size: 20px; + line-height: 1; + cursor: pointer; + box-sizing: content-box; + box-shadow: none; +} + +.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus { + color: #0074a2; + border-color: #5b9dd9; + box-shadow: 0 0 3px rgba(0, 115, 170, 0.8); + /* Only visible in Windows High Contrast mode */ + outline: 2px solid transparent; +} + +.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle { + margin-top: -3px; +} + +.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle { + margin-top: -2px; +} + +.media-modal .imgedit-help-toggled span.dashicons:before { + content: "\f142"; +} + +.media-modal .imgedit-thumbnail-preview { + margin: 10px 8px 0 0; +} + +.imgedit-thumbnail-preview-caption { + display: block; +} + +.media-modal .imgedit-wrap div.updated { + margin: 0; + margin-bottom: 16px; +} + +/** + * Embed from URL and Image Details + */ +.embed-url { + display: block; + position: relative; + padding: 16px; + margin: 0; + z-index: 250; + background: #fff; + font-size: 18px; +} + +.media-frame .embed-url input { + font-size: 18px; + line-height: 1.22222222; /* 22px */ + padding: 12px 40px 12px 14px; /* right padding to leave room for the spinner */ + width: 100%; + min-width: 200px; + box-shadow: inset 2px 2px 4px -2px rgba(0, 0, 0, 0.1); +} + +.media-frame .embed-url input::-ms-clear { + display: none; /* the "x" in IE 11 conflicts with the spinner */ +} + +.media-frame .embed-url .spinner { + position: absolute; + top: 32px; + right: 26px; +} + +.media-frame .embed-loading .embed-url .spinner { + visibility: visible; +} + +.embed-link-settings, +.embed-media-settings { + position: absolute; + top: 70px; + left: 0; + right: 0; + bottom: 0; + padding: 0 16px; + overflow: auto; +} + +/* + * Implementation of bottom padding in overflow content differs across browsers. + * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129 + */ +.embed-link-settings::after, +.embed-media-settings::after { + content: ""; + display: flex; + clear: both; + height: 24px; +} + +.media-embed .embed-link-settings { + /* avoid Firefox to give focus to the embed preview container parent */ + overflow: visible; +} + +.embed-preview img, +.embed-preview iframe, +.embed-preview embed, +.mejs-container video { + max-width: 100%; + vertical-align: middle; +} + +.embed-preview a { + display: inline-block; +} + +.embed-preview img { + display: block; + height: auto; +} + +.mejs-container:focus { + outline: 1px solid #5b9dd9; + box-shadow: 0 0 2px 1px rgba(30, 140, 190, 0.8); +} + +.image-details .media-modal { + left: 140px; + right: 140px; +} + +.image-details .media-frame-title, +.image-details .media-frame-content, +.image-details .media-frame-router { + left: 0; +} + +.image-details .embed-media-settings { + top: 0; + overflow: visible; + padding: 0; +} + +.image-details .embed-media-settings::after { + content: none; +} + +.image-details .embed-media-settings, +.image-details .embed-media-settings div { + box-sizing: border-box; +} + +.image-details .column-settings { + background: #f3f3f3; + border-right: 1px solid #ddd; + min-height: 100%; + width: 55%; + position: absolute; + top: 0; + left: 0; +} + +.image-details .column-settings h2 { + margin: 20px; + padding-top: 20px; + border-top: 1px solid #ddd; + color: #23282d; +} + +.image-details .column-image { + width: 45%; + position: absolute; + left: 55%; + top: 0; +} + +.image-details .image { + margin: 20px; +} + +.image-details .image img { + max-width: 100%; + max-height: 500px; +} + +.image-details .advanced-toggle { + padding: 0; + color: #666; + text-transform: uppercase; + text-decoration: none; +} + +.image-details .advanced-toggle:hover, +.image-details .advanced-toggle:active { + color: #666; +} + +.image-details .advanced-toggle:after { + font: normal 20px/1 dashicons; + speak: none; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\f140"; + display: inline-block; + margin-top: -2px; +} + +.image-details .advanced-visible .advanced-toggle:after { + content: "\f142"; +} + +.image-details .custom-size label, /* Back-compat for pre-5.3 */ +.image-details .custom-size .custom-size-setting { + display: block; + float: left; +} + +.image-details .custom-size .custom-size-setting label { + float: none; +} + +.image-details .custom-size input { + width: 5em; +} + +.image-details .custom-size .sep { + float: left; + margin: 26px 6px 0 6px; +} + +.image-details .custom-size .description { + margin-left: 0; +} + +.media-embed .thumbnail { + max-width: 100%; + max-height: 200px; + position: relative; + float: left; +} + +.media-embed .thumbnail img { + max-height: 200px; + display: block; +} + +.media-embed .thumbnail:after { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.media-embed .setting, +.media-embed .setting-group { + width: 100%; + margin: 10px 0; + float: left; + display: block; + clear: both; +} + +.media-embed .setting-group .setting:not(.checkbox-setting) { + margin: 0; +} + +.media-embed .setting.has-description { + margin-bottom: 5px; +} + +.media-embed .description { + clear: both; + font-style: normal; +} + +.media-embed .content-track + .description { + line-height: 1.4; + /* The !important needs to override a high specificity selector from wp-medialement.css */ + max-width: none !important; +} + +.media-embed .remove-track { + margin-bottom: 10px; +} + +.image-details .embed-media-settings .setting, +.image-details .embed-media-settings .setting-group { + float: none; + width: auto; +} + +.image-details .actions { + margin: 10px 0; +} + +.image-details .hidden { + display: none; +} + +.media-embed .setting input[type="text"], +.media-embed .setting textarea, +.media-embed fieldset { + display: block; + width: 100%; + max-width: 400px; +} + +.image-details .embed-media-settings .setting input[type="text"], +.image-details .embed-media-settings .setting textarea { + max-width: inherit; + width: 70%; +} + +.image-details .embed-media-settings .setting input.link-to-custom, +.image-details .embed-media-settings .link-target, +.image-details .embed-media-settings .custom-size, +.image-details .embed-media-settings .setting-group, +.image-details .description { + margin-left: 27%; + width: 70%; +} + +.image-details .description { + font-style: normal; + margin-top: 0; +} + +.image-details .embed-media-settings .link-target { + margin-top: 16px; +} + +.image-details .checkbox-label, +.audio-details .checkbox-label, +.video-details .checkbox-label { + vertical-align: baseline; +} + +.media-embed .setting input.hidden, +.media-embed .setting textarea.hidden { + display: none; +} + +.media-embed .setting span, /* Back-compat for pre-5.3 */ +.media-embed .setting .name, +.media-embed .setting-group .name { + display: inline-block; + font-size: 13px; + line-height: 1.84615384; + color: #666; +} + +.media-embed .setting span { + display: block; /* Back-compat for pre-5.3 */ + width: 200px; /* Back-compat for pre-5.3 */ +} + +.image-details .embed-media-settings .setting span, /* Back-compat for pre-5.3 */ +.image-details .embed-media-settings .setting .name { + float: left; + width: 25%; + text-align: right; + margin: 8px 1% 0 1%; + line-height: 1.1; +} + +/* Buttons group in IE 11. */ +.media-frame .setting-group .button-group, +.image-details .embed-media-settings .setting .button-group { + width: auto; +} + +.media-embed-sidebar { + position: absolute; + top: 0; + left: 440px; +} + +.advanced-section, +.link-settings { + margin-top: 10px; +} + +/** + * Button groups fix: can be removed together with the Back-compat for pre-5.3 + */ + .media-frame .setting .button-group { + display: flex; + margin: 0 !important; + max-width: none !important; + } + +/** + * Localization + */ +.rtl .media-modal, +.rtl .media-frame, +.rtl .media-frame .search, +.rtl .media-frame input[type="text"], +.rtl .media-frame input[type="password"], +.rtl .media-frame input[type="number"], +.rtl .media-frame input[type="search"], +.rtl .media-frame input[type="email"], +.rtl .media-frame input[type="url"], +.rtl .media-frame input[type="tel"], +.rtl .media-frame textarea, +.rtl .media-frame select { + font-family: Tahoma, sans-serif; +} + +:lang(he-il) .rtl .media-modal, +:lang(he-il) .rtl .media-frame, +:lang(he-il) .rtl .media-frame .search, +:lang(he-il) .rtl .media-frame input[type="text"], +:lang(he-il) .rtl .media-frame input[type="password"], +:lang(he-il) .rtl .media-frame input[type="number"], +:lang(he-il) .rtl .media-frame input[type="search"], +:lang(he-il) .rtl .media-frame input[type="email"], +:lang(he-il) .rtl .media-frame input[type="url"], +:lang(he-il) .rtl .media-frame textarea, +:lang(he-il) .rtl .media-frame select { + font-family: Arial, sans-serif; +} + +/** + * Responsive layout + */ +@media only screen and (max-width: 900px) { + .media-modal .media-frame-title { + height: 40px; + } + + .media-modal .media-frame-title h1 { + line-height: 2.22222222; + font-size: 18px; + } + + .media-modal-close { + width: 42px; + height: 42px; + } + + /* Drop-down menu */ + .media-frame .media-frame-title { + position: static; + padding: 0 44px; + text-align: center; + } + + .media-frame:not(.hide-menu) .media-frame-router, + .media-frame:not(.hide-menu) .media-frame-content, + .media-frame:not(.hide-menu) .media-frame-toolbar { + left: 0; + } + + .media-frame:not(.hide-menu) .media-frame-router { + /* 40 title + (40 - 6) menu toggle button + 6 spacing */ + top: 80px; + } + + .media-frame:not(.hide-menu) .media-frame-content { + /* 80 + room for the tabs */ + top: 114px; + } + + .media-frame.hide-router .media-frame-content { + top: 80px; + } + + .media-frame:not(.hide-menu) .media-frame-menu { + position: static; + width: 0; + } + + .media-frame:not(.hide-menu) .media-menu { + display: none; + width: auto; + max-width: 80%; + overflow: auto; + z-index: 2000; + top: 75px; + left: 50%; + transform: translateX(-50%); + right: auto; + bottom: auto; + padding: 5px 0; + border: 1px solid #ccc; + } + + .media-frame:not(.hide-menu) .media-menu.visible { + display: block; + } + + .media-frame:not(.hide-menu) .media-menu > a { + padding: 12px 16px; + font-size: 16px; + } + + .media-frame:not(.hide-menu) .media-menu .separator { + margin: 5px 10px; + } + + /* Visually hide the menu heading keeping it available to assistive technologies. */ + .media-frame-menu-heading { + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + height: 1px; + overflow: hidden; + padding: 0; + width: 1px; + word-wrap: normal !important; + } + + /* Reveal the menu toggle button. */ + .wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle { + display: inline-flex; + align-items: center; + position: absolute; + left: 50%; + transform: translateX(-50%); + margin: -6px 0 0; + padding: 0 2px 0 12px; + font-size: 0.875rem; + font-weight: 600; + text-decoration: none; + background: transparent; + /* Only for IE11 to vertically align text within the inline-flex button */ + height: 0.1%; + /* Modern browsers */ + min-height: 40px; + } + + .wp-core-ui .button.media-frame-menu-toggle:hover, + .wp-core-ui .button.media-frame-menu-toggle:active { + background: transparent; + transform: none; + } + + .wp-core-ui .button.media-frame-menu-toggle:focus { + /* Only visible in Windows High Contrast mode */ + outline: 1px solid transparent; + } + /* End drop-down menu */ + + .media-sidebar { + width: 230px; + } + + .attachments-browser .attachments, + .attachments-browser .uploader-inline, + .attachments-browser .media-toolbar { + right: 262px; + } + + .media-sidebar .setting, + .attachment-details .setting { + margin: 6px 0px; + } + + .media-sidebar .setting input, + .media-sidebar .setting textarea, + .media-sidebar .setting .name, + .attachment-details .setting input, + .attachment-details .setting textarea, + .attachment-details .setting .name, + .compat-item label span { + float: none; + display: inline-block; + } + + .media-sidebar .setting span, /* Back-compat for pre-5.3 */ + .attachment-details .setting span, /* Back-compat for pre-5.3 */ + .media-sidebar .checkbox-label-inline { + float: none; + } + + .media-sidebar .setting .select-label-inline { + display: inline; + } + + .media-sidebar .setting .name, + .media-sidebar .checkbox-label-inline, + .attachment-details .setting .name, + .compat-item label span { + text-align: inherit; + min-height: 16px; + margin: 0; + padding: 8px 2px 2px; + } + + .media-sidebar .setting .value, + .attachment-details .setting .value { + float: none; + width: auto; + } + + .media-sidebar .setting input[type="text"], + .media-sidebar .setting input[type="password"], + .media-sidebar .setting input[type="email"], + .media-sidebar .setting input[type="number"], + .media-sidebar .setting input[type="search"], + .media-sidebar .setting input[type="tel"], + .media-sidebar .setting input[type="url"], + .media-sidebar .setting textarea, + .media-sidebar .setting select, + .attachment-details .setting input[type="text"], + .attachment-details .setting input[type="password"], + .attachment-details .setting input[type="email"], + .attachment-details .setting input[type="number"], + .attachment-details .setting input[type="search"], + .attachment-details .setting input[type="tel"], + .attachment-details .setting input[type="url"], + .attachment-details .setting textarea, + .attachment-details .setting select, + .attachment-details .setting + .description { + float: none; + width: 98%; + max-width: none; + height: auto; + } + + .media-frame .media-toolbar input[type="search"] { + line-height: 2.25; /* 36px */ + } + + .media-sidebar .setting select.columns, + .attachment-details .setting select.columns { + width: auto; + } + + .media-frame input, + .media-frame textarea, + .media-frame .search { + padding: 3px 6px; + } + + .wp-admin .media-frame select { + min-height: 40px; + font-size: 16px; + line-height: 1.625; + padding: 5px 24px 5px 8px; + } + + .image-details .column-image { + width: 30%; + left: 70%; + } + + .image-details .column-settings { + width: 70%; + } + + .image-details .media-modal { + left: 30px; + right: 30px; + } + + .image-details .embed-media-settings .setting, + .image-details .embed-media-settings .setting-group { + margin: 20px; + } + + .image-details .embed-media-settings .setting span, /* Back-compat for pre-5.3 */ + .image-details .embed-media-settings .setting .name { + float: none; + text-align: left; + width: 100%; + margin-bottom: 4px; + margin-left: 0; + } + + .media-modal .legend-inline { + position: static; + transform: none; + margin-left: 0; + margin-bottom: 6px; + } + + .image-details .embed-media-settings .setting-group .setting { + margin-bottom: 0; + } + + .image-details .embed-media-settings .setting input.link-to-custom, + .image-details .embed-media-settings .setting input[type="text"], + .image-details .embed-media-settings .setting textarea { + width: 100%; + margin-left: 0; + } + + .image-details .embed-media-settings .setting.has-description { + margin-bottom: 5px; + } + + .image-details .description { + width: auto; + margin: 0 20px; + } + + .image-details .embed-media-settings .custom-size { + margin-left: 20px; + } + + .collection-settings .setting input[type="checkbox"] { + float: none; + margin-top: 0; + } + + .media-selection { + min-width: 120px; + } + + .media-selection:after { + background: none; + } + + .media-selection .attachments { + display: none; + } + + .media-modal .attachments-browser .media-toolbar .search { + max-width: 100%; + height: auto; + float: right; + } + + .media-modal .attachments-browser .media-toolbar .attachment-filters { + height: auto; + } + + /* Text inputs need to be 16px, or they force zooming on iOS */ + .media-frame input[type="text"], + .media-frame input[type="password"], + .media-frame input[type="number"], + .media-frame input[type="search"], + .media-frame input[type="email"], + .media-frame input[type="url"], + .media-frame textarea, + .media-frame select { + font-size: 16px; + } + + .media-frame .media-toolbar input[type="search"] { + line-height: 2.3755; /* 38px */ + } + + .media-modal .media-toolbar .spinner { + margin-bottom: 10px; + } +} + +@media screen and (max-width: 782px) { + .attachments-browser .media-toolbar { + height: 82px; + } + + .attachments-browser .attachments, + .attachments-browser .uploader-inline { + top: 82px; + } + + .media-frame-toolbar .media-toolbar { + bottom: -54px; + } +} + +@media screen and (max-width: 782px) { + .mode-grid .attachments-browser .media-toolbar-primary { + display: block; + } +} + +/* Responsive on portrait and landscape */ +@media only screen and (max-width: 640px), screen and (max-height: 400px) { + /* Full-bleed modal */ + .media-modal, + .image-details .media-modal { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + } + + .media-modal-backdrop { + position: fixed; + } + + .media-sidebar { + z-index: 1900; + max-width: 70%; + bottom: 120%; + box-sizing: border-box; + padding-bottom: 0; + } + + .media-sidebar.visible { + bottom: 0; + } + + .attachments-browser .attachments, + .attachments-browser .uploader-inline, + .attachments-browser .media-toolbar { + right: 0; + } + + .image-details .media-frame-title { + display: block; + top: 0; + font-size: 14px; + } + + .image-details .column-image, + .image-details .column-settings { + width: 100%; + position: relative; + left: 0; + } + + .image-details .column-settings { + padding: 4px 0; + } + + /* Media tabs on the top */ + .media-frame-content .media-toolbar .instructions { + display: none; + } +} + +@media only screen and (min-width: 901px) and (max-height: 400px) { + .media-menu, + .media-frame:not(.hide-menu) .media-menu { + top: 0; + padding-top: 44px; + } +} + +@media only screen and (max-width: 480px) { + .wp-core-ui.wp-customizer .media-button { + margin-top: 13px; + } +} + +/** + * HiDPI Displays + */ +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + .wp-core-ui .media-modal-icon { + background-image: url(../images/uploader-icons-2x.png); + background-size: 134px 15px; + } + + .media-frame .spinner { + background-image: url(../images/spinner-2x.gif); + } +} + +.media-frame-content[data-columns="1"] .attachment { + width: 100%; +} + +.media-frame-content[data-columns="2"] .attachment { + width: 50%; +} + +.media-frame-content[data-columns="3"] .attachment { + width: 33.33%; +} + +.media-frame-content[data-columns="4"] .attachment { + width: 25%; +} + +.media-frame-content[data-columns="5"] .attachment { + width: 20%; +} + +.media-frame-content[data-columns="6"] .attachment { + width: 16.66%; +} + +.media-frame-content[data-columns="7"] .attachment { + width: 14.28%; +} + +.media-frame-content[data-columns="8"] .attachment { + width: 12.5%; +} + +.media-frame-content[data-columns="9"] .attachment { + width: 11.11%; +} + +.media-frame-content[data-columns="10"] .attachment { + width: 10%; +} + +.media-frame-content[data-columns="11"] .attachment { + width: 9.09%; +} + +.media-frame-content[data-columns="12"] .attachment { + width: 8.33%; +} diff --git a/wp-includes/css/media-views.min.css b/wp-includes/css/media-views.min.css new file mode 100644 index 0000000..87b2f8e --- /dev/null +++ b/wp-includes/css/media-views.min.css @@ -0,0 +1,9 @@ +/*! This file is auto-generated */ +.media-modal *{box-sizing:content-box}.media-modal input,.media-modal select,.media-modal textarea{box-sizing:border-box}.media-frame,.media-modal{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;-webkit-overflow-scrolling:touch}.media-modal legend{padding:0;font-size:13px}.media-modal label{font-size:13px}.media-modal .legend-inline{position:absolute;transform:translate(-100%,50%);margin-left:-1%;line-height:1.2}.media-frame a{border-bottom:none;color:#0073aa}.media-frame a:active,.media-frame a:hover{color:#00a0d2}.media-frame a:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);color:#124964;outline:1px solid transparent}.media-frame a.button{color:#32373c}.media-frame a.button:hover{color:#23282d}.media-frame a.button-primary,.media-frame a.button-primary:hover{color:#fff}.media-frame input,.media-frame textarea{padding:6px 8px}.media-frame select,.wp-admin .media-frame select{min-height:30px;vertical-align:middle}.media-frame input[type=color],.media-frame input[type=date],.media-frame input[type=datetime-local],.media-frame input[type=datetime],.media-frame input[type=email],.media-frame input[type=month],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=tel],.media-frame input[type=text],.media-frame input[type=time],.media-frame input[type=url],.media-frame input[type=week],.media-frame select,.media-frame textarea{box-shadow:0 0 0 transparent;border-radius:4px;border:1px solid #7e8993;background-color:#fff;color:#32373c;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:13px}.media-frame input[type=date],.media-frame input[type=datetime-local],.media-frame input[type=datetime],.media-frame input[type=email],.media-frame input[type=month],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=tel],.media-frame input[type=text],.media-frame input[type=time],.media-frame input[type=url],.media-frame input[type=week]{padding:0 8px;line-height:2.15384615}.media-frame.mode-grid .wp-filter input[type=search]{font-size:14px;line-height:2}.media-frame input[type=email]:focus,.media-frame input[type=number]:focus,.media-frame input[type=password]:focus,.media-frame input[type=search]:focus,.media-frame input[type=text]:focus,.media-frame input[type=url]:focus,.media-frame select:focus,.media-frame textarea:focus{border-color:#007cba;box-shadow:0 0 0 1px #007cba;outline:2px solid transparent}.media-frame input:disabled,.media-frame input[readonly],.media-frame textarea:disabled,.media-frame textarea[readonly]{background-color:#eee}.media-frame input[type=search]{-webkit-appearance:textfield}.media-frame ::-webkit-input-placeholder{color:#72777c}.media-frame ::-moz-placeholder{color:#72777c;opacity:1}.media-frame :-ms-input-placeholder{color:#72777c}.media-frame .hidden,.media-frame .setting.hidden{display:none}/*! + * jQuery UI Draggable/Sortable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */.ui-draggable-handle,.ui-sortable-handle{touch-action:none}.media-modal{position:fixed;top:30px;left:30px;right:30px;bottom:30px;z-index:160000}.wp-customizer .media-modal{z-index:560000}.media-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:159900}.wp-customizer .media-modal-backdrop{z-index:559900}.media-modal-close{position:absolute;top:0;right:0;width:50px;height:50px;margin:0;padding:0;border:1px solid transparent;background:0 0;color:#666;z-index:1000;cursor:pointer;outline:0;transition:color .1s ease-in-out,background .1s ease-in-out}.media-modal-close:active,.media-modal-close:hover{color:#00a0d2}.media-modal-close:focus{color:#00a0d2;border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8);outline:2px solid transparent}.media-modal-close span.media-modal-icon{background-image:none}.media-modal-close .media-modal-icon:before{content:"\f158";font:normal 20px/1 dashicons;speak:none;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.media-modal-content{position:absolute;top:0;left:0;right:0;bottom:0;overflow:auto;min-height:300px;box-shadow:0 5px 15px rgba(0,0,0,.7);background:#fcfcfc;-webkit-font-smoothing:subpixel-antialiased}.media-modal-content .media-frame select.attachment-filters{margin-top:32px;margin-right:2%;width:42%;width:calc(48% - 12px)}.media-modal-content .attachments-browser .search{width:100%}.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons.png);background-repeat:no-repeat}.media-toolbar{position:absolute;top:0;left:0;right:0;z-index:100;height:60px;padding:0 16px;border:0 solid #ddd;overflow:hidden}.media-frame-toolbar .media-toolbar{top:auto;bottom:-47px;height:auto;overflow:visible;border-top:1px solid #ddd}.media-toolbar-primary{float:right;height:100%;position:relative}.media-toolbar-secondary{float:left;height:100%}.media-toolbar-primary>.media-button,.media-toolbar-primary>.media-button-group{margin-left:10px;float:left;margin-top:15px}.media-toolbar-secondary>.media-button,.media-toolbar-secondary>.media-button-group{margin-right:10px;margin-top:15px}.media-sidebar{position:absolute;top:0;right:0;bottom:0;width:267px;padding:0 16px;z-index:75;background:#f3f3f3;border-left:1px solid #ddd;overflow:auto;-webkit-overflow-scrolling:touch}.media-sidebar::after{content:"";display:flex;clear:both;height:24px}.hide-toolbar .media-sidebar{bottom:0}.image-details h2,.media-sidebar h2{position:relative;font-weight:600;text-transform:uppercase;font-size:12px;color:#666;margin:24px 0 8px}.attachment-details .setting,.media-sidebar .setting{display:block;float:left;width:100%;margin:0 0 10px}.media-sidebar .collection-settings .setting{margin:1px 0}.attachment-details .setting.has-description,.media-sidebar .setting.has-description{margin-bottom:5px}.media-sidebar .setting .link-to-custom{margin:3px 2px 0}.attachment-details .setting .name,.attachment-details .setting span,.media-sidebar .setting .name,.media-sidebar .setting .value,.media-sidebar .setting span{min-width:30%;margin-right:4%;font-size:12px;text-align:right;word-wrap:break-word}.media-sidebar .setting .name{max-width:80px}.media-sidebar .setting .value{text-align:left}.media-sidebar .setting select{max-width:65%}.attachment-details .field input[type=checkbox],.attachment-details .field input[type=radio],.attachment-details .setting input[type=checkbox],.attachment-details .setting input[type=radio],.media-sidebar .field input[type=checkbox],.media-sidebar .field input[type=radio],.media-sidebar .setting input[type=checkbox],.media-sidebar .setting input[type=radio]{float:none;margin:8px 3px 0;padding:0}.attachment-details .setting .name,.attachment-details .setting .value,.attachment-details .setting span,.compat-item label span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting .name,.media-sidebar .setting .value,.media-sidebar .setting span{float:left;min-height:22px;padding-top:8px;line-height:1.33333333;font-weight:400;color:#666}.media-sidebar .checkbox-label-inline{font-size:12px}.compat-item label span{text-align:right}.attachment-details .setting .value,.attachment-details .setting input[type=email],.attachment-details .setting input[type=number],.attachment-details .setting input[type=password],.attachment-details .setting input[type=search],.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=url],.attachment-details .setting textarea,.attachment-details .setting+.description,.media-sidebar .setting .value,.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=url],.media-sidebar .setting textarea{box-sizing:border-box;margin:1px;width:65%;float:right}.attachment-details .setting .value,.attachment-details .setting+.description,.media-sidebar .setting .value{margin:0 1px;text-align:left}.attachment-details .setting+.description{clear:both;font-size:12px;font-style:normal;margin-bottom:10px}.attachment-details .setting textarea,.compat-item .field textarea,.media-sidebar .setting textarea{height:62px;resize:vertical}.compat-item{float:left;width:100%;overflow:hidden}.compat-item table{width:100%;table-layout:fixed;border-spacing:0;border:0}.compat-item tr{padding:2px 0;display:block;overflow:hidden}.compat-item .field,.compat-item .label{display:block;margin:0;padding:0}.compat-item .label{min-width:30%;margin-right:4%;float:left;text-align:right}.compat-item .label span{display:block;width:100%}.compat-item .field{float:right;width:65%;margin:1px}.compat-item .field input[type=email],.compat-item .field input[type=number],.compat-item .field input[type=password],.compat-item .field input[type=search],.compat-item .field input[type=tel],.compat-item .field input[type=text],.compat-item .field input[type=url],.compat-item .field textarea{width:100%;margin:0;box-sizing:border-box}.sidebar-for-errors .attachment-details,.sidebar-for-errors .compat-item,.sidebar-for-errors .media-sidebar .media-progress-bar,.sidebar-for-errors .upload-details{display:none!important}.media-menu{position:absolute;top:0;left:0;right:0;bottom:0;margin:0;padding:50px 0 10px;background:#f3f3f3;border-right-width:1px;border-right-style:solid;border-right-color:#ccc;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-menu .media-menu-item{display:block;box-sizing:border-box;width:100%;position:relative;border:0;margin:0;padding:8px 20px;font-size:14px;line-height:1.28571428;background:0 0;color:#0073aa;text-align:left;text-decoration:none;cursor:pointer}.media-menu .media-menu-item:hover{background:rgba(0,0,0,.04)}.media-menu .media-menu-item:active{color:#0073aa;outline:0}.media-menu .active,.media-menu .active:hover{color:#23282d;font-weight:600}.media-menu .media-menu-item:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);color:#124964;outline:1px solid transparent}.media-menu .separator{height:0;margin:12px 20px;padding:0;border-top:1px solid #ddd}.media-router{position:relative;padding:0 6px;margin:0;clear:both}.media-router .media-menu-item{position:relative;float:left;border:0;margin:0;padding:8px 10px 9px;height:18px;line-height:1.28571428;font-size:14px;text-decoration:none;background:0 0;cursor:pointer;transition:none}.media-router .media-menu-item:last-child{border-right:0}.media-router .media-menu-item:active,.media-router .media-menu-item:hover{color:#0073aa}.media-router .active,.media-router .active:hover{color:#23282d}.media-router .media-menu-item:focus{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);color:#124964;outline:1px solid transparent}.media-router .active,.media-router .media-menu-item.active:last-child{margin:-1px -1px 0;background:#fff;border:1px solid #ddd;border-bottom:none}.media-router .active:after{display:none}.media-frame{overflow:hidden;position:absolute;top:0;left:0;right:0;bottom:0}.media-frame-menu{position:absolute;top:0;left:0;bottom:0;width:200px;z-index:150}.media-frame-title{position:absolute;top:0;left:200px;right:0;height:50px;z-index:200}.media-frame-router{position:absolute;top:50px;left:200px;right:0;height:36px;z-index:200}.media-frame-content{position:absolute;top:84px;left:200px;right:0;bottom:61px;height:auto;width:auto;margin:0;overflow:auto;background:#fff;border-top:1px solid #ddd}.media-frame-toolbar{position:absolute;left:200px;right:0;z-index:100;bottom:60px;height:auto}.media-frame.hide-menu .media-frame-content,.media-frame.hide-menu .media-frame-router,.media-frame.hide-menu .media-frame-title,.media-frame.hide-menu .media-frame-toolbar{left:0}.media-frame.hide-toolbar .media-frame-content{bottom:0}.media-frame.hide-router .media-frame-content{top:50px}.media-frame.hide-menu .media-frame-menu,.media-frame.hide-menu .media-frame-menu-heading,.media-frame.hide-router .media-frame-router,.media-frame.hide-toolbar .media-frame-toolbar{display:none}.media-frame-title h1{padding:0 16px;font-size:22px;line-height:2.27272727;margin:0}.media-attachments-filter-heading,.media-frame-menu-heading{position:absolute;left:20px;top:22px;margin:0;font-size:13px;line-height:1;z-index:151}.media-attachments-filter-heading{top:10px;left:16px}.mode-grid .media-attachments-filter-heading{top:0;left:-9999px}.mode-grid .media-frame-actions-heading{display:none}.wp-core-ui .button.media-frame-menu-toggle{display:none}.media-frame-title .suggested-dimensions{font-size:14px;float:right;margin-right:20px}.media-frame-content .crop-content{height:100%}.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon{margin-right:300px}.media-frame-content .crop-content .crop-image{display:block;margin:auto;max-width:100%;max-height:100%}.media-frame-content .crop-content .upload-errors{position:absolute;width:300px;top:50%;left:50%;margin-left:-150px;margin-right:-150px;z-index:600000}.media-frame .media-iframe{overflow:hidden}.media-frame .media-iframe,.media-frame .media-iframe iframe{height:100%;width:100%;border:0}.media-frame select.attachment-filters{margin-top:11px;margin-right:2%;max-width:42%;max-width:calc(48% - 12px)}.media-frame select.attachment-filters:last-of-type{margin-right:0;width:auto;max-width:100%}.media-frame .search{margin:32px 0 0;padding:4px;font-size:13px;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;-webkit-appearance:none}.media-toolbar-primary .search{max-width:100%}.media-frame .media-search-input-label{position:absolute;left:0;top:10px;margin:0;line-height:1}.wp-core-ui .attachments{margin:0;-webkit-overflow-scrolling:touch}.wp-core-ui .attachment{position:relative;float:left;padding:8px;margin:0;color:#444;cursor:pointer;list-style:none;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:25%;box-sizing:border-box}.wp-core-ui .attachment.details:focus,.wp-core-ui .attachment:focus,.wp-core-ui .selected.attachment:focus{box-shadow:inset 0 0 2px 3px #fff,inset 0 0 0 7px #5b9dd9;outline:2px solid transparent;outline-offset:-6px}.wp-core-ui .selected.attachment{box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 7px #ccc}.wp-core-ui .attachment.details{box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #0073aa}.wp-core-ui .attachment-preview{position:relative;box-shadow:inset 0 0 15px rgba(0,0,0,.1),inset 0 0 0 1px rgba(0,0,0,.05);background:#eee;cursor:pointer}.wp-core-ui .attachment-preview:before{content:"";display:block;padding-top:100%}.wp-core-ui .attachment .icon{margin:0 auto;overflow:hidden}.wp-core-ui .attachment .thumbnail{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;opacity:1;transition:opacity .1s}.wp-core-ui .attachment .portrait img{max-width:100%}.wp-core-ui .attachment .landscape img{max-height:100%}.wp-core-ui .attachment .thumbnail:after{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.wp-core-ui .attachment .thumbnail img{top:0;left:0}.wp-core-ui .attachment .thumbnail .centered{position:absolute;top:0;left:0;width:100%;height:100%;transform:translate(50%,50%)}.wp-core-ui .attachment .thumbnail .centered img{transform:translate(-50%,-50%)}.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon{transform:translate(-50%,-70%)}.wp-core-ui .attachment .filename{position:absolute;left:0;right:0;bottom:0;overflow:hidden;max-height:100%;word-wrap:break-word;text-align:center;font-weight:600;background:rgba(255,255,255,.8);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.wp-core-ui .attachment .filename div{padding:5px 10px}.wp-core-ui .attachment .thumbnail img{position:absolute}.wp-core-ui .attachment-close{display:block;position:absolute;top:5px;right:5px;height:22px;width:22px;padding:0;background-color:#fff;background-position:-96px 4px;border-radius:3px;box-shadow:0 0 0 1px rgba(0,0,0,.3);transition:none}.wp-core-ui .attachment-close:focus,.wp-core-ui .attachment-close:hover{background-position:-36px 4px}.wp-core-ui .attachment .check{display:none;height:24px;width:24px;padding:0;border:0;position:absolute;z-index:10;top:0;right:0;outline:0;background:#eee;cursor:pointer;box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,0,0,.15)}.wp-core-ui .attachment .check .media-modal-icon{display:block;background-position:-1px 0;height:15px;width:15px;margin:5px}.wp-core-ui .attachment .check:hover .media-modal-icon{background-position:-40px 0}.wp-core-ui .attachment.selected .check{display:block}.wp-core-ui .attachment.details .check,.wp-core-ui .attachment.selected .check:focus,.wp-core-ui .media-frame.mode-grid .attachment.selected .check{background-color:#0073aa;box-shadow:0 0 0 1px #fff,0 0 0 2px #0073aa}.wp-core-ui .attachment.selected .check:focus{outline:2px solid transparent}.wp-core-ui .attachment.details .check .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon{background-position:-21px 0}.wp-core-ui .attachment.details .check:hover .media-modal-icon,.wp-core-ui .attachment.selected .check:focus .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon{background-position:-60px 0}.wp-core-ui .media-frame .attachment .describe{position:relative;display:block;width:100%;margin:0;padding:0 8px;font-size:12px;border-radius:0}.media-frame .attachments-browser{position:relative;width:100%;height:100%;overflow:hidden}.attachments-browser .media-toolbar{right:300px;height:72px;background:#fff}.attachments-browser.hide-sidebar .media-toolbar{right:0}.attachments-browser .media-toolbar-primary>.media-button,.attachments-browser .media-toolbar-primary>.media-button-group,.attachments-browser .media-toolbar-secondary>.media-button,.attachments-browser .media-toolbar-secondary>.media-button-group{margin:10px 0}.attachments-browser .attachments{padding:2px 8px 8px}.attachments-browser .attachments,.attachments-browser .uploader-inline{position:absolute;top:72px;left:0;right:300px;bottom:0;overflow:auto;outline:0}.attachments-browser .uploader-inline.hidden{display:none}.attachments-browser .media-toolbar-primary{max-width:33%}.mode-grid .attachments-browser .media-toolbar-primary{display:flex;align-items:center}.mode-grid .attachments-browser .media-toolbar-mode-select .media-toolbar-primary{display:none}.attachments-browser .media-toolbar-secondary{max-width:66%}.uploader-inline .close{background-color:transparent;border:0;cursor:pointer;height:48px;outline:0;padding:0;position:absolute;right:2px;text-align:center;top:2px;width:48px;z-index:1}.uploader-inline .close:before{font:normal 30px/1 dashicons!important;color:#555d66;display:inline-block;content:"\f335";font-weight:300;margin-top:1px}.uploader-inline .close:focus{outline:1px solid #5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8)}.attachments-browser.hide-sidebar .attachments,.attachments-browser.hide-sidebar .uploader-inline{right:0;margin-right:0}.attachments-browser .instructions{display:inline-block;margin-top:16px;line-height:1.38461538;font-size:13px;color:#666}.attachments-browser .no-media{padding:2em 0 0 2em}.media-progress-bar{position:relative;height:10px;width:70%;margin:10px auto;border-radius:10px;background:#ddd;background:rgba(0,0,0,.1)}.media-progress-bar div{height:10px;min-width:20px;width:0;background:#0073aa;border-radius:10px;transition:width .3s}.media-uploader-status .media-progress-bar{display:none;width:100%}.uploading.media-uploader-status .media-progress-bar{display:block}.attachment-preview .media-progress-bar{position:absolute;top:50%;left:15%;width:70%;margin:-5px 0 0 0}.media-uploader-status{position:relative;margin:0 auto;padding-bottom:10px;max-width:400px}.uploader-inline .media-uploader-status h2{display:none}.media-uploader-status .upload-details{display:none;font-size:12px;color:#666}.uploading.media-uploader-status .upload-details{display:block}.media-uploader-status .upload-detail-separator{padding:0 4px}.media-uploader-status .upload-count{color:#444}.media-uploader-status .upload-dismiss-errors,.media-uploader-status .upload-errors{display:none}.errors.media-uploader-status .upload-dismiss-errors,.errors.media-uploader-status .upload-errors{display:block}.media-uploader-status .upload-dismiss-errors{position:absolute;top:-3px;right:-5px;padding:5px;border-radius:50%;transition:none;text-decoration:none}.uploader-inline .media-uploader-status .upload-dismiss-errors{top:2px;right:2px}.media-uploader-status .upload-dismiss-errors::before{content:"\f153";display:block;font:normal 16px/1 dashicons;color:#72777c}.uploader-inline .errors.media-uploader-status .upload-dismiss-errors::before{color:#606a73}.errors.media-uploader-status .upload-dismiss-errors:focus::before,.errors.media-uploader-status .upload-dismiss-errors:hover::before{color:#c00}.upload-errors .upload-error{padding:12px;margin-bottom:12px;background:#fff;border-left:4px solid #dc3232;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.uploader-inline .upload-errors .upload-error{padding:12px 30px;background-color:#fbeaea;box-shadow:none}.upload-errors .upload-error-filename{font-weight:600}.upload-errors .upload-error-message{display:block;padding-top:8px;word-wrap:break-word}.uploader-window,.wp-editor-wrap .uploader-editor{top:0;left:0;right:0;bottom:0;text-align:center;display:none}.uploader-window{position:fixed;z-index:250000;opacity:0;transition:opacity 250ms}.wp-editor-wrap .uploader-editor{position:absolute;z-index:99998;background:rgba(150,150,150,.9)}.uploader-window,.wp-editor-wrap .uploader-editor.droppable{background:rgba(0,86,132,.9)}.uploader-window-content,.wp-editor-wrap .uploader-editor-content{position:absolute;top:10px;left:10px;right:10px;bottom:10px;border:1px dashed #fff}.uploader-window .uploader-editor-title,.uploader-window h1,.wp-editor-wrap .uploader-editor .uploader-editor-title{position:absolute;top:50%;left:0;right:0;transform:translateY(-50%);font-size:3em;line-height:1.3;font-weight:600;color:#fff;margin:0;padding:0 10px}.wp-editor-wrap .uploader-editor .uploader-editor-title{display:none}.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title{display:block}.uploader-window .media-progress-bar{margin-top:20px;max-width:300px;background:0 0;border-color:#fff;display:none}.uploader-window .media-progress-bar div{background:#fff}.uploading .uploader-window .media-progress-bar{display:block}.media-frame .uploader-inline{margin-bottom:20px;padding:0;text-align:center}.uploader-inline-content{position:absolute;top:30%;left:0;right:0}.uploader-inline-content .upload-ui{margin:2em 0}.uploader-inline-content .post-upload-ui{margin-bottom:2em}.uploader-inline .has-upload-message .upload-ui{margin:0 0 4em}.uploader-inline h2{font-size:20px;line-height:1.4;font-weight:400;margin:0}.uploader-inline .has-upload-message .upload-instructions{font-size:14px;color:#444;font-weight:400}.uploader-inline .drop-instructions{display:none}.supports-drag-drop .uploader-inline .drop-instructions{display:block}.uploader-inline p{margin:.5em 0}.uploader-inline .media-progress-bar{display:none}.uploading.uploader-inline .media-progress-bar{display:block}.uploader-inline .browser{display:inline-block!important}.media-selection{position:absolute;top:0;left:0;right:350px;height:60px;padding:0 0 0 16px;overflow:hidden;white-space:nowrap}.media-selection .selection-info{display:inline-block;font-size:12px;height:60px;margin-right:10px;vertical-align:top}.media-selection.editing,.media-selection.empty{display:none}.media-selection.one .edit-selection{display:none}.media-selection .count{display:block;padding-top:12px;font-size:14px;line-height:1.42857142;font-weight:600}.media-selection .button-link{float:left;padding:1px 8px;margin:1px 8px 1px -8px;line-height:1.4;border-right:1px solid #ddd;color:#0073aa;text-decoration:none}.media-selection .button-link:focus,.media-selection .button-link:hover{color:#00a0d2}.media-selection .button-link:last-child{border-right:0;margin-right:0}.selection-info .clear-selection{color:#bc0b0b}.selection-info .clear-selection:focus,.selection-info .clear-selection:hover{color:#dc3232}.media-selection .selection-view{display:inline-block;vertical-align:top}.media-selection .attachments{display:inline-block;height:48px;margin:6px;padding:0;overflow:hidden;vertical-align:top}.media-selection .attachment{width:40px;padding:0;margin:4px}.media-selection .attachment .thumbnail{top:0;right:0;bottom:0;left:0}.media-selection .attachment .icon{width:50%}.media-selection .attachment-preview{box-shadow:none;background:0 0}.wp-core-ui .media-selection .attachment.details:focus,.wp-core-ui .media-selection .attachment:focus,.wp-core-ui .media-selection .selected.attachment:focus{box-shadow:0 0 0 1px #fff,0 0 2px 3px #5b9dd9;outline:2px solid transparent}.wp-core-ui .media-selection .selected.attachment{box-shadow:none}.wp-core-ui .media-selection .attachment.details{box-shadow:0 0 0 1px #fff,0 0 0 3px #0073aa}.media-selection:after{content:"";display:block;position:absolute;top:0;right:0;bottom:0;width:25px;background-image:linear-gradient(to left,rgba(255,255,255,1),rgba(255,255,255,0))}.media-selection .attachment .filename{display:none}.media-frame .spinner{background:url(../images/spinner.gif) no-repeat;background-size:20px 20px;float:right;display:inline-block;visibility:hidden;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:0;vertical-align:middle}.media-frame.mode-grid .spinner{margin:0;float:none;vertical-align:middle}.media-modal .media-toolbar .spinner{float:none;vertical-align:bottom;margin:0 0 5px 5px}.media-frame .instructions+.spinner.is-active{vertical-align:middle}.media-frame .spinner.is-active{visibility:visible}.attachment-details{position:relative;overflow:auto}.attachment-details .settings-save-status{float:right;text-transform:none;font-weight:400}.attachment-details .settings-save-status .spinner{float:none;margin-left:5px}.attachment-details .settings-save-status .saved{display:none}.attachment-details.save-waiting .settings-save-status .spinner{visibility:visible}.attachment-details.save-complete .settings-save-status .saved{display:inline-block}.attachment-info{overflow:hidden;min-height:60px;margin-bottom:16px;line-height:1.5;color:#666;border-bottom:1px solid #ddd;padding-bottom:11px}.attachment-info .filename{font-weight:600;color:#444;word-wrap:break-word}.attachment-info .thumbnail{position:relative;float:left;max-width:120px;max-height:120px;margin-top:5px;margin-right:10px;margin-bottom:5px}.uploading .attachment-info .thumbnail{width:120px;height:80px;box-shadow:inset 0 0 15px rgba(0,0,0,.1)}.uploading .attachment-info .media-progress-bar{margin-top:35px}.attachment-info .thumbnail-image:after{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);overflow:hidden}.attachment-info .thumbnail img{display:block;max-width:120px;max-height:120px;margin:0 auto}.attachment-info .details{float:left;font-size:12px;max-width:100%}.attachment-info .delete-attachment,.attachment-info .edit-attachment,.attachment-info .trash-attachment,.attachment-info .untrash-attachment{display:block;text-decoration:none;white-space:nowrap}.attachment-details.needs-refresh .attachment-info .edit-attachment{display:none}.attachment-info .edit-attachment{display:block}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment{display:inline;padding:0;color:#bc0b0b}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover{color:#dc3232}.attachment-display-settings{width:100%;float:left;overflow:hidden}.collection-settings{overflow:hidden}.collection-settings .setting input[type=checkbox]{float:left;margin-right:8px}.collection-settings .setting .name,.collection-settings .setting span{min-width:inherit}.media-modal .imgedit-wrap{position:static}.media-modal .imgedit-wrap .imgedit-panel-content{padding:16px 16px 0 16px;position:absolute;top:0;right:282px;bottom:0;left:0;overflow:auto}.media-modal .imgedit-wrap .imgedit-submit{margin-bottom:16px}.media-modal .imgedit-wrap .imgedit-settings{background:#f3f3f3;border-left:1px solid #ddd;padding:20px 16px 0;position:absolute;top:0;right:0;bottom:0;width:250px;overflow:auto}.media-modal .imgedit-wrap .imgedit-save-target{margin:8px 0 24px}.media-modal .imgedit-group{background:0 0;border:none;border-bottom:1px solid #ddd;box-shadow:none;margin:0;margin-bottom:16px;padding:0;padding-bottom:16px;position:relative}.media-modal .imgedit-group:last-of-type{border:none;margin:0;padding:0}.media-modal .imgedit-group-top{margin:0}.media-modal .imgedit-group-top h2,.media-modal .imgedit-group-top h2 .button-link{display:inline-block;text-transform:uppercase;font-size:12px;color:#666;margin:0;margin-top:3px}.media-modal .imgedit-group-top h2 .button-link,.media-modal .imgedit-group-top h2 a{text-decoration:none;color:#666}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover{border:1px solid transparent;margin:0;padding:0;background:0 0;color:#0074a2;font-size:20px;line-height:1;cursor:pointer;box-sizing:content-box;box-shadow:none}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus{color:#0074a2;border-color:#5b9dd9;box-shadow:0 0 3px rgba(0,115,170,.8);outline:2px solid transparent}.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle{margin-top:-3px}.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle{margin-top:-2px}.media-modal .imgedit-help-toggled span.dashicons:before{content:"\f142"}.media-modal .imgedit-thumbnail-preview{margin:10px 8px 0 0}.imgedit-thumbnail-preview-caption{display:block}.media-modal .imgedit-wrap div.updated{margin:0;margin-bottom:16px}.embed-url{display:block;position:relative;padding:16px;margin:0;z-index:250;background:#fff;font-size:18px}.media-frame .embed-url input{font-size:18px;line-height:1.22222222;padding:12px 40px 12px 14px;width:100%;min-width:200px;box-shadow:inset 2px 2px 4px -2px rgba(0,0,0,.1)}.media-frame .embed-url input::-ms-clear{display:none}.media-frame .embed-url .spinner{position:absolute;top:32px;right:26px}.media-frame .embed-loading .embed-url .spinner{visibility:visible}.embed-link-settings,.embed-media-settings{position:absolute;top:70px;left:0;right:0;bottom:0;padding:0 16px;overflow:auto}.embed-link-settings::after,.embed-media-settings::after{content:"";display:flex;clear:both;height:24px}.media-embed .embed-link-settings{overflow:visible}.embed-preview embed,.embed-preview iframe,.embed-preview img,.mejs-container video{max-width:100%;vertical-align:middle}.embed-preview a{display:inline-block}.embed-preview img{display:block;height:auto}.mejs-container:focus{outline:1px solid #5b9dd9;box-shadow:0 0 2px 1px rgba(30,140,190,.8)}.image-details .media-modal{left:140px;right:140px}.image-details .media-frame-content,.image-details .media-frame-router,.image-details .media-frame-title{left:0}.image-details .embed-media-settings{top:0;overflow:visible;padding:0}.image-details .embed-media-settings::after{content:none}.image-details .embed-media-settings,.image-details .embed-media-settings div{box-sizing:border-box}.image-details .column-settings{background:#f3f3f3;border-right:1px solid #ddd;min-height:100%;width:55%;position:absolute;top:0;left:0}.image-details .column-settings h2{margin:20px;padding-top:20px;border-top:1px solid #ddd;color:#23282d}.image-details .column-image{width:45%;position:absolute;left:55%;top:0}.image-details .image{margin:20px}.image-details .image img{max-width:100%;max-height:500px}.image-details .advanced-toggle{padding:0;color:#666;text-transform:uppercase;text-decoration:none}.image-details .advanced-toggle:active,.image-details .advanced-toggle:hover{color:#666}.image-details .advanced-toggle:after{font:normal 20px/1 dashicons;speak:none;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f140";display:inline-block;margin-top:-2px}.image-details .advanced-visible .advanced-toggle:after{content:"\f142"}.image-details .custom-size .custom-size-setting,.image-details .custom-size label{display:block;float:left}.image-details .custom-size .custom-size-setting label{float:none}.image-details .custom-size input{width:5em}.image-details .custom-size .sep{float:left;margin:26px 6px 0 6px}.image-details .custom-size .description{margin-left:0}.media-embed .thumbnail{max-width:100%;max-height:200px;position:relative;float:left}.media-embed .thumbnail img{max-height:200px;display:block}.media-embed .thumbnail:after{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.media-embed .setting,.media-embed .setting-group{width:100%;margin:10px 0;float:left;display:block;clear:both}.media-embed .setting-group .setting:not(.checkbox-setting){margin:0}.media-embed .setting.has-description{margin-bottom:5px}.media-embed .description{clear:both;font-style:normal}.media-embed .content-track+.description{line-height:1.4;max-width:none!important}.media-embed .remove-track{margin-bottom:10px}.image-details .embed-media-settings .setting,.image-details .embed-media-settings .setting-group{float:none;width:auto}.image-details .actions{margin:10px 0}.image-details .hidden{display:none}.media-embed .setting input[type=text],.media-embed .setting textarea,.media-embed fieldset{display:block;width:100%;max-width:400px}.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{max-width:inherit;width:70%}.image-details .description,.image-details .embed-media-settings .custom-size,.image-details .embed-media-settings .link-target,.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting-group{margin-left:27%;width:70%}.image-details .description{font-style:normal;margin-top:0}.image-details .embed-media-settings .link-target{margin-top:16px}.audio-details .checkbox-label,.image-details .checkbox-label,.video-details .checkbox-label{vertical-align:baseline}.media-embed .setting input.hidden,.media-embed .setting textarea.hidden{display:none}.media-embed .setting .name,.media-embed .setting span,.media-embed .setting-group .name{display:inline-block;font-size:13px;line-height:1.84615384;color:#666}.media-embed .setting span{display:block;width:200px}.image-details .embed-media-settings .setting .name,.image-details .embed-media-settings .setting span{float:left;width:25%;text-align:right;margin:8px 1% 0 1%;line-height:1.1}.image-details .embed-media-settings .setting .button-group,.media-frame .setting-group .button-group{width:auto}.media-embed-sidebar{position:absolute;top:0;left:440px}.advanced-section,.link-settings{margin-top:10px}.media-frame .setting .button-group{display:flex;margin:0!important;max-width:none!important}.rtl .media-frame,.rtl .media-frame .search,.rtl .media-frame input[type=email],.rtl .media-frame input[type=number],.rtl .media-frame input[type=password],.rtl .media-frame input[type=search],.rtl .media-frame input[type=tel],.rtl .media-frame input[type=text],.rtl .media-frame input[type=url],.rtl .media-frame select,.rtl .media-frame textarea,.rtl .media-modal{font-family:Tahoma,sans-serif}:lang(he-il) .rtl .media-frame,:lang(he-il) .rtl .media-frame .search,:lang(he-il) .rtl .media-frame input[type=email],:lang(he-il) .rtl .media-frame input[type=number],:lang(he-il) .rtl .media-frame input[type=password],:lang(he-il) .rtl .media-frame input[type=search],:lang(he-il) .rtl .media-frame input[type=text],:lang(he-il) .rtl .media-frame input[type=url],:lang(he-il) .rtl .media-frame select,:lang(he-il) .rtl .media-frame textarea,:lang(he-il) .rtl .media-modal{font-family:Arial,sans-serif}@media only screen and (max-width:900px){.media-modal .media-frame-title{height:40px}.media-modal .media-frame-title h1{line-height:2.22222222;font-size:18px}.media-modal-close{width:42px;height:42px}.media-frame .media-frame-title{position:static;padding:0 44px;text-align:center}.media-frame:not(.hide-menu) .media-frame-content,.media-frame:not(.hide-menu) .media-frame-router,.media-frame:not(.hide-menu) .media-frame-toolbar{left:0}.media-frame:not(.hide-menu) .media-frame-router{top:80px}.media-frame:not(.hide-menu) .media-frame-content{top:114px}.media-frame.hide-router .media-frame-content{top:80px}.media-frame:not(.hide-menu) .media-frame-menu{position:static;width:0}.media-frame:not(.hide-menu) .media-menu{display:none;width:auto;max-width:80%;overflow:auto;z-index:2000;top:75px;left:50%;transform:translateX(-50%);right:auto;bottom:auto;padding:5px 0;border:1px solid #ccc}.media-frame:not(.hide-menu) .media-menu.visible{display:block}.media-frame:not(.hide-menu) .media-menu>a{padding:12px 16px;font-size:16px}.media-frame:not(.hide-menu) .media-menu .separator{margin:5px 10px}.media-frame-menu-heading{clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;width:1px;word-wrap:normal!important}.wp-core-ui .media-frame:not(.hide-menu) .button.media-frame-menu-toggle{display:inline-flex;align-items:center;position:absolute;left:50%;transform:translateX(-50%);margin:-6px 0 0;padding:0 2px 0 12px;font-size:.875rem;font-weight:600;text-decoration:none;background:0 0;height:.1%;min-height:40px}.wp-core-ui .button.media-frame-menu-toggle:active,.wp-core-ui .button.media-frame-menu-toggle:hover{background:0 0;transform:none}.wp-core-ui .button.media-frame-menu-toggle:focus{outline:1px solid transparent}.media-sidebar{width:230px}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline{right:262px}.attachment-details .setting,.media-sidebar .setting{margin:6px 0}.attachment-details .setting .name,.attachment-details .setting input,.attachment-details .setting textarea,.compat-item label span,.media-sidebar .setting .name,.media-sidebar .setting input,.media-sidebar .setting textarea{float:none;display:inline-block}.attachment-details .setting span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting span{float:none}.media-sidebar .setting .select-label-inline{display:inline}.attachment-details .setting .name,.compat-item label span,.media-sidebar .checkbox-label-inline,.media-sidebar .setting .name{text-align:inherit;min-height:16px;margin:0;padding:8px 2px 2px}.attachment-details .setting .value,.media-sidebar .setting .value{float:none;width:auto}.attachment-details .setting input[type=email],.attachment-details .setting input[type=number],.attachment-details .setting input[type=password],.attachment-details .setting input[type=search],.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=url],.attachment-details .setting select,.attachment-details .setting textarea,.attachment-details .setting+.description,.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=url],.media-sidebar .setting select,.media-sidebar .setting textarea{float:none;width:98%;max-width:none;height:auto}.media-frame .media-toolbar input[type=search]{line-height:2.25}.attachment-details .setting select.columns,.media-sidebar .setting select.columns{width:auto}.media-frame .search,.media-frame input,.media-frame textarea{padding:3px 6px}.wp-admin .media-frame select{min-height:40px;font-size:16px;line-height:1.625;padding:5px 24px 5px 8px}.image-details .column-image{width:30%;left:70%}.image-details .column-settings{width:70%}.image-details .media-modal{left:30px;right:30px}.image-details .embed-media-settings .setting,.image-details .embed-media-settings .setting-group{margin:20px}.image-details .embed-media-settings .setting .name,.image-details .embed-media-settings .setting span{float:none;text-align:left;width:100%;margin-bottom:4px;margin-left:0}.media-modal .legend-inline{position:static;transform:none;margin-left:0;margin-bottom:6px}.image-details .embed-media-settings .setting-group .setting{margin-bottom:0}.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{width:100%;margin-left:0}.image-details .embed-media-settings .setting.has-description{margin-bottom:5px}.image-details .description{width:auto;margin:0 20px}.image-details .embed-media-settings .custom-size{margin-left:20px}.collection-settings .setting input[type=checkbox]{float:none;margin-top:0}.media-selection{min-width:120px}.media-selection:after{background:0 0}.media-selection .attachments{display:none}.media-modal .attachments-browser .media-toolbar .search{max-width:100%;height:auto;float:right}.media-modal .attachments-browser .media-toolbar .attachment-filters{height:auto}.media-frame input[type=email],.media-frame input[type=number],.media-frame input[type=password],.media-frame input[type=search],.media-frame input[type=text],.media-frame input[type=url],.media-frame select,.media-frame textarea{font-size:16px}.media-frame .media-toolbar input[type=search]{line-height:2.3755}.media-modal .media-toolbar .spinner{margin-bottom:10px}}@media screen and (max-width:782px){.attachments-browser .media-toolbar{height:82px}.attachments-browser .attachments,.attachments-browser .uploader-inline{top:82px}.media-frame-toolbar .media-toolbar{bottom:-54px}}@media screen and (max-width:782px){.mode-grid .attachments-browser .media-toolbar-primary{display:block}}@media only screen and (max-width:640px),screen and (max-height:400px){.image-details .media-modal,.media-modal{position:fixed;top:0;left:0;right:0;bottom:0}.media-modal-backdrop{position:fixed}.media-sidebar{z-index:1900;max-width:70%;bottom:120%;box-sizing:border-box;padding-bottom:0}.media-sidebar.visible{bottom:0}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline{right:0}.image-details .media-frame-title{display:block;top:0;font-size:14px}.image-details .column-image,.image-details .column-settings{width:100%;position:relative;left:0}.image-details .column-settings{padding:4px 0}.media-frame-content .media-toolbar .instructions{display:none}}@media only screen and (min-width:901px) and (max-height:400px){.media-frame:not(.hide-menu) .media-menu,.media-menu{top:0;padding-top:44px}}@media only screen and (max-width:480px){.wp-core-ui.wp-customizer .media-button{margin-top:13px}}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons-2x.png);background-size:134px 15px}.media-frame .spinner{background-image:url(../images/spinner-2x.gif)}}.media-frame-content[data-columns="1"] .attachment{width:100%}.media-frame-content[data-columns="2"] .attachment{width:50%}.media-frame-content[data-columns="3"] .attachment{width:33.33%}.media-frame-content[data-columns="4"] .attachment{width:25%}.media-frame-content[data-columns="5"] .attachment{width:20%}.media-frame-content[data-columns="6"] .attachment{width:16.66%}.media-frame-content[data-columns="7"] .attachment{width:14.28%}.media-frame-content[data-columns="8"] .attachment{width:12.5%}.media-frame-content[data-columns="9"] .attachment{width:11.11%}.media-frame-content[data-columns="10"] .attachment{width:10%}.media-frame-content[data-columns="11"] .attachment{width:9.09%}.media-frame-content[data-columns="12"] .attachment{width:8.33%} \ No newline at end of file diff --git a/wp-includes/css/wp-auth-check-rtl.css b/wp-includes/css/wp-auth-check-rtl.css new file mode 100644 index 0000000..afe1ea6 --- /dev/null +++ b/wp-includes/css/wp-auth-check-rtl.css @@ -0,0 +1,124 @@ +/*! This file is auto-generated */ +/*------------------------------------------------------------------------------ + Interim login dialog +------------------------------------------------------------------------------*/ + +#wp-auth-check-wrap.hidden { + display: none; +} + +#wp-auth-check-wrap #wp-auth-check-bg { + position: fixed; + top: 0; + bottom: 0; + right: 0; + left: 0; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 1000010; /* needs to appear above .notification-dialog */ +} + +#wp-auth-check-wrap #wp-auth-check { + position: fixed; + right: 50%; + overflow: hidden; + top: 40px; + bottom: 20px; + max-height: 415px; + width: 380px; + margin: 0 -190px 0 0; + padding: 30px 0 0; + background-color: #f1f1f1; + z-index: 1000011; /* needs to appear above #wp-auth-check-bg */ + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); +} + +@media screen and (max-width: 380px) { + #wp-auth-check-wrap #wp-auth-check { + right: 0; + width: 100%; + margin: 0; + } +} + +#wp-auth-check-wrap.fallback #wp-auth-check { + max-height: 180px; + overflow: auto; +} + +#wp-auth-check-wrap #wp-auth-check-form { + height: 100%; + position: relative; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +#wp-auth-check-form.loading:before { + content: ""; + display: block; + width: 20px; + height: 20px; + position: absolute; + right: 50%; + top: 50%; + margin: -10px -10px 0 0; + background: url(../images/spinner.gif) no-repeat center; + background-size: 20px 20px; + transform: translateZ(0); +} + +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + #wp-auth-check-form.loading:before { + background-image: url(../images/spinner-2x.gif); + } + +} + +#wp-auth-check-wrap #wp-auth-check-form iframe { + height: 98%; /* Scrollbar fix */ + width: 100%; +} + +#wp-auth-check-wrap .wp-auth-check-close { + position: absolute; + top: 5px; + left: 5px; + height: 22px; + width: 22px; + color: #72777c; + text-decoration: none; + text-align: center; +} + +#wp-auth-check-wrap .wp-auth-check-close:before { + content: "\f158"; + font: normal 20px/22px dashicons; + speak: none; + -webkit-font-smoothing: antialiased !important; + -moz-osx-font-smoothing: grayscale; +} + +#wp-auth-check-wrap .wp-auth-check-close:hover, +#wp-auth-check-wrap .wp-auth-check-close:focus { + color: #0073aa; +} + +#wp-auth-check-wrap .wp-auth-fallback-expired { + outline: 0; +} + +#wp-auth-check-wrap .wp-auth-fallback { + font-size: 14px; + line-height: 1.5; + padding: 0 25px; + display: none; +} + +#wp-auth-check-wrap.fallback .wp-auth-fallback, +#wp-auth-check-wrap.fallback .wp-auth-check-close { + display: block; +} diff --git a/wp-includes/css/wp-auth-check-rtl.min.css b/wp-includes/css/wp-auth-check-rtl.min.css new file mode 100644 index 0000000..d3bc548 --- /dev/null +++ b/wp-includes/css/wp-auth-check-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#wp-auth-check-wrap.hidden{display:none}#wp-auth-check-wrap #wp-auth-check-bg{position:fixed;top:0;bottom:0;right:0;left:0;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:1000010}#wp-auth-check-wrap #wp-auth-check{position:fixed;right:50%;overflow:hidden;top:40px;bottom:20px;max-height:415px;width:380px;margin:0 -190px 0 0;padding:30px 0 0;background-color:#f1f1f1;z-index:1000011;box-shadow:0 3px 6px rgba(0,0,0,.3)}@media screen and (max-width:380px){#wp-auth-check-wrap #wp-auth-check{right:0;width:100%;margin:0}}#wp-auth-check-wrap.fallback #wp-auth-check{max-height:180px;overflow:auto}#wp-auth-check-wrap #wp-auth-check-form{height:100%;position:relative;overflow:auto;-webkit-overflow-scrolling:touch}#wp-auth-check-form.loading:before{content:"";display:block;width:20px;height:20px;position:absolute;right:50%;top:50%;margin:-10px -10px 0 0;background:url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){#wp-auth-check-form.loading:before{background-image:url(../images/spinner-2x.gif)}}#wp-auth-check-wrap #wp-auth-check-form iframe{height:98%;width:100%}#wp-auth-check-wrap .wp-auth-check-close{position:absolute;top:5px;left:5px;height:22px;width:22px;color:#72777c;text-decoration:none;text-align:center}#wp-auth-check-wrap .wp-auth-check-close:before{content:"\f158";font:normal 20px/22px dashicons;speak:none;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale}#wp-auth-check-wrap .wp-auth-check-close:focus,#wp-auth-check-wrap .wp-auth-check-close:hover{color:#0073aa}#wp-auth-check-wrap .wp-auth-fallback-expired{outline:0}#wp-auth-check-wrap .wp-auth-fallback{font-size:14px;line-height:1.5;padding:0 25px;display:none}#wp-auth-check-wrap.fallback .wp-auth-check-close,#wp-auth-check-wrap.fallback .wp-auth-fallback{display:block} \ No newline at end of file diff --git a/wp-includes/css/wp-auth-check.css b/wp-includes/css/wp-auth-check.css new file mode 100644 index 0000000..466260e --- /dev/null +++ b/wp-includes/css/wp-auth-check.css @@ -0,0 +1,123 @@ +/*------------------------------------------------------------------------------ + Interim login dialog +------------------------------------------------------------------------------*/ + +#wp-auth-check-wrap.hidden { + display: none; +} + +#wp-auth-check-wrap #wp-auth-check-bg { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: #000; + opacity: 0.7; + filter: alpha(opacity=70); + z-index: 1000010; /* needs to appear above .notification-dialog */ +} + +#wp-auth-check-wrap #wp-auth-check { + position: fixed; + left: 50%; + overflow: hidden; + top: 40px; + bottom: 20px; + max-height: 415px; + width: 380px; + margin: 0 0 0 -190px; + padding: 30px 0 0; + background-color: #f1f1f1; + z-index: 1000011; /* needs to appear above #wp-auth-check-bg */ + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); +} + +@media screen and (max-width: 380px) { + #wp-auth-check-wrap #wp-auth-check { + left: 0; + width: 100%; + margin: 0; + } +} + +#wp-auth-check-wrap.fallback #wp-auth-check { + max-height: 180px; + overflow: auto; +} + +#wp-auth-check-wrap #wp-auth-check-form { + height: 100%; + position: relative; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +#wp-auth-check-form.loading:before { + content: ""; + display: block; + width: 20px; + height: 20px; + position: absolute; + left: 50%; + top: 50%; + margin: -10px 0 0 -10px; + background: url(../images/spinner.gif) no-repeat center; + background-size: 20px 20px; + transform: translateZ(0); +} + +@media print, + (-webkit-min-device-pixel-ratio: 1.25), + (min-resolution: 120dpi) { + + #wp-auth-check-form.loading:before { + background-image: url(../images/spinner-2x.gif); + } + +} + +#wp-auth-check-wrap #wp-auth-check-form iframe { + height: 98%; /* Scrollbar fix */ + width: 100%; +} + +#wp-auth-check-wrap .wp-auth-check-close { + position: absolute; + top: 5px; + right: 5px; + height: 22px; + width: 22px; + color: #72777c; + text-decoration: none; + text-align: center; +} + +#wp-auth-check-wrap .wp-auth-check-close:before { + content: "\f158"; + font: normal 20px/22px dashicons; + speak: none; + -webkit-font-smoothing: antialiased !important; + -moz-osx-font-smoothing: grayscale; +} + +#wp-auth-check-wrap .wp-auth-check-close:hover, +#wp-auth-check-wrap .wp-auth-check-close:focus { + color: #0073aa; +} + +#wp-auth-check-wrap .wp-auth-fallback-expired { + outline: 0; +} + +#wp-auth-check-wrap .wp-auth-fallback { + font-size: 14px; + line-height: 1.5; + padding: 0 25px; + display: none; +} + +#wp-auth-check-wrap.fallback .wp-auth-fallback, +#wp-auth-check-wrap.fallback .wp-auth-check-close { + display: block; +} diff --git a/wp-includes/css/wp-auth-check.min.css b/wp-includes/css/wp-auth-check.min.css new file mode 100644 index 0000000..79330dc --- /dev/null +++ b/wp-includes/css/wp-auth-check.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +#wp-auth-check-wrap.hidden{display:none}#wp-auth-check-wrap #wp-auth-check-bg{position:fixed;top:0;bottom:0;left:0;right:0;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:1000010}#wp-auth-check-wrap #wp-auth-check{position:fixed;left:50%;overflow:hidden;top:40px;bottom:20px;max-height:415px;width:380px;margin:0 0 0 -190px;padding:30px 0 0;background-color:#f1f1f1;z-index:1000011;box-shadow:0 3px 6px rgba(0,0,0,.3)}@media screen and (max-width:380px){#wp-auth-check-wrap #wp-auth-check{left:0;width:100%;margin:0}}#wp-auth-check-wrap.fallback #wp-auth-check{max-height:180px;overflow:auto}#wp-auth-check-wrap #wp-auth-check-form{height:100%;position:relative;overflow:auto;-webkit-overflow-scrolling:touch}#wp-auth-check-form.loading:before{content:"";display:block;width:20px;height:20px;position:absolute;left:50%;top:50%;margin:-10px 0 0 -10px;background:url(../images/spinner.gif) no-repeat center;background-size:20px 20px;transform:translateZ(0)}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){#wp-auth-check-form.loading:before{background-image:url(../images/spinner-2x.gif)}}#wp-auth-check-wrap #wp-auth-check-form iframe{height:98%;width:100%}#wp-auth-check-wrap .wp-auth-check-close{position:absolute;top:5px;right:5px;height:22px;width:22px;color:#72777c;text-decoration:none;text-align:center}#wp-auth-check-wrap .wp-auth-check-close:before{content:"\f158";font:normal 20px/22px dashicons;speak:none;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale}#wp-auth-check-wrap .wp-auth-check-close:focus,#wp-auth-check-wrap .wp-auth-check-close:hover{color:#0073aa}#wp-auth-check-wrap .wp-auth-fallback-expired{outline:0}#wp-auth-check-wrap .wp-auth-fallback{font-size:14px;line-height:1.5;padding:0 25px;display:none}#wp-auth-check-wrap.fallback .wp-auth-check-close,#wp-auth-check-wrap.fallback .wp-auth-fallback{display:block} \ No newline at end of file diff --git a/wp-includes/css/wp-embed-template-ie.css b/wp-includes/css/wp-embed-template-ie.css new file mode 100644 index 0000000..cec05c9 --- /dev/null +++ b/wp-includes/css/wp-embed-template-ie.css @@ -0,0 +1,19 @@ +.dashicons-no { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAAAcElEQVR4AdXRVxmEMBAGwJMQCUhAIhKQECmRsFJwMFfp7HfP/E8pk0173CuKpt/0R+WaBaaZqogLagBMuh+DdoKbyRCwqZ/SnM0R5oQuZ2UHS8Z6k23qPxZCTrV5UlHMi8bsfHVXP7K/GXZHaTO7S54CWLdHlN2YIwAAAABJRU5ErkJggg==); +} + +.dashicons-admin-comments { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATUlEQVR4AWMYWqCpvUcAiA8A8X9iMFStAD4DG0AKScQNVDZw1MBRAwvIMLCA5jmFlCD4AMQGlOTtBgoNwzQQ3TCKDaTcMMxYN2AYVgAAYPKsEBxN0PIAAAAASUVORK5CYII=); +} + +.wp-embed-comments a:hover .dashicons-admin-comments { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATElEQVR4AWMYYqB4lQAQHwDi/8RgqFoBfAY2gBSSiBuobOCogaMGFpBhYAEdcwrhIPgAxAaU5O0GCg3DNBDdMIoNpNwwzFg3YBhWAABG71qAFYcFqgAAAABJRU5ErkJggg==); +} + +.dashicons-share { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYfqCpvccAiBcA8X8gfgDEBZQaeAFkGBoOoMR1/7HgDeQa2ECZgQiDHID4AMwAor0MCmBoQP+HBnwAskFQdgBRkQJViGk7wiAHUr21AYdhDTA1dDOQHl6mPFLokmwoT9j0z3qUFw70L77oDwAiuzCIub1XpQAAAABJRU5ErkJggg==); +} + +.wp-embed-share-dialog-open:hover .dashicons-share { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYhqB4lQEQLwDi/0D8AIgLKDXwAsgwNBxAiev+Y8EbyDWwgTIDEQY5APEBmAFEexkUwNCA/g8N+ABkg6DsAKIiBaoQ03aEQQ6kemsDDsMaYEroZiA9vEx5pNAl2VCesOmf9SgvHOhffNEfAAAMqPR5IEZH5wAAAABJRU5ErkJggg==); +} diff --git a/wp-includes/css/wp-embed-template-ie.min.css b/wp-includes/css/wp-embed-template-ie.min.css new file mode 100644 index 0000000..6228217 --- /dev/null +++ b/wp-includes/css/wp-embed-template-ie.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.dashicons-no{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAAAcElEQVR4AdXRVxmEMBAGwJMQCUhAIhKQECmRsFJwMFfp7HfP/E8pk0173CuKpt/0R+WaBaaZqogLagBMuh+DdoKbyRCwqZ/SnM0R5oQuZ2UHS8Z6k23qPxZCTrV5UlHMi8bsfHVXP7K/GXZHaTO7S54CWLdHlN2YIwAAAABJRU5ErkJggg==)}.dashicons-admin-comments{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATUlEQVR4AWMYWqCpvUcAiA8A8X9iMFStAD4DG0AKScQNVDZw1MBRAwvIMLCA5jmFlCD4AMQGlOTtBgoNwzQQ3TCKDaTcMMxYN2AYVgAAYPKsEBxN0PIAAAAASUVORK5CYII=)}.wp-embed-comments a:hover .dashicons-admin-comments{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATElEQVR4AWMYYqB4lQAQHwDi/8RgqFoBfAY2gBSSiBuobOCogaMGFpBhYAEdcwrhIPgAxAaU5O0GCg3DNBDdMIoNpNwwzFg3YBhWAABG71qAFYcFqgAAAABJRU5ErkJggg==)}.dashicons-share{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYfqCpvccAiBcA8X8gfgDEBZQaeAFkGBoOoMR1/7HgDeQa2ECZgQiDHID4AMwAor0MCmBoQP+HBnwAskFQdgBRkQJViGk7wiAHUr21AYdhDTA1dDOQHl6mPFLokmwoT9j0z3qUFw70L77oDwAiuzCIub1XpQAAAABJRU5ErkJggg==)}.wp-embed-share-dialog-open:hover .dashicons-share{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYhqB4lQEQLwDi/0D8AIgLKDXwAsgwNBxAiev+Y8EbyDWwgTIDEQY5APEBmAFEexkUwNCA/g8N+ABkg6DsAKIiBaoQ03aEQQ6kemsDDsMaYEroZiA9vEx5pNAl2VCesOmf9SgvHOhffNEfAAAMqPR5IEZH5wAAAABJRU5ErkJggg==)} \ No newline at end of file diff --git a/wp-includes/css/wp-embed-template.css b/wp-includes/css/wp-embed-template.css new file mode 100644 index 0000000..e03fd61 --- /dev/null +++ b/wp-includes/css/wp-embed-template.css @@ -0,0 +1,359 @@ +html, body { + padding: 0; + margin: 0; +} + +body { + font-family: sans-serif; +} + +/* 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; + width: 1px; + word-wrap: normal !important; +} + +/* Dashicons */ +.dashicons { + display: inline-block; + width: 20px; + height: 20px; + background-color: transparent; + background-repeat: no-repeat; + background-size: 20px; + background-position: center; + transition: background .1s ease-in; + position: relative; + top: 5px; +} + +.dashicons-no { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M15.55%2013.7l-2.19%202.06-3.42-3.65-3.64%203.43-2.06-2.18%203.64-3.43-3.42-3.64%202.18-2.06%203.43%203.64%203.64-3.42%202.05%202.18-3.64%203.43z%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E"); +} + +.dashicons-admin-comments { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E"); +} + +.wp-embed-comments a:hover .dashicons-admin-comments { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E"); +} + +.dashicons-share { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E"); + display: none; +} + +.js .dashicons-share { + display: inline-block; +} + +.wp-embed-share-dialog-open:hover .dashicons-share { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E"); +} + +.wp-embed { + padding: 25px; + font-size: 14px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 1.5; + color: #82878c; + background: #fff; + border: 1px solid #e5e5e5; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + /* Clearfix */ + overflow: auto; + zoom: 1; +} + +.wp-embed a { + color: #82878c; + text-decoration: none; +} + +.wp-embed a:hover { + text-decoration: underline; +} + +.wp-embed-featured-image { + margin-bottom: 20px; +} + +.wp-embed-featured-image img { + width: 100%; + height: auto; + border: none; +} + +.wp-embed-featured-image.square { + float: left; + max-width: 160px; + margin-right: 20px; +} + +.wp-embed p { + margin: 0; +} + +p.wp-embed-heading { + margin: 0 0 15px; + font-weight: 600; + font-size: 22px; + line-height: 1.3; +} + +.wp-embed-heading a { + color: #32373c; +} + +.wp-embed .wp-embed-more { + color: #b4b9be; +} + +.wp-embed-footer { + display: table; + width: 100%; + margin-top: 30px; +} + +.wp-embed-site-icon { + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + height: 25px; + width: 25px; + border: 0; +} + +.wp-embed-site-title { + font-weight: 600; + line-height: 1.78571428; +} + +.wp-embed-site-title a { + position: relative; + display: inline-block; + padding-left: 35px; +} + +.wp-embed-site-title, +.wp-embed-meta { + display: table-cell; +} + +.wp-embed-meta { + text-align: right; + white-space: nowrap; + vertical-align: middle; +} + +.wp-embed-comments, +.wp-embed-share { + display: inline; +} + +.wp-embed-meta a:hover { + text-decoration: none; + color: #0073aa; +} + +.wp-embed-comments a { + line-height: 1.78571428; + display: inline-block; +} + +.wp-embed-comments + .wp-embed-share { + margin-left: 10px; +} + +.wp-embed-share-dialog { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #222; + background-color: rgba(10, 10, 10, 0.9); + color: #fff; + opacity: 1; + transition: opacity .25s ease-in-out; +} + +.wp-embed-share-dialog.hidden { + opacity: 0; + visibility: hidden; +} + +.wp-embed-share-dialog-open, +.wp-embed-share-dialog-close { + margin: -8px 0 0; + padding: 0; + background: transparent; + border: none; + cursor: pointer; + outline: none; +} + +.wp-embed-share-dialog-open .dashicons, +.wp-embed-share-dialog-close .dashicons { + padding: 4px; +} + +.wp-embed-share-dialog-open .dashicons { + top: 8px; +} + +.wp-embed-share-dialog-open:focus .dashicons, +.wp-embed-share-dialog-close:focus .dashicons { + box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, 0.8); + border-radius: 100%; +} + +.wp-embed-share-dialog-close { + position: absolute; + top: 20px; + right: 20px; + font-size: 22px; +} + +.wp-embed-share-dialog-close:hover { + text-decoration: none; +} + +.wp-embed-share-dialog-close .dashicons { + height: 24px; + width: 24px; + background-size: 24px; +} + +.wp-embed-share-dialog-content { + height: 100%; + transform-style: preserve-3d; + overflow: hidden; +} + +.wp-embed-share-dialog-text { + margin-top: 25px; + padding: 20px; +} + +.wp-embed-share-tabs { + margin: 0 0 20px; + padding: 0; + list-style: none; +} + +.wp-embed-share-tab-button { + display: inline-block; +} + +.wp-embed-share-tab-button button { + margin: 0; + padding: 0; + border: none; + background: transparent; + font-size: 16px; + line-height: 1.3; + color: #aaa; + cursor: pointer; + transition: color .1s ease-in; +} + +.wp-embed-share-tab-button [aria-selected="true"] { + color: #fff; +} + +.wp-embed-share-tab-button button:hover { + color: #fff; +} + +.wp-embed-share-tab-button + .wp-embed-share-tab-button { + margin: 0 0 0 10px; + padding: 0 0 0 11px; + border-left: 1px solid #aaa; +} + +.wp-embed-share-tab[aria-hidden="true"] { + display: none; +} + +p.wp-embed-share-description { + margin: 0; + font-size: 14px; + line-height: 1; + font-style: italic; + color: #aaa; +} + +.wp-embed-share-input { + box-sizing: border-box; + width: 100%; + border: none; + height: 28px; + margin: 0 0 10px 0; + padding: 0 5px; + font-size: 14px; + font-weight: 400; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + line-height: 1.5; + resize: none; + cursor: text; +} + +textarea.wp-embed-share-input { + height: 72px; +} + +html[dir="rtl"] .wp-embed-featured-image.square { + float: right; + margin-right: 0; + + margin-left: 20px; +} + +html[dir="rtl"] .wp-embed-site-title a { + padding-left: 0; + padding-right: 35px; +} + +html[dir="rtl"] .wp-embed-site-icon { + margin-right: 0; + margin-left: 10px; + left: auto; + right: 0; +} + +html[dir="rtl"] .wp-embed-meta { + text-align: left; +} + +html[dir="rtl"] .wp-embed-footer { +} + +html[dir="rtl"] .wp-embed-share { + margin-left: 0; + margin-right: 10px; +} + +html[dir="rtl"] .wp-embed-share-dialog-close { + right: auto; + left: 20px; +} + +html[dir="rtl"] .wp-embed-share-tab-button + .wp-embed-share-tab-button { + margin: 0 10px 0 0; + padding: 0 11px 0 0; + border-left: none; + border-right: 1px solid #aaa; +} diff --git a/wp-includes/css/wp-embed-template.min.css b/wp-includes/css/wp-embed-template.min.css new file mode 100644 index 0000000..5da8fb8 --- /dev/null +++ b/wp-includes/css/wp-embed-template.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +body,html{padding:0;margin:0}body{font-family:sans-serif}.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;width:1px;word-wrap:normal!important}.dashicons{display:inline-block;width:20px;height:20px;background-color:transparent;background-repeat:no-repeat;background-size:20px;background-position:center;transition:background .1s ease-in;position:relative;top:5px}.dashicons-no{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M15.55%2013.7l-2.19%202.06-3.42-3.65-3.64%203.43-2.06-2.18%203.64-3.43-3.42-3.64%202.18-2.06%203.43%203.64%203.64-3.42%202.05%202.18-3.64%203.43z%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E")}.dashicons-admin-comments{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E")}.wp-embed-comments a:hover .dashicons-admin-comments{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E")}.dashicons-share{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E");display:none}.js .dashicons-share{display:inline-block}.wp-embed-share-dialog-open:hover .dashicons-share{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E")}.wp-embed{padding:25px;font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.5;color:#82878c;background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.05);overflow:auto;zoom:1}.wp-embed a{color:#82878c;text-decoration:none}.wp-embed a:hover{text-decoration:underline}.wp-embed-featured-image{margin-bottom:20px}.wp-embed-featured-image img{width:100%;height:auto;border:none}.wp-embed-featured-image.square{float:left;max-width:160px;margin-right:20px}.wp-embed p{margin:0}p.wp-embed-heading{margin:0 0 15px;font-weight:600;font-size:22px;line-height:1.3}.wp-embed-heading a{color:#32373c}.wp-embed .wp-embed-more{color:#b4b9be}.wp-embed-footer{display:table;width:100%;margin-top:30px}.wp-embed-site-icon{position:absolute;top:50%;left:0;transform:translateY(-50%);height:25px;width:25px;border:0}.wp-embed-site-title{font-weight:600;line-height:1.78571428}.wp-embed-site-title a{position:relative;display:inline-block;padding-left:35px}.wp-embed-meta,.wp-embed-site-title{display:table-cell}.wp-embed-meta{text-align:right;white-space:nowrap;vertical-align:middle}.wp-embed-comments,.wp-embed-share{display:inline}.wp-embed-meta a:hover{text-decoration:none;color:#0073aa}.wp-embed-comments a{line-height:1.78571428;display:inline-block}.wp-embed-comments+.wp-embed-share{margin-left:10px}.wp-embed-share-dialog{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#222;background-color:rgba(10,10,10,.9);color:#fff;opacity:1;transition:opacity .25s ease-in-out}.wp-embed-share-dialog.hidden{opacity:0;visibility:hidden}.wp-embed-share-dialog-close,.wp-embed-share-dialog-open{margin:-8px 0 0;padding:0;background:0 0;border:none;cursor:pointer;outline:0}.wp-embed-share-dialog-close .dashicons,.wp-embed-share-dialog-open .dashicons{padding:4px}.wp-embed-share-dialog-open .dashicons{top:8px}.wp-embed-share-dialog-close:focus .dashicons,.wp-embed-share-dialog-open:focus .dashicons{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);border-radius:100%}.wp-embed-share-dialog-close{position:absolute;top:20px;right:20px;font-size:22px}.wp-embed-share-dialog-close:hover{text-decoration:none}.wp-embed-share-dialog-close .dashicons{height:24px;width:24px;background-size:24px}.wp-embed-share-dialog-content{height:100%;transform-style:preserve-3d;overflow:hidden}.wp-embed-share-dialog-text{margin-top:25px;padding:20px}.wp-embed-share-tabs{margin:0 0 20px;padding:0;list-style:none}.wp-embed-share-tab-button{display:inline-block}.wp-embed-share-tab-button button{margin:0;padding:0;border:none;background:0 0;font-size:16px;line-height:1.3;color:#aaa;cursor:pointer;transition:color .1s ease-in}.wp-embed-share-tab-button [aria-selected=true]{color:#fff}.wp-embed-share-tab-button button:hover{color:#fff}.wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 0 0 10px;padding:0 0 0 11px;border-left:1px solid #aaa}.wp-embed-share-tab[aria-hidden=true]{display:none}p.wp-embed-share-description{margin:0;font-size:14px;line-height:1;font-style:italic;color:#aaa}.wp-embed-share-input{box-sizing:border-box;width:100%;border:none;height:28px;margin:0 0 10px 0;padding:0 5px;font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.5;resize:none;cursor:text}textarea.wp-embed-share-input{height:72px}html[dir=rtl] .wp-embed-featured-image.square{float:right;margin-right:0;margin-left:20px}html[dir=rtl] .wp-embed-site-title a{padding-left:0;padding-right:35px}html[dir=rtl] .wp-embed-site-icon{margin-right:0;margin-left:10px;left:auto;right:0}html[dir=rtl] .wp-embed-meta{text-align:left}html[dir=rtl] .wp-embed-share{margin-left:0;margin-right:10px}html[dir=rtl] .wp-embed-share-dialog-close{right:auto;left:20px}html[dir=rtl] .wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 10px 0 0;padding:0 11px 0 0;border-left:none;border-right:1px solid #aaa} \ No newline at end of file diff --git a/wp-includes/css/wp-pointer-rtl.css b/wp-includes/css/wp-pointer-rtl.css new file mode 100644 index 0000000..f384509 --- /dev/null +++ b/wp-includes/css/wp-pointer-rtl.css @@ -0,0 +1,225 @@ +/*! This file is auto-generated */ +.wp-pointer-content { + padding: 0 0 10px; + position: relative; + font-size: 13px; + background: #fff; + border: 1px solid #ddd; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); +} + +.wp-pointer-content h3 { + position: relative; + margin: -1px -1px 5px; + padding: 15px 60px 14px 18px; + border: 1px solid #3592b6; + border-bottom: none; + line-height: 1.4; + font-size: 14px; + color: #fff; + background: #00a0d2; +} + +.wp-pointer-content h3:before { + background: #fff; + border-radius: 50%; + color: #00a0d2; + content: "\f227"; + font: normal 20px/1.6 dashicons; + position: absolute; + top: 8px; + right: 15px; + speak: none; + text-align: center; + width: 32px; + height: 32px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-pointer-content h4 { + margin: 1.33em 20px 1em; + font-size: 1.15em; +} + +.wp-pointer-content p { + padding: 0 20px; +} + +.wp-pointer-buttons { + margin: 0; + padding: 5px 15px; + overflow: auto; +} + +.wp-pointer-buttons a { + float: left; + display: inline-block; + text-decoration: none; +} + +.wp-pointer-buttons a.close { + padding-right: 3px; + position: relative; +} + +.wp-pointer-buttons a.close:before { + background: none; + color: #72777c; + content: "\f153"; + display: block !important; + font: normal 16px/1 dashicons; + speak: none; + margin: 1px 0; + text-align: center; + -webkit-font-smoothing: antialiased !important; + width: 10px; + height: 100%; + position: absolute; + right: -15px; + top: 1px; +} + +.wp-pointer-buttons a.close:hover:before { + color: #c00; +} + +/* The arrow base class must take up no space, even with transparent borders. */ +.wp-pointer-arrow, +.wp-pointer-arrow-inner { + position: absolute; + width: 0; + height: 0; +} + +.wp-pointer-arrow { + z-index: 10; + width: 0; + height: 0; + border: 0 solid transparent; +} + +.wp-pointer-arrow-inner { + z-index: 20; +} + +/* Make Room for the Arrow! */ +.wp-pointer-top, +.wp-pointer-undefined { + padding-top: 13px; +} + +.wp-pointer-bottom { + margin-top: -13px; + padding-bottom: 13px; +} + +/* rtl:ignore */ +.wp-pointer-left { + padding-left: 13px; +} +/* rtl:ignore */ +.wp-pointer-right { + margin-left: -13px; + padding-right: 13px; +} + +/* Base Size & Positioning */ +.wp-pointer-top .wp-pointer-arrow, +.wp-pointer-bottom .wp-pointer-arrow, +.wp-pointer-undefined .wp-pointer-arrow { + right: 50px; +} + +.wp-pointer-left .wp-pointer-arrow, +.wp-pointer-right .wp-pointer-arrow { + top: 50%; + margin-top: -15px; +} + +/* Arrow Sprite */ +.wp-pointer-top .wp-pointer-arrow, +.wp-pointer-undefined .wp-pointer-arrow { + top: 0; + border-width: 0 13px 13px 13px; + border-bottom-color: #3592b6; +} + +.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer-undefined .wp-pointer-arrow-inner { + top: 1px; + margin-right: -13px; + margin-top: -13px; + border: 13px solid transparent; + border-bottom-color: #00a0d2; + display: block; + content: " "; +} + +.wp-pointer-bottom .wp-pointer-arrow { + bottom: 0; + border-width: 13px 13px 0 13px; + border-top-color: #ccc; +} + +.wp-pointer-bottom .wp-pointer-arrow-inner { + bottom: 1px; + margin-right: -13px; + margin-bottom: -13px; + border: 13px solid transparent; + border-top-color: #fff; + display: block; + content: " "; +} + +/* rtl:ignore */ +.wp-pointer-left .wp-pointer-arrow { + left: 0; + border-width: 13px 13px 13px 0; + border-right-color: #ccc; +} + +/* rtl:ignore */ +.wp-pointer-left .wp-pointer-arrow-inner { + left: 1px; + margin-left: -13px; + margin-top: -13px; + border: 13px solid transparent; + border-right-color: #fff; + display: block; + content: " "; +} + +/* rtl:ignore */ +.wp-pointer-right .wp-pointer-arrow { + right: 0; + border-width: 13px 0 13px 13px; + border-left-color: #ccc; +} + +/* rtl:ignore */ +.wp-pointer-right .wp-pointer-arrow-inner { + right: 1px; + margin-right: -13px; + margin-top: -13px; + border: 13px solid transparent; + border-left-color: #fff; + display: block; + content: " "; +} + +.wp-pointer.arrow-bottom .wp-pointer-content { + margin-bottom: -45px; +} + +.wp-pointer.arrow-bottom .wp-pointer-arrow { + top: 100%; + margin-top: -30px; +} + +/* Disable pointers at responsive sizes */ +@media screen and (max-width: 782px) { + .wp-pointer { + display: none; + } +} diff --git a/wp-includes/css/wp-pointer-rtl.min.css b/wp-includes/css/wp-pointer-rtl.min.css new file mode 100644 index 0000000..78bf522 --- /dev/null +++ b/wp-includes/css/wp-pointer-rtl.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-pointer-content{padding:0 0 10px;position:relative;font-size:13px;background:#fff;border:1px solid #ddd;box-shadow:0 3px 6px rgba(0,0,0,.075)}.wp-pointer-content h3{position:relative;margin:-1px -1px 5px;padding:15px 60px 14px 18px;border:1px solid #3592b6;border-bottom:none;line-height:1.4;font-size:14px;color:#fff;background:#00a0d2}.wp-pointer-content h3:before{background:#fff;border-radius:50%;color:#00a0d2;content:"\f227";font:normal 20px/1.6 dashicons;position:absolute;top:8px;right:15px;speak:none;text-align:center;width:32px;height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-pointer-content h4{margin:1.33em 20px 1em;font-size:1.15em}.wp-pointer-content p{padding:0 20px}.wp-pointer-buttons{margin:0;padding:5px 15px;overflow:auto}.wp-pointer-buttons a{float:left;display:inline-block;text-decoration:none}.wp-pointer-buttons a.close{padding-right:3px;position:relative}.wp-pointer-buttons a.close:before{background:0 0;color:#72777c;content:"\f153";display:block!important;font:normal 16px/1 dashicons;speak:none;margin:1px 0;text-align:center;-webkit-font-smoothing:antialiased!important;width:10px;height:100%;position:absolute;right:-15px;top:1px}.wp-pointer-buttons a.close:hover:before{color:#c00}.wp-pointer-arrow,.wp-pointer-arrow-inner{position:absolute;width:0;height:0}.wp-pointer-arrow{z-index:10;width:0;height:0;border:0 solid transparent}.wp-pointer-arrow-inner{z-index:20}.wp-pointer-top,.wp-pointer-undefined{padding-top:13px}.wp-pointer-bottom{margin-top:-13px;padding-bottom:13px}.wp-pointer-left{padding-left:13px}.wp-pointer-right{margin-left:-13px;padding-right:13px}.wp-pointer-bottom .wp-pointer-arrow,.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{right:50px}.wp-pointer-left .wp-pointer-arrow,.wp-pointer-right .wp-pointer-arrow{top:50%;margin-top:-15px}.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{top:0;border-width:0 13px 13px 13px;border-bottom-color:#3592b6}.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer-undefined .wp-pointer-arrow-inner{top:1px;margin-right:-13px;margin-top:-13px;border:13px solid transparent;border-bottom-color:#00a0d2;display:block;content:" "}.wp-pointer-bottom .wp-pointer-arrow{bottom:0;border-width:13px 13px 0 13px;border-top-color:#ccc}.wp-pointer-bottom .wp-pointer-arrow-inner{bottom:1px;margin-right:-13px;margin-bottom:-13px;border:13px solid transparent;border-top-color:#fff;display:block;content:" "}.wp-pointer-left .wp-pointer-arrow{left:0;border-width:13px 13px 13px 0;border-right-color:#ccc}.wp-pointer-left .wp-pointer-arrow-inner{left:1px;margin-left:-13px;margin-top:-13px;border:13px solid transparent;border-right-color:#fff;display:block;content:" "}.wp-pointer-right .wp-pointer-arrow{right:0;border-width:13px 0 13px 13px;border-left-color:#ccc}.wp-pointer-right .wp-pointer-arrow-inner{right:1px;margin-right:-13px;margin-top:-13px;border:13px solid transparent;border-left-color:#fff;display:block;content:" "}.wp-pointer.arrow-bottom .wp-pointer-content{margin-bottom:-45px}.wp-pointer.arrow-bottom .wp-pointer-arrow{top:100%;margin-top:-30px}@media screen and (max-width:782px){.wp-pointer{display:none}} \ No newline at end of file diff --git a/wp-includes/css/wp-pointer.css b/wp-includes/css/wp-pointer.css new file mode 100644 index 0000000..09acb86 --- /dev/null +++ b/wp-includes/css/wp-pointer.css @@ -0,0 +1,224 @@ +.wp-pointer-content { + padding: 0 0 10px; + position: relative; + font-size: 13px; + background: #fff; + border: 1px solid #ddd; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075); +} + +.wp-pointer-content h3 { + position: relative; + margin: -1px -1px 5px; + padding: 15px 18px 14px 60px; + border: 1px solid #3592b6; + border-bottom: none; + line-height: 1.4; + font-size: 14px; + color: #fff; + background: #00a0d2; +} + +.wp-pointer-content h3:before { + background: #fff; + border-radius: 50%; + color: #00a0d2; + content: "\f227"; + font: normal 20px/1.6 dashicons; + position: absolute; + top: 8px; + left: 15px; + speak: none; + text-align: center; + width: 32px; + height: 32px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wp-pointer-content h4 { + margin: 1.33em 20px 1em; + font-size: 1.15em; +} + +.wp-pointer-content p { + padding: 0 20px; +} + +.wp-pointer-buttons { + margin: 0; + padding: 5px 15px; + overflow: auto; +} + +.wp-pointer-buttons a { + float: right; + display: inline-block; + text-decoration: none; +} + +.wp-pointer-buttons a.close { + padding-left: 3px; + position: relative; +} + +.wp-pointer-buttons a.close:before { + background: none; + color: #72777c; + content: "\f153"; + display: block !important; + font: normal 16px/1 dashicons; + speak: none; + margin: 1px 0; + text-align: center; + -webkit-font-smoothing: antialiased !important; + width: 10px; + height: 100%; + position: absolute; + left: -15px; + top: 1px; +} + +.wp-pointer-buttons a.close:hover:before { + color: #c00; +} + +/* The arrow base class must take up no space, even with transparent borders. */ +.wp-pointer-arrow, +.wp-pointer-arrow-inner { + position: absolute; + width: 0; + height: 0; +} + +.wp-pointer-arrow { + z-index: 10; + width: 0; + height: 0; + border: 0 solid transparent; +} + +.wp-pointer-arrow-inner { + z-index: 20; +} + +/* Make Room for the Arrow! */ +.wp-pointer-top, +.wp-pointer-undefined { + padding-top: 13px; +} + +.wp-pointer-bottom { + margin-top: -13px; + padding-bottom: 13px; +} + +/* rtl:ignore */ +.wp-pointer-left { + padding-left: 13px; +} +/* rtl:ignore */ +.wp-pointer-right { + margin-left: -13px; + padding-right: 13px; +} + +/* Base Size & Positioning */ +.wp-pointer-top .wp-pointer-arrow, +.wp-pointer-bottom .wp-pointer-arrow, +.wp-pointer-undefined .wp-pointer-arrow { + left: 50px; +} + +.wp-pointer-left .wp-pointer-arrow, +.wp-pointer-right .wp-pointer-arrow { + top: 50%; + margin-top: -15px; +} + +/* Arrow Sprite */ +.wp-pointer-top .wp-pointer-arrow, +.wp-pointer-undefined .wp-pointer-arrow { + top: 0; + border-width: 0 13px 13px 13px; + border-bottom-color: #3592b6; +} + +.wp-pointer-top .wp-pointer-arrow-inner, +.wp-pointer-undefined .wp-pointer-arrow-inner { + top: 1px; + margin-left: -13px; + margin-top: -13px; + border: 13px solid transparent; + border-bottom-color: #00a0d2; + display: block; + content: " "; +} + +.wp-pointer-bottom .wp-pointer-arrow { + bottom: 0; + border-width: 13px 13px 0 13px; + border-top-color: #ccc; +} + +.wp-pointer-bottom .wp-pointer-arrow-inner { + bottom: 1px; + margin-left: -13px; + margin-bottom: -13px; + border: 13px solid transparent; + border-top-color: #fff; + display: block; + content: " "; +} + +/* rtl:ignore */ +.wp-pointer-left .wp-pointer-arrow { + left: 0; + border-width: 13px 13px 13px 0; + border-right-color: #ccc; +} + +/* rtl:ignore */ +.wp-pointer-left .wp-pointer-arrow-inner { + left: 1px; + margin-left: -13px; + margin-top: -13px; + border: 13px solid transparent; + border-right-color: #fff; + display: block; + content: " "; +} + +/* rtl:ignore */ +.wp-pointer-right .wp-pointer-arrow { + right: 0; + border-width: 13px 0 13px 13px; + border-left-color: #ccc; +} + +/* rtl:ignore */ +.wp-pointer-right .wp-pointer-arrow-inner { + right: 1px; + margin-right: -13px; + margin-top: -13px; + border: 13px solid transparent; + border-left-color: #fff; + display: block; + content: " "; +} + +.wp-pointer.arrow-bottom .wp-pointer-content { + margin-bottom: -45px; +} + +.wp-pointer.arrow-bottom .wp-pointer-arrow { + top: 100%; + margin-top: -30px; +} + +/* Disable pointers at responsive sizes */ +@media screen and (max-width: 782px) { + .wp-pointer { + display: none; + } +} diff --git a/wp-includes/css/wp-pointer.min.css b/wp-includes/css/wp-pointer.min.css new file mode 100644 index 0000000..521a100 --- /dev/null +++ b/wp-includes/css/wp-pointer.min.css @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +.wp-pointer-content{padding:0 0 10px;position:relative;font-size:13px;background:#fff;border:1px solid #ddd;box-shadow:0 3px 6px rgba(0,0,0,.075)}.wp-pointer-content h3{position:relative;margin:-1px -1px 5px;padding:15px 18px 14px 60px;border:1px solid #3592b6;border-bottom:none;line-height:1.4;font-size:14px;color:#fff;background:#00a0d2}.wp-pointer-content h3:before{background:#fff;border-radius:50%;color:#00a0d2;content:"\f227";font:normal 20px/1.6 dashicons;position:absolute;top:8px;left:15px;speak:none;text-align:center;width:32px;height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-pointer-content h4{margin:1.33em 20px 1em;font-size:1.15em}.wp-pointer-content p{padding:0 20px}.wp-pointer-buttons{margin:0;padding:5px 15px;overflow:auto}.wp-pointer-buttons a{float:right;display:inline-block;text-decoration:none}.wp-pointer-buttons a.close{padding-left:3px;position:relative}.wp-pointer-buttons a.close:before{background:0 0;color:#72777c;content:"\f153";display:block!important;font:normal 16px/1 dashicons;speak:none;margin:1px 0;text-align:center;-webkit-font-smoothing:antialiased!important;width:10px;height:100%;position:absolute;left:-15px;top:1px}.wp-pointer-buttons a.close:hover:before{color:#c00}.wp-pointer-arrow,.wp-pointer-arrow-inner{position:absolute;width:0;height:0}.wp-pointer-arrow{z-index:10;width:0;height:0;border:0 solid transparent}.wp-pointer-arrow-inner{z-index:20}.wp-pointer-top,.wp-pointer-undefined{padding-top:13px}.wp-pointer-bottom{margin-top:-13px;padding-bottom:13px}.wp-pointer-left{padding-left:13px}.wp-pointer-right{margin-left:-13px;padding-right:13px}.wp-pointer-bottom .wp-pointer-arrow,.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{left:50px}.wp-pointer-left .wp-pointer-arrow,.wp-pointer-right .wp-pointer-arrow{top:50%;margin-top:-15px}.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{top:0;border-width:0 13px 13px 13px;border-bottom-color:#3592b6}.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer-undefined .wp-pointer-arrow-inner{top:1px;margin-left:-13px;margin-top:-13px;border:13px solid transparent;border-bottom-color:#00a0d2;display:block;content:" "}.wp-pointer-bottom .wp-pointer-arrow{bottom:0;border-width:13px 13px 0 13px;border-top-color:#ccc}.wp-pointer-bottom .wp-pointer-arrow-inner{bottom:1px;margin-left:-13px;margin-bottom:-13px;border:13px solid transparent;border-top-color:#fff;display:block;content:" "}.wp-pointer-left .wp-pointer-arrow{left:0;border-width:13px 13px 13px 0;border-right-color:#ccc}.wp-pointer-left .wp-pointer-arrow-inner{left:1px;margin-left:-13px;margin-top:-13px;border:13px solid transparent;border-right-color:#fff;display:block;content:" "}.wp-pointer-right .wp-pointer-arrow{right:0;border-width:13px 0 13px 13px;border-left-color:#ccc}.wp-pointer-right .wp-pointer-arrow-inner{right:1px;margin-right:-13px;margin-top:-13px;border:13px solid transparent;border-left-color:#fff;display:block;content:" "}.wp-pointer.arrow-bottom .wp-pointer-content{margin-bottom:-45px}.wp-pointer.arrow-bottom .wp-pointer-arrow{top:100%;margin-top:-30px}@media screen and (max-width:782px){.wp-pointer{display:none}} \ No newline at end of file diff --git a/wp-includes/customize/class-wp-customize-background-image-control.php b/wp-includes/customize/class-wp-customize-background-image-control.php new file mode 100644 index 0000000..b31a811 --- /dev/null +++ b/wp-includes/customize/class-wp-customize-background-image-control.php @@ -0,0 +1,59 @@ + __( 'Background Image' ), + 'section' => 'background_image', + ) + ); + } + + /** + * Enqueue control related scripts/styles. + * + * @since 4.1.0 + */ + public function enqueue() { + parent::enqueue(); + + $custom_background = get_theme_support( 'custom-background' ); + wp_localize_script( + 'customize-controls', + '_wpCustomizeBackground', + array( + 'defaults' => ! empty( $custom_background[0] ) ? $custom_background[0] : array(), + 'nonces' => array( + 'add' => wp_create_nonce( 'background-add' ), + ), + ) + ); + } +} diff --git a/wp-includes/customize/class-wp-customize-background-image-setting.php b/wp-includes/customize/class-wp-customize-background-image-setting.php new file mode 100644 index 0000000..e7867d1 --- /dev/null +++ b/wp-includes/customize/class-wp-customize-background-image-setting.php @@ -0,0 +1,28 @@ + array( + 'label' => __( 'Top Left' ), + 'icon' => 'dashicons dashicons-arrow-left-alt', + ), + 'center top' => array( + 'label' => __( 'Top' ), + 'icon' => 'dashicons dashicons-arrow-up-alt', + ), + 'right top' => array( + 'label' => __( 'Top Right' ), + 'icon' => 'dashicons dashicons-arrow-right-alt', + ), + ), + array( + 'left center' => array( + 'label' => __( 'Left' ), + 'icon' => 'dashicons dashicons-arrow-left-alt', + ), + 'center center' => array( + 'label' => __( 'Center' ), + 'icon' => 'background-position-center-icon', + ), + 'right center' => array( + 'label' => __( 'Right' ), + 'icon' => 'dashicons dashicons-arrow-right-alt', + ), + ), + array( + 'left bottom' => array( + 'label' => __( 'Bottom Left' ), + 'icon' => 'dashicons dashicons-arrow-left-alt', + ), + 'center bottom' => array( + 'label' => __( 'Bottom' ), + 'icon' => 'dashicons dashicons-arrow-down-alt', + ), + 'right bottom' => array( + 'label' => __( 'Bottom Right' ), + 'icon' => 'dashicons dashicons-arrow-right-alt', + ), + ), + ); + ?> + <# if ( data.label ) { #> + {{{ data.label }}} + <# } #> + <# if ( data.description ) { #> + {{{ data.description }}} + <# } #> +
            +
            + +
            + +
            + $input ) : ?> + + +
            + +
            +
            +
            + editor_settings = wp_enqueue_code_editor( + array_merge( + array( + 'type' => $this->code_type, + 'codemirror' => array( + 'indentUnit' => 2, + 'tabSize' => 2, + ), + ), + $this->editor_settings + ) + ); + } + + /** + * Refresh the parameters passed to the JavaScript via JSON. + * + * @since 4.9.0 + * @see WP_Customize_Control::json() + * + * @return array Array of parameters passed to the JavaScript. + */ + public function json() { + $json = parent::json(); + $json['editor_settings'] = $this->editor_settings; + $json['input_attrs'] = $this->input_attrs; + return $json; + } + + /** + * Don't render the control content from PHP, as it's rendered via JS on load. + * + * @since 4.9.0 + */ + public function render_content() {} + + /** + * Render a JS template for control display. + * + * @since 4.9.0 + */ + public function content_template() { + ?> + <# var elementIdPrefix = 'el' + String( Math.random() ); #> + <# if ( data.label ) { #> + + <# } #> + <# if ( data.description ) { #> + {{{ data.description }}} + <# } #> +
            + + statuses = array( '' => __( 'Default' ) ); + parent::__construct( $manager, $id, $args ); + } + + /** + * Enqueue scripts/styles for the color picker. + * + * @since 3.4.0 + */ + public function enqueue() { + wp_enqueue_script( 'wp-color-picker' ); + wp_enqueue_style( 'wp-color-picker' ); + } + + /** + * Refresh the parameters passed to the JavaScript via JSON. + * + * @since 3.4.0 + * @uses WP_Customize_Control::to_json() + */ + public function to_json() { + parent::to_json(); + $this->json['statuses'] = $this->statuses; + $this->json['defaultValue'] = $this->setting->default; + $this->json['mode'] = $this->mode; + } + + /** + * Don't render the control content from PHP, as it's rendered via JS on load. + * + * @since 3.4.0 + */ + public function render_content() {} + + /** + * Render a JS template for the content of the color picker control. + * + * @since 4.1.0 + */ + public function content_template() { + ?> + <# var defaultValue = '#RRGGBB', defaultValueAttr = '', + isHueSlider = data.mode === 'hue'; + if ( data.defaultValue && _.isString( data.defaultValue ) && ! isHueSlider ) { + if ( '#' !== data.defaultValue.substring( 0, 1 ) ) { + defaultValue = '#' + data.defaultValue; + } else { + defaultValue = data.defaultValue; + } + defaultValueAttr = ' data-default-color=' + defaultValue; // Quotes added automatically. + } #> + <# if ( data.label ) { #> + {{{ data.label }}} + <# } #> + <# if ( data.description ) { #> + {{{ data.description }}} + <# } #> +
            + +
            + json['width'] = absint( $this->width ); + $this->json['height'] = absint( $this->height ); + $this->json['flex_width'] = absint( $this->flex_width ); + $this->json['flex_height'] = absint( $this->flex_height ); + } + +} diff --git a/wp-includes/customize/class-wp-customize-custom-css-setting.php b/wp-includes/customize/class-wp-customize-custom-css-setting.php new file mode 100644 index 0000000..ea0732e --- /dev/null +++ b/wp-includes/customize/class-wp-customize-custom-css-setting.php @@ -0,0 +1,202 @@ +id_data['base'] ) { + throw new Exception( 'Expected custom_css id_base.' ); + } + if ( 1 !== count( $this->id_data['keys'] ) || empty( $this->id_data['keys'][0] ) ) { + throw new Exception( 'Expected single stylesheet key.' ); + } + $this->stylesheet = $this->id_data['keys'][0]; + } + + /** + * Add filter to preview post value. + * + * @since 4.7.9 + * + * @return bool False when preview short-circuits due no change needing to be previewed. + */ + public function preview() { + if ( $this->is_previewed ) { + return false; + } + $this->is_previewed = true; + add_filter( 'wp_get_custom_css', array( $this, 'filter_previewed_wp_get_custom_css' ), 9, 2 ); + return true; + } + + /** + * Filter `wp_get_custom_css` for applying the customized value. + * + * This is used in the preview when `wp_get_custom_css()` is called for rendering the styles. + * + * @since 4.7.0 + * @see wp_get_custom_css() + * + * @param string $css Original CSS. + * @param string $stylesheet Current stylesheet. + * @return string CSS. + */ + public function filter_previewed_wp_get_custom_css( $css, $stylesheet ) { + if ( $stylesheet === $this->stylesheet ) { + $customized_value = $this->post_value( null ); + if ( ! is_null( $customized_value ) ) { + $css = $customized_value; + } + } + return $css; + } + + /** + * Fetch the value of the setting. Will return the previewed value when `preview()` is called. + * + * @since 4.7.0 + * @see WP_Customize_Setting::value() + * + * @return string + */ + public function value() { + if ( $this->is_previewed ) { + $post_value = $this->post_value( null ); + if ( null !== $post_value ) { + return $post_value; + } + } + $id_base = $this->id_data['base']; + $value = ''; + $post = wp_get_custom_css_post( $this->stylesheet ); + if ( $post ) { + $value = $post->post_content; + } + if ( empty( $value ) ) { + $value = $this->default; + } + + /** This filter is documented in wp-includes/class-wp-customize-setting.php */ + $value = apply_filters( "customize_value_{$id_base}", $value, $this ); + + return $value; + } + + /** + * Validate CSS. + * + * Checks for imbalanced braces, brackets, and comments. + * Notifications are rendered when the customizer state is saved. + * + * @since 4.7.0 + * @since 4.9.0 Checking for balanced characters has been moved client-side via linting in code editor. + * + * @param string $css The input string. + * @return true|WP_Error True if the input was validated, otherwise WP_Error. + */ + public function validate( $css ) { + $validity = new WP_Error(); + + if ( preg_match( '#add( 'illegal_markup', __( 'Markup is not allowed in CSS.' ) ); + } + + if ( ! $validity->has_errors() ) { + $validity = parent::validate( $css ); + } + return $validity; + } + + /** + * Store the CSS setting value in the custom_css custom post type for the stylesheet. + * + * @since 4.7.0 + * + * @param string $css The input value. + * @return int|false The post ID or false if the value could not be saved. + */ + public function update( $css ) { + if ( empty( $css ) ) { + $css = ''; + } + + $r = wp_update_custom_css_post( + $css, + array( + 'stylesheet' => $this->stylesheet, + ) + ); + + if ( $r instanceof WP_Error ) { + return false; + } + $post_id = $r->ID; + + // Cache post ID in theme mod for performance to avoid additional DB query. + if ( $this->manager->get_stylesheet() === $this->stylesheet ) { + set_theme_mod( 'custom_css_post_id', $post_id ); + } + + return $post_id; + } +} diff --git a/wp-includes/customize/class-wp-customize-date-time-control.php b/wp-includes/customize/class-wp-customize-date-time-control.php new file mode 100644 index 0000000..36bd192 --- /dev/null +++ b/wp-includes/customize/class-wp-customize-date-time-control.php @@ -0,0 +1,282 @@ +max_year ); + $data['minYear'] = intval( $this->min_year ); + $data['allowPastDate'] = (bool) $this->allow_past_date; + $data['twelveHourFormat'] = (bool) $this->twelve_hour_format; + $data['includeTime'] = (bool) $this->include_time; + + return $data; + } + + /** + * Renders a JS template for the content of date time control. + * + * @since 4.9.0 + */ + public function content_template() { + $data = array_merge( $this->json(), $this->get_month_choices() ); + $timezone_info = $this->get_timezone_info(); + + $date_format = get_option( 'date_format' ); + $date_format = preg_replace( '/(? + + <# _.defaults( data, ); #> + <# var idPrefix = _.uniqueId( 'el' ) + '-'; #> + + <# if ( data.label ) { #> + + {{ data.label }} + + <# } #> +
            + <# if ( data.description ) { #> + {{ data.description }} + <# } #> +
            +
            + +
            + + + + + + + + + + + + + + + + +
            +
            + <# if ( data.includeTime ) { #> +
            + +
            + + <# var maxHour = data.twelveHourFormat ? 12 : 23; #> + <# var minHour = data.twelveHourFormat ? 1 : 0; #> + + : + + + <# if ( data.twelveHourFormat ) { #> + + + <# } #> +

            +
            +
            + <# } #> +
            + get_month_abbrev( $wp_locale->get_month( $i ) ); + + /* translators: 1: Month number (01, 02, etc.), 2: Month abbreviation. */ + $months[ $i ]['text'] = sprintf( __( '%1$s-%2$s' ), $i, $month_text ); + $months[ $i ]['value'] = $i; + } + return array( + 'month_choices' => $months, + ); + } + + /** + * Get timezone info. + * + * @since 4.9.0 + * + * @return array abbr and description. + */ + public function get_timezone_info() { + $tz_string = get_option( 'timezone_string' ); + $timezone_info = array(); + + if ( $tz_string ) { + try { + $tz = new DateTimezone( $tz_string ); + } catch ( Exception $e ) { + $tz = ''; + } + + if ( $tz ) { + $now = new DateTime( 'now', $tz ); + $formatted_gmt_offset = $this->format_gmt_offset( $tz->getOffset( $now ) / 3600 ); + $tz_name = str_replace( '_', ' ', $tz->getName() ); + $timezone_info['abbr'] = $now->format( 'T' ); + + $timezone_info['description'] = sprintf( + /* translators: 1: Timezone name, 2: Timezone abbreviation, 3: UTC abbreviation and offset, 4: UTC offset. */ + __( 'Your timezone is set to %1$s (%2$s), currently %3$s (Coordinated Universal Time %4$s).' ), + $tz_name, + '' . $timezone_info['abbr'] . '', + 'UTC' . $formatted_gmt_offset, + $formatted_gmt_offset + ); + } else { + $timezone_info['description'] = ''; + } + } else { + $formatted_gmt_offset = $this->format_gmt_offset( intval( get_option( 'gmt_offset', 0 ) ) ); + + $timezone_info['description'] = sprintf( + /* translators: 1: UTC abbreviation and offset, 2: UTC offset. */ + __( 'Your timezone is set to %1$s (Coordinated Universal Time %2$s).' ), + 'UTC' . $formatted_gmt_offset, + $formatted_gmt_offset + ); + } + + return $timezone_info; + } + + /** + * Format GMT Offset. + * + * @since 4.9.0 + * @see wp_timezone_choice() + * + * @param float $offset Offset in hours. + * @return string Formatted offset. + */ + public function format_gmt_offset( $offset ) { + if ( 0 <= $offset ) { + $formatted_offset = '+' . (string) $offset; + } else { + $formatted_offset = (string) $offset; + } + $formatted_offset = str_replace( + array( '.25', '.5', '.75' ), + array( ':15', ':30', ':45' ), + $formatted_offset + ); + return $formatted_offset; + } +} diff --git a/wp-includes/customize/class-wp-customize-filter-setting.php b/wp-includes/customize/class-wp-customize-filter-setting.php new file mode 100644 index 0000000..ad70f4f --- /dev/null +++ b/wp-includes/customize/class-wp-customize-filter-setting.php @@ -0,0 +1,29 @@ + __( 'Header Image' ), + 'settings' => array( + 'default' => 'header_image', + 'data' => 'header_image_data', + ), + 'section' => 'header_image', + 'removed' => 'remove-header', + 'get_url' => 'get_header_image', + ) + ); + + } + + /** + */ + public function enqueue() { + wp_enqueue_media(); + wp_enqueue_script( 'customize-views' ); + + $this->prepare_control(); + + wp_localize_script( + 'customize-views', + '_wpCustomizeHeader', + array( + 'data' => array( + 'width' => absint( get_theme_support( 'custom-header', 'width' ) ), + 'height' => absint( get_theme_support( 'custom-header', 'height' ) ), + 'flex-width' => absint( get_theme_support( 'custom-header', 'flex-width' ) ), + 'flex-height' => absint( get_theme_support( 'custom-header', 'flex-height' ) ), + 'currentImgSrc' => $this->get_current_image_src(), + ), + 'nonces' => array( + 'add' => wp_create_nonce( 'header-add' ), + 'remove' => wp_create_nonce( 'header-remove' ), + ), + 'uploads' => $this->uploaded_headers, + 'defaults' => $this->default_headers, + ) + ); + + parent::enqueue(); + } + + /** + * @global Custom_Image_Header $custom_image_header + */ + public function prepare_control() { + global $custom_image_header; + if ( empty( $custom_image_header ) ) { + return; + } + + add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_header_image_template' ) ); + + // Process default headers and uploaded headers. + $custom_image_header->process_default_headers(); + $this->default_headers = $custom_image_header->get_default_header_images(); + $this->uploaded_headers = $custom_image_header->get_uploaded_header_images(); + } + + /** + */ + public function print_header_image_template() { + ?> + + + + value(); + if ( isset( $this->get_url ) ) { + $src = call_user_func( $this->get_url, $src ); + return $src; + } + } + + /** + */ + public function render_content() { + $visibility = $this->get_current_image_src() ? '' : ' style="display:none" '; + $width = absint( get_theme_support( 'custom-header', 'width' ) ); + $height = absint( get_theme_support( 'custom-header', 'height' ) ); + ?> +
            + ' . $this->label . ''; + } + ?> +
            +

            + %s × %s', $width, $height ) + ); + } elseif ( $width ) { + printf( + /* translators: %s: Header width in pixels. */ + __( 'Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header width of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit.' ), + sprintf( '%s', $width ) + ); + } else { + printf( + /* translators: %s: Header height in pixels. */ + __( 'Click “Add new image” to upload an image file from your computer. Your theme works best with an image with a header height of %s pixels — you’ll be able to crop your image once you upload it for a perfect fit.' ), + sprintf( '%s', $height ) + ); + } + ?> +

            +
            + +
            +
            +
            +
            + + + + +
            +
            + + + +
            +
            +
            +
            + + + +
            +
            +
            +
            +
            +
            + manager->get_setting( 'header_image' )->post_value(); + } + + if ( is_array( $value ) && isset( $value['choice'] ) ) { + $custom_image_header->set_header_image( $value['choice'] ); + } else { + $custom_image_header->set_header_image( $value ); + } + } +} diff --git a/wp-includes/customize/class-wp-customize-image-control.php b/wp-includes/customize/class-wp-customize-image-control.php new file mode 100644 index 0000000..6244579 --- /dev/null +++ b/wp-includes/customize/class-wp-customize-image-control.php @@ -0,0 +1,59 @@ +button_labels = wp_parse_args( $this->button_labels, $this->get_default_button_labels() ); + } + + /** + * Enqueue control related scripts/styles. + * + * @since 3.4.0 + * @since 4.2.0 Moved from WP_Customize_Upload_Control. + */ + public function enqueue() { + wp_enqueue_media(); + } + + /** + * Refresh the parameters passed to the JavaScript via JSON. + * + * @since 3.4.0 + * @since 4.2.0 Moved from WP_Customize_Upload_Control. + * + * @see WP_Customize_Control::to_json() + */ + public function to_json() { + parent::to_json(); + $this->json['label'] = html_entity_decode( $this->label, ENT_QUOTES, get_bloginfo( 'charset' ) ); + $this->json['mime_type'] = $this->mime_type; + $this->json['button_labels'] = $this->button_labels; + $this->json['canUpload'] = current_user_can( 'upload_files' ); + + $value = $this->value(); + + if ( is_object( $this->setting ) ) { + if ( $this->setting->default ) { + // Fake an attachment model - needs all fields used by template. + // Note that the default value must be a URL, NOT an attachment ID. + $type = in_array( substr( $this->setting->default, -3 ), array( 'jpg', 'png', 'gif', 'bmp' ) ) ? 'image' : 'document'; + $default_attachment = array( + 'id' => 1, + 'url' => $this->setting->default, + 'type' => $type, + 'icon' => wp_mime_type_icon( $type ), + 'title' => wp_basename( $this->setting->default ), + ); + + if ( 'image' === $type ) { + $default_attachment['sizes'] = array( + 'full' => array( 'url' => $this->setting->default ), + ); + } + + $this->json['defaultAttachment'] = $default_attachment; + } + + if ( $value && $this->setting->default && $value === $this->setting->default ) { + // Set the default as the attachment. + $this->json['attachment'] = $this->json['defaultAttachment']; + } elseif ( $value ) { + $this->json['attachment'] = wp_prepare_attachment_for_js( $value ); + } + } + } + + /** + * Don't render any content for this control from PHP. + * + * @since 3.4.0 + * @since 4.2.0 Moved from WP_Customize_Upload_Control. + * + * @see WP_Customize_Media_Control::content_template() + */ + public function render_content() {} + + /** + * Render a JS template for the content of the media control. + * + * @since 4.1.0 + * @since 4.2.0 Moved from WP_Customize_Upload_Control. + */ + public function content_template() { + ?> + <# + var descriptionId = _.uniqueId( 'customize-media-control-description-' ); + var describedByAttr = data.description ? ' aria-describedby="' + descriptionId + '" ' : ''; + #> + <# if ( data.label ) { #> + {{ data.label }} + <# } #> +
            + <# if ( data.description ) { #> + {{{ data.description }}} + <# } #> + + <# if ( data.attachment && data.attachment.id ) { #> +
            +
            + <# if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.medium ) { #> + + <# } else if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.full ) { #> + + <# } else if ( 'audio' === data.attachment.type ) { #> + <# if ( data.attachment.image && data.attachment.image.src && data.attachment.image.src !== data.attachment.icon ) { #> + + <# } else { #> + + <# } #> +

            “{{ data.attachment.title }}”

            + <# if ( data.attachment.album || data.attachment.meta.album ) { #> +

            {{ data.attachment.album || data.attachment.meta.album }}

            + <# } #> + <# if ( data.attachment.artist || data.attachment.meta.artist ) { #> +

            {{ data.attachment.artist || data.attachment.meta.artist }}

            + <# } #> + + <# } else if ( 'video' === data.attachment.type ) { #> +
            + +
            + <# } else { #> + +

            {{ data.attachment.title }}

            + <# } #> +
            +
            + <# if ( data.canUpload ) { #> + + + <# } #> +
            +
            + <# } else { #> +
            + <# if ( data.canUpload ) { #> + + <# } #> +
            + <# if ( data.defaultAttachment ) { #> + + <# } #> +
            +
            + <# } #> + mime_type ) ? strtok( ltrim( $this->mime_type, '/' ), '/' ) : 'default'; + + switch ( $mime_type ) { + case 'video': + return array( + 'select' => __( 'Select video' ), + 'change' => __( 'Change video' ), + 'default' => __( 'Default' ), + 'remove' => __( 'Remove' ), + 'placeholder' => __( 'No video selected' ), + 'frame_title' => __( 'Select video' ), + 'frame_button' => __( 'Choose video' ), + ); + case 'audio': + return array( + 'select' => __( 'Select audio' ), + 'change' => __( 'Change audio' ), + 'default' => __( 'Default' ), + 'remove' => __( 'Remove' ), + 'placeholder' => __( 'No audio selected' ), + 'frame_title' => __( 'Select audio' ), + 'frame_button' => __( 'Choose audio' ), + ); + case 'image': + return array( + 'select' => __( 'Select image' ), + 'site_icon' => __( 'Select site icon' ), + 'change' => __( 'Change image' ), + 'default' => __( 'Default' ), + 'remove' => __( 'Remove' ), + 'placeholder' => __( 'No image selected' ), + 'frame_title' => __( 'Select image' ), + 'frame_button' => __( 'Choose image' ), + ); + default: + return array( + 'select' => __( 'Select file' ), + 'change' => __( 'Change file' ), + 'default' => __( 'Default' ), + 'remove' => __( 'Remove' ), + 'placeholder' => __( 'No file selected' ), + 'frame_title' => __( 'Select file' ), + 'frame_button' => __( 'Choose file' ), + ); + } // End switch(). + } +} diff --git a/wp-includes/customize/class-wp-customize-nav-menu-auto-add-control.php b/wp-includes/customize/class-wp-customize-nav-menu-auto-add-control.php new file mode 100644 index 0000000..c47fed4 --- /dev/null +++ b/wp-includes/customize/class-wp-customize-nav-menu-auto-add-control.php @@ -0,0 +1,51 @@ + + <# var elementId = _.uniqueId( 'customize-nav-menu-auto-add-control-' ); #> + + + + + + +

            + +

            +
            + + +
            +

            + setting->term_id; + + return $exported; + } +} diff --git a/wp-includes/customize/class-wp-customize-nav-menu-item-control.php b/wp-includes/customize/class-wp-customize-nav-menu-item-control.php new file mode 100644 index 0000000..b842cab --- /dev/null +++ b/wp-includes/customize/class-wp-customize-nav-menu-item-control.php @@ -0,0 +1,181 @@ + + + + + + setting->post_id; + + return $exported; + } +} diff --git a/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php b/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php new file mode 100644 index 0000000..0be10e2 --- /dev/null +++ b/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php @@ -0,0 +1,898 @@ +-?\d+)\]$/'; + + const POST_TYPE = 'nav_menu_item'; + + const TYPE = 'nav_menu_item'; + + /** + * Setting type. + * + * @since 4.3.0 + * @var string + */ + public $type = self::TYPE; + + /** + * Default setting value. + * + * @since 4.3.0 + * @var array + * + * @see wp_setup_nav_menu_item() + */ + public $default = array( + // The $menu_item_data for wp_update_nav_menu_item(). + 'object_id' => 0, + 'object' => '', // Taxonomy name. + 'menu_item_parent' => 0, // A.K.A. menu-item-parent-id; note that post_parent is different, and not included. + 'position' => 0, // A.K.A. menu_order. + 'type' => 'custom', // Note that type_label is not included here. + 'title' => '', + 'url' => '', + 'target' => '', + 'attr_title' => '', + 'description' => '', + 'classes' => '', + 'xfn' => '', + 'status' => 'publish', + 'original_title' => '', + 'nav_menu_term_id' => 0, // This will be supplied as the $menu_id arg for wp_update_nav_menu_item(). + '_invalid' => false, + ); + + /** + * Default transport. + * + * @since 4.3.0 + * @since 4.5.0 Default changed to 'refresh' + * @var string + */ + public $transport = 'refresh'; + + /** + * The post ID represented by this setting instance. This is the db_id. + * + * A negative value represents a placeholder ID for a new menu not yet saved. + * + * @since 4.3.0 + * @var int + */ + public $post_id; + + /** + * Storage of pre-setup menu item to prevent wasted calls to wp_setup_nav_menu_item(). + * + * @since 4.3.0 + * @var array|null + */ + protected $value; + + /** + * Previous (placeholder) post ID used before creating a new menu item. + * + * This value will be exported to JS via the customize_save_response filter + * so that JavaScript can update the settings to refer to the newly-assigned + * post ID. This value is always negative to indicate it does not refer to + * a real post. + * + * @since 4.3.0 + * @var int + * + * @see WP_Customize_Nav_Menu_Item_Setting::update() + * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response() + */ + public $previous_post_id; + + /** + * When previewing or updating a menu item, this stores the previous nav_menu_term_id + * which ensures that we can apply the proper filters. + * + * @since 4.3.0 + * @var int + */ + public $original_nav_menu_term_id; + + /** + * Whether or not update() was called. + * + * @since 4.3.0 + * @var bool + */ + protected $is_updated = false; + + /** + * Status for calling the update method, used in customize_save_response filter. + * + * See {@see 'customize_save_response'}. + * + * When status is inserted, the placeholder post ID is stored in $previous_post_id. + * When status is error, the error is stored in $update_error. + * + * @since 4.3.0 + * @var string updated|inserted|deleted|error + * + * @see WP_Customize_Nav_Menu_Item_Setting::update() + * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response() + */ + public $update_status; + + /** + * Any error object returned by wp_update_nav_menu_item() when setting is updated. + * + * @since 4.3.0 + * @var WP_Error + * + * @see WP_Customize_Nav_Menu_Item_Setting::update() + * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response() + */ + public $update_error; + + /** + * Constructor. + * + * Any supplied $args override class property defaults. + * + * @since 4.3.0 + * + * @param WP_Customize_Manager $manager Customizer bootstrap instance. + * @param string $id A specific ID of the setting. + * Can be a theme mod or option name. + * @param array $args Optional. Setting arguments. + * + * @throws Exception If $id is not valid for this setting type. + */ + public function __construct( WP_Customize_Manager $manager, $id, array $args = array() ) { + if ( empty( $manager->nav_menus ) ) { + throw new Exception( 'Expected WP_Customize_Manager::$nav_menus to be set.' ); + } + + if ( ! preg_match( self::ID_PATTERN, $id, $matches ) ) { + throw new Exception( "Illegal widget setting ID: $id" ); + } + + $this->post_id = intval( $matches['id'] ); + add_action( 'wp_update_nav_menu_item', array( $this, 'flush_cached_value' ), 10, 2 ); + + parent::__construct( $manager, $id, $args ); + + // Ensure that an initially-supplied value is valid. + if ( isset( $this->value ) ) { + $this->populate_value(); + foreach ( array_diff( array_keys( $this->default ), array_keys( $this->value ) ) as $missing ) { + throw new Exception( "Supplied nav_menu_item value missing property: $missing" ); + } + } + + } + + /** + * Clear the cached value when this nav menu item is updated. + * + * @since 4.3.0 + * + * @param int $menu_id The term ID for the menu. + * @param int $menu_item_id The post ID for the menu item. + */ + public function flush_cached_value( $menu_id, $menu_item_id ) { + unset( $menu_id ); + if ( $menu_item_id === $this->post_id ) { + $this->value = null; + } + } + + /** + * Get the instance data for a given nav_menu_item setting. + * + * @since 4.3.0 + * + * @see wp_setup_nav_menu_item() + * + * @return array|false Instance data array, or false if the item is marked for deletion. + */ + public function value() { + if ( $this->is_previewed && get_current_blog_id() === $this->_previewed_blog_id ) { + $undefined = new stdClass(); // Symbol. + $post_value = $this->post_value( $undefined ); + + if ( $undefined === $post_value ) { + $value = $this->_original_value; + } else { + $value = $post_value; + } + if ( ! empty( $value ) && empty( $value['original_title'] ) ) { + $value['original_title'] = $this->get_original_title( (object) $value ); + } + } elseif ( isset( $this->value ) ) { + $value = $this->value; + } else { + $value = false; + + // Note that a ID of less than one indicates a nav_menu not yet inserted. + if ( $this->post_id > 0 ) { + $post = get_post( $this->post_id ); + if ( $post && self::POST_TYPE === $post->post_type ) { + $is_title_empty = empty( $post->post_title ); + $value = (array) wp_setup_nav_menu_item( $post ); + if ( $is_title_empty ) { + $value['title'] = ''; + } + } + } + + if ( ! is_array( $value ) ) { + $value = $this->default; + } + + // Cache the value for future calls to avoid having to re-call wp_setup_nav_menu_item(). + $this->value = $value; + $this->populate_value(); + $value = $this->value; + } + + if ( ! empty( $value ) && empty( $value['type_label'] ) ) { + $value['type_label'] = $this->get_type_label( (object) $value ); + } + + return $value; + } + + /** + * Get original title. + * + * @since 4.7.0 + * + * @param object $item Nav menu item. + * @return string The original title. + */ + protected function get_original_title( $item ) { + $original_title = ''; + if ( 'post_type' === $item->type && ! empty( $item->object_id ) ) { + $original_object = get_post( $item->object_id ); + if ( $original_object ) { + /** This filter is documented in wp-includes/post-template.php */ + $original_title = apply_filters( 'the_title', $original_object->post_title, $original_object->ID ); + + if ( '' === $original_title ) { + /* translators: %d: ID of a post. */ + $original_title = sprintf( __( '#%d (no title)' ), $original_object->ID ); + } + } + } elseif ( 'taxonomy' === $item->type && ! empty( $item->object_id ) ) { + $original_term_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' ); + if ( ! is_wp_error( $original_term_title ) ) { + $original_title = $original_term_title; + } + } elseif ( 'post_type_archive' === $item->type ) { + $original_object = get_post_type_object( $item->object ); + if ( $original_object ) { + $original_title = $original_object->labels->archives; + } + } + $original_title = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) ); + return $original_title; + } + + /** + * Get type label. + * + * @since 4.7.0 + * + * @param object $item Nav menu item. + * @return string The type label. + */ + protected function get_type_label( $item ) { + if ( 'post_type' === $item->type ) { + $object = get_post_type_object( $item->object ); + if ( $object ) { + $type_label = $object->labels->singular_name; + } else { + $type_label = $item->object; + } + } elseif ( 'taxonomy' === $item->type ) { + $object = get_taxonomy( $item->object ); + if ( $object ) { + $type_label = $object->labels->singular_name; + } else { + $type_label = $item->object; + } + } elseif ( 'post_type_archive' === $item->type ) { + $type_label = __( 'Post Type Archive' ); + } else { + $type_label = __( 'Custom Link' ); + } + return $type_label; + } + + /** + * Ensure that the value is fully populated with the necessary properties. + * + * Translates some properties added by wp_setup_nav_menu_item() and removes others. + * + * @since 4.3.0 + * + * @see WP_Customize_Nav_Menu_Item_Setting::value() + */ + protected function populate_value() { + if ( ! is_array( $this->value ) ) { + return; + } + + if ( isset( $this->value['menu_order'] ) ) { + $this->value['position'] = $this->value['menu_order']; + unset( $this->value['menu_order'] ); + } + if ( isset( $this->value['post_status'] ) ) { + $this->value['status'] = $this->value['post_status']; + unset( $this->value['post_status'] ); + } + + if ( ! isset( $this->value['original_title'] ) ) { + $this->value['original_title'] = $this->get_original_title( (object) $this->value ); + } + + if ( ! isset( $this->value['nav_menu_term_id'] ) && $this->post_id > 0 ) { + $menus = wp_get_post_terms( + $this->post_id, + WP_Customize_Nav_Menu_Setting::TAXONOMY, + array( + 'fields' => 'ids', + ) + ); + if ( ! empty( $menus ) ) { + $this->value['nav_menu_term_id'] = array_shift( $menus ); + } else { + $this->value['nav_menu_term_id'] = 0; + } + } + + foreach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) { + if ( ! is_int( $this->value[ $key ] ) ) { + $this->value[ $key ] = intval( $this->value[ $key ] ); + } + } + foreach ( array( 'classes', 'xfn' ) as $key ) { + if ( is_array( $this->value[ $key ] ) ) { + $this->value[ $key ] = implode( ' ', $this->value[ $key ] ); + } + } + + if ( ! isset( $this->value['title'] ) ) { + $this->value['title'] = ''; + } + + if ( ! isset( $this->value['_invalid'] ) ) { + $this->value['_invalid'] = false; + $is_known_invalid = ( + ( ( 'post_type' === $this->value['type'] || 'post_type_archive' === $this->value['type'] ) && ! post_type_exists( $this->value['object'] ) ) + || + ( 'taxonomy' === $this->value['type'] && ! taxonomy_exists( $this->value['object'] ) ) + ); + if ( $is_known_invalid ) { + $this->value['_invalid'] = true; + } + } + + // Remove remaining properties available on a setup nav_menu_item post object which aren't relevant to the setting value. + $irrelevant_properties = array( + 'ID', + 'comment_count', + 'comment_status', + 'db_id', + 'filter', + 'guid', + 'ping_status', + 'pinged', + 'post_author', + 'post_content', + 'post_content_filtered', + 'post_date', + 'post_date_gmt', + 'post_excerpt', + 'post_mime_type', + 'post_modified', + 'post_modified_gmt', + 'post_name', + 'post_parent', + 'post_password', + 'post_title', + 'post_type', + 'to_ping', + ); + foreach ( $irrelevant_properties as $property ) { + unset( $this->value[ $property ] ); + } + } + + /** + * Handle previewing the setting. + * + * @since 4.3.0 + * @since 4.4.0 Added boolean return value. + * + * @see WP_Customize_Manager::post_value() + * + * @return bool False if method short-circuited due to no-op. + */ + public function preview() { + if ( $this->is_previewed ) { + return false; + } + + $undefined = new stdClass(); + $is_placeholder = ( $this->post_id < 0 ); + $is_dirty = ( $undefined !== $this->post_value( $undefined ) ); + if ( ! $is_placeholder && ! $is_dirty ) { + return false; + } + + $this->is_previewed = true; + $this->_original_value = $this->value(); + $this->original_nav_menu_term_id = $this->_original_value['nav_menu_term_id']; + $this->_previewed_blog_id = get_current_blog_id(); + + add_filter( 'wp_get_nav_menu_items', array( $this, 'filter_wp_get_nav_menu_items' ), 10, 3 ); + + $sort_callback = array( __CLASS__, 'sort_wp_get_nav_menu_items' ); + if ( ! has_filter( 'wp_get_nav_menu_items', $sort_callback ) ) { + add_filter( 'wp_get_nav_menu_items', array( __CLASS__, 'sort_wp_get_nav_menu_items' ), 1000, 3 ); + } + + // @todo Add get_post_metadata filters for plugins to add their data. + + return true; + } + + /** + * Filters the wp_get_nav_menu_items() result to supply the previewed menu items. + * + * @since 4.3.0 + * + * @see wp_get_nav_menu_items() + * + * @param WP_Post[] $items An array of menu item post objects. + * @param WP_Term $menu The menu object. + * @param array $args An array of arguments used to retrieve menu item objects. + * @return WP_Post[] Array of menu item objects. + */ + public function filter_wp_get_nav_menu_items( $items, $menu, $args ) { + $this_item = $this->value(); + $current_nav_menu_term_id = null; + if ( isset( $this_item['nav_menu_term_id'] ) ) { + $current_nav_menu_term_id = $this_item['nav_menu_term_id']; + unset( $this_item['nav_menu_term_id'] ); + } + + $should_filter = ( + $menu->term_id === $this->original_nav_menu_term_id + || + $menu->term_id === $current_nav_menu_term_id + ); + if ( ! $should_filter ) { + return $items; + } + + // Handle deleted menu item, or menu item moved to another menu. + $should_remove = ( + false === $this_item + || + ( isset( $this_item['_invalid'] ) && true === $this_item['_invalid'] ) + || + ( + $this->original_nav_menu_term_id === $menu->term_id + && + $current_nav_menu_term_id !== $this->original_nav_menu_term_id + ) + ); + if ( $should_remove ) { + $filtered_items = array(); + foreach ( $items as $item ) { + if ( $item->db_id !== $this->post_id ) { + $filtered_items[] = $item; + } + } + return $filtered_items; + } + + $mutated = false; + $should_update = ( + is_array( $this_item ) + && + $current_nav_menu_term_id === $menu->term_id + ); + if ( $should_update ) { + foreach ( $items as $item ) { + if ( $item->db_id === $this->post_id ) { + foreach ( get_object_vars( $this->value_as_wp_post_nav_menu_item() ) as $key => $value ) { + $item->$key = $value; + } + $mutated = true; + } + } + + // Not found so we have to append it.. + if ( ! $mutated ) { + $items[] = $this->value_as_wp_post_nav_menu_item(); + } + } + + return $items; + } + + /** + * Re-apply the tail logic also applied on $items by wp_get_nav_menu_items(). + * + * @since 4.3.0 + * + * @see wp_get_nav_menu_items() + * + * @param WP_Post[] $items An array of menu item post objects. + * @param WP_Term $menu The menu object. + * @param array $args An array of arguments used to retrieve menu item objects. + * @return WP_Post[] Array of menu item objects. + */ + public static function sort_wp_get_nav_menu_items( $items, $menu, $args ) { + // @todo We should probably re-apply some constraints imposed by $args. + unset( $args['include'] ); + + // Remove invalid items only in front end. + if ( ! is_admin() ) { + $items = array_filter( $items, '_is_valid_nav_menu_item' ); + } + + if ( ARRAY_A === $args['output'] ) { + $items = wp_list_sort( + $items, + array( + $args['output_key'] => 'ASC', + ) + ); + $i = 1; + + foreach ( $items as $k => $item ) { + $items[ $k ]->{$args['output_key']} = $i++; + } + } + + return $items; + } + + /** + * Get the value emulated into a WP_Post and set up as a nav_menu_item. + * + * @since 4.3.0 + * + * @return WP_Post With wp_setup_nav_menu_item() applied. + */ + public function value_as_wp_post_nav_menu_item() { + $item = (object) $this->value(); + unset( $item->nav_menu_term_id ); + + $item->post_status = $item->status; + unset( $item->status ); + + $item->post_type = 'nav_menu_item'; + $item->menu_order = $item->position; + unset( $item->position ); + + if ( empty( $item->original_title ) ) { + $item->original_title = $this->get_original_title( $item ); + } + if ( empty( $item->title ) && ! empty( $item->original_title ) ) { + $item->title = $item->original_title; + } + if ( $item->title ) { + $item->post_title = $item->title; + } + + $item->ID = $this->post_id; + $item->db_id = $this->post_id; + $post = new WP_Post( (object) $item ); + + if ( empty( $post->post_author ) ) { + $post->post_author = get_current_user_id(); + } + + if ( ! isset( $post->type_label ) ) { + $post->type_label = $this->get_type_label( $post ); + } + + // Ensure nav menu item URL is set according to linked object. + if ( 'post_type' === $post->type && ! empty( $post->object_id ) ) { + $post->url = get_permalink( $post->object_id ); + } elseif ( 'taxonomy' === $post->type && ! empty( $post->object ) && ! empty( $post->object_id ) ) { + $post->url = get_term_link( (int) $post->object_id, $post->object ); + } elseif ( 'post_type_archive' === $post->type && ! empty( $post->object ) ) { + $post->url = get_post_type_archive_link( $post->object ); + } + if ( is_wp_error( $post->url ) ) { + $post->url = ''; + } + + /** This filter is documented in wp-includes/nav-menu.php */ + $post->attr_title = apply_filters( 'nav_menu_attr_title', $post->attr_title ); + + /** This filter is documented in wp-includes/nav-menu.php */ + $post->description = apply_filters( 'nav_menu_description', wp_trim_words( $post->description, 200 ) ); + + /** This filter is documented in wp-includes/nav-menu.php */ + $post = apply_filters( 'wp_setup_nav_menu_item', $post ); + + return $post; + } + + /** + * Sanitize an input. + * + * Note that parent::sanitize() erroneously does wp_unslash() on $value, but + * we remove that in this override. + * + * @since 4.3.0 + * + * @param array $menu_item_value The value to sanitize. + * @return array|false|null|WP_Error Null or WP_Error if an input isn't valid. False if it is marked for deletion. + * Otherwise the sanitized value. + */ + public function sanitize( $menu_item_value ) { + // Menu is marked for deletion. + if ( false === $menu_item_value ) { + return $menu_item_value; + } + + // Invalid. + if ( ! is_array( $menu_item_value ) ) { + return null; + } + + $default = array( + 'object_id' => 0, + 'object' => '', + 'menu_item_parent' => 0, + 'position' => 0, + 'type' => 'custom', + 'title' => '', + 'url' => '', + 'target' => '', + 'attr_title' => '', + 'description' => '', + 'classes' => '', + 'xfn' => '', + 'status' => 'publish', + 'original_title' => '', + 'nav_menu_term_id' => 0, + '_invalid' => false, + ); + $menu_item_value = array_merge( $default, $menu_item_value ); + $menu_item_value = wp_array_slice_assoc( $menu_item_value, array_keys( $default ) ); + $menu_item_value['position'] = intval( $menu_item_value['position'] ); + + foreach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) { + // Note we need to allow negative-integer IDs for previewed objects not inserted yet. + $menu_item_value[ $key ] = intval( $menu_item_value[ $key ] ); + } + + foreach ( array( 'type', 'object', 'target' ) as $key ) { + $menu_item_value[ $key ] = sanitize_key( $menu_item_value[ $key ] ); + } + + foreach ( array( 'xfn', 'classes' ) as $key ) { + $value = $menu_item_value[ $key ]; + if ( ! is_array( $value ) ) { + $value = explode( ' ', $value ); + } + $menu_item_value[ $key ] = implode( ' ', array_map( 'sanitize_html_class', $value ) ); + } + + $menu_item_value['original_title'] = sanitize_text_field( $menu_item_value['original_title'] ); + + // Apply the same filters as when calling wp_insert_post(). + + /** This filter is documented in wp-includes/post.php */ + $menu_item_value['title'] = wp_unslash( apply_filters( 'title_save_pre', wp_slash( $menu_item_value['title'] ) ) ); + + /** This filter is documented in wp-includes/post.php */ + $menu_item_value['attr_title'] = wp_unslash( apply_filters( 'excerpt_save_pre', wp_slash( $menu_item_value['attr_title'] ) ) ); + + /** This filter is documented in wp-includes/post.php */ + $menu_item_value['description'] = wp_unslash( apply_filters( 'content_save_pre', wp_slash( $menu_item_value['description'] ) ) ); + + if ( '' !== $menu_item_value['url'] ) { + $menu_item_value['url'] = esc_url_raw( $menu_item_value['url'] ); + if ( '' === $menu_item_value['url'] ) { + return new WP_Error( 'invalid_url', __( 'Invalid URL.' ) ); // Fail sanitization if URL is invalid. + } + } + if ( 'publish' !== $menu_item_value['status'] ) { + $menu_item_value['status'] = 'draft'; + } + + $menu_item_value['_invalid'] = (bool) $menu_item_value['_invalid']; + + /** This filter is documented in wp-includes/class-wp-customize-setting.php */ + return apply_filters( "customize_sanitize_{$this->id}", $menu_item_value, $this ); + } + + /** + * Creates/updates the nav_menu_item post for this setting. + * + * Any created menu items will have their assigned post IDs exported to the client + * via the {@see 'customize_save_response'} filter. Likewise, any errors will be + * exported to the client via the customize_save_response() filter. + * + * To delete a menu, the client can send false as the value. + * + * @since 4.3.0 + * + * @see wp_update_nav_menu_item() + * + * @param array|false $value The menu item array to update. If false, then the menu item will be deleted + * entirely. See WP_Customize_Nav_Menu_Item_Setting::$default for what the value + * should consist of. + * @return null|void + */ + protected function update( $value ) { + if ( $this->is_updated ) { + return; + } + + $this->is_updated = true; + $is_placeholder = ( $this->post_id < 0 ); + $is_delete = ( false === $value ); + + // Update the cached value. + $this->value = $value; + + add_filter( 'customize_save_response', array( $this, 'amend_customize_save_response' ) ); + + if ( $is_delete ) { + // If the current setting post is a placeholder, a delete request is a no-op. + if ( $is_placeholder ) { + $this->update_status = 'deleted'; + } else { + $r = wp_delete_post( $this->post_id, true ); + + if ( false === $r ) { + $this->update_error = new WP_Error( 'delete_failure' ); + $this->update_status = 'error'; + } else { + $this->update_status = 'deleted'; + } + // @todo send back the IDs for all associated nav menu items deleted, so these settings (and controls) can be removed from Customizer? + } + } else { + + // Handle saving menu items for menus that are being newly-created. + if ( $value['nav_menu_term_id'] < 0 ) { + $nav_menu_setting_id = sprintf( 'nav_menu[%s]', $value['nav_menu_term_id'] ); + $nav_menu_setting = $this->manager->get_setting( $nav_menu_setting_id ); + + if ( ! $nav_menu_setting || ! ( $nav_menu_setting instanceof WP_Customize_Nav_Menu_Setting ) ) { + $this->update_status = 'error'; + $this->update_error = new WP_Error( 'unexpected_nav_menu_setting' ); + return; + } + + if ( false === $nav_menu_setting->save() ) { + $this->update_status = 'error'; + $this->update_error = new WP_Error( 'nav_menu_setting_failure' ); + return; + } + + if ( intval( $value['nav_menu_term_id'] ) !== $nav_menu_setting->previous_term_id ) { + $this->update_status = 'error'; + $this->update_error = new WP_Error( 'unexpected_previous_term_id' ); + return; + } + + $value['nav_menu_term_id'] = $nav_menu_setting->term_id; + } + + // Handle saving a nav menu item that is a child of a nav menu item being newly-created. + if ( $value['menu_item_parent'] < 0 ) { + $parent_nav_menu_item_setting_id = sprintf( 'nav_menu_item[%s]', $value['menu_item_parent'] ); + $parent_nav_menu_item_setting = $this->manager->get_setting( $parent_nav_menu_item_setting_id ); + + if ( ! $parent_nav_menu_item_setting || ! ( $parent_nav_menu_item_setting instanceof WP_Customize_Nav_Menu_Item_Setting ) ) { + $this->update_status = 'error'; + $this->update_error = new WP_Error( 'unexpected_nav_menu_item_setting' ); + return; + } + + if ( false === $parent_nav_menu_item_setting->save() ) { + $this->update_status = 'error'; + $this->update_error = new WP_Error( 'nav_menu_item_setting_failure' ); + return; + } + + if ( intval( $value['menu_item_parent'] ) !== $parent_nav_menu_item_setting->previous_post_id ) { + $this->update_status = 'error'; + $this->update_error = new WP_Error( 'unexpected_previous_post_id' ); + return; + } + + $value['menu_item_parent'] = $parent_nav_menu_item_setting->post_id; + } + + // Insert or update menu. + $menu_item_data = array( + 'menu-item-object-id' => $value['object_id'], + 'menu-item-object' => $value['object'], + 'menu-item-parent-id' => $value['menu_item_parent'], + 'menu-item-position' => $value['position'], + 'menu-item-type' => $value['type'], + 'menu-item-title' => $value['title'], + 'menu-item-url' => $value['url'], + 'menu-item-description' => $value['description'], + 'menu-item-attr-title' => $value['attr_title'], + 'menu-item-target' => $value['target'], + 'menu-item-classes' => $value['classes'], + 'menu-item-xfn' => $value['xfn'], + 'menu-item-status' => $value['status'], + ); + + $r = wp_update_nav_menu_item( + $value['nav_menu_term_id'], + $is_placeholder ? 0 : $this->post_id, + wp_slash( $menu_item_data ) + ); + + if ( is_wp_error( $r ) ) { + $this->update_status = 'error'; + $this->update_error = $r; + } else { + if ( $is_placeholder ) { + $this->previous_post_id = $this->post_id; + $this->post_id = $r; + $this->update_status = 'inserted'; + } else { + $this->update_status = 'updated'; + } + } + } + + } + + /** + * Export data for the JS client. + * + * @since 4.3.0 + * + * @see WP_Customize_Nav_Menu_Item_Setting::update() + * + * @param array $data Additional information passed back to the 'saved' event on `wp.customize`. + * @return array Save response data. + */ + public function amend_customize_save_response( $data ) { + if ( ! isset( $data['nav_menu_item_updates'] ) ) { + $data['nav_menu_item_updates'] = array(); + } + + $data['nav_menu_item_updates'][] = array( + 'post_id' => $this->post_id, + 'previous_post_id' => $this->previous_post_id, + 'error' => $this->update_error ? $this->update_error->get_error_code() : null, + 'status' => $this->update_status, + ); + return $data; + } +} diff --git a/wp-includes/customize/class-wp-customize-nav-menu-location-control.php b/wp-includes/customize/class-wp-customize-nav-menu-location-control.php new file mode 100644 index 0000000..4877ada --- /dev/null +++ b/wp-includes/customize/class-wp-customize-nav-menu-location-control.php @@ -0,0 +1,89 @@ +json['locationId'] = $this->location_id; + } + + /** + * Render content just like a normal select control. + * + * @since 4.3.0 + * @since 4.9.0 Added a button to create menus. + */ + public function render_content() { + if ( empty( $this->choices ) ) { + return; + } + + $value_hidden_class = ''; + $no_value_hidden_class = ''; + if ( $this->value() ) { + $value_hidden_class = ' hidden'; + } else { + $no_value_hidden_class = ' hidden'; + } + ?> + + + + + <# var elementId; #> + + + + <# if ( data.description ) { #> +

            {{ data.description }}

            + <# } #> + id ) ); + + return $exported; + } +} diff --git a/wp-includes/customize/class-wp-customize-nav-menu-setting.php b/wp-includes/customize/class-wp-customize-nav-menu-setting.php new file mode 100644 index 0000000..3ce4ab9 --- /dev/null +++ b/wp-includes/customize/class-wp-customize-nav-menu-setting.php @@ -0,0 +1,649 @@ +-?\d+)\]$/'; + + const TAXONOMY = 'nav_menu'; + + const TYPE = 'nav_menu'; + + /** + * Setting type. + * + * @since 4.3.0 + * @var string + */ + public $type = self::TYPE; + + /** + * Default setting value. + * + * @since 4.3.0 + * @var array + * + * @see wp_get_nav_menu_object() + */ + public $default = array( + 'name' => '', + 'description' => '', + 'parent' => 0, + 'auto_add' => false, + ); + + /** + * Default transport. + * + * @since 4.3.0 + * @var string + */ + public $transport = 'postMessage'; + + /** + * The term ID represented by this setting instance. + * + * A negative value represents a placeholder ID for a new menu not yet saved. + * + * @since 4.3.0 + * @var int + */ + public $term_id; + + /** + * Previous (placeholder) term ID used before creating a new menu. + * + * This value will be exported to JS via the {@see 'customize_save_response'} filter + * so that JavaScript can update the settings to refer to the newly-assigned + * term ID. This value is always negative to indicate it does not refer to + * a real term. + * + * @since 4.3.0 + * @var int + * + * @see WP_Customize_Nav_Menu_Setting::update() + * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response() + */ + public $previous_term_id; + + /** + * Whether or not update() was called. + * + * @since 4.3.0 + * @var bool + */ + protected $is_updated = false; + + /** + * Status for calling the update method, used in customize_save_response filter. + * + * See {@see 'customize_save_response'}. + * + * When status is inserted, the placeholder term ID is stored in `$previous_term_id`. + * When status is error, the error is stored in `$update_error`. + * + * @since 4.3.0 + * @var string updated|inserted|deleted|error + * + * @see WP_Customize_Nav_Menu_Setting::update() + * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response() + */ + public $update_status; + + /** + * Any error object returned by wp_update_nav_menu_object() when setting is updated. + * + * @since 4.3.0 + * @var WP_Error + * + * @see WP_Customize_Nav_Menu_Setting::update() + * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response() + */ + public $update_error; + + /** + * Constructor. + * + * Any supplied $args override class property defaults. + * + * @since 4.3.0 + * + * @param WP_Customize_Manager $manager Customizer bootstrap instance. + * @param string $id A specific ID of the setting. + * Can be a theme mod or option name. + * @param array $args Optional. Setting arguments. + * + * @throws Exception If $id is not valid for this setting type. + */ + public function __construct( WP_Customize_Manager $manager, $id, array $args = array() ) { + if ( empty( $manager->nav_menus ) ) { + throw new Exception( 'Expected WP_Customize_Manager::$nav_menus to be set.' ); + } + + if ( ! preg_match( self::ID_PATTERN, $id, $matches ) ) { + throw new Exception( "Illegal widget setting ID: $id" ); + } + + $this->term_id = intval( $matches['id'] ); + + parent::__construct( $manager, $id, $args ); + } + + /** + * Get the instance data for a given widget setting. + * + * @since 4.3.0 + * + * @see wp_get_nav_menu_object() + * + * @return array Instance data. + */ + public function value() { + if ( $this->is_previewed && get_current_blog_id() === $this->_previewed_blog_id ) { + $undefined = new stdClass(); // Symbol. + $post_value = $this->post_value( $undefined ); + + if ( $undefined === $post_value ) { + $value = $this->_original_value; + } else { + $value = $post_value; + } + } else { + $value = false; + + // Note that a term_id of less than one indicates a nav_menu not yet inserted. + if ( $this->term_id > 0 ) { + $term = wp_get_nav_menu_object( $this->term_id ); + + if ( $term ) { + $value = wp_array_slice_assoc( (array) $term, array_keys( $this->default ) ); + + $nav_menu_options = (array) get_option( 'nav_menu_options', array() ); + $value['auto_add'] = false; + + if ( isset( $nav_menu_options['auto_add'] ) && is_array( $nav_menu_options['auto_add'] ) ) { + $value['auto_add'] = in_array( $term->term_id, $nav_menu_options['auto_add'] ); + } + } + } + + if ( ! is_array( $value ) ) { + $value = $this->default; + } + } + return $value; + } + + /** + * Handle previewing the setting. + * + * @since 4.3.0 + * @since 4.4.0 Added boolean return value + * + * @see WP_Customize_Manager::post_value() + * + * @return bool False if method short-circuited due to no-op. + */ + public function preview() { + if ( $this->is_previewed ) { + return false; + } + + $undefined = new stdClass(); + $is_placeholder = ( $this->term_id < 0 ); + $is_dirty = ( $undefined !== $this->post_value( $undefined ) ); + if ( ! $is_placeholder && ! $is_dirty ) { + return false; + } + + $this->is_previewed = true; + $this->_original_value = $this->value(); + $this->_previewed_blog_id = get_current_blog_id(); + + add_filter( 'wp_get_nav_menus', array( $this, 'filter_wp_get_nav_menus' ), 10, 2 ); + add_filter( 'wp_get_nav_menu_object', array( $this, 'filter_wp_get_nav_menu_object' ), 10, 2 ); + add_filter( 'default_option_nav_menu_options', array( $this, 'filter_nav_menu_options' ) ); + add_filter( 'option_nav_menu_options', array( $this, 'filter_nav_menu_options' ) ); + + return true; + } + + /** + * Filters the wp_get_nav_menus() result to ensure the inserted menu object is included, and the deleted one is removed. + * + * @since 4.3.0 + * + * @see wp_get_nav_menus() + * + * @param WP_Term[] $menus An array of menu objects. + * @param array $args An array of arguments used to retrieve menu objects. + * @return WP_Term[] Array of menu objects. + */ + public function filter_wp_get_nav_menus( $menus, $args ) { + if ( get_current_blog_id() !== $this->_previewed_blog_id ) { + return $menus; + } + + $setting_value = $this->value(); + $is_delete = ( false === $setting_value ); + $index = -1; + + // Find the existing menu item's position in the list. + foreach ( $menus as $i => $menu ) { + if ( (int) $this->term_id === (int) $menu->term_id || (int) $this->previous_term_id === (int) $menu->term_id ) { + $index = $i; + break; + } + } + + if ( $is_delete ) { + // Handle deleted menu by removing it from the list. + if ( -1 !== $index ) { + array_splice( $menus, $index, 1 ); + } + } else { + // Handle menus being updated or inserted. + $menu_obj = (object) array_merge( + array( + 'term_id' => $this->term_id, + 'term_taxonomy_id' => $this->term_id, + 'slug' => sanitize_title( $setting_value['name'] ), + 'count' => 0, + 'term_group' => 0, + 'taxonomy' => self::TAXONOMY, + 'filter' => 'raw', + ), + $setting_value + ); + + array_splice( $menus, $index, ( -1 === $index ? 0 : 1 ), array( $menu_obj ) ); + } + + // Make sure the menu objects get re-sorted after an update/insert. + if ( ! $is_delete && ! empty( $args['orderby'] ) ) { + $menus = wp_list_sort( + $menus, + array( + $args['orderby'] => 'ASC', + ) + ); + } + // @todo Add support for $args['hide_empty'] === true. + + return $menus; + } + + /** + * Temporary non-closure passing of orderby value to function. + * + * @since 4.3.0 + * @var string + * + * @see WP_Customize_Nav_Menu_Setting::filter_wp_get_nav_menus() + * @see WP_Customize_Nav_Menu_Setting::_sort_menus_by_orderby() + */ + protected $_current_menus_sort_orderby; + + /** + * Sort menu objects by the class-supplied orderby property. + * + * This is a workaround for a lack of closures. + * + * @since 4.3.0 + * @deprecated 4.7.0 Use wp_list_sort() + * + * @param object $menu1 + * @param object $menu2 + * @return int + * + * @see WP_Customize_Nav_Menu_Setting::filter_wp_get_nav_menus() + */ + protected function _sort_menus_by_orderby( $menu1, $menu2 ) { + _deprecated_function( __METHOD__, '4.7.0', 'wp_list_sort' ); + + $key = $this->_current_menus_sort_orderby; + return strcmp( $menu1->$key, $menu2->$key ); + } + + /** + * Filters the wp_get_nav_menu_object() result to supply the previewed menu object. + * + * Requesting a nav_menu object by anything but ID is not supported. + * + * @since 4.3.0 + * + * @see wp_get_nav_menu_object() + * + * @param object|null $menu_obj Object returned by wp_get_nav_menu_object(). + * @param string $menu_id ID of the nav_menu term. Requests by slug or name will be ignored. + * @return object|null + */ + public function filter_wp_get_nav_menu_object( $menu_obj, $menu_id ) { + $ok = ( + get_current_blog_id() === $this->_previewed_blog_id + && + is_int( $menu_id ) + && + $menu_id === $this->term_id + ); + if ( ! $ok ) { + return $menu_obj; + } + + $setting_value = $this->value(); + + // Handle deleted menus. + if ( false === $setting_value ) { + return false; + } + + // Handle sanitization failure by preventing short-circuiting. + if ( null === $setting_value ) { + return $menu_obj; + } + + $menu_obj = (object) array_merge( + array( + 'term_id' => $this->term_id, + 'term_taxonomy_id' => $this->term_id, + 'slug' => sanitize_title( $setting_value['name'] ), + 'count' => 0, + 'term_group' => 0, + 'taxonomy' => self::TAXONOMY, + 'filter' => 'raw', + ), + $setting_value + ); + + return $menu_obj; + } + + /** + * Filters the nav_menu_options option to include this menu's auto_add preference. + * + * @since 4.3.0 + * + * @param array $nav_menu_options Nav menu options including auto_add. + * @return array (Maybe) modified nav menu options. + */ + public function filter_nav_menu_options( $nav_menu_options ) { + if ( get_current_blog_id() !== $this->_previewed_blog_id ) { + return $nav_menu_options; + } + + $menu = $this->value(); + $nav_menu_options = $this->filter_nav_menu_options_value( + $nav_menu_options, + $this->term_id, + false === $menu ? false : $menu['auto_add'] + ); + + return $nav_menu_options; + } + + /** + * Sanitize an input. + * + * Note that parent::sanitize() erroneously does wp_unslash() on $value, but + * we remove that in this override. + * + * @since 4.3.0 + * + * @param array $value The value to sanitize. + * @return array|false|null Null if an input isn't valid. False if it is marked for deletion. + * Otherwise the sanitized value. + */ + public function sanitize( $value ) { + // Menu is marked for deletion. + if ( false === $value ) { + return $value; + } + + // Invalid. + if ( ! is_array( $value ) ) { + return null; + } + + $default = array( + 'name' => '', + 'description' => '', + 'parent' => 0, + 'auto_add' => false, + ); + $value = array_merge( $default, $value ); + $value = wp_array_slice_assoc( $value, array_keys( $default ) ); + + $value['name'] = trim( esc_html( $value['name'] ) ); // This sanitization code is used in wp-admin/nav-menus.php. + $value['description'] = sanitize_text_field( $value['description'] ); + $value['parent'] = max( 0, intval( $value['parent'] ) ); + $value['auto_add'] = ! empty( $value['auto_add'] ); + + if ( '' === $value['name'] ) { + $value['name'] = _x( '(unnamed)', 'Missing menu name.' ); + } + + /** This filter is documented in wp-includes/class-wp-customize-setting.php */ + return apply_filters( "customize_sanitize_{$this->id}", $value, $this ); + } + + /** + * Storage for data to be sent back to client in customize_save_response filter. + * + * See {@see 'customize_save_response'}. + * + * @since 4.3.0 + * @var array + * + * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response() + */ + protected $_widget_nav_menu_updates = array(); + + /** + * Create/update the nav_menu term for this setting. + * + * Any created menus will have their assigned term IDs exported to the client + * via the {@see 'customize_save_response'} filter. Likewise, any errors will be exported + * to the client via the customize_save_response() filter. + * + * To delete a menu, the client can send false as the value. + * + * @since 4.3.0 + * + * @see wp_update_nav_menu_object() + * + * @param array|false $value { + * The value to update. Note that slug cannot be updated via wp_update_nav_menu_object(). + * If false, then the menu will be deleted entirely. + * + * @type string $name The name of the menu to save. + * @type string $description The term description. Default empty string. + * @type int $parent The id of the parent term. Default 0. + * @type bool $auto_add Whether pages will auto_add to this menu. Default false. + * } + * @return null|void + */ + protected function update( $value ) { + if ( $this->is_updated ) { + return; + } + + $this->is_updated = true; + $is_placeholder = ( $this->term_id < 0 ); + $is_delete = ( false === $value ); + + add_filter( 'customize_save_response', array( $this, 'amend_customize_save_response' ) ); + + $auto_add = null; + if ( $is_delete ) { + // If the current setting term is a placeholder, a delete request is a no-op. + if ( $is_placeholder ) { + $this->update_status = 'deleted'; + } else { + $r = wp_delete_nav_menu( $this->term_id ); + + if ( is_wp_error( $r ) ) { + $this->update_status = 'error'; + $this->update_error = $r; + } else { + $this->update_status = 'deleted'; + $auto_add = false; + } + } + } else { + // Insert or update menu. + $menu_data = wp_array_slice_assoc( $value, array( 'description', 'parent' ) ); + $menu_data['menu-name'] = $value['name']; + + $menu_id = $is_placeholder ? 0 : $this->term_id; + $r = wp_update_nav_menu_object( $menu_id, wp_slash( $menu_data ) ); + $original_name = $menu_data['menu-name']; + $name_conflict_suffix = 1; + while ( is_wp_error( $r ) && 'menu_exists' === $r->get_error_code() ) { + $name_conflict_suffix += 1; + /* translators: 1: Original menu name, 2: Duplicate count. */ + $menu_data['menu-name'] = sprintf( __( '%1$s (%2$d)' ), $original_name, $name_conflict_suffix ); + $r = wp_update_nav_menu_object( $menu_id, wp_slash( $menu_data ) ); + } + + if ( is_wp_error( $r ) ) { + $this->update_status = 'error'; + $this->update_error = $r; + } else { + if ( $is_placeholder ) { + $this->previous_term_id = $this->term_id; + $this->term_id = $r; + $this->update_status = 'inserted'; + } else { + $this->update_status = 'updated'; + } + + $auto_add = $value['auto_add']; + } + } + + if ( null !== $auto_add ) { + $nav_menu_options = $this->filter_nav_menu_options_value( + (array) get_option( 'nav_menu_options', array() ), + $this->term_id, + $auto_add + ); + update_option( 'nav_menu_options', $nav_menu_options ); + } + + if ( 'inserted' === $this->update_status ) { + // Make sure that new menus assigned to nav menu locations use their new IDs. + foreach ( $this->manager->settings() as $setting ) { + if ( ! preg_match( '/^nav_menu_locations\[/', $setting->id ) ) { + continue; + } + + $post_value = $setting->post_value( null ); + if ( ! is_null( $post_value ) && intval( $post_value ) === $this->previous_term_id ) { + $this->manager->set_post_value( $setting->id, $this->term_id ); + $setting->save(); + } + } + + // Make sure that any nav_menu widgets referencing the placeholder nav menu get updated and sent back to client. + foreach ( array_keys( $this->manager->unsanitized_post_values() ) as $setting_id ) { + $nav_menu_widget_setting = $this->manager->get_setting( $setting_id ); + if ( ! $nav_menu_widget_setting || ! preg_match( '/^widget_nav_menu\[/', $nav_menu_widget_setting->id ) ) { + continue; + } + + $widget_instance = $nav_menu_widget_setting->post_value(); // Note that this calls WP_Customize_Widgets::sanitize_widget_instance(). + if ( empty( $widget_instance['nav_menu'] ) || intval( $widget_instance['nav_menu'] ) !== $this->previous_term_id ) { + continue; + } + + $widget_instance['nav_menu'] = $this->term_id; + $updated_widget_instance = $this->manager->widgets->sanitize_widget_js_instance( $widget_instance ); + $this->manager->set_post_value( $nav_menu_widget_setting->id, $updated_widget_instance ); + $nav_menu_widget_setting->save(); + + $this->_widget_nav_menu_updates[ $nav_menu_widget_setting->id ] = $updated_widget_instance; + } + } + } + + /** + * Updates a nav_menu_options array. + * + * @since 4.3.0 + * + * @see WP_Customize_Nav_Menu_Setting::filter_nav_menu_options() + * @see WP_Customize_Nav_Menu_Setting::update() + * + * @param array $nav_menu_options Array as returned by get_option( 'nav_menu_options' ). + * @param int $menu_id The term ID for the given menu. + * @param bool $auto_add Whether to auto-add or not. + * @return array (Maybe) modified nav_menu_otions array. + */ + protected function filter_nav_menu_options_value( $nav_menu_options, $menu_id, $auto_add ) { + $nav_menu_options = (array) $nav_menu_options; + if ( ! isset( $nav_menu_options['auto_add'] ) ) { + $nav_menu_options['auto_add'] = array(); + } + + $i = array_search( $menu_id, $nav_menu_options['auto_add'] ); + if ( $auto_add && false === $i ) { + array_push( $nav_menu_options['auto_add'], $this->term_id ); + } elseif ( ! $auto_add && false !== $i ) { + array_splice( $nav_menu_options['auto_add'], $i, 1 ); + } + + return $nav_menu_options; + } + + /** + * Export data for the JS client. + * + * @since 4.3.0 + * + * @see WP_Customize_Nav_Menu_Setting::update() + * + * @param array $data Additional information passed back to the 'saved' event on `wp.customize`. + * @return array Export data. + */ + public function amend_customize_save_response( $data ) { + if ( ! isset( $data['nav_menu_updates'] ) ) { + $data['nav_menu_updates'] = array(); + } + if ( ! isset( $data['widget_nav_menu_updates'] ) ) { + $data['widget_nav_menu_updates'] = array(); + } + + $data['nav_menu_updates'][] = array( + 'term_id' => $this->term_id, + 'previous_term_id' => $this->previous_term_id, + 'error' => $this->update_error ? $this->update_error->get_error_code() : null, + 'status' => $this->update_status, + 'saved_value' => 'deleted' === $this->update_status ? null : $this->value(), + ); + + $data['widget_nav_menu_updates'] = array_merge( + $data['widget_nav_menu_updates'], + $this->_widget_nav_menu_updates + ); + $this->_widget_nav_menu_updates = array(); + + return $data; + } +} diff --git a/wp-includes/customize/class-wp-customize-nav-menus-panel.php b/wp-includes/customize/class-wp-customize-nav-menus-panel.php new file mode 100644 index 0000000..c0d098b --- /dev/null +++ b/wp-includes/customize/class-wp-customize-nav-menus-panel.php @@ -0,0 +1,101 @@ +render_screen_options( array( 'wrap' => false ) ); + } + + /** + * Returns the advanced options for the nav menus page. + * + * Link title attribute added as it's a relatively advanced concept for new users. + * + * @since 4.3.0 + * @deprecated 4.5.0 Deprecated in favor of wp_nav_menu_manage_columns(). + */ + public function wp_nav_menu_manage_columns() { + _deprecated_function( __METHOD__, '4.5.0', 'wp_nav_menu_manage_columns' ); + require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; + return wp_nav_menu_manage_columns(); + } + + /** + * An Underscore (JS) template for this panel's content (but not its container). + * + * Class variables for this panel class are available in the `data` JS object; + * export custom variables by overriding WP_Customize_Panel::json(). + * + * @since 4.3.0 + * + * @see WP_Customize_Panel::print_template() + */ + protected function content_template() { + ?> +
          • + +
            + + {{ data.title }}' ); + ?> + + + +
            + <# if ( data.description ) { #> +
            {{{ data.description }}}
            + <# } #> +
            + render_screen_options(); ?> +
            +
          • + +
          • + + + + +
          • + +
              +
            • + $key = $args[ $key ]; + } + } + + $this->component = $component; + $this->id = $id; + $this->id_data['keys'] = preg_split( '/\[/', str_replace( ']', '', $this->id ) ); + $this->id_data['base'] = array_shift( $this->id_data['keys'] ); + + if ( empty( $this->render_callback ) ) { + $this->render_callback = array( $this, 'render_callback' ); + } + + // Process settings. + if ( ! isset( $this->settings ) ) { + $this->settings = array( $id ); + } elseif ( is_string( $this->settings ) ) { + $this->settings = array( $this->settings ); + } + + if ( empty( $this->primary_setting ) ) { + $this->primary_setting = current( $this->settings ); + } + } + + /** + * Retrieves parsed ID data for multidimensional setting. + * + * @since 4.5.0 + * + * @return array { + * ID data for multidimensional partial. + * + * @type string $base ID base. + * @type array $keys Keys for multidimensional array. + * } + */ + final public function id_data() { + return $this->id_data; + } + + /** + * Renders the template partial involving the associated settings. + * + * @since 4.5.0 + * + * @param array $container_context Optional. Array of context data associated with the target container (placement). + * Default empty array. + * @return string|array|false The rendered partial as a string, raw data array (for client-side JS template), + * or false if no render applied. + */ + final public function render( $container_context = array() ) { + $partial = $this; + $rendered = false; + + if ( ! empty( $this->render_callback ) ) { + ob_start(); + $return_render = call_user_func( $this->render_callback, $this, $container_context ); + $ob_render = ob_get_clean(); + + if ( null !== $return_render && '' !== $ob_render ) { + _doing_it_wrong( __FUNCTION__, __( 'Partial render must echo the content or return the content string (or array), but not both.' ), '4.5.0' ); + } + + /* + * Note that the string return takes precedence because the $ob_render may just\ + * include PHP warnings or notices. + */ + $rendered = null !== $return_render ? $return_render : $ob_render; + } + + /** + * Filters partial rendering. + * + * @since 4.5.0 + * + * @param string|array|false $rendered The partial value. Default false. + * @param WP_Customize_Partial $partial WP_Customize_Setting instance. + * @param array $container_context Optional array of context data associated with + * the target container. + */ + $rendered = apply_filters( 'customize_partial_render', $rendered, $partial, $container_context ); + + /** + * Filters partial rendering for a specific partial. + * + * The dynamic portion of the hook name, `$partial->ID` refers to the partial ID. + * + * @since 4.5.0 + * + * @param string|array|false $rendered The partial value. Default false. + * @param WP_Customize_Partial $partial WP_Customize_Setting instance. + * @param array $container_context Optional array of context data associated with + * the target container. + */ + $rendered = apply_filters( "customize_partial_render_{$partial->id}", $rendered, $partial, $container_context ); + + return $rendered; + } + + /** + * Default callback used when invoking WP_Customize_Control::render(). + * + * Note that this method may echo the partial *or* return the partial as + * a string or array, but not both. Output buffering is performed when this + * is called. Subclasses can override this with their specific logic, or they + * may provide an 'render_callback' argument to the constructor. + * + * This method may return an HTML string for straight DOM injection, or it + * may return an array for supporting Partial JS subclasses to render by + * applying to client-side templating. + * + * @since 4.5.0 + * + * @param WP_Customize_Partial $partial Partial. + * @param array $context Context. + * @return string|array|false + */ + public function render_callback( WP_Customize_Partial $partial, $context = array() ) { + unset( $partial, $context ); + return false; + } + + /** + * Retrieves the data to export to the client via JSON. + * + * @since 4.5.0 + * + * @return array Array of parameters passed to the JavaScript. + */ + public function json() { + $exports = array( + 'settings' => $this->settings, + 'primarySetting' => $this->primary_setting, + 'selector' => $this->selector, + 'type' => $this->type, + 'fallbackRefresh' => $this->fallback_refresh, + 'containerInclusive' => $this->container_inclusive, + ); + return $exports; + } + + /** + * Checks if the user can refresh this partial. + * + * Returns false if the user cannot manipulate one of the associated settings, + * or if one of the associated settings does not exist. + * + * @since 4.5.0 + * + * @return bool False if user can't edit one of the related settings, + * or if one of the associated settings does not exist. + */ + final public function check_capabilities() { + if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) { + return false; + } + foreach ( $this->settings as $setting_id ) { + $setting = $this->component->manager->get_setting( $setting_id ); + if ( ! $setting || ! $setting->check_capabilities() ) { + return false; + } + } + return true; + } +} diff --git a/wp-includes/customize/class-wp-customize-selective-refresh.php b/wp-includes/customize/class-wp-customize-selective-refresh.php new file mode 100644 index 0000000..822b135 --- /dev/null +++ b/wp-includes/customize/class-wp-customize-selective-refresh.php @@ -0,0 +1,456 @@ +manager = $manager; + require_once ABSPATH . WPINC . '/customize/class-wp-customize-partial.php'; + + add_action( 'customize_preview_init', array( $this, 'init_preview' ) ); + } + + /** + * Retrieves the registered partials. + * + * @since 4.5.0 + * + * @return array Partials. + */ + public function partials() { + return $this->partials; + } + + /** + * Adds a partial. + * + * @since 4.5.0 + * + * @param WP_Customize_Partial|string $id Customize Partial object, or Panel ID. + * @param array $args { + * Optional. Array of properties for the new Partials object. Default empty array. + * + * @type string $type Type of the partial to be created. + * @type string $selector The jQuery selector to find the container element for the partial, that is, a partial's placement. + * @type array $settings IDs for settings tied to the partial. + * @type string $primary_setting The ID for the setting that this partial is primarily responsible for + * rendering. If not supplied, it will default to the ID of the first setting. + * @type string $capability Capability required to edit this partial. + * Normally this is empty and the capability is derived from the capabilities + * of the associated `$settings`. + * @type callable $render_callback Render callback. + * Callback is called with one argument, the instance of WP_Customize_Partial. + * The callback can either echo the partial or return the partial as a string, + * or return false if error. + * @type bool $container_inclusive Whether the container element is included in the partial, or if only + * the contents are rendered. + * @type bool $fallback_refresh Whether to refresh the entire preview in case a partial cannot be refreshed. + * A partial render is considered a failure if the render_callback returns + * false. + * } + * @return WP_Customize_Partial The instance of the panel that was added. + */ + public function add_partial( $id, $args = array() ) { + if ( $id instanceof WP_Customize_Partial ) { + $partial = $id; + } else { + $class = 'WP_Customize_Partial'; + + /** This filter is documented in wp-includes/customize/class-wp-customize-selective-refresh.php */ + $args = apply_filters( 'customize_dynamic_partial_args', $args, $id ); + + /** This filter is documented in wp-includes/customize/class-wp-customize-selective-refresh.php */ + $class = apply_filters( 'customize_dynamic_partial_class', $class, $id, $args ); + + $partial = new $class( $this, $id, $args ); + } + + $this->partials[ $partial->id ] = $partial; + return $partial; + } + + /** + * Retrieves a partial. + * + * @since 4.5.0 + * + * @param string $id Customize Partial ID. + * @return WP_Customize_Partial|null The partial, if set. Otherwise null. + */ + public function get_partial( $id ) { + if ( isset( $this->partials[ $id ] ) ) { + return $this->partials[ $id ]; + } else { + return null; + } + } + + /** + * Removes a partial. + * + * @since 4.5.0 + * + * @param string $id Customize Partial ID. + */ + public function remove_partial( $id ) { + unset( $this->partials[ $id ] ); + } + + /** + * Initializes the Customizer preview. + * + * @since 4.5.0 + */ + public function init_preview() { + add_action( 'template_redirect', array( $this, 'handle_render_partials_request' ) ); + add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_preview_scripts' ) ); + } + + /** + * Enqueues preview scripts. + * + * @since 4.5.0 + */ + public function enqueue_preview_scripts() { + wp_enqueue_script( 'customize-selective-refresh' ); + add_action( 'wp_footer', array( $this, 'export_preview_data' ), 1000 ); + } + + /** + * Exports data in preview after it has finished rendering so that partials can be added at runtime. + * + * @since 4.5.0 + */ + public function export_preview_data() { + $partials = array(); + + foreach ( $this->partials() as $partial ) { + if ( $partial->check_capabilities() ) { + $partials[ $partial->id ] = $partial->json(); + } + } + + $switched_locale = switch_to_locale( get_user_locale() ); + $l10n = array( + 'shiftClickToEdit' => __( 'Shift-click to edit this element.' ), + 'clickEditMenu' => __( 'Click to edit this menu.' ), + 'clickEditWidget' => __( 'Click to edit this widget.' ), + 'clickEditTitle' => __( 'Click to edit the site title.' ), + 'clickEditMisc' => __( 'Click to edit this element.' ), + /* translators: %s: document.write() */ + 'badDocumentWrite' => sprintf( __( '%s is forbidden' ), 'document.write()' ), + ); + if ( $switched_locale ) { + restore_previous_locale(); + } + + $exports = array( + 'partials' => $partials, + 'renderQueryVar' => self::RENDER_QUERY_VAR, + 'l10n' => $l10n, + ); + + // Export data to JS. + echo sprintf( '', wp_json_encode( $exports ) ); + } + + /** + * Registers dynamically-created partials. + * + * @since 4.5.0 + * + * @see WP_Customize_Manager::add_dynamic_settings() + * + * @param string[] $partial_ids Array of the partial IDs to add. + * @return WP_Customize_Partial[] Array of added WP_Customize_Partial instances. + */ + public function add_dynamic_partials( $partial_ids ) { + $new_partials = array(); + + foreach ( $partial_ids as $partial_id ) { + + // Skip partials already created. + $partial = $this->get_partial( $partial_id ); + if ( $partial ) { + continue; + } + + $partial_args = false; + $partial_class = 'WP_Customize_Partial'; + + /** + * Filters a dynamic partial's constructor arguments. + * + * For a dynamic partial to be registered, this filter must be employed + * to override the default false value with an array of args to pass to + * the WP_Customize_Partial constructor. + * + * @since 4.5.0 + * + * @param false|array $partial_args The arguments to the WP_Customize_Partial constructor. + * @param string $partial_id ID for dynamic partial. + */ + $partial_args = apply_filters( 'customize_dynamic_partial_args', $partial_args, $partial_id ); + if ( false === $partial_args ) { + continue; + } + + /** + * Filters the class used to construct partials. + * + * Allow non-statically created partials to be constructed with custom WP_Customize_Partial subclass. + * + * @since 4.5.0 + * + * @param string $partial_class WP_Customize_Partial or a subclass. + * @param string $partial_id ID for dynamic partial. + * @param array $partial_args The arguments to the WP_Customize_Partial constructor. + */ + $partial_class = apply_filters( 'customize_dynamic_partial_class', $partial_class, $partial_id, $partial_args ); + + $partial = new $partial_class( $this, $partial_id, $partial_args ); + + $this->add_partial( $partial ); + $new_partials[] = $partial; + } + return $new_partials; + } + + /** + * Checks whether the request is for rendering partials. + * + * Note that this will not consider whether the request is authorized or valid, + * just that essentially the route is a match. + * + * @since 4.5.0 + * + * @return bool Whether the request is for rendering partials. + */ + public function is_render_partials_request() { + return ! empty( $_POST[ self::RENDER_QUERY_VAR ] ); + } + + /** + * Handles PHP errors triggered during rendering the partials. + * + * These errors will be relayed back to the client in the Ajax response. + * + * @since 4.5.0 + * + * @param int $errno Error number. + * @param string $errstr Error string. + * @param string $errfile Error file. + * @param string $errline Error line. + * @return true Always true. + */ + public function handle_error( $errno, $errstr, $errfile = null, $errline = null ) { + $this->triggered_errors[] = array( + 'partial' => $this->current_partial_id, + 'error_number' => $errno, + 'error_string' => $errstr, + 'error_file' => $errfile, + 'error_line' => $errline, + ); + return true; + } + + /** + * Handles the Ajax request to return the rendered partials for the requested placements. + * + * @since 4.5.0 + */ + public function handle_render_partials_request() { + if ( ! $this->is_render_partials_request() ) { + return; + } + + /* + * Note that is_customize_preview() returning true will entail that the + * user passed the 'customize' capability check and the nonce check, since + * WP_Customize_Manager::setup_theme() is where the previewing flag is set. + */ + if ( ! is_customize_preview() ) { + wp_send_json_error( 'expected_customize_preview', 403 ); + } elseif ( ! isset( $_POST['partials'] ) ) { + wp_send_json_error( 'missing_partials', 400 ); + } + + // Ensure that doing selective refresh on 404 template doesn't result in fallback rendering behavior (full refreshes). + status_header( 200 ); + + $partials = json_decode( wp_unslash( $_POST['partials'] ), true ); + + if ( ! is_array( $partials ) ) { + wp_send_json_error( 'malformed_partials' ); + } + + $this->add_dynamic_partials( array_keys( $partials ) ); + + /** + * Fires immediately before partials are rendered. + * + * Plugins may do things like call wp_enqueue_scripts() and gather a list of the scripts + * and styles which may get enqueued in the response. + * + * @since 4.5.0 + * + * @param WP_Customize_Selective_Refresh $this Selective refresh component. + * @param array $partials Placements' context data for the partials rendered in the request. + * The array is keyed by partial ID, with each item being an array of + * the placements' context data. + */ + do_action( 'customize_render_partials_before', $this, $partials ); + + set_error_handler( array( $this, 'handle_error' ), error_reporting() ); + + $contents = array(); + + foreach ( $partials as $partial_id => $container_contexts ) { + $this->current_partial_id = $partial_id; + + if ( ! is_array( $container_contexts ) ) { + wp_send_json_error( 'malformed_container_contexts' ); + } + + $partial = $this->get_partial( $partial_id ); + + if ( ! $partial || ! $partial->check_capabilities() ) { + $contents[ $partial_id ] = null; + continue; + } + + $contents[ $partial_id ] = array(); + + // @todo The array should include not only the contents, but also whether the container is included? + if ( empty( $container_contexts ) ) { + // Since there are no container contexts, render just once. + $contents[ $partial_id ][] = $partial->render( null ); + } else { + foreach ( $container_contexts as $container_context ) { + $contents[ $partial_id ][] = $partial->render( $container_context ); + } + } + } + $this->current_partial_id = null; + + restore_error_handler(); + + /** + * Fires immediately after partials are rendered. + * + * Plugins may do things like call wp_footer() to scrape scripts output and return them + * via the {@see 'customize_render_partials_response'} filter. + * + * @since 4.5.0 + * + * @param WP_Customize_Selective_Refresh $this Selective refresh component. + * @param array $partials Placements' context data for the partials rendered in the request. + * The array is keyed by partial ID, with each item being an array of + * the placements' context data. + */ + do_action( 'customize_render_partials_after', $this, $partials ); + + $response = array( + 'contents' => $contents, + ); + + if ( defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY ) { + $response['errors'] = $this->triggered_errors; + } + + $setting_validities = $this->manager->validate_setting_values( $this->manager->unsanitized_post_values() ); + $exported_setting_validities = array_map( array( $this->manager, 'prepare_setting_validity_for_js' ), $setting_validities ); + $response['setting_validities'] = $exported_setting_validities; + + /** + * Filters the response from rendering the partials. + * + * Plugins may use this filter to inject `$scripts` and `$styles`, which are dependencies + * for the partials being rendered. The response data will be available to the client via + * the `render-partials-response` JS event, so the client can then inject the scripts and + * styles into the DOM if they have not already been enqueued there. + * + * If plugins do this, they'll need to take care for any scripts that do `document.write()` + * and make sure that these are not injected, or else to override the function to no-op, + * or else the page will be destroyed. + * + * Plugins should be aware that `$scripts` and `$styles` may eventually be included by + * default in the response. + * + * @since 4.5.0 + * + * @param array $response { + * Response. + * + * @type array $contents Associative array mapping a partial ID its corresponding array of contents + * for the containers requested. + * @type array $errors List of errors triggered during rendering of partials, if `WP_DEBUG_DISPLAY` + * is enabled. + * } + * @param WP_Customize_Selective_Refresh $this Selective refresh component. + * @param array $partials Placements' context data for the partials rendered in the request. + * The array is keyed by partial ID, with each item being an array of + * the placements' context data. + */ + $response = apply_filters( 'customize_render_partials_response', $response, $this, $partials ); + + wp_send_json_success( $response ); + } +} diff --git a/wp-includes/customize/class-wp-customize-sidebar-section.php b/wp-includes/customize/class-wp-customize-sidebar-section.php new file mode 100644 index 0000000..1d048b6 --- /dev/null +++ b/wp-includes/customize/class-wp-customize-sidebar-section.php @@ -0,0 +1,58 @@ +sidebar_id; + return $json; + } + + /** + * Whether the current sidebar is rendered on the page. + * + * @since 4.1.0 + * + * @return bool Whether sidebar is rendered. + */ + public function active_callback() { + return $this->manager->widgets->is_sidebar_rendered( $this->sidebar_id ); + } +} diff --git a/wp-includes/customize/class-wp-customize-site-icon-control.php b/wp-includes/customize/class-wp-customize-site-icon-control.php new file mode 100644 index 0000000..d21395c --- /dev/null +++ b/wp-includes/customize/class-wp-customize-site-icon-control.php @@ -0,0 +1,97 @@ + + <# if ( data.label ) { #> + {{ data.label }} + <# } #> + <# if ( data.description ) { #> + {{{ data.description }}} + <# } #> + + <# if ( data.attachment && data.attachment.id ) { #> +
              + <# if ( data.attachment.sizes ) { #> +
              +
              + + +
              + <?php esc_attr_e( 'Preview as a browser icon' ); ?> +
              + +
              + <?php esc_attr_e( 'Preview as an app icon' ); ?> +
              + <# } #> +
              + <# if ( data.canUpload ) { #> + + + <# } #> +
              +
              + <# } else { #> +
              + <# if ( data.canUpload ) { #> + + <# } #> +
              + <# if ( data.defaultAttachment ) { #> + + <# } #> +
              +
              + <# } #> + json['theme'] = $this->theme; + } + + /** + * Don't render the control content from PHP, as it's rendered via JS on load. + * + * @since 4.2.0 + */ + public function render_content() {} + + /** + * Render a JS template for theme display. + * + * @since 4.2.0 + */ + public function content_template() { + /* translators: %s: Theme name. */ + $details_label = sprintf( __( 'Details for theme: %s' ), '{{ data.theme.name }}' ); + /* translators: %s: Theme name. */ + $customize_label = sprintf( __( 'Customize theme: %s' ), '{{ data.theme.name }}' ); + /* translators: %s: Theme name. */ + $preview_label = sprintf( __( 'Live preview theme: %s' ), '{{ data.theme.name }}' ); + /* translators: %s: Theme name. */ + $install_label = sprintf( __( 'Install and preview theme: %s' ), '{{ data.theme.name }}' ); + ?> + <# if ( data.theme.active ) { #> +
              + <# } else { #> +
              + <# } #> + + <# if ( data.theme.screenshot && data.theme.screenshot[0] ) { #> +
              + +
              + <# } else { #> +
              + <# } #> + + + +
              + +
              + + <# if ( 'installed' === data.theme.type && data.theme.hasUpdate ) { #> +
              +

              + ' . __( 'Update now' ) . '' + ); + } + ?> +

              +
              + <# } #> + + <# if ( data.theme.active ) { #> +
              +

              + {{ data.theme.name }} +

              +
              + +
              +
              +

              + <# } else if ( 'installed' === data.theme.type ) { #> +
              +

              {{ data.theme.name }}

              +
              + +
              +
              +

              + <# } else { #> +
              +

              {{ data.theme.name }}

              +
              + +
              +
              + <# } #> +
              + +
            • +

              + manager->is_theme_active() ) { + echo '' . __( 'Active theme' ) . ' {{ data.title }}'; + } else { + echo '' . __( 'Previewing theme' ) . ' {{ data.title }}'; + } + ?> + + + + +

              +
                +
              • + +
              • + +
                + + ' . __( 'Themes' ) . '' + ); // Separate strings for consistency with other panels. + ?> + + + <# if ( data.description ) { #> + + <# } #> + +
                + + <# if ( data.description ) { #> +
                + {{{ data.description }}} +
                + <# } #> + + +
                +
              • +
              • +
                +
                +
                +
              • + action; + $exported['filter_type'] = $this->filter_type; + + return $exported; + } + + /** + * Render a themes section as a JS template. + * + * The template is only rendered by PHP once, so all actions are prepared at once on the server side. + * + * @since 4.9.0 + */ + protected function render_template() { + ?> +
              • + + + +
                + +
                +
                + filter_bar_content_template(); ?> +
                + filter_drawer_content_template(); ?> + +
                  +
                +

                +

                + %s', __( 'Search WordPress.org themes' ) ) + ); + ?> +

                +

                +
                +
                +
              • + + + <# if ( 'wporg' === data.action ) { #> +
                + + + + +
                + + <# } else { #> +
                + + + + +
                + <# } #> +
                + + 0' ); + ?> + +
                + + <# if ( 'wporg' === data.action ) { #> +
                + $features ) : ?> +
                + +
                + $feature_name ) : ?> + + + +
                +
                + +
                + <# } #> + value(); + if ( $value ) { + // Get the attachment model for the existing file. + $attachment_id = attachment_url_to_postid( $value ); + if ( $attachment_id ) { + $this->json['attachment'] = wp_prepare_attachment_for_js( $attachment_id ); + } + } + } +} diff --git a/wp-includes/customize/class-wp-widget-area-customize-control.php b/wp-includes/customize/class-wp-widget-area-customize-control.php new file mode 100644 index 0000000..bed0f8a --- /dev/null +++ b/wp-includes/customize/class-wp-widget-area-customize-control.php @@ -0,0 +1,66 @@ +json[ $key ] = $this->$key; + } + } + + /** + * Renders the control's content. + * + * @since 3.9.0 + */ + public function render_content() { + $id = 'reorder-widgets-desc-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id ); + ?> + + +

                + json[ $key ] = $this->$key; + } + + // Get the widget_control and widget_content. + require_once ABSPATH . 'wp-admin/includes/widgets.php'; + + $widget = $wp_registered_widgets[ $this->widget_id ]; + if ( ! isset( $widget['params'][0] ) ) { + $widget['params'][0] = array(); + } + + $args = array( + 'widget_id' => $widget['id'], + 'widget_name' => $widget['name'], + ); + + $args = wp_list_widget_controls_dynamic_sidebar( + array( + 0 => $args, + 1 => $widget['params'][0], + ) + ); + $widget_control_parts = $this->manager->widgets->get_widget_control_parts( $args ); + + $this->json['widget_control'] = $widget_control_parts['control']; + $this->json['widget_content'] = $widget_control_parts['content']; + } + + /** + * Override render_content to be no-op since content is exported via to_json for deferred embedding. + * + * @since 3.9.0 + */ + public function render_content() {} + + /** + * Whether the current widget is rendered on the page. + * + * @since 4.0.0 + * + * @return bool Whether the widget is rendered. + */ + public function active_callback() { + return $this->manager->widgets->is_widget_rendered( $this->widget_id ); + } +} diff --git a/wp-includes/date.php b/wp-includes/date.php new file mode 100644 index 0000000..26ffcb4 --- /dev/null +++ b/wp-includes/date.php @@ -0,0 +1,14 @@ + 268435456 /* = 256M */ ) { + define( 'WP_MAX_MEMORY_LIMIT', $current_limit ); + } else { + define( 'WP_MAX_MEMORY_LIMIT', '256M' ); + } + } + + // Set memory limits. + $wp_limit_int = wp_convert_hr_to_bytes( WP_MEMORY_LIMIT ); + if ( -1 !== $current_limit_int && ( -1 === $wp_limit_int || $wp_limit_int > $current_limit_int ) ) { + ini_set( 'memory_limit', WP_MEMORY_LIMIT ); + } + + if ( ! isset( $blog_id ) ) { + $blog_id = 1; + } + + if ( ! defined( 'WP_CONTENT_DIR' ) ) { + define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' ); // No trailing slash, full paths only - WP_CONTENT_URL is defined further down. + } + + // Add define( 'WP_DEBUG', true ); to wp-config.php to enable display of notices during development. + if ( ! defined( 'WP_DEBUG' ) ) { + define( 'WP_DEBUG', false ); + } + + // Add define( 'WP_DEBUG_DISPLAY', null ); to wp-config.php to use the globally configured setting + // for 'display_errors' and not force errors to be displayed. Use false to force 'display_errors' off. + if ( ! defined( 'WP_DEBUG_DISPLAY' ) ) { + define( 'WP_DEBUG_DISPLAY', true ); + } + + // Add define( 'WP_DEBUG_LOG', true ); to enable error logging to wp-content/debug.log. + if ( ! defined( 'WP_DEBUG_LOG' ) ) { + define( 'WP_DEBUG_LOG', false ); + } + + if ( ! defined( 'WP_CACHE' ) ) { + define( 'WP_CACHE', false ); + } + + // Add define( 'SCRIPT_DEBUG', true ); to wp-config.php to enable loading of non-minified, + // non-concatenated scripts and stylesheets. + if ( ! defined( 'SCRIPT_DEBUG' ) ) { + if ( ! empty( $GLOBALS['wp_version'] ) ) { + $develop_src = false !== strpos( $GLOBALS['wp_version'], '-src' ); + } else { + $develop_src = false; + } + + define( 'SCRIPT_DEBUG', $develop_src ); + } + + /** + * Private + */ + if ( ! defined( 'MEDIA_TRASH' ) ) { + define( 'MEDIA_TRASH', false ); + } + + if ( ! defined( 'SHORTINIT' ) ) { + define( 'SHORTINIT', false ); + } + + // Constants for features added to WP that should short-circuit their plugin implementations. + define( 'WP_FEATURE_BETTER_PASSWORDS', true ); + + /**#@+ + * Constants for expressing human-readable intervals + * in their respective number of seconds. + * + * Please note that these values are approximate and are provided for convenience. + * For example, MONTH_IN_SECONDS wrongly assumes every month has 30 days and + * YEAR_IN_SECONDS does not take leap years into account. + * + * If you need more accuracy please consider using the DateTime class (https://www.php.net/manual/en/class.datetime.php). + * + * @since 3.5.0 + * @since 4.4.0 Introduced `MONTH_IN_SECONDS`. + */ + define( 'MINUTE_IN_SECONDS', 60 ); + define( 'HOUR_IN_SECONDS', 60 * MINUTE_IN_SECONDS ); + define( 'DAY_IN_SECONDS', 24 * HOUR_IN_SECONDS ); + define( 'WEEK_IN_SECONDS', 7 * DAY_IN_SECONDS ); + define( 'MONTH_IN_SECONDS', 30 * DAY_IN_SECONDS ); + define( 'YEAR_IN_SECONDS', 365 * DAY_IN_SECONDS ); + /**#@-*/ +} + +/** + * Defines plugin directory WordPress constants. + * + * Defines must-use plugin directory constants, which may be overridden in the sunrise.php drop-in. + * + * @since 3.0.0 + */ +function wp_plugin_directory_constants() { + if ( ! defined( 'WP_CONTENT_URL' ) ) { + define( 'WP_CONTENT_URL', get_option( 'siteurl' ) . '/wp-content' ); // Full URL - WP_CONTENT_DIR is defined further up. + } + + /** + * Allows for the plugins directory to be moved from the default location. + * + * @since 2.6.0 + */ + if ( ! defined( 'WP_PLUGIN_DIR' ) ) { + define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' ); // Full path, no trailing slash. + } + + /** + * Allows for the plugins directory to be moved from the default location. + * + * @since 2.6.0 + */ + if ( ! defined( 'WP_PLUGIN_URL' ) ) { + define( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' ); // Full URL, no trailing slash. + } + + /** + * Allows for the plugins directory to be moved from the default location. + * + * @since 2.1.0 + * @deprecated + */ + if ( ! defined( 'PLUGINDIR' ) ) { + define( 'PLUGINDIR', 'wp-content/plugins' ); // Relative to ABSPATH. For back compat. + } + + /** + * Allows for the mu-plugins directory to be moved from the default location. + * + * @since 2.8.0 + */ + if ( ! defined( 'WPMU_PLUGIN_DIR' ) ) { + define( 'WPMU_PLUGIN_DIR', WP_CONTENT_DIR . '/mu-plugins' ); // Full path, no trailing slash. + } + + /** + * Allows for the mu-plugins directory to be moved from the default location. + * + * @since 2.8.0 + */ + if ( ! defined( 'WPMU_PLUGIN_URL' ) ) { + define( 'WPMU_PLUGIN_URL', WP_CONTENT_URL . '/mu-plugins' ); // Full URL, no trailing slash. + } + + /** + * Allows for the mu-plugins directory to be moved from the default location. + * + * @since 2.8.0 + * @deprecated + */ + if ( ! defined( 'MUPLUGINDIR' ) ) { + define( 'MUPLUGINDIR', 'wp-content/mu-plugins' ); // Relative to ABSPATH. For back compat. + } +} + +/** + * Defines cookie-related WordPress constants. + * + * Defines constants after multisite is loaded. + * + * @since 3.0.0 + */ +function wp_cookie_constants() { + /** + * Used to guarantee unique hash cookies. + * + * @since 1.5.0 + */ + if ( ! defined( 'COOKIEHASH' ) ) { + $siteurl = get_site_option( 'siteurl' ); + if ( $siteurl ) { + define( 'COOKIEHASH', md5( $siteurl ) ); + } else { + define( 'COOKIEHASH', '' ); + } + } + + /** + * @since 2.0.0 + */ + if ( ! defined( 'USER_COOKIE' ) ) { + define( 'USER_COOKIE', 'wordpressuser_' . COOKIEHASH ); + } + + /** + * @since 2.0.0 + */ + if ( ! defined( 'PASS_COOKIE' ) ) { + define( 'PASS_COOKIE', 'wordpresspass_' . COOKIEHASH ); + } + + /** + * @since 2.5.0 + */ + if ( ! defined( 'AUTH_COOKIE' ) ) { + define( 'AUTH_COOKIE', 'wordpress_' . COOKIEHASH ); + } + + /** + * @since 2.6.0 + */ + if ( ! defined( 'SECURE_AUTH_COOKIE' ) ) { + define( 'SECURE_AUTH_COOKIE', 'wordpress_sec_' . COOKIEHASH ); + } + + /** + * @since 2.6.0 + */ + if ( ! defined( 'LOGGED_IN_COOKIE' ) ) { + define( 'LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH ); + } + + /** + * @since 2.3.0 + */ + if ( ! defined( 'TEST_COOKIE' ) ) { + define( 'TEST_COOKIE', 'wordpress_test_cookie' ); + } + + /** + * @since 1.2.0 + */ + if ( ! defined( 'COOKIEPATH' ) ) { + define( 'COOKIEPATH', preg_replace( '|https?://[^/]+|i', '', get_option( 'home' ) . '/' ) ); + } + + /** + * @since 1.5.0 + */ + if ( ! defined( 'SITECOOKIEPATH' ) ) { + define( 'SITECOOKIEPATH', preg_replace( '|https?://[^/]+|i', '', get_option( 'siteurl' ) . '/' ) ); + } + + /** + * @since 2.6.0 + */ + if ( ! defined( 'ADMIN_COOKIE_PATH' ) ) { + define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' ); + } + + /** + * @since 2.6.0 + */ + if ( ! defined( 'PLUGINS_COOKIE_PATH' ) ) { + define( 'PLUGINS_COOKIE_PATH', preg_replace( '|https?://[^/]+|i', '', WP_PLUGIN_URL ) ); + } + + /** + * @since 2.0.0 + */ + if ( ! defined( 'COOKIE_DOMAIN' ) ) { + define( 'COOKIE_DOMAIN', false ); + } + + if ( ! defined( 'RECOVERY_MODE_COOKIE' ) ) { + /** + * @since 5.2.0 + */ + define( 'RECOVERY_MODE_COOKIE', 'wordpress_rec_' . COOKIEHASH ); + } +} + +/** + * Defines SSL-related WordPress constants. + * + * @since 3.0.0 + */ +function wp_ssl_constants() { + /** + * @since 2.6.0 + */ + if ( ! defined( 'FORCE_SSL_ADMIN' ) ) { + if ( 'https' === parse_url( get_option( 'siteurl' ), PHP_URL_SCHEME ) ) { + define( 'FORCE_SSL_ADMIN', true ); + } else { + define( 'FORCE_SSL_ADMIN', false ); + } + } + force_ssl_admin( FORCE_SSL_ADMIN ); + + /** + * @since 2.6.0 + * @deprecated 4.0.0 + */ + if ( defined( 'FORCE_SSL_LOGIN' ) && FORCE_SSL_LOGIN ) { + force_ssl_admin( true ); + } +} + +/** + * Defines functionality-related WordPress constants. + * + * @since 3.0.0 + */ +function wp_functionality_constants() { + /** + * @since 2.5.0 + */ + if ( ! defined( 'AUTOSAVE_INTERVAL' ) ) { + define( 'AUTOSAVE_INTERVAL', MINUTE_IN_SECONDS ); + } + + /** + * @since 2.9.0 + */ + if ( ! defined( 'EMPTY_TRASH_DAYS' ) ) { + define( 'EMPTY_TRASH_DAYS', 30 ); + } + + if ( ! defined( 'WP_POST_REVISIONS' ) ) { + define( 'WP_POST_REVISIONS', true ); + } + + /** + * @since 3.3.0 + */ + if ( ! defined( 'WP_CRON_LOCK_TIMEOUT' ) ) { + define( 'WP_CRON_LOCK_TIMEOUT', MINUTE_IN_SECONDS ); + } +} + +/** + * Defines templating-related WordPress constants. + * + * @since 3.0.0 + */ +function wp_templating_constants() { + /** + * Filesystem path to the current active template directory. + * + * @since 1.5.0 + */ + define( 'TEMPLATEPATH', get_template_directory() ); + + /** + * Filesystem path to the current active template stylesheet directory. + * + * @since 2.1.0 + */ + define( 'STYLESHEETPATH', get_stylesheet_directory() ); + + /** + * Slug of the default theme for this installation. + * Used as the default theme when installing new sites. + * It will be used as the fallback if the current theme doesn't exist. + * + * @since 3.0.0 + * @see WP_Theme::get_core_default_theme() + */ + if ( ! defined( 'WP_DEFAULT_THEME' ) ) { + define( 'WP_DEFAULT_THEME', 'twentytwenty' ); + } + +} diff --git a/wp-includes/default-filters.php b/wp-includes/default-filters.php new file mode 100644 index 0000000..29f32ea --- /dev/null +++ b/wp-includes/default-filters.php @@ -0,0 +1,589 @@ + $post->ID, + 'Author_ID' => $post->post_author, + 'Date' => $post->post_date, + 'Content' => $post->post_content, + 'Excerpt' => $post->post_excerpt, + 'Title' => $post->post_title, + 'Category' => $post->post_category, + 'post_status' => $post->post_status, + 'comment_status' => $post->comment_status, + 'ping_status' => $post->ping_status, + 'post_password' => $post->post_password, + 'to_ping' => $post->to_ping, + 'pinged' => $post->pinged, + 'post_type' => $post->post_type, + 'post_name' => $post->post_name + ); + + return $postdata; +} + +/** + * Sets up the WordPress Loop. + * + * Use The Loop instead. + * + * @link https://developer.wordpress.org/themes/basics/the-loop/ + * + * @since 1.0.1 + * @deprecated 1.5.0 + */ +function start_wp() { + global $wp_query; + + _deprecated_function( __FUNCTION__, '1.5.0', __('new WordPress Loop') ); + + // Since the old style loop is being used, advance the query iterator here. + $wp_query->next_post(); + + setup_postdata( get_post() ); +} + +/** + * Returns or prints a category ID. + * + * @since 0.71 + * @deprecated 0.71 Use get_the_category() + * @see get_the_category() + * + * @param bool $echo Optional. Whether to echo the output. Default true. + * @return int Category ID. + */ +function the_category_ID($echo = true) { + _deprecated_function( __FUNCTION__, '0.71', 'get_the_category()' ); + + // Grab the first cat in the list. + $categories = get_the_category(); + $cat = $categories[0]->term_id; + + if ( $echo ) + echo $cat; + + return $cat; +} + +/** + * Prints a category with optional text before and after. + * + * @since 0.71 + * @deprecated 0.71 Use get_the_category_by_ID() + * @see get_the_category_by_ID() + * + * @param string $before Optional. Text to display before the category. Default empty. + * @param string $after Optional. Text to display after the category. Default empty. + */ +function the_category_head( $before = '', $after = '' ) { + global $currentcat, $previouscat; + + _deprecated_function( __FUNCTION__, '0.71', 'get_the_category_by_ID()' ); + + // Grab the first cat in the list. + $categories = get_the_category(); + $currentcat = $categories[0]->category_id; + if ( $currentcat != $previouscat ) { + echo $before; + echo get_the_category_by_ID($currentcat); + echo $after; + $previouscat = $currentcat; + } +} + +/** + * Prints a link to the previous post. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use previous_post_link() + * @see previous_post_link() + * + * @param string $format + * @param string $previous + * @param string $title + * @param string $in_same_cat + * @param int $limitprev + * @param string $excluded_categories + */ +function previous_post($format='%', $previous='previous post: ', $title='yes', $in_same_cat='no', $limitprev=1, $excluded_categories='') { + + _deprecated_function( __FUNCTION__, '2.0.0', 'previous_post_link()' ); + + if ( empty($in_same_cat) || 'no' == $in_same_cat ) + $in_same_cat = false; + else + $in_same_cat = true; + + $post = get_previous_post($in_same_cat, $excluded_categories); + + if ( !$post ) + return; + + $string = ''.$previous; + if ( 'yes' == $title ) + $string .= apply_filters('the_title', $post->post_title, $post->ID); + $string .= ''; + $format = str_replace('%', $string, $format); + echo $format; +} + +/** + * Prints link to the next post. + * + * @since 0.71 + * @deprecated 2.0.0 Use next_post_link() + * @see next_post_link() + * + * @param string $format + * @param string $next + * @param string $title + * @param string $in_same_cat + * @param int $limitnext + * @param string $excluded_categories + */ +function next_post($format='%', $next='next post: ', $title='yes', $in_same_cat='no', $limitnext=1, $excluded_categories='') { + _deprecated_function( __FUNCTION__, '2.0.0', 'next_post_link()' ); + + if ( empty($in_same_cat) || 'no' == $in_same_cat ) + $in_same_cat = false; + else + $in_same_cat = true; + + $post = get_next_post($in_same_cat, $excluded_categories); + + if ( !$post ) + return; + + $string = ''.$next; + if ( 'yes' == $title ) + $string .= apply_filters('the_title', $post->post_title, $post->ID); + $string .= ''; + $format = str_replace('%', $string, $format); + echo $format; +} + +/** + * Whether user can create a post. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use current_user_can() + * @see current_user_can() + * + * @param int $user_id + * @param int $blog_id Not Used + * @param int $category_id Not Used + * @return bool + */ +function user_can_create_post($user_id, $blog_id = 1, $category_id = 'None') { + _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); + + $author_data = get_userdata($user_id); + return ($author_data->user_level > 1); +} + +/** + * Whether user can create a post. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use current_user_can() + * @see current_user_can() + * + * @param int $user_id + * @param int $blog_id Not Used + * @param int $category_id Not Used + * @return bool + */ +function user_can_create_draft($user_id, $blog_id = 1, $category_id = 'None') { + _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); + + $author_data = get_userdata($user_id); + return ($author_data->user_level >= 1); +} + +/** + * Whether user can edit a post. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use current_user_can() + * @see current_user_can() + * + * @param int $user_id + * @param int $post_id + * @param int $blog_id Not Used + * @return bool + */ +function user_can_edit_post($user_id, $post_id, $blog_id = 1) { + _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); + + $author_data = get_userdata($user_id); + $post = get_post($post_id); + $post_author_data = get_userdata($post->post_author); + + if ( (($user_id == $post_author_data->ID) && !($post->post_status == 'publish' && $author_data->user_level < 2)) + || ($author_data->user_level > $post_author_data->user_level) + || ($author_data->user_level >= 10) ) { + return true; + } else { + return false; + } +} + +/** + * Whether user can delete a post. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use current_user_can() + * @see current_user_can() + * + * @param int $user_id + * @param int $post_id + * @param int $blog_id Not Used + * @return bool + */ +function user_can_delete_post($user_id, $post_id, $blog_id = 1) { + _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); + + // Right now if one can edit, one can delete. + return user_can_edit_post($user_id, $post_id, $blog_id); +} + +/** + * Whether user can set new posts' dates. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use current_user_can() + * @see current_user_can() + * + * @param int $user_id + * @param int $blog_id Not Used + * @param int $category_id Not Used + * @return bool + */ +function user_can_set_post_date($user_id, $blog_id = 1, $category_id = 'None') { + _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); + + $author_data = get_userdata($user_id); + return (($author_data->user_level > 4) && user_can_create_post($user_id, $blog_id, $category_id)); +} + +/** + * Whether user can delete a post. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use current_user_can() + * @see current_user_can() + * + * @param int $user_id + * @param int $post_id + * @param int $blog_id Not Used + * @return bool returns true if $user_id can edit $post_id's date + */ +function user_can_edit_post_date($user_id, $post_id, $blog_id = 1) { + _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); + + $author_data = get_userdata($user_id); + return (($author_data->user_level > 4) && user_can_edit_post($user_id, $post_id, $blog_id)); +} + +/** + * Whether user can delete a post. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use current_user_can() + * @see current_user_can() + * + * @param int $user_id + * @param int $post_id + * @param int $blog_id Not Used + * @return bool returns true if $user_id can edit $post_id's comments + */ +function user_can_edit_post_comments($user_id, $post_id, $blog_id = 1) { + _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); + + // Right now if one can edit a post, one can edit comments made on it. + return user_can_edit_post($user_id, $post_id, $blog_id); +} + +/** + * Whether user can delete a post. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use current_user_can() + * @see current_user_can() + * + * @param int $user_id + * @param int $post_id + * @param int $blog_id Not Used + * @return bool returns true if $user_id can delete $post_id's comments + */ +function user_can_delete_post_comments($user_id, $post_id, $blog_id = 1) { + _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); + + // Right now if one can edit comments, one can delete comments. + return user_can_edit_post_comments($user_id, $post_id, $blog_id); +} + +/** + * Can user can edit other user. + * + * @since 1.5.0 + * @deprecated 2.0.0 Use current_user_can() + * @see current_user_can() + * + * @param int $user_id + * @param int $other_user + * @return bool + */ +function user_can_edit_user($user_id, $other_user) { + _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); + + $user = get_userdata($user_id); + $other = get_userdata($other_user); + if ( $user->user_level > $other->user_level || $user->user_level > 8 || $user->ID == $other->ID ) + return true; + else + return false; +} + +/** + * Gets the links associated with category $cat_name. + * + * @since 0.71 + * @deprecated 2.1.0 Use get_bookmarks() + * @see get_bookmarks() + * + * @param string $cat_name Optional. The category name to use. If no match is found uses all. + * @param string $before Optional. The html to output before the link. + * @param string $after Optional. The html to output after the link. + * @param string $between Optional. The html to output between the link/image and its description. Not used if no image or $show_images is true. + * @param bool $show_images Optional. Whether to show images (if defined). + * @param string $orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', 'description' or 'rating'. Or maybe owner. + * If you start the name with an underscore the order will be reversed. You can also specify 'rand' as the order which will return links in a + * random order. + * @param bool $show_description Optional. Whether to show the description if show_images=false/not defined. + * @param bool $show_rating Optional. Show rating stars/chars. + * @param int $limit Optional. Limit to X entries. If not specified, all entries are shown. + * @param int $show_updated Optional. Whether to show last updated timestamp + */ +function get_linksbyname($cat_name = "noname", $before = '', $after = '
                ', $between = " ", $show_images = true, $orderby = 'id', + $show_description = true, $show_rating = false, + $limit = -1, $show_updated = 0) { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); + + $cat_id = -1; + $cat = get_term_by('name', $cat_name, 'link_category'); + if ( $cat ) + $cat_id = $cat->term_id; + + get_links($cat_id, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated); +} + +/** + * Gets the links associated with the named category. + * + * @since 1.0.1 + * @deprecated 2.1.0 Use wp_list_bookmarks() + * @see wp_list_bookmarks() + * + * @param string $category The category to use. + * @param string $args + * @return string|null + */ +function wp_get_linksbyname($category, $args = '') { + _deprecated_function(__FUNCTION__, '2.1.0', 'wp_list_bookmarks()'); + + $defaults = array( + 'after' => '
                ', + 'before' => '', + 'categorize' => 0, + 'category_after' => '', + 'category_before' => '', + 'category_name' => $category, + 'show_description' => 1, + 'title_li' => '', + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + return wp_list_bookmarks($parsed_args); +} + +/** + * Gets an array of link objects associated with category $cat_name. + * + * $links = get_linkobjectsbyname( 'fred' ); + * foreach ( $links as $link ) { + * echo '
              • ' . $link->link_name . '
              • '; + * } + * + * @since 1.0.1 + * @deprecated 2.1.0 Use get_bookmarks() + * @see get_bookmarks() + * + * @param string $cat_name The category name to use. If no match is found uses all. + * @param string $orderby The order to output the links. E.g. 'id', 'name', 'url', 'description', or 'rating'. + * Or maybe owner. If you start the name with an underscore the order will be reversed. You can also + * specify 'rand' as the order which will return links in a random order. + * @param int $limit Limit to X entries. If not specified, all entries are shown. + * @return array + */ +function get_linkobjectsbyname($cat_name = "noname" , $orderby = 'name', $limit = -1) { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); + + $cat_id = -1; + $cat = get_term_by('name', $cat_name, 'link_category'); + if ( $cat ) + $cat_id = $cat->term_id; + + return get_linkobjects($cat_id, $orderby, $limit); +} + +/** + * Gets an array of link objects associated with category n. + * + * Usage: + * + * $links = get_linkobjects(1); + * if ($links) { + * foreach ($links as $link) { + * echo '
              • '.$link->link_name.'
                '.$link->link_description.'
              • '; + * } + * } + * + * Fields are: + * + * - link_id + * - link_url + * - link_name + * - link_image + * - link_target + * - link_category + * - link_description + * - link_visible + * - link_owner + * - link_rating + * - link_updated + * - link_rel + * - link_notes + * + * @since 1.0.1 + * @deprecated 2.1.0 Use get_bookmarks() + * @see get_bookmarks() + * + * @param int $category The category to use. If no category supplied uses all + * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url', + * 'description', or 'rating'. Or maybe owner. If you start the name with an + * underscore the order will be reversed. You can also specify 'rand' as the + * order which will return links in a random order. + * @param int $limit Limit to X entries. If not specified, all entries are shown. + * @return array + */ +function get_linkobjects($category = 0, $orderby = 'name', $limit = 0) { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); + + $links = get_bookmarks( array( 'category' => $category, 'orderby' => $orderby, 'limit' => $limit ) ) ; + + $links_array = array(); + foreach ($links as $link) + $links_array[] = $link; + + return $links_array; +} + +/** + * Gets the links associated with category 'cat_name' and display rating stars/chars. + * + * @since 0.71 + * @deprecated 2.1.0 Use get_bookmarks() + * @see get_bookmarks() + * + * @param string $cat_name The category name to use. If no match is found uses all + * @param string $before The html to output before the link + * @param string $after The html to output after the link + * @param string $between The html to output between the link/image and its description. Not used if no image or show_images is true + * @param bool $show_images Whether to show images (if defined). + * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url', + * 'description', or 'rating'. Or maybe owner. If you start the name with an + * underscore the order will be reversed. You can also specify 'rand' as the + * order which will return links in a random order. + * @param bool $show_description Whether to show the description if show_images=false/not defined + * @param int $limit Limit to X entries. If not specified, all entries are shown. + * @param int $show_updated Whether to show last updated timestamp + */ +function get_linksbyname_withrating($cat_name = "noname", $before = '', $after = '
                ', $between = " ", + $show_images = true, $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); + + get_linksbyname($cat_name, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated); +} + +/** + * Gets the links associated with category n and display rating stars/chars. + * + * @since 0.71 + * @deprecated 2.1.0 Use get_bookmarks() + * @see get_bookmarks() + * + * @param int $category The category to use. If no category supplied uses all + * @param string $before The html to output before the link + * @param string $after The html to output after the link + * @param string $between The html to output between the link/image and its description. Not used if no image or show_images == true + * @param bool $show_images Whether to show images (if defined). + * @param string $orderby The order to output the links. E.g. 'id', 'name', 'url', + * 'description', or 'rating'. Or maybe owner. If you start the name with an + * underscore the order will be reversed. You can also specify 'rand' as the + * order which will return links in a random order. + * @param bool $show_description Whether to show the description if show_images=false/not defined. + * @param int $limit Limit to X entries. If not specified, all entries are shown. + * @param int $show_updated Whether to show last updated timestamp + */ +function get_links_withrating($category = -1, $before = '', $after = '
                ', $between = " ", $show_images = true, + $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); + + get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated); +} + +/** + * Gets the auto_toggle setting. + * + * @since 0.71 + * @deprecated 2.1.0 + * + * @param int $id The category to get. If no category supplied uses 0 + * @return int Only returns 0. + */ +function get_autotoggle($id = 0) { + _deprecated_function( __FUNCTION__, '2.1.0' ); + return 0; +} + +/** + * Lists categories. + * + * @since 0.71 + * @deprecated 2.1.0 Use wp_list_categories() + * @see wp_list_categories() + * + * @param int $optionall + * @param string $all + * @param string $sort_column + * @param string $sort_order + * @param string $file + * @param bool $list + * @param int $optiondates + * @param int $optioncount + * @param int $hide_empty + * @param int $use_desc_for_title + * @param bool $children + * @param int $child_of + * @param int $categories + * @param int $recurse + * @param string $feed + * @param string $feed_image + * @param string $exclude + * @param bool $hierarchical + * @return null|false + */ +function list_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc', $file = '', $list = true, $optiondates = 0, + $optioncount = 0, $hide_empty = 1, $use_desc_for_title = 1, $children=false, $child_of=0, $categories=0, + $recurse=0, $feed = '', $feed_image = '', $exclude = '', $hierarchical=false) { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' ); + + $query = compact('optionall', 'all', 'sort_column', 'sort_order', 'file', 'list', 'optiondates', 'optioncount', 'hide_empty', 'use_desc_for_title', 'children', + 'child_of', 'categories', 'recurse', 'feed', 'feed_image', 'exclude', 'hierarchical'); + return wp_list_cats($query); +} + +/** + * Lists categories. + * + * @since 1.2.0 + * @deprecated 2.1.0 Use wp_list_categories() + * @see wp_list_categories() + * + * @param string|array $args + * @return null|string|false + */ +function wp_list_cats($args = '') { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' ); + + $parsed_args = wp_parse_args( $args ); + + // Map to new names. + if ( isset($parsed_args['optionall']) && isset($parsed_args['all'])) + $parsed_args['show_option_all'] = $parsed_args['all']; + if ( isset($parsed_args['sort_column']) ) + $parsed_args['orderby'] = $parsed_args['sort_column']; + if ( isset($parsed_args['sort_order']) ) + $parsed_args['order'] = $parsed_args['sort_order']; + if ( isset($parsed_args['optiondates']) ) + $parsed_args['show_last_update'] = $parsed_args['optiondates']; + if ( isset($parsed_args['optioncount']) ) + $parsed_args['show_count'] = $parsed_args['optioncount']; + if ( isset($parsed_args['list']) ) + $parsed_args['style'] = $parsed_args['list'] ? 'list' : 'break'; + $parsed_args['title_li'] = ''; + + return wp_list_categories($parsed_args); +} + +/** + * Deprecated method for generating a drop-down of categories. + * + * @since 0.71 + * @deprecated 2.1.0 Use wp_dropdown_categories() + * @see wp_dropdown_categories() + * + * @param int $optionall + * @param string $all + * @param string $orderby + * @param string $order + * @param int $show_last_update + * @param int $show_count + * @param int $hide_empty + * @param bool $optionnone + * @param int $selected + * @param int $exclude + * @return string + */ +function dropdown_cats($optionall = 1, $all = 'All', $orderby = 'ID', $order = 'asc', + $show_last_update = 0, $show_count = 0, $hide_empty = 1, $optionnone = false, + $selected = 0, $exclude = 0) { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_dropdown_categories()' ); + + $show_option_all = ''; + if ( $optionall ) + $show_option_all = $all; + + $show_option_none = ''; + if ( $optionnone ) + $show_option_none = __('None'); + + $vars = compact('show_option_all', 'show_option_none', 'orderby', 'order', + 'show_last_update', 'show_count', 'hide_empty', 'selected', 'exclude'); + $query = add_query_arg($vars, ''); + return wp_dropdown_categories($query); +} + +/** + * Lists authors. + * + * @since 1.2.0 + * @deprecated 2.1.0 Use wp_list_authors() + * @see wp_list_authors() + * + * @param bool $optioncount + * @param bool $exclude_admin + * @param bool $show_fullname + * @param bool $hide_empty + * @param string $feed + * @param string $feed_image + * @return null|string + */ +function list_authors($optioncount = false, $exclude_admin = true, $show_fullname = false, $hide_empty = true, $feed = '', $feed_image = '') { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_authors()' ); + + $args = compact('optioncount', 'exclude_admin', 'show_fullname', 'hide_empty', 'feed', 'feed_image'); + return wp_list_authors($args); +} + +/** + * Retrieves a list of post categories. + * + * @since 1.0.1 + * @deprecated 2.1.0 Use wp_get_post_categories() + * @see wp_get_post_categories() + * + * @param int $blogid Not Used + * @param int $post_ID + * @return array + */ +function wp_get_post_cats($blogid = '1', $post_ID = 0) { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_post_categories()' ); + return wp_get_post_categories($post_ID); +} + +/** + * Sets the categories that the post id belongs to. + * + * @since 1.0.1 + * @deprecated 2.1.0 + * @deprecated Use wp_set_post_categories() + * @see wp_set_post_categories() + * + * @param int $blogid Not used + * @param int $post_ID + * @param array $post_categories + * @return bool|mixed + */ +function wp_set_post_cats($blogid = '1', $post_ID = 0, $post_categories = array()) { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_set_post_categories()' ); + return wp_set_post_categories($post_ID, $post_categories); +} + +/** + * Retrieves a list of archives. + * + * @since 0.71 + * @deprecated 2.1.0 Use wp_get_archives() + * @see wp_get_archives() + * + * @param string $type + * @param string $limit + * @param string $format + * @param string $before + * @param string $after + * @param bool $show_post_count + * @return string|null + */ +function get_archives($type='', $limit='', $format='html', $before = '', $after = '', $show_post_count = false) { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_archives()' ); + $args = compact('type', 'limit', 'format', 'before', 'after', 'show_post_count'); + return wp_get_archives($args); +} + +/** + * Returns or Prints link to the author's posts. + * + * @since 1.2.0 + * @deprecated 2.1.0 Use get_author_posts_url() + * @see get_author_posts_url() + * + * @param bool $echo + * @param int $author_id + * @param string $author_nicename Optional. + * @return string|null + */ +function get_author_link($echo, $author_id, $author_nicename = '') { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_author_posts_url()' ); + + $link = get_author_posts_url($author_id, $author_nicename); + + if ( $echo ) + echo $link; + return $link; +} + +/** + * Print list of pages based on arguments. + * + * @since 0.71 + * @deprecated 2.1.0 Use wp_link_pages() + * @see wp_link_pages() + * + * @param string $before + * @param string $after + * @param string $next_or_number + * @param string $nextpagelink + * @param string $previouspagelink + * @param string $pagelink + * @param string $more_file + * @return string + */ +function link_pages($before='
                ', $after='
                ', $next_or_number='number', $nextpagelink='next page', $previouspagelink='previous page', + $pagelink='%', $more_file='') { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_link_pages()' ); + + $args = compact('before', 'after', 'next_or_number', 'nextpagelink', 'previouspagelink', 'pagelink', 'more_file'); + return wp_link_pages($args); +} + +/** + * Get value based on option. + * + * @since 0.71 + * @deprecated 2.1.0 Use get_option() + * @see get_option() + * + * @param string $option + * @return string + */ +function get_settings($option) { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_option()' ); + + return get_option($option); +} + +/** + * Print the permalink of the current post in the loop. + * + * @since 0.71 + * @deprecated 1.2.0 Use the_permalink() + * @see the_permalink() + */ +function permalink_link() { + _deprecated_function( __FUNCTION__, '1.2.0', 'the_permalink()' ); + the_permalink(); +} + +/** + * Print the permalink to the RSS feed. + * + * @since 0.71 + * @deprecated 2.3.0 Use the_permalink_rss() + * @see the_permalink_rss() + * + * @param string $deprecated + */ +function permalink_single_rss($deprecated = '') { + _deprecated_function( __FUNCTION__, '2.3.0', 'the_permalink_rss()' ); + the_permalink_rss(); +} + +/** + * Gets the links associated with category. + * + * @since 1.0.1 + * @deprecated 2.1.0 Use wp_list_bookmarks() + * @see wp_list_bookmarks() + * + * @param string $args a query string + * @return null|string + */ +function wp_get_links($args = '') { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' ); + + if ( strpos( $args, '=' ) === false ) { + $cat_id = $args; + $args = add_query_arg( 'category', $cat_id, $args ); + } + + $defaults = array( + 'after' => '
                ', + 'before' => '', + 'between' => ' ', + 'categorize' => 0, + 'category' => '', + 'echo' => true, + 'limit' => -1, + 'orderby' => 'name', + 'show_description' => true, + 'show_images' => true, + 'show_rating' => false, + 'show_updated' => true, + 'title_li' => '', + ); + + $parsed_args = wp_parse_args( $args, $defaults ); + + return wp_list_bookmarks($parsed_args); +} + +/** + * Gets the links associated with category by id. + * + * @since 0.71 + * @deprecated 2.1.0 Use get_bookmarks() + * @see get_bookmarks() + * + * @param int $category The category to use. If no category supplied uses all + * @param string $before the html to output before the link + * @param string $after the html to output after the link + * @param string $between the html to output between the link/image and its description. + * Not used if no image or show_images == true + * @param bool $show_images whether to show images (if defined). + * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url', + * 'description', or 'rating'. Or maybe owner. If you start the name with an + * underscore the order will be reversed. You can also specify 'rand' as the order + * which will return links in a random order. + * @param bool $show_description whether to show the description if show_images=false/not defined. + * @param bool $show_rating show rating stars/chars + * @param int $limit Limit to X entries. If not specified, all entries are shown. + * @param int $show_updated whether to show last updated timestamp + * @param bool $echo whether to echo the results, or return them instead + * @return null|string + */ +function get_links($category = -1, $before = '', $after = '
                ', $between = ' ', $show_images = true, $orderby = 'name', + $show_description = true, $show_rating = false, $limit = -1, $show_updated = 1, $echo = true) { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); + + $order = 'ASC'; + if ( substr($orderby, 0, 1) == '_' ) { + $order = 'DESC'; + $orderby = substr($orderby, 1); + } + + if ( $category == -1 ) // get_bookmarks() uses '' to signify all categories. + $category = ''; + + $results = get_bookmarks(array('category' => $category, 'orderby' => $orderby, 'order' => $order, 'show_updated' => $show_updated, 'limit' => $limit)); + + if ( !$results ) + return; + + $output = ''; + + foreach ( (array) $results as $row ) { + if ( !isset($row->recently_updated) ) + $row->recently_updated = false; + $output .= $before; + if ( $show_updated && $row->recently_updated ) + $output .= get_option('links_recently_updated_prepend'); + $the_link = '#'; + if ( !empty($row->link_url) ) + $the_link = esc_url($row->link_url); + $rel = $row->link_rel; + if ( '' != $rel ) + $rel = ' rel="' . $rel . '"'; + + $desc = esc_attr(sanitize_bookmark_field('link_description', $row->link_description, $row->link_id, 'display')); + $name = esc_attr(sanitize_bookmark_field('link_name', $row->link_name, $row->link_id, 'display')); + $title = $desc; + + if ( $show_updated ) + if (substr($row->link_updated_f, 0, 2) != '00') + $title .= ' ('.__('Last updated') . ' ' . gmdate(get_option('links_updated_date_format'), $row->link_updated_f + (get_option('gmt_offset') * HOUR_IN_SECONDS)) . ')'; + + if ( '' != $title ) + $title = ' title="' . $title . '"'; + + $alt = ' alt="' . $name . '"'; + + $target = $row->link_target; + if ( '' != $target ) + $target = ' target="' . $target . '"'; + + $output .= ''; + + if ( $row->link_image != null && $show_images ) { + if ( strpos($row->link_image, 'http') !== false ) + $output .= "link_image\" $alt $title />"; + else // If it's a relative path. + $output .= "link_image\" $alt $title />"; + } else { + $output .= $name; + } + + $output .= ''; + + if ( $show_updated && $row->recently_updated ) + $output .= get_option('links_recently_updated_append'); + + if ( $show_description && '' != $desc ) + $output .= $between . $desc; + + if ($show_rating) { + $output .= $between . get_linkrating($row); + } + + $output .= "$after\n"; + } // End while. + + if ( !$echo ) + return $output; + echo $output; +} + +/** + * Output entire list of links by category. + * + * Output a list of all links, listed by category, using the settings in + * $wpdb->linkcategories and output it as a nested HTML unordered list. + * + * @since 1.0.1 + * @deprecated 2.1.0 Use wp_list_bookmarks() + * @see wp_list_bookmarks() + * + * @param string $order Sort link categories by 'name' or 'id' + */ +function get_links_list($order = 'name') { + _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' ); + + $order = strtolower($order); + + // Handle link category sorting. + $direction = 'ASC'; + if ( '_' == substr($order,0,1) ) { + $direction = 'DESC'; + $order = substr($order,1); + } + + if ( !isset($direction) ) + $direction = ''; + + $cats = get_categories(array('type' => 'link', 'orderby' => $order, 'order' => $direction, 'hierarchical' => 0)); + + // Display each category. + if ( $cats ) { + foreach ( (array) $cats as $cat ) { + // Handle each category. + + // Display the category name. + echo '
              • ' . apply_filters('link_category', $cat->name ) . "

                \n\t
                  \n"; + // Call get_links() with all the appropriate params. + get_links($cat->term_id, '
                • ', "
                • ", "\n", true, 'name', false); + + // Close the last category. + echo "\n\t
                \n
              • \n"; + } + } +} + +/** + * Show the link to the links popup and the number of links. + * + * @since 0.71 + * @deprecated 2.1.0 + * + * @param string $text the text of the link + * @param int $width the width of the popup window + * @param int $height the height of the popup window + * @param string $file the page to open in the popup window + * @param bool $count the number of links in the db + */ +function links_popup_script($text = 'Links', $width=400, $height=400, $file='links.all.php', $count = true) { + _deprecated_function( __FUNCTION__, '2.1.0' ); +} + +/** + * Legacy function that retrieved the value of a link's link_rating field. + * + * @since 1.0.1 + * @deprecated 2.1.0 Use sanitize_bookmark_field() + * @see sanitize_bookmark_field() + * + * @param object $link Link object. + * @return mixed Value of the 'link_rating' field, false otherwise. + */ +function get_linkrating( $link ) { + _deprecated_function( __FUNCTION__, '2.1.0', 'sanitize_bookmark_field()' ); + return sanitize_bookmark_field('link_rating', $link->link_rating, $link->link_id, 'display'); +} + +/** + * Gets the name of category by id. + * + * @since 0.71 + * @deprecated 2.1.0 Use get_category() + * @see get_category() + * + * @param int $id The category to get. If no category supplied uses 0 + * @return string + */ +function get_linkcatname($id = 0) { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_category()' ); + + $id = (int) $id; + + if ( empty($id) ) + return ''; + + $cats = wp_get_link_cats($id); + + if ( empty($cats) || ! is_array($cats) ) + return ''; + + $cat_id = (int) $cats[0]; // Take the first cat. + + $cat = get_category($cat_id); + return $cat->name; +} + +/** + * Print RSS comment feed link. + * + * @since 1.0.1 + * @deprecated 2.5.0 Use post_comments_feed_link() + * @see post_comments_feed_link() + * + * @param string $link_text + */ +function comments_rss_link($link_text = 'Comments RSS') { + _deprecated_function( __FUNCTION__, '2.5.0', 'post_comments_feed_link()' ); + post_comments_feed_link($link_text); +} + +/** + * Print/Return link to category RSS2 feed. + * + * @since 1.2.0 + * @deprecated 2.5.0 Use get_category_feed_link() + * @see get_category_feed_link() + * + * @param bool $echo + * @param int $cat_ID + * @return string + */ +function get_category_rss_link($echo = false, $cat_ID = 1) { + _deprecated_function( __FUNCTION__, '2.5.0', 'get_category_feed_link()' ); + + $link = get_category_feed_link($cat_ID, 'rss2'); + + if ( $echo ) + echo $link; + return $link; +} + +/** + * Print/Return link to author RSS feed. + * + * @since 1.2.0 + * @deprecated 2.5.0 Use get_author_feed_link() + * @see get_author_feed_link() + * + * @param bool $echo + * @param int $author_id + * @return string + */ +function get_author_rss_link($echo = false, $author_id = 1) { + _deprecated_function( __FUNCTION__, '2.5.0', 'get_author_feed_link()' ); + + $link = get_author_feed_link($author_id); + if ( $echo ) + echo $link; + return $link; +} + +/** + * Return link to the post RSS feed. + * + * @since 1.5.0 + * @deprecated 2.2.0 Use get_post_comments_feed_link() + * @see get_post_comments_feed_link() + * + * @return string + */ +function comments_rss() { + _deprecated_function( __FUNCTION__, '2.2.0', 'get_post_comments_feed_link()' ); + return esc_url( get_post_comments_feed_link() ); +} + +/** + * An alias of wp_create_user(). + * + * @since 2.0.0 + * @deprecated 2.0.0 Use wp_create_user() + * @see wp_create_user() + * + * @param string $username The user's username. + * @param string $password The user's password. + * @param string $email The user's email. + * @return int The new user's ID. + */ +function create_user($username, $password, $email) { + _deprecated_function( __FUNCTION__, '2.0.0', 'wp_create_user()' ); + return wp_create_user($username, $password, $email); +} + +/** + * Unused function. + * + * @deprecated 2.5.0 + */ +function gzip_compression() { + _deprecated_function( __FUNCTION__, '2.5.0' ); + return false; +} + +/** + * Retrieve an array of comment data about comment $comment_ID. + * + * @since 0.71 + * @deprecated 2.7.0 Use get_comment() + * @see get_comment() + * + * @param int $comment_ID The ID of the comment + * @param int $no_cache Whether to use the cache (cast to bool) + * @param bool $include_unapproved Whether to include unapproved comments + * @return array The comment data + */ +function get_commentdata( $comment_ID, $no_cache = 0, $include_unapproved = false ) { + _deprecated_function( __FUNCTION__, '2.7.0', 'get_comment()' ); + return get_comment($comment_ID, ARRAY_A); +} + +/** + * Retrieve the category name by the category ID. + * + * @since 0.71 + * @deprecated 2.8.0 Use get_cat_name() + * @see get_cat_name() + * + * @param int $cat_ID Category ID + * @return string category name + */ +function get_catname( $cat_ID ) { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_cat_name()' ); + return get_cat_name( $cat_ID ); +} + +/** + * Retrieve category children list separated before and after the term IDs. + * + * @since 1.2.0 + * @deprecated 2.8.0 Use get_term_children() + * @see get_term_children() + * + * @param int $id Category ID to retrieve children. + * @param string $before Optional. Prepend before category term ID. + * @param string $after Optional, default is empty string. Append after category term ID. + * @param array $visited Optional. Category Term IDs that have already been added. + * @return string + */ +function get_category_children( $id, $before = '/', $after = '', $visited = array() ) { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_term_children()' ); + if ( 0 == $id ) + return ''; + + $chain = ''; + /** TODO: Consult hierarchy */ + $cat_ids = get_all_category_ids(); + foreach ( (array) $cat_ids as $cat_id ) { + if ( $cat_id == $id ) + continue; + + $category = get_category( $cat_id ); + if ( is_wp_error( $category ) ) + return $category; + if ( $category->parent == $id && !in_array( $category->term_id, $visited ) ) { + $visited[] = $category->term_id; + $chain .= $before.$category->term_id.$after; + $chain .= get_category_children( $category->term_id, $before, $after ); + } + } + return $chain; +} + +/** + * Retrieves all category IDs. + * + * @since 2.0.0 + * @deprecated 4.0.0 Use get_terms() + * @see get_terms() + * + * @link https://developer.wordpress.org/reference/functions/get_all_category_ids/ + * + * @return object List of all of the category IDs. + */ +function get_all_category_ids() { + _deprecated_function( __FUNCTION__, '4.0.0', 'get_terms()' ); + + $cat_ids = get_terms( + array( + 'taxonomy' => 'category', + 'fields' => 'ids', + 'get' => 'all', + ) + ); + + return $cat_ids; +} + +/** + * Retrieve the description of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's description. + */ +function get_the_author_description() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'description\')' ); + return get_the_author_meta('description'); +} + +/** + * Display the description of the author of the current post. + * + * @since 1.0.0 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_description() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'description\')' ); + the_author_meta('description'); +} + +/** + * Retrieve the login name of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's login name (username). + */ +function get_the_author_login() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'login\')' ); + return get_the_author_meta('login'); +} + +/** + * Display the login name of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_login() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'login\')' ); + the_author_meta('login'); +} + +/** + * Retrieve the first name of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's first name. + */ +function get_the_author_firstname() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'first_name\')' ); + return get_the_author_meta('first_name'); +} + +/** + * Display the first name of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_firstname() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'first_name\')' ); + the_author_meta('first_name'); +} + +/** + * Retrieve the last name of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's last name. + */ +function get_the_author_lastname() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'last_name\')' ); + return get_the_author_meta('last_name'); +} + +/** + * Display the last name of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_lastname() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'last_name\')' ); + the_author_meta('last_name'); +} + +/** + * Retrieve the nickname of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's nickname. + */ +function get_the_author_nickname() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'nickname\')' ); + return get_the_author_meta('nickname'); +} + +/** + * Display the nickname of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_nickname() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'nickname\')' ); + the_author_meta('nickname'); +} + +/** + * Retrieve the email of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's username. + */ +function get_the_author_email() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'email\')' ); + return get_the_author_meta('email'); +} + +/** + * Display the email of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_email() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'email\')' ); + the_author_meta('email'); +} + +/** + * Retrieve the ICQ number of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's ICQ number. + */ +function get_the_author_icq() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'icq\')' ); + return get_the_author_meta('icq'); +} + +/** + * Display the ICQ number of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_icq() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'icq\')' ); + the_author_meta('icq'); +} + +/** + * Retrieve the Yahoo! IM name of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's Yahoo! IM name. + */ +function get_the_author_yim() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'yim\')' ); + return get_the_author_meta('yim'); +} + +/** + * Display the Yahoo! IM name of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_yim() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'yim\')' ); + the_author_meta('yim'); +} + +/** + * Retrieve the MSN address of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's MSN address. + */ +function get_the_author_msn() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'msn\')' ); + return get_the_author_meta('msn'); +} + +/** + * Display the MSN address of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_msn() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'msn\')' ); + the_author_meta('msn'); +} + +/** + * Retrieve the AIM address of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The author's AIM address. + */ +function get_the_author_aim() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'aim\')' ); + return get_the_author_meta('aim'); +} + +/** + * Display the AIM address of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta('aim') + * @see the_author_meta() + */ +function the_author_aim() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'aim\')' ); + the_author_meta('aim'); +} + +/** + * Retrieve the specified author's preferred display name. + * + * @since 1.0.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @param int $auth_id The ID of the author. + * @return string The author's display name. + */ +function get_author_name( $auth_id = false ) { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'display_name\')' ); + return get_the_author_meta('display_name', $auth_id); +} + +/** + * Retrieve the URL to the home page of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string The URL to the author's page. + */ +function get_the_author_url() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'url\')' ); + return get_the_author_meta('url'); +} + +/** + * Display the URL to the home page of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_url() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'url\')' ); + the_author_meta('url'); +} + +/** + * Retrieve the ID of the author of the current post. + * + * @since 1.5.0 + * @deprecated 2.8.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @return string|int The author's ID. + */ +function get_the_author_ID() { + _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'ID\')' ); + return get_the_author_meta('ID'); +} + +/** + * Display the ID of the author of the current post. + * + * @since 0.71 + * @deprecated 2.8.0 Use the_author_meta() + * @see the_author_meta() + */ +function the_author_ID() { + _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'ID\')' ); + the_author_meta('ID'); +} + +/** + * Display the post content for the feed. + * + * For encoding the html or the $encode_html parameter, there are three possible + * values. '0' will make urls footnotes and use make_url_footnote(). '1' will + * encode special characters and automatically display all of the content. The + * value of '2' will strip all HTML tags from the content. + * + * Also note that you cannot set the amount of words and not set the html + * encoding. If that is the case, then the html encoding will default to 2, + * which will strip all HTML tags. + * + * To restrict the amount of words of the content, you can use the cut + * parameter. If the content is less than the amount, then there won't be any + * dots added to the end. If there is content left over, then dots will be added + * and the rest of the content will be removed. + * + * @since 0.71 + * + * @deprecated 2.9.0 Use the_content_feed() + * @see the_content_feed() + * + * @param string $more_link_text Optional. Text to display when more content is available but not displayed. + * @param int $stripteaser Optional. Default is 0. + * @param string $more_file Optional. + * @param int $cut Optional. Amount of words to keep for the content. + * @param int $encode_html Optional. How to encode the content. + */ +function the_content_rss($more_link_text='(more...)', $stripteaser=0, $more_file='', $cut = 0, $encode_html = 0) { + _deprecated_function( __FUNCTION__, '2.9.0', 'the_content_feed()' ); + $content = get_the_content($more_link_text, $stripteaser); + + /** + * Filters the post content in the context of an RSS feed. + * + * @since 0.71 + * + * @param string $content Content of the current post. + */ + $content = apply_filters('the_content_rss', $content); + if ( $cut && !$encode_html ) + $encode_html = 2; + if ( 1== $encode_html ) { + $content = esc_html($content); + $cut = 0; + } elseif ( 0 == $encode_html ) { + $content = make_url_footnote($content); + } elseif ( 2 == $encode_html ) { + $content = strip_tags($content); + } + if ( $cut ) { + $blah = explode(' ', $content); + if ( count($blah) > $cut ) { + $k = $cut; + $use_dotdotdot = 1; + } else { + $k = count($blah); + $use_dotdotdot = 0; + } + + /** @todo Check performance, might be faster to use array slice instead. */ + for ( $i=0; $i<$k; $i++ ) + $excerpt .= $blah[$i].' '; + $excerpt .= ($use_dotdotdot) ? '...' : ''; + $content = $excerpt; + } + $content = str_replace(']]>', ']]>', $content); + echo $content; +} + +/** + * Strip HTML and put links at the bottom of stripped content. + * + * Searches for all of the links, strips them out of the content, and places + * them at the bottom of the content with numbers. + * + * @since 0.71 + * @deprecated 2.9.0 + * + * @param string $content Content to get links + * @return string HTML stripped out of content with links at the bottom. + */ +function make_url_footnote( $content ) { + _deprecated_function( __FUNCTION__, '2.9.0', '' ); + preg_match_all( '/(.+?)<\/a>/', $content, $matches ); + $links_summary = "\n"; + for ( $i = 0, $c = count( $matches[0] ); $i < $c; $i++ ) { + $link_match = $matches[0][$i]; + $link_number = '['.($i+1).']'; + $link_url = $matches[2][$i]; + $link_text = $matches[4][$i]; + $content = str_replace( $link_match, $link_text . ' ' . $link_number, $content ); + $link_url = ( ( strtolower( substr( $link_url, 0, 7 ) ) != 'http://' ) && ( strtolower( substr( $link_url, 0, 8 ) ) != 'https://' ) ) ? get_option( 'home' ) . $link_url : $link_url; + $links_summary .= "\n" . $link_number . ' ' . $link_url; + } + $content = strip_tags( $content ); + $content .= $links_summary; + return $content; +} + +/** + * Retrieve translated string with vertical bar context + * + * Quite a few times, there will be collisions with similar translatable text + * found in more than two places but with different translated context. + * + * In order to use the separate contexts, the _c() function is used and the + * translatable string uses a pipe ('|') which has the context the string is in. + * + * When the translated string is returned, it is everything before the pipe, not + * including the pipe character. If there is no pipe in the translated text then + * everything is returned. + * + * @since 2.2.0 + * @deprecated 2.9.0 Use _x() + * @see _x() + * + * @param string $text Text to translate + * @param string $domain Optional. Domain to retrieve the translated text + * @return string Translated context string without pipe + */ +function _c( $text, $domain = 'default' ) { + _deprecated_function( __FUNCTION__, '2.9.0', '_x()' ); + return before_last_bar( translate( $text, $domain ) ); +} + +/** + * Translates $text like translate(), but assumes that the text + * contains a context after its last vertical bar. + * + * @since 2.5.0 + * @deprecated 3.0.0 Use _x() + * @see _x() + * + * @param string $text Text to translate + * @param string $domain Domain to retrieve the translated text + * @return string Translated text + */ +function translate_with_context( $text, $domain = 'default' ) { + _deprecated_function( __FUNCTION__, '2.9.0', '_x()' ); + return before_last_bar( translate( $text, $domain ) ); +} + +/** + * Legacy version of _n(), which supports contexts. + * + * Strips everything from the translation after the last bar. + * + * @since 2.7.0 + * @deprecated 3.0.0 Use _nx() + * @see _nx() + * + * @param string $single The text to be used if the number is singular. + * @param string $plural The text to be used if the number is plural. + * @param int $number The number to compare against to use either the singular or plural form. + * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. + * @return string The translated singular or plural form. + */ +function _nc( $single, $plural, $number, $domain = 'default' ) { + _deprecated_function( __FUNCTION__, '2.9.0', '_nx()' ); + return before_last_bar( _n( $single, $plural, $number, $domain ) ); +} + +/** + * Retrieve the plural or single form based on the amount. + * + * @since 1.2.0 + * @deprecated 2.8.0 Use _n() + * @see _n() + */ +function __ngettext( ...$args ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore + _deprecated_function( __FUNCTION__, '2.8.0', '_n()' ); + return _n( ...$args ); +} + +/** + * Register plural strings in POT file, but don't translate them. + * + * @since 2.5.0 + * @deprecated 2.8.0 Use _n_noop() + * @see _n_noop() + */ +function __ngettext_noop( ...$args ) { // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore + _deprecated_function( __FUNCTION__, '2.8.0', '_n_noop()' ); + return _n_noop( ...$args ); + +} + +/** + * Retrieve all autoload options, or all options if no autoloaded ones exist. + * + * @since 1.0.0 + * @deprecated 3.0.0 Use wp_load_alloptions()) + * @see wp_load_alloptions() + * + * @return array List of all options. + */ +function get_alloptions() { + _deprecated_function( __FUNCTION__, '3.0.0', 'wp_load_alloptions()' ); + return wp_load_alloptions(); +} + +/** + * Retrieve HTML content of attachment image with link. + * + * @since 2.0.0 + * @deprecated 2.5.0 Use wp_get_attachment_link() + * @see wp_get_attachment_link() + * + * @param int $id Optional. Post ID. + * @param bool $fullsize Optional, default is false. Whether to use full size image. + * @param array $max_dims Optional. Max image dimensions. + * @param bool $permalink Optional, default is false. Whether to include permalink to image. + * @return string + */ +function get_the_attachment_link($id = 0, $fullsize = false, $max_dims = false, $permalink = false) { + _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_link()' ); + $id = (int) $id; + $_post = get_post($id); + + if ( ('attachment' != $_post->post_type) || !$url = wp_get_attachment_url($_post->ID) ) + return __('Missing Attachment'); + + if ( $permalink ) + $url = get_attachment_link($_post->ID); + + $post_title = esc_attr($_post->post_title); + + $innerHTML = get_attachment_innerHTML($_post->ID, $fullsize, $max_dims); + return "$innerHTML"; +} + +/** + * Retrieve icon URL and Path. + * + * @since 2.1.0 + * @deprecated 2.5.0 Use wp_get_attachment_image_src() + * @see wp_get_attachment_image_src() + * + * @param int $id Optional. Post ID. + * @param bool $fullsize Optional, default to false. Whether to have full image. + * @return array Icon URL and full path to file, respectively. + */ +function get_attachment_icon_src( $id = 0, $fullsize = false ) { + _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image_src()' ); + $id = (int) $id; + if ( !$post = get_post($id) ) + return false; + + $file = get_attached_file( $post->ID ); + + if ( !$fullsize && $src = wp_get_attachment_thumb_url( $post->ID ) ) { + // We have a thumbnail desired, specified and existing. + + $src_file = wp_basename($src); + } elseif ( wp_attachment_is_image( $post->ID ) ) { + // We have an image without a thumbnail. + + $src = wp_get_attachment_url( $post->ID ); + $src_file = & $file; + } elseif ( $src = wp_mime_type_icon( $post->ID ) ) { + // No thumb, no image. We'll look for a mime-related icon instead. + + $icon_dir = apply_filters( 'icon_dir', get_template_directory() . '/images' ); + $src_file = $icon_dir . '/' . wp_basename($src); + } + + if ( !isset($src) || !$src ) + return false; + + return array($src, $src_file); +} + +/** + * Retrieve HTML content of icon attachment image element. + * + * @since 2.0.0 + * @deprecated 2.5.0 Use wp_get_attachment_image() + * @see wp_get_attachment_image() + * + * @param int $id Optional. Post ID. + * @param bool $fullsize Optional, default to false. Whether to have full size image. + * @param array $max_dims Optional. Dimensions of image. + * @return string|false HTML content. + */ +function get_attachment_icon( $id = 0, $fullsize = false, $max_dims = false ) { + _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' ); + $id = (int) $id; + if ( !$post = get_post($id) ) + return false; + + if ( !$src = get_attachment_icon_src( $post->ID, $fullsize ) ) + return false; + + list($src, $src_file) = $src; + + // Do we need to constrain the image? + if ( ($max_dims = apply_filters('attachment_max_dims', $max_dims)) && file_exists($src_file) ) { + + $imagesize = @getimagesize($src_file); + + if (($imagesize[0] > $max_dims[0]) || $imagesize[1] > $max_dims[1] ) { + $actual_aspect = $imagesize[0] / $imagesize[1]; + $desired_aspect = $max_dims[0] / $max_dims[1]; + + if ( $actual_aspect >= $desired_aspect ) { + $height = $actual_aspect * $max_dims[0]; + $constraint = "width='{$max_dims[0]}' "; + $post->iconsize = array($max_dims[0], $height); + } else { + $width = $max_dims[1] / $actual_aspect; + $constraint = "height='{$max_dims[1]}' "; + $post->iconsize = array($width, $max_dims[1]); + } + } else { + $post->iconsize = array($imagesize[0], $imagesize[1]); + $constraint = ''; + } + } else { + $constraint = ''; + } + + $post_title = esc_attr($post->post_title); + + $icon = "$post_title"; + + return apply_filters( 'attachment_icon', $icon, $post->ID ); +} + +/** + * Retrieve HTML content of image element. + * + * @since 2.0.0 + * @deprecated 2.5.0 Use wp_get_attachment_image() + * @see wp_get_attachment_image() + * + * @param int $id Optional. Post ID. + * @param bool $fullsize Optional, default to false. Whether to have full size image. + * @param array $max_dims Optional. Dimensions of image. + * @return string|false + */ +function get_attachment_innerHTML($id = 0, $fullsize = false, $max_dims = false) { + _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' ); + $id = (int) $id; + if ( !$post = get_post($id) ) + return false; + + if ( $innerHTML = get_attachment_icon($post->ID, $fullsize, $max_dims)) + return $innerHTML; + + $innerHTML = esc_attr($post->post_title); + + return apply_filters('attachment_innerHTML', $innerHTML, $post->ID); +} + +/** + * Retrieves bookmark data based on ID. + * + * @since 2.0.0 + * @deprecated 2.1.0 Use get_bookmark() + * @see get_bookmark() + * + * @param int $bookmark_id ID of link + * @param string $output Optional. Type of output. Accepts OBJECT, ARRAY_N, or ARRAY_A. + * Default OBJECT. + * @param string $filter Optional. How to filter the link for output. Accepts 'raw', 'edit', + * 'attribute', 'js', 'db', or 'display'. Default 'raw'. + * @return object|array Bookmark object or array, depending on the type specified by `$output`. + */ +function get_link( $bookmark_id, $output = OBJECT, $filter = 'raw' ) { + _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmark()' ); + return get_bookmark($bookmark_id, $output, $filter); +} + +/** + * Performs esc_url() for database or redirect usage. + * + * @since 2.3.1 + * @deprecated 2.8.0 Use esc_url_raw() + * @see esc_url_raw() + * + * @param string $url The URL to be cleaned. + * @param array $protocols An array of acceptable protocols. + * @return string The cleaned URL. + */ +function sanitize_url( $url, $protocols = null ) { + _deprecated_function( __FUNCTION__, '2.8.0', 'esc_url_raw()' ); + return esc_url_raw( $url, $protocols ); +} + +/** + * Checks and cleans a URL. + * + * A number of characters are removed from the URL. If the URL is for displaying + * (the default behaviour) ampersands are also replaced. The 'clean_url' filter + * is applied to the returned cleaned URL. + * + * @since 1.2.0 + * @deprecated 3.0.0 Use esc_url() + * @see esc_url() + * + * @param string $url The URL to be cleaned. + * @param array $protocols Optional. An array of acceptable protocols. + * @param string $context Optional. How the URL will be used. Default is 'display'. + * @return string The cleaned $url after the {@see 'clean_url'} filter is applied. + */ +function clean_url( $url, $protocols = null, $context = 'display' ) { + if ( $context == 'db' ) + _deprecated_function( 'clean_url( $context = \'db\' )', '3.0.0', 'esc_url_raw()' ); + else + _deprecated_function( __FUNCTION__, '3.0.0', 'esc_url()' ); + return esc_url( $url, $protocols, $context ); +} + +/** + * Escape single quotes, specialchar double quotes, and fix line endings. + * + * The filter {@see 'js_escape'} is also applied by esc_js(). + * + * @since 2.0.4 + * @deprecated 2.8.0 Use esc_js() + * @see esc_js() + * + * @param string $text The text to be escaped. + * @return string Escaped text. + */ +function js_escape( $text ) { + _deprecated_function( __FUNCTION__, '2.8.0', 'esc_js()' ); + return esc_js( $text ); +} + +/** + * Legacy escaping for HTML blocks. + * + * @deprecated 2.8.0 Use esc_html() + * @see esc_html() + * + * @param string $string String to escape. + * @param string $quote_style Unused. + * @param false|string $charset Unused. + * @param false $double_encode Whether to double encode. Unused. + * @return string Escaped `$string`. + */ +function wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) { + _deprecated_function( __FUNCTION__, '2.8.0', 'esc_html()' ); + if ( func_num_args() > 1 ) { // Maintain back-compat for people passing additional arguments. + return _wp_specialchars( $string, $quote_style, $charset, $double_encode ); + } else { + return esc_html( $string ); + } +} + +/** + * Escaping for HTML attributes. + * + * @since 2.0.6 + * @deprecated 2.8.0 Use esc_attr() + * @see esc_attr() + * + * @param string $text + * @return string + */ +function attribute_escape( $text ) { + _deprecated_function( __FUNCTION__, '2.8.0', 'esc_attr()' ); + return esc_attr( $text ); +} + +/** + * Register widget for sidebar with backward compatibility. + * + * Allows $name to be an array that accepts either three elements to grab the + * first element and the third for the name or just uses the first element of + * the array for the name. + * + * Passes to wp_register_sidebar_widget() after argument list and backward + * compatibility is complete. + * + * @since 2.2.0 + * @deprecated 2.8.0 Use wp_register_sidebar_widget() + * @see wp_register_sidebar_widget() + * + * @param string|int $name Widget ID. + * @param callable $output_callback Run when widget is called. + * @param string $classname Optional. Classname widget option. Default empty. + * @param mixed ...$params Widget parameters. + */ +function register_sidebar_widget($name, $output_callback, $classname = '', ...$params) { + _deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_sidebar_widget()' ); + // Compat. + if ( is_array( $name ) ) { + if ( count( $name ) === 3 ) { + $name = sprintf( $name[0], $name[2] ); + } else { + $name = $name[0]; + } + } + + $id = sanitize_title( $name ); + $options = array(); + if ( ! empty( $classname ) && is_string( $classname ) ) { + $options['classname'] = $classname; + } + + wp_register_sidebar_widget( $id, $name, $output_callback, $options, ...$params ); +} + +/** + * Serves as an alias of wp_unregister_sidebar_widget(). + * + * @since 2.2.0 + * @deprecated 2.8.0 Use wp_unregister_sidebar_widget() + * @see wp_unregister_sidebar_widget() + * + * @param int|string $id Widget ID. + */ +function unregister_sidebar_widget($id) { + _deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_sidebar_widget()' ); + return wp_unregister_sidebar_widget($id); +} + +/** + * Registers widget control callback for customizing options. + * + * Allows $name to be an array that accepts either three elements to grab the + * first element and the third for the name or just uses the first element of + * the array for the name. + * + * Passes to wp_register_widget_control() after the argument list has + * been compiled. + * + * @since 2.2.0 + * @deprecated 2.8.0 Use wp_register_widget_control() + * @see wp_register_widget_control() + * + * @param int|string $name Sidebar ID. + * @param callable $control_callback Widget control callback to display and process form. + * @param int $width Widget width. + * @param int $height Widget height. + * @param mixed ...$params Widget parameters. + */ +function register_widget_control($name, $control_callback, $width = '', $height = '', ...$params) { + _deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_widget_control()' ); + // Compat. + if ( is_array( $name ) ) { + if ( count( $name ) === 3 ) { + $name = sprintf( $name[0], $name[2] ); + } else { + $name = $name[0]; + } + } + + $id = sanitize_title( $name ); + $options = array(); + if ( ! empty( $width ) ) { + $options['width'] = $width; + } + if ( ! empty( $height ) ) { + $options['height'] = $height; + } + + wp_register_widget_control( $id, $name, $control_callback, $options, ...$params ); +} + +/** + * Alias of wp_unregister_widget_control(). + * + * @since 2.2.0 + * @deprecated 2.8.0 Use wp_unregister_widget_control() + * @see wp_unregister_widget_control() + * + * @param int|string $id Widget ID. + */ +function unregister_widget_control($id) { + _deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_widget_control()' ); + return wp_unregister_widget_control($id); +} + +/** + * Remove user meta data. + * + * @since 2.0.0 + * @deprecated 3.0.0 Use delete_user_meta() + * @see delete_user_meta() + * + * @param int $user_id User ID. + * @param string $meta_key Metadata key. + * @param mixed $meta_value Metadata value. + * @return bool True deletion completed and false if user_id is not a number. + */ +function delete_usermeta( $user_id, $meta_key, $meta_value = '' ) { + _deprecated_function( __FUNCTION__, '3.0.0', 'delete_user_meta()' ); + global $wpdb; + if ( !is_numeric( $user_id ) ) + return false; + $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key); + + if ( is_array($meta_value) || is_object($meta_value) ) + $meta_value = serialize($meta_value); + $meta_value = trim( $meta_value ); + + $cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); + + if ( $cur && $cur->umeta_id ) + do_action( 'delete_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); + + if ( ! empty($meta_value) ) + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s AND meta_value = %s", $user_id, $meta_key, $meta_value) ); + else + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); + + clean_user_cache( $user_id ); + wp_cache_delete( $user_id, 'user_meta' ); + + if ( $cur && $cur->umeta_id ) + do_action( 'deleted_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); + + return true; +} + +/** + * Retrieve user metadata. + * + * If $user_id is not a number, then the function will fail over with a 'false' + * boolean return value. Other returned values depend on whether there is only + * one item to be returned, which be that single item type. If there is more + * than one metadata value, then it will be list of metadata values. + * + * @since 2.0.0 + * @deprecated 3.0.0 Use get_user_meta() + * @see get_user_meta() + * + * @param int $user_id User ID + * @param string $meta_key Optional. Metadata key. + * @return mixed + */ +function get_usermeta( $user_id, $meta_key = '' ) { + _deprecated_function( __FUNCTION__, '3.0.0', 'get_user_meta()' ); + global $wpdb; + $user_id = (int) $user_id; + + if ( !$user_id ) + return false; + + if ( !empty($meta_key) ) { + $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key); + $user = wp_cache_get($user_id, 'users'); + // Check the cached user object. + if ( false !== $user && isset($user->$meta_key) ) + $metas = array($user->$meta_key); + else + $metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); + } else { + $metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d", $user_id) ); + } + + if ( empty($metas) ) { + if ( empty($meta_key) ) + return array(); + else + return ''; + } + + $metas = array_map('maybe_unserialize', $metas); + + if ( count($metas) == 1 ) + return $metas[0]; + else + return $metas; +} + +/** + * Update metadata of user. + * + * There is no need to serialize values, they will be serialized if it is + * needed. The metadata key can only be a string with underscores. All else will + * be removed. + * + * Will remove the metadata, if the meta value is empty. + * + * @since 2.0.0 + * @deprecated 3.0.0 Use update_user_meta() + * @see update_user_meta() + * + * @param int $user_id User ID + * @param string $meta_key Metadata key. + * @param mixed $meta_value Metadata value. + * @return bool True on successful update, false on failure. + */ +function update_usermeta( $user_id, $meta_key, $meta_value ) { + _deprecated_function( __FUNCTION__, '3.0.0', 'update_user_meta()' ); + global $wpdb; + if ( !is_numeric( $user_id ) ) + return false; + $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key); + + /** @todo Might need fix because usermeta data is assumed to be already escaped */ + if ( is_string($meta_value) ) + $meta_value = stripslashes($meta_value); + $meta_value = maybe_serialize($meta_value); + + if (empty($meta_value)) { + return delete_usermeta($user_id, $meta_key); + } + + $cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); + + if ( $cur ) + do_action( 'update_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); + + if ( !$cur ) + $wpdb->insert($wpdb->usermeta, compact('user_id', 'meta_key', 'meta_value') ); + elseif ( $cur->meta_value != $meta_value ) + $wpdb->update($wpdb->usermeta, compact('meta_value'), compact('user_id', 'meta_key') ); + else + return false; + + clean_user_cache( $user_id ); + wp_cache_delete( $user_id, 'user_meta' ); + + if ( !$cur ) + do_action( 'added_usermeta', $wpdb->insert_id, $user_id, $meta_key, $meta_value ); + else + do_action( 'updated_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); + + return true; +} + +/** + * Get users for the site. + * + * For setups that use the multisite feature. Can be used outside of the + * multisite feature. + * + * @since 2.2.0 + * @deprecated 3.1.0 Use get_users() + * @see get_users() + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $id Site ID. + * @return array List of users that are part of that site ID + */ +function get_users_of_blog( $id = '' ) { + _deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' ); + + global $wpdb; + if ( empty( $id ) ) { + $id = get_current_blog_id(); + } + $blog_prefix = $wpdb->get_blog_prefix($id); + $users = $wpdb->get_results( "SELECT user_id, user_id AS ID, user_login, display_name, user_email, meta_value FROM $wpdb->users, $wpdb->usermeta WHERE {$wpdb->users}.ID = {$wpdb->usermeta}.user_id AND meta_key = '{$blog_prefix}capabilities' ORDER BY {$wpdb->usermeta}.user_id" ); + return $users; +} + +/** + * Enable/disable automatic general feed link outputting. + * + * @since 2.8.0 + * @deprecated 3.0.0 Use add_theme_support() + * @see add_theme_support() + * + * @param bool $add Optional, default is true. Add or remove links. Defaults to true. + */ +function automatic_feed_links( $add = true ) { + _deprecated_function( __FUNCTION__, '3.0.0', "add_theme_support( 'automatic-feed-links' )" ); + + if ( $add ) + add_theme_support( 'automatic-feed-links' ); + else + remove_action( 'wp_head', 'feed_links_extra', 3 ); // Just do this yourself in 3.0+. +} + +/** + * Retrieve user data based on field. + * + * @since 1.5.0 + * @deprecated 3.0.0 Use get_the_author_meta() + * @see get_the_author_meta() + * + * @param string $field User meta field. + * @param false|int $user Optional. User ID to retrieve the field for. Default false (current user). + * @return string The author's field from the current author's DB object. + */ +function get_profile( $field, $user = false ) { + _deprecated_function( __FUNCTION__, '3.0.0', 'get_the_author_meta()' ); + if ( $user ) { + $user = get_user_by( 'login', $user ); + $user = $user->ID; + } + return get_the_author_meta( $field, $user ); +} + +/** + * Retrieves the number of posts a user has written. + * + * @since 0.71 + * @deprecated 3.0.0 Use count_user_posts() + * @see count_user_posts() + * + * @param int $userid User to count posts for. + * @return int Number of posts the given user has written. + */ +function get_usernumposts( $userid ) { + _deprecated_function( __FUNCTION__, '3.0.0', 'count_user_posts()' ); + return count_user_posts( $userid ); +} + +/** + * Callback used to change %uXXXX to &#YYY; syntax + * + * @since 2.8.0 + * @access private + * @deprecated 3.0.0 + * + * @param array $matches Single Match + * @return string An HTML entity + */ +function funky_javascript_callback($matches) { + return "&#".base_convert($matches[1],16,10).";"; +} + +/** + * Fixes JavaScript bugs in browsers. + * + * Converts unicode characters to HTML numbered entities. + * + * @since 1.5.0 + * @deprecated 3.0.0 + * + * @global $is_macIE + * @global $is_winIE + * + * @param string $text Text to be made safe. + * @return string Fixed text. + */ +function funky_javascript_fix($text) { + _deprecated_function( __FUNCTION__, '3.0.0' ); + // Fixes for browsers' JavaScript bugs. + global $is_macIE, $is_winIE; + + if ( $is_winIE || $is_macIE ) + $text = preg_replace_callback("/\%u([0-9A-F]{4,4})/", + "funky_javascript_callback", + $text); + + return $text; +} + +/** + * Checks that the taxonomy name exists. + * + * @since 2.3.0 + * @deprecated 3.0.0 Use taxonomy_exists() + * @see taxonomy_exists() + * + * @param string $taxonomy Name of taxonomy object + * @return bool Whether the taxonomy exists. + */ +function is_taxonomy( $taxonomy ) { + _deprecated_function( __FUNCTION__, '3.0.0', 'taxonomy_exists()' ); + return taxonomy_exists( $taxonomy ); +} + +/** + * Check if Term exists. + * + * @since 2.3.0 + * @deprecated 3.0.0 Use term_exists() + * @see term_exists() + * + * @param int|string $term The term to check + * @param string $taxonomy The taxonomy name to use + * @param int $parent ID of parent term under which to confine the exists search. + * @return mixed Get the term id or Term Object, if exists. + */ +function is_term( $term, $taxonomy = '', $parent = 0 ) { + _deprecated_function( __FUNCTION__, '3.0.0', 'term_exists()' ); + return term_exists( $term, $taxonomy, $parent ); +} + +/** + * Determines whether the current admin page is generated by a plugin. + * + * Use global $plugin_page and/or get_plugin_page_hookname() hooks. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 1.5.0 + * @deprecated 3.1.0 + * + * @global $plugin_page + * + * @return bool + */ +function is_plugin_page() { + _deprecated_function( __FUNCTION__, '3.1.0' ); + + global $plugin_page; + + if ( isset($plugin_page) ) + return true; + + return false; +} + +/** + * Update the categories cache. + * + * This function does not appear to be used anymore or does not appear to be + * needed. It might be a legacy function left over from when there was a need + * for updating the category cache. + * + * @since 1.5.0 + * @deprecated 3.1.0 + * + * @return bool Always return True + */ +function update_category_cache() { + _deprecated_function( __FUNCTION__, '3.1.0' ); + + return true; +} + +/** + * Check for PHP timezone support + * + * @since 2.9.0 + * @deprecated 3.2.0 + * + * @return bool + */ +function wp_timezone_supported() { + _deprecated_function( __FUNCTION__, '3.2.0' ); + + return true; +} + +/** + * Displays an editor: TinyMCE, HTML, or both. + * + * @since 2.1.0 + * @deprecated 3.3.0 Use wp_editor() + * @see wp_editor() + * + * @param string $content Textarea content. + * @param string $id Optional. HTML ID attribute value. Default 'content'. + * @param string $prev_id Optional. Unused. + * @param bool $media_buttons Optional. Whether to display media buttons. Default true. + * @param int $tab_index Optional. Unused. + * @param bool $extended Optional. Unused. + */ +function the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2, $extended = true) { + _deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' ); + + wp_editor( $content, $id, array( 'media_buttons' => $media_buttons ) ); +} + +/** + * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users + * + * @since 3.0.0 + * @deprecated 3.3.0 + * + * @param array $ids User ID numbers list. + * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays. + */ +function get_user_metavalues($ids) { + _deprecated_function( __FUNCTION__, '3.3.0' ); + + $objects = array(); + + $ids = array_map('intval', $ids); + foreach ( $ids as $id ) + $objects[$id] = array(); + + $metas = update_meta_cache('user', $ids); + + foreach ( $metas as $id => $meta ) { + foreach ( $meta as $key => $metavalues ) { + foreach ( $metavalues as $value ) { + $objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value); + } + } + } + + return $objects; +} + +/** + * Sanitize every user field. + * + * If the context is 'raw', then the user object or array will get minimal santization of the int fields. + * + * @since 2.3.0 + * @deprecated 3.3.0 + * + * @param object|array $user The User Object or Array + * @param string $context Optional, default is 'display'. How to sanitize user fields. + * @return object|array The now sanitized User Object or Array (will be the same type as $user) + */ +function sanitize_user_object($user, $context = 'display') { + _deprecated_function( __FUNCTION__, '3.3.0' ); + + if ( is_object($user) ) { + if ( !isset($user->ID) ) + $user->ID = 0; + if ( ! ( $user instanceof WP_User ) ) { + $vars = get_object_vars($user); + foreach ( array_keys($vars) as $field ) { + if ( is_string($user->$field) || is_numeric($user->$field) ) + $user->$field = sanitize_user_field($field, $user->$field, $user->ID, $context); + } + } + $user->filter = $context; + } else { + if ( !isset($user['ID']) ) + $user['ID'] = 0; + foreach ( array_keys($user) as $field ) + $user[$field] = sanitize_user_field($field, $user[$field], $user['ID'], $context); + $user['filter'] = $context; + } + + return $user; +} + +/** + * Get boundary post relational link. + * + * Can either be start or end post relational link. + * + * @since 2.8.0 + * @deprecated 3.3.0 + * + * @param string $title Optional. Link title format. + * @param bool $in_same_cat Optional. Whether link should be in a same category. + * @param string $excluded_categories Optional. Excluded categories IDs. + * @param bool $start Optional, default is true. Whether to display link to first or last post. + * @return string + */ +function get_boundary_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '', $start = true) { + _deprecated_function( __FUNCTION__, '3.3.0' ); + + $posts = get_boundary_post($in_same_cat, $excluded_categories, $start); + // If there is no post, stop. + if ( empty($posts) ) + return; + + // Even though we limited get_posts() to return only 1 item it still returns an array of objects. + $post = $posts[0]; + + if ( empty($post->post_title) ) + $post->post_title = $start ? __('First Post') : __('Last Post'); + + $date = mysql2date(get_option('date_format'), $post->post_date); + + $title = str_replace('%title', $post->post_title, $title); + $title = str_replace('%date', $date, $title); + $title = apply_filters('the_title', $title, $post->ID); + + $link = $start ? "\n"; + + $boundary = $start ? 'start' : 'end'; + return apply_filters( "{$boundary}_post_rel_link", $link ); +} + +/** + * Display relational link for the first post. + * + * @since 2.8.0 + * @deprecated 3.3.0 + * + * @param string $title Optional. Link title format. + * @param bool $in_same_cat Optional. Whether link should be in a same category. + * @param string $excluded_categories Optional. Excluded categories IDs. + */ +function start_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '') { + _deprecated_function( __FUNCTION__, '3.3.0' ); + + echo get_boundary_post_rel_link($title, $in_same_cat, $excluded_categories, true); +} + +/** + * Get site index relational link. + * + * @since 2.8.0 + * @deprecated 3.3.0 + * + * @return string + */ +function get_index_rel_link() { + _deprecated_function( __FUNCTION__, '3.3.0' ); + + $link = "\n"; + return apply_filters( "index_rel_link", $link ); +} + +/** + * Display relational link for the site index. + * + * @since 2.8.0 + * @deprecated 3.3.0 + */ +function index_rel_link() { + _deprecated_function( __FUNCTION__, '3.3.0' ); + + echo get_index_rel_link(); +} + +/** + * Get parent post relational link. + * + * @since 2.8.0 + * @deprecated 3.3.0 + * + * @param string $title Optional. Link title format. Default '%title'. + * @return string + */ +function get_parent_post_rel_link( $title = '%title' ) { + _deprecated_function( __FUNCTION__, '3.3.0' ); + + if ( ! empty( $GLOBALS['post'] ) && ! empty( $GLOBALS['post']->post_parent ) ) + $post = get_post($GLOBALS['post']->post_parent); + + if ( empty($post) ) + return; + + $date = mysql2date(get_option('date_format'), $post->post_date); + + $title = str_replace('%title', $post->post_title, $title); + $title = str_replace('%date', $date, $title); + $title = apply_filters('the_title', $title, $post->ID); + + $link = "\n"; + + return apply_filters( "parent_post_rel_link", $link ); +} + +/** + * Display relational link for parent item + * + * @since 2.8.0 + * @deprecated 3.3.0 + * + * @param string $title Optional. Link title format. Default '%title'. + */ +function parent_post_rel_link( $title = '%title' ) { + _deprecated_function( __FUNCTION__, '3.3.0' ); + + echo get_parent_post_rel_link($title); +} + +/** + * Add the "Dashboard"/"Visit Site" menu. + * + * @since 3.2.0 + * @deprecated 3.3.0 + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance. + */ +function wp_admin_bar_dashboard_view_site_menu( $wp_admin_bar ) { + _deprecated_function( __FUNCTION__, '3.3.0' ); + + $user_id = get_current_user_id(); + + if ( 0 != $user_id ) { + if ( is_admin() ) + $wp_admin_bar->add_menu( array( 'id' => 'view-site', 'title' => __( 'Visit Site' ), 'href' => home_url() ) ); + elseif ( is_multisite() ) + $wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => get_dashboard_url( $user_id ) ) ); + else + $wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => admin_url() ) ); + } +} + +/** + * Checks if the current user belong to a given site. + * + * @since MU (3.0.0) + * @deprecated 3.3.0 Use is_user_member_of_blog() + * @see is_user_member_of_blog() + * + * @param int $blog_id Site ID + * @return bool True if the current users belong to $blog_id, false if not. + */ +function is_blog_user( $blog_id = 0 ) { + _deprecated_function( __FUNCTION__, '3.3.0', 'is_user_member_of_blog()' ); + + return is_user_member_of_blog( get_current_user_id(), $blog_id ); +} + +/** + * Open the file handle for debugging. + * + * @since 0.71 + * @deprecated 3.4.0 Use error_log() + * @see error_log() + * + * @link https://www.php.net/manual/en/function.error-log.php + * + * @param string $filename File name. + * @param string $mode Type of access you required to the stream. + * @return false Always false. + */ +function debug_fopen( $filename, $mode ) { + _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' ); + return false; +} + +/** + * Write contents to the file used for debugging. + * + * @since 0.71 + * @deprecated 3.4.0 Use error_log() + * @see error_log() + * + * @link https://www.php.net/manual/en/function.error-log.php + * + * @param mixed $fp Unused. + * @param string $string Message to log. + */ +function debug_fwrite( $fp, $string ) { + _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' ); + if ( ! empty( $GLOBALS['debug'] ) ) + error_log( $string ); +} + +/** + * Close the debugging file handle. + * + * @since 0.71 + * @deprecated 3.4.0 Use error_log() + * @see error_log() + * + * @link https://www.php.net/manual/en/function.error-log.php + * + * @param mixed $fp Unused. + */ +function debug_fclose( $fp ) { + _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' ); +} + +/** + * Retrieve list of themes with theme data in theme directory. + * + * The theme is broken, if it doesn't have a parent theme and is missing either + * style.css and, or index.php. If the theme has a parent theme then it is + * broken, if it is missing style.css; index.php is optional. + * + * @since 1.5.0 + * @deprecated 3.4.0 Use wp_get_themes() + * @see wp_get_themes() + * + * @return array Theme list with theme data. + */ +function get_themes() { + _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_themes()' ); + + global $wp_themes; + if ( isset( $wp_themes ) ) + return $wp_themes; + + $themes = wp_get_themes(); + $wp_themes = array(); + + foreach ( $themes as $theme ) { + $name = $theme->get('Name'); + if ( isset( $wp_themes[ $name ] ) ) + $wp_themes[ $name . '/' . $theme->get_stylesheet() ] = $theme; + else + $wp_themes[ $name ] = $theme; + } + + return $wp_themes; +} + +/** + * Retrieve theme data. + * + * @since 1.5.0 + * @deprecated 3.4.0 Use wp_get_theme() + * @see wp_get_theme() + * + * @param string $theme Theme name. + * @return array|null Null, if theme name does not exist. Theme data, if exists. + */ +function get_theme( $theme ) { + _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme( $stylesheet )' ); + + $themes = get_themes(); + if ( is_array( $themes ) && array_key_exists( $theme, $themes ) ) + return $themes[ $theme ]; + return null; +} + +/** + * Retrieve current theme name. + * + * @since 1.5.0 + * @deprecated 3.4.0 Use wp_get_theme() + * @see wp_get_theme() + * + * @return string + */ +function get_current_theme() { + _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' ); + + if ( $theme = get_option( 'current_theme' ) ) + return $theme; + + return wp_get_theme()->get('Name'); +} + +/** + * Accepts matches array from preg_replace_callback in wpautop() or a string. + * + * Ensures that the contents of a `
                ...
                ` HTML block are not + * converted into paragraphs or line-breaks. + * + * @since 1.2.0 + * @deprecated 3.4.0 + * + * @param array|string $matches The array or string + * @return string The pre block without paragraph/line-break conversion. + */ +function clean_pre($matches) { + _deprecated_function( __FUNCTION__, '3.4.0' ); + + if ( is_array($matches) ) + $text = $matches[1] . $matches[2] . ""; + else + $text = $matches; + + $text = str_replace(array('
                ', '
                ', '
                '), array('', '', ''), $text); + $text = str_replace('

                ', "\n", $text); + $text = str_replace('

                ', '', $text); + + return $text; +} + + +/** + * Add callbacks for image header display. + * + * @since 2.1.0 + * @deprecated 3.4.0 Use add_theme_support() + * @see add_theme_support() + * + * @param callable $wp_head_callback Call on the {@see 'wp_head'} action. + * @param callable $admin_head_callback Call on custom header administration screen. + * @param callable $admin_preview_callback Output a custom header image div on the custom header administration screen. Optional. + */ +function add_custom_image_header( $wp_head_callback, $admin_head_callback, $admin_preview_callback = '' ) { + _deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-header\', $args )' ); + $args = array( + 'wp-head-callback' => $wp_head_callback, + 'admin-head-callback' => $admin_head_callback, + ); + if ( $admin_preview_callback ) + $args['admin-preview-callback'] = $admin_preview_callback; + return add_theme_support( 'custom-header', $args ); +} + +/** + * Remove image header support. + * + * @since 3.1.0 + * @deprecated 3.4.0 Use remove_theme_support() + * @see remove_theme_support() + * + * @return null|bool Whether support was removed. + */ +function remove_custom_image_header() { + _deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-header\' )' ); + return remove_theme_support( 'custom-header' ); +} + +/** + * Add callbacks for background image display. + * + * @since 3.0.0 + * @deprecated 3.4.0 Use add_theme_support() + * @see add_theme_support() + * + * @param callable $wp_head_callback Call on the {@see 'wp_head'} action. + * @param callable $admin_head_callback Call on custom background administration screen. + * @param callable $admin_preview_callback Output a custom background image div on the custom background administration screen. Optional. + */ +function add_custom_background( $wp_head_callback = '', $admin_head_callback = '', $admin_preview_callback = '' ) { + _deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-background\', $args )' ); + $args = array(); + if ( $wp_head_callback ) + $args['wp-head-callback'] = $wp_head_callback; + if ( $admin_head_callback ) + $args['admin-head-callback'] = $admin_head_callback; + if ( $admin_preview_callback ) + $args['admin-preview-callback'] = $admin_preview_callback; + return add_theme_support( 'custom-background', $args ); +} + +/** + * Remove custom background support. + * + * @since 3.1.0 + * @deprecated 3.4.0 Use add_custom_background() + * @see add_custom_background() + * + * @return null|bool Whether support was removed. + */ +function remove_custom_background() { + _deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-background\' )' ); + return remove_theme_support( 'custom-background' ); +} + +/** + * Retrieve theme data from parsed theme file. + * + * @since 1.5.0 + * @deprecated 3.4.0 Use wp_get_theme() + * @see wp_get_theme() + * + * @param string $theme_file Theme file path. + * @return array Theme data. + */ +function get_theme_data( $theme_file ) { + _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' ); + $theme = new WP_Theme( wp_basename( dirname( $theme_file ) ), dirname( dirname( $theme_file ) ) ); + + $theme_data = array( + 'Name' => $theme->get('Name'), + 'URI' => $theme->display('ThemeURI', true, false), + 'Description' => $theme->display('Description', true, false), + 'Author' => $theme->display('Author', true, false), + 'AuthorURI' => $theme->display('AuthorURI', true, false), + 'Version' => $theme->get('Version'), + 'Template' => $theme->get('Template'), + 'Status' => $theme->get('Status'), + 'Tags' => $theme->get('Tags'), + 'Title' => $theme->get('Name'), + 'AuthorName' => $theme->get('Author'), + ); + + foreach ( apply_filters( 'extra_theme_headers', array() ) as $extra_header ) { + if ( ! isset( $theme_data[ $extra_header ] ) ) + $theme_data[ $extra_header ] = $theme->get( $extra_header ); + } + + return $theme_data; +} + +/** + * Alias of update_post_cache(). + * + * @see update_post_cache() Posts and pages are the same, alias is intentional + * + * @since 1.5.1 + * @deprecated 3.4.0 Use update_post_cache() + * @see update_post_cache() + * + * @param array $pages list of page objects + */ +function update_page_cache( &$pages ) { + _deprecated_function( __FUNCTION__, '3.4.0', 'update_post_cache()' ); + + update_post_cache( $pages ); +} + +/** + * Will clean the page in the cache. + * + * Clean (read: delete) page from cache that matches $id. Will also clean cache + * associated with 'all_page_ids' and 'get_pages'. + * + * @since 2.0.0 + * @deprecated 3.4.0 Use clean_post_cache + * @see clean_post_cache() + * + * @param int $id Page ID to clean + */ +function clean_page_cache( $id ) { + _deprecated_function( __FUNCTION__, '3.4.0', 'clean_post_cache()' ); + + clean_post_cache( $id ); +} + +/** + * Retrieve nonce action "Are you sure" message. + * + * Deprecated in 3.4.1 and 3.5.0. Backported to 3.3.3. + * + * @since 2.0.4 + * @deprecated 3.4.1 Use wp_nonce_ays() + * @see wp_nonce_ays() + * + * @param string $action Nonce action. + * @return string Are you sure message. + */ +function wp_explain_nonce( $action ) { + _deprecated_function( __FUNCTION__, '3.4.1', 'wp_nonce_ays()' ); + return __( 'Are you sure you want to do this?' ); +} + +/** + * Display "sticky" CSS class, if a post is sticky. + * + * @since 2.7.0 + * @deprecated 3.5.0 Use post_class() + * @see post_class() + * + * @param int $post_id An optional post ID. + */ +function sticky_class( $post_id = null ) { + _deprecated_function( __FUNCTION__, '3.5.0', 'post_class()' ); + if ( is_sticky( $post_id ) ) + echo ' sticky'; +} + +/** + * Retrieve post ancestors. + * + * This is no longer needed as WP_Post lazy-loads the ancestors + * property with get_post_ancestors(). + * + * @since 2.3.4 + * @deprecated 3.5.0 Use get_post_ancestors() + * @see get_post_ancestors() + * + * @param WP_Post $post Post object, passed by reference (unused). + */ +function _get_post_ancestors( &$post ) { + _deprecated_function( __FUNCTION__, '3.5.0' ); +} + +/** + * Load an image from a string, if PHP supports it. + * + * @since 2.1.0 + * @deprecated 3.5.0 Use wp_get_image_editor() + * @see wp_get_image_editor() + * + * @param string $file Filename of the image to load. + * @return resource The resulting image resource on success, Error string on failure. + */ +function wp_load_image( $file ) { + _deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' ); + + if ( is_numeric( $file ) ) + $file = get_attached_file( $file ); + + if ( ! is_file( $file ) ) { + /* translators: %s: File name. */ + return sprintf( __( 'File “%s” doesn’t exist?' ), $file ); + } + + if ( ! function_exists('imagecreatefromstring') ) + return __('The GD image library is not installed.'); + + // Set artificially high because GD uses uncompressed images in memory. + wp_raise_memory_limit( 'image' ); + + $image = imagecreatefromstring( file_get_contents( $file ) ); + + if ( ! is_resource( $image ) ) { + /* translators: %s: File name. */ + return sprintf( __( 'File “%s” is not an image.' ), $file ); + } + + return $image; +} + +/** + * Scale down an image to fit a particular size and save a new copy of the image. + * + * The PNG transparency will be preserved using the function, as well as the + * image type. If the file going in is PNG, then the resized image is going to + * be PNG. The only supported image types are PNG, GIF, and JPEG. + * + * Some functionality requires API to exist, so some PHP version may lose out + * support. This is not the fault of WordPress (where functionality is + * downgraded, not actual defects), but of your PHP version. + * + * @since 2.5.0 + * @deprecated 3.5.0 Use wp_get_image_editor() + * @see wp_get_image_editor() + * + * @param string $file Image file path. + * @param int $max_w Maximum width to resize to. + * @param int $max_h Maximum height to resize to. + * @param bool $crop Optional. Whether to crop image or resize. + * @param string $suffix Optional. File suffix. + * @param string $dest_path Optional. New image file path. + * @param int $jpeg_quality Optional, default is 90. Image quality percentage. + * @return mixed WP_Error on failure. String with new destination path. + */ +function image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 ) { + _deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' ); + + $editor = wp_get_image_editor( $file ); + if ( is_wp_error( $editor ) ) + return $editor; + $editor->set_quality( $jpeg_quality ); + + $resized = $editor->resize( $max_w, $max_h, $crop ); + if ( is_wp_error( $resized ) ) + return $resized; + + $dest_file = $editor->generate_filename( $suffix, $dest_path ); + $saved = $editor->save( $dest_file ); + + if ( is_wp_error( $saved ) ) + return $saved; + + return $dest_file; +} + +/** + * Retrieve a single post, based on post ID. + * + * Has categories in 'post_category' property or key. Has tags in 'tags_input' + * property or key. + * + * @since 1.0.0 + * @deprecated 3.5.0 Use get_post() + * @see get_post() + * + * @param int $postid Post ID. + * @param string $mode How to return result, either OBJECT, ARRAY_N, or ARRAY_A. + * @return WP_Post|null Post object or array holding post contents and information + */ +function wp_get_single_post( $postid = 0, $mode = OBJECT ) { + _deprecated_function( __FUNCTION__, '3.5.0', 'get_post()' ); + return get_post( $postid, $mode ); +} + +/** + * Check that the user login name and password is correct. + * + * @since 0.71 + * @deprecated 3.5.0 Use wp_authenticate() + * @see wp_authenticate() + * + * @param string $user_login User name. + * @param string $user_pass User password. + * @return bool False if does not authenticate, true if username and password authenticates. + */ +function user_pass_ok($user_login, $user_pass) { + _deprecated_function( __FUNCTION__, '3.5.0', 'wp_authenticate()' ); + $user = wp_authenticate( $user_login, $user_pass ); + if ( is_wp_error( $user ) ) + return false; + + return true; +} + +/** + * Callback formerly fired on the save_post hook. No longer needed. + * + * @since 2.3.0 + * @deprecated 3.5.0 + */ +function _save_post_hook() {} + +/** + * Check if the installed version of GD supports particular image type + * + * @since 2.9.0 + * @deprecated 3.5.0 Use wp_image_editor_supports() + * @see wp_image_editor_supports() + * + * @param string $mime_type + * @return bool + */ +function gd_edit_image_support($mime_type) { + _deprecated_function( __FUNCTION__, '3.5.0', 'wp_image_editor_supports()' ); + + if ( function_exists('imagetypes') ) { + switch( $mime_type ) { + case 'image/jpeg': + return (imagetypes() & IMG_JPG) != 0; + case 'image/png': + return (imagetypes() & IMG_PNG) != 0; + case 'image/gif': + return (imagetypes() & IMG_GIF) != 0; + } + } else { + switch( $mime_type ) { + case 'image/jpeg': + return function_exists('imagecreatefromjpeg'); + case 'image/png': + return function_exists('imagecreatefrompng'); + case 'image/gif': + return function_exists('imagecreatefromgif'); + } + } + return false; +} + +/** + * Converts an integer byte value to a shorthand byte value. + * + * @since 2.3.0 + * @deprecated 3.6.0 Use size_format() + * @see size_format() + * + * @param int $bytes An integer byte value. + * @return string A shorthand byte value. + */ +function wp_convert_bytes_to_hr( $bytes ) { + _deprecated_function( __FUNCTION__, '3.6.0', 'size_format()' ); + + $units = array( 0 => 'B', 1 => 'KB', 2 => 'MB', 3 => 'GB', 4 => 'TB' ); + $log = log( $bytes, KB_IN_BYTES ); + $power = (int) $log; + $size = KB_IN_BYTES ** ( $log - $power ); + + if ( ! is_nan( $size ) && array_key_exists( $power, $units ) ) { + $unit = $units[ $power ]; + } else { + $size = $bytes; + $unit = $units[0]; + } + + return $size . $unit; +} + +/** + * Formerly used internally to tidy up the search terms. + * + * @since 2.9.0 + * @access private + * @deprecated 3.7.0 + * + * @param string $t Search terms to "tidy", e.g. trim. + * @return string Trimmed search terms. + */ +function _search_terms_tidy( $t ) { + _deprecated_function( __FUNCTION__, '3.7.0' ); + return trim( $t, "\"'\n\r " ); +} + +/** + * Determine if TinyMCE is available. + * + * Checks to see if the user has deleted the tinymce files to slim down + * their WordPress installation. + * + * @since 2.1.0 + * @deprecated 3.9.0 + * + * @return bool Whether TinyMCE exists. + */ +function rich_edit_exists() { + global $wp_rich_edit_exists; + _deprecated_function( __FUNCTION__, '3.9.0' ); + + if ( ! isset( $wp_rich_edit_exists ) ) + $wp_rich_edit_exists = file_exists( ABSPATH . WPINC . '/js/tinymce/tinymce.js' ); + + return $wp_rich_edit_exists; +} + +/** + * Old callback for tag link tooltips. + * + * @since 2.7.0 + * @access private + * @deprecated 3.9.0 + * + * @param int $count Number of topics. + * @return int Number of topics. + */ +function default_topic_count_text( $count ) { + return $count; +} + +/** + * Formerly used to escape strings before inserting into the DB. + * + * Has not performed this function for many, many years. Use wpdb::prepare() instead. + * + * @since 0.71 + * @deprecated 3.9.0 + * + * @param string $content The text to format. + * @return string The very same text. + */ +function format_to_post( $content ) { + _deprecated_function( __FUNCTION__, '3.9.0' ); + return $content; +} + +/** + * Formerly used to escape strings before searching the DB. It was poorly documented and never worked as described. + * + * @since 2.5.0 + * @deprecated 4.0.0 Use wpdb::esc_like() + * @see wpdb::esc_like() + * + * @param string $text The text to be escaped. + * @return string text, safe for inclusion in LIKE query. + */ +function like_escape($text) { + _deprecated_function( __FUNCTION__, '4.0.0', 'wpdb::esc_like()' ); + return str_replace( array( "%", "_" ), array( "\\%", "\\_" ), $text ); +} + +/** + * Determines if the URL can be accessed over SSL. + * + * Determines if the URL can be accessed over SSL by using the WordPress HTTP API to access + * the URL using https as the scheme. + * + * @since 2.5.0 + * @deprecated 4.0.0 + * + * @param string $url The URL to test. + * @return bool Whether SSL access is available. + */ +function url_is_accessable_via_ssl( $url ) { + _deprecated_function( __FUNCTION__, '4.0.0' ); + + $response = wp_remote_get( set_url_scheme( $url, 'https' ) ); + + if ( !is_wp_error( $response ) ) { + $status = wp_remote_retrieve_response_code( $response ); + if ( 200 == $status || 401 == $status ) { + return true; + } + } + + return false; +} + +/** + * Start preview theme output buffer. + * + * Will only perform task if the user has permissions and template and preview + * query variables exist. + * + * @since 2.6.0 + * @deprecated 4.3.0 + */ +function preview_theme() { + _deprecated_function( __FUNCTION__, '4.3.0' ); +} + +/** + * Private function to modify the current template when previewing a theme + * + * @since 2.9.0 + * @deprecated 4.3.0 + * @access private + * + * @return string + */ +function _preview_theme_template_filter() { + _deprecated_function( __FUNCTION__, '4.3.0' ); + return ''; +} + +/** + * Private function to modify the current stylesheet when previewing a theme + * + * @since 2.9.0 + * @deprecated 4.3.0 + * @access private + * + * @return string + */ +function _preview_theme_stylesheet_filter() { + _deprecated_function( __FUNCTION__, '4.3.0' ); + return ''; +} + +/** + * Callback function for ob_start() to capture all links in the theme. + * + * @since 2.6.0 + * @deprecated 4.3.0 + * @access private + * + * @param string $content + * @return string + */ +function preview_theme_ob_filter( $content ) { + _deprecated_function( __FUNCTION__, '4.3.0' ); + return $content; +} + +/** + * Manipulates preview theme links in order to control and maintain location. + * + * Callback function for preg_replace_callback() to accept and filter matches. + * + * @since 2.6.0 + * @deprecated 4.3.0 + * @access private + * + * @param array $matches + * @return string + */ +function preview_theme_ob_filter_callback( $matches ) { + _deprecated_function( __FUNCTION__, '4.3.0' ); + return ''; +} + +/** + * Formats text for the rich text editor. + * + * The {@see 'richedit_pre'} filter is applied here. If $text is empty the filter will + * be applied to an empty string. + * + * @since 2.0.0 + * @deprecated 4.3.0 Use format_for_editor() + * @see format_for_editor() + * + * @param string $text The text to be formatted. + * @return string The formatted text after filter is applied. + */ +function wp_richedit_pre($text) { + _deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' ); + + if ( empty( $text ) ) { + /** + * Filters text returned for the rich text editor. + * + * This filter is first evaluated, and the value returned, if an empty string + * is passed to wp_richedit_pre(). If an empty string is passed, it results + * in a break tag and line feed. + * + * If a non-empty string is passed, the filter is evaluated on the wp_richedit_pre() + * return after being formatted. + * + * @since 2.0.0 + * @deprecated 4.3.0 + * + * @param string $output Text for the rich text editor. + */ + return apply_filters( 'richedit_pre', '' ); + } + + $output = convert_chars($text); + $output = wpautop($output); + $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); + + /** This filter is documented in wp-includes/deprecated.php */ + return apply_filters( 'richedit_pre', $output ); +} + +/** + * Formats text for the HTML editor. + * + * Unless $output is empty it will pass through htmlspecialchars before the + * {@see 'htmledit_pre'} filter is applied. + * + * @since 2.5.0 + * @deprecated 4.3.0 Use format_for_editor() + * @see format_for_editor() + * + * @param string $output The text to be formatted. + * @return string Formatted text after filter applied. + */ +function wp_htmledit_pre($output) { + _deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' ); + + if ( !empty($output) ) + $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); // Convert only '< > &'. + + /** + * Filters the text before it is formatted for the HTML editor. + * + * @since 2.5.0 + * @deprecated 4.3.0 + * + * @param string $output The HTML-formatted text. + */ + return apply_filters( 'htmledit_pre', $output ); +} + +/** + * Retrieve permalink from post ID. + * + * @since 1.0.0 + * @deprecated 4.4.0 Use get_permalink() + * @see get_permalink() + * + * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post. + * @return string|false + */ +function post_permalink( $post_id = 0 ) { + _deprecated_function( __FUNCTION__, '4.4.0', 'get_permalink()' ); + + return get_permalink( $post_id ); +} + +/** + * Perform a HTTP HEAD or GET request. + * + * If $file_path is a writable filename, this will do a GET request and write + * the file to that path. + * + * @since 2.5.0 + * @deprecated 4.4.0 Use WP_Http + * @see WP_Http + * + * @param string $url URL to fetch. + * @param string|bool $file_path Optional. File path to write request to. Default false. + * @param int $red Optional. The number of Redirects followed, Upon 5 being hit, + * returns false. Default 1. + * @return bool|string False on failure and string of headers if HEAD request. + */ +function wp_get_http( $url, $file_path = false, $red = 1 ) { + _deprecated_function( __FUNCTION__, '4.4.0', 'WP_Http' ); + + @set_time_limit( 60 ); + + if ( $red > 5 ) + return false; + + $options = array(); + $options['redirection'] = 5; + + if ( false == $file_path ) + $options['method'] = 'HEAD'; + else + $options['method'] = 'GET'; + + $response = wp_safe_remote_request( $url, $options ); + + if ( is_wp_error( $response ) ) + return false; + + $headers = wp_remote_retrieve_headers( $response ); + $headers['response'] = wp_remote_retrieve_response_code( $response ); + + // WP_HTTP no longer follows redirects for HEAD requests. + if ( 'HEAD' == $options['method'] && in_array($headers['response'], array(301, 302)) && isset( $headers['location'] ) ) { + return wp_get_http( $headers['location'], $file_path, ++$red ); + } + + if ( false == $file_path ) + return $headers; + + // GET request - write it to the supplied filename. + $out_fp = fopen($file_path, 'w'); + if ( !$out_fp ) + return $headers; + + fwrite( $out_fp, wp_remote_retrieve_body( $response ) ); + fclose($out_fp); + clearstatcache(); + + return $headers; +} + +/** + * Whether SSL login should be forced. + * + * @since 2.6.0 + * @deprecated 4.4.0 Use force_ssl_admin() + * @see force_ssl_admin() + * + * @param string|bool $force Optional Whether to force SSL login. Default null. + * @return bool True if forced, false if not forced. + */ +function force_ssl_login( $force = null ) { + _deprecated_function( __FUNCTION__, '4.4.0', 'force_ssl_admin()' ); + return force_ssl_admin( $force ); +} + +/** + * Retrieve path of comment popup template in current or parent template. + * + * @since 1.5.0 + * @deprecated 4.5.0 + * + * @return string Full path to comments popup template file. + */ +function get_comments_popup_template() { + _deprecated_function( __FUNCTION__, '4.5.0' ); + + return ''; +} + +/** + * Determines whether the current URL is within the comments popup window. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 1.5.0 + * @deprecated 4.5.0 + * + * @return bool + */ +function is_comments_popup() { + _deprecated_function( __FUNCTION__, '4.5.0' ); + + return false; +} + +/** + * Display the JS popup script to show a comment. + * + * @since 0.71 + * @deprecated 4.5.0 + */ +function comments_popup_script() { + _deprecated_function( __FUNCTION__, '4.5.0' ); +} + +/** + * Adds element attributes to open links in new tabs. + * + * @since 0.71 + * @deprecated 4.5.0 + * + * @param string $text Content to replace links to open in a new tab. + * @return string Content that has filtered links. + */ +function popuplinks( $text ) { + _deprecated_function( __FUNCTION__, '4.5.0' ); + $text = preg_replace('//i', "", $text); + return $text; +} + +/** + * The Google Video embed handler callback. + * + * Deprecated function that previously assisted in turning Google Video URLs + * into embeds but that service has since been shut down. + * + * @since 2.9.0 + * @deprecated 4.6.0 + * + * @return string An empty string. + */ +function wp_embed_handler_googlevideo( $matches, $attr, $url, $rawattr ) { + _deprecated_function( __FUNCTION__, '4.6.0' ); + + return ''; +} + +/** + * Retrieve path of paged template in current or parent template. + * + * @since 1.5.0 + * @deprecated 4.7.0 The paged.php template is no longer part of the theme template hierarchy. + * + * @return string Full path to paged template file. + */ +function get_paged_template() { + _deprecated_function( __FUNCTION__, '4.7.0' ); + + return get_query_template( 'paged' ); +} + +/** + * Removes the HTML JavaScript entities found in early versions of Netscape 4. + * + * Previously, this function was pulled in from the original + * import of kses and removed a specific vulnerability only + * existent in early version of Netscape 4. However, this + * vulnerability never affected any other browsers and can + * be considered safe for the modern web. + * + * The regular expression which sanitized this vulnerability + * has been removed in consideration of the performance and + * energy demands it placed, now merely passing through its + * input to the return. + * + * @since 1.0.0 + * @deprecated 4.7.0 Officially dropped security support for Netscape 4. + * + * @param string $string + * @return string + */ +function wp_kses_js_entities( $string ) { + _deprecated_function( __FUNCTION__, '4.7.0' ); + + return preg_replace( '%&\s*\{[^}]*(\}\s*;?|$)%', '', $string ); +} + +/** + * Sort categories by ID. + * + * Used by usort() as a callback, should not be used directly. Can actually be + * used to sort any term object. + * + * @since 2.3.0 + * @deprecated 4.7.0 Use wp_list_sort() + * @access private + * + * @param object $a + * @param object $b + * @return int + */ +function _usort_terms_by_ID( $a, $b ) { + _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' ); + + if ( $a->term_id > $b->term_id ) + return 1; + elseif ( $a->term_id < $b->term_id ) + return -1; + else + return 0; +} + +/** + * Sort categories by name. + * + * Used by usort() as a callback, should not be used directly. Can actually be + * used to sort any term object. + * + * @since 2.3.0 + * @deprecated 4.7.0 Use wp_list_sort() + * @access private + * + * @param object $a + * @param object $b + * @return int + */ +function _usort_terms_by_name( $a, $b ) { + _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' ); + + return strcmp( $a->name, $b->name ); +} + +/** + * Sort menu items by the desired key. + * + * @since 3.0.0 + * @deprecated 4.7.0 Use wp_list_sort() + * @access private + * + * @global string $_menu_item_sort_prop + * + * @param object $a The first object to compare + * @param object $b The second object to compare + * @return int -1, 0, or 1 if $a is considered to be respectively less than, equal to, or greater than $b. + */ +function _sort_nav_menu_items( $a, $b ) { + global $_menu_item_sort_prop; + + _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' ); + + if ( empty( $_menu_item_sort_prop ) ) + return 0; + + if ( ! isset( $a->$_menu_item_sort_prop ) || ! isset( $b->$_menu_item_sort_prop ) ) + return 0; + + $_a = (int) $a->$_menu_item_sort_prop; + $_b = (int) $b->$_menu_item_sort_prop; + + if ( $a->$_menu_item_sort_prop == $b->$_menu_item_sort_prop ) + return 0; + elseif ( $_a == $a->$_menu_item_sort_prop && $_b == $b->$_menu_item_sort_prop ) + return $_a < $_b ? -1 : 1; + else + return strcmp( $a->$_menu_item_sort_prop, $b->$_menu_item_sort_prop ); +} + +/** + * Retrieves the Press This bookmarklet link. + * + * @since 2.6.0 + * @deprecated 4.9.0 + * + */ +function get_shortcut_link() { + _deprecated_function( __FUNCTION__, '4.9.0' ); + + $link = ''; + + /** + * Filters the Press This bookmarklet link. + * + * @since 2.6.0 + * @deprecated 4.9.0 + * + * @param string $link The Press This bookmarklet link. + */ + return apply_filters( 'shortcut_link', $link ); +} + +/** +* Ajax handler for saving a post from Press This. +* +* @since 4.2.0 +* @deprecated 4.9.0 +*/ +function wp_ajax_press_this_save_post() { + _deprecated_function( __FUNCTION__, '4.9.0' ); + if ( is_plugin_active( 'press-this/press-this-plugin.php' ) ) { + include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php'; + $wp_press_this = new WP_Press_This_Plugin(); + $wp_press_this->save_post(); + } else { + wp_send_json_error( array( 'errorMessage' => __( 'The Press This plugin is required.' ) ) ); + } +} + +/** +* Ajax handler for creating new category from Press This. +* +* @since 4.2.0 +* @deprecated 4.9.0 +*/ +function wp_ajax_press_this_add_category() { + _deprecated_function( __FUNCTION__, '4.9.0' ); + if ( is_plugin_active( 'press-this/press-this-plugin.php' ) ) { + include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php'; + $wp_press_this = new WP_Press_This_Plugin(); + $wp_press_this->add_category(); + } else { + wp_send_json_error( array( 'errorMessage' => __( 'The Press This plugin is required.' ) ) ); + } +} + +/** + * Return the user request object for the specified request ID. + * + * @since 4.9.6 + * @deprecated 5.4.0 Use wp_get_user_request() + * @see wp_get_user_request() + * + * @param int $request_id The ID of the user request. + * @return WP_User_Request|false + */ +function wp_get_user_request_data( $request_id ) { + _deprecated_function( __FUNCTION__, '5.4.0', 'wp_get_user_request()' ); + return wp_get_user_request( $request_id ); +} \ No newline at end of file diff --git a/wp-includes/embed-template.php b/wp-includes/embed-template.php new file mode 100644 index 0000000..88b94bf --- /dev/null +++ b/wp-includes/embed-template.php @@ -0,0 +1,13 @@ +register_handler( $id, $regex, $callback, $priority ); +} + +/** + * Unregisters a previously-registered embed handler. + * + * @since 2.9.0 + * + * @global WP_Embed $wp_embed + * + * @param string $id The handler ID that should be removed. + * @param int $priority Optional. The priority of the handler to be removed. Default 10. + */ +function wp_embed_unregister_handler( $id, $priority = 10 ) { + global $wp_embed; + $wp_embed->unregister_handler( $id, $priority ); +} + +/** + * Creates default array of embed parameters. + * + * The width defaults to the content width as specified by the theme. If the + * theme does not specify a content width, then 500px is used. + * + * The default height is 1.5 times the width, or 1000px, whichever is smaller. + * + * The {@see 'embed_defaults'} filter can be used to adjust either of these values. + * + * @since 2.9.0 + * + * @global int $content_width + * + * @param string $url Optional. The URL that should be embedded. Default empty. + * + * @return array { + * Indexed array of the embed width and height in pixels. + * + * @type int $0 The embed width. + * @type int $1 The embed height. + * } + */ +function wp_embed_defaults( $url = '' ) { + if ( ! empty( $GLOBALS['content_width'] ) ) { + $width = (int) $GLOBALS['content_width']; + } + + if ( empty( $width ) ) { + $width = 500; + } + + $height = min( ceil( $width * 1.5 ), 1000 ); + + /** + * Filters the default array of embed dimensions. + * + * @since 2.9.0 + * + * @param array $size { + * Indexed array of the embed width and height in pixels. + * + * @type int $0 The embed width. + * @type int $1 The embed height. + * } + * @param string $url The URL that should be embedded. + */ + return apply_filters( 'embed_defaults', compact( 'width', 'height' ), $url ); +} + +/** + * Attempts to fetch the embed HTML for a provided URL using oEmbed. + * + * @since 2.9.0 + * + * @see WP_oEmbed + * + * @param string $url The URL that should be embedded. + * @param array $args Optional. Additional arguments and parameters for retrieving embed HTML. + * Default empty. + * @return string|false The embed HTML on success, false on failure. + */ +function wp_oembed_get( $url, $args = '' ) { + $oembed = _wp_oembed_get_object(); + return $oembed->get_html( $url, $args ); +} + +/** + * Returns the initialized WP_oEmbed object. + * + * @since 2.9.0 + * @access private + * + * @staticvar WP_oEmbed $wp_oembed + * + * @return WP_oEmbed object. + */ +function _wp_oembed_get_object() { + static $wp_oembed = null; + + if ( is_null( $wp_oembed ) ) { + $wp_oembed = new WP_oEmbed(); + } + return $wp_oembed; +} + +/** + * Adds a URL format and oEmbed provider URL pair. + * + * @since 2.9.0 + * + * @see WP_oEmbed + * + * @param string $format The format of URL that this provider can handle. You can use asterisks + * as wildcards. + * @param string $provider The URL to the oEmbed provider. + * @param boolean $regex Optional. Whether the `$format` parameter is in a RegEx format. Default false. + */ +function wp_oembed_add_provider( $format, $provider, $regex = false ) { + if ( did_action( 'plugins_loaded' ) ) { + $oembed = _wp_oembed_get_object(); + $oembed->providers[ $format ] = array( $provider, $regex ); + } else { + WP_oEmbed::_add_provider_early( $format, $provider, $regex ); + } +} + +/** + * Removes an oEmbed provider. + * + * @since 3.5.0 + * + * @see WP_oEmbed + * + * @param string $format The URL format for the oEmbed provider to remove. + * @return bool Was the provider removed successfully? + */ +function wp_oembed_remove_provider( $format ) { + if ( did_action( 'plugins_loaded' ) ) { + $oembed = _wp_oembed_get_object(); + + if ( isset( $oembed->providers[ $format ] ) ) { + unset( $oembed->providers[ $format ] ); + return true; + } + } else { + WP_oEmbed::_remove_provider_early( $format ); + } + + return false; +} + +/** + * Determines if default embed handlers should be loaded. + * + * Checks to make sure that the embeds library hasn't already been loaded. If + * it hasn't, then it will load the embeds library. + * + * @since 2.9.0 + * + * @see wp_embed_register_handler() + */ +function wp_maybe_load_embeds() { + /** + * Filters whether to load the default embed handlers. + * + * Returning a falsey value will prevent loading the default embed handlers. + * + * @since 2.9.0 + * + * @param bool $maybe_load_embeds Whether to load the embeds library. Default true. + */ + if ( ! apply_filters( 'load_default_embeds', true ) ) { + return; + } + + wp_embed_register_handler( 'youtube_embed_url', '#https?://(www.)?youtube\.com/(?:v|embed)/([^/]+)#i', 'wp_embed_handler_youtube' ); + + /** + * Filters the audio embed handler callback. + * + * @since 3.6.0 + * + * @param callable $handler Audio embed handler callback function. + */ + wp_embed_register_handler( 'audio', '#^https?://.+?\.(' . join( '|', wp_get_audio_extensions() ) . ')$#i', apply_filters( 'wp_audio_embed_handler', 'wp_embed_handler_audio' ), 9999 ); + + /** + * Filters the video embed handler callback. + * + * @since 3.6.0 + * + * @param callable $handler Video embed handler callback function. + */ + wp_embed_register_handler( 'video', '#^https?://.+?\.(' . join( '|', wp_get_video_extensions() ) . ')$#i', apply_filters( 'wp_video_embed_handler', 'wp_embed_handler_video' ), 9999 ); +} + +/** + * YouTube iframe embed handler callback. + * + * Catches YouTube iframe embed URLs that are not parsable by oEmbed but can be translated into a URL that is. + * + * @since 4.0.0 + * + * @global WP_Embed $wp_embed + * + * @param array $matches The RegEx matches from the provided regex when calling + * wp_embed_register_handler(). + * @param array $attr Embed attributes. + * @param string $url The original URL that was matched by the regex. + * @param array $rawattr The original unmodified attributes. + * @return string The embed HTML. + */ +function wp_embed_handler_youtube( $matches, $attr, $url, $rawattr ) { + global $wp_embed; + $embed = $wp_embed->autoembed( sprintf( 'https://youtube.com/watch?v=%s', urlencode( $matches[2] ) ) ); + + /** + * Filters the YoutTube embed output. + * + * @since 4.0.0 + * + * @see wp_embed_handler_youtube() + * + * @param string $embed YouTube embed output. + * @param array $attr An array of embed attributes. + * @param string $url The original URL that was matched by the regex. + * @param array $rawattr The original unmodified attributes. + */ + return apply_filters( 'wp_embed_handler_youtube', $embed, $attr, $url, $rawattr ); +} + +/** + * Audio embed handler callback. + * + * @since 3.6.0 + * + * @param array $matches The RegEx matches from the provided regex when calling wp_embed_register_handler(). + * @param array $attr Embed attributes. + * @param string $url The original URL that was matched by the regex. + * @param array $rawattr The original unmodified attributes. + * @return string The embed HTML. + */ +function wp_embed_handler_audio( $matches, $attr, $url, $rawattr ) { + $audio = sprintf( '[audio src="%s" /]', esc_url( $url ) ); + + /** + * Filters the audio embed output. + * + * @since 3.6.0 + * + * @param string $audio Audio embed output. + * @param array $attr An array of embed attributes. + * @param string $url The original URL that was matched by the regex. + * @param array $rawattr The original unmodified attributes. + */ + return apply_filters( 'wp_embed_handler_audio', $audio, $attr, $url, $rawattr ); +} + +/** + * Video embed handler callback. + * + * @since 3.6.0 + * + * @param array $matches The RegEx matches from the provided regex when calling wp_embed_register_handler(). + * @param array $attr Embed attributes. + * @param string $url The original URL that was matched by the regex. + * @param array $rawattr The original unmodified attributes. + * @return string The embed HTML. + */ +function wp_embed_handler_video( $matches, $attr, $url, $rawattr ) { + $dimensions = ''; + if ( ! empty( $rawattr['width'] ) && ! empty( $rawattr['height'] ) ) { + $dimensions .= sprintf( 'width="%d" ', (int) $rawattr['width'] ); + $dimensions .= sprintf( 'height="%d" ', (int) $rawattr['height'] ); + } + $video = sprintf( '[video %s src="%s" /]', $dimensions, esc_url( $url ) ); + + /** + * Filters the video embed output. + * + * @since 3.6.0 + * + * @param string $video Video embed output. + * @param array $attr An array of embed attributes. + * @param string $url The original URL that was matched by the regex. + * @param array $rawattr The original unmodified attributes. + */ + return apply_filters( 'wp_embed_handler_video', $video, $attr, $url, $rawattr ); +} + +/** + * Registers the oEmbed REST API route. + * + * @since 4.4.0 + */ +function wp_oembed_register_route() { + $controller = new WP_oEmbed_Controller(); + $controller->register_routes(); +} + +/** + * Adds oEmbed discovery links in the website . + * + * @since 4.4.0 + */ +function wp_oembed_add_discovery_links() { + $output = ''; + + if ( is_singular() ) { + $output .= '' . "\n"; + + if ( class_exists( 'SimpleXMLElement' ) ) { + $output .= '' . "\n"; + } + } + + /** + * Filters the oEmbed discovery links HTML. + * + * @since 4.4.0 + * + * @param string $output HTML of the discovery links. + */ + echo apply_filters( 'oembed_discovery_links', $output ); +} + +/** + * Adds the necessary JavaScript to communicate with the embedded iframes. + * + * @since 4.4.0 + */ +function wp_oembed_add_host_js() { + wp_enqueue_script( 'wp-embed' ); +} + +/** + * Retrieves the URL to embed a specific post in an iframe. + * + * @since 4.4.0 + * + * @param int|WP_Post $post Optional. Post ID or object. Defaults to the current post. + * @return string|false The post embed URL on success, false if the post doesn't exist. + */ +function get_post_embed_url( $post = null ) { + $post = get_post( $post ); + + if ( ! $post ) { + return false; + } + + $embed_url = trailingslashit( get_permalink( $post ) ) . user_trailingslashit( 'embed' ); + $path_conflict = get_page_by_path( str_replace( home_url(), '', $embed_url ), OBJECT, get_post_types( array( 'public' => true ) ) ); + + if ( ! get_option( 'permalink_structure' ) || $path_conflict ) { + $embed_url = add_query_arg( array( 'embed' => 'true' ), get_permalink( $post ) ); + } + + /** + * Filters the URL to embed a specific post. + * + * @since 4.4.0 + * + * @param string $embed_url The post embed URL. + * @param WP_Post $post The corresponding post object. + */ + return esc_url_raw( apply_filters( 'post_embed_url', $embed_url, $post ) ); +} + +/** + * Retrieves the oEmbed endpoint URL for a given permalink. + * + * Pass an empty string as the first argument to get the endpoint base URL. + * + * @since 4.4.0 + * + * @param string $permalink Optional. The permalink used for the `url` query arg. Default empty. + * @param string $format Optional. The requested response format. Default 'json'. + * @return string The oEmbed endpoint URL. + */ +function get_oembed_endpoint_url( $permalink = '', $format = 'json' ) { + $url = rest_url( 'oembed/1.0/embed' ); + + if ( '' !== $permalink ) { + $url = add_query_arg( + array( + 'url' => urlencode( $permalink ), + 'format' => ( 'json' !== $format ) ? $format : false, + ), + $url + ); + } + + /** + * Filters the oEmbed endpoint URL. + * + * @since 4.4.0 + * + * @param string $url The URL to the oEmbed endpoint. + * @param string $permalink The permalink used for the `url` query arg. + * @param string $format The requested response format. + */ + return apply_filters( 'oembed_endpoint_url', $url, $permalink, $format ); +} + +/** + * Retrieves the embed code for a specific post. + * + * @since 4.4.0 + * + * @param int $width The width for the response. + * @param int $height The height for the response. + * @param int|WP_Post $post Optional. Post ID or object. Default is global `$post`. + * @return string|false Embed code on success, false if post doesn't exist. + */ +function get_post_embed_html( $width, $height, $post = null ) { + $post = get_post( $post ); + + if ( ! $post ) { + return false; + } + + $embed_url = get_post_embed_url( $post ); + + $output = '
                ' . get_the_title( $post ) . "
                \n"; + + $output .= ""; + + $output .= sprintf( + '', + esc_url( $embed_url ), + absint( $width ), + absint( $height ), + esc_attr( + sprintf( + /* translators: 1: Post title, 2: Site title. */ + __( '“%1$s” — %2$s' ), + get_the_title( $post ), + get_bloginfo( 'name' ) + ) + ) + ); + + /** + * Filters the embed HTML output for a given post. + * + * @since 4.4.0 + * + * @param string $output The default iframe tag to display embedded content. + * @param WP_Post $post Current post object. + * @param int $width Width of the response. + * @param int $height Height of the response. + */ + return apply_filters( 'embed_html', $output, $post, $width, $height ); +} + +/** + * Retrieves the oEmbed response data for a given post. + * + * @since 4.4.0 + * + * @param WP_Post|int $post Post object or ID. + * @param int $width The requested width. + * @return array|false Response data on success, false if post doesn't exist. + */ +function get_oembed_response_data( $post, $width ) { + $post = get_post( $post ); + $width = absint( $width ); + + if ( ! $post ) { + return false; + } + + if ( 'publish' !== get_post_status( $post ) ) { + return false; + } + + /** + * Filters the allowed minimum and maximum widths for the oEmbed response. + * + * @since 4.4.0 + * + * @param array $min_max_width { + * Minimum and maximum widths for the oEmbed response. + * + * @type int $min Minimum width. Default 200. + * @type int $max Maximum width. Default 600. + * } + */ + $min_max_width = apply_filters( + 'oembed_min_max_width', + array( + 'min' => 200, + 'max' => 600, + ) + ); + + $width = min( max( $min_max_width['min'], $width ), $min_max_width['max'] ); + $height = max( ceil( $width / 16 * 9 ), 200 ); + + $data = array( + 'version' => '1.0', + 'provider_name' => get_bloginfo( 'name' ), + 'provider_url' => get_home_url(), + 'author_name' => get_bloginfo( 'name' ), + 'author_url' => get_home_url(), + 'title' => get_the_title( $post ), + 'type' => 'link', + ); + + $author = get_userdata( $post->post_author ); + + if ( $author ) { + $data['author_name'] = $author->display_name; + $data['author_url'] = get_author_posts_url( $author->ID ); + } + + /** + * Filters the oEmbed response data. + * + * @since 4.4.0 + * + * @param array $data The response data. + * @param WP_Post $post The post object. + * @param int $width The requested width. + * @param int $height The calculated height. + */ + return apply_filters( 'oembed_response_data', $data, $post, $width, $height ); +} + + +/** + * Retrieves the oEmbed response data for a given URL. + * + * @since 5.0.0 + * + * @param string $url The URL that should be inspected for discovery `` tags. + * @param array $args oEmbed remote get arguments. + * @return object|false oEmbed response data if the URL does belong to the current site. False otherwise. + */ +function get_oembed_response_data_for_url( $url, $args ) { + $switched_blog = false; + + if ( is_multisite() ) { + $url_parts = wp_parse_args( + wp_parse_url( $url ), + array( + 'host' => '', + 'path' => '/', + ) + ); + + $qv = array( + 'domain' => $url_parts['host'], + 'path' => '/', + 'update_site_meta_cache' => false, + ); + + // In case of subdirectory configs, set the path. + if ( ! is_subdomain_install() ) { + $path = explode( '/', ltrim( $url_parts['path'], '/' ) ); + $path = reset( $path ); + + if ( $path ) { + $qv['path'] = get_network()->path . $path . '/'; + } + } + + $sites = get_sites( $qv ); + $site = reset( $sites ); + + if ( $site && get_current_blog_id() !== (int) $site->blog_id ) { + switch_to_blog( $site->blog_id ); + $switched_blog = true; + } + } + + $post_id = url_to_postid( $url ); + + /** This filter is documented in wp-includes/class-wp-oembed-controller.php */ + $post_id = apply_filters( 'oembed_request_post_id', $post_id, $url ); + + if ( ! $post_id ) { + if ( $switched_blog ) { + restore_current_blog(); + } + + return false; + } + + $width = isset( $args['width'] ) ? $args['width'] : 0; + + $data = get_oembed_response_data( $post_id, $width ); + + if ( $switched_blog ) { + restore_current_blog(); + } + + return $data ? (object) $data : false; +} + + +/** + * Filters the oEmbed response data to return an iframe embed code. + * + * @since 4.4.0 + * + * @param array $data The response data. + * @param WP_Post $post The post object. + * @param int $width The requested width. + * @param int $height The calculated height. + * @return array The modified response data. + */ +function get_oembed_response_data_rich( $data, $post, $width, $height ) { + $data['width'] = absint( $width ); + $data['height'] = absint( $height ); + $data['type'] = 'rich'; + $data['html'] = get_post_embed_html( $width, $height, $post ); + + // Add post thumbnail to response if available. + $thumbnail_id = false; + + if ( has_post_thumbnail( $post->ID ) ) { + $thumbnail_id = get_post_thumbnail_id( $post->ID ); + } + + if ( 'attachment' === get_post_type( $post ) ) { + if ( wp_attachment_is_image( $post ) ) { + $thumbnail_id = $post->ID; + } elseif ( wp_attachment_is( 'video', $post ) ) { + $thumbnail_id = get_post_thumbnail_id( $post ); + $data['type'] = 'video'; + } + } + + if ( $thumbnail_id ) { + list( $thumbnail_url, $thumbnail_width, $thumbnail_height ) = wp_get_attachment_image_src( $thumbnail_id, array( $width, 99999 ) ); + $data['thumbnail_url'] = $thumbnail_url; + $data['thumbnail_width'] = $thumbnail_width; + $data['thumbnail_height'] = $thumbnail_height; + } + + return $data; +} + +/** + * Ensures that the specified format is either 'json' or 'xml'. + * + * @since 4.4.0 + * + * @param string $format The oEmbed response format. Accepts 'json' or 'xml'. + * @return string The format, either 'xml' or 'json'. Default 'json'. + */ +function wp_oembed_ensure_format( $format ) { + if ( ! in_array( $format, array( 'json', 'xml' ), true ) ) { + return 'json'; + } + + return $format; +} + +/** + * Hooks into the REST API output to print XML instead of JSON. + * + * This is only done for the oEmbed API endpoint, + * which supports both formats. + * + * @access private + * @since 4.4.0 + * + * @param bool $served Whether the request has already been served. + * @param WP_HTTP_ResponseInterface $result Result to send to the client. Usually a WP_REST_Response. + * @param WP_REST_Request $request Request used to generate the response. + * @param WP_REST_Server $server Server instance. + * @return true + */ +function _oembed_rest_pre_serve_request( $served, $result, $request, $server ) { + $params = $request->get_params(); + + if ( '/oembed/1.0/embed' !== $request->get_route() || 'GET' !== $request->get_method() ) { + return $served; + } + + if ( ! isset( $params['format'] ) || 'xml' !== $params['format'] ) { + return $served; + } + + // Embed links inside the request. + $data = $server->response_to_data( $result, false ); + + if ( ! class_exists( 'SimpleXMLElement' ) ) { + status_header( 501 ); + die( get_status_header_desc( 501 ) ); + } + + $result = _oembed_create_xml( $data ); + + // Bail if there's no XML. + if ( ! $result ) { + status_header( 501 ); + return get_status_header_desc( 501 ); + } + + if ( ! headers_sent() ) { + $server->send_header( 'Content-Type', 'text/xml; charset=' . get_option( 'blog_charset' ) ); + } + + echo $result; + + return true; +} + +/** + * Creates an XML string from a given array. + * + * @since 4.4.0 + * @access private + * + * @param array $data The original oEmbed response data. + * @param SimpleXMLElement $node Optional. XML node to append the result to recursively. + * @return string|false XML string on success, false on error. + */ +function _oembed_create_xml( $data, $node = null ) { + if ( ! is_array( $data ) || empty( $data ) ) { + return false; + } + + if ( null === $node ) { + $node = new SimpleXMLElement( '' ); + } + + foreach ( $data as $key => $value ) { + if ( is_numeric( $key ) ) { + $key = 'oembed'; + } + + if ( is_array( $value ) ) { + $item = $node->addChild( $key ); + _oembed_create_xml( $value, $item ); + } else { + $node->addChild( $key, esc_html( $value ) ); + } + } + + return $node->asXML(); +} + +/** + * Filters the given oEmbed HTML to make sure iframes have a title attribute. + * + * @since 5.2.0 + * + * @param string $result The oEmbed HTML result. + * @param object $data A data object result from an oEmbed provider. + * @param string $url The URL of the content to be embedded. + * @return string The filtered oEmbed result. + */ +function wp_filter_oembed_iframe_title_attribute( $result, $data, $url ) { + if ( false === $result || ! in_array( $data->type, array( 'rich', 'video' ) ) ) { + return $result; + } + + $title = ! empty( $data->title ) ? $data->title : ''; + + $pattern = '`]*)>`i'; + if ( preg_match( $pattern, $result, $matches ) ) { + $attrs = wp_kses_hair( $matches[1], wp_allowed_protocols() ); + + foreach ( $attrs as $attr => $item ) { + $lower_attr = strtolower( $attr ); + if ( $lower_attr === $attr ) { + continue; + } + if ( ! isset( $attrs[ $lower_attr ] ) ) { + $attrs[ $lower_attr ] = $item; + unset( $attrs[ $attr ] ); + } + } + } + + if ( ! empty( $attrs['title']['value'] ) ) { + $title = $attrs['title']['value']; + } + + /** + * Filters the title attribute of the given oEmbed HTML iframe. + * + * @since 5.2.0 + * + * @param string $title The title attribute. + * @param string $result The oEmbed HTML result. + * @param object $data A data object result from an oEmbed provider. + * @param string $url The URL of the content to be embedded. + */ + $title = apply_filters( 'oembed_iframe_title_attribute', $title, $result, $data, $url ); + + if ( '' === $title ) { + return $result; + } + + if ( isset( $attrs['title'] ) ) { + unset( $attrs['title'] ); + $attr_string = join( ' ', wp_list_pluck( $attrs, 'whole' ) ); + $result = str_replace( $matches[0], ')|ms', $html, $content ); + // We require at least the iframe to exist. + if ( empty( $content[2] ) ) { + return false; + } + $html = $content[1] . $content[2]; + + preg_match( '/ src=([\'"])(.*?)\1/', $html, $results ); + + if ( ! empty( $results ) ) { + $secret = wp_generate_password( 10, false ); + + $url = esc_url( "{$results[2]}#?secret=$secret" ); + $q = $results[1]; + + $html = str_replace( $results[0], ' src=' . $q . $url . $q . ' data-secret=' . $q . $secret . $q, $html ); + $html = str_replace( '%2$s', + esc_url( get_permalink() ), + /* translators: %s: Post title. */ + sprintf( __( 'Continue reading %s' ), '' . get_the_title() . '' ) + ); + return ' … ' . $link; +} + +/** + * Displays the post excerpt for the embed template. + * + * Intended to be used in 'The Loop'. + * + * @since 4.4.0 + */ +function the_excerpt_embed() { + $output = get_the_excerpt(); + + /** + * Filters the post excerpt for the embed template. + * + * @since 4.4.0 + * + * @param string $output The current post excerpt. + */ + echo apply_filters( 'the_excerpt_embed', $output ); +} + +/** + * Filters the post excerpt for the embed template. + * + * Shows players for video and audio attachments. + * + * @since 4.4.0 + * + * @param string $content The current post excerpt. + * @return string The modified post excerpt. + */ +function wp_embed_excerpt_attachment( $content ) { + if ( is_attachment() ) { + return prepend_attachment( '' ); + } + + return $content; +} + +/** + * Enqueue embed iframe default CSS and JS & fire do_action('enqueue_embed_scripts') + * + * Enqueue PNG fallback CSS for embed iframe for legacy versions of IE. + * + * Allows plugins to queue scripts for the embed iframe end using wp_enqueue_script(). + * Runs first in oembed_head(). + * + * @since 4.4.0 + */ +function enqueue_embed_scripts() { + wp_enqueue_style( 'wp-embed-template-ie' ); + + /** + * Fires when scripts and styles are enqueued for the embed iframe. + * + * @since 4.4.0 + */ + do_action( 'enqueue_embed_scripts' ); +} + +/** + * Prints the CSS in the embed iframe header. + * + * @since 4.4.0 + */ +function print_embed_styles() { + $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; + ?> + > + + /*! This file is auto-generated */ + body,html{padding:0;margin:0}body{font-family:sans-serif}.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;width:1px;word-wrap:normal!important}.dashicons{display:inline-block;width:20px;height:20px;background-color:transparent;background-repeat:no-repeat;background-size:20px;background-position:center;transition:background .1s ease-in;position:relative;top:5px}.dashicons-no{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M15.55%2013.7l-2.19%202.06-3.42-3.65-3.64%203.43-2.06-2.18%203.64-3.43-3.42-3.64%202.18-2.06%203.43%203.64%203.64-3.42%202.05%202.18-3.64%203.43z%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E")}.dashicons-admin-comments{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E")}.wp-embed-comments a:hover .dashicons-admin-comments{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E")}.dashicons-share{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E");display:none}.js .dashicons-share{display:inline-block}.wp-embed-share-dialog-open:hover .dashicons-share{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E")}.wp-embed{padding:25px;font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.5;color:#82878c;background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.05);overflow:auto;zoom:1}.wp-embed a{color:#82878c;text-decoration:none}.wp-embed a:hover{text-decoration:underline}.wp-embed-featured-image{margin-bottom:20px}.wp-embed-featured-image img{width:100%;height:auto;border:none}.wp-embed-featured-image.square{float:left;max-width:160px;margin-right:20px}.wp-embed p{margin:0}p.wp-embed-heading{margin:0 0 15px;font-weight:600;font-size:22px;line-height:1.3}.wp-embed-heading a{color:#32373c}.wp-embed .wp-embed-more{color:#b4b9be}.wp-embed-footer{display:table;width:100%;margin-top:30px}.wp-embed-site-icon{position:absolute;top:50%;left:0;transform:translateY(-50%);height:25px;width:25px;border:0}.wp-embed-site-title{font-weight:600;line-height:1.78571428}.wp-embed-site-title a{position:relative;display:inline-block;padding-left:35px}.wp-embed-meta,.wp-embed-site-title{display:table-cell}.wp-embed-meta{text-align:right;white-space:nowrap;vertical-align:middle}.wp-embed-comments,.wp-embed-share{display:inline}.wp-embed-meta a:hover{text-decoration:none;color:#0073aa}.wp-embed-comments a{line-height:1.78571428;display:inline-block}.wp-embed-comments+.wp-embed-share{margin-left:10px}.wp-embed-share-dialog{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#222;background-color:rgba(10,10,10,.9);color:#fff;opacity:1;transition:opacity .25s ease-in-out}.wp-embed-share-dialog.hidden{opacity:0;visibility:hidden}.wp-embed-share-dialog-close,.wp-embed-share-dialog-open{margin:-8px 0 0;padding:0;background:0 0;border:none;cursor:pointer;outline:0}.wp-embed-share-dialog-close .dashicons,.wp-embed-share-dialog-open .dashicons{padding:4px}.wp-embed-share-dialog-open .dashicons{top:8px}.wp-embed-share-dialog-close:focus .dashicons,.wp-embed-share-dialog-open:focus .dashicons{box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);border-radius:100%}.wp-embed-share-dialog-close{position:absolute;top:20px;right:20px;font-size:22px}.wp-embed-share-dialog-close:hover{text-decoration:none}.wp-embed-share-dialog-close .dashicons{height:24px;width:24px;background-size:24px}.wp-embed-share-dialog-content{height:100%;transform-style:preserve-3d;overflow:hidden}.wp-embed-share-dialog-text{margin-top:25px;padding:20px}.wp-embed-share-tabs{margin:0 0 20px;padding:0;list-style:none}.wp-embed-share-tab-button{display:inline-block}.wp-embed-share-tab-button button{margin:0;padding:0;border:none;background:0 0;font-size:16px;line-height:1.3;color:#aaa;cursor:pointer;transition:color .1s ease-in}.wp-embed-share-tab-button [aria-selected=true]{color:#fff}.wp-embed-share-tab-button button:hover{color:#fff}.wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 0 0 10px;padding:0 0 0 11px;border-left:1px solid #aaa}.wp-embed-share-tab[aria-hidden=true]{display:none}p.wp-embed-share-description{margin:0;font-size:14px;line-height:1;font-style:italic;color:#aaa}.wp-embed-share-input{box-sizing:border-box;width:100%;border:none;height:28px;margin:0 0 10px 0;padding:0 5px;font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.5;resize:none;cursor:text}textarea.wp-embed-share-input{height:72px}html[dir=rtl] .wp-embed-featured-image.square{float:right;margin-right:0;margin-left:20px}html[dir=rtl] .wp-embed-site-title a{padding-left:0;padding-right:35px}html[dir=rtl] .wp-embed-site-icon{margin-right:0;margin-left:10px;left:auto;right:0}html[dir=rtl] .wp-embed-meta{text-align:left}html[dir=rtl] .wp-embed-share{margin-left:0;margin-right:10px}html[dir=rtl] .wp-embed-share-dialog-close{right:auto;left:20px}html[dir=rtl] .wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 10px 0 0;padding:0 11px 0 0;border-left:none;border-right:1px solid #aaa} + + + + > + + /*! This file is auto-generated */ + !function(u,c){"use strict";var r,t,e,i=c.querySelector&&u.addEventListener,b=!1;function f(e,t){u.parent.postMessage({message:e,value:t,secret:r},"*")}function n(){if(!b){b=!0;var e,t=c.querySelector(".wp-embed-share-dialog"),r=c.querySelector(".wp-embed-share-dialog-open"),i=c.querySelector(".wp-embed-share-dialog-close"),n=c.querySelectorAll(".wp-embed-share-input"),a=c.querySelectorAll(".wp-embed-share-tab-button button"),o=c.querySelector(".wp-embed-featured-image img");if(n)for(e=0;e + + + + +
                + +
                + + + %s', + esc_url( home_url() ), + esc_url( get_site_icon_url( 32, includes_url( 'images/w-logo-blue.png' ) ) ), + esc_url( get_site_icon_url( 64, includes_url( 'images/w-logo-blue.png' ) ) ), + esc_html( get_bloginfo( 'name' ) ) + ); + + $site_title = '
                ' . $site_title . '
                '; + + /** + * Filters the site title HTML in the embed footer. + * + * @since 4.4.0 + * + * @param string $site_title The site title HTML. + */ + echo apply_filters( 'embed_site_title_html', $site_title ); +} + +/** + * Filters the oEmbed result before any HTTP requests are made. + * + * If the URL belongs to the current site, the result is fetched directly instead of + * going through the oEmbed discovery process. + * + * @since 4.5.3 + * + * @param null|string $result The UNSANITIZED (and potentially unsafe) HTML that should be used to embed. Default null. + * @param string $url The URL that should be inspected for discovery `` tags. + * @param array $args oEmbed remote get arguments. + * @return null|string The UNSANITIZED (and potentially unsafe) HTML that should be used to embed. + * Null if the URL does not belong to the current site. + */ +function wp_filter_pre_oembed_result( $result, $url, $args ) { + $data = get_oembed_response_data_for_url( $url, $args ); + + if ( $data ) { + return _wp_oembed_get_object()->data2html( $data, $url ); + } + + return $result; +} diff --git a/wp-includes/error-protection.php b/wp-includes/error-protection.php new file mode 100644 index 0000000..fde37c7 --- /dev/null +++ b/wp-includes/error-protection.php @@ -0,0 +1,137 @@ + $value ) { + if ( 0 === strpos( $constant, 'E_' ) ) { + $core_errors[ $value ] = $constant; + } + } + + if ( isset( $core_errors[ $error['type'] ] ) ) { + $error['type'] = $core_errors[ $error['type'] ]; + } + + /* translators: 1: Error type, 2: Error line number, 3: Error file name, 4: Error message. */ + $error_message = __( 'An error of type %1$s was caused in line %2$s of the file %3$s. Error message: %4$s' ); + + return sprintf( + $error_message, + "{$error['type']}", + "{$error['line']}", + "{$error['file']}", + "{$error['message']}" + ); +} + +/** + * Registers the shutdown handler for fatal errors. + * + * The handler will only be registered if {@see wp_is_fatal_error_handler_enabled()} returns true. + * + * @since 5.2.0 + */ +function wp_register_fatal_error_handler() { + if ( ! wp_is_fatal_error_handler_enabled() ) { + return; + } + + $handler = null; + if ( defined( 'WP_CONTENT_DIR' ) && is_readable( WP_CONTENT_DIR . '/fatal-error-handler.php' ) ) { + $handler = include WP_CONTENT_DIR . '/fatal-error-handler.php'; + } + + if ( ! is_object( $handler ) || ! is_callable( array( $handler, 'handle' ) ) ) { + $handler = new WP_Fatal_Error_Handler(); + } + + register_shutdown_function( array( $handler, 'handle' ) ); +} + +/** + * Checks whether the fatal error handler is enabled. + * + * A constant `WP_DISABLE_FATAL_ERROR_HANDLER` can be set in `wp-config.php` to disable it, or alternatively the + * {@see 'wp_fatal_error_handler_enabled'} filter can be used to modify the return value. + * + * @since 5.2.0 + * + * @return bool True if the fatal error handler is enabled, false otherwise. + */ +function wp_is_fatal_error_handler_enabled() { + $enabled = ! defined( 'WP_DISABLE_FATAL_ERROR_HANDLER' ) || ! WP_DISABLE_FATAL_ERROR_HANDLER; + + /** + * Filters whether the fatal error handler is enabled. + * + * @since 5.2.0 + * + * @param bool $enabled True if the fatal error handler is enabled, false otherwise. + */ + return apply_filters( 'wp_fatal_error_handler_enabled', $enabled ); +} + +/** + * Access the WordPress Recovery Mode instance. + * + * @since 5.2.0 + * + * @return WP_Recovery_Mode + */ +function wp_recovery_mode() { + static $wp_recovery_mode; + + if ( ! $wp_recovery_mode ) { + $wp_recovery_mode = new WP_Recovery_Mode(); + } + + return $wp_recovery_mode; +} diff --git a/wp-includes/feed-atom-comments.php b/wp-includes/feed-atom-comments.php new file mode 100644 index 0000000..b43f8d4 --- /dev/null +++ b/wp-includes/feed-atom-comments.php @@ -0,0 +1,143 @@ +'; + +/** This action is documented in wp-includes/feed-rss2.php */ +do_action( 'rss_tag_pre', 'atom-comments' ); +?> + +> + + <?php + if ( is_singular() ) { + /* translators: Comments feed title. %s: Post title. */ + printf( ent2ncr( __( 'Comments on %s' ) ), get_the_title_rss() ); + } elseif ( is_search() ) { + /* translators: Comments feed title. 1: Site title, 2: Search query. */ + printf( ent2ncr( __( 'Comments for %1$s searching on %2$s' ) ), get_bloginfo_rss( 'name' ), get_search_query() ); + } else { + /* translators: Comments feed title. %s: Site title. */ + printf( ent2ncr( __( 'Comments for %s' ) ), get_wp_title_rss() ); + } + ?> + + + + + + + + + + + + + + + + + + + +comment_post_ID ); + $GLOBALS['post'] = $comment_post; + ?> + + + <?php + if ( ! is_singular() ) { + $title = get_the_title( $comment_post->ID ); + /** This filter is documented in wp-includes/feed.php */ + $title = apply_filters( 'the_title_rss', $title ); + /* translators: Individual comment title. 1: Post title, 2: Comment author name. */ + printf( ent2ncr( __( 'Comment on %1$s by %2$s' ) ), $title, get_comment_author_rss() ); + } else { + /* translators: Comment author title. %s: Comment author name. */ + printf( ent2ncr( __( 'By: %s' ) ), get_comment_author_rss() ); + } + ?> + + + + + + ' . get_comment_author_url() . '';} + ?> + + + + + + + + + ]]> + + ]]> + + + comment_parent ) : // This comment is top-level. + ?> + + comment_parent ); + /* + * The rel attribute below and the id tag above should be GUIDs, + * but WP doesn't create them for comments (unlike posts). + * Either way, it's more important that they both use the same system. + */ + ?> + + comment_ID, $comment_post->ID ); + ?> + + + diff --git a/wp-includes/feed-atom.php b/wp-includes/feed-atom.php new file mode 100644 index 0000000..629ffc6 --- /dev/null +++ b/wp-includes/feed-atom.php @@ -0,0 +1,102 @@ +'; + +/** This action is documented in wp-includes/feed-rss2.php */ +do_action( 'rss_tag_pre', 'atom' ); +?> + +> + <?php wp_title_rss(); ?> + + + + + + + + + + + + + + + + + + <![CDATA[<?php the_title_rss(); ?>]]> + + + + + + + + ]]> + + + ]]> + + + + + + + + + + diff --git a/wp-includes/feed-rdf.php b/wp-includes/feed-rdf.php new file mode 100644 index 0000000..39cd15f --- /dev/null +++ b/wp-includes/feed-rdf.php @@ -0,0 +1,99 @@ +'; + +/** This action is documented in wp-includes/feed-rss2.php */ +do_action( 'rss_tag_pre', 'rdf' ); +?> + +> + + <?php wp_title_rss(); ?> + + + + + + + + + + 2000-01-01T12:00+00:00 + + + + + + + + + + + + <?php the_title_rss(); ?> + + + ]]> + post_date_gmt, false ); ?> + + + + ]]> + + ]]> + ]]> + + + + + + diff --git a/wp-includes/feed-rss.php b/wp-includes/feed-rss.php new file mode 100644 index 0000000..5adf891 --- /dev/null +++ b/wp-includes/feed-rss.php @@ -0,0 +1,48 @@ +'; ?> + + + <?php wp_title_rss(); ?> + + + + http://backend.userland.com/rss092 + + + + + + <?php the_title_rss(); ?> + ]]> + + + + + + diff --git a/wp-includes/feed-rss2-comments.php b/wp-includes/feed-rss2-comments.php new file mode 100644 index 0000000..5cbd06c --- /dev/null +++ b/wp-includes/feed-rss2-comments.php @@ -0,0 +1,121 @@ +'; + +/** This action is documented in wp-includes/feed-rss2.php */ +do_action( 'rss_tag_pre', 'rss2-comments' ); +?> + + + +> + + + <?php + if ( is_singular() ) { + /* translators: Comments feed title. %s: Post title. */ + printf( ent2ncr( __( 'Comments on: %s' ) ), get_the_title_rss() ); + } elseif ( is_search() ) { + /* translators: Comments feed title. 1: Site title, 2: Search query. */ + printf( ent2ncr( __( 'Comments for %1$s searching on %2$s' ) ), get_bloginfo_rss( 'name' ), get_search_query() ); + } else { + /* translators: Comments feed title. %s: Site title. */ + printf( ent2ncr( __( 'Comments for %s' ) ), get_wp_title_rss() ); + } + ?> + + + + + + + + + + + + comment_post_ID ); + $GLOBALS['post'] = $comment_post; + ?> + + + <?php + if ( ! is_singular() ) { + $title = get_the_title( $comment_post->ID ); + /** This filter is documented in wp-includes/feed.php */ + $title = apply_filters( 'the_title_rss', $title ); + /* translators: Individual comment title. 1: Post title, 2: Comment author name. */ + printf( ent2ncr( __( 'Comment on %1$s by %2$s' ) ), $title, get_comment_author_rss() ); + } else { + /* translators: Comment author title. %s: Comment author name. */ + printf( ent2ncr( __( 'By: %s' ) ), get_comment_author_rss() ); + } + ?> + + + + ]]> + + + + + + ]]> + + ]]> + ]]> + + + comment_ID The ID of the comment being displayed. + * @param int $comment_post->ID The ID of the post the comment is connected to. + */ + do_action( 'commentrss2_item', $comment->comment_ID, $comment_post->ID ); + ?> + + + + diff --git a/wp-includes/feed-rss2.php b/wp-includes/feed-rss2.php new file mode 100644 index 0000000..8b30313 --- /dev/null +++ b/wp-includes/feed-rss2.php @@ -0,0 +1,130 @@ +'; + +/** + * Fires between the xml and rss tags in a feed. + * + * @since 4.0.0 + * + * @param string $context Type of feed. Possible values include 'rss2', 'rss2-comments', + * 'rdf', 'atom', and 'atom-comments'. + */ +do_action( 'rss_tag_pre', 'rss2' ); +?> + +> + + + <?php wp_title_rss(); ?> + + + + + + + + + + + + + + <?php the_title_rss(); ?> + + + + + + ]]> + + + + + + ]]> + + ]]> + + 0 ) : ?> + ]]> + + ]]> + + + + + + + + + + + + + + + diff --git a/wp-includes/feed.php b/wp-includes/feed.php new file mode 100644 index 0000000..49c262d --- /dev/null +++ b/wp-includes/feed.php @@ -0,0 +1,791 @@ +document_title_separator' ) ); + } + + /** + * Filters the blog title for use as the feed title. + * + * @since 2.2.0 + * @since 4.4.0 The `$sep` parameter was deprecated and renamed to `$deprecated`. + * + * @param string $title The current blog title. + * @param string $deprecated Unused. + */ + return apply_filters( 'get_wp_title_rss', wp_get_document_title(), $deprecated ); +} + +/** + * Display the blog title for display of the feed title. + * + * @since 2.2.0 + * @since 4.4.0 The optional `$sep` parameter was deprecated and renamed to `$deprecated`. + * + * @param string $deprecated Unused. + */ +function wp_title_rss( $deprecated = '–' ) { + if ( '–' !== $deprecated ) { + /* translators: %s: 'document_title_separator' filter name. */ + _deprecated_argument( __FUNCTION__, '4.4.0', sprintf( __( 'Use the %s filter instead.' ), 'document_title_separator' ) ); + } + + /** + * Filters the blog title for display of the feed title. + * + * @since 2.2.0 + * @since 4.4.0 The `$sep` parameter was deprecated and renamed to `$deprecated`. + * + * @see get_wp_title_rss() + * + * @param string $wp_title_rss The current blog title. + * @param string $deprecated Unused. + */ + echo apply_filters( 'wp_title_rss', get_wp_title_rss(), $deprecated ); +} + +/** + * Retrieve the current post title for the feed. + * + * @since 2.0.0 + * + * @return string Current post title. + */ +function get_the_title_rss() { + $title = get_the_title(); + + /** + * Filters the post title for use in a feed. + * + * @since 1.2.0 + * + * @param string $title The current post title. + */ + $title = apply_filters( 'the_title_rss', $title ); + return $title; +} + +/** + * Display the post title in the feed. + * + * @since 0.71 + */ +function the_title_rss() { + echo get_the_title_rss(); +} + +/** + * Retrieve the post content for feeds. + * + * @since 2.9.0 + * @see get_the_content() + * + * @param string $feed_type The type of feed. rss2 | atom | rss | rdf + * @return string The filtered content. + */ +function get_the_content_feed( $feed_type = null ) { + if ( ! $feed_type ) { + $feed_type = get_default_feed(); + } + + /** This filter is documented in wp-includes/post-template.php */ + $content = apply_filters( 'the_content', get_the_content() ); + $content = str_replace( ']]>', ']]>', $content ); + /** + * Filters the post content for use in feeds. + * + * @since 2.9.0 + * + * @param string $content The current post content. + * @param string $feed_type Type of feed. Possible values include 'rss2', 'atom'. + * Default 'rss2'. + */ + return apply_filters( 'the_content_feed', $content, $feed_type ); +} + +/** + * Display the post content for feeds. + * + * @since 2.9.0 + * + * @param string $feed_type The type of feed. rss2 | atom | rss | rdf + */ +function the_content_feed( $feed_type = null ) { + echo get_the_content_feed( $feed_type ); +} + +/** + * Display the post excerpt for the feed. + * + * @since 0.71 + */ +function the_excerpt_rss() { + $output = get_the_excerpt(); + /** + * Filters the post excerpt for a feed. + * + * @since 1.2.0 + * + * @param string $output The current post excerpt. + */ + echo apply_filters( 'the_excerpt_rss', $output ); +} + +/** + * Display the permalink to the post for use in feeds. + * + * @since 2.3.0 + */ +function the_permalink_rss() { + /** + * Filters the permalink to the post for use in feeds. + * + * @since 2.3.0 + * + * @param string $post_permalink The current post permalink. + */ + echo esc_url( apply_filters( 'the_permalink_rss', get_permalink() ) ); +} + +/** + * Outputs the link to the comments for the current post in an xml safe way + * + * @since 3.0.0 + */ +function comments_link_feed() { + /** + * Filters the comments permalink for the current post. + * + * @since 3.6.0 + * + * @param string $comment_permalink The current comment permalink with + * '#comments' appended. + */ + echo esc_url( apply_filters( 'comments_link_feed', get_comments_link() ) ); +} + +/** + * Display the feed GUID for the current comment. + * + * @since 2.5.0 + * + * @param int|WP_Comment $comment_id Optional comment object or id. Defaults to global comment object. + */ +function comment_guid( $comment_id = null ) { + echo esc_url( get_comment_guid( $comment_id ) ); +} + +/** + * Retrieve the feed GUID for the current comment. + * + * @since 2.5.0 + * + * @param int|WP_Comment $comment_id Optional comment object or id. Defaults to global comment object. + * @return string|false GUID for comment on success, false on failure. + */ +function get_comment_guid( $comment_id = null ) { + $comment = get_comment( $comment_id ); + + if ( ! is_object( $comment ) ) { + return false; + } + + return get_the_guid( $comment->comment_post_ID ) . '#comment-' . $comment->comment_ID; +} + +/** + * Display the link to the comments. + * + * @since 1.5.0 + * @since 4.4.0 Introduced the `$comment` argument. + * + * @param int|WP_Comment $comment Optional. Comment object or id. Defaults to global comment object. + */ +function comment_link( $comment = null ) { + /** + * Filters the current comment's permalink. + * + * @since 3.6.0 + * + * @see get_comment_link() + * + * @param string $comment_permalink The current comment permalink. + */ + echo esc_url( apply_filters( 'comment_link', get_comment_link( $comment ) ) ); +} + +/** + * Retrieve the current comment author for use in the feeds. + * + * @since 2.0.0 + * + * @return string Comment Author + */ +function get_comment_author_rss() { + /** + * Filters the current comment author for use in a feed. + * + * @since 1.5.0 + * + * @see get_comment_author() + * + * @param string $comment_author The current comment author. + */ + return apply_filters( 'comment_author_rss', get_comment_author() ); +} + +/** + * Display the current comment author in the feed. + * + * @since 1.0.0 + */ +function comment_author_rss() { + echo get_comment_author_rss(); +} + +/** + * Display the current comment content for use in the feeds. + * + * @since 1.0.0 + */ +function comment_text_rss() { + $comment_text = get_comment_text(); + /** + * Filters the current comment content for use in a feed. + * + * @since 1.5.0 + * + * @param string $comment_text The content of the current comment. + */ + $comment_text = apply_filters( 'comment_text_rss', $comment_text ); + echo $comment_text; +} + +/** + * Retrieve all of the post categories, formatted for use in feeds. + * + * All of the categories for the current post in the feed loop, will be + * retrieved and have feed markup added, so that they can easily be added to the + * RSS2, Atom, or RSS1 and RSS0.91 RDF feeds. + * + * @since 2.1.0 + * + * @param string $type Optional, default is the type returned by get_default_feed(). + * @return string All of the post categories for displaying in the feed. + */ +function get_the_category_rss( $type = null ) { + if ( empty( $type ) ) { + $type = get_default_feed(); + } + $categories = get_the_category(); + $tags = get_the_tags(); + $the_list = ''; + $cat_names = array(); + + $filter = 'rss'; + if ( 'atom' == $type ) { + $filter = 'raw'; + } + + if ( ! empty( $categories ) ) { + foreach ( (array) $categories as $category ) { + $cat_names[] = sanitize_term_field( 'name', $category->name, $category->term_id, 'category', $filter ); + } + } + + if ( ! empty( $tags ) ) { + foreach ( (array) $tags as $tag ) { + $cat_names[] = sanitize_term_field( 'name', $tag->name, $tag->term_id, 'post_tag', $filter ); + } + } + + $cat_names = array_unique( $cat_names ); + + foreach ( $cat_names as $cat_name ) { + if ( 'rdf' == $type ) { + $the_list .= "\t\t\n"; + } elseif ( 'atom' == $type ) { + $the_list .= sprintf( '', esc_attr( get_bloginfo_rss( 'url' ) ), esc_attr( $cat_name ) ); + } else { + $the_list .= "\t\t\n"; + } + } + + /** + * Filters all of the post categories for display in a feed. + * + * @since 1.2.0 + * + * @param string $the_list All of the RSS post categories. + * @param string $type Type of feed. Possible values include 'rss2', 'atom'. + * Default 'rss2'. + */ + return apply_filters( 'the_category_rss', $the_list, $type ); +} + +/** + * Display the post categories in the feed. + * + * @since 0.71 + * @see get_the_category_rss() For better explanation. + * + * @param string $type Optional, default is the type returned by get_default_feed(). + */ +function the_category_rss( $type = null ) { + echo get_the_category_rss( $type ); +} + +/** + * Display the HTML type based on the blog setting. + * + * The two possible values are either 'xhtml' or 'html'. + * + * @since 2.2.0 + */ +function html_type_rss() { + $type = get_bloginfo( 'html_type' ); + if ( strpos( $type, 'xhtml' ) !== false ) { + $type = 'xhtml'; + } else { + $type = 'html'; + } + echo $type; +} + +/** + * Display the rss enclosure for the current post. + * + * Uses the global $post to check whether the post requires a password and if + * the user has the password for the post. If not then it will return before + * displaying. + * + * Also uses the function get_post_custom() to get the post's 'enclosure' + * metadata field and parses the value to display the enclosure(s). The + * enclosure(s) consist of enclosure HTML tag(s) with a URI and other + * attributes. + * + * @since 1.5.0 + */ +function rss_enclosure() { + if ( post_password_required() ) { + return; + } + + foreach ( (array) get_post_custom() as $key => $val ) { + if ( 'enclosure' === $key ) { + foreach ( (array) $val as $enc ) { + $enclosure = explode( "\n", $enc ); + + // Only get the first element, e.g. 'audio/mpeg' from 'audio/mpeg mpga mp2 mp3'. + $t = preg_split( '/[ \t]/', trim( $enclosure[2] ) ); + $type = $t[0]; + + /** + * Filters the RSS enclosure HTML link tag for the current post. + * + * @since 2.2.0 + * + * @param string $html_link_tag The HTML link tag with a URI and other attributes. + */ + echo apply_filters( 'rss_enclosure', '' . "\n" ); + } + } + } +} + +/** + * Display the atom enclosure for the current post. + * + * Uses the global $post to check whether the post requires a password and if + * the user has the password for the post. If not then it will return before + * displaying. + * + * Also uses the function get_post_custom() to get the post's 'enclosure' + * metadata field and parses the value to display the enclosure(s). The + * enclosure(s) consist of link HTML tag(s) with a URI and other attributes. + * + * @since 2.2.0 + */ +function atom_enclosure() { + if ( post_password_required() ) { + return; + } + + foreach ( (array) get_post_custom() as $key => $val ) { + if ( 'enclosure' === $key ) { + foreach ( (array) $val as $enc ) { + $enclosure = explode( "\n", $enc ); + /** + * Filters the atom enclosure HTML link tag for the current post. + * + * @since 2.2.0 + * + * @param string $html_link_tag The HTML link tag with a URI and other attributes. + */ + echo apply_filters( 'atom_enclosure', '' . "\n" ); + } + } + } +} + +/** + * Determine the type of a string of data with the data formatted. + * + * Tell whether the type is text, html, or xhtml, per RFC 4287 section 3.1. + * + * In the case of WordPress, text is defined as containing no markup, + * xhtml is defined as "well formed", and html as tag soup (i.e., the rest). + * + * Container div tags are added to xhtml values, per section 3.1.1.3. + * + * @link http://www.atomenabled.org/developers/syndication/atom-format-spec.php#rfc.section.3.1 + * + * @since 2.5.0 + * + * @param string $data Input string + * @return array array(type, value) + */ +function prep_atom_text_construct( $data ) { + if ( strpos( $data, '<' ) === false && strpos( $data, '&' ) === false ) { + return array( 'text', $data ); + } + + if ( ! function_exists( 'xml_parser_create' ) ) { + trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) ); + + return array( 'html', "" ); + } + + $parser = xml_parser_create(); + xml_parse( $parser, '
                ' . $data . '
                ', true ); + $code = xml_get_error_code( $parser ); + xml_parser_free( $parser ); + + if ( ! $code ) { + if ( strpos( $data, '<' ) === false ) { + return array( 'text', $data ); + } else { + $data = "
                $data
                "; + return array( 'xhtml', $data ); + } + } + + if ( strpos( $data, ']]>' ) === false ) { + return array( 'html', "" ); + } else { + return array( 'html', htmlspecialchars( $data ) ); + } +} + +/** + * Displays Site Icon in atom feeds. + * + * @since 4.3.0 + * + * @see get_site_icon_url() + */ +function atom_site_icon() { + $url = get_site_icon_url( 32 ); + if ( $url ) { + echo '' . convert_chars( $url ) . "\n"; + } +} + +/** + * Displays Site Icon in RSS2. + * + * @since 4.3.0 + */ +function rss2_site_icon() { + $rss_title = get_wp_title_rss(); + if ( empty( $rss_title ) ) { + $rss_title = get_bloginfo_rss( 'name' ); + } + + $url = get_site_icon_url( 32 ); + if ( $url ) { + echo ' + + ' . convert_chars( $url ) . ' + ' . $rss_title . ' + ' . get_bloginfo_rss( 'url' ) . ' + 32 + 32 + ' . "\n"; + } +} + +/** + * Returns the link for the currently displayed feed. + * + * @since 5.3.0 + * + * @return string Correct link for the atom:self element. + */ +function get_self_link() { + $host = @parse_url( home_url() ); + return set_url_scheme( 'http://' . $host['host'] . wp_unslash( $_SERVER['REQUEST_URI'] ) ); +} + +/** + * Display the link for the currently displayed feed in a XSS safe way. + * + * Generate a correct link for the atom:self element. + * + * @since 2.5.0 + */ +function self_link() { + /** + * Filters the current feed URL. + * + * @since 3.6.0 + * + * @see set_url_scheme() + * @see wp_unslash() + * + * @param string $feed_link The link for the feed with set URL scheme. + */ + echo esc_url( apply_filters( 'self_link', get_self_link() ) ); +} + +/** + * Get the UTC time of the most recently modified post from WP_Query. + * + * If viewing a comment feed, the time of the most recently modified + * comment will be returned. + * + * @global WP_Query $wp_query WordPress Query object. + * + * @since 5.2.0 + * + * @param string $format Date format string to return the time in. + * @return string|false The time in requested format, or false on failure. + */ +function get_feed_build_date( $format ) { + global $wp_query; + + $datetime = false; + $max_modified_time = false; + $utc = new DateTimeZone( 'UTC' ); + + if ( ! empty( $wp_query ) && $wp_query->have_posts() ) { + // Extract the post modified times from the posts. + $modified_times = wp_list_pluck( $wp_query->posts, 'post_modified_gmt' ); + + // If this is a comment feed, check those objects too. + if ( $wp_query->is_comment_feed() && $wp_query->comment_count ) { + // Extract the comment modified times from the comments. + $comment_times = wp_list_pluck( $wp_query->comments, 'comment_date_gmt' ); + + // Add the comment times to the post times for comparison. + $modified_times = array_merge( $modified_times, $comment_times ); + } + + // Determine the maximum modified time. + $datetime = date_create_immutable_from_format( 'Y-m-d H:i:s', max( $modified_times ), $utc ); + } + + if ( false === $datetime ) { + // Fall back to last time any post was modified or published. + $datetime = date_create_immutable_from_format( 'Y-m-d H:i:s', get_lastpostmodified( 'GMT' ), $utc ); + } + + if ( false !== $datetime ) { + $max_modified_time = $datetime->format( $format ); + } + + /** + * Filters the date the last post or comment in the query was modified. + * + * @since 5.2.0 + * + * @param string|false $max_modified_time Date the last post or comment was modified in the query, in UTC. + * False on failure. + * @param string $format The date format requested in get_feed_build_date(). + */ + return apply_filters( 'get_feed_build_date', $max_modified_time, $format ); +} + +/** + * Return the content type for specified feed type. + * + * @since 2.8.0 + * + * @param string $type Type of feed. Possible values include 'rss', rss2', 'atom', and 'rdf'. + */ +function feed_content_type( $type = '' ) { + if ( empty( $type ) ) { + $type = get_default_feed(); + } + + $types = array( + 'rss' => 'application/rss+xml', + 'rss2' => 'application/rss+xml', + 'rss-http' => 'text/xml', + 'atom' => 'application/atom+xml', + 'rdf' => 'application/rdf+xml', + ); + + $content_type = ( ! empty( $types[ $type ] ) ) ? $types[ $type ] : 'application/octet-stream'; + + /** + * Filters the content type for a specific feed type. + * + * @since 2.8.0 + * + * @param string $content_type Content type indicating the type of data that a feed contains. + * @param string $type Type of feed. Possible values include 'rss', rss2', 'atom', and 'rdf'. + */ + return apply_filters( 'feed_content_type', $content_type, $type ); +} + +/** + * Build SimplePie object based on RSS or Atom feed from URL. + * + * @since 2.8.0 + * + * @param string|string[] $url URL of feed to retrieve. If an array of URLs, the feeds are merged + * using SimplePie's multifeed feature. + * See also {@link http://simplepie.org/wiki/faq/typical_multifeed_gotchas} + * @return SimplePie|WP_Error SimplePie object on success or WP_Error object on failure. + */ +function fetch_feed( $url ) { + if ( ! class_exists( 'SimplePie', false ) ) { + require_once ABSPATH . WPINC . '/class-simplepie.php'; + } + + require_once ABSPATH . WPINC . '/class-wp-feed-cache.php'; + require_once ABSPATH . WPINC . '/class-wp-feed-cache-transient.php'; + require_once ABSPATH . WPINC . '/class-wp-simplepie-file.php'; + require_once ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php'; + + $feed = new SimplePie(); + + $feed->set_sanitize_class( 'WP_SimplePie_Sanitize_KSES' ); + // We must manually overwrite $feed->sanitize because SimplePie's + // constructor sets it before we have a chance to set the sanitization class. + $feed->sanitize = new WP_SimplePie_Sanitize_KSES(); + + $feed->set_cache_class( 'WP_Feed_Cache' ); + $feed->set_file_class( 'WP_SimplePie_File' ); + + $feed->set_feed_url( $url ); + /** This filter is documented in wp-includes/class-wp-feed-cache-transient.php */ + $feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', 12 * HOUR_IN_SECONDS, $url ) ); + /** + * Fires just before processing the SimplePie feed object. + * + * @since 3.0.0 + * + * @param SimplePie $feed SimplePie feed object (passed by reference). + * @param string|string[] $url URL of feed or array of URLs of feeds to retrieve. + */ + do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) ); + $feed->init(); + $feed->set_output_encoding( get_option( 'blog_charset' ) ); + + if ( $feed->error() ) { + return new WP_Error( 'simplepie-error', $feed->error() ); + } + + return $feed; +} diff --git a/wp-includes/fonts/dashicons.eot b/wp-includes/fonts/dashicons.eot new file mode 100644 index 0000000000000000000000000000000000000000..f6c7a5e54227c5c655ab5321c477cd2c9e1598cf GIT binary patch literal 44868 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 gx31P0(_RF+7vS^7MDfr~PctX2DdNrT_-admin-appearanceadmin-collapseadmin-commentsadmin-customizeradmin-genericadmin-homeadmin-linksadmin-mediaadmin-multisiteadmin-networkadmin-pageadmin-pluginsadmin-postadmin-settingsadmin-site-altadmin-site-alt2admin-site-alt3admin-siteadmin-toolsadmin-usersalbumalign-centeralign-leftalign-nonealign-rightanalyticsarchivearrow-down-altarrow-down-alt2arrow-downarrow-left-altarrow-left-alt2arrow-leftarrow-right-altarrow-right-alt2arrow-rightarrow-up-altarrow-up-alt2arrow-up-duplicatearrow-upartawardsbackupbook-altbookbuddicons-activitybuddicons-communitybuddicons-forumsbuddicons-friendsbuddicons-groupsbuddicons-pmbuddicons-repliesbuddicons-topicsbuddicons-trackingbuildingbusinessmanbusinesspersonbusinesswomancalendar-altcalendarcamera-altcameracarrotcartcategorychart-areachart-barchart-linechart-pieclipboardclockcloudcode-standardscolor-pickercontrols-backcontrols-forwardcontrols-pausecontrols-playcontrols-repeatcontrols-skipbackcontrols-skipforwardcontrols-volumeoffcontrols-volumeondashboarddesktopdismissdownloadedit-largeediteditor-aligncentereditor-alignlefteditor-alignrighteditor-boldeditor-breakeditor-code-duplicateeditor-codeeditor-contracteditor-customchareditor-expandeditor-helpeditor-indenteditor-insertmoreeditor-italiceditor-justifyeditor-kitchensinkeditor-ltreditor-ol-rtleditor-oleditor-outdenteditor-paragrapheditor-paste-texteditor-paste-wordeditor-quoteeditor-removeformattingeditor-rtleditor-spellcheckeditor-strikethrougheditor-tableeditor-textcoloreditor-uleditor-underlineeditor-unlinkeditor-videoemail-altemail-alt2emailexcerpt-viewexternalfacebook-altfacebookfeedbackfilterflagformat-asideformat-audioformat-chatformat-galleryformat-imageformat-quoteformat-statusformat-videoformsgoogleplusgrid-viewgroupsalign-full-widthalign-pull-leftalign-pull-rightalign-wideblock-defaultbuttoncloud-savedcloud-uploadcolumnscover-imageellipsisembed-audioembed-genericembed-photoembed-postembed-videoexitheadinghtmlinfo-outlineinsert-afterinsert-beforeinsertremovesavedshortcodetable-col-aftertable-col-beforetable-col-deletetable-row-aftertable-row-beforetable-row-deletehammerhearthiddenid-altidimage-cropimage-filterimage-flip-horizontalimage-flip-verticalimage-rotate-leftimage-rotate-rightimage-rotateimages-altimages-alt2index-cardinfoinstagramlaptoplayoutleftrightlightbulblist-viewlocation-altlocationlock-duplicatelockmarkermedia-archivemedia-audiomedia-codemedia-defaultmedia-documentmedia-interactivemedia-spreadsheetmedia-textmedia-videomegaphonemenu-altmenu-alt2menu-alt3menumicrophonemigrateminusmoneymovenametagnetworkingno-altnopalmtreepaperclipperformancephoneplaylist-audioplaylist-videoplugins-checkedplus-altplus-alt2plusportfoliopost-statuspressthisproductsrandomizeredorest-apirssschedulescreenoptionssearchshare-altshare-alt2shareshield-altshieldslidessmartphonesmileysortsosstar-emptystar-filledstar-halfstickystoretablettagtagcloudtestimonialtext-pagetextthumbs-downthumbs-uptickets-altticketstidetranslationtrashtwitter-alttwitterundouniversal-access-altuniversal-accessunlockupdate-altupdateuploadvaultvideo-altvideo-alt2video-alt3visibilitywarningwelcome-add-pagewelcome-commentswelcome-learn-morewelcome-view-sitewelcome-widgets-menuswelcome-write-blogwordpress-altwordpressyes-altyes \ No newline at end of file diff --git a/wp-includes/fonts/dashicons.ttf b/wp-includes/fonts/dashicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..696a5ebf56f3ede3e3fa3dbbda0567de35789416 GIT binary patch literal 44696 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 literal 0 HcmV?d00001 diff --git a/wp-includes/fonts/dashicons.woff b/wp-includes/fonts/dashicons.woff new file mode 100644 index 0000000000000000000000000000000000000000..a13f9cf6499823856009da13ee24f41933bed3d4 GIT binary patch literal 26124 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 literal 0 HcmV?d00001 diff --git a/wp-includes/fonts/dashicons.woff2 b/wp-includes/fonts/dashicons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e3a3a3aa6623be8302e6b47732b39dc4a70d4bc6 GIT binary patch literal 21004 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 array(), + 'quote' => array(), + 'dash' => array(), + ); + $dynamic_replacements = array( + 'apos' => array(), + 'quote' => array(), + 'dash' => array(), + ); + $dynamic = array(); + $spaces = wp_spaces_regexp(); + + // '99' and '99" are ambiguous among other patterns; assume it's an abbreviated year at the end of a quotation. + if ( "'" !== $apos || "'" !== $closing_single_quote ) { + $dynamic[ '/\'(\d\d)\'(?=\Z|[.,:;!?)}\-\]]|>|' . $spaces . ')/' ] = $apos_flag . '$1' . $closing_single_quote; + } + if ( "'" !== $apos || '"' !== $closing_quote ) { + $dynamic[ '/\'(\d\d)"(?=\Z|[.,:;!?)}\-\]]|>|' . $spaces . ')/' ] = $apos_flag . '$1' . $closing_quote; + } + + // '99 '99s '99's (apostrophe) But never '9 or '99% or '999 or '99.0. + if ( "'" !== $apos ) { + $dynamic['/\'(?=\d\d(?:\Z|(?![%\d]|[.,]\d)))/'] = $apos_flag; + } + + // Quoted numbers like '0.42'. + if ( "'" !== $opening_single_quote && "'" !== $closing_single_quote ) { + $dynamic[ '/(?<=\A|' . $spaces . ')\'(\d[.,\d]*)\'/' ] = $open_sq_flag . '$1' . $closing_single_quote; + } + + // Single quote at start, or preceded by (, {, <, [, ", -, or spaces. + if ( "'" !== $opening_single_quote ) { + $dynamic[ '/(?<=\A|[([{"\-]|<|' . $spaces . ')\'/' ] = $open_sq_flag; + } + + // Apostrophe in a word. No spaces, double apostrophes, or other punctuation. + if ( "'" !== $apos ) { + $dynamic[ '/(?&/\[\]\x00-\x20=]++)@', $text, $matches ); + $tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] ); + $found_shortcodes = ! empty( $tagnames ); + $shortcode_regex = $found_shortcodes ? _get_wptexturize_shortcode_regex( $tagnames ) : ''; + $regex = _get_wptexturize_split_regex( $shortcode_regex ); + + $textarr = preg_split( $regex, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); + + foreach ( $textarr as &$curl ) { + // Only call _wptexturize_pushpop_element if $curl is a delimiter. + $first = $curl[0]; + if ( '<' === $first ) { + if ( ''; + $quote_pattern = "/$needle(?=\\Z|[.,:;!?)}\\-\\]]|>|" . $spaces . ')/'; + $prime_pattern = "/(?<=\\d)$needle/"; + $flag_after_digit = "/(?<=\\d)$flag/"; + $flag_no_digit = "/(? &$sentence ) { + if ( false === strpos( $sentence, $needle ) ) { + continue; + } elseif ( 0 !== $key && 0 === substr_count( $sentence, $close_quote ) ) { + $sentence = preg_replace( $quote_pattern, $flag, $sentence, -1, $count ); + if ( $count > 1 ) { + // This sentence appears to have multiple closing quotes. Attempt Vulcan logic. + $sentence = preg_replace( $flag_no_digit, $close_quote, $sentence, -1, $count2 ); + if ( 0 === $count2 ) { + // Try looking for a quote followed by a period. + $count2 = substr_count( $sentence, "$flag." ); + if ( $count2 > 0 ) { + // Assume the rightmost quote-period match is the end of quotation. + $pos = strrpos( $sentence, "$flag." ); + } else { + // When all else fails, make the rightmost candidate a closing quote. + // This is most likely to be problematic in the context of bug #18549. + $pos = strrpos( $sentence, $flag ); + } + $sentence = substr_replace( $sentence, $close_quote, $pos, strlen( $flag ) ); + } + // Use conventional replacement on any remaining primes and quotes. + $sentence = preg_replace( $prime_pattern, $prime, $sentence ); + $sentence = preg_replace( $flag_after_digit, $prime, $sentence ); + $sentence = str_replace( $flag, $close_quote, $sentence ); + } elseif ( 1 == $count ) { + // Found only one closing quote candidate, so give it priority over primes. + $sentence = str_replace( $flag, $close_quote, $sentence ); + $sentence = preg_replace( $prime_pattern, $prime, $sentence ); + } else { + // No closing quotes found. Just run primes pattern. + $sentence = preg_replace( $prime_pattern, $prime, $sentence ); + } + } else { + $sentence = preg_replace( $prime_pattern, $prime, $sentence ); + $sentence = preg_replace( $quote_pattern, $close_quote, $sentence ); + } + if ( '"' == $needle && false !== strpos( $sentence, '"' ) ) { + $sentence = str_replace( '"', $close_quote, $sentence ); + } + } + + return implode( $open_quote, $sentences ); +} + +/** + * Search for disabled element tags. Push element to stack on tag open and pop + * on tag close. + * + * Assumes first char of $text is tag opening and last char is tag closing. + * Assumes second char of $text is optionally '/' to indicate closing as in . + * + * @since 2.9.0 + * @access private + * + * @param string $text Text to check. Must be a tag like `` or `[shortcode]`. + * @param string[] $stack Array of open tag elements. + * @param string[] $disabled_elements Array of tag names to match against. Spaces are not allowed in tag names. + */ +function _wptexturize_pushpop_element( $text, &$stack, $disabled_elements ) { + // Is it an opening tag or closing tag? + if ( isset( $text[1] ) && '/' !== $text[1] ) { + $opening_tag = true; + $name_offset = 1; + } elseif ( 0 == count( $stack ) ) { + // Stack is empty. Just stop. + return; + } else { + $opening_tag = false; + $name_offset = 2; + } + + // Parse out the tag name. + $space = strpos( $text, ' ' ); + if ( false === $space ) { + $space = -1; + } else { + $space -= $name_offset; + } + $tag = substr( $text, $name_offset, $space ); + + // Handle disabled tags. + if ( in_array( $tag, $disabled_elements ) ) { + if ( $opening_tag ) { + /* + * This disables texturize until we find a closing tag of our type + * (e.g.
                ) even if there was invalid nesting before that.
                +			 *
                +			 * Example: in the case 
                sadsadasd"baba"
                + * "baba" won't be texturized. + */ + + array_push( $stack, $tag ); + } elseif ( end( $stack ) == $tag ) { + array_pop( $stack ); + } + } +} + +/** + * Replaces double line-breaks with paragraph elements. + * + * A group of regex replaces used to identify text formatted with newlines and + * replace double line-breaks with HTML paragraph tags. The remaining line-breaks + * after conversion become <
                > tags, unless $br is set to '0' or 'false'. + * + * @since 0.71 + * + * @param string $pee The text which has to be formatted. + * @param bool $br Optional. If set, this will convert all remaining line-breaks + * after paragraphing. Default true. + * @return string Text which has been converted into correct paragraph tags. + */ +function wpautop( $pee, $br = true ) { + $pre_tags = array(); + + if ( trim( $pee ) === '' ) { + return ''; + } + + // Just to make things a little easier, pad the end. + $pee = $pee . "\n"; + + /* + * Pre tags shouldn't be touched by autop. + * Replace pre tags with placeholders and bring them back after autop. + */ + if ( strpos( $pee, '', $pee ); + $last_pee = array_pop( $pee_parts ); + $pee = ''; + $i = 0; + + foreach ( $pee_parts as $pee_part ) { + $start = strpos( $pee_part, ''; + + $pee .= substr( $pee_part, 0, $start ) . $name; + $i++; + } + + $pee .= $last_pee; + } + // Change multiple
                's into two line breaks, which will turn into paragraphs. + $pee = preg_replace( '|\s*|', "\n\n", $pee ); + + $allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; + + // Add a double line break above block-level opening tags. + $pee = preg_replace( '!(<' . $allblocks . '[\s/>])!', "\n\n$1", $pee ); + + // Add a double line break below block-level closing tags. + $pee = preg_replace( '!()!', "$1\n\n", $pee ); + + // Add a double line break after hr tags, which are self closing. + $pee = preg_replace( '!()!', "$1\n\n", $pee ); + + // Standardize newline characters to "\n". + $pee = str_replace( array( "\r\n", "\r" ), "\n", $pee ); + + // Find newlines in all elements and add placeholders. + $pee = wp_replace_in_html_tags( $pee, array( "\n" => ' ' ) ); + + // Collapse line breaks before and after ', $pee ); + } + + /* + * Collapse line breaks inside elements, before and elements + * so they don't get autop'd. + */ + if ( strpos( $pee, '' ) !== false ) { + $pee = preg_replace( '|(]*>)\s*|', '$1', $pee ); + $pee = preg_replace( '|\s*|', '', $pee ); + $pee = preg_replace( '%\s*(]*>)\s*%', '$1', $pee ); + } + + /* + * Collapse line breaks inside
                ').attr("id",h)).appendTo(g.getBody()),e=g.dom.createRng(),l===f&&ge.ie?(r.empty().append('

                \xa0

                ').append(l),e.setStartAfter(r[0].firstChild.firstChild),e.setEndAfter(l)):(r.empty().append("\xa0").append(l).append("\xa0"),e.setStart(r[0].firstChild,1),e.setEnd(r[0].lastChild,0)),r.css({top:m.getPos(n,g.getBody()).y}),r[0].focus(),(o=g.selection.getSel()).removeAllRanges(),o.addRange(e),U(Zi(cr.fromDom(g.getBody()),"*[data-mce-selected]"),function(e){Tr(e,"data-mce-selected")}),n.setAttribute("data-mce-selected","1"),p=n,C(),e)):null)},l=function(){p&&(p.removeAttribute("data-mce-selected"),ia(cr.fromDom(g.getBody()),"#"+h).each(Vi),p=null),ia(cr.fromDom(g.getBody()),"#"+h).each(Vi),p=null},C=function(){o.hide()};return ge.ceFalse&&(function(){g.on("mouseup",function(e){var t=s();t.collapsed&&mh(g,e.clientX,e.clientY)&&u(sg(g,t,!1))}),g.on("click",function(e){var t;(t=Rv(g,e.target))&&(Av(t)&&(e.preventDefault(),g.focus()),_v(t)&&g.dom.isChildOf(t,g.selection.getNode())&&l())}),g.on("blur NewBlock",function(){l()}),g.on("ResizeWindow FullscreenStateChanged",function(){return o.reposition()});var n,r,i=function(e,t){var n,r,o=g.dom.getParent(e,g.dom.isBlock),i=g.dom.getParent(t,g.dom.isBlock);return!(!o||!g.dom.isChildOf(o,i)||!1!==Av(Rv(g,o)))||o&&(n=o,r=i,!(g.dom.getParent(n,g.dom.isBlock)===g.dom.getParent(r,g.dom.isBlock)))&&function(e){var t=Js(e);if(!e.firstChild)return!1;var n=_u.before(e.firstChild),r=t.next(n);return r&&!Lf(r)&&!Ff(r)}(o)};r=!1,(n=g).on("touchstart",function(){r=!1}),n.on("touchmove",function(){r=!0}),n.on("touchend",function(e){var t=Rv(n,e.target);Av(t)&&(r||(e.preventDefault(),c(ug(n,t))))}),g.on("mousedown",function(e){var t,n=e.target;if((n===a||"HTML"===n.nodeName||g.dom.isChildOf(n,a))&&!1!==mh(g,e.clientX,e.clientY))if(t=Rv(g,n))Av(t)?(e.preventDefault(),c(ug(g,t))):(l(),_v(t)&&e.shiftKey||Sv(e.clientX,e.clientY,g.selection.getRng())||(C(),g.selection.placeCaretAt(e.clientX,e.clientY)));else if(!1===gs(n)){l(),C();var r=Ev(a,e.clientX,e.clientY);if(r&&!i(e.target,r.node)){e.preventDefault();var o=v(1,r.node,r.before,!1);g.getBody().focus(),u(o)}}}),g.on("keypress",function(e){kv.modifierPressed(e)||(e.keyCode,Av(g.selection.getNode())&&e.preventDefault())}),g.on("getSelectionRange",function(e){var t=e.range;if(p){if(!p.parentNode)return void(p=null);(t=t.cloneRange()).selectNode(p),e.range=t}}),g.on("setSelectionRange",function(e){var t;(t=c(e.range,e.forward))&&(e.range=t)}),g.on("AfterSetSelectionRange",function(e){var t,n=e.range;b(n)||"mcepastebin"===n.startContainer.parentNode.id||C(),t=n.startContainer.parentNode,g.dom.hasClass(t,"mce-offscreen-selection")||l()}),g.on("copy",function(e){var t,n=e.clipboardData;if(!e.isDefaultPrevented()&&e.clipboardData&&!ge.ie){var r=(t=g.dom.get(h))?t.getElementsByTagName("*")[0]:t;r&&(e.preventDefault(),n.clearData(),n.setData("text/html",r.outerHTML),n.setData("text/plain",r.outerText))}}),lv(g),Tv(g)}(),e=g.contentStyles,t=".mce-content-body",e.push(o.getCss()),e.push(t+" .mce-offscreen-selection {position: absolute;left: -9999999999px;max-width: 1000000px;}"+t+" *[contentEditable=false] {cursor: default;}"+t+" *[contentEditable=true] {cursor: text;}")),{showCaret:v,showBlockCaretContainer:function(e){e.hasAttribute("data-mce-caret")&&(Pa(e),u(s()),g.selection.scrollIntoView(e[0]))},hideFakeCaret:C,destroy:function(){o.destroy(),p=null}}},Bv=function(e,t,n){var r,o,i,a,u=1;for(a=e.getShortEndedElements(),(i=/<([!?\/])?([A-Za-z0-9\-_\:\.]+)((?:\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\/|\s+)>/g).lastIndex=r=n;o=i.exec(t);){if(r=i.lastIndex,"/"===o[1])u--;else if(!o[1]){if(o[2]in a)continue;u++}if(0===u)break}return r},Ov=function(e,t){var n=e.exec(t);if(n){var r=n[1],o=n[2];return"string"==typeof r&&"data-mce-bogus"===r.toLowerCase()?o:null}return null};function Pv(z,U){void 0===U&&(U=mi());var e=function(){};!1!==(z=z||{}).fix_self_closing&&(z.fix_self_closing=!0);var V=z.comment?z.comment:e,j=z.cdata?z.cdata:e,H=z.text?z.text:e,q=z.start?z.start:e,$=z.end?z.end:e,W=z.pi?z.pi:e,K=z.doctype?z.doctype:e;return{parse:function(e){var t,n,r,d,o,i,a,m,u,s,g,c,p,l,f,h,v,y,b,C,x,w,N,E,S,T,k,_,A,R=0,D=[],B=0,O=ni.decode,P=Jt.makeMap("src,href,data,background,formaction,poster,xlink:href"),I=/((java|vb)script|mhtml):/i,L=function(e){var t,n;for(t=D.length;t--&&D[t].name!==e;);if(0<=t){for(n=D.length-1;t<=n;n--)(e=D[n]).valid&&$(e.name);D.length=t}},F=function(e,t,n,r,o){var i,a,u,s,c;if(n=(t=t.toLowerCase())in g?t:O(n||r||o||""),p&&!m&&0==(0===(u=t).indexOf("data-")||0===u.indexOf("aria-"))){if(!(i=y[t])&&b){for(a=b.length;a--&&!(i=b[a]).pattern.test(t););-1===a&&(i=null)}if(!i)return;if(i.validValues&&!(n in i.validValues))return}if(P[t]&&!z.allow_script_urls){var l=n.replace(/[\s\u0000-\u001F]+/g,"");try{l=decodeURIComponent(l)}catch(f){l=unescape(l)}if(I.test(l))return;if(c=l,!(s=z).allow_html_data_urls&&(/^data:image\//i.test(c)?!1===s.allow_svg_data_urls&&/^data:image\/svg\+xml/i.test(c):/^data:/i.test(c)))return}m&&(t in P||0===t.indexOf("on"))||(d.map[t]=n,d.push({name:t,value:n}))};for(S=new RegExp("<(?:(?:!--([\\w\\W]*?)--\x3e)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g"),T=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,s=U.getShortEndedElements(),E=z.self_closing_elements||U.getSelfClosingElements(),g=U.getBoolAttrs(),p=z.validate,u=z.remove_internals,A=z.fix_self_closing,k=U.getSpecialElements(),N=e+">";t=S.exec(N);){if(Re.length){H(O(e.substr(t.index))),R=t.index+t[0].length;continue}":"===(n=n.toLowerCase()).charAt(0)&&(n=n.substr(1)),c=n in s,A&&E[n]&&0"===n.charAt(0)&&(n=" "+n),z.allow_conditional_comments||"[if"!==n.substr(0,3).toLowerCase()||(n=" "+n),V(n)):(n=t[2])?j(n.replace(//g,"")):(n=t[3])?K(n):(n=t[4])&&W(n,t[5]);R=t.index+t[0].length}for(R]*data-mce-bogus="all"[^>]*>/g,d=e.schema;for(u=e.getTempAttrs(),s=l,c=new RegExp(["\\s?("+u.join("|")+')="[^"]+"'].join("|"),"gi"),l=s.replace(c,""),a=d.getShortEndedElements();i=f.exec(l);)r=f.lastIndex,o=i[0].length,n=a[i[1]]?r:Iv.findEndTag(d,l,r),l=l.substring(0,r-o)+l.substring(n),f.lastIndex=r-o;return wa(l)},Fv={trimExternal:Lv,trimInternal:Lv},Mv=0,zv=2,Uv=1,Vv=function(g,p){var e=g.length+p.length+2,h=new Array(e),v=new Array(e),c=function(e,t,n,r,o){var i=l(e,t,n,r);if(null===i||i.start===t&&i.diag===t-r||i.end===e&&i.diag===e-n)for(var a=e,u=n;a")?Kv(r):Xv(t)},Qv=function(e,t,n){"fragmented"===t.type?$v(t.fragments,e.getBody()):e.setContent(t.content,{format:"raw"}),e.selection.moveToBookmark(n?t.beforeBookmark:t.bookmark)},Zv=function(e,t){return!(!e||!t)&&(r=t,Yv(e)===Yv(r)||(n=t,Gv(e)===Gv(n)));var n,r};function ey(u){var s,r,o=this,c=0,l=[],t=0,f=function(){return 0===t},i=function(e){f()&&(o.typing=e)},d=function(e){u.setDirty(e)},a=function(e){i(!1),o.add({},e)},n=function(){o.typing&&(i(!1),o.add())};return u.on("init",function(){o.add()}),u.on("BeforeExecCommand",function(e){var t=e.command;"Undo"!==t&&"Redo"!==t&&"mceRepaint"!==t&&(n(),o.beforeChange())}),u.on("ExecCommand",function(e){var t=e.command;"Undo"!==t&&"Redo"!==t&&"mceRepaint"!==t&&a(e)}),u.on("ObjectResizeStart Cut",function(){o.beforeChange()}),u.on("SaveContent ObjectResized blur",a),u.on("DragEnd",a),u.on("KeyUp",function(e){var t=e.keyCode;e.isDefaultPrevented()||((33<=t&&t<=36||37<=t&&t<=40||45===t||e.ctrlKey)&&(a(),u.nodeChanged()),46!==t&&8!==t||u.nodeChanged(),r&&o.typing&&!1===Zv(Jv(u),l[0])&&(!1===u.isDirty()&&(d(!0),u.fire("change",{level:l[0],lastLevel:null})),u.fire("TypingUndo"),r=!1,u.nodeChanged()))}),u.on("KeyDown",function(e){var t=e.keyCode;if(!e.isDefaultPrevented())if(33<=t&&t<=36||37<=t&&t<=40||45===t)o.typing&&a(e);else{var n=e.ctrlKey&&!e.altKey||e.metaKey;!(t<16||20i.custom_undo_redo_levels){for(n=0;n
                ").append(n.childNodes)}))},ry[ty="pre"]||(ry[ty]=[]),ry[ty].push(ny);var ay=function(e,t){iy(ry[e],function(e){e(t)})},uy=/^(src|href|style)$/,sy=Jt.each,cy=wc.isEq,ly=function(e,t,n){return e.isChildOf(t,n)&&t!==n&&!e.isBlock(n)},fy=function(e,t,n){var r,o,i;return r=t[n?"startContainer":"endContainer"],o=t[n?"startOffset":"endOffset"],jo.isElement(r)&&(i=r.childNodes.length-1,!n&&o&&o--,r=r.childNodes[i=r.nodeValue.length&&(r=new po(r,e.getBody()).next()||r),jo.isText(r)&&!n&&0===o&&(r=new po(r,e.getBody()).prev()||r),r},dy=function(e,t,n,r){var o=e.create(n,r);return t.parentNode.insertBefore(o,t),o.appendChild(t),o},my=function(e,t,n,r,o){var i=cr.fromDom(t),a=cr.fromDom(e.create(r,o)),u=n?Kr(i):Wr(i);return zi(a,u),n?(Ii(i,a),Fi(a,i)):(Li(i,a),Mi(a,i)),a.dom()},gy=function(e,t,n,r){return!(t=wc.getNonWhiteSpaceSibling(t,n,r))||"BR"===t.nodeName||e.isBlock(t)},py=function(e,n,r,o,i){var t,a,u,s,c,l,f,d,m,g,p,h,v,y,b=e.dom;if(c=b,!(cy(l=o,(f=n).inline)||cy(l,f.block)||(f.selector?jo.isElement(l)&&c.is(l,f.selector):void 0)||(s=o,n.links&&"A"===s.tagName)))return!1;if("all"!==n.remove)for(sy(n.styles,function(e,t){e=wc.normalizeStyleValue(b,wc.replaceVars(e,r),t),"number"==typeof t&&(t=e,i=0),(n.remove_similar||!i||cy(wc.getStyle(b,i,t),e))&&b.setStyle(o,t,""),u=1}),u&&""===b.getAttrib(o,"style")&&(o.removeAttribute("style"),o.removeAttribute("data-mce-style")),sy(n.attributes,function(e,t){var n;if(e=wc.replaceVars(e,r),"number"==typeof t&&(t=e,i=0),!i||cy(b.getAttrib(i,t),e)){if("class"===t&&(e=b.getAttrib(o,t))&&(n="",sy(e.split(/\s+/),function(e){/mce\-\w+/.test(e)&&(n+=(n?" ":"")+e)}),n))return void b.setAttrib(o,t,n);"class"===t&&o.removeAttribute("className"),uy.test(t)&&o.removeAttribute("data-mce-"+t),o.removeAttribute(t)}}),sy(n.classes,function(e){e=wc.replaceVars(e,r),i&&!b.hasClass(i,e)||b.removeClass(o,e)}),a=b.getAttribs(o),t=0;t)\s*/g,"$1"),Jt.map(e.split(/(?:>|\s+(?![^\[\]]+\]))/),function(e){var t=Jt.map(e.split(/(?:~\+|~|\+)/),jy),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[]},qy=function(n,e){var t,r,o,i,a,u,s="";if(!1===(u=n.settings.preview_styles))return"";"string"!=typeof u&&(u="font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow");var c=function(e){return e.replace(/%(\w+)/g,"")};if("string"==typeof e){if(!(e=n.formatter.get(e)))return;e=e[0]}return"preview"in e&&!1===(u=e.preview)?"":(t=e.block||e.inline||"span",(i=Hy(e.selector)).length?(i[0].name||(i[0].name=t),t=e.selector,r=Vy(i,n)):r=Vy([t],n),o=Uy.select(t,r)[0]||r.firstChild,zy(e.styles,function(e,t){(e=c(e))&&Uy.setStyle(o,t,e)}),zy(e.attributes,function(e,t){(e=c(e))&&Uy.setAttrib(o,t,e)}),zy(e.classes,function(e){e=c(e),Uy.hasClass(o,e)||Uy.addClass(o,e)}),n.fire("PreviewFormats"),Uy.setStyles(r,{position:"absolute",left:-65535}),n.getBody().appendChild(r),a=Uy.getStyle(n.getBody(),"fontSize",!0),a=/px$/.test(a)?parseInt(a,10):0,zy(u.split(" "),function(e){var t=Uy.getStyle(o,e,!0);if(!("background-color"===e&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)&&(t=Uy.getStyle(n.getBody(),e,!0),"#ffffff"===Uy.toHex(t).toLowerCase())||"color"===e&&"#000000"===Uy.toHex(t).toLowerCase())){if("font-size"===e&&/em|%$/.test(t)){if(0===a)return;t=parseFloat(t)/(/%$/.test(t)?100:1)*a+"px"}"border"===e&&t&&(s+="padding:0 2px;"),s+=e+":"+t+";"}}),n.fire("AfterPreviewFormats"),Uy.remove(r),s)},$y=function(e,t,n,r,o){var i=t.get(n);!zm.match(e,n,r,o)||"toggle"in i[0]&&!i[0].toggle?Iy.applyFormat(e,n,r,o):vy(e,n,r,o)},Wy=function(e){e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(var t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])};function Ky(e){var t,n,r,o=(t=e,n={},(r=function(e,t){e&&("string"!=typeof e?Jt.each(e,function(e,t){r(t,e)}):(t=t.length?t:[t],Jt.each(t,function(e){"undefined"==typeof e.deep&&(e.deep=!e.selector),"undefined"==typeof e.split&&(e.split=!e.selector||e.inline),"undefined"==typeof e.remove&&e.selector&&!e.inline&&(e.remove="none"),e.selector&&e.inline&&(e.mixed=!0,e.block_expand=!0),"string"==typeof e.classes&&(e.classes=e.classes.split(/\s+/))}),n[e]=t))})(My.get(t.dom)),r(t.settings.formats),{get:function(e){return e?n[e]:n},register:r,unregister:function(e){return e&&n[e]&&delete n[e],n}}),i=qi(null);return Wy(e),Qm(e),{get:o.get,register:o.register,unregister:o.unregister,apply:d(Iy.applyFormat,e),remove:d(vy,e),toggle:d($y,e,o),match:d(zm.match,e),matchAll:d(zm.matchAll,e),matchNode:d(zm.matchNode,e),canApply:d(zm.canApply,e),formatChanged:d(Fy,e,i),getCssText:d(qy,e)}}var Xy,Yy=Object.prototype.hasOwnProperty,Gy=(Xy=function(e,t){return t},function(){for(var e=new Array(arguments.length),t=0;t)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")};i--;)r=(n=e[i]).firstChild?n.firstChild.value:"","script"===t?((o=n.attr("type"))&&n.attr("type","mce-no/type"===o?null:o.replace(/^mce\-/,"")),"xhtml"===s.element_format&&0")):"xhtml"===s.element_format&&0k(n)?(C=_(b*y),b=_(C/y)):(b=_(C/y),C=_(b*y))),N.setStyles(D(s),{width:b,height:C}),r=0<(r=f.startPos.x+t)?r:0,o=0<(o=f.startPos.y+n)?o:0,N.setStyles(c,{left:r,top:o,display:"block"}),c.innerHTML=b+" × "+C,f[2]<0&&s.clientWidth<=b&&N.setStyle(s,"left",g+(h-b)),f[3]<0&&s.clientHeight<=C&&N.setStyle(s,"top",p+(v-C)),(t=A.scrollWidth-x)+(n=A.scrollHeight-w)!=0&&N.setStyles(c,{left:r-t,top:o-n}),i||(Np(a,u,h,v),i=!0)},P=function(){i=!1;var e=function(e,t){t&&(u.style[e]||!a.schema.isValid(u.nodeName.toLowerCase(),e)?N.setStyle(D(u),e,t):N.setAttrib(D(u),e,t))};e("width",b),e("height",C),N.unbind(S,"mousemove",O),N.unbind(S,"mouseup",P),T!==S&&(N.unbind(T,"mousemove",O),N.unbind(T,"mouseup",P)),N.remove(s),N.remove(c),o(u),Ep(a,u,b,C),N.setAttrib(u,"style",N.getAttrib(u,"style")),a.nodeChanged()},o=function(e){var t,r,o,n,i;I(),M(),t=N.getPos(e,A),g=t.x,p=t.y,i=e.getBoundingClientRect(),r=i.width||i.right-i.left,o=i.height||i.bottom-i.top,u!==e&&(u=e,b=C=0),n=a.fire("ObjectSelected",{target:e}),B(e)&&!n.isDefaultPrevented()?E(l,function(n,e){var t;(t=N.get("mceResizeHandle"+e))&&N.remove(t),t=N.add(A,"div",{id:"mceResizeHandle"+e,"data-mce-bogus":"all","class":"mce-resizehandle",unselectable:!0,style:"cursor:"+e+"-resize; margin:0; padding:0"}),11===ge.ie&&(t.contentEditable=!1),N.bind(t,"mousedown",function(e){var t;e.stopImmediatePropagation(),e.preventDefault(),d=(t=e).screenX,m=t.screenY,h=D(u).clientWidth,v=D(u).clientHeight,y=v/h,(f=n).startPos={x:r*n[0]+g,y:o*n[1]+p},x=A.scrollWidth,w=A.scrollHeight,s=u.cloneNode(!0),N.addClass(s,"mce-clonedresizable"),N.setAttrib(s,"data-mce-bogus","all"),s.contentEditable=!1,s.unSelectabe=!0,N.setStyles(s,{left:g,top:p,margin:0}),s.removeAttribute("data-mce-selected"),A.appendChild(s),N.bind(S,"mousemove",O),N.bind(S,"mouseup",P),T!==S&&(N.bind(T,"mousemove",O),N.bind(T,"mouseup",P)),c=N.add(A,"div",{"class":"mce-resize-helper","data-mce-bogus":"all"},h+" × "+v)}),n.elm=t,N.setStyles(t,{left:r*n[0]+g-t.offsetWidth/2,top:o*n[1]+p-t.offsetHeight/2})}):I(),u.setAttribute("data-mce-selected","1")},I=function(){var e,t;for(e in M(),u&&u.removeAttribute("data-mce-selected"),l)(t=N.get("mceResizeHandle"+e))&&(N.unbind(t),N.remove(t))},L=function(e){var t,n=function(e,t){if(e)do{if(e===t)return!0}while(e=e.parentNode)};i||a.removed||(E(N.select("img[data-mce-selected],hr[data-mce-selected]"),function(e){e.removeAttribute("data-mce-selected")}),t="mousedown"===e.type?e.target:r.getNode(),n(t=N.$(t).closest("table,img,figure.image,hr")[0],A)&&(z(),n(r.getStart(!0),t)&&n(r.getEnd(!0),t))?o(t):I())},F=function(e){return Tb(function(e,t){for(;t&&t!==e;){if(kb(t)||Tb(t))return t;t=t.parentNode}return null}(a.getBody(),e))},M=function(){for(var e in l){var t=l[e];t.elm&&(N.unbind(t.elm),delete t.elm)}},z=function(){try{a.getDoc().execCommand("enableObjectResizing",!1,!1)}catch(e){}};return a.on("init",function(){z(),ge.ie&&11<=ge.ie&&(a.on("mousedown click",function(e){var t=e.target,n=t.nodeName;i||!/^(TABLE|IMG|HR)$/.test(n)||F(t)||(2!==e.button&&a.selection.select(t,"TABLE"===n),"mousedown"===e.type&&a.nodeChanged())}),a.dom.bind(A,"mscontrolselect",function(e){var t=function(e){be.setEditorTimeout(a,function(){a.selection.select(e)})};if(F(e.target))return e.preventDefault(),void t(e.target);/^(TABLE|IMG|HR)$/.test(e.target.nodeName)&&(e.preventDefault(),"IMG"===e.target.tagName&&t(e.target))}));var t=be.throttle(function(e){a.composing||L(e)});a.on("nodechange ResizeEditor ResizeWindow drop FullscreenStateChanged",t),a.on("keyup compositionend",function(e){u&&"TABLE"===u.nodeName&&t(e)}),a.on("hide blur",I),a.on("contextmenu",n)}),a.on("remove",M),{isResizable:B,showResizeRect:o,hideResizeRect:I,updateResizeRect:L,destroy:function(){u=s=null}}},Ab=function(e){for(var t=0,n=0,r=e;r&&r.nodeType;)t+=r.offsetLeft||0,n+=r.offsetTop||0,r=r.offsetParent;return{x:t,y:n}},Rb=function(e,t,n){var r,o,i,a,u,s=e.dom,c=s.getRoot(),l=0;if(u={elm:t,alignToTop:n},e.fire("scrollIntoView",u),!u.isDefaultPrevented()&&jo.isElement(t)){if(!1===n&&(l=t.offsetHeight),"BODY"!==c.nodeName){var f=e.selection.getScrollContainer();if(f)return r=Ab(t).y-Ab(f).y+l,a=f.clientHeight,void((r<(i=f.scrollTop)||i+ai.left&&a.rightr.top&&o.bottome?t.cells().length:e},0)},Vb=function(e,t){for(var n=e.rows(),r=0;r_',a.startContainer===u&&a.endContainer===u?u.body.innerHTML=t:(a.deleteContents(),0===u.body.childNodes.length?u.body.innerHTML=t:a.createContextualFragment?a.insertNode(a.createContextualFragment(t)):(o=u.createDocumentFragment(),i=u.createElement("div"),o.appendChild(i),i.outerHTML=t,a.insertNode(o))),r=e.dom.get("__caret"),(a=u.createRange()).setStartBefore(r),a.setEndBefore(r),e.selection.setRng(a),e.dom.remove("__caret");try{e.selection.setRng(a)}catch(s){}}else a.item&&(u.execCommand("Delete",!1,null),a=e.getRng()),/^\s+/.test(t)?(a.pasteHTML('_'+t),e.dom.remove("__mce_tmp")):a.pasteHTML(t);n.no_events||e.fire("SetContent",n)}else e.fire("SetContent",n)},eC=function(e,t,n,r,o){var i=n?t.startContainer:t.endContainer,a=n?t.startOffset:t.endOffset;return _.from(i).map(cr.fromDom).map(function(e){return r&&t.collapsed?e:Yr(e,o(e,a)).getOr(e)}).bind(function(e){return pr(e)?_.some(e):Hr(e)}).map(function(e){return e.dom()}).getOr(e)},tC=function(e,t,n){return eC(e,t,!0,n,function(e,t){return Math.min(e.dom().childNodes.length,t)})},nC=function(e,t,n){return eC(e,t,!1,n,function(e,t){return 0t.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){return Rb(c,e,t)},placeCaretAt:function(e,t){return i(Ob(e,t,c.getDoc()))},getBoundingClientRect:function(){var e=m();return e.collapsed?_u.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){s=l=f=null,t.destroy()}};return n=Sb(p),t=_b(p,c),p.bookmarkManager=n,p.controlSelection=t,p};(Eb=Nb||(Nb={}))[Eb.Br=0]="Br",Eb[Eb.Block=1]="Block",Eb[Eb.Wrap=2]="Wrap",Eb[Eb.Eol=3]="Eol";var sC=function(e,t){return e===Tu.Backwards?t.reverse():t},cC=function(e,t,n,r){for(var o,i,a,u,s,c,l=Js(n),f=r,d=[];f&&(s=l,c=f,o=t===Tu.Forwards?s.next(c):s.prev(c));){if(jo.isBr(o.getNode(!1)))return t===Tu.Forwards?{positions:sC(t,d).concat([o]),breakType:Nb.Br,breakAt:_.some(o)}:{positions:sC(t,d),breakType:Nb.Br,breakAt:_.some(o)};if(o.isVisible()){if(e(f,o)){var m=(i=t,a=f,u=o,jo.isBr(u.getNode(i===Tu.Forwards))?Nb.Br:!1===Ts(a,u)?Nb.Block:Nb.Wrap);return{positions:sC(t,d),breakType:m,breakAt:_.some(o)}}d.push(o),f=o}else f=o}return{positions:sC(t,d),breakType:Nb.Eol,breakAt:_.none()}},lC=function(n,r,o,e){return r(o,e).breakAt.map(function(e){var t=r(o,e).positions;return n===Tu.Backwards?t.concat(e):[e].concat(t)}).getOr([])},fC=function(e,i){return X(e,function(e,o){return e.fold(function(){return _.some(o)},function(r){return ru([ne(r.getClientRects()),ne(o.getClientRects())],function(e,t){var n=Math.abs(i-e.left);return Math.abs(i-t.left)<=n?o:r}).or(e)})},_.none())},dC=function(t,e){return ne(e.getClientRects()).bind(function(e){return fC(t,e.left)})},mC=d(cC,Su.isAbove,-1),gC=d(cC,Su.isBelow,1),pC=d(lC,-1,mC),hC=d(lC,1,gC),vC=jo.isContentEditableFalse,yC=Za,bC=function(e,t,n,r){var o=e===Tu.Forwards,i=o?Lf:Ff;if(!r.collapsed){var a=yC(r);if(vC(a))return ag(e,t,a,e===Tu.Backwards,!0)}var u=Sa(r.startContainer),s=Ps(e,t.getBody(),r);if(i(s))return ug(t,s.getNode(!o));var c=jl.normalizePosition(o,n(s));if(!c)return u?r:null;if(i(c))return ag(e,t,c.getNode(!o),o,!0);var l=n(c);return l&&i(l)&&Fs(c,l)?ag(e,t,l.getNode(!o),o,!0):u?cg(t,c.toRange(),!0):null},CC=function(e,t,n,r){var o,i,a,u,s,c,l,f,d;if(d=yC(r),o=Ps(e,t.getBody(),r),i=n(t.getBody(),pv(1),o),a=V(i,hv(1)),s=Wt.last(o.getClientRects()),(Lf(o)||zf(o))&&(d=o.getNode()),(Ff(o)||Uf(o))&&(d=o.getNode(!0)),!s)return null;if(c=s.left,(u=wv(a,c))&&vC(u.node))return l=Math.abs(c-u.left),f=Math.abs(c-u.right),ag(e,t,u.node,l'),o=a,1===t?e.$(r).after(o):e.$(r).before(o),e.selection.select(o,!0),e.selection.collapse())}},wC=function(l,f){return function(){var e,t,n,r,o,i,a,u,s,c=(t=f,r=Js((e=l).getBody()),o=d(Ls,r.next),i=d(Ls,r.prev),a=t?Tu.Forwards:Tu.Backwards,u=t?o:i,s=e.selection.getRng(),(n=bC(a,e,u,s))?n:(n=xC(e,a,s))||null);return!!c&&(l.selection.setRng(c),!0)}},NC=function(u,s){return function(){var e,t,n,r,o,i,a=(r=(t=s)?1:-1,o=t?gv:mv,i=(e=u).selection.getRng(),(n=CC(r,e,o,i))?n:(n=xC(e,r,i))||null);return!!a&&(u.selection.setRng(a),!0)}},EC=function(r,o){return function(){var t,e=o?_u.fromRangeEnd(r.selection.getRng()):_u.fromRangeStart(r.selection.getRng()),n=o?gC(r.getBody(),e):mC(r.getBody(),e);return(o?re(n.positions):ne(n.positions)).filter((t=o,function(e){return t?Ff(e):Lf(e)})).fold(q(!1),function(e){return r.selection.setRng(e.toRange()),!0})}},SC=function(e,t,n,r,o){var i,a,u,s,c=Zi(cr.fromDom(n),"td,th,caption").map(function(e){return e.dom()}),l=V((i=e,Z(c,function(e){var t,n,r=(t=Ka(e.getBoundingClientRect()),n=-1,{left:t.left-n,top:t.top-n,right:t.right+2*n,bottom:t.bottom+2*n,width:t.width+n,height:t.height+n});return[{x:r.left,y:i(r),cell:e},{x:r.right,y:i(r),cell:e}]})),function(e){return t(e,o)});return(a=l,u=r,s=o,X(a,function(e,r){return e.fold(function(){return _.some(r)},function(e){var t=Math.sqrt(Math.abs(e.x-u)+Math.abs(e.y-s)),n=Math.sqrt(Math.abs(r.x-u)+Math.abs(r.y-s));return _.some(nt}),_C=function(t,n){return ne(n.getClientRects()).bind(function(e){return TC(t,e.left,e.top)}).bind(function(e){return dC((t=e,sc.lastPositionIn(t).map(function(e){return mC(t,e).positions.concat(e)}).getOr([])),n);var t})},AC=function(t,n){return re(n.getClientRects()).bind(function(e){return kC(t,e.left,e.top)}).bind(function(e){return dC((t=e,sc.firstPositionIn(t).map(function(e){return[e].concat(gC(t,e).positions)}).getOr([])),n);var t})},RC=function(e,t){e.selection.setRng(t),Db(e,t)},DC=function(e,t,n){var r,o,i,a,u=e(t,n);return(a=u).breakType===Nb.Wrap&&0===a.positions.length||!jo.isBr(n.getNode())&&(i=u).breakType===Nb.Br&&1===i.positions.length?(r=e,o=t,!u.breakAt.map(function(e){return r(o,e).breakAt.isSome()}).getOr(!1)):u.breakAt.isNone()},BC=d(DC,mC),OC=d(DC,gC),PC=function(e,t,n,r){var o,i,a,u,s=e.selection.getRng(),c=t?1:-1;if(ms()&&(o=t,i=s,a=n,u=_u.fromRangeStart(i),sc.positionIn(!o,a).map(function(e){return e.isEqual(u)}).getOr(!1))){var l=ag(c,e,n,!t,!0);return RC(e,l),!0}return!1},IC=function(e,t){var n=t.getNode(e);return jo.isElement(n)&&"TABLE"===n.nodeName?_.some(n):_.none()},LC=function(u,s,c){var e=IC(!!s,c),t=!1===s;e.fold(function(){return RC(u,c.toRange())},function(a){return sc.positionIn(t,u.getBody()).filter(function(e){return e.isEqual(c)}).fold(function(){return RC(u,c.toRange())},function(e){return n=s,o=a,t=c,void((i=Nl(r=u))?r.undoManager.transact(function(){var e=cr.fromTag(i);Er(e,El(r)),Mi(e,cr.fromTag("br")),n?Li(cr.fromDom(o),e):Ii(cr.fromDom(o),e);var t=r.dom.createRng();t.setStart(e.dom(),0),t.setEnd(e.dom(),0),RC(r,t)}):RC(r,t.toRange()));var n,r,o,t,i})})},FC=function(e,t,n,r){var o,i,a,u,s,c,l=e.selection.getRng(),f=_u.fromRangeStart(l),d=e.getBody();if(!t&&BC(r,f)){var m=(u=d,_C(s=n,c=f).orThunk(function(){return ne(c.getClientRects()).bind(function(e){return fC(pC(u,_u.before(s)),e.left)})}).getOr(_u.before(s)));return LC(e,t,m),!0}return!(!t||!OC(r,f))&&(o=d,m=AC(i=n,a=f).orThunk(function(){return ne(a.getClientRects()).bind(function(e){return fC(hC(o,_u.after(i)),e.left)})}).getOr(_u.after(i)),LC(e,t,m),!0)},MC=function(t,n){return function(){return _.from(t.dom.getParent(t.selection.getNode(),"td,th")).bind(function(e){return _.from(t.dom.getParent(e,"table")).map(function(e){return PC(t,n,e)})}).getOr(!1)}},zC=function(n,r){return function(){return _.from(n.dom.getParent(n.selection.getNode(),"td,th")).bind(function(t){return _.from(n.dom.getParent(t,"table")).map(function(e){return FC(n,r,e,t)})}).getOr(!1)}},UC=function(e){return M(["figcaption"],mr(e))},VC=function(e){var t=j.document.createRange();return t.setStartBefore(e.dom()),t.setEndBefore(e.dom()),t},jC=function(e,t,n){n?Mi(e,t):Fi(e,t)},HC=function(e,t,n,r){return""===t?(l=e,f=r,d=cr.fromTag("br"),jC(l,d,f),VC(d)):(o=e,i=r,a=t,u=n,s=cr.fromTag(a),c=cr.fromTag("br"),Er(s,u),Mi(s,c),jC(o,s,i),VC(c));var o,i,a,u,s,c,l,f,d},qC=function(e,t,n){return t?(o=e.dom(),gC(o,n).breakAt.isNone()):(r=e.dom(),mC(r,n).breakAt.isNone());var r,o},$C=function(t,n){var e,r,o,i=cr.fromDom(t.getBody()),a=_u.fromRangeStart(t.selection.getRng()),u=Nl(t),s=El(t);return(e=a,r=i,o=d(zr,r),ra(cr.fromDom(e.container()),xo,o).filter(UC)).exists(function(){if(qC(i,n,a)){var e=HC(i,u,s,n);return t.selection.setRng(e),!0}return!1})},WC=function(e,t){return function(){return!!e.selection.isCollapsed()&&$C(e,t)}},KC=function(e,r){return Z(W(e,function(e){return Gy({shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0,action:o},e)}),function(e){return t=e,(n=r).keyCode===t.keyCode&&n.shiftKey===t.shiftKey&&n.altKey===t.altKey&&n.ctrlKey===t.ctrlKey&&n.metaKey===t.metaKey?[e]:[];var t,n})},XC=function(e){for(var t=[],n=1;n'},lx=function(e,t){return e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t},fx=function(e,t){return t&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&"true"!==e.getContentEditable(t)},dx=function(e,t,n){return!1===jo.isText(t)?n:e?1===n&&t.data.charAt(n-1)===xa?0:n:n===t.data.length-1&&t.data.charAt(n)===xa?t.data.length:n},mx=function(e,t){var n,r,o=e.getRoot();for(n=t;n!==o&&"false"!==e.getContentEditable(n);)"true"===e.getContentEditable(n)&&(r=n),n=n.parentNode;return n!==o?r:o},gx=function(e,t){var n=Nl(e);n&&n.toLowerCase()===t.tagName.toLowerCase()&&e.dom.setAttribs(t,El(e))},px=function(a,e){var t,u,s,i,c,n,r,o,l,f,d,m,g,p,h,v,y,b,C,x=a.dom,w=a.schema,N=w.getNonEmptyElements(),E=a.selection.getRng(),S=function(e){var t,n,r,o=s,i=w.getTextInlineElements();if(e||"TABLE"===f||"HR"===f?(t=x.create(e||m),gx(a,t)):t=c.cloneNode(!1),r=t,!1===kl(a))x.setAttrib(t,"style",null),x.setAttrib(t,"class",null);else do{if(i[o.nodeName]){if(Ju(o)||yc(o))continue;n=o.cloneNode(!1),x.setAttrib(n,"id",""),t.hasChildNodes()?n.appendChild(t.firstChild):r=n,t.appendChild(n)}}while((o=o.parentNode)&&o!==u);return cx(r),t},T=function(e){var t,n,r,o;if(o=dx(e,s,i),jo.isText(s)&&(e?0s.childNodes.length-1,s=s.childNodes[Math.min(i,s.childNodes.length-1)]||s,i=g&&jo.isText(s)?s.nodeValue.length:0),(u=mx(x,s))&&((m&&!n||!m&&n)&&(s=function(e,t,n,r,o){var i,a,u,s,c,l,f,d=t||"P",m=e.dom,g=mx(m,r);if(!(a=m.getParent(r,m.isBlock))||!fx(m,a)){if(l=(a=a||g)===e.getBody()||(f=a)&&/^(TD|TH|CAPTION)$/.test(f.nodeName)?a.nodeName.toLowerCase():a.parentNode.nodeName.toLowerCase(),!a.hasChildNodes())return i=m.create(d),gx(e,i),a.appendChild(i),n.setStart(i,0),n.setEnd(i,0),i;for(s=r;s.parentNode!==a;)s=s.parentNode;for(;s&&!m.isBlock(s);)s=(u=s).previousSibling;if(u&&e.schema.isValidChild(l,d.toLowerCase())){for(i=m.create(d),gx(e,i),u.parentNode.insertBefore(i,u),s=u;s&&!m.isBlock(s);)c=s.nextSibling,i.appendChild(s),s=c;n.setStart(r,o),n.setEnd(r,o)}}return r}(a,m,E,s,i)),c=x.getParent(s,x.isBlock),l=c?x.getParent(c.parentNode,x.isBlock):null,f=c?c.nodeName.toUpperCase():"","LI"!==(d=l?l.nodeName.toUpperCase():"")||e.ctrlKey||(l=(c=l).parentNode,f=d),/^(LI|DT|DD)$/.test(f)&&x.isEmpty(c)?sx(a,S,l,c,m):m&&c===a.getBody()||(m=m||"P",Sa(c)?(r=Pa(c),x.isEmpty(c)&&cx(c),ZC(a,r)):T()?k():T(!0)?(r=c.parentNode.insertBefore(S(),c),ZC(a,lx(c,"HR")?r:c)):((t=(b=E,C=b.cloneRange(),C.setStart(b.startContainer,dx(!0,b.startContainer,b.startOffset)),C.setEnd(b.endContainer,dx(!1,b.endContainer,b.endOffset)),C).cloneRange()).setEndAfter(c),o=t.extractContents(),y=o,U(Qi(cr.fromDom(y),hr),function(e){var t=e.dom();t.nodeValue=wa(t.nodeValue)}),function(e){for(;jo.isText(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild;);}(o),r=o.firstChild,x.insertAfter(o,c),function(e,t,n){var r,o=n,i=[];if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;jo.isElement(o)&&!t[o.nodeName.toLowerCase()]&&i.push(o)}for(r=i.length;r--;)!(o=i[r]).hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue?e.remove(o):(a=e,(u=o)&&"A"===u.nodeName&&a.isEmpty(u)&&e.remove(o));var a,u}}(x,N,r),p=x,(h=c).normalize(),(v=h.lastChild)&&!/^(left|right)$/gi.test(p.getStyle(v,"float",!0))||p.add(h,"br"),x.isEmpty(c)&&cx(c),r.normalize(),x.isEmpty(r)?(x.remove(r),k()):ZC(a,r)),x.setAttrib(r,"id",""),a.fire("NewBlock",{newBlock:r})))},hx=function(e,t){return tx(e).filter(function(e){return 0",yl(f)!==f.documentBaseUrl&&(g+=''),g+='',d=bl(f),m=Cl(f),xl(f)&&(g+=''),g+='
                '),Cw.add(t.iframeContainer,l),p},ww=function(e,t){var n=xw(e,t);t.editorContainer&&(Cw.get(t.editorContainer).style.display=e.orgDisplay,e.hidden=Cw.isHidden(t.editorContainer)),e.getElement().style.display="none",Cw.setAttrib(e.id,"aria-hidden","true"),n||bw(e)},Nw=Ti.DOM,Ew=function(t,n,e){var r=Th.get(e),o=Th.urls[e]||t.documentBaseUrl.replace(/\/$/,"");if(e=Jt.trim(e),r&&-1===Jt.inArray(n,e)){if(Jt.each(Th.dependencies(e),function(e){Ew(t,n,e)}),t.plugins[e])return;try{var i=new r(t,o,t.$);(t.plugins[e]=i).init&&(i.init(t,o),n.push(e))}catch(iE){Sh.pluginInitError(t,e,iE)}}},Sw=function(e){return e.replace(/^\-/,"")},Tw=function(e){return{editorContainer:e,iframeContainer:e}},kw=function(e){var t,n,r=e.getElement();return e.inline?Tw(null):(t=r,n=Nw.create("div"),Nw.insertAfter(n,t),Tw(n))},_w=function(e){var t,n,r,o,i,a,u,s,c,l,f,d=e.settings,m=e.getElement();return e.orgDisplay=m.style.display,A(d.theme)?(l=(o=e).settings,f=o.getElement(),i=l.width||Nw.getStyle(f,"width")||"100%",a=l.height||Nw.getStyle(f,"height")||f.offsetHeight,u=l.min_height||100,(s=/^[0-9\.]+(|px)$/i).test(""+i)&&(i=Math.max(parseInt(i,10),100)),s.test(""+a)&&(a=Math.max(parseInt(a,10),u)),c=o.theme.renderUI({targetNode:f,width:i,height:a,deltaWidth:l.delta_width,deltaHeight:l.delta_height}),l.content_editable||(a=(c.iframeHeight||a)+("number"==typeof a?c.deltaHeight||0:""))=n.length)for(r=0,o=e.length;r=n.length||e[r]!==n[r]){i=r+1;break}if(e.length=e.length||e[r]!==n[r]){i=r+1;break}if(1===i)return t;for(r=0,o=e.length-(i-1);r]*>( | |\\s|\xa0|
                |)<\\/"+a+">[\r\n]*|
                [\r\n]*)$"),r=i.replace(u,"")}return"text"===t.format||Ro(cr.fromDom(n))?t.content=r:t.content=Jt.trim(r),t.no_events||e.fire("GetContent",t),t.content},Vw=function(e,t){t(e),e.firstChild&&Vw(e.firstChild,t),e.next&&Vw(e.next,t)},jw=function(e,t,n){var r=function(e,n,t){var r={},o={},i=[];for(var a in t.firstChild&&Vw(t.firstChild,function(t){U(e,function(e){e.name===t.name&&(r[e.name]?r[e.name].nodes.push(t):r[e.name]={filter:e,nodes:[t]})}),U(n,function(e){"string"==typeof t.attr(e.name)&&(o[e.name]?o[e.name].nodes.push(t):o[e.name]={filter:e,nodes:[t]})})}),r)r.hasOwnProperty(a)&&i.push(r[a]);for(var a in o)o.hasOwnProperty(a)&&i.push(o[a]);return i}(e,t,n);U(r,function(t){U(t.filter.callbacks,function(e){e(t.nodes,t.filter.name,{})})})},Hw=function(e){return e instanceof ib},qw=function(e,t){var r;e.dom.setHTML(e.getBody(),t),ah(r=e)&&sc.firstPositionIn(r.getBody()).each(function(e){var t=e.getNode(),n=jo.isTable(t)?sc.firstPositionIn(t).getOr(e):e;r.selection.setRng(n.toRange())})},$w=function(u,s,c){return void 0===c&&(c={}),c.format=c.format?c.format:"html",c.set=!0,c.content=Hw(s)?"":s,Hw(s)||c.no_events||(u.fire("BeforeSetContent",c),s=c.content),_.from(u.getBody()).fold(q(s),function(e){return Hw(s)?function(e,t,n,r){jw(e.parser.getNodeFilters(),e.parser.getAttributeFilters(),n);var o=al({validate:e.validate},e.schema).serialize(n);return r.content=Ro(cr.fromDom(t))?o:Jt.trim(o),qw(e,r.content),r.no_events||e.fire("SetContent",r),n}(u,e,s,c):(t=u,n=e,o=c,0===(r=s).length||/^\s+$/.test(r)?(a='
                ',"TABLE"===n.nodeName?r=""+a+"":/^(UL|OL)$/.test(n.nodeName)&&(r="
              • "+a+"
              • "),(i=Nl(t))&&t.schema.isValidChild(n.nodeName.toLowerCase(),i.toLowerCase())?(r=a,r=t.dom.createHTML(i,t.settings.forced_root_block_attrs,r)):r||(r='
                '),qw(t,r),t.fire("SetContent",o)):("raw"!==o.format&&(r=al({validate:t.validate},t.schema).serialize(t.parser.parse(r,{isRootContent:!0,insert:!0}))),o.content=Ro(cr.fromDom(n))?r:Jt.trim(r),qw(t,o.content),o.no_events||t.fire("SetContent",o)),o.content);var t,n,r,o,i,a})},Ww=Ti.DOM,Kw=function(e){return _.from(e).each(function(e){return e.destroy()})},Xw=function(e){if(!e.removed){var t=e._selectionOverrides,n=e.editorUpload,r=e.getBody(),o=e.getElement();r&&e.save({is_removing:!0}),e.removed=!0,e.unbindAllNativeEvents(),e.hasHiddenInput&&o&&Ww.remove(o.nextSibling),Cp(e),e.editorManager.remove(e),!e.inline&&r&&(i=e,Ww.setStyle(i.id,"display",i.orgDisplay)),xp(e),Ww.remove(e.getContainer()),Kw(t),Kw(n),e.destroy()}var i},Yw=function(e,t){var n,r,o,i=e.selection,a=e.dom;e.destroyed||(t||e.removed?(t||(e.editorManager.off("beforeunload",e._beforeUnload),e.theme&&e.theme.destroy&&e.theme.destroy(),Kw(i),Kw(a)),(r=(n=e).formElement)&&(r._mceOldSubmit&&(r.submit=r._mceOldSubmit,r._mceOldSubmit=null),Ww.unbind(r,"submit reset",n.formEventDelegate)),(o=e).contentAreaContainer=o.formElement=o.container=o.editorContainer=null,o.bodyElement=o.contentDocument=o.contentWindow=null,o.iframeElement=o.targetElm=null,o.selection&&(o.selection=o.selection.win=o.selection.dom=o.selection.dom.doc=null),e.destroyed=!0):e.remove())},Gw=Ti.DOM,Jw=Jt.extend,Qw=Jt.each,Zw=Jt.resolve,eN=ge.ie,tN=function(e,t,n){var r,o,i,a,u,s,c,l=this,f=l.documentBaseUrl=n.documentBaseURL,d=n.baseURI;r=l,o=e,i=f,a=n.defaultSettings,u=t,c={id:o,theme:"modern",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:i,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,render_ui:!0,indentation:"40px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:(s=r).convertURL,url_converter_scope:s,ie7_compat:!0},t=Hp(Lp,c,a,u),l.settings=t,Pi.language=t.language||"en",Pi.languageLoad=t.language_load,Pi.baseURL=n.baseURL,l.id=e,l.setDirty(!1),l.plugins={},l.documentBaseURI=new zw(t.document_base_url,{base_uri:d}),l.baseURI=d,l.contentCSS=[],l.contentStyles=[],l.shortcuts=new Gp(l),l.loadedCSS={},l.editorCommands=new dp(l),l.suffix=n.suffix,l.editorManager=n,l.inline=t.inline,l.buttons={},l.menuItems={},t.cache_suffix&&(ge.cacheSuffix=t.cache_suffix.replace(/^[\?\&]+/,"")),!1===t.override_viewport&&(ge.overrideViewPort=!1),n.fire("SetupEditor",{editor:l}),l.execCallback("setup",l),l.$=vn.overrideDefaults(function(){return{context:l.inline?l.getBody():l.getDoc(),element:l.getBody()}})};Jw(tN.prototype={render:function(){Ow(this)},focus:function(e){ih(this,e)},hasFocus:function(){return ah(this)},execCallback:function(e){for(var t=[],n=1;n=n.x&&o.x+o.w<=n.w+n.x&&o.y>=n.y&&o.y+o.h<=n.h+n.y)return r[i];return null},intersect:function(e,t){var n,r,o,i;return n=BN(e.x,t.x),r=BN(e.y,t.y),o=DN(e.x+e.w,t.x+t.w),i=DN(e.y+e.h,t.y+t.h),o-n<0||i-r<0?null:IN(n,r,o-n,i-r)},clamp:function(e,t,n){var r,o,i,a,u,s,c,l,f,d;return u=e.x,s=e.y,c=e.x+e.w,l=e.y+e.h,f=t.x+t.w,d=t.y+t.h,r=BN(0,t.x-u),o=BN(0,t.y-s),i=BN(0,c-f),a=BN(0,l-d),u+=r,s+=o,n&&(c+=r,l+=o,u-=i,s-=a),IN(u,s,(c-=i)-u,(l-=a)-s)},create:IN,fromClientRect:function(e){return IN(e.left,e.top,e.width,e.height)}},FN={},MN={add:function(e,t){FN[e.toLowerCase()]=t},has:function(e){return!!FN[e.toLowerCase()]},get:function(e){var t=e.toLowerCase(),n=FN.hasOwnProperty(t)?FN[t]:null;if(null===n)throw new Error("Could not find module for type: "+e);return n},create:function(e,t){var n;if("string"==typeof e?(t=t||{}).type=e:e=(t=e).type,e=e.toLowerCase(),!(n=FN[e]))throw new Error("Could not find control by type: "+e);return(n=new n(t)).type=e,n}},zN=Jt.each,UN=Jt.extend,VN=function(){};VN.extend=_N=function(n){var e,t,r,o=this.prototype,i=function(){var e,t,n;if(!AN&&(this.init&&this.init.apply(this,arguments),t=this.Mixins))for(e=t.length;e--;)(n=t[e]).init&&n.init.apply(this,arguments)},a=function(){return this},u=function(n,r){return function(){var e,t=this._super;return this._super=o[n],e=r.apply(this,arguments),this._super=t,e}};for(t in AN=!0,e=new this,AN=!1,n.Mixins&&(zN(n.Mixins,function(e){for(var t in e)"init"!==t&&(n[t]=e[t])}),o.Mixins&&(n.Mixins=o.Mixins.concat(n.Mixins))),n.Methods&&zN(n.Methods.split(","),function(e){n[e]=a}),n.Properties&&zN(n.Properties.split(","),function(e){var t="_"+e;n[e]=function(e){return e!==undefined?(this[t]=e,this):this[t]}}),n.Statics&&zN(n.Statics,function(e,t){i[t]=e}),n.Defaults&&o.Defaults&&(n.Defaults=UN({},o.Defaults,n.Defaults)),n)"function"==typeof(r=n[t])&&o[t]?e[t]=u(t,r):e[t]=r;return i.prototype=e,(i.constructor=i).extend=_N,i};var jN=Math.min,HN=Math.max,qN=Math.round,$N=function(e,n){var r,o,t,i;if(n=n||'"',null===e)return"null";if("string"==(t=typeof e))return o="\bb\tt\nn\ff\rr\"\"''\\\\",n+e.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,t){return'"'===n&&"'"===e?e:(r=o.indexOf(t))+1?"\\"+o.charAt(r+1):(e=t.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e)})+n;if("object"===t){if(e.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(e)){for(r=0,o="[";rTiny']),u=t.getParam("branding",!0,"boolean")?{type:"label",classes:"branding",html:" "+l}:null;i.add({type:"panel",name:"statusbar",classes:"statusbar",layout:"flow",border:"1 0 0 0",ariaRoot:!0,items:[{type:"elementpath",editor:t},r,u]})}return R(t),t.on("SwitchMode",(a=i,function(e){a.find("*").disabled("readonly"===e.mode)})),i.renderBefore(n.targetNode).reflow(),t.getParam("readonly",!1,"boolean")&&t.setMode("readonly"),n.width&&ye.setStyle(i.getEl(),"width",n.width),t.on("remove",function(){i.remove(),i=null}),C(t,i),Y(t),{iframeContainer:i.find("#iframe")[0].getEl(),editorContainer:i.getEl()}},_e=tinymce.util.Tools.resolve("tinymce.dom.DomQuery"),Re=0,Ce={id:function(){return"mceu_"+Re++},create:function(e,t,n){var i=_.document.createElement(e);return v.DOM.setAttribs(i,t),"string"==typeof n?i.innerHTML=n:w.each(n,function(e){e.nodeType&&i.appendChild(e)}),i},createFragment:function(e){return v.DOM.createFragment(e)},getWindowSize:function(){return v.DOM.getViewPort()},getSize:function(e){var t,n;if(e.getBoundingClientRect){var i=e.getBoundingClientRect();t=Math.max(i.width||i.right-i.left,e.offsetWidth),n=Math.max(i.height||i.bottom-i.bottom,e.offsetHeight)}else t=e.offsetWidth,n=e.offsetHeight;return{width:t,height:n}},getPos:function(e,t){return v.DOM.getPos(e,t||Ce.getContainer())},getContainer:function(){return he.container?he.container:_.document.body},getViewPort:function(e){return v.DOM.getViewPort(e)},get:function(e){return _.document.getElementById(e)},addClass:function(e,t){return v.DOM.addClass(e,t)},removeClass:function(e,t){return v.DOM.removeClass(e,t)},hasClass:function(e,t){return v.DOM.hasClass(e,t)},toggleClass:function(e,t,n){return v.DOM.toggleClass(e,t,n)},css:function(e,t,n){return v.DOM.setStyle(e,t,n)},getRuntimeStyle:function(e,t){return v.DOM.getStyle(e,t,!0)},on:function(e,t,n,i){return v.DOM.bind(e,t,n,i)},off:function(e,t,n){return v.DOM.unbind(e,t,n)},fire:function(e,t,n){return v.DOM.fire(e,t,n)},innerHtml:function(e,t){v.DOM.setHTML(e,t)}},Ee=function(e){return"static"===Ce.getRuntimeStyle(e,"position")},ke=function(e){return e.state.get("fixed")};function He(e,t,n){var i,r,o,s,a,l,u,c,d,f;return d=Se(),o=(r=Ce.getPos(t,A.getUiContainer(e))).x,s=r.y,ke(e)&&Ee(_.document.body)&&(o-=d.x,s-=d.y),i=e.getEl(),a=(f=Ce.getSize(i)).width,l=f.height,u=(f=Ce.getSize(t)).width,c=f.height,"b"===(n=(n||"").split(""))[0]&&(s+=c),"r"===n[1]&&(o+=u),"c"===n[0]&&(s+=Math.round(c/2)),"c"===n[1]&&(o+=Math.round(u/2)),"b"===n[3]&&(s-=l),"r"===n[4]&&(o-=a),"c"===n[3]&&(s-=Math.round(l/2)),"c"===n[4]&&(o-=Math.round(a/2)),{x:o,y:s,w:a,h:l}}var Se=function(){var e=_.window;return{x:Math.max(e.pageXOffset,_.document.body.scrollLeft,_.document.documentElement.scrollLeft),y:Math.max(e.pageYOffset,_.document.body.scrollTop,_.document.documentElement.scrollTop),w:e.innerWidth||_.document.documentElement.clientWidth,h:e.innerHeight||_.document.documentElement.clientHeight}},Te=function(e){var t,n=A.getUiContainer(e);return n&&!ke(e)?{x:0,y:0,w:(t=n).scrollWidth-1,h:t.scrollHeight-1}:Se()},Me={testMoveRel:function(e,t){for(var n=Te(this),i=0;in.x&&r.x+r.wn.y&&r.y+r.h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,Ue=/^\s*|\s*$/g,Ve=Ne.extend({init:function(e){var o=this.match;function s(e,t,n){var i;function r(e){e&&t.push(e)}return r(function(t){if(t)return t=t.toLowerCase(),function(e){return"*"===t||e.type===t}}((i=Ie.exec(e.replace(Ue,"")))[1])),r(function(t){if(t)return function(e){return e._name===t}}(i[2])),r(function(n){if(n)return n=n.split("."),function(e){for(var t=n.length;t--;)if(!e.classes.contains(n[t]))return!1;return!0}}(i[3])),r(function(n,i,r){if(n)return function(e){var t=e[n]?e[n]():"";return i?"="===i?t===r:"*="===i?0<=t.indexOf(r):"~="===i?0<=(" "+t+" ").indexOf(" "+r+" "):"!="===i?t!==r:"^="===i?0===t.indexOf(r):"$="===i&&t.substr(t.length-r.length)===r:!!r}}(i[4],i[5],i[6])),r(function(i){var t;if(i)return(i=/(?:not\((.+)\))|(.+)/i.exec(i))[1]?(t=a(i[1],[]),function(e){return!o(e,t)}):(i=i[2],function(e,t,n){return"first"===i?0===t:"last"===i?t===n-1:"even"===i?t%2==0:"odd"===i?t%2==1:!!e[i]&&e[i]()})}(i[7])),t.pseudo=!!i[7],t.direct=n,t}function a(e,t){var n,i,r,o=[];do{if(Fe.exec(""),(i=Fe.exec(e))&&(e=i[3],o.push(i[1]),i[2])){n=i[3];break}}while(i);for(n&&a(n,t),e=[],r=0;r"!==o[r]&&e.push(s(o[r],[],">"===o[r-1]));return t.push(e),t}this._selectors=a(e,[])},match:function(e,t){var n,i,r,o,s,a,l,u,c,d,f,h,m;for(n=0,i=(t=t||this._selectors).length;na.maxW?a.maxW:n,a.w=n,a.innerW=n-i),(n=e.h)!==undefined&&(n=(n=na.maxH?a.maxH:n,a.h=n,a.innerH=n-r),(n=e.innerW)!==undefined&&(n=(n=na.maxW-i?a.maxW-i:n,a.innerW=n,a.w=n+i),(n=e.innerH)!==undefined&&(n=(n=na.maxH-r?a.maxH-r:n,a.innerH=n,a.h=n+r),e.contentW!==undefined&&(a.contentW=e.contentW),e.contentH!==undefined&&(a.contentH=e.contentH),(t=s._lastLayoutRect).x===a.x&&t.y===a.y&&t.w===a.w&&t.h===a.h||((o=Ke.repaintControls)&&o.map&&!o.map[s._id]&&(o.push(s),o.map[s._id]=!0),t.x=a.x,t.y=a.y,t.w=a.w,t.h=a.h),s):a},repaint:function(){var e,t,n,i,r,o,s,a,l,u,c=this;l=_.document.createRange?function(e){return e}:Math.round,e=c.getEl().style,i=c._layoutRect,a=c._lastRepaintRect||{},o=(r=c.borderBox).left+r.right,s=r.top+r.bottom,i.x!==a.x&&(e.left=l(i.x)+"px",a.x=i.x),i.y!==a.y&&(e.top=l(i.y)+"px",a.y=i.y),i.w!==a.w&&(u=l(i.w-o),e.width=(0<=u?u:0)+"px",a.w=i.w),i.h!==a.h&&(u=l(i.h-s),e.height=(0<=u?u:0)+"px",a.h=i.h),c._hasBody&&i.innerW!==a.innerW&&(u=l(i.innerW),(n=c.getEl("body"))&&((t=n.style).width=(0<=u?u:0)+"px"),a.innerW=i.innerW),c._hasBody&&i.innerH!==a.innerH&&(u=l(i.innerH),(n=n||c.getEl("body"))&&((t=t||n.style).height=(0<=u?u:0)+"px"),a.innerH=i.innerH),c._lastRepaintRect=a,c.fire("repaint",{},!1)},updateLayoutRect:function(){var e=this;e.parent()._lastRect=null,Ce.css(e.getEl(),{width:"",height:""}),e._layoutRect=e._lastRepaintRect=e._lastLayoutRect=null,e.initLayoutRect()},on:function(e,t){var n,i,r,o=this;return ot(o).on(e,"string"!=typeof(n=t)?n:function(e){return i||o.parentsAndSelf().each(function(e){var t=e.settings.callbacks;if(t&&(i=t[n]))return r=e,!1}),i?i.call(r,e):(e.action=n,void this.fire("execute",e))}),o},off:function(e,t){return ot(this).off(e,t),this},fire:function(e,t,n){if((t=t||{}).control||(t.control=this),t=ot(this).fire(e,t),!1!==n&&this.parent)for(var i=this.parent();i&&!t.isPropagationStopped();)i.fire(e,t,!1),i=i.parent();return t},hasEventListeners:function(e){return ot(this).has(e)},parents:function(e){var t,n=new qe;for(t=this.parent();t;t=t.parent())n.add(t);return e&&(n=n.filter(e)),n},parentsAndSelf:function(e){return new qe(this).add(this.parents(e))},next:function(){var e=this.parent().items();return e[e.indexOf(this)+1]},prev:function(){var e=this.parent().items();return e[e.indexOf(this)-1]},innerHtml:function(e){return this.$el.html(e),this},getEl:function(e){var t=e?this._id+"-"+e:this._id;return this._elmCache[t]||(this._elmCache[t]=_e("#"+t)[0]),this._elmCache[t]},show:function(){return this.visible(!0)},hide:function(){return this.visible(!1)},focus:function(){try{this.getEl().focus()}catch(e){}return this},blur:function(){return this.getEl().blur(),this},aria:function(e,t){var n=this,i=n.getEl(n.ariaTarget);return void 0===t?n._aria[e]:(n._aria[e]=t,n.state.get("rendered")&&i.setAttribute("role"===e?e:"aria-"+e,t),n)},encode:function(e,t){return!1!==t&&(e=this.translate(e)),(e||"").replace(/[&<>"]/g,function(e){return"&#"+e.charCodeAt(0)+";"})},translate:function(e){return Ke.translate?Ke.translate(e):e},before:function(e){var t=this.parent();return t&&t.insert(e,t.items().indexOf(this),!0),this},after:function(e){var t=this.parent();return t&&t.insert(e,t.items().indexOf(this)),this},remove:function(){var t,e,n=this,i=n.getEl(),r=n.parent();if(n.items){var o=n.items().toArray();for(e=o.length;e--;)o[e].remove()}r&&r.items&&(t=[],r.items().each(function(e){e!==n&&t.push(e)}),r.items().set(t),r._lastRect=null),n._eventsRoot&&n._eventsRoot===n&&_e(i).off();var s=n.getRoot().controlIdLookup;return s&&delete s[n._id],i&&i.parentNode&&i.parentNode.removeChild(i),n.state.set("rendered",!1),n.state.destroy(),n.fire("remove"),n},renderBefore:function(e){return _e(e).before(this.renderHtml()),this.postRender(),this},renderTo:function(e){return _e(e||this.getContainerElm()).append(this.renderHtml()),this.postRender(),this},preRender:function(){},render:function(){},renderHtml:function(){return'
                '},postRender:function(){var e,t,n,i,r,o=this,s=o.settings;for(i in o.$el=_e(o.getEl()),o.state.set("rendered",!0),s)0===i.indexOf("on")&&o.on(i.substr(2),s[i]);if(o._eventsRoot){for(n=o.parent();!r&&n;n=n.parent())r=n._eventsRoot;if(r)for(i in r._nativeEvents)o._nativeEvents[i]=!0}st(o),s.style&&(e=o.getEl())&&(e.setAttribute("style",s.style),e.style.cssText=s.style),o.settings.border&&(t=o.borderBox,o.$el.css({"border-top-width":t.top,"border-right-width":t.right,"border-bottom-width":t.bottom,"border-left-width":t.left}));var a=o.getRoot();for(var l in a.controlIdLookup||(a.controlIdLookup={}),(a.controlIdLookup[o._id]=o)._aria)o.aria(l,o._aria[l]);!1===o.state.get("visible")&&(o.getEl().style.display="none"),o.bindStates(),o.state.on("change:visible",function(e){var t,n=e.value;o.state.get("rendered")&&(o.getEl().style.display=!1===n?"none":"",o.getEl().getBoundingClientRect()),(t=o.parent())&&(t._lastRect=null),o.fire(n?"show":"hide"),et.add(o)}),o.fire("postrender",{},!1)},bindStates:function(){},scrollIntoView:function(e){var t,n,i,r,o,s,a=this.getEl(),l=a.parentNode,u=function(e,t){var n,i,r=e;for(n=i=0;r&&r!==t&&r.nodeType;)n+=r.offsetLeft||0,i+=r.offsetTop||0,r=r.offsetParent;return{x:n,y:i}}(a,l);return t=u.x,n=u.y,i=a.offsetWidth,r=a.offsetHeight,o=l.clientWidth,s=l.clientHeight,"end"===e?(t-=o-i,n-=s-r):"center"===e&&(t-=o/2-i/2,n-=s/2-r/2),l.scrollLeft=t,l.scrollTop=n,this},getRoot:function(){for(var e,t=this,n=[];t;){if(t.rootControl){e=t.rootControl;break}n.push(t),t=(e=t).parent()}e||(e=this);for(var i=n.length;i--;)n[i].rootControl=e;return e},reflow:function(){et.remove(this);var e=this.parent();return e&&e._layout&&!e._layout.isNative()&&e.reflow(),this}};function ot(n){return n._eventDispatcher||(n._eventDispatcher=new Pe({scope:n,toggleEvent:function(e,t){t&&Pe.isNative(e)&&(n._nativeEvents||(n._nativeEvents={}),n._nativeEvents[e]=!0,n.state.get("rendered")&&st(n))}})),n._eventDispatcher}function st(a){var e,t,n,l,i,r;function o(e){var t=a.getParentCtrl(e.target);t&&t.fire(e.type,e)}function s(){var e=l._lastHoverCtrl;e&&(e.fire("mouseleave",{target:e.getEl()}),e.parents().each(function(e){e.fire("mouseleave",{target:e.getEl()})}),l._lastHoverCtrl=null)}function u(e){var t,n,i,r=a.getParentCtrl(e.target),o=l._lastHoverCtrl,s=0;if(r!==o){if((n=(l._lastHoverCtrl=r).parents().toArray().reverse()).push(r),o){for((i=o.parents().toArray().reverse()).push(o),s=0;s=t.length&&(e=0),t[e]&&t[e].focus(),e}function h(e,t){var n=-1,i=d();t=t||c(i.getEl());for(var r=0;r
                '+(e.settings.html||"")+t.renderHtml(e)+"
                "},postRender:function(){var e,t=this;return t.items().exec("postRender"),t._super(),t._layout.postRender(t),t.state.set("rendered",!0),t.settings.style&&t.$el.css(t.settings.style),t.settings.border&&(e=t.borderBox,t.$el.css({"border-top-width":e.top,"border-right-width":e.right,"border-bottom-width":e.bottom,"border-left-width":e.left})),t.parent()||(t.keyboardNav=ut({root:t})),t},initLayoutRect:function(){var e=this._super();return this._layout.recalc(this),e},recalc:function(){var e=this,t=e._layoutRect,n=e._lastRect;if(!n||n.w!==t.w||n.h!==t.h)return e._layout.recalc(e),t=e.layoutRect(),e._lastRect={x:t.x,y:t.y,w:t.w,h:t.h},!0},reflow:function(){var e;if(et.remove(this),this.visible()){for(at.repaintControls=[],at.repaintControls.map={},this.recalc(),e=at.repaintControls.length;e--;)at.repaintControls[e].repaint();"flow"!==this.settings.layout&&"stack"!==this.settings.layout&&this.repaint(),at.repaintControls=[]}return this}});function ft(e){var t,n;if(e.changedTouches)for(t="screenX screenY pageX pageY clientX clientY".split(" "),n=0;n").css({position:"absolute",top:0,left:0,width:f.width,height:f.height,zIndex:2147483647,opacity:1e-4,cursor:d}).appendTo(x.body),_e(x).on("mousemove touchmove",v).on("mouseup touchend",p),h.start(e)},v=function(e){if(ft(e),e.button!==g)return p(e);e.deltaX=e.screenX-b,e.deltaY=e.screenY-y,e.preventDefault(),h.drag(e)},p=function(e){ft(e),_e(x).off("mousemove touchmove",v).off("mouseup touchend",p),m.remove(),h.stop&&h.stop(e)},this.destroy=function(){_e(w).off()},_e(w).on("mousedown touchstart",t)}var mt,gt,pt,vt,bt={init:function(){this.on("repaint",this.renderScroll)},renderScroll:function(){var p=this,v=2;function n(){var m,g,e;function t(e,t,n,i,r,o){var s,a,l,u,c,d,f,h;if(a=p.getEl("scroll"+e)){if(f=t.toLowerCase(),h=n.toLowerCase(),_e(p.getEl("absend")).css(f,p.layoutRect()[i]-1),!r)return void _e(a).css("display","none");_e(a).css("display","block"),s=p.getEl("body"),l=p.getEl("scroll"+e+"t"),u=s["client"+n]-2*v,c=(u-=m&&g?a["client"+o]:0)/s["scroll"+n],(d={})[f]=s["offset"+t]+v,d[h]=u,_e(a).css(d),(d={})[f]=s["scroll"+t]*c,d[h]=u*c,_e(l).css(d)}}e=p.getEl("body"),m=e.scrollWidth>e.clientWidth,g=e.scrollHeight>e.clientHeight,t("h","Left","Width","contentW",m,"Height"),t("v","Top","Height","contentH",g,"Width")}p.settings.autoScroll&&(p._hasScroll||(p._hasScroll=!0,function(){function e(s,a,l,u,c){var d,e=p._id+"-scroll"+s,t=p.classPrefix;_e(p.getEl()).append('
                '),p.draghelper=new ht(e+"t",{start:function(){d=p.getEl("body")["scroll"+a],_e("#"+e).addClass(t+"active")},drag:function(e){var t,n,i,r,o=p.layoutRect();n=o.contentW>o.innerW,i=o.contentH>o.innerH,r=p.getEl("body")["client"+l]-2*v,t=(r-=n&&i?p.getEl("scroll"+s)["client"+c]:0)/p.getEl("body")["scroll"+l],p.getEl("body")["scroll"+a]=d+e["delta"+u]/t},stop:function(){_e("#"+e).removeClass(t+"active")}})}p.classes.add("scroll"),e("v","Top","Height","Y","Width"),e("h","Left","Width","X","Height")}(),p.on("wheel",function(e){var t=p.getEl("body");t.scrollLeft+=10*(e.deltaX||0),t.scrollTop+=10*e.deltaY,n()}),_e(p.getEl("body")).on("scroll",n)),n())}},yt=dt.extend({Defaults:{layout:"fit",containerCls:"panel"},Mixins:[bt],renderHtml:function(){var e=this,t=e._layout,n=e.settings.html;return e.preRender(),t.preRender(e),void 0===n?n='
                '+t.renderHtml(e)+"
                ":("function"==typeof n&&(n=n.call(e)),e._hasBody=!1),'
                '+(e._preBodyHtml||"")+n+"
                "}}),xt={resizeToContent:function(){this._layoutRect.autoResize=!0,this._lastRect=null,this.reflow()},resizeTo:function(e,t){if(e<=1||t<=1){var n=Ce.getWindowSize();e=e<=1?e*n.w:e,t=t<=1?t*n.h:t}return this._layoutRect.autoResize=!1,this.layoutRect({minW:e,minH:t,w:e,h:t}).reflow()},resizeBy:function(e,t){var n=this.layoutRect();return this.resizeTo(n.w+e,n.h+t)}},wt=[],_t=[];function Rt(e,t){for(;e;){if(e===t)return!0;e=e.parent()}}function Ct(){mt||(mt=function(e){2!==e.button&&function(e){for(var t=wt.length;t--;){var n=wt[t],i=n.getParentCtrl(e.target);if(n.settings.autohide){if(i&&(Rt(i,n)||n.parent()===i))continue;(e=n.fire("autohide",{target:e.target})).isDefaultPrevented()||n.hide()}}}(e)},_e(_.document).on("click touchstart",mt))}function Et(r){var e=Ce.getViewPort().y;function t(e,t){for(var n,i=0;ie&&(r.fixed(!1).layoutRect({y:r._autoFixY}).repaint(),t(!1,r._autoFixY-e)):(r._autoFixY=r.layoutRect().y,r._autoFixY').appendTo(i.getContainerElm())),u.setTimeout(function(){t.addClass(n+"in"),_e(i.getEl()).addClass(n+"in")}),vt=!0),kt(!0,i)}}),i.on("show",function(){i.parents().each(function(e){if(e.state.get("fixed"))return i.fixed(!0),!1})}),e.popover&&(i._preBodyHtml='
                ',i.classes.add("popover").add("bottom").add(i.isRtl()?"end":"start")),i.aria("label",e.ariaLabel),i.aria("labelledby",i._id),i.aria("describedby",i.describedBy||i._id+"-none")},fixed:function(e){var t=this;if(t.state.get("fixed")!==e){if(t.state.get("rendered")){var n=Ce.getViewPort();e?t.layoutRect().y-=n.y:t.layoutRect().y+=n.y}t.classes.toggle("fixed",e),t.state.set("fixed",e)}return t},show:function(){var e,t=this._super();for(e=wt.length;e--&&wt[e]!==this;);return-1===e&&wt.push(this),t},hide:function(){return St(this),kt(!1,this),this._super()},hideAll:function(){Ht.hideAll()},close:function(){return this.fire("close").isDefaultPrevented()||(this.remove(),kt(!1,this)),this},remove:function(){St(this),this._super()},postRender:function(){return this.settings.bodyRole&&this.getEl("body").setAttribute("role",this.settings.bodyRole),this._super()}});function St(e){var t;for(t=wt.length;t--;)wt[t]===e&&wt.splice(t,1);for(t=_t.length;t--;)_t[t]===e&&_t.splice(t,1)}Ht.hideAll=function(){for(var e=wt.length;e--;){var t=wt[e];t&&t.settings.autohide&&(t.hide(),wt.splice(e,1))}};var Tt=function(s,n,e){var a,i,l=v.DOM,t=s.getParam("fixed_toolbar_container");t&&(i=l.select(t)[0]);var r=function(){if(a&&a.moveRel&&a.visible()&&!a._fixed){var e=s.selection.getScrollContainer(),t=s.getBody(),n=0,i=0;if(e){var r=l.getPos(t),o=l.getPos(e);n=Math.max(0,o.x-r.x),i=Math.max(0,o.y-r.y)}a.fixed(!1).moveRel(t,s.rtl?["tr-br","br-tr"]:["tl-bl","bl-tl","tr-br"]).moveBy(n,i)}},o=function(){a&&(a.show(),r(),l.addClass(s.getBody(),"mce-edit-focus"))},u=function(){a&&(a.hide(),Ht.hideAll(),l.removeClass(s.getBody(),"mce-edit-focus"))},c=function(){var e,t;a?a.visible()||o():(a=n.panel=b.create({type:i?"panel":"floatpanel",role:"application",classes:"tinymce tinymce-inline",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:!0,fixed:(e=i,t=s,!(!e||t.settings.ui_container)),border:1,items:[!1===d(s)?null:{type:"menubar",border:"0 0 1 0",items:ae(s)},z(s,f(s))]}),A.setUiContainer(s,a),R(s),i?a.renderTo(i).reflow():a.renderTo().reflow(),C(s,a),o(),Y(s),s.on("nodeChange",r),s.on("ResizeWindow",r),s.on("activate",o),s.on("deactivate",u),s.nodeChanged())};return s.settings.content_editable=!0,s.on("focus",function(){!1===g(s)&&e.skinUiCss?l.styleSheetLoader.load(e.skinUiCss,c,c):c()}),s.on("blur hide",u),s.on("remove",function(){a&&(a.remove(),a=null)}),!1===g(s)&&e.skinUiCss?l.styleSheetLoader.load(e.skinUiCss,be(s)):be(s)(),{}};function Mt(i,r){var o,s,a=this,l=at.classPrefix;a.show=function(e,t){function n(){o&&(_e(i).append('
                '),t&&t())}return a.hide(),o=!0,e?s=u.setTimeout(n,e):n(),a},a.hide=function(){var e=i.lastChild;return u.clearTimeout(s),e&&-1!==e.className.indexOf("throbber")&&e.parentNode.removeChild(e),o=!1,a}}var Nt=function(e,t){var n;e.on("ProgressState",function(e){n=n||new Mt(t.panel.getEl("body")),e.state?n.show(e.time):n.hide()})},Pt=function(e,t,n){var i=function(e){var t=e.settings,n=t.skin,i=t.skin_url;if(!1!==n){var r=n||"lightgray";i=i?e.documentBaseURI.toAbsolute(i):h.baseURL+"/skins/"+r}return i}(e);return i&&(n.skinUiCss=i+"/skin.min.css",e.contentCSS.push(i+"/content"+(e.inline?".inline":"")+".min.css")),Nt(e,t),e.getParam("inline",!1,"boolean")?Tt(e,t,n):we(e,t,n)},Wt=at.extend({Mixins:[Me],Defaults:{classes:"widget tooltip tooltip-n"},renderHtml:function(){var e=this,t=e.classPrefix;return'"},bindStates:function(){var t=this;return t.state.on("change:text",function(e){t.getEl().lastChild.innerHTML=t.encode(e.value)}),t._super()},repaint:function(){var e,t;e=this.getEl().style,t=this._layoutRect,e.left=t.x+"px",e.top=t.y+"px",e.zIndex=131070}}),Dt=at.extend({init:function(i){var r=this;r._super(i),i=r.settings,r.canFocus=!0,i.tooltip&&!1!==Dt.tooltips&&(r.on("mouseenter",function(e){var t=r.tooltip().moveTo(-65535);if(e.control===r){var n=t.text(i.tooltip).show().testMoveRel(r.getEl(),["bc-tc","bc-tl","bc-tr"]);t.classes.toggle("tooltip-n","bc-tc"===n),t.classes.toggle("tooltip-nw","bc-tl"===n),t.classes.toggle("tooltip-ne","bc-tr"===n),t.moveRel(r.getEl(),n)}else t.hide()}),r.on("mouseleave mousedown click",function(){r.tooltip().remove(),r._tooltip=null})),r.aria("label",i.ariaLabel||i.tooltip)},tooltip:function(){return this._tooltip||(this._tooltip=new Wt({type:"tooltip"}),A.inheritUiContainer(this,this._tooltip),this._tooltip.renderTo()),this._tooltip},postRender:function(){var e=this,t=e.settings;e._super(),e.parent()||!t.width&&!t.height||(e.initLayoutRect(),e.repaint()),t.autofocus&&e.focus()},bindStates:function(){var t=this;function n(e){t.aria("disabled",e),t.classes.toggle("disabled",e)}function i(e){t.aria("pressed",e),t.classes.toggle("active",e)}return t.state.on("change:disabled",function(e){n(e.value)}),t.state.on("change:active",function(e){i(e.value)}),t.state.get("disabled")&&n(!0),t.state.get("active")&&i(!0),t._super()},remove:function(){this._super(),this._tooltip&&(this._tooltip.remove(),this._tooltip=null)}}),Ot=Dt.extend({Defaults:{value:0},init:function(e){this._super(e),this.classes.add("progress"),this.settings.filter||(this.settings.filter=function(e){return Math.round(e)})},renderHtml:function(){var e=this._id,t=this.classPrefix;return'
                0%
                '},postRender:function(){return this._super(),this.value(this.settings.value),this},bindStates:function(){var t=this;function n(e){e=t.settings.filter(e),t.getEl().lastChild.innerHTML=e+"%",t.getEl().firstChild.firstChild.style.width=e+"%"}return t.state.on("change:value",function(e){n(e.value)}),n(t.state.get("value")),t._super()}}),At=function(e,t){e.getEl().lastChild.textContent=t+(e.progressBar?" "+e.progressBar.value()+"%":"")},Bt=at.extend({Mixins:[Me],Defaults:{classes:"widget notification"},init:function(e){var t=this;t._super(e),t.maxWidth=e.maxWidth,e.text&&t.text(e.text),e.icon&&(t.icon=e.icon),e.color&&(t.color=e.color),e.type&&t.classes.add("notification-"+e.type),e.timeout&&(e.timeout<0||0
                '),e=' style="max-width: '+t.maxWidth+"px;"+(t.color?"background-color: "+t.color+';"':'"'),t.closeButton&&(r=''),t.progressBar&&(o=t.progressBar.renderHtml()),''},postRender:function(){var e=this;return u.setTimeout(function(){e.$el.addClass(e.classPrefix+"in"),At(e,e.state.get("text"))},100),e._super()},bindStates:function(){var t=this;return t.state.on("change:text",function(e){t.getEl().firstChild.innerHTML=e.value,At(t,e.value)}),t.progressBar&&(t.progressBar.bindStates(),t.progressBar.state.on("change:value",function(e){At(t,t.state.get("text"))})),t._super()},close:function(){return this.fire("close").isDefaultPrevented()||this.remove(),this},repaint:function(){var e,t;e=this.getEl().style,t=this._layoutRect,e.left=t.x+"px",e.top=t.y+"px",e.zIndex=65534}});function Lt(o){var s=function(e){return e.inline?e.getElement():e.getContentAreaContainer()};return{open:function(e,t){var n,i=w.extend(e,{maxWidth:(n=s(o),Ce.getSize(n).width)}),r=new Bt(i);return 0<(r.args=i).timeout&&(r.timer=setTimeout(function(){r.close(),t()},i.timeout)),r.on("close",function(){t()}),r.renderTo(),r},close:function(e){e.close()},reposition:function(e){Z(e,function(e){e.moveTo(0,0)}),function(n){if(0e.w&&(n=e.x-Math.max(0,t/2),r.layoutRect({w:t,x:n}),i=!0),o&&(o.layoutRect({w:r.layoutRect().innerW}).recalc(),(t=o.layoutRect().minW+e.deltaW)>e.w&&(n=e.x-Math.max(0,t-e.w),r.layoutRect({w:t,x:n}),i=!0)),i&&r.recalc()},initLayoutRect:function(){var e,t=this,n=t._super(),i=0;if(t.settings.title&&!t._fullscreen){e=t.getEl("head");var r=Ce.getSize(e);n.headerW=r.width,n.headerH=r.height,i+=n.headerH}t.statusbar&&(i+=t.statusbar.layoutRect().h),n.deltaH+=i,n.minH+=i,n.h+=i;var o=Ce.getWindowSize();return n.x=t.settings.x||Math.max(0,o.w/2-n.w/2),n.y=t.settings.y||Math.max(0,o.h/2-n.h/2),n},renderHtml:function(){var e=this,t=e._layout,n=e._id,i=e.classPrefix,r=e.settings,o="",s="",a=r.html;return e.preRender(),t.preRender(e),r.title&&(o='
                '+e.encode(r.title)+'
                '),r.url&&(a=''),void 0===a&&(a=t.renderHtml(e)),e.statusbar&&(s=e.statusbar.renderHtml()),'
                '+o+'
                '+a+"
                "+s+"
                "},fullscreen:function(e){var n,t,i=this,r=_.document.documentElement,o=i.classPrefix;if(e!==i._fullscreen)if(_e(_.window).on("resize",function(){var e;if(i._fullscreen)if(n)i._timer||(i._timer=u.setTimeout(function(){var e=Ce.getWindowSize();i.moveTo(0,0).resizeTo(e.w,e.h),i._timer=0},50));else{e=(new Date).getTime();var t=Ce.getWindowSize();i.moveTo(0,0).resizeTo(t.w,t.h),50<(new Date).getTime()-e&&(n=!0)}}),t=i.layoutRect(),i._fullscreen=e){i._initial={x:t.x,y:t.y,w:t.w,h:t.h},i.borderBox=We("0"),i.getEl("head").style.display="none",t.deltaH-=t.headerH+2,_e([r,_.document.body]).addClass(o+"fullscreen"),i.classes.add("fullscreen");var s=Ce.getWindowSize();i.moveTo(0,0).resizeTo(s.w,s.h)}else i.borderBox=We(i.settings.border),i.getEl("head").style.display="",t.deltaH+=t.headerH,_e([r,_.document.body]).removeClass(o+"fullscreen"),i.classes.remove("fullscreen"),i.moveTo(i._initial.x,i._initial.y).resizeTo(i._initial.w,i._initial.h);return i.reflow()},postRender:function(){var t,n=this;setTimeout(function(){n.classes.add("in"),n.fire("open")},0),n._super(),n.statusbar&&n.statusbar.postRender(),n.focus(),this.dragHelper=new ht(n._id+"-dragh",{start:function(){t={x:n.layoutRect().x,y:n.layoutRect().y}},drag:function(e){n.moveTo(t.x+e.deltaX,t.y+e.deltaY)}}),n.on("submit",function(e){e.isDefaultPrevented()||n.close()}),zt.push(n),Ft(!0)},submit:function(){return this.fire("submit",{data:this.toJSON()})},remove:function(){var e,t=this;for(t.dragHelper.destroy(),t._super(),t.statusbar&&this.statusbar.remove(),Ut(t.classPrefix,!1),e=zt.length;e--;)zt[e]===t&&zt.splice(e,1);Ft(0'+this._super(e)}}),Kt=Dt.extend({Defaults:{classes:"widget btn",role:"button"},init:function(e){var t,n=this;n._super(e),e=n.settings,t=n.settings.size,n.on("click mousedown",function(e){e.preventDefault()}),n.on("touchstart",function(e){n.fire("click",e),e.preventDefault()}),e.subtype&&n.classes.add(e.subtype),t&&n.classes.add("btn-"+t),e.icon&&n.icon(e.icon)},icon:function(e){return arguments.length?(this.state.set("icon",e),this):this.state.get("icon")},repaint:function(){var e,t=this.getEl().firstChild;t&&((e=t.style).width=e.height="100%"),this._super()},renderHtml:function(){var e,t,n=this,i=n._id,r=n.classPrefix,o=n.state.get("icon"),s=n.state.get("text"),a="",l=n.settings;return(e=l.image)?(o="none","string"!=typeof e&&(e=_.window.getSelection?e[0]:e[1]),e=" style=\"background-image: url('"+e+"')\""):e="",s&&(n.classes.add("btn-has-text"),a=''+n.encode(s)+""),o=o?r+"ico "+r+"i-"+o:"",t="boolean"==typeof l.active?' aria-pressed="'+l.active+'"':"",'
                "},bindStates:function(){var o=this,n=o.$,i=o.classPrefix+"txt";function s(e){var t=n("span."+i,o.getEl());e?(t[0]||(n("button:first",o.getEl()).append(''),t=n("span."+i,o.getEl())),t.html(o.encode(e))):t.remove(),o.classes.toggle("btn-has-text",!!e)}return o.state.on("change:text",function(e){s(e.value)}),o.state.on("change:icon",function(e){var t=e.value,n=o.classPrefix;t=(o.settings.icon=t)?n+"ico "+n+"i-"+o.settings.icon:"";var i=o.getEl().firstChild,r=i.getElementsByTagName("i")[0];t?(r&&r===i.firstChild||(r=_.document.createElement("i"),i.insertBefore(r,i.firstChild)),r.className=t):r&&i.removeChild(r),s(o.state.get("text"))}),o._super()}}),Zt=Kt.extend({init:function(e){e=w.extend({text:"Browse...",multiple:!1,accept:null},e),this._super(e),this.classes.add("browsebutton"),e.multiple&&this.classes.add("multiple")},postRender:function(){var n=this,t=Ce.create("input",{type:"file",id:n._id+"-browse",accept:n.settings.accept});n._super(),_e(t).on("change",function(e){var t=e.target.files;n.value=function(){return t.length?n.settings.multiple?t:t[0]:null},e.preventDefault(),t.length&&n.fire("change",e)}),_e(t).on("click",function(e){e.stopPropagation()}),_e(n.getEl("button")).on("click touchstart",function(e){e.stopPropagation(),t.click(),e.preventDefault()}),n.getEl().appendChild(t)},remove:function(){_e(this.getEl("button")).off(),_e(this.getEl("input")).off(),this._super()}}),Qt=dt.extend({Defaults:{defaultType:"button",role:"group"},renderHtml:function(){var e=this,t=e._layout;return e.classes.add("btn-group"),e.preRender(),t.preRender(e),'
                '+(e.settings.html||"")+t.renderHtml(e)+"
                "}}),en=Dt.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(e){var t=this;t._super(e),t.on("click mousedown",function(e){e.preventDefault()}),t.on("click",function(e){e.preventDefault(),t.disabled()||t.checked(!t.checked())}),t.checked(t.settings.checked)},checked:function(e){return arguments.length?(this.state.set("checked",e),this):this.state.get("checked")},value:function(e){return arguments.length?this.checked(e):this.checked()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
                '+e.encode(e.state.get("text"))+"
                "},bindStates:function(){var o=this;function t(e){o.classes.toggle("checked",e),o.aria("checked",e)}return o.state.on("change:text",function(e){o.getEl("al").firstChild.data=o.translate(e.value)}),o.state.on("change:checked change:value",function(e){o.fire("change"),t(e.value)}),o.state.on("change:icon",function(e){var t=e.value,n=o.classPrefix;if(void 0===t)return o.settings.icon;t=(o.settings.icon=t)?n+"ico "+n+"i-"+o.settings.icon:"";var i=o.getEl().firstChild,r=i.getElementsByTagName("i")[0];t?(r&&r===i.firstChild||(r=_.document.createElement("i"),i.insertBefore(r,i.firstChild)),r.className=t):r&&i.removeChild(r)}),o.state.get("checked")&&t(!0),o._super()}}),tn=tinymce.util.Tools.resolve("tinymce.util.VK"),nn=Dt.extend({init:function(i){var r=this;r._super(i),i=r.settings,r.classes.add("combobox"),r.subinput=!0,r.ariaTarget="inp",i.menu=i.menu||i.values,i.menu&&(i.icon="caret"),r.on("click",function(e){var t=e.target,n=r.getEl();if(_e.contains(n,t)||t===n)for(;t&&t!==n;)t.id&&-1!==t.id.indexOf("-open")&&(r.fire("action"),i.menu&&(r.showMenu(),e.aria&&r.menu.items()[0].focus())),t=t.parentNode}),r.on("keydown",function(e){var t;13===e.keyCode&&"INPUT"===e.target.nodeName&&(e.preventDefault(),r.parents().reverse().each(function(e){if(e.toJSON)return t=e,!1}),r.fire("submit",{data:t.toJSON()}))}),r.on("keyup",function(e){if("INPUT"===e.target.nodeName){var t=r.state.get("value"),n=e.target.value;n!==t&&(r.state.set("value",n),r.fire("autocomplete",e))}}),r.on("mouseover",function(e){var t=r.tooltip().moveTo(-65535);if(r.statusLevel()&&-1!==e.target.className.indexOf(r.classPrefix+"status")){var n=r.statusMessage()||"Ok",i=t.text(n).show().testMoveRel(e.target,["bc-tc","bc-tl","bc-tr"]);t.classes.toggle("tooltip-n","bc-tc"===i),t.classes.toggle("tooltip-nw","bc-tl"===i),t.classes.toggle("tooltip-ne","bc-tr"===i),t.moveRel(e.target,i)}})},statusLevel:function(e){return 0
                ',i.disabled()&&(u+=' disabled="disabled"'),(e=o.icon)&&"caret"!==e&&(e=s+"ico "+s+"i-"+o.icon),t=i.state.get("text"),(e||t)&&(l='
                ",i.classes.add("has-open")),'
                '+n+l+"
                "},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl("inp").value),this.state.get("value"))},showAutoComplete:function(e,i){var r=this;if(0!==e.length){r.menu?r.menu.items().remove():r.menu=b.create({type:"menu",classes:"combobox-menu",layout:"flow"}).parent(r).renderTo(),w.each(e,function(e){var t,n;r.menu.add({text:e.title,url:e.previewUrl,match:i,classes:"menu-item-ellipsis",onclick:(t=e.value,n=e.title,function(){r.fire("selectitem",{title:n,value:t})})})}),r.menu.renderNew(),r.hideMenu(),r.menu.on("cancel",function(e){e.control.parent()===r.menu&&(e.stopPropagation(),r.focus(),r.hideMenu())}),r.menu.on("select",function(){r.focus()});var t=r.layoutRect().w;r.menu.layoutRect({w:t,minW:0,maxW:t}),r.menu.repaint(),r.menu.reflow(),r.menu.show(),r.menu.moveRel(r.getEl(),r.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])}else r.hideMenu()},hideMenu:function(){this.menu&&this.menu.hide()},bindStates:function(){var r=this;r.state.on("change:value",function(e){r.getEl("inp").value!==e.value&&(r.getEl("inp").value=e.value)}),r.state.on("change:disabled",function(e){r.getEl("inp").disabled=e.value}),r.state.on("change:statusLevel",function(e){var t=r.getEl("status"),n=r.classPrefix,i=e.value;Ce.css(t,"display","none"===i?"none":""),Ce.toggleClass(t,n+"i-checkmark","ok"===i),Ce.toggleClass(t,n+"i-warning","warn"===i),Ce.toggleClass(t,n+"i-error","error"===i),r.classes.toggle("has-status","none"!==i),r.repaint()}),Ce.on(r.getEl("status"),"mouseleave",function(){r.tooltip().hide()}),r.on("cancel",function(e){r.menu&&r.menu.visible()&&(e.stopPropagation(),r.hideMenu())});var n=function(e,t){t&&0'+e.encode(i)+""),'
                '},postRender:function(){var t=this,n=t.settings.onclick;return t.on("click",function(e){e.aria&&"down"===e.aria.key||e.control!==t||sn.getParent(e.target,"."+t.classPrefix+"open")||(e.stopImmediatePropagation(),n.call(t,e))}),delete t.settings.onclick,t._super()}}),ln=tinymce.util.Tools.resolve("tinymce.util.Color"),un=Dt.extend({Defaults:{classes:"widget colorpicker"},init:function(e){this._super(e)},postRender:function(){var n,i,r,o,s,a=this,l=a.color();function u(e,t){var n,i,r=Ce.getPos(e);return n=t.pageX-r.x,i=t.pageY-r.y,{x:n=Math.max(0,Math.min(n/e.clientWidth,1)),y:i=Math.max(0,Math.min(i/e.clientHeight,1))}}function c(e,t){var n=(360-e.h)/360;Ce.css(r,{top:100*n+"%"}),t||Ce.css(s,{left:e.s+"%",top:100-e.v+"%"}),o.style.background=ln({s:100,v:100,h:e.h}).toHex(),a.color().parse({s:e.s,v:e.v,h:e.h})}function e(e){var t;t=u(o,e),n.s=100*t.x,n.v=100*(1-t.y),c(n),a.fire("change")}function t(e){var t;t=u(i,e),(n=l.toHsv()).h=360*(1-t.y),c(n,!0),a.fire("change")}i=a.getEl("h"),r=a.getEl("hp"),o=a.getEl("sv"),s=a.getEl("svp"),a._repaint=function(){c(n=l.toHsv())},a._super(),a._svdraghelper=new ht(a._id+"-sv",{start:e,drag:e}),a._hdraghelper=new ht(a._id+"-h",{start:t,drag:t}),a._repaint()},rgb:function(){return this.color().toRgb()},value:function(e){if(!arguments.length)return this.color().toHex();this.color().parse(e),this._rendered&&this._repaint()},color:function(){return this._color||(this._color=ln()),this._color},renderHtml:function(){var e,t=this._id,o=this.classPrefix,s="#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000";return e='
                '+function(){var e,t,n,i,r="";for(n="filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=",e=0,t=(i=s.split(",")).length-1;e
                ';return r}()+'
                ','
                '+e+"
                "}}),cn=Dt.extend({init:function(e){e=w.extend({height:100,text:"Drop an image here",multiple:!1,accept:null},e),this._super(e),this.classes.add("dropzone"),e.multiple&&this.classes.add("multiple")},renderHtml:function(){var e,t,n=this.settings;return e={id:this._id,hidefocus:"1"},t=Ce.create("div",e,""+this.translate(n.text)+""),n.height&&Ce.css(t,"height",n.height+"px"),n.width&&Ce.css(t,"width",n.width+"px"),t.className=this.classes,t.outerHTML},postRender:function(){var i=this,e=function(e){e.preventDefault(),i.classes.toggle("dragenter"),i.getEl().className=i.classes};i._super(),i.$el.on("dragover",function(e){e.preventDefault()}),i.$el.on("dragenter",e),i.$el.on("dragleave",e),i.$el.on("drop",function(e){if(e.preventDefault(),!i.state.get("disabled")){var t=function(e){var t=i.settings.accept;if("string"!=typeof t)return e;var n=new RegExp("("+t.split(/\s*,\s*/).join("|")+")$","i");return w.grep(e,function(e){return n.test(e.name)})}(e.dataTransfer.files);i.value=function(){return t.length?i.settings.multiple?t:t[0]:null},t.length&&i.fire("change",e)}})},remove:function(){this.$el.off(),this._super()}}),dn=Dt.extend({init:function(e){var n=this;e.delimiter||(e.delimiter="\xbb"),n._super(e),n.classes.add("path"),n.canFocus=!0,n.on("click",function(e){var t;(t=e.target.getAttribute("data-index"))&&n.fire("select",{value:n.row()[t],index:t})}),n.row(n.settings.row)},focus:function(){return this.getEl().firstChild.focus(),this},row:function(e){return arguments.length?(this.state.set("row",e),this):this.state.get("row")},renderHtml:function(){return'
                '+this._getDataPathHtml(this.state.get("row"))+"
                "},bindStates:function(){var t=this;return t.state.on("change:row",function(e){t.innerHtml(t._getDataPathHtml(e.value))}),t._super()},_getDataPathHtml:function(e){var t,n,i=e||[],r="",o=this.classPrefix;for(t=0,n=i.length;t
                ")}return s&&t.parent().classes.add("menu-has-icons"),i.image&&(a=" style=\"background-image: url('"+i.image+"')\""),l&&(l=function(e){var t,n,i={};for(i=he.mac?{alt:"⌥",ctrl:"⌘",shift:"⇧",meta:"⌘"}:{meta:"Ctrl"},e=e.split("+"),t=0;t
                \xa0":"",o=f(t.encode(d(o))),u=f(t.encode(d(u))),'
                '+e+("-"!==o?''+o+"":"")+(l?'
                '+l+"
                ":"")+(i.menu?'
                ':"")+(u?'":"")+"
                "},postRender:function(){var t=this,n=t.settings,e=n.textStyle;if("function"==typeof e&&(e=e.call(this)),e){var i=t.getEl("text");i&&(i.setAttribute("style",e),t._textStyle=e)}return t.on("mouseenter click",function(e){e.control===t&&(n.menu||"click"!==e.type?(t.showMenu(),e.aria&&t.menu.focus(!0)):(t.fire("select"),u.requestAnimationFrame(function(){t.parent().hideAll()})))}),t._super(),t},hover:function(){return this.parent().items().each(function(e){e.classes.remove("selected")}),this.classes.toggle("selected",!0),this},active:function(e){return function(e,t){var n=e._textStyle;if(n){var i=e.getEl("text");i.setAttribute("style",n),t&&(i.style.color="",i.style.backgroundColor="")}}(this,e),void 0!==e&&this.aria("checked",e),this._super(e)},remove:function(){this._super(),this.menu&&this.menu.remove()}}),ur=en.extend({Defaults:{classes:"radio",role:"radio"}}),cr=Dt.extend({renderHtml:function(){var e=this,t=e.classPrefix;return e.classes.add("resizehandle"),"both"===e.settings.direction&&e.classes.add("resizehandle-both"),e.canFocus=!1,'
                '},postRender:function(){var t=this;t._super(),t.resizeDragHelper=new ht(this._id,{start:function(){t.fire("ResizeStart")},drag:function(e){"both"!==t.settings.direction&&(e.deltaX=0),t.fire("Resize",e)},stop:function(){t.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}});function dr(e){var t="";if(e)for(var n=0;n'+e[n]+"";return t}var fr=Dt.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(e){var n=this;n._super(e),n.settings.size&&(n.size=n.settings.size),n.settings.options&&(n._options=n.settings.options),n.on("keydown",function(e){var t;13===e.keyCode&&(e.preventDefault(),n.parents().reverse().each(function(e){if(e.toJSON)return t=e,!1}),n.fire("submit",{data:t.toJSON()}))})},options:function(e){return arguments.length?(this.state.set("options",e),this):this.state.get("options")},renderHtml:function(){var e,t=this,n="";return e=dr(t._options),t.size&&(n=' size = "'+t.size+'"'),'"},bindStates:function(){var t=this;return t.state.on("change:options",function(e){t.getEl().innerHTML=dr(e.value)}),t._super()}});function hr(e,t,n){return e
                '},reset:function(){this.value(this._initValue).repaint()},postRender:function(){var e,t,n,i,r,o,s,a,l,u,c,d,f,h,m=this;e=m._minValue,t=m._maxValue,"v"===m.settings.orientation?(n="screenY",i="top",r="height",o="h"):(n="screenX",i="left",r="width",o="w"),m._super(),function(o,s){function t(e){var t,n,i,r;t=hr(t=(((t=m.value())+(r=n=o))/((i=s)-r)+.05*e)*(i-n)-n,o,s),m.value(t),m.fire("dragstart",{value:t}),m.fire("drag",{value:t}),m.fire("dragend",{value:t})}m.on("keydown",function(e){switch(e.keyCode){case 37:case 38:t(-1);break;case 39:case 40:t(1)}})}(e,t),s=e,a=t,l=m.getEl("handle"),m._dragHelper=new ht(m._id,{handle:m._id+"-handle",start:function(e){u=e[n],c=parseInt(m.getEl("handle").style[i],10),d=(m.layoutRect()[o]||100)-Ce.getSize(l)[r],m.fire("dragstart",{value:h})},drag:function(e){var t=e[n]-u;f=hr(c+t,0,d),l.style[i]=f+"px",h=s+f/d*(a-s),m.value(h),m.tooltip().text(""+m.settings.previewFilter(h)).show().moveRel(l,"bc tc"),m.fire("drag",{value:h})},stop:function(){m.tooltip().hide(),m.fire("dragend",{value:h})}})},repaint:function(){this._super(),gr(this,this.value())},bindStates:function(){var t=this;return t.state.on("change:value",function(e){gr(t,e.value)}),t._super()}}),vr=Dt.extend({renderHtml:function(){return this.classes.add("spacer"),this.canFocus=!1,'
                '}}),br=or.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var e,t,n=this.getEl(),i=this.layoutRect();return this._super(),e=n.firstChild,t=n.lastChild,_e(e).css({width:i.w-Ce.getSize(t).width,height:i.h-2}),_e(t).css({height:i.h-2}),this},activeMenu:function(e){_e(this.getEl().lastChild).toggleClass(this.classPrefix+"active",e)},renderHtml:function(){var e,t,n=this,i=n._id,r=n.classPrefix,o=n.state.get("icon"),s=n.state.get("text"),a=n.settings,l="";return(e=a.image)?(o="none","string"!=typeof e&&(e=_.window.getSelection?e[0]:e[1]),e=" style=\"background-image: url('"+e+"')\""):e="",o=a.icon?r+"ico "+r+"i-"+o:"",s&&(n.classes.add("btn-has-text"),l=''+n.encode(s)+""),t="boolean"==typeof a.active?' aria-pressed="'+a.active+'"':"",'
                '},postRender:function(){var n=this.settings.onclick;return this.on("click",function(e){var t=e.target;if(e.control===this)for(;t;){if(e.aria&&"down"!==e.aria.key||"BUTTON"===t.nodeName&&-1===t.className.indexOf("open"))return e.stopImmediatePropagation(),void(n&&n.call(this,e));t=t.parentNode}}),delete this.settings.onclick,this._super()}}),yr=Ri.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}}),xr=yt.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(n){var e;this.activeTabId&&(e=this.getEl(this.activeTabId),_e(e).removeClass(this.classPrefix+"active"),e.setAttribute("aria-selected","false")),this.activeTabId="t"+n,(e=this.getEl("t"+n)).setAttribute("aria-selected","true"),_e(e).addClass(this.classPrefix+"active"),this.items()[n].show().fire("showtab"),this.reflow(),this.items().each(function(e,t){n!==t&&e.hide()})},renderHtml:function(){var i=this,e=i._layout,r="",o=i.classPrefix;return i.preRender(),e.preRender(i),i.items().each(function(e,t){var n=i._id+"-t"+t;e.aria("role","tabpanel"),e.aria("labelledby",n),r+='"}),'
                '+r+'
                '+e.renderHtml(i)+"
                "},postRender:function(){var i=this;i._super(),i.settings.activeTab=i.settings.activeTab||0,i.activateTab(i.settings.activeTab),this.on("click",function(e){var t=e.target.parentNode;if(t&&t.id===i._id+"-head")for(var n=t.childNodes.length;n--;)t.childNodes[n]===e.target&&i.activateTab(n)})},initLayoutRect:function(){var e,t,n,i=this;t=(t=Ce.getSize(i.getEl("head")).width)<0?0:t,n=0,i.items().each(function(e){t=Math.max(t,e.layoutRect().minW),n=Math.max(n,e.layoutRect().minH)}),i.items().each(function(e){e.settings.x=0,e.settings.y=0,e.settings.w=t,e.settings.h=n,e.layoutRect({x:0,y:0,w:t,h:n})});var r=Ce.getSize(i.getEl("head")).height;return i.settings.minWidth=t,i.settings.minHeight=n+r,(e=i._super()).deltaH+=r,e.innerH=e.h-e.deltaH,e}}),wr=Dt.extend({init:function(e){var n=this;n._super(e),n.classes.add("textbox"),e.multiline?n.classes.add("multiline"):(n.on("keydown",function(e){var t;13===e.keyCode&&(e.preventDefault(),n.parents().reverse().each(function(e){if(e.toJSON)return t=e,!1}),n.fire("submit",{data:t.toJSON()}))}),n.on("keyup",function(e){n.state.set("value",e.target.value)}))},repaint:function(){var e,t,n,i,r,o=this,s=0;e=o.getEl().style,t=o._layoutRect,r=o._lastRepaintRect||{};var a=_.document;return!o.settings.multiline&&a.all&&(!a.documentMode||a.documentMode<=8)&&(e.lineHeight=t.h-s+"px"),i=(n=o.borderBox).left+n.right+8,s=n.top+n.bottom+(o.settings.multiline?8:0),t.x!==r.x&&(e.left=t.x+"px",r.x=t.x),t.y!==r.y&&(e.top=t.y+"px",r.y=t.y),t.w!==r.w&&(e.width=t.w-i+"px",r.w=t.w),t.h!==r.h&&(e.height=t.h-s+"px",r.h=t.h),o._lastRepaintRect=r,o.fire("repaint",{},!1),o},renderHtml:function(){var t,e,n=this,i=n.settings;return t={id:n._id,hidefocus:"1"},w.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(e){t[e]=i[e]}),n.disabled()&&(t.disabled="disabled"),i.subtype&&(t.type=i.subtype),(e=Ce.create(i.multiline?"textarea":"input",t)).value=n.state.get("value"),e.className=n.classes.toString(),e.outerHTML},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var t=this;t.getEl().value=t.state.get("value"),t._super(),t.$el.on("change",function(e){t.state.set("value",e.target.value),t.fire("change",e)})},bindStates:function(){var t=this;return t.state.on("change:value",function(e){t.getEl().value!==e.value&&(t.getEl().value=e.value)}),t.state.on("change:disabled",function(e){t.getEl().disabled=e.value}),t._super()},remove:function(){this.$el.off(),this._super()}}),_r=function(){return{Selector:Ve,Collection:qe,ReflowQueue:et,Control:at,Factory:b,KeyboardNavigation:ut,Container:dt,DragHelper:ht,Scrollable:bt,Panel:yt,Movable:Me,Resizable:xt,FloatPanel:Ht,Window:Vt,MessageBox:Xt,Tooltip:Wt,Widget:Dt,Progress:Ot,Notification:Bt,Layout:Jt,AbsoluteLayout:Gt,Button:Kt,ButtonGroup:Qt,Checkbox:en,ComboBox:nn,ColorBox:rn,PanelButton:on,ColorButton:an,ColorPicker:un,Path:dn,ElementPath:fn,FormItem:hn,Form:mn,FieldSet:gn,FilePicker:xi,FitLayout:wi,FlexLayout:_i,FlowLayout:Ri,FormatControls:Zi,GridLayout:Qi,Iframe:er,InfoBox:tr,Label:nr,Toolbar:ir,MenuBar:rr,MenuButton:or,MenuItem:lr,Throbber:Mt,Menu:sr,ListBox:ar,Radio:ur,ResizeHandle:cr,SelectBox:fr,Slider:pr,Spacer:vr,SplitButton:br,StackLayout:yr,TabPanel:xr,TextBox:wr,DropZone:cn,BrowseButton:Zt}},Rr=function(n){n.ui?w.each(_r(),function(e,t){n.ui[t]=e}):n.ui=_r()};w.each(_r(),function(e,t){b.add(t,e)}),Rr(window.tinymce?window.tinymce:{}),o.add("modern",function(e){return Zi.setup(e),jt(e)})}(window); +// Source: wp-includes/js/tinymce/plugins/charmap/plugin.min.js +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(e,t){return e.fire("insertCustomChar",{chr:t})},l=function(e,t){var a=i(e,t).chr;e.execCommand("mceInsertContent",!1,a)},a=tinymce.util.Tools.resolve("tinymce.util.Tools"),r=function(e){return e.settings.charmap},n=function(e){return e.settings.charmap_append},o=a.isArray,c=function(e){return o(e)?[].concat((t=e,a.grep(t,function(e){return o(e)&&2===e.length}))):"function"==typeof e?e():[];var t},s=function(e){return function(e,t){var a=r(e);a&&(t=c(a));var i=n(e);return i?[].concat(t).concat(c(i)):t}(e,[["160","no-break space"],["173","soft hyphen"],["34","quotation mark"],["162","cent sign"],["8364","euro sign"],["163","pound sign"],["165","yen sign"],["169","copyright sign"],["174","registered sign"],["8482","trade mark sign"],["8240","per mille sign"],["181","micro sign"],["183","middle dot"],["8226","bullet"],["8230","three dot leader"],["8242","minutes / feet"],["8243","seconds / inches"],["167","section sign"],["182","paragraph sign"],["223","sharp s / ess-zed"],["8249","single left-pointing angle quotation mark"],["8250","single right-pointing angle quotation mark"],["171","left pointing guillemet"],["187","right pointing guillemet"],["8216","left single quotation mark"],["8217","right single quotation mark"],["8220","left double quotation mark"],["8221","right double quotation mark"],["8218","single low-9 quotation mark"],["8222","double low-9 quotation mark"],["60","less-than sign"],["62","greater-than sign"],["8804","less-than or equal to"],["8805","greater-than or equal to"],["8211","en dash"],["8212","em dash"],["175","macron"],["8254","overline"],["164","currency sign"],["166","broken bar"],["168","diaeresis"],["161","inverted exclamation mark"],["191","turned question mark"],["710","circumflex accent"],["732","small tilde"],["176","degree sign"],["8722","minus sign"],["177","plus-minus sign"],["247","division sign"],["8260","fraction slash"],["215","multiplication sign"],["185","superscript one"],["178","superscript two"],["179","superscript three"],["188","fraction one quarter"],["189","fraction one half"],["190","fraction three quarters"],["402","function / florin"],["8747","integral"],["8721","n-ary sumation"],["8734","infinity"],["8730","square root"],["8764","similar to"],["8773","approximately equal to"],["8776","almost equal to"],["8800","not equal to"],["8801","identical to"],["8712","element of"],["8713","not an element of"],["8715","contains as member"],["8719","n-ary product"],["8743","logical and"],["8744","logical or"],["172","not sign"],["8745","intersection"],["8746","union"],["8706","partial differential"],["8704","for all"],["8707","there exists"],["8709","diameter"],["8711","backward difference"],["8727","asterisk operator"],["8733","proportional to"],["8736","angle"],["180","acute accent"],["184","cedilla"],["170","feminine ordinal indicator"],["186","masculine ordinal indicator"],["8224","dagger"],["8225","double dagger"],["192","A - grave"],["193","A - acute"],["194","A - circumflex"],["195","A - tilde"],["196","A - diaeresis"],["197","A - ring above"],["256","A - macron"],["198","ligature AE"],["199","C - cedilla"],["200","E - grave"],["201","E - acute"],["202","E - circumflex"],["203","E - diaeresis"],["274","E - macron"],["204","I - grave"],["205","I - acute"],["206","I - circumflex"],["207","I - diaeresis"],["298","I - macron"],["208","ETH"],["209","N - tilde"],["210","O - grave"],["211","O - acute"],["212","O - circumflex"],["213","O - tilde"],["214","O - diaeresis"],["216","O - slash"],["332","O - macron"],["338","ligature OE"],["352","S - caron"],["217","U - grave"],["218","U - acute"],["219","U - circumflex"],["220","U - diaeresis"],["362","U - macron"],["221","Y - acute"],["376","Y - diaeresis"],["562","Y - macron"],["222","THORN"],["224","a - grave"],["225","a - acute"],["226","a - circumflex"],["227","a - tilde"],["228","a - diaeresis"],["229","a - ring above"],["257","a - macron"],["230","ligature ae"],["231","c - cedilla"],["232","e - grave"],["233","e - acute"],["234","e - circumflex"],["235","e - diaeresis"],["275","e - macron"],["236","i - grave"],["237","i - acute"],["238","i - circumflex"],["239","i - diaeresis"],["299","i - macron"],["240","eth"],["241","n - tilde"],["242","o - grave"],["243","o - acute"],["244","o - circumflex"],["245","o - tilde"],["246","o - diaeresis"],["248","o slash"],["333","o macron"],["339","ligature oe"],["353","s - caron"],["249","u - grave"],["250","u - acute"],["251","u - circumflex"],["252","u - diaeresis"],["363","u - macron"],["253","y - acute"],["254","thorn"],["255","y - diaeresis"],["563","y - macron"],["913","Alpha"],["914","Beta"],["915","Gamma"],["916","Delta"],["917","Epsilon"],["918","Zeta"],["919","Eta"],["920","Theta"],["921","Iota"],["922","Kappa"],["923","Lambda"],["924","Mu"],["925","Nu"],["926","Xi"],["927","Omicron"],["928","Pi"],["929","Rho"],["931","Sigma"],["932","Tau"],["933","Upsilon"],["934","Phi"],["935","Chi"],["936","Psi"],["937","Omega"],["945","alpha"],["946","beta"],["947","gamma"],["948","delta"],["949","epsilon"],["950","zeta"],["951","eta"],["952","theta"],["953","iota"],["954","kappa"],["955","lambda"],["956","mu"],["957","nu"],["958","xi"],["959","omicron"],["960","pi"],["961","rho"],["962","final sigma"],["963","sigma"],["964","tau"],["965","upsilon"],["966","phi"],["967","chi"],["968","psi"],["969","omega"],["8501","alef symbol"],["982","pi symbol"],["8476","real part symbol"],["978","upsilon - hook symbol"],["8472","Weierstrass p"],["8465","imaginary part"],["8592","leftwards arrow"],["8593","upwards arrow"],["8594","rightwards arrow"],["8595","downwards arrow"],["8596","left right arrow"],["8629","carriage return"],["8656","leftwards double arrow"],["8657","upwards double arrow"],["8658","rightwards double arrow"],["8659","downwards double arrow"],["8660","left right double arrow"],["8756","therefore"],["8834","subset of"],["8835","superset of"],["8836","not a subset of"],["8838","subset of or equal to"],["8839","superset of or equal to"],["8853","circled plus"],["8855","circled times"],["8869","perpendicular"],["8901","dot operator"],["8968","left ceiling"],["8969","right ceiling"],["8970","left floor"],["8971","right floor"],["9001","left-pointing angle bracket"],["9002","right-pointing angle bracket"],["9674","lozenge"],["9824","black spade suit"],["9827","black club suit"],["9829","black heart suit"],["9830","black diamond suit"],["8194","en space"],["8195","em space"],["8201","thin space"],["8204","zero width non-joiner"],["8205","zero width joiner"],["8206","left-to-right mark"],["8207","right-to-left mark"]])},t=function(t){return{getCharMap:function(){return s(t)},insertChar:function(e){l(t,e)}}},u=function(e){var t,a,i,r=Math.min(e.length,25),n=Math.ceil(e.length/r);for(t='',i=0;i",a=0;a
                '+s+"
                "}else t+="
                "}return t+=""},d=function(e){for(;e;){if("TD"===e.nodeName)return e;e=e.parentNode}},m=function(n){var o,e={type:"container",html:u(s(n)),onclick:function(e){var t=e.target;if(/^(TD|DIV)$/.test(t.nodeName)){var a=d(t).firstChild;if(a&&a.hasAttribute("data-chr")){var i=a.getAttribute("data-chr"),r=parseInt(i,10);isNaN(r)||l(n,String.fromCharCode(r)),e.ctrlKey||o.close()}}},onmouseover:function(e){var t=d(e.target);t&&t.firstChild?(o.find("#preview").text(t.firstChild.firstChild.data),o.find("#previewTitle").text(t.title)):(o.find("#preview").text(" "),o.find("#previewTitle").text(" "))}};o=n.windowManager.open({title:"Special character",spacing:10,padding:10,items:[e,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"spacer",minHeight:20},{type:"label",name:"previewTitle",text:" ",style:"white-space: pre-wrap;",border:1,minWidth:140}]}],buttons:[{text:"Close",onclick:function(){o.close()}}]})},g=function(e){e.addCommand("mceShowCharmap",function(){m(e)})},p=function(e){e.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),e.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"})};e.add("charmap",function(e){return g(e),p(e),t(e)})}(); +// Source: wp-includes/js/tinymce/plugins/colorpicker/plugin.min.js +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Color"),a=function(e,n){e.find("#preview")[0].getEl().style.background=n},o=function(e,n){var i=l(n),t=i.toRgb();e.fromJSON({r:t.r,g:t.g,b:t.b,hex:i.toHex().substr(1)}),a(e,i.toHex())},t=function(e,n,i){var t=e.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:i,onchange:function(){var e=this.rgb();t&&(t.find("#r").value(e.r),t.find("#g").value(e.g),t.find("#b").value(e.b),t.find("#hex").value(this.value().substr(1)),a(t,this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var e,n,i=t.find("colorpicker")[0];if(e=this.name(),n=this.value(),"hex"===e)return o(t,n="#"+n),void i.value(n);n={r:t.find("#r").value(),g:t.find("#g").value(),b:t.find("#b").value()},i.value(n),o(t,n)}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){n("#"+t.toJSON().hex)}});o(t,i)};e.add("colorpicker",function(i){i.settings.color_picker_callback||(i.settings.color_picker_callback=function(e,n){t(i,e,n)})})}(); +// Source: wp-includes/js/tinymce/plugins/compat3x/plugin.min.js +!function(u){var t;function l(){}function f(e){!t&&window&&window.console&&(t=!0,console.log("Deprecated TinyMCE API call: "+e))}function i(i,a,d,s){i=i||this;var c=[];a?(this.add=function(o,r,e){function t(e){var t=[];if("string"==typeof d&&(d=d.split(" ")),d&&"function"!=typeof d)for(var n=0;n.on"+a+".add(..)"),i.on(a,t,e);var n={original:o,patched:t};return c.push(n),t},this.addToTop=function(e,t){this.add(e,t,!0)},this.remove=function(n){return c.forEach(function(e,t){if(e.original===n)return c.splice(t,1),i.off(a,e.patched)}),i.off(a,n)},this.dispatch=function(){return i.fire(a),!0}):this.add=this.addToTop=this.remove=this.dispatch=l}function n(s){function e(e,t){u.each(e.split(" "),function(e){s["on"+e]=new i(s,e,t)})}function n(e,t,n){return[t.level,n]}function o(n){return function(e,t){if(!t.selection&&!n||t.selection==n)return[t]}}if(!s.controlManager){s.controlManager={buttons:{},setDisabled:function(e,t){f("controlManager.setDisabled(..)"),this.buttons[e]&&this.buttons[e].disabled(t)},setActive:function(e,t){f("controlManager.setActive(..)"),this.buttons[e]&&this.buttons[e].active(t)},onAdd:new i,onPostRender:new i,add:function(e){return e},createButton:r,createColorSplitButton:r,createControl:r,createDropMenu:r,createListBox:r,createMenuButton:r,createSeparator:r,createSplitButton:r,createToolbar:r,createToolbarGroup:r,destroy:l,get:l,setControlType:r},e("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate","editor"),e("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset"),e("BeforeExecCommand ExecCommand","command ui value args"),e("PreProcess PostProcess LoadContent SaveContent Change"),e("BeforeSetContent BeforeGetContent SetContent GetContent",o(!1)),e("SetProgressState","state time"),e("VisualAid","element hasVisual"),e("Undo Redo",n),e("NodeChange",function(e,t){return[s.controlManager,t.element,s.selection.isCollapsed(),t]});var c=s.addButton;s.addButton=function(e,t){var n,o,r,i;function a(){if(s.controlManager.buttons[e]=this,n)return n.apply(this,arguments)}for(var d in t)"onpostrender"===d.toLowerCase()&&(n=t[d],t.onPostRender=a);return n||(t.onPostRender=a),t.title&&(t.title=(o=t.title,r=[s.settings.language||"en",o].join("."),i=u.i18n.translate(r),r!==i?i:u.i18n.translate(o))),c.call(this,e,t)},s.on("init",function(){var e=s.undoManager,t=s.selection;e.onUndo=new i(s,"Undo",n,null,e),e.onRedo=new i(s,"Redo",n,null,e),e.onBeforeAdd=new i(s,"BeforeAddUndo",null,e),e.onAdd=new i(s,"AddUndo",null,e),t.onBeforeGetContent=new i(s,"BeforeGetContent",o(!0),t),t.onGetContent=new i(s,"GetContent",o(!0),t),t.onBeforeSetContent=new i(s,"BeforeSetContent",o(!0),t),t.onSetContent=new i(s,"SetContent",o(!0),t)}),s.on("BeforeRenderUI",function(){var e=s.windowManager;e.onOpen=new i,e.onClose=new i,e.createInstance=function(e,t,n,o,r,i){return f("windowManager.createInstance(..)"),new(u.resolve(e))(t,n,o,r,i)}})}function r(){var t={};function n(){return r()}return f("editor.controlManager.*"),u.each("add addMenu addSeparator collapse createMenu destroy displayColor expand focus getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex setActive setAriaProperty setColor setDisabled setSelected setState showMenu update".split(" "),function(e){t[e]=n}),t}}u.util.Dispatcher=i,u.onBeforeUnload=new i(u,"BeforeUnload"),u.onAddEditor=new i(u,"AddEditor","editor"),u.onRemoveEditor=new i(u,"RemoveEditor","editor"),u.util.Cookie={get:l,getHash:l,remove:l,set:l,setHash:l},u.on("SetupEditor",function(e){n(e.editor)}),u.PluginManager.add("compat3x",n),u.addI18n=function(n,e){var r=u.util.I18n,t=u.each;"string"!=typeof n||-1!==n.indexOf(".")?u.is(n,"string")?t(e,function(e,t){r.data[n+"."+t]=e}):t(n,function(e,o){t(e,function(e,n){t(e,function(e,t){"common"===n?r.data[o+"."+t]=e:r.data[o+"."+n+"."+t]=e})})}):r.add(n,e)}}(tinymce); +// Source: wp-includes/js/tinymce/plugins/directionality/plugin.min.js +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),e=function(t,e){var i,n=t.dom,o=t.selection.getSelectedBlocks();o.length&&(i=n.getAttrib(o[0],"dir"),c.each(o,function(t){n.getParent(t.parentNode,'*[dir="'+e+'"]',n.getRoot())||n.setAttrib(t,"dir",i!==e?e:null)}),t.nodeChanged())},i=function(t){t.addCommand("mceDirectionLTR",function(){e(t,"ltr")}),t.addCommand("mceDirectionRTL",function(){e(t,"rtl")})},n=function(e){var i=[];return c.each("h1 h2 h3 h4 h5 h6 div p".split(" "),function(t){i.push(t+"[dir="+e+"]")}),i.join(",")},o=function(t){t.addButton("ltr",{title:"Left to right",cmd:"mceDirectionLTR",stateSelector:n("ltr")}),t.addButton("rtl",{title:"Right to left",cmd:"mceDirectionRTL",stateSelector:n("rtl")})};t.add("directionality",function(t){i(t),o(t)})}(); +// Source: wp-includes/js/tinymce/plugins/fullscreen/plugin.min.js +!function(m){"use strict";var i=function(e){var n=e,t=function(){return n};return{get:t,set:function(e){n=e},clone:function(){return i(t())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(e){return{isFullscreen:function(){return null!==e.get()}}},n=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),g=function(e,n){e.fire("FullscreenStateChanged",{state:n})},w=n.DOM,r=function(e,n){var t,r,l,i,o,c,s=m.document.body,u=m.document.documentElement,d=n.get(),a=function(){var e,n,t,i;w.setStyle(l,"height",(t=m.window,i=m.document.body,i.offsetWidth&&(e=i.offsetWidth,n=i.offsetHeight),t.innerWidth&&t.innerHeight&&(e=t.innerWidth,n=t.innerHeight),{w:e,h:n}).h-(r.clientHeight-l.clientHeight))},h=function(){w.unbind(m.window,"resize",a)};if(t=(r=e.getContainer()).style,i=(l=e.getContentAreaContainer().firstChild).style,d)i.width=d.iframeWidth,i.height=d.iframeHeight,d.containerWidth&&(t.width=d.containerWidth),d.containerHeight&&(t.height=d.containerHeight),w.removeClass(s,"mce-fullscreen"),w.removeClass(u,"mce-fullscreen"),w.removeClass(r,"mce-fullscreen"),o=d.scrollPos,m.window.scrollTo(o.x,o.y),w.unbind(m.window,"resize",d.resizeHandler),e.off("remove",d.removeHandler),n.set(null),g(e,!1);else{var f={scrollPos:(c=w.getViewPort(),{x:c.x,y:c.y}),containerWidth:t.width,containerHeight:t.height,iframeWidth:i.width,iframeHeight:i.height,resizeHandler:a,removeHandler:h};i.width=i.height="100%",t.width=t.height="",w.addClass(s,"mce-fullscreen"),w.addClass(u,"mce-fullscreen"),w.addClass(r,"mce-fullscreen"),w.bind(m.window,"resize",a),e.on("remove",h),a(),n.set(f),g(e,!0)}},l=function(e,n){e.addCommand("mceFullScreen",function(){r(e,n)})},o=function(t){return function(e){var n=e.control;t.on("FullscreenStateChanged",function(e){n.active(e.state)})}},c=function(e){e.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Ctrl+Shift+F",selectable:!0,cmd:"mceFullScreen",onPostRender:o(e),context:"view"}),e.addButton("fullscreen",{active:!1,tooltip:"Fullscreen",cmd:"mceFullScreen",onPostRender:o(e)})};e.add("fullscreen",function(e){var n=i(null);return e.settings.inline||(l(e,n),c(e),e.addShortcut("Ctrl+Shift+F","","mceFullScreen")),t(n)})}(window); +// Source: wp-includes/js/tinymce/plugins/hr/plugin.min.js +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1,"
                ")})},o=function(n){n.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),n.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})};n.add("hr",function(n){t(n),o(n)})}(); +// Source: wp-includes/js/tinymce/plugins/image/plugin.min.js +!function(l){"use strict";var i,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=function(e){return!1!==e.settings.image_dimensions},u=function(e){return!0===e.settings.image_advtab},m=function(e){return e.getParam("image_prepend_url","")},n=function(e){return e.getParam("image_class_list")},r=function(e){return!1!==e.settings.image_description},a=function(e){return!0===e.settings.image_title},o=function(e){return!0===e.settings.image_caption},c=function(e){return e.getParam("image_list",!1)},s=function(e){return e.getParam("images_upload_url",!1)},g=function(e){return e.getParam("images_upload_handler",!1)},f=function(e){return e.getParam("images_upload_url")},p=function(e){return e.getParam("images_upload_handler")},h=function(e){return e.getParam("images_upload_base_path")},v=function(e){return e.getParam("images_upload_credentials")},b="undefined"!=typeof l.window?l.window:Function("return this;")(),y=function(e,t){return function(e,t){for(var n=t!==undefined&&null!==t?t:b,r=0;r'),i.close()}}var r,a},A=tinymce.util.Tools.resolve("tinymce.util.Tools"),f=function(t,e){var n,o,i=["noopener"],r=t?t.split(/\s+/):[],a=function(t){return t.filter(function(t){return-1===A.inArray(i,t)})};return(r=e?(n=a(n=r)).length?n.concat(i):i:a(r)).length?(o=r,A.trim(o.sort().join(" "))):null},d=function(t,e){return e=e||t.selection.getNode(),v(e)?t.dom.select("a[href]",e)[0]:t.dom.getParent(e,"a[href]")},m=function(t){return t&&"A"===t.nodeName&&t.href},v=function(t){return t&&"FIGURE"===t.nodeName&&/\bimage\b/i.test(t.className)},g=function(t,e){var n,o;(o=t.dom.select("img",e)[0])&&(n=t.dom.getParents(o,"a[href]",e)[0])&&(n.parentNode.insertBefore(o,n),t.dom.remove(n))},h=function(t,e,n){var o,i;(i=t.dom.select("img",e)[0])&&(o=t.dom.create("a",n),i.parentNode.insertBefore(o,i),o.appendChild(i))},L=function(i,r){return function(o){i.undoManager.transact(function(){var t=i.selection.getNode(),e=d(i,t),n={href:o.href,target:o.target?o.target:null,rel:o.rel?o.rel:null,"class":o["class"]?o["class"]:null,title:o.title?o.title:null};C(i.settings)||!1!==N(i.settings)||(n.rel=f(n.rel,"_blank"===n.target)),o.href===r.href&&(r.attach(),r={}),e?(i.focus(),o.hasOwnProperty("text")&&("innerText"in e?e.innerText=o.text:e.textContent=o.text),i.dom.setAttribs(e,n),i.selection.select(e),i.undoManager.add()):v(t)?h(i,t,n):o.hasOwnProperty("text")?i.insertContent(i.dom.createHTML("a",n,i.dom.encode(o.text))):i.execCommand("mceInsertLink",!1,n)})}},P=function(e){return function(){e.undoManager.transact(function(){var t=e.selection.getNode();v(t)?g(e,t):e.execCommand("unlink")})}},x=m,E=function(t){return 0]+>[^<]+<\/a>$/.test(t)||-1===t.indexOf("href=")))},I=d,K=function(t,e){var n=e?e.innerText||e.textContent:t.getContent({format:"text"});return n.replace(/\uFEFF/g,"")},U=f,D=tinymce.util.Tools.resolve("tinymce.util.Delay"),B=tinymce.util.Tools.resolve("tinymce.util.XHR"),F={},q=function(t,o,e){var i=function(t,n){return n=n||[],A.each(t,function(t){var e={text:t.text||t.title};t.menu?e.menu=i(t.menu):(e.value=t.value,o&&o(e)),n.push(e)}),n};return i(t,e||[])},V=function(e,t,n){var o=e.selection.getRng();D.setEditorTimeout(e,function(){e.windowManager.confirm(t,function(t){e.selection.setRng(o),n(t)})})},z=function(a,t){var e,l,o,u,n,i,r,c,s,f,d,m={},v=a.selection,g=a.dom,h=function(t){var e=o.find("#text");(!e.value()||t.lastControl&&e.value()===t.lastControl.text())&&e.value(t.control.text()),o.find("#href").value(t.control.value())},x=function(){l||!u||m.text||this.parent().parent().find("#text")[0].value(this.value())};u=S(v.getContent()),e=I(a),m.text=l=K(a.selection,e),m.href=e?g.getAttrib(e,"href"):"",e?m.target=g.getAttrib(e,"target"):k(a.settings)&&(m.target=y(a.settings)),(d=g.getAttrib(e,"rel"))&&(m.rel=d),(d=g.getAttrib(e,"class"))&&(m["class"]=d),(d=g.getAttrib(e,"title"))&&(m.title=d),u&&(n={name:"text",type:"textbox",size:40,label:"Text to display",onchange:function(){m.text=this.value()}}),t&&(i={type:"listbox",label:"Link list",values:q(t,function(t){t.value=a.convertURL(t.value||t.url,"href")},[{text:"None",value:""}]),onselect:h,value:a.convertURL(m.href,"href"),onPostRender:function(){i=this}}),w(a.settings)&&(b(a.settings)===undefined&&_(a,[{text:"None",value:""},{text:"New window",value:"_blank"}]),c={name:"target",type:"listbox",label:"Target",values:q(b(a.settings))}),C(a.settings)&&(r={name:"rel",type:"listbox",label:"Rel",values:q(T(a.settings),function(t){!1===N(a.settings)&&(t.value=U(t.value,"_blank"===m.target))})}),O(a.settings)&&(s={name:"class",type:"listbox",label:"Class",values:q(M(a.settings),function(t){t.value&&(t.textStyle=function(){return a.formatter.getCssText({inline:"a",classes:[t.value]})})})}),R(a.settings)&&(f={name:"title",type:"textbox",label:"Title",value:m.title}),o=a.windowManager.open({title:"Insert link",data:m,body:[{name:"href",type:"filepicker",filetype:"file",size:40,autofocus:!0,label:"Url",onchange:function(t){var e=t.meta||{};i&&i.value(a.convertURL(this.value(),"href")),A.each(t.meta,function(t,e){var n=o.find("#"+e);"text"===e?0===l.length&&(n.value(t),m.text=t):n.value(t)}),e.attach&&(F={href:this.value(),attach:e.attach}),e.text||x.call(this)},onkeyup:x,onpaste:x,onbeforecall:function(t){t.meta=o.toJSON()}},n,f,function(n){var o=[];if(A.each(a.dom.select("a:not([href])"),function(t){var e=t.name||t.id;e&&o.push({text:e,value:"#"+e,selected:-1!==n.indexOf("#"+e)})}),o.length)return o.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:o,onselect:h}}(m.href),i,r,c,s],onSubmit:function(t){var e=p(a.settings),n=L(a,F),o=P(a),i=A.extend({},m,t.data),r=i.href;r?(u&&i.text!==l||delete i.text,0=e.childNodes.length?t.data.length:0}:t.previousSibling&&y(t.previousSibling)?{container:t.previousSibling,offset:t.previousSibling.data.length}:t.nextSibling&&y(t.nextSibling)?{container:t.nextSibling,offset:0}:{container:e,offset:n}},x=function(e){var n=e.cloneRange(),t=A(e.startContainer,e.startOffset);n.setStart(t.container,t.offset);var r=A(e.endContainer,e.endOffset);return n.setEnd(r.container,r.offset),n},R=g.DOM,I=function(o){var i={},e=function(e){var n,t,r;t=o[e?"startContainer":"endContainer"],r=o[e?"startOffset":"endOffset"],1===t.nodeType&&(n=R.create("span",{"data-mce-type":"bookmark"}),t.hasChildNodes()?(r=Math.min(r,t.childNodes.length-1),e?t.insertBefore(n,t.childNodes[r]):R.insertAfter(n,t.childNodes[r])):t.appendChild(n),t=n,r=0),i[e?"startContainer":"endContainer"]=t,i[e?"startOffset":"endOffset"]=r};return e(!0),o.collapsed||e(),i},_=function(o){function e(e){var n,t,r;n=r=o[e?"startContainer":"endContainer"],t=o[e?"startOffset":"endOffset"],n&&(1===n.nodeType&&(t=function(e){for(var n=e.parentNode.firstChild,t=0;n;){if(n===e)return t;1===n.nodeType&&"bookmark"===n.getAttribute("data-mce-type")||t++,n=n.nextSibling}return-1}(n),n=n.parentNode,R.remove(r),!n.hasChildNodes()&&R.isBlock(n)&&n.appendChild(R.create("br"))),o[e?"startContainer":"endContainer"]=n,o[e?"startOffset":"endOffset"]=t)}e(!0),e();var n=R.createRng();return n.setStart(o.startContainer,o.startOffset),o.endContainer&&n.setEnd(o.endContainer,o.endOffset),x(n)},B=function(e){return function(){return e}},P=function(t){return function(){for(var e=[],n=0;ne.length?Cn(t,e,n):Sn(t,e,n)},[]),ie(o).map(function(e){return e.list})).toArray();var t,r,o},Mn=function(e){var n,t,r=J(he.getSelectedListItems(e),Ne.fromDom);return Se([te(r,P(bn)),te((n=r,t=G.call(n,0),t.reverse(),t),P(bn))],function(e,n){return{start:e,end:n}})},Un=function(a,e,s){var n,t,r,o=(n=e,t=Mn(a),r=An(!1),J(n,function(e){return{sourceList:e,entries:Rn(0,t,r,e)}}));Z(o,function(e){var n,t,r,o,i,u;n=e.entries,t=s,Z(ee(n,En),function(e){return function(e,n){switch(e){case"Indent":n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}}(t,e)}),r=e.sourceList,i=a,u=e.entries,o=oe(function(e,n){if(0===e.length)return[];for(var t=n(e[0]),r=[],o=[],i=0,u=e.length;i"):"application/x-shockwave-flash"===i.source1mime?(d='',m.poster&&(d+=''),d+=""):-1!==i.source1mime.indexOf("audio")?(u=i,(l=f)?l(u):'"):"script"===i.type?' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 ) { + $max_width = min( intval( $content_width ), $max_width ); + } + } elseif ( 'large' === $size ) { + /* + * We're inserting a large size image into the editor. If it's a really + * big image we'll scale it down to fit reasonably within the editor + * itself, and within the theme's content width if it's known. The user + * can resize it in the editor if they wish. + */ + $max_width = intval( get_option( 'large_size_w' ) ); + $max_height = intval( get_option( 'large_size_h' ) ); + + if ( intval( $content_width ) > 0 ) { + $max_width = min( intval( $content_width ), $max_width ); + } + } elseif ( ! empty( $_wp_additional_image_sizes ) && in_array( $size, array_keys( $_wp_additional_image_sizes ), true ) ) { + $max_width = intval( $_wp_additional_image_sizes[ $size ]['width'] ); + $max_height = intval( $_wp_additional_image_sizes[ $size ]['height'] ); + // Only in admin. Assume that theme authors know what they're doing. + if ( intval( $content_width ) > 0 && 'edit' === $context ) { + $max_width = min( intval( $content_width ), $max_width ); + } + } else { // $size === 'full' has no constraint. + $max_width = $width; + $max_height = $height; + } + + /** + * Filters the maximum image size dimensions for the editor. + * + * @since 2.5.0 + * + * @param int[] $max_image_size { + * An array of width and height values. + * + * @type int $0 The maximum width in pixels. + * @type int $1 The maximum height in pixels. + * } + * @param string|array $size Size of what the result image should be. + * @param string $context The context the image is being resized for. + * Possible values are 'display' (like in a theme) + * or 'edit' (like inserting into an editor). + */ + list( $max_width, $max_height ) = apply_filters( 'editor_max_image_size', array( $max_width, $max_height ), $size, $context ); + + return wp_constrain_dimensions( $width, $height, $max_width, $max_height ); +} + +/** + * Retrieve width and height attributes using given width and height values. + * + * Both attributes are required in the sense that both parameters must have a + * value, but are optional in that if you set them to false or null, then they + * will not be added to the returned string. + * + * You can set the value using a string, but it will only take numeric values. + * If you wish to put 'px' after the numbers, then it will be stripped out of + * the return. + * + * @since 2.5.0 + * + * @param int|string $width Image width in pixels. + * @param int|string $height Image height in pixels. + * @return string HTML attributes for width and, or height. + */ +function image_hwstring( $width, $height ) { + $out = ''; + if ( $width ) { + $out .= 'width="' . intval( $width ) . '" '; + } + if ( $height ) { + $out .= 'height="' . intval( $height ) . '" '; + } + return $out; +} + +/** + * Scale an image to fit a particular size (such as 'thumb' or 'medium'). + * + * The URL might be the original image, or it might be a resized version. This + * function won't create a new resized copy, it will just return an already + * resized one if it exists. + * + * A plugin may use the {@see 'image_downsize'} filter to hook into and offer image + * resizing services for images. The hook must return an array with the same + * elements that are normally returned from the function. + * + * @since 2.5.0 + * + * @param int $id Attachment ID for image. + * @param string|int[] $size Optional. Image size to scale to. Accepts any valid image size name, + * or an array of width and height values in pixels (in that order). + * Default 'medium'. + * @return array|false { + * Array of image data, or boolean false if no image is available. + * + * @type string $0 Image source URL. + * @type int $1 Image width in pixels. + * @type int $2 Image height in pixels. + * @type bool $3 Whether the image is a resized image. + * } + */ +function image_downsize( $id, $size = 'medium' ) { + $is_image = wp_attachment_is_image( $id ); + + /** + * Filters whether to preempt the output of image_downsize(). + * + * Returning a truthy value from the filter will effectively short-circuit + * down-sizing the image, returning that value instead. + * + * @since 2.5.0 + * + * @param bool|array $downsize Whether to short-circuit the image downsize. + * @param int $id Attachment ID for image. + * @param array|string $size Requested size of image. Image size name, or array of width + * and height values (in that order). + */ + $out = apply_filters( 'image_downsize', false, $id, $size ); + + if ( $out ) { + return $out; + } + + $img_url = wp_get_attachment_url( $id ); + $meta = wp_get_attachment_metadata( $id ); + $width = 0; + $height = 0; + $is_intermediate = false; + $img_url_basename = wp_basename( $img_url ); + + // If the file isn't an image, attempt to replace its URL with a rendered image from its meta. + // Otherwise, a non-image type could be returned. + if ( ! $is_image ) { + if ( ! empty( $meta['sizes']['full'] ) ) { + $img_url = str_replace( $img_url_basename, $meta['sizes']['full']['file'], $img_url ); + $img_url_basename = $meta['sizes']['full']['file']; + $width = $meta['sizes']['full']['width']; + $height = $meta['sizes']['full']['height']; + } else { + return false; + } + } + + // Try for a new style intermediate size. + $intermediate = image_get_intermediate_size( $id, $size ); + + if ( $intermediate ) { + $img_url = str_replace( $img_url_basename, $intermediate['file'], $img_url ); + $width = $intermediate['width']; + $height = $intermediate['height']; + $is_intermediate = true; + } elseif ( 'thumbnail' === $size ) { + // Fall back to the old thumbnail. + $thumb_file = wp_get_attachment_thumb_file( $id ); + $info = null; + + if ( $thumb_file ) { + $info = @getimagesize( $thumb_file ); + } + + if ( $thumb_file && $info ) { + $img_url = str_replace( $img_url_basename, wp_basename( $thumb_file ), $img_url ); + $width = $info[0]; + $height = $info[1]; + $is_intermediate = true; + } + } + + if ( ! $width && ! $height && isset( $meta['width'], $meta['height'] ) ) { + // Any other type: use the real image. + $width = $meta['width']; + $height = $meta['height']; + } + + if ( $img_url ) { + // We have the actual image size, but might need to further constrain it if content_width is narrower. + list( $width, $height ) = image_constrain_size_for_editor( $width, $height, $size ); + + return array( $img_url, $width, $height, $is_intermediate ); + } + + return false; +} + +/** + * Register a new image size. + * + * @since 2.9.0 + * + * @global array $_wp_additional_image_sizes Associative array of additional image sizes. + * + * @param string $name Image size identifier. + * @param int $width Optional. Image width in pixels. Default 0. + * @param int $height Optional. Image height in pixels. Default 0. + * @param bool|array $crop Optional. Image cropping behavior. If false, the image will be scaled (default), + * If true, image will be cropped to the specified dimensions using center positions. + * If an array, the image will be cropped using the array to specify the crop location. + * Array values must be in the format: array( x_crop_position, y_crop_position ) where: + * - x_crop_position accepts: 'left', 'center', or 'right'. + * - y_crop_position accepts: 'top', 'center', or 'bottom'. + */ +function add_image_size( $name, $width = 0, $height = 0, $crop = false ) { + global $_wp_additional_image_sizes; + + $_wp_additional_image_sizes[ $name ] = array( + 'width' => absint( $width ), + 'height' => absint( $height ), + 'crop' => $crop, + ); +} + +/** + * Check if an image size exists. + * + * @since 3.9.0 + * + * @param string $name The image size to check. + * @return bool True if the image size exists, false if not. + */ +function has_image_size( $name ) { + $sizes = wp_get_additional_image_sizes(); + return isset( $sizes[ $name ] ); +} + +/** + * Remove a new image size. + * + * @since 3.9.0 + * + * @global array $_wp_additional_image_sizes + * + * @param string $name The image size to remove. + * @return bool True if the image size was successfully removed, false on failure. + */ +function remove_image_size( $name ) { + global $_wp_additional_image_sizes; + + if ( isset( $_wp_additional_image_sizes[ $name ] ) ) { + unset( $_wp_additional_image_sizes[ $name ] ); + return true; + } + + return false; +} + +/** + * Registers an image size for the post thumbnail. + * + * @since 2.9.0 + * + * @see add_image_size() for details on cropping behavior. + * + * @param int $width Image width in pixels. + * @param int $height Image height in pixels. + * @param bool|array $crop Optional. Whether to crop images to specified width and height or resize. + * An array can specify positioning of the crop area. Default false. + */ +function set_post_thumbnail_size( $width = 0, $height = 0, $crop = false ) { + add_image_size( 'post-thumbnail', $width, $height, $crop ); +} + +/** + * Gets an img tag for an image attachment, scaling it down if requested. + * + * The {@see 'get_image_tag_class'} filter allows for changing the class name for the + * image without having to use regular expressions on the HTML content. The + * parameters are: what WordPress will use for the class, the Attachment ID, + * image align value, and the size the image should be. + * + * The second filter, {@see 'get_image_tag'}, has the HTML content, which can then be + * further manipulated by a plugin to change all attribute values and even HTML + * content. + * + * @since 2.5.0 + * + * @param int $id Attachment ID. + * @param string $alt Image description for the alt attribute. + * @param string $title Image description for the title attribute. + * @param string $align Part of the class name for aligning the image. + * @param string|array $size Optional. Registered image size to retrieve a tag for. Accepts any + * valid image size, or an array of width and height values in pixels + * (in that order). Default 'medium'. + * @return string HTML IMG element for given image attachment + */ +function get_image_tag( $id, $alt, $title, $align, $size = 'medium' ) { + + list( $img_src, $width, $height ) = image_downsize( $id, $size ); + $hwstring = image_hwstring( $width, $height ); + + $title = $title ? 'title="' . esc_attr( $title ) . '" ' : ''; + + $class = 'align' . esc_attr( $align ) . ' size-' . esc_attr( $size ) . ' wp-image-' . $id; + + /** + * Filters the value of the attachment's image tag class attribute. + * + * @since 2.6.0 + * + * @param string $class CSS class name or space-separated list of classes. + * @param int $id Attachment ID. + * @param string $align Part of the class name for aligning the image. + * @param string|array $size Size of image. Image size or array of width and height values (in that order). + * Default 'medium'. + */ + $class = apply_filters( 'get_image_tag_class', $class, $id, $align, $size ); + + $html = '' . esc_attr( $alt ) . ''; + + /** + * Filters the HTML content for the image tag. + * + * @since 2.6.0 + * + * @param string $html HTML content for the image. + * @param int $id Attachment ID. + * @param string $alt Image description for the alt attribute. + * @param string $title Image description for the title attribute. + * @param string $align Part of the class name for aligning the image. + * @param string|array $size Size of image. Image size or array of width and height values (in that order). + * Default 'medium'. + */ + return apply_filters( 'get_image_tag', $html, $id, $alt, $title, $align, $size ); +} + +/** + * Calculates the new dimensions for a down-sampled image. + * + * If either width or height are empty, no constraint is applied on + * that dimension. + * + * @since 2.5.0 + * + * @param int $current_width Current width of the image. + * @param int $current_height Current height of the image. + * @param int $max_width Optional. Max width in pixels to constrain to. Default 0. + * @param int $max_height Optional. Max height in pixels to constrain to. Default 0. + * @return int[] { + * An array of width and height values. + * + * @type int $0 The width in pixels. + * @type int $1 The height in pixels. + * } + */ +function wp_constrain_dimensions( $current_width, $current_height, $max_width = 0, $max_height = 0 ) { + if ( ! $max_width && ! $max_height ) { + return array( $current_width, $current_height ); + } + + $width_ratio = 1.0; + $height_ratio = 1.0; + $did_width = false; + $did_height = false; + + if ( $max_width > 0 && $current_width > 0 && $current_width > $max_width ) { + $width_ratio = $max_width / $current_width; + $did_width = true; + } + + if ( $max_height > 0 && $current_height > 0 && $current_height > $max_height ) { + $height_ratio = $max_height / $current_height; + $did_height = true; + } + + // Calculate the larger/smaller ratios. + $smaller_ratio = min( $width_ratio, $height_ratio ); + $larger_ratio = max( $width_ratio, $height_ratio ); + + if ( (int) round( $current_width * $larger_ratio ) > $max_width || (int) round( $current_height * $larger_ratio ) > $max_height ) { + // The larger ratio is too big. It would result in an overflow. + $ratio = $smaller_ratio; + } else { + // The larger ratio fits, and is likely to be a more "snug" fit. + $ratio = $larger_ratio; + } + + // Very small dimensions may result in 0, 1 should be the minimum. + $w = max( 1, (int) round( $current_width * $ratio ) ); + $h = max( 1, (int) round( $current_height * $ratio ) ); + + /* + * Sometimes, due to rounding, we'll end up with a result like this: + * 465x700 in a 177x177 box is 117x176... a pixel short. + * We also have issues with recursive calls resulting in an ever-changing result. + * Constraining to the result of a constraint should yield the original result. + * Thus we look for dimensions that are one pixel shy of the max value and bump them up. + */ + + // Note: $did_width means it is possible $smaller_ratio == $width_ratio. + if ( $did_width && $w === $max_width - 1 ) { + $w = $max_width; // Round it up. + } + + // Note: $did_height means it is possible $smaller_ratio == $height_ratio. + if ( $did_height && $h === $max_height - 1 ) { + $h = $max_height; // Round it up. + } + + /** + * Filters dimensions to constrain down-sampled images to. + * + * @since 4.1.0 + * + * @param int[] $dimensions { + * An array of width and height values. + * + * @type int $0 The width in pixels. + * @type int $1 The height in pixels. + * } + * @param int $current_width The current width of the image. + * @param int $current_height The current height of the image. + * @param int $max_width The maximum width permitted. + * @param int $max_height The maximum height permitted. + */ + return apply_filters( 'wp_constrain_dimensions', array( $w, $h ), $current_width, $current_height, $max_width, $max_height ); +} + +/** + * Retrieves calculated resize dimensions for use in WP_Image_Editor. + * + * Calculates dimensions and coordinates for a resized image that fits + * within a specified width and height. + * + * Cropping behavior is dependent on the value of $crop: + * 1. If false (default), images will not be cropped. + * 2. If an array in the form of array( x_crop_position, y_crop_position ): + * - x_crop_position accepts 'left' 'center', or 'right'. + * - y_crop_position accepts 'top', 'center', or 'bottom'. + * Images will be cropped to the specified dimensions within the defined crop area. + * 3. If true, images will be cropped to the specified dimensions using center positions. + * + * @since 2.5.0 + * + * @param int $orig_w Original width in pixels. + * @param int $orig_h Original height in pixels. + * @param int $dest_w New width in pixels. + * @param int $dest_h New height in pixels. + * @param bool|array $crop Optional. Whether to crop image to specified width and height or resize. + * An array can specify positioning of the crop area. Default false. + * @return array|false Returned array matches parameters for `imagecopyresampled()`. False on failure. + */ +function image_resize_dimensions( $orig_w, $orig_h, $dest_w, $dest_h, $crop = false ) { + + if ( $orig_w <= 0 || $orig_h <= 0 ) { + return false; + } + // At least one of $dest_w or $dest_h must be specific. + if ( $dest_w <= 0 && $dest_h <= 0 ) { + return false; + } + + /** + * Filters whether to preempt calculating the image resize dimensions. + * + * Passing a non-null value to the filter will effectively short-circuit + * image_resize_dimensions(), returning that value instead. + * + * @since 3.4.0 + * + * @param null|mixed $null Whether to preempt output of the resize dimensions. + * @param int $orig_w Original width in pixels. + * @param int $orig_h Original height in pixels. + * @param int $dest_w New width in pixels. + * @param int $dest_h New height in pixels. + * @param bool|array $crop Whether to crop image to specified width and height or resize. + * An array can specify positioning of the crop area. Default false. + */ + $output = apply_filters( 'image_resize_dimensions', null, $orig_w, $orig_h, $dest_w, $dest_h, $crop ); + + if ( null !== $output ) { + return $output; + } + + // Stop if the destination size is larger than the original image dimensions. + if ( empty( $dest_h ) ) { + if ( $orig_w < $dest_w ) { + return false; + } + } elseif ( empty( $dest_w ) ) { + if ( $orig_h < $dest_h ) { + return false; + } + } else { + if ( $orig_w < $dest_w && $orig_h < $dest_h ) { + return false; + } + } + + if ( $crop ) { + /* + * Crop the largest possible portion of the original image that we can size to $dest_w x $dest_h. + * Note that the requested crop dimensions are used as a maximum bounding box for the original image. + * If the original image's width or height is less than the requested width or height + * only the greater one will be cropped. + * For example when the original image is 600x300, and the requested crop dimensions are 400x400, + * the resulting image will be 400x300. + */ + $aspect_ratio = $orig_w / $orig_h; + $new_w = min( $dest_w, $orig_w ); + $new_h = min( $dest_h, $orig_h ); + + if ( ! $new_w ) { + $new_w = (int) round( $new_h * $aspect_ratio ); + } + + if ( ! $new_h ) { + $new_h = (int) round( $new_w / $aspect_ratio ); + } + + $size_ratio = max( $new_w / $orig_w, $new_h / $orig_h ); + + $crop_w = round( $new_w / $size_ratio ); + $crop_h = round( $new_h / $size_ratio ); + + if ( ! is_array( $crop ) || count( $crop ) !== 2 ) { + $crop = array( 'center', 'center' ); + } + + list( $x, $y ) = $crop; + + if ( 'left' === $x ) { + $s_x = 0; + } elseif ( 'right' === $x ) { + $s_x = $orig_w - $crop_w; + } else { + $s_x = floor( ( $orig_w - $crop_w ) / 2 ); + } + + if ( 'top' === $y ) { + $s_y = 0; + } elseif ( 'bottom' === $y ) { + $s_y = $orig_h - $crop_h; + } else { + $s_y = floor( ( $orig_h - $crop_h ) / 2 ); + } + } else { + // Resize using $dest_w x $dest_h as a maximum bounding box. + $crop_w = $orig_w; + $crop_h = $orig_h; + + $s_x = 0; + $s_y = 0; + + list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h ); + } + + if ( wp_fuzzy_number_match( $new_w, $orig_w ) && wp_fuzzy_number_match( $new_h, $orig_h ) ) { + // The new size has virtually the same dimensions as the original image. + + /** + * Filters whether to proceed with making an image sub-size with identical dimensions + * with the original/source image. Differences of 1px may be due to rounding and are ignored. + * + * @since 5.3.0 + * + * @param bool $proceed The filtered value. + * @param int $orig_w Original image width. + * @param int $orig_h Original image height. + */ + $proceed = (bool) apply_filters( 'wp_image_resize_identical_dimensions', false, $orig_w, $orig_h ); + + if ( ! $proceed ) { + return false; + } + } + + // The return array matches the parameters to imagecopyresampled(). + // int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h + return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h ); +} + +/** + * Resizes an image to make a thumbnail or intermediate size. + * + * The returned array has the file size, the image width, and image height. The + * {@see 'image_make_intermediate_size'} filter can be used to hook in and change the + * values of the returned array. The only parameter is the resized file path. + * + * @since 2.5.0 + * + * @param string $file File path. + * @param int $width Image width. + * @param int $height Image height. + * @param bool $crop Optional. Whether to crop image to specified width and height or resize. + * Default false. + * @return array|false Metadata array on success. False if no image was created. + */ +function image_make_intermediate_size( $file, $width, $height, $crop = false ) { + if ( $width || $height ) { + $editor = wp_get_image_editor( $file ); + + if ( is_wp_error( $editor ) || is_wp_error( $editor->resize( $width, $height, $crop ) ) ) { + return false; + } + + $resized_file = $editor->save(); + + if ( ! is_wp_error( $resized_file ) && $resized_file ) { + unset( $resized_file['path'] ); + return $resized_file; + } + } + return false; +} + +/** + * Helper function to test if aspect ratios for two images match. + * + * @since 4.6.0 + * + * @param int $source_width Width of the first image in pixels. + * @param int $source_height Height of the first image in pixels. + * @param int $target_width Width of the second image in pixels. + * @param int $target_height Height of the second image in pixels. + * @return bool True if aspect ratios match within 1px. False if not. + */ +function wp_image_matches_ratio( $source_width, $source_height, $target_width, $target_height ) { + /* + * To test for varying crops, we constrain the dimensions of the larger image + * to the dimensions of the smaller image and see if they match. + */ + if ( $source_width > $target_width ) { + $constrained_size = wp_constrain_dimensions( $source_width, $source_height, $target_width ); + $expected_size = array( $target_width, $target_height ); + } else { + $constrained_size = wp_constrain_dimensions( $target_width, $target_height, $source_width ); + $expected_size = array( $source_width, $source_height ); + } + + // If the image dimensions are within 1px of the expected size, we consider it a match. + $matched = ( wp_fuzzy_number_match( $constrained_size[0], $expected_size[0] ) && wp_fuzzy_number_match( $constrained_size[1], $expected_size[1] ) ); + + return $matched; +} + +/** + * Retrieves the image's intermediate size (resized) path, width, and height. + * + * The $size parameter can be an array with the width and height respectively. + * If the size matches the 'sizes' metadata array for width and height, then it + * will be used. If there is no direct match, then the nearest image size larger + * than the specified size will be used. If nothing is found, then the function + * will break out and return false. + * + * The metadata 'sizes' is used for compatible sizes that can be used for the + * parameter $size value. + * + * The url path will be given, when the $size parameter is a string. + * + * If you are passing an array for the $size, you should consider using + * add_image_size() so that a cropped version is generated. It's much more + * efficient than having to find the closest-sized image and then having the + * browser scale down the image. + * + * @since 2.5.0 + * + * @param int $post_id Attachment ID. + * @param array|string $size Optional. Image size. Accepts any valid image size, or an array + * of width and height values in pixels (in that order). + * Default 'thumbnail'. + * @return array|false $data { + * Array of file relative path, width, and height on success. Additionally includes absolute + * path and URL if registered size is passed to $size parameter. False on failure. + * + * @type string $file Image's path relative to uploads directory + * @type int $width Width of image + * @type int $height Height of image + * @type string $path Image's absolute filesystem path. + * @type string $url Image's URL. + * } + */ +function image_get_intermediate_size( $post_id, $size = 'thumbnail' ) { + $imagedata = wp_get_attachment_metadata( $post_id ); + + if ( ! $size || ! is_array( $imagedata ) || empty( $imagedata['sizes'] ) ) { + return false; + } + + $data = array(); + + // Find the best match when '$size' is an array. + if ( is_array( $size ) ) { + $candidates = array(); + + if ( ! isset( $imagedata['file'] ) && isset( $imagedata['sizes']['full'] ) ) { + $imagedata['height'] = $imagedata['sizes']['full']['height']; + $imagedata['width'] = $imagedata['sizes']['full']['width']; + } + + foreach ( $imagedata['sizes'] as $_size => $data ) { + // If there's an exact match to an existing image size, short circuit. + if ( intval( $data['width'] ) === intval( $size[0] ) && intval( $data['height'] ) === intval( $size[1] ) ) { + $candidates[ $data['width'] * $data['height'] ] = $data; + break; + } + + // If it's not an exact match, consider larger sizes with the same aspect ratio. + if ( $data['width'] >= $size[0] && $data['height'] >= $size[1] ) { + // If '0' is passed to either size, we test ratios against the original file. + if ( 0 === $size[0] || 0 === $size[1] ) { + $same_ratio = wp_image_matches_ratio( $data['width'], $data['height'], $imagedata['width'], $imagedata['height'] ); + } else { + $same_ratio = wp_image_matches_ratio( $data['width'], $data['height'], $size[0], $size[1] ); + } + + if ( $same_ratio ) { + $candidates[ $data['width'] * $data['height'] ] = $data; + } + } + } + + if ( ! empty( $candidates ) ) { + // Sort the array by size if we have more than one candidate. + if ( 1 < count( $candidates ) ) { + ksort( $candidates ); + } + + $data = array_shift( $candidates ); + /* + * When the size requested is smaller than the thumbnail dimensions, we + * fall back to the thumbnail size to maintain backward compatibility with + * pre 4.6 versions of WordPress. + */ + } elseif ( ! empty( $imagedata['sizes']['thumbnail'] ) && $imagedata['sizes']['thumbnail']['width'] >= $size[0] && $imagedata['sizes']['thumbnail']['width'] >= $size[1] ) { + $data = $imagedata['sizes']['thumbnail']; + } else { + return false; + } + + // Constrain the width and height attributes to the requested values. + list( $data['width'], $data['height'] ) = image_constrain_size_for_editor( $data['width'], $data['height'], $size ); + + } elseif ( ! empty( $imagedata['sizes'][ $size ] ) ) { + $data = $imagedata['sizes'][ $size ]; + } + + // If we still don't have a match at this point, return false. + if ( empty( $data ) ) { + return false; + } + + // Include the full filesystem path of the intermediate file. + if ( empty( $data['path'] ) && ! empty( $data['file'] ) && ! empty( $imagedata['file'] ) ) { + $file_url = wp_get_attachment_url( $post_id ); + $data['path'] = path_join( dirname( $imagedata['file'] ), $data['file'] ); + $data['url'] = path_join( dirname( $file_url ), $data['file'] ); + } + + /** + * Filters the output of image_get_intermediate_size() + * + * @since 4.4.0 + * + * @see image_get_intermediate_size() + * + * @param array $data Array of file relative path, width, and height on success. May also include + * file absolute path and URL. + * @param int $post_id The post_id of the image attachment + * @param string|array $size Registered image size or flat array of initially-requested height and width + * dimensions (in that order). + */ + return apply_filters( 'image_get_intermediate_size', $data, $post_id, $size ); +} + +/** + * Gets the available intermediate image size names. + * + * @since 3.0.0 + * + * @return string[] An array of image size names. + */ +function get_intermediate_image_sizes() { + $default_sizes = array( 'thumbnail', 'medium', 'medium_large', 'large' ); + $additional_sizes = wp_get_additional_image_sizes(); + + if ( ! empty( $additional_sizes ) ) { + $default_sizes = array_merge( $default_sizes, array_keys( $additional_sizes ) ); + } + + /** + * Filters the list of intermediate image sizes. + * + * @since 2.5.0 + * + * @param string[] $default_sizes An array of intermediate image size names. Defaults + * are 'thumbnail', 'medium', 'medium_large', 'large'. + */ + return apply_filters( 'intermediate_image_sizes', $default_sizes ); +} + +/** + * Returns a normalized list of all currently registered image sub-sizes. + * + * @since 5.3.0 + * @uses wp_get_additional_image_sizes() + * @uses get_intermediate_image_sizes() + * + * @return array Associative array of the registered image sub-sizes. + */ +function wp_get_registered_image_subsizes() { + $additional_sizes = wp_get_additional_image_sizes(); + $all_sizes = array(); + + foreach ( get_intermediate_image_sizes() as $size_name ) { + $size_data = array( + 'width' => 0, + 'height' => 0, + 'crop' => false, + ); + + if ( isset( $additional_sizes[ $size_name ]['width'] ) ) { + // For sizes added by plugins and themes. + $size_data['width'] = intval( $additional_sizes[ $size_name ]['width'] ); + } else { + // For default sizes set in options. + $size_data['width'] = intval( get_option( "{$size_name}_size_w" ) ); + } + + if ( isset( $additional_sizes[ $size_name ]['height'] ) ) { + $size_data['height'] = intval( $additional_sizes[ $size_name ]['height'] ); + } else { + $size_data['height'] = intval( get_option( "{$size_name}_size_h" ) ); + } + + if ( empty( $size_data['width'] ) && empty( $size_data['height'] ) ) { + // This size isn't set. + continue; + } + + if ( isset( $additional_sizes[ $size_name ]['crop'] ) ) { + $size_data['crop'] = $additional_sizes[ $size_name ]['crop']; + } else { + $size_data['crop'] = get_option( "{$size_name}_crop" ); + } + + if ( ! is_array( $size_data['crop'] ) || empty( $size_data['crop'] ) ) { + $size_data['crop'] = (bool) $size_data['crop']; + } + + $all_sizes[ $size_name ] = $size_data; + } + + return $all_sizes; +} + +/** + * Retrieves an image to represent an attachment. + * + * @since 2.5.0 + * + * @param int $attachment_id Image attachment ID. + * @param string|int[] $size Optional. Image size. Accepts any valid image size name, or an array of width + * and height values in pixels (in that order). Default 'thumbnail'. + * @param bool $icon Optional. Whether the image should fall back to a mime type icon. Default false. + * @return array|false { + * Array of image data, or boolean false if no image is available. + * + * @type string $0 Image source URL. + * @type int $1 Image width in pixels. + * @type int $2 Image height in pixels. + * } + */ +function wp_get_attachment_image_src( $attachment_id, $size = 'thumbnail', $icon = false ) { + // Get a thumbnail or intermediate image if there is one. + $image = image_downsize( $attachment_id, $size ); + if ( ! $image ) { + $src = false; + + if ( $icon ) { + $src = wp_mime_type_icon( $attachment_id ); + + if ( $src ) { + /** This filter is documented in wp-includes/post.php */ + $icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/media' ); + + $src_file = $icon_dir . '/' . wp_basename( $src ); + list( $width, $height ) = @getimagesize( $src_file ); + } + } + + if ( $src && $width && $height ) { + $image = array( $src, $width, $height ); + } + } + /** + * Filters the attachment image source result. + * + * @since 4.3.0 + * + * @param array|false $image { + * Array of image data, or boolean false if no image is available. + * + * @type string $0 Image source URL. + * @type int $1 Image width in pixels. + * @type int $2 Image height in pixels. + * } + * @param int $attachment_id Image attachment ID. + * @param string|int[] $size Requested size of image. Image size name, or array of width + * and height values (in that order). + * @param bool $icon Whether the image should be treated as an icon. + */ + return apply_filters( 'wp_get_attachment_image_src', $image, $attachment_id, $size, $icon ); +} + +/** + * Get an HTML img element representing an image attachment + * + * While `$size` will accept an array, it is better to register a size with + * add_image_size() so that a cropped version is generated. It's much more + * efficient than having to find the closest-sized image and then having the + * browser scale down the image. + * + * @since 2.5.0 + * + * @param int $attachment_id Image attachment ID. + * @param string|array $size Optional. Image size. Accepts any valid image size, or an array of width + * and height values in pixels (in that order). Default 'thumbnail'. + * @param bool $icon Optional. Whether the image should be treated as an icon. Default false. + * @param string|array $attr { + * Optional. Attributes for the image markup. + * + * @type string $src Image attachment URL. + * @type string $class CSS class name or space-separated list of classes. + * Default `attachment-$size_class size-$size_class`, + * where `$size_class` is the image size being requested. + * @type string $alt Image description for the alt attribute. + * @type string $srcset The 'srcset' attribute value. + * @type string $sizes The 'sizes' attribute value. + * } + * @return string HTML img element or empty string on failure. + */ +function wp_get_attachment_image( $attachment_id, $size = 'thumbnail', $icon = false, $attr = '' ) { + $html = ''; + $image = wp_get_attachment_image_src( $attachment_id, $size, $icon ); + if ( $image ) { + list( $src, $width, $height ) = $image; + $hwstring = image_hwstring( $width, $height ); + $size_class = $size; + if ( is_array( $size_class ) ) { + $size_class = join( 'x', $size_class ); + } + $attachment = get_post( $attachment_id ); + $default_attr = array( + 'src' => $src, + 'class' => "attachment-$size_class size-$size_class", + 'alt' => trim( strip_tags( get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ) ) ), + ); + + $attr = wp_parse_args( $attr, $default_attr ); + + // Generate 'srcset' and 'sizes' if not already present. + if ( empty( $attr['srcset'] ) ) { + $image_meta = wp_get_attachment_metadata( $attachment_id ); + + if ( is_array( $image_meta ) ) { + $size_array = array( absint( $width ), absint( $height ) ); + $srcset = wp_calculate_image_srcset( $size_array, $src, $image_meta, $attachment_id ); + $sizes = wp_calculate_image_sizes( $size_array, $src, $image_meta, $attachment_id ); + + if ( $srcset && ( $sizes || ! empty( $attr['sizes'] ) ) ) { + $attr['srcset'] = $srcset; + + if ( empty( $attr['sizes'] ) ) { + $attr['sizes'] = $sizes; + } + } + } + } + + /** + * Filters the list of attachment image attributes. + * + * @since 2.8.0 + * + * @param string[] $attr Array of attribute values for the image markup, keyed by attribute name. + * See wp_get_attachment_image(). + * @param WP_Post $attachment Image attachment post. + * @param string|array $size Requested size. Image size or array of width and height values + * (in that order). Default 'thumbnail'. + */ + $attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, $attachment, $size ); + $attr = array_map( 'esc_attr', $attr ); + $html = rtrim( " $value ) { + $html .= " $name=" . '"' . $value . '"'; + } + $html .= ' />'; + } + + return $html; +} + +/** + * Get the URL of an image attachment. + * + * @since 4.4.0 + * + * @param int $attachment_id Image attachment ID. + * @param string|array $size Optional. Image size to retrieve. Accepts any valid image size, or an array + * of width and height values in pixels (in that order). Default 'thumbnail'. + * @param bool $icon Optional. Whether the image should be treated as an icon. Default false. + * @return string|false Attachment URL or false if no image is available. + */ +function wp_get_attachment_image_url( $attachment_id, $size = 'thumbnail', $icon = false ) { + $image = wp_get_attachment_image_src( $attachment_id, $size, $icon ); + return isset( $image['0'] ) ? $image['0'] : false; +} + +/** + * Get the attachment path relative to the upload directory. + * + * @since 4.4.1 + * @access private + * + * @param string $file Attachment file name. + * @return string Attachment path relative to the upload directory. + */ +function _wp_get_attachment_relative_path( $file ) { + $dirname = dirname( $file ); + + if ( '.' === $dirname ) { + return ''; + } + + if ( false !== strpos( $dirname, 'wp-content/uploads' ) ) { + // Get the directory name relative to the upload directory (back compat for pre-2.7 uploads). + $dirname = substr( $dirname, strpos( $dirname, 'wp-content/uploads' ) + 18 ); + $dirname = ltrim( $dirname, '/' ); + } + + return $dirname; +} + +/** + * Get the image size as array from its meta data. + * + * Used for responsive images. + * + * @since 4.4.0 + * @access private + * + * @param string $size_name Image size. Accepts any valid image size name ('thumbnail', 'medium', etc.). + * @param array $image_meta The image meta data. + * @return array|bool The image meta data as returned by `wp_get_attachment_metadata()`. + */ +function _wp_get_image_size_from_meta( $size_name, $image_meta ) { + if ( 'full' === $size_name ) { + return array( + absint( $image_meta['width'] ), + absint( $image_meta['height'] ), + ); + } elseif ( ! empty( $image_meta['sizes'][ $size_name ] ) ) { + return array( + absint( $image_meta['sizes'][ $size_name ]['width'] ), + absint( $image_meta['sizes'][ $size_name ]['height'] ), + ); + } + + return false; +} + +/** + * Retrieves the value for an image attachment's 'srcset' attribute. + * + * @since 4.4.0 + * + * @see wp_calculate_image_srcset() + * + * @param int $attachment_id Image attachment ID. + * @param array|string $size Optional. Image size. Accepts any valid image size, or an array of + * width and height values in pixels (in that order). Default 'medium'. + * @param array $image_meta Optional. The image meta data as returned by 'wp_get_attachment_metadata()'. + * Default null. + * @return string|bool A 'srcset' value string or false. + */ +function wp_get_attachment_image_srcset( $attachment_id, $size = 'medium', $image_meta = null ) { + $image = wp_get_attachment_image_src( $attachment_id, $size ); + + if ( ! $image ) { + return false; + } + + if ( ! is_array( $image_meta ) ) { + $image_meta = wp_get_attachment_metadata( $attachment_id ); + } + + $image_src = $image[0]; + $size_array = array( + absint( $image[1] ), + absint( $image[2] ), + ); + + return wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id ); +} + +/** + * A helper function to calculate the image sources to include in a 'srcset' attribute. + * + * @since 4.4.0 + * + * @param int[] $size_array { + * An array of width and height values. + * + * @type int $0 The width in pixels. + * @type int $1 The height in pixels. + * } + * @param string $image_src The 'src' of the image. + * @param array $image_meta The image meta data as returned by 'wp_get_attachment_metadata()'. + * @param int $attachment_id Optional. The image attachment ID. Default 0. + * @return string|bool The 'srcset' attribute value. False on error or when only one source exists. + */ +function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id = 0 ) { + /** + * Let plugins pre-filter the image meta to be able to fix inconsistencies in the stored data. + * + * @since 4.5.0 + * + * @param array $image_meta The image meta data as returned by 'wp_get_attachment_metadata()'. + * @param int[] $size_array { + * An array of requested width and height values. + * + * @type int $0 The width in pixels. + * @type int $1 The height in pixels. + * } + * @param string $image_src The 'src' of the image. + * @param int $attachment_id The image attachment ID or 0 if not supplied. + */ + $image_meta = apply_filters( 'wp_calculate_image_srcset_meta', $image_meta, $size_array, $image_src, $attachment_id ); + + if ( empty( $image_meta['sizes'] ) || ! isset( $image_meta['file'] ) || strlen( $image_meta['file'] ) < 4 ) { + return false; + } + + $image_sizes = $image_meta['sizes']; + + // Get the width and height of the image. + $image_width = (int) $size_array[0]; + $image_height = (int) $size_array[1]; + + // Bail early if error/no width. + if ( $image_width < 1 ) { + return false; + } + + $image_basename = wp_basename( $image_meta['file'] ); + + /* + * WordPress flattens animated GIFs into one frame when generating intermediate sizes. + * To avoid hiding animation in user content, if src is a full size GIF, a srcset attribute is not generated. + * If src is an intermediate size GIF, the full size is excluded from srcset to keep a flattened GIF from becoming animated. + */ + if ( ! isset( $image_sizes['thumbnail']['mime-type'] ) || 'image/gif' !== $image_sizes['thumbnail']['mime-type'] ) { + $image_sizes[] = array( + 'width' => $image_meta['width'], + 'height' => $image_meta['height'], + 'file' => $image_basename, + ); + } elseif ( strpos( $image_src, $image_meta['file'] ) ) { + return false; + } + + // Retrieve the uploads sub-directory from the full size image. + $dirname = _wp_get_attachment_relative_path( $image_meta['file'] ); + + if ( $dirname ) { + $dirname = trailingslashit( $dirname ); + } + + $upload_dir = wp_get_upload_dir(); + $image_baseurl = trailingslashit( $upload_dir['baseurl'] ) . $dirname; + + /* + * If currently on HTTPS, prefer HTTPS URLs when we know they're supported by the domain + * (which is to say, when they share the domain name of the current request). + */ + if ( is_ssl() && 'https' !== substr( $image_baseurl, 0, 5 ) && parse_url( $image_baseurl, PHP_URL_HOST ) === $_SERVER['HTTP_HOST'] ) { + $image_baseurl = set_url_scheme( $image_baseurl, 'https' ); + } + + /* + * Images that have been edited in WordPress after being uploaded will + * contain a unique hash. Look for that hash and use it later to filter + * out images that are leftovers from previous versions. + */ + $image_edited = preg_match( '/-e[0-9]{13}/', wp_basename( $image_src ), $image_edit_hash ); + + /** + * Filters the maximum image width to be included in a 'srcset' attribute. + * + * @since 4.4.0 + * + * @param int $max_width The maximum image width to be included in the 'srcset'. Default '2048'. + * @param int[] $size_array { + * An array of requested width and height values. + * + * @type int $0 The width in pixels. + * @type int $1 The height in pixels. + * } + */ + $max_srcset_image_width = apply_filters( 'max_srcset_image_width', 2048, $size_array ); + + // Array to hold URL candidates. + $sources = array(); + + /** + * To make sure the ID matches our image src, we will check to see if any sizes in our attachment + * meta match our $image_src. If no matches are found we don't return a srcset to avoid serving + * an incorrect image. See #35045. + */ + $src_matched = false; + + /* + * Loop through available images. Only use images that are resized + * versions of the same edit. + */ + foreach ( $image_sizes as $image ) { + $is_src = false; + + // Check if image meta isn't corrupted. + if ( ! is_array( $image ) ) { + continue; + } + + // If the file name is part of the `src`, we've confirmed a match. + if ( ! $src_matched && false !== strpos( $image_src, $dirname . $image['file'] ) ) { + $src_matched = true; + $is_src = true; + } + + // Filter out images that are from previous edits. + if ( $image_edited && ! strpos( $image['file'], $image_edit_hash[0] ) ) { + continue; + } + + /* + * Filters out images that are wider than '$max_srcset_image_width' unless + * that file is in the 'src' attribute. + */ + if ( $max_srcset_image_width && $image['width'] > $max_srcset_image_width && ! $is_src ) { + continue; + } + + // If the image dimensions are within 1px of the expected size, use it. + if ( wp_image_matches_ratio( $image_width, $image_height, $image['width'], $image['height'] ) ) { + // Add the URL, descriptor, and value to the sources array to be returned. + $source = array( + 'url' => $image_baseurl . $image['file'], + 'descriptor' => 'w', + 'value' => $image['width'], + ); + + // The 'src' image has to be the first in the 'srcset', because of a bug in iOS8. See #35030. + if ( $is_src ) { + $sources = array( $image['width'] => $source ) + $sources; + } else { + $sources[ $image['width'] ] = $source; + } + } + } + + /** + * Filters an image's 'srcset' sources. + * + * @since 4.4.0 + * + * @param array $sources { + * One or more arrays of source data to include in the 'srcset'. + * + * @type array $width { + * @type string $url The URL of an image source. + * @type string $descriptor The descriptor type used in the image candidate string, + * either 'w' or 'x'. + * @type int $value The source width if paired with a 'w' descriptor, or a + * pixel density value if paired with an 'x' descriptor. + * } + * } + * @param array $size_array { + * An array of requested width and height values. + * + * @type int $0 The width in pixels. + * @type int $1 The height in pixels. + * } + * @param string $image_src The 'src' of the image. + * @param array $image_meta The image meta data as returned by 'wp_get_attachment_metadata()'. + * @param int $attachment_id Image attachment ID or 0. + */ + $sources = apply_filters( 'wp_calculate_image_srcset', $sources, $size_array, $image_src, $image_meta, $attachment_id ); + + // Only return a 'srcset' value if there is more than one source. + if ( ! $src_matched || ! is_array( $sources ) || count( $sources ) < 2 ) { + return false; + } + + $srcset = ''; + + foreach ( $sources as $source ) { + $srcset .= str_replace( ' ', '%20', $source['url'] ) . ' ' . $source['value'] . $source['descriptor'] . ', '; + } + + return rtrim( $srcset, ', ' ); +} + +/** + * Retrieves the value for an image attachment's 'sizes' attribute. + * + * @since 4.4.0 + * + * @see wp_calculate_image_sizes() + * + * @param int $attachment_id Image attachment ID. + * @param array|string $size Optional. Image size. Accepts any valid image size, or an array of width + * and height values in pixels (in that order). Default 'medium'. + * @param array $image_meta Optional. The image meta data as returned by 'wp_get_attachment_metadata()'. + * Default null. + * @return string|bool A valid source size value for use in a 'sizes' attribute or false. + */ +function wp_get_attachment_image_sizes( $attachment_id, $size = 'medium', $image_meta = null ) { + $image = wp_get_attachment_image_src( $attachment_id, $size ); + + if ( ! $image ) { + return false; + } + + if ( ! is_array( $image_meta ) ) { + $image_meta = wp_get_attachment_metadata( $attachment_id ); + } + + $image_src = $image[0]; + $size_array = array( + absint( $image[1] ), + absint( $image[2] ), + ); + + return wp_calculate_image_sizes( $size_array, $image_src, $image_meta, $attachment_id ); +} + +/** + * Creates a 'sizes' attribute value for an image. + * + * @since 4.4.0 + * + * @param array|string $size Image size to retrieve. Accepts any valid image size, or an array + * of width and height values in pixels (in that order). Default 'medium'. + * @param string $image_src Optional. The URL to the image file. Default null. + * @param array $image_meta Optional. The image meta data as returned by 'wp_get_attachment_metadata()'. + * Default null. + * @param int $attachment_id Optional. Image attachment ID. Either `$image_meta` or `$attachment_id` + * is needed when using the image size name as argument for `$size`. Default 0. + * @return string|bool A valid source size value for use in a 'sizes' attribute or false. + */ +function wp_calculate_image_sizes( $size, $image_src = null, $image_meta = null, $attachment_id = 0 ) { + $width = 0; + + if ( is_array( $size ) ) { + $width = absint( $size[0] ); + } elseif ( is_string( $size ) ) { + if ( ! $image_meta && $attachment_id ) { + $image_meta = wp_get_attachment_metadata( $attachment_id ); + } + + if ( is_array( $image_meta ) ) { + $size_array = _wp_get_image_size_from_meta( $size, $image_meta ); + if ( $size_array ) { + $width = absint( $size_array[0] ); + } + } + } + + if ( ! $width ) { + return false; + } + + // Setup the default 'sizes' attribute. + $sizes = sprintf( '(max-width: %1$dpx) 100vw, %1$dpx', $width ); + + /** + * Filters the output of 'wp_calculate_image_sizes()'. + * + * @since 4.4.0 + * + * @param string $sizes A source size value for use in a 'sizes' attribute. + * @param array|string $size Requested size. Image size or array of width and height values + * in pixels (in that order). + * @param string|null $image_src The URL to the image file or null. + * @param array|null $image_meta The image meta data as returned by wp_get_attachment_metadata() or null. + * @param int $attachment_id Image attachment ID of the original image or 0. + */ + return apply_filters( 'wp_calculate_image_sizes', $sizes, $size, $image_src, $image_meta, $attachment_id ); +} + +/** + * Filters 'img' elements in post content to add 'srcset' and 'sizes' attributes. + * + * @since 4.4.0 + * + * @see wp_image_add_srcset_and_sizes() + * + * @param string $content The raw post content to be filtered. + * @return string Converted content with 'srcset' and 'sizes' attributes added to images. + */ +function wp_make_content_images_responsive( $content ) { + if ( ! preg_match_all( '/]+>/', $content, $matches ) ) { + return $content; + } + + $selected_images = array(); + $attachment_ids = array(); + + foreach ( $matches[0] as $image ) { + if ( false === strpos( $image, ' srcset=' ) && preg_match( '/wp-image-([0-9]+)/i', $image, $class_id ) ) { + $attachment_id = absint( $class_id[1] ); + + if ( $attachment_id ) { + /* + * If exactly the same image tag is used more than once, overwrite it. + * All identical tags will be replaced later with 'str_replace()'. + */ + $selected_images[ $image ] = $attachment_id; + // Overwrite the ID when the same image is included more than once. + $attachment_ids[ $attachment_id ] = true; + } + } + } + + if ( count( $attachment_ids ) > 1 ) { + /* + * Warm the object cache with post and meta information for all found + * images to avoid making individual database calls. + */ + _prime_post_caches( array_keys( $attachment_ids ), false, true ); + } + + foreach ( $selected_images as $image => $attachment_id ) { + $image_meta = wp_get_attachment_metadata( $attachment_id ); + $content = str_replace( $image, wp_image_add_srcset_and_sizes( $image, $image_meta, $attachment_id ), $content ); + } + + return $content; +} + +/** + * Adds 'srcset' and 'sizes' attributes to an existing 'img' element. + * + * @since 4.4.0 + * + * @see wp_calculate_image_srcset() + * @see wp_calculate_image_sizes() + * + * @param string $image An HTML 'img' element to be filtered. + * @param array $image_meta The image meta data as returned by 'wp_get_attachment_metadata()'. + * @param int $attachment_id Image attachment ID. + * @return string Converted 'img' element with 'srcset' and 'sizes' attributes added. + */ +function wp_image_add_srcset_and_sizes( $image, $image_meta, $attachment_id ) { + // Ensure the image meta exists. + if ( empty( $image_meta['sizes'] ) ) { + return $image; + } + + $image_src = preg_match( '/src="([^"]+)"/', $image, $match_src ) ? $match_src[1] : ''; + list( $image_src ) = explode( '?', $image_src ); + + // Return early if we couldn't get the image source. + if ( ! $image_src ) { + return $image; + } + + // Bail early if an image has been inserted and later edited. + if ( preg_match( '/-e[0-9]{13}/', $image_meta['file'], $img_edit_hash ) && + strpos( wp_basename( $image_src ), $img_edit_hash[0] ) === false ) { + + return $image; + } + + $width = preg_match( '/ width="([0-9]+)"/', $image, $match_width ) ? (int) $match_width[1] : 0; + $height = preg_match( '/ height="([0-9]+)"/', $image, $match_height ) ? (int) $match_height[1] : 0; + + if ( ! $width || ! $height ) { + /* + * If attempts to parse the size value failed, attempt to use the image meta data to match + * the image file name from 'src' against the available sizes for an attachment. + */ + $image_filename = wp_basename( $image_src ); + + if ( wp_basename( $image_meta['file'] ) === $image_filename ) { + $width = (int) $image_meta['width']; + $height = (int) $image_meta['height']; + } else { + foreach ( $image_meta['sizes'] as $image_size_data ) { + if ( $image_filename === $image_size_data['file'] ) { + $width = (int) $image_size_data['width']; + $height = (int) $image_size_data['height']; + break; + } + } + } + } + + if ( ! $width || ! $height ) { + return $image; + } + + $size_array = array( $width, $height ); + $srcset = wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id ); + + if ( $srcset ) { + // Check if there is already a 'sizes' attribute. + $sizes = strpos( $image, ' sizes=' ); + + if ( ! $sizes ) { + $sizes = wp_calculate_image_sizes( $size_array, $image_src, $image_meta, $attachment_id ); + } + } + + if ( $srcset && $sizes ) { + // Format the 'srcset' and 'sizes' string and escape attributes. + $attr = sprintf( ' srcset="%s"', esc_attr( $srcset ) ); + + if ( is_string( $sizes ) ) { + $attr .= sprintf( ' sizes="%s"', esc_attr( $sizes ) ); + } + + // Add 'srcset' and 'sizes' attributes to the image markup. + $image = preg_replace( '/]+?)[\/ ]*>/', '', $image ); + } + + return $image; +} + +/** + * Adds a 'wp-post-image' class to post thumbnails. Internal use only. + * + * Uses the {@see 'begin_fetch_post_thumbnail_html'} and {@see 'end_fetch_post_thumbnail_html'} + * action hooks to dynamically add/remove itself so as to only filter post thumbnails. + * + * @ignore + * @since 2.9.0 + * + * @param string[] $attr Array of thumbnail attributes including src, class, alt, title, keyed by attribute name. + * @return string[] Modified array of attributes including the new 'wp-post-image' class. + */ +function _wp_post_thumbnail_class_filter( $attr ) { + $attr['class'] .= ' wp-post-image'; + return $attr; +} + +/** + * Adds '_wp_post_thumbnail_class_filter' callback to the 'wp_get_attachment_image_attributes' + * filter hook. Internal use only. + * + * @ignore + * @since 2.9.0 + * + * @param string[] $attr Array of thumbnail attributes including src, class, alt, title, keyed by attribute name. + */ +function _wp_post_thumbnail_class_filter_add( $attr ) { + add_filter( 'wp_get_attachment_image_attributes', '_wp_post_thumbnail_class_filter' ); +} + +/** + * Removes the '_wp_post_thumbnail_class_filter' callback from the 'wp_get_attachment_image_attributes' + * filter hook. Internal use only. + * + * @ignore + * @since 2.9.0 + * + * @param string[] $attr Array of thumbnail attributes including src, class, alt, title, keyed by attribute name. + */ +function _wp_post_thumbnail_class_filter_remove( $attr ) { + remove_filter( 'wp_get_attachment_image_attributes', '_wp_post_thumbnail_class_filter' ); +} + +add_shortcode( 'wp_caption', 'img_caption_shortcode' ); +add_shortcode( 'caption', 'img_caption_shortcode' ); + +/** + * Builds the Caption shortcode output. + * + * Allows a plugin to replace the content that would otherwise be returned. The + * filter is {@see 'img_caption_shortcode'} and passes an empty string, the attr + * parameter and the content parameter values. + * + * The supported attributes for the shortcode are 'id', 'caption_id', 'align', + * 'width', 'caption', and 'class'. + * + * @since 2.6.0 + * @since 3.9.0 The `class` attribute was added. + * @since 5.1.0 The `caption_id` attribute was added. + * + * @param array $attr { + * Attributes of the caption shortcode. + * + * @type string $id ID of the image and caption container element, i.e. `
                ` or `
                `. + * @type string $caption_id ID of the caption element, i.e. `
                ` or `

                `. + * @type string $align Class name that aligns the caption. Default 'alignnone'. Accepts 'alignleft', + * 'aligncenter', alignright', 'alignnone'. + * @type int $width The width of the caption, in pixels. + * @type string $caption The caption text. + * @type string $class Additional class name(s) added to the caption container. + * } + * @param string $content Shortcode content. + * @return string HTML content to display the caption. + */ +function img_caption_shortcode( $attr, $content = null ) { + // New-style shortcode with the caption inside the shortcode with the link and image tags. + if ( ! isset( $attr['caption'] ) ) { + if ( preg_match( '#((?:]+>\s*)?]+>(?:\s*)?)(.*)#is', $content, $matches ) ) { + $content = $matches[1]; + $attr['caption'] = trim( $matches[2] ); + } + } elseif ( strpos( $attr['caption'], '<' ) !== false ) { + $attr['caption'] = wp_kses( $attr['caption'], 'post' ); + } + + /** + * Filters the default caption shortcode output. + * + * If the filtered output isn't empty, it will be used instead of generating + * the default caption template. + * + * @since 2.6.0 + * + * @see img_caption_shortcode() + * + * @param string $output The caption output. Default empty. + * @param array $attr Attributes of the caption shortcode. + * @param string $content The image element, possibly wrapped in a hyperlink. + */ + $output = apply_filters( 'img_caption_shortcode', '', $attr, $content ); + + if ( ! empty( $output ) ) { + return $output; + } + + $atts = shortcode_atts( + array( + 'id' => '', + 'caption_id' => '', + 'align' => 'alignnone', + 'width' => '', + 'caption' => '', + 'class' => '', + ), + $attr, + 'caption' + ); + + $atts['width'] = (int) $atts['width']; + + if ( $atts['width'] < 1 || empty( $atts['caption'] ) ) { + return $content; + } + + $id = ''; + $caption_id = ''; + $describedby = ''; + + if ( $atts['id'] ) { + $atts['id'] = sanitize_html_class( $atts['id'] ); + $id = 'id="' . esc_attr( $atts['id'] ) . '" '; + } + + if ( $atts['caption_id'] ) { + $atts['caption_id'] = sanitize_html_class( $atts['caption_id'] ); + } elseif ( $atts['id'] ) { + $atts['caption_id'] = 'caption-' . str_replace( '_', '-', $atts['id'] ); + } + + if ( $atts['caption_id'] ) { + $caption_id = 'id="' . esc_attr( $atts['caption_id'] ) . '" '; + $describedby = 'aria-describedby="' . esc_attr( $atts['caption_id'] ) . '" '; + } + + $class = trim( 'wp-caption ' . $atts['align'] . ' ' . $atts['class'] ); + + $html5 = current_theme_supports( 'html5', 'caption' ); + // HTML5 captions never added the extra 10px to the image width. + $width = $html5 ? $atts['width'] : ( 10 + $atts['width'] ); + + /** + * Filters the width of an image's caption. + * + * By default, the caption is 10 pixels greater than the width of the image, + * to prevent post content from running up against a floated image. + * + * @since 3.7.0 + * + * @see img_caption_shortcode() + * + * @param int $width Width of the caption in pixels. To remove this inline style, + * return zero. + * @param array $atts Attributes of the caption shortcode. + * @param string $content The image element, possibly wrapped in a hyperlink. + */ + $caption_width = apply_filters( 'img_caption_shortcode_width', $width, $atts, $content ); + + $style = ''; + + if ( $caption_width ) { + $style = 'style="width: ' . (int) $caption_width . 'px" '; + } + + if ( $html5 ) { + $html = sprintf( + '

                %s%s
                ', + $id, + $describedby, + $style, + esc_attr( $class ), + do_shortcode( $content ), + sprintf( + '
                %s
                ', + $caption_id, + $atts['caption'] + ) + ); + } else { + $html = sprintf( + '
                %s%s
                ', + $id, + $style, + esc_attr( $class ), + str_replace( '%s

                ', + $caption_id, + $atts['caption'] + ) + ); + } + + return $html; +} + +add_shortcode( 'gallery', 'gallery_shortcode' ); + +/** + * Builds the Gallery shortcode output. + * + * This implements the functionality of the Gallery Shortcode for displaying + * WordPress images on a post. + * + * @since 2.5.0 + * + * @staticvar int $instance + * + * @param array $attr { + * Attributes of the gallery shortcode. + * + * @type string $order Order of the images in the gallery. Default 'ASC'. Accepts 'ASC', 'DESC'. + * @type string $orderby The field to use when ordering the images. Default 'menu_order ID'. + * Accepts any valid SQL ORDERBY statement. + * @type int $id Post ID. + * @type string $itemtag HTML tag to use for each image in the gallery. + * Default 'dl', or 'figure' when the theme registers HTML5 gallery support. + * @type string $icontag HTML tag to use for each image's icon. + * Default 'dt', or 'div' when the theme registers HTML5 gallery support. + * @type string $captiontag HTML tag to use for each image's caption. + * Default 'dd', or 'figcaption' when the theme registers HTML5 gallery support. + * @type int $columns Number of columns of images to display. Default 3. + * @type string|array $size Size of the images to display. Accepts any valid image size, or an array of width + * and height values in pixels (in that order). Default 'thumbnail'. + * @type string $ids A comma-separated list of IDs of attachments to display. Default empty. + * @type string $include A comma-separated list of IDs of attachments to include. Default empty. + * @type string $exclude A comma-separated list of IDs of attachments to exclude. Default empty. + * @type string $link What to link each image to. Default empty (links to the attachment page). + * Accepts 'file', 'none'. + * } + * @return string HTML content to display gallery. + */ +function gallery_shortcode( $attr ) { + $post = get_post(); + + static $instance = 0; + $instance++; + + if ( ! empty( $attr['ids'] ) ) { + // 'ids' is explicitly ordered, unless you specify otherwise. + if ( empty( $attr['orderby'] ) ) { + $attr['orderby'] = 'post__in'; + } + $attr['include'] = $attr['ids']; + } + + /** + * Filters the default gallery shortcode output. + * + * If the filtered output isn't empty, it will be used instead of generating + * the default gallery template. + * + * @since 2.5.0 + * @since 4.2.0 The `$instance` parameter was added. + * + * @see gallery_shortcode() + * + * @param string $output The gallery output. Default empty. + * @param array $attr Attributes of the gallery shortcode. + * @param int $instance Unique numeric ID of this gallery shortcode instance. + */ + $output = apply_filters( 'post_gallery', '', $attr, $instance ); + + if ( ! empty( $output ) ) { + return $output; + } + + $html5 = current_theme_supports( 'html5', 'gallery' ); + $atts = shortcode_atts( + array( + 'order' => 'ASC', + 'orderby' => 'menu_order ID', + 'id' => $post ? $post->ID : 0, + 'itemtag' => $html5 ? 'figure' : 'dl', + 'icontag' => $html5 ? 'div' : 'dt', + 'captiontag' => $html5 ? 'figcaption' : 'dd', + 'columns' => 3, + 'size' => 'thumbnail', + 'include' => '', + 'exclude' => '', + 'link' => '', + ), + $attr, + 'gallery' + ); + + $id = intval( $atts['id'] ); + + if ( ! empty( $atts['include'] ) ) { + $_attachments = get_posts( + array( + 'include' => $atts['include'], + 'post_status' => 'inherit', + 'post_type' => 'attachment', + 'post_mime_type' => 'image', + 'order' => $atts['order'], + 'orderby' => $atts['orderby'], + ) + ); + + $attachments = array(); + foreach ( $_attachments as $key => $val ) { + $attachments[ $val->ID ] = $_attachments[ $key ]; + } + } elseif ( ! empty( $atts['exclude'] ) ) { + $attachments = get_children( + array( + 'post_parent' => $id, + 'exclude' => $atts['exclude'], + 'post_status' => 'inherit', + 'post_type' => 'attachment', + 'post_mime_type' => 'image', + 'order' => $atts['order'], + 'orderby' => $atts['orderby'], + ) + ); + } else { + $attachments = get_children( + array( + 'post_parent' => $id, + 'post_status' => 'inherit', + 'post_type' => 'attachment', + 'post_mime_type' => 'image', + 'order' => $atts['order'], + 'orderby' => $atts['orderby'], + ) + ); + } + + if ( empty( $attachments ) ) { + return ''; + } + + if ( is_feed() ) { + $output = "\n"; + foreach ( $attachments as $att_id => $attachment ) { + $output .= wp_get_attachment_link( $att_id, $atts['size'], true ) . "\n"; + } + return $output; + } + + $itemtag = tag_escape( $atts['itemtag'] ); + $captiontag = tag_escape( $atts['captiontag'] ); + $icontag = tag_escape( $atts['icontag'] ); + $valid_tags = wp_kses_allowed_html( 'post' ); + if ( ! isset( $valid_tags[ $itemtag ] ) ) { + $itemtag = 'dl'; + } + if ( ! isset( $valid_tags[ $captiontag ] ) ) { + $captiontag = 'dd'; + } + if ( ! isset( $valid_tags[ $icontag ] ) ) { + $icontag = 'dt'; + } + + $columns = intval( $atts['columns'] ); + $itemwidth = $columns > 0 ? floor( 100 / $columns ) : 100; + $float = is_rtl() ? 'right' : 'left'; + + $selector = "gallery-{$instance}"; + + $gallery_style = ''; + + /** + * Filters whether to print default gallery styles. + * + * @since 3.1.0 + * + * @param bool $print Whether to print default gallery styles. + * Defaults to false if the theme supports HTML5 galleries. + * Otherwise, defaults to true. + */ + if ( apply_filters( 'use_default_gallery_style', ! $html5 ) ) { + $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; + + $gallery_style = " + + #{$selector} { + margin: auto; + } + #{$selector} .gallery-item { + float: {$float}; + margin-top: 10px; + text-align: center; + width: {$itemwidth}%; + } + #{$selector} img { + border: 2px solid #cfcfcf; + } + #{$selector} .gallery-caption { + margin-left: 0; + } + /* see gallery_shortcode() in wp-includes/media.php */ + \n\t\t"; + } + + $size_class = sanitize_html_class( $atts['size'] ); + $gallery_div = "\n"; + + return $output; +} + +/** + * Outputs the templates used by playlists. + * + * @since 3.9.0 + */ +function wp_underscore_playlist_templates() { + ?> + + + + + 'audio', + 'order' => 'ASC', + 'orderby' => 'menu_order ID', + 'id' => $post ? $post->ID : 0, + 'include' => '', + 'exclude' => '', + 'style' => 'light', + 'tracklist' => true, + 'tracknumbers' => true, + 'images' => true, + 'artists' => true, + ), + $attr, + 'playlist' + ); + + $id = intval( $atts['id'] ); + + if ( 'audio' !== $atts['type'] ) { + $atts['type'] = 'video'; + } + + $args = array( + 'post_status' => 'inherit', + 'post_type' => 'attachment', + 'post_mime_type' => $atts['type'], + 'order' => $atts['order'], + 'orderby' => $atts['orderby'], + ); + + if ( ! empty( $atts['include'] ) ) { + $args['include'] = $atts['include']; + $_attachments = get_posts( $args ); + + $attachments = array(); + foreach ( $_attachments as $key => $val ) { + $attachments[ $val->ID ] = $_attachments[ $key ]; + } + } elseif ( ! empty( $atts['exclude'] ) ) { + $args['post_parent'] = $id; + $args['exclude'] = $atts['exclude']; + $attachments = get_children( $args ); + } else { + $args['post_parent'] = $id; + $attachments = get_children( $args ); + } + + if ( empty( $attachments ) ) { + return ''; + } + + if ( is_feed() ) { + $output = "\n"; + foreach ( $attachments as $att_id => $attachment ) { + $output .= wp_get_attachment_link( $att_id ) . "\n"; + } + return $output; + } + + $outer = 22; // Default padding and border of wrapper. + + $default_width = 640; + $default_height = 360; + + $theme_width = empty( $content_width ) ? $default_width : ( $content_width - $outer ); + $theme_height = empty( $content_width ) ? $default_height : round( ( $default_height * $theme_width ) / $default_width ); + + $data = array( + 'type' => $atts['type'], + // Don't pass strings to JSON, will be truthy in JS. + 'tracklist' => wp_validate_boolean( $atts['tracklist'] ), + 'tracknumbers' => wp_validate_boolean( $atts['tracknumbers'] ), + 'images' => wp_validate_boolean( $atts['images'] ), + 'artists' => wp_validate_boolean( $atts['artists'] ), + ); + + $tracks = array(); + foreach ( $attachments as $attachment ) { + $url = wp_get_attachment_url( $attachment->ID ); + $ftype = wp_check_filetype( $url, wp_get_mime_types() ); + $track = array( + 'src' => $url, + 'type' => $ftype['type'], + 'title' => $attachment->post_title, + 'caption' => $attachment->post_excerpt, + 'description' => $attachment->post_content, + ); + + $track['meta'] = array(); + $meta = wp_get_attachment_metadata( $attachment->ID ); + if ( ! empty( $meta ) ) { + + foreach ( wp_get_attachment_id3_keys( $attachment ) as $key => $label ) { + if ( ! empty( $meta[ $key ] ) ) { + $track['meta'][ $key ] = $meta[ $key ]; + } + } + + if ( 'video' === $atts['type'] ) { + if ( ! empty( $meta['width'] ) && ! empty( $meta['height'] ) ) { + $width = $meta['width']; + $height = $meta['height']; + $theme_height = round( ( $height * $theme_width ) / $width ); + } else { + $width = $default_width; + $height = $default_height; + } + + $track['dimensions'] = array( + 'original' => compact( 'width', 'height' ), + 'resized' => array( + 'width' => $theme_width, + 'height' => $theme_height, + ), + ); + } + } + + if ( $atts['images'] ) { + $thumb_id = get_post_thumbnail_id( $attachment->ID ); + if ( ! empty( $thumb_id ) ) { + list( $src, $width, $height ) = wp_get_attachment_image_src( $thumb_id, 'full' ); + $track['image'] = compact( 'src', 'width', 'height' ); + list( $src, $width, $height ) = wp_get_attachment_image_src( $thumb_id, 'thumbnail' ); + $track['thumb'] = compact( 'src', 'width', 'height' ); + } else { + $src = wp_mime_type_icon( $attachment->ID ); + $width = 48; + $height = 64; + $track['image'] = compact( 'src', 'width', 'height' ); + $track['thumb'] = compact( 'src', 'width', 'height' ); + } + } + + $tracks[] = $track; + } + $data['tracks'] = $tracks; + + $safe_type = esc_attr( $atts['type'] ); + $safe_style = esc_attr( $atts['style'] ); + + ob_start(); + + if ( 1 === $instance ) { + /** + * Prints and enqueues playlist scripts, styles, and JavaScript templates. + * + * @since 3.9.0 + * + * @param string $type Type of playlist. Possible values are 'audio' or 'video'. + * @param string $style The 'theme' for the playlist. Core provides 'light' and 'dark'. + */ + do_action( 'wp_playlist_scripts', $atts['type'], $atts['style'] ); + } + ?> +
                + +
                + + < controls="controls" preload="none" width=" + + " + + >> +
                +
                + + +
                + %1$s', esc_url( $url ) ), $url ); +} + +/** + * Returns a filtered list of supported audio formats. + * + * @since 3.6.0 + * + * @return string[] Supported audio formats. + */ +function wp_get_audio_extensions() { + /** + * Filters the list of supported audio formats. + * + * @since 3.6.0 + * + * @param string[] $extensions An array of supported audio formats. Defaults are + * 'mp3', 'ogg', 'flac', 'm4a', 'wav'. + */ + return apply_filters( 'wp_audio_extensions', array( 'mp3', 'ogg', 'flac', 'm4a', 'wav' ) ); +} + +/** + * Returns useful keys to use to lookup data from an attachment's stored metadata. + * + * @since 3.9.0 + * + * @param WP_Post $attachment The current attachment, provided for context. + * @param string $context Optional. The context. Accepts 'edit', 'display'. Default 'display'. + * @return string[] Key/value pairs of field keys to labels. + */ +function wp_get_attachment_id3_keys( $attachment, $context = 'display' ) { + $fields = array( + 'artist' => __( 'Artist' ), + 'album' => __( 'Album' ), + ); + + if ( 'display' === $context ) { + $fields['genre'] = __( 'Genre' ); + $fields['year'] = __( 'Year' ); + $fields['length_formatted'] = _x( 'Length', 'video or audio' ); + } elseif ( 'js' === $context ) { + $fields['bitrate'] = __( 'Bitrate' ); + $fields['bitrate_mode'] = __( 'Bitrate Mode' ); + } + + /** + * Filters the editable list of keys to look up data from an attachment's metadata. + * + * @since 3.9.0 + * + * @param array $fields Key/value pairs of field keys to labels. + * @param WP_Post $attachment Attachment object. + * @param string $context The context. Accepts 'edit', 'display'. Default 'display'. + */ + return apply_filters( 'wp_get_attachment_id3_keys', $fields, $attachment, $context ); +} +/** + * Builds the Audio shortcode output. + * + * This implements the functionality of the Audio Shortcode for displaying + * WordPress mp3s in a post. + * + * @since 3.6.0 + * + * @staticvar int $instance + * + * @param array $attr { + * Attributes of the audio shortcode. + * + * @type string $src URL to the source of the audio file. Default empty. + * @type string $loop The 'loop' attribute for the `
                + + + + + + + diff --git a/wp-includes/theme-compat/header-embed.php b/wp-includes/theme-compat/header-embed.php new file mode 100644 index 0000000..c53952e --- /dev/null +++ b/wp-includes/theme-compat/header-embed.php @@ -0,0 +1,32 @@ + + + class="no-js"> + + <?php echo wp_get_document_title(); ?> + + + +> diff --git a/wp-includes/theme-compat/header.php b/wp-includes/theme-compat/header.php new file mode 100644 index 0000000..9aef7e9 --- /dev/null +++ b/wp-includes/theme-compat/header.php @@ -0,0 +1,60 @@ + + +> + + + + +<?php echo wp_get_document_title(); ?> + + + + + + + + + + + + +> +
                + + +
                diff --git a/wp-includes/theme-compat/sidebar.php b/wp-includes/theme-compat/sidebar.php new file mode 100644 index 0000000..da4efaa --- /dev/null +++ b/wp-includes/theme-compat/sidebar.php @@ -0,0 +1,149 @@ + + diff --git a/wp-includes/theme.php b/wp-includes/theme.php new file mode 100644 index 0000000..c7c4c3c --- /dev/null +++ b/wp-includes/theme.php @@ -0,0 +1,3380 @@ + false, + 'allowed' => null, + 'blog_id' => 0, + ); + $args = wp_parse_args( $args, $defaults ); + + $theme_directories = search_theme_directories(); + + if ( is_array( $wp_theme_directories ) && count( $wp_theme_directories ) > 1 ) { + // Make sure the current theme wins out, in case search_theme_directories() picks the wrong + // one in the case of a conflict. (Normally, last registered theme root wins.) + $current_theme = get_stylesheet(); + if ( isset( $theme_directories[ $current_theme ] ) ) { + $root_of_current_theme = get_raw_theme_root( $current_theme ); + if ( ! in_array( $root_of_current_theme, $wp_theme_directories ) ) { + $root_of_current_theme = WP_CONTENT_DIR . $root_of_current_theme; + } + $theme_directories[ $current_theme ]['theme_root'] = $root_of_current_theme; + } + } + + if ( empty( $theme_directories ) ) { + return array(); + } + + if ( is_multisite() && null !== $args['allowed'] ) { + $allowed = $args['allowed']; + if ( 'network' === $allowed ) { + $theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_network() ); + } elseif ( 'site' === $allowed ) { + $theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_site( $args['blog_id'] ) ); + } elseif ( $allowed ) { + $theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) ); + } else { + $theme_directories = array_diff_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) ); + } + } + + $themes = array(); + static $_themes = array(); + + foreach ( $theme_directories as $theme => $theme_root ) { + if ( isset( $_themes[ $theme_root['theme_root'] . '/' . $theme ] ) ) { + $themes[ $theme ] = $_themes[ $theme_root['theme_root'] . '/' . $theme ]; + } else { + $themes[ $theme ] = new WP_Theme( $theme, $theme_root['theme_root'] ); + + $_themes[ $theme_root['theme_root'] . '/' . $theme ] = $themes[ $theme ]; + } + } + + if ( null !== $args['errors'] ) { + foreach ( $themes as $theme => $wp_theme ) { + if ( $wp_theme->errors() != $args['errors'] ) { + unset( $themes[ $theme ] ); + } + } + } + + return $themes; +} + +/** + * Gets a WP_Theme object for a theme. + * + * @since 3.4.0 + * + * @global array $wp_theme_directories + * + * @param string $stylesheet Directory name for the theme. Optional. Defaults to current theme. + * @param string $theme_root Absolute path of the theme root to look in. Optional. If not specified, get_raw_theme_root() + * is used to calculate the theme root for the $stylesheet provided (or current theme). + * @return WP_Theme Theme object. Be sure to check the object's exists() method if you need to confirm the theme's existence. + */ +function wp_get_theme( $stylesheet = '', $theme_root = '' ) { + global $wp_theme_directories; + + if ( empty( $stylesheet ) ) { + $stylesheet = get_stylesheet(); + } + + if ( empty( $theme_root ) ) { + $theme_root = get_raw_theme_root( $stylesheet ); + if ( false === $theme_root ) { + $theme_root = WP_CONTENT_DIR . '/themes'; + } elseif ( ! in_array( $theme_root, (array) $wp_theme_directories ) ) { + $theme_root = WP_CONTENT_DIR . $theme_root; + } + } + + return new WP_Theme( $stylesheet, $theme_root ); +} + +/** + * Clears the cache held by get_theme_roots() and WP_Theme. + * + * @since 3.5.0 + * @param bool $clear_update_cache Whether to clear the Theme updates cache + */ +function wp_clean_themes_cache( $clear_update_cache = true ) { + if ( $clear_update_cache ) { + delete_site_transient( 'update_themes' ); + } + search_theme_directories( true ); + foreach ( wp_get_themes( array( 'errors' => null ) ) as $theme ) { + $theme->cache_delete(); + } +} + +/** + * Whether a child theme is in use. + * + * @since 3.0.0 + * + * @return bool true if a child theme is in use, false otherwise. + */ +function is_child_theme() { + return ( TEMPLATEPATH !== STYLESHEETPATH ); +} + +/** + * Retrieve name of the current stylesheet. + * + * The theme name that the administrator has currently set the front end theme + * as. + * + * For all intents and purposes, the template name and the stylesheet name are + * going to be the same for most cases. + * + * @since 1.5.0 + * + * @return string Stylesheet name. + */ +function get_stylesheet() { + /** + * Filters the name of current stylesheet. + * + * @since 1.5.0 + * + * @param string $stylesheet Name of the current stylesheet. + */ + return apply_filters( 'stylesheet', get_option( 'stylesheet' ) ); +} + +/** + * Retrieve stylesheet directory path for current theme. + * + * @since 1.5.0 + * + * @return string Path to current theme directory. + */ +function get_stylesheet_directory() { + $stylesheet = get_stylesheet(); + $theme_root = get_theme_root( $stylesheet ); + $stylesheet_dir = "$theme_root/$stylesheet"; + + /** + * Filters the stylesheet directory path for current theme. + * + * @since 1.5.0 + * + * @param string $stylesheet_dir Absolute path to the current theme. + * @param string $stylesheet Directory name of the current theme. + * @param string $theme_root Absolute path to themes directory. + */ + return apply_filters( 'stylesheet_directory', $stylesheet_dir, $stylesheet, $theme_root ); +} + +/** + * Retrieve stylesheet directory URI. + * + * @since 1.5.0 + * + * @return string + */ +function get_stylesheet_directory_uri() { + $stylesheet = str_replace( '%2F', '/', rawurlencode( get_stylesheet() ) ); + $theme_root_uri = get_theme_root_uri( $stylesheet ); + $stylesheet_dir_uri = "$theme_root_uri/$stylesheet"; + + /** + * Filters the stylesheet directory URI. + * + * @since 1.5.0 + * + * @param string $stylesheet_dir_uri Stylesheet directory URI. + * @param string $stylesheet Name of the activated theme's directory. + * @param string $theme_root_uri Themes root URI. + */ + return apply_filters( 'stylesheet_directory_uri', $stylesheet_dir_uri, $stylesheet, $theme_root_uri ); +} + +/** + * Retrieves the URI of current theme stylesheet. + * + * The stylesheet file name is 'style.css' which is appended to the stylesheet directory URI path. + * See get_stylesheet_directory_uri(). + * + * @since 1.5.0 + * + * @return string + */ +function get_stylesheet_uri() { + $stylesheet_dir_uri = get_stylesheet_directory_uri(); + $stylesheet_uri = $stylesheet_dir_uri . '/style.css'; + /** + * Filters the URI of the current theme stylesheet. + * + * @since 1.5.0 + * + * @param string $stylesheet_uri Stylesheet URI for the current theme/child theme. + * @param string $stylesheet_dir_uri Stylesheet directory URI for the current theme/child theme. + */ + return apply_filters( 'stylesheet_uri', $stylesheet_uri, $stylesheet_dir_uri ); +} + +/** + * Retrieves the localized stylesheet URI. + * + * The stylesheet directory for the localized stylesheet files are located, by + * default, in the base theme directory. The name of the locale file will be the + * locale followed by '.css'. If that does not exist, then the text direction + * stylesheet will be checked for existence, for example 'ltr.css'. + * + * The theme may change the location of the stylesheet directory by either using + * the {@see 'stylesheet_directory_uri'} or {@see 'locale_stylesheet_uri'} filters. + * + * If you want to change the location of the stylesheet files for the entire + * WordPress workflow, then change the former. If you just have the locale in a + * separate folder, then change the latter. + * + * @since 2.1.0 + * + * @global WP_Locale $wp_locale WordPress date and time locale object. + * + * @return string + */ +function get_locale_stylesheet_uri() { + global $wp_locale; + $stylesheet_dir_uri = get_stylesheet_directory_uri(); + $dir = get_stylesheet_directory(); + $locale = get_locale(); + if ( file_exists( "$dir/$locale.css" ) ) { + $stylesheet_uri = "$stylesheet_dir_uri/$locale.css"; + } elseif ( ! empty( $wp_locale->text_direction ) && file_exists( "$dir/{$wp_locale->text_direction}.css" ) ) { + $stylesheet_uri = "$stylesheet_dir_uri/{$wp_locale->text_direction}.css"; + } else { + $stylesheet_uri = ''; + } + /** + * Filters the localized stylesheet URI. + * + * @since 2.1.0 + * + * @param string $stylesheet_uri Localized stylesheet URI. + * @param string $stylesheet_dir_uri Stylesheet directory URI. + */ + return apply_filters( 'locale_stylesheet_uri', $stylesheet_uri, $stylesheet_dir_uri ); +} + +/** + * Retrieve name of the current theme. + * + * @since 1.5.0 + * + * @return string Template name. + */ +function get_template() { + /** + * Filters the name of the current theme. + * + * @since 1.5.0 + * + * @param string $template Current theme's directory name. + */ + return apply_filters( 'template', get_option( 'template' ) ); +} + +/** + * Retrieve current theme directory. + * + * @since 1.5.0 + * + * @return string Template directory path. + */ +function get_template_directory() { + $template = get_template(); + $theme_root = get_theme_root( $template ); + $template_dir = "$theme_root/$template"; + + /** + * Filters the current theme directory path. + * + * @since 1.5.0 + * + * @param string $template_dir The URI of the current theme directory. + * @param string $template Directory name of the current theme. + * @param string $theme_root Absolute path to the themes directory. + */ + return apply_filters( 'template_directory', $template_dir, $template, $theme_root ); +} + +/** + * Retrieve theme directory URI. + * + * @since 1.5.0 + * + * @return string Template directory URI. + */ +function get_template_directory_uri() { + $template = str_replace( '%2F', '/', rawurlencode( get_template() ) ); + $theme_root_uri = get_theme_root_uri( $template ); + $template_dir_uri = "$theme_root_uri/$template"; + + /** + * Filters the current theme directory URI. + * + * @since 1.5.0 + * + * @param string $template_dir_uri The URI of the current theme directory. + * @param string $template Directory name of the current theme. + * @param string $theme_root_uri The themes root URI. + */ + return apply_filters( 'template_directory_uri', $template_dir_uri, $template, $theme_root_uri ); +} + +/** + * Retrieve theme roots. + * + * @since 2.9.0 + * + * @global array $wp_theme_directories + * + * @return array|string An array of theme roots keyed by template/stylesheet or a single theme root if all themes have the same root. + */ +function get_theme_roots() { + global $wp_theme_directories; + + if ( ! is_array( $wp_theme_directories ) || count( $wp_theme_directories ) <= 1 ) { + return '/themes'; + } + + $theme_roots = get_site_transient( 'theme_roots' ); + if ( false === $theme_roots ) { + search_theme_directories( true ); // Regenerate the transient. + $theme_roots = get_site_transient( 'theme_roots' ); + } + return $theme_roots; +} + +/** + * Register a directory that contains themes. + * + * @since 2.9.0 + * + * @global array $wp_theme_directories + * + * @param string $directory Either the full filesystem path to a theme folder or a folder within WP_CONTENT_DIR + * @return bool + */ +function register_theme_directory( $directory ) { + global $wp_theme_directories; + + if ( ! file_exists( $directory ) ) { + // Try prepending as the theme directory could be relative to the content directory. + $directory = WP_CONTENT_DIR . '/' . $directory; + // If this directory does not exist, return and do not register. + if ( ! file_exists( $directory ) ) { + return false; + } + } + + if ( ! is_array( $wp_theme_directories ) ) { + $wp_theme_directories = array(); + } + + $untrailed = untrailingslashit( $directory ); + if ( ! empty( $untrailed ) && ! in_array( $untrailed, $wp_theme_directories ) ) { + $wp_theme_directories[] = $untrailed; + } + + return true; +} + +/** + * Search all registered theme directories for complete and valid themes. + * + * @since 2.9.0 + * + * @global array $wp_theme_directories + * @staticvar array $found_themes + * + * @param bool $force Optional. Whether to force a new directory scan. Defaults to false. + * @return array|false Valid themes found + */ +function search_theme_directories( $force = false ) { + global $wp_theme_directories; + static $found_themes = null; + + if ( empty( $wp_theme_directories ) ) { + return false; + } + + if ( ! $force && isset( $found_themes ) ) { + return $found_themes; + } + + $found_themes = array(); + + $wp_theme_directories = (array) $wp_theme_directories; + $relative_theme_roots = array(); + + /* + * Set up maybe-relative, maybe-absolute array of theme directories. + * We always want to return absolute, but we need to cache relative + * to use in get_theme_root(). + */ + foreach ( $wp_theme_directories as $theme_root ) { + if ( 0 === strpos( $theme_root, WP_CONTENT_DIR ) ) { + $relative_theme_roots[ str_replace( WP_CONTENT_DIR, '', $theme_root ) ] = $theme_root; + } else { + $relative_theme_roots[ $theme_root ] = $theme_root; + } + } + + /** + * Filters whether to get the cache of the registered theme directories. + * + * @since 3.4.0 + * + * @param bool $cache_expiration Whether to get the cache of the theme directories. Default false. + * @param string $cache_directory Directory to be searched for the cache. + */ + $cache_expiration = apply_filters( 'wp_cache_themes_persistently', false, 'search_theme_directories' ); + if ( $cache_expiration ) { + $cached_roots = get_site_transient( 'theme_roots' ); + if ( is_array( $cached_roots ) ) { + foreach ( $cached_roots as $theme_dir => $theme_root ) { + // A cached theme root is no longer around, so skip it. + if ( ! isset( $relative_theme_roots[ $theme_root ] ) ) { + continue; + } + $found_themes[ $theme_dir ] = array( + 'theme_file' => $theme_dir . '/style.css', + 'theme_root' => $relative_theme_roots[ $theme_root ], // Convert relative to absolute. + ); + } + return $found_themes; + } + if ( ! is_int( $cache_expiration ) ) { + $cache_expiration = 30 * MINUTE_IN_SECONDS; + } + } else { + $cache_expiration = 30 * MINUTE_IN_SECONDS; + } + + /* Loop the registered theme directories and extract all themes */ + foreach ( $wp_theme_directories as $theme_root ) { + + // Start with directories in the root of the current theme directory. + $dirs = @ scandir( $theme_root ); + if ( ! $dirs ) { + trigger_error( "$theme_root is not readable", E_USER_NOTICE ); + continue; + } + foreach ( $dirs as $dir ) { + if ( ! is_dir( $theme_root . '/' . $dir ) || '.' === $dir[0] || 'CVS' === $dir ) { + continue; + } + if ( file_exists( $theme_root . '/' . $dir . '/style.css' ) ) { + // wp-content/themes/a-single-theme + // wp-content/themes is $theme_root, a-single-theme is $dir. + $found_themes[ $dir ] = array( + 'theme_file' => $dir . '/style.css', + 'theme_root' => $theme_root, + ); + } else { + $found_theme = false; + // wp-content/themes/a-folder-of-themes/* + // wp-content/themes is $theme_root, a-folder-of-themes is $dir, then themes are $sub_dirs. + $sub_dirs = @ scandir( $theme_root . '/' . $dir ); + if ( ! $sub_dirs ) { + trigger_error( "$theme_root/$dir is not readable", E_USER_NOTICE ); + continue; + } + foreach ( $sub_dirs as $sub_dir ) { + if ( ! is_dir( $theme_root . '/' . $dir . '/' . $sub_dir ) || '.' === $dir[0] || 'CVS' === $dir ) { + continue; + } + if ( ! file_exists( $theme_root . '/' . $dir . '/' . $sub_dir . '/style.css' ) ) { + continue; + } + $found_themes[ $dir . '/' . $sub_dir ] = array( + 'theme_file' => $dir . '/' . $sub_dir . '/style.css', + 'theme_root' => $theme_root, + ); + $found_theme = true; + } + // Never mind the above, it's just a theme missing a style.css. + // Return it; WP_Theme will catch the error. + if ( ! $found_theme ) { + $found_themes[ $dir ] = array( + 'theme_file' => $dir . '/style.css', + 'theme_root' => $theme_root, + ); + } + } + } + } + + asort( $found_themes ); + + $theme_roots = array(); + $relative_theme_roots = array_flip( $relative_theme_roots ); + + foreach ( $found_themes as $theme_dir => $theme_data ) { + $theme_roots[ $theme_dir ] = $relative_theme_roots[ $theme_data['theme_root'] ]; // Convert absolute to relative. + } + + if ( get_site_transient( 'theme_roots' ) != $theme_roots ) { + set_site_transient( 'theme_roots', $theme_roots, $cache_expiration ); + } + + return $found_themes; +} + +/** + * Retrieve path to themes directory. + * + * Does not have trailing slash. + * + * @since 1.5.0 + * + * @global array $wp_theme_directories + * + * @param string $stylesheet_or_template Optional. The stylesheet or template name of the theme. + * Default is to leverage the main theme root. + * @return string Themes directory path. + */ +function get_theme_root( $stylesheet_or_template = '' ) { + global $wp_theme_directories; + + $theme_root = ''; + + if ( $stylesheet_or_template ) { + $theme_root = get_raw_theme_root( $stylesheet_or_template ); + if ( $theme_root ) { + // Always prepend WP_CONTENT_DIR unless the root currently registered as a theme directory. + // This gives relative theme roots the benefit of the doubt when things go haywire. + if ( ! in_array( $theme_root, (array) $wp_theme_directories ) ) { + $theme_root = WP_CONTENT_DIR . $theme_root; + } + } + } + + if ( ! $theme_root ) { + $theme_root = WP_CONTENT_DIR . '/themes'; + } + + /** + * Filters the absolute path to the themes directory. + * + * @since 1.5.0 + * + * @param string $theme_root Absolute path to themes directory. + */ + return apply_filters( 'theme_root', $theme_root ); +} + +/** + * Retrieve URI for themes directory. + * + * Does not have trailing slash. + * + * @since 1.5.0 + * + * @global array $wp_theme_directories + * + * @param string $stylesheet_or_template Optional. The stylesheet or template name of the theme. + * Default is to leverage the main theme root. + * @param string $theme_root Optional. The theme root for which calculations will be based, + * preventing the need for a get_raw_theme_root() call. Default empty. + * @return string Themes directory URI. + */ +function get_theme_root_uri( $stylesheet_or_template = '', $theme_root = '' ) { + global $wp_theme_directories; + + if ( $stylesheet_or_template && ! $theme_root ) { + $theme_root = get_raw_theme_root( $stylesheet_or_template ); + } + + if ( $stylesheet_or_template && $theme_root ) { + if ( in_array( $theme_root, (array) $wp_theme_directories ) ) { + // Absolute path. Make an educated guess. YMMV -- but note the filter below. + if ( 0 === strpos( $theme_root, WP_CONTENT_DIR ) ) { + $theme_root_uri = content_url( str_replace( WP_CONTENT_DIR, '', $theme_root ) ); + } elseif ( 0 === strpos( $theme_root, ABSPATH ) ) { + $theme_root_uri = site_url( str_replace( ABSPATH, '', $theme_root ) ); + } elseif ( 0 === strpos( $theme_root, WP_PLUGIN_DIR ) || 0 === strpos( $theme_root, WPMU_PLUGIN_DIR ) ) { + $theme_root_uri = plugins_url( basename( $theme_root ), $theme_root ); + } else { + $theme_root_uri = $theme_root; + } + } else { + $theme_root_uri = content_url( $theme_root ); + } + } else { + $theme_root_uri = content_url( 'themes' ); + } + + /** + * Filters the URI for themes directory. + * + * @since 1.5.0 + * + * @param string $theme_root_uri The URI for themes directory. + * @param string $siteurl WordPress web address which is set in General Options. + * @param string $stylesheet_or_template The stylesheet or template name of the theme. + */ + return apply_filters( 'theme_root_uri', $theme_root_uri, get_option( 'siteurl' ), $stylesheet_or_template ); +} + +/** + * Get the raw theme root relative to the content directory with no filters applied. + * + * @since 3.1.0 + * + * @global array $wp_theme_directories + * + * @param string $stylesheet_or_template The stylesheet or template name of the theme. + * @param bool $skip_cache Optional. Whether to skip the cache. + * Defaults to false, meaning the cache is used. + * @return string Theme root. + */ +function get_raw_theme_root( $stylesheet_or_template, $skip_cache = false ) { + global $wp_theme_directories; + + if ( ! is_array( $wp_theme_directories ) || count( $wp_theme_directories ) <= 1 ) { + return '/themes'; + } + + $theme_root = false; + + // If requesting the root for the current theme, consult options to avoid calling get_theme_roots(). + if ( ! $skip_cache ) { + if ( get_option( 'stylesheet' ) == $stylesheet_or_template ) { + $theme_root = get_option( 'stylesheet_root' ); + } elseif ( get_option( 'template' ) == $stylesheet_or_template ) { + $theme_root = get_option( 'template_root' ); + } + } + + if ( empty( $theme_root ) ) { + $theme_roots = get_theme_roots(); + if ( ! empty( $theme_roots[ $stylesheet_or_template ] ) ) { + $theme_root = $theme_roots[ $stylesheet_or_template ]; + } + } + + return $theme_root; +} + +/** + * Display localized stylesheet link element. + * + * @since 2.1.0 + */ +function locale_stylesheet() { + $stylesheet = get_locale_stylesheet_uri(); + if ( empty( $stylesheet ) ) { + return; + } + + $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; + + printf( + '', + $stylesheet, + $type_attr + ); +} + +/** + * Switches the theme. + * + * Accepts one argument: $stylesheet of the theme. It also accepts an additional function signature + * of two arguments: $template then $stylesheet. This is for backward compatibility. + * + * @since 2.5.0 + * + * @global array $wp_theme_directories + * @global WP_Customize_Manager $wp_customize + * @global array $sidebars_widgets + * + * @param string $stylesheet Stylesheet name + */ +function switch_theme( $stylesheet ) { + global $wp_theme_directories, $wp_customize, $sidebars_widgets; + + $_sidebars_widgets = null; + if ( 'wp_ajax_customize_save' === current_action() ) { + $old_sidebars_widgets_data_setting = $wp_customize->get_setting( 'old_sidebars_widgets_data' ); + if ( $old_sidebars_widgets_data_setting ) { + $_sidebars_widgets = $wp_customize->post_value( $old_sidebars_widgets_data_setting ); + } + } elseif ( is_array( $sidebars_widgets ) ) { + $_sidebars_widgets = $sidebars_widgets; + } + + if ( is_array( $_sidebars_widgets ) ) { + set_theme_mod( + 'sidebars_widgets', + array( + 'time' => time(), + 'data' => $_sidebars_widgets, + ) + ); + } + + $nav_menu_locations = get_theme_mod( 'nav_menu_locations' ); + update_option( 'theme_switch_menu_locations', $nav_menu_locations ); + + if ( func_num_args() > 1 ) { + $stylesheet = func_get_arg( 1 ); + } + + $old_theme = wp_get_theme(); + $new_theme = wp_get_theme( $stylesheet ); + $template = $new_theme->get_template(); + + if ( wp_is_recovery_mode() ) { + $paused_themes = wp_paused_themes(); + $paused_themes->delete( $old_theme->get_stylesheet() ); + $paused_themes->delete( $old_theme->get_template() ); + } + + update_option( 'template', $template ); + update_option( 'stylesheet', $stylesheet ); + + if ( count( $wp_theme_directories ) > 1 ) { + update_option( 'template_root', get_raw_theme_root( $template, true ) ); + update_option( 'stylesheet_root', get_raw_theme_root( $stylesheet, true ) ); + } else { + delete_option( 'template_root' ); + delete_option( 'stylesheet_root' ); + } + + $new_name = $new_theme->get( 'Name' ); + + update_option( 'current_theme', $new_name ); + + // Migrate from the old mods_{name} option to theme_mods_{slug}. + if ( is_admin() && false === get_option( 'theme_mods_' . $stylesheet ) ) { + $default_theme_mods = (array) get_option( 'mods_' . $new_name ); + if ( ! empty( $nav_menu_locations ) && empty( $default_theme_mods['nav_menu_locations'] ) ) { + $default_theme_mods['nav_menu_locations'] = $nav_menu_locations; + } + add_option( "theme_mods_$stylesheet", $default_theme_mods ); + } else { + /* + * Since retrieve_widgets() is called when initializing a theme in the Customizer, + * we need to remove the theme mods to avoid overwriting changes made via + * the Customizer when accessing wp-admin/widgets.php. + */ + if ( 'wp_ajax_customize_save' === current_action() ) { + remove_theme_mod( 'sidebars_widgets' ); + } + } + + update_option( 'theme_switched', $old_theme->get_stylesheet() ); + + /** + * Fires after the theme is switched. + * + * @since 1.5.0 + * @since 4.5.0 Introduced the `$old_theme` parameter. + * + * @param string $new_name Name of the new theme. + * @param WP_Theme $new_theme WP_Theme instance of the new theme. + * @param WP_Theme $old_theme WP_Theme instance of the old theme. + */ + do_action( 'switch_theme', $new_name, $new_theme, $old_theme ); +} + +/** + * Checks that current theme files 'index.php' and 'style.css' exists. + * + * Does not initially check the default theme, which is the fallback and should always exist. + * But if it doesn't exist, it'll fall back to the latest core default theme that does exist. + * Will switch theme to the fallback theme if current theme does not validate. + * + * You can use the {@see 'validate_current_theme'} filter to return false to + * disable this functionality. + * + * @since 1.5.0 + * @see WP_DEFAULT_THEME + * + * @return bool + */ +function validate_current_theme() { + /** + * Filters whether to validate the current theme. + * + * @since 2.7.0 + * + * @param bool $validate Whether to validate the current theme. Default true. + */ + if ( wp_installing() || ! apply_filters( 'validate_current_theme', true ) ) { + return true; + } + + if ( ! file_exists( get_template_directory() . '/index.php' ) ) { + // Invalid. + } elseif ( ! file_exists( get_template_directory() . '/style.css' ) ) { + // Invalid. + } elseif ( is_child_theme() && ! file_exists( get_stylesheet_directory() . '/style.css' ) ) { + // Invalid. + } else { + // Valid. + return true; + } + + $default = wp_get_theme( WP_DEFAULT_THEME ); + if ( $default->exists() ) { + switch_theme( WP_DEFAULT_THEME ); + return false; + } + + /** + * If we're in an invalid state but WP_DEFAULT_THEME doesn't exist, + * switch to the latest core default theme that's installed. + * If it turns out that this latest core default theme is our current + * theme, then there's nothing we can do about that, so we have to bail, + * rather than going into an infinite loop. (This is why there are + * checks against WP_DEFAULT_THEME above, also.) We also can't do anything + * if it turns out there is no default theme installed. (That's `false`.) + */ + $default = WP_Theme::get_core_default_theme(); + if ( false === $default || get_stylesheet() == $default->get_stylesheet() ) { + return true; + } + + switch_theme( $default->get_stylesheet() ); + return false; +} + +/** + * Retrieve all theme modifications. + * + * @since 3.1.0 + * + * @return array|void Theme modifications. + */ +function get_theme_mods() { + $theme_slug = get_option( 'stylesheet' ); + $mods = get_option( "theme_mods_$theme_slug" ); + if ( false === $mods ) { + $theme_name = get_option( 'current_theme' ); + if ( false === $theme_name ) { + $theme_name = wp_get_theme()->get( 'Name' ); + } + $mods = get_option( "mods_$theme_name" ); // Deprecated location. + if ( is_admin() && false !== $mods ) { + update_option( "theme_mods_$theme_slug", $mods ); + delete_option( "mods_$theme_name" ); + } + } + return $mods; +} + +/** + * Retrieve theme modification value for the current theme. + * + * If the modification name does not exist, then the $default will be passed + * through {@link https://www.php.net/sprintf sprintf()} PHP function with + * the template directory URI as the first string and the stylesheet directory URI + * as the second string. + * + * @since 2.1.0 + * + * @param string $name Theme modification name. + * @param string|false $default Optional. Theme modification default value. Default false. + * @return mixed Theme modification value. + */ +function get_theme_mod( $name, $default = false ) { + $mods = get_theme_mods(); + + if ( isset( $mods[ $name ] ) ) { + /** + * Filters the theme modification, or 'theme_mod', value. + * + * The dynamic portion of the hook name, `$name`, refers to the key name + * of the modification array. For example, 'header_textcolor', 'header_image', + * and so on depending on the theme options. + * + * @since 2.2.0 + * + * @param string $current_mod The value of the current theme modification. + */ + return apply_filters( "theme_mod_{$name}", $mods[ $name ] ); + } + + if ( is_string( $default ) ) { + // Only run the replacement if an sprintf() string format pattern was found. + if ( preg_match( '#(?get( 'Name' ); + } + delete_option( 'mods_' . $theme_name ); +} + +/** + * Retrieves the custom header text color in 3- or 6-digit hexadecimal form. + * + * @since 2.1.0 + * + * @return string Header text color in 3- or 6-digit hexadecimal form (minus the hash symbol). + */ +function get_header_textcolor() { + return get_theme_mod( 'header_textcolor', get_theme_support( 'custom-header', 'default-text-color' ) ); +} + +/** + * Displays the custom header text color in 3- or 6-digit hexadecimal form (minus the hash symbol). + * + * @since 2.1.0 + */ +function header_textcolor() { + echo get_header_textcolor(); +} + +/** + * Whether to display the header text. + * + * @since 3.4.0 + * + * @return bool + */ +function display_header_text() { + if ( ! current_theme_supports( 'custom-header', 'header-text' ) ) { + return false; + } + + $text_color = get_theme_mod( 'header_textcolor', get_theme_support( 'custom-header', 'default-text-color' ) ); + return 'blank' !== $text_color; +} + +/** + * Check whether a header image is set or not. + * + * @since 4.2.0 + * + * @see get_header_image() + * + * @return bool Whether a header image is set or not. + */ +function has_header_image() { + return (bool) get_header_image(); +} + +/** + * Retrieve header image for custom header. + * + * @since 2.1.0 + * + * @return string|false + */ +function get_header_image() { + $url = get_theme_mod( 'header_image', get_theme_support( 'custom-header', 'default-image' ) ); + + if ( 'remove-header' == $url ) { + return false; + } + + if ( is_random_header_image() ) { + $url = get_random_header_image(); + } + + return esc_url_raw( set_url_scheme( $url ) ); +} + +/** + * Create image tag markup for a custom header image. + * + * @since 4.4.0 + * + * @param array $attr Optional. Additional attributes for the image tag. Can be used + * to override the default attributes. Default empty. + * @return string HTML image element markup or empty string on failure. + */ +function get_header_image_tag( $attr = array() ) { + $header = get_custom_header(); + $header->url = get_header_image(); + + if ( ! $header->url ) { + return ''; + } + + $width = absint( $header->width ); + $height = absint( $header->height ); + + $attr = wp_parse_args( + $attr, + array( + 'src' => $header->url, + 'width' => $width, + 'height' => $height, + 'alt' => get_bloginfo( 'name' ), + ) + ); + + // Generate 'srcset' and 'sizes' if not already present. + if ( empty( $attr['srcset'] ) && ! empty( $header->attachment_id ) ) { + $image_meta = get_post_meta( $header->attachment_id, '_wp_attachment_metadata', true ); + $size_array = array( $width, $height ); + + if ( is_array( $image_meta ) ) { + $srcset = wp_calculate_image_srcset( $size_array, $header->url, $image_meta, $header->attachment_id ); + $sizes = ! empty( $attr['sizes'] ) ? $attr['sizes'] : wp_calculate_image_sizes( $size_array, $header->url, $image_meta, $header->attachment_id ); + + if ( $srcset && $sizes ) { + $attr['srcset'] = $srcset; + $attr['sizes'] = $sizes; + } + } + } + + $attr = array_map( 'esc_attr', $attr ); + $html = ' $value ) { + $html .= ' ' . $name . '="' . $value . '"'; + } + + $html .= ' />'; + + /** + * Filters the markup of header images. + * + * @since 4.4.0 + * + * @param string $html The HTML image tag markup being filtered. + * @param object $header The custom header object returned by 'get_custom_header()'. + * @param array $attr Array of the attributes for the image tag. + */ + return apply_filters( 'get_header_image_tag', $html, $header, $attr ); +} + +/** + * Display the image markup for a custom header image. + * + * @since 4.4.0 + * + * @param array $attr Optional. Attributes for the image markup. Default empty. + */ +function the_header_image_tag( $attr = array() ) { + echo get_header_image_tag( $attr ); +} + +/** + * Get random header image data from registered images in theme. + * + * @since 3.4.0 + * + * @access private + * + * @global array $_wp_default_headers + * @staticvar object $_wp_random_header + * + * @return object + */ +function _get_random_header_data() { + static $_wp_random_header = null; + + if ( empty( $_wp_random_header ) ) { + global $_wp_default_headers; + $header_image_mod = get_theme_mod( 'header_image', '' ); + $headers = array(); + + if ( 'random-uploaded-image' == $header_image_mod ) { + $headers = get_uploaded_header_images(); + } elseif ( ! empty( $_wp_default_headers ) ) { + if ( 'random-default-image' == $header_image_mod ) { + $headers = $_wp_default_headers; + } else { + if ( current_theme_supports( 'custom-header', 'random-default' ) ) { + $headers = $_wp_default_headers; + } + } + } + + if ( empty( $headers ) ) { + return new stdClass; + } + + $_wp_random_header = (object) $headers[ array_rand( $headers ) ]; + + $_wp_random_header->url = sprintf( $_wp_random_header->url, get_template_directory_uri(), get_stylesheet_directory_uri() ); + $_wp_random_header->thumbnail_url = sprintf( $_wp_random_header->thumbnail_url, get_template_directory_uri(), get_stylesheet_directory_uri() ); + } + return $_wp_random_header; +} + +/** + * Get random header image url from registered images in theme. + * + * @since 3.2.0 + * + * @return string Path to header image + */ +function get_random_header_image() { + $random_image = _get_random_header_data(); + if ( empty( $random_image->url ) ) { + return ''; + } + return $random_image->url; +} + +/** + * Check if random header image is in use. + * + * Always true if user expressly chooses the option in Appearance > Header. + * Also true if theme has multiple header images registered, no specific header image + * is chosen, and theme turns on random headers with add_theme_support(). + * + * @since 3.2.0 + * + * @param string $type The random pool to use. any|default|uploaded + * @return bool + */ +function is_random_header_image( $type = 'any' ) { + $header_image_mod = get_theme_mod( 'header_image', get_theme_support( 'custom-header', 'default-image' ) ); + + if ( 'any' == $type ) { + if ( 'random-default-image' == $header_image_mod || 'random-uploaded-image' == $header_image_mod || ( '' != get_random_header_image() && empty( $header_image_mod ) ) ) { + return true; + } + } else { + if ( "random-$type-image" == $header_image_mod ) { + return true; + } elseif ( 'default' == $type && empty( $header_image_mod ) && '' != get_random_header_image() ) { + return true; + } + } + + return false; +} + +/** + * Display header image URL. + * + * @since 2.1.0 + */ +function header_image() { + $image = get_header_image(); + if ( $image ) { + echo esc_url( $image ); + } +} + +/** + * Get the header images uploaded for the current theme. + * + * @since 3.2.0 + * + * @return array + */ +function get_uploaded_header_images() { + $header_images = array(); + + // @todo Caching. + $headers = get_posts( + array( + 'post_type' => 'attachment', + 'meta_key' => '_wp_attachment_is_custom_header', + 'meta_value' => get_option( 'stylesheet' ), + 'orderby' => 'none', + 'nopaging' => true, + ) + ); + + if ( empty( $headers ) ) { + return array(); + } + + foreach ( (array) $headers as $header ) { + $url = esc_url_raw( wp_get_attachment_url( $header->ID ) ); + $header_data = wp_get_attachment_metadata( $header->ID ); + $header_index = $header->ID; + + $header_images[ $header_index ] = array(); + $header_images[ $header_index ]['attachment_id'] = $header->ID; + $header_images[ $header_index ]['url'] = $url; + $header_images[ $header_index ]['thumbnail_url'] = $url; + $header_images[ $header_index ]['alt_text'] = get_post_meta( $header->ID, '_wp_attachment_image_alt', true ); + $header_images[ $header_index ]['attachment_parent'] = isset( $header_data['attachment_parent'] ) ? $header_data['attachment_parent'] : ''; + + if ( isset( $header_data['width'] ) ) { + $header_images[ $header_index ]['width'] = $header_data['width']; + } + if ( isset( $header_data['height'] ) ) { + $header_images[ $header_index ]['height'] = $header_data['height']; + } + } + + return $header_images; +} + +/** + * Get the header image data. + * + * @since 3.4.0 + * + * @global array $_wp_default_headers + * + * @return object + */ +function get_custom_header() { + global $_wp_default_headers; + + if ( is_random_header_image() ) { + $data = _get_random_header_data(); + } else { + $data = get_theme_mod( 'header_image_data' ); + if ( ! $data && current_theme_supports( 'custom-header', 'default-image' ) ) { + $directory_args = array( get_template_directory_uri(), get_stylesheet_directory_uri() ); + $data = array(); + $data['url'] = vsprintf( get_theme_support( 'custom-header', 'default-image' ), $directory_args ); + $data['thumbnail_url'] = $data['url']; + if ( ! empty( $_wp_default_headers ) ) { + foreach ( (array) $_wp_default_headers as $default_header ) { + $url = vsprintf( $default_header['url'], $directory_args ); + if ( $data['url'] == $url ) { + $data = $default_header; + $data['url'] = $url; + $data['thumbnail_url'] = vsprintf( $data['thumbnail_url'], $directory_args ); + break; + } + } + } + } + } + + $default = array( + 'url' => '', + 'thumbnail_url' => '', + 'width' => get_theme_support( 'custom-header', 'width' ), + 'height' => get_theme_support( 'custom-header', 'height' ), + 'video' => get_theme_support( 'custom-header', 'video' ), + ); + return (object) wp_parse_args( $data, $default ); +} + +/** + * Register a selection of default headers to be displayed by the custom header admin UI. + * + * @since 3.0.0 + * + * @global array $_wp_default_headers + * + * @param array $headers Array of headers keyed by a string id. The ids point to arrays containing 'url', 'thumbnail_url', and 'description' keys. + */ +function register_default_headers( $headers ) { + global $_wp_default_headers; + + $_wp_default_headers = array_merge( (array) $_wp_default_headers, (array) $headers ); +} + +/** + * Unregister default headers. + * + * This function must be called after register_default_headers() has already added the + * header you want to remove. + * + * @see register_default_headers() + * @since 3.0.0 + * + * @global array $_wp_default_headers + * + * @param string|array $header The header string id (key of array) to remove, or an array thereof. + * @return bool|void A single header returns true on success, false on failure. + * There is currently no return value for multiple headers. + */ +function unregister_default_headers( $header ) { + global $_wp_default_headers; + if ( is_array( $header ) ) { + array_map( 'unregister_default_headers', $header ); + } elseif ( isset( $_wp_default_headers[ $header ] ) ) { + unset( $_wp_default_headers[ $header ] ); + return true; + } else { + return false; + } +} + +/** + * Check whether a header video is set or not. + * + * @since 4.7.0 + * + * @see get_header_video_url() + * + * @return bool Whether a header video is set or not. + */ +function has_header_video() { + return (bool) get_header_video_url(); +} + +/** + * Retrieve header video URL for custom header. + * + * Uses a local video if present, or falls back to an external video. + * + * @since 4.7.0 + * + * @return string|false Header video URL or false if there is no video. + */ +function get_header_video_url() { + $id = absint( get_theme_mod( 'header_video' ) ); + + if ( $id ) { + // Get the file URL from the attachment ID. + $url = wp_get_attachment_url( $id ); + } else { + $url = get_theme_mod( 'external_header_video' ); + } + + /** + * Filters the header video URL. + * + * @since 4.7.3 + * + * @param string $url Header video URL, if available. + */ + $url = apply_filters( 'get_header_video_url', $url ); + + if ( ! $id && ! $url ) { + return false; + } + + return esc_url_raw( set_url_scheme( $url ) ); +} + +/** + * Display header video URL. + * + * @since 4.7.0 + */ +function the_header_video_url() { + $video = get_header_video_url(); + if ( $video ) { + echo esc_url( $video ); + } +} + +/** + * Retrieve header video settings. + * + * @since 4.7.0 + * + * @return array + */ +function get_header_video_settings() { + $header = get_custom_header(); + $video_url = get_header_video_url(); + $video_type = wp_check_filetype( $video_url, wp_get_mime_types() ); + + $settings = array( + 'mimeType' => '', + 'posterUrl' => get_header_image(), + 'videoUrl' => $video_url, + 'width' => absint( $header->width ), + 'height' => absint( $header->height ), + 'minWidth' => 900, + 'minHeight' => 500, + 'l10n' => array( + 'pause' => __( 'Pause' ), + 'play' => __( 'Play' ), + 'pauseSpeak' => __( 'Video is paused.' ), + 'playSpeak' => __( 'Video is playing.' ), + ), + ); + + if ( preg_match( '#^https?://(?:www\.)?(?:youtube\.com/watch|youtu\.be/)#', $video_url ) ) { + $settings['mimeType'] = 'video/x-youtube'; + } elseif ( ! empty( $video_type['type'] ) ) { + $settings['mimeType'] = $video_type['type']; + } + + /** + * Filters header video settings. + * + * @since 4.7.0 + * + * @param array $settings An array of header video settings. + */ + return apply_filters( 'header_video_settings', $settings ); +} + +/** + * Check whether a custom header is set or not. + * + * @since 4.7.0 + * + * @return bool True if a custom header is set. False if not. + */ +function has_custom_header() { + if ( has_header_image() || ( has_header_video() && is_header_video_active() ) ) { + return true; + } + + return false; +} + +/** + * Checks whether the custom header video is eligible to show on the current page. + * + * @since 4.7.0 + * + * @return bool True if the custom header video should be shown. False if not. + */ +function is_header_video_active() { + if ( ! get_theme_support( 'custom-header', 'video' ) ) { + return false; + } + + $video_active_cb = get_theme_support( 'custom-header', 'video-active-callback' ); + + if ( empty( $video_active_cb ) || ! is_callable( $video_active_cb ) ) { + $show_video = true; + } else { + $show_video = call_user_func( $video_active_cb ); + } + + /** + * Modify whether the custom header video is eligible to show on the current page. + * + * @since 4.7.0 + * + * @param bool $show_video Whether the custom header video should be shown. Returns the value + * of the theme setting for the `custom-header`'s `video-active-callback`. + * If no callback is set, the default value is that of `is_front_page()`. + */ + return apply_filters( 'is_header_video_active', $show_video ); +} + +/** + * Retrieve the markup for a custom header. + * + * The container div will always be returned in the Customizer preview. + * + * @since 4.7.0 + * + * @return string The markup for a custom header on success. + */ +function get_custom_header_markup() { + if ( ! has_custom_header() && ! is_customize_preview() ) { + return ''; + } + + return sprintf( + '
                %s
                ', + get_header_image_tag() + ); +} + +/** + * Print the markup for a custom header. + * + * A container div will always be printed in the Customizer preview. + * + * @since 4.7.0 + */ +function the_custom_header_markup() { + $custom_header = get_custom_header_markup(); + if ( empty( $custom_header ) ) { + return; + } + + echo $custom_header; + + if ( is_header_video_active() && ( has_header_video() || is_customize_preview() ) ) { + wp_enqueue_script( 'wp-custom-header' ); + wp_localize_script( 'wp-custom-header', '_wpCustomHeaderSettings', get_header_video_settings() ); + } +} + +/** + * Retrieve background image for custom background. + * + * @since 3.0.0 + * + * @return string + */ +function get_background_image() { + return get_theme_mod( 'background_image', get_theme_support( 'custom-background', 'default-image' ) ); +} + +/** + * Display background image path. + * + * @since 3.0.0 + */ +function background_image() { + echo get_background_image(); +} + +/** + * Retrieve value for custom background color. + * + * @since 3.0.0 + * + * @return string + */ +function get_background_color() { + return get_theme_mod( 'background_color', get_theme_support( 'custom-background', 'default-color' ) ); +} + +/** + * Display background color value. + * + * @since 3.0.0 + */ +function background_color() { + echo get_background_color(); +} + +/** + * Default custom background callback. + * + * @since 3.0.0 + */ +function _custom_background_cb() { + // $background is the saved custom image, or the default image. + $background = set_url_scheme( get_background_image() ); + + // $color is the saved custom color. + // A default has to be specified in style.css. It will not be printed here. + $color = get_background_color(); + + if ( get_theme_support( 'custom-background', 'default-color' ) === $color ) { + $color = false; + } + + $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; + + if ( ! $background && ! $color ) { + if ( is_customize_preview() ) { + printf( '', $type_attr ); + } + return; + } + + $style = $color ? "background-color: #$color;" : ''; + + if ( $background ) { + $image = ' background-image: url("' . esc_url_raw( $background ) . '");'; + + // Background Position. + $position_x = get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ); + $position_y = get_theme_mod( 'background_position_y', get_theme_support( 'custom-background', 'default-position-y' ) ); + + if ( ! in_array( $position_x, array( 'left', 'center', 'right' ), true ) ) { + $position_x = 'left'; + } + + if ( ! in_array( $position_y, array( 'top', 'center', 'bottom' ), true ) ) { + $position_y = 'top'; + } + + $position = " background-position: $position_x $position_y;"; + + // Background Size. + $size = get_theme_mod( 'background_size', get_theme_support( 'custom-background', 'default-size' ) ); + + if ( ! in_array( $size, array( 'auto', 'contain', 'cover' ), true ) ) { + $size = 'auto'; + } + + $size = " background-size: $size;"; + + // Background Repeat. + $repeat = get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ); + + if ( ! in_array( $repeat, array( 'repeat-x', 'repeat-y', 'repeat', 'no-repeat' ), true ) ) { + $repeat = 'repeat'; + } + + $repeat = " background-repeat: $repeat;"; + + // Background Scroll. + $attachment = get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) ); + + if ( 'fixed' !== $attachment ) { + $attachment = 'scroll'; + } + + $attachment = " background-attachment: $attachment;"; + + $style .= $image . $position . $size . $repeat . $attachment; + } + ?> + id="custom-background-css"> +body.custom-background { } + + + id="wp-custom-css"> + + + 'custom_css', + 'post_status' => get_post_stati(), + 'name' => sanitize_title( $stylesheet ), + 'posts_per_page' => 1, + 'no_found_rows' => true, + 'cache_results' => true, + 'update_post_meta_cache' => false, + 'update_post_term_cache' => false, + 'lazy_load_term_meta' => false, + ); + + $post = null; + if ( get_stylesheet() === $stylesheet ) { + $post_id = get_theme_mod( 'custom_css_post_id' ); + + if ( $post_id > 0 && get_post( $post_id ) ) { + $post = get_post( $post_id ); + } + + // `-1` indicates no post exists; no query necessary. + if ( ! $post && -1 !== $post_id ) { + $query = new WP_Query( $custom_css_query_vars ); + $post = $query->post; + /* + * Cache the lookup. See wp_update_custom_css_post(). + * @todo This should get cleared if a custom_css post is added/removed. + */ + set_theme_mod( 'custom_css_post_id', $post ? $post->ID : -1 ); + } + } else { + $query = new WP_Query( $custom_css_query_vars ); + $post = $query->post; + } + + return $post; +} + +/** + * Fetch the saved Custom CSS content for rendering. + * + * @since 4.7.0 + * + * @param string $stylesheet Optional. A theme object stylesheet name. Defaults to the current theme. + * @return string The Custom CSS Post content. + */ +function wp_get_custom_css( $stylesheet = '' ) { + $css = ''; + + if ( empty( $stylesheet ) ) { + $stylesheet = get_stylesheet(); + } + + $post = wp_get_custom_css_post( $stylesheet ); + if ( $post ) { + $css = $post->post_content; + } + + /** + * Filters the Custom CSS Output into the . + * + * @since 4.7.0 + * + * @param string $css CSS pulled in from the Custom CSS CPT. + * @param string $stylesheet The theme stylesheet name. + */ + $css = apply_filters( 'wp_get_custom_css', $css, $stylesheet ); + + return $css; +} + +/** + * Update the `custom_css` post for a given theme. + * + * Inserts a `custom_css` post when one doesn't yet exist. + * + * @since 4.7.0 + * + * @param string $css CSS, stored in `post_content`. + * @param array $args { + * Args. + * + * @type string $preprocessed Pre-processed CSS, stored in `post_content_filtered`. Normally empty string. Optional. + * @type string $stylesheet Stylesheet (child theme) to update. Optional, defaults to current theme/stylesheet. + * } + * @return WP_Post|WP_Error Post on success, error on failure. + */ +function wp_update_custom_css_post( $css, $args = array() ) { + $args = wp_parse_args( + $args, + array( + 'preprocessed' => '', + 'stylesheet' => get_stylesheet(), + ) + ); + + $data = array( + 'css' => $css, + 'preprocessed' => $args['preprocessed'], + ); + + /** + * Filters the `css` (`post_content`) and `preprocessed` (`post_content_filtered`) args for a `custom_css` post being updated. + * + * This filter can be used by plugin that offer CSS pre-processors, to store the original + * pre-processed CSS in `post_content_filtered` and then store processed CSS in `post_content`. + * When used in this way, the `post_content_filtered` should be supplied as the setting value + * instead of `post_content` via a the `customize_value_custom_css` filter, for example: + * + * + * add_filter( 'customize_value_custom_css', function( $value, $setting ) { + * $post = wp_get_custom_css_post( $setting->stylesheet ); + * if ( $post && ! empty( $post->post_content_filtered ) ) { + * $css = $post->post_content_filtered; + * } + * return $css; + * }, 10, 2 ); + * + * + * @since 4.7.0 + * @param array $data { + * Custom CSS data. + * + * @type string $css CSS stored in `post_content`. + * @type string $preprocessed Pre-processed CSS stored in `post_content_filtered`. Normally empty string. + * } + * @param array $args { + * The args passed into `wp_update_custom_css_post()` merged with defaults. + * + * @type string $css The original CSS passed in to be updated. + * @type string $preprocessed The original preprocessed CSS passed in to be updated. + * @type string $stylesheet The stylesheet (theme) being updated. + * } + */ + $data = apply_filters( 'update_custom_css_data', $data, array_merge( $args, compact( 'css' ) ) ); + + $post_data = array( + 'post_title' => $args['stylesheet'], + 'post_name' => sanitize_title( $args['stylesheet'] ), + 'post_type' => 'custom_css', + 'post_status' => 'publish', + 'post_content' => $data['css'], + 'post_content_filtered' => $data['preprocessed'], + ); + + // Update post if it already exists, otherwise create a new one. + $post = wp_get_custom_css_post( $args['stylesheet'] ); + if ( $post ) { + $post_data['ID'] = $post->ID; + $r = wp_update_post( wp_slash( $post_data ), true ); + } else { + $r = wp_insert_post( wp_slash( $post_data ), true ); + + if ( ! is_wp_error( $r ) ) { + if ( get_stylesheet() === $args['stylesheet'] ) { + set_theme_mod( 'custom_css_post_id', $r ); + } + + // Trigger creation of a revision. This should be removed once #30854 is resolved. + if ( 0 === count( wp_get_post_revisions( $r ) ) ) { + wp_save_post_revision( $r ); + } + } + } + + if ( is_wp_error( $r ) ) { + return $r; + } + return get_post( $r ); +} + +/** + * Add callback for custom TinyMCE editor stylesheets. + * + * The parameter $stylesheet is the name of the stylesheet, relative to + * the theme root. It also accepts an array of stylesheets. + * It is optional and defaults to 'editor-style.css'. + * + * This function automatically adds another stylesheet with -rtl prefix, e.g. editor-style-rtl.css. + * If that file doesn't exist, it is removed before adding the stylesheet(s) to TinyMCE. + * If an array of stylesheets is passed to add_editor_style(), + * RTL is only added for the first stylesheet. + * + * Since version 3.4 the TinyMCE body has .rtl CSS class. + * It is a better option to use that class and add any RTL styles to the main stylesheet. + * + * @since 3.0.0 + * + * @global array $editor_styles + * + * @param array|string $stylesheet Optional. Stylesheet name or array thereof, relative to theme root. + * Defaults to 'editor-style.css' + */ +function add_editor_style( $stylesheet = 'editor-style.css' ) { + global $editor_styles; + + add_theme_support( 'editor-style' ); + + $editor_styles = (array) $editor_styles; + $stylesheet = (array) $stylesheet; + + if ( is_rtl() ) { + $rtl_stylesheet = str_replace( '.css', '-rtl.css', $stylesheet[0] ); + $stylesheet[] = $rtl_stylesheet; + } + + $editor_styles = array_merge( $editor_styles, $stylesheet ); +} + +/** + * Removes all visual editor stylesheets. + * + * @since 3.1.0 + * + * @global array $editor_styles + * + * @return bool True on success, false if there were no stylesheets to remove. + */ +function remove_editor_styles() { + if ( ! current_theme_supports( 'editor-style' ) ) { + return false; + } + _remove_theme_support( 'editor-style' ); + if ( is_admin() ) { + $GLOBALS['editor_styles'] = array(); + } + return true; +} + +/** + * Retrieve any registered editor stylesheet URLs. + * + * @since 4.0.0 + * + * @global array $editor_styles Registered editor stylesheets + * + * @return string[] If registered, a list of editor stylesheet URLs. + */ +function get_editor_stylesheets() { + $stylesheets = array(); + // Load editor_style.css if the current theme supports it. + if ( ! empty( $GLOBALS['editor_styles'] ) && is_array( $GLOBALS['editor_styles'] ) ) { + $editor_styles = $GLOBALS['editor_styles']; + + $editor_styles = array_unique( array_filter( $editor_styles ) ); + $style_uri = get_stylesheet_directory_uri(); + $style_dir = get_stylesheet_directory(); + + // Support externally referenced styles (like, say, fonts). + foreach ( $editor_styles as $key => $file ) { + if ( preg_match( '~^(https?:)?//~', $file ) ) { + $stylesheets[] = esc_url_raw( $file ); + unset( $editor_styles[ $key ] ); + } + } + + // Look in a parent theme first, that way child theme CSS overrides. + if ( is_child_theme() ) { + $template_uri = get_template_directory_uri(); + $template_dir = get_template_directory(); + + foreach ( $editor_styles as $key => $file ) { + if ( $file && file_exists( "$template_dir/$file" ) ) { + $stylesheets[] = "$template_uri/$file"; + } + } + } + + foreach ( $editor_styles as $file ) { + if ( $file && file_exists( "$style_dir/$file" ) ) { + $stylesheets[] = "$style_uri/$file"; + } + } + } + + /** + * Filters the array of URLs of stylesheets applied to the editor. + * + * @since 4.3.0 + * + * @param string[] $stylesheets Array of URLs of stylesheets to be applied to the editor. + */ + return apply_filters( 'editor_stylesheets', $stylesheets ); +} + +/** + * Expand a theme's starter content configuration using core-provided data. + * + * @since 4.7.0 + * + * @return array Array of starter content. + */ +function get_theme_starter_content() { + $theme_support = get_theme_support( 'starter-content' ); + if ( is_array( $theme_support ) && ! empty( $theme_support[0] ) && is_array( $theme_support[0] ) ) { + $config = $theme_support[0]; + } else { + $config = array(); + } + + $core_content = array( + 'widgets' => array( + 'text_business_info' => array( + 'text', + array( + 'title' => _x( 'Find Us', 'Theme starter content' ), + 'text' => join( + '', + array( + '' . _x( 'Address', 'Theme starter content' ) . "\n", + _x( '123 Main Street', 'Theme starter content' ) . "\n" . _x( 'New York, NY 10001', 'Theme starter content' ) . "\n\n", + '' . _x( 'Hours', 'Theme starter content' ) . "\n", + _x( 'Monday–Friday: 9:00AM–5:00PM', 'Theme starter content' ) . "\n" . _x( 'Saturday & Sunday: 11:00AM–3:00PM', 'Theme starter content' ), + ) + ), + 'filter' => true, + 'visual' => true, + ), + ), + 'text_about' => array( + 'text', + array( + 'title' => _x( 'About This Site', 'Theme starter content' ), + 'text' => _x( 'This may be a good place to introduce yourself and your site or include some credits.', 'Theme starter content' ), + 'filter' => true, + 'visual' => true, + ), + ), + 'archives' => array( + 'archives', + array( + 'title' => _x( 'Archives', 'Theme starter content' ), + ), + ), + 'calendar' => array( + 'calendar', + array( + 'title' => _x( 'Calendar', 'Theme starter content' ), + ), + ), + 'categories' => array( + 'categories', + array( + 'title' => _x( 'Categories', 'Theme starter content' ), + ), + ), + 'meta' => array( + 'meta', + array( + 'title' => _x( 'Meta', 'Theme starter content' ), + ), + ), + 'recent-comments' => array( + 'recent-comments', + array( + 'title' => _x( 'Recent Comments', 'Theme starter content' ), + ), + ), + 'recent-posts' => array( + 'recent-posts', + array( + 'title' => _x( 'Recent Posts', 'Theme starter content' ), + ), + ), + 'search' => array( + 'search', + array( + 'title' => _x( 'Search', 'Theme starter content' ), + ), + ), + ), + 'nav_menus' => array( + 'link_home' => array( + 'type' => 'custom', + 'title' => _x( 'Home', 'Theme starter content' ), + 'url' => home_url( '/' ), + ), + 'page_home' => array( // Deprecated in favor of 'link_home'. + 'type' => 'post_type', + 'object' => 'page', + 'object_id' => '{{home}}', + ), + 'page_about' => array( + 'type' => 'post_type', + 'object' => 'page', + 'object_id' => '{{about}}', + ), + 'page_blog' => array( + 'type' => 'post_type', + 'object' => 'page', + 'object_id' => '{{blog}}', + ), + 'page_news' => array( + 'type' => 'post_type', + 'object' => 'page', + 'object_id' => '{{news}}', + ), + 'page_contact' => array( + 'type' => 'post_type', + 'object' => 'page', + 'object_id' => '{{contact}}', + ), + + 'link_email' => array( + 'title' => _x( 'Email', 'Theme starter content' ), + 'url' => 'mailto:wordpress@example.com', + ), + 'link_facebook' => array( + 'title' => _x( 'Facebook', 'Theme starter content' ), + 'url' => 'https://www.facebook.com/wordpress', + ), + 'link_foursquare' => array( + 'title' => _x( 'Foursquare', 'Theme starter content' ), + 'url' => 'https://foursquare.com/', + ), + 'link_github' => array( + 'title' => _x( 'GitHub', 'Theme starter content' ), + 'url' => 'https://github.com/wordpress/', + ), + 'link_instagram' => array( + 'title' => _x( 'Instagram', 'Theme starter content' ), + 'url' => 'https://www.instagram.com/explore/tags/wordcamp/', + ), + 'link_linkedin' => array( + 'title' => _x( 'LinkedIn', 'Theme starter content' ), + 'url' => 'https://www.linkedin.com/company/1089783', + ), + 'link_pinterest' => array( + 'title' => _x( 'Pinterest', 'Theme starter content' ), + 'url' => 'https://www.pinterest.com/', + ), + 'link_twitter' => array( + 'title' => _x( 'Twitter', 'Theme starter content' ), + 'url' => 'https://twitter.com/wordpress', + ), + 'link_yelp' => array( + 'title' => _x( 'Yelp', 'Theme starter content' ), + 'url' => 'https://www.yelp.com', + ), + 'link_youtube' => array( + 'title' => _x( 'YouTube', 'Theme starter content' ), + 'url' => 'https://www.youtube.com/channel/UCdof4Ju7amm1chz1gi1T2ZA', + ), + ), + 'posts' => array( + 'home' => array( + 'post_type' => 'page', + 'post_title' => _x( 'Home', 'Theme starter content' ), + 'post_content' => sprintf( + "\n

                %s

                \n", + _x( 'Welcome to your site! This is your homepage, which is what most visitors will see when they come to your site for the first time.', 'Theme starter content' ) + ), + ), + 'about' => array( + 'post_type' => 'page', + 'post_title' => _x( 'About', 'Theme starter content' ), + 'post_content' => sprintf( + "\n

                %s

                \n", + _x( 'You might be an artist who would like to introduce yourself and your work here or maybe you’re a business with a mission to describe.', 'Theme starter content' ) + ), + ), + 'contact' => array( + 'post_type' => 'page', + 'post_title' => _x( 'Contact', 'Theme starter content' ), + 'post_content' => sprintf( + "\n

                %s

                \n", + _x( 'This is a page with some basic contact information, such as an address and phone number. You might also try a plugin to add a contact form.', 'Theme starter content' ) + ), + ), + 'blog' => array( + 'post_type' => 'page', + 'post_title' => _x( 'Blog', 'Theme starter content' ), + ), + 'news' => array( + 'post_type' => 'page', + 'post_title' => _x( 'News', 'Theme starter content' ), + ), + + 'homepage-section' => array( + 'post_type' => 'page', + 'post_title' => _x( 'A homepage section', 'Theme starter content' ), + 'post_content' => sprintf( + "\n

                %s

                \n", + _x( 'This is an example of a homepage section. Homepage sections can be any page other than the homepage itself, including the page that shows your latest blog posts.', 'Theme starter content' ) + ), + ), + ), + ); + + $content = array(); + + foreach ( $config as $type => $args ) { + switch ( $type ) { + // Use options and theme_mods as-is. + case 'options': + case 'theme_mods': + $content[ $type ] = $config[ $type ]; + break; + + // Widgets are grouped into sidebars. + case 'widgets': + foreach ( $config[ $type ] as $sidebar_id => $widgets ) { + foreach ( $widgets as $id => $widget ) { + if ( is_array( $widget ) ) { + + // Item extends core content. + if ( ! empty( $core_content[ $type ][ $id ] ) ) { + $widget = array( + $core_content[ $type ][ $id ][0], + array_merge( $core_content[ $type ][ $id ][1], $widget ), + ); + } + + $content[ $type ][ $sidebar_id ][] = $widget; + } elseif ( is_string( $widget ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $widget ] ) ) { + $content[ $type ][ $sidebar_id ][] = $core_content[ $type ][ $widget ]; + } + } + } + break; + + // And nav menu items are grouped into nav menus. + case 'nav_menus': + foreach ( $config[ $type ] as $nav_menu_location => $nav_menu ) { + + // Ensure nav menus get a name. + if ( empty( $nav_menu['name'] ) ) { + $nav_menu['name'] = $nav_menu_location; + } + + $content[ $type ][ $nav_menu_location ]['name'] = $nav_menu['name']; + + foreach ( $nav_menu['items'] as $id => $nav_menu_item ) { + if ( is_array( $nav_menu_item ) ) { + + // Item extends core content. + if ( ! empty( $core_content[ $type ][ $id ] ) ) { + $nav_menu_item = array_merge( $core_content[ $type ][ $id ], $nav_menu_item ); + } + + $content[ $type ][ $nav_menu_location ]['items'][] = $nav_menu_item; + } elseif ( is_string( $nav_menu_item ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $nav_menu_item ] ) ) { + $content[ $type ][ $nav_menu_location ]['items'][] = $core_content[ $type ][ $nav_menu_item ]; + } + } + } + break; + + // Attachments are posts but have special treatment. + case 'attachments': + foreach ( $config[ $type ] as $id => $item ) { + if ( ! empty( $item['file'] ) ) { + $content[ $type ][ $id ] = $item; + } + } + break; + + // All that's left now are posts (besides attachments). + // Not a default case for the sake of clarity and future work. + case 'posts': + foreach ( $config[ $type ] as $id => $item ) { + if ( is_array( $item ) ) { + + // Item extends core content. + if ( ! empty( $core_content[ $type ][ $id ] ) ) { + $item = array_merge( $core_content[ $type ][ $id ], $item ); + } + + // Enforce a subset of fields. + $content[ $type ][ $id ] = wp_array_slice_assoc( + $item, + array( + 'post_type', + 'post_title', + 'post_excerpt', + 'post_name', + 'post_content', + 'menu_order', + 'comment_status', + 'thumbnail', + 'template', + ) + ); + } elseif ( is_string( $item ) && ! empty( $core_content[ $type ][ $item ] ) ) { + $content[ $type ][ $item ] = $core_content[ $type ][ $item ]; + } + } + break; + } + } + + /** + * Filters the expanded array of starter content. + * + * @since 4.7.0 + * + * @param array $content Array of starter content. + * @param array $config Array of theme-specific starter content configuration. + */ + return apply_filters( 'get_theme_starter_content', $content, $config ); +} + +/** + * Registers theme support for a given feature. + * + * Must be called in the theme's functions.php file to work. + * If attached to a hook, it must be {@see 'after_setup_theme'}. + * The {@see 'init'} hook may be too late for some features. + * + * Example usage: + * + * add_theme_support( 'title-tag' ); + * add_theme_support( 'custom-logo', array( + * 'height' => 480, + * 'width' => 720, + * ) ); + * + * @since 2.9.0 + * @since 3.6.0 The `html5` feature was added. + * @since 3.9.0 The `html5` feature now also accepts 'gallery' and 'caption'. + * @since 4.1.0 The `title-tag` feature was added. + * @since 4.5.0 The `customize-selective-refresh-widgets` feature was added. + * @since 4.7.0 The `starter-content` feature was added. + * @since 5.0.0 The `responsive-embeds`, `align-wide`, `dark-editor-style`, `disable-custom-colors`, + * `disable-custom-font-sizes`, `editor-color-palette`, `editor-font-sizes`, + * `editor-styles`, and `wp-block-styles` features were added. + * @since 5.3.0 The `html5` feature now also accepts 'script' and 'style'. + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @global array $_wp_theme_features + * + * @param string $feature The feature being added. Likely core values include 'post-formats', + * 'post-thumbnails', 'html5', 'custom-logo', 'custom-header-uploads', + * 'custom-header', 'custom-background', 'title-tag', 'starter-content', + * 'responsive-embeds', etc. + * @param mixed ...$args Optional extra arguments to pass along with certain features. + * @return void|bool False on failure, void otherwise. + */ +function add_theme_support( $feature, ...$args ) { + global $_wp_theme_features; + + if ( ! $args ) { + $args = true; + } + + switch ( $feature ) { + case 'post-thumbnails': + // All post types are already supported. + if ( true === get_theme_support( 'post-thumbnails' ) ) { + return; + } + + /* + * Merge post types with any that already declared their support + * for post thumbnails. + */ + if ( isset( $args[0] ) && is_array( $args[0] ) && isset( $_wp_theme_features['post-thumbnails'] ) ) { + $args[0] = array_unique( array_merge( $_wp_theme_features['post-thumbnails'][0], $args[0] ) ); + } + + break; + + case 'post-formats': + if ( isset( $args[0] ) && is_array( $args[0] ) ) { + $post_formats = get_post_format_slugs(); + unset( $post_formats['standard'] ); + + $args[0] = array_intersect( $args[0], array_keys( $post_formats ) ); + } + break; + + case 'html5': + // You can't just pass 'html5', you need to pass an array of types. + if ( empty( $args[0] ) ) { + // Build an array of types for back-compat. + $args = array( 0 => array( 'comment-list', 'comment-form', 'search-form' ) ); + } elseif ( ! isset( $args[0] ) || ! is_array( $args[0] ) ) { + _doing_it_wrong( "add_theme_support( 'html5' )", __( 'You need to pass an array of types.' ), '3.6.1' ); + return false; + } + + // Calling 'html5' again merges, rather than overwrites. + if ( isset( $_wp_theme_features['html5'] ) ) { + $args[0] = array_merge( $_wp_theme_features['html5'][0], $args[0] ); + } + break; + + case 'custom-logo': + if ( true === $args ) { + $args = array( 0 => array() ); + } + $defaults = array( + 'width' => null, + 'height' => null, + 'flex-width' => false, + 'flex-height' => false, + 'header-text' => '', + ); + $args[0] = wp_parse_args( array_intersect_key( $args[0], $defaults ), $defaults ); + + // Allow full flexibility if no size is specified. + if ( is_null( $args[0]['width'] ) && is_null( $args[0]['height'] ) ) { + $args[0]['flex-width'] = true; + $args[0]['flex-height'] = true; + } + break; + + case 'custom-header-uploads': + return add_theme_support( 'custom-header', array( 'uploads' => true ) ); + + case 'custom-header': + if ( true === $args ) { + $args = array( 0 => array() ); + } + + $defaults = array( + 'default-image' => '', + 'random-default' => false, + 'width' => 0, + 'height' => 0, + 'flex-height' => false, + 'flex-width' => false, + 'default-text-color' => '', + 'header-text' => true, + 'uploads' => true, + 'wp-head-callback' => '', + 'admin-head-callback' => '', + 'admin-preview-callback' => '', + 'video' => false, + 'video-active-callback' => 'is_front_page', + ); + + $jit = isset( $args[0]['__jit'] ); + unset( $args[0]['__jit'] ); + + // Merge in data from previous add_theme_support() calls. + // The first value registered wins. (A child theme is set up first.) + if ( isset( $_wp_theme_features['custom-header'] ) ) { + $args[0] = wp_parse_args( $_wp_theme_features['custom-header'][0], $args[0] ); + } + + // Load in the defaults at the end, as we need to insure first one wins. + // This will cause all constants to be defined, as each arg will then be set to the default. + if ( $jit ) { + $args[0] = wp_parse_args( $args[0], $defaults ); + } + + /* + * If a constant was defined, use that value. Otherwise, define the constant to ensure + * the constant is always accurate (and is not defined later, overriding our value). + * As stated above, the first value wins. + * Once we get to wp_loaded (just-in-time), define any constants we haven't already. + * Constants are lame. Don't reference them. This is just for backward compatibility. + */ + + if ( defined( 'NO_HEADER_TEXT' ) ) { + $args[0]['header-text'] = ! NO_HEADER_TEXT; + } elseif ( isset( $args[0]['header-text'] ) ) { + define( 'NO_HEADER_TEXT', empty( $args[0]['header-text'] ) ); + } + + if ( defined( 'HEADER_IMAGE_WIDTH' ) ) { + $args[0]['width'] = (int) HEADER_IMAGE_WIDTH; + } elseif ( isset( $args[0]['width'] ) ) { + define( 'HEADER_IMAGE_WIDTH', (int) $args[0]['width'] ); + } + + if ( defined( 'HEADER_IMAGE_HEIGHT' ) ) { + $args[0]['height'] = (int) HEADER_IMAGE_HEIGHT; + } elseif ( isset( $args[0]['height'] ) ) { + define( 'HEADER_IMAGE_HEIGHT', (int) $args[0]['height'] ); + } + + if ( defined( 'HEADER_TEXTCOLOR' ) ) { + $args[0]['default-text-color'] = HEADER_TEXTCOLOR; + } elseif ( isset( $args[0]['default-text-color'] ) ) { + define( 'HEADER_TEXTCOLOR', $args[0]['default-text-color'] ); + } + + if ( defined( 'HEADER_IMAGE' ) ) { + $args[0]['default-image'] = HEADER_IMAGE; + } elseif ( isset( $args[0]['default-image'] ) ) { + define( 'HEADER_IMAGE', $args[0]['default-image'] ); + } + + if ( $jit && ! empty( $args[0]['default-image'] ) ) { + $args[0]['random-default'] = false; + } + + // If headers are supported, and we still don't have a defined width or height, + // we have implicit flex sizes. + if ( $jit ) { + if ( empty( $args[0]['width'] ) && empty( $args[0]['flex-width'] ) ) { + $args[0]['flex-width'] = true; + } + if ( empty( $args[0]['height'] ) && empty( $args[0]['flex-height'] ) ) { + $args[0]['flex-height'] = true; + } + } + + break; + + case 'custom-background': + if ( true === $args ) { + $args = array( 0 => array() ); + } + + $defaults = array( + 'default-image' => '', + 'default-preset' => 'default', + 'default-position-x' => 'left', + 'default-position-y' => 'top', + 'default-size' => 'auto', + 'default-repeat' => 'repeat', + 'default-attachment' => 'scroll', + 'default-color' => '', + 'wp-head-callback' => '_custom_background_cb', + 'admin-head-callback' => '', + 'admin-preview-callback' => '', + ); + + $jit = isset( $args[0]['__jit'] ); + unset( $args[0]['__jit'] ); + + // Merge in data from previous add_theme_support() calls. The first value registered wins. + if ( isset( $_wp_theme_features['custom-background'] ) ) { + $args[0] = wp_parse_args( $_wp_theme_features['custom-background'][0], $args[0] ); + } + + if ( $jit ) { + $args[0] = wp_parse_args( $args[0], $defaults ); + } + + if ( defined( 'BACKGROUND_COLOR' ) ) { + $args[0]['default-color'] = BACKGROUND_COLOR; + } elseif ( isset( $args[0]['default-color'] ) || $jit ) { + define( 'BACKGROUND_COLOR', $args[0]['default-color'] ); + } + + if ( defined( 'BACKGROUND_IMAGE' ) ) { + $args[0]['default-image'] = BACKGROUND_IMAGE; + } elseif ( isset( $args[0]['default-image'] ) || $jit ) { + define( 'BACKGROUND_IMAGE', $args[0]['default-image'] ); + } + + break; + + // Ensure that 'title-tag' is accessible in the admin. + case 'title-tag': + // Can be called in functions.php but must happen before wp_loaded, i.e. not in header.php. + if ( did_action( 'wp_loaded' ) ) { + _doing_it_wrong( + "add_theme_support( 'title-tag' )", + sprintf( + /* translators: 1: title-tag, 2: wp_loaded */ + __( 'Theme support for %1$s should be registered before the %2$s hook.' ), + 'title-tag', + 'wp_loaded' + ), + '4.1.0' + ); + + return false; + } + } + + $_wp_theme_features[ $feature ] = $args; +} + +/** + * Registers the internal custom header and background routines. + * + * @since 3.4.0 + * @access private + * + * @global Custom_Image_Header $custom_image_header + * @global Custom_Background $custom_background + */ +function _custom_header_background_just_in_time() { + global $custom_image_header, $custom_background; + + if ( current_theme_supports( 'custom-header' ) ) { + // In case any constants were defined after an add_custom_image_header() call, re-run. + add_theme_support( 'custom-header', array( '__jit' => true ) ); + + $args = get_theme_support( 'custom-header' ); + if ( $args[0]['wp-head-callback'] ) { + add_action( 'wp_head', $args[0]['wp-head-callback'] ); + } + + if ( is_admin() ) { + require_once ABSPATH . 'wp-admin/includes/class-custom-image-header.php'; + $custom_image_header = new Custom_Image_Header( $args[0]['admin-head-callback'], $args[0]['admin-preview-callback'] ); + } + } + + if ( current_theme_supports( 'custom-background' ) ) { + // In case any constants were defined after an add_custom_background() call, re-run. + add_theme_support( 'custom-background', array( '__jit' => true ) ); + + $args = get_theme_support( 'custom-background' ); + add_action( 'wp_head', $args[0]['wp-head-callback'] ); + + if ( is_admin() ) { + require_once ABSPATH . 'wp-admin/includes/class-custom-background.php'; + $custom_background = new Custom_Background( $args[0]['admin-head-callback'], $args[0]['admin-preview-callback'] ); + } + } +} + +/** + * Adds CSS to hide header text for custom logo, based on Customizer setting. + * + * @since 4.5.0 + * @access private + */ +function _custom_logo_header_styles() { + if ( ! current_theme_supports( 'custom-header', 'header-text' ) && get_theme_support( 'custom-logo', 'header-text' ) && ! get_theme_mod( 'header_text', true ) ) { + $classes = (array) get_theme_support( 'custom-logo', 'header-text' ); + $classes = array_map( 'sanitize_html_class', $classes ); + $classes = '.' . implode( ', .', $classes ); + + $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; + ?> + + + false ) ); + return; // Do not continue - custom-header-uploads no longer exists. + } + + if ( ! isset( $_wp_theme_features[ $feature ] ) ) { + return false; + } + + switch ( $feature ) { + case 'custom-header': + if ( ! did_action( 'wp_loaded' ) ) { + break; + } + $support = get_theme_support( 'custom-header' ); + if ( isset( $support[0]['wp-head-callback'] ) ) { + remove_action( 'wp_head', $support[0]['wp-head-callback'] ); + } + if ( isset( $GLOBALS['custom_image_header'] ) ) { + remove_action( 'admin_menu', array( $GLOBALS['custom_image_header'], 'init' ) ); + unset( $GLOBALS['custom_image_header'] ); + } + break; + + case 'custom-background': + if ( ! did_action( 'wp_loaded' ) ) { + break; + } + $support = get_theme_support( 'custom-background' ); + if ( isset( $support[0]['wp-head-callback'] ) ) { + remove_action( 'wp_head', $support[0]['wp-head-callback'] ); + } + remove_action( 'admin_menu', array( $GLOBALS['custom_background'], 'init' ) ); + unset( $GLOBALS['custom_background'] ); + break; + } + + unset( $_wp_theme_features[ $feature ] ); + return true; +} + +/** + * Checks a theme's support for a given feature. + * + * Example usage: + * + * current_theme_supports( 'custom-logo' ); + * current_theme_supports( 'html5', 'comment-form' ); + * + * @since 2.9.0 + * @since 5.3.0 Formalized the existing and already documented `...$args` parameter + * by adding it to the function signature. + * + * @global array $_wp_theme_features + * + * @param string $feature The feature being checked. + * @param mixed ...$args Optional extra arguments to be checked against certain features. + * @return bool True if the current theme supports the feature, false otherwise. + */ +function current_theme_supports( $feature, ...$args ) { + global $_wp_theme_features; + + if ( 'custom-header-uploads' == $feature ) { + return current_theme_supports( 'custom-header', 'uploads' ); + } + + if ( ! isset( $_wp_theme_features[ $feature ] ) ) { + return false; + } + + // If no args passed then no extra checks need be performed. + if ( ! $args ) { + return true; + } + + switch ( $feature ) { + case 'post-thumbnails': + /* + * post-thumbnails can be registered for only certain content/post types + * by passing an array of types to add_theme_support(). + * If no array was passed, then any type is accepted. + */ + if ( true === $_wp_theme_features[ $feature ] ) { // Registered for all types + return true; + } + $content_type = $args[0]; + return in_array( $content_type, $_wp_theme_features[ $feature ][0] ); + + case 'html5': + case 'post-formats': + /* + * Specific post formats can be registered by passing an array of types + * to add_theme_support(). + * + * Specific areas of HTML5 support *must* be passed via an array to add_theme_support(). + */ + $type = $args[0]; + return in_array( $type, $_wp_theme_features[ $feature ][0] ); + + case 'custom-logo': + case 'custom-header': + case 'custom-background': + // Specific capabilities can be registered by passing an array to add_theme_support(). + return ( isset( $_wp_theme_features[ $feature ][0][ $args[0] ] ) && $_wp_theme_features[ $feature ][0][ $args[0] ] ); + } + + /** + * Filters whether the current theme supports a specific feature. + * + * The dynamic portion of the hook name, `$feature`, refers to the specific theme + * feature. Possible values include 'post-formats', 'post-thumbnails', 'custom-background', + * 'custom-header', 'menus', 'automatic-feed-links', 'html5', + * 'starter-content', and 'customize-selective-refresh-widgets'. + * + * @since 3.4.0 + * + * @param bool $supports Whether the current theme supports the given feature. Default true. + * @param array $args Array of arguments for the feature. + * @param string $feature The theme feature. + */ + return apply_filters( "current_theme_supports-{$feature}", true, $args, $_wp_theme_features[ $feature ] ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores +} + +/** + * Checks a theme's support for a given feature before loading the functions which implement it. + * + * @since 2.9.0 + * + * @param string $feature The feature being checked. + * @param string $include Path to the file. + * @return bool True if the current theme supports the supplied feature, false otherwise. + */ +function require_if_theme_supports( $feature, $include ) { + if ( current_theme_supports( $feature ) ) { + require $include; + return true; + } + return false; +} + +/** + * Checks an attachment being deleted to see if it's a header or background image. + * + * If true it removes the theme modification which would be pointing at the deleted + * attachment. + * + * @access private + * @since 3.0.0 + * @since 4.3.0 Also removes `header_image_data`. + * @since 4.5.0 Also removes custom logo theme mods. + * + * @param int $id The attachment id. + */ +function _delete_attachment_theme_mod( $id ) { + $attachment_image = wp_get_attachment_url( $id ); + $header_image = get_header_image(); + $background_image = get_background_image(); + $custom_logo_id = get_theme_mod( 'custom_logo' ); + + if ( $custom_logo_id && $custom_logo_id == $id ) { + remove_theme_mod( 'custom_logo' ); + remove_theme_mod( 'header_text' ); + } + + if ( $header_image && $header_image == $attachment_image ) { + remove_theme_mod( 'header_image' ); + remove_theme_mod( 'header_image_data' ); + } + + if ( $background_image && $background_image == $attachment_image ) { + remove_theme_mod( 'background_image' ); + } +} + +/** + * Checks if a theme has been changed and runs 'after_switch_theme' hook on the next WP load. + * + * See {@see 'after_switch_theme'}. + * + * @since 3.3.0 + */ +function check_theme_switched() { + $stylesheet = get_option( 'theme_switched' ); + if ( $stylesheet ) { + $old_theme = wp_get_theme( $stylesheet ); + + // Prevent widget & menu mapping from running since Customizer already called it up front. + if ( get_option( 'theme_switched_via_customizer' ) ) { + remove_action( 'after_switch_theme', '_wp_menus_changed' ); + remove_action( 'after_switch_theme', '_wp_sidebars_changed' ); + update_option( 'theme_switched_via_customizer', false ); + } + + if ( $old_theme->exists() ) { + /** + * Fires on the first WP load after a theme switch if the old theme still exists. + * + * This action fires multiple times and the parameters differs + * according to the context, if the old theme exists or not. + * If the old theme is missing, the parameter will be the slug + * of the old theme. + * + * @since 3.3.0 + * + * @param string $old_name Old theme name. + * @param WP_Theme $old_theme WP_Theme instance of the old theme. + */ + do_action( 'after_switch_theme', $old_theme->get( 'Name' ), $old_theme ); + } else { + /** This action is documented in wp-includes/theme.php */ + do_action( 'after_switch_theme', $stylesheet, $old_theme ); + } + flush_rewrite_rules(); + + update_option( 'theme_switched', false ); + } +} + +/** + * Includes and instantiates the WP_Customize_Manager class. + * + * Loads the Customizer at plugins_loaded when accessing the customize.php admin + * page or when any request includes a wp_customize=on param or a customize_changeset + * param (a UUID). This param is a signal for whether to bootstrap the Customizer when + * WordPress is loading, especially in the Customizer preview + * or when making Customizer Ajax requests for widgets or menus. + * + * @since 3.4.0 + * + * @global WP_Customize_Manager $wp_customize + */ +function _wp_customize_include() { + + $is_customize_admin_page = ( is_admin() && 'customize.php' == basename( $_SERVER['PHP_SELF'] ) ); + $should_include = ( + $is_customize_admin_page + || + ( isset( $_REQUEST['wp_customize'] ) && 'on' == $_REQUEST['wp_customize'] ) + || + ( ! empty( $_GET['customize_changeset_uuid'] ) || ! empty( $_POST['customize_changeset_uuid'] ) ) + ); + + if ( ! $should_include ) { + return; + } + + /* + * Note that wp_unslash() is not being used on the input vars because it is + * called before wp_magic_quotes() gets called. Besides this fact, none of + * the values should contain any characters needing slashes anyway. + */ + $keys = array( 'changeset_uuid', 'customize_changeset_uuid', 'customize_theme', 'theme', 'customize_messenger_channel', 'customize_autosaved' ); + $input_vars = array_merge( + wp_array_slice_assoc( $_GET, $keys ), + wp_array_slice_assoc( $_POST, $keys ) + ); + + $theme = null; + $autosaved = null; + $messenger_channel = null; + + // Value false indicates UUID should be determined after_setup_theme + // to either re-use existing saved changeset or else generate a new UUID if none exists. + $changeset_uuid = false; + + // Set initially fo false since defaults to true for back-compat; + // can be overridden via the customize_changeset_branching filter. + $branching = false; + + if ( $is_customize_admin_page && isset( $input_vars['changeset_uuid'] ) ) { + $changeset_uuid = sanitize_key( $input_vars['changeset_uuid'] ); + } elseif ( ! empty( $input_vars['customize_changeset_uuid'] ) ) { + $changeset_uuid = sanitize_key( $input_vars['customize_changeset_uuid'] ); + } + + // Note that theme will be sanitized via WP_Theme. + if ( $is_customize_admin_page && isset( $input_vars['theme'] ) ) { + $theme = $input_vars['theme']; + } elseif ( isset( $input_vars['customize_theme'] ) ) { + $theme = $input_vars['customize_theme']; + } + + if ( ! empty( $input_vars['customize_autosaved'] ) ) { + $autosaved = true; + } + + if ( isset( $input_vars['customize_messenger_channel'] ) ) { + $messenger_channel = sanitize_key( $input_vars['customize_messenger_channel'] ); + } + + /* + * Note that settings must be previewed even outside the customizer preview + * and also in the customizer pane itself. This is to enable loading an existing + * changeset into the customizer. Previewing the settings only has to be prevented + * here in the case of a customize_save action because this will cause WP to think + * there is nothing changed that needs to be saved. + */ + $is_customize_save_action = ( + wp_doing_ajax() + && + isset( $_REQUEST['action'] ) + && + 'customize_save' === wp_unslash( $_REQUEST['action'] ) + ); + $settings_previewed = ! $is_customize_save_action; + + require_once ABSPATH . WPINC . '/class-wp-customize-manager.php'; + $GLOBALS['wp_customize'] = new WP_Customize_Manager( compact( 'changeset_uuid', 'theme', 'messenger_channel', 'settings_previewed', 'autosaved', 'branching' ) ); +} + +/** + * Publishes a snapshot's changes. + * + * @since 4.7.0 + * @access private + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global WP_Customize_Manager $wp_customize Customizer instance. + * + * @param string $new_status New post status. + * @param string $old_status Old post status. + * @param WP_Post $changeset_post Changeset post object. + */ +function _wp_customize_publish_changeset( $new_status, $old_status, $changeset_post ) { + global $wp_customize, $wpdb; + + $is_publishing_changeset = ( + 'customize_changeset' === $changeset_post->post_type + && + 'publish' === $new_status + && + 'publish' !== $old_status + ); + if ( ! $is_publishing_changeset ) { + return; + } + + if ( empty( $wp_customize ) ) { + require_once ABSPATH . WPINC . '/class-wp-customize-manager.php'; + $wp_customize = new WP_Customize_Manager( + array( + 'changeset_uuid' => $changeset_post->post_name, + 'settings_previewed' => false, + ) + ); + } + + if ( ! did_action( 'customize_register' ) ) { + /* + * When running from CLI or Cron, the customize_register action will need + * to be triggered in order for core, themes, and plugins to register their + * settings. Normally core will add_action( 'customize_register' ) at + * priority 10 to register the core settings, and if any themes/plugins + * also add_action( 'customize_register' ) at the same priority, they + * will have a $wp_customize with those settings registered since they + * call add_action() afterward, normally. However, when manually doing + * the customize_register action after the setup_theme, then the order + * will be reversed for two actions added at priority 10, resulting in + * the core settings no longer being available as expected to themes/plugins. + * So the following manually calls the method that registers the core + * settings up front before doing the action. + */ + remove_action( 'customize_register', array( $wp_customize, 'register_controls' ) ); + $wp_customize->register_controls(); + + /** This filter is documented in /wp-includes/class-wp-customize-manager.php */ + do_action( 'customize_register', $wp_customize ); + } + $wp_customize->_publish_changeset_values( $changeset_post->ID ); + + /* + * Trash the changeset post if revisions are not enabled. Unpublished + * changesets by default get garbage collected due to the auto-draft status. + * When a changeset post is published, however, it would no longer get cleaned + * out. This is a problem when the changeset posts are never displayed anywhere, + * since they would just be endlessly piling up. So here we use the revisions + * feature to indicate whether or not a published changeset should get trashed + * and thus garbage collected. + */ + if ( ! wp_revisions_enabled( $changeset_post ) ) { + $wp_customize->trash_changeset_post( $changeset_post->ID ); + } +} + +/** + * Filters changeset post data upon insert to ensure post_name is intact. + * + * This is needed to prevent the post_name from being dropped when the post is + * transitioned into pending status by a contributor. + * + * @since 4.7.0 + * @see wp_insert_post() + * + * @param array $post_data An array of slashed post data. + * @param array $supplied_post_data An array of sanitized, but otherwise unmodified post data. + * @return array Filtered data. + */ +function _wp_customize_changeset_filter_insert_post_data( $post_data, $supplied_post_data ) { + if ( isset( $post_data['post_type'] ) && 'customize_changeset' === $post_data['post_type'] ) { + + // Prevent post_name from being dropped, such as when contributor saves a changeset post as pending. + if ( empty( $post_data['post_name'] ) && ! empty( $supplied_post_data['post_name'] ) ) { + $post_data['post_name'] = $supplied_post_data['post_name']; + } + } + return $post_data; +} + +/** + * Adds settings for the customize-loader script. + * + * @since 3.4.0 + */ +function _wp_customize_loader_settings() { + $admin_origin = parse_url( admin_url() ); + $home_origin = parse_url( home_url() ); + $cross_domain = ( strtolower( $admin_origin['host'] ) != strtolower( $home_origin['host'] ) ); + + $browser = array( + 'mobile' => wp_is_mobile(), + 'ios' => wp_is_mobile() && preg_match( '/iPad|iPod|iPhone/', $_SERVER['HTTP_USER_AGENT'] ), + ); + + $settings = array( + 'url' => esc_url( admin_url( 'customize.php' ) ), + 'isCrossDomain' => $cross_domain, + 'browser' => $browser, + 'l10n' => array( + 'saveAlert' => __( 'The changes you made will be lost if you navigate away from this page.' ), + 'mainIframeTitle' => __( 'Customizer' ), + ), + ); + + $script = 'var _wpCustomizeLoaderSettings = ' . wp_json_encode( $settings ) . ';'; + + $wp_scripts = wp_scripts(); + $data = $wp_scripts->get_data( 'customize-loader', 'data' ); + if ( $data ) { + $script = "$data\n$script"; + } + + $wp_scripts->add_data( 'customize-loader', 'data', $script ); +} + +/** + * Returns a URL to load the Customizer. + * + * @since 3.4.0 + * + * @param string $stylesheet Optional. Theme to customize. Defaults to current theme. + * The theme's stylesheet will be urlencoded if necessary. + * @return string + */ +function wp_customize_url( $stylesheet = '' ) { + $url = admin_url( 'customize.php' ); + if ( $stylesheet ) { + $url .= '?theme=' . urlencode( $stylesheet ); + } + return esc_url( $url ); +} + +/** + * Prints a script to check whether or not the Customizer is supported, + * and apply either the no-customize-support or customize-support class + * to the body. + * + * This function MUST be called inside the body tag. + * + * Ideally, call this function immediately after the body tag is opened. + * This prevents a flash of unstyled content. + * + * It is also recommended that you add the "no-customize-support" class + * to the body tag by default. + * + * @since 3.4.0 + * @since 4.7.0 Support for IE8 and below is explicitly removed via conditional comments. + */ +function wp_customize_support_script() { + $admin_origin = parse_url( admin_url() ); + $home_origin = parse_url( home_url() ); + $cross_domain = ( strtolower( $admin_origin['host'] ) != strtolower( $home_origin['host'] ) ); + $type_attr = current_theme_supports( 'html5', 'script' ) ? '' : ' type="text/javascript"'; + ?> + + + > + (function() { + var request, b = document.body, c = 'className', cs = 'customize-support', rcs = new RegExp('(^|\\s+)(no-)?'+cs+'(\\s+|$)'); + + + request = (function(){ var xhr = new XMLHttpRequest(); return ('withCredentials' in xhr); })(); + + request = true; + + + b[c] = b[c].replace( rcs, ' ' ); + // The customizer requires postMessage and CORS (if the site is cross domain). + b[c] += ( window.postMessage && request ? ' ' : ' no-' ) + cs; + }()); + + + is_preview(); +} + +/** + * Make sure that auto-draft posts get their post_date bumped or status changed to draft to prevent premature garbage-collection. + * + * When a changeset is updated but remains an auto-draft, ensure the post_date + * for the auto-draft posts remains the same so that it will be + * garbage-collected at the same time by `wp_delete_auto_drafts()`. Otherwise, + * if the changeset is updated to be a draft then update the posts + * to have a far-future post_date so that they will never be garbage collected + * unless the changeset post itself is deleted. + * + * When a changeset is updated to be a persistent draft or to be scheduled for + * publishing, then transition any dependent auto-drafts to a draft status so + * that they likewise will not be garbage-collected but also so that they can + * be edited in the admin before publishing since there is not yet a post/page + * editing flow in the Customizer. See #39752. + * + * @link https://core.trac.wordpress.org/ticket/39752 + * + * @since 4.8.0 + * @access private + * @see wp_delete_auto_drafts() + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $new_status Transition to this post status. + * @param string $old_status Previous post status. + * @param \WP_Post $post Post data. + */ +function _wp_keep_alive_customize_changeset_dependent_auto_drafts( $new_status, $old_status, $post ) { + global $wpdb; + unset( $old_status ); + + // Short-circuit if not a changeset or if the changeset was published. + if ( 'customize_changeset' !== $post->post_type || 'publish' === $new_status ) { + return; + } + + $data = json_decode( $post->post_content, true ); + if ( empty( $data['nav_menus_created_posts']['value'] ) ) { + return; + } + + /* + * Actually, in lieu of keeping alive, trash any customization drafts here if the changeset itself is + * getting trashed. This is needed because when a changeset transitions to a draft, then any of the + * dependent auto-draft post/page stubs will also get transitioned to customization drafts which + * are then visible in the WP Admin. We cannot wait for the deletion of the changeset in which + * _wp_delete_customize_changeset_dependent_auto_drafts() will be called, since they need to be + * trashed to remove from visibility immediately. + */ + if ( 'trash' === $new_status ) { + foreach ( $data['nav_menus_created_posts']['value'] as $post_id ) { + if ( ! empty( $post_id ) && 'draft' === get_post_status( $post_id ) ) { + wp_trash_post( $post_id ); + } + } + return; + } + + $post_args = array(); + if ( 'auto-draft' === $new_status ) { + /* + * Keep the post date for the post matching the changeset + * so that it will not be garbage-collected before the changeset. + */ + $post_args['post_date'] = $post->post_date; // Note wp_delete_auto_drafts() only looks at this date. + } else { + /* + * Since the changeset no longer has an auto-draft (and it is not published) + * it is now a persistent changeset, a long-lived draft, and so any + * associated auto-draft posts should likewise transition into having a draft + * status. These drafts will be treated differently than regular drafts in + * that they will be tied to the given changeset. The publish meta box is + * replaced with a notice about how the post is part of a set of customized changes + * which will be published when the changeset is published. + */ + $post_args['post_status'] = 'draft'; + } + + foreach ( $data['nav_menus_created_posts']['value'] as $post_id ) { + if ( empty( $post_id ) || 'auto-draft' !== get_post_status( $post_id ) ) { + continue; + } + $wpdb->update( + $wpdb->posts, + $post_args, + array( 'ID' => $post_id ) + ); + clean_post_cache( $post_id ); + } +} diff --git a/wp-includes/update.php b/wp-includes/update.php new file mode 100644 index 0000000..520f794 --- /dev/null +++ b/wp-includes/update.php @@ -0,0 +1,836 @@ +version_checked ) { + $current = false; + } + + if ( ! is_object( $current ) ) { + $current = new stdClass; + $current->updates = array(); + $current->version_checked = $wp_version; + } + + if ( ! empty( $extra_stats ) ) { + $force_check = true; + } + + // Wait 1 minute between multiple version check requests. + $timeout = MINUTE_IN_SECONDS; + $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); + if ( ! $force_check && $time_not_changed ) { + return; + } + + /** + * Filters the locale requested for WordPress core translations. + * + * @since 2.8.0 + * + * @param string $locale Current locale. + */ + $locale = apply_filters( 'core_version_check_locale', get_locale() ); + + // Update last_checked for current to prevent multiple blocking requests if request hangs. + $current->last_checked = time(); + set_site_transient( 'update_core', $current ); + + if ( method_exists( $wpdb, 'db_version' ) ) { + $mysql_version = preg_replace( '/[^0-9.].*/', '', $wpdb->db_version() ); + } else { + $mysql_version = 'N/A'; + } + + if ( is_multisite() ) { + $user_count = get_user_count(); + $num_blogs = get_blog_count(); + $wp_install = network_site_url(); + $multisite_enabled = 1; + } else { + $user_count = count_users(); + $user_count = $user_count['total_users']; + $multisite_enabled = 0; + $num_blogs = 1; + $wp_install = home_url( '/' ); + } + + $query = array( + 'version' => $wp_version, + 'php' => $php_version, + 'locale' => $locale, + 'mysql' => $mysql_version, + 'local_package' => isset( $wp_local_package ) ? $wp_local_package : '', + 'blogs' => $num_blogs, + 'users' => $user_count, + 'multisite_enabled' => $multisite_enabled, + 'initial_db_version' => get_site_option( 'initial_db_version' ), + ); + + /** + * Filter the query arguments sent as part of the core version check. + * + * WARNING: Changing this data may result in your site not receiving security updates. + * Please exercise extreme caution. + * + * @since 4.9.0 + * + * @param array $query { + * Version check query arguments. + * + * @type string $version WordPress version number. + * @type string $php PHP version number. + * @type string $locale The locale to retrieve updates for. + * @type string $mysql MySQL version number. + * @type string $local_package The value of the $wp_local_package global, when set. + * @type int $blogs Number of sites on this WordPress installation. + * @type int $users Number of users on this WordPress installation. + * @type int $multisite_enabled Whether this WordPress installation uses Multisite. + * @type int $initial_db_version Database version of WordPress at time of installation. + * } + */ + $query = apply_filters( 'core_version_check_query_args', $query ); + + $post_body = array( + 'translations' => wp_json_encode( $translations ), + ); + + if ( is_array( $extra_stats ) ) { + $post_body = array_merge( $post_body, $extra_stats ); + } + + $url = 'http://api.wordpress.org/core/version-check/1.7/?' . http_build_query( $query, null, '&' ); + $http_url = $url; + $ssl = wp_http_supports( array( 'ssl' ) ); + if ( $ssl ) { + $url = set_url_scheme( $url, 'https' ); + } + + $doing_cron = wp_doing_cron(); + + $options = array( + 'timeout' => $doing_cron ? 30 : 3, + 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), + 'headers' => array( + 'wp_install' => $wp_install, + 'wp_blog' => home_url( '/' ), + ), + 'body' => $post_body, + ); + + $response = wp_remote_post( $url, $options ); + if ( $ssl && is_wp_error( $response ) ) { + trigger_error( + sprintf( + /* translators: %s: Support forums URL. */ + __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), + __( 'https://wordpress.org/support/forums/' ) + ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), + headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE + ); + $response = wp_remote_post( $http_url, $options ); + } + + if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) { + return; + } + + $body = trim( wp_remote_retrieve_body( $response ) ); + $body = json_decode( $body, true ); + + if ( ! is_array( $body ) || ! isset( $body['offers'] ) ) { + return; + } + + $offers = $body['offers']; + + foreach ( $offers as &$offer ) { + foreach ( $offer as $offer_key => $value ) { + if ( 'packages' == $offer_key ) { + $offer['packages'] = (object) array_intersect_key( + array_map( 'esc_url', $offer['packages'] ), + array_fill_keys( array( 'full', 'no_content', 'new_bundled', 'partial', 'rollback' ), '' ) + ); + } elseif ( 'download' == $offer_key ) { + $offer['download'] = esc_url( $value ); + } else { + $offer[ $offer_key ] = esc_html( $value ); + } + } + $offer = (object) array_intersect_key( + $offer, + array_fill_keys( + array( + 'response', + 'download', + 'locale', + 'packages', + 'current', + 'version', + 'php_version', + 'mysql_version', + 'new_bundled', + 'partial_version', + 'notify_email', + 'support_email', + 'new_files', + ), + '' + ) + ); + } + + $updates = new stdClass(); + $updates->updates = $offers; + $updates->last_checked = time(); + $updates->version_checked = $wp_version; + + if ( isset( $body['translations'] ) ) { + $updates->translations = $body['translations']; + } + + set_site_transient( 'update_core', $updates ); + + if ( ! empty( $body['ttl'] ) ) { + $ttl = (int) $body['ttl']; + if ( $ttl && ( time() + $ttl < wp_next_scheduled( 'wp_version_check' ) ) ) { + // Queue an event to re-run the update check in $ttl seconds. + wp_schedule_single_event( time() + $ttl, 'wp_version_check' ); + } + } + + // Trigger background updates if running non-interactively, and we weren't called from the update handler. + if ( $doing_cron && ! doing_action( 'wp_maybe_auto_update' ) ) { + /** + * Fires during wp_cron, starting the auto update process. + * + * @since 3.9.0 + */ + do_action( 'wp_maybe_auto_update' ); + } +} + +/** + * Check plugin versions against the latest versions hosted on WordPress.org. + * + * The WordPress version, PHP version, and Locale is sent along with a list of + * all plugins installed. Checks against the WordPress server at + * api.wordpress.org. Will only check if WordPress isn't installing. + * + * @since 2.3.0 + * @global string $wp_version The WordPress version string. + * + * @param array $extra_stats Extra statistics to report to the WordPress.org API. + */ +function wp_update_plugins( $extra_stats = array() ) { + if ( wp_installing() ) { + return; + } + + // Include an unmodified $wp_version. + require ABSPATH . WPINC . '/version.php'; + + // If running blog-side, bail unless we've not checked in the last 12 hours. + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + $plugins = get_plugins(); + $translations = wp_get_installed_translations( 'plugins' ); + + $active = get_option( 'active_plugins', array() ); + $current = get_site_transient( 'update_plugins' ); + if ( ! is_object( $current ) ) { + $current = new stdClass; + } + + $new_option = new stdClass; + $new_option->last_checked = time(); + + $doing_cron = wp_doing_cron(); + + // Check for update on a different schedule, depending on the page. + switch ( current_filter() ) { + case 'upgrader_process_complete': + $timeout = 0; + break; + case 'load-update-core.php': + $timeout = MINUTE_IN_SECONDS; + break; + case 'load-plugins.php': + case 'load-update.php': + $timeout = HOUR_IN_SECONDS; + break; + default: + if ( $doing_cron ) { + $timeout = 2 * HOUR_IN_SECONDS; + } else { + $timeout = 12 * HOUR_IN_SECONDS; + } + } + + $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); + + if ( $time_not_changed && ! $extra_stats ) { + $plugin_changed = false; + foreach ( $plugins as $file => $p ) { + $new_option->checked[ $file ] = $p['Version']; + + if ( ! isset( $current->checked[ $file ] ) || strval( $current->checked[ $file ] ) !== strval( $p['Version'] ) ) { + $plugin_changed = true; + } + } + + if ( isset( $current->response ) && is_array( $current->response ) ) { + foreach ( $current->response as $plugin_file => $update_details ) { + if ( ! isset( $plugins[ $plugin_file ] ) ) { + $plugin_changed = true; + break; + } + } + } + + // Bail if we've checked recently and if nothing has changed. + if ( ! $plugin_changed ) { + return; + } + } + + // Update last_checked for current to prevent multiple blocking requests if request hangs. + $current->last_checked = time(); + set_site_transient( 'update_plugins', $current ); + + $to_send = compact( 'plugins', 'active' ); + + $locales = array_values( get_available_languages() ); + + /** + * Filters the locales requested for plugin translations. + * + * @since 3.7.0 + * @since 4.5.0 The default value of the `$locales` parameter changed to include all locales. + * + * @param array $locales Plugin locales. Default is all available locales of the site. + */ + $locales = apply_filters( 'plugins_update_check_locales', $locales ); + $locales = array_unique( $locales ); + + if ( $doing_cron ) { + $timeout = 30; + } else { + // Three seconds, plus one extra second for every 10 plugins. + $timeout = 3 + (int) ( count( $plugins ) / 10 ); + } + + $options = array( + 'timeout' => $timeout, + 'body' => array( + 'plugins' => wp_json_encode( $to_send ), + 'translations' => wp_json_encode( $translations ), + 'locale' => wp_json_encode( $locales ), + 'all' => wp_json_encode( true ), + ), + 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), + ); + + if ( $extra_stats ) { + $options['body']['update_stats'] = wp_json_encode( $extra_stats ); + } + + $url = 'http://api.wordpress.org/plugins/update-check/1.1/'; + $http_url = $url; + $ssl = wp_http_supports( array( 'ssl' ) ); + if ( $ssl ) { + $url = set_url_scheme( $url, 'https' ); + } + + $raw_response = wp_remote_post( $url, $options ); + if ( $ssl && is_wp_error( $raw_response ) ) { + trigger_error( + sprintf( + /* translators: %s: Support forums URL. */ + __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), + __( 'https://wordpress.org/support/forums/' ) + ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), + headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE + ); + $raw_response = wp_remote_post( $http_url, $options ); + } + + if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) { + return; + } + + $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); + foreach ( $response['plugins'] as &$plugin ) { + $plugin = (object) $plugin; + if ( isset( $plugin->compatibility ) ) { + $plugin->compatibility = (object) $plugin->compatibility; + foreach ( $plugin->compatibility as &$data ) { + $data = (object) $data; + } + } + } + unset( $plugin, $data ); + foreach ( $response['no_update'] as &$plugin ) { + $plugin = (object) $plugin; + } + unset( $plugin ); + + if ( is_array( $response ) ) { + $new_option->response = $response['plugins']; + $new_option->translations = $response['translations']; + // TODO: Perhaps better to store no_update in a separate transient with an expiry? + $new_option->no_update = $response['no_update']; + } else { + $new_option->response = array(); + $new_option->translations = array(); + $new_option->no_update = array(); + } + + set_site_transient( 'update_plugins', $new_option ); +} + +/** + * Check theme versions against the latest versions hosted on WordPress.org. + * + * A list of all themes installed in sent to WP. Checks against the + * WordPress server at api.wordpress.org. Will only check if WordPress isn't + * installing. + * + * @since 2.7.0 + * @global string $wp_version The WordPress version string. + * + * @param array $extra_stats Extra statistics to report to the WordPress.org API. + */ +function wp_update_themes( $extra_stats = array() ) { + if ( wp_installing() ) { + return; + } + + // Include an unmodified $wp_version. + require ABSPATH . WPINC . '/version.php'; + + $installed_themes = wp_get_themes(); + $translations = wp_get_installed_translations( 'themes' ); + + $last_update = get_site_transient( 'update_themes' ); + if ( ! is_object( $last_update ) ) { + $last_update = new stdClass; + } + + $themes = array(); + $checked = array(); + $request = array(); + + // Put slug of current theme into request. + $request['active'] = get_option( 'stylesheet' ); + + foreach ( $installed_themes as $theme ) { + $checked[ $theme->get_stylesheet() ] = $theme->get( 'Version' ); + + $themes[ $theme->get_stylesheet() ] = array( + 'Name' => $theme->get( 'Name' ), + 'Title' => $theme->get( 'Name' ), + 'Version' => $theme->get( 'Version' ), + 'Author' => $theme->get( 'Author' ), + 'Author URI' => $theme->get( 'AuthorURI' ), + 'Template' => $theme->get_template(), + 'Stylesheet' => $theme->get_stylesheet(), + ); + } + + $doing_cron = wp_doing_cron(); + + // Check for update on a different schedule, depending on the page. + switch ( current_filter() ) { + case 'upgrader_process_complete': + $timeout = 0; + break; + case 'load-update-core.php': + $timeout = MINUTE_IN_SECONDS; + break; + case 'load-themes.php': + case 'load-update.php': + $timeout = HOUR_IN_SECONDS; + break; + default: + if ( $doing_cron ) { + $timeout = 2 * HOUR_IN_SECONDS; + } else { + $timeout = 12 * HOUR_IN_SECONDS; + } + } + + $time_not_changed = isset( $last_update->last_checked ) && $timeout > ( time() - $last_update->last_checked ); + + if ( $time_not_changed && ! $extra_stats ) { + $theme_changed = false; + foreach ( $checked as $slug => $v ) { + if ( ! isset( $last_update->checked[ $slug ] ) || strval( $last_update->checked[ $slug ] ) !== strval( $v ) ) { + $theme_changed = true; + } + } + + if ( isset( $last_update->response ) && is_array( $last_update->response ) ) { + foreach ( $last_update->response as $slug => $update_details ) { + if ( ! isset( $checked[ $slug ] ) ) { + $theme_changed = true; + break; + } + } + } + + // Bail if we've checked recently and if nothing has changed. + if ( ! $theme_changed ) { + return; + } + } + + // Update last_checked for current to prevent multiple blocking requests if request hangs. + $last_update->last_checked = time(); + set_site_transient( 'update_themes', $last_update ); + + $request['themes'] = $themes; + + $locales = array_values( get_available_languages() ); + + /** + * Filters the locales requested for theme translations. + * + * @since 3.7.0 + * @since 4.5.0 The default value of the `$locales` parameter changed to include all locales. + * + * @param array $locales Theme locales. Default is all available locales of the site. + */ + $locales = apply_filters( 'themes_update_check_locales', $locales ); + $locales = array_unique( $locales ); + + if ( $doing_cron ) { + $timeout = 30; + } else { + // Three seconds, plus one extra second for every 10 themes. + $timeout = 3 + (int) ( count( $themes ) / 10 ); + } + + $options = array( + 'timeout' => $timeout, + 'body' => array( + 'themes' => wp_json_encode( $request ), + 'translations' => wp_json_encode( $translations ), + 'locale' => wp_json_encode( $locales ), + ), + 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), + ); + + if ( $extra_stats ) { + $options['body']['update_stats'] = wp_json_encode( $extra_stats ); + } + + $url = 'http://api.wordpress.org/themes/update-check/1.1/'; + $http_url = $url; + $ssl = wp_http_supports( array( 'ssl' ) ); + if ( $ssl ) { + $url = set_url_scheme( $url, 'https' ); + } + + $raw_response = wp_remote_post( $url, $options ); + if ( $ssl && is_wp_error( $raw_response ) ) { + trigger_error( + sprintf( + /* translators: %s: Support forums URL. */ + __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ), + __( 'https://wordpress.org/support/forums/' ) + ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), + headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE + ); + $raw_response = wp_remote_post( $http_url, $options ); + } + + if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) { + return; + } + + $new_update = new stdClass; + $new_update->last_checked = time(); + $new_update->checked = $checked; + + $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); + + if ( is_array( $response ) ) { + $new_update->response = $response['themes']; + $new_update->translations = $response['translations']; + } + + set_site_transient( 'update_themes', $new_update ); +} + +/** + * Performs WordPress automatic background updates. + * + * @since 3.7.0 + */ +function wp_maybe_auto_update() { + include_once ABSPATH . 'wp-admin/includes/admin.php'; + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + + $upgrader = new WP_Automatic_Updater; + $upgrader->run(); +} + +/** + * Retrieves a list of all language updates available. + * + * @since 3.7.0 + * + * @return object[] Array of translation objects that have available updates. + */ +function wp_get_translation_updates() { + $updates = array(); + $transients = array( + 'update_core' => 'core', + 'update_plugins' => 'plugin', + 'update_themes' => 'theme', + ); + foreach ( $transients as $transient => $type ) { + $transient = get_site_transient( $transient ); + if ( empty( $transient->translations ) ) { + continue; + } + + foreach ( $transient->translations as $translation ) { + $updates[] = (object) $translation; + } + } + return $updates; +} + +/** + * Collect counts and UI strings for available updates + * + * @since 3.3.0 + * + * @return array + */ +function wp_get_update_data() { + $counts = array( + 'plugins' => 0, + 'themes' => 0, + 'wordpress' => 0, + 'translations' => 0, + ); + + $plugins = current_user_can( 'update_plugins' ); + if ( $plugins ) { + $update_plugins = get_site_transient( 'update_plugins' ); + if ( ! empty( $update_plugins->response ) ) { + $counts['plugins'] = count( $update_plugins->response ); + } + } + + $themes = current_user_can( 'update_themes' ); + if ( $themes ) { + $update_themes = get_site_transient( 'update_themes' ); + if ( ! empty( $update_themes->response ) ) { + $counts['themes'] = count( $update_themes->response ); + } + } + + $core = current_user_can( 'update_core' ); + if ( $core && function_exists( 'get_core_updates' ) ) { + $update_wordpress = get_core_updates( array( 'dismissed' => false ) ); + if ( ! empty( $update_wordpress ) && ! in_array( $update_wordpress[0]->response, array( 'development', 'latest' ) ) && current_user_can( 'update_core' ) ) { + $counts['wordpress'] = 1; + } + } + + if ( ( $core || $plugins || $themes ) && wp_get_translation_updates() ) { + $counts['translations'] = 1; + } + + $counts['total'] = $counts['plugins'] + $counts['themes'] + $counts['wordpress'] + $counts['translations']; + $titles = array(); + if ( $counts['wordpress'] ) { + /* translators: %d: Number of available WordPress updates. */ + $titles['wordpress'] = sprintf( __( '%d WordPress Update' ), $counts['wordpress'] ); + } + if ( $counts['plugins'] ) { + /* translators: %d: Number of available plugin updates. */ + $titles['plugins'] = sprintf( _n( '%d Plugin Update', '%d Plugin Updates', $counts['plugins'] ), $counts['plugins'] ); + } + if ( $counts['themes'] ) { + /* translators: %d: Number of available theme updates. */ + $titles['themes'] = sprintf( _n( '%d Theme Update', '%d Theme Updates', $counts['themes'] ), $counts['themes'] ); + } + if ( $counts['translations'] ) { + $titles['translations'] = __( 'Translation Updates' ); + } + + $update_title = $titles ? esc_attr( implode( ', ', $titles ) ) : ''; + + $update_data = array( + 'counts' => $counts, + 'title' => $update_title, + ); + /** + * Filters the returned array of update data for plugins, themes, and WordPress core. + * + * @since 3.5.0 + * + * @param array $update_data { + * Fetched update data. + * + * @type array $counts An array of counts for available plugin, theme, and WordPress updates. + * @type string $update_title Titles of available updates. + * } + * @param array $titles An array of update counts and UI strings for available updates. + */ + return apply_filters( 'wp_get_update_data', $update_data, $titles ); +} + +/** + * Determines whether core should be updated. + * + * @since 2.8.0 + * + * @global string $wp_version The WordPress version string. + */ +function _maybe_update_core() { + // Include an unmodified $wp_version. + require ABSPATH . WPINC . '/version.php'; + + $current = get_site_transient( 'update_core' ); + + if ( isset( $current->last_checked, $current->version_checked ) && + 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) && + $current->version_checked == $wp_version ) { + return; + } + wp_version_check(); +} +/** + * Check the last time plugins were run before checking plugin versions. + * + * This might have been backported to WordPress 2.6.1 for performance reasons. + * This is used for the wp-admin to check only so often instead of every page + * load. + * + * @since 2.7.0 + * @access private + */ +function _maybe_update_plugins() { + $current = get_site_transient( 'update_plugins' ); + if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) ) { + return; + } + wp_update_plugins(); +} + +/** + * Check themes versions only after a duration of time. + * + * This is for performance reasons to make sure that on the theme version + * checker is not run on every page load. + * + * @since 2.7.0 + * @access private + */ +function _maybe_update_themes() { + $current = get_site_transient( 'update_themes' ); + if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) ) { + return; + } + wp_update_themes(); +} + +/** + * Schedule core, theme, and plugin update checks. + * + * @since 3.1.0 + */ +function wp_schedule_update_checks() { + if ( ! wp_next_scheduled( 'wp_version_check' ) && ! wp_installing() ) { + wp_schedule_event( time(), 'twicedaily', 'wp_version_check' ); + } + + if ( ! wp_next_scheduled( 'wp_update_plugins' ) && ! wp_installing() ) { + wp_schedule_event( time(), 'twicedaily', 'wp_update_plugins' ); + } + + if ( ! wp_next_scheduled( 'wp_update_themes' ) && ! wp_installing() ) { + wp_schedule_event( time(), 'twicedaily', 'wp_update_themes' ); + } +} + +/** + * Clear existing update caches for plugins, themes, and core. + * + * @since 4.1.0 + */ +function wp_clean_update_cache() { + if ( function_exists( 'wp_clean_plugins_cache' ) ) { + wp_clean_plugins_cache(); + } else { + delete_site_transient( 'update_plugins' ); + } + wp_clean_themes_cache(); + delete_site_transient( 'update_core' ); +} + +if ( ( ! is_main_site() && ! is_network_admin() ) || wp_doing_ajax() ) { + return; +} + +add_action( 'admin_init', '_maybe_update_core' ); +add_action( 'wp_version_check', 'wp_version_check' ); + +add_action( 'load-plugins.php', 'wp_update_plugins' ); +add_action( 'load-update.php', 'wp_update_plugins' ); +add_action( 'load-update-core.php', 'wp_update_plugins' ); +add_action( 'admin_init', '_maybe_update_plugins' ); +add_action( 'wp_update_plugins', 'wp_update_plugins' ); + +add_action( 'load-themes.php', 'wp_update_themes' ); +add_action( 'load-update.php', 'wp_update_themes' ); +add_action( 'load-update-core.php', 'wp_update_themes' ); +add_action( 'admin_init', '_maybe_update_themes' ); +add_action( 'wp_update_themes', 'wp_update_themes' ); + +add_action( 'update_option_WPLANG', 'wp_clean_update_cache', 10, 0 ); + +add_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' ); + +add_action( 'init', 'wp_schedule_update_checks' ); diff --git a/wp-includes/user.php b/wp-includes/user.php new file mode 100644 index 0000000..723d543 --- /dev/null +++ b/wp-includes/user.php @@ -0,0 +1,3912 @@ +ID, $credentials['remember'], $secure_cookie ); + /** + * Fires after the user has successfully logged in. + * + * @since 1.5.0 + * + * @param string $user_login Username. + * @param WP_User $user WP_User object of the logged-in user. + */ + do_action( 'wp_login', $user->user_login, $user ); + return $user; +} + +/** + * Authenticate a user, confirming the username and password are valid. + * + * @since 2.8.0 + * + * @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null. + * @param string $username Username for authentication. + * @param string $password Password for authentication. + * @return WP_User|WP_Error WP_User on success, WP_Error on failure. + */ +function wp_authenticate_username_password( $user, $username, $password ) { + if ( $user instanceof WP_User ) { + return $user; + } + + if ( empty( $username ) || empty( $password ) ) { + if ( is_wp_error( $user ) ) { + return $user; + } + + $error = new WP_Error(); + + if ( empty( $username ) ) { + $error->add( 'empty_username', __( 'Error: The username field is empty.' ) ); + } + + if ( empty( $password ) ) { + $error->add( 'empty_password', __( 'Error: The password field is empty.' ) ); + } + + return $error; + } + + $user = get_user_by( 'login', $username ); + + if ( ! $user ) { + return new WP_Error( + 'invalid_username', + __( 'Unknown username. Check again or try your email address.' ) + ); + } + + /** + * Filters whether the given user can be authenticated with the provided $password. + * + * @since 2.5.0 + * + * @param WP_User|WP_Error $user WP_User or WP_Error object if a previous + * callback failed authentication. + * @param string $password Password to check against the user. + */ + $user = apply_filters( 'wp_authenticate_user', $user, $password ); + if ( is_wp_error( $user ) ) { + return $user; + } + + if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { + return new WP_Error( + 'incorrect_password', + sprintf( + /* translators: %s: User name. */ + __( 'Error: The password you entered for the username %s is incorrect.' ), + '' . $username . '' + ) . + ' ' . + __( 'Lost your password?' ) . + '' + ); + } + + return $user; +} + +/** + * Authenticates a user using the email and password. + * + * @since 4.5.0 + * + * @param WP_User|WP_Error|null $user WP_User or WP_Error object if a previous + * callback failed authentication. + * @param string $email Email address for authentication. + * @param string $password Password for authentication. + * @return WP_User|WP_Error WP_User on success, WP_Error on failure. + */ +function wp_authenticate_email_password( $user, $email, $password ) { + if ( $user instanceof WP_User ) { + return $user; + } + + if ( empty( $email ) || empty( $password ) ) { + if ( is_wp_error( $user ) ) { + return $user; + } + + $error = new WP_Error(); + + if ( empty( $email ) ) { + // Uses 'empty_username' for back-compat with wp_signon(). + $error->add( 'empty_username', __( 'Error: The email field is empty.' ) ); + } + + if ( empty( $password ) ) { + $error->add( 'empty_password', __( 'Error: The password field is empty.' ) ); + } + + return $error; + } + + if ( ! is_email( $email ) ) { + return $user; + } + + $user = get_user_by( 'email', $email ); + + if ( ! $user ) { + return new WP_Error( + 'invalid_email', + __( 'Unknown email address. Check again or try your username.' ) + ); + } + + /** This filter is documented in wp-includes/user.php */ + $user = apply_filters( 'wp_authenticate_user', $user, $password ); + + if ( is_wp_error( $user ) ) { + return $user; + } + + if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { + return new WP_Error( + 'incorrect_password', + sprintf( + /* translators: %s: Email address. */ + __( 'Error: The password you entered for the email address %s is incorrect.' ), + '' . $email . '' + ) . + ' ' . + __( 'Lost your password?' ) . + '' + ); + } + + return $user; +} + +/** + * Authenticate the user using the WordPress auth cookie. + * + * @since 2.8.0 + * + * @global string $auth_secure_cookie + * + * @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null. + * @param string $username Username. If not empty, cancels the cookie authentication. + * @param string $password Password. If not empty, cancels the cookie authentication. + * @return WP_User|WP_Error WP_User on success, WP_Error on failure. + */ +function wp_authenticate_cookie( $user, $username, $password ) { + if ( $user instanceof WP_User ) { + return $user; + } + + if ( empty( $username ) && empty( $password ) ) { + $user_id = wp_validate_auth_cookie(); + if ( $user_id ) { + return new WP_User( $user_id ); + } + + global $auth_secure_cookie; + + if ( $auth_secure_cookie ) { + $auth_cookie = SECURE_AUTH_COOKIE; + } else { + $auth_cookie = AUTH_COOKIE; + } + + if ( ! empty( $_COOKIE[ $auth_cookie ] ) ) { + return new WP_Error( 'expired_session', __( 'Please log in again.' ) ); + } + + // If the cookie is not set, be silent. + } + + return $user; +} + +/** + * For Multisite blogs, check if the authenticated user has been marked as a + * spammer, or if the user's primary blog has been marked as spam. + * + * @since 3.7.0 + * + * @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null. + * @return WP_User|WP_Error WP_User on success, WP_Error if the user is considered a spammer. + */ +function wp_authenticate_spam_check( $user ) { + if ( $user instanceof WP_User && is_multisite() ) { + /** + * Filters whether the user has been marked as a spammer. + * + * @since 3.7.0 + * + * @param bool $spammed Whether the user is considered a spammer. + * @param WP_User $user User to check against. + */ + $spammed = apply_filters( 'check_is_user_spammed', is_user_spammy( $user ), $user ); + + if ( $spammed ) { + return new WP_Error( 'spammer_account', __( 'Error: Your account has been marked as a spammer.' ) ); + } + } + return $user; +} + +/** + * Validates the logged-in cookie. + * + * Checks the logged-in cookie if the previous auth cookie could not be + * validated and parsed. + * + * This is a callback for the {@see 'determine_current_user'} filter, rather than API. + * + * @since 3.9.0 + * + * @param int|bool $user_id The user ID (or false) as received from + * the `determine_current_user` filter. + * @return int|false User ID if validated, false otherwise. If a user ID from + * an earlier filter callback is received, that value is returned. + */ +function wp_validate_logged_in_cookie( $user_id ) { + if ( $user_id ) { + return $user_id; + } + + if ( is_blog_admin() || is_network_admin() || empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) { + return false; + } + + return wp_validate_auth_cookie( $_COOKIE[ LOGGED_IN_COOKIE ], 'logged_in' ); +} + +/** + * Number of posts user has written. + * + * @since 3.0.0 + * @since 4.1.0 Added `$post_type` argument. + * @since 4.3.0 Added `$public_only` argument. Added the ability to pass an array + * of post types to `$post_type`. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $userid User ID. + * @param array|string $post_type Optional. Single post type or array of post types to count the number of posts for. Default 'post'. + * @param bool $public_only Optional. Whether to only return counts for public posts. Default false. + * @return string Number of posts the user has written in this post type. + */ +function count_user_posts( $userid, $post_type = 'post', $public_only = false ) { + global $wpdb; + + $where = get_posts_by_author_sql( $post_type, true, $userid, $public_only ); + + $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); + + /** + * Filters the number of posts a user has written. + * + * @since 2.7.0 + * @since 4.1.0 Added `$post_type` argument. + * @since 4.3.1 Added `$public_only` argument. + * + * @param int $count The user's post count. + * @param int $userid User ID. + * @param string|array $post_type Single post type or array of post types to count the number of posts for. + * @param bool $public_only Whether to limit counted posts to public posts. + */ + return apply_filters( 'get_usernumposts', $count, $userid, $post_type, $public_only ); +} + +/** + * Number of posts written by a list of users. + * + * @since 3.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int[] $users Array of user IDs. + * @param string|string[] $post_type Optional. Single post type or array of post types to check. Defaults to 'post'. + * @param bool $public_only Optional. Only return counts for public posts. Defaults to false. + * @return string[] Amount of posts each user has written, as strings, keyed by user ID. + */ +function count_many_users_posts( $users, $post_type = 'post', $public_only = false ) { + global $wpdb; + + $count = array(); + if ( empty( $users ) || ! is_array( $users ) ) { + return $count; + } + + $userlist = implode( ',', array_map( 'absint', $users ) ); + $where = get_posts_by_author_sql( $post_type, true, null, $public_only ); + + $result = $wpdb->get_results( "SELECT post_author, COUNT(*) FROM $wpdb->posts $where AND post_author IN ($userlist) GROUP BY post_author", ARRAY_N ); + foreach ( $result as $row ) { + $count[ $row[0] ] = $row[1]; + } + + foreach ( $users as $id ) { + if ( ! isset( $count[ $id ] ) ) { + $count[ $id ] = 0; + } + } + + return $count; +} + +// +// User option functions. +// + +/** + * Get the current user's ID + * + * @since MU (3.0.0) + * + * @return int The current user's ID, or 0 if no user is logged in. + */ +function get_current_user_id() { + if ( ! function_exists( 'wp_get_current_user' ) ) { + return 0; + } + $user = wp_get_current_user(); + return ( isset( $user->ID ) ? (int) $user->ID : 0 ); +} + +/** + * Retrieve user option that can be either per Site or per Network. + * + * If the user ID is not given, then the current user will be used instead. If + * the user ID is given, then the user data will be retrieved. The filter for + * the result, will also pass the original option name and finally the user data + * object as the third parameter. + * + * The option will first check for the per site name and then the per Network name. + * + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $option User option name. + * @param int $user Optional. User ID. + * @param string $deprecated Use get_option() to check for an option in the options table. + * @return mixed User option value on success, false on failure. + */ +function get_user_option( $option, $user = 0, $deprecated = '' ) { + global $wpdb; + + if ( ! empty( $deprecated ) ) { + _deprecated_argument( __FUNCTION__, '3.0.0' ); + } + + if ( empty( $user ) ) { + $user = get_current_user_id(); + } + + $user = get_userdata( $user ); + if ( ! $user ) { + return false; + } + + $prefix = $wpdb->get_blog_prefix(); + if ( $user->has_prop( $prefix . $option ) ) { // Blog-specific. + $result = $user->get( $prefix . $option ); + } elseif ( $user->has_prop( $option ) ) { // User-specific and cross-blog. + $result = $user->get( $option ); + } else { + $result = false; + } + + /** + * Filters a specific user option value. + * + * The dynamic portion of the hook name, `$option`, refers to the user option name. + * + * @since 2.5.0 + * + * @param mixed $result Value for the user's option. + * @param string $option Name of the option being retrieved. + * @param WP_User $user WP_User object of the user whose option is being retrieved. + */ + return apply_filters( "get_user_option_{$option}", $result, $option, $user ); +} + +/** + * Update user option with global blog capability. + * + * User options are just like user metadata except that they have support for + * global blog options. If the 'global' parameter is false, which it is by default + * it will prepend the WordPress table prefix to the option name. + * + * Deletes the user option if $newvalue is empty. + * + * @since 2.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $user_id User ID. + * @param string $option_name User option name. + * @param mixed $newvalue User option value. + * @param bool $global Optional. Whether option name is global or blog specific. + * Default false (blog specific). + * @return int|bool User meta ID if the option didn't exist, true on successful update, + * false on failure. + */ +function update_user_option( $user_id, $option_name, $newvalue, $global = false ) { + global $wpdb; + + if ( ! $global ) { + $option_name = $wpdb->get_blog_prefix() . $option_name; + } + + return update_user_meta( $user_id, $option_name, $newvalue ); +} + +/** + * Delete user option with global blog capability. + * + * User options are just like user metadata except that they have support for + * global blog options. If the 'global' parameter is false, which it is by default + * it will prepend the WordPress table prefix to the option name. + * + * @since 3.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $user_id User ID + * @param string $option_name User option name. + * @param bool $global Optional. Whether option name is global or blog specific. + * Default false (blog specific). + * @return bool True on success, false on failure. + */ +function delete_user_option( $user_id, $option_name, $global = false ) { + global $wpdb; + + if ( ! $global ) { + $option_name = $wpdb->get_blog_prefix() . $option_name; + } + return delete_user_meta( $user_id, $option_name ); +} + +/** + * Retrieve list of users matching criteria. + * + * @since 3.1.0 + * + * @see WP_User_Query + * + * @param array $args Optional. Arguments to retrieve users. See WP_User_Query::prepare_query(). + * for more information on accepted arguments. + * @return array List of users. + */ +function get_users( $args = array() ) { + + $args = wp_parse_args( $args ); + $args['count_total'] = false; + + $user_search = new WP_User_Query( $args ); + + return (array) $user_search->get_results(); +} + +/** + * Get the sites a user belongs to. + * + * @since 3.0.0 + * @since 4.7.0 Converted to use `get_sites()`. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $user_id User ID + * @param bool $all Whether to retrieve all sites, or only sites that are not + * marked as deleted, archived, or spam. + * @return array A list of the user's sites. An empty array if the user doesn't exist + * or belongs to no sites. + */ +function get_blogs_of_user( $user_id, $all = false ) { + global $wpdb; + + $user_id = (int) $user_id; + + // Logged out users can't have sites. + if ( empty( $user_id ) ) { + return array(); + } + + /** + * Filters the list of a user's sites before it is populated. + * + * Passing a non-null value to the filter will effectively short circuit + * get_blogs_of_user(), returning that value instead. + * + * @since 4.6.0 + * + * @param null|array $sites An array of site objects of which the user is a member. + * @param int $user_id User ID. + * @param bool $all Whether the returned array should contain all sites, including + * those marked 'deleted', 'archived', or 'spam'. Default false. + */ + $sites = apply_filters( 'pre_get_blogs_of_user', null, $user_id, $all ); + + if ( null !== $sites ) { + return $sites; + } + + $keys = get_user_meta( $user_id ); + if ( empty( $keys ) ) { + return array(); + } + + if ( ! is_multisite() ) { + $site_id = get_current_blog_id(); + $sites = array( $site_id => new stdClass ); + $sites[ $site_id ]->userblog_id = $site_id; + $sites[ $site_id ]->blogname = get_option( 'blogname' ); + $sites[ $site_id ]->domain = ''; + $sites[ $site_id ]->path = ''; + $sites[ $site_id ]->site_id = 1; + $sites[ $site_id ]->siteurl = get_option( 'siteurl' ); + $sites[ $site_id ]->archived = 0; + $sites[ $site_id ]->spam = 0; + $sites[ $site_id ]->deleted = 0; + return $sites; + } + + $site_ids = array(); + + if ( isset( $keys[ $wpdb->base_prefix . 'capabilities' ] ) && defined( 'MULTISITE' ) ) { + $site_ids[] = 1; + unset( $keys[ $wpdb->base_prefix . 'capabilities' ] ); + } + + $keys = array_keys( $keys ); + + foreach ( $keys as $key ) { + if ( 'capabilities' !== substr( $key, -12 ) ) { + continue; + } + if ( $wpdb->base_prefix && 0 !== strpos( $key, $wpdb->base_prefix ) ) { + continue; + } + $site_id = str_replace( array( $wpdb->base_prefix, '_capabilities' ), '', $key ); + if ( ! is_numeric( $site_id ) ) { + continue; + } + + $site_ids[] = (int) $site_id; + } + + $sites = array(); + + if ( ! empty( $site_ids ) ) { + $args = array( + 'number' => '', + 'site__in' => $site_ids, + 'update_site_meta_cache' => false, + ); + if ( ! $all ) { + $args['archived'] = 0; + $args['spam'] = 0; + $args['deleted'] = 0; + } + + $_sites = get_sites( $args ); + + foreach ( $_sites as $site ) { + $sites[ $site->id ] = (object) array( + 'userblog_id' => $site->id, + 'blogname' => $site->blogname, + 'domain' => $site->domain, + 'path' => $site->path, + 'site_id' => $site->network_id, + 'siteurl' => $site->siteurl, + 'archived' => $site->archived, + 'mature' => $site->mature, + 'spam' => $site->spam, + 'deleted' => $site->deleted, + ); + } + } + + /** + * Filters the list of sites a user belongs to. + * + * @since MU (3.0.0) + * + * @param array $sites An array of site objects belonging to the user. + * @param int $user_id User ID. + * @param bool $all Whether the returned sites array should contain all sites, including + * those marked 'deleted', 'archived', or 'spam'. Default false. + */ + return apply_filters( 'get_blogs_of_user', $sites, $user_id, $all ); +} + +/** + * Find out whether a user is a member of a given blog. + * + * @since MU (3.0.0) + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $user_id Optional. The unique ID of the user. Defaults to the current user. + * @param int $blog_id Optional. ID of the blog to check. Defaults to the current site. + * @return bool + */ +function is_user_member_of_blog( $user_id = 0, $blog_id = 0 ) { + global $wpdb; + + $user_id = (int) $user_id; + $blog_id = (int) $blog_id; + + if ( empty( $user_id ) ) { + $user_id = get_current_user_id(); + } + + // Technically not needed, but does save calls to get_site() and get_user_meta() + // in the event that the function is called when a user isn't logged in. + if ( empty( $user_id ) ) { + return false; + } else { + $user = get_userdata( $user_id ); + if ( ! $user instanceof WP_User ) { + return false; + } + } + + if ( ! is_multisite() ) { + return true; + } + + if ( empty( $blog_id ) ) { + $blog_id = get_current_blog_id(); + } + + $blog = get_site( $blog_id ); + + if ( ! $blog || ! isset( $blog->domain ) || $blog->archived || $blog->spam || $blog->deleted ) { + return false; + } + + $keys = get_user_meta( $user_id ); + if ( empty( $keys ) ) { + return false; + } + + // No underscore before capabilities in $base_capabilities_key. + $base_capabilities_key = $wpdb->base_prefix . 'capabilities'; + $site_capabilities_key = $wpdb->base_prefix . $blog_id . '_capabilities'; + + if ( isset( $keys[ $base_capabilities_key ] ) && 1 == $blog_id ) { + return true; + } + + if ( isset( $keys[ $site_capabilities_key ] ) ) { + return true; + } + + return false; +} + +/** + * Adds meta data to a user. + * + * @since 3.0.0 + * + * @param int $user_id User ID. + * @param string $meta_key Metadata name. + * @param mixed $meta_value Metadata value. + * @param bool $unique Optional. Whether the same key should not be added. Default false. + * @return int|false Meta ID on success, false on failure. + */ +function add_user_meta( $user_id, $meta_key, $meta_value, $unique = false ) { + return add_metadata( 'user', $user_id, $meta_key, $meta_value, $unique ); +} + +/** + * Remove metadata matching criteria from a user. + * + * You can match based on the key, or key and value. Removing based on key and + * value, will keep from removing duplicate metadata with the same key. It also + * allows removing all metadata matching key, if needed. + * + * @since 3.0.0 + * @link https://developer.wordpress.org/reference/functions/delete_user_meta/ + * + * @param int $user_id User ID + * @param string $meta_key Metadata name. + * @param mixed $meta_value Optional. Metadata value. + * @return bool True on success, false on failure. + */ +function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) { + return delete_metadata( 'user', $user_id, $meta_key, $meta_value ); +} + +/** + * Retrieve user meta field for a user. + * + * @since 3.0.0 + * @link https://developer.wordpress.org/reference/functions/get_user_meta/ + * + * @param int $user_id User ID. + * @param string $key Optional. The meta key to retrieve. By default, returns data for all keys. + * @param bool $single Whether to return a single value. + * @return mixed Will be an array if $single is false. Will be value of meta data field if $single is true. + */ +function get_user_meta( $user_id, $key = '', $single = false ) { + return get_metadata( 'user', $user_id, $key, $single ); +} + +/** + * Update user meta field based on user ID. + * + * Use the $prev_value parameter to differentiate between meta fields with the + * same key and user ID. + * + * If the meta field for the user does not exist, it will be added. + * + * @since 3.0.0 + * @link https://developer.wordpress.org/reference/functions/update_user_meta/ + * + * @param int $user_id User ID. + * @param string $meta_key Metadata key. + * @param mixed $meta_value Metadata value. + * @param mixed $prev_value Optional. Previous value to check before removing. + * @return int|bool Meta ID if the key didn't exist, true on successful update, false on failure. + */ +function update_user_meta( $user_id, $meta_key, $meta_value, $prev_value = '' ) { + return update_metadata( 'user', $user_id, $meta_key, $meta_value, $prev_value ); +} + +/** + * Count number of users who have each of the user roles. + * + * Assumes there are neither duplicated nor orphaned capabilities meta_values. + * Assumes role names are unique phrases. Same assumption made by WP_User_Query::prepare_query() + * Using $strategy = 'time' this is CPU-intensive and should handle around 10^7 users. + * Using $strategy = 'memory' this is memory-intensive and should handle around 10^5 users, but see WP Bug #12257. + * + * @since 3.0.0 + * @since 4.4.0 The number of users with no role is now included in the `none` element. + * @since 4.9.0 The `$site_id` parameter was added to support multisite. + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param string $strategy Optional. The computational strategy to use when counting the users. + * Accepts either 'time' or 'memory'. Default 'time'. + * @param int|null $site_id Optional. The site ID to count users for. Defaults to the current site. + * @return array { + * User counts. + * + * @type int $total_users Total number of users on the site. + * @type int[] $avail_roles Array of user counts keyed by user role. + * } + */ +function count_users( $strategy = 'time', $site_id = null ) { + global $wpdb; + + // Initialize. + if ( ! $site_id ) { + $site_id = get_current_blog_id(); + } + + /** + * Filter the user count before queries are run. Return a non-null value to cause count_users() + * to return early. + * + * @since 5.1.0 + * + * @param null|string $result The value to return instead. Default null to continue with the query. + * @param string $strategy Optional. The computational strategy to use when counting the users. + * Accepts either 'time' or 'memory'. Default 'time'. + * @param int|null $site_id Optional. The site ID to count users for. Defaults to the current site. + */ + $pre = apply_filters( 'pre_count_users', null, $strategy, $site_id ); + + if ( null !== $pre ) { + return $pre; + } + + $blog_prefix = $wpdb->get_blog_prefix( $site_id ); + $result = array(); + + if ( 'time' == $strategy ) { + if ( is_multisite() && get_current_blog_id() != $site_id ) { + switch_to_blog( $site_id ); + $avail_roles = wp_roles()->get_names(); + restore_current_blog(); + } else { + $avail_roles = wp_roles()->get_names(); + } + + // Build a CPU-intensive query that will return concise information. + $select_count = array(); + foreach ( $avail_roles as $this_role => $name ) { + $select_count[] = $wpdb->prepare( 'COUNT(NULLIF(`meta_value` LIKE %s, false))', '%' . $wpdb->esc_like( '"' . $this_role . '"' ) . '%' ); + } + $select_count[] = "COUNT(NULLIF(`meta_value` = 'a:0:{}', false))"; + $select_count = implode( ', ', $select_count ); + + // Add the meta_value index to the selection list, then run the query. + $row = $wpdb->get_row( + " + SELECT {$select_count}, COUNT(*) + FROM {$wpdb->usermeta} + INNER JOIN {$wpdb->users} ON user_id = ID + WHERE meta_key = '{$blog_prefix}capabilities' + ", + ARRAY_N + ); + + // Run the previous loop again to associate results with role names. + $col = 0; + $role_counts = array(); + foreach ( $avail_roles as $this_role => $name ) { + $count = (int) $row[ $col++ ]; + if ( $count > 0 ) { + $role_counts[ $this_role ] = $count; + } + } + + $role_counts['none'] = (int) $row[ $col++ ]; + + // Get the meta_value index from the end of the result set. + $total_users = (int) $row[ $col ]; + + $result['total_users'] = $total_users; + $result['avail_roles'] =& $role_counts; + } else { + $avail_roles = array( + 'none' => 0, + ); + + $users_of_blog = $wpdb->get_col( + " + SELECT meta_value + FROM {$wpdb->usermeta} + INNER JOIN {$wpdb->users} ON user_id = ID + WHERE meta_key = '{$blog_prefix}capabilities' + " + ); + + foreach ( $users_of_blog as $caps_meta ) { + $b_roles = maybe_unserialize( $caps_meta ); + if ( ! is_array( $b_roles ) ) { + continue; + } + if ( empty( $b_roles ) ) { + $avail_roles['none']++; + } + foreach ( $b_roles as $b_role => $val ) { + if ( isset( $avail_roles[ $b_role ] ) ) { + $avail_roles[ $b_role ]++; + } else { + $avail_roles[ $b_role ] = 1; + } + } + } + + $result['total_users'] = count( $users_of_blog ); + $result['avail_roles'] =& $avail_roles; + } + + return $result; +} + +// +// Private helper functions. +// + +/** + * Set up global user vars. + * + * Used by wp_set_current_user() for back compat. Might be deprecated in the future. + * + * @since 2.0.4 + * + * @global string $user_login The user username for logging in + * @global WP_User $userdata User data. + * @global int $user_level The level of the user + * @global int $user_ID The ID of the user + * @global string $user_email The email address of the user + * @global string $user_url The url in the user's profile + * @global string $user_identity The display name of the user + * + * @param int $for_user_id Optional. User ID to set up global data. Default 0. + */ +function setup_userdata( $for_user_id = 0 ) { + global $user_login, $userdata, $user_level, $user_ID, $user_email, $user_url, $user_identity; + + if ( ! $for_user_id ) { + $for_user_id = get_current_user_id(); + } + $user = get_userdata( $for_user_id ); + + if ( ! $user ) { + $user_ID = 0; + $user_level = 0; + $userdata = null; + $user_login = ''; + $user_email = ''; + $user_url = ''; + $user_identity = ''; + return; + } + + $user_ID = (int) $user->ID; + $user_level = (int) $user->user_level; + $userdata = $user; + $user_login = $user->user_login; + $user_email = $user->user_email; + $user_url = $user->user_url; + $user_identity = $user->display_name; +} + +/** + * Create dropdown HTML content of users. + * + * The content can either be displayed, which it is by default or retrieved by + * setting the 'echo' argument. The 'include' and 'exclude' arguments do not + * need to be used; all users will be displayed in that case. Only one can be + * used, either 'include' or 'exclude', but not both. + * + * The available arguments are as follows: + * + * @since 2.3.0 + * @since 4.5.0 Added the 'display_name_with_login' value for 'show'. + * @since 4.7.0 Added the `$role`, `$role__in`, and `$role__not_in` parameters. + * + * @param array|string $args { + * Optional. Array or string of arguments to generate a drop-down of users. + * See WP_User_Query::prepare_query() for additional available arguments. + * + * @type string $show_option_all Text to show as the drop-down default (all). + * Default empty. + * @type string $show_option_none Text to show as the drop-down default when no + * users were found. Default empty. + * @type int|string $option_none_value Value to use for $show_option_non when no users + * were found. Default -1. + * @type string $hide_if_only_one_author Whether to skip generating the drop-down + * if only one user was found. Default empty. + * @type string $orderby Field to order found users by. Accepts user fields. + * Default 'display_name'. + * @type string $order Whether to order users in ascending or descending + * order. Accepts 'ASC' (ascending) or 'DESC' (descending). + * Default 'ASC'. + * @type array|string $include Array or comma-separated list of user IDs to include. + * Default empty. + * @type array|string $exclude Array or comma-separated list of user IDs to exclude. + * Default empty. + * @type bool|int $multi Whether to skip the ID attribute on the 'select' element. + * Accepts 1|true or 0|false. Default 0|false. + * @type string $show User data to display. If the selected item is empty + * then the 'user_login' will be displayed in parentheses. + * Accepts any user field, or 'display_name_with_login' to show + * the display name with user_login in parentheses. + * Default 'display_name'. + * @type int|bool $echo Whether to echo or return the drop-down. Accepts 1|true (echo) + * or 0|false (return). Default 1|true. + * @type int $selected Which user ID should be selected. Default 0. + * @type bool $include_selected Whether to always include the selected user ID in the drop- + * down. Default false. + * @type string $name Name attribute of select element. Default 'user'. + * @type string $id ID attribute of the select element. Default is the value of $name. + * @type string $class Class attribute of the select element. Default empty. + * @type int $blog_id ID of blog (Multisite only). Default is ID of the current blog. + * @type string $who Which type of users to query. Accepts only an empty string or + * 'authors'. Default empty. + * @type string|array $role An array or a comma-separated list of role names that users must + * match to be included in results. Note that this is an inclusive + * list: users must match *each* role. Default empty. + * @type array $role__in An array of role names. Matched users must have at least one of + * these roles. Default empty array. + * @type array $role__not_in An array of role names to exclude. Users matching one or more of + * these roles will not be included in results. Default empty array. + * } + * @return string HTML dropdown list of users. + */ +function wp_dropdown_users( $args = '' ) { + $defaults = array( + 'show_option_all' => '', + 'show_option_none' => '', + 'hide_if_only_one_author' => '', + 'orderby' => 'display_name', + 'order' => 'ASC', + 'include' => '', + 'exclude' => '', + 'multi' => 0, + 'show' => 'display_name', + 'echo' => 1, + 'selected' => 0, + 'name' => 'user', + 'class' => '', + 'id' => '', + 'blog_id' => get_current_blog_id(), + 'who' => '', + 'include_selected' => false, + 'option_none_value' => -1, + 'role' => '', + 'role__in' => array(), + 'role__not_in' => array(), + ); + + $defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0; + + $parsed_args = wp_parse_args( $args, $defaults ); + + $query_args = wp_array_slice_assoc( $parsed_args, array( 'blog_id', 'include', 'exclude', 'orderby', 'order', 'who', 'role', 'role__in', 'role__not_in' ) ); + + $fields = array( 'ID', 'user_login' ); + + $show = ! empty( $parsed_args['show'] ) ? $parsed_args['show'] : 'display_name'; + if ( 'display_name_with_login' === $show ) { + $fields[] = 'display_name'; + } else { + $fields[] = $show; + } + + $query_args['fields'] = $fields; + + $show_option_all = $parsed_args['show_option_all']; + $show_option_none = $parsed_args['show_option_none']; + $option_none_value = $parsed_args['option_none_value']; + + /** + * Filters the query arguments for the list of users in the dropdown. + * + * @since 4.4.0 + * + * @param array $query_args The query arguments for get_users(). + * @param array $parsed_args The arguments passed to wp_dropdown_users() combined with the defaults. + */ + $query_args = apply_filters( 'wp_dropdown_users_args', $query_args, $parsed_args ); + + $users = get_users( $query_args ); + + $output = ''; + if ( ! empty( $users ) && ( empty( $parsed_args['hide_if_only_one_author'] ) || count( $users ) > 1 ) ) { + $name = esc_attr( $parsed_args['name'] ); + if ( $parsed_args['multi'] && ! $parsed_args['id'] ) { + $id = ''; + } else { + $id = $parsed_args['id'] ? " id='" . esc_attr( $parsed_args['id'] ) . "'" : " id='$name'"; + } + $output = "'; + } + + /** + * Filters the wp_dropdown_users() HTML output. + * + * @since 2.3.0 + * + * @param string $output HTML output generated by wp_dropdown_users(). + */ + $html = apply_filters( 'wp_dropdown_users', $output ); + + if ( $parsed_args['echo'] ) { + echo $html; + } + return $html; +} + +/** + * Sanitize user field based on context. + * + * Possible context values are: 'raw', 'edit', 'db', 'display', 'attribute' and 'js'. The + * 'display' context is used by default. 'attribute' and 'js' contexts are treated like 'display' + * when calling filters. + * + * @since 2.3.0 + * + * @param string $field The user Object field name. + * @param mixed $value The user Object value. + * @param int $user_id User ID. + * @param string $context How to sanitize user fields. Looks for 'raw', 'edit', 'db', 'display', + * 'attribute' and 'js'. + * @return mixed Sanitized value. + */ +function sanitize_user_field( $field, $value, $user_id, $context ) { + $int_fields = array( 'ID' ); + if ( in_array( $field, $int_fields ) ) { + $value = (int) $value; + } + + if ( 'raw' == $context ) { + return $value; + } + + if ( ! is_string( $value ) && ! is_numeric( $value ) ) { + return $value; + } + + $prefixed = false !== strpos( $field, 'user_' ); + + if ( 'edit' == $context ) { + if ( $prefixed ) { + + /** This filter is documented in wp-includes/post.php */ + $value = apply_filters( "edit_{$field}", $value, $user_id ); + } else { + + /** + * Filters a user field value in the 'edit' context. + * + * The dynamic portion of the hook name, `$field`, refers to the prefixed user + * field being filtered, such as 'user_login', 'user_email', 'first_name', etc. + * + * @since 2.9.0 + * + * @param mixed $value Value of the prefixed user field. + * @param int $user_id User ID. + */ + $value = apply_filters( "edit_user_{$field}", $value, $user_id ); + } + + if ( 'description' == $field ) { + $value = esc_html( $value ); // textarea_escaped? + } else { + $value = esc_attr( $value ); + } + } elseif ( 'db' == $context ) { + if ( $prefixed ) { + /** This filter is documented in wp-includes/post.php */ + $value = apply_filters( "pre_{$field}", $value ); + } else { + + /** + * Filters the value of a user field in the 'db' context. + * + * The dynamic portion of the hook name, `$field`, refers to the prefixed user + * field being filtered, such as 'user_login', 'user_email', 'first_name', etc. + * + * @since 2.9.0 + * + * @param mixed $value Value of the prefixed user field. + */ + $value = apply_filters( "pre_user_{$field}", $value ); + } + } else { + // Use display filters by default. + if ( $prefixed ) { + + /** This filter is documented in wp-includes/post.php */ + $value = apply_filters( "{$field}", $value, $user_id, $context ); + } else { + + /** + * Filters the value of a user field in a standard context. + * + * The dynamic portion of the hook name, `$field`, refers to the prefixed user + * field being filtered, such as 'user_login', 'user_email', 'first_name', etc. + * + * @since 2.9.0 + * + * @param mixed $value The user object value to sanitize. + * @param int $user_id User ID. + * @param string $context The context to filter within. + */ + $value = apply_filters( "user_{$field}", $value, $user_id, $context ); + } + } + + if ( 'user_url' == $field ) { + $value = esc_url( $value ); + } + + if ( 'attribute' == $context ) { + $value = esc_attr( $value ); + } elseif ( 'js' == $context ) { + $value = esc_js( $value ); + } + return $value; +} + +/** + * Update all user caches + * + * @since 3.0.0 + * + * @param WP_User $user User object to be cached + * @return bool|null Returns false on failure. + */ +function update_user_caches( $user ) { + if ( $user instanceof WP_User ) { + if ( ! $user->exists() ) { + return false; + } + + $user = $user->data; + } + + wp_cache_add( $user->ID, $user, 'users' ); + wp_cache_add( $user->user_login, $user->ID, 'userlogins' ); + wp_cache_add( $user->user_email, $user->ID, 'useremail' ); + wp_cache_add( $user->user_nicename, $user->ID, 'userslugs' ); +} + +/** + * Clean all user caches + * + * @since 3.0.0 + * @since 4.4.0 'clean_user_cache' action was added. + * + * @param WP_User|int $user User object or ID to be cleaned from the cache + */ +function clean_user_cache( $user ) { + if ( is_numeric( $user ) ) { + $user = new WP_User( $user ); + } + + if ( ! $user->exists() ) { + return; + } + + wp_cache_delete( $user->ID, 'users' ); + wp_cache_delete( $user->user_login, 'userlogins' ); + wp_cache_delete( $user->user_email, 'useremail' ); + wp_cache_delete( $user->user_nicename, 'userslugs' ); + + /** + * Fires immediately after the given user's cache is cleaned. + * + * @since 4.4.0 + * + * @param int $user_id User ID. + * @param WP_User $user User object. + */ + do_action( 'clean_user_cache', $user->ID, $user ); +} + +/** + * Determines whether the given username exists. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 2.0.0 + * + * @param string $username Username. + * @return int|false The user's ID on success, and false on failure. + */ +function username_exists( $username ) { + $user = get_user_by( 'login', $username ); + if ( $user ) { + $user_id = $user->ID; + } else { + $user_id = false; + } + + /** + * Filters whether the given username exists or not. + * + * @since 4.9.0 + * + * @param int|false $user_id The user's ID on success, and false on failure. + * @param string $username Username to check. + */ + return apply_filters( 'username_exists', $user_id, $username ); +} + +/** + * Determines whether the given email exists. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 2.1.0 + * + * @param string $email Email. + * @return int|false The user's ID on success, and false on failure. + */ +function email_exists( $email ) { + $user = get_user_by( 'email', $email ); + if ( $user ) { + return $user->ID; + } + return false; +} + +/** + * Checks whether a username is valid. + * + * @since 2.0.1 + * @since 4.4.0 Empty sanitized usernames are now considered invalid + * + * @param string $username Username. + * @return bool Whether username given is valid + */ +function validate_username( $username ) { + $sanitized = sanitize_user( $username, true ); + $valid = ( $sanitized == $username && ! empty( $sanitized ) ); + + /** + * Filters whether the provided username is valid or not. + * + * @since 2.0.1 + * + * @param bool $valid Whether given username is valid. + * @param string $username Username to check. + */ + return apply_filters( 'validate_username', $valid, $username ); +} + +/** + * Insert a user into the database. + * + * Most of the `$userdata` array fields have filters associated with the values. Exceptions are + * 'ID', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', + * 'user_registered', 'user_activation_key', 'spam', and 'role'. The filters have the prefix + * 'pre_user_' followed by the field name. An example using 'description' would have the filter + * called 'pre_user_description' that can be hooked into. + * + * @since 2.0.0 + * @since 3.6.0 The `aim`, `jabber`, and `yim` fields were removed as default user contact + * methods for new installations. See wp_get_user_contact_methods(). + * @since 4.7.0 The user's locale can be passed to `$userdata`. + * @since 5.3.0 The `user_activation_key` field can be passed to `$userdata`. + * @since 5.3.0 The `spam` field can be passed to `$userdata` (Multisite only). + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param array|object|WP_User $userdata { + * An array, object, or WP_User object of user data arguments. + * + * @type int $ID User ID. If supplied, the user will be updated. + * @type string $user_pass The plain-text user password. + * @type string $user_login The user's login username. + * @type string $user_nicename The URL-friendly user name. + * @type string $user_url The user URL. + * @type string $user_email The user email address. + * @type string $display_name The user's display name. + * Default is the user's username. + * @type string $nickname The user's nickname. + * Default is the user's username. + * @type string $first_name The user's first name. For new users, will be used + * to build the first part of the user's display name + * if `$display_name` is not specified. + * @type string $last_name The user's last name. For new users, will be used + * to build the second part of the user's display name + * if `$display_name` is not specified. + * @type string $description The user's biographical description. + * @type string $rich_editing Whether to enable the rich-editor for the user. + * Accepts 'true' or 'false' as a string literal, + * not boolean. Default 'true'. + * @type string $syntax_highlighting Whether to enable the rich code editor for the user. + * Accepts 'true' or 'false' as a string literal, + * not boolean. Default 'true'. + * @type string $comment_shortcuts Whether to enable comment moderation keyboard + * shortcuts for the user. Accepts 'true' or 'false' + * as a string literal, not boolean. Default 'false'. + * @type string $admin_color Admin color scheme for the user. Default 'fresh'. + * @type bool $use_ssl Whether the user should always access the admin over + * https. Default false. + * @type string $user_registered Date the user registered. Format is 'Y-m-d H:i:s'. + * @type string $user_activation_key Password reset key. Default empty. + * @type bool $spam Multisite only. Whether the user is marked as spam. + * Default false. + * @type string $show_admin_bar_front Whether to display the Admin Bar for the user + * on the site's front end. Accepts 'true' or 'false' + * as a string literal, not boolean. Default 'true'. + * @type string $role User's role. + * @type string $locale User's locale. Default empty. + * } + * @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not + * be created. + */ +function wp_insert_user( $userdata ) { + global $wpdb; + + if ( $userdata instanceof stdClass ) { + $userdata = get_object_vars( $userdata ); + } elseif ( $userdata instanceof WP_User ) { + $userdata = $userdata->to_array(); + } + + // Are we updating or creating? + if ( ! empty( $userdata['ID'] ) ) { + $ID = (int) $userdata['ID']; + $update = true; + $old_user_data = get_userdata( $ID ); + + if ( ! $old_user_data ) { + return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) ); + } + + // hashed in wp_update_user(), plaintext if called directly. + $user_pass = ! empty( $userdata['user_pass'] ) ? $userdata['user_pass'] : $old_user_data->user_pass; + } else { + $update = false; + // Hash the password. + $user_pass = wp_hash_password( $userdata['user_pass'] ); + } + + $sanitized_user_login = sanitize_user( $userdata['user_login'], true ); + + /** + * Filters a username after it has been sanitized. + * + * This filter is called before the user is created or updated. + * + * @since 2.0.3 + * + * @param string $sanitized_user_login Username after it has been sanitized. + */ + $pre_user_login = apply_filters( 'pre_user_login', $sanitized_user_login ); + + // Remove any non-printable chars from the login string to see if we have ended up with an empty username. + $user_login = trim( $pre_user_login ); + + // user_login must be between 0 and 60 characters. + if ( empty( $user_login ) ) { + return new WP_Error( 'empty_user_login', __( 'Cannot create a user with an empty login name.' ) ); + } elseif ( mb_strlen( $user_login ) > 60 ) { + return new WP_Error( 'user_login_too_long', __( 'Username may not be longer than 60 characters.' ) ); + } + + if ( ! $update && username_exists( $user_login ) ) { + return new WP_Error( 'existing_user_login', __( 'Sorry, that username already exists!' ) ); + } + + /** + * Filters the list of blacklisted usernames. + * + * @since 4.4.0 + * + * @param array $usernames Array of blacklisted usernames. + */ + $illegal_logins = (array) apply_filters( 'illegal_user_logins', array() ); + + if ( in_array( strtolower( $user_login ), array_map( 'strtolower', $illegal_logins ), true ) ) { + return new WP_Error( 'invalid_username', __( 'Sorry, that username is not allowed.' ) ); + } + + /* + * If a nicename is provided, remove unsafe user characters before using it. + * Otherwise build a nicename from the user_login. + */ + if ( ! empty( $userdata['user_nicename'] ) ) { + $user_nicename = sanitize_user( $userdata['user_nicename'], true ); + if ( mb_strlen( $user_nicename ) > 50 ) { + return new WP_Error( 'user_nicename_too_long', __( 'Nicename may not be longer than 50 characters.' ) ); + } + } else { + $user_nicename = mb_substr( $user_login, 0, 50 ); + } + + $user_nicename = sanitize_title( $user_nicename ); + + /** + * Filters a user's nicename before the user is created or updated. + * + * @since 2.0.3 + * + * @param string $user_nicename The user's nicename. + */ + $user_nicename = apply_filters( 'pre_user_nicename', $user_nicename ); + + $user_nicename_check = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1", $user_nicename, $user_login ) ); + + if ( $user_nicename_check ) { + $suffix = 2; + while ( $user_nicename_check ) { + // user_nicename allows 50 chars. Subtract one for a hyphen, plus the length of the suffix. + $base_length = 49 - mb_strlen( $suffix ); + $alt_user_nicename = mb_substr( $user_nicename, 0, $base_length ) . "-$suffix"; + $user_nicename_check = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1", $alt_user_nicename, $user_login ) ); + $suffix++; + } + $user_nicename = $alt_user_nicename; + } + + $raw_user_email = empty( $userdata['user_email'] ) ? '' : $userdata['user_email']; + + /** + * Filters a user's email before the user is created or updated. + * + * @since 2.0.3 + * + * @param string $raw_user_email The user's email. + */ + $user_email = apply_filters( 'pre_user_email', $raw_user_email ); + + /* + * If there is no update, just check for `email_exists`. If there is an update, + * check if current email and new email are the same, or not, and check `email_exists` + * accordingly. + */ + if ( ( ! $update || ( ! empty( $old_user_data ) && 0 !== strcasecmp( $user_email, $old_user_data->user_email ) ) ) + && ! defined( 'WP_IMPORTING' ) + && email_exists( $user_email ) + ) { + return new WP_Error( 'existing_user_email', __( 'Sorry, that email address is already used!' ) ); + } + + $raw_user_url = empty( $userdata['user_url'] ) ? '' : $userdata['user_url']; + + /** + * Filters a user's URL before the user is created or updated. + * + * @since 2.0.3 + * + * @param string $raw_user_url The user's URL. + */ + $user_url = apply_filters( 'pre_user_url', $raw_user_url ); + + $user_registered = empty( $userdata['user_registered'] ) ? gmdate( 'Y-m-d H:i:s' ) : $userdata['user_registered']; + + $user_activation_key = empty( $userdata['user_activation_key'] ) ? '' : $userdata['user_activation_key']; + + if ( ! empty( $userdata['spam'] ) && ! is_multisite() ) { + return new WP_Error( 'no_spam', __( 'Sorry, marking a user as spam is only supported on Multisite.' ) ); + } + + $spam = empty( $userdata['spam'] ) ? 0 : (bool) $userdata['spam']; + + // Store values to save in user meta. + $meta = array(); + + $nickname = empty( $userdata['nickname'] ) ? $user_login : $userdata['nickname']; + + /** + * Filters a user's nickname before the user is created or updated. + * + * @since 2.0.3 + * + * @param string $nickname The user's nickname. + */ + $meta['nickname'] = apply_filters( 'pre_user_nickname', $nickname ); + + $first_name = empty( $userdata['first_name'] ) ? '' : $userdata['first_name']; + + /** + * Filters a user's first name before the user is created or updated. + * + * @since 2.0.3 + * + * @param string $first_name The user's first name. + */ + $meta['first_name'] = apply_filters( 'pre_user_first_name', $first_name ); + + $last_name = empty( $userdata['last_name'] ) ? '' : $userdata['last_name']; + + /** + * Filters a user's last name before the user is created or updated. + * + * @since 2.0.3 + * + * @param string $last_name The user's last name. + */ + $meta['last_name'] = apply_filters( 'pre_user_last_name', $last_name ); + + if ( empty( $userdata['display_name'] ) ) { + if ( $update ) { + $display_name = $user_login; + } elseif ( $meta['first_name'] && $meta['last_name'] ) { + /* translators: 1: User's first name, 2: Last name. */ + $display_name = sprintf( _x( '%1$s %2$s', 'Display name based on first name and last name' ), $meta['first_name'], $meta['last_name'] ); + } elseif ( $meta['first_name'] ) { + $display_name = $meta['first_name']; + } elseif ( $meta['last_name'] ) { + $display_name = $meta['last_name']; + } else { + $display_name = $user_login; + } + } else { + $display_name = $userdata['display_name']; + } + + /** + * Filters a user's display name before the user is created or updated. + * + * @since 2.0.3 + * + * @param string $display_name The user's display name. + */ + $display_name = apply_filters( 'pre_user_display_name', $display_name ); + + $description = empty( $userdata['description'] ) ? '' : $userdata['description']; + + /** + * Filters a user's description before the user is created or updated. + * + * @since 2.0.3 + * + * @param string $description The user's description. + */ + $meta['description'] = apply_filters( 'pre_user_description', $description ); + + $meta['rich_editing'] = empty( $userdata['rich_editing'] ) ? 'true' : $userdata['rich_editing']; + + $meta['syntax_highlighting'] = empty( $userdata['syntax_highlighting'] ) ? 'true' : $userdata['syntax_highlighting']; + + $meta['comment_shortcuts'] = empty( $userdata['comment_shortcuts'] ) || 'false' === $userdata['comment_shortcuts'] ? 'false' : 'true'; + + $admin_color = empty( $userdata['admin_color'] ) ? 'fresh' : $userdata['admin_color']; + $meta['admin_color'] = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $admin_color ); + + $meta['use_ssl'] = empty( $userdata['use_ssl'] ) ? 0 : (bool) $userdata['use_ssl']; + + $meta['show_admin_bar_front'] = empty( $userdata['show_admin_bar_front'] ) ? 'true' : $userdata['show_admin_bar_front']; + + $meta['locale'] = isset( $userdata['locale'] ) ? $userdata['locale'] : ''; + + $compacted = compact( 'user_pass', 'user_nicename', 'user_email', 'user_url', 'user_registered', 'user_activation_key', 'display_name' ); + $data = wp_unslash( $compacted ); + + if ( ! $update ) { + $data = $data + compact( 'user_login' ); + } + + if ( is_multisite() ) { + $data = $data + compact( 'spam' ); + } + + /** + * Filters user data before the record is created or updated. + * + * It only includes data in the wp_users table wp_user, not any user metadata. + * + * @since 4.9.0 + * + * @param array $data { + * Values and keys for the user. + * + * @type string $user_login The user's login. Only included if $update == false + * @type string $user_pass The user's password. + * @type string $user_email The user's email. + * @type string $user_url The user's url. + * @type string $user_nicename The user's nice name. Defaults to a URL-safe version of user's login + * @type string $display_name The user's display name. + * @type string $user_registered MySQL timestamp describing the moment when the user registered. Defaults to + * the current UTC timestamp. + * } + * @param bool $update Whether the user is being updated rather than created. + * @param int|null $id ID of the user to be updated, or NULL if the user is being created. + */ + $data = apply_filters( 'wp_pre_insert_user_data', $data, $update, $update ? (int) $ID : null ); + + if ( empty( $data ) || ! is_array( $data ) ) { + return new WP_Error( 'empty_data', __( 'Not enough data to create this user.' ) ); + } + + if ( $update ) { + if ( $user_email !== $old_user_data->user_email || $user_pass !== $old_user_data->user_pass ) { + $data['user_activation_key'] = ''; + } + $wpdb->update( $wpdb->users, $data, compact( 'ID' ) ); + $user_id = (int) $ID; + } else { + $wpdb->insert( $wpdb->users, $data ); + $user_id = (int) $wpdb->insert_id; + } + + $user = new WP_User( $user_id ); + + /** + * Filters a user's meta values and keys immediately after the user is created or updated + * and before any user meta is inserted or updated. + * + * Does not include contact methods. These are added using `wp_get_user_contact_methods( $user )`. + * + * @since 4.4.0 + * + * @param array $meta { + * Default meta values and keys for the user. + * + * @type string $nickname The user's nickname. Default is the user's username. + * @type string $first_name The user's first name. + * @type string $last_name The user's last name. + * @type string $description The user's description. + * @type string $rich_editing Whether to enable the rich-editor for the user. Default 'true'. + * @type string $syntax_highlighting Whether to enable the rich code editor for the user. Default 'true'. + * @type string $comment_shortcuts Whether to enable keyboard shortcuts for the user. Default 'false'. + * @type string $admin_color The color scheme for a user's admin screen. Default 'fresh'. + * @type int|bool $use_ssl Whether to force SSL on the user's admin area. 0|false if SSL + * is not forced. + * @type string $show_admin_bar_front Whether to show the admin bar on the front end for the user. + * Default 'true'. + * @type string $locale User's locale. Default empty. + * } + * @param WP_User $user User object. + * @param bool $update Whether the user is being updated rather than created. + */ + $meta = apply_filters( 'insert_user_meta', $meta, $user, $update ); + + // Update user meta. + foreach ( $meta as $key => $value ) { + update_user_meta( $user_id, $key, $value ); + } + + foreach ( wp_get_user_contact_methods( $user ) as $key => $value ) { + if ( isset( $userdata[ $key ] ) ) { + update_user_meta( $user_id, $key, $userdata[ $key ] ); + } + } + + if ( isset( $userdata['role'] ) ) { + $user->set_role( $userdata['role'] ); + } elseif ( ! $update ) { + $user->set_role( get_option( 'default_role' ) ); + } + + clean_user_cache( $user_id ); + + if ( $update ) { + /** + * Fires immediately after an existing user is updated. + * + * @since 2.0.0 + * + * @param int $user_id User ID. + * @param WP_User $old_user_data Object containing user's data prior to update. + */ + do_action( 'profile_update', $user_id, $old_user_data ); + + if ( isset( $userdata['spam'] ) && $userdata['spam'] != $old_user_data->spam ) { + if ( 1 == $userdata['spam'] ) { + /** + * Fires after the user is marked as a SPAM user. + * + * @since 3.0.0 + * + * @param int $user_id ID of the user marked as SPAM. + */ + do_action( 'make_spam_user', $user_id ); + } else { + /** + * Fires after the user is marked as a HAM user. Opposite of SPAM. + * + * @since 3.0.0 + * + * @param int $user_id ID of the user marked as HAM. + */ + do_action( 'make_ham_user', $user_id ); + } + } + } else { + /** + * Fires immediately after a new user is registered. + * + * @since 1.5.0 + * + * @param int $user_id User ID. + */ + do_action( 'user_register', $user_id ); + } + + return $user_id; +} + +/** + * Update a user in the database. + * + * It is possible to update a user's password by specifying the 'user_pass' + * value in the $userdata parameter array. + * + * If current user's password is being updated, then the cookies will be + * cleared. + * + * @since 2.0.0 + * + * @see wp_insert_user() For what fields can be set in $userdata. + * + * @param array|object|WP_User $userdata An array of user data or a user object of type stdClass or WP_User. + * @return int|WP_Error The updated user's ID or a WP_Error object if the user could not be updated. + */ +function wp_update_user( $userdata ) { + if ( $userdata instanceof stdClass ) { + $userdata = get_object_vars( $userdata ); + } elseif ( $userdata instanceof WP_User ) { + $userdata = $userdata->to_array(); + } + + $ID = isset( $userdata['ID'] ) ? (int) $userdata['ID'] : 0; + if ( ! $ID ) { + return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) ); + } + + // First, get all of the original fields. + $user_obj = get_userdata( $ID ); + if ( ! $user_obj ) { + return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) ); + } + + $user = $user_obj->to_array(); + + // Add additional custom fields. + foreach ( _get_additional_user_keys( $user_obj ) as $key ) { + $user[ $key ] = get_user_meta( $ID, $key, true ); + } + + // Escape data pulled from DB. + $user = add_magic_quotes( $user ); + + if ( ! empty( $userdata['user_pass'] ) && $userdata['user_pass'] !== $user_obj->user_pass ) { + // If password is changing, hash it now. + $plaintext_pass = $userdata['user_pass']; + $userdata['user_pass'] = wp_hash_password( $userdata['user_pass'] ); + + /** + * Filters whether to send the password change email. + * + * @since 4.3.0 + * + * @see wp_insert_user() For `$user` and `$userdata` fields. + * + * @param bool $send Whether to send the email. + * @param array $user The original user array. + * @param array $userdata The updated user array. + */ + $send_password_change_email = apply_filters( 'send_password_change_email', true, $user, $userdata ); + } + + if ( isset( $userdata['user_email'] ) && $user['user_email'] !== $userdata['user_email'] ) { + /** + * Filters whether to send the email change email. + * + * @since 4.3.0 + * + * @see wp_insert_user() For `$user` and `$userdata` fields. + * + * @param bool $send Whether to send the email. + * @param array $user The original user array. + * @param array $userdata The updated user array. + */ + $send_email_change_email = apply_filters( 'send_email_change_email', true, $user, $userdata ); + } + + clean_user_cache( $user_obj ); + + // Merge old and new fields with new fields overwriting old ones. + $userdata = array_merge( $user, $userdata ); + $user_id = wp_insert_user( $userdata ); + + if ( ! is_wp_error( $user_id ) ) { + + $blog_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); + + $switched_locale = false; + if ( ! empty( $send_password_change_email ) || ! empty( $send_email_change_email ) ) { + $switched_locale = switch_to_locale( get_user_locale( $user_id ) ); + } + + if ( ! empty( $send_password_change_email ) ) { + /* translators: Do not translate USERNAME, ADMIN_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */ + $pass_change_text = __( + 'Hi ###USERNAME###, + +This notice confirms that your password was changed on ###SITENAME###. + +If you did not change your password, please contact the Site Administrator at +###ADMIN_EMAIL### + +This email has been sent to ###EMAIL### + +Regards, +All at ###SITENAME### +###SITEURL###' + ); + + $pass_change_email = array( + 'to' => $user['user_email'], + /* translators: Password change notification email subject. %s: Site title. */ + 'subject' => __( '[%s] Password Changed' ), + 'message' => $pass_change_text, + 'headers' => '', + ); + + /** + * Filters the contents of the email sent when the user's password is changed. + * + * @since 4.3.0 + * + * @param array $pass_change_email { + * Used to build wp_mail(). + * @type string $to The intended recipients. Add emails in a comma separated string. + * @type string $subject The subject of the email. + * @type string $message The content of the email. + * The following strings have a special meaning and will get replaced dynamically: + * - ###USERNAME### The current user's username. + * - ###ADMIN_EMAIL### The admin email in case this was unexpected. + * - ###EMAIL### The user's email address. + * - ###SITENAME### The name of the site. + * - ###SITEURL### The URL to the site. + * @type string $headers Headers. Add headers in a newline (\r\n) separated string. + * } + * @param array $user The original user array. + * @param array $userdata The updated user array. + */ + $pass_change_email = apply_filters( 'password_change_email', $pass_change_email, $user, $userdata ); + + $pass_change_email['message'] = str_replace( '###USERNAME###', $user['user_login'], $pass_change_email['message'] ); + $pass_change_email['message'] = str_replace( '###ADMIN_EMAIL###', get_option( 'admin_email' ), $pass_change_email['message'] ); + $pass_change_email['message'] = str_replace( '###EMAIL###', $user['user_email'], $pass_change_email['message'] ); + $pass_change_email['message'] = str_replace( '###SITENAME###', $blog_name, $pass_change_email['message'] ); + $pass_change_email['message'] = str_replace( '###SITEURL###', home_url(), $pass_change_email['message'] ); + + wp_mail( $pass_change_email['to'], sprintf( $pass_change_email['subject'], $blog_name ), $pass_change_email['message'], $pass_change_email['headers'] ); + } + + if ( ! empty( $send_email_change_email ) ) { + /* translators: Do not translate USERNAME, ADMIN_EMAIL, NEW_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */ + $email_change_text = __( + 'Hi ###USERNAME###, + +This notice confirms that your email address on ###SITENAME### was changed to ###NEW_EMAIL###. + +If you did not change your email, please contact the Site Administrator at +###ADMIN_EMAIL### + +This email has been sent to ###EMAIL### + +Regards, +All at ###SITENAME### +###SITEURL###' + ); + + $email_change_email = array( + 'to' => $user['user_email'], + /* translators: Email change notification email subject. %s: Site title. */ + 'subject' => __( '[%s] Email Changed' ), + 'message' => $email_change_text, + 'headers' => '', + ); + + /** + * Filters the contents of the email sent when the user's email is changed. + * + * @since 4.3.0 + * + * @param array $email_change_email { + * Used to build wp_mail(). + * @type string $to The intended recipients. + * @type string $subject The subject of the email. + * @type string $message The content of the email. + * The following strings have a special meaning and will get replaced dynamically: + * - ###USERNAME### The current user's username. + * - ###ADMIN_EMAIL### The admin email in case this was unexpected. + * - ###NEW_EMAIL### The new email address. + * - ###EMAIL### The old email address. + * - ###SITENAME### The name of the site. + * - ###SITEURL### The URL to the site. + * @type string $headers Headers. + * } + * @param array $user The original user array. + * @param array $userdata The updated user array. + */ + $email_change_email = apply_filters( 'email_change_email', $email_change_email, $user, $userdata ); + + $email_change_email['message'] = str_replace( '###USERNAME###', $user['user_login'], $email_change_email['message'] ); + $email_change_email['message'] = str_replace( '###ADMIN_EMAIL###', get_option( 'admin_email' ), $email_change_email['message'] ); + $email_change_email['message'] = str_replace( '###NEW_EMAIL###', $userdata['user_email'], $email_change_email['message'] ); + $email_change_email['message'] = str_replace( '###EMAIL###', $user['user_email'], $email_change_email['message'] ); + $email_change_email['message'] = str_replace( '###SITENAME###', $blog_name, $email_change_email['message'] ); + $email_change_email['message'] = str_replace( '###SITEURL###', home_url(), $email_change_email['message'] ); + + wp_mail( $email_change_email['to'], sprintf( $email_change_email['subject'], $blog_name ), $email_change_email['message'], $email_change_email['headers'] ); + } + + if ( $switched_locale ) { + restore_previous_locale(); + } + } + + // Update the cookies if the password changed. + $current_user = wp_get_current_user(); + if ( $current_user->ID == $ID ) { + if ( isset( $plaintext_pass ) ) { + wp_clear_auth_cookie(); + + // Here we calculate the expiration length of the current auth cookie and compare it to the default expiration. + // If it's greater than this, then we know the user checked 'Remember Me' when they logged in. + $logged_in_cookie = wp_parse_auth_cookie( '', 'logged_in' ); + /** This filter is documented in wp-includes/pluggable.php */ + $default_cookie_life = apply_filters( 'auth_cookie_expiration', ( 2 * DAY_IN_SECONDS ), $ID, false ); + $remember = false; + if ( false !== $logged_in_cookie && ( $logged_in_cookie['expiration'] - time() ) > $default_cookie_life ) { + $remember = true; + } + + wp_set_auth_cookie( $ID, $remember ); + } + } + + return $user_id; +} + +/** + * A simpler way of inserting a user into the database. + * + * Creates a new user with just the username, password, and email. For more + * complex user creation use wp_insert_user() to specify more information. + * + * @since 2.0.0 + * @see wp_insert_user() More complete way to create a new user + * + * @param string $username The user's username. + * @param string $password The user's password. + * @param string $email Optional. The user's email. Default empty. + * @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not + * be created. + */ +function wp_create_user( $username, $password, $email = '' ) { + $user_login = wp_slash( $username ); + $user_email = wp_slash( $email ); + $user_pass = $password; + + $userdata = compact( 'user_login', 'user_email', 'user_pass' ); + return wp_insert_user( $userdata ); +} + +/** + * Returns a list of meta keys to be (maybe) populated in wp_update_user(). + * + * The list of keys returned via this function are dependent on the presence + * of those keys in the user meta data to be set. + * + * @since 3.3.0 + * @access private + * + * @param WP_User $user WP_User instance. + * @return string[] List of user keys to be populated in wp_update_user(). + */ +function _get_additional_user_keys( $user ) { + $keys = array( 'first_name', 'last_name', 'nickname', 'description', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front', 'locale' ); + return array_merge( $keys, array_keys( wp_get_user_contact_methods( $user ) ) ); +} + +/** + * Set up the user contact methods. + * + * Default contact methods were removed in 3.6. A filter dictates contact methods. + * + * @since 3.7.0 + * + * @param WP_User $user Optional. WP_User object. + * @return string[] Array of contact method labels keyed by contact method. + */ +function wp_get_user_contact_methods( $user = null ) { + $methods = array(); + if ( get_site_option( 'initial_db_version' ) < 23588 ) { + $methods = array( + 'aim' => __( 'AIM' ), + 'yim' => __( 'Yahoo IM' ), + 'jabber' => __( 'Jabber / Google Talk' ), + ); + } + + /** + * Filters the user contact methods. + * + * @since 2.9.0 + * + * @param string[] $methods Array of contact method labels keyed by contact method. + * @param WP_User $user WP_User object. + */ + return apply_filters( 'user_contactmethods', $methods, $user ); +} + +/** + * The old private function for setting up user contact methods. + * + * Use wp_get_user_contact_methods() instead. + * + * @since 2.9.0 + * @access private + * + * @param WP_User $user Optional. WP_User object. Default null. + * @return string[] Array of contact method labels keyed by contact method. + */ +function _wp_get_user_contactmethods( $user = null ) { + return wp_get_user_contact_methods( $user ); +} + +/** + * Gets the text suggesting how to create strong passwords. + * + * @since 4.1.0 + * + * @return string The password hint text. + */ +function wp_get_password_hint() { + $hint = __( 'Hint: The password should be at least twelve characters long. To make it stronger, use upper and lower case letters, numbers, and symbols like ! " ? $ % ^ & ).' ); + + /** + * Filters the text describing the site's password complexity policy. + * + * @since 4.1.0 + * + * @param string $hint The password hint text. + */ + return apply_filters( 'password_hint', $hint ); +} + +/** + * Creates, stores, then returns a password reset key for user. + * + * @since 4.4.0 + * + * @global PasswordHash $wp_hasher Portable PHP password hashing framework. + * + * @param WP_User $user User to retrieve password reset key for. + * + * @return string|WP_Error Password reset key on success. WP_Error on error. + */ +function get_password_reset_key( $user ) { + global $wp_hasher; + + if ( ! ( $user instanceof WP_User ) ) { + return new WP_Error( 'invalidcombo', __( 'Error: There is no account with that username or email address.' ) ); + } + + /** + * Fires before a new password is retrieved. + * + * Use the {@see 'retrieve_password'} hook instead. + * + * @since 1.5.0 + * @deprecated 1.5.1 Misspelled. Use {@see 'retrieve_password'} hook instead. + * + * @param string $user_login The user login name. + */ + do_action_deprecated( 'retreive_password', array( $user->user_login ), '1.5.1', 'retrieve_password' ); + + /** + * Fires before a new password is retrieved. + * + * @since 1.5.1 + * + * @param string $user_login The user login name. + */ + do_action( 'retrieve_password', $user->user_login ); + + $allow = true; + if ( is_multisite() && is_user_spammy( $user ) ) { + $allow = false; + } + + /** + * Filters whether to allow a password to be reset. + * + * @since 2.7.0 + * + * @param bool $allow Whether to allow the password to be reset. Default true. + * @param int $user_data->ID The ID of the user attempting to reset a password. + */ + $allow = apply_filters( 'allow_password_reset', $allow, $user->ID ); + + if ( ! $allow ) { + return new WP_Error( 'no_password_reset', __( 'Password reset is not allowed for this user' ) ); + } elseif ( is_wp_error( $allow ) ) { + return $allow; + } + + // Generate something random for a password reset key. + $key = wp_generate_password( 20, false ); + + /** + * Fires when a password reset key is generated. + * + * @since 2.5.0 + * + * @param string $user_login The username for the user. + * @param string $key The generated password reset key. + */ + do_action( 'retrieve_password_key', $user->user_login, $key ); + + // Now insert the key, hashed, into the DB. + if ( empty( $wp_hasher ) ) { + require_once ABSPATH . WPINC . '/class-phpass.php'; + $wp_hasher = new PasswordHash( 8, true ); + } + + $hashed = time() . ':' . $wp_hasher->HashPassword( $key ); + + $key_saved = wp_update_user( + array( + 'ID' => $user->ID, + 'user_activation_key' => $hashed, + ) + ); + + if ( is_wp_error( $key_saved ) ) { + return $key_saved; + } + + return $key; +} + +/** + * Retrieves a user row based on password reset key and login + * + * A key is considered 'expired' if it exactly matches the value of the + * user_activation_key field, rather than being matched after going through the + * hashing process. This field is now hashed; old values are no longer accepted + * but have a different WP_Error code so good user feedback can be provided. + * + * @since 3.1.0 + * + * @global wpdb $wpdb WordPress database object for queries. + * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance. + * + * @param string $key Hash to validate sending user's password. + * @param string $login The user login. + * @return WP_User|WP_Error WP_User object on success, WP_Error object for invalid or expired keys. + */ +function check_password_reset_key( $key, $login ) { + global $wpdb, $wp_hasher; + + $key = preg_replace( '/[^a-z0-9]/i', '', $key ); + + if ( empty( $key ) || ! is_string( $key ) ) { + return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); + } + + if ( empty( $login ) || ! is_string( $login ) ) { + return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); + } + + $user = get_user_by( 'login', $login ); + + if ( ! $user ) { + return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); + } + + if ( empty( $wp_hasher ) ) { + require_once ABSPATH . WPINC . '/class-phpass.php'; + $wp_hasher = new PasswordHash( 8, true ); + } + + /** + * Filters the expiration time of password reset keys. + * + * @since 4.3.0 + * + * @param int $expiration The expiration time in seconds. + */ + $expiration_duration = apply_filters( 'password_reset_expiration', DAY_IN_SECONDS ); + + if ( false !== strpos( $user->user_activation_key, ':' ) ) { + list( $pass_request_time, $pass_key ) = explode( ':', $user->user_activation_key, 2 ); + $expiration_time = $pass_request_time + $expiration_duration; + } else { + $pass_key = $user->user_activation_key; + $expiration_time = false; + } + + if ( ! $pass_key ) { + return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); + } + + $hash_is_correct = $wp_hasher->CheckPassword( $key, $pass_key ); + + if ( $hash_is_correct && $expiration_time && time() < $expiration_time ) { + return $user; + } elseif ( $hash_is_correct && $expiration_time ) { + // Key has an expiration time that's passed. + return new WP_Error( 'expired_key', __( 'Invalid key.' ) ); + } + + if ( hash_equals( $user->user_activation_key, $key ) || ( $hash_is_correct && ! $expiration_time ) ) { + $return = new WP_Error( 'expired_key', __( 'Invalid key.' ) ); + $user_id = $user->ID; + + /** + * Filters the return value of check_password_reset_key() when an + * old-style key is used. + * + * @since 3.7.0 Previously plain-text keys were stored in the database. + * @since 4.3.0 Previously key hashes were stored without an expiration time. + * + * @param WP_Error $return A WP_Error object denoting an expired key. + * Return a WP_User object to validate the key. + * @param int $user_id The matched user ID. + */ + return apply_filters( 'password_reset_key_expired', $return, $user_id ); + } + + return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); +} + +/** + * Handles resetting the user's password. + * + * @since 2.5.0 + * + * @param WP_User $user The user + * @param string $new_pass New password for the user in plaintext + */ +function reset_password( $user, $new_pass ) { + /** + * Fires before the user's password is reset. + * + * @since 1.5.0 + * + * @param WP_User $user The user. + * @param string $new_pass New user password. + */ + do_action( 'password_reset', $user, $new_pass ); + + wp_set_password( $new_pass, $user->ID ); + update_user_option( $user->ID, 'default_password_nag', false, true ); + + /** + * Fires after the user's password is reset. + * + * @since 4.4.0 + * + * @param WP_User $user The user. + * @param string $new_pass New user password. + */ + do_action( 'after_password_reset', $user, $new_pass ); +} + +/** + * Handles registering a new user. + * + * @since 2.5.0 + * + * @param string $user_login User's username for logging in + * @param string $user_email User's email address to send password and add + * @return int|WP_Error Either user's ID or error on failure. + */ +function register_new_user( $user_login, $user_email ) { + $errors = new WP_Error(); + + $sanitized_user_login = sanitize_user( $user_login ); + /** + * Filters the email address of a user being registered. + * + * @since 2.1.0 + * + * @param string $user_email The email address of the new user. + */ + $user_email = apply_filters( 'user_registration_email', $user_email ); + + // Check the username. + if ( '' == $sanitized_user_login ) { + $errors->add( 'empty_username', __( 'Error: Please enter a username.' ) ); + } elseif ( ! validate_username( $user_login ) ) { + $errors->add( 'invalid_username', __( 'Error: This username is invalid because it uses illegal characters. Please enter a valid username.' ) ); + $sanitized_user_login = ''; + } elseif ( username_exists( $sanitized_user_login ) ) { + $errors->add( 'username_exists', __( 'Error: This username is already registered. Please choose another one.' ) ); + + } else { + /** This filter is documented in wp-includes/user.php */ + $illegal_user_logins = (array) apply_filters( 'illegal_user_logins', array() ); + if ( in_array( strtolower( $sanitized_user_login ), array_map( 'strtolower', $illegal_user_logins ), true ) ) { + $errors->add( 'invalid_username', __( 'Error: Sorry, that username is not allowed.' ) ); + } + } + + // Check the email address. + if ( '' == $user_email ) { + $errors->add( 'empty_email', __( 'Error: Please type your email address.' ) ); + } elseif ( ! is_email( $user_email ) ) { + $errors->add( 'invalid_email', __( 'Error: The email address isn’t correct.' ) ); + $user_email = ''; + } elseif ( email_exists( $user_email ) ) { + $errors->add( 'email_exists', __( 'Error: This email is already registered, please choose another one.' ) ); + } + + /** + * Fires when submitting registration form data, before the user is created. + * + * @since 2.1.0 + * + * @param string $sanitized_user_login The submitted username after being sanitized. + * @param string $user_email The submitted email. + * @param WP_Error $errors Contains any errors with submitted username and email, + * e.g., an empty field, an invalid username or email, + * or an existing username or email. + */ + do_action( 'register_post', $sanitized_user_login, $user_email, $errors ); + + /** + * Filters the errors encountered when a new user is being registered. + * + * The filtered WP_Error object may, for example, contain errors for an invalid + * or existing username or email address. A WP_Error object should always returned, + * but may or may not contain errors. + * + * If any errors are present in $errors, this will abort the user's registration. + * + * @since 2.1.0 + * + * @param WP_Error $errors A WP_Error object containing any errors encountered + * during registration. + * @param string $sanitized_user_login User's username after it has been sanitized. + * @param string $user_email User's email. + */ + $errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email ); + + if ( $errors->has_errors() ) { + return $errors; + } + + $user_pass = wp_generate_password( 12, false ); + $user_id = wp_create_user( $sanitized_user_login, $user_pass, $user_email ); + if ( ! $user_id || is_wp_error( $user_id ) ) { + $errors->add( + 'registerfail', + sprintf( + /* translators: %s: Admin email address. */ + __( 'Error: Couldn’t register you… please contact the webmaster !' ), + get_option( 'admin_email' ) + ) + ); + return $errors; + } + + update_user_option( $user_id, 'default_password_nag', true, true ); // Set up the password change nag. + + /** + * Fires after a new user registration has been recorded. + * + * @since 4.4.0 + * + * @param int $user_id ID of the newly registered user. + */ + do_action( 'register_new_user', $user_id ); + + return $user_id; +} + +/** + * Initiates email notifications related to the creation of new users. + * + * Notifications are sent both to the site admin and to the newly created user. + * + * @since 4.4.0 + * @since 4.6.0 Converted the `$notify` parameter to accept 'user' for sending + * notifications only to the user created. + * + * @param int $user_id ID of the newly created user. + * @param string $notify Optional. Type of notification that should happen. Accepts 'admin' + * or an empty string (admin only), 'user', or 'both' (admin and user). + * Default 'both'. + */ +function wp_send_new_user_notifications( $user_id, $notify = 'both' ) { + wp_new_user_notification( $user_id, null, $notify ); +} + +/** + * Retrieve the current session token from the logged_in cookie. + * + * @since 4.0.0 + * + * @return string Token. + */ +function wp_get_session_token() { + $cookie = wp_parse_auth_cookie( '', 'logged_in' ); + return ! empty( $cookie['token'] ) ? $cookie['token'] : ''; +} + +/** + * Retrieve a list of sessions for the current user. + * + * @since 4.0.0 + * @return array Array of sessions. + */ +function wp_get_all_sessions() { + $manager = WP_Session_Tokens::get_instance( get_current_user_id() ); + return $manager->get_all(); +} + +/** + * Remove the current session token from the database. + * + * @since 4.0.0 + */ +function wp_destroy_current_session() { + $token = wp_get_session_token(); + if ( $token ) { + $manager = WP_Session_Tokens::get_instance( get_current_user_id() ); + $manager->destroy( $token ); + } +} + +/** + * Remove all but the current session token for the current user for the database. + * + * @since 4.0.0 + */ +function wp_destroy_other_sessions() { + $token = wp_get_session_token(); + if ( $token ) { + $manager = WP_Session_Tokens::get_instance( get_current_user_id() ); + $manager->destroy_others( $token ); + } +} + +/** + * Remove all session tokens for the current user from the database. + * + * @since 4.0.0 + */ +function wp_destroy_all_sessions() { + $manager = WP_Session_Tokens::get_instance( get_current_user_id() ); + $manager->destroy_all(); +} + +/** + * Get the user IDs of all users with no role on this site. + * + * @since 4.4.0 + * @since 4.9.0 The `$site_id` parameter was added to support multisite. + * + * @param int|null $site_id Optional. The site ID to get users with no role for. Defaults to the current site. + * @return string[] Array of user IDs as strings. + */ +function wp_get_users_with_no_role( $site_id = null ) { + global $wpdb; + + if ( ! $site_id ) { + $site_id = get_current_blog_id(); + } + + $prefix = $wpdb->get_blog_prefix( $site_id ); + + if ( is_multisite() && get_current_blog_id() != $site_id ) { + switch_to_blog( $site_id ); + $role_names = wp_roles()->get_names(); + restore_current_blog(); + } else { + $role_names = wp_roles()->get_names(); + } + + $regex = implode( '|', array_keys( $role_names ) ); + $regex = preg_replace( '/[^a-zA-Z_\|-]/', '', $regex ); + $users = $wpdb->get_col( + $wpdb->prepare( + " + SELECT user_id + FROM $wpdb->usermeta + WHERE meta_key = '{$prefix}capabilities' + AND meta_value NOT REGEXP %s + ", + $regex + ) + ); + + return $users; +} + +/** + * Retrieves the current user object. + * + * Will set the current user, if the current user is not set. The current user + * will be set to the logged-in person. If no user is logged-in, then it will + * set the current user to 0, which is invalid and won't have any permissions. + * + * This function is used by the pluggable functions wp_get_current_user() and + * get_currentuserinfo(), the latter of which is deprecated but used for backward + * compatibility. + * + * @since 4.5.0 + * @access private + * + * @see wp_get_current_user() + * @global WP_User $current_user Checks if the current user is set. + * + * @return WP_User Current WP_User instance. + */ +function _wp_get_current_user() { + global $current_user; + + if ( ! empty( $current_user ) ) { + if ( $current_user instanceof WP_User ) { + return $current_user; + } + + // Upgrade stdClass to WP_User. + if ( is_object( $current_user ) && isset( $current_user->ID ) ) { + $cur_id = $current_user->ID; + $current_user = null; + wp_set_current_user( $cur_id ); + return $current_user; + } + + // $current_user has a junk value. Force to WP_User with ID 0. + $current_user = null; + wp_set_current_user( 0 ); + return $current_user; + } + + if ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) { + wp_set_current_user( 0 ); + return $current_user; + } + + /** + * Filters the current user. + * + * The default filters use this to determine the current user from the + * request's cookies, if available. + * + * Returning a value of false will effectively short-circuit setting + * the current user. + * + * @since 3.9.0 + * + * @param int|bool $user_id User ID if one has been determined, false otherwise. + */ + $user_id = apply_filters( 'determine_current_user', false ); + if ( ! $user_id ) { + wp_set_current_user( 0 ); + return $current_user; + } + + wp_set_current_user( $user_id ); + + return $current_user; +} + +/** + * Send a confirmation request email when a change of user email address is attempted. + * + * @since 3.0.0 + * @since 4.9.0 This function was moved from wp-admin/includes/ms.php so it's no longer Multisite specific. + * + * @global WP_Error $errors WP_Error object. + */ +function send_confirmation_on_profile_email() { + global $errors; + + $current_user = wp_get_current_user(); + if ( ! is_object( $errors ) ) { + $errors = new WP_Error(); + } + + if ( $current_user->ID != $_POST['user_id'] ) { + return false; + } + + if ( $current_user->user_email != $_POST['email'] ) { + if ( ! is_email( $_POST['email'] ) ) { + $errors->add( + 'user_email', + __( 'Error: The email address isn’t correct.' ), + array( + 'form-field' => 'email', + ) + ); + + return; + } + + if ( email_exists( $_POST['email'] ) ) { + $errors->add( + 'user_email', + __( 'Error: The email address is already used.' ), + array( + 'form-field' => 'email', + ) + ); + delete_user_meta( $current_user->ID, '_new_email' ); + + return; + } + + $hash = md5( $_POST['email'] . time() . wp_rand() ); + $new_user_email = array( + 'hash' => $hash, + 'newemail' => $_POST['email'], + ); + update_user_meta( $current_user->ID, '_new_email', $new_user_email ); + + $sitename = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); + + /* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */ + $email_text = __( + 'Howdy ###USERNAME###, + +You recently requested to have the email address on your account changed. + +If this is correct, please click on the following link to change it: +###ADMIN_URL### + +You can safely ignore and delete this email if you do not want to +take this action. + +This email has been sent to ###EMAIL### + +Regards, +All at ###SITENAME### +###SITEURL###' + ); + + /** + * Filters the text of the email sent when a change of user email address is attempted. + * + * The following strings have a special meaning and will get replaced dynamically: + * ###USERNAME### The current user's username. + * ###ADMIN_URL### The link to click on to confirm the email change. + * ###EMAIL### The new email. + * ###SITENAME### The name of the site. + * ###SITEURL### The URL to the site. + * + * @since MU (3.0.0) + * @since 4.9.0 This filter is no longer Multisite specific. + * + * @param string $email_text Text in the email. + * @param array $new_user_email { + * Data relating to the new user email address. + * + * @type string $hash The secure hash used in the confirmation link URL. + * @type string $newemail The proposed new email address. + * } + */ + $content = apply_filters( 'new_user_email_content', $email_text, $new_user_email ); + + $content = str_replace( '###USERNAME###', $current_user->user_login, $content ); + $content = str_replace( '###ADMIN_URL###', esc_url( admin_url( 'profile.php?newuseremail=' . $hash ) ), $content ); + $content = str_replace( '###EMAIL###', $_POST['email'], $content ); + $content = str_replace( '###SITENAME###', $sitename, $content ); + $content = str_replace( '###SITEURL###', home_url(), $content ); + + /* translators: New email address notification email subject. %s: Site title. */ + wp_mail( $_POST['email'], sprintf( __( '[%s] Email Change Request' ), $sitename ), $content ); + + $_POST['email'] = $current_user->user_email; + } +} + +/** + * Adds an admin notice alerting the user to check for confirmation request email + * after email address change. + * + * @since 3.0.0 + * @since 4.9.0 This function was moved from wp-admin/includes/ms.php so it's no longer Multisite specific. + * + * @global string $pagenow + */ +function new_user_email_admin_notice() { + global $pagenow; + + if ( 'profile.php' === $pagenow && isset( $_GET['updated'] ) ) { + $email = get_user_meta( get_current_user_id(), '_new_email', true ); + if ( $email ) { + /* translators: %s: New email address. */ + echo '

                ' . sprintf( __( 'Your email address has not been updated yet. Please check your inbox at %s for a confirmation email.' ), '' . esc_html( $email['newemail'] ) . '' ) . '

                '; + } + } +} + +/** + * Get all user privacy request types. + * + * @since 4.9.6 + * @access private + * + * @return array List of core privacy action types. + */ +function _wp_privacy_action_request_types() { + return array( + 'export_personal_data', + 'remove_personal_data', + ); +} + +/** + * Registers the personal data exporter for users. + * + * @since 4.9.6 + * + * @param array $exporters An array of personal data exporters. + * @return array An array of personal data exporters. + */ +function wp_register_user_personal_data_exporter( $exporters ) { + $exporters['wordpress-user'] = array( + 'exporter_friendly_name' => __( 'WordPress User' ), + 'callback' => 'wp_user_personal_data_exporter', + ); + + return $exporters; +} + +/** + * Finds and exports personal data associated with an email address from the user and user_meta table. + * + * @since 4.9.6 + * @since 5.4.0 Added 'Community Events Location' group to the export data. + * @since 5.4.0 Added 'Session Tokens' group to the export data. + * + * @param string $email_address The user's email address. + * @return array An array of personal data. + */ +function wp_user_personal_data_exporter( $email_address ) { + $email_address = trim( $email_address ); + + $data_to_export = array(); + + $user = get_user_by( 'email', $email_address ); + + if ( ! $user ) { + return array( + 'data' => array(), + 'done' => true, + ); + } + + $user_meta = get_user_meta( $user->ID ); + + $user_props_to_export = array( + 'ID' => __( 'User ID' ), + 'user_login' => __( 'User Login Name' ), + 'user_nicename' => __( 'User Nice Name' ), + 'user_email' => __( 'User Email' ), + 'user_url' => __( 'User URL' ), + 'user_registered' => __( 'User Registration Date' ), + 'display_name' => __( 'User Display Name' ), + 'nickname' => __( 'User Nickname' ), + 'first_name' => __( 'User First Name' ), + 'last_name' => __( 'User Last Name' ), + 'description' => __( 'User Description' ), + ); + + $user_data_to_export = array(); + + foreach ( $user_props_to_export as $key => $name ) { + $value = ''; + + switch ( $key ) { + case 'ID': + case 'user_login': + case 'user_nicename': + case 'user_email': + case 'user_url': + case 'user_registered': + case 'display_name': + $value = $user->data->$key; + break; + case 'nickname': + case 'first_name': + case 'last_name': + case 'description': + $value = $user_meta[ $key ][0]; + break; + } + + if ( ! empty( $value ) ) { + $user_data_to_export[] = array( + 'name' => $name, + 'value' => $value, + ); + } + } + + // Get the list of reserved names. + $reserved_names = array_values( $user_props_to_export ); + + /** + * Filter to extend the user's profile data for the privacy exporter. + * + * @since 5.4.0 + * + * @param array $additional_user_profile_data { + * An array of name-value pairs of additional user data items. Default empty array. + * + * @type string $name The user-facing name of an item name-value pair,e.g. 'IP Address'. + * @type string $value The user-facing value of an item data pair, e.g. '50.60.70.0'. + * } + * @param WP_User $user The user whose data is being exported. + * @param string[] $reserved_names An array of reserved names. Any item in `$additional_user_data` + * that uses one of these for its `name` will not be included in the export. + */ + $_extra_data = apply_filters( 'wp_privacy_additional_user_profile_data', array(), $user, $reserved_names ); + + if ( is_array( $_extra_data ) && ! empty( $_extra_data ) ) { + // Remove items that use reserved names. + $extra_data = array_filter( + $_extra_data, + function( $item ) use ( $reserved_names ) { + return ! in_array( $item['name'], $reserved_names, true ); + } + ); + + if ( count( $extra_data ) !== count( $_extra_data ) ) { + _doing_it_wrong( + __FUNCTION__, + sprintf( + /* translators: %s: wp_privacy_additional_user_profile_data */ + __( 'Filter %s returned items with reserved names.' ), + 'wp_privacy_additional_user_profile_data' + ), + '5.4.0' + ); + } + + if ( ! empty( $extra_data ) ) { + $user_data_to_export = array_merge( $user_data_to_export, $extra_data ); + } + } + + $data_to_export[] = array( + 'group_id' => 'user', + 'group_label' => __( 'User' ), + 'group_description' => __( 'User’s profile data.' ), + 'item_id' => "user-{$user->ID}", + 'data' => $user_data_to_export, + ); + + if ( isset( $user_meta['community-events-location'] ) ) { + $location = maybe_unserialize( $user_meta['community-events-location'][0] ); + + $location_props_to_export = array( + 'description' => __( 'City' ), + 'country' => __( 'Country' ), + 'latitude' => __( 'Latitude' ), + 'longitude' => __( 'Longitude' ), + 'ip' => __( 'IP' ), + ); + + $location_data_to_export = array(); + + foreach ( $location_props_to_export as $key => $name ) { + if ( ! empty( $location[ $key ] ) ) { + $location_data_to_export[] = array( + 'name' => $name, + 'value' => $location[ $key ], + ); + } + } + + $data_to_export[] = array( + 'group_id' => 'community-events-location', + 'group_label' => __( 'Community Events Location' ), + 'group_description' => __( 'User’s location data used for the Community Events in the WordPress Events and News dashboard widget.' ), + 'item_id' => "community-events-location-{$user->ID}", + 'data' => $location_data_to_export, + ); + } + + if ( isset( $user_meta['session_tokens'] ) ) { + $session_tokens = maybe_unserialize( $user_meta['session_tokens'][0] ); + + $session_tokens_props_to_export = array( + 'expiration' => __( 'Expiration' ), + 'ip' => __( 'IP' ), + 'ua' => __( 'User Agent' ), + 'login' => __( 'Last Login' ), + ); + + foreach ( $session_tokens as $token_key => $session_token ) { + $session_tokens_data_to_export = array(); + + foreach ( $session_tokens_props_to_export as $key => $name ) { + if ( ! empty( $session_token[ $key ] ) ) { + $value = $session_token[ $key ]; + if ( in_array( $key, array( 'expiration', 'login' ) ) ) { + $value = date_i18n( 'F d, Y H:i A', $value ); + } + $session_tokens_data_to_export[] = array( + 'name' => $name, + 'value' => $value, + ); + } + } + + $data_to_export[] = array( + 'group_id' => 'session-tokens', + 'group_label' => __( 'Session Tokens' ), + 'group_description' => __( 'User’s Session Tokens data.' ), + 'item_id' => "session-tokens-{$user->ID}-{$token_key}", + 'data' => $session_tokens_data_to_export, + ); + } + } + + return array( + 'data' => $data_to_export, + 'done' => true, + ); +} + +/** + * Update log when privacy request is confirmed. + * + * @since 4.9.6 + * @access private + * + * @param int $request_id ID of the request. + */ +function _wp_privacy_account_request_confirmed( $request_id ) { + $request = wp_get_user_request( $request_id ); + + if ( ! $request ) { + return; + } + + if ( ! in_array( $request->status, array( 'request-pending', 'request-failed' ), true ) ) { + return; + } + + update_post_meta( $request_id, '_wp_user_request_confirmed_timestamp', time() ); + wp_update_post( + array( + 'ID' => $request_id, + 'post_status' => 'request-confirmed', + ) + ); +} + +/** + * Notify the site administrator via email when a request is confirmed. + * + * Without this, the admin would have to manually check the site to see if any + * action was needed on their part yet. + * + * @since 4.9.6 + * + * @param int $request_id The ID of the request. + */ +function _wp_privacy_send_request_confirmation_notification( $request_id ) { + $request = wp_get_user_request( $request_id ); + + if ( ! is_a( $request, 'WP_User_Request' ) || 'request-confirmed' !== $request->status ) { + return; + } + + $already_notified = (bool) get_post_meta( $request_id, '_wp_admin_notified', true ); + + if ( $already_notified ) { + return; + } + + if ( 'export_personal_data' === $request->action_name ) { + $manage_url = admin_url( 'export-personal-data.php' ); + } elseif ( 'remove_personal_data' === $request->action_name ) { + $manage_url = admin_url( 'erase-personal-data.php' ); + } + $action_description = wp_user_request_action_description( $request->action_name ); + + /** + * Filters the recipient of the data request confirmation notification. + * + * In a Multisite environment, this will default to the email address of the + * network admin because, by default, single site admins do not have the + * capabilities required to process requests. Some networks may wish to + * delegate those capabilities to a single-site admin, or a dedicated person + * responsible for managing privacy requests. + * + * @since 4.9.6 + * + * @param string $admin_email The email address of the notification recipient. + * @param WP_User_Request $request The request that is initiating the notification. + */ + $admin_email = apply_filters( 'user_request_confirmed_email_to', get_site_option( 'admin_email' ), $request ); + + $email_data = array( + 'request' => $request, + 'user_email' => $request->email, + 'description' => $action_description, + 'manage_url' => $manage_url, + 'sitename' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), + 'siteurl' => home_url(), + 'admin_email' => $admin_email, + ); + + /* translators: Do not translate SITENAME, USER_EMAIL, DESCRIPTION, MANAGE_URL, SITEURL; those are placeholders. */ + $email_text = __( + 'Howdy, + +A user data privacy request has been confirmed on ###SITENAME###: + +User: ###USER_EMAIL### +Request: ###DESCRIPTION### + +You can view and manage these data privacy requests here: + +###MANAGE_URL### + +Regards, +All at ###SITENAME### +###SITEURL###' + ); + + /** + * Filters the body of the user request confirmation email. + * + * The email is sent to an administrator when an user request is confirmed. + * The following strings have a special meaning and will get replaced dynamically: + * + * ###SITENAME### The name of the site. + * ###USER_EMAIL### The user email for the request. + * ###DESCRIPTION### Description of the action being performed so the user knows what the email is for. + * ###MANAGE_URL### The URL to manage requests. + * ###SITEURL### The URL to the site. + * + * @since 4.9.6 + * + * @param string $email_text Text in the email. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type string $user_email The email address confirming a request + * @type string $description Description of the action being performed so the user knows what the email is for. + * @type string $manage_url The link to click manage privacy requests of this type. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * @type string $admin_email The administrator email receiving the mail. + * } + */ + $content = apply_filters( 'user_confirmed_action_email_content', $email_text, $email_data ); + + $content = str_replace( '###SITENAME###', $email_data['sitename'], $content ); + $content = str_replace( '###USER_EMAIL###', $email_data['user_email'], $content ); + $content = str_replace( '###DESCRIPTION###', $email_data['description'], $content ); + $content = str_replace( '###MANAGE_URL###', esc_url_raw( $email_data['manage_url'] ), $content ); + $content = str_replace( '###SITEURL###', esc_url_raw( $email_data['siteurl'] ), $content ); + + $subject = sprintf( + /* translators: Privacy data request confirmed notification email subject. 1: Site title, 2: Name of the confirmed action. */ + __( '[%1$s] Action Confirmed: %2$s' ), + $email_data['sitename'], + $action_description + ); + + /** + * Filters the subject of the user request confirmation email. + * + * @since 4.9.8 + * + * @param string $subject The email subject. + * @param string $sitename The name of the site. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type string $user_email The email address confirming a request + * @type string $description Description of the action being performed so the user knows what the email is for. + * @type string $manage_url The link to click manage privacy requests of this type. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * @type string $admin_email The administrator email receiving the mail. + * } + */ + $subject = apply_filters( 'user_request_confirmed_email_subject', $subject, $email_data['sitename'], $email_data ); + + $headers = ''; + + /** + * Filters the headers of the user request confirmation email. + * + * @since 5.4.0 + * + * @param string|array $headers The email headers. + * @param string $subject The email subject. + * @param string $content The email content. + * @param int $request_id The request ID. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type string $user_email The email address confirming a request + * @type string $description Description of the action being performed so the user knows what the email is for. + * @type string $manage_url The link to click manage privacy requests of this type. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * @type string $admin_email The administrator email receiving the mail. + * } + */ + $headers = apply_filters( 'user_request_confirmed_email_headers', $headers, $subject, $content, $request_id, $email_data ); + + $email_sent = wp_mail( $email_data['admin_email'], $subject, $content, $headers ); + + if ( $email_sent ) { + update_post_meta( $request_id, '_wp_admin_notified', true ); + } +} + +/** + * Notify the user when their erasure request is fulfilled. + * + * Without this, the user would never know if their data was actually erased. + * + * @since 4.9.6 + * + * @param int $request_id The privacy request post ID associated with this request. + */ +function _wp_privacy_send_erasure_fulfillment_notification( $request_id ) { + $request = wp_get_user_request( $request_id ); + + if ( ! is_a( $request, 'WP_User_Request' ) || 'request-completed' !== $request->status ) { + return; + } + + $already_notified = (bool) get_post_meta( $request_id, '_wp_user_notified', true ); + + if ( $already_notified ) { + return; + } + + // Localize message content for user; fallback to site default for visitors. + if ( ! empty( $request->user_id ) ) { + $locale = get_user_locale( $request->user_id ); + } else { + $locale = get_locale(); + } + + $switched_locale = switch_to_locale( $locale ); + + /** + * Filters the recipient of the data erasure fulfillment notification. + * + * @since 4.9.6 + * + * @param string $user_email The email address of the notification recipient. + * @param WP_User_Request $request The request that is initiating the notification. + */ + $user_email = apply_filters( 'user_erasure_fulfillment_email_to', $request->email, $request ); + + $email_data = array( + 'request' => $request, + 'message_recipient' => $user_email, + 'privacy_policy_url' => get_privacy_policy_url(), + 'sitename' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), + 'siteurl' => home_url(), + ); + + $subject = sprintf( + /* translators: Erasure request fulfilled notification email subject. %s: Site title. */ + __( '[%s] Erasure Request Fulfilled' ), + $email_data['sitename'] + ); + + /** + * Filters the subject of the email sent when an erasure request is completed. + * + * @since 4.9.8 + * + * @param string $subject The email subject. + * @param string $sitename The name of the site. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type string $message_recipient The address that the email will be sent to. Defaults + * to the value of `$request->email`, but can be changed + * by the `user_erasure_fulfillment_email_to` filter. + * @type string $privacy_policy_url Privacy policy URL. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * } + */ + $subject = apply_filters( 'user_erasure_complete_email_subject', $subject, $email_data['sitename'], $email_data ); + + if ( empty( $email_data['privacy_policy_url'] ) ) { + /* translators: Do not translate SITENAME, SITEURL; those are placeholders. */ + $email_text = __( + 'Howdy, + +Your request to erase your personal data on ###SITENAME### has been completed. + +If you have any follow-up questions or concerns, please contact the site administrator. + +Regards, +All at ###SITENAME### +###SITEURL###' + ); + } else { + /* translators: Do not translate SITENAME, SITEURL, PRIVACY_POLICY_URL; those are placeholders. */ + $email_text = __( + 'Howdy, + +Your request to erase your personal data on ###SITENAME### has been completed. + +If you have any follow-up questions or concerns, please contact the site administrator. + +For more information, you can also read our privacy policy: ###PRIVACY_POLICY_URL### + +Regards, +All at ###SITENAME### +###SITEURL###' + ); + } + + /** + * Filters the body of the data erasure fulfillment notification. + * + * The email is sent to a user when a their data erasure request is fulfilled + * by an administrator. + * + * The following strings have a special meaning and will get replaced dynamically: + * + * ###SITENAME### The name of the site. + * ###PRIVACY_POLICY_URL### Privacy policy page URL. + * ###SITEURL### The URL to the site. + * + * @since 4.9.6 + * + * @param string $email_text Text in the email. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type string $message_recipient The address that the email will be sent to. Defaults + * to the value of `$request->email`, but can be changed + * by the `user_erasure_fulfillment_email_to` filter. + * @type string $privacy_policy_url Privacy policy URL. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * } + */ + $content = apply_filters( 'user_confirmed_action_email_content', $email_text, $email_data ); + + $content = str_replace( '###SITENAME###', $email_data['sitename'], $content ); + $content = str_replace( '###PRIVACY_POLICY_URL###', $email_data['privacy_policy_url'], $content ); + $content = str_replace( '###SITEURL###', esc_url_raw( $email_data['siteurl'] ), $content ); + + $headers = ''; + + /** + * Filters the headers of the data erasure fulfillment notification. + * + * @since 5.4.0 + * + * @param string|array $headers The email headers. + * @param string $subject The email subject. + * @param string $content The email content. + * @param int $request_id The request ID. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type string $message_recipient The address that the email will be sent to. Defaults + * to the value of `$request->email`, but can be changed + * by the `user_erasure_fulfillment_email_to` filter. + * @type string $privacy_policy_url Privacy policy URL. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * } + */ + $headers = apply_filters( 'user_erasure_complete_email_headers', $headers, $subject, $content, $request_id, $email_data ); + + $email_sent = wp_mail( $user_email, $subject, $content, $headers ); + + if ( $switched_locale ) { + restore_previous_locale(); + } + + if ( $email_sent ) { + update_post_meta( $request_id, '_wp_user_notified', true ); + } +} + +/** + * Return request confirmation message HTML. + * + * @since 4.9.6 + * @access private + * + * @param int $request_id The request ID being confirmed. + * @return string $message The confirmation message. + */ +function _wp_privacy_account_request_confirmed_message( $request_id ) { + $request = wp_get_user_request( $request_id ); + + $message = '

                ' . __( 'Action has been confirmed.' ) . '

                '; + $message .= '

                ' . __( 'The site administrator has been notified and will fulfill your request as soon as possible.' ) . '

                '; + + if ( $request && in_array( $request->action_name, _wp_privacy_action_request_types(), true ) ) { + if ( 'export_personal_data' === $request->action_name ) { + $message = '

                ' . __( 'Thanks for confirming your export request.' ) . '

                '; + $message .= '

                ' . __( 'The site administrator has been notified. You will receive a link to download your export via email when they fulfill your request.' ) . '

                '; + } elseif ( 'remove_personal_data' === $request->action_name ) { + $message = '

                ' . __( 'Thanks for confirming your erasure request.' ) . '

                '; + $message .= '

                ' . __( 'The site administrator has been notified. You will receive an email confirmation when they erase your data.' ) . '

                '; + } + } + + /** + * Filters the message displayed to a user when they confirm a data request. + * + * @since 4.9.6 + * + * @param string $message The message to the user. + * @param int $request_id The ID of the request being confirmed. + */ + $message = apply_filters( 'user_request_action_confirmed_message', $message, $request_id ); + + return $message; +} + +/** + * Create and log a user request to perform a specific action. + * + * Requests are stored inside a post type named `user_request` since they can apply to both + * users on the site, or guests without a user account. + * + * @since 4.9.6 + * + * @param string $email_address User email address. This can be the address of a registered or non-registered user. + * @param string $action_name Name of the action that is being confirmed. Required. + * @param array $request_data Misc data you want to send with the verification request and pass to the actions once the request is confirmed. + * @return int|WP_Error Returns the request ID if successful, or a WP_Error object on failure. + */ +function wp_create_user_request( $email_address = '', $action_name = '', $request_data = array() ) { + $email_address = sanitize_email( $email_address ); + $action_name = sanitize_key( $action_name ); + + if ( ! is_email( $email_address ) ) { + return new WP_Error( 'invalid_email', __( 'Invalid email address.' ) ); + } + + if ( ! $action_name ) { + return new WP_Error( 'invalid_action', __( 'Invalid action name.' ) ); + } + + $user = get_user_by( 'email', $email_address ); + $user_id = $user && ! is_wp_error( $user ) ? $user->ID : 0; + + // Check for duplicates. + $requests_query = new WP_Query( + array( + 'post_type' => 'user_request', + 'post_name__in' => array( $action_name ), // Action name stored in post_name column. + 'title' => $email_address, // Email address stored in post_title column. + 'post_status' => array( + 'request-pending', + 'request-confirmed', + ), + 'fields' => 'ids', + ) + ); + + if ( $requests_query->found_posts ) { + return new WP_Error( 'duplicate_request', __( 'An incomplete request for this email address already exists.' ) ); + } + + $request_id = wp_insert_post( + array( + 'post_author' => $user_id, + 'post_name' => $action_name, + 'post_title' => $email_address, + 'post_content' => wp_json_encode( $request_data ), + 'post_status' => 'request-pending', + 'post_type' => 'user_request', + 'post_date' => current_time( 'mysql', false ), + 'post_date_gmt' => current_time( 'mysql', true ), + ), + true + ); + + return $request_id; +} + +/** + * Get action description from the name and return a string. + * + * @since 4.9.6 + * + * @param string $action_name Action name of the request. + * @return string Human readable action name. + */ +function wp_user_request_action_description( $action_name ) { + switch ( $action_name ) { + case 'export_personal_data': + $description = __( 'Export Personal Data' ); + break; + case 'remove_personal_data': + $description = __( 'Erase Personal Data' ); + break; + default: + /* translators: %s: Action name. */ + $description = sprintf( __( 'Confirm the "%s" action' ), $action_name ); + break; + } + + /** + * Filters the user action description. + * + * @since 4.9.6 + * + * @param string $description The default description. + * @param string $action_name The name of the request. + */ + return apply_filters( 'user_request_action_description', $description, $action_name ); +} + +/** + * Send a confirmation request email to confirm an action. + * + * If the request is not already pending, it will be updated. + * + * @since 4.9.6 + * + * @param string $request_id ID of the request created via wp_create_user_request(). + * @return bool|WP_Error True on success, `WP_Error` on failure. + */ +function wp_send_user_request( $request_id ) { + $request_id = absint( $request_id ); + $request = wp_get_user_request( $request_id ); + + if ( ! $request ) { + return new WP_Error( 'invalid_request', __( 'Invalid user request.' ) ); + } + + // Localize message content for user; fallback to site default for visitors. + if ( ! empty( $request->user_id ) ) { + $locale = get_user_locale( $request->user_id ); + } else { + $locale = get_locale(); + } + + $switched_locale = switch_to_locale( $locale ); + + $email_data = array( + 'request' => $request, + 'email' => $request->email, + 'description' => wp_user_request_action_description( $request->action_name ), + 'confirm_url' => add_query_arg( + array( + 'action' => 'confirmaction', + 'request_id' => $request_id, + 'confirm_key' => wp_generate_user_request_key( $request_id ), + ), + wp_login_url() + ), + 'sitename' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), + 'siteurl' => home_url(), + ); + + /* translators: Do not translate DESCRIPTION, CONFIRM_URL, SITENAME, SITEURL: those are placeholders. */ + $email_text = __( + 'Howdy, + +A request has been made to perform the following action on your account: + + ###DESCRIPTION### + +To confirm this, please click on the following link: +###CONFIRM_URL### + +You can safely ignore and delete this email if you do not want to +take this action. + +Regards, +All at ###SITENAME### +###SITEURL###' + ); + + /** + * Filters the text of the email sent when an account action is attempted. + * + * The following strings have a special meaning and will get replaced dynamically: + * + * ###DESCRIPTION### Description of the action being performed so the user knows what the email is for. + * ###CONFIRM_URL### The link to click on to confirm the account action. + * ###SITENAME### The name of the site. + * ###SITEURL### The URL to the site. + * + * @since 4.9.6 + * + * @param string $email_text Text in the email. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type string $email The email address this is being sent to. + * @type string $description Description of the action being performed so the user knows what the email is for. + * @type string $confirm_url The link to click on to confirm the account action. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * } + */ + $content = apply_filters( 'user_request_action_email_content', $email_text, $email_data ); + + $content = str_replace( '###DESCRIPTION###', $email_data['description'], $content ); + $content = str_replace( '###CONFIRM_URL###', esc_url_raw( $email_data['confirm_url'] ), $content ); + $content = str_replace( '###EMAIL###', $email_data['email'], $content ); + $content = str_replace( '###SITENAME###', $email_data['sitename'], $content ); + $content = str_replace( '###SITEURL###', esc_url_raw( $email_data['siteurl'] ), $content ); + + /* translators: Confirm privacy data request notification email subject. 1: Site title, 2: Name of the action. */ + $subject = sprintf( __( '[%1$s] Confirm Action: %2$s' ), $email_data['sitename'], $email_data['description'] ); + + /** + * Filters the subject of the email sent when an account action is attempted. + * + * @since 4.9.6 + * + * @param string $subject The email subject. + * @param string $sitename The name of the site. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type string $email The email address this is being sent to. + * @type string $description Description of the action being performed so the user knows what the email is for. + * @type string $confirm_url The link to click on to confirm the account action. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * } + */ + $subject = apply_filters( 'user_request_action_email_subject', $subject, $email_data['sitename'], $email_data ); + + $headers = ''; + + /** + * Filters the headers of the email sent when an account action is attempted. + * + * @since 5.4.0 + * + * @param string|array $headers The email headers. + * @param string $subject The email subject. + * @param string $content The email content. + * @param int $request_id The request ID. + * @param array $email_data { + * Data relating to the account action email. + * + * @type WP_User_Request $request User request object. + * @type string $email The email address this is being sent to. + * @type string $description Description of the action being performed so the user knows what the email is for. + * @type string $confirm_url The link to click on to confirm the account action. + * @type string $sitename The site name sending the mail. + * @type string $siteurl The site URL sending the mail. + * } + */ + $headers = apply_filters( 'user_request_action_email_headers', $headers, $subject, $content, $request_id, $email_data ); + + $email_sent = wp_mail( $email_data['email'], $subject, $content, $headers ); + + if ( $switched_locale ) { + restore_previous_locale(); + } + + if ( ! $email_sent ) { + return new WP_Error( 'privacy_email_error', __( 'Unable to send personal data export confirmation email.' ) ); + } + + return true; +} + +/** + * Returns a confirmation key for a user action and stores the hashed version for future comparison. + * + * @since 4.9.6 + * + * @param int $request_id Request ID. + * @return string Confirmation key. + */ +function wp_generate_user_request_key( $request_id ) { + global $wp_hasher; + + // Generate something random for a confirmation key. + $key = wp_generate_password( 20, false ); + + // Return the key, hashed. + if ( empty( $wp_hasher ) ) { + require_once ABSPATH . WPINC . '/class-phpass.php'; + $wp_hasher = new PasswordHash( 8, true ); + } + + wp_update_post( + array( + 'ID' => $request_id, + 'post_status' => 'request-pending', + 'post_password' => $wp_hasher->HashPassword( $key ), + ) + ); + + return $key; +} + +/** + * Validate a user request by comparing the key with the request's key. + * + * @since 4.9.6 + * + * @param string $request_id ID of the request being confirmed. + * @param string $key Provided key to validate. + * @return bool|WP_Error True on success, WP_Error on failure. + */ +function wp_validate_user_request_key( $request_id, $key ) { + global $wp_hasher; + + $request_id = absint( $request_id ); + $request = wp_get_user_request( $request_id ); + + if ( ! $request ) { + return new WP_Error( 'invalid_request', __( 'Invalid request.' ) ); + } + + if ( ! in_array( $request->status, array( 'request-pending', 'request-failed' ), true ) ) { + return new WP_Error( 'expired_link', __( 'This link has expired.' ) ); + } + + if ( empty( $key ) ) { + return new WP_Error( 'missing_key', __( 'Missing confirm key.' ) ); + } + + if ( empty( $wp_hasher ) ) { + require_once ABSPATH . WPINC . '/class-phpass.php'; + $wp_hasher = new PasswordHash( 8, true ); + } + + $key_request_time = $request->modified_timestamp; + $saved_key = $request->confirm_key; + + if ( ! $saved_key ) { + return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); + } + + if ( ! $key_request_time ) { + return new WP_Error( 'invalid_key', __( 'Invalid action.' ) ); + } + + /** + * Filters the expiration time of confirm keys. + * + * @since 4.9.6 + * + * @param int $expiration The expiration time in seconds. + */ + $expiration_duration = (int) apply_filters( 'user_request_key_expiration', DAY_IN_SECONDS ); + $expiration_time = $key_request_time + $expiration_duration; + + if ( ! $wp_hasher->CheckPassword( $key, $saved_key ) ) { + return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); + } + + if ( ! $expiration_time || time() > $expiration_time ) { + return new WP_Error( 'expired_key', __( 'The confirmation email has expired.' ) ); + } + + return true; +} + +/** + * Return the user request object for the specified request ID. + * + * @since 4.9.6 + * + * @param int $request_id The ID of the user request. + * @return WP_User_Request|false + */ +function wp_get_user_request( $request_id ) { + $request_id = absint( $request_id ); + $post = get_post( $request_id ); + + if ( ! $post || 'user_request' !== $post->post_type ) { + return false; + } + + return new WP_User_Request( $post ); +} diff --git a/wp-includes/vars.php b/wp-includes/vars.php new file mode 100644 index 0000000..72259b2 --- /dev/null +++ b/wp-includes/vars.php @@ -0,0 +1,169 @@ += 7; + +/** + * Test if the current browser runs on a mobile device (smart phone, tablet, etc.) + * + * @since 3.4.0 + * + * @return bool + */ +function wp_is_mobile() { + if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) { + $is_mobile = false; + } elseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'Mobile' ) !== false // Many mobile devices (all iPhone, iPad, etc.) + || strpos( $_SERVER['HTTP_USER_AGENT'], 'Android' ) !== false + || strpos( $_SERVER['HTTP_USER_AGENT'], 'Silk/' ) !== false + || strpos( $_SERVER['HTTP_USER_AGENT'], 'Kindle' ) !== false + || strpos( $_SERVER['HTTP_USER_AGENT'], 'BlackBerry' ) !== false + || strpos( $_SERVER['HTTP_USER_AGENT'], 'Opera Mini' ) !== false + || strpos( $_SERVER['HTTP_USER_AGENT'], 'Opera Mobi' ) !== false ) { + $is_mobile = true; + } else { + $is_mobile = false; + } + + /** + * Filters whether the request should be treated as coming from a mobile device or not. + * + * @since 4.9.0 + * + * @param bool $is_mobile Whether the request is from a mobile device or not. + */ + return apply_filters( 'wp_is_mobile', $is_mobile ); +} diff --git a/wp-includes/version.php b/wp-includes/version.php new file mode 100644 index 0000000..5bfea39 --- /dev/null +++ b/wp-includes/version.php @@ -0,0 +1,46 @@ +register( $widget ); +} + +/** + * Unregisters a widget. + * + * Unregisters a WP_Widget widget. Useful for un-registering default widgets. + * Run within a function hooked to the {@see 'widgets_init'} action. + * + * @since 2.8.0 + * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object + * instead of simply a `WP_Widget` subclass name. + * + * @see WP_Widget + * + * @global WP_Widget_Factory $wp_widget_factory + * + * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass. + */ +function unregister_widget( $widget ) { + global $wp_widget_factory; + + $wp_widget_factory->unregister( $widget ); +} + +/** + * Creates multiple sidebars. + * + * If you wanted to quickly create multiple sidebars for a theme or internally. + * This function will allow you to do so. If you don't pass the 'name' and/or + * 'id' in `$args`, then they will be built for you. + * + * @since 2.2.0 + * + * @see register_sidebar() The second parameter is documented by register_sidebar() and is the same here. + * + * @global array $wp_registered_sidebars The new sidebars are stored in this array by sidebar ID. + * + * @param int $number Optional. Number of sidebars to create. Default 1. + * @param array|string $args { + * Optional. Array or string of arguments for building a sidebar. + * + * @type string $id The base string of the unique identifier for each sidebar. If provided, and multiple + * sidebars are being defined, the id will have "-2" appended, and so on. + * Default 'sidebar-' followed by the number the sidebar creation is currently at. + * @type string $name The name or title for the sidebars displayed in the admin dashboard. If registering + * more than one sidebar, include '%d' in the string as a placeholder for the uniquely + * assigned number for each sidebar. + * Default 'Sidebar' for the first sidebar, otherwise 'Sidebar %d'. + * } + */ +function register_sidebars( $number = 1, $args = array() ) { + global $wp_registered_sidebars; + $number = (int) $number; + + if ( is_string( $args ) ) { + parse_str( $args, $args ); + } + + for ( $i = 1; $i <= $number; $i++ ) { + $_args = $args; + + if ( $number > 1 ) { + if ( isset( $args['name'] ) ) { + $_args['name'] = sprintf( $args['name'], $i ); + } else { + /* translators: %d: Sidebar number. */ + $_args['name'] = sprintf( __( 'Sidebar %d' ), $i ); + } + } else { + $_args['name'] = isset( $args['name'] ) ? $args['name'] : __( 'Sidebar' ); + } + + // Custom specified ID's are suffixed if they exist already. + // Automatically generated sidebar names need to be suffixed regardless starting at -0. + if ( isset( $args['id'] ) ) { + $_args['id'] = $args['id']; + $n = 2; // Start at -2 for conflicting custom IDs. + while ( is_registered_sidebar( $_args['id'] ) ) { + $_args['id'] = $args['id'] . '-' . $n++; + } + } else { + $n = count( $wp_registered_sidebars ); + do { + $_args['id'] = 'sidebar-' . ++$n; + } while ( is_registered_sidebar( $_args['id'] ) ); + } + register_sidebar( $_args ); + } +} + +/** + * Builds the definition for a single sidebar and returns the ID. + * + * Accepts either a string or an array and then parses that against a set + * of default arguments for the new sidebar. WordPress will automatically + * generate a sidebar ID and name based on the current number of registered + * sidebars if those arguments are not included. + * + * When allowing for automatic generation of the name and ID parameters, keep + * in mind that the incrementor for your sidebar can change over time depending + * on what other plugins and themes are installed. + * + * If theme support for 'widgets' has not yet been added when this function is + * called, it will be automatically enabled through the use of add_theme_support() + * + * @since 2.2.0 + * + * @global array $wp_registered_sidebars Stores the new sidebar in this array by sidebar ID. + * + * @param array|string $args { + * Optional. Array or string of arguments for the sidebar being registered. + * + * @type string $name The name or title of the sidebar displayed in the Widgets + * interface. Default 'Sidebar $instance'. + * @type string $id The unique identifier by which the sidebar will be called. + * Default 'sidebar-$instance'. + * @type string $description Description of the sidebar, displayed in the Widgets interface. + * Default empty string. + * @type string $class Extra CSS class to assign to the sidebar in the Widgets interface. + * Default empty. + * @type string $before_widget HTML content to prepend to each widget's HTML output when + * assigned to this sidebar. Default is an opening list item element. + * @type string $after_widget HTML content to append to each widget's HTML output when + * assigned to this sidebar. Default is a closing list item element. + * @type string $before_title HTML content to prepend to the sidebar title when displayed. + * Default is an opening h2 element. + * @type string $after_title HTML content to append to the sidebar title when displayed. + * Default is a closing h2 element. + * } + * @return string Sidebar ID added to $wp_registered_sidebars global. + */ +function register_sidebar( $args = array() ) { + global $wp_registered_sidebars; + + $i = count( $wp_registered_sidebars ) + 1; + + $id_is_empty = empty( $args['id'] ); + + $defaults = array( + /* translators: %d: Sidebar number. */ + 'name' => sprintf( __( 'Sidebar %d' ), $i ), + 'id' => "sidebar-$i", + 'description' => '', + 'class' => '', + 'before_widget' => '
              • ', + 'after_widget' => "
              • \n", + 'before_title' => '

                ', + 'after_title' => "

                \n", + ); + + /** + * Filters the sidebar default arguments. + * + * @since 5.3.0 + * + * @see register_sidebar() + * + * @param array $defaults The default sidebar arguments. + */ + $sidebar = wp_parse_args( $args, apply_filters( 'register_sidebar_defaults', $defaults ) ); + + if ( $id_is_empty ) { + _doing_it_wrong( + __FUNCTION__, + sprintf( + /* translators: 1: The 'id' argument, 2: Sidebar name, 3: Recommended 'id' value. */ + __( 'No %1$s was set in the arguments array for the "%2$s" sidebar. Defaulting to "%3$s". Manually set the %1$s to "%3$s" to silence this notice and keep existing sidebar content.' ), + 'id', + $sidebar['name'], + $sidebar['id'] + ), + '4.2.0' + ); + } + + $wp_registered_sidebars[ $sidebar['id'] ] = $sidebar; + + add_theme_support( 'widgets' ); + + /** + * Fires once a sidebar has been registered. + * + * @since 3.0.0 + * + * @param array $sidebar Parsed arguments for the registered sidebar. + */ + do_action( 'register_sidebar', $sidebar ); + + return $sidebar['id']; +} + +/** + * Removes a sidebar from the list. + * + * @since 2.2.0 + * + * @global array $wp_registered_sidebars Removes the sidebar from this array by sidebar ID. + * + * @param string|int $sidebar_id The ID of the sidebar when it was registered. + */ +function unregister_sidebar( $sidebar_id ) { + global $wp_registered_sidebars; + + unset( $wp_registered_sidebars[ $sidebar_id ] ); +} + +/** + * Checks if a sidebar is registered. + * + * @since 4.4.0 + * + * @global array $wp_registered_sidebars Registered sidebars. + * + * @param string|int $sidebar_id The ID of the sidebar when it was registered. + * @return bool True if the sidebar is registered, false otherwise. + */ +function is_registered_sidebar( $sidebar_id ) { + global $wp_registered_sidebars; + + return isset( $wp_registered_sidebars[ $sidebar_id ] ); +} + +/** + * Register an instance of a widget. + * + * The default widget option is 'classname' that can be overridden. + * + * The function can also be used to un-register widgets when `$output_callback` + * parameter is an empty string. + * + * @since 2.2.0 + * @since 5.3.0 Formalized the existing and already documented `...$params` parameter + * by adding it to the function signature. + * + * @global array $wp_registered_widgets Uses stored registered widgets. + * @global array $wp_registered_widget_controls Stores the registered widget controls (options). + * @global array $wp_registered_widget_updates + * @global array $_wp_deprecated_widgets_callbacks + * + * @param int|string $id Widget ID. + * @param string $name Widget display title. + * @param callable $output_callback Run when widget is called. + * @param array $options { + * Optional. An array of supplementary widget options for the instance. + * + * @type string $classname Class name for the widget's HTML container. Default is a shortened + * version of the output callback name. + * @type string $description Widget description for display in the widget administration + * panel and/or theme. + * } + * @param mixed ...$params Optional additional parameters to pass to the callback function when it's called. + */ +function wp_register_sidebar_widget( $id, $name, $output_callback, $options = array(), ...$params ) { + global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates, $_wp_deprecated_widgets_callbacks; + + $id = strtolower( $id ); + + if ( empty( $output_callback ) ) { + unset( $wp_registered_widgets[ $id ] ); + return; + } + + $id_base = _get_widget_id_base( $id ); + if ( in_array( $output_callback, $_wp_deprecated_widgets_callbacks, true ) && ! is_callable( $output_callback ) ) { + unset( $wp_registered_widget_controls[ $id ] ); + unset( $wp_registered_widget_updates[ $id_base ] ); + return; + } + + $defaults = array( 'classname' => $output_callback ); + $options = wp_parse_args( $options, $defaults ); + $widget = array( + 'name' => $name, + 'id' => $id, + 'callback' => $output_callback, + 'params' => $params, + ); + $widget = array_merge( $widget, $options ); + + if ( is_callable( $output_callback ) && ( ! isset( $wp_registered_widgets[ $id ] ) || did_action( 'widgets_init' ) ) ) { + + /** + * Fires once for each registered widget. + * + * @since 3.0.0 + * + * @param array $widget An array of default widget arguments. + */ + do_action( 'wp_register_sidebar_widget', $widget ); + $wp_registered_widgets[ $id ] = $widget; + } +} + +/** + * Retrieve description for widget. + * + * When registering widgets, the options can also include 'description' that + * describes the widget for display on the widget administration panel or + * in the theme. + * + * @since 2.5.0 + * + * @global array $wp_registered_widgets + * + * @param int|string $id Widget ID. + * @return string|void Widget description, if available. + */ +function wp_widget_description( $id ) { + if ( ! is_scalar( $id ) ) { + return; + } + + global $wp_registered_widgets; + + if ( isset( $wp_registered_widgets[ $id ]['description'] ) ) { + return esc_html( $wp_registered_widgets[ $id ]['description'] ); + } +} + +/** + * Retrieve description for a sidebar. + * + * When registering sidebars a 'description' parameter can be included that + * describes the sidebar for display on the widget administration panel. + * + * @since 2.9.0 + * + * @global array $wp_registered_sidebars Registered sidebars. + * + * @param string $id sidebar ID. + * @return string|void Sidebar description, if available. + */ +function wp_sidebar_description( $id ) { + if ( ! is_scalar( $id ) ) { + return; + } + + global $wp_registered_sidebars; + + if ( isset( $wp_registered_sidebars[ $id ]['description'] ) ) { + return wp_kses( $wp_registered_sidebars[ $id ]['description'], 'sidebar_description' ); + } +} + +/** + * Remove widget from sidebar. + * + * @since 2.2.0 + * + * @param int|string $id Widget ID. + */ +function wp_unregister_sidebar_widget( $id ) { + + /** + * Fires just before a widget is removed from a sidebar. + * + * @since 3.0.0 + * + * @param int $id The widget ID. + */ + do_action( 'wp_unregister_sidebar_widget', $id ); + + wp_register_sidebar_widget( $id, '', '' ); + wp_unregister_widget_control( $id ); +} + +/** + * Registers widget control callback for customizing options. + * + * @since 2.2.0 + * @since 5.3.0 Formalized the existing and already documented `...$params` parameter + * by adding it to the function signature. + * + * @global array $wp_registered_widget_controls + * @global array $wp_registered_widget_updates + * @global array $wp_registered_widgets + * @global array $_wp_deprecated_widgets_callbacks + * + * @param int|string $id Sidebar ID. + * @param string $name Sidebar display name. + * @param callable $control_callback Run when sidebar is displayed. + * @param array $options { + * Optional. Array or string of control options. Default empty array. + * + * @type int $height Never used. Default 200. + * @type int $width Width of the fully expanded control form (but try hard to use the default width). + * Default 250. + * @type int|string $id_base Required for multi-widgets, i.e widgets that allow multiple instances such as the + * text widget. The widget id will end up looking like `{$id_base}-{$unique_number}`. + * } + * @param mixed ...$params Optional additional parameters to pass to the callback function when it's called. + */ +function wp_register_widget_control( $id, $name, $control_callback, $options = array(), ...$params ) { + global $wp_registered_widget_controls, $wp_registered_widget_updates, $wp_registered_widgets, $_wp_deprecated_widgets_callbacks; + + $id = strtolower( $id ); + $id_base = _get_widget_id_base( $id ); + + if ( empty( $control_callback ) ) { + unset( $wp_registered_widget_controls[ $id ] ); + unset( $wp_registered_widget_updates[ $id_base ] ); + return; + } + + if ( in_array( $control_callback, $_wp_deprecated_widgets_callbacks, true ) && ! is_callable( $control_callback ) ) { + unset( $wp_registered_widgets[ $id ] ); + return; + } + + if ( isset( $wp_registered_widget_controls[ $id ] ) && ! did_action( 'widgets_init' ) ) { + return; + } + + $defaults = array( + 'width' => 250, + 'height' => 200, + ); // Height is never used. + $options = wp_parse_args( $options, $defaults ); + $options['width'] = (int) $options['width']; + $options['height'] = (int) $options['height']; + + $widget = array( + 'name' => $name, + 'id' => $id, + 'callback' => $control_callback, + 'params' => $params, + ); + $widget = array_merge( $widget, $options ); + + $wp_registered_widget_controls[ $id ] = $widget; + + if ( isset( $wp_registered_widget_updates[ $id_base ] ) ) { + return; + } + + if ( isset( $widget['params'][0]['number'] ) ) { + $widget['params'][0]['number'] = -1; + } + + unset( $widget['width'], $widget['height'], $widget['name'], $widget['id'] ); + $wp_registered_widget_updates[ $id_base ] = $widget; +} + +/** + * Registers the update callback for a widget. + * + * @since 2.8.0 + * @since 5.3.0 Formalized the existing and already documented `...$params` parameter + * by adding it to the function signature. + * + * @global array $wp_registered_widget_updates + * + * @param string $id_base The base ID of a widget created by extending WP_Widget. + * @param callable $update_callback Update callback method for the widget. + * @param array $options Optional. Widget control options. See wp_register_widget_control(). + * Default empty array. + * @param mixed ...$params Optional additional parameters to pass to the callback function when it's called. + */ +function _register_widget_update_callback( $id_base, $update_callback, $options = array(), ...$params ) { + global $wp_registered_widget_updates; + + if ( isset( $wp_registered_widget_updates[ $id_base ] ) ) { + if ( empty( $update_callback ) ) { + unset( $wp_registered_widget_updates[ $id_base ] ); + } + return; + } + + $widget = array( + 'callback' => $update_callback, + 'params' => $params, + ); + + $widget = array_merge( $widget, $options ); + $wp_registered_widget_updates[ $id_base ] = $widget; +} + +/** + * Registers the form callback for a widget. + * + * @since 2.8.0 + * @since 5.3.0 Formalized the existing and already documented `...$params` parameter + * by adding it to the function signature. + * + * @global array $wp_registered_widget_controls + * + * @param int|string $id Widget ID. + * @param string $name Name attribute for the widget. + * @param callable $form_callback Form callback. + * @param array $options Optional. Widget control options. See wp_register_widget_control(). + * Default empty array. + * @param mixed ...$params Optional additional parameters to pass to the callback function when it's called. + */ + +function _register_widget_form_callback( $id, $name, $form_callback, $options = array(), ...$params ) { + global $wp_registered_widget_controls; + + $id = strtolower( $id ); + + if ( empty( $form_callback ) ) { + unset( $wp_registered_widget_controls[ $id ] ); + return; + } + + if ( isset( $wp_registered_widget_controls[ $id ] ) && ! did_action( 'widgets_init' ) ) { + return; + } + + $defaults = array( + 'width' => 250, + 'height' => 200, + ); + $options = wp_parse_args( $options, $defaults ); + $options['width'] = (int) $options['width']; + $options['height'] = (int) $options['height']; + + $widget = array( + 'name' => $name, + 'id' => $id, + 'callback' => $form_callback, + 'params' => $params, + ); + $widget = array_merge( $widget, $options ); + + $wp_registered_widget_controls[ $id ] = $widget; +} + +/** + * Remove control callback for widget. + * + * @since 2.2.0 + * + * @param int|string $id Widget ID. + */ +function wp_unregister_widget_control( $id ) { + wp_register_widget_control( $id, '', '' ); +} + +/** + * Display dynamic sidebar. + * + * By default this displays the default sidebar or 'sidebar-1'. If your theme specifies the 'id' or + * 'name' parameter for its registered sidebars you can pass an id or name as the $index parameter. + * Otherwise, you can pass in a numerical index to display the sidebar at that index. + * + * @since 2.2.0 + * + * @global array $wp_registered_sidebars Registered sidebars. + * @global array $wp_registered_widgets + * + * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar. + * @return bool True, if widget sidebar was found and called. False if not found or not called. + */ +function dynamic_sidebar( $index = 1 ) { + global $wp_registered_sidebars, $wp_registered_widgets; + + if ( is_int( $index ) ) { + $index = "sidebar-$index"; + } else { + $index = sanitize_title( $index ); + foreach ( (array) $wp_registered_sidebars as $key => $value ) { + if ( sanitize_title( $value['name'] ) === $index ) { + $index = $key; + break; + } + } + } + + $sidebars_widgets = wp_get_sidebars_widgets(); + if ( empty( $wp_registered_sidebars[ $index ] ) || empty( $sidebars_widgets[ $index ] ) || ! is_array( $sidebars_widgets[ $index ] ) ) { + /** This action is documented in wp-includes/widget.php */ + do_action( 'dynamic_sidebar_before', $index, false ); + /** This action is documented in wp-includes/widget.php */ + do_action( 'dynamic_sidebar_after', $index, false ); + /** This filter is documented in wp-includes/widget.php */ + return apply_filters( 'dynamic_sidebar_has_widgets', false, $index ); + } + + /** + * Fires before widgets are rendered in a dynamic sidebar. + * + * Note: The action also fires for empty sidebars, and on both the front end + * and back end, including the Inactive Widgets sidebar on the Widgets screen. + * + * @since 3.9.0 + * + * @param int|string $index Index, name, or ID of the dynamic sidebar. + * @param bool $has_widgets Whether the sidebar is populated with widgets. + * Default true. + */ + do_action( 'dynamic_sidebar_before', $index, true ); + $sidebar = $wp_registered_sidebars[ $index ]; + + $did_one = false; + foreach ( (array) $sidebars_widgets[ $index ] as $id ) { + + if ( ! isset( $wp_registered_widgets[ $id ] ) ) { + continue; + } + + $params = array_merge( + array( + array_merge( + $sidebar, + array( + 'widget_id' => $id, + 'widget_name' => $wp_registered_widgets[ $id ]['name'], + ) + ), + ), + (array) $wp_registered_widgets[ $id ]['params'] + ); + + // Substitute HTML `id` and `class` attributes into `before_widget`. + $classname_ = ''; + foreach ( (array) $wp_registered_widgets[ $id ]['classname'] as $cn ) { + if ( is_string( $cn ) ) { + $classname_ .= '_' . $cn; + } elseif ( is_object( $cn ) ) { + $classname_ .= '_' . get_class( $cn ); + } + } + $classname_ = ltrim( $classname_, '_' ); + $params[0]['before_widget'] = sprintf( $params[0]['before_widget'], $id, $classname_ ); + + /** + * Filters the parameters passed to a widget's display callback. + * + * Note: The filter is evaluated on both the front end and back end, + * including for the Inactive Widgets sidebar on the Widgets screen. + * + * @since 2.5.0 + * + * @see register_sidebar() + * + * @param array $params { + * @type array $args { + * An array of widget display arguments. + * + * @type string $name Name of the sidebar the widget is assigned to. + * @type string $id ID of the sidebar the widget is assigned to. + * @type string $description The sidebar description. + * @type string $class CSS class applied to the sidebar container. + * @type string $before_widget HTML markup to prepend to each widget in the sidebar. + * @type string $after_widget HTML markup to append to each widget in the sidebar. + * @type string $before_title HTML markup to prepend to the widget title when displayed. + * @type string $after_title HTML markup to append to the widget title when displayed. + * @type string $widget_id ID of the widget. + * @type string $widget_name Name of the widget. + * } + * @type array $widget_args { + * An array of multi-widget arguments. + * + * @type int $number Number increment used for multiples of the same widget. + * } + * } + */ + $params = apply_filters( 'dynamic_sidebar_params', $params ); + + $callback = $wp_registered_widgets[ $id ]['callback']; + + /** + * Fires before a widget's display callback is called. + * + * Note: The action fires on both the front end and back end, including + * for widgets in the Inactive Widgets sidebar on the Widgets screen. + * + * The action is not fired for empty sidebars. + * + * @since 3.0.0 + * + * @param array $widget_id { + * An associative array of widget arguments. + * + * @type string $name Name of the widget. + * @type string $id Widget ID. + * @type array|callable $callback When the hook is fired on the front end, $callback is an array + * containing the widget object. Fired on the back end, $callback + * is 'wp_widget_control', see $_callback. + * @type array $params An associative array of multi-widget arguments. + * @type string $classname CSS class applied to the widget container. + * @type string $description The widget description. + * @type array $_callback When the hook is fired on the back end, $_callback is populated + * with an array containing the widget object, see $callback. + * } + */ + do_action( 'dynamic_sidebar', $wp_registered_widgets[ $id ] ); + + if ( is_callable( $callback ) ) { + call_user_func_array( $callback, $params ); + $did_one = true; + } + } + + /** + * Fires after widgets are rendered in a dynamic sidebar. + * + * Note: The action also fires for empty sidebars, and on both the front end + * and back end, including the Inactive Widgets sidebar on the Widgets screen. + * + * @since 3.9.0 + * + * @param int|string $index Index, name, or ID of the dynamic sidebar. + * @param bool $has_widgets Whether the sidebar is populated with widgets. + * Default true. + */ + do_action( 'dynamic_sidebar_after', $index, true ); + + /** + * Filters whether a sidebar has widgets. + * + * Note: The filter is also evaluated for empty sidebars, and on both the front end + * and back end, including the Inactive Widgets sidebar on the Widgets screen. + * + * @since 3.9.0 + * + * @param bool $did_one Whether at least one widget was rendered in the sidebar. + * Default false. + * @param int|string $index Index, name, or ID of the dynamic sidebar. + */ + return apply_filters( 'dynamic_sidebar_has_widgets', $did_one, $index ); +} + +/** + * Determines whether a given widget is displayed on the front end. + * + * Either $callback or $id_base can be used + * $id_base is the first argument when extending WP_Widget class + * Without the optional $widget_id parameter, returns the ID of the first sidebar + * in which the first instance of the widget with the given callback or $id_base is found. + * With the $widget_id parameter, returns the ID of the sidebar where + * the widget with that callback/$id_base AND that ID is found. + * + * NOTE: $widget_id and $id_base are the same for single widgets. To be effective + * this function has to run after widgets have initialized, at action {@see 'init'} or later. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 2.2.0 + * + * @global array $wp_registered_widgets + * + * @param string|false $callback Optional, Widget callback to check. Default false. + * @param int|false $widget_id Optional. Widget ID. Optional, but needed for checking. Default false. + * @param string|false $id_base Optional. The base ID of a widget created by extending WP_Widget. Default false. + * @param bool $skip_inactive Optional. Whether to check in 'wp_inactive_widgets'. Default true. + * @return string|false False if widget is not active or id of sidebar in which the widget is active. + */ +function is_active_widget( $callback = false, $widget_id = false, $id_base = false, $skip_inactive = true ) { + global $wp_registered_widgets; + + $sidebars_widgets = wp_get_sidebars_widgets(); + + if ( is_array( $sidebars_widgets ) ) { + foreach ( $sidebars_widgets as $sidebar => $widgets ) { + if ( $skip_inactive && ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) ) { + continue; + } + + if ( is_array( $widgets ) ) { + foreach ( $widgets as $widget ) { + if ( ( $callback && isset( $wp_registered_widgets[ $widget ]['callback'] ) && $wp_registered_widgets[ $widget ]['callback'] === $callback ) || ( $id_base && _get_widget_id_base( $widget ) === $id_base ) ) { + if ( ! $widget_id || $widget_id === $wp_registered_widgets[ $widget ]['id'] ) { + return $sidebar; + } + } + } + } + } + } + return false; +} + +/** + * Determines whether the dynamic sidebar is enabled and used by the theme. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 2.2.0 + * + * @global array $wp_registered_widgets + * @global array $wp_registered_sidebars Registered sidebars. + * + * @return bool True, if using widgets. False, if not using widgets. + */ +function is_dynamic_sidebar() { + global $wp_registered_widgets, $wp_registered_sidebars; + $sidebars_widgets = get_option( 'sidebars_widgets' ); + foreach ( (array) $wp_registered_sidebars as $index => $sidebar ) { + if ( ! empty( $sidebars_widgets[ $index ] ) ) { + foreach ( (array) $sidebars_widgets[ $index ] as $widget ) { + if ( array_key_exists( $widget, $wp_registered_widgets ) ) { + return true; + } + } + } + } + return false; +} + +/** + * Determines whether a sidebar is in use. + * + * For more information on this and similar theme functions, check out + * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ + * Conditional Tags} article in the Theme Developer Handbook. + * + * @since 2.8.0 + * + * @param string|int $index Sidebar name, id or number to check. + * @return bool true if the sidebar is in use, false otherwise. + */ +function is_active_sidebar( $index ) { + $index = ( is_int( $index ) ) ? "sidebar-$index" : sanitize_title( $index ); + $sidebars_widgets = wp_get_sidebars_widgets(); + $is_active_sidebar = ! empty( $sidebars_widgets[ $index ] ); + + /** + * Filters whether a dynamic sidebar is considered "active". + * + * @since 3.9.0 + * + * @param bool $is_active_sidebar Whether or not the sidebar should be considered "active". + * In other words, whether the sidebar contains any widgets. + * @param int|string $index Index, name, or ID of the dynamic sidebar. + */ + return apply_filters( 'is_active_sidebar', $is_active_sidebar, $index ); +} + +// +// Internal Functions. +// + +/** + * Retrieve full list of sidebars and their widget instance IDs. + * + * Will upgrade sidebar widget list, if needed. Will also save updated list, if + * needed. + * + * @since 2.2.0 + * @access private + * + * @global array $_wp_sidebars_widgets + * @global array $sidebars_widgets + * + * @param bool $deprecated Not used (argument deprecated). + * @return array Upgraded list of widgets to version 3 array format when called from the admin. + */ +function wp_get_sidebars_widgets( $deprecated = true ) { + if ( true !== $deprecated ) { + _deprecated_argument( __FUNCTION__, '2.8.1' ); + } + + global $_wp_sidebars_widgets, $sidebars_widgets; + + // If loading from front page, consult $_wp_sidebars_widgets rather than options + // to see if wp_convert_widget_settings() has made manipulations in memory. + if ( ! is_admin() ) { + if ( empty( $_wp_sidebars_widgets ) ) { + $_wp_sidebars_widgets = get_option( 'sidebars_widgets', array() ); + } + + $sidebars_widgets = $_wp_sidebars_widgets; + } else { + $sidebars_widgets = get_option( 'sidebars_widgets', array() ); + } + + if ( is_array( $sidebars_widgets ) && isset( $sidebars_widgets['array_version'] ) ) { + unset( $sidebars_widgets['array_version'] ); + } + + /** + * Filters the list of sidebars and their widgets. + * + * @since 2.7.0 + * + * @param array $sidebars_widgets An associative array of sidebars and their widgets. + */ + return apply_filters( 'sidebars_widgets', $sidebars_widgets ); +} + +/** + * Set the sidebar widget option to update sidebars. + * + * @since 2.2.0 + * @access private + * + * @global array $_wp_sidebars_widgets + * @param array $sidebars_widgets Sidebar widgets and their settings. + */ +function wp_set_sidebars_widgets( $sidebars_widgets ) { + global $_wp_sidebars_widgets; + + // Clear cached value used in wp_get_sidebars_widgets(). + $_wp_sidebars_widgets = null; + + if ( ! isset( $sidebars_widgets['array_version'] ) ) { + $sidebars_widgets['array_version'] = 3; + } + + update_option( 'sidebars_widgets', $sidebars_widgets ); +} + +/** + * Retrieve default registered sidebars list. + * + * @since 2.2.0 + * @access private + * + * @global array $wp_registered_sidebars Registered sidebars. + * + * @return array + */ +function wp_get_widget_defaults() { + global $wp_registered_sidebars; + + $defaults = array(); + + foreach ( (array) $wp_registered_sidebars as $index => $sidebar ) { + $defaults[ $index ] = array(); + } + + return $defaults; +} + +/** + * Convert the widget settings from single to multi-widget format. + * + * @since 2.8.0 + * + * @global array $_wp_sidebars_widgets + * + * @param string $base_name + * @param string $option_name + * @param array $settings + * @return array + */ +function wp_convert_widget_settings( $base_name, $option_name, $settings ) { + // This test may need expanding. + $single = false; + $changed = false; + if ( empty( $settings ) ) { + $single = true; + } else { + foreach ( array_keys( $settings ) as $number ) { + if ( 'number' === $number ) { + continue; + } + if ( ! is_numeric( $number ) ) { + $single = true; + break; + } + } + } + + if ( $single ) { + $settings = array( 2 => $settings ); + + // If loading from the front page, update sidebar in memory but don't save to options. + if ( is_admin() ) { + $sidebars_widgets = get_option( 'sidebars_widgets' ); + } else { + if ( empty( $GLOBALS['_wp_sidebars_widgets'] ) ) { + $GLOBALS['_wp_sidebars_widgets'] = get_option( 'sidebars_widgets', array() ); + } + $sidebars_widgets = &$GLOBALS['_wp_sidebars_widgets']; + } + + foreach ( (array) $sidebars_widgets as $index => $sidebar ) { + if ( is_array( $sidebar ) ) { + foreach ( $sidebar as $i => $name ) { + if ( $base_name === $name ) { + $sidebars_widgets[ $index ][ $i ] = "$name-2"; + $changed = true; + break 2; + } + } + } + } + + if ( is_admin() && $changed ) { + update_option( 'sidebars_widgets', $sidebars_widgets ); + } + } + + $settings['_multiwidget'] = 1; + if ( is_admin() ) { + update_option( $option_name, $settings ); + } + + return $settings; +} + +/** + * Output an arbitrary widget as a template tag. + * + * @since 2.8.0 + * + * @global WP_Widget_Factory $wp_widget_factory + * + * @param string $widget The widget's PHP class name (see class-wp-widget.php). + * @param array $instance Optional. The widget's instance settings. Default empty array. + * @param array $args { + * Optional. Array of arguments to configure the display of the widget. + * + * @type string $before_widget HTML content that will be prepended to the widget's HTML output. + * Default `
                `, where `%s` is the widget's class name. + * @type string $after_widget HTML content that will be appended to the widget's HTML output. + * Default `
                `. + * @type string $before_title HTML content that will be prepended to the widget's title when displayed. + * Default `

                `. + * @type string $after_title HTML content that will be appended to the widget's title when displayed. + * Default `

                `. + * } + */ +function the_widget( $widget, $instance = array(), $args = array() ) { + global $wp_widget_factory; + + if ( ! isset( $wp_widget_factory->widgets[ $widget ] ) ) { + _doing_it_wrong( + __FUNCTION__, + sprintf( + /* translators: %s: register_widget() */ + __( 'Widgets need to be registered using %s, before they can be displayed.' ), + 'register_widget()' + ), + '4.9.0' + ); + return; + } + + $widget_obj = $wp_widget_factory->widgets[ $widget ]; + if ( ! ( $widget_obj instanceof WP_Widget ) ) { + return; + } + + $default_args = array( + 'before_widget' => '
                ', + 'after_widget' => '
                ', + 'before_title' => '

                ', + 'after_title' => '

                ', + ); + $args = wp_parse_args( $args, $default_args ); + $args['before_widget'] = sprintf( $args['before_widget'], $widget_obj->widget_options['classname'] ); + + $instance = wp_parse_args( $instance ); + + /** This filter is documented in wp-includes/class-wp-widget.php */ + $instance = apply_filters( 'widget_display_callback', $instance, $widget_obj, $args ); + + if ( false === $instance ) { + return; + } + + /** + * Fires before rendering the requested widget. + * + * @since 3.0.0 + * + * @param string $widget The widget's class name. + * @param array $instance The current widget instance's settings. + * @param array $args An array of the widget's sidebar arguments. + */ + do_action( 'the_widget', $widget, $instance, $args ); + + $widget_obj->_set( -1 ); + $widget_obj->widget( $args, $instance ); +} + +/** + * Retrieves the widget ID base value. + * + * @since 2.8.0 + * + * @param string $id Widget ID. + * @return string Widget ID base. + */ +function _get_widget_id_base( $id ) { + return preg_replace( '/-[0-9]+$/', '', $id ); +} + +/** + * Handle sidebars config after theme change + * + * @access private + * @since 3.3.0 + * + * @global array $sidebars_widgets + */ +function _wp_sidebars_changed() { + global $sidebars_widgets; + + if ( ! is_array( $sidebars_widgets ) ) { + $sidebars_widgets = wp_get_sidebars_widgets(); + } + + retrieve_widgets( true ); +} + +/** + * Look for "lost" widgets, this has to run at least on each theme change. + * + * @since 2.8.0 + * + * @global array $wp_registered_sidebars Registered sidebars. + * @global array $sidebars_widgets + * @global array $wp_registered_widgets + * + * @param string|bool $theme_changed Whether the theme was changed as a boolean. A value + * of 'customize' defers updates for the Customizer. + * @return array Updated sidebars widgets. + */ +function retrieve_widgets( $theme_changed = false ) { + global $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; + + $registered_sidebars_keys = array_keys( $wp_registered_sidebars ); + $registered_widgets_ids = array_keys( $wp_registered_widgets ); + + if ( ! is_array( get_theme_mod( 'sidebars_widgets' ) ) ) { + if ( empty( $sidebars_widgets ) ) { + return array(); + } + + unset( $sidebars_widgets['array_version'] ); + + $sidebars_widgets_keys = array_keys( $sidebars_widgets ); + sort( $sidebars_widgets_keys ); + sort( $registered_sidebars_keys ); + + if ( $sidebars_widgets_keys === $registered_sidebars_keys ) { + $sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids ); + + return $sidebars_widgets; + } + } + + // Discard invalid, theme-specific widgets from sidebars. + $sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids ); + $sidebars_widgets = wp_map_sidebars_widgets( $sidebars_widgets ); + + // Find hidden/lost multi-widget instances. + $shown_widgets = call_user_func_array( 'array_merge', $sidebars_widgets ); + $lost_widgets = array_diff( $registered_widgets_ids, $shown_widgets ); + + foreach ( $lost_widgets as $key => $widget_id ) { + $number = preg_replace( '/.+?-([0-9]+)$/', '$1', $widget_id ); + + // Only keep active and default widgets. + if ( is_numeric( $number ) && (int) $number < 2 ) { + unset( $lost_widgets[ $key ] ); + } + } + $sidebars_widgets['wp_inactive_widgets'] = array_merge( $lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets'] ); + + if ( 'customize' !== $theme_changed ) { + wp_set_sidebars_widgets( $sidebars_widgets ); + } + + return $sidebars_widgets; +} + +/** + * Compares a list of sidebars with their widgets against a whitelist. + * + * @since 4.9.0 + * @since 4.9.2 Always tries to restore widget assignments from previous data, not just if sidebars needed mapping. + * + * @param array $existing_sidebars_widgets List of sidebars and their widget instance IDs. + * @return array Mapped sidebars widgets. + */ +function wp_map_sidebars_widgets( $existing_sidebars_widgets ) { + global $wp_registered_sidebars; + + $new_sidebars_widgets = array( + 'wp_inactive_widgets' => array(), + ); + + // Short-circuit if there are no sidebars to map. + if ( ! is_array( $existing_sidebars_widgets ) || empty( $existing_sidebars_widgets ) ) { + return $new_sidebars_widgets; + } + + foreach ( $existing_sidebars_widgets as $sidebar => $widgets ) { + if ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) { + $new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], (array) $widgets ); + unset( $existing_sidebars_widgets[ $sidebar ] ); + } + } + + // If old and new theme have just one sidebar, map it and we're done. + if ( 1 === count( $existing_sidebars_widgets ) && 1 === count( $wp_registered_sidebars ) ) { + $new_sidebars_widgets[ key( $wp_registered_sidebars ) ] = array_pop( $existing_sidebars_widgets ); + + return $new_sidebars_widgets; + } + + // Map locations with the same slug. + $existing_sidebars = array_keys( $existing_sidebars_widgets ); + + foreach ( $wp_registered_sidebars as $sidebar => $name ) { + if ( in_array( $sidebar, $existing_sidebars, true ) ) { + $new_sidebars_widgets[ $sidebar ] = $existing_sidebars_widgets[ $sidebar ]; + unset( $existing_sidebars_widgets[ $sidebar ] ); + } elseif ( ! array_key_exists( $sidebar, $new_sidebars_widgets ) ) { + $new_sidebars_widgets[ $sidebar ] = array(); + } + } + + // If there are more sidebars, try to map them. + if ( ! empty( $existing_sidebars_widgets ) ) { + + /* + * If old and new theme both have sidebars that contain phrases + * from within the same group, make an educated guess and map it. + */ + $common_slug_groups = array( + array( 'sidebar', 'primary', 'main', 'right' ), + array( 'second', 'left' ), + array( 'sidebar-2', 'footer', 'bottom' ), + array( 'header', 'top' ), + ); + + // Go through each group... + foreach ( $common_slug_groups as $slug_group ) { + + // ...and see if any of these slugs... + foreach ( $slug_group as $slug ) { + + // ...and any of the new sidebars... + foreach ( $wp_registered_sidebars as $new_sidebar => $args ) { + + // ...actually match! + if ( false === stripos( $new_sidebar, $slug ) && false === stripos( $slug, $new_sidebar ) ) { + continue; + } + + // Then see if any of the existing sidebars... + foreach ( $existing_sidebars_widgets as $sidebar => $widgets ) { + + // ...and any slug in the same group... + foreach ( $slug_group as $slug ) { + + // ... have a match as well. + if ( false === stripos( $sidebar, $slug ) && false === stripos( $slug, $sidebar ) ) { + continue; + } + + // Make sure this sidebar wasn't mapped and removed previously. + if ( ! empty( $existing_sidebars_widgets[ $sidebar ] ) ) { + + // We have a match that can be mapped! + $new_sidebars_widgets[ $new_sidebar ] = array_merge( $new_sidebars_widgets[ $new_sidebar ], $existing_sidebars_widgets[ $sidebar ] ); + + // Remove the mapped sidebar so it can't be mapped again. + unset( $existing_sidebars_widgets[ $sidebar ] ); + + // Go back and check the next new sidebar. + continue 3; + } + } // End foreach ( $slug_group as $slug ). + } // End foreach ( $existing_sidebars_widgets as $sidebar => $widgets ). + } // End foreach ( $wp_registered_sidebars as $new_sidebar => $args ). + } // End foreach ( $slug_group as $slug ). + } // End foreach ( $common_slug_groups as $slug_group ). + } + + // Move any left over widgets to inactive sidebar. + foreach ( $existing_sidebars_widgets as $widgets ) { + if ( is_array( $widgets ) && ! empty( $widgets ) ) { + $new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], $widgets ); + } + } + + // Sidebars_widgets settings from when this theme was previously active. + $old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' ); + $old_sidebars_widgets = isset( $old_sidebars_widgets['data'] ) ? $old_sidebars_widgets['data'] : false; + + if ( is_array( $old_sidebars_widgets ) ) { + + // Remove empty sidebars, no need to map those. + $old_sidebars_widgets = array_filter( $old_sidebars_widgets ); + + // Only check sidebars that are empty or have not been mapped to yet. + foreach ( $new_sidebars_widgets as $new_sidebar => $new_widgets ) { + if ( array_key_exists( $new_sidebar, $old_sidebars_widgets ) && ! empty( $new_widgets ) ) { + unset( $old_sidebars_widgets[ $new_sidebar ] ); + } + } + + // Remove orphaned widgets, we're only interested in previously active sidebars. + foreach ( $old_sidebars_widgets as $sidebar => $widgets ) { + if ( 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) { + unset( $old_sidebars_widgets[ $sidebar ] ); + } + } + + $old_sidebars_widgets = _wp_remove_unregistered_widgets( $old_sidebars_widgets ); + + if ( ! empty( $old_sidebars_widgets ) ) { + + // Go through each remaining sidebar... + foreach ( $old_sidebars_widgets as $old_sidebar => $old_widgets ) { + + // ...and check every new sidebar... + foreach ( $new_sidebars_widgets as $new_sidebar => $new_widgets ) { + + // ...for every widget we're trying to revive. + foreach ( $old_widgets as $key => $widget_id ) { + $active_key = array_search( $widget_id, $new_widgets, true ); + + // If the widget is used elsewhere... + if ( false !== $active_key ) { + + // ...and that elsewhere is inactive widgets... + if ( 'wp_inactive_widgets' === $new_sidebar ) { + + // ...remove it from there and keep the active version... + unset( $new_sidebars_widgets['wp_inactive_widgets'][ $active_key ] ); + } else { + + // ...otherwise remove it from the old sidebar and keep it in the new one. + unset( $old_sidebars_widgets[ $old_sidebar ][ $key ] ); + } + } // End if ( $active_key ). + } // End foreach ( $old_widgets as $key => $widget_id ). + } // End foreach ( $new_sidebars_widgets as $new_sidebar => $new_widgets ). + } // End foreach ( $old_sidebars_widgets as $old_sidebar => $old_widgets ). + } // End if ( ! empty( $old_sidebars_widgets ) ). + + // Restore widget settings from when theme was previously active. + $new_sidebars_widgets = array_merge( $new_sidebars_widgets, $old_sidebars_widgets ); + } + + return $new_sidebars_widgets; +} + +/** + * Compares a list of sidebars with their widgets against a whitelist. + * + * @since 4.9.0 + * + * @param array $sidebars_widgets List of sidebars and their widget instance IDs. + * @param array $whitelist Optional. List of widget IDs to compare against. Default: Registered widgets. + * @return array Sidebars with whitelisted widgets. + */ +function _wp_remove_unregistered_widgets( $sidebars_widgets, $whitelist = array() ) { + if ( empty( $whitelist ) ) { + $whitelist = array_keys( $GLOBALS['wp_registered_widgets'] ); + } + + foreach ( $sidebars_widgets as $sidebar => $widgets ) { + if ( is_array( $widgets ) ) { + $sidebars_widgets[ $sidebar ] = array_intersect( $widgets, $whitelist ); + } + } + + return $sidebars_widgets; +} + +/** + * Display the RSS entries in a list. + * + * @since 2.5.0 + * + * @param string|array|object $rss RSS url. + * @param array $args Widget arguments. + */ +function wp_widget_rss_output( $rss, $args = array() ) { + if ( is_string( $rss ) ) { + $rss = fetch_feed( $rss ); + } elseif ( is_array( $rss ) && isset( $rss['url'] ) ) { + $args = $rss; + $rss = fetch_feed( $rss['url'] ); + } elseif ( ! is_object( $rss ) ) { + return; + } + + if ( is_wp_error( $rss ) ) { + if ( is_admin() || current_user_can( 'manage_options' ) ) { + echo '

                ' . __( 'RSS Error:' ) . ' ' . $rss->get_error_message() . '

                '; + } + return; + } + + $default_args = array( + 'show_author' => 0, + 'show_date' => 0, + 'show_summary' => 0, + 'items' => 0, + ); + $args = wp_parse_args( $args, $default_args ); + + $items = (int) $args['items']; + if ( $items < 1 || 20 < $items ) { + $items = 10; + } + $show_summary = (int) $args['show_summary']; + $show_author = (int) $args['show_author']; + $show_date = (int) $args['show_date']; + + if ( ! $rss->get_item_quantity() ) { + echo '
                • ' . __( 'An error has occurred, which probably means the feed is down. Try again later.' ) . '
                '; + $rss->__destruct(); + unset( $rss ); + return; + } + + echo '
                  '; + foreach ( $rss->get_items( 0, $items ) as $item ) { + $link = $item->get_link(); + while ( stristr( $link, 'http' ) !== $link ) { + $link = substr( $link, 1 ); + } + $link = esc_url( strip_tags( $link ) ); + + $title = esc_html( trim( strip_tags( $item->get_title() ) ) ); + if ( empty( $title ) ) { + $title = __( 'Untitled' ); + } + + $desc = html_entity_decode( $item->get_description(), ENT_QUOTES, get_option( 'blog_charset' ) ); + $desc = esc_attr( wp_trim_words( $desc, 55, ' […]' ) ); + + $summary = ''; + if ( $show_summary ) { + $summary = $desc; + + // Change existing [...] to […]. + if ( '[...]' === substr( $summary, -5 ) ) { + $summary = substr( $summary, 0, -5 ) . '[…]'; + } + + $summary = '
                  ' . esc_html( $summary ) . '
                  '; + } + + $date = ''; + if ( $show_date ) { + $date = $item->get_date( 'U' ); + + if ( $date ) { + $date = ' ' . date_i18n( get_option( 'date_format' ), $date ) . ''; + } + } + + $author = ''; + if ( $show_author ) { + $author = $item->get_author(); + if ( is_object( $author ) ) { + $author = $author->get_name(); + $author = ' ' . esc_html( strip_tags( $author ) ) . ''; + } + } + + if ( '' === $link ) { + echo "
                • $title{$date}{$summary}{$author}
                • "; + } elseif ( $show_summary ) { + echo "
                • $title{$date}{$summary}{$author}
                • "; + } else { + echo "
                • $title{$date}{$author}
                • "; + } + } + echo '
                '; + $rss->__destruct(); + unset( $rss ); +} + +/** + * Display RSS widget options form. + * + * The options for what fields are displayed for the RSS form are all booleans + * and are as follows: 'url', 'title', 'items', 'show_summary', 'show_author', + * 'show_date'. + * + * @since 2.5.0 + * + * @param array|string $args Values for input fields. + * @param array $inputs Override default display options. + */ +function wp_widget_rss_form( $args, $inputs = null ) { + $default_inputs = array( + 'url' => true, + 'title' => true, + 'items' => true, + 'show_summary' => true, + 'show_author' => true, + 'show_date' => true, + ); + $inputs = wp_parse_args( $inputs, $default_inputs ); + + $args['title'] = isset( $args['title'] ) ? $args['title'] : ''; + $args['url'] = isset( $args['url'] ) ? $args['url'] : ''; + $args['items'] = isset( $args['items'] ) ? (int) $args['items'] : 0; + + if ( $args['items'] < 1 || 20 < $args['items'] ) { + $args['items'] = 10; + } + + $args['show_summary'] = isset( $args['show_summary'] ) ? (int) $args['show_summary'] : (int) $inputs['show_summary']; + $args['show_author'] = isset( $args['show_author'] ) ? (int) $args['show_author'] : (int) $inputs['show_author']; + $args['show_date'] = isset( $args['show_date'] ) ? (int) $args['show_date'] : (int) $inputs['show_date']; + + if ( ! empty( $args['error'] ) ) { + echo '

                ' . __( 'RSS Error:' ) . ' ' . $args['error'] . '

                '; + } + + $esc_number = esc_attr( $args['number'] ); + if ( $inputs['url'] ) : + ?> +

                +

                + +

                +

                + +

                +

                + +

                /> +

                + +

                /> +

                + +

                /> +

                + + + get_error_message(); + } else { + $link = esc_url( strip_tags( $rss->get_permalink() ) ); + while ( stristr( $link, 'http' ) !== $link ) { + $link = substr( $link, 1 ); + } + + $rss->__destruct(); + unset( $rss ); + } + } + + return compact( 'title', 'url', 'link', 'items', 'error', 'show_summary', 'show_author', 'show_date' ); +} + +/** + * Registers all of the default WordPress widgets on startup. + * + * Calls {@see 'widgets_init'} action after all of the WordPress widgets have been registered. + * + * @since 2.2.0 + */ +function wp_widgets_init() { + if ( ! is_blog_installed() ) { + return; + } + + register_widget( 'WP_Widget_Pages' ); + + register_widget( 'WP_Widget_Calendar' ); + + register_widget( 'WP_Widget_Archives' ); + + if ( get_option( 'link_manager_enabled' ) ) { + register_widget( 'WP_Widget_Links' ); + } + + register_widget( 'WP_Widget_Media_Audio' ); + + register_widget( 'WP_Widget_Media_Image' ); + + register_widget( 'WP_Widget_Media_Gallery' ); + + register_widget( 'WP_Widget_Media_Video' ); + + register_widget( 'WP_Widget_Meta' ); + + register_widget( 'WP_Widget_Search' ); + + register_widget( 'WP_Widget_Text' ); + + register_widget( 'WP_Widget_Categories' ); + + register_widget( 'WP_Widget_Recent_Posts' ); + + register_widget( 'WP_Widget_Recent_Comments' ); + + register_widget( 'WP_Widget_RSS' ); + + register_widget( 'WP_Widget_Tag_Cloud' ); + + register_widget( 'WP_Nav_Menu_Widget' ); + + register_widget( 'WP_Widget_Custom_HTML' ); + + /** + * Fires after all default WordPress widgets have been registered. + * + * @since 2.2.0 + */ + do_action( 'widgets_init' ); +} diff --git a/wp-includes/widgets/class-wp-nav-menu-widget.php b/wp-includes/widgets/class-wp-nav-menu-widget.php new file mode 100644 index 0000000..1edaeac --- /dev/null +++ b/wp-includes/widgets/class-wp-nav-menu-widget.php @@ -0,0 +1,174 @@ + __( 'Add a navigation menu to your sidebar.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'nav_menu', __( 'Navigation Menu' ), $widget_ops ); + } + + /** + * Outputs the content for the current Navigation Menu widget instance. + * + * @since 3.0.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Navigation Menu widget instance. + */ + public function widget( $args, $instance ) { + // Get menu. + $nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false; + + if ( ! $nav_menu ) { + return; + } + + $title = ! empty( $instance['title'] ) ? $instance['title'] : ''; + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + echo $args['before_widget']; + + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + + $nav_menu_args = array( + 'fallback_cb' => '', + 'menu' => $nav_menu, + ); + + /** + * Filters the arguments for the Navigation Menu widget. + * + * @since 4.2.0 + * @since 4.4.0 Added the `$instance` parameter. + * + * @param array $nav_menu_args { + * An array of arguments passed to wp_nav_menu() to retrieve a navigation menu. + * + * @type callable|bool $fallback_cb Callback to fire if the menu doesn't exist. Default empty. + * @type mixed $menu Menu ID, slug, or name. + * } + * @param WP_Term $nav_menu Nav menu object for the current menu. + * @param array $args Display arguments for the current widget. + * @param array $instance Array of settings for the current widget. + */ + wp_nav_menu( apply_filters( 'widget_nav_menu_args', $nav_menu_args, $nav_menu, $args, $instance ) ); + + echo $args['after_widget']; + } + + /** + * Handles updating settings for the current Navigation Menu widget instance. + * + * @since 3.0.0 + * + * @param array $new_instance New settings for this instance as input by the user via + * WP_Widget::form(). + * @param array $old_instance Old settings for this instance. + * @return array Updated settings to save. + */ + public function update( $new_instance, $old_instance ) { + $instance = array(); + if ( ! empty( $new_instance['title'] ) ) { + $instance['title'] = sanitize_text_field( $new_instance['title'] ); + } + if ( ! empty( $new_instance['nav_menu'] ) ) { + $instance['nav_menu'] = (int) $new_instance['nav_menu']; + } + return $instance; + } + + /** + * Outputs the settings form for the Navigation Menu widget. + * + * @since 3.0.0 + * + * @param array $instance Current settings. + * @global WP_Customize_Manager $wp_customize + */ + public function form( $instance ) { + global $wp_customize; + $title = isset( $instance['title'] ) ? $instance['title'] : ''; + $nav_menu = isset( $instance['nav_menu'] ) ? $instance['nav_menu'] : ''; + + // Get menus. + $menus = wp_get_nav_menus(); + + $empty_menus_style = ''; + $not_empty_menus_style = ''; + if ( empty( $menus ) ) { + $empty_menus_style = ' style="display:none" '; + } else { + $not_empty_menus_style = ' style="display:none" '; + } + + $nav_menu_style = ''; + if ( ! $nav_menu ) { + $nav_menu_style = 'display: none;'; + } + + // If no menus exists, direct the user to go and create some. + ?> + + + 'widget_archive', + 'description' => __( 'A monthly archive of your site’s Posts.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'archives', __( 'Archives' ), $widget_ops ); + } + + /** + * Outputs the content for the current Archives widget instance. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Archives widget instance. + */ + public function widget( $args, $instance ) { + $title = ! empty( $instance['title'] ) ? $instance['title'] : __( 'Archives' ); + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + $count = ! empty( $instance['count'] ) ? '1' : '0'; + $dropdown = ! empty( $instance['dropdown'] ) ? '1' : '0'; + + echo $args['before_widget']; + + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + + if ( $dropdown ) { + $dropdown_id = "{$this->id_base}-dropdown-{$this->number}"; + ?> + + + +> +/* " ); + function onSelectChange() { + if ( dropdown.options[ dropdown.selectedIndex ].value !== '' ) { + document.location.href = this.options[ this.selectedIndex ].value; + } + } + dropdown.onchange = onSelectChange; +})(); +/* ]]> */ + + + +
                  + 'monthly', + 'show_post_count' => $count, + ), + $instance + ) + ); + ?> +
                + '', + 'count' => 0, + 'dropdown' => '', + ) + ); + $instance['title'] = sanitize_text_field( $new_instance['title'] ); + $instance['count'] = $new_instance['count'] ? 1 : 0; + $instance['dropdown'] = $new_instance['dropdown'] ? 1 : 0; + + return $instance; + } + + /** + * Outputs the settings form for the Archives widget. + * + * @since 2.8.0 + * + * @param array $instance Current settings. + */ + public function form( $instance ) { + $instance = wp_parse_args( + (array) $instance, + array( + 'title' => '', + 'count' => 0, + 'dropdown' => '', + ) + ); + ?> +

                +

                + id="get_field_id( 'dropdown' ); ?>" name="get_field_name( 'dropdown' ); ?>" /> +
                + id="get_field_id( 'count' ); ?>" name="get_field_name( 'count' ); ?>" /> +

                + 'widget_calendar', + 'description' => __( 'A calendar of your site’s posts.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'calendar', __( 'Calendar' ), $widget_ops ); + } + + /** + * Outputs the content for the current Calendar widget instance. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance The settings for the particular instance of the widget. + */ + public function widget( $args, $instance ) { + $title = ! empty( $instance['title'] ) ? $instance['title'] : ''; + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + echo $args['before_widget']; + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + if ( 0 === self::$instance ) { + echo '
                '; + } else { + echo '
                '; + } + get_calendar(); + echo '
                '; + echo $args['after_widget']; + + self::$instance++; + } + + /** + * Handles updating settings for the current Calendar widget instance. + * + * @since 2.8.0 + * + * @param array $new_instance New settings for this instance as input by the user via + * WP_Widget::form(). + * @param array $old_instance Old settings for this instance. + * @return array Updated settings to save. + */ + public function update( $new_instance, $old_instance ) { + $instance = $old_instance; + $instance['title'] = sanitize_text_field( $new_instance['title'] ); + + return $instance; + } + + /** + * Outputs the settings form for the Calendar widget. + * + * @since 2.8.0 + * + * @param array $instance Current settings. + */ + public function form( $instance ) { + $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) ); + ?> +

                +

                + 'widget_categories', + 'description' => __( 'A list or dropdown of categories.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'categories', __( 'Categories' ), $widget_ops ); + } + + /** + * Outputs the content for the current Categories widget instance. + * + * @since 2.8.0 + * @since 4.2.0 Creates a unique HTML ID for the `

                + +

                /> +
                + + /> +
                + + /> +

                + '', + 'content' => '', + ); + + /** + * Sets up a new Custom HTML widget instance. + * + * @since 4.8.1 + */ + public function __construct() { + $widget_ops = array( + 'classname' => 'widget_custom_html', + 'description' => __( 'Arbitrary HTML code.' ), + 'customize_selective_refresh' => true, + ); + $control_ops = array( + 'width' => 400, + 'height' => 350, + ); + parent::__construct( 'custom_html', __( 'Custom HTML' ), $widget_ops, $control_ops ); + } + + /** + * Add hooks for enqueueing assets when registering all widget instances of this widget class. + * + * @since 4.9.0 + * + * @param integer $number Optional. The unique order number of this widget instance + * compared to other instances of the same class. Default -1. + */ + public function _register_one( $number = -1 ) { + parent::_register_one( $number ); + if ( $this->registered ) { + return; + } + $this->registered = true; + + wp_add_inline_script( 'custom-html-widgets', sprintf( 'wp.customHtmlWidgets.idBases.push( %s );', wp_json_encode( $this->id_base ) ) ); + + // Note that the widgets component in the customizer will also do + // the 'admin_print_scripts-widgets.php' action in WP_Customize_Widgets::print_scripts(). + add_action( 'admin_print_scripts-widgets.php', array( $this, 'enqueue_admin_scripts' ) ); + + // Note that the widgets component in the customizer will also do + // the 'admin_footer-widgets.php' action in WP_Customize_Widgets::print_footer_scripts(). + add_action( 'admin_footer-widgets.php', array( 'WP_Widget_Custom_HTML', 'render_control_template_scripts' ) ); + + // Note this action is used to ensure the help text is added to the end. + add_action( 'admin_head-widgets.php', array( 'WP_Widget_Custom_HTML', 'add_help_text' ) ); + } + + /** + * Filter gallery shortcode attributes. + * + * Prevents all of a site's attachments from being shown in a gallery displayed on a + * non-singular template where a $post context is not available. + * + * @since 4.9.0 + * + * @param array $attrs Attributes. + * @return array Attributes. + */ + public function _filter_gallery_shortcode_attrs( $attrs ) { + if ( ! is_singular() && empty( $attrs['id'] ) && empty( $attrs['include'] ) ) { + $attrs['id'] = -1; + } + return $attrs; + } + + /** + * Outputs the content for the current Custom HTML widget instance. + * + * @since 4.8.1 + * + * @global WP_Post $post Global post object. + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Custom HTML widget instance. + */ + public function widget( $args, $instance ) { + global $post; + + // Override global $post so filters (and shortcodes) apply in a consistent context. + $original_post = $post; + if ( is_singular() ) { + // Make sure post is always the queried object on singular queries (not from another sub-query that failed to clean up the global $post). + $post = get_queried_object(); + } else { + // Nullify the $post global during widget rendering to prevent shortcodes from running with the unexpected context on archive queries. + $post = null; + } + + // Prevent dumping out all attachments from the media library. + add_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) ); + + $instance = array_merge( $this->default_instance, $instance ); + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base ); + + // Prepare instance data that looks like a normal Text widget. + $simulated_text_widget_instance = array_merge( + $instance, + array( + 'text' => isset( $instance['content'] ) ? $instance['content'] : '', + 'filter' => false, // Because wpautop is not applied. + 'visual' => false, // Because it wasn't created in TinyMCE. + ) + ); + unset( $simulated_text_widget_instance['content'] ); // Was moved to 'text' prop. + + /** This filter is documented in wp-includes/widgets/class-wp-widget-text.php */ + $content = apply_filters( 'widget_text', $instance['content'], $simulated_text_widget_instance, $this ); + + // Adds noreferrer and noopener relationships, without duplicating values, to all HTML A elements that have a target. + $content = wp_targeted_link_rel( $content ); + + /** + * Filters the content of the Custom HTML widget. + * + * @since 4.8.1 + * + * @param string $content The widget content. + * @param array $instance Array of settings for the current widget. + * @param WP_Widget_Custom_HTML $this Current Custom HTML widget instance. + */ + $content = apply_filters( 'widget_custom_html_content', $content, $instance, $this ); + + // Restore post global. + $post = $original_post; + remove_filter( 'shortcode_atts_gallery', array( $this, '_filter_gallery_shortcode_attrs' ) ); + + // Inject the Text widget's container class name alongside this widget's class name for theme styling compatibility. + $args['before_widget'] = preg_replace( '/(?<=\sclass=["\'])/', 'widget_text ', $args['before_widget'] ); + + echo $args['before_widget']; + if ( ! empty( $title ) ) { + echo $args['before_title'] . $title . $args['after_title']; + } + echo '
                '; // The textwidget class is for theme styling compatibility. + echo $content; + echo '
                '; + echo $args['after_widget']; + } + + /** + * Handles updating settings for the current Custom HTML widget instance. + * + * @since 4.8.1 + * + * @param array $new_instance New settings for this instance as input by the user via + * WP_Widget::form(). + * @param array $old_instance Old settings for this instance. + * @return array Settings to save or bool false to cancel saving. + */ + public function update( $new_instance, $old_instance ) { + $instance = array_merge( $this->default_instance, $old_instance ); + $instance['title'] = sanitize_text_field( $new_instance['title'] ); + if ( current_user_can( 'unfiltered_html' ) ) { + $instance['content'] = $new_instance['content']; + } else { + $instance['content'] = wp_kses_post( $new_instance['content'] ); + } + return $instance; + } + + /** + * Loads the required scripts and styles for the widget control. + * + * @since 4.9.0 + */ + public function enqueue_admin_scripts() { + $settings = wp_enqueue_code_editor( + array( + 'type' => 'text/html', + 'codemirror' => array( + 'indentUnit' => 2, + 'tabSize' => 2, + ), + ) + ); + + wp_enqueue_script( 'custom-html-widgets' ); + if ( empty( $settings ) ) { + $settings = array( + 'disabled' => true, + ); + } + wp_add_inline_script( 'custom-html-widgets', sprintf( 'wp.customHtmlWidgets.init( %s );', wp_json_encode( $settings ) ), 'after' ); + + $l10n = array( + 'errorNotice' => array( + /* translators: %d: Error count. */ + 'singular' => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 1 ), + /* translators: %d: Error count. */ + 'plural' => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 2 ), + // @todo This is lacking, as some languages have a dedicated dual form. For proper handling of plurals in JS, see #20491. + ), + ); + wp_add_inline_script( 'custom-html-widgets', sprintf( 'jQuery.extend( wp.customHtmlWidgets.l10n, %s );', wp_json_encode( $l10n ) ), 'after' ); + } + + /** + * Outputs the Custom HTML widget settings form. + * + * @since 4.8.1 + * @since 4.9.0 The form contains only hidden sync inputs. For the control UI, see `WP_Widget_Custom_HTML::render_control_template_scripts()`. + * + * @see WP_Widget_Custom_HTML::render_control_template_scripts() + * + * @param array $instance Current instance. + */ + public function form( $instance ) { + $instance = wp_parse_args( (array) $instance, $this->default_instance ); + ?> + + + + + '; + $content .= __( 'Use the Custom HTML widget to add arbitrary HTML code to your widget areas.' ); + $content .= '

                '; + + if ( 'false' !== wp_get_current_user()->syntax_highlighting ) { + $content .= '

                '; + $content .= sprintf( + /* translators: 1: Link to user profile, 2: Additional link attributes, 3: Accessibility text. */ + __( 'The edit field automatically highlights code syntax. You can disable this in your user profile%3$s to work in plain text mode.' ), + esc_url( get_edit_profile_url() ), + 'class="external-link" target="_blank"', + sprintf( + ' %s', + /* translators: Accessibility text. */ + __( '(opens in a new tab)' ) + ) + ); + $content .= '

                '; + + $content .= '

                ' . __( 'When using a keyboard to navigate:' ) . '

                '; + $content .= '
                  '; + $content .= '
                • ' . __( 'In the editing area, the Tab key enters a tab character.' ) . '
                • '; + $content .= '
                • ' . __( 'To move away from this area, press the Esc key followed by the Tab key.' ) . '
                • '; + $content .= '
                • ' . __( 'Screen reader users: when in forms mode, you may need to press the Esc key twice.' ) . '
                • '; + $content .= '
                '; + } + + $screen->add_help_tab( + array( + 'id' => 'custom_html_widget', + 'title' => __( 'Custom HTML Widget' ), + 'content' => $content, + ) + ); + } +} diff --git a/wp-includes/widgets/class-wp-widget-links.php b/wp-includes/widgets/class-wp-widget-links.php new file mode 100644 index 0000000..c993ed5 --- /dev/null +++ b/wp-includes/widgets/class-wp-widget-links.php @@ -0,0 +1,182 @@ + __( 'Your blogroll' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'links', __( 'Links' ), $widget_ops ); + } + + /** + * Outputs the content for the current Links widget instance. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Links widget instance. + */ + public function widget( $args, $instance ) { + $show_description = isset( $instance['description'] ) ? $instance['description'] : false; + $show_name = isset( $instance['name'] ) ? $instance['name'] : false; + $show_rating = isset( $instance['rating'] ) ? $instance['rating'] : false; + $show_images = isset( $instance['images'] ) ? $instance['images'] : true; + $category = isset( $instance['category'] ) ? $instance['category'] : false; + $orderby = isset( $instance['orderby'] ) ? $instance['orderby'] : 'name'; + $order = 'rating' === $orderby ? 'DESC' : 'ASC'; + $limit = isset( $instance['limit'] ) ? $instance['limit'] : -1; + + $before_widget = preg_replace( '/id="[^"]*"/', 'id="%id"', $args['before_widget'] ); + + $widget_links_args = array( + 'title_before' => $args['before_title'], + 'title_after' => $args['after_title'], + 'category_before' => $before_widget, + 'category_after' => $args['after_widget'], + 'show_images' => $show_images, + 'show_description' => $show_description, + 'show_name' => $show_name, + 'show_rating' => $show_rating, + 'category' => $category, + 'class' => 'linkcat widget', + 'orderby' => $orderby, + 'order' => $order, + 'limit' => $limit, + ); + + /** + * Filters the arguments for the Links widget. + * + * @since 2.6.0 + * @since 4.4.0 Added the `$instance` parameter. + * + * @see wp_list_bookmarks() + * + * @param array $widget_links_args An array of arguments to retrieve the links list. + * @param array $instance The settings for the particular instance of the widget. + */ + wp_list_bookmarks( apply_filters( 'widget_links_args', $widget_links_args, $instance ) ); + } + + /** + * Handles updating settings for the current Links widget instance. + * + * @since 2.8.0 + * + * @param array $new_instance New settings for this instance as input by the user via + * WP_Widget::form(). + * @param array $old_instance Old settings for this instance. + * @return array Updated settings to save. + */ + public function update( $new_instance, $old_instance ) { + $new_instance = (array) $new_instance; + $instance = array( + 'images' => 0, + 'name' => 0, + 'description' => 0, + 'rating' => 0, + ); + foreach ( $instance as $field => $val ) { + if ( isset( $new_instance[ $field ] ) ) { + $instance[ $field ] = 1; + } + } + + $instance['orderby'] = 'name'; + if ( in_array( $new_instance['orderby'], array( 'name', 'rating', 'id', 'rand' ) ) ) { + $instance['orderby'] = $new_instance['orderby']; + } + + $instance['category'] = intval( $new_instance['category'] ); + $instance['limit'] = ! empty( $new_instance['limit'] ) ? intval( $new_instance['limit'] ) : -1; + + return $instance; + } + + /** + * Outputs the settings form for the Links widget. + * + * @since 2.8.0 + * + * @param array $instance Current settings. + */ + public function form( $instance ) { + + // Defaults. + $instance = wp_parse_args( + (array) $instance, + array( + 'images' => true, + 'name' => true, + 'description' => false, + 'rating' => false, + 'category' => false, + 'orderby' => 'name', + 'limit' => -1, + ) + ); + $link_cats = get_terms( array( 'taxonomy' => 'link_category' ) ); + $limit = intval( $instance['limit'] ); + if ( ! $limit ) { + $limit = -1; + } + ?> +

                + + + + +

                +

                + id="get_field_id( 'images' ); ?>" name="get_field_name( 'images' ); ?>" /> +
                + id="get_field_id( 'name' ); ?>" name="get_field_name( 'name' ); ?>" /> +
                + id="get_field_id( 'description' ); ?>" name="get_field_name( 'description' ); ?>" /> +
                + id="get_field_id( 'rating' ); ?>" name="get_field_name( 'rating' ); ?>" /> + +

                +

                + + +

                + __( 'Displays an audio player.' ), + 'mime_type' => 'audio', + ) + ); + + $this->l10n = array_merge( + $this->l10n, + array( + 'no_media_selected' => __( 'No audio selected' ), + 'add_media' => _x( 'Add Audio', 'label for button in the audio widget' ), + 'replace_media' => _x( 'Replace Audio', 'label for button in the audio widget; should preferably not be longer than ~13 characters long' ), + 'edit_media' => _x( 'Edit Audio', 'label for button in the audio widget; should preferably not be longer than ~13 characters long' ), + 'missing_attachment' => sprintf( + /* translators: %s: URL to media library. */ + __( 'We can’t find that audio file. Check your media library and make sure it wasn’t deleted.' ), + esc_url( admin_url( 'upload.php' ) ) + ), + /* translators: %d: Widget count. */ + 'media_library_state_multi' => _n_noop( 'Audio Widget (%d)', 'Audio Widget (%d)' ), + 'media_library_state_single' => __( 'Audio Widget' ), + 'unsupported_file_type' => __( 'Looks like this isn’t the correct kind of file. Please link to an audio file instead.' ), + ) + ); + } + + /** + * Get schema for properties of a widget instance (item). + * + * @since 4.8.0 + * + * @see WP_REST_Controller::get_item_schema() + * @see WP_REST_Controller::get_additional_fields() + * @link https://core.trac.wordpress.org/ticket/35574 + * + * @return array Schema for properties. + */ + public function get_instance_schema() { + $schema = array( + 'preload' => array( + 'type' => 'string', + 'enum' => array( 'none', 'auto', 'metadata' ), + 'default' => 'none', + 'description' => __( 'Preload' ), + ), + 'loop' => array( + 'type' => 'boolean', + 'default' => false, + 'description' => __( 'Loop' ), + ), + ); + + foreach ( wp_get_audio_extensions() as $audio_extension ) { + $schema[ $audio_extension ] = array( + 'type' => 'string', + 'default' => '', + 'format' => 'uri', + /* translators: %s: Audio extension. */ + 'description' => sprintf( __( 'URL to the %s audio source file' ), $audio_extension ), + ); + } + + return array_merge( $schema, parent::get_instance_schema() ); + } + + /** + * Render the media on the frontend. + * + * @since 4.8.0 + * + * @param array $instance Widget instance props. + */ + public function render_media( $instance ) { + $instance = array_merge( wp_list_pluck( $this->get_instance_schema(), 'default' ), $instance ); + $attachment = null; + + if ( $this->is_attachment_with_mime_type( $instance['attachment_id'], $this->widget_options['mime_type'] ) ) { + $attachment = get_post( $instance['attachment_id'] ); + } + + if ( $attachment ) { + $src = wp_get_attachment_url( $attachment->ID ); + } else { + $src = $instance['url']; + } + + echo wp_audio_shortcode( + array_merge( + $instance, + compact( 'src' ) + ) + ); + } + + /** + * Enqueue preview scripts. + * + * These scripts normally are enqueued just-in-time when an audio shortcode is used. + * In the customizer, however, widgets can be dynamically added and rendered via + * selective refresh, and so it is important to unconditionally enqueue them in + * case a widget does get added. + * + * @since 4.8.0 + */ + public function enqueue_preview_scripts() { + /** This filter is documented in wp-includes/media.php */ + if ( 'mediaelement' === apply_filters( 'wp_audio_shortcode_library', 'mediaelement' ) ) { + wp_enqueue_style( 'wp-mediaelement' ); + wp_enqueue_script( 'wp-mediaelement' ); + } + } + + /** + * Loads the required media files for the media manager and scripts for media widgets. + * + * @since 4.8.0 + */ + public function enqueue_admin_scripts() { + parent::enqueue_admin_scripts(); + + wp_enqueue_style( 'wp-mediaelement' ); + wp_enqueue_script( 'wp-mediaelement' ); + + $handle = 'media-audio-widget'; + wp_enqueue_script( $handle ); + + $exported_schema = array(); + foreach ( $this->get_instance_schema() as $field => $field_schema ) { + $exported_schema[ $field ] = wp_array_slice_assoc( $field_schema, array( 'type', 'default', 'enum', 'minimum', 'format', 'media_prop', 'should_preview_update' ) ); + } + wp_add_inline_script( + $handle, + sprintf( + 'wp.mediaWidgets.modelConstructors[ %s ].prototype.schema = %s;', + wp_json_encode( $this->id_base ), + wp_json_encode( $exported_schema ) + ) + ); + + wp_add_inline_script( + $handle, + sprintf( + ' + wp.mediaWidgets.controlConstructors[ %1$s ].prototype.mime_type = %2$s; + wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n = _.extend( {}, wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n, %3$s ); + ', + wp_json_encode( $this->id_base ), + wp_json_encode( $this->widget_options['mime_type'] ), + wp_json_encode( $this->l10n ) + ) + ); + } + + /** + * Render form template scripts. + * + * @since 4.8.0 + */ + public function render_control_template_scripts() { + parent::render_control_template_scripts() + ?> + + __( 'Displays an image gallery.' ), + 'mime_type' => 'image', + ) + ); + + $this->l10n = array_merge( + $this->l10n, + array( + 'no_media_selected' => __( 'No images selected' ), + 'add_media' => _x( 'Add Images', 'label for button in the gallery widget; should not be longer than ~13 characters long' ), + 'replace_media' => '', + 'edit_media' => _x( 'Edit Gallery', 'label for button in the gallery widget; should not be longer than ~13 characters long' ), + ) + ); + } + + /** + * Get schema for properties of a widget instance (item). + * + * @since 4.9.0 + * + * @see WP_REST_Controller::get_item_schema() + * @see WP_REST_Controller::get_additional_fields() + * @link https://core.trac.wordpress.org/ticket/35574 + * + * @return array Schema for properties. + */ + public function get_instance_schema() { + $schema = array( + 'title' => array( + 'type' => 'string', + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field', + 'description' => __( 'Title for the widget' ), + 'should_preview_update' => false, + ), + 'ids' => array( + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'default' => array(), + 'sanitize_callback' => 'wp_parse_id_list', + ), + 'columns' => array( + 'type' => 'integer', + 'default' => 3, + 'minimum' => 1, + 'maximum' => 9, + ), + 'size' => array( + 'type' => 'string', + 'enum' => array_merge( get_intermediate_image_sizes(), array( 'full', 'custom' ) ), + 'default' => 'thumbnail', + ), + 'link_type' => array( + 'type' => 'string', + 'enum' => array( 'post', 'file', 'none' ), + 'default' => 'post', + 'media_prop' => 'link', + 'should_preview_update' => false, + ), + 'orderby_random' => array( + 'type' => 'boolean', + 'default' => false, + 'media_prop' => '_orderbyRandom', + 'should_preview_update' => false, + ), + ); + + /** This filter is documented in wp-includes/widgets/class-wp-widget-media.php */ + $schema = apply_filters( "widget_{$this->id_base}_instance_schema", $schema, $this ); + + return $schema; + } + + /** + * Render the media on the frontend. + * + * @since 4.9.0 + * + * @param array $instance Widget instance props. + */ + public function render_media( $instance ) { + $instance = array_merge( wp_list_pluck( $this->get_instance_schema(), 'default' ), $instance ); + + $shortcode_atts = array_merge( + $instance, + array( + 'link' => $instance['link_type'], + ) + ); + + // @codeCoverageIgnoreStart + if ( $instance['orderby_random'] ) { + $shortcode_atts['orderby'] = 'rand'; + } + + // @codeCoverageIgnoreEnd + echo gallery_shortcode( $shortcode_atts ); + } + + /** + * Loads the required media files for the media manager and scripts for media widgets. + * + * @since 4.9.0 + */ + public function enqueue_admin_scripts() { + parent::enqueue_admin_scripts(); + + $handle = 'media-gallery-widget'; + wp_enqueue_script( $handle ); + + $exported_schema = array(); + foreach ( $this->get_instance_schema() as $field => $field_schema ) { + $exported_schema[ $field ] = wp_array_slice_assoc( $field_schema, array( 'type', 'default', 'enum', 'minimum', 'format', 'media_prop', 'should_preview_update', 'items' ) ); + } + wp_add_inline_script( + $handle, + sprintf( + 'wp.mediaWidgets.modelConstructors[ %s ].prototype.schema = %s;', + wp_json_encode( $this->id_base ), + wp_json_encode( $exported_schema ) + ) + ); + + wp_add_inline_script( + $handle, + sprintf( + ' + wp.mediaWidgets.controlConstructors[ %1$s ].prototype.mime_type = %2$s; + _.extend( wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n, %3$s ); + ', + wp_json_encode( $this->id_base ), + wp_json_encode( $this->widget_options['mime_type'] ), + wp_json_encode( $this->l10n ) + ) + ); + } + + /** + * Render form template scripts. + * + * @since 4.9.0 + */ + public function render_control_template_scripts() { + parent::render_control_template_scripts(); + ?> + + __( 'Displays an image.' ), + 'mime_type' => 'image', + ) + ); + + $this->l10n = array_merge( + $this->l10n, + array( + 'no_media_selected' => __( 'No image selected' ), + 'add_media' => _x( 'Add Image', 'label for button in the image widget' ), + 'replace_media' => _x( 'Replace Image', 'label for button in the image widget; should preferably not be longer than ~13 characters long' ), + 'edit_media' => _x( 'Edit Image', 'label for button in the image widget; should preferably not be longer than ~13 characters long' ), + 'missing_attachment' => sprintf( + /* translators: %s: URL to media library. */ + __( 'We can’t find that image. Check your media library and make sure it wasn’t deleted.' ), + esc_url( admin_url( 'upload.php' ) ) + ), + /* translators: %d: Widget count. */ + 'media_library_state_multi' => _n_noop( 'Image Widget (%d)', 'Image Widget (%d)' ), + 'media_library_state_single' => __( 'Image Widget' ), + ) + ); + } + + /** + * Get schema for properties of a widget instance (item). + * + * @since 4.8.0 + * + * @see WP_REST_Controller::get_item_schema() + * @see WP_REST_Controller::get_additional_fields() + * @link https://core.trac.wordpress.org/ticket/35574 + * + * @return array Schema for properties. + */ + public function get_instance_schema() { + return array_merge( + array( + 'size' => array( + 'type' => 'string', + 'enum' => array_merge( get_intermediate_image_sizes(), array( 'full', 'custom' ) ), + 'default' => 'medium', + 'description' => __( 'Size' ), + ), + 'width' => array( // Via 'customWidth', only when size=custom; otherwise via 'width'. + 'type' => 'integer', + 'minimum' => 0, + 'default' => 0, + 'description' => __( 'Width' ), + ), + 'height' => array( // Via 'customHeight', only when size=custom; otherwise via 'height'. + 'type' => 'integer', + 'minimum' => 0, + 'default' => 0, + 'description' => __( 'Height' ), + ), + + 'caption' => array( + 'type' => 'string', + 'default' => '', + 'sanitize_callback' => 'wp_kses_post', + 'description' => __( 'Caption' ), + 'should_preview_update' => false, + ), + 'alt' => array( + 'type' => 'string', + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field', + 'description' => __( 'Alternative Text' ), + ), + 'link_type' => array( + 'type' => 'string', + 'enum' => array( 'none', 'file', 'post', 'custom' ), + 'default' => 'custom', + 'media_prop' => 'link', + 'description' => __( 'Link To' ), + 'should_preview_update' => true, + ), + 'link_url' => array( + 'type' => 'string', + 'default' => '', + 'format' => 'uri', + 'media_prop' => 'linkUrl', + 'description' => __( 'URL' ), + 'should_preview_update' => true, + ), + 'image_classes' => array( + 'type' => 'string', + 'default' => '', + 'sanitize_callback' => array( $this, 'sanitize_token_list' ), + 'media_prop' => 'extraClasses', + 'description' => __( 'Image CSS Class' ), + 'should_preview_update' => false, + ), + 'link_classes' => array( + 'type' => 'string', + 'default' => '', + 'sanitize_callback' => array( $this, 'sanitize_token_list' ), + 'media_prop' => 'linkClassName', + 'should_preview_update' => false, + 'description' => __( 'Link CSS Class' ), + ), + 'link_rel' => array( + 'type' => 'string', + 'default' => '', + 'sanitize_callback' => array( $this, 'sanitize_token_list' ), + 'media_prop' => 'linkRel', + 'description' => __( 'Link Rel' ), + 'should_preview_update' => false, + ), + 'link_target_blank' => array( + 'type' => 'boolean', + 'default' => false, + 'media_prop' => 'linkTargetBlank', + 'description' => __( 'Open link in a new tab' ), + 'should_preview_update' => false, + ), + 'image_title' => array( + 'type' => 'string', + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field', + 'media_prop' => 'title', + 'description' => __( 'Image Title Attribute' ), + 'should_preview_update' => false, + ), + + /* + * There are two additional properties exposed by the PostImage modal + * that don't seem to be relevant, as they may only be derived read-only + * values: + * - originalUrl + * - aspectRatio + * - height (redundant when size is not custom) + * - width (redundant when size is not custom) + */ + ), + parent::get_instance_schema() + ); + } + + /** + * Render the media on the frontend. + * + * @since 4.8.0 + * + * @param array $instance Widget instance props. + */ + public function render_media( $instance ) { + $instance = array_merge( wp_list_pluck( $this->get_instance_schema(), 'default' ), $instance ); + $instance = wp_parse_args( + $instance, + array( + 'size' => 'thumbnail', + ) + ); + + $attachment = null; + if ( $this->is_attachment_with_mime_type( $instance['attachment_id'], $this->widget_options['mime_type'] ) ) { + $attachment = get_post( $instance['attachment_id'] ); + } + if ( $attachment ) { + $caption = ''; + if ( ! isset( $instance['caption'] ) ) { + $caption = $attachment->post_excerpt; + } elseif ( trim( $instance['caption'] ) ) { + $caption = $instance['caption']; + } + + $image_attributes = array( + 'class' => sprintf( 'image wp-image-%d %s', $attachment->ID, $instance['image_classes'] ), + 'style' => 'max-width: 100%; height: auto;', + ); + if ( ! empty( $instance['image_title'] ) ) { + $image_attributes['title'] = $instance['image_title']; + } + + if ( $instance['alt'] ) { + $image_attributes['alt'] = $instance['alt']; + } + + $size = $instance['size']; + if ( 'custom' === $size || ! in_array( $size, array_merge( get_intermediate_image_sizes(), array( 'full' ) ), true ) ) { + $size = array( $instance['width'], $instance['height'] ); + } + $image_attributes['class'] .= sprintf( ' attachment-%1$s size-%1$s', is_array( $size ) ? join( 'x', $size ) : $size ); + + $image = wp_get_attachment_image( $attachment->ID, $size, false, $image_attributes ); + + $caption_size = _wp_get_image_size_from_meta( $instance['size'], wp_get_attachment_metadata( $attachment->ID ) ); + $width = empty( $caption_size[0] ) ? 0 : $caption_size[0]; + + } else { + if ( empty( $instance['url'] ) ) { + return; + } + + $instance['size'] = 'custom'; + $caption = $instance['caption']; + $width = $instance['width']; + $classes = 'image ' . $instance['image_classes']; + if ( 0 === $instance['width'] ) { + $instance['width'] = ''; + } + if ( 0 === $instance['height'] ) { + $instance['height'] = ''; + } + + $image = sprintf( + '%3$s', + esc_attr( $classes ), + esc_url( $instance['url'] ), + esc_attr( $instance['alt'] ), + esc_attr( $instance['width'] ), + esc_attr( $instance['height'] ) + ); + } // End if(). + + $url = ''; + if ( 'file' === $instance['link_type'] ) { + $url = $attachment ? wp_get_attachment_url( $attachment->ID ) : $instance['url']; + } elseif ( $attachment && 'post' === $instance['link_type'] ) { + $url = get_attachment_link( $attachment->ID ); + } elseif ( 'custom' === $instance['link_type'] && ! empty( $instance['link_url'] ) ) { + $url = $instance['link_url']; + } + + if ( $url ) { + $link = sprintf( ' $width, + 'caption' => $caption, + ), + $image + ); + } + + echo $image; + } + + /** + * Loads the required media files for the media manager and scripts for media widgets. + * + * @since 4.8.0 + */ + public function enqueue_admin_scripts() { + parent::enqueue_admin_scripts(); + + $handle = 'media-image-widget'; + wp_enqueue_script( $handle ); + + $exported_schema = array(); + foreach ( $this->get_instance_schema() as $field => $field_schema ) { + $exported_schema[ $field ] = wp_array_slice_assoc( $field_schema, array( 'type', 'default', 'enum', 'minimum', 'format', 'media_prop', 'should_preview_update' ) ); + } + wp_add_inline_script( + $handle, + sprintf( + 'wp.mediaWidgets.modelConstructors[ %s ].prototype.schema = %s;', + wp_json_encode( $this->id_base ), + wp_json_encode( $exported_schema ) + ) + ); + + wp_add_inline_script( + $handle, + sprintf( + ' + wp.mediaWidgets.controlConstructors[ %1$s ].prototype.mime_type = %2$s; + wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n = _.extend( {}, wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n, %3$s ); + ', + wp_json_encode( $this->id_base ), + wp_json_encode( $this->widget_options['mime_type'] ), + wp_json_encode( $this->l10n ) + ) + ); + } + + /** + * Render form template scripts. + * + * @since 4.8.0 + */ + public function render_control_template_scripts() { + parent::render_control_template_scripts(); + + ?> + + + __( 'Displays a video from the media library or from YouTube, Vimeo, or another provider.' ), + 'mime_type' => 'video', + ) + ); + + $this->l10n = array_merge( + $this->l10n, + array( + 'no_media_selected' => __( 'No video selected' ), + 'add_media' => _x( 'Add Video', 'label for button in the video widget' ), + 'replace_media' => _x( 'Replace Video', 'label for button in the video widget; should preferably not be longer than ~13 characters long' ), + 'edit_media' => _x( 'Edit Video', 'label for button in the video widget; should preferably not be longer than ~13 characters long' ), + 'missing_attachment' => sprintf( + /* translators: %s: URL to media library. */ + __( 'We can’t find that video. Check your media library and make sure it wasn’t deleted.' ), + esc_url( admin_url( 'upload.php' ) ) + ), + /* translators: %d: Widget count. */ + 'media_library_state_multi' => _n_noop( 'Video Widget (%d)', 'Video Widget (%d)' ), + 'media_library_state_single' => __( 'Video Widget' ), + /* translators: %s: A list of valid video file extensions. */ + 'unsupported_file_type' => sprintf( __( 'Sorry, we can’t load the video at the supplied URL. Please check that the URL is for a supported video file (%s) or stream (e.g. YouTube and Vimeo).' ), '.' . implode( ', .', wp_get_video_extensions() ) . '' ), + ) + ); + } + + /** + * Get schema for properties of a widget instance (item). + * + * @since 4.8.0 + * + * @see WP_REST_Controller::get_item_schema() + * @see WP_REST_Controller::get_additional_fields() + * @link https://core.trac.wordpress.org/ticket/35574 + * + * @return array Schema for properties. + */ + public function get_instance_schema() { + + $schema = array( + 'preload' => array( + 'type' => 'string', + 'enum' => array( 'none', 'auto', 'metadata' ), + 'default' => 'metadata', + 'description' => __( 'Preload' ), + 'should_preview_update' => false, + ), + 'loop' => array( + 'type' => 'boolean', + 'default' => false, + 'description' => __( 'Loop' ), + 'should_preview_update' => false, + ), + 'content' => array( + 'type' => 'string', + 'default' => '', + 'sanitize_callback' => 'wp_kses_post', + 'description' => __( 'Tracks (subtitles, captions, descriptions, chapters, or metadata)' ), + 'should_preview_update' => false, + ), + ); + + foreach ( wp_get_video_extensions() as $video_extension ) { + $schema[ $video_extension ] = array( + 'type' => 'string', + 'default' => '', + 'format' => 'uri', + /* translators: %s: Video extension. */ + 'description' => sprintf( __( 'URL to the %s video source file' ), $video_extension ), + ); + } + + return array_merge( $schema, parent::get_instance_schema() ); + } + + /** + * Render the media on the frontend. + * + * @since 4.8.0 + * + * @param array $instance Widget instance props. + */ + public function render_media( $instance ) { + $instance = array_merge( wp_list_pluck( $this->get_instance_schema(), 'default' ), $instance ); + $attachment = null; + + if ( $this->is_attachment_with_mime_type( $instance['attachment_id'], $this->widget_options['mime_type'] ) ) { + $attachment = get_post( $instance['attachment_id'] ); + } + + $src = $instance['url']; + if ( $attachment ) { + $src = wp_get_attachment_url( $attachment->ID ); + } + + if ( empty( $src ) ) { + return; + } + + $youtube_pattern = '#^https?://(?:www\.)?(?:youtube\.com/watch|youtu\.be/)#'; + $vimeo_pattern = '#^https?://(.+\.)?vimeo\.com/.*#'; + + if ( $attachment || preg_match( $youtube_pattern, $src ) || preg_match( $vimeo_pattern, $src ) ) { + add_filter( 'wp_video_shortcode', array( $this, 'inject_video_max_width_style' ) ); + + echo wp_video_shortcode( + array_merge( + $instance, + compact( 'src' ) + ), + $instance['content'] + ); + + remove_filter( 'wp_video_shortcode', array( $this, 'inject_video_max_width_style' ) ); + } else { + echo $this->inject_video_max_width_style( wp_oembed_get( $src ) ); + } + } + + /** + * Inject max-width and remove height for videos too constrained to fit inside sidebars on frontend. + * + * @since 4.8.0 + * + * @param string $html Video shortcode HTML output. + * @return string HTML Output. + */ + public function inject_video_max_width_style( $html ) { + $html = preg_replace( '/\sheight="\d+"/', '', $html ); + $html = preg_replace( '/\swidth="\d+"/', '', $html ); + $html = preg_replace( '/(?<=width:)\s*\d+px(?=;?)/', '100%', $html ); + return $html; + } + + /** + * Enqueue preview scripts. + * + * These scripts normally are enqueued just-in-time when a video shortcode is used. + * In the customizer, however, widgets can be dynamically added and rendered via + * selective refresh, and so it is important to unconditionally enqueue them in + * case a widget does get added. + * + * @since 4.8.0 + */ + public function enqueue_preview_scripts() { + /** This filter is documented in wp-includes/media.php */ + if ( 'mediaelement' === apply_filters( 'wp_video_shortcode_library', 'mediaelement' ) ) { + wp_enqueue_style( 'wp-mediaelement' ); + wp_enqueue_script( 'mediaelement-vimeo' ); + wp_enqueue_script( 'wp-mediaelement' ); + } + } + + /** + * Loads the required scripts and styles for the widget control. + * + * @since 4.8.0 + */ + public function enqueue_admin_scripts() { + parent::enqueue_admin_scripts(); + + $handle = 'media-video-widget'; + wp_enqueue_script( $handle ); + + $exported_schema = array(); + foreach ( $this->get_instance_schema() as $field => $field_schema ) { + $exported_schema[ $field ] = wp_array_slice_assoc( $field_schema, array( 'type', 'default', 'enum', 'minimum', 'format', 'media_prop', 'should_preview_update' ) ); + } + wp_add_inline_script( + $handle, + sprintf( + 'wp.mediaWidgets.modelConstructors[ %s ].prototype.schema = %s;', + wp_json_encode( $this->id_base ), + wp_json_encode( $exported_schema ) + ) + ); + + wp_add_inline_script( + $handle, + sprintf( + ' + wp.mediaWidgets.controlConstructors[ %1$s ].prototype.mime_type = %2$s; + wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n = _.extend( {}, wp.mediaWidgets.controlConstructors[ %1$s ].prototype.l10n, %3$s ); + ', + wp_json_encode( $this->id_base ), + wp_json_encode( $this->widget_options['mime_type'] ), + wp_json_encode( $this->l10n ) + ) + ); + } + + /** + * Render form template scripts. + * + * @since 4.8.0 + */ + public function render_control_template_scripts() { + parent::render_control_template_scripts() + ?> + + '', + 'replace_media' => '', + 'edit_media' => '', + 'media_library_state_multi' => '', + 'media_library_state_single' => '', + 'missing_attachment' => '', + 'no_media_selected' => '', + 'add_media' => '', + ); + + /** + * Whether or not the widget has been registered yet. + * + * @since 4.8.1 + * @var bool + */ + protected $registered = false; + + /** + * Constructor. + * + * @since 4.8.0 + * + * @param string $id_base Base ID for the widget, lowercase and unique. + * @param string $name Name for the widget displayed on the configuration page. + * @param array $widget_options Optional. Widget options. See wp_register_sidebar_widget() for + * information on accepted arguments. Default empty array. + * @param array $control_options Optional. Widget control options. See wp_register_widget_control() + * for information on accepted arguments. Default empty array. + */ + public function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) { + $widget_opts = wp_parse_args( + $widget_options, + array( + 'description' => __( 'A media item.' ), + 'customize_selective_refresh' => true, + 'mime_type' => '', + ) + ); + + $control_opts = wp_parse_args( $control_options, array() ); + + $l10n_defaults = array( + 'no_media_selected' => __( 'No media selected' ), + 'add_media' => _x( 'Add Media', 'label for button in the media widget' ), + 'replace_media' => _x( 'Replace Media', 'label for button in the media widget; should preferably not be longer than ~13 characters long' ), + 'edit_media' => _x( 'Edit Media', 'label for button in the media widget; should preferably not be longer than ~13 characters long' ), + 'add_to_widget' => __( 'Add to Widget' ), + 'missing_attachment' => sprintf( + /* translators: %s: URL to media library. */ + __( 'We can’t find that file. Check your media library and make sure it wasn’t deleted.' ), + esc_url( admin_url( 'upload.php' ) ) + ), + /* translators: %d: Widget count. */ + 'media_library_state_multi' => _n_noop( 'Media Widget (%d)', 'Media Widget (%d)' ), + 'media_library_state_single' => __( 'Media Widget' ), + 'unsupported_file_type' => __( 'Looks like this isn’t the correct kind of file. Please link to an appropriate file instead.' ), + ); + $this->l10n = array_merge( $l10n_defaults, array_filter( $this->l10n ) ); + + parent::__construct( + $id_base, + $name, + $widget_opts, + $control_opts + ); + } + + /** + * Add hooks while registering all widget instances of this widget class. + * + * @since 4.8.0 + * + * @param integer $number Optional. The unique order number of this widget instance + * compared to other instances of the same class. Default -1. + */ + public function _register_one( $number = -1 ) { + parent::_register_one( $number ); + if ( $this->registered ) { + return; + } + $this->registered = true; + + // Note that the widgets component in the customizer will also do + // the 'admin_print_scripts-widgets.php' action in WP_Customize_Widgets::print_scripts(). + add_action( 'admin_print_scripts-widgets.php', array( $this, 'enqueue_admin_scripts' ) ); + + if ( $this->is_preview() ) { + add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_preview_scripts' ) ); + } + + // Note that the widgets component in the customizer will also do + // the 'admin_footer-widgets.php' action in WP_Customize_Widgets::print_footer_scripts(). + add_action( 'admin_footer-widgets.php', array( $this, 'render_control_template_scripts' ) ); + + add_filter( 'display_media_states', array( $this, 'display_media_state' ), 10, 2 ); + } + + /** + * Get schema for properties of a widget instance (item). + * + * @since 4.8.0 + * + * @see WP_REST_Controller::get_item_schema() + * @see WP_REST_Controller::get_additional_fields() + * @link https://core.trac.wordpress.org/ticket/35574 + * + * @return array Schema for properties. + */ + public function get_instance_schema() { + $schema = array( + 'attachment_id' => array( + 'type' => 'integer', + 'default' => 0, + 'minimum' => 0, + 'description' => __( 'Attachment post ID' ), + 'media_prop' => 'id', + ), + 'url' => array( + 'type' => 'string', + 'default' => '', + 'format' => 'uri', + 'description' => __( 'URL to the media file' ), + ), + 'title' => array( + 'type' => 'string', + 'default' => '', + 'sanitize_callback' => 'sanitize_text_field', + 'description' => __( 'Title for the widget' ), + 'should_preview_update' => false, + ), + ); + + /** + * Filters the media widget instance schema to add additional properties. + * + * @since 4.9.0 + * + * @param array $schema Instance schema. + * @param WP_Widget_Media $this Widget object. + */ + $schema = apply_filters( "widget_{$this->id_base}_instance_schema", $schema, $this ); + + return $schema; + } + + /** + * Determine if the supplied attachment is for a valid attachment post with the specified MIME type. + * + * @since 4.8.0 + * + * @param int|WP_Post $attachment Attachment post ID or object. + * @param string $mime_type MIME type. + * @return bool Is matching MIME type. + */ + public function is_attachment_with_mime_type( $attachment, $mime_type ) { + if ( empty( $attachment ) ) { + return false; + } + $attachment = get_post( $attachment ); + if ( ! $attachment ) { + return false; + } + if ( 'attachment' !== $attachment->post_type ) { + return false; + } + return wp_attachment_is( $mime_type, $attachment ); + } + + /** + * Sanitize a token list string, such as used in HTML rel and class attributes. + * + * @since 4.8.0 + * + * @link http://w3c.github.io/html/infrastructure.html#space-separated-tokens + * @link https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList + * @param string|array $tokens List of tokens separated by spaces, or an array of tokens. + * @return string Sanitized token string list. + */ + public function sanitize_token_list( $tokens ) { + if ( is_string( $tokens ) ) { + $tokens = preg_split( '/\s+/', trim( $tokens ) ); + } + $tokens = array_map( 'sanitize_html_class', $tokens ); + $tokens = array_filter( $tokens ); + return join( ' ', $tokens ); + } + + /** + * Displays the widget on the front-end. + * + * @since 4.8.0 + * + * @see WP_Widget::widget() + * + * @param array $args Display arguments including before_title, after_title, before_widget, and after_widget. + * @param array $instance Saved setting from the database. + */ + public function widget( $args, $instance ) { + $instance = wp_parse_args( $instance, wp_list_pluck( $this->get_instance_schema(), 'default' ) ); + + // Short-circuit if no media is selected. + if ( ! $this->has_content( $instance ) ) { + return; + } + + echo $args['before_widget']; + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base ); + + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + + /** + * Filters the media widget instance prior to rendering the media. + * + * @since 4.8.0 + * + * @param array $instance Instance data. + * @param array $args Widget args. + * @param WP_Widget_Media $this Widget object. + */ + $instance = apply_filters( "widget_{$this->id_base}_instance", $instance, $args, $this ); + + $this->render_media( $instance ); + + echo $args['after_widget']; + } + + /** + * Sanitizes the widget form values as they are saved. + * + * @since 4.8.0 + * + * @see WP_Widget::update() + * @see WP_REST_Request::has_valid_params() + * @see WP_REST_Request::sanitize_params() + * + * @param array $new_instance Values just sent to be saved. + * @param array $instance Previously saved values from database. + * @return array Updated safe values to be saved. + */ + public function update( $new_instance, $instance ) { + + $schema = $this->get_instance_schema(); + foreach ( $schema as $field => $field_schema ) { + if ( ! array_key_exists( $field, $new_instance ) ) { + continue; + } + $value = $new_instance[ $field ]; + + /* + * Workaround for rest_validate_value_from_schema() due to the fact that + * rest_is_boolean( '' ) === false, while rest_is_boolean( '1' ) is true. + */ + if ( 'boolean' === $field_schema['type'] && '' === $value ) { + $value = false; + } + + if ( true !== rest_validate_value_from_schema( $value, $field_schema, $field ) ) { + continue; + } + + $value = rest_sanitize_value_from_schema( $value, $field_schema ); + + // @codeCoverageIgnoreStart + if ( is_wp_error( $value ) ) { + continue; // Handle case when rest_sanitize_value_from_schema() ever returns WP_Error as its phpdoc @return tag indicates. + } + + // @codeCoverageIgnoreEnd + if ( isset( $field_schema['sanitize_callback'] ) ) { + $value = call_user_func( $field_schema['sanitize_callback'], $value ); + } + if ( is_wp_error( $value ) ) { + continue; + } + $instance[ $field ] = $value; + } + + return $instance; + } + + /** + * Render the media on the frontend. + * + * @since 4.8.0 + * + * @param array $instance Widget instance props. + * @return string + */ + abstract public function render_media( $instance ); + + /** + * Outputs the settings update form. + * + * Note that the widget UI itself is rendered with JavaScript via `MediaWidgetControl#render()`. + * + * @since 4.8.0 + * + * @see \WP_Widget_Media::render_control_template_scripts() Where the JS template is located. + * + * @param array $instance Current settings. + */ + final public function form( $instance ) { + $instance_schema = $this->get_instance_schema(); + $instance = wp_array_slice_assoc( + wp_parse_args( (array) $instance, wp_list_pluck( $instance_schema, 'default' ) ), + array_keys( $instance_schema ) + ); + + foreach ( $instance as $name => $value ) : ?> + + get_settings() as $instance ) { + if ( isset( $instance['attachment_id'] ) && $instance['attachment_id'] === $post->ID ) { + $use_count++; + } + } + + if ( 1 === $use_count ) { + $states[] = $this->l10n['media_library_state_single']; + } elseif ( $use_count > 0 ) { + $states[] = sprintf( translate_nooped_plural( $this->l10n['media_library_state_multi'], $use_count ), number_format_i18n( $use_count ) ); + } + + return $states; + } + + /** + * Enqueue preview scripts. + * + * These scripts normally are enqueued just-in-time when a widget is rendered. + * In the customizer, however, widgets can be dynamically added and rendered via + * selective refresh, and so it is important to unconditionally enqueue them in + * case a widget does get added. + * + * @since 4.8.0 + */ + public function enqueue_preview_scripts() {} + + /** + * Loads the required scripts and styles for the widget control. + * + * @since 4.8.0 + */ + public function enqueue_admin_scripts() { + wp_enqueue_media(); + wp_enqueue_script( 'media-widgets' ); + } + + /** + * Render form template scripts. + * + * @since 4.8.0 + */ + public function render_control_template_scripts() { + ?> + + 'widget_meta', + 'description' => __( 'Login, RSS, & WordPress.org links.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'meta', __( 'Meta' ), $widget_ops ); + } + + /** + * Outputs the content for the current Meta widget instance. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Meta widget instance. + */ + public function widget( $args, $instance ) { + $title = ! empty( $instance['title'] ) ? $instance['title'] : __( 'Meta' ); + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + echo $args['before_widget']; + + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + ?> +
                  + +
                • +
                • +
                • + %2$s', + esc_url( __( 'https://wordpress.org/' ) ), + __( 'WordPress.org' ) + ), + $instance + ); + + wp_meta(); + ?> +
                + '' ) ); + ?> +

                + 'widget_pages', + 'description' => __( 'A list of your site’s Pages.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'pages', __( 'Pages' ), $widget_ops ); + } + + /** + * Outputs the content for the current Pages widget instance. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Pages widget instance. + */ + public function widget( $args, $instance ) { + $title = ! empty( $instance['title'] ) ? $instance['title'] : __( 'Pages' ); + + /** + * Filters the widget title. + * + * @since 2.6.0 + * + * @param string $title The widget title. Default 'Pages'. + * @param array $instance Array of settings for the current widget. + * @param mixed $id_base The widget ID. + */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + $sortby = empty( $instance['sortby'] ) ? 'menu_order' : $instance['sortby']; + $exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude']; + + if ( 'menu_order' === $sortby ) { + $sortby = 'menu_order, post_title'; + } + + $out = wp_list_pages( + /** + * Filters the arguments for the Pages widget. + * + * @since 2.8.0 + * @since 4.9.0 Added the `$instance` parameter. + * + * @see wp_list_pages() + * + * @param array $args An array of arguments to retrieve the pages list. + * @param array $instance Array of settings for the current widget. + */ + apply_filters( + 'widget_pages_args', + array( + 'title_li' => '', + 'echo' => 0, + 'sort_column' => $sortby, + 'exclude' => $exclude, + ), + $instance + ) + ); + + if ( ! empty( $out ) ) { + echo $args['before_widget']; + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + ?> +
                  + +
                + 'post_title', + 'title' => '', + 'exclude' => '', + ) + ); + ?> +

                + + +

                +

                + + +

                +

                + + +
                + +

                + 'widget_recent_comments', + 'description' => __( 'Your site’s most recent comments.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'recent-comments', __( 'Recent Comments' ), $widget_ops ); + $this->alt_option_name = 'widget_recent_comments'; + + if ( is_active_widget( false, false, $this->id_base ) || is_customize_preview() ) { + add_action( 'wp_head', array( $this, 'recent_comments_style' ) ); + } + } + + /** + * Outputs the default styles for the Recent Comments widget. + * + * @since 2.8.0 + */ + public function recent_comments_style() { + /** + * Filters the Recent Comments default widget styles. + * + * @since 3.1.0 + * + * @param bool $active Whether the widget is active. Default true. + * @param string $id_base The widget ID. + */ + if ( ! current_theme_supports( 'widgets' ) // Temp hack #14876. + || ! apply_filters( 'show_recent_comments_widget_style', true, $this->id_base ) ) { + return; + } + + $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; + + printf( + '.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}', + $type_attr + ); + } + + /** + * Outputs the content for the current Recent Comments widget instance. + * + * @since 2.8.0 + * @since 5.4.0 Creates a unique HTML ID for the `
                  ` element + * if more than one instance is displayed on the page. + * + * @staticvar bool $first_instance + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Recent Comments widget instance. + */ + public function widget( $args, $instance ) { + static $first_instance = true; + + if ( ! isset( $args['widget_id'] ) ) { + $args['widget_id'] = $this->id; + } + + $output = ''; + + $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Recent Comments' ); + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + $number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5; + if ( ! $number ) { + $number = 5; + } + + $comments = get_comments( + /** + * Filters the arguments for the Recent Comments widget. + * + * @since 3.4.0 + * @since 4.9.0 Added the `$instance` parameter. + * + * @see WP_Comment_Query::query() for information on accepted arguments. + * + * @param array $comment_args An array of arguments used to retrieve the recent comments. + * @param array $instance Array of settings for the current widget. + */ + apply_filters( + 'widget_comments_args', + array( + 'number' => $number, + 'status' => 'approve', + 'post_status' => 'publish', + ), + $instance + ) + ); + + $output .= $args['before_widget']; + if ( $title ) { + $output .= $args['before_title'] . $title . $args['after_title']; + } + + $recent_comments_id = ( $first_instance ) ? 'recentcomments' : "recentcomments-{$this->number}"; + $first_instance = false; + + $output .= '
                    '; + if ( is_array( $comments ) && $comments ) { + // Prime cache for associated posts. (Prime post term cache if we need it for permalinks.) + $post_ids = array_unique( wp_list_pluck( $comments, 'comment_post_ID' ) ); + _prime_post_caches( $post_ids, strpos( get_option( 'permalink_structure' ), '%category%' ), false ); + + foreach ( (array) $comments as $comment ) { + $output .= '
                  • '; + $output .= sprintf( + /* translators: Comments widget. 1: Comment author, 2: Post link. */ + _x( '%1$s on %2$s', 'widgets' ), + '' . get_comment_author_link( $comment ) . '', + '' . get_the_title( $comment->comment_post_ID ) . '' + ); + $output .= '
                  • '; + } + } + $output .= '
                  '; + $output .= $args['after_widget']; + + echo $output; + } + + /** + * Handles updating settings for the current Recent Comments widget instance. + * + * @since 2.8.0 + * + * @param array $new_instance New settings for this instance as input by the user via + * WP_Widget::form(). + * @param array $old_instance Old settings for this instance. + * @return array Updated settings to save. + */ + public function update( $new_instance, $old_instance ) { + $instance = $old_instance; + $instance['title'] = sanitize_text_field( $new_instance['title'] ); + $instance['number'] = absint( $new_instance['number'] ); + return $instance; + } + + /** + * Outputs the settings form for the Recent Comments widget. + * + * @since 2.8.0 + * + * @param array $instance Current settings. + */ + public function form( $instance ) { + $title = isset( $instance['title'] ) ? $instance['title'] : ''; + $number = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5; + ?> +

                  +

                  + +

                  +

                  + 'widget_recent_entries', + 'description' => __( 'Your site’s most recent Posts.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'recent-posts', __( 'Recent Posts' ), $widget_ops ); + $this->alt_option_name = 'widget_recent_entries'; + } + + /** + * Outputs the content for the current Recent Posts widget instance. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Recent Posts widget instance. + */ + public function widget( $args, $instance ) { + if ( ! isset( $args['widget_id'] ) ) { + $args['widget_id'] = $this->id; + } + + $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Recent Posts' ); + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + $number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5; + if ( ! $number ) { + $number = 5; + } + $show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false; + + $r = new WP_Query( + /** + * Filters the arguments for the Recent Posts widget. + * + * @since 3.4.0 + * @since 4.9.0 Added the `$instance` parameter. + * + * @see WP_Query::get_posts() + * + * @param array $args An array of arguments used to retrieve the recent posts. + * @param array $instance Array of settings for the current widget. + */ + apply_filters( + 'widget_posts_args', + array( + 'posts_per_page' => $number, + 'no_found_rows' => true, + 'post_status' => 'publish', + 'ignore_sticky_posts' => true, + ), + $instance + ) + ); + + if ( ! $r->have_posts() ) { + return; + } + ?> + + +
                    + posts as $recent_post ) : ?> + ID ); + $title = ( ! empty( $post_title ) ) ? $post_title : __( '(no title)' ); + $aria_current = ''; + + if ( get_queried_object_id() === $recent_post->ID ) { + $aria_current = ' aria-current="page"'; + } + ?> +
                  • + > + + + +
                  • + +
                  + +

                  +

                  + +

                  +

                  + +

                  id="get_field_id( 'show_date' ); ?>" name="get_field_name( 'show_date' ); ?>" /> +

                  + __( 'Entries from any RSS or Atom feed.' ), + 'customize_selective_refresh' => true, + ); + $control_ops = array( + 'width' => 400, + 'height' => 200, + ); + parent::__construct( 'rss', __( 'RSS' ), $widget_ops, $control_ops ); + } + + /** + * Outputs the content for the current RSS widget instance. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current RSS widget instance. + */ + public function widget( $args, $instance ) { + if ( isset( $instance['error'] ) && $instance['error'] ) { + return; + } + + $url = ! empty( $instance['url'] ) ? $instance['url'] : ''; + while ( stristr( $url, 'http' ) != $url ) { + $url = substr( $url, 1 ); + } + + if ( empty( $url ) ) { + return; + } + + // Self-URL destruction sequence. + if ( in_array( untrailingslashit( $url ), array( site_url(), home_url() ) ) ) { + return; + } + + $rss = fetch_feed( $url ); + $title = $instance['title']; + $desc = ''; + $link = ''; + + if ( ! is_wp_error( $rss ) ) { + $desc = esc_attr( strip_tags( html_entity_decode( $rss->get_description(), ENT_QUOTES, get_option( 'blog_charset' ) ) ) ); + if ( empty( $title ) ) { + $title = strip_tags( $rss->get_title() ); + } + $link = strip_tags( $rss->get_permalink() ); + while ( stristr( $link, 'http' ) != $link ) { + $link = substr( $link, 1 ); + } + } + + if ( empty( $title ) ) { + $title = ! empty( $desc ) ? $desc : __( 'Unknown Feed' ); + } + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + $url = strip_tags( $url ); + $icon = includes_url( 'images/rss.png' ); + if ( $title ) { + $title = 'RSS ' . esc_html( $title ) . ''; + } + + echo $args['before_widget']; + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + wp_widget_rss_output( $rss, $instance ); + echo $args['after_widget']; + + if ( ! is_wp_error( $rss ) ) { + $rss->__destruct(); + } + unset( $rss ); + } + + /** + * Handles updating settings for the current RSS widget instance. + * + * @since 2.8.0 + * + * @param array $new_instance New settings for this instance as input by the user via + * WP_Widget::form(). + * @param array $old_instance Old settings for this instance. + * @return array Updated settings to save. + */ + public function update( $new_instance, $old_instance ) { + $testurl = ( isset( $new_instance['url'] ) && ( ! isset( $old_instance['url'] ) || ( $new_instance['url'] != $old_instance['url'] ) ) ); + return wp_widget_rss_process( $new_instance, $testurl ); + } + + /** + * Outputs the settings form for the RSS widget. + * + * @since 2.8.0 + * + * @param array $instance Current settings. + */ + public function form( $instance ) { + if ( empty( $instance ) ) { + $instance = array( + 'title' => '', + 'url' => '', + 'items' => 10, + 'error' => false, + 'show_summary' => 0, + 'show_author' => 0, + 'show_date' => 0, + ); + } + $instance['number'] = $this->number; + + wp_widget_rss_form( $instance ); + } +} diff --git a/wp-includes/widgets/class-wp-widget-search.php b/wp-includes/widgets/class-wp-widget-search.php new file mode 100644 index 0000000..c7c794b --- /dev/null +++ b/wp-includes/widgets/class-wp-widget-search.php @@ -0,0 +1,91 @@ + 'widget_search', + 'description' => __( 'A search form for your site.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'search', _x( 'Search', 'Search widget' ), $widget_ops ); + } + + /** + * Outputs the content for the current Search widget instance. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Search widget instance. + */ + public function widget( $args, $instance ) { + $title = ! empty( $instance['title'] ) ? $instance['title'] : ''; + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + echo $args['before_widget']; + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + + // Use current theme search form if it exists. + get_search_form(); + + echo $args['after_widget']; + } + + /** + * Outputs the settings form for the Search widget. + * + * @since 2.8.0 + * + * @param array $instance Current settings. + */ + public function form( $instance ) { + $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) ); + $title = $instance['title']; + ?> +

                  + '' ) ); + $instance['title'] = sanitize_text_field( $new_instance['title'] ); + return $instance; + } + +} diff --git a/wp-includes/widgets/class-wp-widget-tag-cloud.php b/wp-includes/widgets/class-wp-widget-tag-cloud.php new file mode 100644 index 0000000..6542250 --- /dev/null +++ b/wp-includes/widgets/class-wp-widget-tag-cloud.php @@ -0,0 +1,203 @@ + __( 'A cloud of your most used tags.' ), + 'customize_selective_refresh' => true, + ); + parent::__construct( 'tag_cloud', __( 'Tag Cloud' ), $widget_ops ); + } + + /** + * Outputs the content for the current Tag Cloud widget instance. + * + * @since 2.8.0 + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Tag Cloud widget instance. + */ + public function widget( $args, $instance ) { + $current_taxonomy = $this->_get_current_taxonomy( $instance ); + + if ( ! empty( $instance['title'] ) ) { + $title = $instance['title']; + } else { + if ( 'post_tag' === $current_taxonomy ) { + $title = __( 'Tags' ); + } else { + $tax = get_taxonomy( $current_taxonomy ); + $title = $tax->labels->name; + } + } + + $show_count = ! empty( $instance['count'] ); + + $tag_cloud = wp_tag_cloud( + /** + * Filters the taxonomy used in the Tag Cloud widget. + * + * @since 2.8.0 + * @since 3.0.0 Added taxonomy drop-down. + * @since 4.9.0 Added the `$instance` parameter. + * + * @see wp_tag_cloud() + * + * @param array $args Args used for the tag cloud widget. + * @param array $instance Array of settings for the current widget. + */ + apply_filters( + 'widget_tag_cloud_args', + array( + 'taxonomy' => $current_taxonomy, + 'echo' => false, + 'show_count' => $show_count, + ), + $instance + ) + ); + + if ( empty( $tag_cloud ) ) { + return; + } + + /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ + $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); + + echo $args['before_widget']; + if ( $title ) { + echo $args['before_title'] . $title . $args['after_title']; + } + + echo '
                  '; + + echo $tag_cloud; + + echo "
                  \n"; + echo $args['after_widget']; + } + + /** + * Handles updating settings for the current Tag Cloud widget instance. + * + * @since 2.8.0 + * + * @param array $new_instance New settings for this instance as input by the user via + * WP_Widget::form(). + * @param array $old_instance Old settings for this instance. + * @return array Settings to save or bool false to cancel saving. + */ + public function update( $new_instance, $old_instance ) { + $instance = array(); + $instance['title'] = sanitize_text_field( $new_instance['title'] ); + $instance['count'] = ! empty( $new_instance['count'] ) ? 1 : 0; + $instance['taxonomy'] = stripslashes( $new_instance['taxonomy'] ); + return $instance; + } + + /** + * Outputs the Tag Cloud widget settings form. + * + * @since 2.8.0 + * + * @param array $instance Current settings. + */ + public function form( $instance ) { + $current_taxonomy = $this->_get_current_taxonomy( $instance ); + $title_id = $this->get_field_id( 'title' ); + $count = isset( $instance['count'] ) ? (bool) $instance['count'] : false; + $instance['title'] = ! empty( $instance['title'] ) ? esc_attr( $instance['title'] ) : ''; + + echo '

                  + +

                  '; + + $taxonomies = get_taxonomies( array( 'show_tagcloud' => true ), 'object' ); + $id = $this->get_field_id( 'taxonomy' ); + $name = $this->get_field_name( 'taxonomy' ); + $input = ''; + + $count_checkbox = sprintf( + '

                  ', + $this->get_field_id( 'count' ), + $this->get_field_name( 'count' ), + checked( $count, true, false ), + __( 'Show tag counts' ) + ); + + switch ( count( $taxonomies ) ) { + + // No tag cloud supporting taxonomies found, display error message. + case 0: + echo '

                  ' . __( 'The tag cloud will not be displayed since there are no taxonomies that support the tag cloud widget.' ) . '

                  '; + printf( $input, '' ); + break; + + // Just a single tag cloud supporting taxonomy found, no need to display a select. + case 1: + $keys = array_keys( $taxonomies ); + $taxonomy = reset( $keys ); + printf( $input, esc_attr( $taxonomy ) ); + echo $count_checkbox; + break; + + // More than one tag cloud supporting taxonomy found, display a select. + default: + printf( + '

                  ' . + '

                  ' . $count_checkbox; + } + } + + /** + * Retrieves the taxonomy for the current Tag cloud widget instance. + * + * @since 4.4.0 + * + * @param array $instance Current settings. + * @return string Name of the current taxonomy if set, otherwise 'post_tag'. + */ + public function _get_current_taxonomy( $instance ) { + if ( ! empty( $instance['taxonomy'] ) && taxonomy_exists( $instance['taxonomy'] ) ) { + return $instance['taxonomy']; + } + + return 'post_tag'; + } +} diff --git a/wp-includes/widgets/class-wp-widget-text.php b/wp-includes/widgets/class-wp-widget-text.php new file mode 100644 index 0000000..bd9c1df --- /dev/null +++ b/wp-includes/widgets/class-wp-widget-text.php @@ -0,0 +1,569 @@ + 'widget_text', + 'description' => __( 'Arbitrary text.' ), + 'customize_selective_refresh' => true, + ); + $control_ops = array( + 'width' => 400, + 'height' => 350, + ); + parent::__construct( 'text', __( 'Text' ), $widget_ops, $control_ops ); + } + + /** + * Add hooks for enqueueing assets when registering all widget instances of this widget class. + * + * @param integer $number Optional. The unique order number of this widget instance + * compared to other instances of the same class. Default -1. + */ + public function _register_one( $number = -1 ) { + parent::_register_one( $number ); + if ( $this->registered ) { + return; + } + $this->registered = true; + + wp_add_inline_script( 'text-widgets', sprintf( 'wp.textWidgets.idBases.push( %s );', wp_json_encode( $this->id_base ) ) ); + + if ( $this->is_preview() ) { + add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_preview_scripts' ) ); + } + + // Note that the widgets component in the customizer will also do + // the 'admin_print_scripts-widgets.php' action in WP_Customize_Widgets::print_scripts(). + add_action( 'admin_print_scripts-widgets.php', array( $this, 'enqueue_admin_scripts' ) ); + + // Note that the widgets component in the customizer will also do + // the 'admin_footer-widgets.php' action in WP_Customize_Widgets::print_footer_scripts(). + add_action( 'admin_footer-widgets.php', array( 'WP_Widget_Text', 'render_control_template_scripts' ) ); + } + + /** + * Determines whether a given instance is legacy and should bypass using TinyMCE. + * + * @since 4.8.1 + * + * @param array $instance { + * Instance data. + * + * @type string $text Content. + * @type bool|string $filter Whether autop or content filters should apply. + * @type bool $legacy Whether widget is in legacy mode. + * } + * @return bool Whether Text widget instance contains legacy data. + */ + public function is_legacy_instance( $instance ) { + + // Legacy mode when not in visual mode. + if ( isset( $instance['visual'] ) ) { + return ! $instance['visual']; + } + + // Or, the widget has been added/updated in 4.8.0 then filter prop is 'content' and it is no longer legacy. + if ( isset( $instance['filter'] ) && 'content' === $instance['filter'] ) { + return false; + } + + // If the text is empty, then nothing is preventing migration to TinyMCE. + if ( empty( $instance['text'] ) ) { + return false; + } + + $wpautop = ! empty( $instance['filter'] ); + $has_line_breaks = ( false !== strpos( trim( $instance['text'] ), "\n" ) ); + + // If auto-paragraphs are not enabled and there are line breaks, then ensure legacy mode. + if ( ! $wpautop && $has_line_breaks ) { + return true; + } + + // If an HTML comment is present, assume legacy mode. + if ( false !== strpos( $instance['text'], ' + + > + + + + <?php echo $login_title; ?> + get_error_code() ) { + ?> + + + + + + + + +
                  +

                  + add( 'error', $error ); + unset( $error ); + } + + if ( $wp_error->has_errors() ) { + $errors = ''; + $messages = ''; + + foreach ( $wp_error->get_error_codes() as $code ) { + $severity = $wp_error->get_error_data( $code ); + foreach ( $wp_error->get_error_messages( $code ) as $error_message ) { + if ( 'message' === $severity ) { + $messages .= ' ' . $error_message . "
                  \n"; + } else { + $errors .= ' ' . $error_message . "
                  \n"; + } + } + } + + if ( ! empty( $errors ) ) { + /** + * Filters the error messages displayed above the login form. + * + * @since 2.1.0 + * + * @param string $errors Login error message. + */ + echo '
                  ' . apply_filters( 'login_errors', $errors ) . "
                  \n"; + } + + if ( ! empty( $messages ) ) { + /** + * Filters instructional messages displayed above the login form. + * + * @since 2.5.0 + * + * @param string $messages Login messages. + */ + echo '

                  ' . apply_filters( 'login_messages', $messages ) . "

                  \n"; + } + } +} // End of login_header(). + +/** + * Outputs the footer for the login page. + * + * @since 3.1.0 + * + * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success' + * upon successful login. + * + * @param string $input_id Which input to auto-focus. + */ +function login_footer( $input_id = '' ) { + global $interim_login; + + // Don't allow interim logins to navigate away from the page. + if ( ! $interim_login ) { + ?> +

                  + +

                  + ', '
                  ' ); + } + + ?> +
                . ?> + + + + +
                + + + + + + + add( 'empty_username', __( 'Error: Enter a username or email address.' ) ); + } elseif ( strpos( $_POST['user_login'], '@' ) ) { + $user_data = get_user_by( 'email', trim( wp_unslash( $_POST['user_login'] ) ) ); + if ( empty( $user_data ) ) { + $errors->add( 'invalid_email', __( 'Error: There is no account with that username or email address.' ) ); + } + } else { + $login = trim( wp_unslash( $_POST['user_login'] ) ); + $user_data = get_user_by( 'login', $login ); + } + + /** + * Fires before errors are returned from a password reset request. + * + * @since 2.1.0 + * @since 4.4.0 Added the `$errors` parameter. + * @since 5.4.0 Added the `$user_data` parameter. + * + * @param WP_Error $errors A WP_Error object containing any errors generated + * by using invalid credentials. + * @param WP_User|false WP_User object if found, false if the user does not exist. + */ + do_action( 'lostpassword_post', $errors, $user_data ); + + if ( $errors->has_errors() ) { + return $errors; + } + + if ( ! $user_data ) { + $errors->add( 'invalidcombo', __( 'Error: There is no account with that username or email address.' ) ); + return $errors; + } + + // Redefining user_login ensures we return the right case in the email. + $user_login = $user_data->user_login; + $user_email = $user_data->user_email; + $key = get_password_reset_key( $user_data ); + + if ( is_wp_error( $key ) ) { + return $key; + } + + if ( is_multisite() ) { + $site_name = get_network()->site_name; + } else { + /* + * The blogname option is escaped with esc_html on the way into the database + * in sanitize_option we want to reverse this for the plain text arena of emails. + */ + $site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); + } + + $message = __( 'Someone has requested a password reset for the following account:' ) . "\r\n\r\n"; + /* translators: %s: Site name. */ + $message .= sprintf( __( 'Site Name: %s' ), $site_name ) . "\r\n\r\n"; + /* translators: %s: User login. */ + $message .= sprintf( __( 'Username: %s' ), $user_login ) . "\r\n\r\n"; + $message .= __( 'If this was a mistake, just ignore this email and nothing will happen.' ) . "\r\n\r\n"; + $message .= __( 'To reset your password, visit the following address:' ) . "\r\n\r\n"; + $message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . "\r\n"; + + /* translators: Password reset notification email subject. %s: Site title. */ + $title = sprintf( __( '[%s] Password Reset' ), $site_name ); + + /** + * Filters the subject of the password reset email. + * + * @since 2.8.0 + * @since 4.4.0 Added the `$user_login` and `$user_data` parameters. + * + * @param string $title Default email title. + * @param string $user_login The username for the user. + * @param WP_User $user_data WP_User object. + */ + $title = apply_filters( 'retrieve_password_title', $title, $user_login, $user_data ); + + /** + * Filters the message body of the password reset mail. + * + * If the filtered message is empty, the password reset email will not be sent. + * + * @since 2.8.0 + * @since 4.1.0 Added `$user_login` and `$user_data` parameters. + * + * @param string $message Default mail message. + * @param string $key The activation key. + * @param string $user_login The username for the user. + * @param WP_User $user_data WP_User object. + */ + $message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data ); + + if ( $message && ! wp_mail( $user_email, wp_specialchars_decode( $title ), $message ) ) { + $errors->add( + 'retrieve_password_email_failure', + sprintf( + /* translators: %s: Documentation URL. */ + __( 'Error: The email could not be sent. Your site may not be correctly configured to send emails. Get support for resetting your password.' ), + esc_url( __( 'https://wordpress.org/support/article/resetting-your-password/' ) ) + ) + ); + return $errors; + } + + return true; +} + +// +// Main. +// + +$action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'login'; +$errors = new WP_Error(); + +if ( isset( $_GET['key'] ) ) { + $action = 'resetpass'; +} + +$default_actions = array( + 'confirm_admin_email', + 'postpass', + 'logout', + 'lostpassword', + 'retrievepassword', + 'resetpass', + 'rp', + 'register', + 'login', + 'confirmaction', + WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED, +); + +// Validate action so as to default to the login screen. +if ( ! in_array( $action, $default_actions, true ) && false === has_filter( 'login_form_' . $action ) ) { + $action = 'login'; +} + +nocache_headers(); + +header( 'Content-Type: ' . get_bloginfo( 'html_type' ) . '; charset=' . get_bloginfo( 'charset' ) ); + +if ( defined( 'RELOCATE' ) && RELOCATE ) { // Move flag is set. + if ( isset( $_SERVER['PATH_INFO'] ) && ( $_SERVER['PATH_INFO'] !== $_SERVER['PHP_SELF'] ) ) { + $_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] ); + } + + $url = dirname( set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ) ); + + if ( get_option( 'siteurl' ) !== $url ) { + update_option( 'siteurl', $url ); + } +} + +// Set a cookie now to see if they are supported by the browser. +$secure = ( 'https' === parse_url( wp_login_url(), PHP_URL_SCHEME ) ); +setcookie( TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, $secure ); + +if ( SITECOOKIEPATH !== COOKIEPATH ) { + setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure ); +} + +/** + * Fires when the login form is initialized. + * + * @since 3.2.0 + */ +do_action( 'login_init' ); + +/** + * Fires before a specified login form action. + * + * The dynamic portion of the hook name, `$action`, refers to the action + * that brought the visitor to the login form. Actions include 'postpass', + * 'logout', 'lostpassword', etc. + * + * @since 2.8.0 + */ +do_action( "login_form_{$action}" ); + +$http_post = ( 'POST' === $_SERVER['REQUEST_METHOD'] ); +$interim_login = isset( $_REQUEST['interim-login'] ); + +/** + * Filters the separator used between login form navigation links. + * + * @since 4.9.0 + * + * @param string $login_link_separator The separator used between login form navigation links. + */ +$login_link_separator = apply_filters( 'login_link_separator', ' | ' ); + +switch ( $action ) { + + case 'confirm_admin_email': + /* + * Note that `is_user_logged_in()` will return false immediately after logging in + * as the current user is not set, see wp-includes/pluggable.php. + * However this action runs on a redirect after logging in. + */ + if ( ! is_user_logged_in() ) { + wp_safe_redirect( wp_login_url() ); + exit; + } + + if ( ! empty( $_REQUEST['redirect_to'] ) ) { + $redirect_to = $_REQUEST['redirect_to']; + } else { + $redirect_to = admin_url(); + } + + if ( current_user_can( 'manage_options' ) ) { + $admin_email = get_option( 'admin_email' ); + } else { + wp_safe_redirect( $redirect_to ); + exit; + } + + /** + * Filters the interval for dismissing the admin email confirmation screen. + * + * If `0` (zero) is returned, the "Remind me later" link will not be displayed. + * + * @since 5.3.1 + * + * @param int $interval Interval time (in seconds). Default is 3 days. + */ + $remind_interval = (int) apply_filters( 'admin_email_remind_interval', 3 * DAY_IN_SECONDS ); + + if ( ! empty( $_GET['remind_me_later'] ) ) { + if ( ! wp_verify_nonce( $_GET['remind_me_later'], 'remind_me_later_nonce' ) ) { + wp_safe_redirect( wp_login_url() ); + exit; + } + + if ( $remind_interval > 0 ) { + update_option( 'admin_email_lifespan', time() + $remind_interval ); + } + + wp_safe_redirect( $redirect_to ); + exit; + } + + if ( ! empty( $_POST['correct-admin-email'] ) ) { + if ( ! check_admin_referer( 'confirm_admin_email', 'confirm_admin_email_nonce' ) ) { + wp_safe_redirect( wp_login_url() ); + exit; + } + + /** + * Filters the interval for redirecting the user to the admin email confirmation screen. + * + * If `0` (zero) is returned, the user will not be redirected. + * + * @since 5.3.0 + * + * @param int $interval Interval time (in seconds). Default is 6 months. + */ + $admin_email_check_interval = (int) apply_filters( 'admin_email_check_interval', 6 * MONTH_IN_SECONDS ); + + if ( $admin_email_check_interval > 0 ) { + update_option( 'admin_email_lifespan', time() + $admin_email_check_interval ); + } + + wp_safe_redirect( $redirect_to ); + exit; + } + + login_header( __( 'Confirm your administration email' ), '', $errors ); + + /** + * Fires before the admin email confirm form. + * + * @since 5.3.0 + * + * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid + * credentials. Note that the error object may not contain any errors. + */ + do_action( 'admin_email_confirm', $errors ); + + ?> + +
                + + + +

                + +

                +

                + administration email for this website is still correct.' ); ?> + %s', __( '(opens in a new tab)' ) ); + + printf( + '%s%s', + esc_url( $admin_email_help_url ), + __( 'Why is this important?' ), + $accessibility_text + ); + + ?> +

                +

                + ' . esc_html( $admin_email ) . '' + ); + + ?> +

                +

                + +

                + +
                +
                + + + +
                + 0 ) : ?> +
                + 'confirm_admin_email', + 'remind_me_later' => wp_create_nonce( 'remind_me_later_nonce' ), + ), + $remind_me_link + ); + + ?> + +
                + +
                +
                + + HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure ); + + wp_safe_redirect( wp_get_referer() ); + exit(); + + case 'logout': + check_admin_referer( 'log-out' ); + + $user = wp_get_current_user(); + + wp_logout(); + + if ( ! empty( $_REQUEST['redirect_to'] ) ) { + $redirect_to = $_REQUEST['redirect_to']; + $requested_redirect_to = $redirect_to; + } else { + $redirect_to = add_query_arg( + array( + 'loggedout' => 'true', + 'wp_lang' => get_user_locale( $user ), + ), + wp_login_url() + ); + + $requested_redirect_to = ''; + } + + /** + * Filters the log out redirect URL. + * + * @since 4.2.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User $user The WP_User object for the user that's logging out. + */ + $redirect_to = apply_filters( 'logout_redirect', $redirect_to, $requested_redirect_to, $user ); + + wp_safe_redirect( $redirect_to ); + exit(); + + case 'lostpassword': + case 'retrievepassword': + if ( $http_post ) { + $errors = retrieve_password(); + + if ( ! is_wp_error( $errors ) ) { + $redirect_to = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm'; + wp_safe_redirect( $redirect_to ); + exit(); + } + } + + if ( isset( $_GET['error'] ) ) { + if ( 'invalidkey' === $_GET['error'] ) { + $errors->add( 'invalidkey', __( 'Your password reset link appears to be invalid. Please request a new link below.' ) ); + } elseif ( 'expiredkey' === $_GET['error'] ) { + $errors->add( 'expiredkey', __( 'Your password reset link has expired. Please request a new link below.' ) ); + } + } + + $lostpassword_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : ''; + /** + * Filters the URL redirected to after submitting the lostpassword/retrievepassword form. + * + * @since 3.0.0 + * + * @param string $lostpassword_redirect The redirect destination URL. + */ + $redirect_to = apply_filters( 'lostpassword_redirect', $lostpassword_redirect ); + + /** + * Fires before the lost password form. + * + * @since 1.5.1 + * @since 5.1.0 Added the `$errors` parameter. + * + * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid + * credentials. Note that the error object may not contain any errors. + */ + do_action( 'lost_password', $errors ); + + login_header( __( 'Lost Password' ), '

                ' . __( 'Please enter your username or email address. You will receive an email message with instructions on how to reset your password.' ) . '

                ', $errors ); + + $user_login = ''; + + if ( isset( $_POST['user_login'] ) && is_string( $_POST['user_login'] ) ) { + $user_login = wp_unslash( $_POST['user_login'] ); + } + + ?> + +
                +

                + + +

                + + +

                + +

                +
                + + + get_error_code() === 'expired_key' ) { + wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=expiredkey' ) ); + } else { + wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=invalidkey' ) ); + } + + exit; + } + + $errors = new WP_Error(); + + if ( isset( $_POST['pass1'] ) && $_POST['pass1'] !== $_POST['pass2'] ) { + $errors->add( 'password_reset_mismatch', __( 'The passwords do not match.' ) ); + } + + /** + * Fires before the password reset procedure is validated. + * + * @since 3.5.0 + * + * @param WP_Error $errors WP Error object. + * @param WP_User|WP_Error $user WP_User object if the login and reset key match. WP_Error object otherwise. + */ + do_action( 'validate_password_reset', $errors, $user ); + + if ( ( ! $errors->has_errors() ) && isset( $_POST['pass1'] ) && ! empty( $_POST['pass1'] ) ) { + reset_password( $user, $_POST['pass1'] ); + setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true ); + login_header( __( 'Password Reset' ), '

                ' . __( 'Your password has been reset.' ) . ' ' . __( 'Log in' ) . '

                ' ); + login_footer(); + exit; + } + + wp_enqueue_script( 'utils' ); + wp_enqueue_script( 'user-profile' ); + + login_header( __( 'Reset Password' ), '

                ' . __( 'Enter your new password below.' ) . '

                ', $errors ); + + ?> +
                + + +
                +

                + +

                + +
                + + + +
                +
                +
                + + +
                +
                + +

                + + +

                + +

                +
                + + + +

                + +

                +
                + + + ' . __( 'Register For This Site' ) . '

                ', $errors ); + + ?> +
                +

                + + +

                +

                + + +

                + +

                + +

                +
                + +

                + +

                +
                + + + ID ) ) { + $secure_cookie = true; + force_ssl_admin( true ); + } + } + } + + if ( isset( $_REQUEST['redirect_to'] ) ) { + $redirect_to = $_REQUEST['redirect_to']; + // Redirect to HTTPS if user wants SSL. + if ( $secure_cookie && false !== strpos( $redirect_to, 'wp-admin' ) ) { + $redirect_to = preg_replace( '|^http://|', 'https://', $redirect_to ); + } + } else { + $redirect_to = admin_url(); + } + + $reauth = empty( $_REQUEST['reauth'] ) ? false : true; + + $user = wp_signon( array(), $secure_cookie ); + + if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) { + if ( headers_sent() ) { + $user = new WP_Error( + 'test_cookie', + sprintf( + /* translators: 1: Browser cookie documentation URL, 2: Support forums URL. */ + __( 'Error: Cookies are blocked due to unexpected output. For help, please see this documentation or try the support forums.' ), + __( 'https://wordpress.org/support/article/cookies/' ), + __( 'https://wordpress.org/support/forums/' ) + ) + ); + } elseif ( isset( $_POST['testcookie'] ) && empty( $_COOKIE[ TEST_COOKIE ] ) ) { + // If cookies are disabled, we can't log in even with a valid user and password. + $user = new WP_Error( + 'test_cookie', + sprintf( + /* translators: %s: Browser cookie documentation URL. */ + __( 'Error: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.' ), + __( 'https://wordpress.org/support/article/cookies/#enable-cookies-in-your-browser' ) + ) + ); + } + } + + $requested_redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : ''; + /** + * Filters the login redirect URL. + * + * @since 3.0.0 + * + * @param string $redirect_to The redirect destination URL. + * @param string $requested_redirect_to The requested redirect destination URL passed as a parameter. + * @param WP_User|WP_Error $user WP_User object if login was successful, WP_Error object otherwise. + */ + $redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user ); + + if ( ! is_wp_error( $user ) && ! $reauth ) { + if ( $interim_login ) { + $message = '

                ' . __( 'You have logged in successfully.' ) . '

                '; + $interim_login = 'success'; + login_header( '', $message ); + + ?> +
                + + + + + exists() && $user->has_cap( 'manage_options' ) ) { + $admin_email_lifespan = (int) get_option( 'admin_email_lifespan' ); + + // If `0` (or anything "falsey" as it is cast to int) is returned, the user will not be redirected + // to the admin email confirmation screen. + /** This filter is documented in wp-login.php */ + $admin_email_check_interval = (int) apply_filters( 'admin_email_check_interval', 6 * MONTH_IN_SECONDS ); + + if ( $admin_email_check_interval > 0 && time() > $admin_email_lifespan ) { + $redirect_to = add_query_arg( + array( + 'action' => 'confirm_admin_email', + 'wp_lang' => get_user_locale( $user ), + ), + wp_login_url( $redirect_to ) + ); + } + } + + if ( ( empty( $redirect_to ) || 'wp-admin/' === $redirect_to || admin_url() === $redirect_to ) ) { + // If the user doesn't belong to a blog, send them to user admin. If the user can't edit posts, send them to their profile. + if ( is_multisite() && ! get_active_blog_for_user( $user->ID ) && ! is_super_admin( $user->ID ) ) { + $redirect_to = user_admin_url(); + } elseif ( is_multisite() && ! $user->has_cap( 'read' ) ) { + $redirect_to = get_dashboard_url( $user->ID ); + } elseif ( ! $user->has_cap( 'edit_posts' ) ) { + $redirect_to = $user->has_cap( 'read' ) ? admin_url( 'profile.php' ) : home_url(); + } + + wp_redirect( $redirect_to ); + exit; + } + + wp_safe_redirect( $redirect_to ); + exit; + } + + $errors = $user; + // Clear errors if loggedout is set. + if ( ! empty( $_GET['loggedout'] ) || $reauth ) { + $errors = new WP_Error(); + } + + if ( empty( $_POST ) && $errors->get_error_codes() === array( 'empty_username', 'empty_password' ) ) { + $errors = new WP_Error( '', '' ); + } + + if ( $interim_login ) { + if ( ! $errors->has_errors() ) { + $errors->add( 'expired', __( 'Your session has expired. Please log in to continue where you left off.' ), 'message' ); + } + } else { + // Some parts of this script use the main login form to display a message. + if ( isset( $_GET['loggedout'] ) && $_GET['loggedout'] ) { + $errors->add( 'loggedout', __( 'You are now logged out.' ), 'message' ); + } elseif ( isset( $_GET['registration'] ) && 'disabled' === $_GET['registration'] ) { + $errors->add( 'registerdisabled', __( 'User registration is currently not allowed.' ) ); + } elseif ( isset( $_GET['checkemail'] ) && 'confirm' === $_GET['checkemail'] ) { + $errors->add( 'confirm', __( 'Check your email for the confirmation link.' ), 'message' ); + } elseif ( isset( $_GET['checkemail'] ) && 'newpass' === $_GET['checkemail'] ) { + $errors->add( 'newpass', __( 'Check your email for your new password.' ), 'message' ); + } elseif ( isset( $_GET['checkemail'] ) && 'registered' === $_GET['checkemail'] ) { + $errors->add( 'registered', __( 'Registration complete. Please check your email.' ), 'message' ); + } elseif ( strpos( $redirect_to, 'about.php?updated' ) ) { + $errors->add( 'updated', __( 'You have successfully updated WordPress! Please log back in to see what’s new.' ), 'message' ); + } elseif ( WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED === $action ) { + $errors->add( 'enter_recovery_mode', __( 'Recovery Mode Initialized. Please log in to continue.' ), 'message' ); + } + } + + /** + * Filters the login page errors. + * + * @since 3.6.0 + * + * @param WP_Error $errors WP Error object. + * @param string $redirect_to Redirect destination URL. + */ + $errors = apply_filters( 'wp_login_errors', $errors, $redirect_to ); + + // Clear any stale cookies. + if ( $reauth ) { + wp_clear_auth_cookie(); + } + + login_header( __( 'Log In' ), '', $errors ); + + if ( isset( $_POST['log'] ) ) { + $user_login = ( 'incorrect_password' === $errors->get_error_code() || 'empty_password' === $errors->get_error_code() ) ? esc_attr( wp_unslash( $_POST['log'] ) ) : ''; + } + + $rememberme = ! empty( $_POST['rememberme'] ); + + if ( $errors->has_errors() ) { + $aria_describedby_error = ' aria-describedby="login_error"'; + } else { + $aria_describedby_error = ''; + } + + wp_enqueue_script( 'user-profile' ); + ?> + +
                +

                + + class="input" value="" size="20" autocapitalize="off" /> +

                + +
                + +
                + class="input password-input" value="" size="20" /> + +
                +
                + +

                />

                +

                + + + + + + + + + +

                +
                + + + + get_error_code() === 'invalid_username' ) { + $login_script .= 'd.value = "";'; + } + } + + $login_script .= 'd.focus(); d.select();'; + $login_script .= '} catch( er ) {}'; + $login_script .= '}, 200);'; + $login_script .= "}\n"; // End of wp_attempt_focus(). + + /** + * Filters whether to print the call to `wp_attempt_focus()` on the login screen. + * + * @since 4.8.0 + * + * @param bool $print Whether to print the function call. Default true. + */ + if ( apply_filters( 'enable_login_autofocus', true ) && ! $error ) { + $login_script .= "wp_attempt_focus();\n"; + } + + // Run `wpOnload()` if defined. + $login_script .= "if ( typeof wpOnload === 'function' ) { wpOnload() }"; + + ?> + + + + Writing + * + * @package WordPress + */ + +/** Make sure that the WordPress bootstrap has run before continuing. */ +require __DIR__ . '/wp-load.php'; + +/** This filter is documented in wp-admin/options.php */ +if ( ! apply_filters( 'enable_post_by_email_configuration', true ) ) { + wp_die( __( 'This action has been disabled by the administrator.' ), 403 ); +} + +$mailserver_url = get_option( 'mailserver_url' ); + +if ( 'mail.example.com' === $mailserver_url || empty( $mailserver_url ) ) { + wp_die( __( 'This action has been disabled by the administrator.' ), 403 ); +} + +/** + * Fires to allow a plugin to do a complete takeover of Post by Email. + * + * @since 2.9.0 + */ +do_action( 'wp-mail.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + +/** Get the POP3 class with which to access the mailbox. */ +require_once ABSPATH . WPINC . '/class-pop3.php'; + +/** Only check at this interval for new messages. */ +if ( ! defined( 'WP_MAIL_INTERVAL' ) ) { + define( 'WP_MAIL_INTERVAL', 5 * MINUTE_IN_SECONDS ); +} + +$last_checked = get_transient( 'mailserver_last_checked' ); + +if ( $last_checked ) { + wp_die( __( 'Slow down cowboy, no need to check for new mails so often!' ) ); +} + +set_transient( 'mailserver_last_checked', true, WP_MAIL_INTERVAL ); + +$time_difference = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS; + +$phone_delim = '::'; + +$pop3 = new POP3(); + +if ( ! $pop3->connect( get_option( 'mailserver_url' ), get_option( 'mailserver_port' ) ) || ! $pop3->user( get_option( 'mailserver_login' ) ) ) { + wp_die( esc_html( $pop3->ERROR ) ); +} + +$count = $pop3->pass( get_option( 'mailserver_pass' ) ); + +if ( false === $count ) { + wp_die( esc_html( $pop3->ERROR ) ); +} + +if ( 0 === $count ) { + $pop3->quit(); + wp_die( __( 'There doesn’t seem to be any new mail.' ) ); +} + +for ( $i = 1; $i <= $count; $i++ ) { + + $message = $pop3->get( $i ); + + $bodysignal = false; + $boundary = ''; + $charset = ''; + $content = ''; + $content_type = ''; + $content_transfer_encoding = ''; + $post_author = 1; + $author_found = false; + foreach ( $message as $line ) { + // Body signal. + if ( strlen( $line ) < 3 ) { + $bodysignal = true; + } + if ( $bodysignal ) { + $content .= $line; + } else { + if ( preg_match( '/Content-Type: /i', $line ) ) { + $content_type = trim( $line ); + $content_type = substr( $content_type, 14, strlen( $content_type ) - 14 ); + $content_type = explode( ';', $content_type ); + if ( ! empty( $content_type[1] ) ) { + $charset = explode( '=', $content_type[1] ); + $charset = ( ! empty( $charset[1] ) ) ? trim( $charset[1] ) : ''; + } + $content_type = $content_type[0]; + } + if ( preg_match( '/Content-Transfer-Encoding: /i', $line ) ) { + $content_transfer_encoding = trim( $line ); + $content_transfer_encoding = substr( $content_transfer_encoding, 27, strlen( $content_transfer_encoding ) - 27 ); + $content_transfer_encoding = explode( ';', $content_transfer_encoding ); + $content_transfer_encoding = $content_transfer_encoding[0]; + } + if ( ( 'multipart/alternative' === $content_type ) && ( false !== strpos( $line, 'boundary="' ) ) && ( '' === $boundary ) ) { + $boundary = trim( $line ); + $boundary = explode( '"', $boundary ); + $boundary = $boundary[1]; + } + if ( preg_match( '/Subject: /i', $line ) ) { + $subject = trim( $line ); + $subject = substr( $subject, 9, strlen( $subject ) - 9 ); + // Captures any text in the subject before $phone_delim as the subject. + if ( function_exists( 'iconv_mime_decode' ) ) { + $subject = iconv_mime_decode( $subject, 2, get_option( 'blog_charset' ) ); + } else { + $subject = wp_iso_descrambler( $subject ); + } + $subject = explode( $phone_delim, $subject ); + $subject = $subject[0]; + } + + /* + * Set the author using the email address (From or Reply-To, the last used) + * otherwise use the site admin. + */ + if ( ! $author_found && preg_match( '/^(From|Reply-To): /', $line ) ) { + if ( preg_match( '|[a-z0-9_.-]+@[a-z0-9_.-]+(?!.*<)|i', $line, $matches ) ) { + $author = $matches[0]; + } else { + $author = trim( $line ); + } + $author = sanitize_email( $author ); + if ( is_email( $author ) ) { + /* translators: %s: Post author email address. */ + echo '

                ' . sprintf( __( 'Author is %s' ), $author ) . '

                '; + $userdata = get_user_by( 'email', $author ); + if ( ! empty( $userdata ) ) { + $post_author = $userdata->ID; + $author_found = true; + } + } + } + + if ( preg_match( '/Date: /i', $line ) ) { // Of the form '20 Mar 2002 20:32:37 +0100'. + $ddate = str_replace( 'Date: ', '', trim( $line ) ); + // Remove parenthesised timezone string if it exists, as this confuses strtotime(). + $ddate = preg_replace( '!\s*\(.+\)\s*$!', '', $ddate ); + $ddate_timestamp = strtotime( $ddate ); + $post_date = gmdate( 'Y-m-d H:i:s', $ddate_timestamp + $time_difference ); + $post_date_gmt = gmdate( 'Y-m-d H:i:s', $ddate_timestamp ); + } + } + } + + // Set $post_status based on $author_found and on author's publish_posts capability. + if ( $author_found ) { + $user = new WP_User( $post_author ); + $post_status = ( $user->has_cap( 'publish_posts' ) ) ? 'publish' : 'pending'; + } else { + // Author not found in DB, set status to pending. Author already set to admin. + $post_status = 'pending'; + } + + $subject = trim( $subject ); + + if ( 'multipart/alternative' === $content_type ) { + $content = explode( '--' . $boundary, $content ); + $content = $content[2]; + + // Match case-insensitive content-transfer-encoding. + if ( preg_match( '/Content-Transfer-Encoding: quoted-printable/i', $content, $delim ) ) { + $content = explode( $delim[0], $content ); + $content = $content[1]; + } + $content = strip_tags( $content, '


                ' ); + } + $content = trim( $content ); + + /** + * Filters the original content of the email. + * + * Give Post-By-Email extending plugins full access to the content, either + * the raw content, or the content of the last quoted-printable section. + * + * @since 2.8.0 + * + * @param string $content The original email content. + */ + $content = apply_filters( 'wp_mail_original_content', $content ); + + if ( false !== stripos( $content_transfer_encoding, 'quoted-printable' ) ) { + $content = quoted_printable_decode( $content ); + } + + if ( function_exists( 'iconv' ) && ! empty( $charset ) ) { + $content = iconv( $charset, get_option( 'blog_charset' ), $content ); + } + + // Captures any text in the body after $phone_delim as the body. + $content = explode( $phone_delim, $content ); + $content = empty( $content[1] ) ? $content[0] : $content[1]; + + $content = trim( $content ); + + /** + * Filters the content of the post submitted by email before saving. + * + * @since 1.2.0 + * + * @param string $content The email content. + */ + $post_content = apply_filters( 'phone_content', $content ); + + $post_title = xmlrpc_getposttitle( $content ); + + if ( '' === trim( $post_title ) ) { + $post_title = $subject; + } + + $post_category = array( get_option( 'default_email_category' ) ); + + $post_data = compact( 'post_content', 'post_title', 'post_date', 'post_date_gmt', 'post_author', 'post_category', 'post_status' ); + $post_data = wp_slash( $post_data ); + + $post_ID = wp_insert_post( $post_data ); + if ( is_wp_error( $post_ID ) ) { + echo "\n" . $post_ID->get_error_message(); + } + + // We couldn't post, for whatever reason. Better move forward to the next email. + if ( empty( $post_ID ) ) { + continue; + } + + /** + * Fires after a post submitted by email is published. + * + * @since 1.2.0 + * + * @param int $post_ID The post ID. + */ + do_action( 'publish_phone', $post_ID ); + + echo "\n

                " . __( 'Author:' ) . ' ' . esc_html( $post_author ) . '

                '; + echo "\n

                " . __( 'Posted title:' ) . ' ' . esc_html( $post_title ) . '

                '; + + if ( ! $pop3->delete( $i ) ) { + echo '

                ' . sprintf( + /* translators: %s: POP3 error. */ + __( 'Oops: %s' ), + esc_html( $pop3->ERROR ) + ) . '

                '; + $pop3->reset(); + exit; + } else { + echo '

                ' . sprintf( + /* translators: %s: The message ID. */ + __( 'Mission complete. Message %s deleted.' ), + '' . $i . '' + ) . '

                '; + } +} + +$pop3->quit(); diff --git a/wp-settings.php b/wp-settings.php new file mode 100644 index 0000000..ca6531c --- /dev/null +++ b/wp-settings.php @@ -0,0 +1,562 @@ +initialize(); +} + +// Load active plugins. +foreach ( wp_get_active_and_valid_plugins() as $plugin ) { + wp_register_plugin_realpath( $plugin ); + include_once $plugin; + + /** + * Fires once a single activated plugin has loaded. + * + * @since 5.1.0 + * + * @param string $plugin Full path to the plugin's main file. + */ + do_action( 'plugin_loaded', $plugin ); +} +unset( $plugin ); + +// Load pluggable functions. +require ABSPATH . WPINC . '/pluggable.php'; +require ABSPATH . WPINC . '/pluggable-deprecated.php'; + +// Set internal encoding. +wp_set_internal_encoding(); + +// Run wp_cache_postload() if object cache is enabled and the function exists. +if ( WP_CACHE && function_exists( 'wp_cache_postload' ) ) { + wp_cache_postload(); +} + +/** + * Fires once activated plugins have loaded. + * + * Pluggable functions are also available at this point in the loading order. + * + * @since 1.5.0 + */ +do_action( 'plugins_loaded' ); + +// Define constants which affect functionality if not already defined. +wp_functionality_constants(); + +// Add magic quotes and set up $_REQUEST ( $_GET + $_POST ). +wp_magic_quotes(); + +/** + * Fires when comment cookies are sanitized. + * + * @since 2.0.11 + */ +do_action( 'sanitize_comment_cookies' ); + +/** + * WordPress Query object + * + * @global WP_Query $wp_the_query WordPress Query object. + * @since 2.0.0 + */ +$GLOBALS['wp_the_query'] = new WP_Query(); + +/** + * Holds the reference to @see $wp_the_query + * Use this global for WordPress queries + * + * @global WP_Query $wp_query WordPress Query object. + * @since 1.5.0 + */ +$GLOBALS['wp_query'] = $GLOBALS['wp_the_query']; + +/** + * Holds the WordPress Rewrite object for creating pretty URLs + * + * @global WP_Rewrite $wp_rewrite WordPress rewrite component. + * @since 1.5.0 + */ +$GLOBALS['wp_rewrite'] = new WP_Rewrite(); + +/** + * WordPress Object + * + * @global WP $wp Current WordPress environment instance. + * @since 2.0.0 + */ +$GLOBALS['wp'] = new WP(); + +/** + * WordPress Widget Factory Object + * + * @global WP_Widget_Factory $wp_widget_factory + * @since 2.8.0 + */ +$GLOBALS['wp_widget_factory'] = new WP_Widget_Factory(); + +/** + * WordPress User Roles + * + * @global WP_Roles $wp_roles WordPress role management object. + * @since 2.0.0 + */ +$GLOBALS['wp_roles'] = new WP_Roles(); + +/** + * Fires before the theme is loaded. + * + * @since 2.6.0 + */ +do_action( 'setup_theme' ); + +// Define the template related constants. +wp_templating_constants(); + +// Load the default text localization domain. +load_default_textdomain(); + +$locale = get_locale(); +$locale_file = WP_LANG_DIR . "/$locale.php"; +if ( ( 0 === validate_file( $locale ) ) && is_readable( $locale_file ) ) { + require $locale_file; +} +unset( $locale_file ); + +/** + * WordPress Locale object for loading locale domain date and various strings. + * + * @global WP_Locale $wp_locale WordPress date and time locale object. + * @since 2.1.0 + */ +$GLOBALS['wp_locale'] = new WP_Locale(); + +/** + * WordPress Locale Switcher object for switching locales. + * + * @since 4.7.0 + * + * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object. + */ +$GLOBALS['wp_locale_switcher'] = new WP_Locale_Switcher(); +$GLOBALS['wp_locale_switcher']->init(); + +// Load the functions for the active theme, for both parent and child theme if applicable. +foreach ( wp_get_active_and_valid_themes() as $theme ) { + if ( file_exists( $theme . '/functions.php' ) ) { + include $theme . '/functions.php'; + } +} +unset( $theme ); + +/** + * Fires after the theme is loaded. + * + * @since 3.0.0 + */ +do_action( 'after_setup_theme' ); + +// Create an instance of WP_Site_Health so that Cron events may fire. +if ( ! class_exists( 'WP_Site_Health' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php'; +} +WP_Site_Health::get_instance(); + +// Set up current user. +$GLOBALS['wp']->init(); + +/** + * Fires after WordPress has finished loading but before any headers are sent. + * + * Most of WP is loaded at this stage, and the user is authenticated. WP continues + * to load on the {@see 'init'} hook that follows (e.g. widgets), and many plugins instantiate + * themselves on it for all sorts of reasons (e.g. they need a user, a taxonomy, etc.). + * + * If you wish to plug an action once WP is loaded, use the {@see 'wp_loaded'} hook below. + * + * @since 1.5.0 + */ +do_action( 'init' ); + +// Check site status. +if ( is_multisite() ) { + $file = ms_site_check(); + if ( true !== $file ) { + require $file; + die(); + } + unset( $file ); +} + +/** + * This hook is fired once WP, all plugins, and the theme are fully loaded and instantiated. + * + * Ajax requests should use wp-admin/admin-ajax.php. admin-ajax.php can handle requests for + * users not logged in. + * + * @link https://codex.wordpress.org/AJAX_in_Plugins + * + * @since 3.0.0 + */ +do_action( 'wp_loaded' ); diff --git a/wp-signup.php b/wp-signup.php new file mode 100644 index 0000000..4d01ca0 --- /dev/null +++ b/wp-signup.php @@ -0,0 +1,1014 @@ +is_404 = false; + +/** + * Fires before the Site Signup page is loaded. + * + * @since 4.4.0 + */ +do_action( 'before_signup_header' ); + +/** + * Prints styles for front-end Multisite signup pages + * + * @since MU (3.0.0) + */ +function wpmu_signup_stylesheet() { + ?> + + +
                +'; +} + +$newblogname = isset( $_GET['new'] ) ? strtolower( preg_replace( '/^-|-$|[^-a-zA-Z0-9]/', '', $_GET['new'] ) ) : null; + +$current_user = wp_get_current_user(); +if ( 'none' === $active_signup ) { + _e( 'Registration has been disabled.' ); +} elseif ( 'blog' === $active_signup && ! is_user_logged_in() ) { + $login_url = wp_login_url( network_site_url( 'wp-signup.php' ) ); + /* translators: %s: Login URL. */ + printf( __( 'You must first log in, and then you can create a new site.' ), $login_url ); +} else { + $stage = isset( $_POST['stage'] ) ? $_POST['stage'] : 'default'; + switch ( $stage ) { + case 'validate-user-signup': + if ( 'all' === $active_signup + || ( 'blog' === $_POST['signup_for'] && 'blog' === $active_signup ) + || ( 'user' === $_POST['signup_for'] && 'user' === $active_signup ) + ) { + validate_user_signup(); + } else { + _e( 'User registration has been disabled.' ); + } + break; + case 'validate-blog-signup': + if ( 'all' === $active_signup || 'blog' === $active_signup ) { + validate_blog_signup(); + } else { + _e( 'Site registration has been disabled.' ); + } + break; + case 'gimmeanotherblog': + validate_another_blog_signup(); + break; + case 'default': + default: + $user_email = isset( $_POST['user_email'] ) ? $_POST['user_email'] : ''; + /** + * Fires when the site sign-up form is sent. + * + * @since 3.0.0 + */ + do_action( 'preprocess_signup_form' ); + if ( is_user_logged_in() && ( 'all' === $active_signup || 'blog' === $active_signup ) ) { + signup_another_blog( $newblogname ); + } elseif ( ! is_user_logged_in() && ( 'all' === $active_signup || 'user' === $active_signup ) ) { + signup_user( $newblogname, $user_email ); + } elseif ( ! is_user_logged_in() && ( 'blog' === $active_signup ) ) { + _e( 'Sorry, new registrations are not allowed at this time.' ); + } else { + _e( 'You are logged in already. No need to register again!' ); + } + + if ( $newblogname ) { + $newblog = get_blogaddress_by_name( $newblogname ); + + if ( 'blog' === $active_signup || 'all' === $active_signup ) { + printf( + /* translators: %s: Site address. */ + '

                ' . __( 'The site you were looking for, %s, does not exist, but you can create it now!' ) . '

                ', + '' . $newblog . '' + ); + } else { + printf( + /* translators: %s: Site address. */ + '

                ' . __( 'The site you were looking for, %s, does not exist.' ) . '

                ', + '' . $newblog . '' + ); + } + } + break; + } +} +?> +
                +
                + + + '1' ) ); +} + +/** + * Response to a trackback. + * + * Responds with an error or success XML message. + * + * @since 0.71 + * + * @param int|bool $error Whether there was an error. + * Default '0'. Accepts '0' or '1', true or false. + * @param string $error_message Error message if an error occurred. + */ +function trackback_response( $error = 0, $error_message = '' ) { + header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) ); + if ( $error ) { + echo '\n"; + echo "\n"; + echo "1\n"; + echo "$error_message\n"; + echo ''; + die(); + } else { + echo '\n"; + echo "\n"; + echo "0\n"; + echo ''; + } +} + +// Trackback is done by a POST. +$request_array = 'HTTP_POST_VARS'; + +if ( ! isset( $_GET['tb_id'] ) || ! $_GET['tb_id'] ) { + $tb_id = explode( '/', $_SERVER['REQUEST_URI'] ); + $tb_id = intval( $tb_id[ count( $tb_id ) - 1 ] ); +} + +$tb_url = isset( $_POST['url'] ) ? $_POST['url'] : ''; +$charset = isset( $_POST['charset'] ) ? $_POST['charset'] : ''; + +// These three are stripslashed here so they can be properly escaped after mb_convert_encoding(). +$title = isset( $_POST['title'] ) ? wp_unslash( $_POST['title'] ) : ''; +$excerpt = isset( $_POST['excerpt'] ) ? wp_unslash( $_POST['excerpt'] ) : ''; +$blog_name = isset( $_POST['blog_name'] ) ? wp_unslash( $_POST['blog_name'] ) : ''; + +if ( $charset ) { + $charset = str_replace( array( ',', ' ' ), '', strtoupper( trim( $charset ) ) ); +} else { + $charset = 'ASCII, UTF-8, ISO-8859-1, JIS, EUC-JP, SJIS'; +} + +// No valid uses for UTF-7. +if ( false !== strpos( $charset, 'UTF-7' ) ) { + die; +} + +// For international trackbacks. +if ( function_exists( 'mb_convert_encoding' ) ) { + $title = mb_convert_encoding( $title, get_option( 'blog_charset' ), $charset ); + $excerpt = mb_convert_encoding( $excerpt, get_option( 'blog_charset' ), $charset ); + $blog_name = mb_convert_encoding( $blog_name, get_option( 'blog_charset' ), $charset ); +} + +// Now that mb_convert_encoding() has been given a swing, we need to escape these three. +$title = wp_slash( $title ); +$excerpt = wp_slash( $excerpt ); +$blog_name = wp_slash( $blog_name ); + +if ( is_single() || is_page() ) { + $tb_id = $posts[0]->ID; +} + +if ( ! isset( $tb_id ) || ! intval( $tb_id ) ) { + trackback_response( 1, __( 'I really need an ID for this to work.' ) ); +} + +if ( empty( $title ) && empty( $tb_url ) && empty( $blog_name ) ) { + // If it doesn't look like a trackback at all. + wp_redirect( get_permalink( $tb_id ) ); + exit; +} + +if ( ! empty( $tb_url ) && ! empty( $title ) ) { + /** + * Fires before the trackback is added to a post. + * + * @since 4.7.0 + * + * @param int $tb_id Post ID related to the trackback. + * @param string $tb_url Trackback URL. + * @param string $charset Character Set. + * @param string $title Trackback Title. + * @param string $excerpt Trackback Excerpt. + * @param string $blog_name Blog Name. + */ + do_action( 'pre_trackback_post', $tb_id, $tb_url, $charset, $title, $excerpt, $blog_name ); + + header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) ); + + if ( ! pings_open( $tb_id ) ) { + trackback_response( 1, __( 'Sorry, trackbacks are closed for this item.' ) ); + } + + $title = wp_html_excerpt( $title, 250, '…' ); + $excerpt = wp_html_excerpt( $excerpt, 252, '…' ); + + $comment_post_ID = (int) $tb_id; + $comment_author = $blog_name; + $comment_author_email = ''; + $comment_author_url = $tb_url; + $comment_content = "$title\n\n$excerpt"; + $comment_type = 'trackback'; + + $dupe = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $comment_post_ID, $comment_author_url ) ); + if ( $dupe ) { + trackback_response( 1, __( 'We already have a ping from that URL for this post.' ) ); + } + + $commentdata = compact( 'comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type' ); + + $result = wp_new_comment( $commentdata ); + + if ( is_wp_error( $result ) ) { + trackback_response( 1, $result->get_error_message() ); + } + + $trackback_id = $wpdb->insert_id; + + /** + * Fires after a trackback is added to a post. + * + * @since 1.2.0 + * + * @param int $trackback_id Trackback ID. + */ + do_action( 'trackback_post', $trackback_id ); + trackback_response( 0 ); +} diff --git a/xmlrpc.php b/xmlrpc.php new file mode 100644 index 0000000..00bd97e --- /dev/null +++ b/xmlrpc.php @@ -0,0 +1,104 @@ +'; + ?> + + + WordPress + https://wordpress.org/ + + + + + + + + + + + serve_request(); + +exit; + +/** + * logIO() - Writes logging info to a file. + * + * @deprecated 3.4.0 Use error_log() + * @see error_log() + * + * @param string $io Whether input or output + * @param string $msg Information describing logging reason. + */ +function logIO( $io, $msg ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid + _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' ); + if ( ! empty( $GLOBALS['xmlrpc_logging'] ) ) { + error_log( $io . ' - ' . $msg ); + } +}